我发现,以下代码中两次展示定理的尝试都会产生类似的输出。
\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}