2017-4-12
LaTeX の数式を編集するのに便利な rpnedit.sed 用のマクロ集。(実例は「スタックを使って LaTeX の数式を編集せむ」参照)。
sed --unbuffered -f latexmacro.sed | sed --unbuffered -f rpnedit.sed
のように使用する。
(注) \| および s コマンドの m オプションを利用しているので GNU sed のみ対応。e コマンドは使っていないので、そこのあたりは安心。
現在のスタック内容の表示 キーボードからの入力⏎ 新しいスタックの内容
\[1+2\]
1 2 +⏎ 1+2
\[\frac{1}{2}\]
1 2 frac⏎ \frac{1}{2}
\[\frac{1}{2+3}\]
1⏎ 1 2⏎ 1 2 3⏎ 1 2 3 +⏎ 1 2+3 frac⏎ \frac{1}{2+3}
\[\lim_{n\to \infty}\left(1+\frac{1}{n}\right)^{n}\]
1⏎ 1 1⏎ 1 1 n⏎ 1 1 n frac⏎ 1 \frac{1}{n} +⏎ 1+\frac{1}{n} ()⏎ (1+\frac{1}{n}) leftright⏎ \left(1+\frac{1}{n}\right) n⏎ \left(1+\frac{1}{n}\right) n ^⏎ \left(1+\frac{1}{n}\right)^{n} n⏎ \left(1+\frac{1}{n}\right)^{n} n \infty⏎ \left(1+\frac{1}{n}\right)^{n} n \infty lim⏎ \lim_{n\to \infty}\left(1+\frac{1}{n}\right)^{n}
\[\left(\begin{matrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{matrix}\right)\]
1 2 3 4 5 6 ->(2x3) \left(\begin{matrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{matrix}\right)
\[1{,}234{,}567.1234\]
1234567.1234 insert{,}every3digits 1{,}234{,}567.1234
a b +⏎ a+b
このたぐいのマクロには、+ - / > < がある。
\cdot のような二項演算子も、同様にコマンドが定義されている。
a b cdot⏎ a\cdot b
このたぐいは
pm mp div times cdot sim simeq equiv
parallel perp models approx propto neq geq leq ll gg
in notin ni subset supset subseteq supseteq cap cup
がある。これらのマクロ名は、それに関連する LaTeX のコマンド名と同じである。
なお、ここに定義されていない二項演算子をはさんで 2 つのレベルの内容をつなげるには、3 つのレベルを消費する rpnedit.sed のコマンド putbetween を用いて
a b c putbetween⏎ acb
のようにする。なお、putbetween は :pb という略記がマクロとして定義されている。
マクロ frac は次のようにはたらく。
a b frac⏎ \frac{a}{b}
frac は :f と略記できる。
レベル1 の内容の前方に \sin をつけるには、sin マクロを使って、
a sin⏎ \sin a
のようにする。このように使うことができるマクロには、sin cos tan sinh cosh tanh csc sec cot coth arccos arctan forall exists がある。
log ln マクロも同様に使うことができる。対数の底を明示したい場合は、2 つのレベルを消費するマクロ logr を用いて
16 2 logr⏎ \log_{2}16
のようにする。
sqrt と sqrtn は次のように働く。
a sqrt⏎ \sqrt{a}
a n sqrtn⏎ \sqrt[n]{a}
' は次のように働く。'' や ''' なども同様。
a '⏎ a'
+- マクロは、レベル1 に入っている文字列に対して次のように働く。
a +-⏎ -a
+a +-⏎ -a
-a +-⏎ a
一方、(-)マクロと(+)マクロは、また、(pm)マクロと(mp)マクロは、それぞれレベル1 に入っている文字列先頭に - または +、 \pm または \mp を挿入する。
() マクロは、レベル 1 全体を () で囲む。
a ()⏎ (a)
同じように使えるマクロには[] () \{\} || がある。括弧文字のうち左右の一方を . (ピリオド)にした.) (. .} {. も同様に使うことができる。また、<> は、\langle \rangle に展開される。LaTeX で { } は括弧ではなく特別な用途で使われるが、これもたんに {} マクロを打てばよい。
これらのコマンドのすぐ後にN(1〜99の整数)をつけたコマンドは、N 個レベルを括弧で囲む。これは、数式が複数行に及ぶときに、スタックの各レベルをスクリーンエディタの各行と見立てて編集するときに役立つ。
a b c ()3 (a b c)
なお、\(\) や \[\] や $$ や $$$$ については、「環境」の項目で述べる。
任意の文字(または文字列)で、スタックのレベル 1 にある列を囲むためには、3 つのレベルを消費する rpnedit.sed のコマンド bracket を使って、
a ((( ))) bracket⏎ (((a)))
のようにする。
括弧の中身の背が高いような場合、括弧を上下に拡大したいことがある。この場合、マクロ leftright (略記は :lf)を用いて、
(a) leftright⏎ \left(a\right)
とする。leftright マクロは、\{\} や \langle \rangle で囲まれた文字列に対しても期待通りに働く。
leftrightN(Nは1〜99までの整数)は、N個のレベルを囲む括弧に対して働く。
(a b c) leftright3 \left(a b c\right)
レベル2 とレベル1 に入っている文字列を連結するには、rpnedit.sed に定義されている join コマンドを用い、
a b join⏎ ab
のようにする。join という名前が長いと思う人のために :j という略記がマクロとして用意されている。
N-1 回連続して join を実行すると、N 個のスタックの内容が連結されるが、これは Njoin (ただし N は 1<N<100 の整数)というマクロを打鍵して行うことができる。Njoin は :Nj と略記できる。 前に整数をつけることができるコマンドがいくつかあるが、これらはみなコマンドを繰り返し実行するためのものである。
a b c 2join⏎ abc
一方、joinN は、N 個のレベルをつなげる。たとえば join3(または :j3)は 2join と等価である。
a b c join3⏎ abc
sjoin マクロは、レベル2 とレベル1 を入れ替えてから連結する。つまり、レベル1 の後ろに、レベル2 がつながることになる。これも Nsjoin の形で、N 層のレベルを結合する。sjoin の略記は :sj で、Nsjoin の略記は :Nsj。
a b sjoin ba
sjoin も join と同様、Nsjoin(1<N<100) の形で、連続して実行できる。sjoinN についても、Njoin と同様。
,(カンマ)&(アンパサンド)は、レベル2 にある文字列とレベル1 にある文字列を、自分自身をはさんで連結するマクロとして働く。
a b ,⏎ a,b
a b &⏎ a&b
N, は カンマコマンドをN回実行し、,N は、N 個のレベルをカンマでつなぐ。& も同様。
[SPACE]は単体で使われるとマクロとして働き、空白文字をはさんでレベル1 とレベル2 を結合する。(スペース文字をリテラルとして入力する場合は "[SPACE]" または "[SPACE] とする)。N を前置または後置できることは、カンマ・コマンド同様。
a b [SPACE]⏎ a[SPACE]b
, & [SPACE] の各マクロ名は、余分な空白をつけたり、結合を繰り返したりするために次の書き方が許されている。
たとえば
a b c ,\[SPACE]3 a,\[SPACE]b,\[SPACE]c
ヒント: a と b から「a & = & b」という文字列を作成したい場合(eqnarray 環境内でよくある)は、= をマクロではなく文字列"=" として入力し、次のようにすると楽。
a = b [SPACE]&[SPACE]3 a[SPACE]&[SPACE]=[SPACE]&[SPACE]b
LaTeX の \\ はデリミタの一種と考えられるが、これについては「環境」の項目で別途述べる。
rpnedit.sed に定義されている decap コマンドは前から 1 文字を削除。chop コマンドは後ろから 1 文字を削除する。strip コマンドは、最初 1 文字と最後 1 文字を削除する(これは、括弧をはがすのに有用である)。
abc decap bc
abc chop ab
abc strip b
Ndecap Nchop Nstrip (ただし 0<N<100) は、それぞれ decap コマンド、chop コマンド、strip コマンドを N 回連続して呼び出すマクロである。
decapstring は、それが可能なら、レベル2 の先頭からレベル1 にある文字列を取り去る。また、chopstring は、それが可能なら、レベル2 の末尾からレベル1 にある文字列を取り去る。これらは、rpnedit.sed に定義されたコマンドである。
abcde ab decapstring cde
abcde de chopstring abc
insert[STRING]every[N]digits マクロは、レベル1 にある整数を下から [N] 文字ずつ数えて、[STRING] を挿入する。レベル1 が小数の場合、整数部にのみ適用される。
31415926.5359 insert,every3digits 31,415,926.1234556
とくに、:c3 は insert{,}every3digits を意味する。
12345.6789 :c3 12{,}345.6789
文字列に対する削除、挿入、置換、分割をスクリーン上で目視しながら行うために、rpnedit.sed には delete insert replace split の各コマンドが用意されている。いずれも、削除、挿入、置換、分割する場所を示すために [SPACE]と @ からなる文字列を用いる。
mathrm mathbf mathbb mathcal mathfra bm マクロは以下のように働く。
a mathrm \mathrm{a}
hat breve grave bar dot check acute tilde ddot vec
overline nunderline widehat widetilde overbrace underbrace
overrightarrow underrightarrow overarrow mathit
の各マクロも同様である。
任意の LaTeX コマンドに対して \コマンド名{適用範囲} のように展開するには、\{} マクロを用いる。
a hoo \{} \hoo{a}
rm bf it sf sl sc tt gt mc の各マクロは以下のように働く。
a rm {\rm[SPACE]a}
任意の LaTeX コマンド(Plain TeX コマンド?)に対して {コマンド名[SPACE]適用範囲} のように展開するには {\} マクロを用いる。
a hoo {\} {\hoo[SPACE]a}
^(サーカムフレックス)マクロと_(アンダーバー)マクロは、それぞれ以下のように働く。
a b ^ a^{b}
a b _ a_{b}
レベル 1 にある文字列が \sin \cos \tan で始まる場合に限り、^ マクロは次のように働く。
\sin a b ^ \sin^{b} a
uleft マクロは左上に小さな文字を添えるために用いることができ、dleft マクロは左下に小さな文字を添えるために用いることができる。
a b uleft {}^{b}a
a b dleft {}_{b}a
次のようなケースでも期待通りの結果を得る。
{}^{b}a c dleft {}_{c}^{b}a
substitute マクロ(略記は :sub)は、レベル3 にある文字列の中に、レベル2 にある文字列があるかどうか前から探索し、発見するとそれをレベル1 の文字列で置き換える。この置換は 1 度だけしか行われない。
abcdabcd bc xx substitute axxdabcd
substitutelast マクロ(略記は :subl)は、レベル3 にある文字列の中に、レベル2 にある文字列があるかどうか後ろから探索し、発見するとそれをレベル1 の文字列で置き換える。
abcdabcd bc xx substitute abcdaxxd
substituteall マクロ(略記は :suba)は、レベル3 にある文字列の中から、レベル2 にある文字列をすべて発見し、それらをレベル1 の文字列で置き換える。
abcabcabc a (a) substituteall (a)bc(a)bc(a)bc
なお、rpnedit.sed には探索を使い文字列の分割を行うコマンドが 6 つ定義してある。
rpnedit.sed には 0から99までの整数を扱うコマンドがいくつか定義してある。
1sub は、レベル1 にある整数(1から99)から 1 を引き、1add はレベル1 にある整数(0から98)に 1 をたす。
50 1sub 49
50 1add 51
divby は、(レベル2÷レベル1) を越えない最大の整数を得る。レベル1、2 とも 0 以上 99 以下である必要がある。
7 2 divby 3
countchars はレベル1 の文字数を数える(0以上99以下)。
abcde countchars 5
以下の略記が入力される文字列の一部(あるいは全部)をなしている場合、それぞれに対応したギリシャ文字に展開される。たとえば、\sin[SPACE]:a[SPACE] という文字列は、\sin[SPACE]\alpha[SPACE] に展開されてからスタックに積まれる。これらは latexmacro.sed に定義されたマクロである。
コマンドやマクロの略記は、それだけを文字列として入力しなければ展開されなかったが、これらはそうではない。文字列の一部に使われた場合も展開する。
略記末尾のスペース文字は必須である。
LaTeX で複数の数式を別行立ての数式として並べるとき、たとえば eqnarray 環境などを使う。eqnarray 環境の中に置く 1 本ずつの数式は、それぞれを \\ で区切ることになっている。\\Nマクロ(1<N<100)はレベル N からレベル2 までに収納されている文字列末尾に \\ を付加する。これは、スタックの各レベルをスクリーンエディタの各行に見立てたもので、write コマンドなどでスタックを書き出し、そのままエディタで編集中の LaTeX ソースファイルに貼り付けることを想定している。
a b c \\3 a\\ b\\ c
なお、整数が後ろにつかないただの \\ マクロは、レベル1 と レベル2 を自身をはさんで、ひとつのレベルに結合する。このとき \\ の前後には、適宜スペース文字を置くことができる。
env マクロは、レベル2 の前後に新たなレベルを挿入し、それらに \begin{...} と \end{...} を入れる。... の部分にはレベル1 に入っている文字列が使われる。
a b env \begin{b} a \end{b}
env は env{} と書いても同じ。
env{}{} マクロは、次のように働く。
a b c env{}{} \begin{b}{c} a \end{b}
N 個のレベルを \begin{...}\end{...} で囲みたい場合は、envN (ただし 0<N<100)マクロを使う。これは、env{}N でも同じ。
a1\\ a2\\ a3 b env3 \begin{b} a1\\ a2\\ a3 \end{b}
N 個のレベルを \begin{...}{...}\end{...} で囲みたい場合は env{}{}N(ただし 0<N<100)マクロを使う。
a1\\ a2\\ a3 b1 b2 env{}{}3 \begin{b1}{b2} a1\\ a2\\ a3 \end{b1}
スタック全体を \begin{...}\end{...} で囲みたい場合は、envsマクロを使う。
スタック全体を \begin{...}{...}\end{...} で囲みたい場合は、2envsマクロを使う。
数式を $ と $ で囲むには、$$ マクロを使う。
a $$ $a$
\(\) コマンドも同じ要領。
a \(\) \(a\)
\begin{math}\end{math} は、そのための特別なマクロがないので "math" という文字列と env マクロを用いる。
a math env \begin{math} a \end{math}
$$$$ コマンドは、レベル1 を $$ $$ で囲む。
a $$$$ $$a$$
\[\] コマンドも同様である。
a \[\] \[a\]
LaTeX は $$ $$ や \[ \]の中には、複数の数式を区切って入れることができないが、ソースの見やすっさのために 1 本の数式が複数の連続したレベルを使って書かれることがある。こうした使い方をするときは、$$$$N や \[\]N といった書き方により N 個のレベルを囲うと便利である。
1+2 =3 $$$$2 $$ 1+2 =3 $$
1+2 =3 \[\]2 \[ 1+2 =3 \]
\begin{eqnarray*}\end{eqnarray*} 用には特別なマクロがないので、"eqnarray*" という文字列と env マクロを用いる。
a eqnarray* env \begin{eqnarray*} a \end{eqnarray*}
a\\ b\\ c eqnarray* env3 \begin{eqnarray*} a\\ b\\ c \end{eqnarray*}
eqnarray* という文字列は :eqn* と略記できるが、これが他の文字列の一部として使われた場合は展開されない。
equation 環境、eqnarray 環境ともに、特別なマクロはないので
a equation env \begin{equation} a \end{equation}
a\\ b\\ c equearray env3 \begin{eqnqrray} a\\ b\\ c \end{eqnarray}
のようにする。
equation という文字列は、:eq と略記でき、eqnarray という文字列は :eqn と略記できるが、いずれも他の文字列の一部に使われた場合は展開されない。
nonumber マクロは、レベル1 にある文字列の末尾に \nonumber を付加する。レベル1 にある文字列が \\ で終わっている場合は、\\ の前に \nonumber という文字列が挿入される。
a nonumber a\nonumber
a\\ nonumber a\nonumber\\
lim マクロは、次のように働く。
a b c d lim \lim_{b \to c}^{d}a
sumマクロとprodマクロは次のように働く。
a b c d sum \sum_{b=c}^{d}a
a b c d prod \prod_{b=c}^{d}a
int マクロと iint マクロは次のように働く。
f(x) x 0 1 int \int_{0}^{1} f(x) dx
f(x) x iint \int f(x) dx
->MxN (ただし 0<M<100, 0<N<100)マクロは、スタックから M×N 個を消費して、M 行 N 列に並べる。array環境や matrix環境の中で用いるのに便利。
1 2 3 4 5 6 ->2x3 1 & 2 & 3\\ 4 & 5 & 6
->[Char1]MxN[Char2] マクロはスタックから MxN 個を消費し、matrix 環境用を用いて MxN 行列を作る。
1 2 3 4 5 6 ->(2x3) \left(\begin{matrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{matrix}\right)
progression マクロは、任意の文字を連続した整数に順次置き換える。
a_N N 1 5 progression a_1 a_2 a_3 a_4 a_5
スタック操作コマンドは rpnedit.sed に定義されているが、その略記がマクロとなっている。
おわり