![加快 beamer 编译时间](https://linux22.com/image/240223/%E5%8A%A0%E5%BF%AB%20beamer%20%E7%BC%96%E8%AF%91%E6%97%B6%E9%97%B4.png)
有没有办法加快编译时间?我有一个中等大小的演示文稿,编译需要 10 多秒。虽然不是很多,但很烦人。特别是因为我在编译之间执行了微小的本地更改。有没有办法告诉 beamer 只编译更改的部分?
我的手动解决方案是将演示文稿的各个部分移到另一个文件中,注释掉\include
并在最后放回。例如:
...
\begin{document}
%\include{Section-1-done}
%\include{Section-2-done}
\include{Section-3-in-progress}
...
答案1
beamer 用户指南(texdoc beamer
在 Unix 系统上)的第 4.3.3 节称为“提高编译速度的方法”。那里有两个建议:使用draft
class 选项和使用命令\includeonlyframes{list,of,frames,to,process}
。这意味着只有标签与列表中的标签匹配的帧才会获得进程。建议是,在处理不同的帧时,\includeonlyframes{current}
将标签从一个帧移动到另一个帧。current
梅威瑟:
\documentclass{beamer}
\includeonlyframes{current}
\begin{document}
\begin{frame}[label=current]
This frame will be included.
\end{frame}
\begin{frame}
This frame will NOT be included.
\end{frame}
\end{document}
答案2
在他的回答中,Werner 提到,光是加载就beamer
需要花费大量时间。问题在于每次运行 TeX 时都必须重新处理所有定义。由于这个问题很常见,并且对于像 LaTeX 本身这样的大型宏集合尤其重要,因此 TeX 有一个机制来处理它。
TeX 定义了一个概念格式或格式文件,这是 TeX 在处理 TeX 输入时内部状态的紧凑转储。TeX 输入格式的速度比生成格式的宏集合快得多,因为 TeX 不必再次处理输入。这有点类似于解释程序和编译程序:每次运行解释程序时都必须解析程序的源代码,而编译程序可以直接加载和执行。
格式使用语法表示&fmtname
。例如,LaTeX 格式名为&latex
。编译 LaTeX 文档时,首先实际加载的是格式本身。您可以通过在 TeX 的命令行上指定来显式加载它:
tex "&latex" latex-test.tex
每个引擎的格式不同,所以实际上也有&pdflatex
、&xelatex
等&lualatex
格式。
现在让我们回到beamer
。可以创建一个包含 LaTeX 定义和beamer
定义的格式。我们将使用mylatexformat
包(请务必阅读其文档以获取更多信息!)。
mybeamer.tex
创建一个包含以下内容的文件:
\documentclass{beamer}
\begin{document}
\end{document}
您还可以使用经常使用的包和/或代码来扩展序言。
然后执行此命令(如果使用 XeTeX 或 LuaTeX,则更改名称):
pdftex -ini -jobname="mybeamer" "&pdflatex" mylatexformat.ltx mybeamer.tex
创建一个文件mybeamer.fmt
,这是我们的新格式。要加载格式,请使用上面提到的命令行语法或在源文件中指定它:
%&mybeamer
\begin{document}
Your presentation here…
\end{document}
在我的计算机上进行的测试表明,mybeamer.tex
使用 pdfTeX 处理文档大约需要 340 毫秒,而使用新格式的文档仅需 109 毫秒。这大约是速度快三倍!
答案3
如果您希望将编译限制在单个框架内,那么 Andrew 的“移动标签”方法效果最佳,但是如果您处理多个框架(例如,较大讲座的完整(子)部分)或将框架标签用于不同目的(交叉引用\againframe
),则可能会变得非常不方便。
另一个(干扰较少的)选项是使用comment
包。这个包基本上为您提供了一个comment
环境,使 LaTeX 忽略\begin{comment}
和\end{comment}
行之间的所有内容。所以我通常会\begin{comment}
在标题幻灯片和移动\end{comment}
行之后得到一个;在极少数情况下(在非常大的讲座中间工作),我需要两个comment
环境。
答案4
由于这是一个很受欢迎的问题,我想补充另一条建议,我怀疑这条建议可能与原始提问者没有直接关系(基于问题的表述方式),但对于其他正在研究这个问题的人来说可能有用。
我将讲座演示文稿保存为单个文件。这样可以更轻松地保持讲座风格的一致性,并从一个讲座剪切粘贴到另一个讲座。但 30 个讲座的顺序可能是一个大文件(约 400Kb)。使用该\lecture
命令实际上没有帮助,因为其他讲座仍会得到处理,只是没有排版。
每堂讲座都以以下内容开始:
\mode
<all>
\lecture{Lecture title}{date}
然后我(在样式文件中)有以下命令:
\g@addbefore@macro\beamer@atbeginlecture{
\lecturemode
}
其中\lecturemode
定义为:
\newcommand{\lecturemode}{%
\ifbeamer@inlecture
\else
\expandafter\mode\expandafter<\expandafter n\expandafter o\expandafter n\expandafter e\expandafter >\fi
}
(这可能更简洁一些;这是我在开始在这里闲逛之前写的。)
重点是,如果我们不在当前讲座中(如 所指定\ifbeamer@inlecture
),那么我们将进入“吞噬”。我们继续吞噬,直到我们到达下一个讲座的开头,此时\mode<all>
恢复正常操作。我们读取下一个讲座的名称,测试它是否是我们应该排版的讲座,如果不是,我们继续吞噬。这确保我们完全跳过所有不必要的讲座,同时保持讲座数量的正确计数。
这对单身的演示,我从问题中推断出这是提问者的特殊情况,但可能对其他希望加快投影仪速度并将其用于单个文件中的多个讲座的人有用。