LaTeX 学习记录(2):编写文档

这回我们来看看如何用 $\LaTeX$ 编写文档。

上回在介绍 $\LaTeX$ 的 安装与配置 后给出了一个最小的示例,给出了比较详细的注释,我们就从这个示例开始。

tex

% HelloWorld.tex
% Encoding: UTF-8

% ========================================================
% 🎆🎆🎆🎆🎆             导言区             🎆🎆🎆🎆🎆
% ========================================================
\documentclass{article}         % 业界习惯:百分号是注释开始的标志

\title{Greetings}               % 不服就试:注释是不会进入正文的哟
\author{SpringMan}              % 凑个对齐:在注释里可以任意地耍赖
\date{\today}                   % 如你所见:导言区就是进行“某些”设置的


% ========================================================
% 🎆🎆🎆🎆🎆             正文区             🎆🎆🎆🎆🎆
% ========================================================

\begin{document}                % 可想而知:正文从这里开始
    \maketitle                  % 显而易见:这个命令用来产生标题

    Hello World !               % 打个招呼:你好世界
\end{document}                  % 不难预料:正文在这里结束

首先注意到, % 后面的文字颜色与其他部分不一样,这是因为 % 是注释符号,像很多其他编程语言一样,注释的内容仅为了分割源码一起为源码的功能写备注所用,注释的内容并不会对主程序产生影响。

根据注释信息,文档分为导言区和正文区。两者实际上是以 \begin{document} 为分割,在此之前的内容一般都是对文档的格式或属性进行声明,不会直接影响正文内容。正文区则以 \begin{document}\end{document} 包围,是文档的主要内容。

在语法高亮功能的辅助下,诸位应当能够看到各种以反斜线 \ 开头的词语呈现花花绿绿的颜色,这就是 $\LaTeX$ 的命令(也叫做宏),类比为其他编程中的函数。这些命令可以完成丰富的功能,如设置文档信息的 \title,在正文中生成标题的 \maketitle 等。本例中的命令顾名思义即可,并不复杂,其他命令及其使用将在后面详细介绍。

在导言区内,首先需要使用 \documentclass{} 声明文档类,这一步可以理解成为整个文档初始化,包括设置参数默认值(如行间距)、导入基本的命令。例如,在上面的例子中,article 是 $\LaTeX$ 最基础的文档类,其诞生时并没有考虑到多语言支持,若使用该文档类,正文区使用中文将出现与预期不符的结果。

可见,仅调用文档类并采用其提供的默认设置并不能解决编写文档的需求,这时候我们需要“扩展” $\LaTeX$ 的功能。只需要使用命令 \usepackage{} 调用宏包即可。例如,为了在 article 文档类中使用中文,只需要在导言区补充 \usepackage{ctex} 即可。

碎碎念1:实际上可以使用 CTeX 提供的 ctexart 文档类直接初始化中文支持,这也是最常用的方法。

碎碎念2:作为开源软件的优势,有很多优秀的宏包为 $\LaTeX$ 提供了相当高级的功能,例如自动将段落组织成爱心状以方便书写情书;但由开源导致的宏包的多样性会使得寻找期望的宏包需要时间和耐心。好在,常用的宏包并不多,以后会慢慢介绍。

除了声明文档类和调用宏包,导言区还可以定义命令和环境,定义命令的基本方法如下,中括号为可选内容

tex

\newcommand{<命令名>}[<参数个数>][<首参数默认值>]{<定义>}
\renewcommand{<命令名>}[<参数个数>][<首参数默认值>]{<定义>}

\newcommand 用于定义新的命令,通常用于偷懒,例如我通常用哥特字体 $\mathfrak{q}$ 来表示四元数,其命令 \mathfrak{q} 太麻烦了,就可以在导言区定义

tex

\newcommand{\q}{\mathfrak{q}}

这样就可以直接使用 \q 使用四元数了。

当使用 \newcommand 定义已经存在的命令时,会产生错误。此时需要 \renewcommand 重新定义命令,这往往用于格式的修改。

除了定义新的命令,导言区内还可以定义新的环境。作为快速入门的介绍,我不想展开太多,先不写了(偷懒)。

总而言之,导言区的作用就是对文档的格式进行设置:首先是声明文档类进行最基础的设置,然后调用宏包对设置进行更新或修改,必要时定义新的命令来辅助文档编写。

为了满足急不可耐的小伙伴好奇心,这里给出部分常用的宏包,有兴趣的可以在命令行采用 texdoc <宏包名> 查看帮助文档(没有什么比作者自己写的帮助文档更详细的了)

tex

% 某春雨在导言区常用的宏包
% 文档类使用 ctexart

% 基本格式设置
\usepackage{geometry}       % 页边距设置
\usepackage{fancyhdr}       % 页眉页脚设置
\usepackage{tocbibind}      % 目录包含目录/参考文献/附录
\usepackage{hyperref}       % 超链接

% 数学相关宏包
\usepackage{amsmath}        % 数学环境
\usepackage{amssymb}        % 数学符号
\usepackage{bm}             % 特殊符号加粗
\usepackage{newtxmath}      % Times数学字体

% 图表相关宏包
\usepackage{graphicx}       % 插图控制
\usepackage{tabularx}       % 定宽表格
\usepackage{booktabs}       % 标准三线表

% 其他常用宏包
\usepackage{siunitx}        % 国际单位
\usepackage{gbt7714}        % 标准参考文献引用

在正文区内,只需要按正常的思路编写文档即可。应当注意,$\LaTeX$ 源码内的换行不会引起编译后的文档新起一个段落,这与 Word 有所区别。通过空行(一行或多行)可以实现正文另起段落。

利用源代码换行的特性,我们可以一句一行以便修改,这取决于个人的习惯。需要提醒的一个技巧是利用换行和注释对文档进行修改,从而保留修改历史以方便对比,如

tex

% 正文区(原文)
为了说明源码换行不会引起正文换行,我决定先写一段没有什么实际意义的废话来凑一些字数,一方面要求字数充分多以突出行号,另一方面还是要求字数足够多以突出行号。大家可以看到,我的这一段文字前面只有一个行号,说明我在编写的时候并没有通过回车键进行换行,所看到的换行只是由于编辑器为了显示方便的自动换行,如果关闭自动换行的话就会看到超过屏幕的一长段话。这时候屏幕下面应该有个横向的滑块可以左右拖动。

% ========================================================

% 正文区(修改1:完全注释并重新编写)
% 为了说明源码换行不会引起正文换行,我决定先写一段没有什么实际意义的废话来凑一些字数,一方面要求字数充分多以突出行号,另一方面还是要求字数足够多以突出行号。大家可以看到,我的这一段文字前面只有一个行号,说明我在编写的时候并没有通过回车键进行换行,所看到的换行只是由于编辑器为了显示方便的自动换行,如果关闭自动换行的话就会看到超过屏幕的一长段话。这时候屏幕下面应该有个横向的滑块可以左右拖动。
% 【修改说明】我可以只加一个百分号就在原文删除一段废话,并且还可以用额外的注释给出修改说明

% ========================================================

% 正文区(修改2:通过换行部分注释并进行部分修改)
为了说明源码换行不会引起正文换行,我决定先写一段没有什么实际意义的废话来凑一些字数
% ,一方面要求字数充分多以突出行号,另一方面还是要求字数足够多以突出行号
% 【修改说明】我也可以换行注释后进行修改,这适合小补丁的修正
。大家可以看到,我的这一段文字前面只有一个行号,说明我在编写的时候并没有通过回车键进行换行,所看到的换行只是由于编辑器为了显示方便的自动换行,如果关闭自动换行的话就会看到超过屏幕的一长段话。这时候屏幕下面应该有个横向的滑块可以左右拖动。

从一般文档的结构来说,通常由目录、正文(分为节、子节等)、参考文献、附录等部分组成,在 Word 中可能需要进行非常麻烦的样式设定,而 $\LaTeX$ 通常只需要几条命令就可以实现(显然,这些命令都是在文档类或者宏包中由别人定义好了,必要时在导言区稍作修改即可),非常方便。

tex

% 正文区
% 文档前几页的必要信息
\pagenumbering{Roman}       % 目录部分页码通常是罗马数字
\tableofcontents            % 插入目录
\clearpage                  % 换页

\listoffigures              % 插入图片索引
\clearpage                  % 换页

\listoftables               % 插入表格索引
\clearpage                  % 换页

\pagenumbering{arabic}      % 正文页码通常是阿拉伯数字
\setcounter{page}{1}        % 正文页码重新开始于1 

% 真正的正文开始于此
\section{第一节}
此处省略若干字

\subsection{第一节第一小节} 
此处省略若干字

\subsection{第一节第二小节}
此处省略若干字

\section{第二节}
此处省略若干字

同样,正文区内包含其他丰富的技巧,一次性也不想写太多,给渴望学习的小伙伴透露一些常用命令。

功能 相关命令
插入脚注 \footnote{} 或成对使用 \footnotemark\footnotetext{}
行内数学 $ 括起 $\LaTeX$ 表达式
交叉引用 使用\label{}插入引用源,使用 \ref{} 引用编号或 \pageref{} 引用页码
插入图片 \includegraphics
插入表格 tabular 环境
添加列表 enumerateitemize 环境

作为好习惯的开始,希望大家能够在使用 $\LaTeX$ 的时候形成自己的文件管理风格,这可以利用 \include{}\input{} 命令完成:\include{} 命令将另一个 .tex 文档的内容复制到命令所在的位置,并利用 \clearpage 进行分页;\input{} 命令则相当于仅把目标文档复制到命令所在位置。

最后分享一下我目前的风格,文件结构如下

text

document
    ├── sections/
    ├── figures/
    ├── reference/
    ├── main.tex
    └── user_package.tex

为了写一个文档,首先我会新建一个文件夹以储存与该文档相关的所有素材,由于一般都会涉及很多图片,因此会新建 figures/ 文件夹;根据文档内容的多少以及涉及的参考文献数量,可分别建立 sections/reference/ 文件夹存放文档的各节以及相关参考文献题录,这样有利于大型文档的编写。

建立 main.tex 文件作为核心,在该文件中对文档进行拼接:在导言区对文档样式进行设置(页边距等),在正文区用 \tableofcontents 生成文档的相关信息,并利用 \include{}\input{} 命令插入正文,这样有利于文档结构的布置。

考虑到部分宏包以及自定义的命令与正文息息相关,将这些宏包的调用以及命令定义汇总在 user_package.tex 中,在 main.tex 中采用 \input{user_package.tex} 导入设置。这样做的原因是:正文的所有内容以及相关宏包都分离为单独文件,避免了更换模板时正文依赖宏包的缺失导致文档编译失败。

以此,main.tex 文档的主要内容大概如下

tex

% main.tex
% ========================================================
% 🎆🎆🎆🎆🎆             导言区             🎆🎆🎆🎆🎆
% ========================================================
\documentclass{ctexart}

% 正文样式设置
\ctexset{
    section/format = \centering\bfseries\Large,
    subsection/format = \raggedright\bfseries\large,
    subsubsection/format = \raggedright\bfseries\large
}

% 正文依赖的宏包和用户自定义命令
\input{user_package.tex}

% ========================================================
% 🎆🎆🎆🎆🎆             正文区             🎆🎆🎆🎆🎆
% ========================================================
\begin{document}
\makecover                  % 生成封面

\pagenumbering{Roman}       % 目录部分页码通常是罗马数字
\tableofcontents            % 插入目录
\clearpage                  % 换页

\listoffigures              % 插入图片索引
\clearpage                  % 换页

\listoftables               % 插入表格索引
\clearpage                  % 换页

\pagenumbering{arabic}      % 正文页码通常是阿拉伯数字
\setcounter{page}{1}        % 正文页码重新开始于1 

% 真正的正文开始于此
\include{sections/background.tex}
\include{sections/calculation.tex}
\include{sections/simulation.tex}
\include{sections/conclusion.tex}
\bibliography{ref}
\include{sections/appendix.tex}

\end{document}

上述风格仅供参考,欢迎讨论。