同样的内容,用 LaTeX 排出来的文档就是显得「像本正经书」。原因大半集中在一个数字上——\textwidth 的 345pt。标准的 article 类不管纸张是 A4 还是 US Letter,都把正文宽度停在这里,剩下的全部让给页边。实测下来,一行大约 75 个字符,比排版经典所说的「理想值 66」略宽一些,而这个「略宽」是有来由的。本页实地测量那些决定 LaTeX 外观的数字,让你看清自己的文档为什么显得业余,以及该改哪里。
一行多少个字符才好——实测默认的 article
在 TeX Live 2024 上把 \lipsum[1-12] 灌进 \documentclass[a4paper]{article},再从输出 PDF 里抽取文字来数,得到的是平均每行 75.1 个字符(99 行,最长 85)。排版经典、Robert Bringhurst 的《The Elements of Typographic Style》(1992 年)记下了公认的说法:单栏正文以 45 到 75 个字符为令人满意的行长,66 个被视为理想。也就是说,默认的 article 正卡在可接受范围的上沿。它并非不好读——但第一处可改之处就藏在这里。
| 正文宽度 | 实测每行字符数 | 评价 |
|---|---|---|
250pt | 54.5 | 偏窄;相当于脚注、边注或双栏中的一栏 |
280pt | 61.3 | 舒适;略低于理想的 66 |
305pt | 约 66 | 经典视为理想的行长;适合长篇阅读 |
320pt | 69.9 | 仍在范围内;论文正文常见的宽度 |
345pt | 74.5 | article 的默认值;范围的上沿 |
400pt | 85.8 | 眼睛开始找不回下一行的行首 |
450pt | 93.7 | 用 geometry 压缩页边后最常见的失败 |
Bringhurst 还传下了一种不用工具的测法。用正文字体把小写 a 到 z 连排一行,这串的宽度就是字母表长度,而一行的长度应当在 2 到 3 个字母表之间。用 \settowidth 实测,10pt 的 Computer Modern 里 a–z 是 127.58pt。345pt 正好是它的 2.70 倍,于是这套判断与按字符数得到的结论一致:接近上限,但仍在范围内。妙处在于这套推理可以移植。中文与日文里「一行三十几到四十几个全角字最好读」的经验,说的正是同一个「二到三个字母表」。
% narrow the measure toward the classic 66 characters per line
\usepackage[a4paper,textwidth=305pt]{geometry}
% or keep A4 and state the margins instead
\usepackage[a4paper,margin=45mm]{geometry}有意思的是,把正文字号调大,每行字符数几乎不变。在 11pt 与 12pt 上重复同一实测,\textwidth 分别扩到 360pt 和 390pt,而每行是 70.1 与 70.0 个字符。也就是说,标准类在放大字号的同时把宽度一并放大,让以字符计的行长几乎恒定——而且这个值比 10pt 时更靠近理想的 66。若你正为可读性发愁,先试 [11pt] 是最省事的一手,比动 geometry 更该排在前面。
article 的页边为什么那么宽
答案不是「页边被特意留宽了」,而是先定死正文宽度,剩下的全归页边。为标准类设定尺寸的 size10.clo,会把「纸宽减去左右各一英寸」与 345pt 相比,取较小者作为 \textwidth。无论 A4(597.51pt)还是 US Letter(614.30pt),这个减法的结果都大于 345pt,于是两种纸上的正文宽度都正好是 345pt。纸变大,增加的只有页边——所谓「A4 页边好宽」,说的就是这件事。
% size10.clo (LaTeX 2024): the measure is a hard cap, not a fraction of the page
\setlength\@tempdima{\paperwidth}
\addtolength\@tempdima{-2in}
\setlength\@tempdimb{345\p@}
\ifdim\@tempdima>\@tempdimb\relax
\setlength\textwidth{\@tempdimb} % A4 and US Letter both land here
\else
\setlength\textwidth{\@tempdima}
\fi这里要纠正一个流传甚广的说法。常见的解释是「345pt 是为 Letter 定的,不适合 A4」——但代码根本不看纸张。上限本身与用纸无关,所以 A4 和 Letter 的正文宽度完全相同。若按比例看,页边更宽的反而是 Letter:页边占纸宽的 42.3%(A4)与 43.8%(Letter)。而如果你觉得 345pt 太挤,那是比错了对象。高德纳的 plain TeX 默认 \hsize=6.5in,即 469.75pt,按同样的量法一行超过 90 个字符。LaTeX 从那里砍掉了四分之一以上才落到 345pt。宽页边不是偷懒的结果,而是把行长拉回可读一侧的那个决定所留下的副产物。
文件里还留着一处有意思的化石。size10.clo 有一段为兼容旧的 LaTeX 2.09 而设的分支,那里根本不做运算,直接写着 \setlength\textwidth{345\p@}。345 这个数本来就是常量,把它当作随纸张判断的上限,是后来才套上去的机制。由此得到实务上的准则:想找回页边空间时,别徒手加宽 \textwidth。一加宽,正文宽度就直接变成行长,你会掉进上表 400pt、450pt 那两行。要腾地方,就用 geometry 改从页边一侧指定,把行长留在 66 到 75 的带子里,把空间从上下页边挤出来。
只加一行就能改变外观——microtype
\usepackage{microtype} 这一行,在本页所有手段里性价比最高。以 11pt 的 article、T1 编码、行长 180pt、\lipsum 的一百个段落为条件实测,overfull box 从 128 个降到 15 个,而页数只从 43 页减到 42 页。可见它并不是在硬压篇幅。它让标点探出纸边一根头发丝(protrusion),把字形宽度在不到百分之一的范围内伸缩(font expansion),词间距的起伏因此变平,那些本来要你动手去修的地方就不再出现了。原理留给专门的页面讲;这里要说的是,几乎没有理由不载入它。
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc} % load this before microtype
\usepackage{microtype}
\usepackage[textwidth=320pt]{geometry}可以用几种字体——克制最管用
实务上的答案至多三种:正文一种,标题用同一种或与之成对的一种,代码一种等宽。看着业余的文档通常败在两件事之一——行太长,或者字体太多——而后者更容易一眼认出:正文一种、标题另一种、强调再一种、图题又是一种。LaTeX 的默认字体 Computer Modern 出自高德纳本人之手,笔画细、对比强。看着雅致,但笔画一细,在粗糙的印刷或小屏幕上就容易显得发虚。若要替换,lmodern(把 Computer Modern 的轮廓整理过的后继者)、libertinus、newtx 都是稳妥之选,且都能把正文、标题、公式配成一套。换正文字体时要连公式字体一起换——只换正文、把公式留在 Computer Modern,是最常见的事故。
首行缩进还是段间空行——两个都做就露怯
标示段落分界的办法有两种,规矩是只选其一。标准类的默认是「首行缩进、段间无空白」:实测 \parindent 在 10pt 时是 15pt,11pt 时 17pt,12pt 时 17.62pt;而 \parskip 是 0pt plus 1pt——本身为零,只留下一丝伸展量供分页时调节。可是有人觉得段落挤,就单独加一句 \setlength{\parskip}{1em},于是缩进与空白同时生效,分界被宣告了两遍,读者的目光就会被绊住。若想用空白分隔,务必同时写上 \setlength{\parindent}{0pt},或者载入替你两头都照顾到的 parskip 宏包。
% pick ONE of these two, never both by accident
% (a) indent, no vertical space -- the standard-class default, nothing to write
% (b) vertical space, no indent:
\usepackage{parskip}还有一项要提:行距。标准类的 \baselineskip 在 10pt 时是 12pt,11pt 时 13.6pt,12pt 时 14.5pt——大约是字号的 1.2 倍。行长加宽却把行距原样留着,眼睛就找不回下一行的行首。请把二者当成一对来想:行加长,行距也要放开;反过来,要压紧行距就同时压紧行长。(投稿规定要求「1.5 倍行距」之类时,具体做法归行距那一页。)段落看着业余还是老练,差别几乎都落在这三样的搭配上——行长、行距、以及段落分界的标法。
不该动的东西——别用 \vspace 和 \\ 去修
到此为止的所有调整,都是在导言区一次性完成的。与之相对的规矩是:不要在正文里打补丁——插一个 \vspace{1cm} 去挪图的位置,用 \\ 断行让标题看起来整齐一点。理由不是审美而是力学:LaTeX 的断行与分页是通盘看完整篇文档、找出最优折点的,一旦用手钉死一处,后面的段落和页面就会整体错位。截稿前那种「改好一处、坏掉一处」的消耗,正是从这里来的。正文里写结构,外观在导言区定;守住这个分工,每次修改就永远只是一处。
归纳一下次序:先把行长送进 66 到 75 的带子(用 [11pt] 或 geometry 的 textwidth);再加上 microtype 那一行;要换字体,正文与公式一起换;段落只在缩进与空白之间挑一个。这四步能让大多数文档从「用 LaTeX 排的」变成「为了被读而排的」。剩下的微调请放在导言区而不是正文,而且放在最后一起做。