一篇极其容易上手的 LaTex 学习文档

2022-07-29 08:08:38 浏览数 (1)

LaTeX 有一些列自定义的书写规则组成,有特定的语法,比如Markdown,但语法和变量比前者多。本篇文章,适合刚学习LaTex的小白同学,会对下列几个方面进行介绍:

  1. 基本使用方法
  2. 使用 (Xe)LaTeX 进行简单的中英混排
  3. 文章组织结构
  4. 用 (Xe)LaTeX 进行数学公式的排版
  5. 在 (Xe)LaTeX 的文档中插入图片/表格
  6. 进行简单的版面设置
  7. TeX 家族
  8. 其他

基本使用方法

准备工作

你可以点击这里,直接下载Latex2.9.7031 windows 版本

或者,在这里下载你需要的版本

然后一步步安装即可,没有什么需要特别注意的。

启动 TeXworks

启动 TeXworks 很简单,你可以在 Windows 启动对话框中输入 texworks 按回车。具体步骤是:

  1. 按下键盘上的 Windows 徽标键,同时按下 R 键 —— R;
  2. 键入 texworks
  3. 回车

如果这样打不开 TeXworks,你可能需要从开始菜单找到 TeXworks 图标以启动;或者进入 TeX 系统的安装目录找到 TeXworks。启动界面如下图:

  • 图中空白的部分,就是输入编辑文本的编辑框;
  • 在编辑框的右下角,显示有三个按钮,最左边的是换行符模式,中间是编码模式,右边标示当前光标所在位置;
  • 编辑框的上方是工具栏,工具栏的右半部分使大家熟悉的功能(新建、打开、保存、撤消、恢复、剪切、复制、黏贴、查找、替换)
  • 工具栏的左边则是编译按钮 (TeXworks 也称其为「排版工具」);
  • 工具栏再往上,则是菜单栏

排版工具

TeXworks 为我们预设了若干排版工具(pdfTeX, pdfLaTeX, XeTeX, XeLaTeX 等),本文主要用到其中的 XeLaTeX。当你对 TeX 系统相当熟悉之后,也可以不使用 TeXworks 预设的工具,自己配置排版工具。TeXworks 默认的排版工具是 pdfLaTeX。如果你希望更改这个默认值,可以在编辑 - 首选项 - 排版 - 处理工具 - 默认 中修改。

开始

helloworld.tex

代码语言:javascript复制
documentclass{article}
% 这里是导言区
begin{document}
Hello, world!
end{document}

将文档保存在你希望的位置,然后在排版工具的下拉选框中选中 XeLaTeX 后,按下绿色的编译按钮。一会儿,如果没有意外,屏幕的右边就会出现编译之后结果。如下图:

请注意,在 Windows 平台上TeX 涉及到的文件(包括 .tex, .jpg 等各类文件)都不要包含中文名字。否则,在编译时可能会因为编码问题导致稀奇古怪的报错。

  • 解释1: 此处的第一行 documentclass{article} 中包含了一个控制序列(或称命令/标记)。所谓控制序列,是以反斜杠 开头,以第一个空格或非字母 的字符结束的一串文字它们不被输出,但是他们会影响输出文档的效果。这里的控制序列是 documentclass,它后面紧跟着的 {article} 代表这个控制序列有一个必要的参数,该参数的值为 article。这个控制序列的作用,是调用名为 article 的文档类。

请注意,TeX 对控制序列的大小写是敏感的。

部分控制序列还有被方括号 [] 包括的可选参数。

所谓文档类,即是 TeX 系统预设的(或是用户自定的)一些格式的集合。不同的文档类在输出效果上会有差别。

  • 解释2: 此处的第二行以 % 开头。TeX 以百分号 % 作为注释标记。具体来说,TeX 会忽略从 % 开始到当前行末尾的所有内容。这些内容不会被输出,也不影响最终排版效果,只供人类阅读。若要输出 % 字符本身,则需要在 % 之前加上反斜杠 进行转义(escape)。例如:20%,此处 % 被当做正常的百分号处理,其后的文字也将被正常输出。
  • 解释3: 控制序列 begin。这个控制序列总是与 end 成对出现。这两个控制序列以及他们中间的内容被称为「环境」;它们之后的第一个必要参数总是一致的,被称为环境名。 只有在 document 环境中的内容,才会被正常输出到文档中去或是作为控制序列对文档产生影响。也就是说,在 end{document} 之后插入任何内容都是无效的。
  • 解释4:

documentclass{article} 开始到 begin{document} 之前的部分被称为导言区。你可以将导言区理解为是对整篇文档进行设置的区域——在导言区出现的控制序列,往往会影响整篇文档的格式。

通常在导言区设置页面大小、页眉页脚样式、章节标题样式等等。

实现中英文混排

在 TeX 开发当初并没有考虑到亚洲文字的问题。因此早期的 TeX 系统并不能直接支持中文,必须要用其他工具先处理一下(或者是一些宏包之类的)。但是现在,XeTeX 原生支持 Unicode,并且可以方便地调用系统字体。可以说解决了困扰中国 TeX 使用者多年的大问题。至此,我们只需要使用几个简单的宏包,就能完成中文支持了。

宏包:一系列控制序列的合集(将控制序列打包放入一个文件中)。usepackage{} 可以用来调用宏包

请注意,CTeX 宏集和 CTeX 套装是两个不同的东西。CTeX 宏集本质是 LaTeX 宏的集合,包含若干文档类(.cls 文件)和宏包(.sty 文件)。CTeX 套装是一个过时的 TeX 系统。 新版 CTeX 宏集的默认能够自动检测用户的操作系统,并为之配置合适的字库。对于 Windows 用户、Mac OS X 用户和 Linux 用户,都无需做任何配置,就能使用 CTeX 宏集来排版中文。

在 TeXworks 编辑框中输入以下内容,以 UTF-8 编码保存,使用 XeLaTeX 编译:

代码语言:javascript复制
documentclass[UTF8]{ctexart}
begin{document}
你好,world!
end{document}

第一次使用的时候,会让你安装一系列的控制序列,你只要点击install即可。如果没有意外,你将会看到类似下图的输出结果:

相较于之前的例子,这份代码只有细微的差异:

  • 文档类从 article 变为 ctexart;
  • 增加了文档类选项 UTF8

你也可以直接使用 xeCJK 宏包来支持中英文混排。不过大多数情况是不推荐这样做的。

组织你的文章

代码语言:javascript复制
documentclass[UTF8]{ctexart}
title{你好,world!}
author{Liam}
date{today}
begin{document}
maketitle
你好,world!
end{document}
  • 解释: 在 document 环境中,除了原本的你好,world!,还多了一个控制序列 maketitle。这个控制序列能将在导言区中定义的标题、作者、日期按照预定的格式展现出来。

章节和段落

代码语言:javascript复制
documentclass[UTF8]{ctexart}
title{你好,world!}
author{Liam}
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{蓝天白云} in 五月。
end{document}

在文档类 article/ctexart 中,定义了五个控制序列来调整行文组织结构。他们分别是:

  • section{·}
  • subsection{·}
  • subsubsection{·}
  • paragraph{·}
  • subparagraph{·}

在report/ctexrep中,还有chapter{·};在文档类book/ctexbook中,还定义了part{·}

插入目录

在上一节的文档中,找到 maketitle,在它的下面插入控制序列 tableofcontents,保存并用 XeLaTeX 编译两次,观察效果:

插入数学公式

为了使用 AMS-LaTeX 提供的数学功能,我们需要在导言区加载 amsmath 宏包:

usepackage{amsmath}

数学模式

LaTeX 的数学模式有两种:行内模式 (inline) 和行间模式 (display)

  • 行内模式:在正文的行文中,插入数学公式;
  • 行间模式:独立排列单独成行,并自动居中。

在行文中,使用 ... 可以插入行内公式,使用 [ ... ] 可以插入行间公式,如果需要对行间公式进行编号,则可以使用 equation 环境

代码语言:javascript复制
begin{equation}
...
end{equation}

上下标

代码语言:javascript复制
documentclass{article}
usepackage{amsmath}
begin{document}
Einstein 's $E=mc^2$.

[ E=mc^2. ]

begin{equation}
E=mc^2.
end{equation}
end{document}

注意,行内公式和行间公式对标点的要求是不同的:

  • 行内公式的标点,应该放在数学模式的限定符之外
  • 行间公式则应该放在数学模式限定符之内

在数学模式中,需要表示上标,可以使用 ^ 来实现(下标则是 _)。它默认只作用于之后的一个字符,如果想对连续的几个字符起作用,请将这些字符用花括号 {} 括起来,例如:

[ z = rcdot e^{2pi i}. ]

根式与分式

根式sqrt{·} 来表示,分式frac{·}{·} 来表示(第一个参数为分子,第二个为分母)。

代码语言:javascript复制
documentclass{article}
usepackage{amsmath}
begin{document}
$sqrt{x}$, $frac{1}{2}$.

[ sqrt{x}, ]

[ frac{1}{2}. ]
end{document}

在行间公式和行内公式中,分式的输出效果是有差异的。如果要强制行内模式的分式显示为行间模式的大小,可以使用 dfrac, 反之可以使用 tfrac。

运算符

一些小的运算符,可以在数学模式下直接输入;另一些需要用控制序列生成,如

代码语言:javascript复制
[ pm; times ; div; cdot; cap; cup;
geq; leq; neq; approx ; equiv ]

连加、连乘、极限、积分等大型运算符分别用 sum, prod, lim, int 生成。他们的上下标在行内公式中被压缩,以适应行高。我们可以用 limits 和 nolimits 来强制显式地指定是否压缩这些上下标。例如:

代码语言:javascript复制
$ sum_{i=1}^n iquad prod_{i=1}^n $
$ sumlimits _{i=1}^n iquad prodlimits _{i=1}^n $
[ lim_{xto0}x^2 quad int_a^b x^2 dx ]
[ limnolimits _{xto0}x^2quad intnolimits_a^b x^2 dx ]

多重积分可以使用 iint, iiint, iiiint, idotsint 等命令输入:

[ iintquad iiintquad iiiintquad idotsint ]

定界符(括号等)

各种括号用 (), [], {}, langlerangle 等命令表示;注意花括号通常用来输入命令和环境的参数,所以在数学公式中它们前面要加 。因为 LaTeX 中 | 和 | 的应用过于随意,amsmath 宏包推荐用 lvertrvertlVertrVert 取而代之。

为了调整这些定界符的大小,amsmath 宏包推荐使用 big, Big, bigg, Bigg 等一系列命令放在上述括号前面调整大小。

代码语言:javascript复制
documentclass{article}
usepackage{amsmath}
begin{document}
[ 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} ]
[ BiggllanglebiggllangleBigllanglebigllanglelangle x
ranglebigrrangleBigrranglebiggrrangleBiggrrangle ]
[ BiggllvertbiggllvertBigllvertbigllvertlvert x
rvertbigrrvertBigrrvertbiggrrvertBiggrrvert ]
[ BiggllVertbiggllVertBigllVertbigllVertlVert x
rVertbigrrVertBigrrVertbiggrrVertBiggrrVert ]
end{document}

省略号

省略号用 dots, cdots, vdots, ddots 等命令表示。dots 和 cdots 的纵向位置不同,前者一般用于有下标的序列

代码语言:javascript复制
documentclass{article}
usepackage{amsmath}
begin{document}
[ x_1,x_2,dots ,x_nquad 1,2,cdots ,nquad
vdotsquad ddots ]
end{document}

矩阵

amsmath 的 pmatrix, bmatrix, Bmatrix, vmatrix, Vmatrix 等环境可以在矩阵两边加上各种分隔符

代码语言:javascript复制
documentclass{article}
usepackage{amsmath}
begin{document}
[ 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} ]
end{document}

使用 smallmatrix 环境,可以生成行内公式的小矩阵:

多行公式

  • 有的公式特别长,我们需要手动为他们换行;
  • 有几个公式是一组,我们需要将他们放在一起;
  • 有些类似分段函数,我们需要给它加上一个左边的花括号。

长公式

  • 不对齐(无须对齐的长公式可以使用 multline 环境)
代码语言:javascript复制
begin{multline}
x = a b c {} \
d e f g
end{multline}

如果不需要编号,可以使用 multline* 环境代替。

  • 对齐(需要对齐的公式,可以使用 aligned 次环境来实现,它必须包含在数学环境之内)

公式组

无需对齐的公式组可以使用 gather 环境,需要对齐的公式组可以使用 align 环境。他们都带有编号,如果不需要编号可以使用带星花的版本

代码语言:javascript复制
documentclass{article}
usepackage{amsmath}
begin{document}

begin{gather}
a = b c d \
x = y z
end{gather}
begin{align}
a &= b c d \
x &= y z
end{align}

end{document}

请注意,不要使用 eqnarray 环境

分段函数

段函数可以用cases次环境来实现,它必须包含在数学环境之内。

代码语言:javascript复制
documentclass{article}
usepackage{amsmath}
begin{document}

[ y= begin{cases}
-x,quad xleq 0 \
x,quad x>0
end{cases} ]

end{document}

插入图片和表格

图片

在 LaTeX 中插入图片,有很多种方式。最好用的应当属利用 graphicx 宏包提供的 includegraphics 命令。比如你在你的 TeX 源文件同目录下,有名为 a.png 的图片,你可以用这样的方式将它插入到输出文档中:

代码语言:javascript复制
documentclass{article}
usepackage{graphicx}
begin{document}
includegraphics{a.png}
end{document}

图片可能很大,超过了输出文件的纸张大小,或者干脆就是你自己觉得输出的效果不爽。这时候你可以用 includegraphics 控制序列的可选参数来控制。比如:

includegraphics[width = .8textwidth]{a.png}

这样图片的宽度会被缩放至页面宽度的百分之八十,图片的总高度会按比例缩放。

表格

tabular 环境提供了最简单的表格功能。它用 hline 命令表示横线,在列格式中用 | 表示竖线用 & 来分列,用 \ 来换行;每列可以采用居左、居中、居右等横向对齐方式,分别用 l、c、r 来表示。

代码语言:javascript复制
documentclass{article}
usepackage{graphicx}
begin{document}
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}
end{document}

浮动 float

插图和表格通常需要占据大块空间,所以在文字处理软件中我们经常需要调整他们的位置。figure 和 table 环境可以自动完成这样的任务;这种自动调整位置的环境称作浮动(float)。我们以 figure 为例。

代码语言:javascript复制
documentclass{article}
usepackage{graphicx}
begin{document}

begin{figure}[htbp]
centering
includegraphics{a.png}
caption{有图有真相}
label{fig:myphoto}
end{figure}

end{document}
  • 解释:
  1. htbp 选项用来指定插图的理想位置,这几个字母分别代表 here, top, bottom, float page,也就是就这里、页顶、页尾、浮动页(专门放浮动体的单独页面或分栏)。
  2. centering 用来使插图居中
  3. caption 命令设置插图标题,LaTeX 会自动给浮动体的标题加上编号。注意 label 应该放在标题命令之后。

版面设置

页边距

设置页边距,推荐使用 geometry 宏包。

比如我希望,将纸张的长度设置为 20cm、宽度设置为 15cm、左边距 1cm、右边距 2cm、上边距 3cm、下边距 4cm,可以在导言区加上这样几行:

代码语言:javascript复制
documentclass{article}
usepackage{geometry}
geometry{papersize={20cm,15cm}}
geometry{left=1cm,right=2cm,top=3cm,bottom=4cm}
begin{document}

end{document}

页眉页脚

设置页眉页脚,推荐使用 fancyhdr 宏包

比如我希望,在页眉左边写上我的名字,中间写上今天的日期,右边写上我的电话;页脚的正中写上页码;页眉和正文之间有一道宽为 0.4pt 的横线分割,可以在导言区加上如下几行:

代码语言:javascript复制
documentclass{article}
usepackage{fancyhdr}
pagestyle{fancy}
lhead{author}
chead{date}
rhead{152xxxxxxxx}
lfoot{}
cfoot{thepage}
rfoot{}
renewcommand{headrulewidth}{0.4pt}
renewcommand{headwidth}{textwidth}
renewcommand{footrulewidth}{0pt}
begin{document}

首行缩进

CTeX 宏集已经处理好了首行缩进的问题(自然段前空两格汉字宽度)。因此,使用 CTeX 宏集进行中西文混合排版时,我们不需要关注首行缩进的问题。

但是,如果你选择不使用CTex宏集进行中文支持和版式设置,你需要做额外的一些工作:

  1. 调用 indentfirst 宏包。
  2. 设置首行缩进长度 setlength{parindent}{2ccwd}。其中 ccwd 是 xeCJK 定义的宏,它表示当前字号中一个中文汉字的宽度。

行间距

通过 setspace 宏包提供的命令来调整行间距。比如在导言区添加如下内容,可以将行距设置为字号的 1.5 倍:

代码语言:javascript复制
documentclass{article}
usepackage{setspace}
onehalfspacing
begin{document}

end{document}
  • 行距是字号的 1.5 倍;
  • 1.5 倍行距。

事实上,这不是设置 1.5 倍行距的正确方法,RuixiZhang 开发了 zhlineskip 宏包,提供了对中西文混排更细致的行距控制能力。

段间距

通过修改长度 parskip 的值来调整段间距。例如在导言区添加以下内容:

代码语言:javascript复制
documentclass{article}
addtolength{parskip}{.4em}

begin{document}

end{document}

则可以在原有的基础上,增加段间距 0.4em。如果需要减小段间距,只需将该数值改为负值即可。

TeX 家族

带有 TeX 的词,仅仅是本文就已经提到了 TeX, LaTeX, XeLaTeX。通常中国学生面对不了解意思的一群形近单词,都会有一种「本能的恐惧」(笑~)。因此,「大神们」在为新手介绍 TeX 的时候,如果互相争论 「XXTeX 比 YYTeX 好」或者是「XXTeX 的 YYTeX 如何如何」,往往会蹦出下面这些带有 TeX 的词汇: TeX, pdfTeX, XeTeX, LuaTeX, LaTeX, pdfLaTeX, XeLaTeX …

事实上,这部分的内容太过复杂,所以大家只需要将这部分的内容当做是一个参考就可以了。

TeX - LaTeX

TeX 是高德纳做出来的排版引擎,同时也是该引擎使用的标记语言(Markup Language)的名称。 LaTeX 则是 L. Lamport (1941年2月7日 – ) 教授开发的基于 TeX 的排版系统。实际上 LaTeX 利用 TeX 的控制命令,定义了许多新的控制命令并封装成一个可执行文件。这个可执行文件会去解释 LaTeX 新定义的命令成为 TeX 的控制命令,并最终交由 TeX 引擎进行排版。LaTeX 是基于一个叫做 plain TeX 的格式的。plain TeX 是高德纳教授为了方便用户,自己基于原始的 TeX 定义的格式,但实际上 plain TeX 的命令仍然十分晦涩。至于原始的 TeX 直接使用的人就更少了,因此 plain TeX 格式逐渐就成为了 TeX 格式的同义词,尽管他们事实上是不同的。

pdfTeX - pdfLaTeX

TeX 系统生成的文件是 dvi 格式,虽然可以用其他程序将其转换为例如 pdf 等更为常见的格式,但是毕竟不方便。 dvi 格式是为了排版而产生的,它本身并不支持所谓的「交叉引用」,pdfTeX 直接输出 pdf 格式的文档,这也是 pdfTeX 相对 TeX 进步(易用性方面)的地方。 pdfLaTeX 这个程序的主要工作依旧是将 LaTeX 格式的文档进行解释,不过此次是将解释之后的结果交付给 pdfTeX 引擎处理。

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 编码的一种。

CTeX - MiKTeX - TeX Live

CTeX, MiKTeX, TeX Live 都是被称为「发行」的软件合集。他们包括了上述各种引擎的可执行程序,以及一些文档类、模板、字体文件、辅助程序等等。其中 CTeX 是建立在 MiKTeX 的基础之上的。

小结

TeX - pdfTeX - XeTeX - LuaTeX 都是排版引擎,按照先进程度递增(LuaTeX 尚未完善)。

LaTeX 是一种格式,基于 TeX 格式定义了很多更方便使用的控制命令。上述四个引擎都有对应的程序将 LaTeX 格式解释成引擎能处理的内容。

CTeX, MiKTeX, TeX Live 都是 TeX 的发行,他们是许许多多东西的集合。

其他

参考文档

  • ZIP文档
  • 论坛

0 人点赞