記法のルール(命令・空白・コメント)

\LaTeX is great と書くと、出てくるのは「LaTeXis great」です。空白が一つ消えているのに、エラーは一行も出ません。これはバグではなく、TeX が指示どおりに空白を捨てた結果です。LaTeX の記法のルール——命令の名前がどこで終わるのか、空白と改行がどうたたまれるのか、% コメントが本当は何を消しているのか——は、すべて「TeX が原稿を一行ずつどう読むか」という一点から導けます。このページではその読み取りの手順を追いかけ、初心者が必ず一度は踏む三つの地雷、消える空白・増える空白・止まらない書体変更を、対症療法ではなく仕組みの側から片づけます。

命令はどこで終わるのか——制御語と制御記号

命令の名前は、最初に現れた「英字でない文字」で終わります。原稿の大半はそのまま組まれる地の文ですが、バックスラッシュ \(日本語環境では円記号 ¥ として表示されることもあります)が現れた瞬間、TeX は「ここから命令の名前だ」と読み方を切り替えます。そして名前の取り方は 2 通りしかありません。\ のあとに 英字(A–Z, a–z)だけ が続くものが 制御語(control word)\ のあとに 英字以外の 1 文字 が来るものが 制御記号(control symbol) です。\section\LaTeX\newpage は前者、\$\%\&\ (バックスラッシュ+空白)は後者にあたります。

この区別は言葉遊びではなく、書き間違えたときの症状がまるで違います。制御語の名前は英字が続くかぎり伸び続けるので、\LaTeXlogo と書けば TeX は \LaTeXlogo に分けず、\LaTeXlogo という一つの名前として読み、そんな命令は無いので ! Undefined control sequence. で止まります。ロゴのあとに英字を続けたいなら、空白・記号・{} など 英字でない何か で名前を切らなければなりません。一方、制御記号は 1 文字で確定するので伸びようがなく、\$5 は「$のあとに 5」と素直に読まれます。数字や記号が直後に来る場面で \$\% が安全なのは、この一文字きりという性質のおかげです。

latex
% A control word is letters only; its name stops at the first non-letter.
\LaTeX        % the logo
\LaTeXlogo    % ! Undefined control sequence. -- read as ONE name

% A control symbol is exactly one non-letter after the backslash.
\$ \% \& \_   % the literal characters $ % & _
\,            % a thin space

\LaTeX is が「LaTeXis」になる理由

制御語の直後にある空白は、いくつあってもすべて読み飛ばされます。 空白は名前の終わりを示す合図として消費されるだけで、出力には一片も残りません。だから \LaTeX is great は「LaTeXis great」になります。ここで見落としやすいのは、消えるのがスペースだけではないという点です。タブも、そして 改行も 同じように飲み込まれます。原稿を読みやすくしようと \LaTeX で行を折って次の行に is great と書いても、結果は変わりません。つまり「空白を入れたつもり」がいちばん通じない場所が、命令の直後なのです。

直し方は三つあり、どれも結果は同じ「LaTeX is great」です。(1) 空の波括弧 \LaTeX{} is ——{} が英字でないので名前がそこで終わり、続く空白は普通の語間スペースとして生き残ります。(2) 制御空白 \LaTeX\ is ——\ (バックスラッシュ+空白)は「語間スペースを一つ置け」という命令そのものです。(3) 命令ごと波括弧で囲む {\LaTeX} is。実務では (1) が無難です。次に来るのが空白でも記号でも同じように働き、あとから文を編集しても壊れません。なお、この空白消失は自作命令でこそ頻発するので、tools バンドルの xspace パッケージ(David Carlisle らによる)が用意されています。定義の末尾に \xspace を置くと、次の文字が句読点でないときだけ空白を補ってくれます。

latex
\LaTeX is great        % -> LaTeXis great   (the space is eaten)

\LaTeX{} is great      % -> LaTeX is great
\LaTeX\ is great       % -> LaTeX is great
{\LaTeX} is great      % -> LaTeX is great

% In your own macros, let xspace decide:
\usepackage{xspace}
\newcommand{\myTeX}{\LaTeX\xspace}
\myTeX is great, and \myTeX, and \myTeX.  % space added, then not, then not

対照的に、制御記号は直後の空白を食べません\$ 5 と書けば $ と 5 のあいだに語間スペースが残ります。ここから \ のもう一つの用途が見えてきます。LaTeX は既定で文末のピリオドの後を少し広くあけるので、Prof. Smithet al. (1993) のような 省略を表すピリオド の後もつられて広がってしまいます。そこで Prof.\ Smithet al.\ (1993) と書き、「これは文末ではない」と教えて語間幅をそろえます。逆に「ここで行を折ってほしくない」なら タイ ~ を使います。Fig.~1Chapter~12Donald~E. Knuth~ は幅こそ普通の語間スペースですが、そこで行が分かれることは絶対にありません。細かい詰めには \,(thin space)があり、数式では \thinmuskip(3 mu = 1/6 em)、地の文では 0.16667 em と、どちらでも同じ幅になります。

波括弧の二つの仕事——引数を渡すことと、範囲を区切ること

波括弧 { }必須引数 を、角括弧 [ ]省略可能な引数(オプション) を囲みます。並び順は原則として 命令[オプション]{必須} で、\section{Introduction}{Introduction} は必須の見出し文字列、\documentclass[12pt]{article} では [12pt] がオプション、{article} が必須のクラス名です。引数が一文字なら括弧を省ける場面もありますが、省かないほうが安全です。あとから語を足したときに、括弧の無い引数は隣の文字まで巻き込むか、逆に巻き込まれるかのどちらかで壊れます。

そして { } にはもう一つ、グループを作る という仕事があります。書体やサイズを変える 宣言型の命令——\bfseries(太字)、\itshape(斜体)、\large(大きく)——は引数を取らず、「ここから先」をまるごと変えてしまいます。放っておくと文書の終わりまで太字のままになるのは、これが理由です。波括弧で囲めば効果は そのグループの内側だけ に閉じ込められ、} を越えた瞬間に元の設定が戻ります。{\bfseries bold here} back to normal と、引数を取る形の \textbf{bold here} back to normal は同じ結果になりますが、前者は「範囲を区切る」ぶん、複数の宣言をまとめて効かせたいときに使えます。

latex
\section{Introduction}             % {...} = mandatory argument
\documentclass[12pt]{article}     % [...] = optional, {...} = mandatory

{\bfseries bold here} back to normal   % braces fence the declaration in
\textbf{bold here} back to normal      % the argument form does the same

{\large\bfseries several at once} back to normal

この「範囲を区切る」考え方は、\begin{...}\end{...} の環境とまったく同じものです。環境は開くときにグループを開き、閉じるときにそれを閉じるので、中で行った書体変更は外へ漏れません。波括弧と環境は、規模が違うだけの同じ道具だと考えてください。詳しくは環境のページで扱います。

空白・改行・空行はどうたたまれるか

連続する空白は何個並べても語間スペース 1 つに、ソース中の改行 1 個もまた語間スペース 1 つになります。 単語のあいだを 1 個あけても 10 個あけても、あるいは行を折っても、出力は同じです。これは不便どころか設計の要で、行をどこで折るかを LaTeX が単独で決められるからこそ、両端揃えとハイフネーションが成立します。おかげで原稿の側は好きな幅で改行でき、バージョン管理の差分も一文単位で読める行に保てます。

では段落はどう変えるのか。答えは 空行 です。何も書かれていない行を 1 行はさむと、そこが段落の切れ目になります。空行を 2 つ以上続けても切れ目は 1 回ぶんです。ここに気づきにくい細部があります。空白だけが並んだ行も、空行として扱われます。 TeX は各行を読む前に行末の空白を捨てるので、スペースしか無い行は「何も無い行」になるからです。段落が切れるはずのない場所で切れた、あるいは切れるはずの場所で切れないというときは、エディタの表示上は見分けのつかないこの行を疑ってください。段落そのものの扱い(\par\parindent)は改行・改段落のページが受け持ちます。

latex
These     extra   spaces    collapse into one,
and this newline becomes a single space too.

A blank line -- and only a blank line -- starts a new paragraph.


Two blank lines do exactly what one does.

% はその行だけでなく、行末の改行まで消す

% からその行の終わりまではコメントで、組版時に完全に無視されます。しかも消えるのは行の残りだけでなく、行末の改行そのものも消えます。 覚え書きを残したり命令を一時的に無効化したりするのが本来の使い道ですが、この「改行まで消える」性質が、実は % のもう一つの主力用途を生みました。前節で見たとおりソース中の改行は空白 1 つになります。つまり長い語や長い命令をソース上で折りたいだけなのに、折った瞬間に余計な空白が入ってしまう。行末に % を置けばその空白が生まれず、次の行と隙間なくつながります。しかも % の後に始まる行は行頭の空白も読み飛ばされるので、継続行は好きなだけ字下げして構いません。 見た目を整えつつ出力は 1 語のまま、という書き方ができます。

latex
Visible text % from here to the end of the line is dropped, newline included

Anti%
        disestablishmentarianism   % -> one word: the indent is dropped too

\newcommand{\courseTitle}{%
  Advanced Topics in \LaTeX%
}                                  % no stray space at either seam

The rate was 100\% last year.      % a literal percent sign is \%

ここで一つ注意が要ります。% 自身が特殊文字なので、文字としてのパーセント記号を出したいときは \% と書きます。 忘れると、その行の残りが丸ごと消えます——エラーも警告も出ないまま、文の後半だけが PDF から欠落するので、症状としては最もたちが悪い部類です。なお \% は制御記号なので、直後の空白は食べません。ほかの特殊文字(# $ & _ { } ~ ^ \)の逃がし方は、特殊文字のページにまとめてあります。

複数行をまとめて無効化したいときは、行ごとに % を付ける以外に二つの手があります。verbatim パッケージ(または comment パッケージ)が提供する comment 環境\begin{comment} … \end{comment} と囲む方法と、TeX の条件分岐を使った \iffalse … \fi で囲む方法です。後者はパッケージ不要で手軽ですが、囲んだ中身も TeX に読まれるため、\if 系の対応が崩れているとそこで破綻します。下書きを丸ごと寝かせるなら comment 環境のほうが素直です。

latex
\usepackage{verbatim}   % in the preamble

\begin{comment}
This whole block is ignored.
\end{comment}

\iffalse
Draft text, parked with no package needed.
\fi

空白が消えた・増えたときに見る順序

まず、症状がエラーを伴うかどうかで二手に分かれます。 ! Undefined control sequence. のように止まる不具合は命令名の切れ目を疑い、エラーも警告も無いまま出力だけがおかしい不具合は空白とコメントを疑う——これが順序です。後者は行番号が手がかりにならないので、疑う対象を型で絞るしかありません。エラー行の少し前から、命令名が英字を巻き込んでいないか、{...}[...] の数が合っているかを見て、次に行末の % が必要な空白まで消していないか、% を文字として出す場所で \% を書き忘れていないかを確かめます。

書いたもの症状直し方
\LaTeXlogo! Undefined control sequence. で停止\LaTeX{}logo のように英字でない何かで名前を切る
\LaTeX is語がくっついて「LaTeXis」になる\LaTeX{} is\LaTeX\ is。自作命令なら \xspace
\bfseriesそこから先がずっと太字のまま{\bfseries ...} で囲むか、\textbf{...} を使う
100%その行の残りが黙って消える文字としての百分率は 100\% と書く
(a line of spaces)意図しない所で段落が切れる空白だけの行も空行。エディタで不可視文字を表示する

最後に、ルールを暗記するより 壊れにくい書き方を決めてしまう ほうが効きます。命令の直後に英字が続くなら {} で切る。意味のまとまりは {...} で囲む。長い定義は 1 行に詰め込まず、行末 % を添えて折る。そしてコメントアウトした旧稿を .tex に溜め込まない——比較したい版は Git のような履歴に任せ、いま組む内容だけを残せば、エラーの行番号が実際の原稿と一致してデバッグが速くなります。この四つで、初期のつまずきの大半は起きなくなります。