除了可能让我的语法高亮器更容易解析之外,还有什么理由要写
\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}
工作,看看每个使用大小命令作为环境并摆脱它(在某种程度上)的人。