概要
MathJaxで私が書くぐらいの内容をSATySFi化するツールが欲しいのだが、MathJaxって簡単に構文木取れたりするんだろうか
— hsjoihs (@hsjoihs) 2019年9月21日
desmos.comなどのサイトから数式をコピペしてくるとそのままMathJaxで使えて便利なのだが、それをSATySFi化しようとすると括弧とかをいちいち\paren{}
とかに手動で置き換えていくのがあまりにも面倒である。これはかなり単純作業なので、ツールが欲しくなった。もちろん意味論を見て\paren{}
を\app{}{}
にするとかは手動じゃないとできないが。
とりあえずSATySFi化するツールなのでSATySFifyとかいう名前にしてみる。ググってみても衝突しないっぽいのでOK。
一番面倒なのが数式の変換なので、まずはそれを作るところから始めることにした。
とりあえずRustでフルスクラッチで作っている。行列とかも一応変換できるようになった(ただし \begin{matrix} ... \end{matrix} のみ)し、ギリギリ使えそう。https://t.co/dSMEC5svh5 pic.twitter.com/d2kjLy1m6D
— hsjoihs (@hsjoihs) 2019年10月13日
開発期間
2019年9月末~10月頭に9日間*1ぐらいやって、その後放置してしまっている。多分SATySFiを今後使っていくにつれて私ももっと機能が欲しくなってくるはずで、そうなれば機能がもうちょい増えるはず。きっと。
あっプルリク大歓迎です。今さっきMITライセンス足しました
現状での機能
まあMakefileに直書きしてあるテストを見るのがわかりやすいのだが、
()
を\paren{}
に変換\left( \right)
だったり\left. \right|_{a=x, b=p}
だったりにもちゃんと対応- 行列もちゃんと
matrix
,bmatrix
,pmatrix
,vmatrix
,Vmatrix
に対応。行列の実装は、 nekketsuuuさんのsatysfi-matrixをRust側に埋め込むという手抜き実装である - あとは
\hbar
*2とかに追加で対応している。そのため、Rust側のソースコードに登録しておくことで、ライブラリにないやつを出力ソース中に埋め込める仕組みを実現してある
あれっそんなに機能ないな*3……まあMathJaxで私が書くぐらいの簡単な内容でSATySFiと互換のない部分ってのは主にここぐらいだからか。
今後足したい機能
\dot
とか\vec
が欲しい- 数式単体じゃなくて、数式の入ったMathJax文書をそのまま変換できるようにしたい。http://draft.hyuki.netで書いた下書きをそのままツールに投げ込んでSATySFiとして使えれば理想的
- MathJax側は無駄な
{}
を許容するが、SATySFiは許容しない。これを処理するのは結構たいへんで、例えば現状の実装だと「\frac
は引数を2個取る」とかは一切見ていないので厄介 - alignされたやつの処理。行列では対応できているので、それをちょろっといじればできると信じたい
- 不正な入力を落とす方のテストも書かねば
- ブラウザで動くREPLほしい
\dots
問題。真面目に対応するのが面倒だったので、現状では`\dots` detected; converting it into `\ldots` (you might want to fix this)
というwarningを出すという運用にしている
"For most situations. the undifferentiated \dots can be used, and amsmath will output the most suitable form based on the immediate context;" じゃないんだよ、その判定をどうやって行ってるのかを書いてほしいんだよな
— hsjoihs (@hsjoihs) 2019年10月3日
MathJaxはかつてはすべて\ldotsにしてたらしいが、v2.0で直したらしい
— hsjoihs (@hsjoihs) 2019年10月3日
これは普通に直後の物体を見てるんじゃなかったっけ。a+\dots+b は直後が2項演算子だから \cdots になるけど a+\dots は直後の物体がないから下つきになる
— だめぽラボ@技術書典7 し03D (@mod_poppo) 2019年10月3日