为什么我的 Latex 编译时间差异很大?

为什么我的 Latex 编译时间差异很大?

我已经使用 Latex 好几年了,但最近我发现编译时间变化非常大。

例如:我目前正在处理一个约 15 页的文档,其中包含约 10 个高质量 eps/pdf 图表和一个 bibtex 参考书目。我发现几天内它会在约 30 秒内编译所有内容。然后我在正文中替换一个单词,编译需要一个多小时,日志中没有新消息。再处理几天后,它又回到了 30 秒。以前在小得多的文档中也发生过这种情况。

清除辅助文件对此没有影响:如果编译得很快,它就会继续快速编译;如果编译得慢,则会继续缓慢编译。

作为参考,我在 Mac OSX 10.9.2 上使用 pdfTeX 3.1415926-2.5-1.40.14 (TeX Live 2013)。我没有包含任何示例代码,因为这种情况发生在如此大量的文档和样式文件中:我找不到一个罪魁祸首。

有人见过或听说过这样的事吗?我在网上没找到任何相关信息。

编辑:感谢@Heiko,我已将问题追溯到浮点位置。但是,我仍然不知道为什么会出现这样的问题。特别是,如果我尝试在运行 Linux 的计算机上编译文档,则每次编译同一文档大约需要 2 秒。那么为什么浮点会在 Max OSX 上引起这样的问题呢?

答案1

调试该问题有几种方法。首先应该确定导致长延迟的代码部分。

  • 可以将标记放入日志(控制台和/或.log文件的缩写),示例如下。这应该有助于识别在合理时间内编译的部分和未编译的部分。

  • 有许多\tracing...命令可以激活。例如,如果设置了,TeX 会将其宏扩展写入日志\tracingmacros=1。我建议将此类跟踪命令的范围限制在尽可能接近有问题的代码的范围。否则文件.log很快就会变得非常大。

  • 生成最小工作示例(MWE)也非常有用,因为它减少了代码的深入分析。

使用 pdfTeX 的时间标记示例\pdfelapsedtime

% \marker[annotation text]
\makeatletter
\newcommand*{\marker}[1][]{%
  \begingroup
    \edef\x{\the\pdfelapsedtime}%
    \count@\x\relax
    \divide\count@\p@
    \edef\s{\the\count@}%
    \count@\s\relax
    \divide\count@ 60 %
    \edef\m{\the\count@}%
    \count@\m\relax
    \divide\count@ 60 %
    \edef\h{\the\count@}%
    \edef\s{\the\numexpr\x-65536*60*\m}%
    \dimen@\s sp %
    \edef\s{\ifdim\dimen@<10pt 0\fi\strip@pt\dimen@}%
    \edef\m{\the\numexpr\m-60*\h}%
    \edef\m{\ifnum\m<10 0\fi\m}%
    \edef\timestamp{\h:\m:\s}%
    \immediate\write16{%
      [\timestamp] #1%
    }%
  \endgroup
}
\makeatother

\marker[before document]
\documentclass{article}
\marker[after document]
\usepackage{tikz}
\marker[before begin document]
\begin{document}
\marker[after begin document]
\section{Hello World}
\marker[before end document]
\end{document}

示例输出:

[0:00:00.02332] before document
[0:00:00.02853] after document
[0:00:00.1714] before begin document
[0:00:00.1877] after begin document
[0:00:00.18898] before end document

相关内容