VScode上でTypstを利用してレポートを作成するテンプレート

# まえがき
　皆さんは新興組版エディタ「Typst」をご存知でしょうか。理系の学生が数式を含むレポートやスライドを作ろうとした時まず触るであろうエディタといえば偉大なる「LaTeX」（以下単にTeXと表記）様が一般的でしょうが、TeXは普段Wordなどを使っている人間からすると少しとっつきにくいと感じるような仕様を抱えています。また、TeXの開発自体がかなり前なこともあって技術的にも問題点を残しているエディタであるというのは事実です。

　そこで近年話題となっているのが、新興組版エディタ「Typst」です。こいつはその「動作の軽さ」と「記法の簡略さ」が売りの新しいエディタで、TeXでできることは大体できるという魅力的な代物です。しかしながらまだ新しいものであることも相まって日本語の記事の数も少なく（最近増えてきていますが）、使用している人も少ないのが現状。ということで今回は、Typstの環境をサクッとVScodeで揃えて、実際にレポート作成で使えるようにしてみようという趣旨で記事を書かせていただこうと思います。この記事の内容が、悩める理系の方々の一助となれば幸いです。

 　なお先に注意点なのですが、本記事に於いてTypstの基本的な記法についてはそこまで扱いません。というのも、TeXでの記法とTypstの記法を比較したような日本語記事はもうすでにたくさんあり、また[公式からの説明書](https://typst.app/docs/)もかなり使いやすいので、わざわざ私が触れるよりもそういったものを参照して頂いたほうがわかりやすいと感じたためです。
  本記事の目的はあくまで、「レポート作成用のテンプレートの提供とおすすめのパッケージの紹介」にとどまることをご留意ください。

（※　本記事は[物工/計数 Advent Calendar 2023](https://adventar.org/calendars/9604)の7日目の記事になります。）

# 目次
- そもそもTypstって？
- TypstをVScode上で動作させる
- Typstでのレポート作成のページ設定
- おすすめPackageの紹介
- Packageの読み込み設定

# そもそもTypstって？
　具体的な内容に入っていく前に、まずは軽くTypstについて紹介しておきます。TypstはLaTeXに継ぐ理系論文やレポート執筆に特化した組版エディタで、TeXでできることは代替できるエディタと思ってもらえれば結構です。具体的なLaTeXと比較した際の利点・欠点は以下のようになります。
#### 利点
- とにかく**コンパイルが爆速**なので、リアルタイムコンパアイル（つまり文字を打った瞬間にPDFに反映させる）ができる。
- TeXの “\” のかわりに “#” を利用してコマンドを打つような記法の他にMarkdown記法のような**略記が可能である**のでなれると早い。
- 環境構築が非常に楽で、初心者でもわかりやすい。
- 公式のmanualがしっかりしていてほとんどそれで解決する。
#### 欠点
- まだ新興なこともあり中国語と英語の記事がほとんどである。
- コマンドがいらない分「半角スペース」で文字を区切ることが重要な役割を果たすためなれるまで少し書きにくい。
- 自分でマクロを作成したりする時の動作がよくわからない（単に私の頭が弱いだけかも）。

という具合です。

　特にコマンド周りについてはかなり特殊で、例えば
 ```math
{\cal H} = - \frac\hbar{2m} \frac{{\mathrm d}^2}{{{\mathrm d}x}^2} + \frac12 m\omega^2x^2
 ```
 なんていう式を書きたい時、LaTeX（Physics Packageを導入している時）なら
 ```tex
 \[{\cal H} = -\frac\hbar{2m} \dv[2]{x} + \frac12 m\omega^2x^2\]
 ```
 なんて書くかと思いますが、Typst（Physica Packageを導入しているとき）であれば

 ```
 $ cal(H) = - hbar/(2m) dv(,x,2) + 1/2m omega^2x^2 $
 ```

 というふうに書きます。詳しくは話しませんが、Typstの数式環境は
- ひと繋がりになった英字列をコマンドとして認識する
- {}のかわりに()を用いる
- ()の大きさは自動で調節される

などの特徴があります。そのため、先に挙げた欠点のように例えば$a_{vac}$みたいに書きたければ`a_(v a c)`と間にスペースを挟む必要がありちょっとクセがあります。

　ですがそれを差し置いてもとにかく **†爆速コンパイル†** という利点があまりにも大きいのであまり気にならないです。

　ちなみに、数式で用いる記号のうちよく用いるものには略記が可能で、例えば$\infty$を出力するには`oo`でいけたり、$\geq$が`>=`でイケたりします。詳細は公式のDocumentationの[ここ](https://typst.app/docs/reference/symbols/sym/)にあるので御覧ください（各記号の出力方法がクリックするとわかります。基本は書いてある名前をそのままタイプすればおｋ。）。



 # TypstをVScode上で動作させる

 　Typstは公式からオンラインのエディタ([これ](https://typst.app/))がでているのですが、ローカルで動かしたほうが安定する気がするのとコマンド補完機能などを使い倒したいということからVScodeに導入していきます。

　まずはTypst自体の拡張機能を導入していきましょう。VScodeの拡張機能検索タブで「Typst LSP」「Typst Preview」を検索してインストールします。**これでほぼ完了です。**
Typstのファイルの拡張子は “.typ” なので適当なディレクトリを開いて「新規ファイルを作成」から「（任意の名前）.typ」を作成して開いてみましょう。次に`cmd + shift + P`で「Typst Preview」にカーソルを合わせて`enter`で実行をします。右半分のタブに白い紙がでてきたら問題がないでしょう。試しにいろいろ入力してみましょう。リアルタイムで右半分に編集した内容が反映されているようなら平気です[^1]。

　次にpdf形式で書き出す方法についてですが、Typst LSPはデフォルトの設定で`cmd + S`したときに自動でpdfも保存される様になっているので.typを保存するだけで問題ありません。

[^1]:おそらく日本語のフォントが反映されていなかったりするかもしれませんが、解決方法はこれから提示します。また、偶に右側に表示される文字と実際に入力している文字が対応しなくなったりしますが、一旦「Typst Preview」を閉じてから再起動すると治ります。

# Typstでのレポート作成のページ設定

　早速レポート作成に取り掛かりたいわけですが、今のままではフォントがバグっていたり用紙設定がダサかったりして使い物にならないかと思います。そのため、次のような手順でページ設定をいじっていきます。

 　まずはメインの .typ ファイルがあるディレクトリと同様の場所に「template.typ」というファイルを作成します。そこに以下のように書き込んでください。
```
#let project(title: (), authors: (), body) = {
  // Set the document's basic properties.
  set document(author: authors, title: title)
  set page(
    margin: (left: 15mm, right: 15mm, top: 15mm, bottom: 15mm),
    numbering: "1",
    number-align: center,
  )

// フォント周り
set text(font: "Hiragino Mincho Pro", size: 10pt, lang: "ja") // fontをいじりたいときはここを

  // タイトル周り
  align(center)[
    #block(text(weight: 700, 1.75em, title))
  ]

  // 筆者の情報
  pad(
    top: 0.5em,
    bottom: 0.5em,
    x: 2em,
    grid(
      columns: (1fr) * calc.min(3, authors.len()),
      gutter: 1em,
      ..authors.map(author => align(center, author)),
    ),
  )

  // メイン部分の設定
  set par(justify: true, leading: 0.75em,first-line-indent: 1em,)
  show: columns.with(1, gutter: 1.3em) // カラム数をいじりたいときはここを

// 箇条書きと別行立て数式の設定
set list(indent: 0.5em)
set enum(numbering: "(1)")
set math.equation(numbering: "(1)")
show ref: it => {
  let eq = math.equation
  let el = it.element
  if el != none and el.func() == eq {
    // Override equation references.
    numbering(
      el.numbering,
      ..counter(eq).at(el.location())
    ) 
    [式] 
  } else {

      it
  }
}

// 空白に関する設定
show regex("[\\P{latin}&&[[:^ascii:]]][\\p{latin}[[:ascii:]]]|[\\p{latin}[[:ascii:]]][\\P{latin}&&[[:^ascii:]]]") : it => {
    let a = it.text.match(regex("(.)(.)"))
    a.captures.at(0)+h(0.25em)+a.captures.at(1)
}

body
}
```
なお、私の環境がmacbookであるためフォント設定が` "Hiragino Mincho Pro" `となっていますが、任意のパソコン内に入っているフォントを指定することができるはずですので、windows環境の人は別のフォントを試してみてください。

　次に、このテンプレートをメインのファイルで読み込みます。`#import "template.typ":*`とメインの .typ ファイルの先頭に書き込んでみてください。このままだとエラーを吐くかと思いますが、以下の記述を追加してやると読み込めるはずです。
 ```
 #show: body => project(
    title:("") ,
    authors: ("",),
    body,
) // ""の間にタイトルと筆者を記入。複数著者の場合は("author1","author2",)とする。
 ```
　これでテンプレートの形式が読み込まれます。一旦これでレポート作成の上でのテンプレートが整うはずです。
 
　ここでこのテンプレートを用いる際の注意点が一つ。Typstでは`#pagebreak()`というコマンドで改ページを行うことができるのですが、このテンプレートでは全体がTeXのmulticols環境にあるような状態になっているため代用として`#colbreak()`を用いる事となります。ご注意を。


 # おすすめPackageの紹介
　このままでも十分に使えるわけですが、諸々を便利に使うためには様々なパッケージを読み込みたいところです。ということで個人的に有用だと思うパッケージを紹介しておきます。

 ## physica([github](https://github.com/Leedehai/typst-physics))
 　TeXの「Physics.sty」に対応するパッケージです。できることもほぼ一緒で、github上にあるマニュアルもかなり充実しているのでそちらを参照してください。


## algo([github](https://github.com/typst/packages/tree/main/packages/preview/algo/0.3.3))
　TeXの「listing」に対応するようなパッケージで、コードブロックを作成してソースコードを貼る事ができます。Typstのデフォルトにもそういった機能があるのですが見栄えが良くないのでこれを使うことをおすすめします。

## chic-hdr([github](https://github.com/typst/packages/tree/main/packages/preview/chic-hdr/0.3.0))
　TeXの「fancy hdr」に対応するパッケージで、簡単にヘッダーやフッターをいじることができます。

## ctheorems([github](https://github.com/typst/packages/tree/main/packages/preview/ctheorems/1.1.0))
　定理環境を提供してくれるパッケージです。とりあえず読み込んでいますが実は私も使ったことがありません。

## tbl([github](https://github.com/typst/packages/tree/main/packages/preview/tbl/0.0.4))
　表組みの拡張性と記法を大幅に改善してくれるパッケージです。Markdownの表組み時方が非常に似ているので、例えばExcelで作った表をTypstに読み込みたいときにMarkdown形式に変換するようなツールを使ってあげればレポートに表をはっつけるのも楽ちんです。僕が利用している表作成のテンプレートは以下のような感じです。

```
#figure(
  ```tbl
  L R.
  _
  
  _

  _
  ``` ,
  caption:[], // caption
  kind:table,
  supplement:[Table]
)
```

## metro([github](https://github.com/typst/packages/tree/main/packages/preview/metro/0.1.1))
　物理学の単位を表示したりしてくれるパッケージです。これも説明はmanualに投げます。

# Packageの読み込み設定
　以上に挙げたパッケージを読み込む設定をテンプレートを読み込む記述と合わせて以下に記しておきます。私と同じ設定でいい人は「Template.typ」をディレクトリに作成するのと一緒に以下の記述をメインのファイルの先頭に記載してやれば文章がかけるようになります。なお、読み込みに様々なカスタマイズを加えているのでお好みで調節してください。
 ```
 #import "template.typ":*
#import "@preview/algo:0.3.3": algo, i, d, comment, code
#import "@preview/chic-hdr:0.3.0": *
#import "@preview/ctheorems:1.0.0": *
#import "@preview/physica:0.8.1": *
#let grad = $ nabla$
#let div = $ nabla dot.c$
#let curl = $ nabla times$
#let dd(content) = $#h(0.1em) differential(content) #h(0.1em)$
#import "@preview/tbl:0.0.4"
#show: tbl.template.with(box: false, tab: "|")
#import "@preview/metro:0.1.0": *
#show figure.where(
  kind: table
): set figure.caption(position: top)

#set page(paper: "jis-b5")

#set heading(numbering: "1.")

#show: chic.with(
  chic-footer(
    center-side: chic-page-number() 
  ),
  chic-header(
    left-side: chic-heading-name(),
    // right-side: chic-page-number()
  ),
  chic-separator(0.5pt),
  chic-offset(7pt),
  chic-height(1.5cm)
)

#show: project.with(
   title:("") ,
   authors: ("",),
)
 ```

 みなさんもTypstでよいレポートライフを！！