MathJaxで私が書くぐらいの内容をSATySFi化するツール

概要

desmos.comなどのサイトから数式をコピペしてくるとそのままMathJaxで使えて便利なのだが、それをSATySFi化しようとすると括弧とかをいちいち\paren{}とかに手動で置き換えていくのがあまりにも面倒である。これはかなり単純作業なので、ツールが欲しくなった。もちろん意味論を見て\paren{}\app{}{}にするとかは手動じゃないとできないが。

とりあえずSATySFi化するツールなのでSATySFifyとかいう名前にしてみる。ググってみても衝突しないっぽいのでOK。

github.com

一番面倒なのが数式の変換なので、まずはそれを作るところから始めることにした。

開発期間

2019年9月末~10月頭に9日間*1ぐらいやって、その後放置してしまっている。多分SATySFiを今後使っていくにつれて私ももっと機能が欲しくなってくるはずで、そうなれば機能がもうちょい増えるはず。きっと。

あっプルリク大歓迎です。今さっきMITライセンス足しました

現状での機能

まあMakefileに直書きしてあるテストを見るのがわかりやすいのだが、

  • ()\paren{}に変換
  • \left( \right)だったり\left. \right|_{a=x, b=p}だったりにもちゃんと対応
  • 行列もちゃんとmatrix, bmatrix, pmatrix, vmatrix, Vmatrix に対応。行列の実装は、 nekketsuuuさんのsatysfi-matrixRust側に埋め込むという手抜き実装である
  • あとは\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を出すという運用にしている

*1:2019/9/28, 9/29, 9/30, 10/1, 10/2, 10/4, 10/5, 10/10, 10/13

*2:私は物理学科にいるので、これがないと困る

*3:でもこの比較的少数の機能を実現するために意外とコードを要したのよな。もっと構文解析ライブラリを活かすと削れるのかもしれないが