我使用的是 Plain TeX,希望能够抽象出 的序言,\halign
这样我就可以用宏中的列数来调用它,比如\customalign
,我想使用宏来使其更清晰。但是,这个使用宏来定义 结构的最小示例\halign
\edef\preamb{## & ## \cr}
\halign{ \preamb
first line & second column \cr
}
导致这些错误:
! Missing # inserted in alignment preamble.
<to be read again>
&
l.3 first line &
second column \cr
?
! Missing # inserted in alignment preamble.
<to be read again>
\cr
l.3 first line & second column \cr
?
)
是我做错了什么吗,还是这根本就不可能?
答案1
是的,你可以:\span
,在对齐前言中使用时,会扩展下一个标记。
\def\preamb{## & ## \cr}
\halign{\span\preamb
first line & second column \cr
}
\bye
通常,第一个标记之前的标记\cr
不会被扩展,除非它们前面有\span
。如果前导码存储在单个宏中,则可以使用另一种方法
\halign\expandafter{\preamb
first line & second column \cr
}
但\span
用途更加广泛。
答案2
您可以在序言中使用\span
或来扩展宏,但无论哪种情况,当您使用宏时,它都会强制出现稍微不自然的调用结构。\expandafter
另一种方法是定义一个替代命令(此处),该命令内置所需的前导码。您可以使用来吞噬源中的 ,myhalign
从而避免预扫描对齐主体,从而允许插入以不匹配开头的前导码:\let
{
\bgroup
\def\myhalign{\afterassignment\xmyhalign\let\tmp=}
\def\xmyhalign{\halign\bgroup\hfil## & ##\hfil \cr}
\myhalign{
first line & second column \cr
1& 2 \cr
}
\bye