\maketitleってなんであんな書き方をするの？ - LaTeXを解剖して調べる

$\LaTeX$で文書を作る時、`\maketitle`のくだりだけちょっと変な書き方をすると思います。例えば
```tex
...
\title{How are they implemented?}
\author{Mya-Mya}
\begin{document}
\maketitle
...
```
というように、
題名や著者の情報を入力するコマンドと表示するコマンドが別々になっています。

僕なら`\maketitle`は以下のような感じで書きたい気がします。。

```tex:1つのコマンドで題名や著者を表示できちゃう案
...
\begin{docment}
\maketitle
    {I think this is better.}
    {Mya-Mya}
...
```

```tex:そういうのを書く環境を用意する案
...
\begin{document}
\begin{title-area}
    \title{I think this is better.}
    \author{Mya-Mya}
\end{title-area}
...
```
絶対こういう書き方の方がいいよね？とは思いますがそれは置いておいて、なぜ現状のような書き方をしているのか、内部ではどのような仕組みになっているのか説明したいと思います。

## TL;DR
* `\maketitle`はドキュメントクラスが各自で実装しているものである。
* 対して、`\title`や`\author`は$\LaTeX$のネイティブ実装である。
* `\title`や`\author`コマンドでは、与えられたデータを変数に保存している。
* `\maketitle`では、それらの変数を読みだして表示している。
* `\title`や`\author`と`\maketitle`を分ける書き方は$\LaTeX$の仕様として明言されている。
 
## `\maketitle`はドキュメントクラスが各自で実装しているものである。
以下は$\texttt{article}$というドキュメントクラスを利用しているtexファイルです。こちらは何も問題がなくタイプセットを行えます。
```tex:_.tex
\documentclass{article}
\begin{document}
\title{How are they implemented?}
\author{Mya-Mya}
\maketitle
Hello World.
\end{document}
```
しかし、ドキュメントクラスを$\texttt{letter}$にしてタイプセットを行うと、動かなくなります。
```tex:_.tex
\documentclass{letter}
\begin{document}
\title{How are they implemented?}
\author{Mya-Mya}
\maketitle
Hello World.
\end{document}
```
```
latex _
```
を実行すると
```
! Undefined control sequence.
l.5 \maketitle
```
というように、`\maketitle`コマンドが無い! と怒られます。これは、`\maketitle`コマンドの定義が$\texttt{article}$にはあって、$\texttt{letter}$には無いことを示唆しています。

それでは、それぞれ実装を見ていこうと思います。ドキュメントクラスというのは、$\texttt{<ドキュメントクラス名>.cls}$というファイルに定義されています。例えば$\texttt{article}$は$\texttt{article.cls}$に、$\texttt{letter}$は$\texttt{letter.cls}$に定義されています。

これらのファイルは$\texttt{texlive}$フォルダ内のどっかに入っているのですが、探すのは大変です。そんな時に役立つのが以下のコマンドです。ファイル名を書くとその場所を教えてくれます。

まずは$\texttt{article.cls}$を探してみます。
```
kpsewhich article.cls
```
```
c:/texlive/2023/texmf-dist/tex/latex/base/article.cls
```
これを開き、`\maketitle`を定義しているくだりを検索すると・・・
```tex:article.cls
...
\if@titlepage
  \newcommand\maketitle{\begin{titlepage}%
<中略>
    {\LARGE \@title \par}%
    \vskip 3em%
...
```
ありました。我々がtexファイルで打っている`\maketitle`は、ここに繋がっているのです。この実装を見ると、なんか題名を表示しそうなコードを見ることができます。`\@title`というものです。あと、読み進めていくとそのほかに`\@author`とかも出てきます。

実は、`\@title`や`\@author`の中には我々が`\title`や`\author`で指定した文字列が(知らないうちに)格納されています。これらの変数や`\title`コマンドの定義は、クラスファイル内にはなされていませんでした。では、どこで定義されているのでしょうか。結論から言うと彼らは$\LaTeX$カーネルそのものに実装されていますが、この話は次の章で行います。

まとめると、$\texttt{article}$には`\maketitle`の実装があり、題名や著者を表示するコードが組まれていることが分かりました。

それに対し$\texttt{letter}$の実装を見ると、`\maketitle`の実装が無いことが分かります。

## `\title`や`\author`はLaTeXのネイティブ実装である
これは$\LaTeX$の公式ドキュメントを参照するとわかります。

https://www.latex-project.org/help/documentation/

https://ftp.kddilabs.jp/CTAN/macros/latex/base/source2e.pdf

このPDFです。1000ページ以上ありますが、$\LaTeX$がどう実装されているかが書かれています。よく$\TeX$と$\LaTeX$の違いが分からなくなることがありますが、$\LaTeX$は$\TeX$にこの1000ページ超分の拡張を加えたものになります。

さて、僕は変態なので、この中から`\title`や`\author`の実装に関する記述を見つけました。

p.759に書かれています。ここでは`ltsect.dtx`という$\LaTeX$カーネルの一部の実装ファイルについての解説があり、以下のように述べられています。

> このファイルは \maketitle で使われるようなもの、例えば \author などを定義しています。\maketitle 自体はそれぞれのクラスで定義されますので、$\LaTeX$カーネルのものではありません。

この一言のせいで、`\title`などと`\maketitle`が分けられているのですね。

ということで`ltsect.dtx`を探して`\title`のくだりを探してみると・・・

```tex:ltsect.dtx
...
\DeclareRobustCommand\title[1]{\gdef\@title{#1}}
...
```

あった！！！確かに`\@title`という変数に入れているのが分かります。

我々がtexファイルで打っている`\title`は、ここに繋がっているのですね！いやあ、遠かった！

## まとめ
`\maketitle`のくだりの理由は、$\LaTeX$の仕様にありました。仕様によると、`\title`や`\author`は$\LaTeX$カーネルにネイティブ実装されているものに対し、`\maketitle`は各クラスで実装されることが期待されるものとされていました。だからあのような変な書き方をしていたのですね。
またひとつ、$\LaTeX$のことがよく分かったような気がします。