日志类别显示“包 hyperref 警告:抑制输入行 XXX 上带有空目标的链接”

日志类别显示“包 hyperref 警告:抑制输入行 XXX 上带有空目标的链接”

编译以下示例文件:

\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 \labels 只需要两个参数,以及何时hyperref加载(使用\label5 个参数写入 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*}

相关内容