![为什么 \parskip 不一致地在节标题后添加空格?](https://linux22.com/image/275010/%E4%B8%BA%E4%BB%80%E4%B9%88%20%5Cparskip%20%E4%B8%8D%E4%B8%80%E8%87%B4%E5%9C%B0%E5%9C%A8%E8%8A%82%E6%A0%87%E9%A2%98%E5%90%8E%E6%B7%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
已经存在几个问题涉及由于设置\parskip
为非零值而导致的节标题后的额外垂直空间。
在这里,我只是想了解为什么在普通段落前添加了额外的空格,但在列表前没有添加。(我认为这是一个合理的问题,而不是重复的。)
如下图所示,当该部分以一些文本开始时,会有额外的空间:
但是,当部分以 itemize 开始时,没有多余的空间:
以下是我使用的代码:
\documentclass[11pt]{article}
\parskip=\smallskipamount
\usepackage{enumitem}
\newlist{compactlist}{itemize}{3}
\setlist[compactlist]{%
label=\enskip\textbullet,
partopsep=0pt,
topsep=0pt,
parsep=0pt,
}
\usepackage{blindtext}
\begin{document}
\section{Parskip}
%% \blindtext
\begin{compactlist}
\item \blindtext
\end{compactlist}
\end{document}
答案1
\parskip
是 TeX 基元,在 LaTeX 构造中可设置为各种值,因此在文档开头直接设置它会产生明确的效果,但可能不如预期。特别是 LaTeX 列表可操纵\parskip
以控制列表前和项目之间的间距,特别是在列表前,它会根据 \partopsep
和重置为值\topsep
。
答案2
最后我通过查看 LaTeX 的源代码弄清楚了发生了什么。
当常规段落位于节标题之后时,标题与段落第一行之间的垂直间距为AFTERSKIP + \parskip
,其中AFTERSKIP
是在文档类中硬编码的跳过。可以通过重新定义节宏、等来更改\section
它\subsection
。
但是,当列表结构(包括诸如center
、flushleft
、等环境flushright
)位于节标题之后时,垂直间距会有所不同。节标题后面的第一个命令会AFTERSKIP
照常添加 ,然后\item
列表中的第一个命令会添加\parskip - \parsep
,但它会添加\addvspace
,这可能会产生令人费解的结果。
因为 实际添加的空间\addvspace
还取决于 的值\lastskip
(在本例中为AFTERSKIP
)。例如,如果\parskip - \parsep
小于或等于AFTERSKIP
,则\addvspace
不会添加任何内容。如果\parskip - \parsep
大于AFTERSKIP
,\addvspace
则将添加空间,但会删除AFTERSKIP
!总之,在节标题和列表构造之间插入的垂直空间取决于这 3 个参数 - AFTERSKIP
、\parskip
和- 以及添加垂直空间\parsep
的 规则。\addvspace