记录LaTeX中文文档有关字符显示的字体、连字、中文URL、带圈数字等问题。

本文示例仓库见marvel084/LaTeXTest2024 (github.com)

LuaLaTeX vs XeLaTeX

在字符显示上

LuaTeX优点

  • csl(citeproc-lua)配合的很好
  • 使用ctex时,支持\url直接显示URL中的汉字
  • TH-Times字体支持彩色emoji,且使用ZWJ的不受干扰
  • pmhanguljamo宏包可以正常显示(古)谚文

LuaTeX缺点

  • 多语言TTC字体TH-Times无法直接使用,加polyglossia包后可使用
  • (西文)fontspec定义的字体,不加Script参数不能正确处理“连字/位置变体”(如八思巴文) ꡂ ꡦ ꡃ -> ꡂꡦꡃ)
  • 配合BixbLaTeX时,不能正确显示参考文献的中文URL(用的biblatex-gb7714-2015 issue方法,biblatex-gb7714-2015本身会对中文url转义,这也导致用lualatex编译会因url和urlraw不一致而报错终止)(待复现)
  • 使用ctex(luatex-ja)后不能拼合古谚文,需调至西文ALchar显示
  • fontspec定义的字体(使用Script=Hangul参数)。在TeX Live 2023及以上发行版中,在使用LuaLaTeX编译时,如果一个谚文的初、中声刚好能拼成现代韩语音节(谚文音节区段Hangul Syllables"AC00-"D7AF),则该音节会抢先显示,把终声甩在后头,从而使古谚文无法正确拼合。

XeTeX优点

  • (西文)fontspec定义的字体(不加Script参数)能正确处理“连字/位置变体”(如八思巴文)
  • (中文)xeCJK定义的字体能正确拼合古谚文(如 拼成ᄎᆑᇙ
  • 配合BibLaTeX能正确显示参考文献的中文URL(见biblatex-gb7714-2015 issue

XeTeX缺点

  • 不能直接使用csl(citeproc-lua)参考文献后端,但可以配置latexmkrc等方式使用
  • \url无法正确显示中文URL,遇中文网址需转义或改用\href
  • pmhanguljamo宏包显示谚文会被xeCJK干扰从而显示错误,可用polyglossia分别配置语言环境解决
  • TH-Times字体不支持彩色emoji,polyglossia+ctex时使用ZWJ的emoji无法显示(如麻将红宝牌 🀔\char"200D🟥

字体

参见:

西文字体

出处见水印

fontspec

fontspec用来配置(西文)字体,可以指定OpenType字体的参数

  • 分别设置正文衬线、无衬线、等宽字体
 \setmainfont{texgyretermes}[      %仿TimesNewRoman字体
  Extension      = .otf,
  UprightFont    = *-regular,
  BoldFont       = *-bold,
  ItalicFont     = *-italic,
  BoldItalicFont = *-bolditalic,
  Ligatures      = TeX,
]%
\setsansfont{texgyreheros}[
  Extension      = .otf,
  UprightFont    = *-regular,
  BoldFont       = *-bold,
  ItalicFont     = *-italic,
  BoldItalicFont = *-bolditalic,
]%
\setmonofont{texgyrecursor}[
  Extension      = .otf,
  UprightFont    = *-regular,
  BoldFont       = *-bold,
  ItalicFont     = *-italic,
  BoldItalicFont = *-bolditalic,
  Scale          = MatchLowercase,
  Ligatures      = CommonOff,
]%

对于粗体、斜体等变化可以使用Style,可以调用其他字体。

对于TrueType TTC字体没有对应的Bold字体的话,可以定义伪粗体:

\setmainfont{TH-Times}[AutoFakeBold]
  • 设置特定参数的字体

设置Script以显示特定语言

\newfontfamily\psp{TH-Times}[Script=Phags-pa] %八思巴文 TH-Times修正了NotoSansPhagsPa的错误
\newfontfamily\hangulfont{Noto Serif CJK KR}[Script=Hangul] % 谚文

天珩字库的TH-Times1对许多语言支持很好,可用于手动fallback

\newfontfamily\fb{TH-Times}
\newfontfamily\fbtk{TH-Times}[Language=Turkish]

pandoc的字体有fallback,仅LuaTeX可用,见Pandoc - Pandoc User’s Guide

pandoc设置fallback字体

LuaTeX可设置fallback feature Fallback fonts in LuaTeX via 'luaotfload.add_fallback' (was "Fontsets") (gnu.org)

\directlua{
luaotfload.add_fallback ("fallbacktest",
        {
            "oldstandard:mode=harf;script=grek;color=0000FF;",
            "oldstandard:mode=harf;script=cyrl;color=0000FF;",
            "freeserif:mode=harf;script=arab;color=0000FF;",
            "freeserif:mode=harf;script=dev2;color=0000FF;",
        }
    )
}
\setmainfont{latinmodernroman}[RawFeature={fallback=fallbacktest}]

polyglossia

Overleaf介绍利用polyglossiafontspec显示多语言:Multilingual typesetting on Overleaf using polyglossia and fontspec - Overleaf

polyglossia用于处理多种语言的显示,可以设置多种语言环境

\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{korean}

使用polyglossia能解决一些问题:

  • LuaTeX下使用多语言TrueType TTC字体TH-Times1需要搭配polyglossia
  • xeCJK下使用pmhanguljamo宏包需要使用polyglossia配置korean环境

但与ctex会有一些冲突:

  • polyglossia会覆盖ctex的scheme,如图表题注、目录标题会被替换成Figure、Table、Contents,需手动设置

    % polyglossia参数控制图标题注,需启用setmainlanguage为english后起效
    \setmainlanguage{english}
    \gappto\captionsenglish{\def\tablename{表}}
    \gappto\captionsenglish{\def\figurename{图}}
    \gappto\captionsenglish{\def\contentsname{目~~录}}
    \gappto\captionsenglish{\def\listfigurename{图~~片}}
    \gappto\captionsenglish{\def\listtablename{表~~格}}
    % 或使用caption宏包控制图标题注
    \usepackage{caption}
    \captionsetup[figure]{name=图}
    \captionsetup[table]{name=表}
  • XeTeX下polyglossia要置于ctex前,否则汉字显示失败
  • 与xeCJK冲突,TH-Times字体使用ZWJ组合的emoji无法正常组合(如麻将红宝牌 🀔\char"200D🟥

中文字体

LaTeX使用中文一般用ctex包,ctex在XeTeX下会包含xeCJK;而在LuaTeX下包含LuaTeX-ja,并且魔改了LuaTeX-ja的部分设置

cetx手册v2.5.10

ctex魔改luatex-ja设置

CJK字体的设置与fontspec类似,比如设置正文为思源宋体,加粗为思源黑体,斜体为楷体

\setCJKmainfont{Source Han Serif SC}[
    BoldFont={Noto Sans CJK SC},
    % ItalicFont={KaiTi},
    ItalicFont={AR PL KaitiM GB}, % TeX楷体
    Script=CJK, 
]
\setCJKsansfont{Noto Sans CJK SC}
\setCJKmonofont{Noto Sans Mono CJK SC}

由于ctex会把干涉字符的划分,因此要实现某些功能时,需将某些字符划给西文或中文。

ctex魔改了luatex-ja的设置,字符范围2、3 为ALchar,6为JAchar。下面是修改汉字和谚文的分区

% 给圈码数字分区,糅合THUThesis与https://www.cnblogs.com/coderzjz/p/15821966.html
\ltjdefcharrange{6}{%
%带圈字母数字,CJK汉字部首补充,【修改】CJK符号和标点,汉文训读符号,片假名语音扩展
"2460-"24FF, "2E80-"2EFF, "3000-"303F, "3190-"319F, "31F0-"4DBF,
%CJK统一,CJK兼容,竖排形式,CJK兼容形式(竖排标点),半角及全角字符
"4E00-"9FFF, "F900-"FAFF, "FE10-"FE1F, "FE30-"FE6F, "FF00-"FFEF,
%假名补充 假名扩展A 小型假名扩展,带圈字母数字补充 带圈表意文字补充,CJK二三平面,变体选择符补充
"1B000-"1B16F, "1F100-"1F2FF, "20000-"3FFFF, "E0100-"E01EF,
%【新增】圈1-10反白,CJK扩展A,注音符号,注音扩展
"2776-"277F, "3400-"4DBF, "3100-"312F, "31A0-"31BF,"1100-"11FF,"3130-"318F,"A960-"A97F}

\ltjdefcharrange{3}{
  "1100-"11FF,"3130-"318F,"A960-"A97F,"D7B0-"D7FF,"302E-"302F %谚文声调附点 302E 302F
}
\ltjdefcharrange{3}{
  "AC00-"D7AF % 现代韩语音节,开启后ctex+polyglossia可谚文傍点,但正文CJK字体无法显示韩语
}

在xeCJK中使用

\xeCJKDeclareCharClass{CJK}{}

汉字分区

Unicode汉字在第0平面有CJK统一表意文字、CJK扩展A区、CJK兼容汉字;第2平面有CJK扩展B、C、D、E、F、I区和兼容增补;第3平面有扩展G、H区,总共10万余汉字。一般字体仅能支持第0平面的部分汉字,像思源宋体(Source Han Serif)只能覆盖全部的CJK统一区和扩展A,以及部分CJK兼容区汉字。Windows中有支持扩展B的SimSun-ExtB,支持第2平面的部分汉字但不全。

Unicode标准每年更新会在各区的空余处追加一些汉字,故一些旧的字体可能对已支持的区段也覆盖不全,如debian12源中Noto Serif CJK就比最新的思源宋体支持的字少。2025年将新增扩展J区,并在扩展C追加数个急用汉字2,未来第3平面将会收录篆书、金文、简帛文、陶文、鸟虫书等。3

支持全字集的字体有天珩字库典迹汉字等,更多字体见维基百科:Unicode扩展汉字。由于字体单文件最多65536字符,想显示10万汉字只能分文件显示,TeX也支持汉字的分区设置字体,ctex为此也做了优化。

XeTeX下使用xeCJK原生设置CJK分区别名,并在字体中使用这些分区别名

%定义CJK字体分区
\xeCJKDeclareSubCJKBlock{P0-CJKpart}{"2FF0->"2FFF, "3100->"312F, "31A0->"31BF, "31C0->"31EF} %第0平面部分CJK相关
\xeCJKDeclareSubCJKBlock{CJKExtA}{"3400-> "4DBF} %CJK扩展A
\xeCJKDeclareSubCJKBlock{CJKUnified}{"4E00 -> "9FFF} %CJK统一
\xeCJKDeclareSubCJKBlock{CJKCompat}{"F900-> "FAFF} %CJK兼容
\xeCJKDeclareSubCJKBlock{CJKCompat-Source}{"FA6E-> "FAFF} %CJK兼容,思源宋体不支持的部分
\xeCJKDeclareSubCJKBlock{SPUA}{ "E400 -> "E4DA , "E500 -> "E5E8 , "E600 -> "E6CE } %私用区
\xeCJKDeclareSubCJKBlock{P2}{ "20000 -> "2EE5F } %第2平面汉字(CJK扩展BCDEFI)
\xeCJKDeclareSubCJKBlock{P3}{ "30000 -> "323AF } %第3平面汉字(CJK扩展GH)
\xeCJKDeclareSubCJKBlock{P16}{ "100000 -> "10FFFF } %第16平面汉字(补充私用区B)
%设置中文字体
\setCJKmainfont[
    CJKCompat-Source=TH-Tshyn-P0,  % 思源宋体CJK兼容区缺失的,
    P0-CJKpart=TH-Tshyn-P0,            % 0平面部分字,
    P2=TH-Tshyn-P2,                % 2平面,
    P3=TH-Tshyn-P1,                % 3平面字交给 天珩字库 http://cheonhyeong.com/Simplified/download.html
    ]{Source Han Serif SC} %思源宋体

XeTeX下也可以设置fallback字体,当字集显示不全时即会调用备用字体

\xeCJKsetup{AutoFallBack}
\setCJKfallbackfamilyfont{\CJKrmdefault}{{TH-Times},{TH-Tshyn-P0},{TH-Tshyn-P2},{TH-Tshyn-P1}} %CJKfallback字体列

LuaTeX下可也设置CJK字体分区,ctex为此提供了设置参数。在CJK字体设置中用 AlternateFont设置分区字体

\ctexset
{
    declarecharrange =
        {
            {P0-CJKpart} {"2FF0 -> "2FFF , "3100 -> "312F , "31A0 -> "31BF , "31C0 -> "31EF} , %P0的部分CJK
            {CJKCompat-Source} {"FA6E-> "FAFF}, %CJK兼容 思源宋体不支持的部分
            {P2} { "20000 -> "2EE5F } , %第2平面汉字
            {P3} { "30000 -> "323AF } , %第3平面汉字
        }
}

\setCJKmainfont{Source Han Serif SC} %思源宋体
[
    AlternateFont={
        {P0-CJKpart,CJKCompat-Source} {TH-Tshyn-P0}, 
        {P2} {TH-Tshyn-P2}, 
        {P3} {TH-Tshyn-P1}, % 天珩字库 http://cheonhyeong.com/Simplified/download.html
    }
]

显示示例全文见:Unicode CJK扩展区 显示测试页面 - Sakiko's Blog (earlywolf.cn)

多字体显示汉字不同区段

中文字体集

ctex有fontset参数指定加载的字库

  • windows用中易字库
  • ubuntu用思源宋体、思源黑体和TeX发行版自带的文鼎楷体
  • founder用方正字库,等等……

预定义的中文字库还的字体预设:

  • 基本都有的:\songti宋体,\heiti 黑体,\fangsong仿宋(ubuntu中没有), \kaishu楷体
  • windowsfoundermacnew中有的:\lishu隶书,\youyuan幼圆
  • windowsmacnew中有的:\yahei微软雅黑
  • macnew中有的:\pingfang苹方

ctex默认正文用宋体,粗体\textbf用黑体,斜体\textit\textsl用楷体显示。

对于Pandoc转义的文档,粗体\textbf斜体\emph,也会用黑体、楷体显示。

Pandoc转义的文档还会有删除线\sout,需要下面配置才能显示(如果你动过模板,输出的是\st那下面这两条重定义命令要反着写)

%%删除线
\ifLuaTeX
  \usepackage{luacolor}
  \usepackage[soul]{lua-ul} %eisvogel模板所采用,配合markdown删除线
  \newcommand*{\sout}[1]{\st{#1}}
  % \usepackage{ulem} %不支持中文
\fi
\ifXeTeX
  \usepackage{xeCJKfntef}
  % \renewcommand{\st}[1]{\sout{#1}}
\fi

上面说的\songti \heiti 等会调用CJK字体族zhsong zhhei等,这些也可自定义:

\setCJKfamilyfont{zhsong}{Source Han Serif SC}
[
    UprightFont = *-Regular,
    BoldFont = *-Bold,
    ItalicFont = *-Regular,
    BoldItalicFont = *-BoldSC
]
\setCJKfamilyfont{zhhei}{Noto Sans CJK SC}
[
    UprightFont = *-Regular,
    BoldFont = *-Bold,
    ItalicFont = *-Regular,
    BoldItalicFont = *-Bold
]

字符变形

TH-Times是天珩字库用于处理多语言复杂文本变形的字体,此节主要讨论此字体。见TH-Times核心说明书 (cheonhyeong.com)蒙古文字变形规则说明 (cheonhyeong.com)

  • 连字

TH-Times字体定义了多种连字,st ct Qu Th ff fi fí ft ff ffi ſ‍s 这些均会自动连字,另有数字2nd 12th等连字(2th 12nd等错误写法则不会连字)

但由于TH-Times启用了过多连字,也非像Open Type可调,因此西文正文最好用正常的字体,需要连字等特殊显示时再调用TH-Times

%% 英文字体
\setmainfont{TeX Gyre Pagella}[Ligatures=TeX]
\newfontfamily\fb{TH-Times} %手动fallback用TH-Times
  • 标准化变体序列(Standardized Variation Sequence,SVS)

通过后接变体选择符来实现字符变体,变体选择符在"FE00-"FE0F有16个,另有在特殊用途平面"E0100-"E01EF扩充至256个,不过一般的字符只用到一两个

如八思巴文的反转形式是+VS01("FE00),如 ꡖ "A856与 ꡖ︀ "A856 "FE00

  • 位置变体

八思巴文的元音存在位置变体,词首词尾不一样

八思巴文位置变体

此特性可以通过[Script=Phags-pa]正常显示

\newfontfamily\psp{TH-Times}[Script=Phags-pa] %TH-Times修正了NotoSansPhagsPa的错误

使用Script参数使正确变形

  • 彩色字符

LuaTeX下可显示彩色字符

TH-Times彩色字体

更多特性请见本文示例仓库marvel084/LaTeXTest2024 (github.com)

谚文显示请见CTEX中文LaTeX文档中古谚文的显示CTeX中文LaTeX文档中古谚文的显示 - 知乎 (zhihu.com)

中文URL

LaTeX一般用\url{}显示URL链接,显示文内链接用\href{url}{text}hyperref包含了url包。\url对含特殊字符的URL能正常显示,比如%可以在文中键入而不被注释。不过\url并不支持非拉丁字符,含有中文的链接一般要转义后再用\url显示。

\url{https://ctext.org/wiki.pl?if=gb&chapter=552474&remap=gb#纪载宝坻县记}
\url{https://ctext.org/wiki.pl?if=gb&chapter=552474&remap=gb#%E7%BA%AA%E8%BD%BD%E5%AE%9D%E5%9D%BB%E5%8E%BF%E8%AE%B0} % #%&可以直接输入

LuaTeX+ctex url中汉字正常显示

在使用ctex宏包后,LuaTeX能显示\url中的汉字,而XeTeX中汉字无法显示,这应该与luatex-ja和xeCJK对字符的处理有关,LuaTeX汉字自动用CJK显示,XeTeX url中字符全用西文字体,特别是设置了url样式的话:

\urlstyle{same} % 使用西文main字体
\urlstyle{rm}     % 使用西文衬线字体

使用西文字体

若要显示强制汉字可以换url字体:

\newfontfamily\urlfontcjk{Noto Serif CJK SC} % 用于支持url的字体
\def\UrlFont{\urlfontcjk}

使用CJK字体

不过\url有个更致命的问题,无论LuaTeX还是XeTeX都无法使url在汉字处断行。想要彻底解决需换用href

\url的问题:

  • 无法在中文字符处换行
  • 不会自动转义中文字符
  • cjk字符在xetex默认西文字体不支持显示

换用\href{url}{text}也有问题:

  • 汉字处可断行,而英文处反倒无法正确换行
  • text中不能有特殊字符,如{ } $ & # % _ ~ ^ \ |这些

解决href无法在英文处断行的问题,biblatex-gb7714-2015 issue#50 的回复提供了一种使用seqsplit断行的方法

\usepackage{seqsplit}
\href{#1}{\UrlFont\seqsplit{#1}}

href配合seqsplit

不过链接中的特殊字符还需要手动转义,可以手动使用正则表达式替换,或定义钩子等方法自动替换,此处不絮。

对于参考文献条目URL含中文的情况,详见第3回【LaTeX参考文献格式】(还没写完),对biblatex和citeproc-lua引擎给出替换方法。特别是citeproc-lua能自动转义特殊字符,方便利用。下面仅简述:

BibLaTeXbiblatex-gb7714-2015 issue#50 的回复,判断URL是否会转义,会则替换成href显示原文:

\usepackage{seqsplit} %
\DeclareFieldFormat{urlraw}{\href{#1}{\UrlFont\seqsplit{#1}}} %url原文(urlraw)用\href显示
\renewbibmacro*{url}{%
\iffieldsequal{url}{urlraw}{\printfield{url}}{\printfield{urlraw}}% 英文URL用url,含中文URL用urlraw
}

citeproc-lua 可以修改citeproc-lua源码,将citeproc-output.lua行2103原url改为href(需要seqsplit宏包),还利用了citeproc-lua自身的代码,将text中非法字符转义掉,就是中英文全用href显示了:

function LatexWriter:write_link(inline, context)
  if inline.href == inline.value then
    -- URL
-     return string.format("\\url{%s}", inline.value)
+   return string.format("\\href{%s}{\\seqsplit{%s}}", inline.href, self:write_escaped(inline.value, context))
  elseif context.engine.opt.wrap_url_and_doi then
    return string.format("\\href{%s}{%s}", inline.href, self:write_escaped(inline.value, context))
  else
    return self:write_escaped(inline.value, context)
  end
end

带圈数字

参考:带圈数字 | Stone Zeng’s Site (stone-zeng.site)

带圈字母与数字在Unicode的码段并不连续:

样式码段
常规"24EA ⓪;"2460-"2473 ①-⑳;"3251-"325F ㉑-㉟;"32B1-"32BF ㊱-㊿
反白"24FF ⓿;"2776-"277F ❶-❿;"24EB-"24F4 ⓫-⓴
无衬线"1F10B 🄋; "2780-"2789 ➀-➉;等宽圈01F10D
无衬线反白"1F10C 🄌;"278A-" 2793 ➊-➓
双线"24F5-"24FE ⓵-⓾
加框"3248-"324F ㉈、㉉、㉊、㉋、㉌、㉍、㉎、㉏
带圆括号"2474-"2487 ⑴-⒇
带点"1F100 🄀;"2488-"249B ⒈-⒛
带逗号"1F101- "1F10A 🄁-🄊
带圆括号汉字"3220-"3229㈠-㈩
带圈汉字"3280-"3289 ㊀-㊉
方框汉字和六角括号汉字"1F229 🈩 "1F214🈔 "1F22A🈪 "1F242🉂 "1F241🉁

分布在Unicode区段:

带圈数字可以由支持圈码的字体直接显示,也可以用LaTeX的\textcircled实现,不过后者会使用正文字体渲染,某些字体下(如Tex Gyre Termes)数字会突破圆圈。

xunicode-addon宏包提供了一种方式:在使用\textcircled时,如果有则自动转为Unicode对应字符显示,默认使用西文字体。ctex也会包含xunicode-addon,我们可以设置使圈码使用中文字体

首先圈码划给中文,以支持带圈数字unicode的直接显示

\usepackage{fontspec,xunicode-addon,ctex}
\ifXeTeX
\xeCJKDeclareCharClass{CJK}{%带圈数字划给CJK
  "24EA,        % ⓪
  "2460->"2473, % ①->⑳
  "3251->"32BF, % ㉑->㊿
  "24FF,        % ⓿
  "2776->"277F, % ❶->❿
  "24EB->"24F4  % ⓫->⓴
}
\fi
\ifLuaTeX
% 给圈码数字分区,糅合THUThesis与https://www.cnblogs.com/coderzjz/p/15821966.html
% ctex 将带圈数字 U+2460–U+24FF 归入字符范围 3(ALchar),这里改回范围 6(JAchar)
\ltjdefcharrange{6}{    %用不了这么多,可以适当删
%带圈字母数字,CJK汉字部首补充,【修改】CJK符号和标点,汉文训读符号,片假名语音扩展
"2460-"24FF, "2E80-"2EFF, "3000-"303F, "3190-"319F, "31F0-"4DBF,
%CJK统一,CJK兼容,竖排形式,CJK兼容形式(竖排标点),半角及全角字符
"4E00-"9FFF, "F900-"FAFF, "FE10-"FE1F, "FE30-"FE6F, "FF00-"FFEF,
%假名补充 假名扩展A 小型假名扩展,带圈字母数字补充 带圈表意文字补充,CJK二三平面,变体选择符补充
"1B000-"1B16F, "1F100-"1F2FF, "20000-"3FFFF, "E0100-"E01EF,
%【新增】圈1-10反白,CJK扩展A,注音符号,注音扩展
"2776-"277F, "3400-"4DBF, "3100-"312F, "31A0-"31BF,"1100-"11FF,"3130-"318F,"A960-"A97F}
\fi

重定义钩子在使用 \textcircled时切换至中文字体

%% 带圈数字字体 https://stone-zeng.site/2019-02-09-circled-numbers
% XeLaTeX 下需要把全体带圈数字都设置成 Default 类(上方有CJK了,不需要)
% \xeCJKDeclareCharClass{Default}{"24EA, "2460->"2473, "3251->"32BF}
% 将中文字体声明为(西文)字体族(我这思源宋缩放时会有问题,TH-Times会好些)
% \newfontfamily\EnclosedNumbers{TH-Times} %天珩字库
\newfontfamily\EnclosedNumbers{Noto Serif CJK SC}
% 放置钩子,只让带圈字符才需更换字体
\AtBeginUTFCommand[\textcircled]{\begingroup\EnclosedNumbers}
\AtEndUTFCommand[\textcircled]{\endgroup}

带圈数字显示测试

脚注与note式参考文献脚注使用圈码及其格式配置见第3回【LaTeX参考文献格式】。

thuthesis模板处理圈码的方式,直接用数字往上加"245F,即使用"2460-"2469的带圈数字①-⑩显示,由于圈码的unicode区段并不连续,此方法也只能单页显示有限个脚注,这对于频用脚注的文章可能是不够的。

\newcommand\thu@circled[1]{%
\ifnum#1 >10\relax
 \thu@warning{%
   Too many footnotes in this page.
   Keep footnote less than 10%
 }%
\fi
{\symbol{\the\numexpr#1+"245F\relax}}%
}