最长的内置 LaTeX 命令?

最长的内置 LaTeX 命令?

最近有人问我,在 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 类语言的明确定义,这个问题就没有明确的答案。

相关内容