Typst の数式モード
今回は今まで敢えて後回しにしていた数式モード(math mode)1 の話。 パッと見は $\mathrm{\LaTeX}$ 記法に似ているのだが色々と違っている。
LaTeX 記法とは似て非なる…
たとえば $\mathrm{\LaTeX}$ 記法では
エネルギーと質量には $E=mc^2$ の関係がある。
と書けば
という感じに組版される。 これをそのまま Typst で組版しようとすると
$ typst compile math.typ
error: unknown variable: mc
┌─ math.typ:1:14
│
1 │ エネルギーと質量には $E=mc^2$ の関係がある。
│ ^^
│
= hint: if you meant to display multiple letters as is, try adding spaces between each letter: `m c`
= hint: or if you meant to display this as text, try placing it in quotes: `"mc"`
てな感じで怒られる。 どうも2つ以上の文字の綴りは何らかのシンボルと解釈されるらしい。 たとえば $\mathrm{\LaTeX}$ 記法の以下の数式は
\[ \left( \int_0^\infty \frac{\sin x}{\sqrt x} dx \right)^2 = \sum_{k=0}^\infty \frac{(2k)!}{2^{2k}(k!)^2} \frac{1}{2k+1} = \prod_{k=1}^\infty \frac{4k^2}{4k^2-1} = \frac{\pi}{2} \]

Typst 記法だと以下のようになる。
$
(integral_0^infinity (sin x) / sqrt(x) dif x)^2 =
sum_(k=0)^infinity (2k)! / (2^(2k) (k!)^2) 1 / (2k+1) =
product_(k=1)^(infinity) (4k^2) / (4k^2-1) =
pi / 2
$

$\mathrm{\LaTeX}$ 記法の { ... }
に相当するものが Typst 記法だと ( ... )
になってるのが紛らわしい。
おそらく文脈で判別してるんだろうけど。
あとインライン数式も別行立て数式もいずれも $ ... $
なのも紛らわしい。
こちらは $E=m c^2$
と $ E=m c^2 $
の違い。
数式の前後に空白文字や改行が入ってると別行立て数式と認識するらしい。
これは $\mathrm{\LaTeX}$ 記法に慣れている人はちょっと大変かもしれない。 Pandoc には $\mathrm{\LaTeX}$ 記法 → Typst 記法への変換機能があるそうだが,そもそも Typst を使うような人はわざわざ Pandoc を導入しないと思う。
フォントの設定
数式モードのフォントを指定する場合は以下のように記述する。
#show math.equation: set text(font: "New Computer Modern Math")
既定は New Computer Modern Math。 数式モード用のフォントには通常のフォントファイルは使えないので注意。
Note that only special OpenType math fonts are suitable for typesetting maths.
Math fonts
試しに Euler フォントで試そうと思ったが,そういやこれってグリフが全部揃ってなかったわ。 STIX2 フォントのほうはこんな感じで上手くいった2。
#set text(font: (
(
name: "STIX Two Text",
covers: "latin-in-cjk",
),
"Noto Serif CJK JP"
), lang: "ja")
#show math.equation: set text(font: ("STIX Two Math"))
アルベルト・アインシュタインは1905年に発表した特殊相対性理論を通して以下の関係を導き出した。
$
E = m c^2 "(エネルギーと質量の等価性)"
$

ただし,上の例では数式モードに日本語が入った場合に問題が出る。
どうも最初の #set text( ... )
のルール設定が数式モードでは適用されないみたいで

という感じで予期しないフォントが埋め込まれてしまった。
これを回避するには
#show math.equation: set text(font: ("New Computer Modern Math", "NOTO Serif CJK JP"))
などと指定する。
これで New Computer Modern Math
> NOTO Serif CJK JP
という優先順位でフォントを選択する。

ありゃ。 Medium フォントが選択されてる。 なんで? うーん。 とりあえずこれは置いておこう。
立体か斜体か
数式の場合は基本的にイタリック体または斜体で記述するのが原則だが,以下の例外がある。
- 数字はローマン体にする($\mathit{3.14}$ ではなく $3.14$)
- 複数文字からなる名前はローマン体にする($sin\,x$ ではなく $\sin x$)
- 単位記号はローマン体にする($3\,m$ ではなく $3\,\mathrm{m}$)
ただ立体(upright)か斜体(slant)3 かの規準は学会等によっても違うようで,たとえば積分等に出てくる dx
とかでも斜体の $dx$ とするか立体の $\mathrm{d}x$ とするか流儀があるらしい。
ちなみに Typst では積分の dx
を立体で表現するために dif x
と記述する。
$\mathrm{\LaTeX}$ には unicode-math
パッケージというのがあって,数式の書体についてはこのパッケージである程度コントロールできる。
詳しくは拙文「数式用フォントで遊ぶ」を参考にどうぞ。
Typst には unicode-math
パッケージに相当するものはないっぽい?
Typst では $\sin$ などの一般的な演算子(関数)はあらかじめ定義されていて,これらは立体で表示される。
Typst predefines the operatorsarccos
,arcsin
,arctan
,arg
,cos
,cosh
,cot
,coth
,csc
,csch
,ctg
,deg
,det
,dim
,exp
,gcd
,lcm
,hom
,id
,im
,inf
,ker
,lg
,lim
,liminf
,limsup
,ln
,log
,max
,min
,mod
,Pr
,sec
,sech
,sin
,sinc
,sinh
,sup
,tan
,tanh
,tg
andtr
.
この一覧にない演算子(関数)は自分で定義できる。
#set text(font: "Noto Serif CJK JP", lang: "ja")
#show math.equation: set text(font: "STIX Two Math")
#let GF = math.op("GF")
位数が $q$ である有限体を $GF(q)$ などと表記します。

他に $\int$ などのシンボルは “Symbols” のページまたは sym
の項を参照のこと。
ちなみに emoji
も使える。
#show math.equation: set text(font: "STIX Two Math")
$
sum_(k=0)^infinity #text(red)[#emoji.suit.heart]^k
$

シンボルについては $\mathrm{\LaTeX}$ の physica
パッケージに近い physica
パッケージがあるらしい。
メートル($\mathrm{m}$)などの単位も立体で表記する。
単位等の表現については $\mathrm{\LaTeX}$ の siunitx
パッケージに近い metro
または unify
パッケージを使う手がある。
unify
のほうが活況?
\[
1\,\mathrm{atm} = 1.01325\,\mathrm{bar} = 101,325\,\mathrm{Pa}
\]
MathJax だと泥臭い記述になるのはご容赦(MathJax 用の動く siunitx
パッケージはないっぽい)。
#import "@preview/unify:0.7.1": qty
#show math.equation: set text(font: "STIX Two Math")
$
qty("1", "atm") = qty("1.01325", "bar") = qty("101,325", "Pa")
$

同じような感じになったかな。
単位表記は値と単位の間のアキを調整する必要があるが unify
パッケージなら上手いことやってくれているようだ。
最終手段として,強制的に立体または斜体にする場合は upright
または italic
関数を使う。
#show math.equation: set text(font: "STIX Two Math")
$
upright("Upright, not Italic") \
"normal string" \
italic("Italic, not Upright") \
bold("Bold") \
italic(bold("Bold Italic")) \
$

おー。 ちゃんと(単なる斜体でない)イタリック体になるんだな。
番号付けと参照
数式の番号付けは equation
の設定で行う。
#set text(font: "Noto Serif CJK JP", lang: "ja")
#set math.equation(numbering: "(1)")
#show math.equation: set text(font: "STIX Two Math")
エネルギーと質量には以下の関係がある。
$
E = m c^2
$

また数式には以下のように <label_name>
でラベルを付けることができ @label_name
で参照できる。
#set text(font: "Noto Serif CJK JP", lang: "ja")
#set math.equation(numbering: "(1)")
#show math.equation: set text(font: "STIX Two Math")
エネルギーと質量には@eq.1 の関係がある。
$
E = m c^2
$ <eq.1>

ラベルはあくまでもマークアップモードでのみ付けることができるみたい。 数式モードの中では付けられなかった。 参照については後日に改めて扱うことにする。
ブックマーク
ブックマークは「Typst に関するブックマーク」にてまとめています。
参考文献
- Typst完全入門: LaTeXより簡単、Markdownより強力、美しいドキュメント作成術
- doitsu (著)
- 2024-12-08 (Release 2024-12-08)
- Kindle版
- B0DPXBNTRS (ASIN)
- 評価
マークアップ言語および組版ツールである Typst についての解説。 Kindle 版のみの提供。固定レイアウトではないためレイアウトが崩れまくって読みにくい。この手の技術解説書は固定レイアウトの Kindle 版か,いっそ PDF で出してほしい。でも Typst についてまとまった解説のある日本語の本は他に見当たらなかったのでありがたい。
- [改訂第9版]LaTeX美文書作成入門
- 奥村 晴彦 (著), 黒木 裕介 (著)
- 技術評論社 2023-12-09 (Release 2023-12-09)
- 単行本(ソフトカバー)
- 4297138891 (ASIN), 9784297138899 (EAN), 4297138891 (ISBN)
- 評価
2023年末に出てるのに気が付かなかった orz
今回は版元で PDF 版を買った。