买者自负...

买者自负...

我正在使用带有 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将目录中的条目与章节页面链接起来。navigatorhyperref

如果使用方式过于有创意,这肯定会破坏事物。但是,如果使用方式相当标准,我认为它可能会有所帮助。

买者自负...

默认情况下,加载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}

相关内容