3
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-05-13

$\LaTeX$で文書を作る時、\maketitleのくだりだけちょっと変な書き方をすると思います。例えば

...
\title{How are they implemented?}
\author{Mya-Mya}
\begin{document}
\maketitle
...

というように、
題名や著者の情報を入力するコマンドと表示するコマンドが別々になっています。

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

1つのコマンドで題名や著者を表示できちゃう案
...
\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ファイルです。こちらは何も問題がなくタイプセットを行えます。

_.tex
\documentclass{article}
\begin{document}
\title{How are they implemented?}
\author{Mya-Mya}
\maketitle
Hello World.
\end{document}

しかし、ドキュメントクラスを$\texttt{letter}$にしてタイプセットを行うと、動かなくなります。

_.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を定義しているくだりを検索すると・・・

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$の公式ドキュメントを参照するとわかります。

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

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

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

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

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

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

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

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

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

まとめ

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3