链接框遮盖标点符号

链接框遮盖标点符号

使用来自的链接框时hyperref,后面的标点符号不完全可见。

梅威瑟:

\documentclass{article}
\usepackage{hyperref}
\begin{document}
\section{My section}
\label{sec:my}
As seen in \ref{sec:my}, \texttt{hyperref} obscures punctuation, especially with \hyperref[sec:my]{a dot}. It works better with \hyperref[sec:my]{trailing whitespace}\,.
\end{document}

在此处输入图片描述

对此最简单/最好的解决方案是什么(除了不使用链接盒)?

一种可能性是自动添加薄空间。我试过了

\usepackage{xpatch}
\xapptocmd{\ref}{\,}{}{}

但那不管用。另外,我必须修补\cref\Cref\hyperref\url\cite

我想避免\newcommand{\myref}[1]{\ref{#1}\,}(尽管这确实有效),因为我不想改变文档中的标准引用方式。此外,这种解决方案不适用于通过\citep(和/或其他\cite变体)添加括号的括号。

将标点符号放在框的顶部而不是后面也可能会有帮助。

然而,最好的解决方案(在我看来)是更改hyperref框绘制命令以在链接前后包含一些额外的空白(外部盒子)。


额外的 MWE

使用 natbib 和\citep

\documentclass{article}
\begin{filecontents}{\jobname.bib}
@book{author_book,
  title = {Book's title},
  author = {Author, Some},
  year = {2005},
}
@book{other_book,
  title = {Book's title},
  author = {Writer, A},
  year = {2010},
}
\end{filecontents}
\usepackage[round]{natbib}
\usepackage{hyperref}
\makeatletter
\renewcommand\hyper@natlinkbreak[2]{#1}
\makeatother
\begin{document}
\fontfamily{ptm}\selectfont % using ptm makes it worse
\section{My section}
\label{sec:my}
See also \citep{author_book,other_book} vs (\,\hyperref[sec:my]{Author, 2005}\,; \hyperref[sec:my]{Writer, 2010}\,).
\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}

apalike

\documentclass{article}
\begin{filecontents}{\jobname.bib}
@book{author_book,
  title = {Book's title},
  author = {Author, Some},
  year = {2005},
}
@book{other_book,
  title = {Book's title},
  author = {Writer, A},
  year = {2010},
}
\end{filecontents}
\usepackage{apalike}
\usepackage{hyperref}
\begin{document}
\fontfamily{ptm}\selectfont % using ptm makes it worse
\section{My section}
\label{sec:my}
See also \cite{author_book,other_book} vs (\,\hyperref[sec:my]{Author, 2005}\,; \hyperref[sec:my]{Writer, 2010}\,).
\bibliographystyle{apalike}
\bibliography{\jobname}
\end{document}

在此处输入图片描述

答案1

这些盒子是什么?

从本质上讲,TeX 是一个排版程序:它负责决定字符的位置,以便在打印页。事实上,TeX 比 PDF 格式早十多年,可以追溯到在屏幕上可视化排版输出不存在。因此,就 TeX 的“核心”而言,它所排版的内容(以及您打印文档时得到的内容)没有红色框来表示链接:

隐藏链接

那么,为什么您会在 PDF 查看器中看到红色方框呢?之所以看到它们,是因为该hyperref软件包重新定义了所有 LaTeX 交叉引用宏,使得(特别是在其默认设置下)链接作为 PDF 注释插入到 PDF 流中,并且在某些 PDF 查看器中查看时会显示方框(叠加在上面的输出上!)。某些 PDF 查看器甚至没有实现显示这些方框(或者至少具有不同的默认值)。

即使它们确实显示了框,其外观也可能取决于 PDF 查看器版本、操作系统、屏幕分辨率、缩放级别等。例如,对于问题中的 MWE,这是我在计算机上看到的内容:

默认设置

(单击图片并放大以逐像素查看:macOS Sierra 上 Acrobat Reader 的屏幕截图,缩放级别为 200%。)这里的问题没有问题中那么严重。如果我们更改链接颜色(例如,将线条更改为蓝色\usepackage{hyperref}\usepackage[linkbordercolor={0 0 1}]{hyperref},外观看起来会更好。


为什么不添加空格?

如果您尝试添加额外的空格来容纳链接框,那么您将要求 TeX 更改排版(标点符号的位置),使其偏离其认为的最佳位置。因此,如果您打印文档,或者在某个不显示链接框的 PDF 查看器中查看文档,您将看到难看的额外空格。

即使每个人都在使用显示方框的 PDF 查看器,还有一个不摆弄空格的理由。默认情况下,无论 PDF 文档的缩放级别如何,链接框始终显示为固定数量的像素宽。这意味着,随着您在屏幕上将文本越来越大(每个字符的像素更多),方框相对于文本会变得越来越小。因此,尽管当您以 50% 的缩放比例查看 PDF 时,方框可能看起来很厚并且重叠很多:

放大 50%

因此,您可能认为需要在框后添加 X em 的空间,以使以下标点符号不重叠。但是,如果有人拥有更大或更高分辨率的显示器并放大文本,他们会看到完全不同的内容:

缩放 2400%

这意味着您需要添加一个更小的空间来相对于框移动逗号,并且如果您添加适合较小缩放级别的空间,那么这里的空间就会突然太宽。


那你能做什么呢?

因此在我看来(正如你也同意的那样一条评论) 一个更好的解决方案是保持排版不变,但改变 PDF 注释的性质,以便框更适合出现在相关的 PDF 查看器中。

如果你觉得链接框对于大部分 PDF 查看者来说看起来不太好,那么最简单的方法就是用不同的方式指示链接:查找colorlinkshyperref手动的(它本身使用此选项)。但是,如果您确实想要这些框,那么您需要做的就是更改 PDF 中的注释。当然,要做到这一点,首先您需要确定“正确”的注释应该是什么样子。

为了了解注释是如何实现的hyperref,我们可以查看其代码(跟踪 的踪迹,linkbordercolor特别是 pdfTeX 引擎的代码),我们在\def\find@pdflink#1#2中找到了一个hpdftex.def,其最后几行看起来很有启发性:

\def\find@pdflink#1#2{%
  % […snip… some lines omitted here]
  \Hy@StartlinkName{%
    \ifHy@pdfa /F 4\fi
    \Hy@setpdfborder
    \ifx\@pdfhighlight\@empty
    \else
      /H\@pdfhighlight
    \fi
    \ifx\CurrentBorderColor\relax
    \else
      /C[\CurrentBorderColor]%
    \fi
  }\Hy@testname
  \expandafter\Hy@colorlink\csname @#1color\endcsname
}

矩形的实际位置似乎由特定的 DVI/PDF 驱动程序决定:pdfTeX、XeTeX、,dvips所有的位置都略有不同,我不确定如何控制。但还有其他选择;见下文。

查找PDF 1.5 规范(警告:14MB,1172 页的 PDF),我们可以在 8.4.3 边框样式 部分找到有关选项的一些详细信息。将两者结合起来,我们可以看到,我们可以通过在位后添加内容来更改 PDF 注释/C[\CurrentBorderColor] \fi

例如,我们可以将边框宽度指定为其默认值的 4 倍,从而使问题更加严重。下面,/BS <</W 4>>BS代表边框样式,W代表宽度)是添加到 PDF 注释中的新内容(通过修补我们上面看到的宏),记录在表 8.13 边框样式字典中的条目PDF 规范:

\documentclass{article}
\usepackage{hyperref}

\usepackage{etoolbox}
\makeatletter
\patchcmd{\find@pdflink}{
      /C[\CurrentBorderColor]%
    \fi
}{
      /C[\CurrentBorderColor]%
    \fi
    /BS <</W 4>>
}{}{}
\makeatother

\begin{document}
\section{My section}
\label{sec:my}
As seen in \ref{sec:my}, \texttt{hyperref} obscures punctuation, especially with \hyperref[sec:my]{a dot}. It works better with \hyperref[sec:my]{trailing whitespace}\,.
\end{document}

其结果是:

宽度 4

相反,我们可以将宽度减少 0.5,如下所示/BS <</W 0.5>>

宽度 0.5

(老实说,在我的计算机上,我看不出默认宽度 1 和宽度 0.5 有什么区别,但您可以在您的计算机上试用一下,看看是否有区别。)

您还可以将样式更改为虚线,例如/BS <</S /D /D [2 3]>>

虚线 2-3

(这[2 3]意味着 2 点长的虚线与 3 点长的间隙交替……您可以更改参数以及宽度,例如/BS <</W 1.5 /S /D /D [3 4]>>或任何其他值。)您可以尝试所有这些参数以找到您最喜欢的参数。例如,/BS <</W 2 /S /D /D [8 8]>>结果是:

虚线 2-8-8

您还可以将样式更改为下划线,使用以下命令/BS <</S /U>>

强调

您可以通过阅读 PDF 规范和/或检查生成的 PDF 来探索更多内容,以了解您还可以在哪里编辑什么,以控制外观的哪些方面。请注意,并非所有 PDF 查看器都支持 PDF 规范中的所有选项,因此您需要尝试使用文档“用户”将使用的实际 PDF 查看器。

一旦您确切知道想要在文档中添加什么类型的注释(由 PDF 查看器支持),那么修补hyperref以实现这一点就成为一个更具体的问题。


编辑:虽然没有记录在hyperref手动的,代码中pdflinkmargin有一个选项,用于控制在内容周围添加多少边距。因此,与默认的 (多于),看起来是1pt这样的,如果我将其设置为,我会得到以下结果0pt

\documentclass{article}
\usepackage{hyperref}
\setpdflinkmargin{0pt}

\begin{document}
\section{My section}
\label{sec:my}
As seen in \ref{sec:my}, \texttt{hyperref} obscures punctuation, especially with \hyperref[sec:my]{a dot}. It works better with \hyperref[sec:my]{trailing whitespace}\,.
\end{document}

pdflinkmargin 0pt

为了说明效果,我们可以尝试如下夸张的值10pt

pdflinkmargin 10pt

或者-1pt

pdflinkmargin -1pt

这就像任何 TeX 长度一样,因此您不受整数的限制pt,可以使用mm或其他单位。现在我们知道要搜索什么,我们可以在Heiko Oberdiek 的回答(的作者之一hyperref)。它解释了它的工作原理和一些限制(它适用于 pdfTeX/LuaTeX/dvips 驱动程序,但不适用于 dvipdfm/XeTeX 驱动程序)。您可以使用\hypersetup{pdflinkmargin=0pt}而不是 来设置它\setpdflinkmargin{0pt}。它还记录在hyperref自述

答案2

以下是 ShreevatsaR 解决方案的更简单的实现,带有边框样式。只需在下面添加以下行\usepackage{hyperref}即可实现虚线框:

\hypersetup{ pdfborder={0 0 1 [1 2]} }

前两个数字指定圆角的半径。由于大多数查看器都会忽略它们,因此不妨将它们设置为零。第三个数字是边框宽度,可以是小数。方括号中的数字指定虚线图案:此处 1 个单位的虚线和 2 个单位的空格。

ShreevatsaR 的解决方案中描述的更复杂的/BS命令可以用以下方式指定:

\hypersetup{ pdfborderstyle={/W 1 /S /D /D [1 2]} }

无论哪种情况,Okular 中的输出都如下所示:

在此处输入图片描述

答案3

正如 Bordaigorl 指出的那样,这个答案实际上并不适合打印输出,因为添加的空间会在打印输出中产生难看的间隙(缺少方框hyperref)。出于这个原因,我甚至一度删除了这个答案。

然而,OP 声称,对于预期的应用程序来说,让它看起来适合在线查看比纸上的外观更重要。

Egreg 还指出,目前的方法\ref*已经失效。我还没有花时间进一步研究这个问题。

尽管如此,这里是之前被删除的答案:


\ref在这里,我保存了和的含义,\hyperref并重新定义它们以添加尾随的\,。我不确定我是否涵盖了所有的语法变化\hyperref

\documentclass{article}
\usepackage{hyperref}
\let\svref\ref
\let\svhyperref\hyperref
\AtBeginDocument{
  \renewcommand\ref[1]{\svref{#1}\,}
  \renewcommand\hyperref[2][]{\svhyperref[#1]{#2}\,}
}
\begin{document}
\section{My section}
\label{sec:my}
As seen in \ref{sec:my}, \texttt{hyperref} obscures punctuation, especially with \hyperref[sec:my]{a dot}. It works better with \hyperref[sec:my]{trailing whitespace}.
\end{document}

在此处输入图片描述

答案4

使用xelatex或运行它lualatex

\documentclass{article}
\usepackage{hyperref}
\begin{document}
    \section{My section}
    \label{sec:my}
    As seen in \ref{sec:my}, \texttt{hyperref} obscures punctuation, especially with 
    \hyperref[sec:my]{a dot}. It works better with \hyperref[sec:my]{trailing 
    whitespace}.
\end{document}

在此处输入图片描述

相关内容