#!/bin/sed --unbuffered -f
#
# Edit LaTeX equations interactively with a stack
# Usage:
# sed --unbuffered -f latexmacro.sed | sed --unbuffered -f rpnedit.sed
# Notice:
# GNU sed only. ( \| and m flag on s command are used)
# The same version of rpnedit.sed is required.
# Example:
# For "\frac{1}{2}", type "1[Enter]2[Enger]frac[enter]";
# "1+2", "1[Enter]2[Enter]+[Enter]";
# "(a)", "a[Enter]()[enter]"; etc.
#
# latexmacro.sed (ver. 0.76) --- a collection of macros for rpnedit.sed
# Copyright (C) 2016 kabipanotoko
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
##
/^<<<$/ {b}
/^>>>$/ {b}
##### some stuff for realtime preview
# in "realtime mode", ";;" is added to every input line
s/^realtime mode$/postfix:;;/
s/^realtime off$/postfix:/
# store the postfix to the hold space
/^postfix:/ {
s/^postfix:\([[:print:]]*\)/\1/
h
s/.*//
b
}
# the postfix which have stored in the hold space is added
# (except to "write" or "write1")
/^write1\{0,1\}$/ ! {
x
H
x
s/\n\([[:print:]]*\)/\1/
}
# when an input line ends with ";;", "write1" command will be issued
s/;;$/\nwrite1/
##### only for commands outside math eivironments
s/^\(part\|chapter\|section\|subsection\|subsubsection\)$/"\&}"\
swap\
"}"\
join\
join/mg
####### abbreviations
s/^:w$/write/
s/^:wl1$/write1/
s/^:q$/quit/
s/^:\([1-9]\{0,1\}\)j$/\1join/mg
s/^:j\([1-9]\{0,1\}\)$/join\1/mg
s/^:\([1-9]\{0,1\}\)sj$/\1sjoin/mg
s/^:\([1-9]\{0,1\}\)d$/\1drop/mg
s/^:d\([1-9]\{0,1\}\)$/\1drop/mg
s/^:s$/swap/mg
s/^:c$/clear/mg
s/^:u$/undo/mg
s/^:f$/frac/mg
s/^:lr$/leftright/mg
s/^:sub$/substitute/mg
s/^:suba$/substituteall/mg
s/^:eq$/"equation"/mg
s/^:eqn$/"eqnarray"/mg
s/^:eqn*$/"eqnarray*"/mg
s/^:pb$/putbetween/mg
s/^:ora/overrightarrow/mg
s/^:ola/overleftarrow/mg
s/^:ura/underrightarrow/mg
s/^:ula/underleftarrow/mg
s/^:c3$/insert{,}every3digits/mg
####### some knotty stuff
# A B C lim → \lim_{B\to C}A
s/^lim$/"\\to "\
putbetween\
"\\lim"\
swap\
_\
swap\
join/mg
# A B C D sum → \sum_{B=C}^{D}A
# A B C D prod → \prod_{B=C}^{D}A
s/^\(sum\|prod\)$/4\
rolld\
"="\
putbetween\
"\\\1"\
swap\
_\
3\
roll\
^\
swap\
" "\
putbetween/mg
# f(x) x 0 1 int → \int_{0}^{1}[SPACE]f(x)[SPACE]dx
# f(x) x iint → \int[SPACE]f(x)[SPACE]dx
s/^int$/"\\int"\
3\
roll\
_\
swap\
^\
3\
roll\
\
swap\
"d"\
swap\
join\
/mg
#
s/^iint$/"d"\
swap\
join\
\
"\\int"\
swap\
/mg
##### more knotty stuff
# 1234567.1234 insert{,}every3digits → 1{,}234{,}567.1234
s/^insert\([[:print:]]*\)every\([[:digit:]]\{1,2\}\)digits$/dup\
"."\
include?\
___"."___splitb___swap\
___""___swap\
ifelse\
array->procedure\
1\
ntimes\
dup\
"\1"\
join\
___"\1"___splitb___swap___\2___backsplitn___"\1"___putbetween___swap___join\
array->procedure\
3\
roll\
countchars\
\2\
divby\
ntimes\
"\1"\
chopstring\
"\1"\
decapstring\
swap\
join/mg
###### for arrays and matrices
# (idn3) → \left(\begin{matrix}
# 1 & 0 & 0\\
# 0 & 1 & 0\\
# 0 & 0 & 1
# \end{matrix}\right)
s/^\([[(]\)idn\([1-9][0-9]*\)\([])]\)$/___"1"___"0"___array->procedure___\2___ntimes\
array->procedure\
\2\
1sub\
ntimes\
"1"\
___***" \& "***putbetween___array->procedure___\2___1sub___ntimes___rollds\
array->procedure\
\2\
ntimes\
___rolls___"\\\\"___join\
array->procedure\
\2\
ntimes\
chop\
chop\
"\\left\1\\begin{matrix}"\
\2\
1add\
rolld\
"\\end{matrix}\\right\3"/mg
# make a MxN matrix (for matrix environment)
# 1 2 3 4 5 6 ->(2x3) → \left(\begin{matrix}
# 1 & 2 & 3\\
# 4 & 5 & 6
# \end{matrix}\right)
s/^->\([[:print:]]\)\([1-9][0-9]\{0,1\}\)x\([1-9][0-9]\{0,1\}\)\([[:print:]]\)$/->\2x\3\
\\left\1\\begin{matrix}\
\2\
1add\
rolld\
\\end{matrix}\\right\4/mg
# a1 a2 a3 b1 b2 b3 2 3 ->2x3 → a1 & a2 & a3\\
# b1 & b2 & b3
s/^->\([1-9][0-9]\{0,1\}\)x\([1-9][0-9]\{0,1\}\)$/***___" \& "___putbetween***array->procedure***\2***1sub***ntimes***rollds\
array->procedure\
\1\
ntimes\
"rolls"\
\1\
ntimes\
___\1___roll___"\\\\"___join\
array->procedure\
\1\
1sub\
ntimes\
\1\
roll/mg
# a_n n 1 3 progression → a_1 a_2 a_3
s/^progression$/2\
pick\
sub\
1add\
rollds\
___1add___3___dupn___1sub___3___rolld___splitba___4___rolld___drop___3___rolld___swap___join___join___4___rolld\
array->procedure\
rolls\
ntimes\
drop\
drop\
drop/mg
##### calculation
# addition
s/^add$/___"1add"___swap___ntimes\
array->procedure\
1\
ntimes/mg
# subrraction
s/^sub$/___"1sub"___swap___ntimes\
array->procedure\
1\
ntimes/mg
####### abbreviations for the Greek chars
s/:a /\\alpha /g; s/:A /A/g
s/:b /\\beta /g; s/:B /B/g
s/:g /\\gamma /g; s/:G /\\Gamma /g
s/:d /\\delta /g; s/:D /\\Delta /g
s/:e /\\epsilon /g; s/:E /E/g
s/:ve /\\varepsilon /g
s/:z /\\zeta /g; s/:Z /Z/g
s/:et /\\eta /g; s/:Et /H/g
s/:th /\\theta /g; s/:Th /\\Theta /g
s/:vth /\\vartheta /g
s/:i /\\iota /g; s/:I /I/g
s/:k /\\kappa /g; s/:K /K/g
s/:l /\\lambda /g; s/:L /\\Lambda /g
s/:m /\\mu /g; s/:M /M/g
s/:n /\\nu /g; s/:N /N/g
s/:x /\\xi /g; s/:X /\\Xi /g
s/:o /o/g; s/:O /O/g
s/:p /\\pi /g; s/:P /\\Pi /g
s/:vp /\\varpi/g
s/:r /\\rho /g; s/:R /P/g
s/:vr /\\varrho/g
s/:s /\\sigma /g; s/:S /\\Sigma /g
s/:vs /\\varsigma /g
s/:t /\\tau /g; s/:T /T/g
s/:u /\\upsilon /g; s/:U /\\Upsilon /g
s/:ph /\\phi /g; s/:Ph /\\Phi /g
s/:vph /\\varphi /g
s/:c /\\chi /g; s/:C /X/g
s/:ps /\\psi /g; s/:Ps /\\Psi /g
s/:o /\\omega /g; s/:O /\\Omega /g
####### math operators of LaTeX
# A sin → \sin A
# also: sin cos tan sinh cosh tanh csc sec cot coth arccos arctan
s/^\(log\|ln\|sin\|cos\|tan\|sinh\|cosh\|tanh\|csc\|sec\|cot\|coth\|arccos\|arctan\|exp\)$/\\&\
swap\
" "\
putbetween/mg
# A B logr → \log_{B}A
s/^logr$/"\\log"\
swap\
_\
swap\
join/
# A sqrt → \sqrt{A}
s/^sqrt$/"&"\
\\{}/mg
# A B sqrtn → \sqrt[B]{A}
s/^sqrtn$/[]\
"\\sqrt"\
swap\
join\
swap\
{}\
join/mg
# A ' → A'
# A '' → A''
# ... ...
s/^\(''*\)$/&\
join/mg
# a pm → \pm a
# a mp → \mp a
s/^(\(pm\|mp\))$/"\\\1 "\
swap\
join/mg
# a (+) → +a
# a (-) → -a
s/^(\([+-]\))$/"\1"\
swap\
join/mg
# A +- → -A
# +A +- → -A
# -A +- → A
s/^+-$/dup\
"+"\
^match?\
over\
"-"\
^match?\
___\
___"@"___delete___"-"___swap___join\
___"@"___delete\
___"-"___swap___join\
ifif\
array->procedure\
1\
ntimes/mg
# A B + → A+B
# A B [SPACE]+[SPACE] → A[SPACE]+[SPACE]B など
# also: + - / = > <
s/^[-+/=><]$/&\
putbetween/mg
# A B times → A\times B など
# also: 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
s/^\(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\)$/\\& \
putbetween/mg
# A B frac → \frac{A}{B}
s/^frac$/\\frac\
3\
roll\
{}\
3\
roll\
{}\
join\
join/mg
####### 書体 #######
# LaTeX 的な書き方 A mathrm → \mathrm{a} など
# ほか mathrm mathbf mathbb mathcal mathfra bm
s/^\(mathrm\|mathbf\|mathbb\|mathcal\|mathfra\|bm\)$/"&"\
\\{}/mg
# TeX 的な書き方 A rm → {\rm A} など
# rm bf it sf sl sc tt gt mc
s/^\(rm\|bf\|it\|sf\|sl\|sc\|tt\|gt\|mc\)$/"&"\
{\\}/mg
####### 文字修飾 #######
# 1文字を装飾 A hat → \hat{A}
# ほか hat breve grave bar dot check acute tilde ddot vec
s/^\(hat\|breve\|grave\|bar\|dot\|check\|acute\|tilde\|ddot\|vec\)$/&\
\\{}/mg
# 1文字以上を装飾 A overline → \overline{A}
# ほか overline nunderline widehat widetilde overbrace underbrace
# overrightarrow overleftarrow underrightarrow underleftarrow mathit
s/^\(overline\|underline\|widehat\|widetilde\|overbrace\|underbrace\|overrightarrow\|underrightarrow\|mathit\)$/&\
\\{}/mg
####### 添字・累乗 #######
# 累乗・右上つき A B ^ → A^B
# sin,cos,tan について "\sin A" B ^ → \sin^{B} A
s/^\^$/over\
"\\sin"\
^match?\
3\
pick\
"\\cos"\
^match?\
or\
3\
pick\
"\\tan"\
^match?\
or\
___swap___" @"___split___swap___3___roll___{___}___bracket___"^"___putbetween___swap___join\
___{___}___bracket___"^"___putbetween\
ifelse\
array->procedure\
1\
ntimes/mg
# 右下つき A B _ → A_{B}
s/^_$/{}\
"_"\
putbetween/mg
# 左上つき A B uleft → {}^{B} A
# {}_{B}A C uleft→ {}_{B}^{C}A
s/^uleft$/over\
"{}_"\
^match?\
___swap___"{}"___splita___2___roll___3___roll___"{"___"}"___bracket___"^"___putbetween___swap___join\
___"{"___"}"___bracket___"{}"___swap___"^"___putbetween___swap___join\
ifelse\
array->procedure\
1\
ntimes/
# 左下つき A B dleft → {}_{B} A
# {}^{B}C D dleft → {}^{B}_{D}C
s/^dleft$/over\
"{}^"\
^match?\
___swap___"{}"___splita___2___roll___3___roll___"{"___"}"___bracket___"_"___putbetween___swap___join\
___"{"___"}"___bracket___"{}"___swap___"_"___putbetween___swap___join\
ifelse\
array->procedure\
1\
ntimes/
####### 囲う #######
# 1 2 3 4 5 a b wrap5 → a 1 2 3 4 5 b
s/^wrap$/wrap1/mg
s/^wrap\([1-9][0-9]\{0,1\}\)$/rollds\
\1\
1add\
rolld\
rolls/mg
#(参考)a b c bracket → bac
####### 環境 #######(begin end を使った環境の作成)
# 環境1 aN a(N-1) ... a2 a1 B envN → \begin{B} aN ... a1 \end{B}
# env は env1 に同じ
# DeepestLevel ... Level1 B envs → \begin{B} DeepestLevel ... Level1 \end{B}
s/^env\({}\)\{0,1\}$/env1/mg
s/^env\({}\)\{0,1\}\([1-9][0-9]\{0,1\}\)$/dup\
begin\
\2\
1add\
1add\
rolld\
end/mg
s/^envs\({}\)\{0,1\}$/dup\
begin\
depth\
rolld\
end/mg
# 環境2 aN a(N-1) ... a2 a1 B1 B2 2envN → \begin{B1}{B2} aN ... a1 \end{B1}
# 2env は 2env1 に同じ
# DeepestLevel ... Level1 B1 B2 envs →
# \begin{B1}{B2} DeepestLevel ... Level1 \end{B1}s/^2env$/2env1/mg
s/^env{}{}$/env{}{}1/mg
s/^env{}{}\([1-9][0-9]\{0,1\}\)/swap\
dup\
end\
3\
rolld\
begin\
swap\
{}\
join\
\1\
1add\
1add\
rolld/
s/^envs{}{}$/swap\
dup\
end\
3\
rolld\
begin\
swap\
{}\
join\
depth\
rolld/
# A begin → \begin{A}
s/^begin$/"&"\
\\{}/mg
# A end → \end{A}
s/^end$/"end"\
\\{}/mg
####### 数式モードの略記 ######
# 番号なしディスプレイ
# A \[\] → \[ A \]
# A $$$$ → $$A$$
# A $4 → $$A$$
#\[ \] で囲む。
s/^\\\[\\\]$/\\[\
\\]\
3\
roll\
putbetween/mg
#\[ \] で囲む。\[\]3 で 3 行をかこむ
s/^\\\[\\\]\([1-9][0-9]\{0,1\}\)$/"\\["\
"\1"\
1add\
rolld\
"\\]"\
/mg
# $$ $$ で囲む。
s/^\$\$\$\$$/"$$"\
"$$"\
bracket/mg
# $$$$3 で 3 行をかこむ
s/^\$\$\$\$\([1-9][0-9]\{0,1\}\)$/"$$"\
"\1"\
1add\
rolld\
"$$"\
/mg
# (参考) A displaymath env
# → \begin{displaymath} A \end{displaymath}
# 番号つきディスプレイ
# (参考)
# A equation env → \begin{equation} A \end{equation}
# A B C \\3 eqnarray env → \begin{eqnarray} A\\ B\\ C \end{eqnarray}
# 番号の非表示
# A nonumber → A\nonumber
# A\\ nonumber → A\nonumber\\
s/^nonumber$/dup\
"\\\\"\
match$?\
___"\\\\"___splitblast___"\\nonumber"___putbetween\
___"\\nonumber"___join\
ifelse\
array->procedure\
1\
ntimes/mg
# インライン
# A \(\) → \(A\)
# A $$ → $A$
s/^\\(\\)$/\\(\
\\)\
bracket/mg
s/^\$\$$/"$"\
"$"\
bracket/mg
# (参考) A "math" env → \begin{math} A \end{math}
####### コマンドとその適用範囲 #######
# LaTeX コマンドと適用範囲一般 A B \{} → \B{A}
s/^\\{}$/"\\"\
swap\
join\
swap\
{}\
join/mg
# TeX コマンドと適用範囲一般 A B {\} → {\B A}
s/^{\\}$/"\\"\
swap\
join\
swap\
" "\
putbetween\
{}/mg
####### arrows
# <- → \leftarrow[SPACE]
# <-- → \longleftarrow[SPACE]
# -> → \rightarrow[SPACE]
# --> → \longrightarrow[SPACE]
# <= → \Leftarrow[SPACE]
# <== → \Longleftarrow[SPACE]
# => → \Rightarrow[SPACE]
# ==> → \Longrighitarrow[SPACE]
# <-> → \leftrightarrow[SPACE]
# <--> → \longleftrightarrow[SPACE]
# <=> → \Leftrightarrow[SPACE]
# <==> → \Longleftrightarrow[SPACE]
s/^<-$/\\leftarrow /mg
s/^<--$/\\longleftarrow /mg
s/^->$/\\rightarrow /mg
s/^-->$/\\longrightarrow /mg
s/^<=$/\\Leftarrow /mg
s/^<==$/\\Longleftarrow /mg
s/^=>$/\\Rightarrow /mg
s/^==>$/\\Longrighitarrow /mg
s/^<->$/\\leftrightarrow /mg
s/^<-->$/\\longleftrightarrow /mg
s/^<=>$/\\Leftrightarrow /mg
s/^<==>$/\\Longleftrightarrow /mg
####### parentheses
# A () → (A)
# A B C ()3 → (A B C)
# A (. → (A.
# also: [] {} () || [. .] {. .} (. .) |. .|
s/^<>\(\|[1-9][0-9]\{0,1\}\)/\\langle \\rangle \1/mg
s/^\([[{(|.]\|\\|\|\\{\|\\langle \)\([]})|.]\|\\|\|\\}\|\\rangle \)$/\1\
\2\
bracket/mg
s/^\([[{(|.]\|\\|\|\\{\|\\langle \)\([]})|.]\|\\|\|\\}\|\\rangle \)\([1-9][0-9]\{0,1\}\)$/\3\
roll\
\1\
swap\
join\
\3\
rolld\
\2\
join/mg
# A B <,> → \langle[SPACE]A,B\rangle
s/^<,>$/","\
putbetween\
"\\langle "\
swap\
"\\rangle"\
join\
join/mg
# (A) leftright → \left(A\right)
# (A B C) leftright3 → \left(A B C\right)
# also for other parentheses (including \{A\}, \langle A\rangle, and \|A\|)
s/^leftright$/left\
right/mg
s/^leftright\([1-9][0-9]\{0,1\}\)$/\1\
roll\
left\
\1\
rolld\
right/mg
s/^left$/"\\left"\
swap\
join/mg
s/^right$/dup\
"\\}"\
match$?\
over\
"\\rangle"\
match$?\
over\
"\\rangle "\
match$?\
or\
or\
over\
"\\|"\
match$?\
or\
___"\\"___splitblast___"\\right"___putbetween\
___" @"___backsplit___"\\right"___putbetween\
ifelse\
array->procedure\
1\
ntimes/mg
####### delete chars
# abcdef strip2 → cd
# strip is the same as strip1
s/^strip$/strip1/mg
s/^strip\([1-9][0-9]\{0,1\}\)$/___decap___chop\
array->procedure\
\1\
ntimes/mg
# abcde 3decap → de
s/^\([1-9][0-9]\{0,1\}\)decap$/"decap"\
\1\
ntimes/mg
# abcde 3chop → ab
s/^\([1-9][0-9]\{0,1\}\)chop$/"chop"\
\1\
ntimes/mg
# the followings are defined in rpnedit.sed
# abc chop → ab
# abc decap → bc
# abcdefg [SPACE][SPACE]@@ delete → abefg
####### join strings
# A B sjoin → BA
# A B C 2sjoin → CBA
s/^sjoin$/swap\
join/mg
s/^\([1-9][0-9]\{0,1\}\)sjoin$/___swap___join\
array->procedure\
\1\
1sub\
ntimes/mg
# the followings are defined in rpnedit.sed
# A B join → AB
# abcd [SPACE][SPACE]@ xx insert → abxxcd
####### substitute a string
# replace the first match
# abcdeabcde cd xx substitute → abxxeabcde
s/^substitute$/3\
rolld\
2\
dupn\
include?\
___splitba___4___rolld___drop___3___rolld___swap___join___join\
___3___roll\
ifelse\
array->procedure\
1\
ntimes/mg
# replace the last match
# abcdeabcde cd xx substitutelast → abcdeabxxe
s/^substitutelast$/3\
rolld\
2\
dupn\
include?\
___splitbalast___4___rolld___drop___3___rolld___swap___join___join\
___3___roll\
ifelse\
array->procedure\
1\
ntimes/mg
# replae all the matchs
# ababab a c substituteall → cbcbcb
s/^substituteall$/3\
pick\
3\
pick\
include?\
4\
rolld\
3\
roll\
3\
roll\
"\
4\
rolld\
___splitba___3___roll___4___pick___join___5___roll___swap___join___4___rolld___swap\
array->procedure\
6\
roll\
ntimes\
drop\
swap\
drop\
join/mg
# the following is defined in rpnedit.sed
# abcdef [SPACE][SPACE]@@ xx replace → abxxef
####### split strings
# the followings are defined in rpnedit.sed
# split before the first match
# abcdabcd bc splitb → a bcabcd
# split after the first match
# abcdabcd bc splita → abc abcd
# split before and after the first match
# abcdabcd bc splitba → a bc dabcd
# split befor the last match
# abcdabcd bc splitblast → abcda bcd
# split after the last match
# abcdabcd bc splitalast → abcdabc d
# split before and after the last match
# abcdabcd bc splitbalast → abcda bc d
####### delete levels of the stack
# delete level 1 to N and the deepest N levels
# A1 A2 A3...An-3 An-2 An-1 An 2strips → A3...An-3
s/^\([1-9][0-9]*\)strip$/___drop___rolls___drop\
array->procedure\
\1\
ntimes/mg
# delete level 1 and the deepest one
# A1 A2...An-2 An-1 An strips → A2...An-1
s/^strips$/drop\
rolls\
drop/mg
# the followings are defined in rpnedit.sed
# A B C drop → A B
# A B C clear → (none)
####### duplicate levels of the stack
# 1 2 3 4 5 dup3 → 1 2 3 4 5 3 4 5 (dup 3 levels)
s/^dup\([1-9][0-9]\{0,1\}\)$/\1\
dupn/mg
# 1 2 3 4 5 3dup → 1 2 3 4 5 5 5 5 (3 times dup)
s/^\([1-9][0-9]\{0,1\}\)dup$/___dup\
array->procedure\
\1\
ntimes/mg
# 1 2 3 4 5 3dup2 → 1 2 3 4 5 4 5 4 5 4 5 (3 times (dup 2 levels))
s/^\([1-9][0-9]\{0,1\}\)dup\([1-9][0-9]\{0,1\}\)$/___\2___dupn\
array->procedure\
\1\
ntimes/mg
# the followings are defined in rpnedit.sed
# dup a b c d e F dup a b c d e F F
# dupn a b c D e f 3 dup → a b c D e f D e f
# pickl a b c D e f 3 pick → a b c D e f D
# unpick a b c D e f X 3 unpick → a b c X e f
####### re-order levels of the stacks
# a b c D E F roll3 → a b c E F D
s/roll\([1-9][0-9]\{0,1\}\)$/\1\
roll/mg
# a b c D E F rolld3 → a b c F D E
s/rolld\([1-9][0-9]\{0,1\}\)$/\1\
rolld/mg
# the following are defined in rpnedit.sed
# swap a b swap → b a
# roll a b c D E F 3 roll → a b c E F D
# rolld a b c D E F 3 rolld → a b c F D E
# rolls A b c d e f rolls → b c d e f A
# rollds a b c d e F rollds → F a b c d e
####### デリミタをはさんで 2 つのレベルを連結 #######
# カンマ、で
# A B , → A,B
# A B ,[SPACE] → A,[SPACE]B
# A B ,\[SPACE] → A,\[SPACE]B
s/^,\\* *$/"&"\
putbetween/mg
# N,
s/^\([1-9][0-9]\{0,1\}\)\(,\\* *\)$/___"\2"___putbetween\
array->procedure\
\1\
ntimes/mg
# ,N
s/^\(,\\* *\)\([1-9][0-9]\{0,1\}\)$/___"\1"___putbetween\
array->procedure\
\2\
1sub\
ntimes/mg
# アンパサンド、で
# A B , → A,B
# A B ,[SPACE] → A,[SPACE]B
s/^ \{0,1\}& \{0,1\}$/"&"\
putbetween/mg
# N&
s/^\([1-9][0-9]\{0,1\}\)\( \{0,1\}& \{0,1\}\)$/___"\2"___putbetween\
array->procedure\
\1\
ntimes/mg
# &N
s/^\( \{0,1\}& \{0,1\}\)\([1-9][0-9]\{0,1\}\)$/___"\1"___putbetween\
array->procedure\
\2\
1sub\
ntimes/mg
# スペースで
# A B [SPACE] → A[SPACE]B
# A B \[SPACE] → A\[SPACE]B
s/^\\\{0,1\} $/"&"\
putbetween/mg
# [SPACE]N
s/^\(\\\{0,1\} \)\([1-9][0-9]\{0,1\}\)$/___"\1"___putbetween\
array->procedure\
\2\
1sub\
ntimes/mg
# N[SPACE]
s/^\([1-9][0-9]\{0,1\}\)\(\\\{0,1\} \)$/___"\2"___putbetween\
array->procedure\
\1\
ntimes/mg
# (参考)rpnedit.sed のコマンド
# 任意のデリミタをはさんで 2 つのレベルを連結
# A B C putbetween → ACB
####### 複数のレベルに対する編集 #######
# 一行にまとめる \\
s/^ \{0,1\}\\\\ \{0,1\}$/"&"\
putbetween/mg
# 複数のレベルに対する \\ の付加(1procedure\
\1\
1sub\
ntimes\
\1\
roll/mg
####### スタックに対する一般的な操作 #######
# ユーザー用の略記
# dropN は Ndrop に同じ
s/^drop\([1-9][0-9]\{0,1\}\)/\1drop/mg
# Ndrop,Nrolls,Nrollds は、drop,rolls,rollds を N(0>>/
}
/\nq$/ {
q
}