Takahashi Monad

2015/2/13 ちゅーん(@its_out_of_tune)
2015/2/15 更新

→キーで次のページへ

はじめに

はじめに

Takahashi Monadは、
Haskellでスライドを作成するための言語内DSLです。
このスライドも、同DSLを用いて作成しました。

Takahashiという名称は本ライブラリが高橋メソッドと呼ばれる、
巨大な文字/簡潔な文章を次々と表示していくスライドを用いた、
プレゼン技法を実現するために開発された事に由来します。

その後、同様の仕組みでよりちゃんとしたスライドが作成できれば、
便利だと考えるようになり、大幅に機能拡張を行いました。

はじめに

画面が崩れるよ場合、縮小して文字サイズを下げる事によって、
綺麗に表示されるようになる可能性があります。

本スライドは、
既にいくつかの環境&ブラウザで動作確認を行っていますが
もし正常に動作しないなどの問題がありましたら、
開発者にご一報いただければ幸いです。

はじめに

Takahashi Monadには、以下のような特徴があります。

  • DSLなのでテキストエディタでスライドを作成できる
  • 比較的自由にレイアウトを構成可能
  • Haskellのコンパイル環境さえ整っていれば導入が楽(になるはず)
  • モナドとして提供されているため拡張性が非常に高い
  • 高橋メソッドのスライドを生成するのに優れている

はじめに

以下のどちらかの方法で、
Takahashiモナドを導入できます。

  • githubからソースコードをcloneして直接 cabal install
  • cabal install takahashi でHackageからインストール

基本的な使い方

基本的な使い方

まず、Takahashi Monadを構成するもっとも重要な関数を紹介します。

writeSlide :: String -> Taka () -> IO ()

writeSlide関数は最初の引数で指定されたファイル名に、
次に渡されたTaka型の内容を書き込みます。
Taka型はプレゼンテーション情報そのものを表すモナドです。
do構文でTaka型の情報を記述していく事で、
プレゼンテーションを作成していく事ができます。

基本的な使い方

実際のプログラムはどのようになるか見てみましょう。

以下のようなコードを実行する事によって、
Out.htmlにスライドが出力されます。

module Main where
import Control.Monad.Takahashi
import Control.Lens --表示設定のアクセッサを利用するのに必要です

main = writeSlide "Out.html" presentation

presentation :: Taka ()
presentation = ... --ここにプレゼンテーションの内容を記述していきます

基本的な使い方

高橋メソッド形式で、短い文章を次々と表示していくだけの、
簡単なスライド作成するだけであれば以下のサンプルのように、
taka関数を次々と記述していくだけで、とても簡単に作成できます。
次ページから、実行結果を見ていきましょう。

presentation = do
taka "高橋メソッド"
taka "巨大な文字"
taka "簡潔な言葉"
taka "余計な情報がなく\n画面が見やすい"
taka "LTなどで活躍"

高橋メソッド

巨大な文字

簡潔な言葉

余計な情報がなく
画面が見やすい

LTなどで活躍

基本的な使い方

他にも、さまざまな情報を出力するための関数が用意されています
次ページから、以下のコードの実行結果を見ていきましょう。

presentation = do
---- 段落 ----
par "段落\n自由な文章を記述できます。"
---- リスト ----
list ["項目1", "項目2", "項目3", "項目4"]
---- 画像 ----
img HStretch "../img/jpeg01.jpeg"
---- コード ----
code "コードは等倍フォントで表示されます"
"main :: IO ()\nmain = putStrLn \"Hello, World!\""

段落
自由な文章を記述できます。

  • 項目1
  • 項目2
  • 項目3
  • 項目4

コードは等倍フォントで表示されます

main :: IO ()
main = putStrLn "Hello, World!"

基本的な使い方

Lensの代入演算子(.=)を使い、slideTitleを設定する事により、
スライド上部にタイトルを表示させる事ができます。

次ページから、以下のコードの実行結果を見ていきましょう。

presentation = do
par "このページにはタイトルは表示されません。"
slideTitle .= "タイトル"
par "このページにはタイトルが表示されます。"
slideTitle .= ""
par "空文字列を設定すると、\nタイトルは表示されなくなります。"

このページにはタイトルは表示されません。

タイトル

このページにはタイトルが表示されます。

空文字列を設定すると、
タイトルは表示されなくなります。

高度なレイアウト

高度なレイアウト

Takahashi Monad には、段落やリスト等のコンテンツを、
スライド上に自由に配置するための仕組みがあります。

例えば、グラフの画像とそれに対する説明文章を、
一つの画面に収めたい時などに便利です。

実際にどのような配置を行う事ができるのか、
次ページで少し複雑なサンプルを見てみましょう。

複雑な構成の例

  • 左上項目1
  • 左上項目2
  • 左上項目3

main :: IO ()
main
= putStrLn "Hi!"

高度なレイアウト

例えば、横にコンテンツを分割するための関数にhorizonがあります。
GHCiで型を見てみましょう。

ghci> :t horizon
horizon:: [Contents] -> Taka ()

Contentsという型のリストを引数に取り、Taka ()型、
つまり、プレゼンテーションを構成する型を返します。

高度なレイアウト

Contents型は、いわばスライドを構築するための部品です。

Takahashi Monadは段落やリスト等の、
Contentsを作成するための関数をいくつか用意しています。

parCont :: String -> Contents --段落
listCont :: [String] -> Contents --リスト
imgCont :: DrawType -> String -> Contents --画像
codeCont :: String -> Contents --コード

高度なレイアウト

既におわかりのように、horizon関数にContentsのリストを渡す事で、
横一列にコンテンツを並べる事ができるのです。

次ページで、以下のコードの実行結果を見てみましょう。

presentation = do
horizon
[ parCont "左"
, parCont "中"
, parCont "右"
]

高度なレイアウト

horizonのように、複数のContentsを組み合わせて、
ひとつのページを構成するための関数には、何種類かあります。

horizon :: [Contents] -> Taka () --横分割
vertical :: [Contents] -> Taka () --縦分割
twinLeft :: Contents -> Contents -> Taka () --左広の横2分割
twinRight :: Contents -> Contents -> Taka () --右広の横2分割
twinTop :: Contents -> Contents -> Taka () --上広の縦2分割
twinBottom :: Contents -> Contents -> Taka () --下広の縦2分割

高度なレイアウト

また、Contentsを元にContentsを構成する関数もあります。

これらを組み合わる事によって、
より複雑なページを作成する事も可能です。

horizonCont :: [Contents] -> Contents --横分割
verticalCont :: [Contents] -> Contents --縦分割
twinLeftCont :: Contents -> Contents -> Contents --左広の横2分割
twinRightCont :: Contents -> Contents -> Contents --右広の横2分割
twinTopCont :: Contents -> Contents -> Contents --上広の縦2分割
twinBottomCont :: Contents -> Contents -> Contents --下広の縦2分割

高度なレイアウト

以上の事を踏まえて、先ほどお見せした複雑な構成は、
次のコードで実現出来る事がわかると思います。

presentation = do
slideTitle .= "複雑な構成の例"
twinLeft
( verticalCont
[ listCont ["左上項目1", "左上項目2", "左上項目3"]
, codeCont "main :: IO ()\nmain\n = putStrLn \"Hi!\""
]
)
( imgCont HStretch "../img/jpeg01.jpeg" )

画面デザイン

画面デザイン

Takahashi Monadには、Lensのアクセッサで操作する事が可能な、
ちょっとした画面デザインを変更するための設定が用意されています。
例えば、以下のコードによって、parやlistの表示色が緑色になります。

次ページで、以下のコードを実行した結果を確認してみましょう。

contentsOption.fontColor .= Just (Color 0 100 0) --文字色
contentsOption.bgColor .= Just (Color 200 255 200) --背景色
vertical
[ parCont "色変更のサンプル"
, listCont ["項目1", "項目2", "項目3"]
]

色変更のサンプル

  • 項目1
  • 項目2
  • 項目3

画面デザイン

slideFontSizeを設定すると、全体の文字サイズを変更できます。
また、コンテンツの種類によって、個別に文字サイズを変更可能です。

今回も、次ページで実行結果を確認してみましょう。

presentation = do
slideFontSize .= Just 100
titleOption.blockFontSize .= Just 20

slideTitle .= "小さなタイトル"
par "巨大な文章"

小さなタイトル

巨大な文章

画面デザイン

このスライドでは全ての設定項目の紹介は行いません。
設定項目の一覧はHackageのSlideOptionを参照してください。

http://hackage.haskell.org/package/takahashi-0.2.0.2/
docs/Control-Monad-Takahashi-Slide.html#t:SlideOption

尚、上記URLは2015/02/15現在の最新です。

まとめ

まとめ

以上、TakahashiMonadを用いたスライド作成について紹介しました

普段からHaskellを使われていて、
手になじむ発表資料作成ツールが見つからないという人は
試してみては如何でしょうか。

本ライブラリや生成されたスライドについて何か問題を発見した方は、

https://github.com/tokiwoousaka/takahashi

までissue報告やPull Request等いただければ幸いです。

まとめ

ありがとうございましたm(_ _)m