综合各路大神组成了这篇长博文,,,
1. 简介
维基百科
LaTeX 是一种基于TEX的排版系统,由美国电脑学家莱斯利·兰伯特在20世纪80年代初期开发,利用这种格式,即使用户没有排版和程序设计的知识也可以充分发挥由TEX所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。这个系统同样适用于生成从简单的信件到完整书籍的所有其他种类的文档。
TeX提供版面编辑的底层命令,但是使用时操作复杂,工作效率不高. TeX允许用这些底层命令定义出可以执行复杂操作的扩展命令.
个人理解
LaTeX 基于 TeX,主要目的是为了方便排版。在学术界的论文,尤其是数学、计算机等学科论文都是由 LaTeX 编写, 因为用它写数学公式非常漂亮。
LaTeX 的工作方式类似 web page,都是由源文件(.tex or .html)经由引擎(TeX or browser)渲染产生最终效果(得到 PDF 文件 或者 生成页面)。两者极其神似,包括语法规则与工作方式。所以呢,与 HTML 一样,入门其实很简单。
一般的 HTML 规范写法中都是在 HTML 文件中写入 web page 的结构与内容,再由 css 控制页面生成的样式。当然也可以选择在 HTML 中直接写入样式内容,不过这并不提倡。同样,在 LaTeX 有着同样的情况,可以在 tex 源文件中同时写入内容和样式,也可以内容与样式分离,以网络上流传广泛的 清华大学 LaTeX 模板 为例,以 .cls(class) 结尾的 thuthesis.cls 便可看作是与 css 起到同样作用的样式文件。
LaTeX 有所谓宏包的概念,\usepackage{foo} 即可使用宏包 foo 中定义的内容。所谓宏包就是一些写好的内容打包出来以便大家使用而已。这跟 C 语言的 include 是一致的,将文件加载进来进行使用。利用宏包,我们可以使用很多现成的好用的样式。当然了,如果要编写一个自己的个性化的宏包也是可以的,不过需要学习成本。
LaTeX模板 | 功能简要介绍 |
---|---|
.dtx | Documented LaTeX sources,宏包重要部分 |
.ins | installation,控制 TeX 从 .dtx 文件里释放宏包文件 |
.cfg | config, 配置文件,可由上面两个文件生成 |
.sty | style files,使用\usepackage{...}命令进行加载 |
.cls | classes files,类文件,使用\documentclass{...}命令进行加载 |
.aux | auxiliary, 辅助文件,不影响正常使用 |
.bst | BibTeX style file,用来控制参考文献样式 |
class 与 style 似乎十分相像,它们在功能上的确很相似,但是也有区别。这里 是关于 .cls 与 .sty 文件的区别。额外推荐阅读材料: 来自北京大学李东风老师的 LaTeX 排版心得.
LaTex 命令架构
Tex环境中,字符,图片等内容都放在隐形的盒子(box)容器内。这些盒子根据Tex和Latex的默认规则以及相关命令粘结成更大的盒子。字符组合成单词,单词组合出语句。语句在放入页面盒子时,根据版面格式分解成行列。
版面格式布置盒子在页面中的位置,字符等文档内容的位置是由它们在盒子中相对坐标确定。例如,一个字符盒子如下图所示。
width是盒子的宽度。基线(baseline)将盒子分割成上下两部分。height和depth分别确定这两部分的高度。 字符盒子基于基线相互粘结。
LaTex提供不同层次的命令帮助用户设置文档版面。它最底层是大约300个TeX基础命令,例如 \hbox, \vskip等。
LaTex的核心是一组建立在TeX基础命令上的宏命令,例如 \documentclass, \usepackage, \begin.等。
再往上就是类文件,例如foo.cls等。当\documentclass{foo}时,就是加载foo.cls文件。
再往上是扩展包, 例如pic.sty等。我们可以使用\usepackage命令加载扩展包。
基本的排版流程图
一般我们经常用pdflatex 或者xelatex 程序直接从tex 文件生成pdf 文件。如果是中文tex 文档,优先使用xelatex 程序编译。
2. 安装配置LaTeX
LaTeX 配置环境很简单,只需 2 步:
1. 根据平台选择一个 TeX 发行版 进行安装,建议选择最全功能最多的版本。
TeX 发行版的概念相当于 Linux 及其发行版,Linux 内核虽然只有一个,但是有很多基于内核的不同特色的 Linux 发行版,Ubuntu, Fedora 等等不胜枚举。所谓 TeX 发行,也叫 TeX 发行版、TeX 系统或者 TeX 套装,指的是包括 TeX 系统的各种可执行程序,以及他们执行时需要的一些辅助程序和宏包文档的集合。
OS | TeX Distribution |
---|---|
Windows | CTeX |
Mac | MacTeX |
Windows, Linux | TeXLive |
Windows 用户推荐 TeXLive,不推荐 CTeX。不过 TeXlive 在线安装太慢了,安装包太大,两三个 G,这里是百度云链接 2015 TeXlive 离线安装包, 提取密码2cj2,解压缩后运行 install-tl-windows.bat 即可。
Mac用户推荐使用 MacTeX.
2. 选择一个合适的 LaTeX 编辑器。
在安装好 LaTeX 环境以后,通常都会有一个自带的编辑器,比如 CTex 的 WinEdt, MacTeX 的 TeXShop, 不过功能并不强大,好比 Windows 记事本,只有一些基本的文本编辑功能。
TeXmacs 有兴趣的也可以了解一下,王垠也在博客中推荐过。
3. LaTex 环境
使用 latex 首先就要抛出 word 里面那种一篇文章就是一个文件的思想。我们可以把它看成一个网页或者一个程序项目更加合适,所以它也有编译的环节。一般来说latex基本流程就是:Latex->Bibtex->Latext->Latex。
- 第一步Latex编译,可以获得 .aux 文件、.dvi 文件、.log 文件以及 .gz 文件;
- 第二步Bibtex编译,可以获得.blg (性能监视器文件) 和 .bbl 文件;
- 第三步Latex编译,获得新的.aux文件、.dvi文件、.log文件以及.gz文件;
- 第四步再次Latex编译。
所以我们需要latex编译器。目前有四种编译器可以选择 xelatex、pdflatex、latexmk 以及 make,大致区别就是
pdflatex 不能处理常见的 eps 图形,需要先⽤ epstopdf 将其转化成 PDF,不过 pdflatex 增加了对 png,jpg 等格式的⽀持,⽐较⽅便。
texlive ⾃从 2010 版本起⾃动调⽤ epstopdf 将 EPS 图形转化为 PDF。
latexmk 命令⽀持全⾃动⽣成 latex 编写的⽂档,并且⽀持使⽤不同的⼯具链来进⾏⽣成,它会⾃动运⾏多次⼯具直到交叉引⽤都被解决。
上文中出现了 texlive,这是一个开发套装,专门用于编写 latex 文档,就像 word,使用它就不用配置,直接开始开发就好了。同类的还有 TeX Live,MiKTex,CTeX. (详细介绍看后文)
4. 关于编辑器的简单介绍
TeX 的源代码是后缀为 .tex
的纯文本文件。使用任意纯文本编辑器,都可以修改 .tex
文件,包括 Windows 自带的记事本程序,也包括专为 TeX 设计的编辑器(TeXworks, TeXmaker, TeXstudio, WinEdt 等),还包括一些通用的文本编辑器(Sublime Text, Atom, Visual Studio Code 等)。可以在这些能够编辑纯文本文件的编辑器中任选其一作为你的 TeX 编辑器,也可以使用 TeX 发行自带的编辑器。最流行的两个 TeX 发行(TeX Live 和 MiKTeX)都带有 TeXworks 编辑器。
5. TeXworks 的使用
介绍这个编译器的原因:
- TeXworks 是 TeX Live 自带的编辑器,而 TeX Live 是 TeX User Group 出品的跨平台发行版,各个操作系统都可以使用;
- 几乎所有 TeX 发行版都带有 TeXworks;
- TeXworks 十分简洁,除了最基本的功能之外,没有其他复杂的东西,能使你将注意力集中在 TeX 的学习上。
5.1 启动 TeXworks
在命令行里运行 texworks 或者在开始菜单里找到 TeXworks 图标以启动。
启动之后,TeXworks 的界面,会默认占据你屏幕的左半边,右半边留空。效果如下图:
图中空白的部分,就是输入编辑文本的编辑框;在编辑框的右下角有三个按钮,最左边的是换行符模式,中间是编码模式,右边标示当前光标所在位置;编辑框的上方是工具栏,工具栏的右半部分使大家熟悉的功能(新建、打开、保存、撤消、恢复、剪切、复制、黏贴、查找、替换),工具栏的左边则是编译按钮 (TeXworks 也称其为「排版工具」);工具栏在往上,则是菜单栏,此处按下不表。
Windows,Unix 等操作系统对待「换行符」是有不同的。索性 TeXworks 为我们做了足够的提示,方面我们的选择(点击一下那个按钮就知道了)。一般而言,保持默认即可。
字符(包括英文字符和中文字符)在计算机中,经过编码以二进制的形式存储在计算机中。如果编辑器编码和计算机内部编码不一致,则会导致所谓「乱码」的现象。TeXworks 默认使用 UTF8 编码,在我们的文档中不需要进行任何更改,而对于一些其他的文档可能需要按照要求更改编码。
5.2 排版工具
TeXworks 为我们预设了若干排版工具(pdfTeX, pdfLaTeX, XeTeX, XeLaTeX 等),本文主要用到其中的 XeLaTeX。关于这些排版工具的细节,讲解起来会有些复杂。因此此处按下不表。当你对 TeX 系统相当熟悉之后,也可以不使用 TeXworks 预设的工具,自己配置排版工具。
TeXworks 默认的排版工具是 pdfLaTeX。如果你希望更改这个默认值,可以在 编辑 - 首选项 - 排版 - 处理工具 - 默认 中修改。
5.3 第一篇文档
5.3.1 Hello, world!
在编辑框中,输入如下内容:
\documentclass{article}
% 这里是导言区
\begin{document}
Hello, world!
\end{document}
将文档保存在你希望的位置,然后在排版工具的下拉选框中选中 XeLaTeX 后,按下绿色的编译按钮。一会儿,如果没有意外,屏幕的右边就会出现编译之后结果。如下图:
请注意,由于操作系统编码和 TeX 内部实现的限制,在 Windows 平台上,TeX 涉及到的文件(包括
.tex
,.jpg
等各类文件)都不要包含中文名字。否则,在编译时可能会因为编码问题导致稀奇古怪的报错。
此处的第一行 \documentclass{article}
中包含了一个控制序列(或称命令/标记)。所谓控制序列,是以反斜杠" \
"开头,以第一个空格或非字母 的字符结束的一串文字。它们不被输出,但是他们会影响输出文档的效果。这里的控制序列是 documentclass
,它后面紧跟着的 {article}
代表这个控制序列有一个必要的参数,该参数的值为 article
。这个控制序列的作用,是调用名为 article
的文档类。
请注意,TeX 对控制序列的大小写是敏感的。
部分控制序列还有被方括号
[]
包括的可选参数。所谓文档类,即是 TeX 系统预设的(或是用户自定的)一些格式的集合。不同的文档类在输出效果上会有差别。
此处的第二行以" %
"开头。TeX 以百分号 %
作为注释标记。具体来说,TeX 会忽略从 %
开始到当前行末尾的所有内容。这些内容不会被输出,也不影响最终排版效果,只供人类阅读。若要输出 %
字符本身,则需要在 %
之前加上反斜杠 \
进行转义(escape)。
在注释行之后出现了控制序列 begin
。这个控制序列总是与 end
成对出现。这两个控制序列以及他们中间的内容被称为「环境」;它们之后的第一个必要参数总是一致的,被称为环境名。只有在 document
环境中的内容,才会被正常输出到文档中去,或是作为控制序列对文档产生影响,也就是说,在 \end{document}
之后插入任何内容都是无效的。
从 \documentclass{article}
开始到 \begin{document}
之前的部分被称为导言区。可以将导言区理解为是对整篇文档进行设置的区域——在导言区出现的控制序列,往往会影响整篇文档的格式。比如,我们通常在导言区设置页面大小、页眉页脚样式、章节标题样式等等。
5.3.2 实现中英文混排
关于 LaTeX 的中文支持,首先要说的是:在现在,一切教你使用
CJK
宏包的模板、人、网页、书,都是糟糕的、有害的、恼人的、邪恶的和应该摒弃的。
成功编译输出第一个文档之后,中国 TeX 用户面临的第二个普遍问题大概就是「实现中英文混排」了。众所周知,TeX 系统是高教授开发的。在 TeX 开发当初并没有考虑到亚洲文字的问题。因此早期的 TeX 系统并不能直接支持中文,必须要用其他工具先处理一下(或者是一些宏包之类的)。但是现在,XeTeX 原生支持 Unicode,并且可以方便地调用系统字体。可以说解决了困扰中国 TeX 使用者多年的大问题。至此,我们只需要使用几个简单的宏包,就能完成中文支持了。
所谓宏包,就是一系列控制序列的合集。这些控制序列太常用,以至于人们会觉得每次将他们写在导言区太过繁琐,于是将他们打包放在同一个文件中,成为所谓的宏包(台湾方面称之为「巨集套件」)。
\usepackage{}
可以用来调用宏包。
除去中文支持,中文的版式处理和标点禁则也是不小的挑战。好在由吴凌云和江疆牵头,现在主要由刘海洋、李清和“我”维护的 CTeX
宏集一次性解决了这些问题。CTeX
宏集的优势在于,它能适配于多种编译方式;在内部处理好了中文和中文版式的支持,隐藏了这些细节;并且,提供了不少中文用户需要的功能接口。我们来看如何使用 CTeX
宏集来处理中英文混排的文档。
请注意,
CTeX
宏集和CTeX
套装是两个不同的东西。CTeX
宏集本质是 LaTeX 宏的集合,包含若干文档类(.cls
文件)和宏包(.sty
文件)。CTeX
套装是一个过时的 TeX 系统。新版
CTeX
宏集的默认能够自动检测用户的操作系统,并为之配置合适的字库。对于 Windows 用户、Mac OS X 用户和 Linux 用户,都无需做任何配置,就能使用CTeX
宏集来排版中文。[2015-05-20 更新]
在 TeXworks 编辑框中输入以下内容,以 UTF-8 编码保存,使用 XeLaTeX 编译:
\documentclass[UTF8]{ctexart}
\begin{document}
你好,world!
\end{document}
如果没有意外,你将会看到类似下图的输出结果。
相较于之前的例子,这份代码只有细微的差异:
- 文档类从
article
变为ctexart
; - 增加了文档类选项
UTF8
。
你也可以直接使用 xeCJK
宏包来支持中英文混排。不过大多数情况是不推荐这样做的。因此,如果你能抑制住你小小的好奇心,可以暂时略过这一段,回头再看不迟。
在 TeXworks 编辑框中输入以下内容,保存,使用 XeLaTeX 编译:
\documentclass{article}
\usepackage{xeCJK} %调用 xeCJK 宏包
\setCJKmainfont{SimSun} %设置 CJK 主字体为 SimSun (宋体)
\begin{document}
你好,world!
\end{document}
如果一切顺利,你将会在屏幕右边的窗口,看见类似下图的输出结果。
除了 “document” 环境中同时出现了中文和英文,和最原始的 Hello, world! 不同点在于,导言区中多出了两条控制序列。他们的作用我已经用注释标出了。\setCJKmainfont{·}
是定义在 “xeCJK” 宏包中的控制序列,它可以用来设置 CJK 主字体。
5.4 组织自己的文章
5.4.1 作者、标题、日期
保存并用 XeLaTeX 编译如下文档,查看效果:
\documentclass[UTF8]{ctexart}
\title{你好,world!}
\author{Dong}
\date{\today}
\begin{document}
\maketitle
你好,world!
\end{document}
导言区复杂了很多,但和之前的文档主要的区别只有一处:定义了标题、作者、日期。
在 document
环境中,除了原本的 你好,world!
,还多了一个控制序列 maketitle
。这个控制序列能将在导言区中定义的标题、作者、日期按照预定的格式展现出来。
使用
titling
宏包可以修改上述默认格式。参考TeXdoc。
5.4.2 章节和段落
保存并用 XeLaTeX 编译如下文档,查看效果:
\documentclass[UTF8]{ctexart}
\title{你好,world!}
\author{Dong}
\date{\today}
\begin{document}
\maketitle
\section{你好中国}
中国在East Asia.
\subsection{Hello Beijing}
北京是capital of China.
\subsubsection{Hello Dongcheng District}
\paragraph{Tian'anmen Square}
is in the center of Beijing
\subparagraph{Chairman Mao}
is in the center of 天安门广场。
\subsection{Hello 辽宁}
\paragraph{大连理工} is one of the best university in 辽宁。
\end{document}
在文档类 article
/ctexart
中,定义了五个控制序列来调整行文组织结构。他们分别是
\section{·}
\subsection{·}
\subsubsection{·}
\paragraph{·}
\subparagraph{·}
在
report
/ctexrep
中,还有\chapter{·}
;在文档类book
/ctexbook
中,还定义了\part{·}
。
5.4.3 插入目录
在上一节的文档中,找到 \maketitle
,在它的下面插入控制序列 \tableofcontents
,保存并用 XeLaTeX 编译两次,观察效果:
\documentclass[UTF8]{ctexart}
\title{你好,world!}
\author{Dong}
\date{\today}
\begin{document}
\maketitle
\tableofcontents
\section{你好中国}
中国在East Asia.
\subsection{Hello Beijing}
北京是capital of China.
\subsubsection{Hello Dongcheng District}
\paragraph{Tian'anmen Square}
is in the center of Beijing
\subparagraph{Chairman Mao}
is in the center of 天安门广场。
\subsection{Hello 辽宁}
\paragraph{大连理工} is one of the best university in 辽宁。
\end{document}
试试交换
\maketitle
和\tableofcontents
的顺序,看看会发生什么,想想为什么。
请注意,在「你好中国」这一节中,两次「中国在East Asia.」中夹有一个空行,但输出却只有一个换行并没有空行。这是因为 LaTeX 将一个换行当做是一个简单的空格来处理,如果需要换行另起一段,则需要用两个换行(一个空行)来实现。
5.4.4 论文格式控制
论文格式的命令控制语法和类似于HTML的标签式语言
下面列举一些常用的排版格式控制语句:
5.4.4.1 整体格式控制
\ begin{XXX}…..\end{XXX} | 表示一个段落,XXX填document表示整篇文章,abstract表示摘要。。。 |
\newpage | 新起一页 |
\setcounter{page}{1} | 设置页码计数器从当前页面开始之后每页自动加上页码 |
\section{XXX} | 段落,XXX为段落标题 |
\subsection{XXX} | 子段落 |
5.4.4.2 语句编辑
\indent……. | 缩进 |
\noindent | 不缩进(如果本身就没有缩进就不用加) |
\\ | 换行,不另起一段 |
\par | 换行,另起一段(首行缩进) |
\bf | 加粗 |
{…} | 语句块,和之前latex数学符号中的作用类似 |
$…$ | 行内数学公式 |
\url | 加入超链接(一般用于参考文献那里) |
5.4.4.3 插入图片
\centerline{\includegraphics[height=X.Xcm]{图片名.后缀名}} | 插入图片设置图片高度(大小),要插入的图片放在figures文件夹里面 |
\centerline{XXXX} | 图片下方文字标注 |
5.4.4.4 插入表格
\ begin{table}…\end{table} | 插入表格块控制语句 |
\ begin{tabular}{{p{3cm}|p{3cm}|p{3cm}|p{3cm}}… \end{tabular} | 控制表格每一列的宽度 |
\centering | 居中 |
\hline | 表格每一行的的横线 |
& | 表示表格一行中的 |
\\ | 表格中一行的结束 |
\rowcolor[gray]{0.9} | 设置一行的颜色 |
上面的控制语句需要在文档开头添加上相对应的包(package):
\usepackage{palatino} | 字体 |
\usepackage{graphicx} | 图片 |
\usepackage{tabularx} | 表格 |
5.5 插入数学公式
首先恭喜你看到这里。如果前面的几个文档你都认真编译过了,那么你已经可以胜任许多文档的排版工作。下面我们进入 LaTeX 最为犀利的部分。
这部分的演示中,为了节省篇幅,将取消导言区中中文支持的部分。在实际使用中,你只需要将导言区中的相关部分加上,就可以同时使用中文和编写数学公式了。
为了使用 AMS-LaTeX 提供的数学功能,我们需要在导言区加载 amsmath
宏包
更多的数学符号表示可以参考网上一份总结:http://www.mohu.org/info/symbols/symbols.htm
5.5.1 数学模式
LaTeX 的数学模式有两种:行内模式 (inline) 和行间模式 (display)。前者在正文的行文中,插入数学公式;后者独立排列单独成行,并自动居中。
在行文中,使用 $ ... $
可以插入行内公式,使用 \[ ... \]
可以插入行间公式,如果需要对行间公式进行编号,则可以使用 equation
环境:
\begin{equation}
...
\end{equation}
行内公式也可以使用
\(...\)
或者\begin{math} ... \end{math}
来插入,但略显麻烦。
无编号的行间公式也可以使用\begin{displaymath} ... \end{displaymath}
或者\begin{equation*} ... \end{equation*}
来插入,但略显麻烦。(equation*
中的*
表示环境不编号)
也有 plainTeX 风格的$$ ... $$
来插入不编号的行间公式。但是在 LaTeX 中这样做会改变行文的默认行间距,不推荐。请参考我的回答。
5.5.2 上下标
示例代码(请保存后,使用 XeLaTeX 编译,查看效果):
\documentclass{article}
\usepackage{amsmath}
\begin{document}
Einstein 's $E=mc^2$.
\[ E=mc^2. \] % 注意看空行
\begin{equation}
E=mc^2.
\end{equation}
\end{document}
在这里提一下关于公式标点使用的规范。行内公式和行间公式对标点的要求是不同的:行内公式的标点,应该放在数学模式的限定符之外,而行间公式则应该放在数学模式限定符之内。
在数学模式中,需要表示上标,可以使用 ^
来实现(下标则是 _
)。它默认只作用于之后的一个字符,如果想对连续的几个字符起作用,请将这些字符用花括号 {}
括起来,例如:
\[ z = r\cdot e^{2\pi i}. \]
5.5.3 根式与分式
根式用 \sqrt{·}
来表示,分式用 \frac{·}{·}
来表示(第一个参数为分子,第二个为分母)。
示例代码(请保存后,使用 XeLaTeX 编译,查看效果):
\documentclass{article}
\usepackage{amsmath}
\begin{document}
$\sqrt{x}$, $\frac{1}{2}$.
\[ \sqrt{x}, \]
\[ \frac{1}{2}. \]
\end{document}
可以发现,在行间公式和行内公式中,分式的输出效果是有差异的。如果要强制行内模式的分式显示为行间模式的大小,可以使用 \dfrac
, 反之可以使用 \tfrac
。
在行内写分式,你可能会喜欢
xfrac
宏包提供的\sfrac
命令的效果。排版繁分式,你应该使用
\cfrac
命令。
5.4.4 运算符
一些小的运算符,可以在数学模式下直接输入;另一些需要用控制序列生成,如
\[ \pm\; \times \; \div\; \cdot\; \cap\; \cup\;
\geq\; \leq\; \neq\; \approx \; \equiv \]
连加、连乘、极限、积分等大型运算符分别用 \sum
, \prod
, \lim
, \int
生成。他们的上下标在行内公式中被压缩,以适应行高。我们可以用 \limits
和 \nolimits
来强制显式地指定是否压缩这些上下标。例如:
$ \sum_{i=1}^n i\quad \prod_{i=1}^n $
$ \sum\limits _{i=1}^n i\quad \prod\limits _{i=1}^n $
\[ \lim_{x\to0}x^2 \quad \int_a^b x^2 dx \]
\[ \lim\nolimits _{x\to0}x^2\quad \int\nolimits_a^b x^2 dx \]
多重积分可以使用 \iint
, \iiint
, \iiiint
, \idotsint
等命令输入。
\[ \iint\quad \iiint\quad \iiiint\quad \idotsint \]
5.4.5 定界符(括号等)
各种括号用 ()
, []
, \{\}
, \langle\rangle
等命令表示;注意花括号通常用来输入命令和环境的参数,所以在数学公式中它们前面要加 \
。因为 LaTeX 中 |
和 \|
的应用过于随意,amsmath 宏包推荐用 \lvert\rvert
和 \lVert\rVert
取而代之。
为了调整这些定界符的大小,amsmath 宏包推荐使用 \big
, \Big
, \bigg
, \Bigg
等一系列命令放在上述括号前面调整大小。
有时你可能会觉得 amsmath 宏包提供的定界符放大命令不太够用。通常这意味着你的公式太过复杂。此时你应当首先考虑将公式中的部分提出去,以字母符号代替以简化公式。如果你真的想要排版如此复杂的公式,你可以参考我这篇博文。
\[ \Biggl(\biggl(\Bigl(\bigl((x)\bigr)\Bigr)\biggr)\Biggr) \]
\[ \Biggl[\biggl[\Bigl[\bigl[[x]\bigr]\Bigr]\biggr]\Biggr] \]
\[ \Biggl \{\biggl \{\Bigl \{\bigl \{\{x\}\bigr \}\Bigr \}\biggr \}\Biggr\} \]
\[ \Biggl\langle\biggl\langle\Bigl\langle\bigl\langle\langle x
\rangle\bigr\rangle\Bigr\rangle\biggr\rangle\Biggr\rangle \]
\[ \Biggl\lvert\biggl\lvert\Bigl\lvert\bigl\lvert\lvert x
\rvert\bigr\rvert\Bigr\rvert\biggr\rvert\Biggr\rvert \]
\[ \Biggl\lVert\biggl\lVert\Bigl\lVert\bigl\lVert\lVert x
\rVert\bigr\rVert\Bigr\rVert\biggr\rVert\Biggr\rVert \]
5.4.6 省略号
省略号用 \dots
, \cdots
, \vdots
, \ddots
等命令表示。\dots
和 \cdots
的纵向位置不同,前者一般用于有下标的序列。
\[ x_1,x_2,\dots ,x_n\quad 1,2,\cdots ,n\quad
\vdots\quad \ddots \]
5.4.7 矩阵
amsmath
的 pmatrix
, bmatrix
, Bmatrix
, vmatrix
, Vmatrix
等环境可以在矩阵两边加上各种分隔符。
\[ \begin{pmatrix} a&b\\c&d \end{pmatrix} \quad
\begin{bmatrix} a&b\\c&d \end{bmatrix} \quad
\begin{Bmatrix} a&b\\c&d \end{Bmatrix} \quad
\begin{vmatrix} a&b\\c&d \end{vmatrix} \quad
\begin{Vmatrix} a&b\\c&d \end{Vmatrix} \]
使用 smallmatrix
环境,可以生成行内公式的小矩阵。
Marry has a little matrix $ ( \begin{smallmatrix} a&b\\c&d \end{smallmatrix} ) $.
5.4.8 多行公式
有的公式特别长,我们需要手动为他们换行;有几个公式是一组,我们需要将他们放在一起;还有些类似分段函数,我们需要给它加上一个左边的花括号。
5.4.8.1 长公式
5.4.8.1.1 不对齐
无须对齐的长公式可以使用 multline
环境。
\begin{multline}
x = a+b+c+{} \\
d+e+f+g
\end{multline}
如果不需要编号,可以使用 multline*
环境代替。
5.4.8.1.2 对齐
需要对齐的公式,可以使用 aligned
次环境来实现,它必须包含在数学环境之内。
\[\begin{aligned}
x ={}& a+b+c+{} \\
&d+e+f+g
\end{aligned}\]
5.4.8.2 公式组
无需对齐的公式组可以使用 gather
环境,需要对齐的公式组可以使用 align
环境。他们都带有编号,如果不需要编号可以使用带星花的版本。
\begin{gather}
a = b+c+d \\
x = y+z
\end{gather}
\begin{align}
a &= b+c+d \\
x &= y+z
\end{align}
请注意,不要使用
eqnarray
环境。原因可以参考:
5.4.8.3 分段函数
分段函数可以用cases
次环境来实现,它必须包含在数学环境之内。
\[ y= \begin{cases}
-x,\quad x\leq 0 \\
x,\quad x>0
\end{cases} \]
5.5 插入图片和表格
5.5.1 图片
关于 LaTeX 插图,首先要说的是:「LaTeX 只支持 .eps
格式的图档」这个说法是错误的。
在 LaTeX 中插入图片,有很多种方式。最好用的应当属利用 graphicx
宏包提供的 \includegraphics
命令。比如你在你的 TeX 源文件同目录下,有名为 a.jpg
的图片,你可以用这样的方式将它插入到输出文档中:
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{a.jpg}
\end{document}
图片可能很大,超过了输出文件的纸张大小,或者干脆就是你自己觉得输出的效果不爽。这时候你可以用 \includegraphics
控制序列的可选参数来控制。比如
\includegraphics[width = .8\textwidth]{a.jpg}
这样图片的宽度会被缩放至页面宽度的百分之五十,图片的总高度会按比例缩放。
\includegraphics
控制序列还有若干其他的可选参数可供使用,一般并用不到。感兴趣的话,可以去查看该宏包的文档。
5.5.2 表格
tabular
环境提供了最简单的表格功能。它用 \hline
命令表示横线,在列格式中用 |
表示竖线;用 &
来分列,用 \\
来换行;每列可以采用居左、居中、居右等横向对齐方式,分别用 l
、c
、r
来表示。
\begin{tabular}{|l|c|r|}
\hline
操作系统& 发行版& 编辑器\\
\hline
Windows & MikTeX & TexMakerX \\
\hline
Unix/Linux & teTeX & Kile \\
\hline
Mac OS & MacTeX & TeXShop \\
\hline
通用& TeX Live & TeXworks \\
\hline
\end{tabular}
5.5.3 浮动体
插图和表格通常需要占据大块空间,所以在文字处理软件中我们经常需要调整他们的位置。figure
和 table
环境可以自动完成这样的任务;这种自动调整位置的环境称作浮动体(float)。我们以 figure
为例。
\begin{figure}[htbp]
\centering
\includegraphics{a.jpg}
\caption{有图有真相}
\label{fig:myphoto}
\end{figure}
htbp
选项用来指定插图的理想位置,这几个字母分别代表 here, top, bottom, float page,也就是就这里、页顶、页尾、浮动页(专门放浮动体的单独页面或分栏)。\centering
用来使插图居中;\caption
命令设置插图标题,LaTeX 会自动给浮动体的标题加上编号。注意 \label
应该放在标题命令之后。
图片和表格的各种特殊效果,限于篇幅此处无法详叙。请查看最后一章推荐的文档。
如果你想了解 LaTeX 的浮动体策略算法细节,你可以参考我博客中关于浮动体的系列文章
如果你困惑于「为什么图表会乱跑」或者「怎样让图表不乱跑」,请看我的回答。
5.6 版面设置
5.6.1 页边距
设置页边距,推荐使用 geometry
宏包。可以在这里查看它的说明文档。
比如我希望,将纸张的长度设置为 20cm、宽度设置为 15cm、左边距 1cm、右边距 2cm、上边距 3cm、下边距 4cm,可以在导言区加上这样几行:
\usepackage{geometry}
\geometry{papersize={20cm,15cm}}
\geometry{left=1cm,right=2cm,top=3cm,bottom=4cm}
5.6.2 页眉页脚
设置页眉页脚,推荐使用 fancyhdr
宏包。可以在这里查看它的说明文档。
比如我希望,在页眉左边写上我的名字,中间写上今天的日期,右边写上我的电话;页脚的正中写上页码;页眉和正文之间有一道宽为 0.4pt 的横线分割,可以在导言区加上如下几行:
\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead{\author}
\chead{\date}
\rhead{152xxxxxxxx}
\lfoot{}
\cfoot{\thepage}
\rfoot{}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\headwidth}{\textwidth}
\renewcommand{\footrulewidth}{0pt}
5.6.3 首行缩进
CTeX 宏集已经处理好了首行缩进的问题(自然段前空两格汉字宽度)。因此,使用 CTeX 宏集进行中西文混合排版时,我们不需要关注首行缩进的问题。
如果你因为某些原因选择不适用 CTeX 宏集(不推荐)进行中文支持和版式设置,则你需要做额外的一些工作。
- 调用
indentfirst
宏包。具体来说,中文习惯于每个自然段的段首都空出两个中文汉字的长度作为首行缩进,但西文行文习惯于不在逻辑节(\section
等)之后缩进。使用改宏包可使 LaTeX 在每个自然段都首行缩进。- 设置首行缩进长度
\setlength{\parindent}{2\ccwd}
。其中\ccwd
是xeCJK
定义的宏,它表示当前字号中一个中文汉字的宽度。
5.6.4 行间距
我们可以通过 setspace
宏包提供的命令来调整行间距。比如在导言区添加如下内容,可以将行距设置为字号的 1.5 倍:
\usepackage{setspace}
\onehalfspacing
具体可以查看该宏包的文档。
请注意用词的差别:
- 行距是字号的 1.5 倍;
- 1.5 倍行距。
事实上,这不是设置 1.5 倍行距的正确方法,请参考这篇博文。另外,RuixiZhang 开发了 zhlineskip 宏包,提供了对中西文混排更细致的行距控制能力。
5.6.5 段间距
我们可以通过修改长度 \parskip
的值来调整段间距。例如在导言区添加以下内容
\addtolength{\parskip}{.4em}
则可以在原有的基础上,增加段间距 0.4em。如果需要减小段间距,只需将该数值改为负值即可。
5.7 TeX 家族
现在我们说一点历史,帮助你更好地理解 TeX 这个系统。
带有 TeX 的词,仅仅是本文就已经提到了 TeX, LaTeX, XeLaTeX。通常中国学生面对不了解意思的一群形近单词,都会有一种「本能的恐惧」(笑~)。因此,「大神们」在为新手介绍 TeX 的时候,如果互相争论 「XXTeX 比 YYTeX 好」或者是「XXTeX 的 YYTeX 如何如何」,往往会蹦出下面这些带有 TeX 的词汇:
TeX, pdfTeX, XeTeX, LuaTeX, LaTeX, pdfLaTeX, XeLaTeX …
事实上,这部分的内容太过复杂,我自己的了解也实在有限。所以下面这部分的内容也只能是对我了解到的知识的一个概括,甚至可能有些许谬误。所以大家只需要将这部分的内容当做是一个参考就可以了。
5.7.1 TeX - LaTeX
TeX 是高德纳(Donald Ervin Knuth,1938年1月10日 –)教授愤世嫉俗追求完美做出来的排版引擎,同时也是该引擎使用的标记语言(Markup Language)的名称。这里所谓的引擎,是指能够实现断行、分页等操作的程序(请注意这并不是定义);这里的标记语言,是指一种将控制命令和文本结合起来的格式,它的主体是其中的文本而控制命令则实现一些特殊效果(同样请注意这并不是定义)。
你可以在这里找到关于 TeX 引擎的具体描述;
你可以在这里找到关于标记语言的具体描述。
而 LaTeX 则是 L. Lamport (1941年2月7日 – ) 教授开发的基于 TeX 的排版系统。实际上 LaTeX 利用 TeX 的控制命令,定义了许多新的控制命令并封装成一个可执行文件。这个可执行文件会去解释 LaTeX 新定义的命令成为 TeX 的控制命令,并最终交由 TeX 引擎进行排版。
实际上,LaTeX 是基于一个叫做 plain TeX 的格式的。plain TeX 是高德纳教授为了方便用户,自己基于原始的 TeX 定义的格式,但实际上 plain TeX 的命令仍然十分晦涩。至于原始的 TeX 直接使用的人就更少了,因此 plain TeX 格式逐渐就成为了 TeX 格式的同义词,尽管他们事实上是不同的。
因此在 TeX - LaTeX 组合中,
- 最终进行断行、分页等操作的,是 TeX 引擎;
- LaTeX 实际上是一个工具,它将用户按照它的格式编写的文档解释成 TeX 引擎能理解的形式并交付给 TeX 引擎处理,再将最终结果返回给用户。
5.7.2 pdfTeX - pdfLaTeX
TeX 系统生成的文件是 dvi 格式,虽然可以用其他程序将其转换为例如 pdf 等更为常见的格式,但是毕竟不方便。
dvi 格式是为了排版而产生的,它本身并不支持所谓的「交叉引用」,pdfTeX 直接输出 pdf 格式的文档,这也是 pdfTeX 相对 TeX 进步(易用性方面)的地方。
为了解决这个问题,Hàn Thế Thành 博士在他的博士论文中提出了 pdfTeX 这个对 TeX 引擎的扩展。二者最主要的差别就是 pdfTeX 直接输出 pdf 格式文档,而 TeX 引擎则输出 dvi 格式的文档。
pdfTeX 的信息可以查看wiki.
pdfLaTeX 这个程序的主要工作依旧是将 LaTeX 格式的文档进行解释,不过此次是将解释之后的结果交付给 pdfTeX 引擎处理。
5.7.3 XeTeX - XeLaTeX
高德纳教授在实现 TeX 的当初并没有考虑到中日韩等字符的处理,而只支持 ASCII 字符。这并不是说中日韩字符就无法使用 TeX 引擎排版了,事实上 TeX 将每个字符用一个框包括起来(这被称为盒子)然后将一个个的盒子按照一定规则排列起来,因而 TeX 的算法理论上适用于任何字符。ASCII 字符简单理解,就是在半角模式下你的键盘能直接输出的字符。
在 XeTeX 出现之前,为了能让 TeX 系统排版中文,国人曾使用了 天元、CCT、CJK 等手段处理中文。其中 天元和CCT 现在已经基本不用,CJK 因为使用时间长且效果相对较好,现在还有人使用。
不同于 CJK 等方式使用 TeX 和 pdfTeX 这两个不直接支持 Unicode 字符的引擎,XeTeX 引擎直接支持 Unicode 字符。也就是说现在不使用 CJK 也能排版中日韩文的文档了,并且这种方式要比之前的方式更加优秀。
XeLaTeX 和 XeTeX 的关系与 pdfLaTeX 和 pdfTeX 的关系类似,这里不再赘述。
使用 XeTeX 引擎需要使用 UTF-8 编码。
所谓编码就是字符在计算机储存时候的对应关系。例如,假设有一种编码,将汉字「你」对应为数字「1」;「好」对应为数字「2」,则含有「你好」的纯文本文件,在计算机中储存为「12」(读取文件的时候,将「12」再转换为「你好」显示在屏幕上或打印出来)。
UTF-8 编码是 Unicode 编码的一种,可以参考它的 wiki.
5.7.4 LuaTeX
LuaTeX 是正在开发完善的一个 TeX 引擎,相对它的前辈们还相当的不完善,这里不赘述。
5.7.5 CTeX - MiKTeX - TeX Live
之前介绍了 TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX 等,他们都是 TeX 家族的一部分。但是作为一个能够使用的 TeX 系统,仅仅有他们还是不够的。CTeX, MiKTeX, TeX Live 都是被称为「发行」的软件合集。他们包括了上述各种引擎的可执行程序,以及一些文档类、模板、字体文件、辅助程序等等。其中 CTeX 是建立在 MiKTeX 的基础之上的。
5.7.6 总结
TeX - pdfTeX - XeTeX - LuaTeX 都是排版引擎,按照 先进程度 递增(LuaTeX 尚未完善)。
LaTeX 是一种格式,基于 TeX 格式定义了很多更方便使用的控制命令。上述四个引擎都有对应的程序将 LaTeX 格式解释成引擎能处理的内容。
CTeX, MiKTeX, TeX Live 都是 TeX 的发行,他们是许许多多东西的集合。
6. 用 VS Code 写LaTeX
Visual Studio Code 简称 VSCode,由微软开发的全平台集成开发软件。
VSCode,所有的配置都在
settings.json
中,使用者会更加明白发生了什么,包括默认设置做了什么
在 VS Code 点选左侧扩展按钮,在展开的扩展栏顶端搜索 LaTeX Workshop,搜到后点击安装。
该扩展是当前编译 LaTeX 的全部依赖,微软官方的 LaTeX Language Support 已经停止开发。
使用方法可以通过 F1 或者 Ctrl/Cmd
+Shift
+p
命令快捷方式中,搜索 latex workshop 获得。
如下设置可实现 xelatex -> bibtex -> xelatex * 2 编译。
使用 " Ctrl/Cmd
+ ,
" 命令打开设置窗口,可以看到左边是用户设置,右边是工作区设置,用户设置会覆盖默认设置,并应用于所有工作区、项目,而工作区设置会覆盖用户设置,但仅在此项目中产生作用,我们要修改的是以下设置 (注意缩进):
"latex-workshop.latex.magic.args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
],
主(根)tex文件开头,用魔法注释 ( Magic Comment ) 设置 tex 及 bib 编译命令。
% !TEX program = xelatex
% !BIB program = bibtex
非主(根)tex文件首行,建议用魔法注释定义主(根) tex 文件:
% !TEX root = 主文件绝对/相对路径
该方法删除了之前冗余的 recipes 及 tools 的解释与配置,现在的魔法注释完全可以代替之前的方案,并且更加方便快捷