使用 \bookmark 自动将目标锁定在“此处”(与 \pdfbookmark 一样)?

使用 \bookmark 自动将目标锁定在“此处”(与 \pdfbookmark 一样)?

请考虑以下 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, 右 Adob​​e Reader):

查看 evince_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

我不相信有这样的直接接口,但你可以提供自己的布尔键destheresay 和 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}

相关内容