LaTeX の原稿は、ふつうの文章(地の文)の中に命令を埋め込んだものです。その命令・空白・コメントには、最初に体に入れておくと一生つまずかない少数のルールがあります。なぜ \LaTeX is と書くと空白が消えるのか、なぜ Enter を 2 回押すと段落が変わるのか――このページで、その仕組みをまとめて押さえます。
地の文と命令
原稿の大部分は 地の文――そのまま組まれる普通の文字列です。Hello と書けば Hello と出ます。これに対し 命令(コマンド) は、改行・見出し・書体の変更といった「組版への指示」で、必ず **バックスラッシュ \**(日本語環境では円記号 ¥ として表示されることもあります)で始まります。\LaTeX はロゴを、\newpage は改ページを意味し、いずれも文字としては出力されません。
バックスラッシュに続く命令の名前を 制御綴(control sequence) と呼びます。これには 2 種類あります。\ のあとに 英字(A–Z, a–z)だけ が並ぶものを 制御語(control word)、\ のあとに 英字以外の 1 文字 が来るものを 制御記号(control symbol) といいます。\section・\LaTeX・\newpage は制御語、\$・\%・\&・\ (バックスラッシュ+空白)は制御記号です。両者は名前の決まり方が違うだけでなく、直後の空白の扱いも異なります(次節)。
なぜ区別が要るのか。制御語の名前は「英字でなくなった所」で自動的に終わるので、\LaTeXlogo のように続けて書くと \LaTeXlogo という別の命令だと解釈されてしまいます。\LaTeX で切りたいなら、空白・記号・{} など英字以外の何かで区切らねばなりません。一方、制御記号は 1 文字で完結するので、\$5 のように数字を続けても問題ありません。
制御語は直後の空白を食べる
ここが最大の落とし穴です。制御語の直後の空白(スペース・タブ・改行)は、すべて読み飛ばされます。 名前の区切りとして使われるだけで、出力には何のスペースも生みません。したがって \LaTeX is great と書くと、\LaTeX と is の間の空白が消え、出力は「LaTeXis great」とくっついてしまいます。
直すには 3 つの定番があります。(1) 空の波括弧 を置く \LaTeX{} is――{} が名前を終わらせ、地の文の空白がそのまま残ります。(2) 制御空白 を使う \LaTeX\ is――\ (バックスラッシュ+空白)は強制的に通常の語間スペースを 1 つ作ります。(3) 命令を波括弧で囲む {\LaTeX} is。どれでも結果は同じ「LaTeX is」です。迷ったら {} が無難で、直後が空白でも記号でも常に正しく働きます。
% 制御語の直後の空白は消える / The space after a control word vanishes:
\LaTeX is great % → LaTeXis great (まちがい / wrong)
% 直し方 / The fixes — all give “LaTeX is great”:
\LaTeX{} is great
\LaTeX\ is great
{\LaTeX} is great逆に 制御記号は直後の空白を食べません。\$ のあとの空白はそのまま語間スペースとして残ります。なお \ という制御空白は、命令の後始末だけでなく、Prof.\ Smith や et al.\ (1993) のように 省略を表すピリオド の直後でも使います。LaTeX は既定で文末のピリオドの後を少し広くあけるため、\ で「これは文末ではない」と教えて語間幅をそろえるわけです。
引数と波括弧によるグループ化
多くの命令は 引数(ひきすう) を取ります。引数には 2 種類あり、**波括弧 { } は必須引数、角括弧 [ ] は省略可能な引数(オプション)** を囲みます。たとえば \section{はじめに} の {はじめに} は必須の見出し文字列、\documentclass[12pt]{article} では [12pt] がオプション、{article} が必須のクラス名です。順序は通常 命令[オプション]{必須} の形になります。
さらに { } には 「適用範囲を区切る(グループ化)」 という第二の役割があります。書体やサイズを変える 宣言型の命令――\bfseries(太字)、\itshape(斜体)、\large(大きく)など――は、引数を取らず「ここから先」を変えてしまいます。これを波括弧で囲むと、効果は そのグループの内側だけ に閉じ込められます。{\bfseries 太字} 普通 と書けば「太字」だけが太くなり、} を境に元に戻ります。
\section{はじめに} % 必須引数 / mandatory argument
\documentclass[12pt]{article} % [オプション]{必須} / [optional]{required}
{\bfseries 太字になる} ここは普通 % {} で効果を閉じ込める / braces limit the scope
{\bfseries bold here} back to normalグループの内と外は独立しているので、見た目の変更が思わぬ範囲に漏れません。これは環境(\begin{...}...\end{...})が範囲を区切るのと同じ発想で、\begin〜\end の対も一つのグループを作ります。環境については別ページで詳しく扱います。
空白・改行・空行
空白の扱いには、原稿の見た目と出力を切り離す独特のルールがあります。まず、連続する空白(スペースやタブ)は何個並べても 1 つの語間スペースにまとめられます。 単語の間を 1 個あけても 10 個あけても、出力は同じです。さらに、ソース中の 1 個の改行は、ただの空白として扱われます。 行のどこで折り返しても、最終的な改行位置は LaTeX が決めるので、原稿を読みやすい幅で改行して構いません。
では段落はどう区切るのか。答えは 空行――何も書かれていない行を 1 行はさむと、そこが段落の切れ目になります。空行を 2 つ以上続けても、空行 1 つと同じ「1 回の改段落」です。逆に言えば、原稿で改行しただけでは段落は変わりません。この改行・改段落のより細かい制御(\\ による強制改行など)は、改行・改段落のページで扱います。
これらの 余分な空白は 1 つにまとめられ、
この改行も空白 1 つになります。
空行をはさむと、ここから新しい段落が始まります。語間スペースをこちらの意図どおりに置きたい場面もあります。代表が **タイ ~――これは 改行されない空白(ノーブレークスペース)** で、Fig.~\ref{fig:1} や Chapter~12、Donald~E. Knuth のように、空白の前後で行が分かれてほしくない所に入れます。幅は通常の語間スペースと同じですが、ここで行は折れません。一方 **\ (制御空白) は前述のとおり通常幅のスペースを強制し、数式モードでは \,(細い空白=thin space, 3/18 quad 幅)** で字間を微調整できます。
注釈(コメント)
**パーセント記号 % から その行の終わりまで は注釈(コメント)で、コンパイル時に完全に無視されます。出力には現れないので、原稿に覚え書きを残したり、命令を一時的に無効化(コメントアウト)したりするのに使います。コメントは行末まで及ぶだけでなく、その行末の改行(と末尾の空白)も飲み込みます。** これがちょっとした裏技になります。
思い出してください、ソース中の改行は空白 1 つになります。長い語をソース上で複数行に折って書きたいのに、その境目に余計な空白を入れたくない――そんなとき、行末に % を置けば改行が消え、空白なしで次の行とつながります。命令を改行をまたいで書くときにも、不要な空白の混入を防げます。
これは行末コメント % ここから行末まで(と改行)が無視される / ignored to end of line
超長い%
単語 % → 「超長い単語」 % で改行を消してつなぐ / % joins the lines, no space
割引率は 100\% です。 % 文字としての % は \% と書く / a literal percent is \%注意すべきは、% 自体が特殊文字なので、**文字としてのパーセント記号を出したいときは \% と書く** ことです(\% は制御記号なので直後の空白は食べません)。特殊文字の全体像は特殊文字のページにまとめています。
複数行をまとめて無効化したいなら、行ごとに % を付ける代わりに方法が 2 つあります。verbatim パッケージ(や comment パッケージ)が提供する **comment 環境** で \begin{comment} … \end{comment} で囲む方法と、TeX の条件分岐を使った **\iffalse … \fi** で囲む方法です。後者は追加パッケージが要らず、ブロックごとごっそりコメントアウトできます。
\usepackage{verbatim} % プリアンブルで / in the preamble
\begin{comment}
このブロックは丸ごと無視される。
This whole block is ignored.
\end{comment}
\iffalse
下書きのコードもパッケージ無しで一括コメントアウト。
Draft code, commented out with no package needed.
\fi