amsmath 对 \@currentlabel 做了什么?

amsmath 对 \@currentlabel 做了什么?

有人可以解释一下环境中的amsmathto 是什么吗?\@currentlabelalign

更好的是:如果我想将预期的内容\@currentlabel与其他信息一起写入辅助输出文件,那么在环境中访问该信息的最佳方法是什么align

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand\storelabel[1]{%
    \xdef#1{\@currentlabel}}
\makeatother


\begin{document}

\begin{equation}
    A = B  \storelabel{\firstone}
\end{equation}
Now
\begin{align}
    C &= D \storelabel{\secondone}\\
    C' &= D' \storelabel{\thirdone}
\end{align}
\begin{equation}
    E = F \storelabel{\fourthone}
\end{equation}
The counters are \firstone, \secondone, \thirdone, \fourthone.
\end{document}

在此处输入图片描述

答案1

\refstepcounter的行为(例如)在以下意义上是不同的:equationalign

  • equation命令中\incr@eqnum(包装器\refstepcounter等)在环境开始时使用,因此\storelabel可以访问\@currentlabel
  • 但是align,该\storelabel命令是在tag设置之前使用的,即\@currentlabel在使用时为空。

该命令已被修补或被短暂地重新定义,其中在之后使用了\make@display@tag移位的定义。\xdef...{\@currentlabel}\incr@eqnum

\storelabel命令现在实际上是一个假命令,仅定义要设置的下一个名称,但宏名称的真正定义稍后完成。


\documentclass{article}
\usepackage{amsmath}

\makeatletter

\usepackage{etoolbox}

\newcommand{\extractstoretag}{%
  \@ifundefined{nextstoretag}{%
  }{%
    \expandafter\xdef\csname \nextstoretag\endcsname{\@currentlabel}
    \let\nextstoretag\relax
  }%
}
\AtEndEnvironment{equation}{%
  \extractstoretag%
}

\def\make@display@tag{%
  \if@eqnsw \incr@eqnum \extractstoretag \print@eqnum
  \else \iftag@ \df@tag \global\let\df@tag\@empty \fi
  \fi
  \ifmeasuring@
  \else
    \ifx\df@label\@empty
    \else
      \@xp\ltx@label\@xp{\df@label}%
      \global\let\df@label\@empty
    \fi
  \fi
}


\newcommand\storelabel[1]{%
  \xdef\nextstoretag{#1}%
}%
\makeatother


\begin{document}
\begin{equation}
    A = B  \storelabel{firstone}
  \end{equation}
  Now
\begin{align}
    C  &= D   \storelabel{secondone} \\
    C' &= D'  \storelabel{thirdone}
\end{align}
\begin{equation}
    E = F \storelabel{fourthone}
\end{equation}
The counters are \firstone, \secondone, \thirdone,\fourthone.
\end{document}

\.....以下是命令中带有宏的版本\storelabel

\documentclass{article}
\usepackage{amsmath}

\usepackage{etoolbox}

\makeatletter


\newcommand{\extractstoretag}{%
  \@ifundefined{nextstoretag}{%
    \relax%
  }{%
    \expandafter\xdef\csname \nextstoretag\endcsname{\@currentlabel}
    \let\nextstoretag\relax
  }%
}
\AtEndEnvironment{equation}{%
  \extractstoretag%
}

\def\make@display@tag{%
  \if@eqnsw \incr@eqnum \extractstoretag \print@eqnum
  \else \iftag@ \df@tag \global\let\df@tag\@empty \fi
  \fi
  \ifmeasuring@
  \else
    \ifx\df@label\@empty
    \else
      \@xp\ltx@label\@xp{\df@label}%
      \global\let\df@label\@empty
    \fi
  \fi
}


\newcommand{\storelabel}[1]{%
    \xdef\nextstoretag{\expandafter\@gobble\string#1}%
  }%
\makeatother


\begin{document}
\begin{equation}
    A = B  \storelabel{\firstone}
  \end{equation}

  \begin{align}
    C  &= D   \storelabel{\secondone} \\
    C' &= D'  \storelabel{\thirdone}
  \end{align}
  \begin{equation}
    E = F \storelabel{\fourthone}
\end{equation}


The counters are \firstone, \secondone, \thirdone\ and \fourthone.
\end{document}

更新/编辑

显然,获取写入.aux文件的“真实”内容的另一种解决方案是使用Heiko Oberdiek 的\getrefnumber包。refcount

答案2

来自amsmath 文档(部分15.2 实现标签和标记,第 39 页):

有时命令需要\tag将标签存储在安全的地方,稍后再处理,例如,对于对齐行中的标签,只有当\\看到行末尾的 时才能排版该标签。这样的标签存储在宏中\df@tag(表示“ de ferred tag”)。为此,我们提供了\make@df@tag宏。它的构建方式与宏\maketag@@[..] 非常相似。

\let\df@tag\@empty
\def\make@df@tag{\@ifstar\make@df@tag@@\make@df@tag@@@}

\make@df@tag进行适当的设置\@currentlabel和定义\df@tag

为了简化数学显示环境中跟踪\tag和命令的任务,我们将命令推迟到标签排版完成,类似于推迟 s 本身的方式。这允许任意放置和命令,也意味着我们只 在真正需要时增加计数器,从而避免了过去需要的无意义操作。\label\label\tag\label\tag\equation\setb@ck

\def\make@df@tag@@#1{%
  \gdef\df@tag{\maketag@@@{#1}\def\@currentlabel{#1}}}

自动生成的数字:

\def\make@df@tag@@@#1{\gdef\df@tag{\tagform@{#1}%
  \toks@\@xp{\p@equation{#1}}\edef\@currentlabel{\the\toks@}}}

上述讨论的关键部分是提到在显示中,amsmath控制和\label\tag将前者推迟到标签设置完成。从用户的角度来看,这便于使用*

因此,您要么必须利用标签设置来提取正确的\@currentlabel,要么必须坚持使用\label-\ref系统。refcount是以可扩展的方式提取引用的另一种选择,仍然使用类似\label--\ref的设置:

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath,refcount}

\begin{document}

\begin{equation}
  A = B  \label{firstone}
\end{equation}
Now
\begin{align}
  C &= D \label{secondone} \\
  C' &= D' \label{thirdone}
\end{align}
\begin{equation}
  E = F \label{fourthone}
\end{equation}
The counters are \getrefnumber{firstone}, \getrefnumber{secondone}, \getrefnumber{thirdone}, \getrefnumber{fourthone}.

\end{document}

*类似地(但相反),无法控制\caption浮动元素内部的放置 - 它与放置位置内联设置。因此,用户必须确保\label\caption;尝试通过允许他们将放置在显示屏内的任何地方amsmath来适应用户- 之前\label或者之后\tag甚至没有\tag

相关内容