以前编译的垃圾会改变我的文档的最终外观吗

以前编译的垃圾会改变我的文档的最终外观吗

好吧,这个问题已经困扰我有一段时间了;上次运行 LaTeX 留下的垃圾会改变我的文档的外观吗?

以下步骤是否会给我带来不同的结果:

我编译我的文档直到它稳定(所有引用都已解决等)然后编辑我的文档并重新编译直到它稳定。

对阵

我编译我的文档直到它稳定(所有引用都已解析等),然后编辑我的文档。现在我删除了除 *.tex 和 *.bib 文件之外的所有内容,然后重新编译直到它稳定。

我可能只是因为习惯了旧文档中那些多余的单词才问这个问题,但这已经困扰我一段时间了。LaTeX 是否会将数学和诸如此类的东西保存在 *.aux 等文件中,并且它会不会因为保存了这些信息而得出不同的解决方案?

我只包含了编译,直到它稳定下来,因为我不想得到有关引用和其他问题的答案;我知道在任何情况下,如果你必须编译不止一次,如果你删除中间文件,你显然会得到不同的结果。我对最终文件感兴趣,因为我会和别人分享它。如果是这样的话,那么在与任何人分享我的文档之前,我应该小心地删除中间文件并重新编译。

答案1

如果您的编辑删除了软件包,那么这可能会删除文件中仍然存在的内容的定义auxhyperrefbabel是两个值得注意的例子。在这种情况下,您会得到一个错误aux在开始文档处读取文件时。

aux如果您读取了上次运行后源文件已更改的文件,则完全可以编写不会出错的命令,而只是稳定到不正确的点。的早期版本longtable会这样做,这就是为什么默认情况下longtable不会尝试对齐其部分并稳定,您必须\setlongtables在完成编辑后明确添加。longtable v4引入了一种更谨慎的算法,该算法在内部保护自己免受对表的编辑,因此aux即使文件已被编辑,也可以安全地加载上次运行的文件。(这是 David Kastrup 的功劳)

答案2

我尝试通过例子来解释:

包裹babel

通常,软件包会针对每种指定的语言babel写入\select@language辅助文件(目录等)。然后,如果某种语言被删除或更改,则babel在下次运行 LaTeX 时会发出警告:

! Package babel Error: You haven't loaded the option ... yet.

包裹nameref/hyperref

有些软件包会更改内部命令,例如nameref/hyperref会向文件内部标签命令.aux和目录条目添加附加参数。再次运行没有该软件包的程序可能会导致错误(尽管这些软件包可以捕获一些常见情况)。

在辅助文件中封装宏

软件包可以提供放入辅助文件 ( .aux.toc、…) 中的宏。删除软件包可能会导致辅助文件中出现未定义的宏。

如果包在辅助文件中添加了“顶级”宏,我建议包\providecommand在文件开头添加一个语句.aux,以避免在包不再使用时出现麻烦。例如,zref使用\zref@newlabel作为其标签并在文件开头添加一个虚拟定义.aux

\providecommand\zref@newlabel[2]{}

但是,如果一个包定义了许多宏(字体包,...),这些宏可能会出现在辅助文件中的文本参数(例如,章节标题,...)中,那么这个技巧就是无望的(太多宏)。

环境filecontents

filecontents除非加载了包,否则 LaTeX 的filecontents环境不会覆盖文件。因此,如果 TeX 文件写入某些内容并重新读取以进行排版,则如果源文件中的行filecontents发生更改,则会得到不同的结果。因为在下次运行 LaTeX 之前如果不删除,则会使用旧版本。

概括

假设您始终拥有一个有效的 TeX 文件,该文件从头开始编译正确,并不意味着如果存在剩余的辅助文件,它就能成功或正确运行。可能会出现错误。或者,即使 LaTeX 运行时没有错误或警告,结果也可能是错误的。

但是,从头开始重新编译直到稳定需要更多的时间,因此处理剩余的辅助文件可以节省时间。

另一方面,如果需要更可靠、更可重复的结果,则应该清理辅助文件。

相关内容