在包中ntheorem
,有一个名为的定理样式break
,定义它的相应代码为:
\newtheoremstyle{break}%
{\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont
##1\ ##2\theorem@separator}\hbox{\strut}}}]}%
{\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont
##1\ ##2\ (##3)\theorem@separator}\hbox{\strut}}}]}
我采用了此代码使其能够正常工作amsthm
,下面是 MWE。
\documentclass{article}
\usepackage{amsthm}
\newtheoremstyle{break}
{}{}
{\normalfont}{}
{\bfseries}{}
{0pt}
{%
\rlap{\vbox{\hbox{%
\thmname{#1}\thmnumber{\nobreakspace #2}%
{\thmnote{\hspace{.4em}$($#3$)$}}%
}\hbox{\strut}\vskip0pt}}%
}
\theoremstyle{break}
\newtheorem{theorem}{Theorem}
\usepackage{blindtext}
\begin{document}
Text
\begin{theorem}
\blindtext
\end{theorem}
\begin{theorem}
\begin{itemize}
\item text
\item text
\item text
\end{itemize}
\end{theorem}
\end{document}
这非常有效,特别是当定理以列表开始时,而手册中给出的简单定义并非如此amsthm
:
\newtheoremstyle{break}%
{}{}%
{\itshape}{}%
{\bfseries}{}% % Note that final punctuation is omitted.
{\newline}{}
这个简单方法的主要问题是,当定理以
itemize
或enumerate
列表开头时,必须编写\leavevmode\vspace{-\baselineskip}
,请参阅下面@Mico 的精彩回答。我的一个朋友强烈建议我将其自动化。此外,如果在文章中写下这一点,当模板发生变化时,必须手动删除那些\leavevmode\vspace{-\baselineskip}
,尽管可以通过将其定义为单独的宏并每次重新定义来完成,但这绝对不简单也不优雅。
我的问题是:
- 这个代码(我指的是 MWE 中的代码,摘自
ntheorem
)是如何工作的?我不熟悉这些普通的 TeX 宏,所以我不太明白这里发生了什么。 - 您可能注意到我添加了一个
\vskip0pt
after\hbox{\strut}
,这令人惊讶地在定理标题后添加了一些额外的垂直空间(这正是我想要的,虽然我不知道为什么会这样)。为什么会发生这种情况?
答案1
用户指南第 4.3.1 节阿姆斯特丹这个包的标题是“定理风格突破”。我将在这里完整地引用它[突出显示]:
总而言之,在之前插入说明\leavevmode
和可以解决问题。仅仅插入是不够的。\vspace{-\baselineskip}
\begin{enumerate}
\leavevmode
就我个人而言,我认为\leavevmode \vspace{-\baselineskip}
在必要时执行比尝试改编ntheorem
软件包中的某些代码更容易。ntheorem
和amsthm
软件包可能共享类似的用户级命令,例如\newtheorem
和\theoremstyle
,但它们在“底层”却截然不同。
\documentclass{article}
\usepackage{amsthm}
\newtheoremstyle{break}% % see section 4.3.1 of amsthm user guide
{}{}{\itshape}{}{\bfseries}{}{\newline}{}
\theoremstyle{break}
\newtheorem{breakthm}{Theorem}
\usepackage{lipsum,enumitem}
\begin{document}
\begin{breakthm}
\lipsum[2][1-3]
\end{breakthm}
\begin{breakthm}
\leavevmode \vspace{-\baselineskip}
\begin{itemize}[nosep] % 'nosep' is optional
\item text
\item text
\item text
\end{itemize}
\end{breakthm}
\end{document}