环境

\begin{...}\end{...} 包住的一整块区域称为 环境(environment)。它用来划定文档中的一段范围,并把某种行为或格式应用到其中的所有内容;LaTeX 中几乎所有结构(列表、陈列公式、图、表、引用)都采用这种形式。本页说明环境是什么、环境如何嵌套、常见环境有哪些,以及如何定义自己的环境。

环境是什么

环境是一个 有界的块:从 \begin{name} 开始,到 \end{name} 结束,并对其中内容施加某种效果。center 环境会把内部内容居中;itemize 环境会把内部内容变成项目符号列表。关键规则是:开头和结尾的名称必须完全一致。不能用 \begin{center} 打开,却用 \end{flushleft} 关闭。

latex
\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} 的形状。

latex
\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构造由行和列组成的表

quotequotation 都会缩进引用内容,但 quotation 还会进一步缩进每个段落的首行,更适合较长的多段引用。verbatim 环境会用等宽字体 按输入原样 输出内容,连 \{ 等特殊字符也按字面处理,而不是解释为命令;展示程序源代码时很有用。

有些环境 带参数tabular 必须指定列格式:像 \begin{tabular}{cc} 这样,在 \begin{tabular} 后面的参数中给出各列的对齐方式(c 居中、l 左对齐、r 右对齐)。表格内部用 & 分隔列,每行以 \\ 结束。

latex
\begin{tabular}{cc}
  名前 & 役割 \\
  TeX & 組版エンジン \\
  LaTeX & 文書フォーマット \\
\end{tabular}

许多环境还有在名称末尾加 *星号形式。例如 align 环境会给每一行编号,而 \begin{align*}\end{align*}不编号 的版本。equation* 同样会生成没有编号的陈列公式。

定义自己的环境

如果在文档中反复使用同一组格式,可以用 \newenvironment 定义自己的环境。定义一次之后,就能用自己的名称配合 \begin / \end 调用。语法如下([nargs][default] 可省略):

latex
\newenvironment{名前}[nargs][default]{開始時のコード}{終了時のコード}
  • name — 新环境的名称(不写反斜杠;不能以 end 开头)。
  • nargs — 参数个数(0–9);在正文中用 #1, #2, … 引用。
  • default — 指定后,第一个参数变为可选参数,并以此作为默认值。
  • begin-code — 在 \begin{name} 时执行;这里可以使用 #1 等参数。
  • end-code — 在 \end{name} 时执行;这里不能使用 #1 等参数

举例来说,下面创建一个 important 环境,用带框的形式突出注意事项。标题词可以通过可选参数传入,默认值为“重要”。由于指定了 default#1 会接收这个参数。

latex
\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 中的 tabularquote 中的 itemize

latex
\begin{figure}
  \centering
  \begin{tabular}{ll}
    入力 & 出力 \\
    source & PDF \\
  \end{tabular}
  \caption{処理の対応}
\end{figure}

出现错误时,不要只凭日志中的 \begin{...} ended by \end{...} 那一行判断。把刚添加的环境切成最小示例。表、图、公式、列表各自先作为能独立编译的小片段通过,再放回主文件,就能把漏写 \end 与包本身的问题分开。

把环境当作语义部件来选择

环境不只是视觉上的盒子;它给稿件中的部件命名。引用用 quote,项目符号列表用 itemize,表格网格用 tabular,需要标题、编号、交叉引用和图表目录的浮动材料用 figuretable。如果只是为了外观选择 center,或只是为了多一点边距选择 quote,在长文档中这个块的作用就会变得不清楚。

  • 该块的含义是引用 — 使用 quote / quotation,并在正文或脚注中注明来源。
  • 该块是逻辑列表 — 使用 itemize / enumerate / description;不要用 \\ 伪造项目符号。
  • 图或表需要编号和引用 — 在 figuretable 中放置 \caption\label
  • 自定义块反复出现 — 用 \newenvironment 命名,而不是复制局部格式命令。