我做了一个小例子:
\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}
在我看来看起来相当不错。