我有一个巨大的 LaTeX 文档,里面有我数学课程的讲义;我时不时地会更改各个部分的顺序。
我想确保所有交叉引用(例如,定理)都按“时间顺序”排列:在第 7 节中引用第 5 节的内容是可以的,但我不想在第 5 节的证明中使用直到第 7 节才会被证明的结果的引用。
是否有一个包可以检查交叉引用是否指向文档中早于或晚于该特定引用定义的标签?
答案1
hyperref
概念证明(如果涉及则需要大量工作):
\documentclass{article}
\makeatletter
\let\latex@label\label
\let\latex@ref\ref
\def\label#1{\global\@namedef{LABEL@#1@USED}{}\latex@label{#1}}
\def\ref#1{%
\ifcsname LABEL@#1@USED\endcsname\else
\@latex@warning{Forward Reference '#1'}%
\fi
\latex@ref{#1}%
}
\makeatother
\begin{document}
\section{A}\label{a}
This refers to \ref{a} and to \ref{b}.
\section{B}\label{b}
OK.
\end{document}
日志文件将包含
LaTeX Warning: Forward Reference 'b' on input line 19.
答案2
这里有一个似乎可行的解决方案,尽管不在子方程内。它使用 zref 表示绝对页码,请参阅如何找到整数形式的绝对页码?和指的是当前页码,但不是 \thepage,而是真正的绝对 您将在日志文件中找到所有不需要的交叉引用的警告。
\documentclass{article}
\usepackage{amsmath}
\usepackage[user,abspage]{zref}
\usepackage{xassoccnt}
\makeatletter
\let\oldref\ref
\let\oldeqref\eqref
\let\oldlabel\label
\newcommand\mylabel[1]{%
\oldlabel{#1}%
\zlabel{#1}%
}
\renewcommand\label[1]{%
\mylabel{#1}%
}
\renewcommand{\ref}[1]{%
\zref{#1}%
\ifnum\zref@extract{#1}{abspage}<\value{realpage}
\GenericWarning{}{Warning: Backwards refence '#1' on page \thepage}%
\fi%
}
\renewcommand{\eqref}[1]{%
(\zref{#1})%
\ifnum\zref@extract{#1}{abspage}<\value{realpage}
\GenericWarning{}{Warning: Backwards refence '#1' on page \thepage}%
\fi%
}
\def\label@in@display#1{%
\ifx\df@label\@empty\else
\@amsmath@err{Multiple \string\label's:
label '\df@label' will be lost}\@eha
\fi
\mylabel{#1}
\typeout{XXX #1 XXX}
}
\makeatother
\newcounter{realpage}
\DeclareAssociatedCounters{page}{realpage}
\AtBeginDocument{%
\stepcounter{realpage}
}
\begin{document}
\pagenumbering{roman}
\section{Sec~1}
\begin{align}\label{eqR1}
x &= 1
\end{align}
Text~R1\label{textR1}
\clearpage
\pagenumbering{arabic}
\section{Sec~2}
\begin{align}\label{eq1}
x &= 1
\end{align}
\begin{subequations}
\begin{align}
x &= 1\label{eqS1} \\
y &= 1\label{eqS2}
\\
z&=1
\\
z&=10
\end{align}
\end{subequations}
Text~1\label{text1}
\newpage
\begin{itemize}
\item Equation~R1: \eqref{eqR1}
\item Equation~1: \eqref{eq1}
\item Equation~S1: \eqref{eqS1}
\item Equation~2: \eqref{eq2}
\item Text~R1: \ref{textR1}
\item Text~1: \ref{text1}
\item Text~2: \ref{text2}
\end{itemize}
\newpage
\section{Sec~3}
\begin{align}\label{eq2}
x &= 2
\end{align}
Text~2\label{text2}
\newpage
\end{document}