选项29ff.com

29ff.com  时间:2021-03-20  阅读:()
CTEX宏集手册CTEX.
ORG2021/03/14v2.
5.
6简介CTEX宏集是面向中文排版的通用LATEX排版框架,为中文LATEX文档提供了汉字输出支持、标点压缩、字体字号命令、标题文字汉化、中文版式调整、数字日期转换等支持功能,可适应论文、报告、书籍、幻灯片等不同类型的中文文档.
CTEX宏集支持LATEX、pdfLATEX、XLATEX、LuaLATEX、upLATEX等多种不同的编译方式,并为它们提供了统一的界面.
主要功能由宏包ctex以及中文文档类ctexart、ctexrep、ctexbook和ctexbeamer实现.
目录第1节介绍2第2节简明教程32.
1CTEX宏集的组成32.
2CTEX宏集的安装和更新.
.
.
32.
3使用CTEX文档类42.
4使用ctex宏包5第3节宏包选项与\ctexset命令5第4节编译方式、编码与中文字库64.
1编译方式64.
2中文编码64.
3中文字库6第5节排版格式设定85.
1文档默认字号85.
2章节标题风格95.
3排版方案选项10第6节文档汉化116.
1日期汉化116.
2文档标题汉化126.
3页面格式设置与汉化13第7节章节标题样式设置157.
1编号相关167.
2格式相关177.
3间距、缩进相关227.
4目录、附录相关257.
5辅助命令267.
6示例27第8节实用命令278.
1字号与间距278.
2中文数字转换278.
3杂项29第9节LuaLATEX下的中文支持方式299.
1LuaLATEX下替代字体的设置.
29第10节CTEX宏集的配置文件3010.
1修改宏包默认选项3110.
2宏包载入后的配置3110.
3配置标题中文翻译3110.
4自定义字体集32第11节对旧版本的兼容性3211.
1CTEX0.
8a及以前的版本.
.
.
3211.
2CTEX0.
9–CTEX1.
0d3211.
3CTEX1.
02c以后的SVN开发版3411.
4CTEX2.
2之前的版本3411.
5CTEX2.
4.
1和2.
4.
234ctex-kitrev.
07425fe.
1第1节介绍211.
6CTEX2.
5之前的版本34第12节宏集依赖情况与手工安装方法35第13节开发人员36第14节代码实现38版本历史147代码索引149第1节介绍历史CTEX宏集的源头有两个:一是王磊编写的cjkbook文档类,二是吴凌云编写的GB.
cap.
这些工作没有经过认真系统的设计,也没有用户文档,不利于维护和改进.
2003年,吴凌云使用doc和DocStrip重构了整个工程,并增加了许多新的功能,称为ctex宏包.
2007年,oseen和王越在ctex宏包的基础上,增加了对UTF-8编码的支持,开发出了ctexutf8宏包.
2009年5月,我们在GoogleCode建立了ctex-kit项目1,对ctex宏包及相关脚本进行了整合,并加入了对XTEX引擎的支持.
在开发新版本时,考虑到合作开发和调试的方便,我们放弃了doc和DocStrip,采取了直接编写宏包代码的方式.
2014年3月,为了适应LATEX的最新发展,特别是LATEX3的逐渐成熟,李清用LATEX3重构了整个宏包的代码,并重新使用doc和DocStrip工具进行代码的管理,升级版本号为2.
0,并改称CTEX宏集.
2015年3月,由于GoogleCode即将停止服务,ctex-kit项目迁移至GitHub2.
最初,Knuth在设计开发TEX的时候没有考虑到多国文字支持,特别是对多字节的中日韩表意文字的支持.
这使得TEX以至后来的LATEX对中文的支持一直不是很好.
即使在CJK宏包解决了中文字符处理的问题以后,中文用户使用LATEX仍然要面对许多困难.
这些困难里,以章节标题的中文化为最.
由于中文和西文书写习惯的差异,用户很难使用标准文档类中的代码结构来表达中文标题.
于是,用户不得不对标准文档类做较大的修改.
除此之外,日期格式、首行缩进、中文字号和字距等细节问题,也需要精细的调校.
我们设计CTEX宏集的目的之一就是解决这些LATEX文档的汉化难题.
另一方面,随着TEX引擎和LATEX宏包的不断发展,LATEX的中文支持方式从早期的专用系统(如CCT)发展为适用于不同引擎的多种方式3.
这些方式的适用情况和使用方式有不少细节上的差异,同时操作系统的不同、语言环境的不同等客观情况又进一步带来了更多的细节差异.
我们设计CTEX宏集的另一个主要目的就是尽可能消除这些差异带来的影响,使用户能够以一个统一的接口来使用不同的中文支持方式,使得同一份文档能够在不同环境下交换使用.
CTEX宏集的许多实现细节离不开热心朋友们在bbs.
ctex.
org论坛4上的讨论,在此对参与讨论的朋友们表示感谢.
关于宏集名字的说明CTEX之名是英文单词China(中国)或Chinese(中文)的首字母"C"与"TEX"结合而成的.
在纯文本环境下,该名字应写作"CTeX".
1http://code.
google.
com/p/ctex-kit/,该链接现已失效.
2https://github.
com/CTeX-org/ctex-kit3比如:pdfTEX引擎下的CJK、zhmCJK宏包,XTEX引擎下的xeCJK宏包和LuaTEX引擎下的LuaTeX-ja宏包.
42018年,CTEX论坛因故无限期关闭,此链接现已失效.
第2节简明教程3CTEX宏集是由CTEX社区发起并维护的LATEX宏包和文档类的集合.
社区另有发布名为CTEX套装的TEX发行版,与本文档所述的CTEX宏集并非是同一事物.
ctex则是本宏集中的ctex.
sty的名字.
这一完全小写的名称,在过去也被用来指代整个CTEX宏集,不过现在则特指ctex.
sty这一宏包.
在不引起歧义的情况下,它也可以沿用过去的习惯,代指整个宏集.
第2节简明教程2.
1CTEX宏集的组成为了适应用户不同的需求,我们将CTEX宏集的主要功能设计安排在四个中文文档类和三个宏包当中,具体的组成见表1.
表1CTEX宏集的组成类别文件说明文档类ctexart.
cls标准文档类article的汉化版本,一般适用于短篇幅的文章ctexrep.
cls标准文档类report的汉化版本,一般适用于中篇幅的报告ctexbook.
cls标准文档类book的汉化版本,一般适用于长篇幅的书籍ctexbeamer.
cls文档类beamer的汉化版本,适用于幻灯片演示宏包ctex.
sty提供全部功能,但默认不开启章节标题设置功能,需要使用heading选项来开启ctexsize.
sty定义和调整中文字号,可以在ctex宏包或CTEX中文文档类之外单独调用ctexheading.
sty提供章节标题设置功能(见7节),可以在ctex宏包或CTEX中文文档类之外单独调用2.
2CTEX宏集的安装和更新最常见的TEX发行版(TEXLive和MiKTEX)已收录CTEX宏集及其依赖的宏包和宏集.
5如果本地安装TEXLive或MiKTEX不是完整版本,则可能需要通过这两个发行版提供的包管理器来安装宏包.
TEXLive的包管理器是tlmgr(TEXLiveManager).
用户可以在系统命令行中6执行tlmgrgui启动管理器的图形界面(Windows用户也可以通过开始菜单的TeXLive20XX(年份)TeXLiveManager打开).
连接上远程仓库之后,搜索ctex即可安装.
tlmgr的图形界面使用Perl编写,在实践中发现容易造成系统假死.
遇到这种问题的用户,也可以直接在系统命令行执行tlmgrinstallctex来安装CTEX宏集7.
5zhmCJK宏包是个例外.
当用户显式指定选项zhmap=zhmCJK时,CTEX宏集依赖它.
由于,它没有被TEXLive和MiKTEX收录,用户可能需要遵照其说明文档自行安装.
6Windows系统的命令行是CMD命令提示符,你可以使用Win+R组合键打开"运行"对话框,然后输入cmd确认打开命令提示符窗口.
7*nix用户可能需要超级用户权限(sudo)才能正确安装宏集.
第2节简明教程4MiKTEX通常会在缺失宏包时自动完成安装.
如需手动安装,可以使用其管理维护工具MiKTEXConsole.
用户可以打开管理器,连接上远程仓库之后,在"Package"选项卡中搜索"ctex"并安装即可.
也可以使用mpm(MiKTEXPackageManager),在命令行执行mpm--admin--install=ctex来安装CTEX宏集.
若希望了解CTEX宏集具体的依赖情况或手工安装宏集的方法,请参阅第12节.
当我们将宏集的新版本发布于CTAN,且为发行版的远程仓库更新后,用户就可以在本地通过包管理器获取新版本.
对于TEXLive,可以在tlmgr的图形界面点击"更新全部已安装的"按钮或者在命令行执行tlmgrupdate--all来完整更新已安装的宏包.
对于MiKTEX,在MiKTEXConsole中找到"Updates"选项卡,检查更新后即可选择升级宏包.
也可以使用mpm,在命令行执行mpm--admin--update来进行更新.
2.
3使用CTEX文档类如果用户需要在三个标准文档类或beamer的基础上添加中文及版式的支持,我们建议用户使用CTEX宏集提供的四个中文文档类.
CTEX宏集提供了四个中文文档类:ctexart、ctexrep、ctexbook和ctexbeamer,分别对应LATEX的标准文档类article、report、book和beamer.
使用它们的时候,需要将涉及到的所有源文件使用UTF-8编码保存8.
例1\documentclass{ctexart}\begin{document}中文文档类测试.
你需要将所有源文件保存为UTF-8编码.
你可以使用XeLaTeX、LuaLaTeX或upLaTeX编译,也可以使用(pdf)LaTeX编译.
推荐使用XeLaTeX或LuaLaTeX编译.
对高级用户,我们也推荐使用upLaTeX编译.
\end{document}以下是使用ctexbeamer文档类编写中文演示文稿的一个示例.
例2\documentclass{ctexbeamer}\begin{document}\begin{frame}{中文演示文档}\begin{itemize}\item你需要将所有源文件保存为UTF-8编码\item你可以使用XeLaTeX、LuaLaTeX或upLaTeX编译\item也可以使用(pdf)LaTeX编译8使用(pdf)LATEX时也能够使用GBK编码,但不推荐.
(见4.
2节)第3节宏包选项与\ctexset命令5\item推荐使用XeLaTeX或LuaLaTeX编译\item对高级用户,我们也推荐使用upLaTeX编译\end{itemize}\end{frame}\end{document}2.
4使用ctex宏包用户在使用非标准文档类及beamer时,如果需要添加中文及版式的支持,则可以使用ctex宏包.
对于建立在LATEX标准文档类之上开发的文档类,在使用ctex宏包时加上heading选项,可以将章节标题设置为中文风格.
例3\documentclass{ltxdoc}\usepackage[heading=true]{ctex}\begin{document}\section{简介}章节标题中文化的\LaTeX{}手册.
\end{document}第3节宏包选项与\ctexset命令CTEX宏集已经尽可能就中文的行文和版式习惯做了调整和配置,通常而言,这些配置已经够用.
因此,除非必要,我们不建议普通用户修改这些默认配置.
如果你认为CTEX宏集的默认配置还可以完善,可以在项目主页上提交issue,向我们反映,我们会酌情在后续版本中予以改进.
不过,CTEX宏集也提供了一系列选项.
用户可以使用这些选项来控制CTEX宏集的行为.
按形式分类,这些选项有的以传统的方式提供,有的以key=value的形式提供.
按指定位置分类,这些选项又可以分为以下三类:名字后带有$号的选项,只能作为宏包/文档类选项,需要在引入宏包/文档类的时候指定;名字后带有号的选项,只能通过CTEX宏集提供的用户接口\ctexset来设定;名字后不带有特殊符号的选项,既可以作为宏包/文档类选项,也可以通过\ctexset来设定.
后续文档将在使用说明中对某些特殊的选项加以说明.
\ctexset{键值列表}是CTEX宏集的通用控制命令,用来在宏包载入后控制宏包的各项功能.
\ctexset的参数是一个键值列表,以通用的接口完成各项设置.
\ctexsetNew:2014-03-18\ctexset的参数是一组由逗号分隔的选项列表,列表中的选项通常是一个key=value格式的定义.
例如设置摘要与参考文献标题名称(6.
2节)就可以使用:例4\ctexset{abstractname={本文概要},bibname={文\quad献}}第4节编译方式、编码与中文字库6\ctexset采用LATEX3风格的键值设置,支持不同类型的选项与层次化的选项设置,相关示例见7节.
第4节编译方式、编码与中文字库4.
1编译方式CTEX宏集会根据用户使用的编译方式9,在底层选择不同的中文支持方式(见表2).
表2CTEX宏集的中文支持方式编译方式(pdf)LATEXXLATEXLuaLATEXupLATEX*支持宏包CJKxeCJKLuaTeX-ja原生*pLATEX-ng(或称ApLATEX)与upLATEX兼容.
使用pLATEX-ng编译时,ctex采用与upLATEX相同的设置.
不同的编译方式和中文支持方式会在一定程度上影响CTEX宏集的行为,比如宏包对文档编码、字体选择、空格、标点等的处理.
具体细节将在本文档后续内容中进行阐述.
4.
2中文编码指明编写文档时使用的编码.
CTEX宏集无法检测文档源文件的实际编码格式,因此需要用户通过选项声明.
如果没有显式指定,则默认采用UTF-8编码.
使用XLATEX、LuaLATEX或upLATEX编译时,CTEX宏集强制使用UTF-8编码,此时GBK选项无效;使用(pdf)LATEX编译时,CTEX宏集默认使用UTF-8编码,但用户也可以显式声明GBK选项,使CTEX宏集按GBK编码处理文档.
用户需要保证编译方式、源文件编码、宏包编码选项三者一致.
我们建议编写新文档时始终使用UTF-8编码,而仅把GBK编码留给历史遗留文档.
GBK$UTF8$Updated:2019-11-104.
3中文字库以往,为LATEX文档配置中文支持是一件相当繁琐的事情.
默认情况下,CTEX宏集能自动检测用户使用的编译方式(参见4.
1节)和操作系统10,选择合适的底层支持和字库,从而简化配置过程.
自动配置的情况参见表3.
通常,由CTEX宏集进行的自动配置已经足够使用,无需用户手工干预;但是CTEX仍然提供了一系列选项,供在CTEX的自动选择机制因为意外情况失效,或者在用户有特殊需求的情况下使用.
除非必要,用户不应使用这些选项.
zhmap=true|false|zhmCJK指定字体映射机制.
本选项只在使用(pdf)LATEX编译时有意义.
zhmap$Updated:2014-03-08true这是该选项的默认值.
11使用zhmetrics宏包,将CJK字库通过\special命令映射到.
ttf文件.
9LATEX、pdfLATEX、XLATEX、LuaLATEX及upLATEX.
10CTEX宏集现在能够识别macOS及Windows系统,并将其他系统统一归为Linux.
11对于以键值对形式提供的选项,文档以粗体来表示其默认值.
下同,不再额外解释.
第4节编译方式、编码与中文字库7表3CTEX宏集自动配置字体策略macOSOld1macOSNew2Windows3其他XLATEXxeCJK华文字库xeCJK华文字库+苹方xeCJK中易字库+微软雅黑xeCJKFandol字库4LuaLATEX5LuaTeX-ja华文字库LuaTeX-ja华文字库+苹方LuaTeX-ja中易字库+微软雅黑LuaTeX-jaFandol字库pdfLATEX不可用不可用CJK+zhmetrics中易字库+微软雅黑6不可用LATEX+DVIPDFM不可用CJK+zhmetrics华文字库+苹方CJK+zhmetrics中易字库+微软雅黑6CJK+zhmetricsFandol字库upLATEX+DVIPDFM不可用zhmetrics-uptex华文字库+苹方zhmetrics-uptex中易字库+微软雅黑zhmetrics-uptexFandol字库1Yosemite(10.
10)及以前的macOS系统.
2ElCapitan(10.
11)及以后的macOS系统.
3仅支持WindowsVista及以后的Windows操作系统.
4由马起园、苏杰、黄晨成等人开发的开源中文字体,参见:https://www.
ctan.
org/pkg/fandol.
5LuaLATEX编译时使用LuaTeX-ja宏包.
对此,第9节有特别说明.
6微软雅黑字体并不总是有效,这和选项zhmap的取值有关.
false使用传统的CJK字库(Type1)12.
zhmCJK载入zhmCJK宏包13,由zhmCJK宏包提供从CJK字库到.
ttf的映射.
fontset=adobe|fandol|founder|mac|macnew|macold|ubuntu|windows|none|.
.
.
指定CTEX宏集加载的字库.
如果没有指定fontset的值,CTEX宏集将自动检测用户使用的操作系统,配置相应的字体(参见表3).
fontsetNew:2014-03-08CTEX预定义了以下六种中文字库.
adobe使用Adobe公司的四款中文字体,不支持pdfLATEX.
fandol使用Fandol中文字体,不支持pdfLATEX.
founder使用方正公司的中文字体.
mac使用macOS系统下的字体,不支持pdfLATEX,根据版本分为macnew和macold两种.
macnew使用ElCapitan或之后的多字重华文字体和苹方字体.
macold使用Yosemite或之前的华文字体.
ubuntu使用Ubuntu系统下的思源宋体、思源黑体和TEX发行版自带的文鼎楷体,不支持pdfLATEX.
windows使用Windows系统下的中易字体和微软雅黑字体.
当使用(pdf)LATEX编译时,微软雅黑仅在以下两种情形有效:安装有zhmCJK宏包且选项zhmap=zhmCJK时,或者安装有微软雅黑的Type1字体且选项zhmap=false时.
如果不想使用CTEX预定义的中文字库,可以设置fontset为下述值之一.
none不配置中文字体,需要用户自己配置.
name这里name为自定义的名字.
CTEX宏集将载入名为ctex-fontset-name.
def的文件作为字体配置文件.
因此,请先保证文件的存在.
可以在当前工作目录或者本地TDS目录树下12使用(pdf)LATEX编译时,如果需要使用自定义的字体映射文件(比如需要使用LATEX+Dvips编译),或者希望使用Type1字库,请禁用本选项.
为此,你可能需要安装CJK字体.
参考zhmetrics宏包提供的脚本CTeXFonts.
lua.
13zhmCJK宏包基于zhmetrics和CJK宏包,提供与xeCJK宏包类似的用户接口.
第5节排版格式设定8合适位置建立一个名为ctex-fontset-name.
def的文件,在这个文件里面自定义中文字体.
然后通过使用fontset=name选项来调用它.
字体配置文件的具体写法可以参考CTEX宏集fontset目录下的字体配置文件.
注意:如果希望使用\ctexset在导言区指定字库,则需要先在宏包/文档类选项中指定fontset=none(这会禁用CTEX宏集的操作系统检测功能和自动设定字库功能).
例如:例5\documentclass[fontset=none]{ctexart}\ctexset{fontset=founder}\begin{document}在文档类选项中声明\verb|fontset=none|,随后在导言区用\verb|\ctexset|指定字体.
\end{document}CTEX宏集预定义的中文字库还定义了一些字体命令.
除了在ubuntu字库中没有\fangsong的定义外,所有字库都有以下四个字体命令:\songti宋体,CJK等价命令\CJKfamily{zhsong}.
\heiti黑体,CJK等价命令\CJKfamily{zhhei}.
\fangsong仿宋,CJK等价命令\CJKfamily{zhfs}.
\kaishu楷书,CJK等价命令\CJKfamily{zhkai}.
在windows、founder和macnew字库中,额外定义了\lishu和\youyuan:\lishu隶书,CJK等价命令\CJKfamily{zhli}.
\youyuan圆体,CJK等价命令\CJKfamily{zhyou}.
在windows字库中还定义了\yahei.
出于兼容性的考虑,\yahei命令在macnew字库中也有定义,但实际调用苹方黑体:\yahei微软雅黑,CJK等价命令\CJKfamily{zhyahei}.
在macnew字库中,还定义了\pingfang:\pingfang苹方黑体,CJK等价命令\CJKfamily{zhpf}.
第5节排版格式设定5.
1文档默认字号zihao=-4|5|false将文章默认字号(\normalsize)设置为小四号字或五号字,具体情况见表4.
false禁用本功能.
本选项可以用于四个CTEX文档类和ctex宏包,也可以用于ctexsize宏包.
该选项的默认值与scheme的取值有关.
当scheme=chinese时,对标准文档类默认值为5,即设置\normalsize为五号字;对beamer则为false,使用文档类原有的设置.
当scheme=plain时,该选项不设默认值,沿用标准文档类或beamer的原有设置.
zihao$New:2015-05-06CTEX文档类是在LATEX标准文档类之上开发的.
因此,除了可以使用CTEX宏包定义的字号选项之外,还可以使用标准文档类的同类选项(10pt、11pt和12pt).
在使用这些来自标准文档类的选项的时候,CTEX文档类的字号选项会被抑制.
亦即,在zihao选项之后设置10pt选项,zihao选项将不再起作用.
10pt$11pt$12pt$第5节排版格式设定9表4标准字体命令与字号的对应zihao=5zihao=-410pt11pt12pt字体命令字号bp字号bpptptpt\tiny七号5.
5小六6.
5566\scriptsize小六6.
5六号7.
5788\footnotesize六号7.
5小五98910\small小五9五号10.
591011\normalsize五号10.
5小四12101112\large小四12小三15121214\Large小三15小二18141417\LARGE小二18二号22171720\huge二号22小一24202025\Huge一号26一号26252525标准文档类的其他选项在CTEX文档类中依旧有效.
例如,设置纸张大小和方向的a4paper和landscape,设置单双面的oneside和twoside等.
CTEX会将这些选项传给标准文档类14.
5.
2章节标题风格heading=true|false本选项只能在调用ctex.
sty时作为宏包选项使用.
CTEX宏集提供了一套用于修改文档章节标题格式的接口.
该选项用于选择是否启用该功能.
详细的设置方法请参见第6.
3节和第7节.
heading$New:2014-03-08CTEX宏集提供的四个文档类总是启用该功能.
如果在ctex.
sty下启用该选项,将会检查当前是否使用LATEX标准文档类.
若然,则该选项将会使得ctex.
sty宏包的行为和CTEX宏集提供的四个中文文档类完全一致;若不然,则会根据\chapter是否有定义来使用ctexbook或者ctexart的标题设置.
修改\paragraph和\subparagraph的格式.
默认情况下,\paragraph和\subparagraph会将标题与随后的正文排版在同一个段落.
启用sub3section会将\paragraph的格式修改为类似\section的格式,并将\subparagraph的格式修改为原本\paragraph的格式.
启用sub4section会将\paragraph和\subparagraph的格式都修改为类似\section的格式.
启用该选项通常还需要将计数器secnumdepth的值为设置为4或5.
具体格式可参考7.
3小节中的runin和afterskip选项.
注意,上述两个选项只有在非beamer文档类下heading选项启用的时候才有意义.
亦即,只有在使用除了ctexbeamer的三个CTEX文档类或启用了heading的ctex.
sty的时候才有意义.
sub3section$sub4section$14事实上,LATEX在文档类中的选项是全局设定的,除了对使用的文档类有影响外,也可能会影响到随后使用的宏包.
如果这些宏包中有某些选项出现在文档类的选项列表中,那么该选项将会被自动激活.
第5节排版格式设定105.
3排版方案选项scheme=chinese|plain选择文章的排版方案,预设有chinese和plain两种方案.
scheme$New:2015-04-15chinese对beamer以外的文档类,调整默认字号为五号字,并调整行距为1.
3;汉化文档中的标题名字(如"图"、"表"、"目录"和"参考文献"等,见6.
2节);在heading=true的情况下15(5.
2节),还会将章节标题的风格修改为中文样式(见7节).
当关闭heading选项的ctex宏包与标准文档类或其衍生文档类联用时,会载入indent-first宏包,以实现章节标题后的段首缩进.
plain不调整默认字号和行距,不会汉化文档中的标题名字,也不会将章节标题风格修改为中文样式,同时不会调整\pagestyle,并禁用autoindent选项.
事实上,此时的CTEX宏集只提供了中文支持功能,而不对文章版式进行任何修改.
punct=quanjiao|banjiao|kaiming|CCT|plain设置标点处理格式.
预定义好的格式有:punctUpdated:2014-04-11quanjiao全角式:所有标点占一个汉字宽度,相邻两个标点占1.
5汉字宽度;banjiao半角式:所有标点占半个汉字宽度;kaiming开明式:句末点号16用占一个汉字宽度,标号和句内点号占半个汉字宽度;CCTCCT式:所有标点符号的宽度略小于一个汉字宽度;plain原样(不调整标点间距).
space=true|false|auto是否在生成的PDF中保留汉字后面的空格.
该选项仅在使用XLATEX/(pdf)LATEX编译时有效.
spaceUpdated:2014-03-08true总是保留汉字后的空格.
此时,用户需要自行在行尾加上%处理换行产生的空格17.
false使用(pdf)LATEX编译时:总是忽略掉汉字后面的空格,不论汉字后是什么;使用XLATEX编译时,等同于auto的效果.
不建议使用该选项.
auto根据空格后面的情况决定是否保留:如果空格后面是汉字,则忽略该空格,否则保留.
例如,使用例6\ctexset{space=true}汉字分词技术English将得到"汉字分词技术English";使用例7\ctexset{space=auto}汉字分词技术English15使用CTEX文档类,或者使用ctex宏包且开启该选项时.
16标点符号分为标号与点号.
点号分为两类,一共七种:句末点号有句号、问号和叹号;句内点号有逗号、顿号、冒号和分号.
17LATEX将单个换行视作一个空格.
第6节文档汉化11则会得到"汉字分词技术English".
使用LuaLATEX及upLATEX编译的时候,该选项无效:汉字间的空格以及汉字与西文字符之间的空格总是有效,不会被忽略,但可以自动忽略掉由换行产生的空格.
linespread=数值接受一个浮点数值,设置行距倍数.
本选项的初始值与scheme有关.
linespread$New:2014-04-23scheme=chinese对标准文档类初始值为1.
3,即1.
3倍行距.
此时,相邻两行的基线(\baselineskip)距离为1.
3*1.
2=1.
56倍字体高度.
对beamer不改变行距,即使用默认的单倍行距.
scheme=plainCTEX宏集默认不调整行距倍数,文档中的行距由所选文档类和其他宏包或用户设置决定.
autoindent=true|false|数值|带单位的数值在字体大小发生变化时,是否自动调整段首缩进(\parindent)的大小.
autoindentNew:2014-03-13数值或带单位的数值用于设置段首缩进的长度.
如果不带单位,则默认单位是单个汉字字宽\ccwd;如果带单位,则使用该单位.
若要显式使用\ccwd为单位,则必须在导言区进行设置.
true等价于设置autoindent=2或在导言区设置autoindent=2\ccwd.
false禁用自动调整功能,可以设置固定长度的段首缩进.
如设置每段缩进40点:例8\ctexset{autoindent=false}\setlength\parindent{40pt}linestretch=数值或长度linestretch是一个比较特殊的选项,它用来设置汉字之间弹性间距的弹性程度.
如果有单位,则可以在选项中直接写;如果是数字,单位则是汉字宽度\ccwd的倍数.
linestretchNew:2014-03-26如果行宽不是汉字宽度的整数倍,为了让段落左右两端对齐,自然就要求伸展汉字之间的间距,而linestretch选项就是设置每行总的允许伸行量.
初始值是允许每行伸行一个汉字的宽度\ccwd,并且此宽度能根据字号变化动态调整.
过小的linestretch可能导致段落文字右侧可能参差不齐;较大的linestretch选项则可以帮助拥有较长不可断行内容的复杂段落方便地断行,而不会产生大量编译警告;但很大的linestretch则会掩盖段落不良断行产生的坏盒子警告.
如果将linestretch选项的值设置为\maxdimen,则可以禁止按字号自动修改每行的允许伸长量.
此时汉字间的弹性间距则固定为\baselineskip的0.
08倍.
第6节文档汉化6.
1日期汉化CTEX宏包对显示当前日期的\today命令进行了汉化,使之以中文的方式显示今天的日期.
如本文档编译时的日期是"2021年3月14日".
today=small|big|old该选项用来控制\today命令的输出格式:small效果为"2021年3月14日".
使用阿拉伯数字和汉字的日期格式.
big效果为"二〇二一年三月十四日".
使用全汉字的日期格式.
old效果为"March14,2021".
使用文档原来的(英文)日期格式.
today第6节文档汉化12设置日期格式使用\ctexset命令完成,例如设置全汉字的日期格式:例9\ctexset{today=big}CTEX宏包的中文日期功能实际上是调用zhnumber宏包完成的.
如果需要更多有关日期、时间的命令和更复杂的设置,可以查阅zhnumber宏包的文档.
6.
2文档标题汉化这里主要介绍由scheme选项(5.
3节)控制的文档标题汉化功能.
设置文档标题名的示例可见例4.
下面的选项(如contentsname)主要用来重新定义与选项同名的宏(如\contentsname)的定义.
contentsname=名字设置目录标题名\contentsname.
中文默认为"目录".
contentsnamelistfigurename=名字设置插图目录标题名\listfigurename.
中文默认为"插图".
listfigurenamelisttablename=名字设置表格目录标题名\listtablename.
中文默认为"表格".
listtablenamefigurename=名字设置图片环境标题名\figurename.
中文默认为"图".
figurenametablename=名字设置表格环境标题名\tablename.
中文默认为"表".
tablenameabstractname=名字设置摘要abstract环境标题名\abstractname.
中文默认为"摘要".
注意book类没有摘要,该选项无效.
abstractnameindexname=名字设置索引标题名\indexname.
中文默认为"索引".
indexnameappendixname=名字设置附录标题名\appendixname.
中文默认为"附录".
appendixnamebibname=名字设置参考文献标题名.
中文默认为"参考文献".
在标准文档类中article的参考文献名使用宏\refname,而book和report使用宏\bibname.
本选项会根据标准文档类的不同,自动设定\refname或是\bibname.
因此,对于标准文档类及对应的CTEX文档类可以统一地使用bibname选项来控制参考文献标题名.
对于beamer及对应的ctexbeamer来说,它们同时具有宏\bibname和宏\refname.
本选项仅控制其中的\bibname;\refname则交由refname选项控制.
bibname第6节文档汉化13proofname=名字设置证明环境的名称\proofname.
中文默认为"证明".
proofname如果使用ctexbeamer文档类或者在beamer文档类下使用ctex包,还会汉化常用定理类环境的诸如"定义"、"定理"和"引理"等名称.
此时,还有下列三个选项.
refname=名字设置参考文献标题名\refname.
中文默认为"参考文献".
注意,三个标准文档类(及相应的CTEX文档类)的参考文献标题名由bibname选项统一设置,本选项仅适用于beamer及其对应的ctexbeamer.
在三个标准文档类(及相应的CTEX文档类)中使用refname选项会报错.
refnamealgorithmname=名字设置算法环境标题名\algorithmname.
中文默认为"算法".
algorithmnamecontinuation=名字设置beamer可断页的帧在续页标题中的延续标识\insertcontinuationtext.
中文默认为"(续)".
continuation6.
3页面格式设置与汉化页面格式设置与汉化的功能(及章节标题样式设置功能,见第7节)由ctexheading宏包完成.
加载该宏包时,或者使用CTEX文档类时,或者是使用ctex宏包并设定选项heading=true时,相关功能被激活.
此时,整个文档的页面格式(pagestyle)被设定为headings,即相当于设置了\pagestyle{headings}在页眉中显示当前章节的编号与标题.
同时,CTEX宏包也会对默认的headings页面格式进行修改,使之调用\CTEXthechapter、\CTEXthesection等宏来正确显示中文的章节编号.
CTEX宏包的默认页面格式设置是经过汉化的headings,其基本效果如本文档所示,只在页眉一侧显示章节编号和标题,另一侧显示页码.
更复杂的页面格式可以通过调用fancyhdr、titleps等宏包来设置.
CTEX宏包同时也为这些自定义页面格式的包提供了以下宏供使用:\CTEXthechapter、\CTEXthesection等章节编号(见7.
5小节).
它们用来代替英文文档类中的\thechapter、\thesection等宏.
\leftmark、\rightmark,它们是在使用章节标题命令后,自动设置的宏.
它们实际是在与章节标题命令对应的标记命令\chaptermark、\sectionmark中调用\markright或\markboth生成的.
有关LATEX页面标记的含义与使用细节,已经超出了本文档讨论的范围.
可以参考[1,Chap-ter23]、[2,§4.
3,§4.
4]等书籍.
这里举一个例子,说明通过重定义\sectionmark,在ctexart文档类中的标准headings页面格式下控制页眉的方式:第6节文档汉化14例10\documentclass{ctexart}\pagestyle{headings}\ctexset{section={name={第,节},number=\arabic{section},}}\renewcommand\sectionmark[1]{%\markright{\CTEXifname{\CTEXthesection——}{}#1}}\begin{document}\section{天地玄黄}\newpage\section{宇宙洪荒}\end{document}在上例中,我们设置了页眉的形式是用破折号分开的节编号与节标题,即"第1节——天地玄黄"、"第2节——宇宙洪荒".
CTEX宏包已经对fancyhdr宏包进行了补丁,载入fancyhdr后,其fancy页面格式将使用\CTEXthechapter等宏显示中文章节编号.
关于fancyhdr的具体用法可以参见其宏包手册.
通常也只要像在标准的英文文档类中使用fancyhdr一样定义页眉页脚格式即可,并不需要额外的定义.
下面我则给出一个与前例类似而稍复杂的例子,展示如何在文档中设置页眉内容与页眉的格式.
例11\documentclass{ctexart}\ctexset{section={name={第,节},number=\arabic{section},}}\usepackage{fancyhdr}\fancyhf{}\lhead{\textnormal{\kaishu\rightmark}}\rhead{--\\thepage\--}\pagestyle{fancy}%\sectionmark的重定义需要在\pagestyle之后生效\renewcommand\sectionmark[1]{%\markright{\CTEXifname{\CTEXthesection——}{}#1}}\begin{document}\section{天地玄黄}\newpage\section{宇宙洪荒}\end{document}本例的页眉效果大致如下(有页眉线):第1节——天地玄黄–1–第7节章节标题样式设置15第7节章节标题样式设置CTEX宏集对LATEX的标准文档类(article、report、book)和beamer进行了章节标题样式设置功能的扩充.
章节标题样式设置功能(及页面格式设置与汉化功能,见第6.
3节)由ctexheading宏包完成.
加载该宏包时,或者使用CTEX文档类时,或者是使用ctex宏包并设定选项heading=true时,相关功能被激活.
其中,独立使用ctexheading宏包时,本节介绍各选项的默认值与指定scheme=plain时相同.
本节涉及的所有选项均需使用\ctexset命令设置.
章节标题的样式选项是分层设置的.
顶层的选项是章节标题名称(例如section),次一层的选项是章节标题的样式(例如nameformat).
章节标题名称包括part,chapter,section,subsection,subsubsection,paragraph,subparagraph.
可用的样式选项包括:编号相关(7.
1小节):numbering,name,number格式相关(7.
2小节):format,nameformat,numberformat,titleformat,aftername,aftertitle,pagestyle间距、缩进相关(7.
3小节):runin,hang,indent,beforeskip,afterskip,fixskip,break,afterindent目录、附录相关(7.
4小节):tocline,lofskip,lotskip,appendix/numbering,appendix/name,appendix/number注意,对article及其衍生的ctexart等文档类,没有chapter级别的标题;而对于beamer文档类,这些选项控制的是由\partpage,\sectionpage和\subsectionpage产生的标题样式,此时只有part,section和subsection这三层级别,并且runin,afterindent,fixskip,hang,break和tocline这六个选项无效.
多层选项之间用斜线分开,例如,part/name选项设置\part标题的在数字前后的名称,而section/number选项设置\section标题的数字类型.
注意,斜线/的前后不能有空格或者换行.
使用\ctexset设置多级选项时,还可以在同一个上级选项下设置多个下级选项.
例如,同时设置part一级标题的pagestyle选项,chapter一级标题的format与pagestyle选项和section一级标题的name与number选项:例12\ctexset{part/pagestyle=empty,chapter={format=\raggedright,pagestyle=empty,},section={name={第,节},number=\chinese{section},}}第7节章节标题样式设置167.
1编号相关numbering=true|false控制是否对不带星号的章节标题进行编号.
各级标题的默认值均为true.
LATEX标准的章节标题命令(如\section)大体上完成四项工作:输出标题内容、对标题编号(计数器增加1)、将标题列入目录(若调用了hyperref宏包还会添加PDF书签)、更新页眉页脚标记.
带星号的章节标题命令(如\section*)只简单地输出章节标题内容,但不对标题编号,不将标题列入目录或PDF书签,也不写入页眉页脚标记.
与之不同的是,本选项仅仅是否对不带星号的章节标题进行编号.
因此,当设置本选项为false时,除了不对标题编号以外,其余功能与正常标题一致:可以编入目录,并生成正确的hyperref目录超链接位置和页眉页脚标记.
例如:例13\documentclass{ctexbook}\begin{document}\tableofcontents\chapter{A}\chapter*{B}\ctexset{chapter/numbering=false}\chapter{C}\end{document}三章的标题分别为"第一章A"、"B"和"C",但在目录中则只出现"第一章A"和"C".
注意,章节标题是否编号还要受到LATEX计数器secnumdepth的控制(可通过以下介绍的secnumdepth选项设置).
例如,对于section而言,其深度为1.
因此,section会被编号,当且仅当secnumdepth不小于1,并且section/numbering为true,并且使用不带星号的章节标题命令(即\section).
part/numberingchapter/numberingsection/numberingsubsection/numberingsubsubsection/numberingparagraph/numberingsubparagraph/numberingNew:2015-06-21secnumdepth=整数或章节名称设置对章节标题进行编号的层次数.
secnumdepth的值可以是一个整数,也可以是part,chapter等名称.
层次数与名称的对应关系见表5.
章节层次的默认设置见表6.
本选项对beamer/ctexbeamer文档类无效.
secnumdepthNew:2020-05-06表5章节层次层次名称注-1partbook/report类0chapterbook/report类0partarticle类1section2subsection3subsubsection4paragraph5subparagraph表6章节层次的默认设置文档类secnumdepthtocdeptharticle3(subsubsection)3(subsubsection)book/report2(subsection)2(subsection)beamer无效3(subsubsection)如果没有特别说明,以下将用".
.
.
"代表各级章节标题名.
第7节章节标题样式设置17name={前名字,后名字}name={前名字}设置章节的名字.
所谓"章节的名字",可以分为前后两部分,即章节编号前后的词语,两个词之间用一个半角逗号分开;也可以只有一部分,表示只有章节编号之前的名字.
例如:例14\ctexset{chapter/name={第,章},section/name={\S},}会使得\chapter标题使用形如"第一章"的名字,而\section标题则使用形如"§1"的名字.
该选项的默认设置见表7.
.
.
.
/nameUpdated:2014-03-08表7name选项的默认设置标题名scheme=chinesescheme=plain注part{第,部分}{\partname\space}原\partname为Partchapter{第,章}{\chaptername\space}原\chaptername为Chaptersection(beamer){}{\sectionname\space}原\sectionname为\translate{Section}section同右{}subsection(beamer){}{\subsectionname\space}原\subsectionname为\translate{Subsection}subsection同右{}subsubsection同右{}paragraph同右{}subparagraph同右{}number={数字输出命令}设置章节编号的数字输出格式.
数字输出命令通常是对应章节编号计数器的输出命令,如\thesection或\chinese{chapter}之类.
例如:例15\ctexset{section/number=\Roman{section}}将会使\section的编号变为大写罗马数字(如I、II等).
number选项定义的同时将控制对章节计数器的交叉引用.
在引用计数器时,记录在LATEX辅助文件中的是number选项的定义.
但是,number选项不会影响计数器本身的输出.
即设置section/number不会影响\thesection的定义(但该选项会影响\CTEXthesection的定义,见后).
该选项的默认设置见表8.
.
.
.
/number7.
2格式相关CTEX宏集提供了numberformat,nameformat,titleformat,format这几个选项用来控制章节标题的格式.
它们的作用范围如图1所示.
具体用法见下文.
第7节章节标题样式设置18表8number选项的默认设置标题名scheme=chinesescheme=plain原\the标题等价定义part(beamer)\chinese{part}\insertromanpartnumber意义为\Roman{part}part\chinese{part}\thepart\Roman{part}chapter\chinese{chapter}\thechapter\arabic{chapter}section(beamer)同右\insertsectionnumber意义为\arabic{section}section同右\thesection\arabic{section}subsection(beamer)\arabic{section}.
\arabic{subsection}\insertsubsectionnumber意义为\arabic{subsection}subsection同右\thesubsection\thesection.
\arabic{subsection}subsubsection同右\thesubsubsection\thesubsection.
\arabic{subsubsection}paragraph同右\theparagraph\thesubsubsection.
\arabic{paragraph}subparagraph同右\thesubparagraph\theparagraph.
\arabic{subparagraph}nameformat第1numberformat章titleformat熟悉LATEXformat图1numberformat,nameformat,titleformat,format几个选项的作用范围示意format={格式命令}format+={格式命令}format选项用于控制章节标题的全局格式,作用域为章节名字和随后的标题内容.
可以用于控制章节标题的对齐方式、整体字体字号等格式.
带加号的format+选项用于在已有的格式命令后附加内容.
format选项的最后一个格式命令可以带有一个参数.
这一参数用于接受章节名字、编号和标题内容(以及由nameformat,numberformat,aftername,titleformat,aftertitle,indent及hang选项设定的,应用于这些内容之上的格式),以实现特殊效果.
例如,设置章标题为无衬线字体左对齐、为节标题增加无衬线字体设置、为小节标题加框(\fbox命令本身需带一个参数):例16\ctexset{chapter/format=\sffamily\raggedright,section/format+=\sffamily,subsection/format+=\fbox,}format选项的默认设置见表9.
.
.
.
/format.
.
.
/format+Updated:2020-04-22nameformat={格式命令}nameformat+={格式命令}nameformat用于控制章节名字的格式,作用域为章节名字,包括编号.
它一般用于章节名(包括编号)与章节标题的字体、字号等设置不一致的情形.
参见下面的titleformat选项.
nameformat+用于在已有的章节名字格式命令后附加内容.
nameformat选项的最后一个格式命令可以带有一个参数.
这一参数用于接受章节名字和编号,以实现特殊效果(见例22).
nameformat选项的默认设置见表10.
.
.
.
/nameformat.
.
.
/nameformat+Updated:2015-06-30第7节章节标题样式设置19表9format选项的默认设置标题名scheme=chinesescheme=plainpart(article)\Large\bfseries\centering\raggedright*part(beamer)同右\centeringpart\huge\bfseries\centering\centeringchapter\huge\bfseries\centering\raggedrightsection(beamer)同右\centeringsection\Large\bfseries\centering\Large\bfseriessubsection(beamer)同右\centeringsubsection同右\large\bfseriessubsubsection同右\normalsize\bfseriesparagraph同右\normalsize\bfseriessubparagraph同右\normalsize\bfseries*为了与LATEX2的默认效果保持一致,在scheme=plain时,part和chapter的nameformat和titleformat并不一样,因此没有使用format选项统一设置名字和标题的格式.
表10nameformat选项的默认设置标题名scheme=chinesescheme=plainpart(article){}\Large\bfseriespart(beamer)同右\usebeamerfont{partname}\usebeamercolor[fg]{partname}part{}\huge\bfserieschapter{}\huge\bfseriessection(beamer)同右\usebeamerfont{sectionname}\usebeamercolor[fg]{sectionname}section同右{}subsection(beamer)同右\usebeamerfont{subsectionname}\usebeamercolor[fg]{subsectionname}subsection同右{}subsubsection同右{}paragraph同右{}subparagraph同右{}第7节章节标题样式设置20numberformat={格式命令}numberformat+={格式命令}numberformat选项用于控制章节编号的格式,作用域仅为编号数字本身.
对各级标题默认均为空,当需要编号的格式和前后的章节名字不一样时可以使用.
numberformat+用于在已有的编号格式命令后附加内容.
numberformat选项的最后一个格式命令可以带有一个参数.
这一参数用于接受编号数字.
例如,我们可以使用numberformat特别强调章标题中的数字:例17\ctexset{chapter/number=\arabic{chapter},chapter/numberformat=\color{blue}\zihao{0}\emph,}上面的代码在scheme=chinese时可以做出类似这样的章标题效果:第4章numberformat选项默认均设置为空,故章节编号默认与章节名字使用相同的格式.
.
.
.
/numberformat.
.
.
/numberformat+Updated:2015-06-19titleformat={格式命令}titleformat+={格式命令}titleformat选项用于控制标题内容的格式,作用域为章节标题内容.
titleformat+选项用于在已有的标题格式命令后附加内容.
titleformat选项的最后一个格式命令可以带有一个参数.
这一参数用于接受标题内容.
例如,实现多行标题的居中悬挂对齐:例18\usepackage{varwidth}%%提供varwidth环境\ctexset{chapter/name={第,回},chapter/titleformat=\chaptertitleformat}\newcommand\chaptertitleformat[1]{%%以标题内容为参数\begin{varwidth}[t]{.
7\linewidth}#1\end{varwidth}}.
.
.
.
.
.
\chapter{情中情因情感妹妹\\错里错以错劝哥哥}上面的代码可以做出类似这样的章标题效果:第三十四回情中情因情感妹妹错里错以错劝哥哥titleformat选项的默认设置见表11.
.
.
.
/titleformat.
.
.
/titleformat+Updated:2015-06-30aftername={代码}aftername+={代码}aftername选项的参数代码将被插入到章节编号与其后的标题内容之间,用于控制格式变换.
常用于控制章节编号与标题内容之间的距离,或者控制标题是否另起一行.
aftername+用于在已有的代码后附加内容.
该选项的默认设置见表12.
.
.
.
/aftername.
.
.
/aftername+Updated:2014-03-08第7节章节标题样式设置21表11titleformat选项的默认设置标题名scheme=chinesescheme=plainpart(article){}\huge\bfseriespart(beamer)同右\usebeamerfont{parttitle}part{}\Huge\bfserieschapter{}\Huge\bfseriessection(beamer)同右\usebeamerfont{sectiontitle}section同右{}subsection(beamer)同右\usebeamerfont{subsectiontitle}subsection同右{}subsubsection同右{}paragraph同右{}subparagraph同右{}aftertitle={代码}aftertitle+={代码}aftertitle选项的参数代码将被插入到章节标题内容之后.
aftertitle+用于在已有的代码后附加内容.
该选项的默认设置见表13.
需注意,sub3section或sub4section宏包选项(见5.
2节)会影响aftertitle选项的默认值.
.
.
.
/aftertitle.
.
.
/aftertitle+New:2015-06-19表12aftername选项的默认设置标题名scheme=chinesescheme=plainpart(article)\quad\par\nobreakpart(beamer)同右\vskip1em\parpart同右\par\vskip20ptchapter\quad\par\nobreak\vskip20ptsection(beamer)同右\vskip1em\parsection同右\quadsubsection(beamer)同右\vskip1em\parsubsection同右\quadsubsubsection同右\quadparagraph同右\quadsubparagraph同右\quad表13aftertitle选项的默认设置标题名默认值part\parchapter\parsection\@@parsubsection\@@parsubsubsection\@@parparagraph{}(sub3section)\@@par(sub4section)同上subparagraph{}(sub4section)\@@parpagestyle={页面格式}设置book/ctexbook或report/ctexrep文档类中,\part与\chapter标题所在页的页面格式(pagestyle).
该选项的默认设置见表14.
part/pagestylechapter/pagestyleNew:2014-03-21表14pagestyle选项的默认设置标题名默认值part(article)无效partplainchapterplain第7节章节标题样式设置227.
3间距、缩进相关runin=true|falserunin选项只对\section级以下标题有意义,用于确定标题与随后的正文是否排在同一段之上.
该选项的默认设置见表15.
默认情况下,\paragraph、\subparagraph两级标题是与后面正文排在同一段的,runin选项为true;但使用sub3section或sub4section宏包选项(见5.
2节)后,将对这两级标题设runin选项为false,这两级标题会改为排在不同段.
section/runinsubsection/runinsubsubsection/runinparagraph/runinsubparagraph/runinNew:2015-06-27表15runin选项的默认设置标题名默认值part无效chapter无效sectionfalsesubsectionfalsesubsubsectionfalseparagraphtrue(sub3section)false(sub4section)同上subparagraphtrue(sub4section)falsehang=true|falsehang选项用于设置是否对章节标题实施悬挂缩进(缩进的宽度为名字宽度和indent选项设置的宽度之和).
注意,当hang=true时,不恰当地设置选项aftername的值,可能会引发错误.
这是因为当hang=true时,LATEX内部会构造一个\hbox而进入受限水平模式(restrictedhorizontalmode).
若在aftername中加入包含\vskip等会导致从受限水平模式切出的垂直命令(verticalcommand)时,就会报错.
特别地,aftername的默认值也可能导致这种情形(见表12).
因此,当设置hang=true时,用户必须恰当地设置选项aftername的值.
本选项对beamer/ctexbeamer文档类无效.
对于\section级以下标题,若设置了runin选项为true,即标题与随后正文排在同一段,hang选项没有意义.
该选项的默认设置见表16.
.
.
.
/hangUpdated:2020-04-23表16hang选项的默认设置标题名默认值partfalsechapterfalsesectiontruesubsectiontruesubsubsectiontrueparagraph无意义(sub3section)true(sub4section)truesubparagraph无意义(sub4section)true表17indent选项的默认设置标题名默认值part0ptchapter0ptsection0ptsubsection0ptsubsubsection0ptparagraph0ptsubparagraph\parindent(sub3section)0pt(sub4section)同上第7节章节标题样式设置23indent={缩进间距}indent选项用于设置章节标题本身的首行缩进.
该选项的默认设置见表17.
如果indent的值是以em、ex或\ccwd为单位,那么缩进间距的大小是相对于format中指定的字号大小.
例如,设置\part标题缩进三个字、\section标题缩进20pt:例19\ctexset{part={format+=\raggedright,indent=3\ccwd,},section={format=\Large\bfseries,indent=20pt,}}\part{首行缩进的标题}\noindent无缩进的正文.
\section{首行缩进的标题}\noindent无缩进的正文.
.
.
.
/indentUpdated:2020-04-23beforeskip={弹性间距}beforeskip选项用于设置章节标题前的垂直间距.
该选项的默认设置见表18.
.
.
.
/beforeskipUpdated:2016-05-10afterskip={弹性间距}afterskip选项控制章节标题与后面下方之间的距离.
对于\section级以下标题,runin选项会影响afterskip选项的意义:若runin为true,标题与随后正文排在同一段,弹性间距给出水平间距.
否则,正文另起一段,弹性间距给出的是垂直间距.
该选项的默认设置见表19.
注意sub3section或sub4section宏包选项(见5.
2节)会影响aftertitle选项的默认值.
.
.
.
/afterskipUpdated:2015-06-27表18beforeskip选项的默认设置标题名默认值part(article)4expart(beamer)0ptpart0ptplus1filchapter50ptsection(beamer)0ptsection3.
5explus1exminus.
2exsubsection(beamer)0ptsubsection3.
25explus1exminus.
2exsubsubsection3.
25explus1exminus.
2exparagraph3.
25explus1exminus.
2exsubparagraph3.
25explus1exminus.
2ex表19afterskip选项的默认设置标题名默认值part(article)3expart(beamer)0ptpart0ptplus1filchapter40ptsection(beamer)0ptsection2.
3explus.
2exsubsection(beamer)0ptsubsection1.
5explus.
2exsubsubsection1.
5explus.
2exparagraph1em(sub3section)1explus.
2ex(sub4section)同上subparagraph1em(sub4section)1explus.
2ex第7节章节标题样式设置24fixskip=true|false默认情况下,article、book和report类的标题与正文的距离除了由beforeskip和afterskip选项设置的垂直间距外,还会有一些多余的间距.
fixskip选项用于抑制这些多余间距.
该选项默认不开启.
.
.
.
/fixskipNew:2016-06-03break={格式命令}break+={格式命令}break选项用于控制章节标题与之前正文的分隔关系.
一般用于设置是否在标题之前分页或者设置行间罚点.
break+用于在已有的格式命令后附加内容.
例如,若当前页剩余高度小于正文高度的一半时,则另起一页输出\section标题:例20\usepackage{needspace}\ctexset{section/break=\Needspace{.
5\textheight}}该选项的默认设置见表20.
.
.
.
/break.
.
.
/break+New:2016-09-19表20break选项的默认设置标题名默认值part(article){}part\if@openright\cleardoublepage\else\clearpage\fichapter同上section\addpenalty{\@secpenalty}subsection同上subsubsection同上paragraph同上subparagraph同上afterindent=true|falseafterindent选项用于设置章节标题后首段的缩进.
book和report类的\part标题被单独排在一页之上,afterindent选项没有意义.
对于\section级以下标题,若设置了runin选项为true,即标题与随后正文排在同一段,afterindent选项也就没有了意义.
该选项的默认设置见表21.
.
.
.
/afterindentNew:2015-06-27表21afterindent选项的默认设置标题名scheme=chinesescheme=plainpart(article)truefalsepart无效无效chaptertruefalsesectiontruefalsesubsectiontruefalsesubsubsectiontruefalseparagraphtruefalsesubparagraphtruefalse第7节章节标题样式设置257.
4目录、附录相关tocdepth=整数或章节名称设置对章节标题编入目录的层次数.
tocdepth的值可以是一个整数,也可以是part,chapter等名称.
层次数与名称的对应关系见表5.
章节层次的默认设置见表6.
tocdepthNew:2020-05-06tocline={格式定义}tocline选项用于定义章节标题在目录文件(.
toc)中的格式.
格式定义有两个参数:参数#1是part、chapter等名字,参数#2是标题内容.
该选项的默认设置见表22.
.
.
.
/toclineNew:2016-10-25表22tocline选项的默认设置标题名默认值part\CTEXifname{\CTEXthepart\hspace{1em}}{}#2chapter(chinese)\CTEXifname{\protect\numberline{\CTEXthechapter\hspace{.
3em}}}{}#2chapter(plain)\CTEXnumberline{#1}#2section\CTEXnumberline{#1}#2subsection同上subsubsection同上paragraph同上subparagraph同上这里\CTEXnumberline的意义是,若标题#1没有名字,则不输出\numberline{\CTEXthe#1}等编号:\CTEXifname{\protect\numberline{\csnameCTEXthe#1\endcsname}}{}其中,\CTEXifname的定义见7.
5小节.
lofskip={弹性间距}lotskip={弹性间距}lofskip选项控制插图目录(.
lof)中,章之间的插图标题的距离.
同样,lotskip选项控制表格目录(.
lot)中,章之间的表格标题的距离.
目前,这两个选项只在chapter标题下有定义.
它们的默认值,在scheme选项的不同取值下都为10pt.
chapter/lofskipchapter/lotskipNew:2016-10-01numbering=true|false控制是否对附录章(对应book与report)或附录节(对应article)进行编号,用法与普通章节对应的numbering选项相同.
该选项默认值为true.
appendix/numberingNew:2015-06-21name={前名字,后名字}name={前名字}设置附录章(对应book与report)或附录节(对应article)的名字,用法与普通章节对应的name选项相同.
注意该选项与appendixname选项(6.
2节)在意义上有些重叠,但不完全相同.
appendixname选项只用来重定义\appendixname,而不管\appendixname如何使用;该选项则决定在章节标题中输出的名字,可以调用\appendixname设置.
该选项的默认设置见表23.
appendix/nameUpdated:2014-03-08第7节章节标题样式设置26表23appendix/name选项的默认设置文档类影响命令scheme=chinese实际定义scheme=plain实际定义article\section{}{}book,report\chapter\appendixname\space附录\appendixname\spaceAppendixnumber={数字输出命令}设置附录章(对book与report)或附录节(对article)编号的数字输出格式,用法与普通章节对应的number选项相同.
appendix/number选项同时也会控制附录章节计数器的交叉引用.
与普通章节的number选项类似,同样需要注意,该选项不会影响计数器本身的输出,即不影响\thesection或\thechapter的定义.
该选项的默认设置见表24.
appendix/number表24appendix/number选项的默认设置文档类影响命令默认值article\section\Alph{section}book,report\chapter\Alph{chapter}7.
5辅助命令CTEX宏集还提供了一些辅助命令(宏),用于存储章节标题格式,或进行一些条件判断.
以\CTEXthe开头的这组宏给出结合了name与number选项的章节编号输出格式.
例如在scheme=chinese时,默认章编号输出格式就是\CTEXthechapter,形如"第一章".
这组宏在CTEX文档类中将代替\thechapter等宏的作用,在章节中引用本章节的完整编号.
例如用于帮助定义自定义的目录格式、页眉格式等.
\CTEXthepart\CTEXthechapter\CTEXthesection\CTEXthesubsection\CTEXthesubsubsection\CTEXtheparagraph\CTEXthesubparagraph\CTEXifname{有名字时的内容}{无名字时的内容}\CTEXifname会根据当前章节有无名字展开得到不同内容(通常是格式命令).
由于章节名字总是与编号一起出现,章节有无名字通常也表达为"章节是否编号".
在LATEX中,后者取决于以下几个方面:章节深度是否不大于计数器secnumdepth的值,章节标题是否使用不带星号的命令.
在CTEX宏集中,后者还取决于.
.
.
/numbering是否为true.
\CTEXifname可用于format,titleformat,aftertitle,afterskip,indent这五个选项和\chapter标题beforeskip选项的格式设置之中.
也可用于帮助定义自定义的目录格式、页眉格式等.
例如,设置章的标题有名字时左对齐,无名字时居中对齐,并且在标题后画一条横线.
例21\ctexset{chapter/format=\CTEXifname{\raggedright}{\centering},chapter/aftertitle=\par\CTEXifname{}{\hrule},}\CTEXifnameNew:2016-09-18第8节实用命令277.
6示例我们最后举一个稍微复杂的例子,来看看上述选项的综合应用.
例22\ctexset{chapter={beforeskip=0pt,fixskip=true,format=\Huge\bfseries,nameformat=\rule{\linewidth}{1bp}\par\bigskip\hfill\chapternamebox,number=\arabic{chapter},aftername=\par\medskip,aftertitle=\par\bigskip\nointerlineskip\rule{\linewidth}{2bp}\par}}\newcommand\chapternamebox[1]{%\parbox{\ccwd}{\linespread{1}\selectfont\centering#1}}.
.
.
.
.
.
\chapter{熟悉\LaTeX}本例的设置效果大致如下:第1章熟悉LATEX第8节实用命令8.
1字号与间距\zihao{字号}用于调整字号大小.
其中字号的有效值共有16个,如表25所示.
使用\zihao命令调整字体大小时,西文字号大小会始终和中文字号保持一致.
\zihaoUpdated:2014-03-08\ziju{中文字符宽度的倍数}用于调整相邻汉字之间的间距,即(在正常中文行文中)前一个汉字的右边缘与后一个汉字的左边缘之间的距离.
其中参数可以是任意浮点数值;而中文字符宽度指的是实际汉字的宽度,不包含当前字距.
这个命令会影响\ccwd的值,但不会影响英文字距.
\zijuUpdated:2014-03-28当前汉字的字宽保存在长度寄存器\ccwd之中.
汉字字宽是相邻两个汉字中心之间的距离,包含字距在内.
因此修改字距会间接修改字宽.
\ccwdUpdated:2014-03-278.
2中文数字转换CTEX宏集的中文数字转换功能实际上是调用zhnumber宏包来完成.
下面只介绍一些基本的用法,更高级的用法可以查阅zhnumber宏包的文档.
第8节实用命令28表25中文字号字号大小(bp)大小(pt)意义04242.
15749初号03636.
135小初号12626.
09749一号12424.
09小一号22222.
08249二号21818.
06749小二号31616.
06三号31515.
05624小三号41414.
05249四号41212.
045小四号510.
510.
53937五号599.
03374小五号67.
57.
52812六号66.
56.
52437小六号75.
55.
52061七号855.
01874八号\chinese{counter}\pagenumbering{chinese}\chinese命令与\roman等命令的用法类似,作用在一个LATEX计数器上,将计数器的值以中文数字的形式输出.
\chineseUpdated:2016-05-01\zhnumber{number}以中文格式输出数字.
这里的数字可以是整数、小数和分数.
\zhnumberNew:2014-03-08\zhdigits{number}将阿拉伯数字转换为中文数字串.
\zhdigitsNew:2014-03-08\CTEXnumber\macro{number}\macro必须是一个TEX宏,不需预先定义.
\CTEXnumber通过\zhnumber将number转为中文数字,最后将结果存储在\macro里.
对\macro的定义是局部的,将它展开一次就可以得到转换结果.
\CTEXnumber一般来说,并不需要使用\CTEXnumber,直接使用\zhnumber即可.
但是,如果在文档中需要多次使用同一个数字number的中文形式,就可以先用\CTEXnumber将结果保存起来备用,而不是每次使用时都用\zhnumber现场转换一次.
\CTEXdigits\macro{number}\CTEXdigits与\CTEXnumber类似,但其转换的结果是中文数字串,而不是中文数字.
\CTEXdigits第9节LuaLATEX下的中文支持方式298.
3杂项用于显示CTEX标志.
\CTeX第9节LuaLATEX下的中文支持方式在LuaLATEX下,CTEX宏集依赖LuaTeX-ja宏包来完成中文支持.
该宏包是日本TEX社区的北川弘典、前田一贵、八登崇之等人开发的,设计目的主要是在LuaTEX引擎下实现日本pTEX引擎的(大部分)功能.
它为了兼容pLATEX的使用习惯,对LATEX2的NFSS作了不少修改和扩充.
这对于简体中文用户来说不是必要的,因而CTEX禁用了它在LATEX格式下的大部分设置,只保留了必要的部分.
同时修改了它的字体设置方式,使得相关命令与xeCJK宏包大致相同.
20150420版以后的LuaTeX-ja宏包开始支持竖排,但CTEX暂不支持竖排.
9.
1LuaLATEX下替代字体的设置\setCJKfamilyfont{family}{basefontname}[basefontfeatures,AlternateFont={{characterrange1}{alternatefontname1},{characterrange2}{alternatefontname2}{alternatefontfeatures2},.
.
.
.
.
.
}]在设置字体族family的时候,同时设置该字体族在字符范围characterrange内,对应字形的替代字体.
AlternateFontUpdated:2020-04-30\setCJKfamilyfont{family}{alternatefontname}[CharRange={characterrange},alternatefontfeatures]只设置字体族family在字符范围characterrange内,对应字形的替代字体.
CharRangeNew:2014-04-14一个\setCJKfamilyfont里只能使用一次CharRange或者AlternateFont,但可以将它们分开重叠使用.
例如下面的方式是有效的.
例23\setCJKmainfont[AlternateFont=\setCJKmainfont[CharRange={"4E00->"67FF,-2}\setCJKmainfont[CharRange={"6800->"9FFF}第10节CTEX宏集的配置文件30\ctexset{declarecharrange={{name1}{characterrange1},{name2}{characterrange2},.
.
.
}}预先声明字符范围.
声明字符范围name之后,它的名字name可以用在AlternateFont和CharRange选项的characterrange之中,表示对应的字符范围.
declarecharrangeNew:2020-04-30在声明字符范围name的同时,还为\setCJKmainfont等字体设置命令定义了选项name,用于设置对应字符的替代字体:name={alternatefontname}name={alternatefontname}{alternatefontfeatures}name选项可以与AlternateFont共同使用,但不能与CharRange一起使用.
如果没有给name设置值,则等价于设置CharRange=name,即只设置name对应的字符范围的替代字体.
\ctexset{clearalternatefont={family1,family2,resetalternatefont={family1,family2,clearalternatefont,resetalternatefont}清除与重置CJK字体族family的替换字体设置.
如果没有给定值,则作用于当前CJK字体族.
清除与重置操作总是全局的.
clearalternatefontresetalternatefontNew:2014-04-15第10节CTEX宏集的配置文件CTEX宏集提供了不同的配置文件,可以通过修改配置文件来改变CTEX宏集的默认行为.
在多数情况下,并不需要修改配置文件,CTEX宏集的默认设置已经能满足大多数用户的需要.
不恰当地修改CTEX宏集的默认行为也可能导致同一文件在别处无法正常编译或排版效果完全不同,因此修改应该慎重.
但在一些情况下,直接修改配置文件仍是必要的,例如:系统没有安装默认设置的字体文件,无法编译.
需要经常编译来自其他系统的中文TEX文件,但对方的操作系统或默认设置与本机不同.
与CTEX宏集的源代码一样,配置文件采用LATEX3的语法编写.
CTEX宏集的配置文件随宏包其他文件一起安装在TEX系统TDS目录树中,文件后缀是.
cfg.
为了避免本地配置文件内容因CTEX宏集的更新而丢失,不要直接修改系统TDS目录树中的配置文件,而应该将系统自带的配置文件复制到本地的或用户私有的TDS目录树中修改,并运行texhash命令刷新文件名数据库.
例如对于TEXLive,系统自带的配置文件就在TEXLive安装目录下的texmf-dist/tex/latex/ctex/config/子目录下,可以修改它的副本,保存在本地TDS树的texmf-local/tex/latex/ctex/目录下,或者用户TDS树的~/texmf/tex/latex/ctex/目录下,作为本地/用户专有的配置文件.
复制配置文件后需要运行texhash命令使本地配置文件生效.
第10节CTEX宏集的配置文件31MiKTEX的配置文件也保存在类似的目录结构中,MiKTEX管理的几个TDS根目录可以在MiKTEXOptions设置项中查看到,这里不再赘述.
除了修改本地TEX系统中的配置文件,对于特定文档,也可以将修改过的配置文件保存在文档的工作目录下.
此时配置文件就只对工作目录下的所有文档生效.
10.
1修改宏包默认选项配置文件ctexopts.
cfg可以用来修改宏包的默认选项.
随系统安装的配置文件除了文件信息声明外没有实际的内容,但在注释中给出了一个简单的示例,只要取消注释就可以生效.
例24%系统自带ctexopts.
cfg注释中的示例语句,固定默认字体集为windows.
%该设置可以用在安装了Windows字体的非Windows系统中.
\ctex_set:nn{option}{fontset=windows}如上例所示,宏包选项通常使用LATEX3的\ctex_set:nn命令完成键值设置,第一个参数是固定的子模块option,第二个参数中是用户定义的新的默认宏包选项.
ctexopts.
cfg中的设置将在CTEX宏集的开始处,定义过宏包选项之后,\ProcessKeysOptions命令之前生效.
最好只使用此配置文件修改宏包默认选项.
10.
2宏包载入后的配置配置文件ctex.
cfg将在宏包的末尾被载入生效.
可以用它完成任意的设置,或是覆盖已有的定义.
随系统安装的配置文件除版本信息外没有实际内容,注意配置文件中也使用LATEX3语法.
例25%简单的ctex.
cfg内容示例.
%修改默认的页面格式设置.
\pagestyle{plain}例26%略复杂的ctex.
cfg内容示例:禁止段末孤字成行.
%在使用XeTeX编译时,打开xeCJK的CheckSingle选项.
\sys_if_engine_xetex:T{\xeCJKsetup{CheckSingle}}%在使用LuaTeX编译时,设置LuaTeX-ja的jcharwidowpenalty参数.
\sys_if_engine_luatex:T{\ltjsetparameter{jcharwidowpenalty=10000}}10.
3配置标题中文翻译由于CTEX宏集需要同时支持GBK和UTF-8两种编码,因此对标题的中文翻译写在两个配置文件当中:ctex-name-gbk.
cfg和ctex-name-utf8.
cfg.
两个文件的设置相同,只是编码不同.
为了同一文档在不同电脑上编译效果的一致性,通常不建议修改默认的中文翻译.
第11节对旧版本的兼容性3210.
4自定义字体集4.
3节介绍的用于fontset选项的自定义字库文件,类似于CTEX宏集的配置文件,也应该与其他本地配置文件一起保存在本地TDS目录树下,并可以配合ctexopts.
cfg等配置文件使用.
第11节对旧版本的兼容性11.
1CTEX0.
8a及以前的版本在ctex-kit项目成立之前,CTEX宏包的最后一个版本是CTEX0.
8a(2007/05/06).
第2版未考虑对这些很早版本的兼容性.
11.
2CTEX0.
9–CTEX1.
0d在2009年在ctex-kit项目成立后,新增了XTEX引擎的支持,并增加了不少控制字体的命令和选项.
这里主要介绍新版本CTEX宏包相对1.
02d版本(2014/06/09)的兼容性.
第2版的CTEX宏包已尽力保证对1.
0x版本的兼容性,原有为1.
0x编写的代码,在第2版的CTEX宏包下保证仍能编译,并且在大多数情况下保持编译效果不变.
CTEX宏包在0.
8a以前的版本支持以CCT作为底层中文支持方式,从0.
9版之后即不再推荐使用,只保留向后兼容.
在CTEX宏包第2版中则完全不再支持CCT.
下面这些是在旧版本CTEX宏包中存在,而在新版本中已不建议使用的选项和命令,在未来版本中可能会删去它们的支持.
在多数情况下它们的功能仍将保留,但也有部分选项命令功能已失效.
分别相当于zihao=-4和zihao=5,过时选项.
cs4sizec5size相关选项已删除.
CCTCCTfontindent和noindent什么也不做,过时选项.
在中文版式下,ctex宏包的相关功能在与标准文档类及其衍生文档类联用时默认打开.
CTEX文档类的相关功能由章节标题的afterindent选项的值来确定.
indentnoindentzhmap宏包选项增加了参数,扩充了功能,除了支持真假值参数外,还支持选择zhmCJK作为底层中文处理宏包.
(4.
3节)nozhmap选项相当于zhmap=false.
过时选项.
zhmapnozhmap宏包选项winfonts相当于fontset=windows,adobefonts相当于fontset=adobe,nofonts相当于fontset=none.
这几个选项是过时选项,对于新文档,应使用fontset选项设置不同字体集.
另外,第2版CTEX宏包的默认字体不再是Windows系统字体,而是根据检测到的操作系统选择使用Windows、Mac的系统字体还是Fandol字体(4.
3节).
winfontsadobefontsnofonts第11节对旧版本的兼容性33旧版本中宏包punct选项没有参数,现在可以用参数设定标点风格(5.
3节).
原有无参形式的punct选项相当于punct=quanjiao.
旧版宏包中nopunct选项的效果大致相当于punct=plain.
过时选项,不推荐使用.
punctnopunct原有的cap和nocap选项由新的scheme选项代替.
(5.
3节)cap选项相当于scheme=chinese,nocap选项相当于scheme=plain.
它们均已过时,仅因兼容性而保留.
capnocap新版本宏包space选项增加真假值参数.
(5.
3节)nospace选项相当于space=false,成为过时选项.
spacenospace新版本宏包中总是自动处理对fancyhdr宏包的兼容性,而由用户自己使用\usepackage载入fancyhdr宏包.
fancyhdr选项过时,因兼容性保留,功能是载入fancyhdr宏包.
fancyhdr新版本宏包中总是自动处理对hyperref宏包的兼容性,而由用户自己使用\usepackage载入hyperref宏包.
hyperref选项过时,因兼容性保留,功能是在导言区末尾载入hyperref宏包.
hyperref旧版本的fntef选项用于统一CCTfntef与CJKfntef的界面,新版本CTEX宏集不再支持CCT,也不再自动载入CJKfntef或xeCJKfntef宏包,而仅在其末尾做适当格式调整.
fntef选项过时,因兼容性保留,功能是根据引擎载入CJKfntef(pdfTEX)或xeCJKfntef(XTEX)宏包.
fntef在调用fntef宏包选项的同时,旧版本CTEX宏包由于需要支持CCT系统,会将以\CJK开头的\CJKunderline等宏换名为以\CTEX开头的\CTEXunderline等宏.
此功能在新版本的CTEX宏集中已失去意义.
此外,在pdfTEX引擎下,用于设置格式的\CJKunderdotbasesep等宏也被更名为\CTEXunderdotbasesep等宏.
在新版本中,上述由fntef衍生的相关命令和环境均被移除.
\CTEXunderdot\CTEXunderline\CTEXunderdblline\CTEXunderwave\CTEXsout\CTEXxoutCTEXfilltwosides更新当前的中文字体信息,包括当前字距(\ccwd)和段首缩进(\parindent).
一般来说,用户无需使用这个命令.
\CTEXsetfont更新\ccwd宽度后设置\parindent=2\ccwd.
过时命令.
\CTEXindent设置\parindent=0pt.
过时命令.
\CTEXnoindent\CTEXsetup[选项]{标题}相当于设置了\ctexset{标题={选项}}.
过时命令.
\CTEXsetup\CTEXoptions[选项]相当于设置了\ctexset{选项}.
过时命令.
\CTEXoptions\Chinese{counter}新版宏集中\chinese统一了旧版本中\chinese和\Chinese的功能.
因此,该命令已过时.
\Chinese第11节对旧版本的兼容性34原为\CTEXoptions命令的选项,用于控制\caption编号后面的标点.
此选项已过时,并在新版本的CTEX宏包中失效.
可以使用caption宏包的labelsep选项来完成同样的功能.
例27%代替\CTEXoptions[captiondelimiter={:}]\usepackage{caption}\captionsetup{labelsep=colon}captiondelimiter11.
3CTEX1.
02c以后的SVN开发版CTEX宏包在1.
02c版本(2011/03/11)之后在Googlecode上的SVN开发版本,内部版本号一直升到1.
11版,但从未正式发布.
SVN开发版在1.
02c版本的基础上新增的功能在第2版中大多继承了过来,但新增的命令与选项都不再保持兼容.
CTEX宏包第2版不保证对未发布的SVN开发版兼容.
11.
4CTEX2.
2之前的版本在CTEX2.
2之前的版本中,beforeskip选项的符号还用于确定章节标题后首段的缩进.
当beforeskip是负值时,章节标题后的第一段按英文文档的排版习惯,没有首行缩进,否则保留首行缩进.
这一特性在2.
2版和后续版本中不再保留,相应的功能通过新的afterindent选项来设置.
如果原先设置beforeskip为负值,在新版本中需要改为正值,并设置相应的afterindent选项为false.
part/beforeskipchapter/beforeskipsection/beforeskipsubsection/beforeskipsubsubsection/beforeskipparagraph/beforeskipsubparagraph/beforeskip在CTEX2.
2之前的版本中,对于\section级以下标题,afterskip选项的符号用于确定标题与随后正文是否排在同一段.
如果是正值,则正文另起一段,否则标题与随后正文排在同一段,afterskip的绝对值给出水平间距.
这一特性在2.
2版和后续版本中不再保留,相应的功能通过新的runin选项来设置.
如果原先设置afterskip为负值,在新版本中需要改为正值,并设置相应的runin选项为true.
section/afterskipsubsection/afterskipsubsubsection/afterskipparagraph/afterskipsubparagraph/afterskip11.
5CTEX2.
4.
1和2.
4.
2这两个选项已经被删除,相应功能由新的选项fixskip提供.
part/fixbeforeskipchapter/fixbeforeskip11.
6CTEX2.
5之前的版本CTEX2.
5有一些比较大的变动.
(pdf)LATEX格式下,文档编码初始值统一设置成UTF-8.
因此,仍旧使用GBK编码的文档,需要在文档类或宏包选项中显式指定GBK.
UTF8GBK第12节宏集依赖情况与手工安装方法35不再默认载入CJKfntef或xeCJKfntef宏包,同步移除有关命令和环境.
若需使用相关宏包,建议用户使用\usepackage命令主动载入.
\CTEXunderdot\CTEXunderline\CTEXunderdblline\CTEXunderwave\CTEXsout\CTEXxoutCTEXfilltwosides作为兼容性保留,会视编译引擎载入相应宏包.
fntef不再支持WindowsXP系统,默认要求Windows系统有微软雅黑字体.
建议WindowsXP系统的用户及时更新操作系统.
若一定要在WindowsXP中使用,请使用2.
5以前的版本.
windows过时字库选项,作为兼容性保留,功能是载入windows字库.
windowsoldwindowsnew改用思源(NotoCJK)和文鼎字库.
该字库不再支持pdfLATEX编译.
ubuntu不再支持将替代字体的可选项放在字体名之前的方括号中,新的语法是将可选项放在字体名之后的花括号之内.
AlternateFont除了以上列出的选项以外,当用户使用CTEX系列文档类,且使用LATEX或upLATEX编译时,若用户没有在文档类选项中显式指定dvips/dvipdfmx/dvisvgm等驱动选项,则文档类指定默认驱动为DVIPDFM.
第12节宏集依赖情况与手工安装方法本节介绍CTEX宏集的依赖情况,并介绍手工编译安装的具体方法.
通常用户只需参照第2.
2节介绍的方法,使用发行版自带的包管理器安装本宏集.
CTEX宏集有两个源文件:ctex.
dtx、ctexpunct.
spa.
使用不同的编译方式时,CTEX依赖的宏包略有不同.
在手工安装CTEX宏集之前,请确保你的TEX发行版中已经正确安装了这些宏包.
CTEX依赖宏包的详情叙述如下:expl3、xparse和l3keys2e宏包.
它们属于l3kernel和l3packages宏集.
indentfirst宏包,属于tools宏集.
everysel宏包,属于ms宏集.
zhnumber宏包.
以上是各种编译方式都必需的依赖项.
CJK宏集.
CJKpunct宏包.
xCJK2uni宏包.
zhmetrics宏包.
zhmCJK宏包,它还依赖–iftex宏包.
–ltxcmds宏包.
–kvoptions宏包.
–kvsetkeys宏包.
–keyval宏包,graphics宏集.
以上是使用pdfLATEX或LATEX+DVIPDFM的编译方式所需要的依赖项,其中zhm-CJK是可选的.
第13节开发人员36xeCJK宏集,它还依赖–xtemplate宏包,它属于l3packages宏集.
–fontspec宏包.
以上是使用XLATEX编译时的依赖项.
luatexja宏包,它还依赖–adobemapping宏包.
–luaotfload宏包,它还依赖lualibs宏包.
–luatexbase宏包,它还依赖ctablestack宏包.
–atbegshi宏包.
–etoolbox宏包.
–iftex宏包.
–infwarerr宏包.
–ltxcmds宏包.
–pdftexcmds宏包.
–xkeyval宏包.
fontspec宏包.
以上是使用LuaLATEX编译时的依赖项.
pxeverysel宏包,属于platex-tools宏集.
zhmetrics-uptex宏包.
以上是使用upLATEX编译时的依赖项.
出于一些原因,zhmCJK尚未被收入TEXLive和MiKTEX.
因此,若你希望使用zhmCJK作为CTEX宏集的底层中文支持方式,那么你需要自行安装该宏包.
zhmCJK的安装较为复杂.
我们建议你1.
从CTAN下载zhmCJK宏包的TDS安装包,2.
按目录结构将文件复制到TEX发行版的本地TDS根目录,3.
最后执行texhash刷新TEX发行版的ls-R数据库以完成安装.
其他细节,可参照其宏包手册中第3节的指导.
CTEX宏集已被TEXLive和MiKTEX收录,若无特别理由,我们强烈建议用户使用包管理器安装本宏集.
若要手工安装,请遵循如下步骤:1.
从CTAN下载CTEX宏集的TDS安装包,2.
按目录结构将文件复制到TEX发行版的本地TDS根目录,3.
最后执行texhash刷新TEX发行版的ls-R数据库以完成安装.
第13节开发人员吴凌云(aloft@ctex.
org)江疆(gzjjgod@gmail.
com)王越(yuleopen@gmail.
com)刘海洋(LeoLiu.
PKU@gmail.
com)李延瑞(LiYanrui.
m2@gmail.
com)陈之初(zhichu.
chen@gmail.
com)李清(sobenlee@gmail.
com)黄晨成(liamhuang0205@gmail.
com)曾祥东(xdzeng96@gmail.
com)参考文献37李泽平(zepinglee@gmail.
com)周宇恺(muzimuzhi@gmail.
com)张瑞熹(ruixizhang42@gmail.
com)参考文献[1]DONALDERVINKNUTH.
TheTEXbook,Computers&Typesetting,volumeA.
Addison-Wesley,1986[2]FRANKMITTELBACHandMICHELGOOSSENS.
TheLATEXCompanion.
ToolsandTechniquesforComputerTypesetting.
Boston:Addison-Wesley,secondedition,2004第14节代码实现38第14节代码实现1@@=ctex宏包载入检查.
2*class|ctex3\tl_const:Nx\c__ctex_version_tl4{\cs_if_exist_use:cF{ver@\@currname.
\@currext}{9999/99/99}}5*class6\cs_new_eq:cN{ver@ctex.
\@pkgextension}\c__ctex_version_tl7\cs_new_eq:cN{ver@ctexcap.
\@pkgextension}\c__ctex_version_tl8\cs_new_eq:cN{ver@ctexsize.
\@pkgextension}\c__ctex_version_tl9\cs_new_eq:cN{ver@ctexheading.
\@pkgextension}\c__ctex_version_tl10/class11*ctex12\msg_new:nnnn{ctex}{subpackage-loaded}13{Package~`#1'~can~not~be~loaded~with~`ctex'.
}14{15`#1'~is~actually~a~part~of~`ctex'.
\\16It~is~not~necessary~to~load~it~separately.
17}18\@ifpackageloaded{ctexsize}19{\msg_error:nnn{ctex}{subpackage-loaded}{ctexsize}}20{\cs_new_eq:cN{ver@ctexsize.
\@pkgextension}\c__ctex_version_tl}21\@ifpackageloaded{ctexheading}22{\msg_error:nnn{ctex}{subpackage-loaded}{ctexheading}}23{\cs_new_eq:cN{ver@ctexheading.
\@pkgextension}\c__ctex_version_tl}24/ctex25/class|ctex26*class|style27\RequirePackage{xparse,l3keys2e}28/class|style29*class|ctex检查expl3和l3keys2e的版本.
30\msg_new:nnnn{ctex}{l3-too-old}31{Support~package~`#1'~too~old.
}32{33Please~update~an~up-to-date~version~of~the~bundles\\\\34`l3kernel'~and~`l3packages'\\\\35using~your~TeX~package~manager~or~from~CTAN.
36}37\@ifpackagelater{expl3}{2020/07/17}{}38{\msg_error:nnn{ctex}{l3-too-old}{expl3}}39*class40\@ifpackagelater{l3keys2e}{2015/12/20}{}41{\msg_error:nnn{ctex}{l3-too-old}{l3keys2e}}42/class\c__ctex_engine_str\c__ctex_engine_file_str引擎检查.
目前LATEX3将ApTEX识别为upTEX.
43\str_const:Nx\c__ctex_engine_str44{\cs_if_exist:NTF\ngostype{aptex}{\c_sys_engine_str}}45\msg_new:nnnn{ctex}{engine-not-supported}46{Engine~`#1'~is~not~yet~supported,~ctex~will~abort!
}47{You~can~switch~to~xelatex,~lualatex,~pdflatex,~uplatex,~or~aplatex.
}48\file_if_exist:nTF{ctex-engine-\c__ctex_engine_str.
def}49{50\str_const:Nx\c__ctex_engine_file_str51{ctex-engine-\c__ctex_engine_str.
def}52}53{\msg_critical:nnx{ctex}{engine-not-supported}{\c__ctex_engine_str}}54/class|ctex55*class|ctex|ctexheading|ctexsize第14节代码实现39ctexsize也要载入fix-cm包解决传统cm字体字号缺失的问题.
56!
ctexsize\RequirePackage{ctexhook,ctexpatch}57!
ctexheading\RequirePackage{fix-cm}58*!
ctexsize59!
ctexheading\RequirePackage{everysel}14.
1内部函数与变量\l__ctex_tmp_tl\l__ctex_tmp_int\l__ctex_tmp_box\l__ctex_tmp_dim临时变量.
60\tl_clear_new:N\l__ctex_tmp_tl61\int_new:N\l__ctex_tmp_int62\box_new:N\l__ctex_tmp_box63!
ctexheading\dim_new:N\l__ctex_tmp_dim\ctex_define_option:n\ctex_define:n\ctex_set:n\ctex_set:nn在宏包内部使用的键值选项定义、设置命令.
64/!
ctexsize65\cs_new_protected:Npn\ctex_define_option:n66{\keys_define:nn{ctex/option}}67*!
ctexsize68\cs_new_protected:Npn\ctex_define:n69{\keys_define:nn{ctex}}70\cs_new_protected:Npn\ctex_set:n71{\keys_set:nn{ctex}}72\cs_new_protected:Npn\ctex_set:nn#173{\keys_set:nn{ctex/#1}}74/!
ctexsize\ctex_file_input:n输入文件,关闭LATEX3语法环境,并设置@为字母类、^为上标和\endlinechar为13.
75\cs_new_protected:Npn\ctex_file_input:n#176{77\ctex_push_file:78\file_input:n{#1}79\ctex_pop_file:80}81\cs_new_protected:Npn\ctex_push_file:82{83\seq_gpush:Nx\g__ctex_file_status_seq84{85{86\bool_if:NTF\l__kernel_expl_bool87{\ExplSyntaxOn}88{\ExplSyntaxOff}89}90{\char_value_catcode:n{64}}91{\char_value_catcode:n{94}}92{\int_use:N\tex_endlinechar:D}93}94\ExplSyntaxOff95\char_set_catcode_letter:n{64}96\char_set_catcode_math_superscript:n{94}97\int_set:Nn\tex_endlinechar:D{13}98}99\cs_new_protected:Npn\ctex_pop_file:100{101\seq_gpop:NN\g__ctex_file_status_seq\l__ctex_file_status_tl102\exp_after:wN\__ctex_pop_file_aux:nnnn\l__ctex_file_status_tl103}104\cs_new_protected:Npn\__ctex_pop_file_aux:nnnn#1#2#3#4105{106#1107\char_set_catcode:nn{64}{#2}第14节代码实现40108\char_set_catcode:nn{94}{#3}109\int_set:Nn\tex_endlinechar:D{#4}110}111\tl_new:N\l__ctex_file_status_tl112\seq_new:N\g__ctex_file_status_seq\ctex_scheme_input:n输入scheme文件.
先查找当前文档类下的scheme,找不到再查找一般的文件.
113*!
ctexsize114\cs_new_protected:Npn\ctex_scheme_input:n#1115{116\ctex_push_file:117\tl_if_exist:NTF\c__ctex_class_tl118{119\file_if_exist_input:nF{ctex-scheme-#1-\c__ctex_class_tl.
def}120{\file_input:n{ctex-scheme-#1.
def}}121}122{\file_input:n{ctex-scheme-#1.
def}}123\ctex_pop_file:124}125\cs_generate_variant:Nn\ctex_scheme_input:n{o}\g__ctex_section_depth_int若大于3,则\paragraph和\subparagraph标题单独占一行;若为3,则\paragraph单独占一行.
126*!
beamer127\int_new:N\g__ctex_section_depth_int128\int_gset:Nn\g__ctex_section_depth_int{2}129/!
beamer130/!
ctexsize131/class|ctex|ctexheading|ctexsize132*class|ctex对旧版本的宏包给出错误信息.
133\msg_new:nnnn{ctex}{package-too-old}134{Support~package~`#1'~too~old.
}135{136Please~update~an~up-to-date~version~of~the~package~`#1'\\137using~your~TeX~package~manager~or~from~CTAN.
138}\ifctexpdf在zhmetrics映射文件中使用.
139\sys_if_output_pdf:TF140{\cs_new_eq:NN\ifctexpdf\if_true:}141{\cs_new_eq:NN\ifctexpdf\if_false:}\ctex_if_preamble:TF测试是否在LATEX2的导言区.
在宏包内部初始为真,文档最开始位置再设置为假.
注意,钩子\ctex_after_end_preamble:n在\AtBeginDocument之后执行,可以与\@onlypreamble的行为一致.
142\cs_new_eq:NN\ctex_if_preamble:TF\use_i:nn143\ctex_after_end_preamble:n{\cs_set_eq:NN\ctex_if_preamble:TF\use_ii:nn}\ctex_set_default_ccwd:Nn若参数#2带长度单位,则设置它为tl变量#1的值,否则以\ccwd为单位.
144\cs_new_protected:Npn\ctex_set_default_ccwd:Nn#1#2145{\tl_set:Nx#1{\__ctex_default_ccwd_aux:n{#2}}}146\cs_new:Npn\__ctex_default_ccwd_aux:n#1147{148\exp_not:n{#1}149\exp_after:wN\__ctex_default_ccwd_aux:w150\dim_use:N\tex_dimexpr:D#1pt\scan_stop:\q_stop第14节代码实现41151}152\exp_last_unbraced:NNNNo153\cs_new:Npn\__ctex_default_ccwd_aux:w#1{\tl_to_str:n{pt}}#2\q_stop154{\tl_if_empty:nT{#2}{\ccwd}}\g__ctex_encoding_tl所有引擎下默认编码均设为UTF-8,初始值为空,\ProcessKeysOptions再判断.
155\tl_new:N\g__ctex_encoding_tl\g__ctex_zhmCJK_bool是否使用zhmCJK宏包.
156\bool_new:N\g__ctex_zhmCJK_bool\l__ctex_autoindent_tl保存autoindent选项的值,空值表示不自动调整首行缩进.
157\tl_new:N\l__ctex_autoindent_tl\ctex_if_autoindent_touched:F检查autoindent选项是否被用户设置.
158\cs_new_eq:NN\ctex_if_autoindent_touched:F\use:n\ctex_zhmap_case:nnn参数#1是zhmCJK的内容,#2是zhmetrics.
159\cs_new_eq:NN\ctex_zhmap_case:nnn\use_ii:nnn\ctex_at_end:n区分\AtEndOfClass和\AtEndOfPackage,虽然它们的意思都是一样的.
160class\cs_new_protected:Npn\ctex_at_end:n{\AtEndOfClass}161ctex\cs_new_protected:Npn\ctex_at_end:n{\AtEndOfPackage}\g__ctex_std_options_clist保存传递给标准文档类的选项.
162*class163\clist_new:N\g__ctex_std_options_clist164/class对无效选项给出警告.
165\msg_new:nnn{ctex}{invalid-option}166{Option~`\l_keys_key_tl'~is~invalid~in~current~mode.
}167\msg_new:nnn{ctex}{invalid-value}168{Value~`#1'~is~invalid~for~the~key~`\l_keys_key_tl'.
}\ctex_deprecated_option:nn\ctex_set_deprecated_option:n\ctex_deprecated_command:Nn对过时选项或命令给出警告.
169\cs_new_protected:Npn\ctex_deprecated_option:n170{\msg_warning:nnn{ctex}{deprecated-option}}171\cs_new_protected:Npn\ctex_set_deprecated_option:n#1172{173\ctex_deprecated_option:n{Option~`#1'~is~set.
}174\ctex_set:nn{option}{#1}175}176\cs_new_protected:Npn\ctex_deprecated_command:Nn#1#2177{178\msg_warning:nnxx{ctex}{deprecated-command}179{\token_to_str:N#1}{\exp_not:n{#2}}180}181\msg_new:nnn{ctex}{deprecated-option}182{Option~`\l_keys_key_tl'~is~deprecated.
\\#1}183\msg_new:nnn{ctex}{deprecated-command}184{Command~`#1'~is~deprecated.
\\#2}185/class|ctex第14节代码实现42\g__ctex_font_size_int0表示修改默认字体大小为五号,1为小四号,大于1则不作修改.
初始值-1表示zihao选项未初始化,会在将来根据文档类决定初值.
186*class|ctex|ctexsize187\int_new:N\g__ctex_font_size_int188\int_gset:Nn\g__ctex_font_size_int{-1}189/class|ctex|ctexsize14.
2宏包选项190*class|style191\ctex_define_option:n192{193/class|style194*class|ctex|ctexsize195zihao.
choice:,196zihao.
value_required:n=true,197zihao/5.
code:n={\int_gset:Nn\g__ctex_font_size_int{0}},198zihao/-4.
code:n={\int_gset:Nn\g__ctex_font_size_int{1}},199zihao/false.
code:n={\int_gset:Nn\g__ctex_font_size_int{2}},200ctexsize}201/class|ctex|ctexsize202*class|ctex203c5size.
code:n={\ctex_set_deprecated_option:n{zihao=5}},204cs4size.
code:n={\ctex_set_deprecated_option:n{zihao=-4}},205c5size.
value_forbidden:n=true,206cs4size.
value_forbidden:n=true,linespread行距初始值为标志nan,用于检查用户是否设置了linespread选项.
207linespread.
fp_set:N=\l__ctex_line_spread_fp,208linespread.
initial:n={\c_nan_fp},209linespread.
value_required:n=true,autoindent自动调整段落的首行缩进功能.
210autoindent.
choice:,211autoindent.
default:n={true},212autoindent/true.
code:n=213{214\tl_set:Nn\l__ctex_autoindent_tl{2\ccwd}215\cs_set_eq:NN\ctex_if_autoindent_touched:F\use_none:n216},217autoindent/false.
code:n=218{219\tl_clear:N\l__ctex_autoindent_tl220\cs_set_eq:NN\ctex_if_autoindent_touched:F\use_none:n221},222autoindent/unknown.
code:n=223{224\ctex_set_default_ccwd:Nn\l__ctex_autoindent_tl{#1}225\cs_set_eq:NN\ctex_if_autoindent_touched:F\use_none:n226},indent仅为兼容性保留,已过时.
227indent.
code:n=228{229\ctex_deprecated_option:n230{231The~functionality~has~been~removed.
\\232It's~better~to~set~the~heading~styles~via~`afterindent'~option.
233}第14节代码实现43234},235indent.
value_forbidden:n=true,236noindent.
code:n=237{238\ctex_deprecated_option:n239{240The~functionality~has~been~removed.
\\241It's~better~to~set~the~heading~styles~via~`afterindent'~option.
242}243},244noindent.
value_forbidden:n=true,GBKUTF8文档编码,默认为UTF-8.
245GBK.
code:n=246{247\sys_if_engine_pdftex:TF248{\tl_gset:Nn\g__ctex_encoding_tl{GBK}}249{250\msg_warning:nn{ctex}{invalid-option}251\tl_gset:Nn\g__ctex_encoding_tl{UTF8}252}253},254UTF8.
code:n={\tl_gset:Nn\g__ctex_encoding_tl{UTF8}},255GBK.
value_forbidden:n=true,256UTF8.
value_forbidden:n=true,fontset初始值为空.
若用户未指定,则根据操作系统载入对应字体配置,可以区分Windows、macOS和其他.
257fontset.
tl_gset:N=\g__ctex_fontset_tl,258nofonts.
code:n={\ctex_set_deprecated_option:n{fontset=none}},259adobefonts.
code:n={\ctex_set_deprecated_option:n{fontset=adobe}},260winfonts.
code:n={\ctex_set_deprecated_option:n{fontset=windows}},261nofonts.
value_forbidden:n=true,262winfonts.
value_forbidden:n=true,263adobefonts.
value_forbidden:n=true,264zhmap.
choice:,265zhmap.
default:n={true},266zhmap/zhmCJK.
code:n=267{268\bool_gset_true:N\g__ctex_zhmCJK_bool269\cs_gset_eq:NN\ctex_zhmap_case:nnn\use_i:nnn270},271zhmap/true.
code:n=272{273\bool_gset_false:N\g__ctex_zhmCJK_bool274\cs_gset_eq:NN\ctex_zhmap_case:nnn\use_ii:nnn275},276zhmap/false.
code:n=277{278\bool_gset_false:N\g__ctex_zhmCJK_bool279\cs_gset_eq:NN\ctex_zhmap_case:nnn\use_iii:nnn280},281nozhmap.
code:n=282{\ctex_set_deprecated_option:n{zhmap=false}},283nozhmap.
value_forbidden:n=true,punct设置标点符号输出格式.
284punct.
tl_set:N=\l__ctex_punct_tl,285punct.
default:n={quanjiao},第14节代码实现44286punct.
initial:n={quanjiao},287nopunct.
code:n=\ctex_set_deprecated_option:n{punct=plain},288nopunct.
value_forbidden:n=true,289space.
choices:nn=290{true,auto,false}291{292\exp_args:Nx\ctex_at_end:n293{\ctex_set:n{space=\l_keys_choice_tl}}294},295space.
default:n={true},296nospace.
code:n={\ctex_deprecated_option:nn{space=false}},297nospace.
value_forbidden:n=true,298heading.
bool_set:N=\l__ctex_heading_bool,299/class|ctex300*class|ctex|ctexheading301*!
beamer302sub3section.
code:n=303{\int_gset:Nn\g__ctex_section_depth_int{3}},304sub4section.
code:n=305{\int_gset:Nn\g__ctex_section_depth_int{4}},306sub3section.
value_forbidden:n=true,307sub4section.
value_forbidden:n=true,308/!
beamer309scheme.
tl_set:N=\l__ctex_scheme_tl,310*ctexheading311scheme.
default:n={plain},312scheme.
initial:n={plain}313}314/ctexheading315*!
ctexheading316scheme.
default:n={chinese},317scheme.
initial:n={chinese},318/!
ctexheading319/class|ctex|ctexheading320*class|ctexcapnocapcap和nocap是过时选项.
321cap.
code:n={\ctex_set_deprecated_option:n{scheme=chinese}},322nocap.
code:n={\ctex_set_deprecated_option:n{scheme=plain}},323cap.
value_forbidden:n=true,324nocap.
value_forbidden:n=true,以下三项都是过时的兼容选项,它们会载入有关宏包.
325fntef.
code:n=326{327\sys_if_engine_xetex:TF328{329\ctex_deprecated_option:n{`xeCJKfntef'~package~is~loaded.
}330\ctex_at_end:n{\RequirePackage{xeCJKfntef}}331}332{333\sys_if_engine_pdftex:TF334{335\ctex_deprecated_option:n{`CJKfntef'~package~is~loaded.
}336\ctex_at_end:n{\RequirePackage{CJKfntef}}337}第14节代码实现45338{339\ctex_deprecated_option:n340{Furthermore,~option~`fntef'~is~invalid~in~current~mode.
}341}342}343},344fancyhdr.
code:n=345{346\ctex_deprecated_option:n{`fancyhdr'~package~is~loaded.
}347\ctex_at_end:n{\RequirePackage{fancyhdr}}348},349hyperref.
code:n=350{351\ctex_deprecated_option:n{`hyperref'~package~will~be~loaded.
}352\ctex_at_end:n353{354\cs_if_exist:NF\hypersetup355{\cs_new_eq:NN\hypersetup\ctex_hypersetup:n}356}357\ctex_at_end_preamble:n{\RequirePackage{hyperref}}358},359}360/class|ctex361*class|ctex|ctexsize10pt11pt12pt使ctex和ctexsize可以接受文档类的全局选项,不修改默认字体大小.
在文档类下还将参数传给标准文档类.
362\tl_clear_new:N\l__ctex_tmp_tl363\clist_map_inline:nn364{36510pt,11pt,12pt,3668pt,9pt,14pt,17pt,20pt,25pt,30pt,36pt,48pt,60pt367}368{369\tl_put_right:Nn\l__ctex_tmp_tl370{371#1.
code:n=372*!
class373{\int_gset:Nn\g__ctex_font_size_int{2}},374/!
class375*class376{377\int_gset:Nn\g__ctex_font_size_int{2}378\clist_gput_right:Nn\g__ctex_std_options_clist{#1}379},380/class381#1.
value_forbidden:n=true,382}383}384\exp_args:No\ctex_define_option:n{\l__ctex_tmp_tl}385\tl_clear:N\l__ctex_tmp_tl将未知选项传给标准文档类.
386*class387\ctex_define_option:n388{389unknown.
code:n=390{\clist_gput_right:No\g__ctex_std_options_clist{\CurrentOption}}391}392/class第14节代码实现46载入选项配置文件.
393!
ctexsize\ctex_file_input:n{ctexopts.
cfg}394/class|ctex|ctexsize处理宏包选项.
395*class|style396\ProcessKeysOptions{ctex/option}397/class|stylepdfLATEX下,如果没有显式指定编码为UTF8,则给出警告信息.
398*class|ctex399\msg_new:nnn{ctex}{pdftex-utf8}400{UTF8~will~be~used~as~the~default~encoding.
}401\tl_if_empty:NT\g__ctex_encoding_tl402{403\sys_if_engine_pdftex:T404{\msg_warning:nn{ctex}{pdftex-utf8}}405\tl_gset:Nn\g__ctex_encoding_tl{UTF8}406}407/class|ctex408*class五号字使用标准文档类的10pt字体大小设置,小四号字则使用12pt.
409\int_case:nn{\g__ctex_font_size_int}410{411{0}{\clist_gput_right:Nn\g__ctex_std_options_clist{10pt}}412{1}{\clist_gput_right:Nn\g__ctex_std_options_clist{12pt}}413}使用\PassOptionsToClass是为了预防可能存在的选项冲突.
414*article415\tl_const:Nn\c__ctex_class_tl{article}416\PassOptionsToClass{\g__ctex_std_options_clist}{article}417\LoadClass{article}418/article419*book420\tl_const:Nn\c__ctex_class_tl{book}421\PassOptionsToClass{\g__ctex_std_options_clist}{book}422\LoadClass{book}423/book424*report425\tl_const:Nn\c__ctex_class_tl{report}426\PassOptionsToClass{\g__ctex_std_options_clist}{report}427\LoadClass{report}428/report429*beamer430\tl_const:Nn\c__ctex_class_tl{beamer}431\PassOptionsToClass{\g__ctex_std_options_clist}{beamer}432\LoadClass{beamer}433/beamer434/class14.
3特定引擎支持与设置14.
3.
1ctexbackend.
cfg对于XLATEX/pdfLATEX/LuaLATEX等默认直接输出PDF的编译方式,用户无需为涉及驱动的宏包指定驱动选项.
对于LATEX和upLATEX等默认不直接输出PDF的编译方式,用户则需要指定驱动选项.
第14节代码实现47由于历史遗留问题,在使用LATEX或upLATEX等编译时,大多数涉及驱动的宏包选定的默认输出驱动都是Dvips.
考虑当前实际使用频率,以及考虑到CTEX宏集对中文支持的默认方式,我们在用户使用CTEX系列文档类时,将默认的输出驱动改为DVIPDFM.
具体来说,如果dvips,dvipdfmx,dvisvgm等驱动没有在文档类的全局选项中被明确指定,我们就在\@classoptionslist开头加入dvipdfmx.
本段代码只在ctexart等文档类开头载入,不在ctex中使用.
并且需要放在expl3之前载入,保证它载入正确的backend文件.
435*backend436\begingroup437\expandafter\ifx\csnameUmathchardef\endcsname\relax438\else\expandafter\endgroup\expandafter\endinput\fi439\ifodd440\expandafter\ifx\csnamepdfoutput\endcsname\relax441\expandafter\ifx\csnameenablecjktoken\endcsname\relax0\else1\fi442\else\ifnum\pdfoutput>00\else1\fi\fi\space443\def\x#1{%444\if\relax\detokenize{#1}\relax445\gdef\@classoptionslist{dvipdfmx}%446\else447\let\CTEX@add\@ne448\@tfor\x:={dvips}{dvipdfmx}{dvisvgm}\do{%449\expandafter\in@\expandafter{\expandafter,\x,}{,#1,}%450\ifin@\let\CTEX@add\tw@\@break@tfor\fi}%451\ifodd\CTEX@add\gdef\@classoptionslist{dvipdfmx,#1}\fi452\fi}453\expandafter\x\expandafter{\@classoptionslist}454\fi455\endgroup456/backend14.
3.
2ctex-engine-pdftex.
def\ctex_set_zhmap:n设置upTEX字体映射,同时作用于\AtBeginDvi与\AtBeginShipoutFirst.
该宏对pdfTEX和upTEX均有用.
\AtBeginDvi直接将\special保存到盒子中,\AtBeginShipoutFirst是保存到到宏中,并且不展开参数.
可以使用LATEX2020/10/01的钩子机制来统一设置.
457*pdftex|uptex|aptex458\cs_new_protected:Npn\ctex_set_zhmap:n459{\tl_gput_right:Nx\g__ctex_zhmap_tl}460\cs_new_protected:Npn\ctex_use_zhmap:461{\tl_use:N\g__ctex_zhmap_tl}462\cs_if_exist:NTF\ctex_gadd_ltxhook:nn463{\ctex_gadd_ltxhook:nn{shipout/firstpage}{\ctex_use_zhmap:}}464{465\cs_new_protected:Npn\ctex_add_dvi_zhmap:466{\AtBeginDvi{\ctex_use_zhmap:}}467\ctex_after_end_preamble:n{\ctex_add_dvi_zhmap:}468\ctex_at_end_package:nn{atbegshi}469{470\AtBeginShipoutFirst{\ctex_use_zhmap:}471\cs_gset_eq:NN\ctex_add_dvi_zhmap:\prg_do_nothing:472}473}474\tl_new:N\g__ctex_zhmap_tl475\@onlypreamble\ctex_set_zhmap:n476/pdftex|uptex|aptex477*pdftex第14节代码实现48\c__ctex_cmap_encoding_seq需要加上CMap的CJK字体编码.
478\seq_const_from_clist:Nn\c__ctex_cmap_encoding_seq479{C19,C10,C00,C09,C40,C60}\ctex_family_cmap:nn在\DeclareFontFamily的loading-settings中给CJK字体族加上CMap.
480\cs_new_protected:Npn\ctex_family_cmap:nn#1#2481{482\cs_if_free:cF{#1+#2}483{484\seq_if_in:NnT\c__ctex_cmap_encoding_seq{#1}485{\tl_gput_right:cn{#1+#2}{\ctex_add_cmap:n{#1}}}486}487}488\cs_generate_variant:Nn\ctex_family_cmap:nn{x}489\cs_new_eq:NN\CTEX@Family@CMap\ctex_family_cmap:xn\ctex_add_cmap:n给#1编码的CJK字体加上CMap.
490\cs_new_protected:Npn\ctex_add_cmap:n#1491{492\cs_if_free:NF\CJK@plane493{\ctex_add_cmap:cn{__ctex_add_cmap_#1\CJK@plane:}{#1}}494}495\cs_new_protected:Npn\ctex_add_cmap:Nn#1#2496{497\cs_if_exist:NF#1{\__ctex_save_cmap:Nn#1{#2}}498#1499}500\cs_generate_variant:Nn\ctex_add_cmap:Nn{c}501\cs_new_protected:Npn\__ctex_save_cmap:Nn#1#2502{503\tl_set:Nx\l__ctex_tmp_tl{\str_lowercase:n{#2}\CJK@plane}504\tex_immediate:D\tex_pdfobj:Dstream~file{\l__ctex_tmp_tl.
cmap}505\cs_new_protected:Npx#1506{507\exp_not:N\tex_pdffontattr:D\exp_not:N\tex_font:D508{/ToUnicode~\int_use:N\tex_pdflastobj:D\c_space_tl0~R}509}510}\DeclareFontFamily只在pdfLATEX下加CMap.
如cmap宏包被引入,则不重复设置.
511\group_begin:512\char_set_catcode_other:N\#513\sys_if_output_pdf:TF514{515\group_end:516\ctex_appto_cmd:NnnTF\DeclareFontFamily{\ExplSyntaxOff}517{\CTEX@Family@CMap{#1}{#2}}518{519\ctex_at_end_package:nn{cmap}520{\cs_gset_eq:NN\CTEX@Family@CMap\use_none:nn}521}522{\ctex_patch_failure:N\DeclareFontFamily}523}524{\group_end:}首先检查选项,决定是否载入zhmCJK宏包.
525\if_bool:N\g__ctex_zhmCJK_bool526\PassOptionsToPackage{encoding=\g__ctex_encoding_tl}{zhmCJK}527\RequirePackage{zhmCJK}不载入zhmCJK宏包时直接调用CJK及相关宏包.
528\else:第14节代码实现49529\str_if_eq:onTF{\g__ctex_encoding_tl}{GBK}530{\RequirePackage{CJK}}531{\RequirePackage{CJKutf8}}532\RequirePackage{CJKpunct,CJKspace}\ctex_load_zhmap:nnnn载入zhmetrics的字体映射文件,同时设置\CJKrmdefault等.
533\cs_new_protected:Npn\ctex_load_zhmap:nnnn#1#2#3#4534{535\tl_set:Nn\CJKrmdefault{#1}536\tl_set:Nn\CJKsfdefault{#2}537\tl_set:Nn\CJKttdefault{#3}538\ctex_set_zhmap:n{\ctex_file_input:n{ctex-zhmap-#4.
tex}}539}540\@onlypreamble\ctex_load_zhmap:nnnnzhmCJK判断结束.
541\fi:\ctex_CJK_input:n\CJK@inputbreqn包可能会在正文中将^的\catcode改为12或13,这将破坏CJK对汉字的首字节的定义(\CJK@loadBinding和\CJK@loadEncoding).
因此需要确保载入.
enc和.
bdg文件时,^的\catcode为7.
同时要设置\endlinechar为1.
542\cs_new_protected:Npn\ctex_CJK_input:n#1543{544\ctex_push_file:545\int_set:Nn\tex_endlinechar:D{-1}546\file_input:n{#1}547\ctex_pop_file:548}549\cs_set_eq:NN\CJK@input\ctex_CJK_input:n\ctex_plane_to_utfxvibe:Nn\CJK@surrfancyhdr宏包的\nouppercase会将\uppercase定义为\relax,而\CJK@surr需要用它将\CJK@plane转化成大写字母,这就造成了冲突18.
我们在这里给出\CJK@surr的一个不依赖\uppercase的实现.
550\if_cs_exist:N\CJK@surr551\cs_new_protected:Npn\ctex_plane_to_utfxvibe:Nn#1#2552{553\tl_set:Nx\l__ctex_tmp_tl{#2}554\int_set:Nn\l__ctex_tmp_int555{\exp_args:No\int_from_hex:n{\l__ctex_tmp_tl}}556\int_compare:nNnTF\l__ctex_tmp_int20200412.
0866andltjfont.
does_alt_set867orfunction()868localbase=scan_arg()869ltjfont.
does_alt_set(base)870end871set_lua("__ctex_ltj_if_alt_set:nT",id,"global")\ctex_ltj_zero_globaldefs:设置\globaldefs为0,避免全局设置,应当在分组中使用.
这里通过Lua设置,可以不受外部TEX环境中的\globaldefs的影响.
872localid=new_luafunction("ctex")873func[id]=function()874tex.
set("globaldefs",0)875end876set_lua("ctex_ltj_zero_globaldefs:",id,"global","protected")877}878\group_end:14.
3.
4.
4字体切换方式\ctex_ltj_select_font:\CJK@family\CJK@family保存的是当前CJK实际的字体族名,如果为空表示没有设置过字体.
879\cs_new_protected:Npn\ctex_ltj_select_font:880{881\group_begin:\exp_args:NNc\group_end:882\cs_if_exist_use:NF{\l__ctex_ltj_current_font_tl}883{\tl_if_empty:NF\CJK@family{\__ctex_ltj_select_font_aux:}}884}885\tl_new:N\CJK@family886\tl_new:N\l__ctex_ltj_current_font_tl887\tl_set:Nn\l__ctex_ltj_current_font_tl888{\CJK@encoding/\CJK@family/\f@series/\f@shape/\f@size}\__ctex_ltj_select_font_aux:使用\pickup@font取得字体名称前,总需要先设置\font@name.
在这里将\f@family换成CJK字体族,并确保编码正确.
889\cs_new_protected:Npn\__ctex_ltj_select_font_aux:890{891\group_begin:892\tl_set_eq:NN\f@encoding\CJK@encoding893\tl_set_eq:NN\f@family\CJK@family894\__ctex_ltj_push_fontname:n{\use:c{\curr@fontshape/\f@size}}895\ctex_ltj_pickup_font:896\group_end:897\font@name898\__ctex_ltj_pop_fontname:当字形未定义的时候,NFSS就会启动替换机制(\wrong@fontshape).
第一次启动后,\l__-ctex_ltj_current_font_tl还是没有定义.
为此,我们再次选择字体,确保它有定义和指向正确的font.
id.
这对AlternateFont的设置特别重要.
899\cs_if_exist:cF{\l__ctex_ltj_current_font_tl}第14节代码实现58900{\__ctex_ltj_select_font_aux:}901}902\cs_new_protected:Npn\__ctex_ltj_push_fontname:n#1903{904\seq_gpush:No\g__ctex_ltj_fontname_seq{\font@name}905\cs_gset_nopar:Npx\font@name{#1}906}907\cs_new_protected:Npn\__ctex_ltj_pop_fontname:908{909\seq_gpop:NNT\g__ctex_ltj_fontname_seq\l__ctex_ltj_tmp_tl910{\cs_gset_eq:NN\font@name\l__ctex_ltj_tmp_tl}911}912\seq_new:N\g__ctex_ltj_fontname_seq\ctex_ltj_pickup_font:替换\define@newfont内部调用的\extract@font和\do@subst@correction.
913\cs_new_protected:Npn\ctex_ltj_pickup_font:914{915\exp_after:wN\cs_if_exist:NF\font@name916{917\group_begin:918\cs_set_eq:NN\extract@font\ctex_ltj_extract_font:919\cs_set_eq:NN\do@subst@correction\ctex_ltj_subst_font:920\define@newfont921\group_end:922}923}924\cs_new_eq:NN\pickup@jfont\ctex_ltj_pickup_font:\ctex_ltj_extract_font:LuaTeX-ja的\globaljfont在luatexja-core中定义:jfont\CS=jfm=metric;.
.
.
},\globaljfont\protected\def\jfont#1{%\afterassignment\ltj@@jfont\directlua{luatexja.
jfont.
jfontdefX(false,'yoko','\luatexluaescapestring{\noexpand#1}')}}\protected\def\globaljfont#1{%\afterassignment\ltj@@jfont\directlua{luatexja.
jfont.
jfontdefX(true,'yoko','\luatexluaescapestring{\noexpand#1}')}}\newluafunction\ltj@@jfont@inner\directlua{localt=lua.
get_functions_table()t[\the\ltj@@jfont@inner]=luatexja.
jfont.
jfontdefY}\def\ltj@@jfont{\luafunction\ltj@@jfont@inner}jfontdefX函数的作用是把\CS定义为其后的字体,jfontdefY的作用是更新JFM和记录相关字体信息.
最后的工作是:tex.
sprint(cat_lp,global_flag,'\\protected\\expandafter\\def\\csname',(cstemp=='')and'\\space'orcstemp,'\\endcsname{\\ltj@cur'.
.
(jfm_dir=='yoko'and'j'or't').
.
'fnt',fn,'\\relax}')\CS的作用就是把\ltj@curjfnt设置为刚才定义的字体的font.
id.
925\cs_new_protected_nopar:Npn\ctex_ltj_extract_font:926{927\get@external@font928\ctex_ltj_if_alternate_shape_exist:nT{\curr@fontshape}929{930\tl_set:Nx\external@font931{\exp_after:wN\__ctex_ltj_patch_external_font:w\external@font}932}933\exp_after:wN\globaljfont\font@name\external@font\scan_stop:这里\font@name不会直接改变当前字体,而\DeclareFontFamily和\DeclareFontShape第14节代码实现59的最后一个参数通常要使用\font来引用当前字体.
为此,我们在分组内启用之前定义的字体,以便能得到正确的\font.
对字体参数的赋值总是全局的,不会受到分组的影响.
934\font@name935\ctex_ltj_use_jfont:936\use:c{\f@encoding+\f@family}937\use:c{\curr@fontshape}938}\ctex_ltj_subst_font:\do@subst@correction在设置通过sub或者ssub函数定义的字体时会用到.
如果没有设置SlantedFont,fontspec会设置\itdefault作为\sldefault的替代字形,因而会用到这个函数.
它的本来定义是:\def\do@subst@correction{%\xdef\subst@correction{%\font@name\global\expandafter\font\csname\curr@fontshape/\f@size\endcsname\noexpand\fontname\font\relax}%\aftergroup\subst@correction}我们在这里不需要定义新字体,而是设置对应字体的命令.
939\cs_new_protected_nopar:Npn\ctex_ltj_subst_font:940{941\ctex_ltj_if_alternate_shape_exist:nF{\curr@fontshape}942{943\group_begin:944\tl_set_eq:NN\CJK@family\f@family945\cs_if_exist:cF{\l__ctex_ltj_current_font_tl}946{947\cs_gset_protected_nopar:Npx\subst@correction948{949\cs_new_eq:NN950\exp_not:c{\l__ctex_ltj_current_font_tl}951\font@name952}953\group_insert_after:N\group_insert_after:N954\group_insert_after:N\subst@correction955}956\group_end:957}958}\ctex_ltj_if_alternate_shape_exist:nTF即LuaTeX-ja中的\ltj@@does@alt@set,判断是否存在替代字体.
959\prg_new_conditional:Npnn\ctex_ltj_if_alternate_shape_exist:n#1{T,F,TF}960{961\__ctex_ltj_if_alt_set:nT{#1}{\prg_return_true:\use_none:n}962\prg_return_false:963}964\cs_new:Npn\__ctex_ltj_patch_external_font:w#1~at965{\ctex_ltj_patch_external_font:n{#1}~at}\ctex_ltj_select_alternate_font:在\selectfont中更新替代字体.
966\cs_new_protected:Npn\ctex_ltj_select_alternate_font:967{968\ctex_ltj_if_alternate_shape_exist:nT{\l__ctex_ltj_current_shape_tl}969{970\ctex_ltj_pickup_alt_font:nn971{\l__ctex_ltj_current_shape_tl}{\f@size}972}第14节代码实现60973}974\tl_new:N\l__ctex_ltj_current_shape_tl975\tl_set:Nn\l__ctex_ltj_current_shape_tl976{\CJK@encoding/\CJK@family/\f@series/\f@shape}\ltj@pickup@altfont@auxy被用在函数output_alt_font_cmd中,作用是定义替代字体.
977\cs_new_protected:Npn\ltj@pickup@altfont@auxy#1978{979\cs_if_exist:cF{#1/\f@size}980{981\group_begin:982\use:e{\exp_not:N\split@name#1/\f@size}\@nil983\__ctex_ltj_push_fontname:n{\use:c{\curr@fontshape/\f@size}}984\ctex_ltj_pickup_font:985\group_end:986\__ctex_ltj_pop_fontname:987}988}\ltj@pickup@altfont@copy被用在函数pickup_alt_font_a中.
\ltj@@getjfontnumber的作用是将字体命令#1对应的font.
id保存到\ltj@tempcntc中.
989\cs_new_protected:Npn\ltj@pickup@altfont@copy#1#2990{991\ltj@@getjfontnumber#1992\__ctex_ltj_pickup_alt_font:Nn\ltj@tempcntc{#2}993}14.
3.
4.
5数学字体族以下内容来自lltjfont.
sty,目的是让汉字可以在数学环境中直接使用.
\ctex_ltj_if_jfont:nTF参数#1是一个LATEX2编码名称或者字体命令.
LATEX2字体命令的一般形式是:\encoding/family/series/shape通过截取名字中的encoding来判断是否是jfont.
最后会设置\ifin@为对应的\iftrue或者\iffalse.
994\cs_new:Npn\ctex_ltj_if_jfont:nTF#1995{996\ctex_ltj_is_kenc:n{\__ctex_ltj_ltj_if_jfont:w#1/\q_stop}997\ifin@\exp_after:wN\use_i:nn\else:\exp_after:wN\use_ii:nn\fi:998}999\cs_new:Npn\__ctex_ltj_ltj_if_jfont:w#1/#2\q_stop1000{#1}\ctex_ltj_if_jfont_math:NTF#1是一个形式为\M@encoding的命令,它由\DeclareFontEncoding的第三个参数来定义.
1001\cs_new:Npn\ctex_ltj_if_jfont_math:NTF#11002{\exp_after:wN\__ctex_ltj_if_jfont_math:w\token_to_str:N#1\q_stop}1003\group_begin:1004\char_set_catcode_other:NM1005\cs_new:Npn\__ctex_ltj_if_jfont_math:w#1M#2#3\q_stop1006{\ctex_ltj_if_jfont:nTF{#3}}1007\group_end:\getanddefine@fonts\ctex_ltj_get_and_define_fonts:nN在使用的场合,\escapechar已经被设置成1,使用\token_to_str:N就可以得到名字,不必使用\cs_to_str:N.
1008\cs_new_protected:Npn\ctex_ltj_get_and_define_fonts:nN#1#21009{第14节代码实现611010\exp_args:No\ctex_ltj_if_jfont:nTF{\token_to_str:N#2}1011{\ctex_ltj_get_and_define_fonts_ja:nN}1012{\ctex_ltj_get_and_define_fonts_al:nN}1013{#1}#21014}1015\cs_new_eq:NN\ctex_ltj_get_and_define_fonts_al:nN\getanddefine@fonts1016\cs_set_eq:NN\getanddefine@fonts\ctex_ltj_get_and_define_fonts:nN1017\cs_new_protected:Npn\ctex_ltj_get_and_define_fonts_ja:nN#1#21018{1019\tl_gset:Nx\font@name{\use:c{\token_to_str:N#2/\tf@size}}1020\ctex_ltj_pickup_font:\tl_set_eq:NN\textfont@name\font@name1021\tl_gset:Nx\font@name{\use:c{\token_to_str:N#2/\sf@size}}1022\ctex_ltj_pickup_font:\tl_set_eq:NN\scriptfont@name\font@name1023\tl_gset:Nx\font@name{\use:c{\token_to_str:N#2/\ssf@size}}1024\ctex_ltj_pickup_font:1025\tl_put_right:Nx\math@fonts1026{1027\ltj@setpar@global1028\ltj@@set@stackfont#1,\textfont@name\c_colon_str{MJT}1029\ltj@@set@stackfont#1,\scriptfont@name\c_colon_str{MJS}1030\ltj@@set@stackfont#1,\font@name\c_colon_str{MJSS}1031}1032}\use@mathgroup\ctex_ltj_use_math_group:Nn在使用unicode-math宏包时,\ctex_ltj_math_group_hook:将被重定义.
1033\cs_new_protected:Npn\ctex_ltj_use_math_group:Nn#1#21034{1035\mode_if_math:T1036{1037\math@bgroup1038\cs_if_eq:cNF{M@\f@encoding}#1{#1}1039\ctex_ltj_math_group_hook:1040\ctex_ltj_if_jfont_math:NTF#11041{\jfam}{\mathgroup}#2\scan_stop:1042\math@egroup1043}1044}1045\cs_new_eq:NN\ctex_ltj_math_group_hook:\prg_do_nothing:1046\cs_set_eq:NN\use@mathgroup\ctex_ltj_use_math_group:Nn对unicode-math的补丁主要是将unicode-math-table.
tex中的数学符号设置为lua-texja中的数学字母.
本段代码应放在\ctex_ltj_math_group_hook:的定义之后,避免因宏包载入顺序而造成的编译错误.
1047\cs_new_protected:Npn\ctex_ltj_set_math_letter:NN#1#21048{1049\group_begin:1050\cs_set_protected:Npn#1##1##2##31051{\ltjsetmathletter{##1}}1052#21053\group_end:1054}1055\ctex_at_end_package:nn{unicode-math}1056{1057\cs_if_exist:NTF\um_input_math_symbol_table:1058{1059\ctex_ltj_set_math_letter:NN1060\um_sym:nnn1061\um_input_math_symbol_table:1062}1063{1064\cs_set_eq:NN\use@mathgroup\ctex_ltj_use_math_group:Nn1065\cs_set_protected:Npn\ctex_ltj_math_group_hook:1066{\__um_switchto_literal:}1067\ctex_ltj_set_math_letter:NN第14节代码实现621068\__um_sym:nnn1069\__um_input_math_symbol_table:1070}1071}14.
3.
4.
6字体族的定义与使用\ctex_mono_jfm:n\l__ctex_ltj_jfm_tlLuaTeX-ja中与标点格式plain对应的JFM是mono.
1072\cs_new_protected:Npn\ctex_mono_jfm:n#11073{1074\str_if_eq:nnTF{#1}{plain}1075{\tl_set:Nn\l__ctex_ltj_jfm_tl{mono}}1076{\tl_set:Nn\l__ctex_ltj_jfm_tl{#1}}1077}1078\tl_new:N\l__ctex_ltj_jfm_tl1079\cs_generate_variant:Nn\ctex_mono_jfm:n{o}1080\ctex_mono_jfm:o{\l__ctex_punct_tl}\CJK@encoding在LATEX下,LuaTeX-ja依赖字体编码来实现特殊设置.
例如上述的\ctex_ltj_if_-jfont:nTF就是通过判断编码来实现的,它在设置数学字体时会用到.
所以不应该与西文共用EU2.
定义字体族song为\CJK@encoding的默认替换字体.
下划线_不在\nfss@catcodes里,可以放心使用.
1081\tl_const:Nn\CJK@encoding{LTJY3}1082\DeclareFontEncoding{\CJK@encoding1083\use:e1084{1085\exp_not:N\DeclareFontSubstitution1086{\CJK@encoding}{song}{\mddefault}{\shapedefault}1087}1088\ctex_ltj_add_kyenc:n{\CJK@encoding}1089\DeclareFontFamily{\CJK@encoding}{song}{}1090\DeclareFontShape{\CJK@encoding}{song}{\mddefault}{\shapedefault}1091{psft:SimSun:cid=Adobe-GB1-5;jfm=\l__ctex_ltj_jfm_tl}{}1092\DeclareFontShape{\CJK@encoding}{song}{\bfdefault}{\shapedefault}1093{psft:SimHei:cid=Adobe-GB1-5;jfm=\l__ctex_ltj_jfm_tl}{}1094\tl_const:Nn\c__ctex_ltj_math_tl{CJKmath}1095\DeclareSymbolFont{\c__ctex_ltj_math_tl}1096{\CJK@encoding}{song}{\mddefault}{\shapedefault}1097\SetSymbolFont{\c__ctex_ltj_math_tl}{bold}1098{\CJK@encoding}{song}{\bfdefault}{\shapedefault}1099\int_const:Nn\c__ctex_ltj_math_fam_int{\use:c{sym\c__ctex_ltj_math_tl}}1100\jfam\c__ctex_ltj_math_fam_int这是luatexja-fontspec中新增的一些字体选项.
1101\newfontfeature{CID}{cid=#1}1102\newfontfeature{JFM}{jfm=#1}1103\newfontfeature{JFM-var}{jfmvar=#1}在新版本的fontspec中,\__fontspec_fontname_wrap:n变成了私有函数.
1104\keys_define:nn{fontspec-preparse-external}1105{1106NoEmbed.
code:n=1107{\cs_set_eq:NN\__fontspec_fontname_wrap:n\__ctex_ltj_noembed_wrap:n}1108}1109\cs_new:Npn\__ctex_ltj_noembed_wrap:n#1{psft:#1}\ctex_ltj_set_family:nnn将自定义的字体族名与fontspec实际设置的名字对应起来.
1110\cs_new_protected:Npn\ctex_ltj_set_family:nnn#1#2#31111{1112\group_begin:第14节代码实现631113\clist_clear:N\l__ctex_ltj_char_range_clist1114\prop_clear:N\l__ctex_ltj_alternate_prop1115\tl_set:Nn\l__ctex_ltj_base_CJKfamily_tl{#1}1116\keys_set_known:nnN{ctex_ltj/fontspec}{#2}\l__ctex_ltj_tmp_tl1117\clist_set:No\l__ctex_ltj_font_options_clist{\l__ctex_ltj_tmp_tl}1118\ctex_ltj_set_alternate_family:nnF{#1}{#3}1119{1120\prop_gput:Nnn\g__ctex_ltj_family_font_name_prop{#1}{#3}1121\prop_gput:Nno\g__ctex_ltj_family_font_options_prop1122{#1}{\l__ctex_ltj_font_options_clist}1123\__ctex_ltj_update_family_uid:N\l__ctex_ltj_font_options_clist1124\__ctex_ltj_use_global_options:N\l__ctex_ltj_font_options_clist1125\__ctex_ltj_gset_family_cs:nn{#1}{#3}1126}1127\group_end:1128}1129\tl_new:N\l__ctex_ltj_base_CJKfamily_tl1130\clist_new:N\l__ctex_ltj_font_options_clist\__ctex_ltj_use_global_options:N应用默认字体选项,并总是设置JFM和NFSSEncoding.
1131\cs_new_protected:Npn\__ctex_ltj_use_global_options:N#11132{1133\clist_concat:NNN#1\g__ctex_ltj_default_features_clist#11134\clist_put_left:Nx#11135{NFSSEncoding=\CJK@encoding,JFM=\l__ctex_ltj_jfm_tl}1136}\g__ctex_ltj_family_name_prop\g__ctex_ltj_family_font_name_prop\g__ctex_ltj_family_font_options_prop分别保存fontspec设置的字体族名、字体名称和字体选项.
1137\prop_new:N\g__ctex_ltj_family_name_prop1138\prop_new:N\g__ctex_ltj_family_font_name_prop1139\prop_new:N\g__ctex_ltj_family_font_options_prop\__ctex_ltj_check_family:n删除重复的定义,清除替代字体的先前设置.
1140\cs_new_protected:Npn\__ctex_ltj_check_family:n#11141{1142\prop_gpop:NnNT\g__ctex_ltj_family_font_name_prop{#1}\l__ctex_ltj_tmp_tl1143{1144\cs_undefine:c{\__ctex_ltj_family_csname:n{#1}}1145\cs_undefine:c{\__ctex_ltj_alternate_cs:n{#1}}1146\prop_gpop:NnNT\g__ctex_ltj_family_name_prop{#1}\l__ctex_ltj_base_family_tl1147{1148\use:c{\__ctex_ltj_alternate_cs:n{clear/#1}}1149\cs_undefine:c{\__ctex_ltj_alternate_cs:n{clear/#1}}1150\cs_undefine:c{\__ctex_ltj_alternate_cs:n{reset/#1}}1151\prop_gremove:Nn\g__ctex_ltj_reset_alternate_prop{#1}1152}1153\msg_warning:nnxx{ctex}{redefine-family}{#1}{\l__ctex_ltj_tmp_tl}1154}1155}1156\tl_new:N\l__ctex_ltj_tmp_tl1157\msg_new:nnn{ctex}{redefine-family}1158{Redefining~CJKfamily~`\__ctex_ltj_msg_family_map:n{#1}'~(#2).
}\__ctex_ltj_gset_family_cs:nn在设置字体时,实际上并不是马上就定义.
而是只保存相关参数,在通过\CJKfamily第一次使用时才定义.
需要注意将编码改为\CJK@encoding.
1159\cs_new_protected:Npn\__ctex_ltj_gset_family_cs:nn#1#21160{1161\cs_gset_protected:cpx{\__ctex_ltj_family_csname:n{#1}}1162{1163\group_begin:1164\exp_not:n{\cs_set_eq:NN\CJKfamily\use_none:n}1165\exp_not:n{\fontspec_gset_family:Nnn\g__ctex_ltj_fontspec_family_tl}第14节代码实现641166{\exp_not:o{\l__ctex_ltj_font_options_clist}}{#2}1167\prop_gput:Nno\exp_not:N\g__ctex_ltj_family_name_prop{#1}1168{\exp_not:N\g__ctex_ltj_fontspec_family_tl}1169\__ctex_ltj_set_alternate_family:n{#1}1170\group_end:1171}1172}1173\tl_new:N\l__ctex_ltj_base_family_tl1174\tl_new:N\g__ctex_ltj_fontspec_family_tl1175\cs_new:Npn\__ctex_ltj_family_csname:n#1{ctex_ltj/family/#1}1176\cs_new_protected:Npn\__ctex_ltj_set_alternate_family:n#11177{1178\tl_set:Nn\l__ctex_ltj_base_CJKfamily_tl{#1}1179\tl_set_eq:NN\l__ctex_ltj_base_family_tl\g__ctex_ltj_fontspec_family_tl1180\cs_if_exist_use:c{\__ctex_ltj_alternate_cs:n{reset/#1}}1181\cs_if_exist_use:c{\__ctex_ltj_alternate_cs:n{#1}}1182}1183\cs_new:Npn\__ctex_ltj_alternate_cs:n#1{ctex_ltj/alternate_family/#1}\CJKfamily切换字体.
1184\NewDocumentCommand\CJKfamily{m}1185{\ctex_ltj_switch_family:x{#1}\tex_ignorespaces:D}1186\cs_new_protected:Npn\ctex_ltj_switch_family:n#11187{1188\ctex_ltj_family_if_exist:nNTF{#1}\CJK@family1189{1190\tl_set:Nn\l_ctex_ltj_family_tl{#1}1191\selectfont1192}1193{\__ctex_ltj_family_unknown_warning:n{#1}}1194}1195\tl_new:N\l_ctex_ltj_family_tl1196\cs_generate_variant:Nn\ctex_ltj_switch_family:n{x}\ctex_ltj_family_if_exist:nNTF判断CJK字体族#1是否存在,若存在则把实际族名保存到#2中.
1197\prg_new_protected_conditional:Npnn\ctex_ltj_family_if_exist:nN#1#2{T,F,TF}1198{1199\prop_get:NnNTF\g__ctex_ltj_family_name_prop{#1}#21200{\prg_return_true:}1201{1202\cs_if_exist_use:cTF{\__ctex_ltj_family_csname:n{#1}}1203{1204\tl_set_eq:NN#2\g__ctex_ltj_fontspec_family_tl1205\prg_return_true:1206}1207{\prg_return_false:}1208}1209}1210\prg_generate_conditional_variant:Nnn\ctex_ltj_family_if_exist:nN{x}{T,F,TF}1211\cs_new_protected:Npn\__ctex_ltj_family_unknown_warning:n#11212{1213\prop_if_empty:NF\g__ctex_ltj_family_font_name_prop1214{1215\seq_if_in:NnF\g__ctex_ltj_unknown_family_seq{#1}1216{1217\seq_gput_right:Nn\g__ctex_ltj_unknown_family_seq{#1}1218\msg_warning:nnn{ctex}{family-unknown}{#1}1219}1220}1221}1222\seq_new:N\g__ctex_ltj_unknown_family_seq1223\msg_new:nnn{ctex}{family-unknown}1224{1225Unknown~CJK~family~`\__ctex_ltj_msg_family_map:n{#1}'~is~being~ignored.
\\第14节代码实现651226Try~to~use~`\__ctex_ltj_msg_def_family_map:n{#1}'~to~define~it.
1227}1228\cs_new:Npn\__ctex_ltj_msg_def_family_map:n#11229{1230\str_case_e:nnF{#1}1231{1232\CJKrmdefault{\token_to_str:N\setCJKmainfont}1233\CJKsfdefault{\token_to_str:N\setCJKsansfont}1234\CJKttdefault{\token_to_str:N\setCJKmonofont}1235}1236{\token_to_str:N\setCJKfamilyfont\{#1\}}12371238}1239\cs_new:Npn\__ctex_ltj_msg_family_map:n#11240{1241\str_case_e:nnF{#1}1242{1243\CJKrmdefault{\token_to_str:N\CJKrmdefault}1244\CJKsfdefault{\token_to_str:N\CJKsfdefault}1245\CJKttdefault{\token_to_str:N\CJKttdefault}1246}1247{#1}1248}1249\cs_new_protected:Npn\ctex_ltj_fontspec:nn#1#21250{1251\prop_get:NnNTF\g__ctex_ltj_fontspec_prop1252{CJKfontspec/#1/#2/id}\l_ctex_ltj_family_tl1253{\ctex_ltj_switch_family:x{\l_ctex_ltj_family_tl}}1254{1255\int_gincr:N\g__ctex_ltj_family_int1256\__ctex_ltj_fontspec:enn1257{CJKfontspec(\int_use:N\g__ctex_ltj_family_int)}1258{#1}{#2}1259}1260}1261\cs_new_protected:Npn\ctex_ltj_fontspec:ee#1#21262{\use:e{\ctex_ltj_fontspec:nn{#1}{#2}}}1263\cs_new_protected:Npn\__ctex_ltj_fontspec:nnn#1#2#31264{1265\bool_if:NT\l__ctex_ltj_add_alternate_bool1266{1267\cs_if_free:cF1268{\__ctex_ltj_alternate_cs:n{reset/\l_ctex_ltj_family_tl}}1269{1270\cs_gset_eq:cc1271{\__ctex_ltj_alternate_cs:n{reset/#1}}1272{\__ctex_ltj_alternate_cs:n{reset/\l_ctex_ltj_family_tl}}1273\cs_gset_eq:cc1274{\__ctex_ltj_alternate_cs:n{clear/#1}}1275{\__ctex_ltj_alternate_cs:n{clear/\l_ctex_ltj_family_tl}}1276}1277\bool_set_false:N\l__ctex_ltj_add_alternate_bool1278}1279\prop_gput:Nnn\g__ctex_ltj_fontspec_prop{CJKfontspec/#2/#3/id}{#1}1280\ctex_ltj_set_family:nnn{#1}{#2}{#3}1281\ctex_ltj_switch_family:n{#1}1282}1283\cs_generate_variant:Nn\__ctex_ltj_fontspec:nnn{e}1284\prop_new:N\g__ctex_ltj_fontspec_prop1285\cs_new_protected:Npn\ctex_ltj_add_font_features:n#11286{\ctex_ltj_add_font_features:xn{\l_ctex_ltj_family_tl}{#1}}1287\cs_new_protected:Npn\ctex_ltj_add_font_features:nn#1#21288{1289\prop_get:NnNTF\g__ctex_ltj_family_font_name_prop1290{#1}\l__ctex_ltj_tmp_tl第14节代码实现661291{1292\prop_get:NnN\g__ctex_ltj_family_font_options_prop1293{#1}\l__ctex_ltj_font_options_clist1294\clist_put_right:Nn\l__ctex_ltj_font_options_clist{#2}1295\bool_set_true:N\l__ctex_ltj_add_alternate_bool1296\ctex_ltj_fontspec:ee1297{\exp_not:o{\l__ctex_ltj_font_options_clist}}1298{\exp_not:o{\l__ctex_ltj_tmp_tl}}1299}1300{\msg_warning:nn{ctex}{addCJKfontfeature-ignored}}1301}1302\bool_new:N\l__ctex_ltj_add_alternate_bool1303\cs_generate_variant:Nn\ctex_ltj_add_font_features:n{x}1304\cs_generate_variant:Nn\ctex_ltj_add_font_features:nn{x}1305\msg_new:nnn{ctex}{addCJKfontfeature-ignored}1306{1307\token_to_str:N\addCJKfontfeature(s)~ignored.
\\1308It~cannot~be~used~with~a~font~that~wasn't~selected~by~ctex.
1309}\__ctex_ltj_pass_args:nnnn为了支持字体属性可选项在前在后两种语法,给出两个辅助工具,自带展开功能.
1310\cs_new_protected:Npn\__ctex_ltj_pass_args:nnnn#1#2#3#41311{1312\tl_if_novalue:nTF{#2}1313{\__ctex_ltj_post_arg:w{#1}{#3}{#4}}1314{1315\use:e{#1{#2}{#3}}1316#41317}1318}1319\NewDocumentCommand\__ctex_ltj_post_arg:w{mmmO{}}1320{1321\use:e{#1{#4}{#2}}1322#31323}1324\NewDocumentCommand\setCJKfamilyfont{mom}1325{1326\__ctex_ltj_pass_args:nnnn1327{\ctex_ltj_set_family:nnn{#1}}{#2}{#3}1328{}1329}1330\NewDocumentCommand\newCJKfontfamily{omom}1331{1332\tl_set:Nx\l__ctex_ltj_tmp_tl1333{\tl_if_novalue:nTF{#1}{\cs_to_str:N#2}{#1}}1334\cs_new_protected:Npx#21335{\ctex_ltj_switch_family:n{\l__ctex_ltj_tmp_tl}}1336\__ctex_ltj_pass_args:nnnn1337{\ctex_ltj_set_family:nnn{\l__ctex_ltj_tmp_tl}}{#3}{#4}1338{}1339}1340\NewDocumentCommand\CJKfontspec{om}1341{1342\__ctex_ltj_pass_args:nnnn1343{\ctex_ltj_fontspec:nn}{#1}{#2}1344{\tex_ignorespaces:D}1345}1346\NewDocumentCommand\addCJKfontfeatures{m}1347{1348\ctex_ltj_add_font_features:x{#1}1349\tex_ignorespaces:D1350}1351\cs_new_eq:NN\addCJKfontfeature\addCJKfontfeatures1352\NewDocumentCommand\setCJKmainfont{om}第14节代码实现671353{1354\__ctex_ltj_pass_args:nnnn1355{\ctex_ltj_set_family:nnn{\CJKrmdefault}}{#1}{#2}1356{\normalfont}1357}1358\cs_new_eq:NN\setCJKromanfont\setCJKmainfont1359\NewDocumentCommand\setCJKsansfont{om}1360{1361\__ctex_ltj_pass_args:nnnn1362{\ctex_ltj_set_family:nnn{\CJKsfdefault}}{#1}{#2}1363{\normalfont}1364}1365\NewDocumentCommand\setCJKmonofont{om}1366{1367\__ctex_ltj_pass_args:nnnn1368{\ctex_ltj_set_family:nnn{\CJKttdefault}}{#1}{#2}1369{\normalfont}1370}1371\NewDocumentCommand\setCJKmathfont{om}1372{1373\__ctex_ltj_pass_args:nnnn1374{\ctex_ltj_set_family:nnn{\c__ctex_ltj_math_tl}}{#1}{#2}1375{}1376}1377\NewDocumentCommand\defaultCJKfontfeatures{m}1378{\clist_gset:Nn\g__ctex_ltj_default_features_clist{#1}}1379\clist_new:N\g__ctex_ltj_default_features_clist1380\@onlypreamble\setCJKmainfont1381\@onlypreamble\setCJKsansfont1382\@onlypreamble\setCJKmonofont1383\@onlypreamble\setCJKmathfont1384\@onlypreamble\setCJKromanfont1385\@onlypreamble\defaultCJKfontfeatures\ctex_ltj_ensure_default_family:在导言区结束确认\CJKfamilydefault确实存在.
1386\cs_new_protected:Npn\ctex_ltj_ensure_default_family:1387{1388\prop_if_empty:NF\g__ctex_ltj_family_font_name_prop1389{1390\ctex_ltj_family_if_exist:xNF{\CJKfamilydefault}\l__ctex_ltj_tmp_tl1391{1392\str_if_eq:eeTF{\CJKfamilydefault}{\CJKrmdefault}1393{\use:n}1394{1395\ctex_ltj_family_if_exist:xNTF{\CJKrmdefault}\l__ctex_ltj_tmp_tl1396{\tl_gset:Nn\CJKfamilydefault{\CJKrmdefault}\use_none:n}1397{\use:n}1398}1399{1400\prop_map_inline:Nn\g__ctex_ltj_family_font_name_prop1401{1402\prop_map_break:n1403{\tl_gset_rescan:Nnn\CJKfamilydefault{}{##1}}1404}1405}1406}1407\normalfont1408\ctex_ltj_update_mathfont:1409}1410}\ctex_ltj_update_mathfont:更新数学字体为实际的字体.
1411\cs_new_protected:Npn\ctex_ltj_update_mathfont:1412{第14节代码实现681413\ctex_ltj_family_if_exist:xNTF{\c__ctex_ltj_math_tl}\l__ctex_ltj_tmp_tl1414{\ctex_ltj_update_mathfont:n{\l__ctex_ltj_tmp_tl}}1415{1416\ctex_ltj_family_if_exist:xNT{\CJKfamilydefault}\l__ctex_ltj_tmp_tl1417{\ctex_ltj_update_mathfont:n{\l__ctex_ltj_tmp_tl}}1418}1419}1420\cs_new_protected:Npn\ctex_ltj_update_mathfont:n#11421{1422\tl_const:Nx\c__ctex_ltj_math_family_tl{#1}1423\DeclareSymbolFont{\c__ctex_ltj_math_tl}{\CJK@encoding}1424{\c__ctex_ltj_math_family_tl}{\mddefault}{\shapedefault}1425\cs_if_free:cTF1426{\CJK@encoding/\c__ctex_ltj_math_family_tl/\bfdefault/\shapedefault}1427{1428\SetSymbolFont{\c__ctex_ltj_math_tl}{bold}{\CJK@encoding}1429{\c__ctex_ltj_math_family_tl}{\mddefault}{\shapedefault}1430}1431{1432\SetSymbolFont{\c__ctex_ltj_math_tl}{bold}{\CJK@encoding}1433{\c__ctex_ltj_math_family_tl}{\bfdefault}{\shapedefault}1434}1435}14.
3.
4.
7替代字体的设置AlternateFontCharRange设置替代字体的选项.
1436\keys_define:nn{ctex_ltj/fontspec}1437{1438AlternateFont.
code:n=\ctex_ltj_set_alternate_prop:n{#1},1439AlternateFont.
value_required:n=true,1440CharRange.
clist_set:N=\l__ctex_ltj_char_range_clist,1441CharRange.
value_required:n=true1442}\ctex_ltj_set_alternate_prop:n保存替代字体序列.
1443\cs_new_protected:Npn\ctex_ltj_set_alternate_prop:n#11444{\clist_map_function:nN{#1}\__ctex_ltj_push_alternate_prop:n}1445\cs_new_protected:Npn\__ctex_ltj_push_alternate_prop:n#11446{1447\clist_set:Nx\l__ctex_ltj_tmp_clist{\tl_head:n{#1}}1448\tl_remove_all:Nn\l__ctex_ltj_tmp_clist{~}1449\exp_args:No\__ctex_ltj_push_alternate_prop:nn1450{\l__ctex_ltj_tmp_clist}{#1}1451}1452\cs_new_protected:Npn\__ctex_ltj_push_alternate_prop:nn#11453{1454\prop_remove:Nn\l__ctex_ltj_alternate_prop{#1}1455\prop_put:Nnn\l__ctex_ltj_alternate_prop{#1}1456}1457\clist_new:N\l__ctex_ltj_tmp_clist1458\prop_new:N\l__ctex_ltj_alternate_prop\ctex_ltj_set_alternate_family:nnF如果在字体的选项中设置了CharRange,则只设置替代字体.
1459\cs_new_protected:Npn\ctex_ltj_set_alternate_family:nnF1460{1461\clist_if_empty:NTF\l__ctex_ltj_char_range_clist1462{\__ctex_ltj_set_family_aux:nnn}1463{\__ctex_ltj_set_alternate_family_aux:nnn}1464}1465\cs_new_protected:Npn\__ctex_ltj_set_family_aux:nnn#1#2#31466{1467\__ctex_ltj_check_family:n{#1}第14节代码实现691468\prop_if_empty:NF\l__ctex_ltj_alternate_prop1469{\ctex_ltj_save_alternate_seq:cn{\__ctex_ltj_alternate_cs:n{#1}}{#2}}1470#31471}1472\cs_new_protected:Npn\__ctex_ltj_set_alternate_family_aux:nnn#1#2#31473{\ctex_ltj_set_alternate_family:nn{#1}{#2}}\ctex_ltj_save_alternate_seq:Nn保存由AlternateFont设置的替代字体序列.
1474\cs_new_protected:Npn\ctex_ltj_save_alternate_seq:Nn#1#21475{1476\prop_map_inline:Nn\l__ctex_ltj_alternate_prop1477{\__ctex_ltj_save_alternate_auxi:w##2{}\q_mark#1{#2}}1478}1479\cs_new_protected:Npn\__ctex_ltj_save_alternate_auxi:w#1#2#1480{1481\tl_if_blank:nTF{#2}1482{\__ctex_ltj_save_alternate_auxii:w{#1}}1483{\__ctex_ltj_save_alternate_auxii:w{#1}{#2}}1484}1485\cs_new_protected:Npn\__ctex_ltj_save_alternate_auxii:w#1#2#3#4\q_mark#5#61486{1487\clist_set:Nn\l__ctex_ltj_char_range_clist{#1}1488\clist_set:Nn\l__ctex_ltj_alternate_options_clist{#3}1489\__ctex_ltj_use_global_options:N\l__ctex_ltj_alternate_options_clist1490\tl_if_blank:nTF{#2}1491{\tl_set:Nn\l__ctex_ltj_tmp_tl{#6}}1492{1493\tl_set:Nx\l__ctex_ltj_tmp_tl{\tl_trim_spaces:n{#2}}1494\tl_replace_all:Nnn\l__ctex_ltj_tmp_tl{*}{#6}1495}1496\use:e1497{1498\ctex_ltj_save_alternate_family:Nnnn\exp_not:N#51499{\exp_not:o{\l__ctex_ltj_char_range_clist}}1500{\exp_not:o{\l__ctex_ltj_alternate_options_clist}}1501{\exp_not:o{\l__ctex_ltj_tmp_tl}}1502}1503}1504\clist_new:N\l__ctex_ltj_alternate_options_clist1505\cs_generate_variant:Nn\ctex_ltj_save_alternate_seq:Nn{c}\ctex_ltj_set_alternate_family:nn设置选项CharRange范围内的替代字体.
如果已经定义了主字体,我们也马上定义替代字体,否则只保存起来备用.
1506\cs_new_protected:Npn\ctex_ltj_set_alternate_family:nn#1#21507{1508\__ctex_ltj_update_family_uid:N\l__ctex_ltj_font_options_clist1509\__ctex_ltj_use_global_options:N\l__ctex_ltj_font_options_clist1510\ctex_ltj_set_alternate_family:coonn1511{\__ctex_ltj_alternate_cs:n{#1}}1512{\l__ctex_ltj_char_range_clist}1513{\l__ctex_ltj_font_options_clist}{#2}{#1}1514}1515\cs_new_protected:Npn\ctex_ltj_set_alternate_family:Nnnnn#1#2#3#4#51516{1517\prop_get:NnNT\g__ctex_ltj_family_name_prop{#5}\l__ctex_ltj_base_family_tl1518{\ctex_ltj_set_alternate_family:nnn{#2}{#3}{#4}}1519\ctex_ltj_save_alternate_family:Nnnn#1{#2}{#3}{#4}1520}1521\cs_generate_variant:Nn\ctex_ltj_set_alternate_family:Nnnnn{coo}\ctex_ltj_save_alternate_family:Nnnn保存替代字体序列的定义,以备定义主字体时使用.
1522\cs_new_protected:Npn\ctex_ltj_save_alternate_family:Nnnn#1#2#3#41523{第14节代码实现701524\cs_if_exist:NF#1{\cs_set_eq:NN#1\prg_do_nothing:}1525\cs_gset_protected:Npx#11526{\exp_not:o{#1\ctex_ltj_set_alternate_family:nnn{#2}{#3}{#4}}}1527}\ctex_ltj_set_alternate_family:nnn实际定义替代字体族.
1528\cs_new_protected:Npn\ctex_ltj_set_alternate_family:nnn#1#2#31529{1530\group_begin:1531\cs_set_eq:NN\CJKfamily\use_none:n1532\ctex_ltj_swap_cs:NN1533\DeclareFontShape@\ctex_ltj_declare_alternate_shape:nnnnnn1534\tl_set:Nn\l__ctex_ltj_char_range_clist{#1}1535\fontspec_set_family:Nnn\l__ctex_ltj_alternate_family_tl{#2}{#3}1536\group_end:1537}1538\tl_new:N\l__ctex_ltj_alternate_family_tl\ctex_ltj_swap_cs:NN交换两个控制序列的意义.
1539\cs_new_protected:Npn\ctex_ltj_swap_cs:NN#1#21540{1541\cs_set_eq:NN\__ctex_ltj_tmp:w#11542\cs_set_eq:NN#1#21543\cs_set_eq:NN#2\__ctex_ltj_tmp:w1544\cs_undefine:N\__ctex_ltj_tmp:w1545}LTJFONTUID\__ctex_ltj_update_family_uid:Nfontspec在一个字体族的选项和字体名称相同的时候,就不定义新字体.
为了避免混淆替代字体的设置,我们新定义一个虚拟的选项LTJFONTUID,确保fontspec对CJK字体族总是定义新字体.
1546\keys_define:nn{fontspec}{LTJFONTUID.
code:n=}1547\cs_new_protected:Npn\__ctex_ltj_update_family_uid:N#11548{1549\int_gincr:N\g__ctex_ltj_family_int1550\clist_put_right:Nx#1{LTJFONTUID=\int_use:N\g__ctex_ltj_family_int}1551}1552\int_new:N\g__ctex_ltj_family_int\ctex_ltj_declare_alternate_shape:nnnnnn在定义替代字体的字形时,通过字符范围与主字体的对应字形关联起来.
\DeclareFontShape@一个有六个参数,我们只需要使用它的第三个参数series和第四个参数shape.
1553\cs_new_protected:Npn\ctex_ltj_declare_alternate_shape:nnnnnn#1#2#3#4#5#61554{1555\ctex_ltj_declare_alternate_shape:nnnnnn{#1}{#2}{#3}{#4}{#5}{#6}1556\ctex_ltj_set_alternate_shape:Nnnnnnn\l__ctex_ltj_char_range_clist1557{\l__ctex_ltj_base_family_tl}{#3}{#4}{#2}{#3}{#4}1558}\ctex_ltj_set_alternate_shape:Nnnnnnn与LuaTeX-ja的\DeclareAlternateKanjiFont的功能类似,区别是固定编码为\CJK@encoding.
这个设置总是全局的.
1559\cs_new_protected:Npn\ctex_ltj_set_alternate_shape:Nnnnnnn#1#2#3#4#5#6#71560{1561\clist_map_inline:Nn#11562{1563\prop_get:NnNTF\g__ctex_ltj_char_range_prop{##1}\l__ctex_ltj_char_range_tl1564{1565\ctex_ltj_set_alternate_shape:nnN{#2/#3/#4}{#5/#6/#7}1566\l__ctex_ltj_char_range_tl1567}1568{\ctex_ltj_set_alternate_shape:nnn{#2/#3/#4}{#5/#6/#7}{##1}}1569}第14节代码实现711570\__ctex_ltj_save_alternate_shape:cn1571{\__ctex_ltj_alternate_cs:n{clear/\l__ctex_ltj_base_CJKfamily_tl}}1572{\ctex_ltj_clear_alt_font:n{\CJK@encoding/#2/#3/#4}}1573}\ctex_ltj_set_alternate_shape:nnn我们使用->而不是像LuaTeX-ja一样使用-作为区间的分隔符.
LuaTeX-ja支持使用负数来引用由JFM设置的字符类.
如果使用-作为分隔符,那么负数单独使用时,就需要把它放在两层花括号之内(例如{{-1}}),或者使用类似{-1}-{-1}的形式才不会解释错误.
1574\NewDocumentCommand\ctex_ltj_set_alternate_shape:nnn1575{mm>{\SplitArgument{1m}1576{\ctex_ltj_set_alternate_shape:nnnn{#1}{#2}#3}1577\cs_new_protected:Npn\ctex_ltj_set_alternate_shape:nnnn#1#2#3#41578{1579\ctex_ltj_set_alternate_shape:e1580{1581\__ctex_ltj_range_normalization:nn{#3}{#4}1582{\CJK@encoding/\exp_not:n{#2}}1583{\CJK@encoding/\exp_not:n{#1}}1584}1585}1586\cs_new_protected:Npn\ctex_ltj_set_alternate_shape:n#11587{1588\ctex_ltj_set_alt_font:nnnn#11589\__ctex_ltj_save_alternate_shape:cn1590{\__ctex_ltj_alternate_cs:n{reset/\l__ctex_ltj_base_CJKfamily_tl}}1591{\ctex_ltj_set_alt_font:nnnn#1}1592}1593\cs_generate_variant:Nn\ctex_ltj_set_alternate_shape:n{e}\ctex_ltj_set_alternate_shape:nnN若字符范围预先由declarecharrange声明,则可以直接使用.
1594\cs_new_protected:Npn\ctex_ltj_set_alternate_shape:nnN#1#2#31595{1596\tl_map_inline:Nn#31597{1598\ctex_ltj_set_alternate_shape:n1599{1600##11601{\CJK@encoding/#2}1602{\CJK@encoding/#1}1603}1604}1605}\__ctex_ltj_save_alternate_shape:Nn将实际设置的替换字形保存起来用于清除或恢复.
暂时令\l__ctex_ltj_base_family_tl为\scan_stop:是让它不被展开,使得替换字体的设置可以在\addCJKfontfeature中直接使用.
1606\cs_new_protected:Npn\__ctex_ltj_save_alternate_shape:Nn#1#21607{1608\group_begin:1609\cs_if_exist:NF#1{\cs_set_eq:NN#1\prg_do_nothing:}1610\cs_set_eq:NN\l__ctex_ltj_base_family_tl\scan_stop:1611\cs_gset_protected:Npx#1{\exp_not:o{#1}#2}1612\group_end:1613}1614\cs_generate_variant:Nn\__ctex_ltj_save_alternate_shape:Nn{c}clearalternatefontresetalternatefont清除和重置操作总是全局的.
1615\ctex_define:n1616{1617clearalternatefont.
code:n=1618{\clist_map_function:eN{#1}\ctex_ltj_clear_alternate_font:n},第14节代码实现721619resetalternatefont.
code:n=1620{\clist_map_function:eN{#1}\ctex_ltj_reset_alternate_font:n},1621clearalternatefont.
default:n=\l_ctex_ltj_family_tl,1622resetalternatefont.
default:n=\l_ctex_ltj_family_tl1623}1624\cs_new_protected:Npn\ctex_ltj_clear_alternate_font:n#11625{1626\group_begin:1627\ctex_ltj_family_if_exist:xNTF{#1}\l__ctex_ltj_base_family_tl1628{1629\cs_if_exist_use:cT1630{\__ctex_ltj_alternate_cs:n{clear/#1}}1631{1632\prop_gput:Nno\g__ctex_ltj_reset_alternate_prop1633{#1}{\l__ctex_ltj_base_family_tl}1634\tl_set_eq:NN\CJK@family\l__ctex_ltj_base_family_tl1635\selectfont1636}1637}1638{\__ctex_ltj_family_unknown_warning:n{#1}}1639\group_end:1640}1641\cs_new_protected:Npn\ctex_ltj_reset_alternate_font:n#11642{1643\group_begin:1644\prop_gpop:NnNT\g__ctex_ltj_reset_alternate_prop{#1}\CJK@family1645{1646\tl_set_eq:NN\l__ctex_ltj_base_family_tl\CJK@family1647\use:c{\__ctex_ltj_alternate_cs:n{reset/#1}}1648\selectfont1649}1650\group_end:1651}1652\prop_new:N\g__ctex_ltj_reset_alternate_prop1653\cs_generate_variant:Nn\clist_map_function:nN{e}declarecharrange预先声明字符范围.
1654\ctex_define:n1655{1656declarecharrange.
code:n=\ctex_ltj_declare_char_range:e{#1},1657declarecharrange.
value_required:n=true1658}1659\cs_new_protected:Npn\ctex_ltj_declare_char_range:n#11660{\clist_map_inline:nn{#1}{\__ctex_ltj_declare_char_range:nn##1}}1661\cs_generate_variant:Nn\ctex_ltj_declare_char_range:n{e}1662\cs_new_protected:Npn\__ctex_ltj_declare_char_range:nn#11663{\tl_trim_spaces_apply:nN{#1}\ctex_ltj_declare_char_range:nn}\ctex_ltj_declare_char_range:nn\g__ctex_ltj_char_range_prop#1是名字,#2是范围.
1664\cs_new_protected:Npn\ctex_ltj_declare_char_range:nn#1#21665{1666\tl_clear:N\l__ctex_ltj_char_range_tl1667\clist_map_function:nN{#2}\ctex_ltj_save_char_range:n1668\prop_gput:Nno\g__ctex_ltj_char_range_prop{#1}{\l__ctex_ltj_char_range_tl}1669\ctex_ltj_def_char_range_key:n{#1}1670\tl_clear:N\l__ctex_ltj_char_range_tl1671}1672\tl_new:N\l__ctex_ltj_char_range_tl1673\prop_new:N\g__ctex_ltj_char_range_prop\ctex_ltj_save_char_range:n预先解释字符区间的意义.
1674\NewDocumentCommand\ctex_ltj_save_char_range:n1675{>{\SplitArgument{1m}1676{\ctex_ltj_save_char_range:nn#1}第14节代码实现731677\cs_new_protected:Npn\ctex_ltj_save_char_range:nn#1#21678{1679\tl_put_right:Nx\l__ctex_ltj_char_range_tl1680{{\__ctex_ltj_range_normalization:nn{#1}{#2}}}1681}1682\cs_new:Npn\__ctex_ltj_range_normalization:nn#1#21683{1684\tl_if_novalue:nTF{#2}1685{1686{\int_eval:n{#1}}1687{\int_eval:n{#1}}1688}1689{1690{\int_eval:n{\tl_if_blank:nTF{#1}{\c__ctex_ltj_range_min_int}{#1}}}1691{\int_eval:n{\tl_if_blank:nTF{#2}{\c__ctex_ltj_range_max_int}{#2}}}1692}1693}1694\int_const:Nn\c__ctex_ltj_range_min_int{"80}1695\int_const:Nn\c__ctex_ltj_range_max_int{\c_max_char_int}\ctex_ltj_def_char_range_key:n在字体设置选项中定义字符范围键.
1696\cs_new_protected:Npn\ctex_ltj_def_char_range_key:n#11697{1698\keys_if_exist:nnF{ctex_ltj/fontspec}{#1}1699{1700\keys_define:nn{ctex_ltj/fontspec}1701{#1.
code:n=\ctex_ltj_char_range_key:nn{#1}{##1}}1702}1703}\ctex_ltj_char_range_key:nn如果字符范围键没有值,则只设置的这个字符范围内的替代字体.
1704\cs_new_protected:Npn\ctex_ltj_char_range_key:nn#1#21705{1706\tl_if_blank:nTF{#2}1707{\clist_set:Nn\l__ctex_ltj_char_range_clist{#1}}1708{\__ctex_ltj_push_alternate_prop:nn{#1}{{#1}#2}}1709}14.
3.
4.
8其他设置在抄录环境中禁用autospacing和autoxspacing.
然而,LuaTeX-ja还是会使JAchar自动折行.
没有看到有简单的禁用折行的办法,可能需要设置所有的JAchar的prebreakpenalty或postbreakpenalty为10000:\directlua{luatexja.
isglobal=tex.
globaldefs>0and"global"or""fori=0x80,0x10FFFFdoifluatexja.
charrange.
jcr_table_main[i]>0andluatexja.
charrange.
jcr_table_main[i]~#2-h}{}1752\DeclareFontShape{JT2}{#1}{m}{n}{~#2-v}{}1753\tl_if_empty:nF{#3}第14节代码实现751754{1755\DeclareFontShape{JY2}{#1}{b}{n}{~#3-h}{}1756\DeclareFontShape{JT2}{#1}{b}{n}{~#3-v}{}1757\DeclareFontShape{JY2}{#1}{bx}{n}{~#3-h}{}1758\DeclareFontShape{JT2}{#1}{bx}{n}{~#3-v}{}1759}1760}\ctex_set_upmap:nnn设置upTEX字体映射.
#1是形如upserif的PSTFM字体名,不带表示粗体的后缀b与表示排版方向的后缀-h与-v.
#2与#3是普通与粗体的实际字体名.
1761\cs_new_protected:Npn\ctex_set_upmap:nnn#1#2#31762{1763\ctex_set_zhmap:n1764{1765\special{pdf:mapline~#1-h~UniGB-UTF16-H~#2}1766\special{pdf:mapline~#1-v~UniGB-UTF16-V~#2}1767\tl_if_empty:nF{#3}1768{1769\special{pdf:mapline~#1b-h~UniGB-UTF16-H~#3}1770\special{pdf:mapline~#1b-v~UniGB-UTF16-V~#3}1771}1772}1773}\ctex_set_upmap_unicode:nnn设置upTEX字体映射,使用unicodeCMap.
参数同上.
1774\cs_new_protected:Npn\ctex_set_upmap_unicode:nnn#1#2#31775{1776\ctex_set_zhmap:n1777{1778\special{pdf:mapline~#1-h~unicode~#2}1779\special{pdf:mapline~#1-v~unicode~#2}1780\tl_if_empty:nF{#3}1781{1782\special{pdf:mapline~#1b-h~unicode~#3}1783\special{pdf:mapline~#1b-v~unicode~#3}1784}1785}1786}\ctex_set_upfonts:nnnnnn设置upTEX基本字体映射,按zhmetrics-uptex的定义,依次设置衬线体正、粗、意大利,无衬线体正、粗,等宽体正——共6种字体,并分横排及直排.
1787\cs_new_protected:Npn\ctex_set_upfonts:nnnnnn#1#2#3#4#5#61788{1789\ctex_set_upmap:nnn{upserif}{#1}{#2}1790\ctex_set_upmap:nnn{upserifit}{#3}{}1791\ctex_set_upmap:nnn{upsans}{#4}{#5}1792\ctex_set_upmap:nnn{upmono}{#6}{}1793}以下命令只能在导言区使用.
1794\@onlypreamble\ctex_set_upfamily:nnn1795\@onlypreamble\ctex_set_upmap:nnn1796\@onlypreamble\ctex_set_upmap_unicode:nnn1797\@onlypreamble\ctex_set_upfonts:nnnnnneverysel宏包(2011/10/28)未考虑upLATEX对\selectfont的修改,需要引入pxevery-sel宏包.
1798\RequirePackage{pxeverysel}1799/uptex|aptex第14节代码实现7614.
3.
6修改主要字体命令修改\rmfamily等主要字体命令,使得中文字体能随西文主要字体更新.
LATEX2020-02-02以后的版本可以直接使用\@rmfamilyhook等钩子.
我们暂时需要处理旧内核的情况,以保持兼容性.
xeCJK和zhmCJK已经有相同的工作,本段代码不需要对他们使用.
1800*pdftex|luatex|uptex|aptex1801pdftex\reverse_if:N\if_bool:N\g__ctex_zhmCJK_bool\ctex_provide_font_hook:NNN\CTEX@rmfamilyhook给\rmfamily等字体命令加钩子,钩子名字统一为\CTEX@rmfamilyhook等.
1802\cs_new_protected:Npn\ctex_provide_font_hook:NNN#1#21803{1804\exp_args:Nc\__ctex_provide_font_hook_aux:NNNN1805{CTEX\cs_to_str:N#2}#1#21806}1807\cs_if_exist:NTF\ctex_gadd_ltxhook:nn1808{1809\cs_new_protected:Npn\__ctex_provide_font_hook_aux:NNNN#1#2#3#41810{1811\tl_new:N#11812\exp_args:Nx\ctex_gadd_ltxhook:nn{\cs_to_str:N#2}{#1}1813}1814}1815{1816\cs_new_protected:Npn\__ctex_provide_font_hook_aux:NNNN#1#2#3#41817{1818\tl_new:N#11819\cs_if_exist:NTF#31820{\tl_gput_right:Nn#3{#1}}注意此处不能用\ctex_patch_cmd:Nnn来打补丁,因其会关闭LATEX3语法,但fontspec会在\rmfamily的命令中相应加入\l__fontspec_rmfamily_encoding_tl等,导致补丁失败.
1821{\ctex_parse_name:NN\tl_replace_once:Nnn#2{#4}{#1#4}}1822}1823}1824\ctex_provide_font_hook:NNN\rmfamily\@rmfamilyhook\selectfont1825\ctex_provide_font_hook:NNN\sffamily\@sffamilyhook\selectfont1826\ctex_provide_font_hook:NNN\ttfamily\@ttfamilyhook\selectfont1827pdftex|luatex\ctex_provide_font_hook:NNN\normalfont\@defaultfamilyhook\usefont按CJK的命名习惯模拟部分命令,并设置默认字体.
1828\tl_if_exist:NF\CJKfamilydefault1829{\tl_const:Nn\CJKfamilydefault{\CJKrmdefault}}1830*pdftex|luatex1831\tl_if_exist:NF\CJKrmdefault{\tl_const:Nn\CJKrmdefault{rm}}1832\tl_if_exist:NF\CJKsfdefault{\tl_const:Nn\CJKsfdefault{sf}}1833\tl_if_exist:NF\CJKttdefault{\tl_const:Nn\CJKttdefault{tt}}1834\tl_gput_right:Nn\CTEX@rmfamilyhook{\CJKfamily{\CJKrmdefault}}1835\tl_gput_right:Nn\CTEX@sffamilyhook{\CJKfamily{\CJKsfdefault}}1836\tl_gput_right:Nn\CTEX@ttfamilyhook{\CJKfamily{\CJKttdefault}}1837\tl_gput_right:Nn\CTEX@defaultfamilyhook{\CJKfamily{\CJKfamilydefault}}1838/pdftex|luatexupLATEX不需要补丁\normalfont,只需要修改\kanjifamilydefault.
1839*uptex|aptex1840\tl_if_exist:NF\CJKrmdefault{\tl_const:Nn\CJKrmdefault{zhrm}}1841\tl_if_exist:NF\CJKsfdefault{\tl_const:Nn\CJKsfdefault{zhsf}}1842\tl_if_exist:NF\CJKttdefault{\tl_const:Nn\CJKttdefault{zhtt}}1843\tl_gput_right:Nn\CTEX@rmfamilyhook{\kanjifamily{\CJKrmdefault}}第14节代码实现771844\tl_gput_right:Nn\CTEX@sffamilyhook{\kanjifamily{\CJKsfdefault}}1845\tl_gput_right:Nn\CTEX@ttfamilyhook{\kanjifamily{\CJKttdefault}}1846\tl_gset:Nn\kanjifamilydefault{\CJKfamilydefault}1847/uptex|aptexzhmCJK判断结束.
1848pdftex\fi:使修改立刻生效,保证导言区字体族正确.
1849\normalfont在导言区末尾更新\CJKfamilydefault,pdfTEX已经在之前使用过此处代码.
1850!
pdftex\ctex_at_end_preamble:n{\ctex_update_default_family:}\ctex_update_default_family:在导言区结束,如果\CJKfamilydefault没有被更改,则在此时根据西文字体的情况更新\CJKfamilydefault.
xeCJK已经有这个功能,不需要再调整.
1851\cs_new_protected:Npn\ctex_update_default_family:1852{1853\tl_if_eq:NNT\CJKfamilydefault\l__ctex_family_default_init_tl1854{1855\group_begin:1856\cs_set_eq:NN\__ctex_family_default_wrap:n\exp_not:n1857\tl_gset:Nx\CJKfamilydefault1858{1859\str_case:onF{\familydefault}1860{1861{\rmdefault}{\exp_not:N\CJKrmdefault}1862{\sfdefault}{\exp_not:N\CJKsfdefault}1863{\ttdefault}{\exp_not:N\CJKttdefault}1864}1865{\CJKfamilydefault}1866}1867\group_end:1868}使用LuaLATEX时,自动调整得到的\CJKfamilydefault可能没有定义,需要确认它的存在性.
使用CJK宏包或upLATEX时,C19rm、JY2rm等总是有定义的,不需要确认.
1869luatex\ctex_ltj_ensure_default_family:1870}\l__ctex_family_default_init_tl往\CJKfamilydefault中加入标志,用于判断它是否被更改.
1871\tl_new:N\l__ctex_family_default_init_tl1872\cs_new_eq:NN\__ctex_family_default_wrap:n\use:n1873\tl_set:Nx\l__ctex_family_default_init_tl1874{1875\exp_not:N\__ctex_family_default_wrap:n1876{\exp_not:o{\CJKfamilydefault}}1877}1878\tl_gset_eq:NN\CJKfamilydefault\l__ctex_family_default_init_tl1879/pdftex|luatex|uptex|aptex14.
3.
7hyperref兼容性处理现在处理各个引擎下的PDF中文书签问题.
根据编译引擎与文件编码的不同,ctex向hyperref传递适当的参数,完成中文书签的正确设置.
用户仍需要自己载入hyperref宏包.
第14节代码实现78\ctex_hypersetup:n如果已经载入hyperref宏包,则直接使用其定义设置选项;否则\ctex_hypersetup:n的效果与\PassOptionsToPackage一致,只传递宏包参数.
如果用户不载入hyperref宏包,相关参数即被丢弃.
1880*class|ctex1881\@ifpackageloaded{hyperref}1882{1883\cs_new_protected:Npn\ctex_hypersetup:n#11884{\hypersetup{#1}}1885}1886{1887\cs_new_protected:Npn\ctex_hypersetup:n#11888{\PassOptionsToPackage{#1}{hyperref}}1889}1890/class|ctex在pdfTEX下使用GBK编码,DVIPDFM驱动可以直接用它的\special命令,其他模式用xCJK2uni宏包处理.
使用UTF-8编码时,CJKutf8已经处理了书签问题,但仍需要设置pdfencoding为unicode,目的是在书签的开头写入BOM(\376\377),提示这是UTF-16BE字节流.
1891*pdftex1892\ctex_hypersetup:n{driverfallback=dvipdfmx}1893\str_if_eq:onTF{\g__ctex_encoding_tl}{GBK}1894{1895\ctex_hypersetup:n{CJKbookmarks=true}1896\sys_if_output_pdf:TF1897{\ctex_at_end_package:nn{hyperref}{\RequirePackage{xCJK2uni}}}1898{1899\ctex_at_end_package:nn{hyperref}1900{1901\str_if_eq:onTF{\Hy@driver}{hdvipdfm}1902{1903\AtBeginShipoutFirst1904{\special{pdf:tounicode~GBK-EUC-UCS2}}1905}1906{\RequirePackage{xCJK2uni}}1907}1908}1909}1910{\ctex_hypersetup:n{pdfencoding=unicode}}1911/pdftexXTEX和LuaTEX统一设置pdfencoding为unicode.
1912*xetex|luatex1913\ctex_hypersetup:n{pdfencoding=unicode}1914/xetex|luatex我们假定upTEX使用DVIPDFM驱动输出,于是使用与pdfTEX类似的设置.
注意upTEX需要使用UTF8-UTF16的编码转换.
1915*uptex|aptex1916\ctex_hypersetup:n{driverfallback=dvipdfmx}1917\ctex_at_end_package:nn{hyperref}1918{\AtBeginShipoutFirst{\special{pdf:tounicode~UTF8-UTF16}}}1919/uptex|aptex1920*pdftex|xetex|luatex|uptex|aptex第14节代码实现7914.
3.
8CJKfntef、xeCJKfntef相关设置对pdfTEX与XTEX引擎,分别在CJKfntef、xeCJKfntef宏包的末尾关闭彩色显式等多余格式.
1921*pdftex1922\ctex_at_end_package:nn{CJKfntef}1923{1924\normalem1925\cs_new_protected:Npn\__ctex_clear_fntef_color:n#11926{\tl_clear:c{CJK#1color}}1927/pdftex1928*xetex1929\ctex_at_end_package:nn{xeCJKfntef}1930{1931\@ifpackagelater{xeCJKfntef}{2014/11/04}1932{1933\cs_new_protected:Npn\__ctex_clear_fntef_color:n#11934{\xeCJKsetup{#1/format1935}1936{1937\cs_new_protected:Npn\__ctex_clear_fntef_color:n#11938{\tl_clear:c{CJK#1color}}1939}1940/xetex1941*pdftex|xetex1942\clist_map_inline:nn1943{underdot,underline,underdblline,underwave,sout,xout}1944{\__ctex_clear_fntef_color:n{#1}}1945}1946/pdftex|xetex14.
3.
9\ccwd的更新1947\cs_new_protected:Npn\ctex_update_ccwd:1948*pdftex|xetex1949{1950\hbox_set:Nn\l__ctex_tmp_box{\CJKglue}1951\dim_set:Nn\ccwd{\box_wd:N\l__ctex_tmp_box+\f@size\p@}1952}1953/pdftex|xetex1954*luatex1955{\skip_set:Nn\ccwd{\ltjgetparameter{kanjiskip}+\zw}}1956/luatex1957*uptex|aptex1958{\skip_set:Nn\ccwd{1zw+\tex_kanjiskip:D}}1959/uptex|aptex1960\dim_new:N\ccwd\ctex_update_ccglue:更新字间距.
1961\cs_new_protected:Npn\ctex_update_ccglue:1962*pdftex|xetex1963{1964\cs_set_protected:Npn\CJKglue1965{\skip_horizontal:N\l__ctex_ccglue_skip}1966}1967/pdftex|xetex1968*luatex1969{\ctex_ltj_set_kanjiskip:N\l__ctex_ccglue_skip}1970/luatex1971*uptex|aptex1972{\skip_set_eq:NN\tex_kanjiskip:D\l__ctex_ccglue_skip}1973/uptex|aptex1974\skip_new:N\l__ctex_ccglue_skip第14节代码实现80\ctex_if_ccglue_touched_p:\ctex_if_ccglue_touched:TF检查用户是否修改过汉字间距.
1975\prg_new_conditional:Npnn\ctex_if_ccglue_touched:{TF}1976{1977*pdftex|xetex1978\if_meaning:w\CJKglue\__ctex_ccglue:1979\prg_return_false:\else:\prg_return_true:\fi:1980/pdftex|xetex1981*luatex1982\skip_if_eq:nnTF{\l__ctex_ccglue_skip}{\ltjgetparameter{kanjiskip}}1983{\prg_return_false:}{\prg_return_true:}1984/luatex1985*uptex|aptex1986\skip_if_eq:nnTF{\l__ctex_ccglue_skip}{\tex_kanjiskip:D}1987{\prg_return_false:}{\prg_return_true:}1988/uptex|aptex1989}1990pdftex|xetex\ctex_at_end:n{\cs_new_eq:NN\__ctex_ccglue:\CJKglue}\ctex_update_em_unit:将当前汉字的宽度保存到\ccwd中备用.
不采用1em,因为这时的1em实际上来自西文字体的信息,未必等于汉字的宽度,这似乎在传统的.
tfm字体上表现更明显.
在pdfTEX和XTEX下,直接使用\f@size\p@作为汉字的宽度,这应该对大多数汉字字体都成立,但不适用于诸如"方正兰亭黑长"之类的特殊字体.
在XTEX可以用\fontcharwd来改进.
而在pdfTEX下,若使用zhmetrics技术,所有的汉字共享同一个.
tfm,\fontcharwd也就没有意义.
在LuaTEX下,LuaTeX-ja总是按照JFM中的设置输出汉字的宽度,可以直接用\zw作为汉字宽度.
upTEX可以直接使用原生的长度单位zw.
1991\cs_new_protected:Npn\ctex_update_em_unit:1992pdftex|xetex{\dim_set:Nn\ccwd{\f@size\p@}}1993luatex{\dim_set:Nn\ccwd{\zw}}1994uptex|aptex{\dim_set:Nn\ccwd{1zw}}14.
3.
10其他\ctex_add_to_selectfont:n\CTEX@selectfont@hook\EverySelectfont直到文档开始时才有效.
为了\ccwd和LuaTeX-ja的字体设置在导言区也可用,我们还需要在这里手工修改\selectfont.
everysel宏包会用\CheckCommand来检查\selectfont是否为标准定义.
我们修改了\selectfont,所以会给出一个警告.
为了消除这个警告,在它检查之前,还原本来定义.
pxeverysel宏包取消了检查,但也需要恢复定义,避免重复使用钩子.
KOMA-Script宏包也会进行检查,我们需要小心处理.
1995\cs_new_protected:Npn\ctex_add_to_selectfont:n#11996{1997\cs_set_protected:Npx\CTEX@selectfont@hook1998{\exp_not:o{\CTEX@selectfont@hook#1}}1999}2000\cs_new_eq:NN\CTEX@selectfont@hook\prg_do_nothing:2001\if_cs_exist:N\@EverySelectfont@Init2002\group_begin:2003\cs_set:Npn\__ctex_tmp:N#12004{2005\tl_set:Nn\l__ctex_tmp_tl{#1}2006\cs_new_eq:NN\CTEX@selectfont@save#12007\cs_new_protected:Npn\__ctex_restore_selectfont:2008{2009\cs_if_free:NF\scr@new@selectfont2010{CJK直接修改\selectfont和pxeverysel的补丁,会使KOMA-Script的\par@update失效.
2011*pdftex|uptex|aptex2012\cs_if_free:NF\par@update第14节代码实现812013*uptex|aptex2014{2015\tl_put_right:Nn\@EverySelectfont@Init2016{\tl_put_right:Nn#1{\par@update}}2017}2018/uptex|aptex2019*pdftex2020{\tl_put_right:Nn#1{\par@update}}2021\cs_set_eq:NN\scr@selectfont\CTEX@selectfont@save2022/pdftex2023/pdftex|uptex|aptex2024\cs_set_eq:NN\scr@new@selectfont#12025!
pdftex\cs_set_eq:NN\CTEX@selectfont@save\scr@selectfont2026}2027\tl_put_left:Nn\@EverySelectfont@Init2028{\cs_set_eq:NN#1\CTEX@selectfont@save}2029\cs_undefine:N\__ctex_restore_selectfont:2030}2031}2032\ctex_parse_name:NN\__ctex_tmp:N\selectfont2033\exp_last_unbraced:NNo\group_end:2034\ctex_patch_cmd_once:NnnnTF{\l__ctex_tmp_tl}2035{\ExplSyntaxOff}2036{\size@update}2037{\CTEX@selectfont@hook\size@update}2038{\__ctex_restore_selectfont:}2039{\ctex_patch_failure:N\selectfont}2040\fi:\CJK@plane有定义,说明处于CJK宏包的\CJKsymbol之内,不必使用钩子.
2041*pdftex2042\EverySelectfont{\cs_if_exist:NF\CJK@plane{\CTEX@selectfont@hook}}2043/pdftex2044*xetex|luatex|uptex|aptex2045\EverySelectfont{\CTEX@selectfont@hook}2046/xetex|luatex|uptex|aptexAttribute寄存器\ltj@curjfnt的初始值是1,必须把它设置为一个有效的font.
id,否则编译时会直接退出.
2047*luatex2048\ctex_add_to_selectfont:n2049{2050\ctex_ltj_select_font:2051\ctex_ltj_select_alternate_font:2052}2053\tl_set:Nn\CJK@family{song}\selectfont2054\tl_clear:N\CJK@family2055/luatex\ctex_update_xkanjiskip:\l__ctex_xkanjiskip_skipupTEX和LuaTeX-ja对\xkanjiskip都是即时赋值.
单位zw与字体相关,因此需要每次\selectfont的时候更新一次\xkanjiskip.
如果用户设置过\xkanjiskip,就不更新.
注意,同TEX的\baselineskip一样,如果在一个段落内多次设置了\kanjiskip或\xkanjiskip,只有最后的设置会影响全段.
2056*luatex|uptex|aptex2057\cs_new_protected:Npn\ctex_update_xkanjiskip:2058{2059\skip_if_eq:nnT2060luatex{\ltjgetparameter{xkanjiskip}}{\l__ctex_xkanjiskip_skip}2061uptex|aptex{\tex_xkanjiskip:D}{\l__ctex_xkanjiskip_skip}2062{2063\skip_set:Nn\l__ctex_xkanjiskip_skip{\l__ctex_xkanjiskip_tl}2064luatex\ctex_ltj_set_xkanjiskip:N\l__ctex_xkanjiskip_skip第14节代码实现822065uptex|aptex\skip_set_eq:NN\tex_xkanjiskip:D\l__ctex_xkanjiskip_skip2066}2067}2068\tl_new:N\l__ctex_xkanjiskip_tl2069\tl_set:Nn\l__ctex_xkanjiskip_tl2070luatex{.
25\zwplus1ptminus1pt}2071uptex|aptex{.
25zwplus1ptminus1pt}2072\skip_new:N\l__ctex_xkanjiskip_skip2073\skip_set:Nn\l__ctex_xkanjiskip_skip2074luatex{\ltjgetparameter{xkanjiskip}}2075uptex|aptex{\tex_xkanjiskip:D}2076\ctex_add_to_selectfont:n{\ctex_update_xkanjiskip:}2077/luatex|uptex|aptex\cht\cdp\cwd\ctex_update_kanjisize:分别从.
jfm中读取字符高度、深度和宽度,目前仅考虑横排的情况.
2078*luatex2079\dim_new:N\cht2080\dim_new:N\cdp2081\dim_new:N\cwd2082\group_begin:2083\char_set_catcode_space:n{32}2084\lua_now:e2085{2086localnulltable={}2087localfmt=luatexja.
jfont.
font_metric_table2088localgetattribute=tex.
getattribute2089localsetdimen=tex.
setdimen2090localfunc=lua.
get_functions_table()2091localid=luatexbase.
new_luafunction("ctex")2092func[id]=function()2093localft=fmt[getattribute("ltj@curjfnt")]ornulltable2094localft=ftandft.
char_typeornulltable2095localfk=ftandft[0]ornulltable2096setdimen("cht",fk.
heightor0)2097setdimen("cdp",fk.
depthor0)2098setdimen("cwd",fk.
widthorft.
zwor0)2099end2100token.
set_lua("ctex_update_kanjisize:",id,"global","protected")2101}2102\group_end:2103\ctex_add_to_selectfont:n{\ctex_update_kanjisize:}2104/luatexspace在导言区或正文中设置忽略空格方式.
pdfTEX和XTEX下初始设置为auto,LuaTEX、upTEX下是无效选项.
2105\ctex_define:n2106{2107*pdftex|xetex2108space.
choice:,2109space/true.
code:n=2110pdftex{\ctex_ignorespaces_case:N\prg_do_nothing:},2111xetex{\xeCJKsetup{CJKspace=true}},2112space/auto.
code:n=2113pdftex{\ctex_ignorespaces_case:N\ctex_auto_ignorespaces:},2114xetex{\xeCJKsetup{CJKspace=false}},2115space/false.
code:n=2116pdftex{\ctex_ignorespaces_case:N\tex_ignorespaces:D},2117xetex{\xeCJKsetup{CJKspace=false}},2118space.
default:n={true},2119space.
initial:n={auto}2120/pdftex|xetex2121*luatex|uptex|aptex2122space.
code:n=2123{\msg_warning:nn{ctex}{invalid-option}}第14节代码实现832124/luatex|uptex|aptex2125}punct在导言区或正文中设置标点符号输出格式.
LuaTeX-ja设置的是字体的默认JFM,只会影响到之后设置的字体.
upTEX暂时无效.
2126\ctex_define:n2127{2128punct.
code:n=2129{2130\tl_set:Nx\l__ctex_punct_tl{#1}2131pdftex\punctstyle{\l__ctex_punct_tl}2132xetex\xeCJKsetup{PunctStyle=\l__ctex_punct_tl}2133luatex\ctex_mono_jfm:o{\l__ctex_punct_tl}2134uptex|aptex\msg_warning:nn{ctex}{invalid-option}2135},2136punct.
default:n={quanjiao},2137}2138/pdftex|xetex|luatex|uptex|aptex14.
3.
11载入引擎定义文件最后载入各个编译引擎的定义文件.
2139class|ctex\ctex_file_input:n{\c__ctex_engine_file_str}14.
4用户设置接口2140*class|ctex|ctexheading2141\NewDocumentCommand\ctexset{}{\ctex_set:n}2142/class|ctex|ctexheading\CTEXsetup\CTEXoptions过时命令.
2143*class|ctex2144\NewDocumentCommand\CTEXsetup{+OTrimSpaces}m}2145{2146\tl_if_blank:nTF{#1}2147{\ctex_deprecated_command:Nn\CTEXsetup{}}2148{2149\ctex_deprecated_command:Nn\CTEXsetup2150{\ctexset{~#2~=~{~#1~}~}~is~set.
}2151\ctex_set:nn{#2}{#1}2152}2153}2154\NewDocumentCommand\CTEXoptions{+O{}}2155{2156\tl_if_blank:nTF{#1}2157{\ctex_deprecated_command:Nn\CTEXoptions{}}2158{2159\ctex_deprecated_command:Nn\CTEXoptions2160{\ctexset{~#1~}~is~set.
}2161\ctex_set:n{#1}2162}2163}14.
5字距与缩进autoindentautoindent也是可以用在正文中的选项,意义与宏包选项option/autoindent相同.
2164\ctex_define:n第14节代码实现842165{2166autoindent.
choice:,2167autoindent.
default:n={true},2168autoindent/true.
code:n=2169{2170\tl_set:Nn\l__ctex_autoindent_tl{2\ccwd}2171\ctex_select_size:2172},2173autoindent/false.
code:n=2174{\tl_clear:N\l__ctex_autoindent_tl},2175autoindent/unknown.
code:n=2176{2177\ctex_set_default_ccwd:Nn\l__ctex_autoindent_tl{#1}2178\ctex_select_size:2179}2180}\CTEXsetfont无论字体大小是否变化都更新相关信息.
2181\NewDocumentCommand\CTEXsetfont{}{\ctex_select_size:}2182\cs_new_protected:Npn\ctex_select_size:2183{\cs_if_free:NTF\size@update{\ctex_update_size:}{\selectfont}}\ctex_update_size:在字号变化时更新\ccwd、\parindent和汉字间距.
字距为零则恢复正常设置.
2184\cs_new_protected:Npn\ctex_update_size:2185{2186\tl_if_eq:NNTF\l__ctex_ziju_tl\c__ctex_zero_tl2187{2188\ctex_update_stretch:2189\ctex_update_parindent:2190}2191{\ctex_update_ziju:}2192}2193\tl_const:Nx\c__ctex_zero_tl{\fp_use:N\c_zero_fp}2194\tl_new:N\l__ctex_ziju_tl2195\tl_set_eq:NN\l__ctex_ziju_tl\c__ctex_zero_tl在\selectfont中,若\size@update为\relax,说明字体大小没有变化,我们也就不用更新相关参数.
2196\ctex_add_to_selectfont:n2197{\cs_if_free:NF\size@update{\ctex_update_size:}}linestretch若行宽不是汉字宽度的整数倍,自然要求伸展它们之间的差.
这里设置的是在此基础上的额外伸展量.
初始化为一个汉字的宽度.
若设置为\maxdimen,则禁用此功能.
参数的默认单位是汉字的宽度\ccwd.
2198\ctex_define:n2199{2200linestretch.
code:n=2201{2202\ctex_set_default_ccwd:Nn\l__ctex_line_stretch_tl{#1}2203\ctex_select_size:2204},2205linestretch.
value_required:n=true2206}2207\tl_new:N\l__ctex_line_stretch_tl2208\tl_set:Nn\l__ctex_line_stretch_tl{\ccwd}\ctex_update_stretch:首先计算一行上汉字的字数,\CJKglue相当于将\linewidth与汉字总宽度之差均匀地填充到汉字之间.
-TEX的除法是四舍五入,而我们这里应该用截断.
由于没有可展性的要求,直接用原语\tex_divide:D要比\int_div_truncate:nn快一些.
下面的算法还兼顾到了\linewidth不为汉字字宽的整数倍的情况.
若用户禁用linestretch并且修改过第14节代码实现85\CJKglue,则只更新\ccwd,否则设置伸展量为0.
08倍\baselineskip.
注意everysel的钩子位于\size@update之前,\baselineskip还未更新,不能直接使用它.
2209\cs_new_protected:Npn\ctex_update_stretch:2210{2211\ctex_update_em_unit:2212\dim_set:Nn\l__ctex_tmp_dim{\l__ctex_line_stretch_tl}2213\dim_compare:nNnTF\l__ctex_tmp_dim=\c_max_dim2214{\__ctex_update_stretch_auxi:}2215{\__ctex_update_stretch_auxii:}2216}2217\cs_new_protected:Npn\__ctex_update_stretch_auxi:2218{2219\ctex_if_ccglue_touched:TF2220{\ctex_update_ccwd:}2221{2222\dim_set:Nn\l__ctex_tmp_dim2223{\baselinestretch\tex_glueexpr:D\f@baselineskip\scan_stop:}2224\skip_set:Nn\l__ctex_ccglue_skip2225{\c_zero_dimplus.
08\l__ctex_tmp_dim}2226\ctex_update_ccglue:2227}2228}2229\cs_new_protected:Npn\__ctex_update_stretch_auxii:2230{2231\int_set:Nn\l__ctex_tmp_int2232{\tex_dimexpr:D\linewidth-\ccwd-\l__ctex_tmp_dim\scan_stop:}2233\tex_divide:D\l__ctex_tmp_int\ccwd2234\int_compare:nNnTF\l__ctex_tmp_int>\c_zero_int2235{2236\skip_set:Nn\l__ctex_ccglue_skip2237{2238\c_zero_dimplus\dim_eval:n2239{2240(\linewidth-\ccwd-\l__ctex_tmp_int\ccwd)/2241\l__ctex_tmp_int2242}2243}2244}2245{\skip_zero:N\l__ctex_ccglue_skip}2246\ctex_update_ccglue:2247}\ctex_update_parindent:更新段落首行缩进.
此函数在字号变化时调用.
2248\cs_new_protected:Npn\ctex_update_parindent:2249{2250\tl_if_empty:NF\l__ctex_autoindent_tl2251{2252\dim_compare:nNnF\parindent=\c_zero_dim2253{\dim_set:Nn\parindent{\l__ctex_autoindent_tl}}2254}2255}\ziju若参数为0,则恢复正常间距.
2256\NewDocumentCommand\ziju{m}2257{\exp_args:Nx\ctex_ziju:n{#1}\tex_ignorespaces:D}2258\cs_new_protected:Npn\ctex_ziju:n#12259{2260\tl_set:Nx\l__ctex_ziju_tl{\fp_eval:n{#1}}2261\ctex_select_size:2262}\ctex_update_ziju:更新字距.
若字距不大于1,即\ccwd为非正值,则不计算伸缩值.
否则,首先假定汉字的宽第14节代码实现86度为正常宽度加上字距,看一行上能正常放下多少个汉字.
2263\cs_new_protected:Npn\ctex_update_ziju:2264{2265\ctex_update_em_unit:2266\dim_set:Nn\l__ctex_ziju_dim{\l__ctex_ziju_tl\ccwd}2267\dim_add:Nn\ccwd{\l__ctex_ziju_dim}2268\dim_compare:nNnTF\ccwd>\c_zero_dim伸展量保证行内的剩余空白能够被均匀地填充到汉字之间,收缩的最大限度是让当前行还能够再挤下一个汉字并且不会出现负间距.
由TEX决定伸展还是收缩.
2269{2270\dim_set:Nn\l__ctex_tmp_dim2271{\linewidth-\ccwd+\l__ctex_ziju_dim}2272\int_set:Nn\l__ctex_tmp_int{\l__ctex_tmp_dim}2273\tex_divide:D\l__ctex_tmp_int\ccwd2274\dim_sub:Nn\l__ctex_tmp_dim{\l__ctex_tmp_int\ccwd}由于\parindent是一个固定值,并不参与伸缩,容易导致第一行出现坏盒子.
我们在这里将字数减去2,以此放大伸缩值.
2275\dim_compare:nNnF\parindent=\c_zero_dim2276{2277\int_compare:nNnF\l__ctex_tmp_int{\SplitArgument{1m}2494{\__ctex_assign_heading_name:nnn{#1}#2}2495\cs_new_protected:Npn\__ctex_assign_heading_name:nnn#1#2#32496{2497\tl_set:cn{CTEX@pre#1}{#2}2498\tl_if_novalue:nTF{#3}2499{\tl_clear:c{CTEX@post#1}}2500{\tl_set:cn{CTEX@post#1}{#3}}2501}part/pagestylechapter/pagestylechapter/lofskipchapter/lotskip只在ctexbook和ctexrep下有定义.
2502\group_begin:2503*book|report2504\tl_set:Nn\l__ctex_tmp_tl2505{2506part/pagestyle.
tl_set:N=\CTEX@part@pagestyle,2507chapter/pagestyle.
tl_set:N=\CTEX@chapter@pagestyle,2508chapter/lofskip.
tl_set:N=\CTEX@chapter@lofskip,2509chapter/lotskip.
tl_set:N=\CTEX@chapter@lotskip,2510chapter/lofskip.
initial:n=\c_zero_skip,2511chapter/lotskip.
initial:n=\c_zero_skip,2512chapter/lofskip.
value_required:n=true,2513chapter/lotskip.
value_required:n=true,2514}2515/book|report2516*article|beamer2517\tl_clear:N\l__ctex_tmp_tl2518/article|beamer定义标题键值选项.
2519\seq_map_inline:Nn\c__ctex_headings_seq2520{2521\__ctex_initial_heading:n{#1}2522\__ctex_def_heading_keys:n{#1}2523}2524\exp_args:NNo\group_end:\ctex_define:n{\l__ctex_tmp_tl}\CTEX@heading@format@initial标题格式的一些初始设置,包括恢复默认字体,并禁用自动调整首行缩进,禁止在标题中分页.
同时用\noindent抑制首行缩进并进入水平模式.
统一在各级标题的format选项之前第14节代码实现91使用.
2525\cs_new_protected:Npn\CTEX@heading@format@initial2526{2527\normalfont2528\tl_clear:N\l__ctex_autoindent_tl2529\int_set:Nn\tex_interlinepenalty:D{10000}2530\tex_noindent:D2531}\ctex_indent_box:n设置\parindent,并插入用于产生缩进的盒子,如果缩进为0,就不插入.
2532\cs_new_protected:Npn\ctex_indent_box:n#12533{2534\dim_set:Nn\tex_parindent:D{#1}2535\__ctex_insert_indent:2536}2537\cs_new_protected:Npn\__ctex_insert_indent:2538{2539\dim_compare:nNnF\tex_parindent:D=\c_zero_dim2540{\tex_indent:D}2541}2542\cs_new_eq:NN\CTEX@indentbox\ctex_indent_box:n14.
8.
2标准标题命令的修改2543*article|book|report\CTEX@fixtopskip修正book和report类的\part和\chapter标题之前的多余空行.
2544*book|report2545\cs_new_protected:Npn\CTEX@fixtopskip2546{2547\CTEX@fixheadingskip2548\dim_compare:nNnF\tex_pagegoal:D\m@ne2629\ifodd\CTEX@part@numbering2630\CTEX@ifnametrue2631\refstepcounter{part}%2632%\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%2633\else2634\CTEX@ifnamefalse2635\CTEX@makeanchor{part*}%2636%\addcontentsline{toc}{part}{#1}%2637\fi2638\else2639\CTEX@ifnamefalse2640\CTEX@makeanchor{part*}%2641%\addcontentsline{toc}{part}{#1}%2642\fi2643\CTEX@gettitle{#1}%2644\CTEX@addtocline{part}{#1}%2645\partmark{#1}%2646\begingroup2647%\parindent\z@\raggedright\interlinepenalty\@M\normalfont2648\CTEX@heading@format@initial2649\CTEX@part@format{%2650%\ifnum\c@secnumdepth>\m@ne2651%\Large\bfseries\partname\nobreakspace\thepart\par\nobreak2652%\fi2653\CTEX@headinghang{part}%2654{\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}%2655%\huge\bfseries#2%2656\CTEX@part@titleformat{#2}%2657%\markboth{}{}\par2658\CTEX@part@aftertitle}\par2659\endgroup2660\nobreak2661%\vskip3ex2662\CTEX@setheadingskip\CTEX@part@afterskip2663\ifodd\CTEX@part@fixskip\CTEX@fixheadingskip\fi2664\vskip\CTEX@headingskip2665\@afterheading}2666/article2667*book|report2668\def\@part[#1]#2{%2669\ifnum\c@secnumdepth>-2\relax2670\ifodd\CTEX@part@numbering2671\CTEX@ifnametrue2672\refstepcounter{part}%2673%\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%2674\else2675\CTEX@ifnamefalse2676\CTEX@makeanchor{part*}%2677%\addcontentsline{toc}{part}{#1}%2678\fi2679\else2680\CTEX@ifnamefalse2681\CTEX@makeanchor{part*}%2682%\addcontentsline{toc}{part}{#1}%2683\fi2684\CTEX@gettitle{#1}%2685\CTEX@addtocline{part}{#1}%2686%\markboth{}{}%2687\partmark{#1}%2688\begingroup2689%\centering\interlinepenalty\@M\normalfont2690\CTEX@heading@format@initial第14节代码实现942691\CTEX@part@format{%2692%\ifnum\c@secnumdepth>-2\relax2693%\huge\bfseries\partname\nobreakspace\thepart\par\vskip20\p@2694%\fi2695\CTEX@headinghang{part}%2696{\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}%2697%\Huge\bfseries#2\par2698\CTEX@part@titleformat{#2}%2699\CTEX@part@aftertitle}\par2700\endgroup2701\@endpart}2702/book|report2703*article2704\def\@spart#1{%2705\CTEX@ifnamefalse2706\CTEX@makeanchor@spart{part*}%2707\CTEX@gettitle{#1}%2708\begingroup2709%\parindent\z@\raggedright\interlinepenalty\@M\normalfont2710\CTEX@heading@format@initial2711\CTEX@part@format{%2712\CTEX@headinghang{part}{}%2713%\huge\bfseries#1\par2714\CTEX@part@titleformat{#1}%2715\CTEX@part@aftertitle}\par2716\endgroup2717\nobreak2718%\vskip3ex2719\CTEX@setheadingskip\CTEX@part@afterskip2720\ifodd\CTEX@part@fixskip\CTEX@fixheadingskip\fi2721\vskip\CTEX@headingskip2722\@afterheading}2723/article2724*book|report2725\def\@spart#1{%2726\CTEX@ifnamefalse2727\CTEX@makeanchor@spart{part*}%2728\CTEX@gettitle{#1}%2729\begingroup2730%\centering\interlinepenalty\@M\normalfont2731\CTEX@heading@format@initial2732\CTEX@part@format{%2733\CTEX@headinghang{part}{}%2734%\Huge\bfseries#1\par%2735\CTEX@part@titleformat{#1}%2736\CTEX@part@aftertitle}\par2737\endgroup2738\@endpart}2739/book|report2740*book|report2741\def\@endpart{%2742%\vfil2743\CTEX@setheadingskip\CTEX@part@afterskip2744\ifodd\CTEX@part@fixskip\CTEX@fixheadingskip\fi2745\vskip\CTEX@headingskip2746\newpage2747\if@twoside2748\if@openright2749\null2750\thispagestyle{empty}%2751\newpage2752\fi2753\fi2754\if@tempswa2755\twocolumn第14节代码实现952756\fi}2757/book|report14.
8.
2.
2chapter的标题2758*book|report2759\renewcommand\chapter{%2760%\if@openright\cleardoublepage\else\clearpage\fi2761%\thispagestyle{plain}%2762\CTEX@chapter@break2763\thispagestyle{\CTEX@chapter@pagestyle}%2764\global\@topnum\z@2765%\@afterindentfalse2766\ifodd\CTEX@chapter@afterindent2767\@afterindenttrue2768\else2769\@afterindentfalse2770\fi2771\secdef\@chapter\@schapter}2772\def\@chapter[#1]#2{%2773\ifnum\c@secnumdepth>\m@ne2774*book2775\if@mainmatter2776/book2777\ifodd\CTEX@chapter@numbering2778\CTEX@ifnametrue2779\refstepcounter{chapter}%2780%\typeout{\@chapapp\space\thechapter.
}%2781\typeout{\CTEXthechapter}%2782%\addcontentsline{toc}{chapter}2783%{\protect\numberline{\thechapter}#1}%2784\else2785\CTEX@ifnamefalse2786\CTEX@makeanchor{\Hy@chapapp*}%2787%\addcontentsline{toc}{chapter}{#1}%2788\fi2789*book2790\else2791\CTEX@ifnamefalse2792\CTEX@makeanchor@chapter{\Hy@chapapp*}%2793%\addcontentsline{toc}{chapter}{#1}%2794\fi2795/book2796\else2797\CTEX@ifnamefalse2798\CTEX@makeanchor@chapter{\Hy@chapapp*}%2799%\addcontentsline{toc}{chapter}{#1}%2800\fi2801\CTEX@gettitle{#1}%2802\CTEX@addtocline{chapter}{#1}%2803\chaptermark{#1}%2804%\addtocontents{lof}{\protect\addvspace{10\p@}}%2805%\addtocontents{lot}{\protect\addvspace{10\p@}}%2806\CTEX@addloflotskip{chapter}%2807\if@twocolumn2808\@topnewpage[\@makechapterhead{#2}]%2809\else2810\@makechapterhead{#2}%2811\@afterheading2812\fi}2813\def\@schapter#1{%2814\CTEX@ifnamefalse2815\CTEX@makeanchor@schapter{\Hy@chapapp*}%2816\CTEX@gettitle{#1}%第14节代码实现962817\if@twocolumn2818\@topnewpage[\@makeschapterhead{#1}]%2819\else2820\@makeschapterhead{#1}%2821\@afterheading2822\fi}2823\def\@makechapterhead#1{%2824%\vspace*{50\p@}%2825\CTEX@setheadingskip\CTEX@chapter@beforeskip2826\ifodd\CTEX@chapter@fixskip\CTEX@fixtopskip\fi2827\vspace*{\CTEX@headingskip}%2828\begingroup2829%\parindent\z@\raggedright\normalfont2830\CTEX@heading@format@initial2831\CTEX@chapter@format{%2832%\ifnum\c@secnumdepth>\m@ne2833%\if@mainmatter2834%\huge\bfseries\@chapapp\space\thechapter\par\nobreak\vskip20\p@2835%\fi2836%\fi2837\CTEX@headinghang{chapter}%2838{\CTEXifname{\CTEX@chaptername\CTEX@chapter@aftername}{}}%2839%\Huge\bfseries#1\par\nobreak2840\CTEX@chapter@titleformat{#1}%2841\CTEX@chapter@aftertitle}\par2842\endgroup2843\nobreak2844%\vskip40\p@2845\CTEX@setheadingskip\CTEX@chapter@afterskip2846\ifodd\CTEX@chapter@fixskip\CTEX@fixheadingskip\fi2847\vskip\CTEX@headingskip}2848\def\@makeschapterhead#1{%2849%\vspace*{50\p@}%2850\CTEX@setheadingskip\CTEX@chapter@beforeskip2851\ifodd\CTEX@chapter@fixskip\CTEX@fixtopskip\fi2852\vspace*{\CTEX@headingskip}%2853\begingroup2854%\parindent\z@\raggedright\normalfont\interlinepenalty\@M2855\CTEX@heading@format@initial2856\CTEX@chapter@format{%2857\CTEX@headinghang{chapter}{}%2858%\Huge\bfseries#1\par\nobreak2859\CTEX@chapter@titleformat{#1}%2860\CTEX@chapter@aftertitle}\par2861\endgroup2862\nobreak2863%\vskip40\p@2864\CTEX@setheadingskip\CTEX@chapter@afterskip2865\ifodd\CTEX@chapter@fixskip\CTEX@fixheadingskip\fi2866\vskip\CTEX@headingskip}2867/book|report14.
8.
2.
3section类的标题\@startsectionLATEX的标准参数是:{name}{level}{indent}{beforeskip}{afterskip}{style}*[altheading]{heading}2868\def\@startsection#1#2#3#4#5#6{%2869\if@noskipsec\leavevmode\fi2870\par2871%\@tempskipa#4\relax2872%\@afterindenttrue2873%\ifdim\@tempskipa\c@secnumdepth2900\CTEX@ifnamefalse2901\CTEX@makeanchor@sect{#1*}%2902\let\@svsec\@empty2903\else2904\ifodd\csnameCTEX@#1@numbering\endcsname2905\CTEX@ifnametrue2906\refstepcounter{#1}%2907\protected@edef\@svsec{\@seccntformat{#1}\relax}%2908\else2909\CTEX@ifnamefalse2910\CTEX@makeanchor{#1*}%2911\let\@svsec\@empty2912\fi2913\fi2914\CTEX@gettitle{#7}%2915%\@tempskipa#5\relax2916%\ifdim\@tempskipa>\z@2917\unless\ifodd\CTEX@runin2918\begingroup2919\CTEX@heading@format@initial2920#6{%2921%\@hangfrom{\hskip#3\relax\@svsec}%2922%\interlinepenalty\@M#8\@@par2923\CTEX@sectionhang{#3}{\@svsec}%2924\csnameCTEX@#1@titleformat\endcsname{#8}%2925\csnameCTEX@#1@aftertitle\endcsname}\par2926\endgroup2927\csname#1mark\endcsname{#7}%2928%\addcontentsline{toc}{#1}{%2929%\ifnum#2>\c@secnumdepth\else2930%\protect\numberline{\csnamethe#1\endcsname}%2931%\fi2932%#7}%2933\CTEX@addtocline{#1}{#7}%2934\else2935\def\@svsechd{%2936#6{%2937%\hskip#3\relax\@svsec#82938{\CTEX@indentbox{#3}}\@svsec第14节代码实现982939\csnameCTEX@#1@titleformat\endcsname{#8}%2940\csnameCTEX@#1@aftertitle\endcsname}%2941\csname#1mark\endcsname{#7}%2942%\addcontentsline{toc}{#1}{%2943%\ifnum#2>\c@secnumdepth\else2944%\protect\numberline{\csnamethe#1\endcsname}%2945%\fi2946%#7}%2947\CTEX@addtocline{#1}{#7}}%2948\fi2949\@xsect{#5}}2950\def\@ssect#1#2#3#4#5{%2951\CTEX@ifnamefalse2952\CTEX@gettitle{#5}%2953%\@tempskipa#3\relax2954%\ifdim\@tempskipa>\z@2955\unless\ifodd\CTEX@runin2956\begingroup2957\CTEX@heading@format@initial2958#4{%2959%\@hangfrom{\hskip#1}%2960%\interlinepenalty\@M#5\__ctexpar2961\CTEX@sectionhang{#1}{}%2962\CTEX@titleformat@n{#5}%2963\CTEX@aftertitle}\par2964\endgroup2965\else2966%\def\@svsechd{#4{\hskip#1\relax#5}}%2967\def\@svsechd{#4{{\CTEX@indentbox{#1}}%2968\CTEX@titleformat@n{#5}\CTEX@aftertitle}}%2969\fi2970\@xsect{#3}}2971\def\@xsect#1{%2972%\@tempskipa#1\relax2973%\ifdim\@tempskipa>\z@2974\unless\ifodd\CTEX@runin2975\par\nobreak2976%\vskip\@tempskipa2977\CTEX@setheadingskip{#1}%2978\ifodd\CTEX@fixskip\CTEX@fixheadingskip\fi2979\vskip\CTEX@headingskip2980\@afterheading2981\else2982\@nobreakfalse2983\global\@noskipsectrue2984\everypar{%2985\if@noskipsec2986\global\@noskipsecfalse2987{\setbox\z@\lastbox}%2988\clubpenalty\@M2989\begingroup\@svsechd\endgroup2990\unskip2991%\@tempskipa#1\relax2992%\hskip-\@tempskipa2993\CTEX@heading@glue{#1}%2994\else2995\clubpenalty\@clubpenalty2996\everypar{}%2997\fi}%2998\fi2999\ignorespaces}\CTEX@headinghang\CTEX@sectionhang分别用于用于实现\part/\chapter和\section类标题的indent和hang选项.
3000\cs_new_protected:Npn\CTEX@headinghang#1第14节代码实现993001{3002\ctex_heading_hang:cnn3003{CTEX@#1@hang}3004{\use:c{CTEX@#1@indent}}3005}3006\cs_new_protected:Npn\CTEX@sectionhang3007{\ctex_heading_hang:Nnn\CTEX@hang}\ctex_heading_hang:Nnn\ctex_hang_from:nhang选项控制是否采用悬挂缩进,同时设置\parindent.
3008\cs_new_protected:Npn\ctex_heading_hang:Nnn#1#2#33009{3010\dim_set:Nn\tex_parindent:D{#2}3011\bool_if:NTF#13012{\ctex_hang_from:n}3013{\use:n}3014{\__ctex_insert_indent:#3}3015}3016\cs_new_protected:Npn\ctex_hang_from:n#13017{3018\tex_noindent:D3019\hbox_set:Nn\l__ctex_tmp_box{#1}3020\tex_hangindent:D=\box_wd:N\l__ctex_tmp_box3021\box_use_drop:N\l__ctex_tmp_box3022}3023\cs_generate_variant:Nn\ctex_heading_hang:Nnn{c}\ctex_heading_glue:n\CTEX@heading@glue如果缩进#1长度为零,就不插入水平间距.
3024\cs_new_protected:Npn\ctex_heading_glue:n#13025{3026\group_begin:3027\skip_set:Nn\l__ctex_heading_skip{#1}3028\dim_compare:nNnF\l__ctex_heading_skip=\c_zero_dim3029{\skip_horizontal:N\l__ctex_heading_skip}3030\group_end:3031}3032\cs_new_eq:NN\CTEX@heading@glue\ctex_heading_glue:n\CTEX@update@sectionformat@n在\@startsection中设置\CTEX@titleformat@n等为相应函数.
3033\cs_new_protected:Npn\CTEX@update@sectionformat@n#13034{3035\cs_set_eq:Nc\CTEX@titleformat@n{CTEX@#1@titleformat}3036\cs_set_eq:Nc\CTEX@aftertitle{CTEX@#1@aftertitle}3037\cs_set_eq:Nc\CTEX@afterindent{CTEX@#1@afterindent}3038\cs_set_eq:Nc\CTEX@fixskip{CTEX@#1@fixskip}3039\cs_set_eq:Nc\CTEX@hang{CTEX@#1@hang}3040\cs_set_eq:Nc\CTEX@runin{CTEX@#1@runin}3041}3042\cs_new_eq:NN\CTEX@titleformat@n\use:n3043\cs_new_eq:NN\CTEX@aftertitle\prg_do_nothing:3044\cs_new_eq:NN\CTEX@afterindent\c_true_bool3045\cs_new_eq:NN\CTEX@fixskip\c_false_bool3046\cs_new_eq:NN\CTEX@hang\c_true_bool3047\cs_new_eq:NN\CTEX@runin\c_false_bool3048\cs_new:Npn\CTEX@part@tocline#1#23049{3050\CTEXifname3051{\CTEXthepart\hspace{1em}}3052{}3053#23054}3055*book|report3056\cs_new:Npn\CTEX@chapter@tocline#1#23057{第14节代码实现1003058\CTEXifname3059{\protect\numberline{\CTEXthechapter\hspace{.
3em}}}3060{}3061#23062}3063/book|report3064\cs_new:Npn\CTEXnumberline#13065{3066\CTEXifname3067{\protect\numberline{\use:c{CTEXthe#1}}}3068{}3069}3070\int_zero:N\l__ctex_tmp_int3071\seq_map_inline:Nn\c__ctex_section_headings_seq3072{3073\int_incr:N\l__ctex_tmp_int3074\cs_gset_protected:cpx{#1}3075{3076\exp_not:N\@startsection{#1}3077{\int_use:N\l__ctex_tmp_int}3078{\exp_not:c{CTEX@#1@indent}}3079{\exp_not:c{CTEX@#1@beforeskip}}3080{\exp_not:c{CTEX@#1@afterskip}}3081{\exp_not:N\normalfont\exp_not:c{CTEX@#1@format}}3082}3083\cs_new:cpn{CTEX@#1@tocline}##1##23084{\CTEXnumberline{##1}##2}3085}14.
8.
2.
4附录标题3086\ctex_define:n3087{3088appendix.
meta:nn={ctex/appendix}{#1},3089appendix/name.
code:n=3090{\ctex_assign_heading_name:nn{appendix}{#1}},3091appendix/number.
tl_set:N=\CTEX@appendix@number,3092appendix/numbering.
bool_set:N=\CTEX@appendix@numbering,3093appendix/numbering.
initial:n=true3094}3095\tl_new:N\CTEX@preappendix3096\tl_new:N\CTEX@postappendix3097\cs_new_eq:NN\CTEX@save@appendix\appendix3098\cs_gset_protected:Npn\appendix3099{3100\CTEX@save@appendix3101*article3102\gdef\CTEX@presection{\CTEX@preappendix}3103\gdef\CTEX@thesection{\CTEX@appendix@number}3104\gdef\CTEX@postsection{\CTEX@postappendix}3105\gdef\CTEX@section@numbering{\CTEX@appendix@numbering}3106/article3107*book|report3108\gdef\CTEX@prechapter{\CTEX@preappendix}3109\gdef\CTEX@thechapter{\CTEX@appendix@number}3110\gdef\CTEX@postchapter{\CTEX@postappendix}3111\gdef\CTEX@chapter@numbering{\CTEX@appendix@numbering}3112/book|report3113}第14节代码实现10114.
8.
2.
5设置hyperref宏包的标题锚点\CTEX@makeanchor设置超链接跳转锚点,在hyperref载入后才有意义.
3114\cs_new_protected:Npn\CTEX@makeanchor#13115{}\c__ctex_headings_cs_seq保存内部标题命令的CTEX定义,用于随后比较.
3116\seq_const_from_clist:Nn\c__ctex_headings_cs_seq3117article{part,spart,sect,ssect}3118book|report{part,spart,chapter,schapter,sect,ssect}3119\seq_map_inline:Nn\c__ctex_headings_cs_seq3120{3121\cs_new_eq:cc{CTEX@#1}{@#1}3122\cs_new_eq:cN{CTEX@makeanchor@#1}\CTEX@makeanchor3123}\CTEX@hyperheadinghookhyperref会重定义内部标题命令,目的在于为没有编号的标题设置锚点(这一功能受他的implicit选项的控制).
我们在上面对标题命令的修改已经包含这一功能,如果这些标题命令在hyperref载入之前没有被修改过,则恢复CTEX的定义.
3124\cs_new_protected:Npn\CTEX@hyperheadinghook3125{3126\group_begin:3127\ifHy@implicit3128\cs_set_eq:NN\H@old@chapter\Hy@org@chapter3129\seq_map_inline:Nn\c__ctex_headings_cs_seq3130{3131\cs_if_eq:ccT{H@old@##1}{CTEX@##1}3132{3133\cs_gset_eq:cc{@##1}{CTEX@##1}3134\cs_gset_eq:cN{CTEX@makeanchor@##1}\CTEX@makeanchor3135}3136}3137\else:3138\seq_map_inline:Nn\c__ctex_headings_cs_seq3139{\cs_gset_eq:cN{CTEX@makeanchor@##1}\CTEX@makeanchor}3140\fi:3141\group_end:3142}3143\ctex_at_end_package:nn{hyperref}3144{3145\cs_gset_protected:Npn\CTEX@makeanchor#13146{3147\Hy@MakeCurrentHrefAuto{#1}3148\Hy@raisedlink3149{3150\hyper@anchorstart{\@currentHref}3151\hyper@anchorend3152}3153}3154\CTEX@hyperheadinghook3155}14.
8.
2.
6兼容nameref宏包\CTEX@gettitle在nameref载入后才有意义,与上述hyperref的处理类似.
3156\cs_new_protected:Npn\CTEX@gettitle#13157{}3158\ctex_at_end_package:nn{nameref}3159{3160\cs_gset_protected:Npn\CTEX@gettitle{\NR@gettitle}第14节代码实现1023161\seq_map_inline:Nn\c__ctex_headings_cs_seq3162{3163\cs_if_eq:ccT{NR@#1}{CTEX@#1}3164{\cs_gset_eq:cc{@#1}{CTEX@#1}}3165}3166}14.
8.
2.
7兼容titlesec宏包我们修改了\@startsection的定义,它的第四个(beforeskip)和第五个(afterskip)参数的符号不再有特殊意义,改由相应的选项afterindent和runin来控制.
引入titlesec宏包,并且未设置它的loadonly选项时,titlesec会展开section类标题获取它们的参数,进行初始设置.
我们需要进行一些调整.
\ctex_titlesec_hook:\titleformat的设置保存在名为\ttlf@section的宏中备用,它的内容是\ttlh@shape{format}{label}{sep}{before}{after}我们这里的shape为hang或者runin.
\titlespacing的设置保存在\ttls@section之中,它的内容是{left}{right}{before}{after}{afterindent}其中afterindent为1或0,分别对应是否保留段首缩进.
我们需要根据CTEX的runin和afterindent选项调整\ttlh@shape和afterindent.
注意,由\ttl@extract得的before和after的值总是非负的,而CTEX的beforeskip和afterskip是可以取负值的,但我们不打算调整它们了.
如果使用了titlesec的indentafter等选项,也不需要调整\ttls@section.
3167\cs_new_protected:Npn\ctex_titlesec_hook:3168{3169\@ifpackagewith{titlesec}{explicit}3170{3171\cs_set_eq:NN\__ctex_titlesec_format:Nn3172\__ctex_titlesec_format_explicit:Nn3173}3174{}3175\clist_map_inline:nn3176{indentafter,noindentafter,indentfirst,nonindentfirst}3177{3178\@ifpackagewith{titlesec}{##1}3179{3180\clist_map_break:n3181{\cs_set_eq:NN\__ctex_titlesec_hook:n\__ctex_titlesec_format:n}3182}3183{}3184}3185\seq_map_function:NN\c__ctex_section_headings_seq\__ctex_titlesec_hook:n3186}3187\cs_new_protected:Npn\__ctex_titlesec_hook:n#13188{3189\__ctex_titlesec_format:n{#1}3190\exp_args:Nc\__ctex_titlesec_spacing:Nn{ttls@#1}{#1}3191}3192\cs_new_protected:Npn\__ctex_titlesec_format:n#13193{3194\cs_if_free:cF{ttlf@#1}3195{\exp_args:Nc\__ctex_titlesec_format:Nn{ttlf@#1}{#1}}3196}3197\cs_new_protected:Npn\__ctex_titlesec_format:Nn#1#23198{第14节代码实现1033199\tl_set:Nx#13200{3201\bool_if:cTF{CTEX@#2@runin}3202{\exp_not:N\ttlh@runin}3203{\exp_not:N\ttlh@hang}3204\tl_tail:N#13205}3206}3207\cs_new_protected:Npn\__ctex_titlesec_format_explicit:Nn#1#23208{3209\cs_set_nopar:Npx#1##13210{3211\bool_if:cTF{CTEX@#2@runin}3212{\exp_not:N\ttlh@runin}3213{\exp_not:N\ttlh@hang}3214\exp_args:No\tl_tail:n{#1{}}3215}3216}3217\cs_new_protected:Npn\__ctex_titlesec_spacing:Nn#1#23218{\tl_set:Nx#1{\exp_after:wN\__ctex_titlesec_spacing:nnnnnn#1{#2}}}3219\cs_new:Npn\__ctex_titlesec_spacing:nnnnnn#1#2#3#4#5#63220{3221\exp_not:n{{#1}{#2}{#3}{#4}}3222{\bool_if:cTF{CTEX@#6@afterindent}{\@ne}{\z@}}3223}3224\@ifpackageloaded{titlesec}3225{}3226{3227\ctex_at_end_package:nn{titlesec}3228{3229\@ifpackagewith{titlesec}{loadonly}3230{}3231{\ctex_titlesec_hook:}3232}3233}让编译时终端显示\CTEXthechapter,目录使用\CTEXtheXXX编号.
3234\ctex_at_end_package:nn{titlesec}3235{3236*book|report3237\tl_set:Nn\ttl@chapterout{\typeout{\CTEXthechapter}}3238/book|report3239\cs_if_free:NF\ttl@tocpart3240{3241\cs_set_protected:Npn\ttl@tocpart3242{\tl_set:Nn\ttl@a{\CTEXthepart\hspace{1em}}}3243}3244\seq_map_inline:Nn\c__ctex_headings_seq3245{3246\cs_if_exist:cF{ttl@toc#1}3247{3248\cs_new_protected:cpx{ttl@toc#1}3249{3250\tl_set:Nn\exp_not:N\ttl@a3251{3252\exp_not:N\protect3253\exp_not:N\numberline{\exp_not:c{CTEXthe#1}}3254}3255}3256}3257}3258}第14节代码实现10414.
8.
2.
8兼容titleps宏包按照titleps宏包的实现机制,\CTEXtheXXX等宏直到页眉排版时才会被展开,这可能会造成问题19.
\ctex_titleps_hook:我们修改titleps包的内部命令\ttl@settopmark和\ttl@setsubmark,将\CTEXtheXXX等加入更新队列中.
3259\group_begin:3260\char_set_catcode_other:N\#3261\cs_new_protected:Npn\ctex_titleps_hook:3262{3263\ctex_patch_cmd:Nnn\ttl@settopmark3264{\protect\@namedef{the#1}{\@nameuse{the#1}}}3265{3266\protect\@namedef{the#1}{\@nameuse{the#1}}3267\CTEX@titlepslabel@set{#1}3268}3269\ctex_patch_cmd:Nnn\ttl@setsubmark3270{\protect\@namedef{the#1}{}}3271{3272\protect\@namedef{the#1}{}3273\CTEX@titlepslabel@clear{#1}3274}3275\ctex_patch_cmd:Nnn\ttl@setsubmark3276{\protect\@namedef{the#2}{\@nameuse{the#2}}}3277{3278\protect\@namedef{the#2}{\@nameuse{the#2}}3279\CTEX@titlepslabel@set{#2}3280}3281}3282\group_end:\CTEX@titlepslabel@set\CTEX@titlepslabel@clear这两个函数要在随后被\xdef展开来获得\CTEXtheXXX的内容,不应该用\protected来定义.
3283\cs_new:Npn\CTEX@titlepslabel@set#13284{3285\cs_if_free:cF{CTEXthe#1}3286{\protect\@namedef{CTEXthe#1}{\@nameuse{CTEXthe#1}}}3287}3288\cs_new:Npn\CTEX@titlepslabel@clear#13289{3290\cs_if_free:cF{CTEXthe#1}3291{\protect\@namedef{CTEXthe#1}{}}3292}titleps宏包的功能可以由titlesec的选项pagestyles引入.
3293\ctex_at_end_package:nn{titlesec}3294{\cs_if_free:NF\ttl@settopmark{\ctex_titleps_hook:}}3295\ctex_at_end_package:nn{titleps}{\ctex_titleps_hook:}除此之外,也可以使用titleps提供的命令\newtitlemark来完成:\newtitlemark{\CTEXthechapter}\newtitlemark{\CTEXthesection}但\newtitlemark不包含章节间的层次信息,功能上不及修改内部命令完整.
\ttl@setifthe使\iftheXXX等命令在页眉设置中可用.
3296\ctex_at_end_package:nn{titleps}3297{19https://github.
com/CTeX-org/ctex-kit/issues/217第14节代码实现1053298\cs_set_protected:Npn\ttl@setifthe#13299{3300\exp_args:Nco\cs_set:Npn{ifthe#1}3301{3302\CTEXifname3303{\protect\@firstoftwo}3304{\protect\@secondoftwo}3305}3306}3307\seq_map_function:NN\c__ctex_headings_seq\ttl@setifthe3308}14.
8.
3目录标签的宽度3309\cs_new_protected:Npn\CTEX@toc@width@n#13310{3311\hbox_set:Nn\l__ctex_tmp_box{#1}3312\dim_set:Nn\@tempdima3313{3314\dim_max:nn{\@tempdima}3315{\box_wd:N\l__ctex_tmp_box+\f@size\p@/2}3316}3317}\numberline\__ctex_patch_toc_width:n为\numberline命令打补丁,并兼容tocloft和titletoc宏包.
这里需要替换#本身,因此需要先切换为other类.
表示参数的#用\c_parameter_-token代替.
3318\group_begin:3319\char_set_catcode_other:N\#3320\use:n3321{3322\group_end:3323\ctex_preto_cmd:NnnTF\numberline{\ExplSyntaxOff}3324{\CTEX@toc@width@n{#1}}3325{}3326{\ctex_patch_failure:N\numberline}3327\cs_new_protected:Npn\__ctex_patch_toc_width:n\c_parameter_token13328{3329\@ifpackageloaded{\c_parameter_token1}3330{}3331{3332\ctex_at_end_package:nn{\c_parameter_token1}3333{3334\ctex_preto_cmd:NnnTF\numberline3335{\char_set_catcode_letter:n{64}}3336{\CTEX@toc@width@n{#1}}3337{}3338{\ctex_patch_failure:N\numberline}3339}3340}3341}3342}3343\__ctex_patch_toc_width:n{tocloft}3344\__ctex_patch_toc_width:n{titletoc}14.
8.
4页眉信息的修改3345*article3346\if@twoside3347\ctex_patch_cmd:Nnn\ps@headings3348{\ifnum\c@secnumdepth>\z@\thesection\quad\fi}3349{\CTEXifname{\CTEXthesection\quad}{}}第14节代码实现1063350\ctex_patch_cmd:Nnn\ps@headings3351{\ifnum\c@secnumdepth>\@ne\thesubsection\quad\fi}3352{\CTEXifname{\CTEXthesubsection\quad}{}}3353\else:不知为何,标准文档类此处对secnumdepth的判断为0,与\section的层次1不符.
3354\ctex_patch_cmd:Nnn\ps@headings3355{\ifnum\c@secnumdepth>\m@ne\thesection\quad\fi}3356{\CTEXifname{\CTEXthesection\quad}{}}3357\fi:3358/article3359*book|report3360\ctex_patch_cmd:Nnn\ps@headings3361{3362book\ifnum\c@secnumdepth>\m@ne\if@mainmatter3363report\ifnum\c@secnumdepth>\m@ne3364\@chapapp\\thechapter.
~\%3365report\fi3366book\fi\fi3367}3368{\CTEXifname{\CTEXthechapter\quad}{}}3369\if@twoside3370\ctex_patch_cmd:Nnn\ps@headings3371{\ifnum\c@secnumdepth>\z@\thesection.
~\\fi}3372{\CTEXifname{\CTEXthesection\quad}{}}3373\fi:3374/book|report\f@nch@initialise这里对fancyhdr宏包打补丁.
原来fancyhdr宏包中使用\thesection等宏表示页眉中的章节编号,这里改用ctex包所用的\CTEXthesection系列宏.
3375\ctex_at_end_package:nn{fancyhdr}3376{3377\ctex_patch_cmd:Nnn\f@nch@initialise3378{\ifnum\c@secnumdepth>\z@\thesection\hskip1em\relax\fi}3379{\CTEXifname{\CTEXthesection\quad}{}}3380\ctex_patch_cmd:Nnn\f@nch@initialise3381{\ifnum\c@secnumdepth>\@ne\thesubsection\hskip1em\relax\fi}3382{\CTEXifname{\CTEXthesubsection\quad}{}}3383\ctex_patch_cmd:Nnn\f@nch@initialise3384{\ifnum\c@secnumdepth>\m@ne\@chapapp\\thechapter.
~\\fi}3385{\CTEXifname{\CTEXthechapter\quad}{}}3386\ctex_patch_cmd:Nnn\f@nch@initialise3387{\ifnum\c@secnumdepth>\z@\thesection.
~\\fi}3388{\CTEXifname{\CTEXthesection\quad}{}}3389\f@nch@initialisefancyhdr的headings选项会重定义\ps@headings,这里也要打补丁.
3390\@ifpackagewith{fancyhdr}{headings}3391{3392*article3393\if@twoside3394\ctex_patch_cmd:Nnn\ps@headings3395{\ifnum\c@secnumdepth>\z@\thesection\quad\fi}3396{\CTEXifname{\CTEXthesection\quad}{}}3397\ctex_patch_cmd:Nnn\ps@headings3398{\ifnum\c@secnumdepth>\@ne\thesubsection\quad\fi}3399{\CTEXifname{\CTEXthesubsection\quad}{}}3400\else:3401\ctex_patch_cmd:Nnn\ps@headings3402{\ifnum\c@secnumdepth>\z@\thesection\quad\fi}3403{\CTEXifname{\CTEXthesection\quad}{}}3404\fi:3405/article3406*book|report3407\ctex_patch_cmd:Nnn\ps@headings第14节代码实现1073408{3409book\ifnum\c@secnumdepth>\m@ne\if@mainmatter3410report\ifnum\c@secnumdepth>\m@ne3411\@chapapp\\thechapter.
~\%3412report\fi3413book\fi\fi3414}3415{\CTEXifname{\CTEXthechapter\quad}{}}3416\if@twoside3417\ctex_patch_cmd:Nnn\ps@headings3418{\ifnum\c@secnumdepth>\z@\thesection.
~\\fi}3419{\CTEXifname{\CTEXthesection\quad}{}}3420\fi:3421/book|report3422}3423{}3424}3425/article|book|report14.
8.
5beamer标题页模板的修改3426*beamer3427\ExplSyntaxOff对应\partpage.
3428\defbeamertemplate*{partpage}{CTEX}[1][]{%3429\begingroup3430%\centering3431%{\usebeamerfont{partname}%3432%\usebeamercolor[fg]{partname}\partname~\insertromanpartnumber}3433%\vskip1em\par3434\par\addvspace{\glueexpr\CTEX@part@beforeskip\relax}%3435\CTEX@heading@format@initial3436\CTEX@part@format{%3437\CTEX@indentbox{\CTEX@part@indent}%3438\ifodd\CTEX@part@numbering3439\CTEX@partname\CTEX@part@aftername3440\fi3441\begin{beamercolorbox}[sep=16pt,center,#1]{parttitle}3442%\usebeamerfont{parttitle}\insertpart\par3443\CTEX@part@titleformat\insertpart\CTEX@part@aftertitle3444\end{beamercolorbox}}%3445\par\addvspace{\glueexpr\CTEX@part@afterskip\relax}%3446\endgroup}对应\sectionpage.
3447\defbeamertemplate*{sectionpage}{CTEX}[1][]{%3448\begingroup3449%\centering3450%{\usebeamerfont{sectionname}%3451%\usebeamercolor[fg]{sectionname}\sectionname~\insertsectionnumber}3452%\vskip1em\par3453\par\addvspace{\glueexpr\CTEX@section@beforeskip\relax}%3454\CTEX@heading@format@initial3455\CTEX@section@format{%3456\CTEX@indentbox{\CTEX@section@indent}%3457\ifodd\CTEX@section@numbering3458\CTEX@sectionname\CTEX@section@aftername3459\fi3460\begin{beamercolorbox}[sep=12pt,center,#1]{parttitle}3461%\usebeamerfont{sectiontitle}\insertsection\par3462\CTEX@section@titleformat\insertsection\CTEX@section@aftertitle3463\end{beamercolorbox}}%3464\par\addvspace{\glueexpr\CTEX@section@afterskip\relax}%第14节代码实现1083465\endgroup}对应\subsectionpage.
3466\defbeamertemplate*{subsectionpage}{CTEX}[1][]{%3467\begingroup3468%\centering3469%{\usebeamerfont{subsectionname}%3470%\usebeamercolor[fg]{subsectionname}\subsectionname~\insertsubsectionnumber}3471%\vskip1em\par3472\par\addvspace{\glueexpr\CTEX@subsection@beforeskip\relax}%3473\CTEX@heading@format@initial3474\CTEX@subsection@format{%3475\CTEX@indentbox{\CTEX@subsection@indent}%3476\ifodd\CTEX@subsection@numbering3477\CTEX@subsectionname\CTEX@subsection@aftername3478\fi3479\begin{beamercolorbox}[sep=8pt,center,#1]{parttitle}3480%\usebeamerfont{subsectiontitle}\insertsubsection\par3481\CTEX@subsection@titleformat\insertsubsection\CTEX@subsection@aftertitle3482\end{beamercolorbox}}%3483\par\addvspace{\glueexpr\CTEX@subsection@afterskip\relax}%3484\endgroup}将beamer的默认模板重定向为CTEX模板.
3485\defbeamertemplatealias{partpage}{default}{CTEX}3486\defbeamertemplatealias{sectionpage}{default}{CTEX}3487\defbeamertemplatealias{subsectionpage}{default}{CTEX}3488\ExplSyntaxOn3489/beamer14.
8.
6标题编号和目录的层次设置secnumdepthtocdepthsecnumdepth在beamer下无意义.
3490\ctex_define:n3491{3492*!
beamer3493secnumdepth.
code:n=\ctex_heading_depth:ne{secnumdepth}{#1},3494secnumdepth.
value_required:n=true,3495/!
beamer3496tocdepth.
code:n=\ctex_heading_depth:ne{tocdepth}{#1},3497tocdepth.
value_required:n=true3498}\ctex_heading_depth:nn注意此处\setcounter的赋值是全局的.
3499\cs_new_protected:Npn\ctex_heading_depth:nn#1#23500{3501\prop_get:NnNTF\c__ctex_heading_level_prop{#2}\l__ctex_tmp_tl3502{\setcounter{#1}{\l__ctex_tmp_tl}}3503{\setcounter{#1}{\int_eval:n{#2}}}3504}3505\cs_generate_variant:Nn\ctex_heading_depth:nn{ne}\c__ctex_heading_level_prop章节层次与名称的对应表.
3506\prop_const_from_keyval:Nn\c__ctex_heading_level_prop3507{3508*article|beamer3509part=0,3510/article|beamer3511*book|report3512part=-1,3513chapter=0,3514/book|report第14节代码实现1093515section=1,3516subsection=2,3517subsubsection=3,3518paragraph=4,3519subparagraph=53520}14.
8.
7标签引用数字的汉化\refstepcounter对标题进行引用时,设置标签为通过number选项设置的形式.
3521\cs_new_protected:Npn\CTEX@setcurrentlabel@n#13522{3523\protected@edef\@currentlabel3524{3525\cs_if_exist:cTF{CTEX@the#1}3526{\exp_args:cc{p@#1}{CTEX@the#1}}3527{\exp_not:o{\@currentlabel}}3528}3529}\ctex_varioref_hook:关于标签引用的宏包可能会修改\refstepcounter.
其中cleveref和hyperref宏包都会保存之前的定义,并且它们都要求尽可能晚的被载入,所以对我们上述的修改影响不大.
需要注意的是varioref宏包,如果它在CTEX之后被载入,我们之前的修改将会被覆盖.
较新版LATEX内核已经包含\labelformat,可以直接使用.
3530\cs_new_protected:Npn\ctex_varioref_hook:3531{3532\seq_map_inline:Nn\c__ctex_headings_seq3533{\ctex_fix_varioref_label:n{##1}}3534\ctex_at_end_package:nn{cleveref}{\ctex_cleveref_hook:}3535}\ctex_fix_varioref_label:nvarioref宏包的\labelformat实际上是定义一个以\the为参数的宏\p@.
LATEX在定义计数器时,都会将\p@初始化为\@empty.
如果这个宏非空,说明用户自定义了标签格式,我们就不再修改.
这里不能使用\exp_args:Nnc,因为c这种展开格式不会将参数放在花括号内.
而\labelformat的定义是\def\labelformat#1{\expandafter\def\csnamep@#1\endcsname##1}它的第二个参数必须放在花括号内,否则将会被作为宏的定界符号.
3536\cs_new_protected:Npn\ctex_fix_varioref_label:n#13537{3538\tl_if_empty:cT{p@#1}3539{\exp_args:Nnx\labelformat{#1}{\exp_not:c{CTEX@the#1}}}3540}\ctex_cleveref_hook:\__ctex_cleveref_hook_aux:N需要将cleveref包对应命令中\p@counter的参数及时展开,以兼容\labelformat.
3541\cs_new_protected:Npn\ctex_cleveref_hook:3542{3543\@ifpackageloaded{hyperref}3544{\__ctex_cleveref_hook_aux:N\H@refstepcounter}3545{3546\__ctex_cleveref_hook_aux:N\refstepcounter@noarg3547\__ctex_cleveref_hook_aux:N\refstepcounter@optarg3548}3549\__ctex_cleveref_hook_aux:N\appendix3550}3551\cs_new_protected:Npn\__ctex_cleveref_hook_aux:N#13552{3553\ctex_patch_cmd_all:NnnnTF#1第14节代码实现1103554{3555\ExplSyntaxOff3556\char_set_catcode_letter:n{64}3557}3558{\endcsname\csnamethe}3559{\expandafter\endcsname\csnamethe}3560{}3561{\ctex_patch_failure:N#1}3562}如果varioref已经被载入,则使用它来设置.
3563\cs_if_exist:NTF\labelformat3564{\ctex_varioref_hook:}3565{3566\cs_new_eq:NN\CTEX@save@refstepcounter\refstepcounter3567\RenewDocumentCommand\refstepcounter{m}3568{3569\CTEX@save@refstepcounter{#1}3570\CTEX@setcurrentlabel@n{#1}3571}3572\ctex_at_end_package:nn{varioref}{\ctex_varioref_hook:}3573}14.
8.
8载入scheme文件3574\ctex_scheme_input:o{\l__ctex_scheme_tl}3575/class|heading14.
8.
9标题格式的scheme定义下面使用CTEX文档类的设置方式,plain模拟标准文档类直接定义或以\@startsection设定的章节标题格式,chinese汉化的标题格式.
3576*scheme&(article|book|report|beamer)3577\ctex_set:nn{part}3578{3579aftertitle=\par,3580*article|book|report3581hang=false,3582/article|book|report3583*plain3584name=\partname\space,3585*article|book|report3586number=\thepart,3587/article|book|report3588*beamer3589number=\insertromanpartnumber,3590/beamer3591/plain3592*chinese3593number=\chinese{part},3594/chinese3595*article3596beforeskip=4ex,3597afterskip=3ex,3598*plain3599format=\raggedright,3600nameformat=\Large\bfseries,3601aftername=\par\nobreak,3602titleformat=\huge\bfseries,3603afterindent=false3604/plain3605*chinese第14节代码实现1113606format=\Large\bfseries\centering,3607aftername=\quad,3608afterindent=true3609/chinese3610/article3611*book|report3612aftername=\par\vskip20\p@,3613beforeskip=0pt\@plus1fil,3614afterskip=0pt\@plus1fil,3615pagestyle=plain,3616break=\if@openright\cleardoublepage\else\clearpage\fi,3617*plain3618format=\centering,3619nameformat=\huge\bfseries,3620titleformat=\Huge\bfseries3621/plain3622*chinese3623format=\huge\bfseries\centering3624/chinese3625/book|report3626*beamer3627format=\centering,3628nameformat=\usebeamerfont{part~name}3629\usebeamercolor[fg]{part~name},3630aftername=\vskip1em\par,3631titleformat=\usebeamerfont{part~title}3632/beamer3633}3634*book|report3635\ctex_set:nn{chapter}3636{3637pagestyle=plain,3638aftertitle=\par,3639hang=false,3640beforeskip=50\p@,3641afterskip=40\p@,3642lofskip=10\p@,3643lotskip=10\p@,3644break=\if@openright\cleardoublepage\else\clearpage\fi,3645*plain3646name=\chaptername\space,3647number=\thechapter,3648format=\raggedright,3649nameformat=\huge\bfseries,3650aftername=\par\nobreak\vskip20\p@,3651titleformat=\Huge\bfseries,3652afterindent=false,3653tocline=\CTEXnumberline{#1}#23654/plain3655*chinese3656number=\chinese{chapter},3657format=\huge\bfseries\centering,3658aftername=\quad,3659afterindent=true3660/chinese3661}3662/book|report3663\ctex_set:nn{section}3664{3665*article|book|report3666number=\thesection,3667aftername=\quad,3668aftertitle=\@@par,3669beforeskip=3.
5ex\@plus1ex\@minus.
2ex,3670afterskip=2.
3ex\@plus.
2ex,3671runin=false,第14节代码实现1123672break=\addpenalty\@secpenalty,3673*plain3674format=\Large\bfseries,3675afterindent=false3676/plain3677*chinese3678format=\Large\bfseries\centering,3679afterindent=true3680/chinese3681/article|book|report3682*beamer3683*plain3684name=\sectionname\space,3685/plain3686format=\centering,3687number=\insertsectionnumber,3688nameformat=\usebeamerfont{section~name}3689\usebeamercolor[fg]{section~name},3690aftername=\vskip1em\par,3691titleformat=\usebeamerfont{section~title},3692aftertitle=\par3693/beamer3694}3695\ctex_set:nn{subsection}3696{3697*article|book|report3698number=\thesubsection,3699format=\large\bfseries,3700aftername=\quad,3701aftertitle=\@@par,3702beforeskip=3.
25ex\@plus1ex\@minus.
2ex,3703afterskip=1.
5ex\@plus.
2ex,3704runin=false,3705break=\addpenalty\@secpenalty,3706*plain3707afterindent=false3708/plain3709*chinese3710afterindent=true3711/chinese3712/article|book|report3713*beamer3714*plain3715name=\subsectionname\space,3716number=\insertsubsectionnumber,3717/plain3718*chinese3719number=\arabic{section}.
\arabic{subsection},3720/chinese3721format=\centering,3722nameformat=\usebeamerfont{subsection~name}3723\usebeamercolor[fg]{subsection~name},3724aftername=\vskip1em\par,3725titleformat=\usebeamerfont{subsection~title},3726aftertitle=\par3727/beamer3728}3729*article|book|report3730\ctex_set:nn{subsubsection}3731{3732number=\thesubsubsection,3733format=\normalsize\bfseries,3734aftername=\quad,3735aftertitle=\@@par,3736beforeskip=3.
25ex\@plus1ex\@minus.
2ex,第14节代码实现1133737afterskip=1.
5ex\@plus.
2ex,3738runin=false,3739break=\addpenalty\@secpenalty,3740*plain3741afterindent=false3742/plain3743*chinese3744afterindent=true3745/chinese3746}3747\ctex_set:nn{paragraph}3748{3749number=\theparagraph,3750format=\normalsize\bfseries,3751aftername=\quad,3752beforeskip=3.
25ex\@plus1ex\@minus.
2ex,3753break=\addpenalty\@secpenalty,3754*plain3755afterindent=false3756/plain3757*chinese3758afterindent=true3759/chinese3760}3761\ctex_set:nn{subparagraph}3762{3763number=\thesubparagraph,3764format=\normalsize\bfseries,3765aftername=\quad,3766beforeskip=3.
25ex\@plus1ex\@minus.
2ex,3767break=\addpenalty\@secpenalty,3768*plain3769afterindent=false3770/plain3771*chinese3772afterindent=true3773/chinese3774}处理sub3section与sub4section的格式.
3775\int_compare:nNnTF\g__ctex_section_depth_int>23776{3777\ctex_set:nn{paragraph}3778{3779aftertitle=\@@par,3780afterskip=1ex\@plus.
2ex,3781runin=false3782}3783}3784{3785\ctex_set:nn{paragraph}3786{3787afterskip=1em,3788runin=true3789}3790}3791\int_compare:nNnTF\g__ctex_section_depth_int>33792{3793\ctex_set:nn{subparagraph}3794{3795aftertitle=\@@par,3796afterskip=1ex\@plus.
2ex,3797runin=false3798}3799}第14节代码实现1143800{3801\ctex_set:nn{subparagraph}3802{3803afterskip=1em,3804runin=true3805}3806}3807\int_compare:nNnTF\g__ctex_section_depth_int>23808{\ctex_set:nn{subparagraph}{indent=\c_zero_dim}}3809{\ctex_set:nn{subparagraph}{indent=\parindent}}处理附录的格式.
3810\ctex_set:nn{appendix}3811*article3812{number=\@Alph\c@section}3813/article3814*book|report3815{3816name=\appendixname\space,3817number=\@Alph\c@chapter3818}3819/book|report3820/article|book|report3821/scheme&(article|book|report|beamer)14.
8.
10ctex.
sty的heading选项3822*ctex|ctexheading\c__ctex_std_class_tl用于记录被引入的标准文档类.
3823\clist_map_inline:nn{article,book,report,beamer}3824{3825\@ifclassloaded{#1}3826{\clist_map_break:n{\tl_const:Nn\c__ctex_std_class_tl{#1}}}3827{}3828}若标准文档类被引入,则载入对应的标题定义文件.
否则视\chapter是否有定义来引入book或者article.
3829\msg_new:nnn{ctex}{not-standard-class}3830{3831None~of~the~standard~document~classes~was~loaded.
\\3832Heading~`#1'~is~selected.
\\3833ctex~may~not~work~as~expected.
3834}3835ctex\bool_if:NTF\l__ctex_heading_bool3836ctexheading\use:n3837{3838\tl_if_exist:NTF\c__ctex_std_class_tl3839{\cs_new_eq:NN\c__ctex_class_tl\c__ctex_std_class_tl}3840{3841\cs_if_exist:NTF\chapter3842{3843\cs_if_exist:NF\if@mainmatter3844{\cs_new_eq:NN\if@mainmatter\tex_iftrue:D}3845\tl_const:Nn\c__ctex_class_tl{book}3846}3847{\tl_const:Nn\c__ctex_class_tl{article}}3848\msg_warning:nnx{ctex}{not-standard-class}{\c__ctex_class_tl}3849}3850\ctex_file_input:n{ctex-heading-\c__ctex_class_tl.
def}3851}3852ctex{\ctex_scheme_input:o{\l__ctex_scheme_tl}}第14节代码实现1153853/ctex|ctexheading14.
8.
11标题配置文件3854*name3855\keys_set_known:nn{ctex}3856{3857contentsname=目录,3858listfigurename=插图,3859listtablename=表格,3860figurename=图,3861tablename=表,3862abstractname=摘要,3863indexname=索引,3864bibname=参考文献,3865appendixname=附录,3866proofname=证明,3867algorithmname=算法,3868refname=参考文献,3869continuation=(续),3870part/name={第,部分},3871chapter/name={第,章}3872}3873/name14.
9chinese方案的其他设置3874*scheme&chinesechinese在标准文档类下的页面格式总采用headings.
3875article|book|report\pagestyle{headings}日期格式.
3876\ctex_set:n{today=small}若用户未设置宏包选项autoindent,则自动调整首行缩进.
3877\ctex_if_autoindent_touched:F3878{\ctex_set:n{autoindent=true}}使用标题定义时的设置.
首先是命题名字汉化.
beamer需要汉化定理名称.
3879*!
generic3880\str_if_eq:onTF{\g__ctex_encoding_tl}{GBK}3881*beamer3882{3883\uselanguage{ChineseGBK}3884\languagealias{chinese}{ChineseGBK}3885\ctex_file_input:n{ctex-name-gbk.
cfg}3886}3887{3888\uselanguage{ChineseUTF8}3889\languagealias{chinese}{ChineseUTF8}3890\ctex_file_input:n{ctex-name-utf8.
cfg}3891}让translator包优先查找中文翻译.
3892\clist_put_left:Nn\trans@languagepath{chinese}3893/beamer3894*!
beamer3895{\ctex_file_input:n{ctex-name-gbk.
cfg}}3896{\ctex_file_input:n{ctex-name-utf8.
cfg}}对beamer以外的文档类,若用户未设置宏包选项zihao,则设置\normalsize为五号字.
beamer不调整默认字体大小.
第14节代码实现1163897\int_compare:nNnF\g__ctex_font_size_int>{-1}3898{\int_gset:Nn\g__ctex_font_size_int{0}}对beamer以外的文档类,若用户未设置宏包选项linespread,则设置行距初始值为1.
3*1.
2=1.
56倍字体大小.
beamer不调整行距.
3899\fp_if_nan:nT{\l__ctex_line_spread_fp}3900{\fp_set:Nn\l__ctex_line_spread_fp{1.
3}}3901/!
beamer3902/!
generic不使用标题定义时的通用设置,注意此处\c__ctex_std_class_tl可能没有定义.
3903*generic3904\tl_set:Nn\l__ctex_tmp_tl{beamer}3905\tl_if_eq:NNTF\c__ctex_std_class_tl\l__ctex_tmp_tl3906{3907\str_if_eq:onTF{\g__ctex_encoding_tl}{GBK}3908{3909\uselanguage{ChineseGBK}3910\languagealias{chinese}{ChineseGBK}3911\ctex_file_input:n{ctex-name-gbk.
cfg}3912}3913{3914\uselanguage{ChineseUTF8}3915\languagealias{chinese}{ChineseUTF8}3916\ctex_file_input:n{ctex-name-utf8.
cfg}3917}3918\clist_put_left:Nn\trans@languagepath{chinese}3919}3920{3921\str_if_eq:onTF{\g__ctex_encoding_tl}{GBK}3922{\ctex_file_input:n{ctex-name-gbk.
cfg}}3923{\ctex_file_input:n{ctex-name-utf8.
cfg}}3924\int_compare:nNnF\g__ctex_font_size_int>{-1}3925{\int_gset:Nn\g__ctex_font_size_int{0}}3926\fp_if_nan:nT{\l__ctex_line_spread_fp}3927{\fp_set:Nn\l__ctex_line_spread_fp{1.
3}}若ctex宏包与标准文档类及其衍生文档类联用,则将载入indentfirst宏包,实现章节标题后首个段落的段首缩进.
3928\tl_if_exist:NT\c__ctex_std_class_tl3929{\RequirePackage{indentfirst}}3930}3931/generic3932/scheme&chinese14.
10中文字号3933*class|ctex|ctexsize3934\NewDocumentCommand\zihao{m}3935{\exp_args:Nx\ctex_zihao:n{#1}\tex_ignorespaces:D}3936\cs_new_protected:Npn\ctex_zihao:n#13937{3938\prop_get:NnNTF\c__ctex_font_size_prop{#1}\l__ctex_font_size_tl3939{\exp_after:wN\fontsize\l__ctex_font_size_tl\selectfont}3940{\msg_error:nnn{ctex}{fontsize}{#1}}3941}3942\msg_new:nnnn{ctex}{fontsize}3943{Undefined~Chinese~font~size~`#1'~in~command~\token_to_str:N\zihao.
}3944{3945The~old~font~size~is~used~if~you~continue.
\\3946The~available~font~sizes~are~listed~as~follow.
\\3947\seq_use:Nnnn\c__ctex_font_size_seq{~and~and~}.
3948}第14节代码实现11714.
10.
1定义中文字号\c__ctex_font_size_prop\__ctex_save_font_size:nn基础行距是字号的1.
2倍,采用-TEX的scaling运算得到的结果要比简单的1.
2\dimexpr精确20.
3949\prop_new:N\c__ctex_font_size_prop3950\seq_new:N\c__ctex_font_size_seq3951\cs_new_protected:Npn\__ctex_save_font_size:nn#1#23952{3953\use:x3954{3955\prop_gput:Nnn\exp_not:N\c__ctex_font_size_prop{#1}3956{3957{\dim_to_decimal:n{#2}}3958{\dim_to_decimal:n{(#2)*6/5}}3959}3960}3961\seq_gput_right:Nn\c__ctex_font_size_seq{#1}3962}3963\clist_map_inline:nn3964{3965{8}{5bp},3966{7}{5.
5bp},3967{-6}{6.
5bp},3968{6}{7.
5bp},3969{-5}{9bp},3970{5}{10.
5bp},3971{-4}{12bp},3972{4}{14bp},3973{-3}{15bp},3974{3}{16bp},3975{-2}{18bp},3976{2}{22bp},3977{-1}{24bp},3978{1}{26bp},3979{-0}{36bp},3980{0}{42bp}3981}3982{\__ctex_save_font_size:nn#1}3983\cs_new_protected:Npn\ctex_declare_math_sizes:nnnn#1#2#3#43984{3985\__ctex_get_font_sizes:Nn\l__ctex_font_size_tl{{#1}{#2}{#3}{#4}}3986\exp_after:wN\DeclareMathSizes\l__ctex_font_size_tl3987}3988\cs_new_protected:Npn\__ctex_get_font_sizes:Nn#1#23989{3990\tl_clear:N#13991\tl_map_inline:nn{#2}3992{3993\prop_get:NnNTF\c__ctex_font_size_prop{##1}\l__ctex_tmp_tl3994{\tl_put_right:Nx#1{{\tl_head:N\l__ctex_tmp_tl}}}3995{\tl_put_right:Nx#1{{\dim_to_decimal:n{##1}}}}3996}3997}3998\clist_map_inline:nn3999{4000{8}{8}{5pt}{5pt},4001{7}{7}{5pt}{5pt},4002{-6}{-6}{5pt}{5pt},4003{6}{6}{5pt}{5pt},4004{-5}{-5}{6pt}{5pt},4005{5}{5}{7pt}{5pt},20http://thread.
gmane.
org/gmane.
comp.
tex.
latex.
latex3/3190第14节代码实现1184006{-4}{-4}{8pt}{6pt},4007{4}{4}{5}{6},4008{-3}{-3}{-4}{-5},4009{3}{3}{4}{5},4010{-2}{-2}{-3}{-4},4011{2}{2}{3}{4},4012{-1}{-1}{-2}{-3},4013{1}{1}{2}{3},4014{-0}{-0}{-1}{-2},4015{0}{0}{1}{2}4016}4017{\ctex_declare_math_sizes:nnnn#1}14.
10.
2修改默认字号大小4018\cs_new_protected:Npn\ctex_set_font_size:Nnn#1#2#34019{4020\prop_get:NnNTF\c__ctex_font_size_prop{#2}\l__ctex_font_size_tl4021{\exp_after:wN\__ctex_set_font_size:nnNn\l__ctex_font_size_tl#1{#3}}4022{\msg_error:nnn{ctex}{fontsize}{#2}}4023}4024\cs_new_protected:Npn\__ctex_set_font_size:nnNn#1#2#3#44025{\cs_set_protected:Npn#3{\@setfontsize#3{#1}{#2}#4}}4026\int_case:nn{\g__ctex_font_size_int}4027{4028{0}{\ctex_file_input:n{ctex-c5size.
clo}}4029{1}{\ctex_file_input:n{ctex-cs4size.
clo}}4030}4031/class|ctex|ctexsize4032*c5size4033\ctex_set_font_size:Nnn\normalsize{5}4034{4035\abovedisplayskip10\p@\@plus2\p@\@minus5\p@4036\abovedisplayshortskip\z@\@plus3\p@4037\belowdisplayshortskip6\p@\@plus3\p@\@minus3\p@4038\belowdisplayskip\abovedisplayskip4039\let\@listi\@listI4040}4041\ctex_set_font_size:Nnn\small{-5}4042{4043\abovedisplayskip8.
5\p@\@plus3\p@\@minus4\p@4044\abovedisplayshortskip\z@\@plus2\p@4045\belowdisplayshortskip4\p@\@plus2\p@\@minus2\p@4046\def\@listi{\leftmargin\leftmargini4047\topsep4\p@\@plus2\p@\@minus2\p@4048\parsep2\p@\@plus\p@\@minus\p@4049\itemsep\parsep}4050\belowdisplayskip\abovedisplayskip4051}4052\ctex_set_font_size:Nnn\footnotesize{6}4053{4054\abovedisplayskip6\p@\@plus2\p@\@minus4\p@4055\abovedisplayshortskip\z@\@plus\p@4056\belowdisplayshortskip3\p@\@plus\p@\@minus2\p@4057\def\@listi{\leftmargin\leftmargini4058\topsep3\p@\@plus\p@\@minus\p@4059\parsep2\p@\@plus\p@\@minus\p@4060\itemsep\parsep}4061\belowdisplayskip\abovedisplayskip4062}4063\ctex_set_font_size:Nnn\scriptsize{-6}{}4064\ctex_set_font_size:Nnn\tiny{7}{}4065\ctex_set_font_size:Nnn\large{-4}{}4066\ctex_set_font_size:Nnn\Large{-3}{}第14节代码实现1194067\ctex_set_font_size:Nnn\LARGE{-2}{}4068\ctex_set_font_size:Nnn\huge{2}{}4069\ctex_set_font_size:Nnn\Huge{1}{}4070/c5size4071*cs4size4072\ctex_set_font_size:Nnn\normalsize{-4}4073{4074\abovedisplayskip12\p@\@plus3\p@\@minus7\p@4075\abovedisplayshortskip\z@\@plus3\p@4076\belowdisplayshortskip6.
5\p@\@plus3.
5\p@\@minus3\p@4077\belowdisplayskip\abovedisplayskip4078\let\@listi\@listI4079}4080\ctex_set_font_size:Nnn\small{5}4081{4082\abovedisplayskip11\p@\@plus3\p@\@minus6\p@4083\abovedisplayshortskip\z@\@plus3\p@4084\belowdisplayshortskip6.
5\p@\@plus3.
5\p@\@minus3\p@4085\def\@listi{\leftmargin\leftmargini4086\topsep9\p@\@plus3\p@\@minus5\p@4087\parsep4.
5\p@\@plus2\p@\@minus\p@4088\itemsep\parsep}4089\belowdisplayskip\abovedisplayskip4090}4091\ctex_set_font_size:Nnn\footnotesize{-5}4092{4093\abovedisplayskip10\p@\@plus2\p@\@minus5\p@4094\abovedisplayshortskip\z@\@plus3\p@4095\belowdisplayshortskip6\p@\@plus3\p@\@minus3\p@4096\def\@listi{\leftmargin\leftmargini4097\topsep6\p@\@plus2\p@\@minus2\p@4098\parsep3\p@\@plus2\p@\@minus\p@4099\itemsep\parsep}4100\belowdisplayskip\abovedisplayskip4101}4102\ctex_set_font_size:Nnn\scriptsize{6}{}4103\ctex_set_font_size:Nnn\tiny{-6}{}4104\ctex_set_font_size:Nnn\large{-3}{}4105\ctex_set_font_size:Nnn\Large{-2}{}4106\ctex_set_font_size:Nnn\LARGE{2}{}4107\ctex_set_font_size:Nnn\huge{-1}{}4108\ctex_set_font_size:Nnn\Huge{1}{}4109/cs4size4110ctexsize\normalsize4111*class|ctex14.
11更新行距\l__ctex_line_spread_fp被设置了才有必要更新行距和\footnotesep.
4112\fp_if_nan:nF{\l__ctex_line_spread_fp}4113{4114\exp_args:Nx\linespread{\fp_use:N\l__ctex_line_spread_fp}\footnotesep我们调整了行距,可能导致脚注的间距与行距不协调,需要调整\footnotesep.
标准文档类对\footnotesep的设置是,字体大小为\footnotesize时\strutbox的高度(默认值是.
7\baselineskip).
我们沿用这个设置方法,只需要更新具体的大小.
4115\group_begin:\footnotesize\exp_args:NNNo\group_end:4116\dim_set:Nn\footnotesep{\dim_use:N\box_ht:N\strutbox}4117}激活默认字体大小,更新行距、\parindent和\CJKglue.
4118\normalsize第14节代码实现12014.
12其他功能\CTeXctex-faq.
sty中的定义是\DeclareRobustCommand\CTeX{$\mathbb{C}$\kern-.
05em\TeX}然而\mathbb未必有定义,这里就不采用它了,只定义最简单的形式.
CTEX可以直接用在PDF书签中.
4119\NewDocumentCommand\CTeX{}4120{C\TeX}4121\ctex_at_end_package:nn{hyperref}4122{\pdfstringdefDisableCommands{\tl_set:Nn\CTeX{CTeX}}}captiondelimiter过时选项.
4123\ctex_define:n4124{4125captiondelimiter.
code:n=4126{4127\ctex_deprecated_option:n4128{You~can~load~the~package~`caption'~to~get~its~functionality.
}4129}4130}4131/class|ctex14.
12.
1列表环境的缩进\verse\quotation只在使用文档类的时候修改诗歌和引用环境的缩进.
4132*scheme&chinese&(article|book|report)4133\ctex_patch_cmd:Nnn\verse{-1.
5em}{-2\ccwd}4134\ctex_patch_cmd:Nnn\verse{1.
5em}{2\ccwd}4135\ctex_patch_cmd:Nnn\quotation{1.
5em}{2\ccwd}4136/scheme&chinese&(article|book|report)4137*class|ctex14.
13载入中文字库\ctex_fontset_error:n字库不可用时给出紧急错误信息,停止读取定义文件.
4138\cs_new_protected:Npn\ctex_fontset_error:n#14139{\msg_critical:nnn{ctex}{fontset-unavailable}{#1}}4140\msg_new:nnn{ctex}{fontset-unavailable}4141{CTeX~fontset~`#1'~is~unavailable~in~current~mode.
}\ctex_fontset_case:nnn3个参数依次为pdfTEX、upTEX和XTEX/LuaTEX.
4142\cs_new:Npx\ctex_fontset_case:nnn#1#2#34143{4144\sys_if_engine_pdftex:TF4145{#1}4146{\sys_if_engine_uptex:TF{#2}{#3}}4147}\ctex_fontset_case:nnnn4个参数依次为pdfTEX(生成PDF)、pdfTEX(生成DVI)、upTEX和XTEX/LuaTEX.
4148\cs_new:Npx\ctex_fontset_case:nnnn#1#2#3#44149{4150\sys_if_engine_pdftex:TF4151{\sys_if_output_pdf:TF{#1}{#2}}4152{\sys_if_engine_uptex:TF{#3}{#4}}4153}第14节代码实现121\ctex_detect_platform:根据操作系统判断默认字体配置.
4154\cs_new_protected:Npn\ctex_detect_platform:4155{4156\sys_if_platform_windows:TF4157{\tl_gset:Nn\g__ctex_fontset_tl{windows}}4158{4159\ctex_if_platform_macos:TF4160{\tl_gset:Nn\g__ctex_fontset_tl{mac}}4161{\tl_gset:Nn\g__ctex_fontset_tl{fandol}}4162}4163}\ctex_if_platform_macos:TF以特定字体判断macOS系统.
4164\cs_new_protected:Npn\ctex_if_platform_macos:TF4165{\file_if_exist:nTF{/System/Library/Fonts/Menlo.
ttc}}\ctex_load_fontset:如果用户没有指定字体,则探测操作系统,载入相应的字体配置.
4166\cs_new_protected:Npn\ctex_load_fontset:4167{4168\tl_if_empty:NTF\g__ctex_fontset_tl4169{\ctex_detect_platform:}4170{4171\bool_lazy_or:nnTF4172{\str_if_eq_p:on{\g__ctex_fontset_tl}{windowsnew}}4173{\str_if_eq_p:on{\g__ctex_fontset_tl}{windowsold}}4174{4175\msg_warning:nnxx{ctex}{deprecated-fontset}4176{\g__ctex_fontset_tl}{windows}4177\tl_gset:Nn\g__ctex_fontset_tl{windows}4178}4179{4180\file_if_exist:nF{ctex-fontset-\g__ctex_fontset_tl.
def}4181{4182\use:x4183{4184\ctex_detect_platform:4185\msg_error:nnxx{ctex}{fontset-not-found}4186{\g__ctex_fontset_tl}{\exp_not:N\g__ctex_fontset_tl}4187}4188}4189}4190}4191\ctex_file_input:n{ctex-fontset-\g__ctex_fontset_tl.
def}4192}4193\msg_new:nnn{ctex}{deprecated-fontset}4194{CTeX~fontset~`#1'~is~deprecated.
\\Fontset~`#2'~will~be~used~instead.
}4195\msg_new:nnnn{ctex}{fontset-not-found}4196{CTeX~fontset~`#1'~could~not~be~found.
\\Fontset~`#2'~will~be~used~instead.
}4197{You~may~run~`mktexlsr'~firstly.
}4198\@onlypreamble\ctex_load_fontset:fontset在导言区通过\ctexset载入中文字库的选项.
4199\ctex_define:n4200{4201fontset.
code:n=4202{4203\ctex_if_preamble:TF4204{4205\str_if_eq:eeTF{#1}{none}4206{\msg_warning:nnn{ctex}{invalid-value}{#1}}4207{4208\str_if_eq:onTF{\g__ctex_fontset_tl}{none}4209{第14节代码实现1224210\tl_gset:Nx\g__ctex_fontset_tl{#1}4211\ctex_load_fontset:4212}4213{4214\msg_error:nnxx{ctex}{fontset-loaded}4215{\g__ctex_fontset_tl}{#1}4216}4217}4218}4219{\msg_error:nn{ctex}{fontset-only-preamble}}4220}4221}4222\msg_new:nnnn{ctex}{fontset-loaded}4223{4224CTeX~fontset~`#1'~has~been~loaded.
4225\str_if_eq:nnF{#1}{#2}{\\Fontset~`#2'~will~be~ignored.
}4226}4227{Only~one~fontset~can~be~loaded~in~the~preamble.
}4228\msg_new:nnn{ctex}{fontset-only-preamble}4229{The~`fontset'~option~can~be~used~only~in~preamble.
}载入中文字库.
4230\str_if_eq:onF{\g__ctex_fontset_tl}{none}4231{\ctex_load_fontset:}14.
14宏包配置文件14.
14.
1ctex.
cfg4232\ctex_at_end:n{\ctex_file_input:n{ctex.
cfg}}4233/class|ctex4234*config4235%%4236/config14.
14.
2ctexopts.
cfg这里仅为配置文件示例:使用Windows下的字体设置.
4237*ctexopts4238%%4239%%\ctex_set:nn{option}{fontset=windows}4240/ctexopts14.
15字体定义文件14.
15.
1传统定义方式4241*c19|c704242%%4243%%Chinesecharacters4244%%4245c19%%characterset:GBK(extensionofGB2312)4246c70%%characterset:Unicode4247%%fontencoding:Unicode4248%%4249/c19|c70CJK宏包使用的字体族.
4250rm&c19\DeclareFontFamily{C19}{rm}{\hyphenchar\font\m@ne}4251rm&c70\DeclareFontFamily{C70}{rm}{\hyphenchar\font\m@ne}第14节代码实现1234252sf&c19\DeclareFontFamily{C19}{sf}{\hyphenchar\font\m@ne}4253sf&c70\DeclareFontFamily{C70}{sf}{\hyphenchar\font\m@ne}4254tt&c19\DeclareFontFamily{C19}{tt}{\hyphenchar\font\m@ne}4255tt&c70\DeclareFontFamily{C70}{tt}{\hyphenchar\font\m@ne}upLATEX使用的字体族.
upLATEX在NFSS下使用字体编码JY2和JT2来分别表示横排与直排的日文.
4256rm&jy2\DeclareKanjiFamily{JY2}{zhrm}{}4257rm&jt2\DeclareKanjiFamily{JT2}{zhrm}{}4258sf&jy2\DeclareKanjiFamily{JY2}{zhsf}{}4259sf&jt2\DeclareKanjiFamily{JT2}{zhsf}{}4260tt&jy2\DeclareKanjiFamily{JY2}{zhtt}{}4261tt&jt2\DeclareKanjiFamily{JT2}{zhtt}{}4262*rm4263*c194264\DeclareFontShape{C19}{rm}{m}{n}{CJK*gbksong}{\CJKnormal}4265\DeclareFontShape{C19}{rm}{b}{n}{CJK*gbkhei}{\CJKnormal}4266\DeclareFontShape{C19}{rm}{bx}{n}{CJK*gbkhei}{\CJKnormal}4267\DeclareFontShape{C19}{rm}{m}{sl}{CJK*gbksongsl}{\CJKnormal}4268\DeclareFontShape{C19}{rm}{b}{sl}{CJK*gbkheisl}{\CJKnormal}4269\DeclareFontShape{C19}{rm}{bx}{sl}{CJK*gbkheisl}{\CJKnormal}4270\DeclareFontShape{C19}{rm}{m}{it}{CJK*gbkkai}{\CJKnormal}4271\DeclareFontShape{C19}{rm}{b}{it}{CJKb*gbkkai}{\CJKbold}4272\DeclareFontShape{C19}{rm}{bx}{it}{CJKb*gbkkai}{\CJKbold}4273/c194274*c704275\DeclareFontShape{C70}{rm}{m}{n}{CJK*unisong}{\CJKnormal}4276\DeclareFontShape{C70}{rm}{b}{n}{CJK*unihei}{\CJKnormal}4277\DeclareFontShape{C70}{rm}{bx}{n}{CJK*unihei}{\CJKnormal}4278\DeclareFontShape{C70}{rm}{m}{sl}{CJK*unisongsl}{\CJKnormal}4279\DeclareFontShape{C70}{rm}{b}{sl}{CJK*uniheisl}{\CJKnormal}4280\DeclareFontShape{C70}{rm}{bx}{sl}{CJK*uniheisl}{\CJKnormal}4281\DeclareFontShape{C70}{rm}{m}{it}{CJK*unikai}{\CJKnormal}4282\DeclareFontShape{C70}{rm}{b}{it}{CJKb*unikai}{\CJKbold}4283\DeclareFontShape{C70}{rm}{bx}{it}{CJKb*unikai}{\CJKbold}4284/c704285*jy24286\DeclareFontShape{JY2}{zhrm}{m}{n}{upzhserif-h}{}4287\DeclareFontShape{JY2}{zhrm}{m}{it}{upzhserifit-h}{}4288\DeclareFontShape{JY2}{zhrm}{b}{n}{upzhserifb-h}{}4289\DeclareFontShape{JY2}{zhrm}{bx}{n}{upzhserifb-h}{}4290/jy24291*jt24292\DeclareFontShape{JT2}{zhrm}{m}{n}{upzhserif-v}{}4293\DeclareFontShape{JT2}{zhrm}{m}{it}{upzhserifit-v}{}4294\DeclareFontShape{JT2}{zhrm}{b}{n}{upzhserifb-v}{}4295\DeclareFontShape{JT2}{zhrm}{bx}{n}{upzhserifb-v}{}4296/jt24297/rm4298*sf4299*c194300\DeclareFontShape{C19}{sf}{m}{n}{CJK*gbkyou}{\CJKnormal}4301\DeclareFontShape{C19}{sf}{b}{n}{CJKb*gbkyou}{\CJKbold}4302\DeclareFontShape{C19}{sf}{bx}{n}{CJKb*gbkyou}{\CJKbold}4303\DeclareFontShape{C19}{sf}{m}{sl}{CJK*gbkyousl}{\CJKnormal}4304\DeclareFontShape{C19}{sf}{b}{sl}{CJKb*gbkyousl}{\CJKbold}4305\DeclareFontShape{C19}{sf}{bx}{sl}{CJKb*gbkyousl}{\CJKbold}4306\DeclareFontShape{C19}{sf}{m}{it}{CJK*gbkyou}{\CJKnormal}4307\DeclareFontShape{C19}{sf}{b}{it}{CJKb*gbkyou}{\CJKbold}4308\DeclareFontShape{C19}{sf}{bx}{it}{CJKb*gbkyou}{\CJKbold}4309/c194310*c704311\DeclareFontShape{C70}{sf}{m}{n}{CJK*uniyou}{\CJKnormal}4312\DeclareFontShape{C70}{sf}{b}{n}{CJKb*uniyou}{\CJKbold}4313\DeclareFontShape{C70}{sf}{bx}{n}{CJKb*uniyou}{\CJKbold}4314\DeclareFontShape{C70}{sf}{m}{sl}{CJK*uniyousl}{\CJKnormal}第14节代码实现1244315\DeclareFontShape{C70}{sf}{b}{sl}{CJKb*uniyousl}{\CJKbold}4316\DeclareFontShape{C70}{sf}{bx}{sl}{CJKb*uniyousl}{\CJKbold}4317\DeclareFontShape{C70}{sf}{m}{it}{CJK*uniyou}{\CJKnormal}4318\DeclareFontShape{C70}{sf}{b}{it}{CJKb*uniyou}{\CJKbold}4319\DeclareFontShape{C70}{sf}{bx}{it}{CJKb*uniyou}{\CJKbold}4320/c704321*jy24322\DeclareFontShape{JY2}{zhsf}{m}{n}{upzhsans-h}{}4323\DeclareFontShape{JY2}{zhsf}{b}{n}{upzhsansb-h}{}4324\DeclareFontShape{JY2}{zhsf}{bx}{n}{upzhsansb-h}{}4325/jy24326*jt24327\DeclareFontShape{JT2}{zhsf}{m}{n}{upzhsans-v}{}4328\DeclareFontShape{JT2}{zhsf}{b}{n}{upzhsansb-v}{}4329\DeclareFontShape{JT2}{zhsf}{bx}{n}{upzhsansb-v}{}4330/jt24331/sf4332*tt4333*c194334\DeclareFontShape{C19}{tt}{m}{n}{CJK*gbkfs}{\CJKnormal}4335\DeclareFontShape{C19}{tt}{b}{n}{CJKb*gbkfs}{\CJKbold}4336\DeclareFontShape{C19}{tt}{bx}{n}{CJKb*gbkfs}{\CJKbold}4337\DeclareFontShape{C19}{tt}{m}{sl}{CJK*gbkfssl}{\CJKnormal}4338\DeclareFontShape{C19}{tt}{b}{sl}{CJKb*gbkfssl}{\CJKbold}4339\DeclareFontShape{C19}{tt}{bx}{sl}{CJKb*gbkfssl}{\CJKbold}4340\DeclareFontShape{C19}{tt}{m}{it}{CJK*gbkfs}{\CJKnormal}4341\DeclareFontShape{C19}{tt}{b}{it}{CJKb*gbkfs}{\CJKbold}4342\DeclareFontShape{C19}{tt}{bx}{it}{CJKb*gbkfs}{\CJKbold}4343/c194344*c704345\DeclareFontShape{C70}{tt}{m}{n}{CJK*unifs}{\CJKnormal}4346\DeclareFontShape{C70}{tt}{b}{n}{CJKb*unifs}{\CJKbold}4347\DeclareFontShape{C70}{tt}{bx}{n}{CJKb*unifs}{\CJKbold}4348\DeclareFontShape{C70}{tt}{m}{sl}{CJK*unifssl}{\CJKnormal}4349\DeclareFontShape{C70}{tt}{b}{sl}{CJKb*unifssl}{\CJKbold}4350\DeclareFontShape{C70}{tt}{bx}{sl}{CJKb*unifssl}{\CJKbold}4351\DeclareFontShape{C70}{tt}{m}{it}{CJK*unifs}{\CJKnormal}4352\DeclareFontShape{C70}{tt}{b}{it}{CJKb*unifs}{\CJKbold}4353\DeclareFontShape{C70}{tt}{bx}{it}{CJKb*unifs}{\CJKbold}4354/c704355*jy24356\DeclareFontShape{JY2}{zhtt}{m}{n}{upzhmono-h}{}4357/jy24358*jt24359\DeclareFontShape{JT2}{zhtt}{m}{n}{upzhmono-v}{}4360/jt24361/tt14.
15.
2预定义字库4362*fontset14.
15.
2.
1adobe\pdfmapline不支持OpenType字体,因而adobe字体集在pdf模式下就没有定义.
fandol的情况类似.
4363*adobe4364\ctex_fontset_case:nnnn4365{\ctex_fontset_error:n{adobe}}4366{4367\ctex_zhmap_case:nnn4368{4369\setCJKmainfont{AdobeSongStd-Light.
otf}4370[4371cmap=UniGB-UTF16-H,4372BoldFont=AdobeHeitiStd-Regular.
otf,第14节代码实现1254373ItalicFont=AdobeKaitiStd-Regular.
otf4374]4375\setCJKsansfont{AdobeHeitiStd-Regular.
otf}4376[cmap=UniGB-UTF16-H]4377\setCJKmonofont{AdobeFangsongStd-Regular.
otf}4378[cmap=UniGB-UTF16-H]4379\setCJKfamilyfont{zhsong}{AdobeSongStd-Light.
otf}4380[cmap=UniGB-UTF16-H]4381\setCJKfamilyfont{zhhei}{AdobeHeitiStd-Regular.
otf}4382[cmap=UniGB-UTF16-H]4383\setCJKfamilyfont{zhkai}{AdobeKaitiStd-Regular.
otf}4384[cmap=UniGB-UTF16-H]4385\setCJKfamilyfont{zhfs}{AdobeFangsongStd-Regular.
otf}4386[cmap=UniGB-UTF16-H]4387\ctex_punct_set:n{adobe}4388\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4389\ctex_punct_map_family:nn{\CJKsfdefault}{zhhei}4390\ctex_punct_map_family:nn{\CJKttdefault}{zhfs}4391\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhhei}4392\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4393}4394{4395\ctex_load_zhmap:nnnn{rm}{zhhei}{zhfs}{adobe}4396\ctex_punct_set:n{adobe}4397\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4398\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhhei}4399\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4400}4401{\ctex_fontset_error:n{adobe}}4402}4403{4404\ctex_set_upfonts:nnnnnn4405{AdobeSongStd-Light.
otf}4406{AdobeHeitiStd-Regular.
otf}4407{AdobeKaitiStd-Regular.
otf}4408{AdobeHeitiStd-Regular.
otf}4409{AdobeHeitiStd-Regular.
otf}4410{AdobeFangsongStd-Regular.
otf}4411\ctex_set_upfamily:nnn{zhsong}{upzhserif}{}4412\ctex_set_upfamily:nnn{zhhei}{upzhsans}{}4413\ctex_set_upfamily:nnn{zhfs}{upzhmono}{}4414\ctex_set_upfamily:nnn{zhkai}{upzhserifit}{}4415}4416{4417\setCJKmainfont{AdobeSongStd-Light}4418[BoldFont=AdobeHeitiStd-Regular,ItalicFont=AdobeKaitiStd-Regular]4419\setCJKsansfont{AdobeHeitiStd-Regular}4420\setCJKmonofont{AdobeFangsongStd-Regular}4421\setCJKfamilyfont{zhsong}{AdobeSongStd-Light}4422\setCJKfamilyfont{zhhei}{AdobeHeitiStd-Regular}4423\setCJKfamilyfont{zhfs}{AdobeFangsongStd-Regular}4424\setCJKfamilyfont{zhkai}{AdobeKaitiStd-Regular}4425}4426/adobe14.
15.
2.
2fandol4427*fandol4428\ctex_fontset_case:nnnn4429{\ctex_fontset_error:n{fandol}}4430{4431\ctex_zhmap_case:nnn4432{4433\setCJKmainfont{FandolSong-Regular.
otf}4434[4435cmap=UniGB-UTF16-H,第14节代码实现1264436BoldFont=FandolSong-Bold.
otf,4437ItalicFont=FandolKai-Regular.
otf4438]4439\setCJKsansfont{FandolHei-Regular.
otf}4440[cmap=UniGB-UTF16-H,BoldFont=FandolHei-Bold.
otf]4441\setCJKmonofont{FandolFang-Regular.
otf}4442[cmap=UniGB-UTF16-H]4443\setCJKfamilyfont{zhsong}{FandolSong-Regular.
otf}4444[cmap=UniGB-UTF16-H,BoldFont=FandolSong-Bold.
otf]4445\setCJKfamilyfont{zhhei}{FandolHei-Regular.
otf}4446[cmap=UniGB-UTF16-H,BoldFont=FandolHei-Bold.
otf]4447\setCJKfamilyfont{zhfs}{FandolFang-Regular.
otf}4448[cmap=UniGB-UTF16-H]4449\setCJKfamilyfont{zhkai}{FandolKai-Regular.
otf}4450[cmap=UniGB-UTF16-H]4451\ctex_punct_set:n{fandol}4452\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4453\ctex_punct_map_family:nn{\CJKsfdefault}{zhhei}4454\ctex_punct_map_family:nn{\CJKttdefault}{zhfs}4455\ctex_punct_map_bfseries:nn{\CJKrmdefault,zhsong}{zhsongb}4456\ctex_punct_map_bfseries:nn{\CJKsfdefault,zhhei}{zhheib}4457\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4458}4459{4460\ctex_load_zhmap:nnnn{rm}{zhhei}{zhfs}{fandol}4461\ctex_punct_set:n{fandol}4462\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4463\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhhei}4464\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4465}4466{\ctex_fontset_error:n{fandol}}4467}4468{4469\ctex_set_upfonts:nnnnnn4470{FandolSong-Regular.
otf}4471{FandolSong-Bold.
otf}4472{FandolKai-Regular.
otf}4473{FandolHei-Regular.
otf}4474{FandolHei-Bold.
otf}4475{FandolFang-Regular.
otf}4476\ctex_set_upfamily:nnn{zhsong}{upzhserif}{upzhserifb}4477\ctex_set_upfamily:nnn{zhhei}{upzhsans}{upzhsansb}4478\ctex_set_upfamily:nnn{zhfs}{upzhmono}{}4479\ctex_set_upfamily:nnn{zhkai}{upzhserifit}{}4480}4481{4482\setCJKmainfont{FandolSong-Regular}4483[4484Extension=.
otf,4485BoldFont=FandolSong-Bold,4486ItalicFont=FandolKai-Regular4487]4488\setCJKsansfont{FandolHei-Regular}4489[Extension=.
otf,BoldFont=FandolHei-Bold]4490\setCJKmonofont{FandolFang-Regular}4491[Extension=.
otf]4492\setCJKfamilyfont{zhsong}{FandolSong-Regular}4493[Extension=.
otf,BoldFont=FandolSong-Bold]4494\setCJKfamilyfont{zhhei}{FandolHei-Regular}4495[Extension=.
otf,BoldFont=FandolHei-Bold]4496\setCJKfamilyfont{zhfs}{FandolFang-Regular}4497[Extension=.
otf]4498\setCJKfamilyfont{zhkai}{FandolKai-Regular}4499[Extension=.
otf]4500}4501/fandol第14节代码实现12714.
15.
2.
3founder4502*founder4503\ctex_fontset_case:nnn4504{4505\ctex_zhmap_case:nnn4506{4507\setCJKmainfont{FZSSK.
TTF}4508[BoldFont=FZXBSK.
TTF,ItalicFont=FZKTK.
TTF]4509\setCJKsansfont{FZXH1K.
TTF}[BoldFont=FZHTK.
TTF]4510\setCJKmonofont{FZFSK.
TTF}4511\setCJKfamilyfont{zhsong}{FZSSK.
TTF}[BoldFont=FZXBSK.
TTF]4512\setCJKfamilyfont{zhhei}{FZHTK.
TTF}4513\setCJKfamilyfont{zhkai}{FZKTK.
TTF}4514\setCJKfamilyfont{zhfs}{FZFSK.
TTF}4515\setCJKfamilyfont{zhli}{FZLSK.
TTF}4516\setCJKfamilyfont{zhyou}{FZY1K.
TTF}[BoldFont=FZY3K.
TTF]4517\ctex_punct_set:n{founder}4518\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4519\ctex_punct_map_family:nn{\CJKsfdefault}{zhheil}4520\ctex_punct_map_family:nn{\CJKttdefault}{zhfs}4521\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4522\ctex_punct_map_bfseries:nn{\CJKrmdefault,zhsong}{zhsongb}4523\ctex_punct_map_bfseries:nn{\CJKsfdefault}{zhhei}4524\ctex_punct_map_bfseries:nn{zhyou}{zhyoub}4525}4526{4527\ctex_load_zhmap:nnnn{rm}{zhhei}{zhfs}{founder}4528\ctex_punct_set:n{founder}4529\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4530\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhhei}4531\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4532}4533{\ctex_fontset_error:n{founder}}4534}4535{4536\ctex_set_upfonts:nnnnnn4537{FZSSK.
TTF}4538{FZXBSK.
TTF}4539{FZKTK.
TTF}4540{FZXH1K.
TTF}4541{FZHTK.
TTF}4542{FZFSK.
TTF}4543\ctex_set_upfamily:nnn{zhsong}{upzhserif}{upzhserifb}4544\ctex_set_upfamily:nnn{zhhei}{upzhsans}{upzhsansb}4545\ctex_set_upfamily:nnn{zhfs}{upzhmono}{}4546\ctex_set_upfamily:nnn{zhkai}{upzhserifit}{}4547\ctex_set_upfamily:nnn{zhli}{upschrm}{}4548\ctex_set_upfamily:nnn{zhyou}{upschgt}{}4549\ctex_set_upmap:nnn{upstsl}{FZLSK.
TTF}{}4550\ctex_set_upmap:nnn{upstht}{FZY1K.
TTF}{}4551}4552{4553\setCJKmainfont{FZShuSong-Z01}4554[BoldFont=FZXiaoBiaoSong-B05,ItalicFont=FZKai-Z03]4555\setCJKsansfont{FZXiHeiI-Z08}[BoldFont=FZHei-B01]4556\setCJKmonofont{FZFangSong-Z02}4557\setCJKfamilyfont{zhsong}{FZShuSong-Z01}4558[BoldFont=FZXiaoBiaoSong-B05]4559\setCJKfamilyfont{zhhei}{FZHei-B01}4560\setCJKfamilyfont{zhkai}{FZKai-Z03}4561\setCJKfamilyfont{zhfs}{FZFangSong-Z02}4562\setCJKfamilyfont{zhli}{FZLiShu-S01}4563\setCJKfamilyfont{zhyou}{FZXiYuan-M01}4564[BoldFont=FZZhunYuan-M02]4565}4566/founder第14节代码实现12814.
15.
2.
4mac相关按Issue351的讨论,以ElCapitan为分界,分别设置macold(ElCapitan之前)和macnew(ElCapitan及之后).
检测方式则以ElCapitan及之后的苹方字体为准.
4567*mac4568\file_if_exist:nTF{/System/Library/Fonts/PingFang.
ttc}4569{\ctex_file_input:n{ctex-fontset-macnew.
def}}4570{\ctex_file_input:n{ctex-fontset-macold.
def}}4571/macmacold的设置参考了OSXMavericks(10.
9)预装的主要简体中文字体列表.
macnew在默认字体设置方面,引入了多字重的宋体作为罗马字族,以及引入了苹方黑体作为无衬线字族.
由于SongtiSCLight的字重与STSong及Windows上的SimSun更接近,故默认字重使用SongtiSCLight,而不带后缀的正常字重事实上没有使用.
黑体、圆体等设置也有类似的情况.
4572*macold|macnew4573\ctex_fontset_case:nnnn4574{\ctex_fontset_error:n{mac}}4575*macold4576{\ctex_fontset_error:n{macold}}4577{\ctex_fontset_error:n{macold}}4578/macold4579*macnew4580{4581\ctex_zhmap_case:nnn4582{4583\setCJKmainfont{:3:Songti.
ttc}4584[4585BoldFont=:1:Songti.
ttc,4586ItalicFont=:0:Kaiti.
ttc,4587BoldItalicFont=:3:Kaiti.
ttc,4588]4589\setCJKsansfont{:2:PingFang.
ttc}[BoldFont=:8:PingFang.
ttc]4590\setCJKmonofont{STFANGSO.
ttf}4591\setCJKfamilyfont{zhsong}{:3:Songti.
ttc}[BoldFont=:1:Songti.
ttc]4592\setCJKfamilyfont{zhhei}{:2:PingFang.
ttc}[BoldFont=:8:PingFang.
ttc]4593\setCJKfamilyfont{zhkai}{:0:Kaiti.
ttc}[BoldFont=:3:Kaiti.
ttc]4594\setCJKfamilyfont{zhfs}{STFANGSO.
ttf}4595\setCJKfamilyfont{zhli}{:0:Baoli.
ttc}4596\setCJKfamilyfont{zhyou}{:4:Yuanti.
ttc}[BoldFont=:0:Yuanti.
ttc]4597\ctex_punct_set:n{mac}4598\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4599\ctex_punct_map_family:nn{\CJKsfdefault}{zhpf}4600\ctex_punct_map_family:nn{\CJKttdefault}{zhfs}4601\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4602\ctex_punct_map_bfseries:nn{\CJKrmdefault,zhsong}{zhsongb}4603\ctex_punct_map_bfseries:nn{\CJKsfdefault,zhhei}{zhpfb}4604\ctex_punct_map_bfseries:nn{zhyou}{zhyoub}4605}4606{4607\ctex_load_zhmap:nnnn{rm}{zhhei}{zhfs}{mac}4608\ctex_punct_set:n{mac}4609\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4610\ctex_punct_map_family:nn{\CJKsfdefault}{zhpf}4611\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhpf}4612\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4613}4614{\ctex_fontset_error:n{macnew}}4615}4616{4617\ctex_set_upmap:nnn{upserif}{:3:Songti.
ttc}{:1:Songti.
ttc}4618\ctex_set_upmap:nnn{upserifit}{:0:Kaiti.
ttc}{}4619\ctex_set_upmap:nnn{upstsl}{:0:Baoli.
ttc}{}第14节代码实现1294620\ctex_set_upmap:nnn{upstht}{:4:Yuanti.
ttc}{}4621\ctex_set_upmap_unicode:nnn{upsans}{:2:PingFang.
ttc}{:8:PingFang.
ttc}4622\ctex_set_upmap_unicode:nnn{upmono}{STFANGSO.
ttf}{}4623\ctex_set_upfamily:nnn{zhsong}{upzhserif}{upzhserifb}4624\ctex_set_upfamily:nnn{zhhei}{upzhsans}{upzhsansb}4625\ctex_set_upfamily:nnn{zhfs}{upzhmono}{}4626\ctex_set_upfamily:nnn{zhkai}{upzhserifit}{}4627\ctex_set_upfamily:nnn{zhli}{upschrm}{}4628\ctex_set_upfamily:nnn{zhyou}{upschgt}{}4629}4630/macnew4631{4632*macold4633\setCJKmainfont{STSong}4634[BoldFont=STHeiti,ItalicFont=STKaiti]4635\setCJKsansfont{STXihei}[BoldFont=STHeiti]4636\setCJKmonofont{STFangsong}4637\setCJKfamilyfont{zhsong}{STSong}4638\setCJKfamilyfont{zhhei}{STHeiti}4639\setCJKfamilyfont{zhfs}{STFangsong}4640\setCJKfamilyfont{zhkai}{STKaiti}4641/macold4642*macnew4643\setCJKmainfont{Songti~SC~Light}4644[4645BoldFont=Songti~SC~Bold,4646ItalicFont=Kaiti~SC,4647BoldItalicFont=Kaiti~SC~Bold4648]4649\setCJKsansfont{PingFang~SC}4650\setCJKmonofont{STFangsong}4651\setCJKfamilyfont{zhsong}{Songti~SC~Light}[BoldFont=Songti~SC~Bold]4652\setCJKfamilyfont{zhhei}{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]4653\setCJKfamilyfont{zhpf}{PingFang~SC}4654\setCJKfamilyfont{zhfs}{STFangsong}4655\setCJKfamilyfont{zhkai}{Kaiti~SC}[BoldFont=Kaiti~SC~Bold]4656\setCJKfamilyfont{zhli}{Baoli~SC}4657\setCJKfamilyfont{zhyou}{Yuanti~SC~Light}[BoldFont=Yuanti~SC~Regular]4658/macnew4659}4660/macold|macnew14.
15.
2.
5ubuntu4661*ubuntu4662\ctex_fontset_case:nnnn4663{\ctex_fontset_error:n{ubuntu}}4664{4665\ctex_zhmap_case:nnn4666{4667\setCJKmainfont{:2:NotoSerifCJK-Regular.
ttc}4668[BoldFont=:2:NotoSerifCJK-Bold.
ttc,ItalicFont=gkai00mp.
ttf]4669\setCJKsansfont{:2:NotoSansCJK-Regular.
ttc}4670[BoldFont=:2:NotoSansCJK-Bold.
ttc]4671\setCJKmonofont{:2:NotoSerifCJK-Regular.
ttc}4672[BoldFont=:2:NotoSerifCJK-Bold.
ttc]4673\setCJKfamilyfont{zhsong}{:2:NotoSerifCJK-Regular.
ttc}4674[BoldFont=:2:NotoSerifCJK-Bold.
ttc]4675\setCJKfamilyfont{zhhei}{:2:NotoSansCJK-Regular.
ttc}4676[BoldFont=:2:NotoSansCJK-Bold.
ttc]4677\setCJKfamilyfont{zhkai}{gkai00mp.
ttf}4678\ctex_punct_set:n{ubuntu}4679\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4680\ctex_punct_map_family:nn{\CJKsfdefault}{zhhei}4681\ctex_punct_map_family:nn{\CJKttdefault}{zhsong}4682\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}第14节代码实现1304683\ctex_punct_map_bfseries:nn{\CJKsfdefault,zhhei}{zhheib}4684\ctex_punct_map_bfseries:nn4685{\CJKrmdefault,\CJKttdefault,zhsong}4686{zhsongb}4687}4688{4689\ctex_load_zhmap:nnnn{rm}{zhhei}{zhsong}{ubuntu}4690\ctex_punct_set:n{ubuntu}4691\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4692\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhhei}4693\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4694}4695{\ctex_fontset_error:n{ubuntu}}4696}4697{4698\ctex_set_upmap_unicode:nnn{upserif}4699{:2:NotoSerifCJK-Regular.
ttc}{:2:NotoSerifCJK-Bold.
ttc}4700\ctex_set_upmap_unicode:nnn{upsans}4701{:2:NotoSansCJK-Regular.
ttc}{:2:NotoSansCJK-Bold.
ttc}4702\ctex_set_upmap_unicode:nnn{upmono}4703{:2:NotoSerifCJK-Regular.
ttc}{}4704\ctex_set_upmap:nnn{upserifit}{gkai00mp.
ttf}{}4705\ctex_set_upfamily:nnn{zhsong}{upzhserif}{upzhserifb}4706\ctex_set_upfamily:nnn{zhhei}{upzhsans}{upzhsansb}4707\ctex_set_upfamily:nnn{zhkai}{upzhserifit}{}4708}4709{4710\setCJKmainfont{Noto~Serif~CJK~SC}[ItalicFont=AR~PL~KaitiM~GB]4711\setCJKsansfont{Noto~Sans~CJK~SC}4712\setCJKmonofont{Noto~Serif~CJK~SC}4713\setCJKfamilyfont{zhsong}{Noto~Serif~CJK~SC}4714\setCJKfamilyfont{zhhei}{Noto~Sans~CJK~SC}4715\setCJKfamilyfont{zhkai}{AR~PL~KaitiM~GB}4716}4717/ubuntu14.
15.
2.
6windows\c__ctex_msyh_suffix_tlWindows8以后,微软雅黑由原来的.
ttf后缀改为.
ttc后缀,需要加以区分.
4718*windows4719\file_if_exist:nTF{\c_dollar_strWINDIR/Fonts/msyh.
ttc}4720{\tl_const:Nn\c__ctex_msyh_suffix_tl{ttc}}4721{4722\file_if_exist:nTF{msyh.
ttc}4723{\tl_const:Nn\c__ctex_msyh_suffix_tl{ttc}}4724{\tl_const:Nn\c__ctex_msyh_suffix_tl{ttf}}4725}4726\ctex_fontset_case:nnn4727{4728\ctex_zhmap_case:nnn4729{4730\ctex_punct_set:n{windows}4731\setCJKmainfont{simsun.
ttc}4732[BoldFont=simhei.
ttf,ItalicFont=simkai.
ttf]4733\setCJKsansfont{msyh.
\c__ctex_msyh_suffix_tl}4734[BoldFont=msyhbd.
\c__ctex_msyh_suffix_tl]4735\setCJKmonofont{simfang.
ttf}4736\setCJKfamilyfont{zhsong}{simsun.
ttc}4737\setCJKfamilyfont{zhhei}{simhei.
ttf}4738\setCJKfamilyfont{zhfs}{simfang.
ttf}4739\setCJKfamilyfont{zhkai}{simkai.
ttf}4740\setCJKfamilyfont{zhyahei}{msyh.
\c__ctex_msyh_suffix_tl}4741[BoldFont=msyhbd.
\c__ctex_msyh_suffix_tl]4742\setCJKfamilyfont{zhli}{simli.
ttf}4743\setCJKfamilyfont{zhyou}{simyou.
ttf}4744\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}第14节代码实现1314745\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhhei}4746\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4747\ctex_punct_map_family:nn{\CJKsfdefault}{zhyahei}4748\ctex_punct_map_bfseries:nn{\CJKsfdefault,zhyahei}{zhyaheib}4749\ctex_punct_map_family:nn{\CJKttdefault}{zhfs}4750}4751{4752\ctex_load_zhmap:nnnn{rm}{zhhei}{zhfs}{windows}4753\ctex_punct_set:n{windows}4754\ctex_punct_map_family:nn{\CJKrmdefault}{zhsong}4755\ctex_punct_map_bfseries:nn{\CJKrmdefault}{zhhei}4756\ctex_punct_map_itshape:nn{\CJKrmdefault}{zhkai}4757}4758{}4759}4760{4761\ctex_set_upfonts:nnnnnn4762{simsun.
ttc}4763{simhei.
ttf}4764{simkai.
ttf}4765{msyh.
\c__ctex_msyh_suffix_tl}4766{msyhbd.
\c__ctex_msyh_suffix_tl}4767{simfang.
ttf}4768\ctex_set_upfamily:nnn{zhsong}{upzhserif}{}4769\ctex_set_upfamily:nnn{zhhei}{upzhserifb}{}4770\ctex_set_upfamily:nnn{zhfs}{upzhmono}{}4771\ctex_set_upfamily:nnn{zhkai}{upzhserifit}{}4772\ctex_set_upfamily:nnn{zhyahei}{upzhsans}{upzhsansb}4773\ctex_set_upfamily:nnn{zhli}{upschrm}{}4774\ctex_set_upfamily:nnn{zhyou}{upschgt}{}4775\ctex_set_upmap:nnn{upstsl}{simli.
ttf}{}4776\ctex_set_upmap:nnn{upstht}{simyou.
ttf}{}4777}4778{4779\setCJKmainfont{SimSun}[BoldFont=SimHei,ItalicFont=KaiTi]4780\setCJKsansfont{Microsoft~YaHei}[BoldFont=*~Bold]4781\setCJKmonofont{FangSong}4782\setCJKfamilyfont{zhsong}{SimSun}4783\setCJKfamilyfont{zhhei}{SimHei}4784\setCJKfamilyfont{zhfs}{FangSong}4785\setCJKfamilyfont{zhkai}{KaiTi}4786\setCJKfamilyfont{zhyahei}{Microsoft~YaHei}[BoldFont=*~Bold]4787\setCJKfamilyfont{zhli}{LiSu}4788\setCJKfamilyfont{zhyou}{YouYuan}4789}4790/windows14.
15.
3中文字体命令\songti\heiti\fangsong\kaishu\lishu\youyuan\yahei\pingfang使用upLATEX编译时,macnew字库中由于传统黑体(黑体-简)无法使用,我们用苹方来代替.
同时\yahei、\pingfang命令被设置为与\heiti相同.
4791*!
mac4792\NewDocumentCommand\songti{}{\CJKfamily{zhsong}}4793\NewDocumentCommand\heiti{}{\CJKfamily{zhhei}}4794!
ubuntu\NewDocumentCommand\fangsong{}{\CJKfamily{zhfs}}4795\NewDocumentCommand\kaishu{}{\CJKfamily{zhkai}}4796*windows|founder|macnew4797\NewDocumentCommand\lishu{}{\CJKfamily{zhli}}4798\NewDocumentCommand\youyuan{}{\CJKfamily{zhyou}}4799/windows|founder|macnew4800windows\NewDocumentCommand\yahei{}{\CJKfamily{zhyahei}}4801*macnew4802\bool_lazy_or:nnTF4803{\sys_if_engine_pdftex_p:}第14节代码实现1324804{\sys_if_engine_uptex_p:}4805{4806\cs_new_eq:NN\yahei\heiti4807\cs_new_eq:NN\pingfang\heiti4808}4809{4810\NewDocumentCommand\yahei{}{\CJKfamily{zhpf}}4811\NewDocumentCommand\pingfang{}{\CJKfamily{zhpf}}4812}4813/macnew4814/!
mac4815/fontset14.
15.
4zhmetrics的字体映射确认\catcode,没有重复载入检查.
4816*zhmap4817\begingroup\catcode61\catcode48\catcode32=10\relax%4818\catcode35=6%#4819\catcode45=12%-4820\catcode123=1%{4821\catcode125=2%}4822\toks0{\endlinechar=\the\endlinechar\relax}%4823\toks2{\endlinechar=-1}%4824\def\x#1#2{%4825\toks0\expandafter{\the\toks0\catcode#1=\the\catcode#1\relax}%4826\toks2\expandafter{\the\toks2\catcode#1=#2}}%4827\x135%carriagereturn4828\x3210%space4829\x356%#4830\x4012%(4831\x4112%)4832\x4512%-4833\x4612%.
4834\x4712%/4835\x5812%:4836\x6012%\q_mark\q_stop5517}5518\cs_new_protected:Npn\__ctex_get_macro_meaning:w5519##1#1##2->##3\q_mark##4\q_stop5520{5521\tl_if_empty:nTF{##4}第14节代码实现1455522{\prg_return_false:}5523{5524\str_set:Nn\l__ctex_prefix_str{##1}5525\str_set:Nn\l__ctex_parameter_str{##2}5526\str_set:Nn\l__ctex_replacement_str{##3}5527\prg_return_true:5528}5529}5530}5531\exp_args:No\__ctex_tmp:w{\tl_to_str:n{macro:}}5532\group_end:\ctex_if_rescanable:NnTF检查宏是否可以重建.
5533\cs_new_protected:Npn\ctex_if_rescanable:NnTF#1#2#3#45534{5535\ctex_get_macro_meaning:NTF#15536{5537\__ctex_patch_rebuild:Nn\__ctex_rebuild_cmd:w{#2}5538\cs_if_eq:NNTF#1\__ctex_rebuild_cmd:w{#3}{#4}5539}5540{#4}5541}5542\cs_new_eq:NN\__ctex_rebuild_cmd:w\prg_do_nothing:\__ctex_patch_rebuild:Nn使用\tl_rescan:nn来重新记号化\meaning字符串.
5543\cs_new_protected:Npn\__ctex_patch_rebuild:Nn#1#25544{5545\__ctex_patch_rescan:NNn\l__ctex_prefix_tl\l__ctex_prefix_str{#2}5546\__ctex_patch_rescan:NNn\l__ctex_parameter_tl\l__ctex_parameter_str{#2}5547\__ctex_patch_rescan:NNn\l__ctex_replacement_tl\l__ctex_replacement_str{#2}5548\use:x5549{5550\exp_not:o{\l__ctex_prefix_tl}\tex_def:D\exp_not:N#15551\exp_not:o{\l__ctex_parameter_tl}5552{\exp_not:o{\l__ctex_replacement_tl}}5553}5554}5555\cs_new_protected:Npn\__ctex_patch_rescan:NNn#1#2#35556{5557\str_if_empty:NTF#25558{\tl_clear:N#1}5559{\tl_set_rescan:Nno#1{#3}{#2}}5560}5561\tl_new:N\l__ctex_prefix_tl5562\tl_new:N\l__ctex_parameter_tl5563\tl_new:N\l__ctex_replacement_tl\__ctex_patch_cmd:Nnnnnw对宏的替换文本进行字符串替换,然后重建.
5564\cs_new_protected:Npn\__ctex_patch_cmd:Nnnnnw#1#2#3#4#55565{5566\group_end:5567\ctex_if_rescanable:NnTF#1{#3}5568{5569\use:x5570{5571\__ctex_patch_replace:nnnTF{#2}5572{\tl_to_str:n{#4}}5573{\tl_to_str:n{#5}}5574}5575{5576\__ctex_patch_rebuild:Nn#1{#3}5577\__ctex_patch_true:w5578}5579{\__ctex_patch_false:w}第14节代码实现1465580}5581{\__ctex_patch_false:w}5582}\__ctex_patch_replace:nnnTF替换前先检查原文本是否存在.
5583\cs_new_protected:Npn\__ctex_patch_replace:nnnTF#1#2#3#45584{5585\tl_if_in:NnTF\l__ctex_replacement_str{#2}5586{\use:c{tl_replace_#1:Nnn}\l__ctex_replacement_str{#2}{#3}#4}5587}\__ctex_hookto_cmd:Nnnnw在宏的前/后附加钩子.
5588\cs_new_protected:Npn\__ctex_hookto_cmd:Nnnnw#1#2#3#45589{5590\group_end:5591\ctex_get_macro_meaning:NTF#15592{5593\str_if_empty:NTF\l__ctex_parameter_str5594{\__ctex_hookto_cmd_parameterless:Nnnnw}5595{\__ctex_hookto_cmd_parameter:Nnnnw}5596#1{#2}{#3}{#4}5597}5598{\__ctex_patch_false:w}5599}\__ctex_hookto_cmd_parameterless:Nnnnw如果宏没有参数,可以直接进行附加操作.
注意保持宏的前缀.
5600\cs_new_protected:Npn\__ctex_hookto_cmd_parameterless:Nnnnw#1#2#3#45601{5602\str_if_empty:NF\l__ctex_prefix_str5603{\tl_rescan:no{#3}{\l__ctex_prefix_str}}5604\tex_edef:D#15605{5606\use:c{__ctex_#2_hook_aux:nn}5607{\exp_not:o{#1}}5608{\exp_not:n{#4}}5609}5610\__ctex_patch_true:w5611}5612\cs_generate_variant:Nn\tl_rescan:nn{no}5613\cs_new:Npn\__ctex_left_hook_aux:nn#1#2{#2#1}5614\cs_new_eq:NN\__ctex_right_hook_aux:nn\use:nn\__ctex_hookto_cmd_parameter:Nnnnw如果宏有参数,需要在字符串中进行附加,然后再重建.
5615\cs_new_protected:Npn\__ctex_hookto_cmd_parameter:Nnnnw#1#2#3#45616{5617\__ctex_patch_rebuild:Nn\__ctex_rebuild_cmd:w{#3}5618\cs_if_eq:NNTF#1\__ctex_rebuild_cmd:w5619{5620\use:c{str_put_#2:Nn}\l__ctex_replacement_str{#4}5621\__ctex_patch_rebuild:Nn#1{#3}5622\__ctex_patch_true:w5623}5624{\__ctex_patch_false:w}5625}5626/ctexpatch版本历史147版本历史v2.
0(2014/03/06–2015/05/06)General:c5size,cs4size是过时选项.
42captiondelimiter是过时选项.
120fancyhdr成为过时选项,原选项功能总是打开.
44fntef成为过时选项,原选项功能总是打开.
44hyperref成为过时选项,原选项功能总是打开.
44indent,noindent是过时选项.
42nofonts,adobefonts,winfonts是过时选项.
43nopunct是过时选项.
43nospace是过时选项.
44nozhmap是过时选项.
43punct选项可以设置标点格式.
43ctex宏包新增heading选项.
44\CTEXindent,\CTEXnoindent是过时命令.
86\CTEXsetup,\CTEXoptions是过时命令.
15,83\CTEXunderdot、\CTEXunderline、\CTEXunderdblline、\CTEXunderwave、\CTEXsout、\CTEXxout是过时命令;CTEXfilltwosides是过时环境.
79标题设置新增pagestyle选项.
90调整\footnotesep的大小,以适合行距的变化.
119兼容extsizes宏包、beamer、memoir等提供的更多字号选项.
45将标题汉化功能加入ctex.
sty.
87将中文字号功能提取到可以独立使用的ctexsize.
.
.
.
116解决etoolbox与breqn关于\end的冲突.
120默认关闭CJKfntef或xeCJKfntef的彩色设置.
79删除c19gbsn.
fd和c19gkai.
fd.
1通过LuaTeX-ja宏包支持LuaLATEX.
52新增autoindent选项.
42新增fontset选项.
43新增linespread选项.
42新增linestretch选项.
84新增scheme选项,并将cap和nocap列为过时选项.
.
.
44新增zhmCJK支持选项.
43新增zihao选项.
42新增统一设置接口\ctexset.
83应用LATEX3重新整理代码.
1中文字号不再采用近似值.
117自动检测操作系统,载入对应的字体配置.
77\CJK@surr:解决与\nouppercase的冲突.
49v2.
0.
1(2015/05/15)General:修复10pt、11pt等选项无效的问题.
45v2.
0.
2(2015/05/16)General:修复加载ctex宏包后章节标题后第一段无段首缩进的问题.
116v2.
1(2015/05/18–2015/06/19)General:format+,nameformat+等带加号的选项,加号与前面的文字之间可以有可选的空格.
89nameformat可以接受章节名字为参数.
89不依赖ifpdf宏包.
40不再设置hyperref宏包的colorlinks选项.
77给pdfLATEX下的非UTF-8编码CJK字体族加上CMap.
47将章节标题设置功能提取到可以独立使用的宏包ctexheading中.
1新的标题格式选项aftertitle.
89修复ctexbook和ctexrep类的中文part/number选项初值为空的错误.
110\ctex_if_platform_macos:TF:改用/Library/Fonts/Songti.
ttc为特征文件.
121hyperref:补充定义\hypersetup.
45v2.
2(2015/06/21–2015/06/30)General:beforeskip和afterskip选项的符号不再有特殊意义.
89beforeskip、afterskip和indent选项支持表达式.
.
.
92不再依赖etoolbox宏包.
1非ctexart类的part/beforeskip和part/afterskip选项有意义.
92给enumitem宏包注册\chinese和\zhnum.
87将文档开头和宏包末尾钩子提取到ctexhook宏包中.
.
140将中文版式下的part和chapter标题的nameformat和titleformat选项的初值合并到format中.
110删去etoolbox与breqn的兼容补丁.
120新的标题格式选项afterindent.
89新的标题格式选项numbering.
89新的标题格式选项runin.
89新增子宏包ctexpatch实现给宏打补丁功能.
142v2.
3(2015/09/17–2016/01/05)General:.
value_required:和.
value_forbidden:已过时.
42代码实现避免使用\lowercase技巧(JosephWright).
.
40更新LuaTeX-ja支持(20150922.
0)52更新unicode-math宏包补丁.
55兼容titleps宏包.
104修复nameformat作用域问题.
89与LATEX3(2015/12/20)同步.
38v2.
4(2015/02/19–2016/04/25)General:初步支持upLATEX.
74加强beamer宏包支持.
1提供upLATEX的NFSS字体定义.
123提供translator宏包的中文定理名称翻译.
139正确更新CJK包的\CJKfamilydefault.
77正确设置upTEX下字体命令.
74\ctex_parse_name:NN:修复宏名解析错误.
143v2.
4.
1(2016/04/26–2016/05/14)General:beamer不调整默认行距.
116beamer不调整默认字体大小.
115使用bootfont.
bin判断WindowsXP以避免权限问题.
130随字体更新upTEX的\xkanjiskip.
81新的标题格式选项part/fixbeforeskip和chapter/fixbeforeskip.
90正确更新upLATEX的\CJKfamilydefault.
77\ccwd:正确设置upTEX下的\ccwd.
79\chinese:支持\pagenumbering.
87zihao:不允许无参zihao选项.
42版本历史148v2.
4.
2(2016/05/15)General:恢复luatexja对\emshape和\eminnershape的重定义.
55\em:兼容upLATEX2016/05/07u00的定义.
74v2.
4.
3(2016/06/03–2016/08/26)General:更新unicode-math补丁.
61简化fontspec补丁.
55确保\proofname非空.
87删除选项part/fixbeforeskip和chapter/fixbeforeskip.
90新的标题格式选项fixskip.
89v2.
4.
4(2016/09/09–2016/09/19)General:不再默认设置xeCJK的伪粗体.
52改进hyperref宏包的标题锚点设置.
101解决zhmap文件的\catcode问题.
49使用titlesec时,章节目录也使用CTEX的编号.
103提供\CTEXifname.
91提供\partmark.
91新的标题格式选项break.
89v2.
4.
5(2016/10/01–2016/10/25)General:新的标题格式选项chapter/lofskip和chapter/lotskip.
90新的标题格式选项hang.
89新的标题格式选项tocline.
89\ps@headings:修复补丁失败.
105v2.
4.
6(2016/10/31–2016/11/20)General:\CTEXifname初始为假.
91支持字体属性可选项在后的新语法.
66重新初始化\ifthechapter等.
104v2.
4.
7(2016/12/23–2016/12/27)General:依赖pxeverysel宏包.
75\ps@headings:修复ctexrep类的\chaptermark汉化错误.
105v2.
4.
8(2017/02/23)General:解决与fontspec2017/01/24v2.
5d的字体族匹配兼容问题.
67v2.
4.
9(2017/02/27)General:调整unicode-math补丁的代码顺序.
61v2.
4.
10(2017/07/19–2017/07/23)General:常数\c_minus_one已过时.
38定义\cht,\cdp和\cwd.
82使用lazy函数对Boolean表达式进行最小化运算(LATEX32017/07/19)38v2.
4.
11(2017/08/17–2017/11/21)General:不把EnclosedAlphanumerics设置为JAchar.
.
53不把希腊和西里尔字母设置为JAchar.
53因上游l3keys变化,重新定义format+等带空格加号的选项.
89\ps@headings:补充页眉空格.
105v2.
4.
12(2017/12/05–2018/01/27)General:同步LATEX32017/12/16.
1修正\ctexset在ctexheading包中无定义的错误(曾祥东)83正确使用\ltjsetkanjiskip和\ltjsetxkanjiskip.
.
74\CTeX:不依赖\ifincsname.
120v2.
4.
13(2018/03/23)\CTEX@selectfont@hook:修正导言区\selectfont钩子位置.
80v2.
4.
14(2018/05/01)General:配置macnew的默认字体设置.
128区分macold及macnew.
128为macnew配置字体命令.
131v2.
4.
15(2019/01/29–2019/04/05)General:定义part/hang和chapter/hang.
92将upLATEX的默认字体由mc改为zhrm,并启用\jfam.
.
74将JY2和JT2编码的字体定义提取到单独的文件中.
.
122局部指定autoindent为false,并交换\CTEX@XXX@indent与\CTEX@XXX@format的顺序.
.
.
.
107同步LATEX32019/03/05.
1统一"方正细黑一_GBK"的名称为FZXiHeiI-Z08.
.
.
.
127显式补丁upLATEX的\rmfamily等字体命令.
74修正part/indent和chapter/indent的实现方法.
.
.
92v2.
4.
16(2019/05/11–2019/05/29)General:更好地兼容nameref宏包.
101修正part/indent和chapter/indent的实现方法,在其标题内部禁用autoindent.
92允许设置autoindent为0.
40v2.
5(2019/10/25–2020/04/30)General:ubuntu改用思源(NotoCJK)和文鼎字库,不再支持使用pdfLATEX编译.
129标题选项format也可以接受参数.
92不再支持WindowsXP系统,windowsold和windowsnew成为过时字库选项.
130不再自动载入CJKfntef或xeCJKfntef宏包.
79操作系统检测移动至载入中文字库处,且不再需要依赖特定引擎.
77处理\ctex_file_input:n在ctexsize中未定义的错误.
38给LATEX和upLATEX下的文档类指定驱动为DVIPDFM.
46更新LuaTeX-ja支持(20200412.
0)52兼容titletoc宏包.
105删除fontspec补丁.
55使用环境变量代替绝对路径查找字体.
130所有引擎下默认编码均设为UTF-8.
43为macnew增加粗楷体、隶书和圆体的定义.
128移除\CTEXunderdot、\CTEXunderline、\CTEXunderdblline、\CTEXunderwave、\CTEXsout、\CTEXxout、CTEXfilltwosides等命令和环境.
79应用新内核中的\labelformat.
110允许macnew在LATEX和upLATEX下使用.
128在ctexsize也载入fix-cm.
38增加宏包开头钩子.
140增加字体映射文件zhmacfonts.
tex.
135重构标题选项indent和hang.
90重构字体选项AlternateFont.
68\CTEX@selectfont@hook:兼容KOMA-Script的\selectfont补丁.
80\ctex_if_platform_macos:TF:改用/System/Library/Fonts/Menlo.
ttc为特征文件.
.
.
.
121fntef:仅在该选项启用时会载入CJKfntef或xeCJKfntef宏包.
44代码索引149v2.
5.
1(2020/05/02)General:zhconv更名为ctex-zhconv.
1v2.
5.
2(2020/05/05–2020/05/06)General:ctexmakespa.
tex更名为ctex-spa-make.
tex.
136ctexspamacro.
tex更名为ctex-spa-macro.
tex.
.
.
136zhadobefonts.
tex等字体映射文件更名为ctex-zhmap-*.
tex.
132兼容LATEX2020-02-02之前的版本.
76新增标题选项secnumdepth和tocdepth.
108修正macnew和ubuntu字库的CJKpunct标点信息.
.
127v2.
5.
3(2020/05/31–2020/06/06)General:不再依赖xunicode,单独补丁tuenc.
def.
53兼容cleveref.
109正确关闭和恢复LATEX3语法环境.
39v2.
5.
4(2020/06/07–2020/08/16)General:更新LuaTeX-ja支持(20200808.
0)52兼容LATEX2020/10/01的钩子机制.
140同时兼容cleveref和hyperref.
109修正主要字体命令补丁.
76应用l3cctab.
39v2.
5.
5(2020/10/06–2020/10/17)General:放弃应用l3cctab.
39进一步应用LATEX2020/10/01的新钩子.
76\CJKhook:不再通过旧的钩子命令来定义.
51v2.
5.
6(2021/01/11–2021/02/16)General:使用正确的导言区末尾钩子.
141\f@nch@initialise:更新fancyhdr宏包的补丁.
106代码索引意大利体的数字表示描述对应索引项的页码;带下划线的数字表示定义对应索引项的代码行号;罗马字体的数字表示使用对应索引项的代码行号.
Symbols3364,3371,3384,3387,3411,3418512,3260,3319.
.
.
/afterindent24.
.
.
/aftername20.
.
.
/aftername+20.
.
.
/afterskip23.
.
.
/aftertitle21.
.
.
/aftertitle+21.
.
.
/beforeskip23.
.
.
/break24.
.
.
/break+24.
.
.
/fixskip24.
.
.
/format18.
.
.
/format+18.
.
.
/hang22.
.
.
/indent23.
.
.
/name17.
.
.
/nameformat18.
.
.
/nameformat+18.
.
.
/number17.
.
.
/numberformat20.
.
.
/numberformat+20.
.
.
/titleformat20.
.
.
/titleformat+20.
.
.
/tocline25172015,33,34,136,182,184,231,240,668,1225,1307,2375,3831,3832,3945,3946,4194,4196,4225,5311,5312,5313,5331,54221236,1237,5313,53321236,1237,5313,533210pt8,36211pt8,36212pt8,362A\abovedisplayshortskip.
4036,4044,4055,4075,4083,4094\abovedisplayskip4035,4038,4043,4050,4054,4061,4074,4077,4082,4089,4093,4100\abstractname2359abstractname12\addCJKfontfeature1307,1351\addCJKfontfeatures1324\addcontentsline2587,2632,2636,2641,2673,2677,2682,2782,2787,2793,2799,2928,2942\AddEnumerateCounter2314,2316,2317,2318\addpenalty2885,3672,3705,3739,3753,3767\addtocontents2575,2581,2804,2805\addvspace2576,2582,2593,2596,2804,2805,2885,2889,3434,3445,3453,3464,3472,3483adobefonts32\algorithmname2366,2382algorithmname13AlternateFont29,35,1436\appendix3097,3549appendix/name25,3086appendix/number26,3086appendix/numbering25,3086\appendixname2361,3816appendixname12\arabic3719\AtBeginDocument571,1710\AtBeginDvi466\AtBeginShipoutFirst470,1903,1918\AtBeginUTFCommand791代码索引150\AtEndOfClass160\AtEndOfPackage161\AtEndUTFCommand792autoindent11,210,2164B\baselinestretch2223\begin3441,3460,3479\begingroup436,2646,2688,2708,2729,2828,2853,2918,2956,2989,3429,3448,3467,4817,4851,4858\belowdisplayshortskip.
4037,4045,4056,4076,4084,4095\belowdisplayskip4038,4050,4061,4077,4089,4100\bfdefault1092,1098,1426,1433\bfseries2651,2655,2693,2697,2713,2734,2834,2839,2858,3600,3602,3606,3619,3620,3623,3649,3651,3657,3674,3678,3699,3733,3750,3764\bibname2364,2367,2375,2383,2389,2390bibname12boolcommands:\bool_gset_false:N273,278\bool_gset_true:N268\bool_if:NTF86,1265,3011,3201,3211,3222,3835\bool_lazy_or:nnTF4171,4802,5450\bool_new:N156,1302\bool_set_false:N1277\bool_set_true:N1295\c_false_bool3045,3047\c_true_bool3044,3046boxcommands:\box_ht:N4116\box_new:N62\box_use_drop:N3021\box_wd:N1951,3020,3315Cc5size32cap33,321captiondelimiter34,4123\catcode4817,4818,4819,4820,4821,4825,4826CCT32CCTfont32\ccwd23,27,154,214,1947,1992,1993,1994,2170,2208,2232,2233,2240,2266,2267,2268,2271,2273,2274,2285,2296,2298,4133,4134,4135\cdp2078\centering2689,2730,3430,3449,3468,3606,3618,3623,3627,3657,3678,3686,3721\chapter2759,3841chapter/beforeskip34chapter/fixbeforeskip34chapter/lofskip25,2502chapter/lotskip25,2502chapter/numbering16chapter/pagestyle21,2502\chaptermark2803\chaptername3646charcommands:\char_set_catcode:nn107,108\char_set_catcode_letter:n.
95,1713,3335,3556,5414\char_set_catcode_math_superscript:n96\char_set_catcode_other:N.
.
.
.
512,1004,3260,3319\char_set_catcode_other:n5438\char_set_catcode_space:n797,2083\char_value_catcode:n90,91CharRange29,1436\Chinese33,2310\chinese28,2308,2318,3593,3656\cht2078\CJKbold4271,4272,4282,4283,4301,4302,4304,4305,4307,4308,4312,4313,4315,4316,4318,4319,4335,4336,4338,4339,4341,4342,4346,4347,4349,4350,4352,4353\CJKfamily.
.
.
.
1164,1184,1531,1728,1834,1835,1836,1837,4792,4793,4794,4795,4797,4798,4800,4810,4811\CJKfamilydefault586,1390,1392,1396,1403,1416,1828,1829,1837,1846,1853,1857,1865,1876,1878\CJKfontspec1324\CJKglue1950,1964,1978,1990\CJKhook599\CJKnormal.
.
.
.
4264,4265,4266,4267,4268,4269,4270,4275,4276,4277,4278,4279,4280,4281,4300,4303,4306,4311,4314,4317,4334,4337,4340,4345,4348,4351\CJKpunctmapfamily.
634,635,636,637,638,639,643,644,645,646,647,648\CJKrmdefault535,1232,1243,1355,1392,1395,1396,1829,1831,1834,1840,1843,1861,4388,4391,4392,4397,4398,4399,4452,4455,4457,4462,4463,4464,4518,4521,4522,4529,4530,4531,4598,4601,4602,4609,4611,4612,4679,4682,4685,4691,4692,4693,4744,4745,4746,4754,4755,4756\CJKsfdefault536,1233,1244,1362,1832,1835,1841,1844,1862,4389,4453,4456,4519,4523,4599,4603,4610,4680,4683,4747,4748\CJKtilde587\CJKttdefault537,1234,1245,1368,1833,1836,1842,1845,1863,4390,4454,4520,4600,4681,4685,4749clearalternatefont30,1615\cleardoublepage2607,2760,3616,3644\clearpage2609,2760,3616,3644clistcommands:\clist_clear:N1113,5131\clist_concat:NNN1133\clist_const:Nn613\clist_gput_right:Nn378,390,411,412\clist_gset:Nn1378\clist_if_empty:NTF1461\clist_map_break:n3180,3826\clist_map_function:nN.
.
1444,1618,1620,1653,1667\clist_map_inline:Nn603,1561\clist_map_inline:nn363,626,1660,1942,3175,3823,3963,3998,5120\clist_new:N.
.
.
.
163,1130,1379,1457,1504,5149,5306代码索引151\clist_put_left:Nn1134,3892,3918\clist_put_right:Nn1294,1550,5143\clist_set:Nn1117,1447,1487,1488,1707,5307\clist_use:Nn5316\clubpenalty2988,2995\contentsname2354contentsname12continuation13cscommands:\cs_generate_variant:Nn.
.
.
125,488,500,1079,1196,1283,1303,1304,1505,1521,1593,1614,1653,1661,3023,3505,5376,5505,5612\cs_gset_eq:NN269,274,279,471,520,910,1270,1273,3133,3134,3139,3164\cs_gset_nopar:Npx905\cs_gset_protected:Npn3098,3145,3160\cs_gset_protected:Npx1161,1525,1611,3074\cs_gset_protected_nopar:Npx947\cs_if_eq:NNTF.
1038,3131,3163,5387,5393,5538,5618\cs_if_exist:NTF44,354,462,497,899,915,945,979,1057,1524,1609,1807,1819,2042,3246,3525,3563,3841,3843\cs_if_exist_p:N5451,5452\cs_if_exist_use:N1180,1181\cs_if_exist_use:NTF.
.
.
.
4,747,882,1202,1629,5383\cs_if_free:NTF.
.
.
.
482,492,605,621,1267,1425,2009,2012,2183,2197,2314,3194,3239,3285,3290,3294\cs_new:Npn146,153,964,994,999,1001,1005,1109,1175,1183,1228,1239,1682,2308,2484,3048,3056,3064,3083,3219,3283,3288,5150,5495,5613\cs_new:Npx4142,4148\cs_new_eq:NN6,7,8,9,20,23,140,141,142,158,159,355,489,590,652,924,949,1015,1045,1351,1358,1872,1990,2000,2006,2309,2310,2311,2542,2561,2564,3032,3042,3043,3044,3045,3046,3047,3097,3121,3122,3566,3839,3844,4806,4807,5125,5441,5442,5542,5614\cs_new_protected:Npn65,68,70,72,75,81,99,104,114,144,160,161,169,171,176,458,460,465,480,490,495,501,533,542,551,591,597,601,619,624,632,641,650,719,721,727,729,737,739,744,757,762,777,879,889,902,907,913,966,977,989,1008,1017,1033,1047,1072,1110,1131,1140,1159,1176,1186,1211,1249,1261,1263,1285,1287,1310,1386,1411,1420,1443,1445,1452,1459,1465,1472,1474,1479,1485,1506,1515,1522,1528,1539,1547,1553,1559,1577,1586,1594,1606,1624,1641,1659,1662,1664,1677,1696,1704,1718,1721,1723,1747,1761,1774,1787,1802,1809,1816,1851,1883,1887,1925,1933,1937,1947,1961,1991,1995,2007,2057,2182,2184,2209,2217,2229,2248,2258,2263,2417,2447,2495,2525,2532,2537,2545,2552,2559,2565,2567,2570,2586,3000,3006,3008,3016,3024,3033,3114,3124,3156,3167,3187,3192,3197,3207,3217,3261,3309,3327,3499,3521,3530,3536,3541,3551,3936,3951,3983,3988,4018,4024,4138,4154,4164,4166,5117,5126,5141,5321,5327,5334,5344,5346,5348,5353,5355,5357,5359,5369,5371,5377,5382,5385,5391,5398,5403,5408,5419,5423,5428,5433,5443,5448,5467,5518,5533,5543,5555,5564,5583,5588,5600,5615\cs_new_protected:Npx505,750,1334,3248,5342\cs_new_protected_nopar:Npn925,939\cs_replacement_spec:N5459,5481\cs_set:Npn2003,3300\cs_set_eq:NN143,215,220,225,549,569,594,598,607,622,731,764,772,779,781,782,918,919,1016,1046,1064,1107,1164,1524,1531,1541,1542,1543,1609,1610,1720,1856,2021,2024,2025,2028,2325,2330,2333,2338,2566,2568,3035,3036,3037,3038,3039,3040,3128,3171,3181\cs_set_nopar:Npn1746\cs_set_nopar:Npx3209,5361\cs_set_protected:Npn.
.
.
.
593,1050,1065,1964,3241,3298,4025,5446,5510\cs_set_protected:Npx742,1997,5435,5436\cs_to_str:N60,1333,1805,1812,5444\cs_undefine:N.
1144,1145,1149,1150,1544,2029,5383cs4size32\csname437,440,441,2886,2895,2896,2897,2904,2924,2925,2927,2930,2939,2940,2941,2944,3558,3559,4850,4852,4853,4854,4859,4863\CTeX29,4119ctexcommands:\ctex_add_cmap:n485,490\ctex_add_cmap:Nn493,495,500\ctex_add_dvi_zhmap:465,467,471\ctex_add_to_selectfont:n1995,2048,2076,2103,2196\ctex_after_end_preamble:n.
.
.
40,143,467,5346,5353\ctex_appto_cmd:NnnTF516,769,1712,5428\ctex_assign_heading_name:nn2453,2492,3090\ctex_at_begin_package:nn142,5321\ctex_at_end:n.
.
160,292,330,336,347,352,1990,4232\ctex_at_end_package:nn142,468,519,788,794,1055,1897,1899,1917,1922,1929,2312,3143,3158,3227,3234,3293,3295,3296,3332,3375,3534,3572,4121,5334\ctex_at_end_preamble:n357,576,583,1850,5344,5353\ctex_auto_ignorespaces:590,598,2113\ctex_CJK_input:n542\ctex_cleveref_hook:3534,3541\ctex_declare_math_sizes:nnnn3983,4017\ctex_define:n64,1615,1654,2105,2126,2164,2198,2326,2352,2380,2390,2393,2396,2524,3086,3490,4123,4199\ctex_define_option:n64,191,384,387\ctex_deprecated_command:Nn169,2147,2149,2157,2159,2295,2302\ctex_deprecated_option:n169,173,229,238,329,335,339,346,351,4127\ctex_deprecated_option:nn169,296\ctex_detect_platform:4154,4169,4184\ctex_family_cmap:nn480,489代码索引152\ctex_file_input:n75,393,538,653,780,2139,3850,3885,3890,3895,3896,3911,3916,3922,3923,4028,4029,4191,4232,4569,4570\ctex_fix_varioref_label:n3533,3536\ctex_fontset_case:nnn4142,4503,4726\ctex_fontset_case:nnnn.
4148,4364,4428,4573,4662\ctex_fontset_error:n4138,4365,4401,4429,4466,4533,4574,4576,4577,4614,4663,4695\ctex_gadd_hook:Nn5369\ctex_gadd_ltxhook:nn462,463,1807,1812,5342,5345,5347,5349\ctex_gadd_package_hook:nnn.
.
.
5325,5338,5348,5369\ctex_get_macro_meaning:N5513\ctex_get_macro_meaning:NTF5509,5535,5591\ctex_hang_from:n3008\ctex_heading_depth:nn3493,3496,3499\ctex_heading_glue:n3024\ctex_heading_hang:Nnn3002,3007,3008\ctex_hypersetup:n78,355,1880,1892,1895,1910,1913,1916\ctex_if_autoindent_touched:TF158,215,220,225,3877\ctex_if_ccglue_touched:TF1975,2219\ctex_if_ccglue_touched_p:1975\ctex_if_platform_macos:TF4159,4164\ctex_if_preamble:TF142,4203\ctex_if_rescanable:NnTF5533,5567\ctex_ignorespaces_case:N.
.
.
.
591,2110,2113,2116\ctex_indent_box:n2532\ctex_load_fontset:4166,4211,4231\ctex_load_zhmap:nnnn533,4395,4460,4527,4607,4689,4752\ctex_ltj_add_font_features:n1285,1348\ctex_ltj_add_font_features:nn1285,1286\ctex_ltj_add_kyenc:n806,1088\ctex_ltj_char_range_key:nn1701,1704\ctex_ltj_clear_alt_font:n843,1572\ctex_ltj_clear_alternate_font:n1618,1624\ctex_ltj_declare_alternate_shape:nnnnnn1533,1553\ctex_ltj_declare_char_range:n.
.
.
.
1656,1659,1661\ctex_ltj_declare_char_range:nn1663,1664\ctex_ltj_def_char_range_key:n1669,1696\ctex_ltj_ensure_default_family:1386,1869\ctex_ltj_extract_font:918,925\ctex_ltj_family_if_exist:nNTF1188,1197,1390,1395,1413,1416,1627\l_ctex_ltj_family_tl1190,1195,1252,1253,1268,1272,1275,1286,1621,1622\ctex_ltj_fontspec:nn1249,1261,1296,1343\ctex_ltj_get_and_define_fonts:nN1008\ctex_ltj_get_and_define_fonts_al:nN.
.
.
1012,1015\ctex_ltj_get_and_define_fonts_ja:nN.
.
.
1011,1017\ctex_ltj_if_alternate_shape_exist:nTF928,941,959,968\ctex_ltj_if_jfont:nTF62,994,1006,1010\ctex_ltj_if_jfont_math:NTF1001,1040\ctex_ltj_is_kenc:n809,996\ctex_ltj_math_group_hook:.
.
.
61,61,1039,1045,1065\ctex_ltj_patch_external_font:n812,965\ctex_ltj_pickup_alt_font:nn849,970\ctex_ltj_pickup_font:.
895,913,984,1020,1022,1024\ctex_ltj_reset_alternate_font:n1620,1641\ctex_ltj_save_alternate_family:Nnnn1498,1519,1522\ctex_ltj_save_alternate_seq:Nn1469,1474\ctex_ltj_save_char_range:n1667,1674\ctex_ltj_save_char_range:nn1676,1677\ctex_ltj_select_alternate_font:966,2051\ctex_ltj_select_font:879,2050\ctex_ltj_set_alt_font:nnnn834,1588,1591\ctex_ltj_set_alternate_family:nn1473,1506\ctex_ltj_set_alternate_family:nnn.
1518,1526,1528\ctex_ltj_set_alternate_family:Nnnnn1510,1515,1521\ctex_ltj_set_alternate_family:nnTF.
.
.
.
1118,1459\ctex_ltj_set_alternate_prop:n1438,1443\ctex_ltj_set_alternate_shape:n1579,1586,1593,1598\ctex_ltj_set_alternate_shape:nnN1565,1594\ctex_ltj_set_alternate_shape:nnn1568,1574\ctex_ltj_set_alternate_shape:nnnn1576,1577\ctex_ltj_set_alternate_shape:Nnnnnnn.
.
1556,1559\ctex_ltj_set_family:nnn1110,1280,1327,1337,1355,1362,1368,1374\ctex_ltj_set_kanjiskip:N1721,1969\ctex_ltj_set_math_letter:NN1047,1059,1067\ctex_ltj_set_xkanjiskip:N1721,2064\ctex_ltj_subst_font:919,939\ctex_ltj_swap_cs:NN1532,1539\ctex_ltj_switch_family:n1185,1186,1196,1253,1281,1335\ctex_ltj_update_mathfont:1408,1411\ctex_ltj_update_mathfont:n1414,1417,1420\ctex_ltj_use_jfont:829,935\ctex_ltj_use_math_group:Nn1033,1064\ctex_ltj_zero_globaldefs:724,872\ctex_make_spa:nn5117\ctex_mono_jfm:n1072,1080,2133\ctex_parse_name:NN1821,2032,5439,5443\ctex_parse_name:NNn5444,5448,5505\ctex_patch_boot:NNnnTF5400,5405,5410,5425,5430,5433\ctex_patch_cmd:Nnn76,1742,3263,3269,3275,3347,3350,3354,3360,3370,3377,3380,3383,3386,3394,3397,3401,3407,3417,4133,4134,4135,5408\ctex_patch_cmd_all:NnnnTF3553,5403\ctex_patch_cmd_once:NnnnTF1736,2034,5398\ctex_patch_failure:N.
.
522,773,775,1716,2039,3326,3338,3561,5417,5419\ctex_plane_to_utfxvibe:Nn550\ctex_pop_file:79,99,123,547\ctex_preto_cmd:NnnTF765,3323,3334,5423\ctex_provide_font_hook:NNN1802\ctex_punct_map_bfseries:nn624,4391,4398,4455,4456,4463,4522,4523,4524,4530,4602,4603,4604,4611,4683,4684,4692,4745,4748,4755代码索引153\ctex_punct_map_family:nn619,4388,4389,4390,4397,4452,4453,4454,4462,4518,4519,4520,4529,4598,4599,4600,4609,4610,4679,4680,4681,4691,4744,4747,4749,4754\ctex_punct_map_itshape:nn641,4392,4399,4457,4464,4521,4531,4601,4612,4682,4693,4746,4756\ctex_punct_map_series:nnn628,629,632\ctex_punct_set:n601,4387,4396,4451,4461,4517,4528,4597,4608,4678,4690,4730,4753\ctex_punct_space:nn650\ctex_push_file:77,81,116,544\ctex_scheme_input:n113,3574,3852\ctex_select_size:.
.
2171,2178,2181,2182,2203,2261\ctex_set:n64,293,2141,2161,3876,3878\ctex_set:nn.
.
.
.
31,64,174,2151,3577,3635,3663,3695,3730,3747,3761,3777,3785,3793,3801,3808,3809,3810,4239\ctex_set_default_ccwd:Nn144,224,2177,2202\ctex_set_deprecated_option:n169,203,204,258,259,260,282,287,321,322\ctex_set_font_size:Nnn4018,4033,4041,4052,4063,4064,4065,4066,4067,4068,4069,4072,4080,4091,4102,4103,4104,4105,4106,4107,4108\ctex_set_ignorespaces:591,600\ctex_set_upfamily:nnn.
.
.
1747,1794,4411,4412,4413,4414,4476,4477,4478,4479,4543,4544,4545,4546,4547,4548,4623,4624,4625,4626,4627,4628,4705,4706,4707,4768,4769,4770,4771,4772,4773,4774\ctex_set_upfonts:nnnnnn1787,1797,4404,4469,4536,4761\ctex_set_upmap:nnn.
.
1761,1789,1790,1791,1792,1795,4549,4550,4617,4618,4619,4620,4704,4775,4776\ctex_set_upmap_unicode:nnn1774,1796,4621,4622,4698,4700,4702\ctex_set_zhmap:n457,538,1763,1776\ctex_titleps_hook:3259,3294,3295\ctex_titlesec_hook:3167,3231\ctex_update_ccglue:1961,2226,2246,2289\ctex_update_ccwd:1947,2220,2297\ctex_update_default_family:50,576,1850,1851\ctex_update_em_unit:1991,2211,2265\ctex_update_kanjisize:2078\ctex_update_parindent:2189,2248,2290\ctex_update_size:2183,2184\ctex_update_stretch:2188,2209\ctex_update_xkanjiskip:2056,2076\ctex_update_ziju:2191,2263\ctex_use_package_hook:nn5377,5388,5394\ctex_use_zhmap:460,463,466,470\ctex_varioref_hook:3530,3564,3572\ctex_zhmap_case:nnn.
.
159,269,274,279,4367,4431,4505,4581,4665,4728\ctex_zihao:n3935,3936\ctex_ziju:n2257,2258ctexinternalcommands:\g__ctex_after_end_preamble_hook_tl5356,5360,5368\__ctex_assign_heading_name:nnn2492\l__ctex_autoindent_tl.
.
157,214,219,224,2170,2174,2177,2250,2253,2528\__ctex_calc_bounds:nn5145,5146,5150\__ctex_ccglue:1978,1990\l__ctex_ccglue_skip1965,1969,1972,1974,1982,1986,2224,2236,2245,2280,2288\c__ctex_class_tl117,119,415,420,425,430,3839,3845,3847,3848,3850\__ctex_clear_fntef_color:n.
.
.
1925,1933,1937,1944\__ctex_cleveref_hook_aux:N3541\c__ctex_cmap_encoding_seq478,484\l__ctex_ctexcap_options_clist.
.
.
.
5306,5307,5316\__ctex_def_heading_keys:n2447,2522\__ctex_default_ccwd_aux:n145,146\__ctex_default_ccwd_aux:w149,153\g__ctex_encoding_tl155,248,251,254,401,405,526,529,578,586,1893,2306,3880,3907,3921\g__ctex_end_preamble_hook_tl5354,5358,5367\c__ctex_engine_file_str43,2139\c__ctex_engine_str43\l__ctex_family_default_init_tl1853,1871\__ctex_family_default_wrap:n1856,1872,1875\g__ctex_file_status_seq83,101,112\l__ctex_file_status_tl101,102,111\g__ctex_font_size_int186,197,198,199,373,377,409,3897,3898,3924,3925,4026\c__ctex_font_size_prop3938,3949,3993,4020\c__ctex_font_size_seq3947,3950,3961\l__ctex_font_size_tl3938,3939,3985,3986,4020,4021\g__ctex_fontset_tl257,4157,4160,4161,4168,4172,4173,4176,4177,4180,4186,4191,4208,4210,4215,4230\__ctex_get_font_sizes:Nn3985,3988\__ctex_get_macro_meaning:w5509\l__ctex_heading_bool298,3835\c__ctex_heading_level_prop3501,3506\l__ctex_heading_skip.
.
.
.
2549,2556,2558,2560,2561,2572,2573,2576,2578,2579,2582,3027,3028,3029\c__ctex_headings_cs_seq3116,3129,3138,3161\c__ctex_headings_seq.
.
.
2407,2519,3244,3307,3532\__ctex_hookto_cmd:Nnnnw5425,5430,5588\__ctex_hookto_cmd_parameter:Nnnnw5595,5615\__ctex_hookto_cmd_parameterless:Nnnnw.
5594,5600\__ctex_initial_heading:n2417,2521\__ctex_insert_indent:2535,2537,3014\__ctex_left_hook_aux:nn5613\l__ctex_line_spread_fp119,207,3899,3900,3926,3927,4112,4114\l__ctex_line_stretch_tl2202,2207,2208,2212\l__ctex_ltj_add_alternate_bool1265,1277,1295,1302\__ctex_ltj_alternate_cs:n.
.
.
.
1145,1148,1149,1150,1180,1181,1183,1268,1271,1272,1274,1275,1469,1511,1571,1590,1630,1647\l__ctex_ltj_alternate_family_tl1535,1538\l__ctex_ltj_alternate_options_clist1488,1489,1500,1504代码索引154\l__ctex_ltj_alternate_prop1114,1454,1455,1458,1468,1476\l__ctex_ltj_base_CJKfamily_tl1115,1129,1178,1571,1590\l__ctex_ltj_base_family_tl71,1146,1173,1179,1517,1557,1610,1627,1633,1634,1646\l__ctex_ltj_char_range_clist.
.
.
1113,1440,1461,1487,1499,1512,1534,1556,1707\g__ctex_ltj_char_range_prop1563,1664\l__ctex_ltj_char_range_tl1563,1566,1666,1668,1670,1672,1679\__ctex_ltj_chardef_text_cmd:733,737\__ctex_ltj_chardef_text_cmd_aux:N738,739\__ctex_ltj_check_family:n1140,1467\l__ctex_ltj_cmd_tl732,736,738\l__ctex_ltj_current_font_tl57,882,886,887,899,945,950\l__ctex_ltj_current_shape_tl.
.
.
.
968,971,974,975\__ctex_ltj_declare_char_range:nn1660,1662\g__ctex_ltj_default_features_clist1133,1378,1379\__ctex_ltj_family_csname:n.
.
.
1144,1161,1175,1202\g__ctex_ltj_family_font_name_prop1120,1137,1142,1213,1289,1388,1400\g__ctex_ltj_family_font_options_prop1121,1137,1292\g__ctex_ltj_family_int.
1255,1257,1549,1550,1552\g__ctex_ltj_family_name_prop1137,1146,1167,1199,1517\__ctex_ltj_family_unknown_warning:n1193,1211,1638\l__ctex_ltj_font_options_clist.
.
.
.
1117,1122,1123,1124,1130,1166,1293,1294,1297,1508,1509,1513\g__ctex_ltj_fontname_seq904,909,912\__ctex_ltj_fontspec:nnn1256,1263,1283\g__ctex_ltj_fontspec_family_tl1165,1168,1174,1179,1204\g__ctex_ltj_fontspec_prop1251,1279,1284\__ctex_ltj_gset_family_cs:nn1125,1159\__ctex_ltj_if_alt_set:nTF864,961\__ctex_ltj_if_jfont_math:w1002,1005\l__ctex_ltj_jfm_tl1072,1091,1093,1135\__ctex_ltj_ltj_if_jfont:w996,999\c__ctex_ltj_math_fam_int1099,1100\c__ctex_ltj_math_family_tl1422,1424,1426,1429,1433\c__ctex_ltj_math_tl.
.
.
1094,1095,1097,1099,1374,1413,1423,1428,1432\__ctex_ltj_msg_def_family_map:n1226,1228\__ctex_ltj_msg_family_map:n1158,1225,1239\__ctex_ltj_noembed_wrap:n1107,1109\__ctex_ltj_pass_args:nnnn1310,1326,1336,1342,1354,1361,1367,1373\__ctex_ltj_patch_external_font:w931,964\__ctex_ltj_patch_text_cmd:NN759,762\__ctex_ltj_pickup_alt_font:Nn857,992\__ctex_ltj_pop_fontname:898,907,986\__ctex_ltj_post_arg:w1313,1319\__ctex_ltj_push_alternate_prop:n1444,1445\__ctex_ltj_push_alternate_prop:nn.
1449,1452,1708\__ctex_ltj_push_fontname:n894,902,983\c__ctex_ltj_range_max_int1691,1695\c__ctex_ltj_range_min_int1690,1694\__ctex_ltj_range_normalization:nn.
1581,1680,1682\g__ctex_ltj_reset_alternate_prop1151,1632,1644,1652\__ctex_ltj_save_alternate_auxi:w1477,1479\__ctex_ltj_save_alternate_auxii:w.
1482,1483,1485\__ctex_ltj_save_alternate_shape:Nn1570,1589,1606\__ctex_ltj_select_font_aux:883,889\__ctex_ltj_set_alternate_family:n1169,1176\__ctex_ltj_set_alternate_family_aux:nnn1463,1472\__ctex_ltj_set_family_aux:nnn1462,1465\__ctex_ltj_tmp:w1541,1543,1544\l__ctex_ltj_tmp_clist1447,1448,1450,1457\l__ctex_ltj_tmp_tl909,910,1116,1117,1142,1153,1156,1290,1298,1332,1335,1337,1390,1395,1413,1414,1416,1417,1491,1493,1494,1501\g__ctex_ltj_unknown_family_seq.
.
.
1215,1217,1222\__ctex_ltj_update_family_uid:N.
.
.
1123,1508,1546\__ctex_ltj_use_global_options:N1124,1131,1489,1509\c__ctex_msyh_suffix_tl4718,4733,4734,4740,4741,4765,4766\__ctex_package_loaded_warning:nn5324,5327\l__ctex_parameter_str5506,5525,5546,5593\l__ctex_parameter_tl5546,5551,5562\__ctex_parse_name:nNNNnN5458,5467\__ctex_parse_name:w5480,5486,5495\__ctex_patch_cmd:Nnnnnw5400,5405,5410,5564\__ctex_patch_false:w5436,5442,5579,5581,5598,5624\__ctex_patch_rebuild:Nn5537,5543,5576,5617,5621\__ctex_patch_replace:nnnTF5571,5583\__ctex_patch_rescan:NNn5545,5546,5547,5555\__ctex_patch_toc_width:n3318\__ctex_patch_true:w.
.
.
.
5435,5441,5577,5610,5622\__ctex_plus_key_aux:nn2474,2476,2477,2478,2479,2480,2481,2484\__ctex_pop_file_aux:nnnn102,104\l__ctex_prefix_str5506,5524,5545,5602,5603\l__ctex_prefix_tl5545,5550,5561\__ctex_provide_font_hook_aux:NNNN.
1804,1809,1816\l__ctex_punct_bounds_clist.
.
.
5131,5137,5143,5149\c__ctex_punct_family_clist603,613\l__ctex_punct_font5129,5130\c__ctex_punct_seq5109,5132\l__ctex_punct_tl284,573,574,660,1080,2130,2131,2132,2133\__ctex_rebuild_cmd:w.
.
.
5537,5538,5542,5617,5618\l__ctex_replacement_str5506,5526,5547,5585,5586,5620\l__ctex_replacement_tl5547,5552,5563\__ctex_restore_selectfont:2007,2029,2038\__ctex_right_hook_aux:nn5614代码索引155\__ctex_save_bounds:n5133,5141\__ctex_save_cmap:Nn497,501\__ctex_save_font_size:nn3949\l__ctex_scheme_tl309,3574,3852\g__ctex_section_depth_int126,303,305,3775,3791,3807\c__ctex_section_headings_seq.
2403,2409,3071,3185\__ctex_set_font_size:nnNn4021,4024\g__ctex_spa_iow5119,5122,5124,5134\c__ctex_std_class_tl116,3823,3838,3839,3905,3928\g__ctex_std_options_clist162,378,390,411,412,416,421,426,431\__ctex_titlesec_format:n3181,3189,3192\__ctex_titlesec_format:Nn3171,3195,3197\__ctex_titlesec_format_explicit:Nn.
.
.
.
3172,3207\__ctex_titlesec_hook:n3181,3185,3187\__ctex_titlesec_spacing:Nn3190,3217\__ctex_titlesec_spacing:nnnnnn3218,3219\__ctex_tmp:N2003,2032\__ctex_tmp:w5446,5499,5510,5531\l__ctex_tmp_box60,1950,1951,3019,3020,3021,3311,3315\l__ctex_tmp_dim60,2212,2213,2222,2225,2232,2270,2272,2274,2283,2285\l__ctex_tmp_int60,554,556,557,559,563,565,2231,2233,2234,2240,2241,2272,2273,2274,2277,2278,2283,2285,3070,3073,3077\l__ctex_tmp_tl60,362,369,384,385,503,504,553,555,2005,2034,2449,2504,2517,2524,3501,3502,3904,3905,3993,3994\__ctex_update_stretch_auxi:2214,2217\__ctex_update_stretch_auxii:2215,2229\__ctex_use_package_hook_aux:N5380,5382\c__ctex_version_tl3,6,7,8,9,20,23\__ctex_write_family:nn5121,5126\l__ctex_xkanjiskip_skip2056\l__ctex_xkanjiskip_tl2063,2068,2069\c__ctex_zero_tl2186,2193,2195\g__ctex_zhmap_tl459,461,474\g__ctex_zhmCJK_bool.
156,268,273,278,525,577,1801\l__ctex_ziju_dim2266,2267,2271,2282,2284,2288,2292\l__ctex_ziju_tl2186,2194,2195,2260,2266\ctexbibname2376,2396\CTEXcounter2311\CTEXdigits28,2321CTEXfilltwosides33,35\CTEXifname26,2564,2654,2696,2838,3050,3058,3066,3302,3349,3352,3356,3368,3372,3379,3382,3385,3388,3396,3399,3403,3415,3419\CTEXindent33,2293\CTEXnoindent33,2293\CTEXnumber28,2321\CTEXnumberline3064,3084,3653\CTEXoptions33,2143\ctexset5,2140,2150,2160\CTEXsetfont33,2181\CTEXsetup33,2143\CTEXsout33,35\ctexspadef650,5136\CTEXthechapter26,2781,3059,3237,3368,3385,3415\CTEXtheparagraph26\CTEXthepart26,3051,3242\CTEXthesection26,3349,3356,3372,3379,3388,3396,3403,3419\CTEXthesubparagraph26\CTEXthesubsection26,3352,3382,3399\CTEXthesubsubsection26\CTEXunderdblline33,35\CTEXunderdot33,35\CTEXunderline33,35\CTEXunderwave33,35\CTEXxout33,35\CurrentOption390\cwd2078Ddeclarecharrange30,1654\DeclareErrorKanjiFont1730\DeclareFontEncoding1082\DeclareFontFamily511,1089,4250,4251,4252,4253,4254,4255\DeclareFontShape1090,1092,1751,1752,1755,1756,1757,1758,4264,4265,4266,4267,4268,4269,4270,4271,4272,4275,4276,4277,4278,4279,4280,4281,4282,4283,4286,4287,4288,4289,4292,4293,4294,4295,4300,4301,4302,4303,4304,4305,4306,4307,4308,4311,4312,4313,4314,4315,4316,4317,4318,4319,4322,4323,4324,4327,4328,4329,4334,4335,4336,4337,4338,4339,4340,4341,4342,4345,4346,4347,4348,4349,4350,4351,4352,4353,4356,4359\DeclareFontSubstitution1085\DeclareKanjiFamily1749,1750,4256,4257,4258,4259,4260,4261\DeclareKanjiSubstitution1731,1732\DeclareMathSizes3986\DeclareSymbolFont1095,1423,1733\def443,2627,2668,2704,2725,2741,2772,2813,2823,2848,2868,2894,2898,2935,2950,2966,2967,2971,4046,4057,4085,4096,4824,4860\defaultCJKfontfeatures1352\defbeamertemplate3428,3447,3466\defbeamertemplatealias3485,3486,3487\detokenize444dimcommands:\dim_abs:n2284\dim_add:Nn2267\dim_compare:nNnTF2213,2252,2268,2275,2539,2548,3028\dim_eval:n2238,2283\dim_max:nn3314\dim_min:nn2284\dim_new:N63,1960,2079,2080,2081,2292代码索引156\dim_set:Nn1951,1992,1993,1994,2212,2222,2253,2266,2270,2298,2534,2555,3010,3312,4116\dim_sub:Nn2274\dim_to_decimal:n3957,3958,3995\dim_to_decimal_in_unit:nn5156\dim_use:N150,4116\dim_zero:N2304\c_max_dim2213,2548\c_zero_dim.
.
.
2225,2238,2252,2268,2275,2462,2539,3028,3808\directlua702,706\do448\document5361,5364E\edef4843,4844\else438,441,442,446,1738,1739,1743,1744,2599,2608,2617,2633,2638,2674,2679,2760,2768,2784,2790,2796,2809,2819,2879,2884,2903,2908,2929,2934,2943,2965,2981,2994,3616,3644,4855,4856,4882,4906,4955,4987,5019,5068elsecommands:\else:528,997,1979,3137,3353,3400\em1736\eminnershape1738,1739,1744,1746\end3444,3463,3482,5218\endcsname437,440,441,2886,2895,2896,2897,2904,2924,2925,2927,2930,2939,2940,2941,2944,3558,3559,4850,4852,4853,4854,4857,4859,4863\endgroup438,455,2659,2700,2716,2737,2842,2861,2926,2964,2989,3446,3465,3484,4843,4851,4866\endinput438,4848\endlinechar4822,4823\everypar2883,2984,2996\EverySelectfont2042,2045expcommands:\exp_after:wN102,149,738,915,931,933,997,1002,3218,3939,3986,4021,5515\exp_args:cc3526\exp_args:Nc1804,3190,3195,5469\exp_args:Nco3300\exp_args:NNc759,881,5379\exp_args:Nnc109\exp_args:NNNo4115\exp_args:NNo2524\exp_args:Nnx3539\exp_args:No384,555,1010,1449,3214,5133,5531\exp_args:Nx292,583,657,1812,2257,3935,4114\exp_last_unbraced:Ne5480\exp_last_unbraced:NNNNo152\exp_last_unbraced:NNo2033\exp_not:N507,585,586,587,753,754,950,982,1085,1167,1168,1498,1861,1862,1863,1875,2423,2424,2425,2430,2432,2433,2434,2435,2438,2439,2442,2454,2455,2456,2457,2458,2467,2468,2469,2471,2472,2486,2488,2490,3076,3078,3079,3080,3081,3202,3203,3212,3213,3250,3252,3253,3539,3955,4186,5460,5461,5462,5550\exp_not:n148,179,1164,1165,1166,1297,1298,1499,1500,1501,1526,1582,1583,1611,1856,1876,1998,2473,3221,3527,5308,5364,5435,5436,5478,5550,5551,5552,5607,5608\expandafter437,438,440,441,449,453,3559,4825,4826,4850,4851,4852,4853,4854,4859,4863,4864\ExplSyntaxOff88,94,516,680,766,770,1737,2035,3323,3427,3555,5162,5413\ExplSyntaxOn87,717,3488,5102F\familydefault1859fancyhdr33,344\fangsong4791\fi438,441,442,450,451,452,454,2590,2595,2601,2610,2619,2622,2637,2642,2652,2663,2678,2683,2694,2720,2744,2752,2753,2756,2760,2770,2788,2794,2800,2812,2822,2826,2835,2836,2846,2851,2865,2869,2875,2881,2888,2890,2912,2913,2931,2945,2948,2969,2978,2997,2998,3348,3351,3355,3365,3366,3371,3378,3381,3384,3387,3395,3398,3402,3412,3413,3418,3440,3459,3478,3616,3644,4855,4856,4865,4901,4925,4982,5014,5038,5095ficommands:\fi:541,570,589,997,1848,1979,2040,3140,3357,3373,3404,3420\figurename2357figurename12filecommands:\g_file_curr_name_str672\file_if_exist:nTF.
.
.
.
48,4165,4180,4568,4719,4722\file_if_exist_input:nTF119\file_input:n78,120,122,546\file_input_stop:5350\fmtversion5340fntef33,35,325\font4250,4251,4252,4253,4254,4255fontset7,257,4199\fontsize3939fontspeccommands:\fontspec_gset_family:Nnn1165\fontspec_set_family:Nnn1535fontspecinternalcommands:\__fontspec_fontname_wrap:n62,1107\l__fontspec_rmfamily_encoding_tl76\footnotesep4115\footnotesize4052,4091,4115fpcommands:\fp_eval:n2260,5152\fp_if_nan:nTF3899,3926,4112\fp_set:Nn3900,3927\fp_use:N2193,4114\c_nan_fp208\c_zero_fp2193代码索引157GGBK6,34,245\gdef.
445,451,3102,3103,3104,3105,3108,3109,3110,3111\global2764,2983,2986\globaljfont933\glueexpr3434,3445,3453,3464,3472,3483groupcommands:\group_begin:511,723,796,881,891,917,943,981,1003,1049,1112,1163,1530,1608,1626,1643,1855,2002,2082,2429,2437,2502,3026,3126,3259,3318,4115,5128,5358,5379,5437,5445,5454,5509\group_end:.
.
.
515,524,728,878,881,896,921,956,985,1007,1053,1127,1170,1536,1612,1639,1650,1867,2033,2102,2440,2444,2524,3030,3141,3282,3322,4115,5139,5358,5379,5457,5504,5532,5566,5590\group_insert_after:N953,954\gtfamily1738,1743Hhboxcommands:\hbox_set:Nn1950,3019,3311heading9,298\heiti4791hookcommands:\hook_gput_code:nnn5343\hskip2921,2937,2959,2966,2992,3378,3381\hspace2632,2673,3051,3059,3242\Huge2697,2734,2839,2858,3620,3651,4069,4108\huge2655,2693,2713,2834,3602,3619,3623,3649,3657,4068,4107hyperref33,349\hypersetup354,355,1884\hyphenchar4250,4251,4252,4253,4254,4255I\if444ifcommands:\if_bool:N525,577,1801\if_cs_exist:N550,2001\if_false:141\if_meaning:w1978\if_true:140\ifctexpdf139\ifdim2873,2916,2954,2973\ifnum442,2628,2650,2669,2692,2773,2832,2899,2929,2943,3348,3351,3355,3362,3363,3371,3378,3381,3384,3387,3395,3398,3402,3409,3410,3418,4855\ifodd439,451,2595,2597,2622,2629,2663,2670,2720,2744,2766,2777,2826,2846,2851,2865,2877,2888,2904,2917,2955,2974,2978,3438,3457,3476\ifx437,440,441,4853,4854,4859\ifzhmappdf4851,4880,4904,4928,4985,5017,5041\ignorespaces2999\immediate4862indent32,227\indexname2360indexname12\input5101,5165\insertcontinuationtext2369,2378,2385\insertpart3442,3443\insertromanpartnumber3432,3589\insertsection3461,3462\insertsectionnumber3451,3687\insertsubsection3480,3481\insertsubsectionnumber3470,3716intcommands:\int_case:nn409,4026\int_compare:nNnTF556,741,2234,2277,3775,3791,3807,3897,3924\int_const:Nn1099,1694,1695\int_div_truncate:nn84,563\int_eval:n1686,1687,1690,1691,3503\int_from_hex:n555\int_gincr:N1255,1549\int_gset:Nn.
.
128,188,197,198,199,303,305,373,377,3898,3925\int_incr:N3073\int_mod:nn565\int_new:N61,127,187,1552\int_set:Nn97,109,545,554,2231,2272,2529\int_sub:Nn559,2278\int_to_Hex:n557,562,564\int_use:N92,508,1257,1550,3077,5133\int_zero:N3070\c_zero_int2234intinternalcommands:\__ctexpar2960\interlinepenalty.
2647,2689,2709,2730,2854,2922,2960iowcommands:\iow_close:N5122\iow_indent:n5313\iow_new:N5124\iow_now:Nn5134\iow_open:Nn5119\itemsep4049,4060,4088,4099\itshape1738,1739,1743,1744J\jfam1041,1100,1735K\kaishu4791\kanjifamily1729,1843,1844,1845\kanjifamilydefault1846kernelinternalcommands:\l__kernel_expl_bool86keyscommands:\l_keys_choice_tl293\keys_define:nn66,69,1104,1436,1546,1700\keys_if_exist:nnTF1698\l_keys_key_tl166,168,182\keys_set:nn71,73\keys_set_known:nn3855\keys_set_known:nnN1116代码索引158L\labelformat3539,3563\languagealias3884,3889,3910,3915\LARGE4067,4106\Large2651,3600,3606,3674,3678,4066,4105\large3699,4065,4104\lastbox2987\leavevmode2590,2869leftcommands:\c_left_brace_str5501\leftmargin4046,4057,4085,4096\leftmargini4046,4057,4085,4096\let447,450,2902,2911,4039,4078,4846,4852\linespread4114linespread11,207linestretch11,2198\linewidth2232,2240,2271\lishu4791\listfigurename2355listfigurename12\listtablename2356listtablename12\LoadClass417,422,427,432\long4860\ltjdefcharrange.
681,682,683,685,690,691,695,698,699LTJFONTUID1546\ltjgetparameter1955,1982,2060,2074\ltjsetkanjiskip1722\ltjsetmathletter1051\ltjsetparameter701,704,710,1719\ltjsetxkanjiskip1724luacommands:\lua_now:n798,2084\LuaTeXjaversion865M\makeatletter766,770\MAKESPA5125,5166\markboth2563,2657,2686\mathgroup1041maxcommands:\c_max_char_int1695\mcfamily1743\mddefault1086,1090,1096,1424,1429modecommands:\mode_if_math:TF1035msgcommands:\msg_critical:nnn53,672,4139\msg_error:nn4219\msg_error:nnn19,22,38,41,663,676,679,2342,3940,4022\msg_error:nnnn4185,4214\msg_fatal:nn5107\msg_new:nnn.
165,167,181,183,399,666,1157,1223,1305,2373,3829,4140,4193,4228,5105,5309,5329,5421\msg_new:nnnn.
.
.
.
12,30,45,133,2344,3942,4195,4222\msg_warning:nn250,404,1300,2123,2134,2395\msg_warning:nnn170,1218,3848,4206,5315,5328,5420\msg_warning:nnnn178,1153,4175N\newCJKfontfamily1324\NewDocumentCommand1184,1319,1324,1330,1340,1346,1352,1359,1365,1371,1377,1574,1674,1728,2141,2144,2154,2181,2256,2293,2300,2321,2323,2492,3934,4119,4792,4793,4794,4795,4797,4798,4800,4810,4811\newfontfeature1101,1102,1103\newpage2746,2751\ngostype44\nobreak2651,2660,2717,2834,2839,2843,2858,2862,2975,3601,3650\nobreakspace2651,2693nocap33,321\noexpand4844,4846,4847,4848nofonts32noindent32nopunct33\normalem1924\normalfont1356,1363,1369,1407,1827,1849,2527,2647,2689,2709,2730,2829,2854,3081\normalsize3733,3750,3764,4033,4072,4110,4118nospace33nozhmap32\null2620,2749\numberline2783,2930,2944,3059,3067,3253,3318O\onecolumn2615P\pagestyle3875\par2554,2591,2651,2657,2658,2693,2697,2699,2713,2715,2734,2736,2834,2839,2841,2858,2860,2870,2925,2963,2975,3433,3434,3442,3445,3452,3453,3461,3464,3471,3472,3480,3483,3579,3601,3612,3630,3638,3650,3690,3692,3724,3726paragraph/afterskip34paragraph/beforeskip34paragraph/numbering16paragraph/runin22\parindent2252,2253,2275,2296,2298,2303,2304,2647,2709,2829,2854,3809\parsep4048,4049,4059,4060,4087,4088,4098,4099\part2588part/beforeskip34part/fixbeforeskip34part/numbering16part/pagestyle21,2502\partmark2562,2645,2687\partname2651,2693,3432,3584\PassOptionsToClass416,421,426,431\PassOptionsToPackage526,1888,2306,5317代码索引159\pdfmapline4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067\pdfoutput442,4855\pdfstringdefDisableCommands4122\pingfang4791prgcommands:\prg_do_nothing:471,1045,1524,1609,2000,2110,3043,5542\prg_generate_conditional_variant:Nnn1210\prg_new_conditional:Npnn959,1975\prg_new_protected_conditional:Npnn.
.
.
.
1197,5512\prg_return_false:.
.
.
962,1207,1979,1983,1987,5522\prg_return_true:961,1200,1205,1979,1983,1987,5527\primitive5218\ProcessKeysOptions396\proofname2347,2362proofname13propcommands:\prop_clear:N1114\prop_const_from_keyval:Nn3506\prop_get:NnN1292\prop_get:NnNTF.
.
.
1199,1251,1289,1517,1563,3501,3938,3993,4020\prop_gpop:NnNTF1142,1146,1644\prop_gput:Nnn.
1120,1121,1167,1279,1632,1668,3955\prop_gremove:Nn1151\prop_if_empty:NTF1213,1388,1468\prop_map_break:n1402\prop_map_inline:Nn1400,1476\prop_new:N1137,1138,1139,1284,1458,1652,1673,3949\prop_put:Nnn1455\prop_remove:Nn1454\protect2576,2582,2783,2804,2805,2930,2944,3059,3067,3252,3264,3266,3270,3272,3276,3278,3286,3291,3303,3304,5473,5474\ProvideDocumentCommand2562\ProvidesFile4858,4867,4869,4871,4873,4875,4877\providetranslation5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302punct10,33,284,2126\punctstyle574,2131Q\quad.
2895,3348,3349,3351,3352,3355,3356,3368,3372,3379,3382,3385,3388,3395,3396,3398,3399,3402,3403,3415,3419,3607,3658,3667,3700,3734,3751,3765quarkcommands:\q_mark1477,1485,5516,5519\q_stop150,153,996,999,1002,1005,5481,5486,5495,5516,5519\quotation4132R\raggedright2647,2709,2829,2854,3599,3648\refname2363,2368,2375,2384,2392,2393refname13\refstepcounter.
.
.
2631,2672,2779,2906,3521,3566,3567\relax437,440,441,444,2669,2692,2871,2907,2915,2921,2937,2953,2966,2972,2991,3378,3381,3434,3445,3453,3464,3472,3483,4817,4822,4825,4853,4854,4859\renewcommand2589,2605,2759\RenewDocumentCommand3567\RequirePackage.
.
.
.
27,56,57,59,330,336,347,357,527,530,531,532,656,674,677,790,795,1798,1897,1906,2307,3929\RequirePackageWithOptions5318resetalternatefont30,1615reversecommands:\reverse_if:N577,1801\rmdefault1861\rmfamily1824Sscancommands:\scan_stop:.
.
.
71,150,754,933,1041,1610,2223,2232,5129,5360scheme10,309\scriptsize4063,4102\secdef2602,2624,2771secnumdepth16,3490section/afterskip34section/beforeskip34section/numbering16section/runin22\sectionname3451,3684\selectfont1191,1635,1648,1729,1824,1825,1826,2032,2039,2053,2183,3939seqcommands:\seq_const_from_clist:Nn.
478,2404,2414,3116,5109\seq_gpop:NN101\seq_gpop:NNTF909\seq_gpush:Nn83,904\seq_gput_left:Nn2410,2411\seq_gput_right:Nn1217,3961\seq_gset_eq:NN2409\seq_if_in:NnTF484,1215\seq_map_function:NN3185,3307\seq_map_inline:Nn.
.
.
2519,3071,3119,3129,3138,3161,3244,3532,5132\seq_new:N112,912,1222,2408,3950\seq_use:Nnnn3947代码索引160\setbox2987\setCJKfamilyfont1236,1324,4379,4381,4383,4385,4421,4422,4423,4424,4443,4445,4447,4449,4492,4494,4496,4498,4511,4512,4513,4514,4515,4516,4557,4559,4560,4561,4562,4563,4591,4592,4593,4594,4595,4596,4637,4638,4639,4640,4651,4652,4653,4654,4655,4656,4657,4673,4675,4677,4713,4714,4715,4736,4737,4738,4739,4740,4742,4743,4782,4783,4784,4785,4786,4787,4788\setCJKmainfont1232,1352,4369,4417,4433,4482,4507,4553,4583,4633,4643,4667,4710,4731,4779\setCJKmathfont1352\setCJKmonofont1234,1352,4377,4420,4441,4490,4510,4556,4590,4636,4650,4671,4712,4735,4781\setCJKromanfont1358,1384\setCJKsansfont1233,1352,4375,4419,4439,4488,4509,4555,4589,4635,4649,4669,4711,4733,4780\setcounter3502,3503\SetSymbolFont1097,1428,1432,1734\sfdefault1862\sffamily1825\shapedefault.
.
.
1086,1090,1092,1096,1098,1424,1426,1429,1433skipcommands:\skip_horizontal:N1965,3029\skip_if_eq:nnTF1982,1986,2059,2573,2579\skip_new:N1974,2072,2558\skip_set:Nn1955,1958,2063,2073,2224,2236,2280,2288,2560,2572,2578,3027\skip_set_eq:NN1972,2065\skip_sub:Nn2549,2556\skip_use:N2576,2582\skip_zero:N2245\c_zero_skip2460,2461,2510,2511,2573,2579\small4041,4080\songti4791\space442,2780,2834,3584,3646,3684,3715,3816space10,33,289,2105\special1765,1766,1769,1770,1778,1779,1782,1783,1904,1918,4883,4884,4885,4886,4887,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,4981,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5008,5009,5010,5011,5012,5013,5020,5021,5022,5023,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094\SplitArgument1575,1675,2493strcommands:\c_backslash_str5500\c_colon_str1028,1029,1030\c_dollar_str4719\str_case:nnTF1859,5471,5486\str_case_e:nnTF1230,1241\str_const:Nn43,50\str_if_empty:NTF5557,5593,5602\str_if_eq:nnTF529,573,578,1074,1392,1893,1901,3880,3907,3921,4205,4208,4225,4230,5477\str_if_eq_p:nn4172,4173\str_lowercase:n503\str_new:N5506,5507,5508\str_set:Nn5524,5525,5526\strutbox4116sub3section9,301sub4section9,301subparagraph/afterskip34subparagraph/beforeskip34subparagraph/numbering16subparagraph/runin22subsection/afterskip34subsection/beforeskip34subsection/numbering16subsection/runin22\subsectionname3470,3715subsubsection/afterskip34subsubsection/beforeskip34subsubsection/numbering16subsubsection/runin22\symmincho1735syscommands:\c_sys_engine_str44\sys_if_engine_pdftex:TF.
.
.
247,333,403,4144,4150\sys_if_engine_pdftex_p:4803\sys_if_engine_uptex:TF4146,4152\sys_if_engine_uptex_p:4804\sys_if_engine_xetex:TF327,5103\sys_if_output_pdf:TF139,513,1896,4151\sys_if_platform_windows:TF4156T\tablename2358tablename12\TeX4120TEXandLATEX2commands:\@@ifdefinable731\@@italiccorr1720\@@par2922,3668,3701,3735,3779,3795\@afterheading2665,2722,2811,2821,2980\@afterindentfalse2600,2765,2769,2874,2880\@afterindenttrue2598,2767,2872,2878\@Alph3812,3817\@break@tfor450\@chapapp2780,2834,3364,3384,3411\@chapter2771,2772代码索引161\@chinese2309,2318\@classoptionslist47,445,451,453\@clubpenalty2995\@currentHref3150\@currentlabel3523,3527\@currext4,142,5308,5387,5393\@currname4,142,5308,5388,5394\@dblarg2893\@defaultfamilyhook1827\@empty109,2902,2911\@endpart2701,2738,2740\@EverySelectfont@Init2001,2015,2027\@firstofone56\@firstoftwo3303\@gobble56\@hangfrom2921,2959\@ifclassloaded3825\@ifdefinable731\@ifl@t@r5340\@ifpackagelater37,40,662,675,678,703,1931\@ifpackageloaded.
.
.
.
18,21,671,785,1881,3224,3329,3543,5323,5336\@ifpackagewith3169,3178,3229,3390\@ifstar2891\@listI4039,4078\@listi4039,4046,4057,4078,4085,4096\@M2647,2689,2709,2730,2854,2922,2960,2988\@makechapterhead2808,2810,2823\@makeschapterhead2818,2820,2848\@minus3669,3702,3736,3752,3766,4035,4037,4043,4045,4047,4048,4054,4056,4058,4059,4074,4076,4082,4084,4086,4087,4093,4095,4097,4098\@namedef.
3264,3266,3270,3272,3276,3278,3286,3291\@nameuse3264,3266,3276,3278,3286\@ne447,3222,3351,3381,3398\@nil982\@nobreakfalse2982\@noskipsecfalse2986\@noskipsectrue2983\@onlypreamble40,475,540,1380,1381,1382,1383,1384,1385,1794,1795,1796,1797,4198\@part2602,2624,2626\@pkgextension6,7,8,9,20,23,673,5387,5393\@plus3613,3614,3669,3670,3702,3703,3736,3737,3752,3766,3780,3796,4035,4036,4037,4043,4044,4045,4047,4048,4054,4055,4056,4058,4059,4074,4075,4076,4082,4083,4084,4086,4087,4093,4094,4095,4097,4098\@popfilename142,5390\@pushfilename142\@reset@ptions142,5384\@rmfamilyhook76,1824\@schapter2771,2813\@seccntformat2894,2907\@secondoftwo3304\@secpenalty2885,3672,3705,3739,3753,3767\@sect2893,2898\@setfontsize4025\@sffamilyhook1825\@spart2602,2624,2703\@ssect2892,2950\@startsection99,102,110,2868,3076\@svsec2902,2907,2911,2921,2923,2937,2938\@svsechd2935,2966,2967,2989\@tempdima3312,3314\@tempskipa2871,2873,2874,2885,2915,2916,2953,2954,2972,2973,2976,2991,2992\@tempswafalse2618\@tempswatrue2616\@text@composite@x54,781\@tfor448\@topnewpage2808,2818\@topnum2764\@ttfamilyhook1826\@xsect2949,2970,2971\@zhdig2317\@zhnum2309,2316\abstractname12\add@unicode@accent54,782\addCJKfontfeature71\AfterEndPreamble141\algorithmname13\appendixname12,25\AtBeginDocument40,49\AtBeginDvi47\AtBeginShipoutFirst47\AtEndOfClass41\AtEndOfPackage41\AtEndOfPackageFile*141\AtEndPreamble141\baselineskip11,11,81,85\bfseries51\bibname12\c@chapter3817\c@secnumdepth.
.
2628,2650,2669,2692,2773,2832,2899,2929,2943,3348,3351,3355,3362,3363,3371,3378,3381,3384,3387,3395,3398,3402,3409,3410,3418\c@section3812\caption34\catcode49,132,142\ccwd.
.
.
11,11,27,27,33,33,40,79,80,80,84,84,85,85\chapter9,17,21,26,26,26,91,98,114\chaptermark13\chaptername17\char55\chardef@text@cmd54,779\CheckCommand80\Chinese33\chinese28,33,87\CJK@@ignorespaces50,590\CJK@encoding62,63,70,888,892,976,1081,1135,1423,1426,1428,1432,1572,1582,1583,1601,1602代码索引162\CJK@envStart50,50,585\CJK@family57,879,893,944,976,1188,1634,1644,1646,2053,2054\CJK@ignorespaces50,51,594,598\CJK@input50,542\CJK@loadBinding49,50,581\CJK@loadEncoding49\CJK@makeActive50,580\CJK@plane49,81,492,493,503,2042\CJK@surr49,550\CJK@upperReset50\CJKfamily63,74\CJKfamilydefault50,50,67,77,77,77,77\CJKglue84,85,119\CJKhook51,51\CJKrmdefault49\CJKsymbol81\CJKunderdotbasesep33\CJKunderline33\clearpage50\contentsname12,12\CS58\CTEX@add447,450,451\CTEX@add@unicode@accent750,782\CTEX@addloflotskip2569,2806\CTEX@addtocline.
.
.
2586,2644,2685,2802,2933,2947\CTEX@afterindent2877,3037,3044\CTEX@aftertitle2963,2968,3036,3043\CTEX@alchar719,742\CTEX@appendix@number3091,3103,3109\CTEX@appendix@numbering3092,3105,3111\CTEX@beginallalchar719,746,752,767,791\CTEX@chapter@afterindent2766\CTEX@chapter@aftername2838\CTEX@chapter@afterskip2845,2864\CTEX@chapter@aftertitle2841,2860\CTEX@chapter@beforeskip2825,2850\CTEX@chapter@break2762\CTEX@chapter@fixskip2826,2846,2851,2865\CTEX@chapter@format2831,2856\CTEX@chapter@lofskip2508\CTEX@chapter@lotskip2509\CTEX@chapter@numbering2777,3111\CTEX@chapter@pagestyle2507,2763\CTEX@chapter@titleformat2840,2859\CTEX@chapter@tocline3048\CTEX@chaptername2838\CTEX@chardef@text@cmd729,779\CTEX@defaultfamilyhook1837\CTEX@document@left@hook5357,5363\CTEX@document@right@hook5359,5365\CTEX@endallalchar719,748,755,771,792\CTEX@Family@CMap489,517,520\CTEX@fixheadingskip2547,2552,2595,2663,2720,2744,2846,2865,2888,2978\CTEX@fixskip2888,2978,3038,3045\CTEX@fixtopskip2544,2622,2826,2851\CTEX@gettitle.
.
.
2643,2684,2707,2728,2801,2816,2914,2952,3156\CTEX@hang3007,3039,3046\CTEX@heading@format@initial2525,2648,2690,2710,2731,2830,2855,2919,2957,3435,3454,3473\CTEX@heading@glue2993,3024\CTEX@headinghang2653,2695,2712,2733,2837,2857,3000\CTEX@headingskip2561,2596,2623,2664,2721,2745,2827,2847,2852,2866,2889,2979\CTEX@hyperheadinghook3124,3154\CTEX@ifnamefalse2564,2634,2639,2675,2680,2705,2726,2785,2791,2797,2814,2900,2909,2951\CTEX@ifnametrue2564,2630,2671,2778,2905\CTEX@indentbox.
.
.
.
2542,2938,2967,3437,3456,3475\CTEX@makeanchor2635,2640,2676,2681,2786,2910,3114,3122,3134,3139,3145\CTEX@makeanchor@chapter2792,2798\CTEX@makeanchor@schapter2815\CTEX@makeanchor@sect2901\CTEX@makeanchor@spart2706,2727\CTEX@makeanchor@ssect2892\CTEX@part@afterindent2597\CTEX@part@aftername2654,2696,3439\CTEX@part@afterskip2662,2719,2743,3445\CTEX@part@aftertitle.
.
.
2658,2699,2715,2736,3443\CTEX@part@beforeskip2594,2621,3434\CTEX@part@break2592,2611\CTEX@part@fixskip2595,2622,2663,2720,2744\CTEX@part@format2649,2691,2711,2732,3436\CTEX@part@indent3437\CTEX@part@numbering2629,2670,3438\CTEX@part@pagestyle2506,2613\CTEX@part@titleformat.
.
2656,2698,2714,2735,3443\CTEX@part@tocline3048\CTEX@partname2654,2696,3439\CTEX@patch@text@cmd757,783\CTEX@patch@tunec777\CTEX@popfilename@hook5390\CTEX@postappendix3096,3104,3110\CTEX@postchapter3110\CTEX@postsection3104\CTEX@preappendix3095,3102,3108\CTEX@prechapter3108\CTEX@presection3102\CTEX@reset@ptions@hook5384\CTEX@rmfamilyhook76,1802,1834,1843\CTEX@runin2917,2955,2974,3040,3047\CTEX@save@appendix3097,3100\CTEX@save@refstepcounter3566,3569\CTEX@section@aftername3458\CTEX@section@afterskip3464\CTEX@section@aftertitle3462\CTEX@section@beforeskip3453\CTEX@section@format3455\CTEX@section@indent3456代码索引163\CTEX@section@numbering3105,3457\CTEX@section@titleformat3462\CTEX@sectionhang2923,2961,3000\CTEX@sectionname3458\CTEX@selectfont@hook1995,2042,2045\CTEX@selectfont@save2006,2021,2025,2028\CTEX@setcurrentlabel@n3521,3570\CTEX@setheadingskip2559,2594,2621,2662,2719,2743,2825,2845,2850,2864,2887,2977\CTEX@sffamilyhook1835,1844\CTEX@subsection@aftername3477\CTEX@subsection@afterskip3483\CTEX@subsection@aftertitle3481\CTEX@subsection@beforeskip3472\CTEX@subsection@format3474\CTEX@subsection@indent3475\CTEX@subsection@numbering3476\CTEX@subsection@titleformat3481\CTEX@subsectionname3477\CTEX@text@composite@x744,781\CTEX@textcmd764,765,769,772\CTEX@thechapter3109\CTEX@thesection3103\CTEX@titleformat@n99,2962,2968,3035,3042\CTEX@titlepslabel@clear3273,3283\CTEX@titlepslabel@set3267,3279,3283\CTEX@toc@width@n3309,3324,3336\CTEX@todayold2325,2330\CTEX@ttfamilyhook1836,1845\CTEX@update@sectionformat@n2876,3033\CTEX@verbatim@font@hook1714,1718\ctex@zhmap@endinput5097\CTEXdigits28\CTEXifname25,26\CTEXnumber28,28\CTEXnumberline25\CTEXoptions33,34\ctexset5,5,6,8,12,15,30,30,33,33,121\CTEXsetup33\CTEXthechapter13,14,26,103\CTEXthesection13,17,106\CTEXunderdotbasesep33\CTEXunderline33\curr@fontshape894,928,937,941,983\DeclareAlternateKanjiFont70\DeclareFontEncoding60\DeclareFontFamily48,58\DeclareFontShape58\DeclareFontShape@70,1533\DeclareRobustCommand143\DeclareTextCommand54\DeclareTextSymbol54\DeclareUnicodeAccent54\DeclareUnicodeComposite54\define@newfont58,920\do@subst@correction58,59,919\em74\endlinechar39,49\escapechar60\EverySelectfont80\external@font930,931,933\extract@font58,918\f@baselineskip2223\f@encoding892,936,1038\f@family57,893,936,944\f@nch@initialise3375\f@series888,976\f@shape888,976\f@size.
.
.
.
888,894,971,979,982,983,1951,1992,3315\fangsong8\fbox18\figurename12\font56,59\font@name57,58,897,904,905,910,915,933,934,951,1019,1020,1021,1022,1023,1030\fontcharwd80\footnotesep119,119\footnotesize119\get@external@font927\getanddefine@fonts1008\globaldefs57\globaljfont58\H@old@chapter3128\H@refstepcounter3544\hbox22,91\heiti8,131\hrule91\Hy@chapapp2786,2792,2798,2815\Hy@driver1901\Hy@MakeCurrentHrefAuto3147\Hy@org@chapter3128\Hy@raisedlink3148\hyper@anchorend3151\hyper@anchorstart3150\if@mainmatter2775,2833,3362,3409,3843,3844\if@nobreak2882\if@noskipsec2590,2869,2985\if@openright2606,2748,2760,3616,3644\if@tempswa2754\if@twocolumn2614,2807,2817\if@twoside2747,3346,3369,3393,3416\iffalse60\ifHy@implicit3127\ifin@60,450,997\iftrue60\in@449\indexname12\insertcontinuationtext13\itdefault59\itshape52\jfam74\kaishu8代码索引164\kanjifamilydefault76\kanjiskip81\labelformat109,109,109\leftmark13\linewidth84\lishu8\listfigurename12\listtablename12\ltj@@does@alt@set59\ltj@@getjfontnumber60,991\ltj@@set@stackfont1028,1029,1030\ltj@allalchar725\ltj@curjfnt58,81\ltj@pickup@altfont@auxy56,977\ltj@pickup@altfont@copy56,56,989\ltj@setpar@global74,1027,1722,1724\ltj@tempcntc60,992\ltjalchar55\ltjsetkanjiskip74\ltjsetparameter74\ltjsetxkanjiskip74\m@ne2628,2650,2773,2832,3355,3362,3363,3384,3409,3410,4250,4251,4252,4253,4254,4255\markboth13\markright13\math@bgroup1037\math@egroup1042\math@fonts1025\mathbb120\maxdimen11,84\meaning143,144,144,145\newcommand143\newrobustcmd143\newtitlemark104\nfss@catcodes62\noindent90\normalfont76\normalsize8,115\nouppercase49\NR@gettitle3160\numberline105\p@1951,1992,2693,2804,2805,2824,2834,2844,2849,2863,3315,3612,3640,3641,3642,3643,3650,4035,4036,4037,4043,4044,4045,4047,4048,4054,4055,4056,4058,4059,4074,4075,4076,4082,4083,4084,4086,4087,4093,4094,4095,4097,4098\pagenumbering28\pagestyle10\par@update80,2012,2016,2020\paragraph9,22,40\parindent11,33,84,86,91,99,119\parskip91\part15,21,23,24,91,98\partmark91\partname17\partpage15,107\PassOptionsToClass46\PassOptionsToPackage78\pdfmapline124\pickup@font57\pickup@jfont924\pingfang8,131\ProcessKeysOptions31,41\proofname13,87\protected104\protected@edef2322,2324,2907,3523\ProvidesFile132\ps@headings.
.
.
.
106,3345,3394,3397,3401,3407,3417\refname12,13\refstepcounter109\refstepcounter@noarg3546\refstepcounter@optarg3547\relax49,84\rightmark13\rmfamily52,76,76,76\roman28\scantokens143\scr@new@selectfont2009,2024\scr@selectfont2021,2025\scriptfont@name1022,1029\section9,15,16,17,17,22,22,23,23,24,24,26,26,34,88,98,106\section*16\sectionmark13\sectionname17\sectionpage15,107\selectfont59,75,80,80,81,84\setCJKfamilyfont29,29\setCJKmainfont30\setcounter108\sf@size1021\sffamily52\size@update84,85,2036,2037,2183,2197\sldefault59\songti8\special6,47,78\split@name982\SplitArgument90\ssf@size1023\strutbox119\subparagraph9,22,40\subsectionname17\subsectionpage15,108\subst@correction947,954\tablename12\textfont@name1020,1028\tf@size1019\thechapter13,26,26\thesection13,17,26,106\titleformat102\titlespacing102\today11,11代码索引165\trans@languagepath3892,3918\ttfamily52\ttl@a3242,3250\ttl@chapterout3237\ttl@extract102\ttl@setifthe3296\ttl@setsubmark104,3269,3275\ttl@settopmark104,3263,3294\ttl@tocpart3239,3241\ttlh@hang3203,3213\ttlh@runin3202,3212\tunec.
def54\tw@450\uppercase49\use@mathgroup1033,1064\usepackage33,33,35\verbatim@font1712,1716\vskip22\wrong@fontshape57\x@protect5474\xdef104\XeTeXglyphbounds136\xkanjiskip81\yahei8,131\youyuan8\z@710,713,2647,2709,2764,2829,2854,2873,2916,2954,2973,2987,3222,3348,3371,3378,3387,3395,3402,3418,4036,4044,4055,4075,4083,4094\zhdig87\zhdigits28\zhnum87\zhnumber28,28\zihao27\ziju27\zw80texcommands:\tex_afterassignment:D733\tex_chardef:D734\tex_def:D5550\tex_dimexpr:D150,2232\tex_divide:D84,2233,2273\tex_edef:D5604\tex_endlinechar:D92,97,109,545\tex_font:D507,5129\tex_glueexpr:D2223\tex_hangindent:D3020\tex_iftrue:D3844\tex_ignorespaces:D1185,1344,1349,2116,2257,3935,5360\tex_immediate:D504\tex_indent:D2540\tex_interlinepenalty:D2529\tex_kanjiskip:D1958,1972,1986\tex_noindent:D2530,3018\tex_numexpr:D754\tex_pagegoal:D2548\tex_parindent:D2534,2539,3010\tex_parskip:D2556\tex_pdffontattr:D507\tex_pdflastobj:D508\tex_pdfobj:D504\tex_prevdepth:D2555\tex_topskip:D2549\tex_Uchar:D742,753,754\tex_XeTeXcharglyph:D5133\tex_XeTeXglyphbounds:D5157\tex_xkanjiskip:D2061,2065,2075\textasteriskcentered783\the4822,4825,4826,4845,4849\thechapter2780,2783,2834,3364,3384,3411,3647\theparagraph3749\thepart2632,2651,2673,2693,3586\thesection3348,3355,3371,3378,3387,3395,3402,3418,3666\thesubparagraph3763\thesubsection3351,3381,3398,3698\thesubsubsection3732\thispagestyle2612,2613,2750,2761,2763\tiny4064,4103tlcommands:\c_novalue_tl5343\c_space_tl508\tl_clear:N219,385,1666,1670,1926,1938,2054,2174,2499,2517,2528,3990,5558\tl_clear_new:N60,362\tl_const:Nn3,415,420,425,430,651,673,1081,1094,1422,1829,1831,1832,1833,1840,1841,1842,2193,2421,2427,3826,3845,3847,4720,4723,4724\tl_gput_right:Nn459,485,600,1820,1834,1835,1836,1837,1843,1844,1845,5354,5356,5374\tl_gset:Nn248,251,254,405,557,560,1019,1021,1023,1396,1846,1857,4157,4160,4161,4177,4210\tl_gset_eq:NN1878\tl_gset_rescan:Nnn1403\tl_head:N3994\tl_head:n1447\tl_if_blank:nTF753,1481,1490,1690,1691,1706,2146,2156\tl_if_empty:NTF401,883,2250,2433,3538,4168\tl_if_empty:nTF154,1753,1767,1780,5521\tl_if_eq:NNTF1853,2186,3905\tl_if_exist:NTF.
.
117,599,1828,1831,1832,1833,1840,1841,1842,2347,2378,2389,2392,3838,3928,5373\tl_if_in:NnTF5585\tl_if_novalue:nTF1312,1333,1684,2498\tl_map_inline:Nn1596\tl_map_inline:nn3991\tl_new:N111,155,157,474,599,736,885,886,974,1078,1129,1156,1173,1174,1195,1538,1672,1811,1818,1871,2068,2194,2207,2349,2419,2420,3095,3096,5367,5368,5373,5561,5562,5563\tl_put_left:Nn2027,5390代码索引166\tl_put_right:Nn369,1025,1679,2015,2016,2020,2449,2488,2490,3994,3995,5384\tl_remove_all:Nn1448\tl_replace_all:Nnn1494\tl_replace_once:Nnn1821\tl_rescan:nn145,5603,5612\tl_set:Nn.
145,214,503,535,536,537,553,732,887,930,975,1075,1076,1115,1178,1190,1332,1491,1493,1534,1873,2005,2053,2069,2130,2170,2208,2260,2350,2497,2500,2504,3199,3218,3237,3242,3250,3904,4122\tl_set_eq:NN.
.
892,893,944,1020,1022,1179,1204,1634,1646,2195\tl_set_rescan:Nnn5559\tl_tail:N3204\tl_tail:n3214\tl_to_str:n153,5502,5531,5572,5573\tl_trim_spaces:n1493\tl_trim_spaces_apply:nN1663\tl_use:N461tocdepth25,3490\today2325,2330,2333,2338today11,2325tokencommands:\c_parameter_token105,3327,3329,3332\token_to_meaning:N5516\token_to_str:N60,179,760,1002,1010,1019,1021,1023,1232,1233,1234,1236,1243,1244,1245,1307,2375,2376,3943,5136,5313,5332,5420\toks4822,4823,4825,4826,4845,4849\topsep4047,4058,4086,4097\TrimSpaces2144\ttdefault1863\ttfamily1826\twocolumn2755\typeout2780,2781,3237Uubuntu35umcommands:\um_input_math_symbol_table:1057,1061\um_sym:nnn1060uminternalcommands:\__um_input_math_symbol_table:1069\__um_switchto_literal:1066\__um_sym:nnn1068\undefined4847\UnicodeEncodingName760\unless2917,2955,2974\unskip2990\upshape1743,1746usecommands:\use:N.
.
.
.
894,936,937,983,1019,1021,1023,1099,1148,1647,2572,2578,2587,3004,3067,5586,5606,5620\use:n158,982,1083,1262,1315,1321,1393,1397,1496,1872,3013,3042,3320,3836,3953,4182,5337,5455,5497,5548,5569\use:nn5614\use_i:nn.
.
.
142,997,2566,5401,5406,5426,5431,5441\use_i:nnn269\use_ii:nn143,997,2564,2568,5401,5406,5426,5431,5442\use_ii:nnn159,274\use_iii:nnn279\use_none:n.
.
.
215,220,225,961,1164,1396,1531,2311\use_none:nn520\usebeamercolor3432,3451,3470,3629,3689,3723\usebeamerfont3431,3442,3450,3461,3469,3480,3628,3631,3688,3691,3722,3725\usefont1827\uselanguage3883,3888,3909,3914\usepackage5313UTF86,34,245V\verse4132\vfil2620,2742\vskip2661,2664,2693,2718,2721,2745,2834,2844,2847,2863,2866,2976,2979,3433,3452,3471,3612,3630,3650,3690,3724\vspace2623,2824,2827,2849,2852Wwindows35windowsnew35windowsold35winfonts32\write4862X\x443,449,453,4824,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4850,4860,4864xcommands:\x:448\xdef4863\xeCJKsetup657,1934,2111,2114,2117,2132Y\yahei4791\youyuan4791Z\zhdig2317\zhdigits28,2324zhmap6,32,264\zhnum2316zhnumcommands:\zhnum_counter:n2308\zhnumber28,2322\zhnumsetup2334,2339\zhtoday2333,2338\zihao27,3934,3943zihao8,194\ziju27,2256\zw711,1955,1993,2070

享有云:美国BGP云服务器低至20元/月起,首月打折;香港2核2G2M仅50元/月起

享有云怎么样?享有云是一家新的国内云服务器商家,目前提供国内、香港及海外地区的云服务器,拥有多线路如:BGP线路、CN2线路、高防等云服务器,并且提供稳定、安全、弹性、高性能的云端计算服务,实时满足您的多样性业务需求。目前,美国bgp云服务器,5M带宽,低至20元/月起,270元/年起,首月打折;香港2核2G2M仅50元/月起,450元/年起!点击进入:享有云官方网站地址享有云优惠活动:一、美国B...

速云:广州移动/深圳移动/广东联通/香港HKT等VDS,9折优惠,最低月付9元;深圳独立服务器1050元/首月起

速云怎么样?速云,国人商家,提供广州移动、深圳移动、广州茂名联通、香港hkt等VDS和独立服务器。现在暑期限时特惠,力度大。广州移动/深圳移动/广东联通/香港HKT等9折优惠,最低月付9元;暑期特惠,带宽、流量翻倍,深港mplc免费试用!点击进入:速云官方网站地址速云优惠码:全场9折优惠码:summer速云优惠活动:活动期间,所有地区所有配置可享受9折优惠,深圳/广州地区流量计费VDS可选择流量翻...

LetBox:美国洛杉矶/新泽西AMD大硬盘VPS,10TB流量,充值返余额,最低3.3美元两个月

LetBox此次促销依然是AMD Ryzen处理器+NVME硬盘+HDD大硬盘,以前是5TB月流量,现在免费升级到10TB月流量。另外还有返余额的活动,如果月付,月付多少返多少;如果季付或者半年付,返25%;如果年付,返10%。依然全部KVM虚拟化,可自定义ISO系统。需要大硬盘vps、大流量vps、便宜AMD VPS的朋友不要错过了。不过LetBox对帐号审核严格,最好注册邮箱和paypal帐号...

29ff.com为你推荐
商标注册流程及费用商标注册流程及费用?曹谷兰曹谷兰事件 有吧友知道吗百度关键词工具如何利用百度关键词推荐工具选取关键词www.haole012.com阜阳有什么好的正规的招聘网站?m.kan84.net电视剧海派甜心全集海派甜心在线观看海派甜心全集高清dvd快播迅雷下载avtt4.comCOM1/COM3/COM4是什么意思??/m88.comm88.com现在的官方网址是哪个啊 ?m88.com分析软件?bbs2.99nets.com让(bbs www)*****.cn进入同一个站广告法新修订的《广告法》有哪些内容www.ca800.comPLC好学吗
windows虚拟主机 什么是域名 国外域名 网址域名注册 抗投诉vps主机 域名服务器的作用 骨干网 68.168.16.150 网页背景图片 windows2003iso 嘟牛 嘉洲服务器 上海域名 raid10 双12 万网主机管理 架设邮件服务器 石家庄服务器托管 腾讯数据库 netvigator 更多