\begin{theorem}...\end{theorem} 和 {\theorem ...} 之间的区别

\begin{theorem}...\end{theorem} 和 {\theorem ...} 之间的区别

我发现,以下代码中两次展示定理的尝试都会产生类似的输出。

\documentclass{article}
\usepackage{amsthm}
\newtheorem{theorem}{Theorem}
\begin{document}

\begin{theorem}
\( (a + b)^2 = a^2 + 2ab + b^2 \)
\end{theorem}

{
\theorem
\( (a + b)^2 = a^2 + 2ab + b^2 \)
}
\end{document}

我想知道\begin{theorem}...\end{theorem}和之间{\theorem ...}有什么区别。

答案1

假设foo是某种环境;

\begin{foo}

LaTeX 进行一些记账,打开一个组并扩展宏

\foo

\end{foo}

进行了一些检查,\endfoo扩大了范围并关闭了该组。

在这种情况下theorem,我们可以测试

\show\theorem
\show\endtheorem

这使

> \theorem=macro:
->\@thm {\let \thm@swap \@gobble \th@plain }{theorem}{Theorem}.

> \endtheorem=macro:
->\endtrivlist \@endpefalse .

这似乎\endtheorem没有什么大不了的;但让我们看看这\endtrivlist意味着什么:

> \endtrivlist=macro:
->\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 .

所以你错过了一些如果省略的话\end{theorem}

也许,在遗漏不多的情况下theorem,只获得“类似”的输出并不能保证,也许几页之后,会出现问题。在特定情况下,最引人注目的方面是,即使在右括号后留出一个空行,语句后的垂直间距也会出错。

这种做法肯定不是值得推荐:某些环境在 时完成大部分工作\end...;而其他环境在此阶段几乎不做任何工作。应该深入了解每个环境的作用。

最后,{\theorem ...}语法很笨拙。

答案2

只要在两个构造之后添加一些材料,您就会看到差异;\end{theorem}使用\endtrivlist内部使用\par,有效地结束一个段落;在第二个构造中没有段落结尾:

\documentclass{article}
\usepackage{amsthm}
\newtheorem{theorem}{Theorem}
\begin{document}

\begin{theorem}
\( (a + b)^2 = a^2 + 2ab + b^2 \)
\end{theorem}
aaa

{
\theorem
\( (a + b)^2 = a^2 + 2ab + b^2 \)
}
aaa
\end{document}

在此处输入图片描述

相关内容