カビパン男と私

HOME/横書き縦書き

逆ポーランド式に LaTeX 数式を編集したい

LaTeX の数式を書くと、必ずコンパイル時にエラーを出してしまう。括弧のつけ忘れや、つけすぎ、{ のエスケープ忘れ、コマンド名のスペリングを間違う、などなど、一つのエラーの原因を直しても、まだまだエラーが出る。

考えてみるに、括弧を開いたら頭の中に「括弧が開いているぞ」フラグを立てておかなればならない。\cdot という演算子を書いたら、「いま 2 つ目のオペランドを編集中だぞ」フラグも必要だ。そして、\frac{}{} だの \sqrt{} だのが入れ子になっていって、だんだん集中力が殺がれていく。そして、集中力が途切れると、自分が何をやっているのかわからなくなる。何をやっているかわからなくなると、式の最初から見直さなくてはいけない。入力援助の仕組みはいろいろとあるけれども、数式を頭から打っていく限り基本的にこのことは変わりはない。

そこで、RPN 式に編集ができたら楽だろうし、間違いが減るに違いないと考えた。さいわい HP-50g(電卓) なんかで RPN 式の入力には慣れている。それに、なんといっても RPN は楽しいのだ(これが本音)。

「車輪の再発明」をするに先立ち、LaTeX の数式を RPN 式に入力する方法をぐぐってみると、すぐに 2 つ見つかった。リスペクトのために、記しておく。

ひとつめは、2007年 の RPN2TeX 0.8 (「逆ポーランド記法でTeXの数式を入力するソフト」http://mixi.jp/view_bbs.pl?comm_id=20834&sid=14214643、「RPN2TeX 0.8をリリース」前田航、http://oku.edu.mie-u.ac.jp/~okumura//texfaq/qa/46509.html)で、Mac で動くものだというが、残念ながら 2017-2-21(Tue) 現在、リンク先のサーバがエラーとなって、入手できなかった。

ふたつめは、2015年の texrpnmath-0.3 で「LaTeXでRPN的に数式を入力してみる」(MadChemiker, https://sites.google.com/site/madchemiker/latex/texrpnmath)だ。LaTeX のソースファイルに埋め込んで使う、emacs から使う、lua のスクリプトとしてコンソールから対話的に使うという 3 つの方法が提供されている。

世の中に根強い RPN ファンがいるのを見ると、心強い気持ちになる。私も私なりに車輪の再発明をしてみようという気になってきた。

(2018年2月2日追記) 以下、ふざけて sed で書いたときの記事だけど、もっと実用的なページを作ったので、使ってみようという人はこっちを見たほうがいいです。(追記おわり)

どういう言語で書こうかと考えたが、シェルスクリプトと相性がよいものがよい。そこで選んだのが、sed である。sed というのは、あの sed である。対話的にテキストを編集するプログラムを sed で書くという馬鹿馬鹿しさにも、それだけでも挑戦する価値ありとみた。

sed 用に 10 行ほどのスクリプトを書くと、まがりなりにもスタックらしきものが実装できた。これはいける! と私は思った。だが、もっとも実用になるものを作ろうとすると、それなりに大変だ。x の 2 乗は、たんに x^2 とすればいいが、sin x の 2 乗は sin^2 x としたいのが人情だ。undo もほしい。文字単位の修正もできなくては実用に耐えない。こうして悪のりが始まった。

そして気づいたことは、スタックを操作して一般的なテキストを編集するための「言語」っぽいものを実装し、これを利用する LaTeX 用のマクロ集を別途作成するべきだということだ。これなら、たとえば Maxima 用のマクロとか、R 用のマクロを作ることもできる。

sed で作るからには関数も変数も使えないので、何から何まで置換コマンドで表現するのが基本となる。何でもかんでも抽象化されていく時世に、どこからどこまで手続的な書き方をしていくのは、いっそ愉快なことだった。

そんなわけで、とりあえずの成果物ができたので、メモとともに晒しておく。「スタックを使って LaTeX の数式を編集せむ

↓こんなん(vim から呼び出して使っているところ)

↓こんなん(クリップボード経由で Atom に貼り付けているところ)

@kabipanotoko