はじめに
SATySFi Conf 2020が7/25に行われました。 参加してくださった皆さん、ありがとうございました。
さて、SATySFi Conf 2020で行われた発表の簡単なまとめを作成しました。
発表しているところを撮影した動画とスライドへのリンクをそれぞれ貼っていますので、ご利用ください。
発表者と発表タイトルは以下の通りとなっています(敬称略)。
- puripuri2100「カスタマイズ可能なクラスファイルについて」
- na4zagin3「Satyrographos: SATySFi向けパッケージマネージャー」
- wasabiz「satysfi-baseについて」
- gfn「SATySFiのこれからの課題たち」
- setoazusa「Pandoc使いSATySFiに挑戦する」
- hikalium「SATySFiのMarkdown機能を使って技術同人誌を書いてる話」
- zptmtr「SATySFiの描画結果をテストする」
- monaqa「satysfi-easytable: SATySFiで簡易な表組版」
puripuri2100「カスタマイズ可能なクラスファイルについて」
動画: https://youtu.be/g39yZuvVu8w
スライド: https://speakerdeck.com/puripuri2100/kasutamaizuke-neng-nakurasuhuairunituite
SATySFiでレポートを書くために簡単にレイアウトなどを弄ることができるクラスファイルが必要である。
現在あるSATySFiのクラスファイルの内、カスタマイズ可能なものは
- stdja*
- exdesign
- jlreq
の3つで、どれもレコード型を使って指定する方法を取っている。
今回新たに
- jsonファイルからクラスファイルを自動生成する
unit list
と破壊的代入を使ってレイアウトを変更する
という2つの方法を提案した。
jsonファイルからクラスファイルを生成するためのソフトウェアを既にRustで実装している(リポジトリ)。
{ "page-size": "b5", "left-space" : "20mm", "right-space" : "20mm", "main-font" : { "size":"12pt", "cjk-name":"ipaexm", "cjk-ratio":"0.88", "cjk-correction":"0.", "latin-name":"lmsans", "latin-ratio":"1.", "latin-correction":"0." }, "header-fun":"empty", "footer-fun":"empty", "sec-depth":2, "sec-name-list" : ["section", "subsection"] }
のようなjsonファイルから、おおよそ500行程度のクラスファイルができる。
unit list
を使う方法では、内部で破壊的代入を行うinline-text -> unit
のような関数を用意しておき、それをまとめたリストを評価することで値を書き換え、レイアウトに反映させるという手法を取る。
document [ Doc.title {title}; Doc.page-size Page.b5j; Doc.left-space 20mm; Doc.right-space 20mm ] '< +p{text} >
のようなコードになることを想定している。ただし、これを実現するクラスファイルはまだ作成していない。
今後は
- formatclsの改良
unit list
を使ったクラスファイルを作ってみる- 各クラスファイルユーザの感想を集めたい
- どの手法が良いのかわからないので数を撃ちたい
ということをしていく予定である
na4zagin3「Satyrographos: SATySFi向けパッケージマネージャー」
動画: https://youtu.be/0GkovrAHL6c
スライド: https://speakerdeck.com/na4zagin3/satyrographos-satysfixiang-kepatukezimaneziya
動機
(La)TeXを使う時に以下のことに悩まされることがある
- TeX Liveはfullでインストールするのが基本だけど、重い
- パッケージやエンジンの更新で壊われることが多々
- ビルドコマンドが不明
- 使用パッケージが見つからない
- 古いパッケージが必要なこともある
このような体験をしないために、SATySFiにパッケージマネージャが欲しい!
パッケージマネージャは
- パッケージをリモートのリポジトリから取得し、壊れていないかを検査する
- バージョンや依存性の解決
- パッケージの選択・更新ができること
ビルドツールの役割を持っていることもある
satyrographos
ライブラリのビルド再現性を実現するためのパッケージマネージャ
SATySFi用にライブラリを準備
という動作をする
satyrographos repo
SATySFiのライブラリを登録しているところ
リポジトリはna4zagin3/satyrographos-repo
- パッケージライブラリは"satysfi-*"
- フォントライブラリは"satysfi-fonts-*"
- クラスライブラリは"satysfi-class-*"
- ドキュメントやテストも別ライブラリとして切り出し
という名前の付け方で登録している
スナップショットについて:
- 相互に上手く動くパッケージやバージョンをスナップショットできる
- ライブラリの新しいバージョンが出たらスナップショットが更新される
まとめ
- satyrographosはビルド再現性を実現させるためのパッケージマネージャ
- 依存性解決等はOPAMにまかせている
- 文書ビルドやパッケージ一覧サイト生成などはまだ
- OPAM依存から脱却したい
wasabiz「satysfi-baseについて」
動画: https://youtu.be/1cq-R0al_zY
スライド: https://docs.google.com/presentation/d/1V1cAhOfgnKyCRsy1ZRPXLQUP3O4O6D22d8FuuTmiH7Y/edit#slide=id.p
satysfi-baseのリポジトリはnyuichi/satysfi-baseにある
インストールはsatyrographosを使って貰うことが前提
satysfi-baseはSATySFiの標準ライブラリを補完することを目指している
基本はデータ構造とアルゴリズムでAPIを拡充するのがメインだが、組版系の機能もある(組版系のは分離させるかも)
標準ライブラリには
- APIに一貫性が乏しい
- 提供されている機能が少ない
という問題があるが、プリミティブを使えって新たに定義していたけば解決できる
ヤバイテックトーキョーで同人誌を書く時にSATySFiの標準ライブラリのこれらの問題に直面し、これを解決するものを作っていた
これを切り出して公開したのがsatysfi-base
@require: base/ナントカ
で読み込む
インラインテキストで関数を使うためのevalコマンドなど、色々と便利である。
綺麗なAPIや統一的なインターフェースの提供を目指している。
型クラスが無いのでequal
関数などは手動で名前を揃えたりしている
「Ord用の型」もあるので疑似的な型クラスは使える
正規表現の高速化など取り組む課題はあるので、v2.0.0をそのうち出す
gfn「SATySFiのこれからの課題たち」
動画: https://youtu.be/wCkWr962Ox0
スライド: https://www.slideshare.net/bd_gfngfn/satysfi-237236824
昔の話
型無しのMacrodownという言語を作る(Turing完全ということを示される)。
方針転換してMacrodwonというSATySFiに通じるML系言語に
未踏事業でバックエンドや型システムを開発
修士論文を書くために拡張される
The SATySFibookの執筆や、多段階計算の追加など色々発展する
これからについて(機能以外)
- ライブラリ整備
- ライブラリのドキュメントを用意したい
- 処理系の技術的負債→リファクタリング中
- 英文ドキュメントを用意したい
これからについて(機能面)
- モジュールシステムが弱い
- ファンクタや定義の公開できる型の導入
- 1ファイル1モジュール化の導入(書き方の制約)
- directの廃止(名前空間が汚染されるので)
- フォント設定がパッケージ依存なのをなんとかする
- contextを拡張して、ユーザ側でもエントリを作れるようにする
- ドキュメント生成機能
@doc
を使ってドキュメント用のコードとライブラリ用のコードを分離する@doc @require: mypackage
のように自分自身の読み込みも
- テキスト出力モード拡充のために数式のADT化
- 数式を分解できるようにする(普通の数式はこれの糖衣構文とする)
let-math
に文脈情報を取得できるようにする(出力情報が多くなってしまうかも)
今後の課題はたくさんある
setoazusa「Pandoc使いSATySFiに挑戦する」
動画: https://youtu.be/LzVAH_Bnh6s
スライド: https://slides.com/hiroyuki_onaka/satysficonfi/
Pandocは44種類のデータフォーマットに対応している優れもの
最初はPandocをLuaTeXに変換して使っていたが、フォントやレイアウトの調整が沼だった。
そこでSATySFiに変換する方法に挑戦
環境はUbuntu 20.04 + WSL2
MasWagさんのpandoc-satysfi-templateを使っている→機能が不足していたりバグが残っていたりしているので、それを修正するPRを投げる予定
hikalium「SATySFiのMarkdown機能を使って技術同人誌を書いてる話」
動画: https://youtu.be/6xD3b-J8aPk
スライド: https://docs.google.com/presentation/d/1DHCipNUz_GnyCus-Gylcfx8o05TnWX366WJon1q-Mqc/edit#slide=id.p
OS Girlsという技術同人誌をSATySFiで書いている
SATySFiで書いていると言っても、SATySFiのマークアップ形式で書いているわけではなく、Markdownで書いてSATySFiに食わせている
SATySFiのMarkdownモードでは、行頭コメント内にドキュメント関数に渡す設定を書いておけば、その値が自動でdocument関数に渡される。 その方法を使って色々と本文用の設定をしている。
困ったこと:
- 画像サイズの指定ができない→画像を紙面幅固定
- 改ページや番号無し見出しを作れない→h2やh6と言った他のコマンドに割り当てる(悪用)ことで実現
zptmtr「SATySFiの描画結果をテストする」
動画: https://youtu.be/y9oGt0SUjzQ
pdf出力結果のテストをしたい!
→snapshotを撮って比較することでテスト
コードに変更が行われたらその結果をsnapchotとして保存し、期待したdiffが得られるかを確認する動作を自動化する
javascript+jestで実装(とりあえず動くものを使いたい)
jest-pdf-snapshotというものを自作して利用(内部でdiff-pdfを使っている)
実装例は satysfi-baseやsatysfi-class-yabaitechを参照
monaqa「satysfi-easytable: SATySFiで簡易な表組版」
動画: https://youtu.be/AdRBls9eXNI
スライド: https://speakerdeck.com/monaqa/satysfi-easytable-satysfi-dejian-yi-nabiao-zu-ban
デフォルトのSATySFiでは表組は複雑なことができるけど書くのが大変
これを解決するために、シンプルな表を簡単に書くことができるeasytableを開発
リポジトリはmonaqa/satysfi-easytable
関数の部分適用を使うことで列幅指定も可能に!
罫線や背景色はオプション引数で簡単に指定できる
おわりに
以上でSATySFi Conf 2020の簡単なまとめを終わらせていただきます。
とても有意義で楽しい会となりました。来年も開催したいですね。