由 \begin{...} 到 \end{...} 包住的一整块区域称为 环境(environment)。它用来划定文档中的一段范围,并把某种行为或格式应用到其中的所有内容;LaTeX 中几乎所有结构(列表、陈列公式、图、表、引用)都采用这种形式。本页说明环境是什么、环境如何嵌套、常见环境有哪些,以及如何定义自己的环境。
环境是什么
环境是一个 有界的块:从 \begin{name} 开始,到 \end{name} 结束,并对其中内容施加某种效果。center 环境会把内部内容居中;itemize 环境会把内部内容变成项目符号列表。关键规则是:开头和结尾的名称必须完全一致。不能用 \begin{center} 打开,却用 \end{flushleft} 关闭。
\begin{center}
この段落は中央に寄ります。
\end{center}同样重要的是:环境会形成一个隐式分组,也就是局部作用域。在环境内对字体或间距所做的修改,会在 \end{...} 处恢复,不会泄漏到外部。例如 quote 环境改变了缩进和边距,离开环境后周围正文就会恢复正常。可以把环境理解为自带与花括号分组 { ... } 相同的作用域。
实际上,整个文档本身也是一个环境:\begin{document} … \end{document}。正文必须全部写在 document 环境内部这一最小规则,正是由此而来。
环境如何嵌套
环境 可以嵌套,但必须按打开顺序的相反顺序关闭。如果在 \begin{a} 内部打开 \begin{b},就要先用 \end{b} 关闭内层,再用 \end{a} 关闭外层,也就是 \begin{a}\begin{b}...\end{b}\end{a} 的形状。
\begin{quote}
引用の中に箇条書きを置く例:
\begin{itemize}
\item 一つ目
\item 二つ目
\end{itemize}
\end{quote}相反,不能写成 \begin{a}\begin{b}...\end{a}\end{b} 这样让范围 交叉(重叠) 的形式。这是 LaTeX 中最常见的错误之一,会产生类似 \begin{...} ended by \end{...} 的消息,表示打开和关闭的环境不匹配。在长文档中,把每个环境缩进出来,让配对关系在源码中清楚可见,可以避免漏写或写错 \end。
常见环境
标准 LaTeX 按用途提供了许多环境。下面按作用列出代表性的环境。每个环境的详细用法会在专门页面中说明,但它们都共享同样的 \begin / \end 形式。
| 类别 | 环境 | 作用 | |
|---|---|---|---|
text | 文本 | center, flushleft, flushright, quote, quotation, verbatim | 居中/左对齐/右对齐、引用、逐字输出 |
lists | 列表 | itemize, enumerate, description | 项目符号、编号和定义式列表 |
math | 数学 | equation, align | 陈列公式;多行对齐公式 |
floats | 浮动体 | figure, table | 让图和表浮动到合适位置 |
tabular | 表格 | tabular | 构造由行和列组成的表 |
quote 和 quotation 都会缩进引用内容,但 quotation 还会进一步缩进每个段落的首行,更适合较长的多段引用。verbatim 环境会用等宽字体 按输入原样 输出内容,连 \、{ 等特殊字符也按字面处理,而不是解释为命令;展示程序源代码时很有用。
有些环境 带参数。tabular 必须指定列格式:像 \begin{tabular}{cc} 这样,在 \begin{tabular} 后面的参数中给出各列的对齐方式(c 居中、l 左对齐、r 右对齐)。表格内部用 & 分隔列,每行以 \\ 结束。
\begin{tabular}{cc}
名前 & 役割 \\
TeX & 組版エンジン \\
LaTeX & 文書フォーマット \\
\end{tabular}许多环境还有在名称末尾加 * 的 星号形式。例如 align 环境会给每一行编号,而 \begin{align*} … \end{align*} 是 不编号 的版本。equation* 同样会生成没有编号的陈列公式。
定义自己的环境
如果在文档中反复使用同一组格式,可以用 \newenvironment 定义自己的环境。定义一次之后,就能用自己的名称配合 \begin / \end 调用。语法如下([nargs] 和 [default] 可省略):
\newenvironment{名前}[nargs][default]{開始時のコード}{終了時のコード}- name — 新环境的名称(不写反斜杠;不能以
end开头)。 - nargs — 参数个数(0–9);在正文中用
#1,#2, … 引用。 - default — 指定后,第一个参数变为可选参数,并以此作为默认值。
- begin-code — 在
\begin{name}时执行;这里可以使用#1等参数。 - end-code — 在
\end{name}时执行;这里不能使用#1等参数。
举例来说,下面创建一个 important 环境,用带框的形式突出注意事项。标题词可以通过可选参数传入,默认值为“重要”。由于指定了 default,#1 会接收这个参数。
\newenvironment{important}[1][重要]{%
\begin{quote}\noindent\textbf{#1:}\itshape
}{%
\end{quote}%
}
% 使い方
\begin{important}
締め切りは厳守してください。
\end{important}
\begin{important}[注意]
バックアップを忘れずに。
\end{important}第一个用法使用默认的“重要:”作为标题;第二个传入 [注意],标题变为“注意:”。两者都会把后续正文排成斜体。请注意,begin-code 中打开了 \begin{quote},而 end-code 中关闭了对应的 \end{quote}。由于环境本身就是一个分组,\itshape(斜体)的效果会在 \end{important} 自动恢复,不会影响外部正文。
要重新定义已有环境,请使用 \renewenvironment。它的语法与 \newenvironment 相同,但只能用于 已经定义过的名称(未定义名称会报错)。反过来,\newenvironment 用在已有名称上会报错。\newenvironment 和 \renewenvironment 也都有带 * 的派生形式,它们在处理参数末尾空白时有所不同。
避免漏写结尾的写法
在长文档中,环境错误未必会在你写错的位置出现;它可能在几页之后靠近 \end{document} 的地方才暴露出来。因此要养成习惯:打开环境后立刻写出关闭行,然后再在中间填内容。嵌套块用两个或四个空格缩进,让源码清楚显示谁在谁的内部,例如 figure 中的 tabular、quote 中的 itemize。
\begin{figure}
\centering
\begin{tabular}{ll}
入力 & 出力 \\
source & PDF \\
\end{tabular}
\caption{処理の対応}
\end{figure}出现错误时,不要只凭日志中的 \begin{...} ended by \end{...} 那一行判断。把刚添加的环境切成最小示例。表、图、公式、列表各自先作为能独立编译的小片段通过,再放回主文件,就能把漏写 \end 与包本身的问题分开。
把环境当作语义部件来选择
环境不只是视觉上的盒子;它给稿件中的部件命名。引用用 quote,项目符号列表用 itemize,表格网格用 tabular,需要标题、编号、交叉引用和图表目录的浮动材料用 figure 或 table。如果只是为了外观选择 center,或只是为了多一点边距选择 quote,在长文档中这个块的作用就会变得不清楚。
- 该块的含义是引用 — 使用
quote/quotation,并在正文或脚注中注明来源。 - 该块是逻辑列表 — 使用
itemize/enumerate/description;不要用\\伪造项目符号。 - 图或表需要编号和引用 — 在
figure或table中放置\caption和\label。 - 自定义块反复出现 — 用
\newenvironment命名,而不是复制局部格式命令。