我无法在我的文档之外以微型形式重现此问题,因此我寻求更多调试帮助,以了解如何在我拥有的文档中修复此问题。
问题是,我有一个部分,内容如下:
First is \hyperref[P1]{Item I}, go there. \hyperref[P2]{Next} is item 2, and finally is \hyperref[P3]{Item III}.
\newpage
%% later...
\section*{Item I}
\label{P1}
stuff
\section*{Item II}
\label{P2}
stuff
\section*{Item III}
\label{P3}
stuff
认为
- 项目 I,P1 在第 1 页。
- 第 II 项,P2 在第 6 页。
- 第 III 项,P3 在第 20 页。
无论我做何改变,\hyperref[P3]{Item III}
都指向第 5 页,而不是第 20 页。
我尝试了以下调试:
- 我是否确实错误地将 P3 标记为 P2 了? 不,是 P3。
- 我是否实际上未能更新原始超链接,所以它仍然显示 P2?不,上面写的是 P3。
- 我确定吗? 我不如给它起个完全不同的名字,比如“位置”。
\hyperref[LOCATION]{Item III} \section*{Item III}\label{LOCATION}
仍然指向第 5 页,而不是第 20 页! - 我是否遗漏了错误,例如: L
aTeX Warning: There were undefined references.
? 没有,没有缺失的引用。 - 如何完全移除
\label{P2}
并查看 P3 是否仍指向那里? 删除后,是的,它仍然指向第 5 页,而现在没有任何标签有意指向该页。 - 那么如何调试页面本身呢?
\pageref{P1} \pageref{P2} \pageref{P3}
打印结果2 7 21
非常接近,但这告诉我 pageref{P2} 实际上也是不正确的。它不是指向 P2,而是指向 P1 的末尾,就像 P3 指向 P1 的末尾一样。
除此之外,我不知道如何使第一个引用工作之后定义的任何引用起作用,我的意思是指向第 5 页以外的其他地方。可能发生了什么?
答案1
你需要使用
\phantomsection
\section*{<title>}
\label{<label>}
因为没有\section*
像 那样设置 的超目标\section
。如果你只\section*
在文档中使用,你可以使用
\let\oldsection\section % Copy \section into \oldsection
\renewcommand{\section}{%
\phantomsection % Set hyper target
\oldsection*
}
在你的序言中
答案2
另一种方法是使用和hyperref
,nameref
不需要 \phantomsection
s:
\documentclass{article}
\usepackage[colorlinks,linkcolor=blue]{hyperref}
\usepackage{lipsum}
\usepackage{nameref}
\begin{document}
First is \Nameref{P1}, go there. \par
\hyperlink{X}{Here} is \nameref{P2} (\Nameref{P2}).\par
But there are a \Nameref{P3}.\par
And there are not three without \hyperlink{Y}{four} in page \pageref{P4}
\newpage
\section*{Item I}
\label{P1}
\lipsum[1-20]
\section*{Item II}
\label{P2}\hypertarget{X}
\lipsum[21-40]
\section*{Item III}
\label{P3}
\lipsum[41-50]
\section*{Item IV}
\label{P4}
\hypertarget{Y}
\lipsum[1]
\end{document}