我用哈夫马克宏用纯 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 文件中:
在 PDF 文件中:
答案1
hypertex
使用LaTeX 包的驱动程序可以获得相同的结果hyperref
。hyperTeX
特殊定义一些非常基本的 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>
,那么我会调用LinkHrefPRE
和LinkHrefPOST
宏。
上面的描述是比较简单的部分,只需使用完全普通的 TeX 即可创建 PDF 超链接。唯一棘手的事情是修改以\catcode
允许在 a/href 参数中插入哈希字符。
我将在下一个答案中写下关于如何用下划线替换蓝色链接框的第(2)部分。
答案3
第2部分)。
如何将 pdfmark 蓝色矩形超链接更改为下划线。
通过运行strace
linuxdvips -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 上运行。