¿Existen entornos de tamaño de fuente?

¿Existen entornos de tamaño de fuente?

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 LaTeXcomando definido por \newcommandy 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á \foodefinido, por lo que se le pone el environmentnombre 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\endcsnamese expande a a \relaxy no sucede nada malo.

Cabe señalar que muchos de los entornos conocidos no están definidos con \newenvironment. Es suficiente usar un \foocomando y \def\endfoo, ver \endequationo \endenumerateetc. 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 \parlínea o una línea en blanco antes, lo \endcual 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 centerincluyen un implícito \paren su código final, pero ese no es el caso aquí.

Véase también la discusión en:

¿Están reservados los nombres de macro \end.... en LaTeX2e?

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 ( \beginemisiones a \begingroup, y \endlas correspondientes \endgroup). Ahora, \smalles 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 \endsmallno plantea ningún problema, porque se llama as \csname small\endcsnamey, por tanto, equivale a \relaxif 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, \FOOy \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 \endestá emparejado con el correcto \begin;

  • el comando \FOOse 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):

  • \endFOOse ejecuta, si está definido (no pasa nada si no lo está, como ya se explicó anteriormente);

  • LaTeX comprueba que el argumento de \endsea igual a \@currenvir y genera un error si no;

  • Se emite un \endgroupmensaje para cerrar el grupo.

En realidad, cuando defino un nuevo entorno basado en otro estándar, prefiero evitar el uso explícito \beginy \end, para que el valor de \@currenvirno cambie. Por ejemplo, supongamos que quiero definir una variante del quoteentorno 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 \enddeclaración, obtendrán un error sobre un italquoteentorno terminado incorrectamente, que es lo que realmente usaron, no sobre un quoteentorno terminado incorrectamente, del cual podrían no estar al tanto.

información relacionada