如何诊断永久的“标签可能已更改”警告?

如何诊断永久的“标签可能已更改”警告?

我收到以下警告:

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

问题是,重新运行(无论多少次)后它不会消失。

有问题的文档长达 200 多页,包含大约 30 个包,因此我实在无法提供一个最小示例。但我对自己的代码非常了解。如果我对这个问题了解更多,我可能就能修复它。所以我想问一些一般性问题:

  • 那么,“标签改变;重新运行”机制究竟是如何工作的呢?
  • 是否存在造成这一问题的共同元凶?
  • 人们通常如何诊断它?

我读过以下问题:

但我没有使用elsarticleacronym包,所以接受的答案不适用于我。


更多信息:根据建议,我做了一种“注释掉”的二分查找。(顺便说一句,如果 LaTeX 知道标签可能已经改变,为什么它不能告诉我哪个标签?)

无论如何,我似乎将问题追溯到了一个特定的figure。当我只编译第 1 章至第 3 章时,删除该图也会删除警告。但是,如果我再次包含所有章节,删除它figure是不够的。所以我猜还有其他问题位置。但我现在没有时间搜索第 4 章至第 9 章……

我还可以告诉你:我有一个tmp目录,LaTeX 和朋友会将所有临时文件转储到该目录中。在两次编译之间,此目录的相关内容不会发生变化根本。也就是说,diff -r告诉我唯一的变化是一些时间戳和文件.pdf。具体来说:所有.aux文件都是相同的。

答案1

(顺便说一句,如果 LaTeX 知道标签可能已经改变,为什么它不能告诉我哪些标签?)

下面的文档每次都会给出重新运行的错误信息。

\documentclass{article}

\makeatletter


% \def\@testdef #1#2#3{%
%   \def\reserved@a{#3}\expandafter \ifx \csname #1@#2\endcsname
%  \reserved@a  \else
% \typeout{^^Jlabel #2 changed:^^J%
% \meaning\reserved@a^^J%
% \expandafter\meaning\csname #1@#2\endcsname^^J}%
% \@tempswatrue \fi}


\begin{document}
\providecommand\r@foo{{1}{1}}
\edef\@currentlabel{.\expandafter\@firstoftwo\r@foo}
\label{foo}
a

\end{document}

生成日志

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

如果取消注释序言中的块,您会得到一个额外的诊断信息,告诉您哪个标签已更改,以及旧的和新的定义:

label foo changed:
macro:->{............1}{1}
macro:->{...........1}{1}

)

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

答案2

我也遇到过这个问题。我使用了 David 的出色小代码片段来捕获已更改的引用。由于日志文件很长,我使用以下方法将它们删除:

$ egrep -A2 "label .* changed:" jobname.log

就我而言,我发现不稳定标签的形式为pgfidnnnn,我相信这是由于使用 TikZ 键 而产生的remember picture。而且它们变化不大。根据手册的建议,我将其放在了\tikzstyle{every picture}+=[remember picture]文档的序言中。我关闭了这个总括选项,不稳定标签就消失了。

答案3

@Onner Irotsab 就我的情况来说也是如此,breqn但是为什么这个包会导致出现“标签更改警告”消息呢?

相关内容