TeX 本体には \begin という命令がありません。Knuth の plain TeX が定義しているのは \beginsection だけで、\begin{...} … \end{...} という書き方は LaTeX が付け足したものです。では何のために付け足したのか。答えは一つの約束——\end を抜けた瞬間、中でいじった設定はすべて元に戻る——にあります。この 環境(environment) という仕組みは、箇条書きも別行立ての数式も図表も引用も、そして文書本体そのものも同じ形に揃えました。このページでは、LaTeX の環境が何を保証しているのか、どう入れ子にするのか、そして名前が食い違ったときに出る \begin{...} ended by \end{...} をどう読むのかを見ていきます。
\begin と \end が保証すること
環境が保証するのは「グループ」です。 \begin{name} は、その環境が何をする代物なのかを調べるより先に TeX のグループを開き、\end{name} はそれを閉じます。だから中で書体を変えようが余白を変えようが、\end を抜けた行では何も残りません。center 環境が中身を中央に寄せ、itemize 環境が箇条書きにし、quote 環境が左右の余白を広げても、それぞれの効果はその範囲の内側で完結します。逆に言えば、環境が提供しているのは飾りではなく 後始末の保証 であり、それこそが「まず環境を使う」という定石の理由です。
\begin{name} と \end{name} の 名前は完全に一致していなければなりません。\begin{center} を \end{flushleft} で閉じることはできません。ここで LaTeX は、いま開いている環境の名前を控えておくという地味な仕事をしています。だからこそエラーメッセージが両方の名前と、開いた側の行番号まで教えてくれるのです。そして文書全体も例外ではありません。\begin{document} … \end{document} は正真正銘の環境で、本文をここに書くという最小のルールは、単に「一番外側の環境の中に書く」という当たり前の話に過ぎません。
\begin{center}
This paragraph is centred; the line after \end is not.
\end{center}
\begin{quote}
{\itshape Everything inside is a group,}
so this italic never escapes the environment.
\end{quote}入れ子にする——開いた順の逆に閉じる
環境は入れ子にできますが、閉じる順序は開いた順序のちょうど逆です。\begin{a} の内側で \begin{b} を開いたなら、先に \end{b}、それから \end{a}。\begin{a}\begin{b}...\end{a}\end{b} のように 範囲を交差させることはできません。理由は前節の保証そのもので、環境がグループである以上、グループは箱の入れ子にしかなり得ず、半分だけ重なる形は存在しないからです。引用の中の箇条書き、図の中の表、定理の中の数式——実務で出てくる組み合わせはすべてこの入れ子として素直に書けます。
\begin{quote}
A bulleted list inside a quotation:
\begin{itemize}
\item first
\item second
\end{itemize}
\end{quote}実務上のコツは一つだけです。環境を開いたら、中身を書く前に閉じる行を書いてしまう。 そのうえで内側を 2 字か 4 字だけ字下げすると、figure の中の tabular、quote の中の itemize といった対応関係がソースの形として目に入るようになります。深い入れ子ほど、あとから中身を差し替えたときに \end を一つ取り違える事故が起きやすく、そしてその事故は次節のとおり 書いた場所では表面化しません。
最初に出会う環境——用途別の一覧
標準の LaTeX が用意する環境は、本文の配置・リスト・数式・フロート・表組み の五つに分けて眺めると全体が見通せます。個々の詳しい使い方はそれぞれのページに譲りますが、名前が違うだけで形は全部同じ——\begin で開き、\end で閉じ、内側はグループ——です。新しい環境に出会ったときも、まず「これは何を範囲として区切っているのか」と考えれば、たいてい当たりが付きます。
| 分類 | 環境 | 何をするか |
|---|---|---|
text | center, flushleft, flushright, quote, quotation, verbatim | 中央・左・右揃え、引用、入力どおりの出力 |
lists | itemize, enumerate, description | 記号付き・番号付き・見出し付きの項目列 |
math | equation, align, gather | 別行立ての数式、複数行の整列、番号付け |
floats | figure, table | キャプションと番号を持ち、置き場所を組版に委ねる |
tabular | tabular, array | 行と列の格子そのもの。figure/table とは役割が別 |
この一覧のなかで混同されやすい組を三つ挙げておきます。quote と quotation はどちらも引用を左右から字下げしますが、quotation は各段落の先頭をさらに字下げするので、複数段落にわたる長い引用に向きます。figure/table と tabular はまったく別物で、前者は「浮かせてキャプションと番号を付ける入れ物」、後者は「格子そのもの」です。表に番号と相互参照が要るなら、tabular を table の中に入れます。そして verbatim は中身を等幅で入力どおりに出し、\ や { すら命令として解釈しません。プログラムのソースを見せるときの定番です。
一部の環境は 引数を取ります。\begin の直後に続く {...} や [...] がそれで、たとえば tabular は列の指定が必須です。\begin{tabular}{cc} の {cc} が各列の揃え(c 中央・l 左・r 右)を与え、中では & で列を区切り、各行を \\ で終えます。同じく figure は \begin{figure}[htbp] のように置き場所の希望をオプションで受け取ります。引数を取る位置は環境名のすぐ後ろで、\end の側には何も書きません。
\begin{figure}[htbp]
\centering
\begin{tabular}{ll}
input & output \\
source & PDF \\
\end{tabular}
\caption{A tabular grid inside a floating table}
\label{tab:demo}
\end{figure}align と align* の違い——星は名前の一部
名前の末尾に * を付けた形は「番号を振らない版」です。 align はすべての行に式番号を振りますが、\begin{align*} … \end{align*} は振りません。equation* も同じで、番号なしの別行立て数式になります。ここで面白いのは、* がオプションでも引数でもなく 名前そのものの一部 だという点です。\begin は渡された文字列をそのまま命令名に組み立てるので、align* という——星を含んだ——名前の命令が本当に作られます。前のページで見たとおり、制御語の名前は英字でない文字で終わります。つまりこの命令は \align* と書いて呼び出すことが原理的にできず、\begin{align*} という経路からしか触れません。
\begin{align} % every line gets an equation number
a &= b + c \\
d &= e + f
\end{align}
\begin{align*} % same layout, no numbers at all
a &= b + c \\
d &= e + f
\end{align*}\begin{...} ended by \end{...} が出たら
このメッセージは「閉じ方が違う」ではなく「開いていたのはこちらだ」と教えています。 名前が食い違うと LaTeX は ! LaTeX Error: \begin{center} on input line 5 ended by \end{flushleft}. のように、開いた環境の名前と その行番号 を添えて止まります。読むべきは後半の \end ではなく前半です——エラーが報告される行はたいてい \end の側で、本当に直すべき場所は前半が指す行だからです。\end を書き忘れた場合も同じ形で出ますが、そのときの相手は \end{document} になります。! LaTeX Error: \begin{itemize} on input line 2 ended by \end{document}. と出たら、2 行目に開いた itemize が最後まで閉じられなかったという意味です。
名前を打ち間違えたときは、様子が少し変わります。\begin{itemzie} のように定義のない名前を書くと、まず ! LaTeX Error: Environment itemzie undefined. が出て、そのあと ! LaTeX Error: \begin{document} ended by \end{itemzie}. が続きます。エラーが二つ出るのは、\begin が「その環境が存在するか」を調べる 前に グループを開いてしまうからです。開きっぱなしのグループが残るので、対応する \end が今度は誰とも合わなくなる。ここから実務上の教訓が一つ出ます——エラーは上から一つずつ潰し、二つ目以降は無視して組み直す。 最初のエラーが二つ目の原因であることが、環境まわりでは特に多いのです。
もう一つ、見分けのつく手がかりがあります。波括弧 { を閉じ忘れた場合は、LaTeX ではなく TeX 自身のメッセージが出ます。 ログの末尾に近いところに (\end occurred inside a group at level 1) とだけ書かれていて、行番号がありません。名前を持たない素のグループが開いたままなので、TeX には「どこで」を答える材料が無いのです。逆に言えば、行番号付きのメッセージが出ているなら環境の対応、行番号無しのこのメッセージだけなら波括弧——と当たりを付けられます。範囲を絞るときは、疑わしい環境を別ファイルに切り出して単独でコンパイルするのが結局いちばん速い方法です。
環境は見た目ではなく意味で選ぶ
環境は見た目の箱ではなく、原稿の部品名です。 引用だから quote、項目列だから itemize、格子だから tabular、番号と相互参照が要るから figure/table——この選び方をしておくと、あとからキャプション、番号、参照、図表目次が自然につながります。逆に「中央に寄せたいから center」「余白がほしいから quote」という選び方を続けると、半年後の自分が「この箱は何だったのか」を判断できなくなり、体裁の一括変更もできなくなります。見た目だけを変えたいのなら、環境ではなく宣言や余白の命令を使うほうが正直です。
- 中身が引用 —
quote/quotationを使い、出典は本文か脚注で示す。 - 中身が論理的な項目列 —
itemize/enumerate/descriptionを使い、\\で箇条書きを偽装しない。 - 番号と参照が要る図表 —
figure/tableの中に\captionと\labelを置き、格子はtabularに任せる。 - 同じ組み合わせが何度も出る — 局所的な書式命令をコピーせず、
\newenvironmentで名前を付けて意味を固定する。
最後の項目が示すとおり、環境は使うだけでなく 自分で定義することもできます。\newenvironment は「開始時に実行するコード」と「終了時に実行するコード」を与える命令で、既存の名前を作り変えるなら \renewenvironment を使います。引数の受け渡し、\end 側で引数が使えない理由、NewDocumentEnvironment による現代的な書き方といった細部は、自作環境の専用ページにまとめてあります。ここで押さえておくべきは一点だけ——自分で定義した環境にも、この節で見たグループの保証がそのまま付いてくる ということです。