LuaTeX 中 \ifcsname 的类似物,用于活动字符

LuaTeX 中 \ifcsname 的类似物,用于活动字符

在 pdfTeX 或 XeTeX 中,以下代码运行活动字符并最终产生错误,例如Invalid code (1114112)(但在 pdfTeX 中为 256)。

\catcode`*=13 % active
\count0=32
\def\step{%
  \advance\count0 by 1
  \lccode`*=\count0
  \lowercase{\ifx\undefined*\else\message{\string*}\fi}%
  \step
}
\step

在 LuaTeX 中,它会耗尽内存。我猜想活动字符(如控制序列)会被添加到哈希表中。我想要一个\ifcsname活动字符的类似物:它不会将控制序列添加到哈希表中。

答案1

手册上说

活动字符在内部实现为一种特殊类型的多字母控制序列,其使用无法通过其他方式获得的前缀。

查阅资料表明这个前缀是 U+FFFF = 239,191,191 (UTF-8),所以我认为你可以这样做:

`\catcode`∞=\active
\def∞{and beyond}

\directlua{
for i,v in pairs (tex.hashtokens()) do
if 
(
string.byte(v,1,1)==239 and
string.byte(v,2,2)==191 and
string.byte(v,3,3)==191 
)
then
texio.write_nl('active char [' ..string.sub(v,4) ..']')
end
end
}


\bye

产生

active char [^L]
active char [^M]
active char [^Z]
active char [ ]
active char [']
active char [_]
active char [~]
active char [∞]

我猜这只会报告曾经有过活动定义的字符,如果将\let字符设置为未定义,则原始字符将显示为未定义,但这会显示哈希条目。

相关内容