%%
%% This is file `easybook.cls',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% easybook.dtx  (with options: `class')
%% Copyright (C) 2021 by Qu Yi <quee123@foxmail.com>
%% 
%% This work may be distributed and/or modified under the
%% conditions of the CC-BY 4.0 License.
%% The latest version of this license is in
%%   https://creativecommons.org/licenses/by/4.0/legalcode
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{l3keys2e,etoolbox}
\ProvidesExplClass{easybook}{2021/05/14}{1.25i}{beta}

\cs_generate_variant:Nn \eb_ctex_define:nn { nx }
\cs_generate_variant:Nn \int_to_arabic:n { v }
\cs_generate_variant:Nn \dim_add:Nn { NV }
\cs_generate_variant:Nn \eb_put_hyperref:n { x }
\cs_new_protected:Npn \eb_ctex_define:nn #1
  { \keys_define:nn { ctex/#1 } }
\cs_new_protected:Npn \eb_put_ctexbook:n #1
  { \PassOptionsToClass{#1}{ctexbook} }
\cs_new_protected:Npn \eb_patch_cmd:Nnn #1#2#3
  {
    \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3}
      { } { \ctex_patch_failure:N #1 }
  }
\cs_new_protected:Npn \eb_appto_cmd:Nn #1#2
  {
    \ctex_appto_cmd:NnnTF #1 { } {#2}
      { } { \ctex_patch_failure:N #1 }
  }
\cs_new_protected:Npn \eb_preto_cmd:Nn #1#2
  {
    \ctex_preto_cmd:NnnTF #1 { } {#2}
      { } { \ctex_patch_failure:N #1 }
  }
\cs_new_protected:Npn \eb_at_end_preamble:n
  { \ctex_gadd_ltxhook:nn { env/document/before } }
\cs_gset_eq:NN \PackageWarning \use_none:nn

\bool_set_false:N \l__eb_compile_draft_bool
\bool_set_false:N \l__eb_title_newline_bool
\bool_set_false:N \l__eb_font_noto_bool
\bool_set_true:N  \l__eb_page_twoside_bool
\bool_set_true:N  \l__eb_class_book_bool
\tl_new:N         \g__eb_config_tl
\clist_new:N      \g__eb_options_clist

\keys_define:nn { easybook }
  {
    draft .code:n   = \bool_set_true:N \l__eb_compile_draft_bool,
    newline .code:n = \bool_set_true:N \l__eb_title_newline_bool,
    scheme .code:n  = \eb_put_ctexbook:n { scheme = #1 },
    enmode .meta:n  = { newline,scheme = plain },

    font .choices:nn  =
      { adobe,founder,mac,windows,none }
      { \eb_put_ctexbook:n { fontset = \l_keys_choice_tl } },
    font/noto .code:n =
      {
        \bool_set_true:N \l__eb_font_noto_bool
        \eb_put_ctexbook:n { fontset = none }
      },
    font/overleaf .code:n   = { },
    font/linux .code:n = \eb_put_ctexbook:n { fontset = ubuntu },
    font .value_required:n  = true,
    font .initial:n         = overleaf,

    paper .choice:,
    paper .value_required:n = true,
    paper/unknown .code:n   = \PassOptionsToPackage{#1}{geometry},
    paper .initial:n        = a4paper,

    oneside .value_forbidden:n  = true,
    twoside .value_forbidden:n  = true,
    oneside .code:n =
      {
        \bool_set_false:N \l__eb_page_twoside_bool
        \eb_put_ctexbook:n { oneside }
      },
    twoside .code:n =
      {
        \bool_set_true:N \l__eb_page_twoside_bool
        \eb_put_ctexbook:n { twoside }
      },

    class .choice:,
    class .value_required:n = true,
    class/book .code:n      = { },
    class/article .code:n   =
      {
        \bool_set_false:N \l__eb_class_book_bool
        \keys_set:nn { easybook } { oneside }
      },
    class .initial:n        = book,

    config .tl_set:N  = \g__eb_config_tl,
    unknown .code:n   =
      { \clist_gput_right:No \g__eb_options_clist { \CurrentOption } }
  }

\ProcessKeysOptions{easybook}

\clist_map_inline:nn
  {
    { svgnames } { xcolor },
    { stable } { footmisc },
    { normalem } { ulem },
    { protrusion = false } { microtype },
    { list = off } { bicaption },
    { shortlabels,inline } { enumitem },
    { many } { tcolorbox },
    { xindy } { imakeidx },
    { CJKmath = true } { xeCJK },
    { no-math } { fontspec },
    { noto,upint } { newtxmath }
  }
  { \PassOptionsToPackage #1 }
\eb_put_ctexbook:n { \g__eb_options_clist }
\LoadClass[UTF8]{ctexbook}

\bool_new:N \l__eb_multoc_bool
\bool_new:N \l__eb_notomath_bool
\bool_new:N \l__eb_uppercase_bool
\bool_new:N \l__eb_chap_withpart_bool
\tl_new:N   \l__eb_foot_numberwith_tl

\seq_const_from_clist:Nn \c__eb_options_path_seq
  {
    style,elsefont,spread,
    refset,bibset,thmset,
    geoset,hdrset,tocset
  }
\seq_map_inline:Nn \c__eb_options_path_seq
  {
    \ctex_define:n { #1 .meta:nn = { ctex/#1 } {##1} }
    \cs_new:cpn {#1} ##1 { \keys_set:nn { ctex/#1 } {##1} }
  }
\keys_define:nn { } { ctex/link .inherit:n = ctex/refset }
\cs_set_eq:NN \link \refset
\ctex_define:n
  {
    link .meta:nn                 = { ctex/link } {#1},
    lstlistlistingname .tl_set:N  = \lstlistlistingname,
    lstlistingname .tl_set:N      = \lstlistingname
  }
\eb_ctex_define:nn { style }
  {
    multoc .bool_set:N    = \l__eb_multoc_bool,
    multoc .default:n     = true,
    withpart .bool_set:N  = \l__eb_chap_withpart_bool,
    withpart .default:n   = true,
    withpart .initial:n   = false,
    notomath .bool_set:N  = \l__eb_notomath_bool,
    notomath .default:n   = true,
    notomath .initial:n   = true,
    rulewidth .dim_set:N  = \l__eb_rule_width_dim,
    rulewidth .initial:n  = 0.75pt,
    uppercase .bool_set:N = \l__eb_uppercase_bool,
    uppercase .default:n  = true,
    uppercase .initial:n  = true,

    footwith .choices:nn        =
      { part,page,chapter }
      { \tl_set_eq:NN \l__eb_foot_numberwith_tl \l_keys_choice_tl },
    footwith .value_required:n  = true,
    footwith .initial:n         = chapter,

    figure-sep .tl_set:N    = \l__eb_figure_separator_tl,
    table-sep .tl_set:N     = \l__eb_table_separator_tl,
    listing-sep .tl_set:N   = \l__eb_lstlisting_separator_tl,
    equation-sep .tl_set:N  = \l__eb_equation_separator_tl,
    number-sep .meta:n      =
      {
        figure-sep    = #1,
        table-sep     = #1,
        listing-sep   = #1,
        equation-sep  = #1
      },
    number-sep .initial:n   = { . }
  }

\RequirePackage
  {
    xcolor,
    footmisc,setspace,
    amsmath,amsthm,thmtools,cases,
    chemformula,siunitx,ulem,pifont,
    geometry,marginnote,nccfoots,
    pdfpages,graphicx,
    fancyhdr,titletoc,caption,
    tabularx,multirow,booktabs,
    enumitem,
    listings
  }
\ctex_at_end_preamble:n
  {
    \bool_if:NT \l__eb_notomath_bool
      { \RequirePackage{newtxmath,bm} }
  }
\ctex_at_end:n
  {
    \tl_if_empty:NF \g__eb_config_tl
      { \file_input:n { \g__eb_config_tl } }
  }

\cs_new_protected:Npn \eb_package_later_bool:nn #1#2
  {
    \@ifpackagelater{#1}{#2}
      {}{\msg_warning:nnn { easybook } { package-old } {#1}}
  }
\msg_new:nnn { easybook } { package-old }
  {
    Package~#1~has~been~out~of~date. \\
    Some~problems~or~errors~may~occur \\
    if~you~continue~compiling. \\\\
    Please~update~your~macro~package~from~CTAN.
  }
\clist_map_inline:nn
  {
    { expl3 } { 2020/10/27 },
    { xparse } { 2020/10/27 },
    { l3keys2e } { 2020/10/27 },
    { ctex } { 2021/03/14 },
    { thmtools } { 2020/08/01 },
    { caption } { 2020/08/24 }
  }
  { \eb_package_later_bool:nn #1 }

\sys_if_engine_xetex:TF
  {
    \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_switch_family:n \ctex_ltj_switch_family:n
  }
\cs_new_protected:Npn \eb_font_double_engine_set:n #1
  {
    \exp_args:Nc \RenewDocumentCommand {set#1font}{O{}mO{}}
      {\use:c { eb_set#1font:nn }{##2}{##1,##3}}
  }
\seq_const_from_clist:Nn \c__eb_font_reset_family_seq
  { main,sans,mono,CJKmain,CJKsans,CJKmono }
\seq_map_inline:Nn \c__eb_font_reset_family_seq
  { \eb_font_double_engine_set:n {#1} }

\cs_new_protected:Npn \eb_setmainfont:nn #1#2
  { \__fontspec_main_setmainfont:nn {#2} {#1} }
\cs_new_protected:Npn \eb_setsansfont:nn #1#2
  { \__fontspec_main_setsansfont:nn {#2} {#1} }
\cs_new_protected:Npn \eb_setmonofont:nn #1#2
  { \__fontspec_main_setmonofont:nn {#2} {#1} }
\cs_new_protected:Npn \eb_setCJKmainfont:nn #1#2
  { \eb_set_family:nnn { \CJKrmdefault } {#2} {#1} }
\cs_new_protected:Npn \eb_setCJKsansfont:nn #1#2
  { \eb_set_family:nnn { \CJKsfdefault } {#2} {#1} }
\cs_new_protected:Npn \eb_setCJKmonofont:nn #1#2
  { \eb_set_family:nnn { \CJKttdefault } {#2} {#1} }
\cs_new_protected:Npn \eb_set_zhfont_songti:nn #1#2
  { \eb_set_family:nnn { songti } {#2} {#1} }
\cs_new_protected:Npn \eb_set_zhfont_heiti:nn #1#2
  { \eb_set_family:nnn { heiti } {#2} {#1} }
\cs_new_protected:Npn \eb_set_zhfont_kaishu:nn #1#2
  { \eb_set_family:nnn { kaishu } {#2} {#1} }
\cs_new_protected:Npn \eb_set_zhfont_fangsong:nn #1#2
  { \eb_set_family:nnn { fangsong } {#2} {#1} }

\tl_const:Nn \eb_option_zhfont_tl
  { UprightFont = *,AutoFakeBold = 1.5,ItalicFont = * }
\cs_new_protected:Npx \eb_setCJKmainfont:n #1
  { \eb_setCJKmainfont:nn {#1} { \eb_option_zhfont_tl } }
\cs_new_protected:Npx \eb_setCJKsansfont:n #1
  { \eb_setCJKsansfont:nn {#1} { \eb_option_zhfont_tl } }
\cs_new_protected:Npx \eb_setCJKmonofont:n #1
  { \eb_setCJKmonofont:nn {#1} { \eb_option_zhfont_tl } }
\cs_new_protected:Npx \eb_set_zhfont_songti:n #1
  { \eb_set_zhfont_songti:nn {#1} { \eb_option_zhfont_tl } }
\cs_new_protected:Npx \eb_set_zhfont_heiti:n #1
  { \eb_set_zhfont_heiti:nn {#1} { \eb_option_zhfont_tl } }
\cs_new_protected:Npx \eb_set_zhfont_kaishu:n #1
  { \eb_set_zhfont_kaishu:nn {#1} { \eb_option_zhfont_tl } }
\cs_new_protected:Npx \eb_set_zhfont_fangsong:n #1
  { \eb_set_zhfont_fangsong:nn {#1} { \eb_option_zhfont_tl } }

\bool_if:NT \l__eb_font_noto_bool
  {
    \eb_setmainfont:nn { NotoSerif }
      {
        Extension   = .ttf,
        UprightFont = *-Regular,
        BoldFont    = *-Bold,
        ItalicFont  = *-Italic
      }
    \eb_setsansfont:nn { NotoSans }
      {
        Extension   = .ttf,
        UprightFont = *-Regular,
        BoldFont    = *-Bold,
        ItalicFont  = *-Italic
      }
    \eb_setmonofont:nn { NotoSansMono }
      {
        Extension   = .ttf,
        UprightFont = *-Regular,
        BoldFont    = *-Bold
      }
    \eb_setCJKmainfont:nn { FZShuSong-Z01S }
      {
        UprightFont = *,
        BoldFont    = FZHei-B01S,
        ItalicFont  = FZKai-Z03S
      }
    \eb_setCJKsansfont:n { FZHei-B01S }
    \eb_setCJKmonofont:n { FZFangSong-Z02S }
    \eb_set_zhfont_songti:n { FZShuSong-Z01S }
    \eb_set_zhfont_heiti:n { FZHei-B01S }
    \eb_set_zhfont_kaishu:n { FZKai-Z03S }
    \eb_set_zhfont_fangsong:n { FZFangSong-Z02S }
    \cs_new_protected:Npn \songti { \eb_switch_family:n { songti } }
    \cs_new_protected:Npn \heiti { \eb_switch_family:n { heiti } }
    \cs_new_protected:Npn \kaishu { \eb_switch_family:n { kaishu } }
    \cs_new_protected:Npn \fangsong { \eb_switch_family:n { fangsong } }
  }
\eb_at_end_preamble:n
  { \cs_if_exist:NF \kaishu { \cs_gset_eq:NN \kaishu \itshape } }

\includepdfset{fitpaper = true}
\geometry
  {
    vmargin         = 2.54cm,
    hmargin         = 3.17cm,
    columnsep       = 2\ccwd,
    headheight      = 2.04cm,
    headsep         = 0.5cm,
    footskip        = 0.79cm,
    footnotesep     = 0.5cm,
    marginparsep    = 8pt,
    marginparwidth  = 2.54cm
  }
\clist_new:N \g__eb_geometry_clist
\eb_ctex_define:nn { geoset }
  {
    unknown .code:n =
      {
        \clist_gput_right:Nx \g__eb_geometry_clist
          {
            \l_keys_key_str
            \tl_if_empty:NF \l_keys_value_tl { = {#1} }
          }
      }
  }

\RenewDocumentCommand{\cleardoublepage}{O{empty}}
  {
    \clearpage
    \bool_if:NT \l__eb_page_twoside_bool
      {
        \int_if_odd:nF { \c@page }
          { \hbox:n { }\thispagestyle{#1}\clearpage }
      }
  }
\RenewDocumentCommand{\frontmatter}{sO{Roman}}
  {
    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
    \boolfalse{@mainmatter}
    \pagenumbering{#2}
  }
\RenewDocumentCommand{\mainmatter}{s}
  {
    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
    \booltrue{@mainmatter}
    \pagenumbering{arabic}
  }
\cs_gset_eq:NN \easyhead \fancyhead
\cs_gset_eq:NN \easyfoot \fancyfoot
\eb_ctex_define:nn { hdrset }
  {
    head-foot .tl_set:N   = \l__eb_fancyhf_content_tl,
    head-foot .initial:n  =
      {
        \bool_if:NTF \l__eb_page_twoside_bool
          {
            \easyhead[EC]{\color{ctex@frame}\kaishu\leftmark}
            \easyhead[OC]{\color{ctex@frame}\kaishu\rightmark}
            \easyhead[EL,OR]{\color{ctex@frame}\thepage}
          }
          {
            \easyhead[L]{\color{ctex@frame}\kaishu\leftmark}
            \easyhead[R]{\color{ctex@frame}\thepage}
          }
      },

    chap-mark .cs_set:Np  = \eb_fancyhf_chapter_mark:n #1,
    chap-mark .initial:n  =
      {
        \int_compare:nNnT { \c@secnumdepth } > { -1 }
          {
            \ifbool{@mainmatter}
              {
                \int_if_odd:nT { \CTEX@chapter@numbering }
                  { \CTEXthechapter\hspace{\ccwd} }
              }{}
          }#1
      },
    sec-mark .cs_set:Np   = \eb_fancyhf_section_mark:n #1,
    sec-mark .initial:n   =
      {
        \int_compare:nNnT { \c@secnumdepth } > { 0 }
          {
            \int_if_odd:nT { \CTEX@section@numbering }
              { \CTEXthesection\hspace{0.5\ccwd} }
          }#1
      },
    subsec-mark .cs_set:Np  = \eb_fancyhf_subsection_mark:n #1,
    subsec-mark .initial:n  =
      {
        \int_compare:nNnT { \c@secnumdepth } > { 1 }
          {
            \int_if_odd:nT { \CTEX@subsection@numbering }
              { \CTEXthesubsection\hspace{0.5\ccwd} }
          }#1
      },

    headrule .tl_gset:N = \headrule,
    headrule .initial:n =
      {
        \group_begin:
        \color{ctex@frame}\vspace*{1.5pt}
        \hrule width \textwidth height \l__eb_rule_width_dim
        \group_end:
      },
    footrule .tl_gset:N = \footrule,
    footrule .initial:n = { },
    footnoterule .tl_gset:N = \footnoterule,
    footnoterule .initial:n =
      {
        \group_begin:
        \color{ctex@frame}
        \hrule width 0.35\columnwidth height \l__eb_rule_width_dim
        \vspace*{2.6pt}
        \group_end:
      },

    fnmargin .dim_set:N     = \footnotemargin,
    fnmargin .initial:n     = 0.75\ccwd,
    fnparskip .tl_set:N     = \hangfootparskip,
    fnparskip .initial:n    = 0ex,
    fnparindent .tl_set:N   = \hangfootparindent,
    fnparindent .initial:n  = 2\ccwd,

    fnhang .bool_set:N      = \l__eb_footnote_hang_bool,
    fnhang .default:n       = true,
    fnhang .initial:n       = true,
    fnmark-pos .tl_set:N    = \l__eb_fnmark_position_tl,
    fnmark-pos .initial:n   = super,
    afterfnmark .tl_set:N   = \l__eb_fnmark_after_tl,
    afterfnmark .initial:n  =
      { \tl_if_eq:NnF \l__eb_fnmark_position_tl { super } { \space } },
    fnmark-form .tl_set:N   = \l__eb_fnmark_format_tl,

    fnmark-num .choices:nn        =
      { plain,pifont,pifont*,pifont-sans,pifont-sans* }
      { \tl_gset_eq:NN \l__eb_fnmark_number_tl \l_keys_choice_tl },
    fnmark-num .value_required:n  = true
  }

\cs_new:Npn \eb_upper_number_mark_bool:nn #1#2
  {
    \bool_if:NT \l__eb_uppercase_bool
      { \text_uppercase:n } {\use:c { eb_fancyhf_#1_mark:n } {#2}}
  }
\cs_new:Npn \eb@number@markdouble #1#2
  {
    \markboth
      {\eb_upper_number_mark_bool:nn {#1} {#2}}
      {
        \bool_if:NT \l__eb_page_twoside_bool
          { \eb_upper_number_mark_bool:nn {#1} {#2} }
      }
  }
\cs_new:Npn \eb@number@markright #1#2
  { \markright{\eb_upper_number_mark_bool:nn {#1} {#2}} }
\ctex_at_end_preamble:n
  {
    \exp_args:NV \geometry \g__eb_geometry_clist
    \fancyhf{}
    \tl_use:N \l__eb_fancyhf_content_tl
    \cs_gset_eq:NN \ps@plain \ps@empty
    \pagestyle{fancy}
    \bool_if:NTF \l__eb_class_book_bool
      {
        \cs_gset:Npn \chaptermark #1
          { \eb@number@markdouble{chapter}{#1} }
        \cs_gset:Npn \sectionmark #1
          { \eb@number@markright{section}{#1} }
      }
      {
        \cs_gset:Npn \sectionmark #1
          { \eb@number@markdouble{section}{#1} }
        \cs_gset:Npn \subsectionmark #1
          { \eb@number@markright{subsection}{#1} }
      }
    \bool_if:NT \l__eb_compile_draft_bool
      {
        \easyfoot[C]{\color{SlateGray}\sffamily\today}
        \geometry{showframe}
      }
  }

\eb_at_end_preamble:n
  {
    \group_begin:
    \footnotesize
    \exp_args:Nx
    \linespread{\fp_use:N \l__eb_spread_footnote_fp}\selectfont
    \exp_args:NNNo \group_end:
    \dim_set:Nn \footnotesep { \dim_use:N \box_ht:N \strutbox }
    \bool_if:NT \l__eb_chap_withpart_bool
      { \counterwithin*{chapter}{part} }
    \tl_if_eq:NnT \l__eb_foot_numberwith_tl { part }
      {
        \counterwithout*{footnote}{chapter}
        \counterwithin*{footnote}{part}
      }
    \tl_if_eq:NnT \l__eb_foot_numberwith_tl { page }
      {
        \counterwithout*{footnote}{chapter}
        \counterwithin*{footnote}{page}
      }
    \bool_if:NTF \l__eb_footnote_hang_bool
      { \booltrue{FN@hangfoot} } { \boolfalse{FN@hangfoot} }
  }
\eb_patch_cmd:Nnn \@footnotetext
  { \reset@font }
  {
    \linespread{\fp_use:N \l__eb_spread_footnote_fp}
    \selectfont\ignorespaces
    \l__eb_font_footnote_tl
  }
\eb_patch_cmd:Nnn \@mpfootnotetext
  { \reset@font }
  {
    \linespread{\fp_use:N \l__eb_spread_footnote_fp}
    \selectfont\ignorespaces
    \l__eb_font_footnote_tl
  }
\ctex_after_end_preamble:n
  {
    \ExplSyntaxOn\char_set_catcode_letter:N \@
    \eb_patch_cmd:Nnn \@footnotemark
      { \@makefnmark }
      {
        \tl_use:N \l__eb_font_footnote_tl
        \tl_use:N \l__eb_fnmark_format_tl
          {\hbox:n { \textsuperscript{\@thefnmark} }}
      }
    \ExplSyntaxOff\char_set_catcode_other:N \@
  }
\cs_set:Npn \@makefnmark
  {
    \tl_use:N \l__eb_font_footnote_tl
    \tl_use:N \l__eb_fnmark_format_tl
      {
        \hbox:n
          {
            \tl_if_eq:NnT \l__eb_fnmark_position_tl { super }
              { \textsuperscript }{\@thefnmark}
            \tl_use:N \l__eb_fnmark_after_tl
          }
      }
  }
\cs_set:Npn \thefootnote { \eb_footnote_counter:N \c@footnote }
\cs_set:Npn \thempfootnote { \int_to_alph:n { \c@mpfootnote } }

\cs_new_protected:Npn \eb_fnmark_number_set:nn #1#2
  { \tl_const:cn { c__eb_fnmark_number_#1_tl } {#2} }
\clist_map_inline:nn
  {
    { plain } { plain },
    { pifont } { pifont },
    { pifont_neg } { pifont* },
    { pifont_sans } { pifont-sans },
    { pifont_sans_neg } { pifont-sans* }
  }
  { \eb_fnmark_number_set:nn #1 }
\cs_new:Npn \eb_fnmark_counter_pifont:N #1
  { \ding{\int_eval:n { 171 + #1 }} }
\cs_new:Npn \eb_fnmark_counter_pifont_neg:N #1
  { \ding{\int_eval:n { 181 + #1 }} }
\cs_new:Npn \eb_fnmark_counter_pifont_sans:N #1
  { \ding{\int_eval:n { 191 + #1 }} }
\cs_new:Npn \eb_fnmark_counter_pifont_sans_neg:N #1
  { \ding{\int_eval:n { 201 + #1 }} }
\cs_new:Npn \eb_footnote_counter:N #1
  {
    \tl_case:NnF \l__eb_fnmark_number_tl
      {
        \c__eb_fnmark_number_plain_tl
          { \int_use:N #1 }
        \c__eb_fnmark_number_pifont_tl
          { \eb_fnmark_counter_pifont:N #1 }
        \c__eb_fnmark_number_pifont_neg_tl
          { \eb_fnmark_counter_pifont_neg:N #1 }
        \c__eb_fnmark_number_pifont_sans_tl
          { \eb_fnmark_counter_pifont_sans:N #1 }
        \c__eb_fnmark_number_pifont_sans_neg_tl
          { \eb_fnmark_counter_pifont_sans_neg:N #1 }
      }
      { \int_use:N #1 }
  }

\contentsuse{lstlisting}{lol}
\seq_const_from_clist:Nn \c__eb_toc_heading_level_seq
  { part,chapter,section,subsection,figure,table,lstlisting }
\cs_new_protected:Npn \eb_toc_assign_keys:n #1
  {
    \ctex_define:n { tocset/#1 .meta:nn = { ctex/tocset/#1 } {##1} }
    \eb_ctex_define:nn { tocset }
      {
        #1/format .tl_set:c = l__eb_toc_#1_format_tl,
        #1/format+ .code:n  =
          { \tl_put_right:cn { l__eb_toc_#1_format_tl } {##1} },
        #1/format~+ .code:n =
          { \tl_put_right:cn { l__eb_toc_#1_format_tl } {##1} },
        #1/indent .tl_set:c = l__eb_toc_#1_indent_tl,
        #1/rule .tl_set:c   = l__eb_toc_#1_rule_tl,
        #1/numsep .tl_set:c = eb@toc@#1@numsep
      }
    \seq_if_in:NnF \c__eb_toc_heading_level_seq { subsection }
      {
        \eb_ctex_define:nn { tocset }
          { #1/belowoffset .dim_set:c = l__eb_toc_#1_offset_dim }
      }
    \seq_pop:NN \c__eb_toc_heading_level_seq \l_tmpa_tl
    \titlecontents{#1}
      [\use:c { l__eb_toc_#1_indent_tl }]
      {\use:c { l__eb_toc_#1_format_tl }}
      {
        \ifbool{eb@titletoc@hang@fix}
          {
            \contentspush
              {
                \bool_if:NT \l__eb_toc_number_color_bool
                  { \color{ctex@toc@number} }
                \thecontentslabel
                \hspace{\use:c { eb@toc@#1@numsep }}
              }
          }{}
      }{}
      {\use:c { l__eb_toc_#1_rule_tl }}
  }
\seq_map_function:NN
\c__eb_toc_heading_level_seq \eb_toc_assign_keys:n

\seq_const_from_clist:Nn \c__eb_toc_list_meta_keys_seq
  { format,format+,format~+,indent,rule,numsep,belowoffset }
\ctex_define:n { tocset/list .meta:nn = { ctex/tocset/list } {#1} }
\seq_map_inline:Nn \c__eb_toc_list_meta_keys_seq
  {
    \eb_ctex_define:nn { tocset }
      {
        list/#1 .meta:n   =
          {
            figure/#1     = ##1,
            table/#1      = ##1,
            lstlisting/#1 = ##1
          }
      }
  }

\cs_new:Npn \EbNumberline #1
  {
    \CTEXifname
      {
        \use:c { CTEXthe#1 }
        \hspace{\use:c { eb@toc@#1@numsep }}
      }{}
  }
\newbool{eb@titletoc@hang@fix}
\eb_ctex_define:nn { tocset }
  {
    lolskip .skip_set:N     = \l__eb_toc_lolskip_skip,
    lolskip .initial:n      = 0.8pc,

    belowoffset .dim_set:N  = \l__eb_toc_offset_dim,
    belowoffset .initial:n  =
      { \bool_if:NTF \l__eb_class_book_bool { -1pc } { -0.35pc } },
    tocline-fig .cs_set:Np  = \eb@labelname@lof #1,
    tocline-fig .initial:n  =
      {
        \figurename\space #1
        \notbool{eb@titletoc@hang@fix}
          {\hspace{\eb@toc@figure@numsep}}{}
      },
    tocline-tab .cs_set:Np  = \eb@labelname@lot #1,
    tocline-tab .initial:n  =
      {
        \tablename\space #1
        \notbool{eb@titletoc@hang@fix}
          {\hspace{\eb@toc@table@numsep}}{}
      },
    tocline-lst .tl_set:N   = \eb@labelname@lol,
    tocline-lst .initial:n  =
      {
        \lstlistingname\space\thelstlisting
        \notbool{eb@titletoc@hang@fix}
          {\hspace{\eb@toc@lstlisting@numsep}}{}
      },
    line-align .bool_set:N  = \l__eb_toc_line_align_bool,
    line-align .default:n   = true,
    line-align .initial:n   = true,

    hang .choice:,
    hang/true .code:n   =
      {
        \booltrue{eb@titletoc@hang@fix}
        \ctex_set:n
          {
            chapter/tocline     = \CTEXnumberline{##1}##2,
            section/tocline     = \CTEXnumberline{##1}##2,
            subsection/tocline  = \CTEXnumberline{##1}##2
          }
      },
    hang/false .code:n  =
      {
        \ctex_set:n
          {
            chapter/tocline     = \EbNumberline{##1}##2,
            section/tocline     = \EbNumberline{##1}##2,
            subsection/tocline  = \EbNumberline{##1}##2
          }
      },
    hang .default:n     = true,
    hang .initial:n     = false,

    numsep-all .meta:n    =
      {
        part/numsep       = #1,
        chapter/numsep    = #1,
        section/numsep    = #1,
        subsection/numsep = #1,
        list/numsep       = #1
      },
    numsep-all .initial:n = \ccwd,
    indent-all .meta:n    =
      {
        part/indent       = #1,
        chapter/indent    = #1,
        section/indent    = #1,
        subsection/indent = #1,
        list/indent       = #1
      },
    rule-all .meta:n      =
      {
        part/rule         = #1,
        chapter/rule      = #1,
        section/rule      = #1,
        subsection/rule   = #1,
        list/rule         = #1
      }
  }

\NewDocumentCommand{\tocrule}{sO{0.7pc}D(){1.2}mO{}}
  {
    \normalsize\normalfont
    \titlerule*[#2]{\scalebox{#3}{#4}}#5
    \IfBooleanTF{#1}
      {\thecontentspage}
      {
        \bool_if:NTF \l__eb_toc_line_align_bool
          { \contentspage } { \thecontentspage }
      }
  }
\ctex_set:nn { tocset }
  {
    part/format = \addvspace{1pc}\sffamily\large,
    part/indent = 0\ccwd,
    part/rule   = \tocrule{}[\bfseries],

    chapter/format  = \addvspace{1pc}\sffamily\large,
    chapter/indent  = 0\ccwd,
    chapter/rule    = \tocrule{$\cdot$}[\bfseries],

    section/format  = \addvspace{0.35pc},
    section/indent  =
      { \bool_if:NTF \l__eb_class_book_bool { 1.5\ccwd } { 0\ccwd } },
    section/rule    = \tocrule{$\cdot$},

    subsection/format = \addvspace{0.35pc},
    subsection/indent =
      { \bool_if:NTF \l__eb_class_book_bool { 3.8\ccwd } { 1.4\ccwd } },
    subsection/rule   = \tocrule{$\cdot$},

    list/format       = \addvspace{0.2pc},
    list/indent       = 0\ccwd,
    list/rule         = \tocrule{$\cdot$},
    list/belowoffset  =
      { \bool_if:NTF \l__eb_class_book_bool { 0pc } { 0.15pc } }
  }

\prop_new:N \l__eb_label_name_prop
\prop_set_from_keyval:Nn \l__eb_label_name_prop
  {
    figure  = \eb@labelname@lof,
    table   = \eb@labelname@lot
  }
\cs_gset:Npn \caption@@@addcontentsline #1#2#3#4
  {
    \addcontentsline{#1}{#2}
      {
        \ifbool{eb@titletoc@hang@fix}{\protect\numberline}{}
          {\prop_item:Nn \l__eb_label_name_prop {#2}{#3}}#4
      }
  }
\ctex_patch_cmd:Nnn \lst@MakeCaption
  {
    \addcontentsline{lol}{lstlisting}
      {\protect\numberline{\thelstlisting}\lst@@caption}
  }
  {
    \addcontentsline{lol}{lstlisting}
      {
        \ifbool{eb@titletoc@hang@fix}{\protect\numberline}{}
          {\eb@labelname@lol}\lst@@caption
      }
  }

\contentsuse{}{tec}
\cs_set_protected:Npn \CTEX@addbitocline #1#2
  {
    \group_begin:
    \def\CTEX@prechapter{\CTEX@prebichapter}
    \def\CTEX@thechapter{\CTEX@bichapter@number}
    \def\CTEX@postchapter{\CTEX@postbichapter}
    \addcontentsline{tec}{#1}
      {\use:c { CTEX@#1@tocline }{#1}{#2}}
    \group_end:
  }
\seq_const_from_clist:Nn \c__eb_bitoc_title_level_seq
  { chapter,section,subsection }
\seq_map_inline:Nn \c__eb_bitoc_title_level_seq
  {
    \exp_args:Nc \NewDocumentCommand {bi#1}{sO{##3}mm}
      {
        \IfBooleanTF{##1}
          {
            \use:c {#1}*{\phantomsection ##3}
            \CTEX@addtocline{#1}{##2}
            \tl_if_empty:oF {##4} { \CTEX@addbitocline{#1}{##4} }
          }{
            \use:c {#1}[##2]{##3}
            \tl_if_empty:oF {##4} { \CTEX@addbitocline{#1}{##4} }
          }
      }
  }

\eb_appto_cmd:Nn \@chapter
  {
    \skip_if_eq:nnF { \l__eb_toc_lolskip_skip } { \c_zero_skip }
      {
        \addtocontents{lol}
          {\protect\addvspace{\skip_use:N \l__eb_toc_lolskip_skip}}
      }
    \bool_if:NF \l__eb_class_book_bool
      { \msg_error:nn { easybook } { no-chapter } }
  }
\eb_appto_cmd:Nn \@schapter
  {
    \bool_if:NF \l__eb_class_book_bool
      { \msg_error:nn { easybook } { no-chapter } }
  }
\msg_new:nnn { easybook } { no-chapter }
  {
    Your~document~class~is~in~article~mode. \\
    The~\string\chapter\space~command~will~not~be~used.
  }

\tl_set:Nn \l__eb_toc_type_tl { book }
\tl_new:N \eb@bitoc@title
\keys_define:nn { eb/listoc }
  {
    article .code:n     = \tl_set:Nn \l__eb_toc_type_tl { article },
    book .code:n        = { },
    multoc .bool_set:N  = \l__eb_multoc_bool,
    multoc .default:n   = true,
    multoc .initial:n   = false,
    title .code:n       = \eb_assign_toc_title:n {#1}
  }
\bool_if:NTF \l__eb_class_book_bool
  { \keys_define:nn { } { eb/listoc .inherit:n = ctex/chapter } }
  { \keys_define:nn { } { eb/listoc .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
  {
    \tl_set:Nn \eb@toc@title {#1}
    \tl_if_novalue:nTF {#2}
      { \tl_clear:N \eb@bitoc@title }
      { \tl_set:Nn \eb@bitoc@title {#2} }
  }

\cs_new:Npn \eb_upper_nonumber_mark_bool:n #1
  {
    \bool_if:NTF \l__eb_uppercase_bool
      { \text_uppercase:n {#1} }
      { \text_titlecase_first:n {#1} }
  }
\cs_new:Npn \eb@nonumber@markdouble #1
  {
    \markboth
      {\eb_upper_nonumber_mark_bool:n {#1}}
      {
        \bool_if:NT \l__eb_page_twoside_bool
          { \eb_upper_nonumber_mark_bool:n {#1} }
      }
  }
\cs_new:Npn \eb@nonumber@markright #1
  { \markright{\eb_upper_nonumber_mark_bool:n {#1}} }

\cs_new_protected:Npn \eb_title_mark_intoc:n #1
  {
    \tl_if_eq:NnTF \l__eb_toc_type_tl { book }
      {
        \bichapter*{#1}{\eb@bitoc@title}
        \eb@nonumber@markdouble{#1}
      }
      {
        \bisection*{#1}{\eb@bitoc@title}
        \bool_if:NTF \l__eb_class_book_bool
          { \eb@nonumber@markright{#1} }
          { \eb@nonumber@markdouble{#1} }
      }
  }
\cs_new_protected:Npn \eb_title_mark_notoc:n #1
  {
    \tl_if_eq:NnTF \l__eb_toc_type_tl { book }
      {
        \chapter*{\phantomsection #1}
        \eb@nonumber@markdouble{#1}
      }
      {
        \section*{\phantomsection #1}
        \bool_if:NTF \l__eb_class_book_bool
          { \eb@nonumber@markright{#1} }
          { \eb@nonumber@markdouble{#1} }
      }
  }
\cs_new_protected:Npn \eb_title_number_intoc_bool:nn #1#2
  {
    \IfBooleanTF{#1}
      {
        \tl_if_eq:NnTF \l__eb_toc_type_tl { book }
          { \bichapter{\eb@toc@title}{\eb@bitoc@title} }
          { \bisection{\eb@toc@title}{\eb@bitoc@title} }
      }
      {
        \IfBooleanTF{#2}
          { \eb_title_mark_notoc:n {\eb@toc@title} }
          { \eb_title_mark_intoc:n {\eb@toc@title} }
      }
  }
\cs_new_protected:Npn \eb_biber_title_level_bool:n #1
  {
    \bool_if:NTF \l__eb_class_book_bool
      { \bichapter*{#1}{\l__eb_bib_bitoc_title} }
      { \bisection*{#1}{\l__eb_bib_bitoc_title} }
    \eb@nonumber@markdouble{#1}
  }
\cs_new_protected:Npn \eb_multoc_pre_bool:
  {
    \bool_if:NTF \l__eb_class_book_bool
      {
        \ifbool{@twocolumn}
          {
            \booltrue{@restonecol}
            \bool_if:NTF \l__eb_multoc_bool { \twocolumn } { \onecolumn }
          }{
            \boolfalse{@restonecol}
            \bool_if:NT \l__eb_multoc_bool { \twocolumn }
          }
      }
      { \tl_set:Nn \l__eb_toc_type_tl { article } }
  }
\cs_new_protected:Npn \eb_multoc_post_bool:
  {
    \bool_if:NT \l__eb_class_book_bool
      { \ifbool{@restonecol}{\twocolumn}{\onecolumn} }
  }
\RenewDocumentCommand{\tableofcontents}{t+oD(){}}
  {
    \group_begin:
    \tl_set_eq:NN \eb@toc@title \contentsname
    \tl_set:Nn \eb@bitoc@title { Contents }
    \IfValueT{#2}{\keys_set:nn { eb/listoc } {#2}}
    \eb_multoc_pre_bool:
    \eb_title_mark_notoc:n { \eb@toc@title }
    \vspace*{\dim_use:N \l__eb_toc_offset_dim}
    \@starttoc{toc}#3
    \IfBooleanT{#1}
      {
        \eb_title_mark_notoc:n { \eb@bitoc@title }
        \vspace*{\dim_use:N \l__eb_toc_offset_dim}
        \@starttoc{tec}
      }
    \eb_multoc_post_bool:
    \group_end:
  }
\RenewDocumentCommand{\listoffigures}{st+o}
  {
    \group_begin:
    \tl_set_eq:NN \eb@toc@title \listfigurename
    \IfValueT{#3}{\keys_set:nn { eb/listoc } {#3}}
    \eb_multoc_pre_bool:
    \eb_title_number_intoc_bool:nn {#2} {#1}
    \dim_add:NV \l__eb_toc_offset_dim \l__eb_toc_figure_offset_dim
    \vspace*{\dim_use:N \l__eb_toc_offset_dim}
    \@starttoc{lof}
    \eb_multoc_post_bool:
    \group_end:
  }
\RenewDocumentCommand{\listoftables}{st+o}
  {
    \group_begin:
    \tl_set_eq:NN \eb@toc@title \listtablename
    \IfValueT{#3}{\keys_set:nn { eb/listoc } {#3}}
    \eb_multoc_pre_bool:
    \eb_title_number_intoc_bool:nn {#2} {#1}
    \dim_add:NV \l__eb_toc_offset_dim \l__eb_toc_table_offset_dim
    \vspace*{\dim_use:N \l__eb_toc_offset_dim}
    \@starttoc{lot}
    \eb_multoc_post_bool:
    \group_end:
  }
\NewDocumentCommand{\listoflistings}{st+o}
  {
    \group_begin:
    \tl_set_eq:NN \eb@toc@title \lstlistlistingname
    \IfValueT{#3}{\keys_set:nn { eb/listoc } {#3}}
    \eb_multoc_pre_bool:
    \eb_title_number_intoc_bool:nn {#2} {#1}
    \dim_add:NV \l__eb_toc_offset_dim \l__eb_toc_lstlisting_offset_dim
    \vspace*{\dim_use:N \l__eb_toc_offset_dim}
    \@starttoc{lol}
    \eb_multoc_post_bool:
    \group_end:
  }

\ctex_at_end_package:nn { imakeidx }
  {
    \makeindex[
      options   = -M~texindy~-C~utf8,
      program   = truexindy,
      columns   = 2,
      columnsep = 2\ccwd
      ]
    \RenewDocumentCommand{\printindex}{st+D(){\imki@jobname}o}
      {
        \group_begin:
        \tl_set_eq:NN \eb@toc@title \indexname
        \cs_set_eq:NN \imki@indexlevel \use_none:n
        \setkeys{imki}{intoc = false}
        \IfValueT{#4}{\keys_set:nn { eb/listoc } {#4}}
        \bool_if:NF \l__eb_class_book_bool
          { \tl_set:Nn \l__eb_toc_type_tl { article } }
        \tl_set:Nn \imki@indexheaders
          {
            \eb_title_number_intoc_bool:nn {#2} {#1}
            \cs_set_eq:NN \thispagestyle \use_none:n
            \cs_undefine:N \imki@firstpagestyle
          }
        \imki@putindex{#3}
        \group_end:
      }
  }

\eb_ctex_define:nn { chapter }
  {
    biname .code:n      =
      { \ctex_assign_heading_name:nn { bichapter } {#1} },
    biname .initial:n   = Chapter\space,
    binmuber .tl_set:N  = \CTEX@bichapter@number,
    binmuber .initial:n = \arabic{chapter}
  }
\RenewDocumentCommand{\appendix}
  {O{Appendix\space}D(){\Alph{chapter}}}
  {
    \ctex_assign_heading_name:nn { biappendix } {#1}
    \int_compare:nNnTF { \c@chapter } > { 0 }
      {
        \ExplSyntaxOn\char_set_catcode_letter:N \@
        \eb_patch_cmd:Nnn \CTEX@addbitocline
          {
            \def\CTEX@prechapter{\CTEX@prebichapter}
            \def\CTEX@thechapter{\CTEX@bichapter@number}
            \def\CTEX@postchapter{\CTEX@postbichapter}
          }
          {
            \def\CTEX@prechapter{\CTEX@prebiappendix}
            \def\CTEX@thechapter{#2}
            \def\CTEX@postchapter{\CTEX@postbiappendix}
          }
        \ExplSyntaxOff\char_set_catcode_other:N \@
        \setcounter{chapter}{0}
        \setcounter{section}{0}
        \gdef\thechapter{\@Alph\c@chapter}
        \gdef\CTEX@prechapter{\CTEX@preappendix}
        \gdef\CTEX@thechapter{\CTEX@appendix@number}
        \gdef\CTEX@postchapter{\CTEX@postappendix}
        \gdef\CTEX@chapter@numbering{\CTEX@appendix@numbering}
      }
      {
        \setcounter{section}{0}
        \setcounter{subsection}{0}
        \gdef\thesection{\@Alph\c@section}
        \gdef\CTEX@presection{\CTEX@preappendix}
        \gdef\CTEX@thesection{\CTEX@appendix@number}
        \gdef\CTEX@postsection{\CTEX@postappendix}
        \gdef\CTEX@section@numbering{\CTEX@appendix@numbering}
        \ctex_set:nn { appendix } { number = \@Alph\c@section,name = { } }
      }
  }

\tl_new:N \l__eb_font_table_tl
\tl_new:N \l__eb_font_figure_tl
\tl_new:N \l__eb_font_listing_tl
\tl_new:N \l__eb_font_footnote_tl

\eb_ctex_define:nn { elsefont }
  {
    table-cap .tl_set:N     = \l__eb_font_table_tl,
    table-cap .initial:n    = \sffamily\small,
    figure-cap .tl_set:N    = \l__eb_font_figure_tl,
    figure-cap .initial:n   = \sffamily\small,
    listing-cap .tl_set:N   = \l__eb_font_listing_tl,
    listing-cap .initial:n  = \sffamily\small,
    footnote .tl_set:N      = \l__eb_font_footnote_tl,
    footnote .initial:n     = \rmfamily,
    marginpar .tl_set:N     = \marginfont,
    marginpar .initial:n    = \rmfamily\footnotesize
  }

\DeclareCaptionLabelSeparator{ccwd}{\hspace{\ccwd}}
\DeclareCaptionLabelFormat{parens}{\bothIfFirst{#1}{~}(#2)}
\DeclareCaptionFont{eb@table@font}{\l__eb_font_table_tl}
\DeclareCaptionFont{eb@figure@font}{\l__eb_font_figure_tl}
\DeclareCaptionFont{eb@listing@font}{\l__eb_font_listing_tl}
\captionsetup
  {
    format          = hang,
    font = {stretch = \fp_use:N \l__eb_spread_caption_fp},
    labelfont       = {color = ctex@frame},
    labelsep        = ccwd,
    singlelinecheck = true,
    belowskip       = 0pt,
    aboveskip       = 10pt
  }
\captionsetup[table]{font += eb@table@font}
\captionsetup[figure]{font += eb@figure@font}
\captionsetup[lstlisting]{font += eb@listing@font}
\captionsetup[subfigure]
  {
    labelformat = parens,
    font+       = eb@figure@font,
    belowskip   = 2pt,
    aboveskip   = 6pt
  }
\ctex_at_end_package:nn { bicaption }
  {
    \captionsetup[figure][bi-second]{name = Figure}
    \captionsetup[table][bi-second]{name = Table}
  }

\cs_new:Npn \eb_arabic:n #1 { \int_to_arabic:v { c@#1 } }
\cs_gset:cpn { thesection }
  {
    \int_compare:nNnT { \c@chapter } > { 0 } { \thechapter. }
    \eb_arabic:n { section }
  }
\seq_const_from_clist:Nn \c__eb_serial_number_counter_seq
  { figure,table,lstlisting,equation }
\seq_map_inline:Nn \c__eb_serial_number_counter_seq
  {
    \cs_set:cpn { the#1 }
      {
        \int_compare:nNnT { \c@chapter } > { 0 }
          {
            \thechapter
            \use:c { l__eb_#1_separator_tl }
          }
        \eb_arabic:n {#1}
      }
  }

\AtBeginEnvironment{tabularx}
  {
    \exp_args:Nx \linespread { \fp_use:N \l__eb_spread_table_fp }
    \selectfont\ignorespaces
  }
\AtBeginEnvironment{tabular}
  {
    \exp_args:Nx \linespread { \fp_use:N \l__eb_spread_table_fp }
    \selectfont\ignorespaces
  }
\ctex_after_end_preamble:n
  {
    \exp_args:Nx \linespread { \fp_use:N \l__eb_spread_line_fp }
    \selectfont\ignorespaces
  }

\fp_new:N \l__eb_spread_line_fp
\fp_new:N \l__eb_spread_table_fp
\fp_new:N \l__eb_spread_math_fp
\fp_new:N \l__eb_spread_caption_fp
\fp_new:N \l__eb_spread_footnote_fp

\eb_ctex_define:nn { spread }
  {
    line .fp_set:N      = \l__eb_spread_line_fp,
    line .initial:n     = 1.3,
    table .fp_set:N     = \l__eb_spread_table_fp,
    table .initial:n    = 1.05,
    math .fp_set:N      = \l__eb_spread_math_fp,
    math .initial:n     = 1.05,
    caption .fp_set:N   = \l__eb_spread_caption_fp,
    caption .initial:n  = 1,
    footnote .fp_set:N  = \l__eb_spread_footnote_fp,
    footnote .initial:n = 1,
    spread-all .meta:n  =
      {
        line      = #1,
        table     = #1,
        math      = #1,
        caption   = #1,
        footnote  = #1
      }
  }

\skip_set:Nn \parskip { 0pt plus 2pt minus 1pt }
\skip_set:Nn \floatsep { 12pt plus 2pt minus 2pt }
\skip_set:Nn \intextsep { 14pt plus 2pt minus 2pt }
\skip_set:Nn \textfloatsep { 16pt plus 2pt minus 4pt }
\skip_set:Nn \dbltextfloatsep { 16pt plus 2pt minus 4pt }
\skip_set:Nn \@fpsep { 8pt plus 2.0fil }
\setcounter{topnumber}{4}
\setcounter{bottomnumber}{4}
\setcounter{totalnumber}{8}
\tl_gset:Nn \textfraction { 0.18 }
\tl_gset:Nn \topfraction { 0.85 }
\tl_gset:Nn \bottomfraction { 0.65 }
\tl_gset:Nn \floatpagefraction { 0.60 }

\newcolumntype{L}{X}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcolumntype{R}{>{\raggedleft\arraybackslash}X}
\graphicspath{{figures/}}
\DeclareGraphicsExtensions{.pdf,.png,.jpg,.eps,.tif}

\cs_new_protected:Npn \eb_enumitem_labelval_set:nn #1#2
  { \SetEnumitemValue{label}{#1}{\color{ctex@emph}#2} }
\clist_map_inline:nn
  {
    { bullet } { \textbullet },
    { endash } { \normalfont\bfseries\textendash },
    { asterisk } { \textasteriskcentered },
    { arabic } { \arabic*. },
    { alph } { (\alph*) },
    { roman } { \roman*. },
    { outline } { \upshape\ding{111} }
  }
  { \eb_enumitem_labelval_set:nn #1 }
\SetEnumitemValue{font}{sf}{\color{ctex@emph}\normalfont\sffamily}
\SetEnumitemValue{ref}{enumii}{\arabic{enumi}.\alph*}
\SetEnumitemValue{ref}{enumiii}{\arabic{enumi}.\alph{enumii}.\roman*}
\setlist
  {
    labelsep = .75\ccwd,listparindent = 2\ccwd,leftmargin = *,
    itemsep = .75ex plus .1ex,topsep = .75ex plus .1ex,
    partopsep = 0ex,parsep = 0ex
  }
\newlist{outlinelist}{itemize}{1}
\setlist[outlinelist]{label = outline,itemsep = .5ex plus .1ex}
\setlist[itemize,1]{label = bullet}
\setlist[itemize,2]{label = endash}
\setlist[itemize,3]{label = asterisk}
\setlist[enumerate,1]{label = arabic,ref = \arabic*}
\setlist[enumerate,2]{label = alph,ref = enumii}
\setlist[enumerate,3]{label = roman,ref = enumiii,labelwidth = *}
\setlist[description]{font = sf,labelwidth = *,leftmargin = 2\ccwd}

\cs_new_protected:Npn \eb_thmname_set:nnn #1#2#3
  {
    \tl_if_eq:NnTF \l__ctex_scheme_tl { chinese }
      { \tl_const:cn { c__eb_name_#1_tl } {#3} }
      { \tl_const:cn { c__eb_name_#1_tl } {#2} }
  }
\NewDocumentCommand{\EbNewtheorem}
  {mO{\text_titlecase_first:n {#1}}mD(){tc-theorem}O{}}
  {
    \ctex_at_end_preamble:n
      {
        \eb_thmname_set:nnn {#1} {#2} {#3}
        \exp_args:No \declaretheorem@i
          {
            name  = \use:c { c__eb_name_#1_tl },
            style = easy-theorem,#5
          }{#1}[]
        \bool_if:NT \l__eb_thmbox_bool
          {
            \@ifpackageloaded{tcolorbox}
              {\tcolorboxenvironment{#1}{#4}}{}
          }
        \labelformat{#1}{\use:c { c__eb_name_#1_tl }~##1}
      }
  }

\bool_new:N \l__eb_thmbox_bool
\tl_new:N \l__eb_thm_numberwith_tl
\tl_new:N \l__eb_thm_headpunct_tl
\tl_new:N \l__eb_thm_bodyfont_tl
\tl_new:N \l__eb_thm_notefont_tl
\tl_new:N \l__eb_thm_headindent_tl
\tl_new:N \l__eb_thm_spaceabove_tl
\tl_new:N \l__eb_thm_spacebelow_tl

\RenewDocumentCommand{\newtheorem}{O{}m}
  {\AfterPreamble{\declaretheorem[#1]{#2}}}
\eb_ctex_define:nn { thmset }
  {
    thmbox .bool_set:N    = \l__eb_thmbox_bool,
    thmbox .default:n     = true,
    thmbox .initial:n     = false,
    within .tl_set:N      = \l__eb_thm_numberwith_tl,
    within .initial:n     = \bool_if:NT \l__eb_class_book_bool { chapter },
    bodyfont .tl_set:N    = \l__eb_thm_bodyfont_tl,
    bodyfont .initial:n   = { },
    notefont .tl_set:N    = \l__eb_thm_notefont_tl,
    notefont .initial:n   = { },
    headfont .tl_set:N    = \l__eb_thm_headfont_tl,
    headfont .initial:n   = \color{ctex@emph}\sffamily,
    headpunct .tl_set:N   = \l__eb_thm_headpunct_tl,
    headpunct .initial:n  = { },
    spacepost .tl_set:N   = \l__eb_thm_spacepost_tl,
    spacepost .initial:n  = \ccwd,
    headindent .tl_set:N  = \l__eb_thm_headindent_tl,
    headindent .initial:n = 0\ccwd,
    spaceabove .tl_set:N  = \l__eb_thm_spaceabove_tl,
    spaceabove .initial:n = .75ex plus .1ex,
    spacebelow .tl_set:N  = \l__eb_thm_spacebelow_tl,
    spacebelow .initial:n = .75ex plus .1ex
  }
\tl_const:Nn \c__eb_thmtools_keyval_tl
  {
    [
      spaceabove    = \l__eb_thm_spaceabove_tl,
      spacebelow    = \l__eb_thm_spacebelow_tl,
      headindent    = \l__eb_thm_headindent_tl,
      headfont      = \l__eb_thm_headfont_tl,
      notefont      = \l__eb_thm_notefont_tl,
      notebraces    = { }{ },
      bodyfont      = \l__eb_thm_bodyfont_tl,
      headpunct     = \l__eb_thm_headpunct_tl,
      postheadspace = \l__eb_thm_spacepost_tl,
      within        = \l__eb_thm_numberwith_tl,
      headformat    = \NAME\space\NUMBER\NOTE
    ]
  }
\eb_at_end_preamble:n
  {
    \exp_last_unbraced:No
    \declaretheoremstyle{\c__eb_thmtools_keyval_tl}{easy-theorem}
    \eb_thmname_set:nnn { exercise } { Exercise } { 练习 }
    \cs_undefine:N \proof
    \clist_map_inline:nn
      {
        { lemma } { 引理 },
        { example } { 例 },
        { theorem } { 定理 },
        { corollary } { 推论 },
        { definition } { 定义 },
        { proposition } { 性质 },
        { remark } { 注 } [ numbered = no ],
        { { proof } { 证明 } [ numbered = no,qed = \qedsymbol ] }
      }
      { \EbNewtheorem #1 }
  }

\ctex_at_end_package:nn { tasks }
  {
    \settasks
      {
        label           = (\Alph*),
        column-sep      = \ccwd,
        item-indent     = 2\ccwd,
        label-width     = 1.5\ccwd,
        after-item-skip = 0ex plus .1ex
      }
  }
\setchemformula
  {
    math-scripts      = false,
    charge-hshift     = 0.25\ccwd,
    subscript-vshift  = -0.2ex
  }
\sisetup
  {
    detect-shape,
    detect-family,
    detect-weight,
    table-parse-only,
    detect-display-math,
    detect-inline-family  = math,
    detect-inline-weight  = math,
    range-phrase          = \ensuremath{\sim},
    range-units           = single,
    group-digits          = false
  }
\allowdisplaybreaks[4]
\tl_gset:Nn \ULthickness { 0.75pt }
\skip_set:Nn \jot { 4pt plus 1pt minus 1pt }
\seq_const_from_clist:Nn \c__eb_math_spread_env_seq
  {
    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
  }
\seq_map_inline:Nn \c__eb_math_spread_env_seq
  {
    \AtBeginEnvironment{#1}
      {
        \linespread{\fp_use:N \l__eb_spread_math_fp}
        \selectfont\ignorespaces
      }
  }
\eb_patch_cmd:Nnn \start@gather
  { \collect@body }
  {
    \linespread{\fp_use:N \l__eb_spread_math_fp}
    \selectfont\collect@body
  }
\eb_patch_cmd:Nnn \start@align
  { \collect@body }
  {
    \linespread{\fp_use:N \l__eb_spread_math_fp}
    \selectfont\collect@body
  }
\eb_patch_cmd:Nnn \start@multline
  { \collect@body }
  {
    \linespread{\fp_use:N \l__eb_spread_math_fp}
    \selectfont\collect@body
  }
\eb_patch_cmd:Nnn \gather@split
  { \spread@equation }
  {
    \linespread{\fp_use:N \l__eb_spread_math_fp}
    \selectfont\spread@equation
  }
\ctex_after_end_preamble:n
  {
    \skip_set:Nn \abovedisplayskip { 5pt plus 1pt minus 1pt }
    \skip_set:Nn \belowdisplayskip { 5pt plus 1pt minus 1pt }
    \skip_set:Nn \abovedisplayshortskip { 0pt }
    \skip_set:Nn \belowdisplayshortskip { 5pt plus 1pt minus 1pt }
  }
\cs_gset:Npn \tagform@ #1
  { \maketag@@@{\color{ctex@emph}(\ignorespaces #1\unskip\@@italiccorr)} }
\ctex_at_end_package:nn { unicode-math }
  { \msg_redirect_module:nnn { unicode-math } { warning } { none } }

\ctex_at_end_package:nn { tcolorbox }
  {
    \eb_package_later_bool:nn { tcolorbox } { 2020/10/09 }
    \tcbset
      {
        tc-theorem/.style =
          {
            enhanced~jigsaw,pad~at~break* = 3pt,
            opacityback = 0,
            colframe = ctex@emph,
            left = 6pt,right = 6pt,top = 8pt,bottom = 8pt,middle= 8pt
          },
        tc-outline/.style =
          {
            enhanced,nofloat,
            tikznode~boxed~title,
            interior~style = white,colframe = ctex@emph,
            colbacktitle = white,coltitle = ctex@emph,
            fonttitle = \large\sffamily,fontupper = \itshape,
            boxed~title~style = {size = normal,opacityframe = 0,boxrule = 0pt},
            attach~boxed~title~to~top~center = {yshift = -\tcboxedtitleheight/2},
            arc = 3pt,boxsep = 5pt,
            after~skip = 3ex,
            left = 1.5pc,right = 1.5pc,top = 1pc,bottom = 0.5pc
          },
        tc-exercise/.style =
          {
            blank,on~line,center,
            fontupper = \Large\sffamily,
            before~skip = 3.75ex,after~skip = 2.5ex
          },
        breakable,
        boxsep    = 0pt,
        arc       = 0pt,
        fonttitle = \sffamily,
        boxrule   = \l__eb_rule_width_dim
      }
    \NewDocumentEnvironment{outline}{O{}D(){\abstractname}o+b}
      {
        \begin{tcolorbox}[tc-outline,title = #2,IfValueT = {#3}{#3}]
          \begin{outlinelist}[#1]
            #4
          \end{outlinelist}
        \end{tcolorbox}
      }{}
    \NewDocumentEnvironment{exercise}
      {st+O{LightSkyBlue}O{1.}D(){\c__eb_name_exercise_tl}o+O{}+b}
      {
        \IfBooleanTF{#2}
          {
            \tcbox[
              tc-exercise,
              fuzzy~halo  = 5pt~with~#3,
              IfValueT    = {#6}{#6},
              phantom     =
                \IfBooleanF{#1}
                  {
                    \CTEX@ifnametrue
                    \refstepcounter{section}
                    \markright{\CTEXthesection\hspace{0.5\ccwd}#5}
                    \CTEX@addtocline{section}{#5}
                  }
              ]{\IfBooleanF{#1}{\CTEXthesection\hspace{0.5\ccwd}}#5}
          }{
            \group_begin:
            \ctex_set:nn { section } { format += \centering }
            \IfValueT{#6}{\ctex_set:nn { section } {#6}}
            \IfBooleanTF{#1}{\section*{#5}}{\section{#5}}
            \group_end:
          }#7
        \begin{enumerate}[#4,labelsep = 0.5\ccwd]
          #8
        \end{enumerate}
      }{}
    \DeclareTColorBox{easybox}{sO{DarkCyan}d()O{}}
      {
        enhanced~jigsaw,pad~at~break* = 3pt,
        IfBooleanTF = {#1}
          {toptitle = 8pt,top = 8pt}
          {frame~hidden,boxrule = 0pt,toptitle = 8pt,top = 0pt},
        IfValueT = {#3}{title = #3},
        colback = #2,colbacktitle = #2,
        opacityback = 0.12,opacitybacktitle = 0.12,
        coltitle = black,colframe = black,
        left = 6pt,right = 6pt,bottom = 8pt,middle= 8pt,
        bottomtitle = 8pt,
        beforeafter~skip = 2ex,
        halign~upper = left,halign~lower = left,
        center~title,#4
      }
    \DeclareTColorBox{ebparbox}{sO{Purple}d()O{}}
      {
        frame~hidden,
        enhanced~jigsaw,pad~at~break* = 3pt,
        boxrule = 0pt,
        borderline~west = {3pt}{0pt}{#2},
        IfBooleanTF = {#1}
          {
            colback   = white,
            IfValueT  = {#3}{title = #3},
            top = 0pt,bottom = 0pt,toptitle = 0pt
          }{
            colback = #2,colbacktitle = #2,
            opacityback = 0.12,opacitybacktitle = 0.12,
            IfValueTF = {#3}{title = #3,top = 0pt}{top = 8pt},
            bottom = 8pt,toptitle = 8pt
          },
        left = 8pt,right = 8pt,middle= 8pt,
        bottomtitle = 8pt,
        beforeafter~skip = 1.5ex,
        colframe = #2,coltitle = #2,#4
      }
    \DeclareTotalTCBox{\ebemph}{O{DarkSeaGreen}vO{}}
      {
        nobeforeafter,tcbox~raise~base,
        blank,fuzzy~halo = 2pt~with~#1,#3
      }{#2}
    \DeclareTotalTCBox{\eblink}{O{Aqua}vO{}}
      {
        standard~jigsaw,
        nobeforeafter,tcbox~raise~base,
        top = 1.25pt,bottom = 1.25pt,left = 1.25pt,right = 1.25pt,
        boxrule = 0.75pt,arc = 1pt,
        colback = #1,opacityback = 0.12,colframe = #1,#3
      }{#2}
  }

\bool_set_true:N \l__eb_backend_bibtex_bool
\tl_new:N \l__eb_bib_style_tl
\tl_new:N \l__eb_bib_otherstyle_tl
\tl_new:N \l__eb_bib_citestyle_tl
\tl_new:N \l__eb_bib_datafile_tl

\eb_ctex_define:nn { bibset }
  {
    backend .choice:,
    backend/bibtex .code:n    = { },
    backend/biblatex .code:n  =
      { \bool_set_false:N \l__eb_backend_bibtex_bool },

    bib-style .choice:,
    bib-style .value_required:n   = true,
    bib-style/numerical .code:n   =
      {
        \tl_set:Nn \l__eb_bib_style_tl {#1}
        \tl_clear:N \l__eb_bib_otherstyle_tl
      },
    bib-style/authoryear .code:n  =
      {
        \tl_set:Nn \l__eb_bib_style_tl {#1}
        \tl_clear:N \l__eb_bib_otherstyle_tl
      },
    bib-style/unknown .code:n     =
      { \tl_set_eq:NN \l__eb_bib_otherstyle_tl \l_keys_value_tl },
    bib-style .initial:n          = numerical,

    cite-style .code:n  =
      { \tl_set:Nn \l__eb_bib_citestyle_tl {#1} },
    datafile .tl_set:N  = \l__eb_bib_datafile_tl,

    bitoc-title .tl_set:N   = \l__eb_bib_bitoc_title,
    bitoc-title .initial:n  = Reference
  }

\cs_new_protected:Npn \EbBibtexSet
  {
    \tl_if_empty:NTF \l__eb_bib_otherstyle_tl
      {
        \tl_if_eq:NnT \l__eb_bib_style_tl { numerical }
          {
            \bibliographystyle{gbt7714-numerical}
            \setcitestyle{comma,square,super}
          }
        \tl_if_eq:NnT \l__eb_bib_style_tl { authoryear }
          { \bibliographystyle{gbt7714-author-year} }
        \cs_set_eq:NN \cite \citep
      }
      { \exp_args:NV \bibliographystyle \l__eb_bib_otherstyle_tl }
    \tl_if_empty:NF \l__eb_bib_citestyle_tl
      { \exp_args:NV \setcitestyle \l__eb_bib_citestyle_tl }
    \skip_zero:N \bibsep
    \NewDocumentCommand{\printbibliography}{st+o}
      {
        \group_begin:
        \tl_set_eq:NN \eb@toc@title \bibname
        \IfValueT{##3}{ \keys_set:nn { eb/listoc } {##3} }
        \eb_multoc_pre_bool:
        \tl_set:Nn \bibsection
          { \eb_title_number_intoc_bool:nn {##2} {##1} }
        \exp_args:NV \bibliography \l__eb_bib_datafile_tl
        \eb_multoc_post_bool:
        \group_end:
      }
  }
\cs_new_protected:Npn \eb_put_biblatex:n #1
  { \PassOptionsToPackage{#1}{biblatex} }
\cs_new_protected:Npn \EbBiblatexPreset
  {
    \tl_if_empty:NTF \l__eb_bib_otherstyle_tl
      {
        \tl_if_eq:NnT \l__eb_bib_style_tl { numerical }
          { \eb_put_biblatex:n { style = gb7714-2015 } }
        \tl_if_eq:NnT \l__eb_bib_style_tl { authoryear }
          { \eb_put_biblatex:n { style = gb7714-2015ay } }
      }
      { \eb_put_biblatex:n { style = \l__eb_bib_otherstyle_tl } }
    \tl_if_empty:NF \l__eb_bib_citestyle_tl
      { \eb_put_biblatex:n { citestyle = \l__eb_bib_citestyle_tl } }
    \eb_put_biblatex:n { backend = biber }
  }
\cs_new_protected:Npn \EbBiblatexPostset
  {
    \exp_args:NV \addbibresource \l__eb_bib_datafile_tl
    \tl_gset:Nn \blx@default@theheading { bibintoc }
    \defbibheading{bibintoc}[\bibname]
      {\eb_biber_title_level_bool:n {##1}}
    \skip_zero:N \bibitemsep
  }
\eb_at_end_preamble:n
  {
    \tl_if_empty:NF \l__eb_bib_datafile_tl
      {
        \bool_if:NTF \l__eb_backend_bibtex_bool
          {
            \RequirePackage[sort&compress]{natbib}
            \EbBibtexSet
          }
          {
            \EbBiblatexPreset
            \RequirePackage{biblatex}
            \EbBiblatexPostset
          }
      }
  }

\lstdefinestyle{easy-listings}
  {
    language      = [LaTeX]TeX,
    texcsstyle    =
      {
        *\lst@ifdisplaystyle
          \bfseries\color{ctex@verb}
        \else
          \color{ctex@verb}
        \fi
      },
    basicstyle    =
      {
        \ttfamily\lst@ifdisplaystyle
          \small
        \else
          \color{ctex@verb}
        \fi
      },
    keywordstyle  =
      {
        \lst@ifdisplaystyle
          \bfseries\color{ctex@verb}
        \else
          \color{ctex@verb}
        \fi
      },
    framexleftmargin  = 0pt,
    framexrightmargin = 0pt,
    xleftmargin       = 3pt,
    xrightmargin      = 3pt,
    numbersep         = 10pt,
    framesep          = 3pt,
    frame             = single,
    rulecolor         = \color{ctex@frame},
    commentstyle      = \color{SlateGray},
    emphstyle         = \color{ctex@emph},
    % emph              = {},
    morekeywords      =
      {
        includegraphics,setmainfont,setsansfont,setmonofont,setCJKmainfont,setCJKsansfont,setCJKmonofont,setCJKfamilyfont,RequirePackage
      }
  }
\lstset
  {
    style         = easy-listings,
    breaklines    = true,
    resetmargins  = true,
    % numbers       = left,
    numberstyle   = \footnotesize,
    aboveskip     = 1.5ex plus .2ex minus .1ex,
    belowskip     = 0.55ex plus .2ex minus .1ex,
    keepspaces    = true,
    framerule     = \l__eb_rule_width_dim,
    columns       = flexible,
    abovecaptionskip  = -1ex,
    belowcaptionskip  = 1.5ex
  }
\lstloadlanguages{C,C++,Java,Python,Matlab}

\clist_new:N \l__eb_hyperref_clist
\cs_new_protected:Npn \eb_put_hyperref:n #1
  { \clist_put_right:Nn \l__eb_hyperref_clist {#1} }
\cs_new_protected:Npn \eb_define_linkcolor:nnn #1#2#3
  { \definecolorset{HTML}{ctex@}{}{link,#1;url,#2;cite,#3} }
\cs_new_protected:Npn \eb_define_themecolor:nnn #1#2#3
  { \definecolorset{HTML}{ctex@}{}{frame,#1;emph,#2;verb,#3} }
\cs_new_protected:Npn \eb_define_linkcolor:n #1
  { \definecolorset{HTML}{ctex@}{}{link,#1;url,#1;cite,#1} }
\cs_new_protected:Npn \eb_define_themecolor:n #1
  { \definecolorset{HTML}{ctex@}{}{frame,#1;emph,#1;verb,#1} }
\cs_new:Npn \eb_linkcolor_set:n #1
  {
    linkcolor/\clist_item:nn {#1} {1} .code:n =
      {
        \eb_define_linkcolor:nnn
          { \clist_item:nn {#1} {2} }
          { \clist_item:nn {#1} {3} }
          { \clist_item:nn {#1} {4} }
        \eb_put_hyperref:n
          {
            linkcolor = ctex@link,linkbordercolor = ctex@link,
            urlcolor = ctex@url,urlbordercolor = ctex@url,
            citecolor = ctex@cite,citebordercolor = ctex@cite
          }
      },
  }
\cs_new:Npn \eb_themecolor_set:n #1
  {
    color/\clist_item:nn {#1} {1} .code:n =
      {
        \eb_define_themecolor:nnn
          { \clist_item:nn {#1} {2} }
          { \clist_item:nn {#1} {3} }
          { \clist_item:nn {#1} {4} }
      },
  }

\bool_set_false:N \l__eb_toc_number_color_bool
\eb_ctex_define:nn { refset }
  {
    linktype .choice:,
    linktype/edge .code:n       = { },
    linktype/none .code:n       = \eb_put_hyperref:n { hidelinks },
    linktype/various .code:n    =
      {
        \bool_set_true:N \l__eb_toc_number_color_bool
        \eb_put_hyperref:n { colorlinks }
      },
    linktype .value_required:n  = true,
    linktype .initial:n         = edge,

    linktoc .choice:,
    linktoc/unknown .code:n =
      {
        \eb_put_hyperref:n { linktoc = #1 }
        \clist_map_inline:nn { page,none }
          {
            \tl_if_eq:NnT \l_keys_value_tl {##1}
              {
                \clist_map_break:n
                  { \colorlet{ctex@toc@number}{black} }
              }
          }
      },
    linktoc .default:n      = all,
    linktoc .initial:n      = all,
    unknown .code:n         =
      {
        \eb_put_hyperref:x
          {
            \l_keys_key_str
            \tl_if_empty:NF \l_keys_value_tl { = {#1} }
          }
      }
  }
\eb_ctex_define:nx { refset }
  {
    linkcolor .choice:,
    \clist_map_function:nN
      {
        { fresh,     62d71f,0000B2,005752 },
        { cutepink,  ff69b4,9d5196,57b5e5 },
        { navyblue,  000080,004986,eb6877 },
        { crimson,   dc143c,00c1c9,afcd20 }
      }
      \eb_linkcolor_set:n
    linkcolor .default:n  = navyblue,
    linkcolor .initial:n  = navyblue,
    linkcol-all .code:n   =
      { \eb_define_linkcolor:n { \exp_not:n {#1} } }
  }
\colorlet{ctex@toc@number}{ctex@link}
\eb_ctex_define:nx { style }
  {
    color .choice:,
    color .value_required:n = true,
    \clist_map_function:nN
      {
        { none,      000000,000000,000000 },
        { seaside,   4169e1,708090,9932cc },
        { energy,    f39800,00a0e9,893895 },
        { cyberpunk, 601986,eb6877,a4005b }
      }
      \eb_themecolor_set:n
    color .initial:n  = none,
    color-all .code:n =
      { \eb_define_themecolor:n { \exp_not:n {#1} } }
  }

\cs_new:Npn \eb_allow_urlbreak:
  {
    \cs_new:Npn \eb_add_urlbreak_points:
      { \tl_map_function:NN \c__eb_urlbreak_points_tl \do }
    \eb_appto_cmd:Nn \UrlBreaks
      { \UrlOrds\eb_add_urlbreak_points: }
  }
\tl_const:Nn \c__eb_urlbreak_points_tl
  {
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    abcdefghijklmnopqrstuvwxyz
    0123456789
  }
\ctex_at_end_preamble:n
  {
    \RequirePackage{hyperref}
    \urlstyle{same}
    \eb_allow_urlbreak:
    \ctex_hypersetup:n { pdfstartview = FitH }
    \exp_args:NV \hypersetup \l__eb_hyperref_clist
  }

\labelformat{part}{\CTEXthepart}
\labelformat{chapter}{\CTEXthechapter}
\labelformat{figure}{\figurename~#1}
\labelformat{table}{\tablename~#1}
\tl_if_eq:NnTF \l__ctex_scheme_tl { chinese }
  {
    \keys_set_known:nn { ctex }
      {
        contentsname        = 目\hspace{\ccwd}录,
        indexname           = 索\hspace{\ccwd}引,
        listfigurename      = 图片索引,
        listtablename       = 表格索引,
        abstractname        = 摘\hspace{\ccwd}要,
        lstlistlistingname  = 代码索引,
        lstlistingname      = 代码
      }
    \labelformat{equation}{式（#1）}
    \labelformat{section}{节 #1}
    \labelformat{subsection}{小节 #1}
  }
  {
    \keys_set_known:nn { ctex }
      {
        abstractname        = Abstract,
        lstlistlistingname  = List~of~Codes,
        lstlistingname      = Code
      }
    \labelformat{equation}{Equation~(#1)}
    \labelformat{section}{Section~#1}
    \labelformat{subsection}{Subsection~#1}
  }

\ctex_set:n
  {
    secnumdepth = 3,
    tocdepth    = \bool_if:NTF \l__eb_class_book_bool { 1 } { 2 },
    part =
      {
        pagestyle = empty,
        tocline   = \EbNumberline{#1}#2,
        format    = \color{ctex@frame}\sffamily\Huge,
        aftername =
          {
            \bool_if:NTF \l__eb_title_newline_bool
              { \par\nobreak } { \hspace{\ccwd} }
          }
      },
    chapter =
      {
        % pagestyle   = fancy,
        format      =
          {
            \color{ctex@frame}\sffamily\LARGE
            \bool_if:NF \l__eb_title_newline_bool { \centering }
          },
        aftername   =
          {
            \bool_if:NTF \l__eb_title_newline_bool
              { \par\nobreak\vskip 1.5pc } { \hspace{\ccwd} }
          },
        beforeskip  = -1.5ex,
        afterskip   = 3ex,
        lotskip     = 0.8pc,
        lofskip     = 0.8pc
      },
    section =
      {
        hang        = true,
        format      = \color{ctex@frame}\sffamily\Large,
        aftername   = \hspace{0.5\ccwd},
        beforeskip  = 1.5ex plus .2ex minus .1ex,
        afterskip   = 1.5ex plus .2ex minus .1ex
      },
    subsection =
      {
        hang        = true,
        format      = \color{ctex@frame}\sffamily\large,
        aftername   = \hspace{0.5\ccwd},
        beforeskip  = 1.3ex plus .2ex minus .1ex,
        afterskip   = 1.3ex plus .2ex minus .1ex
      },
    subsubsection =
      {
        hang        = true,
        format      = \color{ctex@frame}\sffamily,
        aftername   = \hspace{0.5\ccwd},
        beforeskip  = \parskip,
        afterskip   = \parskip
      }
  }

\bool_if:NF \l__eb_title_newline_bool
  {
    \ctex_set:n
      {
        part/hang     = true,
        chapter/hang  = true
      }
  }
\endinput
%%
%% End of file `easybook.cls'.
