为什么 \usepackage{amsmath} 会破坏 \textnormal 中的 \hyperref?

为什么 \usepackage{amsmath} 会破坏 \textnormal 中的 \hyperref?

在以下示例中,第二个链接没有超链接:

\documentclass{article}

\usepackage{amsmath} % Removing this makes the second link work
\usepackage{hyperref}

\begin{document}
  \hyperref[abc-def]{link} % This link works
  \(\textnormal{\hyperref[abc-def]{link}}\) % But not this one
  \label{abc-def} Target
\end{document}

但是,删除后\usepackage{amsmath}第二个链接就修复了。为什么会这样?如何在不删除 amsmath 的情况下让第二个链接正常工作?

(这是从自动生成的 XeLaTeX 源简化的示例,因此修改代码本身相当不方便)。

这是一个稍微大一点的例子:

\documentclass{article}

\usepackage{amsmath}
\usepackage{hyperref}

\begin{document}
\hyperref[lbl]{term}
\(\textnormal{\hyperref[lbl]{term}}\)

\newpage
\subsubsection{Abc}
\phantomsection\label{lbl} def
\end{document}

答案1

更新已在 Hyperref v6.83p 中修复


看来 xetex/dvipdfm(x) 的宏代码仅在 mathchoice 的第一个选择中插入链接(因此它仅在 displaystyle 中有效)

您可以使用\mbox或类似的构造来强制文本大小,从而避免内部的数学选择,或者更好的解决方法是

在此处输入图片描述

这里我禁用了amstext\iffirstchoice@测试,所以宏无法知道它们被执行了四次。这是添加 hyperref 特殊时想要的,但它确实意味着如果您增加一个计数器,或者在其中创建一个索引条目,\textnormal您将获得 4 个增量或索引条目。

\documentclass{article}
\usepackage{amsmath}

\usepackage{hyperref}

\begin{document}

\makeatletter
\let\iffirstchoice@\iftrue
\let\firstchoice@false\relax
\makeatletter

\hyperref[lbl]{1term}
\(\textnormal{\hyperref[lbl]{2term}} x^{\textnormal{\hyperref[lbl]{3term}}}\)

\newpage
\subsubsection{Abc}
\phantomsection\label{lbl} def
\end{document}

相关内容