第八节 从零开始使用 \(\rm \LaTeX\) 排版论文

状态:文稿准备中
以下是本讲稿的主要参考。
  1. 陈晟祺 等.
    如何使用 \(\rm \LaTeX\) 排版论文
    EB/OL
    . 2021. 链接
  2. 曾祥东.
    现代 \(\rm \LaTeX\) 入门讲座
    EB/OL
    . 2022. 链接.
  3. SJTUG.
    SJTUThesis 用户文档
    EB/OL
    . 2022. 链接.
  4. \(\rm \LaTeX\) Project. C\(\rm \TeX\) 开发小组 译.
    learnlatex.org
    EB/OL
    . 2022. 链接.
  5. Oetiker T, Partl H, Hyna I, Schlegl E. C\(\rm \TeX\) 开发小组 译.
    一份(不太)简短的 \(\rm \LaTeX2\varepsilon\)介绍:或 111 分钟了解 \(\rm \LaTeX2\varepsilon\)
    EB/OL
    , 2021. 链接.

8.1 学习 \(\rm \LaTeX\)

这一部分主要参考了 Learn\(\rm \LaTeX \).org 的系列教程,内容简洁,适合入门,符合教育学观念,并参考由 C\(\rm \TeX\)-org 提供的中文翻译版本(本人也有参与)。如果你认为下面一个小时的入门教程没有讲得非常细致的话,欢迎直接阅读这个网站的全文。以及该版本尚未合并上游,主要可能是本人一些部分的翻译还是欠点火候的,如果大家在阅读这个翻译版本的过程中看到任何的笔误,或者想对翻译做出任何改进,欢迎向该存储库提 PR,合并完成后,这个网站拥有中文翻译的同时,示例也将能在线运行以查看结果。

8.1.0 是什么

由于标题是从零开始,所以这个节次编号也就从零开始了。以及我们现在先介绍 8.1.1 节的发行版安装(如果不想安装本地版本,也可以直接打开在线网站进行实验,比如网络信息中心推出的交大 \(\rm \LaTeX\) 助手),在安装的过程中来了解一些历史。

\(\rm \LaTeX\) 这个词由两个部分组成,La 和 \(\rm \TeX\)。那我们首先了解一下 \(\rm \TeX\) 是什么。\(\rm \TeX\) 是由斯坦福大学的教授高德纳于 1977 年开始开发的排版引擎,它已经有三十多年的历史了,目前仍在更新,版本号(3.141592653)将会趋近于 \(\pi\) 的取值,高德纳最近还在给 TUGBoat 写稿子,关于 \(\rm \TeX\) 今年又做了哪些改进。

当然 \(\rm \TeX\) 既是引擎,也可以叫程序(你认为只是引擎也可以),如果安装好了发行版(当然这一部分你看个热闹也行),我们可以在命令行(对于 Windows 用户,没有安装 Windows Terminal 的话,可以使用 Windows+R 调出运行窗口,输入 cmd 后按回车)敲出

tex --version
就可以看到这个程序的版本信息。可以看到这个软件是 D.E.K.(也就是高德纳)于 1982 年发布的。

tex 版本输出
MiKTeX-TeX 4.4 (MiKTeX 22.3)
© 1982 D. E. Knuth; all rights are reserved.
TeX is a trademark of the American Mathematical Society
using bzip2 version 1.0.8, 13-Jul-2019
compiled with curl version 7.72.0; using libcurl/7.72.0 Schannel
compiled with expat version 2.2.10; using expat_2.2.10
compiled with liblzma version 50020052; using 50020052
compiled with libressl version LibreSSL 3.1.4; using LibreSSL 3.1.4
compiled with MiKTeX Application Framework version 4.4; using 4.4
compiled with MiKTeX Core version 4.12; using 4.12
compiled with MiKTeX Archive Extractor version 4.0; using 4.0
compiled with MiKTeX Package Manager version 4.7; using 4.7
compiled with uriparser version 0.9.4
compiled with zlib version 1.2.11; using 1.2.11

关于这个程序,高德纳写了一本著名的 《\(\rm\TeX{}Book\)》,我们可以在命令行敲出这个程序的 Hello, world。(第一行提示你希望排印的文件名称,这里输入 \relax 以告诉它什么也不做,准备通过命令行输入文档。)

**\relax

*Hello, world!

*\end
它会提示你输出了一个 texput.dvi 文件(DVI,DeVice Independent file,设备依赖无关文件),打开它,你就会发现一个简单的文档,上面写着 Hello, world!

当然本次讲座并不是关于 \(\rm \TeX\) 本身的,以及它更靠近于琐碎的底层,连高德纳本人在排版其著作《计算机编程艺术》一书时(\(\rm \TeX\) 的发明一开始就是为此书而作)都要设计许多宏来简化输入。当然如果真的感兴趣,我认为《\(\rm\TeX{}Book\)》一书本身遵循教育学方法,适合入门者阅读,更广泛的知识可参见《\(\rm \TeX\) 急就贴》《\(\rm \TeX~by~Topic\)》等书。我们还是来接着了解 \(\rm \LaTeX\) 吧!

\(\rm \LaTeX\) 是最早由现就职于微软的 Leslie Lamport 开发的一种 \(\rm \TeX\) 开发的一种 \(\rm \TeX\) 格式(与其对标的是 \(\rm Con\TeX{}t\)),主要也是为了简化 \(\rm \TeX\) 的使用。现在主要由 \(\rm \LaTeX\) 开发组维护,现在广泛使用的版本是 \(\rm \LaTeX2\varepsilon\),最新的版本为 \(\rm \LaTeX3\),在 2020 年 10 月后默认内置,所以要尽可能使用较新的发行版,以充分发挥其功能。

\(\rm pdf\LaTeX\) 是为了编译一个 \(\rm \LaTeX\) 文档而运行的程序。

实际上底层在运行一个叫 \(\rm pdf\TeX\) 的引擎,并预装了对应的 \(\rm \LaTeX\) 格式。

为了区别这两者的概念,我们可以在终端运行

pdftex
终端输出为
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (MiKTeX 22.3) (preloaded format=pdftex.fmt)
 restricted \write18 enabled.
**
                    

而输入

pdflatex
得到
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (MiKTeX 22.3) (preloaded format=pdflatex.fmt)
 restricted \write18 enabled.
**
                    
你可以看到其仍然在调用 \(\rm pdf\TeX\) 引擎。按照同样的方法输入 \relax,将输出
**\relax
entering extended mode
LaTeX2e <2021-11-15> patch level 1
L3 programming layer <2022-02-24>
*
你会看到 \(\rm \LaTeX\) 的版本号。

你可能会好奇使用 latex 会发生什么,它也将触发 pdftex,只是输出格式为 DVI 而不是 PDF。

如果上面这些东西你听得云里雾里的话,也没有关系,毕竟这些都是老古董了,现在的话很常见的方法还是直接从编辑器集成地编译。下一节会提到。

当然为了排版中文,已经不再推荐使用 \(\rm pdf\LaTeX\) 了,应该使用 \(\rm Xe\LaTeX\) 或者 \(\rm Lua\LaTeX\),当然后者的速度还是相对较慢(理想情况下不慢,但是使用一些宏包后会破坏理想状态,也会因配置产生不同的结果,不同的操作系统在 I/O 速度上的不同也会导致不同的时间),它们支持 Unicode 编码,并可以使用 OpenType 字体的全部功能(pdfLaTeX 也支持,只不过需要先生成 tfm \(\rm \TeX\) 字体度量文件,后续使用 \(\rm \TeX\) 自身的配置方法),而不像 \(\rm pdf\LaTeX\) 会只能使用 7 比特或 8 比特字体。当然 Windows 平台下在某些追求速度的情况下,还是可以试着使用 \(\rm pdf\LaTeX\) 的。

主流 \(\rm \TeX\) 程序
引擎\(\rm pdf\TeX\)\(\rm Xe\TeX\)\(\rm Lua\TeX\)
程序\(\rm pdf\LaTeX\)\(\rm Xe\LaTeX\)\(\rm Lua\LaTeX\)
特点直接生成 PDF,支持 micro-typography 支持 Unicode、OpenType 与复杂文字编排 (CTL) 支持 Unicode,内联 Lua,支持 OpenType

以及 \(\rm (u)p\TeX\) 是日语最常用的引擎,生成 .dvi,支持 Unicode。\(\rm Ap\TeX\)(Asiatic pTeX)具有底层 CJK 支持,内联 Ruby,Color Emoji。

8.1.1 是什么

要让 \(\rm \LaTeX\) 跑起来,核心就是要有一套 \(\rm \TeX\) 发行版,来获取让 \(\rm \LaTeX\) 工作所需的一组程序和文件。参考《一份简短的关于 \(\rm \LaTeX\) 安装的介绍》安装想使用的发行版,这里面甚至介绍了如何卸载 \(\rm \TeX\) 发行版以及一些常见问题解答。推荐使用发行版的最新版本,并使用国内镜像(还是希望不要再有人使用高速下载器下载 \(\rm\TeX~Live\) 了)。

\(\rm \TeX\) 发行版
发行版\(\rm MiK\TeX\)\(\rm\TeX{}~Live\)\(\rm Mac\TeX\)
特点只安装必要文件,依赖用时更新所有平台均可使用,每年发布一次Mac 系统专用,对 \(\rm\TeX{}~ Live\) 的进一步打包

事实上,我认为这几个发行版各有操作系统偏好,虽然前两者是跨平台的。\(\rm MiK\TeX\) 对 Windows 用户较为友好,占用空间不大,安装时间短,而且有完整的安装与卸载程序。因为一些原因,这里将播放安装 \(\rm MiK\TeX\) 的录像。

\(\rm\TeX{}~Live\) 更符合 Linux 的更新传统。老版本 Linux 系统的包管理器自带 \(\rm\TeX{}~Live\) 发行版可能不是最新的(到时间也会锁定依赖库的版本),尽量使用镜像安装(当然也推荐使用最新的 Linux 发行版,这样它的版本也就一直是最新的),并手动将相关环境变量添加到路径

\(\rm Mac\TeX\) 发行版有 pkg 安装包封装,并且附带了 TeXShop 基本编辑软件,更加适合 Mac OS。

说到镜像,像后两者的安装包都很大(4GB 左右),由于一些原因,不采用镜像的话不知道要下到什么时候,对下载速度的要求高;而 \(\rm MiK\TeX\) 需要随时更新,宏包大小颗粒度大,对延迟的要求高。那么采用 SJTUG 镜像源将同时解决这两个问题,位于图信大楼的机房,凭借校内的高速网络,稳定快速下载,由 SJTUG 另一个组维护的镜像站欢迎大家的使用,主页上还有更多的其他镜像可供使用。

\(\rm\TeX{}~Live\) 的设置方法为命令行输入

tlmgr option repository https://mirrors.sjtug.sjtu.edu.cn/CTAN/systems/texlive/tlnet
\(\rm MiK\TeX\) 的设置方法为在 \(\rm MiK\TeX\) Console 中设置镜像源为
https://mirrors.sjtug.sjtu.edu.cn
可以在 SJTUG 镜像站通知频道获得镜像状态的更多信息,加入关联群组参与讨论。

相信很多人的发行版都已经装完了,那我们来谈谈编辑器吧。编辑器的种类很多,我无法一一列举,但是对编写 \(\rm \TeX\) 常用的开源编辑器我推荐这三个。

开源编辑器推荐
编辑器Visual Studio Code + \(\rm \LaTeX\) Workshop\(\rm \TeX{}studio\)\(\rm\TeX{}works\)
特点搭配 VS Code 使用非常方便,易扩展可以使用大量的菜单选项输入代码块,用户友好只提供基础的高亮与运行方法,发行版自带

使用专为 \(\rm\LaTeX\) 设计的编辑器将带来更多便利,因为它们往往会提供一键编译、内置 PDF 阅读器以及语法高亮等功能。几乎所有现代的 \(\rm \LaTeX\) 编辑器都提供 \(\rm Sync\TeX\) 这一强大的功能(VS Code 的方法是 Ctrl + 某处,Overleaf 的方法是直接双击),以在 PDF 和代码间对应跳转。当然如果你不喜欢使用这种 GUI 编辑器,\(\rm \TeX\) 文档本身就是纯文本,对 Vim, Emacs 等终端用户也很友好。

但是辟个谣,Windows 记事本并不是最好的文本编辑软件。因为一旦死机,所有的数据都会丢失。VS Code 等、以及 Linux 平台的 Vim 等可以随时保存的编辑器则不同于此。

当然使用在线平台省去了安装发行版的麻烦,这里列出两种在线写作平台。当然国内还有 TeX PageSlagger 等。一般来讲,这种平台使用的都是 Linux 操作系统,所以在排版中文的时候考虑将编译引擎更改为 \(\rm Xe\LaTeX\),学习如何使用在线平台参见 Overleaf 的官方文档

在线协作平台推荐
在线平台Overleaf交大 \(\rm \LaTeX\) 助手
特点最流行的在线平台,提供大量的模板,但国内访问慢校内平台,隐私保护有保障,共享项目限制少

8.1.2 基本结构

我们可以开始正题了。

\documentclass 命令加载了文档类,基本上每一个 \(\rm \LaTeX\) 文档都以这一行开头。article 是由 \(\rm \LaTeX\) 提供的用于排版短文档的基本文档类。

article不包含章的短文档
report含有章的单面印刷文档
book含有章的双面印刷文档
beamer幻灯片
\documentclass{article}         % <-- 文档类
\begin{document}                % <-- 主体环境
    Together for a Shared Future  % <-- 正文
\end{document}                  % <-- 环境

document 环境用于指示文档主体的范围。\(\rm \LaTeX\) 还有其他的使用 \begin\end 的搭配,我们称这些为环境。他们将用来设定局部格式命令。环境实际上是一个组,只不过通过语义化的形式预装了对应的格式命令,普通的组可以直接使用一堆大括号之间的内容或者 \begingroup\endgroup 表示。

8.1.3 扩展

\usepackage 用于使用宏包以向 \(\rm \LaTeX\) 添加或修改功能,需要在导言区(文档类后,文档主题前)使用。

\documentclass{article}
\usepackage{ctex}               % <-- 导言区调用宏包
\begin{document}
  一起向未来
                                % <-- 空行产生段落分隔
  Together for a Shared Future
\end{document}

这里使用了ctex宏集以获得中文支持。其调用底层因不同的引擎而不同。

引擎\(\rm pdf\TeX\)\(\rm Xe\TeX\)\(\rm Lua\TeX\)
程序\(\rm pdf\LaTeX\)\(\rm Xe\LaTeX\)\(\rm Lua\LaTeX\)
宏包CJKxeCJKluatexja
封装ctex
ctex 在 Mac OS 和 Linux 上已经不可以使用 \(\rm pdf\LaTeX\),以及在 Windows 上使用 \(\rm pdf\LaTeX\) 会导致其自动间距调整等功能的默认行为受到变更。

\(\rm C\TeX\) 建议对于之前提到的常规文档类,最佳实践是使用该宏集提供的四种中文文档类(ctexart, ctexrep, ctexbook, ctexbeamer),以对特定类型提供额外的中文排版适配。

大部分情况下,你都不应当在 \(\rm \LaTeX\) 中强制断行:你几乎只是想另起一段,或者是想在段落之间添加空行(使用 parskip 宏包就可实现,当然有些文档类这种方式并不一定奏效)。只有很少的情况下你需要使用双斜线来另起一行而不另起一段。

8.1.4 设定格式

可以使用显式样式设定命令对小段做加粗、斜体、等宽等等的处理。

\documentclass{ctexart}
\begin{document}
\textbf{一起向未来}                     % <-- 加粗

\emph{Together for a Shared Future}   % <-- 强调
\end{document}

与 Word 不同的是,\(\rm \LaTeX\) 一般情况下并不需要使用上面的显式命令,而是采用逻辑标记的方法,比如 \emph 可以强调文字,以及下面将要提到的目次命令。这样可以统一管理格式。

同样地,你也可以显式地设定字体大小,但是这种命令会更改行文设置,所以需要使用一个组来限定作用范围。请注意最后显式地使用 \par 在改回大小前结束该段,否则会导致下一行的行间距异常!当然,应当避免手动设定大小,以影响格式统一。

\documentclass{ctexart}
\begin{document}
  {\bfseries\Large 一起向未来\par}           % <-- 加粗
  {\itshape Together for a Shared Future}   % <-- 斜体
\end{document}

8.1.5 逻辑结构

接下来我们概览一下三种列表:无序列表、有序列表、描述列表。这些列表可以相互嵌套,但最多嵌套四层。

\documentclass{ctexart}
\begin{document}
  \begin{itemize}
    \item 第一项
    \item 第二项
    \item 第三项
  \end{itemize}
\end{document}  
\documentclass{ctexart}
\begin{document}
  \begin{enumerate}
    \item 第一项
    \item 第二项
    \item 第三项
  \end{enumerate}
\end{document} 
\documentclass{ctexart}
\begin{document}
  \begin{description}
    \item[第一] 文本
    \item[第二] 文本
    \item[第三] 文本  
  \end{description}
\end{document}

\(\rm \LaTeX\) 可以使用目次命令将文档划分层级,并自动设定对应字体样式和大小。

\documentclass{ctexart}
\begin{document}
  \section{概念}            % <-- 节
  \subsection{\LaTeX{}}     % <-- 小节
  \LaTeX{} 是一个用以排版高质量作品的文档准备系统。
\end{document}
命令含义层次
\chapter0
\section1
\subsection小节2
\subsubsection小小节3

章这一级只在 reportbook 文档类(包括对应的中文文档类)有定义。还有不常用的 \part (0@article/-1@report&book&beamer) 以及更低层次的 \paragraph (4) 与 \subparagraph (5)。

而知道层次,对我们下面生成目录有帮助。

\tableofcontents 用来生成对于目次命令的目录。如果你想设定显示到哪个层级,在这个命令前使用 \setcounter{tocdepth}{层次} 如果你想在目录中使用更短的标题,使用方括号标识这一点: \section[短标题]{长标题}。 如果你想让本目次的标题不显示在目录中,在命令后加上星号: \section*{目录没这个标题}

\documentclass{ctexrep}
\includeonly{learnlatex,sjtuthesis} % <-- 此处指定要排印哪些内容
\begin{document}
  \tableofcontents                  % <-- 目录
  \include{learnlatex}              % <-- 插入文档
  \include{sjtuthesis}              % <-- 插入文档
\end{document}

对于大型文档而言,使用多个文件管理源文件通常是更方便的。而 \include\input 都以相对路径的方式插入其他 \(\rm \TeX\) 文档。区别在于,\include 命令会从新页开始并做一些内部调整,这基本上只对 chapter 这一级有用。而 \input 会原样插入源代码。

但是 \include 插入的文档可以使用 \includeonly 管理当前要排印哪一部分的内容,利用所有章节辅助文件的同时,减少编译时间并专注于该部分的内容。

当然,如果需要不换页插入源代码就不用\include了,因为这最主要的好处在于能够在组建大型文档的时候,得到当前页码、编号的进度信息。在插入小部件时,还是推荐使用\input,这个命令不会额外地产生.aux文件,对于 I/O 反应慢的(说的就是 Windows)比较友好。

请注意子文件中就不需要添加 document 环境了。之前提到的编辑器大部分具有识别魔术命令的能力,可以在文档开头使用 % ! TeX root = main.tex

8.1.6 图

\documentclass{ctexart}
\usepackage{graphicx}
\graphicspath{{figs/}{pics/}}
\begin{document}
\begin{figure}[ht]
  \centering
  \includegraphics[width=\textwidth]{sjtug}
  \caption{SJTUG 徽标}\label{fig:sjtug}
\end{figure}
\end{document} 

为了插入外部图片,需要使用 graphicx 宏包。之后在文档主体便可以使用 \includegraphics 插入图片。导言区也可以加入 \graphicspath 指定图片文件夹。

\includegraphics 命令便以相对路径的方式插入图片,如果无同名图片,那么后缀名可以省略。可以使用可选参数指定插入的图片尺寸,最佳实践是使用 \textwidth\linewidth 的相对值指定尺寸大小,以在未来可能的布局更改中保留一定的灵活性,比如我未来想变更为幻灯片的时候。

关于\includegraphics,你也可以通过键值对的方法设置图片的其他属性。更多的信息参见宏包对应的文档。事实上,\(\rm \LaTeX\) 很多命令都是使用方括号添加可选参数的。

width宽度
height高度
scale缩放
angle角度

我们可以看到,figure 为一个浮动体环境(table 也是),可以将其移动到其他位置上以减少行文中的空白。可以添加可选参数以指定如何放置浮动体,最多可以使用四种位置描述符:

hHere尽可能在这里
tTop页面顶部
bBottom页面底部
pPage浮动体专页
HHere强制在此处*
* 最后一个需要使用float宏包,使用这个可能会导致页面产生大量的空白。

采用 \centering 命令而不是 center 环境来水平居中图片。这将避免多余的纵向间距。使用 \caption 命令输入题注,如果这个命令写在插入图片前面,题注将会在上方(中文中一般对 table 环境这么做)。后面将会看到如何对留有标记(\label)的图片进行引用。

\documentclass{ctexart}
\usepackage{graphicx}
\graphicspath{{figs/}{pics/}}
\begin{document}
  \begin{figure}[ht]
    \begin{minipage}{0.48\textwidth}
      \centering
      \includegraphics[height=2cm]{sjtug}
      \caption{SJTUG 徽标}\label{fig:sjtug}
    \end{minipage}\hfill
    \begin{minipage}{0.48\textwidth}
      \centering
      \includegraphics[height=2cm]{sjtugt}
      \caption{SJTUG 文字}\label{fig:sjtugt}
    \end{minipage}
  \end{figure}
\end{document} 

并排排版两张图片的最简单方法就是在figure环境里添加两个minipage,这样两张图片的编号就会在同一个层级。

subcaption 宏包提供了 subfigure 环境(以及 subtable),可以用于以子图的形式插入,编号会向下增加一级。也可以为子图添加子级引用编号。

\documentclass{ctexart}
\usepackage{graphicx}
\usepackage{subcaption}
\graphicspath{{figs/}{pics/}}
\begin{document}
  \begin{figure}[ht]
    \begin{subfigure}{0.48\textwidth}
      \centering
      \includegraphics[height=2cm]{sjtug}
      \caption{徽标}
    \end{subfigure}\hfill
    \begin{subfigure}{0.48\textwidth}
      \centering
      \includegraphics[height=2cm]{sjtugt}
      \caption{文字}
    \end{subfigure}
    \caption{SJTUG}\label{fig:sjtug}
  \end{figure}
\end{document} 

8.1.7 表

使用 tabular 环境绘制表格。需要添加参数(称为表格导言)以确定每一列的对齐方式。一般都需要引入 array 宏包来使用更多的引导符。

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}
\begin{document}
\begin{table}[ht]
    \centering
    \caption{北京冬奥会吉祥物}\label{tab:mascot}
    \begin{tabular}{lp{3cm}}
        \toprule
        \multicolumn{1}{c}{吉祥物} & \multicolumn{1}{c}{描述}    \\
        \midrule
        冰墩墩                     & 2022 年北京冬季奥运会吉祥物 \\
        雪容融                     & 2022 年北京冬季残奥会吉祥物 \\
        \bottomrule
    \end{tabular}
\end{table}
\end{document}
常见引导符
l向左对齐
c居中对齐
r向右对齐
p{3cm}固定列宽,两端对齐
m{3cm}p + 垂直居中对齐
>{\bfseries}后一列单元格前加命令
*{3}{l}三个左对齐列

booktabs 宏包提供了标准三线表格所需要的行分割线:\toprule\midrule\bottomrule。也可以使用\cmidrule{1-2}来部分地绘制行分割线。一般不推荐在专业表格中使用纵向分割线。这里每行内容就要使用双斜线分隔开,每行中的单元格使用&分隔开。

\multicolumn命令不仅可以用于合并同行的单元格,还可以用于临时地屏蔽表格导言对该列的对齐方式定义。这里用于居中表头。

\multicolumn{格数}{对齐方式}{内容}
跨页表格考虑使用longtable宏包。带标注的表格可以考虑使用threeparttable宏包。考虑使用在线工具生成表格代码。复杂的使用方法在 SJTUThesis 使用文档中都有提及。

8.1.8 数学公式

输入数学公式是 \(\rm \LaTeX\) 的绝对强项,很多常见的公式服务依赖于一些轻量级渲染引擎比如 MathJax, KaTeX。但是它们实际上使用的是 \(\rm \LaTeX\) 语法变种,也就是说并没有使用 \(\rm \LaTeX\) 后端。所以不要期望有完全一致的输出。

为了更好的获得数学公式输入支持,请使用 amsmath 宏包。数学模式分为两种:

  • 行内模式,一般通过一对美元符号($...$)标记,可以使用编辑器内建的符号表输入数学符号,也可以使用在线工具手写识别
  • 行间模式,一般通过 equation 环境输入,加星号用于无编号的公式环境。如果需要使用多行公式,请使用 align 环境,并按照类似表格输入的方式,使用 & 对齐符号,双斜线换行。如果不想手动居中,可以考虑多行自动居中的gather和单个大型公式首尾两端对齐multline

关于表格和数学公式,如果不太熟悉如何输入,或者符号表记不住,推荐从比较容易上手的编辑器起步,比如 \(\rm\TeX{}studio\) 提供了用户友好的界面。我相信输入半年后,就可以对这些符号的输入很熟练了。

你会发现我的这套教程没有讲很多的数学公式输入技巧,因为这些东西只有你自己熟练了才能体会。而且\(\rm\LaTeX\)本来就不是完全关于数学公式的。

关于如果 \(\rm \LaTeX\) 报出了错误,比如说数学模式下不能有空行,想要学习如何修复这些错误,可以详见 Learn\(\rm \LaTeX\).org 的相关章节

8.1.9 引用

正如之前所提到的,\(\rm \LaTeX\) 中使用 \label 标记,然后可以使用 \ref 来引用这个标记。 \label 可以放在使用计数器的对象之后。为了使得对公式编号的引用带有括号,推荐使用 amsmath 宏包中的 \eqref 命令。对于多行公式环境,每一个换行符前都可以添加一个 \label 用于引用该行公式。

\(\rm \LaTeX\) 可以通过专用数据库文件 .bib 自动生成参考文献,很多的文献管理文件比如 EndNote, Zotero, JabRef 都可以直接导出这种格式的文件用于 \(\rm \LaTeX\) 论文中的引用。一般不需要手写数据库文件,你只需要注意每一个文献会在数据库中有一个主键,这个类似于上文的 \label 标记,只是要引用数据库中的文献需要使用 \cite 命令。

Word 实现这种功能需要借助其他功能,感兴趣的可以接着听该专题讲座的后续内容。

而让 \(\rm \LaTeX\) 处理 .bib 数据库文件与引用有两种工作流。你可能需要查清楚如何在编辑器中设置对应的工作流,或者采用后面所提到的高级编译方式 latexmk

  • bibtex 是标准的工作流程,一般期刊提交这种方法。中文引用可以使用 gbt7714宏包,但是角模式与正文模式不可混用。
  • biblatex 是更容易定制化的一种方案。中文引用可以使用gb7714-2015biblatex样式,但需要使用\(\rm Xe\LaTeX\)编译。

8.2 SJTUThesis

SJTUThesis 最早是由一位物理系同学制作,采用了当时流行的 CJK 方案。韦建文学长于 2009 年 11 月发布 0.1a 版,移植到 \(\rm Xe\LaTeX\) 版本。2018 年起由 SJTUG 接手维护,2019 年 6 月吴伟健重构了整个宏包的代码,升级版本号为 1.0,现在主要由吴伟健与迟先生使用 \(\rm\LaTeX3\) 准备其 2.0 版本(我主要是打杂的)。支持本科、硕士、博士学位论文以及课程论文的排版。

让我们来讨论 the elephant in the room:为什么用 \(\rm \LaTeX\) 排版论文?

Markdown 很好啊,方便的语法,一般技术文档也常用。但就是因为它太简单了,没有内置样式控制,一般需要借助 HTML,CSS 那一套东西。也会有一些人尝试通过 R Markdown(Bookdown)·,以及可以通过 MathJax 渲染 \(\rm \TeX\) 公式。

Word 很好啊,官方钦定的论文写作方法,可见即可得,但是进阶排版仍然可以困难。就拿排版公式来说,大家以前初高中学的、或者是计算机二级考的 Word 2003 要排版公式,一种是装 MathType 插件,版本间不兼容、一种是搞个域代码+替换字体。Word 2007 之后添加了插入正经的 Unicode 公式功能,但默认的 Calibri Math 字体以及符号布局仍然赶不上 \(\rm \TeX\) 的美感。

\(\rm \LaTeX\) 根据之前学到的一些技巧,看起来不难对吧(虽然有我诱导的成分),然后它内容与样式分离的设计理念已经渗入了很多领域。以及很多学术论文都需要 \(\rm \LaTeX\) 的提交。当然现在也推出了可见即可得的编辑器 LyX,Overelaf 的可视模式(虽然这两个并不是一个东西);以及迟先生很喜欢的 TeXmacs,一种不使用 \(\rm \TeX\) 底层的、但是效果相像的排版程序。

设计相关专业的同学可能更喜欢 Adobe Indesign,对图文混排更为擅长。但是它也足够复杂,虽然提供了几乎所有的排版用具,但是我还没见过用它排版几十页充满公式的论文的(或许有人会开先河?)。以及传说它用了 \(\rm \TeX\) 的一些算法,所以 \(\rm \TeX\) 还是老大哥,兼具美感和批量化处理的折中方法。

学习 SJTUThesis 的相关接口,请参见开发文档

问:与 Word 的参考实现略有不同

答:毕设论文的格式只要不违背《上海交通大学关于本科生毕业设计(论文)工作的指导意见》《上海交通大学博士、硕士学位论文撰写指南》 即可,其他细节上的修改可以先搜索解决方案,再反馈给我们。

问:我需要转为 Word 文档

答:你需要在写论文前仔细查看每个学院的要求,如果需要 Word 提交,你应该果断转向使用 Word 写,否则:当你考虑直接将 PDF 转为 Word 时,这是个逆向工程,失去了 Word 的相关辅助编码,转换失败概率大幅上升。如果是为了查重目的,不支持 PDF 的话,也可以考虑 TXT 纯文本格式。从 \(\rm \LaTeX\) 源代码出发的转换可以使用其他工具实现,不能保证其实现质量。

8.3 更进一步

  1. Reckdahl K. 盛文博 译.
    \(\rm \LaTeX\) 插图指南
    EB/OL
    . 第三版. 2017. 链接.这本书主要讲了一些插图的排版技巧,但是有些资料优点陈旧,但仍不妨碍其成为一本很好的图文混排教材。
  2. 包太雷.
    \(\rm \LaTeX\) Notes
    EB/OL
    . 第二版. 2021. 链接.这本书很像后面的 \(\rm \LaTeX\) and Friends 很像。
  3. 刘海洋.
    \(\rm \LaTeX\) 入门
    M
    . 北京:电子工业出版社, 2013.这本书老经典了,就是还会讲 \(\rm \TeX\) 套装,但仍然是中国很好的百科全书。该书作者谈到 \(\rm \TeX\) 套装退役的时候,说到它已经完成了它的使命。
  4. Overleaf.
    Learn \(\rm \LaTeX\) in 30 minutes
    EB/OL
    . 链接.官方教程,经典。
  5. M.R.C. van Dongen
    .
    \(\rm \LaTeX\) and Friends
    M/OL
    . New York: Springer, 2012. 链接
  6. Mittelbach F., Goossens M., Braams J., et al.
    The \(\rm \LaTeX\) Companion
    M
    . 2nd ed. [S. I.]: Addison-Wesley Professional. 2004. 该书 1k 多页,8 月会有第三版。(\(\rm\LaTeX\) 报错的时候会提到这本书。)

以上内容一般可以通过链接(借助图书馆的文献库)获得全文,或者在图书馆可以借到,实际上,当你真正拿到一本使用 \(\rm \LaTeX\) 排版的书的时候,你才会知道这些人为什么会痴迷于它,它在打印层面上都做了比 Word 更好的优化。(我当年在李图借到的《费曼物理学讲义》,确实感觉非常舒适。)

我相信你都看到这儿了,或许会对如何使用 \(\rm \LaTeX\) 制作幻灯片感兴趣,5 月 18 日会讲解一些关于其的可视呈现相关知识,SJTUBeamer 提供了基础的模板,以及我的博客由于没有涉及太多的中文排版内容,所以其还是在使用 CJK 排版,现在当然不怎么推荐这种做法,但是其中的可视相关的内容时不变的,感兴趣的敬请关注图书馆公众号的后续通知!