Ayuda para explicar la sintaxis de este comando

Sep 10 2020

Quiero definir un entorno de teorema donde pueda emitir la numeración manualmente en lugar de seguir algún contador interno. Mirando a mi alrededor encontré esta respuesta. Allí proponen el siguiente código como solución:

\newtheorem{innercustomthm}{Theorem}
\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

El código funciona como quiero, sin embargo, estaba tratando de entender todo en el código, en caso de que quiera modificarlo un poco (y también para aprender lo que estoy poniendo en mi documento) y estoy un poco atascado.

En primer lugar, \ newenvironment tiene la siguiente estructura:

\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}

Entiendo que el tercer argumento se deja vacío; ningún problema con eso. Luego viene el comando \ renew, que tiene la estructura:

\renewcommand{<cmd>}[<n-args>][<default>]{<text>}

Aquí tengo problemas para seguir lo que está pasando, ya que no se utilizan aparatos ortopédicos; Pensé que tal vez el comando te permite omitirlos, pero no encontré ninguna información sobre esto. Y después de eso se vuelve aún más confuso, ya que los comandos \ theinnercustomthm, \ innercustomthm y \ endinnercustomthm aparecen hechos a medida para esta solución en particular, y no entiendo cómo funcionan.

Una cosa que noté, por ejemplo, es que cambiar el nombre del entorno (digamos mytheo en lugar de customthm) descompone el código.

Si alguien puede explicarme lo que está pasando o señalarme algún manual o página web donde pueda entender lo que está pasando, lo agradecería profundamente.

Respuestas

1 egreg Sep 10 2020 at 15:27

Lo primero a tener en cuenta es que

\newtheorem{innercustomthm}{Theorem}

internamente hace algo similar a

\newenvironment{innercustomthm}[1][]{<begin>}{<end>}

donde los códigos <begin>y <end>no son de interés aquí. Tenga en cuenta que el entorno busca un argumento opcional (una nota de teorema o atribución). También configura un contador con el mismo nombre que el entorno.

El nombre elegido es largo y poco atractivo a propósito: es muy poco probable que ese nombre entre en conflicto con entornos existentes o imaginarios.

Para la aplicación que tenemos en mente, realmente no necesitamos el contador, sino el hecho de que cualquier llamada de innercustomthmpisará el contador y establecerá lo que se necesita para que los siguientes \labelcomandos usen el valor del contador. Sin embargo, LaTeX no mira el valor en sí, sino que usa el significado actual de \the<counter>, en este caso \theinnercustomthm. El significado de \theinnercustomthmtambién se utiliza para numerar el entorno.

Nuestra idea es numerar teoremas manualmente, porque necesitamos citar teoremas con el mismo número que tienen en otra publicación, por lo que la numeración automática está fuera de discusión. Bueno, inventamos un envoltorio innercustomthmque tomará como argumento el número que queremos que tenga la declaración.

Entonces, la idea es iniciar un entorno tomando un argumento que se utilizará para redefinir (localmente) \theinnercustomthmy llamar al entorno "interno" que hará su trabajo de componer la declaración.

La definición de customthmpodría ser

\newenvironment{customthm}[1]
  {\renewcommand{\theinnercustomthm}{#1}\begin{innercustomthm}}
  {\end{innercustomthm}}

pero esto tiene un pequeño inconveniente: si lo olvida \end{customthm}, terminará con el error de "Falta \end" mencionar en innercustomthmlugar de customthm. Entonces, los programadores machistas usan en este caso la versión interna de las rutinas \beginy \endpara el entorno "interno": la contabilidad ya se ha realizado \begin{customthm}y no es necesario repetirla. Entonces obtenemos

\newenvironment{customthm}[1]
  {\renewcommand{\theinnercustomthm}{#1}\innercustomthm}
  {\endinnercustomthm}

Bueno, el código real que cita es

\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

¿Por qué faltan los frenillos? Otro (mal) hábito de los programadores machistas que saben que esos aparatos son innecesarios y que de todos modos se eliminarán.

En caso de duda, utilícelos.

Noname Sep 10 2020 at 14:35

Primero, deberíamos preguntarnos qué \newvironment{myenv}{..start code...}{...end code...}hace realmente. Simplificándolo un poco, lo que sucede es que \newenvironmentdefine dos comandos \myenvy \endmyenv, donde se \myenvexpande a ...start code...y se \endmyenvexpande a ...end code.... Cuando escribe \begin{myenv}...\end{myenv}LaTeX reemplaza este entorno con un código que es (casi) equivalente a {\myenv ... \endmyend}. (Un poco más sucede detrás de escena).

A continuación, la línea \newtheorem{innercustomthm}{Theorem}define el innercustomthmentorno como un entorno "Teorema" que utiliza el innercustomthmcontador. En particular, el "número de teorema" para este entorno se imprime usando \theinnercustomthm.

Ahora consideremos:

\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

Esto define el customthmentorno, que tiene un argumento #1. Por el primer párrafo anterior, se \begin{customthm}[X]...\end{customthm}expande a:

{\renewcommand\theinnercustomthm{X}\innercustomthm ... \endinnercustomthm}

Es decir, \theinnercustomthmse redefine para que sea igual a Xdespués de lo cual innercustomthmse aplica el entorno. Entonces, el customthmentorno es esencialmente el mismo que el innercustomthmentorno, excepto que \theinnercustomthmprimero se establece igual a X, donde Xes el argumento para el customthmentorno. Entonces, el efecto neto es que este entorno imprime: "Teorema X" ...

Finalmente, dijiste que cambiar el nombre del entorno (digamos en mytheolugar de customthm) rompe el código . Si lo que he dicho es correcto, ¡no puede ser cierto! De hecho, como muestra el siguiente código, el código funciona exactamente de la misma manera si cambiamos el nombre del entorno:

\documentclass{article}

\newtheorem{innercustomthm}{Theorem}
\newenvironment{mytheo}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

\begin{document}

  \begin{innercustomthm}Hi
  \end{innercustomthm}

  \begin{mytheo}Hi
  \end{mytheo}

\end{document}