也可以看看:

也可以看看:

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 中复制)更容易阅读。

相关内容