完全攻略！ LaTeX 命令の“引数の規則”

>   これは「[TeX ＆ LaTeX Advent Caleandar 2015](http://www.adventar.org/calendars/929)」の1日目の記事です。
>   （2日目は [ワトソン](http://0-chromosome.hatenablog.jp/entry/2015/12/02/000000) さん です。）


LaTeX の命令の中には、**引数**(argument)を取るものがあります。例えば、

```latex
\textbf{Hello!}
```

では、`Hello!` が `\textbf` 命令の引数となっています。この記事では**「LaTeX の命令における引数の読取の規則」**、すなわち、「命令の後に書いたテキストのうちどの部分が引数と読み取られるか」について説明します。

先の例のような単純な場合は「引数の規則」は非常に直感的です。このため、LaTeX の参考書でも「引数の規則」についての説明が不十分なことがよくあります。しかし、規則が直感に反することもあり、これが非常に解りにくいエラーの原因となることもあります。「引数の規則」は LaTeX を使うにあたってぜひとも習熟しておくべき“キホン”だと、私は考えています。

## 普通の引数

通常、LaTeXでは引数を `{ }` で囲って記します。

```lates
\section{完全攻略！ tcolorboxパッケージ}
```

この場合、命令 `\section` の引数は `完全攻略！ tcolorboxパッケージ` となります。`{ }` 自体は引数に含まれないことに注意してください。

ただし、引数のテキストの中に別の `{ }` を含めることもできます。

```latex
\section{{\TeX}は\textcolor{red}{アレ\UTF{2603}}}
```

つまり、普通の（必須の）引数の読取の規則は次の通りです。

  * `{` の次の文字から始めて、その `{` に“対応する”`}` の直前の文字までを引数とする。

### 括弧の省略

引数のテキストが「（非特殊な）文字1つ」または「命令1つ」である場合は括弧 `{ }` は省略できます[^1]。

[^1]: 実際にはLaTeXの特殊文字の一部（`$ & ^ _ ~`）についても、それだけが引数になる場合は括弧の省略ができますが、さすがにそれは行わない方がいいでしょう。

```latex
\'{a}e\`{\ae}a
↑↓この2つは等価
\'ae\`\ae a
```

LaTeXではあまり括弧を省略すべきでないという考えもありますが、特にアクセント用の命令については、（可能ならば）括弧を省略したほうが元の単語を認識しやすいと、私は考えています。

```latex
Mea n\=avis volit\=ans anguill\={\i}s pl\=ena est.
```

![ex01.png](https://qiita-image-store.s3.amazonaws.com/0/14550/50b93245-062d-ee14-cd89-d596e31662af.png)

```latex
(\hat\xi + \tilde\xi)^\xi
= \sum_{\xi'=0}^\xi \binom\xi{\xi'}
  \hat\xi^{\xi'}\tilde\xi^{\xi-\xi'}
```

![ex02.png](https://qiita-image-store.s3.amazonaws.com/0/14550/ba25ef82-409d-8687-592a-c913c6ff7d5b.png)

## オプション引数

LaTeXでは省略可能な引数（オプション引数）は通常は `[ ]` で囲って記します。

```latex
% 0pt や r がオプション引数
\makebox[0pt][r]{NEW!}
```

ここで注意すべきことは、普通の（必須の）引数の `{ }` とは異なり、オプション引数の `[ ]` は**自動的には入れ子にならない**ということです。つまり、`[` で始めた引数の記述は、たとえ途中に `[` があっても、最初に `]` があった時点で終わります。

```latex
\twocolumn[\includegraphics[scale=0.5]{image.png}]
```

上の例の場合、`\twocolumn` のオプション引数は `\includegraphics[scale=0.5]{image.png}` ではなくて `\includegraphics[scle=0.5` となってしまいます。（その結果 `\includegraphics` が正常に実行できずエラーが発生します。）

オプション引数として `]` を含むテキストを指定したい場合は、引数のテキスト全体を `{ }` で囲む必要があります。つまり `[{...}]` という形にします。

```latex
\twocolumn[{\includegraphics[scale=0.5]{image.png}}]
```

この場合の引数の内容は外側の `{ }` の付いていない `\include...{image.png}` です。

改めて説明すると、オプション引数の読取の規則は以下のようになります。

  * `[` の次の文字から始めて、最初の「`{ }` に囲われていない `]`」の直前の文字までを引数とする。
  * ただしその結果の引数全体が単一の `{ }` で囲われた形である場合は `{ }` を外したものを引数とする。

この入れ子の括弧の規則は結構ややこしいので、必須引数の場合と比較して表にまとめておきます。

| 命令             | 引数の内容 |
|:-----------------|:----------|
| `\cmdA{ab}`      | `ab`      |
| `\cmdA{{ab}}`    | `{ab}`    |
| `\cmdA{{a}{b}}`  | `{a}{b}`  |
| `\cmdB[ab]`      | `ab`      |
| `\cmdB[[ab]]`    | `[ab`     |
| `\cmdB[{[ab]}]`  | `[ab]`    |
| `\cmdB[{ab}]`    | `ab`      |
| `\cmdB[{a}{b}]`  | `{a}{b}`  |
| `\cmdB[{{ab}}]`  | `{ab}`    |

## 変な括弧の引数

今まで見てきたように、必須引数は `{ }`、オプション引数は `[ ]` を使うのが原則ですが、命令によっては、`( )` や `< >` などの「変な括弧」が引数指定に使われる場合があります[^2]。

  * `\put(40,30){\circle*{4}}` （←picture系命令の座標）
  * `\only<2->{\alert{アレ}}` （←Beamerのスライド指定子）

このような「変な括弧」の引数の読取の規則は、基本的にはオプション引数の `[ ]` と同じで単に括弧が変わっただけです。すなわち `< >` の場合だと以下のようになります。

  * `<` の次の文字から始めて、最初の「`{ }` に囲われていない `>`」の直前の文字までを引数とする。
  * ただしその結果の引数全体が単一の `{ }` で囲われた形である場合は `{ }` を外したものを引数とする。

まあ実際には「変な括弧」を入れ子にする必要がある場合はほとんどないでしょう。

[^2]: 「変な括弧」の引数は必須の場合もオプションの場合もあります。

## 注意事項

### 引数の中の空白は無視されない

引数の括弧の中に（字句解析で有効な）空白文字[^3]が含まれる場合、それはそのまま引数の一部となります。

[^3]: 「字句解析で有効」で**ない**空白文字とは、行頭・行末にある、`\TeX` のような英字の命令の直後にある、他の空白の直後にある、などの理由で無視される空白文字のことです。段落内に「字句解析で有効」な空白が現れた場合、通常は欧文空白に相当する水平空きが出力されます。

```latex
% \underline の引数は "␣brown␣fox␣"
The quick \underline{ brown fox } jumps.
```

![ex03.png](https://qiita-image-store.s3.amazonaws.com/0/14550/3fa183f7-7f14-a149-42a8-cc6aa861c89f.png)

特に気を付けるべきなのは、次の例のように括弧を別行に書いた場合です。LaTeXの字句解析上はこれは先に示した例と全く同等と扱われるため、やはり引数は `␣brown␣fox␣` となってしまいます。

```latex
The quick
  \underline{
    brown fox
  }
jumps.
```

引数の両端の空白が不要であるなら、改行を `%` で無力化する必要があります。

```latex
The quick
  \underline{%
    brown fox%
  }
jumps.
```

### 引数の前の空白は無視される

これに対して、“引数の前”にある（字句解析で有効な）空白文字は無視されます。例えば次の例を考えてみましょう。

```latex
\hspace*␣{42mm}
```

`\hspace*` の引数を読むために `*` の次の文字を見ますが、そこには空白文字 `␣` があります[^4]。その場合、それを飛ばして次の文字を見るのです。次は `{` なので、`{ }` で囲まれた引数があると判断されて `42mm` が引数となります。

[^4]: `\hspace` のような英字の命令の直後にある空白文字は「字句解析で無視」されますが、`\hspace*` は字句解析上はあくまで `\hspace` の後に `*` を続けたものなので、その並びの直後の空白文字は「字句解析で有効」となります。

今と同様に次のソースの `␣` で示した空白文字も、引数を読み取る際には飛ばされます。（命令の直後の空白は字句解析で既に無視されています。）

```latex
\fcolorbox {red}␣{yellow}␣{注意}
\makebox [6zw]␣[s]␣{ヌバーン}
\qbezier (0,0)␣(40,0)␣(60,60)
```

### その他諸々

  * `\{` は命令の1つであり `{` とは全く別のものです。従って、これまでの説明で「`{` がナントカ」という場合、`\{` は全く無関係です。その他の括弧も同じです。
  * 必須引数、オプション引数、「変な括弧」の引数の何れにおいても、引数のテキストは必ず `{ }` に関して均衡なものになります。

## まとめ

オプション引数の規則はチョットだけ**アレ**です。気をつけましょう！