使用 \XeTeXinterchartoks 时出现意外范围问题

使用 \XeTeXinterchartoks 时出现意外范围问题

最小示例(用 编译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。但是,在插入一个\endgroupby之后\XeTeXinterchartoks\MaybeUndefined组后再次未定义。然后发生意外错误。

我能做些什么?

答案1

我想说这取决于代码的哪一部分由您控制。您可以\relax在 的开头添加\foo。但如果\foo代表任意命令,那么恕我直言,您运气不佳:xetex 必须继续检查下一个输入是否是单词边界,然后必须“返回”以插入您的\endgroup

答案2

众所周知, \expandafter{\csname anything\endcsname} 扩展为未定义的控制序列,而不是 \relax,所以这就是您所看到的。

相关内容