Théorèmes et démonstrations (amsthm)

Les théorèmes, lemmes, définitions et preuves suivent une présentation fixe : un début en gras comme Theorem 3.1, un corps en italique, une numérotation automatique et un petit carré évidé (□) à la fin d’une preuve. Tout régler à la main serait fastidieux ; amsthm, paquet voisin de amsmath, fournit donc un moyen de *déclarer* une fois les environnements de type théorème, ainsi qu’un environnement proof dédié. Cette page couvre les déclarations avec \newtheorem, le partage de compteurs et la numérotation par section, les variantes non numérotées, le changement d’aspect avec \theoremstyle, l’environnement proof et son symbole de fin de preuve, puis l’interface de plus haut niveau thmtools.

Déclarer un environnement de théorème

Une structure de type théorème se déclare d’abord comme environnement dans le préambule, puis s’emploie dans le corps du document. On la déclare avec \newtheorem. Le premier argument est le nom de l’environnement (celui que l’on écrit dans \begin{…}), et le second est le mot imprimé en gras dans l’en-tête. Par exemple, le code suivant rend disponible un environnement theorem.

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

Une fois cela en place, chaque emploi de l’environnement theorem dans le corps reçoit automatiquement un en-tête en gras et un numéro courant, comme Theorem 1, Theorem 2 ; le texte intérieur est composé en italique dans le style par défaut. Le numéro est géré par un compteur LaTeX, donc insérer un théorème au milieu renumérote automatiquement les suivants.

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

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

Notez que \newtheorem fait aussi partie du LaTeX de base, le LaTeX2e standard. Le \newtheorem nu peut déjà créer des environnements de théorème numérotés, mais le changement de style (\theoremstyle), la forme étoilée non numérotée (\newtheorem*), l’environnement proof et le symbole de fin de preuve décrits plus bas sont des extensions disponibles seulement après chargement de amsthm. Pour écrire des mathématiques, charger amsthm avec amsmath est l’usage normal.

Contrôler la numérotation

Si théorèmes, lemmes et corollaires ont chacun leur propre compteur, les mêmes numéros se dispersent, comme « Theorem 1, Lemma 1, Theorem 2, Lemma 2… », ce qui prête à confusion. La plupart des textes mathématiques leur donnent plutôt une numérotation commune, « Theorem 1, Lemma 2, Theorem 3… ». L’argument optionnel entre crochets de \newtheorem permet de régler cela précisément. Le point essentiel est que le crochet n’a pas le même sens selon sa position.

Pour partager un compteur, donnez le nom d’un environnement existant entre crochets juste après le nouveau nom. Dans l’exemple ci-dessous, lemma utilise le même compteur que theorem ; théorèmes et lemmes prennent donc leurs numéros dans une même suite.

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

Pour au contraire recommencer le compteur à chaque chapitre ou section et préfixer le numéro de section, comme « Theorem 2.1, Theorem 2.2 », placez le crochet contenant un compteur parent, par exemple section, après le second argument. Le numéro du théorème revient alors à 1 à chaque nouvelle section et s’affiche avec le numéro de section.

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

On ne peut pas utiliser les deux crochets à la fois, mais on peut aussi subordonner un compteur à un autre environnement. Par exemple, \newtheorem{corollary}{Corollary}[theorem] fait que le numéro du corollaire se réinitialise à chaque théorème ; il reprend donc le numéro du théorème parent, comme « Corollary 3.1 », premier corollaire attaché à Theorem 3. Le tableau récapitule l’emplacement des crochets et leur effet.

DéclarationEffet
\newtheorem{theorem}{Theorem}Numéro courant indépendantNuméroté 1, 2, 3, … sur son propre compteur
\newtheorem{lemma}[theorem]{Lemma}Partage le compteur theorem en une seule suiteLemmes et théorèmes partagent une numérotation
\newtheorem{theorem}{Theorem}[section]Réinitialisé à chaque section ; affiché comme « 2.1 »Redémarre à chaque \section, préfixé par le numéro de section
\newtheorem{corollary}{Corollary}[theorem]Réinitialisé à chaque theorem ; affiché comme « 3.1 »Subordonné au compteur theorem

Sans numéro et avec un nom

Pour un environnement de type théorème que vous ne voulez pas numéroter, par exemple un « Remark » ou un « Main Theorem » unique, utilisez la forme étoilée \newtheorem* fournie par amsthm. Elle n’attribue aucun numéro et n’imprime que le mot d’en-tête. Sa syntaxe est celle de \newtheorem sans étoile, sauf qu’elle ne prend aucun argument lié aux compteurs.

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

Vous pouvez aussi attacher un nom particulier ou une attribution à un théorème donné. Quand vous ouvrez l’environnement dans le corps, passez un nom entre crochets juste après \begin{theorem} ; il s’affiche entre parenthèses après le numéro. L’exemple ci-dessous produit par exemple un en-tête du type « Theorem 1 (Pythagorean theorem) ».

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

Ce crochet est indépendant de la présence d’un numéro. Pour un environnement numéroté, on obtient « numéro + (nom) » ; pour un environnement non numéroté créé avec \newtheorem*, « mot d’en-tête + (nom) ». Dans les deux cas, le nom est ajouté entre parenthèses.

Choisir l’aspect : \theoremstyle

amsthm fournit \theoremstyle pour changer l’aspect des environnements de type théorème. Trois styles sont intégrés, avec des combinaisons différentes de polices pour l’en-tête (head) et le corps (body). Le point crucial est que \theoremstyle{…} s’applique à tous les \newtheorem déclarés après lui. On fixe donc le style *avant* les déclarations \newtheorem, en regroupant les déclarations par style. Si rien n’est indiqué, le style par défaut est plain.

  • plain : en-tête en gras, corps en italique. Pour les assertions énoncées avec emphase, comme théorèmes, lemmes, propositions et corollaires. C’est le style par défaut si rien n’est fixé.
  • definition : en-tête en gras, corps droit (romain). Pour ce qui doit se lire comme une prose ordinaire, comme définitions, exemples, problèmes et conditions.
  • remark : en-tête en italique, corps droit. Pour les apartés, remarques, notes et claims.

Le préambule suivant montre une configuration typique : il combine les trois styles tout en partageant un compteur entre theorem, lemma et corollary. Sous \theoremstyle{plain}, il déclare theorem, lemma et corollary ; sous \theoremstyle{definition}, definition et example ; sous \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}

Avec cette configuration, theorem, lemma, corollary, definition et example partagent tous une numérotation par section, par exemple « Theorem 2.1, Definition 2.2, Lemma 2.3… ». Les corps des théorèmes, lemmes et corollaires sont en italique, ceux des définitions et exemples en romain. Seul remark n’est pas numéroté, avec son en-tête « Remark » en italique. Attention à l’emplacement : si \theoremstyle est placé *après* un \newtheorem, cette déclaration n’est pas modifiée et garde le style précédent, ou plain si aucun style n’avait encore été fixé.

L’environnement proof et le symbole QED

amsthm fournit aussi un environnement proof dédié ; là encore, ce n’est pas du LaTeX de base mais une fonctionnalité de amsthm. L’environnement proof place automatiquement au début un en-tête « Proof. » en italique et à la fin un symbole de fin de preuve, par défaut un petit carré évidé (□), le symbole tombstone ou QED.

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

Le mot d’en-tête peut être changé. L’environnement proof accepte aussi un argument entre crochets pour chaque occurrence ; écrire \begin{proof}[Proof of Theorem 1] remplace donc l’en-tête par « Proof of Theorem 1. », ou par exemple par \begin{proof}[Proof of the lemma].

L’emplacement du symbole de fin de preuve demande de l’attention. amsthm essaie de placer le symbole à la fin de la dernière ligne de texte, mais si une preuve se termine par une équation hors texte ou un environnement de liste, le symbole peut tomber seul sur la ligne suivante. Pour gérer cela, placez explicitement \qedhere à l’endroit voulu. À la fin d’un affichage mathématique, par exemple, le □ se cale à droite de la ligne de l’équation.

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

Le symbole lui-même peut aussi être modifié. Redéfinissez \qedsymbol pour utiliser un carré plein (■), une chaîne de texte ou tout autre marqueur de fin ; pour le supprimer entièrement, redéfinissez-le comme vide. Placez l’une des lignes suivantes dans le préambule.

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

thmtools : une interface moderne de plus haut niveau

À mesure que les déclarations se multiplient, indiquer la numérotation par la position des crochets de \newtheorem devient difficile à lire. thmtools est une interface de plus haut niveau au-dessus de amsthm ou ntheorem, qui fournit \declaretheorem, où tout se donne sous forme d’options key=value. thmtools ne possède pas lui-même de mécanisme de numérotation ; il appelle le \newtheorem de amsthm comme moteur interne, on le charge donc avec amsthm.

Au plus simple, on ne passe que le nom de l’environnement, et l’on écrit le contrôle de numérotation sous forme de clés. La subordination à une section est numberwithin= ; les synonymes parent= et within= fonctionnent aussi. Le partage d’un compteur est sibling=, avec les synonymes numberlike= et sharecounter=. L’absence de numéro est numbered=no, le mot d’en-tête est name= avec les synonymes title= et heading=, et le style est style=. L’exemple ci-dessous écrit avec thmtools presque la même configuration que la version amsthm précédente.

latex
\usepackage{amsthm, thmtools}

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

La force de thmtools est de rendre rapides des fonctions avancées qui seraient pénibles avec amsthm seul. Un exemple majeur est la reformulation restatable. Chargez le paquet thm-restate, inclus avec thmtools, et écrivez un théorème dans un environnement restatable : son contenu est stocké comme une macro, ce qui permet de réafficher le même théorème plus tard en conservant son numéro d’origine. Le premier argument, optionnel, de restatable est un nom, le second est l’environnement de théorème à utiliser, et le troisième est le nom de la macro qui mémorise le contenu.

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*

Développer plus tard la macro enregistrée \firsteuclid compose à nouveau ce théorème avec son numéro d’origine. Le numéro reste fixé à l’occurrence initiale, tout comme les éventuels numéros d’équations affichées à l’intérieur. Avec une étoile, \firsteuclid*, on le réaffiche tout en gardant les renvois (\label/\ref) pointés vers la déclaration originale plutôt que vers la copie réaffichée. C’est utile quand on veut énoncer un résultat numéroté dans le texte principal mais placer sa preuve en annexe.

Une autre commodité est la liste des théorèmes. \listoftheorems génère automatiquement une liste, comparable à une table des matières, de théorèmes, lemmes, etc. On peut la restreindre en excluant d’abord tout avec ignoreall, puis en indiquant les environnements à inclure avec show={…}. Avec onlynamed, ou onlynamed={…}, seuls les théorèmes auxquels vous avez donné un nom, comme dans \begin{…}[name], sont listés. Si hyperref est aussi chargé, chaque entrée devient un lien cliquable vers le théorème correspondant.

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

Pour créer votre propre aspect, définissez un nouveau style avec \declaretheoremstyle de thmtools, puis appelez-le via \declaretheorem[style=…]{…}. Vous pouvez régler par clés la police de l’en-tête (headfont), celle du corps (bodyfont), les espaces avant et après (spaceabove, spacebelow), les accolades autour de la note (notebraces), l’écart après l’en-tête (postheadspace), le symbole final (qed), et davantage. Il n’est pas nécessaire d’y recourir quand amsthm suffit, mais c’est une option puissante pour des environnements de théorème élaborés.