Entornos

TeX en sí no tiene un comando \begin. El plain TeX de Knuth solo define \beginsection; la forma \begin{...}\end{...} la añadió LaTeX. ¿Para qué se añadió? La respuesta es una única promesa: en cuanto se pasa \end, todo lo que se cambió dentro vuelve a como estaba. Ese mecanismo, el entorno, hizo que listas, ecuaciones en display, figuras, citas e incluso el cuerpo del documento adoptaran la misma forma. Esta página cubre qué garantiza un entorno de LaTeX, cómo se anidan los entornos y cómo leer el mensaje \begin{...} ended by \end{...} que aparece cuando los dos nombres no coinciden.

Qué garantizan \begin y \end

Lo que un entorno garantiza es un grupo. \begin{name} abre un grupo de TeX incluso antes de averiguar qué se supone que hace el entorno, y \end{name} vuelve a cerrarlo. Así que se cambie lo que se cambie dentro —la fuente, los márgenes, lo que sea—, nada de ello sobrevive a la línea posterior a \end. Un entorno center centra su contenido, uno itemize lo convierte en lista con viñetas, uno quote ensancha ambos márgenes, y cada uno de esos efectos termina dentro de su propio tramo. Dicho al revés: lo que un entorno aporta no es decoración sino una garantía de limpieza, y esa es justamente la razón de la regla «recurre primero a un entorno».

Los nombres de \begin{name} y \end{name} deben coincidir exactamente: no se puede abrir \begin{center} y cerrarlo con \end{flushleft}. Entre bastidores, LaTeX hace el trabajo poco vistoso de recordar el nombre del entorno abierto en ese momento, y por eso su mensaje de error puede citar ambos nombres y el número de línea de la apertura. El documento tampoco es una excepción: \begin{document}\end{document} es un entorno de pleno derecho, y la regla básica de que el cuerpo del texto va ahí no es más que la observación corriente de que va dentro del entorno más exterior.

latex
\begin{center}
This paragraph is centred; the line after \end is not.
\end{center}

\begin{quote}
  {\itshape Everything inside is a group,}
  so this italic never escapes the environment.
\end{quote}

Anidar: cerrar en el orden inverso al de apertura

Los entornos pueden anidarse, pero se cierran exactamente en el orden inverso al de apertura: si se abre \begin{b} dentro de \begin{a}, primero va \end{b} y después \end{a}. Los tramos no pueden solaparse, como en \begin{a}\begin{b}...\end{a}\end{b}. La razón es la garantía de la sección anterior: como un entorno es un grupo, los grupos solo pueden encajar unos dentro de otros como cajas, y la forma medio solapada sencillamente no existe. Una lista dentro de una cita, una tabla dentro de una figura, una ecuación dentro de un teorema: toda combinación que aparece en la práctica se escribe con naturalidad como este tipo de anidamiento.

latex
\begin{quote}
  A bulleted list inside a quotation:
  \begin{itemize}
    \item first
    \item second
  \end{itemize}
\end{quote}

Aquí solo merece la pena adquirir un hábito: al abrir un entorno, escriba la línea de cierre antes que el contenido. Después sangre el interior dos o cuatro espacios y los emparejamientos —un tabular dentro de un figure, un itemize dentro de un quote— se vuelven visibles en la propia forma de la fuente. Cuanto más profundo es el anidamiento, más fácil resulta equivocar un \end al sustituir el contenido más adelante, y como muestra la sección siguiente, ese accidente concreto no aflora donde se cometió.

Los entornos que se encuentran primero, agrupados por uso

Los entornos que ofrece LaTeX estándar se aclaran si se miran en cinco familias: alineación del texto, listas, matemáticas, flotantes y material tabular. El detalle de cada uno corresponde a su propia página, pero la forma es idéntica en todos: abrir con \begin, cerrar con \end, y el interior es un grupo. Ante un entorno nuevo, preguntarse primero «¿qué tramo está acotando?» suele acercar bastante.

FamiliaEntornosQué hacen
textcenter, flushleft, flushright, quote, quotation, verbatimCentrado, alineación a izquierda y derecha; citas; salida tal como se escribió
listsitemize, enumerate, descriptionListas con viñetas, numeradas y con etiqueta
mathequation, align, gatherEcuaciones en display, alineación multilínea, numeración
floatsfigure, tableLlevan leyenda y número, y dejan la posición al sistema de composición
tabulartabular, arrayLa cuadrícula de filas y columnas en sí, distinta de figure y table

Tres parejas de esa lista se confunden con frecuencia. quote frente a quotation: ambos sangran el material citado por izquierda y derecha, pero quotation sangra además la primera línea de cada párrafo, lo que conviene a una cita larga de varios párrafos. figure/table frente a tabular: son cosas completamente distintas — la primera pareja es «un contenedor que flota y lleva leyenda y número», el segundo es «la cuadrícula en sí». Si una tabla necesita número y referencias cruzadas, se pone el tabular dentro de un table. Y verbatim imprime su contenido en fuente monoespaciada exactamente como se escribió, sin interpretar siquiera \ o { como comandos: la manera habitual de mostrar código fuente.

Algunos entornos toman argumentos, dados en los {...} o [...] que siguen directamente a \begin. Un tabular, por ejemplo, exige una especificación de columnas: el {cc} de \begin{tabular}{cc} da la alineación de cada columna (c centro, l izquierda, r derecha), y dentro las columnas se separan con & y cada fila termina con \\. Igualmente, figure recibe una preferencia de colocación como opción, como en \begin{figure}[htbp]. Los argumentos van siempre justo detrás del nombre del entorno; en el lado de \end nunca se escribe nada.

latex
\begin{figure}[htbp]
  \centering
  \begin{tabular}{ll}
    input  & output \\
    source & PDF    \\
  \end{tabular}
  \caption{A tabular grid inside a floating table}
  \label{tab:demo}
\end{figure}

align frente a align*: el asterisco forma parte del nombre

Un nombre con un * al final es la versión que no numera nada. align numera cada línea; \begin{align*}\end{align*} no numera ninguna. equation* sigue la misma idea: una ecuación en display sin número. Lo curioso es que ese * no es ni una opción ni un argumento, sino parte del nombre mismo. \begin ensambla la cadena que recibe directamente en un nombre de comando, de modo que nace un comando llamado realmente align*, asterisco incluido. Como mostró la página anterior, el nombre de una palabra de control termina en el primer carácter que no es letra, así que ese comando nunca puede invocarse escribiendo \align*; la única vía de acceso es \begin{align*}.

latex
\begin{align}          % every line gets an equation number
  a &= b + c \\
  d &= e + f
\end{align}

\begin{align*}         % same layout, no numbers at all
  a &= b + c \\
  d &= e + f
\end{align*}

Cuando aparece \begin{...} ended by \end{...}

Este mensaje no dice «lo cerraste mal», sino «esto es lo que estaba abierto». Cuando los nombres no concuerdan, LaTeX se detiene con algo como ! LaTeX Error: \begin{center} on input line 5 ended by \end{flushleft}., citando el nombre del entorno abierto junto con su número de línea. Hay que leer la primera mitad, no el \end de la segunda: la línea en la que se reporta el error es casi siempre la del \end, mientras que el lugar que realmente hay que arreglar es la línea que señala la primera mitad. Un \end olvidado produce la misma forma de mensaje, con \end{document} como contraparte: ! LaTeX Error: \begin{itemize} on input line 2 ended by \end{document}. significa que el itemize abierto en la línea 2 nunca llegó a cerrarse.

Un nombre mal escrito se comporta de forma algo distinta. Escriba un nombre no definido como \begin{itemzie} y obtendrá primero ! LaTeX Error: Environment itemzie undefined. y a continuación ! LaTeX Error: \begin{document} ended by \end{itemzie}. Aparecen dos errores porque \begin abre el grupo antes de comprobar si el entorno existe siquiera. El grupo queda abierto, de modo que el \end correspondiente ya no se empareja con nadie. De ahí sale una regla práctica: corrija los errores de uno en uno desde arriba y recompile, ignorando todo lo que siga al primero. En torno a los entornos, en particular, el primer error suele ser la causa del segundo.

Hay una pista más que distingue ambos casos. Una llave sin cerrar produce un mensaje de TeX mismo, no de LaTeX. Cerca del final del log aparece solo (\end occurred inside a group at level 1), sin número de línea. Lo que quedó abierto es un grupo simple y sin nombre, así que TeX no tiene con qué responder al «dónde». Leído al revés, esto se vuelve un diagnóstico: un mensaje con número de línea indica una discordancia de entornos, y este por sí solo indica una llave. Para acotar, extraer el entorno sospechoso a un archivo aparte y compilarlo solo sigue siendo la vía más rápida.

Elegir un entorno por significado, no por apariencia

Un entorno no es una caja visual: es el nombre de una parte del manuscrito. Elija quote porque el material es una cita, itemize porque es una lista de elementos, tabular porque es una cuadrícula, figure o table porque necesita número y referencias cruzadas, y las leyendas, la numeración, las referencias y los índices de figuras vendrán solos más adelante. Si en cambio sigue eligiendo por apariencia —«center porque lo quiero centrado», «quote porque quiero margen»—, seis meses después no podrá saber para qué servía cada caja ni cambiar el estilo de una sola pasada. Si solo se busca un cambio visual, recurrir a una declaración o a un comando de espaciado es más honesto que recurrir a un entorno.

  • El contenido es una cita — use quote o quotation y cite la fuente en el texto o en una nota al pie.
  • El contenido es una lista lógica — use itemize, enumerate o description; no finja viñetas con \\.
  • Una figura o tabla necesita numeración y referencias — coloque \caption y \label dentro de figure o table, y deje la cuadrícula a tabular.
  • La misma combinación se repite — en vez de copiar comandos locales de formato, póngale nombre con \newenvironment y fije su significado.

Como sugiere ese último punto, los entornos no solo se usan: también se definen. \newenvironment recibe el código que se ejecuta al principio y el que se ejecuta al final; \renewenvironment rehace un nombre que ya existe. Los detalles —cómo se pasan los argumentos, por qué el lado de \end no puede usarlos y la interfaz moderna NewDocumentEnvironment— están reunidos en la página dedicada a los entornos propios. Lo único que hay que llevarse de aquí es esto: un entorno que usted defina hereda exactamente la garantía de agrupación descrita en esta sección, sin esfuerzo adicional.