我想在使用时在同一个方程中使用多个标签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
多行方程环境(例如gather
、align
和multline
)的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
。
这是一个说明这一概念的最小例子:
\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