寻求“ntheorem”包中定理样式“break”代码的解释

寻求“ntheorem”包中定理样式“break”代码的解释

在包中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}{}

这个简单方法的主要问题是,当定理以itemizeenumerate列表开头时,必须编写\leavevmode\vspace{-\baselineskip},请参阅下面@Mico 的精彩回答。我的一个朋友强烈建议我将其自动化。此外,如果在文章中写下这一点,当模板发生变化时,必须手动删除那些\leavevmode\vspace{-\baselineskip},尽管可以通过将其定义为单独的宏并每次重新定义来完成,但这绝对不简单也不优雅。

我的问题是:

  1. 这个代码(我指的是 MWE 中的代码,摘自ntheorem)是如何工作的?我不熟悉这些普通的 TeX 宏,所以我不太明白这里发生了什么。
  2. 您可能注意到我添加了一个\vskip0ptafter \hbox{\strut},这令人惊讶地在定理标题后添加了一些额外的垂直空间(这正是我想要的,虽然我不知道为什么会这样)。为什么会发生这种情况?

答案1

用户指南第 4.3.1 节阿姆斯特丹这个包的标题是“定理风格突破”。我将在这里完整地引用它[突出显示]:

在此处输入图片描述 在此处输入图片描述


总而言之,在之前插入说明\leavevmode和可以解决问题。仅仅插入是不够的。\vspace{-\baselineskip}\begin{enumerate}\leavevmode

就我个人而言,我认为\leavevmode \vspace{-\baselineskip}在必要时执行比尝试改编ntheorem软件包中的某些代码更容易。ntheoremamsthm软件包可能共享类似的用户级命令,例如\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}

相关内容