HOME

スタックを使って LaTeX の数式を編集せむ

2017-4-24改訂

LaTeX で {} の多い数式を書いていると、途中で記憶力がパンクしてしまう。逆ポーランド方式(RPN)で式を書けたら、エラーがずっと減るだろう。sed と awk を使ったパイプラインを考えてみた。標準出入力を使って対話的にスタックを編集して、結果を一時ファイルに書き出すようになっている。

キーボード入力された LaTeX 用の編集コマンド(や文字列)は、マクロ集(latexmacro.sed)によって翻訳され、スタック編集用のスクリプト(rpnedit.sed)に渡される。このスクリプトは 1 行入力があるごとにスタックを更新し、新たな内容を出力する。(そして次の入力を待つ)。この出力は、整形用のスクリプト(printlevel.awk)に渡され、形を整えたうえで、スクリーンに表示される。なお、ユーザーが明示的な書き出しコマンドを打つと、スタック編集用のスクリプト(rpnedit.sed)は固定された名前を持つ一時ファイル(rpnedit.txt)に、現在のスタック内容を書き込む。

シェルから使うには……

$ sed --unbuffered -f YOUR/PATH/TO/latexmacro.sed |
sed --unbuffered -f YOUR/PATH/TO/rpnedit.sed |
awk -f YOUR/PATH/TO/printlevel.awk -v "statusline=as you like" -v "ttyrows=`tput lines`"

次の動画は \(\frac{(1+2)\times 3}{4}\) という式を作成しているところ。write というコマンドで、一時ファイルにスタックの内容を書き出している。

vim から使うには……

function! RpnLatex()
   let l:rpnedit_path = "YOUR/PATH/TO/rpnedit.sed"
   let l:latexmacro_path = "YOUR/PATH/TO/latexmacro.sed"
   execute "silent !" . "sh -c \"trap 'echo write' 0; cat\" | sed --unbuffered -f " . l:latexmacro_path ." | sed --unbuffered -f " . l:rpnedit_path . " | awk -f YOUR/PATH/TO/printlevel.awk -v \"statusline=--RpnLatex-- press ^D to exit\" -v \"ttyrows=" . screenrow() . "\""
   execute "r!" . 'sed -ne '':a;/\[END_OF_STACK\]$/\!{N; ba};/\[END_OF_STACK\]$/{s/\n\[END_OF_STACK\]$//; h};${g;p}'' rpnedit.tmp'
endfunction
command! Rpn : call RpnLatex()

次の動画は \(\lim_{n\to \infty}\left(1+\frac{1}{n}\right)^{n}\) という式を作成しているところ。 :Rpn でスタック編集を開始。^D で終了すると、スタックの内容が自動的にバッファに挿入される。

スクリプトたち

rpnedit.sed

latexmacro.sed

printlevel.awk

おわり