我正在尝试将一些 LaTeX 宏从xespotcolor
到 Plain TeX,以便能够在我的 Plain TeX 文档中使用单一专色。我设法提取了几个宏,但我被困在
\def\NewSpotColorSpace#1{%
\expandafter\newtoks\csname #1\endcsname%
\csname #1\endcsname{}%
}
这导致
Runaway definition?
#1->\expandafter
! Forbidden control sequence found while scanning definition of \NewSpotColorSp
ace.
<inserted text>
}
<to be read again>
\newtoks
l.2 \expandafter\newtoks
\csname #1\endcsname%
这个答案说不应该\newtoks
在定义中使用,并建议一种解决方法,但是当我将代码行更改为
\def\NewSpotColorSpace#1{%
\expandafter\csname newtoks\endcsname\csname #1\endcsname%
\csname #1\endcsname{}%
}
并实际使用这个宏(运行\input spotcolorpantone
),我得到
! Extra \endcsname.
\NewSpotColorSpace ...csname \csname #1\endcsname
\csname #1\endcsname {}
l.1 \NewSpotColorSpace{PANTONE}
我已经很久没有尝试完整地阅读了TeXBook,但我的主要问题是:为什么第一个定义无效(但在 LaTeX 中显然有效),为什么第二个定义会抱怨额外的\endcsname
?我如何能够动态定义一个新的标记并运行它,这是(据我所知)这个宏的主要目的?
答案1
你是对的:你需要\newtoks
在纯 TeX 中“隐藏”,但你还需要正确获取扩展顺序:
\csname newtoks\expandafter\endcsname\csname #1\endcsname
完成此操作后,您的 toks 名称将由\csname ...\endcsname
前的构造\newtoks
已完成,因此它将“看到所需的单个后续标记。
为什么需要改变:普通的 TeX 使\newtoks
“外部”成为可能,因此令牌不能出现在定义内部。LaTeX 不会这样做,因为...因为这很麻烦,而且无法真正帮助发现错误。