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 でインストールできる。markdownhtmllatextypstdocxepubipynb などに対応する。

例えば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 というパッケージが開発されている。

縦組ができない。

参考