rehype-typst という md を typst 化しちゃうパッケージを見つけて、もうストレスフルな KaTeX を使わなくていいじゃん!となったのでこのブログサイトを作りました。
今までの LaTeX 文書もすべて typst に置き換えて表示させようと思ったので変換器を作りました。それを作ったときの知識を共有したいと思います。
LaTeX の構文解析の難しさ
LaTeX の構文解析はコンピューター史上最高級にむずかしいです。
- シンプルにカーネルだけで数千種類のコマンドがあってサポートするのが大変、パッケージのサポートを考えるともっとスケールする
- 加えて LuaLaTeX, pLaTeX2e などのエンジン依存の機能のサポート
- そして最もむずかしいのはマクロの扱い
- \def や \catcode などの自由度の高いマクロ定義により文脈自由文法でない為一般的な構文解析じゃだめ
- マクロ展開までを LaTeX にやらせてみてはどうか
- 構文解析を目的とするなら筋のいい方法だが冗長になって typst との 1 対 1 対応が消えてしまう
- 文の区切りとかの情報が消えてしまう
- マクロは考えないようにしてみたらどうか
- コマンドの条件付きロジックについて正確にやるには個々のマクロ定義を解析しないとわからない
- ex.) {} の省略の挙動, カウンタの値によって \par を挿入
- ヒューリスティックにやろう
- LaTeX カーネルや数千種類に及ぶパッケージの大量のドキュメントや latexdef を読み込んで LaTeX と typst の条件の違いを確認するなどちょ〜大変
- 今まで人は難しかったけど LLM ならいけるのではないか…!?
ということでやってみよう!
手抜けるところは手抜く
ヒューリスティックと決まったのでとりあえずミニマムに作ってインクリメンタルにやっていこうと始めました。
やり方
- 根幹となるシステムを作る
- Input (LaTeX) → Parser → LaTeX AST → Transformer → Typst AST → Generator → Output (Typst)
- newcommand, renewcommand, DeclareMathOperator などシンプルなマクロのみを実装
- AI に聞く
- まず Gemini DeepResearch に大方の違いを聞く
- NotebookLM に LaTeX と typst の pdf 資料を突っ込む
- LaTeX コマンドを 1 つずつマクロ定義を要約し、 typst への変換時に注意すべきことを返してもらい、Claude Code に突っ込む (どっちも並列化して効率化)
- ユーザー定義のマクロをなんとかする
LaTeX と typst の比較
JWT ECDSA
公開鍵を公開