所有标题与相应的目录条目反向链接

所有标题与相应的目录条目反向链接

我偶然发现了一个 PDF,它将目录条目和正文中的标题相互链接起来。它是使用 Adob​​e Indesign 创建的。如果我正在阅读这本书并需要查看目录,我可以轻松单击标题本身以在目录中查看它。如果内容有许多子标题,这将是一个有用的功能。是否有任何软件包可以实现此功能。请指导。

答案1

首先,使用etoolbox\patchcmd可以向 TOC 中添加创建超目标的命令:

\patchcmd{\addcontentsline}{{#2}{#3}{\thepage }}%
   {{#2}{#3}{\protect\hypertarget{back\@currentHref}{}\thepage }}%
   {\typeout{*patch success}}{\typeout{*patch failure}}

这里我选择直接修改命令,因为在修改后,\addcontentsline它仍然被 LaTeX 调用\@startsection(实际上) 。这可以影响目录中的所有标题。\@secthyperref

其次,必须在章节标题上添加超链接。在articlebook标准类中,这都是通过重新定义\Sectionformat引入的\@sect来 实现的hyperref

\AtBeginDocument{\renewcommand{\Sectionformat}[2]%
    {\ifnum #2>\c@secnumdepth {#1}\else\hyperlink{back\@currentHref}{#1}\fi}}

最后,MWE 是:

% !TEX encoding = UTF-8
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\usepackage{blindtext}
\usepackage{hyperref}
\makeatletter
\patchcmd{\addcontentsline}{{#2}{#3}{\thepage }}%
   {{#2}{#3}{\protect\hypertarget{back\@currentHref}{}\thepage }}%
   {\typeout{*patch success}}{\typeout{*patch failure}}
\AtBeginDocument{\renewcommand{\Sectionformat}[2]%
   {\ifnum #2>\c@secnumdepth {#1}\else\hyperlink{back\@currentHref}{#1}\fi}}
\makeatother

\begin{document}
\tableofcontents
\clearpage
\Blinddocument
\Blinddocument
\Blinddocument
\Blinddocument
\Blinddocument
\Blinddocument
\end{document}

当然,丑陋的链接外观可以通过适当的\hypersetup{...}

一些注意事项:

  • 这段代码相当简单,但可能会与修改标题和/或目录的任何其他类或包发生冲突,即流行的titlesectitletoc包,或etoctocloft等。
  • 尽管如此,它肯定可以适应其他情况,通过使用\meaning
  • 本着这种精神,同样的程序肯定可以用来修改课堂上的章节book,它将需要修补\@makechapterhead宏。
  • 还有一个小的默认设置:反向链接打开目录页,但上面可见的行不是链接的行,而是紧随其后的行。

编辑:

遵循这个问题我稍微修改了patchcmd我的答案以修复“小默认值”,以便反向链接现在指向适当的行。我还添加了命令来修补\@makechapterhead我最初的答案中所建议的。我最终添加了\hypersetup{...}我所说的。

MWE 现在变成:

    \documentclass{book}
    \usepackage[utf8]{inputenc}
    \usepackage{etoolbox}
    \usepackage{blindtext}
    \usepackage{hyperref}
    \makeatletter
    \patchcmd{\addcontentsline}{{#2}{#3}{\thepage }}%
       {{#2}{#3}{\protect\Hy@raisedlink{\protect\hypertarget{back\@currentHref}{}}{\thepage}} }%
       {\typeout{** patch \string\addcontentsline\space success}}%
       {\typeout{** patch \string\addcontentsline\space failure}}%  \AtBeginDocument{\renewcommand{\Sectionformat}[2]%
       {\ifnum #2>\c@secnumdepth {#1}\else\hyperlink{back\@currentHref}{#1}\fi}}
    \patchcmd{\@makechapterhead}{\bfseries #1\par}{\bfseries\hyperlink{back\@currentHref}{#1}\par}%
       {\typeout{** patch \string\@makechapterhead\space success}}%
       {\typeout{** patch \string\@makechapterhead\space failure}}
    \makeatother

    \hypersetup{colorlinks=true,linkcolor=blue}

    \begin{document}
    \tableofcontents
    \clearpage
    \Blinddocument
    \Blinddocument
    \Blinddocument
    \Blinddocument
    \Blinddocument
    \Blinddocument
    \end{document}

当然,\patchcmd{\@makechapterhead}只有当类有 s 时才可以使用\chapter

我希望这对 OP 来说是一个更准确和有效的答案。

相关内容