⛄️

SLyDIFi でスライドを作ってみよう

2021/12/17に公開

はじめに

代表的な組版処理システム LaTeX は論文や書籍の原稿作成に用いられることが多いものの、スライド作成に用いられることもあります。 beamer はおそらく LaTeX を用いるものでは最もメジャーなスライド作成用クラスファイルであり、様々な理由[1] からテキストベースでスライドを作成したい人にとって、beamer は一つの有力な選択肢となっています。

一方、新しく開発が進められている組版処理システム SATySFi にも、スライド作成のために開発された SLyDIFi というクラスファイルが存在します。

https://github.com/monaqa/slydifi

本記事では SLyDIFi を使ってスライドを作成する方法を説明します。SLyDIFi は「SATySFi 版の beamer」と言うことができ、 SATySFi の特徴と beamer の特徴を兼ね備えています。

  • テキストベースでスライドを記述できる
  • レイアウトの指定と文書構造の記述を分離できる
  • 関数型のプログラミング言語に基づいて柔軟な処理を記述できる
  • 執筆時に強力な静的解析(静的型付けに基づく型推論など)の力を借りることができる

この特徴を全て兼ね備えたスライド作成ツールはなかなか珍しいのではないでしょうか。これらの特徴を魅力的だと感じる方は、ぜひこの記事の続きを読んで SLyDIFi を試してみてください。

SLyDIFi のインストール

SATySFi のパッケージマネージャである Satyrographos を用いたインストールをお勧めしています。Satyrographos の導入については、作者の @na4zagin3 さんによって書かれた「Satyrographos でパッケージの簡単インストール」という記事を参考にしてください。

https://github.com/na4zagin3/satyrographos

Satyrographos を用いると、SLyDIFi は以下のコマンドでインストールできます。

opam install satysfi-class-slydifi
satyrographos install

なお、 satyrographos install を実行するとき以下のように --system-font-prefix オプションを指定すれば、システムにインストールされたフォントを SATySFi の文書中で用いることができるようになります。

satyrographos install --system-font-prefix 'system:'

Satyrographos を用いず自前でインストールする場合は、こちら のディレクトリを ~/.satysfi/dist/packages/class-slydifi に持ってきてください。ただしこの方法の場合は各種依存パッケージも同様に用意する必要があります(Satyrographos が自動で行ってくれた箇所を手動で行う必要があるわけです)。

スライドを作成するための環境構築

本記事では例として akasaka というテーマを使用します。Noto Sans 系の書体を使用するため、以下の依存ライブラリを入れる必要があります。

  • 欧文用書体: satysfi-fonts-noto-sans
  • 和文用書体: satysfi-fonts-noto-sans-cjk-jp
opam install satysfi-fonts-noto-sans
opam install satysfi-fonts-noto-sans-cjk-jp
# 必要であれば先程述べた `--system-font-prefix` オプションを指定する
satyrographos install

なお、akasaka では等幅書体として標準ライブラリで提供されている lmmono を用いているため、追加でのインストールは不要です。

必要な書体は用いるテーマによって異なるため注意が必要です。詳しくは README をご覧ください。ただし、標準で用意されたテーマの場合、文書中で書体やフォントサイズなどをカスタマイズすることができます。書体が好みに合わない場合や用意するのが難しい場合は別の書体を指定するのが良いでしょう。

最初の一歩:文書ファイルの作成

まず、 slide.saty など適当な名前のファイルを作成します。名前は何でも構いませんが、拡張子は .saty としてください。

slide.saty
% ヘッダ開始
@require: class-slydifi/theme/akasaka
@require: figbox/figbox
@require: enumitem/enumitem
% ヘッダ終了

% プリアンブル開始
open FigBox

in % プリアンブル終了

document '< % 本文開始

> % 本文終了

続いてはこの slide.saty から PDF を作成してみましょう。ターミナルを開き、 slide.saty の存在するディレクトリにて以下のコマンドを実行するだけです。

satysfi slide.saty

うまく行けば同ディレクトリに、空白のページからなる slide.pdf が生成されているはずです。まだ本文に何も書いていないためページには何も表示されません。本文にコンテンツを追加し、スライドを作成していきましょう。

基本的なフレーム

SLyDIFi では、スライドを構成する1枚1枚のページのことを フレーム と呼びます。
まずは +frame コマンドを用いて、タイトルと最低限の段落だけを備えた最も基本的なフレームを作ってみます。

slide.saty (body)
+frame{基本的なフレーム}<
  +p{
    `+p{}` コマンドを使うと\emph{段落}を記述できる。
    `+listing{}` コマンドを使うと\text-color(Color.red){箇条書き}を記述できる。
  }
  +listing{
    * マークアップ用のインラインコマンドをデフォルトで提供
      ** バッククォートで囲まれた箇所は自動的にコードとして扱われる
      ** `\emph{text}` でテキストを強調できる
      ** `\text-color(color){text}` でテキストの表示色を変更できる
    * その他にも様々なコマンドがある(テーマによって実装されているコマンドは異なる)
  }
>

satysfi を実行すると以下のようなフレームができるはずです(ページ番号など一部は異なるかもしれません)。このように、 +frame コマンドを用いることで基本的には1ページのフレームを作成することができます。

コード中で説明されている通り、フレーム内では +p{}\emph{} といった様々なコマンドを用いることができます。ただし +frame をネストすると意図しない組版結果となるため、その点は注意が必要です。

タイトルフレーム・セクションフレーム

スライド全体のタイトル(表紙)を作成するには +make-title(||) を使って以下のように記述します。
+make-title コマンドはそれ単体で1枚の独立したフレームを作成します。したがって、 +frame コマンドの引数の中には含めないでください。

slide.saty (body)
% 本文の一番最初に置く
+make-title(|
  title = {|\SLyDIFi; デモ用スライド|};
  author = {|monaqa|};
  date = {|2021年12月17日|};
|);

% 続きのフレーム
+frame{}< >
% ...

タイトル・著者名・日付は複数行に渡って書くことができます。たとえばタイトルを複数行にわたって書きたい場合、以下のように | で分けることで実現されます。

slide.saty (body)
+make-title(|
  title = {|\SLyDIFi; デモ用スライド|【複数行書くこともできるよ】|};
  author = {|monaqa|};
  date = {|2021年12月17日|};
|);

以下のように改行すればより可読性が高まりますね。

slide.saty (body)
  title = {
    |\SLyDIFi; デモ用スライド
    |【複数行書くこともできるよ】
    |};

長時間にわたる発表を行うとき、発表をいくつかのセクションに分けられると便利です。
そのようなケースでは +section コマンドを用います。

slide.saty (body)
+section{|複数行に分けることができる|セクションフレーム|}<
  +frame{セクション内のフレーム}<
    +p{
      テーマによっては、`+frame` を `+section` の子要素にすることによってレイアウトが変わる場合がある。
    }
    +p{
      たとえば arctic テーマではフレームの一番下にセクション名が表示される。
    }
  >
>

第1引数にはセクションのタイトルを、第2引数にはそのセクションに属するフレームを入れます。

図版や表の挿入

図版の挿入

他人に伝わりやすいスライドを作成するとき、図は不可欠な要素でしょう。図を挿入するには figbox パッケージを用いるのが便利です。

https://github.com/monaqa/satysfi-figbox

figbox パッケージは SLyDIFi をインストール際に自動でインストールされ、SLyDIFi のクラスファイルを読み込むときに自動で文書中でも使えるようになりますが、 figbox パッケージを使用することを明示したい場合はヘッダ部分に以下の記述を追加します。

slide.saty (header)
% SLyDIFi 上で動かすときは無くても良い
@require: figbox/figbox

また、 figbox パッケージを使うときはプリアンブルに以下を書いておくことを推奨します。

slide.saty (preamble)
open FigBox

図版を挿入する場合は本文に以下のように記述します。

slide.saty (body)
+frame{図版のデモ}<
  % 中央に1枚の画像を表示
  +fig-center(include-image 100pt `fig/logo.pdf`);

  % 複数の画像を縦横に連結して表示
  +fig-center(hconcat ?:(align-center) [
    include-image 100pt `fig/logo.pdf`;
    gap 20pt;
    vconcat [
      include-image 50pt `fig/qrcode.jpg`;
      gap 10pt;
      include-image 50pt `fig/qrcode.jpg`;
    ]
  ]);

  % 画像を枠で囲んで表示
  +fig-center(
    include-image 80pt `fig/logo.pdf`
      |> hvmargin 10pt |> frame 2pt (Color.black)
  );

  % フレーム上の絶対座標を指定して、その位置にテキストを表示
  +fig-abs-pos((50pt, 100pt))(textbox {適当な\emph{テキスト}});
>

ちょっとコード例が長くなりました。それぞれのコマンドや関数の意味を見てみましょう。

  • +fig-center コマンドを用いることでスライドの中央に図版を挿入できます。
    • 引数には figbox 型の値を入れます。 figbox 型の値は include-image をはじめとした様々な関数によって生成できます。
  • +fig-abs-pos を用いると、そのフレームの任意の位置に画像を挿入できます。
    • 左下を原点として、水平方向を x 座標、鉛直方向を y 方向とするような座標系で位置を指定します。
  • include-image は外部の PDF/JPEG ファイルを表示する figbox です。
    • 第1引数に読み込む際の横幅を指定します。
    • 第2引数に読み込むファイルのパスを指定します。拡張子をもとにファイルの種類を自動で判断します[2]
  • hconcat は複数の figbox を与えて、それらを横に結合した figbox を返す関数です。 vconcat はその縦方向バージョンです。
  • hconcat / vconcat 中で gap 関数を使うと、指定された長さの間隔をあけることができます。
  • hvmargin 関数を figbox に適用すると、上下左右に指定した長さの余白をあけることができます。上下にのみ余白をあける vmargin などもあります。
  • frame 関数を figbox に適用すると、指定した線幅・色の枠線で囲むことができます。
  • textbox 関数を用いると、任意のインラインテキストを figbox として扱うことができます。

複数の画像を連結したり画像を枠で囲んだりする場所は SATySFi のパイプライン演算子を用いて簡単にかけるようになっています。OCaml ライクに書ける SATySFi の文法が光っていますね。
figbox には様々な関数・コマンドが用意されており、ここには紹介しきれない機能もまだまだ沢山あります。詳しくは figbox のドキュメント を参照してください。

表の挿入

コンテンツを秩序立てて並べるときには表組みも有効です。表組みは easytable パッケージを用いると楽に実現できます。

https://github.com/monaqa/satysfi-easytable/

easytable パッケージは以下のコマンドを叩くことでインストールできます。

opam install satysfi-easytable
satyrographos install

文書中で easytable パッケージを使えるようにするため、以下の記述を入れてください。

  • ヘッダに以下の行を追加する。

    slide.saty (header)
    @require: easytable/easytable
    
  • プリアンブルに以下の記述を追加する(必須ではないものの推奨)。

    slide.saty (preamble)
    open EasyTableAlias
    

詳しい使い方は easytable パッケージのドキュメントを参照してください。

上記の準備を済ませれば、以下のように表を挿入することができます。下の例では figbox パッケージと併用し、フレームを基準とした中央揃えで表示しています。

slide.saty (body)
+frame{表}<
  +fig-center(textbox {
    \easytable[c; l]{
      | パッケージ名            | 機能
      | `satysfi-class-slydifi` | スライド作成
      | `satysfi-figbox`        | 図版の挿入
      | `satysfi-easytable`     | 表の作成
      |}
  });
>

\easytable では罫線やセルの背景色を指定することもできるため、レイアウトの指定次第ではより凝った表示にすることも可能です。こちらも詳しくは easytable のドキュメント を参照してください。

オーバーレイ

SLyDIFi におけるオーバーレイとは、フレームを構成する段落や図表といった要素の一部を変更して再表示する機能です。説明に合わせて一部の図を差し替えたり、段落を順に表示したりするときに用いると便利です。

オーバーレイは SLyDIFi の標準で入っている機能ですが、実際に使用するときは以下のように SlydifiOverlay モジュールを open しておくことを推奨します。

slide.saty (preamble)
open SlydifiOverlay

SLyDIFi でオーバーレイを実現するのは非常に簡単で、いつもどおりの +frame コマンドの引数の頭にオプション引数をつけるだけです。

slide.saty (body)
+frame?:(3){オーバーレイ}<
  +p{ \emph{オーバーレイ}のテスト。 }
>

このように書けば、同じ内容のフレームが3枚出力されるようになります。しかしこれでは各ページに動きがなくオーバーレイの意味がないため、以下のように動きをつけてみましょう。

  • 「オーバーレイのテスト。」と書かれた段落を2ページ目以降に限って表示する。
  • 段落中の「オーバーレイ」を3ページ目に限って強調する。

これは、それぞれのコマンドに対して以下のようにオプション引数をつけることで実現できます。

slide.saty (body)
+frame?:(3){オーバーレイ}<
  +p?:(from 2){ \emph?:(only 3){オーバーレイ}のテスト。 }
>



  • from 2only 3 は「表示条件」を表しており[3]、それぞれ「2枚目以降のみ表示する」「3枚目のみ表示する」という意味になります。
  • +p\emph はオプション引数として「表示条件」を指定することができます。 +p で作成された段落は表示条件を満たすときのみ表示され、\emph で囲まれたテキストは表示条件を満たすときのみ強調されます。

オーバーレイに対応しているコマンドは他にも沢山あります。詳しくは SLyDIFi のドキュメントを参照してください。

テーマのカスタマイズ

スライド全体もしくは一部のレイアウトを自分好みに変更したい、といった需要は当然あると思います。 SLyDIFi ではそのような需要に応えるため、各スライドテーマの色や書体といったパラメータ化を一部変更できるようにしています。

パラメータを変更するには +set-config コマンドを用います。たとえば akasaka テーマであれば以下例のように書きます。

slide.saty (body)
+set-config(|  % このブロックテキスト自体はなんのページも出力しない
  SlydifiThemeAkasaka.default-config with
  color-bg = (Color.gray 0.7);
  color-emph = Color.blue;
|);

% ここから先のフレームで変更後の設定が適用される

+frame{カスタムテーマのスライド}<
  +p{
    適当な\emph{強調}。
  }
>

おわりに

SLyDIFi を用いた基本的なスライドの作り方を説明しました。スライドを作成するにあたって欲しい機能などありましたら、ぜひ Issue や PR をお寄せください。現在の SATySFi で簡単に実現できそうなものは対応するかもしれません。

脚注
  1. レイアウトと文書構造を分離しやすい、管理が容易であるといった利点からテキストベースを選ぶ人は一定数いると思います。 ↩︎

  2. ファイルの中を見て形式を判断するわけではないので、.jpg の拡張子が付いているが中身は PDF、なんて意地悪なことはしないでくださいね。 ↩︎

  3. 表示条件の実体は単純で、 int -> bool 型の関数型を持ちます。 ↩︎

Discussion