diff options
Diffstat (limited to 'macros/latex/contrib/easybook/easybook.dtx')
-rw-r--r-- | macros/latex/contrib/easybook/easybook.dtx | 630 |
1 files changed, 386 insertions, 244 deletions
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx index 511b24fa08..6901466a86 100644 --- a/macros/latex/contrib/easybook/easybook.dtx +++ b/macros/latex/contrib/easybook/easybook.dtx @@ -12,15 +12,15 @@ % LaTeX version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. +%<class|package>\NeedsTeXFormat{LaTeX2e}[2021/11/15] %<*class> -\NeedsTeXFormat{LaTeX2e}[2021/11/15] -\ProvidesExplClass{easybook}{2024/05/24}{2024bu} +\ProvidesExplClass{easybook}{2024/08/01}{2024dc} {Easily typesetting Chinese theses or books} \bool_new:N \l__eb_compile_draft_bool \bool_new:N \l__eb_title_newline_bool -\bool_set_true:N \l__eb_class_mode_book_bool -\clist_new:N \g__eb_doc_options_clist +\bool_set_true:N \l__eb_class_mode_book_bool +\clist_new:N \g__eb_doc_options_clist \cs_new_protected:Npn \eb_put_ctexbook:n #1 { \PassOptionsToClass{#1}{ctexbook} } \cs_generate_variant:Nn \eb_put_ctexbook:n { V } @@ -66,10 +66,11 @@ \sys_if_engine_xetex:TF { - \cs_new_eq:NN \eb_set_family:nnn \xeCJK_set_family:nnn + \cs_new_eq:NN \eb_set_family:nnn \xeCJK_set_family:nnn \cs_new_eq:NN \eb_switch_family:n \xeCJK_switch_family:n - }{ - \cs_new_eq:NN \eb_set_family:nnn \ctex_ltj_set_family:nnn + } + { + \cs_new_eq:NN \eb_set_family:nnn \ctex_ltj_set_family:nnn \cs_new_eq:NN \eb_switch_family:n \ctex_ltj_switch_family:n } \cs_generate_variant:Nn \eb_set_family:nnn { x } @@ -89,13 +90,13 @@ { main,sans,mono,CJKmain,CJKsans,CJKmono } { \exp_args:Nc \RenewDocumentCommand { set#1font }{O{}mO{}} - {\use:c { eb_set#1font:nn } {##2} {##1,##3}} + {\use:c { eb_set#1font:nn } {##2} { ##1,##3 }} } \RenewDocumentCommand{\newCJKfontfamily}{omO{}mO{}} { \tl_set:Nx \l_tmpa_tl { \tl_if_novalue:nTF {#1} { \cs_to_str:N #2 } {#1} } \cs_new_protected:Npx #2 { \eb_switch_family:n { \l_tmpa_tl } } - \eb_set_family:xnn { \l_tmpa_tl } {#3,#5} {#4} + \eb_set_family:xnn { \l_tmpa_tl } { #3,#5 } {#4} } \cs_new_protected:Npn \eb@font@load@noto @@ -261,8 +262,8 @@ { \par\nobreak\vskip 1.5pc } { \hspace{1em} } }, - beforeskip = -1.5ex, - afterskip = 4ex + beforeskip = 0pt, + afterskip = 25pt }, section = { @@ -299,9 +300,8 @@ } %</class> %<*package> -\NeedsTeXFormat{LaTeX2e}[2021/11/15] \RequirePackage{etoolbox} -\ProvidesExplPackage{easybase}{2024/05/24}{2024bu} +\ProvidesExplPackage{easybase}{2024/08/01}{2024dc} {Easily typesetting Chinese theses or books} \cs_generate_variant:Nn \dim_set:Nn { NV } @@ -313,7 +313,7 @@ \cs_generate_variant:Nn \seq_set_from_clist:Nn { No } \cs_generate_variant:Nn \ctex_define:nn { nx } \cs_generate_variant:Nn \eb_set_hyperref:n { x } -\cs_generate_variant:Nn \eb_at_begin_environment:nn { on } +\cs_generate_variant:Nn \eb_at_begin_environment:nn { o } \cs_generate_variant:Nn \tl_if_novalue:nF { V } \cs_set_protected:Npn \ctex_define:nn #1 @@ -372,20 +372,28 @@ \IfNoValueTF{#1} {\IfFileExists{#2.sty}{\RequirePackage{#2}[#3]}{}} {\IfFileExists{#2.sty}{\RequirePackage[#1]{#2}[#3]}{}} + \IfFileExists{#2.sty}{} + {\msg_warning:nnn { easybase } { package-not-found } {#2}} } +\msg_new:nnn { easybase } { package-not-found } + { The~macro~package~'#1'~can't~be~found. } \cs_new_protected:Npn \ebloadpackage #1 { \int_compare:nTF { \clist_count:n {#1} <= 1 } - { \RequirePackage } + { \RequirePackage{#1} } { \clist_map_inline:nn {#1} { \eb_match_load_package:n {##1} } } } +\providecommand{\NewHookWithArguments}[2]{} +\ProvideDocumentCommand{\AddToHookWithArguments}{mo+m}{} \bool_set_true:N \l__eb_class_mode_book_bool \bool_set_false:N \l__eb_compile_draft_bool \clist_new:N \g__eb_ctex_options_clist +\cs_new_protected:Npn \eb_put_geometry:n #1 + { \PassOptionsToPackage{#1}{geometry} } \keys_define:nn { easybase } { @@ -400,16 +408,19 @@ theorem .bool_set:N = \l__eb_theorem_support_bool, theorem .default:n = true, theorem .initial:n = true, - paper .code:n = \PassOptionsToPackage{#1}{geometry}, + paper .code:n = \eb_put_geometry:n {#1}, paper .initial:n = a4paper, class .choice:, class .value_required:n = true, - class/book .code:n = { }, + class/book .code:n = + { + \bool_set_true:N \l__eb_class_mode_book_bool + \eb_put_geometry:n { twoside } + }, class/article .code:n = { \bool_set_false:N \l__eb_class_mode_book_bool - \boolfalse{@twoside} - \boolfalse{@mparswitch} + \eb_put_geometry:n { twoside = false } }, class .initial:n = book, book .meta:n = { class = book }, @@ -441,7 +452,7 @@ \seq_set_from_clist:Nn \l__eb_module_paths_seq { - tools,font,spread, + tools,font,space, bib,thmt,toc, hdr,float,ref,geo } @@ -450,7 +461,7 @@ \ctex_define:n { #1 .meta:nn = { ctex/#1 } {##1} } \cs_new_protected:cpn { eb#1set } ##1 { \ctex_set:nn {#1} {##1} } } -\RenewDocumentCommand{\ctexset}{om} +\RenewDocumentCommand{\ctexset}{o+m} { \IfValueTF{#1} {\ctex_set:nn {#1} {#2}} @@ -552,7 +563,15 @@ tagform .code:n = \eb_assign_tagform:n {#1}, tagform .initial:n = { (,) }, brackets .meta:n = { tagform = {#1} }, - figurepath .tl_set:N = \l_eb_graphics_path_tl + figurepath .code:n = + { + \tl_if_blank:nF {#1} + { + \regex_match:nnTF { \cB. } {#1} + { \graphicspath{#1} } + { \graphicspath{{#1}} } + } + } } \includepdfset{fitpaper = true} @@ -587,8 +606,7 @@ \cs_new_protected:Npn \blankpagestyle #1 { \tl_set:Nn \l__eb_blank_pagestyle_tl {#1} } \blankpagestyle{empty} -\RenewDocumentCommand{\cleardoublepage} - {O{\l__eb_blank_pagestyle_tl}} +\RenewDocumentCommand{\cleardoublepage}{O{\l__eb_blank_pagestyle_tl}} { \clearpage \ifbool{@twoside} @@ -609,19 +627,6 @@ \booltrue{@mainmatter} \pagenumbering{arabic} } -\clist_map_inline:nn - { chapter,section,subsection } - { - \exp_args:Nc \NewDocumentCommand { eb@mark@#1@label@layout } - {O{\use:c { CTEXthe#1 }}m} - {\tl_set:cn { eb@mark@#1@label } {##1##2}} - \cs_new_protected:cpn { eb_mark_#1_name_parse:n } ##1 - { - \regex_match:nnTF { \[.*\] } {##1} - { \use:c { eb@mark@#1@label@layout }##1 } - { \use:c { eb@mark@#1@label@layout }{##1} } - } - } \NewDocumentCommand{\markrule} {O{\textwidth}D(){ctex@frame}m>{\SplitArgument{1}{|}}O{}} {\eb_draw_markrule:nnnnn {#1} {#2} {#3} #4} @@ -642,32 +647,49 @@ { none* } { \text_lowercase:n } } } -\ctex_define:nn { hdr } +\cs_new_protected:Npn \eb@register@hdr@mark #1 { - chap-mark .cs_set:Np = \eb@mark@chapter@whole #1, - chap-mark .initial:n = - { - \CTEXifname{\eb@mark@chapter@label}{} - \eb_mark_uppercase_case_init:n {#1} - }, - sec-mark .cs_set:Np = \eb@mark@section@whole #1, - sec-mark .initial:n = + \exp_args:Nc \NewDocumentCommand { eb@mark@#1@label@layout } + {O{\use:c { CTEXthe#1 }}m} + {\tl_set:cn { eb@mark@#1@label } {##1##2}} + \cs_new_protected:cpn { eb_mark_#1_name_parse:n } ##1 { - \CTEXifname{\eb@mark@section@label}{} - \eb_mark_uppercase_case_init:n {#1} - }, - subsec-mark .cs_set:Np = \eb@mark@subsection@whole #1, - subsec-mark .initial:n = + \regex_match:nnTF { ^\[.*\] } {##1} + { \use:c { eb@mark@#1@label@layout }##1 } + { \use:c { eb@mark@#1@label@layout }{##1} } + } + \ctex_define:nn { hdr } { - \CTEXifname{\eb@mark@subsection@label}{} - \eb_mark_uppercase_case_init:n {#1} - }, - chap-label .code:n = \eb_mark_chapter_name_parse:n {#1}, - chap-label .initial:n = \hspace{1em}, - sec-label .code:n = \eb_mark_section_name_parse:n {#1}, - sec-label .initial:n = \hspace{0.5em}, - subsec-label .code:n = \eb_mark_subsection_name_parse:n {#1}, - subsec-label .initial:n = \hspace{0.5em}, + #1-mark .cs_set:cp = { eb@mark@#1@whole } ##1, + #1-mark .initial:n = + { + \CTEXifname{\use:c { eb@mark@#1@label }}{} + \eb_mark_uppercase_case_init:n {##1} + }, + #1-label .code:n = \use:c { eb_mark_#1_name_parse:n } {##1}, + } + } +\cs_new_protected:Npn \RegisterHdrMark #1 + { + \clist_map_function:nN {#1} + \eb@register@hdr@mark + } +\RegisterHdrMark{chapter,section,subsection} + +\ctex_set:nn { hdr } + { + chapter-label = \hspace{1em}, + section-label = \hspace{0.5em}, + subsection-label = \hspace{0.5em} + } +\ctex_define:nn { hdr } + { + chap-mark .meta:n = { chapter-mark = {#1} }, + sec-mark .meta:n = { section-mark = {#1} }, + subsec-mark .meta:n = { subsection-mark = {#1} }, + chap-label .meta:n = { chapter-label = {#1} }, + sec-label .meta:n = { section-label = {#1} }, + subsec-label .meta:n = { subsection-label = {#1} }, headrulewd .dim_set:N = \eb@head@rule@wd, headrulewd .initial:n = 0.5pt, footnoterulewd .dim_set:N = \eb@footnote@rule@wd, @@ -719,8 +741,6 @@ \ctex_at_end_preamble:n { \bool_if:NF \l__eb_ps_used_bool { \pagestyle{fancy} } - \tl_if_blank:VF \l_eb_graphics_path_tl - { \exp_args:NV \graphicspath \l_eb_graphics_path_tl } \providecommand{\kaishu}{\itshape} } @@ -786,7 +806,7 @@ \UseFntSymbsList{empty} \cs_set_eq:NN \DefineFntSymbols \SetFntSymbsList \cs_set_eq:NN \setfntsymbol \UseFntSymbsList -\cs_new:Npn \eb_int_format_trans:NN #1 +\cs_new:Npn \eb_int_type_trans:NN #1 { \str_case:nn {#1} { @@ -821,29 +841,44 @@ } \cs_set_eq:NN \thedownfootnote \thefootnote } +\cs_generate_variant:Nn \msg_warning:nnnn { nnnV } \cs_new_protected:Npn \eb_fnmarktext_short_label_set:Nn #1#2 { \tl_set:Nn \l__eb_fnmarktext_short_tokens_tl {#2} \clist_map_inline:nn { A,a,1,I,i,c,s } { - \regex_match:nnT {##1} {#2} + \regex_match:nnTF {##1} {#2} { \regex_replace_once:nnN {##1} - { \c{eb_int_format_trans:NN} ##1 \c{c@footnote} } + { \c{eb_int_type_trans:NN} ##1 \c{c@footnote} } \l__eb_fnmarktext_short_tokens_tl - \seq_map_break: + \cs_set_eq:NN #1 \l__eb_fnmarktext_short_tokens_tl + \clist_map_break: + } + { + \str_if_eq:nnT {##1} { s } + { + \str_if_eq:nnTF {#1} { \thefootnote } + { \str_set:Nn \l_tmpa_str { \thedownfootnote } } + { \str_set:Nn \l_tmpa_str { \theupfootnote } } + \msg_warning:nnnV { easybase } { unknown-fnt-type } {#2} \l_tmpa_str + } } } - \cs_set_eq:NN #1 \l__eb_fnmarktext_short_tokens_tl \cs_set_eq:NN \thedownfootnote \thefootnote } +\msg_new:nnn { easybase } { unknown-fnt-type } + { + The~'#1'~includes~unknown~footnote~numbering~type \\ + in~#2. + } \cs_new_protected:Npn \eb_footnote_value_handle:n #1 { \str_case:nnF {#1} { { bottom } - { \bool_set_true:N \l__eb_fnpara_bottom_bool } + { \PushFntBottom } { flush } { \tl_set:Nn \l__eb_footnote_value_tl { plain } @@ -876,7 +911,6 @@ } } -\bool_new:N \l__eb_fnpara_bottom_bool \tl_new:N \l__eb_fnmarktext_format_tl \tl_new:N \l__eb_fncustom_format_tl \clist_new:N \l__eb_footnote_value_clist @@ -934,58 +968,91 @@ { page } { \counterwithin*{footnote}{page} } } { \counterwithout*{footnote}{chapter} } - \eb_fnpara_if_pos_bottom: } -\cs_new_protected:Npn \setspread #1 { \linespread{#1}\selectfont } -\cs_new:Npn \eb@ifvoid #1#2#3 { \ifvoid #1#2\else #3\fi } -\cs_new_protected:Npn \eb_fnpara_if_pos_bottom: + +\def\@if@footnotes@TF #1#2 {\ifvoid\footins #2\else #1\fi} +\def\@outputbox@removebskip { - \bool_if:NT \l__eb_fnpara_bottom_bool + \ifx\@textbottom\relax\else + \@outputbox@append + { + \@tempskipa\lastskip + \ifnum\gluestretchorder\@tempskipa>\z@ + \vskip -\@tempskipa + \xdef\@outputbox@reinsertbskip + {\noexpand\@outputbox@append{\vskip\the\@tempskipa}} + \else + \global\let\@outputbox@reinsertbskip\relax + \fi + } + \fi + } +\let\@outputbox@reinsertbskip\relax +\def\@outputbox@append #1 + { + \setbox\@outputbox\vbox + { + \boxmaxdepth\@maxdepth + \dimen@\dp\@outputbox + \unvbox\@outputbox + #1 + } + } +\def\@outputbox@attachfloats{\@combinefloats} +\NewHook{makecol/footins/before} +\NewHook{makecol/footins/begin} +\def\@outputbox@appendfootnotes + { + \@if@footnotes@TF { - \IfPackageLoadedTF{footmisc} - {\msg_warning:nn { easybase } { bottom-not-compatible }} + \UseHook{makecol/footins/before} + \@outputbox@append { - \cs_set:Npn \@makecol - { - \setbox\@outputbox\box\@cclv - \let\@elt\relax - \xdef\@freelist{\@freelist\@midlist} - \global\let\@midlist\@empty - \@combinefloats - \eb@ifvoid\footins{} - { - \setbox\@outputbox\vbox - { - \boxmaxdepth\@maxdepth - \unvbox\@outputbox - \vfill\relax - \vskip\skip\footins - \color@begingroup - \normalcolor\footnoterule - \unvbox\footins - \color@endgroup - } - } - \eb@ifvoid\@kludgeins - {\@makespecialcolbox} - { - \setbox\@outputbox\vbox to\@colht - { - \@texttop\dimen@\dp\@outputbox - \unvbox\@outputbox - \vskip -\dimen@\@textbottom - } - } - \global\maxdepth\@maxdepth - } + \vskip\skip\footins + \UseHook{makecol/footins/begin} + \color@begingroup + \normalcolor + \footnoterule + \@nameuse{pdfcolfoot@current} + \unvbox\footins + \color@endgroup } + }{} + } +\def\@makenormalcolbox + { + \setbox\@outputbox\vbox to\@colht + { + \@texttop + \dimen@\dp\@outputbox + \unvbox\@outputbox + \vskip -\dimen@ + \@textbottom } } -\msg_new:nnn { easybase } { bottom-not-compatible } +\cs_new_protected:Npn \PushFntBottom { - Not~compatible~with~the~'footmisc'~package. \\ - Please~use~the~'bottom'~option~of~'footmisc'~package. + \cs_set:Npn \@makecol + { + \setbox\@outputbox\box\@cclv + \@outputbox@removebskip + \let\@elt\relax + \xdef\@freelist{\@freelist\@midlist} + \global\let\@midlist\@empty + \@outputbox@attachfloats + \@if@footnotes@TF + {\@outputbox@append{\vfill}} + {\@outputbox@reinsertbskip} + \@outputbox@appendfootnotes + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \@makenormalcolbox + \fi + \global\maxdepth\@maxdepth + } } +\@onlypreamble\PushFntBottom \cs_new_protected:Npn \eb_footnote_direct_hang: { @@ -1008,7 +1075,7 @@ { \noindent \clist_if_in:NnT \l__eb_footnote_value_clist { flush } - { \dim_zero:N \fnfirstindent } + { \tl_set:Nn \fnfirstindent { 0pt } } \int_case:nn { \dim_sign:V \fnfirstindent } { { 1 } { \use_i:nnn } @@ -1041,6 +1108,7 @@ \l__eb_fnpara_format_tl{#1} \tl_if_eq:NnT \l__eb_footnote_value_tl { hang } { \par } } +\cs_new_protected:Npn \setspread #1 { \linespread{#1}\selectfont } \clist_map_inline:nn { \@footnotetext,\@mpfootnotetext } { \eb_patch_cmd:Nnn #1 @@ -1300,7 +1368,7 @@ { \IfBooleanTF{##1} { - \use:c {#1}*{\phantomsection ##3} + \use:c {#1}*{##3} \CTEX@addtocline{#1}{##2} \tl_if_empty:oF {##4} { \CTEX@addbitocline{#1}{##4} } \use:c { #1mark }{##2} @@ -1322,22 +1390,22 @@ \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 \eb_title_base_set_eq:nn #1#2 - { - \tl_set_eq:cc { CTEX@#2@beforeskip } { CTEX@#1@beforeskip } - \tl_set_eq:cc { CTEX@#2@afterskip } { CTEX@#1@afterskip } - \bool_set_eq:cc { CTEX@#2@numbering } { CTEX@#1@numbering } - \bool_set_eq:cc { CTEX@#2@fixskip } { CTEX@#1@fixskip } - \bool_set_eq:cc { CTEX@#2@hang } { CTEX@#1@hang } - \bool_set_eq:cc { CTEX@#2@runin } { CTEX@#1@runin } - \cs_set_eq:cc { CTEX@#2@tocline } { CTEX@#1@tocline } - \tl_set_eq:cc { CTEX@#2@break } { CTEX@#1@break } - \tl_set_eq:cc { CTEX@#2@format } { CTEX@#1@format } - \tl_set_eq:cc { CTEX@#2@nameformat } { CTEX@#1@nameformat } - \tl_set_eq:cc { CTEX@#2@numberformat } { CTEX@#1@numberformat } - \tl_set_eq:cc { CTEX@#2@titleformat } { CTEX@#1@titleformat } - \tl_set_eq:cc { CTEX@#2@aftername } { CTEX@#1@aftername } - \tl_set_eq:cc { CTEX@#2@aftertitle } { CTEX@#1@aftertitle } +\cs_new_protected:Npn \CopyTitleFormat #1#2 + { + \tl_set_eq:cc { CTEX@#1@beforeskip } { CTEX@#2@beforeskip } + \tl_set_eq:cc { CTEX@#1@afterskip } { CTEX@#2@afterskip } + \bool_set_eq:cc { CTEX@#1@numbering } { CTEX@#2@numbering } + \bool_set_eq:cc { CTEX@#1@fixskip } { CTEX@#2@fixskip } + \bool_set_eq:cc { CTEX@#1@hang } { CTEX@#2@hang } + \bool_set_eq:cc { CTEX@#1@runin } { CTEX@#2@runin } + \cs_set_eq:cc { CTEX@#1@tocline } { CTEX@#2@tocline } + \tl_set_eq:cc { CTEX@#1@break } { CTEX@#2@break } + \tl_set_eq:cc { CTEX@#1@format } { CTEX@#2@format } + \tl_set_eq:cc { CTEX@#1@nameformat } { CTEX@#2@nameformat } + \tl_set_eq:cc { CTEX@#1@numberformat } { CTEX@#2@numberformat } + \tl_set_eq:cc { CTEX@#1@titleformat } { CTEX@#2@titleformat } + \tl_set_eq:cc { CTEX@#1@aftername } { CTEX@#2@aftername } + \tl_set_eq:cc { CTEX@#1@aftertitle } { CTEX@#2@aftertitle } } \NewDocumentCommand{\NewTitleCommand}{omm} { @@ -1357,8 +1425,9 @@ } \cs_new:cpn { CTEX@#2@tocline } ##1##2 { \CTEXnumberline{##1}##2 } + \exp_args:Nc \providecommand { ttll@#2 }{#3} \exp_args:Nc \providecommand { toclevel@#2 }{#3} - \IfValueT{#1}{\eb_title_base_set_eq:nn {#1} {#2}} + \IfValueT{#1}{\CopyTitleFormat{#2}{#1}} } \NewDocumentCommand{\NewTitleEntryCommand}{O{toc}m} { @@ -1367,35 +1436,39 @@ \bool_if:cTF { CTEX@#2@numbering } { \CTEX@ifnametrue } { \CTEX@ifnamefalse } + \CTEX@makeanchor{#2*} \addcontentsline{#1}{#2}{\use:c { CTEX@#2@tocline }{#2}{##1}} } } \ctex_define:nn { tools } { - hyphen-figure .tl_set:N = \l__eb_hyphen_figure_tl, - hyphen-table .tl_set:N = \l__eb_hyphen_table_tl, - hyphen-listing .tl_set:N = \l__eb_hyphen_listing_tl, - hyphen-equation .tl_set:N = \l__eb_hyphen_equation_tl, - hyphen-every .meta:n = + hyphen-figure .tl_set:N = \l__eb_hyphen_figure_tl, + hyphen-table .tl_set:N = \l__eb_hyphen_table_tl, + hyphen-lstlisting .tl_set:N = \l__eb_hyphen_lstlisting_tl, + hyphen-equation .tl_set:N = \l__eb_hyphen_equation_tl, + hyphen-every .meta:n = { - hyphen-figure = {#1},hyphen-table = {#1}, - hyphen-listing = {#1},hyphen-equation = {#1} + hyphen-figure = {#1},hyphen-table = {#1}, + hyphen-lstlisting = {#1},hyphen-equation = {#1} }, - hyphen-every .initial:n = ., - unknown .code:n = \eb_msg_deprecated_option:n { tools } + hyphen-every .initial:n = ., + unknown .code:n = \eb_msg_deprecated_option:n { tools } } -\clist_map_inline:nn - { figure,table,listing,equation } +\AtBeginDocument { - \cs_set:cpn { the#1 } + \clist_map_inline:nn + { figure,table,lstlisting,equation } { - \int_compare:nNnT { \c@chapter } > { 0 } + \cs_set:cpn { the#1 } { - \thechapter - \tl_use:c { l__eb_hyphen_#1_tl } + \int_compare:nNnT { \c@chapter } > { 0 } + { + \thechapter + \tl_use:c { l__eb_hyphen_#1_tl } + } + \int_to_arabic:v { c@#1 } } - \int_to_arabic:v { c@#1 } } } @@ -1405,47 +1478,73 @@ \bool_new:N \l__eb_toc_notitle_bool \newbool{bitoc} \cs_new:Npn \ebifbitoc { \ifbool{bitoc} } +\seq_new:N \l__eb_level_tmpa_seq +\tl_new:N \l__eb_level_tmpa_tl +\cs_generate_variant:Nn \regex_extract_all:nnN { no } +\cs_generate_variant:Nn \keys_define:nn { nx } +\cs_generate_variant:Nn \ctex_set:nn { ox } +\cs_new_protected:Npn \eb_toc_extract_level: + { + \regex_extract_all:noN { \cC. } { \eb@toc@title@level } + \l__eb_level_tmpa_seq + \seq_get_right:NN \l__eb_level_tmpa_seq \l__eb_level_tmpa_tl + \tl_set:Nx \l__eb_level_tmpa_tl + { + \exp_last_unbraced:No + \cs_to_str:N { \l__eb_level_tmpa_tl } + } + \regex_replace_case_once:nN + { + { ^bi(.*) } { \1 } + { .* } { \0 } + } + \l__eb_level_tmpa_tl + } \keys_define:nn { eb/tocouter } { - level .tl_set:N = \eb@toc@title@level, - level .initial:n = + level .code:n = + { + \tl_set:Nn \eb@toc@title@level {#1} + \eb_toc_extract_level: + }, + level .initial:x = { \bool_if:NTF \l__eb_class_mode_book_bool - { \bichapter* } - { \bisection* } + { \exp_not:N \bichapter* } + { \exp_not:N \bisection* } }, - section .meta:n = { level = \bisection* }, - chapter .meta:n = { level = \bichapter* }, - none .code:n = + section .meta:n = { level = \bisection* }, + chapter .meta:n = { level = \bichapter* }, + none .code:n = { \tl_set:Nn \eb@toc@title@level { \par\use_none:nn } \bool_set_true:N \l__eb_toc_notitle_bool }, - multoc .int_set:N = \l__eb_toc_columns_int, - multoc .default:n = 2, - multoc .initial:n = 1, + multoc .int_set:N = \l__eb_toc_columns_int, + multoc .default:n = 2, + multoc .initial:n = 1, plan .choice:, plan .value_required:n = true, - plan/cn .code:n = + plan/cn .code:n = { \bool_set_true:N \l__eb_toc_plan_cn_bool \bool_set_false:N \l__eb_toc_plan_bi_bool }, - plan/bi .code:n = + plan/bi .code:n = { \bool_set_false:N \l__eb_toc_plan_cn_bool \bool_set_true:N \l__eb_toc_plan_bi_bool }, - plan/both .code:n = + plan/both .code:n = { \bool_set_true:N \l__eb_toc_plan_cn_bool \bool_set_true:N \l__eb_toc_plan_bi_bool }, - plan .initial:n = cn, - columns .meta:n = { multoc = {#1} }, - title .code:n = \eb_assign_toc_title:n {#1}, - bilist .code:n = + plan .initial:n = cn, + columns .meta:n = { multoc = {#1} }, + title .code:n = \eb_assign_toc_title:n {#1}, + bilist .code:n = { \tl_gset:Nn \g__eb_bilist_permute_value_tl {#1} \str_if_eq:nnTF {#1} { mix } @@ -1463,16 +1562,20 @@ } } }, - name .tl_set:N = \l__eb_print_index_name_tl, - name .initial:n = \imki@jobname + name .tl_set:N = \l__eb_print_index_name_tl, + name .initial:n = \imki@jobname, + unknown .code:n = + { + \ctex_set:ox { \l__eb_level_tmpa_tl } + { \eb_unknown_kv_handle: } + }, + unknown .default:V = \c_novalue_tl } -\bool_if:NTF \l__eb_class_mode_book_bool - { \keys_define:nn { } { eb/tocouter .inherit:n = ctex/chapter } } - { \keys_define:nn { } { eb/tocouter .inherit:n = ctex/section } } + \NewDocumentCommand{\eb_assign_toc_title:n} {>{\SplitArgument{1}{,}}m} - {\eb_assign_toc_title_judge:nn #1} -\cs_new_protected:Npn \eb_assign_toc_title_judge:nn #1#2 + {\eb_toc_assign_title_judge:nn #1} +\cs_new_protected:Npn \eb_toc_assign_title_judge:nn #1#2 { \tl_set:Nn \eb@toc@title {#1} \tl_if_novalue:nTF {#2} @@ -1524,7 +1627,7 @@ } \cs_new_protected:Npn \DeclareFloatList #1#2 { - \exp_args:Nc \DeclareDocumentCommand { listof#1s }{st+o} + \exp_args:Nc \DeclareDocumentCommand { listof#1s }{st++o} {\eb_toc_list_struct_parse:nnnnn {##1} {##2} {##3} {#1} {#2}} \ctex_define:n { @@ -1547,14 +1650,15 @@ { \protect\numberline{#3}{#4} } } } -\cs_new_protected:Npn \AllotCaptionExt #1#2 +\cs_new_protected:Npn \AssignCaptionExt #1#2 { \tl_set:cn { ext@#1 } {#2} } +\cs_set_eq:NN \AllotCaptionExt \AssignCaptionExt \ctex_define:n { bicontentsname .tl_set:N = \bicontentsname, bicontentsname .initial:n = Contents } -\RenewDocumentCommand{\tableofcontents}{st+oD(){}} +\RenewDocumentCommand{\tableofcontents}{st++o+D(){}} { \group_begin: \tl_set_eq:NN \eb@toc@title \contentsname @@ -1587,6 +1691,12 @@ \group_end: } +\cs_set_eq:NN \eb@contentsuse@save \contentsuse +\RenewDocumentCommand{\contentsuse}{O{-1000}mm} + { + \eb@contentsuse@save{#2}{#3} + \tl_set:cn { ttll@#2 } {#1} + } \contentsuse{lstlisting}{lol} \seq_put_left:Nn \c__ctex_headings_seq { chapter } \seq_put_right:Nn \c__ctex_headings_seq { table } @@ -1635,7 +1745,7 @@ { tocformat = \IfBooleanT{#1}{\contentsmargin{0pt}}, tocindent = 0pt, - tocrule = \IfBooleanTF{#1}{,~\thecontentspage}{\tocrule{$\cdot$}}, + tocrule = \IfBooleanTF{#1}{,~\thecontentspage}{\cdottocrule}, toclabel = { \bool_if:NTF \l__eb_toc_entry_hang_bool @@ -1706,7 +1816,7 @@ \eb@register@every@toc@option } \RegisterEveryTocOption{tocafter,tocindent,tocrule} -\NewDocumentCommand{\tocrule}{st-O{0.7pc}d()mO{}} +\NewDocumentCommand{\tocrule}{st-O{0.6pc}d()mO{}} { \normalsize\normalfont \ttl@row@i[#3]{\IfValueTF{#4}{\scalebox{#4}{#5}}{#5}}#6 @@ -1723,6 +1833,7 @@ } } } +\cs_set:Npn \cdottocrule { \tocrule{\textperiodcentered} } \ctex_define:nn { toc } { lolskip .skip_set:N = \eb@toc@lol@skip, @@ -1739,6 +1850,8 @@ hang .initial:n = true, pagenumwd .code:n = \contentsmargin{#1}, pagenumwd .initial:n = 1.55em, + fileopen .tl_set:N = \l__eb_fileopen_type_tl, + fileopen .initial:n = once, unknown .code:n = \eb_msg_deprecated_option:n { toc } } @@ -1749,30 +1862,48 @@ { \tl_if_exist:cF { tf@#1 } { \iow_new:c { tf@#1 }\iow_open:cn { tf@#1 } { \jobname.#1 } } - } - {} + }{} } +\cs_set_eq:NN \eb@starttoc \@starttoc \cs_set:Npn \@starttoc #1 { - \group_begin: - \makeatletter - \file_if_exist_input:n { \jobname.#1 } - \UseHookWithArguments{starttoc/after}{1}{#1} - \boolfalse{@nobreak} - \group_end: + \cs_if_exist:NTF \UseHookWithArguments + { + \group_begin: + \makeatletter + \file_if_exist_input:n { \jobname.#1 } + \UseHookWithArguments{starttoc/after}{1}{#1} + \boolfalse{@nobreak} + \group_end: + } + { \eb@starttoc{#1} } } \AddToHook{enddocument/afterlastpage} { - \IfHookEmptyTF{starttoc/after}{} - {\iow_now:Nn \@mainaux { \RemoveFromHook{starttoc/after}[aux] }} + \tl_if_eq:NnTF \l__eb_fileopen_type_tl { once } + { \iow_now:Nn \@mainaux { \RemoveFromHook{starttoc/after}[*] } } + { + \IfHookEmptyTF{starttoc/after}{} + {\iow_now:Nn \@mainaux { \RemoveFromHook{starttoc/after}[aux] }} + } } -\cs_set_protected:Npn \AllotPartialExt #1#2 +\cs_set_protected:Npn \AssignPartialExt #1#2 { - \tl_set:cn { ttl@partial#1 } {#2} - \AddToHookWithArguments{cmd/ttl@writepartial/before} - {\ttl@topartial{#1}{##1}{##2}} + \tl_if_exist:cTF { ttl@partial#1 } + { \msg_warning:nnnn { easybase } { repeated-ptoc } {#1} {#2} } + { + \tl_set:cn { ttl@partial#1 } {#2} + \AddToHookWithArguments{cmd/ttl@writepartial/before}[ttl/#1] + {\ttl@topartial{#1}{##1}{##2}} + } } -\AllotPartialExt{lol}{pll} +\cs_set_eq:NN \AllotPartialExt \AssignPartialExt +\msg_new:nnn { easybase } { repeated-ptoc } + { + Local~directory~file~'#2'~of~directory~type~'#1'~is \\ + repeatedly~allocated. + } +\AssignPartialExt{lol}{pll} \cs_new_protected:Npn \RegisterTitleIfname #1 { @@ -1796,16 +1927,15 @@ } \RegisterTitleIfname{toc} -\cs_set_eq:NN \eb@ctexsetii \ctex_set:nn \cs_new_protected:Npn \SetTocStyle #1#2#3 { \cs_set_protected:cpn { eb@toc@style@set@#1@#2 } - { \eb@ctexsetii{#1}{#3} } + { \ctex_set:nn {#1} {#3} } } \cs_new_protected:Npn \UseTocStyle #1#2#3 { \cs_if_exist:cTF { eb@toc@style@set@#1@#2 } - { \addtocontents{#3}{\@nameuse{eb@toc@style@set@#1@#2}} } + { \addtocontents{#3}{\string\csuse{eb@toc@style@set@#1@#2}} } { \msg_warning:nnnn { easybase } { undefined-toc-style } {#2} {#1} } } \msg_new:nnn { easybase } { undefined-toc-style } @@ -1824,7 +1954,7 @@ { tocformat = \addvspace{1pc}\sffamily, tocindent = 0pt, - tocrule = \tocrule{$\cdot$}[\bfseries], + tocrule = \cdottocrule[\bfseries], tocline = \CTEXnumberline{#1}#2 }, section = @@ -1834,12 +1964,12 @@ tocrule = { \bool_if:NTF \l__eb_class_mode_book_bool - { \tocrule{$\cdot$} } - { \tocrule{$\cdot$}[\bfseries] } + { \cdottocrule } + { \cdottocrule[\bfseries] } } }, subsection = - { tocindent = \bool_if:NTF \l__eb_class_mode_book_bool { 3.8em } { 1.4em } } + { tocindent = \bool_if:NTF \l__eb_class_mode_book_bool { 3.8em } { 1.5em } } } \ctex_at_end_package:nn { imakeidx } @@ -1902,19 +2032,19 @@ \ctex_define:nn { font } { - 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 .tl_set:N = \l__eb_font_caption_table_tl, + caption-figure .tl_set:N = \l__eb_font_caption_figure_tl, + caption-lstlisting .tl_set:N = \l__eb_font_caption_lstlisting_tl, + caption-every .meta:n = { - caption-table = {#1},caption-figure = {#1}, - caption-listing = {#1} + caption-table = {#1},caption-figure = {#1}, + caption-lstlisting = {#1} }, - caption-every .initial:n = \sffamily\small, - footnote .tl_set:N = \eb@font@footnote, - marginpar .tl_set:N = \marginfont, - marginpar .initial:n = \footnotesize, - unknown .code:n = \eb_msg_deprecated_option:n { font } + caption-every .initial:n = \sffamily\small, + footnote .tl_set:N = \eb@font@footnote, + marginpar .tl_set:N = \marginfont, + marginpar .initial:n = \footnotesize, + unknown .code:n = \eb_msg_deprecated_option:n { font } } \cs_new_protected:Npn \ebaddtofont #1#2 { @@ -1924,13 +2054,13 @@ { \tl_put_right:Nn \l__eb_font_caption_table_tl {#2} } { figure } { \tl_put_right:Nn \l__eb_font_caption_figure_tl {#2} } - { listing } - { \tl_put_right:Nn \l__eb_font_caption_listing_tl {#2} } + { lstlisting } + { \tl_put_right:Nn \l__eb_font_caption_lstlisting_tl {#2} } { every } { \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} + \tl_put_right:Nn \l__eb_font_caption_lstlisting_tl {#2} } { footnote } { \tl_put_right:Nn \eb@font@footnote {#2} } @@ -1940,14 +2070,14 @@ } \cs_set_eq:NN \addtosubfont \ebaddtofont -\ctex_define:nn { spread } +\ctex_define:nn { space } { - line .code:n = \setspread{#1}, - table .fp_set:N = \l__eb_spread_table_fp, - table .initial:n = 1.2, - math .tl_set:N = \eb@spread@math, - math .initial:n = 1.2, - footnote .code:n = + linespread .code:n = \setspread{#1}, + tabspread .fp_set:N = \l__eb_spread_table_fp, + tabspread .initial:n = 1.2, + mathspread .tl_set:N = \eb@spread@math, + mathspread .initial:n = 1.2, + fntspread .code:n = { \tl_set:Nn \eb@spread@footnote {#1} \group_begin: @@ -1956,20 +2086,20 @@ \exp_args:NNNo \group_end: \dim_set:Nn \footnotesep { \dim_use:N \box_ht:N \strutbox } }, - footnote .initial:n = 1.2, - caption-table .fp_set:N = \l__eb_spread_caption_table_fp, - caption-figure .fp_set:N = \l__eb_spread_caption_figure_fp, - caption-listing .fp_set:N = \l__eb_spread_caption_listing_fp, - caption-every .meta:n = - { - caption-table = {#1},caption-figure = {#1}, - caption-listing = {#1} + fntspread .initial:n = 1.2, + captab-spread .fp_set:N = \l__eb_spread_caption_table_fp, + capfig-spread .fp_set:N = \l__eb_spread_caption_figure_fp, + caplst-spread .fp_set:N = \l__eb_spread_caption_lstlisting_fp, + caption-spread .meta:n = + { + captab-spread = {#1},capfig-spread = {#1}, + caplst-spread = {#1} }, - caption-every .initial:n = 1.2, - every .meta:n = + caption-spread .initial:n = 1.2, + everyspread .meta:n = { - line = {#1},table = {#1},math = {#1}, - caption-every = {#1},footnote = {#1} + linespread = {#1},tabspread = {#1},mathspread = {#1}, + caption-spread = {#1},fntspread = {#1} }, abovedisplayskip .code:n = { \AfterPreamble{\skip_set:Nn \abovedisplayskip {#1}} }, @@ -1983,18 +2113,24 @@ } }, belowdisplayskip .initial:n = 0.5ex plus .1ex minus .1ex, - unknown .code:n = \eb_msg_deprecated_option:n { spread } + unknown .code:n = \eb_msg_deprecated_option:n { space } } \tl_if_eq:NnT \l__ctex_scheme_tl { chinese } { \fp_compare:nNnTF { \l__ctex_line_spread_fp } = { 1.3 } - { \ctex_set:nn { spread } { line = 1.354,table = 1.354 } } - { \ctex_set:nn { spread } { line = \fp_use:N \l__ctex_line_spread_fp } } + { + \ctex_set:nn { space } + { linespread = 1.354,tabspread = 1.354 } + } + { + \ctex_set:nn { space } + { linespread = \fp_use:N \l__ctex_line_spread_fp } + } } \AfterPreamble{\skip_set:Nn \abovedisplayshortskip { 0ex plus .1ex }} \clist_map_inline:nn - { table,figure,listing } + { table,figure,lstlisting } { \DeclareCaptionFont{eb@#1@font} { @@ -2012,7 +2148,7 @@ } \captionsetup[table]{font = eb@table@font} \captionsetup[figure]{font = eb@figure@font} -\captionsetup[lstlisting]{font = eb@listing@font} +\captionsetup[lstlisting]{font = eb@lstlisting@font} \ctex_at_end_package:nn { bicaption } { \captionsetup[figure][bi-second]{name = Figure} @@ -2176,9 +2312,9 @@ \RequirePackage{amsthm,thmtools} \cs_set_eq:NN \eb@declaretheoremstyle@save \declaretheoremstyle \cs_set_eq:NN \eb@declaretheorem@save \declaretheorem - \RenewDocumentCommand{\declaretheoremstyle}{O{}mO{}} + \RenewDocumentCommand{\declaretheoremstyle}{+O{}m+O{}} {\eb@declaretheoremstyle@save[#1,#3]{#2}} - \RenewDocumentCommand{\declaretheorem}{O{}mO{}} + \RenewDocumentCommand{\declaretheorem}{+O{}m+O{}} { \eb@declaretheorem@save[style = default,#1,#3]{#2} \settheoremtocline{#2} @@ -2186,6 +2322,9 @@ \listnumberline{#2} \thmtname\thmtifnote{~(\thmtnote)}{} } + \cs_gset:cpn { thmt@contentsline@#2 } + { \thmt@contentslineIfNamed } + \exp_args:Nc \providecommand { p@#2 }[1]{##1} } \ctex_define:nn { thmt } { @@ -2206,7 +2345,7 @@ \theoremstyle{default} \cs_undefine:N \proof \DeclareFloatList{theorem}{loe} - \AllotPartialExt{loe}{ple} + \AssignPartialExt{loe}{ple} \eb_preto_cmd:nn { listoftheorems } { \group_begin: @@ -2361,6 +2500,9 @@ \tl_gset:Nn \blx@default@theheading { bibintoc } \defbibheading{bibintoc}[\bibname]{\eb_biber_toc_title:n {##1}} \skip_zero:N \bibitemsep + \setcounter{biburlucpenalty}{1} + \setcounter{biburllcpenalty}{1} + \setcounter{biburlnumpenalty}{1} } \eb_at_end_preamble:n { @@ -2373,7 +2515,7 @@ } } -\cs_new:Npn \eb@lst@if@display #1#2 +\cs_new:Npn \lstifdisplay #1#2 { \lst@ifdisplaystyle #1\else #2\fi } \lstdefinestyle{lst-base} { @@ -2401,9 +2543,9 @@ { style = lst-base, language = [LaTeX]TeX, - texcsstyle = *\color{ctex@verb}\eb@lst@if@display{\bfseries}{}, - basicstyle = \ttfamily\eb@lst@if@display{\small}{\color{ctex@verb}}, - keywordstyle = \color{ctex@verb}\eb@lst@if@display{\bfseries}{} + texcsstyle = *\color{ctex@verb}\lstifdisplay{\bfseries}{}, + basicstyle = \ttfamily\lstifdisplay{\small}{\color{ctex@verb}}, + keywordstyle = \color{ctex@verb}\lstifdisplay{\bfseries}{} } \lstset{style = lst-latex} \lstloadlanguages{C,C++,Java,Python,Matlab} @@ -2589,7 +2731,7 @@ } %</package> %<*tcolorbox> -\ProvidesExplFile{eb-tcolorbox.cfg}{2024/05/24}{2024bu} +\ProvidesExplFile{eb-tcolorbox.cfg}{2024/08/01}{2024dc} {Customization of tcolorbox for easybook} \cs_set_protected:Npn \addtotcbstyle #1#2 |