如何获取 \tag

如何获取 \tag

我正在研究另一个\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方式有点复杂。命令被重新定义为将标签存储在 中,并且\labelamsmath.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}

相关内容