使用无框的超级设置代替白框

使用无框的超级设置代替白框

我喜欢隐藏某些类型的链接,以免分散读者的注意力。我想隐藏引用链接,但显示\href类型链接(我认为引用链接不需要在视觉上突出显示,因为如果读者知道文档中使用的惯例,他们可能知道所有引用都是链接;而读者会知道href 类型(诸如此类的链接只有突出显示时才是链接)。

链接是通过 定义的hyperref。我不想使用该选项,hidelinks因为(据我所知)它会隐藏所有链接。我更喜欢使用方框而不是颜色来显示链接(因为它们对打印版本没有影响)。因此,我想禁用引用链接的方框并保留其他链接的方框。

我尝试使用 来执行此操作\hypersetup{citebordercolor={1 1 1}},这似乎是通常推荐的策略。现在,我可能在这里吹毛求疵,但如果可能的话,我认为没有框比白色框更优雅。因为此策略会在生成的 PDF 中生成(AFAIU)一个白色框,而不是不生成任何框。我的意思是,我怀疑该框确实存在,在呈现时占用文档和内存中的(极小一部分)空间,同时由于纸张的正常背景颜色是白色而看不见。(并且如果阅读器软件不能完美地生成确实完全是白色的框,则可能会触发错误,就像我的情况一样。)

这是一个最小的例子。

\documentclass{article}
\usepackage{hyperref}
\hypersetup{citebordercolor={1 1 1}}

\begin{document}
Hello, I cite \cite{key}.

\begin{thebibliography}{1}
\bibitem{key}
A.~Author.
\end{thebibliography}
\end{document}

现在,显然这确实产生了一个如我预期的盒子:我的阅读器中可能存在视觉错误,导致盒子的一部分显示为黑色。

因此,我的问题是:有没有办法根本不产生盒子,而不是将盒子“变白”?

答案1

最后,我决定接受 Olivier Cailloux 的号召,皈依我的评论并给出答案。

以下内容特别提到了hpdftex驱动程序,即排版引擎为 pdfTeX 时通常使用的驱动程序。此驱动程序将一段文本括在\pdfstartlink\pdfendlink节点之间,将其转换为超链接,这些节点由具有相同(各自)名称的原始命令生成;这些节点是“whatsit”节点(类似于节点\special)的子类型,这意味着它们“隐式地与页面上的特定位置相关联,即如果高度、深度和宽度为零的框出现在 whatsit 的位置,则会出现的参考点”(TeXbook,第 228 页)。没有生成额外的框来保存链接:实际上,链接所占区域的尺寸也记录在\pdfstartlink节点本身中,并且可以在源代码中通过用于描述规则的相同符号来指定,例如

\pdfstartlink height 10pt depth 4pt width 3cm ...

如果省略组件(heightdepthwidth),则默认为值“running”,即“到达封闭框的边界(对于heightdepth)或到达相应\pdfendlink节点(对于width)”。如果\pdfstartlink具有“running”宽度的节点是随后拆分为行的水平列表的一部分,并且如果相应\pdfendlink节点在不同的行中结束,则链接将根据需要自动跨行拆分,甚至跨页面拆分。用于显示链接的颜色或在其周围绘制的边框的粗细和颜色等属性直接指定为 PDF 命令,这些命令同样记录在节点\pdfstartlink本身中。

下面的例子在记录 ( .log) 文件中留下了一个诊断跟踪,说明了我们刚才所说的内容。

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
\usepackage[utf8]{inputenc}      % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

% \usepackage{hyperref}
% \hypersetup{colorlinks=false,citebordercolor={0 .75 .25}}

\makeatletter

\newcommand*\ShowLists{%
    \begingroup
        \showboxbreadth \@M
        \showboxdepth \sixt@@n
        \tracingonline \@ne
        \showlists
    \endgroup
}

\makeatother



\begin{document}

Hello, I~cite~\cite{key}.
\ShowLists

\begin{thebibliography}{1}
    \bibitem{key}
        A.~U.~Thor, \emph{A~short story}.
\end{thebibliography}

\end{document}

首先按原样编译它,即使用以下两行

% \usepackage{hyperref}
% \hypersetup{colorlinks=false,citebordercolor={0 .75 .25}}

注释掉,以便生成一个“基准”跟踪,显示当hyperref不是已加载。查看文件.log,您应该找到以下摘录:

### horizontal mode entered at line 29
\hbox(0.0+0.0)x15.0
\T1/cmr/m/n/10 H
\T1/cmr/m/n/10 e
\T1/cmr/m/n/10 l
\T1/cmr/m/n/10 l
\T1/cmr/m/n/10 o
\T1/cmr/m/n/10 ,
\glue 3.33252 plus 2.08282 minus 0.88867
\T1/cmr/m/n/10 I
\penalty 10000
\glue 3.33252 plus 1.66626 minus 1.11084
\T1/cmr/m/n/10 c
\T1/cmr/m/n/10 i
\T1/cmr/m/n/10 t
\T1/cmr/m/n/10 e
\penalty 10000
\glue 3.33252 plus 1.66626 minus 1.11084
\T1/cmr/m/n/10 [
\hbox(6.4151+0.0)x4.99878
.\T1/cmr/m/n/10 1
\T1/cmr/m/n/10 ]
\T1/cmr/m/n/10 .
\glue 4.44336 plus 4.99878 minus 0.37027
spacefactor 3000
### vertical mode entered at line 0
### current page:
\write-{}

prevdepth 0.0

./citelink.tex:30: OK.
\ShowLists ...t@@n \tracingonline \@ne \showlists 
                                                  \endgroup 
l.30 \ShowLists

? 

如您所见,引用“1”已包含在 中\hbox,即使没有生成超链接也是如此。现在取消注释加载和配置hyperref包的行

\usepackage{hyperref}
\hypersetup{colorlinks=false,citebordercolor={0 .75 .25}}

并再次编译;成绩单现在应如下所示:

### horizontal mode entered at line 29
\hbox(0.0+0.0)x15.0
\T1/cmr/m/n/10 H
\T1/cmr/m/n/10 e
\T1/cmr/m/n/10 l
\T1/cmr/m/n/10 l
\T1/cmr/m/n/10 o
\T1/cmr/m/n/10 ,
\glue 3.33252 plus 2.08282 minus 0.88867
\T1/cmr/m/n/10 I
\penalty 10000
\glue 3.33252 plus 1.66626 minus 1.11084
\T1/cmr/m/n/10 c
\T1/cmr/m/n/10 i
\T1/cmr/m/n/10 t
\T1/cmr/m/n/10 e
\penalty 10000
\glue 3.33252 plus 1.66626 minus 1.11084
\T1/cmr/m/n/10 [
\hbox(6.4151+0.0)x4.99878
.\pdfstartlink(*+*)x* attr{/Border[0 0 1]/H/I/C[0 .75 .25]} action goto name{ci
te.key}
.\T1/cmr/m/n/10 1
.\pdfendlink
\T1/cmr/m/n/10 ]
\T1/cmr/m/n/10 .
\glue 4.44336 plus 4.99878 minus 0.37027
spacefactor 3000
### vertical mode entered at line 0
### current page:
\write-{}
\pdfdest name{Doc-Start} xyz

prevdepth 0.0

./citelink.tex:30: OK.
\ShowLists ...t@@n \tracingonline \@ne \showlists 
                                                  \endgroup 
l.30 \ShowLists

? 

你可以看到

\T1/cmr/m/n/10 [
\hbox(6.4151+0.0)x4.99878
.\T1/cmr/m/n/10 1
\T1/cmr/m/n/10 ]

已成为

\T1/cmr/m/n/10 [
\hbox(6.4151+0.0)x4.99878
.\pdfstartlink(*+*)x* attr{/Border[0 0 1]/H/I/C[0 .75 .25]} action goto name{cite.key}
.\T1/cmr/m/n/10 1
.\pdfendlink
\T1/cmr/m/n/10 ]

没有添加额外的框:只是将“1”括在\pdfstartlink和节点之间。这些节点由包通过执行相当于原始命令的代码\pdfendlink生成hyperref

\pdfstartlink
    attr {/Border[0 0 1]/H/I/C[0 .75 .25]}
    goto name {cite.key}

链接的开始,以及

\pdfendlink

用于链接的结尾。省略了“规则规范”,因此链接具有“连续”高度、深度和宽度((*+*)x*在抄本中显示)。链接周围边框的粗细和颜色由后面的字符串(“一般文本”)指定,括在括号中的关键字attr:如果包含该字符串/Border[0 0 0]而不是/Border[0 0 1],则不会绘制边框。因此我们看到,边框的存在不仅不会占用 pdfTeX 程序内的任何额外内存单元,而且在生成的 PDF 文件中,它仅要求将 替换为 1, 0从而得到长度相同的文件!

很遗憾,正如@AlexG 已经指出的那样, 这hyperref包没有规定为不同类型的链接指定不同的边框厚度:你只能自定义周围绘制的边框的厚度全部链接。因此,除非对hyperref软件包和/或hpdftex驱动程序的宏进行实质性的修补,否则我看不到与@AlexG 的解决方案有本质上不同的解决方案。

答案2

\cite加载后,我将重新定义hyperref以本地删除 PDF 链接边框:

\documentclass{article}

\usepackage{hyperref}

\let\citeOrig\cite
\renewcommand\cite[2][]{{%
  \hypersetup{pdfborder=0 0 0}%
  \ifx\empty#1\empty%
    \citeOrig{#2}%
  \else%
    \citeOrig[#1]{#2}%
  \fi%  
}}

\begin{document}
Hello, I cite \cite{key}.

\begin{thebibliography}{1}
\bibitem{key}
A.~Author.
\end{thebibliography}
\end{document}

相关内容