如何在每个定理开始时执行特定的代码?

如何在每个定理开始时执行特定的代码?

我想在环境开始时注入某些代码theorem,用amsthm定义\newtheorem

就我而言,我希望添加的代码是{\itemize\item[]\null\enditemize}\smallskip,以使我的定理在定理标题后自动出现一个新行。

但是,由于此环境具有可选参数,因此似乎我无法使用钩子或修补它们。以下是两个想法:

  1. 在 内添加代码\theoremstyle。这似乎是最好的方法,但我无法让它工作。(此失败方法是下面 MWE 中演示的方法)
  2. 使用\RenewDocumentCommand\RenewDocumentEnvironment重新定义它。然而这会非常复杂,因为有许多类似定理的环境需要重新定义。

以下是 MWE,这个问题的重点是让这个风格break在定理以itemizeenumerate列表开头时也能发挥作用

\documentclass{article}

\usepackage{amsthm}
\usepackage{blindtext}

\newtheoremstyle{break}
    {}{}
    {\normalfont}{}
    {\bfseries}{}
    {0pt}
    {{\thmname{#1}\thmnumber{\nobreakspace #2}}%
      {\thmnote{\hspace{.4em}$($#3$)$}}%
      \smallskip%
      \newline%
      {\itemize\item[]\null\enditemize}\smallskip
    }

\theoremstyle{break}
\newtheorem{theorem}{Theorem}

\begin{document}

\begin{theorem}%{\itemize\item[]\null\enditemize}\smallskip
    \blindtext
\end{theorem}

\begin{theorem}%{\itemize\item[]\null\enditemize}\smallskip
    \begin{itemize}
        \item text
        \item text
        \item text
    \end{itemize}
\end{theorem}

\end{document}

预期效果是:

在此处输入图片描述

答案1

ntheorem包已经定义了break样式,因此代码非常简单。请注意,没有不必要的段落缩进。

\documentclass{article}
\usepackage{blindtext} 
\usepackage{amsmath} 
\usepackage[thmmarks, thref, amsmath]{ntheorem}
\theoremstyle{break}
\theoremheaderfont{\bfseries}
\theorembodyfont{\upshape}
\newtheorem{theorem}{Theorem}

\begin{document}

\begin{theorem}[test]
\blindtext
\end{theorem}

\end{document} 

在此处输入图片描述

编辑:如果定理主体有一个列表,它就可以正常工作(在包的帮助下enumitem

\begin{theorem}[another test]
\begin{itemize}[itemsep=0pt]
  \item Some text. 
  \item Some more text
\end{itemize}
\end{theorem}

在此处输入图片描述

相关内容