ctex

更新时间:2024-04-13 14:28:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ctex宏包说明?

吴凌云?

打印日期:2006年12月16日

摘要

ctex宏包提供了一个统一的中文LATEX文档框架,底层支持CCT和CJK两种中文

LATEX系统。ctex宏包提供了编写中文LATEX文档常用的一些宏定义和命令。

ctex宏包需要CCT系统或者CJK宏包的支持。主要文件包括ctexart.cls、ctexrep.cls、ctexbook.cls和ctex.sty、ctexcap.sty。

ctex宏包由ctex.org制作并负责维护。

目录

1简介2使用帮助2.1使用CJK......................................2.2使用CCT......................................2.3选项.........................................2.4

基本命令......................................2.4.1字体设置..................................2.4.2字号、字距、字宽和缩进..........................2.4.3中文数字转换................................

2.5

高级设置

......................................2.5.1章节标题设置................................

2.5.2部分修改标题格式.............................2.5.3附录标题设置................................2.5.4其他标题设置................................2.5.5其他设置..................................2.6

配置文件

......................................?本文件版本号为v0.8,最后修改日期2006/06/09。

?aloft@ctex.org

1

33445667788

12131314

14

目录3源代码说明3.13.23.33.4

2

15

选项.........................................15宏包.........................................18辅助定义

......................................19

通用中文设置....................................203.4.1中文字号..................................3.4.2

缺省字号大小................................3.5CCT相关配置...................................3.5.1CCT环境设置...............................3.5.2常用的中文字体

..............................3.5.3中文字号..................................3.5.4其他字体命令................................3.5.5

CCTfntef宏包接口.............................3.6CJK相关配置...................................3.6.1CJK环境设置...............................3.6.2常用的中文字体

..............................3.6.3中文字号..................................3.6.4其他字体命令................................3.6.5

CJKfntef宏包接口.............................3.7中文数字处理....................................3.8

中文化的标题结构.................................3.8.1章节标题基本结构.............................3.8.2part的标题.................................3.8.3chapter的标题...............................3.8.4section的标题...............................3.8.5页眉信息的修改

..............................3.8.6标签引用的中文化.............................3.8.7其他中文标题定义.............................3.8.8用户设置命令................................3.8.9

标题配置文件................................3.9文档类........................................3.10其它功能

......................................2224

262627

272728

282829

292930

30373741434547

51515254

58

58

1简介3

3.10.1中文日期格式................................583.10.2图表标题的分隔符.............................59

3.11用标准字体命令修改中文字体...........................59

3.11.1字体定义文件................................593.11.2字体命令修改................................60

1简介

这个宏包的部分原始代码来自于由王磊编写cjkbook.cls文档类,还有一小部分原始代码来自于吴凌云编写的GB.cap文件。原来的这些工作都是零零碎碎编写的,没有认真、系统的设计,也没有用户文档,非常不利于维护和改进。所以我们用doc和docstrip工具重新编写了整个文档,并增加了许多新的功能。

最初Knuth设计开发TEX的时候没有考虑到支持多国语言,特别是多字节的中日韩语

A言。这使得TEX以至后来的LTEX对中文的支持一直不是很好。即使在CJK解决了中文字A符处理的问题以后,中文用户使用LTEX仍然要面对许多困难。最常见的就是中文化的标

题。由于中文习惯和西方语言的不同,使得很难直接使用原有的标题结构来表示中文标题。

A因此需要对标准LTEX宏包做较大的修改。此外,还有诸如中文字号的对应关系等等。ctex

宏包正是尝试着解决这些问题。中间很多地方用到了在ctex.org论坛上的讨论结果,在此对参与讨论的朋友们表示感谢。

ctex宏包由五个主要文件构成:ctexart.cls、ctexrep.cls、ctexbook.cls和ctex.sty、ctexcap.sty。ctex.sty主要是提供整合的中文环境,可以配合大多数文档

A类使用。而ctexcap.sty则是对LTEX的三个标准文档类的格式进行修改以符合中文习惯,该宏包只能配合这三个标准文档类使用。ctexart.cls、ctexrep.cls、ctexbook.cls

则是ctex.sty、ctexcap.sty分别和三个标准文档类结合产生的新文档类,除了包含ctex.sty、ctexcap.sty的所有功能,还加入了一些修改文档类缺省设置的内容(如使用五号字体为缺省字体)。

A这份说明文档可以通过用LTEX编译ctex.dtx文件来得到。编译说明文档需要CJK

宏包和ctex宏包。为了生成正确的索引和版本记录,需要使用如下命令

makeindex-sgind.ist-octex.indctex.idxmakeindex-sgglo.ist-octex.glsctex.glo

2使用帮助

ctex宏包的使用十分简单。如果是使用ctex的文档类,只需用ctexart、ctexrep或者ctexbook替换原来的文档类就可以了。你也可以继续使用原来的文档类,而用ctex.sty

2使用帮助4

和ctexcap.sty宏包来配合使用,两者的效果是一样的(除了不能修改一些文档设置如缺省字体大小)。

2.1使用CJK

这是ctex宏包的缺省设置。ctex宏包会自动调用CJK宏包,你无需再自己调用。此

外,ctex宏包会在\\begin{document}和\\end{document}之间自动加入一个CJK环境,你无需再添加CJK环境。CJK宏包的命令都可以在\\begin{document}和\\end{document}之间正常使用。

例子1:使用文档类宏包

\\documentclass{ctexart}\\begin{document}中文宏包测试\\end{document}

例子2:使用普通宏包

\\documentclass{article}\%usepackage{ctex}\\begin{document}中文宏包测试\\end{document}

2.2使用CCT

ctex宏包也可以配合新版的CCT使用,只需在使用ctex宏包时加上CCT选项即可。

缺省CCT会使用CJK字库,因为这种字库方式比传统CCT字库更方便,兼容性也更好。如果要使用传统CCT字库,则还要加上CCTfont选项。

例子3:使用CJK方式字库

\\documentclass[CCT]{ctexart}\\begin{document}中文宏包测试\\end{document}

例子2:使用CCT方式字库

\\documentclass[CCT,CCTfont]{ctexart}\\begin{document}中文宏包测试\\end{document}

2使用帮助5

2.3选项

宏包的选项用于改变一些缺省风格的设置。缺省的设置已经针对中文的习惯进行了尽量

的修改,所以一般用户无需使用这些选项。如果你觉得某些设置不合适,可以向作者反映。我们会考虑在后面的版本中予以改进。我们也欢迎关于增加或者删减选项的建议。

下面的选项可能会是最经常使用的。但是它们只能用于文档类(ctexart、ctexrep和ctexbook)。

cs4size使用小四字号为缺省字体大小。

c5size使用五号字为缺省字体大小。这个是ctex文档类的缺省格式。

下面这些则可以在文档类宏包和ctex.sty上使用。CCT使用CCT代替CJK做为底层的中文支持系统。

CCTfont使用传统的CCT字库方式,该选项会自动激活CCT选项。punct对中文标点的位置(宽度)进行调整。

nopunct不对中文标点的位置进行调整(每个标点占有相同的宽度)。

space使用CJK的保留空格模式,保留中文字符间的空格(类似英文的习惯)。你需要自己

处理中文字符间的空格以及换行产生的空格(在行尾加上%符号可以避免),否则排版结果可能不符合中文习惯。这种模式可以通过\\CTEXnospace转换到nospace模式。nospace使用CJK的忽略空格模式,也就是CJK*环境的模式。CJK会自动忽略中文字符

间的空格,比较符合中文习惯。在这种模式下,可以使用?来分隔中英文字符,产生的间距稍小于普通空格,排版效果比较美观。这种模式可以通过\\CTEXspace命令转换到space模式。这个是ctex宏包的缺省模式。

cap使用中文的标题样式。这个是文档类宏包的缺省模式。nocap保留使用英文的标题样式。

indent使用中文的段首缩进模式,即缩进两个汉字宽度,同时每个段落都缩进。这个是

ctex宏包的缺省模式。

noindent使用原来的段首缩进模式,章节标题后的第一段不缩进。

psfont使用PostScript字库来代替CM字库。这个选项只影响英文字库的使用,对中文没

有作用。

fancyhdr保持和fancyhdr宏包的兼容性。该选项将使得fancyhdr宏包被自动调用。

Aamstex保持和AMS-LTEX宏包的兼容性。

\\songti\\heiti\\fangsong\\kaishu\\lishu\\youyuan

2使用帮助6

fntef为CJKfntef宏包和CCTfntef宏包提供统一接口。该选项将使得CJKfntef宏包或者

CCTfntef宏包被自动调用。

下面这些则可以在文档类宏包和ctexcap.sty上使用。

cap使用中文的标题样式,缺省格式由ctexcap.cfg配置文件内的定义给出。这个是文档

类宏包的缺省模式。nocap保留使用英文的标题样式。

sub3section将\\paragraph命令产生的标题改为section类格式。此时\\subparagraph命

令产生的标题会具有原来\\paragraph的格式。

sub4section将\\paragraph和\\subparagraph命令产生的标题都改为section类格式。

总结:ctex宏包的缺省选项是nospacecapindent,文档类的缺省选项是nospacecapindentc5size。

2.4基本命令

ctex宏包给用户提供一个通用的文档框架,使得用户可以自由地在不同的底层中文系

统间切换。为此,我们为CJK定制了一些模拟CCT的命令,也对部分CCT命令进行了修改,使得两者保持一致。此外,我们还定义了用于设置文档参数的高级设置命令。2.4.1

字体设置

中文字体很多,但是常用的就那么几个。我们为CJK常用的六种中文字体定义了简单易用的命令。它们是:

宋体:\\songti,CJK等价命令\\CJKfamily{song}黑体:\\heiti,CJK等价命令\\CJKfamily{hei}仿宋:\\fangsong,CJK等价命令\\CJKfamily{fs}楷书:\\kaishu,CJK等价命令\\CJKfamily{kai}隶书:\\lishu,CJK等价命令\\CJKfamily{li}幼圆:\\youyuan,CJK等价命令\\CJKfamily{you}

TEX系统中必须已经定义好这六种中文字体,并且使用和CTEX套装中一致的字体名称。(参见上面CJK等价命令的参数)

上面的字体命令和CCT中的一致,但传统的CCT字库中没有隶书和仿宋两种字体,需要用户自行安装定义。如果使用CCT时选择CJK字库方式,则可以使用这两种中文字体。

\\zihao

\\ziju

\\ccwd

\\CTEXindent

\\CTEXnoindent\\CTEXsetfont

\\CTEXnumber

\\CTEXdigits

2使用帮助7

2.4.2

字号、字距、字宽和缩进

中文字号的设置命令是\\zihao{??字号??},例如\\zihao{3}。可以使用的参数有16个,小号字体在前面加负号表示,从大到小依次为

初号小初一号小一二号小二三号小三0-01-12-23-3四号小四五号小五六号小六七号八号4

-4

5

-5

6

-6

7

8

英文字体大小会始终保持和中文字体一致。

汉字字距的调整使用命令\\ziju{??字宽的倍数??}。参数可以是任意的数字,例如\\ziju{5}设置汉字字距为当前汉字字宽的5倍,\\ziju{0.5}设置汉字字距为当前汉字字宽的一半。这里的汉字字宽指的是实际汉字的宽度,不包含当前字距。该命令不影响英文字距。

当前汉字的字宽保存在宏\\ccwd中。字宽是相邻两个汉字中心的距离,也就是说字距会被计算在内。

正常的缩进两个汉字字宽的距离,同时在汉字大小和字距改变的情况都可以自动修改缩进距离。

取消缩进。

\\CTEXsetfont命令用于更新当前的中文字体信息,包括当前字距和缩进距离。一般来说,用户无需使用这个命令。2.4.3

中文数字转换

使用CJK提供的\\CJKnumber命令可以将阿拉伯数字转换为中文数字。由于LATEX臭

名昭著的脆弱命令的原因,当\\CJKnumber被用在章节标题等地方的时候,要么出现错误无法使用,要么无法达到预期目的,例如在产生PDF书签的时候。于是我们定义了一个\\CTEXnumber命令,可以将产生的中文数字保存下来。该命令的格式为

\\CTEXnumber{??result??}{??number??}

其中??result??必须是一个TEX宏的名字,不需要预先定义。例如

\\CTEXnumber{\\test}{100002005}

则\\test中的内容就是“一亿零二千零五”(不包括引号)。

\\CTEXdigits命令和\\CTEXnumber命令类似,用于代替CJK提供的\\CJKdigits命令。它和\\CTEXnumber命令的不同之处在于转换后结果是中文数字串,而不是按照中文习惯的数字。该命令的格式为

\\chinese

\\CTEXoptions

\\CTEXsetup

2使用帮助8

\\CTEXdigits{??result??}{??number??}

其中??result??必须是一个TEX宏的名字,不需要预先定义。例如

\\CTEXnumber{\\test}{100002005}

则\\test中的内容就是“一○○○○二○○五”(不包括引号)。

对于经常需要转换的计数器,我们特别定义了一个\\chinese命令。该命令可以象罗马数字转换命令\\roman、\\Roman一样使用。具体格式是

\\chinese{??counter??}

其中??counter??是一个LATEX计数器(counter),即由\\newcounter命令产生的,例如section,figure等。

2.5

高级设置

ctex宏包中一般的设置通过\\CTEXoptions命令完成。这个命令的基本格式是\\CTEXoptions[??key1??=??val1??,??key2??=??val2??,...]

其中??key1??,??key2??是设置选项,??val1??,??val2??则是对应选项的设置内容。多个选项可以在一个语句中完成设置。

部分设置如章节标题则通过\\CTEXsetup命令完成。这个命令比\\CTEXoptions多一个参数,用于指定设置对象。基本格式是

\\CTEXsetup[??key1??=??val1??,??key2??=??val2??,...]{??type??}

其中??type??是设置的对象类型,如part,chapter,section,subsection,subsubsection,paragraph,subparagraph等。??key1??,??key2??是设置选项,如name,number,format,nameformat,numberformat,aftername,titleformat等。??val1??,??val2??则是对应选项的设置内容。同一个目标类型的多个选项可以在一个语句中完成设置。

如果以上命令的参数中包含中文字符,则命令必须放在\\begin{document}之后才能正常工作。12.5.1

章节标题设置

普通章节标题的格式全部通过\\CTEXsetup命令完成。章节类型在\\CTEXsetup命令的第二个参数中指定。如果使用了宏包选项cap(缺省情况即是如此),则所有对章节标题的修改必须在\\begin{document}以后进行。原因是缺省的中文标题设置文件ctexcap.cfg文件是在\\begin{document}之后才会自动装入,因而之前的修改都会被覆盖而无效。这一限制对后面的附录标题以及其他标题设置一样有效。2

1从v0.7版本开始支持在导言区使用中文。

2从

v0.7版本开始,ctexcap.cfg文件在宏包文件结束时就已经被装入,因此可以在导言区使用设置命令。

2使用帮助9

name={??prename??,??postname??}该选项用于设置章节的名字,包括章节编号前后的词语,

两个之间用逗号分开。例如

\\CTEXsetup[name={第,节}]{section}

会使得section的标题使用形如“第1节”的名字。注意不要使用中文的逗号。该选项的缺省设置是

使用宏包选项cap

partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

{第,部分}{第,章}同右同右同右同右同右

使用宏包选项nocap{Part\\space,}{Chapter\\space,}{,}{,}{,}{,}{,}

number={??number??}该选项用于设置章节编号的数字样式。例如

\\CTEXsetup[number={\\roman{section}}]{section}

会使得section的标题使用小写罗马数字作为编号。常用的数字样式命令有\\chinese{??counter??}:一,二,三,...\\arabic{??counter??}:1,2,3,...\\roman{??counter??}:i,ii,iii,...\\Roman{??counter??}:I,II,III,...\\alph{??counter??}:a,b,c,...\\Alph{??counter??}:A,B,C,...该选项的缺省设置是

使用宏包选项cap

partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

{\\chinese{part}}{\\chinese{chapter}}同右同右同右同右同右

使用宏包选项nocap{\\Roman{part}}{\\arabic{chapter}}{\\thesection}{\\thesubsection}{\\thesubsubsection}{\\theparagraph}{\\thesubparagraph}

2使用帮助10

format={??format??}用于控制章节标题的全局格式,作用域为章节名字和随后的标题内

容。常用于控制章节标题的对齐方式。该选项的缺省设置是

使用宏包选项cap

part(article)partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

{\\centering}{\\centering}{\\centering}

{\\Large\\bfseries\\centering}{\\large\\bfseries\\centering}

{\\normalsize\\bfseries\\centering}{\\normalsize\\bfseries\\centering}{\\normalsize\\bfseries\\centering}

使用宏包选项nocap{\\raggedright}{\\centering}{\\raggedright}{\\Large\\bfseries}{\\large\\bfseries}

{\\normalsize\\bfseries}{\\normalsize\\bfseries}{\\normalsize\\bfseries}

nameformat={??nameformat??}用于控制章节名字的格式,作用域为章节名字,包括编号。

该选项的缺省设置是

使用宏包选项cap

part(article)partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

同右同右同右同右同右同右同右同右

使用宏包选项nocap{\\Large\\bfseries}{\\huge\\bfseries}{\\huge\\bfseries}{}{}{}{}{}

numberformat={??numberformat??}用于控制章节编号的格式。一般为空,当你需要编号

的格式和前后的章节名字不一样时使用。

aftername={??aftername??}用于控制章节标题中章节名字和随后的标题内容之间的格式变

换。常用于控制标题内容是否另起一行。该选项的缺省设置是

2使用帮助11

使用宏包选项cap

part(article)partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

{\\quad}同右{\\quad}同右同右同右同右同右

使用宏包选项nocap{\\par\\nobreak}{\\par\\vskip20pt}{\\par\\vskip20pt}{}{}{}{}{}

titleformat={??titleformat??}用于控制标题内容的格式,作用域为章节标题内容。

该选项的缺省设置是

使用宏包选项cap

part(article)partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

{\\Large\\bfseries}{\\huge\\bfseries}{\\huge\\bfseries}同右同右同右同右同右

使用宏包选项nocap{\\huge\\bfseries}{\\Huge\\bfseries}{\\Huge\\bfseries}{}{}{}{}{}

beforeskip={??beforeskip??}用于控制章节标题前的空距。

该选项的缺省设置是

使用宏包选项cap

part(article)partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

同右无效同右同右同右同右同右同右

使用宏包选项nocap{4ex}无效{50pt}

{-3.5explus-1exminus-.2ex}{-3.25explus-1exminus-.2ex}{-3.25explus-1exminus-.2ex}{3.25explus1exminus.2ex}{3.25explus1exminus.2ex}

在section及以下的标题中,使用负的距离表示标题后的段落不缩进(如标准的英文LaTeX文档),否则缩进。标题上方真正的空距是该参数的绝对值。

2使用帮助afterskip={??afterskip??}用于控制章节标题后的空距。

该选项的缺省设置是

使用宏包选项cap

part(article)partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

同右无效同右同右同右同右同右同右

使用宏包选项nocap{3ex}无效{40pt}

{2.3explus.2ex}{1.5explus.2ex}{1.5explus.2ex}{-1em}{-1em}

12

在section及以下的标题中,正的距离表示向下留出的空距(如标准的section标题),使用负的距离则表示向右留出的空距的负值(如标准的paragraph标题)。indent={??indent??}用于控制章节标题本身的缩进。

该选项的缺省设置是

使用宏包选项cap

part(article)partchaptersectionsubsectionsubsubsectionparagraphsubparagraph

2.5.2

部分修改标题格式

同右无效同右同右同右同右同右同右

使用宏包选项nocap{0pt}无效{0pt}{0pt}{0pt}{0pt}{0pt}{\\parindent}

如果只想修改标题格式中的某些参数而不是完全重新设置,可以使用带+号的设置选项。例如

\\CTEXsetup[format+={\\zihao{1}}]{section}则section的标题使用一号字体,而其他格式设置保持不变。

标题格式相关的选项都支持这一功能,包括format,nameformat,numberformat,aftername和titleformat,而且对所有文档类型都有效。

2使用帮助2.5.3

附录标题设置

13

附录(appendix)的标题也使用\\CTEXsetup命令进行设置,第二个参数设为appendix。但是只能使用name和number两个设置选项。在使用了\\appendix命令之后,附录的名字和编号会被自动使用。附录的名字和前面的章节不同,它只有一个部分,放在编号之前。在article类文档中,附录是用section实现的,而在report和book类文档中附录使用的是chapter的设置。因此在设置附录的编号的时候要注意使用正确的计数器。如果你要设置其他格式的附录标题,可以根据使用的文档类直接用section或者chapter的设置命令来控制,但是要记住把设置命令放在\\appendix(如果有的话)的后面,否则会被\\appendix命令的设置覆盖。

附录的缺省设置是

使用宏包选项cap

name(article)name

number(article)number

2.5.4

其他标题设置

同右{附录?}同右同右

使用宏包选项nocap{}

{Appendix\\space}{\\Alph{section}}{\\Alph{chapter}}

除章节标题外其他标题的设置通过\\CTEXoptions设置。包括contentsname目录名list?gurename表格目录listtablename插图目录?gurename图tablename表abstractname摘要indexname索引bibname参考文献

例如

\\CTEXoptions[indexname={总索引}]把索引的名字改为“总索引”。

2使用帮助2.5.5

其他设置

14

设置\\today的日期格式的格式包括

使用\\CTEXoptions可以设置\\today命令产生的日期格式。支持

1.阿拉伯数字加中文年月日

\\CTEXoptions[today=small]

\\today生成的日期例子为“2006年12月16日”。2.中文数字加中文年月日

\\CTEXoptions[today=big]

\\today生成的日期例子为“二○○六年十二月十六日”。

A3.LTEX标准格式

\\CTEXoptions[today=old]

\\today生成的日期例子为“December16,2006”。

设置图表标题的分隔符使用\\CTEXoptions可以设置\\caption命令产生的图表标题的分隔符。这个分隔符缺省是使用冒号:。可以通过命令

\\CTEXoptions[captiondelimiter={??string??}]设置为任意的单个字符或者字符串??string??。

2.6配置文件

主要的配置文件有ctex.def和ctexcap.cfg以及几个字体定义文件*.fd。字体定义

文件的内容请参考3.11.1的内容。

ctex.def是一些中文字符串参数的定义,会被所有的宏包使用。如果你想改用其他的中文字符,例如繁体字,可以修改这个文件。

ctexcap.cfg是缺省中文标题格式的定义,当你使用cap选项时就会使用这里的定义。你可以把它改为你经常使用的格式,这样就不用每次都在正文中修改了。ctexcap.cfg中的设置都可以通过宏包提供的设置命令在正文中进行修改。

最后,宏包还将读入ctex.cfg文件,该文件中的设置将覆盖其他配置文件中的设置。用户可以在该文件中加入自己的定义。

在修改这些配置文件的时候,你可以修改系统目录中的文件,也可以拷贝一份放到当前目录下,然后修改。TeX会优先使用当前目录下的同名文件。这样你可以针对不同的应用设置不同的缺省配置文件。

3源代码说明15

3

3.1

\\ifCTEX@cct

源代码说明

选项

用于判断是否使用CCT中文系统,缺省是不使用。

???ctex|cls??

2\\newif\\ifCTEX@cct\\CTEX@cctfalse3\\DeclareOption{CCT}{\\CTEX@ccttrue}4??/ctex|cls??

1

\\ifCTEX@cctfont用于判断CCT是使用传统CCT字库还是CJK字库,缺省是使用CJK字库。

???ctex|cls??

6\\newif\\ifCTEX@cctfont\\CTEX@cctfontfalse

7\\DeclareOption{CCTfont}{\\CTEX@ccttrue\\CTEX@cctfonttrue}8??/ctex|cls??

5

\\ifCTEX@punct用于判断是否对中文标点宽度进行调整,缺省是调整。

910111213

???ctex|cls??

\\newif\\ifCTEX@punct\\CTEX@puncttrue\\DeclareOption{punct}{\\CTEX@puncttrue}\\DeclareOption{nopunct}{\\CTEX@punctfalse}??/ctex|cls??

\\ifCTEX@space用于判断是否忽略汉字间的空格,缺省是忽略。

1415161718

???ctex|cls??

\\newif\\ifCTEX@space\\CTEX@spacefalse\\DeclareOption{space}{\\CTEX@spacetrue}\\DeclareOption{nospace}{\\CTEX@spacefalse}??/ctex|cls??

space参数使得缺省的中文环境不会吃掉中文字符后面的空格。这种情况下很容易造成汉字之间产生多余的空格,需要小心使用。

\\ifCTEX@caption

用于判断是否使用中文标题,缺省是使用。

1920212223

???ctex|ctexcap|cls??

\\newif\\ifCTEX@caption\\CTEX@captiontrue\\DeclareOption{nocap}{\\CTEX@captionfalse}\\DeclareOption{cap}{\\CTEX@captiontrue}??/ctex|ctexcap|cls??

\\ifCTEX@indent用于判断是否使用中文的缩进格式,缺省是使用。

24

???ctex|cls??

3源代码说明21

197198199

\\input{ctexcjk.clo}\\fi

??/ctex|cls??

所有包含中文字符的定义都需要从ctex.def读入。

200201202203204205206207208

???ctex|cls??

\\AtEndOfPackage{%\\makeatletter

\\InputIfFileExists{ctex.def}{}{%\\PackageError{ctex}{ên’tfindctex.def}{%

Therewillbeunexpectederrorsifyoucontinue.}}\\makeatother}??/ctex|cls??

如果使用中文标题,则还要读入ctexcap.cfg的内容。

209210211212213214215216217218219

???ctexcap|cls??\\ifCTEX@caption

\\AtEndOfPackage{%\\makeatletter

\\InputIfFileExists{ctexcap.cfg}{}{%\\PackageError{ctex}{%

Can’tfindctexcap.cfg}{%

Theenglishcaptionsareusedifyoucontinue.}}\\makeatother}\\fi

??/ctexcap|cls??

最后再从ctex.cfg读入用户的自定义设置。

220221222223224225226227

???ctex|cls??

\\AtEndOfPackage{%\\makeatletter

\\InputIfFileExists{ctex.cfg}{}{%\\PackageWarning{ctex}{ên’tfindctex.cfg}}\\makeatother}??/ctex|cls??

\\CTEXindent\\CTEXnoindent

段首缩进2个汉字的距离,需要考虑到字距。

228229230231232233234

???ctex|cls??

\\newcommand*\\CTEXindent{\\CTEXsetfont\\parindent2\\ccwd}\\newcommand*\\CTEXnoindent{\\parindent\\z@}\\ifCTEX@indent

\\AtBeginDocument{\\CTEXindent}\\fi

??/ctex|cls??

3源代码说明22

\\CTEX@spaceChar

235

??ctex|cls??\\def\\CTEX@spaceChar{\\hskip\\f@size\\p@}

\\baselinestretch通常中文文档需要较宽的行距。

236

??ctex|cls??\\def\\baselinestretch{1.3}

3.4.1中文字号

首先给出中文字号和TEX字体大小的对应关系。定义中使用pt为单位。中文字号大小参考Word的定义。

1in=72bp=72.27pt行距=字体大小×1.2

237238239240241242243244245246247248249250251252253254

???ctex|cls??

\\def\\CTEX@fs@eight{5.02}\\def\\CTEX@fs@seven{5.52}\\def\\CTEX@fs@ssix{6.52}\\def\\CTEX@fs@six{7.53}\\def\\CTEX@fs@sfive{9.03}\\def\\CTEX@fs@five{10.54}\\def\\CTEX@fs@sfour{12.05}\\def\\CTEX@fs@four{14.05}\\def\\CTEX@fs@sthree{15.06}\\def\\CTEX@fs@three{16.06}\\def\\CTEX@fs@stwo{18.07}\\def\\CTEX@fs@two{22.08}\\def\\CTEX@fs@sone{24.09}\\def\\CTEX@fs@one{26.10}\\def\\CTEX@fs@szero{36.14}\\def\\CTEX@fs@zero{42.16}??/ctex|cls??

\\def\\CTEX@fs@eightskip{6.02}\\def\\CTEX@fs@sevenskip{6.62}\\def\\CTEX@fs@ssixskip{7.83}\\def\\CTEX@fs@sixskip{9.03}\\def\\CTEX@fs@sfiveskip{10.84}\\def\\CTEX@fs@fiveskip{12.65}\\def\\CTEX@fs@sfourskip{14.45}\\def\\CTEX@fs@fourskip{16.86}\\def\\CTEX@fs@sthreeskip{18.07}\\def\\CTEX@fs@threeskip{19.27}\\def\\CTEX@fs@stwoskip{21.68}\\def\\CTEX@fs@twoskip{26.50}\\def\\CTEX@fs@soneskip{28.91}\\def\\CTEX@fs@oneskip{31.32}\\def\\CTEX@fs@szeroskip{43.36}\\def\\CTEX@fs@zeroskip{50.59}%八号字5bp%七号字5.5bp%小六号6.5bp%六号字7.5bp%小五号9bp%五号字10.5bp%小四号12bp%四号字14bp%小三号15bp%三号字16bp%小二号18bp%二号字22bp%小一号24bp%一号字26bp%小初号36bp%初号字42bp

定义相应的数学字体的大小(用于上下脚标)。

255256257258259260261262263264

???ctex|cls??

\\DeclareMathSizes{\\CTEX@fs@eight}{\\CTEX@fs@eight}{5}{5}\\DeclareMathSizes{\\CTEX@fs@seven}{\\CTEX@fs@seven}{5}{5}\\DeclareMathSizes{\\CTEX@fs@ssix}{\\CTEX@fs@ssix}{5}{5}\\DeclareMathSizes{\\CTEX@fs@six}{\\CTEX@fs@six}{5}{5}

\\DeclareMathSizes{\\CTEX@fs@sfive}{\\CTEX@fs@sfive}{6}{5}\\DeclareMathSizes{\\CTEX@fs@five}{\\CTEX@fs@five}{7}{5}\\DeclareMathSizes{\\CTEX@fs@sfour}{\\CTEX@fs@sfour}{8}{6}\\DeclareMathSizes{\\CTEX@fs@four}

{\\CTEX@fs@four}{\\CTEX@fs@five}{\\CTEX@fs@six}

3源代码说明23

265266267268269270271272273274275276277278279280281

\\DeclareMathSizes{\\CTEX@fs@sthree}

{\\CTEX@fs@sthree}{\\CTEX@fs@sfour}{\\CTEX@fs@sfive}

\\DeclareMathSizes{\\CTEX@fs@three}

{\\CTEX@fs@three}{\\CTEX@fs@four}{\\CTEX@fs@five}

\\DeclareMathSizes{\\CTEX@fs@stwo}

{\\CTEX@fs@stwo}{\\CTEX@fs@sthree}{\\CTEX@fs@sfour}

\\DeclareMathSizes{\\CTEX@fs@two}

{\\CTEX@fs@two}{\\CTEX@fs@three}{\\CTEX@fs@four}

\\DeclareMathSizes{\\CTEX@fs@sone}

{\\CTEX@fs@sone}{\\CTEX@fs@stwo}{\\CTEX@fs@sthree}

\\DeclareMathSizes{\\CTEX@fs@one}

{\\CTEX@fs@one}{\\CTEX@fs@two}{\\CTEX@fs@three}

\\DeclareMathSizes{\\CTEX@fs@szero}

{\\CTEX@fs@szero}{\\CTEX@fs@sone}{\\CTEX@fs@stwo}

\\DeclareMathSizes{\\CTEX@fs@zero}

{\\CTEX@fs@zero}{\\CTEX@fs@one}{\\CTEX@fs@two}

??/ctex|cls??

\\zihao这个命令用于改变中文字号。当前中文字号保存在\\CTEX@zihao中。注意,如果没用过\\zihao命令,则\\CTEX@zihao没有定义。

\\CTEX@zihao

282283

???ctex|cls??

\\def\\CTEX@zihao{}

如果是负数,表示是小号字体

284285286287288289290291292293294

\\DeclareRobustCommand*\\zihao[1]{\\def\\CTEX@zihao{#1}%

\\ifnum#11<0%\\@tempcnta=-#1

\\ifcase\\@tempcnta%

\\fontsize\\CTEX@fs@szero\\CTEX@fs@szeroskip%\\or\\fontsize\\CTEX@fs@sone\\CTEX@fs@soneskip%\\or\\fontsize\\CTEX@fs@stwo\\CTEX@fs@stwoskip%

\\or\\fontsize\\CTEX@fs@sthree\\CTEX@fs@sthreeskip%\\or\\fontsize\\CTEX@fs@sfour\\CTEX@fs@sfourskip%\\or\\fontsize\\CTEX@fs@sfive\\CTEX@fs@sfiveskip%\\or\\fontsize\\CTEX@fs@ssix\\CTEX@fs@ssixskip%

如果不在预定义的字号范围(-0–-6),则报告一个错误

295296297298

\\else\\PackageError{ctex}{%

UndefinedChinesefontsizeincommand\\protect\\zihao}{%Theoldfontsizeisusedifyoucontinue.}%

\\fi%

否则是正常字号

3源代码说明24

299300301302303304305306307308309310

\\else%

\\@tempcnta=#1

\\ifcase\\@tempcnta%

\\fontsize\\CTEX@fs@zero\\CTEX@fs@zeroskip%\\or\\fontsize\\CTEX@fs@one\\CTEX@fs@oneskip%\\or\\fontsize\\CTEX@fs@two\\CTEX@fs@twoskip%

\\or\\fontsize\\CTEX@fs@three\\CTEX@fs@threeskip%\\or\\fontsize\\CTEX@fs@four\\CTEX@fs@fourskip%\\or\\fontsize\\CTEX@fs@five\\CTEX@fs@fiveskip%\\or\\fontsize\\CTEX@fs@six\\CTEX@fs@sixskip%

\\or\\fontsize\\CTEX@fs@seven\\CTEX@fs@sevenskip%\\or\\fontsize\\CTEX@fs@eight\\CTEX@fs@eightskip%

如果不在预定义的字号范围(0–8),则报告一个错误

311312313314315316317

\\else\\PackageError{ctex}{%

UndefinedChinesefontsizeincommand\\protect\\zihao}{%Theoldfontsizeisusedifyoucontinue.}%

\\fi%\\fi%

\\selectfont\\ignorespaces}??/ctex|cls??

3.4.2缺省字号大小

缺省字体只对文档类有效,下面使用中文小四号字时的设置。

318319320321322323324325326327328329330331332333334335336337

???cls??

\\ifCTEX@sfoursize

\\renewcommand\\normalsize{bp

\\@setfontsize\\normalsize{\\CTEX@fs@sfour}{\\CTEX@fs@sfourskip}%\\abovedisplayskip12\\p@\\@plus3\\p@\\@minus7\\p@\\abovedisplayshortskip\\z@\\@plus3\\p@

\\belowdisplayshortskip6.5\\p@\\@plus3.5\\p@\\@minus3\\p@\\belowdisplayskip\\abovedisplayskip\\let\\@listi\\@listI}\\normalsize

\\renewcommand\\small{.5bp

\\@setfontsize\\small{\\CTEX@fs@five}{\\CTEX@fs@fiveskip}%\\abovedisplayskip11\\p@\\@plus3\\p@\\@minus6\\p@\\abovedisplayshortskip\\z@\\@plus3\\p@

\\belowdisplayshortskip6.5\\p@\\@plus3.5\\p@\\@minus3\\p@\\def\\@listi{\\leftmargin\\leftmargini

\\topsep9\\p@\\@plus3\\p@\\@minus5\\p@\\parsep4.5\\p@\\@plus2\\p@\\@minus\\p@\\itemsep\\parsep}%

\\belowdisplayskip\\abovedisplayskip}

3源代码说明25

338339340341342343344345346347348349350351352353354355356357358359360361362363

\\renewcommand\\footnotesize{?p

\\@setfontsize\\footnotesize{\\CTEX@fs@sfive}{\\CTEX@fs@sfiveskip}%\\abovedisplayskip10\\p@\\@plus2\\p@\\@minus5\\p@\\abovedisplayshortskip\\z@\\@plus3\\p@

\\belowdisplayshortskip6\\p@\\@plus3\\p@\\@minus3\\p@\\def\\@listi{\\leftmargin\\leftmargini

\\topsep6\\p@\\@plus2\\p@\\@minus2\\p@\\parsep3\\p@\\@plus2\\p@\\@minus\\p@\\itemsep\\parsep}%

\\belowdisplayskip\\abovedisplayskip}\\renewcommand\\scriptsize{%7.5bp

\\@setfontsize\\scriptsize{\\CTEX@fs@six}{\\CTEX@fs@sixskip}}\\renewcommand\\tiny{%6.5bp

\\@setfontsize\\tiny{\\CTEX@fs@ssix}{\\CTEX@fs@ssixskip}}\\renewcommand\\large{bp

\\@setfontsize\\large{\\CTEX@fs@sthree}{\\CTEX@fs@sthreeskip}}\\renewcommand\\Large{bp

\\@setfontsize\\Large{\\CTEX@fs@stwo}{\\CTEX@fs@stwoskip}}\\renewcommand\\LARGE{"bp

\\@setfontsize\\LARGE{\\CTEX@fs@two}{\\CTEX@fs@twoskip}}\\renewcommand\\huge{$bp

\\@setfontsize\\huge{\\CTEX@fs@sone}{\\CTEX@fs@soneskip}}\\renewcommand\\Huge{&bp

\\@setfontsize\\Huge{\\CTEX@fs@one}{\\CTEX@fs@oneskip}}\\fi??/cls??

缺省字体使用中文五号字时的设置。

364365366367368369370371372373374375376377378379380

???cls??

\\ifCTEX@fivesize

\\renewcommand\\normalsize{.5bp

\\@setfontsize\\normalsize{\\CTEX@fs@five}{\\CTEX@fs@fiveskip}%\\abovedisplayskip10\\p@\\@plus2\\p@\\@minus5\\p@\\abovedisplayshortskip\\z@\\@plus3\\p@

\\belowdisplayshortskip6\\p@\\@plus3\\p@\\@minus3\\p@\\belowdisplayskip\\abovedisplayskip\\let\\@listi\\@listI}\\normalsize

\\renewcommand\\small{?p

\\@setfontsize\\small{\\CTEX@fs@sfive}{\\CTEX@fs@sfiveskip}%\\abovedisplayskip8.5\\p@\\@plus3\\p@\\@minus4\\p@\\abovedisplayshortskip\\z@\\@plus2\\p@

\\belowdisplayshortskip4\\p@\\@plus2\\p@\\@minus2\\p@\\def\\@listi{\\leftmargin\\leftmargini

\\topsep4\\p@\\@plus2\\p@\\@minus2\\p@

3源代码说明26

381382383384385386387388389390391392393394395396397398399400401402403404405406407408409

\\parsep2\\p@\\@plus\\p@\\@minus\\p@\\itemsep\\parsep}%

\\belowdisplayskip\\abovedisplayskip}\\renewcommand\\footnotesize{%7.5bp

\\@setfontsize\\footnotesize{\\CTEX@fs@six}{\\CTEX@fs@sixskip}%\\abovedisplayskip6\\p@\\@plus2\\p@\\@minus4\\p@\\abovedisplayshortskip\\z@\\@plus\\p@

\\belowdisplayshortskip3\\p@\\@plus\\p@\\@minus2\\p@\\def\\@listi{\\leftmargin\\leftmargini

\\topsep3\\p@\\@plus\\p@\\@minus\\p@\\parsep2\\p@\\@plus\\p@\\@minus\\p@\\itemsep\\parsep}%

\\belowdisplayskip\\abovedisplayskip}\\renewcommand\\scriptsize{%6.5bp

\\@setfontsize\\scriptsize{\\CTEX@fs@ssix}{\\CTEX@fs@ssixskip}}\\renewcommand\\tiny{%5.5bp

\\@setfontsize\\tiny{\\CTEX@fs@seven}{\\CTEX@fs@sevenskip}}\\renewcommand\\large{bp

\\@setfontsize\\large{\\CTEX@fs@sfour}{\\CTEX@fs@sfourskip}}\\renewcommand\\Large{bp

\\@setfontsize\\Large{\\CTEX@fs@sthree}{\\CTEX@fs@sthreeskip}}\\renewcommand\\LARGE{bp

\\@setfontsize\\LARGE{\\CTEX@fs@stwo}{\\CTEX@fs@stwoskip}}\\renewcommand\\huge{"bp

\\@setfontsize\\huge{\\CTEX@fs@two}{\\CTEX@fs@twoskip}}\\renewcommand\\Huge{&bp

\\@setfontsize\\Huge{\\CTEX@fs@one}{\\CTEX@fs@oneskip}}\\fi??/cls??

3.5

410

CCT相关配置

???cct??

3.5.1

411412413414415

CCT环境设置

\\ifCTEX@space

\\AtBeginDocument{\\CCTspace}\\else

\\AtBeginDocument{\\CCTnospace}\\fi

\\CTEXspace\\CTEXnospace

416417

\\def\\CTEXspace{\\CCTspace}

\\def\\CTEXnospace{\\CCTnospace}

3源代码说明3.5.2

\\songti\\heiti\\fangsong\\kaishu\\lishu\\youyuan

27

常用的中文字体

定义常用的中文字体命令:宋体、黑体、楷书、仿宋、隶书、幼圆。

418419420421422423424425426427428429430431432433

\\ifCTEX@cctfont\\else

\\CCTdefzitiAsongsong%宋体\\CCTdefzitiBheisong%黑体\\CCTdefzitiCkaisong%楷体\\CCTdefzitiDfssong%仿宋\\CCTdefzitiEbshei%标宋\\CCTdefzitiFlihei%隶书\\CCTdefzitiGyoukai%幼圆

\\DeclareRobustCommand*{\\songti}{\\ziti{A}\\relax}\\DeclareRobustCommand*{\\heiti}{\\ziti{B}\\relax}\\DeclareRobustCommand*{\\kaishu}{\\ziti{C}\\relax}\\DeclareRobustCommand*{\\fangsong}{\\ziti{D}\\relax}\\DeclareRobustCommand*{\\biaosong}{\\ziti{E}\\relax}\\DeclareRobustCommand*{\\lishu}{\\ziti{F}\\relax}\\DeclareRobustCommand*{\\youyuan}{\\ziti{G}\\relax}\\fi

%%%%%%%宋体黑体楷书仿宋标宋隶书幼圆

3.5.3

\\set@fontsize

中文字号

CCT对\\set@fontsize命令进行了重定义,我们需要修改这个定义,让中英文保持一致的大小,并及时更新字体信息。

434435436437438439440441

\\ifx\\CCT@set@fontsize\%undefined

\\let\\CCT@set@fontsize\\oset@fontsize\\fi

\\let\\CTEX@save@set@fontsize\\set@fontsize\\def\\set@fontsize#1#2#3{%

\\CCT@set@fontsize{#1}{#2}{#3}%\\zihaoAny{#2}%\\CTEXsetfont}

3.5.4

\\ziju

其他字体命令

定义调整汉字字距的命令。

442443444445

\\let\\CTEX@save@ziju\\ziju

\\renewcommand*\\ziju[1]{%字距\\CTEX@save@ziju{#1}%\\CTEXsetfont}

\\CTEXsetfont\\CTEXsetfont获得当前的汉字信息。

446447

\\newcommand*\\CTEXsetfont{%

\\ifdim\\parindent=0pt\\else\\parindent2\\ccwd\\fi}

3源代码说明3.5.5

CCTfntef宏包接口

28

为CCTfntef.sty宏包的命令提供统一接口。

448449450451452453454455456457458459460461462463464465466467468469470471472473474475

\\ifCTEX@fntef

\\def\\CTEXunderdot{\\CCTunderdot}\\def\\CTEXunderline{\\CCTunderline}

\\def\\CTEXunderdblline{\\CCTunderdblline}\\def\\CTEXunderwave{\\CCTunderwave}\\def\\CTEXsout{\\CCTsout}\\def\\CTEXxout{\\CCTxout}

\\def\\CTEXfilltwosides{\\CCTfilltwosides}

\\def\\endCTEXfilltwosides{\\endCCTfilltwosides}\\CTEX@replacecommand{CTEX}{CCT}{underdotbasesep}\\CTEX@replacecommand{CTEX}{CCT}{underdotsep}

\\CTEX@replacecommand{CTEX}{CCT}{underlinebasesep}\\CTEX@replacecommand{CTEX}{CCT}{underlinesep}

\\CTEX@replacecommand{CTEX}{CCT}{underdbllinebasesep}\\CTEX@replacecommand{CTEX}{CCT}{underdbllinesep}\\CTEX@replacecommand{CTEX}{CCT}{underwavebasesep}\\CTEX@replacecommand{CTEX}{CCT}{underwavesepa}\\CTEX@replacecommand{CTEX}{CCT}{underwavesep}\\CTEX@replacecommand{CTEX}{CCT}{southeight}\\CTEX@replacecommand{CTEX}{CCT}{xoutheight}\\CTEX@replacecommand{CTEX}{CCT}{underdotcolor}\\CTEX@replacecommand{CTEX}{CCT}{underwavecolor}\\CTEX@replacecommand{CTEX}{CCT}{underlinecolor}\\CTEX@replacecommand{CTEX}{CCT}{underdbllinecolor}\\CTEX@replacecommand{CTEX}{CCT}{soutcolor}\\CTEX@replacecommand{CTEX}{CCT}{xoutcolor}\\fi??/cct??

3.6

476

CJK相关配置

???cjk??

3.6.1

477

CJK环境设置

\\AtEndOfPackage{\\CJK@makeActive}

缺省情况下,我们把整个文档都包含到CJK环境中。如果\\ifCTEX@space设置为true,我们使用CJK环境,否则使用CJK*环境。

478479480

\\ifCTEX@space

\\def\\CTEX@beginCJK{\\begin{CJK}{GBK}{rm}}\\def\\CTEX@endCJK{\\clearpage\\end{CJK}}

3源代码说明29

481482483484485486487488489490

\\else

\\def\\CTEX@beginCJK{\\begin{CJK*}{GBK}{rm}\\CJKtilde}\\def\\CTEX@endCJK{\\clearpage\\end{CJK*}}\\fi

\\let\\CTEX@begindocumenthook\\@begindocumenthook\\let\\CTEX@enddocumenthook\\@enddocumenthook

\\def\\AtBeginDocument{\\g@addto@macro\\CTEX@begindocumenthook}\\def\\AtEndDocument{\\g@addto@macro\\CTEX@enddocumenthook}

\\def\\@begindocumenthook{\\CTEX@begindocumenthook\\CTEX@beginCJK}\\def\\@enddocumenthook{\\CTEX@endCJK\\CTEX@enddocumenthook}

\\CTEXspace\\CTEXnospace

491492

\\def\\CTEXspace{\\CJKspace}

\\def\\CTEXnospace{\\CJKnospace}

3.6.2

\\songti\\heiti\\fangsong\\kaishu\\lishu\\youyuan

常用的中文字体

定义常用的中文字体命令:宋体、黑体、楷书、仿宋、隶书、幼圆。

493494495496497498

\\newcommand*{\\songti}{\\CJKfamily{song}}\\newcommand*{\\heiti}{\\CJKfamily{hei}}\\newcommand*{\\kaishu}{\\CJKfamily{kai}}\\newcommand*{\\fangsong}{\\CJKfamily{fs}}\\newcommand*{\\lishu}{\\CJKfamily{li}}\\newcommand*{\\youyuan}{\\CJKfamily{you}}%%%%%%宋体黑体楷书仿宋隶书幼圆

3.6.3

\\CTEX@save@set@fontsize

\\set@fontsize

中文字号

对\\set@fontsize命令需要进行重定义,以便及时更新字体信息。

499500501502

\\let\\CTEX@save@set@fontsize\\set@fontsize\\def\\set@fontsize#1#2#3{%

\\CTEX@save@set@fontsize{#1}{#2}{#3}%\\CTEXsetfont}

3.6.4

\\ziju

其他字体命令

定义调整汉字字距的命令。

503504505506

\\newcommand*\\ziju[1]{%字距

\\settowidth\\@tempdima{\\CTEX@spaceChar}%

\\renewcommand{\\CJKglue}{\\hskip#1\\@tempdima}%\\CTEXsetfont}

\\ccwd\\ccwd是当前的汉字字宽。

507

\\newdimen\\ccwd%字宽

3源代码说明30

\\CTEXsetfont\\CTEXsetfont获得当前的汉字信息。

508509510

\\newcommand*\\CTEXsetfont{%

\\settowidth\\ccwd{\\CTEX@spaceChar\\CJKglue}%\\ifdim\\parindent=0pt\\else\\parindent2\\ccwd\\fi}

3.6.5CJKfntef宏包接口

为CJKfntef.sty宏包的命令提供统一接口。

511512513514515516517518519520521522523524525526527528529530531532533534535536

\\ifCTEX@fntef

\\def\\CTEXunderdot{\\CJKunderdot}\\def\\CTEXunderline{\\CJKunderline}

\\def\\CTEXunderdblline{\\CJKunderdblline}\\def\\CTEXunderwave{\\CJKunderwave}\\def\\CTEXsout{\\CJKsout}\\def\\CTEXxout{\\CJKxout}

\\def\\CTEXfilltwosides{\\CJKfilltwosides}

\\def\\endCTEXfilltwosides{\\endCJKfilltwosides}\\CTEX@replacecommand{CTEX}{CJK}{underdotbasesep}\\CTEX@replacecommand{CTEX}{CJK}{underdotsep}

\\CTEX@replacecommand{CTEX}{CJK}{underlinebasesep}\\CTEX@replacecommand{CTEX}{CJK}{underlinesep}

\\CTEX@replacecommand{CTEX}{CJK}{underdbllinebasesep}\\CTEX@replacecommand{CTEX}{CJK}{underdbllinesep}\\CTEX@replacecommand{CTEX}{CJK}{underwavebasesep}\\CTEX@replacecommand{CTEX}{CJK}{underwavesep}\\CTEX@replacecommand{CTEX}{CJK}{southeight}\\CTEX@replacecommand{CTEX}{CJK}{underdotcolor}\\CTEX@replacecommand{CTEX}{CJK}{underwavecolor}\\CTEX@replacecommand{CTEX}{CJK}{underlinecolor}\\CTEX@replacecommand{CTEX}{CJK}{underdbllinecolor}\\CTEX@replacecommand{CTEX}{CJK}{soutcolor}\\CTEX@replacecommand{CTEX}{CJK}{xoutcolor}\\fi??/cjk??

3.7中文数字处理

由于脆弱命令的原因,CJK提供的\\CJKnumber在章节编号中直接使用会引发不少问

题。在生成目录和书签等辅助文件时,我们需要未经CJK处理过的中文字符串,而不能是\\CJKchar{...}的形式。此外,这些中文数字必须在被使用之前就已经生成好。于是我们修改了CJKnumb宏包中的一些定义来处理章节编号。

首先是一些基本数字,需要在ctex.def文件中重新定义。

3源代码说明31

537538539540541542543544545546547548549550551552553554555556557558

???def??

\\def\\CTEXnullspace{0pt}

\\def\\CTEX@null{\\kern\\CTEXnullspace○\\kern\\CTEXnullspace}\\def\\CTEX@zero{零}\\def\\CTEX@one{一}\\def\\CTEX@two{二}\\def\\CTEX@three{三}\\def\\CTEX@four{四}\\def\\CTEX@five{五}\\def\\CTEX@six{六}\\def\\CTEX@seven{七}\\def\\CTEX@eight{八}\\def\\CTEX@nine{九}\\def\\CTEX@ten{十}

\\def\\CTEX@hundred{百}\\def\\CTEX@thousand{千}\\def\\CTEX@tenthousand{万}\\def\\CTEX@hundredmillion{亿}\\def\\CTEX@minus{-}??/def?????ctex|cls??

一些条件定义和计数器

559560561562563

\\newif\\ifCTEX@zero@

\\newif\\ifCTEX@previous@\\newif\\ifCTEX@null@\\newcount\\CTEX@q\\newcount\\CTEX@r

\\CTEX@appendstring中文数字处理命令\\CTEX@appendstring用于拼接字符串。

564565

\\def\\CTEX@appendstring#1#2{%

\\expandafter\\def\\expandafter#1\\expandafter{#1#2}}

\\CTEX@appendnumber中文数字处理命令\\CTEX@appendnumber用于拼接数字。

566567568569570571572573574

\\def\\CTEX@appendnumber#1#2{%\\ifcase#2\\relax\\ifCTEX@null@

\\CTEX@appendstring{#1}{\\CTEX@null}%\\else

\\CTEX@appendstring{#1}{\\CTEX@zero}%\\fi

\\or\\CTEX@appendstring{#1}{\\CTEX@one}%\\or\\CTEX@appendstring{#1}{\\CTEX@two}%

3源代码说明32

575576577578579580581582

\\or\\CTEX@appendstring{#1}{\\CTEX@three}%\\or\\CTEX@appendstring{#1}{\\CTEX@four}%\\or\\CTEX@appendstring{#1}{\\CTEX@five}%\\or\\CTEX@appendstring{#1}{\\CTEX@six}%\\or\\CTEX@appendstring{#1}{\\CTEX@seven}%\\or\\CTEX@appendstring{#1}{\\CTEX@eight}%\\or\\CTEX@appendstring{#1}{\\CTEX@nine}%\\fi}

\\CTEX@splitnumber中文数字处理命令\\CTEX@splitnumber将大的数字分为几段四位以内的数字。

583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617

\\def\\CTEX@splitnumber#1{%\\CTEX@q#1\\relax\\CTEX@r#1\\relax%

\\divide\\CTEX@q\\@M\\begingroup

\\multiply\\CTEX@q\\@M

\\advance\\CTEX@r-\\CTEX@q\\ifnum\\CTEX@r=\\z@\\xdef\\CTEX@low{}%\\else

\\xdef\\CTEX@low{\\number\\CTEX@r}%\\fi

\\endgroup%

\\ifnum\\CTEX@q>\\z@\\CTEX@r\\CTEX@q%

\\divide\\CTEX@q\\@M\\begingroup

\\multiply\\CTEX@q\\@M

\\advance\\CTEX@r-\\CTEX@q\\ifnum\\CTEX@r=\\z@\\xdef\\CTEX@high{}%\\else

\\xdef\\CTEX@high{\\number\\CTEX@r}%\\fi

\\endgroup%

\\ifnum\\CTEX@q>\\z@

\\xdef\\CTEX@yi{\\number\\CTEX@q}%\\else

\\xdef\\CTEX@yi{}%\\fi\\else

3源代码说明33

618619620621

\\xdef\\CTEX@high{}%\\xdef\\CTEX@yi{}%\\fi}

\\CTEX@processnumber中文数字处理命令\\CTEX@processnumber处理四位以内的数字,并将得到的中文数字存放在第一个参数中。

622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659

\\def\\CTEX@processnumber#1#2{%\\CTEX@zero@false%

\\CTEX@q#2\\relax\\CTEX@r#2\\relax%

\\divide\\CTEX@q\\@m\\ifnum\\CTEX@q=\\z@\\ifCTEX@previous@\\CTEX@zero@true\\fi\\else

\\ifCTEX@zero@

\\CTEX@appendstring{#1}{\\CTEX@zero}%\\fi

\\CTEX@appendnumber{#1}{\\CTEX@q}%

\\CTEX@appendstring{#1}{\\CTEX@thousand}%\\CTEX@previous@true\\CTEX@zero@false\\fi%

\\multiply\\CTEX@q\\@m

\\advance\\CTEX@r-\\CTEX@q\\CTEX@q\\CTEX@r%

\\divide\\CTEX@q100\\relax\\ifnum\\CTEX@q=\\z@\\ifCTEX@previous@\\CTEX@zero@true\\fi\\else

\\ifCTEX@zero@

\\CTEX@appendstring{#1}{\\CTEX@zero}%\\fi

\\CTEX@appendnumber{#1}{\\CTEX@q}%

\\CTEX@appendstring{#1}{\\CTEX@hundred}%\\CTEX@previous@true\\CTEX@zero@false

3源代码说明34

660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697

\\fi%

\\multiply\\CTEX@q100

\\advance\\CTEX@r-\\CTEX@q\\CTEX@q\\CTEX@r%

\\divide\\CTEX@q10\\relax\\ifnum\\CTEX@q=\\z@\\ifCTEX@previous@\\CTEX@zero@true\\fi\\else

\\ifCTEX@zero@

\\CTEX@appendstring{#1}{\\CTEX@zero}%\\fi

\\ifnum\\CTEX@q=\\@ne\\ifCTEX@previous@

\\CTEX@appendstring{#1}{\\CTEX@one}%\\fi\\else

\\CTEX@appendnumber{#1}{\\CTEX@q}%\\fi

\\CTEX@appendstring{#1}{\\CTEX@ten}%\\CTEX@previous@true\\CTEX@zero@false\\fi%

\\multiply\\CTEX@q10

\\advance\\CTEX@r-\\CTEX@q%

\\ifnum\\CTEX@r=\\z@\\else

\\ifCTEX@zero@

\\CTEX@appendstring{#1}{\\CTEX@zero}%\\fi

\\CTEX@appendnumber{#1}{\\CTEX@r}%\\CTEX@previous@true\\fi}

\\CTEXnumber中文数字处理命令\\CTEXnumber将第二个参数中的数字转换为中文并保存在第一个参数中。

698699700701

\\DeclareRobustCommand\\CTEXnumber[2]{%\\def#1{}%

\\CTEX@null@false%

3源代码说明35

702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739

\\CTEX@q#2\\relax%

\\ifnum\\CTEX@q<\\z@

\\multiply\\CTEX@q\\m@ne

\\CTEX@appendstring{#1}{\\CTEX@minus}%\\fi%

\\CTEX@previous@false\\CTEX@zero@false%

\\ifnum\\CTEX@q=\\z@

\\CTEX@appendstring{#1}{\\CTEX@zero}%\\else

\\CTEX@splitnumber{\\CTEX@q}%%

\\ifx\\CTEX@yi\\@empty\\else

\\CTEX@processnumber{#1}{\\CTEX@yi}%

\\CTEX@appendstring{#1}{\\CTEX@hundredmillion}%\\fi%

\\ifx\\CTEX@high\\@empty\\else

\\CTEX@processnumber{#1}{\\CTEX@high}%

\\CTEX@appendstring{#1}{\\CTEX@tenthousand}%\\fi%

\\ifx\\CTEX@low\\@empty\\else

\\ifx\\CTEX@yi\\@empty\\else

\\ifx\\CTEX@high\\@empty

\\CTEX@appendstring{#1}{\\CTEX@zero}%thiscatches100002345\\fi\\fi

\\CTEX@processnumber{#1}{\\CTEX@low}%\\fi\\fi}

\\CTEX@getdigit中文数字处理命令\\CTEX@getdigit用于提取最高位的数字。

740741742

\\def\\CTEX@getdigit#1#2\\@nil{%\\edef\\CTEX@tempa{#1}%\\edef\\CTEX@tempb{#2}}

\\CTEXdigits中文数字处理命令\\CTEXdigits将第二个参数中的数字串为中文数字串并保存在第一个参

3源代码说明数中。

743744745746747748749750751752753754755756

36

\\DeclareRobustCommand\\CTEXdigits[2]{%\\def#1{}%

\\CTEX@null@true

\\edef\\CTEX@tempa{}%\\edef\\CTEX@tempb{#2}%\\ifx\\CTEX@tempb\\@empty\\else\\loop

\\expandafter\\CTEX@getdigit\\CTEX@tempb\\@nil\\CTEX@appendnumber{#1}{\\CTEX@tempa}%\\ifx\\CTEX@tempb\\@empty\\else\\repeat\\fi}

\\CTEXcounter\\CTEXcounter用于生成对应于计数器\\FOO的中文数字\\cc@FOO。

757758759760761762

\\DeclareRobustCommand\\CTEXcounter[1]{%\\@ifundefined{c@#1}{}{%

\\CTEXnumber{\\reserved@a}{\\@arabic\\csnamec@#1\\endcsname}%\\expandafter\\expandafter\\expandafter\\def%

\\expandafter\\expandafter\\csnamecc@#1\\endcsname%\\expandafter{\\reserved@a}}}

\\setcounter\\addtocounter\\stepcounter

重新定义\\setcounter和\\addtocounter以及时更新\\cc@FOO。

763764765766767768769770771772773774775776777778779780

\\AtBeginDocument{%\\makeatletter%

\\@ifundefined{CTEX@save@setcounter}{%\\let\\CTEX@save@setcounter\\setcounter%\\def\\setcounter#1#2{%

\\CTEX@save@setcounter{#1}{#2}%\\CTEXcounter{#1}}}{}

\\@ifundefined{CTEX@save@addtocounter}{%

\\let\\CTEX@save@addtocounter\\addtocounter%\\def\\addtocounter#1#2{%

\\CTEX@save@addtocounter{#1}{#2}%\\CTEXcounter{#1}}}{}

\\@ifundefined{CTEX@save@stepcounter}{%\\let\\CTEX@save@stepcounter\\stepcounter%\\def\\stepcounter#1{%

\\CTEX@save@stepcounter{#1}%\\CTEXcounter{#1}}}{}

\\makeatother}

3源代码说明37

\\chinese\\chinese用于获得计数器\\FOO对应的中文数字\\cc@FOO。

781782783

\\def\\chinese#1{%

\\@ifundefined{cc@#1}{\\CTEX@null}{\\csnamecc@#1\\endcsname}}??/ctex|cls??

3.8中文化的标题结构

A在中文标题的处理上,需要修改LTEX标准文档的定义来实现中文标题。这个功能最

早是通过GB.cap来实现的,但是CJK提供的文件只能配合koma-script文档类使用而不支持标准文档类。原因是标准文档类需要作出较大的改动。我们最早尝试过把对标准文档类的修改也放到GB.cap文件中,在简单应用中可以达到目的。但是我们还是意识到由于受到GB.cap文件装入时间的限制,这种方案不可避免的带有兼容性问题。解决的方法就是通过自定义的文档类来实现这个功能。此外,中文的标题格式也和英文有所不同,这些都只有修改标准文档类的定义才能实现,于是就有了下面这些代码。3.8.1

章节标题基本结构

以下定义章节标题的基本结构单元。

784

???ctexcap|cls??

\\CTEX@defsecname对于每种章节类型FOO,我们都要定义一个章节名字\\CTEXtheFOO,由\\CTEX@preFOO、\\CTEX@theFOO和\\CTEX@postFOO组成。所以我们用下面的这个命令来完成这些重复工作。

785

\\def\\CTEX@defsecformat#1{%

首先是无格式信息的章节标题。

786787788789790791792793

\\expandafter\\def\\csnameCTEX@pre#1\\endcsname{}%

\\expandafter\\def\\csnameCTEX@post#1\\endcsname{}%\\expandafter\\def\\csnameCTEX@the#1\\endcsname{%\\csnamethe#1\\endcsname}%

\\expandafter\\def\\csnameCTEXthe#1\\endcsname{%\\csnameCTEX@pre#1\\endcsname%\\csnameCTEX@the#1\\endcsname%\\csnameCTEX@post#1\\endcsname}%

然后是包含格式信息的章节标题,先定义一些用于控制格式的宏:\\CTEX@FOO@format作用于整个标题,一般用于控制对齐方式;\\CTEX@FOO@nameformat作用于整个章节名字(\\CTEXtheFOO);\\CTEX@FOO@numberformat作用于章节编号(\\CTEX@theFOO);

3源代码说明38

\\CTEX@FOO@aftername作用于章节名字后的部分,一般用于控制章节名字和章节标题内容

之间是否换行等;

\\CTEX@FOO@titleformat用于控制标题内容的格式。

\\CTEX@FOOname则是在\\CTEXtheFOO中加入了上面的这些格式控制得到的。

794795796797798799800801802803804805806807

\\expandafter\\def\\csnameCTEX@#1@format\\endcsname{}%

\\expandafter\\def\\csnameCTEX@#1@nameformat\\endcsname{}%\\expandafter\\def\\csnameCTEX@#1@numberformat\\endcsname{}%\\expandafter\\def\\csnameCTEX@#1@aftername\\endcsname{}%\\expandafter\\def\\csnameCTEX@#1@titleformat\\endcsname{}\\expandafter\\def\\csnameCTEX@#1name\\endcsname{%\\csnameCTEX@#1@nameformat\\endcsname%\\csnameCTEX@pre#1\\endcsname%\\begingroup%

\\csnameCTEX@#1@numberformat\\endcsname%\\csnameCTEX@the#1\\endcsname%\\endgroup%

\\csnameCTEX@post#1\\endcsname%

\\csnameCTEX@#1@aftername\\endcsname}%

然后是标题上下的空距和缩进:

808809810811

\\expandafter\\def\\csnameCTEX@#1@beforeskip\\endcsname{}%\\expandafter\\def\\csnameCTEX@#1@afterskip\\endcsname{}%\\expandafter\\def\\csnameCTEX@#1@indent\\endcsname{}%}

标准的七种章节类型都需要定义。

812813814815816817818

\\CTEX@defsecformat{part}\\CTEX@defsecformat{chapter}\\CTEX@defsecformat{section}\\CTEX@defsecformat{subsection}\\CTEX@defsecformat{subsubsection}\\CTEX@defsecformat{paragraph}\\CTEX@defsecformat{subparagraph}

缺省的一些设置,在不使用中文标题的时候使用。

819820

\\def\\CTEX@prepart{Part\\space}

\\def\\CTEX@prechapter{Chapter\\space}

part的缺省格式

821822823

??ctex??\\ifCTEX@cls{article}{???ctex|article??

\\def\\CTEX@part@format{\\raggedright}

3源代码说明39

824825826827828829830831832833834835836837838

\\def\\CTEX@part@nameformat{\\Large\\bfseries}\\def\\CTEX@part@aftername{\\par\\nobreak}

\\def\\CTEX@part@titleformat{\\huge\\bfseries}\\def\\CTEX@part@beforeskip{4ex}\\def\\CTEX@part@afterskip{3ex}\\def\\CTEX@part@indent{\\z@}??/ctex|article????ctex??}{

???ctex|report|book??

\\def\\CTEX@part@format{\\centering}

\\def\\CTEX@part@nameformat{\\huge\\bfseries}\\def\\CTEX@part@aftername{\\par\\vskip20\\p@}\\def\\CTEX@part@titleformat{\\Huge\\bfseries}??/ctex|report|book????ctex??}

chapter的缺省格式

839840841842843844845

\\def\\CTEX@chapter@format{\\raggedright}

\\def\\CTEX@chapter@nameformat{\\huge\\bfseries}

\\def\\CTEX@chapter@aftername{\\par\\nobreak\\vskip20\\p@}\\def\\CTEX@chapter@titleformat{\\Huge\\bfseries}\\def\\CTEX@chapter@beforeskip{50\\p@}\\def\\CTEX@chapter@afterskip{40\\p@}\\def\\CTEX@chapter@indent{\\z@}

section的缺省格式

846847848849850

\\def\\CTEX@section@format{\\Large\\bfseries}\\def\\CTEX@section@aftername{\\quad}

\\def\\CTEX@section@beforeskip{-3.5ex\\@plus-1ex\\@minus-.2ex}\\def\\CTEX@section@afterskip{2.3ex\\@plus.2ex}\\def\\CTEX@section@indent{\\z@}

subsection的缺省格式

851852853854855

\\def\\CTEX@subsection@format{\\large\\bfseries}\\def\\CTEX@subsection@aftername{\\quad}

\\def\\CTEX@subsection@beforeskip{-3.25ex\\@plus-1ex\\@minus-.2ex}\\def\\CTEX@subsection@afterskip{1.5ex\\@plus.2ex}\\def\\CTEX@subsection@indent{\\z@}

subsubsection的缺省格式

856857858859860

\\def\\CTEX@subsubsection@format{\\normalsize\\bfseries}\\def\\CTEX@subsubsection@aftername{\\quad}

\\def\\CTEX@subsubsection@beforeskip{-3.25ex\\@plus-1ex\\@minus-.2ex}\\def\\CTEX@subsubsection@afterskip{1.5ex\\@plus.2ex}\\def\\CTEX@subsubsection@indent{\\z@}

3源代码说明支持\\subsubsection以下的小节标题编号paragraph的缺省格式

861862863864865866867868869870

40

\\def\\CTEX@paragraph@format{\\normalsize\\bfseries}\\def\\CTEX@paragraph@aftername{\\quad}\\ifnum\\c@CTEX@sectiondepth>2

\\def\\CTEX@paragraph@beforeskip{-3.25ex\\@plus-1ex\\@minus-.2ex}\\def\\CTEX@paragraph@afterskip{1ex\\@plus.2ex}\\else

\\def\\CTEX@paragraph@beforeskip{3.25ex\\@plus1ex\\@minus.2ex}\\def\\CTEX@paragraph@afterskip{-1em}\\fi

\\def\\CTEX@paragraph@indent{\\z@}

subparagraph的缺省格式

871872873874875876877878879880881882883884

\\def\\CTEX@subparagraph@format{\\normalsize\\bfseries}\\def\\CTEX@subparagraph@aftername{\\quad}\\ifnum\\c@CTEX@sectiondepth>3

\\def\\CTEX@subparagraph@beforeskip{-3.25ex\\@plus-1ex\\@minus-.2ex}\\def\\CTEX@subparagraph@afterskip{1ex\\@plus.2ex}\\else

\\def\\CTEX@subparagraph@beforeskip{3.25ex\\@plus1ex\\@minus.2ex}\\def\\CTEX@subparagraph@afterskip{-1em}\\fi

\\ifnum\\c@CTEX@sectiondepth>2

\\def\\CTEX@subparagraph@indent{\\z@}\\else

\\def\\CTEX@subparagraph@indent{\\parindent}\\fi

\\CTEX@appendixname附录的标题

885886887888889890891892893

??ctexcap??\\ifCTEX@cls{article}{???ctexcap|article??

\\def\\CTEX@appendixname{}??/ctexcap|article????ctexcap??}{

???ctexcap|report|book??

\\def\\CTEX@appendixname{Appendix\\space}??/ctexcap|report|book????ctexcap??}

\\CTEX@appendixnumber附录的编号格式,缺省是大写英文字母。

894895896897

??ctexcap??\\ifCTEX@cls{article}{???ctexcap|article??

\\def\\CTEX@appendixnumber{\\@Alph\\c@section}??/ctexcap|article??

3源代码说明41

898899900901902

??ctexcap??}{

???ctexcap|report|book??

\\def\\CTEX@appendixnumber{\\@Alph\\c@chapter}??/ctexcap|report|book????ctexcap??}

\\CTEX@save@appendix

\\appendix

重定义\\appendix命令以改变附录标题

903904905906907908909910911912913914915916917918919

\\let\\CTEX@save@appendix\\appendix??ctexcap??\\ifCTEX@cls{article}{???ctexcap|article??

\\renewcommand*\\appendix{\\CTEX@save@appendix%\\gdef\\CTEX@presection{\\CTEX@appendixname}%\\gdef\\CTEX@thesection{\\CTEX@appendixnumber}%\\gdef\\CTEX@postsection{}}%??/ctexcap|article????ctexcap??}{

???ctexcap|report|book??

\\renewcommand*\\appendix{\\CTEX@save@appendix%\\gdef\\CTEX@prechapter{\\CTEX@appendixname}%\\gdef\\CTEX@thechapter{\\CTEX@appendixnumber}%\\gdef\\CTEX@postchapter{}}%??/ctexcap|report|book????ctexcap??}??/ctexcap|cls??

3.8.2part的标题

A以下一段修改标准LTEX文档类以实现中文标题需要的结构。

part的标题修改,首先是article类:

920921922923924925926927928929930931932933

??ctexcap??\\ifCTEX@cls{article}{

???ctexcap|article??

\\renewcommand\\part{%

\\if@noskipsec\\leavevmode\\fi\\par

%\\addvspace{4ex}%

\\addvspace{\\CTEX@part@beforeskip}%\\@afterindentfalse\\secdef\\@part\\@spart}\\def\\@part[#1]#2{%

\\ifnum\\c@secnumdepth>\\m@ne\\refstepcounter{part}%%\\addcontentsline{toc}{part}{\\thepart\\hspace{1em}#1}%

\\addcontentsline{toc}{part}{\\CTEXthepart\\hspace{1em}#1}%

3源代码说明42

934935936937938939940941942943944945946947948949950951952953954955956957958959960961

\\else

\\addcontentsline{toc}{part}{#1}%\\fi

{\\interlinepenalty\\@M

%\\normalfont\\parindent\\z@\\raggedright

\\normalfont\\parindent\\CTEX@part@indent\\CTEX@part@format\\ifnum\\c@secnumdepth>\\m@ne%\\Large\\bfseries\\partname\\nobreakspace\\thepart\\par\\nobreak

\\CTEX@partname\\fi

%\\huge\\bfseries#2%

\\CTEX@part@titleformat#2%\\markboth{}{}\\par}%\\nobreak%\\vskip3ex

\\vskip\\CTEX@part@afterskip\\@afterheading}\\def\\@spart#1{%

{\\interlinepenalty\\@M%\\normalfont\\parindent\\z@\\raggedright

\\normalfont\\parindent\\CTEX@part@indent\\CTEX@part@format%\\huge\\bfseries#1\\par}%

\\CTEX@part@titleformat#1\\par}%\\nobreak%\\vskip3ex

\\vskip\\CTEX@part@afterskip\\@afterheading}??/ctexcap|article??

然后是report和book类:

962963964965966967968969970971972973974975976

??ctexcap??}{

???ctexcap|report|book??\\def\\@part[#1]#2{%

\\ifnum\\c@secnumdepth>-2\\relax\\refstepcounter{part}%%\\addcontentsline{toc}{part}{\\thepart\\hspace{1em}#1}%

\\addcontentsline{toc}{part}{\\CTEXthepart\\hspace{1em}#1}%\\else

\\addcontentsline{toc}{part}{#1}%\\fi

\\markboth{}{}%

{\\interlinepenalty\\@M%\\normalfont\\centering

\\normalfont\\CTEX@part@format\\ifnum\\c@secnumdepth>-2\\relax

3源代码说明43

977978979980981982983984985986987988989990991

%

\\huge\\bfseries\\partname\\nobreakspace\\thepart\\par\\vskip20\\p@\\CTEX@partname\\fi

%\\Huge\\bfseries#2\\par}%

\\CTEX@part@titleformat#2\\par}%\\@endpart}\\def\\@spart#1{%

{\\interlinepenalty\\@M%\\normalfont\\centering

\\normalfont\\CTEX@part@format%\\Huge\\bfseries#1\\par}%

\\CTEX@part@titleformat#1\\par}%\\@endpart}

??/ctexcap|report|book????ctexcap??}

3.8.3chapter的标题

chapter的标题修改,首先是report类的

992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017

??ctexcap??\\ifCTEX@cls{report}{???ctexcap|report??

\\def\\@chapter[#1]#2{%

\\ifnum\\c@secnumdepth>\\m@ne\\refstepcounter{chapter}%%\\typeout{\\@chapapp\\space\\thechapter.}%

\\typeout{\\CTEXthechapter}%

\\addcontentsline{toc}{chapter}%{\\protect\\numberline{\\thechapter}#1}%

{\\protect\\numberline{\\CTEXthechapter\\hspace{0.3em}}#1}%\\else

\\addcontentsline{toc}{chapter}{#1}%\\fi

\\chaptermark{#1}%

\\addtocontents{lof}{\\protect\\addvspace{10\\p@}}%\\addtocontents{lot}{\\protect\\addvspace{10\\p@}}%\\if@twocolumn

\\@topnewpage[\\@makechapterhead{#2}]%\\else

\\@makechapterhead{#2}%\\@afterheading\\fi}

\\def\\@makechapterhead#1{%%\\vspace*{50\\p@}%

\\vspace*{\\CTEX@chapter@beforeskip}%

%{\\normalfont\\parindent\\z@\\raggedright

3源代码说明44

1018101910201021102210231024102510261027102810291030

{\\normalfont\\parindent\\CTEX@chapter@indent\\CTEX@chapter@format\\ifnum\\c@secnumdepth>\\m@ne%\\huge\\bfseries\\@chapapp\\space\\thechapter\\par\\nobreak\\vskip20\\p@

\\CTEX@chaptername\\fi

\\interlinepenalty\\@M

%\\Huge\\bfseries#1\\par\\nobreak

\\CTEX@chapter@titleformat#1\\par\\nobreak%\\vskip40\\p@

\\vskip\\CTEX@chapter@afterskip}}

??/ctexcap|report????ctexcap??}{}

然后是book类的

103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060

??ctexcap??\\ifCTEX@cls{book}{???ctexcap|book??

\\def\\@chapter[#1]#2{%

\\ifnum\\c@secnumdepth>\\m@ne\\if@mainmatter

\\refstepcounter{chapter}%

%\\typeout{\\@chapapp\\space\\thechapter.}%

\\typeout{\\CTEXthechapter}%

\\addcontentsline{toc}{chapter}

%{\\protect\\numberline{\\thechapter}#1}%

{\\protect\\numberline{\\CTEXthechapter\\hspace{0.3em}}#1}%\\else

\\addcontentsline{toc}{chapter}{#1}%\\fi\\else

\\addcontentsline{toc}{chapter}{#1}%\\fi

\\chaptermark{#1}%

\\addtocontents{lof}{\\protect\\addvspace{10\\p@}}%\\addtocontents{lot}{\\protect\\addvspace{10\\p@}}%\\if@twocolumn

\\@topnewpage[\\@makechapterhead{#2}]%\\else

\\@makechapterhead{#2}%\\@afterheading\\fi}

\\def\\@makechapterhead#1{%%\\vspace*{50\\p@}%

\\vspace*{\\CTEX@chapter@beforeskip}%

%{\\normalfont\\parindent\\z@\\raggedright

3源代码说明45

106110621063106410651066106710681069107010711072107310741075

{\\normalfont\\parindent\\CTEX@chapter@indent\\CTEX@chapter@format\\ifnum\\c@secnumdepth>\\m@ne\\if@mainmatter%\\huge\\bfseries\\@chapapp\\space\\thechapter\\par\\nobreak\\vskip20\\p@

\\CTEX@chaptername\\fi\\fi

\\interlinepenalty\\@M

%\\Huge\\bfseries#1\\par\\nobreak

\\CTEX@chapter@titleformat#1\\par\\nobreak%\\vskip40\\p@

\\vskip\\CTEX@chapter@afterskip}}

??/ctexcap|book????ctexcap??}{}

有一些是report类和book类共有的

1076107710781079108010811082108310841085108610871088

???ctexcap|report|book??

\\def\\@makeschapterhead#1{%%\\vspace*{50\\p@}%

\\vspace*{\\CTEX@chapter@beforeskip}%

%{\\normalfont\\parindent\\z@\\raggedright

{\\normalfont\\parindent\\CTEX@chapter@indent\\CTEX@chapter@format\\interlinepenalty\\@M

%\\Huge\\bfseries#1\\par\\nobreak

\\CTEX@chapter@titleformat#1\\par\\nobreak%\\vskip40\\p@

\\vskip\\CTEX@chapter@afterskip}}

??/ctexcap|report|book??

3.8.4

1089

section的标题

???ctexcap|cls??

下面修改节的标题的显示方式

1090109110921093109410951096109710981099

\\def\\@seccntformat#1{%

\\@ifundefined{CTEX@#1name}%

{\\csnamethe#1\\endcsname\\quad}%{\\csnameCTEX@#1name\\endcsname}}\\def\\@sect#1#2#3#4#5#6[#7]#8{%\\ifnum#2>\\c@secnumdepth\\let\\@svsec\\@empty\\else

\\refstepcounter{#1}%

\\protected@edef\\@svsec{\\@seccntformat{#1}\\relax}%

3源代码说明46

11001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134

%

%

%

%

\\fi

\\@tempskipa#5\\relax\\ifdim\\@tempskipa>\\z@\\begingroup#6{%

\\@hangfrom{\\hskip#3\\relax\\@svsec}%\\interlinepenalty\\@M#8\\@@par}%\\interlinepenalty\\@M

\\csnameCTEX@#1@titleformat\\endcsname#8\\@@par}%\\endgroup

\\csname#1mark\\endcsname{#7}%\\addcontentsline{toc}{#1}{%

\\ifnum#2>\\c@secnumdepth\\else

\\protect\\numberline{\\csnamethe#1\\endcsname}%\\protect\\numberline{\\@ifundefined{CTEXthe#1}%

{\\csnamethe#1\\endcsname}%

{\\csnameCTEXthe#1\\endcsname}}%

\\fi#7}%\\else

\\def\\@svsechd{%#6{\\hskip#3\\relax\\@svsec#8}%

\\@svsec\\csnameCTEX@#1@titleformat\\endcsname#8}%\\csname#1mark\\endcsname{#7}%\\addcontentsline{toc}{#1}{%

\\ifnum#2>\\c@secnumdepth\\else

\\protect\\numberline{\\csnamethe#1\\endcsname}%\\protect\\numberline{\\@ifundefined{CTEXthe#1}%

{\\csnamethe#1\\endcsname}%

{\\csnameCTEXthe#1\\endcsname}}%

\\fi#7}}%\\fi

\\@xsect{#5}}

通常中文章节标题编号会比较长,因此目录中的缩进距离也要调整。我们通过修改\\numberline命令来实现。

1135113611371138113911401141

\\def\\numberline#1{%

\\settowidth\\@tempdimb{#1\\hspace{0.5em}}%\\ifdim\\@tempdima<\\@tempdimb%\\@tempdima=\\@tempdimb%\\fi%

\\hb@xt@\\@tempdima{#1\\hfil}}\\renewcommand\\section{\\@startsection{section}{1}%

3源代码说明47

1142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166

{\\CTEX@section@indent}%

{\\CTEX@section@beforeskip}%{\\CTEX@section@afterskip}%

{\\normalfont\\CTEX@section@format}}

\\renewcommand\\subsection{\\@startsection{subsection}{2}%

{\\CTEX@subsection@indent}%

{\\CTEX@subsection@beforeskip}%{\\CTEX@subsection@afterskip}%

{\\normalfont\\CTEX@subsection@format}}

\\renewcommand\\subsubsection{\\@startsection{subsubsection}{3}%

{\\CTEX@subsubsection@indent}%

{\\CTEX@subsubsection@beforeskip}%{\\CTEX@subsubsection@afterskip}%

{\\normalfont\\CTEX@subsubsection@format}}

\\renewcommand\\paragraph{\\@startsection{paragraph}{4}%

{\\CTEX@paragraph@indent}%

{\\CTEX@paragraph@beforeskip}%{\\CTEX@paragraph@afterskip}%

{\\normalfont\\CTEX@paragraph@format}}

\\renewcommand\\subparagraph{\\@startsection{subparagraph}{5}%

{\\CTEX@subparagraph@indent}%

{\\CTEX@subparagraph@beforeskip}%{\\CTEX@subparagraph@afterskip}%

{\\normalfont\\CTEX@subparagraph@format}}??/ctexcap|cls??

3.8.5页眉信息的修改

修改页眉中的标题,首先是article类中的定义

1167116811691170117111721173117411751176117711781179118011811182

???ctexcap??

\\ifCTEX@cls{article}{??/ctexcap??

???ctexcap|article??\\if@twoside

\\def\\ps@headings{%

\\let\\@oddfoot\\@empty\\let\\@evenfoot\\@empty

\\def\\@evenhead{\\thepage\\hfil\\slshape\\leftmark}%\\def\\@oddhead{{\\slshape\\rightmark}\\hfil\\thepage}%\\let\\@mkboth\\markboth\\def\\sectionmark##1{%

\\markboth{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\z@

%\\thesection\\quad

\\CTEXthesection\\quad%\\fi

3源代码说明48

1183118411851186118711881189119011911192119311941195119611971198119912001201120212031204

##1}}{}}%

\\def\\subsectionmark##1{%\\markright{%

\\ifnum\\c@secnumdepth>\\@ne

%\\thesubsection\\quad

\\CTEXthesubsection\\quad%\\fi##1}}}

\\else

\\def\\ps@headings{%

\\let\\@oddfoot\\@empty

\\def\\@oddhead{{\\slshape\\rightmark}\\hfil\\thepage}%\\let\\@mkboth\\markboth\\def\\sectionmark##1{%

\\markright{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\m@ne

%\\thesection\\quad

\\CTEXthesection\\quad%\\fi

##1}}}}

\\fi

??/ctexcap|article??

然后是report类中的页眉定义

120512061207120812091210121112121213121412151216121712181219122012211222122312241225

??ctexcap??}{\\ifCTEX@cls{report}{???ctexcap|report??\\if@twoside

\\def\\ps@headings{%

\\let\\@oddfoot\\@empty\\let\\@evenfoot\\@empty

\\def\\@evenhead{\\thepage\\hfil\\slshape\\leftmark}%\\def\\@oddhead{{\\slshape\\rightmark}\\hfil\\thepage}%\\let\\@mkboth\\markboth\\def\\chaptermark##1{%

\\markboth{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\m@ne

%\\@chapapp\\\\thechapter.\\%

\\CTEXthechapter\\quad%\\fi

##1}}{}}%

\\def\\sectionmark##1{%

\\markright{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\z@

%\\thesection.\\%

\\CTEXthesection\\quad%\\fi

3源代码说明49

122612271228122912301231123212331234123512361237123812391240

##1}}}}

\\else

\\def\\ps@headings{%

\\let\\@oddfoot\\@empty

\\def\\@oddhead{{\\slshape\\rightmark}\\hfil\\thepage}%\\let\\@mkboth\\markboth\\def\\chaptermark##1{%

\\markright{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\m@ne

%\\@chapapp\\\\thechapter.\\%

\\CTEXthechapter\\quad%\\fi

##1}}}}

\\fi

??/ctexcap|report??

然后是book类中的页眉定义

1241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268

??ctexcap??}{

???ctexcap|book??\\if@twoside

\\def\\ps@headings{%

\\let\\@oddfoot\\@empty\\let\\@evenfoot\\@empty

\\def\\@evenhead{\\thepage\\hfil\\slshape\\leftmark}%\\def\\@oddhead{{\\slshape\\rightmark}\\hfil\\thepage}%\\let\\@mkboth\\markboth\\def\\chaptermark##1{%

\\markboth{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\m@ne\\if@mainmatter

%\\@chapapp\\\\thechapter.\\%

\\CTEXthechapter\\quad%\\fi\\fi

##1}}{}}%

\\def\\sectionmark##1{%

\\markright{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\z@

%\\thesection.\\%

\\CTEXthesection\\quad%\\fi

##1}}}}

\\else

\\def\\ps@headings{%

\\let\\@oddfoot\\@empty

\\def\\@oddhead{{\\slshape\\rightmark}\\hfil\\thepage}%

3源代码说明50

126912701271127212731274127512761277127812791280128112821283

%

\\let\\@mkboth\\markboth\\def\\chaptermark##1{%

\\markright{\\MakeUppercase{%\\ifnum\\c@secnumdepth>\\m@ne\\if@mainmatter

\\@chapapp\\\\thechapter.\\%\\CTEXthechapter\\quad%\\fi\\fi

##1}}}}

\\fi

??/ctexcap|book?????ctexcap??}}

??/ctexcap??

让前面的页眉定义生效:

1284

??ctexcap|cls??\\pagestyle{headings}

\\ps@fancy如果使用了fancyhdr宏包,需要修改其定义的宏,以正确显示中文页眉。

1285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309

???ctexcap|cls??

\\@ifundefined{ps@fancy}{}{%\\def\\ps@fancy{%

\\@ifundefined{@chapapp}{\\let\\@chapapp\\chaptername}{}%foramsbook\\@ifundefined{MakeUppercase}{\\def\\MakeUppercase{\%uppercase}}{}%\\@ifundefined{chapter}{\\def\\sectionmark##1{\\markboth{\\MakeUppercase{\\ifnum\\c@secnumdepth>\\z@%\\thesection\\hskip1em\\relax\\fi##1}}{}}%

\\CTEXthesection\\quad\\fi##1}}{}}%

\\def\\subsectionmark##1{\\markright{\\ifnum\\c@secnumdepth>\\@ne%\\thesubsection\\hskip1em\\relax\\fi##1}}}%

\\CTEXthesubsection\\quad\\fi##1}}}%

{\\def\\chaptermark##1{\\markboth{\\MakeUppercase{\\ifnum\\c@secnumdepth>\\m@ne%\\@chapapp\\\\thechapter.\\\\fi##1}}{}}%

\\ifCTEX@cls{book}{\\if@mainmatter\\CTEXthechapter\\quad\\fi}{\\CTEXthechapter\\quad}\\fi##1}}{}}%

\\def\\sectionmark##1{\\markright{\\MakeUppercase{\\ifnum\\c@secnumdepth>\\z@%\\thesection.\\\\fi##1}}}}%

\\CTEXthesection\\quad\\fi##1}}}}%\\ps@@fancy

\\gdef\\ps@fancy{\\@fancyplainfalse\\ps@@fancy}%\\ifdim\\headwidth<0sp

\\global\\advance\\headwidth123456789sp\\global\\advance\\headwidth\\textwidth\\fi}}

本文来源:https://www.bwwdw.com/article/krsp.html

Top