Existem ambientes de tamanho de fonte?

Existem ambientes de tamanho de fonte?

Sem dúvida, existem opções de tamanho de fonte na forma de sequências de controle (descritasaquipor exemplo.) Mas, de tempos em tempos, encontrei exemplos de código onde versões de ambiente eram usadas, por exemplo, \begin{small}...\end{small}. Depois de testá-los com sucesso, comecei a incorporá-los ao meu vocabulário TeX.

Há poucos dias @GonzaloMedina comentou em uma de minhas respostas que esses ambientes não existem e as construções que dependem deles funcionam por pura coincidência. Então tentei descobrir mais sobre esses ambientes sinistros. Sinistros porque não parecem estar documentados de alguma forma. (A única coisa que descobri que tentou explicá-los de uma maneira sistemática foi algum recurso do Wikilivros.)

Esses ambientes são reais ou não?

Responder1

Você pode usar qualquer LaTeXcomando definido por \newcommande agrupar um \begin{}...\end{}par em torno dele, porém, não é recomendado, pois este não é um ambiente.

O interessante, porém, é que o agrupamento funciona de qualquer maneira, mas isso é consequência de \begin...\end.

Não existem ambientes de tamanho de fonte como \begin{small}etc, assim como não existem \begin{chapter}etc.

Veja por exemplo:

\documentclass{article}


\newcommand{\foo}{This does nothing}

\begin{document}
\begin{foo}

\end{foo}
\end{document}

EditarAlgumas explicações

Este código pode ser encontrado em latex.ltx, consulte as linhas 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}

Vê-se que @ifundefined{foo}seria chamado, o que é falso, pois \fooestá definido, então o environmentnome fooé definido e \csname #1\endcsname(ou seja \foo) é chamado.

Agora a \end{foo}parte:

\def\end#1{%
  \csname end#1\endcsname\@checkend{#1}%
  \expandafter\endgroup\if@endpe\@doendpe\fi
  \if@ignore\@ignorefalse\ignorespaces\fi}

Os ambientes procuram o \end...código aqui \endfoo, que não está definido, mas \csname endfoo\endcsnamese expande para a \relaxe nada de ruim acontece.

Deve-se notar que muitos dos ambientes conhecidos não são definidos com \newenvironment. Basta usar um \foocomando e \def\endfoo, see \endequationou \endenumerateetc., por exemplo.

Responder2

Qualquer comando pode ser usado como um ambiente e, se envolver grandes blocos de texto, geralmente é conveniente, portanto

{\small  zzz\par}

e

\begin{small}%
zzzz

\end{small}

são mais ou menos equivalentes.

Observe, entretanto, que diferentemente de \small, os espaços depois \begin{small}não são descartados devido às regras normais de tokenização do TeX. Além disso, você quase sempre precisa de uma \parlinha ou em branco antes de o \endque também é verdadeiro no formulário de comando, mas é mais fácil de esquecer no formulário de ambiente, pois a maioria dos ambientes personalizados, como centerinclui um implícito \parem seu código final, mas esse não é o caso aqui.

Veja também a discussão em:

Os nomes de macro \end.... são reservados no LaTeX2e?

Responder3

Na verdade, o “LaTeXbook” (propriamente “LaTeX. A Document Preparation System”, de Leslie Lamport) endossa o uso de tais ambientes: no final da página 27 encontramos:

Cada declaração possui um ambiente correspondente com o mesmo nome (sem o \caractere). Digitando

\begin{em} ... \end{em}

é equivalente a digitar {\em ... }.

Em particular, a forma “ambiental” fornece automaticamente um grupo para manter os efeitos da declaração locais, como sempre acontece com os ambientes ( \beginissues a \begingroupe \endos correspondentes \endgroup). Agora, \smallé uma declaração, então o acima se aplica.

Isso foi feito propositalmente, então não considero correto dizer que esses ambientes funcionam “por acaso”; na verdade, como já foi observado, a falta de definição de um comando like \endsmallnão levanta nenhum problema, porque é chamado como \csname small\endcsnamee é, portanto, equivalente a \relaxif indefinido.

Então, no final, minha resposta é: “Sim, esses ambientes são 'reais'” (seja lá o que isso signifique).


Adição

Depois de ver alguns comentários, pensei que poderia ser útil adicionar alguns detalhes sobre como os ambientes são implementados no LaTeX2e (não vou falar do LaTeX3 porque não tenho conhecimento suficiente). Christian Hupfer já apresentou os trechos exatos do código de latex.ltx, mas talvez alguém também ache úteis as seguintes observações adicionais.

Quando você define o ambiente FOO, o LaTeX simplesmente define dois novos comandos, \FOOe \endFOO: o último está sempre sem argumentos, enquanto o primeiro tem os mesmos argumentos, se houver, que foram especificados para o ambiente FOO. Quando a \begin{FOO}é encontrado, acontecem as seguintes coisas (entre outras):

  • um grupo é iniciado com \begingroup;

  • o argumento de \begin( FOO, neste caso) é salvo (localmente) na macro \@currenvir, para poder verificar, mais tarde, se cada um \endestá emparelhado com o correto \begin;

  • o comando \FOOé executado por último; assim, absorverá os argumentos que se seguem \begin{fOO}, caso estejam presentes.

Por outro lado, quando o LaTeX chega \end{FOO}, acontece o seguinte (entre outras coisas):

  • \endFOOé executado, se estiver definido (nada acontece se não estiver, conforme já explicado acima);

  • O LaTeX verifica se o argumento de \endé igual a \@currenvir e gera um erro se não for;

  • an \endgroupé emitido para fechar o grupo.

Na verdade, quando defino um novo ambiente baseado em outro padrão, prefiro evitar usar \beginand explícito \end, para que o valor de \@currenvirnão seja alterado. Por exemplo, suponha que eu queira definir uma variante do quoteambiente que coloque seu conteúdo em itálico; Eu prefiro, digamos,

\newenvironment{italquote}{%
  \quote
  \itshape
}{\endquote}

sobre

\newenvironment{italquote}{%
  \begin{quote}%
  \itshape
}{\end{quote}}

especialmente se eu não for usar o ambiente sozinho. Dessa forma, se os usuários digitarem incorretamente o nome do ambiente na \endinstrução, eles receberão um erro sobre um italquoteambiente encerrado incorretamente, que é o que eles realmente usaram, e não sobre um quoteambiente encerrado incorretamente, do qual eles poderiam não ter conhecimento.

informação relacionada