latex 如何添加圆圈数字?

本文详细介绍了在 LaTeX 中添加带圈数字的多种方法,包括使用传统宏包如`dingbats`,利用Unicode码位,通过`fontspec`宏包结合OpenType特性,以及使用Adobe-Japan1-7字符集。文章还讨论了不同TEX引擎下的兼容性和字体选择,并提供了相关宏包及命令的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

众所周知,

\textcircled

实际上,加圈并不是一个平凡的变换,它会涉及到圈内字符形状的微调,而这是几乎无法在 


 

传统方案

pifont 宏包提供了一系列杂锦符号(dingbats),其中就有带圈数字。pifont 属于 psnfss 宏集,它封装了一系列 PostScript 字体,包含著名的 Helvetica、Times、Courier 等。pifont 使用的是 Zapf Dingbats 字体。

使用 \ding{<number>} 可以很方便地使用带圈数字(共有四种),当然也有其他符号。具体数字可参见下图:

pifont

在主流的 


 

Unicode

数字 0–50 的带圈版本都分配了对应的 Unicode 码位,因而在现代 

24EA2460246124622463246424652466246724682469
 
 246A246B246C246D246E246F2470247124722473
 
 325132523253325432553256325732583259325A
 
 325B325C325D325E325F32B132B232B332B432B5
 
 32B632B732B832B932BA32BB32BC32BD32BE32BF

Zapf Dingbats 中的其他几种样式也分配有码位:

  • 反白(negative circled digits)

    24FF2776277727782779277A277B277C277D277E277F
     
     24EB24EC24ED24EE24EF24F024F124F224F324F4
  • 无衬线(circled sans-serif digits)

    🄋
    1F10B2780278127822783278427852786278727882789
  • 无衬线反白(negative circled sans-serif digits)

    🄌
    1F10C278A278B278C278D278E278F2790279127922793

此外,还额外增加了一些样式:

  • 双线(double circled digits)

    24F524F624F724F824F924FA24FB24FC24FD24FE
  • 加框(circled numbers on black square)

    32483249324A324B324C324D324E324F
  • 带圆括号(parenthesized digits)

    247424752476247724782479247A247B247C247D
    247E247F24802481248224832484248524862487
  • 带点(digits with full stop)

    🄀
    1F10024882489248A248B248C248D248E248F24902491
     
     24922493249424952496249724982499249A249B
  • 带逗号(digits with comma)

    🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊
    1F1011F1021F1031F1041F1051F1061F1071F1081F1091F10A
  • 这些姑且也算上吧:

    3220322132223223322432253226322732283229
    3280328132823283328432853286328732883289
    🈩🈔🈪
    1F2291F2141F22A
     🉂🉁
     1F2421F241

这些符号分散在以下几个 Unicode 区块(block)中:

  • Enclosed Alphanumerics (U+2460U+24FF)
    • 带圈 0–20(以及 a–z、A–Z)
    • 反白 0、11–20
    • 双线 1–10
    • 带圆括号 1–20
    • 带点 1–20
  • Dingbats (U+2700U+27BF)
    • 反白 1–10
    • 无衬线 1–10
    • 无衬线反白 1–10
  • Enclosed CJK Letters and Months (U+3200U+32FF)
    • 带圈 21–50
    • 加框 10–80(仅限整十)
    • 带圈 
    • 带圆括号 
  • Enclosed Alphanumeric Supplement (U+1F100U+1F1FF)
    • 带逗号 0–9
    • 无衬线、无衬线反白以及带点的 0
  • Enclosed Ideographic Supplement (U+1F200U+1F2FF)
    • 带方框 
    • 带六角括号 

直接输入,或者利用码位,都能在 

\documentclass{article}
\usepackage{fontspec} \setmainfont{Source Han Serif SC} \begin{document} ① ② ③ ④ ⑤ \symbol{"2776} \symbol{"2777} \symbol{"2778} \symbol{"2779} \symbol{"277A} \char"3248\ \char"3249\ \char"324A\ \char"324B\ \char"324C\ ^^^^3280 ^^^^3281 ^^^^3282 ^^^^3283 ^^^^3284 ^^^^^1f229 ^^^^^1f214 ^^^^^1f22a \end{document} 

使用 

textcircled-fontspec


 

xunicode-addon 宏包    

在实际使用中,无论是依靠码位,还是借由输入法直接录入这些特殊字符,都不是很方便。在 xunicode-addon 宏包(从属于 xeCJK)中,\textcircled 等一系列命令被重新定义,从而能够显示 Unicode 所分配的带圈数字(和字母等)。举例如下:

\documentclass{article}
\usepackage{fontspec,xunicode-addon} \setmainfont{Source Han Serif SC} \begin{document} \textcircled{1} \textcircled{25} \textcircled{a} \textcircled{Z} \end{document} 

利用 

\ExplSyntaxOn
\cs_set:Npn \TESTi
  { \int_step_inline:nnn { 0 } { 25 } { \textcircled{##1} ~ } \par \int_step_inline:nnn { 26 } { 50 } { \textcircled{##1} ~ } \par } \cs_set:Npn \TESTii { \tl_map_inline:nn { abcdefghijklmnopqrstuvwxyz } { \textcircled{##1} ~ } \par } \cs_set:Npn \TESTiii { \tl_map_inline:nn { ABCDEFGHIJKLMNOPQRSTUVWXYZ } { \textcircled{##1} ~ } \par } \ExplSyntaxOff \TESTi \TESTii \TESTiii 

textcircled-xunicode-addon

当然,其他样式的带圈数字并没有提供快捷的输入方式。


 

在 ctex 宏集中使用

以上的案例都是在标准文档类 article 中搭配 fontspec 宏包完成的。如果切换成 ctex 宏集,则需要额外做一些调整。

对于中文文档,我们通常需要为中西文(「西文」主要指 Latin script)分别设置字体。上面已经提到过,带圈数字分散在了几个 Unicode 区块中。xeCJK 将其中的 Enclosed CJK Letters and Months 和 Enclosed Ideographic Supplement 设置为了 CJK 字符类,使用中文字体;其余则为 Default 字符类,使用西文字体。

总而言之,在 ctex 宏集的默认配置下:

Unicode 区块
Enclosed Alphanumerics西文西文
Dingbats西文西文
Enclosed CJK Letters and Months中文中文
Enclosed Alphanumeric Supplement西文西文
Enclosed Ideographic Supplement中文西文

在 

% 使用中文字体
\xeCJKDeclareCharClass{CJK}{% "24EA, % ⓪ "2460->"2473, % ①–⑳ "3251->"32BF, % ㉑–㊿ "24FF, % ⓿ "2776->"277F, % ❶–❿ "24EB->"24F4 % ⓫–⓴ } \setCJKmainfont{Source Han Serif SC} % 或使用西文字体 % \xeCJKDeclareCharClass{Default}{% % "24EA, "2460->"2473, "3251->"32BF, % "24FF, "2776->"277F, "24EB->"24F4} % \setmainfont{Garamond-Math.otf} 

在 

% 使用中文字体
\ltjdefcharrange{6}{% "24EA, "2460-"2473, "3251-"32BF, "24FF, "2776-"277F, "24EB-"24F4} \setCJKmainfont{Source Han Serif SC} % 或使用西文字体 % \ltjdefcharrange{3}{% % "24EA, "2460-"2473, "3251-"32BF, % "24FF, "2776-"277F, "24EB-"24F4} % \setmainfont{Garamond-Math.otf} 

这里的 6 和 3 原先分别对应日文字符和西文标点、符号。还需注意范围的写法与 xeCJK 中不同。

配合 xunicode-addon 宏包,在 ctex 宏集中也同样可以使用 \textcircled 命令输入预定义的带圈数字。但需注意,\textcircled 会预先检查字符是否存在,且仅在西文字体中进行。所以如需使用中文字体进行显示,就要「指鹿为马[2]

% XeLaTeX 下需要把全体带圈数字都设置成 Default 类
% LuaLaTeX 下无须额外设置
\xeCJKDeclareCharClass{Default}{"24EA, "2460->"2473, "3251->"32BF} % 将中文字体声明为(西文)字体族 \newfontfamily\EnclosedNumbers{Source Han Serif SC} % 放置钩子,只让带圈字符才需更换字体 \AtBeginUTFCommand[\textcircled]{\begingroup\EnclosedNumbers} \AtEndUTFCommand[\textcircled]{\endgroup} 

对于字体中没有的带圈数字,\textcircled 也能够自动生成(由圆圈和相应的数字拼合)。选择合适的字体之后,便可做一些比较暴力的尝试:

textcircled-matrix

即使是三位数,效果也尚能接受。

OpenType 的 nalt 特性

在 OpenType 中,有一项名为 nalt(Alternate Annotation Forms)的 GSUB 特性,它的作用是把特定的字符形替换成符号标注形式(notational forms)。不少日文字体都包含这一特性,我们可以利用 fontspec 宏包提供的相关选项调用。举例如下:

\documentclass{article}
\usepackage{fontspec} \setmainfont{ipaexm.ttf} % IPAex 明朝,TeX Live 自带 \begin{document} {\addfontfeature{Annotation=0}123456789} {\addfontfeature{Annotation=1}123456789} {\addfontfeature{Annotation=2}123456789} \end{document} 

textcircled-nalt

需要注意的是,Annotation=X 中的某个 X 具体对应何种样式,这是由字体设计者决定的。此外,在一些字体中,部分假名、汉字也有类似的标注形式,可以用相同方法使用:

\documentclass{ctexart}
\setCJKmainfont{Hiragino Mincho Pro W3} \begin{document} {\addCJKfontfeature{Annotation=0}あア} {\addCJKfontfeature{Annotation=1}かカ} {\addCJKfontfeature{Annotation=2}さサ} {\addCJKfontfeature{Annotation=3}たタ} {\addCJKfontfeature{Annotation=4}なナ} {\addCJKfontfeature{Annotation=5}はハ} {\addCJKfontfeature{Annotation=6}まマ} \end{document} 

textcircled-nalt-kana

这里我们用 \addCJKfontfeature 代替了 \addfontfeature。此处作为演示的字体是 macOS 自带的ヒラギノ明朝,在 Windows/Linux 上可换用其他字体。

Adobe-Japan1-7

Adobe-Japan1-7 字符集定义了更多的带圈数字,很多样式都支持 0–100 的数字范围。但由于 Unicode 没有为它们分配码位,我们必须用 CID(Character IDentifier)来指定[3]

由于 CID 到具体字符的映照比较复杂,因而这里我们提供了一个宏包 textcircle-cid,用来通过 CID 调用带圈数字。textcircle-cid 宏包提供了下面一组命令:

  • \CIDtextcircled
  • \CIDtextblackcircled
  • \CIDtextboxed
  • \CIDtextblackboxed
  • \CIDtextrboxed
  • \CIDtextblackrboxed

支持的数字范围是 0–100 和 00–09。

  • % test-uptex.tex
    \documentclass{ujarticle}
    \usepackage{pxchfon,textcircle-cid} \setminchofont{KozMinPr6N-Regular.otf} \setgothicfont{KozGoPr6N-Regular.otf} \def\TEST{% \CIDtextcircled{0} \CIDtextblackcircled{1} \CIDtextboxed{00} \CIDtextblackboxed{10} \CIDtextrboxed{50} \CIDtextblackrboxed{100}} \begin{document} \textmc{\TEST} \par \textgt{\TEST} \end{document} 
    textcircled-cid-uptex

    注意 

    uplatex test-uptex && dvipdfmx test-uptex
    

    在上面的示例中,我们使用的字体是 Adobe 的小塚明朝和小塚ゴシック。事实上,只有遵从 Adobe-Japan1 的字体,才能利用 CID 正确地调用相应的字符。

字体的选择

上文我们多次提及,带圈数字的具体使用与字体密切相关。下面我们整理了 

字体带圈反白无衬线无衬线反白
Baekmuk Batang/Dotum/Gulim/Headline1–15   
Carlito0–200–20  
DejaVuSans1–101–101–101–10
FreeMono, FreeSans1–10   
FreeSerif1–101–101–101–10
Garamond Math0–500–20  
IPAGothic, IPAMincho1–501–20  
Junicode0–200–20  
Lato0–200–20  
Libertinus Serif/Sans/Math, Linux Libertine, Linux Biolinum0–200–20  
Libertinus Keyboard, Linux Biolinum Keyboard 1–10  
STIX, STIX Math0–9 1–101–10
STIX Two Math0–200–201–101–10
UnBatang, UnDinaru, UnDotum, UnGraphic, UnGungseo, UnJamoBatang, UnJamoDotum, UnJamoNovel, UnJamoSora, UnPen, UnPenheulim, UnPilgi, UnPilgia, UnShinmun, UnVada, UnYetgul0–20   
XITS, XITS Math0–9 1–101–10
文鼎PL简报宋、文鼎PL简中楷1–10   

以下是其他一些常见中、日文字体,其中很多是操作系统自带的:

字体带圈反白无衬线无衬线反白
思源宋体、思源黑体0–500–200–100–10
微软雅黑、微软正黑1–10   
苹方0–500–200–101–10
方正书宋、方正黑体、方正楷体、方正仿宋、等线1–10   
宋体、黑体、楷体、仿宋(中易)1–10   
更纱黑体 (Sarasa Gothic)0–500–200–100–10
小塚明朝 (Kozuka Mincho)、小塚ゴシック (Kozuka Gothic)0–1000–100  
游明朝 (Yu Mincho)、游ゴシック (Yu Gothic)0–1000–100  
メイリオ (Meiryo)0–501–200–101–10

这里我们用了 Python 脚本 check-circled-number.py 来读取字体信息,它还依赖 FontForge。注意由于字体版本不同,不保证表中所列结果与实际情况完全一致。

注释

  1. ^在本页面的 CSS 中,带圈数字将优先使用思源宋体(Source Han Serif)显示,但具体结果仍然取决于字体的安装情况以及浏览器的渲染方式。
  2. ^感谢 @qinglee 的指导!见 CTeX-org/ctex-kit #399
  3. ^感谢 @clerkma 的指导!见 CTeX-org/forum #20
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值