diff options
Diffstat (limited to 'macros/latex/contrib/easybook')
-rw-r--r-- | macros/latex/contrib/easybook/easybook.dtx | 402 | ||||
-rw-r--r-- | macros/latex/contrib/easybook/easybook.pdf | bin | 608496 -> 641249 bytes | |||
-rw-r--r-- | macros/latex/contrib/easybook/easybook.tex | 363 |
3 files changed, 480 insertions, 285 deletions
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx index 2ce884d5f3..2a60d8894f 100644 --- a/macros/latex/contrib/easybook/easybook.dtx +++ b/macros/latex/contrib/easybook/easybook.dtx @@ -15,7 +15,7 @@ %<*class> \NeedsTeXFormat{LaTeX2e}[2021/11/15] \RequirePackage{l3keys2e} -\ProvidesExplClass{easybook}{2024/03/15}{2024ap} +\ProvidesExplClass{easybook}{2024/04/26}{2024bb} {Easily typesetting Chinese theses or books} \bool_new:N \l__eb_compile_draft_bool @@ -297,7 +297,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e}[2021/11/15] \RequirePackage{l3keys2e,etoolbox} -\ProvidesExplPackage{easybase}{2024/03/15}{2024ap} +\ProvidesExplPackage{easybase}{2024/04/26}{2024bb} {Easily typesetting Chinese theses or books} \cs_generate_variant:Nn \dim_set:Nn { NV } @@ -308,8 +308,9 @@ \cs_generate_variant:Nn \skip_set:Nn { NV } \cs_generate_variant:Nn \seq_set_from_clist:Nn { No } \cs_generate_variant:Nn \ctex_define:nn { nx } -\cs_generate_variant:Nn \eb_put_hyperref:n { x } +\cs_generate_variant:Nn \eb_set_hyperref:n { x } \cs_generate_variant:Nn \eb_at_begin_environment:nn { on } +\cs_generate_variant:Nn \tl_if_novalue:nF { V } \cs_set_protected:Npn \ctex_define:nn #1 { \keys_define:nn { ctex/#1 } } @@ -373,7 +374,7 @@ {\IfFileExists{#2.sty}{\RequirePackage{#2}[#3]}{}} {\IfFileExists{#2.sty}{\RequirePackage[#1]{#2}[#3]}{}} } -\cs_new_protected:Npn \LoadPackage #1 +\cs_new_protected:Npn \ebloadpackage #1 { \int_compare:nTF { \clist_count:n {#1} <= 1 } { \RequirePackage } @@ -433,14 +434,20 @@ \seq_set_from_clist:Nn \l__eb_module_paths_seq { - style,subfont,spread, - bibset,thmset,tocset, - hdrset,refset,geoset,float + tools,font,spread, + bib,thmt,toc, + hdr,ref,geo,float } \seq_map_inline:Nn \l__eb_module_paths_seq { \ctex_define:n { #1 .meta:nn = { ctex/#1 } {##1} } - \cs_new_protected:cpn { eb#1 } ##1 { \ctex_set:nn {#1} {##1} } + \cs_new_protected:cpn { eb#1set } ##1 { \ctex_set:nn {#1} {##1} } + } +\RenewDocumentCommand{\ctexset}{om} + { + \IfValueTF{#1} + {\ctex_set:nn {#1} {#2}} + {\ctex_set:n {#2}} } \bool_until_do:nn { \int_compare_p:nNn { \seq_count:N \l__eb_module_paths_seq } < { 8 } } @@ -481,7 +488,7 @@ The~'\string\chapter'\ command~will~not~be~used. } -\LoadPackage +\ebloadpackage { [text]{spbmark}, [normalem]{ulem}, @@ -525,7 +532,7 @@ \eb@tag@brackets@right } } -\ctex_define:nn { style } +\ctex_define:nn { tools } { multoc .int_set:N = \l__eb_toc_columns_int, multoc .default:n = 2, @@ -554,20 +561,20 @@ marginparsep = 8pt, marginparwidth = 2.54cm } -\ctex_define:nn { geoset } +\cs_new:Npn \eb_unknown_kv_handle: + { + \str_use:N \l_keys_key_str + \tl_if_novalue:VF \l_keys_value_tl + { = {\exp_not:V \l_keys_value_tl} } + } +\ctex_define:nn { geo } { headruleskip .tl_set:N = \headruleskip, headruleskip .initial:n = 0pt, footruleskip .tl_set:N = \footruleskip, footruleskip .initial:n = 3.5pt, - unknown .code:n = - { - \exp_args:Nx \geometry - { - \l_keys_key_str - \tl_if_empty:NF \l_keys_value_tl { = {#1} } - } - } + unknown .code:n = \exp_args:Nx \geometry { \eb_unknown_kv_handle: }, + unknown .default:V = \c_novalue_tl } \cs_new_protected:Npn \blankpagestyle #1 @@ -628,7 +635,7 @@ { none* } { \text_lowercase:n } } } -\ctex_define:nn { hdrset } +\ctex_define:nn { hdr } { chap-mark .cs_set:Np = \eb@mark@chapter@whole #1, chap-mark .initial:n = @@ -710,7 +717,7 @@ \providecommand{\kaishu}{\itshape} } -\ctex_define:nn { style } +\ctex_define:nn { tools } { fntnumwith .choices:nn = { part,page,chapter } @@ -866,7 +873,7 @@ \tl_new:N \l__eb_fnmarktext_format_tl \tl_new:N \l__eb_fncustom_format_tl \clist_new:N \l__eb_footnote_value_clist -\ctex_define:nn { hdrset } +\ctex_define:nn { hdr } { fnfirstindent .tl_set:N = \fnfirstindent, fnfirstindent .initial:n = 1em, @@ -907,7 +914,7 @@ fntext-num/unknown .code:n = \eb_fnmarktext_short_label_set:Nn \thefootnote {#1}, fnmarktext-num .meta:n = { fntext-num = #1,fnmark-num = #1 }, fnmarktext-num .initial:n = plain, - unknown .code:n = \eb_msg_deprecated_option:n { hdrset } + unknown .code:n = \eb_msg_deprecated_option:n { hdr } } \eb_at_end_preamble:n @@ -1033,7 +1040,7 @@ { \reset@font } { \setspread{\eb@spread@footnote} - \eb@subfont@footnote + \eb@font@footnote } } \cs_set_eq:NN \eb@@makefntext \@makefntext @@ -1150,7 +1157,7 @@ { \tl_clear:N \l__eb_fnmarktext_format_tl } } \bool_if:NF \l__eb_fnmarktext_format_match_bool { \spbset{spcmd = { }} } - \eb@subfont@footnote + \eb@font@footnote } \cs_new_protected:Npn \defupfntmark #1 { \cs_set:Npn \@makefnmark { \hbox:n {#1} } } @@ -1176,7 +1183,7 @@ \tl_use:N \l__eb_fntext_after_tl } -\tl_clear:N \@thefnmark +\tl_clear_new:N \@thefnmark \tl_new:N \@the@up@fnmark \cs_new:Npn \eb@@makefnmark #1#2 { @@ -1197,7 +1204,7 @@ \l__eb_fnmarktext_format_tl \l__eb_fncustom_format_tl } } -\NewDocumentCommand{\Footnote}{O{#2}mm} +\NewDocumentCommand{\Footnote}{O{#2}m+m} { \group_begin: \eb_fncustom_format_initial: @@ -1241,7 +1248,7 @@ \@addtoreset{#3}{#5} \IfBooleanF{#1} { - \exp_args:Nc \cs_gset:Npn { the#3 } + \cs_gset:cpn { the#3 } { \use:c { the#5 }#4#2{#3} } } } @@ -1255,28 +1262,28 @@ \cs_set:Npn \thebisection { \eb_section_counter_prefix:n { bi } } \cs_set:Npn \thebisubsection { \thebisection.\@arabic\c@bisubsection } \cs_set:Npn \thesection { \eb_section_counter_prefix:n { } } -\tl_new:N \eb@before@addbitoc@hook -\NewDocumentCommand{\BeforeAddBitoc}{sm} +\tl_new:N \eb@before@bitocline@hook +\NewDocumentCommand{\BeforeAddtoBitoc}{sm} { \IfBooleanTF{#1} - {\tl_gset:Nn \eb@before@addbitoc@hook {#2}} - {\tl_gput_right:Nn \eb@before@addbitoc@hook {#2}} + {\tl_gset:Nn \eb@before@bitocline@hook {#2}} + {\tl_gput_right:Nn \eb@before@bitocline@hook {#2}} } +\cs_set_eq:NN \BeforeAddBitoc \BeforeAddtoBitoc \cs_new_protected:Npn \CTEX@addbitocline #1#2 { \group_begin: \def\CTEX@prechapter{\CTEX@prebichapter} \def\CTEX@thechapter{\CTEX@bichapter@number} \def\CTEX@postchapter{\CTEX@postbichapter} - \eb@before@addbitoc@hook + \eb@before@bitocline@hook \tl_if_eq:NnTF \g__eb_bilist_permute_value_tl { mix } { \addcontentsline{toc}{#1} } { \addcontentsline{tec}{#1} } { \use:c { CTEX@#1@tocline }{#1}{#2} } \group_end: } -\eb_seq_map_inline:nn - { chapter,section,subsection } +\cs_new_protected:Npn \RegisterBititle #1 { \exp_args:Nc \NewDocumentCommand { bi#1 }{sO{##3}mm} { @@ -1294,13 +1301,46 @@ } } } +\clist_map_function:nN + { chapter,section,subsection } + \RegisterBititle \eb_preto_cmd:nn { @chapter } { \skip_if_eq:nnF { \eb@toc@lol@skip } { \c_zero_skip } { \addtocontents{lol}{\protect\addvspace{\skip_use:N \eb@toc@lol@skip}} } } +\cs_new_protected:Npn \NewTitleCommand #1#2 + { + \newcounter{#1} + \cs_set_eq:cN { #1mark } \use_none:n + \tl_clear:N \l__ctex_tmp_tl + \__ctex_initial_heading:n {#1} + \__ctex_def_heading_keys:n {#1} + \exp_args:No \ctex_define:n { \l__ctex_tmp_tl } + \cs_gset_protected:cpx {#1} + { + \exp_not:N \@startsection{#1}{#2} + {\exp_not:c { CTEX@#1@indent }} + {\exp_not:c { CTEX@#1@beforeskip }} + {\exp_not:c { CTEX@#1@afterskip }} + {\exp_not:N \normalfont\exp_not:c { CTEX@#1@format }} + } + \cs_new:cpn { CTEX@#1@tocline } ##1##2 + { \CTEXnumberline{##1}##2 } + \exp_args:Nc \providecommand { toclevel@#1 }{#2} + } +\NewDocumentCommand{\NewTitleEntryCommand}{O{toc}m} + { + \cs_new_protected:cpn { #2entry } ##1 + { + \bool_if:cTF { CTEX@#2@numbering } + { \CTEX@ifnametrue } + { \CTEX@ifnamefalse } + \addcontentsline{#1}{#2}{\use:c { CTEX@#2@tocline }{#2}{##1}} + } + } -\ctex_define:nn { style } +\ctex_define:nn { tools } { hyphen-figure .tl_set:N = \l__eb_hyphen_figure_tl, hyphen-table .tl_set:N = \l__eb_hyphen_table_tl, @@ -1312,7 +1352,7 @@ hyphen-listing = #1,hyphen-equation = #1 }, hyphen-every .initial:n = ., - unknown .code:n = \eb_msg_deprecated_option:n { style } + unknown .code:n = \eb_msg_deprecated_option:n { tools } } \eb_seq_map_inline:nn { figure,table,lstlisting,equation } @@ -1430,7 +1470,7 @@ { \par } } } -\cs_new_protected:Npn \eb_toc_float_list_parse:nnnnn #1#2#3#4#5 +\cs_new_protected:Npn \eb_toc_list_struct_parse:nnnnn #1#2#3#4#5 { \group_begin: \tl_set_eq:Nc \eb@toc@title { list#4name } @@ -1451,7 +1491,7 @@ \cs_new_protected:Npn \DeclareFloatList #1#2 { \exp_args:Nc \DeclareDocumentCommand { listof#1s }{st+o} - {\eb_toc_float_list_parse:nnnnn {##1} {##2} {##3} {#1} {#2}} + {\eb_toc_list_struct_parse:nnnnn {##1} {##2} {##3} {#1} {#2}} \ctex_define:n { #1 .meta:nn = { ctex/#1 } {##1}, @@ -1498,7 +1538,7 @@ \bool_if:NT \l__eb_toc_plan_cn_bool { \IfBooleanF{#1}{\eb@toc@title@level{\eb@toc@title}{}} - \eb_toc_if_title_between_hook:nn {#1} { main } + \eb_toc_if_title_between_hook:nn {#1} { title } \eb_toc_start_multi_column_ext:n { toc }#4 } \bool_if:NT \l__eb_toc_plan_bi_bool @@ -1506,7 +1546,7 @@ \tl_if_eq:NnF \g__eb_bilist_permute_value_tl { mix } { \IfBooleanF{#1}{\eb@toc@title@level{\eb@bitoc@title}{}} - \eb_toc_if_title_between_hook:nn {#1} { bimain } + \eb_toc_if_title_between_hook:nn {#1} { bititle } \eb_toc_start_multi_column_ext:n { tec } } } @@ -1519,19 +1559,6 @@ \seq_put_right:Nn \c__ctex_headings_seq { figure } \seq_put_right:Nn \c__ctex_headings_seq { lstlisting } \seq_remove_duplicates:N \c__ctex_headings_seq -\cs_new_protected:Npn \eb_toc_entry_if_hang:n #1 - { - \bool_if:NTF \l__eb_toc_entry_hang_bool - { \contentspush } - { \use:n } - { - \bool_if:NTF \l__eb_toc_number_color_bool - { \textcolor{ctex@toc@number} } - { \use:n } - { \thecontentslabel } - \tl_use:c { l__eb_toc_#1_after_tl } - } - } \cs_new_protected:Npn \eb_toc_format_define:n #1 { \ctex_define:n @@ -1540,31 +1567,72 @@ #1/tocformat .tl_set:c = l__eb_toc_#1_format_tl, #1/tocformat+ .code:n = \tl_put_right:cn { l__eb_toc_#1_format_tl } {##1}, #1/tocformat~+ .code:n = \tl_put_right:cn { l__eb_toc_#1_format_tl } {##1}, - #1/tocindent .dim_set:c = l__eb_toc_#1_indent_dim, + #1/tocformat* .tl_set:c = l__eb_toc_#1_entry_nolabel_tl, + #1/tocindent .tl_set:c = l__eb_toc_#1_indent_tl, + #1/toclabel .cs_set:cp = { eb_toc_entry_#1:nnn } ##1##2##3, #1/tocrule .tl_set:c = l__eb_toc_#1_rule_tl, #1/tocafter .tl_set:c = l__eb_toc_#1_after_tl, - #1/tocbelow .tl_set:c = l__eb_toc_#1_below_tl + #1/tocbelow .tl_set:c = l__eb_toc_#1_below_tl, + #1/tocbegin .meta:n = { #1/tocbelow = {##1} }, + #1/tocsep .tl_set:c = l__eb_toc_#1_sep_tl, + #1/tocend .tl_set:c = l__eb_toc_#1_end_tl } } -\cs_new_protected:Npn \eb_toc_format_initial:n #1 +\tl_new:N \l__eb_toc_tmpa_tl +\tl_new:N \l__eb_toc_tmpb_tl +\cs_new_protected:Npn \eb_toc_format_initial:nn #1#2 { - \titlecontents{#1} - [\dim_use:c { l__eb_toc_#1_indent_dim }] - {\tl_use:c { l__eb_toc_#1_format_tl }} - {\eb_toc_entry_if_hang:n {#1}}{} - {\tl_use:c { l__eb_toc_#1_rule_tl }} - [\tl_use:c { l__eb_toc_#1_below_tl }] - \ctex_set:nn {#1} + \exp_last_unbraced:Nx + \use:n + { + \exp_not:N + \titlecontents + \tl_use:N \l__eb_toc_tmpa_tl + \exp_not:n + { + {#2} + [\tl_use:c { l__eb_toc_#2_indent_tl }] + {\tl_use:c { l__eb_toc_#2_format_tl }} + {\use:c { eb_toc_entry_#2:nnn } { \thecontentslabel } {#2} {#1}} + {\tl_use:c { l__eb_toc_#2_entry_nolabel_tl }} + {\tl_use:c { l__eb_toc_#2_rule_tl }} + [\tl_use:c { l__eb_toc_#2_below_tl }] + } + \exp_not:o { \l__eb_toc_tmpb_tl } + } + \ctex_set:nn {#2} { + tocformat = \IfBooleanT{#1}{\contentsmargin{0pt}}, tocindent = 0em, - tocrule = \tocrule{$\cdot$}, - tocafter = \hspace{1em} + tocrule = \IfBooleanTF{#1}{,~\thecontentspage}{\tocrule{$\cdot$}}, + toclabel = + { + \bool_if:NTF \l__eb_toc_entry_hang_bool + { \IfBooleanTF{##3}{\use:n}{\contentspush} } + { \use:n } + { ##1\tl_use:c { l__eb_toc_##2_after_tl } } + }, + tocafter = \hspace{1em}, + tocsep = .—, + tocend = . } } -\cs_new_protected:Npn \RegisterTocName #1 +\NewDocumentCommand{\RegisterTocName}{sm} { - \eb_toc_format_define:n {#1} - \eb_toc_format_initial:n {#1} + \IfBooleanT{#1} + { + \ctex_set:nn { toc } { between = { },bibetween = { } } + \tl_set:Nn \l__eb_toc_tmpa_tl {*} + \tl_set:Nn \l__eb_toc_tmpb_tl + { + [\tl_use:c { l__eb_toc_#2_sep_tl }] + [\tl_use:c { l__eb_toc_#2_end_tl }] + } + } + \eb_toc_format_define:n {#2} + \eb_toc_format_initial:nn {#1} {#2} + \tl_clear:N \l__eb_toc_tmpa_tl + \tl_clear:N \l__eb_toc_tmpb_tl } \seq_map_function:NN \c__ctex_headings_seq \RegisterTocName @@ -1586,7 +1654,7 @@ \eb_seq_map_inline:nn { tocafter,tocindent,tocrule } { - \ctex_define:nn { tocset } + \ctex_define:nn { toc } { #1-every .code:n = { @@ -1599,13 +1667,30 @@ } } } -\ctex_define:nn { tocset } +\NewDocumentCommand{\tocrule}{st-O{0.7pc}d()mO{}} + { + \normalsize\normalfont + \titlerule*[#3]{\IfValueTF{#4}{\scalebox{#4}{#5}}{#5}}#6 + { + \IfBooleanF{#2} + { + \IfBooleanTF{#1} + {\thecontentspage} + { + \bool_if:NTF \l__eb_toc_dot_align_bool + { \contentspage } + { \thecontentspage } + } + } + } + } +\ctex_define:nn { toc } { lolskip .skip_set:N = \eb@toc@lol@skip, lolskip .initial:n = 10pt, - between .tl_set:N = \l__eb_toc_main_between_hook_tl, + between .tl_set:N = \l__eb_toc_title_between_hook_tl, between .initial:n = \bool_if:NT \l__eb_class_mode_book_bool { \vspace*{-1pc} }, - bibetween .tl_set:N = \l__eb_toc_bimain_between_hook_tl, + bibetween .tl_set:N = \l__eb_toc_bititle_between_hook_tl, bibetween .initial:n = \bool_if:NT \l__eb_class_mode_book_bool { \vspace*{-1pc} }, dotalign .bool_set:N = \l__eb_toc_dot_align_bool, dotalign .default:n = true, @@ -1615,25 +1700,29 @@ hang .initial:n = true, pagenumwd .code:n = \contentsmargin{#1}, pagenumwd .initial:n = 1.55em, - unknown .code:n = \eb_msg_deprecated_option:n { tocset } + unknown .code:n = \eb_msg_deprecated_option:n { toc } } -\NewDocumentCommand{\tocrule}{st-O{0.7pc}d()mO{}} + +\NewHookWithArguments{starttoc/after}{1} +\AddToHookWithArguments{starttoc/after}[aux] { - \normalsize\normalfont - \titlerule*[#3]{\IfValueTF{#4}{\scalebox{#4}{#5}}{#5}}#6 + \ifbool{@filesw} { - \IfBooleanF{#2} - { - \IfBooleanTF{#1} - {\thecontentspage} - { - \bool_if:NTF \l__eb_toc_dot_align_bool - { \contentspage } - { \thecontentspage } - } - } + \tl_if_exist:cF { tf@#1 } + {\iow_new:c { tf@#1 }\iow_open:cn { tf@#1 } { \jobname.#1 }} } + {} + } +\cs_set:Npn \@starttoc #1 + { + \group_begin: + \file_if_exist_input:n { \jobname.#1 } + \UseHookWithArguments{starttoc/after}{1}{#1} + \boolfalse{@nobreak} + \group_end: } +\AtEndDocument{\iow_now:Nn \@mainaux { \RemoveFromHook{starttoc/after}[aux] }} + \cs_set_eq:NN \eb@ctexsetii \ctex_set:nn \cs_new_protected:Npn \SetTocStyle #1#2#3 { @@ -1648,6 +1737,7 @@ } \msg_new:nnn { easybase } { undefined-toc-style } { The~contents~style~'#1'~of~'#2'~is~not~defined. } + \ctex_set:n { part = @@ -1711,7 +1801,7 @@ \ctex_assign_heading_name:nn { biappendix } {#1} \bool_if:NTF \l__eb_class_mode_book_bool { - \eb_preto_cmd:nn { eb@before@addbitoc@hook } + \eb_preto_cmd:nn { eb@before@bitocline@hook } { \def\CTEX@prechapter{\CTEX@prebiappendix} \def\CTEX@thechapter{#2} @@ -1737,40 +1827,43 @@ } } -\ctex_define:nn { subfont } +\ctex_define:nn { font } { - caption-table .tl_set:N = \l__eb_subfont_caption_table_tl, - caption-figure .tl_set:N = \l__eb_subfont_caption_figure_tl, - caption-listing .tl_set:N = \l__eb_subfont_caption_listing_tl, + caption-table .tl_set:N = \l__eb_font_caption_table_tl, + caption-figure .tl_set:N = \l__eb_font_caption_figure_tl, + caption-listing .tl_set:N = \l__eb_font_caption_listing_tl, caption-every .meta:n = { caption-table = #1,caption-figure = #1, caption-listing = #1 }, caption-every .initial:n = \sffamily\small, - footnote .tl_set:N = \eb@subfont@footnote, + footnote .tl_set:N = \eb@font@footnote, marginpar .tl_set:N = \marginfont, marginpar .initial:n = \footnotesize, - unknown .code:n = \eb_msg_deprecated_option:n { subfont } + unknown .code:n = \eb_msg_deprecated_option:n { font } } -\cs_new_protected:Npn \addtosubfont #1#2 +\cs_new_protected:Npn \ebaddtofont #1#2 { - \str_case:nnF {#1} + \str_case:nn {#1} { { table } - { \tl_put_right:Nn \l__eb_subfont_caption_table_tl {#2} } + { \tl_put_right:Nn \l__eb_font_caption_table_tl {#2} } { figure } - { \tl_put_right:Nn \l__eb_subfont_caption_figure_tl {#2} } + { \tl_put_right:Nn \l__eb_font_caption_figure_tl {#2} } { listing } - { \tl_put_right:Nn \l__eb_subfont_caption_listing_tl {#2} } + { \tl_put_right:Nn \l__eb_font_caption_listing_tl {#2} } { every } { - \tl_put_right:Nn \l__eb_subfont_caption_table_tl {#2} - \tl_put_right:Nn \l__eb_subfont_caption_figure_tl {#2} - \tl_put_right:Nn \l__eb_subfont_caption_listing_tl {#2} + \tl_put_right:Nn \l__eb_font_caption_table_tl {#2} + \tl_put_right:Nn \l__eb_font_caption_figure_tl {#2} + \tl_put_right:Nn \l__eb_font_caption_listing_tl {#2} } + { footnote } + { \tl_put_right:Nn \eb@font@footnote {#2} } + { marginpar } + { \tl_put_right:Nn \marginfont {#2} } } - { \tl_put_right:cn { l__eb_subfont_#1_tl } {#2} } } \ctex_define:nn { spread } { @@ -1832,7 +1925,7 @@ \DeclareCaptionFont{eb@#1@font} { \setspread{\fp_use:c { l__eb_spread_caption_#1_fp }} - \tl_use:c { l__eb_subfont_caption_#1_tl } + \tl_use:c { l__eb_font_caption_#1_tl } } } \captionsetup @@ -1915,7 +2008,7 @@ \SetEnumitemValue{ref}{enumii}{\arabic{enumi}.\alph*} \SetEnumitemValue{ref}{enumiii}{\arabic{enumi}.\alph{enumii}.\roman*} \setlist{nosep,labelsep = 0.5em,listparindent = \parindent} -\setlist[1]{leftmargin = *,align = left,mode = unboxed} +\setlist[1]{leftmargin = *,align = left} \setlist[itemize,1]{label = bullet} \setlist[itemize,2]{label = endash} \setlist[itemize,3]{label = asterisk} @@ -2010,8 +2103,12 @@ \cs_set_eq:NN \eb@declaretheoremsyle@save \declaretheoremstyle \RenewDocumentCommand{\declaretheoremstyle}{O{}mO{}} {\eb@declaretheoremsyle@save[#1,#3]{#2}} - \ctex_define:nn { thmset } - { unknown .code:n = \eb_msg_deprecated_option:n { thmset } } + \ctex_define:nn { thmt } + { + loeskip .skip_set:N = \eb@thmt@loe@skip, + loeskip .initial:n = 10pt, + unknown .code:n = \eb_msg_deprecated_option:n { thmt } + } \declaretheoremstyle{default}[ spaceabove = 0ex plus .1ex, spacebelow = 0ex plus .1ex, @@ -2024,6 +2121,35 @@ ] \theoremstyle{default} \cs_undefine:N \proof + \DeclareFloatList{theorem}{loe} + \eb_preto_cmd:nn { listoftheorems } + { + \group_begin: + \def\contentsline #1 {\use:c { thmt@contentsline@#1 }{#1}} + } + \eb_appto_cmd:nn { listoftheorems } { \group_end: } + \eb_preto_cmd:nn { @chapter } + { + \skip_if_eq:nnF { \eb@thmt@loe@skip } { \c_zero_skip } + { \addtocontents{loe}{\protect\addvspace{\skip_use:N \eb@thmt@loe@skip}} } + } + \def\thmtlo@chaptervspacehack{} + \def\thmtname{\thmt@thmname} + \def\thmtenvname{\thmt@envname} + \def\thmtnote{\thmt@shortoptarg} + \def\thmtformatoptarg #1 {#1} + \def\thmtifname #1#2 {\ifbool{thmt@isstarred}{#2}{#1}} + \def\thmtifnote #1#2 + { + \tl_if_empty:NTF \thmt@shortoptarg + {#2} + { \protect\thmtformatoptarg{#1} } + } + \NewDocumentCommand{\settheoremtocline}{smm} + { + \IfBooleanT{#1}{\def\thmt@contentslineIgnore{\thmt@contentsline}} + \cs_set:cpn { ll@#2 } {#3} + } } \setchemformula @@ -2074,7 +2200,7 @@ { \file_if_exist_input:n { eb-tcolorbox.cfg } } \bool_set_true:N \l__eb_backend_bibtex_bool -\ctex_define:nn { bibset } +\ctex_define:nn { bib } { backend .choice:, backend .value_required:n = true, @@ -2086,7 +2212,7 @@ datafile .clist_set:N = \l__eb_bib_datafile_clist, bititle .tl_set:N = \eb@bib@bitoc@title, bititle .initial:n = Bibliography, - unknown .code:n = \eb_msg_deprecated_option:n { bibset } + unknown .code:n = \eb_msg_deprecated_option:n { bib } } \cs_new_protected:Npn \eb_bibtex_natbib_set: @@ -2198,6 +2324,12 @@ \lstloadlanguages{C,C++,Java,Python,Matlab} \clist_new:N \l__eb_hyperref_clist +\cs_new_protected:Npn \eb_set_hyperref:n #1 + { + \IfPackageLoadedTF{hyperref} + {\hypersetup} + {\eb_put_hyperref:n}{#1} + } \cs_new_protected:Npn \eb_put_hyperref:n #1 { \clist_put_right:Nn \l__eb_hyperref_clist {#1} } \cs_new_protected:Npn \eb_define_link_color:nnn #1#2#3 @@ -2209,9 +2341,9 @@ \cs_new_protected:Npn \eb_define_theme_color:n #1 { \definecolorset{HTML}{ctex@}{}{frame,#1;emph,#1;verb,#1} } \cs_new_protected:Npn \DeclareLinkColor #1 - { \ctex_define:nx { refset } { \eb_link_color_set:n {#1} } } + { \ctex_define:nx { ref } { \eb_link_color_set:n {#1} } } \cs_new_protected:Npn \DeclareThemeColor #1 - { \ctex_define:nx { style } { \eb_theme_color_set:n {#1} } } + { \ctex_define:nx { tools } { \eb_theme_color_set:n {#1} } } \cs_new_protected:Npn \eb_color_assign_cmd_set:nn #1#2 { \cs_new:cpn { eb_#2_color_set:n } ##1 @@ -2231,7 +2363,7 @@ { color } { theme } } { \eb_color_assign_cmd_set:nn #1 } -\ctex_define:nx { refset } +\ctex_define:nx { ref } { linkcolor .choice:, linkcolor .value_required:n = true, @@ -2246,7 +2378,7 @@ linkcolor .initial:n = navyblue, linkcolor-every .code:n = \eb_define_link_color:n { \exp_not:n {#1} } } -\ctex_define:nx { style } +\ctex_define:nx { tools } { color .choice:, color .value_required:n = true, @@ -2262,37 +2394,21 @@ color-every .code:n = \eb_define_theme_color:n { \exp_not:n {#1} } } -\bool_new:N \l__eb_toc_number_color_bool \cs_new_protected:Npn \eb_link_border_set:n #1 { - \bool_set_false:N \l__eb_toc_number_color_bool \ctex_at_end_package:nn { hyperref } { \def\@pdfborder{#1} \def\Hy@colorlink ##1 {\begingroup} \def\Hy@endcolorlink{\endgroup} } - \eb_put_hyperref:n { colorlinks = false } + \eb_set_hyperref:n { colorlinks = false } } \cs_new_protected:Npn \eb_link_colors_set: - { - \bool_set_true:N \l__eb_toc_number_color_bool - \colorlet{ctex@toc@number}{ctex@link} - \eb_put_hyperref:n { colorlinks } - } + { \eb_set_hyperref:n { colorlinks } } \cs_new_protected:Npn \eb_link_toc_put:n #1 - { - \eb_put_hyperref:n { linktoc = #1 } - \eb_seq_map_inline:nn { page,none } - { - \tl_if_eq:NnT \l_keys_value_tl {##1} - { - \colorlet{ctex@toc@number}{black} - \seq_map_break: - } - } - } -\ctex_define:nn { refset } + { \eb_set_hyperref:n { linktoc = #1 } } +\ctex_define:nn { ref } { linktype .choice:, linktype .value_required:n = true, @@ -2302,17 +2418,11 @@ linktype/various .meta:n = linktype/colors, linktype .initial:n = edge, linktoc .choice:, + linktoc .value_required:n = true, linktoc/unknown .code:n = \eb_link_toc_put:n {#1}, - linktoc .default:n = all, linktoc .initial:n = all, - unknown .code:n = - { - \eb_put_hyperref:x - { - \l_keys_key_str - \tl_if_empty:NF \l_keys_value_tl { = {#1} } - } - } + unknown .code:n = \eb_set_hyperref:x { \eb_unknown_kv_handle: }, + unknown .default:V = \c_novalue_tl } \cs_new_protected:Npn \eb_allow_url_break: @@ -2370,7 +2480,8 @@ \ctex_define:n { lstlistlistingname .tl_set:N = \listlstlistingname, - lstlistingname .tl_set:N = \lstlistingname + lstlistingname .tl_set:N = \lstlistingname, + listtheoremname .tl_set:N = \listtheoremname } \tl_if_eq:NnTF \l__ctex_scheme_tl { chinese } { @@ -2380,7 +2491,8 @@ listfigurename = 插图清单, listtablename = 附表清单, lstlistlistingname = 代码清单, - lstlistingname = 代码 + lstlistingname = 代码, + listtheoremname = 定理清单 } } { @@ -2392,7 +2504,7 @@ } %</package> %<*tcolorbox> -\ProvidesExplFile{eb-tcolorbox.cfg}{2024/03/15}{2024ap} +\ProvidesExplFile{eb-tcolorbox.cfg}{2024/04/26}{2024bb} {Customization of tcolorbox for easybook} \cs_set_protected:Npn \addtotcbstyle #1#2 diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf Binary files differindex 2fe646ac7e..b2ead2bd49 100644 --- a/macros/latex/contrib/easybook/easybook.pdf +++ b/macros/latex/contrib/easybook/easybook.pdf diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex index 104080059b..5bb0355843 100644 --- a/macros/latex/contrib/easybook/easybook.tex +++ b/macros/latex/contrib/easybook/easybook.tex @@ -23,8 +23,8 @@ name = easybook, color-scheme = blue, title = EASYBOOK使用手册, - version = v2024ap, - date = 2024/03/15, + version = v2024bb, + date = 2024/04/26, authors = 瞿毅, info = 简便地排版中文学位论文或书籍, email = toquyi@163.com, @@ -53,22 +53,26 @@ \setlist[1]{labelindent = \parindent} \setlist[itemize,1]{label = smallbullet,leftmargin = *} \setcounter{tocdepth}{2} -\SetTblrInner[talltblr]{hline{1,Z} = {0.8pt,DarkBlue}} -\SetTblrTemplate{caption}{empty} +\SetTblrInner[longtblr]{columns = c,hline{1,Z} = {1pt,DarkBlue}} +\SetTblrOuter[longtblr]{presep = \bigskipamount,postsep = \bigskipamount} +\DefTblrTemplate{caption-tag}{default}{表\thetable} +\DefTblrTemplate{caption-sep}{default}{\quad} \DefTblrTemplate{remark-sep}{default}{\space} +\SetTblrStyle{caption-tag}{font = \bfseries} \SetTblrStyle{remark}{font = \small\normalfont} \ExplSyntaxOn\makeatletter % * Do not add entries to the index +% + Canceling the \item command in the list environment % - Leave the option value blank -\let\isvalue\cnltx@isvalue -\NewDocumentCommand{\kvsplit}{st-mm} +\NewDocumentCommand{\kvsplit}{st+t-mm} { - \item\code + \IfBooleanF{#2}{\item} + \code { - \IfBooleanTF{#1}{\option*{#3}}{\option{#3}} + \IfBooleanTF{#1}{\option*{#4}}{\option{#4}} \cnltx@isvalue - \IfBooleanTF{#2}{#4}{\splitmarg{#4}} + \IfBooleanTF{#3}{#5}{\splitmarg{#5}} } \cnltx@checkdefault{\hfill\newline} } @@ -113,6 +117,7 @@ \IfBooleanF{#1}{\cnltx@checkdefault{\hfill\newline}} } \newnote{\newtag}[1][New]{\fbox{#1}} +\newnote{\newtagv}[2][New]{#1\\#2} % Multi-row values alignment when there are many choices \newcommand{\leftfillchoice}[2] { @@ -122,14 +127,6 @@ % Use a separate module margin marker to prevent overlap \newcommand{\smodule}[1]{\cnltx@module@text*{\normalsize #1}} \newcommand{\noitemsep}{\setlength{\itemsep}{0ex}} -\newcommand{\insertalltblr}[3][] - { - \begin{center} - \begin{talltblr}[#1]{#2} - #3 - \end{talltblr} - \end{center} - } \renewcommand{\cnltx@package@abstract@width}{0.85\linewidth} \renewcommand{\cnltx@write@lastname}{} \renewcommand{\cmltx@list@setup} @@ -156,13 +153,13 @@ rulecolor = \color{DarkBlue}, framerule = 0.5pt, frame = single, - framesep = 6pt + framesep = 8pt } \DefineVerbatimEnvironment{frameverb}{Verbatim} { listparameters = { - \setlength{\topsep}{\bigskipamount} + \setlength{\topsep}{1.2\bigskipamount} \appto\FV@EndList{\nointerlineskip} } } @@ -171,26 +168,31 @@ label = \rule{0pt}{12pt}\textnormal{\bfseries 例~\arabic{ctexexam}}, listparameters = { - \setlength{\topsep}{\bigskipamount} + \setlength{\topsep}{1.2\bigskipamount} \appto\FV@EndList{\nointerlineskip} \refstepcounter{ctexexam}\ctexexamlabelref } } +\newcommand{\optpath}[1]{\item\code{\textcolor{SlateGray}{#1}}} \makeatother\ExplSyntaxOff \labelformat{section}{节#1} \labelformat{subsection}{小节#1} \labelformat{subsubsection}{小节#1} \labelformat{ctexexam}{例#1} +\labelformat{table}{表#1} \begin{document} \section{准备开始} 您在使用 \easybook{} 文档类编写文档前可能需要具备以下的条件: \begin{itemize} - \item 使用 \hologo{XeLaTeX}(推荐)或 \hologo{LuaLaTeX} 两种编译方式。 + \item 使用 \hologo{XeLaTeX}(推荐)或 \hologo{LuaLaTeX} 两种编译方式之一。 \item 由于文档类用到了一些 \LaTeX 和依赖宏包较新的功能,需要版本至少在\textbf{2021/11/15}以后的 \LaTeX 内核支持。建议您安装最新的 \TeX 发行版。 - \item 虽然手册对基本用法做了介绍,但这并不是入门教程,所涉及到宏包的用法与命令也需要有了解。您应当具有一定的 \LaTeX 使用基础,可以在 \TeX 综合网站 \href{https://www.ctan.org/}{CTAN} 查看相关资源。 + \item 虽然手册对基本用法做了介绍,但这并不是入门教程,所涉及到宏包的用法与命令并未进行详细介绍,需要对它们有所了解。您应当具有一定的 \LaTeX 使用基础,可以在 \TeX 综合网站 \href{https://www.ctan.org/}{CTAN} 查看相关资源。 \end{itemize} +\subsection{前言} +对于排版外文文档已有诸如 \cls*{KOMA-Script} 和 \cls*{memoir} 等应用广泛的文档类,但这些文档类并不是为中文用户设计的,难免有些水土不符,且用户手册繁杂,对于普通用户来说学习成本高,难以快速上手。中文文档的解决方案 \pkg*{ctex} 宏集解决了中文输出和章节标题格式的设置问题,但在编写文档过程中往往需要更多基本的定制功能,例如目录、图表标题、页眉页脚、脚注和页面边距等,这往往需要额外加载不同功能的宏包。\easybook{} 文档类在 \cls*{ctexbook} 基础上载入了一些使用频率较高且基本稳定的宏包,对它们的功能进行整合并优化联动使用,模块化的改装提供统一的接口兼容 \pkg*{ctex} 文档类,可以满足学术类文档例如中国学位论文模板的基本需求。\easybook{} 提供了与 \CTeX 相同现代化风格的键值设置,支持不同类型的选项与层次化的选项设置。 + \subsection{基本用法} \label{subsec:basic usage} 以下一份简单的 \TeX 文档演示了 \easybook{} 的最基本用法,在导言区进行宏包载入与文档设置,一些详细的使用样例会不定期上传在 \href{https://www.latexstudio.net/}{\LaTeX 工作室} 的网站。 @@ -236,24 +238,24 @@ \ding{72} 需要注意正确\textbf{编译索引}要增加 \code{-shell-escape} 命令行选项。 \subsection{依赖宏包} -以下为 \pkg*{easybase} 直接调用的关键宏包清单,通常情况下它们是常用且稳定的。\colorbox{PaleTurquoise}{蓝色}背景的宏包表示修改了或依赖它们的内部命令。\colorbox{GreenYellow}{绿色}背景的宏包表示并未调用它们,但做了一些预配置,可在导言区手动载入以实现相关的功能。 -\insertalltblr +\ref{table:package list} 为 \pkg*{easybase} 直接调用的关键宏包清单,通常情况下它们是常用且稳定的。\colorbox{PaleTurquoise}{蓝色}背景的宏包表示修改了或依赖它们的内部命令。\colorbox{GreenYellow}{绿色}背景的宏包表示并未调用它们,但做了一些预配置,可在导言区手动载入以实现相关的功能。 +\begin{longtblr} + [caption = 依赖的宏包清单,label = table:package list] { - colspec = *{5}{c}, - cells = {cmd = \pkg*}, - cell{1}{3,4} = PaleTurquoise, - cell{2}{5} = PaleTurquoise, - cell{3}{2,4} = PaleTurquoise, - cell{5}{1} = GreenYellow, - cell{1}{2} = GreenYellow, - cell{3}{1,4} = GreenYellow - }{ - amsthm & bicaption & ctex & caption & chemformula \\ - enumitem & etoolbox & fancyhdr & geometry & hyperref \\ - imakeidx & listings & marginnote & mathtools & multicol \\ - pifont & pdfpages & siunitx & spbmark & thmtools \\ - tcolorbox & titletoc & tabularray & ulem & + cells = {cmd = \pkg*}, + cell{1}{3,4} = PaleTurquoise, + cell{2}{5} = PaleTurquoise, + cell{3}{2,4} = PaleTurquoise, + cell{5}{1} = GreenYellow, + cell{1}{2} = GreenYellow, + cell{3}{1,4} = GreenYellow } + amsthm & bicaption & ctex & caption & chemformula \\ + enumitem & etoolbox & fancyhdr & geometry & hyperref \\ + imakeidx & listings & marginnote & mathtools & multicol \\ + pifont & pdfpages & siunitx & spbmark & thmtools \\ + tcolorbox & titletoc & tabularray & ulem & +\end{longtblr} \section{文档类选项} \label{sec:document class options} @@ -276,7 +278,7 @@ \keychoice{floatpage}{true,\fbox{false}} 开启这个选项后浮动环境 \env{table} 和 \env{figure} 的比例参数会使用默认值。关闭它则尽可能避免出现浮动页,使图表环境与正文段落更加紧凑,减少多余的空白版面。 \keychoice{theorem}{\fbox{true},false} - 是否提供定理功能支持。选项开启时定理样式模块生效,此时会载入 \pkg*{amsthm} 和 \pkg*{thmtools} 宏包。 + 是否提供定理功能支持。选项开启时定理模块生效,此时会载入 \pkg*{amsthm} 和 \pkg*{thmtools} 宏包。 \end{options} \subsection{配置字体} @@ -291,30 +293,27 @@ \setCJKmonofont{FangSong} \newCJKfontfamily[song]\songti{SimSun} \end{ctexexam} -\end{options} - -\begin{options} \keychoice{font}{noto,times,times*,ebgaramond,libertine,palatino,\fbox{auto}}\dtag - 预置的英文字体相关配置方案如下表所示。这些字体已经包含在了 \hologo{TeXLive} 发行版中,所以通常不需要再专门安装。如果您想使用其它英文字体,可以使用 \pkg*{fontspec} 宏包的相关命令进行设置。 - \insertalltblr[ - remark{\ding{72}} = \code{times*} 方案为 \textsf{windows} 系统的预置字体。 - ]{ - colspec = @{}*{4}{c}@{}, - hline{2} = {0.5pt,DarkBlue}, - row{1} = {font = \sffamily}, - column{1} = {cmd = \code} - }{ - & 正文字体 & 无衬线字体 & 等宽字体 \\ - noto & Noto Serif & Noto Sans & Noto Sans Mono \\ - times & XITS & TG Heros & TG Cursor \\ - times* & Times New Roman & Arial & Courier New \\ - ebgaramond & EB Garamond & Libertinus Sans & LM Mono \\ - palatino & TG Pagella & Libertinus Sans & LM Mono \\ - libertine & Libertinus Serif & Libertinus Sans & LM Mono - } -\end{options} - -\begin{options} + 预置的英文字体相关配置方案如\ref{table:english font} 所示。这些字体已经包含在了 \hologo{TeXLive} 发行版中,所以通常不需要再专门安装。如果您想使用其它英文字体,可以使用 \pkg*{fontspec} 宏包的相关命令进行设置。 + \begin{longtblr} + [ + caption = 英文字体预设方案, + label = table:english font, + remark{\ding{72}} = \code{times*} 方案为 \textsf{windows} 系统的预置字体。, + postsep = \bigskipamount-\itemsep + ]{ + hline{2} = {0.5pt,DarkBlue}, + row{1} = {font = \sffamily}, + column{1} = {cmd = \code} + } + & 正文字体 & 无衬线字体 & 等宽字体 \\ + noto & Noto Serif & Noto Sans & Noto Sans Mono \\ + times & XITS & TG Heros & TG Cursor \\ + times* & Times New Roman & Arial & Courier New \\ + ebgaramond & EB Garamond & Libertinus Sans & LM Mono \\ + palatino & TG Pagella & Libertinus Sans & LM Mono \\ + libertine & Libertinus Serif & Libertinus Sans & LM Mono + \end{longtblr} \keychoice{mathfont}{\fbox{times},noto,notosans,nc,ncf,stix2,charter,ebgaramond,libertine}\dtag \leftfillchoice{mathfont}{minion,garamondx,baskervaldx,baskerville,none} \\ 选择合适的数学字体,将会加载 \pkg*{newtxmath} 和 \pkg*{bm} 宏包。使用选项 \code{none} 时可以使用 \pkg*{unicode-math} 等其它数学字体宏包定义字体。 @@ -333,49 +332,50 @@ \section{接口选项} \label{sec:interface options} \begin{commands} - \command*{ctexset}[\marg{键值列表}] - \easybook{} 扩展了 \CTeX 宏集 \hologo{LaTeX3} 风格键值的通用控制命令 \cs*{ctexset},接口选项同样可用它设置,原有的 \meta{键值列表} 仍然可用。本文档类目前有9个模块用于实现常规的排版功能,如下表所示。模块名也是统一接口 \cs*{ctexset} 的路径,不同模块单独接口的命令名\textbf{加上前缀} \code{eb}: - \insertalltblr + \command*{ctexset}[\oarg{模块名}\marg{键值列表}] + \easybook{} 扩展了 \CTeX 宏集 \hologo{LaTeX3} 风格键值的通用控制命令 \cs*{ctexset},接口选项同样可用它设置,原有的 \meta{键值列表} 仍然可用。本文档类目前有9个模块用于实现常规的排版功能,如\ref{table:module List} 所示。 + \begin{longtblr} + [caption = 模块功能和名称清单,label = table:module List] { - colspec = @{}*{5}{c}@{}, - hline{3} = {0.5pt,DarkBlue}, - row{1,3} = {font = \sffamily,belowsep = 0pt}, - row{2,4} = {cmd = \module*} - }{ - \hyperref[subsec:style]{风格} & \hyperref[subsec:other font]{其它字体} & \hyperref[subsec:spacing]{行距} & \hyperref[subsec:hyperlinks]{超链接} & \hyperref[subsec:reference]{参考文献} \\ - style & subfont & spread & refset & bibset \\ - \hyperref[subsec:theorem of style]{定理样式} & \hyperref[subsec:page margins]{页面尺寸} & \hyperref[subsec:header and footer]{页眉页脚} & \hyperref[subsec:catalog style]{目录样式} & \\ - thmset & geoset & hdrset & tocset & + hline{3} = {0.5pt,DarkBlue}, + row{1,3} = {font = \sffamily}, + row{2,4} = {cmd = \module*} } - - 例如使用下面\ref{subsec:style} 介绍的风格 \module*{style} 模块,路径名与所属下级选项之间可以 \code{/} 或 \code{=} 号分开,斜线 \code{/} 后不能有空格或者换行: - \begin{ctexexam} + \hyperref[subsec:tools]{工具} & \hyperref[subsec:font]{部件字体} & \hyperref[subsec:spread]{行距} & \hyperref[subsec:hyperlinks]{超链接} & \hyperref[subsec:reference]{参考文献} \\ + tools & font & spread & ref & bib \\ + \hyperref[subsec:theorem]{定理} & \hyperref[subsec:page margins]{页面尺寸} & \hyperref[subsec:header and footer]{页眉页脚} & \hyperref[subsec:catalog]{目录} & \\ + thmt & geo & hdr & toc & + \end{longtblr} + + \ref{exam:kv setting} 使用\ref{subsec:tools} 介绍的工具模块 \module*{tools} 举例三种键值列表设置方式:1. 各 \meta{模块名} 是统一接口 \cs*{ctexset} 的键路径。2. 不同模块还具有单独的接口命令 \cs*{eb}\meta{模块名}\code{\textcolor{cs}{set}}。3. \meta{模块名} 也可以使用 \cs*{ctexset} 命令的可选参数设置。路径名与所属下级选项之间可以 \code{/} 或 \code{=} 号分开,斜线 \code{/} 后不能有空格或者换行。 + \begin{ctexexam}[labelref = exam:kv setting] \ctexset { - style/color = seaside, - style = + tools/color = seaside, + tools = { fntnumwith = page, uppercase = first } } - \ebstyle{hyphen-figure = {-}} + \ctexset[tools]{spcmd = \color{red}} + \ebtoolsset{hyphen-figure = {-}} \end{ctexexam} - 文档类有三种选项:布尔型 \choicekey*{key}{true,false},选项的值为真 \code{true} 或假 \code{false},如果不指定默认为真。键值型 \key*{key}{value} 需要为选项指定值,后面 \code{=} 号不能省略。选择型 \choicekey*{key}{one,\fbox{two},three} 根据提供的可选值进行设定。 + \easybook{} 文档类有三种选项:布尔型 \choicekey*{key}{true,false},选项的值为真 \code{true} 或假 \code{false},如果不指定默认为真。键值型 \key*{key}{value} 需要为选项指定值,后面 \code{=} 号不能省略。选择型 \choicekey*{key}{one,\fbox{two},three} 根据提供的可选值进行设定。 \end{commands} -\subsection[风格]{风格\smodule{style}} -\label{subsec:style} +\subsection[工具]{工具\smodule{tools}} +\label{subsec:tools} \begin{options} \keychoice{color}{\fbox{none},seaside,energy,cyberpunk} - 预置了四种颜色主题,默认主题 \code{none} 为黑白页面,颜色主题不包括超链接。 + \easybook{} 预置了四种颜色主题,默认主题 \code{none} 为黑白页面,颜色主题不包括超链接。 \begin{commands} \command{DeclareThemeColor}[\splitmarg{风格名称,颜色1,颜色2,颜色3}] 声明新的颜色主题命令。它的参数以英文逗号分隔,第一部分为颜色风格名称,后面三部分为 \code{HTML} 颜色代码,构成主题颜色列表。其中 \meta{颜色1} 为标题标签,\meta{颜色2} 为列表编号、定理标签和公式编号括号,\meta{颜色3} 为代码抄录。类似地更改超链接颜色见\ref{subsec:hyperlinks}。 \begin{ctexexam} \DeclareThemeColor{fancy,2acb25,60aacc,ebc01c} - \ctexset{style/color = fancy} + \ctexset{tools/color = fancy} \end{ctexexam} \end{commands} \keyval{color-every}{HTML颜色代码} @@ -392,7 +392,7 @@ 设置行间公式标签的括号及格式,以英文逗号分隔,分别代表左右括号。\meta{左括号} 的末尾可以是带有一个参数的命令,用于接受公式编号。将标签括号设置为方括号,并给编号使用无衬线字体: \begin{ctexexam} \newcommand{\bracketsf}[1]{[\textsf{#1}} - \ebstyle{tagform = {\bracketsf,]}} + \ebtoolsset{tagform = {\bracketsf,]}} \end{ctexexam} \kvsplit-{figurepath}{\marg{路径名1}\marg{路径名2}$\cdots$\marg{路径名n}} 设置插入图片的文件夹路径名。可以有多个路径名,每个路径包含在花括号内分隔,只有一个路径时需要包含在两层括号内。 @@ -441,14 +441,14 @@ 上下标命令 \cs{supersub} 对应的上下标水平对齐方式,有左 \code{l}、居中 \code{c} 和右 \code{r} 三种对齐方式。 \end{options} -\subsection[超链接]{超链接\smodule{refset}} +\subsection[超链接]{超链接\smodule{ref}} \label{subsec:hyperlinks} -模块 \module*{refset} 将超链接选项交给 \pkg*{hyperref} 宏包处理。除了一些超链接颜色的选项失效,其它由宏包全局和接口命令 \cs*{hypersetup} 支持的多数选项可用。 +模块 \module*{ref} 将超链接选项交给 \pkg*{hyperref} 宏包处理。除了一些超链接颜色的选项失效,其它由宏包全局和接口命令 \cs*{hypersetup} 支持的多数选项可用。 \begin{options} \keychoice{linktype}{\fbox{edge},colors,none} 超链接类型。\code{edge} 使超链接形式为边框,\code{colors} 使超链接字体为彩色,\code{none} 关闭超链接边框与颜色,此时 \option{linkcolor} 选项无效。 \keychoice{linkcolor}{fresh,cutepink,\fbox{navyblue},crimson} - 超链接颜色样式。预置了四种超链接颜色风格。为使相关颜色能够正确显示,选项 \option{linkcolor} 应当在 \option{linktype} 前使用。 + 当超链接类型为 \code{colors} 时文本的颜色样式。预置了四种超链接颜色风格,默认为海军蓝 \code{navyblue}。 \begin{commands} \command{DeclareLinkColor}[\splitmarg{风格名称,颜色1,颜色2,颜色3}] 声明新的超链接颜色样式命令。它的参数以英文逗号分隔,第一部分为颜色风格名称,后面三部分为 \code{HTML} 颜色代码,构成超链接颜色列表。其中 \meta{颜色1} 为普通链接,\meta{颜色2} 为网址,\meta{颜色3} 为参考文献引用。 @@ -460,7 +460,7 @@ \end{options} \subsection[行距]{行距\smodule{spread}} -\label{subsec:spacing} +\label{subsec:spread} 行距因子用于设置各种行距倍数,\meta{数值} 是不带有长度单位的浮点数。各类行距既可以在导言区全局设置,也可以在正文中设置对后面生效。 \begin{options} \keyval{line}{数值} @@ -478,9 +478,9 @@ \keyval{caption-every}{数值}\Default{1.2} 同时设置图片、表格和代码题注的行距因子。 \keyval{footnote}{数值}\Default{1.2} - 脚注内容整体的行距因子。可以使用 \module*{hdrset} 模块 \option{fnpara-format} 选项的代码单独覆盖每个脚注的行距,从而使脚注间和内容文本自身的行距不同。 + 脚注内容整体的行距因子。可以使用 \module*{hdr} 模块 \option{fnpara-format} 选项的代码单独覆盖每个脚注的行距,从而使脚注间和内容文本自身的行距不同。 \begin{ctexexam} - \ebspread{footnote = 1.3} + \ebspreadset{footnote = 1.3} \ebhdrset{fnpara-format = \linespread{1.2}\selectfont} \end{ctexexam} \keyval{every}{数值} @@ -491,8 +491,8 @@ 行间公式与下面正文间的额外距离。 \end{options} -\subsection[其它字体]{其它字体\smodule{subfont}} -\label{subsec:other font} +\subsection[部件字体]{部件字体\smodule{font}} +\label{subsec:font} \begin{options} \keyval{caption-table}{字体命令}\Default{\cs*{sffamily}\cs*{small}} 设置表格题注的字体,包括字体族、字体系列、字体尺寸和字体形状命令。 @@ -509,15 +509,15 @@ \end{options} \begin{commands} - \command{addtosubfont}[\marg{字体类型}\marg{字体命令}] + \command{ebaddtofont}[\marg{字体类型}\marg{字体命令}] 用于在上述各种字体原有的格式上附加代码。其中 \meta{字体命令} 也可以包括行距命令且相对于 \module*{spread} 模块具有优先性,不同题注的 \meta{字体类型} 则为相应选项的后缀名。 \begin{ctexexam} - \addtosubfont{every}{\linespread{1.5}\selectfont} - \addtosubfont{footnote}{\sffamily} + \ebaddtofont{every}{\linespread{1.5}\selectfont} + \ebaddtofont{footnote}{\sffamily} \end{ctexexam} \end{commands} -\subsection[参考文献]{参考文献\smodule{bibset}} +\subsection[参考文献]{参考文献\smodule{bib}} \label{subsec:reference} \begin{options} \keychoice{backend}{\fbox{bibtex},biblatex} @@ -527,7 +527,7 @@ \keyval{citestyle}{标注风格} 标注参考文献的风格。后端为 \hologo{BibTeX} 时可使用 \option{super}(数字上标标注,默认)或 \option{numbers}(数字标注)等 \pkg*{natbib} 宏包带有的标注风格,后端为 \hologo{biber} 时可使用 \pkg*{biblatex} 宏包支持的标注风格。 \keyval{datafile}{数据库列表} - 参考文献数据库的文件名列表,文件列表以花括号包裹并以英文逗号分隔。使用 \hologo{biber} 处理时文件名要带 \code{bib} 扩展名,若参考文献文件不在当前文件夹则文件名需要包含路径,即 \code{path/file.bib}。不设置参考文献数据库名时 \module*{bibset} 模块中的选项会失效,即不自动载入 \pkg*{natbib} 或 \pkg*{biblatex} 宏包,此时需要手动载入相关宏包配置参考文献。 + 参考文献数据库的文件名列表,文件列表以花括号包裹并以英文逗号分隔。使用 \hologo{biber} 处理时文件名要带 \code{bib} 扩展名,若参考文献文件不在当前文件夹则文件名需要包含路径,即 \code{path/file.bib}。不设置参考文献数据库名时 \module*{bib} 模块中的选项会失效,即不自动载入 \pkg*{natbib} 或 \pkg*{biblatex} 宏包,此时需要手动载入相关宏包配置参考文献。 \end{options} \begin{commands} @@ -560,9 +560,9 @@ \end{ctexexam} \end{options} -\subsection[定理样式]{定理样式\smodule{thmset}} -\label{subsec:theorem of style} -模块 \module*{thmset} 由 \pkg*{thmtools} 宏包提供支持,主要提供了定理环境和样式声明两个命令。定理环境声明命令 \cs{declaretheorem} 使用的定理样式由样式声明命令 \cs{declaretheoremstyle} 提供,文档类预置了一个定理样式 \code{default},但未定义任何定理环境。 +\subsection[定理]{定理\smodule{thmt}} +\label{subsec:theorem} +定理模块 \module*{thmt} 由 \pkg*{thmtools} 宏包提供支持,主要提供了定理环境和样式声明两个命令。定理环境声明命令 \cs{declaretheorem} 使用的定理样式由样式声明命令 \cs{declaretheoremstyle} 提供,文档类预置了一个定理样式 \code{default},但未定义任何定理环境。 \begin{commands} \command{declaretheorem}[\oarg{键值列表1}\marg{环境名}\oarg{键值列表2}] 定理环境声明命令。可选参数的 \meta{键值列表1} 与 \meta{键值列表2} 等效,其中常用的选项如下: @@ -628,9 +628,35 @@ \end{ctexexam} \end{commands} -\subsection[页面尺寸]{页面尺寸\smodule{geoset}} +\begin{commands}\noitemsep + \command{listoftheorems}[\sarg\oarg{键值列表}]\default{} + \item\key{listoftheorems}{定理目录标题名} + \command{settheoremtocline}[\sarg\marg{环境名}\marg{标题定义}]\newtagv{2024bb}% + 对 \pkg*{thmtools} 宏包的定理环境目录命令 \cs{listoftheorems} 进行了适配调整,\ref{subsec:directory command} 和\ref{subsec:catalog} 中的选项机制均可用,但标题定义选项 \option{tocline} 较为特殊,需用 \cs{settheoremtocline} 命令单独设置。在 \meta{标题定义} 中有三个命令 \cs{thmtname}、\cs{thmtenvname} 和 \cs{thmtnote} 分别代表定理名、定理环境名和题注用于排版目录条目。 +\end{commands} + +\begin{commands} + \optpath{thmt/}\key{loeskip}{弹性长度}\Default{10pt} + 定理目录中每章第一个条目上方增加的垂直距离。与 \CTeX 的表格和图片目录中每章间的条目距离选项 \option*{lotskip} 和 \option*{lofskip} 类似,在 \cls*{article} 模式中此选项失效。 + \command{thmtifnote}[\marg{存在题注代码}\marg{不存在题注代码}] + 如果标题没题注即定理环境不用可选参数,则标题不加入定理目录,这是默认且合理的行为。若需要将无题注的标题加入目录可将 \meta{环境名} 加入目录风格的 \option{show} 选项或使用 \cs*{settheoremtocline}\code{*} 命令。是否存在题注需要在 \meta{标题定义} 中使用 \cs{thmtifnote} 命令判定,从而输出不同的内容。 + \command{thmtifname}[\marg{存在编号代码}\marg{不存在编号代码}] + 在 \meta{标题定义} 中测试当前定理是否有编号从而输出不同的内容,定理风格选项 \keyis{numbered}{no} 设置当前定理环境没有编号。 + \begin{ctexexam} + \contentsuse{caixiang}{loe} + \RegisterTocName{caixiang} + \setlisttheoremstyle{ignoreall,show = caixiang} + \settheoremtocline{caixiang} + {% + \listnumberline{caixiang} + \thmtname\thmtifnote{[\thmtnote]}{} + } + \end{ctexexam} +\end{commands} + +\subsection[页面尺寸]{页面尺寸\smodule{geo}} \label{subsec:page margins} -模块 \module*{geoset} 会将选项(除了前两个为附加)交给页面尺寸宏包 \pkg*{geometry} 处理,并且支持它的键值列表,预置的页面尺寸与 \textsf{Word} 的默认值接近。下面列举几种代表性选项,其它选项可查阅宏包帮助文档。当在此设置纸张规格时,会覆盖文类选项 \option{paper} 的设置。 +模块 \module*{geo} 会将选项(除了前两个为附加)交给页面尺寸宏包 \pkg*{geometry} 处理,并且支持它的键值列表,预置的页面尺寸与 \textsf{Word} 的默认值接近。下面列举几种代表性选项,其它选项可查阅宏包帮助文档。当在此设置纸张规格时,会覆盖文类选项 \option{paper} 的设置。 \begin{options}\noitemsep \keyval{headruleskip}{页眉线间距}\Default*{0pt} \keyval{footruleskip}{页脚线间距}\Default*{3.5pt} @@ -649,9 +675,9 @@ \end{ctexexam} \end{options} -\subsection[页眉页脚]{页眉页脚\smodule{hdrset}} +\subsection[页眉页脚]{页眉页脚\smodule{hdr}} \label{subsec:header and footer} -模块 \module*{hdrset} 设置的命令由 \pkg*{fancyhdr} 宏包提供支持。标题标记由标签和标题组成,选项中参数 \code{\#1} 代表当前章、节或小节的标题。在 \cls*{book} 模式时使用标题标记选项 \option{chap-mark} 和 \option{sec-mark},在 \cls*{article} 模式时使用 \option{sec-mark} 和 \option{subsec-mark} 选项,这与标准文档类的行为一致。重新设置标题标记选项时标记大小写选项 \option{uppercase} 会失效。 +模块 \module*{hdr} 设置的命令由 \pkg*{fancyhdr} 宏包提供支持。标题标记由标签和标题组成,选项中参数 \code{\#1} 代表当前章、节或小节的标题。在 \cls*{book} 模式时使用标题标记选项 \option{chap-mark} 和 \option{sec-mark},在 \cls*{article} 模式时使用 \option{sec-mark} 和 \option{subsec-mark} 选项,这与标准文档类的行为一致。重新设置标题标记选项时标记大小写选项 \option{uppercase} 会失效。 \begin{options} \keyval{chap-mark}{标题标记} \code{chapter} 级别标题标记的内容,包含了标签选项 \option{chap-label} 和章标题 \code{\#1}。 @@ -685,6 +711,16 @@ \end{options} \begin{commands}\noitemsep + \command{fancyhead}[\marg{风格名}\oarg{基础风格}\marg{风格定义}] + 定义名为 \meta{风格名} 的页面风格。\meta{风格定义} 中可包含设置页眉页脚不同位置格式的命令,如果为空则等于 \code{fancy} 风格。如果存在 \meta{基础风格},则在它的基础上进行定义。 + \begin{ctexexam} + \fancypagestyle{plain} + { + \fancyhf{} + \fancyfoot[C]{\textbf{--~\thepage~--}} + \ebhdrset{headrule = {}} + } + \end{ctexexam} \command{fancyhead}[\oarg{位置}\marg{内容}]\default{} \command{fancyfoot}[\oarg{位置}\marg{内容}] 为了确保页面显示正确,使用 \cs{fancyhead} 和 \cs{fancyfoot} 等命令设置页眉页脚时需要在页边距的命令之后。默认设置的是一个名为 \code{fancy} 的页面风格。\pkg*{fancyhdr} 将页眉页脚分成了左中右和奇数页(odd)、偶数页(even)共12个部分,可选参数中 \code{E} 和 \code{O} 代表偶数和奇数,\code{L}、\code{C} 和 \code{R} 代表左、中和右部分。单面打印时,含有偶数位置的命令无效。 @@ -708,8 +744,8 @@ \end{ctexexam} \end{commands} -\subsection[脚注格式]{脚注格式\smodule{hdrset}} -模块 \module*{hdrset} 还可以灵活调整脚注编号和内容的格式。格式主要包括脚注标记的编号类型、字体、附加符号和对齐方式等,以及脚注内容的首行缩进、行距和字体等。基本思想是提供常规和自定义标记(\code{fncustom})两种脚注,常规脚注的标记分为正文(\code{fnmark})和内容(\code{fntext})标记两种,且两者编号类型分离,自定义脚注的标记与其共享格式。目前脚注模块基本兼容 \pkg*{footmisc} 宏包。 +\subsection[脚注]{脚注\smodule{hdr}} +模块 \module*{hdr} 还可以灵活调整脚注编号和内容的格式。格式主要包括脚注标记的编号类型、字体、附加符号和对齐方式等,以及脚注内容的首行缩进、行距和字体等。基本思想是提供常规和自定义标记(\code{fncustom})两种脚注,常规脚注的标记分为正文(\code{fnmark})和内容(\code{fntext})标记两种,且两者编号类型分离,自定义脚注的标记与其共享格式。目前脚注模块基本兼容 \pkg*{footmisc} 宏包。 \begin{options} \keychoice{footnotetype}{plain,\fbox{hang},flush,bottom} 脚注的类型。悬挂缩进 \code{hang} 是默认值,\code{plain} 是原始的类型,\code{flush} 使脚注内容标记位于脚注首行边缘外侧并右对齐。当存在浮动环境排版时,脚注可能位于页面中间,\code{bottom} 使脚注始终位于页面底端。其中 \code{bottom} 是复合选项,可以与前三种类型重复或复合使用: @@ -801,9 +837,9 @@ \end{ctexexam} \end{commands} \keychoice{fnboth-format}{\textcolor{SlateGray}{format code},match} - 同时设定默认脚注标记 \option{fnmarktext-format} 和自定义脚注标记 \option{fncustom-format} 的格式。两种脚注标记匹配上标格式 \option{spcmd} 的值是独立的,使用 \code{match} 则可以同时匹配。会覆盖 \module*{subfont} 模块脚注字体选项 \option{footnote} 相同类型的命令,最后一个格式命令可以带有一个参数接受脚注标记。 + 同时设定默认脚注标记 \option{fnmarktext-format} 和自定义脚注标记 \option{fncustom-format} 的格式。两种脚注标记匹配上标格式 \option{spcmd} 的值是独立的,使用 \code{match} 则可以同时匹配。会覆盖 \module*{font} 模块脚注字体选项 \option{footnote} 相同类型的命令,最后一个格式命令可以带有一个参数接受脚注标记。 \keyval{fnpara-format}{格式代码} - 脚注内容文本的格式。会覆盖 \module*{subfont} 模块脚注字体选项 \option{footnote} 相同类型的命令,最后一个格式命令可以带有一个参数接受脚注内容文本。 + 脚注内容文本的格式。会覆盖 \module*{font} 模块脚注字体选项 \option{footnote} 相同类型的命令,最后一个格式命令可以带有一个参数接受脚注内容文本。 \kvsplit{fntext-code}{前代码,后代码} 可以用 \meta{前代码} 与 \meta{后代码} 额外增加脚注内容标记前后的代码。也可以只有前部分,\meta{前代码} 中最后一个格式命令可以带有一个参数接受脚注内容标记。由于脚注标记处于水平模式,可以配合盒子命令设置脚注内容标记的对齐方式,或在标记与脚注首行间插入一点距离。 \begin{ctexexam} @@ -815,46 +851,63 @@ \end{ctexexam} \end{options} -\subsection[目录样式]{目录样式\smodule{tocset}} -\label{subsec:catalog style} -模块 \module*{tocset} 将使用 \pkg*{titletoc} 宏包处理目录样式。默认包括 \module*{part}、\module*{chapter}、\module*{section}、\module*{subsection}、\module*{figure}、\module*{table} 和 \module*{lstlisting} 条目名的键路径,而使用 \module*{float} 路径可以统一设置图片、表格和代码目录的样式。选项前带有 \ding{73} 符号表示支持所有相应\textbf{条目名}的路径,其它选项则处于 \module*{tocset} 键路径下。目前支持多数学术论文目录样式,更复杂的样式可以查看 \pkg*{titletoc} 的相关用法。 +\subsection[目录]{目录\smodule{toc}} +\label{subsec:catalog} +模块 \module*{toc} 将使用 \pkg*{titletoc} 宏包处理目录样式。默认包括 \module*{part}、\module*{chapter}、\module*{section}、\module*{subsection}、\module*{figure}、\module*{table} 和 \module*{lstlisting} 条目名的键路径,而使用 \module*{float} 路径可以统一设置图片、表格和代码目录的样式。选项前带有 \ding{73} 符号表示支持所有相应\textbf{条目名}的路径,其它选项则处于 \module*{toc} 键路径下。目前支持多数学术论文目录样式,更复杂的样式可以查看 \pkg*{titletoc} 的相关用法。 \begin{options} \keyval{tocformat}{条目格式}\dtag - 目录中各类型条目的格式。可以设置条目字体和加入垂直间距等,垂直间距最好使用防止垂直间距重合的 \cs*{addvspace} 命令。 + 目录中各类型条目的格式。可以设置条目字体和加入垂直间距等,垂直间距最好使用防止垂直间距重合的 \cs*{addvspace} 命令。如果是段落型目录,格式代码仅在段落中当前级别条目前执行一次。 \keyval{tocformat+}{条目格式}\dtag 与选项 \option{tocformat} 用法一样,只是在已有的格式命令后附加代码。 + \keyval{tocformat*}{条目格式}\dtag + 没有编号/名字标题的附加格式代码。目录中判断标题是否有编号/名字的依据为:如果在 \option{tocline} 选项中使用了 \cs{numberline} 命令输出标签,则判定为有编号/名字。格式最后的命令可带有一个参数,用于接受标题内容。 \keyval{tocindent}{刚性长度}\dtag - 目录条目左边的缩进距离,通常标题级别越低缩进越大。 + 目录条目左边的缩进距离,通常标题级别越低缩进越大。如果是段落型目录,仅在当前条目级别为段落中最高时有效。 \keyval{tocrule}{引导线命令}\dtag - 引导线选项 \option{tocrule} 中一般可以使用基于 \cs*{xleaders} 命令的 \cs{tocrule} 绘制引导线。 + 目录条目的引导线和页码。引导线可以使用基于 \cs*{xleaders} 命令的 \cs{tocrule} 绘制(同时输出页码),如果是一般不需要引导线的段落型目录,可以使用 \cs{thecontentspage} 命令输出页码。 \begin{commands} \command{tocrule}[\sarg\harg\oarg{引导点间距}\darg{放大因子}\marg{引导点}\oarg{页码格式}] - 生成目录引导线的命令,需要在引导线选项 \option{tocrule} 中使用。带有星号的命令与 \keyis{dotalign}{false} 效果相同。命令带 \harg{} 号参数不添加目录页码,此时无格式的页码被保存在 \cs{thecontentspage} 命令中,可以配合盒子命令设置不同的页码左右间距和对齐方式。\meta{引导点间距} 需带有长度单位,\meta{放大因子} 为 \meta{引导点} 的放大倍数。\meta{页码格式} 中最后一个命令可以带有一个参数为页码编号。 + 生成目录引导线的命令,需要在引导线选项 \option{tocrule} 中使用。带有星号的命令与 \keyis{dotalign}{false} 效果相同。命令带 \harg{} 号参数不输出目录页码,此时无格式的页码被保存在 \cs{thecontentspage} 命令中,可以配合盒子命令设置不同的页码左右间距和对齐方式。\meta{放大因子} 为 \meta{引导点} 的放大倍数。\meta{页码格式} 中最后一个命令可以带有一个参数用于接受页码。 \end{commands} + \keyval{toclabel}{标题标签定义}\dtag\newtagv{2024as}% + 目录中各类型条目标题标签的定义,可与 \option{tocline} 选项联用设置标题。其中参数 \code{\#1} 代表标签的编号 \cs{thecontentslabel},参数 \code{\#2} 代表 \meta{条目名}。定义最后的命令可带有一个参数,用于接受标题内容,一些特殊情况例如需要将标题内容放在标签后,可以通过定义命令实现: + \begin{ctexexam} + \newcommand{\seqentry}[2]{#2-#1} % #2为标题内容 + \ctexset{chapter/toclabel = \seqentry{#1}} + \end{ctexexam} \keyval{tocafter}{距离命令}\dtag\Default{\cs*{hspace}\Marg{1em}} 目录条目标签与标题间的代码,默认为插入 \code{1em} 横向距离。 \keyval{tocbelow}{距离命令}\dtag 在目录条目下方执行的代码,可以插入垂直距离等命令。 - \keyval{tocline}{条目定义}\dtag[\textcolor{red}{\ding{73}}] + \keyval{tocline}{标题定义}\dtag[\textcolor{red}{\ding{73}}] 这个选项在章节标题基础上扩展了浮动环境的题注标题在目录文件中的定义。章节和题注标题选项中参数 \code{\#1} 代表标题编号 \cs*{the}\meta{计数器} 对应的计数器名称,参数 \code{\#2} 则代表相应标题内容。 \begin{ctexexam} \ctexset { - chapter = + chapter = { - tocformat = \addvspace{8pt}\large, - tocindent = 1.5em, - tocrule = \tocrule[0.6pc](1.1){.}[\zihao{5}], - tocline = \CTEXnumberline{#1}#2 + tocformat = \addvspace{8pt}\large, + tocindent = 1.5em, + tocrule = \tocrule[0.6pc](1.1){.}[\zihao{5}], + tocline = \CTEXnumberline{#1}#2 }, - section/tocrule = \tocrule-{}\makebox[1cm]{\rlap{\thecontentspage}} + section/toclabel = \contentspush{#1\hspace{0.5em}}, + section/tocrule = \tocrule-{}\makebox[1cm]{\rlap{\thecontentspage}} } \end{ctexexam} \end{options} \begin{commands} - \command{RegisterTocName}[\marg{条目名}] - 给条目类型名称为 \meta{条目名} 的标题注册用于设置目录样式的选项,即选项前有符号 \ding{73} 表示需要注册后使用。前面提到的条目类型均已注册,新类型的条目注册后选项初始值与图表条目相同。 + \command{RegisterTocName}[\sarg\marg{条目名}]\newtagv[Changed]{2024as}% + 给条目类型名称为 \meta{条目名} 的标题注册用于设置目录样式的选项,即选项前有符号 \ding{73} 表示需要注册后使用。前面提到的条目类型均已注册,新类型的条目注册后默认格式与图表条目相同。这个命令可以重复使用,会重置目录条目为默认格式。带有星号参数的命令使注册目录的条目形成一个段落,此时多出下面三个选项可用: + \begin{options} + \keyval{tocbegin}{开始代码}\dtag\newtagv{2024as}% + 当前级别目录条目第一个标题前的代码,仅在存在更高级别的条目时有效。 + \keyval{tocsep}{中间代码}\dtag\Default{\Marg{.—}}\newtagv{2024as}% + 当前级别目录条目每个标题之间的代码。 + \keyval{tocend}{结束代码}\dtag\Default{\Marg{.}}\newtagv{2024as}% + 当前级别目录条目最后一个标题后的代码。 + \end{options} \command{contentsuse}[\marg{条目名}\marg{扩展名}] 激活条目类型名称为 \meta{条目名} 的目录定制功能,它使用的目录文件后缀为 \meta{扩展名}。需要在激活条目后再使用命令 \cs{RegisterTocName} 注册选项。 \command{DeclareFloatList}[\marg{条目名}\marg{扩展名}] @@ -869,14 +922,14 @@ \DeclareFloatList{algorithm}{loa} \listofalgorithms[multoc] % 在正文中输出双栏算法目录 \end{ctexexam} - \command{AllotCaptionExt}[\marg{条目名}\marg{扩展名}]\newtag% + \command{AllotCaptionExt}[\marg{条目名}\marg{扩展名}] 给条目类型名称为 \meta{条目名} 的标题分配目录文件 \meta{扩展名},注意 \meta{扩展名} 需要被定义在 \cs*{ext@}\meta{条目名} 命令中才有效(\pkg*{caption} 宏包的默认定义形式)。可以使不同的 \meta{条目名} 共享一个目录: \begin{ctexexam} \AllotCaptionExt{table}{lof} \newcommand{\listoffiguretables}{\listoffigures} % 同时输出图表目录的命令 \end{ctexexam} \command{SetTocStyle}[\marg{条目名}\marg{风格名}\marg{键值列表}] - 定义条目类型名称为 \meta{风格名} 的目录风格。使用 \cs*{ctexset} 命令设置目录样式时,除了条目标题定义选项 \option{tocline},其它选项只有在目录输出命令前设置才有效,定义完目录风格后用 \cs{UseTocStyle} 命令可以在正文中任意位置生效。如果是没有 \ding{73} 符号的选项,\meta{条目名} 设置为 \module*{tocset}。 + 定义条目类型名称为 \meta{风格名} 的目录风格。使用 \cs*{ctexset} 命令设置目录样式时,除了条目标题定义选项 \option{tocline},其它选项只有在目录输出命令前设置才有效,定义完目录风格后用 \cs{UseTocStyle} 命令可以在正文中任意位置生效。如果是没有 \ding{73} 符号的选项,\meta{条目名} 设置为 \module*{toc}。 \command{UseTocStyle}[\marg{条目名}\marg{风格名}\marg{扩展名}] 使用对应条目类型名称为 \meta{风格名} 的目录风格,随后标题在目录中的格式会改变。本命令导言区和正文区均可使用,第三个必选参数还需要指定条目标题加入目录文件的 \meta{扩展名}。 \begin{ctexexam} @@ -902,7 +955,7 @@ \keyval{lolskip}{弹性长度}\Default{10pt} 代码目录中每章第一个条目上方增加的垂直距离。与 \CTeX 的表格和图片目录中每章间的条目距离选项 \option*{lotskip} 和 \option*{lofskip} 类似,在 \cls*{article} 模式中此选项失效。 \keyval{between}{代码钩子}\dtag[\textcolor{red}{\ding{73}}] - 目录标题与条目内容间的钩子(作用于标题下方间距之后),如果是 \cls*{book} 模式则默认插入 \code{-10pt} 垂直距离抵消首行目录的额外垂直间距,这是由于图表和 由 \pkg*{newfloat} 宏包所创建环境的目录默认每使用一次章标题在题注目录中插入 \code{10pt} 距离。除了条目名的键路径外,此选项也可用于 \module*{tocset} 路径中,表示章节标题目录标题代码钩子,如果是 \cls*{book} 模式则默认插入 \code{-1pc} 垂直距离。 + 目录标题与条目内容间的钩子(作用于标题下方间距之后),如果是 \cls*{book} 模式则默认插入 \code{-10pt} 垂直距离抵消首行目录的额外垂直间距,这是由于图表和 由 \pkg*{newfloat} 宏包所创建环境的目录默认每使用一次章标题在题注目录中插入 \code{10pt} 距离。除了条目名的键路径外,此选项也可用于 \module*{toc} 路径中,表示章节标题目录标题代码钩子,如果是 \cls*{book} 模式则默认插入 \code{-1pc} 垂直距离。 \keyval{bibetween}{代码钩子} 与选项 \option{between} 类似,是英文章节标题目录(如果启用)标题代码钩子。 \keychoice{dotalign}{\fbox{true},false} @@ -935,6 +988,7 @@ \subsection{目录命令} \label{subsec:directory command} +\easybook{} 改进了标准文档类中定制性较低的章节标题和图表标题目录命令。现在目录命令带有可选参数用于设置标题格式和栏数等,并且与标准文档类不同的是目录命令可在正文中\textbf{重复}使用。更多目录命令的创建和样式设置可参考\ref{subsec:catalog}。 \begin{commands} \command{tableofcontents}[\sarg\oarg{键值列表}\darg{代码钩子}] 章节标题目录命令,支持中英文双语标题目录输出。带有星号参数不输出目录条目上方的标题。\meta{代码钩子} 是当输出方案 \keyis{plan}{both} 时中文与英文目录之间执行的代码,可以插入设置目录样式和换页等命令。 @@ -1001,7 +1055,7 @@ \end{options} \end{commands} -\subsection[双语标题]{双语标题\smodule{chapter}} +\subsection{双语章节标题和新建标题} 双语目录标题命令目前设置了常用的三个级别,它们将中文标题正常输出,并使中英文标题加入双语目录。类似于标准文档类,这三个标题命令分别具有独立的计数器\footnote{默认情况下与普通标题命令共享使用计数器。},并对应 \cs*{the}\meta{计数器} 的值,可以用于 \option{number} 选项更改英文目录中标题的编号格式。这个功能是为国内一些高校的学位论文模板的要求设计,在一般情况和英文模式下\textbf{不需要使用}。 \begin{commands} \command{bichapter}[\sarg\oarg{目录中文标题}\marg{中文标题}\marg{目录英文标题}] @@ -1011,31 +1065,47 @@ \command{bisubsection}[\sarg\oarg{目录中文标题}\marg{中文标题}\marg{目录英文标题}] \code{subsection} 小节级别的双语目录标题命令,具有独立的 \code{bisubsection} 计数器。 - 它们的星号变体命令使文中标题不编号,但是仍然加入双语目录,若英文标题参数空置那么仅加入中文目录而不加入英文目录,这一特点与 \cs*{chapter}\sarg{} 等命令的行为不太一样,在一些情况下会用到。可选参数是目录中的中文条目,默认与中文标题一致,正文标题过长时可用它设置在目录中显示的标题。默认情况下双语目录条目的格式是一致的,共享使用 \module*{tocset} 模块的设置。提供了两个选项 \option{biname} 和 \option{binumber} 修改英文目录章标题条目的名字及编号: + 它们的星号变体命令使文中标题不编号,但是仍然加入双语目录,若英文标题参数空置那么仅加入中文目录而不加入英文目录,这一特点与 \cs*{chapter}\sarg{} 等命令的行为不太一样,在一些情况下会用到。可选参数是目录中的中文条目,默认与中文标题一致,正文标题过长时可用它设置在目录中显示的标题。默认情况下双语目录条目的格式是一致的,共享使用 \module*{toc} 模块的设置。提供了两个选项 \option{biname} 和 \option{binumber} 修改英文目录章标题条目的名字及编号: \begin{options} - \kvsplit{biname}{英文目录前名字,英文目录后名字}\Default{Chapter\cs*{space}} + \optpath{chapter/}\kvsplit+{biname}{英文目录前名字,英文目录后名字}\Default{Chapter\cs*{space}} 更改英文目录 \code{chapter} 级别的标题条目编号前后名字,类似于 \CTeX 的 \option*{name} 选项。 - \keyval{binumber}{英文目录编号输出命令}\Default{\cs*{arabic}\Marg{chapter}} + \optpath{chapter/}\key{binumber}{英文目录编号输出命令}\Default{\cs*{arabic}\Marg{chapter}} 更改英文目录 \code{chapter} 级别的标题条目编号输出格式,类似于 \CTeX 的 \option*{number} 选项。下面两种设置英文目录中章标题编号的方式等效: \end{options} \begin{ctexexam} \ctexset{chapter/binumber = \arabic{chapter}} - \BeforeAddBitoc{\ctexset{chapter/nmuber = \arabic{chapter}}} + \BeforeAddtoBitoc{\ctexset{chapter/nmuber = \arabic{chapter}}} \end{ctexexam} \end{commands} \begin{commands} \command{appendix}[\splitoarg{前名字,后名字}\darg{编号输出命令}] 附录起始命令,其后的章节标题变为附录形式。\meta{前名字} 为英文目录中附录标题的前名字,同理 \meta{后名字} 为英文目录中附录标题的后名字。前后名字之间用一个半角逗号分开,也可以只有一部分,表示英文目录中附录标题前名字。\meta{编号输出命令} 为附录标题计数器在英文目录中的编号命令。注意这两个参数仅对 \code{bichapter} 级别的标题生效。 - \command{BeforeAddBitoc}[\sarg\marg{英文标题加入目录前的代码}] + \command{BeforeAddtoBitoc}[\sarg\marg{英文标题加入目录前的代码}] 作用于局部范围的英文目录标题条目钩子,代码在标题加入目录前执行,可以插入条目标题定义命令临时改变英文目录中条目的格式,带有星号参数的命令会重置之前的代码。这个命令设置英文目录条目的标题格式具有最高优先级,放置在导言区或 \cs{bichapter} 等双语标题命令前生效。举一个在英文目录节标题条目编号前添加 \code{Section} 字符串的例子: \begin{ctexexam} - \BeforeAddBitoc{\ctexset{section/name = Section\space}} + \BeforeAddtoBitoc{\ctexset{section/name = Section\space}} \bisection{中文标题}{English title} \end{ctexexam} \end{commands} -\subsection[上标和下标]{上标和下标\smodule{style}} +\begin{commands} + \command{NewTitleCommand}[\marg{条目名}\marg{章节层次}]\newtagv{2024aw}% + 创建一个命令名为 \meta{条目名} 新章节标题,并且支持 \CTeX 中的标题样式选项机制,默认的标题格式为空。同时创建一个名为 \meta{条目名} 的计数器和标记命令 \code{\textbackslash}\meta{条目名}\code{\textcolor{cs}{mark}}。同时还需指定标题的 \meta{章节层次},例如标准文档类中 \code{chapter} 级别为 \code{0}。 + \command{NewTitleEntryCommand}[\oarg{扩展名}\marg{条目名}]\newtagv{2024aw}% + 创建一个命令 \code{\textbackslash}\meta{条目名}\code{\textcolor{cs}{entry}}\marg{标题},仅将 \meta{标题} 加入文件扩展名为 \meta{扩展名} 的目录中,而不在正文中输出标题,默认扩展名为 \code{toc}。 + \begin{ctexexam} + \NewTitleCommand{lchapter}{0} + \NewTitleEntryCommand{lchapter} + \contentsuse{lchapter}{toc} + \RegisterTocName{lchapter} + \ctexset{lchapter/number = \thechapter} + \lchapter{正常标题} + \lchapterentry{加入目录的标题} + \end{ctexexam} +\end{commands} + +\subsection[上标和下标]{上标和下标\smodule{tools}} 上标和下标的功能来自 \pkg*{spbmark} 宏包,下面有三个命令可以用于输出上标和下标。可以使用键值列表的形式对上下标格式进行局部或全局设置,下面命令中两个可选参数的键值列表是等效的。全局设置的详情见\ref{subsubsec:super-sub-script},更多命令和详细用法见 \pkg*{spbmark} 宏包说明文档。 \begin{commands} \command{super}[\sarg\oarg{键值列表1}\marg{内容}\oarg{键值列表2}] @@ -1227,9 +1297,10 @@ \section{扩展功能} \subsection{物理量} +使用 \pkg*{siunitx} 宏包提供国际单位制的物理量支持。\pkg*{siunitx} 宏包旨在为 \LaTeX 用户提供一种统一的方法,以便正确、轻松地排版数字和单位。\pkg*{siunitx} 的设计理念是默认遵循约定的规则,但允许通过选项设置进行更改。 \begin{commands} \command{num}[\oarg{键值列表}\marg{数字}] - \pkg*{siunitx} 宏包的 \cs{num} 命令可以输出以科学计数法表示的数值。 + \cs{num} 命令可以输出以科学计数法表示的数值。 \command{unit}[\oarg{键值列表}\marg{单位}] 单位格式化命令 \cs{unit} 包含文字元素(例如字母或数字)时,使用 \Marg{.} 和 \code{\~{}} 放置在单元乘积中间,并使用 \code{\_{}} 和 \code{\^{}} 正确放置指定的下标和上标。格式化方法可在数学和文本模式下使用。 \command{qty}[\oarg{键值列表}\marg{数字}\oarg{前缀}\marg{单位}] @@ -1245,9 +1316,10 @@ \end{commands} \subsection{化学式} +除了以普通公式的方式,化学式的输出还可用 \pkg*{chemformula} 宏包实现。\pkg*{chemformula} 的工作原理与 \pkg*{mhchem} 非常相似,但对化合物、化学计量数和箭头的输入方式更为严格。同时 \pkg*{chemformula} 提供了多种自定义输出的可能性。 \begin{commands} \command{ch}[\oarg{键值列表}\marg{化学式}] - 除了以普通公式的方式,化学式还可用 \pkg*{chemformula} 实现。无机化学式使用 \cs{ch} 命令书写。化合物表达式中的原子数不需要加下标符号,化学计量数与表达式间隔一个空格。 + 无机化学式使用 \cs{ch} 命令书写。化合物表达式中的原子数不需要加下标符号,化学计量数与表达式间隔一个空格。 \begin{ctexexam} \ch{[Cu(NH3)4]^2+} \ch{Cu2S + 2 O2 - 2 e^- == 2 Cu^2+ + SO4^2-} @@ -1284,6 +1356,7 @@ \end{commands} \subsection{图表题注} +\pkg*{caption} 宏包提供了多种方法来定制浮动环境(例如 \env{figure} 和 \env{table})中的标题,并可与许多其它宏包配合使用。功能包括旋转题注、侧向题注和连续题注等。 \begin{commands} \command{captionsetup}[\oarg{条目名}\marg{键值列表}] 这是 \pkg*{caption} 宏包的接口命令,\meta{键值列表} 提供多个选项更改图表题注的格式。题注主要由三部分组成:标题标签即图表名与题注编号的组合,标题文本本身通常是内容的简短描述,以及将文本与标签分开的题注分隔符。可以在导言区设置整体格式,也可以在正文使用局部更改格式。 @@ -1299,7 +1372,7 @@ \subsection{索引} \begin{commands} \command{indexsetup}[\marg{键值列表}] - \pkg*{imakeidx} 宏包增强了索引的功能。这是它的的接口命令,用于设置索引表的整体格式。 + \pkg*{imakeidx} 宏包增强了索引的功能,可使用户在制作和排版文档的同时制作一个或多个索引。这是 \pkg*{imakeidx} 宏包的接口命令,用于设置索引表的整体格式。 \command{index}[\oarg{索引名}\marg{标签}] 索引标签命令的可选参数可以用不同的 \meta{索引名} 给多个索引表设置标签。 \command{makeindex}[\oarg{键值列表}] @@ -1420,6 +1493,16 @@ \item 新增行间公式与正文上下间距选项 \option{abovedisplayskip} 和 \option{belowdisplayskip}。 \item 新增目录文件扩展名分配命令 \cs{AllotCaptionExt}。 \end{version} + \shortversion{v = 2024aq,date = 2022/03/31,changes = 修复命令 \cs{ebifbitoc} 用于条目缩进选项 \option{tocindent} 失效的问题。} + \begin{version}[v = 2024as,date = 2024/04/19] + \changed + \item 目录条目样式注册命令 \cs{RegisterTocName} 增加星号参数,支持设置段落型目录。 + \added + \item 新增目录条目标题标签定义的选项 \option{toclabel}。 + \item 新增段落型目录条目附加代码的选项 \option{tocbegin}、\option{tocsep} 和 \option{tocend}。 + \end{version} + \shortversion{v = 2024aw,date = 2022/04/22,changes = 新增新建章节标题命令 \cs{NewTitleCommand} 和 \cs{NewTitleEntryCommand}。} + \shortversion{v = 2024bb,date = 2022/04/26,changes = 增加对 \pkg*{thmtools} 宏包定理环境目录 \cs{listoftheorems} 的支持。} \end{changelog} \nocite{*} |