创建一个 PDF 书签,该书签直接指向章节标题,而不是其上方或下方。

创建一个 PDF 书签,该书签直接指向章节标题,而不是其上方或下方。

是否可以为目录中未列出的章节标题创建新书签(即使用星号形式 - \section*{A title})?

\pdfbookmark(hyperref.sty 的一部分) 或\bookmark(bookmark.sty 的一部分) 似乎只会在发出命令的位置创建书签。但是,将其放在命令之前、命令内或命令之后\section*{}都不会产生正确的效果:在 PDF 查看器中单击书签会链接到错误的位置。具体来说,它不会像普通的hyperref-ed 节标题/书签那样链接到节标题的文本部分,而是链接到标题上方的空间(如果节在新页面上,则可能是上一页),或节标题的正下方(从而隐藏标题!)。

使用\phantomsection然后在命令\protect\label{}中发出的命令与链接到部分标题的命令\section*{}配合使用\hyperref{}{},将用户直接带到标题标题。太棒了!这只是我无法理解的 PDF 书签中的相同基本原理。如果我能发出一个直接转到\pdfbookmark相同内容的 -like 命令\label,那就太完美了!

编辑:我还需要能够指定书签名称(即,PDF 查看器中书签部分显示的文本),而不是使用该部分本身的名称(在我的工作中这可能很长)。

任何帮助都将不胜感激。我确实花了好几天的时间进行实验,目前似乎没有任何办法,但我相信一定有办法!感谢您的时间。

答案1

这确实是一种令人讨厌的行为!我开始写“哦,就把它放到\pdfbookmark标题里”,直到我读完你的问题。我深入研究hyperref.sty,最终,hyperref.pdf(带有文档源的版本)并发现整个过程\Hy@writebookmark以某种方式由 驱动。注意:我不知道它\Hy@writebookmark实际上做了什么,除了它显然写了一个书签。这是我找到的解决方案(在以下示例代码的序言中):

\documentclass{article}
\usepackage{hyperref}

\makeatletter
\def\munch#1{}
\newcommand{\bkmk}[4][0]{%
 #2#3{\phantomsection%
  \Hy@writebookmark%
   {}%
   {#4}%
   {\@currentHref}%
   {#1}%
   {toc}%
  #4}%
 }
\makeatother

\begin{document}

\section{Real section}

Stuff and things.

\bkmk[2]\subsection*{Bookmarked as a subsection}

More text.

\end{document}

编译两次以确保书签在 PDF 中,并查看链接是否指向正确的位置。这里发生的是,您的链接少了一行,原因与我的这个问题,因为\pdfbookmark(错误地?)不将\Hy@raisedlink其目标置于基线之上。方便的是,\phantomsection 使用此功能,并将链接命名为\@currentHref,因此我们只需将书签发送到那里即可。如果您\edef立即保存(通过 )此宏,您还可以从文档内部生成指向带星号部分的链接。

该解决方案的起点是以下更简单的宏,我使用它来将带星号的部分放入目录中,这也可以(使用超链接)将它们放入具有正确链接位置的书签中:

\def\munch#1{}
\newcommand{\toc}[3]{
 #1#2{\phantomsection\addcontentsline{toc}{\expandafter\munch\string#1}{#3}#3}
}

用法与上面相同(没有可选参数)。由于它有效,它促使我研究\addcontentsline等等。

相关内容