やりたいことから始めるTypst

# はじめに

この記事はTypstの初心者向け解説です．
すでにマニュアルは複数ありますが，typst.appを用いた解説は筆者の知る限り日本語では存在しません(2024/5/29現在)．

プログラミングもよく知らない人にも扱えるように書いたつもりです．


Typstで作ったpdf版は以下にあります

https://www.dropbox.com/scl/fi/dz8s2hgp0amouck2apboe/Typst_start.pdf?rlkey=sxr40yzonwuily952jqweaov4&st=0a6zlk55&dl=0

# Typstを始めたい

https://typst.app/ にアクセスして，sign upをしてください．メールは実際のメールアドレスであればなんでもOKです．名前もなんでも良いです．select where you heard about Typstはクリックして適当なものを，TelemetryはEnabledをクリックして左下のSign upをしてください．



![typst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/8fab1781-2cbf-403a-9c4b-2b7f79a1c10b.png)

なお，internet exploreではうまくいかないようなので，chromeなどでやってください.それでもうまくいかないときはキャッシュやクッキーを削除したりテキトーにブラウザを変えたり，ゲストで行くとうまくいく場合があります．（「キャッシュやクッキーを削除」の意味がわからない人はそう検索してください）

サインアップに成功すると以下のようなメニューが出ますので Empty documentを選んでください.

![typst2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/17ece62d-fd2d-5084-8e61-6920df071222.png)


すると以下のようなメニューがでますのでプロジェクト名を適当に決めてください．なんでも良いです.

![menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/b67fa11d-7cd4-b2e8-a3cb-2c5dc14d5f48.png)

すると，以下のような画面が出ます.

![document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/8b398fdc-39b2-667c-add8-aa55f292301d.png)



# 文章を書きたい
以下のように左側の部分に適当に文字を打ってみましょう．それは右側にそのまま現れるはずです．

![docu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/e804ee5d-ef44-ef56-6902-b9dfeb8a87d2.png)


左側が，どんな文章を書くかの命令をする部分で，右側が命令をした結果の部分です．このようにTypstはプログラミングをするかのように文章を作成できます．それの何が便利なのかは以下を見ていってください．

# 見出しを書きたい

次のように打ってみてください，見出しが現れます．
```typst
= 見出し
```

`=`の数を増やすと見出しが細かくなります．以下のようにしてみましょう．
```typst
== 小見出し
```

ところで見出しに番号がありません．そんなときは
```typst
#set heading(numbering: "1.1.")
```
と打ってみましょう．そうするとこの文章のように，見出しに1.と番号がつきます．

番号の種類はいろいろあります．例えば以下のようにしてみましょう
```typst
#set heading(numbering: "I.i.")
```
そうすると，見出しの番号がローマ数字になります．

ちなみに以下のようにすると見出しのフォントを変えられます

```typst
#show heading: set text(font: "Harano Aji Gothic")
```


# 箇条書きをしたい

箇条書きをするには`-`と打って，スペースを押してください．例えば以下のようなコードを書いてみましょう．
```typst
- こんなふうに箇条書きになるはずです.
- 箇条書きを並べていきます
  - タブキーを押して，-の前にスペースを入れると箇条書きのレベルが下がります．
```
すると出力は次のようになります．

![スクリーンショット 2024-05-29 12.19.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/02adde43-cd46-8889-ca7f-8a48b2922b60.png)


+ `-`の代わりに`+`を使うと番号のついた箇条書きを作成できます．
  + 番号のついていない箇条書きと同様にレベルが一つ下がります．
+ 箇条書きの番号を変更するには以下のようにします
  ```typst
  #set enum(numbering:"1.a.")
  ```
#set enum(numbering:"1.a.")
+ すると，レベル２以降の箇条書きがアルファベットになります
  + 注意したいのは，プログラミングは上から下に読んでいくので，設定は`#set 〜`と書いた以降の行から反映されます.
+ ところで，何か文字を打ってから行を一つ空けてしまうと，番号は数え直しになります．　

+ 途中から番号を数えたい時は`#set enum(start: 4)`とすると，途中の番号から数えてくれます．


箇条書きは以下のように書くこともできます．

```typst
#set enum(start: 1)
#enum([第１項目],
      [第二項目],
      [サブ項目 
          #enum([第a項目],
                [第b項目]
                )],
      [第４項目]
      )
```
![スクリーンショット 2024-05-29 12.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/d5e9a1fb-816b-bf5d-16b1-7fdcdfcafd4e.png)

# 文字を中央に置きたい

普通に文字を書いていると，文章は左から始まります．しかし，タイトルは中央に置きたいでしょう．そんなときは，以下のようにします．
```typst
#align(center)[タイトル]
```
こうすることで，[]の中の文章を中央に配置することができます．ちなみにcenterをleftやrightに変えるとどうなるかやってみてください．

# 数式を書きたい．
`$$`で囲んだ領域は「数式モード」になります．
たとえば， $f'(x)=x^3$という出力をするには `f'(x)=x^3`と入力します．

## インライン数式とディスプレイ数式
数式には「文中数式(インライン数式)」と「ディスプレイ数式」というものがあり，例えば文中に出てくる$x_2$というのが文中数式です. 入力は以下のようにします

```typst
例えば文中に出てくる$x_2$というのが文中数式です.
```

一方でディスプレイ数式は，文章とは独立の段落で描かれる数式で，以下のようなものです．

![スクリーンショット 2024-05-29 12.21.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/b25e0945-c1e7-6c08-8fd6-553a968c5c28.png)

これは以下のように書きます．
```typst
$
integral_0^1 x f(x) dif x
$
```
`$`と`$`の間にスペースを入れるか，改行を行うとディスプレイ数式扱いとなります.

以下は主な数式の例をリストアップしています．

![スクリーンショット 2024-05-29 12.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/c6dbf355-65e3-5520-0864-144f259aff95.png)

使用できる記号は以下のサイトで手書きで検索できます．
https://detypify.quarticcat.com/


## 数式に番号を振りたい
以下のようにすれば， set〜とした下の行から，数式に番号がつきます．

```typst
#set math.equation(numbering: "(1)")
$
x^2 = integral_0^x f(z)dif z
$
$
x^2 = sum_(z = 0)^x f(z)
$
```

これをすると，以下のようになります．
![スクリーンショット 2024-05-29 12.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/9fa11d3b-c617-cce3-bbb6-dc9d80432659.png)


## 数式を = の位置で揃えたい
以下のようにすれば，&のところで揃えられます．
```typst
$
f(x) &= x(x-1)\
     &= x^2-x
$
```
以下が出力です．
![スクリーンショット 2024-05-29 12.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/280c2d8c-251e-5ab3-022e-4cb7a4ba33a6.png)


## 数式フォントを変えたい

以下のようにします．
```typst
#show math.equation: set text(font:"フォント名")
```

以下では typst.app で使用できる数式フォントを紹介します.

![スクリーンショット 2024-06-03 14.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/31383b3e-65d1-b6ac-5f5c-3bd39d51f124.png)


## その他細かい注意
- $a\/b$ のように文中の分数にしたいときは `$a slash b$`あるいは `$a \/ b$`というようにします． `\`はエスケープ記号で，それを前につけることで特殊機能の記号をそのまま出力します．
- `$colon$`と書いても`$:$`と書いてもスペースは変わりません． 一方で集合差を書くときは `$X without Y$`とします．これは `$X backslash Y$`と若干違います．
- 条件付き確率のように$P(x \mathrel{|} y)$と書きたいときは`$P(x | y)$`のように|の周りにスペースを開けるだけでOKです． $P\left(\sum \middle| \frac{y}{x}\right)$というようにしたい場合は`$P(sum mid(|) y/x)$`とします．
- 数式モードの外で数式を使いたいときは，例えば ```#math.alpha```のように`#math.`を数式命令につけます．
- その他記号を探すときにはdetexifyのtypstバージョンである https://detypify.quarticcat.com/ が便利です．

- より詳細は次のページをご覧ください． https://typst.app/docs/reference/math/  referenceには次の項目があります．
  - Accent
  - Attach
  - Cancel
  - Cases
  - Class
  - Equation
  - Fraction
  - Left/Right
  - Matrix
  - Primes
  - Roots
  - Sizes
  - Styles
  - Text Operator
  - Under/Over
  - Variants
  - Vector


# 表を書きたい

表を作るには以下のようにします.
```typst
#table(columns: 2,
  [A],[B],
  [C],[D])
```
すると次のような表を作ることができます．

![スクリーンショット 2024-05-29 12.23.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/6826b36e-2526-f167-bc98-e593b7ec5ba9.png)

  
`columns: 2`というので列の数を指定しています．このcolumnsにそれぞれの列の長さを指定することで，表の列の長さを指定できます．
例えば次のようにしてみましょう.


```typst
#table(columns: (2em, 1fr),
  [A],[B],
  [C],[D])
```
すると次の表が書けます．

![スクリーンショット 2024-05-29 12.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/feb2bf49-28e0-2549-d20c-58f5be92cff9.png)


 これは1列目を#{2em}という長さ（#{1em}はmの横幅です），２列目をページの横幅いっぱいまで伸ばすという意味になります．#{1fr}を複数の列で使えば，長さは均等割されます．以下がその例です．
 ```typst
#table(columns: (2em, 1fr, 1fr),
  [A],[B],[d],
  [C],[D],[z])
```
すると次の表が書けます．

![スクリーンショット 2024-05-29 12.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/e81b07f7-d5df-ebc3-c944-f46d98b5b6f8.png)


 

 表はかなり自由にカスタマイズできるので，より詳しくは本家の解説を見てください．
 https://typst.app/docs/guides/table-guide/
  
# 太字や斜体にしたい

**太字**にするには`*太字*`とします． 斜体は`_斜体_`とします．

# 文字の大きさやフォントを変えたい

文字の大きさを変えるには`#text(size:12pt)[12ptの文字]`とすると文字の大きさを変えることができます.大きい文字にしたい時はそのように変えてください．

フォントを変えるには以下のように書いてみましょう.
````typst
#set text(font: "Harano Aji Mincho")
````
この行を書いた下の行からフォントが原ノ味明朝体というフォントに変わります．フォントは好きなフォントをアップロードして上のように書けば変えることができます．





# 文字の色を変えたい

文字の色を変えるには `#text(fill: rgb("#4169e1"))[カラー]`とやってみましょう.どんな色が出るのかをみてみてください．
rgbは色を指定するコードです．どの色がどのコードに対応しているかはたとえば以下のサイトで調べられます. 

https://www.colordic.org/

red,blue,greenなどの以下にある色は，rgbと書かなくてもそのまま指定できます.

![color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/ac0b0d95-b457-ada7-9e6b-6a8078e39589.png)


# 下線を引きたい

下線を引くには`#underline[下線を引く]`とします．

# 脚注を作りたい
以下のようにしてみましょう

```typst
これが脚注#footnote[脚注の中身]
```




# リンクを張りたい

リンクを張るには次のようにします.
```typst
#link("Webページのurl")[表示する文字]
```

例えば以下のページのリンクを張ってみましょう

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

リンクのフォントを変更するには次のようにします．例えば以下の例は色を変更しています．

```typst
#show link: set text(fill: blue)
```

# 段落の最初を字下げしたい

この文章を見てみると，段落の字下げがされていません．これは気持ち悪いという人は以下のようにしてみてください
```typst
#set par(first-line-indent: 1em)
```




ちなみに見出し直後の最初の段落は字下げされませんがこれはバグだそうです．

par というのはパラグラフ（段落）のことでこれをカスタマイズする設定です.



# 既存の関数をカスタマイズしたい

既存の関数だと気に入らない場合は次のようにしてみましょう．例えば，*太字*のフォントが気に入らないとします．そんなときは次のようにしてみましょう．
```typst
#show strong: it => text(font: "Harano Aji Gothic")[#it]
```

**変わりましたか？** ちなみにこうするとこの行以降は全部変わってしまうので注意してください．

# ページ番号をつけたい/余白を設定したい

ページ番号をつけるには，以下のようにします．そうすると，書いた次のページからページ番号がつきます. （ページが変わることに注意!）
```typst
#set page(numbering: "1")
```


こうするとページが変わってしまうので，この命令は一番最初に書くのが吉です．

ページの余白を設定するには，次のようにしましょう．カッコの数に注意してください．
```typst
#set page(margin: (top: 1.5cm, bottom: 1.5cm,left:1.5cm,right:1.5cm))
```


やはりページが変わってしまいますが，余白は変更されます．

なお，手動でページを改めるには`#pagebreak()`と打ちます.

# 目次を書きたい

`#outline()`とタイプすることで目次を表示できます．
次のように引数を適宜調整すると見た目が変わります．
```typst
#outline(title: "目次",depth: 1)
```





# 省略したい

`#let`をつかうと自作の関数を作ることができます．例えば，文字を赤くしたいが，毎回textなんちゃらと書くのは面倒だというときはこうしましょう
````typst
#let aka(body) = {text(fill: red)[#body]}
#aka[あか]
````
ここの`aka`が関数の名前で，他と被らなければこれは別になんでも良いです．日本語っぽいものの方が他と被らないのでそうする利点はあります（ただし他の人が見ると分かりにくい!）．
`body`の部分は関数の[]で括った部分に対応します．

また，長々しい文章を`#let`をつかって省略することができます．
以下でやってみましょう
````typst
#let juge = {"寿限無　寿限無　五劫のすりきれ　海砂利水魚の水行末雲来末　風来末食う寝るところに住むところ　やぶらこうじのぶらこうじ　パイポパイポ　パイポのシューリンガン　シューリンガンのグーリンダイ　グーリンダイのポンポコピーのポンポコナーの長久命の長助"}
#juge が転んで怪我をしただって？ #juge は絆創膏が欲しいって．　#juge はどこにいるんだ？ #juge は庭先にいるよ．　#juge を呼んできてくれ． #juge はもう血は止まったって．
````

# 自作の関数を作りたい

ある程度の機能は自分で実装することができます．たとえば，数式に番号をつけたり外したりしたい時があるとしましょう．この場合つけたい時には
```typst
#set math.equation(numbering:"(1)") 
```
つけたくない時には
```typst
#set math.equation(numbering:none) 
```
とすればいいわけですが，これは面倒ですので，例えば次のようにしてみます．

```typst
#let eq_no(equation) = {
set math.equation(numbering: none) 
equation
}
#eq_no[$
x^2-x=x(x-1)
$]
$
x^3-x^2=x^2(x-1)
$
```



# 文字を入れ替えたい

以下の文章を書いてみましょう．打った文章と右側に出てきた文章でどう違うか比べてみましょう．

````typst
#show "ラーメン": "青汁"  
#show "悪い": "良い"
ラーメンはとても健康に悪い
````

# コメントアウトしたい

`//`と打った後の文字列は灰色になり，その文字列は表示されません．これは「コメントアウト」という機能です．実際の文章には反映させませんが，どうやるかのメモとして残しておくのに便利です．


# 画像を挿入したい
以下の図のような左上のボタンを押すと，このプロジェクトのフォルダが開きます
![folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/99b95b63-4d49-b001-4900-386de01b4863.png)

そこに，画像ファイルをドラッグ&ドロップして， `#image("ファイルの名前")`とすれば画像を挿入できます．


[動画]もあるよ. https://www.dropbox.com/scl/fi/ylnf0ulhdljnlatkn97d4/.mov?rlkey=5ej7uhd4rc9ma05yp30ovuffj&dl=0

画像を開いちゃって，元の画面に戻れないという人は main.typ というのをクリックしてください．

# 参照したい

見出し，図，式，脚注は「参照」できます．例えば次のようにしてみましょう．

```typst
#figure( 
image("folder.png")
,caption:[フォルダの図]
)<folder>

#figure(
table(columns: 2, [あ],[お]),
caption: []
)<50on>

$
integral_0^1 f(x)dif x
$<siki>

脚注を参照する．#footnote[参照される脚注]<footnote>

@folder と @50on と @siki と　@footnote

```


これは数式番号や図表の番号が変わっても自動で更新されるので非常に便利です．
ただし，このままだと英語で日本語文書としてはイマイチなので参照をカスタマイズしてみましょう．詳しくは https://typst.app/docs/reference/model/ref/ をみていただくことにして，次のようにしてみます．

```typst
//図のラベルを置き換える
#show figure.where(kind:image): set figure(supplement: "図")
//表のラベルを置き換える
#show figure.where(kind:table): set figure(supplement: "表")
//その他の参照の設定
#show ref: it => {
  let eq = math.equation
  let el = it.element
  if el != none and el.func() == eq {
    // 数式の参照を書き換える．
    link(el.location())[
      #set text(fill:text.fill)
      #numbering(
      el.numbering,
      ..counter(eq).at(el.location())
    )]
  }
  else if el != none and el.func() == footnote {
    link(el.location())[
      //footnoteの参照を書き換える
      #set text(fill:text.fill)
      脚注#numbering(el.numbering,..counter(footnote).at(el.location()))]
  } else if el != none and el.func() == heading{
    //headingの参照を書き換える.
    link(el.location())[
      #set text(fill:text.fill)
      第#numbering(el.numbering,..counter(heading).at(el.location()))節]
  } else {it} 
```


# ダウンロードしたい
右上端にある以下のボタンのうち， [↓] のようなボタンを押すとpdfがダウンロードできます．Backupでこのプロジェクトをバックアップします.

![down.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/e802dff8-f46a-9f85-cda1-8ec40b3011b9.png)


# 拡張機能を使いたい

typstは素の機能以外に，第３者が作った*パッケージ*という拡張機能を使うことができます．どのようなものがあるのかは以下のサイトを見てみてください．
https://typst.app/universe/

よく使われるものには以下のようなものがあります．詳しくはそれぞれの解説ページを見てください．

* [cetz] コードで図を描けます． https://typst.app/universe/package/cetz/
* [polylux] プレゼンスライドを作る機能です． https://typst.app/universe/package/polylux/
* [physica] 物理・数学でよく使われる記号を拡張します． https://typst.app/universe/package/physica
* [pyrunner] Pythonコードを実行します https://typst.app/universe/package/pyrunner
* [lemmify] 定理環境を作ります． https://typst.app/universe/package/lemmify
* [rexllent] エクセルの表を取り込みます https://typst.app/universe/package/rexllent

## 他人の作った機能を使いたい

世の中には親切な人がいて，便利機能を実装してくれる人がいます．もし公式のパッケージになっていれば，上のようにすれば良いのですが，そうでない場合には， 〜.typというファイルの形で流布している場合があります．その場合はそのファイルをフォルダーに入れ，以下のようにします.
```typst
#import "ファイル名.typ": * 
```



# コードを書きたい
例えばpythonのコードを書くには次のようにします．
![code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/d79a4934-33dc-612e-62b8-06817d4ff843.png)

[^KEY]: 構文の色付けや行番号などをつけるには[codly]https://typst.app/universe/package/codly というパッケージが有用です．

これは次のように表示されます[^KEY]．
```python
n = 10
for i in range(n):
  i = i + 1
  print(i)
```

# 参考文献を書きたい

参考文献にはBiBTeXが利用できます．
詳細は公式の以下の解説を見てください．

https://typst.app/docs/reference/model/bibliography/
https://typst.app/docs/reference/model/cite/ 

BiBTeXを使わず直書きする場合は例えば以下の記事を参照してください．

https://zrbabbler.hatenablog.com/entry/2024/05/06/180901


# 設定がめんどいので楽したい

いろいろとテンプレートがありますので探してみましょう．私の自作は以下のリンクから利用できます．

https://typst.app/project/r3GVChhUil4_mwHCstXr6C: 日本語ドキュメント

https://typst.app/project/rvtZWoJrM--8T-FKkOl04Z: スライド


使い方は以下の通り：
1. リンクをクリックしましょう
1. < のようなボタンをクリックしましょう（下記の画像参照） 
![back_button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/2e1117d8-f1a1-c933-c841-b9ca8e02c4a0.png)
1. そうすると下記の画像のようなものが下に現れるので，マウスをそこに持っていって，□が二つ重なったボタンをクリックしましょう． ![share_button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/5e5a214a-ee6d-e158-9d34-e3b3fc8877b0.png)
1. 最後に下記のメニューが出てくるので，Project nameを適当に設定し， Createボタンを押しましょう
 ![dup_menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787163/7124c0b7-edeb-eb3a-5f56-2971fe00e27c.png)

# 便利なサイトを知りたい

1. 記号検索： https://detypify.quarticcat.com/
1. 公式パッケージ・テンプレート： https://typst.app/universe


# もっと知りたい

referenceを読みましょう. 新しい言語なので日本語の説明があまり見当たりません 
https://typst.app/docs/reference/