Teoremas y demostraciones (amsthm)

Los teoremas, lemas, definiciones y demostraciones tienen un aspecto fijo: un encabezado en negrita como Theorem 3.1, cuerpo en cursiva, numeración automática y un pequeño cuadrado hueco (□) al final de la demostración. Ajustar todo eso a mano es tedioso, así que amsthm, paquete hermano de amsmath, ofrece una forma de *declarar* una vez los entornos tipo teorema, además de un entorno proof dedicado. Esta página cubre la declaración de entornos con \newtheorem, el uso compartido de contadores y la numeración dentro de una sección, variantes sin número, el cambio de aspecto con \theoremstyle, el entorno proof y su símbolo final, y la interfaz moderna de mayor nivel thmtools.

Declarar un entorno de teorema

Una estructura tipo teorema se declara primero como entorno en el preámbulo y luego se usa en el cuerpo. Se declara con \newtheorem. El primer argumento es el nombre del entorno (lo que escribes en \begin{…}) y el segundo es la palabra que se imprime en negrita en el encabezado. Por ejemplo, lo siguiente crea un entorno theorem.

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

Con eso, cada uso del entorno theorem en el cuerpo obtiene automáticamente un encabezado en negrita y un número corrido, como Theorem 1, Theorem 2; el texto interior se compone en cursiva con el estilo predeterminado. El número lo gestiona un contador de LaTeX, de modo que insertar un teorema en medio renumera automáticamente los posteriores.

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

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

Ten en cuenta que \newtheorem también forma parte de LaTeX base, el LaTeX2e estándar. El \newtheorem simple puede crear entornos de teorema numerados por sí solo, pero el cambio de estilo (\theoremstyle), la forma estrellada sin número (\newtheorem*), el entorno proof y el símbolo de fin de demostración descritos más abajo son extensiones disponibles solo al cargar amsthm. Para escritura matemática, lo normal es cargar amsthm junto con amsmath.

Controlar la numeración

Si numeras teoremas, lemas y corolarios cada uno con su propio contador, aparecen números repetidos, como “Theorem 1, Lemma 1, Theorem 2, Lemma 2…”, lo que confunde. La mayoría de los textos matemáticos les da una numeración compartida, “Theorem 1, Lemma 2, Theorem 3…”. El argumento opcional entre corchetes de \newtheorem permite controlarlo con precisión. La clave es que el corchete significa cosas distintas según dónde se coloque.

Para compartir un contador, da el nombre de un entorno existente entre corchetes justo después del nuevo nombre. En el ejemplo, lemma usa el mismo contador que theorem, de modo que teoremas y lemas toman números de una única secuencia.

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

Para reiniciar la cuenta en cada capítulo o sección y anteponer el número de sección, obteniendo “Theorem 2.1, Theorem 2.2”, coloca el corchete con un contador padre, como section, después del segundo argumento. Entonces el número del teorema vuelve a 1 en cada nueva sección y se muestra combinado con el número de sección.

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

No puedes usar los dos corchetes a la vez, pero también puedes subordinar un contador a otro entorno. Por ejemplo, \newtheorem{corollary}{Corollary}[theorem] hace que el número del corolario se reinicie cada vez que aparece un teorema, por lo que hereda el número del teorema padre, como “Corollary 3.1”, el primer corolario asociado a Theorem 3. La tabla resume dónde va el corchete y qué hace.

DeclaraciónEfecto
\newtheorem{theorem}{Theorem}Número corrido independienteNumerado 1, 2, 3, … en su propio contador
\newtheorem{lemma}[theorem]{Lemma}Comparte el contador theorem en una sola secuenciaLemas y teoremas comparten una secuencia de números
\newtheorem{theorem}{Theorem}[section]Se reinicia en cada sección; se muestra como “2.1”Vuelve a empezar en cada \section, con prefijo del número de sección
\newtheorem{corollary}{Corollary}[theorem]Se reinicia en cada theorem; se muestra como “3.1”Subordinado al contador theorem

Sin número y con nombre

Para un entorno tipo teorema que no quieres numerar, algo que aparece una sola vez como “Remark” o “Main Theorem”, usa la forma estrellada \newtheorem* que proporciona amsthm. No asigna ningún número y solo imprime la palabra del encabezado. Su sintaxis coincide con la de \newtheorem sin estrella, salvo que no acepta argumentos relacionados con contadores.

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

También puedes adjuntar un nombre específico o una atribución a un teorema concreto. Al abrir el entorno en el cuerpo, pasa un nombre entre corchetes justo después de \begin{theorem} y aparecerá entre paréntesis tras el número. Por ejemplo, el siguiente código produce un encabezado como “Theorem 1 (Pythagorean theorem)”.

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

Este corchete es independiente de si el entorno está numerado. En un entorno numerado obtienes “número + (nombre)”; en uno sin número creado con \newtheorem*, “palabra de encabezado + (nombre)”. En ambos casos el nombre se añade entre paréntesis.

Elegir el aspecto: \theoremstyle

amsthm proporciona \theoremstyle para cambiar el aspecto de los entornos tipo teorema. Hay tres estilos integrados, que difieren en la combinación de fuentes para el encabezado (head) y el cuerpo (body). El punto crucial es que \theoremstyle{…} se aplica a todos los \newtheorem declarados después. Por eso se fija el estilo *antes* de las declaraciones \newtheorem, agrupándolas por estilo. Si no indicas nada, el valor predeterminado es plain.

  • plain: encabezado en negrita, cuerpo en cursiva. Para afirmaciones formuladas con énfasis: teoremas, lemas, proposiciones, corolarios. Es el estilo predeterminado si no se fija nada.
  • definition: encabezado en negrita, cuerpo vertical (romano). Para cosas que deben leerse como prosa normal: definiciones, ejemplos, problemas, condiciones.
  • remark: encabezado en cursiva, cuerpo vertical. Para apartes: observaciones, notas, claims.

El siguiente preámbulo es una configuración típica: mezcla los tres estilos mientras comparte un contador entre theorem, lemma y corollary. Bajo \theoremstyle{plain} declara theorem, lemma y corollary; bajo \theoremstyle{definition}, definition y example; y bajo \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}

Con esta configuración, theorem, lemma, corollary, definition y example comparten una numeración por sección, como “Theorem 2.1, Definition 2.2, Lemma 2.3…”. Los cuerpos de teoremas, lemas y corolarios van en cursiva, mientras que los de definiciones y ejemplos van en vertical. Solo remark no está numerado, con el encabezado “Remark” en cursiva. Cuida la posición: si pones \theoremstyle *después* de un \newtheorem, esa declaración no cambia y conserva el estilo anterior, o plain si no se había fijado ninguno.

El entorno proof y el símbolo QED

amsthm también proporciona un entorno proof dedicado; de nuevo, no forma parte de LaTeX base, sino de amsthm. El entorno proof coloca automáticamente al inicio un encabezado “Proof.” en cursiva y al final un símbolo de fin de demostración, por defecto un pequeño cuadrado hueco (□), el símbolo tombstone o QED.

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

La palabra del encabezado se puede cambiar. El entorno proof también acepta un argumento entre corchetes en cada instancia, así que \begin{proof}[Proof of Theorem 1] sustituye el encabezado por “Proof of Theorem 1.”, o por ejemplo \begin{proof}[Proof of the lemma].

La colocación del símbolo de fin de demostración requiere cuidado. amsthm intenta poner el símbolo al final de la última línea de texto, pero cuando una demostración termina con una ecuación en display o un entorno de lista, el símbolo puede caer solo en una línea aparte. Para resolverlo, pon \qedhere explícitamente donde quieras el símbolo. Al final de un display, por ejemplo, coloca el □ a la derecha de la línea de esa ecuación.

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

El símbolo en sí también puede cambiarse. Redefine \qedsymbol para usar un cuadrado relleno (■), una cadena de texto o cualquier marca final; para eliminarlo por completo, redefínelo como vacío. Pon una de estas líneas en el preámbulo.

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

thmtools: una interfaz moderna de mayor nivel

A medida que se multiplican las declaraciones, especificar la numeración mediante la posición de los corchetes de \newtheorem se vuelve difícil de leer. thmtools es una interfaz de mayor nivel sobre amsthm o ntheorem que ofrece \declaretheorem, donde todo se da como opciones key=value. thmtools no contiene su propia maquinaria de numeración; llama al \newtheorem de amsthm como backend, así que se carga junto con amsthm.

En lo más simple, pasas solo el nombre del entorno y escribes el control de numeración como claves. La subordinación a una sección es numberwithin=; también sirven los sinónimos parent= y within=. Compartir un contador es sibling=, con sinónimos numberlike= y sharecounter=. Sin número es numbered=no; la palabra del encabezado es name=, con sinónimos title= y heading=; y el estilo es style=. El ejemplo siguiente escribe con thmtools casi la misma configuración que la versión con amsthm anterior.

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 fuerza de thmtools es que permite usar rápidamente funciones avanzadas que son incómodas con amsthm solo. Un ejemplo principal es replantear con restatable. Carga el paquete thm-restate, incluido con thmtools, y escribe un teorema en un entorno restatable: su contenido se almacena como una macro, de modo que puedes volver a mostrar el mismo teorema más adelante conservando su número original. El primer argumento, opcional, de restatable es un nombre; el segundo, el entorno de teorema que se usará; y el tercero, el nombre de la macro que recuerda el contenido.

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*

Al expandir más adelante la macro guardada \firsteuclid, ese teorema se compone de nuevo con su número original. El número queda fijado a la aparición original, igual que los números de ecuaciones en display dentro de él. Al añadir una estrella, \firsteuclid*, se replantea manteniendo las referencias cruzadas (\label/\ref) apuntando a la declaración original y no a la copia repetida. Es útil cuando quieres enunciar un resultado numerado en el texto principal pero poner su demostración en un apéndice.

Otra comodidad es una lista de teoremas. Al escribir \listoftheorems, se genera automáticamente una lista tipo índice de teoremas, lemas y similares. Puedes acotarla excluyendo primero todo con ignoreall y luego nombrando los entornos que quieres incluir con show={…}. Con onlynamed, o onlynamed={…}, se listan solo los teoremas a los que diste nombre, como en \begin{…}[name]. Si también está cargado hyperref, cada entrada de la lista se convierte en un enlace clicable al teorema correspondiente.

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

Para crear tu propio aspecto, define un estilo nuevo con \declaretheoremstyle de thmtools e invócalo mediante \declaretheorem[style=…]{…}. Puedes fijar por claves la fuente del encabezado (headfont), la del cuerpo (bodyfont), el espacio antes y después (spaceabove, spacebelow), las llaves alrededor de la nota (notebraces), el hueco tras el encabezado (postheadspace), el símbolo final (qed) y más. No hace falta usarlo cuando amsthm simple basta, pero es una opción potente para configuraciones de teoremas elaboradas.