📝

Typst 0.14.0 の内容を早めに深堀り

に公開

はじめに

本記事では、2025/10/24 にリリースされた Typst 0.14.0 の新機能や変更点を紹介します。

リリースノート・深堀り記事一覧

リリース日 バージョン 公式リリースノート 深堀り記事
2024/10/18 0.12.0 公式リリースノート Typst 0.12.0 の内容を早めに深堀り
2025/02/19 0.13.0 公式リリースノート Typst 0.13.0 の内容を早めに深堀り
2025/10/24 0.14.0 公式リリースノート Typst 0.14.0 の内容を早めに深堀り

ピックアップ

影響が大きいと考えられるものや、個人的に気になった新機能などを取り上げます。 特に、破壊的変更には 💥 のサインを付けています。

PDF を image() で図として挿入できるようになった

v0.14 から PDF ファイルを図として挿入できるようになりました。 使い方は JPEG や SVG などの画像と全く同様に、image() 関数で挿入できます。

// シンプルにこうするだけで1ページ目が挿入される
#image("./example.pdf")

// 明示的にフォーマットを指定するなら(基本的には自動検出される)
#image("./example.pdf", format: "pdf")

// ページ番号を指定して挿入
#image("./example.pdf", page: 3)

今までは一度 SVG などに変換する必要があったことを考えると、非常に嬉しい機能追加ですね。 ただし、いくつか制約がある点には注意しましょう。

  • PDF エクスポートする際、読み込む PDF ファイルはエクスポートする際のバージョン以下でなければならない。
    • PDF の仕様には PDF 1.7 や PDF 2.0 などのバージョンがあります。
    • Typst がサポートしている形式はデフォルトが PDF 1.7 です。デフォルト設定で PDF にエクスポートする場合、読み込める PDF ファイルのバージョンは 1.7 までということになります。
    • Typst は PDF 2.0 でのエクスポートなので、もし PDF 2.0 の図を挿入したければエクスポート設定を変えましょう。Typst CLI なら --pdf-standard 2.0 オプションで可能です。
  • PDF/A-3 や PDF/UA-1 など、特定の PDF 標準でエクスポートする場合には使えない。
  • パスワードで保護された PDF ファイルは読み込めない。
  • PDF 画像内のタグは保持されない。アクセシビリティを高めるには alt フィールドを使用する必要がある。

なお image() で挿入された PDF ファイルは、Typst コンパイル時のエクスポート形式によって以下のように処理されます。

エクスポート形式 処理
PDF 直接埋め込まれる
PNG ラスタライズされる
SVG, HTML SVG に変換されて埋め込まれる

title() という要素関数が追加された

文書全体のタイトルを挿入する title() という要素関数が追加されました。 今後、文書全体のタイトルを表示する箇所では heading() などの代わりに title() を用いるようにしましょう。

#set document(title: [Typst 0.14.0 の内容を早めに深堀り])

#title()  // 引数なしであれば document.title プロパティの値が参照される

#title[... タイトル ...] とすることで任意のタイトルを埋め込むこともできますが、PDF ビューアが認識できるなどの恩恵がある document()title フィールドを使うことをおすすめします。

分数の表示形式が指定可能になった

Typst では $a / b$ といった数式内のスラッシュを分数とみなします。 デフォルトでは一般的な分数の表記法に則って分母と分子を縦に並べて表示するものの、 インライン数式などではそのままスラッシュで左右に並べたいケースもあります。 v0.14 からは分数の記法を3種類から選択できるようになりました。


v0.14 から指定できるようになった3種類の記法

明示的には math.frac 構文を用いて指定します。数式内では単に frac() で呼び出し可能です。

$ frac(x, y, style: "vertical") $
$ frac(x, y, style: "skewed") $
$ frac(x, y, style: "horizontal") $

他の構文同様、setshow 構文を用いればスラッシュでの記法そのものの挙動を変えることができます。たとえば

  • すべての $a / b$ 形式の構文に対して一律で特定の記法を採用する

  • インライン数式のみ、$a / b$ 形式の構文に対して "horizontal" を適用する

といったケースで便利です。実際の設定方法は以下の例を参照してください。

コード例
#let Res = math.op("Res")
#let example(title, body) = block(stroke: 1pt, width: 100%, inset: 10pt)[
  = #title

  #body
]
#page(
  width: 500pt,
  height: auto,
  margin: 20pt,
)[
  #grid(
    columns: (1fr, 1fr), column-gutter: 10pt, row-gutter: 10pt,

    example["vertical" style][
      #set math.frac(style: "vertical")  // default
      Laurent 展開における $1 / (z - a)$ の係数
      $
        c_(-1) = 1/(2 pi i) integral.cont_C f(z) d z
      $
      を留数と呼び、$Res(f, a)$ と表す。
    ],

    example["skewed" style][
      #set math.frac(style: "skewed")
      Laurent 展開における $1 / (z - a)$ の係数
      $
        c_(-1) = 1/(2 pi i) integral.cont_C f(z) d z
      $
      を留数と呼び、$Res(f, a)$ と表す。
    ],

    example["horizontal" style][
      #set math.frac(style: "horizontal")
      Laurent 展開における $1 / (z - a)$ の係数
      $
        c_(-1) = 1/(2 pi i) integral.cont_C f(z) d z
      $
      を留数と呼び、$Res(f, a)$ と表す。
    ],

    example["horizontal" + "vertical" style][
      // インライン数式のみ horizontal をデフォルトにする
      #show math.equation.where(block: false): set math.frac(style: "horizontal")
      Laurent 展開における $1 / (z - a)$ の係数
      $
        c_(-1) = 1/(2 pi i) integral.cont_C f(z) d z
      $
      を留数と呼び、$Res(f, a)$ と表す。
    ],
  )
]

この例から、style に応じてカッコの表示有無にも変化があることもわかります。 誤解のおそれのない "vertical""skewed" style ではカッコが省略され、逆に "horizontal" ではカッコが表示されます。

行揃えの際に文字間の空白を調整できるようになった

今までの Typst では行揃えを単語間空白の調整とハイフネーションによって行っていましたが、 行幅の狭いエリアでは調整が追いつかず、スカスカの行ができて見栄えが悪くなるケースがありました。 v0.14 では単語間空白に加えて文字間の空白を調整するためのパラメータが追加され、見栄えの調整がしやすくなりました。 以下のように par.justification-limits プロパティを指定することで、文字間の空白を調整できます。

#set par(justification-limits: (tracking: (min: -0.01em, max: 0.02em)))

これは「文字間の空白を -0.01em から 0.02em の間で調整できるようにする」という意味です。 実際の文字幅は Typst の行揃えアルゴリズムにより自動で調整されます。 公式の例をみると、文字間空白にわずか文字幅の2%程度のあそびを設けるだけで組版結果に大きな差が生まれています。


justification-limits による組版結果の差(左:デフォルト、右:tracking に幅をもたせた例)

1行目の “Anne Christine Bayley” や最後から6行目の “she returned to England,” あたりを見比べると、文字幅による調整の純粋な効果が分かりやすいのではないでしょうか。

HTML エクスポートに機能が追加された

v0.13 にて試験的に導入された HTML エクスポートについても、様々な機能追加が行われました。

  • image()footnote() など、様々な要素が新たに HTML エクスポート可能になりました。Model ページに記載されているものがすべて HTML エクスポート可能となり、文書構造に関する関数は一通り網羅されたことになります。

  • コードブロックを HTML に変換する際の挙動が改善されました。

    • コード全体が <code> タグで囲まれるようになり、なおかつ言語指定がある場合は data-lang 属性が付与されるようになりました。
    • シンタックスハイライトが適用されるようになりました。シンタックスハイライトは <span> タグで色付けされており、Typst 側で設定したテーマが反映されるようです。
  • html モジュールの下に、HTML のタグに対応する html.div などの関数が個別に追加されました。

    • たとえば html.a<a> タグに対応し、 href というキーワード引数を取ります。
  • ラベルを用いた参照が、同一文書内のリンク (intra-doc link) として使えるようになりました。

Typst を用いた Web ページやブログの作成が今後ますます捗りそうです。

ちなみに数式については正式にはまだ HTML export がサポートされていません。しかし、数式を SVG 画像に変換して HTML に埋め込むことはすでに可能です。気になる方はこちらの issue コメントを参照すると様々な知見が得られるかもしれません。

アクセシビリティに配慮した PDF を生成する機能が追加された

「アクセシビリティに配慮した PDF」とは、多種多様な人がアクセスでき、理解できる PDF を指します。アクセシビリティの対象というと視覚などに障がいを持つ方が真っ先に思い浮かぶかもしれませんが、それだけではありません。「PDF を印刷して読む人」「読み上げ機能を使う人」「AI に読み込ませて要約してもらう人」なども含めた全員が対象です。そう考えると、一部の人向けの機能ではなく、むしろほとんどの人に関わりうる考え方です。

PDF には “PDF/UA” というアクセシビリティに関する規格があり、この規格に沿った文書を作成することでアクセシビリティを高めることができます。 v0.14 ではアクセシビリティに関して以下の機能が追加されました。

  • PDF/UA-1 規格に準拠した PDF を生成する機能が追加された

  • PDF 出力時にアクセシビリティに関わる情報がデフォルトでつくようになった

    • 見出しなどの文書構造にタグが付くなど
  • 公式ドキュメントにアクセシビリティに関するガイドが附設された

Typst CLI において PDF/UA-1 規格に準拠した PDF を生成するには、コンパイル時に --pdf-standard ua-1 オプションを指定します。

typst compile [input_file] --pdf-standard ua-1

すると、PDF/UA-1 に準拠していない箇所文書ではコンパイルエラーが起きるようになります。 たとえば以下のシンプルなファイルは通常ならコンパイル可能ですが、PDF/UA-1 としては認められません。

= PDF/UA-1 のテスト

PDF/UA-1 のテストです。

$ a^2 + b^2 = c^2 $

実際にコンパイルしてみると以下のようなエラーとなります。

error: PDF/UA-1 error: missing alt text
   ┌─ pdfua1a.typ:16:0
   │
16 │ $ a^2 + b^2 = c^2 $
   │ ^^^^^^^^^^^^^^^^^^^
   │
   = hint: make sure your images and equations have alt text

error: PDF/UA-1 error: missing document title
 = hint: set the title of the document

つまり

  • 数式に alt text(画像や数式が表示できない環境・視認できない人のために用いられる補助的なテキスト)がない

  • 文書のタイトルが設定されていない

という2点で怒られています。これらを直してみると以下のようになります。

// 文書には document.title プロパティが必須
#set document(title: [PDF/UA-1 のテスト])

// v0.14 で追加された要素関数。文書のタイトルを表示する
#title()

PDF/UA-1 のテストです。

// alt のない数式は認められない
#math.equation(
  alt: "a squared plus b squared equals c squared",
  $ a^2 + b^2 = c^2 $,
)

これでコンパイルが通るようになりました。

また、アクセシビリティに関与する様々な機能が追加されました。

  • pdf.artifact(): 関数ドキュメントの一部に手動で Artifact タグをつけ、その要素が文書的な意味のない飾りであることを読み上げソフトなどに伝える

  • pdf.header-cell() など: 複雑な表のアクセシビリティを高めるのに使える

  • PDF における見出しの情報に通し番号が追加された

注意点

Typst v0.14 へのアップデート時に確認すべき箇所、今後の変更で影響しうる注意点をまとめました。

  • v0.14 から以下の記述がコンパイルエラーとなります。いずれも意味的に不正な記述を弾く意味合いが強いものの、既存の文書がコンパイルできなくなる可能性があります。

    • pdf.attach(旧 pdf.embed) 関数において不正な mime プロパティを指定している

    • link() 関数にて URL を与える引数に空文字列を指定している

    • text.font プロパティに空リストを指定している

    • 空のラベルを定義している(#label("")

  • 以下の機能が deprecated となります。

    • pdf.embed: pdf.attach にリネームされました。

    • bibliography() における一部のスタイルのリネーム

      • "chicago-fullnotes""chicago-notes" or "chicago-shortened-notes"

      • "modern-humanities-research-association""modern-humanities-research-association-notes"

  • 一部のシンボル名にも deprecated なものがあります。よく使われそうなものを抜粋。

    グリフ 旧記法 (Deprecated) 代替記法
    \aleph alef aleph
    \oplus plus.circle plus.o
    \bigotimes times.circle.big times.o.big
    \circledcirc circle.nested compose.o
    \langle / \rangle angle.l / angle.r chevron.l / chevron.r
    \partial diff partial
    h planck h
    \hslash planck.reduce planck

    すべての deprecated については CHANGELOG 参照。

その他の変更点一覧

レイアウト関連

  • WebP 形式の画像読み込みに対応した

文字組み関連

  • 表組みにて、複数行の table.header に対応し、ヘッダが階層構造を持てるようになった

  • 💥 enum.item プロパティのデフォルト値が none から auto になった

  • sub()super() 関数が、OpenType の subs / sups font feature を利用するようになった

  • raw() 関数

    • プレーンテキストのデフォルトのシンタックスハイライトの視認性を改善

    • JSON において、key と value が異なる色でハイライトされるよう変更

  • 見出しや図などの翻訳を複数の言語に追加(言語の一覧はドキュメント参照)

  • (現時点で未サポートである)バリアブルフォントを使用する際に警告を表示

数式関連

  • 1つの数式内で複数のフォントが使えるようになった

  • 数式内のグリフのレイアウトが、Unicode features を参照したより適切なものとなった

  • show rule が、一部の “generated characters” にも適用されるようになった

    • たとえば sqrt() における根号や、大きな行列を囲むカッコなどが “generated characters” に相当します。
  • scr() で手書き文字(花文字)のフォントが指定できるようになった

    • cal() が LaTeX でいう \mathcal{} 相当だったのに対し、 scr()\mathscr{} 相当です。
  • accent() 関数に dotless プロパティが追加された

    • ij にアクセントを付ける際に、元々付いているドットを残すかどうかが制御できます。
  • matrix()augment プロパティが追加され、拡大行列を示す線が引けるようになった

    • 線形代数のレポートを仕上げる際に役立ちますね。
  • 分数の記法と一部の shorthand 記法のパース時の優先順位が改善された

プログラミング・構文関連

  • モジュール内で定義されているか確認するのに in オペレータが使えるようになった

  • array.first(), array.last(), array.join(), str.first(), str.last() メソッドに default という名前の引数を追加

    • いずれも空配列や空文字列が与えられたときにその値を返す、という性質のものです。たとえば "".first(default: "x")"x" となります。
  • array.sorted() メソッドに by 引数を追加

    • 比較時に用いる関数をカスタマイズできます。
  • Unicode 正規化を行う str.normalize() メソッドを追加

    • 引数の form で正規化の種類を NFC / NFD / NFKC / NFKD の4種類から選択できます。
  • direction.from(), direction.to()関数および direction.sign() メソッドを追加

    • direction 型とはグリフやブロック等が並ぶ向きを表す型で、以下の4種類からなります。

      • ltr (left-to-right)

      • rtl (right-to-left)

      • ttb (top-to-bottom)

      • btt (bottom-to-top)

    • たとえば direction.from(left) は left から流れる方向である ltr を返します。

    • direction.sign() メソッドは ltr / ttb を正と見た符号を 1/-1 で返します。たとえば ltr.sign()1 を、rtl.sign()-1 を返します。

  • プラグインで用いられる WASM ランタイムが更新され、SIMD 演算をサポートした

  • 見出し等のナンバリングやカウンタに用いられる整数値が、プラットフォームに依らず 64-bit の整数型(Rust でいう u64)を使うようになった

  • json()yaml() などのデータ読み込み関数において、64-bit 整数で表現できない数を読み込む際の挙動がより一貫したものとなった

    • JSON, YAML, CBOR については「float 型に変換して読み込む」という挙動で統一されました。

    • ただし TOML では読み込み時にエラーとなります(TOML の仕様で規定されているため)。

PDF エクスポート関連

  • すべての PDF/A 標準がサポートされた

    • コンパイル時に特定の標準を指定することで、その標準に沿った PDF が出力されます。
  • 出力できる PDF のバージョンが 1.4, 1.5, 1.6, 1.7, 2.0 から選べるようになった

    • デフォルトは PDF 1.7 です。
  • PDF からのテキスト抽出の挙動が改善された

    • アクセシビリティと関連する話ですが、PDF ビューワからテキストをコピー&ペーストする際の挙動が改善されました。

      • 1つのグリフに複数の文字が入るケースが正しく扱えるようになった

      • 段落中の自然な改行において挟まる空白が正しく保持されるようになった

    • 実際のテキスト抽出の挙動はビューワによっても変わるため一概には言えないものの、 筆者の手元の環境(macOS のプレビュー、Skim、Adobe Acrobat Reader)ではどの環境でもより直観に近いテキストが得られました。 2段組みのテキストを正しい順番で選択してくれる、行揃えのためのハイフネーションが消えるといった恩恵があります。

HTML エクスポート関連

  • document.authorsdocument.keywords プロパティの値が <meta> タグとして出力されるようになった

  • html.elem() 関数がカスタムの HTML 要素名を受け取れるようになった

  • 空の属性値を指定したとき、shorthand 構文で出力されるようになった

    • 例: <div hidden></div>hidden 属性

関連資料

Discussion