当在宏内部定义标记列表变量时出现“失控定义”错误

当在宏内部定义标记列表变量时出现“失控定义”错误

以下纯 TeX 手稿

\def\mymacro{\newtoks\mytoks}\bye

编译失败并生成以下错误:

Runaway definition?
->
! Forbidden control sequence found while scanning definition of \mymacro.
<inserted text> 
                }
<to be read again> 
                   \newtoks 
l.1 \def\mymacro{\newtoks
                         \mytoks}\bye

有什么问题?

答案1

第 232plain.tex

\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}

在 TeXbook 中查找\outer。第 206 页,第一个双重危险的段落:

但是 -forbidding机制\par并不能捕获所有可能的缺失括号错误;您可能会忘记 末尾的}\def也会出现同样的问题。在这种情况下,限制错误会更加困难,因为\par在替换文本中 很有用;我们不想\par在那里禁止,因此 TeX 使用了另一种机制:当宏定义前面有 ' \outer' 时,相应的控制序列将不允许出现在任何高速吸收标记的地方。\outer宏不能出现在参数中(即使\par允许),也不能出现在定义的参数文本或替换文本中,也不能出现在对齐的前言中,也不能出现在被跳过的条件文本中。

也可以看看为什么在纯 TeX 格式中将 \new... 定义为 \outer?为什么 \newcount 被声明为 \outer?

如果你确实需要将其\newtoks作为纯 TeX 定义的一部分来执行:

\def\mymacro{\csname newtoks\endcsname\mytoks}

会做。

相关内容