latex.ltx
在内核中,这个宏被用了几次。例如在(l.6222)\@@
的定义中:\@next
\def\@next#1#2#3#4{\ifx#2\@empty #4\else
\expandafter\@xnext #2\@@#1#2#3\fi}
我没有看到任何地方定义了这个宏。(使用例如、、带星号和不带星号等进行快速搜索,没有\let
找到任何有意义的结果。)我也没有在中看到它。我有点不明白这个宏的作用是什么,而且网站上还没有提供规范的答案。\def
\newcommand
plain.tex
\@next
那么这是什么\@@
意思呢?
答案1
\@next
如果不看一下定义\@xnext
和使用示例,您就无法理解定义;完整的代码是
\def\@next#1#2#3#4{\ifx#2\@empty #4\else
\expandafter\@xnext #2\@@#1#2#3\fi}
\def\@xnext \@elt #1#2\@@#3#4{\def#3{#1}\gdef#4{#2}}
使用示例位于第 5963 行
\@next\@marbox\@freelist{\global\count\@marbox\m@ne}%
{\@floatpenalty\z@
\@fltovf\def\@currbox{\@tempboxa}\def\@marbox{\@tempboxa}}%
的第二个参数\@next
应为无参数控制序列(由于\ifx
测试和以下\expandafter
)。宏\@freelist
就是这样一个宏,与浮点队列一起使用,当浮点启动或浮点用刷新时,它会更新\clearpage
。它在启动时的定义是
\@elt\bx@A\@elt\bx@B\@elt\bx@C...\@elt \bx@R
也就是说,它列出了与浮点数(这里...
表示类似的标记)有关的插入类。
如果\@freelist
未包含任何内容,则传递第四个参数;否则
\expandafter\@xnext\@freelist\@@\@marbox\@freelist{\global\count\@marbox\m@ne}\fi
保留在输入流中。因此,假设\@freelist
不为空,并且为了简单起见,它与启动时相同。这\expandafter
使得 TeX 看到
\@xnext\@elt\bx@A\@elt\bx@B\@elt\bx@C...\@elt \bx@R\@@\@marbox\@freelist{\global\count\@marbox\m@ne}\fi
请注意,为了使其发挥作用,第二个参数的第一级扩展为\@next
必须以 开头\@elt
。 是什么\@elt
? 它只是一个通常定义为 的标记\relax
,用于以\@elt<token1>\@elt<token2>...
允许列表操作的形式存储有序的标记列表。
现在开始定义\@xnext
。它有一个复杂的参数文本,可以描述如下:
\@elt
预计在命令之后#1
表示一个未限定的参数,因此只有一个标记或一个括号组,因为它后面紧跟着#2
#2\@@
表示一个分隔参数,也就是说,TeX 将#2
用它找到的第一个标记之前的所有内容(不包括)进行替换\@@
;#3
和#4
是无限制参数(与 for 相同#1
)。
在分隔参数的上下文中,分隔符标记不需要定义;TeX 会寻找精确的标记序列和控制序列仅当它们的名称是相同的。
作为宏扩展的一部分,分隔符从输入流中删除。因此,在此特定情况下,\@elt
找到并可以开始搜索以下参数(\@elt
将被删除);参数#1
是\bx@A
;参数#2
是
\@elt\bx@B\@elt\bx@C...\@elt \bx@R
且参数#3
和分别#4
是\@marbox
和\@freelist
。
扩展\@xnext
使得所有代码被替换为
\gdef\@marbox{\bx@A}\gdef{\@freelist}{\@elt\bx@B\@elt\bx@C...\@elt \bx@R}
执行了两个定义,这特别显示了如何\@marbox
变得等同于\bx@A
(第一个插入类)并\@freelist
进行更新,本质上是删除了第一个项。悬空的\fi
剩余部分根据一般 TeX 规则消失(的扩展\fi
为空,前提是它是前一个条件的扩展的结果,在本例中是\ifx
我们开始的)。
在循环函数和的辅助宏中,标记\@@
的使用方式非常相似,即作为纯分隔符。\@for
\@tfor
答案2
实际上,下一行定义了一个用作\@@
分隔符的宏:
\def\@next#1#2#3#4{\ifx#2\@empty #4\else
\expandafter\@xnext #2\@@#1#2#3\fi}
\def\@xnext \@elt #1#2\@@#3#4{\def#3{#1}\gdef#4{#2}}
因此它似乎被用作分隔符(如传统 LaTeX 中的或或 expl3 中的夸克,\@nil
等等)。我不知道背后是否有其他想法(例如当有人使用夸克或s 等时)。\relax
\q_stop
\@@
\relax
答案3
如果您获取数组环境的文档(例如texdoc array
),那么它指的是\@@
用作参数分隔符 - 例如,请参阅 TeX Live 2014(和其他发行版)文档的第 9 页。文档sources2e
(例如texdoc sources2e
)\@@
在其索引中有但未明确提及其用法(至少在我能看到的任何地方)。也许这是标准的 TeX 技术?