LaTeX 排版(一)——基础应用

1. LaTeX 基本概念

LaTeX \LaTeXLATEX 的源代码为文本文件。这些文本除了文字本身,还包括各种命令,用在排版公式、划分文档结构、控制样式等等不同的地方.

1.1 LaTeX 命令和代码结构

1.1.1 LaTeX 命令

LaTeX \LaTeXLATEX 中命令以 \ 开头,为以下两种形式之一:

  • 反斜线和后面的一串字母,如 \LaTeX,它们以任意非字母符号(空格、数字、标点等)为界限
  • 反斜线和后面的单个非字母符号,如 \$

命令是大小写敏感的

一些 LaTeX \LaTeXLATEX 命令可以接收一些参数,参数的内容会影响命令的效果. LaTeX \LaTeXLATEX 的参数分为可选参数和必选参数. 可选参数以方括号 [] 包裹;必选参数一般以花括号 {} 包裹. 还有些命令可以带一个星号 *,带星号和不带星号的命令效果有一定差异. 初次接触这些概念时,可以粗略地把星号看作一种特殊的可选参数.

1.1.2 LaTeX 环境

LaTeX \LaTeXLATEX 中还包括环境,用以令一些效果在局部生效,或是生成特殊的文档元素. LaTeX \LaTeXLATEX 环境的用法为一对命令 \begin\end

\begin{⟨environment name⟩}[⟨optional arguments⟩]{⟨mandatory arguments⟩}
…
\end{⟨environment name⟩}
  • 其中 ⟨environment name⟩ 为环境名,\begin\end 中填写的环境名应当一致
  • 类似命令,{⟨mandatory arguments⟩}[⟨optional arguments⟩] 为环境所需的必选和可选参数
  • 部分环境允许嵌套使用

1.1.3 LaTeX 分组

有些命令(如 \bfseries)会对其后所有内容产生作用,若要限制其作用范围,则需要使用分组.

LaTeX \LaTeXLATEX 使用一对花括号 {} 作为分组,在分组中使用的命令被限制在分组内,不会影响到分组外的内容.

上文提到的 LaTeX \LaTeXLATEX 环境隐含了一个分组,在环境中的命令被包裹在分组内.

1.1.4 LaTeX 源代码结构

LaTeX \LaTeXLATEX 源代码以一个 \documentclass 命令作为开头,它指定了文档使用的文档类. document 环境当中的内容是文档正文.

\documentclass\begin{document} 之间的位置称为导言区,在导言区中一般会使用 \usepackage 命令调用宏包,还会进行文档的全局设置.

\documentclass{...} % ... 为某文档类
% 导言区
\begin{document}
% 正文内容
\end{document}
% 此后内容会被忽略

1.2 LaTeX 宏包和文档类

1.2.1 文档类

文档类规定了 LaTeX \LaTeXLATEX 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、个人简历等等. LaTeX \LaTeXLATEX 源代码的开头须用 \documentclass 指定文档类:

\documentclass[⟨options⟩]{⟨class-name⟩}

其中 ⟨class-name⟩ 为文档类的名称,如 LaTeX \LaTeXLATEX 提供的 article, report, book,在其基础上派生的一些文档类如支持中文排版的 ctexart / ctexrep / ctexbook,或者有其它功能的一些文档类,如 moderncv / beamer 等, LaTeX \LaTeXLATEX 提供的基础文档类如下所示:

在这里插入图片描述

可选参数 ⟨options⟩ 为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。比如调用 article 文档类排版文章,指定纸张为 A4 大小,基本字号为 11pt,双面排版:

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

LaTeX \LaTeXLATEX 的三个标准文档类可指定的选项包括:

  • 10pt11pt12pt 指定文档的基本字号,默认为 10pt.
  • a4paperletterpaper 指定纸张大小,默认为美式信纸 letterpaper. 可指定选项还包括 a5paperb5paperexecutivepaperlegalpaper.
  • twosideoneside 指定单面/双面排版. 双面排版时,奇偶页的页眉页脚、页边距不同. articlereport 默认为 onesidebook 默认为 twoside.
  • onecolumntwocolumn 指定单栏/双栏排版,默认为 onecolumn.
  • openrightopenany 指定新的一章 \chapter 是在奇数页(右侧)开始,还是直接紧跟着上一页开始. report 默认为 openanybook 默认为 openright,对 article 无效.
  • landscape 指定横向排版,默认为纵向.
  • titlepage, notitlepage 指定标题命令 \maketitle 是否生成单独的标题页,article 默认为 notitlepagereportbook 默认为 titlepage.
  • fleqn 令行间公式左对齐,默认为居中对齐.
  • leqno 将公式编号放在左边,默认为右边.
  • draftfinal 指定草稿/终稿模式。草稿模式下,断行不良的地方会在行尾添加一个黑色方块,默认为 final.

1.2.2 宏包

在使用 LaTeX \LaTeXLATEX 时,时常需要依赖一些扩展来增强或补充 LaTeX \LaTeXLATEX 的功能,比如排版复杂的表格、插入图片、增加颜色甚至超链接等等,这些扩展称为宏包. 调用宏包的方法非常类似调用文档类的方法:

\usepackage[⟨options⟩]{⟨package-name⟩}

宏包(包括前面所说的文档类)可能定义了许多命令和环境,或者修改了 LaTeX \LaTeXLATEX 已有的命令和环境。它们的用法说明记在相应宏包和文档类的帮助文档。在 Windows 命令提示符或者 Linux 终端下输入命令可查阅相应文档:

texdoc ⟨pkg-name⟩

1.3 LaTeX 用到的文件

  • .tex:源码文件
  • .sty:宏包文件,宏包的名称与文件名一致
  • .cls:文档类文件,文档类名称与文件名一致
  • .bib:BIBTEX 参考文献数据库文件
  • .bst:BIBTEX 用到的参考文献格式模板

LaTeX \LaTeXLATEX 在编译过程中除了生成 .dvi.pdf 格式的文档外,还可能会生成相当多的辅助文件和日志. 一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件,然后再次编译时读入辅助文件得到正确的结果,所以复杂的 LaTeX \LaTeXLATEX 源代码可能要编译多次:

  • .auxLaTeX \LaTeXLATEX 生成的主辅助文件,记录交叉引用、目录、参考文献的引用等
  • .tocLaTeX \LaTeXLATEX 生成的目录记录文件
  • .lof LaTeX \LaTeXLATEX 生成的图片目录记录文件
  • .lot LaTeX \LaTeXLATEX 生成的表格目录记录文件
  • .bbl BIBTEX 生成的参考文献记录文件
  • .idx LaTeX \LaTeXLATEX 生成的供 makeindex 处理的索引记录文件
  • .ind makeindex 处理 .idx 生成的用于排版的格式化索引文件
  • .out hyperref 宏包生成的 PDF 书签记录文件

1.4 文件的组织方式

当编写长篇文档时,例如当编写书籍、毕业论文时,单个源文件会使修改、校对变得十分困难. 将源文件分割成若干个文件,例如将每章内容单独写在一个文件中,会大大简化修改和校对的工作.

LaTeX \LaTeXLATEX 提供了命令 \include 用来在源代码里插入文件:

\include{⟨filename⟩}

⟨filename⟩ 为文件名(不带 .tex扩展名),如果和要编译的主文件不在一个目录中,则要加上相对或绝对路径

值得注意的是 \include 在读入 ⟨filename⟩ 之前会另起一页. 有的时候我们并不需要这样,而是用 \input 命令,它纯粹是把文件里的内容插入:

\input{⟨filename⟩}

当导言区内容较多时,常常将其单独放置在一个 .tex 文件中,再用 \input 命令插入,复杂的图、表、代码等也会用类似的手段处理.

LaTeX \LaTeXLATEX 还提供了一个 \includeonly 命令来组织文件,用于导言区,指定只载入某些文件. 导言区使用了 \includeonly 后,正文中不在其列表范围的 \include 命令不会起效:

\includeonly{⟨filename1⟩,⟨filename2⟩,…}

需要注意的是,使用 \include\input 命令载入的文件名最好不要加空格和特殊字符,也尽量避免使用中文名,否则很可能会出错.

最后介绍一个实用的工具宏包 syntonly。加载这个宏包后,在导言区使用 \syntaxonly 命令,可令 LaTeX \LaTeXLATEX 编译后不生成 DVI 或者PDF 文档,只排查错误,编译速度会快不少:

\usepackage{syntonly}
\syntaxonly

2. 用 LaTeX 排版文字

2.1 示例

\documentclass{ctexart}
\begin{document}
	在\LaTeX{}中排版中文。
	汉字和English单词混排,通常不需要在中英文之间添加额外的空格。
	当然,为了代码的可读性,加上汉字和English 之间的空格也无妨。
	汉字换行时不会引入多余的空格。
\end{document}

输出结果为:

在这里插入图片描述

2.2 LaTeX 中的字符

2.2.1 空格和分段

LaTeX \LaTeXLATEX 源代码中,空格键Tab 键输入的空白字符视为“空格”,连续的若干个空白字符视为一个空格.

一行开头的空格忽略不计.

行末的换行符视为一个空格;但连续两个换行符,也就是空行,会将文字分段.

多个空行被视为一个空行,也可以在行末使用 \par 命令分段。

2.2.2 注释

LaTeX \LaTeXLATEX% 字符作为注释. 在这个字符之后直到行末,所有的字符都被忽略,行末的换行符也不引入空格.

2.2.3 特殊字符

\documentclass{ctexart}
\begin{document}
\# \$ \% \& \{ \} \_
\^{} \~{} \textbackslash
\end{document}

在这里插入图片描述

2.2.4 连字

西文排版中经常会出现连字(ligatures),常见的有 fffiflffiffl

\documentclass{ctexart}
\begin{document}
It's difficult to find \ldots\\
It's dif{}f{}icult to f{}ind \ldots
\end{document}

在这里插入图片描述

2.2.5 标点符号

中文的标点符号(绝大多数为非ASCII 字符)使用中文输入法输入即可,一般不需要过多留意. 而输入西文标点符号时,有不少地方需要留意.

  • 引号

    LaTeX \LaTeXLATEX 中单引号 分别用 ` 输入;双引号 分别用 ``‘’ 输入

    ``Please press the `x' key.''
    

    在这里插入图片描述

    中文的引号 ‘ ’ 和 “ ” 与西文的引号实际上是同一组符号,但由于中西文通常用不同的字体显示,它们的具体形状和宽度可能有所不同。在使用 ctex 宏包或文档类的情况下,中文引号可以通过输入法直接输入.

  • 连字号破折号

    LaTeX \LaTeXLATEX 中有三种长度的“横线”可用:连字号(hyphen)、短破折号(en-dash)和长破折号(em-dash).

    它们分别有不同的用途:连字号 - 用来组成复合词;短破折号 用来连接数字表示范围;长破折号 用来连接单词,语义上类似中文的破折号.

    daughter-in-law, X-rated\\
    pages 13--67\\
    yes---or no?
    

    在这里插入图片描述

  • 省略号

    LaTeX \LaTeXLATEX 提供了 \ldots 命令表示省略号,相对于直接输入三个点的方式更为合理.

    \dots\ldots 命令等效.

2.3 断行和断页

LaTeX \LaTeXLATEX 将文字段落在合适的位置进行断行,尽可能做到每行的疏密程度匀称,单词间距不会过宽或过窄. 文字段落和公式、图表等内容从上到下顺序排布,并在合适的位置断页,分割成匀称的页面. 在绝大多数时候,我们无需自己操心断行和断页,但偶尔会遇到需要手工调整的地方.

2.3.1 单词间距

在西文排版实践中,断行的位置优先选取在两个单词之间,也就是在源代码中输入的“空格”. “空格”本身通常生成一个间距,它会根据行宽和上下文自动调整,文字密一些的地方,单词间距就略窄,反之略宽.

文字在单词间的“空格”处断行时,“空格”生成的间距随之舍去. 我们可以使用字符 ~ 输入一个不会断行的空格(高德纳称之为 tie,“带子”),通常用在英文人名、图表名称等上下文环境:

Fig.~2a \\
Donald~E. Knuth

在这里插入图片描述

2.3.2 手动断行和断页

如果我们确实需要手动断行,可使用如下命令:

\\[⟨length⟩] \\*[⟨length⟩]
\newline

它们有两点区别:

  • 一是 \\ 可以带可选参数 ⟨length⟩,用于在断行处向下增加垂直间距,而 \newline 不带可选参数
  • 二是 \\ 也在表格、公式等地方用于换行,而 \newline 只用于文本段落中

带星号的 \\ 表示禁止在断行处分页

断页的命令有两个:

\newpage
\clearpage

通常情况下两个命令都起到另起一页的作用,区别在于:

  • 第一,在双栏排版模式中 \newpage 起到另起一栏的作用,\clearpage 则能够另起一页
  • 第二,在涉及浮动体的排版上行为不同

有时候我们不满足于 LaTeX \LaTeXLATEX 默认的断行和断页位置,需要进行微调,可以用以下命令告诉 LaTeX \LaTeXLATEX 哪些地方适合断行或断页,哪些地方不适合:

\linebreak[⟨n⟩] \nolinebreak[⟨n⟩]
\pagebreak[⟨n⟩] \nopagebreak[⟨n⟩]

以上命令都带一个可选参数,用数字 ⟨n⟩ 代表适合/不适合的程度,取值范围为 0–4,不带可选参数时,缺省为 4. 比如 \linebreak 或者 \linebreak[4] 意味着此处需要强行断行;`nopagebreak\nopagebreak[4]` 意味着禁止在此处断页.

以上命令适合给出优先考虑断行断页/禁止断行断页的位置,但不适合直接拿来断行或断页,使用 \newline\newpage 等命令是更好的选择. 因为 \newline\newpage 会在断行/断页位置填充适当的间距,但 \linebreak\pagebreak 不能,使用这些命令强行断行/断页可能会制造出糟糕的排版效果.

使用\verb|\newline| 断行的效果
\newline
与使用\verb|\linebreak| 断行的效果
\linebreak
进行对比。

在这里插入图片描述

2.3.3 断词

如果 LaTeX \LaTeXLATEX 遇到了很长的英文单词,仅在单词之间的“空格”处断行无法生成疏密程度匀称的段落时,就会考虑从单词中间断开. 对于绝大多数单词,LaTeX \LaTeXLATEX 能够找到合适的断词位置,在断开的行尾加上连字符 -

如果一些单词没能自动断词,我们可以在单词内手动使用 \- 命令指定断词的位置:

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

在这里插入图片描述

3. 文档元素

3.1 章节和目录

3.1.1 章节标题

一篇结构化的、条理清晰文档一定是层次分明的,通过不同的命令分割为章、节、小节. 三个标准文档类 articlereportbook 提供了划分章节的命令:

\chapter{⟨title⟩} 
\section{⟨title⟩} 
\subsection{⟨title⟩}
\subsubsection{⟨title⟩} 
\paragraph{⟨title⟩} 
\subparagraph{⟨title⟩}

其中 \chapter 只在 reportbook 文档类有定义

这些命令生成章节标题,并能够自动编号.

上述命令除了生成带编号的标题之外,还向目录中添加条目,并影响页眉页脚的内容,每个命令有两种变体:

  • 带可选参数

    \section[⟨short title⟩]{⟨title⟩}
    

    标题使用 ⟨title⟩ 参数,在目录和页眉页脚中使用 ⟨short title⟩ 参数

  • 带星号

    \section*{⟨title⟩}
    

    标题不带编号,也不生成目录项和页眉页脚

  • article 文档类带编号的层级为 \section\subsection\subsubsection 三级

  • reportbook 文档类带编号的层级为 \chapter\section\subsection 三级

LaTeX \LaTeXLATEX 及标准文档类并未提供为 \section 等章节命令定制格式的功能,这一功能由titlesec宏包提供

3.1.2 目录

LaTeX \LaTeXLATEX 中生成目录非常容易,只需在合适的地方使用命令:

\tableofcontents

这个命令会生成单独的一章(reportbook)或一节(article),标题默认为“Contents

\tableofcontents 生成的章节默认不写入目录(\section\chapter),可使用tocbibind等宏包修改设置

titletoctocloft等宏包提供了具体定制目录项格式的功能

正确生成目录项,一般需要编译两次源代码

3.1.3 文档结构的划分

所有标准文档类都提供了一个 \appendix 命令将正文和附录分开,使用 \appendix 后,最高一级章节改为使用拉丁字母编号,从 A 开始

book 文档类还提供了前言、正文、后记结构的划分命令:

  • \frontmatter 前言部分,页码使用小写罗马数字;其后的 \chapter 不编号
  • \mainmatter 正文部分,页码使用阿拉伯数字,从 1 11 开始计数,其后的章节编号正常
  • \backmatter 后记部分,页码格式不变,继续正常计数;其后的 \chapter 不编号

以上三个命令还可和 \appendix 命令结合,生成有前言、正文、附录、后记四部分的文档

\documentclass{book}
% 导言区,加载宏包和各项设置,包括参考文献、索引等
\usepackage{makeidx} % 调用makeidx 宏包,用来处理索引
\makeindex % 开启索引的收集
\bibliographystyle{plain} % 指定参考文献样式为plain
\begin{document}
\frontmatter % 前言部分
\maketitle % 标题页
\include{preface} % 前言章节preface.tex
\tableofcontents
\mainmatter % 正文部分
\include{chapter1} % 第一章chapter1.tex
\include{chapter2} % 第二章chapter2.tex
...
\appendix % 附录
\include{appendixA} % 附录A appendixA.tex
...
\backmatter % 后记部分
\include{prologue} % 后记prologue.tex
\bibliography{books} % 利用BibTeX 工具从数据库文件books.bib 生成参考文献
\printindex % 利用makeindex 工具生成索引
\end{document}

3.2 标题页

LaTeX \LaTeXLATEX 支持生成简单的标题页. 首先需要给定标题和作者等信息:

\title{⟨title⟩}
\author{⟨author⟩}
\date{⟨date⟩}

其中前两个命令是必须的(不用 \title 会报错;不用 \author 会警告),\date 命令可选

LaTeX \LaTeXLATEX 还提供了一个 \today 命令自动生成当前日期,\date 默认使用 \today.

\title\author 等命令内可以使用 \thanks 命令生成标题页的脚注,用 \and 隔开多个人名.

在信息给定后,就可以使用 \maketitle 命令生成一个简单的标题页了:

\title{Test title}
\author{ Mary\thanks{E-mail:*****@***.com}
\and Ted\thanks{Corresponding author}
\and Louis}
\date{\today}

在这里插入图片描述

article 文档类的标题默认不单独成页,而 reportbook 默认单独成页.

可在 \documentclass 命令调用文档类时指定 titlepage / notitlepage 选项以修改默认的行为.

LaTeX \LaTeXLATEX 标准类还提供了一个简单的 titlepage 环境,生成不带页眉页脚的一页. 用户可以在这个环境中使用各种排版元素自由发挥,生成自定义的标题页以替代 \maketitle 命令. 甚至可以利用 titlepage 环境重新定义 \maketitle

\renewcommand{\maketitle}{\begin{titlepage}
... % 用户自定义命令
\end{titlepage}}

事实上,为标准文档类指定了 titlepage 选项以后,使用 \maketitle 命令生成的标题页就是一个 titlepage 环境.

3.3 交叉引用

交叉引用是 LaTeX \LaTeXLATEX 强大的自动排版功能的体现之一,在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用 \label 命令:

\label{⟨label-name⟩}

之后可以在别处使用 \ref\pageref 命令,分别生成交叉引用的编号和页码:

\ref{⟨label-name⟩} 
\pageref{⟨label-name⟩}

【Example】

A reference to this subsection
\label{sec:this} looks like:
``see section~\ref{sec:this} on
page~\pageref{sec:this}.''

在这里插入图片描述

为了生成正确的交叉引用,一般也需要多次编译源代码

\label 命令可用于记录各种类型的交叉引用,使用位置分别为:

  • 章节标题:在章节标题命令 \section 等之后紧接着使用
  • 行间公式:单行公式在公式内任意位置使用;多行公式在每一行公式的任意位置使用
  • 有序列表:在 enumerate 环境的每个 \item 命令之后、下一个 \item 命令之前任意位置使用
  • 图表标题:在图表标题命令 \caption 之后紧接着使用
  • 定理环境:在定理环境内部任意位置使用

3.4 脚注和边注

3.4.1 脚注

使用 \footnote 命令可以在页面底部生成一个脚注:

\footnote{⟨footnote⟩}

假如我们输入以下文字和命令:

“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnote{出自《千字文》。}

正文显示为:

在这里插入图片描述

脚注在页面底部显示为:

在这里插入图片描述

有些情况下(比如在表格环境、各种盒子内)使用 \footnote 并不能正确生成脚注. 我们可以分两步进行,先使用 \footnotemark 为脚注计数,再在合适的位置用\footnotetext 生成脚注。比如:

\begin{tabular}{l}
\hline
“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnotemark \\
\hline
\end{tabular}
\footnotetext{表格里的名句出自《千字文》。}

效果为:

在这里插入图片描述

3.4.2 边注

使用 \marginpar 命令可在边栏位置生成边注:

\marginpar[⟨left-margin⟩]{⟨right-margin⟩}

如果只给定了 ⟨right-margin⟩,那么边注在奇偶数页文字相同;如果同时给定了 ⟨left-margin⟩,则偶数页使用 ⟨left-margin⟩ 的文字,例如以下代码:

\marginpar{\footnotesize 边注较窄,不要写过多文字,最好设置较小的字号。}

其效果为:

在这里插入图片描述

3.5 特殊环境

3.5.1 列表

LaTeX \LaTeXLATEX 提供了基本的有序和无序列表环境 enumerateitemize,两者的用法很类似,都用 \item 标明每个列表项,enumerate 环境会自动对列表项编号.

\begin{enumerate}
\item …
\end{enumerate}

其中 \item 可带一个可选参数,将有序列表的计数或者无序列表的符号替换成自定义的符号,列表可以嵌套使用,最多嵌套四层.

例如有序列表:

\begin{enumerate}
\item An item.
\begin{enumerate}
\item A nested item.\label{itref}
\item[*] A starred item.
\end{enumerate}
\item Reference(\ref{itref}).
\end{enumerate}

其效果为:

在这里插入图片描述

无序列表:

\begin{itemize}
\item An item.
\begin{itemize}
\item A nested item.
\item[+] A `plus' item.
\item Another item.
\end{itemize}
\item Go back to upper level.
\end{itemize}

其效果为:

在这里插入图片描述


关键字环境 description 的用法与以上两者类似,不同的是 \item 后的可选参数用来写关键字,以粗体显示,一般是必填的:

\begin{description}
\item[⟨item title⟩] …
\end{description}

例如:

\begin{description}
\item[Enumerate] Numbered list.
\item[Itemize] Non-numbered list.
\end{description}

其效果为:

在这里插入图片描述

各级无序列表的符号由命令 \labelitemi\labelitemiv 定义,可以简单地重新定义它们:

\renewcommand{\labelitemi}{\ddag}
\renewcommand{\labelitemii}{\dag}
\begin{itemize}
\item First item
\begin{itemize}
\item Subitem
\item Subitem
\end{itemize}
\item Second item
\end{itemize}

在这里插入图片描述

有序列表的符号由命令 \labelenumi\labelenumiv 定义,重新定义这些命令需要用到计数器相关命令:

\renewcommand{\labelenumi}%
{\Alph{enumi}>}
\begin{enumerate}
\item First item
\item Second item
\end{enumerate}

在这里插入图片描述

默认的列表间距比较宽,LaTeX \LaTeXLATEX 本身也未提供方便的定制功能,可用 enumitem 宏包定制各种列表间距,enumitem 宏包还提供了对列表标签、引用等的定制.

3.5.2 文本对齐环境

centerflushleftflushright 环境分别用于生成居中、左对齐和右对齐的文本环境.

\begin{center} … \end{center}
\begin{flushleft} … \end{flushleft}
\begin{flushright} … \end{flushright}

例如:

\begin{center}
Centered text using a
\verb|center| environment.
\end{center}
\begin{flushleft}
Left-aligned text using a
\verb|flushleft| environment.
\end{flushleft}
\begin{flushright}
Right-aligned text using a
\verb|flushright| environment.
\end{flushright}

其效果为:

在这里插入图片描述

除此之外,还可以用以下命令直接改变文字的对齐方式:

\centering 
\raggedright 
\raggedleft

例如:

\centering
Centered text paragraph.

\raggedright
Left-aligned text paragraph.

\raggedleft
Right-aligned text paragraph.

效果为:

在这里插入图片描述

有一点可以将两者区分开来:center 等环境会在上下文产生一个额外间距,而 \centering 等命令不产生,只是改变对齐方式. 比如在浮动体环境 tablefigure 内实现居中对齐,用 \centering 命令即可,没必要再用 center 环境.

3.5.3 引用环境

LaTeX \LaTeXLATEX 提供了两种引用的环境:quote 用于引用较短的文字,首行不缩进;quotation 用于引用若干段文字,首行缩进.

引用环境较一般文字有额外的左右缩进.

Francis Bacon says:
\begin{quote}
Knowledge is power.
\end{quote}

效果为:

在这里插入图片描述

《木兰诗》:
\begin{quotation}
万里赴戎机,关山度若飞。
朔气传金柝,寒光照铁衣。
将军百战死,壮士十年归。

归来见天子,天子坐明堂。
策勋十二转,赏赐百千强。⋯⋯
\end{quotation}

在这里插入图片描述

verse 用于排版诗歌,与 quotation 恰好相反,verse 是首行悬挂缩进的.

Rabindranath Tagore's short poem:
\begin{verse}
Beauty is truth's smile
when she beholds her own face in
a perfect mirror.
\end{verse}

在这里插入图片描述

3.5.4 摘要环境

摘要环境 abstract 默认只在标准文档类中的 articlereport 文档类可用,一般用于紧跟 \maketitle 命令之后介绍文档的摘要。如果文档类指定了 titlepage 选项,则单独成页;反之,单栏排版时相当于一个居中的小标题加一个 quotation 环境,双栏排版时相当于 \section* 定义的一节.

3.5.5 代码环境

有时我们需要将一段代码原样转义输出,这就要用到代码环境 verbatim,它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用;带星号的版本更进一步将空格显示成 “␣”.

\begin{verbatim}
#include <iostream>
int main()
{
    std::cout << "Hello, world!"
              << std::endl;
    return 0;
}
\end{verbatim}

在这里插入图片描述

\begin{verbatim*}
for (int i=0; i<4; ++i)
    printf("Number %d\n",i);
\end{verbatim*}

在这里插入图片描述

要排版简短的代码或关键字,可使用 \verb 命令:

\verb⟨delim⟩⟨code⟩⟨delim⟩

⟨delim⟩ 标明代码的分界位置,前后必须一致,除字母、空格或星号外,可任意选择使得不与代码本身冲突,习惯上使用 | 符号.

verbatim 环境,\verb 后也可以带一个星号,以显示空格:

\verb|\LaTeX| \\
\verb+(a || b)+ \verb*+(a || b)+

在这里插入图片描述

\verb命令对符号的处理比较复杂,一般不能用在其它命令的参数里,否则多半会出错

verbatim 宏包优化了 verbatim 环境的内部命令,并提供了 \verbatiminput 命令用来直接读入文件生成代码环境.fancyvrb 宏包提供了可定制格式的 Verbatim 环境;listings 宏包更进一步,可生成关键字高亮的代码环境,支持各种程序设计语言的语法和关键字.

3.6 表格

LaTeX \LaTeXLATEX 里排版表格不如 Word 等所见即所得的工具简便和自由,不过对于不太复杂的表格来讲,完全能够胜任.

排版表格最基本的 tabular 环境用法为:

\begin{tabular}[⟨align⟩]{⟨column-spec⟩}
⟨item1⟩ & ⟨item2⟩ & … \\
\hline
⟨item1⟩ & ⟨item2⟩ & … \\
\end{tabular}

其中 ⟨column-spec⟩ 是列格式标记;& 用来分隔单元格;\\ 用来换行;\hline 用来在行与行之间绘制横线

直接使用 tabular 环境的话,会和周围的文字混排。此时可用一个可选参数 ⟨align⟩ 控制垂直对齐:tb 分别表示按表格顶部、底部对齐,其他参数或省略不写(默认)表示居中对齐.

\begin{tabular}{|c|}
center-\\ aligned \\
\end{tabular},
\begin{tabular}[t]{|c|}
top-\\ aligned \\
\end{tabular},
\begin{tabular}[b]{|c|}
bottom-\\ aligned\\
\end{tabular} tabulars.

在这里插入图片描述

但是通常情况下 tabular 环境很少与文字直接混排,而是会放在 table 浮动体环境中,并用 \caption 命令加标题.

3.6.1 列格式

tabular 环境使用 ⟨column-spec⟩ 参数指定表格的列数以及每列的格式,基本的列格式见下表:

列格式
说明
l/c/r单元格内容左对齐/居中/右对齐,不折行
p{⟨width⟩}单元格宽度固定为 ⟨width⟩,可自动折行
|绘制竖线
@{⟨string⟩}自定义内容 ⟨string⟩

例如:

\begin{tabular}{lcr|p{6em}}
\hline
left & center & right
& par box with fixed width\\
L & C & R & P \\
\hline
\end{tabular}

在这里插入图片描述

表格中每行的单元格数目不能多于列格式里 l/c/r/p 的总数(可以少于这个总数),否则出错.

@ 格式可在单元格前后插入任意的文本,但同时它也消除了单元格前后额外添加的间距. @ 格式可以适当使用以充当“竖线”,特别地,@{} 可直接用来消除单元格前后的间距:

\begin{tabular}{@{} r@{:}lr @{}}
\hline
1 & 1 & one \\
11 & 3 & eleven \\
\hline
\end{tabular}

在这里插入图片描述

另外 LaTeX \LaTeXLATEX 还提供了简便的将格式参数重复的写法 *{⟨n⟩}{⟨column-spec⟩},比如以下两种写法是等效的:

\begin{tabular}{|c|c|c|c|c|p{4em}|p{4em}|}
\begin{tabular}{|*{5}{c|}*{2}{p{4em}|}}

有时需要为整列修饰格式,比如整列改变为粗体,如果每个单元格都加上 \bfseries 命令会比较麻烦。array 宏包提供了辅助格式 ><,用于给列格式前后加上修饰命令

% \usepackage{array}
\begin{tabular}{>{\itshape}r<{*}l}
	\hline
	italic & normal \\
	column & column \\
	\hline
\end{tabular}

在这里插入图片描述

array 宏包还提供了类似 p 格式的 m 格式和 b 格式,三者分别在垂直方向上靠顶端对齐、居中以及底端对齐:

% \usepackage{array}
\newcommand\txt{a b c d e f g h i}
\begin{tabular}{cp{2em}m{2em}b{2em}}
	\hline
	pos & \txt & \txt & \txt \\
	\hline
\end{tabular}

在这里插入图片描述

3.6.2 列宽

在控制列宽方面,LaTeX \LaTeXLATEX 表格有着明显的不足:l/c/r 格式的列宽是由文字内容的自然宽度决定的,而 p 格式给定了列宽却不好控制对齐(可用 array 宏包的辅助格式),更何况列与列之间通常还有间距,所以直接生成给定总宽度的表格并不容易.

tabularx 宏包为我们提供了方便的解决方案。它引入了一个 X 列格式,类似 p 列格式,不过会根据表格宽度自动计算列宽,多个 X 列格式平均分配列宽. X 列格式也可以用array 里的辅助格式修饰对齐方式:

% \usepackage{array,tabularx}
\begin{tabularx}{14em}%
	{|*{4}{>{\centering\arraybackslash}X|}}
	\hline
	A & B & C & D \\ \hline
	a & b & c & d \\ \hline
\end{tabularx}

在这里插入图片描述

3.6.3 横线

我们已经在之前的例子见过许多次绘制表格线的 \hline 命令. 另外\cline{⟨i⟩-⟨j⟩} 用来绘制跨越部分单元格的横线:

\begin{tabular}{|c|c|c|}
	\hline
	4 & 9 & 2 \\ \cline{2-3}
	3 & 5 & 7 \\ \cline{1-1}
	8 & 1 & 6 \\ \hline
\end{tabular}

在这里插入图片描述

在科技论文排版中广泛应用的表格形式是三线表,形式干净简明.三线表由 booktabs 宏包支持,它提供了\toprule\midrule\bottomrule 命令用以排版三线表的三条线,以及和 \cline 对应的 \cmidrule. 除此之外,最好不要用其它横线以及竖线:

% \usepackage{booktabs}
\begin{tabular}{cccc}
	\toprule
	& \multicolumn{3}{c}{Numbers} \\
	\cmidrule{2-4}
	& 1 & 2 & 3 \\
	\midrule
	Alphabet & A & B & C \\
	Roman & I & II& III \\
	\bottomrule
\end{tabular}

在这里插入图片描述

3.6.4 合并单元格

LaTeX \LaTeXLATEX 是一行一行排版表格的,横向合并单元格较为容易,由 \multicolumn 命令实现:

\multicolumn{⟨n⟩}{⟨column-spec⟩}{⟨item⟩}

其中 ⟨n⟩ 为要合并的列数,⟨column-spec⟩ 为合并单元格后的列格式,只允许出现一个 l / c / rp 格式

如果合并前的单元格前后带表格线 |,合并后的列格式也要带 | 以使得表格的竖线一致

\begin{tabular}{|c|c|c|}
	\hline
	1 & 2 & Center \\ \hline
	\multicolumn{2}{|c|}{3} &
	\multicolumn{1}{r|}{Right} \\ \hline
	4 & \multicolumn{2}{c|}{C} \\ \hline
\end{tabular}

在这里插入图片描述

上面的例子还体现了,形如 \multicolumn{1}{⟨column-spec⟩}{⟨item⟩} 的命令可以用来修改某一个单元格的列格式.

纵向合并单元格需要用到 multirow 宏包提供的 \multirow 命令

\multirow{⟨n⟩}{⟨width⟩}{⟨item⟩}

⟨width⟩ 为合并后单元格的宽度,可以填 * 以使用自然宽度

我们看一个结合 \cline\multicolumn\multirow 命令的例子:

% \usepackage{multirow}
\begin{tabular}{ccc}
	\hline
	\multirow{2}{*}{Item} & \multicolumn{2}{c}{Value} \\ \cline{2-3}
	& First & Second \\ \hline
	A & 1 & 2 \\ \hline
\end{tabular}

在这里插入图片描述

3.6.5 行距控制

LaTeX \LaTeXLATEX 生成的表格看起来通常比较紧凑,修改参数 \arraystretch 可以得到行距更加宽松的表格:

\renewcommand\arraystretch{1.8}
\begin{tabular}{|c|}
	\hline
	Really loose \\ \hline
	tabular rows.\\ \hline
\end{tabular}

在这里插入图片描述

3.7 图片

LaTeX \LaTeXLATEX 本身不支持插图功能,需要由 graphicx 宏包辅助支持. 在调用了graphicx 宏包以后,就可以使用 \includegraphics 命令加载图片了:

\includegraphics[⟨options⟩]{⟨filename⟩}

其中 ⟨filename⟩ 为图片文件名,与 \include 命令的用法类似,文件名可能需要用相对路径或绝对路径表示

图片文件的扩展名一般可不写,另外一定要注意,文件名里既不要有空格(类似 \include),也不要有多余的英文点号,否则宏包在解析文件名的过程中会出错.

另外 graphicx 宏包还提供了 \graphicspath 命令,用于声明一个或多个图片文件存放的目录,使用这些目录里的图片时可不用写路径:

% 假设主要的图片放在figures 子目录下,标志放在logo 子目录下
\graphicspath{{figures/}{logo/}}

\includegraphics 命令的可选参数 ⟨options⟩ 支持 ⟨key⟩=⟨value⟩ 形式赋值,常用的参数如下:

在这里插入图片描述

3.8 盒子

盒子是 LaTeX \LaTeXLATEX 排版的基础单元,虽然解释上去有些抽象:每一行是一个盒子,里面的文字从左到右依次排列;每一页也是一个盒子,各行文字从上到下依次排布⋯⋯

3.8.1 水平盒子

生成水平盒子的命令如下:

\mbox{…}
\makebox[⟨width⟩][⟨align⟩]{…}

\mbox 生成一个基本的水平盒子,内容只有一行,不允许分段(除非嵌套其它盒子,比如后文的垂直盒子). 外表看上去,\mbox 的内容与正常的文本无二,不过断行时文字不会从盒子里断开.

\makebox 更进一步,可以加上可选参数用于控制盒子的宽度 ⟨width⟩,以及内容的对齐方式 ⟨align⟩,可选居中 c(默认值)、左对齐 l、右对齐 r 和分散对齐 s.

|\mbox{Test some words.}|\\
|\makebox[10em]{Test some words.}|\\
|\makebox[10em][l]{Test some words.}|\\
|\makebox[10em][r]{Test some words.}|\\
|\makebox[10em][s]{Test some words.}|

在这里插入图片描述

3.8.2 带框的水平盒子

\fbox\framebox 让我们可以为水平盒子添加边框. 使用的语法与 \mbox\makebox 一模一样:

\fbox{…}
\framebox[⟨width⟩][⟨align⟩]{…}

可以通过 \setlength 命令调节边框的宽度 \fboxrule 和内边距 \fboxsep

\framebox[10em][r]{Test box}\\[1ex]
\setlength{\fboxrule}{1.6pt}
\setlength{\fboxsep}{1em}
\framebox[10em][r]{Test box}

在这里插入图片描述

3.8.3 垂直盒子

如果需要排版一个文字可以换行的盒子,LaTeX \LaTeXLATEX 提供了两种方式:

\parbox[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}{…}
\begin{minipage}[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}
…
\end{minipage}

其中⟨align⟩ 为盒子和周围文字的对齐情况(类似 tabular 环境);⟨height⟩⟨inner-align⟩ 设置盒子的高度和内容的对齐方式,类似水平盒子\makebox 的设置,不过⟨inner-align⟩ 接受的参数是顶部 t、底部 b、居中 c 和分散对齐 s.

三字经:\parbox[t]{3em}%
{人之初性本善性相近习相远}
\quad
千字文:
\begin{minipage}[b][8ex][t]{4em}
天地玄黄宇宙洪荒
\end{minipage}

在这里插入图片描述

3.8.4 标尺盒子

\rule 命令用来画一个实心的矩形盒子,也可适当调整以用来画线(标尺):

\rule[⟨raise⟩]{⟨width⟩}{⟨height⟩}

例如:

Black \rule{12pt}{4pt} box. \\ \\
Upper \rule[4pt]{6pt}{8pt} and
lower \rule[-4pt]{6pt}{8pt} box. \\ \\
A \rule[-.4pt]{3em}{.4pt} line.

在这里插入图片描述

3.9 浮动体

内容丰富的文章或者书籍往往包含许多图片和表格等内容,这些内容的尺寸往往太大,导致分页困难. LaTeX \LaTeXLATEX 为此引入了浮动体的机制,令大块的内容可以脱离上下文,放置在合适的位置.

LaTeX \LaTeXLATEX 预定义了两类浮动体环境 figuretable。习惯上 figure 里放图片,table 里放表格,但并没有严格限制,可以在任何一个浮动体里放置文字、公式、表格、图片等等任意内容.

table 环境的用法举例,figure 同理:

\begin{table}[⟨placement⟩]
…
\end{table}

⟨placement⟩ 参数提供了一些符号用来表示浮动体允许排版的位置,如 hbp 允许浮动体排版在当前位置、底部或者单独成页. tablefigure 浮动体的默认设置为 tbp.

在这里插入图片描述

  • 排版位置的选取与参数里符号的顺序无关,LaTeX \LaTeXLATEX 总是以 h-t-b-p 的优先级顺序决定浮动体位置,也就是说 [!htp][ph!t] 没有区别
  • 限制包括浮动体个数(除单独成页外,默认每页不超过 3 个浮动体,其中顶部不超过 2 个,底部不超过 1 个)以及浮动体空间占页面的百分比(默认顶部不超过 70%,底部不超过 30%)

双栏排版环境下,LaTeX \LaTeXLATEX 提供了 table*figure* 环境用来排版跨栏的浮动体. 它们的用法与 tablefigure 一样,不同之处为双栏的⟨placement⟩ 参数只能用 tp 两个位置.

浮动体的位置选取受到先后顺序的限制. 如果某个浮动体由于参数限制、空间限制等原因在当前页无法放置,就要推迟到之后处理,并使得之后的同类浮动体一并推迟. \clearpage 命令会在另起一页之前,先将所有推迟处理的浮动体排版成页,此时 htbp 等位置限制被完全忽略.

float 宏包为浮动体提供了 H 位置参数,不与 htbp! 混用. 使用 H 位置参数时,会取消浮动机制,将浮动体视为一般的盒子插入当前位置. 这在一些特殊情况下很有用(如使用 multicol 宏包排版分栏内容的时候),但尺寸过大的浮动体可能使得分页比较困难.

3.9.1 浮动体的标题

图表等浮动体提供了 \caption 命令加标题,并且自动给浮动体编号:

\caption{…}

\caption 的用法非常类似于 \section 等命令,可以用带星号的命令 \caption* 生成不带编号的标题,也可以使用带可选参数的形式 \caption[…]{…},使得在目录里使用短标题. \caption 命令之后还可以紧跟 \label 命令标记交叉引用.

\caption 生成的标题形如 “Figure 1: …”(figure 环境)或 “Table 1: …”(table 环境).可通过修改 \figurename\tablename 的内容来修改标题的前缀. 标题样式的
定制功能由 caption 宏包提供.

tablefigure 两种浮动体分别有各自的生成目录的命令:

\listoftables
\listoffigures

它们类似 \tableofcontents 生成单独的章节

3.9.2 并排和子图表

我们时常有在一个浮动体里面放置多张图的用法. 最简单的用法就是直接并排放置,也可以通过分段或者换行命令 \\ 排版多行多列的图片,以下为示意代码:

\begin{figure}[htbp]
    \centering
    \includegraphics[width=...]{...}
    \qquad
    \includegraphics[width=...]{...} \\[..pt]
    \includegraphics[width=...]{...}
    \caption{...}
\end{figure}

示意图大致如下:

在这里插入图片描述

由于标题是横跨一行的,用 \caption 命令为每个图片单独生成标题就需要借助前文提到的 \parbox 或者 minipage 环境,将标题限制在盒子内.

\begin{figure}[htbp]
    \centering
    \begin{minipage}{...}
        \centering
        \includegraphics[width=...]{...}
        \caption{...}
    \end{minipage}
    \qquad
    \begin{minipage}{...}
        \centering
        \includegraphics[width=...]{...}
        \caption{...}
    \end{minipage}
\end{figure}

示意图如下:

在这里插入图片描述

当我们需要更进一步,给每个图片定义小标题时,就要用到 subfig 宏包的功能了. 这里仅举一例:

\begin{figure}[htbp]
	\centering
	\subfloat[...]{\label{sub-fig-1}% 为子图加交叉引用
		\begin{minipage}{...}
			\centering
			\includegraphics[width=...]{...}
		\end{minipage}
	}
	\qquad
	\subfloat[...]{%
		\begin{minipage}{...}
			\centering
			\includegraphics[width=...]{...}
		\end{minipage}
	}
	\caption{...}
\end{figure}

在这里插入图片描述


版权声明:本文为dreaming_coder原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。