我很好奇,如果引用尚未定义,是否有办法强制编译失败。我不希望引用实际将任何内容输出到文档中,而只是检查存在条件。例如,我希望能够执行以下操作:
\begin{definition} \label{def C} \requires{def A} \requires{def B}
A \underline{C} is an A and a B such that... etc etc etc.
\end{definition}
并且我不希望\requires{def A}
实际产生输出,而只是强制在上方某处存在\label{def A}
。理想情况下,您可以将其用于定理和定义。这样,我就可以在我的定理/定义中添加任何依赖项,而不必担心我是否已经定义了上面的所有内容,编译器会告诉我。cleveref
提供这个吗?如果没有,添加它会有多难?我非常简要地查看了源代码,但我不太熟悉该语言,所以需要一段时间。
答案1
如果你真的想强制标签是前,则\requires
必须重新定义该\label
命令,因为当前定义仅将标签写入aux-files
,因此其相对于的位置\ref
无关紧要。例如
\documentclass{article}
\makeatletter
\let\Orilabel\label
\renewcommand\label[1]{\@namedef{mylabel@#1}{}\Orilabel{#1}}
\newcommand\require[1]{%
\ifcsname mylabel@#1\endcsname
\else
\@latex@error{Reference #1 undefined}
\fi}
\begin{document}
\section{A}
\label{A}
\require{A}\require{B}
\ref{A},\ref{B} \label{B}
\end{document}