“缺少插入的 \cr”,但是在我看来它已经存在了!

“缺少插入的 \cr”,但是在我看来它已经存在了!

我正在尝试创建一个 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删除两个右括号之间的换行符,使用两个\crs,放弃宏并尝试排版它应该扩展为的内容,以及它们的各种组合,但我一直收到此错误,我没有任何主意。发生了什么?

(此外,我怀疑使用\mkstep我的方式会导致生成的参考宏的范围仅限于\mkstep使用的列,而不是整个\twocols;有没有办法在不使参考宏全局化的情况下解决这个问题?)

答案1

 \everycr={\noalign{\global\advance\stepno by 1}}%

您在最后一个显式标记之后插入标记,\cr因此需要确保它们不会开始新的一行。

相关内容