
CS三年春1前期にあったコンピュータ科学実験で,LaTeX (overleaf) によるレポート作成が推奨されていましたが,反旗を翻してTypstでレポートを作成しました. 結果として良好な成績が取れたので,皆さんにもおすすめできる,ということでTypstでレポートを作成するための手引を書いていきます. LaTeX一強のこの世界に一石を投じたい!!
前置き
なぜOverleafでは無いのか
我らが代表,すけさんの2025年5月14日のポストです.

そう,クラウドサービスは信用できない!!!!!
なぜLaTeXではないのか
overleafは使わないとして,だったらLaTeXでいいじゃんという声が聞こえてきます. しかし,否です!
- LaTeXの環境構築はちょー大変!!
- 平文が読みづらい.HTMLを読んでいるのと大差ないです.
なぜTypstなのか
- リアルタイムなレンダリング
- 記法がマークダウンチックでイケてる
- Rustのエコシステムで動くので,cargoからインストールできて,環境構築がちょー簡単
- モダンなリファレンス
- 明瞭なスクリプト記法
というわけで,Typstサイコーってわけです.
本編
1. Typstをインストールしよう
https://github.com/typst/typst ターミナルで次のワンライナーを実行するだけです.
- windows: winget install --id Typst.Typst
- mac: brew install typst
- linux: snapで入ります
cargo (rustのパッケージ管理ツール) が入っていればcargo install --locked typst-cliでOK.
2. (必要なら)フォントを用意しよう
https://typst.app/docs/reference/text/text/#parameters-font typest fontsで使えるフォントの一覧を確認します.目的のものがなければ追加しましょう. 例えばNotoSansJPとか. フォントをTypstに読み込ませるには
- 環境変数TYPST_FONT_PATHS を設定します.
- 1で設定したディレクトリの直下に.tffファイルを配置します.
以上.終わったらもう一度typest fonts で認識されていることを確認しましょう.
3. VSCodeに拡張機能を入れよう
“Tinymist Typst”という拡張機能をさがして入れましょう.
4. テンプレートをダウンロードしよう
私の方で実験レポート用のテンプレートを作成しました! ZIPでダウンロードしたり,cloneしたりして使ってください.
Typstの日本語向けの参考文献の表示形式はまだ未熟で,ちょっと変になってしまうことがありますが,bxbibwriteを使うことで参考文献の表示を直書きできるので,この問題を回避できます. 実験レポート用のテンプレートをgitでcloneした場合,
git submodule init
git submodule update
を実行すれば,bxbibwriteが使えるようになります👍
5. VSCodeでtypstのエントリーポイントを設定しよう
次の方法で設定できます
- main.typをVSCodeで開く
- Ctrl+Shift+Pでコマンドパレットを開く
- Typest: Pin the Main file to Opening Documentを探して実行 (Pinと入力すれば出ます)
以上です!チョーカンタン!!!!!
おまけ: テンプレートと基本的な記法の説明
ディレクトリ構成
実験レポート用のテンプレートは次のディレクトリ構成になっています
main.typ
commands.typ
asset/
function/
content/
main.typはTypstのエントリーポイントです. commands.typはfunction/ で定義したコマンドなどの定義を引き上げて各ファイルから簡単に参照・利用できるようにします.(具体的には,ファイルの先頭に#import "/commands.typ": *と書くだけ.) asset/ には画像や表紙のPDFを入れます. function/にはコマンドやスクリプトなど,文章の内容には直接関わらないリソースを配置します. content/には実際の内容を配置します.
基本的な記法
Typstでは以下の3つのモードを使い分けます.
- テキストモード
- スクリプトモード
- 数式モード
まっさらな状態では,typstは記入された文章をテキストモードで解釈します. テキストモードでは
普通に文字を書いたり,
= 見出しを作ったり,
== 小見出しを作ったり,
@ref リファレンスを作ったりできます.
バックスラッシュで改行\
空行を挿入するとパラグラフが別れます.
*太字*
_イタリック_
`コード`
``` バッククオートを含む場合はみっつの`で囲ってあげればOK ```
- 箇条書きも
- できます
+ プラスを使うと
+ 数字がつくよ
と言った感じで,markdown的に文章を書いていくことができます. テキストモードにおいて# はスクリプトモードに入る印です.たとえば,文書全体の設定をしたり
#set text(lang: "ja", font: "Noto Sans CJK JP")
#show figure: set block(breakable: true) // 図が大きい場合にページをまたぐことを許す
制御構文をつかったり
#for content in ("あ","い","う","え","お") {
content*2
}
文中で関数呼び出しをしたりできます.
#let em(content) = {
return text(red, content)
}
普通の文字の間に#em("赤い文字")を紛れ込ませよう.
ちなみに,{} で囲うと,行頭に#をつけずともスクリプトモードが継続します.(ブロックを形成します.)たとえば,
#let fib(limit) = {
let n = 0
let m = 1
while (m < limit) {
[#(n + m), ]
let t = m
m = n + m
n = t
}
}
#fib(10)
とすると,”1,2,3,5,8,13,” と表示されます.
スクリプトモードのときに[]で囲った部分はテキストモードで解釈されます(contentとなります). 上の例では,#(n + m),はテキストモードで解釈されていたわけです. 数式モードはテキストモードのときに$ を入れればOKです.$の隣にスペースを置くか否かでインラインかブロックかが変わります.たとえば,
これはインライン数式$exp(log 2)$
これは数式ブロック$ "Bin"(n, p), integral_0^infinity f(x)d x $
という感じです.
おまけ2: テンプレートに用意されているユーティリティ
init_context_numbering
スクリプトの挿入位置よりあとのページカウンタと見出しカウンタをいっぺんに設定します.
#show: doc => init_context_numbering(doc, "A.1", "i")
nonum
数式のナンバリングを行わない領域を作ります.
$ exp $ // ここはnumberingされる (1)
#nonum[
$ exp $ // ここはnumberingされない
]
$ exp $ // ここはnumberingされる (2) // 3ではない
three-line-table
見出しの上に一本,見出しと内容の間に一本,内容の下に一本の線がある表を出力します.
#three-line-table(
columns: 3,
[A], table.vline(), [B], [C],
[1], [x], [ ],
[2], [ ], [x],
)
tabfig
ナンバリングされた表を挿入します.
#tabfig(
3,
[A], table.vline(), [B], [C],
[1], [x], [ ],
[2], [ ], [x],
)[ここにキャプション]<referenceToTable>
codefig
ナンバリングされたソースコードを挿入します
#codefig[
```c
#include <stdio.h>
void main(void) {
printf("hello world");
return 0;
}
```
][ここにキャプション]<referenceToCode>
imgfig
ナンバリングされた図を挿入します.”/path/to/image”のルートはmain.typのあるディレクトリになります.
#imgfig("/path/to/image.png", width: 20em)[ここにキャプション]<referenceToImg>
scrfig
図を90度回転し,ページ幅いっぱいに広げて表示します.スクリーンショットを貼るときに便利.
#scrfig("/path/to/image.png", width: 20em)[ここにキャプション]<referenceToScreenshot>
おわりに
打倒LaTeX