最小示例(用 编译xetex
):
\XeTeXinterchartokenstate = 1
\newXeTeXintercharclass \classa
\XeTeXcharclass `\a \classa
\XeTeXinterchartoks 255 \classa = {\begingroup}
\XeTeXinterchartoks \classa 255 = {\endgroup}
\def\foo{\csname MaybeUndefined\endcsname}
\tracingall
a\foo
\bye
我得到的是:
{the letter a}
{horizontal mode: the letter a}
\XeTeXinterchartoks->\begingroup
{\begingroup}
{entering semi simple group (level 1) at line 11}
{the letter a}
\foo ->\csname MaybeUndefined\endcsname
{\csname}
{changing \MaybeUndefined=undefined}
{into \MaybeUndefined=\relax}
{\relax}
\XeTeXinterchartoks->\endgroup
{\endgroup}
{restoring \MaybeUndefined=undefined}
{leaving semi simple group (level 1) entered at line 11}
{undefined}
! Undefined control sequence.
<recently read> \MaybeUndefined
l.11 a\foo
这里,\csname MaybeUndefined\endcsname
应该扩展为\MaybeUndefined
,然后\relax
。但是,在插入一个\endgroup
by之后\XeTeXinterchartoks
,\MaybeUndefined
组后再次未定义。然后发生意外错误。
我能做些什么?
答案1
我想说这取决于代码的哪一部分由您控制。您可以\relax
在 的开头添加\foo
。但如果\foo
代表任意命令,那么恕我直言,您运气不佳:xetex 必须继续检查下一个输入是否是单词边界,然后必须“返回”以插入您的\endgroup
。
答案2
众所周知, \expandafter{\csname anything\endcsname} 扩展为未定义的控制序列,而不是 \relax,所以这就是您所看到的。