符号表 (amssymb / 列表)

在 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)和 AMSbU/msbmsbm10)。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 中。
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 种不同的字体,宽度自然如此。先按领域缩小范围,再到按宏包排列的表中确认命令名——这是最短路径。

terminal
# 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 下使用。

latex
% 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万分号(基点)
latex
\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)”页)。