Ayuda para explicar la sintaxis de este comando.

Ayuda para explicar la sintaxis de este comando.

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 innercustomthmactivará el contador y establecerá lo necesario para que los siguientes \labelcomandos 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 \theinnercustomthmtambié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 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 olvidas \end{customthm}, terminarás con el error de "Falta \end" mencionando innercustomthmen lugar de customthm. Entonces,programadores machosutilice en este caso la versión interna de las rutinas \beginy \endpara 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 \newenvironmentdefine dos comandos \myenvy \endmyenv, donde \myenvse expande al ...start code...y \endmyenvse 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 innercustomthmentorno será un entorno "Teorema" que utiliza el innercustomthmcontador. 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 customthmentorno, 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, \theinnercustomthmse redefine para que sea igual a después del cual se aplica Xel entorno. innercustomthmEntonces, el customthmentorno es esencialmente el mismo que el innercustomthmentorno, excepto que \theinnercustomthmprimero se establece igual a X, donde Xestá el argumento del customthmentorno. Entonces, el efecto neto es que este entorno imprime: "Teorema X"...

Finalmente dijistecambiar el nombre del entorno (digamos mytheoen 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}

información relacionada