Typstとpdfpcでプレゼン機能を実現する

Table of Contents

背景・動機

Typstでスライドを作るフローがだいぶ固まってきた。

過去に普段資料はGoogle Slideで作成していたのだが、次の理由でGoogle Slideを使っていた。

例: AWS SQSとLaravelで大規模トラフィックを捌く - phpcon新潟

  • Google Driveで管理できる
  • 自己紹介部分など過去のスライドを流用できる
  • 文字や画像の配置に自由度がある
  • プレゼンター表示ができる
    • スピーカーノートを別画面で確認できる
    • 経過時間の計測ができる

管理方法やスライドに関するものはTypst力が上がればカバーできるが、プレゼンター表示に関しては何か対策を講じなければ代替できない。

今回は実際に登壇に耐えうるツールの選定と運用の検討をしたのでメモしておく。

試したこと・やったこと

0. ツールの選定

自分がプレゼンテーションモードに求めている機能をリストアップすると以下。

  • MUST
    • 登壇スライドとは別にスピーカーノートを別画面で確認できる
    • 経過時間の計測ができる
    • Typst内 or Orgファイル内でスピーカーノートを管理できる
  • SHOULD
    • 次スライドの表示
    • 全体のスライド表示
  • MAY
    • ホワイトボード/ペンツール機能
    • オフラインで機能する
    • 動画やスライドアニメーションなどの制御

Typstから生成したPDFをそのままプレゼン資料として表示できるツールは無数にある。

Typstテーマを自作した にも書いたとおり、Typstのベーステーマに polylux を利用している。

polyluxのドキュメントを読んでいるとpdfpcと繋ぎ込む記述があり、これを用いるとスピーカーノートを実現できることが分かる。 可能な限り公式がサポートしているものを使う方が筋がよい、また要件を十分に満たしていることが確認が取れたので今回はpdfpcを選択した。

https://polylux.dev/book/external/pdfpc.html#pdfpc

1. Typstとpdfpcとの繋ぎ込み

pdfpc integrationは polylux-typ/polyluxsrc/toolbox/pdfpc.typ にある。 使い方は簡単で、次のように記述するだけでよい。

#import "@preview/polylux:0.4.0": *

#slide[
    #toolbox.pdfpc.speaker-note("This is a note that only the speaker will see.")
]

polylux2pdfpcを使ってpdfpcファイルを生成する。

# PDFを生成
$ typst compile foo.typ

# pdfpcを生成
$ polylux2pdfpc foo.typ

foo.pdfpc が生成される。

{
  "pdfpcFormat": 2,
  "disableMarkdown": false,
  "pages": [
    {
      "idx": 0,
      "label": 1,
      "overlay": 0,
      "forcedOverlay": false,
      "hidden": false,
      "note": "This is a note that only the speaker will see."
    },
    {
      "idx": 1,
      "label": 2,
      "overlay": 0,
      "forcedOverlay": false,
      "hidden": false
    },
    {
      "idx": 2,
      "label": 3,
      "overlay": 0,
      "forcedOverlay": false,
      "hidden": false
    },
    {
      "idx": 3,
      "label": 4,
      "overlay": 0,
      "forcedOverlay": false,
      "hidden": false
    },
    {
      "idx": 4,
      "label": 5,
      "overlay": 0,
      "forcedOverlay": false,
      "hidden": false
    },
    {
      "idx": 5,
      "label": 6,
      "overlay": 0,
      "forcedOverlay": false,
      "hidden": false
    },
    {
      "idx": 7,
      "label": 7,
      "overlay": 0,
      "forcedOverlay": false,
      "hidden": false
    }
  ]
}

なお私はNixユーザなのでflake.nixで記述している。

https://github.com/takeokunn/blog/blob/8416672d96853732b5bf97c77586beab9bd4051f/typst/flake.nix#L59-L77

2. pdfpcインストール

pdfpcはnixpkgsにあるのでインストールが簡単だが、手元のM1 Macだと次のようなエラーが出て入らなかった。

https://search.nixos.org/packages?channel=25.05&show=pdfpc&from=0&size=50&sort=relevance&type=packages&query=pdfpc

error: Package ‘webkitgtk-2.48.2+abi=4.1’ in /nix/store/dzwwydggypqg4p8r6if5zdaqyzhsxjkd-source/pkgs/development/libraries/webkitgtk/default.nix:254 is marked as broken, refusing to evaluate.

homebrewにもパッケージがあるのでこちらから入れた。

https://formulae.brew.sh/formula/pdfpc

次のようにコマンドを叩いて生成したpdfpcファイルと共にpdfを指定するとビューワーが起動した。

複数モニタにしてから起動すると手元PCには管理側の画像、外部モニターにはPDFが全画面で表示された。

$ /opt/homebrew/bin/pdfpc result/foo.pdf -R result/foo.pdfpc

3. pdfpcの使い方確認

マスタリングpdfpc - Qiita に操作方法が詳細に記述してある。

手元のM1 Macの場合は微妙にキーバインドが違うのか期待とおり動いてくれなかったので要練習。

  • j/k で次のスライドに移動できない
  • ポインタやお絵描きのキーバインドが異なる

? で画面上でkeybindを確認できるようだ。

得られた結果・所感

当初の目標であるGoogle Slideの脱却が今回の対応で可能になったのは個人的に大きい。 pdfpcの使い方に関しては登壇を通じて練習していきたい。

今後の展開・検討事項

登壇の場数を踏んでより洗練させていきたい。 登壇周りのすべてがプレーンテキスト(Org)で管理できるようになったので、次はAIによるスライド生成にチャレンジしたい。