原 文:Why do I keep getting the compile timeout error message?
译 者:Xovee
翻译时间:2020年5月21日
为什么我在 Overleaf 上一直遇到编译超时错误信息?
Compile timeout,也就是编译超时,意味着编译你的文档花费了过长的时间来生成 PDF 文件。本篇博文将会解释这个问题为什么会发生,以及如何解决这个问题。
文章目录
过大的高清晰度图片
如果你的文档中包含许多高清晰度的 PNG 或 JPEG 图片,那么 LaTeX \LaTeX LATEX 在每次编译文档的时候将会调整它们的大小,这个过程可能会花费很长的时间。下面是一些解决的建议:
- 对于各种示意图和数据图,请使用 PDF 文件,而不是 PNG 文件。如果你的制图软件可以导出文件为 PDF 格式,那么编译的速度将会大大提升(显示效果也会更好)。你也可以将 PNG 文件转换为 PDF 文件来加快编译速度。
- 使用草稿模式,点击 Recompile 按钮旁边的倒三角箭头,然后选择 Fast (draft) 选项。这个选项将会把你的所有图片都替换为空白的矩形,从而使编译速度大大加快。
- 在这个在线版本的文档中使用低质量的图片。
更多有关于解决过大图片的详细的建议,请参考这篇文章。
过于复杂的 TikZ 或 pgfplots 图片
TikZ 和 pgfplots 会生成非常漂亮的图片,但是它们会花费非常多的时间来编译。你可以使用很多方法来处理 TikZ 图片,使得 LaTeX \LaTeX LATEX 不需要在每次生成新的 PDF 文件时都要再编译它们一次。
mhchem
最近版本的mhchem
包会花费很长的时间来编译。取决于你的用法,chemformula
包可能会编译的更快。如果你已经在使用mhchem
了,你可以试试用一下chemformula
包:
% \usepackage{mhchem}
\usepackage{chemformula}
\let\ce\ch
因为这两种包之间有着些许不同的语法和功能差异,这个办法不一定都行得通。例如,\ce{2H2O}
在mhchem
中表现正常,而在chemformula
中你需要在第一个2
后面添加一个空格:\ch{2 H2O}
。
biblatex
如果你的项目很旧,并且使用着 TeX Live 2017 来编译图片,你的 项目很可能在使用 biblatex v3.7。这个版本的 biblatex 非常的慢,特别在当你使用了那些需要跟踪引用的出现次数的功能的时候,例如,authoryear-comp、authoryear-icomp、APA 等。你可以复制你的这个项目,让其使用新的 TeX Live 版本,例如 2018 版本的 TeX Live 使用了 v3.12 版本的 biblatex,其编译速度非常的快。
如果你实在要继续使用 TeX Live 2017 版本来编译你的项目,而又想避免慢的 biblatex v3.7,你也许可以试一试使用一种非跟踪的样式来在线编译,例如,authoryear,或者使用 BibTeX。instead.
跟踪、调试调用
如果你在你的文档中使用了\tracingall
(也许是从某个模版文件或者本地项目中引入的),它会在日志文件中记录非常多非常多的信息(很可能超过了几百MB)以及可能丝毫没有停止的迹象。移除\tracingall
调用,或者使用trace
包。
无限循环
LaTeX 在输出 PDF 文件的时候有可能陷入一个无限循环,不管你等待多长时间,它永远不会停止。无限循环一般是由第三方包中的 bug,或者是由用户自定义的指令所导致的,例如,当一个指令调用它自己的时候(一种被称为递归的过程)。所以你需要检查那些可能导致无限循环的 bug,例如 \newcommand{\foo}{\foo}
。
致命的编译错误
不幸的是,有些 LaTeX 编译错误会完全阻碍 latexmk 的构建过程,从而导致编译超时。为了调试这些错误,有时候你需要在项目中添加一个名为 latexmkrc 的文件,在文件的首部,添加如下行:
$pdflatex = 'pdflatex --halt-on-error %O %S';
这个操作将会让编译器在遇到最初几个编译错误的时候就停止运行(尽管还没有生成任何输出预览)。然后你就可以调试你所遇到的错误,直到项目不再包含任何错误;之后你就可以删除 latexmkrc 文件。(如果你仍旧遇到了超时问题,那么可能的原因应该是之前几个章节所讨论过的错误。)
下面是一些经常出现的阻塞编译器运行的错误:
\caption{}
应当一直出现在tabular
环境之外;不然它可能会造成致命的错误(当caption
包被加载的时候)。(但是longtable
确实要求\caption{}
在其内部。)\caption{}
不应该包含任何\\
、\newline
、centering
、raggedright
等。- 在某些模版或者包中,有着
\caption
的\ref{...}
或者\cite{...}
应当在其之前添加\protect
指令来避免致命的错误。 - 相似地,如果你使用
soul
或者changes
包来高亮文字或者删除文字,\cite
或\ref
也许需要\protect
命令出现在它们前面。 - 检查
tabular
环境中的不完整的\cmidrue{...}
命令;它要求一定范围内的表格的列,所以你需要把\cmidrule{3}
改写为\cmidrule{3-3}
来添加一个一列宽的水平线。 - 避免嵌套的
tabular
环境。如果你想要在一个表格项中换行,你可以使用makecell
;你还可以使用p{...}
列类型,或者tabularx
包,来创建一个自动换行的列。(一般来说,在创建表格的时候要非常小心。) \author{...}
中不应当包含任何空白行。- 在
tikzpictures
中,在 path/node 指令的末尾缺失;
,或者在参数列表的末尾缺失]
breqn
包的 dmath 环境有可能陷入无限循环;使用align
环境,并且在必要的情况下手动调整换行。flushend
包可能造成无限循环。这一般发生在,当最后一页只包含一点点文字的时候来让flushend
算法执行。因为这个原因,flushend
包在 ACM 的模版中被移除了。
当你仍在书写手稿的时候,你可以暂时去除flushend
包。当你完成之后,你可以再添加flushend
包,来看看情况有没有变好。如果还是不行的话,你可以考虑使用balance
包。
\usepackage{balance}
%% don't load flushend
\begin{document}
.... (somewhere in the left column of the last page)
\balance
- 当你有着过多的图片或者表格使用了
[H]
布局标识符,它可能会导致 LaTeX 陷入无限循环(为了找到合适的位置来放置所有的图片/表格)。考虑将[H]
替换为[hbt!]
,并且在有必要的情况下,使用\clearpage
命令,在插入一个分页之前清理队列中所有的表格和图片, - 有些
babel
语言选项可能会改变某些字符的含义,当这些字符在它们“正常的环境”中使用的时候,例如在数学模式下,这可能造成更多的问题。试着在加载babel
的时候添加shorthands=off
选项来停止这个行为。
合理使用限制
如果你确实有着一个非常非常大的文档,它确实可能需要花费很长的时间来编译。我们在付费订阅的计划中提供了更长时间的编译时间:
Free | Student, Collaborator, Pro | |
---|---|---|
超时 | 1 分钟 | 4 分钟 |
Overleaf 需要设置编译超时错误来避免无限循环,并且确保这一点对于我们的所有用户都是公平的。
问题还没有解决?
如果你仍旧有着无法解决的编译超时错误,请联系我们,我们将会帮助你。