![如何在每个定理开始时执行特定的代码?](https://linux22.com/image/449017/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%AF%8F%E4%B8%AA%E5%AE%9A%E7%90%86%E5%BC%80%E5%A7%8B%E6%97%B6%E6%89%A7%E8%A1%8C%E7%89%B9%E5%AE%9A%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%9F.png)
我想在环境开始时注入某些代码theorem
,用amsthm
定义\newtheorem
。
就我而言,我希望添加的代码是
{\itemize\item[]\null\enditemize}\smallskip
,以使我的定理在定理标题后自动出现一个新行。
但是,由于此环境具有可选参数,因此似乎我无法使用钩子或修补它们。以下是两个想法:
- 在 内添加代码
\theoremstyle
。这似乎是最好的方法,但我无法让它工作。(此失败方法是下面 MWE 中演示的方法) - 使用
\RenewDocumentCommand
或\RenewDocumentEnvironment
重新定义它。然而这会非常复杂,因为有许多类似定理的环境需要重新定义。
以下是 MWE,这个问题的重点是让这个风格break
在定理以itemize
或enumerate
列表开头时也能发挥作用:
\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}