
Quiero definir un entorno de teoremas donde pueda emitir la numeración manualmente en lugar de seguir algún contador interno. Mirando a mi alrededor encontréesterespuesta. 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 lo que hay en el código, en caso de que quiera modificarlo un poco (y también aprender lo que estoy poniendo en mi documento) y estoy un poco atascado.
En primer lugar, el \newenvironment tiene la siguiente estructura:
\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}
Entiendo que el tercer argumento queda 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 sucede, ya que no se utilizan aparatos ortopédicos; Pensé que tal vez el comando te permite omitirlos, pero no encontré ninguna información al respecto. Y después de eso se vuelve aún más confuso, ya que los comandos \theinnercustomthm, \innercustomthm y \endinnercustomthm parecen 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 (por ejemplo, Myteo en lugar de Customthm) descompone el código.
Si alguien puede explicarme lo que está pasando o indicarme algún manual o página web donde pueda entender lo que está pasando, se lo agradecería profundamente.
Respuesta1
Lo primero que hay que 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 motivo de preocupación aquí. Tenga en cuenta que el entorno busca un argumento opcional (una nota de teorema o una 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 dicho 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 innercustomthm
activará el contador y establecerá lo necesario para que los siguientes \label
comandos utilicen el valor del contador. Sin embargo, LaTeX no analiza el valor en sí, sino que utiliza el significado actual de \the<counter>
, en este caso \theinnercustomthm
. El significado de \theinnercustomthm
también se utiliza para numerar el entorno.
Nuestra idea es numerar los 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 contenedor innercustomthm
que 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) \theinnercustomthm
y llamar al entorno "interno" que hará su trabajo de componer la declaración.
La definición de customthm
podría ser
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\begin{innercustomthm}}
{\end{innercustomthm}}
pero esto tiene un pequeño inconveniente: si lo olvidas \end{customthm}
, terminarás con el error de "Falta \end
" mencionando innercustomthm
en lugar de customthm
. Entonces,programadores machosutilice en este caso la versión interna de las rutinas \begin
y \end
para el entorno “interno”: la contabilidad ya ha sido realizada \begin{customthm}
y no es necesario repetirla. Entonces obtenemos
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\innercustomthm}
{\endinnercustomthm}
Bueno, el código real que citas es
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
¿Por qué faltan frenillos? Otro (mal) hábito deprogramadores machosque saben que esos aparatos son innecesarios y serán eliminados de todos modos.
En caso de duda, utilícelos.
Respuesta2
Primero, deberíamos preguntarnos qué es lo \newvironment{myenv}{..start code...}{...end code...}
que realmente hace. Simplificándolo un poco, lo que pasa es que \newenvironment
define dos comandos \myenv
y \endmyenv
, donde \myenv
se expande al ...start code...
y \endmyenv
se expande a ...end code...
. Cuando escribes, \begin{myenv}...\end{myenv}
LaTeX reemplaza este entorno con 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 que el innercustomthm
entorno será un entorno "Teorema" que utiliza el innercustomthm
contador. En particular, el "número de teorema" para este entorno se imprime utilizando \theinnercustomthm
.
Ahora consideremos:
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
Esto define el customthm
entorno, que requiere un argumento #1
. Por el primer párrafo anterior, \begin{customthm}[X]...\end{customthm}
se expande a:
{\renewcommand\theinnercustomthm{X}\innercustomthm ... \endinnercustomthm}
Es decir, \theinnercustomthm
se redefine para que sea igual a después del cual se aplica X
el entorno. innercustomthm
Entonces, el customthm
entorno es esencialmente el mismo que el innercustomthm
entorno, excepto que \theinnercustomthm
primero se establece igual a X
, donde X
está el argumento del customthm
entorno. Entonces, el efecto neto es que este entorno imprime: "Teorema X"...
Finalmente dijistecambiar el nombre del entorno (digamos mytheo
en lugar de customthm
) rompe el código. ¡Si lo que he dicho es correcto entonces esto 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}