买者自负...

买者自负...

我正在写一本很长的数学书。有时我移动内容后,内部引用 ( \ref{...}) 会引用文本中稍后出现的项目。例如,证明可能(无意中)要求在书中稍后证明某件事。LaTeX 能否自动对此发出警告?

答案1

您可以加载瓦里雷夫包并使用该包的\vref指令而不是更基本的\ref命令。

默认情况下,\vref当交叉引用标注引用之前页面上出现的项目时,会添加页面相关信息或者在呼叫本身之后。通过添加说明

\renewcommand\reftextfacebefore{}
\renewcommand\reftextbefore{}

在序言中,只有当被交叉引用的项目发生时,的输出\vref才会与的输出不同\ref呼叫。

严格来说,这种方法不会产生警告如果调出出现在项目本身之前。但是,与诸如 之类的包结合使用时hyperref,由\vref(“第 65 页上的定理 5”) 生成的额外信息应该会创建一个易于检测的视觉标志。一旦您确信文档不包含任何不需要的前向交叉引用,您就可以将所有\vref语句改回\ref

下面给出了完整的 MWE。请注意,\vref第一页上的语句会生成相对于\ref已生成内容的额外输出,而\vref第三页上的语句则不会。

\documentclass{article}

\usepackage{varioref}
\renewcommand\reftextfacebefore{}
\renewcommand\reftextbefore{}

\usepackage[colorlinks]{hyperref} % cross-references marked in red

\begin{document}
A cross-reference to equation \vref{eq:pyth}.

A cross-reference to equation \vref{eq:euler}.
\clearpage
\begin{equation}\label{eq:pyth} a^2+b^2=c^2 \end{equation}
\clearpage
\begin{equation}\label{eq:euler} e^{i\pi}-1=0 \end{equation}
A cross-reference to equation \vref{eq:pyth}.
\end{document}

答案2

我并不是说这样做是明智的……

买者自负...


你可以使用这样的方法:

\usepackage{expl3,etoolbox}
\ExplSyntaxOn
\seq_new:N \l_zeno_refs_seq
\msg_new:nnn { zeno } { Patch Failure } { Could~not~patch~#1~\msg_line_context:! }
\msg_new:nnn { zeno } { Patch OK } { Successfully~patched~#1~\msg_line_context:. }
\msg_new:nnn { zeno } { Prior Ref } { Cross-reference~before~label:~#1~\msg_line_context:. }
\apptocmd{ \label }
{
  \seq_put_left:Nn \l_zeno_refs_seq { #1 }
}
{
  \msg_info:nnn { zeno } { Patch OK } { \label }
}
{
  \msg_error:nnn { zeno } { Patch Failure } { \label }
}
\apptocmd{ \ref }
{
  \seq_if_in:NnTF \l_zeno_refs_seq { #1 } {} { \msg_warning:nnn { zeno } { Prior Ref } { #1 } }
}
{
  \msg_info:nnn { zeno } { Patch OK } { \ref }
}
{
  \msg_error:nnn { zeno } { Patch Failure } { \ref }
}
\ExplSyntaxOff

基本上,这会跟踪标签并检查引用是否引用已发布的标签。如果不是,它会显示以下内容:

*************************************************
* zeno warning: "PriorRef"
* 
* Cross-reference before label: fifth on line 77.
*************************************************

完整代码:

\documentclass{article}
\usepackage{expl3,etoolbox}
\ExplSyntaxOn
\seq_new:N \l_zeno_refs_seq
\msg_new:nnn { zeno } { Patch Failure } { Could~not~patch~#1~\msg_line_context:! }
\msg_new:nnn { zeno } { Patch OK } { Successfully~patched~#1~\msg_line_context:. }
\msg_new:nnn { zeno } { Prior Ref } { Cross-reference~before~label:~#1~\msg_line_context:. }
\apptocmd{ \label }
{
  \seq_put_left:Nn \l_zeno_refs_seq { #1 }
}
{
  \msg_info:nnn { zeno } { Patch OK } { \label }
}
{
  \msg_error:nnn { zeno } { Patch Failure } { \label }
}
\apptocmd{ \ref }
{
  \seq_if_in:NnTF \l_zeno_refs_seq { #1 } {} { \msg_warning:nnn { zeno } { Prior Ref } { #1 } }
}
{
  \msg_info:nnn { zeno } { Patch OK } { \ref }
}
{
  \msg_error:nnn { zeno } { Patch Failure } { \ref }
}
\ExplSyntaxOff
\begin{document}
\ref{first}\ref{second}\ref{third}\ref{fourth}\ref{fifth}\newpage
\label{first}\ref{first}\ref{second}\ref{third}\ref{fourth}\ref{fifth}\newpage
\label{second}\ref{first}\ref{second}\ref{third}\ref{fourth}\ref{fifth}\newpage
\label{third}\ref{first}\ref{second}\ref{third}\ref{fourth}\ref{fifth}\newpage
\label{fourth}\ref{first}\ref{second}\ref{third}\ref{fourth}\ref{fifth}\newpage
\label{fifth}\ref{first}\ref{second}\ref{third}\ref{fourth}\ref{fifth}\newpage
\ref{first}\ref{second}\ref{third}\ref{fourth}\ref{fifth}\newpage
\end{document}

相关内容