使用 intertext 与 varioref 和 hyperref 丢失标签

使用 intertext 与 varioref 和 hyperref 丢失标签

\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 年似乎不再相关。据推测,这是因为variorefhyperref包在这 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 输出为:equationalign

在此处输入图片描述

我不确定这是否是一个彻头彻尾的错误,但“在前一页”现在成为超链接的一部分这一事实至少可以说是有些出乎意料的。

相反,如果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;在此过程中,variorefhyperref变得相互(更)兼容。请注意,在下面的 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}

在此处输入图片描述

相关内容