Further to Stefan's answer, here is the definition of \begin
and \end
from latex.ltx
, clearly showing the grouping (\begingroup
and \endgroup
):
\def\begin#1{%
\@ifundefined{#1}% Environment begin
{\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}% <- grouping starts
\def\end#1{% Environment end
\csname end#1\endcsname\@checkend{#1}%
\expandafter\endgroup\if@endpe\@doendpe\fi% <- grouping ends
\if@ignore\@ignorefalse\ignorespaces\fi}
In contrast to that, defining a new environment merely executes (in some order, depending on optional parameter specification):
\def\newenvironment{\@star@or@long\new@environment}
\def\new@environment#1{%
\@testopt{\@newenva#1}0}
\def\@newenva#1[#2]{%
\kernel@ifnextchar [{\@newenvb#1[#2]}{\@newenv{#1}{[#2]}}}
\def\@newenvb#1[#2][#3]{\@newenv{#1}{[#2][{#3}]}}
\def\renewenvironment{\@star@or@long\renew@environment}
\def\renew@environment#1{%
\@ifundefined{#1}%
{\@latex@error{Environment #1 undefined}\@ehc
}\relax
\expandafter\let\csname#1\endcsname\relax
\expandafter\let\csname end#1\endcsname\relax
\new@environment{#1}}
\long\def\@newenv#1#2#3#4{%
\@ifundefined{#1}%
{\expandafter\let\csname#1\expandafter\endcsname
\csname end#1\endcsname}%
\relax
\expandafter\new@command
\csname #1\endcsname#2{#3}% <- \<env>
\l@ngrel@x\expandafter\def\csname end#1\endcsname{#4}}% <- \end<env>
From the definition of \@newenv
(I've added some comments), \newenvironment{<env>}{<begin-env>}{<end-env>}
assigns <begin-env>
to \<env>
and <end-env>
to \end<env>
without any sign of grouping.