发布时间 : 星期三 文章ctex更新完毕开始阅读73983cca0c22590102029da7

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