以下 MWE 指出其\begin{flushleft}...\end{flushleft}
行为不同于其宏对应部分\flushleft...\endflushleft
::
flushleft
环境影响停止于\end{flushleft}
\flushleft
宏的效果在 之后持续\endflushleft
。
我想知道为什么。
\documentclass{article}
\usepackage{mwe}
\begin{document}
\section{Environments}
\begin{flushleft}
\lipsum[1]
\end{flushleft}
\lipsum[2]
\section{Macros}
\flushleft%
\lipsum[1]
\endflushleft%
\lipsum[2]
\end{document}
答案1
首先让我们看看\endflushleft
:
% latex.ltx, line 3973:
\def\endflushleft{\endtrivlist}
现在\endtrivlist
:
% latex.ltx, line 4425:
\def\endtrivlist{%
\if@inlabel
\leavevmode
\global \@inlabelfalse
\fi
\if@newlist
\@noitemerr
\global \@newlistfalse
\fi
\ifhmode\unskip \par
\else
\@inmatherr{\end{\@currenvir}}%
\fi
\if@noparlist \else
\ifdim\lastskip >\z@
\@tempskipa\lastskip \vskip -\lastskip
\advance\@tempskipa\parskip \advance\@tempskipa -\@outerparskip
\vskip\@tempskipa
\fi
\@endparenv
\fi
}
好的,没有什么奇怪的。但问题在于\flushleft
:
% latex.ltx, line 3972:
\def\flushleft{\trivlist \raggedright\item\relax}
声明\raggedright
没有被组包围,因此即使找到\endflushleft
它也会永远持续下去。
而且\end{flushleft}
还提供了一个\endgroup
令牌,它将与(在执行之前)\begingroup
颁发的相匹配,因此设置将被撤消。\begin{flushleft}
\raggedright
\raggedright
您不应该在文档中使用\flushright
和。但它们可以在环境定义中使用。\endflushright