SATySFiへの要望まとめ

:::note info
これは「[SATySFi Advent Caleandar 2022](https://adventar.org/calendars/7515)」の6日目の記事です。
（5日目は [yozu さん](https://qiita.com/yasuo-ozu/items/4746bf8ad8eb63e4c4bc)、7日目は [ bd_gfngfnさん](https://github.com/gfngfn/SATySFi/wiki/SATySFi-v0.1.z-%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%AB%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E9%85%8D%E7%BD%AE%E3%81%AE%E8%A8%AD%E8%A8%88%E6%A1%88)です。）
:::

Twitter上にはSATySFiに関する様々な提案や要望が見られますが、Twitterだと簡単に流れてしまうため後から見返すのが困難です。この記事では私の独断と偏見で、特におもしろそうだなと思ったツイートをピックアップしてみました。

# 注意

- 提案の中でも、サードパーティのSATySFiライブラリを整備すれば実現可能なものは除いています
- ツイート下のコメントは私の意見であり、ツイートされた皆様方のご意見とは異なる場合があります。
- 主に2020年後半以降のツイートを参照していますが、全てを網羅できているわけではありません。

# レイアウト

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFi って文字の回り込みあったっけ</p>&mdash; スマートコン (@mr_konn) <a href="https://twitter.com/mr_konn/status/1581133108060950528?ref_src=twsrc%5Etfw">October 15, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">そういえば本文が1段組の本でも索引だけは2段組、みたいなことは珍しくないけど、今の SATySFi で途中から段組みを変更すること（LaTeX の multicol みたいな）ってできるんだったっけか</p>&mdash; monaqa (@mo_naqa) <a href="https://twitter.com/mo_naqa/status/1515338855540350977?ref_src=twsrc%5Etfw">April 16, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFi、縦書き対応されたら本格的にLaTeXからの乗り換えを検討します…… <a href="https://t.co/YvcLtmsv0x">https://t.co/YvcLtmsv0x</a></p>&mdash; 二日ゆに (@yuni_hutsuka) <a href="https://twitter.com/yuni_hutsuka/status/1527310274591866882?ref_src=twsrc%5Etfw">May 19, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">縦書き対応，SATySFiでも今後苦しまねばならん対象のひとつ</p>&mdash; 画力・博士号・油田 (@bd_gfngfn) <a href="https://twitter.com/bd_gfngfn/status/1542819525426442240?ref_src=twsrc%5Etfw">July 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

他にも「ボックスの縦の長さを指定し、ボックスから溢れた文章を別のボックスに流す」等の需要はありそうです。

# 画像

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">satysfiでPDFの物理サイズ読めないのかな、読めなさそう</p>&mdash; まも (@MMARIMO0o) <a href="https://twitter.com/MMARIMO0o/status/1538551966984351744?ref_src=twsrc%5Etfw">June 19, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

例えば画像の中に文字が含まれる場合(グラフなど)、文字のサイズを正しくするためにも画像を自然なサイズで表示したいので、このような機能があったほうが良いと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">satysfi、初めて使ってみたけど画像挿入するとその場じゃなくて、次ページの先頭に行くのは仕様？</p>&mdash; Tsu (@Tsuge48080649) <a href="https://twitter.com/Tsuge48080649/status/1473693985650921472?ref_src=twsrc%5Etfw">December 22, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これはLaTeXの挙動と異なるのでびっくりですよね...

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFiでパッケージ側から画像を読み込もうとしたらかなりハマってる</p>&mdash; ぷり (@puripuri2100) <a href="https://twitter.com/puripuri2100/status/1403322449014439940?ref_src=twsrc%5Etfw">June 11, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

パッケージファイルに画像を含める場合、それをSATySFiコードから参照する方法がないんですよね...。例えば画像ファイルの探索パスにdistディレクトリを追加する等すれば便利になるかもしれません。
SVGをSATySFiコードに変換し、それを用いて画像を描画するという手もありますが...

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFiでグラデーションといえばこれで良いのか？<a href="https://t.co/d6XJLKf7De">https://t.co/d6XJLKf7De</a></p>&mdash; ぷり (@puripuri2100) <a href="https://twitter.com/puripuri2100/status/1109449585917739008?ref_src=twsrc%5Etfw">March 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

PDFのグラデーションをSATySFiから出力する方法がないので何とかしたいですね。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">otfed 0.0.1 を satysfi-external-repo に登録し，merge完了！（というわけでSATySFiのフォントフォーマットに関するバックエンドを切り替えられました）</p>&mdash; 画力・博士号・油田 (@bd_gfngfn) <a href="https://twitter.com/bd_gfngfn/status/1583856273870622720?ref_src=twsrc%5Etfw">October 22, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

SATySFiのフォンtの周りはどんどん便利になりそうです。個人的にはアウトラインとか取れたらうれしいなと思ってます。

# Text Mode に関して

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">satysfi の graphics, text mode で何かに出力できると嬉しい気がするけど，それ嬉しいのぼくだけでは，みたいな感じもある（QRコード出したい）</p>&mdash; estis (@estis_jc) <a href="https://twitter.com/estis_jc/status/1588086289550626816?ref_src=twsrc%5Etfw">November 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現状だとText Modeからは画像を書き出したりすることができないので、これができれば、例えばHTMLやepub等を生成する等がやりやすくなる気がします。[^1]

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ようやくテキスト出力モードが数式をサポートしつつあります <a href="https://twitter.com/hashtag/SATySFi?src=hash&amp;ref_src=twsrc%5Etfw">#SATySFi</a><br><br>1枚目： ドキュメント test.saty<br>2枚目： ミニマルなクラスファイル head.satyh-latex<br>3枚目： コマンドと出力結果<br>4枚目： 3の出力結果をLaTeXで処理して生成されたPDF <a href="https://t.co/l21GPoH08i">pic.twitter.com/l21GPoH08i</a></p>&mdash; 画力・博士号・油田 (@bd_gfngfn) <a href="https://twitter.com/bd_gfngfn/status/1571490975561973760?ref_src=twsrc%5Etfw">September 18, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これは期待できそうです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFi は今後 HTML や MathML や LaTeX などのコードを生成する方向にも進化していくのだろうか<br>（CSS 組版なんていう方向もあり得る？）</p>&mdash; monaqa (@mo_naqa) <a href="https://twitter.com/mo_naqa/status/1586710773992394752?ref_src=twsrc%5Etfw">October 30, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これを実現するにはクラスファイル側で色々なフォーマットに対応しないといけないですが、できたらおもしろそうです。(特にLaTeX)

[^1]: 出力先がインラインSVGであればそこまでハードル高くないかと思いつつも、SATySFiのGraphicsはPDF出力を前提に作られているためPDF -> SVG変換は必要になりそうです。


# LaTeXからの移行

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">以前SATySFiのコード例をお見せしたときに「これ技術者じゃないユーザが書くのはかなり無理ある構文な気がしますねえ，技術者以外は<br><br>+p{<br>　…<br>}<br><br>の最後の行のようにコード上で閉じ括弧が行頭に来るのとかを何かの打ち間違いだと思ったりしがちなんですよ」という意見をもらって衝撃だったことはある</p>&mdash; 画力・博士号・油田 (@bd_gfngfn) <a href="https://twitter.com/bd_gfngfn/status/1566672476188188673?ref_src=twsrc%5Etfw">September 5, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

この発想はなかったです。もしかするとXHTMLの閉じタグ `</document>`とかLaTexの `\end{xxx}` の方がわかりやすいのかもしれませんね。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFi の型エラー表示はもう少しわかりやすく出来たらいいなと思ってるんだけど、オラに力が無さすぎて改善できていない</p>&mdash; monaqa (@mo_naqa) <a href="https://twitter.com/mo_naqa/status/1408646536616054784?ref_src=twsrc%5Etfw">June 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFi、良くも悪くも型システムなので万人にオススメできるかと言われるとはにゃ？というところがある</p>&mdash; Azumabashi (@azm_bashi) <a href="https://twitter.com/azm_bashi/status/1488269997403107332?ref_src=twsrc%5Etfw">January 31, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

SATySFiに限らず型の強い言語のエラーは初心者にとって分かりにくいとは言われますよね。
HTMLのようにエラー表示を極力減らし、多少文法が変でも無理やりレンダリングできる言語のほうが直感的なのかも？

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFi美文書作成入門 <a href="https://t.co/WjWUMLY1gl">https://t.co/WjWUMLY1gl</a></p>&mdash; κeen (@blackenedgold) <a href="https://twitter.com/blackenedgold/status/1370613720112533507?ref_src=twsrc%5Etfw">March 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

SATySFiの利用者にとって使いやすい、言語やパッケージの使い方をまとめたレファレンス的なマニュアルがあったら便利かも知れません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">satysfiへ人口を移すために，現状のplatex，uplatexの使用感をそのままにできるようなstyleを作って配布したほうがいいのかな</p>&mdash; estis (@estis_jc) <a href="https://twitter.com/estis_jc/status/1555274625478565888?ref_src=twsrc%5Etfw">August 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

LaTeXとの互換性に関しては、LaTeXとSATySFiの仕組みが大きく異なる以上難しいのですが、例えば[satysfi-latexcmds](https://github.com/yasuo-ozu/satysfi-latexcmds)を使うと、LaTeX風のコマンドを使うことができます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">いつの間にか、SATySFiが<br>「普及を企図していく段階」<br>に達していたらしい😲<a href="https://twitter.com/hashtag/satysfi?src=hash&amp;ref_src=twsrc%5Etfw">#satysfi</a> <a href="https://twitter.com/hashtag/TeX%E4%BB%A5%E5%A4%96?src=hash&amp;ref_src=twsrc%5Etfw">#TeX以外</a> <a href="https://t.co/ZWtCauG08R">https://t.co/ZWtCauG08R</a></p>&mdash; 某ZR（ざんねん🙃） (@zr_tex8r) <a href="https://twitter.com/zr_tex8r/status/1518044946397229057?ref_src=twsrc%5Etfw">April 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

0.1.0が出たら普及活動頑張りたいですね。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">バグが取れてすっきりしたのでSATySFiインストールバトルをします</p>&mdash; uint256_t (@uint256_t) <a href="https://twitter.com/uint256_t/status/1260233689557921792?ref_src=twsrc%5Etfw">May 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

(LaTeXもですが)SATySFiもインストールが大変というイメージがあるのでなんとかしたいです。([SATySFi用Makefile](https://qiita.com/yasuo-ozu/items/bc8f4615ae20d936add9)も使ってみてください)

# 言語

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/SATySFi?src=hash&amp;ref_src=twsrc%5Etfw">#SATySFi</a> で条件コンパイルをする方法ってあるんかな（解答・解説つきとなしのpdfを両方生成したい）</p>&mdash; hsjoihs (はすじょい) (@hsjoihs) <a href="https://twitter.com/hsjoihs/status/1100130315937275904?ref_src=twsrc%5Etfw">February 25, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

黒魔術が欲しくなることもあります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFiでインラインコマンドやブロックコマンドの実行時、ctxから、コマンドが配置された場所に固有のID(例えば.satyファイルの先頭からのバイト数など)を得られるようにすれば、例えばblock-textを複数回評価した場合にfootnoteが増殖するみたいなことを防げるな。</p>&mdash; yasuo_ozu@量子コンピュータエンジニア (@yasuo_ozu) <a href="https://twitter.com/yasuo_ozu/status/1382356686774493187?ref_src=twsrc%5Etfw">April 14, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/SATySFi?src=hash&amp;ref_src=twsrc%5Etfw">#SATySFi</a>, 節の中に章を入れてしまうような自体を避けるため、 block-text 型に情報をもたせる ([Chap] block-text, [Sec] block-text) とか、ctxに任意の情報を持たせることができるようにするといい気もするし、そういう事をするとクラスファイルが大変なことになる気もする</p>&mdash; yasuo_ozu@量子コンピュータエンジニア (@yasuo_ozu) <a href="https://twitter.com/yasuo_ozu/status/1344752831199264769?ref_src=twsrc%5Etfw">December 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

`let ref` ではなく `ctx` に情報をもたせられたら、ライブラリ作者にとっては便利だったり。


# 開発、ドキュメント

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFiは今度は英語文献がなさそうだけど，The SATySFibookは勝手に翻訳したらまずいんだろうなぁ．</p>&mdash; abenori (@abenori) <a href="https://twitter.com/abenori/status/1357674471490940929?ref_src=twsrc%5Etfw">February 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">英語のドキュメントあるかわからんけど、もしもSATySFi使い慣れるのであれば、翻訳ボランティアを普通にしたいな・・・</p>&mdash; 佐藤正尚 (Dion Masanao Sato) (@penguinmeditate) <a href="https://twitter.com/penguinmeditate/status/962157322427486208?ref_src=twsrc%5Etfw">February 10, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現状のSATySFi周りでは日本語のドキュメントが多いため、英語の情報充実が望まれます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFiのCIは今はパーサーまわりの簡単なテストと既存のドキュメントがエラーなくビルドできることくらいしか確認していないので、ビルド結果のPDFが意図せず変更されていないか確認できると多少は安心度が高まるのかしら</p>&mdash; でこれき (@dico_leque) <a href="https://twitter.com/dico_leque/status/1558777418579472385?ref_src=twsrc%5Etfw">August 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

どの程度のレイアウトずれをエラーとみなすかが難しそうですが、例えば[satysfi-xpath](https://github.com/yasuo-ozu/satysfi-xpath)では一部そのようなテストを導入しています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/rustlang?src=hash&amp;ref_src=twsrc%5Etfw">#rustlang</a> -rfc みたいな <a href="https://twitter.com/hashtag/SATySFi?src=hash&amp;ref_src=twsrc%5Etfw">#SATySFi</a> rfc がほしい</p>&mdash; yasuo_ozu@量子コンピュータエンジニア (@yasuo_ozu) <a href="https://twitter.com/yasuo_ozu/status/1303174291253391360?ref_src=twsrc%5Etfw">September 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

RFCあったら楽しいですがコミュニティの維持コストは上がりそうです。


# 他ツールとの連携

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「SATySFiで図を描くのではなく画像にすればよくない？」という議論について、研究でちょっとずつパラメータを変化させながら計算した大量のグラフを出力する場合、グラフを生成するためのプログラムをSATySFiで記述できれば楽なんですよね。パラメータが複雑な場合一度ファイル名を経由するのは面倒</p>&mdash; yasuo_ozu@量子コンピュータエンジニア (@yasuo_ozu) <a href="https://twitter.com/yasuo_ozu/status/1439550606331449344?ref_src=twsrc%5Etfw">September 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

だからPython + Jupyter Notebookがはやってるんだと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">わかります。SATySFiとかLaTeXのREPLがjupyter notebookから叩けるようになっていて、\hogeと書いたら次のcellで計算結果がレンダリングされて、レンダリング結果をくっつけて行ったらdocumentになるみたいな形になったら嬉しいんですよね.......</p>&mdash; ふりふりモノトーン (@furifuri_mono) <a href="https://twitter.com/furifuri_mono/status/1501104627596488705?ref_src=twsrc%5Etfw">March 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Jupyter Notebookと連携できたらユーザー増えそうです。数式処理や定理証明支援系も組合せたら...と考えると夢が広がります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFiのバイナリをRustから扱いたい<br>→OCamlのffiを使って関数定義を一つづつ書いていく<br>→量が多すぎて話にならない。自動化したい<br>→ocaml-bindgenを作る<br>→まずはtree-sitterでOCamlのファイルを解析するやつ作ろう</p>&mdash; yasuo_ozu@量子コンピュータエンジニア (@yasuo_ozu) <a href="https://twitter.com/yasuo_ozu/status/1581245008216461319?ref_src=twsrc%5Etfw">October 15, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">となると、SATySFi本体をライブラリ的に扱う需要がありそう。<br><br>避けていた「SATySFiをRustで再実装」説にまた一歩近づくかもしれない</p>&mdash; yasuo_ozu@量子コンピュータエンジニア (@yasuo_ozu) <a href="https://twitter.com/yasuo_ozu/status/1547239887552000000?ref_src=twsrc%5Etfw">July 13, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

SATySFi周辺のツールでRustで書かれているものもありますし、OCamlとRustを連携させる方法があればもっと便利になると思います。

# パッケージマネージャ、ビルドツール

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SATySFi向けパッケージマネージャーがどんなものだといいか、Nixとの統合はどうなされるべきか考えた。とにかく思いついたことを書きまくっているしいろいろエアプだけれども<a href="https://t.co/mB6yTJrDJS">https://t.co/mB6yTJrDJS</a></p>&mdash; お〜み〜 (@aumy_f) <a href="https://twitter.com/aumy_f/status/1520404550750195712?ref_src=twsrc%5Etfw">April 30, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">これがあるのでSATySFiの新しいパッケージマネージャ欲しい感ある <a href="https://t.co/yDAzfHtEki">https://t.co/yDAzfHtEki</a></p>&mdash; yasuo_ozu@量子コンピュータエンジニア (@yasuo_ozu) <a href="https://twitter.com/yasuo_ozu/status/1426332965634670596?ref_src=twsrc%5Etfw">August 14, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">各方面からの指摘やv0.1.xでのパッケージシステムについての記事を受けて考えを整理した結果、色々と加筆修正を行いました <a href="https://twitter.com/hashtag/SATySFi?src=hash&amp;ref_src=twsrc%5Etfw">#SATySFi</a> <br>はてなブログに投稿しました <a href="https://twitter.com/hashtag/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%AD%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#はてなブログ</a><br>SATySFiの最強のビルドツールを作りたい - puripuri2100が進捗の報告をするようです<a href="https://t.co/3Fgut9nltz">https://t.co/3Fgut9nltz</a></p>&mdash; ぷり (@puripuri2100) <a href="https://twitter.com/puripuri2100/status/1584395230828109825?ref_src=twsrc%5Etfw">October 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ

他力本願記事で申し訳ありません...