知ってて得しない！ LaTeX のトリビア 7 選

>   これは「[TeX/LaTeX Advent Caleandar 2013](http://www.adventar.org/calendars/187)」の 12 日目の記事です。
>   （11 日目は [long_long_float さん](http://public-object-express.blogspot.jp/2013/12/rubytex.html) です。）
>   （13 日目は [p_typo さん](http://typesetting.tumblr.com/post/69792955035/1pt) です。）

LaTeX に関する、知っていてもまるで役に立たないムダ知識を一挙紹介。

### その①: 1文字の命令

LaTeX の命令のほとんどは「`\` の後に幾つかの文字を連ねたもの」（これを control sequence （訳語は「コントロールシーケンス」「制御綴」など）と呼ぶ）で表されます。ところが、例外的に、「一文字からなる命令」（`\` もなくて本当に一文字）が LaTeX には全部で 6 つあります。何でしょう？

多分、`~` （非分割の欧文空白）はすぐに思いついたと思います。でも他に一文字の命令なんてあったかな……？

正解は次の 6 つ。

```
# $ & ^ _ ~ 
```

ちなみに、LaTeX における特殊文字にはこれらの他に「`% \ { }`」がありますが、これらは「命令」ではないようです。なぜかって？ Lamport さんがそう決めたんだから仕方がないでしょう！ （個人的には `#` を命令扱いするのに違和感がある。）

### その②: 環境の名前に使える文字

さっき出てきた「一文字命令」を除けば、LaTeX の命令は control sequence で表されます。これは 2 種類のパターンがあって、`\` の後に 1 文字以上の英字を続けたもの（`\hspace` など、これを control word と呼ぶ）と、`\` の後に 1 文字（だけ）の非英字（数字や記号）を続けたもの（`\!` など、これを control symbol と呼ぶ）がある、……ということは皆さんご存じだと思います。

では、環境の名前（`quote` や `tabular*` など）として使用可能な文字列はどんなものでしょうか？

答えは次の通り。

> **英字、数字、`*` の何れかの文字からなる**文字列で `end` から始まらないもの

（`end` 云々のところが奇異ですが、これは LaTeX の環境の実装方法に原因があって、命令の名前についても `\end` から始まるものは禁止されています。ここで強調したいのは前の部分の規定です。）

実際には、`\newenvironment{<(foo)>?!}{foo}{bar}` みたいな定義をしても通ってしまうのですが……。

### その③: \\index の引数に使える文字

LaTeX で索引を作成する時に使う `\index` 命令ですが、次に示す例から分かるように、この命令の引数には `%` 等の「LaTeX の特殊文字」を含めることができます。

```
特に重要なのが「90\% Line\index{90% Line@90\% Line}」の項目で、……
```

（この例で `@` の前の文字列は「`90% Line`」でなければならず、これを「`90\% Line`」とすると索引での出現位置が不正になってしまいます。）

つまり、この命令の引数では、`%` の特殊扱いが解除されているわけで、この扱いは `\verb` 命令と似ています。ところで、`\verb` 命令には、「他の命令の引数では使用禁止」という有名な制約がありました。

```
ここで、\fbox{\verb|%1|}はバッチに渡された…… % ダメ
```

同じような状況を試してみると、`\index` 命令も失敗します。（エラー行表示を見ると分かるように、`%` 以降がコメント扱いされて消えています。）

```
\fbox{90\% Line\index{90% Line@90\% Line}}% ダメ
ほげほげほげ
```

従って、LaTeX の仕様では、`\index` を他の命令の引数で使うことは禁止されています。気を付けましょう……。

……と自分は長らく思っていたのですが、実際は違うようです。

>   `\index` 命令を他の命令の引数に含めることは **可能であるが**、その場合は、`\index` の引数は **「直接入力で出力できる文字」のみから成る必要がある**。

これが正解のようです。まあ、実装上そうなることは解るんだけど、こんなややこしい規定がそのまま仕様になっているのは結構意外。

そういうわけで、次のようなユーザ命令定義は仕様上正当で、また正常に動作します。

```latex
% \Indexed{文字列} : 文字列を出力し, かつ索引に載せる.
% ※文字列は非特殊な文字のみを含められる.
\newcommand*\Indexed[1]{%
  #1\index{#1}%
}
```

まあ、多くの人にとって予想通りの動作なので、敢えて知る必要はないかも知れません。

### その④ figure, table 環境の配置オプションの既定値

`figure` および `table` 環境は、その引数（`h`/`t`/`b`/`p` の文字を並べる）で図や表の配置を許可する箇所を指定します。

```latex
\begin{figure}[htbp]
```

ところで、この位置指定の引数は `[ ]` に囲まれているのでオプション引数のはずです。つまり、次のように省略した書き方ができるはずです。この場合の動作はどうなるでしょう？

```latex
\begin{figure}
  \centering 何か
  \caption{アレ}
\end{figure}
```

正解は **[tbp] と指定したのと等価** になります（標準の文書クラスの場合）。多分これは多くの人の予想と食い違うと思います。なので、こんな規則を覚える必要はなくて、 **位置指定は常に明示しましょう**。

#### 蛇足事項

ところで、この位置指定で、`[h]` は「必ずその場に出力する」、 **ではありません**。今出くわした `figure` が「図3」であり、かつまだ「図2」を出力していないとすると、LaTeX の規則では、例え `[h]` の指定であっても（さらに `[!h]` の指定でも）その場に出力することは **絶対にありません**。そうしてしまうと図の順番が不正になってしまうからです。現在の LaTeX の仕様では「`p` は常に許可される」ことになっていて、今のような状況では別ページに移動することになります。（大昔の LaTeX ではここで述べたような状況ではエラーを吐いていたらしい。）

ちなみに、float パッケージを読み込んで位置指定を `[H]` にすると、今度は「必ずその場に出力する」ことができます。しかしその代わりに、本当に浮動する `figure` と混在させると場合によっては **図の順番が不正になってしまいます**。ご注意ください。

### その⑤: 3つのモード

TeX を（LaTeX じゃなくて）学習している人であれば、TeX の「6 つのモード」はご存じだと思います。

 *  水平モード（horizontal mode）
 *  限定水平モード（restricted horizontal mode）
 *  垂直モード（vertical mode）
 *  内部垂直モード（internal vertical mode）
 *  数式モード（math mode）
 *  別行立て数式モード（display math mode）

（残念ながら？）ここでの主題はこれの解説ではありません。これは TeX な話なので「マッチョ TeX プログラマ」にとっては不可欠ですが、普通の LaTeX ユーザは知らなくてもよいものです。

ところで、LaTeX にも「モード」という概念があり、全部で 3 つのモードがあります。これは「LaTeX を知ってる」人であれば当然知ってますよね？

 *  LR モード（LR mode; left-to-right mode の略）
 *  段落モード（paragraph mode）
 *  数式モード（math mode）

……えっ知らない……？ そうなんですよね。この用語は LaTeX ユーザに全く普及していません。だから、この用語を使って説明している参考書もなくて、だからますます目に触れる機会がない、という状態です。というわけで、覚えても何の得にもなりません、以上！

#### それでも解説しておく

数式モードは要するに数式（`$...$`、`\[...\]`、`equation` 環境など）を組んでいる時のモードです。残りの 2 つは非数式のモードで、このうち LR モードは、例えば `\mbox` の中などで、入力のテキストが途中で改行されずに常に左から右に組まれていく状態を表します。ちなみに、`\mbox`（や `\makebox`）で生成されるボックスは「LR ボックス」と呼ばれ、「`\mbox` 命令の環境版」の名前の `lrbox` はここからきています。（なお、オリジナルの (La)TeX は left-to-right（LTR）の書字方向しかサポートしていないので、この「LR（left-to-right）」というのは書字方向の区別を表したものではありません。）最後に、「段落モード」は、入力されたテキストが（自動的に）行分割されて段落として出力される状態で、LaTeX は初期状態では段落モードになっています。

最初に示した TeX のモードとの対応を示すと以下のようになります。

 *  LR モード 　⇔　 限定水平モード
 *  段落モード 　⇔　 水平モード／垂直モード／内部垂直モード
 *  数式モード 　⇔　 数式モード／別行立て数式モード

### その⑥: LaTeX を終わらせる方法

LaTeX 文書のコンパイルでエラーが発生すると、通常は `! ` で始まるメッセージとともに `? ` のプロンプトが出ます。この時点で LaTeX の実行を中断させたい場合は `x` を入力すればよいのでした。

ところが、エラーの内容によっては、単に

```
* 
```

というプロンプトが出て止まってしまうことがあります。`\end{document}` を忘れた（または書き誤った）という場合が典型的ですが他の可能性もあります。こういう場合に、ここで実行を中断させるにはどうすればいいでしょうか？ LaTeX に慣れている人の間では次のようなバッドノウハウがよく行われているようです。

>   `\aaa` とかの未定義な制御綴を命令を入力してわざとエラーを起こす。すると今度は `? ` のプロンプトが出るので `x` で終了。

ところが、実はこの状況でコンパイルを中断するための「正しい方法」が存在します。

```latex
\stop
```

これが LaTeX の実行を強制終了させるための、LaTeX 標準の命令なのです。（デバッグなどの目的で文書中で用いることも可能。）

ただし、「`* `」が出た原因によっては、`\stop` を実行しても終了しないケースもあります。こういう時はどうすればいいかというと、`\aaa` とかの未定義な……って結局意味ないじゃん！

---

以上、LaTeX のトリビアでした。お楽しみいただけたでしょうか……、え？ 「7 選」なのにまだ 6 つしかない？

失礼しました。

残る 1 個は……コレです！

### その⑦:  LaTeX の X の発音は「クス」でもよい

（参考： [What is the correct pronunciation of TeX and LaTeX?](http://tex.stackexchange.com/questions/17502/what-is-the-correct-pronunciation-of-tex-and-latex) ）
それでは。