amsmath - 一个方程中有多个标签

amsmath - 一个方程中有多个标签

我想在使用时在同一个方程中使用多个标签amsmath。基本 latex 已经有了这个功能,但没有 amsmath,它似​​乎以复杂的方式操作标签。是否可以修改代码amsmath.sty以恢复此功能?

或者,如何临时卸载amsmath包?当使用编译不同的文章时会出现此问题\include,有些使用amsmath,而其他不使用。但我发现在 latex 中无法卸载包。

答案1

根据cleveref用户指南第 86 页,

数学,原始\label命令存储在中\ltx@label,并\label@in@display替换\label[单行]方程式内。\label@in@display只是保存标签以供以后使用,而定义它则留到方程式结束时,\ltx@label最后调用。

因此,您可能希望在序言中包含以下代码,加载amsmath包:

\makeatletter
\let\ltxxlabel\ltx@label
\makeatother

这样你就有了一个不包含“秘密信件”的命令@。或者,你可以执行命令\let\ltxxlabel\label 加载amsmath包。然后,替换\label文档中的所有命令——除了当然,那些实际上与方程数字相关的——与\ltxxlabel

我无法亲自尝试这个建议的解决方案,因为我不清楚如何\label在文档中使用该命令其他而不是与方程数字建立关联。尽管如此,我还是鼓励你尝试这种方法。


附录:用户指南中对宏cleveref的处理有以下说明\label多行方程环境(例如gatheralignmultline)的amsmath环境:

amsmath多行方程环境扫描其主体两次:一次用于测量,一次用于排版。在测量阶段,通过让其执行 来禁用该命令\label 。...\@gobble不幸的是,amsmath在设计时没有\label考虑到重新定义...该环境的multline工作方式与其他环境略有不同amsmath,即\label已禁用在排版阶段,已启用在测量阶段。

鉴于这些观察,似乎只有敢于冒险和大胆的人才会想要深入研究重新定义在多行方程环境中amsmath使用该\label命令的方式。我必须承认我不够大胆,至少在这一类别中不够大胆……

答案2

\documentclass{scrartcl}
\usepackage{amsmath}
\begin{document}

\begin{align}\label{foobar}
y &= x \tag{foo}\\
y &= x \tag*{[bar]}\\
y &= x \tag{baz}\\
y &= x \label{foobarbaz}
\end{align}

See Equation~\ref{foobar} and \ref{foobarbaz}.
\end{document}

在此处输入图片描述

答案3

原因是amsmath环境align实际上会在排版之前收集或聚集所有内容,以便进行水平对齐。至少有一种解决方法是扭转你的思维,因此参考方程中的参数和标签将它们放在文本中。这样,在 中两次标记一个条目就不会产生冲突align

这是一个说明这一概念的最小例子:

引用 amsmath 的 align 环境中的参数

\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\newcounter{parms} \renewcommand{\theparms}{[\arabic{parms}]}
\newcommand{\newparm}[1]{%
  \refstepcounter{parms}\arabic{parms}\label{#1}%
}
\begin{document}
\begin{align}
  y &= ax^2+bx+c \label{eq1}\\
  z &= i_{\ref{eq-i}}+j_{\ref{eq-j}}+k_{\ref{eq-k}} \label{eq2}
\end{align}
See~\eqref{eq1} and~\eqref{eq2}.
Specifically,~\eqref{eq2} has parameters~\newparm{eq-i},~\newparm{eq-j} and~\newparm{eq-k}.
\end{document}

该命令\newparm{<label>}定义参数的标签(使用\refstepcounter)。它还打印参数编号,然后将其标记为<label>。参数的显示由参数计数器的\theparms位置设置。所有这些都可以修改。parms

相关内容