
Sin duda, existen cambios de tamaño de fuente en forma de secuencias de control (descritasaquípor ejemplo.) Pero, de vez en cuando me encontré con ejemplos de código donde se usaban versiones de entorno de ellos, por ejemplo \begin{small}...\end{small}
. Después de probarlos con éxito, comencé a incorporarlos a mi vocabulario TeX.
Hace unos días @GonzaloMedina comentó en una de mis respuestas que esos ambientes no existen y las construcciones que dependen de ellos funcionan por pura coincidencia. Luego traté de averiguar más sobre esos entornos siniestros. Siniestro porque no parecen estar documentados de alguna manera. (Lo único que encontré que intentó explicarlos de alguna manera sistemática fue algún recurso de Wikilibros).
¿Son estos entornos reales o no?
Respuesta1
Puede usar cualquier LaTeX
comando definido por \newcommand
y envolverlo \begin{}...\end{}
en un par; sin embargo, no se recomienda, ya que este no es un entorno.
Sin embargo, lo interesante es que la agrupación funciona de todos modos, pero esto es consecuencia de \begin...\end
.
No hay entornos de tamaño de fuente como \begin{small}
etc, como no los hay, \begin{chapter}
etc.
Ver por ejemplo:
\documentclass{article}
\newcommand{\foo}{This does nothing}
\begin{document}
\begin{foo}
\end{foo}
\end{document}
EditarAlgunas explicaciones
Este código se puede encontrar en latex.ltx
, consulte las líneas 4058f.
\def\begin#1{%
\@ifundefined{#1}%
{\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
{\def\reserved@a{\def\@currenvir{#1}%
\edef\@currenvline{\on@line}%
\csname #1\endcsname}}%
\@ignorefalse
\begingroup\@endpefalse\reserved@a}
Se puede ver que @ifundefined{foo}
se llamaría, lo cual es falso, ya que está \foo
definido, por lo que se le pone el environment
nombre y (es decir ) se llama.foo
\csname #1\endcsname
\foo
Ahora la \end{foo}
: parte
\def\end#1{%
\csname end#1\endcsname\@checkend{#1}%
\expandafter\endgroup\if@endpe\@doendpe\fi
\if@ignore\@ignorefalse\ignorespaces\fi}
Los entornos buscan el \end...
código aquí \endfoo
, que no está definido, pero \csname endfoo\endcsname
se expande a a \relax
y no sucede nada malo.
Cabe señalar que muchos de los entornos conocidos no están definidos con \newenvironment
. Es suficiente usar un \foo
comando y \def\endfoo
, ver \endequation
o \endenumerate
etc. por ejemplo.
Respuesta2
Cualquier comando puede usarse como entorno y, si rodea grandes bloques de texto, suele ser conveniente, por lo que
{\small zzz\par}
y
\begin{small}%
zzzz
\end{small}
son más o menos equivalentes.
Sin embargo, tenga en cuenta que, a diferencia de \small
, los espacios posteriores \begin{small}
no se eliminan debido a las reglas normales de tokenización de TeX. Además, casi siempre necesita una \par
línea o una línea en blanco antes, lo \end
cual también es cierto en el formulario de comando, pero es más fácil de olvidar en el formulario de entorno, ya que la mayoría de los entornos personalizados center
incluyen un implícito \par
en su código final, pero ese no es el caso aquí.
Véase también la discusión en:
Respuesta3
De hecho, el “LaTeXbook” (propiamente “LaTeX. A Document Preparation System”, de Leslie Lamport) avala el uso de dichos entornos: al final de la página 27 encontramos:
Cada declaración tiene un entorno correspondiente con el mismo nombre (menos el
\
carácter). Mecanografía\begin{em} ... \end{em}
es equivalente a escribir
{\em ... }
.
En particular, el formulario “ambiental” suministra automáticamente un grupo para mantener locales los efectos de la declaración, como siempre ocurre con los entornos ( \begin
emisiones a \begingroup
, y \end
las correspondientes \endgroup
). Ahora, \small
es una declaración, por lo que se aplica lo anterior.
Esto se ha hecho a propósito, por lo que no me parece correcto decir que estos entornos funcionan “por casualidad”; de hecho, como ya se ha observado, la falta de definición de un comando like \endsmall
no plantea ningún problema, porque se llama as \csname small\endcsname
y, por tanto, equivale a \relax
if indefinido.
Entonces, al final mi respuesta es: “Sí, estos entornos son 'reales'” (sea lo que sea que esto signifique).
Suma
Después de ver algunos comentarios, pensé que podría ser útil agregar algunos detalles sobre cómo se implementan los entornos en LaTeX2e (no voy a hablar de LaTeX3 porque no tengo suficiente experiencia). Christian Hupfer ya ha presentado los extractos exactos del código de latex.ltx
, pero quizás a alguien también le resulten útiles los siguientes comentarios adicionales.
Cuando define el entorno FOO
, LaTeX simplemente define dos nuevos comandos, \FOO
y \endFOO
: el último siempre está sin argumentos, mientras que el primero tiene los mismos argumentos, si los hay, que se han especificado para el entorno FOO
. Cuando \begin{FOO}
se encuentra a, suceden las siguientes cosas (entre otras):
un grupo comienza con
\begingroup
;el argumento de
\begin
(FOO
, en este caso) se guarda (localmente) en la macro\@currenvir
, para poder comprobar, más adelante, que cada uno\end
está emparejado con el correcto\begin
;el comando
\FOO
se ejecuta como último paso; por lo tanto, absorberá los argumentos que siguen\begin{fOO}
, si están presentes.
Por otro lado, cuando llega LaTeX \end{FOO}
, sucede lo siguiente (entre otras cosas):
\endFOO
se ejecuta, si está definido (no pasa nada si no lo está, como ya se explicó anteriormente);LaTeX comprueba que el argumento de
\end
sea igual a\@currenvir
y genera un error si no;Se emite un
\endgroup
mensaje para cerrar el grupo.
En realidad, cuando defino un nuevo entorno basado en otro estándar, prefiero evitar el uso explícito \begin
y \end
, para que el valor de \@currenvir
no cambie. Por ejemplo, supongamos que quiero definir una variante del quote
entorno que pone en cursiva su contenido; Prefiero, digamos,
\newenvironment{italquote}{%
\quote
\itshape
}{\endquote}
encima
\newenvironment{italquote}{%
\begin{quote}%
\itshape
}{\end{quote}}
especialmente si no voy a utilizar el entorno yo mismo. De esta manera, si los usuarios escriben mal el nombre del entorno en la \end
declaración, obtendrán un error sobre un italquote
entorno terminado incorrectamente, que es lo que realmente usaron, no sobre un quote
entorno terminado incorrectamente, del cual podrían no estar al tanto.