为什么将超目标添加到目录会改变分页?

为什么将超目标添加到目录会改变分页?

我正在尝试在目录中添加指向行的链接,例如这个问题. 似乎标准答案是包括如下行

\addtocontents{toc}{\protect\hypertarget{label}{}}

在文档的适当部分。这很好,只是目录似乎不愿意在有此行的子部分之间设置分页符,这会导致尴尬的间距。我在下面发布了一个例子。

\documentclass[12pt,letterpaper]{article}
\usepackage[colorlinks,linkcolor=black]{hyperref}

\begin{document}

x\vspace{5.5in}
\tableofcontents

\section{A}
\section{B}
\addtocontents{toc}{\protect\hypertarget{moo}{}}
\subsection{BA}
\addtocontents{toc}{\protect\hypertarget{moo}{}}

\subsection{Pagebreak should go below here}
% but it doesn't if this is uncommented
%\addtocontents{toc}{\protect\hypertarget{moo}{}}

\subsection{BC}
\addtocontents{toc}{\protect\hypertarget{moo}{}}
\subsection{BD}
\addtocontents{toc}{\protect\hypertarget{moo}{}}
\section{C}


\end{document}

为什么会这样?我怎样才能指定分页符是可以的?

答案1

你的问题的答案为什么将超目标添加到目录会改变分页?是通过添加将在文件\addtocontents{toc}{\protect\hypertarget{moo}{}}中添加一个新行。在下一次编译时,PDF 中会出现一个带有不可见超目标的额外空行,这在我们看来分页已经发生了变化。.aux\@writefile{toc}{\hypertarget {moo}{}}

为了克服这种情况,我们需要调整\section\subsection以及需要导航的任何部分命令,如下例所示:

\documentclass[12pt,twoside]{article}
\usepackage[bookmarks=false,colorlinks,linkcolor=black]{hyperref}
\usepackage{lipsum}

\makeatletter
\def\ps@myheading{%
   \def\@oddhead{\mbox{}\hfill\slshape\rightmark}%
   \if@twoside
     \def\@evenhead{\slshape\leftmark\hfill\mbox{}}%
   \else% 
    \let\@evenhead\@oddhead%
   \fi%
   \def\@oddfoot{\mbox{}\hfil\thepage\hfil\mbox{}}%
   \let\@evenfoot\@oddfoot%
}
\def\linksection#1{%
   \section[\string\smash{\string\raisebox{\baselineskip}{\string\hypertarget{moo.\thesection}{}}}#1]{#1}%
   \def\rightmark{\hyperlink{moo.\thesection}{\thesection.\quad #1}}%
   \let\leftmark\rightmark%
}
\def\linksubsection#1{%
   \subsection[\string\smash{\string\raisebox{\baselineskip}{\string\hypertarget{moo.\thesubsection}{}}}#1]{#1}%
   \def\rightmark{\hyperlink{moo.\thesubsection}{\thesubsection.\quad #1}}%
   \let\leftmark\rightmark%
}
\def\nolinksection#1{%
   \section{#1}%
   \def\rightmark{\thesection.\quad #1}%
   \let\leftmark\rightmark%
}
\def\nolinksubsection#1{%
   \subsection{#1}%
   \def\rightmark{\thesubsection.\quad #1}%
   \let\leftmark\rightmark%
}
\pagestyle{myheading}
\makeatother

\begin{document}

\mbox{}\vspace{5.5in}
\tableofcontents

\linksection{A}

\lipsum

\linksection{B}
\lipsum

\nolinksubsection{BA}
\lipsum

\nolinksubsection{Pagebreak should go below here}
\lipsum
% but it doesn't if this is un-commented

\linksubsection{BC}
\lipsum

\linksubsection{BD}
\lipsum

\nolinksection{C}
\lipsum

\end{document}

定义了一种名为 的新页面样式(页眉和页脚),myheading将导航放在页眉中,然后返回目录条目。此外,对于需要使用超链接进行导航的部分,命令、等分别更改为 。而那些不需要\section导航\subsection的分别定义为。这些宏将在目录和页眉中定义相应的条目。\linksection\linksubsection\section\subsection\nolinksection\nolinksubsection\hypertarget\hyperlink

希望这可以帮助。

相关内容