Typstで簡単なテンプレートを作る

# はじめに

[Typst](https://typst.app/home/)では文書設定をしなくても，デフォルトの設定である程度のものが書けます．しかし，何かレポートを書いたり，論文を書いたりする際には，多くの設定が必要になります．そうでなくとも，日本語で何かを書くには少なからずフォントの設定が必要です．このような設定は，同じ形式の文章を書くときには同じ設定となるので，テンプレート化しておくと便利です．

この記事では，簡単なTypstのテンプレートを作るための要点をまとめます．

---

1. [テンプレートを置く階層](#1-テンプレートを置く階層)
1. [show関数を利用して設定を書き込む](#2-show関数を利用して設定を書き込む)
1. [設定項目](#3-設定項目)
    1. [言語の設定](#31-言語の設定)
    1. [ページの設定](#32-ページの設定)
    1. [フォントの設定](#33-フォントの設定)
    1. [行間の設定](#34-行間の設定)
    1. [章の設定](#35-章の設定)
    1. [インデントの設定](#36-インデントの設定)
    1. [数式の設定](#37-数式の設定)
    1. [figureの設定](#38-figureの設定)
1. [おわりに](#4-おわりに)

---

また，私が作成した [Typst用日本語テンプレート](https://github.com/tkrhsmt/jcls-typst) や [非公式の日本機械学会テンプレート](https://github.com/tkrhsmt/JSME-typst) もありますので，ぜひ積極的に使ってください！

# 1. テンプレートを置く階層

まず，テンプレート作る際に階層を決めておきます．テンプレートはメインのファイルと分けておくと便利ですので，この記事では，以下のようにしておきます．
```
.
├─ style
|  └─ style.typ
└─ main.typ
```
テンプレートファイル `style.typ` は，文章を書くファイル `main.typ` とは異なる階層 `style` などに入れておくと，きれいに整理できます．

Typstではファイルの読み込みを相対パスで行えます．`main.typ`の冒頭には次のファイル読み込み設定をしておきましょう．

```main.typ
#import "style/style.typ": *
```

上記では，ファイル名の後に `: *` としていますが，このようにすることで `style.typ` 内の全ての関数を一気に読み込むことができます．

# 2. show関数を利用して設定を書き込む

`style.typ` に設定を書くには，`#let` を利用します．
設定は最初に書き込みたいので，次のような関数を書きます．
```style.typ
#let init(body) = {
  ここの設定を書いていく...
  body
}
```
これは `init` という関数を作っています．`body` という引数がありますが，ここには `main.typ` で `init` 関数を呼び出した後の全てのものが入ります．特に操作をしない限りは，上記のように設定を書いた最後の行に `body` と書いておけば良いです．
関数の中身は{ }の中に書いていきます．
この括弧の中では`#`を使う必要はありません．

これを `main.typ` で呼ぶには，`#show`を利用します．
```main.typ
#show: init
```
このときに引数を設定する必要はないです．このように書けば，`init` の中に書いた設定が全て読み込まれるようになります．

このあとは，全て `init` 関数の中に書いていきます．

# 3. 設定項目

簡単なテンプレートを作るために，いくつか設定を書いていきます．設定は全て`init` 関数の中に書きます．

## 3.1 言語の設定

文書を日本語に設定するには，
```
set text(lang: "ja")
```
と書きます．
これで，目次や図表のキャプションが日本語になります．

設定前は
![スクリーンショット 2024-12-15 23.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/80661d49-8e82-fb24-55ef-e468cdb1dd0f.png)
と表示されますが，設定後は
![スクリーンショット 2024-12-15 23.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/3db9a952-56fd-1834-b81f-b80b35c716ed.png)

のようになります．


## 3.2 ページの設定

ページの設定をするには，
```
set page(
    paper:"a4",
    margin: (left: 25mm, right: 25mm, top: 30mm, bottom: 30mm),
    numbering: "1",
    number-align: center,
)
```
と書きます．
- `page`: 紙の大きさを設定します．ほとんどの場合A4だと思いますので，`"a4"`としておきます
- `margin`: 紙の余白を設定します
- `numbering`: ページ番号を設定します．`"1 / 1"`のように書けば，全体ページ数も表示できるようです
- `number-align`: ページ番号の位置です

他にもたくさん設定項目があるので，必要に応じて[ページの設定](https://typst.app/docs/reference/layout/page)を参照してください．

上の場合，設定前は
![スクリーンショット 2024-12-15 23.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/e124e65f-6626-4bf8-54dd-cf7381df8078.png)
のように白紙が表示されているのに対し，設定すると
![スクリーンショット 2024-12-15 23.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/17136890-dae7-3a07-7e37-e5b1dd66dd4f.png)
となり，ページ番号が設定されていることがわかります．また，上記の例では見えていませんが，余白も設定されています．

## 3.3 フォントの設定

フォントは
```
set text(font: "Harano Aji Mincho")
```
のように設定します．`font`の引数はかなり自由度が高く，配列でも定義できるようです．
例えば
```
set text(font: ("CMU Serif", "Harano Aji Mincho"))
```
のようにすれば，CMU Serifにあるフォントが優先的に読み込まれ，ないフォントはHarano Aji Minchoから読み込まれます．これを使えば，あるていど英字と日本語を別のフォントにすることができます．

数式のフォントも次のように
```
show math.equation: set text(font: "Latin Modern Math")
```
と設定できます．

フォントは環境依存ですから，存在しないフォントを指定してしまう場合も考えられます．この場合，指定したフォントは無視されるようです．

上記のように設定を書き加えると，
![スクリーンショット 2024-12-15 23.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/e49bd522-1456-cd6c-3a9d-8703a3122901.png)
が
![スクリーンショット 2024-12-15 23.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/60f53324-da67-ce7d-e662-c5d11c707a0b.png)
のように日本語フォントが正しく設定されたことがわかります．

## 3.4 行間の設定

LaTeX と比較すると，Typstは若干行間が狭めに設定されているような感じがします．行間を設定するには
```
set par(leading: 1.0em)
```
のようにします．`em`はフォントサイズを基準にした倍率です．デフォルトは`0.65em`と少し狭めに設定されているようです．

設定前は
![スクリーンショット 2024-12-15 23.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/ab3bf12d-9578-0d1c-a9e3-fc24f144ee72.png)
のようになっていますが，設定すると
![スクリーンショット 2024-12-15 23.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/1cbe7cc3-b69e-864f-0270-a223d7bddac3.png)
のように行間が広がったことがわかります．

## 3.5 章の設定

Typstでは，章を`heading`で設定できます．
章の番号付けは
```
set heading(numbering: "1.")
```
などとすれば設定できます．
細かい設定は
```
show heading: it => [
    ここに設定を書いていく...
]
```
のなかで書きます．
このとき，headingに必要な情報は全て`it`の中に書かれています．例えば，
```
#counter(heading).display(it.numbering)
```
などと書けば章番号が出力されます．
> 時々，`it`の中に`numbering`が含まれないことがあります．
> このような場合には，条件分岐で
>```
>#if it.numbering != none{
>   counter(heading).display(it.numbering)
>}
>```
> というように設定しないとエラーが出てしまいます．

章の題名も`it`から
```
#it.body
```
と書いて取得できます．

上記のように設定すると，
![スクリーンショット 2024-12-15 23.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/3b770b56-5932-753f-0b5e-d3563196ea02.png)
が
![スクリーンショット 2024-12-15 23.41.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/a3716471-b16f-ead8-69dc-cde26978897a.png)
のように変更できます．
タイトルをゴシック体に変更したい時は，
```
show heading: it => [
    #set text(font: "Harano Aji Gothic")
]
```
などとすれば，
![スクリーンショット 2024-12-15 23.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/f6b2098c-6fd8-bfe8-f18e-cc64803da10e.png)
と変更できます．

## 3.6 インデントの設定

Typstでもパラグラフの最初をインデントを設定できます．これは
```
set par(first-line-indent: 1em)
```
とすれば１文字分のインデントが設定されます．

## 3.7 数式の設定

数式は，ブロック形式と文章中の形式で異なる設定ができます．例えば，ブロック形式の数式のみ設定したい場合は，
```
show math.equation.where(block: true): it => {
    ここに設定を書いていく...
}
```
とします．例えば，数式を左揃えにしたい場合は
```
show math.equation.where(block: true): set align(left)
```
などとします．

日本機械学会の場合，数式は左揃えで空白を２文字空けることが求められています．このような場合は，`grid`を使って
```
show math.equation.where(block: true): it => {
    set align(left)
    grid(
        columns: (2em, auto),
        [],it
    )
}
```
とすれば設定できました．

実際に書いてみると，設定前は
![スクリーンショット 2024-12-15 23.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/c48fd744-f86f-6503-1b22-87428abe63fd.png)
のように数式は中央に表示されますが，設定することで
![スクリーンショット 2024-12-15 23.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/f79c4f46-9e0f-cef3-1342-f6b11ff736ed.png)
のように位置を変更できます．

## 3.8 figureの設定

Typstでは，表だけでなく図も`figure`環境を使います．これらは自動で判別され，`kind`に反映されます．表の設定を変えたい場合は，
```
show figure.where(kind: table): it => {
    ここに設定を書いていく...
}
```
とします．図の場合は`kind`を`image`とすれば設定できます．

例えば，表のキャプションを上に配置したい場合，
```
show figure.where(kind: table): set figure.caption(position: top)
```
などと書きます．

日本機械学会の場合，図や表のキャプションはTable 1, Fig. 2などと書きますが，文章中で引用する場合は表1や図2と表記します．これを再現するには，[特定の種類のrefだけsupplementを変える](https://qiita.com/Mya-Mya/items/23821078202e05c46738)を参考にして
```
// キャプションの設定
show figure.where(kind: table): set figure(supplement: "Table")
show figure.where(kind: image): set figure(supplement: "Fig. ")
// 引用の設定
set ref(supplement: it => {
    let body-func = it.body.func()
    if body-func == table{
        [表]
    }else if body-func == image{
        [図]
    }else{
        it.supplement
    }
})
```
とします．

設定前は，
![スクリーンショット 2024-12-15 23.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/d962cabf-5dac-287b-04e1-bab56c5c1e83.png)
のようになりますが，設定後は
![スクリーンショット 2024-12-15 23.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/33c78827-3170-8354-d5a0-c1c01227f10e.png)

のようになります．

# 4. おわりに

Typstの簡単なテンプレートを作る際に紹介しました．
この記事で紹介している例を利用すると，次のようなテンプレートができます．
![スクリーンショット 2024-12-16 1.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948286/f4775a0c-0412-a148-73f9-325c1648d79a.png)

スタイルファイルを読み込むだけで，簡単に設定できていることがわかります．

また，さらに詳細な設定をした [Typst用日本語テンプレート](https://github.com/tkrhsmt/jcls-typst) や [非公式の日本機械学会テンプレート](https://github.com/tkrhsmt/JSME-typst) もありますので，自由にご利用ください．