\widehat 究竟能伸到多长?答案是:1.44 em,到此为止。LaTeX 的宽帽子在 cmex10 这套字体里 只有三个字形,按 10 pt 折算宽度为 5.55557 pt、10.00002 pt 和 14.44447 pt。没有第四个,所以把它盖到 \widehat{f(x+y+z)} 这样的长式子上,帽子就干脆停止生长,孤零零地停在中间。相比之下,\overline、\overbrace 和 \overrightarrow 是用线条拼接而成的,可以无限伸长。凡是能放在式子上方或下方的东西,都落在「会伸」与「不会伸」这条界线的某一侧;选错了边,版面就坏了。本页用测量数据划出这条界线,并一路讲到 \overset、\stackrel 与 \xrightarrow 的取舍。
会伸还是不会伸:\hat、\widehat 与 \overline 的区别
三者的区别在于 字形从哪里来。查看 fontmath.ltx 可知,\hat 是取自 operators(正文罗马体)的单字母重音,\widehat 是取自 largesymbols(cmex10)的可变宽重音,而 \overline 根本不是字符,而是一条 线。所以 \hat{x} 固定为一个字母宽,\widehat{xy} 会在三档中挑出仍放得下的最大一档,\overline{xyz} 则精确按内容宽度画出。实测:对宽 60 pt 的材料使用 \overline,线正好 60 pt;对同样的材料使用 \widehat,帽子仍是 14.44447 pt。
| 分类 | 命令 | 行为 |
|---|---|---|
rules & braces | \overline \underline \overbrace \underbrace | 由线条拼接而成——可无限伸长 |
extensible arrows | \overrightarrow \overleftarrow \overleftrightarrow | 轴身由 \rightarrowfill 拼接——没有上限 |
wide accents | \widehat \widetilde | 仅三个字形——到 14.44447 pt 为止 |
fixed accents | \hat \tilde \bar \vec \dot \ddot 等 | 固定为一个字母宽——完全不伸长 |
arbitrary material | \overset \underset \stackrel \xrightarrow | 可放任意符号并缩小;只有 \xrightarrow 会伸长轴身 |
为整个式子画线:\overline 与 \underline
\overline{…} 在参数上方、\underline{…} 在下方画出一条 与内容等宽的线。二者都属标准 LaTeX,无需宏包。它们用于补集、复共轭,或者只是发出「把这一段看成一个整体」的信号。\underline 的线会避开下伸部——y、g 这类垂到基线以下的字母——所以永远不会把它们切开。它们还是 极少数能干净嵌套的装饰:\overline{\overline{z}} 能规规矩矩地排成双线。实测中,\overline{z} 高 6.30544 pt,双层则为 8.30533 pt——每叠一层约抬高 2 pt。
\[
\overline{a + b} = \overline{a} + \overline{b}, \qquad
\underline{x + y}, \qquad \overline{\overline{z}} = z
\]用花括号标出范围:\overbrace{…}^{…} 与 \underbrace{…}_{…}
横向的花括号横跨式子的上方或下方,再用 ^ 或 _ 在其外侧挂上标签。\overbrace 与 \underbrace 属标准 LaTeX,花括号会伸到内容的全宽。之所以能挂标签,是因为它们在 fontmath.ltx 中的定义以 \mathop{…}\limits 收尾。做成 \mathop 才能使用 ^ 与 _;而写死的 \limits 使上下位置 即便在行内公式中也不变。换句话说,\overbrace 挂标签靠的是与求和号相同的机制。
\[
\underbrace{1 + 2 + \cdots + n}_{n \text{ terms}}
= \frac{n(n+1)}{2}
\qquad
\overbrace{x + x + \cdots + x}^{k}
\]标签里若要写单词,因为身处数学模式,需用 \text{…}(来自 amsmath)包住。而那个 \limits 是有代价的。实测 $\underbrace{a+b}_{n}$ 的 深度为 14.19992 pt。素的 $a+b$ 只有 0.83333 pt,而 10 pt 文档的行距 \baselineskip 是 12 pt——所以 放在行内时,它比整整一行的行距还要深,会把前后行撑开。因此花括号理应用在陈列式中。若非要放进正文,写成 \underbrace{a+b}\nolimits_{n} 会把标签移到右侧,深度回落到 8.53328 pt。顺带一提,在求和号下叠两行条件的 \substack 属于邻近话题,由大型运算符那一页负责。
\widehat 与 \widetilde 在哪里停止生长
上限是 14.44447 pt,在 10 pt 文档中约合 1.44 em。fontmath.ltx 中的声明 \DeclareMathAccent{\widehat}{\mathord}{largesymbols}{"62} 指向 cmex10 的第 "62 号字形,并由此串连到 "63、"64。用 \fontcharwd 测得三者的宽度为 5.55557 pt、10.00002 pt、14.44447 pt。TeX 会挑出 不超过内容宽度的最大字形,所以材料窄于 14.44447 pt 时会用较小的帽子;一旦更宽——无论宽多少——都保持最大的那一个并居中放置。\widetilde 的三个字形宽度相同。因此 \widehat{x}、\widehat{xy} 看着自然,而 \widehat{f(x+y+z)} 的帽子就只能盖住式子的一部分。
\[
\widehat{x + y} \neq \hat{x} + \hat{y}, \qquad
\widetilde{ab}, \qquad
\overline{f(x+y+z)} % use a rule once the hat runs out
\]在式子上方画箭头:\overrightarrow 与 \vec 的陷阱
要写有向线段 AB,请用 \overrightarrow{AB},而不是 \vec{AB}。\vec 在 fontmath.ltx 中声明为 \DeclareMathAccent{\vec}{\mathord}{letters}{"7E},是 一个字母宽的固定重音,所以 \vec{AB} 会把小箭头实际上只压在 B 上方。相比之下,\overrightarrow 是自己搭建箭头:轴身用 \rightarrowfill——以 \cleaders 铺满减号再加上箭头——因此 宽度没有上限。向左的是 \overleftarrow,双向的是 \overleftrightarrow。放在下方的 \underrightarrow、\underleftarrow、\underleftrightarrow 需要 amsmath。
\usepackage{amsmath} % needed for \underrightarrow and friends
\[
\vec{a} \quad \text{vs.} \quad \overrightarrow{AB},
\qquad \overleftrightarrow{PQ}, \qquad \underrightarrow{x}
\]给单个字母加的固定重音:\dot、\bar、\hat 与 \imath
固定重音是 用来修饰单个字母的工具:\dot 表时间导数,\ddot 表二阶导数,\bar 表均值或共轭,\hat 表估计量,\tilde 表近似——理工科文章里不断出现的记号都聚在这里。它们全属标准 LaTeX;即便加在多个字母上也不会伸长,而是按单个符号的大小居中放置。这里有一条古典约定:给 i 或 j 加记号会 与字母本身的点相撞,所以要以无点的 \imath、\jmath 为底。写 \hat{\imath},就只剩下一个干净的尖角。
| 命令 | 放置什么 | 会伸长吗? |
|---|---|---|
\hat | 尖角(抑扬符) | 固定;宽版是 \widehat |
\tilde | 波浪号 | 固定;宽版是 \widetilde |
\bar | 短横线(长音符) | 固定;整个式子请用 \overline |
\vec | 小的向右箭头 | 固定;宽箭头是 \overrightarrow |
\dot \ddot | 一个点、两个点 | 固定;\dddot、\ddddot 需 amsmath |
\acute \grave | 锐音符与钝音符 | 固定 |
\check \breve | háček(ˇ)与短音符(˘) | 固定 |
\mathring | 小圆环(˚) | 固定 |
\imath \jmath | 无点的 i 与 j | 重音的底座,如 \hat{\imath} |
这里有一点提醒。重音叠加不会好看。 像 \hat{\vec{x}} 这样叠两层,上面那个记号往往会飘着、太高,或者偏离中心——能舒服嵌套的,大概只有前面说的 \overline 和 \underline。若只是想多加几个点,就用 \ddot,或 amsmath 的 \dddot、\ddddot。若确实需要两种不同的记号叠在一起,就用下一节的 \overset 显式搭建,或者交给专门的宏包。想微调位置时,fontmath.ltx 里还备有 \skew。
\[
\dot{x}, \quad \ddot{x}, \quad \bar{x}, \quad \hat{p},
\quad \tilde{a}, \quad \check{s}, \quad \hat{\imath}, \quad \vec{\jmath}
\]\overset 与 \stackrel 的区别:实测相差 1.11109 pt
区别在于 是否继承底座的类别。\stackrel 在 latex.ltx 中定义为 \mathrel{\mathop{#2}\limits^{#1}},所以无论给它什么,结果 一律是关系符。amsmath 的 \overset 借助 \binrel@ 检查底座,再 按二元运算符就是二元运算符、关系符就是关系符 重新排出。实测:a\overset{f}{+}b 为 21.79968 pt,与 a\mathbin{+}b 完全一致;a\stackrel{f}{+}b 为 22.91077 pt,与 a\mathrel{+}b 一致。相差的 1.11109 pt,正是 4 mu 的中空与 5 mu 的粗空之差在两侧累加的结果。若底座本来就是 = 这类关系符,两者结果相同——所以 拿不准就用 \overset。
\usepackage{amsmath} % \overset, \underset, \overunderset
\[
A \overset{f}{\longrightarrow} B, \qquad
X \underset{n \to \infty}{\longrightarrow} x, \qquad
a \overset{\text{def}}{=} b, \qquad
\overunderset{a}{b}{X}
\]\overset{上}{底座} 会把任意符号或表达式以小号排在底座上方,\underset{下}{底座} 则排在下方。第二个参数是底座,第一个参数是要添加的内容;添加的部分以 scriptstyle(与上下标相同的尺寸)排版,因此不必额外处理就会变小。若要上下都放,可以嵌套使用,但 amsmath 还提供了 \overunderset{上}{下}{底座},写起来更易读。与固定重音的区别在于:放什么由你自由决定。另外注意与上下标的对比:^ 与 _ 位于符号的 右上与右下,而 \overset/\underset 放在 正上方与正下方。
承载文字并随之伸长的箭头:\xrightarrow 与 \xleftarrow
要给箭头命名,请用 amsmath 的 \xrightarrow{…} 而不是 \stackrel。原因在宽度。带长标签时,A\xrightarrow{\text{very long label}}B 量得 79.12704 pt,因为 轴身本身会伸长到标签的宽度。若把同一标签用 \stackrel 压在 \longrightarrow 上,整体是 72.7536 pt,但下方的箭头仍是固定的 37.25343 pt——于是 文字从箭头两端溢了出去。\xrightarrow 还接受方括号里的可选参数:写 \xrightarrow[n \to \infty]{f} 就能同时把映射名放上方、条件放下方。向左的形式是 \xleftarrow。
\usepackage{amsmath}
% mathtools adds \xLeftarrow, \xhookrightarrow, \xmapsto and more
\[
A \xrightarrow{\;f\;} B \xleftarrow{\;g\;} C,
\qquad a_n \xrightarrow[n \to \infty]{} L
\]- 只装饰一个字母 → 固定重音(
\hat、\bar、\dot、\vec) - 覆盖整个式子 →
\overline、\overrightarrow;\widehat到 14.44447 pt 封顶 - 用花括号标出范围 →
\overbrace{…}^{…}、\underbrace{…}_{…};请放在陈列式中 - 行内使用
\underbrace→ 14.19992 pt 的深度会撑开行距;用\nolimits把标签挪到旁边 - 在上下放任意符号 → amsmath 的
\overset、\underset、\overunderset - 给箭头命名 →
\xrightarrow{…};\stackrel的轴身不会伸长 - 给
i或j加记号 → 以无点的\imath、\jmath为底