ペパ研

Typstのすゝめ:コーディングエージェント時代のスライド・ポスター作成

ペパ研

ペパボ研究所 研究員/シニア・プリンシパルエンジニアの三宅(@monochromegane)です。

先日の第40回人工知能学会全国大会(JSAI2026)での発表では、発表スライドと、研究所紹介のポスターを、いずれもTypstで作成しました。研究所共通のスライドテンプレートを一度作っておき、それを使い回してスライドを書いたり、同じ枠組みでA0サイズのポスターまで仕上げられたりと、想像以上に快適だったので、その経緯と使い方を紹介します。

背景と課題

これまで、ペパボ研究所では発表スライドを、従来のスライド作成ツール(Keynote、Google Slidesなど)で作成してきました。これらのツールに対応した研究所のテンプレートもあり、タイポグラフィやページレイアウトが統一された整ったスライドを作成できていました。一方で、要素の配置やテキストの入力は手作業であり、どうしても時間がかかります。また、コーディングエージェントと組み合わせるうえでも、GUI操作を前提とするこれらのツールより、ソースをテキストとして持てる形式が望ましくなってきました。

ソースをテキストで持てるという点では、MarpのようなMarkdownベースのツールが選択肢になります。エージェントとも相性がよい一方で、スライドやポスターではレイアウトの自由度が重要になります。Markdownは上から下へ流れるリニアな記法であり、二次元の版面へ要素を自由に配置するには表現力が足りません。足りない分はHTMLやCSSで補えますが、CSSはもともと可変幅のWebページ向けのスタイル言語であり、固定サイズの版面に絶対座標で配置する用途とは思想が異なるのではないかと考えています。そのため、意図した通りにページ内のレイアウトを固定することが難しくなります。加えて研究発表では、グラフィカルモデルや処理フロー図のようなカチッとした図や数式が欠かせません。また、再現性の面では、これらの図や数式もソースをテキスト(コード)として残せると嬉しいところです。

組版エンジンTypst

これらの課題に応えるものとして採用したのがTypstです。

Typstは近年注目を集めている組版システムで、「LaTeX並みの表現力を、より学びやすく」を掲げています。= 見出し*強調*といった軽量なマークアップ記法(Markdownに近い書き味)を基本としつつ、#から変数や関数を扱えるスクリプト機能を備え、高速な組版エンジンを内蔵しているのが特徴です。固定サイズのキャンバスへ要素を絶対座標で配置でき、意図した通りにレイアウトを作り込めます。スクリプトによってリニア構造にも縛られず、数式も第一級の対象として、ソースと統合して記述できます。ソースはプレーンテキストであるため、Git管理もエージェントとの協働も自然に行えます。

記法はLaTeXほど難読ではなく、比較的読みやすいものです。仮に多少読みにくくても、エージェントが下書きを担う現在では、ソースの一次的な読み手は必ずしも人間だけではありません。素朴な読みやすさを多少手放してでも、表現力と引き換えにする価値は十分にあります。スライド向けのテーマや作図ライブラリもパッケージとして整備されているため、テキストのみでスライドからポスターまでを作成できます。

なお、図についても、後述するCeTZパッケージを使えばコードとして記述できます。

Typstによるスライド作成

ここからは、実際にJSAI2026の発表資料を作成した流れを紹介します。ペパボ研究所では、touyingというスライド向けパッケージをベースに、配色・ロゴ・フォントを研究所仕様に揃えた共通テンプレートpepaken.typを用意しました。これをimportするだけで、表紙・自己紹介・目次・章区切り・締めページといったスライドが、統一されたスタイルで作成できます。

なお、以下ではコード例をいくつか示しますが、構文を逐一覚える必要はありません。前述の通り、実際の記述はエージェントに任せられるため、スライド作成の指示者としては「Typstでどのような構成や機能が可能か」を把握しておけば、協働のうえでは十分だと考えています。

1. テンプレートを作成する

テンプレートpepaken.typは、touyingの組み込みテーマmetropolisをラップし、配色・フォント・ロゴ・キャンバスサイズを研究所仕様の既定値で上書きしたものです。次は、その中核部分の抜粋です(touyingや後述するCeTZ、peace-of-posters等のパッケージやテンプレートはTypst Universeで公開されており、#importにバージョンを指定しておけば初回ビルド時に自動で取得されます)。

#import "@preview/touying:0.7.3": *
#import themes.metropolis: *

// ペパ研の配色(ロゴ由来の青とチャコール)
#let pepaken-colors = (
  primary: rgb("#1f7acc"),          // 強調・バー・著者名など
  neutral-darkest: rgb("#38393c"),  // 本文テキスト
)

// 欧文 Avenir Next + 和文 Hiragino Sans
#let pepaken-fonts = (main: ("Avenir Next", "Hiragino Sans"))

// metropolis テーマをペパ研仕様にラップ
#let pepaken-theme(aspect-ratio: "16-9", ..args, body) = {
  show: metropolis-theme.with(
    aspect-ratio: aspect-ratio,
    config-colors(..pepaken-colors),
    config-info(logo: image("assets/regular_rgb.svg")),
    config-page(width: 1920pt, height: 1080pt),  // 1920×1080pt の固定キャンバス
    ..args,
  )
  set text(font: pepaken-fonts.main, size: 22pt)
  body
}

表紙や箇条書きなど、用途ごとのスライドも、touyingの関数を上書きしたり、独自の関数を定義したりして、あらかじめ用意しておきます。各ページの要素は「左上角のx/y座標+幅・高さ(pt単位)」で絶対配置しており、1920×1080ptの固定キャンバスを前提にしているため、デザインツールと同じ感覚でピクセル単位の微調整ができます。一度作っておけば、以降はこのテンプレートをimportするだけで済みます。

2. テンプレートを適用してスライドを書く

研究所テンプレートをimportし、pepaken-themeを適用したうえで、発表情報をconfig-infoで渡します。あとは、用意された関数や見出し記法でページを並べていくだけです。

#import "../templates/pepaken.typ": *

#show: pepaken-theme.with(
  aspect-ratio: "16-9",
  config-info(
    title: [適応的スパムフィルタのための \ 軽量な類似メッセージカウンタ],
    author: [三宅悠介 / Pepabo R&D Institute, GMO Pepabo, Inc.],
    date: datetime(year: 2026, month: 6, day: 9),
    event: [第40回人工知能学会全国大会(JSAI2026)],
  ),
)

#title-slide()                       // 表紙

#toc-slide([はじめに], [関連研究], [提案手法], [評価], [おわりに])  // 目次

= はじめに                            // `= 見出し` は青背景の章区切りページになる

#bullet-slide(                       // 箇条書きのコンテンツページ
  title: [本研究のアプローチ],
  [メッセージの類似性と出現頻度に着目したアプローチが研究されている],
  [既存手法には、マルチモーダル対応や低レイテンシ・低コスト化に課題が残る],
  [これらの要件を満たす軽量な類似メッセージカウンタを提案],
)

#closing-slide()                     // 締めページ

特徴的なのは、= 見出しと書くだけで章区切りページが自動採番付きで生成されたり、先に定義した関数に項目を渡すだけで配色・行間・マーカーが揃ったリストになったりと、デザインの統一がテンプレート側で完結している点です。ソースは単なるテキストであるため、エージェントに「この節を3項目の箇条書きスライドにして」と依頼することも容易です。

3. CeTZで図を描く

研究発表で要となる図は、作図ライブラリのCeTZで記述します。LaTeXでいうTikZにあたるもので、座標を指定してノードや矢印、数式を組み合わせ、ベクター画像として図を組み上げられます。

実際に、JSAI2026の発表スライドでは、提案手法の図をCeTZで作図しました。次の4枚はその例です。ノードや矢印、数式で構成された、かなり「カチッとした図」が得られているのが見て取れると思います。

以下は、ノードと矢印で単純なフローを描く例です。

#import "@preview/cetz:0.4.2"

#let flow = cetz.canvas(length: 1pt, {
  import cetz.draw: *

  let dark = rgb("#38393c")
  let lbl(s) = text(font: ("Avenir Next", "Hiragino Sans"),
                    weight: "semibold", size: 28pt, fill: dark, s)

  // 中心座標・参照名・ラベルを受け取ってノードを描くヘルパー
  let node(pos, name, label, w: 200, h: 90) = {
    rect((pos.at(0) - w / 2, pos.at(1) - h / 2),
         (pos.at(0) + w / 2, pos.at(1) + h / 2),
         name: name, stroke: 2.5pt + dark, fill: white)
    content(pos, lbl(label))
  }

  let arrow = (mark: (end: "stealth", fill: dark), stroke: 2.5pt + dark)

  node((0, 0), "msg", [Message])
  node((300, 0), "hash", [LSH / dHash])
  node((620, 0), "cms", [SW-CMS], w: 240)

  line("msg", "hash", ..arrow)
  line("hash", "cms", ..arrow)
})

このように、図を変数として定義しておけば、スライド中に#flowと書くだけで配置できます。ノードの座標やラベルがソースに残るため、後から「この経路を1本足したい」「ラベルを変えたい」といった修正も差分で追え、エージェントにも指示しやすくなります。数式も$b_i = cases(1 & "if" bold(x) dot bold(h)_i > 0, 0 & "otherwise")$のように、$ $で囲む簡潔な記法で図中にそのまま埋め込めます。

4. コンパイルする

LaTeXのlatexmkにあたるものは不要で、typstコマンドで直接ビルドします。テンプレートやアセットを参照するため、--rootでルートディレクトリを指定します。

# PDFを生成
typst compile --root . path/to/main.typ

コンパイルが高速なので、書いては仕上がりを確認するという試行錯誤のサイクルを短く回せます。

なお、Typstの出力はPDFなので、発表時にはプレゼンテーションツールを別途用意する必要があります。私はpympressを使っています。

ポスターの作成

同じTypstの枠組みで、研究所紹介のA0ポスターも作成しました。ポスター向けにはpeace-of-postersというテンプレートがあり、カラムやセクションのボックスを組み合わせてレイアウトを構成できます。スライドと配色・ロゴを揃えたテーマを定義し、gridで段組みを組み、CeTZや既存の図を配置することで、A0サイズの大判ポスターまで一貫した流れで仕上げられました。

ペパ研ポスター(JSAI2026)

まとめ

コーディングエージェントの普及により、スライドやポスターのソースを「人間が読みやすいか」だけでなく「テキストとして資産化でき、エージェントと協働しやすいか」という観点で捉え直す必要が出てきました。Typstは、

  • テキストベースでGit管理・エージェント協働に向く
  • 固定キャンバスに対する高いレイアウト表現力を持つ
  • 図や数式をソースと統合して記述できる
  • 高速なビルドで試行錯誤が速い

という、研究・技術発表の要件によく合うツールでした。研究所では共通テンプレートを整備したことで、スライドからポスターまでを、統一感を保ったまま作成できています。これまでLaTeXで論文やスライドを書いてきた方はもちろん、これからエージェントとともに発表資料を作成していく方にとっても、Typstは有力な選択肢になると考えています。


【PR】パートナー積極採用中!

ペパボ研究所では、新しいパートナーを求めています。詳細については、当研究所のトップページをご覧ください。