itemize
指向以嵌套开头或经常被破坏的定理类环境的超链接enumerate
(例如http://tex.stackexchange.com/a/187647)下面是 MWE:
\documentclass{amsart}
\usepackage{hyperref}
\newtheorem{theorem}{Theorem}
\begin{document}
\begin{theorem}
\label{bigthm}
\begin{itemize}
\item A claim.
\item Another claim.
\end{itemize}
\end{theorem}
Let's prove Theorem~\ref{bigthm}.
\end{document}
这会产生一个警告:
pdfTeX warning (dest): name{theorem.1} has been
referenced but does not exist, replaced by a fixed one
并且超链接不起作用。
(顺便说一句,如果我们使用article
而不是amsart
,那么一切都会按预期工作。是什么让 AMS 文档类的行为有所不同?)
\leavevmode
一个解决方案是在之后添加\label{bigthm}
:
\begin{theorem}
\label{bigthm}\leavevmode
\begin{itemize}[...]
这修复了超链接,但当然也改变了格式,这是我不想要的。
一个更好的解决方案(感谢,Simon!),它不会改变格式,而是\phantomsection
在之前添加\label{bigthm}
:
\begin{theorem}
\phantomsection\label{bigthm}
\begin{itemize}[...]
现在一切正常。太棒了!
然而,可惜的是,这个更好的解决方案不适用于\autoref
:
Let's prove~\autoref{bigthm}.
现在可以生产Let’s prove section 1.
(尽管带有有效的超链接)。
\autoref
所以我的问题是:有没有办法在不改变格式的情况下修复超链接?
答案1
带有 的版本\fakephantomsection
,它使用\@currenvir
,即当前环境名称,以获取正确的自动引用名称。
这与所做的基本相同\phantomsection
,但使用了正确的环境名称。
该问题已为人所知,并在以下文档中提及amsart
:
• amsthm 固有的其他问题。
◦ 当定理以列表开头时,对第一项进行超链接
\documentclass{amsart}
\usepackage{hyperref}
\newtheorem{theorem}{Theorem}
\makeatletter
\newcommand{\fakephantomsection}{%
\Hy@MakeCurrentHref{\@currenvir.\the\Hy@linkcounter}
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
}
\makeatother
\begin{document}
\tableofcontents
\clearpage
\section{Foo}
\begin{theorem}
\fakephantomsection\label{bigthm}
\begin{itemize}
\item A claim.
\item Another claim.
\end{itemize}
\end{theorem}
Let's prove Theorem~\ref{bigthm} \autoref{bigthm}.
\end{document}
答案2
我正在使用另一个答案中提出的命令的修改:
\newcommand*{\fakephantomsection}{%
\Hy@GlobalStepCount\Hy@linkcounter%
\Hy@MakeCurrentHref{\@currenvir.\the\Hy@linkcounter}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
}