使用 enumitem 时,定理环境周围缺少垂直空间

使用 enumitem 时,定理环境周围缺少垂直空间

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}

这是输出(带有latexxelatexlualatex):

使用枚举。

这是预期的输出,无需执行enumitem

没有枚举项。

itemize使用和description代替时也会出现同样的问题enumerate。如何在使用 的同时获得预期的间距enumitem

答案1

enumitem和KOMA-Script的交互问题是:

  • enumitem默认情况下会重新定义trivlist环境。并且此重新定义会调用\@listi, 。这是LaTeX 内核中\@listii的原始定义所没有的。trivlist

  • KOMA-Script 类在\@listi等中为文档(或文档段落)添加了额外的代码,以避免添加\parskip通常的和。每当大于零时,\topsep这都会设置\topsep为零。但是当调用(等)时,内部的已经大于零。因此设置为零。\parskipenumitemtrivlist \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}

这是enumitemKOMA-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

有两种可能的解决方案。


  1. 改变scrartcl类到另一个标准 LaTeX 类,例如articlebook。这将解决您的问题。代码和输出如下所示。

代码

\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}

输出

输出

  1. 在定理前放置一个\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}

输出

输出2

相关内容