附录中的 \chapter 超链接至目录

附录中的 \chapter 超链接至目录

我已经实现了在这里回答,当进一步扩展以包含\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},链接就会正常工作!

相关内容