如何定义包含制表符行 (\+...\cr) 的宏?

如何定义包含制表符行 (\+...\cr) 的宏?
\def\test{\+test\cr}
\test
\vfill
\eject

以上给出错误:

...
失控的定义?
->
! 扫描 \test 的定义时发现禁止的控制序列。
...

答案1

\+是外部宏,因此不能在另一个宏的定义中使用。在 中plain.tex,它定义为

\outer\def\+{\tabalign}

你可以使用\tabalign其他方式。比如说,

\def\test{\tabalign test\cr}
\test
\bye

答案2

另一种方法是暂时中和外部宏:

\begingroup\let\+\relax
\gdef\test{\+test\cr}
\endgroup

它可用于没有“内部”版本的外部宏,\bye\beginsection\proclaim

\begingroup\let\beginsection\relax
\gdef\section#1{\beginsection#1\par}
\endgroup

\section{Title}

当然\csname beginsection\endcsname也会起作用,正如约瑟夫指出的那样。

答案3

将外部控制序列放入宏中的另一种选择是\noexpand

\edef\test{\noexpand\+...}

这个\noexpand命令可以防止在\edef(扩展定义)中扩展,也可以隐藏“外部性”。

相关内容