纯 TeX 和 dvi 和 pdf 中的不同超链接样式

纯 TeX 和 dvi 和 pdf 中的不同超链接样式

我用哈夫马克宏用纯 TeX 编写论文,harvmac 加载超碱性文件以启用超链接。

但是我不明白为什么超链接在 dvi 和 PDF 文件中的外观不同,我也找不到默认值的定义位置,因此无法更改它们。此外,根据我编译 PDF 的方式,我在 pdf 中得到的超链接样式也不同。

使用下面的 MWE,来自的 dvi 文件tex MWE.tex有一个蓝色超链接,没有包围框(见下图),而的结果dvips -z MWE.dvi; ps2pdf14 MWE.ps有一个蓝色框内的黑色超链接。的结果xetex MWE.tex有不可见的超链接(黑色方程式编号,没有包围框)。

我想了解这些样式定义从何而来,因为我更喜欢 DVI 样式,并且希望 PDF 也一样(蓝色方程式编号,没有环绕框)。来自的宏hyperbasics.tex似乎没有定义任何默认值,所以很不幸我喜欢 DVI 样式,但不喜欢 PDF 样式。

那么,如何获取PDF文件中没有框的蓝色方程式编号?

梅威瑟:

\input harvmac

\newsec{Some title}

One equation:
\eqn\ps{ A = 0}
Reference: See equation \ps.

\bye

在 DVI 文件中:

xdvi 所见的 DVI 风格

在 PDF 文件中:

在此处输入图片描述

答案1

hypertex使用LaTeX 包的驱动程序可以获得相同的结果hyperrefhyperTeX特殊定义一些非常基本的 HTML 标记,例如:

s:[1/1]:: html:<a name="page.1">
s:[1/1]:: html:</a>
s:[1/1]:: html:<a name="Doc-Start">
s:[1/1]:: html:</a>
s:[1/1]:: html:<a name="section*.1">
s:[1/1]:: html:</a>
s:[1/1]:: html:<a href="#section.1">
s:[1/1]:: html:</a>
s:[1/1]:: html:<a name="section.1">
s:[1/1]:: html:</a>
s:[1/1]:: html:<a href="#section.1">
s:[1/1]:: html:</a>
s:[1/1]:: html:<a href="http://www.example.org/">
s:[1/1]:: html:</a>

dvii这是TeX 源文件的输出:

\documentclass{article}
\usepackage[hypertex]{hyperref}
\begin{document}
\tableofcontents
\section{Hello World}
\label{sec:hello}
See section \ref{sec:hello}.
\url{http://www.example.org/}
\end{document}

特殊hyperTeX功能不提供配置选项,也不了解 PDF。因此,链接结果由 DVI 程序控制:

  • xdvi蓝色下划线。
  • dvips -z使用蓝色盒子。

配置xdvi

There are three options to configure the link outcome, from the manual page of `xdvi`:
-linkcolor
      (.linkColor)  Color  used  for unvisited hyperlinks
      (`Blue2' by default). Hyperlinks are unvisited  be­
      fore  you  click on them, or after the DVI file has
      been reloaded.  The value should be either a  valid
      X color name (such as DarkGoldenrod4) or a hexadec­
      imal color string (such as #8b6508).Seealso -visit­
      edlinkcolor and -linkstyle.

-linkstyle
      (.LinkStyle)  Determines  the style in which hyper­
      links are  displayed.  Possible  values  and  their
      meanings are:

       0       No highlighting of links
       1       Underline links with link color
       2       No underlining, color text with link color
       3       Underline and display text colored with
               link color

      The  values for link color are specified by the op­
      tions/resources  -linkcolor  and  -visitedlinkcolor
      (which see).

-visitedlinkcolor
      (.visitedLinkColor) Color used for  visited  hyper­
      links  (`Purple4'  by  default).  Hyperlinks become
      visited once you click on them. As  for  linkColor,
      the  value should be either a valid X color name or
      a hexadecimal color string.

配置dvips

边框和颜色是硬编码的,来自hps.c

p->color[0] = 0;
p->color[1] = 0; /* Blue links */
p->color[2] = 1;
p->border[0] = 1; /* horizontal corner radius */
p->border[1] = 1; /* vertical corner radius */
p->border[2] = 1; /* box line width */
p->border[3] = 3; /* dash on size */
p->border[4] = 3;  /* dash off size */

因此,dvips -z上面示例的链接写为:

(#section.1) [[134 682 210 694] [1 1 1 [3 3]] [0 0 1]] pdfm 
(#section.1) [[185 628 190 640] [1 1 1 [3 3]] [0 0 1]] pdfm
[[197 628 318 640] [1 1 1 [3 3]] [0 0 1]] (http://www.example.com/) pdfm 

pdfm为了获得不同的颜色,需要更改的定义hps.pro ,或者可以稍后通过操作参数pdfm并替换边框和颜色的数组来重新定义。

或者简而言之,dvips -z如果不破解内部结构就无法进行配置。

答案2

这是我对以下问题的解决方案:(1) 使用纯 TeX 中的 pdfmark 在 PDF 输出中生成超链接,以及 (2) 将蓝色矩形转换为下划线。

http://linux.topology.org/pdfmark.html

这里太长了,无法总结。但粗略地说,(1)的答案是编写一些 TeX 宏来完成这项工作。(2)的答案是编辑当前工作目录中的文件“hps.pro”以使用下划线。


PS. 这是我对第 (1) 部分的回答。
如何在纯 TeX 中使用 PDF 超链接。

当我说“纯 TeX”时,我指的是完全纯 TeX,没有第三方宏库或外部脚本或类似的东西,除了我自己编写的。我的纯 TeX 宏的基本参考是http://arxiv.org/hypertex/(标有“内部是如何完成的”部分)https://www.tug.org/applications/hyperref/ftp/doc/manual.html(标有“简介”的部分)。

首先,我必须将 HTML 特殊命令写入我自己的 和各种子节宏中,以便将它们放入 DVI 文件中\chapter\section这些命令太过繁琐且不相关,无法完整写出。但以下代码片段给出了基本思路。

% This \PreHatch macro to prefix a text string with a hatch character.
{\catcode`\^=6 \catcode`\#=12 \gdef\PreHatch^1{#^1}}

% Anchor points for cross-reference hyperlinks.
\def\LinkNameText#1#2{%
 \special{html:<a name="#1">}#2\special{html:</a>}}
\def\LinkNamePRE#1{\special{html:<a name="#1">}}
\def\LinkNamePOST{\special{html:</a>}}
\def\LinkName#1{\LinkNameText{#1}{}}

% Cross-reference hyperlinks to defined anchor points.
\def\LinkHrefText#1#2{%
 \special{html:<a href="\PreHatch{#1}">}#2\special{html:</a>}}

% Pre-text and post-text macros.
\def\LinkHrefPRE#1{\special{html:<a href="\PreHatch{#1}">}}
\def\LinkHrefPOST{\special{html:</a>}}

% External hyperlinks.
\def\LinkHrefExtText#1#2{%
 \special{html:<a href="#1">}#2\special{html:</a>}}
\def\LinkHrefExt#1{\LinkHrefExtText{#1}{#1}}
\def\LinkHrefExtTT#1{\LinkHrefExtText{#1}{{\tt#1}}}

这是我用于文档的实际代码。这些宏可以像本例中一样调用。

\def\BKidxhyperSECT##1{\LinkHrefText{section.##1}{##1}}

这会将文本参数(一个部分的整数)插入到 A/HREF 跨度中。如果我需要先输出 A/HREF 链接信息,然后输出一些文本,然后添加</a>,那么我会调用LinkHrefPRELinkHrefPOST宏。

上面的描述是比较简单的部分,只需使用完全普通的 TeX 即可创建 PDF 超链接。唯一棘手的事情是修改以\catcode允许在 a/href 参数中插入哈希字符。

我将在下一个答案中写下关于如何用下划线替换蓝色链接框的第(2)部分。

答案3

第2部分)。
如何将 pdfmark 蓝色矩形超链接更改为下划线。

通过运行stracelinuxdvips -z命令的命令,我发现默认情况下dvips -z使用全局文件/usr/lib/texmf/dvips/base/hps.pro添加到输出 Postscript 文件中,以使超链接被使用ps2pdf。但是,dvips -z还首先在当前工作目录中查找文件hps.pro。所以我所要做的就是将全局hps.pro文件复制到本地工作目录并对其进行破解,将超链接的蓝色框更改为蓝色下划线。

首先,我在原始文件创建名为的词典/bsdict的下方添加了一个新的 Postscript 词典。hps.pro/actiondict

/actiondict 2 dict dup/Subtype/URI put def
/bsdict 4 dict dup /S /U put dup /W 1 put def

上面的第一行已经在文件中了。第二行是我添加的。

/BS bsdict其次,我在下文所指的地方添加了文字。

[....]
/Color exch /BS bsdict oldstyle{/LNK}{/Subtype/Link/ANN}ifelse gsave initmat
[....]
aload pop/Rect 4 1 roll/Border 3 1 roll/Color exch/BS bsdict/LNK gsave initmat
[....]

添加的文本必须准确地位于指示的位置(除非您确切知道如何编写 Postscript,以便知道如何将其放在其他地方)。上述命令的作用是添加创建蓝色下划线所需的参数。我认为这BS意味着框样式,/S意味着“样式”,/U意味着下划线,而且非常重要的是,“/W”意味着线的“宽度”。如果未设置,则默认值为零,即不可见。


附言:仅供参考,这是hps.pro我去年成功使用的修改版文件。我相当确定这不存在版权问题。

%!
/HPSdict 20 dict dup begin/braindeaddistill 50 def/rfch{dup length 1 sub
1 exch getinterval}bind def/splituri{dup(#)search{exch pop}{()exch}
ifelse dup(file:)anchorsearch{pop exch pop 3 -1 roll pop false}{pop 3 -1
roll exch pop true}ifelse}bind def/lookuptarget{exch rfch dup
/TargetAnchors where{pop TargetAnchors dup 3 -1 roll known{exch get true
}{pop(target unknown:)print == false}ifelse}{pop pop
(target dictionary unknown\012)print false}ifelse}bind def/savecount 0
def/stackstopped{count counttomark sub/savecount exch store stopped
count savecount sub 1 sub dup 0 gt{{exch pop}repeat}{pop}ifelse}bind def
/tempstring 128 string def/targetvalidate{1 index dup length 127 gt exch
tempstring cvs dup(/)search{pop pop pop exch pop true exch}{pop}ifelse
token{pop length 0 ne}{true}ifelse or not}bind def/targetdump-hook where
{pop}{/targetdump-hook{dup mark exch gsave initmat setmatrix{{mark/Dest
4 2 roll targetvalidate{aload pop exch pop/Page 3 1 roll/View exch[exch
/FitH exch]/DEST pdfmark}{cleartomark}ifelse}forall}stackstopped pop
grestore}bind def}ifelse/baseurl{mark exch 1 dict dup 3 -1 roll/Base
exch put/URI exch/DOCVIEW{pdfmark}stackstopped pop}bind def
/externalhack systemdict/PDF known def/oldstyle true def/initmat matrix
currentmatrix def
/actiondict 2 dict dup/Subtype/URI put def
/bsdict 4 dict dup /S /U put dup /W 1 put def
/weblinkhandler{dup 3 1 roll mark 4 1 roll/Title 4 1 roll splituri 3 -1
roll dup length 0 gt{cvn/Dest exch 4 2 roll}{pop}ifelse{externalhack{
/HTTPFile exch}{actiondict dup 3 -1 roll/URI exch put/Action exch}
ifelse}{externalhack{/HTTPFile exch}{/File exch/Action/GoToR}ifelse}
ifelse counttomark 2 sub -1 roll aload pop/Rect 4 1 roll/Border 3 1 roll
/Color exch /BS bsdict oldstyle{/LNK}{/Subtype/Link/ANN}ifelse gsave initmat
setmatrix{pdfmark}stackstopped grestore}bind def/externalhandler where{
pop}{/externalhandler{2 copy{weblinkhandler}exec{/externalhack
externalhack not store 2 copy{weblinkhandler}exec{/externalhack
externalhack not store/oldstyle false store 2 copy{weblinkhandler}exec{
(WARNING: external refs disabled\012)print/externalhandler{pop pop}bind
store externalhandler}{pop pop}ifelse}{pop pop/externalhack externalhack
not store}ifelse}{pop pop/externalhandler{weblinkhandler pop}bind store}
ifelse}bind def}ifelse/pdfmnew{dup type/stringtype eq{externalhandler}{
exch dup rfch exch 3 -1 roll lookuptarget{mark 4 1 roll/Title 4 1 roll
aload pop exch pop/Page 3 1 roll/View exch[exch/FitH exch]5 -1 roll
aload pop/Rect 4 1 roll/Border 3 1 roll/Color exch/BS bsdict/LNK gsave initmat
setmatrix pdfmark grestore}{pop pop}ifelse}ifelse}bind def/pdfmold{dup
type/stringtype eq{externalhandler}{exch dup rfch exch 3 -1 roll
lookuptarget{mark 4 1 roll/Title 4 1 roll aload pop exch pop/Page 3 1
roll/View exch[exch/FitH exch]5 -1 roll aload pop pop 0 3 getinterval
/Rect 3 1 roll/Border exch/LNK gsave initmat setmatrix pdfmark grestore}
{pop pop}ifelse}ifelse}bind def/pdfm where{pop}{/pdfm
/currentdistillerparams where{pop currentdistillerparams dup
/CoreDistVersion known{/CoreDistVersion get}{0}ifelse dup
braindeaddistill le{(WARNING: switching to old pdfm because version =)
print ==/pdfmold}{pop/pdfmnew}ifelse load}{/pdfmark where{pop{dup type
/stringtype eq{externalhandler}{2 copy mark 3 1 roll{pdfmnew}
stackstopped{2 copy mark 3 1 roll{pdfmold}stackstopped{
(WARNING: pdfm disabled\012)print/pdfm{pop pop}store}{
(WARNING: new pdfm failed, switching to old pdfm\012)print/pdfm/pdfmold
load store}ifelse}{/pdfm/pdfmnew load store}ifelse pop pop}ifelse}}{{
pop pop}}ifelse}ifelse bind def}ifelse end def

如果在运行时将此文件放在本地目录中dvips -z,则将使用它来代替全局hps.pro文件。无论如何,它都可以在 dvips 版本 5.98 上运行。

相关内容