在 LaTeX 中制造段落的是空行。但空行并不只是「类似于分段」:TeX 的输入处理器读到空行时,会在那里插入 \par 这个命令本身。所以空行与 \par 不是相似,而是同一件事。试着写 \let\par\relax,再留一个空行,段落就完全不再改变——既然空行抛出的命令被废掉了,这理所当然。抓住这一点,后面的一切都顺理成章:为什么不能用 \\ 分段,\parindent 与 \parskip 各司何职,以及为什么唯独标题之后的第一段不缩进。
空行就是 \par 这个命令
源码里的换行本身,在输出中只相当于一个空格。分成三行写的句子仍会排成连续的一段,究竟在哪里断行由 TeX 决定。但只要输入处理器遇到只含空白的行,它送出的就不是空格,而是 \par。由此得出两个结论。其一:空行放两行还是五行,结果毫无差别。第二个 \par 到达时,TeX 已经处于竖直模式,而竖直模式中的 \par 什么也不做——靠叠加空行来撑开间距,一毫米也撑不出来。其二:空行与 \par 可以互换。
These three lines are broken
in the source, but they come out
as a single paragraph.
The blank line above started a new one.
Extra blank lines add nothing.
Still just one paragraph break.真正需要写出 \par 的场合,是不能使用空行的地方。自定义命令的定义内部和参数内部通常禁止空行:在 \section{...} 的参数里放一个空行,编译就会以 ! Paragraph ended before \@sect was complete. 中断。数学模式同样不允许空行,会给出 ! Missing $ inserted.。反过来,在普通正文里排一串 \par 只会让源码更难读,所以写稿时以空行为准。
为什么 \\ 不会结束一个段落
\\ 只是说「在这里结束这一行」,它从未说要结束段落。其内部做的是「用 \hfil 填满行尾,然后在此强制断行」,其中根本没有 \par。于是段落照旧延续。实测差别一目了然:在 article(10pt)中,新段落的第一行从左边界向内 15pt 处开始,而 \\ 之后的那一行正好从左边界开始——没有缩进。段间空白 \parskip 也不会插入。那种「看起来是换行了,但不像段落」的半成品感,来源正在于此。
日志里还有更直白的证据。把 \\ 放在一段最后一行的末尾,TeX 会警告 Underfull \hbox (badness 10000) in paragraph at lines 3--4。发生的事情是:\\ 刚下令断行,段落随即结束,于是留下了一行空无一物的行。调高 \showboxdepth 往里看,那个盒子是 \hbox(0.0+0.0)x345.0——高度为零,宽度却占满整个版心。相反,在还没有可断之行的位置(例如段落开头)使用 \\,会得到 ! LaTeX Error: There's no line here to end.。两种症状从相反方向说明同一件事:\\ 是处理行的工具,不是处理段落的工具。
话虽如此,\\ 本身仍是好用的工具。加上方括号里的长度,\\[2ex] 会在该行之后补一段竖直空白(也允许负值),这是在表格和陈列公式中拉开行距的常规手法。\\* 会禁止在该断行处分页,把两行留在同一页。在段落模式中,\newline 的作用与 \\ 完全相同;只有 \linebreak 性格不同,它在断行的同时还会拉伸行内空白,使该行两端对齐到右边界——词距变得稀松正是这个缘故。\linebreak[n](n 为 0 到 4)用来指定强度,4 表示强制,1 只是「方便的话」。在表格中还要记住:\\ 结束整行,而 \newline 只在单元格内部换行。
% wrong: the second block is still the same paragraph
First thought about the topic.\\
Second thought about the topic.
% right: a blank line ends the paragraph
First thought about the topic.
Second thought about the topic.
% \\ is for lines that belong together
\begin{tabular}{ll}
Ada Lovelace & 1815 \\[2pt]
Alan Turing & 1912 \\
\end{tabular}\parindent 与 \parskip 的默认值
决定段落外观的长度只有两个。\parindent 是首行缩进的宽度,\parskip 是段落之间插入的竖直空白。在标准类的单栏排版中,正文 10pt 时 \parindent 为 15pt,11pt 时为 17pt,12pt 时为 1.5em(约 17.6pt),双栏时为 1em。而 \parskip 的默认值是 0pt plus 1pt。它不是零,而是一个橡皮长度:零,但最多可以伸长 1pt;这一点点余量累积起来,正好给了 TeX 调平页面下缘的空间。换句话说,标准 LaTeX 采用的是书籍排版的做法——只用缩进标示段落边界,段间空白实际为零。
要只切换某一段的缩进,使用 \noindent 和 \indent。把 \noindent 放在段首会取消该段的缩进,\indent 则强制缩进(内部只是放了一个宽度为 \parindent 的空盒子)。二者写在段落中途都无效:是否缩进在第一行开始排版的那一瞬间就已定案,事后无法撤回。最常见的用法,是在被引文或图表打断的正文重新接续时加一个 \noindent。
为什么只有标题后的第一段不缩进
这不是缺陷,而是有意为之的排版惯例。缩进本质上是一个分隔信号——「新的段落从这里开始」——只有在它前面还有另一个段落时才有意义。紧跟标题之后并不存在需要分隔的前一段,缩进就成了无所指的缩进;省略它是传统的约定。实测也印证了这一点:只有 \section 之后的那一段从左边界齐平开始,从再下一段起 15pt 的缩进又回来了。
实现方式才是有趣的地方。LaTeX 并不是「不排缩进」。TeX 照常在段首放下一个宽度为 \parindent 的空盒子,随后 LaTeX 在 \everypar 里执行 {\setbox\z@\lastbox},把刚放下的那个盒子又取了回去。哪些标题会这么做,取决于标题命令中「标题前空白」参数的符号:\section 定义里 -3.5ex 的负号,内核读到就理解为「不要缩进随后的段落」。而把缩进恢复回来的 indentfirst 宏包,实质上只有一行——\let\@afterindentfalse\@afterindenttrue。让「假」成为「真」的别名,于是那个关闭缩进的开关永远也按不下去。
\usepackage{indentfirst} % indent the first paragraph after a heading too
\setlength{\parindent}{2em} % a wider first-line indent
\section{A heading}
With indentfirst loaded, this paragraph is indented like the others.改用块式段落:为什么要用 parskip 宏包
规格书、内部文件以及来自 Web 的资料,常常偏好「块式段落」:不缩进首行,改用竖直空白分隔段落。最朴素的做法是在导言区把 \parindent 设为 0,再给 \parskip 一个间距。可这一改动牵连的范围比想象中大得多。目录的各行、列表项之间的间隔、图表周围——LaTeX 在很多地方都把 \parskip 当作基础间距来沿用,于是它们会一起被撑开,而不只是正文段落。
承接这件苦差事的是 parskip 宏包,只需 \usepackage{parskip} 一行。TeX Live 2024 附带的版本(v2)把 \parindent 设为 0pt、\parskip 设为 .5\baselineskip plus 2pt,随后修补标题前后间距、目录和列表的相关定义,让它们减去多出来的那份 \parskip,回到原本的设计值。靠手工把这些逐一追平并不现实。保留 plus 2pt 的伸缩也是有意的:它给 TeX 留出寻找更好分页位置的余地。若想用块式段落又保留缩进,可写 \usepackage[indent]{parskip};想自定间距,则写 \usepackage[skip=10pt]{parskip}。
% the naive version: also stretches the TOC, lists and float spacing
\setlength{\parindent}{0pt}
\setlength{\parskip}{\baselineskip}
% the maintained version: same look, without the collateral damage
\usepackage{parskip}
% \usepackage[indent]{parskip} % keep the first-line indent
% \usepackage[skip=10pt]{parskip} % choose the gap yourself分段、分页与不可断空格的区别
换段和换页是两回事。\newpage 会当场结束本页并转入下一页,但不会分段。\clearpage 更进一步,会先把所有等待中的浮动体(图和表)输出,再翻页。如果本意只是想换一段却用了它们,随之而来的就是不必要的分页和留白过多的页脚。反过来也有防止断开的工具。波浪号 ~ 是不会换行的空格,用在两侧必须留在同一行的地方,如 Fig.~3、Dr.~Smith。\, 是细空格,常用于数字与单位之间。二者都不是断行或分段的命令,只是在指定空白的性质;把握这一点,这四个命令就不会混淆。
写稿时如何对待段落
既然源码换行不会改变输出,那这份自由就可以全部投入到便于编辑上。实务中常见的约定是「一句一行」,或在从句边界处折行。行越短,版本管理的差异越好读;合著者审阅时也能一眼看出改了哪一句。空行则只留给段落真正改变的地方。一旦开始拿源码换行代替纸面上的断行,只要换了字体或页边距,整套安排就会崩塌。
临近截稿时,人们容易只凭观感增加空行或 \vspace。但在 LaTeX 里,段落就是文档结构本身。一个段落是否装了两个主张?图表的说明究竟属于它前面还是后面的段落?标题之后是否需要一小段导语?这些判断应当排在前面。在此之上守住规则——空行标记段落边界,\\ 只用于同一段内部的视觉换行——那么无论校对多少轮,结构都不会散架。
- 正文段落 — 主张改变时才空一行;绝不为了外观而加空行。
- 标题块、地址、诗行 — 只有当一个语义整体需要占据多行输出时才用
\\。 - 不满意段间距 — 用
parskip宏包在全文层面统一决定,而不是到处放\vspace。 - 不满意缩进 — 在导言区一次性设定
\parindent;若希望标题后的段落也缩进,就加载indentfirst。 - 不满意分页 — 使用分页控制命令或调整浮动体位置,而不是动段落命令。