我偶然发现了一个 PDF,它将目录条目和正文中的标题相互链接起来。它是使用 Adobe 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
(实际上) 。这可以影响目录中的所有标题。\@sect
hyperref
其次,必须在章节标题上添加超链接。在article
和book
标准类中,这都是通过重新定义\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{...}
一些注意事项:
- 这段代码相当简单,但可能会与修改标题和/或目录的任何其他类或包发生冲突,即流行的
titlesec
和titletoc
包,或etoc
或tocloft
等。 - 尽管如此,它肯定可以适应其他情况,通过使用
\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 来说是一个更准确和有效的答案。