我正在尝试创建一个 Plain TeX 宏,用于排版双列校样,并带有自动步骤编号和步骤交叉引用;目前,我所拥有的“最佳”功能是:
\newcount\stepno
\def\twocols#1{%
\everycr={\advance\stepno by 1}
\def\mkstep##1{%
\expandafter \ifx \csname##1step\endcsname \relax%
\expandafter\edef\csname##1step\endcsname{\the\stepno}%
\else \message{^^JWarning: attempt to define ##1 more than once^^J^^J}%
\stepref{##1}%
\fi}%
\def\stepref##1{%
\expandafter \ifx \csname##1step\endcsname \relax {\tt[##1]}%
\else \csname##1step\endcsname%
\fi}%
$$\vbox{
\offinterlineskip
\halign{
\strut\the\stepno. ##\hfil & \vrule ##\hfil\cr%
%\noalign{\hrule\smallskip}
#1 \cr
}
}$$
}
\twocols{
\mkstep{A} $(p\to q)\land (q\to r)$ & premise \cr
\mkstep{B} $p\to (q\land(q\to r))$ & \stepref{A}, logic07 \cr
$p\to r$ & \stepref{B}, {\it modus ponens}
}
\bye
不幸的是,尝试排版会出现以下无法解释的错误:
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
%&-line parsing enabled.
entering extended mode
(./twocols02.tex
! Missing \cr inserted.
<inserted text>
\cr
<to be read again>
}
\twocols ... ##\hfil & \vrule ##\hfil \cr #1 \cr }
}$$
l.28 }
? X
No pages of output.
Transcript written on twocols02.log.
为什么它声称缺少一个,\cr
而显然有一个?我尝试\cr
过从宏定义中删除,并\cr
在宏参数的末尾添加,将替换为\cr
,\crcr
删除两个右括号之间的换行符,使用两个\cr
s,放弃宏并尝试排版它应该扩展为的内容,以及它们的各种组合,但我一直收到此错误,我没有任何主意。发生了什么?
(此外,我怀疑使用\mkstep
我的方式会导致生成的参考宏的范围仅限于\mkstep
使用的列,而不是整个\twocols
;有没有办法在不使参考宏全局化的情况下解决这个问题?)
答案1
\everycr={\noalign{\global\advance\stepno by 1}}%
您在最后一个显式标记之后插入标记,\cr
因此需要确保它们不会开始新的一行。