我正在研究另一个\listofequations
解决方案(这里),然后我注意到 和\theequation
都不能\@currentlabel
与 一起使用\tag
。其他 LOE 解决方案似乎没有解决这个问题,而且我在 amsmath.sty 中找不到任何有用的东西。(很多东西都不起作用。)
我可以使用\mytag
宏,但那是最后的手段。
\documentclass{article}
\usepackage{newfloat}
\DeclareFloatingEnvironment[fileext=loe,listname={List of Equations}]{eqn}
\makeatletter
\newcommand{\eqnlabel}[1]{\addcontentsline{loe}{eqn}{\string\numberline{\@currentlabel}#1}}
\newcommand{\mytag}[1]{\tag{#1}\edef\@currentlabel{#1}}
\makeatother
\usepackage{amsmath}
\begin{document}
\listofeqns
\begin{equation}
x=a
\eqnlabel{For list of equations}
\end{equation}
\begin{equation}
y=b \tag{A} \label{test}
\eqnlabel{tag test}
\end{equation}
\ref{test}
\end{document}
答案1
我非常确定这是一个范围问题。
如果我没看错amsmath.sty
的话: 的重新定义\@currentlabel
仅在打印标签时发生。为此,\tag
设置\df@tag
为打印标签并设置 的命令。 并且的工作\@currentlabel
方式有点复杂。命令被重新定义为将标签存储在 中,并且\label
amsmath.sty
\label
\df@label
什么时候生成方程编号后,它会检查是否\df@label
定义,如果是,它会调用原始 LaTeX \label
。
这里的关键是,的设置范围\@currentlabel
非常严格。如果您尝试\@currentlabel
在生成标签后进行访问,您将无法真正获取正确的值。
因此这也提出了一个解决方案:amsmath.sty
将标签值存储在中\df@tag
。当您调用它时,它会使用生成标签的打印形式\maketag@@@
并设置。因此,您可以在交换后通过调用自己\@currentlabel
在本地设置,这样您就不会打印另一份方程标签。\@currentlabel
\df@tag
\maketag@@@
概念证明(可能存在意想不到的副作用):
\documentclass{article}
\usepackage{newfloat}
\DeclareFloatingEnvironment[fileext=loe,listname={List of Equations}]{eqn}
\usepackage{amsmath}
\makeatletter
\newcommand\eqnlabel[1]{%
\ifmeasuring@
\else
\begingroup
\let\maketag@@@\@gobble
\df@tag
\addcontentsline{loe}{eqn}{\string\numberline{\@currentlabel}{#1}}
\endgroup
\fi}
\makeatother
\begin{document}
\listofeqns
\begin{equation}
x=a
\eqnlabel{For list of equations}
\end{equation}
\begin{equation}
y=b \tag{A} \label{test}
\eqnlabel{tag test}
\end{equation}
\ref{test}
\end{document}
生成的.aux
文件现在正确显示
\relax
\@writefile{loe}{\contentsline {eqn}{\numberline{1}{For list of equations}}{1}{}\protected@file@percent }
\@writefile{loe}{\contentsline {eqn}{\numberline{{A}}{tag test}}{1}{}\protected@file@percent }
\newlabel{test}{{{A}}{1}}
\gdef \@abspage@last{1}