是否有理由使用 \begin{environment} \end{environment} 而不是 \environment \endenvironment?

是否有理由使用 \begin{environment} \end{environment} 而不是 \environment \endenvironment?

除了可能让我的语法高亮器更容易解析之外,还有什么理由要写

\begin{center}
Here is centered text
\end{center}

而不是:

\center
Here is centered text
\endcenter

其他环境也一样。它们会\begin进行任何额外的特殊检查吗?或者它们实际上是同义词吗?

答案1

\begin\end建立一个组,这样可以将设置保持在本地。简单的书写\command ... \endcommand不行。这样的范围对我来说非常重要,这就是我更喜欢这种\begin ... \end语法的原因。

例子:

\documentclass[a4paper]{article}
\begin{document}
\begin{center}
\bfseries Text
\end{center}
text % this is normal font, left aligned as default
\center
\bfseries Text
\endcenter

text % this is still bold! and it's even centered
\end{document}

答案2

latex.ltx

\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}
\def\end#1{%
  \csname end#1\endcsname\@checkend{#1}%
  \expandafter\endgroup\if@endpe\@doendpe\fi
  \if@ignore\@ignorefalse\ignorespaces\fi}

\begin定义(本地)\@currenvir\@currenvline,启动一个组并设置\@endpefalse\end检查\@currenvir其参数(如果不一致则抛出错误)并执行其他管理任务。这不仅仅是分组。另一方面,\environment\endenvironment可以(几乎总是)安全地用于另一个环境的定义。TeX.sx 上有几个关于此的主题。

答案3

进一步Stefan 的回答\begin,这是和\end的定义latex.ltx,清晰地显示了分组(\begingroup\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}

与此相反,定义一个新的环境仅仅执行(按某种顺序,取决于可选参数规范):

\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>

\@newenv根据(我添加了一些注释)的定义,\newenvironment{<env>}{<begin-env>}{<end-env>}分配<begin-env>\<env><end-env>\end<env>,没有任何分组的迹象。

答案4

除此之外:\endfoo不需要定义才能\end{foo}工作,看看每个使用大小命令作为环境并摆脱它(在某种程度上)的人。

相关内容