$\LaTeX$で文書を作る時、\maketitle
のくだりだけちょっと変な書き方をすると思います。例えば
...
\title{How are they implemented?}
\author{Mya-Mya}
\begin{document}
\maketitle
...
というように、
題名や著者の情報を入力するコマンドと表示するコマンドが別々になっています。
僕なら\maketitle
は以下のような感じで書きたい気がします。。
...
\begin{docment}
\maketitle
{I think this is better.}
{Mya-Mya}
...
...
\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ファイルです。こちらは何も問題がなくタイプセットを行えます。
\documentclass{article}
\begin{document}
\title{How are they implemented?}
\author{Mya-Mya}
\maketitle
Hello World.
\end{document}
しかし、ドキュメントクラスを$\texttt{letter}$にしてタイプセットを行うと、動かなくなります。
\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
を定義しているくだりを検索すると・・・
...
\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$の公式ドキュメントを参照するとわかります。
このPDFです。1000ページ以上ありますが、$\LaTeX$がどう実装されているかが書かれています。よく$\TeX$と$\LaTeX$の違いが分からなくなることがありますが、$\LaTeX$は$\TeX$にこの1000ページ超分の拡張を加えたものになります。
さて、僕は変態なので、この中から\title
や\author
の実装に関する記述を見つけました。
p.759に書かれています。ここではltsect.dtx
という$\LaTeX$カーネルの一部の実装ファイルについての解説があり、以下のように述べられています。
このファイルは \maketitle で使われるようなもの、例えば \author などを定義しています。\maketitle 自体はそれぞれのクラスで定義されますので、$\LaTeX$カーネルのものではありません。
この一言のせいで、\title
などと\maketitle
が分けられているのですね。
ということでltsect.dtx
を探して\title
のくだりを探してみると・・・
...
\DeclareRobustCommand\title[1]{\gdef\@title{#1}}
...
あった!!!確かに\@title
という変数に入れているのが分かります。
我々がtexファイルで打っている\title
は、ここに繋がっているのですね!いやあ、遠かった!
まとめ
\maketitle
のくだりの理由は、$\LaTeX$の仕様にありました。仕様によると、\title
や\author
は$\LaTeX$カーネルにネイティブ実装されているものに対し、\maketitle
は各クラスで実装されることが期待されるものとされていました。だからあのような変な書き方をしていたのですね。
またひとつ、$\LaTeX$のことがよく分かったような気がします。