[翻译] 为什么我在 Overleaf 上一直遇到编译超时错误信息?Compile Timeout Error Message in Overleaf

142 篇文章 4 订阅
27 篇文章 8 订阅

原  文: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{}不应该包含任何 \\\newlinecenteringraggedright等。
  • 在某些模版或者包中,有着\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选项来停止这个行为。

合理使用限制

如果你确实有着一个非常非常大的文档,它确实可能需要花费很长的时间来编译。我们在付费订阅的计划中提供了更长时间的编译时间:

FreeStudent, Collaborator, Pro
超时1 分钟4 分钟

Overleaf 需要设置编译超时错误来避免无限循环,并且确保这一点对于我们的所有用户都是公平的。

问题还没有解决?

如果你仍旧有着无法解决的编译超时错误,请联系我们,我们将会帮助你。

  • 18
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值