发现禁止的控制序列(newtoks)

发现禁止的控制序列(newtoks)

我正在尝试将一些 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 不会这样做,因为...因为这很麻烦,而且无法真正帮助发现错误。

相关内容