显然,如果我想在图片标题中使用数学等式,并且在文档序言中使用 onlyamsmath 和 hyperref 包,则似乎会引发警告 »LaTeX 警告:标签可能已更改。请重新运行以获取正确的交叉引用。«:
\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage[all,error]{onlyamsmath}
\usepackage{hyperref}
\begin{document}
Reference~\ref{fig:foobar}.
\begin{figure}[htb!]
\caption{Foo Bar $f=2$}
\label{fig:foobar}
\end{figure}
\end{document}
我目前不知道为什么会发生这种情况以及我应该改变什么......
答案1
我认为,正确的解决方案是onlyamsmath
根本不使用:它造成的损害比它解决的问题还多。
但是,如果你真的喜欢使用它,那么就习惯于写
\(a=b\)
对于所有公式,而不是$a=b$
。请记住还要加载包,否则在尝试使用或时,fixltx2e
标题中的公式将导致灾难。\listoffigures
\listoftables
\documentclass{scrartcl}
\usepackage{fixltx2e}
\usepackage{amsmath}
\usepackage[all,error]{onlyamsmath}
\usepackage{hyperref}
\begin{document}
Reference~\ref{fig:foobar}.
\begin{figure}[htb!]
\caption{Foo Bar \(f=2\)}
\label{fig:foobar}
\end{figure}
\end{document}
答案2
当您使用 LaTeX 内联数学环境而不是常用的(虽然是普通的 TeX 指令)\(
...时,这个问题就解决了。\)
$
$
答案3
解释很简单 - 但只有你知道它之后才会明白;)。实际上,我也遇到过类似的问题没有 hyperref
,但我怀疑问题是一样的。
当你在源文件上运行 LaTeX 时,第一的文件aux
被读取并且后命令\AtBeginDocument
被执行。因为onlyamsmath
说
\AtBeginDocument{\catcode‘\$=13 }
这意味着标签等读在正常的 catcode 机制下$
,并且已检查在编译期间,将$
catcode 设置为“active”。因此,对于所有使用此字符的标签,LaTeX 将总是抱怨。(而让问题变得棘手的是字符代码文件中所有内容aux
保持不变,即aux
文件本身在某种意义上保持不变diff
。
因此,解决这个问题的方法很简单:只需说
\catcode`\$=13
在你的序言中(最好就在之前编辑: 不是之前,而是之后,因为它也onlyamsmath
使用$
其正常的 catcode!,\usepackage{onlyamsmath}
或者至少要小心,以便在这一行和加载该包之间绝不实际上使用美元符号)。