是否可以为目录中未列出的章节标题创建新书签(即使用星号形式 - \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
等等。