这是我在尝试回答时想到的另一个问题以及担忧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.tex
hash_extra