Typstのナンバリング完全攻略
Typstのナンバリングについて詳しく解説します。
ナンバリングとは
Typstにおけるナンバリング(numbering)とは、文書内の項目やセクションに番号をつけることができる機能のことです。
例えば、次のようなTypstのコードを書くと、
#set heading(numbering: "1.")
= タイトル1
・・・
= タイトル2
・・・
= タイトル3
・・・
= タイトル4
・・・
次の画像のように、自動で 1. 2. と番号が振られていることがわかります。

このように、一々 1. 2. と打たなくても自動で番号を振ってくれる機能がナンバリングです。
ナンバリングの設定の仕方
Typstでは、ナンバリングは見出し(#heading)、ページ(#page)など、様々な要素について設定することができます。
ナンバリングを使用するには、これらの関数(#heading, #page, ...)のnumberingパラメーターに特殊な文字列(=ナンバリングパターン[1])を設定する必要があります。
ナンバリングパターン
ナンバリングパターンは、文字列を指定してナンバリングの形式を設定するものです。
文字列に1を含めて書くと、ナンバリングとして1, 2, 3 ...と展開されていきます。
例えば、
#set heading(numbering: "1)")
= 見出し1
= 見出し2
= 見出し3

のように、1), 2), 3)と表示されていきます。
このとき、1だけでなく、他にもさまざまな特殊な文字を使用できます。
これらの特殊な文字をカウントシンボル[2]と呼びます。
以下がその主な一覧[3]です。
| 文字 | 意味 | ナンバリングの例 |
|---|---|---|
| 1 | アラビア数字 |
1, 2, 3 ... |
| a | アルファベット(小文字) |
a, b, c ... |
| A | アルファベット(大文字) |
A, B, C ... |
| I | ローマ数字(大文字) |
I, Ⅱ, Ⅲ ... |
| ⅰ | ローマ数字(小文字) |
ⅰ, ⅱ, ⅲ ... |
| 一 | 漢数字 |
一, 二, 三 ... |
| 壹 | 大字、難しい漢数字[4] |
壹, 贰, 叁 ... |
| あ | ひらがな |
あ, い, う ... |
| ア | カタカナ |
ア、イ、ウ、 |
| い | いろは歌(ひらがな) |
い, ろ, は ... |
| イ | いろは歌(カタカナ) |
イ, ロ, ハ ... |
| ① | 丸数字 |
①, ②, ③ ... |
| * | 節記号 |
*, †, ‡, §, ¶, ‖ ... |
見出しに対してナンバリングを適用するときに、2つ以上のカウントシンボルを指定すると、見出しのレベルと連動して1.1.のように指定されます。
#set heading(numbering: "1.1.")
= 見出し1
= 見出し2
== 小見出し1
== 小見出し2
= 見出し3

また、ページに対してナンバリングを適用するときに、2つのカウントシンボルを指定すると、2つ目のカウントシンボルが、そのページ数の合計となります。
#set page(numbering: "1 of 1")
// 4ページに分けてみる
ページ1
#pagebreak()
ページ2
#pagebreak()
ページ3
#pagebreak()
ページ4

複雑なナンバリングを使う
下の例のように、見出しのレベルによってナンバリングを変えたいときがあります。
- (I)~する方法
- 手順1 ◯◯する
- 手順2 △△する
- (II)~する方法
- 手順1 □□する
- 手順2 ✕✕する
このとき、以下のような複雑な関数をnumberingオプションに渡すことで実現できます。
#set heading(
numbering: (..nums) => {
let level = nums.pos()
if level.len() == 1 {
return numbering("(I) ", ..level)
} else if level.len() == 2 {
return "手順" + numbering("1 ", level.last())
}
},
)
しかしこれはとてもわかりにくいです。
そこで、numblyというパッケージを用いることで簡単に書くことができます。
#import "@preview/numbly:0.1.0": numbly
#set heading(
numbering: numbly(
// {<レベル>:<ナンバリングパターン>}と書いてレベルごとのナンバリングを指定できます。
"({1:I})",
"手順{2:1} ",
),
)
= ~する方法
== ◯◯する
== △△する
= ~する方法
== □□する
== ✕✕する

【おまけ】独自の関数でナンバリングを使う

上の画像のようなナンバリングを持つ穴埋めをTypstを作りたいとします。
その場合も、Typstのナンバリングとカウンターを使用して作成できます。
// 新しいカウンターを作る
#let number-box-counter = counter("number-box")
// カウンターの初期値は1
#{ number-box-counter.update(1) }
#let number-box = () => context {
// カウンターを更新する(+1する)
number-box-counter.update(n => n + 1)
highlight(
stroke: black,
fill: none,
radius: 0pt,
// カウンターを表示、ここでナンバリングパターンを使う
number-box-counter.display(" (1) "),
)
}
// #number-box()を呼び出してブロックを作る
日本国民は、正当に選挙された国会における#number-box()を通じて行動し、
われらとわれらの子孫のために、諸国民との協和による成果と、
わが国全土にわたって自由のもたらす恵沢を確保し、政府の行為によつて再び#number-box()の惨禍が起ることのないようにすることを決意し、
ここに主権が国民に存することを宣言し、この憲法を確定する。
counterについて
ここでナンバリングの重要な要素であるカウンターについて補足しておきます。
カウンターは呼び出される度に番号が上がっていく機能です。
| counterのメソッド | 意味 |
|---|---|
counter("id") |
idを持ったカウンターを作成します。idを用いて他のカウンターと区別することができます。カウンターの初期値は0です。 |
counter.update(1) |
カウンターの値を更新します。この場合、カウンターの番号は1になります。 |
counter.update(n => n + 1) |
カウンターの値を更新します。関数を渡すこともできます。この場合、現在のカウンターの番号に+1します。 |
counter.display() |
カウンターの番号を表示します。Typstのテキストとしてそのまま表示できます。 |
counter.display("(1)") |
カウンターの番号をナンバリングパターンを用いて表示します。 |
counter.get() |
カウンターの番号を数値として取得します。カウンターの番号を使って何か計算したいときなどに便利です。ただし、そのままTypstのテキストとして表示することはできません。 |
最後に
Twitterやってます @reyalka_dev
Discussion