SATySFi入門とリンク集

[SATySFi Advent Calendar 2020](https://adventar.org/calendars/4965) 12日目の記事です。
11日目の記事は、@na4zagin3さんの[SATySFi で「太字」にしたい（satysfi-fss の紹介）](https://qiita.com/na4zagin3/items/96a615d035189d4482d9)
13日目の記事は、amutakeさんの[2020年の docker-satysfi 振り返り](https://amutake.hatenablog.com/entry/2020/12/13/000000)です。

今回の記事は[@na4zagin3](https://twitter.com/na4zagin3)さんの[*nix 向け SATySFi インストールバトル手引き 2020年10月版](https://qiita.com/na4zagin3/items/a6e025c17ef991a4c923) を参考にさせていただきました。

# SATySFiとは?

[SATySFi](https://github.com/gfngfn/SATySFi)は、古く問題点の多いLaTeXを置き換える存在として現在[国際的に注目が集まりつつある](https://dev.to/hoffmann/lets-find-something-better-then-latex#comment-node-352510)組版システムであり、日本人の[@bd_gfngfn](https://twitter.com/bd_gfngfn)さんにより開発されています。

詳しくは以下の記事を参照。
[SATySFiに関すること](https://qiita.com/puripuri2100/items/a63e0c48f245dfcb0446)

# インストール

## OCamlのインストール

SATySFiはバイナリ形式では配布されていない[^1]ため、まず、OCamlの環境をインストールする必要があります。

```bash
$ pacman -S ocaml opam
```

[^1]: Dockerイメージはあります: [pandaman64/satysfi](https://hub.docker.com/r/pandaman64/satysfi)

## OPAMの外部リポジトリの追加

```bash
$ opam repository add --all-switches satysfi-external https://github.com/gfngfn/satysfi-external-repo.git
$ opam repository add --all-switches satyrographos-repo https://github.com/na4zagin3/satyrographos-repo.git
```

## SATySFiのインストール

パッケージマネージャヘルパのSAtyrographosもインストールします。

```bash
$ opam install satysfi satyrographos
```

## パッケージのインストール

標準ライブラリ及びSatyrographosが提供するパッケージをインストールします。

```bash
$ opam install satysfi-dist satysfi-fss
$ satyrographos install
```

# ドキュメントの作成

まずテンプレートから`mydoc`という名前のドキュメントを作成します。

```bash
$ satyrographos new '[experimental]doc-make@ja' mydoc
```

こうすることで、`mydoc`ディレクトリ内に以下のファイルが作成されます。

Satyristes

```Satyristes
(lang "0.0.3")

(doc
  (name  "main")
  (build ((make)))
  (dependencies
   (;; Standard library
    dist
    ;; Third-party library
    fss
    )))
```

Makefile

```Makefile
.PHONY: all
all: doc
# SATySFi/Satyrographos rules
%.pdf: %.saty
	satyrographos satysfi -- -o $@ $<
%.pdf.deps: %.saty
	satyrographos util deps -r -p --depfile $@ --mode pdf -o "$(basename $@)" $<

# User rules
doc: main.pdf
-include main.pdf.deps
```


local.satyh

```local.satyh
% プロジェクト用函数・コマンド定義用ファイル
@require: code
@require: math


let-block ctx +frame content =
  let pads = (10pt, 10pt, 10pt, 10pt) in
  let decoset = VDecoSet.simple-frame-stroke 1pt (Color.gray 0.75) in
    block-frame-breakable ctx pads decoset (fun ctx -> read-block ctx content)

let-block ctx +display-boxes content code =
  read-block (ctx |> set-paragraph-margin 12pt 0pt) '<+frame(content);>
    +++ read-block (ctx |> set-paragraph-margin 0pt 12pt) '<+code(code);>

% 数式コマンドの定義
let-math \factorial x =
  ${#x \mathpunct{\mathrm-token!(`!`)}}
```

## ビルド

以下のコマンドを実行することで、`main.pdf`が出力されます。

```bash
$ SATYROGRAPHOS_EXPERIMENTAL=1 make
```

# 外部パッケージの利用

ここでは、`texlogo`というパッケージを使ってみます。

## パッケージの検索

```bash
$ opam search 'satysfi-*'
# Packages matching: match(*satysfi-**)
# Name                                    # Installed         # Synopsis
satysfi-arrows                            --                  A SATySFi arrows library
satysfi-arrows-doc                        --                  A SATySFi arrows library
satysfi-assert-eq                         --                  Provides function as the Rust's assert_eq! macro
satysfi-azmath                            --                  A SATySFi package containing A-to-Z mathematical commands
satysfi-azmath-doc                        --                  A SATySFi package containing A-
...
```

## インストール

```bash
$ opam install satysfi-texlogo
$ satyrographos install
```

## `main.saty`から利用

以下のような`main.saty`を作成します。

```main.saty
@require: stdjabook
@require: texlogo/texlogo
@import: local
document (|
  title = {texlogo};
  author = {yasuo_ozu};
  show-title = true;
  show-toc = false;
|) '<
+p{
	hello, \LaTeX;
}
>
```

# 参照すべきドキュメント

SATySFiの情報は以下のような文献にまとまっています。

## まとまった文献

- [公式Wiki](https://github.com/gfngfn/SATySFi/wiki)
- [The SATySFi Book](https://booth.pm/ja/items/1127224) ※現在は無料でもダウンロードできます
- [learn-satysfi](https://github.com/puripuri2100/learn-satysfi/blob/master/README.md) by [@puripuri2100](https://twitter.com/puripuri2100)さん
- [SATySFi-API](https://puripuri2100.github.io/SATySFi-API/) by [@puripuri2100](https://twitter.com/puripuri2100)さん ※主にパッケージ開発者向け
- [SATySFi My Soul](https://nekketsuuu.github.io/satysfi-my-soul/index.html) by [@nekketsuuu](https://twitter.com/nekketsuuu)さん

## パッケージ情報

- [Satyrographos Package Index](https://satyrographos-packages.netlify.app/) by [@matsud224](https://twitter.com/matsud224)さん ※事実上の公式
- [SATySFi's packages list](https://puripuri2100.github.io/SATySFi-package-list/) by [@puripuri2100](https://twitter.com/puripuri2100)さん
- [Awesome SATySFi](https://github.com/uetchy/awesome-satysfi) by [@uechz](https://twitter.com/uechz)さん

# Advent Calendar

- [SATySFi Advent Calendar 2018](https://adventar.org/calendars/3418)
- [SATySFi Advent Calendar 2019](https://adventar.org/calendars/3929)
- [SATySFi Advent Calendar 2020](https://adventar.org/calendars/4965)

# 今後のSATySFiに関する技術情報

SATySFiは現在活発に開発が進められており、(gfngfnさんのツイート参照)今後も多くの機能の搭載が予定されています。今後のSATySFiを考える上で参考になる記事です。

- [SATySFiのこれからの課題たち](https://www.slideshare.net/bd_gfngfn/satysfi-237236824)
- [gfngfnさんの最新のツイート](https://twitter.com/bd_gfngfn/status/1337665003684417536)

## 多段階計算について

- [SATySFiに多段階計算を入れる構想](https://github.com/gfngfn/SATySFi/wiki/SATySFi%E3%81%AB%E5%A4%9A%E6%AE%B5%E9%9A%8E%E8%A8%88%E7%AE%97%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E6%A7%8B%E6%83%B3)
- [多段階計算の型システムの基礎](https://www.slideshare.net/bd_gfngfn/ss-232181286)