请考虑以下 MWE:
\documentclass{article}
\usepackage{hyperref}
\usepackage{xcolor,bookmark}
\usepackage{lipsum}
\begin{document}
\section{Section 1}
\lipsum[1-3]
% hyperref:
\pdfbookmark[2]{Test Bookmark Sect. 1}{TstBookmark1}
\lipsum[4-12]
\section{Section 2}
\lipsum[13-16]
% bookmark:
\bookmark[page=\thepage,rellevel=1,keeplevel,view={XYZ},bold,color=blue]{Test Bookmark Sect. 2}
%
% bookmark with target:
\hypertarget{hereSectII}{}% second arg prints text!
\bookmark[dest=hereSectII,rellevel=1,keeplevel,view={XYZ},bold,color=blue]{Test Bookmark Sect. II}
%
\lipsum[17-20]
\section{Section 3}
Finished.
\end{document}
...生成如下输出(左evince
, 右 Adobe Reader):
可以看出,“测试书签第1部分”时被聚焦的目标位置:
\pdfbookmark[2]{Test Bookmark Sect. 1}{TstBookmark1}
...被点击时,位于段落之间 - 基本上,书签的目标是“这里”(可以这么说),即\pdfbookmark
放置在代码中的位置。
我的问题是 - 是否有类似的语法\bookmark
?
如果我指定一个page
动作,该动作将链接到页面顶部 - 否则,我必须手动指定\hypertarget
:
\hypertarget{hereSectII}{}
\bookmark[dest=hereSectII]{Test Bookmark Sect. II}
与此相比,似乎\pdfbookmark
在文档中插入了超目标 - 以及书签(显示在 PDF 书签索引中)。是否有类似的语法\bookmark
?
答案1
这bookmark
包裹重新定义\pdfbookmark
为兼容性功能hyperref
:
\let\pdfbookmark\ltx@undefined
\newcommand*{\pdfbookmark}[3][0]{%
\bookmark[level=#1,dest={#3.#1}]{#2}%
\hyper@anchorstart{#3.#1}\hyper@anchorend
}
本质上,\pdfbookmark
使用\bookmark
特定的dest
键值,并放置和\hyper@anchorstart
来\hyper@anchorend
匹配该键值。
以下 MWE 提供了与 类似的接口作为扩展,\bookmark
现在采用可选的*
。当您使用 时\bookmark[<options>]{<text>}
,一切工作方式与以前一样。但是,覆盖中\bookmark*[<options>]{<text>}
的任何使用插入自动(和增量)目标:dest
<options>
\documentclass{article}
\usepackage{hyperref,bookmark}% http://ctan.org/pkg/{hyperref,bookmark}
\usepackage{xcolor,lipsum}% http://ctan.org/pkg/{xcolor,lipsum}
\makeatletter
\newcounter{@bookmark@cntr}
\renewcommand{\the@bookmark@cntr}{autobookmark-\arabic{@bookmark@cntr}}
\let\@bookmark\bookmark
\renewcommand{\bookmark}{%
\@ifstar\@bookmark@star\@bookmark
}
\newcommand{\@bookmark@star}[2][]{%
\stepcounter{@bookmark@cntr}%
\@bookmark[#1,dest=\the@bookmark@cntr]{#2}%
\hyper@anchorstart{\the@bookmark@cntr}\hyper@anchorend%
}
\makeatother
\begin{document}
\section{Section 1}
\lipsum[1-3]
% hyperref:
\pdfbookmark[2]{Test Bookmark Sect. 1}{TstBookmark1}
\lipsum[4-12]
\section{Section 2}
\lipsum[13-16]
% bookmark:
\bookmark[page=\thepage,rellevel=1,keeplevel,view={XYZ},bold,color=blue]{Test Bookmark Sect. 2}
%
% bookmark with target:
\hypertarget{hereSectII}{}% second arg prints text!
\bookmark[dest=hereSectII,rellevel=1,keeplevel,view={XYZ},bold,color=blue]{Test Bookmark Sect. II}
%
\lipsum[17-20]
\section{Section 3}
% Updated \bookmark* usage.
\bookmark*[rellevel=1,keeplevel,view={XYZ},bold,color=blue]{Test Bookmark Sect. 3}
\lipsum[21-30]
\end{document}
答案2
我不相信有这样的直接接口,但你可以提供自己的布尔键desthere
say 和 use \phantomsection
。 (但请注意,我从未使用过kvsetkeys
,因此不相信这是定义密钥的最佳方式。)
\documentclass{article}
\usepackage{hyperref}
\usepackage{xcolor,bookmark}
\usepackage{lipsum}
\makeatletter
\define@key{BKM}{desthere}[true]{%
\expandafter\ifx\csname if#1\endcsname\iftrue
\phantomsection
\bookmarksetupnext{dest=\@currentHref}
\fi
}
\makeatother
\begin{document}
\section{Section 1}
\lipsum[1-3]
\bookmark[desthere,rellevel=1,keeplevel,view={XYZ},bold,color=blue]{Test Bookmark Sect. I}
\lipsum[4-12]
\end{document}
还请注意,该bookmark
包更改\pdfbookmark
为使用\bookmark
宏,但它不提供任何直接添加选项的方法。但是,\bookmarksetupnext
也可以在那里使用:
\bookmarksetupnext{bold,color=blue}
\pdfbookmark[2]{Test Bookmark Sect. 1}{TstBookmark1}