我正在使用带有 hyperref 的双列模式的 scrreprt 类:
\documentclass[a4paper]{scrreprt}
\usepackage[twocolumn]{geometry}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\chapter{This is a chapter}
\chapter{Chapter TWOOO}
\end{document}
我的问题是目录中的链接没有指向章节标题,这是一个常见的错误,就像多个问题一样,特别是双列模式下的 Hyperref 章节链接锚点。那里接受的答案在每一章中都使用了多列,这是可行的,但需要通过环境实现双列模式multicol
。
这对我来说是不可接受的,因为它似乎违反了形式和内容的分离,不能提供给.cls
。有没有办法让章节的超链接链接到标题?我很高兴章节链接到章节标题页如果不是章节标题的确切位置。
答案1
这个答案定义了一个新命令,它使用而不是\Chapter
将目录中的条目与章节页面链接起来。navigator
hyperref
如果使用方式过于有创意,这肯定会破坏事物。但是,如果使用方式相当标准,我认为它可能会有所帮助。
买者自负...
默认情况下,加载navigator
不会对文档产生任何影响(据我所知)。但是,该宏\Chapter
表明,至少在理论上,可以使用该包设置从内容到章节开始页面的链接,以便显示章节标题。即使锚点被放置在后章节标题,它的配置使得链接显示页面的顶部,即内容前源中的锚点。
句法
\Chapter[short title]{title}
\Chapter*[short title]{title}
\Chapter[]{}
将其参数提供给 KOMA 的\chapter[]{}
命令并为内容中的链接创建一个锚点。\Chapter*[]{}
将其参数提供给 KOMA 的\addchap[]{}
命令,并从内容中为链接创建一个锚点。它使用一个新的计数器来确保以这种方式创建的锚点的名称唯一。
没有与 KOMA 等同的命令,因为首先使用\addchap*{}
中的星号\Chapter*[]{}
来确定是否使用\chapter[]{}
或。如果您想更准确地反映 KOMA 的命令,您可以创建另一个命令(例如)。但是,从您的评论来看,您似乎正在使用,所以我坚持使用那个版本。\addchap[]{}
\AddChap*[]{}
\chapter*{}
SCLFME(有些粗糙可能易碎的最小示例):
\documentclass[a4paper,twocolumn]{scrreprt}
\usepackage{navigator,xparse,kantlipsum}
\newcounter{unnumberedchapter}
\setcounter{unnumberedchapter}{0}
\NewDocumentCommand \Chapter { s o m }{%
\IfBooleanTF{#1}{%
\stepcounter{unnumberedchapter}%
\IfValueTF{#2}{%
\addchap[\protect\jumplink{nonoch\theunnumberedchapter}{#2}]{#3}%
\outline[fit=fitv]{1}[nonoch\theunnumberedchapter]{#3}%
}{%
\addchap[\protect\jumplink{nonoch\theunnumberedchapter}{#3}]{#3}%
\outline[fit=fitv]{1}[nonoch\theunnumberedchapter]{#3}%
}%
}{%
\IfValueTF{#2}{%
\chapter[\protect\jumplink{ch\thechapter}{#2}]{#3}%
\outline[fit=fitv]{1}[ch\thechapter]{#3}%
}{%
\chapter[\protect\jumplink{ch\thechapter}{#3}]{#3}%
\outline[fit=fitv]{1}[ch\thechapter]{#3}%
}%
}%
}
\pagestyle{headings}
\begin{document}
\tableofcontents
\Chapter*{Introduction}
\kant[1-4]
\Chapter*[Another]{Another Introduction}
\kant[5-7]
\Chapter[Shorter]{This is a chapter}
\kant[8-12]
\Chapter{Chapter TWOOO}
\kant[13-17]
\Chapter*{Epilogue}
\kant[18-20]
\end{document}
请注意,如果您想要目录中未出现的章节,您当然可以按照\chapter*{}
通常的方式使用。
答案2
以下解决方案插入一个新的超级目标(内部文档链接)作为章节格式设置的一部分。
第一步是插入超目标:
% Add extra hyper target for chapter: chapter..\thechapter
\renewcommand*{\chapterformat}{%
\mbox{\raisebox{25pt}[0pt][0pt]{\hypertarget{chapter..\thechapter}{}}% Add
\chapappifchapterprefix{\nobreakspace}\thechapter\autodot\enskip}%
}
上面我们插入了一个名为 的目标chapter..\thechapter
,高度提升了 25pt(合适的高度,不会影响任何垂直定位)。此目标与传统目标 同义chapter.\thechapter
。
第二步是调整超链接以指向这个新的超目标仅有的当您拨打电话时\chapter
。为此我们修补\addcontentsline
:
\usepackage{etoolbox}
\makeatletter
% Update \addcontentsline to jump to new hyper target _only_ if \chapter is used
\patchcmd{\addcontentsline}% <cmd>
{\Hy@writebookmark}% <search>
{\ifnum\pdfstrcmp{chapter}{#2}=0 % Chapter mark
\edef\@currentHref{chapter..\thechapter}%
\fi
\Hy@writebookmark}% <replace>
{}{}% <success><failure>
\makeatother
上述补丁插入一个条件来检查您是否使用了\chapter
(通过\pdfstrcmp
字符串比较 - 需要 e-TeX)。如果您正在使用\chapter
,则\@currentHref
更新为指向新的超目标chapter..\thechapter
。这是在放置书签和 ToC 相关条目之前完成的。
这是一个完整的用法和最小示例:
\documentclass[twocolumn]{scrreprt}
\usepackage{hyperref,lipsum,etoolbox}
% Add extra hyper target for chapter: chapter..\thechapter
\renewcommand*{\chapterformat}{%
\mbox{\raisebox{25pt}[0pt][0pt]{\hypertarget{chapter..\thechapter}{}}% Add
\chapappifchapterprefix{\nobreakspace}\thechapter\autodot\enskip}%
}
\makeatletter
% Update \addcontentsline to jump to new hyper target _only_ if \chapter is used
\patchcmd{\addcontentsline}% <cmd>
{\Hy@writebookmark}% <search>
{\ifnum\pdfstrcmp{chapter}{#2}=0 % Chapter mark
\edef\@currentHref{chapter..\thechapter}%
\fi
\Hy@writebookmark}% <replace>
{}{}% <success><failure>
\makeatother
\begin{document}
\tableofcontents
\chapter{First chapter}
\lipsum[1-10]
\chapter{Second chapter}
\lipsum[11-20]
\end{document}