的含义 \@@

的含义 \@@

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\newcommandplain.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。它有一个复杂的参数文本,可以描述如下:

  1. \@elt预计在命令之后
  2. #1表示一个未限定的参数,因此只有一个标记或一个括号组,因为它后面紧跟着#2

  3. #2\@@表示一个分隔参数,也就是说,TeX 将#2用它找到的第一个标记之前的所有内容(不包括)进行替换\@@

  4. #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 技术?

相关内容