未清理的 .aux 文件会导致“扫描 \@newl@bel 的使用时文件结束”错误。为什么不清除它?

未清理的 .aux 文件会导致“扫描 \@newl@bel 的使用时文件结束”错误。为什么不清除它?

我正在使用 TeXShop (MacTex2013 发行版) 开发 TeX Live 2013

预期行为是,如果在编译过程中发生错误,则清除 .aux 文件。因此,后续编译必须进行两次,才能获得正确的引用。

在以下“最小”示例中,这种情况不会发生。.aux 文件仍保留一半,导致“扫描 \@newl@bel 的使用时文件结束”错误。

即使很小的更改也会导致 .aux 文件被正确清除。例如:

  • 标题或说明文字的更改。甚至将 Ü 更改为“U”。
  • 在任何地方省略 \label{...}。
  • 在任何地方省略 \cite{...}(提供 .bib 资源没有效果)。
  • 不使用 biblatex 或 hyperref。
  • 更改分页符。

这是自包含的文件。

\documentclass{article}


\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
%\usepackage[T1]{fontenc}


\usepackage{biblatex}

\usepackage{hyperref}


% ================================================

\begin{document}

\clearpage

\section{Geomaxrie der ganzzahligen linearen Optimierung}

\label{Sec.Einfuhrung}

. [figure]

\begin{figure}
\caption{Caption}
\label{Fig.Beispiel-ILP}
\end{figure}

\section{Gitterbasisreduktion und Voronoi Algorithmus}
\label{Sec.Voronoi}

.

.

.

.

.

.

.

.

.

.

cite\cite{Voronoi}

.

.

.

label\label{Thm.Voronoi}

.

.


label\label{Alg.VoronoiFilter}

.

.

label\label{Alg.VoronoiFilter.Bedingung}

.

.

.

.

.

.

.

.

.

label\label{Alg.CVPP}

.

.

.

.

.

.

.

label\label{Alg.VoronoiRelevant}

.

.

.

.

.

.

.

label\label{Alg.Voronoi}

.

\clearpage
\section{Ellipsoid-Überdeckungen und M-Ellipsoide}
\label{Sec.Ellipsoid-Methode.M-Ellipsoide}

. [figure]

\begin{figure}
.
\caption{Löwner-John-Ellipsoid mit Anwendung in der Ellipsoid Methode}
\label{Fig.MinEllipsoid}
\end{figure}

.

.

label\label{Thm.InertEllipsoid}

label\label{Thm.MEllipsoid}

.

.

. [figure]

\begin{figure}
\caption{Label}
\label{Fig.M-Ellipsoidoo}
\end{figure}

label\label{Alg.ConvexBodyEnumerationInformal}

.

.

\clearpage
\section{Berechnungsmodell}
\label{Sec.Berechnungsmodell}

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

cite\cite{M-Ellipsoid}

.

.

.

.

.

.

.

.

.

.

.

.

.

.


label\label{Def.SEP}

.

.

.

.

\section{M-Ellipsoid Algorithmen}

.

label\label{Theorem}

Cause error here: $

A simple error at this point results in the .aux file not being cleaned. Even marginal changes in the document above make the effect disappear


\end{document}

要重现该错误,请执行以下操作:

  1. 观察文档末尾的单个 $ 导致错误
  2. 编译(.aux 仍处于不干净状态)
  3. 更正错误
  4. 再次编译(.aux 写了一半导致错误)
  5. 删除 .aux 文件进行恢复

我知道会发生什么以及如何恢复。我的问题是:

为什么会发生这种情况?

或更好

有没有什么办法可以预防呢?


在我当前的文档中,对于我在最后一节写作时犯的每个错误,我都必须手动删除 .aux 文件才能恢复。由于我在写作时经常进行编译,所以这很烦人,我想避免这种情况。

据我所知,.aux 文件的输出是缓冲的。如果出现错误,编译将停止,当前缓冲区仍未写入。此时,.aux 文件包含已写入的缓冲区块,这些块可能会在任何地方中断,从而留下不完整的定义。

通常我不会在控制台上使用 TeX 引擎,而只是纠正错误并重新启动。

我不明白是什么触发了 .aux 文件的删除,正如示例所示,它无法可靠地工作。可能是由于 biblatex 或 hyperref 包。你能解释一下吗?

其他值得关注的:

  • 有什么可以控制错误发生后 .aux 文件的删除吗?
  • 是否有 TeX/LaTeX 命令可用于手动刷新 .aux 文件的输出缓冲区?我可以在处理的部分之前使用此命令。这样,我可能就不必再经常处理损坏的 .aux 文件了。
  • pdflatex 程序是否有一个选项,以便在发生错误后刷新输出缓冲区。在大多数情况下,错误不会影响 .aux 文件,因此没有理由不完成写入。如果确实如此,那么我必须将其删除。

StackExchange 上有几个相关问题:

答案1

在...的帮助下aux文件什么时候被读写?以及 Barbara Beetons 的热情帮助,我能够确定出了什么问题以及如何防止它。

这就是问题:

通常我不会在控制台上使用 TeX 引擎,而只是纠正错误并重新启动。

这是我应该在控制台上做的事情:

  • 输入?+Return来了解可以做什么。
  • 只需反复击打,Return直到 Tex 完成即可。
  • 输入X+Return立即完成运行。
  • 键入E+Return让光标跳转到发生错误的位置。

实际情况是,TeX 分两个阶段缓冲 \write 命令到 .aux 文件。第一阶段,它等待页面发送出去以获取正确的页码。第二阶段,它等待直到它认为合适时发出write()系统调用,以减少(可能很慢的)系统调用的数量。第二个缓冲区似乎并不关心它写入文件的块是否是自包含的合法 TeX,因为它无论如何都会在 TeX 运行完成之前完成文件。

然而,在 TeXShop 环境中,发生错误后,很容易让 TeX 挂起而未完成。因此,第二个输出缓冲区未刷新,.aux 文件可能处于未完成状态并处于非法状态。

我个人的结论是:总是让 TeX 完成。


在窗口环境之前,TeX 在因错误停止后将有机会完成运行的假设是非常合理的,在窗口环境之前,将进程挂在后台变得很容易和正常。

在软件方面可以采取以下措施来促进这种用户行为:

  • 更改 Tex 的第二个缓冲区行为,以便write()在发生错误时发出系统调用或仅分解为 TeX 合法的块。
  • 调整环境(TexShop)以在进程中止后清理.aux 文件或提供默认输入以始终正确完成进程。

除了始终让 TeX 完成之外,用户还可以执行以下操作:

  • 使用\include{...}。这样,在发生错误时,之前部分的 .aux 文件就会关闭并完成。可能当前部分的 .aux 文件还不够大,并且没有写入 TeX 非法部分。
  • 对涉及的内容进行破解\immediate\closeout\@mainaux,然后\openout\@mainaux复制内容,这样它们就不会被覆盖。这将有效地刷新输出缓冲区。不过似乎不值得付出努力。

答案2

我刚刚遇到了同样的问题,在我的 tex 文件中找不到任何有问题的代码。结果发现有问题的文本实际上是我刚刚添加到 BibText 的引文,我正在使用该biblatex包导入它。当我从 PubMed 导出引文时,摘要中一定有一些奇怪的字符。我删除了整个摘要(因为它无论如何都不会显示在参考文献中),删除了临时文件,并重建了我的 PDF,没有错误。

答案3

我发现终止编译并直接删除损坏文件的最后一行.aux(其中截断的缓冲区写入导致不完整/非法的 TeX)要快得多,特别是在处理大型文档和/或调试持续/重复.aux损坏时。这样,您可以保留文件的有效部分.aux,而不必等待编译完成。

在大多数编辑器中,只需按几下键即可将焦点切换到文件.aux,跳到末尾并删除最后一行,因此这可以很快完成。

如果您希望强制完成编译,以便\write刷新所有缓冲并且.aux不损坏,您可以指示编译器继续处理错误而不使用该-interaction=nonstopmode选项暂停用户输入,这样您就不必逐一按下键盘。

答案4

我在撰写论文时也遇到了同样的问题。请谨慎使用您可能从 Google Scholar 或一些综合文件中使用的参考资料,这些参考资料可能与您的 bib 包支持的格式不同。提供正确的参考资料可能会解决您的问题,因为我通过更正参考资料解决了这个问题。

相关内容