超目标似乎瞄准得太低了

超目标似乎瞄准得太低了

我做了一个小例子:

\documentclass[a4paper,12pt]{article}
\usepackage[pdfstartview=FitH]{hyperref}
\usepackage{bookmark}
\begin{document}
we want to go\hypertarget{t1}{} here.\\
instead we go here.
\bookmark[dest=t1]{goto 1}
\end{document}

单击 PDF 文件中的书签时,第二行将位于屏幕顶部,但第一行应该位于顶部。我理解错了什么?我该怎么办?

编辑:我对答案的总结(我觉得这个\Hy@raisedlink看起来更好一些,因为另一个答案非常接近顶部)。问题是:这似乎在宏中不起作用。我总是收到“未定义的控制序列”错误:

\documentclass[a4paper,12pt]{article}
\usepackage[pdfstartview=FitH]{hyperref}
\usepackage{bookmark}
\newcommand{\linkdest}{\makeatletter\Hy@raisedlink{\hypertarget{t4}{}}\makeatother}
\begin{document}
apparently \textbackslash hypertarget marks the bottom of its line instead
of the top. it can be fixed using \textbackslash Hy@raisedlink or 
\textbackslash raisebox (a bit lower).\\\\
we cant go\hypertarget{t1}{} here.\\\\
we can go here\makeatletter\Hy@raisedlink{\hypertarget{t2}{}}\makeatother{}. %
we can go here\raisebox{\ht\strutbox}{\hypertarget{t3}{}} too.\\\\
go here by macro: \linkdest .
\bookmark[dest=t1]{cant} 
\bookmark[dest=t2]{can} 
\bookmark[dest=t3]{can too}
\bookmark[dest=t4]{macro}
\end{document}

编辑2:好的,现在可以正常工作了。我注意到,它\Hy@raisedlink似乎假装链接位于上面的行中(例如,如果标记的位置位于下一页的开头,它可以转到页面的末尾),而\raisebox转到当前文本行的顶部(因此有时会剪切大公式)。

答案1

这是我在这里的第一个问题:参考书目的超链接隔一行。原因是hyperref,像所有 TeX 框一样,链接也放置在基线上。有一个内部命令\Hy@raisedlink,其功能大致与 Bruno 的回答中描述的一样。以下是它在宏内部和外部的使用示例:

\documentclass{article}
\usepackage{hyperref}

\makeatletter
 \newcommand{\linkdest}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
\makeatother

\begin{document}

 Here are targets created
 \makeatletter
  \Hy@raisedlink{\hypertarget{t1}{}}directly
 \makeatother
 and \linkdest{t2}indirectly.  Here is one created by \hypertarget{t3}{}hypertarget.

 \hyperlink{t1}{Here} \hyperlink{t2}{are} \hyperlink{t3}{links}

\end{document}

前两个链接应指向其目标上方,第三个链接应指向其基线。

答案2

我记得我遇到过同样的问题(但没能找到好的解决办法)。一个笨拙的方法是手动提高目标\raisebox(我相信是来自 graphicx 包)。

\documentclass{article}
\usepackage{hyperref}
\usepackage{graphicx}
\begin{document}
If we try to go \hypertarget{t1}{here}, this fails 
(it bring us at the bottom of the word ``here''), 
as you can \hyperlink{t1}{check}.

If we use some dirty code to raise the 
target\raisebox{\ht\strutbox}{\hypertarget{t2}{}},  %% 
then we will go to the right place. A \verb|\strut|
is a zero-width object whose height above the baseline
and depth below the baseline are such that it spans
the line completely from top to bottom. Then \verb|\ht\strutbox|
gives the height of such a \verb|\strut|, and our
\hyperlink{t2}{link} points to the right place.
\end{document}

答案3

很抱歉违反了准则,但我的声誉还不足以发表评论。\Hy@raisedlink上一页末尾可能出现的问题对我来说似乎很重要。\raisebox由于太靠近行顶部而导致外观不佳的问题可以通过使用系数来解决:\raisebox{1.2\ht\strutbox}在我看来看起来相当不错。

相关内容