前言

众所周知,在使用Overleaf编写LaTeX的时候,免费版的编译速度和时间限制非常让人不爽,如果想用Beamer做PPT做不了两页就会出现超时,那么有没有办法能够优雅地编写超长文本呢?

答案是有的,本文提供一种通过分段的方式实现分块编译,并且每次可以只编译你正在写的部分,节约免费编译时间提高编译速度的方法。

LaTeX分段编译API简介

最简单的LaTeX分段编译API就是 \include{xxx.tex}\input{xxx.tex} 这两个命令,他们的区别引用一段GPT4 的回答:

在 LaTeX 中,\include{}\input{}\includeonly{} 是用来管理和组织大型文档的三个非常有用的命令。它们各自有不同的特点和用途:

  1. \input{filename}

    • 用途: \input{} 命令用于将指定文件的内容在当前位置直接插入。它适合用于引入格式设置、自定义命令、较短的文本片段等。
    • 特点: \input{} 不会启动新的一页,它就像是把被引入文件的内容直接复制到 \input{} 命令的位置一样。你可以在文档的任何地方使用 \input{},包括序言中。
  2. \include{filename}

    • 用途: \include{} 命令主要用于引入较大的文档分块,如章节。它非常适用于书籍和报告等大型文档的章节管理。
    • 特点: 每次使用 \include{} 时,LaTeX 都会在新的一页开始插入指定文件的内容,这是它与 \input{} 的主要区别。另外,\include{} 还可以与 \includeonly{} 配合使用,这对于大型文档的编译非常有帮助,因为它允许你仅编译文档中的特定部分。
  3. \includeonly{filename1,filename2,...}

    • 用途: \includeonly{} 命令用于指定在当前的编译过程中只编译 \include{} 命令引用的某些文件。这在编辑长文档时非常有用,可以显著减少编译时间,尤其是当你只需要关注文档的一部分时。
    • 特点: \includeonly{} 需要放在序言区(\begin{document} 之前)。它不会影响其他 \include{} 命令的内容包含,但只有列在 \includeonly{} 中的文件会被重新编译。其他不在列表中的 \include{} 引入的文件将被忽略,但它们之前编译的内容(如页码和交叉引用)仍然会被保留。

使用这些命令可以有效地管理和控制大型文档的结构和编译过程,使得文档维护更加高效和简单。

需要注意的是,这里的 \input 的作用和 C 语言里面的 #include 是一样的,只是把你目标文件里面的内容复制过来,并不会触发分段编译,但是这个命令可以在\ \begin{document} 之前使用,便于引入一些文本的设置和宏包的导入

另外这两个命令如果引入的是 .tex 文件,是不需要带 .tex 后缀的。如果包含目录,用正斜线 \ 来表示


注意:在 Beamer 下面,如果要使用 lstlisting 环境展示代码,一定要把这一页标记为[fragile] 即:

1
2
\begin{frame}[fragile]{title}
\end{frame}

一套可行的分段编译LaTeX模板

本部分展示了一个可行的可以分段编译的LaTeX模板

项目结构

我的项目结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
|--chapters //这个文件夹下面放各个章节的内容
| |--chapter_1.tex
| |--chapter_2.tex
| |--chapter_3.tex
|--images //图片文件夹
| |--image.img
|--config.tex //这里放文本定义
|--xxx.sty //样式定义文件
|--main.tex //主文件
|--cover.tex // 制作封面页
|--refpage.txt // 制作引用页和致谢
|--ref.bib // 参考文献

config.tex 设置相关内容

在这个文件里面需要完成文档类别的定义和宏包的引入,如果你是在已有的项目上进行改进,可以直接把你的 \begin{document} 之前的部分 剪切 到这个文件里面,接下来给出我的 NJU beamerconfig.tex

注意在这个文件里面我们定义了 \makecover\makeref 两个命令,这两个命令分别用于生成封面和引用页,必须在 \begin{document}\end{document} 之间使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
\documentclass{beamer}
\usepackage{ctex, hyperref}%WSL不能用ctex
\usepackage[T1]{fontenc}

% other packages
\usepackage{latexsym,amsmath,xcolor,multicol,booktabs,calligra}
\usepackage{graphicx,pstricks,listings,stackengine}
\usepackage{multicol}

\title[title]
{title}
\subtitle{subtitle}
\author[name] % (optional, for multiple authors)
{name1 \and name2\inst{1}}
\institute[NJU] % (optional)
{
\inst{1}%
信息与计算科学\\\\
南京大学
\and
% \inst{2}%
% Faculty of Chemistry\\\\
% Very Famous University
}
\date[NJU 2024] % (optional)
{\today}
\usepackage{NJU}

% defs
\def\cmd#1{\texttt{\color{red}\footnotesize $\backslash$#1}}
\def\env#1{\texttt{\color{blue}\footnotesize #1}}
\definecolor{deepblue}{rgb}{0,0,0.5}
\definecolor{deepred}{rgb}{0.6,0,0}
\definecolor{deepgreen}{rgb}{0,0.5,0}
\definecolor{halfgray}{gray}{0.55}

\lstset{
basicstyle=\ttfamily\small,
keywordstyle=\bfseries\color{deepblue},
emphstyle=\ttfamily\color{deepred}, % Custom highlighting style
stringstyle=\color{deepgreen},
numbers=left,
numberstyle=\small\color{halfgray},
rulesepcolor=\color{red!20!green!20!blue!20},
frame=shadowbox,
}

\renewcommand{\familydefault}{\rmdefault} %可选择\rmdefault \sfdefault \ttdefault 分别是罗马字体,sans-serif字体和等宽字体 \familydefault是默认字体
\newcommand{\makecover}{\input{cover}}
\newcommand{\makeref}{\input{refpage}}

这样就可以了

cover.tex 模板

标题文件可以这么写:

1
2
3
4
5
6
7
8
\begin{frame}
\titlepage
\begin{figure}[htpb]
\begin{center}
\includegraphics[width=0.2\linewidth]{pic/NJU_Logo.eps}
\end{center}
\end{figure}
\end{frame}

里面的图标可以自己换

refpage.tex 模板

引用页和致谢页如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\section{参考文献}

\begin{frame}[allowframebreaks]
\bibliography{ref}
\bibliographystyle{alpha}
% 如果参考文献太多的话,可以像下面这样调整字体:
% \tiny\bibliographystyle{alpha}
\end{frame}

\begin{frame}
\begin{center}
{\Huge\calligra Thanks!}\cite{origin}
\end{center}
\end{frame}

main.tex 的模板

main.tex 的开头就需要定义这个是主文件,加上一句话

1
\def\allfiles{}

就可以了。

不要忘记引入文档设置

1
\input{config}

总结一下主文件应该长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%% ---DO NOT MODIFY BEGIN---
\def\allfiles{}
\input{config}
\begin{document}
%% ---DO NOT MODIFY END---


%设置封面
\makecover
\include{chapters/chapter1}

%% ---DO NOT MODIFY BEGIN---
%引入参考文献
\makeref
\end{document}
%% ---DO NOT MODIFY END---

就可以了

各个chapter的设置

接下来就是分章节书写了,每个章节应该是一个独立的 chapter_xxx.tex,这个 chapter_xxx.tex 的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%% ---DO NOT MODIFY BEGIN---
\ifx\allfiles\undefined
\input{config}
\begin{document}
% \makecover
\else
\fi
%% ---DO NOT MODIFY END---


\section{xxx}
\begin{frame}{xxx}
章节xxx的内容
\end{frame}


%% ---DO NOT MODIFY BEGIN---
\ifx\allfiles\undefined
\makeref
\end{document}
\fi
%% ---DO NOT MODIFY END---

这样就可以了

如何编译

本部分主要介绍如何使用上面的方法编译出你需要的部分

编译完整文档

如果你正确书写了开头和结尾,那么你是可以直接在Overleaf里面选择编译文件 main.tex 直接得到完整的文档的,如果出错看看是不是改了不应该修改的部分

如果你发现编译还是超时了,可以考虑在Overleaf上面只分章节编译,到最后需要出成品的时候把整个项目下载到本地,用本地的套件编译

编译特定章节

如果你只想编译某个章节,比如说 chapter_1 ,那么你可以在左边的目标文件里面选择 chapters/chapter1.tex 然后点击重新编译,就可以只编译这个章节了