如果文件没有所请求标签的页码,有没有办法让它失败\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
)并且编译停止。在此失败之后的所有引用在后续编译中都将未定义(因为它们的\label
s 尚未写入.aux
),这将再次失败。因此,您必须不断激活/停用此“功能”,并在每次失败后执行多次编译。
更好的选择是使用常规文本搜索来处理您的.log
并识别未定义的错误。\ref