如何让 \pdfbookmark 指向当前行而不是下一行?

如何让 \pdfbookmark 指向当前行而不是下一行?

我正在编写我的第一个基于文章类的 latex 类文件,用于家庭作业和考试。因此,我定义了一个名为的自定义分段命令problem。我尝试使每个问题在 pdf 大纲中可见。我使用了 hyperref包并用于\pdfbookmark添加自定义大纲。一个问题是,该命令似乎使大纲项目指向发出命令的行下方的一行。这是正常的吗?

例如,以下是单击 pdf 大纲中的问题条目导致出现问题第一行下方的行的示例

\newcommand{\problem}{\stepcounter{problem}\vskip\baselineskip\noindent\pdfbookmark[0]{Problem \theproblem}{\theproblem}\textbf{Problem \theproblem.}\enskip}

而以下内容正确地指出了问题的第一行。

\newcommand{\problem}{\stepcounter{problem}\vskip\baselineskip\pdfbookmark[0]{Problem \theproblem}{\theproblem}\noindent\textbf{Problem \theproblem.}\enskip}

在第二个定义中,我基本上是在进入水平模式之前添加了书签,而在第一个定义中,我在水平模式下添加了书签,因为我\noindent在它之前发出了命令。

编辑

根据 David Carlisle 的回答,LaTeX 会将 pdf 锚点放在调用的行的基线上\pdfbookmark。这句话基本上意味着我所经历的是正常的。但他继续说,hyperref 会尝试处理这个问题通过将锚点放置\strut在书签所在行的基线上方。但是,似乎 hyperref 仅在使用 定义的 LaTeX 标题中执行此操作\@startsection,是这样的吗?如果是这样,有没有办法\pdfbookmark在其他不使用标题的地方进行此调整?例如,假设我只想在段落中的一般位置创建书签。

这是 MWE

\documentclass[12pt]{article}
\usepackage{hyperref}
\begin{document}
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries,Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries,
    
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, 
    
    but also the leap into electronic\pdfbookmark{mark}{here} typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
\clearpage

Just to make the pdf have enough room to scroll down

\end{document}

如果我们编译它,我们会注意到书签锚点位于第三段第一行的基线处。我想要的效果是锚点位于该行的顶部,即锚点应出现在\baselineskip当前距离上方一定距离处。

更新

我今天又想了一下。假设你有一个段落,想为该段落插入一个 pdf 书签,那么你自然会pdfbookmark在该段落的开头插入该命令。在这种情况下,我们还没有处于水平模式,因此书签锚定在段落第一行之前的基线处正是我们想要的,即,当你在 pdf 查看器中单击标记时,段落的第一行不会滚动出视图。

但想象一下自己想放一个书签排队(在段落内),命令仍然会在该行的基线处插入锚点。但这不是您想要的结果,因为您希望锚点位于前一行的基线处,这样当您在 pdf 查看器中单击书签时,放置书签的行不会滚动出视图。

也许一个解决方案是hyperref识别它是否位于段落的中间。

相关内容