在 LaTeX 里查符号的工具之所以存在,恰恰是因为符号表本身长到难以翻查。手绘识别工具 Detexify 在自我介绍里就把动机说明白了:在 symbols-a4.pdf 中找一个记不住的符号太费时间。那份 symbols-a4.pdf 正是 The Comprehensive LaTeX Symbol List,随 TeX Live 2024 附带的版本共 481 页,收录 20,323 个符号。本页不是又一张符号表,而是一套按取用顺序排开的工具箱,用来回答“眼前这个字符在 LaTeX 里该怎么打”:amssymb、Comprehensive 列表、Detexify,以及面向 XeLaTeX / LuaLaTeX 的 unicode-math。
这个符号在哪个宏包里?先试 amssymb
如果某个数学符号在标准 LaTeX 中没有,答案通常就是一行 \usepackage{amssymb}。这是美国数学会(AMS)的宏包,打开看反而会觉得平淡:amssymb.sty(v3.01,2013 年)不过是两百多行 \DeclareMathSymbol——它的全部工作就是给 AMS 符号字体里已有的字形 起名字。这也正是它与常被混淆的 amsmath 的区别:amsmath 负责公式的 结构(align 环境、分数机制),amssymb 增加的是 符号本身。问题是“没有这个符号”就用 amssymb,问题是“公式对不齐”就用 amsmath。
既然只是“起名字”,那字形在哪里?加载 amssymb 时会在内部执行 \RequirePackage{amsfonts},把两套符号字体注册为数学字体:AMSa(NFSS 名 U/msa,字体 msam10)和 AMSb(U/msb、msbm10)。amssymb.sty 所做的,就是声明每条命令对应这两套字体中的哪个位置。这条链条带来的实际好处是:只写 \usepackage{amssymb} 就会连带得到 amsfonts 提供的内容——\mathbb(黑板粗体)、\mathfrak(Fraktur)、\hbar、\checkmark、\dashrightarrow 严格说属于 amsfonts.sty 的定义,但你不必再单独写 \usepackage{amsfonts}。
至于你要找的符号是否可能在 amssymb 中,只要记住五个类别基本就能判断。如果目标形状不属于其中任何一类——乐谱记号、电路元件、国际象棋棋子之类——那么翻 amssymb 就是浪费时间,直接跳到下一节的 Comprehensive LaTeX Symbol List 会更快。
- 追加关系符。 标准关系符的变体与近亲:
\leqslant(倾斜的“小于等于”)与\geqslant、\lesssim与\gtrsim、双线的\subseteqq与\supseteqq。 - 否定关系符。 已经画好斜杠的专用字形:
\nleq(不小于等于)、\ngeq、\nsim、\nsubseteq、\nmid(不整除)。 - 追加箭头。 装饰性箭头,如
\twoheadrightarrow(双头 = 满射)、\rightrightarrows(并排双箭头)、\rightsquigarrow(波浪箭头)、\dashrightarrow(虚线箭头)。 - 杂项符号。
\varnothing(圆形空集)、\square/\blacksquare、\complement(补集)、\nexists、\circledast等。 - 希伯来字母。 用于基数的
\beth、\gimel、\daleth。只有\aleph已在标准 LaTeX 中。
\usepackage{amssymb} % extra relations, negations, arrows, misc symbols, Hebrew
% ...
\[ 0 \leqslant x \lesssim 1, \qquad a \nmid b, \qquad A \subseteqq B \]
\[ f \colon X \twoheadrightarrow Y, \qquad \varnothing \ne S, \qquad \aleph_0 < \beth_1 \]\leqslant 与 \nleq:amssymb 的关系符和否定
五个类别里,日常最常用的就是关系符的变体和否定形。倾斜的 \leqslant(⩽)是许多数学著作偏爱的字形,胜过水平的 \leq(≤);一旦选定一种,就要在全文中保持一致——同一篇论文中 ≤ 与 ⩽ 混用,在读者眼里像是在刻意区分两种不同的关系。否定也是同理:凡是有专用字形的关系符,就应当使用它。下表只是代表例,并不穷尽(表中全部需要 amssymb)。
| 命令 | 字形 | 含义(均需 amssymb) |
|---|---|---|
\leqslant | ⩽ | 小于等于(倾斜变体) |
\geqslant | ⩾ | 大于等于(倾斜变体) |
\lesssim | ≲ | 小于或近似于 |
\gtrsim | ≳ | 大于或近似于 |
\subseteqq | ⫅ | 子集,带双等号线 |
\nleq | ≰ | 不小于等于 |
\ngeq | ≱ | 不大于等于 |
\nsim | ≁ | 不相似 |
\nsubseteq | ⊈ | 不是子集或相等 |
\nmid | ∤ | 不整除 |
\nparallel | ∦ | 不平行 |
没有专用否定形的关系符,可以在前面加 \not 当场否定(例如 \not\equiv)。但 \not 只是叠加一条大小和倾角固定的斜杠,落在某些字形上会偏离中心、显得难看——而 \nleq 这类专用字形的存在,正是为了避免这一点。反过来,\ne(≠)和 \notin(∉)在标准 LaTeX 中就有专用命令,既不需要 amssymb,也不需要 \not。关系符两侧如何留白、\not 的细节行为,都在“关系符号”页中说明。
\varnothing、\twoheadrightarrow、ℶ:amssymb 的箭头与杂项
在余下的三类里,最引人注目的是那些形状本身就在说明含义的字形。双箭尾的 \twoheadrightarrow(↠)表示满射,带尾的 \rightarrowtail(↣)表示单射——“完全盖住”与“从下面嵌进去”的直觉被直接画成了字形。杂项符号中,圆形空集 \varnothing(∅)常常比标准的 \emptyset 更受青睐;证明收尾则用 \square(□)或 \blacksquare(■)。
| 命令 | 字形 | 含义 / 备注(均需 amssymb) |
|---|---|---|
\twoheadrightarrow | ↠ | 双头右箭头;满射 |
\rightarrowtail | ↣ | 带尾右箭头;单射 |
\rightrightarrows | ⇉ | 并排两个右箭头 |
\rightsquigarrow | ⇝ | 波浪右箭头 |
\varnothing | ∅ | 圆形空集(\emptyset 的变体) |
\square | □ | 白方块 / 证明结束(QED) |
\blacksquare | ■ | 黑方块 |
\complement | ∁ | 集合补集 |
\nexists | ∄ | 不存在(∃ 的否定) |
\checkmark | ✓ | 对勾(来自 amsfonts) |
\beth | ℶ | 希伯来字母 beth(基数) |
\gimel | ℷ | 希伯来字母 gimel |
\daleth | ℸ | 希伯来字母 daleth |
希伯来字母用于集合论中的基数(无限势)。只有 \aleph(ℵ)属于标准 LaTeX,后面的 \beth、\gimel、\daleth 需要 amssymb。希腊字母变体 \digamma(ϝ)和 \varkappa(ϰ)出自同一处,将在“希腊字母”页中介绍。想必你已经注意到,本页的每张表都只是代表例。箭头、杂项符号、关系符各自的完整列表在对应的分类页中;这个元页面的职责,是告诉你该去哪里找。
Comprehensive LaTeX Symbol List — 从两万五千个符号里找出那一个
当某个符号连 amssymb 里也没有,或者你需要确定它究竟属于哪个宏包时,权威答案是 Scott Pakin 的 The Comprehensive LaTeX Symbol List。它在 CTAN 上的宏包名为 comprehensive,以 LPPL 发布。收录数量随版本不断增长:据 CTAN 的说明,2026 年 4 月发布的 16.0 版已超过 25,000 个符号。即便是 TeX Live 2024 中附带的版本,也有 20,323 个符号、481 页——这正是“条目多到难以翻查”的奢侈烦恼。
要不被这个体量吓退,有两个入口。其一是开头的“Frequently Requested Symbols(常被问到的符号)”一节——如果你的字形在那里,几秒钟就能解决。其二是章节划分,按领域切开:正文符号、数学符号、科技符号、装饰符(dingbats)、古代文字、音乐符号、游戏符号、地理符号。听到“LaTeX 符号手册里有古代文字和游戏两章”,会觉得像玩笑;但这一版的字形取自 225 种不同的字体,宽度自然如此。先按领域缩小范围,再到按宏包排列的表中确认命令名——这是最短路径。
# open the copy already installed with TeX Live / MiKTeX -- no network needed
texdoc comprehensive
# or name the PDF directly (symbols-letter for US Letter paper)
texdoc symbols-a4这份列表随 TeX Live 和 MiKTeX 一同附带,因此无需联网即可在本地打开。但 “被收录”不等于“能直接用”:其中许多符号必须另行安装专用字体或宏包才能排出,文档开头也明确说明了这一点。另有一节在实际工作中很管用,就是靠后的“Symbol Name Clashes(命令名冲突)”。当你同时加载两个符号宏包、遇到 ! LaTeX Error: Command \... already defined 时,只有这里能告诉你是哪个宏包在争夺哪个名字。
Detexify — 把符号画出来,查它的 LaTeX 命令
既不知道符号的名字,也不知道它属于哪个领域,只知道它长什么样——在这种情况下,按领域分章完全帮不上忙。Detexify 正是为此而生。用鼠标或手指在框中画出符号,它就会按形状相近程度列出 LaTeX 命令候选。构思来自 Philipp Kühl,实现出自 Daniel Kirsch。Detexify 自己说明了创作动机,而“罪魁祸首”恰恰是上一节那份 481 页的 PDF:在 symbols-a4.pdf 里找一个记不住的符号太费时间。符号表膨胀到一定程度,反而催生了一个让你不必去翻它的工具。
它的内部是朴素的机器学习。据 Kirsch 本人的说明,画下的笔迹以“笔画”的形式送出——每个笔画是一串带位置和时间戳的点——再从中提取笔画数、点密度、方向等特征。分类采用 k 近邻法:把已积累的手写样本按特征空间中的距离排序,逐个考察最近邻,直到凑齐 5 种不同的符号为止。既然基于统计,就未必一次命中;但实用上最贴心的是 每个候选都会显示所需的宏包,认出字形的同时,\usepackage 那一行也就定下来了。官方网站是 detexify.kirelabs.org。训练数据是公开的,每当有人确认正确答案,下一次的准确度就会提升一点。
遇到 Too many math alphabets used in version normal 时
不断添加符号宏包,迟早会在 ! LaTeX Error: Too many math alphabets used in version normal. 处停下。原因不是符号数量,而是 数学字体“槽位”的数量。LaTeX 最多只能持有 16 个(内核文件 latex.ltx 中的 \e@mathgroup@top 设为 16);仅加载 amssymb 就会占掉 AMSa、AMSb 两个,使用 \mathfrak 再占一个,下文的 mathcomp 的 \tcdigitoldstyle 又占一个。16 这个数字直接来自 TeX 的设计:TeX 把公式中的一个字符编码为“类别 + 字体槽 + 位置”,而字体槽只分到 4 个比特,也就是 16 种可能。
解决办法有两条。其一是 少加载宏包。符号宏包之间争夺的不只是槽位,还有命令名;amssymb 自己也会在 stix 已经加载时主动退让,并警告说它是多余的、不予加载。其二是 更换引擎。XeLaTeX 和 LuaLaTeX 把上限提高到 256 个槽位;若再用上 Will Robertson 等人的 unicode-math,整套算法都变了:一个 OpenType 数学字体就装得下数千个字形,于是“每加一批符号就消耗一个槽位”的账不必再算。它附带的 unicode-math-table.tex 把 2,448 个 Unicode 数学字符映射到命令名,例如 U+2200 对应 \forall。代价是 unicode-math 无法在 pdfLaTeX 下使用。
% XeLaTeX or LuaLaTeX only -- one OpenType font carries thousands of glyphs
\usepackage{unicode-math}
\setmathfont{latinmodern-math.otf}
% ...
\[ \forall \varepsilon > 0,\ \exists \delta > 0 \]在公式中把 ℃、Ω、µ 排成直立体(mathcomp / textcomp)
把单位混进公式里,会引出一个与“找符号”无关的问题:在数学模式中,µ 会被排成斜体变量,而单位里的“微”前缀必须是 直立体。修正这一点的小宏包就是 mathcomp。写上 \usepackage{mathcomp},\tcmu(µ)、\tcohm(Ω)、\tccelsius(℃)等就能在数学模式中使用。命名规则很简单:把文本模式下的 \textmu、\textdegree 中的 text 换成 tc(text companion)即可。
tc 来自 TS1(Text Companion) 编码。从前要在正文中输出 \textdegree(°)或 \textperthousand(‰),必须写 \usepackage{textcomp};但正如 LaTeX News 31 所记载,2020 年的发行版已把 TS1 符号并入内核,如今不加载 textcomp 也能在正文中使用。不过 textcomp 仍有用武之地:写成 \usepackage[error]{textcomp} 或 [warn],当字体缺字而发生替换时,它会以 LaTeX 错误或警告的形式提醒你。相比之下,数学模式并没有被同样地自动化,所以要在公式中排出直立的单位符号,至今仍需要 mathcomp。
| 命令(mathcomp) | 字形 | 含义 |
|---|---|---|
\tcohm | Ω | 欧姆(电阻单位);直立 |
\tcmu | µ | 微符号(µm 中的 µ);直立 |
\tcdegree | ° | 度符号 |
\tccelsius | ℃ | 摄氏度(\tccentigrade 同义) |
\tcperthousand | ‰ | 千分号(千分率) |
\tcpertenthousand | ‱ | 万分号(基点) |
\usepackage{mathcomp} % loads textcomp and adds the \tc... commands for math mode
% ...
\[ R = 4.7\,\mathrm{k}\tcohm, \qquad d = 25\,\tcmu\mathrm{m}, \qquad T = 37\,\tccelsius \]mathcomp 提供的就是这 6 个符号,外加 \tcdigitoldstyle{0} … \tcdigitoldstyle{9}(旧式数字),并可用选项选择字体(\usepackage[ppl]{mathcomp} 使用 Palatino 的 TC 字体)。有一点要注意:\tcohm(Ω)与希腊大写字母 \Omega 是不同的字符,作为单位符号,正确的是前者。前面关于槽位的话在这里同样生效——\tcdigitoldstyle 会占用一个数学字体槽位,在已经堆满符号宏包的文档里,它可能就是压垮骆驼的最后一根稻草。若要认真排版单位,把这件事交给 siunitx 比一个个挑符号更快,它还会照管数值与单位之间的间距以及复合单位的组装(见“单位 (siunitx)”页)。