版权号 ©、注册商标 ®、段落符 ¶、章节符 §、千分号 ‰、摄氏度 ℃——长久以来的说法是:在 LaTeX 里排这些文本符号需要 \usepackage{textcomp}。这个常识在 2020 年 2 月 2 日的内核更新之后已经不成立了。 TS1(Text Companion)编码的整套符号被并入 LaTeX 本体,在 TeX Live 2024 上,\textcopyright、\texttrademark、\textcelsius 都能在导言区一行宏包都不写的情况下排出。事实上 textcomp.sty 已经变成一个不定义任何符号、只提供选项的宏包。本页通过实际编译核对现在什么是标准可用、什么仍需宏包,并把其余内容整理成速查表:\S、\P 一族,扑克花色 ♠ ♥ ♦ ♣,pifont 的 \ding 编号表,fontawesome5 的图标,以及日文圆圈数字与异体字。
不再需要 \usepackage{textcomp}——2020 年 TS1 进了内核
在 TeX Live 2024 上不载入任何宏包,把 © ® ™ ℠ € ¢ ¥ £ ‰ ° ℃ • ¶ § ¦ ♪ ℮ ¤ № ※ ‽ Ω µ ₩ ₤ ƒ ₦ 全部排一遍,一条警告和错误都不会出现。打开 textcomp.sty 就明白了:开头是 \ProvidesPackage{textcomp}[2020/02/02 v2.0n],内容只剩下 full、almostfull、euro、safe、error、warn、info、quiet、force 这些 选项声明。里面一条符号定义都没有,全部搬进了 latex.ltx。
这次迁移并非单纯整理,它修好了输出本身。2020 年之前,\textbullet、\textdagger、\textsection、\textparagraph、\textperiodcentered 等的默认来源不是 TS1,而是 OMS——数学符号字体。也就是说,正文里的 § 其实是悄悄从数学字体借来的。差别可以量出来:在以 Helvetica 为正文字体的文档中,\textsection 宽 5.55994pt(Helvetica 自己的 §),而复现旧行为的 \textlegacysection 为 4.44447pt(Computer Modern 的数学 §)。\textbullet 的差距更大:3.5pt 对 5.00002pt。兼容的退路也保留着:调用 \UseLegacyTextSymbols 可一次性恢复旧行为,并且还有 \textlegacybullet 这样按符号提供的命令。
\documentclass{article}
% no \usepackage{textcomp} needed since the 2020-02-02 kernel
\begin{document}
Foo\textregistered{} is a trademark of Bar Inc.\texttrademark
\textcopyright\ 2026 \quad 40\textperthousand \quad 25\textcelsius \quad 90\textdegree
\end{document}排出 © ® ™——\copyright 与 \textcopyright 的区别
在正文中二者输出的都是同一个 ©。区别在于 进入数学模式后的行为。latex.ltx 中的定义是 \DeclareRobustCommand{\copyright}{\ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi}——也就是说 \copyright 会看当前模式自行切换,是「两用」命令,而 \textcopyright 只用于文本。\pounds(£)也是同样的构造,在公式中会切换为 \mathsterling。实用上:正文里用哪个都行;在看不到上下文的地方(比如宏内部),\copyright 更稳妥。
还值得看看 \texttrademark 的 默认实现。latex.ltx 中至今保留着 \DeclareTextCommandDefault{\texttrademark}{\textsuperscript{TM}},以及基于 \textcircled{...} 的 \textregistered 定义。换句话说,在够不到 TS1 的字体环境里,™ 并不是真正的字形,而是 把 T 和 M 提成上标的赝品,® 则是叠一个圆圈合成出来的。2020 年之后默认改为 TS1,平时看不到这一幕;但指定了缺少 TS1 字形的字体时,这套旧实现就会露面。另外,控制词会吞掉其后的空格,所以在词中要写成 \textregistered{}(加空花括号)或补一个 \ 。
| 命令 | 符号 | 含义 | 备注 |
|---|---|---|---|
\textcopyright | © | 版权 | \copyright 是在数学模式下也能用的两用版 |
\textregistered | ® | 注册商标 | 够不到 TS1 时退化为 \textcircled 合成 |
\texttrademark | ™ | 商标 | 默认后备是赝品 \textsuperscript{TM} |
\textservicemark | ℠ | 服务标志 | 用于服务而非商品,主要见于美国 |
\texteuro | € | 欧元 | 想要统一字形见下文 eurosym 的 \euro |
\textcent | ¢ | 分 | \textsterling 得 £,\textyen 得 ¥ |
\textperthousand | ‰ | 千分号 | 万分号 ‱ 为 \textpertenthousand |
\textdegree | ° | 度(角度 / 温度) | 与数值搭配时 siunitx 的 \ang / \qty 更可靠 |
\textcelsius | ℃ | 摄氏度 | ℃ 连字;Computer Modern 中收录了它 |
\textnumero | № | 编号符号 | 俄语、法语中的「第 n 号」 |
\textmusicalnote | ♪ | 八分音符 | 用于正文;真正的乐谱排版是另一回事 |
\textbrokenbar | ¦ | 断竖线 | \textbardbl 给出双竖线 ‖;二者都与公式中的竖线不同 |
\textestimated | ℮ | 估量符号 | 欧盟包装上的 e 标记 |
\textinterrobang | ‽ | interrobang | ?! 的合字;cmr 中有,许多西文字体中没有 |
\textcircled{a} | ⓐ | 圈起的字符 | 合成;Computer Modern 靠叠一个圆圈实现 |
§、¶ 与 †——\S、\P、\dag 在数学模式下也能用
这四个在众多符号中很特别:它们会 自己判断当前模式。latex.ltx 中的定义可以直接读到——\DeclareRobustCommand{\S}{\ifmmode\mathsection\else\textsection\fi}、\DeclareRobustCommand{\P}{\ifmmode\mathparagraph\else\textparagraph\fi}。所以无论是在正文里写法条编号 \S 3,还是在公式里写脚注标记 x^\dag,都能通过。\dag(†)和 \ddag(‡)构造相同,在公式中切换为 \dagger、\ddagger。要注意 \S 是「节号」而不是「章」——在法律引用和标准文件中它是指称条款的通用符号,叠写成 \S\S 则习惯上表示多条。
| 命令 | 符号 | 文本 / 公式 | 备注 |
|---|---|---|---|
\S | § | 两者皆可 | 节号;\textsection 是仅限文本的同义命令 |
\P | ¶ | 两者皆可 | 段落符(pilcrow);\textparagraph 同字 |
\dag | † | 两者皆可 | 剑标;在公式中切换为 \dagger |
\ddag | ‡ | 两者皆可 | 双剑标;公式中为 \ddagger |
\copyright | © | 两者皆可 | 在公式中经 \nfss@text 退回文本排出 |
\pounds | £ | 两者皆可 | 在公式中变为 \mathsterling(数学斜体的 £) |
如何读懂 Symbol \textohm not provided by font family cmr in TS1 encoding.
这条警告是在报告:该符号不在你的正文字体中,于是 LaTeX 从别的字体借来排出。TS1 大约有 128 个位置,而能全部填满的西文字体只是少数。因此 LaTeX 用 \DeclareEncodingSubset 给各字族实现的范围编号来管理。看 latex.ltx 中的实际值:Computer Modern(cmr)是 0 号=全部具备,Latin Modern(lmr)是 1,Helvetica(phv)与 Courier(pcr)是 5(注释写明其 blank、interrobang、ohm 为豆腐块),而 未知字族是 9=最小集。当所请求的符号超出该字族的范围时,LaTeX 会切换到替代字族排出,并给出这条警告。
到这里 textcomp 才终于有了用武之地。默认情况下这条报告甚至不是警告,而只是写进日志的 \@latex@info。 加上 \usepackage[warn]{textcomp} 就会升级为真正的警告;[error] 使其成为错误,[quiet] 则完全静默。在校对更换过字体的稿件时,先带 [warn] 编译一遍,就能一眼看出哪些符号是用借来的字体排的。顺带一提,\textbackslash、\textbar 根本不属于 TS1:它们的默认来源是 OMS(数学符号字体),只有载入 T1 才会用上正文字体自己的字符。\textasciitilde 更甚——其默认实现是「在一个空字符上放一个波浪号」的合成。
% textcomp defines no symbols any more — it only sets the reporting policy
\usepackage[warn]{textcomp}
% options: full / almostfull / euro / safe / error / warn / info / quiet / force
%
% Package textcomp Warning: Symbol \textohm not provided by
% (textcomp) font family cmr in TS1 encoding.
% (textcomp) Default family used instead on input line 5.唯有欧元符号,专用宏包至今仍在服役。载入 \usepackage{eurosym} 后可用 \euro,并可通过 official、gen 等选项选择接近欧盟委员会官方设计的字形。不过,在 TeX Live 2024 上从含 eurosym 的 \euro 的 PDF 中抽取文字,得到的是单个 e(而 \texteuro 会原样返回 €)。排出来固然好看,但若文档需要经得起复制和检索,\texteuro 更实用。
排出扑克花色 ♠ ♥ ♦ ♣ 以及 △ □ ◇
花色是 LaTeX 标准的数学符号,不需要宏包:fontmath.ltx 中从 \DeclareMathSymbol{\clubsuit}{\mathord}{symbols}{"7C} 到 \spadesuit 连着四行,所以在数学模式里写 $\clubsuit$、$\diamondsuit$、$\heartsuit$、$\spadesuit$ 即可。\triangle(△)也住在同一处。不过 Computer Modern 的花色是不对称的:梅花和黑桃是实心,红心和方块是空心(♣ ♢ ♡ ♠),标准集里根本拿不到实心红心或方块。若想在文本模式下得到四个样式一致的花色,答案是下一节 pifont 的 \ding{168} 到 \ding{171}。
方块和菱形是 最容易记错属于哪个宏包 的地方。TeX Live 2024 的源码给出了明确答案:\Box(□)与 \Diamond(◇)来自 latexsym 及其 lasy 字体(latexsym.sty 中有 \DeclareMathSymbol\Box{\mathord}{lasy}{"32}),不在 amssymb 里。amssymb 提供的是 \square、\lozenge 以及实心的 \blacksquare、\blacklozenge(来自 AMSa 字体)。一句话:\Box 属 latexsym,\square 属 amssymb。 复选标记 \checkmark 与马耳他十字 \maltese 定义在 amsfonts 中,载入 amssymb 时会一并带来。
| 命令 | 符号 | 宏包 | 备注 |
|---|---|---|---|
\clubsuit \spadesuit | ♣ ♠ | 无需宏包 | 实心;在数学模式中使用 |
\heartsuit \diamondsuit | ♡ ♢ | 无需宏包 | 空心;标准集里没有实心版 |
\triangle | △ | 无需宏包 | 与 \triangleq(≜)等是不同命令 |
\Box \Diamond | □ ◇ | latexsym | 模态逻辑的必然与可能;不在 amssymb 中 |
\square \lozenge | □ ◊ | amssymb | 实心版为 \blacksquare、\blacklozenge |
\checkmark \maltese | ✓ ✠ | amssymb | 实际定义在 amsfonts 中;在数学模式使用 |
这里同样要留意留在 PDF 里的东西。latexsym 背后的 lasy 字体没有配 Unicode 映射表,所以在 TeX Live 2024 上从含 $\Box \Diamond \mho \Join$ 的 PDF 中抽取文字,得到的是 数字串 2 3 0 1。若读者可能复制正文并检索,在语义允许时应优先选 amssymb 的 \square、\lozenge。另外值得记住:latexsym 的写法是,若 AMS 字体已经装好,它会在开头就 \endinput、什么也不做——记住这点就不必再为宏包载入顺序发愁。
\usepackage{amssymb} % \square \lozenge \blacksquare \checkmark
\usepackage{latexsym} % \Box \Diamond \mho \Join
\usepackage{pifont} % \ding{168}--\ding{171}: solid suits in TEXT mode
% ...
Math: $\clubsuit\, \diamondsuit\, \heartsuit\, \spadesuit\, \triangle$
Text: \ding{168}\ding{169}\ding{170}\ding{171}pifont 的 \ding{编号}——实际编译核对过的编号表
复选标记、剪刀、星形、指路手之类的图符集中在 Zapf Dingbats 字体中,载入 \usepackage{pifont} 后用 \ding{NN} 按编号 调用。编号不必背,查即可;但网上流传的对照表彼此矛盾,因此本表是在 TeX Live 2024 上把 32–126 与 161–254 全部排出并用 pdftotext 回读得到的。常用的几个是:\ding{51} 为 ✓(细勾),\ding{52} 为 ✔(粗勾),\ding{53} 为 ✕,\ding{55} 为 ✗(投票用叉),\ding{56} 为 ✘(粗叉)。星形 ★ 是 \ding{72},\ding{43} 是 ☞(指向右方的手),\ding{164} 是 ❤(实心红心)。
| 写法 | 输出内容 | 编号区间 | 备注 |
|---|---|---|---|
\ding{51} \ding{52} | ✓ ✔ | 51–56 | 细勾与粗勾;53–56 依次为 ✕ ✖ ✗ ✘ |
\ding{43} | ☞ | 42–43 | 42 是向左的 ☛ |
\ding{72} | ★ | 65–107 | 星形与花形的大区段;★ 为 72 |
\ding{168} | ♣ | 168–171 | 依次为 ♣ ♦ ♥ ♠——文本模式下的实心花色 |
\ding{164} | ❤ | 161–167 | 实心红心;165–167 为 ❥ ❦ ❧ |
\ding{172} | ① | 172–211 | 172–181 为 ①–⑩,182–191 为 ❶–❿ |
\ding{213} | → | 212–254 | 箭头区段;214 为 ↔,215 为 ↕ |
\dingline{56} | 由该符号排成的装饰线 | — | \dingfill{NN} 是符号版的 \hfill |
dinglist | 以 dingbat 为项目标记的列表 | — | dingautolist 每项编号加一 |
\Pisymbol{psy}{NN} | Symbol 字体中的字形 | — | 调用 ZapfDingbats 之外 Pi 字体的通用命令 |
\usepackage{pifont}
% ...
\ding{51}\ pass \qquad \ding{55}\ fail \qquad \ding{72}\ starred
\dingline{56} % a rule made of that symbol
\begin{dingautolist}{172} % numbers step: (1) (2) (3) ...
\item first step
\item second step
\end{dingautolist}fontawesome5 的图标——\faGithub 与 \faIcon{github}
要在正文中放入品牌标志或齿轮、信封、电话这类 UI 图标,就载入 \usepackage{fontawesome5}。调用方式有两种:把图标名转成驼峰式并加 fa 前缀的专用命令(\faGithub、\faEnvelope、\faAddressBook),或把官方名放进花括号的通用命令 \faIcon{github}。样式有三种——solid(默认填充)、regular(线框)、brands(标志)——用可选参数选择,如 \faIcon[regular]{heart}(品牌标志自动按 brands 处理)。只有一处依赖引擎:pdfLaTeX 下可用免费集(Font Awesome 5 Free),但 完整图标与全部样式,以及付费 Pro 集,需要 XeLaTeX 或 LuaLaTeX。
\usepackage{fontawesome5}
% ...
Source: \faGithub\ github.com/example \quad \faEnvelope\ mail@example
\faIcon{rocket} \quad \faIcon[regular]{heart} % outlined style
\faCog \quad \faCheck \quad \faPython日文圆圈数字与异体字——otf 的 \ajMaru 与 \UTF
日文排版常需要圆圈数字 ①②③、方框数字、罗马数字 Ⅰ Ⅱ Ⅲ,以及人名中出现的异体字(﨑、髙、𠮷)。担此任的是 otf(japanese-otf)宏包:载入 \usepackage{otf} 后即可使用一组调用 Adobe-Japan1 字形的命令。圆圈与方框数字只需把数字作为参数——\ajMaru{3} 为 ③,\ajKaku{3} 为方框,\ajKuroMaru{3} 为黑底白字,\ajRoman{3} 为 Ⅲ,\ajroman{3} 为 ⅲ,\ajKakko{3} 为 (3)。没有专用命令的字形,则 用码位直接调用 \UTF{XXXX}(4 到 5 位十六进制数),或用 Adobe-Japan1 的 CID 指定 \CID{编号}。
要注意引擎。otf 仅适用于 pLaTeX / upLaTeX,其前提是经 DVI 再由 dvipdfmx 生成 PDF 的路径;在 pdfLaTeX 下不能运行。LuaLaTeX 用 luatexja-otf,XeLaTeX 用 zxotf 承担同样角色。宏包本身还有 deluxe(多字重)、expert(竖排与横排切换字形)、jis2004(JIS2004 字形)等选项。另外要注意,若只需要圆圈数字,上一节里有一个不挑引擎的替代方案:pifont 的 \ding{172} 到 \ding{181} 会输出 ①–⑩,在 pdfLaTeX 文档中也能用。
% pLaTeX / upLaTeX only; produce the PDF with dvipdfmx
\documentclass{ujarticle}
\usepackage[deluxe]{otf}
\begin{document}
\ajMaru{1}\ajMaru{2}\ajMaru{3} \quad \ajKakko{1} \quad \ajRoman{3}
\UTF{FA11} % a variant kanji, called by code point
\CID{13706} % or by Adobe-Japan1 CID
\end{document}归纳一下分工:西文符号(© ® ™ € § ¶ ‰ ° ℃)属于 LaTeX 标准——2020 年之后只有想让它报告替换情况时才需要 textcomp。扑克花色和 △ 也是标准;□ 与 ◇ 来自 latexsym,\square 一族来自 amssymb。图符来自 pifont 的 \ding,按编号调用;界面与品牌图标来自 fontawesome5;日文圆圈数字与异体字来自 otf 的 \ajMaru / \UTF。只有一件事容易弄错,就是引擎:textcomp(即内核)与 pifont 到处都能用,fontawesome5 若要完整功能需要 Unicode 引擎,otf 则局限于 pLaTeX / upLaTeX。