diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/easybook/easybase.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/easybook/easybase.sty | 675 |
1 files changed, 443 insertions, 232 deletions
diff --git a/Master/texmf-dist/tex/latex/easybook/easybase.sty b/Master/texmf-dist/tex/latex/easybook/easybase.sty index b556583b3a0..a37800cb1cf 100644 --- a/Master/texmf-dist/tex/latex/easybook/easybase.sty +++ b/Master/texmf-dist/tex/latex/easybook/easybase.sty @@ -20,19 +20,16 @@ %% This work has the LPPL maintenance status `maintained'. \NeedsTeXFormat{LaTeX2e}[2021/11/15] \RequirePackage{etoolbox} -\ProvidesExplPackage{easybase}{2024/06/16}{2024ce} +\ProvidesExplPackage{easybase}{2024/09/24}{2024dx} {Easily typesetting Chinese theses or books} \cs_generate_variant:Nn \dim_set:Nn { NV } \cs_generate_variant:Nn \dim_sign:n { V } \cs_generate_variant:Nn \int_to_arabic:n { v } \cs_generate_variant:Nn \msg_warning:nnn { nnV } -\cs_generate_variant:Nn \prop_set_from_keyval:Nn { NV } \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_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 @@ -46,12 +43,7 @@ { \AddToHook{cmd/#1/before}{#2} } \cs_new_protected:Npn \eb_appto_cmd:nn #1#2 { \AddToHook{cmd/#1/after}{#2} } -\cs_new_protected:Npn \eb_at_begin_environment:nn #1#2 - { - \clist_map_inline:nn {#1} - { \AtBeginEnvironment{##1}{#2} } - } -\cs_new_protected:Npn \eb_at_end_preamble:n +\cs_set_protected:Npn \ctex_before_end_preamble:n { \BeforeBeginEnvironment{document} } \cs_new_protected:Npn \eb_if_package_loaded:nnF #1#2#3 { @@ -91,18 +83,22 @@ \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}{mom}{} +\ProvideDocumentCommand{\AddToHookWithArguments}{mo+m}{} \bool_set_true:N \l__eb_class_mode_book_bool \bool_set_false:N \l__eb_compile_draft_bool @@ -131,13 +127,15 @@ { \bool_set_true:N \l__eb_class_mode_book_bool \eb_put_geometry:n { twoside } + \booltrue{@titlepage} }, class/article .code:n = { \bool_set_false:N \l__eb_class_mode_book_bool \eb_put_geometry:n { twoside = false } + \boolfalse{@titlepage} }, - class .initial:n = book, + class .initial:x = \ifbool{@titlepage}{book}{article}, book .meta:n = { class = book }, article .meta:n = { class = article }, unknown .code:n = \clist_gput_right:NV \g__eb_ctex_options_clist \CurrentOption @@ -167,16 +165,16 @@ \seq_set_from_clist:Nn \l__eb_module_paths_seq { - tools,font,space, - bib,thmt,toc, - hdr,float,ref,geo + tools,font,space,bib, + thmt,toc,hdr,float, + ref,geo,cap } \seq_map_inline:Nn \l__eb_module_paths_seq { \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}} @@ -224,7 +222,6 @@ \ebloadpackage { [text]{spbmark}, - [normalem]{ulem}, [{shortlabels,inline}]{enumitem}, chemformula,siunitx,pifont, geometry,marginnote, @@ -278,7 +275,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} @@ -410,18 +415,18 @@ } \cs_set:Npn \markdouble #1 { \markboth{#1}{\ifbool{@twoside}{#1}{}} } -\cs_new:Npn \eb@level@markdouble #1#2 +\cs_new_protected:Npn \eb@level@markdouble #1#2 { \markdouble{\use:c { eb@mark@#1@whole }{#2}} } -\cs_new:Npn \eb@level@markright #1#2 +\cs_new_protected:Npn \eb@level@markright #1#2 { \markright{\use:c { eb@mark@#1@whole }{#2}} } \cs_gset:Npn \chaptermark #1 { \eb@level@markdouble{chapter}{#1} } -\cs_gset:Npn \sectionmark #1 +\cs_gset:Npx \sectionmark #1 { \bool_if:NTF \l__eb_class_mode_book_bool { \eb@level@markright{section}{#1} } { \eb@level@markdouble{section}{#1} } } -\cs_gset:Npn \subsectionmark #1 +\cs_gset:Npx \subsectionmark #1 { \bool_if:NF \l__eb_class_mode_book_bool { \eb@level@markright{subsection}{#1} } @@ -448,12 +453,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 - { - \regex_match:nVTF { \cB. } \l_eb_graphics_path_tl - { \exp_args:NV \graphicspath \l_eb_graphics_path_tl } - { \exp_args:Nx \graphicspath { {\l_eb_graphics_path_tl} } } - } \providecommand{\kaishu}{\itshape} } @@ -519,7 +518,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} { @@ -554,29 +553,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 } @@ -609,7 +623,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 @@ -657,68 +670,105 @@ unknown .code:n = \eb_msg_deprecated_option:n { hdr } } -\eb_at_end_preamble:n +\ctex_before_end_preamble:n { \bool_if:NT \l__eb_chap_counter_withpart_bool { \counterwithin*{chapter}{part} } \str_case:VnT \l__eb_fnt_parent_counter_tl { { part } { \counterwithin*{footnote}{part} } - { page } { \counterwithin*{footnote}{page} } + { page } + { + \RequirePackage{zref-perpage} + \zmakeperpage{footnote} + } } { \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 + { + \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 { - \bool_if:NT \l__eb_fnpara_bottom_bool + \setbox\@outputbox\vbox { - \IfPackageLoadedTF{footmisc} - {\msg_warning:nn { easybase } { bottom-not-compatible }} + \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 + { + \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: { @@ -741,7 +791,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 } @@ -779,7 +829,7 @@ \eb_patch_cmd:Nnn #1 { \reset@font } { - \setspread{\eb@spread@footnote} + \usestretch{\eb@spread@footnote} \eb@font@footnote } } @@ -789,12 +839,12 @@ \ctex_at_end_package:nn { footmisc } { \eb_package_date_check:nn { footmisc } { 2022/02/10 } - \boolfalse{FN@setspace} - \ifbool{FN@para}{} + \ifboolexpr{not (bool {FN@para} or bool {FN@sidefn})} { + \boolfalse{FN@setspace} \cs_set_eq:NN \@makefntext \eb@@makefntext \cs_set_eq:NN \@footnotetext \eb@@footnotetext - } + }{} \ifboolexpr { bool {FN@hangfoot} or @@ -1033,7 +1083,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} @@ -1055,22 +1105,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} { @@ -1092,7 +1142,7 @@ { \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} { @@ -1101,35 +1151,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 } } } @@ -1139,47 +1193,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 } @@ -1197,12 +1277,16 @@ } } }, - 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_toc_assign_title_judge:nn #1} @@ -1258,7 +1342,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 { @@ -1281,14 +1365,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 @@ -1375,7 +1460,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 @@ -1446,7 +1531,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 @@ -1463,6 +1548,7 @@ } } } +\cs_set:Npn \cdottocrule { \tocrule{\textperiodcentered} } \ctex_define:nn { toc } { lolskip .skip_set:N = \eb@toc@lol@skip, @@ -1479,6 +1565,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 } } @@ -1489,8 +1577,7 @@ { \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 @@ -1508,16 +1595,30 @@ } \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 { @@ -1541,16 +1642,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 } @@ -1569,7 +1669,7 @@ { tocformat = \addvspace{1pc}\sffamily, tocindent = 0pt, - tocrule = \tocrule{$\cdot$}[\bfseries], + tocrule = \cdottocrule[\bfseries], tocline = \CTEXnumberline{#1}#2 }, section = @@ -1579,17 +1679,17 @@ 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 } { - \RenewDocumentCommand{\printindex}{st+od()} + \RenewDocumentCommand{\printindex}{st++o} { \group_begin: \tl_set_eq:NN \eb@toc@title \indexname @@ -1647,19 +1747,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 { @@ -1669,13 +1769,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} } @@ -1685,26 +1785,53 @@ } \cs_set_eq:NN \addtosubfont \ebaddtofont +\cs_new_protected:Npn \usestretch #1 + { + \edef\baselinestretch{#1} + \@currsize + } +\cs_set_eq:NN \setspread \usestretch +\cs_new_protected:Npn \restore@usespace + { + \par + \vskip\parskip + \vskip\baselineskip + \endgroup + \vskip -\parskip + \vskip -\baselineskip + } +\NewDocumentEnvironment{usespace}{m+b} + { + \par + \begingroup + \usestretch{#1}#2 + \restore@usespace + }{} +\msg_new:nnn { easybase } { invalid-spread } + { + The~line~spacing~factor~option~'#1'~is~invalid. \\ + Please~use~the~'usespace'~environment~to~set~the~line~spacing. + } +\cs_new_protected:Npn \eb_invalid_spread_warning: + { \msg_warning:nnV { easybase } { invalid-spread } \l_keys_key_str } \ctex_define:nn { space } { - 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, + linespread .code:n = \usestretch{#1}, + tabspread .code:n = \eb_invalid_spread_warning:, + mathspread .code:n = \eb_invalid_spread_warning:, fntspread .code:n = { \tl_set:Nn \eb@spread@footnote {#1} \group_begin: \footnotesize - \setspread{\eb@spread@footnote} + \usestretch{\eb@spread@footnote} \exp_args:NNNo \group_end: \dim_set:Nn \footnotesep { \dim_use:N \box_ht:N \strutbox } }, 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_listing_fp, + caplst-spread .fp_set:N = \l__eb_spread_caption_lstlisting_fp, caption-spread .meta:n = { captab-spread = {#1},capfig-spread = {#1}, @@ -1713,8 +1840,8 @@ caption-spread .initial:n = 1.2, everyspread .meta:n = { - linespread = {#1},tabspread = {#1},mathspread = {#1}, - caption-spread = {#1},fntspread = {#1} + linespread = {#1},caption-spread = {#1}, + fntspread = {#1} }, abovedisplayskip .code:n = { \AfterPreamble{\skip_set:Nn \abovedisplayskip {#1}} }, @@ -1733,23 +1860,39 @@ \tl_if_eq:NnT \l__ctex_scheme_tl { chinese } { \fp_compare:nNnTF { \l__ctex_line_spread_fp } = { 1.3 } - { - \ctex_set:nn { space } - { linespread = 1.354,tabspread = 1.354 } - } - { - \ctex_set:nn { space } - { linespread = \fp_use:N \l__ctex_line_spread_fp } - } + { \usestretch{1.354} } + { \usestretch{\fp_use:N \l__ctex_line_spread_fp} } } \AfterPreamble{\skip_set:Nn \abovedisplayshortskip { 0ex plus .1ex }} +\cs_new_protected:Npn \eb@register@cap@options #1 + { + \ctex_define:nn { cap } + { + #1/unknown .code:n = + { + \use:x + { + \exp_not:N \captionsetup[#1] + { \eb_unknown_kv_handle: } + } + }, + #1/unknown .default:V = \c_novalue_tl, + #1 .meta:nn = { ctex/cap/#1 } {##1} + } + } +\cs_new_protected:Npn \RegisterCapOptions #1 + { + \clist_map_function:nN {#1} + \eb@register@cap@options + } +\RegisterCapOptions{table,figure,lstlisting} \clist_map_inline:nn - { table,figure,listing } + { table,figure,lstlisting } { \DeclareCaptionFont{eb@#1@font} { - \setspread{\fp_use:c { l__eb_spread_caption_#1_fp }} + \usestretch{\fp_use:c { l__eb_spread_caption_#1_fp }} \tl_use:c { l__eb_font_caption_#1_tl } } } @@ -1763,15 +1906,12 @@ } \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} \captionsetup[table][bi-second]{name = Table} } -\eb_at_begin_environment:nn - { tabular,tabularx,longtable } - { \setspread{\fp_use:N \l__eb_spread_table_fp} } \UseTblrLibrary{booktabs} \bool_if:NF \l__eb_float_page_bool @@ -1927,9 +2067,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} @@ -1937,6 +2077,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 } { @@ -1957,7 +2100,7 @@ \theoremstyle{default} \cs_undefine:N \proof \DeclareFloatList{theorem}{loe} - \AllotPartialExt{loe}{ple} + \AssignPartialExt{loe}{ple} \eb_preto_cmd:nn { listoftheorems } { \group_begin: @@ -1987,7 +2130,6 @@ \cs_set:cpn { ll@#2 } { \@bsphack #3\@esphack } } } - \setchemformula { math-scripts = false, @@ -2006,30 +2148,6 @@ group-digits = none } }{} -\eb_at_begin_environment:nn - { - array,matrix,pmatrix,bmatrix,Bmatrix,vmatrix,Vmatrix, - matrix*,pmatrix*,bmatrix*,Bmatrix*,vmatrix*,Vmatrix*, - cases,cases*,dcases,dcases*,rcases,rcases*,drcases,drcases*, - aligned,alignedat,gathered,multlined,lgathered,rgathered - } - { \setspread{\eb@spread@math} } -\clist_map_inline:nn - { \start@gather,\start@align,\start@multline } - { - \eb_patch_cmd:Nnn #1 - { \collect@body } - { - \setspread{\eb@spread@math} - \collect@body - } - } -\eb_patch_cmd:Nnn \gather@split - { \spread@equation } - { - \setspread{\eb@spread@math} - \spread@equation - } \ctex_at_end_package:nn { unicode-math } { \msg_redirect_module:nnn { unicode-math } { warning } { info } } \ctex_at_end_package:nn { tcolorbox } @@ -2050,7 +2168,6 @@ bititle .initial:n = Bibliography, unknown .code:n = \eb_msg_deprecated_option:n { bib } } - \cs_new_protected:Npn \eb_bibtex_natbib_set: { \RequirePackage[sort&compress]{natbib} @@ -2068,7 +2185,7 @@ { \exp_args:NV \bibliographystyle \l__eb_bib_both_style_tl } \tl_if_blank:VF \l__eb_bib_cite_style_tl { \exp_args:NV \setcitestyle \l__eb_bib_cite_style_tl } - \NewDocumentCommand{\printbibliography}{st+o} + \NewDocumentCommand{\printbibliography}{st++o} { \group_begin: \tl_set_eq:NN \eb@toc@title \bibname @@ -2116,7 +2233,7 @@ \setcounter{biburllcpenalty}{1} \setcounter{biburlnumpenalty}{1} } -\eb_at_end_preamble:n +\ctex_before_end_preamble:n { \providecommand{\bibname}{\refname} \clist_if_empty:NF \l__eb_bib_datafile_clist @@ -2341,6 +2458,100 @@ lstlistingname = Code } } + +\cs_if_exist:NF \DeclareObjectType + { \RequirePackage{xtemplate} } +\DeclareObjectType{easybook}{0} +\DeclareTemplateInterface{easybook}{cover}{0} + { + content : tokenlist = \c_empty_tl, + beforecode : tokenlist = \c_empty_tl, + aftercode : tokenlist = \c_empty_tl, + align : choice {l,r,c,n} = c + } +\DeclareTemplateCode{easybook}{cover}{0} + { + content = \l__eb_cover_content_tl, + beforecode = \l__eb_cover_before_code_tl, + aftercode = \l__eb_cover_after_code_tl, + align = + { + l = \cs_set_eq:NN \eb_cover_align: \raggedright, + r = \cs_set_eq:NN \eb_cover_align: \raggedleft, + c = \cs_set_eq:NN \eb_cover_align: \centering, + n = \cs_set:Npn \eb_cover_align: { } + } + } + { + \AssignTemplateKeys + \tl_use:N \l__eb_cover_before_code_tl + \group_begin: + \eb_cover_align: + \tl_use:N \l__eb_cover_content_tl + \tex_par:D + \group_end: + \tl_use:N \l__eb_cover_after_code_tl + } +\DeclareInstance{easybook}{top}{cover}{} +\DeclareInstance{easybook}{bottom}{cover}{} +\DeclareInstance{easybook}{middle}{cover} + { + content = + { + \notbool{@titlepage} + { + \renewcommand{\theupfootnote}{\@fnsymbol\c@footnote} + \renewcommand{\thefootnote}{\@fnsymbol\c@footnote} + \let\footnote\thanks + } + {} + \bgroup\LARGE\@title\par\egroup + \notbool{@titlepage}{\vskip 1.5em}{\vskip 3em} + \bgroup\large + \begin{tabular}[t]{c} + \@author + \end{tabular}\par\egroup + \notbool{@titlepage}{\vskip 0.75em}{\vskip 1.5em} + \bgroup\large\@date\par\egroup + \notbool{@titlepage}{\vskip 1.5em}{} + \@thanks + }, + beforecode = + { + \ifbool{@titlepage} + { + \begin{titlepage} + \let\footnotesize\small + \let\footnoterule\relax + \let\footnote\thanks + \null\vfil\vskip 60\p@ + } + {\null\vskip 20\p@} + }, + aftercode = + { + \ifbool{@titlepage} + { + \vfil\null + \end{titlepage} + } + {\thispagestyle{plain}} + \setcounter{footnote}{0} + } + } +\keys_define:nn { eb/cover } + { + title .tl_set:N = \@title, + author .tl_set:N = \@author, + date .tl_set:N = \@date + } +\RenewDocumentCommand{\maketitle}{+O{}} + { + \keys_set:nn { eb/cover } {#1} + \UseInstance{easybook}{top} + \UseInstance{easybook}{middle} + \UseInstance{easybook}{bottom} + } \endinput %% %% End of file `easybase.sty'. |