diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/ctex/ctexbook.cls')
-rw-r--r-- | Master/texmf-dist/tex/latex/ctex/ctexbook.cls | 726 |
1 files changed, 390 insertions, 336 deletions
diff --git a/Master/texmf-dist/tex/latex/ctex/ctexbook.cls b/Master/texmf-dist/tex/latex/ctex/ctexbook.cls index bc6fab18252..b98a13c6c78 100644 --- a/Master/texmf-dist/tex/latex/ctex/ctexbook.cls +++ b/Master/texmf-dist/tex/latex/ctex/ctexbook.cls @@ -6,9 +6,9 @@ %% %% ctex.dtx (with options: `class,book') %% -%% Copyright (C) 2003--2019 +%% Copyright (C) 2003--2020 %% CTEX.ORG and any individual authors listed in the documentation. -%% ------------------------------------------------------------------------------ +%% --------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either @@ -20,18 +20,17 @@ %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% -%% This work has the LPPL maintenance status `maintained'. +%% This work has the LPPL maintenance status "maintained". %% -%% The Current Maintainers of this work are Leo Liu, Qing Lee and Liam Huang. -%% -%% ------------------------------------------------------------------------------ +%% --------------------------------------------------------------------- %% \NeedsTeXFormat{LaTeX2e} +\input{ctexbackend.cfg} \RequirePackage{expl3} -\GetIdInfo$Id: ctex.dtx 735dfe2 2019-05-29 21:42:29 +0800 Qing Lee <sobenlee@gmail.com> $ +\GetIdInfo$Id: ctex.dtx 320df30 2020-05-02 06:45:05 +0800 Qing Lee <sobenlee@gmail.com> $ {Chinese adapter for class book (CTEX)} \ProvidesExplClass{ctexbook} - {\ExplFileDate}{2.4.16}{\ExplFileDescription} + {\ExplFileDate}{2.5.1}{\ExplFileDescription} \tl_const:Nx \c__ctex_version_tl { \cs_if_exist_use:cF { ver@ \@currname . \@currext } { 9999/99/99 } } \cs_new_eq:cN { ver@ctex. \@pkgextension } \c__ctex_version_tl @@ -42,11 +41,11 @@ \msg_new:nnnn { ctex } { l3-too-old } { Support~package~`#1'~too~old. } { - Please~update~an~up~to~date~version~of~the~bundles\\\\ + Please~update~an~up-to-date~version~of~the~bundles\\\\ `l3kernel'~and~`l3packages'\\\\ using~your~TeX~package~manager~or~from~CTAN. } -\@ifpackagelater { expl3 } { 2019/03/05 } { } +\@ifpackagelater { expl3 } { 2020/04/06 } { } { \msg_error:nnn { ctex } { l3-too-old } { expl3 } } \@ifpackagelater { l3keys2e } { 2015/12/20 } { } { \msg_error:nnn { ctex } { l3-too-old } { l3keys2e } } @@ -62,11 +61,20 @@ } { \msg_critical:nnx { ctex } { engine-not-supported } { \c__ctex_engine_str } } \RequirePackage { ctexhook , ctexpatch } -\RequirePackage { fix-cm , everysel } +\RequirePackage { fix-cm } +\RequirePackage { everysel } \tl_clear_new:N \l__ctex_tmp_tl \int_new:N \l__ctex_tmp_int \box_new:N \l__ctex_tmp_box \dim_new:N \l__ctex_tmp_dim +\cs_new_protected:Npn \ctex_define_option:n + { \keys_define:nn { ctex / option } } +\cs_new_protected:Npn \ctex_define:n + { \keys_define:nn { ctex } } +\cs_new_protected:Npn \ctex_set:n + { \keys_set:nn { ctex } } +\cs_new_protected:Npn \ctex_set:nn #1 + { \keys_set:nn { ctex / #1 } } \cs_new_protected:Npn \ctex_file_wrapper:nnn #1#2#3 { \use:x @@ -82,9 +90,9 @@ #3 } } -\cs_new_protected_nopar:Npn \ctex_file_input:n #1 +\cs_new_protected:Npn \ctex_file_input:n #1 { \ctex_file_wrapper:nnn { } { \file_input:n {#1} } { } } -\cs_new_protected_nopar:Npn \ctex_scheme_input:n #1 +\cs_new_protected:Npn \ctex_scheme_input:n #1 { \ctex_file_wrapper:nnn { } @@ -104,7 +112,7 @@ \msg_new:nnnn { ctex } { package-too-old } { Support~package~`#1'~too~old. } { - Please~update~an~up~to~date~version~of~the~package~`#1'\\ + Please~update~an~up-to-date~version~of~the~package~`#1'\\ using~your~TeX~package~manager~or~from~CTAN. } \sys_if_output_pdf:TF @@ -123,46 +131,44 @@ \exp_last_unbraced:NNNNo \cs_new:Npn \__ctex_default_ccwd_aux:w #1 { \tl_to_str:n { pt } } #2 \q_stop { \tl_if_empty:nT {#2} { \ccwd } } -\tl_new:N \l__ctex_encoding_tl -\tl_set:Nx \l__ctex_encoding_tl - { \sys_if_engine_pdftex:TF { GBK } { UTF8 } } +\tl_new:N \g__ctex_encoding_tl \bool_new:N \g__ctex_zhmCJK_bool \tl_new:N \l__ctex_autoindent_tl \cs_new_eq:NN \ctex_if_autoindent_touched:F \use:n \cs_new_eq:NN \ctex_zhmap_case:nnn \use_ii:nnn -\cs_new_protected_nopar:Npn \ctex_at_end:n { \AtEndOfClass } +\cs_new_protected:Npn \ctex_at_end:n { \AtEndOfClass } \clist_new:N \g__ctex_std_options_clist \msg_new:nnn { ctex } { invalid-option } { Option~`\l_keys_key_tl'~is~invalid~in~current~mode. } \msg_new:nnn { ctex } { invalid-value } { Value~`#1'~is~invalid~for~the~key~`\l_keys_key_tl'. } +\cs_new_protected:Npn \ctex_deprecated_option:n + { \msg_warning:nnn { ctex } { deprecated-option } } +\cs_new_protected:Npn \ctex_set_deprecated_option:n #1 + { + \ctex_deprecated_option:n { Option~`#1'~is~set. } + \ctex_set:nn { option } {#1} + } +\cs_new_protected:Npn \ctex_deprecated_command:Nn #1#2 + { + \msg_warning:nnxx { ctex } { deprecated-command } + { \token_to_str:N #1 } { \exp_not:n {#2} } + } \msg_new:nnn { ctex } { deprecated-option } - { Option~ `\l_keys_key_tl'~ is~ deprecated.\\ #1 } + { Option~`\l_keys_key_tl'~is~deprecated.\\ #1 } \msg_new:nnn { ctex } { deprecated-command } - { Command~ #1 is~ deprecated.\\ #2 } -\msg_new:nnn { ctex } { deprecated-environment } - { Environment~ `#1'~ is~ deprecated.\\ #2 } + { Command~`#1'~is~deprecated.\\ #2 } \int_new:N \g__ctex_font_size_int -\int_set:Nn \g__ctex_font_size_int { -1 } -\keys_define:nn { ctex / option } +\int_gset:Nn \g__ctex_font_size_int { -1 } +\ctex_define_option:n { zihao .choice: , zihao .value_required:n = true , zihao / 5 .code:n = { \int_gset:Nn \g__ctex_font_size_int { 0 } } , zihao / -4 .code:n = { \int_gset:Nn \g__ctex_font_size_int { 1 } } , zihao / false .code:n = { \int_gset:Nn \g__ctex_font_size_int { 2 } } , - c5size .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { Option~ `zihao=5'~ is~ set. } - \keys_set:nn { ctex / option } { zihao = 5 } - } , - cs4size .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { Option~ `zihao=-4'~ is~ set. } - \keys_set:nn { ctex / option } { zihao = -4 } - } , + c5size .code:n = { \ctex_set_deprecated_option:n { zihao = 5 } } , + cs4size .code:n = { \ctex_set_deprecated_option:n { zihao = -4 } } , c5size .value_forbidden:n = true , cs4size .value_forbidden:n = true , linespread .fp_set:N = \l__ctex_line_spread_fp , @@ -187,56 +193,38 @@ } , indent .code:n = { - \msg_warning:nnn { ctex } { deprecated-option } + \ctex_deprecated_option:n { - The~ functionality~ has~ been~ removed.\\ - It's~ better~ to~ set~ the~ heading~ styles~ via~ `afterindent'~ - options.~ + The~functionality~has~been~removed.\\ + It's~better~to~set~the~heading~styles~via~`afterindent'~option. } } , indent .value_forbidden:n = true , noindent .code:n = { - \msg_warning:nnn { ctex } { deprecated-option } + \ctex_deprecated_option:n { - The~ functionality~ has~ been~ removed.\\ - It's~ better~ to~ set~ the~ heading~ styles~ via~ `afterindent'~ - options. + The~functionality~has~been~removed.\\ + It's~better~to~set~the~heading~styles~via~`afterindent'~option. } } , noindent .value_forbidden:n = true , - GBK .code:n = { \tl_set:Nn \l__ctex_encoding_tl { GBK } } , - UTF8 .code:n = { \tl_set:Nn \l__ctex_encoding_tl { UTF8 } } , - GBK .value_forbidden:n = true , - UTF8 .value_forbidden:n = true , - fontset .tl_gset:N = \g__ctex_fontset_tl , - nofonts .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { - Option~ `fontset=none'~ is~ set.~ It~ is~ better~ to~ use~ - fontset~ option. - } - \keys_set:nn { ctex / option } { fontset = none } - } , - adobefonts .code:n = + GBK .code:n = { - \msg_warning:nnn { ctex } { deprecated-option } + \sys_if_engine_pdftex:TF + { \tl_gset:Nn \g__ctex_encoding_tl { GBK } } { - Option~ `fontset=adobe'~ is~ set.~ It~ is~ better~ to~ use~ - fontset~ option. + \msg_warning:nn { ctex } { invalid-option } + \tl_gset:Nn \g__ctex_encoding_tl { UTF8 } } - \keys_set:nn { ctex / option } { fontset = adobe } - } , - winfonts .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { - Option~ `fontset=windows'~ is~ set.~ It~ is~ better~ to~ use~ - fontset~ option. - } - \keys_set:nn { ctex / option } { fontset = windows } } , + UTF8 .code:n = { \tl_gset:Nn \g__ctex_encoding_tl { UTF8 } } , + GBK .value_forbidden:n = true , + UTF8 .value_forbidden:n = true , + fontset .tl_gset:N = \g__ctex_fontset_tl , + nofonts .code:n = { \ctex_set_deprecated_option:n { fontset = none } } , + adobefonts .code:n = { \ctex_set_deprecated_option:n { fontset = adobe } } , + winfonts .code:n = { \ctex_set_deprecated_option:n { fontset = windows } } , nofonts .value_forbidden:n = true , winfonts .value_forbidden:n = true , adobefonts .value_forbidden:n = true , @@ -258,35 +246,21 @@ \cs_gset_eq:NN \ctex_zhmap_case:nnn \use_iii:nnn } , nozhmap .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { Option~ `zhmap=false'~ is~ set. } - \keys_set:nn { ctex / option } { zhmap = false } - } , + { \ctex_set_deprecated_option:n { zhmap = false } } , nozhmap .value_forbidden:n = true , punct .tl_set:N = \l__ctex_punct_tl , punct .default:n = { quanjiao } , punct .initial:n = { quanjiao } , - nopunct .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { Option~ `punct=plain'~ is~ set. } - \keys_set:nn { ctex / option } { punct = plain } - } , + nopunct .code:n = \ctex_set_deprecated_option:n { punct = plain } , nopunct .value_forbidden:n = true , space .choices:nn = { true , auto , false } { \exp_args:Nx \ctex_at_end:n - { \keys_set:nn { ctex } { space = \l_keys_choice_tl } } + { \ctex_set:n { space = \l_keys_choice_tl } } } , space .default:n = { true } , - nospace .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { Option~ `space=false'~ is~ set. } - \keys_set:nn { ctex / option } { space = false } - } , + nospace .code:n = { \ctex_deprecated_option:nn { space = false } } , nospace .value_forbidden:n = true , heading .bool_set:N = \l__ctex_heading_bool , sub3section .code:n = @@ -298,35 +272,37 @@ scheme .tl_set:N = \l__ctex_scheme_tl , scheme .default:n = { chinese } , scheme .initial:n = { chinese } , - cap .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { Option~ `scheme = chinese' ~ is~ set. } - \keys_set:nn { ctex / option } { scheme = chinese } - } , - nocap .code:n = - { - \msg_warning:nnn { ctex } { deprecated-option } - { Option~ `scheme = plain' ~ is~ set. } - \keys_set:nn { ctex / option } { scheme = plain } - } , + cap .code:n = { \ctex_set_deprecated_option:n { scheme = chinese } } , + nocap .code:n = { \ctex_set_deprecated_option:n { scheme = plain } } , cap .value_forbidden:n = true , nocap .value_forbidden:n = true , - fntef .code:n = + fntef .code:n = { - \msg_warning:nnn { ctex } { deprecated-option } - { `(xe)CJKfntef'~ package~ is~ always~ loaded. } + \sys_if_engine_xetex:TF + { + \ctex_deprecated_option:n { `xeCJKfntef'~package~is~loaded. } + \ctex_at_end:n { \RequirePackage { xeCJKfntef } } + } + { + \sys_if_engine_pdftex:TF + { + \ctex_deprecated_option:n { `CJKfntef'~package~is~loaded. } + \ctex_at_end:n { \RequirePackage { CJKfntef } } + } + { + \ctex_deprecated_option:n + { Furthermore,~option~`fntef'~is~invalid~in~current~mode. } + } + } } , fancyhdr .code:n = { - \msg_warning:nnn { ctex } { deprecated-option } - { `fancyhdr'~ package~ is~ loaded. } - \RequirePackage { fancyhdr } + \ctex_deprecated_option:n { `fancyhdr'~package~is~loaded. } + \ctex_at_end:n { \RequirePackage { fancyhdr } } } , hyperref .code:n = { - \msg_warning:nnn { ctex } { deprecated-option } - { `hyperref'~ package~ will~ be~ loaded. } + \ctex_deprecated_option:n { `hyperref'~package~will~be~loaded. } \ctex_at_end:n { \cs_if_exist:NF \hypersetup @@ -352,47 +328,63 @@ #1 .value_forbidden:n = true , } } -\use:x { \keys_define:nn { ctex / option } { \exp_not:o { \l__ctex_tmp_tl } } } +\exp_args:No \ctex_define_option:n { \l__ctex_tmp_tl } \tl_clear:N \l__ctex_tmp_tl -\keys_define:nn { ctex / option } +\ctex_define_option:n { unknown .code:n = { \clist_gput_right:No \g__ctex_std_options_clist { \CurrentOption } } } \ctex_file_input:n { ctexopts.cfg } \ProcessKeysOptions { ctex / option } -\if_case:w \g__ctex_font_size_int - \clist_gput_right:Nn \g__ctex_std_options_clist { 10pt } -\or: - \clist_gput_right:Nn \g__ctex_std_options_clist { 12pt } -\fi: +\msg_new:nnn { ctex } { pdftex-utf8 } + { UTF8~will~be~used~as~the~default~encoding. } +\tl_if_empty:NT \g__ctex_encoding_tl + { + \sys_if_engine_pdftex:T + { \msg_warning:nn { ctex } { pdftex-utf8 } } + \tl_gset:Nn \g__ctex_encoding_tl { UTF8 } + } +\int_case:nn { \g__ctex_font_size_int } + { + { 0 } { \clist_gput_right:Nn \g__ctex_std_options_clist { 10pt } } + { 1 } { \clist_gput_right:Nn \g__ctex_std_options_clist { 12pt } } + } \tl_const:Nn \c__ctex_class_tl { book } \PassOptionsToClass { \g__ctex_std_options_clist } { book } \LoadClass { book } \@ifpackageloaded { hyperref } { - \cs_new_protected_nopar:Npn \ctex_hypersetup:n #1 + \cs_new_protected:Npn \ctex_hypersetup:n #1 { \hypersetup {#1} } } { - \cs_new_protected_nopar:Npn \ctex_hypersetup:n #1 + \cs_new_protected:Npn \ctex_hypersetup:n #1 { \PassOptionsToPackage {#1} { hyperref } } } \ctex_file_input:n { \c__ctex_engine_file_str } -\NewDocumentCommand \ctexset { } { \keys_set:nn { ctex } } -\NewDocumentCommand \CTEXsetup { +o > { \TrimSpaces } m } +\NewDocumentCommand \ctexset { } { \ctex_set:n } +\NewDocumentCommand \CTEXsetup { +O { } > { \TrimSpaces } m } { - \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXsetup } - { \ctexset~ {~ #2~ =~ {~ #1~ }~ }~ is~ set. } - \IfNoValueF {#1} { \keys_set:nn { ctex / #2 } {#1} } + \tl_if_blank:nTF {#1} + { \ctex_deprecated_command:Nn \CTEXsetup { } } + { + \ctex_deprecated_command:Nn \CTEXsetup + { \ctexset {~#2~=~{~#1~}~}~is~set. } + \ctex_set:nn {#2} {#1} + } } -\NewDocumentCommand \CTEXoptions { +o } +\NewDocumentCommand \CTEXoptions { +O { } } { - \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXoptions } - { \ctexset~ {~ #1~ }~ is~ set. } - \IfNoValueF {#1} { \keys_set:nn { ctex } {#1} } + \tl_if_blank:nTF {#1} + { \ctex_deprecated_command:Nn \CTEXoptions { } } + { + \ctex_deprecated_command:Nn \CTEXoptions + { \ctexset {~#1~}~is~set. } + \ctex_set:n {#1} + } } -\keys_define:nn { ctex } +\ctex_define:n { autoindent .choice: , autoindent .default:n = { true } , @@ -410,9 +402,9 @@ } } \NewDocumentCommand \CTEXsetfont { } { \ctex_select_size: } -\cs_new_protected_nopar:Npn \ctex_select_size: +\cs_new_protected:Npn \ctex_select_size: { \cs_if_free:NTF \size@update { \ctex_update_size: } { \selectfont } } -\cs_new_protected_nopar:Npn \ctex_update_size: +\cs_new_protected:Npn \ctex_update_size: { \tl_if_eq:NNTF \l__ctex_ziju_tl \c__ctex_zero_tl { @@ -426,7 +418,7 @@ \tl_set_eq:NN \l__ctex_ziju_tl \c__ctex_zero_tl \ctex_add_to_selectfont:n { \cs_if_free:NF \size@update { \ctex_update_size: } } -\keys_define:nn { ctex } +\ctex_define:n { linestretch .code:n = { @@ -437,7 +429,7 @@ } \tl_new:N \l__ctex_line_stretch_tl \tl_set:Nn \l__ctex_line_stretch_tl { \ccwd } -\cs_new_protected_nopar:Npn \ctex_update_stretch: +\cs_new_protected:Npn \ctex_update_stretch: { \ctex_update_em_unit: \dim_set:Nn \l__ctex_tmp_dim { \l__ctex_line_stretch_tl } @@ -472,7 +464,7 @@ \ctex_update_ccglue: } } -\cs_new_protected_nopar:Npn \ctex_update_parindent: +\cs_new_protected:Npn \ctex_update_parindent: { \tl_if_empty:NF \l__ctex_autoindent_tl { @@ -482,12 +474,12 @@ } \NewDocumentCommand \ziju { m } { \exp_args:Nx \ctex_ziju:n {#1} \tex_ignorespaces:D } -\cs_new_protected_nopar:Npn \ctex_ziju:n #1 +\cs_new_protected:Npn \ctex_ziju:n #1 { \tl_set:Nx \l__ctex_ziju_tl { \fp_eval:n {#1} } \ctex_select_size: } -\cs_new_protected_nopar:Npn \ctex_update_ziju: +\cs_new_protected:Npn \ctex_update_ziju: { \ctex_update_em_unit: \dim_set:Nn \l__ctex_ziju_dim { \l__ctex_ziju_tl \ccwd } @@ -519,19 +511,20 @@ \dim_new:N \l__ctex_ziju_dim \NewDocumentCommand \CTEXindent { } { - \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXindent } - { \parindent is~ set~ to~ 2\ccwd. } - \ctex_update_ccwd: \dim_set:Nn \parindent { 2 \ccwd } + \ctex_deprecated_command:Nn \CTEXindent + { \parindent is~set~to~2\ccwd. } + \ctex_update_ccwd: + \dim_set:Nn \parindent { 2 \ccwd } } \NewDocumentCommand \CTEXnoindent { } { - \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXnoindent } - { \parindent is~ set~ to~ 0pt. } + \ctex_deprecated_command:Nn \CTEXnoindent + { \parindent is~set~to~0pt. } \dim_zero:N \parindent } -\PassOptionsToPackage { encoding = \l__ctex_encoding_tl } { zhnumber } +\PassOptionsToPackage { encoding = \g__ctex_encoding_tl } { zhnumber } \RequirePackage { zhnumber } -\cs_new_nopar:Npn \chinese { \zhnum_counter:n } +\cs_new:Npn \chinese { \zhnum_counter:n } \cs_new_eq:NN \@chinese \@zhnum \cs_new_eq:NN \Chinese \chinese \cs_new_eq:NN \CTEXcounter \use_none:n @@ -549,7 +542,7 @@ \NewDocumentCommand \CTEXdigits { m m } { \protected@edef #1 { \zhdigits {#2} } } \cs_set_eq:NN \CTEX@todayold \today -\keys_define:nn { ctex } +\ctex_define:n { today .choice: , today / old .code:n = @@ -575,7 +568,7 @@ \tl_new:N \proofname \tl_set:Nn \proofname { Proof } } -\keys_define:nn { ctex } +\ctex_define:n { contentsname .tl_set:N = \contentsname , listfigurename .tl_set:N = \listfigurename , @@ -594,7 +587,7 @@ \seq_gset_eq:NN \c__ctex_headings_seq \c__ctex_section_headings_seq \seq_gput_left:Nn \c__ctex_headings_seq { chapter } \seq_gput_left:Nn \c__ctex_headings_seq { part } -\cs_new_protected_nopar:Npn \__ctex_initial_heading:n #1 +\cs_new_protected:Npn \__ctex_initial_heading:n #1 { \tl_new:c { CTEX@pre#1 } \tl_new:c { CTEX@post#1 } @@ -624,7 +617,7 @@ \group_end: } } -\cs_new_protected_nopar:Npn \__ctex_def_heading_keys:n #1 +\cs_new_protected:Npn \__ctex_def_heading_keys:n #1 { \tl_put_right:Nx \l__ctex_tmp_tl { @@ -648,11 +641,8 @@ #1 / hang .bool_set:N = \exp_not:c { CTEX@#1@hang } , #1 / hang .initial:n = true , #1 / runin .bool_set:N = \exp_not:c { CTEX@#1@runin } , - #1 / tocline .code:n = - { - \cs_set:Npn \exp_not:c { CTEX@#1@tocline} - \exp_not:n { ####1####2 } { ####1 } - } , + #1 / tocline .cs_set:Np = \exp_not:c { CTEX@#1@tocline} + \exp_not:n { ##1##2 } , \__ctex_plus_key_aux:nn {#1} { break } , \__ctex_plus_key_aux:nn {#1} { format } , \__ctex_plus_key_aux:nn {#1} { nameformat } , @@ -662,7 +652,7 @@ \__ctex_plus_key_aux:nn {#1} { aftertitle } , } } -\cs_new_nopar:Npn \__ctex_plus_key_aux:nn #1#2 +\cs_new:Npn \__ctex_plus_key_aux:nn #1#2 { #1 / #2 .tl_set:N = \exp_not:c { CTEX@#1@#2 } , #1 / #2 + .code:n = @@ -676,7 +666,7 @@ \cs_new_protected:Npn \__ctex_assign_heading_name:nnn #1#2#3 { \tl_set:cn { CTEX@pre#1 } {#2} - \IfNoValueTF {#3} + \tl_if_novalue:nTF {#3} { \tl_clear:c { CTEX@post#1 } } { \tl_set:cn { CTEX@post#1 } {#3} } } @@ -697,35 +687,49 @@ \__ctex_initial_heading:n {#1} \__ctex_def_heading_keys:n {#1} } -\use:x +\exp_args:NNo \group_end: \ctex_define:n { \l__ctex_tmp_tl } +\cs_new_protected:Npn \CTEX@heading@format@initial { - \group_end: - \keys_define:nn { ctex } { \exp_not:o { \l__ctex_tmp_tl } } + \normalfont + \tl_clear:N \l__ctex_autoindent_tl + \int_set:Nn \tex_interlinepenalty:D { 10 000 } + \tex_noindent:D } -\cs_new_protected_nopar:Npn \CTEX@fixtopskip +\cs_new_protected:Npn \ctex_indent_box:n #1 + { + \dim_set:Nn \tex_parindent:D {#1} + \__ctex_insert_indent: + } +\cs_new_protected:Npn \__ctex_insert_indent: + { + \dim_compare:nNnF \tex_parindent:D = \c_zero_dim + { \tex_indent:D } + } +\cs_new_eq:NN \CTEX@indentbox \ctex_indent_box:n +\cs_new_protected:Npn \CTEX@fixtopskip { \CTEX@fixheadingskip \dim_compare:nNnF \tex_pagegoal:D < \c_max_dim { \skip_sub:Nn \l__ctex_heading_skip { \tex_topskip:D } } } -\cs_new_protected_nopar:Npn \CTEX@fixheadingskip +\cs_new_protected:Npn \CTEX@fixheadingskip { \par \dim_set:Nn \tex_prevdepth:D { -1000pt } \skip_sub:Nn \l__ctex_heading_skip { \tex_parskip:D } } \skip_new:N \l__ctex_heading_skip -\cs_new_protected_nopar:Npn \CTEX@setheadingskip +\cs_new_protected:Npn \CTEX@setheadingskip { \skip_set:Nn \l__ctex_heading_skip } \cs_new_eq:NN \CTEX@headingskip \l__ctex_heading_skip \ProvideDocumentCommand \partmark { m } { \markboth { } { } } \cs_new_eq:NN \CTEXifname \use_ii:nn -\cs_new_protected_nopar:Npn \CTEX@ifnametrue +\cs_new_protected:Npn \CTEX@ifnametrue { \cs_set_eq:NN \CTEXifname \use_i:nn } -\cs_new_protected_nopar:Npn \CTEX@ifnamefalse +\cs_new_protected:Npn \CTEX@ifnamefalse { \cs_set_eq:NN \CTEXifname \use_ii:nn } -\cs_new_protected_nopar:Npn \CTEX@addloflotskip #1 +\cs_new_protected:Npn \CTEX@addloflotskip #1 { \skip_set:Nn \l__ctex_heading_skip { \use:c { CTEX@#1@lofskip } } \skip_if_eq:nnF { \l__ctex_heading_skip } { \c_zero_skip } @@ -742,8 +746,6 @@ } \cs_new_protected:Npn \CTEX@addtocline #1#2 { \addcontentsline { toc } {#1} { \use:c { CTEX@#1@tocline } {#1} {#2} } } -\cs_new_protected_nopar:Npn \CTEX@disableautoindent - { \tl_clear:N \l__ctex_autoindent_tl } \renewcommand\part{% \CTEX@part@break \thispagestyle{\CTEX@part@pagestyle}% @@ -772,51 +774,53 @@ \fi \CTEX@gettitle{#1}% \CTEX@addtocline{part}{#1}% - \partmark{#1}% - {\interlinepenalty \@M - \CTEX@disableautoindent - \normalfont \CTEX@part@format - \CTEX@hangindent{part}% - {\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}% - \CTEX@part@titleformat{#2}% - \CTEX@part@aftertitle}% + \partmark{#1}% + \begingroup + \CTEX@heading@format@initial + \CTEX@part@format{% + \CTEX@headinghang{part}% + {\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}% + \CTEX@part@titleformat{#2}% + \CTEX@part@aftertitle}\par + \endgroup \@endpart} \def\@spart#1{% - \CTEX@ifnamefalse - \CTEX@makeanchor@spart{part*}% - \CTEX@gettitle{#1}% - {\interlinepenalty \@M - \CTEX@disableautoindent - \normalfont \CTEX@part@format - \CTEX@hangindent{part}{}% - \CTEX@part@titleformat{#1}% - \CTEX@part@aftertitle}% - \@endpart} + \CTEX@ifnamefalse + \CTEX@makeanchor@spart{part*}% + \CTEX@gettitle{#1}% + \begingroup + \CTEX@heading@format@initial + \CTEX@part@format{% + \CTEX@headinghang{part}{}% + \CTEX@part@titleformat{#1}% + \CTEX@part@aftertitle}\par + \endgroup + \@endpart} \def\@endpart{% - \CTEX@setheadingskip \CTEX@part@afterskip - \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi - \vskip \CTEX@headingskip - \newpage - \if@twoside - \if@openright - \null - \thispagestyle{empty}% - \newpage - \fi - \fi - \if@tempswa - \twocolumn - \fi} + \CTEX@setheadingskip \CTEX@part@afterskip + \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi + \vskip \CTEX@headingskip + \newpage + \if@twoside + \if@openright + \null + \thispagestyle{empty}% + \newpage + \fi + \fi + \if@tempswa + \twocolumn + \fi} \renewcommand\chapter{% - \CTEX@chapter@break - \thispagestyle{\CTEX@chapter@pagestyle}% - \global\@topnum\z@ - \ifodd \CTEX@chapter@afterindent - \@afterindenttrue - \else - \@afterindentfalse - \fi - \secdef\@chapter\@schapter} + \CTEX@chapter@break + \thispagestyle{\CTEX@chapter@pagestyle}% + \global\@topnum\z@ + \ifodd \CTEX@chapter@afterindent + \@afterindenttrue + \else + \@afterindentfalse + \fi + \secdef\@chapter\@schapter} \def\@chapter[#1]#2{% \ifnum \c@secnumdepth >\m@ne \if@mainmatter @@ -860,33 +864,33 @@ \CTEX@setheadingskip \CTEX@chapter@beforeskip \ifodd \CTEX@chapter@fixskip \CTEX@fixtopskip \fi \vspace*{\CTEX@headingskip}% - {\CTEX@disableautoindent - \normalfont \CTEX@chapter@format - \interlinepenalty\@M - \CTEX@hangindent{chapter}% - {\CTEXifname{\CTEX@chaptername\CTEX@chapter@aftername}{}}% - \CTEX@chapter@titleformat{#1}% - \CTEX@chapter@aftertitle - \nobreak - \CTEX@setheadingskip \CTEX@chapter@afterskip - \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi - \vskip \CTEX@headingskip - }} + \begingroup + \CTEX@heading@format@initial + \CTEX@chapter@format{% + \CTEX@headinghang{chapter}% + {\CTEXifname{\CTEX@chaptername\CTEX@chapter@aftername}{}}% + \CTEX@chapter@titleformat{#1}% + \CTEX@chapter@aftertitle}\par + \endgroup + \nobreak + \CTEX@setheadingskip \CTEX@chapter@afterskip + \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi + \vskip \CTEX@headingskip} \def\@makeschapterhead#1{% \CTEX@setheadingskip \CTEX@chapter@beforeskip \ifodd \CTEX@chapter@fixskip \CTEX@fixtopskip \fi \vspace*{\CTEX@headingskip}% - {\CTEX@disableautoindent - \normalfont \CTEX@chapter@format - \interlinepenalty\@M - \CTEX@hangindent{chapter}{}% - \CTEX@chapter@titleformat{#1}% - \CTEX@chapter@aftertitle - \nobreak - \CTEX@setheadingskip \CTEX@chapter@afterskip - \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi - \vskip \CTEX@headingskip - }} + \begingroup + \CTEX@heading@format@initial + \CTEX@chapter@format{% + \CTEX@headinghang{chapter}{}% + \CTEX@chapter@titleformat{#1}% + \CTEX@chapter@aftertitle}\par + \endgroup + \nobreak + \CTEX@setheadingskip \CTEX@chapter@afterskip + \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi + \vskip \CTEX@headingskip} \def\@startsection#1#2#3#4#5#6{% \if@noskipsec \leavevmode \fi \par @@ -929,22 +933,22 @@ \CTEX@gettitle{#7}% \unless \ifodd \CTEX@runin \begingroup + \CTEX@heading@format@initial #6{% - \CTEX@hangfrom{\hskip\glueexpr #3\relax\@svsec}% - \interlinepenalty \@M + \CTEX@sectionhang{#3}{\@svsec}% \csname CTEX@#1@titleformat\endcsname{#8}% - \csname CTEX@#1@aftertitle\endcsname}% + \csname CTEX@#1@aftertitle\endcsname}\par \endgroup \csname #1mark\endcsname{#7}% \CTEX@addtocline{#1}{#7}% \else \def\@svsechd{% - #6{\hskip\glueexpr #3\relax - \@svsec - \csname CTEX@#1@titleformat\endcsname{#8}% - \csname CTEX@#1@aftertitle\endcsname}% - \csname #1mark\endcsname{#7}% - \CTEX@addtocline{#1}{#7}}% + #6{% + {\CTEX@indentbox{#3}}\@svsec + \csname CTEX@#1@titleformat\endcsname{#8}% + \csname CTEX@#1@aftertitle\endcsname}% + \csname #1mark\endcsname{#7}% + \CTEX@addtocline{#1}{#7}}% \fi \@xsect{#5}} \def\@ssect#1#2#3#4#5{% @@ -952,15 +956,15 @@ \CTEX@gettitle{#5}% \unless \ifodd \CTEX@runin \begingroup + \CTEX@heading@format@initial #4{% - \CTEX@hangfrom{\hskip\glueexpr #1\relax}% - \interlinepenalty \@M + \CTEX@sectionhang{#1}{}% \CTEX@titleformat@n{#5}% - \CTEX@aftertitle}% + \CTEX@aftertitle}\par \endgroup \else - \def\@svsechd{#4{\hskip\glueexpr #1\relax - \CTEX@titleformat@n{#5}\CTEX@aftertitle}}% + \def\@svsechd{#4{{\CTEX@indentbox{#1}}% + \CTEX@titleformat@n{#5}\CTEX@aftertitle}}% \fi \@xsect{#3}} \def\@xsect#1{% @@ -980,32 +984,47 @@ \clubpenalty\@M \begingroup \@svsechd \endgroup \unskip - \hskip\glueexpr #1\relax + \CTEX@heading@glue{#1}% \else \clubpenalty \@clubpenalty \everypar{}% \fi}% \fi \ignorespaces} -\cs_new_protected:Npn \CTEX@hangindent #1#2 +\cs_new_protected:Npn \CTEX@headinghang #1 { - \dim_set:Nn \parindent { \use:c { CTEX@#1@indent } } - \bool_if:cTF { CTEX@#1@hang } - { \@hangfrom { \__ctex_indent_aux: #2 } } - {#2} + \ctex_heading_hang:cnn + { CTEX@#1@hang } + { \use:c { CTEX@#1@indent } } } -\cs_new_protected_nopar:Npn \__ctex_indent_aux: +\cs_new_protected:Npn \CTEX@sectionhang + { \ctex_heading_hang:Nnn \CTEX@hang } +\cs_new_protected:Npn \ctex_heading_hang:Nnn #1#2#3 { - \dim_compare:nNnF \parindent = \c_zero_dim - { \skip_horizontal:n { \parindent } } + \dim_set:Nn \tex_parindent:D {#2} + \bool_if:NTF #1 + { \ctex_hang_from:n } + { \use:n } + { \__ctex_insert_indent: #3 } } -\cs_new_protected_nopar:Npn \CTEX@hangfrom +\cs_new_protected:Npn \ctex_hang_from:n #1 { - \bool_if:NTF \CTEX@hang - { \@hangfrom } - { \noindent \use:n } + \tex_noindent:D + \hbox_set:Nn \l__ctex_tmp_box {#1} + \tex_hangindent:D = \box_wd:N \l__ctex_tmp_box + \box_use_drop:N \l__ctex_tmp_box + } +\cs_generate_variant:Nn \ctex_heading_hang:Nnn { c } +\cs_new_protected:Npn \ctex_heading_glue:n #1 + { + \group_begin: + \skip_set:Nn \l__ctex_heading_skip {#1} + \dim_compare:nNnF \l__ctex_heading_skip = \c_zero_dim + { \skip_horizontal:N \l__ctex_heading_skip } + \group_end: } -\cs_new_protected_nopar:Npn \CTEX@update@sectionformat@n #1 +\cs_new_eq:NN \CTEX@heading@glue \ctex_heading_glue:n +\cs_new_protected:Npn \CTEX@update@sectionformat@n #1 { \cs_set_eq:Nc \CTEX@titleformat@n { CTEX@#1@titleformat } \cs_set_eq:Nc \CTEX@aftertitle { CTEX@#1@aftertitle } @@ -1034,7 +1053,7 @@ { } #2 } -\cs_new_nopar:Npn \CTEXnumberline #1 +\cs_new:Npn \CTEXnumberline #1 { \CTEXifname { \protect \numberline { \use:c { CTEXthe #1 } } } @@ -1044,7 +1063,7 @@ \seq_map_inline:Nn \c__ctex_section_headings_seq { \int_incr:N \l__ctex_tmp_int - \cs_gset_protected_nopar:cpx {#1} + \cs_gset_protected:cpx {#1} { \exp_not:N \@startsection {#1} { \int_use:N \l__ctex_tmp_int } @@ -1056,7 +1075,7 @@ \cs_new:cpn { CTEX@#1@tocline } ##1##2 { \CTEXnumberline { ##1 } ##2 } } -\keys_define:nn { ctex } +\ctex_define:n { appendix .meta:nn = { ctex / appendix } {#1} , appendix / name .code:n = @@ -1068,7 +1087,7 @@ \tl_new:N \CTEX@preappendix \tl_new:N \CTEX@postappendix \cs_new_eq:NN \CTEX@save@appendix \appendix -\cs_gset_protected_nopar:Npn \appendix +\cs_gset_protected:Npn \appendix { \CTEX@save@appendix \gdef \CTEX@prechapter { \CTEX@preappendix } @@ -1076,7 +1095,7 @@ \gdef \CTEX@postchapter { \CTEX@postappendix } \gdef \CTEX@chapter@numbering { \CTEX@appendix@numbering } } -\cs_new_protected_nopar:Npn \CTEX@makeanchor #1 +\cs_new_protected:Npn \CTEX@makeanchor #1 { } \seq_const_from_clist:Nn \c__ctex_headings_cs_seq { part , spart , chapter , schapter , sect , ssect } @@ -1085,7 +1104,7 @@ \cs_new_eq:cc { CTEX@ #1 } { @ #1 } \cs_new_eq:cN { CTEX@makeanchor@ #1 } \CTEX@makeanchor } -\cs_new_protected_nopar:Npn \CTEX@hyperheadinghook +\cs_new_protected:Npn \CTEX@hyperheadinghook { \group_begin: \ifHy@implicit @@ -1106,7 +1125,7 @@ } \ctex_at_end_package:nn { hyperref } { - \cs_gset_protected_nopar:Npn \CTEX@makeanchor #1 + \cs_gset_protected:Npn \CTEX@makeanchor #1 { \Hy@MakeCurrentHrefAuto {#1} \Hy@raisedlink @@ -1121,14 +1140,14 @@ { } \ctex_at_end_package:nn { nameref } { - \cs_gset_protected_nopar:Npn \CTEX@gettitle { \NR@gettitle } + \cs_gset_protected:Npn \CTEX@gettitle { \NR@gettitle } \seq_map_inline:Nn \c__ctex_headings_cs_seq { \cs_if_eq:ccT { NR@ #1 } { CTEX@ #1 } { \cs_gset_eq:cc { @ #1 } { CTEX@ #1 } } } } -\cs_new_protected_nopar:Npn \ctex_titlesec_hook: +\cs_new_protected:Npn \ctex_titlesec_hook: { \@ifpackagewith { titlesec } { explicit } { @@ -1148,17 +1167,17 @@ } \seq_map_function:NN \c__ctex_section_headings_seq \__ctex_titlesec_hook:n } -\cs_new_protected_nopar:Npn \__ctex_titlesec_hook:n #1 +\cs_new_protected:Npn \__ctex_titlesec_hook:n #1 { \__ctex_titlesec_format:n {#1} \exp_args:Nc \__ctex_titlesec_spacing:Nn { ttls@#1 } {#1} } -\cs_new_protected_nopar:Npn \__ctex_titlesec_format:n #1 +\cs_new_protected:Npn \__ctex_titlesec_format:n #1 { \cs_if_free:cF { ttlf@#1 } { \exp_args:Nc \__ctex_titlesec_format:Nn { ttlf@#1 } {#1} } } -\cs_new_protected_nopar:Npn \__ctex_titlesec_format:Nn #1#2 +\cs_new_protected:Npn \__ctex_titlesec_format:Nn #1#2 { \tl_set:Nx #1 { @@ -1168,7 +1187,7 @@ \tl_tail:N #1 } } -\cs_new_protected_nopar:Npn \__ctex_titlesec_format_explicit:Nn #1#2 +\cs_new_protected:Npn \__ctex_titlesec_format_explicit:Nn #1#2 { \cs_set_nopar:Npx #1 ##1 { @@ -1178,7 +1197,7 @@ \exp_args:No \tl_tail:n { #1 { } } } } -\cs_new_protected_nopar:Npn \__ctex_titlesec_spacing:Nn #1#2 +\cs_new_protected:Npn \__ctex_titlesec_spacing:Nn #1#2 { \tl_set:Nx #1 { \exp_after:wN \__ctex_titlesec_spacing:nnnnnn #1 {#2} } } \cs_new:Npn \__ctex_titlesec_spacing:nnnnnn #1#2#3#4#5#6 { @@ -1200,14 +1219,14 @@ \tl_set:Nn \ttl@chapterout { \typeout { \CTEXthechapter } } \cs_if_free:NF \ttl@tocpart { - \cs_set_protected_nopar:Npn \ttl@tocpart + \cs_set_protected:Npn \ttl@tocpart { \tl_set:Nn \ttl@a { \CTEXthepart \hspace { 1em } } } } \seq_map_inline:Nn \c__ctex_headings_seq { \cs_if_exist:cF { ttl@toc #1 } { - \cs_new_protected_nopar:cpx { ttl@toc #1 } + \cs_new_protected:cpx { ttl@toc #1 } { \tl_set:Nn \exp_not:N \ttl@a { @@ -1220,7 +1239,7 @@ } \group_begin: \char_set_catcode_other:N \# -\cs_new_protected_nopar:Npn \ctex_titleps_hook: +\cs_new_protected:Npn \ctex_titleps_hook: { \ctex_patch_cmd:Nnn \ttl@settopmark { \protect \@namedef { the#1 } { \@nameuse { the#1 } } } @@ -1242,12 +1261,12 @@ } } \group_end: -\cs_new_nopar:Npn \CTEX@titlepslabel@set #1 +\cs_new:Npn \CTEX@titlepslabel@set #1 { \cs_if_free:cF { CTEXthe#1 } { \protect \@namedef { CTEXthe#1 } { \@nameuse { CTEXthe#1 } } } } -\cs_new_nopar:Npn \CTEX@titlepslabel@clear #1 +\cs_new:Npn \CTEX@titlepslabel@clear #1 { \cs_if_free:cF { CTEXthe#1 } { \protect \@namedef { CTEXthe#1 } { } } @@ -1257,9 +1276,9 @@ \ctex_at_end_package:nn { titleps } { \ctex_titleps_hook: } \ctex_at_end_package:nn { titleps } { - \cs_set_protected_nopar:Npn \ttl@setifthe #1 + \cs_set_protected:Npn \ttl@setifthe #1 { - \exp_args:Nco \cs_set_nopar:Npn { ifthe #1 } + \exp_args:Nco \cs_set:Npn { ifthe #1 } { \CTEXifname { \protect \@firstoftwo } @@ -1286,19 +1305,24 @@ { \CTEX@toc@width@n {#1} } { } { \ctex_patch_failure:N \numberline } - \@ifpackageloaded { tocloft } - { } + \cs_new_protected:Npn \__ctex_patch_toc_width:n \c_parameter_token 1 { - \ctex_at_end_package:nn { tocloft } + \@ifpackageloaded { \c_parameter_token 1 } + { } { - \ctex_preto_cmd:NnnTF \numberline - { \char_set_catcode_letter:n { 64 } } - { \CTEX@toc@width@n {#1} } - { } - { \ctex_patch_failure:N \numberline } + \ctex_at_end_package:nn { \c_parameter_token 1 } + { + \ctex_preto_cmd:NnnTF \numberline + { \char_set_catcode_letter:n { 64 } } + { \CTEX@toc@width@n {#1} } + { } + { \ctex_patch_failure:N \numberline } + } } } } +\__ctex_patch_toc_width:n { tocloft } +\__ctex_patch_toc_width:n { titletoc } \ctex_patch_cmd:Nnn \ps@headings { \ifnum \c@secnumdepth > \m@ne \if@mainmatter @@ -1320,7 +1344,7 @@ { \ifnum \c@secnumdepth > \z@ \thesection . ~ \ \fi } { \CTEXifname { \CTEXthesection \quad } { } } } -\cs_new_protected_nopar:Npn \CTEX@setcurrentlabel@n #1 +\cs_new_protected:Npn \CTEX@setcurrentlabel@n #1 { \protected@edef \@currentlabel { @@ -1329,17 +1353,17 @@ { \exp_not:o { \@currentlabel } } } } -\cs_new_protected_nopar:Npn \ctex_varioref_hook: +\cs_new_protected:Npn \ctex_varioref_hook: { \seq_map_inline:Nn \c__ctex_headings_seq { \ctex_fix_varioref_label:n { ##1 } } } -\cs_new_protected_nopar:Npn \ctex_fix_varioref_label:n #1 +\cs_new_protected:Npn \ctex_fix_varioref_label:n #1 { \tl_if_empty:cT { p@#1 } - { \exp_args:Nno \labelformat {#1} { \cs:w CTEX@the#1 \cs_end: } } + { \exp_args:Nnx \labelformat {#1} { \exp_not:c { CTEX@the#1 } } } } -\@ifpackageloaded { varioref } +\cs_if_exist:NTF \labelformat { \ctex_varioref_hook: } { \cs_new_eq:NN \CTEX@save@refstepcounter \refstepcounter @@ -1353,7 +1377,7 @@ \ctex_scheme_input:o { \l__ctex_scheme_tl } \NewDocumentCommand \zihao { m } { \exp_args:Nx \ctex_zihao:n {#1} \tex_ignorespaces:D } -\cs_new_protected_nopar:Npn \ctex_zihao:n #1 +\cs_new_protected:Npn \ctex_zihao:n #1 { \prop_get:NnNTF \c__ctex_font_size_prop {#1} \l__ctex_font_size_tl { \exp_after:wN \fontsize \l__ctex_font_size_tl \selectfont } @@ -1368,7 +1392,7 @@ } \prop_new:N \c__ctex_font_size_prop \seq_new:N \c__ctex_font_size_seq -\cs_new_protected_nopar:Npn \__ctex_save_font_size:nn #1#2 +\cs_new_protected:Npn \__ctex_save_font_size:nn #1#2 { \use:x { @@ -1400,12 +1424,12 @@ { 0 } { 42 bp } } { \__ctex_save_font_size:nn #1 } -\cs_new_protected_nopar:Npn \ctex_declare_math_sizes:nnnn #1#2#3#4 +\cs_new_protected:Npn \ctex_declare_math_sizes:nnnn #1#2#3#4 { \__ctex_get_font_sizes:Nn \l__ctex_font_size_tl { {#1} {#2} {#3} {#4} } \exp_after:wN \DeclareMathSizes \l__ctex_font_size_tl } -\cs_new_protected_nopar:Npn \__ctex_get_font_sizes:Nn #1#2 +\cs_new_protected:Npn \__ctex_get_font_sizes:Nn #1#2 { \tl_clear:N #1 \tl_map_inline:nn {#2} @@ -1442,13 +1466,13 @@ { \msg_error:nnn { ctex } { fontsize } {#2} } } \cs_new_protected:Npn \__ctex_set_font_size:nnNn #1#2#3#4 - { \cs_set_protected_nopar:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } } -\if_case:w \g__ctex_font_size_int - \ctex_file_input:n { ctex-c5size.clo } -\or: - \ctex_file_input:n { ctex-cs4size.clo } -\fi: -\fp_compare:nNnF { \l__ctex_line_spread_fp } ? { \c_zero_fp } + { \cs_set_protected:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } } +\int_case:nn { \g__ctex_font_size_int } + { + { 0 } { \ctex_file_input:n { ctex-c5size.clo } } + { 1 } { \ctex_file_input:n { ctex-cs4size.clo } } + } +\fp_if_nan:nF { \l__ctex_line_spread_fp } { \exp_args:Nx \linespread { \fp_use:N \l__ctex_line_spread_fp } \group_begin: \footnotesize \exp_args:NNNo \group_end: @@ -1459,47 +1483,76 @@ { C \TeX } \ctex_at_end_package:nn { hyperref } { \pdfstringdefDisableCommands { \tl_set:Nn \CTeX { CTeX } } } -\keys_define:nn { ctex } +\ctex_define:n { captiondelimiter .code:n = { - \msg_warning:nnn { ctex } { deprecated-option } + \ctex_deprecated_option:n { You~can~load~the~package~`caption'~to~get~its~functionality. } } } -\cs_new_protected_nopar:Npn \ctex_fontset_error:n #1 +\cs_new_protected:Npn \ctex_fontset_error:n #1 { \msg_critical:nnn { ctex } { fontset-unavailable } {#1} } \msg_new:nnn { ctex } { fontset-unavailable } { CTeX~fontset~`#1'~is~unavailable~in~current~mode. } -\cs_new_protected_nopar:Npn \ctex_load_fontset: +\cs_new:Npx \ctex_fontset_case:nnn #1#2#3 { - \tl_if_empty:NTF \g__ctex_fontset_tl + \sys_if_engine_pdftex:TF + {#1} + { \sys_if_engine_uptex:TF {#2} {#3} } + } +\cs_new:Npx \ctex_fontset_case:nnnn #1#2#3#4 + { + \sys_if_engine_pdftex:TF + { \sys_if_output_pdf:TF {#1} {#2} } + { \sys_if_engine_uptex:TF {#3} {#4} } + } +\cs_new_protected:Npn \ctex_detect_platform: + { + \sys_if_platform_windows:TF + { \tl_gset:Nn \g__ctex_fontset_tl { windows } } { - \ctex_detected_platform: - \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def } + \ctex_if_platform_macos:TF + { \tl_gset:Nn \g__ctex_fontset_tl { mac } } + { \tl_gset:Nn \g__ctex_fontset_tl { fandol } } } + } +\cs_new_protected:Npn \ctex_if_platform_macos:TF + { \file_if_exist:nTF { /System/Library/Fonts/Menlo.ttc } } +\cs_new_protected:Npn \ctex_load_fontset: + { + \tl_if_empty:NTF \g__ctex_fontset_tl + { \ctex_detect_platform: } { - \file_if_exist:nTF { ctex-fontset- \g__ctex_fontset_tl .def } - { \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def } } + \bool_lazy_or:nnTF + { \str_if_eq_p:on { \g__ctex_fontset_tl } { windowsnew } } + { \str_if_eq_p:on { \g__ctex_fontset_tl } { windowsold } } + { + \msg_warning:nnxx { ctex } { deprecated-fontset } + { \g__ctex_fontset_tl } { windows } + \tl_gset:Nn \g__ctex_fontset_tl { windows } + } { - \use:x + \file_if_exist:nF { ctex-fontset- \g__ctex_fontset_tl .def } { - \ctex_detected_platform: - \msg_error:nnxx { ctex } { fontset-not-found } - { \g__ctex_fontset_tl } { \exp_not:N \g__ctex_fontset_tl } + \use:x + { + \ctex_detect_platform: + \msg_error:nnxx { ctex } { fontset-not-found } + { \g__ctex_fontset_tl } { \exp_not:N \g__ctex_fontset_tl } + } } - \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def } } } + \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def } } -\@onlypreamble \ctex_load_fontset: +\msg_new:nnn { ctex } { deprecated-fontset } + { CTeX~fontset~`#1'~is~deprecated.\\ Fontset~`#2'~will~be~used~instead. } \msg_new:nnnn { ctex } { fontset-not-found } - { - CTeX~fontset~`#1'~could~not~be~found.\\ - Fontset~`#2'~will~be~used~instead. - } + { CTeX~fontset~`#1'~could~not~be~found.\\ Fontset~`#2'~will~be~used~instead. } { You~may~run~`mktexlsr'~firstly. } -\keys_define:nn { ctex } +\@onlypreamble \ctex_load_fontset: +\ctex_define:n { fontset .code:n = { @@ -1529,14 +1582,16 @@ } { Only~one~fontset~can~be~loaded~in~the~preamble. } \msg_new:nnn { ctex } { fontset-only-preamble } - { - The~ `fontset'~ option~ can~ be~ used~ only~ in~ preamble. - } + { The~`fontset'~option~can~be~used~only~in~preamble. } \str_if_eq:onF { \g__ctex_fontset_tl } { none } { \ctex_load_fontset: } \ctex_at_end:n { \ctex_file_input:n { ctex.cfg } } %% -%% This package consists of the file ctex.dtx, +%% This package consists of the files ctex.dtx, +%% ctxdoc.cls, +%% ctxdocstrip.tex, +%% ctex-zhconv.lua, +%% ctex-zhconv-make.lua, %% and the derived files ctex.pdf, %% ctex.ins, %% ctex.sty, @@ -1546,16 +1601,15 @@ %% ctexbook.cls, %% ctexrep.cls, %% ctexbeamer.cls, -%% ctxdoc.cls, %% ctexcap.sty, %% ctexhook.sty, %% ctexpatch.sty, %% ctex-c5size.clo, %% ctex-cs4size.clo, -%% ctex-article.def, -%% ctex-book.def, -%% ctex-report.def, -%% ctex-beamer.def, +%% ctex-heading-article.def, +%% ctex-heading-book.def, +%% ctex-heading-report.def, +%% ctex-heading-beamer.def, %% ctex-scheme-plain.def, %% ctex-scheme-plain-article.def, %% ctex-scheme-plain-book.def, @@ -1570,6 +1624,7 @@ %% ctex-name-utf8.cfg, %% ctex.cfg, %% ctexopts.cfg, +%% ctexbackend.cfg, %% ctex-engine-pdftex.def, %% ctex-engine-xetex.def, %% ctex-engine-luatex.def, @@ -1587,26 +1642,25 @@ %% jt2zhrm.fd, %% jt2zhsf.fd, %% jt2zhtt.fd, -%% ctex-fontset-windows.def, -%% ctex-fontset-windowsnew.def, -%% ctex-fontset-windowsold.def, %% ctex-fontset-adobe.def, %% ctex-fontset-fandol.def, +%% ctex-fontset-founder.def, %% ctex-fontset-mac.def, %% ctex-fontset-macnew.def, %% ctex-fontset-macold.def, -%% ctex-fontset-founder.def, %% ctex-fontset-ubuntu.def, +%% ctex-fontset-windows.def, %% ctexspa.def, %% ctexpunct.spa, %% ctexmakespa.tex, %% ctexspamacro.tex, -%% ctxdocstrip.tex, %% zhadobefonts.tex, %% zhfandolfonts.tex, %% zhfounderfonts.tex, +%% zhmacfonts.tex, %% zhubuntufonts.tex, %% zhwindowsfonts.tex, +%% ctex-zhconv-index.lua, %% translator-theorem-dictionary-ChineseGBK.dict, %% translator-theorem-dictionary-ChineseUTF8.dict, and %% README.md. |