如何让 LaTeX 因缺少交叉引用而失败?

如何让 LaTeX 因缺少交叉引用而失败?

如果文件没有所请求标签的页码,有没有办法让它失败\ref\pageref不是打印???.aux

答案1

负责打印的宏??\ref当遇到不存在的情况时\label会发出警告\@setref

\def\@setref#1#2#3{%
  \ifx#1\relax
   \protect\G@refundefinedtrue
   \nfss@text{\reset@font\bfseries ??}%
   \@latex@warning{Reference `#3' on page \thepage \space
             undefined}%
  \else
   \expandafter#2#1\null
  \fi}

你可以改变用法\@latex@warning\@latex@error适应\@latex@error需要参数而\@latex@warning不是):

\documentclass{article}

\usepackage{etoolbox}

\makeatletter
\patchcmd{\@setref}{\@latex@warning}{\@latex@error}{}{}
\patchcmd{\@setref}{\else}{\relax\else}{}{}
\makeatother

\begin{document}

\section{A section}
\label{sec:section1}
See section~\ref{sec:section1}.% Succeeds ...
                               % ... IF you have already compiled with \label{sec:section1}
See section~\ref{sec:section2}.% Fails

\end{document}

使用此功能似乎毫无用处……如果我们假设用例是您有一个现有文档,其中包含一些\ref您想要识别的未定义错误,您将“激活”此重新定义并进行编译。现在,在文档中间的某个地方,您的编译失败(再次假设您没有在 中运行 LaTeX nonstopmode)并且编译停止。在此失败之后的所有引用在后续编译中都将未定义(因为它们的\labels 尚未写入.aux),这将再次失败。因此,您必须不断激活/停用此“功能”,并在每次失败后执行多次编译。

更好的选择是使用常规文本搜索来处理您的.log并识别未定义的错误。\ref

相关内容