枚举(列表)环境 topsep 不适用于直接位于节标题下的情况的原因

枚举(列表)环境 topsep 不适用于直接位于节标题下的情况的原因

这是一个例子。我使用package为环境enumitem设置。当列表直接放在节标题下时,将被忽略。我知道这可能与这些标题命令中的一些标题后设置的定义有关(例如,) 。与、 等的内部设置有关。但通过查看源代码,我无法完全理解这些设置。也没有与此类问题相关的 wiki 内容。至少,我没有找到一个。topsepenumeratetopsep\chapter\sectioneverypar\if@noskipsec\leavevmode

\documentclass{book}
\usepackage{enumitem}
\begin{document}
\chapter{Example}

\section{space with text}
Here is some text that is placed above the list.

\begin{enumerate}[topsep=1cm]
\item one
\item two
\end{enumerate}

Here is some text that is placed below the list.

\section{space without text}

\begin{enumerate}[topsep=1cm]
\item one
\item two
\end{enumerate}

Here is some text that is placed below the list.
\end{document}

在此处输入图片描述

有没有人可以详细解释如何定义标题后设置。有没有办法(无需手动添加\vspace\leavevmode)使topsep列表始终包含在内,无论列表放在哪里。此外,topsep无论它是否直接放在节标题下,都保持一致的长度(因为,我发现如果我在标题下的环境\leavevmode前手动添加一个,距离似乎大于我设置的值enumerate)。

答案1

这是设计使然(从 Leslie Lamport 追溯到最早的 LaTeX 版本)

\@trivlist

\def\@trivlist{%
  \if@noskipsec \leavevmode \fi
  \@topsepadd \topsep
  \ifvmode
    \advance\@topsepadd \partopsep
  \else
    \unskip \par
  \fi

因此,列表顶部的 sep 仅在 vmode 中添加,但如果您刚好在标题之后,\leavevmode则可确保不会采用该分支,

相关内容