我收到以下警告:
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
问题是,重新运行(无论多少次)后它不会消失。
有问题的文档长达 200 多页,包含大约 30 个包,因此我实在无法提供一个最小示例。但我对自己的代码非常了解。如果我对这个问题了解更多,我可能就能修复它。所以我想问一些一般性问题:
- 那么,“标签改变;重新运行”机制究竟是如何工作的呢?
- 是否存在造成这一问题的共同元凶?
- 人们通常如何诊断它?
我读过以下问题:
但我没有使用elsarticle
或acronym
包,所以接受的答案不适用于我。
更多信息:根据建议,我做了一种“注释掉”的二分查找。(顺便说一句,如果 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
但是为什么这个包会导致出现“标签更改警告”消息呢?