✒️

Typstの基本文法と使い方

2024/04/29に公開

Typstとは

Typst(タイプスト)は、LaTeXと同等の機能を持ちながらも、学習と使用がさらに容易な組版システムです。
https://typst.app/

Typstには以下の特徴があります。

コンパイルが高速

Rust製ということもあり、コンパイルがとても速いです。

導入が楽

LaTeXのインストールは40分ぐらいかかった記憶がありますが、Typstの場合10秒もかかりません。さらに、公式が出しているクラウドの環境を利用すれば環境構築なしでも利用することができます。導入方法は公式リポジトリでOS毎の説明があります。
https://github.com/typst/typst

記法がシンプル

関数や構文モードという機能により、記法がとてもシンプルになっており、直感的に文書を作成することができます。

Typstの基本文法

モードと関数

Typstにはmarkup, code, math の3つの構文モードが存在し、
さまざまな関数(function)を呼び出して文書を構築します。

markup code math
概要 Typst文書のデフォルトのモード Typstのスクリプト機能を使用する際に使うモード 数式を書く際に使用するモード
切り替え方法 []で囲む #から開始する $で囲む

実例とともに、それぞれのモードと関数呼び出しについて見ていきましょう。

markup モード

現在、デフォルトのmarkupモードです。\
markupモードではさまざまな構文を利用することで手軽に関数を呼び出すことができます。

例えば、アンダーライン(\_)で囲むだけで_Italic_にできたり、\
アスタリスク(\*)で囲むだけで*強調*できたりします。\
改行もバックスラッシュ(\\)を挟むだけ、改段落も空行を挟むだけで行っています。\

出力

code モード

続いてcodeモードです。codeモードへの切り替えは、\#を最初につけることで行われます。
このモードではスクリプト機能を利用することができます。

#v(2em)

#figure(
  image("./figure/nuko.png", width: 30%),
  caption: [にゃ~ん]
)

#for c in "ABC" [
  #c is a letter. #h(1.5em)
]\

#let fibonacchi(n) = {
    if type(n) != int  { return }
    if n <= 0  { return }

    let a = 0
    let b = 1
    let c = 0

    (b,)

    let i = 2
    while i <= n {
      c = a + b
      (c, )
      a = b
      b = c
      i += 1
    }
  }

#fibonacchi(10)



このようにcodeモードでは、letキーワードを利用して変数や関数の定義を行ったり、if文、for文、while文などを利用したスクリプティングが可能です。

#v(2em)

また、markupモードの構文は、実際には対応する関数を呼び出しているだけであり、

*強調* #h(1em) #strong[強調]

_Italic_ #h(1em) #emph([Italic])

このようにcodeモードで関数を呼び出しても結果は同じです。

math モード

次にmathモードです。\
mathモードは数式を出力するための構文モードです。試しにいくつか入力してみます。
#v(2em)

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

$ lim_(x->a) (f(x)-f(a))/(x-a) = 
lim_(Delta x->0) (f(a + Delta x) - f(a))/(Delta x), (x=a + Delta x) $

$ F = G (M m)/r^2 $

#v(2em)
数式内の記号(#sym.Delta など)は、通常は\sym.を付けなければいけませんが、mathモードでは省略することができます。

記号の一覧は公式サイトで確認できます。
https://typst.app/docs/reference/symbols/sym/

文書全体のスタイルを変更する

文書全体のスタイルを変更したい場合、2通りの方法があります。setルールを利用する方法と、showルールを利用する方法です。showルールを利用するほうが、より詳細なスタイルの変更を行えます。

setルール

setルールを利用すると、文書全体のスタイルをカスタマイズすることができます。
これは関数に対する関数呼び出しという形で記述され、Typst標準の要素を返す関数(heading関数やtext関数など。以下、要素関数と記述)にのみ適用できます。

例えば、フォントと見出しのナンバリングを変更してみます。

#set heading(numbering: "I.")
#set text(font: "UD Digi Kyokasho N-B",size: 2em)

= 見出し1
#lorem(10)
== 見出し2
#lorem(10)

すべてのheading関数、text関数に対して同じ変更が加えられていますね。
(因みに、lorem関数は指定された単語数のダミーテキストを生成する関数です。)

showルール

showルールを使用すると、さらに詳細なスタイリングが行えます。こちらは「対象(関数以外も可)に変更を加え、置き換える」という挙動になります。対象の選択にはセレクタ(selector)を利用します。
セレクタとして、以下を使用することができます。

  • 要素関数
  • 特定のフィールド
  • 文字列または正規表現
  • ラベル(label)
  • location
#show heading: set text(blue)
//#show heading: it => text(it,blue) と同じ挙動をする。

#show heading: it => [
  #set align(center)
  #set text(font: "Inria Serif")
  \~ #emph(it.body) \~
] // selectorとして関数を使用した場合

#show "Twitter": "X" // selectorとして文字列を使用した例

#show regex("[\p{scx:Han}\p{scx:Hira}\p{scx:Kana}]"): set text(font: "Source Han Sans") // selectorとして正規表現を使用した例。日本語が置換される

#show <twitter>: set text(font: "Imprint MT Shadow", size:4em) // selectorとしてラベルを使用した例

= Twitter is great SNS
Twitter<twitter>は最高のSNSです!

基本的な関数

text関数

text関数の定義
Text Function – Typst Documentation より

テキストを表示する際に使われる関数です。よく、setルールやshowルールと組み合わせて文書のスタイリングをする際に用いられます。「文書全体のスタイルを変更する」の章でも多用されていますね。

heading関数

見出しを出力する際に使われる関数です。またmarkupモードならショートカットである=を利用します(基本的にこちらを利用するでしょう)。

heading関数の定義
Heading Function – Typst Documentation より

#heading(
  [大見出し],
  depth: 1
)
#heading(
  [中見出し],
  depth: 2
)
#heading(
  [小見出し],
  depth: 3
)

markupモードの場合、=の数によって見出しのdepthを決定します。どちらも同じ出力になります。

= 大見出し
== 中見出し
=== 小見出し

出力

par関数

par関数の定義
Paragraph Function – Typst Documentation より

段落を出力する関数です。こちらもsetルールやshowルールと併用され、文書スタイルの調整目的に使われることが多いです。

#set par(
  first-line-indent: 1em,
  justify: true,
)

= paragraph function

#lorem(20)

#lorem(20)

#lorem(20)

Typstでは、見出し後の最初の段落は字下げされないという仕様になっています。これは日本語で文章を書く場合に問題になりますが、 mkpoli さんが解決方法を挙げていましたので、リンクさせていただきます。

https://zenn.dev/mkpoli/articles/34a5ea47468979#見出しの下に空白の段落を追加する

figure関数


Figure Function – Typst Documentation より

図を出力する関数です。表番号を自動で当てたり、キャプションを入れることができます。image関数や、table関数などと併用されることが多いです。

#set figure(supplement: "図")

#figure(
  image("./figure/nuko.png", width: 40%),
  caption: [にゃ~ん]
)

#set figure(supplement: "表")

#figure(
  table(
    columns: 4,
    [t], [1], [2], [3],
    [y], [0.3s], [0.4s], [0.8s],
  ),
  caption: [Timing results],
)

図と表で別々のsupplementを設定しつつ、カウントも分けたい場合は独自でfigure関数のラッパーを作るとよいでしょう。Tom Python さんの記事が良い実装例となっていたので、リンクさせていただきます。

https://zenn.dev/chantakan/articles/ed80950004d145#3.5-図や表の作成

参考

https://typst.app/docs/reference/

Discussion