我正在使用 hyperref 包。我的 .tex 文件包含一些自动生成的内容,这些内容使用 \hyperlink 来引用 .tex 文件中通常不包含的内容。很难找到这些内容出现的位置,因为这些超链接是由宏引入的。是否可以在 PDF 中以明亮的方式突出显示这些损坏的引用?
这是一个具体的最小示例:
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{hyperref}
\begin{document}
\hypertarget{correctDest}{This can be used as a destination of some hyperlink}
The line below has 2 hyperlinks, one to the above destination
and another to an undefined destination.\\
Clicking \hyperlink{correctDest}{here} should be good.
Clicking \hyperlink{undefined}{here} is bad because
there is no destination in this document that defined the
destination undefined. Is there a way that the latter hyperlink
is highlighted in the PDF so that it is easy to find and fix them?
\end{document}
我收到的错误消息甚至没有告诉我损坏引用所在的行号
pdfTeX warning (dest): name{undefined} has been referenced but does not exist,
replaced by a fixed one
答案1
因为我们不确定文本
pdfTeX warning (dest): name{undefined} has been referenced
不间断地写到更多行,使用起来grep
更复杂。也许这个检查可以在宏级别更简单地实现。例如,当我们使用纯 TeX 和 OPmac 时,代码应该是:
\input opmac
\hyperlinks\Blue\Blue
\def\link[#1]#2#3{%
\expandafter\ifx\csname islink:#1\endcsname\relax {\localcolor\Red #3}%
\else \linkactive[#1]{\localcolor\Blue}{#3}\fi
}
\def\dest[#1]{\openref\immediate\wref\sdef{{islink:#1}{}}\destactive[#1]}
%% Testing:
\def\hyperlink[#1]#2{\link[hyp:#1]{\localcolor\Blue}{#2}}
\def\hypertarget[#1]{\dest[hyp:#1]}
\hypertarget[correctDest]
Clicking \hyperlink[correctDest]{here} should be good.
Clicking \hyperlink[undefined]{here} is bad because there is no destination
in this document.
\bye
OPmac 使用工作 REF 文件\jobname.ref
,其中积累了所有需要再次读取的数据。这类似于aux
,但只有这个文件,没有其他文件(没有toc
等)。\dest[mark]
宏将 打印\sdef{isindent:mark}{}
到 REF 文件中,并且\link
宏可以询问是否定义了此控制序列。如果这是真的,则\linkactive
处理正常情况,否则只打印\Red
彩色文本。
抱歉,我不会为 LaTeX 和 hyperref 包重写这个想法,因为我不支持 LaTeX。我拒绝深入研究 8803 行hyperref.sty
代码,而 OPmac 中只有 44 行简单的代码解决了大部分相同的问题(超链接)。但你可以从中得到启发,并尝试为你正在使用的宏包实现这一点。