1. 从一次排版尴尬说起为什么需要带圆圈的数字前几天我帮一位朋友审阅一份技术报告内容是关于某个实验的十组数据对比。报告本身逻辑清晰但当我看到编号列表时瞬间有点出戏。他用的是“①、②、③……”这样的数字这本身没问题但仔细一看这些圆圈和数字的间距不一致有的挤在一起有的又分得太开在严谨的PDF文档里显得格外扎眼。朋友用的是Word手动插入了“带圈字符”功能但一旦调整字体或进行格式刷效果就难以保证统一。这让我立刻想到了LaTeX。在学术写作、技术文档领域LaTeX以其卓越的排版质量和稳定性著称尤其是数学公式和交叉引用。对于带圆圈的数字或称“ encircled numbers ”LaTeX的处理方式远比所见即所得软件更优雅、更自动化。无论是用于步骤编号、图表脚注、还是像围棋棋谱、化学式中的特殊标记带圈数字都是一种常见需求。然而LaTeX本身并没有一个像\alph或\Roman那样直接生成带圈数字的简单命令这让不少初学者感到困惑。实际上在LaTeX中优雅地输入带圆圈的数字远不止是“输入一个符号”那么简单。它涉及到字体编码、符号包选择、自动化编号以及跨文档兼容性等一系列问题。处理得当你的文档将拥有专业、一致的视觉表现处理不当则可能遭遇编译错误、符号缺失或打印失真。接下来我就结合自己多年的排版经验系统梳理一下在LaTeX中实现带圆圈数字的几种主流方案并深入探讨其背后的原理、适用场景以及那些容易踩坑的细节。2. 方案核心理解LaTeX的符号生成机制在深入具体方法之前我们需要建立一个基本认知LaTeX中的特殊符号大多依赖于特定的字体包package或字体编码。带圆圈的数字不属于基本的ASCII字符也通常不在标准LaTeX字体如Computer Modern的常规字形集中。因此我们的所有方案本质上都是在“引入”或“命令LaTeX生成”这些特殊字形。2.1 方案一使用pifont宏包与\ding命令这是最经典、最直接的方法尤其适用于需要固定几个带圈数字的场景。pifont宏包提供了访问“Pi字体”符号字体中大量装饰性字符的能力。其中就包含了一套样式统一的带圈数字。使用起来非常简单\documentclass{article} \usepackage{pifont} % 引入宏包 \begin{document} 这是一个带圈的数字\ding{172} 对应数字1 \ding{173} 对应数字2。 你也可以用在列表中 \begin{itemize} \item [\ding{182}] 第一条项目数字9 \item [\ding{187}] 第二条项目数字20等等这里有问题 \end{itemize} \end{document}核心要点与避坑指南数字编码的规律\ding命令的参数是一个数字编码对应Pi字体中的特定符号。对于带圈数字1-10其编码是连续的172对应 ①173对应 ② ……181对应 ⑩。这是必须记住的第一个坑它不是直观的\ding{1}而是从172开始。你可以通过查阅pifont的文档在命令行输入texdoc pifont找到完整的符号表。范围限制pifont通常只提供1-10的带圈数字。如果你需要超过10的数字比如 ⑪、⑫这个方法就无能为力了。这也是它最大的局限性。样式固定pifont提供的圆圈样式是固定的通常圆圈较粗数字相对较小。如果你对样式有特别要求比如更细的圆圈、更大的数字这个方案无法调整。自动化程度低每个数字都需要手动输入对应的编码无法像\item那样自动递增。如果你有20个需要带圈编号的条目就需要手动写20个\ding且不能出错维护起来很麻烦。注意上面例子中的\ding{187}并不是一个标准的带圈数字它可能显示为其他符号。这正说明了不查文档直接猜编码的风险。2.2 方案二使用enumitem宏包自定义列表标签如果你的带圈数字主要用于列表项编号那么enumitem宏包是更强大、更自动化的选择。它允许你深度定制列表环境如itemize,enumerate的标签。我们可以结合pifont来创建自动递增的带圈数字列表\documentclass{article} \usepackage{pifont} \usepackage{enumitem} % 引入强大的列表定制宏包 % 自定义一个“圆圈数字”的标签格式 \newlist{circlenum}{enumerate}{1} % 创建一个新的列表环境最大嵌套1层 \setlist[circlenum]{label\protect\ding{\numexpr171\value{circlenumi}\relax}} % 关键设置 \begin{document} \begin{circlenum} \item 这是自动带圈的第一项。 \item 这是自动带圈的第二项。 \item 这是自动带圈的第十项等等这里会出问题 \end{circlenum} \end{document}原理与深度解析\newlist{circlenum}{enumerate}{1}创建了一个名为circlenum的新列表环境它基于enumerate有序列表最大嵌套深度为1层。\setlist[...]{label...}这是enumitem的核心配置命令用于设置列表的标签格式。\protect\ding{\numexpr171\value{circlenumi}\relax}这是标签生成的核心逻辑。\protect是一个保护命令防止\ding在复杂上下文如章节标题、浮动体标题中被展开时出错。在列表标签定义中通常需要它。\numexpr ... \relax这是LaTeX的整数表达式计算器。它计算171 \value{circlenumi}的结果。\value{circlenumi}这是circlenum环境第一层i代表第一层的计数器当前值。第一项是1第二项是2以此类推。所以第一项时计算1711172生成\ding{172}即①第二项生成\ding{173}完美实现了自动化。此方案的优缺点优点实现了自动化编号无需手动输入编码维护方便。缺点依然受限于pifont的符号范围1-10。当列表超过10项时第11项会试图访问\ding{182}而这个编码可能对应一个完全无关的符号如箭头、星号导致排版错误或显示异常。这是第二个大坑。2.3 方案三使用unicode-math与支持Unicode的现代引擎XeLaTeX/LuaLaTeX如果你使用的是XeLaTeX或LuaLaTeX这类支持Unicode和系统字体的现代编译引擎那么事情就变得简单多了。你可以直接输入Unicode字符或者使用unicode-math宏包提供的命令。方法A直接输入Unicode字符在源代码中你可以直接粘贴从字符映射表或网上复制的带圈数字如 ① ② ③。前提是你的编辑器编码是UTF-8并且使用的字体包含这些字形。% 编译命令需使用 xelatex 或 lualatex \documentclass{article} \usepackage{fontspec} % XeLaTeX/LuaLaTeX 下管理字体的宏包 \setmainfont{TeX Gyre Termes} % 设置一个支持这些符号的字体如TeX Gyre系列 \begin{document} 直接输入Unicode字符①, ②, ③, …, ⑳。 甚至可以使用更大的㉑, ㉒。 \end{document}方法B使用\unicode命令或unicode-mathunicode-math宏包定义了大量直观的命令。% 编译命令需使用 xelatex 或 lualatex \documentclass{article} \usepackage{unicode-math} % 引入宏包 \setmainfont{TeX Gyre Termes} \setmathfont{TeX Gyre Termes Math} \begin{document} 使用 unicode-math 命令\textcircled{1}, \textcircled{2}。 但注意\verb|\textcircled| 通常用于文本模式且样式可能因字体而异。 更“数学”的方式$\circled{1}$, $\circled{2}$。这需要数学字体支持。 \end{document}现代方案的巨大优势与潜在陷阱优势直观简单直接输入字符或使用语义化命令。范围极广许多字体支持1-20甚至1-50的带圈数字彻底解决了范围限制问题。样式丰富你可以通过更换不同的系统字体或OpenType数学字体获得不同风格的带圈数字细圈、粗圈、方圈等。陷阱与注意事项字体依赖这是最关键的陷阱。你使用的\setmainfont必须包含所需的带圈数字字形。并非所有字体都完整包含这些符号。如果字体缺失该位置会显示空白或豆腐块□。常用的、符号覆盖较全的西文字体有TeX Gyre 系列Termes, Pagella, Bonum等、Linux Libertine、Times New Roman、Arial Unicode MS等。中文字体通常也包含这些符号。编译引擎必须使用XeLaTeX或LuaLaTeX。如果你与合作者共享源文件而他们习惯使用pdfLaTeX则此方案会导致编译失败。\textcircled的局限性这个命令虽然名字叫“带圈文本”但其实现方式尤其是在传统引擎下是“画一个圈然后把参数放进去”对于单个字符效果尚可但对于多字符如“12”或高度较大的字符圈和内容的对齐、缩放可能非常糟糕。在传统pdfLaTeX中应尽量避免用它处理数字以外的内容或超过1位的数字。3. 终极方案circledsteps宏包与\circled命令的深度应用对于追求极致稳定性和美观且需要兼容pdfLaTeX的用户我强烈推荐使用circledsteps宏包。它并非LaTeX默认安装需要额外安装但其设计非常精巧通过TikZ图形化地绘制圆圈从而完全摆脱了对特定字体符号的依赖。3.1 基本使用与原理\documentclass{article} \usepackage{circledsteps} % 引入宏包 \begin{document} 这是一个带圈数字\Circled{1}。这是另一个\Circled{12}。 它甚至可以圈字母\Circled{A}圈汉字\Circled{中}。 \end{document}背后的原理当你使用\Circled{...}时circledsteps宏包在底层调用TikZ绘图引擎。TikZ会测量参数内容如“1”、“12”、“A”的宽度和高度。以此尺寸为基础计算出一个合适直径的圆形路径。绘制这个圆并将内容居中放置在圆内。这个过程完全是动态的、与内容自适应的因此它可以完美处理任何字符、任何位数且在所有支持TikZ的编译引擎pdfLaTeX, XeLaTeX, LuaLaTeX和字体下表现一致。3.2 高级定制与样式调整circledsteps的强大之处在于其可定制性。它提供了多种预设样式和灵活的接口。\documentclass{article} \usepackage{circledsteps} \usepackage{xcolor} % 用于定义颜色 \begin{document} % 使用预设样式 \Circled[inner colorwhite, outer colorblue!30, fill colorblue!15]{1} \Circled[inner colorred, outer colorblack, fill coloryellow!20]{2} % 自定义一个全局样式 \newcommand{\mycircle}[1]{\Circled[inner colorwhite, outer colorblack, fill colorgray!10]{#1}} 使用自定义命令\mycircle{3}, \mycircle{45}. % 与 enumitem 结合创建完美的自动带圈列表 \usepackage{enumitem} \newlist{mylist}{enumerate}{1} \setlist[mylist]{label\protect\Circled{\arabic*}} % \arabic* 输出当前计数器值 \begin{mylist} \item 第一项编号自动为带圈的1。 \item 第二项。 \item ...一直到第一百项都没问题 \end{mylist} \end{document}关键参数解释inner color圆圈内数字或内容的颜色。outer color圆圈线条的颜色。fill color圆圈内部的填充色。如果不需要填充可以设置为white或none。\arabic*在enumitem的标签定义中*代表当前层级的计数器\arabic将其输出为阿拉伯数字。这样就实现了动态内容的填入。3.3circledsteps方案的优缺点总结优点完全独立不依赖任何特殊字体兼容性极佳。无限范围可以圈任何内容数字1-1000、字母、单词、短句理论上都可以。高度可定制圆圈线宽、颜色、填充、大小都可以精细调整。自动化友好与enumitem等宏包无缝结合实现自动编号。引擎通用在 pdfLaTeX, XeLaTeX, LuaLaTeX 下均可使用。缺点编译速度由于每个圆圈都是即时绘制的图形在文档中大量使用如数百个时会轻微增加编译时间。需要额外宏包需要安装circledsteps和其依赖的tikz宏包。对于在线协作平台如Overleaf这通常不是问题。样式与字体符号的差异TikZ绘制的圆圈是“几何圆”而字体中的带圈数字是“设计字模”两者在视觉风格上可能有细微差别。字体符号往往与文本的笔画风格更融合而TikZ绘制的圆可能更规整、更“图形化”。选择哪种取决于你的审美偏好和文档整体风格。4. 实战场景与决策指南我该选择哪种方案了解了所有技术方案后如何根据实际项目做出选择下面我通过几个典型场景来分析。场景一撰写一篇短篇技术报告只有几处需要用到带圈数字①-⑩。推荐方案pifont\ding。理由简单直接无需引入复杂的宏包或更改编译引擎。对于少量固定数字手动输入几个\ding{172}是最快的方式。确保你的文档不会扩展到超过10个即可。场景二编写一份长文档如手册、教程其中有多个需要自动编号的带圈数字列表且列表项可能超过10个。推荐方案circledstepsenumitem。理由这是最稳健、最自动化的方案。你只需要在导言区定义好列表样式然后在正文中像使用普通enumerate一样使用它。完全不用担心编号上限样式也完全可控。虽然编译稍慢但对于现代计算机和一次性的文档生成这点开销可忽略不计。场景三与团队合作必须使用 pdfLaTeX 编译且文档中散落着一些带圈数字但不确定具体有多少。推荐方案circledsteps的\Circled命令。理由兼容性是第一要务。circledsteps在 pdfLaTeX 下工作完美。你可以用\Circled命令像普通文本一样包裹任何需要加圈的数字或字母灵活且可靠。场景四个人项目使用 XeLaTeX/LuaLaTeX 并已配置好喜爱的字体且该字体已知包含美观的带圈数字字形。推荐方案直接输入Unicode字符①、②或使用\unicode命令。理由这是最“原生”、最轻量的方式。直接输入字符使得源代码非常易读且能充分利用所选字体的设计美感。前提是你确认了字体支持。场景五需要在数学模式中使用带圈数字作为变量或特殊算子。推荐方案在unicode-math环境下使用$\circled{1}$或使用amsmath提供的\textcircled但要注意其在数学模式中的框线问题。深入分析在数学模式中符号的间距、粗细需与周围的数学运算符协调。unicode-math的\circled是专门为数学环境设计的。如果使用circledsteps的\Circled你需要将其包裹在\text{...}中即$\text{\Circled{1}}$但这可能破坏数学模式的间距属性。此时字体方案或专门的数学符号包往往是更好的选择。决策流程图快速参考开始 │ ├─ 项目是否强制使用 pdfLaTeX │ ├─ 是 → 选择 circledsteps 方案。 │ └─ 否 → 进入下一步。 │ ├─ 是否需要自动化列表编号 │ ├─ 是 → 选择 circledsteps enumitem。 │ └─ 否 → 进入下一步。 │ ├─ 带圈数字是否超过10个 │ ├─ 是 → 选择 circledsteps 或 Unicode字体方案。 │ └─ 否 → 进入下一步。 │ ├─ 是否追求极简、不想引入额外宏包 │ ├─ 是 → 使用 pifont (≤10) 或确认字体后使用Unicode (Xe/LuaLaTeX)。 │ └─ 否 → 推荐 circledsteps以获得最佳可控性和兼容性。 │ └─ 结束5. 常见问题排查与进阶技巧即使选择了合适的方案在实际操作中也可能遇到一些棘手的问题。这里我总结几个最常见的坑和解决方法。5.1 编译错误Undefined control sequence. \ding问题使用了\ding{172}但编译报错提示\ding未定义。原因没有在导言区加载pifont宏包。解决在\documentclass之后添加\usepackage{pifont}。5.2 符号显示为空白或错误字符问题使用pifont时\ding{...}显示的不是预期的带圈数字而是一个方框、空白或其他符号。原因1编码记错了。确认你使用的编码是否正确1-10对应172-181。原因2Unicode方案当前字体不包含该Unicode字符的字形。解决对于pifont查阅文档确认编码在命令行运行texdoc pifont查看第2-3页的表格。对于Unicode方案更换一个符号覆盖全的字体。可以在导言区尝试\setmainfont{DejaVu Serif}或\setmainfont{FreeSerif}等字体进行测试。5.3 带圈数字与周围文字对齐不佳问题带圈数字的基线与同行普通数字的基线对不齐显得高低不一。原因不同生成方式下圆圈的中心与文本基线的对齐方式有差异。pifont的符号和字体中的Unicode字符通常对齐较好。circledsteps绘制的图形默认是垂直居中对齐有时需要微调。解决针对circledsteps可以使用\raisebox命令进行手动微调。\usepackage{circledsteps} \newcommand{\adjcircled}[1]{\raisebox{-0.1ex}{\Circled{#1}}} % 向下微调0.1ex 调整前1 vs \Circled{1}。 调整后1 vs \adjcircled{1}。ex是相对于当前字体字母“x”高度的单位微调时通常用0.1ex,-0.05ex这样的值进行尝试。5.4 在章节标题、图表标题中使用带圈数字问题将\Circled或\ding直接用在\section{}或\caption{}中可能会报错或导致目录、引用出错。原因这些命令是“脆弱的”fragile在移动参数如标题、目录项中直接展开会出问题。解决使用\protect命令保护它们。\section{实验步骤\protect\Circled{1}准备工作} \caption{示意图\protect\ding{172}}对于在enumitem的标签定义中我们已经见过了\protect的用法原理相同。5.5 生成PDF书签hyperref时出现乱码问题使用了hyperref宏包生成带书签的PDF但书签中的带圈数字变成了乱码。原因hyperref在生成书签字符串时可能无法正确处理某些特殊符号或TikZ绘制的图形。解决这是比较棘手的问题。最稳妥的方法是避免在章节标题等会被提取为书签的地方使用复杂的带圈符号。如果必须使用可以考虑使用\texorpdfstring命令为hyperref提供一个纯文本的替代版本。\usepackage{hyperref} \section{\texorpdfstring{步骤 \Circled{1}}{步骤 1}}这样在正文中显示“步骤 ①”但在PDF书签中则显示为“步骤 1”。经过以上几个方案的详细对比和实战分析相信你已经对在LaTeX中处理带圆圈数字有了全面的认识。从我个人的经验来看对于大多数新的、可控的项目circledsteps宏包是当前的最优解。它平衡了兼容性、功能性和美观性。虽然需要额外引入一个宏包但它所带来的“一劳永逸”的自动化能力和样式自由度是其他方案难以比拟的。下次当你的文档需要这些精致的小圆圈时不妨试试它。