![未引用的方程式中未显示引用的方程式编号](https://linux22.com/image/308504/%E6%9C%AA%E5%BC%95%E7%94%A8%E7%9A%84%E6%96%B9%E7%A8%8B%E5%BC%8F%E4%B8%AD%E6%9C%AA%E6%98%BE%E7%A4%BA%E5%BC%95%E7%94%A8%E7%9A%84%E6%96%B9%E7%A8%8B%E5%BC%8F%E7%BC%96%E5%8F%B7.png)
我非常喜欢这个mathtools
选项showonlyrefs
,它允许仅在有对方程的引用时才显示方程的标签。问题是,如果方程有一个从未被引用的标签,方程中的引用将被抑制。以下 MWE 更容易理解:
\documentclass{article}
\usepackage{mathtools}
\mathtoolsset{showonlyrefs}
\begin{document}
CASE A: equation with reference has no label
\begin{equation}
1 = 1 \label{eq1a}
\end{equation}
\begin{equation}
1 = 1 \qquad \text{(see \eqref{eq1a})}
\end{equation}
\hrulefill
CASE B: equation with reference has label and is referenced itself \eqref{eq2b}
\begin{equation}
1 = 1 \label{eq1b}
\end{equation}
\begin{equation} \label{eq2b}
1 = 1 \qquad \text{(see \eqref{eq1b})}
\end{equation}
\hrulefill
CASE C: equation with reference has label but is not referenced itself
\begin{equation}
1 = 1 \label{eq1c}
\end{equation}
\begin{equation} \label{eq2c}
1 = 1 \qquad \text{(see \eqref{eq1c})}
\end{equation}
\end{document}
经过足够的编译运行后,结果如下:
情况 A 和 B 的行为与预期一致,但在情况 C 中却没有参考 (4)。
尽管如果没有对方程的引用就很容易找到解决方法(只需删除标签),但我更愿意有一个自动解决方案。
答案1
建议使用
\mathtoolsset{showonlyrefs,showmanualtags}
当你使用showonlyrefs
我不太确定什么是避免添加的最佳解决方案showmanualtags
(原作者始终建议同时使用两者)。
这里的问题最终在于内部逻辑。该showonlyrefs
功能与排版方程编号。这在两个地方使用:
- 在显示的数学公式中排版方程编号,和
- 在
\eqref
这里的问题是,它\eqref
实际上是在显示的数学环境中使用的,因此最终针对环境标签而不是给定的标签进行测试。
发行showmanualtags
可以规避这一点。
一个更好的解决方案可能是简单地修补\eqref
正在使用的版本showonlyrefs
,使用以下命令:
\MHInternalSyntaxOn
\def\MT_extended_eqref:n #1{
\protected@write\@auxout{}
{\string\MT@newlabel{#1}}
\textup{\let\df@label\@empty\MT_prev_tagform:n {\ref{#1}}}
}
\MHInternalSyntaxOff
诀窍在于,\df@label
只要在上下文中使用标记形式,就将其清空\eqref
。
我想我会将其添加到下一个mathtools
版本中。