
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 LaTeX
comando definido por \newcommand
e 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 \foo
está definido, então o environment
nome 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\endcsname
se expande para a \relax
e nada de ruim acontece.
Deve-se notar que muitos dos ambientes conhecidos não são definidos com \newenvironment
. Basta usar um \foo
comando e \def\endfoo
, see \endequation
ou \endenumerate
etc., 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 \par
linha ou em branco antes de o \end
que 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 center
inclui um implícito \par
em seu código final, mas esse não é o caso aqui.
Veja também a discussão em:
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 ( \begin
issues a \begingroup
e \end
os 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 \endsmall
não levanta nenhum problema, porque é chamado como \csname small\endcsname
e é, portanto, equivalente a \relax
if 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, \FOO
e \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\end
está 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 \begin
and explícito \end
, para que o valor de \@currenvir
não seja alterado. Por exemplo, suponha que eu queira definir uma variante do quote
ambiente 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 \end
instrução, eles receberão um erro sobre um italquote
ambiente encerrado incorretamente, que é o que eles realmente usaram, e não sobre um quote
ambiente encerrado incorretamente, do qual eles poderiam não ter conhecimento.