定理・証明環境(amsthm)

定理・補題・定義・証明には、本文とは違う決まった体裁があります——「定理 3.1」と太字で始まり、本文がイタリックで組まれ、通し番号が自動で振られ、証明の末尾には小さな白い四角(□)が付く、といった具合です。これを一つずつ手で整えるのは大変なので、amsmath の姉妹パッケージ **amsthm** が、定理用の環境を「宣言」しておく仕組みと、証明専用の proof 環境を用意しています。このページでは、\newtheorem による環境の宣言、番号の共有と章節への従属、番号なし、\theoremstyle による体裁の切り替え、proof 環境と証明終了記号、そして現代的な上位インターフェース thmtools までを見ていきます。

定理環境を宣言する

定理のような構造は、まずプリアンブルで 環境として宣言 し、本文ではその環境を使って書きます。宣言には \newtheorem を使います。第一引数が 環境の名前(本文で \begin{…} に書く名前)、第二引数が 出力の見出しに太字で印字される語 です。たとえば次のように書くと、theorem という環境が使えるようになります。

latex
\usepackage{amsthm}
\newtheorem{theorem}{Theorem}        % プリアンブルで宣言 / declare in the preamble

こうしておくと、本文で theorem 環境を使うたびに「Theorem 1」「Theorem 2」と太字の見出しと通し番号が自動で付き、なかに書いた文は(既定のスタイルでは)イタリックで組まれます。番号は LaTeX のカウンタで管理されるので、途中に定理を挿入しても以降の番号は自動でずれます。

latex
\begin{theorem}
  素数は無限に存在する。
\end{theorem}

\begin{theorem}
  There are infinitely many primes.
\end{theorem}

なお、\newtheorembase LaTeX(標準の LaTeX2e)にも備わっています。素の \newtheorem でも番号付きの定理環境は作れますが、後述する **スタイルの切り替え(\theoremstyle)・番号なしの星付き形(\newtheorem*)・proof 環境・証明終了記号** は、いずれも amsthm を読み込んで初めて使えるようになる拡張です。数学を書くなら amsthm(および amsmath)を読み込んでおくのが定石です。

番号の付け方を制御する

定理・補題・系などをそれぞれ別々に番号付けすると、「定理 1、補題 1、定理 2、補題 2…」のように同じ番号が散らばり、読者は迷います。多くの数学書では、これらに 共通の番号 を振って「定理 1、補題 2、定理 3…」と通します。\newtheorem省略可能な引数(角括弧) で、この振る舞いを細かく指定できます。角括弧を置く位置によって意味が変わるのが要点です。

カウンタを共有するには、環境名の 直後 に既存の環境名を角括弧で与えます。次の例では lemmatheorem と同じカウンタを使い、定理と補題が一連の番号を共有します。

latex
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}[theorem]{Lemma}   % theorem と番号を共有 / share theorem’s counter

一方、章や節ごとに番号を振り直し、「定理 2.1」「定理 2.2」のように節番号を前置するには、第二引数の 後ろ に角括弧で親カウンタ(section など)を与えます。こうすると、新しい節に入るたびに定理番号が 1 に戻り、節番号と組み合わせて表示されます。

latex
\newtheorem{theorem}{Theorem}[section]   % 節ごとにリセットし「2.1」形式 / reset per section, “2.1” style

二つの角括弧は併用できませんが、別のカウンタに従属させることもできます。たとえば \newtheorem{corollary}{Corollary}[theorem] とすると、系の番号は 定理が現れるたびにリセット され、「系 3.1(= 定理 3 に付随する最初の系)」のように親の定理番号を引き継ぎます。次の表に、角括弧の置き場所と効果を整理します。

宣言効果
\newtheorem{theorem}{Theorem}独立した通し番号を振るIts own independent running number
\newtheorem{lemma}[theorem]{Lemma}theorem とカウンタを共有(番号を通す)Shares the theorem counter
\newtheorem{theorem}{Theorem}[section]節ごとに 1 に戻し「2.1」形式で表示Resets per section; shows as “2.1”
\newtheorem{corollary}{Corollary}[theorem]theorem が出るたびリセットし「3.1」形式Resets at each theorem; “3.1”

番号なしと、名前を添える

番号を振りたくない定理様の環境(「注意」「主定理」など、一つしか現れないもの)には、amsthm が用意する **星付きの \newtheorem*** を使います。これは番号を一切付けず、見出しの語だけを印字します。星なしの \newtheorem と書式は同じで、カウンタ関連の引数を取らない点だけが違います。

latex
\newtheorem*{remark}{Remark}   % 番号なし(amsthm が必要) / unnumbered (needs amsthm)

また、個々の定理に 固有の名前や出典を添える こともできます。本文側で環境を開くとき、\begin{theorem} の直後に角括弧で名前を渡すと、見出しの番号に続けて括弧書きで表示されます。たとえば次のように書くと、出力は「Theorem 1(ピタゴラスの定理)」のような見出しになります。

latex
\begin{theorem}[Pythagorean theorem]
  直角三角形において $a^2 + b^2 = c^2$ が成り立つ。
\end{theorem}

この角括弧は 番号の有無とは独立 です。番号付きの環境なら「番号+(名前)」、\newtheorem* で作った番号なしの環境なら「見出し語+(名前)」のように、いずれの場合も名前が括弧で添えられます。

体裁を選ぶ:\theoremstyle

amsthm は、定理様環境の体裁を切り替える **\theoremstyle** を提供します。組み込みのスタイルは三つあり、見出し(ヘッド)と本文(ボディ)の書体の組み合わせが異なります。重要なのは、\theoremstyle{…} は **その後に宣言する \newtheorem すべてに適用される** という点です。したがって、\newtheorem にスタイルを指定し、スタイルごとに宣言をまとめておきます。何も指定しなければ既定は **plain** です。

  • plain: 見出しは太字、本文はイタリック**。定理・補題・命題・系など、強調して述べる主張に。何も指定しないときの既定スタイル。
  • definition: 見出しは太字、本文は立体(ローマン体)**。定義・例・問題・条件など、普通の文として読ませたいものに。
  • remark: 見出しはイタリック**、本文は立体。注意・注記・主張(claim)など、控えめに添える文に。

次のプリアンブルは、三つのスタイルを使い分けつつ、定理・補題・系で番号を共有する典型的な構成です。\theoremstyle{plain} のもとで theoremlemmacorollary を、\theoremstyle{definition} のもとで definitionexample を、\theoremstyle{remark} のもとで remark を宣言しています。

latex
\usepackage{amsmath, amsthm}

\theoremstyle{plain}              % 本文イタリック / italic body
\newtheorem{theorem}{Theorem}[section]
\newtheorem{lemma}[theorem]{Lemma}
\newtheorem{corollary}[theorem]{Corollary}

\theoremstyle{definition}        % 本文立体 / upright body
\newtheorem{definition}[theorem]{Definition}
\newtheorem{example}[theorem]{Example}

\theoremstyle{remark}            % 見出しイタリック / italic head
\newtheorem*{remark}{Remark}

この設定では、theoremlemmacorollarydefinitionexample がすべて節ごとの共通番号(「定理 2.1、定義 2.2、補題 2.3…」)を共有し、定理・補題・系の本文はイタリック、定義・例の本文は立体で組まれます。remark だけは番号なしで、見出し「Remark」がイタリックになります。スタイルを宣言する位置を間違えて \newtheorem の後ろに置くと、その宣言には反映されない(直前までのスタイル、最初なら plain のまま)点に注意してください。

proof 環境と証明終了記号

amsthm は証明専用の **proof 環境** も提供します(これも base LaTeX にはなく、amsthm の機能です)。proof 環境は、冒頭に イタリックの見出し「Proof.」 を自動で置き、末尾に 証明終了記号 ——既定では小さな 白抜きの四角(□、いわゆる墓石記号・QED 記号) ——を自動で付けます。

latex
\begin{proof}
  $\sqrt{2}$ が有理数だと仮定して矛盾を導く。……よって $\sqrt{2}$ は無理数である。
\end{proof}

見出しの語は変更できます。proof 環境にも個々のインスタンスで角括弧の引数を渡せるので、\begin{proof}[Proof of Theorem 1] と書けば「Proof of Theorem 1.」のように見出しを差し替えられます(日本語なら \begin{proof}[証明] のように)。

証明終了記号の位置には注意が要ります。amsthm は記号を本文の最後の行の 行末 に置こうとしますが、証明が 別行立ての数式やリスト環境で終わる と、記号が次の行に独りぼっちで落ちてしまうことがあります。そこで、記号を出したい場所に明示的に **\qedhere** を置きます。たとえば別行立ての数式の末尾に書けば、□ がその数式の行の右端に収まります。

latex
\begin{proof}
  両辺を整理すると、次を得る。
  \[
    a^2 + b^2 = c^2. \qedhere
  \]
\end{proof}

記号そのものも差し替えられます。\qedsymbol を再定義すれば、塗りつぶした四角(■)や文字列など、好きな終了記号に変えられます。記号を消したいときは空に再定義します。プリアンブルに次のように書きます。

latex
\renewcommand{\qedsymbol}{$\blacksquare$}   % 黒い四角に / filled square
% \renewcommand{\qedsymbol}{}              % 記号を消す / remove the symbol

thmtools:現代的な上位インターフェース

宣言が増えてくると、\newtheorem の角括弧の位置で番号付けを指定する書き方は読みにくくなります。**thmtools** は amsthm(や ntheorem)の 上に載る上位インターフェース で、すべてを キー=値 で指定できる \declaretheorem を提供します。thmtools 自身は番号付けの実体を持たず、裏側(バックエンド)として amsthm\newtheorem を呼び出すので、amsthm と併せて読み込みます。

最も簡単には、環境名だけを渡します。番号付けの制御はキーで書きます。節への従属は numberwithin=(同義の parent=within= も可)、番号の共有は sibling=(同義の numberlike=sharecounter= も可)、番号なしは numbered=no、見出し語の指定は name=(同義の title=heading=)、スタイルは style= です。次の例は、前節の amsthm 版とほぼ同じ設定を thmtools で書いたものです。

latex
\usepackage{amsthm, thmtools}

\declaretheorem[numberwithin=section]{theorem}
\declaretheorem[sibling=theorem]{lemma}
\declaretheorem[style=definition, sibling=theorem]{definition}
\declaretheorem[numbered=no, name=Remark]{remark}

thmtools の強みは、amsthm 単体では面倒な高度な機能を手早く使える点にあります。代表的なのが 再掲(restatable) です。thm-restate パッケージ(thmtools に同梱)を読み込み、restatable 環境で定理を書くと、その内容が マクロとして保存 され、後の章で同じ定理を 同じ番号のまま再掲 できます。restatable の第一引数(省略可)は名前、第二引数は使う定理環境、第三引数は 内容を覚えておくマクロ名 です。

latex
\usepackage{amsthm, thmtools, thm-restate}
\declaretheorem{theorem}

% 本編:内容を \firsteuclid に保存 / store the content in \firsteuclid
\begin{restatable}[Euclid]{theorem}{firsteuclid}
  \label{thm:euclid}
  There are infinitely many primes.
\end{restatable}

% 付録などで同じ定理・同じ番号を再掲 / restate later with the same number
\firsteuclid*

保存したマクロ \firsteuclid を後の場所で展開すると、その定理が 元の番号のまま もう一度組まれます(番号は本編側に固定され、別行立ての数式番号なども元のものが使われます)。\firsteuclid* のように星を付けると、相互参照(\label\ref)の行き先を 再掲側ではなく元の宣言側 に向けたまま再掲できます。証明は付録に置きたいが主張は本編で番号付きで述べたい、というときに便利です。

もう一つの便利機能が 定理一覧(list of theorems) です。\listoftheorems と書くと、目次のように定理・補題などの一覧が自動生成されます。ignoreall で一旦すべて除外し、show={…} で出したい環境名だけを挙げて絞り込めます。onlynamed(あるいは onlynamed={…})を使うと、\begin{…}[名前] のように 名前を付けた定理だけ を一覧に載せられます。

latex
\listoftheorems                                  % すべて / everything
\listoftheorems[ignoreall, show={theorem, lemma}]   % theorem と lemma だけ / only these

体裁を自作したいときは、thmtools\declaretheoremstyle で新しいスタイルを定義し、\declaretheorem[style=…]{…} から呼び出せます。見出しの書体(headfont)、本文の書体(bodyfont)、前後の空き(spaceabovespacebelow)、見出しの括弧(notebraces)、見出しと本文の間隔(postheadspace)、終了記号(qed)などをキーで細かく指定できます。amsthm の基本で足りる場合は無理に使う必要はありませんが、込み入った定理環境を整えるなら強力な選択肢です。