行距 (setspace)

本页说明如何放宽或收紧正文的行距(行铅,即 *leading*)。简短结论是:论文或学位论文需要“双倍行距”时,与其自己调整长度,不如使用 setspace 宏包\onehalfspacing / \doublespacing,更简单也更安全。我们会先看底层机制 \baselineskip\baselinestretch,再看较低层的 \linespread,最后介绍 setspace 的清晰写法。

模型:baselineskip 与 baselinestretch

行距本质上是相邻两行的 基线(字母所坐落的不可见基准线)之间的距离。这个距离保存在名为 \baselineskip 的长度中,LaTeX 会根据当前字号自动设置。默认情况下,\baselineskip 约为字号的 1.2 倍(10pt 字号约为 12pt)。也就是说,行与行并不是紧贴在一起的,默认就已经留有舒适的间隔。

作用在 \baselineskip 上的 倍率\baselinestretch。它不是长度,而是一个 命令(数值宏),默认值为 1.0。实际行距由 “\baselineskip × \baselinestretch” 决定。不过有一个陷阱:修改 \baselinestretch 只有在下一次字体切换时才会生效。放在导言区通常没问题,因为文档开始时会发生字体选择;如果在正文中途修改,就需要额外注意(见下文)。

低层的 \linespread 及其陷阱

LaTeX 内核提供的低层命令是 \linespread{倍率}。它的内部含义实际上就是 \renewcommand{\baselinestretch}{倍率},也就是只改写 \baselinestretch。因此它继承同一性质:在下一次字体切换之前不会生效。放在导言区会影响整篇文档;如果写在正文中,则需要在希望生效的范围后调用 \selectfont(重新选择当前字体的命令)。

latex
% プリアンブルに置けば文書全体に効く
\linespread{1.3}   % 約 1.5 倍相当の行間

% 本文の途中で変えるなら \selectfont が要る
{\linespread{1.6}\selectfont
  この段落だけ行間を広げる。\par}

第二个陷阱是:\linespread{1.5} 并不会得到“1.5 倍行距”。 这个倍率乘在 \baselineskip 上,而 \baselineskip 本身已经约为字号的 1.2 倍,所以可见行距变成“字号 × 1.2 × 倍率”。常见经验是,所谓 双倍行距(行距约为字号的 2 倍)需要接近 1.6 的倍率,而 1.5 倍行距约需 1.3(1.2 × 1.6 ≈ 1.9,1.2 × 1.3 ≈ 1.56)。这种“倍率”和“实际可见行距”之间的偏差,是直接使用 \linespread 时最容易混淆的地方。

推荐做法:setspace 宏包

标准解法是 setspace 宏包(Geoffrey Tobin 与 Robin Fairbairns 编写,现在由 David Carlisle 等维护)。加载 \usepackage{setspace} 后,就可以用一组 声明式命令 切换行距。默认是单倍行距,记住下面三个命令就足以覆盖大多数需求:

  • \singlespacing — 单倍行距(标准行距)。
  • \onehalfspacing — 1.5 倍行距。
  • \doublespacing — 双倍行距。

在导言区写一行就会作用于整篇文档。需要任意倍率时,使用 \setstretch{1.6},它会直接设置相当于 \baselinestretch 的值(\setstretch{1} 是单倍,\setstretch{1.5} 约为 1.5 倍,\setstretch{2} 约为双倍)。

document.tex
\documentclass[12pt]{article}
\usepackage{setspace}
\doublespacing            % 文書全体をダブルスペースに
% \onehalfspacing         % 1.5 行送りにするならこちら
% \setstretch{1.6}        % 任意の倍率
\begin{document}
本文がダブルスペースで組まれます。
\end{document}

setspace 使用的倍率并不像 \linespread 那样固定写死,而是会 根据正文基准字号(10pt / 11pt / 12pt)调整。下表列出 \onehalfspacing\doublespacing 内部设置的 \baselinestretch 值(这些值针对 Computer Modern 系字体调校,并跟随类选项中给出的字号):

正文字号\onehalfspacing\doublespacing
10pt1.251.667
11pt1.2131.618
12pt1.2411.655

要点是:\doublespacing 并不是字面上把 \baselineskip 翻倍。 它的倍率约为 1.6–1.7,使 *可见* 行距约等于字号的 2 倍。学位论文规定中的“双倍行距”通常指的正是这种 \doublespacing(行距约为字符尺寸的 2 倍),而不是字面上把 \baselineskip 乘以 2。

为什么用 setspace:脚注、题注和浮动体保持单倍

相比 \linespread,推荐 setspace 的最大原因是它 不会把不该放大的部分也放大。直接使用 \linespread(也就是 \baselinestretch)会同时拉大正文、脚注和图表题注;但按照排版惯例,脚注、题注、陈列公式周围等位置应保持 单倍行距

setspace 会替你处理这一点:其文档明确说明 “双倍行距在脚注和浮动体(图、表)内部会关闭”。内部实现上,它会在脚注文本(\@footnotetext)和浮动体(\@xfloat)中把 \baselinestretch 恢复为单倍,并提供单倍行距的 quote 环境。因此正文会变宽松,而脚注和题注会自动保持紧凑。

只改变某一部分的行距

如果只想改变文档某一部分的行距,可以把声明放在 { ... } 分组中局部使用,也可以使用 setspace 提供的 环境。与 \singlespacing 等声明对应,局部区域可用 singlespaceonehalfspacedoublespace 环境,任意倍率则用 spacing 环境(如 \begin{spacing}{2.5})。注意 onehalfspacedoublespace 是用于 *增大* 行距的,因此不适合在已经双倍行距的文档中再使用 onehalfspace

下面是一个例子:正文使用双倍行距,而较长引用恢复为单倍行距。

document.tex
\documentclass[12pt]{article}
\usepackage{setspace}
\doublespacing                 % 本文はダブルスペース
\begin{document}
本文はダブルスペースで組まれる。続いて引用を置く。

\begin{singlespace}            % この引用だけ単独スペースに
  ここは長めの引用なので、行間を詰めて単独スペースで組む。
  引用ブロックは本文より行間を狭くするのが一般的。
\end{singlespace}

引用のあとは、また本文のダブルスペースに戻る。
\end{document}

还要注意:不要为了“缩小”行距而直接设置 \baselineskip 本身。任何字号变化都会重新建立 \baselineskip,从而抹掉你的设置。通过 \baselinestretch / setspace 以 倍率 控制行距更安全,因为它会随字号变化一起调整。