> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/latex/zh-cn/ge-shi-hua/04-articles-how-to-change-paragraph-spacing-in-latex.md).

# 段落格式

## 引言

本文探讨了对段落间距各个方面进行更改的两种方法：

* 最佳实践，也是推荐的方法，是使用诸如 [`setspace`](https://ctan.org/pkg/setspace) 和 [`parskip`](https://ctan.org/pkg/parskip) 它们提供选项和用户级命令来更改 LaTeX 文档中的间距；
* 使用底层 TeX/LaTeX *参数命令* 来修改段落间距。直接使用参数命令可能会绕过精心设计的 LaTeX 宏包所提供的检查或控制，进而在 LaTeX 文档的其他地方造成意想不到的后果/副作用，因此请谨慎使用……

### 跳转到感兴趣的部分

寻求快速解决方案的读者：

* 请转到该节 [*使用 LaTeX 宏包：setspace 和 parskip*](#using-latex-packages-setspace-and-parskip)

对底层命令感兴趣的读者：

* 请转到这些部分 [*TeX/LaTeX 参数命令*](#using-texlatex-parameter-commands) 和 [*基础知识：参数命令与示例*](#the-fundamentals-parameter-commands-and-examples)

对行距计算和段落结构细节感兴趣的读者：

* 请转到该节 [*段落结构和行距计算*](#paragraph-structure-and-line-space-calculations)

## 使用 LaTeX 宏包：setspace 和 parskip

* [parskip 宏包](#the-parskip-package)
* [setspace 宏包](#the-setspace-package)

### parskip 宏包

该 [`parskip` 宏包](https://ctan.org/pkg/parskip?lang=en) 可帮助你安全地更改文档中段落之间插入的空白。其设计旨在确保目录、列表环境和展示型标题等文档结构不会受到该参数非零值的不利影响，该参数用于设置 TeX/LaTeX 在段落之间插入的空白量。 [`\parskip` 命令](#parskip-tex-primitive)，它用于设置 TeX/LaTeX 在段落之间插入的空白量。

该 `parskip` 该宏包不提供任何用户级命令；相反，它使用宏包选项来配置其行为。该 [`parskip` 文档](https://mirror.ox.ac.uk/sites/ctan.org/macros/latex/contrib/parskip/parskip.pdf) 很简短，只有三页，不过下面是宏包选项的简要总结：

* **`skip`**：指定 `\parskip`，即段落之间的垂直间距；
* **`tocskip`**：指定一个非零的 `\parskip` 值，用于 `\tableofcontents` 以及类似的列表；
* **`indent`**：设置 `\parindent`，即段落缩进；
* **`parfill`**：调整 `\parfillskip`，即添加到段落最后一行末尾的粘连空间。

默认情况下， `parskip` 宏包将 `\parindent` 更改为 `0pt` 并提供一个非零的 `\parskip` 值为 `.5[\baselineskip](#baselineskip-tex-primitive) plus 2pt`.

#### parskip 宏包示例

以下示例演示了该 `parskip` 宏包的一些用法。请选择“Open in Overleaf”链接以在 Overleaf 中打开并编译示例。

**parskip 宏包的最小示例**

以下最小示例加载 `parskip` 宏包，并排版由 [`blindtext` 宏包](https://ctan.org/pkg/blindtext?lang=en)创建的两个段落。该示例还排版了 `\baselineskip`, `\parskip` 和 `\parindent`的默认值。两个段落之间的空白量由 `\parskip`:

```latex
\documentclass{article}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=14cm,textwidth=12cm]{geometry}
% 加载 blindtext 宏包用于占位文本
\usepackage{blindtext}
% 不带选项加载 parskip 宏包
\usepackage{parskip}
\begin{document}

\blindtext[1]\par %Use \par to force a new paragraph
\blindtext[1]

\verb|\parindent| 的值是 \texttt{\the\parindent}。其他值如下：

\begin{itemize}
\item \verb|\baselineskip| 的值是 \texttt{\the\baselineskip}
\item \verb|\parskip| 的值是 \texttt{\the\parskip}
\end{itemize}
\end{document}
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+parskip+package\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+parskip+package+without+options%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cblindtext%5B1%5D%5Cpar+%25Use+%5Cpar+to+force+a+new+paragraph%0A%5Cblindtext%5B1%5D%0A%0AThe+value+of+%5Cverb%7C%5Cparindent%7C+is+%5Ctexttt%7B%5Cthe%5Cparindent%7D.+Here+are+the+other+values%3A%0A%0A%5Cbegin%7Bitemize%7D%0A%5Citem+The+value+of+%5Cverb%7C%5Cbaselineskip%7C+is+%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D%0A%5Citem+The+value+of+%5Cverb%7C%5Cparskip%7C+is+%5Ctexttt%7B%5Cthe%5Cparskip%7D%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![parskip LaTeX 宏包的示例用法](/files/94b6ac01d83f62bbe46b4783db0a2eb5eaf794cf)

注意 `\parskip` 粘连空间通常包含可伸缩的 [粘连组件](#a-few-notes-on-glue) 因为这有助于 LaTeX 将内容排入页面并产生最佳（最优）的分页。

**使用 parskip 宏包选项**

以下示例加载并配置 `parskip` 宏包，并使用 `skip` 和 `indent` 选项。它还通过 [`blindtext` 宏包](https://ctan.org/pkg/blindtext?lang=en)，并排版了 `\baselineskip`, `\parskip` 和 `\parindent`.

```latex
\documentclass{article}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% 加载 blindtext 宏包用于占位文本
\usepackage{blindtext}
% 使用 skip 和 indent 选项加载 parskip 宏包
\usepackage[skip=10pt plus1pt, indent=40pt]{parskip}
\begin{document}

\blindtext[1]\par % Use \par to force a new paragraph
\blindtext[1]

\verb|\parindent| 的值是通过 \texttt{indent} 选项设置的，因此现在是 \texttt{\the\parindent}。其他值如下：

\begin{itemize}
\item \verb|\baselineskip| 是 \texttt{\the\baselineskip}
\item \verb|\parskip| 是通过 \texttt{skip} 选项设置的，因此其值为 \texttt{\the\parskip}
\end{itemize}
\end{document}
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+parskip+package\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+parskip+package+with+skip+and+indent+options%0A%5Cusepackage%5Bskip%3D10pt+plus1pt%2C+indent%3D40pt%5D%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cblindtext%5B1%5D%5Cpar+%25+Use+%5Cpar+to+force+a+new+paragraph%0A%5Cblindtext%5B1%5D%0A%0AThe+value+of+%5Cverb%7C%5Cparindent%7C+was+set+via+the+%5Ctexttt%7Bindent%7D+option%2C+so+it+is+now+%5Ctexttt%7B%5Cthe%5Cparindent%7D.+The+other+values+are%3A%0A%0A%5Cbegin%7Bitemize%7D%0A%5Citem+%5Cverb%7C%5Cbaselineskip%7C+is+%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D%0A%5Citem+%5Cverb%7C%5Cparskip%7C+was+set+via+the+%5Ctexttt%7Bskip%7D+option%2C+so+its+value+is+%5Ctexttt%7B%5Cthe%5Cparskip%7D%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![parskip LaTeX 宏包的第二个示例用法](/files/15c59f785eb2e0357336d412dc39aedc708a6f35)

### setspace 宏包

该 [`setspace` 宏包](https://ctan.org/pkg/setspace?lang=en) 提供用于更改文档正文行间距的命令和环境。以下是其提供的主要命令和环境的简要总结： `setspace`:

* 命令 **`\singlespacing`**, **`\onehalfspacing`** 和 **`\doublespacing`** 可用于文档导言区，或在文档正文中用于更改部分或全部文档的间距；
* 该 **`\setstretch{*baselinestretch amount*}`** 命令通过更改 [`\baselinestretch`](#demonstrating-baselinestretch)）来设置自定义间距——它也可用于文档导言区；
* 环境 **`singlespace`**, **`singlespace*`** **`onehalfspace`** 和 **`doublespace`** 允许针对文档正文的选定部分更改行距；
* 该 **`\SetSinglespace{*value*}`** 命令使用 `*value*` 来调整单倍行距，以适应使用字体排版的文本的行距，这些字体在给定字号下其字符形状（“字形”）相对较小或较大。请参见 [*关于字体和字号的简要说明*](#brief-notes-on-fonts-and-point-size) ，其中有一幅插图展示了相同字号下字体字形大小的变化；
* 该 **`spacing`** 环境提供自定义间距，并且只需要一个参数： [`\baselinestretch` 值](#demonstrating-baselinestretch) ，用于设置要使用的间距；例如：

```latex
\begin{spacing}{2.5}
...
...
\end{spacing}
```

#### setspace 宏包示例

以下示例演示了该 `setspace` 宏包：请点击“Open in Overleaf”链接以在 Overleaf 中打开并编译示例。

**在文档导言区使用 \doublespacing**

```latex
\documentclass{article}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% 加载 blindtext 宏包用于占位文本
\usepackage{blindtext}
% 加载 setspace 宏包
\usepackage{setspace}
% 在导言区使用 \doublespacing
% 将文本改为双倍行距
\doublespacing
\begin{document}
\blindtext[1]
\end{document}
```

&#x20;[打开此 `setspace` Overleaf 中的示例。](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+doublespacing+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+setspace+package%0A%5Cusepackage%7Bsetspace%7D%0A%25+Using+%5Cdoublespacing+in+the+preamble+%0A%25+changes+text+to+double+line+spacing%0A%5Cdoublespacing%0A%5Cbegin%7Bdocument%7D%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![setspace \doublespacing 命令示例](/files/6a924bffa525a1fb4d4fad8909f183a0e6d1e38c)

**使用 spacing 环境**

由于以下代码会排版出 3 页内容，最好通过下面提供的“Open in Overleaf”链接在 Overleaf 中查看输出。

```latex
\documentclass{article}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% 加载 blindtext 宏包用于占位文本
\usepackage{blindtext}
% 加载 setspace 宏包
\usepackage{setspace}
% 在导言区使用 \doublespacing
% 将文本改为双倍行距
\doublespacing
\begin{document}
\blindtext[1]

现在，通过将 \verb|\baselinestretch| 的值设为 3 来应用更大的（自定义）间距：

\begin{verbatim}
\begin{spacing}{3}
\blindtext[1]
\end{spacing}
\end{verbatim}

\begin{spacing}{2.5}
\blindtext[1]
\end{spacing}
现在，恢复为 \verb|\singlespacing|\singlespacing\blindtext[1]
\end{document}
```

&#x20;[打开此 `setspace` Overleaf 中的示例。](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+various+setspace+commands\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+setspace+package%0A%5Cusepackage%7Bsetspace%7D%0A%25+Using+%5Cdoublespacing+in+the+preamble+%0A%25+changes+text+to+double+line+spacing%0A%5Cdoublespacing%0A%5Cbegin%7Bdocument%7D%0A%5Cblindtext%5B1%5D%0A%0ANow%2C+apply+a+larger+%28custom%29+spacing+by+applying+a+%5Cverb%7C%5Cbaselinestretch%7C+value+of+3%3A%0A%0A%5Cbegin%7Bverbatim%7D%0A%5Cbegin%7Bspacing%7D%7B3%7D%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bspacing%7D%0A%5Cend%7Bverbatim%7D%0A%0A%5Cbegin%7Bspacing%7D%7B2.5%7D%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bspacing%7D%0ANow%2C+revert+to+%5Cverb%7C%5Csinglespacing%7C%5Csinglespacing%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

**使用 singlespace\* 环境**

正如文章中所指出的 [*关于行距的简短说明*](https://texblog.org/2011/09/30/quick-note-on-line-spacing/)， `setspace` 宏包提供带星号（`singlespace*`）和非星号版本的 `singlespace` 环境。宏包代码中的注释说明 `setspace` 宏包代码指出 `singlespace*` 该环境旨在“……在 itemize 和 quote 环境周围提供更佳的垂直间距”。

以下示例使用两个 `minipage` 环境中的项目列表，并排放置，以演示由 `singlespace` 和 `singlespace*` 环境填充。

```latex
\doublespacing
\blindtext[1]

\begin{minipage}{.4\textwidth}
\begin{singlespace}
这里是一个项目符号列表\par（\texttt{singlespace} 环境）。
\begin{itemize}
\item One
\item Two
\item Three
\end{itemize}
\end{singlespace}%
列表结束了。
\end{minipage}\kern10pt%
\begin{minipage}{.4\textwidth}
\begin{singlespace*}
这里是一个项目符号列表\par（\texttt{singlespace*} 环境）。
\begin{itemize}
\item One
\item Two
\item Three
\end{itemize}
\end{singlespace*}
列表结束了。
\end{minipage}
```

&#x20;[打开此 `setspace` Overleaf 中的示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+starred+singlespace+environment\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cusepackage%7Bblindtext%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cdoublespacing+%0A%5Cblindtext%5B1%5D%0A%0A%5Cbegin%7Bminipage%7D%7B.4%5Ctextwidth%7D%0A%5Cbegin%7Bsinglespace%7D%0AHere+is+a+bulleted+list%5Cpar+%28%5Ctexttt%7Bsinglespace%7D+environment%29.%0A%5Cbegin%7Bitemize%7D%0A%5Citem+One%0A%5Citem+Two%0A%5Citem+Three%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bsinglespace%7D%25%0AThe+list+has+ended.%0A%5Cend%7Bminipage%7D%5Ckern10pt%25%0A%5Cbegin%7Bminipage%7D%7B.4%5Ctextwidth%7D%0A%5Cbegin%7Bsinglespace%2A%7D%0AHere+is+a+bulleted+list%5Cpar+%28%5Ctexttt%7Bsinglespace%2A%7D+environment%29.%0A%5Cbegin%7Bitemize%7D%0A%5Citem+One%0A%5Citem+Two%0A%5Citem+Three%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bsinglespace%2A%7D%0AThe+list+has+ended.%0A%5Cend%7Bminipage%7D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![LaTeX singlespace\* 环境示例](/files/683382c6942c552c3999d4cce15182b6f56bf385)

**使用 \setstretch 命令**

`\setstretch{*value*}` 将以下项的值设为 `\baselinestretch` 更改为 *值* 并触发 *立即的* 更改 `\baselineslip` 所导致的 `\baselinestretch`。以下示例使用 `\setstretch{1.618}`——1.618 这个奇怪的数值 [稍后在文章中解释](#understanding-and-calculating-values-for-baselinestretch)...

```latex
% 1.618 这个奇怪数值稍后在文章中解释。
\setstretch{1.618}
我们写 \verb|\setstretch{1.618}| 是为了立即更改行距。如果写成 \verb|\renewcommand{\baselinestretch}{1.618}|，则在使用诸如 \verb|\selectfont| 之类的改字体命令之前，行距不会被修改。

\blindtext[1]
```

&#x20;[打开此 `setspace` Overleaf 中的示例。](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+setstretch+command\&snip=%5Cdocumentclass%5B11pt%5D%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+setspace+package%0A%5Cusepackage%7Bsetspace%7D%0A%5Cbegin%7Bdocument%7D%0A%25+The+strange+figure+of+1.618+is+explained+later+in+the+article.%0A%5Csetstretch%7B1.618%7D%0AWe+write+%5Cverb%7C%5Csetstretch%7B1.618%7D%7C+to+cause+an+immediate+change+to+the+line+spacing.+If+we+wrote+%5Cverb%7C%5Crenewcommand%7B%5Cbaselinestretch%7D%7B1.618%7D%7C+the+line+spacing+would+not+be+modified+until+a+font-changing+command%2C+such+as+%5Cverb%7C%5Cselectfont%7C%2C+is+used.%0A%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![\setstretch 命令示例](/files/3e477318f23089088219afa31b0c2b9f1e342b5b)

**使用 \SetSinglespace 命令**

以下项目通过 LuaLaTeX 编译，并使用 `fontspec` 宏包来访问 TeX Gyre Pagella 字体。它比较了用 TeX Gyre Pagella 排版的两个段落：第一段使用默认的单倍行距，第二段由于应用 `\SetSinglespace{1.1}`。有些人可能更喜欢第二个稍微“宽松”一些的段落，认为它提高了阅读舒适度，但这当然属于个人偏好。

```latex
\section*{Computer Modern default single spacing}
一些普通文本。 \blindtext[1]
\setmainfont{TeX Gyre Pagella}
\section*{TeX Gyre Pagella default single line spacing}
这里是一些普通文本。 \blindtext[1]
\section*{TeX Gyre Pagella adjusted single line spacing}
注意：在写入后，我们需要执行 \verb|\singlespacing|
\verb|\SetSinglespace{1.1}|\SetSinglespace{1.1}\singlespacing
\begin{singlespace*}
这里是一些普通文本。 \blindtext[1]
\end{singlespace*}
```

&#x20;[打开此 `setspace` Overleaf 中的示例。](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Example+use+of+the+SetSinglespace+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cusepackage%7Bblindtext%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csection%2A%7BComputer+Modern+default+single+spacing%7D%0ASome+regular+text.+%5Cblindtext%5B1%5D%0A%5Csetmainfont%7BTeX+Gyre+Pagella%7D%0A%5Csection%2A%7BTeX+Gyre+Pagella+default+single+line+spacing%7D%0AHere+is+some+regular+text.+%5Cblindtext%5B1%5D%0A%5Csection%2A%7BTeX+Gyre+Pagella+adjusted+single+line+spacing%7D%0ANote%3A+we+need+to+issue+%5Cverb%7C%5Csinglespacing%7C+after+writing++%0A%5Cverb%7C%5CSetSinglespace%7B1.1%7D%7C%5CSetSinglespace%7B1.1%7D%5Csinglespacing%0A%5Cbegin%7Bsinglespace%2A%7D+%0AHere+is+some+regular+text.+%5Cblindtext%5B1%5D%0A%5Cend%7Bsinglespace%2A%7D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![LaTeX \SetSinglespace 命令演示](/files/9f62863d261d8207d7575a3b62d87cecf4d1f33e)

在下一节中，我们将回顾这些命令 `\baselinestretch` 和 `\linespread`.

#### 理解 \baselinestretch 和 \linespread

LaTeX 在处理行距和字体变化（字号、字体族、字体编码等）时的设计中，使用了你可能会遇到的两个命令：

* **`\baselinestretch`**：该命令存储一个缩放因子，用于乘以（缩放）当前的 [`\baselineskip`](#baselineskip-tex-primitive)。这种缩放通常在 *下一次* 使用字体选择命令时应用——例如 `\selectfont`。要更改由 `\baselinestretch` ，你应该写 `\renewcommand{\baselinestretch}{*scale*}`
  * **注意**：如果你写 `\renewcommand{\baselinestretch}{*scale*}` 在文档正文中，新的 `\baselinestretch` [不会立即生效](https://tex.stackexchange.com/questions/241120/why-does-changing-baselinestretch-not-change-line-spacing)：新的 `*scale*` 因子会被存储以供将来使用。要立即使用/应用新的`*scale*` 值，请写 `\selectfont` ，如下面的 [代码片段所示](#demonstrating-baselinestretch).
* **`\linespread{*scale*}`**：可用于更改 [`\baselineskip`](#baselineskip-tex-primitive) 而不影响当前字号。该命令设置 `\baselinestretch` 更改为 `*scale*` 随后会改变 `\baselineskip` 更改为 `*scale* × [\baselineskip](#baselineskip-tex-primitive)`。不过，除非 `\linespread` 命令在文档导言区使用，否则这种缩放也不会立即生效。如果 `\linespread` 在文档正文中使用，则会在下一个字号/字体选择命令执行后生效。

基于以上内容，可以使用以下任一方式：

* `\renewcommand{\baselinestretch}{*scale*}\selectfont` 或者，
* `\linespread{*scale*}\selectfont`

都可用于更改行距，并且在字体大小变化时两者都有效，如下面的示例所示。那么你应该使用哪一个呢？请参阅 [tex.stackexchange 上的这段简短讨论](https://tex.stackexchange.com/a/241121).

**演示 \linespread**

下面的示例使用 `\linespread{2.5}` 在文档导言区使用，它可以更改行距而无需额外的字体选择命令：

```latex
\documentclass{article}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% 加载 blindtext 宏包用于占位文本
\usepackage{blindtext}
% 在导言区使用 \linespread 会更改
% 行距，而无需额外的
% 字体选择命令，例如 \selectfont
\linespread{2.5}
\begin{document}
\blindtext[1] % The lines are affected by \linespread{2.5}
\end{document}
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+linestretch+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Using+%5Clinespread+in+the+preamble+changes+%0A%25+line+spacing+without+requiring+additional%0A%25+font-selection+commands%2C+such+as+%5Cselectfont%0A%5Clinespread%7B2.5%7D+%0A%5Cbegin%7Bdocument%7D%0A%5Cblindtext%5B1%5D+%25+The+lines+are+affected+by+%5Clinespread%7B2.5%7D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![使用 linespread 命令](/files/d7af87c60173bd5f63567c0194aef114464bbd0e)

使用 `\linespread{2.5}` 在文档正文中（在 `\begin{document}`) *之后）将会* 需要字体选择命令来触发行距更改。请在 Overleaf 中打开以下代码，并将输出与前面的示例进行比较：

```latex
由于下面的 \verb|\linespread| 命令是在文档正文中使用的，因此需要字体选择命令来更改行距。取消注释 \verb|\selectfont| 以查看差异：

\linespread{2.5}%\selectfont

% 如果没有 \selectfont，下面段落的行
% 不受影响 受 \linespread{2.5} 影响：
\blindtext[1]
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Second+example+using+the+linestretch+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%5Cbegin%7Bdocument%7D%0ABecause+the+following+%5Cverb%7C%5Clinespread%7C+command+is+used+in+the+document+body%2C+a+font-selection+command+is+required+to+change+the+line+spacing.+Un-comment+%5Cverb%7C%5Cselectfont%7C+to+see+the+difference%3A%0A%0A%5Clinespread%7B2.5%7D%25%5Cselectfont%0A+%0A%25+Without+%5Cselectfont+the+following+paragraph+lines+are+%0A%25+unaffected+affected+by+%5Clinespread%7B2.5%7D%3A+%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![在文档中使用 LaTeX \linespread 命令](/files/4493e3246db0091f9d59ccfa6aaa59e6ad9501a3)

**演示 \baselinestretch**

以下示例演示 `\baselinestretch` 和 `\selectfont` 以展示其在 [`\baselineskip`](#baselineskip-tex-primitive):

```latex
\verb|\baselineskip| 的默认值为 \the\baselineskip。现在更新 \verb|\baselinestretch|\renewcommand\baselinestretch{2.5}。不过，尽管我们已经执行了

\vspace{5pt}
\verb|\renewcommand\baselinestretch{2.5}|
\vspace{5pt}

\noindent 它（到目前为止）\textit{尚未}产生任何效果：\verb|\baselinestretch| 的新值已被存储，但尚未生效。我们可以执行 \verb|\selectfont| 命令使更改生效；但此时，\verb|\baselineskip| 的值仍然是 \the\baselineskip{}（未变）。

如果现在执行 \verb|\selectfont|，对 \verb|\baselinestretch| 的更改（将其设为 2.5）就会生效——\selectfont 即使我们正处在段落中间。现在，\verb|\baselineskip| 的值是 \the\baselineskip{}（= \(2.5 \times 12=30\mathrm{pt}\)）。

如果我们使用命令 \verb|\fontsize{14}{16}\selectfont| 将字号改为 14pt，并将 \verb|\baselineskip| 改为 16pt，会发生什么？

\fontsize{14}{16}\selectfont 现在，\verb|\baselineskip| \textit{不是} 16pt，而是 \the\baselineskip{}，因为 \verb|\baselinestretch| 的值（2.5）已被保留并应用，得到 \verb|\baselineskip| = \(2.5 \times 16=40\mathrm{pt}\)。

\section{\texttt{\bfseries\string\linespread}}
\verb|\linespread| 命令可在不更改字号的情况下修改 \verb|\baselineskip|。
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Demonstrating+baselinestretch\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D14cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cbegin%7Bdocument%7D%0AThe+default+value+of+%5Cverb%7C%5Cbaselineskip%7C%3D%5Cthe%5Cbaselineskip.+Now+update+%5Cverb%7C%5Cbaselinestretch%7C%5Crenewcommand%5Cbaselinestretch%7B2.5%7D.+However%2C+although+we+have+executed%0A%0A%5Cvspace%7B5pt%7D%0A%5Cverb%7C%5Crenewcommand%5Cbaselinestretch%7B2.5%7D%7C+%0A%5Cvspace%7B5pt%7D%0A%0A%5Cnoindent+it+%5Ctextit%7Bhas+not%7D+%28yet%29+had+any+effect%3A+the+new+value+of+%5Cverb%7C%5Cbaselinestretch%7C+is+stored%2C+but+not+actioned.+We+can+issue+a+%5Cverb%7C%5Cselectfont%7C+command+to+make+the+change+take+effect%3B+but%2C+for+now%2C+the+value+of+%5Cverb%7C%5Cbaselineskip%7C+is+still+%5Cthe%5Cbaselineskip%7B%7D+%28unchanged%29.+%0A%0AIf+we+now+execute+%5Cverb%7C%5Cselectfont%7C+the+change+to+%5Cverb%7C%5Cbaselinestretch%7C%2C+setting+it+to+2.5%2C+will+now+take+effect---%5Cselectfont+even+though+we+are+in+the+middle+of+a+paragraph.+Now%2C+the+value+of+%5Cverb%7C%5Cbaselineskip%7C+is+%5Cthe%5Cbaselineskip%7B%7D+%28%3D+%5C%282.5+%5Ctimes+12%3D30%5Cmathrm%7Bpt%7D%5C%29%29.%0A%0AWhat+happens+if+we+change+the+font+size+to+14pt+and+%5Cverb%7C%5Cbaselineskip%7C+to+16pt+using+the+commands+%5Cverb%7C%5Cfontsize%7B14%7D%7B16%7D%5Cselectfont%7C%3F+%0A%0A%5Cfontsize%7B14%7D%7B16%7D%5Cselectfont+Now%2C+%5Cverb%7C%5Cbaselineskip%7C+is+%5Ctextit%7Bnot%7D+16pt+but+%5Cthe%5Cbaselineskip%7B%7D+because+the+value+of++%5Cverb%7C%5Cbaselinestretch%7C+%282.5%29+has+been+preserved+and+applied%2C+giving+%5Cverb%7C%5Cbaselineskip%7C+%3D+%5C%282.5+%5Ctimes+16%3D40%5Cmathrm%7Bpt%7D%5C%29.%0A%0A%5Csection%7B%5Ctexttt%7B%5Cbfseries%5Cstring%5Clinespread%7D%7D%0AThe+%5Cverb%7C%5Clinespread%7C+command+can+be+used+to+modify+%5Cverb%7C%5Cbaselineskip%7C+without+changing+the+font+size.%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![演示 baselinestretch](/files/5d1260a2a8b3d15e67ab63f1fd7b8d99a3305e12)

#### setspace 宏包中的“行距”是如何定义和更改的？

该 *精确的* 定义，以及 *测量* 的“行距”有不同的解释空间，这可能导致软件系统/应用程序中的各种实现方式。显然，该 `setspace` 宏包必须假定一个可行的行距定义，以便为排版“单倍”和“双倍”行距，或任何其他倍数的行距提供支持。但哪些变量会被 `setspace` 修改，以生成行间空白程度不同的文本行呢？

幸运的是， [tex.stackexchange 上的讨论](https://tex.stackexchange.com/a/30106) 和 [宏包代码中的注释](https://tex.stackexchange.com/a/632830) 阐明了 `setspace` 如何实现行距：它通过设置 `\baselineskip` 为字体字号的倍数来设定其值。

**关于字体和字号的简要说明**

在特定字号下使用字体意味着对 *缩放因子* 应用于这些字体中的字符形状（字形）；一旦按字号缩放，字符的可见大小就取决于字体设计（字形）。字号与字体中字形的实际显示大小之间并没有普遍且固定不变的关系。

下图展示了使用 4 种不同字体样式排版的小写字母“abc”，并且都 *以相同字号显示*。请注意，尽管它们都是以 *相同的* 字号排版，这些小写字母的“大小”仍会随字体设计（字形）而变化：

![相同字号下的多种字体](/files/8f52dc2b6e2d5739413e78fcc2542c0b9afcad49)

#### setspace 宏包中的单倍行距

我们可以使用 [tex.stackexchange 上的讨论](https://tex.stackexchange.com/a/30106) 作为进一步说明的基础。

一个使用 `article` 类的基本文档默认正文字号为 10pt，且其 `\baselineskip` 为 12pt。使用 \[11pt] 或 \[12pt] 选项时，article 类会使用更大的正文尺寸，并相应地使用更大的 `\baselineskip` 值，如下表所示：

| 选项          | 字号                          | $$\texttt{\baselineskip}$$ | $$\displaystyle\frac{\texttt{\baselineskip}}{\text{font size}}$$ |
| ----------- | --------------------------- | -------------------------- | ---------------------------------------------------------------- |
| \[10pt]（默认） | 10pt                        | 12pt                       | 1.2                                                              |
| \[11pt]     | 10.95pt$${}^{\textbf{\*}}$$ | 13.6pt                     | 1.24                                                             |
| \[12pt]     | 12pt                        | 14.5                       | 1.21                                                             |

$${}^{\textbf{\*}}$$值之所以异常， `10.95pt`而不是恰好为 `11pt`，在这篇 [reddit 帖子中有很好的解释](https://www.reddit.com/r/LaTeX/comments/ihle9h/why_does_latex_use_1095pt_text_when_the_11pt/).

如表所示，对于每种正文字号及其对应的默认（即单倍行距）值 `\baselineskip`，其比值

$$\frac{\texttt{\baselineskip}}{\text{font size}}$$

接近 1.2。该比值表示单倍行距，并为以下内容使用的行距计算提供基础： `setspace` 宏包。

**理解并计算 \baselinestretch 的值**

要实现特定的行距倍数，例如 1.5、2、3 等， `\baselinestretch` 命令必须设置为看似 [“奇怪”的值](https://tex.stackexchange.com/a/30106)；例如通过 [编写的，使用了 `\linespread` 命令](https://texblog.org/2011/09/30/quick-note-on-line-spacing/)。在本节中，我们将更仔细地看看 `\baselinestretch` 以了解这些“奇怪”的值是如何产生的。

让我们选择一个默认字号为 $$f$$ 以及默认 `\baselineskip` 的记号值 $$\text{dbls}\_1$$，其中下标 $${}\_1$$ 表示默认的 `\baselineskip` 在字号为 $$f$$.

我们将 ***将*** 单倍行距定义为以下比值，我们将其称为 $$\alpha\_f$$:

$$\frac{\text{dbls}\_1}{f}=\alpha\_f$$

对于给定的字号 $$f$$，我们也来 *将* 定义以下行距值：

* 1.5 倍行距为 *定义为* 为

$$\frac{\text{dbls}\_{1.5}}{f}=1.5$$

* 2.0 倍行距为 *定义为* 为

$$\frac{\text{dbls}\_{2.0}}{f}=2.0$$

* 倍数， $$m$$的行距为 *定义为* 为

$$\frac{\text{dbls}\_{m}}{f}=m$$

使用我们由比值定义的单倍行距， $$\alpha\_f$$，我们可以写出以下“伪代码”来计算 `\baselinestretch` 与任意行距倍数对应的值 $$m$$:

$$\begin{align\*} \texttt{multi spacing } (m) &= \text{a constant } (\lambda) \times \texttt{single spacing}\ \frac{\text{dbls}\_{m}}{f}&=\lambda \times \alpha\_f\ m&=\lambda\alpha\_f\ \lambda&=\frac{m}{\alpha\_f}\kern5pt(\text{refer to }\lambda\text{ as }\texttt{\baselinestretch})\ \implies \texttt{\baselinestretch}&=\frac{m}{\alpha\_f} \end{align\*}$$

让我们使用 `11pt` 字体 `10.95pt`）以及默认值 `\baselineskip` 值为 `13.6pt` 来计算 `\baselinestretch` 用于 *双倍* 行距：

$$\begin{align\*} m&=2.0\ \texttt{\baselinestretch}&=\frac{2.0}{\alpha\_f}\ &=\frac{2.0}{\frac{\text{dbls}\_1}{f}}\ &=\frac{2.0}{\frac{13.6}{11}}\ &=2.0 \times \frac{11}{13.6}\ &=1.618\ \end{align\*}$$

下面的代码片段用于 `setspace` 包中以实现 `\doublespacing` 当字体大小为 11pt 时。注意 `1.618`的值，如上所计算，被存储在命令 `\baselinestretch`:

```latex
\newcommand{\doublespacing}{%
  \setstretch {1.667}%  默认
  \ifcase \@ptsize \relax % 10pt
    \setstretch {1.667}%
  \or % 11pt
    \setstretch {1.618}%
  \or % 12pt
    \setstretch {1.655}%
  \fi
}
```

使用一个 `article` 带有 11pt 字体选项的文档类，下面的示例比较 `\doublespacing` 与一个 `spacing` 使用我们计算得到的 `1.618` 用于 `\baselinestretch`。毫不奇怪， `\baselineskip` 的值是相同的（`22.00475pt`):

```latex
\begingroup
\doublespacing
\verb|\baselineskip|=\texttt{\the\baselineskip}（通过 \verb|\doublespacing|）

\blindtext[1]

\endgroup

\begin{spacing}{1.618}
\verb|\baselineskip|=\texttt{\the\baselineskip}（通过 \verb|\begin{spacing}{1.618})|

\blindtext[1]
\end{spacing}
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Demonstrating+baselinestretch+calculations\&snip=%5Cdocumentclass%5B11pt%5D%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D25cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D14cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cusepackage%7Bblindtext%7D+%25+For+dummy+text.%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Cdoublespacing%0A%5Cverb%7C%5Cbaselineskip%7C%3D%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D+%28via+%5Cverb%7C%5Cdoublespacing%29%7C%0A%0A%5Cblindtext%5B1%5D%0A%0A%5Cendgroup%0A%0A%5Cbegin%7Bspacing%7D%7B1.618%7D%0A%5Cverb%7C%5Cbaselineskip%7C%3D%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D+%28via+%5Cverb%7C%5Cbegin%7Bspacing%7D%7B1.618%7D%29%7C%0A%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bspacing%7D%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![\baselinestretch 的演示](/files/2bf3377445af556547c9f40afe311336083dac15)

对 `\baselinestretch` 的类似计算也适用于其他字体大小和行距组合，如下表所列：

![setspace 参数](/files/946fdfdb87ba4f55f6be58bee14da0c2467bf6f5)

## 使用 TeX/LaTeX 参数命令

以下各节将探讨若干与段落间距/格式设置相关的命令：其中一些命令是 *内置于* TeX 排版引擎，另一些是 TeX/LaTeX 宏。TeX 引擎内置的命令称为 *原语*，这意味着它们是 *基本* 和 *不可化简的* 因为与宏不同，原语不是由其他命令序列构造出来的。

特别地，我们将考虑若干原语 *参数命令* ，包括 pdfTeX、XeTeX 和 LuaTeX 在内的所有 TeX 引擎都支持它们。参数命令，无论是否与段落相关，都用于 *获取当前值* ，或者 *将该参数设置为新值*。例如， `\parskip` 命令，作为一个原语，决定一个参数的值，而该参数控制两个排版后段落之间插入的空白量。

要 *获取* （这里是指排版出） `\parskip` 的当前值，你可以写：

```latex
\the\parskip
```

要 *set* 的当前值 `\parskip` 更改为 `1pt plus2pt` （一个可伸缩胶水），你可以写类似如下内容：

```latex
\setlength{\parskip}{1pt plus2pt}
```

我们还会讨论一些有用的 TeX/LaTeX *宏*，即使用一系列组成命令构造出来的更高级命令。

### 用于段落间距的命令

下面的命令（原语和宏）可用于影响段落间距。其中一些在更详细的部分中有介绍，可通过命令名称中的链接访问。

#### 原语命令

* [`**\parindent**`](#parindent-tex-primitive)：添加到段落首行的缩进（空白）量。
* [`**\parskip**`](#parskip-tex-primitive)：段落之间插入的可伸缩空白（“胶水”）量。
* [`**\rightskip**`](#leftskip-and-rightskip-tex-primitives)：插入到段落每一行右侧的可伸缩间距（胶水）。
* [`**\leftskip**`](#leftskip-and-rightskip-tex-primitives)：插入到段落每一行左侧的可伸缩间距（胶水）。
* [`**\baselineskip**`](#baselineskip-tex-primitive)：该参数的值有两个作用：
  * 它设定段落中文本基线之间所期望的距离；
  * 它用于计算行与行之间添加的（可变）空白量（胶水），以实现所期望的基线到基线距离（[稍后在本文中见](#how-the-space-glue-between-paragraph-lines-is-calculated)).
* [`**\lineskiplimit**`](#lineskip-and-lineskiplimit-tex-primitives)：其值定义了段落中两条相邻行之间可接受的最小距离。
* [`**\lineskip**`](#lineskip-and-lineskiplimit-tex-primitives)：如果计算得到的 `\baselineskip` 胶水会导致行距过近，则插入在段落两行之间的空白量（胶水）。
* `**\parfillskip**`：在段落最后一行末尾添加的非常可伸缩的胶水，以便用空白“填满”它；视觉示例请参见 [*可视化其他类型的段落胶水*](#visualizing-other-types-of-paragraph-glue).

#### 宏命令

下面的 TeX/LaTeX 宏命令常用于修改段落间距：

* [`**\offinterlineskip**` 和 `**\nointerlineskip**`](#offinterlineskipandnointerlineskip)：可用于关闭 `\baselineskip` 胶水的计算和插入的命令；
* [`**\baselinestretch**`](#understanding-and-calculating-values-for-baselinestretch)：一个命令，用于存储一个数值因子，在选择字体时用于计算 `\baselineskip` 的值。其默认值为 1；
* [`**\linespread**`](#demonstrating-linespread)：此命令可用于更改 `\baselinestretch`.

### 可伸缩间距（胶水）

TeX 引擎通过使用一种称为 *胶水* 的可伸缩空白来实现间距效果，包括段落内或段落间的间距，它可根据所需空间的多少进行拉伸或压缩。如果你想了解 TeX 中胶水的概念，可在以下 Overleaf 文章中找到更多细节：

* [探索欠满或溢出盒子与坏度计算](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv)
* [TeX 如何在 \hbox 中计算胶水设置](/latex/zh-cn/shen-du-wen-zhang/24-how-tex-calculates-glue-settings-in-an-hbox.md)
* [理解欠满和溢出盒子的警告](/latex/zh-cn/zhi-shi-ku/138-understanding-underfull-and-overfull-box-warnings.md).

## 基础知识：参数命令与示例

在本节中，我们解释一些与段落相关的参数命令，并提供其用法示例。

### \parindent（TeX 原语）

该参数命令设置添加到段落首行的缩进（空白）量。它可以通过 LaTeX 的 `\setlength` 命令来更改；例如，要将段落缩进 `15pt` set `\parindent` 更改为 `15pt` 可写为：

```latex
\setlength{\parindent}{15pt}
```

注意：

* 你可以更改 `\parindent` ，并将其影响限制在该组中的段落内；
* `\parindent` 可以为负，从而产生“外凸”而不是缩进；
* 默认情况下，LaTeX 不会缩进文档节标题（`\section{...}` 等）后面的第一段。

下面的示例演示了 `\parindent`.

```latex
\documentclass{article}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% 创建一个命令来保存一段文本
\newcommand{\testpar}{\texttt{\string\parindent=\the\parindent\ }当 \TeX{} 排版一个段落时，它会将每个单独字符视为一个具有特定宽度、高度和深度的二维``盒子''。\par}
\begin{document}

% 将 \parskip 设为在段落之间留出 10pt
\setlength{\parskip}{10pt}

% 将 \parindent 的值设为 0pt
\setlength{\parindent}{0pt}
\testpar

% 将 \parindent 的值设为 10pt
\setlength{\parindent}{10pt}
\testpar

% 在组中设置 \parindent
{\setlength{\parindent}{50pt}\testpar}

% 现在 \parindent 又回到 10pt
\testpar

% 是的，你可以有一个负的 \parindent
\setlength{\parindent}{-20pt}
\testpar
\end{document}
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+paragraph+indentation\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Create+a+command+to+hold+a+paragraph+of+text%0A%5Cnewcommand%7B%5Ctestpar%7D%7B%5Ctexttt%7B%5Cstring%5Cparindent%3D%5Cthe%5Cparindent%5C+%7DWhen+%5CTeX%7B%7D+typesets+a+paragraph+it+treats+each+individual+character+as+a+2D+%60%60box%27%27+with+a+specific+width%2C+height+and+depth.%5Cpar%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%25+Set+%5Cparskip+to+put+10pt+between+paragraphs%0A%5Csetlength%7B%5Cparskip%7D%7B10pt%7D%0A%0A%25+Set+the+value+of+%5Cparindent+to+0pt%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Ctestpar%0A%0A%25+Set+the+value+of+%5Cparindent+to+10pt%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Ctestpar%0A%0A%25+Set+%5Cparindent+in+a+group%0A%7B%5Csetlength%7B%5Cparindent%7D%7B50pt%7D%5Ctestpar%7D%0A%0A%25+Now+%5Cparindent+is+again+10pt%0A%5Ctestpar%0A%0A%25+Yes%2C+you+can+have+a+negative+%5Cparindent%0A%5Csetlength%7B%5Cparindent%7D%7B-20pt%7D%0A%5Ctestpar%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![在 LaTeX 中使用不同的段落缩进值](/files/a9b8cde51c9fdf7e0605c929df1623bb94c8c57b)

### \parskip（TeX 原语）

通过用一种会随设计美感而变化的空白量分隔段落，可以增强文本的可读性。TeX/LaTeX 允许用户通过 `\parskip` 参数命令来控制段落间距。

* **来自 `parskip` 宏包**： [parskip 包的建议](https://ctan.org/pkg/parskip) 建议直接修改 `\parskip` 可能会“导致 LaTeX 文档中意外位置出现垂直间距”。 `parskip` 包尝试修复可能因更改 `\parskip`的值而产生的间距问题——例如目录和列表环境中。另请参见本文的 [`parskip` 包部分](#the-parskip-package).

要手动设置 `\parskip` 的当前值，请使用 LaTeX 的 `\setlength` 命令；例如，要用 3pt 分隔段落，你可以写：

```latex
\setlength{\parskip}{3pt}
```

下面的示例演示了 `\parskip`:

```latex
\documentclass{article}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% 创建一个命令来保存一段文本
\newcommand{\testpar}{\noindent 当前 \texttt{\string\parskip} 的值是 \texttt{\the\parskip}。当 \TeX{} 排版一个段落时，它会将每个单独字符视为一个具有特定宽度、高度和深度的二维~``盒子''。\par}
\begin{document}
\testpar
% 将 \parskip 设为 5pt
\setlength{\parskip}{5pt}\testpar
% 将 parskip 设为 10pt
\setlength{\parskip}{10pt}\testpar
% 将 \parskip 设为 25pt（但在一个组中）
{\setlength{\parskip}{25pt}\testpar}
% 组结束，现在 \parskip 又回到 10pt
\testpar
% 是的，你可以有一个负的 \parskip
\setlength{\parskip}{-20pt}\testpar
\end{document}
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+parskip+settings\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Create+a+command+to+hold+a+paragraph+of+text%0A%5Cnewcommand%7B%5Ctestpar%7D%7B%5Cnoindent+The+current+value+of+%5Ctexttt%7B%5Cstring%5Cparskip%7D+is+%5Ctexttt%7B%5Cthe%5Cparskip%7D.+When+%5CTeX%7B%7D+typesets+a+paragraph+it+treats+each+individual+character+as+a+2D%7E%60%60box%27%27+with+a+specific+width%2C+height+and+depth.%5Cpar%7D%0A%5Cbegin%7Bdocument%7D%0A%5Ctestpar%0A%25+Set+%5Cparskip+to+5pt+%0A%5Csetlength%7B%5Cparskip%7D%7B5pt%7D%5Ctestpar%0A%25+Set+parskip+to+10pt%0A%5Csetlength%7B%5Cparskip%7D%7B10pt%7D%5Ctestpar%0A%25+Set+%5Cparskip+to+25pt+%28but+in+a+group%29%0A%7B%5Csetlength%7B%5Cparskip%7D%7B25pt%7D%5Ctestpar%7D%0A%25+Group+ends%2C+now+%5Cparskip+is+again+10pt%0A%5Ctestpar%0A%25+Yes%2C+you+can+have+a+negative+%5Cparskip%0A%5Csetlength%7B%5Cparskip%7D%7B-20pt%7D%5Ctestpar%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![在 LaTeX 中演示 \parskip 的使用](/files/049f8c0b096d87bbceaeeb5f461da93e263fdee1)

#### 可伸缩的 \parskip

传统上， `\parskip` 不是一个 *固定的* 值，因为那样会在所有段落之间产生相同的空白量。相反， `\parskip` 通常被定义为一种“可伸缩空白”（称为胶水），它使 TeX 能够拉伸或压缩段落之间的空白，帮助内容适配页面，并找到一个“合适”的分页位置。

要使 `\parskip` 具有可伸缩性，你可以将其写成胶水规范的形式：

`\setlength{\parskip}{*固定量* **plus** *拉伸量* **minus** *压缩量*}`

其中 `**plus**` 和 `**minus**` 已 *关键词* 由 TeX/LaTeX 用来标识 *拉伸量* 或 *压缩量* ，它们包含在胶水规范中。Overleaf 文章 [*探索欠满或溢出盒子与坏度计算*](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv) 对胶水有更深入的讨论。

例如，要使 `\parskip` 在 `3 + 1 = 4pt` 和 `3 — 1 = 2pt` 之间变化，你可以写

```latex
\setlength{\parskip}{3pt plus1pt minus1pt}
```

### \leftskip 和 \rightskip（TeX 原语）

TeX 引擎提供了两个参数命令，它们会在排版后的段落中每一行的左侧和右侧添加空白（胶水）。顾名思义：

* `\leftskip` 在段落中每一行左侧插入空白（胶水）；
* `\rightskip` 在段落中每一行右侧插入空白（胶水）。

下面的示例使用 `\leftskip` 和 `\rightskip` 来直接修改段落对齐；不过……文本对齐的更好实现方式通常是通过合适的 LaTeX 环境或宏包——例如，参见 [Overleaf 上关于文本对齐的文章](/latex/zh-cn/ge-shi-hua/06-text-alignment.md)。尽管我们演示了 TeX 引擎提供的一些底层（原语）参数命令的行为，但通常建议尽可能使用合适的 LaTeX 宏包。

#### 使 \leftskip 固定而 \rightskip 可伸缩

下面的示例生成两个段落：第一个使用 LaTeX 的默认 `\leftskip` 和 `\rightskip` 值，第二个段落使用以下设置排版：

```latex
\leftskip 10pt
\rightskip 0pt plus 1 fill
```

打开下面的 Overleaf 项目查看输出：

```latex
\documentclass{article}
\title{Second leftskip and rightskip example}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% 设置一些与段落相关的参数的值
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % 一个生成的 TeX 文件，定义了宏
% \mytextA 和 \mytextB，每个都包含一段文本。
% 使用 \leftskip 和 \rightskip 的默认值排版一个段落

\mytextB

% 将 \leftskip 和 \rightskip 设为新值
\leftskip 10pt
\rightskip 0pt plus 1fill
\vspace{8pt}

% 现在重新排版同一段落
\mytextB

\end{document}
```

&#x20;将此示例作为 Overleaf LaTeX 项目打开

此示例生成以下输出：

![在 LaTeX 中设置 \leftskip 胶水](/files/bdbf6e10628dd59d36f70e25f2181c45e8584377)

下面的图是上面示例生成的第二段的注释版本。它旨在突出显示并展示 `\leftskip` 和 `\rightskip` 插入到段落各行中的胶水，以及 `\parindent` 第一行所需的空白：

![在 LaTeX 中设置 \leftskip 胶水](/files/94b34dfe8cfdf328d237ac153d86868a5f630606)

注意 `\leftskip` 胶水具有固定大小（10pt），但 `\rightskip` 胶水已被拉伸，以提供填满每一行右侧所需的任意数量空白。这种“灵活性”源于 `\rightskip` 的规范，其中包含 `plus 1 fill`——提供一种“无限可拉伸”的胶水形式。

#### 使 \rightskip 固定而 \leftskip 可伸缩

下面的示例生成两个段落：第一个使用 LaTeX 的默认 `\leftskip` 和 `\rightskip` 值，第二个段落使用以下设置排版：

```latex
\leftskip 0pt plus 1 fill
\rightskip 10pt
```

打开下面的 Overleaf 项目查看输出：

```latex
\documentclass{article}
\title{leftskip and rightskip examples}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% 设置一些与段落相关的参数的值
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % 一个生成的 TeX 文件，定义了宏
% \mytextA 和 \mytextB，每个都包含一段文本。
% 使用 \leftskip 和 \rightskip 的默认值排版一个段落

\mytextB

% 将 \leftskip 和 \rightskip 设为新值
\rightskip 10pt
\leftskip 0pt plus 1fill
\vspace{8pt}

% 现在重新排版同一段落
\mytextB

\end{document}
```

&#x20;将此示例作为 Overleaf LaTeX 项目打开

此示例生成以下输出：

![在 LaTeX 中设置 \rightskip 胶水](/files/60ad0339894fa6935f190f34d17bb4671dbaaf90)

下面的图是上面示例生成的第二段的注释版本。它旨在突出显示并展示 `\leftskip` 和 `\rightskip` 插入到段落各行中的胶水，以及 `\parindent` 第一行所需的空白：

![在 LaTeX 中设置 \rightskip 胶水](/files/775540af99dc834b6d7d9ddf3473e9d608c8e15d)

注意 `\rightskip` 胶水具有固定大小（10pt），但 `\leftskip` 胶水已被拉伸，以提供填满每一行左侧所需的任意数量空白。这种“灵活性”源于 `\leftskip` 的规范，其中包含 `plus 1 fill`——提供一种“无限可拉伸”的胶水形式。

#### 将 \leftskip 和 \rightskip 设为可伸缩值

下面的示例生成两个段落：第一个使用 LaTeX 的默认 `\leftskip` 和 `\rightskip` 以及第二个使用以下可伸缩的胶水设置：

```latex
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
```

这些设置会使段落行居中：

```latex
\documentclass{article}
\title{leftskip and rightskip examples}
% 选择一个方便的小页面尺寸
\usepackage[paperheight==16cm,paperwidth==12cm,textwidth=8cm]{geometry}
% 设置一些与段落相关的参数的值
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % 一个生成的 TeX 文件，定义了宏
% \mytextA 和 \mytextB，它们定义了两段文本
% 使用 \leftskip 和 \rightskip 的默认值排版一个段落

\mytextB

% 将 \leftskip 和 \rightskip 设为“极其灵活”的胶水设置
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
\vspace{20pt}

% 现在重新排版同一段落
\mytextB

\end{document}
```

&#x20;将此示例作为 Overleaf LaTeX 项目打开

此示例生成以下输出：

![展示 \leftskip 和 \rightskip 的示例](/files/508f22eea9a2fd68d7e9af7ac6e62375bb312215)

下面的图是上面示例生成的第二段的注释版本。它旨在突出显示并展示 `\leftskip` 和 `\rightskip` 插入到段落各行中的胶水，以及 `\parindent` 第一行所需的空白：

![展示 \leftskip 和 \rightskip 的示例](/files/c6a82036f41ebd31b407a42154e999a7628b3f42)

注意两者 `\leftskip` 和 `\rightskip` 都被指定为 `0pt plus 1fill` 使它们同样“无限灵活”；因此，它们以相同的量拉伸，结果使排版后的行居中。

#### 在组中设置 \leftskip 和 \rightskip

下面的示例展示了如何通过将它们包在一个组中来对 `\leftskip` 和 `\rightskip` 进行临时更改。在我们的示例中，该组由 `\begingroup`... `\endgroup`创建，如下代码片段所示：

```latex
\begingroup
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
\mytextB
\endgroup
```

第一段使用“极其灵活”的胶水用于 `\leftskip` 和 `\rightskip`:

```latex
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
```

，但第二段使用 LaTeX 的默认值：

```latex
\documentclass{article}
\title{Another leftskip and rightskip example}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% 设置一些与段落相关的参数的值
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % 一个生成的 TeX 文件，定义了宏
% \mytextA 和 \mytextB，它们定义了两段文本
% 这里我们将 \leftskip 和 \rightskip 更改为“极其灵活”的胶水设置
% 在由 \begingroup ... \endgroup 创建的组中

\begingroup
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
\mytextB
\endgroup

% 现在在组结束后重新排版同一段落
% 这会使 \leftskip 和 \rightskip 恢复为先前的值

\vspace{20pt}
\mytextB

\end{document}
```

&#x20;将此示例作为 Overleaf LaTeX 项目打开

此示例生成以下输出：

![在组中使用 \leftskip 和 \rightskip](/files/d060b1ae5a7b91bf9368ca86feefad8d61b7fd4d)

**注意**： `\leftskip` 和 `\rightskip` 的设置（效果）被限制在由 `\begingroup`... `\endgroup`创建的组内的段落。组关闭后，下一个段落将使用 LaTeX 的默认 `\leftskip` 和 `\rightskip`.

### \baselineskip（TeX 原语）

通常公认的排版实践是，段落内的文本行应等距分布，除非某些行包含较大的元素，如数学公式或图像，这会使这些行无法保持恒定的行距。

TeX/LaTeX 提供了命令和机制，使用户能够在一定程度上控制行距。其中一个命令是 `\baselineskip` ，它可以获取或设置一个参数的值，该参数决定排版后段落中期望的行距（基线到基线的距离）。

要排版 `\baselineskip` 的当前值，你可以写

```latex
\the\baselineskip
```

要将 `\baselineskip` 设置为某个 `值` （如 LaTeX 长度 `pt`），你可以写

```latex
\setlength{\baselineskip}{value}
```

例如，要将 `\baselineskip` 更改为 `12pt` 的当前值，你可以写

```latex
\setlength{\baselineskip}{12pt}
```

我们可以通过使用下面这个（典型的）段落来演示 `\baselineskip` 的作用：

![一个示例 LaTeX 段落](/files/93a5a35f6ff14d1b07ffba19e6c25ab9f4bd4cb7)

并添加注释，显示由 `\baselineskip`:

![显示基线距离的注释版示例 LaTeX 段落](/files/6618745eefa09b662d8d0c337cc35c8f793828ff)

该图还显示了行间“胶水”：为满足需要而在各行之间添加的计算得到的空白量——我们稍后还会在本文中进一步讨论这一点。

#### \baselineskip 和其他参数

`\baselineskip` 是控制段落各行之间插入空白量的四个核心参数之一；其他三个是：

* `\lineskip`
* `\lineskiplimit`
* `\prevdepth`

在本文后面我们将探讨 [*这四个参数如何被用来*](#paragraph-structure-and-line-space-calculations) 计算行间胶水值。

#### \baselineskip 示例（固定空白）

下面的示例会在 Overleaf 中打开，并创建一个包含名为 `text.tex` 的文件的项目，其中定义了命令 `\mytextA` 和 `\mytextB`——这两个命令都会排版一段文本。为方便起见，Overleaf 项目使用较小的页面尺寸，因为这有助于为此帮助页面准备图形和图像。

```latex
\documentclass{article}
\title{Demonstrating baselineskip}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% 设置一些与段落相关的参数的值（我们会讨论这些）
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
% 设置 \baselineskip 的值——更改该值以查看效果
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % 一个生成的 TeX 文件，定义了宏
% \mytextA 和 \mytextB，它们各自排版一段段落

% 首先，使用默认的 \baselineskip 排版两个段落
\mytextA\mytextB

% 现在将 \baselineskip 改为更大的值并排版
% 另一个段落
\setlength{\baselineskip}{24pt}
\mytextA

\end{document}
```

&#x20;将此示例作为 Overleaf LaTeX 项目打开

此示例生成以下输出：

![在 TeX 或 LaTeX 中探索 baselineskip](/files/de6049488f62d871a94b7369b8c89e4d1d1a903c)

第 2 页上的段落行距很大，因为 `\baselineskip` 被设为 24pt。

#### \baselineskip 示例（可伸缩空白）

下面的示例指定了一个 `\baselineskip` 值，它具有极其灵活（所谓“无限”）的拉伸分量：

```latex
\baselineskip=12pt plus1fil
```

由于这种灵活性，段落各行之间的空白可以按填满页面所需的任意量进行拉伸。这种灵活性会导致段落内部文本各行之间的空白量差异很大，这在美观上可能不够理想，也不易阅读。

```latex
\documentclass{article}
\usepackage{blindtext}
\title{Flexible \texttt{\string\baselineskip} demo}
\author{Overleaf}
\date{January 2022}

\begin{document}

\maketitle
我们将通过赋值 \texttt{12pt plus1fil}，即 \verb|\baselineskip=12pt plus1fil|，为 \verb|\baselineskip| 提供一个非常灵活的“拉伸”分量：\verb|\baselineskip=12pt plus1fil|。\baselineskip=12pt plus1fil
\section{Introduction}
添加一个现在会拉伸以填满页面的段落。\blindtext

\end{document}
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Flexible+baselineskip+demo\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bblindtext%7D%0A%5Ctitle%7BFlexible+%5Ctexttt%7B%5Cstring%5Cbaselineskip%7D+demo%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BJanuary+2022%7D%0A%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cmaketitle%0AWe%E2%80%99ll+provide+%5Cverb%7C%5Cbaselineskip%7C+with+a+very+flexible+%60%60stretch%27%27+component+by+assigning+the+value+%5Ctexttt%7B12pt+plus1fil%7D%3A+%5Cverb%7C%5Cbaselineskip%3D12pt+plus1fil%7C.%5Cbaselineskip%3D12pt+plus1fil+%0A%5Csection%7BIntroduction%7D%0AAdd+a+paragraph+that+will+now+stretch+to+fill+the+page.+%5Cblindtext%0A%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![演示具有无限灵活性的 baselineskip 胶水](/files/614b69bf2c20743713218b932e32d260e45b20d2)

**关于胶水的几点说明**

以下部分的一些说明摘自 Overleaf 文章 [探讨欠满或过满的盒子以及坏度计算](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv)，为方便起见，在此重现。

TeX 在段落各行之间插入的空白， `\baselineskip`，是一种称为 *胶水*的弹性间距。一个胶值可指定三个组成部分：

* a *固定的* 量；
* 它可以 *伸展*;
* 它可以 *收缩*,

因此，一个 `\baselineskip` 值可以像这样指定：

`\baselineskip`=*固定量* **加上** *拉伸量* **减去** *压缩量*

其中

* **加上** 和 **减去** 是 TeX 引擎能够识别的关键字；
* *固定量* 被称为 *正常分量* 胶的（也称为胶的 *自然宽度* ）；
* *拉伸量* 被称为 *伸展分量* 胶的；
* *压缩量* 被称为 *收缩分量* 胶的。

该 *固定量* 对于所有胶值都是必需的，但 *拉伸量* 和 *压缩量* 两者都是可选的——如果其中任意一个或两者均缺失，它们将被设为值 0。

通常， `\baselineskip` 胶是用一个 *固定量* 单独指定的，则伸展和收缩分量均为零；否则段落各行会有不规则（可变）的间距，这可能不够美观。

### \offinterlineskip 和 \nointerlineskip（宏）

这些宏常用于防止在段落行之间插入行间胶。想了解更多细节的读者可以跳至相关文章章节，其中说明了这些宏的工作方式。

* **`\offinterlineskip`**：请参阅文章章节 [*零尺寸行间胶：\offinterlineskip*](#zero-sized-interline-glue-offinterlineskip).
* **`\nointerlineskip`**：请参阅文章章节 [*防止行间胶：\prevdepth 和 \nointerlineskip*](#preventing-interline-glue-prevdepth-and-nointerlineskip).

## 段落结构和行距计算

利用 LuaTeX 的功能，可以 [对排版后的段落进行后处理](https://www.overleaf.com/latex/examples/luatex-parsing-typeset-paragraphs/mzbpwxtjshsj) ，以可视化构成它的字符（字形）、行和胶的边界。我们将先通过一组简短的图示，帮助直观理解 TeX 引擎用于排版段落文本的“盒子和胶”模型。

### 段落结构

TeX 排版段落时，会将各个字符视为微型盒子，每个盒子都有自身的宽度、高度和深度；这些字符盒子的宽度用于计算最佳换行位置。此外，文本中用于分隔单词的空格字符会被转换为一种弹性空白（胶），以提供实现每次换行所需的间距。

以下 7 幅图展示了排版段落的核心组成部分：各种类型的盒子和胶。第一幅图展示了一个排版段落及其带注释的版本，后者突出显示了段落中的各类元素。不过，带注释的段落包含许多信息，因此后续图示会分离不同组成部分，以便（希望能）更容易理解。

![Paragraphanatomy1b.png](/files/046df4253a5e102a59974d6649dd72009e5a28ba)

* 下一幅图将段落行描绘为灰色盒子，它们之间由水平绿色条带表示的胶分隔。该胶经过计算，以确保基线到基线的距离等于（即其值为） `\baselineskip`:

![Paragraphanatomy2b.png](/files/53f69230d8fd5c334e74c23af26d82cb518f16be)

* 下一幅图将排版字符表示为盒子，以直观说明 TeX 引擎如何处理字符来生成换行：

![Paragraphanatomy3.png](/files/59325fdfa7b9012d3076e666a44ec7149cb5cf66)

* 下一幅图展示了盒子中的盒子：较大的段落行（盒子）包含较小的盒子（单个字符）：

![Paragraphanatomy5.png](/files/9acd84660ad99562cfef4f6e7f7a7a350ee955b0)

* 下一幅图展示了每一行中单词之间的空白量：这些词间空白是通过将空格字符转换为弹性胶生成的，胶会伸展或收缩以使每一行文本达到正确长度。请仔细注意，这些空白的尺寸会因行而异：

![Paragraphanatomy4.png](/files/7f9a67d6745a1b74f33342f7ed1870626a43c763)

* 下一幅图结合了字符盒子和置于各个单词之间的相应胶（空白）：

![Paragraphanatomy6.png](/files/94898fc912fc5b2537a23129d923a225a2ed06ad)

### 可视化其他类型的段落胶水

以下段落也使用 LuaTeX 排版和处理，以展示一对段落内部及之间的其他类型胶。请注意， `\rightskip` 和 `\leftskip` 均设为 0pt，因此未显示：

* **`\parskip`** 置于两个排版段落之间的胶（浅蓝色）；
* 各个单词由 ***词间胶*** （黄色）分隔，这是通过将输入中的空格字符转换为排版输出中尺寸可变的空白（胶）而生成的。由词间空白产生的胶会伸展或收缩，以实现视觉上美观的换行；
* **`\baselineskip`** 置于行之间的胶（浅绿色）——确切的 `\baselineskip` 胶量是使用下文讨论的机制计算的；
* **`\lineskip`** 第二个段落中使用的胶（红色）——由于倒数第二行中包含的低盒子；
* **`\parfillskip`** 置于每个段落最后一行末尾的胶（深绿色）。

![](/files/445cec7ab38916ce86f7fbec963015bb56044102)

### 处理更深（或更高）的行（盒子）

如中的图示所示， [上一部分](#paragraph-structure)，一个排版段落是“盒子”的垂直堆叠，盒子之间由一些空白分隔，TeX 将其称为“胶”。在处理段落并堆叠各个行（盒子）时，垂直列表（堆叠）沿着 *向下* 方向增长，朝向页面底部。尽管 TeX/LaTeX 会尝试确保段落行以恒定的基线间距堆叠，该距离为 `\baselineskip`，但这并不总能实现，因为某些行的高度或深度可能大于通常值。

每个段落行的高度和深度由该行内容在基线上方或下方延伸的最大距离决定；因此，包含高度或深度相对较大的内容（如行内数学公式或图形）的段落，很可能产生具有相应较大高度和/或深度的单独行。对于这些行，TeX/LaTeX 可能无法将其堆叠为与其他行的基线间距保持 `\baselineskip` 的量。显然，TeX/LaTeX 需要一种“后备机制”来处理这些行，通过 *计算* 在受较大高度和/或深度影响的每对行之间插入适当的空白量。

#### \lineskip 和 \lineskiplimit（TeX 原语）

该后备机制涉及参数命令 `\lineskip` 和 `\lineskiplimit` 以及第三个称为 `\prevdepth`的参数。想了解更多细节的读者可以跳至文章章节 [*如何计算段落行之间的空白（胶）*](#how-the-space-glue-between-paragraph-lines-is-calculated).

下面的示例项目排版了一个段落，其最后一行由于一个移位的文本盒子（`\hbox`）而具有相对较大的深度。该段落使用以下设置排版：

```latex
\setlength{\baselineskip}{12pt}
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
```

使用以下代码下方的链接打开一个 Overleaf 项目：

```latex
\documentclass{article}
% 使用一个方便较小的页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Set some important parameters
\setlength{\baselineskip}{12pt}
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
% Input file defining \testpar
\input testpar.tex
\title{A sample paragraph for lineskip}
\begin{document}
\testpar % A macro created in the Overleaf project
\end{document}
```

&#x20;[在 Overleaf 中打开此示例。](https://www.overleaf.com/docs?engine=\&snip_name\[]=main.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Set+some+important+parameters%0A%5Csetlength%7B%5Cbaselineskip%7D%7B12pt%7D%0A%5Csetlength%7B%5Clineskip%7D%7B3.5pt%7D%0A%5Csetlength%7B%5Clineskiplimit%7D%7B2pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B20pt%7D%0A%25+Input+file+defining+%5Ctestpar+%0A%5Cinput+testpar.tex%0A%5Ctitle%7BA+sample+paragraph+for+lineskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Ctestpar+%25+A+macro+created+in+the+Overleaf+project%0A%5Cend%7Bdocument%7D\&snip_name\[]=testpar.tex\&snip\[]=%5Cnewcommand%7B%5Ctestpar%7D%7B%5CTeX%7B%7D+uses+the+name+%60%60glue%27%27+to+describe+%60%60flexible+white+space%27%27+used+to+separate+any+typeset+item+which+can+appear+on+the+page.+For+example%2C+individual+words%2C+and+whole+lines%2C+within+a+typeset+paragraph+are+seperated+by+%60%60glue%27%27.+%5CTeX%7B%7D+engines+identify+%28give+a+name+to%29+different+types+of+glue+according+to+where+it+is+being+used.+For+example%2C+each+line+is+separated+by+%5Ctexttt%7B%5Cstring%5Cbaselineskip%7D+glue+or%2C+occasionally%2C+%5Ctexttt%7B%5Cstring%5Clineskip%7D+glue%2C+depending+on+%5CTeX%27s+calculations.+Let%27s+trigger+use+of+%5Ctexttt%7B%5Cstring%5Clineskip%7D+glue+by+adding+an+%5Ctexttt%7B%5Cstring%5Chbox%7D+which+has+a+large+depth+due+to+the+%5Ctexttt%7B%5Cstring%5Clower%7D+command%3B+for+example%2C+the+box%0A+%5Clower5pt%5Chbox%7BLOW+BOX%7D+will+cause+%5CTeX%7B%7D+to+insert+%5Ctexttt%7B%5Cstring%5Clineskip%7D+glue+instead+of+%5Ctexttt%7B%5Cstring%5Cbaselineskip%7D+glue.%5Cpar%7D\&main_document=main.tex)

此示例生成如下输出：

![演示 \lineskip 胶的示例](/files/38ee12bec29fc43e4497ccc7d6c0545ccb887ab4)

以下图示使用了前一个 Overleaf 项目生成的段落的带注释版本。这里，我们放大以聚焦于最后一个段落行，显示由 `\lineskip` 胶（以红色显示）所造成的移位文本盒子的深度：

![显示 TeX \lineskip 胶的图像](/files/27780a5b14aef50d2c2201ab1b27b36d66b02667)

段落文本的最后一行具有大于通常值的深度，导致 TeX 无法维持由值 `\baselineskip` （12pt）指定的恒定基线间距。如图右侧的箭头所示，TeX/LaTeX 会尝试确保每对行之间保持固定距离（12pt）——即 `\baselineskip`的值。不过，对于最后一对行，TeX 将它们分隔为大于 12pt 的量，并将 `\lineskip` 的值用于行间胶，而非使用 `\baselineskip`.

以下各节将探讨并解释 TeX 对行间胶值的计算细节。

### 如何计算段落行之间的空白（胶）

就当前目的而言，我们将 *非常简要地* 提及 TeX 的页面构建过程，尽管方式高度简化！TeX 完成一个段落的排版（包括完成断词和确定换行）后，你可以将该段落数据视为存储在一个临时内存位置。然后，TeX 需要逐行将该段落数据移至一个新的内存位置，其中存储的是将要输出到当前页面的内容。

TeX 逐行移动段落数据时，实际上是在构建一个由行（TeX 盒子）组成的垂直堆叠，它会 *向下* 朝页面底部增长。当 TeX 将段落行移至当前页面时，会尝试确保这些行具有相等的间距，即一致的垂直（基线到基线）间距，其值等于 `\baselineskip`。当一条新行被转移至当前页面时，TeX 引擎会临时记录该行的 *深度* ，因为它将用于计算该行与其后放置的行之间的行间胶（空白）量。

#### 胶尺寸计算

让我们先总结 TeX 引擎提供的行间距功能：

* 保持基线之间的恒定距离，该距离等于 `\baselineskip`;
* 为高度或深度相对较大的任何行提供间距；
* 一种关闭行间胶插入的功能——可以自动关闭或由用户控制关闭。例如：
  * TeX 引擎会在垂直模式中的标尺之后自动禁用行间胶插入；
  * 宏 `\offinterlineskip` 和 `\nointerlineskip` 允许用户临时关闭行间胶插入——正如我们将在下文看到的，这些宏具有不同效果。

是否添加行间胶，以及添加何种类型、多少量的行间胶，决策过程如下：

* 是否应添加行间胶？TeX 通过测试 *最后添加行的深度* 到列表中是否小于特殊值 `–1000pt` （点）。请注意， `–1000pt` 是 TeX 引擎内部使用的任意“哨兵”值。
  * **注意**：“最后添加行的深度”这一由 TeX 在内部记录的值，也称为“前一深度”。TeX 引擎提供参数命令 `\prevdepth`——在某些情况下可用于 *获取* 或 *set* “前一深度”的值。该宏 `\nointerlineskip` 利用了 `\prevdepth`.
* TeX 测试是否 `前一行的深度大于 –1000pt`?
  * ***是*** （需要添加胶）：
    * 计算值 Δ，其中 Δ = \baselineskip –（前一行的深度）–（下一行的高度）
    * 将 Δ 与 `\lineskiplimit`的值进行比较，这是一个用于定义两行之间可接受最小距离的参数，距离以较高行底部与较低行顶部之间的距离衡量。
    * 如果 Δ < `\lineskiplimit`:
      * 两行距离过近，因此插入可接受的最小间距，即 `\lineskip`
    * 如果 Δ ≥ `\lineskiplimit`:
      * 两行距离不算过近，因此使用 Δ 作为要插入的胶量
  * ***否*** （不添加胶）：
    * 添加下一行（盒子），不插入任何胶

以下图示总结了行间胶过程：

![TeX 如何确定行间胶值](/files/84da487727975e036350fa92d49ee407e44019c5)

### 行间胶计算示例

在以下示例中，我们假定 TeX/LaTeX 使用下列命令参数值：

```latex
\baselineskip=12pt
\lineskip=3.5pt
\lineskiplimit=2pt
```

我们将考察该段落前两行的行间胶计算：

![OLV2glue-calcs-step0.png](/files/03ddec7ad8d3e2e57a007dfdd52b8b721feae736)

在下一幅图中，TeX 引擎已处理第一个段落行，并将其移至正在构建的垂直列表。它会跟踪该行的深度（`d<sub>1</sub>`），其值为 `2.1528` （点）：

![OLV2glue-calcs-step1.png](/files/600c739dedb76b12ea489fb5bbf2d30a124b6f41)

接下来，TeX 准备将第二行添加到正在构建的列表中：该行的高度为（`h<sub>2</sub>`），其值为 `6.9444` （点），顺便说一下，其深度为 `d<sub>2</sub>` 的记号值 `0` （点）：

![OLV2glue-calcs-step2.png](/files/b2eea4aeb0f9fa13f8da24bcbb38659514f04464)

此时，TeX 需要计算要在这两行之间插入的空白量（胶， `g<sub>1</sub>`）：

![OLV2glue-calcs-step3.png](/files/c36fce3743d782f647fd1fc30554dc5785e3f6d1)

以下图像展示了这对行的胶计算：

![OLV2glue-calcs-stepA3.png](/files/13f13d124d2053d80641359f9f47d15735f57781)

最后一幅图展示了两行被移至当前页面，且它们之间放置了计算出的行间胶量：

![OLV2glue-calcs-step5.png](/files/5347ee7b076ddd2bd322cef9cbbd861a57307576)

### 又一个参数：\prevdepth

如上所述，当 TeX 创建盒子的垂直堆叠（列表）时，它会存储最后添加到该列表的盒子的深度。这个存储的深度值称为“前一深度”，可通过参数命令访问 `\prevdepth`.

该 `\prevdepth` 该命令可用于 ***本身*** 当 TeX 处于垂直模式时；即在段落之间或垂直盒子内部： `\vbox`, `\vtop` 或 `\vcenter` （注意： `\vcenter` 盒子只能在数学模式中使用）。

`\prevdepth` 提供对“前一深度”值的读写访问：

* 要读取当前的 `\prevdepth` 值，可以写：

```latex
\the\prevdepth
```

* 要设置当前的 `\prevdepth` 更改为 `某个值`，即以点、毫米等为单位的长度，可以写：

```latex
\setlength{\prevdepth}{some value}
```

如果你尝试使用 \verb`\prevdepth` 于其设计用途之外的情形，例如在段落内部或 `\hbox` 内部，你将得到错误

```latex
Improper \prevdepth.
```

，并附带信息说明它只能在垂直模式中使用。

#### 防止行间胶：\prevdepth 和 \nointerlineskip

的一种用途 `\prevdepth` 是 *阻止* TeX 执行用于在垂直列表中的项目（如段落行）之间添加行间胶的基线计算。使用 `\prevdepth` 来表示 `前一行的深度` ，我们可以将胶计算（如上图所示）重新表述如下：

```latex
if(\prevdepth > –1000pt)
{
     Δ = \baselineskip — \prevdepth — (height of current line)

     if(Δ < \lineskiplimit)
       interline glue = \lineskip
     else
       interline glue = Δ
}
else
{
     堆叠盒子而不添加
     任何行间胶
}
```

在内部，TeX 引擎识别一个所谓的“哨兵”值 `\prevdepth` ，该值可用于禁用行间胶的计算和添加。该哨兵值为 `–1000pt`，可在上述伪代码的第一行中看到：

```latex
if(\prevdepth > –1000pt)
```

除非 `\prevdepth` 大于 `–1000pt`，否则 TeX 不会添加行间胶——这提供了由 `\nointerlineskip` 宏使用的机制，用于防止在垂直列表中下一对盒子之间添加基线胶。

`\nointerlineskip` 具有等价定义：

```latex
\def\nointerlineskip{
\prevdepth–1000pt
}
```

注意 `\nointerlineskip` 提供了一种 *一次性停用* 行间胶计算的方式，因为 `\prevdepth` 的值会随着新盒子添加到当前垂直列表而持续更新，如以下示例所示：

```latex
\noindent The following \verb|\hbox|es are processed when \TeX{} is in so-called \textit{outer vertical mode}. After processing (typesetting), these boxes are appended to the current page and stacked vertically with interline glue inserted between them:

\hbox{j}
\hbox{p}
\hbox{g}

现在，紧接在盒子 \verb|\hbox{j}| 之后，我们将 \verb|\prevdepth| 设置为 \texttt{-1000pt}，这会阻止在盒子 \verb|\hbox{j}| 和 \verb|\hbox{p}| 之间放置行间胶：

\hbox{j}\setlength{\prevdepth}{-1000pt}
\hbox{p}
\hbox{g}

请注意，盒子 \verb|\hbox{p}| 和 \verb|\hbox{g}| 之间确实放置了行间胶，因为在处理 \verb|\hbox{p}| 并将其添加到列表后，\verb|\prevdepth| 的值会更新：\verb|\prevdepth| 的值变为盒子 \verb|\hbox{p}| 的深度。当 \verb|\hbox{g}| 添加到垂直列表时，\verb|\prevdepth| 的值不再是 \texttt{-1000pt}；因此，现在可以添加行间胶。
```

&#x20;[在 Overleaf 中打开此示例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=One-shot+use+of+nointerlineskip\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Cbaselineskip%7D%7B14pt%7D%0A%5Csetlength%7B%5Cparskip%7D%7B1pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%25+A+convenience+macro+to+typeset+%5Cprevdepth+in+an+%5Chbox%2C+although+TeX+has+to+be%0A%25+in+a+vertical+mode+when+this+macro+is+used.%0A%5Cnoindent+The+following+%5Cverb%7C%5Chbox%7Ces+are+processed+when+%5CTeX%7B%7D+is+in+so-called+%5Ctextit%7Bouter+vertical+mode%7D.+After+processing+%28typesetting%29%2C+these+boxes+are+appended+to+the+current+page+and+stacked+vertically+with+interline+glue+inserted+between+them%3A%0A%0A%5Chbox%7Bj%7D%0A%5Chbox%7Bp%7D%0A%5Chbox%7Bg%7D%0A%0ANow%2C+immediately+after+after+the+box+%5Cverb%7C%5Chbox%7Bj%7D%7C%2C+we+set+%5Cverb%7C%5Cprevdepth%7C+to+%5Ctexttt%7B-1000pt%7D+which+prevents+interline+glue+being+placed+between+the+boxes+%5Cverb%7C%5Chbox%7Bj%7D%7C+and+%5Cverb%7C%5Chbox%7Bp%7D%7C%3A+%0A%0A%5Chbox%7Bj%7D%5Csetlength%7B%5Cprevdepth%7D%7B-1000pt%7D%0A%5Chbox%7Bp%7D%0A%5Chbox%7Bg%7D%0A%0AObserve+that+interline+glue+%5Ctextit%7Bis%7D+placed+between+the+boxes+%5Cverb%7C%5Chbox%7Bp%7D%7C+and+%5Cverb%7C%5Chbox%7Bg%7D%7C+because+the+value+of+%5Cverb%7C%5Cprevdepth%7C+is+updated+after+%5Cverb%7C%5Chbox%7Bp%7D%7C+is+processed+and+added+to+the+list%3A+the+value+of+%5Cverb%7C%5Cprevdepth%7C+becomes+the+depth+of+the+box+%5Cverb%7C%5Chbox%7Bp%7D%7C.+When+%5Cverb%7C%5Chbox%7Bg%7D%7C+is+added+to+the+vertical+list+the+value+of+%5Cverb%7C%5Cprevdepth%7C+is+no+longer+%5Ctexttt%7B-1000pt%7D%3B+consequently%2C+interline+glue+can+now+be+added.%0A%5Cend%7Bdocument%7D)

此示例生成如下输出：

![演示 TeX 参数 \prevdepth 的示例](/files/cb91165fe0299f12d15ba2bafe5776417034ef66)

#### 零尺寸行间胶：\offinterlineskip

可以通过宏命令移除所有行间距 `\nointerlineskip`，其定义等价于：

```latex
\def\offinterlineskip{%
\baselineskip=-1000pt
\lineskip=0pt
\lineskiplimit=\maxdimen
}
```

注意 `\maxdimen` 是 `16383.99998pt`，这是 TeX 可使用的最大长度。

以下图示展示了核心行间胶计算以及该宏所使用的各种参数值 `\nointerlineskip`:

![offinterlineskip](/files/ec7ec05ba5e42925327112db81e9b3a56f9f1002)

以下图示展示了通过将 `\nointerlineskip` 宏的值代入胶计算而得到的伪代码片段。它演示了 `\nointerlineskip` 宏如何通过为 `\baselineskip` 和 `\lineskiplimit` 设置值，使行间胶始终为 `\lineskip` 胶，值为 `0pt`.

![offinterlineskip](/files/a0619f1cb549e6c0f3e6e432eb36050bf2acc5a0)

#### \offinterlineskip 和非零 \lineskip

该 `\nointerlineskip` 宏将 `\lineskip` 设为零，但如以下 Overleaf 项目所示，你可以将 `\nointerlineskip` 与非零值的 `\lineskip` 结合，以实现行距效果。

```latex
\documentclass{article}
\title{Demonstrating non-zero lineskip}
% 选择一个方便的小页面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
\begin{document}

\offinterlineskip % This sets \lineskip to 0pt

\setlength{\lineskip}{5pt} % We want non-zero \lineskip

\input text.tex % 一个生成的 TeX 文件，定义了宏
% \mytextA and \mytextB, each of which typesets a paragraph

\mytextA % Typeset a paragraph

% Now change \lineskip to a flexible glue value and typeset
% 另一个段落

\setlength{\lineskip}{5pt plus5pt minus5pt}

\mytextA

\end{document}
```

&#x20;将此示例作为 Overleaf LaTeX 项目打开

此示例生成以下输出：

![演示 LaTeX 的 \offinterlineskip 宏](/files/fa77c346889f4e4b3b02eff8a488e0d974eb1eca)

你可以将使用 `\offinterlineskip` 和 `\lineskip` （以及其他间距命令）的效果局限在一个组内：

```latex
\begingroup
\offinterlineskip
\setlength{\lineskip}{5pt}
……你的段落在这里

\endgroup
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/latex/zh-cn/ge-shi-hua/04-articles-how-to-change-paragraph-spacing-in-latex.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
