为什么 \begin{flushleft}...\end{flushleft} 不像 \flushleft...\endflushleft 那样运行?

为什么 \begin{flushleft}...\end{flushleft} 不像 \flushleft...\endflushleft 那样运行?

以下 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

相关内容