如何使超链接覆盖目录中的整行(包括点)?

如何使超链接覆盖目录中的整行(包括点)?

选项linktoc=all超链接包使参考文本和页码都成为可点击的超链接。但是,这些点仍然不是超链接。这不是很重要,但我出于好奇想知道这是否是 hyperref 的一个限制,注意到 MS Word 和 OpenOffice 以及其他工具允许这些点可点击?

可能不推荐?

答案1

目录 (TOC) 中的超链接由\contentsline中定义的命令生成hyperref.stylinktoc=all选项设置使\contentsline添加单独的标题和页码链接。通过在本地使用 修补适当的引线生成命令,可以将第三个链接应用于标题和页码之间的引线。etoolbox将整个目录条目包含在超链接中会更加整洁,但这是一个相对困难的问题。

对于由内部格式化的目录,前导符由中定义的latex命令生成 。以下补丁只是将前导符括在指向当前目录条目位置的超链接中,该超链接作为 的第四个参数传递。\@dottedtoclinelatex.ltx\contentsline

\documentclass{report}
\usepackage[linktoc=all]{hyperref}
\usepackage{etoolbox}

\makeatletter
\pretocmd{\contentsline}
  {\patchcmd{\@dottedtocline}
     {\leaders}
     {\hyper@linkstart{link}{#4}\leaders}
     {}
     {}%
   \patchcmd{\@dottedtocline}
     {\hfill}
     {\hfill\hyper@linkend}
     {}
     {}}
  {}
  {}
\makeatother

\begin{document}
\tableofcontents
\chapter{First Chapter} \pagebreak
\section{First Section} \pagebreak
\subsection{First Subsection}
\chapter{Second Chapter} \pagebreak
\section{Second Section} \pagebreak
\subsection{Second Subsection}
\end{document}

带有链接边框的结果看起来很糟糕,但是带有的则不是那么糟糕colorlinks=trueenter image description here

只要引导符由 生成,此补丁程序就足够通用,可以与通过包定义的用户命令格式化的 TOC 一起使用\@dottedtoclineKOMA-Script就是tocstyle这种包的一个例子 - 它重新定义了\@dottedtocline

tocloftmemoir发出命令\cftdotfill而不是\@dottedtocline。下面的代码演示了一个适用于tocloft包和memoir文档类的补丁。

\documentclass{memoir}
\usepackage[linktoc=all]{hyperref}
\usepackage{etoolbox}

\makeatletter
\pretocmd{\contentsline}
  {\patchcmd{\cftdotfill}
     {\leaders}
     {\hyper@linkstart{link}{#4}\leaders}
     {}
     {}%
   \patchcmd{\cftdotfill}
     {\hfill}
     {\hfill\hyper@linkend}
     {}
     {}}
  {}
  {}
\makeatother

\setcounter{tocdepth}{2}
\renewcommand*{\cftdot}{\ensuremath{\ast}}
\renewcommand*{\cftsectionfont}{\itshape}
\renewcommand*{\cftsectionleader}{\cftdotfill{\cftsectiondotsep}}
\renewcommand*{\cftsubsectionfont}{\scshape}
\renewcommand*{\cftsubsectiondotsep}{9}
\renewcommand*{\cftsubsectionleader}{\cftdotfill{\cftsubsectiondotsep}}

\begin{document}
\tableofcontents
\chapter{First Chapter} \pagebreak
\section{First Section} \pagebreak
\subsection{First Subsection}
\chapter{Second Chapter} \pagebreak
\section{Second Section} \pagebreak
\subsection{Second Subsection}
\end{document}

enter image description here

答案2

我猜想hyperref即使设置了该选项,前导点仍无法点击的一个原因linktoc=all是,目录中并非所有行都带有点。例如,在article文档类的默认定义中,子节和子子节带有点,而节则没有。

这些默认设置并非一成不变,当然可以使用 LaTeX 自己的命令或更简单的自定义包(如)进行更改tocloft。更糟糕的是,前导点的“样式”(例如,它们的密度或类型:点、星号、心形等)也可以更改。据我所知,这些前导点不构成可以全局操作的单独组(因此 hyperref 可以以某种方式访问​​它们);这显然与页码和章节标题的情况形成对比。Hyperref 可能不会(在我看来也不应该)假设代码的哪些其他部分可能会更改目录的样式,因此(我认为明智之举)不会尝试对点进行任何操作。:-)

相关内容