为什么编译器一直告诉我(永远)重新运行,因为标签已经改变?

为什么编译器一直告诉我(永远)重新运行,因为标签已经改变?

我有一篇 LaTeX 论文(多文件设置,使用\input{}语句),从几天前开始,每次编译时都会告诉我(使用pdflatexlatex):

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

即使重新编译十次也无法修复它。不过,论文中的所有参考资料似乎都没有问题(不能 100% 确定,需要使用\refPDF 输出检查源代码中的每一个)。

这可能是因为我以某种方式放错了标签或引用。但如何找到它并解决问题?什么样的放错会导致此重复消息?

编辑:我已经将它追溯到acronym与使用结合的软件包问题\ac{}抽象定义文章(Elsevier 的 latex 课程,我使用的是最新版本,即 2009-09-17 的 1.20b)文档。下面是出现问题的最小复制/粘贴示例:

\documentclass[final,5p, times,twocolumn]{elsarticle}
%\documentclass{article} --> no problem when using this one (and removing frontmatter)
\usepackage[nolist]{acronym}

\begin{document}
    \begin{frontmatter}
        \begin{abstract}
                This is just a sentence with an acronym in it: \ac{ICT}.
        \end{abstract}
    \end{frontmatter}

    \acrodef{ICT}{Information and Communication Technologies}
\end{document} 

我不清楚这是由于首字母缩略词包或 elsarticle 中的错误造成的。

答案1

这实际上是与命令的不良交互\twocolumn,因此这是一个比类更普遍的问题elsarticle。以下是触发错误的一个最小示例:

\documentclass[twocolumn]{article}
\usepackage[nolist]{acronym}

\begin{document}
\twocolumn[Heading with acronym \ac{ICT}]{
Some text.}

\acrodef{ICT}{Information and Communication Technologies}
\end{document} 

正如@Jouhn Collins 注意到的,该.aux文件现在\reset@new@label放置得太晚了:

\relax 
\undonewlabel{acro:ICT}
\newlabel{acro:ICT}{{}{1}}
\acronymused{ICT}
\reset@newl@bel
\newacro{ICT}[ICT]{Information and Communication Technologies}

一个解决方法是添加一个写入\reset@new@label文件的宏.aux。(我非常不愿意干预的定义\twocolumn。现在尝试这样做\begin{document}已经太晚了。)下面是这样的修复,首先是最小的例子:

\documentclass[twocolumn]{article}
\usepackage[nolist]{acronym}

\makeatletter
\newcommand{\extraclearlabels}{\protected@write\@auxout{}{%
  \string\reset@newl@bel
}}
\makeatother

\begin{document}
\twocolumn[\extraclearlabels Heading with acronym \ac{ICT}]{
Some text.}

\acrodef{ICT}{Information and Communication Technologies}
\end{document}

原始示例如下:

示例输出

\documentclass[final,5p,times,twocolumn]{elsarticle}
\usepackage[nolist]{acronym}
\makeatletter
\newcommand{\extraclearlabels}{\protected@write\@auxout{}{%
  \string\reset@newl@bel
}}
\makeatother

\begin{document}

\begin{frontmatter}
  \begin{abstract}
    \extraclearlabels
    This is just a sentence with an acronym in it: \ac{ICT}.
  \end{abstract}
\end{frontmatter}

In text acronym \ac{ICT}.

\acrodef{ICT}{Information and Communication Technologies}
\end{document}

相关内容