为什么当使用 [fleqn] 与 amsmath 时 \label 在数学模式下不起作用?

为什么当使用 [fleqn] 与 amsmath 时 \label 在数学模式下不起作用?

尝试以下操作

\documentclass[11pt]{article}
\usepackage[fleqn]{amsmath}

\begin{document}
\newcounter{eqnthing}\setcounter{eqnthing}{0}
\[a+b=c\refstepcounter{eqnthing}\label{maththing}\]
\par See(\ref{maththing}).
\refstepcounter{eqnthing}\label{linething}
\par See (\ref{linething}).
\end{document}

第一个引用不起作用。然后注释掉\usepackage[fleqn]{amsmath}它就可以了。它也适用于,\usepackage{amsmath}所以这个fleqn选项似乎是罪魁祸首。

这是一个已知错误吗?有解决方法吗?

答案1

这是方式amsmath重新设计了方程式,尤其是方程式内部的标签 - 使用fleqn包选项时处理方式不同。具体来说,amsmath重新定义了\label工作原理,因为在某些情况下(最明显的是在和朋友等多重解析项目中align),它必须将其打开和关闭以避免多次定义标签。

\label您仍然可以使用访问旧的/传统的 LaTeX \ltx@label,我为其定义了如下接口\ltxlabel

在此处输入图片描述

\documentclass[11pt]{article}
\usepackage[fleqn]{amsmath}
\makeatletter
\newcommand{\ltxlabel}{\ltx@label}
\makeatother

\newcounter{eqnthing}\setcounter{eqnthing}{0}
\begin{document}

\[a+b=c\refstepcounter{eqnthing}\hfill(\arabic{eqnthing})\ltxlabel{maththing}\]

See (\ref{maththing}).

$a+b=c$\refstepcounter{eqnthing}\hfill(\arabic{eqnthing})\label{linething}

See (\ref{linething}).
\end{document}

答案2

我不确定你为什么要以错误的方式定义已经出现的内容amsmath,即\tag

\documentclass[11pt]{article}
\usepackage[fleqn]{amsmath}

\newcounter{eqnthing}\setcounter{eqnthing}{0}
\newcommand\geofflabel[1]{%
  \refstepcounter{eqnthing}\tag{\theeqnthing}\label{#1}%
}

\begin{document}
\[
a+b=c\geofflabel{maththing}
\]
See~\eqref{maththing}.
\begin{align*}
a&=1\geofflabel{a}\\
b&=11111\\
c&=0\geofflabel{c}
\end{align*}
See \eqref{a}~and~\eqref{c}.
\end{document}

在此处输入图片描述

答案3

在 TeX.SX 上查看,似乎该fleqn选项有很多错误,例如 /fleqn-amsmath 和 frenchb-babel 的方程间距问题使用 amsmath 包中的选项 fleqn 解决问题fleqn 和 qedhere 的联合使用,...

我不确定这个问题是否为人所知。问题似乎是当 amsmath 关闭显示的方程式时,它会忘记在选项fleqn存在时放入标签。这是一个粗略的破解方法,可以解决您的 MWE 问题……尽管我还没有对其进行广泛的测试,所以也许它会产生其他问题:

在此处输入图片描述

以下是代码:

\documentclass[11pt]{article}
\usepackage[fleqn]{amsmath}
\makeatletter
\def\endmathdisplay@a{%
  \if@eqnsw \gdef\df@tag{\tagform@\theequation}\fi
  \if@fleqn \ifx\df@label\@empty \else \@xp\ltx@label\@xp{\df@label}\fi\@xp\endmathdisplay@fleqn
  \else \ifx\df@tag\@empty \else \veqno \alt@tag \df@tag \fi
    \ifx\df@label\@empty \else \@xp\ltx@label\@xp{\df@label}\fi
  \fi
  \ifnum\dspbrk@lvl>\m@ne
    \postdisplaypenalty -\@getpen\dspbrk@lvl
    \global\dspbrk@lvl\m@ne
  \fi
}
\makeatother

\begin{document}
\newcounter{eqnthing}\setcounter{eqnthing}{0}
\[ a+b=c\refstepcounter{eqnthing}\hfill(\arabic{eqnthing})\label{maththing} \]
\par See (\ref{maththing}).
\refstepcounter{eqnthing}\hfill(\arabic{eqnthing})\label{linething}
\par See (\ref{linething}).
\end{document}

毫无疑问,egreg 很快就会出现并给出“适当的”解决方案:)

相关内容