LATEX笔记

记录LATEX的一些知识点.

大部分内容来自中国 CTEX 用户小组译制的一份不太简短的 LATEX 2ε 介绍.

未完待续.

基本知识

LATEX源文件

LATEX 源文件的格式为普通的 ASCII 文件,你可以使用任何文本编辑器来创建。

空白距离

LATEX 将空格和制表符等空白字符视为相同的空白距离(space)。多个连续的空白字符等同为一个空白字符。在 LATEX 文件中,每行开始的空白字符将被忽略,而单个的回车符被视为一空格。

LATEX 使用空行来结束段落,两行文本中的空行标志上一段落的结束和新段落的开始。如同空格一样,多个空行所起的作用和一个空行的作用是相同的。

特殊字符

下面的这些字符是 LATEX 的保留字符:

# $ % ^ & _ { } ~ \

在这些字符(除' \ ')前加上' \ '就可以在文本中得到,而' \ '为断行命令.

命令$\backslash$将生成 ' \ '。

LATEX命令

LATEX 命令(commands)是大小写敏感的并有下面两种格式:

  • 以一反斜线' \ '开始,加上只包含字母字符命令名组成。命令名后的空格符、数字或其它非字母字符标志该命令的结束。
  • 由一反斜线和一特殊字符组成。

LATEX 忽略命令后面的空格。如果你希望在命令后面得到一空格,可以在命令后面加上 {} 和一个空格,或者加上一个特殊的空白距离命令。{} 将阻止 LATEX 吞噬掉命令后面的空格。例如:

I read that Knuth divides the people working with \TeX{} into \TeX{}nicians and \TeX perts.\\ Today is \today.

得到

I read that Knuth divides the people working with TEX into TEXnicians and EXperts. 
Today is 8th March 2003.

许多命令需要一个参数(parameter)并用一对大括号(curly braces){ }将其括起来置于命令名称的后面。也有一些命令支持用方括号(square brace)括起来的可选参数。

注释

当 LATEX 在处理源文件时,如果遇到一个百分号字符 %,那么 LATEX将忽略 % 后的该行文本,分行符以及下一行开始的空白字符。这样,我们就可以在源文件中写一些注释,而不会担心他们会出现在最后的排版结果中。

This is an % stupid
% Better: instructive <----
example: Supercal%
ifragilist%
icexpialidocious

得到

This is an example: Supercalifragilisticexpialidocious

% 也可以用来分割不允许有空格或分行的较长输入文本。

源文件的结构

LATEX 需要所处理的源文件遵从一定的结构,每个 LATEX 文档必须以如下的命令开始: \documentclass{...}

这个命令指定了你所写的文档的类别。在此之后,你可以加入控制文档式 样的命令,或者使用命令 \usepackage{...} 来调入一些宏集,进而为 LATEX 系统增添 一些新的功能。

当完成所有的设置后,你可利用命令\begin{document}来开始你的文档.\documentclass\begin{document} 之间的区域称作导言区。

现在你可以输入你所希望排版的文本和所使用的一些 LATEX 命令。在文档的最后键入命令\end{document}来告诉 LATEX 你的文档到此结束,从而使 LATEX忽略文档在此命令之后的部分。

文档布局

文档类

当 LATEX 处理源文件时,首先需要知道的是作者所要创建的文档类型。该信息可以通过命令\documentclass[options]{class}来提供给 LATEX。例如,一个 LATEX 源文件以下面一行开始:

\documentclass[11pt,twoside,a4paper]{article}

{class}可以是: - article 排版科技期刊、短报告、程序文档、邀请函等。 - report 排版多章节的长报告、短篇的书籍、博士论文等。 - book 排版书籍。 - slides 排版幻灯片。其中使用了较大的 sans serif 字体。也可以考虑使用 FoilTEX 来得到相同的效果。

options可以包含: - 10pt, 11pt, 12pt 设置文档所使用的字体的大小。如果没有声明任何选项,缺省将使用 10pt 字体。 - a4paper, letterpaper, . . . 定义纸张的大小,缺省的设置为letterpaper。此外,还可以使用a5paper,b5paper,executivepaper 和 legalpaper。 - fleqn 设置该选项将使数学公式左对齐,而不是中间对齐。 - leqno 设置该选项将使数学公式的编号放置于左侧。 - titlepage, notitlepage 指定是否在文档标题(document title)后开始一新页。article 文档类缺省不开始新页,而 book 文档类则相反。 - onecolumn, twocolumn 指定 LATEX 以单列(one column)或双列(two column)方式排版文档。 - twoside, oneside 指定 LATEX 排版的文档为双面或单面格式。article 和 report 缺省使用单面格式,而 book 则缺省使用双面格式。需要注意的是该选项仅作用于文档的式样。twoside选项不会通知你的打印机让以得到双面的打印输出。 - openright, openany 此选项决定新的章是仅仅在右边页(奇数页)还是在下一可用页开始。该选项对 article 文档类不起作用,因为该类中并没有定义“章”(Chapter)。report 类中新的一章开始于下一可用页,而 book 类中新的一章总是开始于右边页。

宏包

如果你想插入图形、彩色文本或源代码文件,你需要使用宏包来增强 LATEX 的功能。调入宏包使用如下的命令:

\usepackage[options]{package}

这里 package 是宏包的名称,options 是用来触发宏包中的特殊功能的一组关键词。

各类LATEX文件

  • .tex LATEX 或 TEX 源文件。可以用 latex 处理。
  • .sty LATEX 宏包文件。可使用命令 将其加载到你的 LATEX 文件中。
  • .dtx 文档化 TEX 文件。这也是 LATEX 宏包发布的主要格式。通过处理一个 dtx 文件就可以得到该 LATEX 宏中所包括的宏代码文档。
  • .ins 为相应的 .dtx 文件的安装文件。如果你在网络上下载了一 LATEX 宏包,你通常会发现会有一个 .dtx 和一个 .ins 文件。使用 LATEX 对 .ins 文件进行处理,可以从 .dtx 文件中提取出宏包。

当你运行 LATEX 处理你的源文件时,会得到下列文件:

  • .dvi 与设备无关文件。这是 LATEX 编译运行的主要结果。你可以使用 DVI预览器浏览其内容,或者使用像 dvips 这样的应用程序输出到打印机。
  • .log 记录了上次编译运行时的详细信息。
  • .toc 存储了所有章节标题。该文件将在下次编译运行时被读入并生成目录。
  • .lof 类似 .toc 文件,可生成图形目录。
  • .lot 类似 .toc 文件,可生成表格目录。
  • .aux 另一个用来向下次编译运行传递信息的辅助文件。除了其它信息外,.aux 文件通常包含交叉引用信息。
  • .idx 如果你的文件中包含有索引,LATEX 使用此文件存储所有的索引词条。此文件需要使用 makeindex 处理。
  • .ind 经过处理后的 .idx 文件。可在下次编译运行时加入到你的文档中。
  • .ilg 运行 makeindex 时生成的记录文件。

页面式样

LATEX 支持三种预定的页眉、页脚(header/footer)格式,称为页面式样(page styles)。命令 \pagestyle{style} 中的参数定义了所使用页面式样。

  • plain 页眉为空,页脚由居中的的页码组成。这是默认的页面式样。
  • headings 页眉由当前的章节标题和页码组成,页脚为空。
  • empty 设置页眉、页脚均为空。

可以使用下面的命令改变当前页的页面式样: \thispagestyle{style}

大型文档

当处理大型文档时,最好将源文件分成几个部分。LATEX 有两条命令来处理这种情况。

在文档的正文中使用命令 \include{filename} 可将文件名为 filename.tex 的内容包括进来。注意 LATEX 在开始处理 filename.tex 的内容之前将会开始一新页。

第二个命令 \includeonly{filename,filename,. . . } 可用在文档的导言区,它允许你指导 LATEX 仅仅读入某些 * 文件。这条命令在导言区被 LATEX 读入执行后,在所有的 * 命令中,只有 * 命令参数中列出的文件才会被执行。注意在参数中,文件名和逗号之间不能有空格**。

* 命令在新页上排版包括进来的文本,这对于使用 *命令很有帮助。应为即使一些包括的文件被忽略,分页处也不会变更。如果不想在新页排版包括进来的文本,可使用下面的命令: 该命令只是简单地将指定的文件包括进来,并没有其它限制。

使用 syntonly 宏包可以让 LATEX 快速的检查你的文档:LATEX 浏览你的文档,仅仅检查语法和所使用的命令是否正确,不会产生 DVI 输出。在这种模式下,LATEX 运行的非常快,可以节省可观的时间。使用方法非常简 单:

\usepackage{syntonly}
\syntaxonly

文档排版

文档和语言的结构

在 LATEX 中段落是最重要的文档单位。我们之所以称之为“文档单位”,因为段落是反映一个连贯思想或观点的排版风格形式。在下面的章节中你将学习如何用 \\ 强行断行,通过在源文件中留一空行强行转段。所以,如果开始一个新思想,就另起一段,否则,只应使用断行。如果还犹豫是否应转段,可以把文档想象为观点和思想的传递者。如果旧的思路还在继续,就不应转段。如果同一段中出现了全新的思路,就应该另起一段。

下一个较小的文档单位是句子。在英语文档中,在一个句子结尾处句号后的空间大于缩写词句号后的空间。LATEX 试图分辨出你需要那一个。如果 LATEX 分辨错了,你必须告诉 LATEX 你到底需要什么。

句子也有结构。大多数语言具有非常复杂的标点符号系统,但是在很多语言中(包括德语和英语)只要你记住它表示什么:语言流中的短暂停顿,你就能近乎完美地使用逗号。如果你不肯定在哪里使用逗号,就大声地朗读这个句子,在每个逗号处做一短呼吸。在什么地方如果你感到别扭,就删掉这个逗号;如果在什么地方,你感到必须呼吸(或做了短暂停顿)就插入一个逗号。

最后,通过分成章、节、子节等形式,文档中的段落应该按逻辑在更高的层次进行组织。但是,使用

的排版效果是如此明显,以致如何使用这些高水平的结构几乎是不证自明的。

断行和分页

段落整理

通常书籍是用等长的行来排版的。为了优化整个段落的内容,LATEX 在单词之间插入必要的断行点(linebreak)和间隔。如果一行的单词排不下,LATEX 也会进行必要的断字。段落如何排版依赖于文档类别。通常,每一段的第一行有缩进,在两段之间没有额外的间隔。

在特殊情形下,有必要命令 LATEX 断行:

  • \\\newline 另起一行,而不另起一段。
  • \\* 在强行断行后,还禁止分页。
  • \newpage 另起一新页。
  • \linebreak[n], \nolinebreak[n], \pagebreak[n] and \nopagebreak[n]上述命令的效果可以从它们的名称看出来。通过可选参数 n,作者可以影响这些命令的效果。n 可以置为 0 和 4 之间的数。如果命令的效果看起来非常差,把 n 取为小于 4 的数,可以让 LATEX 选择忽略这个命令。不要这些“break” 命令与 “new” 命令混淆。即使你给出了 “break” 命令,LATEX 仍然试图对齐页面的右边界。如果你真想另起一行,就使用相应的命令。

LATEX 总是尽可能产生最好的断行效果。如果断行无法达到 LATEX 的高标准,就让这一行在段落的右侧溢出。然后在处理输入文件的同时,报告溢出的消息(“overfull hbox”)。这最可能发生在 LATEX 找不到合适的地方断字时候。你可以使用 \sloppy 命令,告诉 LATEX 降低一点儿标准。虽然最终的输出结果不是最优的,它通过增加单词之间的间隔,以防止出现过长的行。在这种情况下给出警告(“underfull hbox”)。在大多数情况下得到的结果看起来不会非常好。\fussy 命令把 LATEX 恢复为缺省状态。

当发生(“overfull hbox”)时,虽然 LATEX 给出一个警告并显示溢出的那一行,但是不太容易发现溢出的行。如果你在 \documentclass 命令中使用选项 draft,LATEX 就在溢出行的右边标以粗黑线。

断字

必要时就会出现断字。如果断字算法不能确定正确的断字点,可以使用如下命令告诉 TEX 如何弥补这个缺憾。

\hyphenation{word list}

使列于参量中的单词仅在注有 “-” 的点断字。命令的参量仅由正常字母构成的单词,或由激活文本中视为正常字母的符号组成。应用于(特殊)语言的已存好,当断字命令出现时,就为激活的语言储存断字可选点。这意 味着如果你在文档导言中设置了断字命令,它将影响英文的断字。如果断字命令置于 \begin{document} 后面,而且你正使用类似 babel 的国际语言支持宏包,那么断字可选点在由 babel 激活的语言中就处于活动状态。

下面的例子允许对 “hyphenation” 和 “Hyphenation” 进行断字,却根本不允许 “FORTRAN”, “Fortran” 和 “fortran” 进行断字。在参量中不允许出现特殊的字符和符号。

\hyphenation{FORTRAN Hy-phen-a-tion}

命令 \- 在单词中插入一个自主的断字点。它也就成为这个单词中允许出现的唯一断字点。对于包含特殊字符(注音字符)的单词,这个命令是特别有用的,因为对于包含特殊字符的单词 LATEX 不自动断字。

I think this is: su\-per\-cal\-%
i\-frag\-i\-lis\-tic\-ex\-pi\-%
al\-i\-do\-cious
I think this is: supercalifragilisticexpialido-
cious

命令 \mbox{text} 保证把几个单词排在同一行上。在任何情况下,这个命令把它的参量排在一起(同一行上)。

My phone number will change soon.
It will be \mbox{0116 291 2319}.
The parameter
\mbox{\emph{filename}} should
contain the name of the file.
My phone number will change soon. It will
be 0116 291 2319.
The parameter *filename* should contain the
name of the file.

上述两星号之间为斜体

命令 和 类似,此外它还能围绕内容画一个框。

特殊字符串和符号

引号

不要像在打字机上那样,把 " 用作引号。在 LATEX 中有专门的左引号和右引号。在 LATEX 中,用两个 ‘ 产生左引号,用两个 ’ 产生右引号。一个 ‘ 和一个 ’ 产生一个单引号。

‘‘Please press the ‘x’ key.’’
“Please press the ‘x’ key.”

破折号和连字号

LATEX 中有四种短划标点符号。连续用不同数目的短划,可以得到其中的三种。第四个实际不是标点符号,它是数学中的减号:

daughter-in-law, X-rated\\
pages 13--67\\
yes---or no? \\
$0$, $1$ and $-1$
daughter-in-law, X-rated
pages 13–67
yes—or no?
0, 1 and −1

这些短划线的名称是: ‘-’ 连字号,‘--’ 短破折号,‘---’ 长破折号和 ‘−’ 减号。

波浪号

波浪号经常和网址用在一起。它在 LATEX 中,可用 ~ 产生,但其结果:˜ 却不是你真正想要的。试一下这个:

http://www.rich.edu/\~{}bush \\
http://www.clever.edu/$\sim$demo
http://www.rich.edu/˜bush
http://www.clever.edu/∼demo

度的符号 (◦)

在LATEX中如何排度的符号?

Its $-30\,^{\circ}\mathrm{C}$,
I will soon start to
super-conduct.
Its −30 ◦C, I will soon start to super-conduct.

省略号

在打字机上,逗号或句号占据的空间和其他字母相等。在书籍印刷中,这些字符仅占据一点儿空间,并且与前一个字母贴得非常紧。所以不能只键入三个点来输出‘省略号’,因为间隔划分得不对。我们使用专门的命令 \ldots 输出省略号。

连字

一些字母组合不是简单键入一个个字母得到得的,而实际上用到了一些特殊符号。 在两个字母之间插入一个 ,可以禁止连字。对于由两个词构成的单词,这可能是必要的。

注音符号和特殊字符

LATEX 支持来自许多语言中的注音符号和特殊字符。在字母 i 和 j 上标一个注音符号,它的点儿必须去掉。这个可由 \i\j 做到。

H\^otel, na\"\i ve, \’el\‘eve,\\
sm\o rrebr\o d, !‘Se\~norita!,\\
Sch\"onbrunner Schlo\ss{}
Stra\ss e
Hˆotel, na¨ıve, ´el`eve,
smørrebrød, ¡Se˜norita!,
Sch¨onbrunner Schloß Straße

上述为注音符号

支持使用国际语言

单词的间隔

为了使输出的右边界对齐,LATEX 在单词间插入不等的间隔。在句子的末尾插入的空间稍多一些,因为这使得文本更具可读性。LATEX 假定句子以句号、问号或惊叹号结尾如果句号紧跟一个大写字母,它就不视为句子的结尾。因为一般在有缩写地方,才出现句号紧跟大写字母的情况。

作者必须详细说明,这些假设中的任何一个例外。空格前的反斜线符号产生一个不能伸长的空格。波浪字符 ‘~’ 也产生一个不能伸长的空格,并且禁止断行。句号前的命令 @ 说明这个句号是句子的末尾,即使它紧跟一个大写字母。

Mr.~Smith was happy to see her\\
cf.~Fig.~5\\
I like BASIC\@. What about you?
Mr. Smith was happy to see her
cf. Fig. 5
I like BASIC. What about you?

命令 \frenchspacing 能禁止在句号后插入额外的空间,它告诉 LATEX 在句号后不要插入比正常字母更多的空间。除了参考文献,这在非英语语言中非常普遍。如果使用了 \frenchspacing,命令 \@ 就不必要了。

标题,章和节