我可以在 \halign 的序言中使用宏吗?

我可以在 \halign 的序言中使用宏吗?

我使用的是 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

在此处输入图片描述

相关内容