> For the complete documentation index, see [llms.txt](https://overleaf-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://overleaf-pro.ayaka.space/latex/zh-cn/ge-shi-hua/04-articles-how-to-change-paragraph-spacing-in-latex.md).

# 段落格式

## 引言

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

* 使用诸如以下 LaTeX 宏包的最佳实践，也是推荐的方法 [`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) 帮助您安全地更改文档中段落之间插入的空白。其设计旨在确保目录、列表环境和显示标题等文档结构不会受到非零值的 [`\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` 值为 `并提供一个非零的`.

#### parskip 宏包示例

下面的示例演示了该 `parskip` 宏包的一些用法。选择“在 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 % 使用 \par 强制新段落
\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 % 使用 \par 强制新段落
\blindtext[1]

通过 \texttt{indent} 选项设置了 \verb|\parindent| 的值，因此现在它是 \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*` 来调整单倍行距，以适应在某些字体下排版的文本行距——这些字体的字形（“glyphs”）在给定字号下相对较小或较大。请参见 [*关于字体和字号的简短说明*](#brief-notes-on-fonts-and-point-size) 一节，其中有一个示例演示了在给定字号下字体字形大小的变化；
* 该 **`spacing`** 环境提供自定义间距，并需要一个参数：要使用的 [`\baselinestretch` 值](#demonstrating-baselinestretch) ；例如：

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

#### setspace 宏包示例

下面的示例演示了该 `setspace` 宏包：点击“在 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;[在 Overleaf 中打开此 `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 页，因此最好通过下方提供的“在 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;[在 Overleaf 中打开此 `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` 环境旨在“……为 itemize 和 quote 环境周围提供更好的垂直间距”。 `singlespace*` 下面的示例使用两个

环境中包含的项目列表，并排放置，以演示由 `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;[在 Overleaf 中打开此 `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;[在 Overleaf 中打开此 `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 默认单倍行距}
一些普通文本。 \blindtext[1]
\setmainfont{TeX Gyre Pagella}
\section*{TeX Gyre Pagella 默认单倍行距}
这里是一些普通文本。 \blindtext[1]
\section*{TeX Gyre Pagella 调整后的单倍行距}
注意：我们需要在写入
\verb|\SetSinglespace{1.1}|\SetSinglespace{1.1}\singlespacing
\begin{singlespace*}
这里是一些普通文本。 \blindtext[1]
\end{singlespace*}
```

&#x20;[在 Overleaf 中打开此 `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)。这种缩放通常在 *TeX* 使用字体选择命令时应用——例如 `\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] % 这些行受 \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 它（目前）并没有产生任何效果：新的 \verb|\baselinestretch| 值已被存储，但尚未被应用。我们可以发出 \verb|\selectfont| 命令使更改生效；但目前，\verb|\baselineskip| 的值仍然是 \the\baselineskip{}（未变）。

如果现在执行 \verb|\selectfont|，将使对 \verb|\baselinestretch| 的更改、将其设为 2.5 立即生效——即使我们正处于段落中间。现在，\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| 不是 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` 的值。

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

在特定字号下使用字体意味着将该字号的 *缩放因子* 应用于这些字体中的字形（glyphs）；一旦按字号缩放后，字符的可见大小就是字体设计（字形设计）的函数。字号与字体中字形的实际显示大小之间并不存在统一、绝对的关系。

下图展示了用 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                                                             |
| 14.5pt      | 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}%
  这段文字将使用俄语。这是为了演示西里尔字母在生成的文档中能够正确显示。
}
```

使用一个 `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 的类似计算 `\baselinestretch` 数值也适用于其他字体大小和行距组合，如下表所列：

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

## 使用 TeX/LaTeX 参数命令

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

特别地，我们将考虑若干原语 *参数命令* ，所有 TeX 引擎都支持，包括 pdfTeX、XeTeX 和 LuaTeX。参数命令，无论是否与段落相关，都用于 *获取当前值* 对应参数的，或 *将该参数设为一个新值*。例如， `\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 文章：

* [探索不足盒或过满盒以及 badness 计算](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv)
* [TeX 如何在 \hbox 中计算胶设置](/latex/zh-cn/shen-ru-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**` 已 *keywords* 由 TeX/LaTeX 用来识别 *拉伸量* 或 *收缩量* 所包含的胶规范。Overleaf 文章 [*探索不足盒或过满盒以及 badness 计算*](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| 提供一个非常灵活的“伸展”分量：\verb|\baselineskip=12pt plus1fil|。\baselineskip=12pt plus1fil
\section{引言}
添加一个段落，它现在会伸展以填满页面。 \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 glue](/files/614b69bf2c20743713218b932e32d260e45b20d2)

**关于 glue 的几点说明**

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

TeX 在段落行之间插入的空白， `\baselineskip`，是一种称为 *胶*。一个 glue 值可以由三个部分指定：

* a *固定的* 长度；
* 一个它可以 *伸展*;
* 一个它可以 *收缩*,

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

`\baselineskip`=*固定长度* **加上** *拉伸量* **减** *收缩量*

其中

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

该 *固定长度* 对于所有 glue 值都需要，但 *拉伸量* 和 *收缩量* 二者都是可选的——如果其中一个或两个缺失，它们都会被设为 0。

通常， `\baselineskip` glue 通过一个 *固定长度* 仅指定时，伸展和收缩分量为零，否则段落行的间距会不规则（可变），这可能不太美观。

### \offinterlineskip 和 \nointerlineskip（宏）

这些宏通常用于防止在段落各行之间插入行间 glue。想了解更多细节的读者可以直接跳到相关文章部分，那里解释了这些宏如何工作。

* **`\offinterlineskip`**：参见文章部分 [*零大小的行间 glue：\offinterlineskip*](#zero-sized-interline-glue-offinterlineskip).
* **`\nointerlineskip`**：参见文章部分 [*阻止行间 glue：\prevdepth 和 \nointerlineskip*](#preventing-interline-glue-prevdepth-and-nointerlineskip).

## 段落结构和行间距计算

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

### 段落结构

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

下面这 7 幅图展示了排版段落的核心组成部分：各种类型的盒子和 glue。第一幅图展示了一个排版后的段落以及一个带注释的版本，突出显示了段落中的各个元素。不过，带注释的段落包含大量信息，因此后续图示会将各个组件分开，以（希望能）使其更易理解。

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

* 下一幅图将段落各行表示为灰色盒子，并用由水平绿色条表示的 glue 分隔。该 glue 的计算目的是确保基线到基线的距离等于（即其值为） `\baselineskip`:

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

* 下一幅图将排版后的字符表示为盒子：用于可视化 TeX 引擎如何处理字符以生成断行：

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

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

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

* 下一幅图显示每一行中单词之间的空白量：这些词间空白是通过将空格字符转换为可伸展或可收缩的灵活 glue 来生成的，以便为每行文本生成正确的长度。请仔细注意，这些空白的大小会随行而变化：

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

* 下一幅图将字符盒和对应的 glue（空格）结合起来，放在各个单词之间：

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

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

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

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

![](/files/445cec7ab38916ce86f7fbec963015bb56044102)

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

正如 [上一节](#paragraph-structure)，排版后的段落是由“盒子”垂直堆叠而成的，它们之间由一些空白分隔，TeX 将其称为“glue”。随着段落被处理，以及各行（盒子）被堆叠，垂直列表（堆栈）会以一种 *向下的* 方向增长，朝向页面底部。尽管 TeX/LaTeX 会尽量确保段落各行按基线以恒定距离堆叠， `\baselineskip`但并不总能做到，因为某些行可能具有比平常更大的高度或深度。

每个段落行的高度和深度由该行内容超出或低于基线的最大距离决定；因此，包含相对较大高度或深度内容的段落，例如行内公式或图形，很可能会产生相应高度和/或深度较大的单独行。对于这样的行，TeX/LaTeX 可能无法将它们堆叠到使其基线与其他行之间相隔 `\baselineskip` 这样的距离。显然，TeX/LaTeX 需要一种“回退机制”来处理这些行，通过 *计算* 为受较大高度和/或深度影响的每对行之间插入合适的空白量。

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

该回退机制涉及参数命令 `\lineskip` 和 `\lineskiplimit` 以及一个称为 `\prevdepth`的第三个参数。想了解更多细节的读者可以跳到文章部分 [*段落行之间的空白（glue）是如何计算的*](#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}
% 设置一些重要参数
\setlength{\baselineskip}{12pt}
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
% 定义 \testpar 的输入文件
\input testpar.tex
\title{用于 lineskip 的示例段落}
\begin{document}
\testpar % 在 Overleaf 项目中创建的宏
\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 glue 的示例](/files/38ee12bec29fc43e4497ccc7d6c0545ccb887ab4)

下图使用了上一个 Overleaf 项目生成的段落的带注释版本。这里我们放大并聚焦于最后一行，指出使用了 `\lineskip` 由移位文本框的深度引起的 glue（以红色显示）：

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

段落文本的最后一行具有比平常更大的深度，导致 TeX 无法保持由该值指定的恒定基线到基线距离 `\baselineskip` (12pt)。如图右侧箭头所示，TeX/LaTeX 尝试确保各行对之间保持固定距离（12pt）——也就是 `\baselineskip`。然而，对于最后一对行，TeX 将它们分隔得超过 12pt，并使用 `\lineskip` 作为行间 glue，而不是使用根据 `\baselineskip`.

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

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

就目前而言，我们将 *非常简要地* 提一下 TeX 的页面构造过程，不过会以非常简化的方式！一旦 TeX 完成了一个段落的排版，即完成连字并确定断行，你可以把该段落数据看作存储在一个临时内存位置中。然后 TeX 需要将该段落数据逐行移动到一个新的内存位置，该位置存放着要输出到当前页面的内容。

当 TeX 逐行移动段落数据时，实际上是在构建一个逐渐增长的行（TeX 盒子）垂直堆栈，它会 *向下的* 朝页面底部增长。当它将段落各行移动到当前页面时，TeX 会尽量确保这些行等距排列，保持一致的垂直（基线到基线）间距，其值等于 `\baselineskip`。当新的一行被转移到当前页面时，TeX 引擎会临时记录该行的 *深度* ，因为它将用于计算该行与其后面那一行之间的行间 glue（空白）数量。

#### Glue 大小计算

让我们先总结一下 TeX 引擎提供的行间间距特性：

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

是否添加行间 glue，以及如果要添加，添加多少、添加哪一种，其决定过程如下：

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

下图总结了行间 glue 过程：

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

### 行间 glue 计算示例

在下面的示例中，我们假设 TeX/LaTeX 正在使用以下命令参数值：

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

我们将查看该段落前两行的行间 glue 计算：

![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 需要计算要插入的空白量（glue， `g<sub>1</sub>`）以插入这两行之间：

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

下图展示了这对行的 glue 计算：

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

最后一幅图显示这两行被移动到当前页面，并在它们之间放置了计算出的行间 glue：

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

### 另一个参数：\prevdepth

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

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

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

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

```latex
\the\prevdepth
```

* 要设置当前值 `\prevdepth` 更改为 `某个值`，例如某个以磅、毫米等表示的长度，你可以写：

```latex
\setlength{\prevdepth}{某个值}
```

如果你尝试使用 \verb`\prevdepth` 在它未被设计用于的情形下，例如在段落内或在一个 `\hbox` 你将得到一个错误

```latex
不正确的 \prevdepth。
```

并附带额外信息，告诉你它只能在垂直模式下使用。

#### 阻止行间 glue：\prevdepth 和 \nointerlineskip

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

```latex
如果(\prevdepth > –1000pt)
{
     Δ = \baselineskip — \prevdepth —（当前行的高度）

     如果(Δ < \lineskiplimit)
       行间 glue = \lineskip
     否则
       行间 glue = Δ
}
否则
{
     堆叠该盒子而不添加
     任何行间 glue
}
```

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

```latex
如果(\prevdepth > –1000pt)
```

TeX 不会添加行间 glue，除非 `\prevdepth` 大于 `–1000pt`——这正是 `\nointerlineskip` 宏用来防止在垂直列表中的下一对盒子之间添加基线 glue 的机制。

`\nointerlineskip` 的定义等价于：

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

请注意 `\nointerlineskip` 提供了一种 *一次性禁用* 行间 glue 计算的方式，因为 `\prevdepth` 的值会随着新的盒子添加到当前垂直列表中而不断更新，正如下面的示例所示：

```latex
\noindent 当 \TeX{} 处于所谓的 \textit{外部垂直模式} 时，下面这些 \verb|\hbox| 会被处理。处理（排版）之后，这些盒子会附加到当前页面，并在它们之间插入行间 glue 进行垂直堆叠：

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

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

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

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

&#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)

#### 零大小的行间 glue：\offinterlineskip

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

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

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

下图展示了核心行间 glue 计算以及宏 `\nointerlineskip`:

![offinterlineskip](/files/ec7ec05ba5e42925327112db81e9b3a56f9f1002)

下图展示了通过替换 `\nointerlineskip` 宏值到 glue 计算中所得到的伪代码片段。它演示了 `\nointerlineskip` 宏通过设置以下值来工作的方式 `\baselineskip` 和 `\lineskiplimit` 使得行间 glue 将始终为 `\lineskip` glue `设为`.

![offinterlineskip](/files/a0619f1cb549e6c0f3e6e432eb36050bf2acc5a0)

#### \offinterlineskip 和非零 \lineskip

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

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

\offinterlineskip % 这会将 \lineskip 设为 0pt

\setlength{\lineskip}{5pt} % 我们希望 \lineskip 非零

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

\mytextA % 排版一个段落

% 现在将 \lineskip 改为一个灵活的 glue 值并排版
% 另一个段落

\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://overleaf-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.
