tex.hashtokens 不完整?

tex.hashtokens 不完整?

这是我在尝试回答时想到的另一个问题以及担忧tex.hashtokens()在 LuaTeX 中.考虑以下文档:

\documentclass{beamer}
\begin{document}

\message{The meaning of (\string\beamertemplatenavigationsymbolsempty) is (\meaning\beamertemplatenavigationsymbolsempty)}

\directlua{
for i,v in pairs(tex.hashtokens()) do
   if v:find('beamertemplatenavigation') then
      print('found:', v)
   end
end
}

\message{The meaning of (\string\beamertemplatenavigationsymbolsempty) is still (\meaning\beamertemplatenavigationsymbolsempty)}

\end{document}

lualatex当在我的系统(“ ”)上运行时This is LuaHBTeX, Version 1.12.0 (TeX Live 2020),会打印以下内容(为了清楚起见,我添加了一个换行符):

The meaning of (\beamertemplatenavigationsymbolsempty) is (macro:->\setbeamertemplate {navigation symbols}{})
found:  beamertemplatenavigationsymbolsvertical
found:  beamertemplatenavigationsymbolshorizontal
 The meaning of (\beamertemplatenavigationsymbolsempty) is still (macro:->\setbeamertemplate {navigation symbols}{})

这个宏\beamertemplatenavigationsymbolsempty显然存在,那么为什么 Lua 代码找不到它?我是不是误解了什么?

我使用 MiKTeX 20.11 获得了类似的结果。

答案1

LuaTeX(以及 1995 年之后从 web2c 衍生的所有其他 TeX 版本)使用分为两部分的哈希表:一个最多包含hash_size(65536) 个条目的普通哈希表和一个包含hash_extra许多条目的附加部分(hash_extra可以在运行时设置,TeXLive 默认将其设置为 600000)。(该hash_extra部分实际上不是哈希表,而更像是线性溢出列表,但现在这并不重要)

该函数tex.hashtokens返回一个仅包含“正常”哈希表条目的表,以及不是hash_extra部分。因此,从某种意义上说,它列出了可以特别快速访问的控制序列名称,而不是全部。我不知道这种行为是否是故意的,但我个人认为返回所有名称会更有用。无论如何,正如 ShreevatsaR 提到的,您可以通过以 LuaTeX 为运行并因此强制该部分为空来强制tex.hashtokens返回特定运行中的所有名称。在这种情况下,您不能使用超过 65536 个不同的控制序列。hash_extra=0 lualatex foo.texhash_extra

相关内容