> 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-tw/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`的值，也就是在段落最後一行末尾加入的黏膠（glue）。

預設情況下， `parskip` 套件將 `\parindent` 到 `設為 0pt` ，並提供非零的 `\parskip` 值為 `.5[\baselineskip](#baselineskip-tex-primitive) plus 2pt`.

#### 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/15ee40a35a778d3878741a179b71aede6e311848)

請注意， `\parskip` 黏膠（glue）通常包含可伸展的 [黏膠成分](#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]

\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/45da71fabb48ab978210ee0c3e182debf652ece5)

### 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;[在此開啟 `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/58ae6d6e5ac69184d787b0e816276b96d337beb8)

**使用 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;[在此開啟 `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 一
\item 二
\item 三
\end{itemize}
\end{singlespace}%
清單已結束。
\end{minipage}\kern10pt%
\begin{minipage}{.4\textwidth}
\begin{singlespace*}
這裡是一個項目符號清單\par（\texttt{singlespace*} 環境）。
\begin{itemize}
\item 一
\item 二
\item 三
\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/674ea40a02216a95753e9c06a0d996a926dfe3d9)

**使用 \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/92f8c598d83ea3b98fb405447cfa86326deaa33e)

**使用 \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;[在此開啟 `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/977cd3b93cbdde0bea7478d21efdd049bf90c56a)

在下一節中，我們將檢視命令 `\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] % 這些行會受到 \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/1e297faa981630e56e29bef2dd772575b75c496f)

使用 `\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/b432db344a5205421e7a6a909d49d3b3a45afa65)

**示範 \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/871e44820465e8e4a31345eee1e148ffdb013412)

#### 在 setspace 套件中，「行距」如何定義與變更？

該 *精確的* 定義，以及 *衡量* 「行距」的方法，會因解讀方式而異，這可能導致軟體系統／應用程式中的各種實作方式。顯然， `setspace` 套件必須假設一個可行的行距定義，以便支援排版「單行間距」與「雙行間距」的文字，或任何其他倍數的行距。但 `setspace` 為了產生行與行之間有不同白空間的文字，

幸運的是， [tex.stackexchange 上的討論](https://tex.stackexchange.com/a/30106) 以及 [套件程式碼中的註解](https://tex.stackexchange.com/a/632830) 說明了 `setspace` 如何實作行距：它會設定 `\baselineskip` 的值，使用字型字級的倍數。

**字型與字級的簡短說明**

在特定字級下使用字型，表示要對這些字型中的字形（glyphs）套用 *縮放因子* ；一旦依字級縮放後，字元的可見大小便是字型設計（字體樣式）的函數。字級與字型中字形的實際顯示大小之間，沒有普遍且絕對的對應關係。

下圖顯示以 4 種不同字型排版、且皆以 *相同字級*顯示的小寫字母「abc」。請注意，即使它們都是以 *相同的* 字級排版，這些小寫字母的「大小」仍會依字型設計（字體樣式）而有所不同：

![相同字級下的各種字型](/files/b861ab300758254aebf5cfc41f6178c8bebb27f1)

#### 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 字型選項的 document class，以下範例比較 `\doublespacing` 與一個 `spacing` 使用我們計算出的值的環境 `1.618` 用於 `\baselinestretch`。不出所料， `\baselineskip` 數值相同（`22.00475pt`):

```latex
\begingroup
\doublespacing
\verb|\baselineskip|=\texttt{\the\baselineskip} (via \verb|\doublespacing)|

\blindtext[1]

\endgroup

\begin{spacing}{1.618}
\verb|\baselineskip|=\texttt{\the\baselineskip} (via \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/4265facc901ceea48ac5cd7b82cbabedbcff6673)

類似的計算 `\baselinestretch` 值也適用於其他字型大小與行距組合，如下表所列：

![setspace 參數](/files/fe1389cc6b72bc6be9237631212c23fe01000ca0)

## 使用 TeX/LaTeX 參數命令

以下各節將探討一些與段落間距／格式設定相關的命令：其中有些命令是 *內建於* TeX 排版引擎，其他則是 TeX/LaTeX 巨集。內建於 TeX 引擎中的命令稱為 *原始指令*，這表示它們是 *基本的* 以及 *不可再分解的* 因為與巨集不同，原始命令並不是由其他命令序列構成的。

特別是，我們將考慮多個原始 *參數命令* 這些命令受所有 TeX 引擎支援，包括 pdfTeX、XeTeX 和 LuaTeX。參數命令，不論是否與段落相關，都可用來 *取得目前值* 對應參數的值，或 *將該參數設為新值*。例如， `\parskip` 這個原始命令會決定一個參數的值，該參數控制兩個排版後段落之間插入的空白量。

若要 *取得* （此處是要排版出）目前的 `\parskip` 你可以寫：

```latex
\the\parskip
```

若要 *set* 目前的 `\parskip` 到 `1pt plus2pt` （一個可彈性伸縮的 glue）你可以寫成這樣：

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

我們也會討論一些有用的 TeX/LaTeX *巨集*，也就是由一系列組成命令撰寫並建構而成的高階命令。

### 用於段落間距的命令

以下命令（原始命令與巨集）可用來影響段落間距。其中一些會在更詳細的頁面中說明，可透過命令名稱的連結進入。

#### 原始命令

* [`**\parindent**`](#parindent-tex-primitive)：加到段落第一行的縮排（空白）量。
* [`**\parskip**`](#parskip-tex-primitive)：段落之間加入的可彈性空白（「glue」）量。
* [`**\rightskip**`](#leftskip-and-rightskip-tex-primitives)：插入於段落中每行右側的可彈性間距（glue）。
* [`**\leftskip**`](#leftskip-and-rightskip-tex-primitives)：插入於段落中每行左側的可彈性間距（glue）。
* [`**\baselineskip**`](#baselineskip-tex-primitive)：此參數的值有兩個用途：
  * 它設定段落中文字基線之間所需的距離；
  * 它用來計算行與行之間加入的（可變）空間（glue）量，以達成所需的基線到基線距離（[請見本文後文](#how-the-space-glue-between-paragraph-lines-is-calculated)).
* [`**\lineskiplimit**`](#lineskip-and-lineskiplimit-tex-primitives)：其值定義段落中相鄰兩行之間可接受的最小距離。
* [`**\lineskip**`](#lineskip-and-lineskiplimit-tex-primitives)：如果計算出的 `\baselineskip` glue 會使各行彼此過於接近，則在段落中兩行之間插入的空間（glue）量。
* `**\parfillskip**`：在段落最後一行末端加入的高度彈性 glue，藉此以空白「填滿」它；視覺範例請參考本節中的插圖 [*其他類型段落 glue 的視覺化*](#visualizing-other-types-of-paragraph-glue).

#### 巨集命令

以下 TeX/LaTeX 巨集命令常用於修改段落間距：

* [`**\offinterlineskip**` 以及 `**\nointerlineskip**`](#offinterlineskipandnointerlineskip)：可用來關閉計算與插入 `\baselineskip` glue；
* [`**\baselinestretch**`](#understanding-and-calculating-values-for-baselinestretch)：一個用來儲存數值因子的命令，該因子用於計算 `\baselineskip` 在選擇字型時的值。其預設值為 1；
* [`**\linespread**`](#demonstrating-linespread)：此命令可用來變更目前的 `\baselinestretch`.

### 可彈性調整的間距（glue）

TeX 引擎透過使用稱為 *glue* 的可彈性空白來達成各種間距效果，包括段落內或段落之間的間距；它可以依所需空間的多少而拉伸或壓縮。若你想了解 TeX 的 glue 概念，更多細節可參考以下 Overleaf 文章：

* [探索過小或過滿的方框與 badness 計算](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv)
* [TeX 如何在 \hbox 中計算 glue 設定](/latex/zh-tw/shen-ru-wen-zhang/24-how-tex-calculates-glue-settings-in-an-hbox.md)
* [理解過小與過滿方框警告](/latex/zh-tw/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{} 排版一個段落時，它會將每個個別字元視為具有特定寬度、高度與深度的 2D ``box''。\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/40437edd4ccd3dc6c4bd778995d10346366466d3)

### \parskip（TeX 原始命令）

透過以符合某些設計美感的空白量來分隔段落，可以提升文字的可讀性。TeX/LaTeX 允許使用者透過 `\parskip` 參數命令來控制段落間距。

* **來自 `parskip` 套件**： [parskip 套件的建議](https://ctan.org/pkg/parskip) 建議直接修改 `\parskip` 可能會「在意想不到的位置產生垂直空白」（在 LaTeX 文件中）。 `parskip` 套件試圖修正因 `\parskip`值變更而可能出現的間距問題—例如在目錄與清單環境中。另請參見本文的 [`parskip` 套件章節](#the-parskip-package).

若要手動設定 `\parskip` 的目前值，請 `\setlength` 使用 LaTeX 的

```latex
命令；例如，若要以 3pt 分隔段落，可以寫：
```

以下範例示範 `\parskip`:

```latex
\documentclass{article}
% 選擇一個方便的小頁面尺寸
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% 建立一個用來存放段落文字的命令
\newcommand{\testpar}{\noindent 目前 \texttt{\string\parskip} 的值是 \texttt{\the\parskip}。當 \TeX{} 排版一個段落時，它會將每個個別字元視為具有特定寬度、高度與深度的 2D~``box''。\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/2c867ac19eef9fd0e1559c2641f151394ac10076)

#### 可彈性調整的 \parskip

傳統上， `\parskip` 不是一個 *固定的* 值，因為那樣會使所有段落之間的空白都相同。相反地， `\parskip` 通常會定義為一種「可彈性調整的空間」（稱為 glue），使 TeX 能夠拉伸或壓縮段落之間的空間，協助內容適配頁面並找到頁面換頁的「良好」位置。

若要讓 `\parskip` 具有彈性，你可以將其寫成 glue 規格的形式：

`\setlength{\parskip}{*固定量* **plus** *拉伸量* **minus** *壓縮量*}`

其中 `**plus**` 以及 `**minus**` 是 *關鍵字* 供 TeX/LaTeX 用來識別 *拉伸量* 或 *壓縮量* 所包含的內容。Overleaf 文章 [*探索過小或過滿的方框與 badness 計算*](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv) 對 glue 有更深入的討論。

例如，若要讓 `\parskip` 在 `3 + 1 = 4pt` 以及 `3 — 1 = 2pt` 之間變動，你可以寫：

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

### \leftskip 和 \rightskip（TeX 原始命令）

TeX 引擎提供兩個參數命令，可在排版後段落的每一行左側與右側加入空間（glue）。顧名思義：

* `\leftskip` 在段落中每行左側插入空間（glue）；
* `\rightskip` 在段落中每行右側插入空間（glue）。

以下範例使用 `\leftskip` 以及 `\rightskip` 來直接修改段落對齊；然而……文字對齊的變更通常最好透過適當的 LaTeX 環境或套件來達成—例如，請參見 [Overleaf 上關於文字對齊的文章](/latex/zh-tw/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{第二個 leftskip 與 rightskip 範例}
% 選擇一個方便的小頁面尺寸
\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 glue](/files/df21bfe439a567ce6edfa6085ece62af7d3afd87)

下圖是上方範例所產生的第二個段落的註解版本，旨在突顯並顯示 `\leftskip` 以及 `\rightskip` 插入於段落各行中的 glue 數量，以及 `\parindent` 第一行的空間：

![在 LaTeX 中設定 \leftskip glue](/files/ed4d147b700930b34db77896c04d0eaa756cae3f)

請注意， `\leftskip` glue 具有固定大小（10pt），但 `\rightskip` glue 已被拉伸，以提供填滿每一行右側所需的任何空白量。這種「彈性」來自於 `\rightskip` 其中包含 `plus 1 fill`—提供一種「可無限拉伸」的 glue 形式。

#### 讓 \rightskip 固定、\leftskip 彈性

以下範例會產生兩個段落：第一個使用 LaTeX 對 `\leftskip` 以及 `\rightskip` 的預設值，而第二個段落則使用以下設定排版：

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

開啟以下 Overleaf 專案以查看輸出：

```latex
\documentclass{article}
\title{leftskip 和 rightskip 範例}
% 選擇一個方便的小頁面尺寸
\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 glue](/files/9de4d676ff1500a43a084835327e5ee4bfae801e)

下圖是上述範例所產生的第二個段落的註解版本，旨在突顯並顯示 `\leftskip` 以及 `\rightskip` 插入於段落各行中的 glue 數量，以及 `\parindent` 第一行的空間：

![在 LaTeX 中設定 \rightskip glue](/files/c693df9735b2f75a3edb1b387bb7f49a70e0fcca)

請注意， `\rightskip` glue 具有固定大小（10pt），但 `\leftskip` glue 已被拉伸，以提供填滿每一行左側所需的任何空白量。這種「彈性」來自於 `\leftskip` 其中包含 `plus 1 fill`—提供一種「可無限拉伸」的 glue 形式。

#### 將 \leftskip 和 \rightskip 設為彈性值

以下範例會產生兩個段落：第一個使用 LaTeX 對 `\leftskip` 以及 `\rightskip` 而第二個則使用以下彈性的 glue 設定：

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

這些設定會使段落各行置中：

```latex
\documentclass{article}
\title{leftskip 和 rightskip 範例}
% 選擇一個方便的小頁面尺寸
\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 設為「極度彈性」的 glue 設定
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
\vspace{20pt}

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

\end{document}
```

&#x20;將此範例作為 Overleaf LaTeX 專案開啟

此範例會產生以下輸出：

![顯示 \leftskip 和 \rightskip 的範例](/files/e91242662758a75cbfd3e41a5a4d347b4b013754)

下圖是上述範例所產生的第二個段落的註解版本，旨在突顯並顯示 `\leftskip` 以及 `\rightskip` 插入於段落各行中的 glue 數量，以及 `\parindent` 第一行的空間：

![顯示 \leftskip 和 \rightskip 的範例](/files/f3c3b7d611f4d1181f549bb1cda3f7914eac2af8)

請注意，兩者 `\leftskip` 以及 `\rightskip` 都被指定為 `0pt plus 1fill` 使它們同樣具有「無限彈性」；因此，它們會以相同的幅度拉伸，結果使排版後的各行置中。

#### 在群組中設定 \leftskip 和 \rightskip

以下範例說明如何透過將它們包在群組中來暫時變更 `\leftskip` 以及 `\rightskip` by enclosing them inside a group. In our example the group is created by `\begingroup`... `\endgroup`，如下方程式片段所示：

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

第一個段落使用「極度彈性」的 glue 來設定 `\leftskip` 以及 `\rightskip`:

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

，但第二個段落則使用 LaTeX 的預設值：

```latex
\documentclass{article}
\title{另一個 leftskip 與 rightskip 範例}
% 選擇一個方便的小頁面尺寸
\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 變更為「極度彈性」的 glue 設定
% 在由 \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/a57338fb770e2b4a3c8106b6f8fe7325344e6133)

**注意**：其設定（效果） `\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/042fc0eb12ee5e2114bcc3a9521c1f659ddfe7e0)

並加入註解來顯示由 `\baselineskip`:

![一個加入註解以顯示基線距離的 LaTeX 段落範例](/files/aeeff2648313ab553d69065cf6dc61cf6137e39f)

圖中也顯示行間的「glue」：即在行與行之間加入的計算後空白量—本文稍後會進一步討論。

#### \baselineskip 與其他參數

`\baselineskip` 是控制段落行間插入空間量的四個核心參數之一；其他三個是：

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

本文稍後將探討 [*這四個參數如何被用來*](#paragraph-structure-and-line-space-calculations) 計算行間 glue 值。

#### \baselineskip 範例（固定空間）

以下範例會在 Overleaf 中開啟並建立一個包含名為 `text.tex` 的檔案，該檔案定義了命令 `\mytextA` 以及 `\mytextB`—這兩個命令都會排版一個段落。為了方便起見，Overleaf 專案使用較小的頁面尺寸，因為這有助於為本說明頁製作圖形與圖片。

```latex
\documentclass{article}
\title{示範 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/d8a78275d915e64c403518ababb8f6cd95e29d71)

第 2 頁上的段落之所以有較大的行距，因為 `\baselineskip` 已設定為 24pt。

#### \baselineskip 範例（彈性空間）

以下範例指定了一個 `\baselineskip` 值，其具有極度彈性的（所謂「無限」）伸展成分：

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

由於這種彈性，段落各行之間的空白可以依所需伸展任意量，以填滿頁面。這種彈性會導致段落內各行文字之間的空間量差異很大，可能不夠美觀或不易閱讀。

```latex
\documentclass{article}
\usepackage{blindtext}
\title{彈性 \texttt{\string\baselineskip} 示範}
\author{Overleaf}
\date{2022年1月}

\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 膠料](/files/b24ca784c379933fc91375aa0cf3cd1044fcec09)

**關於膠料的幾點說明**

以下說明有些取自 Overleaf 文章 [探索不滿框或過滿框與 badness 計算](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv)，此處重現以供方便。

TeX 在段落各行之間插入的空白， `\baselineskip`，是一種稱為 *glue*的彈性間距形式。膠料值可由三個部分指定：

* 一個 *固定的* 固定量；
* 它可以 *伸展*;
* 它可以 *收縮*,

因此， `\baselineskip` 值可如下指定：

`\baselineskip`=*固定量* **加上** *拉伸量* **減去** *壓縮量*

其中

* **加上** 以及 **減去** 是 TeX 引擎可理解的關鍵字；
* *固定量* 被稱為 *正常成分* （也稱為 *自然寬度* 的
* *拉伸量* 被稱為 *伸展成分* ；
* *壓縮量* 被稱為 *收縮成分* 。

該 *固定量* 適用於所有膠料值，但 *拉伸量* 以及 *壓縮量* 都不是必需的——如果其中任何一個或兩者缺失，便會設為 0。

通常， `\baselineskip` 膠料會以 *固定量* 僅指定，伸展與收縮成分則為 0；否則段落各行的間距會不規則（可變），可能不夠美觀。

### \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) 以視覺化構成它的字元（glyph）、各行與膠料的邊界。我們將先以一小段圖示開始，幫助視覺化 TeX 引擎用來排版段落中文字的「盒子與膠料」模型。

### 段落結構

當 TeX 排版一個段落時，它會把單個字元視為迷你盒子，每個盒子都有自己的寬度、高度與深度，而這些字元盒子的寬度會用來計算最佳的換行位置。此外，文字中的空白字元（用來分隔個別單字）會轉換成一種彈性空間（膠料），提供達成每次換行所需的間距。

以下 7 張圖示顯示了排版後段落的核心組成：各種盒子與膠料。第一張圖示顯示一個排版後的段落，以及一個帶註解的版本，凸顯段落內的各種元素。不過，帶註解的段落包含大量資訊，因此後續圖示會將各種組件分開，以（希望能）讓它們更容易理解。

![Paragraphanatomy1b.png](/files/3493df8d4ba1ad51d1b3540b8f3a5e4bf4783ff3)

* 下一張圖示將段落各行描繪成灰色盒子，盒子之間由以水平綠色條帶表示的膠料分隔。該膠料經計算以確保基線到基線的距離等於（也就是） `\baselineskip`:

![Paragraphanatomy2b.png](/files/cd15045e463d7df82e85eb6e2e000d1bc98648af)

* 下一張圖像將排版後字元表示為盒子：用來視覺化 TeX 引擎如何處理字元，以產生換行：

![Paragraphanatomy3.png](/files/785cf39445ade06845116dc5d972135d17697202)

* 下一張圖像顯示盒子中再包盒子：較大的段落各行（盒子）中包含較小的盒子（單個字元）：

![Paragraphanatomy5.png](/files/bc448ff584d52d8d62ea5357ad5230151b155f4f)

* 下一張圖像顯示每行中單字之間的空間量：這些字間空白是透過將空白字元轉換成可伸展或可收縮的彈性膠料而產生，以便為每行文字產生正確長度。請注意，這些空白的大小會逐行變化：

![Paragraphanatomy4.png](/files/87d527e1af799873fc8dd6410b94b75da64ffd79)

* 下一張圖像結合了字元盒子與置於各單字之間對應的膠料（空白）：

![Paragraphanatomy6.png](/files/b64ae068c2b6cec9a7ace4a3f26916ed574ffd2b)

### 其他類型段落 glue 的視覺化

以下各段落也使用 LuaTeX 進行排版與處理，以顯示一對段落內與段落之間的其他類型膠料。請注意 `\rightskip` 以及 `\leftskip` 都設為 0pt，因此不會顯示：

* **`\parskip`** 膠料（淺藍色）放置在兩個排版後段落之間；
* 個別單字之間由 ***字間膠料*** （黃色）分隔，這是由將輸入中的空白字元轉換成排版輸出中可變大小的空白（膠料）所產生。來自字間空白的膠料會被伸展或收縮，以達成視覺上美觀的換行；
* **`\baselineskip`** 膠料（淺綠色）放置在各行之間—— `\baselineskip` 膠料的確切數量是用下面討論的機制計算得出；
* **`\lineskip`** 膠料（紅色）用於第二段——原因是倒數第二行中包含較低的盒子；
* **`\parfillskip`** 膠料（深綠色）放置在每個段落最後一行的行尾。

![](/files/901a5e79cf90453c31f3e7258fa6d0edffe34e25)

### 處理較深（或較高）的行（盒子）

如上一節中的圖示所示， [前一節](#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}
% 設定一些重要參數
\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 膠料的範例](/files/273d0680be1dac8172281afe7b874498faf6bb33)

下列圖示使用了前述 Overleaf 專案產生的段落註解版本。此處我們放大以聚焦最後一行段落，標示出 `\lineskip` 膠料（以紅色顯示）是由位移文字盒子的深度所造成：

![顯示 TeX \lineskip 膠料的圖像](/files/7c5dafa7ca98bf07106403257d911538b60a3755)

段落文字的最後一行具有比平常更大的深度，使 TeX 無法維持由值 `\baselineskip` 所指定的固定基線到基線距離（12pt）。如圖示右側箭頭所示，TeX/LaTeX 嘗試確保各行成對之間的固定距離（12pt）——也就是 `\baselineskip`的值。不過，對最後一對行來說，TeX 讓它們相隔的距離大於 12pt，並使用 `\lineskip` 的值作為行間膠料，而不是使用 `\baselineskip`.

計算得到的值。

### 段落各行之間的空白（膠料）如何計算

以下各節將探索並說明 TeX 對行間膠料值的計算細節。 *目前我們只會* 非常簡短地

提到 TeX 的頁面建構流程，儘管是以高度簡化的方式！當 TeX 完成段落排版、完成斷字並決定換行後，你可以把該段落資料想成儲存在暫時的記憶體位置中。接著 TeX 需要將該段落資料逐行移到新的記憶體位置，該位置存放的是要輸出到目前頁面的內容。 *下* 朝頁面底部。當它把段落各行轉移到目前頁面時，TeX 會嘗試確保這些行等距排列，具有一致的垂直（基線到基線）間距，等於值 `\baselineskip`。當一個新行被轉移到目前頁面時，TeX 引擎會暫時記錄該行的 *深度* ，因為它將用來計算該行與其後方行之間的行間膠料（空白）量。

#### 膠料大小計算

先來總結 TeX 引擎提供的行間間距功能：

* 維持基線之間的固定距離，此距離等於 `\baselineskip`;
* 為高度或深度相對較大的任何行提供間距；
* 可切換關閉行間膠料的插入——可自動或由使用者控制。例如：
  * TeX 引擎會在垂直模式中的 rule 之後自動停用行間膠料的插入；
  * 巨集 `\offinterlineskip` 以及 `\nointerlineskip` 允許使用者暫時關閉行間膠料的插入——這些巨集的效果不同，稍後會看到。

是否加入行間膠料，以及若要加入，加入哪一種類型及其數量，決定方式如下：

* 是否應加入行間膠料？TeX 會透過測試 *最後加入的行的深度* 是否小於特殊值 `–1000pt` （點）。請注意 `–1000pt` 是 TeX 引擎內部使用的任意「哨兵」值。
  * **注意**：TeX 內部記錄的「最後加入的行的深度」值，也稱為「前一深度」。TeX 引擎提供參數指令 `\prevdepth`——在某些情況下可用來 *取得* 或 *set* 「前一深度」的值。巨集 `\nointerlineskip` 利用了 `\prevdepth`.
* TeX 會測試 `前一行的深度是否大於 –1000pt`?
  * ***是*** （需要加入膠料）：
    * 計算 Δ 值，其中 Δ = \baselineskip –（前一行的深度）–（下一行的高度）
    * 將 Δ 與 `\lineskiplimit`的值比較，該參數用來定義兩行之間可接受的最小距離，以兩行的上下邊緣距離來衡量。
    * 如果 Δ < `\lineskiplimit`:
      * ，表示行距太近，因此插入的最小可接受間距為 `\lineskip`
    * 如果 Δ >= `\lineskiplimit`:
      * ，表示行距不會太近，因此以 Δ 作為要插入的膠料量
  * ***不是*** （不要加入膠料）：
    * 在不插入任何膠料的情況下堆疊下一行（盒子）

下列圖示總結了行間膠料流程：

![TeX 如何決定行間膠料值](/files/74856b25e67063610f60844d84abcd100c21a252)

### 行間膠料計算範例

在以下範例中，我們假設 TeX/LaTeX 使用下列指令參數值：

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

我們將檢視此段落前兩行的行間膠料計算：

![OLV2glue-calcs-step0.png](/files/68c1ec7272644df0f9cbd9a1c10fc3756cacc3ac)

在下一張圖中，TeX 引擎已處理第一行段落，並將其移到正在建立的垂直清單中。它會追蹤該行的深度（`d<sub>1</sub>`）其值為 `2.1528` （點）：

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

接著，TeX 準備將第二行加入正在建立的清單：該行具有高度（`h<sub>2</sub>`）其值為 `6.9444` （點）以及，順帶一提，深度 `d<sub>2</sub>` 的 `0` （點）：

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

此時，TeX 需要計算要插入這兩行之間的空間量（膠料， `g<sub>1</sub>`）：

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

下圖顯示這一對行的膠料計算：

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

最後一張圖顯示這兩行已移到目前頁面上，並在它們之間放置了計算出的行間膠料量：

![OLV2glue-calcs-step5.png](/files/3650da03c6acc3f60536b78f3542a5a6a0efc1b2)

### 另一個參數：\prevdepth

如上所述，當 TeX 正在建立盒子的垂直堆疊（清單）時，它會儲存加入該清單的最後一個盒子的深度。這個被儲存的深度值稱為「前一深度」，可透過參數指令 `\prevdepth`.

該 `\prevdepth` 指令可用於 ***僅*** 在 TeX 處於垂直模式時；也就是在段落之間或在垂直盒子內： `\vbox`, `\vtop` 或 `\vcenter` （注意： `\vcenter` 盒子只能在數學模式中使用）。

`\prevdepth` 可讀寫「前一深度」的值：

* 若要讀取 `\prevdepth` 的目前值，可以寫：

```latex
\the\prevdepth
```

* 若要設定 `\prevdepth` 到 `的目前值`，也就是某個長度值，單位可以是 pt、mm 等，你可以寫：

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

如果你試圖在不適合的情況下使用 \verb`\prevdepth` ，例如在段落內或在 `\hbox` 內部，你會得到一個錯誤

```latex
不當的 \prevdepth。
```

並附帶額外資訊，告訴你它只能在垂直模式中使用。

#### 避免行間膠料：\prevdepth 與 \nointerlineskip

\prevdepth 的一個用途是 `\prevdepth` 用來 *防止* TeX 執行用於在垂直清單中的項目之間加入行間膠料的基線計算，例如段落各行。使用 `\prevdepth` 來表示 `前一行的深度` ，我們可以將（上圖所示的）膠料計算重述如下：

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

     if(Δ < \lineskiplimit)
       行間膠料 = \lineskip
     else
       行間膠料 = Δ
}
else
{
     在不加入
     任何行間膠料的情況下堆疊該盒子
}
```

在內部，TeX 引擎會辨識一個所謂的「哨兵」值 `\prevdepth` ，可用來停用行間膠料的計算與加入。那個哨兵值是 `–1000pt`，可在上面的偽程式第一行看到：

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

除非 `\prevdepth` 大於 `–1000pt`——這提供了 `\nointerlineskip` 巨集所使用的機制，以防止在垂直清單中下一對盒子之間加入基線膠料。

`\nointerlineskip` 的定義等同於：

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

請注意， `\nointerlineskip` 提供了 *一次性停用* 行間膠料計算，因為 `\prevdepth` 的值會在新盒子被加入目前垂直清單時持續更新，如下例所示：

```latex
\noindent 下列 \verb|\hbox| 會在 \TeX{} 處於所謂的 \textit{外部垂直模式} 時被處理。處理（排版）後，這些盒子會附加到目前頁面，並在它們之間插入行間膠料後垂直堆疊：

\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/840ebcfb14ccf4be7f5d6ede2460920028df577b)

#### 零尺寸行間膠料：\offinterlineskip

可以透過巨集指令移除所有行間間距 `\nointerlineskip`，其定義等同於：

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

請注意， `\maxdimen` 是 `16383.99998pt`，即 TeX 可使用的最大長度。

下列圖示顯示核心行間膠料計算，以及巨集 `\nointerlineskip`:

![offinterlineskip](/files/45c529b03d9fdc5d0864c36d09dfaf3081ce475a)

下圖顯示將 `\nointerlineskip` 巨集值代入膠料計算後所得到的偽程式片段。它示範了 `\nointerlineskip` 巨集如何透過設定 `\baselineskip` 以及 `\lineskiplimit` 的值，使行間膠料永遠會是 `\lineskip` 膠料，值為 `設為 0pt`.

![offinterlineskip](/files/0cbfc28a5ccfeba576a2e02cbdb13248f01a9fbd)

#### \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 改成一個彈性膠料值並排版
% 另一個段落

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

\mytextA

\end{document}
```

&#x20;將此範例作為 Overleaf LaTeX 專案開啟

此範例會產生以下輸出：

![示範 LaTeX 的 \offinterlineskip 巨集](/files/08cddba2ae03a65b116a49a52f60a3d674f1ac07)

你可以將 `\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-tw/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.
