上下装饰

\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 的线会避开下伸部——yg 这类垂到基线以下的字母——所以永远不会把它们切开。它们还是 极少数能干净嵌套的装饰\overline{\overline{z}} 能规规矩矩地排成双线。实测中,\overline{z} 高 6.30544 pt,双层则为 8.30533 pt——每叠一层约抬高 2 pt。

latex
\[
  \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 挂标签靠的是与求和号相同的机制。

latex
\[
  \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)} 的帽子就只能盖住式子的一部分。

latex
\[
  \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}\vecfontmath.ltx 中声明为 \DeclareMathAccent{\vec}{\mathord}{letters}{"7E},是 一个字母宽的固定重音,所以 \vec{AB} 会把小箭头实际上只压在 B 上方。相比之下,\overrightarrow 是自己搭建箭头:轴身用 \rightarrowfill——以 \cleaders 铺满减号再加上箭头——因此 宽度没有上限。向左的是 \overleftarrow,双向的是 \overleftrightarrow。放在下方的 \underrightarrow\underleftarrow\underleftrightarrow 需要 amsmath

latex
\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;即便加在多个字母上也不会伸长,而是按单个符号的大小居中放置。这里有一条古典约定:给 ij 加记号会 与字母本身的点相撞,所以要以无点的 \imath\jmath 为底。写 \hat{\imath},就只剩下一个干净的尖角。

命令放置什么会伸长吗?
\hat尖角(抑扬符)固定;宽版是 \widehat
\tilde波浪号固定;宽版是 \widetilde
\bar短横线(长音符)固定;整个式子请用 \overline
\vec小的向右箭头固定;宽箭头是 \overrightarrow
\dot \ddot一个点、两个点固定;\dddot\ddddot 需 amsmath
\acute \grave锐音符与钝音符固定
\check \breveháček(ˇ)与短音符(˘)固定
\mathring小圆环(˚)固定
\imath \jmath无点的 i 与 j重音的底座,如 \hat{\imath}

这里有一点提醒。重音叠加不会好看。\hat{\vec{x}} 这样叠两层,上面那个记号往往会飘着、太高,或者偏离中心——能舒服嵌套的,大概只有前面说的 \overline\underline。若只是想多加几个点,就用 \ddot,或 amsmath 的 \dddot\ddddot。若确实需要两种不同的记号叠在一起,就用下一节的 \overset 显式搭建,或者交给专门的宏包。想微调位置时,fontmath.ltx 里还备有 \skew

latex
\[
  \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

区别在于 是否继承底座的类别\stackrellatex.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

latex
\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

latex
\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 的轴身不会伸长
  • ij 加记号 → 以无点的 \imath\jmath 为底