有人可以解释一下环境中的amsmath
to 是什么吗?\@currentlabel
align
更好的是:如果我想将预期的内容\@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
的行为(例如)在以下意义上是不同的:equation
align
- 在
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
(表示“d
ef
erredtag
”)。为此,我们提供了\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
。