使用来自的链接框时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 时,方框可能看起来很厚并且重叠很多:
因此,您可能认为需要在框后添加 X em 的空间,以使以下标点符号不重叠。但是,如果有人拥有更大或更高分辨率的显示器并放大文本,他们会看到完全不同的内容:
这意味着您需要添加一个更小的空间来相对于框移动逗号,并且如果您添加适合较小缩放级别的空间,那么这里的空间就会突然太宽。
那你能做什么呢?
因此在我看来(正如你也同意的那样一条评论) 一个更好的解决方案是保持排版不变,但改变 PDF 注释的性质,以便框更适合出现在相关的 PDF 查看器中。
如果你觉得链接框对于大部分 PDF 查看者来说看起来不太好,那么最简单的方法就是用不同的方式指示链接:查找colorlinks
在hyperref
手动的(它本身使用此选项)。但是,如果您确实想要这些框,那么您需要做的就是更改 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}
其结果是:
相反,我们可以将宽度减少 0.5,如下所示/BS <</W 0.5>>
:
(老实说,在我的计算机上,我看不出默认宽度 1 和宽度 0.5 有什么区别,但您可以在您的计算机上试用一下,看看是否有区别。)
您还可以将样式更改为虚线,例如/BS <</S /D /D [2 3]>>
:
(这[2 3]
意味着 2 点长的虚线与 3 点长的间隙交替……您可以更改参数以及宽度,例如/BS <</W 1.5 /S /D /D [3 4]>>
或任何其他值。)您可以尝试所有这些参数以找到您最喜欢的参数。例如,/BS <</W 2 /S /D /D [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}
为了说明效果,我们可以尝试如下夸张的值10pt
:
或者-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}