![使用 \XeTeXinterchartoks 时出现意外范围问题](https://linux22.com/image/249107/%E4%BD%BF%E7%94%A8%20%5CXeTeXinterchartoks%20%E6%97%B6%E5%87%BA%E7%8E%B0%E6%84%8F%E5%A4%96%E8%8C%83%E5%9B%B4%E9%97%AE%E9%A2%98.png)
最小示例(用 编译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,所以这就是您所看到的。