我已经实现了在这里回答,当进一步扩展以包含\subsection{}
和\subsubsection{}
反向链接时,效果很好。在普通章节和附录中,所有功能都运行良好除了对于附录中使用的 \chapter 标题展示作为 PDF 中的链接,但点击后无任何反应。但是,如果我开始附录时没有使用“\chapter{}”,则目录和附录的标题就是错误的。
那么,如何让\chapter{}
附录中的元素像在正文章节中一样发挥作用。
我的 MWE:
\documentclass{scrreprt}
\usepackage{hyperref}
\makeatletter
\let\hyperchapter\chapter
\def\chapter{\@ifstar\starchapter\mychapter}
\def\starchapter{\hyperchapter*}
\newcommand{\mychapter}[2][\@empty]% #1=optional (toc and top of page), #2=title
{\ifx#1\@empty \hyperchapter[#2]{\hyperlink{toc.chapter.\thechapter}{#2}}
\else \hyperchapter[#1]{\hyperlink{toc.chapter.\thechapter}{#2}}
\fi}
\let\hypersection\section
\def\section{\@ifstar\starsection\mysection}
\def\starsection{\hypersection*}
\newcommand{\mysection}[2][\@empty]% #1=optional (toc), #2=title
{\ifx#1\@empty \hypersection[#2]{\hyperlink{toc.section.\thesection}{#2}}
\else \hypersecton[#1]{\hyperlink{toc.section.\thesection}{#2}}
\fi}
\makeatother
\usepackage[titletoc,title]{appendix}
\begin{document}
\let\hypercontentsline=\contentsline
\renewcommand{\contentsline}[4]{\hypertarget{toc.#4}{}\hypercontentsline{#1}{#2}{#3}{#4}}
\tableofcontents
\chapter{This is a great headline}
\section{and another}
\chapter{This is a bad headline!}
\section{last section}
\begin{appendices}
\appendix
\chapter{First One}
Stuff
\section{A Heading}
Other Stuff
\chapter{Second One}
Some notes here.
\end{appendices}
\end{document}
[编辑:清晰度]
答案1
我也在研究如何解决这个问题。所以,尽管我不是 LaTeX 编程方面的超级专家,但我想我已经解决了这个问题。
如何调试
主要的技巧是弄清楚目录中每个章节和部分的实际调用方式。如果您去修改此行:
\renewcommand{\contentsline}[4]{\hypertarget{toc.#4}{}\hypercontentsline{#1}{#2}{#3}{#4}}
到
\renewcommand{\contentsline}[4]{\hypertarget{toc.#4}{}\hypercontentsline{#1}{#2}{#3}{#4}#4}
它将打印该节/章节/附录的“内部”名称。现在,请注意,此命令仅用于将超目标添加到目录中的一行。实际行是hypercontentsline
,它只是一个引用原始的宏contentsline
:
\let\hypercontentsline=\contentsline
另一部分是hypertarget
,这也是我们实际添加的,其目标名称为toc.#4
。
现在,如果我们转到修改命令的代码部分chapter
,它的工作方式如下。前三行只是确保如果您调用,\chapter*
您将绕过宏并执行正常操作,因为如果链接不会出现在目录中,则无需将其添加到目录中。
该行\def\chapter{\@ifstar\starchapter\mychapter}
实际上是\chapter
用我们的定义替换的\mychapter
,添加了反向链接。
其中\mychapter
有一个 if 语句,它只是检查您是否传递了目录的可选短标题(如\chapter[shortToc]{normalName}
)。然后两个分支都调用hyperchapter
,它只是原始chapter
宏,并将标题作为目录传递hyperlink
,再加上您想要的实际标题。
因此其形式为:
\hyperchapter[#2]{\hyperlink{toc.chapter.\thechapter}{#2}}
^^ ^^^ ^^
title to put in TOC | where the link goes | the actual title
现在的诀窍是,虽然我们在超目标定义中执行了hypertarget{toc.#4}
,其中 #4 包含章节/附录/部分的“类型”,但\thechapter
宏仅返回“编号”,而不返回类型。这就是为什么我们在指定超链接时明确添加该部分的原因:hyperlink{toc.chapter.\thechapter}
。
现在,整个问题源于这样一个事实:在 TOC 的超目标定义中,附录章节被表示为“附录”,而不是“章节”。例如,“附录.A”,而不是“章节.A”(因此整体为“toc.appendix.A”)。这就是为什么当我们去构建超链接时,我们创建了一个指向“toc.chapter.A”的链接,但它并不存在,并且不起作用。
如何修复
我们只需引入一个新命令,我们将用它来指定附录中的章节,从而为目标创建适当的“附录”链接。
我这样做了:
\let\hyperappchapter\chapter
\def\appchapter{\@ifstar\starappchapter\myappchapter}
\def\starappchapter{\hyperappchapter*}
\newcommand{\myappchapter}[2][\@empty]% #1=optional (toc and top of page), #2=title
{\ifx#1\@empty \hyperchapter[#2]{\hyperlink{toc.appendix.\thechapter}{#2}}
\else \hyperchapter[#1]{\hyperlink{toc.appendix.\thechapter}{#2}}
\fi}
这个想法是,我们仍然在下方使用命令\chapter
(因为即使在附录中,这也是创建章节的原因)。但是,这一次我们的链接appendix
在定义超链接时将具有正确的前缀。
现在您只需将附录中的章节定义为\appchapter{MyTitle}
,链接就会正常工作!