尝试以下操作
\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 很快就会出现并给出“适当的”解决方案:)