引号与破折号

破折号 — 之所以叫 em dash,是因为它的宽度正好是 1 em,也就是字号本身。在 10pt 文档里让 LaTeX 量一下,em dash 是 9.99756pt,与 \quad 连一个 scaled point 的差别都没有。连字符 -、en dash --、em dash --- 以及数学减号 $-$,是四个彼此独立的字符,只是长得像;它们宽度不同,甚至取自不同的字体。本页把四根横线实测出来并排放在一起,定下什么时候用 --、什么时候用 ---、什么时候必须进入数学模式。(引号本身由「引用」一页负责。)

------$-$ 是四个不同的字符——实测宽度

四者是彼此不同的字形,宽度分别是 3.33252pt、4.99878pt、7.7778pt、9.99756pt。这些数字取自一份加载了 T1 编码的 10pt article,用 \sbox0{-}\typeout{\the\wd0} 逐个量出。出人意料的是顺序。连字符短于 en、en 短于 em 在意料之中;但数学减号落在 en dash 与 em dash 之间。减号根本不是一根短横,而是为了在公式里与 =+ 取得平衡而设计的、相当长的符号。

输入名称宽度(10pt, T1)PDF 中的字符
-连字符3.33252pt(1/3 em)U+002D
--en dash(半角破折号)4.99878pt(1/2 em)U+2013
$-$减号(数学)7.7778ptU+2212
---em dash(全角破折号)9.99756pt(1 em = \quadU+2014

「en」「em」这两个名字,常被解释成来自字母 N 和 M 的宽度,但现代定义并非如此。在同一款 10pt 字体里量 M 得到 9.16443pt,N 是 7.49817pt。em dash(9.99756pt)比 M 还宽,en dash(4.99878pt)则比 N 窄得多。em 的实质不是字母宽度,而是活字字身的宽度,也就是字号本身,en 是它的一半。从金属活字时代留下来的只有名字。而数学减号根本不在正文字体里。正如 fontmath.ltx 中的 \DeclareMathSymbol{-}{\mathbin}{symbols}{"00} 所示,减号取自数学符号字体(Computer Modern 中是 cmsy)的第 0 号位置。所以你在正文里写的 -3 中那个「减号」,从字形上就是另一个东西。

latex
% measure them yourself: put this in the preamble-less body
\sbox0{-}\typeout{hyphen  = \the\wd0}
\sbox0{--}\typeout{en dash = \the\wd0}
\sbox0{$-$}\typeout{minus   = \the\wd0}
\sbox0{---}\typeout{em dash = \the\wd0}
\sbox0{\quad}\typeout{one em  = \the\wd0}

该用哪一个——范围用 --,插入语用 ---,复合词用 -

原则是:范围与配对用 en dash --,打断句子的插入语用 em dash ---,连接词语用一个连字符 -pages 5--101939--1945the Einstein--Podolsky--Rosen paradox 都表示「从 A 到 B」或「A 与 B 成对」,所以用 en dash。而 well-knownstate-of-the-art 这类复合词保留连字符,绝不要「订正」成 --。把稿件里的 - 一律替换成 -- 会把所有复合词一并毁掉,所以替换时一定要限定上下文,例如 数字-数字

em dash 的留白方式在不同语言里正好相反。美式英语(Chicago 体例)前后完全不留空格:a break---an aside---fits here。而许多英国出版社,以及德语(Gedankenstrich)和法语(tiret),反过来使用带空格的 en dashein Einschub -- so wie hier --。所以「紧排 ---」还是「加空格的 --」不是口味问题,而是该语言的排版习惯。为文档定下一种并贯穿全稿;两种混用会显得像一篇没译完的稿子。数学减号是唯一与语言无关的例外——永远用 $-$,也就是数学模式。

latex
See pages 5--10 and the 1939--1945 volumes.
A break---an aside---fits here in US English.
Ein Einschub -- so wie hier -- steht mit Spatien.
The value is $-3$, and $a - b$ uses the same minus.

\textendash\textemdash——什么时候必须用命令形式

输出完全相同。 \textendash 是 4.99878pt,\textemdash 是 9.99756pt,与 ----- 的实测值连一个 scaled point 都不差。那为什么还要有命令?因为 -- --- 是作为字体连字(ligature)实现的。在 T1 中,\textendash 位于编码位置 21、\textemdash 位于 22,是实实在在存在的字符(t1enc.def),命令就是「绕开连字机制、直接取出该字符」的通道。在连字被关闭的环境里,或者要把横线作为参数传给宏时,命令形式更可靠。

连字捣乱的典型场景是 \texttt。T1 编码的打字机字体(TeX Live 2024 默认是 cm-super 的 sftt1000)带有 -- 连字,于是 \texttt{5--10} 会悄悄变成 5–10,一个 en dash。更糟的是 \texttt{a---b} 得到 a–-b,即 en dash 加连字符——因为打字机字体没有 em dash 连字。OT1 的 cmtt10 没有这类连字,输入原样保留;但一份换个编码输出就变的代码是危险的。排版文件名、命令行、选项名时请用 \verb 而不是 \texttt,或者用空组打断连字:\texttt{5-{}-10}verbatim 环境和 \verb 即便在 T1 下也会原样输出 5--10

latex
% T1: this silently becomes an en dash
\texttt{ls --color}          % prints: ls –color
% either break the ligature ...
\texttt{ls -{}-color}
% ... or use verbatim, which never applies ligatures
\verb|ls --color|

行会在破折号后断开——\exhyphenpenalty 与阻止的办法

TeX 认为在显式连字符或破折号之后断行是允许的。此时的罚分是 \exhyphenpenalty,默认值为 50(可用 \the\exhyphenpenalty 查看)。由于单词内断字的罚分 \hyphenpenalty 同样是 50,5--10 中间或 well-known 中间被断开是常事。范围里的 10 掉到下一行行首,会让读者愣一下去想「10 是什么」。最简单的办法是装箱:\mbox{5--10}。若已加载 amsmath,也可以写 \nobreakdash-,只禁止那一根横线之后断行。

latex
\usepackage{amsmath}   % provides \nobreakdash
% ...
See pages \mbox{5--10} for the proof.
The X\nobreakdash-ray results are attached.

\slash\-——由你告诉 TeX 哪里可以断

\slash 输出/ 完全相同的字形,同时允许其后断行。它在 latex.ltx 中的定义只有一行:\def\slash{/\penalty\exhyphenpenalty},本质就是给斜杠加上与破折号相同的罚分。实测 a\slash ba/b 都是 15.55176pt,宽度毫无变化。当 input\slash output 这类长搭配在行尾溢出时,裸的 / 让 TeX 找不到断点,于是出现 Overfull \hbox 警告。\slash 就是只在那一处开一个折口的工具。

另一件工具是可选连字符(discretionary hyphen)\-:它表示「若在此断行,就打一个连字符」,不断行时什么也不输出。给 TeX 断字模式无法拆分的专名或复合词加上一个,往往一下子就消掉 Overfull \hbox。但有一个副作用。实测 man\-uscript 为 48.96027pt,而原样的 manuscript 是 48.68256pt,宽了 0.27771pt,因为该位置的字距微调(kern)被取消了。所以不要在一个词里到处撒 \-,只在真正需要的那一个词里放一处。关于用 \hyphenation 注册断字模式以及一般的断行调整,请见「调整断行」一页。

latex
The input\slash output layer is documented separately.
This manu\-script uses a discretionary hyphen once.

在 PDF 里分辨这四根——用 pdftotext 验证

与其用眼睛比对字形,不如把文本从 PDF 里抽出来按码位核对,这样更可靠。执行 pdftotext file.pdf - 把正文送到标准输出,四根横线会分别显示为四个不同的 Unicode 字符-(U+002D)、(U+2013)、(U+2014)、(U+2212)。把写着 - -- --- $-$ 的一行送进 pdftotext,返回的正是 - – — − 四个字符。之后再对这份输出用 grep,就能机械地找出所有仍用普通连字符的范围,以及混进正文的减号。这比逐行看源码更快,也便于交给审阅者。

terminal
# ranges still set with a plain hyphen
pdftotext paper.pdf - | grep -nE "[0-9]-[0-9]"

# a minus sign that leaked into running text
pdftotext paper.pdf - | grep -n "−"
  • 清查范围。 在源码里搜索 数字-数字(年份、页码、图号),把真正的范围改成 --。像 well-known 这样的复合词不要动。
  • 清查负号。 正文里的 -3-0.5 若表示数值,应写成 $-3$$-0.5$。在 PDF 侧确认没有残留为 U+002D 的。
  • 检查 \texttt 内部。 在 T1 下 \texttt{--} 会变成 en dash。命令行与文件名改用 \verb
  • 统一留白。 紧排的 --- 还是加空格的 --:按文档语言二选一,不留混用。

与本页并列的引号话题——用两个反引号得到弯引号“ ”的写法、直接敲 " 为什么会出错、csquotes\enquote、各语言的 „ “ 与 « »——由「引用」一页统一处理。清理粘贴来的稿件时,通常要同时看引号和破折号,所以两页并排着用最实际。