以下纯 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}
会做。