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未定義的字符,您的原始字符將顯示為未定義,但這將顯示哈希條目。

相關內容