\intertext
当hyperref 也使用时,我遇到了问题\vref
。请考虑以下最小示例:
\documentclass{article}
\usepackage{amsmath, varioref}
\usepackage{hyperref}
\begin{document}
\begin{equation}
\label{kinetic-energy}
E = mc^2
\end{equation}
\begin{gather}
A \\
\intertext{ and therefore due to \vref{kinetic-energy}: }
B
\end{gather}
\end{document}
产生以下模式的错误消息:
! Package amsmath Error: Multiple \label's: label '1@xvr' will be lost.
在聚集环境的末尾。
如果我注释掉 hyperref,或者用这个\ref
代替\vref
示例也可以。我使用的是 TeXLive 2011。
我是否遇到了软件包错误/冲突,或者我错过了什么补救措施?
更新: 我尝试了 Mico 的解决方案,除了 cleveref 和 refstyle (sic) 之间略有不兼容外,它都能正常工作;公式编号和页码引用之间缺少一个空格。在包含 cleveref 后将其添加到序言中似乎可以解决问题:
\makeatletter
\let\withoutspacecref@@vpageref\cref@@vpageref
\renewcommand\cref@@vpageref{\space\withoutspacecref@@vpageref}
\makeatother
2023 年更新:上述问题在 2023 年似乎不再相关。据推测,这是因为varioref
和hyperref
包在这 11 年中都进行了修改。例如,\vref
如果指令与交叉引用的对象出现在同一页上,则不再输出字符串“在同一页上”。
然而,这种情况仍然hyperref
会给 带来问题\vref
。例如,假设命令
\usepackage[nospace]{varioref}
% since 2019, it's recommended to load varioref with the 'nospace' option
\usepackage[colorlinks]{hyperref}
在前导码中执行。然后,在 之后和 之前插入一条\clearpage
指令。OP 的 MWE 输出为:equation
align
我不确定这是否是一个彻头彻尾的错误,但“在前一页”现在成为超链接的一部分这一事实至少可以说是有些出乎意料的。
相反,如果cleveref
加载,则会得到以下输出:
我敢说这更接近大多数用户所期望得到的。
因此,建议:为了避免varioref
和之间出现一些意外的相互作用hyperref
,也有助于加载cleveref
——后和varioref
都是hyperref
肯定的。
\documentclass{article}
\usepackage{amsmath}
\usepackage[nospace]{varioref} % 'nospace' option is recommended since 2019
\usepackage[colorlinks]{hyperref}
\usepackage{cleveref} % <-- new
\begin{document}
\begin{equation}
\label{kinetic-energy}
E = mc^2
\end{equation}
\clearpage
\begin{gather}
A \\
\intertext{and therefore, due to \vref{kinetic-energy}:}
B
\end{gather}
\end{document}
答案1
varioref
您确实发现了和包之间存在(轻微的)不兼容性hyperref
。解决此问题的方法是再加载一个交叉引用包,即聪明人包。这种方法似乎有效,因为cleveref
它修改了 的一些varioref
内部结构,以便更好地varioref
协作cleveref
;在此过程中,varioref
也hyperref
变得相互(更)兼容。请注意,在下面的 MWE 中,执行的交叉引用命令仍然是\vref
(而不是,比如说\cref
)。
顺便说一下,cleveref
应该加载包之后比所有其他执行交叉引用任务的包都要好。事实上,强烈建议加载cleveref
最后的,即在所有其他包都已加载之后,只是因为人们可能不确定其他包是否可以执行某些任务 - 无论它们最初看起来多么微不足道 - 这些任务与 LaTeX 的交叉引用机制有关。
\documentclass{article}
\usepackage{amsmath, varioref}
\usepackage[colorlinks]{hyperref} % added 'colorlinks' option to make output
% show up in attached image file
\usepackage{cleveref} % new instruction
\begin{document}
\begin{equation}
\label{kinetic-energy}
E = mc^2
\end{equation}
\begin{gather}
A \\
\intertext{and therefore due to \vref{kinetic-energy}: }
B
\end{gather}
\end{document}