最近有人问我,在 Beamer 演示文稿中删除导航栏的命令是否是最长的内置 LaTeX 命令:
\beamertemplatenavigationsymbolsempty
我做了一些研究,但找不到任何接近其 36 个字符的内容。我也没有找到任何关于这个完全有趣的琐碎事实的讨论(尽管对于某些程序生成应用程序来说,了解它可能很有用),所以这似乎是开始的正确地方。规则是:只有斜杠符号\
和任何选项符号([
或{
)之间的字符数才算数,并且只有内置于 TeX 核心或常用包中且不依赖于用户数据的命令(例如由生成的命令\csname
)。
答案1
我们可以(大概)找出答案。
任何 LaTeX “命令”——在 TeX 术语中,转义符(通常是反斜杠)后跟控制序列——在定义时都会放入 TeX 程序的内部哈希表中。使用 LuaTeX,我们可以使用 直接查找此哈希表tex.hashtokens
。
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode}
function string.startswith(s, p) return string.sub(s, 1, string.len(p)) == p end
function string.contains(s, substring) return s:find(substring) ~= nil end
hashed = {}
count = 0
for i,v in pairs (tex.hashtokens()) do
count = count + 1
table.insert(hashed, v)
end
table.sort(hashed, function(a,b) return #a < #b end)
for i, v in ipairs(hashed) do
if not (
v:startswith('<')
or v:contains(' ')
or v:startswith('_')
) then
print(#v, v)
end
end
print(string.format('There are %d entries in the hash table.', count))
\end{luacode}
\end{document}
使用 LuaTeX 编译时(需要将环境变量hash_extra
设置为 0 来调用它,因为LuaTeX 中令人惊奇的行为/错误),这将打印多行输出,结尾是:
37 peek_charcode_remove_ignore_spaces:NT
37 peek_charcode_remove_ignore_spaces:NF
37 box_autosize_to_wd_and_ht_plus_dp:cnn
37 box_autosize_to_wd_and_ht_plus_dp:Nnn
37 c__text_mathchardef_group_begin_token
37 peek_catcode_remove_ignore_spaces:NTF
37 tex_scriptscriptbaselineshiftfactor:D
38 box_gautosize_to_wd_and_ht_plus_dp:cnn
38 use_none_delimit_by_q_recursion_stop:w
38 box_gautosize_to_wd_and_ht_plus_dp:Nnn
38 peek_charcode_remove_ignore_spaces:NTF
There are 13555 entries in the hash table.
在 LaTeX 中,每个字符通常都用反斜杠(转义字符,向 TeX 表明后面是要在哈希表中查找的控制序列)来调用,例如最后一个字符为;我们不会将反斜杠计入上述字符计数中。这与问题中计为 36 个字符而不是 37 个字符\peek_charcode_remove_ignore_spaces:NTF
的示例一致。\beamertemplatenavigationsymbolsempty
上面的输出排除了哈希表的某些条目:
哈希表中绝对最长的条目是如下字符串
<-5.5>"[lmroman5-regular]:+tlig;"<5.5-6.5>"[lmroman6-regular]:+tlig;"<6.5-7.5>"[lmroman7-regular]:+tlig;"<7.5-8.5>"[lmroman8-regular]:+tlig;"<8.5-9.5>"[lmroman9-regular]:+tlig;"<9.5-11>"[lmroman10-regular]:+tlig;"<11-15>"[lmroman12-regular]:+tlig;"<15->"[lmroman17-regular]:+tlig;"
它们是某种内部字体名称。因此,让我们排除以 开头的所有内容
<
。下一个最长的是 70 个字符的条目
@err@
(以 65 个空格结尾);不确定这是什么。但让我们排除包含空格的条目。接下来最长的是
__text_change_case_letterlike_titleonly:nnN
(length 43) 这样的条目。也许前导下划线表示它们是“内部的”,不打算供最终用户使用?让我们排除这些。
剩下的就是上面所看到的。LuaTeX 文档提到了以下警告tex.hashtokens
:
请注意,这还会报告由于本地重新定义而此时可能无法访问的控制序列:它严格来说是哈希表的转储。
但还有一个更大的问题,也是这个问题的主要问题。即缺少“内置 LaTeX 命令”的定义。一个可以将其精确定义为“LaTeX 本身内置的命令”,但这显然不是问题的本意,因为它包含了\beamertemplatenavigationsymbolsempty
来自 Beamer 的示例,还提到了“内置于 TeX 核心或常用包中”。(比默是一个不属于 LaTeX 本身的包;它只是一个(广泛使用的)包,有人碰巧编写了它,可以与 LaTeX 一起使用,并与 TeX Live / MiKTeX 等 TeX 发行版一起分发。)
例如,如果我们\usepackage{tikz}
在上述文件的顶部附近添加,我们会得到不同的输出:
44 pgfmath@operation@\pgfmath@bgroup@precedence
44 pgfmath@operation@\pgfmath@egroup@precedence
44 pgf@arrows@direct@name@end@{latex}[reversed]
44 pgfqkeysactivatesinglefamilyandfilteroptions
45 pgfkeys@ifexecutehandler@handlefullorexisting
45 pgf@plot@closedcurve@after@initial@presupport
45 pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP
45 pgfincludeexternalgraphics@read@dpth@line@EOI
45 pgfmathprintnumber@thousand@sep@in@fractional
46 pgfmathroundto@impl@ADD@ONE@ITERATE@gobble@dot
46 ifpgfmathround@impl@PREPERIOD@is@negative@zero
46 pgf@arrows@direct@name@end@{stealth}[reversed]
47 ifpgfmathprintnumber@thousand@sep@in@fractional
47 pgfmathprintnumber@RELATIVE@choice@roundtofixed
48 pgfmathroundto@impl@discard@suffix@zeros@ITERATE
48 pgfmathround@impl@PREPERIOD@is@negative@zerotrue
49 pgfmathprintnumber@fixed@styleDEFAULT@impl@period
49 pgfmathprintnumber@thousand@sep@in@fractionaltrue
49 pgfmathround@impl@PREPERIOD@is@negative@zerofalse
50 pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK
50 pgfmath@token@group@\pgfmath@bgroup\pgfmath@egroup
50 pgfmathprintnumber@thousand@sep@in@fractionalfalse
50 pgfincludeexternalgraphics@read@dpth@line@getfirst
50 pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP
51 pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod
52 pgfmathprintnumber@thousand@sep@in@fractional@finish
52 pgfmathprintnumber@RELATIVE@choice@roundtofixed@warn
53 pgfmathprintnumber@thousand@sep@in@fractional@finish@
56 pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT
60 pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall
61 pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall@
61 pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printsign
67 pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@counteverythird
71 pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printtrailingdigits
There are 24340 entries in the hash table.
上面的许多名称都是使用 的包内部生成的\csname
。您可能希望排除包含 的命令,@
因为它们只能在 之后输入\makeatletter
,并且按照惯例可能是内部的。仍然:
39 pgfmathfloatroundmayneedrenormalizetrue
39 pgfkeysactivatefamiliesandfilteroptions
40 pgfmathfloatroundmayneedrenormalizefalse
40 pgfmathfloatparsenumberpendingperiodtrue
40 pgfqkeysactivatefamiliesandfilteroptions
41 pgfmathfloatparsenumberpendingperiodfalse
43 pgfkeysactivatesinglefamilyandfilteroptions
44 pgfqkeysactivatesinglefamilyandfilteroptions
加载更多宏(添加更多包等\usetikzlibrary
)将改变输出,并且可能存在定义更长命令的包。例如,仍然排除带有 的宏@
,带有pgfmanual
(用户muzimuzhi Z
在评论中建议):
38 box_gautosize_to_wd_and_ht_plus_dp:Nnn
38 ifpgfmathfloatparsenumberpendingperiod
38 use_none_delimit_by_q_recursion_stop:w
38 pgfmanualprettyprinternumcollectedargs
38 box_gautosize_to_wd_and_ht_plus_dp:cnn
38 peek_charcode_remove_ignore_spaces:NTF
39 pgfkeysactivatefamiliesandfilteroptions
39 ifpgfmanualprettyprinterfoundterminator
39 pgfmathfloatroundmayneedrenormalizetrue
40 pgfqkeysactivatefamiliesandfilteroptions
40 pgfmathfloatparsenumberpendingperiodtrue
40 pgfmathfloatroundmayneedrenormalizefalse
41 pgfmathfloatparsenumberpendingperiodfalse
41 pgfmanualprettyprinterhandlecollectedargs
41 pgfmanualprettyprinterfoundterminatortrue
42 pgfmanualprettyprinterfoundterminatorfalse
43 pgfkeysactivatesinglefamilyandfilteroptions
44 pgfqkeysactivatesinglefamilyandfilteroptions
45 ifpgfmanualprettyprinterarghasunmatchedbraces
45 pgfmanualprettyprinterhandlecollectedargsVtwo
47 pgfmanualprettyprinterarghasunmatchedbracestrue
48 pgfmanualprettyprinterarghasunmatchedbracesfalse
作为健全性检查,\documentclass{beamer}
我们确实得到了问题beamertemplatenavigationsymbolsempty
以及一些较长的问题(这次我还删除了包含-
下划线或反斜杠的表达式,以使输出更小):
36 pgfmathprintnumberskipzeroperiodtrue
36 insertsubsectionnavigationhorizontal
36 beamertemplatenavigationsymbolsframe
36 beamertemplatenavigationsymbolsempty
36 pgfmathpointintersectionoflineandarc
36 beamertemplatesidebarverticalshading
36 pgfpagescurrentpagewillbelogicalpage
36 beamertemplatetransparentcoveredhigh
36 pgfrememberpicturepositiononpagetrue
36 MakeUppercaseUnsupportedInPdfStrings
36 beamertemplatenumberedballsectiontoc
36 MakeLowercaseUnsupportedInPdfStrings
37 useleftsidebarverticalshadingtemplate
37 pgfapproximatenonlineartransformation
37 pgfkeysaddhandleonlyexistingexception
37 pgfhorizontaltransformationadjustment
37 insertbackfindforwardnavigationsymbol
37 beamertemplatesphereminiframeinverted
37 ifpgfmathfloatroundmayneedrenormalize
37 beamertemplatecircleminiframeinverted
37 pgfmathprintnumberskipzeroperiodfalse
37 pgfrememberpicturepositiononpagefalse
38 beamertemplatenumberedcirclesectiontoc
38 beamertemplatesidebarhorizontalshading
38 ifpgfmathfloatparsenumberpendingperiod
38 beamertemplatetransparentcoveredmedium
38 userightsidebarverticalshadingtemplate
38 beamertemplatenumberedsquaresectiontoc
39 beamertemplatenavigationsymbolsvertical
39 pgfkeysactivatefamiliesandfilteroptions
39 useleftsidebarhorizontalshadingtemplate
39 beamertemplatetransparentcoveredhighest
39 beamertemplatetransparentcovereddynamic
39 pgfmathfloatroundmayneedrenormalizetrue
40 pgfqkeysactivatefamiliesandfilteroptions
40 pgfmathfloatroundmayneedrenormalizefalse
40 pgfmathfloatparsenumberpendingperiodtrue
40 userightsidebarhorizontalshadingtemplate
40 beamertemplaterightsidebarlogonavigation
41 pgfmathfloatparsenumberpendingperiodfalse
41 beamertemplatenavigationsymbolshorizontal
43 pgfkeysactivatesinglefamilyandfilteroptions
44 pgfqkeysactivatesinglefamilyandfilteroptions
45 beamertemplatetransparentcovereddynamicmedium
答案2
这实际上很难回答。LaTeX 内核(非常常用的包 ;))加载。它有类似(39 个字符)expl3
的命令。\use_none_delimit_by_q_recursion_stop:w
我实际上不知道是否有更长的宏名,但许多包会做类似的事情
\csname module@property@#1\endcsname`
因此通常根据用户数据(例如键值接口中的键等)生成宏名。这些是内置的吗?可能是的,因为它们在常用包中隐式定义。
built into
因此,虽然我认为彻底的调查会产生非常长的宏名,但如果没有TeX 类语言的明确定义,这个问题就没有明确的答案。