重音符号与特殊字母

输入 \'e 得到 é,输入 \"o 得到 ö。LaTeX 的 accent 命令——锐音符、变音符(umlaut)、波浪号、háček——名字只有 一个字符,而且那个字符本身就是标点。LaTeX 里没有别的命令是这样命名的。这是键盘打不出 é 的年代留下的设计,底层是 Knuth 写进 plain TeX 的 \accent 原语。本页用来查每个命令实际输出什么:16 个文本 accent 命令、并非 accent 的字母(\ss\ae\oe\aa\l)、无点的 \i\j,以及公式用的 \hat\bar\vec\dot。此外还有表格显示不出来的一点:fontenc 是否选 T1,不只决定能排出哪些符号,还决定 带 accent 的单词能不能断词——下面用实测数据说明。

16 个 accent 命令,各自输出什么

文本模式的 accent 共有 16 种,每一种都 以一个字母为参数\'o\'{o} 输出相同的字符,花括号可省略。放在字母上方的 11 个——锐音符、抑音符、扬抑符、分音符、波浪号、长音符、上点、短音符、háček、双锐音符、上圈——直接来自 Knuth 的 plain TeX,由 \accent 原语构成。挂在下面的 \c(软音符)、\d(下点)、\b(下横线),跨两个字母的 \t(连接符),以及 \k(ogonek),机制则不同。

命令输出名称备注
\'oó锐音符OT1 与 T1 皆可
\`oò抑音符反斜线加反引号
\^oô扬抑符法语的 â ê î ô û
\"oöumlaut / 分音符德语 ä ö ü,法语 ë ï
\~nñ波浪号西班牙语 ñ,葡萄牙语 ã õ
\=oō长音符转写与词典中的长元音
\.oȯ上点波兰语 ż、立陶宛语
\u oŏ短音符罗马尼亚语 ă、韵律标记
\v cčháček / caron捷克语 č š ž
\H oő双锐音符匈牙利语 ő ű,俗称「匈牙利变音符」
\r o上圈\r a 即 å,与 \aa 同字
\c cç软音符(下)法语 ç,土耳其语 ç ş
\d o下点由叠印合成,不是字体中的单个字形
\b o下横线同样是叠印;用于转写
\t ooo͡o跨两字母的连接弧唯一取自 TS1/OML 的 accent,参数为两个字母
\k aąogonek(下钩)仅 T1 可用;波兰语 ą ę
latex
% braces are optional for a single letter, required for a command
r\'esum\'e, na\"ive, se\~nor, G\"odel, \c{c}a va, \H{o}r\'an
% two-letter argument: the tie accent
t\t{oo}k

出现 Command \k unavailable in encoding OT1.

这个错误的意思是,你要的 accent 在当前生效的字符编码中不存在。pdfLaTeX 的默认编码仍是 1980 年代的 OT1,其中没有 \k(ogonek)。解决办法只有一行:在导言区加 \usepackage[T1]{fontenc}。还有别的命令同样如此——在 TeX Live 2024 上实测,\dj\DJ(克罗地亚语 đ)、\th\TH(冰岛语 þ)、\dh\DH(ð)、\ng\NG(ŋ)都会给出完全相同的提示。

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}   % without this, \k \dj \th \dh \ng all error
\begin{document}
Polish: j\k{e}zyk. \quad Croatian: \dj\ \quad Icelandic: \th\ \dh
\end{document}

不过真正的代价并不在会报错的命令上,而在 不报错的那些 上。OT1 里没有单个的 é,于是 LaTeX 用 \accent 合成:把锐音符放到 e 上。但对 TeX 而言,\accent 是连字与紧排(kerning)链条中断的边界。实测:OT1 下 AV 宽 13.8889pt,而 \'AV(Á 后接 V)为 15.00003pt——A 与 V 之间 1.11113pt 的紧排整个消失了。改用 T1 后,Á 是单一字形,AV\'AV 都是 13.8855pt。

断词上的差别更明显。运行 \showhyphens{universit\'e r\'esum\'e},OT1 给出 uni-ver-sité résumé——résumé 完全没有断点。同样的输入改用 T1 编译,结果是 uni-ver-sité ré-sumé。当一篇 accent 密集的文档(法语、波兰语、捷克语,或只有人名带 accent 的英文论文)行末总是空得难看时,原因多半在此。反过来说,用 pdfLaTeX 排西文时,\usepackage[T1]{fontenc} 不是锦上添花,而是必需品。

无点的 \i\j:16 个命令里只有 7 个真的需要

先说结论:你几乎不需要写 \"{\i}。翻看 ot1enc.deft1enc.def 可以看到,对锐音符、抑音符、扬抑符、分音符和上点这 5 个 accent,LaTeX 已经通过 \DeclareTextComposite / \DeclareTextCompositeCommand 自动把参数里的 i 换成无点 i。在 TeX Live 2024 上实测,\"i\"{\i} 都得到完全相同的 ï,宽度同为 3.33252pt。真正需要你手写 \i 的,是余下 7 个:\~\=\u\v\H\r\k

latex
% the dot is removed automatically for these five
na\"ive \quad \'idem \quad \`ile \quad \^ile \quad \.i
% here you must ask for the dotless letter yourself
\v{\i} \quad \u{\i} \quad \={\i} \quad \~{\i} \quad \H{\j}

\i\j 并不是 accent 的组成部分,而是 本身就是字母。它们在 OT1 中位于 16、17 号位,在 T1 中位于 25、26 号位;单独写 \i 就得到无点 i(ı)。在土耳其语这类把无点 i 当作独立字母的语言里,它不是装饰而是拼写的一部分。公式模式中的对应命令名字不同、模式也不同:\imath\jmath

\ss \ae \oe \o \aa \l——它们是字母,不是 accent

这一组不带参数,因为 ß、æ、ø、ł 并不是带 accent 的元音,而是各自语言中 独立的字母。大写形式就是把命令名首字母大写:\AE\OE\O\AA\L。唯有 \SS 是例外:在 TeX Live 2024 上,无论 OT1 还是 T1,它输出的都是 「SS」两个字母,而不是大写 ßlatex.ltx 中的默认定义正是 \DeclareTextCommandDefault{\SS}{SS})。若需要德语大写 eszett ẞ,可靠做法是在 Unicode 引擎上使用含该字形的字体。

命令输出语言备注
\ssß德语\SS 给出 SS 两个字母,而非 ẞ
\aeæ丹麦语、古英语大写为 \AE
\oeœ法语cœur、sœur;大写为 \OE
\oø丹麦语、挪威语大写为 \O;与公式中的 \emptyset 不同
\aaå瑞典语、挪威语\r a 同字;大写为 \AA
\lł波兰语OT1 下靠叠画合成;只有 T1 才是真正的字形
\djđ克罗地亚语、越南语需要 T1;大写为 \DJ
\thþ冰岛语需要 T1\dh 得 ð,\ng 得 ŋ
\ijij荷兰语ij 合字;大写为 \IJ

\l 是本节里唯一 会影响 PDF 内部数据 的差别。OT1 的 \l 并不是真正的 ł,而是在 l 上叠画一小道斜线合成的;把 TeX Live 2024 生成的 PDF 交给 pdftotext抽取出来的只是一个 l。改用 T1,真正的 ł 位于 170 号位,检索和复制粘贴都正常。下方 accent 的 \d\b 也一样:\d o(ọ)从 PDF 中抽出来是 o.。正文里看着对了往往就够了,但对书目数据和需要检索的词就不够。

正文里写 \hat{x} 会得到 ! Missing $ inserted.——公式 accent 是另一套

文本 accent 与公式 accent 在名称和实现上完全分属两套,越界会在两个方向都报错,而且措辞不同,正好可以用来判断原因。正文里写 \hat{x} 会得到 ! Missing $ inserted.;反过来在公式里写 $\'e$ 会得到 ! Please use \mathaccent for accents in math mode.(两者均在 TeX Live 2024 上实测)。前者是 TeX 好意替你打开公式模式却失败;后者则直接点名:那个 accent 属于文本。

命令外观典型用途备注
\hat{x}尖帽估计量、单位向量可伸缩形式为 \widehat
\tilde{x}波形近似值、变换后的量可伸缩形式为 \widetilde
\bar{x}短横线样本均值、复共轭覆盖整个表达式用 \overline
\vec{v}小的右箭头向量\vec{AB} 不会伸长;应用 \overrightarrow
\dot{x}一个点一阶时间导数自牛顿以来的力学记法
\ddot{x}两个点二阶时间导数加速度
\dddot{x}三个点三阶时间导数需要 amsmath\ddddot 为四个点
\acute{x}锐音符语言学,偶尔用于数学与文本的 \' 形状相同
\grave{x}抑音符语言学,偶尔用于数学与文本抑音符形状相同
\check{x}v 形(háček)几何与代数中的标记如 Čech 上同调的 Č
\breve{x}碗形(短音符)几何与代数中的标记常与 \check 配对使用
\mathring{x}小圆圈几何标记、内部(开核)相当于 \r 的公式版
latex
\usepackage{amsmath}   % \dddot, \ddddot
\[
  \dot{x}, \quad \ddot{x}, \quad \bar{x}, \quad \hat{p},
  \quad \tilde{a}, \quad \vec{v}, \quad \check{s}, \quad \mathring{r},
  \quad \hat{\imath}, \quad \vec{\jmath}
\]

有两点实务提醒。第一,accent 叠放并不整齐:像 \hat{\vec{x}} 这样叠两层,上方标记往往会漂浮或偏离中心。如果只是想加点,用 \ddot / \dddot / \ddddot;如果确实要叠层,最好用下一页介绍的 \overset 显式构造。第二,amsmath 的 \dddot 在上标里不会缩小。实测 $x^{\ddot a}$ 为 10.55292pt,而 $x^{\dddot a}$ 为 16.21565pt——三个点仍保持正文尺寸。遇到这种情况,载入 mathdots 宏包即可修正。

该写 \'e,还是直接打 é?

如果已载入 T1,两种写法的输出完全相同。 实测显示 \'e\'{e} 与直接输入的 é 三者宽度都是 4.44336pt,落到同一个字形上;而且自 2018 年起 LaTeX 默认读取 UTF-8,无需再写 inputenc。若想让源文件更易读,直接输入更有利。命令写法主要在三种场合仍然保留:要求 ASCII 的投稿规范、.bib 文件中的人名,以及 tabbing 环境。在 tabbing 里,\' 被「移到制表位」的命令占用,因此 accent 要用专门的 \a' 形式——就是在前面加上 \a

latex
% inside tabbing, \' means "go to a tab stop" — use \a' for the accent
\begin{tabbing}
  caf\a'e \= au lait \\
  th\a'e   \> vert
\end{tabbing}
  • 用 pdfLaTeX 排西文时,务必加上 \usepackage[T1]{fontenc} 断词、紧排和 PDF 可检索性会一并修好
  • 正文直接输入带 accent 的字母;.bib 按投稿方的规定来。 同一项目内不要混用两种写法
  • 只有 \~ \= \u \v \H \r \k 这 7 个需要写 \i 其余 5 个由 LaTeX 自动处理
  • \SS 是 SS,不是 ẞ。 需要大写 eszett 就改用 Unicode 引擎和含该字形的字体
  • \hat 属公式,\^ 属文本。 错误文本会告诉你身在哪一侧:! Missing $ inserted. 还是 ! Please use \mathaccent …