texlive[58473] Master: easybook (17mar21)

commits+karl at tug.org commits+karl at tug.org
Wed Mar 17 22:42:35 CET 2021


Revision: 58473
          http://tug.org/svn/texlive?view=revision&revision=58473
Author:   karl
Date:     2021-03-17 22:42:35 +0100 (Wed, 17 Mar 2021)
Log Message:
-----------
easybook (17mar21)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/easybook/easybook-demo.pdf
    trunk/Master/texmf-dist/doc/latex/easybook/easybook-demo.tex
    trunk/Master/texmf-dist/doc/latex/easybook/easybook.pdf
    trunk/Master/texmf-dist/tex/latex/easybook/easybook.cls
    trunk/Master/tlpkg/libexec/ctan2tds

Added Paths:
-----------
    trunk/Master/texmf-dist/source/latex/easybook/
    trunk/Master/texmf-dist/source/latex/easybook/easybook.dtx

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/latex/easybook/easybook.tex

Modified: trunk/Master/texmf-dist/doc/latex/easybook/easybook-demo.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/easybook/easybook-demo.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/easybook/easybook-demo.tex	2021-03-17 21:41:11 UTC (rev 58472)
+++ trunk/Master/texmf-dist/doc/latex/easybook/easybook-demo.tex	2021-03-17 21:42:35 UTC (rev 58473)
@@ -98,7 +98,7 @@
     \url{https://latexstudio.net} \\
     \url{https://gitee.com/texl3/easybook}\thanks{Gitee为项目的主要发布地址。}
   }
-\date{2021/03/16\hskip\ccwd\relax v1.23s}
+\date{2021/03/17\hskip\ccwd\relax v1.23t}
 
 \frontmatter[roman]
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/easybook/easybook.pdf
===================================================================
(Binary files differ)

Deleted: trunk/Master/texmf-dist/doc/latex/easybook/easybook.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/easybook/easybook.tex	2021-03-17 21:41:11 UTC (rev 58472)
+++ trunk/Master/texmf-dist/doc/latex/easybook/easybook.tex	2021-03-17 21:42:35 UTC (rev 58473)
@@ -1,698 +0,0 @@
-\documentclass{ctxdoc}
-
-\title{\sffamily easybook书籍文档类}
-\author{瞿毅}
-\date{2021/03/16\hskip\ccwd\relax v1.23s\thanks{\url{https://gitee.com/texl3/easybook}}}
-
-\begin{document}
-\maketitle
-\changes{v1.20}{2021/01/09}{修改和完善用户文档。}
-\changes{v1.20}{2021/01/09}{模板更改为使用CC-BY许可协议。}
-\begin{abstract}
-  \cls{easybook} 是基于 \cls{ctexbook} 书籍文档类创建以极简为风格的模板,可以看作对 \cls{ctexbook} 的进一步包装。虽然\CTeX 文档类提供了较好的中文支持,但想实现个性化功能一般需要在其基础上载入更多宏包来定制。\cls{easybook} 考虑了一些细节并载入一些常用宏包实现一般的排版需求,它适用于排版中英文书籍或笔记,甚至可稍加调整成为学位论文模板。
-\end{abstract}
-\tableofcontents
-
-\section{编译方式}
-模板含有一个使用示例文件 \opt{easybook-demo.tex},编译前建议满足以下的条件
-\begin{itemize}
-  \item 使用 \hologo{XeLaTeX}(推荐)或 \hologo{LuaLaTeX} 两种编译方式。
-  \item 参考文献支持用 \hologo{BibTeX}(默认)或 \hologo{biber} 后端处理。
-  \item 由于用到了一些较新的宏包,建议安装最新的\TeX 发行版并将宏包升级为最新。
-\end{itemize}
-
-\subsection{编译步骤}
-\begin{frameverb}
-    xelatex -shell-escape easybook-demo
-    bibtex easybook-demo
-    makeindex easybook-demo
-    xelatex -shell-escape easybook-demo
-    xelatex -shell-escape easybook-demo
-\end{frameverb}
-
-需注意,正确\textbf{编译索引}需要增加 \opt{-shell-escape} 命令行选项。若不需要索引和参考文献,可以在正文中注释掉命令。若出现以下警告,再编译一次即可。
-\begin{frameverb}
-    LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
-\end{frameverb}
-
-\subsection{字体设置}
-\label{subsec:font settings}
-默认使用\CTeX 预置中文字库,当开启 \opt{font = noto} 选项时需要安装开源字体,中文使用方正系列的{\songti 方正书宋}、{\heiti 方正黑体}、{\kaishu 方正楷体}和{\fangsong 方正仿宋},英文使用思源系列的{\rmfamily Noto Serif}、{\sffamily Noto Sans}和{\ttfamily Noto Sans Mono},数学字体使用 \pkg{notomath}。相关选项可以见节 \ref{sec:document class options} 中的 \opt{font} 选项,字体点击此处下载\href{https://wws.lanzous.com/b01ns361i}{下载地址}。
-
-如果您不想使用\CTeX 默认字体和方正、思源字体,\textbf{自定义字体}需启用选项 \opt{font = none},并可在导言区设置中文字体,粗体与斜体不设置会产生警告。
-\begin{ctexexam}
-    \setCJKmainfont{SimSun}[BoldFont = SimHei,ItalicFont = KaiTi]
-    \setCJKsansfont{SimHei}
-    \setCJKmonofont{FangSong}
-\end{ctexexam}
-
-\section{文档类选项}
-\label{sec:document class options}
-标准 \cls{book} 文类与 \cls{ctexbook} 文类的选项同样适用于本文档。除此之外选项分为两类
-\begin{itemize}
-  \item 带有 \rexptarget\rexpstar{} 号的选项,需要在引入文档类的时候设定。
-  \item 带有 \exptarget\expstar{} 号的选项,需要通过\CTeX 宏集提供的用户接口命令 \tn{ctexset} 设定。
-\end{itemize}
-
-\begin{function}[rEXP,added = 2021-01-05]{draft}
-开启草稿模式会加快编译速度,表现有显示页面边框、行溢出的地方显示黑色方块、图片变成占位方框、显示当前日期和关闭超链接渲染。
-\end{function}
-
-\begin{function}[rEXP,added = 2021-01-05]{newline}
-章标题风格为另起一行,英文模式使用较为常见。类似下面的效果
-\begin{flushleft}\sffamily\LARGE
-  Chapter 1\vskip 1.3pc
-  This is a title
-\end{flushleft}
-\end{function}
-
-\begin{function}[rEXP,added = 2021-01-05]{entitle}
-部分标题编号由中文数字变为大写罗马数字,章标题编号由中文数字变为阿拉伯数字。比如\textbf{第一部分}变为\textbf{第I部分},\textbf{第一章}变为\textbf{第1章}。
-\end{function}
-\begin{function}[rEXP,added = 2021-01-05]{english}
-使各类标题变为英文形式。包括章节标题、图表标题和定理标题等。如\textbf{第一章}变为\textbf{Chapter 1},\textbf{图1.1} 变为 \textbf{Table 1.1}。
-\end{function}
-\begin{function}[rEXP,added = 2021-01-05]{enstyle}
-同时开启 \opt{newline}、\opt{entitle} 和 \opt{english} 三个选项以符合英文原生风格。
-\end{function}
-
-\begin{function}[rEXP,added = 2021-01-05,updated = 2021-02-02]{font}
-\begin{syntax}
-  font = <adobe|founder|mac|windows|linux|(overleaf)|noto|none>
-\end{syntax}
-传递给 \cls{ctexbook} 设置字体,最好不要使用原有的 \opt{fontset} 选项,默认情况下使用自定义字体而不开启这个选项,可根据安装的字体及电脑系统选取。\opt{noto} 与 \opt{none} 选项的相关描述见小节 \ref{subsec:font settings},\opt{overleaf} 是一个各系统通用选项,会检测系统环境选取对应字体。
-\changes{v1.21}{2021/01/12}{默认字体与\CTeX 一致,不再是自定义字体。}
-\end{function}
-
-\begin{function}[rEXP,added = 2021-01-05,updated = 2021-01-13]{paper}
-\begin{syntax}
-  paper = <(a4paper)|b5paper|letterpaper|...>
-\end{syntax}
-设置页面大小,交给 \pkg{geometry} 宏包处理,可使用它支持的所有规格。建议选项 \opt{b5paper} 和 \opt{zihao = 5},选项 \opt{a4paper} 和 \opt{zihao = -4} 配合。
-\end{function}
-
-\subsection{article 风格}
-\begin{function}[rEXP,added = 2021-03-16]{class}
-\begin{syntax}
-  class = <(book)|article>
-\end{syntax}
-设置文类风格,默认为 \opt{book} 文档类。选用 \opt{article} 使文档编号、结构等与 \cls{article} 文档类的特性相似,可用于短篇幅的文章,不要再使用 \tn{chapter} 命令,此时设置双栏目录的 \opt{style/multoc} 选项、小节 \ref{subsec:document command} 中打印目录命令的 \opt{multoc} 及 \opt{book} 选项均会失效,会以 \opt{section} 标题级别输出目录。
-\changes{v1.23s}{2021/03/16}{增加 article 文章风格,可用于短篇幅的文章。}
-\end{function}
-
-\subsection{文档命令}
-\label{subsec:document command}
-\begin{function}[added = 2021-02-20,updated = 2021-03-15]{\frontmatter,\mainmatter,\backmatter,\tableofcontents,\listoffigures,\listoftables,\listoflistings}
-\begin{syntax}
-  \tn{frontmatter*}\oarg{编号格式|(Roman)}
-  \tn{mainmatter*}
-  \tn{backmatter}
-  \tn{tableofcontents}\oarg{键值列表}
-  \tn{listoffigures*}\oarg{键值列表}
-  \tn{listoftables*}\oarg{键值列表}
-  \tn{listoflistings*}\oarg{键值列表}
-\end{syntax}
-\tn{frontmatter} 为前言区命令,章标题不编号,页码可设置为例如 \opt{roman}、\opt{Alph} 等格式,带有星号的命令 \tn{frontmatter*} 不使用 \tn{cleardoublepage}。\tn{mainmatter} 为主文区命令,章标题正常编号且页码为从1开始计数的阿拉伯数字,\tn{mainmatter*} 命令不使用 \tn{cleardoublepage}。\tn{backmatter} 为后记区命令,页码格式与编号保持不变,章标题不编号。\tn{listoffigures} 命令输出图片目录,\tn{listoftables} 命令输出表格目录,\tn{listoflistings} 命令输出代码目录。带有星号的目录命令不会添加进主文档目录中,目录的键值列表选项如下
-\changes{v1.23s}{2021/02/20}{重新定义文档结构划分命令。}
-\end{function}
-
-\begin{function}{multoc,book,article}
-\begin{syntax}
-  multoc = <true|(false)>
-\end{syntax}
-\opt{multoc} 与 \opt{style/multoc} 选项具有相同的效果,但是具有优先性且可单独设置不同目录是否双栏排版。\opt{book} 选项使目录标题按照 \opt{chapter} 级别输出,\opt{article} 选项使目录标题按照 \opt{article} 级别输出,默认为 \opt{chapter} 级别。
-\changes{v1.23s}{2021/03/15}{为几个目录增加键值列表的选项,可设置标题输出级别以及是否加入主目录。}
-\end{function}
-
-\section{接口选项}
-\begin{function}[added = 2021-01-05]{\ctexset}
-\begin{syntax}
-  \tn{ctexset}\marg{键值列表}
-\end{syntax}
-\cls{easybook} 扩展了\CTeX 宏集\LaTeX 3风格键值的通用控制命令 \tn{ctexset},接口选项同样用它设置, 原有的键值列表仍然可用。
-\end{function}
-
-\begin{function}[EXP,added = 2021-01-08]{config}
-\begin{syntax}
-  config = <配置文件名>
-\end{syntax}
-\opt{config}为载入用户配置选项,配置文件名不需加括号但需带有后缀名如 \opt{tex}、\opt{def} 和 \opt{cfg}。
-\changes{v1.10}{2021/01/08}{加入载入用户配置选项。}
-\end{function}
-
-\subsection{风格}
-\begin{function}[EXP,added = 2021-01-05,updated = 2021-03-15]{style/...,color,multoc,withpart,perpart,perpage,notomath,rulewidth,uppercase,figure-sep,table-sep,listing-sep,equation-sep,number-sep}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{style/...}
-  color = <(none)|seaside|energy|cyberpunk>
-  multoc = <true|(false)>
-  withpart = <true|(false)>
-  perpart = <true|(false)>
-  perpage = <true|(false)>
-  notomath = <(true)|false>
-  rulewidth = <(0.75pt)>
-  uppercase = <(true)|false>
-  figure-sep = <(.)>
-  table-sep = <(.)>
-  listing-sep = <(.)>
-  equation-sep = <(.)>
-  number-sep = <(.)>
-\end{syntax}
-\changes{v1.10}{2021/01/08}{更改颜色实现方式与选项名。}
-\changes{v1.23s}{2021/02/02}{noto风格的数学字体独立出来,可自定义设置。}
-\changes{v1.23s}{2021/02/09}{增加控制页面横线粗细的选项。}
-\changes{v1.23s}{2021/03/15}{增加控制编号连接符的选项。}
-\end{function}
-
-\begin{optdesc}
-  \item[color] 主题颜色,包括标题、页眉颜色等,选项 \opt{none} 为黑白页面,但不包括超链接。
-    \begin{function}{ctex at frame,ctex at emph,ctex at verb}
-    \begin{syntax}
-      \tn{definecolor}\oarg{类型}\marg{名称}\marg{模式列表}\marg{参数列表}
-    \end{syntax}
-    主题颜色用到这三个颜色,可以使用 \tn{definecolor} 命令进行更改,类似地更改超链接颜色见小节 \ref{subsec:hyperlinks}。
-    \changes{v1.10}{2021/01/08}{可以自定义主题颜色。}
-    \end{function}
-  \item[multoc] 开启双栏目录,可与 \opt{onecolumn} 和 \opt{twocolumn} 选项配合出单栏正文、单栏目录,双栏正文、单栏目录,单栏正文、双栏目录和双栏正文、双栏目录四种方式 。
-  \item[withpart] 使章跟随每一部分编号,默认不跟随。
-  \item[perpart] 使脚注跟随每一部分编号,默认不跟随。
-  \item[perpage] 使脚注跟随每一页编号,默认不跟随。
-  \item[notomath] 使用 \opt{noto} 风格的数学字体,将会加载 \pkg{newtxmath} 宏包。
-  \item[rulewidth] 调整页眉、定理盒子以及代码框线条的粗细。
-  \item[uppercase] 使用 \tn{rightmark} 及 \tn{leftmark} 获取标题内容设置页眉页脚时英文是否大小写。
-  \item[figure-sep] 图片标题编号的连接符。
-  \item[table-sep] 表格标题编号的连接符。
-  \item[listing-sep] 代码标题编号的连接符。
-  \item[equation-sep] 公式编号的连接符。
-  \item[number-sep] 统一设置所有编号的连接符。
-\end{optdesc}
-
-\subsection{超链接}
-\label{subsec:hyperlinks}
-\begin{function}[EXP,added = 2021-01-05,updated = 2021-01-08]{link/...,hyperlink,linkcolor,linktopage}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{link/...}
-  hyperlink = <(edge)|various|none>
-  linkcolor = <(fresh)|cutepink|skyblue|crimson>
-  linktopage = <true|(false)>
-\end{syntax}
-\changes{v1.10}{2021/01/08}{修复了 \opt{linktopage} 选项关闭时目录中标题编号无超链接的问题。}
-\end{function}
-
-\begin{optdesc}
-  \item[hyperlink] \opt{edge} 使超链接为边框形式,\opt{various} 使超链接为彩色字体,有四种颜色风格。\opt{none} 关闭超链接边框与颜色,此时 \opt{linkcolor} 选项无效。
-  \item[linkcolor] 超链接颜色样式。
-    \begin{function}{ctex at link,ctex at url,ctex at cite}
-    \begin{syntax}
-      \tn{definecolor}\oarg{类型}\marg{名称}\marg{模式列表}\marg{参数列表}
-    \end{syntax}
-    超链接颜色用到这三个颜色,可以使用 \tn{definecolor} 命令进行更改。
-    \changes{v1.10}{2021/01/08}{可以自定义超链接颜色。}
-    \end{function}
-  \item[linktopage] 将目录中的超链接置于页码上,默认是置于标题上。
-\end{optdesc}
-
-\subsection{行距}
-\begin{function}[EXP,added = 2021-01-05,updated = 2021-02-13]{spread/...,line,table,math,caption,footnote}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{link/...}
-  line = <(1.3)>
-  table = <(1.05)>
-  math = <(1.05)>
-  caption = <(1)>
-  footnote = <(1)>
-\end{syntax}
-行距因子用于设置各种行距倍数,只能是浮点数,不能带有长度单位。\tn{ctexset} 原有的行距选项 \opt{linespread} 失效。各行距既可在导言区全局设置也可正文中设置对后面生效,行距的意义为
-\changes{v1.21}{2021/01/12}{增加脚注线间的距离选项。}
-\changes{v1.23s}{2021/02/09}{取消使用 \pkg{zhlineskip} 宏包设置数学间距。}
-\end{function}
-
-\begin{optdesc}
-  \item[line] 正文行距。
-  \item[table] 表格行距。
-  \item[math] 数学环境行距,包括 \pkg{amsmath} 和 \pkg{mathtools} 宏包附带的环境,但并未加载 \pkg{mathtools} 宏包。
-  \item[caption] 图表代码标题行距。
-  \item[footnote] 脚注行距。
-\end{optdesc}
-
-\subsection{其它字体}
-\begin{function}[EXP,added = 2021-01-08,updated = 2021-02-13]{elsefont/...,table-cap,figure-cap,listing-cap,footnote,marginpart}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{elsefont/...}
-  table-cap = <\tn{sffamily}\tn{small}>
-  figure-cap = <\tn{sffamily}\tn{small}>
-  listing-cap = <\tn{sffamily}\tn{small}>
-  footnote = <\tn{rmfamily}>
-  marginpart = <\tn{rmfamily}\tn{footnotesize}>
-\end{syntax}
-\changes{v1.10}{2021/01/08}{加入自定义非正文字体选项。}
-\changes{v1.23s}{2021/02/08}{修复使用 \tn{zihao} 命令设置字体失效的问题。}
-\end{function}
-
-\begin{optdesc}
-  \item[table-cap] 表格标题的字体设置。
-  \item[figure-cap] 图片标题的字体设置。
-  \item[listing-cap] 代码标题的字体设置。
-  \item[footnote] 脚注的字体设置,请不要使用字号命令。
-  \item[marginpar] 边注的字体设置。
-\end{optdesc}
-
-\subsection{参考文献}
-\begin{function}[EXP,added = 2021-01-11,updated = 2021-03-15]{bibset/...,backend,bib-style,cite-style,bibfile}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{bibset/...}
-  backend = <(bibtex)|biblatex>
-  bib-style = <(numerical)|authoryear|其它格式>
-  cite-style = <标注风格>
-  bibfile = <refs.bib>
-\end{syntax}
-\changes{v1.21}{2021/01/11}{增加 \opt{bibset} 选项,可以使用 \hologo{BibTeX} 或 \hologo{biber} 编译参考文献。}
-\changes{v1.23s}{2021/02/23}{使用 \opt{bibset} 选项时可设置标注风格。}
-\end{function}
-
-\begin{optdesc}
-  \item[backend] 参考文献处理后端,默认用传统的 \hologo{BibTeX} 处理参考文献。
-  \item[bib-style] 参考文献格式为中国的参考文献推荐标准GB/T 7714-2015,有顺序编码制和著者-出版年制两种风格,理工科类一般使用顺序编码制,文科类一般使用著者-出版年制。若使用其它格式,使用 \hologo{BibTeX} 处理时需确保正确的 \opt{bst} 文件,使用 \hologo{biber} 处理可使用 \pkg{biblatex} 宏包支持的参考文献风格名称。
-  \item[cite-style] 标注参考文献的风格,\opt{backend = bibtex} 选项下可使用 \opt{super}(数字上标标注,默认)或 \opt{numbers}(数字标注)等 \pkg{natbib} 宏包带有的标注风格,\opt{backend = biblatex} 选项下可使用 \pkg{biblatex} 宏包支持的标注风格名称。
-  \item[bibfile] 参考文献的数据文件,使用 \hologo{biber} 处理时要带有 \opt{bib} 后缀,默认为一个以 \opt{refs.bib} 命名的文件。
-\end{optdesc}
-
-\begin{function}[added = 2021-01-11,updated = 2021-03-15]{\printbibliography}
-\begin{syntax}
-  \tn{printbibliography}\oarg{键值列表}
-\end{syntax}
-两种方式\textbf{均使用}此命令打印参考文献,不同处理后端此命令的键值列表不同。使用 \hologo{BibTeX} 处理时选项与小节 \ref{subsec:document command} 目录的选项相同,使用 \hologo{biber} 处理时常用的选项如下
-\end{function}
-
-\begin{function}{heading,title}
-\begin{syntax}
-  heading = <bibliography|subbibliography|(bibintoc)|subbibintoc>
-  title = <参考文献标题名>
-\end{syntax}
-\opt{heading} 为参考文献标题的处理方式,\opt{bibliography} 选项以 \opt{chapter} 级别输出参考文献,不加进目录,\opt{subbibliography} 选项以 \opt{section} 级别输出参考文献,不加进目录,\opt{bibintoc} 选项以 \opt{chapter} 级别输出参考文献,加进目录,\opt{subbibintoc} 选项以 \opt{section} 级别输出参考文献,加进目录。\opt{title} 选项覆盖由 \opt{heading} 选项提供的缺省标题名。除此之外其他支持选项可见 \pkg{biblatex} 宏包说明文档。
-\end{function}
-
-\subsection{定理样式}
-\begin{function}[EXP,added = 2021-01-12,updated = 2021-03-13]{thmset/...,thmbox,numberwith,headpunct,bodyfont,notefont,headfont,headindent,spaceabove,spacebelow,spacepost}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{thmset/...}
-  thmbox = <true|(false)>
-  numberwith = <(chapter)|section|其它环境|空置>
-  headpunct = <(未设置)>
-  bodyfont = <(未设置)>
-  notefont = <(未设置)>
-  headfont = <(\tn{color}\marg{ctex at emph}\tn{sffamily})>
-  headindent = <(0\tn{ccwd})>
-  spaceabove = <(0.75ex plus .1ex)>
-  spacebelow = <(0.75ex plus .1ex)>
-  spacepost = <(\tn{ccwd})>
-\end{syntax}
-\changes{v1.21}{2021/01/12}{增加配置定理环境样式的选项。}
-\end{function}
-
-\begin{optdesc}
-  \item[thmbox] 开启定理及习题环境的盒子边框。
-  \item[numberwith] 定理编号跟随的计数器,默认跟随章的编号,也可以跟随其它定理环境的编号,当计数器增加时定理编号会从零开始,空置时不跟随其它计数器。
-  \item[headpunct] 定理标题后的标记。
-  \item[bodyfont] 定理内容部分的字体。
-  \item[notefont] 定理标题内容的字体。
-  \item[headfont] 定理类型标题名的字体。
-  \item[headindent] 定理标题的缩进,默认无缩进,可用 \tn{parindent} 命令设置为段落缩进。
-  \item[spaceabove] 定理环境前的间距。
-  \item[spacebelow] 定理环境后的间距。
-  \item[spacepost] 定理标题后与内容的间距。
-\end{optdesc}
-
-\begin{function}[added = 2021-01-12,updated = 2021-03-13]{\newtheorem, \declaretheoremstyle}
-\begin{syntax}
-  \tn{newtheorem}\oarg{键值列表}\marg{定理环境名}
-  \tn{declaretheoremstyle}\oarg{键值列表}\marg{定理样式名}
-\end{syntax}
-\changes{v1.23s}{2021/03/12}{重新定义了新定理环境命令 \tn{newtheorem}。}
-\end{function}
-
-\begin{optdesc}
-  \item[\tn{newtheorem}] 定义新的定理类环境,可选参数与 \pkg{thmtools} 宏包定理命令 \tn{declaretheorem} 的参数一致。常用的选项如下
-  \begin{description}
-    \item[name] 定理的标题。默认值是环境的名称,并且首字母大写(英文标题)。
-    \item[numbered] 值为 \opt{no}、\opt{yes} 或 \opt{unless unique}。定理将被编号,而不是编号,或者只有在文档中多次出现时才被编号。
-    \item[numberlike] 定理将使用此计数器进行编号,通常这是另一个定理环境的名称。
-    \item[style] 用 \tn{declaretheoremstyle} 定义的定理样式的名称,定理将使用这种样式的设置。
-  \end{description}
-  \item[\tn{declaretheoremstyle}] 定义新的定理样式,可选参数中除了包括上述定理样式选项,还包括 \tn{newtheorem} 的选项。
-\end{optdesc}
-
-\subsubsection{新的定理样式}
-定理由 \pkg{thmtools} 设置,预置定理的样式为 \opt{mythm},上述定理样式选项将对这个定理样式生效。如果使用这个样式而只是增加新的定理名称,可以这样
-\begin{ctexexam}
-    \newtheorem[style = mythm,name = 定理名]{定理环境名}
-\end{ctexexam}
-若要给定理环境增加边框,可以如下进行设置
-\begin{ctexexam}
-    \tcolorboxenvironment{定理环境名}{thmsty}
-\end{ctexexam}
-定义一个新的定理样式可用于 \tn{newtheorem} 的 \opt{style} 选项。
-\begin{ctexexam}
-    \declaretheoremstyle[bodyfont = \rmfamily,spacepost = 0.5\ccwd]{定理样式名}
-\end{ctexexam}
-
-\subsection{页面边距}
-\begin{function}[EXP,added = 2021-01-13]{geoset/...,left,top,hmargin,textwidth,includehead,...}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{geoset/...}
-  left = <长度>
-  top = <长度>
-  hmargin = \marg{左边距,右边距}
-  textwidth = <长度>
-  includehead = <true|(false)>
-\end{syntax}
-\opt{geoset} 将选项交给 \pkg{geometry} 宏包接口命令 \tn{geometry} 处理,并且选项的键值列表与之相同,支持的参数可查阅宏包帮助文档。当在此设置页面大小时,会覆盖 \opt{paper} 选项的设置。
-\begin{ctexexam}
-    \ctexset
-      {
-        geoset =
-          {
-            top = 2.5cm,
-            bottom = 2.5cm,
-            left = 3.2cm,
-            right = 3.2cm
-          }
-      }
-\end{ctexexam}
-\changes{v1.21}{2021/01/13}{增加配置页面边距的选项。}
-\end{function}
-
-\subsection{页眉页脚}
-\begin{function}[EXP,added = 2021-01-13,updated = 2021-03-14]{hdrset/...,head-foot,chap-mark,sec-mark,headrule,footrule,footnoterule}
-\begin{syntax}
-  以下选项路径为 \tn{ctexset}\marg{hdrset/...}
-  head-foot = <页眉页脚中的内容>
-  chap-mark = <\tn{chaptermark} 标志命令 \tn{markboth} 中的内容>
-  sec-mark = <\tn{sectionmark} 标志命令 \tn{markright} 中的内容>
-  headrule = <页眉横线格式>
-  footrule = <页脚横线格式>
-  footnoterule = <脚注横线格式>
-\end{syntax}
-\opt{hdrset} 设置的命令由 \pkg{fancyhdr} 宏包提供支持,\opt{headrule}、\opt{footrule} 和 \opt{footnoterule} 三个横线选项一般可以使用 \tn{hrule} width \meta{长度} height \meta{高度} 命令来绘制,脚注横线默认为空。当然,手动绘制横线时线条粗细选项 \opt{style/rulewidth} 会失效。
-\changes{v1.21}{2021/01/11}{修复单面文档时页眉横线消失的问题。}
-\changes{v1.21}{2021/01/13}{增加配置页眉页脚的选项。}
-\changes{v1.23s}{2021/03/08}{优化页眉页脚设置,增加 \opt{chap-mark} 和 \opt{sec-mark} 选项。}
-\changes{v1.23s}{2021/03/14}{可以手动绘制页眉、页脚和脚注的横线。}
-\end{function}
-
-\begin{function}[added = 2021-01-13,updated = 2021-03-14]{,\easyhead,\easyfoot}
-\begin{syntax}
-  \tn{easyhead}\oarg{位置}\marg{内容}
-  \tn{easyfoot}\oarg{位置}\marg{内容}
-\end{syntax}
-命令 \tn{easyhead} 和 \tn{easyfoot} 的含义与 \tn{fancyhead} 和 \tn{fancyfoot} 相同,它们用于 \opt{head-foot} 选项中,设置的是一个名为 \opt{fancy} 的页面风格。\pkg{fancyhdr} 将页眉页脚分成了左中右和奇数页(odd)、偶数页(even)共12个部分,可选参数中E、O代表偶数、奇数,L、C、R代表左、中、右部分。单面打印时,含有偶数的选项无效。
-\begin{ctexexam}
-    \ctexset
-      {
-        hdrset =
-          {
-            head-foot =
-              {
-                \easyhead[ER]{\leftmark}
-                \easyhead[OL]{\rightmark}
-                \easyhead[EL,OR]{\textbf{\thepage}}
-              },
-            sec-mark = {\CTEXthesection\hspace{0.5\ccwd}},
-            headrule = {\hrule width \textwidth height 1pt}
-          }
-      }
-\end{ctexexam}
-\end{function}
-
-\subsection{目录样式}
-\begin{function}[EXP,added = 2021-01-13,updated = 2021-01-15]{tocset/.../format,tocset/.../indent,tocset/.../rule,lists/lolskip,lists/belowoffset,tocset/belowoffset}
-\begin{syntax}
-  format = <目录标题格式>
-  indent = <目录标题左边缩进>
-  rule = <目录引导线样式>
-  lolskip = <(0.8pc)>
-  lists/belowoffset = <(0pc)>
-  belowoffset = <(-1pc)>
-\end{syntax}
-\opt{tocset} 将目录样式交给 \pkg{titletoc} 处理,预置了 \opt{part}、\opt{chapter}、\opt{section}、\opt{subsection} 和 \opt{lists} 五种级别的目录标题,键值列表中的...代表它们。\opt{lists} 为图片、表格和代码目录格式的级别。
-
-\opt{lolskip} 是代码目录中章之间的代码标题的距离,使用刚性间距,与\CTeX 的 \opt{lotskip} 和 \opt{lofskip} 类似,它们的值均默认0.8pc。\opt{belowoffset} 选项为目录总标题 \tn{contentsname} 后的间距补偿,一般为负值,用于抵消 \opt{format} 中设置的间距。\opt{lists} 中的 \opt{belowoffset} 意义类似,但是一般为正值,在 \opt{lolskip = 0pc} 时使用。建议 \opt{lolskip+lists/format/addvspace = -belowoffset}。
-\changes{v1.21}{2021/01/13}{增加配置目录样式的选项。}
-\end{function}
-
-\begin{function}[added = 2021-01-13,updated = 2021-01-15]{\tocrule}
-\begin{syntax}
-  \tn{tocrule} = \oarg{引导点间距|(0.7pc)}\oarg{引导点大小|(1.2)}\marg{引导点}\oarg{页码格式}
-\end{syntax}
-\tn{tocrule} 命令生成目录引导线,需要在 \opt{rule} 选项中使用,其中引导线间距需带有长度单位,引导点大小不带单位,为引导点符号正常大小的倍数,引导点一般为英文句号或 \tn{cdot} 中心点符号。页码格式的内容位于页码前面,可以设置页码字体、距离。
-\begin{ctexexam}
-    \ctexset
-      {
-        tocset =
-          {
-            chapter =
-              {
-                format = \addvspace{8pt}\large,
-                indent = 1.5\ccwd,
-                rule = \tocrule[0.6pc][1.1]{.}[\zihao{5}]
-              }
-          }
-      }
-\end{ctexexam}
-\end{function}
-
-\section{常用环境}
-
-\subsection{公式}
-\begin{function}[added = 2021-01-05]{equation,multline,gather,align}
-\begin{syntax}
-  \tn{begin}\marg{环境名}
-  \tn{item} <行间公式>
-  \tn{end}\marg{环境名}
-\end{syntax}
-\opt{amsmath} 宏包提供了一系列数学环境,它们可以排布各种对齐或不对齐的公式组。\opt{multline} 环境用于一行无法放下的长公式,\opt{gather} 环境用于每行居中的公式组,\opt{align} 环境用于多列对齐的公式组。
-\end{function}
-
-\subsection{列表}
-\begin{function}[added = 2021-01-05]{enumerate,itemize,description}
-\begin{syntax}
-  \tn{begin}\marg{环境名}\oarg{键值列表}
-  \tn{item} <列表内容>
-  \tn{end}\marg{环境名}
-\end{syntax}
-\pkg{enumitem} 宏包为系统预置的列表环境提供了更灵活的标签以及间距的控制,可使用 \tn{setlist} 命令设置原有的三种列表格式。已设置默认格式,若自定义标签可例如
-\begin{ctexexam}
-    \begin{enumerate}[label = \arabic*(a),leftmargin = 1cm,resume]
-    \begin{itemize}[label = \textbullet]
-    \begin{description}[font = \sffamily\bfseries,style = nextline]
-\end{ctexexam}
-\end{function}
-
-\subsubsection{排序列表}
-\label{subsec:sort list}
-使用 \opt{enumerate} 环境可创建排序列表,使用 \opt{enumerate*} 环境产生行内部列表,可以使用\textbf{A、a、I、i和1}作为可选项为 \opt{enumerate} 与 \opt{enumerate*} 格式化标签。若生成\textbf{Item I、Item II、Item III}格式可以这样
-\begin{ctexexam}
-    \begin{enumerate*}[(a)]
-    \begin{enumerate}[\bfseries{Item} I]
-\end{ctexexam}
-
-\subsubsection{常规列表}
-使用 \opt{itemize} 环境可创建不计数列表,列表环境中若换行不缩进,若在列表中分段后则缩进两字符。 \opt{itemize*} 为行内常规列表,也提供一个可选参数。
-
-用$\star$取代默认的符号
-\begin{ctexexam}
-    \begin{itemize*}[$\star$]
-    \begin{itemize}[$\star$]
-\end{ctexexam}
-
-\subsubsection{主题列表}
-使用 \opt{description} 环境可创建带有主题词的列表。
-\begin{ctexexam}
-    \begin{description}
-      \item[主题一] 内容一
-      \item[主题二] 内容二
-    \end{description}
-\end{ctexexam}
-
-\subsection{定理}
-\begin{function}[added = 2021-01-05,updated = 2021-01-08]{theorem,definition,lemma,corollary,proposition,example,remark,proof}
-\begin{syntax}
-  \tn{begin}\marg{环境名}
-  <定理内容>
-  \tn{end}\marg{环境名}
-\end{syntax}
-这些是预置的定理环境,定理环境除了注和证明跟随章编号并可带有边框,边框和习题标题盒子可使用 \opt{thmbox = false} 开启,证明末尾会自动添加证明结束符。
-\end{function}
-
-\subsection{习题}
-\label{subsec:exercise}
-\begin{function}[added = 2021-01-05,updated = 2021-03-13]{exercise}
-\begin{syntax}
-  \tn{begin}\marg{exercise}\oarg{颜色名|(LightYellow)}\oarg{编号|(1.)}\oarg{标题|(习题)}\oarg{配置选项}
-  \tn{item} <习题内容>
-  \tn{end}\marg{exercise}
-\end{syntax}
-习题环境 \opt{exercise} 的标题紧接上一节编号并加入目录与页眉,当使用星号环境时不进行编号。三个可选参数中颜色为自定义或 \pkg{xcolor} 包含的颜色名称,正文编号格式与小节 \ref{subsec:sort list} 排序列表相同,标题名默认为摘要,参数只能\textbf{从右往左}省略。
-\begin{ctexexam}
-    \begin{exercise}[LightYellow][1.][习题]
-      \item 习题内容
-      \item 习题内容
-    \end{exercise}
-\end{ctexexam}
-\changes{v1.23s}{2021/02/08}{增加准确的习题盒子标题目录锚点。}
-\end{function}
-
-\subsection{盒子}
-盒子以及小节 \ref{subsec:exercise} 中 \opt{exercise} 环境配置的选项由 \pkg{tcolorbox} 提供支持,具体选项可见宏包文档的 Option Keys 一节,可以进行边距、字体及背景颜色等各种个性化设置,一些配置会覆盖之前预置的设置。
-
-\subsubsection{摘要盒子}
-\begin{function}[added = 2021-01-05,updated = 2021-03-13]{outline}
-\begin{syntax}
-  \tn{begin}\marg{outline}\oarg{标题名称}\oarg{配置选项}
-  \tn{item} <摘要内容>
-  \tn{end}\marg{outline}
-\end{syntax}
-摘要盒子可用于章前摘要,它的标题是可选参数,默认标题是摘要。
-\begin{ctexexam}
-    \begin{outline}[标题名称]
-      \item 摘要内容
-      \item 摘要内容
-    \end{outline}
-\end{ctexexam}
-\end{function}
-
-\subsubsection{段落盒子}
-\begin{function}[added = 2021-01-05,updated = 2021-03-13]{mybox}
-\begin{syntax}
-  \tn{begin}\marg{mybox}\oarg{段落标题}\oarg{颜色名|(MintCream)}\oarg{配置选项}
-  <盒子内容>
-  \tn{end}\marg{mybox}
-\end{syntax}
-环境 \opt{mybox} 创建一个段落盒子,可以添加可选参数的标题,否则无标题框。当使用带有星号的环境时 \oarg{颜色名} 选项生效,可以自定义背景颜色,否则无背景颜色。
-\begin{ctexexam}
-    \begin{mybox}*[段落标题][MintCream]
-      盒子内容
-      \tcblower   % 盒子上下部分分界线
-      盒子内容
-    \end{mybox}
-\end{ctexexam}
-\end{function}
-
-\subsubsection{行内盒子}
-\begin{function}[added = 2021-03-13]{\concise,\fuzzy}
-\begin{syntax}
-  \tn{concise}\oarg{颜色名}\marg{内容}\oarg{配置选项}
-  \tn{fuzzy}\oarg{颜色名}\marg{内容}\oarg{配置选项}
-\end{syntax}
-设置了两个参数选项相同的行内盒子,盒子 \opt{concise} 为抄录盒子有三个参数,行内盒子内容是必选参数其他可选。盒子 \opt{fuzzy} 也是抄录盒子,具有模糊边缘类似高亮的效果。
-\end{function}
-
-\section{其它用法}
-
-\subsection{代码}
-\begin{function}[added = 2021-01-05]{\lstinline,lstlisting,\listoflistings}
-\begin{syntax}
-  \tn{lstinline}\oarg{键值列表}\marg{行内代码}
-  \tn{begin}\marg{lstlisting}\oarg{键值列表}
-  <行间代码>
-  \tn{end}\marg{lstlisting}
-\end{syntax}
-加载 \pkg{listings} 宏包以对代码格式进行高度定制,代码样式可使用 \tn{lstset} 命令设置,\tn{listoflistings} 命令用于输出代码目录。
-\end{function}
-
-\subsection{物理量}
-\begin{function}[added = 2021-01-05,updated = 2021-02-23]{\num,\si,\SI,\SIrange}
-\begin{syntax}
-  \tn{num}\oarg{选项}\marg{数字}
-  \tn{si}\oarg{选项}\marg{单位}
-  \tn{SI}\oarg{选项}\marg{数字}\oarg{前缀}\marg{单位}
-  \tn{SIrange}\oarg{选项}\marg{数字1}\marg{数字2}\marg{单位}
-\end{syntax}
-\pkg{siunitx} 宏包的 \tn{num} 命令可以输出科学计数法,\tn{si} 命令支持数学模式,可以代替数学行内公式输入,而 \tn{SI} 命令可用来输出带有单位的量,\tn{SIrange} 可以输出带有范围和单位的量。
-\begin{ctexexam}
-    \num{-21x.3e5}
-    \si{mL.min^{-1}}
-    \SI{5}{\mole}
-    \SIrange[unit-color = green]{1.5}{4}{kg}
-\end{ctexexam}
-\end{function}
-
-\subsection{化学式}
-\begin{function}[added = 2021-01-05]{\ch,\chemfig}
-\begin{syntax}
-  \tn{ch}\oarg{选项}\marg{输入}
-  \tn{chemfig}\oarg{键值列表}\marg{分子代码}
-\end{syntax}
-除了以普通公式的方式,化学式还可用 \pkg{chemformula} 实现,无机化学式使用 \tn{ch} 命令书写。有机化学式推荐使用 \pkg{chemfig}(并未载入)的 \tn{chemfig} 命令完成。
-\end{function}
-
-\subsection{引用}
-\begin{function}[added = 2021-01-05]{\cref}
-  \begin{syntax}
-  \tn{cref}\marg{标签}
-  \end{syntax}
-使用 \pkg{cleveref} 宏包的 \tn{cref} 命令进行引用,将会自动检测环境并添加相应的前缀。
-\end{function}
-
-\subsubsection{索引}
-\begin{function}[added = 2021-01-05]{\index,\printindex}
-\begin{syntax}
-  \tn{index}\marg{标签}
-  \tn{printindex}\oarg{索引名}
-\end{syntax}
-使用 \pkg{imakeidx} 生成索引,\tn{printindex} 命令用于生成索引目录。仅做了简单的设置如将索引设为双栏并加入目录,其他选项可另外配置。
-\end{function}
-
-\subsubsection{自定义脚注}
-\begin{function}[added = 2021-01-05]{\Footnote,\Footnotetext,\Footnotemark}
-\begin{syntax}
-  \tn{Footnote}\marg{标记}\marg{插入文本}
-  \tn{Footnotetext}\marg{标记}\marg{插入文本}
-  \tn{Footnotemark}\marg{标记}
-\end{syntax}
-自定义标记且不影响正常编号的脚注命令。
-\begin{ctexexam}
-    \Footnote{*}{这是可以自定义标记的脚注。}
-\end{ctexexam}
-\end{function}
-
-\subsubsection{边注}
-\begin{function}[added = 2021-01-05]{\marginnote}
-\begin{syntax}
-  \tn{marginnote}\oarg{左文本}\marg{右文本}\oarg{垂直偏移}
-\end{syntax}
-命令 \tn{marginnote} 可以生成简单的边注,如果只给定了 \meta{右文本},那么边注在奇偶数页文字相同。如果同时给定了 \meta{左文本},则偶数页使用 \meta{左文本} 的文字。
-\end{function}
-
-\subsection{插入文档}
-\begin{function}[added = 2021-03-14]{\includepdf}
-\begin{syntax}
-  \tn{includepdf}\oarg{键值列表}\marg{文档名}
-\end{syntax}
-该命令由 \pkg{pdfpages} 提供,将其他 pdf 文档插入当前文档,比如插入封面,可以指定插入页数、逻辑页和横向等,详情查看宏包文档。
-\end{function}
-
-\subsection{横向页面}
-\begin{function}[added = 2021-03-14]{sidewaysfigure,sidewaystable}
-\begin{syntax}
-  \tn{begin}\marg{环境名}\oarg{位置}
-  <插入图片或表格>
-  \tn{end}\marg{环境名}
-\end{syntax}
-该环境由 \pkg{rotfloat} 提供,用于横向插入宽大的图片或表格,用法与 \opt{figure} 和 \opt{table} 环境类似。
-\end{function}
-
-\subsection{指定行距的段落}
-\begin{function}[added = 2021-03-14]{spacing}
-\begin{syntax}
-  \tn{begin}\marg{spacing}\marg{浮点数}
-  <段落内容>
-  \tn{end}\marg{spacing}
-\end{syntax}
-该环境由 \pkg{setspace} 提供,可以指定环境内段落的行距,使用浮点数控制行距倍数。
-\end{function}
-
-\IndexLayout
-\PrintChanges
-\PrintIndex
-\end{document}
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/latex/easybook/easybook.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/easybook/easybook.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/easybook/easybook.dtx	2021-03-17 21:42:35 UTC (rev 58473)
@@ -0,0 +1,2268 @@
+%\iffalse meta-comment
+%
+%Copyright (C) 2021 by Qu Yi <texeasybook at 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
+%<*driver>
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+  \expandafter\begingroup
+\fi
+%<*install>
+\input ctxdocstrip
+\keepsilent
+\askforoverwritefalse
+%
+\preamble
+Copyright (C) 2021 by Qu Yi <texeasybook at 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
+\endpreamble
+%
+\generate
+  {
+    \usedir{tex/latex/\jobname}
+    \file{\jobname.cls}{\from{\jobname.dtx}{class}}
+  }
+%</install>
+\ifx\fmtname\nameofplainTeX
+  \expandafter\endbatchfile
+\else
+  \expandafter\endgroup
+\fi
+%</driver>
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+%<*driver>
+\documentclass{ctxdoc}
+\OnlyDescription
+\begin{document}
+  \DocInput{\jobname.dtx}
+  \IndexLayout
+  \PrintChanges
+  \PrintIndex
+\end{document}
+%</driver>
+%\fi
+%
+%\changes{v1.20}{2021/01/09}{修改和完善用户文档。}
+%\changes{v1.20}{2021/01/09}{模板更改为使用CC-BY许可协议。}
+%
+%\CheckSum{0}
+%
+%\CharacterTable
+%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%   Digits        \0\1\2\3\4\5\6\7\8\9
+%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%   Dollar        \$     Percent       \%     Ampersand     \&
+%   Acute accent  \'     Left paren    \(     Right paren   \)
+%   Asterisk      \*     Plus          \+     Comma         \,
+%   Minus         \-     Point         \.     Solidus       \/
+%   Colon         \:     Semicolon     \;     Less than     \<
+%   Equals        \=     Greater than  \>     Question mark \?
+%   Commercial at \@     Left bracket  \[     Backslash     \\
+%   Right bracket \]     Circumflex    \^     Underscore    \_
+%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%   Right brace   \}     Tilde         \~}
+%
+%\title{\sffamily easybook书籍文档类}
+%\author{瞿毅}
+%\date{2021/03/17\hskip\ccwd\relax v1.23t\thanks{\url{https://gitee.com/texl3/easybook}}}
+%\maketitle
+%\begin{abstract}
+%  \cls{easybook} 是基于 \cls{ctexbook} 书籍文档类创建以极简为风格的模板,可以看作对 \cls{ctexbook} 的进一步包装。虽然\CTeX 文档类提供了较好的中文支持,但想实现个性化功能一般需要在其基础上载入更多宏包来定制。\cls{easybook} 考虑了一些细节并载入一些常用宏包实现一般的排版需求,它适用于排版中英文书籍或笔记,甚至可稍加调整成为学位论文模板。
+%\end{abstract}
+%\tableofcontents
+%
+%\begin{documentation}
+%\section{编译方式}
+%模板含有一个使用示例文件 \opt{easybook-demo.tex},编译前建议满足以下的条件
+%\begin{itemize}
+%  \item 使用 \hologo{XeLaTeX}(推荐)或 \hologo{LuaLaTeX} 两种编译方式。
+%  \item 参考文献支持用 \hologo{BibTeX}(默认)或 \hologo{biber} 后端处理。
+%  \item 由于用到了一些较新的宏包,建议安装最新的\TeX 发行版并将宏包升级为最新。
+%\end{itemize}
+%
+%\subsection{编译步骤}
+%\begin{frameverb}
+%    xelatex -shell-escape easybook-demo
+%    bibtex easybook-demo
+%    makeindex easybook-demo
+%    xelatex -shell-escape easybook-demo
+%    xelatex -shell-escape easybook-demo
+%\end{frameverb}
+%
+%需注意,正确\textbf{编译索引}需要增加 \opt{-shell-escape} 命令行选项。若不需要索引和参考文献,可以在正文中注释掉命令。若出现以下警告,再编译一次即可。
+%\begin{frameverb}
+%    LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
+%\end{frameverb}
+%
+%\subsection{字体设置}
+%\label{subsec:font settings}
+%默认使用\CTeX 预置中文字库,当开启 \opt{font = noto} 选项时需要安装开源字体,中文使用方正系列的{\songti 方正书宋}、{\heiti 方正黑体}、{\kaishu 方正楷体}和{\fangsong 方正仿宋},英文使用思源系列的{\rmfamily Noto Serif}、{\sffamily Noto Sans}和{\ttfamily Noto Sans Mono},数学字体使用 \pkg{notomath}。相关选项可以见节 \ref{sec:document class options} 中的 \opt{font} 选项,字体点击此处下载\href{https://wws.lanzous.com/b01ns361i}{下载地址}。
+%
+%如果您不想使用\CTeX 默认字体和方正、思源字体,\textbf{自定义字体}需启用选项 \opt{font = none},并可在导言区设置中文字体,粗体与斜体不设置会产生警告。
+%\begin{ctexexam}
+%    \setCJKmainfont{SimSun}[BoldFont = SimHei,ItalicFont = KaiTi]
+%    \setCJKsansfont{SimHei}
+%    \setCJKmonofont{FangSong}
+%\end{ctexexam}
+%
+%\section{文档类选项}
+%\label{sec:document class options}
+%标准 \cls{book} 文类与 \cls{ctexbook} 文类的选项同样适用于本文档。除此之外选项分为两类
+%\begin{itemize}
+%  \item 带有 \rexptarget\rexpstar{} 号的选项,需要在引入文档类的时候设定。
+%  \item 带有 \exptarget\expstar{} 号的选项,需要通过\CTeX 宏集提供的用户接口命令 \tn{ctexset} 设定。
+%\end{itemize}
+%
+%\begin{function}[rEXP,added = 2021-01-05]{draft}
+%开启草稿模式会加快编译速度,表现有显示页面边框、行溢出的地方显示黑色方块、图片变成占位方框、显示当前日期和关闭超链接渲染。
+%\end{function}
+%
+%\begin{function}[rEXP,added = 2021-01-05]{newline}
+%章标题风格为另起一行,英文模式使用较为常见。类似下面的效果
+%\begin{flushleft}\sffamily\LARGE
+%  Chapter 1\vskip 1.3pc
+%  This is a title
+%\end{flushleft}
+%\end{function}
+%
+%\begin{function}[rEXP,added = 2021-01-05]{entitle}
+%部分标题编号由中文数字变为大写罗马数字,章标题编号由中文数字变为阿拉伯数字。比如\textbf{第一部分}变为\textbf{第I部分},\textbf{第一章}变为\textbf{第1章}。
+%\end{function}
+%\begin{function}[rEXP,added = 2021-01-05]{english}
+%使各类标题变为英文形式。包括章节标题、图表标题和定理标题等。如\textbf{第一章}变为\textbf{Chapter 1},\textbf{图1.1} 变为 \textbf{Table 1.1}。
+%\end{function}
+%\begin{function}[rEXP,added = 2021-01-05]{enstyle}
+%同时开启 \opt{newline}、\opt{entitle} 和 \opt{english} 三个选项以符合英文原生风格。
+%\end{function}
+%
+%\begin{function}[rEXP,added = 2021-01-05,updated = 2021-02-02]{font}
+%\begin{syntax}
+%  font = <adobe|founder|mac|windows|linux|(overleaf)|noto|none>
+%\end{syntax}
+%传递给 \cls{ctexbook} 设置字体,最好不要使用原有的 \opt{fontset} 选项,默认情况下使用自定义字体而不开启这个选项,可根据安装的字体及电脑系统选取。\opt{noto} 与 \opt{none} 选项的相关描述见小节 \ref{subsec:font settings},\opt{overleaf} 是一个各系统通用选项,会检测系统环境选取对应字体。
+%\changes{v1.21}{2021/01/12}{默认字体与\CTeX 一致,不再是自定义字体。}
+%\end{function}
+%
+%\begin{function}[rEXP,added = 2021-01-05,updated = 2021-01-13]{paper}
+%\begin{syntax}
+%  paper = <(a4paper)|b5paper|letterpaper|...>
+%\end{syntax}
+%设置页面大小,交给 \pkg{geometry} 宏包处理,可使用它支持的所有规格。建议选项 \opt{b5paper} 和 \opt{zihao = 5},选项 \opt{a4paper} 和 \opt{zihao = -4} 配合。
+%\end{function}
+%
+%\subsection{article 风格}
+%\begin{function}[rEXP,added = 2021-03-16]{class}
+%\begin{syntax}
+%  class = <(book)|article>
+%\end{syntax}
+%设置文类风格,默认为 \opt{book} 文档类。选用 \opt{article} 使文档编号、结构等与 \cls{article} 文档类的特性相似,可用于短篇幅的文章,不要再使用 \tn{chapter} 命令,此时设置双栏目录的 \opt{style/multoc} 选项、小节 \ref{subsec:document command} 中打印目录命令的 \opt{multoc} 及 \opt{book} 选项均会失效,会以 \opt{section} 标题级别输出目录。
+%\changes{v1.23t}{2021/03/16}{增加 article 文章风格,可用于短篇幅的文章。}
+%\end{function}
+%
+%\subsection{文档命令}
+%\label{subsec:document command}
+%\begin{function}[added = 2021-02-20,updated = 2021-03-15]{\frontmatter,\mainmatter,\backmatter,\tableofcontents,\listoffigures,\listoftables,\listoflistings}
+%\begin{syntax}
+%  \tn{frontmatter*}\oarg{编号格式|(Roman)}
+%  \tn{mainmatter*}
+%  \tn{backmatter}
+%  \tn{tableofcontents}\oarg{键值列表}
+%  \tn{listoffigures*}\oarg{键值列表}
+%  \tn{listoftables*}\oarg{键值列表}
+%  \tn{listoflistings*}\oarg{键值列表}
+%\end{syntax}
+%\tn{frontmatter} 为前言区命令,章标题不编号,页码可设置为例如 \opt{roman}、\opt{Alph} 等格式,带有星号的命令 \tn{frontmatter*} 不使用 \tn{cleardoublepage}。\tn{mainmatter} 为主文区命令,章标题正常编号且页码为从1开始计数的阿拉伯数字,\tn{mainmatter*} 命令不使用 \tn{cleardoublepage}。\tn{backmatter} 为后记区命令,页码格式与编号保持不变,章标题不编号。\tn{listoffigures} 命令输出图片目录,\tn{listoftables} 命令输出表格目录,\tn{listoflistings} 命令输出代码目录。带有星号的目录命令不会添加进主文档目录中,目录的键值列表选项如下
+%\changes{v1.23t}{2021/02/20}{重新定义文档结构划分命令。}
+%\end{function}
+%
+%\begin{function}{multoc,book,article}
+%\begin{syntax}
+%  multoc = <true|(false)>
+%\end{syntax}
+%\opt{multoc} 与 \opt{style/multoc} 选项具有相同的效果,但是具有优先性且可单独设置不同目录是否双栏排版。\opt{book} 选项使目录标题按照 \opt{chapter} 级别输出,\opt{article} 选项使目录标题按照 \opt{article} 级别输出,默认为 \opt{chapter} 级别。
+%\changes{v1.23t}{2021/03/15}{为几个目录增加键值列表的选项,可设置标题输出级别以及是否加入主目录。}
+%\end{function}
+%
+%\section{接口选项}
+%\begin{function}[added = 2021-01-05]{\ctexset}
+%\begin{syntax}
+%  \tn{ctexset}\marg{键值列表}
+%\end{syntax}
+%\cls{easybook} 扩展了\CTeX 宏集\LaTeX 3风格键值的通用控制命令 \tn{ctexset},接口选项同样用它设置, 原有的键值列表仍然可用。
+%\end{function}
+%
+%\begin{function}[EXP,added = 2021-01-08]{config}
+%\begin{syntax}
+%  config = <配置文件名>
+%\end{syntax}
+%\opt{config}为载入用户配置选项,配置文件名不需加括号但需带有后缀名如 \opt{tex}、\opt{def} 和 \opt{cfg}。
+%\changes{v1.10}{2021/01/08}{加入载入用户配置选项。}
+%\end{function}
+%
+%\subsection{风格}
+%\begin{function}[EXP,added = 2021-01-05,updated = 2021-03-15]{style/...,color,multoc,withpart,perpart,perpage,notomath,rulewidth,uppercase,figure-sep,table-sep,listing-sep,equation-sep,number-sep}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{style/...}
+%  color = <(none)|seaside|energy|cyberpunk>
+%  multoc = <true|(false)>
+%  withpart = <true|(false)>
+%  perpart = <true|(false)>
+%  perpage = <true|(false)>
+%  notomath = <(true)|false>
+%  rulewidth = <(0.75pt)>
+%  uppercase = <(true)|false>
+%  figure-sep = <(.)>
+%  table-sep = <(.)>
+%  listing-sep = <(.)>
+%  equation-sep = <(.)>
+%  number-sep = <(.)>
+%\end{syntax}
+%\changes{v1.10}{2021/01/08}{更改颜色实现方式与选项名。}
+%\changes{v1.23t}{2021/02/02}{noto风格的数学字体独立出来,可自定义设置。}
+%\changes{v1.23t}{2021/02/09}{增加控制页面横线粗细的选项。}
+%\changes{v1.23t}{2021/03/15}{增加控制编号连接符的选项。}
+%\end{function}
+%
+%\begin{optdesc}
+%  \item[color] 主题颜色,包括标题、页眉颜色等,选项 \opt{none} 为黑白页面,但不包括超链接。
+%    \begin{function}{ctex at frame,ctex at emph,ctex at verb}
+%    \begin{syntax}
+%      \tn{definecolor}\oarg{类型}\marg{名称}\marg{模式列表}\marg{参数列表}
+%    \end{syntax}
+%    主题颜色用到这三个颜色,可以使用 \tn{definecolor} 命令进行更改,类似地更改超链接颜色见小节 \ref{subsec:hyperlinks}。
+%    \changes{v1.10}{2021/01/08}{可以自定义主题颜色。}
+%    \end{function}
+%  \item[multoc] 开启双栏目录,可与 \opt{onecolumn} 和 \opt{twocolumn} 选项配合出单栏正文、单栏目录,双栏正文、单栏目录,单栏正文、双栏目录和双栏正文、双栏目录四种方式 。
+%  \item[withpart] 使章跟随每一部分编号,默认不跟随。
+%  \item[perpart] 使脚注跟随每一部分编号,默认不跟随。
+%  \item[perpage] 使脚注跟随每一页编号,默认不跟随。
+%  \item[notomath] 使用 \opt{noto} 风格的数学字体,将会加载 \pkg{newtxmath} 宏包。
+%  \item[rulewidth] 调整页眉、定理盒子以及代码框线条的粗细。
+%  \item[uppercase] 使用 \tn{rightmark} 及 \tn{leftmark} 获取标题内容设置页眉页脚时英文是否大小写。
+%  \item[figure-sep] 图片标题编号的连接符。
+%  \item[table-sep] 表格标题编号的连接符。
+%  \item[listing-sep] 代码标题编号的连接符。
+%  \item[equation-sep] 公式编号的连接符。
+%  \item[number-sep] 统一设置所有编号的连接符。
+%\end{optdesc}
+%
+%\subsection{超链接}
+%\label{subsec:hyperlinks}
+%\begin{function}[EXP,added = 2021-01-05,updated = 2021-01-08]{link/...,hyperlink,linkcolor,linktopage}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{link/...}
+%  hyperlink = <(edge)|various|none>
+%  linkcolor = <(fresh)|cutepink|skyblue|crimson>
+%  linktopage = <true|(false)>
+%\end{syntax}
+%\changes{v1.10}{2021/01/08}{修复了 \opt{linktopage} 选项关闭时目录中标题编号无超链接的问题。}
+%\end{function}
+%
+%\begin{optdesc}
+%  \item[hyperlink] \opt{edge} 使超链接为边框形式,\opt{various} 使超链接为彩色字体,有四种颜色风格。\opt{none} 关闭超链接边框与颜色,此时 \opt{linkcolor} 选项无效。
+%  \item[linkcolor] 超链接颜色样式。
+%    \begin{function}{ctex at link,ctex at url,ctex at cite}
+%    \begin{syntax}
+%      \tn{definecolor}\oarg{类型}\marg{名称}\marg{模式列表}\marg{参数列表}
+%    \end{syntax}
+%    超链接颜色用到这三个颜色,可以使用 \tn{definecolor} 命令进行更改。
+%    \changes{v1.10}{2021/01/08}{可以自定义超链接颜色。}
+%    \end{function}
+%  \item[linktopage] 将目录中的超链接置于页码上,默认是置于标题上。
+%\end{optdesc}
+%
+%\subsection{行距}
+%\begin{function}[EXP,added = 2021-01-05,updated = 2021-02-13]{spread/...,line,table,math,caption,footnote}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{link/...}
+%  line = <(1.3)>
+%  table = <(1.05)>
+%  math = <(1.05)>
+%  caption = <(1)>
+%  footnote = <(1)>
+%\end{syntax}
+%行距因子用于设置各种行距倍数,只能是浮点数,不能带有长度单位。\tn{ctexset} 原有的行距选项 \opt{linespread} 失效。各行距既可在导言区全局设置也可正文中设置对后面生效,行距的意义为
+%\changes{v1.21}{2021/01/12}{增加脚注线间的距离选项。}
+%\changes{v1.23t}{2021/02/09}{取消使用 \pkg{zhlineskip} 宏包设置数学间距。}
+%\end{function}
+%
+%\begin{optdesc}
+%  \item[line] 正文行距。
+%  \item[table] 表格行距。
+%  \item[math] 数学环境行距,包括 \pkg{amsmath} 和 \pkg{mathtools} 宏包附带的环境,但并未加载 \pkg{mathtools} 宏包。
+%  \item[caption] 图表代码标题行距。
+%  \item[footnote] 脚注行距。
+%\end{optdesc}
+%
+%\subsection{其它字体}
+%\begin{function}[EXP,added = 2021-01-08,updated = 2021-02-13]{elsefont/...,table-cap,figure-cap,listing-cap,footnote,marginpart}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{elsefont/...}
+%  table-cap = <\tn{sffamily}\tn{small}>
+%  figure-cap = <\tn{sffamily}\tn{small}>
+%  listing-cap = <\tn{sffamily}\tn{small}>
+%  footnote = <\tn{rmfamily}>
+%  marginpart = <\tn{rmfamily}\tn{footnotesize}>
+%\end{syntax}
+%\changes{v1.10}{2021/01/08}{加入自定义非正文字体选项。}
+%\changes{v1.23t}{2021/02/08}{修复使用 \tn{zihao} 命令设置字体失效的问题。}
+%\end{function}
+%
+%\begin{optdesc}
+%  \item[table-cap] 表格标题的字体设置。
+%  \item[figure-cap] 图片标题的字体设置。
+%  \item[listing-cap] 代码标题的字体设置。
+%  \item[footnote] 脚注的字体设置,请不要使用字号命令。
+%  \item[marginpar] 边注的字体设置。
+%\end{optdesc}
+%
+%\subsection{参考文献}
+%\begin{function}[EXP,added = 2021-01-11,updated = 2021-03-15]{bibset/...,backend,bib-style,cite-style,bibfile}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{bibset/...}
+%  backend = <(bibtex)|biblatex>
+%  bib-style = <(numerical)|authoryear|其它格式>
+%  cite-style = <标注风格>
+%  bibfile = <refs.bib>
+%\end{syntax}
+%\changes{v1.21}{2021/01/11}{增加 \opt{bibset} 选项,可以使用 \hologo{BibTeX} 或 \hologo{biber} 编译参考文献。}
+%\changes{v1.23t}{2021/02/23}{使用 \opt{bibset} 选项时可设置标注风格。}
+%\end{function}
+%
+%\begin{optdesc}
+%  \item[backend] 参考文献处理后端,默认用传统的 \hologo{BibTeX} 处理参考文献。
+%  \item[bib-style] 参考文献格式为中国的参考文献推荐标准GB/T 7714-2015,有顺序编码制和著者-出版年制两种风格,理工科类一般使用顺序编码制,文科类一般使用著者-出版年制。若使用其它格式,使用 \hologo{BibTeX} 处理时需确保正确的 \opt{bst} 文件,使用 \hologo{biber} 处理可使用 \pkg{biblatex} 宏包支持的参考文献风格名称。
+%  \item[cite-style] 标注参考文献的风格,\opt{backend = bibtex} 选项下可使用 \opt{super}(数字上标标注,默认)或 \opt{numbers}(数字标注)等 \pkg{natbib} 宏包带有的标注风格,\opt{backend = biblatex} 选项下可使用 \pkg{biblatex} 宏包支持的标注风格名称。
+%  \item[bibfile] 参考文献的数据文件,使用 \hologo{biber} 处理时要带有 \opt{bib} 后缀,默认为一个以 \opt{refs.bib} 命名的文件。
+%\end{optdesc}
+%
+%\begin{function}[added = 2021-01-11,updated = 2021-03-15]{\printbibliography}
+%\begin{syntax}
+%  \tn{printbibliography}\oarg{键值列表}
+%\end{syntax}
+%两种方式\textbf{均使用}此命令打印参考文献,不同处理后端此命令的键值列表不同。使用 \hologo{BibTeX} 处理时选项与小节 \ref{subsec:document command} 目录的选项相同,使用 \hologo{biber} 处理时常用的选项如下
+%\end{function}
+%
+%\begin{function}{heading,title}
+%\begin{syntax}
+%  heading = <bibliography|subbibliography|(bibintoc)|subbibintoc>
+%  title = <参考文献标题名>
+%\end{syntax}
+%\opt{heading} 为参考文献标题的处理方式,\opt{bibliography} 选项以 \opt{chapter} 级别输出参考文献,不加进目录,\opt{subbibliography} 选项以 \opt{section} 级别输出参考文献,不加进目录,\opt{bibintoc} 选项以 \opt{chapter} 级别输出参考文献,加进目录,\opt{subbibintoc} 选项以 \opt{section} 级别输出参考文献,加进目录。\opt{title} 选项覆盖由 \opt{heading} 选项提供的缺省标题名。除此之外其他支持选项可见 \pkg{biblatex} 宏包说明文档。
+%\end{function}
+%
+%\subsection{定理样式}
+%\begin{function}[EXP,added = 2021-01-12,updated = 2021-03-13]{thmset/...,thmbox,numberwith,headpunct,bodyfont,notefont,headfont,headindent,spaceabove,spacebelow,spacepost}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{thmset/...}
+%  thmbox = <true|(false)>
+%  numberwith = <(chapter)|section|其它环境|空置>
+%  headpunct = <(未设置)>
+%  bodyfont = <(未设置)>
+%  notefont = <(未设置)>
+%  headfont = <(\tn{color}\marg{ctex at emph}\tn{sffamily})>
+%  headindent = <(0\tn{ccwd})>
+%  spaceabove = <(0.75ex plus .1ex)>
+%  spacebelow = <(0.75ex plus .1ex)>
+%  spacepost = <(\tn{ccwd})>
+%\end{syntax}
+%\changes{v1.21}{2021/01/12}{增加配置定理环境样式的选项。}
+%\end{function}
+%
+%\begin{optdesc}
+%  \item[thmbox] 开启定理及习题环境的盒子边框。
+%  \item[numberwith] 定理编号跟随的计数器,默认跟随章的编号,也可以跟随其它定理环境的编号,当计数器增加时定理编号会从零开始,空置时不跟随其它计数器。
+%  \item[headpunct] 定理标题后的标记。
+%  \item[bodyfont] 定理内容部分的字体。
+%  \item[notefont] 定理标题内容的字体。
+%  \item[headfont] 定理类型标题名的字体。
+%  \item[headindent] 定理标题的缩进,默认无缩进,可用 \tn{parindent} 命令设置为段落缩进。
+%  \item[spaceabove] 定理环境前的间距。
+%  \item[spacebelow] 定理环境后的间距。
+%  \item[spacepost] 定理标题后与内容的间距。
+%\end{optdesc}
+%
+%\begin{function}[added = 2021-01-12,updated = 2021-03-13]{\newtheorem, \declaretheoremstyle}
+%\begin{syntax}
+%  \tn{newtheorem}\oarg{键值列表}\marg{定理环境名}
+%  \tn{declaretheoremstyle}\oarg{键值列表}\marg{定理样式名}
+%\end{syntax}
+%\changes{v1.23t}{2021/03/12}{重新定义了新定理环境命令 \tn{newtheorem}。}
+%\end{function}
+%
+%\begin{optdesc}
+%  \item[\tn{newtheorem}] 定义新的定理类环境,可选参数与 \pkg{thmtools} 宏包定理命令 \tn{declaretheorem} 的参数一致。常用的选项如下
+%  \begin{description}
+%    \item[name] 定理的标题。默认值是环境的名称,并且首字母大写(英文标题)。
+%    \item[numbered] 值为 \opt{no}、\opt{yes} 或 \opt{unless unique}。定理将被编号,而不是编号,或者只有在文档中多次出现时才被编号。
+%    \item[numberlike] 定理将使用此计数器进行编号,通常这是另一个定理环境的名称。
+%    \item[style] 用 \tn{declaretheoremstyle} 定义的定理样式的名称,定理将使用这种样式的设置。
+%  \end{description}
+%  \item[\tn{declaretheoremstyle}] 定义新的定理样式,可选参数中除了包括上述定理样式选项,还包括 \tn{newtheorem} 的选项。
+%\end{optdesc}
+%
+%\subsubsection{新的定理样式}
+%定理由 \pkg{thmtools} 设置,预置定理的样式为 \opt{mythm},上述定理样式选项将对这个定理样式生效。如果使用这个样式而只是增加新的定理名称,可以这样
+%\begin{ctexexam}
+%    \newtheorem[style = mythm,name = 定理名]{定理环境名}
+%\end{ctexexam}
+%若要给定理环境增加边框,可以如下进行设置
+%\begin{ctexexam}
+%    \tcolorboxenvironment{定理环境名}{thmsty}
+%\end{ctexexam}
+%定义一个新的定理样式可用于 \tn{newtheorem} 的 \opt{style} 选项。
+%\begin{ctexexam}
+%    \declaretheoremstyle[bodyfont = \rmfamily,spacepost = 0.5\ccwd]{定理样式名}
+%\end{ctexexam}
+%
+%\subsection{页面边距}
+%\begin{function}[EXP,added = 2021-01-13]{geoset/...,left,top,hmargin,textwidth,includehead,...}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{geoset/...}
+%  left = <长度>
+%  top = <长度>
+%  hmargin = \marg{左边距,右边距}
+%  textwidth = <长度>
+%  includehead = <true|(false)>
+%\end{syntax}
+%\opt{geoset} 将选项交给 \pkg{geometry} 宏包接口命令 \tn{geometry} 处理,并且选项的键值列表与之相同,支持的参数可查阅宏包帮助文档。当在此设置页面大小时,会覆盖 \opt{paper} 选项的设置。
+%\begin{ctexexam}
+%    \ctexset
+%      {
+%        geoset =
+%          {
+%            top = 2.5cm,
+%            bottom = 2.5cm,
+%            left = 3.2cm,
+%            right = 3.2cm
+%          }
+%      }
+%\end{ctexexam}
+%\changes{v1.21}{2021/01/13}{增加配置页面边距的选项。}
+%\end{function}
+%
+%\subsection{页眉页脚}
+%\begin{function}[EXP,added = 2021-01-13,updated = 2021-03-14]{hdrset/...,head-foot,chap-mark,sec-mark,headrule,footrule,footnoterule}
+%\begin{syntax}
+%  以下选项路径为 \tn{ctexset}\marg{hdrset/...}
+%  head-foot = <页眉页脚中的内容>
+%  chap-mark = <\tn{chaptermark} 标志命令 \tn{markboth} 中的内容>
+%  sec-mark = <\tn{sectionmark} 标志命令 \tn{markright} 中的内容>
+%  headrule = <页眉横线格式>
+%  footrule = <页脚横线格式>
+%  footnoterule = <脚注横线格式>
+%\end{syntax}
+%\opt{hdrset} 设置的命令由 \pkg{fancyhdr} 宏包提供支持,\opt{headrule}、\opt{footrule} 和 \opt{footnoterule} 三个横线选项一般可以使用 \tn{hrule} width \meta{长度} height \meta{高度} 命令来绘制,脚注横线默认为空。当然,手动绘制横线时线条粗细选项 \opt{style/rulewidth} 会失效。
+%\changes{v1.21}{2021/01/11}{修复单面文档时页眉横线消失的问题。}
+%\changes{v1.21}{2021/01/13}{增加配置页眉页脚的选项。}
+%\changes{v1.23t}{2021/03/08}{优化页眉页脚设置,增加 \opt{chap-mark} 和 \opt{sec-mark} 选项。}
+%\changes{v1.23t}{2021/03/14}{可以手动绘制页眉、页脚和脚注的横线。}
+%\end{function}
+%
+%\begin{function}[added = 2021-01-13,updated = 2021-03-14]{,\easyhead,\easyfoot}
+%\begin{syntax}
+%  \tn{easyhead}\oarg{位置}\marg{内容}
+%  \tn{easyfoot}\oarg{位置}\marg{内容}
+%\end{syntax}
+%命令 \tn{easyhead} 和 \tn{easyfoot} 的含义与 \tn{fancyhead} 和 \tn{fancyfoot} 相同,它们用于 \opt{head-foot} 选项中,设置的是一个名为 \opt{fancy} 的页面风格。\pkg{fancyhdr} 将页眉页脚分成了左中右和奇数页(odd)、偶数页(even)共12个部分,可选参数中E、O代表偶数、奇数,L、C、R代表左、中、右部分。单面打印时,含有偶数的选项无效。
+%\begin{ctexexam}
+%    \ctexset
+%      {
+%        hdrset =
+%          {
+%            head-foot =
+%              {
+%                \easyhead[ER]{\leftmark}
+%                \easyhead[OL]{\rightmark}
+%                \easyhead[EL,OR]{\textbf{\thepage}}
+%              },
+%            sec-mark = {\CTEXthesection\hspace{0.5\ccwd}},
+%            headrule = {\hrule width \textwidth height 1pt}
+%          }
+%      }
+%\end{ctexexam}
+%\end{function}
+%
+%\subsection{目录样式}
+%\begin{function}[EXP,added = 2021-01-13,updated = 2021-01-15]{tocset/.../format,tocset/.../indent,tocset/.../rule,lists/lolskip,lists/belowoffset,tocset/belowoffset}
+%\begin{syntax}
+%  format = <目录标题格式>
+%  indent = <目录标题左边缩进>
+%  rule = <目录引导线样式>
+%  lolskip = <(0.8pc)>
+%  lists/belowoffset = <(0pc)>
+%  belowoffset = <(-1pc)>
+%\end{syntax}
+%\opt{tocset} 将目录样式交给 \pkg{titletoc} 处理,预置了 \opt{part}、\opt{chapter}、\opt{section}、\opt{subsection} 和 \opt{lists} 五种级别的目录标题,键值列表中的...代表它们。\opt{lists} 为图片、表格和代码目录格式的级别。
+%
+%\opt{lolskip} 是代码目录中章之间的代码标题的距离,使用刚性间距,与\CTeX 的 \opt{lotskip} 和 \opt{lofskip} 类似,它们的值均默认0.8pc。\opt{belowoffset} 选项为目录总标题 \tn{contentsname} 后的间距补偿,一般为负值,用于抵消 \opt{format} 中设置的间距。\opt{lists} 中的 \opt{belowoffset} 意义类似,但是一般为正值,在 \opt{lolskip = 0pc} 时使用。建议 \opt{lolskip + lists/format/addvspace = -belowoffset}。
+%\changes{v1.21}{2021/01/13}{增加配置目录样式的选项。}
+%\end{function}
+%
+%\begin{function}[added = 2021-01-13,updated = 2021-01-15]{\tocrule}
+%\begin{syntax}
+%  \tn{tocrule} = \oarg{引导点间距|(0.7pc)}\oarg{引导点大小|(1.2)}\marg{引导点}\oarg{页码格式}
+%\end{syntax}
+%\tn{tocrule} 命令生成目录引导线,需要在 \opt{rule} 选项中使用,其中引导线间距需带有长度单位,引导点大小不带单位,为引导点符号正常大小的倍数,引导点一般为英文句号或 \tn{cdot} 中心点符号。页码格式的内容位于页码前面,可以设置页码字体、距离。
+%\begin{ctexexam}
+%    \ctexset
+%      {
+%        tocset =
+%          {
+%            chapter =
+%              {
+%                format = \addvspace{8pt}\large,
+%                indent = 1.5\ccwd,
+%                rule = \tocrule[0.6pc][1.1]{.}[\zihao{5}]
+%              }
+%          }
+%      }
+%\end{ctexexam}
+%\end{function}
+%
+%\section{常用环境}
+%
+%\subsection{公式}
+%\begin{function}[added = 2021-01-05]{equation,multline,gather,align}
+%\begin{syntax}
+%  \tn{begin}\marg{环境名}
+%  \tn{item} <行间公式>
+%  \tn{end}\marg{环境名}
+%\end{syntax}
+%\opt{amsmath} 宏包提供了一系列数学环境,它们可以排布各种对齐或不对齐的公式组。\opt{multline} 环境用于一行无法放下的长公式,\opt{gather} 环境用于每行居中的公式组,\opt{align} 环境用于多列对齐的公式组。
+%\end{function}
+%
+%\subsection{列表}
+%\begin{function}[added = 2021-01-05]{enumerate,itemize,description}
+%\begin{syntax}
+%  \tn{begin}\marg{环境名}\oarg{键值列表}
+%  \tn{item} <列表内容>
+%  \tn{end}\marg{环境名}
+%\end{syntax}
+%\pkg{enumitem} 宏包为系统预置的列表环境提供了更灵活的标签以及间距的控制,可使用 \tn{setlist} 命令设置原有的三种列表格式。已设置默认格式,若自定义标签可例如
+%\begin{ctexexam}
+%    \begin{enumerate}[label = \arabic*(a),leftmargin = 1cm,resume]
+%    \begin{itemize}[label = \textbullet]
+%    \begin{description}[font = \sffamily\bfseries,style = nextline]
+%\end{ctexexam}
+%\end{function}
+%
+%\subsubsection{排序列表}
+%\label{subsec:sort list}
+%使用 \opt{enumerate} 环境可创建排序列表,使用 \opt{enumerate*} 环境产生行内部列表,可以使用\textbf{A、a、I、i和1}作为可选项为 \opt{enumerate} 与 \opt{enumerate*} 格式化标签。若生成\textbf{Item I、Item II、Item III}格式可以这样
+%\begin{ctexexam}
+%    \begin{enumerate*}[(a)]
+%    \begin{enumerate}[\bfseries{Item} I]
+%\end{ctexexam}
+%
+%\subsubsection{常规列表}
+%使用 \opt{itemize} 环境可创建不计数列表,列表环境中若换行不缩进,若在列表中分段后则缩进两字符。 \opt{itemize*} 为行内常规列表,也提供一个可选参数。
+%
+%用$\star$取代默认的符号
+%\begin{ctexexam}
+%    \begin{itemize*}[$\star$]
+%    \begin{itemize}[$\star$]
+%\end{ctexexam}
+%
+%\subsubsection{主题列表}
+%使用 \opt{description} 环境可创建带有主题词的列表。
+%\begin{ctexexam}
+%    \begin{description}
+%      \item[主题一] 内容一
+%      \item[主题二] 内容二
+%    \end{description}
+%\end{ctexexam}
+%
+%\subsection{定理}
+%\begin{function}[added = 2021-01-05,updated = 2021-01-08]{theorem,definition,lemma,corollary,proposition,example,remark,proof}
+%\begin{syntax}
+%  \tn{begin}\marg{环境名}
+%  <定理内容>
+%  \tn{end}\marg{环境名}
+%\end{syntax}
+%这些是预置的定理环境,定理环境除了注和证明跟随章编号并可带有边框,边框和习题标题盒子可使用 \opt{thmbox = false} 开启,证明末尾会自动添加证明结束符。
+%\end{function}
+%
+%\subsection{习题}
+%\label{subsec:exercise}
+%\begin{function}[added = 2021-01-05,updated = 2021-03-13]{exercise}
+%\begin{syntax}
+%  \tn{begin}\marg{exercise}\oarg{颜色名|(LightYellow)}\oarg{编号|(1.)}\oarg{标题|(习题)}\oarg{配置选项}
+%  \tn{item} <习题内容>
+%  \tn{end}\marg{exercise}
+%\end{syntax}
+%习题环境 \opt{exercise} 的标题紧接上一节编号并加入目录与页眉,当使用星号环境时不进行编号。三个可选参数中颜色为自定义或 \pkg{xcolor} 包含的颜色名称,正文编号格式与小节 \ref{subsec:sort list} 排序列表相同,标题名默认为摘要,参数只能\textbf{从右往左}省略。
+%\begin{ctexexam}
+%    \begin{exercise}[LightYellow][1.][习题]
+%      \item 习题内容
+%      \item 习题内容
+%    \end{exercise}
+%\end{ctexexam}
+%\changes{v1.23t}{2021/02/08}{增加准确的习题盒子标题目录锚点。}
+%\end{function}
+%
+%\subsection{盒子}
+%盒子以及小节 \ref{subsec:exercise} 中 \opt{exercise} 环境配置的选项由 \pkg{tcolorbox} 提供支持,具体选项可见宏包文档的 Option Keys 一节,可以进行边距、字体及背景颜色等各种个性化设置,一些配置会覆盖之前预置的设置。
+%
+%\subsubsection{摘要盒子}
+%\begin{function}[added = 2021-01-05,updated = 2021-03-13]{outline}
+%\begin{syntax}
+%  \tn{begin}\marg{outline}\oarg{标题名称}\oarg{配置选项}
+%  \tn{item} <摘要内容>
+%  \tn{end}\marg{outline}
+%\end{syntax}
+%摘要盒子可用于章前摘要,它的标题是可选参数,默认标题是摘要。
+%\begin{ctexexam}
+%    \begin{outline}[标题名称]
+%      \item 摘要内容
+%      \item 摘要内容
+%    \end{outline}
+%\end{ctexexam}
+%\end{function}
+%
+%\subsubsection{段落盒子}
+%\begin{function}[added = 2021-01-05,updated = 2021-03-13]{mybox}
+%\begin{syntax}
+%  \tn{begin}\marg{mybox}\oarg{段落标题}\oarg{颜色名|(MintCream)}\oarg{配置选项}
+%  <盒子内容>
+%  \tn{end}\marg{mybox}
+%\end{syntax}
+%环境 \opt{mybox} 创建一个段落盒子,可以添加可选参数的标题,否则无标题框。当使用带有星号的环境时 \oarg{颜色名} 选项生效,可以自定义背景颜色,否则无背景颜色。
+%\begin{ctexexam}
+%    \begin{mybox}*[段落标题][MintCream]
+%      盒子内容
+%      \tcblower   % 盒子上下部分分界线
+%      盒子内容
+%    \end{mybox}
+%\end{ctexexam}
+%\end{function}
+%
+%\subsubsection{行内盒子}
+%\begin{function}[added = 2021-03-13]{\concise,\fuzzy}
+%\begin{syntax}
+%  \tn{concise}\oarg{颜色名}\marg{内容}\oarg{配置选项}
+%  \tn{fuzzy}\oarg{颜色名}\marg{内容}\oarg{配置选项}
+%\end{syntax}
+%设置了两个参数选项相同的行内盒子,盒子 \opt{concise} 为抄录盒子有三个参数,行内盒子内容是必选参数其他可选。盒子 \opt{fuzzy} 也是抄录盒子,具有模糊边缘类似高亮的效果。
+%\end{function}
+%
+%\section{其它用法}
+%
+%\subsection{代码}
+%\begin{function}[added = 2021-01-05]{\lstinline,lstlisting,\listoflistings}
+%\begin{syntax}
+%  \tn{lstinline}\oarg{键值列表}\marg{行内代码}
+%  \tn{begin}\marg{lstlisting}\oarg{键值列表}
+%  <行间代码>
+%  \tn{end}\marg{lstlisting}
+%\end{syntax}
+%加载 \pkg{listings} 宏包以对代码格式进行高度定制,代码样式可使用 \tn{lstset} 命令设置,\tn{listoflistings} 命令用于输出代码目录。
+%\end{function}
+%
+%\subsection{物理量}
+%\begin{function}[added = 2021-01-05,updated = 2021-02-23]{\num,\si,\SI,\SIrange}
+%\begin{syntax}
+%  \tn{num}\oarg{选项}\marg{数字}
+%  \tn{si}\oarg{选项}\marg{单位}
+%  \tn{SI}\oarg{选项}\marg{数字}\oarg{前缀}\marg{单位}
+%  \tn{SIrange}\oarg{选项}\marg{数字1}\marg{数字2}\marg{单位}
+%\end{syntax}
+%\pkg{siunitx} 宏包的 \tn{num} 命令可以输出科学计数法,\tn{si} 命令支持数学模式,可以代替数学行内公式输入,而 \tn{SI} 命令可用来输出带有单位的量,\tn{SIrange} 可以输出带有范围和单位的量。
+%\begin{ctexexam}
+%    \num{-21x.3e5}
+%    \si{mL.min^{-1}}
+%    \SI{5}{\mole}
+%    \SIrange[unit-color = green]{1.5}{4}{kg}
+%\end{ctexexam}
+%\end{function}
+%
+%\subsection{化学式}
+%\begin{function}[added = 2021-01-05]{\ch,\chemfig}
+%\begin{syntax}
+%  \tn{ch}\oarg{选项}\marg{输入}
+%  \tn{chemfig}\oarg{键值列表}\marg{分子代码}
+%\end{syntax}
+%除了以普通公式的方式,化学式还可用 \pkg{chemformula} 实现,无机化学式使用 \tn{ch} 命令书写。有机化学式推荐使用 \pkg{chemfig}(并未载入)的 \tn{chemfig} 命令完成。
+%\end{function}
+%
+%\subsection{引用}
+%\begin{function}[added = 2021-01-05]{\cref}
+%  \begin{syntax}
+%  \tn{cref}\marg{标签}
+%  \end{syntax}
+%使用 \pkg{cleveref} 宏包的 \tn{cref} 命令进行引用,将会自动检测环境并添加相应的前缀。
+%\end{function}
+%
+%\subsubsection{索引}
+%\begin{function}[added = 2021-01-05]{\index,\printindex}
+%\begin{syntax}
+%  \tn{index}\marg{标签}
+%  \tn{printindex}\oarg{索引名}
+%\end{syntax}
+%使用 \pkg{imakeidx} 生成索引,\tn{printindex} 命令用于生成索引目录。仅做了简单的设置如将索引设为双栏并加入目录,其他选项可另外配置。
+%\end{function}
+%
+%\subsubsection{自定义脚注}
+%\begin{function}[added = 2021-01-05]{\Footnote,\Footnotetext,\Footnotemark}
+%\begin{syntax}
+%  \tn{Footnote}\marg{标记}\marg{插入文本}
+%  \tn{Footnotetext}\marg{标记}\marg{插入文本}
+%  \tn{Footnotemark}\marg{标记}
+%\end{syntax}
+%自定义标记且不影响正常编号的脚注命令。
+%\begin{ctexexam}
+%    \Footnote{*}{这是可以自定义标记的脚注。}
+%\end{ctexexam}
+%\end{function}
+%
+%\subsubsection{边注}
+%\begin{function}[added = 2021-01-05]{\marginnote}
+%\begin{syntax}
+%  \tn{marginnote}\oarg{左文本}\marg{右文本}\oarg{垂直偏移}
+%\end{syntax}
+%命令 \tn{marginnote} 可以生成简单的边注,如果只给定了 \meta{右文本},那么边注在奇偶数页文字相同。如果同时给定了 \meta{左文本},则偶数页使用 \meta{左文本} 的文字。
+%\end{function}
+%
+%\subsection{插入文档}
+%\begin{function}[added = 2021-03-14]{\includepdf}
+%\begin{syntax}
+%  \tn{includepdf}\oarg{键值列表}\marg{文档名}
+%\end{syntax}
+%该命令由 \pkg{pdfpages} 提供,将其他 pdf 文档插入当前文档,比如插入封面,可以指定插入页数、逻辑页和横向等,详情查看宏包文档。
+%\end{function}
+%
+%\subsection{横向页面}
+%\begin{function}[added = 2021-03-14]{sidewaysfigure,sidewaystable}
+%\begin{syntax}
+%  \tn{begin}\marg{环境名}\oarg{位置}
+%  <插入图片或表格>
+%  \tn{end}\marg{环境名}
+%\end{syntax}
+%该环境由 \pkg{rotfloat} 提供,用于横向插入宽大的图片或表格,用法与 \opt{figure} 和 \opt{table} 环境类似。
+%\end{function}
+%
+%\subsection{指定行距的段落}
+%\begin{function}[added = 2021-03-14]{spacing}
+%\begin{syntax}
+%  \tn{begin}\marg{spacing}\marg{浮点数}
+%  <段落内容>
+%  \tn{end}\marg{spacing}
+%\end{syntax}
+%该环境由 \pkg{setspace} 提供,可以指定环境内段落的行距,使用浮点数控制行距倍数。
+%\end{function}
+%\end{documentation}
+%
+%\StopEventually{}
+%<*class>
+\RequirePackage{l3keys2e}
+\ProvidesExplClass{easybook}{2021/03/17}{1.23t}{}
+
+\cs_generate_variant:Nn \keys_define:nn {nx}
+\cs_generate_variant:Nn \int_to_arabic:n {v}
+\cs_generate_variant:Nn \dim_add:Nn {NV}
+\cs_new_protected:Npn \__ctex_define:nn #1
+  {\keys_define:nn {ctex/#1}}
+\cs_new_protected:Npn \__put_ctexbook:n #1
+  {\PassOptionsToClass{#1}{ctexbook}}
+\cs_new_protected:Npn \__patch_cmd:Nnn #1#2#3
+  {\ctex_patch_cmd_once:NnnnTF #1{}{#2}{#3}{}{\ctex_patch_failure:N #1}}
+\cs_new_protected:Npn \__appto_cmd:Nn #1#2
+  {\ctex_appto_cmd:NnnTF #1{}{#2}{}{\ctex_patch_failure:N #1}}
+
+\bool_set_false:N \l__draft_bool
+\bool_set_false:N \l__newline_bool
+\bool_set_false:N \l__font_noto_bool
+\bool_set_true:N  \l__zhtitle_bool
+\bool_set_true:N  \l__lang_chinese_bool
+\bool_set_true:N  \l__page_twoside_bool
+\bool_set_true:N  \l__class_book_bool
+\clist_new:N      \g__options_clist
+
+\keys_define:nn {easybook}
+  {
+    draft         .code:n = {\bool_set_true:N  \l__draft_bool},
+    newline       .code:n = {\bool_set_true:N  \l__newline_bool},
+    entitle       .code:n = {\bool_set_false:N \l__zhtitle_bool},
+    english       .code:n = {\bool_set_false:N \l__lang_chinese_bool},
+    enstyle       .meta:n = {newline,entitle,english},
+
+    font          .choice:,
+    font          .value_required:n = true,
+    font/overleaf .code:n = {},
+    font/adobe    .code:n = {\__put_ctexbook:n {fontset = #1}},
+    font/founder  .code:n = {\__put_ctexbook:n {fontset = #1}},
+    font/mac      .code:n = {\__put_ctexbook:n {fontset = #1}},
+    font/windows  .code:n = {\__put_ctexbook:n {fontset = #1}},
+    font/linux    .code:n = {\__put_ctexbook:n {fontset = ubuntu}},
+    font/none     .code:n = {\__put_ctexbook:n {fontset = #1}},
+    font/noto     .code:n =
+      {
+        \bool_set_true:N \l__font_noto_bool
+        \__put_ctexbook:n {fontset = none}
+      },
+    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__page_twoside_bool
+        \__put_ctexbook:n {oneside}
+      },
+
+    class         .choice:,
+    class         .value_required:n = true,
+    class/book    .code:n = {},
+    class/article .code:n = {\bool_set_false:N \l__class_book_bool},
+    class         .initial:n = book,
+
+    unknown       .code:n =
+      {\clist_gput_right:No \g__options_clist{\CurrentOption}}
+  }
+
+\ProcessKeysOptions{easybook}
+
+\bool_if:NTF \l__lang_chinese_bool
+  {\__put_ctexbook:n {scheme = chinese}}
+  {\__put_ctexbook:n {scheme = plain}}
+
+\clist_map_inline:nn
+  {
+    {svgnames}{xcolor},
+    {hang,stable}{footmisc},
+    {normalem}{ulem},
+    {protrusion = false}{microtype},
+    {shortlabels,inline}{enumitem},
+    {most}{tcolorbox},
+    {xindy}{imakeidx},
+    {CJKmath = true}{xeCJK},
+    {no-math}{fontspec}
+  }{\PassOptionsToPackage#1}
+\__put_ctexbook:n {\g__options_clist}
+\LoadClass[UTF8]{ctexbook}
+
+\bool_new:N \l__multoc_bool
+\bool_new:N \l__chap_withpart_bool
+\bool_new:N \l__foot_perpart_bool
+\bool_new:N \l__foot_perpage_bool
+\bool_new:N \l__notomath_bool
+\bool_new:N \l__uppercase_bool
+\tl_new:N   \g__config_tl
+
+\ctex_define:n
+  {
+    style               .meta:nn = {ctex/style}{#1},
+    link                .meta:nn = {ctex/link}{#1},
+    spread              .meta:nn = {ctex/spread}{#1},
+    elsefont            .meta:nn = {ctex/elsefont}{#1},
+    bibset              .meta:nn = {ctex/bibset}{#1},
+    thmset              .meta:nn = {ctex/thmset}{#1},
+    geoset              .meta:nn = {ctex/geoset}{#1},
+    hdrset              .meta:nn = {ctex/hdrset}{#1},
+    tocset              .meta:nn = {ctex/tocset}{#1},
+    config              .tl_set:N = \g__config_tl,
+    lstlistlistingname  .tl_set:N = \lstlistlistingname,
+    lstlistingname      .tl_set:N = \lstlistingname
+  }
+\__ctex_define:nn {style}
+  {
+    multoc    .bool_set:N = \l__multoc_bool,
+    multoc    .default:n = true,
+    withpart  .bool_set:N = \l__chap_withpart_bool,
+    withpart  .default:n = true,
+    withpart  .initial:n = false,
+    perpart   .bool_set:N = \l__foot_perpart_bool,
+    perpart   .default:n = true,
+    perpart   .initial:n = false,
+    perpage   .bool_set:N = \l__foot_perpage_bool,
+    perpage   .default:n = true,
+    perpage   .initial:n = false,
+    notomath  .bool_set:N = \l__notomath_bool,
+    notomath  .default:n = true,
+    notomath  .initial:n = true,
+    rulewidth .dim_set:N = \l__rule_width_dim,
+    rulewidth .initial:n = 0.75pt,
+    uppercase .bool_set:N = \l__uppercase_bool,
+    uppercase .default:n = true,
+    uppercase .initial:n = true,
+    figure-sep    .tl_set:N = \l__figure_separator_tl,
+    table-sep     .tl_set:N = \l__table_separator_tl,
+    listing-sep   .tl_set:N = \l__lstlisting_separator_tl,
+    equation-sep  .tl_set:N = \l__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,
+    pdfpages,
+    footmisc,setspace,
+    amsmath,amsthm,thmtools,cases,
+    chemformula,siunitx,ulem,
+    geometry,marginnote,nccfoots,
+    rotfloat,graphicx,
+    fancyhdr,titletoc,
+    caption,bicaption,subcaption,
+    microtype,zhlipsum,pifont,
+    tabularx,multirow,makecell,booktabs,
+    paralist,tasks,enumitem,
+    tcolorbox,
+    imakeidx
+  }
+\RequirePackage[
+  lang = {chinese-utf8},
+  type = {CC},
+  modifier = {by},
+  version = {4.0}
+  ]{doclicense}
+\ctex_at_end_preamble:n
+  {
+    \bool_if:NT \l__notomath_bool
+      {
+        \RequirePackage[noto,upint]{newtxmath}
+        \RequirePackage{bm}
+      }
+    \tl_if_empty:NF \g__config_tl{\file_input:n {\g__config_tl}}
+  }
+
+\sys_if_engine_xetex:TF
+  {
+    \cs_new_eq:NN \__set_family:nnn  \xeCJK_set_family:nnn
+    \cs_new_eq:NN \__switch_family:n \xeCJK_switch_family:n
+  }{
+    \cs_new_eq:NN \__set_family:nnn  \ctex_ltj_set_family:nnn
+    \cs_new_eq:NN \__switch_family:n \ctex_ltj_switch_family:n
+  }
+
+\cs_new_protected:Npn \__setmainfont:nn #1#2
+  {\__fontspec_main_setmainfont:nn {#2}{#1}}
+\cs_new_protected:Npn \__setsansfont:nn #1#2
+  {\__fontspec_main_setsansfont:nn {#2}{#1}}
+\cs_new_protected:Npn \__setmonofont:nn #1#2
+  {\__fontspec_main_setmonofont:nn {#2}{#1}}
+\cs_new_protected:Npn \__setCJKmainfont:nn #1#2
+  {\__set_family:nnn {\CJKrmdefault}{#2}{#1}}
+\cs_new_protected:Npn \__setCJKsansfont:nn #1#2
+  {\__set_family:nnn {\CJKsfdefault}{#2}{#1}}
+\cs_new_protected:Npn \__setCJKmonofont:nn #1#2
+  {\__set_family:nnn {\CJKttdefault}{#2}{#1}}
+\cs_new_protected:Npn \__set_zhfont_songti:nn #1#2
+  {\__set_family:nnn {songti}{#2}{#1}}
+\cs_new_protected:Npn \__set_zhfont_heiti:nn #1#2
+  {\__set_family:nnn {heiti}{#2}{#1}}
+\cs_new_protected:Npn \__set_zhfont_kaishu:nn #1#2
+  {\__set_family:nnn {kaishu}{#2}{#1}}
+\cs_new_protected:Npn \__set_zhfont_fangsong:nn #1#2
+  {\__set_family:nnn {fangsong}{#2}{#1}}
+
+\tl_const:Nn \__option_zhfont_tl
+  {UprightFont = *,AutoFakeBold = 1.5,ItalicFont = *}
+\cs_new_protected:Npx \__setCJKmainfont:n #1
+  {\__setCJKmainfont:nn {#1}{\__option_zhfont_tl}}
+\cs_new_protected:Npx \__setCJKsansfont:n #1
+  {\__setCJKsansfont:nn {#1}{\__option_zhfont_tl}}
+\cs_new_protected:Npx \__setCJKmonofont:n #1
+  {\__setCJKmonofont:nn {#1}{\__option_zhfont_tl}}
+\cs_new_protected:Npx \__set_zhfont_songti:n #1
+  {\__set_zhfont_songti:nn {#1}{\__option_zhfont_tl}}
+\cs_new_protected:Npx \__set_zhfont_heiti:n #1
+  {\__set_zhfont_heiti:nn {#1}{\__option_zhfont_tl}}
+\cs_new_protected:Npx \__set_zhfont_kaishu:n #1
+  {\__set_zhfont_kaishu:nn {#1}{\__option_zhfont_tl}}
+\cs_new_protected:Npx \__set_zhfont_fangsong:n #1
+  {\__set_zhfont_fangsong:nn {#1}{\__option_zhfont_tl}}
+
+\bool_if:NT \l__font_noto_bool
+  {
+    \__setmainfont:nn {NotoSerif}
+      {
+        Extension = .ttf,
+        UprightFont = *-Regular,
+        BoldFont = *-Bold,
+        ItalicFont = *-Italic
+      }
+    \__setsansfont:nn {NotoSans}
+      {
+        Extension = .ttf,
+        UprightFont = *-Regular,
+        BoldFont = *-Bold,
+        ItalicFont = *-Italic
+      }
+    \__setmonofont:nn {NotoSansMono}
+      {
+        Extension = .ttf,
+        UprightFont = *-Regular,
+        BoldFont = *-Bold
+      }
+    \__setCJKmainfont:nn {FZShuSong-Z01S}
+      {
+        UprightFont = *,
+        BoldFont = FZHei-B01S,
+        ItalicFont = FZKai-Z03S
+      }
+    \__setCJKsansfont:n {FZHei-B01S}
+    \__setCJKmonofont:n {FZFangSong-Z02S}
+    \__set_zhfont_songti:n {FZShuSong-Z01S}
+    \__set_zhfont_heiti:n {FZHei-B01S}
+    \__set_zhfont_kaishu:n {FZKai-Z03S}
+    \__set_zhfont_fangsong:n {FZFangSong-Z02S}
+    \cs_new_protected:Npn \songti{\__switch_family:n {songti}}
+    \cs_new_protected:Npn \heiti{\__switch_family:n {heiti}}
+    \cs_new_protected:Npn \kaishu{\__switch_family:n {kaishu}}
+    \cs_new_protected:Npn \fangsong{\__switch_family:n {fangsong}}
+  }
+\cs_if_exist:NF \kaishu{\cs_gset_eq:NN \kaishu\normalfont}
+
+\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__geometry_clist
+\__ctex_define:nn {geoset}
+  {
+    unknown .code:n =
+      {
+        \clist_gput_right:Nx \g__geometry_clist
+          {
+            \l_keys_key_str
+            \tl_if_empty:NF \l_keys_value_tl{ = {#1}}
+          }
+      }
+  }
+
+\cs_gset:Npn \cleardoublepage
+  {
+    \clearpage
+    \bool_if:NT \l__page_twoside_bool
+      {
+        \int_if_odd:nF \c at page
+          {\hbox:n {}\thispagestyle{empty}\clearpage}
+      }
+  }
+\RenewDocumentCommand{\frontmatter}{sO{Roman}}
+  {
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmatterfalse
+    \pagenumbering{#2}
+  }
+\RenewDocumentCommand{\mainmatter}{s}
+  {
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmattertrue
+    \pagenumbering{arabic}
+  }
+\cs_gset_eq:NN \easyhead\fancyhead
+\cs_gset_eq:NN \easyfoot\fancyfoot
+\cs_gset_eq:NN \easypagestyle\fancypagestyle
+\__ctex_define:nn {hdrset}
+  {
+    head-foot .tl_set:N = \l__fancyhf_content_tl,
+    head-foot .initial:n =
+      {
+        \easyhead[EC]{\color{ctex at frame}\kaishu\leftmark}
+        \easyhead[OC]{\color{ctex at frame}\kaishu\rightmark}
+        \easyhead[EL,OR]{\color{ctex at frame}\thepage}
+      },
+    chap-mark .tl_set:N = \l__fancyhf_chap_mark_tl,
+    chap-mark .initial:n =
+      {
+        \int_compare:nT {\c at secnumdepth > -1}
+          {
+            \if at mainmatter
+              \ifodd\CTEX at chapter@numbering
+                \CTEXthechapter\hspace{\ccwd}
+              \fi
+            \fi
+          }
+      },
+    sec-mark  .tl_set:N = \l__fancyhf_sec_mark_tl,
+    sec-mark  .initial:n =
+      {
+        \int_compare:nT {\c at secnumdepth > 0}
+          {
+            \ifodd\CTEX at section@numbering
+              \CTEXthesection\hspace{0.5\ccwd}
+            \fi
+          }
+      },
+    headrule      .tl_gset:N = \headrule,
+    headrule      .initial:n =
+      {
+        \color{ctex at frame}\vspace{1.5pt}
+        \hrule width \textwidth height \l__rule_width_dim
+      },
+    footrule      .tl_gset:N = \footrule,
+    footrule      .initial:n = {},
+    footnoterule  .tl_gset:N = \footnoterule,
+    footnoterule  .initial:n =
+      {
+        \color{ctex at frame}
+        \hrule width 0.35\columnwidth height \l__rule_width_dim
+        \vspace*{2.6pt}\color{black}
+      }
+  }
+\ctex_at_end_preamble:n
+  {
+    \exp_args:NV \geometry\g__geometry_clist
+    \pagestyle{fancy}
+    \fancyhf{}
+    \bool_if:NTF \l__page_twoside_bool
+      {
+        \cs_gset:Npn \chaptermark#1
+          {
+            \markboth
+              {
+                \bool_if:NTF \l__uppercase_bool
+                  {\text_uppercase:n {\l__fancyhf_chap_mark_tl#1}}
+                  {\text_titlecase_first:n {\l__fancyhf_chap_mark_tl#1}}
+              }{
+                \bool_if:NTF \l__uppercase_bool
+                  {\text_uppercase:n {\l__fancyhf_chap_mark_tl#1}}
+                  {\text_titlecase_first:n {\l__fancyhf_chap_mark_tl#1}}
+              }
+          }
+        \l__fancyhf_content_tl
+        \cs_gset_eq:NN \ps at plain\ps at empty
+      }{
+        \cs_gset:Npn \chaptermark#1
+          {
+            \markboth
+              {
+                \bool_if:NTF \l__uppercase_bool
+                  {\text_uppercase:n {\l__fancyhf_chap_mark_tl#1}}
+                  {\text_titlecase_first:n {\l__fancyhf_chap_mark_tl#1}}
+              }{}
+          }
+        \l__fancyhf_content_tl
+        \cs_gset_eq:NN \ps at plain\ps at empty
+      }
+    \cs_gset:Npn \sectionmark#1
+      {
+        \markright
+          {
+            \bool_if:NTF \l__uppercase_bool
+              {\text_uppercase:n {\l__fancyhf_sec_mark_tl#1}}
+              {\text_titlecase_first:n {\l__fancyhf_sec_mark_tl#1}}
+          }
+      }
+    \bool_if:NT \l__draft_bool
+      {
+        \bool_if:NTF \l__page_twoside_bool
+          {\easyfoot[C]{\color{gray!60}\sffamily\today}}
+          {\easyhead[L]{\color{gray!60}\sffamily\today}}
+        \geometry{showframe}
+      }
+  }
+
+\ctex_define:n
+  {
+    tocset/part       .meta:nn = {ctex/tocset/part}{#1},
+    tocset/chapter    .meta:nn = {ctex/tocset/chapter}{#1},
+    tocset/section    .meta:nn = {ctex/tocset/section}{#1},
+    tocset/subsection .meta:nn = {ctex/tocset/subsection}{#1},
+    tocset/list       .meta:nn = {ctex/tocset/list}{#1},
+  }
+\__ctex_define:nn {tocset}
+  {
+    part/format       .tl_set:N = \l__toc_part_format_tl,
+    part/format       .initial:n = \addvspace{1pc}\sffamily\large,
+    part/indent       .tl_set:N = \l__toc_part_indent_tl,
+    part/indent       .initial:n = 0\ccwd,
+    part/rule         .tl_set:N = \l__toc_part_rule_tl,
+    part/rule         .initial:n = \tocrule{}[\bfseries],
+
+    chapter/format    .tl_set:N = \l__toc_chapter_format_tl,
+    chapter/format    .initial:n = \addvspace{1pc}\sffamily\large,
+    chapter/indent    .tl_set:N = \l__toc_chapter_indent_tl,
+    chapter/indent    .initial:n = 0\ccwd,
+    chapter/rule      .tl_set:N = \l__toc_chapter_rule_tl,
+    chapter/rule      .initial:n = \tocrule{$\cdot$}[\bfseries],
+
+    section/format    .tl_set:N = \l__toc_section_format_tl,
+    section/format    .initial:n = \addvspace{0.35pc},
+    section/indent    .tl_set:N = \l__toc_section_indent_tl,
+    section/indent    .initial:n = 1.5\ccwd,
+    section/rule      .tl_set:N = \l__toc_section_rule_tl,
+    section/rule      .initial:n = \tocrule{$\cdot$},
+
+    subsection/format .tl_set:N = \l__toc_subsection_format_tl,
+    subsection/format .initial:n = \addvspace{0.35pc},
+    subsection/indent .tl_set:N = \l__toc_subsection_indent_tl,
+    subsection/indent .initial:n = 3.8\ccwd,
+    subsection/rule   .tl_set:N = \l__toc_subsection_rule_tl,
+    subsection/rule   .initial:n = \tocrule{$\cdot$},
+
+    lists/format      .tl_set:N = \l__toc_lists_format_tl,
+    lists/format      .initial:n = \addvspace{0.2pc},
+    lists/indent      .tl_set:N = \l__toc_lists_indent_tl,
+    lists/indent      .initial:n = 0\ccwd,
+    lists/rule        .tl_set:N = \l__toc_lists_rule_tl,
+    lists/rule        .initial:n = \tocrule{$\cdot$},
+    lists/lolskip     .dim_set:N = \l__toc_lolskip_dim,
+    lists/lolskip     .initial:n = 0.8pc,
+    lists/belowoffset .dim_set:N = \l__toc_listsoffset_dim,
+    lists/belowoffset .initial:n = 0pc,
+
+    belowoffset       .dim_set:N = \l__toc_offset_dim,
+    belowoffset       .initial:n = -1pc
+  }
+
+\NewDocumentCommand{\tocrule}{O{0.7pc}O{1.2}mO{}}
+  {
+    \normalsize\normalfont
+    \titlerule*[#1]{\scalebox{#2}{#3}}#4\contentspage
+  }
+\cs_new_protected:Npn \__titlecontents_set:nn #1#2
+  {
+    \titlecontents{#1}
+      [\use:c {l__toc_#2_indent_tl}]
+      {\use:c {l__toc_#2_format_tl}}{}{}
+      {\use:c {l__toc_#2_rule_tl}}
+  }
+\contentsuse{lstlisting}{lol}
+\clist_map_inline:nn
+  {
+    {part}{part},
+    {chapter}{chapter},
+    {section}{section},
+    {subsection}{subsection},
+    {figure}{lists},
+    {table}{lists},
+    {lstlisting}{lists}
+  }{\__titlecontents_set:nn #1}
+\ctex_patch_cmd:Nnn \caption@@@addcontentsline
+  {\addcontentsline{#1}{#2}{\protect\numberline{#3}{#4}}}
+  {\addcontentsline{#1}{#2}{#3\hspace{\ccwd}#4}}
+\ctex_patch_cmd:Nnn \lst at MakeCaption
+  {
+    \addcontentsline{lol}{lstlisting}
+      {\protect\numberline{\thelstlisting}\lst@@caption}
+  }{
+    \addcontentsline{lol}{lstlisting}
+      {\thelstlisting\hspace{\ccwd}\lst@@caption}
+  }
+\__appto_cmd:Nn \@chapter
+  {
+    \addtocontents{lol}
+      {\protect\addvspace{\dim_use:N \l__toc_lolskip_dim}}
+  }
+
+\cs_new_protected:Npn \__markboth:n #1
+  {
+    \bool_if:NTF \l__page_twoside_bool
+      {
+        \markboth
+          {
+            \bool_if:NTF \l__uppercase_bool
+              {\text_uppercase:n {#1}}
+              {\text_titlecase_first:n {#1}}
+          }{
+            \bool_if:NTF \l__uppercase_bool
+              {\text_uppercase:n {#1}}
+              {\text_titlecase_first:n {#1}}
+          }
+      }{
+        \markboth
+          {
+            \bool_if:NTF \l__uppercase_bool
+              {\text_uppercase:n {#1}}
+              {\text_titlecase_first:n {#1}}
+          }{}
+      }
+  }
+
+\tl_set:Nn \l__toc_type_tl{book}
+\keys_define:nn {listoc}
+  {
+    article .code:n = \tl_set:Nn \l__toc_type_tl{article},
+    book    .code:n = {},
+    multoc  .bool_set:N = \l__multoc_bool,
+    multoc  .default:n = true,
+    multoc  .initial:n = false
+  }
+
+\cs_new_protected:Npn \__title_mark_intoc:n #1
+  {
+    \tl_if_eq:NnTF \l__toc_type_tl{book}
+      {
+        \chapter*{\phantomsection#1}
+        \CTEX at addtocline{chapter}{#1}
+      }{
+        \section*{\phantomsection#1}
+        \CTEX at addtocline{section}{#1}
+      }
+    \__markboth:n {#1}
+  }
+\cs_new_protected:Npn \__title_mark:n #1
+  {
+    \tl_if_eq:NnTF \l__toc_type_tl{book}
+      {\chapter*{\phantomsection#1}}
+      {\section*{\phantomsection#1}}
+    \__markboth:n {#1}
+  }
+\cs_new_protected:Npn \__ifmultoc_pre_set:
+  {
+    \bool_if:NTF \l__class_book_bool
+      {
+        \if at twocolumn
+          \@restonecoltrue
+          \onecolumn
+          \bool_if:NT \l__multoc_bool{\twocolumn}
+        \else
+          \@restonecolfalse
+          \bool_if:NT \l__multoc_bool{\twocolumn}
+        \fi
+      }{\tl_set:Nn \l__toc_type_tl{article}}
+  }
+\cs_new_protected:Npn \__ifmultoc_after_set:
+  {
+    \bool_if:NTF \l__class_book_bool
+      {
+        \if at restonecol
+          \twocolumn
+        \else
+          \onecolumn
+        \fi
+      }{\tl_set:Nn \l__toc_type_tl{article}}
+  }
+\RenewDocumentCommand{\tableofcontents}{o}
+  {
+    \group_begin:
+    \IfValueT {#1}{\keys_set:nn {listoc}{#1}}
+    \__ifmultoc_pre_set:
+    \__title_mark:n {\contentsname}
+    \vspace*{\dim_use:N \l__toc_offset_dim}
+    \@starttoc{toc}
+    \__ifmultoc_after_set:
+    \group_end:
+  }
+\RenewDocumentCommand{\listoffigures}{so}
+  {
+    \group_begin:
+    \IfValueT {#2}{\keys_set:nn {listoc}{#2}}
+    \__ifmultoc_pre_set:
+    \IfBooleanTF {#1}
+      {\__title_mark:n {\listfigurename}}
+      {\__title_mark_intoc:n {\listfigurename}}
+    \dim_add:NV \l__toc_offset_dim\l__toc_listsoffset_dim
+    \vspace*{\dim_use:N \l__toc_offset_dim}
+    \@starttoc{lof}
+    \__ifmultoc_after_set:
+    \group_end:
+  }
+\RenewDocumentCommand{\listoftables}{so}
+  {
+    \group_begin:
+    \IfValueT {#2}{\keys_set:nn {listoc}{#2}}
+    \__ifmultoc_pre_set:
+    \IfBooleanTF {#1}
+      {\__title_mark:n {\listtablename}}
+      {\__title_mark_intoc:n {\listtablename}}
+    \dim_add:NV \l__toc_offset_dim\l__toc_listsoffset_dim
+    \vspace*{\dim_use:N \l__toc_offset_dim}
+    \@starttoc{lot}
+    \__ifmultoc_after_set:
+    \group_end:
+  }
+\NewDocumentCommand{\listoflistings}{so}
+  {
+    \group_begin:
+    \IfValueT {#2}{\keys_set:nn {listoc}{#2}}
+    \__ifmultoc_pre_set:
+    \IfBooleanTF {#1}
+      {\__title_mark:n {\lstlistlistingname}}
+      {\__title_mark_intoc:n {\lstlistlistingname}}
+    \dim_add:NV \l__toc_offset_dim\l__toc_listsoffset_dim
+    \vspace*{\dim_use:N \l__toc_offset_dim}
+    \@starttoc{lol}
+    \__ifmultoc_after_set:
+    \group_end:
+  }
+
+\makeindex[
+  intoc,
+  options = -M~texindy~-C~utf8,
+  program = truexindy,
+  columns = 2,
+  columnsep = 2\ccwd
+  ]
+\indexsetup
+  {
+    level = \bool_if:NTF \l__class_book_bool{\chapter*}{\section*},
+    toclevel = \bool_if:NTF \l__class_book_bool{chapter}{section},
+    firstpagestyle = \bool_if:NTF \l__class_book_bool{plain}{fancy}
+  }
+\__patch_cmd:Nnn \imki at indexheaders
+  {\@mkboth{\MakeUppercase\indexname}{\MakeUppercase\indexname}}
+  {\__markboth:n {\indexname}}
+
+\tl_new:N \l__font_table_tl
+\tl_new:N \l__font_figure_tl
+\tl_new:N \l__font_listing_tl
+\tl_new:N \l__font_footnote_tl
+
+\__ctex_define:nn {elsefont}
+  {
+    table-cap   .tl_set:N = \l__font_table_tl,
+    table-cap   .initial:n = \sffamily\small,
+    figure-cap  .tl_set:N = \l__font_figure_tl,
+    figure-cap  .initial:n = \sffamily\small,
+    listing-cap .tl_set:N = \l__font_listing_tl,
+    listing-cap .initial:n = \sffamily\small,
+    footnote    .tl_set:N = \l__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{table at font}{\l__font_table_tl}
+\DeclareCaptionFont{figure at font}{\l__font_figure_tl}
+\DeclareCaptionFont{listing at font}{\l__font_listing_tl}
+\captionsetup
+  {
+    format = hang,
+    % figurewithin = section,
+    % tablewithin = section,
+    font = {stretch = {\fp_use:N \l__spread_caption_fp}},
+    labelfont = {color = ctex at frame},
+    labelsep = ccwd,
+    singlelinecheck = true,
+    belowskip = 0pt,aboveskip = 10pt
+  }
+\captionsetup[table]{font += table at font}
+\captionsetup[figure]{font += figure at font}
+\captionsetup[lstlisting]{font += listing at font}
+\captionsetup[subfigure]
+  {
+    labelformat = parens,
+    font += figure at font,
+    belowskip = 2pt,aboveskip = 6pt
+  }
+\captionsetup[figure][bi-second]{name = Figure}
+\captionsetup[table][bi-second]{name = Table}
+\cs_new:Npn \__arabic:n #1{\int_to_arabic:v {c@#1}}
+\cs_new_protected:Npn \__separator_set:n #1
+  {
+    \cs_set:cpn {the#1}
+      {
+        \int_compare:nT {\c at chapter > 0}
+          {
+            \thechapter
+            \use:c {l__#1_separator_tl}
+          }
+        \__arabic:n {#1}
+      }
+  }
+\cs_gset:cpn {thesection}
+  {
+    \int_compare:nT {\c at chapter > 0}{\thechapter.}
+    \__arabic:n {section}
+  }
+\clist_map_inline:nn
+  {{figure},{table},{lstlisting},{equation}}
+  {\__separator_set:n {#1}}
+\cs_gset_protected:Npn \appendix
+  {
+    \int_compare:nNnTF {\c at chapter} > {0}
+      {
+        \setcounter{chapter}{0}
+        \setcounter{section}{0}
+        \gdef\thechapter{\@Alph\c at chapter}
+        \gdef\CTEX at prechapter{\CTEX at preappendix}
+        \gdef\CTEX at thechapter{\CTEX at appendix@number}
+        \gdef\CTEX at postchapter{\CTEX at postappendix}
+        \gdef\CTEX at chapter@numbering{\CTEX at appendix@numbering}
+      }{
+        \setcounter{section}{0}
+        \setcounter{subsection}{0}
+        \gdef\thesection{\@Alph\c at section}
+        \gdef\CTEX at presection{\CTEX at preappendix}
+        \gdef\CTEX at thesection{\CTEX at appendix@number}
+        \gdef\CTEX at postsection{\CTEX at postappendix}
+        \gdef\CTEX at section@numbering{\CTEX at appendix@numbering}
+        \ctex_set:nn {appendix}{number = {\@Alph\c at section},name = {}}
+      }
+  }
+\AtBeginEnvironment{tabularx}
+  {\exp_args:Nx \linespread{\fp_use:N \l__spread_table_fp}\selectfont\ignorespaces}
+\AtBeginEnvironment{tabular}
+  {\exp_args:Nx \linespread{\fp_use:N \l__spread_table_fp}\selectfont\ignorespaces}
+
+\fp_new:N \l__spread_line_fp
+\fp_new:N \l__spread_table_fp
+\fp_new:N \l__spread_math_fp
+\fp_new:N \l__spread_caption_fp
+\fp_new:N \l__spread_footnote_fp
+
+\__ctex_define:nn {spread}
+  {
+    line      .fp_set:N = \l__spread_line_fp,
+    line      .initial:n = 1.3,
+    table     .fp_set:N = \l__spread_table_fp,
+    table     .initial:n = 1.05,
+    math      .fp_set:N = \l__spread_math_fp,
+    math      .initial:n = 1.05,
+    caption   .fp_set:N = \l__spread_caption_fp,
+    caption   .initial:n = 1,
+    footnote  .fp_set:N = \l__spread_footnote_fp,
+    footnote  .initial:n = 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}
+\cs_gset:Npn \textfraction{0.18}
+\cs_gset:Npn \topfraction{0.85}
+\cs_gset:Npn \bottomfraction{0.65}
+\cs_gset:Npn \floatpagefraction{0.60}
+\ctex_after_end_preamble:n
+  {\exp_args:Nx \linespread{\fp_use:N \l__spread_line_fp}\selectfont}
+
+\newcolumntype{L}{X}
+\newcolumntype{C}{>{\centering\arraybackslash}X}
+\newcolumntype{R}{>{\raggedleft\arraybackslash}X}
+\graphicspath{{figures/}}
+\DeclareGraphicsExtensions{.pdf,.png,.jpg,.eps,.tif}
+
+\setlist
+  {
+    labelsep = .75\ccwd,listparindent = 2\ccwd,
+    itemsep = .75ex plus .1ex,parsep = 0ex,topsep = .75ex plus .1ex,partopsep = 0ex
+  }
+\setlist[itemize,1]
+  {label = \color{ctex at emph}\ensuremath{\bullet},leftmargin = *}
+\setlist[itemize,2]
+  {label = \color{ctex at emph}\ensuremath{\circ},leftmargin = *}
+\setlist[enumerate,1]
+  {label = \color{ctex at emph}\arabic*.,ref = \arabic*,leftmargin = *}
+\setlist[enumerate,2]
+  {label = \color{ctex at emph}(\alph*),ref = \theenumi(\alph*),leftmargin = *}
+\setlist[description]
+  {font = \color{ctex at emph}\sf,labelwidth = *,leftmargin = 2\ccwd}
+\newlist{outlinelist}{itemize}{1}
+\setlist[outlinelist]
+  {label = \color{ctex at emph}\upshape\ding{111},itemsep = .5ex plus .1ex,leftmargin = *}
+\skip_set:Nn \pltopsep{.75ex plus .1ex}
+\skip_set:Nn \plpartopsep{0ex}
+\skip_set:Nn \plitemsep{.75ex plus .1ex}
+\skip_set:Nn \plparsep{0ex}
+
+\cs_new_protected:Npn \__thmname_set:nn #1#2
+  {\tl_const:cn {c__name_#1_tl}{#2}}
+\bool_if:NTF \l__lang_chinese_bool
+  {
+    \clist_map_inline:nn
+      {
+        {theorem}{定理},
+        {definition}{定义},
+        {lemma}{引理},
+        {corollary}{推论},
+        {proposition}{性质},
+        {example}{例},
+        {remark}{注},
+        {exercise}{练习}
+      }{\__thmname_set:nn #1}
+  }{
+    \clist_map_inline:nn
+      {
+        {theorem}{Theorem},
+        {definition}{Definition},
+        {lemma}{Lemma},
+        {corollary}{Corollary},
+        {proposition}{Proposition},
+        {example}{Example},
+        {remark}{Remark},
+        {exercise}{Exercise}
+      }{\__thmname_set:nn #1}
+  }
+
+\bool_new:N \l__thmbox_bool
+\tl_new:N \l__thm_numberwith_tl
+\tl_new:N \l__thm_headpunct_tl
+\tl_new:N \l__thm_bodyfont_tl
+\tl_new:N \l__thm_notefont_tl
+\tl_new:N \l__thm_headindent_tl
+\tl_new:N \l__thm_spaceabove_tl
+\tl_new:N \l__thm_spacebelow_tl
+
+\RenewDocumentCommand{\newtheorem}{O{}m}
+  {\AfterPreamble{\declaretheorem[#1]{#2}}}
+\__ctex_define:nn {thmset}
+  {
+    thmbox      .bool_set:N = \l__thmbox_bool,
+    thmbox      .default:n = true,
+    thmbox      .initial:n = false,
+    numberwith  .tl_set:N = \l__thm_numberwith_tl,
+    numberwith  .initial:n = {chapter},
+    headpunct   .tl_set:N = \l__thm_headpunct_tl,
+    headpunct   .initial:n = {},
+    bodyfont    .tl_set:N = \l__thm_bodyfont_tl,
+    bodyfont    .initial:n = {},
+    notefont    .tl_set:N = \l__thm_notefont_tl,
+    notefont    .initial:n = {},
+    headfont    .tl_set:N = \l__thm_headfont_tl,
+    headfont    .initial:n = {\color{ctex at emph}\sffamily},
+    headindent  .tl_set:N = \l__thm_headindent_tl,
+    headindent  .initial:n = {0\ccwd},
+    spaceabove  .tl_set:N = \l__thm_spaceabove_tl,
+    spaceabove  .initial:n = {.75ex plus .1ex},
+    spacebelow  .tl_set:N = \l__thm_spacebelow_tl,
+    spacebelow  .initial:n = {.75ex plus .1ex},
+    spacepost   .tl_set:N = \l__thm_spacepost_tl,
+    spacepost   .initial:n = {\ccwd}
+  }
+\ctex_at_end_preamble:n
+  {
+    \declaretheoremstyle[
+      spaceabove = \l__thm_spaceabove_tl,
+      spacebelow = \l__thm_spacebelow_tl,
+      headindent = \l__thm_headindent_tl,
+      headfont = \l__thm_headfont_tl,
+      notefont = \l__thm_notefont_tl,
+      notebraces = {}{},
+      bodyfont = \l__thm_bodyfont_tl,
+      headpunct = \l__thm_headpunct_tl,
+      postheadspace = \l__thm_spacepost_tl,
+      numberwithin = \l__thm_numberwith_tl,
+      headformat = \NAME\space\NUMBER\NOTE
+      ]{mythm}
+    \declaretheorem[style = mythm,name = \c__name_theorem_tl]{theorem}
+    \declaretheorem[style = mythm,name = \c__name_definition_tl]{definition}
+    \declaretheorem[style = mythm,name = \c__name_lemma_tl]{lemma}
+    \declaretheorem[style = mythm,name = \c__name_corollary_tl]{corollary}
+    \declaretheorem[style = mythm,name = \c__name_proposition_tl]{proposition}
+    \declaretheorem[style = mythm,name = \c__name_example_tl]{example}
+    \cs_gset_eq:NN \proof\relax
+    \declaretheorem{remark}[
+      style = mythm,
+      name = \c__name_remark_tl,
+      numbered = no
+      ]
+    \declaretheorem{proof}[
+      style = mythm,
+      name = \proofname,
+      numbered = no,
+      qed = \qedsymbol
+      ]
+  }
+
+\settasks
+  {
+    label = (\Alph*),
+    after-item-skip = 0ex plus .1ex,
+    column-sep = .5\ccwd,
+    item-indent = 2\ccwd,
+    label-width = 1.5\ccwd
+  }
+\setchemformula
+  {
+    math-scripts = false,
+    charge-hshift = 0.25\ccwd,
+    subscript-vshift = -0.2ex
+  }
+\sisetup
+  {
+    detect-family,
+    detect-weight,
+    detect-shape,
+    detect-inline-family = math,
+    detect-inline-weight = math,
+    detect-display-math,
+    range-phrase = \ensuremath{\sim},
+    range-units = single,
+    table-parse-only,
+    group-digits = false
+  }
+\allowdisplaybreaks[4]
+\cs_gset:Npn \ULthickness{.75pt}
+\skip_set:Nn \jot{4pt plus 1pt minus 1pt}
+\cs_new_protected:Npn \l__math_restore:n #1
+  {
+    \AtBeginEnvironment{#1}
+      {\linespread{\fp_use:N \l__spread_math_fp}\selectfont\ignorespaces}
+  }
+\clist_map_inline:nn
+  {
+    {array},{matrix},{pmatrix},{bmatrix},{Bmatrix},{vmatrix},{Vmatrix},
+    {matrix*},{pmatrix*},{bmatrix*},{Bmatrix*},{vmatrix*},{Vmatrix*},
+    {cases},{cases*},{dcases},{dcases*},{rcases},{rcases*},{drcases},{drcases*},
+    {aligned},{alignedat},{gathered},{multlined},{lgathered},{rgathered}
+  }{\l__math_restore:n {#1}}
+\__patch_cmd:Nnn \start at gather
+  {\collect at body}
+  {\linespread{\fp_use:N \l__spread_math_fp}\selectfont\collect at body}
+\__patch_cmd:Nnn \start at align
+  {\collect at body}
+  {\linespread{\fp_use:N \l__spread_math_fp}\selectfont\collect at body}
+\__patch_cmd:Nnn \start at multline
+  {\collect at body}
+  {\linespread{\fp_use:N \l__spread_math_fp}\selectfont\collect at body}
+\__patch_cmd:Nnn \gather at split
+  {\spread at equation}
+  {\linespread{\fp_use:N \l__spread_math_fp}\selectfont\spread at 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 at emph}(\ignorespaces#1\unskip\@@italiccorr)}}
+
+\tcbset
+  {
+    thmsty/.style =
+      {
+        enhanced~jigsaw,pad~at~break* = 3pt,
+        opacityback = 0,
+        colframe = ctex at emph,
+        left = .2pc,right = .2pc,top = .5pc,bottom = .5pc,middle= .5pc,
+        arc = 0pt
+      },
+    outlinesty/.style =
+      {
+        enhanced,nofloat,
+        tikznode~boxed~title,
+        interior~style = white,colframe = ctex at emph,
+        colbacktitle = white,coltitle = ctex at 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,
+        after~skip = 3ex,
+        left = 1.5pc,right = 1.5pc,top = 1pc,bottom = 0.5pc,
+        boxsep = 5pt
+      },
+    exersty/.style =
+      {
+        enhanced,on~line,
+        arc = 5pt,
+        fontupper = \sffamily\Large,
+        boxrule = 1pt,boxsep = 0pt,
+        left = 6pt,right = 6pt,top = 3.5pt,bottom = 3.5pt,
+        before~skip = 4ex,after~skip = 2.25ex
+      },
+    breakable,
+    boxrule = \l__rule_width_dim
+  }
+\ctex_at_end_preamble:n
+  {
+    \bool_if:NT \l__thmbox_bool
+      {
+        \tcolorboxenvironment{theorem}{thmsty}
+        \tcolorboxenvironment{definition}{thmsty}
+        \tcolorboxenvironment{lemma}{thmsty}
+        \tcolorboxenvironment{corollary}{thmsty}
+        \tcolorboxenvironment{proposition}{thmsty}
+        \tcolorboxenvironment{example}{thmsty}
+      }
+  }
+\NewDocumentEnvironment{outline}{O{\abstractname}o}
+  {
+    \begin{tcolorbox}[outlinesty,title = #1,IfValueT = {#2}{#2}]
+      \begin{outlinelist}
+  }{
+      \end{outlinelist}
+    \end{tcolorbox}
+  }
+\NewDocumentEnvironment{exercise}{sO{LightYellow}O{1.}O{\c__name_exercise_tl}o}
+  {
+    \begin{center}
+      \bool_if:NTF \l__thmbox_bool
+        {
+          \tcbox[
+            exersty,
+            colback = #2,colframe = black,
+            drop~fuzzy~shadow = #2,
+            IfValueT = {#5}{#5},
+            phantom =
+              \IfBooleanF{#1}
+                {
+                  \CTEX at ifnametrue
+                  \refstepcounter{section}
+                  \markright{\CTEXthesection\hspace{0.5\ccwd}#4}
+                  \CTEX at addtocline{section}{#4}
+                }
+            ]{\IfBooleanF{#1}{\CTEXthesection\hspace{0.5\ccwd}}#4}
+        }{
+          \sffamily\Large
+          \IfBooleanF{#1}
+            {
+              \CTEX at ifnametrue
+              \refstepcounter{section}
+              \markright{\CTEXthesection\hspace{0.5\ccwd}#4}
+              \CTEX at addtocline{section}{#4}
+              \CTEXthesection\hspace{0.5\ccwd}
+            }#4
+        }
+    \end{center}
+    \begin{compactenum}[#3]
+  }{
+    \end{compactenum}
+  }
+\DeclareTColorBox{mybox}{soO{MintCream}O{}}
+  {
+    enhanced~jigsaw,pad~at~break* = 3pt,
+    IfBooleanTF = {#1}{colback = #3}{opacityback = 0,colframe = ctex at emph},
+    IfValueT = {#2}{title = #2},
+    coltitle = black,colbacktitle = white,
+    fonttitle = \sffamily,
+    left = .2pc,right = .2pc,top = .5pc,bottom = .5pc,middle= .5pc,
+    arc = 0pt,
+    toptitle = 2pt,bottomtitle = 2pt,
+    beforeafter~skip=2ex,
+    halign~upper = left,halign~lower = left,
+    center~title,#4
+  }
+\DeclareTotalTCBox{\fuzzy}{O{DarkSeaGreen}vO{}}
+  {
+    nobeforeafter,tcbox~raise~base,
+    blank,fuzzy~halo = 2pt~with~#1,#3
+  }{#2}
+\DeclareTotalTCBox{\concise}{O{Aqua}vO{}}
+  {
+    nobeforeafter,tcbox~raise~base,
+    top = 2pt,bottom = 2.5pt,left = 2pt,right = 2pt,
+    boxsep = 0pt,boxrule = 0.75pt,arc = 1pt,
+    colback = #1!15!white,#3
+  }{#2}
+
+\bool_set_true:N \l__backend_bibtex_bool
+\tl_new:N \l__bib_style_tl
+\tl_new:N \l__bib_otherstyle_tl
+\tl_new:N \l__bib_citestyle_tl
+\tl_new:N \l__bib_file_tl
+
+\__ctex_define:nn {bibset}
+  {
+    backend           .choice:,
+    backend/bibtex    .code:n = {},
+    backend/biblatex  .code:n =
+      {\bool_set_false:N \l__backend_bibtex_bool},
+
+    bib-style             .choice:,
+    bib-style             .value_required:n = true,
+    bib-style/numerical   .code:n =
+      {
+        \tl_set:Nn  \l__bib_style_tl{#1}
+        \tl_clear:N \l__bib_otherstyle_tl
+      },
+    bib-style/authoryear  .code:n =
+      {
+        \tl_set:Nn  \l__bib_style_tl{#1}
+        \tl_clear:N \l__bib_otherstyle_tl
+      },
+    bib-style/unknown     .code:n =
+      {\tl_set_eq:NN \l__bib_otherstyle_tl\l_keys_value_tl},
+    bib-style             .initial:n = numerical,
+
+    cite-style  .code:n =
+      {\tl_set:Nn \l__bib_citestyle_tl{#1}},
+    bibfile     .tl_set:N = \l__bib_file_tl,
+    bibfile     .initial:n = refs.bib
+  }
+
+\cs_new_protected:Npn \__bibtex_set:
+  {
+    \tl_if_empty:NTF \l__bib_otherstyle_tl
+      {
+        \tl_if_eq:VnT \l__bib_style_tl{numerical}
+          {
+            \bibliographystyle{gbt7714-numerical}
+            \setcitestyle{comma,square,super}
+          }
+        \tl_if_eq:VnT \l__bib_style_tl{authoryear}
+          {\bibliographystyle{gbt7714-author-year}}
+        \cs_set_eq:NN \cite\citep
+      }{
+        \exp_args:NV \bibliographystyle\l__bib_otherstyle_tl
+      }
+    \tl_if_empty:NF \l__bib_citestyle_tl
+      {\exp_args:NV \setcitestyle\l__bib_citestyle_tl}
+    \skip_set:Nn \bibsep{0ex}
+    \NewDocumentCommand{\printbibliography}{so}
+      {
+        \group_begin:
+        \IfValueT {##2}{\keys_set:nn {listoc}{##2}}
+        \__ifmultoc_pre_set:
+        \cs_set:Npn \bibsection
+          {
+            \IfBooleanTF {##1}
+              {\__title_mark:n {\bibname}}
+              {\__title_mark_intoc:n {\bibname}}
+          }
+        \exp_args:NV \bibliography\l__bib_file_tl
+        \__ifmultoc_after_set:
+        \group_end:
+      }
+  }
+\cs_new_protected:Npn \__put_biblatex:n #1
+  {\PassOptionsToPackage{#1}{biblatex}}
+\cs_new_protected:Npn \__biblatex_pre_set:
+  {
+    \tl_if_empty:NTF \l__bib_otherstyle_tl
+      {
+        \tl_if_eq:VnT \l__bib_style_tl{numerical}
+          {\__put_biblatex:n {style = gb7714-2015}}
+        \tl_if_eq:VnT \l__bib_style_tl{authoryear}
+          {\__put_biblatex:n {style = gb7714-2015ay}}
+      }{
+        \__put_biblatex:n {style = \l__bib_otherstyle_tl}
+      }
+    \tl_if_empty:NF \l__bib_citestyle_tl
+      {\__put_biblatex:n {citestyle = \l__bib_citestyle_tl}}
+    \__put_biblatex:n {backend = biber}
+  }
+\cs_new_protected:Npn \__biblatex_after_set:
+  {
+    \exp_args:NV \addbibresource\l__bib_file_tl
+    \cs_gset:Npn \blx at default@theheading{bibintoc}
+    \defbibheading{bibintoc}[\bibname]{\__title_mark_intoc:n {##1}}
+    \skip_set:Nn \bibitemsep{0ex}
+  }
+\ctex_at_end_preamble:n
+  {
+    \bool_if:NTF \l__backend_bibtex_bool
+      {
+        \RequirePackage[sort&compress]{natbib}
+        \__bibtex_set:
+      }{
+        \__biblatex_pre_set:
+        \RequirePackage{biblatex}
+        \__biblatex_after_set:
+      }
+  }
+
+\ctex_at_end_preamble:n
+  {
+    \skip_set:Nn \footnotemargin{0.5\ccwd}
+    \group_begin:
+    \footnotesize
+    \exp_args:Nx \linespread{\fp_use:N \l__spread_footnote_fp}\selectfont
+    \skip_gset:Nn \footnotesep{\ht\strutbox}
+    \group_end:
+    \cs_gset:Npn \hangfootparskip{0ex}
+    \bool_if:NT \l__lang_chinese_bool
+      {\cs_gset:Npn \hangfootparindent{2\ccwd}}
+    \bool_if:NT \l__chap_withpart_bool
+      {\counterwithin*{chapter}{part}}
+    \bool_if:NT \l__foot_perpart_bool
+      {
+        \counterwithout*{footnote}{chapter}
+        \counterwithin*{footnote}{part}
+      }
+    \bool_if:NT \l__foot_perpage_bool
+      {
+        \counterwithout*{footnote}{chapter}
+        \counterwithin*{footnote}{page}
+      }
+  }
+\__patch_cmd:Nnn \@footnotetext
+  {\reset at font}
+  {\def\baselinestretch{\fp_use:N \l__spread_footnote_fp}\l__font_footnote_tl}
+\__patch_cmd:Nnn \@mpfootnotetext
+  {\reset at font}
+  {\def\baselinestretch{\fp_use:N \l__spread_footnote_fp}\l__font_footnote_tl}
+\__patch_cmd:Nnn \@makefnmark
+  {\normalfont}{\l__font_footnote_tl}
+
+\lstdefinestyle{mystyle}
+  {
+    language = [LaTeX]TeX,
+    texcsstyle =
+      *\lst at ifdisplaystyle\bfseries\color{ctex at verb}\else\color{ctex at verb}\fi,
+    basicstyle =
+      \ttfamily\lst at ifdisplaystyle\small\else\color{ctex at verb}\fi,
+    framexleftmargin = 0pt,
+    framexrightmargin = 0pt,
+    xleftmargin = 3pt,
+    xrightmargin = 3pt,
+    numbersep = 10pt,
+    framesep = 3pt,
+    frame = single,
+    rulecolor = \color{ctex at frame},
+    commentstyle = \color{gray},
+    emphstyle = \color{ctex at emph},
+    emph = {caption,makecell,subcaption,tabularx},
+    keywordstyle =
+      \lst at ifdisplaystyle\bfseries\color{ctex at verb}\else\color{ctex at verb}\fi,
+    morekeywords =
+      {
+        includegraphics,setmainfont,setsansfont,setmonofont,setCJKmainfont,setCJKsansfont,setCJKmonofont,setCJKfamilyfont,RequirePackage
+      }
+  }
+\lstset
+  {
+    style = mystyle,
+    breaklines = true,
+    resetmargins = true,
+    % numbers = left,
+    numberstyle = \footnotesize,
+    abovecaptionskip = -1ex,
+    belowcaptionskip = 1.5ex,
+    aboveskip = 1.5ex plus .2ex minus .1ex,
+    belowskip = 0.55ex plus .2ex minus .1ex,
+    keepspaces = true,
+    framerule = \l__rule_width_dim,
+    columns = flexible
+  }
+\lstloadlanguages{C,C++,Java,Python,Matlab}
+\AtBeginEnvironment{verbatim}{\microtypesetup{activate = false}}
+
+\clist_new:N \l__hyperref_clist
+\cs_new_protected:Npn \__put_hyperref:n #1
+  {\clist_put_right:Nn \l__hyperref_clist{#1}}
+\cs_new_protected:Npn \__define_linkcolor:nnn #1#2#3
+  {\definecolorset{HTML}{ctex@}{}{link,#1;url,#2;cite,#3}}
+\cs_new_protected:Npn \__define_themecolor:nnn #1#2#3
+  {\definecolorset{HTML}{ctex@}{}{frame,#1;emph,#2;verb,#3}}
+\cs_new:Npn \__linkcolor_set:n #1
+  {
+    linkcolor/\clist_item:nn {#1}{1} .code:n =
+      {
+        \__define_linkcolor:nnn
+          {\clist_item:nn {#1}{2}}
+          {\clist_item:nn {#1}{3}}
+          {\clist_item:nn {#1}{4}}
+        \__put_hyperref:n
+          {
+            linkcolor = ctex at link,linkbordercolor = ctex at link,
+            urlcolor = ctex at url,urlbordercolor = ctex at url,
+            citecolor = ctex at cite,citebordercolor = ctex at cite
+          }
+      },
+  }
+\cs_new:Npn \__themecolor_set:n #1
+  {
+    color/\clist_item:nn {#1}{1} .code:n =
+      {
+        \__define_themecolor:nnn
+          {\clist_item:nn {#1}{2}}
+          {\clist_item:nn {#1}{3}}
+          {\clist_item:nn {#1}{4}}
+      },
+  }
+
+\cs_new:Npn \__allow_urlbreak:
+  {
+    \cs_new:Npn \__add_urlbreak_points:
+      {\tl_map_function:NN \c__urlbreak_points_tl\do}
+    \__appto_cmd:Nn
+      \UrlBreaks{\UrlOrds\__add_urlbreak_points:}
+  }
+\tl_const:Nn \c__urlbreak_points_tl
+  {ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789}
+
+\keys_define:nx {ctex/link}
+  {
+    hyperlink         .choice:,
+    hyperlink/edge    .code:n = {},
+    hyperlink/various .code:n = {\__put_hyperref:n {colorlinks}},
+    hyperlink/none    .code:n = {\__put_hyperref:n {hidelinks}},
+    hyperlink         .default:n = edge,
+    hyperlink         .initial:n = edge,
+
+    linkcolor         .choice:,
+    \clist_map_function:nN
+      {
+        {fresh,     62d71f,0000B2,005752},
+        {cutepink,  ff69b4,9d5196,57b5e5},
+        {skyblue,   0000ff,004986,eb6877},
+        {crimson,   dc143c,00c1c9,afcd20}
+      }
+      \__linkcolor_set:n
+    linkcolor         .default:n = fresh,
+    linkcolor         .initial:n = fresh,
+
+    linktopage        .choice:,
+    linktopage/true   .code:n = {\__put_hyperref:n {linktocpage}},
+    linktopage/false  .code:n = {},
+    linktopage        .default:n = true,
+    linktopage        .initial:n = false
+  }
+\keys_define:nx {ctex/style}
+  {
+    color             .choice:,
+    color             .value_required:n = true,
+    \clist_map_function:nN
+      {
+        {none,      000000,000000,000000},
+        {seaside,   4682B4,004986,a40000},
+        {energy,    f39800,00a0e9,893895},
+        {cyberpunk, 601986,eb6877,a4005b}
+      }
+      \__themecolor_set:n
+    color             .initial:n = none
+  }
+
+\ctex_at_end_preamble:n
+  {
+    \RequirePackage[pdfstartview = FitH,bookmarksnumbered]{hyperref}
+    \RequirePackage{cleveref}
+    \urlstyle{same}
+    \exp_args:NV \hypersetup\l__hyperref_clist
+    \__allow_urlbreak:
+
+    \bool_if:NTF \l__lang_chinese_bool
+      {
+        \keys_set_known:nn {ctex}
+          {
+            contentsname = {目\hspace{\ccwd}录},
+            indexname = {索\hspace{\ccwd}引},
+            listfigurename = {图片索引},
+            listtablename = {表格索引},
+            abstractname = {摘\hspace{\ccwd}要},
+            lstlistlistingname = {代码索引},
+            lstlistingname = {代码}
+          }
+        \crefformat{equation}{#2式(#1)#3}
+        \crefformat{align}{#2式(#1)#3}
+        \crefformat{multline}{#2式(#1)#3}
+        \crefformat{gather}{#2式(#1)#3}
+        \crefformat{figure}{#2图#1#3}
+        \crefformat{table}{#2表#1#3}
+        \crefformat{chapter}{#2第#1章#3}
+        \crefformat{section}{#2节#1#3}
+        \crefformat{subsection}{#2小节#1#3}
+        \crefformat{theorem}{#2定理#1#3}
+        \crefformat{definition}{#2定义#1#3}
+        \crefformat{lemma}{#2引理#1#3}
+        \crefformat{corollary}{#2推论#1#3}
+        \crefformat{proposition}{#2性质#1#3}
+        \crefformat{example}{#2例#1#3}
+      }{
+        \keys_set_known:nn {ctex}
+          {
+            abstractname = {Abstract},
+            lstlistlistingname = {List~of~Listings},
+            lstlistingname = {Code}
+          }
+        \crefformat{equation}{#2Equation~(#1)#3}
+        \crefformat{align}{#2Equation~(#1)#3}
+        \crefformat{multline}{#2Equation~(#1)#3}
+        \crefformat{gather}{#2Equation~(#1)#3}
+        \crefformat{figure}{#2Figure~#1#3}
+        \crefformat{table}{#2Table~#1#3}
+        \crefformat{chapter}{#2Chapter~#1#3}
+        \crefformat{section}{#2Section~#1#3}
+        \crefformat{subsection}{#2Subsection~#1#3}
+        \crefformat{theorem}{#2Theorem~#1#3}
+        \crefformat{definition}{#2Definition~#1#3}
+        \crefformat{lemma}{#2Lemma~#1#3}
+        \crefformat{corollary}{#2Corollary~#1#3}
+        \crefformat{proposition}{#2Proposition~#1#3}
+        \crefformat{example}{#2Example~#1#3}
+      }
+  }
+
+\ctex_set:n
+  {
+    secnumdepth = 3,
+    tocdepth = 1,
+    part =
+      {
+        pagestyle = empty,
+        number =
+          {\bool_if:NTF \l__zhtitle_bool{\chinese{part}}{\thepart}},
+        format = {\color{ctex at frame}\sffamily\Huge},
+        aftername =
+          {\bool_if:NTF \l__newline_bool{\par\nobreak}{\hspace{\ccwd}}},
+        tocline = {\CTEXifname{\CTEXthepart\hspace{\ccwd}}{}#2}
+      },
+    chapter =
+      {
+        % pagestyle = fancy,
+        number =
+          {\bool_if:NTF \l__zhtitle_bool{\chinese{chapter}}{\thechapter}},
+        format =
+          {
+            \color{ctex at frame}\sffamily\LARGE
+            \bool_if:NF \l__newline_bool{\centering}
+          },
+        aftername =
+          {
+            \bool_if:NTF \l__newline_bool
+              {\par\nobreak\vskip 1.5pc}{\hspace{\ccwd}}
+          },
+        beforeskip = {-1.5ex},
+        afterskip = {3ex},
+        lotskip = {0.8pc},
+        lofskip = {0.8pc},
+        tocline = {\CTEXifname{\CTEXthechapter\hspace{\ccwd}}{}#2}
+      },
+    section =
+      {
+        hang = true,
+        format = {\color{ctex at frame}\sffamily\Large},
+        aftername = {\hspace{0.5\ccwd}},
+        beforeskip = {1.5ex plus .2ex minus .1ex},
+        afterskip = {1.5ex plus .2ex minus .1ex},
+        tocline = {\CTEXifname{\CTEXthesection\hspace{\ccwd}}{}#2}
+      },
+    subsection =
+      {
+        hang = true,
+        format = {\color{ctex at frame}\sffamily\large},
+        aftername = {\hspace{0.5\ccwd}},
+        beforeskip = {1.3ex plus .2ex minus .1ex},
+        afterskip = {1.3ex plus .2ex minus .1ex},
+        tocline = {\CTEXifname{\CTEXthesubsection\hspace{\ccwd}}{}#2}
+      },
+    subsubsection =
+      {
+        hang = true,
+        format = {\color{ctex at frame}\sffamily},
+        aftername = {\hspace{0.5\ccwd}},
+        beforeskip = {\parskip},
+        afterskip = {\parskip}
+      }
+  }
+
+\bool_if:NF \l__newline_bool
+  {
+    \ctex_set:n
+      {
+        part/hang = true,
+        chapter/hang = true
+      }
+  }
+%</class>
+%\Finale
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/source/latex/easybook/easybook.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/easybook/easybook.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/easybook/easybook.cls	2021-03-17 21:41:11 UTC (rev 58472)
+++ trunk/Master/texmf-dist/tex/latex/easybook/easybook.cls	2021-03-17 21:42:35 UTC (rev 58473)
@@ -1,8 +1,12 @@
 %%
-%% This is file `easybook.cls'.
+%% 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 <texeasybook at 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
@@ -9,7 +13,7 @@
 %%   https://creativecommons.org/licenses/by/4.0/legalcode
 \NeedsTeXFormat{LaTeX2e}[2020/10/01]
 \RequirePackage{l3keys2e}
-\ProvidesExplClass{easybook}{2021/03/16}{1.23s}{}
+\ProvidesExplClass{easybook}{2021/03/17}{1.23t}{}
 
 \cs_generate_variant:Nn \keys_define:nn {nx}
 \cs_generate_variant:Nn \int_to_arabic:n {v}
@@ -454,7 +458,7 @@
     section/format    .tl_set:N = \l__toc_section_format_tl,
     section/format    .initial:n = \addvspace{0.35pc},
     section/indent    .tl_set:N = \l__toc_section_indent_tl,
-    section/indent    .initial:n = 1.5\ccwd,    
+    section/indent    .initial:n = 1.5\ccwd,
     section/rule      .tl_set:N = \l__toc_section_rule_tl,
     section/rule      .initial:n = \tocrule{$\cdot$},
 
@@ -1508,5 +1512,6 @@
         chapter/hang = true
       }
   }
+\endinput
 %%
-%% End of file `easybook.cls'.
\ No newline at end of file
+%% End of file `easybook.cls'.

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2021-03-17 21:41:11 UTC (rev 58472)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2021-03-17 21:42:35 UTC (rev 58473)
@@ -2886,6 +2886,7 @@
  'dramatist'	=> 'latex',  # requires interaction
  'drm'          => 'latex',  # requires interaction
  'duckuments'	=> 'tex',
+ 'easybook'	=> 'etex',
  'ejpecp'       => 'latex',  # requires interaction
  'ekaia'        => 'latex',  # requires interaction
  'ellipsis'	=> 'tex',



More information about the tex-live-commits mailing list.