当标题位于页面顶部时,PDF 书签将移至上一页的底部

当标题位于页面顶部时,PDF 书签将移至上一页的底部
\documentclass[12pt,a4paper]{mwrep}
\usepackage{lipsum}
\usepackage[nodisplayskipstretch]{setspace} \setstretch{1.3}
\usepackage[hidelinks,unicode,pdfencoding=auto]{hyperref}
\usepackage[all]{hypcap}
\begin{document}
\tableofcontents
\chapter{Chapter A}
\section{Section AA}
\lipsum
\section{Section AB}
\lipsum
Text

Text

Text

Text

Text

Text

\subsection{Subsection ABA}
\lipsum
\chapter{Chapter B}
\section{Section BA}
\lipsum
\subsection{Subsection BAA}
\lipsum
\end{document}

尝试单击目录中的 PDF 书签或超链接(章节 AB、子章节 ABA、子章节 BAA)。如果相应的 [子] 章节标题位于页面顶部,则它会转到上一页的底部。在“全页模式”下阅读 PDF 文档时,这很烦人,因为它会转到错误的页面(上一页)。出于某种原因,该问题不会影响章节标题。如何修复?

答案1

这是一个使用黑客我之前评论过使用包裹needspace。该\section命令被重新定义为\needspace{3\baselineskip}在每个部分之前插入。这确保至少有三行可用,否则该部分将从新页开始。我认为三行应该足够了,但如果不够,可以增加。

因此,将其添加到序言中可以解决 MWE 的问题:

\usepackage{needspace}
\let\OldSection\section%
\renewcommand{\section}{\needspace{3\baselineskip}\OldSection}%

以下是完整的 MWE:

\documentclass[12pt,a4paper]{mwrep}
\usepackage{lipsum}
\usepackage[nodisplayskipstretch]{setspace} \setstretch{1.3}
\usepackage[hidelinks,unicode,pdfencoding=auto]{hyperref}
\usepackage[all]{hypcap}

\usepackage{needspace}
\let\OldSection\section%
\renewcommand{\section}{\needspace{3\baselineskip}\OldSection}%

\begin{document}
\tableofcontents
\chapter{Chapter A}
\section{Section AA}
\lipsum
\section{Section AB}
\lipsum
Text

Text

Text

Text

Text

Text

\subsection{Subsection ABA}
\lipsum
\chapter{Chapter B}
\section{Section BA}
\section*{Section BB}
\lipsum
\subsection{Subsection BAA}
\lipsum
\end{document}

答案2

一个更简单的解决方案,它还处理了带星号的变体\section\chapter使用包\pretocmd的命令etoolbox。因此,你可以写

\usepackage{etoolbox}
\usepackage{需要空间}
\pretocmd{\chapter}{\needspace{3\baselineskip}}{}{}
\pretocmd{\section}{\needspace{3\baselineskip}}{}{}
\pretocmd{\subsection}{\needspace{3\baselineskip}}{}{}
\pretocmd{\subsubsection}{\needspace{3\baselineskip}}{}{}

得到所需的解决方案。

最初问题的原因可能是该\hyperref软件包与其他软件包不兼容。就我而言,问题出在\titlesec必须先安装的软件包。更改顺序后,上述命令就不再需要了。

相关内容