jsonファイルからSATySFiのクラスファイルを生成する

# 概要

jsonファイルからSATySFiのクラスファイルを自動的に生成するソフトウェアを作成しました。
名前は*formatcls*でリポジトリは[ここ](https://github.com/puripuri2100/formatcls)です。

RustとCargoをインストールしたのちに

```sh
cargo install --git https://github.com/puripuri2100/formatcls.git
```

とすることでインストールできます。

# 動機

「目的に合ったクラスファイルを個別に作るのは面倒だが、[カスタマイズできるクラスファイル](https://github.com/puripuri2100/exdesign)はそれはそれでパラメーターが多すぎて面倒だ」ということに気が付いたので、一から生成する手段を取ることにしました。

# 想定使用者

レポートや同人誌を作成するときにある程度版面をコントロールしながら作りたい、と考えている学生や同人作家などが想定です。

編集者・組版者は、自動生成したものにきちんとした改造を加えるなら大丈夫ですが、そのままでは商用出版に耐えうる品質ではないということに気を付けてください。

# 使い方

```sh
formatcls -c <json file> -o <output file>
```

で起動できます。

デフォルトの値を知りたいときは

```sh
formatcls -d <output file>
```

とすることでデフォルトの設定が書かれたjsonファイルが出力されます。

# 提供関数・コマンド

- `val u-register-cross-reference-num : string -> string -> unit` : 数の登録用です。`f key title`と使います。
- `val ib-register-cross-reference-page : string -> string -> inline-boxes` : ページの登録用です。`f key title`と使って得たinline-boxesを必要な箇所にくっつけます。
- `val s-get-cross-reference-num : string -> string` : 数の取得用
- `val s-get-cross-reference-page : string -> string` : 数の取得用
- `val ib-register-location-frame : string -> inline-boxes -> inline-boxes` :リンクを貼ります 
- `val ib-link-to-location-frame : string -> inline-boxes -> inline-boxes` : リンクに飛びます
- `direct \ref : [string] inline-cmd` : 相互参照
- `direct \ref-page : [string] inline-cmd` : 相互参照（ページ）
- `+p : [inline-text] block-cmd` : 段落用
- `+pn : [inline-text] block-cmd` : 段落用

ドキュメント関数は

```
val document : 'a -> block-text -> document
  constraint 'a :: (|
    title : inline-text;
    author : inline-text;
    other : 'b;
  |)
```

という型を持っています。`other`の部分は`title-fun`で指定したタイトル作成関数に依存します。デフォルトでは`'a`です。

このほかに、節を作る関数を提供しています。デフォルトでは`+section`・`+subsection`・`+subsubsection`の3つになりますが、いくらでも増やせます。
ただし、型は`[string?; inline-text?; inline-text; block-text] block-cmd`で固定です。

# 設定できる項目

多岐にわたりますので、ここでは重要そうなものに絞って記述します。
詳しくは[ドキュメントファイル](https://github.com/puripuri2100/formatcls/blob/master/doc/doc-ja.md)をご覧ください。

- "page-size" : "a4"や"b5j"などのように指定できます。
- "left-space" : 左側の余白を弄れます。同様に"right-space", "top-space", "bottom-space"があります。
- "main-font" : フォントサイズやフォントを変えられます。以下の子データを与えてください（全部必須ではありません）。
    - "size"
    - "cjk-name"
    - "cjk-ratio"
    - "cjk-correction"
    - "latin-name"
    - "latin-ratio"
    - "latin-correction"
- "require-package" : クラスファイルが読み込むパッケージを追加できます。
- "import-package" : クラスファイルが読み込むパッケージを追加できます。
- "header-fun" : ヘッダー表示する関数を指定できます。型は`ctx:context -> page-num:int -> block-boxes`です。デフォルト以外に`"empty"`も指定できます。また、自作関数を入れても構いません。
- "footer-fun" : フッターを作成します。"header-fun"と一緒です。
- "sec-fun" : 節を作る関数です。型は`ctx:context -> label:string -> count-lst:int list -> i:int -> title:inline-text -> outline-lst:((int, string, string, bool) list) ref -> outline-title-opt:inline-text option -> main:block-text -> block-boxes`です。
- "toc-fun" : 目次を作る関数です。型は`ctx:context -> text-width:length -> label:string -> count-lst:int list -> i:int -> title:inline-text -> block-boxes`
- "toc-title-fun" : 目次を飾れます。型は`ctx:contex -> main-bb:block-boxes -> block-boxes`です。
- "title-fun" : タイトルを弄れます。型は`ctx:context -> title:inline-text -> author:inline-text -> other:'a -> block-boxes`です。
- "title-page" : タイトルを独立のページにするかどうかの真偽値です。
- "toc-page" : 目次を独立のページにするかどうかの真偽値です。

# 今後について

現在バージョン0.1.1をリリースしました。

今後については

- "sec-fun"や"title-fun"で指定できる関数をSATySFiパッケージの形で作成
- テキストモード用のクラスファイルの作成
- 用途などを選択することでjsonファイルを生成するWebサービスの作成

が目標になっています。
PRやissue待っています！