![使用 enumitem 时,定理环境周围缺少垂直空间](https://linux22.com/image/386370/%E4%BD%BF%E7%94%A8%20enumitem%20%E6%97%B6%EF%BC%8C%E5%AE%9A%E7%90%86%E7%8E%AF%E5%A2%83%E5%91%A8%E5%9B%B4%E7%BC%BA%E5%B0%91%E5%9E%82%E7%9B%B4%E7%A9%BA%E9%97%B4.png)
amsthm
当在环境内部使用定理环境(通过定义)时enumerate
,定理环境周围的一些垂直空间似乎缺失了。
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsthm}
\newtheorem{test}{Test}
\usepackage{enumitem}
\begin{document}
\begin{enumerate}
\item
Here is text.
\begin{test}
Here is a proposition.
\end{test}
Here is more text.
\end{enumerate}
\end{document}
这是输出(带有latex
、xelatex
和lualatex
):
这是预期的输出,无需执行enumitem
:
itemize
使用和description
代替时也会出现同样的问题enumerate
。如何在使用 的同时获得预期的间距enumitem
?
答案1
enumitem
和KOMA-Script的交互问题是:
enumitem
默认情况下会重新定义trivlist
环境。并且此重新定义会调用\@listi
, 。这是LaTeX 内核中\@listii
的原始定义所没有的。trivlist
KOMA-Script 类在
\@listi
等中为文档(或文档段落)添加了额外的代码,以避免添加\parskip
通常的和。每当大于零时,\topsep
这都会设置\topsep
为零。但是当调用(等)时,内部的已经大于零。因此设置为零。\parskip
enumitem
trivlist
\parskip
\@listi
\topsep
但是enumitem
也提供了一个ignoredisplayed
解决此类问题的选项:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsthm}
\newtheorem{test}{Test}
\usepackage[ignoredisplayed]{enumitem}
\begin{document}
\begin{enumerate}
\item
Here is text.
\begin{test}
Here is a proposition.
\end{test}
Here is more text.
\end{enumerate}
\end{document}
或者您可以设置trivlist
明确设置\topsep
:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsthm}
\newtheorem{test}{Test}
\usepackage{enumitem}
\setlist[trivlist]{topsep=8pt plus 4pt minus 4pt}
\begin{document}
\begin{enumerate}
\item
Here is text.
\begin{test}
Here is a proposition.
\end{test}
Here is more text.
\end{enumerate}
\end{document}
第三个建议是修补enumitem
对的重新定义,以trivlist
不执行 KOMA-Script 的额外列表代码:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsthm}
\newtheorem{test}{Test}
\usepackage{enumitem}
\usepackage{xpatch}
\makeatletter
% Hack to not use KOMA-Script's extra list code inside enumitem's redefinition of trivlist
\xpatchcmd\trivlist{%
\csname @list\romannumeral\the\@listdepth\endcsname
}{%
\let\orig@list@extra\@list@extra
\let\@list@extra\relax
\csname @list\romannumeral\the\@listdepth\endcsname
\let\@list@extra\orig@list@extra
}{}{}
\makeatother
\begin{document}
\begin{enumerate}
\item
Here is text.
\begin{test}
Here is a proposition.
\end{test}
Here is more text.
\end{enumerate}
\end{document}
这是enumitem
KOMA-Script 可以采取的一种解决方法,可以避免此上下文中出现的问题。但是,使用标准类和包时也会发生此问题parskip
,例如:
\documentclass[a4paper,10pt]{article}
\usepackage{parskip}
\usepackage{amsthm}
\newtheorem{test}{Test}
\usepackage{enumitem}
\begin{document}
\begin{enumerate}
\item
Here is text.
\begin{test}
Here is a proposition.
\end{test}
Here is more text.
\end{enumerate}
\end{document}
因此它与 KOMA-Script 无关,也不受其限制。此处上述第二个建议也有效:
\documentclass[a4paper,10pt]{article}
\usepackage{parskip}
\usepackage{amsthm}
\newtheorem{test}{Test}
\usepackage{enumitem}
\setlist[trivlist]{topsep=8pt plus 4pt minus 4pt}
\begin{document}
\begin{enumerate}
\item
Here is text.
\begin{test}
Here is a proposition.
\end{test}
Here is more text.
\end{enumerate}
\end{document}
但其他人则不会。
答案2
显然问题出在enumitem
和之间的相互作用上scrartcl
。
您可以通过复制普通样式的定义来解决此问题,但对上下分离使用不同的参数。普通样式的代码位于https://tex.stackexchange.com/a/17555/4427
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{enumitem}
\usepackage{amsthm}
\newlength{\defaulttopsep}
\setlength{\defaulttopsep}{\topsep}
\newtheoremstyle{eiplain}
{\defaulttopsep} % ABOVESPACE
{\defaulttopsep} % BELOWSPACE
{\itshape} % BODYFONT
{0pt} % INDENT (empty value is the same as 0pt)
{\bfseries} % HEADFONT
{.} % HEADPUNCT
{5pt plus 1pt minus 1pt} % HEADSPACE
{} % CUSTOM-HEAD-SPEC
\theoremstyle{eiplain}
\newtheorem{test}{Test}
\begin{document}
\begin{enumerate}
\item
Here is text.
\begin{test}
Here is a proposition.
\end{test}
Here is more text.
\end{enumerate}
\end{document}
答案3
有两种可能的解决方案。
代码
\documentclass[a4paper, 10pt]{article}%or book, report, etc.
%
\usepackage{enumitem}
\usepackage{lipsum}
\usepackage{amsthm}
\newtheorem{test}{Test}
%
\begin{document}
\begin{enumerate}
\item Here is text.%
\begin{test}
\lipsum[1]
\end{test}
\item Here is more text.
\end{enumerate}
\begin{test}
\lipsum[1]
\end{test}
\end{document}
输出
- 在定理前放置一个
\bigskip
右键,以强制右侧垂直空间。
代码
\documentclass[a4paper, 10pt]{scrartcl}
%
\usepackage{enumitem}
\usepackage{lipsum}
\usepackage{amsthm}
\newtheorem{test}{Test}
%
\begin{document}
\begin{enumerate}
\item Here is text.\bigskip%place here the skip, can be \smallskip, \medskip, \parskip, or a custom \vskip4cm
\begin{test}
\lipsum[1]
\end{test}
\item Here is more text.
\end{enumerate}
\begin{test}
\lipsum[1]
\end{test}
\end{document}
输出