`\@gtempa` 有什么用?

`\@gtempa` 有什么用?

\@gtempa在许多中间定义中使用,但我很难找到它的用途(至少按照惯例)。我第一次遇到这个问题:Xelatex 数学怪异 - 未对齐 \not

我认识到使用它@来表示受保护的内部令牌值,并且在某些情况下它似乎仅用于存储临时值(这让我认为temp其名称中的“ ”部分就来自此……但这只是一种预感)。

但是,我不知道这是否是它的一般用法,或者它是否有其他用途,或者是否有惯例。

答案1

它是G全球化暂时的A(后面跟着 b、c 等,与之不同的是,\@tempa它是用于局部定义的宏。

命名约定来自 LaTeX2.09,它在各处都使用了这些约定,然而,到了 1993 年我们做 latex2e 时,有太多的包(样式文件)在使用,\@tempa所以我们将格式中的所有内部用途重命名为\reserved@aetc

比较 latex2.09

\def\hline{\noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet
   \@tempa\@xhline}

和 latex 2e

\def\hline{%
  \noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet
   \reserved@a\@xhline}

早期的 latex2e 公告之一向软件包编写者解释说,他们可以将其\@temp...用于任何他们想要的本地用途,但不应该用于\reserved@...格式之外的用途。

但是,全局用法很少使用,因此用法\@gtempa保持原样(尽管大多数已被完全消除)

比较 2.09

\def\@cline[#1-#2]{\noalign{\global\@cla#1\relax
\global\advance\@cla\m@ne
\ifnum\@cla>\z@\global\let\@gtempa\@clinea\else
  \global\let\@gtempa\@clineb\fi

使用 2e

\def\@cline#1-#2\@nil{%
  \omit
  \@multicnt#1%
  \advance\@multispan\m@ne
  \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
  \@multicnt#2%
  \advance\@multicnt-#1%
  \advance\@multispan\@ne
  \leaders\hrule\@height\arrayrulewidth\hfill
  \cr
  \noalign{\vskip-\arrayrulewidth}}

所以它只是一个经常被包用于全局定义的常规名称(\gdef\global\let),当然它并不常用,因为与局部定义一起使用意味着如果任何其他包代码可以在定义它和使用它的代码之间运行,它可能已经被覆盖以用于完全不同的目的。

答案2

\@gtempa是一个临时的暂存命令,用于全局目的(通常与 \xdef 一起使用),但可以轻松覆盖。它只是用于全局的临时存储,之后就丢弃了。前缀g表示它是为global
特定目的而设计的。

但是也\@gtempa可以表示全局临时寄存器。dim

它非常有用,这样就不需要使用另一个命令序列来定义并“消耗”命令名称的寄存器数量

LaTeX核心充满了这些\@gtempa用法,可以追溯到没有大量语域的时代,也就是eTeX在舞台上出现的时代。

从本地意义上讲,有一堆类似的临时寄存器,例如\@tempskipa\@tempcnta,\@tempboxa`。

前缀\@..是为了保持宏的内部,即它不能在不使用的情况下意外访问\makeatletter...\makeatother

在“expl3变量\g_tmpa_<foo>”中具有与相同的含义\@gtempa,其中foo是类似clistseqtl等的东西。

相关内容