编译以下示例文件:
\documentclass{aa}
\usepackage{hyperref}
\begin{document}
\section{Introduction}
Aaaa bbbb~\cite{Smith_2005} cccc.
\bibliographystyle{aa}
\bibliography{biblio}
\end{document}
显示警告:
.../test.tex:15:软件包 hyperref 警告:抑制输入行 15 上带有空目标的链接。
我编译如下:
$ latexmk test.tex
我的 LaTeX 版本是:
$ latex
This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=latex)
该biblio.bib
文件如下所示:
@ARTICLE{Smith_2005,
author = {{Smith}, N.~V.},
journal = {AAA},
year = 2005,
month = sep,
volume = 440,
pages = {403-408},
}
禁用该hyperref
软件包会使警告消失,但我需要启用它。最终的 PDF 看起来不错,但我不知道为什么会出现这个警告,因为我不记得以前见过它。
答案1
该类使用 存储最后一页码作为参考LastPage
,写为\end{document}
(添加注释)的一部分:
\renewcommand*\enddocument{%
\let\AtEndDocument\@firstofone
\@enddocumenthook
\clearpage
\advance\c@page \m@ne
\immediate\write\@auxout{\string\newlabel{LastPage}{{\thepage}{\thepage}{}{}{}}}
% ^^^^ This writes the (last) page number as a \label to the .aux
\@checkend{document}%
\clearpage
\begingroup
\if@filesw
\immediate\closeout\@mainaux
\let\@setckpt\@gobbletwo
\let\@newl@bel\@testdef
\@tempswafalse
\makeatletter \input\jobname.aux
\fi
\@dofilelist
\ifdim \font@submax >\fontsubfuzz\relax
\@font@warning{Size substitutions with differences\MessageBreak
up to \font@submax\space have occurred.\@gobbletwo}%
\fi
\@defaultsubs
\@refundefined
\if@filesw
\ifx \@multiplelabels \relax
\if@tempswa
\@latex@warning@no@line{Label(s) may have changed.
Rerun to get cross-references right}%
\fi
\else
\@multiplelabels
\fi
\fi
\endgroup
\deadcycles\z@\@@end}
请注意,\newlabel
写有 5 个参数。但是,参数 3、4 和 5 为空。这是为了适应常规的非hyperref
\label
s 只需要两个参数,以及何时hyperref
加载(使用\label
5 个参数写入 s)。
LastPage
整个文档的页脚中都通过此宏使用了此引用(第 425 行):
\newcommand*\aa@pageof{, page \thepage{} of \pageref{LastPage}}
虽然这通常有效,但hyperref
使用附加参数(本例中为空)将最后一页的标记标识为超链接/跳转。由于它们是空的,因此hyperref
忽略超链接并仅打印(页面)引用(连同警告)。
您可以通过将 更改为 来避免此警告\pageref
;\pageref*
将以下内容添加到您的序言中:
\makeatletter
\renewcommand*\aa@pageof{, page \thepage{} of \pageref*{LastPage}}
\makeatother
或者,将所有\pageref
默认为无超链接的引用:
\let\oldpageref\pageref
\renewcommand{\pageref}{\oldpageref*}