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