SATySFi Conf 2020まとめ

はじめに

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

ライブラリのビルド再現性を実現するためのパッケージマネージャ

リポジトリna4zagin3/satyrographos

SATySFi用にライブラリを準備

  1. OPAMを使った外部リポジトリからライブラリを持ってくる
  2. opamフォルダに入れられたライブラリを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に変換して使っていたが、フォントやレイアウトの調整が沼だった。

その後CSS組版に切り替えるも脚注の処理がトリッキー

そこで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

スライド: https://docs.google.com/presentation/d/e/2PACX-1vTfSutdo8EblmlpfktQzYtrjZnorcaaY9wk7FgUlWDkImLpjzYHIjrmBmRQ2tfdG3xo4HMG-lOI01fy/pub?start=false&loop=false&delayms=3000&slide=id.p

pdf出力結果のテストをしたい!

→snapshotを撮って比較することでテスト

コードに変更が行われたらその結果をsnapchotとして保存し、期待したdiffが得られるかを確認する動作を自動化する

javascript+jestで実装(とりあえず動くものを使いたい)

jest-pdf-snapshotというものを自作して利用(内部でdiff-pdfを使っている)

実装例は satysfi-basesatysfi-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の簡単なまとめを終わらせていただきます。

とても有意義で楽しい会となりました。来年も開催したいですね。