为什么需要LaTeX?
老实说,最开始还是为了能够更好的编排论文(毕竟这也是LaTeX诞生的初衷。之前大学毕业论文用的word,修改图片和增加文献之类的真的很繁琐)。
其次是我看到它也能够用来编排书籍、生成PPT(工作汇报)、编写技术文档(这点存疑)甚至是之后可能工作了之后把自己遇到的难题的解决方法撰写成论文?
总之感觉为了肝毕设学习一下应该就不亏了,而且技多不压身,在这个契机之下,打算简单入个门。
所用书籍是刘海洋的《LaTeX入门》,这本书个人感觉简单翻阅一遍即可,不需要认真阅读,当有问题的时候回来再看即可。
熟悉LaTeX
发展史
LaTeX是基于TeX发展而来的,而TeX则是Donald Ervin Knuth教授为了编写自己的巨著而创造出来的,在TeX的基础之上,Lamport博士又做了一些改动,于是就有了LaTeX。
Hello LaTeX
下载了TeXLive,花了大概3小时,然后又花了大概2个多小时的安装,我终于成功安装上了这个套装,然后开始了我的第一个LaTeX编写:
1 | \documentclass[UTF8]{ctexart} |
点击运行,成功生成了我的第一篇LaTeX输出的PDF。
简单分析
成功生成了PDF之后,你会发现目录底下有很多的文件,看的自己摸不着头脑,下面是对这些文件的简单说明:
.tex,这个就是用来写作的内容。.bib,bibligraphy,在这个文件中写入参考文献,就可以直接在正文中引用了。.bbl,bib文件编译之后生成的文件。.sty,包文件,可以通过usepackage来进行导入。.cls,类文件,直接使用documentclass来进行导入。
正经的一篇小短文
我们写文章,一般会在脑子中构思好文章的大纲,然后首先写好大纲,再开始对文章的内容进行补充。
在LaTeX中,直接的单个换行并不会输出换行,而是需要用一整个空的行来代表换行。同时每一段也不需要空格,LaTeX会自动帮你完成缩进。当然就算你段前打了空格,也是无用功。
两个汉字之间的空格会被忽略,但是两个英文字母之间的空格却会被保留。
脚注和引用
脚注其实很容易——要增加脚注的内容\footnote{脚注的内容},从脚注我们可以发现一个LaTeX命令(也叫宏)的规律——命令都是用\开头,然后接着命令参数,命令参数用花括号括起来,如果参数是可选的,那么就使用方括号[]括起来。
同样的,如果是想引用,那么就使用\begin{quote}开始引用,用\end{quote}结束。
有些命令只会在原地发生效果,但是有的命令会影响后面所有的文字,直到分组的结束,而这种影响到分组的就叫做声明。我们可以通过分组来限定声明的作用范围,显然整个LaTeX中最大的分组就是一开始声明的document环境。所以用\begin开始的就是一个环境。
数学公式
最简单的数学公式就是用的$数学公式$,这种公式是夹杂在行内的。还有的公式是单独搞成一行,并且进行居中,可能还会有数字标号,当然这个不是本章的重点。
插入图片和表格
图片一般都是由外部提供,基本不会靠着LaTeX来做图。当然由于图片并不能直接被LaTeX内核提供,所以我们需要导入宏包来进行使用。
表格则一般都是通过LaTeX来进行完成的,规则和Markdown差不太多,感觉还行。
成品
1 | %-*- coding: UTF-8 -*- |
第二章 组织文本
2.1 文字与符号
LaTeX对于键盘上的所有26个字母的大小写输出当然是不在话下,直接输入即可输出。对于超过ASCII码的那些诸如希腊字母、俄文字母等的,因为现代的LaTeX直接支持了utf-8,所以也可以直接输入,LaTeX也能够直接输出。
如果需要特别特殊的字母,可以使用babel宏包来解决。
英文的有的时候可能会有连字,比如ff就可能会被连,如果不希望连字,可以使用f{}f或者是f\/f来取消连字。
符号方面,推荐每个标点符号之后都加一个空格,保证正确的距离和换行。在LaTeX中,如果需要使用双引号(英文),那么就连续打两个单引号,如果双引号之内还想打单引号,可以用\,作为分隔。除此之外,在LaTeX中,一个-代表的是连字符,两个可以用来代表数字范围,三个可以用来代表破折号。在LaTeX中,英文的省略号用的是\dots来表示,而不要手动输入三个.
还有一些符号由于有特殊的作用,并不能直接输入,而是要用反斜杠来进行转义才可以输入。而~和^则更加的特殊,直接用反斜杠转义都不行,需要\^{}和\~{}来输出,不过平时也基本用不到。
空格的话,多个空格和单个空格的作用是一样的,且行首开始的空格都是被忽略的。一般的命令,后面的空格会被忽略,如果确实要在后面加空格,可用反斜杠加空格。
LaTeX对于西文的句子末尾的句号(点号)和用于缩写的点号处理是不同的,LaTeX会简单认为大写字母后面的点号是缩写用的,而小写后面的点号则是句子末尾,但是有的时候确实会出现大写字母结尾的例子,此时可以强制使用\@来使用。
汉字后面的空格是会被忽略的,其实是xelatex自动帮忙生成了空格。如果希望强制忽略空格,可以把汉字放到一个盒子里面。
字体(没特殊需要建议跳过)
文字的最终输出效果,除了它本身的内容外,还可以通过字号、字体编码(字体包含的符号,几乎不需要手动指定)、字体族(默认三种)、字体形状(如斜体)和字体系列(如加粗等)。
不过如果是在书写论文的时候,一般论文都会自动帮忙设定好字体包,所以这个不需要担心。比较实用的是比如某段文字希望改成Italic形式的,可以用textit{abc}临时修改,挺方便的。
而对于中文来说就更加简单了,基本上只需要设置好字体族就可以了,因为中文本身没有变体,所以一般设置正文为宋体,粗体用黑体来代替,斜体用楷书来代替。
\emph命令表示强调,用于把直立体改成意大利体,把意大利体改成直立体。当然更强的强调也可以用加粗\textbf来表示,也可以使用下划线\underline来进行表示,不过这个下划线稍微有点问题,可以通过使用ulem宏包来进行解决。
字号和行距
字号本身来说是很简单的,同时LaTeX也提供了10种标准的声明式命令来调整文字的大小。而LaTeX中的行距是与字号息息相关的,因为基本行距为文字大小的1.2倍。而行距的定义如下图所示:

不论是在word中,还是在LaTeX中,我们都可以通过修改因子来修改行距(在LaTeX中是通过\linespread),但是基本行距是不发生变化的。
如果是水平距离,LaTeX提供了一组命令来对水平距离进行控制,分成断行和不断行的。
同时也需要理解,其实在LaTeX中,用的就是一个个盒子来进行表示的。
2.2 段落与文本环境
每个段落LaTeX有自己的缩进,可以通过\parindent来进行设置。对于段落来说,最重要的应该就是对齐方式了,默认是两端对齐的,如果要左对齐的话,命令是raggedright。在书写英文方面,LaTeX会自动帮忙做断词处理。
其他诸如首字下沉等,可以通过悬挂缩进等解决。
文本环境
LaTeX提供了三种文本环境,分别是引用环境(quote和quotation)、诗歌环境(verse)以及摘要环境(abstract),现成提供的,直接使用就可以了。
列表环境
列表在实际使用中,也是三种,分别是不带编号的(用一个点号代替,itemize)、带编号(enumerate)的和自己设置的(description)。
当然表格之间都是可以进行嵌套的,这里容易出问题,就是如果系统自带的编号不能满足需要的时候,要能够自己定制编号。
enumerate环境的编号其实是由一组计数器进行控制的,每当它进入到一个enumerate环境中的时候,计数器会清零,并且当遇到一个\item的时候会自动让计数器加一,而enumerate环境默认有四个计数器,分别是enumi、enumii、enumiii和enumiv这三个,可以根据自己的需要自己设置。
计数器除了用在这个地方,其他诸如表格、图片、页码这种需要计数的地方也都是用的计数器,而且如果希望能够得到计数器的值,只需要在前面加上the即可。通过对计数器进行自定义,可以玩出花来,比如实现一个计数器自增另外一个计数器清零(用于章节计数)
定理环境
有的时候会在论文中引用某个定理之类的东西,可以定义环境来输出定理。
如果有的时候我们需要在每一章中进行定理的说明,并且随着章节的更新而更新,那么可以在最后加上一个可选参数,说明随着它的变化而清零。
如果默认的定理环境并不能满足要求,可以自己通过引入theorem来进行定制。
摘录和代码
简单的符号可以通过简单的转义符得到,那要是大段的文字,就可以用\verb或者是\verbatim来进行输出。
如果是希望代码能够得到高亮输出,可以使用listings宏包来解决。
tabbing环境
其实就是简单的无线表格环境,但是实际操作起来比较复杂,可以应用在算法上面。但是如果真的要表示算法的话,还是推荐使用相关的算法的宏包来处理。
2.3 文档的结构
这部分着重讲述,如何将格式与内容进行分离,这样方便进行写作。
标题和标题页
在LaTeX中,对标题内容的声明和实际输出标题,是分成两个部分的。
声明标题的时候,一般使用\title,以及对应的\author和\date命令,这些命令一般放置于导言区。
声明完成之后如果进行编译,会发现完全没有相关内容的输出,这是因为LaTeX需要在开始文档之后,使用\maketitle来进行输出。一般来说这也是文档正式开始之后的第一条命令。
当然也可以使用titlepage环境来自己定义首页。
章节
默认情况下可选的章节:
在实际论文的使用中,一般acknowledge是不需要编号的,那么就可以用\section*来取消它的编号。
多文件编译
对于比较简单的内容,直接使用单一的tex文件即可。如果内容比较大,或者是希望多人进行合作,那么就可以使用类似C语言的那种include命令,但是这个命令适合书中章节的分割,因为它本身会另起一页;如果希望在论文中使用,可以使用input命令,这个命令就单纯多了,它会将文件内容复制过来,非常适合论文。
2.4 文档类全局设置
文档类,即documentclass,是针对某一类格式相近的文档设计的。比如“文章”、“书籍”,甚至到某某大学的毕业论文,选择了文档类就相当于选择了某一个框架,并在其下进行填写。
基本文档类
LaTeX本身对一些基础的设置进行了整体设置,比如整体框架、基本设置等。而ctex则是在这个基础之上,编写了对应的适合中文的文档类,比如要写中文的文章,可以用ctexart。
分栏控制
遇到的基本上所有论文都是双栏的。但是似乎….没什么需要注意的。
第三章 自动化
主要有一些引用、页码、章节、编号这些,对于人工来说简直是噩梦,所以希望能够自动生成这些。
3.1 目录
目录和图表
目前我对于目录的理解是比较简单的,直接用\tableofcontents即可生成目录,不过记得第一次需要编译两遍才可以生成正确的目录。类似地,使用\listoffigures和\listoftables则会收集所有的图片和表格,并且呈现出来。
控制目录
上文也提到了,如果需要正确生成目录,那就需要编译两次才可以,为什么?LaTeX在遇到表示章节的这些目录的时候,会生成一个.toc文件,并且在文件中保存相关的目录信息,只有这样才能在第二次编译的时候生成正确的目录了。当然如果已经有了相应的toc文件,那么就可以一次编译成功。同理表格和图表的目录也有对应的文件。这些文件都可以手工修改,但是非常不建议手动修改。
3.2 交叉引用
通过一个\label来定义一个标签,然后在别的地方进行引用,这样就算以后这段文字的章节或者页码变化了,也不需要改变。
标签与引用
其实特别简单,只需要通过\label{}定义一个标签,这里推荐标签的内容和真正的内容挂钩,一般是类型缩写:内容缩写,比如fig:dog表明一张狗狗的图片,这样清楚明了。同样的,交叉引用也需要编译两次才可以得到结果,而这个中间文件是以.aux来结尾的。
3.3 bibtex和文献数据库
bibtex基础
以论文中的参考文献作为例子:
首先参考文献数据库其实就是一个
.bib文件,然后里面是一条条的引用的文献,这个文献一般可以通过Google scholar直接获取,或者是通过其他的工具来获取。有了这个“数据库”之后,就可以在导言区用
\bibliographystyle来指定对应的格式,基本的类型有plain、unsrt、alpha和abbrv这四种,不过我写的论文是有提供的(xxx.bst文件),直接使用它给的格式就可以了。然后就可以在文中用
\cite进行引用了。如果有论文是在正文中并没有被引用,但是还是希望能够列出来,那么就使用\nocite{}列出来,如果文献比较多,直接用\nocite{*}就可以了。指明文献数据库:
\bibliography{}最后编译的时候,首先需要先编译一遍,然后利用bibtex进行编译,最后再编译两次;也就是一共需要四次才编译完成。
四次编译详细过程
- 首先编译
.tex文件,然后找到其中的\cite命令、文献数据库、相关的文献格式写入对应的.aux文件中。 bibtex程序获取到.aux中的信息,写入到对应的.bbl文件中,如果打开对应的bbl文件,会发现已经有对应的参考文献信息了。- 继续编译
.tex文件,读取bbl文件,此时可以生成对应的参考文献,但是无法正确处理引用,会把引用信息放到aux文件中。 - 正确处理引用。
3.4 Makeindex索引
暂时用不到。跳过。
第四章 数学公式
个人使用LaTeX基本上只需要简单的数学公式就可以了。
4.1 数学公式概说
数学公式在LaTeX主要分成两种,一种是行内的公式,一般使用$...$包围。而如果希望公式能够单独一行,可以使用显式的输入,比如使用$$...$$,不过一般推荐使用equation环境。
然后就是简单的进行公式的撰写了。
第五章 绘制图表
论文中其二让人头痛的应该就是图表了。最常见的问题应该就是表格太宽了怎么办?如何让表格/图片横跨两栏?
5.1 LaTeX中的表格
LaTeX中有两种表格环境,分别是tabular和array,区别是前者支持文本和数学模式,而后者比较适合在数学下运作。
LaTeX是通过一行一行来绘制表格的,在表格环境中,一般使用\\表示换行,而用&表示换列。在表中可以使用|画出竖线,用\hline画出一条横线。
表中的对齐方式可以直接使用lcr这三个参数进行指定;实际中也会用到p{1cm}或者是m{1cm}这种来指定长度,避免表格内容过长导致超过边界,用这种方式可以自动换行,用了这种方式的话,对齐可以用\centering这种来指定;甚至还可以指定用小数点来作为对齐的符号。
表格的绘制一般在网上搜索latex table就可以通过用可视化的程序制作了,还是很方便的。
表格的合并与分割
实际中经常需要用到一个表格太大了,希望能够横跨两栏,那么就可以使用\begin{table*}来定义。
5.2 插图
图片的话就更加的简单了,只需要指定好图片的源就可以插入了,可能会视情况对图片进行缩放,或者是指定图片的大小和长度。
5.3 浮动体
对于图表来说,最难解决的应该就是它们一般来说是不让分割的,但是有的又不可避免的太大了,会导致分页的困难。LaTeX对此的解决方案是利用浮动体。简单了解一下浮动体机制及其使用(其实也一直在用了)。
最简单的浮动体使用:
1 | \begin{table}{位置} |
其中的位置有四个可选参数,可以组合使用:h=here,t=top,b=bottom,p=page。这里的table只是说明了这是一个浮动体,其实内容可以是任意的,比如放置一个算法都是可以的。
其次是一般会让内容居中,且一般都会带上标题和对应的label,这里注意需要把label放到caption后面,这样才能正确引用。
第六章 幻灯片
没有需求,跳过。
第七章 错误信息排查
7.1 理解错误信息
最常见的错误就是Undefined control sequence,说明LaTeX遇到了一个命令,它不认识。所以大概率是不小心把命令给敲错了。如果用的是TeXwork来进行编译的,那么编译器会返回一个?,可以直接敲回车让其忽略这个问题,或者直接输入h让其给出对应的信息。
有的时候会发现,LaTeX编译器提示的出错的地方并没有错误,这个就是LaTeX自身的问题了,需要往上面找一找才能找到问题。在之前我还遇到过一个问题,我在.bib数据库中定义好了参考文献,但是编译的时候一直提示我.bbl文件少了一个大括号,花费了很久排查问题。
典型的错误
下面的是TeX的错误:
Undifined control sequence:要么是不小心把命令拼写错了,要么就是忘记引入了宏包。Missing { insert:缺少花括号,很有可能需要往前找一段代码。Too many }'s ':多写了一个花括号,也可能是前面少了一个花括号Missing $ insert:缺少数学环境。
7.2 调试与分析
调试
书中比较推荐的方法是,利用二分法,把一些内容给去掉,看看错误是否还在。但是这个的问题就是万一有一些内容是分布在整个文章中的呢?所以个人感觉实际操作起来可能没有那么有可行性。
LaTeX本身支持使用\show和\meaning这两个命令,当在控制台中使用xelatex这种编译命令的时候,会在对应的位置停下来,并且输出到控制台上。
其他的工具诸如lacheck test.tex可以用来检查对应的.tex文档有没有语法错误了。
总结
《LaTeX入门》确实是一本非常非常好的工具书,但是不值得花时间通读,而是适合在出问题的时候或者不会做的时候作为工具书翻阅。