在 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
字符设置为未定义,则原始字符将显示为未定义,但这会显示哈希条目。