这是一个例子。我使用package为环境enumitem
设置。当列表直接放在节标题下时,将被忽略。我知道这可能与这些标题命令中的一些标题后设置的定义有关(例如,) 。与、 等的内部设置有关。但通过查看源代码,我无法完全理解这些设置。也没有与此类问题相关的 wiki 内容。至少,我没有找到一个。topsep
enumerate
topsep
\chapter
\section
everypar
\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
则可确保不会采用该分支,