文本符号与图标

版权号 ©、注册商标 ®、段落符 ¶、章节符 §、千分号 ‰、摄氏度 ℃——长久以来的说法是:在 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],内容只剩下 fullalmostfulleurosafeerrorwarninfoquietforce 这些 选项声明。里面一条符号定义都没有,全部搬进了 latex.ltx

这次迁移并非单纯整理,它修好了输出本身。2020 年之前,\textbullet\textdagger\textsection\textparagraph\textperiodcentered 等的默认来源不是 TS1,而是 OMS——数学符号字体。也就是说,正文里的 § 其实是悄悄从数学字体借来的。差别可以量出来:在以 Helvetica 为正文字体的文档中,\textsection5.55994pt(Helvetica 自己的 §),而复现旧行为的 \textlegacysection4.44447pt(Computer Modern 的数学 §)。\textbullet 的差距更大:3.5pt 对 5.00002pt。兼容的退路也保留着:调用 \UseLegacyTextSymbols 可一次性恢复旧行为,并且还有 \textlegacybullet 这样按符号提供的命令。

document.tex
\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}

在正文中二者输出的都是同一个 ©。区别在于 进入数学模式后的行为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 标记
\textinterrobanginterrobang?! 的合字;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 更甚——其默认实现是「在一个空字符上放一个波浪号」的合成。

document.tex
% 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,并可通过 officialgen 等选项选择接近欧盟委员会官方设计的字形。不过,在 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 字体)。一句话:\Boxlatexsym\squareamssymb 复选标记 \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、什么也不做——记住这点就不必再为宏包载入顺序发愁。

latex
\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–4342 是向左的 ☛
\ding{72}65–107星形与花形的大区段;★ 为 72
\ding{168}168–171依次为 ♣ ♦ ♥ ♠——文本模式下的实心花色
\ding{164}161–167实心红心;165–167 为 ❥ ❦ ❧
\ding{172}172–211172–181 为 ①–⑩,182–191 为 ❶–❿
\ding{213}212–254箭头区段;214 为 ↔,215 为 ↕
\dingline{56}由该符号排成的装饰线\dingfill{NN} 是符号版的 \hfill
dinglist以 dingbat 为项目标记的列表dingautolist 每项编号加一
\Pisymbol{psy}{NN}Symbol 字体中的字形调用 ZapfDingbats 之外 Pi 字体的通用命令
latex
\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

latex
\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 文档中也能用。

document.tex
% 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。