LaTeX (2e) 源代码很难读懂。有很多带@
符号的宏。我理解那些是“latex 宏”。
特别是,有一系列宏称为\@ne
、、\tw@
(\thr@@
可能还有更多)。它们\meaning
是\char"1
、、\char"2
。\char"3
我想知道(1.)它们是如何定义的以及在哪里定义的?
进一步的兴趣:它们似乎主要用于识别内部寄存器。“The Texbook”提到每种类型有 256 个内部寄存器,例如\box0
...。\box256
那么哪个寄存器\box\@ne
表示?
读完马丁的回答后,我翻到了教科书第 121 页:
此外
\newcount
,普通 TEX 提供了\newdimen
、\newskip
、\newmuskip
和 ;对于我们尚未讨论的功能,\newbox
还有\newtoks
、\newread
、\newwrite
、\newfam
和 。附录 B 和 E 包含分配的正确用法的几个例子。在、等情况下,分配的数字由 定义 。例如,如果命令“ ”用于定义将包含摘要的盒子寄存器,并且如果操作决定为此目的分配,则它通过表示“ ”来定义 的含义 。TEX 允许 将 的数量用作整数,以便您可以说 和等。(没有命令。)\newinsert
\newbox
\newread
\chardef
\newbox\abstract
\newbox
\box45
\abstract
\chardef\abstract=45
\chardef
\box\abstract
\copy\abstract
\boxdef
...所以\box\@ne
等于\box1
?
答案1
它们从第 293 行开始定义latex.ltx
:
\chardef\@ne=1
\chardef\tw@=2
\chardef\thr@@=3
\chardef\sixt@@n=16
\chardef\@cclv=255
然后在第 316 行:
\countdef\m@ne=22 \m@ne=-1
它们的定义是为了减少源代码中的标记数量。
编辑:
回答你的第二个,后来添加的问题“......所以\box\@ne
等于\box1
?”
是的!
补充:
还有非常有用的\p@
和\z@
,也在第 353 和 354 行中定义latex.ltx
(带有原始注释):
\newdimen\p@ \p@=1pt % this saves macro space and time
\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
示例:我最近遇到了一个表达式\wd\z@\z@
,一开始让我很困惑。它的意思是:“将框 0 的宽度(\z@
取整数)设置为 0pt(\z@
用作正常尺寸)。较长的形式将是\wd0=0pt
(6 个标记而不是 3 个)。
也\p@
经常用于在浮点数后添加“pt”:1.2345\p@
是 1.2345pt(实际上是 1.2345 x 1pt)。
也可以看看:
与此同时,我编写了一份这些宏和更多宏的列表。
答案2
我喜欢 ConTeXt 的一点是,这些内部宏的命名方式更易读。例如,ConTeXt 中的相应定义是:
\countdef \zerocount = 120 \zerocount = 0
\countdef \plusone = 121 \plusone = 1
\countdef \minusone = 122 \minusone = -1
和
\chardef \plustwo = 2
\chardef \plusthree = 3
\chardef \plusfour = 4
\chardef \plusfive = 5
\chardef \plussix = 6
\chardef \plusseven = 7
\chardef \pluseight = 8
\chardef \plusnine = 9
\chardef \plusten = 10
\chardef \plussixteen = 16
\chardef \plushundred = 100
\chardef \pluscxxvii = 127
\chardef \pluscxxviii = 128
\chardef \pluscclv = 255
这些不是“受保护的”,因此用户可以重新定义它们。因此,ConTeXt 不会阻止您搬起石头砸自己的脚。其中一些有一个受保护的版本(定义为宏而不是计数器;我不知道对效率的影响):
\def\!!zerocount {0} % alongside \zerocount
\def\!!minusone {-1} % alongside \minusone
\def\!!plusone {1} % alongside \plusone
\def\!!plustwo {2} % alongside \plustwo
\def\!!plusthree {3} % alongside \plusthree
这些比相应的纯 TeX 定义(或多或少在 LaTeX 中复制)更容易阅读。