LaTeX の数式を RPN で編集するページ

このページで、リアルタイムでプレビューしながら LaTeX の数式が編集できます。編集コマンドを打ち込んで対話的に数式を組立てるのです。さっそく下のテキストボックスに 1 2 + 3 frac pop という 6 個のテキストを一つずつ順番に [Enter] し、何が起こるかを観察してみましょうぞ?

デモ

[Page Top]

チュートリアル

しくみ

文字列をテキストボックスに入力すると、そのままスタックに積まれます。いくつも入力すると、どんどん押し込まれていってスタックの層が深くなります。スタックとはそういうもんです。

もし入力された文字列が編集コマンドとしてあらかじめ定義されている文字列(参照)だったなら、スタック中から決まった数の文字列が消費され、新たに作成された文字列がスタックに積まれます。

たとえば \(1+2\) を作成したいなら、まず 12 という 2 つの文字列をスタックに積み、それから + という編集コマンドを入力します。スタックから \(1\) と \(2\) が消費され、\(1+2\) があらたにスタックに積まれます。この作業のために行うキー入力は1⏎2⏎+⏎ です。

ここで 3⏎frac⏎ と入力するとどうなるでしょう。すでにスタックに入っている \(1+2\) と、あらたにスタックに詰め込まれた \(3\) が消費され、\(\frac{1+2}{3}\) ができます。このようにしてスタック中で数式を育ていくことで、頭を破裂させることなく複雑な数式を作ることができます。

テキストボックスの近くにある「スタックにコピー」のボタンを押すと、スタックに入っている LaTeX オブジェクトのソースコードがクリップボードにコピーされます。

処理はすべて、あなたのコンピュータ上で JavaScript によって行われ、あながのコンピュータの外へ情報を送信することはありません。なお数式のプレビューを作成するために MathJax を利用しています。

いわゆる「読まずに済ますには」

+,-,/,>,<,=,^,_,: はそのまま編集コマンドとして使われます。その他ほとんどの編集コマンドは、LaTeX のコマンドから \ を取り除いたものなので覚える必要はなく、機能も推測ができます。非常によく使う編集コマンドで覚えておいたほうがよいものは以下の通りです。詳しくはを見て下さい。

[Page Top]

もっと知る

コマンドとコマンド名

スタックの表示形式

[Page Top]

その他

別名やマクロを作る

編集コマンド一覧

(注意)茶色で表示してある編集コマンド は、AMS LaTeX 用のコマンドを使うことを示しています。緑色で表示してある編集コマンド は、Plain TeX では使えない LaTeX コマンドを使うことを示しています。

[Page Top]

2つのテキストを消費する編集コマンド

+ - ^ _ pm mp times div ast star circ bullet cdot cap cup uplus sqcap sqcup vee lor wedge land setminus wr diamond bigtriangleup bigtriangledown triangleleft triangleright lhd rhd unlhd unrhd oplus ominus otimes oslash odot bigcirc dagger ddagger amalg

< > = : ne neq le leq ge geq prec preceq ll subset subseteq supset supseteq sqsubset sqsupset sqsubseteq sqsupseteq in ni owns vdash dashv succ succeq gg equiv sim simeq cong asymp approx neq doteq propto models perp mid parallel bowtie Join smile frown

leftarrow rightarrow to leftrightarrow Leftarrow Rightarrow Leftrightarrow longleftarrow longrightarrow longleftrightarrow Longleftarrow Longrightarrow Longleftrightarrow leftharpoonup rightharpoonup rightleftharpoons leftharpoondown rightharpoondown rightharpoondown leftrightharpoons hookleftarrow hookrightarrow mapsto longmapsto leadsto

vert | Vert \| backslash uparrow downarrow updownarrow Uparrow Downarrow Updownarrow

sqrtn は \(\displaystyle\sqrt[{\rm Level1}]{{\rm Level2}}\) となります

bigcap bigcup bigsqcup bigvee bigwedge bigodot bigotimes bigoplus biguplus

frac cfrac over atop choose brace brack

sideset は AMS LaTeX の \sideset コマンドをレベル 1 にあるテキストの前に挿入します。(\sideset がついていると ^, _, left^, left_ といった編集コマンドの働きが変わります。\sideset は AMS LaTeX 専用のコマンドです)

left^ left_ はレベル 1 にあるテキストを、レベル 2 にあるテキストの左側の上または下に添字として与えます。

[Page Top]

\{}{} は、\レベル1{レベル3}{レベル2} という文字列を作成します。

1つのテキストを消費する編集コマンド

+- は符号の正負を変えます。++ は符号を + に変えます。-- は符号を -に変えます。pmpm は符号を \(\pm\) に、mpmp は符号を \(\mp\)に変えます。(pm mp は二項演算子\(\pm,\ \mp\) に対応し、2 つのテキストを消費します。)

sqrt sin cos tan sinh cosh tanh csc sec cot coth arcsin arccos arctan exp log ln ker arg deg lg det dim gcd hom max min Pr sum prod coprod int oint lim inf liminf varliminf sup limsup varlimsup projlim injlim varinjlim varprojlim

bigm Bigm biggm Biggm は、レベル 1 にあるテキストの末尾からデリミタを探しはじめ、最初に見つかったデリミタの前にそれぞれの編集コマンドに対応した LaTeX コマンドを挿入します。

() [] \{\} <> .. || |||| は、レベル 1 にあるテキストを、それぞれの編集コマンドに対応した括弧で囲みます。開き括弧か閉じ括弧の片方を . にすることができます。

{} floor ceil // なお {} は LaTeX ソースコードの {} に対応しますので、実際に中括弧を印刷したいなら \{\} を使うべきです

leftright biglbigr BiglBigr bigglbiggr BigglBiggr は、レベル 1 にあるテキストが括弧に入っているとき用です。

forall exists neg partial angle

' '' hat check breve acute grave tilde bar vec dot ddot はアクセント類です。'' はダブル・クオーテーションマークではなく、シングル・クオーテーションマークの 2 連続です

overline underline overrightarrow overleftarrow widehat widetilde overbrace underbrace

bf rm cal sf tt it mathbf mathrm mathcal mathsf mathtt mathit boldsymbol pmb mathscr mathcal mathbb は、レベル 1 にあるテキスト全体の書体を変更します。

displaystyle textstyle scriptstyle scriptscriptstyle

mbox text operatorname

mathord mathop mathbin mathrel mathopen mathclose mathpunct mathinner

decapN はレベル 1 にあるテキストから先頭 N 文字を削除します (デフォルト N=1.)

chopN はレベル 1 にあるテキストの末尾 N 文字を削除します (デフォルト N=1.)

$$ \(\) math は、レベル 1 にあるテキストをインライン数式環境に入れます。「No Implicit environment」が選択されているときのみ正常にプレビューできます。

$$$$ \[\] displaymath equation* equation レベル 1 にあるテキストをディスプレイ数式環境に入れます。「No Implicit environment」が選択されているときのみ正常にプレビューできます。

shoveright shoveleft はレベル 1 にあるテキストを \shoveleft{} または \shoveright{} の中に入れます。これらは、AMS LaTeX の multiline モード用です。

\{} は、\レベル1{レベル2} という文字列を作成します。

[Page Top]

N 個のテキストを消費する編集コマンド

joinNN 個のレベルから N 個のテキストを得て、それを文字列としてつなげます。(デフォルト N=2)

joinwithNN+1 個のレベルから N+1 個のテキストを得て、N+1 番目から 2 番目までを、1 番目をセパレータとして文字列としてつなげます。 (デフォルト N=2)

toRxC arrayRxC matrixRxC pmatrixRxC bmatrixRxC BmatrixRxC vmatrixRxC VmatrixRxC smallmatrixRxCRxC 個のレベルから RxC 個のテキストを得て、\(R\) 行 and \(C\) 列の行列にします。

multline*N multlineNN 個のレベルを消費し、それぞれの環境で囲みます。 (デフォルト N=2)

eqnarray*N eqnarrayNN 個の式を N 個のレベルから集めてきて、 eqnarray 環境の中に入れます。alignment points は自動的には挿入されません。(デフォルト N=2)

eqnarray&*N eqnarray&Neqnarray*N や eqnarrayN と同様ですが、 & を各レベルの = の前後に挿入します。(デフォルト N=2)

eqalignNN 個のレベルから式を集めてきて \eqalign{ } の中に入れます。これは Plain TeX 用です。

gather*N gatherNN 個の式を N 個のレベルから集めて、それをひとつの gather 環境に入れます。

splitN split&N 後者は alignment points を自動挿入します。

align*RxC alignRxC flalign*RxC flalignRxCRxC 個のレベルから式を集めてきて RC 列の行列とし、それを align 環境に入れます。alignment point の自動挿入は起こりません。このページのプレビュー機能は flalign*RxCflalign&RxC には対応していません。

align*&RxC align&RxC flalign*&RxC flalign&RxC は上と同じですが、alignment points を自動挿入します。このページのプレビューは flalign&*RxCflalign&RxC には対応していません。

[Page Top]

略語(ギリシャ文字)

@MAX はスタックの階層数に置き換わりますが、置き換わるタイミングは略語と同じです。これを使って、rolld@MAX⏎ とすればスタック全体にわたる巡回置換を行うことができます。また、@--MAX は「スタックの階層数-1」に置き換わります。これを使って@--MAXtimes:join⏎ とすれば、スタックの全階層をすべて連結できます。

略語は真っ先に展開されるので、たとえ "@MAX と書いても、これはこの文字列を入力した時点でのスタック数に置き換わります。こうした場合、@"MAX を使うと、@MAX という文字列そのものをスタックに入れることができます。この " は、入力時とマクロ展開時の 2 つのタイミングで「はがされる」ので、@"MAX と <<<@""MAX>>> と <<<<<<@"""MAX>>>>>> はまったく同じ結果になります。まったくひどい仕様ですね! これは基本的には「コマンド名の一部として繰り返し回数を書けるようにしよう」という邪悪なアイディアの結果です。しかし、私はこの邪悪なアイディアが邪悪さゆえに気に入っているので、この不便に耐えしのぶことにします。

[Page Top]

スタックの操作

undo 最後の変更をキャンセルする。

savestack すべてのスタックの内容をマクロにまとめ、それに resume という名前をつける。つまり、clear⏎resume⏎ によってスタックを最後に保存した状態に戻せる。

resume は演算子ではなく、たんなる予約された名前であり、savestack オペレータによって使われる。

savestackas savestack と同様だが、レベル 1 以外の全スタックをマクロにして、レベル 1 にある名前を与えて保存する。

collectfromMtoN スタックのレベル LevelM からレベル N をマクロにまとめる。

dropN レベル N からレベル 1 マデヲ消去スル。 (デフォルト N=1.)

pop レベル 1 の内容を入力ボックスにコピーしたうえで、レベル 1 を消去する。レベル 1 の手動編集に有用。(注意! このコマンドはマクロの中で使うと drop と同じ動作になります)

clear すべてのレベルを消去。

nip レベル 1 以外のレベルをすべて消去。

swap レベル 1 とレベル 2 を入れ替える。

dupN レベル N からレベル 1 までN 個のレベルを複製してスタックに積む。(デフォルト N=1)

pickN レベル N をコピーしてスタックに積む (デフォルト N=3.)

unpickN レベル 1 を削除して、削除されたテキストでレベル N+1 を置き換える。(Default N=3.)

rollN レベル N をレベル 1 に移動し, レベル 1 をレベル 2 に移動し、レベル 2 をレベル 3 に移動し……レベル \((N-1)\) をレベル N に移動する。言い換えれば、cyclic permutation (Level1 Level2 ... LevelN) である。(デフォルトは N=3)

rolldN レベル 1 をレベル N に移動し、レベル 2 をレベル 1 に移動し、レベル 3 をレベル 2 に移動し……レベル N をレベル \((N-1)\) に移動する。言い換えれば、 cyclic permutation (LevelN LevelN-1 ... Level1) である。(デフォルトは N=3)

[Page Top]

名前の割り当てにかかわる編集コマンド

sto レベル 1 にある名前に、レベル 2 の内容を割り当てる。

purge レベル 1 にある名前を割り当てから解放する。

purgeall すべての名前の割り当てを解消する。

getdef レベル 1 にある名前に割り当てられているものをスタックに積む。 gets a name from Level 1 and pushes the assigned object.

[Page Top]

マクロ集

以下は、役に立つ(かもしれない)マクロを作ってそれに名前をつけるまでをするマクロ。

\ レベル1にあるテキストの前に \ をつける。たとえば、infty⏎\⏎ で \infty (\(\infty\)) になる。

<<<"<<<"\%swap%join>>>%"\\%sto>>>

\{}  レベル1にあるテキストを単項演算子として機能させる

<<<"<<<"\%swap%join%swap%{}%join>>>%"\{}%sto>>>

sj  レベル2の文字列の前にレベル1の文字列をっくつける(sj は swap join のこと)

<<<"<<<swap%join>>>%"sj%sto>>>

hbox  レベル1を \hbox{} の中身に入れる。

<<<"<<<"\hbox{%swap%}%join3>>>%hbox%sto>>>

puton  レベル3〜1 が順に X A B のとき、AXB を作る。

<<<"<<<roll3%rolld2%join3>>>%"puton%sto>>>

eval  スタックのレベル1に入っている文字列を評価するマクロ(いったん _TMP という名前をつけてから実行している)

<<<"<<<"_TMP%sto%_TMP>>>%"eval%sto>>>

rollall  いちばん深いところにあるスタックをレベル1に移動。(@""MAX は入力時とマクロ展開時の 2 回展開された結果スタック中で @MAX という文字列になる。もっとも、マクロにして名前をつけようとするから面倒なのであって、対話的に打ち込むなら、たんに roll@MAX でよい)

<<<"roll@""MAX%"rollall%sto>>>

rolldall  スタックのレベル1を最も深いところに移動(rollall 参照)。

<<<"rolld@""MAX%"rolldall%sto>>>

applyall  レベル1を除くすべてのスタックに、レベル1に入っっているコマンドを適用。実行途中でスタック数が減ると詰む。レベル 1 を一時的に _TMP に保存。

<<<"<<<"_TMP%sto%@""--MAXtimes:<<<roll@""--MAX%_TMP>>>>>>%"applyall%sto>>>

-> <- <-> => <= <=> --> <-- <--> ==> <== <==>  矢印で 2 つのレベルをつなげる

<<<"<<<"\rightarrow %swap%join3>>>%"->%sto>>>
<<<"<<<"\leftarrow %swap%join3>>>%"<-%sto>>>
<<<"<<<"\leftrightarrow %swap%join3>>>%"<->%sto>>>
<<<"<<<"\Rightarrow %swap%join3>>>%"=>%sto>>>
<<<"<<<"\Leftarrow %swap%join3>>>%"<=%sto>>>
<<<"<<<"\Leftrightarrow %swap%join3>>>%"<=>%sto>>>
<<<"<<<"\longrightarrow %swap%join3>>>%"-->%sto>>>
<<<"<<<"\longleftarrow %swap%join3>>>%"<--%sto>>>
<<<"<<<"\longleftrightarrow %swap%join3>>>%"<-->%sto>>>
<<<"<<<"\Longrightarrow %swap%join3>>>%"==>%sto>>>
<<<"<<<"\Longleftarrow %swap%join3>>>%"<==%sto>>>
<<<"<<<"\Longleftrightarrow %swap%join3>>>%"<==>%sto>>>

履歴

---- 2020-6-6(Sat) @MAX 表記の導入。
---- 2020-6-7(Sun) マクロとtimes:についてのバグフィックス。
0.06 2020-6-8(Mon) 矢印演算子の別名を削除(同様のものをマクロ集に追加)。 
0.07 2020-6-11(Thu) MathJax のバージョンを 3.0 に変更
                    デザインの一部変更
                    プレビューのときに 3 種類のオプションを選べるようにした。
                    mathscr,mathcal,mathbb,mathfrak 追加