Typst入門
[2024-11-17] いろいろ見直しました。「LaTeXと比べて未完成の部分」を追加しました。
はじめに
Typst(タイプスト)はLaTeX代替とされる新しい組版ツールである。無料〜有料のサービスだが、GitHub でオープンソースのコマンド版(CLI)が公開されている。ここではオープンソース版について扱う。なお、TeX Liveを入れていれば、texdoc typstfun
でTypstとLaTeXのコマンド対照表が表示される。
インストールはGitHubからダウンロードするか、あるいはHomebrewで brew install typst
として入れる。私はGitHubからダウンロードした。
typst --help
で簡単な使い方が表示される。
typst update
で自己アップデートできる。
Typstはシステムにインストールされたフォントをそのまま使える。それ以外のところにあるフォントは、例えば
export TYPST_FONT_PATHS=/usr/local/texlive/2024/texmf-dist/fonts/opentype
のように環境変数を設定することによって使えるようになる。使えるフォント一覧は
typst fonts
で表示される。
最初のTypst文書
さっそく最初の文書をタイプセットしてみよう。
Einsteinは $E=m c^2$ と言った。
LaTeXと違って m c
のようにスペースが必要である。これを test.typ
というファイル名で保存し、
typst compile test.typ
と打ち込むと、test.pdf
というPDFファイルが出力される。しかし漢字の字形をよく見ると、いわゆる中華フォントだ(SIL-Hei-Med-Jian)。ちなみに欧文はデフォルトでLibertinus、数式は『LaTeX美文書作成入門』第9版で採用したのと同じNewCMMath-Bookである。
日本語フォントにするには、typst fonts
で出力されるフォントから適当なものを選んで指定すればよい。Macならヒラギノ明朝にしてみよう。
#set text(lang: "ja", font: "Hiragino Mincho ProN") Einsteinは $E=m c^2$ と言った。
これで数式以外がヒラギノ明朝になる。欧文「Einstein」の部分もヒラギノ明朝の従属欧文フォントになる。
欧文はやっぱりLibertinusのほうがいいなら、
#set text(lang: "ja", font: ("Libertinus Serif", "Hiragino Mincho ProN")) Einsteinは $E=m c^2$ と言った。
のようにする。これでとりあえず数式以外はデフォルトでLibertinusが使われ、Libertinusにない文字はヒラギノになる(後述の「LaTeXと比べて未完成の部分」参照)。
pandocで使う
以上でも見たように、Typstでは #
で始まる部分はTypstの命令である。Markdownと違って、見出しは #
ではなく =
で始める。数式もMarkdownで使うLaTeX風の記法とはかなり違う。LaTeX/Markdownに慣れていたら、最初は混乱する。そんな場合は、まずはLaTeXかMarkdownで書いて、pandocでTypstに変換すれば簡単である。
pandoc は物書きには必須の汎用ドキュメント形式変換ツールである。Homebrewなら brew install pandoc
でインストールできる。markdown
、html
、latex
、typst
、docx
、epub
、ipynb
などに対応する。
例えばMarkdownで
--- title: Typst入門 author: 奥村晴彦 date: 2024年11月11日 mainfont: Hiragino Mincho ProN --- # はじめに Einsteinは $E=mc^2$ と言った。
のように書いて、
pandoc test.md -o test.pdf
と打ち込むと、デフォルトでは test.md
をLaTeXに変換して pdflatex
でPDFにしようとするので、日本語があるとエラーになる。そこで
pandoc test.md --pdf-engine=typst -o test.pdf
とすると、LaTeXの代わりにTypstを使ってPDFに変換するので、とりあえずうまくいく。
中で何が起こっているかというと、pandoc -D typst
で出力されるTypstテンプレートを使ってTypstでPDFに変換している。したがって、pandoc -D typst >mytemplate.typ
のようにテンプレートをファイルに収めてそれを修正し、
pandoc test.md --pdf-engine=typst --template=mytemplate.typ -o test.pdf
のようにして適用すれば、好きな出力にできる。例えば
font: ("$mainfont$",),
を
font: $mainfont$,
に直せば、
--- title: Typst入門 author: 奥村晴彦 date: 2024年11月11日 mainfont: ("New Computer Modern", "Hiragino Mincho ProN") --- # はじめに Einsteinは $E=mc^2$ と言った。
のように欧文フォント・和文フォントを別に指定できるようになる。
以上はMarkdownで書いた文書をpandoc+TypstでPDFに変換する方法であった。もちろん pandoc test.md -o test.typ
とすればPDFではなくTypst文書に変換できる。ただし、Markdown文書冒頭の ---
で囲まれた部分はpandocのTypstテンプレートで処理されるので、これでは出力されない。
パッケージの利用
以下ではLaTeXに近い出力を得るために
export TYPST_FONT_PATHS=/usr/local/texlive/2024/texmf-dist/fonts/opentype
のようにしてTeX LiveのOpenTypeフォントディレクトリにある原ノ味フォント等を利用する。TeX Liveをインストールしていない場合は、typst fonts
で列挙されるフォントの中から適当なものに置き換えられたい。
まずはどこかのディレクトリでターミナルに
typst init @preview/rubber-article myproj
と打ち込んでみよう。これは Typst Universe(LaTeXのCTANに相当する場所)から rubber-article
というパッケージ(いわばスタイルファイル)をダウンロードし、カレントディレクトリ下に myproj
というフォルダを作ってサンプルファイル main.typ
を入れる。パッケージは環境変数 TYPST_PACKAGE_CACHE_PATH
で指定した場所(デフォルトはLinuxなら ~/.cache
の中、Macなら ~/Library/Caches
の中、Windowsなら C:\Users\ユーザ名\AppData\Local
の中)にキャッシュされる。
とりあえずサンプルファイルをコンパイルしてみよう。
cd myproj typst watch main.typ
このように typst compile main.typ
でなく typst watch main.typ
とすると main.typ
が変化するタイミングで自動コンパイルしてくれる。生成される main.pdf
を自動再読み込みに対応したPDFビューア(MacのPreviewなど)で開いておけばリアルタイムで編集結果が見れる。
ご覧のように、rubber-article
はLaTeXのarticleドキュメントクラスとほぼそっくりの仕上がりになる。
この main.typ
を適当に書き直してみよう。日本語メインの文書なら、おおよそ次のようにするとよさそうである(数値は調整の必要あり)。
#import "@preview/rubber-article:0.1.0": * #show: article.with(lang:"ja", text-size:10pt) #set text(font: ("New Computer Modern", "Harano Aji Mincho"), weight: 450) #show heading: set text(font: ("New Computer Modern Sans", "Harano Aji Gothic"), weight: 450) #show strong: set text(font: ("New Computer Modern Sans", "Harano Aji Gothic"), weight: 300) #set par(first-line-indent: 1em, spacing: 1em, leading: 1em) #show heading: it => { v(2em, weak: true) it par(text(size: 0pt, "")) v(0.3em, weak: true) } #maketitle( title: "Typst入門", authors: ( "奥村晴彦", ), date: datetime.today().display("[year]年[month]月[day]日"), ) = 日本語でTypstを使う Einsteinは $E = m c^2$ と言った。
本来は行長が全角の整数倍になるようにマージンを調整しなければならないが、さぼっている。
New Computer Modernについては、『LaTeX美文書作成入門』第9版ではRegularでなくBookのほうを使っている。TypstでBookにするにはweightを425〜575にすればよい(デフォルトは400)。原ノ味はRegularでいいのでここではweightを450に設定した。見出しについてはTypstのデフォルトでは強すぎるように感じたので少しweightを落としてあるが、好みに応じて加減されたい。
(書きかけです)
LaTeXと比べて未完成の部分
和欧混植の仕組みが基本的に未実装である。上で採用した欧文フォントのフォールバックとして和文フォントを指定する方法では、例えば“ダブルクオート”は欧文フォントにも含まれているので全角扱いできない(Unicodeの「東アジアの文字幅」問題、『LaTeX美文書作成入門』第9版p.199参照)。和欧文のサイズ調整もできない。例えばLaTeXの(lt)jsarticleなどでは和文フォントサイズを欧文より少し小さくしているし、jlreqドキュメントクラスではまったく独立に指定できる。これらをTypstで実現するには、正規表現を使って例えば
#show regex("[\p{scx:Han}\p{scx:Hira}\p{scx:Kana}]"): set text(font: "Harano Aji Mincho", size: 0.925em)
のようにすることが考えられる。ただ、これでは約物(句読点・括弧類)の組版ルールが正しく適用されない(「「あ」「い」、「う」」のように括弧や句読点が並ぶ例をタイプセットしてみればわかる)。提案されている Font Unicode Range の実装が待たれる。
段落の最初の全角下げが最初の段落に適用されない。#set par(first-line-indent: 1em)
と指定しても、各セクション2番目の段落からしか全角下げされない。これは欧文組版の一般的なルールであるが、それがハードコードされてしまっている。上に挙げたスタイルでは見出しに par(text(size: 0pt, ""))
のようなダミーの段落を入れるというハックを使っているが、見出しのない文章では困る。
日本語組版処理の要件 3.1.5 行頭の始め括弧類の配置方法で、LaTeXの(lt)jsarticleなどは図71の①の組み方に統一しているが、Typstの現状では段落頭で全角半アキ、段落途中で天ツキになってしまう。
和欧間のアキ(LaTeXの \xkanjiskip
)は入るが、和文と数式の間にはアキが自動で入らない。
句読点のブラ下げ組ができない(これは需要が少ないと思われる)。
ルビや割注については roadmap に載っているが未実装である。ただし rubby というパッケージが開発されている。
縦組ができない。
参考
- Typstについて -- Typst 日本語ドキュメント (非公式)
- Typstで日本語文字と英数字のフォントを別々に指定する
- Typstにおける番号付け指南:基本から高度なカスタマイズまで
- Typst最初の段落の字下げの調整方法
- Typst 便利パッケージと使用例の紹介
- Typst の日本語テンプレートの例
- How-to-use-typst-for-paper-jp
- typst-jp-conf-template
- 第42回 日本ロボット学会学術講演会 -- Typstテンプレート
- mscs2025-typst (第12回 制御部門マルチシンポジウムTypstテンプレート)
- 第67回 自動制御連合講演会 Typstテンプレート rengo2024-typst