LaTeXに代わる、学びやすい代替手段 Typst
(github.com/typst)- TypstはLaTeX並みの強力さを目指しつつ、より学びやすく使いやすいマークアップベースの組版システムであり、このリポジトリにはローカルで文書をコンパイルするために必要なコンパイラとCLIが含まれる
- 基本的な書式作業向けの組み込みマークアップ、柔軟な関数、統合されたスクリプティング、数式組版、参考文献管理、わかりやすいエラーメッセージを提供する
- インクリメンタルコンパイルによって高速なコンパイル時間を目指しており、
typst watchはソースの変更を監視して、毎回最初からコンパイルするよりも速く再コンパイルする - CLIはリリースバイナリ、パッケージマネージャ、
cargo、Nix、Dockerでインストールでき、typst compile file.typでPDFを作成し、ユーザー指定のフォントパスも設定可能 - 設計原則は一貫性による単純さ、合成可能性による強力さ、インクリメンタル性による性能を得ることであり、即時プレビュー可能な速度を目標としている
Typstが提供するもの
- TypstはLaTeXと同じくらい強力でありながら、より簡単に学び、使えるように設計されたマークアップベースの組版システムである
- 主な機能は次のとおり
- よく使う書式作業のための組み込みマークアップ
- それ以外の作業のための柔軟な関数
- 緊密に統合されたスクリプティングシステム
- 数式組版、参考文献管理など
- インクリメンタルコンパイルに基づく高速なコンパイル時間
- 問題が起きたときのわかりやすいエラーメッセージ
- このリポジトリには、Typst文書をローカルでコンパイルするために必要なTypstコンパイラとCLIが含まれている
- よりよい執筆体験を求めるなら、無料の共同編集オンラインエディタを利用できる
文法と記述モデル
- Typstは
#setのようなset ruleで、ページサイズや見出し番号付けのような要素属性を設定するpageの高さをautoにすると、コンテンツに合わせてサイズが調整される- より完全な制御が必要なら、show rulesで要素の外観を完全に再定義できる
- 見出しは
= Heading構文で記述する=1つは最上位見出し、==は下位見出しを作る- 軽量マークアップの一覧全体はsyntaxドキュメントで確認できる
- 数式はドル記号で囲む
- 数式内容の周囲に追加の空白を入れると、独立したブロックとして配置できる
- 複数文字の識別子は、引用符で囲まないとTypstの定義や関数として解釈される
floor、sqrtのような項目にバックスラッシュは不要phi.altはphiにalt修飾子を適用し、特定の記号バリエーションを選択する
- スクリプティングでは、ハッシュ(
#)の後に式を書いて文書内にコードを埋め込む- 例では変数2つと再帰関数でn番目のFibonacci数を計算する
table関数はセルを行単位で受け取る- 配列項目を個別の引数として渡すためにスプレッド演算子
..を使う
インストールとCLIの使用
- Typst CLIは複数の方法でインストールできる
- 最新リリースのソースと事前ビルド済みバイナリはreleases pageで入手できる
- バイナリを
PATHに含まれるディレクトリへ置き、その後typst updateで更新できる - パッケージマネージャ版は最新リリースより遅れる場合がある
- パッケージマネージャでのインストール例は次のとおり
- Linux: Typst on Repology, Typst's Snap
- macOS:
brew install typst - Windows:
winget install --id Typst.Typst
- Rustツールチェーンがあれば
cargoでインストール可能- 最新リリース:
cargo install --locked typst-cli - 開発版:
cargo install --git https://github.com/typst/typst --locked typst-cli
- 最新リリース:
- NixとDockerもサポートしている
- Nix:
nix-shell -p typst - Typst flake:
nix run github:typst/typst-flake -- --version - Docker:
docker run ghcr.io/typst/typst:latest --help
- Nix:
- 基本のコンパイルコマンドは次のとおり
typst compile file.typ: 作業ディレクトリにfile.pdfを生成typst compile path/to/source.typ path/to/output.pdf: 指定パスにPDFを生成
- 変更監視は
typst watch file.typで実行する- Typstはインクリメンタルコンパイルを使用するため、毎回最初からコンパイルするより速い
- フォント関連コマンドも提供する
typst compile --font-path path/to/fonts file.typ: 追加のフォント検索ディレクトリを指定typst fonts --font-path path/to/fonts: システムおよび指定ディレクトリで見つかったフォント一覧を出力TYPST_FONT_PATHS=path/to/fonts typst fonts: Linux構文の環境変数方式
- 他のサブコマンドやオプションは
typst help、特定コマンドのヘルプはtypst help watchで確認できる
編集環境とコミュニティ
- IDEのような統合体験、自動補完、即時プレビューが必要なら、無料のTypst Webアプリを利用できる
- コミュニティ製の言語サーバーTinymistは、複数のエディタ拡張に統合されている
- コミュニティ空間はForumとDiscord serverが中心
- Forumは質問、他ユーザーの支援、Typstで作った成果物の共有に適している
- Discordは素早い質問、コントリビューションに関する議論、チャットにより適している
- Typst Universeは、コミュニティがテンプレートやパッケージを共有する場である
- 自作パッケージはpackage repositoryへ提出できる
コントリビューションとビルド
- バグに遭遇したらIssueを立てることができ、新機能やバグ修正を実装したい場合はcontribution guideに従えばよい
- 自分でビルドするには、最新の安定版Rustをインストールした後、次のコマンドを実行する
git clone https://github.com/typst/typstcd typstcargo build --release
- 最適化されたバイナリは
target/release/に保存される - コミュニティにパッケージを共有することも貢献方法の1つである
名前の発音と表記
- TypstのIPA発音は
/taɪpst/である "Ty"はTypesettingのTyのように、"pst"はHipsterのpstのように発音する- Typstを表記するときは固有名詞として扱い、大文字の
Tを使う
設計原則
- TypstはPower, simplicity, performanceという3つの目標を中心に設計されている
- 目標はLaTeXの強力さに匹敵し、学びやすく使いやすく、即時プレビューを実現できるほど高速なシステムであること
-
一貫性による単純さ
- Typstでは、1つのことのやり方を知っていれば、その知識を他の作業にも移せるべきである
- 同じことを行う方法が複数あるなら、それらは異なる抽象化レベルにあるべきである
= Introductionと#heading[Introduction]は、前者が後者のシンタックスシュガーなので、同じことをしていても許容される例である
-
合成可能性による強力さ
- すべてに設定値を持たせる方法ではなく、少数の構成要素をさまざまな形で組み合わせる設計を採っている
- TeXも合成可能な低レベルシステムだが、人々は代わりにLaTeXを使う
- LaTeXでは多くの場合、
\\usepackage{knob}のようにパッケージへ依存することになると見ている
-
インクリメンタル性による性能
- Typstのすべての言語機能はインクリメンタルコンパイルに適合していなければならない
comemoがバックグラウンドでインクリメンタルコンパイル関連作業の多くを処理する
スポンサーと支援
- Typstのオープンソース作業に対する主な支援として、次の項目が挙げられている
- Posit: フルタイムのコンパイラエンジニアへの資金提供
- NLnet: NGI Zero Core基金を通じた複数の助成金でTypstの作業を支援
- HTML exportの作業
- PDF accessibilityの作業
- Science & Startups: Berlin Startup Scholarshipを通じて、2023年1月から6月までTypst開発に資金提供
- Zerodha: 単発のスポンサー支援
- この一覧には、オープンソース作業への貢献額が€10Kを超えた、または超える見込みの項目のみが含まれる
2件のコメント
LeTeX は「ラテックス」と読むのでしょうか? 「レイテック」と読むはずですが。
Hacker News の意見
Typstはかなり優れていて、私たちの組織でも非常に満足している
毎晩 150万件以上のPDFを生成する必要があり、HTML→PDF変換用の Puppeteer、pdflatex、lualatex など複数の解決策を試したが、Typst は桁違いに速く、リソース使用量も軽かった
LaTeX で PDF テンプレートを作る開発者体験は良くなかったが、Typst のテンプレートはかなり直感的だった
この大規模 PDF 生成スタックについて、ブログにさらに詳しく書いた: https://zerodha.tech/blog/1-5-million-pdfs-in-25-minutes
Puppeteer ベースの 大量 PDF レポーティング製品を作っているが、夜間ジョブ・キャッシュ・並列処理まで使えば性能は悪くない
https://www.cx-reports.com
昔、似た問題に対処する必要があったときには良い解決策だった
規模はそこまでではなかったが、それでも十分使えた
Typst で課題をたくさん書いてみたが、学術的な文章を書くのがより簡潔で没入感があり、あえて言えば楽しくなった
Typst 構文の関数型的な性質のおかげで、最近の Microsoft Word、時には Google Docs でも見られる気まぐれな挙動に悩まされずに済む
VSCode のようなローカル IDE を使えば、欲しい機能もほぼそろえられる
LaTeX と比べると、文書全体の組版はずっと直感的だが、複数ページにわたる方程式の解法を長く書くときは LaTeX のほうが入力しやすいと感じる
LaTeX の構文は関数型プログラミング言語というより Markdown に近いので、関数・上付き・下付きが多い数式を組版するときに、事前に考えることが少なくて済む
今は論文を Typst で書くことはないと思う
機関の外に出すならほぼ必ず変換が必要になるし、arXiv も LaTeX ソースを要求する
現在の LaTeX 周辺ツールはかなり良く、支援してくれる IDE も多い
個人的には LaTeX にコンパイルされる Emacs の Org-Mode を使っている
https://github.com/mitex-rs/mitex
過去の議論と関連資料がいくつもある: https://hn.algolia.com/?q=typst
1年前、コメント146件: https://news.ycombinator.com/item?id=35250210
8か月前、コメント34件: https://news.ycombinator.com/item?id=38354422
2年前、コメント53件: https://news.ycombinator.com/item?id=34423590
2年前、コメント30件: https://news.ycombinator.com/item?id=32209794
HTML 出力が最初から中核機能ではなく、現在進行中だという点に驚いた
LaTeX が Web とぎこちない関係にあることは、新しく始める競合プロジェクトなら初期段階からきちんと解決しようとしたであろう部分に見える
[0] https://github.com/typst/typst/issues/721
どちらも同じ問題に直面するが、Web と紙はまったく異なる動作をし、相互に翻訳できない概念がある
だから組版結果が別の環境に自然に収まる方法を定義しなければならない
Typst が最初から HTML を目標にしていたなら開発はずっと簡単だっただろうが、そうしていたら過度に複雑なサイトジェネレーター以上のものにはならなかったはずだ
PDF を先に狙ったのは、実際に LaTeX と競合しようとする意図だと思う
新しいマークアップシステムを始めるにあたってアクセシブルな文書を作る計画がなかったのなら、非常に悪い判断だと思う
Typst がアクセシブルな文書を作れるようになるまでは使わない
PDF は好きではない
LaTeX が消えて Typst が代わりになるのを待っている
使用体験がまったく違い、作業結果が非常に印象的だ
これまでは Jinja2 テンプレートで TeX ファイルを生成していたが、Typst はコマンドラインから JSON を受け取ることができ、使いやすく十分に強力なので、Python の段階を完全に取り除ける
コンパイル時間がミリ秒単位であることは言うまでもない
最初は LaTeX でやっていた方法に慣れていたので、Go テンプレートで Typst テンプレートを生成してみた
だが Typst が独自のスクリプティングエンジンで JSON を直接簡単に使えることが分かって良かった
1999年にインターンとして働いていたとき、TIAのVoIP電話標準作業部会向けの標準文書を書く仕事を任された。
標準化団体には皆が使うWordテンプレートがあったが、工学部生としてしばらくLaTeXを使っていて気に入っていたので、「どうせ最終出力はPDFだし、組版もそのほうが良くなるはずなのに、なぜLaTeXを使わないのだろう?」と思った。
実際にLaTeXの出力はより良く、上司は私がWordを使っていないことにまったく気づかないまま成果物を気に入ってくれた。
作業部会メンバーの反応も良く、「この子は本当に才能があるね」というような雰囲気だった。
スタートアップにとって、作業部会に参加している巨大企業に良い印象を残すことは、会社の将来、もしかすると生き残りにとって非常に重要だった。
ところがある日、上司が「そのWord文書を、うちを買収するかもしれない大企業のお偉いさんに送れるかな? 新しい文書テンプレートとして使いたいそうなんだ」と言い、4歳のとき友だちと実験半分でクローゼットにおしっこをして母親に見つかったときのような、沈み込む気分になった。
結局、友人を雇って週末中ずっとWordで苦労して作り直してもらい、上司は文書を受け取った。
会社は18か月後に1億ドルで買収された。
いずれにせよ、LaTeXはWordより今でも1000倍見栄えが良い。
これはOverleafやCodiMDのようなサービスの競合に見える。
また別の構文ではあるが、pandocが対応しているようだ。
最近はRでプログラミングすることが多く、Quartoをますます使うようになっていて、とくにHTMLのようなかなり良い出力を作ってくれる。
ただ、こうしたツールも学術用途で重要な2つの問題、つまり査読者に良い差分比較を提供することと、非技術系の共同作業者と簡単に共有してコメントできるようにすることは解決できていない。
そのため、少なくとも私の分野の科学論文執筆では、Wordを今後も何年も置き換えるのは難しそうだ。
[1] https://github.com/overleaf/overleaf
[2] https://github.com/hackmdio/codimd
[3] https://pandoc.org/typst-property-output.html
[4] https://quarto.org/
GTを使うとき、TypstのPDF出力はLaTeXのPDFより少し粗く感じた。
改善されることを願っている。
LaTeXと比べたとき、Typstで最も気になる点は、基本的な高度なタイポグラフィ機能をうまく扱えていないことだ。
たとえば数式モードでのスペーシング種別(mathop、mathbin、mathrelなど)や区切り記号のサイズ(big、biggなど)の扱いが不足している。
数式モードの記号・演算子間隔は https://typst.app/docs/reference/math/class/ で変更でき、区切り記号のサイズは https://typst.app/docs/reference/math/lr#functions-lr で変更するか自動処理できる。
ただしLaTeXも同様のようだ。
本当に良さそうで、一度試してみるつもりだ。
ただ、ずっとこう考えてしまう。
15年後もLaTeXが無料で保守されていると見込む確率: 99.9999%
15年後も他の新しいツールが無料で保守されていると見込む確率: 5%
bashや他のいくつかのものも同じだ。
より良い代替がたくさんあっても、痛点が十分に大きくないため置き換えられない。
Typstが好きだ。
とくにプログラムで生成した入力を扱うときに良く、
--inputフラグはJSONを受け取れる。ファイル内では専用の
json.decode()関数でJSONを簡単に取り込める。安定した結果をとても簡単に作れるので、自分のプロジェクトでもLaTeXからTypstに乗り換えた。
[0] https://typst.app/docs/reference/foundations/sys/
[1] https://resgen.app