summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/easybook/easybook.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/easybook/easybook.dtx')
-rw-r--r--macros/latex/contrib/easybook/easybook.dtx630
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