HOME

latexmacro.sed

2017-4-12

これは何?

LaTeX の数式を編集するのに便利な rpnedit.sed 用のマクロ集。(実例は「スタックを使って LaTeX の数式を編集せむ」参照)。

sed --unbuffered -f latexmacro.sed | sed --unbuffered -f rpnedit.sed

のように使用する。

ダウンロード

latexmacro.sed (Ver.0.74)

(注) \| および 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

2 項演算子のためのマクロ

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 項演算子のためのマクロ

レベル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

のようにする。

sqrtsqrtn は次のように働く。

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]と @ からなる文字列を用いる。

LaTeX コマンドの適用範囲の限定する

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]:alpha[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 を自身をはさんで、ひとつのレベルに結合する。このとき \\ の前後には、適宜スペース文字を置くことができる。

begin ... end による環境設定

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 に定義されているが、その略記がマクロとなっている。

おわり