\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
(扩展定义)中扩展,也可以隐藏“外部性”。