% \iffalse meta-comment
% !TeX program  = XeLaTeX
% !TeX encoding = UTF-8
%
% Copyright (C) 2017--2023 by Xiangdong Zeng <xdzeng96@gmail.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c of this license or (at your option) any later
% version. The latest version of this license is in:
%
%   http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of
% LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Xiangdong Zeng.
%
% This work consists of the files fduthesis.dtx,
%                                 fduthesis-doc.dtx,
%                                 fduthesis-logo.dtx,
%           and the derived files fduthesis.ins,
%                                 fduthesis.cls,
%                                 fduthesis-en.cls,
%                                 fduthesis.def,
%                                 fdudoc.cls,
%                                 fdulogo.sty,
%                                 fdulogo-example.tex,
%                                 fduthesis-cover.tex,
%                                 fduthesis-en.tex,
%                                 fudan-emblem.pdf,
%                                 fudan-emblem-new.pdf,
%                                 fudan-name.pdf,
%                                 fduthesis.pdf,
%                                 fduthesis-en.pdf,
%                                 fduthesis-code.pdf,
%                             and README.md.
%
%<*internal>
\iffalse
%</internal>
%
%<*readme>
The `fduthesis` Class
=====================

*LaTeX thesis template for Fudan University, v0.9a*

Overview
--------

This template supports doctoral or master dissertion and undergraduate
thesis, both in Chinese or English. With the help of modern LaTeX
technology, `fduthesis` aims to create a simple interface, a normative
format, as well as a hackable class for the users.

At present, `fduthesis` only supports XeTeX and LuaTeX engines.
Support for pdfTeX and [ApTeX](https://github.com/clerkma/ptex-ng) is
still under development. `fduthesis` only allows UTF-8 encoding.

The documentation can be found in
[fduthesis.pdf](http://mirrors.ctan.org/macros/latex/contrib/fduthesis/fduthesis.pdf)
(in Chinese) or
[fduthesis-en.pdf](http://mirrors.ctan.org/macros/latex/contrib/fduthesis/fduthesis-en.pdf)
(in English).

GitHub repository: <https://github.com/stone-zeng/fduthesis>.

Installation
------------

To install `fduthesis`, you can use one of the following methods:

- If you are running TeX Live, the simplest way is to run

      tlmgr install fduthesis

- Download
  [fduthesis.tds.zip](http://mirror.ctan.org/install/macros/latex/contrib/fduthesis.tds.zip)
  from CTAN, extract it in the root of one of your TDS trees, and
  update the filename database.

- Get the source from GitHub:

      git clone https://github.com/stone-zeng/fduthesis.git

  Run `install-win.bat` (Windows) or `install-unix.sh` (Linux or macOS)
  to generate the templates and configuration files. These files would
  be found in a new-created `thesis` folder. You can enjoy `fduthesis`
  here at once.

  For permanent installation, you may move the following files into a
  directory where LaTeX will find them (e.g.
  `TEXMF/tex/latex/fduthesis/`):

  - `fduthesis.cls`
  - `fduthesis-en.cls`
  - `fduthesis.def`
  - `fdudoc.cls`
  - `fdulogo.sty`
  - `fudan-emblem.pdf`
  - `fudan-emblem-new.pdf`
  - `fudan-name.pdf`

  Do not forget to update the filename database afterwards.

Contributing
------------

[Issues](https://github.com/stone-zeng/fduthesis/issues) and
[pull requests](https://github.com/stone-zeng/fduthesis/pulls)
are always welcome.

License
-------

This work may be distributed and/or modified under the conditions of
the [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
either version 1.3c of this license or (at your option) any later
version.

-----

Copyright (C) 2017&ndash;2023 by Xiangdong Zeng <xdzeng96@gmail.com>.
%</readme>
%
%<*internal>
\fi
\begingroup
  \def\NameOfLaTeXe{LaTeX2e}
\expandafter\endgroup\ifx\NameOfLaTeXe\fmtname\else
\csname fi\endcsname
%</internal>
%
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse

\preamble

    Copyright (C) 2017--2023 by Xiangdong Zeng <xdzeng96@gmail.com>

    This work may be distributed and/or modified under the
    conditions of the LaTeX Project Public License, either
    version 1.3c of this license or (at your option) any later
    version. The latest version of this license is in:

      http://www.latex-project.org/lppl.txt

    and version 1.3 or later is part of all distributions of
    LaTeX version 2005/12/01 or later.

    This work has the LPPL maintenance status `maintained'.

    The Current Maintainer of this work is Xiangdong Zeng.

    This work consists of the files fduthesis.dtx,
                                    fduthesis-doc.dtx,
                                    fduthesis-logo.dtx,
              and the derived files fduthesis.ins,
                                    fduthesis.cls,
                                    fduthesis-en.cls,
                                    fduthesis.def,
                                    fdudoc.cls,
                                    fdulogo.sty,
                                    fdulogo-example.tex,
                                    fduthesis-cover.tex,
                                    fduthesis-en.tex,
                                    fudan-emblem.pdf,
                                    fudan-emblem-new.pdf,
                                    fudan-name.pdf,
                                    fduthesis.pdf,
                                    fduthesis-en.pdf,
                                    fduthesis-code.pdf,
                                and README.md.

\endpreamble

\generate{
  \usedir{tex/latex/fduthesis}
    \file{\jobname.cls}        {\from{\jobname.dtx}{class}}
    \file{\jobname-en.cls}     {\from{\jobname.dtx}{class-en}}
    \file{\jobname.def}        {\from{\jobname.dtx}{definition}}
    \file{fdudoc.cls}          {\from{\jobname.dtx}{doc}
                                \from{\jobname-doc.dtx}{doc}}
    \file{fdulogo.sty}         {\from{\jobname.dtx}{logo}
                                \from{\jobname-logo.dtx}{logo}}
    \file{fdulogo-example.tex} {\from{\jobname.dtx}{ex-logo}
                                \from{\jobname-logo.dtx}{ex-logo}}
    \file{\jobname-cover.tex}  {\from{\jobname.dtx}{cover}
                                \from{\jobname-logo.dtx}{cover}}
%<*internal>
  \usedir{source/latex/fduthesis}
    \file{\jobname.ins}        {\from{\jobname.dtx}{install}}
%</internal>
  \usedir{doc/latex/fduthesis}
  \nopreamble\nopostamble
    \file{README.md}           {\from{\jobname.dtx}{readme}}
}

\obeyspaces
\Msg{*************************************************************}
\Msg{*                                                           *}
\Msg{* To finish the installation you have to move the following *}
\Msg{* files into a directory searched by TeX:                   *}
\Msg{*                                                           *}
\Msg{* The recommended directory is TDS:tex/latex/fduthesis      *}
\Msg{*                                                           *}
\Msg{*     fduthesis.cls                                         *}
\Msg{*     fduthesis-en.cls                                      *}
\Msg{*     fduthesis.def                                         *}
\Msg{*     fdudoc.cls                                            *}
\Msg{*     fdulogo.sty                                           *}
\Msg{*                                                           *}
\Msg{* To produce the documentation, run the file fduthesis.dtx  *}
\Msg{* through XeLaTeX.                                          *}
\Msg{*                                                           *}
\Msg{* Happy TeXing!                                             *}
\Msg{*                                                           *}
\Msg{*************************************************************}

\endbatchfile
%</install>
%
%<*internal>
\fi
%</internal>
%
%<class|class-en|doc|logo>\NeedsTeXFormat{LaTeX2e}[2020/10/01]
%<*!(driver|install|ex-logo|cover)>
%<!readme>\GetIdInfo $Id: fduthesis.dtx 0.9a 2023-05-27 12:00:00Z Xiangdong Zeng <xdzeng96@gmail.com> $
%<class>  {Thesis template for Fudan University}
%<class>\ProvidesExplClass{\ExplFileName}
%<class-en>  {Thesis template for Fudan University (English version)}
%<class-en>\ProvidesExplClass{\ExplFileName-en}
%<definition>  {Definition file for fduthesis}
%<definition>\ProvidesExplFile{\ExplFileName.def}
%<doc>  {Documentation class for fduthesis}
%<doc>\ProvidesExplClass{fdudoc}
%<logo>  {Fudan University's Visual Identity}
%<logo>\ProvidesExplPackage{fdulogo}
%<!readme>  {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
%</!(driver|install|ex-logo|cover)>
%<*driver>
% \PassOptionsToPackage{showframe}{geometry}
\documentclass{fdudoc}
\usepackage{xeCJKfntef}
\hypersetup{
  pdftitle  = {fduthesis: 复旦大学论文模板},
  pdfauthor = {曾祥东}}
% 全角标点放在引号中，需要改成半角式，否则间距过大，不好看
\def\FSID{“{\xeCJKsetup{PunctStyle=banjiao}。}”} % U+3002
\def\FSFW{“{\xeCJKsetup{PunctStyle=banjiao}．}”} % U+FF0E
\def\COFW{“{\xeCJKsetup{PunctStyle=banjiao}：}”} % U+FF1A
\def\SCFW{“{\xeCJKsetup{PunctStyle=banjiao}；}”} % U+FF1B
%^^A! \PassOptionsToPackage{scheme=plain, linespread=1.1}{ctex}
%^^A! \documentclass{fdudoc}
%^^A! \hypersetup{
%^^A!   pdftitle  = {fduthesis: LaTeX Thesis Template for Fudan University},
%^^A!   pdfauthor = {Xiangdong Zeng}}
%^^A! \ctexset{
%^^A!   section = {name = {}, format+ = \raggedright},
%^^A!   subsubsection/tocline = {\CTEXnumberline{#1}#2}}
%^^A! \pagestyle{headings}
%^^A! \def\FSID{{\xeCJKsetup{PunctStyle=banjiao}。}}
%^^A! \def\FSFW{{\xeCJKsetup{PunctStyle=banjiao}．}}
%^^A!

\title{\textcolor{MaterialIndigo800}{\textbf{fduthesis: 复旦大学论文模板}}}
\author{曾祥东}
\date{2023/05/27\quad v0.9a%
  \thanks{\url{https://github.com/stone-zeng/fduthesis}.}}
%^^A! \title{\textcolor{MaterialIndigo800}{%
%^^A!   \textbf{The \textsf{fduthesis} Class \\
%^^A!     \LaTeX{} Thesis Template for Fudan University}}}
%^^A! \author{Xiangdong Zeng}
%^^A! \date{2023/05/27\quad v0.9a%
%^^A!   \thanks{\url{https://github.com/stone-zeng/fduthesis}.}}
%^^A!

\begin{document}
%^^A! \begin{document}
%^^A!
  \DisableImplementation
%<!--CODEDOC-->  \EnableImplementation
%<!--CODEDOC-->  \def\FDUCODEDOC{}
  \DocInput{fduthesis.dtx}
%<!--CODEDOC-->  \DocInput{fduthesis-doc.dtx,fduthesis-logo.dtx}
%<!--CODEDOC-->  \IndexLayout
%<!--CODEDOC-->  \PrintChanges
%<!--CODEDOC-->  \PrintIndex
\end{document}
%</driver>
% \fi
%
% \changes{v0.1}{2017/02/15}{开始编写模板。}
% \changes{v0.2}{2017/02/19}{使用 Git 进行版本控制，并发布至 GitHub。}
% \changes{v0.3}{2017/02/21}{使用 \cls{doc} 和 \pkg{DocStrip}。}
% \changes{v0.3}{2017/03/04}{支持 \LuaLaTeX{}。}
% \changes{v0.3}{2017/03/20}{添加测试文件。}
% \changes{v0.3}{2017/05/26}{使用 Travis CI 进行持续集成。}
% \changes{v0.3}{2017/06/23}{添加复旦大学视觉识别系统。}
% \changes{v0.3}{2017/07/05}{新增声明页。}
% \changes{v0.3}{2017/07/10}{添加英文模板。}
% \changes{v0.3}{2017/07/19}{使用 \pkg{l3docstrip} 管理名字空间。}
% \changes{v0.3}{2017/07/28}{整理代码，编写用户文档。}
% \changes{v0.4}{2017/08/03}{拆分 \file{.dtx} 文件。}
% \changes{v0.4}{2017/08/11}{添加错误信息提示。}
% \changes{v0.6}{2017/11/23}{同步 \pkg{ctex} v2.4.11。}
% \changes{v0.6}{2017/11/29}{添加英文版用户文档。}
% \changes{v0.7}{2018/01/26}{使用 \pkg{l3build} 进行回归测试。}
% \changes{v0.7}{2018/01/31}{不再需要 \file{fduthesis-user.def}。}
% \changes{v0.7}{2018/03/04}{所有选项更改为用连字符隔开的形式。}
% \changes{v0.7a}{2018/04/09}{更新文档，发布至 CTAN。}
% \changes{v0.7b}{2018/04/29}{支持 \TeXLive{} 2018。}
% \changes{v0.7b}{2018/05/06}{将校名、校徽图片添加至发行版。}
%
%^^A 禁止使用 " 符号作为抄录文本缩略符
% \DeleteShortVerb\"
%^^A! \DeleteShortVerb\"
%^^A!
%
%^^A 封面与目录的页边距
%^^A+
% \newgeometry{
%   left   = 1.25 in,
%   right  = 1.25 in,
%   top    = 1.25 in,
%   bottom = 1.00 in
% }
%
% \maketitle
% \vfill
% \begin{center}
%   \includegraphics[width=8cm]{../logo/fduthesis-cover.pdf}
% \end{center}
% \vfill
% \thispagestyle{plain}
% \clearpage
%
% \tableofcontents
%
%^^A-
%
% \EnableDocumentation
%^^A \DisableDocumentation
%
% \begin{documentation}
%
%^^A 用户手册的页边距
%^^A+
% \newgeometry{
%   left   = 1.65 in,
%   right  = 0.80 in,
%   top    = 1.25 in,
%   bottom = 1.00 in
% }
%
%^^A-
%
% \section{介绍}
%^^A! \section{Introduction}
%^^A!
%
% 本模板编写之初，可以找到的复旦大学 \LaTeX{} 论文模板有以下这些：
% \begin{itemize}
%   \item 数学科学学院的本科毕业论文模版 \cite{数院本科毕业论文写作模板}，主要贡献者为 2001 级的
%     何力同学、李湛同学和 2004 级的张越同学；
%   \item Pandoxie 编写的 \cls{FDU-Thesis-Latex} \cite{pandoxie2014fduthesislatex}，基本满足了博士
%     （硕士）毕业论文格式要求，在当时使用人数较多；
%   \item richarddzh 编写的硕士论文模板 \cls{fudan-thesis} \cite{richard2016fudanthesis}。
% \end{itemize}
% 以上模板大都没有经过系统的设计，也缺乏后续维护。相比之下，清华大学 \cite{thuthesis}、
% 北京大学 \cite{pkuthss}、重庆大学 \cite{cquthesis}、中国科学技术大学 \cite{ustcthesis}、
% 中国科学院大学 \cite{ucasthesis} 以及友校上海交通大学 \cite{sjtuthesis} 等，都有较为成熟、稳定
% 的解决方案，也积累了广泛的用户基础，值得参考与借鉴。
%
% 考虑到开发与持续维护的需要，本模板使用 \LaTeX3 \cite{source3} 语法编写。同时将构建一套简洁的
% 接口，以方便用户使用。
%^^A! \cls{fduthesis} is a thesis template for Fudan University.
%^^A! This template is mostly written in \LaTeX3 syntax, and
%^^A! provides a simple interface for users.
%^^A!
%
% \subsection*{\LaTeX{} 入门}
%^^A! \subsection*{Getting started with \LaTeX{}}
%^^A!
%
% 本文档不是一份 \LaTeX{} 零基础教程。如果缺乏使用 \LaTeX{} 的经验，建议先阅读有关入门文档，如
% 刘海洋编著的《\LaTeX{} 入门》\cite{刘海洋2013latex入门} 第一章，或“\pkg{lshort}” \cite{lshort}
% 及其中文翻译版 \cite{lshort-zh-cn}。当然，网络上的 \LaTeX{} 教程数量甚多，也可自行选取。
%^^A! This documentation is \emph{not} a \LaTeX{} tutorial at
%^^A! starter's level. If you are totally a newbie, please read some
%^^A! introductions like the famous \pkg{lshort}. Of course, there
%^^A! are countless \LaTeX{} tutorials on the Internet. You can
%^^A! choose whatever you like.
%^^A!
%
% \subsection*{关于本文档}
%^^A! \subsection*{About this documentation}
%^^A!
%
% 本文档采用不同字体表示不同内容。无衬线字体表示宏包名称，如 \pkg{xeCJK} 宏包、\cls{fduthesis}
% 文档类等；等宽字体表示代码或文件名，如 \cs{fdusetup} 命令、\env{abstract} 环境、\TeX{} 文档
% \file{thesis.tex} 等；带有尖括号的楷体（或西文斜体）表示命令参数，如 \meta{模板选项}、
% \meta{English title} 等。在使用时，参数两侧的尖括号不必输入。示例代码进行了语法高亮处理，
% 以方便阅读。
%^^A! In this documentation, different typefaces are used to
%^^A! represent different contents. Packages and classes are shown
%^^A! in sans-serif font, e.g.\ \pkg{xeCJK} package and
%^^A! \cls{fduthesis} class. Commands and file names are shown in
%^^A! monospaced font, e.g.\ command \cs{fdusetup}, environment
%^^A! \env{abstract} and \TeX{} document \file{thesis.tex}.
%^^A! Italic-shaped font with angle brackets outside means arguments,
%^^A! e.g.\ \meta{English title}. However, you do not need to type
%^^A! the brackets when using these commands. The example code has
%^^A! proper syntax highlighting so it will be much easier to read.
%^^A!
%
% 在用户手册中，带有蓝色侧边线的为 \LaTeX{} 代码，而带有粉色侧边线的则为命令行代码，请注意区分。
% 模板提供的选项、命令、环境等，均列在左边栏并用横线框起，同时给出使用语法和相关说明。
%^^A! \LaTeX{} code lines will have a blue line on their left, while
%^^A! for command lines there will be a pink line. The options,
%^^A! commands and environments in \cls{fduthesis} will be surrounded
%^^A! by two horizontal lines. Their usages and descriptions are
%^^A! provided at the same time.
%^^A!
%
% 本模板中的选项、命令或环境可以分为以下三类：
% \begin{itemize}
%   \item 名字后面带有 \rexptarget\rexpstar{} 的，表示只能在\emph{中文模板}中使用；
%   \item 名字后面带有 \exptarget\expstar{} 的，表示只能在\emph{英文模板}中使用；
%   \item 名字后面不带有特殊标记的，表示既可以在中文模板中使用，也可以在英文模板中使用。
% \end{itemize}
%^^A! The options, commands and environments in \cls{fduthesis} can be
%^^A! divided into the following three types:
%^^A! \begin{itemize}
%^^A!   \item Those can be only used in \emph{Chinese templates} are
%^^A!     indicated by \rexptarget\rexpstar{}.
%^^A!   \item Those can be only used in \emph{English templates} are
%^^A!     indicated by \rexptarget\expstar{}.
%^^A!   \item If they do not have marks afterwards, then you can use
%^^A!     them in both Chinese and English templates.
%^^A! \end{itemize}
%^^A!
%
% \section{安装}
%^^A! \section{Installation}
%^^A!
%
% \subsection{获取 \cls{fduthesis}}
%^^A! \subsection{Obtaining \cls{fduthesis}}
%^^A!
%
% \subsubsection{标准安装}
%^^A! \subsubsection{Standard installation}
%^^A!
%
% 如果没有特殊理由，始终建议使用宏包管理器安装 \cls{fduthesis}。例如在 \TeXLive{} 中，执行（可能
% 需要管理员权限）
% \begin{shellexample}[morekeywords={tlmgr,install}]
%   tlmgr install fduthesis
% \end{shellexample}
% 即可完成安装。如果已经装有完整版的 \TeXLive{}，则 \cls{fduthesis} 应当已经包含在其中，此时即可
% 直接使用，也可以执行
% \begin{shellexample}[morekeywords={tlmgr,update},emph={--all}]
%   tlmgr update --all
% \end{shellexample}
% 检查并更新全部宏包。
%^^A! If there are no special reasons, it is always recommended to
%^^A! install \cls{fduthesis} with a package manager. For example,
%^^A! the following command will install the package in \TeXLive{}
%^^A! (administrator permission may be required):
%^^A! \begin{shellexample}[morekeywords={tlmgr,install}]
%^^A!   tlmgr install fduthesis
%^^A! \end{shellexample}
%^^A!
%
% 在 \TeXLive{} 和 \MiKTeX{} 中，还可以通过图形界面进行安装和更新，此处不再赘述。
%^^A! In \TeXLive{} and \MiKTeX{}, you can also install \cls{fduthesis}
%^^A! through a graphical interface. It's rather simple and will not be
%^^A! described here.
%^^A!
%
% \subsubsection{手动安装}
%^^A! \subsubsection{Install manually}
%^^A!
%
% 如果需要从 CTAN 上自行下载并手动安装，可使用 TDS 安装包：
% \begin{itemize}
%   \item 从 CTAN 上下载 \cls{fduthesis} 的
%     \href{https://mirror.ctan.org/install/macros/latex/contrib/fduthesis.tds.zip}{TDS 安装包}；
%   \item 按目录结构将 \file{fduthesis.tds.zip} 中的文件复制到 \TeX{} 发行版的本地 TDS 根目录；
%   \item 执行 \texttt{mktexlsr} 命令刷新文件名数据库以完成安装。
% \end{itemize}
%^^A! If you want to download the template from CTAN and install it
%^^A! manually, the recommended way is to use the TDS ZIP file:
%^^A! \begin{itemize}
%^^A!   \item Download the \href{http://mirror.ctan.org/install/macros/latex/contrib/fduthesis.tds.zip}%
%^^A!     {TDS ZIP file} for \cls{fduthesis};
%^^A!   \item Copy all the files in \file{fduthesis.tds.zip} into the
%^^A!     local TDS directory of \TeX{} distribution.
%^^A!   \item Run \texttt{mktexlsr} to update the ls-R database.
%^^A! \end{itemize}
%^^A
%
% \subsubsection{开发版本}
%^^A! \subsubsection{Development version}
%^^A!
%
% CTAN 上仅提供了 \cls{fduthesis} 的稳定版，其更新可能较为滞后，一些 bug 常常不能得到及时修复。
% 如果需要使用开发版（托管在 GitHub 上），可以使用模板提供的安装脚本：
% \begin{itemize}
%   \item 打开 \href{https://github.com/stone-zeng/fduthesis}{项目主页}，点击“Code”按钮，并选择
%     “Download ZIP”，下载 \file{fduthesis-main.zip}；如果已经装有 Git 程序，也可通过以下命令直接
%     克隆代码仓库：
%     \begin{shellexample}[gobble=7,alsoletter={.},morekeywords={git,clone}]
%       git clone https://github.com/stone-zeng/fduthesis.git
%     \end{shellexample}
%   \item 执行 \file{install-win.bat}（Windows 系统）或 \file{install-unix.sh}（Linux 或 macOS
%     系统），所有需要的文件便会在 \file{thesis} 文件夹中生成。
% \end{itemize}
%^^A! On CTAN, only the stable version of \cls{fduthesis} is provided, where new features and
%^^A! bug fixes may not be included in time. To use the latest development version on GitHub,
%^^A! you can use the install script:
%^^A! \begin{itemize}
%^^A!   \item Open the project's \href{https://github.com/stone-zeng/fduthesis}{homepage}, click
%^^A!     ``Code'' button and choose ``Download ZIP'' to download \file{fduthesis-main.zip}.
%^^A!     If you have git program on your computer, you can also clone the repository directly:
%^^A!     \begin{shellexample}[gobble=5,alsoletter={.},morekeywords={git,clone}]
%^^A!       git clone https://github.com/stone-zeng/fduthesis.git
%^^A!     \end{shellexample}
%^^A!   \item Run \file{install-win.bat} (Windows) or \file{install-unix.sh} (Linux or macOS),
%^^A!     all the necessary files will be found in the \file{thesis} folder then.
%^^A! \end{itemize}
%^^A!
%
% \subsubsection{Overleaf}
%^^A! \subsubsection{Overleaf}
%^^A!
%
% \cls{fduthesis} 也提供了 \href{https://www.overleaf.com/latex/templates/fduthesis-latex-thesis-template-for-fudan-university/svtdhhstkmkt}{Overleaf 的版本}，
% 打开链接并登录后即可直接编辑。
%^^A! \cls{fduthesis} also provides the \href{https://www.overleaf.com/latex/templates/fduthesis-latex-thesis-template-for-fudan-university/svtdhhstkmkt}{Overleaf version}.
%^^A! You can follow the link and login to edit directly on the web.
%^^A!
%
% \subsection{模板组成}
%^^A! \subsection{Composition of the template}
%^^A!
%
% 本模板主要包含核心文档类、配置文件、附属宏包以及用户文档等几个部分，其具体组成见
% 表~\ref{tab:fduthesis-components}。
%^^A! There are several parts in \cls{fduthesis}, including kernel template
%^^A! classes, configuration files, affiliated packages and user's guides.
%^^A! More details are listed in table~\ref{tab:fduthesis-components}.
%^^A!
%
% \begin{table}[ht]
%   \caption{\cls{fduthesis} 的主要组成部分}
%   \label{tab:fduthesis-components}
%   \centering
%   \small
%   \begin{tabular}{ll}
%     \toprule
%       \textbf{文件} & \textbf{功能说明} \\
%     \midrule
%       \file{fduthesis.cls}          & 中文模板文档类 \\
%       \file{fduthesis-en.cls}       & 英文模板文档类 \\
%       \file{fduthesis.def}          & 参数配置文件，用于设定初始参数，不建议自行改动 \\
%       \file{fdudoc.cls}             & 用户手册文档类 \\
%       \file{fdulogo.sty}            & 复旦大学视觉识别系统 \\
%       \file{fudan-emblem.pdf}       & 校徽 \\
%       \file{fudan-emblem-new.pdf}   & 校徽（重修版） \\
%       \file{fudan-name.pdf}         & 校名图片 \\
%       \file{README.md}              & 简要自述 \\
%       \ifdefined\FDUCODEDOC
%         \file{fduthesis.pdf}        & 中文用户手册 \\
%         \file{fduthesis-en.pdf}     & 英文用户手册 \\
%         \file{fduthesis-code.pdf}   & 模板实现代码（本文档） \\
%       \else
%         \file{fduthesis.pdf}        & 中文用户手册（本文档） \\
%         \file{fduthesis-en.pdf}     & 英文用户手册 \\
%         \file{fduthesis-code.pdf}   & 模板实现代码 \\
%       \fi
%     \bottomrule
%   \end{tabular}
% \end{table}
%^^A! \begin{table}[ht]
%^^A!   \caption{The main components of \cls{fduthesis}}
%^^A!   \label{tab:fduthesis-components}
%^^A!   \centering
%^^A!   \begin{tabular}{lp{24em}}
%^^A!     \toprule
%^^A!       \textbf{Files} & \textbf{Descriptions} \\
%^^A!     \midrule
%^^A!       \file{fduthesis.cls}          & Document class for Chinese thesis. \\
%^^A!       \file{fduthesis-en.cls}       & Document class for English thesis.\\
%^^A!       \file{fduthesis.def}          & Configuration parameters file
%^^A!         for \cls{fduthesis}. Please do \emph{not} modify it. \\
%^^A!       \file{fdudoc.cls}             & Document class for user guides. \\
%^^A!       \file{fdulogo.sty}            & Fudan University's visual identity. \\
%^^A!       \file{fudan-emblem.pdf}       & University emblem. \\
%^^A!       \file{fudan-emblem-new.pdf}   & University emblem (revised version). \\
%^^A!       \file{fudan-name.pdf}         & Figure of university name. \\
%^^A!       \file{README.md}              & The brief introduction. \\
%^^A!       \file{fduthesis.pdf}          & User's guide in Chinese. \\
%^^A!       \file{fduthesis-en.pdf}       & User's guide in English (this
%^^A!         document). \\
%^^A!       \file{fduthesis-code.pdf}     & Code implementation. \\
%^^A!     \bottomrule
%^^A!   \end{tabular}
%^^A! \end{table}
%^^A!
%
% \section{使用说明}
%^^A! \section{User's guide}
%^^A!
%
% \subsection{基本用法}
%^^A! \subsection{Getting started}
%^^A!
%
% 以下是一份简单的 \TeX{} 文档，它演示了 \cls{fduthesis} 的最基本用法：
%^^A! Here is a minimal \TeX{} file for \cls{fduthesis}:
%^^A+
% \begin{latexexample}[deletetexcs={\documentclass},
%     moretexcs={\chapter},morekeywords={\documentclass},
%     emph={[2]document}]
%   % thesis.tex
%   \documentclass{fduthesis}
%   \begin{document}
%     \chapter{欢迎}
%     \section{Welcome to fduthesis!}
%     你好，\LaTeX{}！
%   \end{document}
% \end{latexexample}
%^^A-
%^^A!
%
% 按照 \ref{subsec:编译方式}~小节中的方式编译该文档，您应当得到
% 一篇 5 页的文章。当然，这篇文章的绝大部分都是空白的。
%^^A! Compile this file under the instructions in
%^^A! subsection~\ref{subsec:compilation}, you will get a 5-page article.
%^^A! Of course, most of it will be blank, as you may predicate.
%^^A!
%
% 英文模板可以用类似的方式使用：
%^^A! The English version can be used in the same way:
%^^A+
% \begin{latexexample}[deletetexcs={\documentclass},
%     moretexcs={\chapter},morekeywords={\documentclass},
%     emph={[2]document}]
%   % thesis-en.tex
%   \documentclass{fduthesis-en}
%   \begin{document}
%     \chapter{Welcome}
%     \section{Welcome to fduthesis!}
%     Hello, \LaTeX{}!
%   \end{document}
% \end{latexexample}
%^^A-
% 英文模板只对正文部分进行了改动，封面、指导小组成员以及声明页仍将
% 显示为中文。
%^^A! The differences between English and Chinese version only
%^^A! live in the main body. Thesis cover, instructors list and
%^^A! declaration page are still printed in Chinese.
%^^A!
%
% \subsection{编译方式} \label{subsec:编译方式}
%^^A! \subsection{Compilation} \label{subsec:compilation}
%^^A!
%
% 本模板不支持 \pdfTeX{} 引擎，请使用 \XeLaTeX{} 或 \LuaLaTeX{}
% 编译。推荐使用 \XeLaTeX{}。为了生成正确的目录、脚注以及交叉引用，
% 您至少需要连续编译两次。
%^^A! \cls{fduthesis} does NOT support \pdfTeX{}. Please use
%^^A! \XeLaTeX{} or \LuaLaTeX{} to compile, and \XeLaTeX{} is
%^^A! recommended. To get the correct table of contents, footnotes
%^^A! and cross-references, you need to compile the source file at
%^^A! least twice.
%^^A!
%
% 以下代码中，假设您的 \TeX{} 源文件名为 \file{thesis.tex}。
% 使用 \XeLaTeX{} 编译论文，请在命令行中执行
% \begin{shellexample}[morekeywords={xelatex}]
%   xelatex thesis
%   xelatex thesis
% \end{shellexample}
% 或使用 \pkg{latexmk}：
% \begin{shellexample}[morekeywords={latexmk},emph={-xelatex}]
%   latexmk -xelatex thesis
% \end{shellexample}
%^^A! In the following example, suppose your \TeX{} source file is
%^^A! \file{thesis.tex}. Please execute the following commands if
%^^A! you want to use \XeLaTeX{}:
%^^A! \begin{shellexample}[morekeywords={xelatex}]
%^^A!   xelatex thesis
%^^A!   xelatex thesis
%^^A! \end{shellexample}
%^^A! You can use \pkg{latexmk} as well:
%^^A! \begin{shellexample}[morekeywords={latexmk},emph={-xelatex}]
%^^A!   latexmk -xelatex thesis
%^^A! \end{shellexample}
%^^A!
%
% 使用 \LuaLaTeX{} 编译论文，请在命令行中执行
% \begin{shellexample}[morekeywords={lualatex}]
%   lualatex thesis
%   lualatex thesis
% \end{shellexample}
% 或者
% \begin{shellexample}[morekeywords={latexmk},emph={-lualatex}]
%   latexmk -lualatex thesis
% \end{shellexample}
%^^A! \LuaLaTeX{} can be used in a similar way:
%^^A! \begin{shellexample}[morekeywords={lualatex}]
%^^A!   lualatex thesis
%^^A!   lualatex thesis
%^^A! \end{shellexample}
%^^A! or
%^^A! \begin{shellexample}[morekeywords={latexmk},emph={-lualatex}]
%^^A!   latexmk -lualatex thesis
%^^A! \end{shellexample}
%^^A!
%
% \subsection{模板选项}
%^^A! \subsection{Options of the template}
%^^A!
%
% 所谓“模板选项”，指需要在引入文档类的时候指定的选项：
% \begin{latexexample}[deletetexcs={\documentclass},
%     morekeywords={\documentclass}]
%   \documentclass(*\oarg{模板选项}*){fduthesis}
%   \documentclass(*\oarg{模板选项}*){fduthesis-en}
% \end{latexexample}
%^^A! You can specify some \emph{template options} when loading
%^^A! \cls{fduthesis}:
%^^A! \begin{latexexample}[deletetexcs={\documentclass},
%^^A!     morekeywords={\documentclass}]
%^^A!   \documentclass(*\oarg{options}*){fduthesis}
%^^A!   \documentclass(*\oarg{options}*){fduthesis-en}
%^^A! \end{latexexample}
%^^A!
%
% 有些模板选项为布尔型，它们只能在 \opt{true} 和 \opt{false}
% 中取值。对于这些选项，\kvopt{\meta{选项}}{true} 中的“|= true|”
% 可以省略。
%^^A! Some options are \emph{boolean} --- they only take the value
%^^A! \opt{true} or \opt{false}. For these options, you can
%^^A! abbreviate ``\kvopt{\meta{option}}{true}'' simply to
%^^A! ``\opt{\meta{option}}''.
%^^A!
%
%^^A+
% \begin{function}[added=2018-02-01]{type}
%   \begin{fdusyntax}[emph={[1]type}]
%     type = (*<doctor|master|(bachelor)>*)
%   \end{fdusyntax}
%^^A-
%   选择论文类型。三种选项分别代表博士学位论文、硕士学位论文和本科
%   毕业论文。
% \end{function}
%^^A!   Choose the type of your thesis. The three options represent
%^^A!   doctoral dissertation, master degree thesis and undergraduate
%^^A!   thesis, respectively.
%^^A! \end{function}
%^^A!
%
% \begin{function}{oneside,twoside}
%   指明论文的单双面模式，默认为 \opt{twoside}。该选项会影响每章
%   的开始位置，还会影响页眉样式。
% \end{function}
%^^A! \begin{function}{oneside,twoside}
%^^A!   Specify whether single or double sided output should be
%^^A!   generated. \opt{twoside} will be chosen by default. These
%^^A!   option will determine where the new chapters begin and how
%^^A!   the headers display. The option \opt{twoside} does
%^^A!   \emph{not} tell the printer to actually make a two-sided
%^^A!   printout.
%^^A! \end{function}
%^^A!
%
% 在双面模式（\opt{twoside}）下，按照通常的排版惯例，每章应只从
% 奇数页（在右）开始；而在单页模式（\opt{oneside}）下，则可以从
% 任意页面开始。本模板中，目录、摘要、符号表等均视作章，也按相同
% 方式排版。
%^^A! If choosing \opt{twoside}, chapters will begin at the odd pages
%^^A! (right hand). However, they will begin at arbitrary pages
%^^A! available when choosing \opt{oneside}. Table of contents,
%^^A! abstract and the list of symbols are considered as chapters and
%^^A! processed in the same way.
%^^A!
%
% 双面模式下，正文部分偶数页（在左）的左页眉显示章标题，奇数页
% （在右）的右页眉显示节标题；前置部分的页眉按同样格式显示，但文字
% 均为对应标题（如“目录”、“摘要”等）。
% 而在单面模式下，正文部分则页面不分奇偶，均同时显示左、右页眉，
% 文字分别为章标题和节标题；前置部分只有中间页眉，显示对应标题。
%^^A! At two-sided mode, left headers on the even pages (left hand)
%^^A! in \emph{main body} will show the title of chapters, while the
%^^A! right headers on the odd pages (right hand) will show the
%^^A! title of sections. Headers in \emph{front matter} have the
%^^A! same style, but they will only show the title as ``Contents'',
%^^A! ``Abstract'', etc.
%^^A!
%^^A! At one-sided mode, both left and right headers on \emph{all}
%^^A! pages in main body will be shown. The text is the title of
%^^A! chapters and sections, respectively. In front matter, there
%^^A! are only middle headers, which show the corresponding titles.
%^^A!
%
% \begin{function}{draft}
%   \begin{fdusyntax}[emph={[1]draft}]
%     draft = (*<\TFF>*)
%   \end{fdusyntax}
%   选择是否开启草稿模式，默认关闭。
% \end{function}
%^^A! \begin{function}{draft}
%^^A!   \begin{fdusyntax}[emph={[1]draft}]
%^^A!     draft = (*<\TFF>*)
%^^A!   \end{fdusyntax}
%^^A!   Enable draft mode. Default off.
%^^A! \end{function}
%^^A!
%
% 草稿模式为全局选项，会影响到很多宏包的工作方式。
% 开启之后，主要的变化有：
% \begin{itemize}
%   \item 把行溢出的盒子显示为黑色方块；
%   \item 不实际插入图片，只输出一个占位方框；
%   \item 关闭超链接渲染，也不再生成 PDF 书签；
%   \item 显示页面边框。
% \end{itemize}
%^^A! \opt{draft} is a global option and will affect many packages.
%^^A! You may notice the following changes when using \opt{draft}:
%^^A! \begin{itemize}
%^^A!   \item Lines with overfull \tn{hbox}'s will be marked with
%^^A!     a thick black square on the right margin.
%^^A!   \item Will not include graphics files actually, but instead
%^^A!     print a box of the size the graphic would take up, as well
%^^A!     as the file name.
%^^A!   \item Will not make hyperlinks and PDF bookmarks.
%^^A!   \item Show the page frames.
%^^A! \end{itemize}
%^^A!
%
% \begin{function}[added=2018-01-31]{config}
%   \begin{fdusyntax}[emph={[1]config}]
%     config = (*\marg{文件}*)
%   \end{fdusyntax}
%   用户配置文件的文件名。默认为空，即不载入用户配置文件。
% \end{function}
%^^A! \begin{function}[added=2018-01-31]{config}
%^^A!   \begin{fdusyntax}[emph={[1]config}]
%^^A!     config = (*\marg{file}*)
%^^A!   \end{fdusyntax}
%^^A!   File name of user profile. Default value is empty, so no
%^^A!   profile is loaded automatically.
%^^A! \end{function}
%^^A!
%
% \subsection{参数设置}
%^^A! \subsection{More options}
%^^A!
%
% \begin{function}{\fdusetup}
%   \begin{fdusyntax}[morekeywords={\fdusetup}]
%     \fdusetup(*\marg{键值列表}*)
%   \end{fdusyntax}
%   本模板提供了一系列选项，可由您自行配置。载入文档类之后，以下
%   所有选项均可通过统一的命令 \cs{fdusetup} 来设置。
% \end{function}
%^^A! \begin{function}{\fdusetup}
%^^A!   \begin{fdusyntax}[morekeywords={\fdusetup}]
%^^A!     \fdusetup(*\marg{key-value list}*)
%^^A!   \end{fdusyntax}
%^^A!   \cls{fduthesis} has provided a number of options, which
%^^A!   can be given via the general command \cs{fdusetup}.
%^^A! \end{function}
%^^A!
%
% \cs{fdusetup} 的参数是一组由（英文）逗号隔开的选项列表，列表中的
% 选项通常是 \kvopt{\meta{key}}{\meta{value}} 的形式。部分选项的
% \meta{value} 可以省略。对于同一项，后面的设置将会覆盖前面的设置。
% 在下文的说明中，将用\textbf{粗体}表示默认值。
%^^A! The argument of \cs{fdusetup} is a set of comma-separated option list.
%^^A! The options usually have the form of \kvopt{\meta{key}}{\meta{value}}
%^^A! and in some cases \meta{value} can be omitted.
%^^A! For the same option, the values given later will override the
%^^A! the previous ones. Default values are indicated in
%^^A! \textbf{boldface} in the following descriptions.
%^^A!
%
% \cs{fdusetup} 采用 \LaTeX3 风格的键值设置，支持不同类型以及多种
% 层次的选项设定。键值列表中，“|=|”左右的空格不影响设置；但需注意，
% 参数列表中不可以出现空行。
%^^A! \cs{fdusetup} follows \LaTeX3 key-value style, and different
%^^A! types as well as various levels options are supported. In the
%^^A! key-value list, spaces around ``|=|'' will be trimmed; however,
%^^A! blank lines should never appear in the argument.
%^^A!
%
% 与模板选项相同，布尔型的参数可以省略 \kvopt{\meta{选项}}{true}
% 中的“\kvopt{}{true}”。
%^^A! Similar with template options, ``\kvopt{\meta{option}}{true}''
%^^A! can be abbreviated to \opt{\meta{option}} for boolean type.
%^^A!
%
% 另有一些选项包含子选项，如 \opt{style} 和 \opt{info} 等。它们可以
% 按如下两种等价方式来设定：
%^^A! Some options, such as \opt{style} and \opt{info}, may have
%^^A! sub-options. They can be set by the following two equivalent
%^^A! methods:
%^^A+
% \begin{latexexample}[morekeywords={\fdusetup},
%     emph={[1]style,cjk-font,font-size,info,title,title*,author,author*,department}]
%   \fdusetup{
%     style = {cjk-font = adobe, font-size = -4},
%     info  = {
%       title      = {论动体的电动力学},
%       title*     = {On the Electrodynamics of Moving Bodies},
%       author     = {阿尔伯特·爱因斯坦},
%       author*    = {Albert Einstein},
%       department = {物理学系}
%     }
%   }
% \end{latexexample}
%^^A-
% 或者
%^^A! or
%^^A+
% \begin{latexexample}[morekeywords={\fdusetup},
%     emph={[1]style,cjk-font,font-size,info,title,title*,author,author*,department}]
%   \fdusetup{
%     style/cjk-font  = adobe,
%     style/font-size = -4,
%     info/title      = {论动体的电动力学},
%     info/title*     = {On the Electrodynamics of Moving Bodies},
%     info/author     = {阿尔伯特·爱因斯坦},
%     info/author*    = {Albert Einstein},
%     info/department = {物理学系}
%   }
% \end{latexexample}
%^^A-
%^^A!
%
% 注意 “|/|” 的前后均不可以出现空白字符。
%^^A! Note that you may \emph{not} put spaces around ``|/|''.
%^^A!
%
% \subsubsection{论文格式} \label{subsubsec:论文格式}
%^^A! \subsubsection{Style and format} \label{subsubsec:style-and-format}
%^^A!
%
% \begin{function}{style}
%   \begin{fdusyntax}[emph={[1]style}]
%     style = (*\marg{键值列表}*)
%     style/(*\meta{key}*) = (*\meta{value}*)
%   \end{fdusyntax}
%   该选项包含许多子项目，用于设置论文格式。具体内容见下。
% \end{function}
%^^A! \begin{function}{style}
%^^A!   \begin{fdusyntax}[emph={[1]style}]
%^^A!     style = (*\marg{key-value list}*)
%^^A!     style/(*\meta{key}*) = (*\meta{value}*)
%^^A!   \end{fdusyntax}
%^^A!   This general option is for setting the thesis style and format.
%^^A!   See the following details.
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{function}[updated=2019-03-05]{style/font}
%   \begin{fdusyntax}[emph={[1]font}]
%     font = (*<garamond|libertinus|lm|palatino|(times)|times*|none>*)
%   \end{fdusyntax}
%^^A-
%   设置西文字体（包括数学字体）。具体配置见表~\ref{tab:font}。
% \end{function}
%^^A!   Set fonts (including math fonts). The details can be found in table~\ref{tab:font}.
%^^A! \end{function}
%^^A!
%
% \begin{table}[ht]
% \centering
% \begin{threeparttable}
%   \caption{西文字体配置}
%   \label{tab:font}
%   \small
%   \begin{tabular}{ccccc}
%     \toprule
%       & \textbf{正文字体} & \textbf{无衬线字体} & \textbf{等宽字体} & \textbf{数学字体} \\
%     \midrule
%       |garamond|        & EB Garamond         & Libertinus Sans & LM Mono\tnote{a} & Garamond Math   \\
%       |libertinus|      & Libertinus Serif    & Libertinus Sans & LM Mono          & Libertinus Math \\
%       |lm|              & LM Roman            & LM Sans         & LM Mono          & LM Math         \\
%       |palatino|        & TG Pagella\tnote{b} & Libertinus Sans & LM Mono          & TG Pagella Math \\
%       |times|           & XITS                & TG Heros        & TG Cursor        & XITS Math       \\
%       |times*|\tnote{c} & Times New Roman     & Arial           & Courier New      & XITS Math       \\
%     \bottomrule
%   \end{tabular}
%   \begin{tablenotes}
%     \item[a] “LM”是 Latin Modern 的缩写。
%     \item[b] “TG”是 TeX Gyre 的缩写。
%     \item[c] 本行中，Times New Roman、Arial 和 Courier New 是商业字体，
%       不包含在 \TeXLive{} 发行版中，但在 Windows 和 macOS 系统上均默认安装。
%   \end{tablenotes}
% \end{threeparttable}
% \end{table}
%^^A! \begin{table}[ht]
%^^A! \begin{threeparttable}
%^^A!   \caption{Font configuration}
%^^A!   \label{tab:font}
%^^A!   \centering
%^^A!   \begin{tabular}{ccccc}
%^^A!     \toprule
%^^A!       & \textbf{Roman} & \textbf{Sans-serif} & \textbf{Monospaced} & \textbf{Math} \\
%^^A!     \midrule
%^^A!       |garamond|        & EB Garamond         & Libertinus Sans & LM Mono\tnote{a} & Garamond Math   \\
%^^A!       |libertinus|      & Libertinus Serif    & Libertinus Sans & LM Mono          & Libertinus Math \\
%^^A!       |lm|              & LM Roman            & LM Sans         & LM Mono          & LM Math         \\
%^^A!       |palatino|        & TG Pagella\tnote{b} & Libertinus Sans & LM Mono          & TG Pagella Math \\
%^^A!       |times|           & XITS                & TG Heros        & TG Cursor        & XITS Math       \\
%^^A!       |times*|\tnote{c} & Times New Roman     & Arial           & Courier New      & XITS Math       \\
%^^A!     \bottomrule
%^^A!   \end{tabular}
%^^A!   \begin{tablenotes}
%^^A!     \item[a] ``LM'' is the abbreviation of Latin Modern.
%^^A!     \item[b] ``TG'' is the abbreviation of TeX Gyre.
%^^A!     \item[c] Here, Times New Roman, Arial and Courier New are commercial fonts. They are
%^^A!       installed on Windows and macOS by default.
%^^A!   \end{tablenotes}
%^^A! \end{threeparttable}
%^^A! \end{table}
%
%^^A+
% \begin{function}[rEXP,updated=2019-03-05]{style/cjk-font}
%   \begin{fdusyntax}[emph={[1]cjk-font}]
%     cjk-font = (*<adobe|(fandol)|founder|mac|sinotype|sourcehan|windows|none>*)
%   \end{fdusyntax}
%^^A-
%   设置中文字体。具体配置见表~\ref{tab:cjk-font}。
% \end{function}
%^^A!   Set CJK (Chinese, Japanese and Korean) fonts. The details can be found in
%^^A!   table~\ref{tab:cjk-font}.
%^^A! \end{function}
%^^A!
%
% \begin{table}[ht]
%   \caption{中文字体配置}
%   \label{tab:cjk-font}
%   \centering
%   \small
%   \begin{tabular}{ccccc}
%     \toprule
%       & \textbf{正文字体（宋体）} & \textbf{无衬线字体（黑体）} & \textbf{等宽字体（仿宋）} & \textbf{楷体} \\
%     \midrule
%       |adobe|     & Adobe 宋体      & Adobe  黑体     & Adobe  仿宋  & Adobe 楷体      \\
%       |fandol|    & Fandol 宋体     & Fandol 黑体     & Fandol 仿宋  & Fandol 楷体     \\
%       |founder|   & 方正书宋        & 方正黑体        & 方正仿宋     & 方正楷体        \\
%       |mac|       & （华文）宋体-简 & （华文）黑体-简 & 华文仿宋     & （华文）楷体-简 \\
%       |sinotype|  & 华文宋体        & 华文黑体        & 华文仿宋     & 华文楷体        \\
%       |sourcehan| & 思源宋体        & 思源黑体        & ---          & ---             \\
%       |windows|   & （中易）宋体    & （中易）黑体    & （中易）仿宋 & （中易）楷体    \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%^^A! \begin{table}[ht]
%^^A!   \caption{CJK font configuration}
%^^A!   \label{tab:cjk-font}
%^^A!   \centering
%^^A!   \begin{tabular}{cccc}
%^^A!     \toprule
%^^A!       & \textbf{Roman (song)} & \textbf{Sans-serif (hei)} & \textbf{Monospaced (fang)} \\
%^^A!     \midrule
%^^A!       |adobe|     & Adobe Song Std      & Adobe Heiti Std    & Adobe Fangsong Std \\
%^^A!       |fandol|    & FandolSong          & FandolHei          & FandolFang         \\
%^^A!       |founder|   & FZShuSong-Z01       & FZHei-B01          & FZFangSong-Z02     \\
%^^A!       |mac|       & Songti SC           & Heiti SC           & STFangsong         \\
%^^A!       |sinotype|  & STSong              & STHeiti            & STFangsong         \\
%^^A!       |sourcehan| & Source Han Serif SC & Source Han Sans SC & ---                \\
%^^A!       |windows|   & SimSun              & SimHei             & FangSong           \\
%^^A!     \bottomrule
%^^A!   \end{tabular}
%^^A! \end{table}
%^^A!
%
% 启用 \kvopt{font}{none} 或 \kvopt{cjk-font}{none} 之后，模板将关闭
% 默认西文 / 中文字体设置。此时，您需要自行使用 \cs{setmainfont}、
% \cs{setCJKmainfont}、\cs{setmathfont} 等命令来配置字体。
%^^A! When you choose \kvopt{font}{none} or \kvopt{cjk-font}{none},
%^^A! \cls{fduthesis} will disable the default western/CJK font
%^^A! settings. You may use \cs{setmainfont}, \cs{setCJKmainfont}
%^^A! and \cs{set\-math\-font}, etc.\ to configure the fonts manually.
%^^A!
%
%^^A+
% \begin{function}{style/font-size}
%   \begin{fdusyntax}[emph={[1]font-size}]
%     font-size = (*<(-4)|5>*)
%   \end{fdusyntax}
%^^A-
%   设置论文的基础字号。
% \end{function}
%^^A!   Specify the basic font size in your thesis.
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{function}[rEXP,updated=2017-10-14]{style/fullwidth-stop}
%   \begin{fdusyntax}[emph={[1]fullwidth-stop}]
%     fullwidth-stop = (*<catcode|mapping|(false)>*)
%   \end{fdusyntax}
%^^A-
%   选择是否把全角实心句点\FSFW 作为默认的句号形状。
%   这种句号一般用于科技类文章，以避免与下标“$_o$”或“$_0$”混淆。
% \end{function}
%^^A!   Let full-width full stop ``\FSFW'' as the default full stop.
%^^A!   Generally, this punctuation is used for scientific articles,
%^^A!   where ``\FSID'' is easily to be confused with subscript
%^^A!   ``$_o$'' or ``$_0$''.
%^^A! \end{function}
%^^A!
%
% 选择 \kvopt{fullwidth-stop}{catcode} 或 \opt{mapping} 后，都会实现上述效果。
% 有所不同的是，在选择 \opt{catcode} 后，只有\emph{显式的}\FSID 会被替换
% 为\FSFW；但在选择 \opt{mapping} 后，\emph{所有的}\FSID 都会被替换。例如，
% 如果您用宏保存了一些含有\FSID 的文字，那么在选择 \opt{catcode} 时，其中
% 的\FSID 不会将被替换为\FSFW。
%^^A! If you choose \kvopt{fullwidth-stop}{catcode}, only
%^^A! \emph{explicit} ``\FSID'' will be replaced by ``\FSFW''; when
%^^A! choosing \kvopt{fullwidth-stop}{mapping}, however, \emph{all}
%^^A! the ``\FSID'' will be replaced.
%^^A!
%
% 选项 \kvopt{fullwidth-stop}{mapping} 只在 \XeTeX{} 下有效。使用
% \LuaTeX{} 编译时，该选项相当于 \kvopt{fullwidth-stop}{catcode}。
%^^A! \opt{mapping} is valid only under \XeTeX{}. When compiling
%^^A! with \LuaTeX{}, it is equivalent to \opt{catcode}.
%^^A!
%
% 如果您在选择 \kvopt{fullwidth-stop}{mapping} 后仍需要临时显示\FSID，
% 可以按如下方法操作：
% \begin{latexexample}[moretexcs={\CJKfontspec},emph={[1]Mapping}]
%   % 请使用 XeTeX 编译
%   % 外侧的花括号表示分组
%   这是一个句号{\CJKfontspec{(*\meta{字体名}*)}[Mapping=full-stop]。}
% \end{latexexample}
%^^A! If you want to display ``\FSID'' temporarily after setting
%^^A! \kvopt{fullwidth-stop}{mapping}, the following code snippet
%^^A! will be helpful:
%^^A! \begin{latexexample}[moretexcs={\CJKfontspec},emph={[1]Mapping}]
%^^A!   % Compiled with XeTeX
%^^A!   % The outside braces is used for group
%^^A!   这是一个句号{\CJKfontspec{(*\meta{font name}*)}[Mapping=full-stop]。}
%^^A! \end{latexexample}
%^^A!
%
% \begin{function}{style/footnote-style}
%^^A 这里奇怪的东西是用来控制对齐的。fdusyntax 会吃掉开头的几个
%^^A 空格，因此这里用 . 来占位。
%   \begin{fdusyntax}[emph={[1]footnote-style}]
%     footnote-style = (*<plain|\\
%       ......\mbox{}~~~~~~~~~~~~~~~~~libertinus|libertinus*|libertinus-sans|\\
%       ......\mbox{}~~~~~~~~~~~~~~~~~pifont|pifont*|pifont-sans|pifont-sans*|\\
%       ......\mbox{}~~~~~~~~~~~~~~~~~xits|xits-sans|xits-sans*>*)
%   \end{fdusyntax}
%   设置脚注编号样式。西文字体设置会影响其默认取值（见
%   表~\ref{tab:footnote-font}）。因此，要使得该选项生效，需将其
%   放置在 \opt{font} 选项之后。带有 |sans| 的为相应的无衬线字体
%   版本；带有 |*| 的为阴文样式（即黑底白字）。
% \end{function}
%^^A! \begin{function}{style/footnote-style}
%^^A!   \begin{fdusyntax}[emph={[1]footnote-style}]
%^^A!     footnote-style = (*<plain|\\
%^^A!       ....\mbox{}~~~~~~~~~~~~~~~~~libertinus|libertinus*|libertinus-sans|\\
%^^A!       ....\mbox{}~~~~~~~~~~~~~~~~~pifont|pifont*|pifont-sans|pifont-sans*|\\
%^^A!       ....\mbox{}~~~~~~~~~~~~~~~~~xits|xits-sans|xits-sans*>*)
%^^A!   \end{fdusyntax}
%^^A!   Set the style of footnote numbers. Note that western fonts
%^^A!   will affect its default value (see table~\ref{tab:footnote-font}),
%^^A!   so you may put it after |font| option. The one with |sans|
%^^A!   is for the corresponding sans-serif version, while |*|
%^^A!   for white on black version.
%^^A! \end{function}
%^^A!
%
% \begin{table}[ht]
%   \caption{西文字体与脚注编号样式默认值的对应关系}
%   \label{tab:footnote-font}
%   \centering
%   \small
%   \begin{tabular}{ccccc}
%     \toprule
%       \textbf{西文字体设置} &
%         |libertinus| & |lm|     & |palatino| & |times| \\
%     \midrule
%       \textbf{脚注编号样式默认值} &
%         |libertinus| & |pifont| & |pifont|   & |xits|  \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%^^A! \begin{table}[ht]
%^^A!   \caption{Relationship between option \opt{font} and the
%^^A!     default value of \opt{footnote-style}}
%^^A!   \label{tab:footnote-font}
%^^A!   \centering
%^^A!   \begin{tabular}{ccccc}
%^^A!     \toprule
%^^A!       \textbf{Western fonts settings} &
%^^A!         |libertinus| & |lm|     & |palatino| & |times| \\
%^^A!     \midrule
%^^A!       \textbf{Default value of footnote number style} &
%^^A!         |libertinus| & |pifont| & |pifont|   & |xits|  \\
%^^A!     \bottomrule
%^^A!   \end{tabular}
%^^A! \end{table}
%^^A!
%
%^^A+
% \begin{function}[added=2017-08-13]{style/hyperlink}
%   \begin{fdusyntax}[emph={[1]hyperlink}]
%     hyperlink = (*<border|(color)|none>*)
%   \end{fdusyntax}
%^^A-
%   设置超链接样式。\opt{border} 表示在超链接四周绘制方框；
%   \opt{color} 表示用彩色显示超链接；\opt{none} 表示没有特殊装饰，
%   可用于生成最终的打印版文稿。
% \end{function}
%^^A!   Set the style of hyperlinks. \opt{border} draws borders around
%^^A!   hyperlinks; \opt{color} displays hyperlinks in colorful text;
%^^A!   \opt{none} leads to plain text, which is useful when printing
%^^A!   the final document.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2017-08-13,updated=2021-12-27]{style/hyperlink-color}
%   \begin{fdusyntax}[emph={[1]hyperlink-color}]
%     hyperlink-color = (*<(default)|classic|material|graylevel|prl>*)
%   \end{fdusyntax}
%   设置超链接颜色。该选项在 \kvopt{hyperlink}{none} 时无效。
%   各选项所代表的颜色见表~\ref{tab:hyperlink-color}。
% \end{function}
%^^A! \begin{function}[added=2017-08-13,updated=2021-12-27]{style/hyperlink-color}
%^^A!   \begin{fdusyntax}[emph={[1]hyperlink-color}]
%^^A!     hyperlink-color = (*<(default)|classic|material|graylevel|prl>*)
%^^A!   \end{fdusyntax}
%^^A!   Set the color of hyperlinks. It is invalid if
%^^A!   \kvopt{hyperlink}{none}. The related colors can be found
%^^A!   in table~\ref{tab:hyperlink-color}.
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{table}[ht]
% \centering
% \small
%^^A-
% \newcommand\linkcolorexam[3]{^^A
%   {\small 图~\textcolor[HTML]{#1}{1-2}，
%     (\textcolor[HTML]{#1}{3.4})~式} &
%   {\small \textcolor[HTML]{#2}{\texttt{https://g.cn}}} &
%   {\small 文献~[\textcolor[HTML]{#3}{1}]，
%     (\textcolor[HTML]{#3}{Knuth~1986})}}
%^^A! \newcommand\linkcolorexam[3]{%
%^^A!   {\small Fig.~\textcolor[HTML]{#1}{1-2}，
%^^A!     Eq.~(\textcolor[HTML]{#1}{3.4})} &
%^^A!   {\small \textcolor[HTML]{#2}{\texttt{http://g.cn}}} &
%^^A!   {\small Ref.~[\textcolor[HTML]{#3}{1}]，
%^^A!     (\textcolor[HTML]{#3}{Knuth~1986})}}
% \begin{threeparttable}
% \caption{预定义的超链接颜色方案}
% \label{tab:hyperlink-color}
%^^A! \begin{threeparttable}
%^^A! \caption{Pre-defined hyperlink color schemes}
%^^A! \label{tab:hyperlink-color}
% \begin{tabular}{c*{3}{>{\hspace{0.2cm}}c<{\hspace{0.2cm}}}}
%   \toprule
%     \textbf{选项} & \textbf{链接} & \textbf{URL} & \textbf{引用} \\
%^^A! \begin{tabular}{c*{3}{>{\hspace{0.2cm}}c<{\hspace{0.2cm}}}}
%^^A!   \toprule
%^^A!     \textbf{Options} & \textbf{Cross references} & \textbf{URL} & \textbf{Citation} \\
%^^A+
%   \midrule
%     \opt{default}            & \linkcolorexam{990000}{0000B2}{007F00} \\
%     \opt{classic}            & \linkcolorexam{FF0000}{0000FF}{00FF00} \\
%     \opt{material}\tnote{a}  & \linkcolorexam{E91E63}{009688}{4CAF50} \\
%     \opt{graylevel}\tnote{a} & \linkcolorexam{616161}{616161}{616161} \\
%     \opt{prl}\tnote{b}       & \linkcolorexam{2D3092}{2D3092}{2D3092} \\
%   \bottomrule
% \end{tabular}
% \begin{tablenotes}
%^^A-
%   \item[a] 取自 Material 色彩方案
%     （见 \url{https://material.io/guidelines/style/color.html}）。
%   \item[b] \textit{Physical Review Letter} 杂志配色。
%^^A!   \item[a] Material Design color palette
%^^A!     (See \url{https://material.io/guidelines/style/color.html}).
%^^A!   \item[b] \textit{Physical Review Letter} magazine.
%^^A+
% \end{tablenotes}
% \end{threeparttable}
% \end{table}
%^^A-
%^^A!
%
%^^A+
% \begin{function}[added=2018-01-25,updated=2023-05-11]{style/bib-backend}
%   \begin{fdusyntax}[emph={[1]bib-backend}]
%     bib-backend = (*<bibtex|biblatex>*)
%   \end{fdusyntax}
%^^A-
%   选择参考文献的支持方式。选择 \opt{bibtex} 后，将使用 \BibTeX{}
%   处理文献，样式由 \pkg{natbib} 宏包负责；选择 \opt{biblatex} 后，
%   将使用 \biber{} 处理文献，样式则由 \pkg{biblatex} 宏包负责。
%   如果没有指定该选项，则不再处理引用和参考文献。
% \end{function}
%^^A!   Specify the backend or driver of bibliography processing.
%^^A!   \BibTeX{} and \pkg{natbib} package will be used if you choose
%^^A!   \opt{bibtex}, while \biber{} and \pkg{biblatex} will be used
%^^A!   if you choose \opt{biblatex}. If not specified, the citations
%^^A!   and references will not be processed.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2017-10-28,updated=2018-01-25]{style/bib-style}
%   \begin{fdusyntax}[emph={[1]bib-style}]
%     bib-style = (*<author-year|(numerical)|\meta{其他样式}>*)
%   \end{fdusyntax}
%   设置参考文献样式。\opt{author-year} 和 \opt{numerical} 分别对应
%   国家标准 GB/T 7714--2015 \cite{gb-t-7714-2015} 中的著者—出版年制和
%   顺序编码制。选择 \meta{其他样式} 时，如果 \kvopt{bib-backend}{bibtex}，
%   需保证相应的 \file{.bst} 格式文件能被调用；而如果
%   \kvopt{bib-backend}{biblatex}，则需保证相应的 \file{.bbx} 格式文件
%   能被调用。
% \end{function}
%^^A! \begin{function}[added=2017-10-28,updated=2018-01-25]{style/bib-style}
%^^A!   \begin{fdusyntax}[emph={[1]bib-style}]
%^^A!     bib-style = (*<author-year|(numerical)|\meta{other style}>*)
%^^A!   \end{fdusyntax}
%^^A!   Set the style of bibliography. \opt{author-year} and
%^^A!   \opt{numerical} will follow the standard GB/T 7714--2015.
%^^A!   By setting \kvopt{bib-style}{\meta{other style}}, you can use
%^^A!   other bibliography style (\file{.bst} file for
%^^A!   \kvopt{bib-backend}{bibtex} and \file{.bbx} file for
%^^A!   \kvopt{bib-backend}{biblatex}). Suffix is not needed.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2018-01-25]{style/cite-style}
%   \begin{fdusyntax}[emph={[1]cite-style}]
%     cite-style = (*\marg{引用样式}*)
%   \end{fdusyntax}
%   选择引用格式。默认为空，即与参考文献样式（著者—出版年制或顺序
%   编码制）保持一致。如果手动填写，需保证相应的 \file{.cbx} 格式文件
%   能被调用。该选项在 \kvopt{bib-backend}{bibtex} 时无效。
% \end{function}
%^^A! \begin{function}[added=2018-01-25]{style/cite-style}
%^^A!   \begin{fdusyntax}[emph={[1]cite-style}]
%^^A!     cite-style = (*\marg{style}*)
%^^A!   \end{fdusyntax}
%^^A!   Select citation style. Default value is empty, which means
%^^A!   the citation style will follow your bibliography style
%^^A!   (author-year or numeric). If you want change the citation
%^^A!   style, the corresponding \file{.cbx} file must be available.
%^^A!   This option is invalid when \kvopt{bib-backend}{bibtex}.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2018-01-25]{style/bib-resource}
%   \begin{fdusyntax}[emph={[1]bib-resource}]
%     bib-resource = (*\marg{文件}*)
%   \end{fdusyntax}
%   参考文献数据源。可以是单个文件，也可以是用英文逗号隔开的一组文件。
%   如果 \kvopt{bib-backend}{biblatex}，则必须明确给出 \file{.bib}
%   后缀名。
% \end{function}
%^^A! \begin{function}[added=2018-01-25]{style/bib-resource}
%^^A!   \begin{fdusyntax}[emph={[1]bib-resource}]
%^^A!     bib-resource = (*\marg{bib file\symbol{"28}s\symbol{"29}}*)
%^^A!   \end{fdusyntax}
%^^A!   Specify the bibliography database (usually in \file{.bib}
%^^A!   format). If using more than one files, the file names should
%^^A!   be separated with comma. When \kvopt{bib-backend}{biblatex},
%^^A!   you must type in the ``\file{.bib}'' suffix.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2017-08-10]{style/logo}
%   \begin{fdusyntax}[emph={[1]logo}]
%     logo = (*\marg{文件}*)
%   \end{fdusyntax}
%   封面中校名图片的文件名。默认值为 \file{fudan-name.pdf}。
% \end{function}
%^^A! \begin{function}[added=2017-08-10]{style/logo}
%^^A!   \begin{fdusyntax}[emph={[1]logo}]
%^^A!     logo = (*\marg{file}*)
%^^A!   \end{fdusyntax}
%^^A!   File name of the logo in thesis cover. Default value is
%^^A!   \file{fudan-name.pdf}.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2017-08-10]{style/logo-size}
%   \begin{fdusyntax}[emph={[1]logo-size}]
%     logo-size = (*\marg{宽度}*)
%     logo-size = {(*\meta{宽度}*), (*\meta{高度}*)}
%   \end{fdusyntax}
%   校名图片的大小。默认仅指定了宽度，为 |0.5\textwidth|\/。
%   如果仅需指定高度，可在 \meta{宽度} 处填入一个空的分组 |{}|。
% \end{function}
%^^A! \begin{function}[added=2017-08-10]{style/logo-size}
%^^A!   \begin{fdusyntax}[emph={[1]logo-size}]
%^^A!     logo-size = (*\marg{width}*)
%^^A!     logo-size = {(*\meta{width}*), (*\meta{height}*)}
%^^A!   \end{fdusyntax}
%^^A!   Size of the logo. By default, only width is set to
%^^A!   |0.5\textwidth|. To set height only, you can put an
%^^A!   empty group ``|{}|'' at \meta{width}.
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{function}[added=2017-07-06]{style/auto-make-cover}
%   \begin{fdusyntax}[emph={[1]auto-make-cover}]
%     auto-make-cover = (*<\TTF>*)
%   \end{fdusyntax}
%^^A-
%   是否自动生成论文封面（封一）、指导小组成员名单（封二）和
%   声明页（封三）。封面中的各项信息，可通过 \cs{fdusetup} 录入，
%   具体请参阅 \ref{subsubsec:信息录入}~节。
% \end{function}
%^^A!   Whether generate thesis cover, list of instructors (inside
%^^A!   front cover) and declaration page (inside back cover)
%^^A!   automatically. Entries in the cover can be specified also
%^^A!   via \cs{fdusetup}, and you can find more details in
%^^A!   subsubsection~\ref{subsubsec:information}.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2021-09-21]{style/declaration-page}
%   \begin{fdusyntax}[emph={[1]declaration-page}]
%     declaration-page = (*\marg{文件}*)
%   \end{fdusyntax}
%   插入扫描版的声明页 PDF 文档。如果为空（默认），则使用模板预定义的声明页。
% \end{function}
%^^A! \begin{function}[added=2021-09-21]{style/declaration-page}
%^^A!   \begin{fdusyntax}[emph={[1]declaration-page}]
%^^A!     declaration-page = (*\marg{file}*)
%^^A!   \end{fdusyntax}
%^^A!   Insert the scanned declaration page PDF file. If empty (default),
%^^A!   then the pre-defined declaration page will be inserted.
%^^A! \end{function}
%^^A!
%
% \begin{function}{\makecoveri,\makecoverii,\makecoveriii}
%   用于手动生成论文封面、指导小组成员名单和声明页。这几个命令不能
%   确保页码的正确编排，因此除非必要，您应当始终使用自动生成的封面。
% \end{function}
%^^A! \begin{function}{\makecoveri,\makecoverii,\makecoveriii}
%^^A!   For generating thesis cover, list of instructors and
%^^A!   declaration page manually. These commands cannot guarantee
%^^A!   the correct page numbers, hence you should always use the
%^^A!   auto-generated thesis cover unless necessary.
%^^A! \end{function}
%^^A!
%
% \subsubsection{信息录入} \label{subsubsec:信息录入}
%^^A! \subsubsection{Personal information} \label{subsubsec:information}
%^^A!
%
% \begin{function}{info}
%   \begin{fdusyntax}[emph={[1]info}]
%     info = (*\marg{键值列表}*)
%     info/(*\meta{key}*) = (*\meta{value}*)
%   \end{fdusyntax}
%   该选项包含许多子项目，用于录入论文信息。具体内容见下。以下带“|*|”
%   的项目表示对应的英文字段。
% \end{function}
%^^A! \begin{function}{info}
%^^A!   \begin{fdusyntax}[emph={[1]info}]
%^^A!     info = (*\marg{key-value list}*)
%^^A!     info/(*\meta{key}*) = (*\meta{value}*)
%^^A!   \end{fdusyntax}
%^^A!   This general option is for entering your personal information.
%^^A!   See the following details. Note that options with ``|*|'' are
%^^A!   the corresponding English items.
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{function}[added=2018-02-01,updated=2019-03-12]{info/degree}
%   \begin{fdusyntax}[emph={[1]degree}]
%     degree = (*<(academic)|professional>*)
%   \end{fdusyntax}
%^^A-
%   学位类型，仅适用于博士和硕士学位论文。\opt{academic} 和 \opt{professional}
%   分别表示学术学位和专业学位。
% \end{function}
%^^A!   Degree type. This option can only be used in master degree
%^^A!   thesis.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/title,info/title*}
%   \begin{fdusyntax}[emph={[1]title,title*}]
%     title  = (*\marg{中文标题}*)
%     title* = (*\marg{英文标题}*)
%   \end{fdusyntax}
%   论文标题。默认会在约 20 个汉字字宽处强制断行，但为了语义的
%   连贯以及排版的美观，如果您的标题长于一行，建议使用“|\\|”
%   手动断行。
% \end{function}
%^^A! \begin{function}{info/title,info/title*}
%^^A!   \begin{fdusyntax}[emph={[1]title,title*}]
%^^A!     title  = (*\marg{title in Chinese}*)
%^^A!     title* = (*\marg{title in English}*)
%^^A!   \end{fdusyntax}
%^^A!   Title of your thesis. The line width is about \qty{30}{em} by
%^^A!   default, but you may break it with |\\| manually.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/author,info/author*}
%   \begin{fdusyntax}[emph={[1]author,author*}]
%     author  = (*\marg{姓名}*)
%     author* = (*\marg{英文姓名（或拼音）}*)
%   \end{fdusyntax}
%   作者姓名。
% \end{function}
%^^A! \begin{function}{info/author,info/author*}
%^^A!   \begin{fdusyntax}[emph={[1]author,author*}]
%^^A!     author  = (*\marg{name in Chinese}*)
%^^A!     author* = (*\marg{name in English \lparen or Pinyin\rparen}*)
%^^A!   \end{fdusyntax}
%^^A!   Author's name.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/supervisor}
%   \begin{fdusyntax}[emph={[1]supervisor}]
%     supervisor = (*\marg{姓名}*)
%   \end{fdusyntax}
%   导师姓名。
% \end{function}
%^^A! \begin{function}{info/supervisor}
%^^A!   \begin{fdusyntax}[emph={[1]supervisor}]
%^^A!     supervisor = (*\marg{name}*)
%^^A!   \end{fdusyntax}
%^^A!   Supervisor's name.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/department}
%   \begin{fdusyntax}[emph={[1]department}]
%     department = (*\marg{名称}*)
%   \end{fdusyntax}
%   院系名称。
% \end{function}
%^^A! \begin{function}{info/department}
%^^A!   \begin{fdusyntax}[emph={[1]department}]
%^^A!     department = (*\marg{name}*)
%^^A!   \end{fdusyntax}
%^^A!   Name of the department.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/major}
%   \begin{fdusyntax}[emph={[1]major}]
%     major = (*\marg{名称}*)
%   \end{fdusyntax}
%   专业名称。
% \end{function}
%^^A! \begin{function}{info/major}
%^^A!   \begin{fdusyntax}[emph={[1]major}]
%^^A!     major = (*\marg{name}*)
%^^A!   \end{fdusyntax}
%^^A!   Name of the major.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/student-id}
%   \begin{fdusyntax}[emph={[1]student-id}]
%     student-id = (*\marg{数字}*)
%   \end{fdusyntax}
%   作者学号。
% \end{function}
%^^A! \begin{function}{info/student-id}
%^^A!   \begin{fdusyntax}[emph={[1]student-id}]
%^^A!     student-id = (*\marg{number}*)
%^^A!   \end{fdusyntax}
%^^A!   Author's student ID.
%^^A! \end{function}
%^^A!
%
% 复旦大学学号共 11 位，前两位为入学年份，之后一位为学生类型
% 代码（博士生为 1，硕士生为 2，本科生为 3），接下来的五位为
% 专业代码，最后三位为顺序号。
%^^A! In Fudan University, student ID has 11 digits. The first two
%^^A! are the year of attendance; next one represents the student's
%^^A! type (1 for doctor, 2 for master and 3 for bachelor); the
%^^A! following five digits are major ID while the last three are
%^^A! serial number.
%^^A!
%
% \begin{function}{info/school-id}
%   \begin{fdusyntax}[emph={[1]school-id}]
%     school-id = (*\marg{数字}*)
%   \end{fdusyntax}
%   学校代码。默认值为 10246（这是复旦大学的学校代码）。
% \end{function}
%^^A! \begin{function}{info/school-id}
%^^A!   \begin{fdusyntax}[emph={[1]school-id}]
%^^A!     school-id = (*\marg{number}*)
%^^A!   \end{fdusyntax}
%^^A!   School ID. Default value is 10246 (school ID of Fudan University).
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/date}
%   \begin{fdusyntax}[emph={[1]date}]
%     date = (*\marg{日期}*)
%   \end{fdusyntax}
%   论文完成日期。默认值为文档编译日期（\tn{today}）。
% \end{function}
%^^A! \begin{function}{info/date}
%^^A!   \begin{fdusyntax}[emph={[1]date}]
%^^A!     date = (*\marg{date}*)
%^^A!   \end{fdusyntax}
%^^A!   Finish date of your thesis. Default value is the compilation
%^^A!   date (\tn{today}).
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{function}[added=2017-07-04]{info/secret-level}
%   \begin{fdusyntax}[emph={[1]secret-level}]
%     secret-level = (*<(none)|i|ii|iii>*)
%   \end{fdusyntax}
%^^A-
%   密级。\opt{i}、\opt{ii}、\opt{iii} 分别表示秘密、机密、绝密；
%   \opt{none} 表示论文不涉密，即不显示密级与保密年限。
% \end{function}
%^^A!   Secret level. \opt{i}, \opt{ii} and \opt{iii} means
%^^A!   ``秘密'' (secret), ``机密'' (confidential) and ``绝密''
%^^A!   (top secret) respectively. \opt{none} means your thesis is
%^^A!   not secret-related and secret level and year will not be
%^^A!   shown.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2017-07-04]{info/secret-year}
%   \begin{fdusyntax}[emph={[1]secret-year}]
%     secret-year = (*\marg{年限}*)
%   \end{fdusyntax}
%   保密年限。建议您使用中文，如“五年”。该选项在设置
%   \kvopt{secret-level}{none} 时无效。
% \end{function}
%^^A! \begin{function}[added=2017-07-04]{info/secret-year}
%^^A!   \begin{fdusyntax}[emph={[1]secret-year}]
%^^A!     secret-year = (*\marg{year}*)
%^^A!   \end{fdusyntax}
%^^A!   Secret year. It's recommended to use Chinese word as ``五年''
%^^A!   (5 years) here. This option is invalid if you have set
%^^A!   \kvopt{secret-level}{none}.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/instructors}
%   \begin{fdusyntax}[emph={[1]instructors}]
%     instructors = (*\marg{成员 1, 成员 2, ...}*)
%   \end{fdusyntax}
%   指导小组成员。各成员之间需使用英文逗号隔开。为防止歧义，
%   可以用分组括号“|{...}|”把各成员字段括起来。
% \end{function}
%^^A! \begin{function}{info/instructors}
%^^A!   \begin{fdusyntax}[emph={[1]instructors}]
%^^A!     instructors = (*\marg{member 1, member 2, ...}*)
%^^A!   \end{fdusyntax}
%^^A!   Instructors' name. Each name should be separated with
%^^A!   comma. To disambiguate, you may put text containing comma
%^^A!   into a group ``|{...}|''.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/keywords,info/keywords*}
%   \begin{fdusyntax}[emph={[1]keywords,keywords*}]
%     keywords  = (*\marg{中文关键词}*)
%     keywords* = (*\marg{英文关键词}*)
%   \end{fdusyntax}
%   关键词列表。各关键词之间需使用英文逗号隔开。为防止歧义，
%   可以用分组括号“|{...}|”把各字段括起来。
% \end{function}
%^^A! \begin{function}{info/keywords,info/keywords*}
%^^A!   \begin{fdusyntax}[emph={[1]keywords,keywords*}]
%^^A!     keywords  = (*\marg{keywords in Chinese}*)
%^^A!     keywords* = (*\marg{keywords in English}*)
%^^A!   \end{fdusyntax}
%^^A!   Keywords list. Each keyword should be separated with comma.
%^^A!   To disambiguate, you may put text containing comma into a
%^^A!   group ``|{...}|''.
%^^A! \end{function}
%^^A!
%
% \begin{function}{info/clc}
%   \begin{fdusyntax}[emph={[1]clc}]
%     clc = (*\marg{分类号}*)
%   \end{fdusyntax}
%   中图分类号（CLC）。
% \end{function}
%^^A! \begin{function}{info/clc}
%^^A!   \begin{fdusyntax}[emph={[1]clc}]
%^^A!     clc = (*\marg{classification codes}*)
%^^A!   \end{fdusyntax}
%^^A!   Chinese Library Classification (CLC).
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2021-09-16]{info/jel}
%   \begin{fdusyntax}[emph={[1]jel}]
%     jel = (*\marg{分类号}*)
%   \end{fdusyntax}
%   JEL 分类号，仅适用于部分院系。当被指定时，英文摘要中将仅显示 JEL
%   分类号，而不再显示中图分类号。
% \end{function}
%^^A! \begin{function}[added=2021-09-16]{info/jel}
%^^A!   \begin{fdusyntax}[emph={[1]jel}]
%^^A!     jel = (*\marg{classification codes}*)
%^^A!   \end{fdusyntax}
%^^A!   \textit{Journal of Economic Literature} (JEL) Classification
%^^A!   Code. It's only mandatory for some departments. When specified,
%^^A!   CLC code in the English abstract will be replaced by it.
%^^A! \end{function}
%^^A!
%
% \subsection{正文编写}
%^^A! \subsection{Writing your thesis}
%^^A!
%
% \begin{quotation}
%   喬孟符（吉）博學多能，以樂府稱。嘗云：「作樂府亦有法，
%   曰\CJKunderdot{鳳頭、豬肚、豹尾}六字是也。」大概起要美麗，中要浩蕩，
%   結要響亮。尤貴在首尾貫穿，意思清新。苟能若是，斯可以言樂府矣。
% \end{quotation}
% \hfill ^^^^2e3a陶宗儀《南村輟耕錄·作今樂府法》 ^^A ^^^^2e3a = 破折号
%
% \subsubsection{凤头}
%^^A! \subsubsection{Front matter}
%^^A!
%
% \begin{function}{\frontmatter}
%   声明前置部分开始。
% \end{function}
%^^A! \begin{function}{\frontmatter}
%^^A!   Declare the beginning of front matter.
%^^A! \end{function}
%^^A!
%
% 在本模板中，前置部分包含目录、中英文摘要以及符号表等。
% 前置部分的页码采用小写罗马字母，并且与正文分开计数。
%^^A! Front matter contains table of contents, abstracts and notation
%^^A! list. The page numbers in front matter will be shown in
%^^A! lowercase Roman numerals, and will be counted separately with
%^^A! main matter.
%^^A!
%
% \begin{function}{\tableofcontents,\listoffigures,\listoftables}
%   生成目录。为了生成完整、正确的目录，您至少需要编译\emph{两次}。对于图表
%   较多的论文，也可以使用 \cs{listoffigures} 和 \cs{listoftables} 生成单独的
%   插图、表格目录。
% \end{function}
%^^A! \begin{function}{\tableofcontents}
%^^A!   Generate the table of contents (TOC). You need to compile
%^^A!   the source file at least \emph{twice} to get the correct TOC.
%^^A!   If your thesis contains many figures or tables, you may also
%^^A!   use \cs{listoffigures} or \cs{listoftables} to generate a list
%^^A!   of them.
%^^A! \end{function}
%^^A!
%
%^^A TODO: \DescribeEnv{abstract}
%^^A TODO: \DescribeEnv{abstract*}
% \begin{function}{abstract}
%   \begin{fdusyntax}[emph={[2]abstract}]
%     % 中文论文模板 (fduthesis)      % 英文论文模板 (fduthesis-en)
%     \begin{abstract}                \begin{abstract}
%       (*\meta{中文摘要} \hspace{3.52cm} \meta{英文摘要}*)
%     \end{abstract}                  \end{abstract}
%   \end{fdusyntax}
% \end{function}
% \begin{function}[rEXP]{abstract*}
%   \begin{fdusyntax}[emph={[2]abstract*}]
%     % 中文论文模板 (fduthesis)
%     \begin{abstract*}
%       (*\meta{英文摘要}*)
%     \end{abstract*}
%   \end{fdusyntax}
%   摘要。中文模板中，不带星号和带星号的版本分别用来输入中文摘要
%   和英文摘要；英文模板中没有带星号的版本，您只需输入英文摘要。
% \end{function}
%^^A! \begin{function}{abstract}
%^^A!   \begin{fdusyntax}[emph={[2]abstract}]
%^^A!     % fduthesis (Chinese thesis)    % fduthesis-en (English thesis)
%^^A!     \begin{abstract}                \begin{abstract}
%^^A!       (*\meta{Chinese abstract} \hspace{3cm} \meta{English abstract}*)
%^^A!     \end{abstract}                  \end{abstract}
%^^A!   \end{fdusyntax}
%^^A! \end{function}
%^^A! \begin{function}[rEXP]{abstract*}
%^^A!   \begin{fdusyntax}[emph={[2]abstract*}]
%^^A!     % Only for fduthesis
%^^A!     \begin{abstract*}
%^^A!       (*\meta{English abstract}*)
%^^A!     \end{abstract*}
%^^A!   \end{fdusyntax}
%^^A!   Abstract environment. In \cls{fduthesis}, \env{abstract} and
%^^A!   \env{abstract*} are used for Chinese and English abstract,
%^^A!   respectively; while in \cls{fduthesis-en}, there is no
%^^A!   \env{abstract*} environment and you need to write the English
%^^A!   abstract merely.
%^^A! \end{function}
%^^A!
%
% 摘要的最后，会显示关键词列表以及中图分类号（CLC）或 JEL 分类号。这两项
% 可通过 \cs{fdusetup} 录入，具体请参阅 \ref{subsubsec:信息录入}~节。
%^^A! At the end of abstract (both Chinese and English, if available),
%^^A! keywords list and CLC or JEL code will be shown. They can be
%^^A! specified via command \cs{fdusetup} and you may refer to
%^^A! subsubsection~\ref{subsubsec:information} for more details.
%^^A!
%
%^^A TODO: \DescribeEnv{notation}
% \begin{function}{notation}
%   \begin{fdusyntax}[emph={[2]notation}]
%     \begin{notation}(*\oarg{列格式说明}*)
%       (*\meta{符号 1}*)  &  (*\meta{说明}*)  \\
%       (*\meta{符号 2}*)  &  (*\meta{说明}*)  \\
%       (*\phantom{\meta{符号 $n$}}*)  (*$\vdots$*)
%       (*\meta{符号\ \kern-0.1em$n$}*)  &  (*\meta{说明}*)
%     \end{notation}
%   \end{fdusyntax}
%   符号表。可选参数 \meta{列格式说明}与 \LaTeX{} 中标准表格的列格
%   式说明语法一致，默认值为“|lp{7.5cm}|”，即第一列宽度自动调整，
%   第二列限宽 \qty{7.5}{cm}，两列均为左对齐。
% \end{function}
%^^A! \begin{function}{notation}
%^^A!   \begin{fdusyntax}[emph={[2]notation}]
%^^A!     \begin{notation}(*\oarg{column format}*)
%^^A!       (*\meta{symbol 1}*)  &  (*\meta{description}*)  \\
%^^A!       (*\meta{symbol 2}*)  &  (*\meta{description}*)  \\
%^^A!       (*\phantom{\meta{symbol $n$}}*)  (*$\vdots$*)
%^^A!       (*\meta{symbol \kern-0.1em$n$}*)  &  (*\meta{description}*)
%^^A!     \end{notation}
%^^A!   \end{fdusyntax}
%^^A!   Notation list (or symbol list, nomenclature) environment.
%^^A!   The optional argument \meta{column format} is the same as
%^^A!   in a standard \LaTeX{} table. The default value is
%^^A!   ``|lp{7.5cm}|'', which means auto-width for the first column
%^^A!   and fix-width (\qty{7.5}{cm}) for the second; both columns will
%^^A!   be left-aligned.
%^^A! \end{function}
%^^A!
%
% \subsubsection{猪肚}
%^^A! \subsubsection{Main matter}
%^^A!
%
% \begin{function}{\mainmatter}
%   声明主体部分开始。
% \end{function}
%^^A! \begin{function}{\mainmatter}
%^^A!   Declare the beginning of main matter.
%^^A! \end{function}
%^^A!
%
% 主体部分是论文的核心，您可以分章节撰写。如有需求，也可以采用
% 多文件编译的方式。主体部分的页码采用阿拉伯数字。
%^^A! As the name suggests, ``main matter'' is the main body of your
%^^A! thesis. When working on a big projects, it's usually a good
%^^A! idea to split the source file into several parts. The page
%^^A! numbers in main matter are shown in arabic numerals.
%^^A!
%
% \begin{function}[updated=2018-01-15]{\footnote}
%   \begin{fdusyntax}[deletetexcs={\footnote},morekeywords={\footnote}]
%     \footnote(*\marg{脚注文字}*)
%   \end{fdusyntax}
%   插入脚注。脚注编号样式可利用 \opt{style/footnote-style} 选项控制，
%   具体见 \ref{subsubsec:论文格式}~小节。
% \end{function}
%^^A! \begin{function}[updated=2018-01-15]{\footnote}
%^^A!   \begin{fdusyntax}[deletetexcs={\footnote},morekeywords={\footnote}]
%^^A!     \footnote(*\marg{text}*)
%^^A!   \end{fdusyntax}
%^^A!   Insert a footnote. The style of footnote numbers can be set
%^^A!   with option \opt{style/foot\-note\-style}. See
%^^A!   subsubsection~\ref{subsubsec:style-and-format} for more details.
%^^A! \end{function}
%^^A!
%
% \begin{function}{\caption}
%   \begin{fdusyntax}[deletetexcs={\caption},morekeywords={\caption}]
%     \caption(*\marg{图表标题}*)
%     \caption(*\oarg{短标题}\marg{长标题}*)
%   \end{fdusyntax}
%   插入图表标题。可选参数 \meta{短标题} 用于图表目录。在
%   \meta{长标题} 中，您可以进行长达多段的叙述；但 \meta{短标题}
%   和单独的 \meta{图表标题} 中则不允许分段。
%   \cite{刘海洋2013latex入门}
% \end{function}
%^^A! \begin{function}{\caption}
%^^A!   \begin{fdusyntax}[deletetexcs={\caption},morekeywords={\caption}]
%^^A!     \caption(*\marg{caption}*)
%^^A!     \caption(*\oarg{short caption}\marg{long caption}*)
%^^A!   \end{fdusyntax}
%^^A!   Insert the caption of figure or table. The optional argument
%^^A!   \meta{short caption} will be shown in the list of figures/tables.
%^^A!   In \meta{long caption}, you can write descriptions for several
%^^A!   paragraphs, but \meta{short caption} and the single
%^^A!   \meta{caption} will not allow multi-paragraph text (i.e.\
%^^A!   text containing \tn{par}) inside.
%^^A! \end{function}
%^^A!
%
% 按照排版惯例，建议您将表格的标题放置在绘制表格的命令之前，
% 而将图片的标题放置在绘图或插图的命令之后。另需注意，
% \tn{caption} 命令必须放置在浮动体环境（如 \env{table} 和
% \env{figure}）中。
%^^A! By convention, caption of a table is usually put \emph{before}
%^^A! the table itself, while for figure it's the opposite.
%^^A! In addition, command \tn{caption} must be put inside float
%^^A! environments (e.g.\ \env{table} and \env{figure}).
%^^A!
%
% \paragraph{参考文献引用}
%^^A! \paragraph{Citations}
%
% \begin{function}[updated=2021-09-20]{\cite}
%   \begin{fdusyntax}[deletetexcs={\cite},morekeywords={\cite}]
%     \cite(*\marg{文献标签}*)
%     \cite(*\oarg{页码}\marg{文献标签}*)
%   \end{fdusyntax}
%   插入所引用的文献。可选参数 \meta{页码} 可用来标注引文的页码。在不同的
%   参考文献样式中，引用的样式也不尽相同。根据需要，模板还提供了更多的命令
%   用来标记引用。顺序编码制和著者—出版年制下的各种引用方式见
%   表~\ref{tab:citation-numerical} 和表~\ref{tab:citation-author-year}。
% \end{function}
%^^A! \begin{function}[updated=2021-09-20]{\cite}
%^^A!   \begin{fdusyntax}[deletetexcs={\cite},morekeywords={\cite}]
%^^A!     \cite(*\marg{bib key}*)
%^^A!     \cite(*\oarg{page number}\marg{bib key}*)
%^^A!   \end{fdusyntax}
%^^A!   Insert citations. The optional argument \meta{page number} can be
%^^A!   used to indicate the page number of the citation. The citation style
%^^A!   varies among different bibliography styles. More commands are also
%^^A!   provided to mark the citations, which can be found in
%^^A!   table~\ref{tab:citation-numerical} (numerical style) and
%^^A!   \ref{tab:citation-author-year} (author-year style).
%^^A! \end{function}
%^^A!
%
%^^A+
% \NewDocumentCommand\verbcite{O{cite}om}{^^A
%   \IfNoValueTF{#2}{^^A
%     \texttt{\textbackslash#1\{#3\}}^^A
%   }{^^A
%     \texttt{\textbackslash#1[#2]\{#3\}}^^A
%   }}
%^^A-
%
% \begin{table}[ht]
%   \caption{顺序编码制下的引用样式} \label{tab:citation-numerical}
%   \centering
%   \small
%   \begin{tabularx}{\textwidth}{cCll}
%     \toprule
%       \textbf{引用方式} &
%       \textbf{排版效果} &
%       \textbf{\kvopt{bib-backend}{bibtex}} &
%       \textbf{\kvopt{bib-backend}{biblatex}} \\
%     \midrule
%     单篇文献 &
%       引文\cite{texbook} &
%       \verbcite{texbook} &
%       同左 \\
%     多篇文献 &
%       引文\cite{texbook,companion} &
%       \verbcite{texbook,companion} &
%       同左 \\
%     标注页码 &
%       引文\cite[126--137]{texbook} &
%       \verbcite[cite][126--137]{texbook} &
%       同左 \\
%     标注作者 &
%       \citet{texbook}指出 &
%       \verbcite[citet]{texbook} &
%       \verbcite[authornumcite]{texbook} \\
%     标注作者、页码 &
%       \citet[42]{texbook}指出 &
%       \verbcite[citet][42]{texbook} &
%       \verbcite[authornumcite][42]{texbook} \\
%     非上标 &
%       引文{\citestyle{numbers}\cite{texbook}} &
%       \verbcite[parencite]{texbook} &
%       同左 \\
%     \bottomrule
%   \end{tabularx}
% \end{table}
%^^A! \begin{table}[ht]
%^^A!   \caption{Citations in numerical style} \label{tab:citation-numerical}
%^^A!   \centering
%^^A!   \small
%^^A!   \def\C#1{\textcolor{MaterialGreen}{#1}}
%^^A!   \begin{tabularx}{\textwidth}{cCll}
%^^A!     \toprule
%^^A!       \textbf{Styles} &
%^^A!       \textbf{Results} &
%^^A!       \textbf{\kvopt{bib-backend}{bibtex}} &
%^^A!       \textbf{\kvopt{bib-backend}{biblatex}} \\
%^^A!     \midrule
%^^A!     Single &
%^^A!       Text\textsuperscript{[\C1]} &
%^^A!       \verbcite{texbook} &
%^^A!       Same as left \\
%^^A!     Multiple &
%^^A!       Text\textsuperscript{[\C1--\C2]} &
%^^A!       \verbcite{texbook,companion} &
%^^A!       Same as left \\
%^^A!     With page &
%^^A!       Text\textsuperscript{[\C1]126--137} &
%^^A!       \verbcite[cite][126--137]{texbook} &
%^^A!       Same as left \\
%^^A!     With author &
%^^A!       Knuth\textsuperscript{[\C1]} states &
%^^A!       \verbcite[citet]{texbook} &
%^^A!       \verbcite[authornumcite]{texbook} \\
%^^A!     With page \& author &
%^^A!       Knuth\textsuperscript{[\C1]42} states &
%^^A!       \verbcite[citet][42]{texbook} &
%^^A!       \verbcite[authornumcite][42]{texbook} \\
%^^A!     No superscript &
%^^A!       Text [\C1] &
%^^A!       \verbcite[parencite]{texbook} &
%^^A!       Same as left \\
%^^A!     \bottomrule
%^^A!   \end{tabularx}
%^^A! \end{table}
%^^A!
%
% \begin{table}[ht]
%   \caption{著者—出版年制下的引用样式} \label{tab:citation-author-year}
%   \centering
%   \small
%   \def\!{\kern-1.5pt}
%   \begin{tabularx}{\textwidth}{cCll}
%     \toprule
%       \textbf{引用方式} &
%       \textbf{排版效果} &
%       \textbf{\kvopt{bib-backend}{bibtex}} &
%       \textbf{\kvopt{bib-backend}{biblatex}} \\
%     \midrule
%     单篇文献 &
%       (\citeauthor{texbook}\!, \citeyear{texbook}\!) &
%       \verbcite[citep]{texbook} &
%       \verbcite{texbook} \\
%     多篇文献 &
%       (\citeauthor{texbook}\!, \citeyear{texbook}\!;
%         \citeauthor{companion}\!, \citeyear{companion}\!) &
%       \verbcite[citep]{texbook,companion} &
%       \verbcite{texbook,companion} \\
%     标注页码 &
%       (\citeauthor{texbook}\!, \citeyear{texbook}\!)^^A
%         \textsuperscript{126--137} &
%       \verbcite[citep][126--137]{texbook} &
%       \verbcite[cite][126--137]{texbook} \\
%     标注作者 &
%       \citeauthor{texbook}(\citeyear{texbook}\!) &
%       \verbcite[citet]{texbook} &
%       同左 \\
%     标注作者、页码 &
%       \citeauthor{texbook}(\citeyear{texbook}\!)\textsuperscript{42} &
%       \verbcite[citet][42]{texbook} &
%       同左 \\
%     \bottomrule
%   \end{tabularx}
% \end{table}
%^^A! \begin{table}[ht]
%^^A!   \caption{Citations in author-year style} \label{tab:citation-author-year}
%^^A!   \centering
%^^A!   \small
%^^A!   \def\C#1{\textcolor{MaterialGreen}{#1}}
%^^A!   \begin{tabularx}{\textwidth}{cCll}
%^^A!     \toprule
%^^A!       \textbf{Styles} &
%^^A!       \textbf{Results} &
%^^A!       \textbf{\kvopt{bib-backend}{bibtex}} &
%^^A!       \textbf{\kvopt{bib-backend}{biblatex}} \\
%^^A!     \midrule
%^^A!     Single &
%^^A!       (\C{Knuth}, \C{1986}) &
%^^A!       \verbcite[citep]{texbook} &
%^^A!       \verbcite{texbook} \\
%^^A!     Multiple &
%^^A!       (\C{Knuth}, \C{1986}; \C{Mittelbach et~al.}, \C{2004}) &
%^^A!       \verbcite[citep]{texbook,companion} &
%^^A!       \verbcite{texbook,companion} \\
%^^A!     With page &
%^^A!       (\C{Knuth}, \C{1986})\textsuperscript{126--137} &
%^^A!       \verbcite[citep][126--137]{texbook} &
%^^A!       \verbcite[cite][126--137]{texbook} \\
%^^A!     With author &
%^^A!       \C{Knuth} (\C{1986}) &
%^^A!       \verbcite[citet]{texbook} &
%^^A!       Same as left \\
%^^A!     With page \& author &
%^^A!       \C{Knuth} (\C{1986})\textsuperscript{42} &
%^^A!       \verbcite[citet][42]{texbook} &
%^^A!       Same as left \\
%^^A!     \bottomrule
%^^A!   \end{tabularx}
%^^A! \end{table}
%^^A!
%
% \paragraph{定理类环境}
%^^A! \paragraph{Theorem-like environments}
%
%^^A TODO: \DescribeEnv{proof}
% \begin{function}{axiom,corollary,definition,example,lemma,
%   proof,theorem}
%   \begin{fdusyntax}[emph={[2]proof}]
%     \begin{proof}(*\oarg{小标题}*)
%       (*\meta{证明过程}*)
%     \end{proof}
%   \end{fdusyntax}
%   一系列预定义的数学环境。具体含义见表~\ref{tab:theorem}。
% \end{function}
%^^A! \begin{function}{axiom,corollary,definition,example,lemma,
%^^A!   proof,theorem}
%^^A!   \begin{fdusyntax}[emph={[2]proof}]
%^^A!     \begin{proof}(*\oarg{subheading}*)
%^^A!       (*\meta{procedure of proof}*)
%^^A!     \end{proof}
%^^A!   \end{fdusyntax}
%^^A!   A series of pre-defined math environments.
%^^A! \end{function}
%^^A!
%
% \begin{table}[ht]
%   \caption{预定义的数学环境} \label{tab:theorem}
%   \centering
%   \small
%   \begin{tabular}{*{8}{c}}
%     \toprule
%       \textbf{名称} &
%         \env{axiom} & \env{corollary} & \env{definition} & \env{example} &
%         \env{lemma} & \env{proof}     & \env{theorem} \\
%     \midrule
%       \textbf{含义} &
%         公理 & 推论 & 定义 & 例 &
%         引理 & 证明 & 定理 \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%
% 证明环境（\env{proof}）的最后会添加证毕符号“$\QED$”。要确保
% 该符号在正确的位置显示，您需要按照 \ref{subsec:编译方式}~节
% 中的有关说明编译\emph{两次}。
%^^A! A QED\footnote{Abbreviation of Latin phrase \emph{quod erat
%^^A!   demonstrandum}, means ``what was to be demonstrated''.}
%^^A! symbol ``$\QED$'' will be added at the end of \env{proof}
%^^A! environment. You need to compile the source file \emph{twice}
%^^A! as in subsection~\ref{subsec:compilation} in order to make
%^^A! the position of QED symbol correct.
%^^A!
%
% \begin{function}[updated=2023-02-08]{\newtheorem}
%   \begin{fdusyntax}[deletetexcs={\newtheorem},
%       morekeywords={\newtheorem,\newtheorem*}]
%     \newtheorem(*\oarg{选项}\marg{环境名}\marg{标题}*)
%     \newtheorem*(*\oarg{选项}\marg{环境名}\marg{标题}*)
%     \begin(*\marg{环境名}\oarg{小标题}*)
%       (*\meta{内容}*)
%     \end(*\marg{环境名}*)
%   \end{fdusyntax}
%   声明新的定理类环境（数学环境）。带星号的版本表示不进行编号，
%   并且会默认添加证毕符号“$\QED$”。声明后，即可同预定义的数学环境
%   一样使用。
% \end{function}
%^^A! \begin{function}[updated=2017-12-12]{\newtheorem}
%^^A!   \begin{fdusyntax}[deletetexcs={\newtheorem},
%^^A!       morekeywords={\newtheorem,\newtheorem*}]
%^^A!     \newtheorem(*\oarg{options}\marg{environment}\marg{title}*)
%^^A!     \newtheorem*(*\oarg{options}\marg{environment}\marg{title}*)
%^^A!     \begin(*\marg{environment}\oarg{subheading}*)
%^^A!       (*\meta{contents}*)
%^^A!     \end(*\marg{environment}*)
%^^A!   \end{fdusyntax}
%^^A!   Declare new math environments (theorems). If you use
%^^A!   \cs{newtheorem*}, then the theorem will not be numbered, and
%^^A!   a QED symbol ``$\QED$'' will be added at the end of the
%^^A!   environment. All the theorem environments defined by yourself
%^^A!   can be used as the pre-defined ones.
%^^A! \end{function}
%^^A!
%
% 事实上，表~\ref{tab:theorem} 中预定义的环境正是通过以下方式定义的：
% \begin{latexexample}[deletetexcs={\newtheorem},
%     morekeywords={\newtheorem,\newtheorem*}]
%   \newtheorem*{proof}{证明}
%   \newtheorem{axiom}{公理}
%   \newtheorem{corollary}{定理}
%   ...
% \end{latexexample}
%^^A! Actually, the pre-defined math environments are just defined
%^^A! with \cs{new\-the\-o\-rem} and \cs{new\-the\-o\-rem*}:
%^^A! \begin{latexexample}[deletetexcs={\newtheorem},
%^^A!     morekeywords={\newtheorem,\newtheorem*}]
%^^A!   \newtheorem*{proof}{proof}
%^^A!   \newtheorem{axiom}{axiom}
%^^A!   \newtheorem{corollary}{corollary}
%^^A!   ...
%^^A! \end{latexexample}
%^^A!
%
% 与 \cs{fdusetup} 相同，\cs{newtheorem} 的可选参数 \meta{选项}
% 也为一组键值列表。可用的选项见下。注意您无需输入“|theorem/|”。
%^^A! Similar with \cs{fdusetup}, the optional argument \meta{options}
%^^A! of \cs{newtheorem} is a key-value list as well. The available
%^^A! are described below. Note that you don't need to type in the
%^^A! ``|theorem/|'' prefix.
%^^A!
%
% \begin{function}{theorem/style}
%   \begin{fdusyntax}[emph={[1]style}]
%     style = (*<(plain)|margin|change|\\
%       XXXXXX\mbox{}~~~~~~~~break|marginbreak|changebreak>*)
%   \end{fdusyntax}
%   定理类环境的总体样式。
% \end{function}
%^^A! \begin{function}{theorem/style}
%^^A!   \begin{fdusyntax}[emph={[1]style}]
%^^A!     style = (*<(plain)|margin|change|\\
%^^A!       XXXX\mbox{}~~~~~~~~break|marginbreak|changebreak>*)
%^^A!   \end{fdusyntax}
%^^A!   The overall style of the theorem environment.
%^^A! \end{function}
%^^A!
%
% \begin{function}{theorem/header-font}
%   \begin{fdusyntax}[emph={[1]header-font}]
%     header-font = (*\marg{字体}*)
%   \end{fdusyntax}
%   定理头（即标题）的字体。中文模板默认为 \tn{sffamily}，即无衬线体
%   （黑体）；英文模板默认为 |\bfseries\upshape|，即加粗直立体。
% \end{function}
%^^A! \begin{function}{theorem/header-font}
%^^A!   \begin{fdusyntax}[emph={[1]header-font}]
%^^A!     header-font = (*\marg{font}*)
%^^A!   \end{fdusyntax}
%^^A!   Font of the theorem header. Default value is \tn{sffamily}
%^^A!   and |\bfseries\upshape| for Chinese and English template,
%^^A!   respectively.
%^^A! \end{function}
%^^A!
%
% \begin{function}{theorem/body-font}
%   \begin{fdusyntax}[emph={[1]body-font}]
%     body-font = (*\marg{字体}*)
%   \end{fdusyntax}
%   定理内容的字体。中文模板默认为 \tn{fdu@kai}，即楷体；英文模板
%   默认为 \tn{itshape}，即斜体。
% \end{function}
%^^A! \begin{function}{theorem/body-font}
%^^A!   \begin{fdusyntax}[emph={[1]body-font}]
%^^A!     body-font = (*\marg{font}*)
%^^A!   \end{fdusyntax}
%^^A!   Font of the theorem body. Default value is \tn{fdu@kai}
%^^A!   (\textit{楷体}) and \tn{itshape} for Chinese and English
%^^A!   template, respectively.
%^^A! \end{function}
%^^A!
%
% \begin{function}{theorem/qed}
%   \begin{fdusyntax}[emph={[1]qed}]
%     qed = (*\marg{符号}*)
%   \end{fdusyntax}
%   定理结束标记（即证毕符号）。如果用 \cs{newtheorem} 声明定理，则默认为空；
%   用 \cs{newtheorem*} 声明，则默认为 |\ensuremath{\QED}|，即“$\QED$”。
% \end{function}
%^^A! \begin{function}{theorem/qed}
%^^A!   \begin{fdusyntax}[emph={[1]qed}]
%^^A!     qed = (*\marg{symbol}*)
%^^A!   \end{fdusyntax}
%^^A!   Theorem end mark. For \cs{newtheorem}, default value is
%^^A!   empty; for \cs{newtheorem*}, default value is
%^^A!   |\ensuremath{\QED}| (i.e.\ ``$\QED$'').
%^^A! \end{function}
%^^A!
%
% \begin{function}{theorem/counter}
%   \begin{fdusyntax}[emph={[1]counter}]
%     counter = (*\marg{计数器}*)
%   \end{fdusyntax}
%   定理计数器，表示定理编号在 \meta{计数器} 的下一级，并会随 \meta{计数器}
%   的变化而清零。\cite{刘海洋2013latex入门}默认为 |chapter|，表示按章编号。
%   使用 \cs{newtheorem*} 时，该选项无效。
% \end{function}
%^^A! \begin{function}{theorem/counter}
%^^A!   \begin{fdusyntax}[emph={[1]counter}]
%^^A!     counter = (*\marg{counter}*)
%^^A!   \end{fdusyntax}
%^^A!   The theorem will be enumerated within \meta{counter}. For
%^^A!   example, the default value is |chapter|, which means with
%^^A!   each new \tn{chapter}, the enumeration begins again with 1.
%^^A!   This option is invalid for \cs{newtheorem*}.
%^^A! \end{function}
%^^A!
%
% \subsubsection{豹尾}
%^^A! \subsubsection{Back matter}
%^^A!
%
% \begin{function}{\backmatter}
%   声明后置部分开始。
% \end{function}
%^^A! \begin{function}{\backmatter}
%^^A!   Declare the beginning of back matter.
%^^A! \end{function}
%^^A!
%
% 后置部分包含参考文献、声明页等。
%^^A! Back matter contains bibliography, declaration page, etc.
%^^A!
%
% \begin{function}[updated=2018-01-25]{\printbibliography}
%   \begin{fdusyntax}[morekeywords={\printbibliography}]
%     \printbibliography(*\oarg{选项}*)
%   \end{fdusyntax}
%   打印参考文献列表。如果 \kvopt{bib-backend}{bibtex}，则 \meta{选项}
%   无效，相当于 \tn{bibliography} \texttt{\marg{文献数据库}}，其中的
%   \meta{文献数据库} 可利用 \opt{style/bib-resource} 选项指定，具体见
%   \ref{subsubsec:论文格式}~小节；而如果 \kvopt{bib-backend}{biblatex}，
%   则该命令由 \pkg{biblatex} 宏包直接提供，可用选项请参阅其文档
%   \cite{biblatex}。
% \end{function}
%^^A! \begin{function}[updated=2018-01-25]{\printbibliography}
%^^A!   \begin{fdusyntax}[morekeywords={\printbibliography}]
%^^A!     \printbibliography(*\oarg{options}*)
%^^A!   \end{fdusyntax}
%^^A!   Print the bibliography. When \kvopt{bib-backend}{bibtex}, then
%^^A!   \meta{options} is invalid and this command is equivalent to
%^^A!   \tn{bibliography} \texttt{\marg{bib files}}, where \meta{bib files}
%^^A!   should be specified with option \opt{style/bib-resource} (see
%^^A!   subsubsection~\ref{subsubsec:style-and-format}). When
%^^A!   \kvopt{bib-backend}{bibtex}, then \tn{printbibliography} is
%^^A!   provided by \pkg{biblatex} and the available options can be
%^^A!   found in its documentation.
%^^A! \end{function}
%^^A!
%
% \begin{function}[added=2023-02-06]{acknowledgements}
%   \begin{fdusyntax}[emph={[2]acknowledgements}]
%     \begin{acknowledgements}
%       (*\meta{致谢内容}*)
%     \end{acknowledgements}
%   \end{fdusyntax}
%   致谢。
% \end{function}
%^^A! \begin{function}[added=2023-02-06]{acknowledgements}
%^^A!   \begin{fdusyntax}[emph={[2]acknowledgements}]
%^^A!     \begin{acknowledgements}
%^^A!       (*\meta{acknowledgements}*)
%^^A!     \end{acknowledgements}
%^^A!   \end{fdusyntax}
%^^A!   Acknowledgements.
%^^A! \end{function}
%^^A!
%
% \section{宏包依赖情况}
%^^A! \section{Packages dependencies}
%^^A!
%
% 使用不同编译方式、指定不同选项，会导致宏包依赖情况有所不同。
% 具体如下：
% \begin{itemize}
%   \item 在任何情况下，本模板都会\emph{显式}调用以下宏包
%     （或文档类）：
%     \begin{itemize}
%       \item \pkg{xtemplate} 和 \pkg{l3keys2e}，用于扩展 \LaTeX3 编程环境。
%         它们属于 \pkg{l3packages} 宏集。
%       \item \cls{ctexbook}，提供中文排版的通用框架。属于 \CTeX{}
%         宏集 \cite{CTeX}。
%       \item \pkg{amsmath}，对 \LaTeX{} 的数学排版功能进行了
%         全面扩展。属于 \AmSLaTeX{} 套件。
%       \item \pkg{unicode-math}，负责处理 Unicode 编码的
%         OpenType 数学字体。
%       \item \pkg{geometry}，用于调整页面尺寸。
%       \item \pkg{fancyhdr}，处理页眉页脚。
%       \item \pkg{footmisc}，处理脚注。
%       \item \pkg{ntheorem}，提供增强版的定理类环境。
%       \item \pkg{graphicx}，提供图形插入的接口。
%       \item \pkg{longtable}，长表格（允许跨页）支持。
%       \item \pkg{caption}，用于设置题注。
%       \item \pkg{xcolor}，提供彩色支持。
%       \item \pkg{hyperref}，提供交叉引用、超链接、电子书签等功能。
%     \end{itemize}
%   \item 开启 \kvopt{style/footnote-style}{pifont} 后，会调用
%     \pkg{pifont} 宏包。它属于 \pkg{psnfss} 套件。
%   \item 开启 \kvopt{style/bib-backend}{bibtex} 后，会调用
%     \pkg{natbib} 宏包，并依赖 \BibTeX{} 程序。参考文献样式由
%     \pkg{gbt7714} 宏包提供 \cite{natbib,gbt7714}。
%   \item 开启 \kvopt{style/bib-backend}{biblatex} 后，会调用
%     \pkg{biblatex} 宏包，并依赖 \biber{} 程序。参考文献样式由
%     \pkg{biblatex-gb7714-2015} 宏包提供
%     \cite{biblatex,biblatex-gb7714-2015}。
% \end{itemize}
%^^A! Different compilation methods and options will result in a
%^^A! different packages dependency. Details are as follows:
%^^A! \begin{itemize}
%^^A!   \item In any case, \cls{fduthesis} will load the following
%^^A!     packages \emph{explicitly}:
%^^A!     \begin{itemize}
%^^A!       \item \pkg{xtemplate} and \pkg{l3keys2e}, belong to
%^^A!         \pkg{l3packages} bundle
%^^A!       \item \cls{ctexbook}, belongs to \CTeX{} bundle
%^^A!       \item \pkg{amsmath}, belongs to \AmSLaTeX{} bundle
%^^A!       \item \pkg{unicode-math}
%^^A!       \item \pkg{geometry}
%^^A!       \item \pkg{fancyhdr}
%^^A!       \item \pkg{footmisc}
%^^A!       \item \pkg{ntheorem}
%^^A!       \item \pkg{graphicx}
%^^A!       \item \pkg{longtable}
%^^A!       \item \pkg{caption}
%^^A!       \item \pkg{xcolor}
%^^A!       \item \pkg{hyperref}
%^^A!     \end{itemize}
%^^A!   \item When chosen \kvopt{style/footnote-style}{pifont},
%^^A!     package \pkg{pifont} will be loaded. It belongs to
%^^A!     \pkg{psnfss} bundle.
%^^A!   \item When chosen \kvopt{style/bib-backend}{bibtex},
%^^A!     package \pkg{natbib} will be loaded. Meanwhile, program
%^^A!     \BibTeX{} will be required for compilation. The
%^^A!     bibliography style is provided by \pkg{gbt7714}.
%^^A!   \item When chosen \kvopt{style/bib-backend}{biblatex},
%^^A!     package \pkg{biblatex} will be loaded. Program \biber{}
%^^A!     will be required then. The bibliography style is provided
%^^A!     by \pkg{biblatex-gb7714-2015}.
%^^A! \end{itemize}
%^^A!
%
% 这里只列出了本模板直接调用的宏包。这些宏包自身的调用情况，
% 此处不再具体展开。如有需要，请参阅相关文档。
%^^A! Only the packages loaded directly by \cls{fduthesis} are listed
%^^A! here. If you need to know the dependencies of the packages
%^^A! themselves, please refer to the corresponding manuals.
%^^A!
%
% \begin{thebibliography}{99}
%
% \newcommand\urlprefix{\newline\hspace*{\fill}}
% \let\OldUrl=\url
% \renewcommand\url[2][]{{\small\textit{#1}~\OldUrl{#2}}}
% \newcommand\CTANurl[2][]{{^^A
%   \small\textit{#1}~\href{https://mirror.ctan.org/#2}{\texttt{CTAN://#2}}}}
%
% \subsection{图书}
%
% \bibitem[Knuth(1986)]{texbook}
% \textsc{Knuth D E}.
% \newblock \textit{The \TeX book: Computers \& Typesetting, volume A} [M].
% \newblock Boston: Addison--Wesley Publishing Company, 1986
% \urlprefix \CTANurl[源代码^^A
%   \footnote{此代码只可作为学习之用。未经 Knuth 本人同意，您不应当编译此文档。}：]^^A
%   {systems/knuth/dist/tex/texbook.tex}
%
% \bibitem[Mittelbach et~al.(2004)]{companion}
% \textsc{Mittelbach F} and \textsc{Goossens M}.
% \newblock \textit{The \LaTeX{} Companion} [M].
% \newblock 2nd ed.
% \newblock Boston: Addison--Wesley Publishing Company, 2004
%
% \bibitem[()]{胡伟2017latex2e}
% 胡伟.
% \newblock \textit{\LaTeXe{} 文类和宏包学习手册} [M].
% \newblock 北京: 清华大学出版社, 2017
%
% \bibitem[()]{刘海洋2013latex入门}
% 刘海洋.
% \newblock \textit{\LaTeX{} 入门} [M].
% \newblock 北京: 电子工业出版社, 2013
%
% \subsection{标准、规范}
%
% \bibitem[()]{gb-t-7713.1-2006}
% 国务院学位委员会办公室, 全国信息与文献标准化技术委员会.
% \newblock \textit{学位论文编写规则: GB/T 7713.1--2006} [S].
% \newblock 北京: 中国标准出版社, 2007
%
% \bibitem[()]{gb-t-7714-2015}
% 全国信息与文献标准化技术委员会.
% \newblock \textit{信息与文献\quad 参考文献著录规则: GB/T 7714--2015} [S].
% \newblock 北京: 中国标准出版社, 2015
%
% \bibitem[()]{gb-t-15834-2011}
% 教育部语言文字信息管理司.
% \newblock \textit{标点符号用法: GB/T 15834--2011} [S/OL].
% \newblock 北京: 中国标准出版社, 2012
% \urlprefix\url{http://www.moe.gov.cn/ewebeditor/uploadfile/2015/01/13/20150113091548267.pdf}
%
% \bibitem[()]{clreq}
% W3C.
% \newblock \textit{中文排版需求（Requirements for Chinese Text Layout）} [EB/OL].
% \newblock W3C Editor's Draft.
% \newblock (2023-05-24)
% \urlprefix\url{https://w3c.github.io/clreq/}
%
% \bibitem[()]{复旦大学论文规范}
% 复旦大学图书馆, 复旦大学研究生院.
% \newblock \textit{复旦大学博士、硕士学位论文规范} [EB/OL].
% \newblock 2017 年 3 月修订版.
% \newblock (2017-03-27)
% \urlprefix\url{http://www.gs.fudan.edu.cn/_upload/article/4c/a8/a82545ef443b9c057c14ba13782c/c883c6f3-6d7f-410c-8f30-d8bde6fcb990.doc}
%
% \subsection{宏包、模版}
%
% \bibitem[()]{source2e}
% \textsc{Braams J}, \textsc{Carlisle D}, \textsc{Jeffrey A}, et~al.
% \newblock \textit{The \LaTeXe{} Sources} [CP/OL].
% \newblock (2022-11-01)
% \urlprefix\url{https://ctan.org/pkg/latex}
% \urlprefix\CTANurl[源代码：]{macros/latex/base/source2e.pdf}
%
% \bibitem[()]{CTeX}
% \textsc{CTEX.ORG}.
% \newblock \textit{\CTeX{} 宏集手册} [EB/OL].
% \newblock version 2.5.10,
% \newblock (2022-07-14)
% \urlprefix\url{https://ctan.org/pkg/ctex}
% \urlprefix\CTANurl[文档及源代码：]{language/chinese/ctex/ctex.pdf}
%
% \bibitem[()]{xeCJK}
% \textsc{CTEX.ORG}.
% \newblock \textit{\pkg{xeCJK} 宏包} [EB/OL].
% \newblock version 3.9.1,
% \newblock (2022-08-05)
% \urlprefix\url{https://ctan.org/pkg/xecjk}
% \urlprefix\CTANurl[文档及源代码：]{macros/xetex/latex/xecjk/xeCJK.pdf}
%
% \bibitem[()]{natbib}
% \textsc{Daly P W}.
% \newblock \textit{Natural Sciences Citations and References} [EB/OL].
% \newblock version 8.31b,
% \newblock (2010-09-13)
% \urlprefix\url{https://ctan.org/pkg/natbib}
% \urlprefix\CTANurl[文档及源代码：]{macros/latex/contrib/natbib/natbib.pdf}
%
% \bibitem[()]{source3}
% \textsc{The \LaTeX3 Project}.
% \newblock \textit{The \LaTeX3 Sources} [CP/OL].
% \newblock (2023-05-22)
% \urlprefix\url{https://ctan.org/pkg/l3kernel}
% \urlprefix\CTANurl[源代码：]{macros/latex/contrib/l3kernel/source3.pdf}
%
% \bibitem[()]{biblatex}
% \textsc{Kime P}, \textsc{Wemheuer M}, \textsc{Lehman P}.
% \newblock \textit{The \pkg{biblatex} Package} [EB/OL].
% \newblock version 3.19,
% \newblock (2023-03-05)
% \urlprefix\url{https://ctan.org/pkg/biblatex}
% \urlprefix\CTANurl[文档：]{macros/latex/contrib/biblatex/doc/biblatex.pdf}
%
% \bibitem[()]{lshort}
% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et~al.
% \newblock \textit{The Not So Short Introduction to \LaTeXe{}: Or \LaTeXe{} in 139 minutes} [EB/OL].
% \newblock version 6.4,
% \newblock (2021-03-09)
% \urlprefix\url{https://ctan.org/pkg/lshort-english}
% \urlprefix\CTANurl[文档：]{info/lshort/english/lshort.pdf}
%
% \bibitem[()]{lshort-zh-cn}
% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et~al.
% \newblock \textit{一份（不太）简短的 \LaTeXe{} 介绍: 或 111 分钟了解 \LaTeXe{}} [EB/OL].
% \newblock \CTeX{} 开发小组, 译.
% \newblock 原版版本 version 6.4, 中文版本 version 6.04,
% \newblock (2023-05-05)
% \urlprefix\url{https://ctan.org/pkg/lshort-zh-cn}
% \urlprefix\CTANurl[文档：]{info/lshort/chinese/lshort-zh-cn.pdf}
%
% \bibitem[()]{biblatex-gb7714-2015}
% 胡振震.
% \newblock \textit{符合 GB/T 7714-2015 标准的 biblatex 参考文献样式} [EB/OL].
% \newblock version 1.1n,
% \newblock (2023-05-25)
% \urlprefix\url{https://ctan.org/pkg/biblatex-gb7714-2015}
% \urlprefix\CTANurl[文档：]{biblatex-contrib/biblatex-gb7714-2015/biblatex-gb7714-2015.pdf}
%
% \bibitem[()]{gbt7714}
% 李泽平（\textsc{Zeping L}）.
% \newblock \textit{GB/T 7714-2015 \BibTeX{} Style} [EB/OL].
% \newblock version 2.1.5,
% \newblock (2022-10-03)
% \urlprefix\url{https://ctan.org/pkg/gbt7714}
% \urlprefix\CTANurl[文档：]{biblio/bibtex/contrib/gbt7714/gbt7714.pdf}
%
% \bibitem[()]{cquthesis}
% 李振楠.
% \newblock \textit{\textsc{CquThesis}：重庆大学毕业论文 \LaTeX{} 模板} [EB/OL].
% \newblock version 1.50,
% \newblock (2020-06-23)
% \urlprefix\url{https://ctan.org/pkg/cquthesis}
% \urlprefix\CTANurl[文档及源代码：]{macros/latex/contrib/cquthesis/cquthesis.pdf}
%
% \bibitem[()]{pkuthss}
% Casper Ti. Vector.
% \newblock \textit{北京大学学位论文模版：pkuthss} [EB/OL].
% \newblock version 1.9.3,
% \newblock (2022-10-30)
% \urlprefix\url{https://ctan.org/pkg/pkuthss}
% \urlprefix\CTANurl[文档及源代码：]{macros/latex/contrib/pkuthss/pkuthss.pdf}
%
% \bibitem[()]{thuthesis}
% 清华大学 TUNA 协会.
% \newblock \textit{\textsc{ThuThesis}：清华大学学位论文模板} [EB/OL].
% \newblock version 7.4.0,
% \newblock (2023-05-15)
% \urlprefix\url{https://ctan.org/pkg/thuthesis}
% \urlprefix\CTANurl[文档及源代码：]{macros/latex/contrib/thuthesis/thuthesis.pdf}
%
% \emph{以下模版未收录至 CTAN，但仍然保持更新。}
%
% \bibitem[()]{sjtuthesis}
% \textsc{SJTUG}.
% \newblock \textit{上海交通大学学位论文模板} [EB/OL].
% \newblock version 2.0.2,
% \newblock (2023-04-01)
% \urlprefix\url{https://github.com/sjtug/SJTUThesis}
% \urlprefix\url[源代码仓库：]{https://github.com/sjtug/SJTUTeX}
%
% \bibitem[()]{ustcthesis}
% \textsc{USTC \TeX{} User Group}.
% \newblock \textit{中国科学技术大学学位论文 \LaTeX{} 模板} [EB/OL].
% \newblock version 3.3.4,
% \newblock (2023-05-10)
% \urlprefix\url{https://github.com/ustctug/ustcthesis}
%
% \bibitem[()]{ucasthesis}
% \textsc{mohuangrui}.
% \newblock \textit{\pkg{ucasthesis} 国科大学位论文 \LaTeX{} 模板} [EB/OL].
% \newblock (2021-10-29)
% \urlprefix\url{https://github.com/mohuangrui/ucasthesis}
%
% \emph{以下模版现已停止更新。}
%
% \bibitem[()]{pandoxie2014fduthesislatex}
% \textsc{Pandoxie}.
% \newblock \textit{Fudan University-Latex Template} [EB/OL].
% \newblock (2014-06-07)
% \urlprefix\url{https://github.com/Pandoxie/FDU-Thesis-Latex}
%
% \bibitem[()]{richard2016fudanthesis}
% \textsc{richard}.
% \newblock \textit{复旦大学硕士学位论文模板} [EB/OL].
% \newblock (2016-01-31)
% \urlprefix\url{https://github.com/richarddzh/fudan-thesis}
%
% \bibitem{数院本科毕业论文写作模板}
% 复旦大学数学科学学院.
% \newblock \textit{2019 春季本科毕业论文写作模板} [EB/OL].
% \newblock (2019-03-12)
% \urlprefix\url{https://math.fudan.edu.cn/f3/e1/c30360a324577/page.htm}
%
% \subsection{其他}
%
% \bibitem[()]{wright2009dtxfile}
% \textsc{Wright J}.
% \newblock \textit{A model dtx file} [EB/OL].
% \newblock (2009-10-06)
% \urlprefix\url{https://www.texdev.net/2009/10/06/a-model-dtx-file/}
%
% \bibitem[()]{孔雀计划}
% 刘庆（\textsc{Eric Q L}）.
% \newblock \textit{孔雀计划：中文字体排印的思路} [EB/OL].
% \urlprefix\url{https://thetype.com/kongque/}
%
% \end{thebibliography}
%
% \clearpage
%
%^^A! \end{document}
%
% \end{documentation}
%
% \begin{implementation}
%
%^^A 代码部分的页边距
% \newgeometry{
%   left      = 2.25 in,
%   right     = 1.00 in,
%   top       = 1.25 in,
%   bottom    = 1.00 in,
%   marginpar = 2.25 in
% }
%
% \section{实现细节}
%
% 本模板使用 \LaTeX3 语法编写，依赖 \pkg{expl3} 环境，
% 并需调用 \pkg{l3packages} 中的相关宏包。
%
% 按照 \LaTeX3 语法，代码中的空格、换行、回车与制表符完全忽略，
% 而下划线“|_|”和冒号“|:|”则可作为一般字母使用。
% 正常的空格可以使用“|~|”代替；至于 |~| 原来所表示的“带子”，
% 则要用 \LaTeXe{} 的原始命令 \tn{nobreakspace} 代替。
%
% 以下代码中有一些形如 \textcolor[HTML]{2E3191}{\textsf{<*class>}}
% 的标记，这是 \pkg{DocStrip} 中的“guard”，用来选择性地提取文件。
% “\textsf{*}”和“\textsf{/}”分别表示该部分的开始和结束。不含
% “\textsf{*}”和“\textsf{/}”的 guard 出现在行号左侧，它们用来确定
% 单独一行代码的归属。这些 guard 的颜色深浅不一，用以明确嵌套关系。
%
% 另有若干形如 \textcolor{MaterialPink}{\textsf{<@@=fdu>}} 的 guard，
% 它们用来指示名字空间（模块）。
%
% \subsection{准备}
%
%    \begin{macrocode}
%<@@=fdu>
%<*class|class-en>
%    \end{macrocode}
%
% \changes{v0.8}{2021/09/15}{同步 \LaTeX{} 2020/10/01，不再显式调用
%   \pkg{expl3} 和 \pkg{xparse} 宏包。}
% \changes{v0.8}{2022/02/17}{在使用前声明提示信息。}
%
% 检查 \LaTeX3 编程环境。
%    \begin{macrocode}
\RequirePackage { xtemplate, l3keys2e }
\msg_new:nnn { fduthesis } { l3-too-old }
  {
    Package~ "#1"~ is~ too~ old. \\\\
    Please~ update~ an~ up-to-date~ version~ of~ the~ bundles \\
    "l3kernel"~ and~ "l3packages"~ using~ your~ TeX~ package \\
    manager~ or~ from~ CTAN.
  }
\clist_map_inline:nn { xtemplate, l3keys2e }
  {
    \@ifpackagelater {#1} { 2020/07/17 }
      { } { \msg_error:nnn { fduthesis } { l3-too-old } {#1} }
  }
%    \end{macrocode}
%
% 目前 \cls{fduthesis} 仅支持 \XeTeX{} 和 \LuaTeX{}。
%    \begin{macrocode}
\msg_new:nnn { fduthesis } { unsupported-engine }
  {
    The~ fduthesis~ class~ requires~ either~ XeTeX~ or~ LuaTeX. \\\\
    "#1"~ is~ not~ supported~ at~ present.~ You~ must~ change \\
    your~ typesetting~ engine~ to~ "xelatex"~ or~ "lualatex".
  }
\sys_if_engine_xetex:F
  {
    \sys_if_engine_luatex:F
      {
        \msg_fatal:nnx { fduthesis } { unsupported-engine }
          { \c_sys_engine_str }
      }
  }
%    \end{macrocode}
%
% \subsubsection{内部变量声明}
%
% \begin{variable}{\l_@@_tmpa_box,
%   \l_@@_tmpa_clist,
%   \l_@@_tmpa_dim,
%   \l_@@_tmpa_skip,
%   \l_@@_tmpa_tl,\l_@@_tmpb_tl}
% 临时变量。
%    \begin{macrocode}
\box_new:N   \l_@@_tmpa_box
\clist_new:N \l_@@_tmpa_clist
\dim_new:N   \l_@@_tmpa_dim
\skip_new:N  \l_@@_tmpa_skip
\tl_new:N    \l_@@_tmpa_tl
\tl_new:N    \l_@@_tmpb_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_thesis_type_tl}
% 论文类型。
%    \begin{macrocode}
\tl_new:N \g_@@_thesis_type_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_to_ctexbook_clist,\g_@@_to_hyperref_clist}
% 分别保存由 \cls{fduthesis} 传入 \cls{ctexbook} 文档类和
% \pkg{hyperref} 宏包的选项列表。
%    \begin{macrocode}
\clist_new:N \g_@@_to_ctexbook_clist
\clist_new:N \g_@@_to_hyperref_clist
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_twoside_bool}
% 是否开启双页模式（默认打开）。
%    \begin{macrocode}
\bool_new:N \g_@@_twoside_bool
\bool_set_true:N \g_@@_twoside_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_draft_bool}
% 是否开启草稿模式（默认关闭）。
%    \begin{macrocode}
\bool_new:N \g_@@_draft_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_config_tl}
% 保存配置文件名称。默认为空。
%    \begin{macrocode}
\tl_new:N \g_@@_config_tl
%    \end{macrocode}
% \end{variable}
%
% \subsubsection{内部函数}
%
% \begin{macro}{
%   \file_input:V,
%   \int_to_arabic:v,
%   \keys_define:nx,
%   \prop_item:No,
%   \regex_replace_all:nnc}
% \begin{macro}[TF]{\tl_if_eq:Vn}
% \LaTeX3{} 函数变体。
%    \begin{macrocode}
\cs_generate_variant:Nn \file_input:n          { V   }
\cs_generate_variant:Nn \int_to_arabic:n       { v   }
\cs_generate_variant:Nn \keys_define:nn        { nx  }
\cs_generate_variant:Nn \prop_item:Nn          { No  }
\cs_generate_variant:Nn \regex_replace_all:nnN { nnc }
\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { Vn } { T, TF }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_quad:,\@@_qquad:}
% 等价于 \LaTeXe{} 中的 \tn{quad} 和 \tn{qquad}。
%    \begin{macrocode}
\cs_new:Npn \@@_quad:  { \skip_horizontal:n { 1 em } }
\cs_new:Npn \@@_qquad: { \skip_horizontal:n { 2 em } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_vspace:N,\@@_vspace:n,\@@_vspace:c}
% 类似 \LaTeXe{} 中的 \tn{vspace*}。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_vspace:N #1
  {
    \dim_set_eq:NN \l_@@_tmpa_dim \prevdepth
    \hrule height \c_zero_dim
    \nobreak
    \skip_vertical:N #1
    \skip_vertical:N \c_zero_skip
    \dim_set_eq:NN \prevdepth \l_@@_tmpa_dim
  }
\cs_new_protected:Npn \@@_vspace:n #1
  {
    \skip_set:Nn \l_@@_tmpa_skip {#1}
    \@@_vspace:N \l_@@_tmpa_skip
  }
\cs_generate_variant:Nn \@@_vspace:N { c }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_symbol:n}
% 等价于 \LaTeXe{} 中的 \tn{symbol}。
%    \begin{macrocode}
\cs_new:Npn \@@_symbol:n #1 { \tex_char:D #1 \scan_stop: }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_arabic:n}
% 等价于 \LaTeXe{} 中的 \tn{arabic}。
%    \begin{macrocode}
\cs_new:Npn \@@_arabic:n #1
  { \int_to_arabic:v { c@ #1 } }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.8}{2021/09/15}{统一使用 \LaTeX{} 2020/10/01 新的钩子机制。}
%
% \begin{macro}{\@@_gadd_ltxhook:nn}
% 封装 \LaTeX{} 的钩子管理机制。本模板中的字体加载命令位于
% \texttt{begindocument/\allowbreak before} 钩子中，需确保在 \pkg{xeCJK} 之前执行。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_gadd_ltxhook:nn #1#2
  { \hook_gput_code:nnn {#1} { . } {#2} }
\hook_gset_rule:nnnn { begindocument/before } { . } { < } { xeCJK }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_patch_cmd:Nnn,\@@_appto_cmd:Nn}
% 补丁工具，来自 \pkg{ctexpatch} 宏包。
%    \begin{macrocode}
\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 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_define_fn_style:nn,
%   \@@_define_punct:nn,
%   \@@_define_name:nn,
%   \@@_define_name:nnn}
% 用来定义脚注样式、标点、默认名称的辅助函数。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_define_fn_style:nn #1#2
  { \tl_const:cn { c_@@_fn_style_ #1 _tl } {#2} }
\cs_new_protected:Npn \@@_define_punct:nn #1#2
  { \tl_const:cn { c_@@_ #1 _tl } {#2} }
\cs_new_protected:Npn \@@_define_name:nn #1#2
  { \tl_const:cn { c_@@_name_ #1 _tl } {#2} }
\cs_new_protected:Npn \@@_define_name:nnn #1#2#3
  {
    \tl_const:cn { c_@@_name_ #1    _tl } {#2}
    \tl_const:cn { c_@@_name_ #1 _en_tl } {#3}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_msg_new:nn,
%   \@@_error:n,\@@_error:nn,\@@_error:nx,\@@_error:nnn,\@@_error:nnnn,
%   \@@_warning:n,\@@_warning:nn,\@@_warning:nxx,
%   \@@_info:nx}
% 各种信息函数的缩略形式。
%    \begin{macrocode}
\cs_new:Npn \@@_msg_new:nn  { \msg_new:nnn      { fduthesis } }
\cs_new:Npn \@@_error:n     { \msg_error:nn     { fduthesis } }
\cs_new:Npn \@@_error:nn    { \msg_error:nnn    { fduthesis } }
\cs_new:Npn \@@_error:nx    { \msg_error:nnx    { fduthesis } }
\cs_new:Npn \@@_error:nnn   { \msg_error:nnnn   { fduthesis } }
\cs_new:Npn \@@_error:nnnn  { \msg_error:nnnnn  { fduthesis } }
\cs_new:Npn \@@_warning:n   { \msg_warning:nn   { fduthesis } }
\cs_new:Npn \@@_warning:nn  { \msg_warning:nnn  { fduthesis } }
\cs_new:Npn \@@_warning:nxx { \msg_warning:nnxx { fduthesis } }
\cs_new:Npn \@@_info:nx     { \msg_info:nnx     { fduthesis } }
%    \end{macrocode}
% \end{macro}
%
% \subsection{选项处理}
%
% 定义 |fdu/option| 键值类。
%    \begin{macrocode}
\keys_define:nn { fdu / option }
  {
%    \end{macrocode}
%
% \changes{v0.7}{2018/02/01}{新增 \opt{type} 选项。}
%
% \begin{macro}{type}
% 设置论文类型。设为模板选项主要是为了以后的兼容性。论文类型可能会
% 影响很多设置，只是暂时还不考虑。默认为本科毕业论文。
%    \begin{macrocode}
    type .choices:nn =
      { doctor, master, bachelor }
      { \tl_set_eq:NN \g_@@_thesis_type_tl \l_keys_choice_tl },
    type .value_required:n = true,
    type .initial:n = bachelor,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{oneside,twoside}
% 设置页面类型为单面或双面。
%    \begin{macrocode}
    oneside .value_forbidden:n = true,
    twoside .value_forbidden:n = true,
    oneside .code:n =
      {
        \clist_gput_right:Nn \g_@@_to_ctexbook_clist { oneside }
        \bool_set_false:N    \g_@@_twoside_bool
      },
    twoside .code:n =
      {
        \clist_gput_right:Nn \g_@@_to_ctexbook_clist { twoside }
        \bool_set_true:N     \g_@@_twoside_bool
      },
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.5}{2017/09/23}{移除 \opt{nofonts} 选项。}
%
% \begin{macro}{draft}
% 是否开启草稿模式（默认关闭）。
%    \begin{macrocode}
    draft .choice:,
    draft / true  .code:n =
      {
        \bool_set_true:N     \g_@@_draft_bool
        \clist_gput_right:Nn \g_@@_to_ctexbook_clist { draft }
      },
    draft / false .code:n =
      { \bool_set_false:N    \g_@@_draft_bool },
    draft .default:n = true,
    draft .initial:n = false,
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.7}{2018/01/31}{新增 \opt{config} 选项。}
%
% \begin{macro}{config}
% 配置文件名。
%    \begin{macrocode}
    config .tl_set:N = \g_@@_config_tl,
%    \end{macrocode}
% \end{macro}
%
% 处理未知选项。
%    \begin{macrocode}
    unknown .code:n = { \@@_error:n { unknown-option } }
  }
\@@_msg_new:nn { unknown-option }
  { Class~ option~ "\l_keys_key_str"~ is~ unknown. }
%    \end{macrocode}
%
% 将文档类选项传给 |fdu/option|。
%    \begin{macrocode}
\ProcessKeysOptions { fdu / option }
%    \end{macrocode}
%
% 载入参数配置文件。
%    \begin{macrocode}
\file_input:n { fduthesis.def }
\@@_msg_new:nn { load-config-file }
  { You~ are~ loading~ config~ file~ "#1". }
\tl_if_empty:NF \g_@@_config_tl
  {
    \@@_info:nx { load-config-file } { \g_@@_config_tl }
    \file_input:V \g_@@_config_tl
  }
%    \end{macrocode}
%
% \subsection{载入宏包、文档类}
%
% \changes{v0.7}{2018/01/19}{使用 \cls{ctexbook} 文档类，而非直接使用
%   标准文档类 \cls{book}。}
%
% 将选项传入 \cls{ctexbook} 文档类。
%    \begin{macrocode}
% TODO: (2017-07-22) Chinese fonts in fduthesis-en
\PassOptionsToClass
  {
    UTF8,
%<class-en>    scheme     = plain,
    heading    = true,
%<class>    fontset    = none,
%<class-en>    fontset    = fandol,
    zihao      = -4,
%<class>    linespread = \c_@@_line_spread_fp,
    \g_@@_to_ctexbook_clist
  }
  { ctexbook }
%    \end{macrocode}
%
% 传入各宏包选项。
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { no-math           } { fontspec },
    { perpage           } { footmisc },
    { amsmath, thmmarks } { ntheorem }
  }
  { \PassOptionsToPackage #1 }
%    \end{macrocode}
%
% 载入 \cls{ctexbook} 文档类。
% 在使用 \XeLaTeX{} 编译时，\cls{ctexbook} 的底层将调用 \pkg{xeCJK}
% 宏包；而在使用 \LuaLaTeX{} 编译时，则将调用 \pkg{LuaTeX-ja} 宏包。
% 两种情况下 \cls{ctexbook} 均会调用 \pkg{fontspec} 宏包。
%    \begin{macrocode}
\LoadClass { ctexbook }
%    \end{macrocode}
%
% \changes{v0.4}{2017/08/13}{提供彩色支持。}
%
% 载入各宏包。其中，\pkg{amsmath} 必须在 \pkg{unicode-math} 之前引入。
%    \begin{macrocode}
\RequirePackage
  {
    amsmath,
    unicode-math,
    geometry,
    fancyhdr,
    footmisc,
    ntheorem,
    graphicx,
    longtable,
    caption,
    xcolor
  }
%    \end{macrocode}
%
% \changes{v0.8}{2021/09/16}{只检查 \cls{ctexbook} 和 \pkg{xeCJK} 的版本。}
%
% \begin{macro}{\@@_check_package:nnn,\@@_check_class:nnn}
% 检查过时宏包和文档类。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_check_package:nnn #1#2#3
  {
    \@ifpackagelater {#1} {#2}
      { } { \@@_error:nnnn { package-too-old } { Package } {#1} {#3} }
  }
\cs_new_protected:Npn \@@_check_class:nnn #1#2#3
  {
    \@ifclasslater {#1} {#2}
      { } { \@@_error:nnnn { package-too-old } { Class } {#1} {#3} }
  }
\@@_msg_new:nn { package-too-old }
  {
    #1~ "#2"~ is~ too~ old. \\
    The~ fduthesis~ class~ only~ supports~ "#2" \\
    with~ a~ version~ higher~ than~ v#3. \\\\
    Please~ update~ an~ up-to-date~ version~ of~ it \\
    using~ your~ TeX~ package~ manager~ or~ from~ CTAN.
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\@@_check_class:nnn { ctexbook } { 2021/03/14 } { 2.5.6 }
\sys_if_engine_xetex:T
  { \@@_check_package:nnn { xeCJK } { 2020/05/01 } { 3.8.3 } }
%    \end{macrocode}
%
% \subsection{页面布局}
%
% 利用 \pkg{geometry} 宏包设置纸张大小、页面边距以及页眉高度。这里，
% $\qty{2.54}{\centi\meter}=\qty{1}{in}$，
% $\qty{3.18}{\centi\meter}=\qty{1.25}{in}$。
%    \begin{macrocode}
\geometry
  {
    paper      = a4paper,
    vmargin    = 2.54 cm,
    hmargin    = 3.18 cm,
    headheight = 15 pt
  }
%    \end{macrocode}
%
% 草稿模式下显示页面边框及页眉、页脚线。
%    \begin{macrocode}
\bool_if:NT \g_@@_draft_bool { \geometry { showframe } }
%    \end{macrocode}
%
% \subsection{字体}
%
% \subsubsection{预定义字体配置}
%
% \changes{v0.7c}{2019/03/05}{重构字体配置，并兼容 macOS。}
%
% \begin{variable}{\g_@@_fontset_tl, \g_@@_cjk_fontset_tl}
% 存放字体选项值。
%    \begin{macrocode}
\tl_new:N \g_@@_fontset_tl
%<class>\tl_new:N \g_@@_cjk_fontset_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{style/font}
% \changes{v0.7c}{2019/03/05}{新增 \opt{garamond} 和 \opt{times*} 样式。}
% 预定义西文字体。
%    \begin{macrocode}
\keys_define:nn { fdu / style }
  {
    font .choices:nn =
      { garamond, libertinus, lm, palatino, times, times*, none }
      { \tl_set_eq:NN \g_@@_fontset_tl \l_keys_choice_tl },
    font .value_required:n = true,
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{style/cjk-font}
% \changes{v0.7c}{2019/03/05}{新增 \opt{sinotype} 和 \opt{sourcehan} 样式。}
% 预定义中文字体。
%    \begin{macrocode}
%<*class>
\keys_define:nn { fdu / style }
  {
    cjk-font .choices:nn =
      { adobe, fandol, founder, mac, sinotype, sourcehan, windows, none }
      { \tl_set_eq:NN \g_@@_cjk_fontset_tl \l_keys_choice_tl },
    cjk-font .value_required:n = true,
  }
%    \end{macrocode}
%</class>
% \end{macro}
%
% \begin{macro}{
%   \@@_setmainfont:nn,
%   \@@_setsansfont:nn,
%   \@@_setmonofont:nn,
%   \@@_setmathfont:nn}
% 用于设置西文字体的辅助函数，来源于 \pkg{fontspec} 和 \pkg{unicode-math}。
% \begin{arguments}
%   \item 字体名
%   \item 选项
% \end{arguments}
%    \begin{macrocode}
\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 \@@_setmathfont:nn #1#2
  { \__um_setmathfont:nn {#2} {#1} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{
%   \@@_setCJKmainfont:nn,
%   \@@_setCJKsansfont:nn,
%   \@@_setCJKmonofont:nn}
% \changes{v0.8}{2021/09/15}{展开字体族名称。}
% 用于设置中文字体的辅助函数，来源于 \pkg{xeCJK} 和 \pkg{ctex} 宏包。
%    \begin{macrocode}
%<*class>
\cs_new_protected:Npn \@@_setCJKmainfont:nn #1#2
  { \@@_set_family:xnn { \CJKrmdefault } {#2} {#1} }
\cs_new_protected:Npn \@@_setCJKsansfont:nn #1#2
  { \@@_set_family:xnn { \CJKsfdefault } {#2} {#1} }
\cs_new_protected:Npn \@@_setCJKmonofont:nn #1#2
  { \@@_set_family:xnn { \CJKttdefault } {#2} {#1} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_cjk_font_kai:nn,\fdu@kai}
% 楷体需要单独设置。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_cjk_font_kai:nn #1#2
  { \@@_set_family:nnn { fdu@kai } {#2} {#1} }
\cs_new_protected:Npn \fdu@kai
  { \@@_switch_family:n { fdu@kai } }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.7d}{2019/03/29}{在字体未提供对应粗体的情况下，允许使用伪粗。}
%
% \begin{macro}{
%   \@@_cjk_font_options:,
%   \@@_setCJKmainfont:n,
%   \@@_setCJKsansfont:n,
%   \@@_setCJKmonofont:n,
%   \@@_set_cjk_font_kai:n}
% 将 bold、italic 和 bold italic 统一按照 roman 设置。
%    \begin{macrocode}
\tl_const:Nn \@@_cjk_font_options:
 { UprightFont = *, ItalicFont = *, AutoFakeBold = true }
\cs_new_protected:Npx \@@_setCJKmainfont:n   #1
  { \@@_setCJKmainfont:nn   {#1} { \@@_cjk_font_options: } }
\cs_new_protected:Npx \@@_setCJKsansfont:n   #1
  { \@@_setCJKsansfont:nn   {#1} { \@@_cjk_font_options: } }
\cs_new_protected:Npx \@@_setCJKmonofont:n   #1
  { \@@_setCJKmonofont:nn   {#1} { \@@_cjk_font_options: } }
\cs_new_protected:Npx \@@_set_cjk_font_kai:n #1
  { \@@_set_cjk_font_kai:nn {#1} { \@@_cjk_font_options: } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_family:nnn,\@@_set_family:xnn,\@@_switch_family:n}
% 封装 CJK 字体族的设定和切换命令。
%    \begin{macrocode}
\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_generate_variant:Nn \@@_set_family:nnn { x }
%</class>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{
%   \setmainfont,
%   \setsansfont,
%   \setmonofont,
%   \setmathfont,
%   \setCJKmainfont,
%   \setCJKsansfont,
%   \setCJKmonofont}
% 重新定义以上宏包提供的字体选择命令。我们把它放在导言区末尾，使得用户配置不被
% 模板配置覆盖。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_font_helper:n #1
  {
    \exp_args:Nc \RenewDocumentCommand { set #1 font } { O { } m O { } }
      {
        \ctex_at_end_preamble:n
          { \use:c { @@_set #1 font:nn } {##2} { ##1, ##3 } }
      }
  }
\clist_map_inline:nn { main, sans, mono, math }
  { \@@_set_font_helper:n {#1} }
%<class>\clist_map_inline:nn { CJKmain, CJKsans, CJKmono }
%<class>  { \@@_set_font_helper:n {#1} }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.7e}{2019/04/10}{兼容 Libertinus 和 XITS 字体的文件名变动。}
% \changes{v0.8}{2021/09/15}{判断 Libertinus Sans Bold Oblique 字体是否存在。}
% \changes{v0.9}{2023/02/18}{不再检查 Libertinus 和 XITS 字体的文件名。}
%
% \begin{macro}{\@@_load_font_garamond:}
% EB Garamond 系列。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_font_garamond:
  {
    \@@_setmainfont:nn { EBGaramond }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Italic,
        BoldItalicFont = *-BoldItalic
      }
    \@@_setsansfont:nn { LibertinusSans }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Italic,
      }
    \@@_setmonofont:nn { lmmonolt10 }
      {
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-oblique,
        BoldItalicFont = *-boldoblique
      }
    \@@_setmathfont:nn { Garamond-Math.otf } { }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_font_libertinus:}
% Libertinus 系列。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_font_libertinus:
  {
    \@@_setmainfont:nn { LibertinusSerif }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Italic,
        BoldItalicFont = *-BoldItalic,
      }
    \@@_setsansfont:nn { LibertinusSans }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Italic,
      }
    \@@_setmonofont:nn { lmmonolt10 }
      {
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-oblique,
        BoldItalicFont = *-boldoblique
      }
    \@@_setmathfont:nn { LibertinusMath-Regular.otf } { }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_font_lm:}
% Latin Modern 系列。在 \XeLaTeX{} 和 \LuaLaTeX{} 中已作为默认字体，所以仅需
% 额外处理数学部分。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_font_lm:
  { \@@_setmathfont:nn { latinmodern-math.otf } { } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_font_palatino:}
% Palatino 系列。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_font_palatino:
  {
    \@@_setmainfont:nn { texgyrepagella }
      {
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-italic,
        BoldItalicFont = *-bolditalic
      }
    \@@_setsansfont:nn { LibertinusSans }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Italic,
        Scale          = MatchUppercase,
      }
    \@@_setmonofont:nn { lmmonolt10 }
      {
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-oblique,
        BoldItalicFont = *-boldoblique
      }
    \@@_setmathfont:nn { texgyrepagella-math.otf } { }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_font_times:}
% Times 系列。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_font_times:
  {
    \@@_setmainfont:nn { XITS }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Italic,
        BoldItalicFont = *-BoldItalic,
      }
    \@@_setsansfont:nn { texgyreheros }
      {
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-italic,
        BoldItalicFont = *-bolditalic
      }
    \@@_setmonofont:nn { texgyrecursor }
      {
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-italic,
        BoldItalicFont = *-bolditalic,
        Ligatures      = CommonOff
      }
    \@@_setmathfont:nn { XITSMath-Regular.otf }
      { BoldFont = XITSMath-Bold.otf }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_font_times*:}
% Times* 系列，除数学部分外采用系统字体。
%    \begin{macrocode}
\cs_new_protected:cpn { @@_load_font_ times* : }
  {
    \@@_setmainfont:nn { Times~ New~ Roman    } { }
    \@@_setsansfont:nn { Arial                } { }
    \@@_setmonofont:nn { Courier~ New         } { }
    \@@_setmathfont:nn { XITSMath-Regular.otf }
      { BoldFont = XITSMath-Bold.otf }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_cjk_font_adobe:}
% Adobe 字库。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_adobe:
  {
    \@@_setCJKmainfont:n   { AdobeSongStd-Light       }
    \@@_setCJKsansfont:n   { AdobeHeitiStd-Regular    }
    \@@_setCJKmonofont:n   { AdobeFangsongStd-Regular }
    \@@_set_cjk_font_kai:n { AdobeKaitiStd-Regular    }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_cjk_font_fandol:}
% Fandol 字库。注意它是安装在 TeX 发行版中的，所以使用文件名调用。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_fandol:
  {
    \@@_setCJKmainfont:nn   { FandolSong }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Regular,
        BoldItalicFont = *-Bold
      }
    \@@_setCJKsansfont:nn   { FandolHei  }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Regular,
        BoldItalicFont = *-Bold
      }
    \@@_setCJKmonofont:nn   { FandolFang }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Regular,
        ItalicFont     = *-Regular,
        BoldItalicFont = *-Regular
      }
    \@@_set_cjk_font_kai:nn { FandolKai  }
      {
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Regular,
        ItalicFont     = *-Regular,
        BoldItalicFont = *-Regular
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_cjk_font_founder:}
% 方正字库。虽然有粗体（方正小标宋）等，但并非免费，故这里不做处理。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_founder:
  {
    \@@_setCJKmainfont:n   { FZShuSong-Z01  }
    \@@_setCJKsansfont:n   { FZHei-B01      }
    \@@_setCJKmonofont:n   { FZFangSong-Z02 }
    \@@_set_cjk_font_kai:n { FZKai-Z03      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_cjk_font_mac:}
% macOS 自带中文字体。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_mac:
  {
    \@@_setCJKmainfont:nn   { STSongti-SC }
      {
        UprightFont    = *-Light,
        BoldFont       = *-Bold,
        ItalicFont     = *-Light,
        BoldItalicFont = *-Bold
      }
    \@@_setCJKsansfont:nn   { STHeitiSC   }
      {
        UprightFont    = *-Medium,
        BoldFont       = *-Medium,
        ItalicFont     = *-Medium,
        BoldItalicFont = *-Medium
      }
    \@@_setCJKmonofont:n    { STFangsong  }
    \@@_set_cjk_font_kai:nn { STKaitiSC   }
      {
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Regular,
        BoldItalicFont = *-Bold
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_cjk_font_sinotype:}
% 华文字库。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_sinotype:
  {
    \@@_setCJKmainfont:n   { STSong     }
    \@@_setCJKsansfont:n   { STHeiti    }
    \@@_setCJKmonofont:n   { STFangsong }
    \@@_set_cjk_font_kai:n { STKaiti    }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_cjk_font_sourcehan:}
% 思源宋体、思源黑体。由于没有对应的楷体和仿宋，这里直接给出警告。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_sourcehan:
  {
    \@@_setCJKmainfont:nn { SourceHanSerifSC }
      {
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Regular,
        BoldItalicFont = *-Bold
      }
    \@@_setCJKsansfont:nn { SourceHanSansSC  }
      {
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Regular,
        BoldItalicFont = *-Bold
      }
    \@@_warning:n { source-han }
  }
\@@_msg_new:nn { source-han }
  { Font~ set~ "sourcehan"~ does~ not~ contain~ kaiti~ and~ fangsong. }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_cjk_font_windows:}
% Windows 自带中文字体。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_windows:
  {
    \@@_setCJKmainfont:n   { SimSun   }
    \@@_setCJKsansfont:n   { SimHei   }
    \@@_setCJKmonofont:n   { FangSong }
    \@@_set_cjk_font_kai:n { KaiTi    }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_font:}
% 字体加载命令。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_font:
  {
    \use:c { @@_load_font_     \g_@@_fontset_tl     : }
%<class>    \use:c { @@_load_cjk_font_ \g_@@_cjk_fontset_tl : }
  }
\ctex_at_end_preamble:n { \@@_load_font: }
%    \end{macrocode}
% \end{macro}
%
%^^A 以下相关代码已在 v0.7c 中移除。
% \changes{v0.5}{2017/09/09}{重新实现字体调用。核心内容是分离字体的声明与设定，
%   并按照宋、黑、仿、楷划分中文字体。}
% \changes{v0.6}{2017/11/11}{额外处理 XITS 字体的小型大写字母。}
% \changes{v0.5}{2017/09/23}{新增 \kvopt{font}{none} 选项。}
% \changes{v0.5}{2017/09/23}{新增 \kvopt{cjk-font}{none} 选项。}
% \changes{v0.5}{2017/09/23}{同步 \pkg{fontspec} v2.6e。}
% \changes{v0.6}{2017/10/11}{同步 \pkg{unicode-math} v0.8h。}
%
% \subsubsection{数学字体设置}
%
% 根据 GB 3102.11--93 以及 ISO 80000-2:2009 的规定，数学表达式中
% 表示变量的拉丁字母和希腊字母均应当使用斜体。
% 这里的 |\keys_set:nn{unicode-math}| 实际相当于 \cs{unimathsetup}。
%    \begin{macrocode}
% TODO: (2018-01-19) Do we need `mathrm=sym`?
\keys_set:nn { unicode-math }
  {
    math-style = ISO,
    bold-style = ISO,
%   mathrm     = sym
  }
%    \end{macrocode}
%
% \subsubsection{字号}
%
% \begin{macro}{style/font-size}
% \changes{v0.9}{2023/02/08}{通过引入 \file{ctex-c5size.clo} 来修改字号。}
% |font-size| 不是文档类选项，不能传给 \cls{ctexbook} 文档类，因此
% 需要手动引入 |.clo| 文件。
%    \begin{macrocode}
\keys_define:nn { fdu / style }
  {
    font-size .choice:,
    font-size .value_required:n = true,
    font-size / -4 .code:n = { },
    font-size /  5 .code:n = { \ctex_file_input:n { ctex-c5size.clo } },
%<class-en>  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{其他设置}
%
% \begin{macro}{style/fullwidth-stop}
% \changes{v0.6}{2017/10/14}{支持类别码和 TECKit 映射两种机制。}
% 设置句号形状（圆圈或是圆点）。
%    \begin{macrocode}
%<*class>
    fullwidth-stop .choice:,
    fullwidth-stop .value_required:n = true,
%    \end{macrocode}
% 利用类别码机制切换，只有显式的\FSID 会被替换。
%    \begin{macrocode}
    fullwidth-stop / catcode .code:n =
      { \@@_set_fullwidth_stop_catcode: },
%    \end{macrocode}
% 利用 TECKit 映射机制切换，相当于设置了 \tn{defaultCJKfontfeatures}
% |{|\kvopt{Map\-ping}{fullwidth-stop}|}|。这种手段会替换所有出现的\FSID，
% 并且将影响所有字体。只在 \XeTeX{} 下可用。
%    \begin{macrocode}
    fullwidth-stop / mapping .code:n =
      {
        \sys_if_engine_xetex:TF
          {
            \clist_gset:Nn \g__xeCJK_default_features_clist
              { Mapping = fullwidth-stop }
          }
          {
%    \end{macrocode}
% \LuaTeX{} 下改用类别码机制代替，并给出警告。
%    \begin{macrocode}
            \sys_if_engine_luatex:T
              {
                \@@_warning:n { mapping-not-available }
                \@@_set_fullwidth_stop_catcode:
              }
          }
      },
    fullwidth-stop / false .code:n = { }
  }
%    \end{macrocode}
% \end{macro}
% 提示信息。
%    \begin{macrocode}
\@@_msg_new:nn { mapping-not-available }
  {
    Option~ "fullwidth-stop = mapping"~ is~ not~ available~ in~ LuaTeX. \\
    "fullwidth-stop = catcode"~ will~ be~ set~ instead.
  }
%    \end{macrocode}
%
% \begin{macro}{\@@_set_fullwidth_stop_catcode:}
% \changes{v0.8}{2021/09/16}{将类别码设置应用于预定义的文本中，并优化实现。}
% 将\FSID 设置为活动符，并定义为句点\FSFW。
%    \begin{macrocode}
\cs_new:Npn \@@_set_fullwidth_stop_catcode:
  {
    \char_set_active_eq:NN ^^^^3002 \c_@@_fwid_full_stop_tl
    \char_set_catcode_active:N ^^^^3002
    \clist_map_inline:nn
      { \c_@@_orig_decl_text_tl, \c_@@_auth_decl_text_tl }
      { \tl_set_rescan:Nno ##1 { } {##1} }
  }
%</class>
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.8}{2021/09/15}{允许 \tn{emph} 对中文生效。}
%
% 声明 \tn{emph} 样式序列，使得中文强调以楷体显示。
%    \begin{macrocode}
%<*class>
\DeclareEmphSequence
  {
    \itshape \fdu@kai,
    \upshape \CJKfamily { \CJKfamilydefault },
  }
%</class>
%    \end{macrocode}
%
% \changes{v0.6}{2017/10/28}{优化 \LuaTeX{} 下希腊字母、西里尔字母和带圈数字的
%   显示（\pkg{ctex} v2.4.11 已默认进行处理）。}
%
% \subsection{页眉页脚}
%
% 清除默认页眉页脚格式。
%    \begin{macrocode}
\fancyhf { }
%    \end{macrocode}
%
% \begin{macro}{\@@_fancy_head:nn}
% 页眉样式。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_fancy_head:nn #1#2
  {
    \fancyhead [#1]
%<class>      { \small \fdu@kai \nouppercase {#2} }
%<class-en>      { \small \itshape \nouppercase {#2} }
  }
%    \end{macrocode}
% \end{macro}
%
% 构建页眉，要在单面或双面下分别设置。
%
% \cs{fancyhead} 的选项中，\opt{E} 和 \opt{O} 分别表示偶数（even）和奇数（odd）， 而 \opt{L}、
% \opt{R} 和 \opt{C} 则分别表示左（left）、右（right）和中间（center）。按照通常的排版规则，
% 双面模式下，偶数页的中间页眉文字在左，奇数页则在右；单面模式下，左右页眉都会显示。
%    \begin{macrocode}
\bool_if:NTF \g_@@_twoside_bool
  {
    \@@_fancy_head:nn { EL } { \leftmark  }
    \@@_fancy_head:nn { OR } { \rightmark }
  }
  {
    \@@_fancy_head:nn { L  } { \leftmark  }
    \@@_fancy_head:nn { R  } { \rightmark }
  }
%    \end{macrocode}
%
% 构建页脚，用来显示页码。选项 \opt{C} 表示居中（center）。
%    \begin{macrocode}
\fancyfoot [ C ] { \small \thepage }
%    \end{macrocode}
%
% 关闭横线显示（未启用）。
%    \begin{macrocode}
% \RenewDocumentCommand \headrulewidth { } { 0 pt }
%    \end{macrocode}
%
% \begin{macro}{\cleardoublepage}
% 重定义 \tn{cleardoublepage}，使得偶数页面在没有内容时也不显示页眉页脚，见
% \url{https://tex.stackexchange.com/a/1683}。
%    \begin{macrocode}
\RenewDocumentCommand \cleardoublepage { }
  {
    \clearpage
    \bool_if:NT \g_@@_twoside_bool
      {
        \int_if_odd:nF \c@page
          { \hbox:n { } \thispagestyle { empty } \newpage }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \pkg{ctex} 宏包使用 \opt{heading} 选项后，会把页面格式设置为 |headings|。
% 因此必须在 \pkg{ctex} 调用之后重新设置 \cs{pagestyle} 为 |fancy|。
%    \begin{macrocode}
\pagestyle { fancy }
%    \end{macrocode}
%
% \subsection{章节标题结构}
%
% |\keys_set:nn{ctex}| 实际相当于 \cs{ctexset}。
%    \begin{macrocode}
\keys_set:nn { ctex }
  {
%    \end{macrocode}
% 设置章（chapter）、节（section）与小节（sub-section）标题样式。
% 此处使用 \kvopt{fixskip}{true} 选项来抑制前后的多余间距。
%    \begin{macrocode}
    chapter =
      {
%<class>        format      = \huge \normalfont \sffamily \centering,
%<*class-en>
        format      = \centering,
        nameformat  = \LARGE \bfseries,
        titleformat = \huge \bfseries,
        aftername   = \par \nobreak \vskip 10 pt,
%</class-en>
        beforeskip  = 50 pt,
        afterskip   = 40 pt,
        number      = \@@_arabic:n { chapter },
        fixskip     = true
      },
    section =
      {
%<class>        format      = \Large \normalfont \sffamily \raggedright,
%<class-en>        format      = \Large \bfseries \raggedright,
        beforeskip  = 3.5 ex plus 1.0 ex minus 0.2 ex,
        afterskip   = 2.7 ex plus 0.5 ex,
        fixskip     = true
      },
    subsection =
      {
%<class>        format      = \large \normalfont \sffamily \raggedright,
%<class-en>        format      = \large \bfseries \raggedright,
        beforeskip  = 3.25 ex plus 1.0 ex minus 0.2 ex,
        afterskip   = 2.5  ex plus 0.3 ex,
        fixskip     = true
      }
  }
%    \end{macrocode}
%
% \changes{v0.7d}{2019/03/24}{优化目录、摘要、参考文献等的标题实现。}
% \changes{v0.9}{2023/02/05}{在目录和书签中删除章标题中的 \tn{quad}。}
%
% \begin{macro}{\@@_sanitize_chapter_title:n}
% 删除章标题中的 \tn{quad}。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_sanitize_chapter_title:n #1
  {
    \tl_clear:N \l_@@_tmpa_tl
    \tl_set:No \l_@@_tmpa_tl {#1}
    \tl_remove_all:Nn \l_@@_tmpa_tl { \quad }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_chapter:n,\@@_chapter:V}
% 手动生成章的标题，用于摘要、参考文献等。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_chapter:n #1
  {
    \@@_sanitize_chapter_title:n {#1}
    \group_begin:
      \ctexset { chapter / numbering = false }
      \chapter [ \l_@@_tmpa_tl ] {#1}
    \group_end:
    \@@_chapter_header:n {#1}
  }
\cs_generate_variant:Nn \@@_chapter:n { V }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_chapter_no_toc:n,\@@_chapter_no_toc:V}
% 目录自身不出现在目录中，需特别处理。参考
% \url{https://tex.stackexchange.com/a/1821}。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_chapter_no_toc:n #1
  {
    \chapter * {#1}
    \@@_sanitize_chapter_title:n {#1}
    \pdfbookmark [0] { \l_@@_tmpa_tl } { toc }
    \@@_chapter_header:n {#1}
  }
\cs_generate_variant:Nn \@@_chapter_no_toc:n { V }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_chapter_header:n}
% \changes{v0.8}{2022/01/18}{简化单页模式下页眉的实现方式。}
% 单页模式下，目录、摘要、符号表等的页眉中间为相应标题，左右为空。这里通过居中的
% \tn{leftmark} 实现。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_chapter_header:n #1
  {
    \bool_if:NTF \g_@@_twoside_bool
      { \markboth {#1} {#1} }
      { \markboth { \hfill #1 \hfill } { } }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{脚注}
%
% \changes{v0.3}{2017/02/21}{支持脚注。}
%
% \subsubsection{编号样式}
%
% 各种脚注编号样式的名称。
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { plain           } { plain           },
    { libertinus      } { libertinus      },
    { libertinus_neg  } { libertinus*     },
    { libertinus_sans } { libertinus-sans },
    { pifont          } { pifont          },
    { pifont_neg      } { pifont*         },
    { pifont_sans     } { pifont-sans     },
    { pifont_sans_neg } { pifont-sans*    },
    { xits            } { xits            },
    { xits_sans       } { xits-sans       },
    { xits_sans_neg   } { xits-sans*      }
  }
  { \@@_define_fn_style:nn #1 }
%    \end{macrocode}
%
% \begin{variable}{\l_@@_fn_style_tl}
% 保存当前使用的脚注编号样式。
%    \begin{macrocode}
\tl_new:N \l_@@_fn_style_tl
%    \end{macrocode}
% \end{variable}
%
%    \begin{macrocode}
\keys_define:nn { fdu / style }
  {
%    \end{macrocode}
%
% \begin{macro}{style/footnote-style}
% 脚注类型共分四大类：
% \begin{itemize}
%   \item \opt{plain}：使用当前字体；
%   \item \opt{libertinus}：取自 Libertinus Serif 和 Libertinus Sans
%     字体；
%   \item \opt{pifont}：使用 \pkg{pifont} 宏包；
%   \item \opt{xits}：取自 XITS 字体。
% \end{itemize}
% 不带任何修饰的为衬线阳文符号，带“|sans|”的为无衬线符号，带“|*|”的
% 为阴文版本。
%    \begin{macrocode}
    footnote-style .choices:nn =
      {
        plain,
        libertinus, libertinus*, libertinus-sans,
        pifont,     pifont*,     pifont-sans,     pifont-sans*,
        xits,                    xits-sans,       xits-sans*
      }
%    \end{macrocode}
% \changes{v0.6}{2017/11/12}{不再依赖 XITS-Math 字体。}
% 若使用 \opt{pifont} 类型，则需引入 \pkg{pifont} 宏包。
%    \begin{macrocode}
      {
        \tl_gset_eq:NN \l_@@_fn_style_tl \l_keys_choice_tl
        \int_compare:nT { 5 <= \l_keys_choice_int <= 8 }
          { \RequirePackage { pifont } }
      },
    footnote-style .value_required:n = true
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_libertinus:n}
% \opt{libertinus} 普通版。\numrange{1}{20} 为数字，\numrange{21}{46}
% 为小写英文字母，\numrange{47}{72} 为大写英文字母。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_libertinus:n #1
  {
    \int_compare:nTF { #1 >= 21 }
      {
        \int_compare:nTF { #1 >= 47 }
          { \@@_symbol:n { \int_eval:n { "24B6 - 47 + #1 } } }
          { \@@_symbol:n { \int_eval:n { "24D0 - 21 + #1 } } }
      }
      { \@@_symbol:n { \int_eval:n { "2460 - 1 + #1 } } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_libertinus_neg:n}
% \opt{libertinus} 阴文衬线版。只含 \numrange{1}{20}。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_libertinus_neg:n #1
  {
    \int_compare:nTF { #1 >= 11 }
      { \@@_symbol:n { \int_eval:n { "24EB - 11 + #1 } } }
      { \@@_symbol:n { \int_eval:n { "2776 -  1 + #1 } } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_pifont:n}
% \opt{pifont} 普通版。以下四种都只包含 \numrange{1}{10}。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_pifont:n #1
  { \ding { \int_eval:n { 171 + #1 } } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_pifont_neg:n}
% \opt{pifont} 阴文衬线版。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_pifont_neg:n #1
  { \ding { \int_eval:n { 181 + #1 } } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_pifont_sans:n}
% \opt{pifont} 阳文无衬线版。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_pifont_sans:n #1
  { \ding { \int_eval:n { 191 + #1 } } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_pifont_sans_neg:n}
% \opt{pifont} 阴文无衬线版。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_pifont_sans_neg:n #1
  { \ding { \int_eval:n { 201 + #1 } } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_xits:n}
% \opt{xits} 普通版。\numrange{1}{9} 为数字，\numrange{10}{35}
% 为小写英文字母，\numrange{36}{61} 为大写英文字母。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_xits:n #1
  {
    \int_compare:nTF { #1 >= 10 }
      {
        \int_compare:nTF { #1 >= 36 }
          { \@@_symbol:n { \int_eval:n { "24B6 - 36 + #1 } } }
          { \@@_symbol:n { \int_eval:n { "24D0 - 10 + #1 } } }
      }
      { \@@_symbol:n { \int_eval:n { "2460 - 1 + #1 } } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_xits_sans:n}
% \opt{xits} 阳文无衬线版。只包含 \numrange{1}{10}。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_xits_sans:n #1
  { \@@_symbol:n { \int_eval:n { "2780 - 1 + #1 } } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fn_symbol_xits_sans_neg:n}
% \opt{xits} 阴文无衬线版。也只包含 \numrange{1}{10}。
%    \begin{macrocode}
\cs_new:Npn \@@_fn_symbol_xits_sans_neg:n #1
  { \@@_symbol:n { \int_eval:n { "278A - 1 + #1 } } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thefootnote}
% \changes{v0.7}{2018/01/17}{改为可完全展开的命令。}
% 重定义脚注编号。
%    \begin{macrocode}
\cs_set:Npn \thefootnote { \fdu_footnote_number:N \c@footnote }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\fdu_footnote_number:N}
% 脚注编号样式。
%    \begin{macrocode}
\cs_new:Npn \fdu_footnote_number:N #1
  {
    \tl_case:NnF \l_@@_fn_style_tl
      {
%    \end{macrocode}
% \opt{plain} 类型直接使用计数器 |footnote| 的值。
%    \begin{macrocode}
        \c_@@_fn_style_plain_tl
          { \int_use:N #1 }
%    \end{macrocode}
% \opt{libertinus} 类型需要使用 Libertinus Serif 或
% Libertinus Sans 字体。
%    \begin{macrocode}
        \c_@@_fn_style_libertinus_tl
          {
            \fontspec { LibertinusSerif-Regular.otf }
            \@@_fn_symbol_libertinus:n {#1}
          }
        \c_@@_fn_style_libertinus_neg_tl
          {
            \fontspec { LibertinusSerif-Regular.otf }
            \@@_fn_symbol_libertinus_neg:n {#1}
          }
        \c_@@_fn_style_libertinus_sans_tl
          {
            \fontspec { LibertinusSans-Regular.otf }
            \@@_fn_symbol_libertinus:n {#1}
          }
%    \end{macrocode}
% \opt{pifont} 类型无需进行额外的操作。
%    \begin{macrocode}
        \c_@@_fn_style_pifont_tl
          { \@@_fn_symbol_pifont:n {#1} }
        \c_@@_fn_style_pifont_neg_tl
          { \@@_fn_symbol_pifont_neg:n {#1} }
        \c_@@_fn_style_pifont_sans_tl
          { \@@_fn_symbol_pifont_sans:n {#1} }
        \c_@@_fn_style_pifont_sans_neg_tl
          { \@@_fn_symbol_pifont_sans_neg:n {#1} }
%    \end{macrocode}
% \opt{xits} 类型需要临时切换数学字体。
%    \begin{macrocode}
        \c_@@_fn_style_xits_tl
          {
            \fontspec { XITS-Regular.otf }
            \@@_fn_symbol_xits:n {#1}
          }
        \c_@@_fn_style_xits_sans_tl
          {
            \fontspec { XITS-Regular.otf }
            \@@_fn_symbol_xits_sans:n {#1}
          }
        \c_@@_fn_style_xits_sans_neg_tl
          {
            \fontspec { XITS-Regular.otf }
            \@@_fn_symbol_xits_sans_neg:n {#1}
          }
      }
%    \end{macrocode}
% 变量 \cs{l_@@_fn_style_tl} 保存的类型未知时，默认使用 \opt{plain}
% 类型。
%    \begin{macrocode}
      { \int_use:N #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{整体样式}
%
% \begin{macro}[int]{\@makefntext}
% \changes{v0.7}{2018/01/18}{简化实现，兼容 \pkg{fancyvrb} 宏包。
%   不再使用悬挂缩进。}
% 重定义内部脚注文字命令，使脚注编号不使用上标，宽度为 \qty{1.5}{em}。
% 见 \url{http://tex.stackexchange.com/q/19844} 和
% \url{https://www.zhihu.com/question/53030087}。
%    \begin{macrocode}
\cs_set:Npn \@makefntext #1
  {
    \mode_leave_vertical:
    \hbox_to_wd:nn { 1.5 em } { \@thefnmark \hfil }
    #1
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{定理环境}
%
% \changes{v0.3}{2017/05/07}{新增定理环境。}
%
% \begin{variable}{\c_@@_thm_style_plain_clist,
%   \c_@@_thm_style_break_clist}
% 保存 \opt{plain}、\opt{break} 两种类型的定理样式名称。
%    \begin{macrocode}
\clist_const:Nn \c_@@_thm_style_plain_clist
  { plain, margin, change }
\clist_const:Nn \c_@@_thm_style_break_clist
  { break, marginbreak, changebreak }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_thm_style_tl,
%   \l_@@_thm_header_font_tl,
%   \l_@@_thm_body_font_tl,
%   \l_@@_thm_qed_tl,
%   \l_@@_thm_counter_tl}
% 定理所需的一些字段。
%    \begin{macrocode}
\tl_new:N \l_@@_thm_style_tl
\tl_new:N \l_@@_thm_header_font_tl
\tl_new:N \l_@@_thm_body_font_tl
\tl_new:N \l_@@_thm_qed_tl
\tl_new:N \l_@@_thm_counter_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{theorem/style,
%   theorem/header-font,
%   theorem/body-font,
%   theorem/qed,
%   theorem/counter}
% 定义 |fdu/theorem| 键值类。
%    \begin{macrocode}
\keys_define:nn { fdu / theorem }
  {
    style       .tl_set:N  = \l_@@_thm_style_tl,
    header-font .tl_set:N  = \l_@@_thm_header_font_tl,
    body-font   .tl_set:N  = \l_@@_thm_body_font_tl,
    qed         .tl_set:N  = \l_@@_thm_qed_tl,
    counter     .tl_set:N  = \l_@@_thm_counter_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_thm_ntheorem_style:n,\@@_thm_ntheorem_new:w}
% 拷贝 \pkg{ntheorem} 命令。
%    \begin{macrocode}
\cs_new_eq:NN \@@_thm_ntheorem_style:n \theoremstyle
\cs_new_eq:NN \@@_thm_ntheorem_new:w   \newtheorem
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.7}{2017/12/12}{原 \cs{fdunewtheorem} 命令更名为
%   \cs{new\-the\-orem}。}
%
% \begin{macro}{\newtheorem}
% \changes{v0.9}{2023/02/08}{改用 \cs{DeclareDocumentCommand} 定义。}
% 定义新的定理环境。
%    \begin{macrocode}
\DeclareDocumentCommand \newtheorem { s o m m }
  {
%    \end{macrocode}
% 默认情况下，由 \cs{newtheorem*} 创建的定理其证毕符号为 \cs{QED}，
% 而由 \cs{new\-the\-orem} 创建的则不带证毕符号。符号 \cs{QED} 由
% \pkg{unicode-math} 宏包提供。
%    \begin{macrocode}
    \IfBooleanTF {#1}
      { \tl_set:Nn \l_@@_thm_qed_tl { \ensuremath { \QED } } }
      { \tl_set:Nn \l_@@_thm_qed_tl { } }
%    \end{macrocode}
% 设置默认样式为 \opt{plain}。
%    \begin{macrocode}
% TODO: (2017-12-07) Move to interface
    \tl_set:Nn \l_@@_thm_style_tl { plain }
%    \end{macrocode}
% 处理可选参数。利用 |fdu/theorem| 键值对设置，并按此修改证毕符号、
% 定理头字体和定理正文字体。
%    \begin{macrocode}
    \IfValueT {#2} { \keys_set:nn { fdu / theorem } {#2} }
    \fdu_thm_set_header_font:V \l_@@_thm_header_font_tl
    \fdu_thm_set_body_font:V   \l_@@_thm_body_font_tl
    \fdu_thm_set_qed:V         \l_@@_thm_qed_tl
%    \end{macrocode}
% \cs{newtheorem} 负责创建编号定理，而 \cs{newtheorem*}
% 则负责创建无编号定理。以下分这两种情况处理。
%    \begin{macrocode}
    \IfBooleanTF {#1}
      {
%    \end{macrocode}
% 带 |*| 的版本原则上只接受 \opt{plain} 和 \opt{break} 两种样式，
% 其余样式将被转换成这两者其中之一。
%    \begin{macrocode}
        \clist_if_in:nVF { plain, break } \l_@@_thm_style_tl
          {
            \clist_if_in:NVTF
              \c_@@_thm_style_plain_clist \l_@@_thm_style_tl
              { \@@_thm_redefine_style:n { plain } }
              {
                \clist_if_in:NVTF
                  \c_@@_thm_style_break_clist \l_@@_thm_style_tl
                  { \@@_thm_redefine_style:n { break } }
                  {
                    \@@_error:nx { unknown-theorem-style }
                      { \l_@@_thm_style_tl }
                  }
              }
          }
%    \end{macrocode}
% \pkg{ntheorem} 宏包提供的无编号定理带有 |nonumber| 前缀，
% 这里将其加上。
%    \begin{macrocode}
        \tl_put_left:Nn \l_@@_thm_style_tl { nonumber }
        \fdu_thm_new_no_number:Vxx \l_@@_thm_style_tl {#3} {#4}
      }
      {
%    \end{macrocode}
% 不带 |*| 的版本支持不含“|nonumber|”的所有定理样式。
%    \begin{macrocode}
        \clist_clear:N \l_@@_tmpa_clist
        \clist_concat:NNN \l_@@_tmpa_clist
          \c_@@_thm_style_plain_clist \c_@@_thm_style_break_clist
        \clist_if_in:NVF \l_@@_tmpa_clist \l_@@_thm_style_tl
          {
            \@@_error:nx { unknown-theorem-style }
              { \l_@@_thm_style_tl }
          }
        \fdu_thm_new:VVxx \l_@@_thm_style_tl \l_@@_thm_counter_tl
          {#3} {#4}
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_thm_redefine_style:n}
% 重定义定理样式，并给出警告。
%    \begin{macrocode}
\cs_new:Npn \@@_thm_redefine_style:n #1
  {
    \@@_warning:nxx { redefine-theorem-style }
      {#1} { \l_@@_thm_style_tl }
    \tl_set:Nn \l_@@_thm_style_tl {#1}
  }
%    \end{macrocode}
% \end{macro}
%
% 提示信息。
%    \begin{macrocode}
\@@_msg_new:nn { redefine-theorem-style }
  { Theorem~ style~ "#2"~ will~ be~ redefined~ as~ "#1". }
\@@_msg_new:nn { unknown-theorem-style }
  { Theorem~ style~ "#1"~ is~ unknown. }
%    \end{macrocode}
%
% \begin{macro}{\fdu_thm_new:nnnn,\fdu_thm_new:VVxx}
% 带编号的定理环境。
% \begin{arguments}
%   \item 样式
%   \item 计数器
%   \item 定理环境名称
%   \item 定理头文字
% \end{arguments}
%    \begin{macrocode}
\cs_new:Npn \fdu_thm_new:nnnn #1#2#3#4
  {
    \@@_thm_ntheorem_style:n {#1}
    \@@_thm_ntheorem_new:w   {#3} {#4} [#2]
  }
\cs_generate_variant:Nn \fdu_thm_new:nnnn { VVxx }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\fdu_thm_new_no_number:nnn,
%   \fdu_thm_new_no_number:Vxx}
% 不带编号的定理环境。
% \begin{arguments}
%   \item 样式
%   \item 定理环境名称
%   \item 定理头文字
% \end{arguments}
%    \begin{macrocode}
\cs_new:Npn \fdu_thm_new_no_number:nnn #1#2#3
  {
    \@@_thm_ntheorem_style:n {#1}
    \@@_thm_ntheorem_new:w   {#2} {#3}
  }
\cs_generate_variant:Nn \fdu_thm_new_no_number:nnn { Vxx }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\fdu_thm_set_qed:n,
%   \fdu_thm_set_header_font:n,
%   \fdu_thm_set_body_font:n,
%   \fdu_thm_set_qed:V,
%   \fdu_thm_set_header_font:V,
%   \fdu_thm_set_body_font:V}
% 封装 \pkg{ntheorem} 宏包提供的若干命令，分别用以设置证毕符号、
% 定理头字体和定理正文字体。
%    \begin{macrocode}
\cs_new:Npn \fdu_thm_set_qed:n         #1 { \theoremsymbol     {#1} }
\cs_new:Npn \fdu_thm_set_header_font:n #1 { \theoremheaderfont {#1} }
\cs_new:Npn \fdu_thm_set_body_font:n   #1 { \theorembodyfont   {#1} }
\cs_generate_variant:Nn \fdu_thm_set_qed:n         { V }
\cs_generate_variant:Nn \fdu_thm_set_header_font:n { V }
\cs_generate_variant:Nn \fdu_thm_set_body_font:n   { V }
%    \end{macrocode}
% \end{macro}
%
% \subsection{图表绘制；浮动体}
%
% \changes{v0.3}{2017/07/09}{支持浮动体。}
%
% 分别设置浮动体 \env{figure} 和 \env{table} 的标题样式。
%    \begin{macrocode}
\captionsetup [ figure ] { font = small,         labelsep = quad }
\captionsetup [ table  ] { font = { small, sf }, labelsep = quad }
%    \end{macrocode}
%
% \begin{macro}{\thefigure,\thetable}
% \changes{v0.7}{2018/01/17}{改为可完全展开的命令。}
% \changes{v0.8}{2021/03/10}{直接调用 \tn{thechapter} 使得附录中的图表编号正确显示。}
% 重定义图表编号。
%    \begin{macrocode}
\cs_set:Npn \thefigure
  { \thechapter - \@@_arabic:n { figure } }
\cs_set:Npn \thetable
  { \thechapter - \@@_arabic:n { table  } }
%    \end{macrocode}
% \end{macro}
%
% \subsection{封面}
%
% \subsubsection{信息录入}
%
% \begin{variable}{\l_@@_info_title_tl,
%   \l_@@_info_date_tl,
%   \l_@@_info_author_tl,
%   \l_@@_info_supervisor_tl,
%   \l_@@_info_department_tl,
%   \l_@@_info_major_tl,
%   \l_@@_info_student_id_tl,
%   \l_@@_info_school_id_tl,
%   \l_@@_info_clc_tl,
%   \l_@@_info_jel_tl,
%   \l_@@_info_instructors_clist,
%   \l_@@_info_keywords_clist}
% 封面所需的一些字段。
%    \begin{macrocode}
\clist_map_inline:nn
  {
    title, date, author, supervisor, department, major, student_id,
    school_id, clc, jel
  }
  { \tl_new:c { l_@@_info_ #1 _tl } }
\clist_new:N \l_@@_info_instructors_clist
\clist_new:N \l_@@_info_keywords_clist
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_info_title_en_tl,
%   \l_@@_info_author_en_tl,
%   \l_@@_info_supervisor_en_tl,
%   \l_@@_info_department_en_tl,
%   \l_@@_info_major_en_tl,
%   \l_@@_info_keywords_en_clist}
% 对应的英文字段。
%    \begin{macrocode}
\clist_map_inline:nn
  { title, author, supervisor, department, major }
  { \tl_new:c { l_@@_info_ #1 _en_tl } }
\clist_new:N \l_@@_info_keywords_en_clist
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_info_degree_type_tl}
% 学位类型。
%    \begin{macrocode}
\tl_new:N \l_@@_info_degree_type_tl
%    \end{macrocode}
% \end{variable}
%
% \changes{v0.9}{2023/02/12}{删除论文标题中的 \tn{\textbackslash} 和汉字间的空格。}
% 
% \begin{variable}{\l_@@_info_title_sanitized_tl,\l_@@_info_title_en_sanitized_tl}
% 处理后的论文标题。
%    \begin{macrocode}
\tl_new:N \l_@@_info_title_sanitized_tl
\tl_new:N \l_@@_info_title_en_sanitized_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_set_title:nn}
% 设置论文标题，并删除其中的 |\\| 和汉字间的空格。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_title:nn #1#2
  {
    \tl_set:cn { l_@@_info_ #1 _tl           } {#2}
    \tl_set:cn { l_@@_info_ #1 _sanitized_tl } {#2}
    \tl_replace_all:cnn { l_@@_info_ #1 _sanitized_tl } { \\ } { ~ }
    \regex_replace_all:nnc
      { \s+ } { \ }
      { l_@@_info_ #1 _sanitized_tl }
    \regex_replace_all:nnc
      { ([\x{4e00}-\x{9fff}]) \s+ ([\x{4e00}-\x{9fff}]) } { \1 \2 }
      { l_@@_info_ #1 _sanitized_tl }
  }
%    \end{macrocode}
% \end{macro}
%
% 定义 |fdu/info| 键值类。
%    \begin{macrocode}
\keys_define:nn { fdu / info }
  {
%    \end{macrocode}
%
% \changes{v0.7}{2018/02/01}{新增 \opt{info/degree} 选项。}
%
% \begin{macro}{info/degree}
% 学位类型。只对硕士论文有效。
%    \begin{macrocode}
    degree      .choices:nn  =
      { academic, professional }
      { \tl_set_eq:NN \l_@@_info_degree_type_tl \l_keys_choice_tl },
    degree      .value_required:n = true,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/title,info/title*}
% 论文题目。以下带星号的项目均表示相应的英文字段。
%    \begin{macrocode}
    title       .code:n      = { \@@_set_title:nn { title    } {#1} },
    title*      .code:n      = { \@@_set_title:nn { title_en } {#1} },
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/date}
% 论文完成日期。
%    \begin{macrocode}
    date        .tl_set:N    = \l_@@_info_date_tl,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/author,info/author*}
% 作者姓名。
%    \begin{macrocode}
    author      .tl_set:N    = \l_@@_info_author_tl,
    author*     .tl_set:N    = \l_@@_info_author_en_tl,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/supervisor,info/supervisor*}
% 导师姓名。
%    \begin{macrocode}
    supervisor  .tl_set:N    = \l_@@_info_supervisor_tl,
%   supervisor* .tl_set:N    = \l_@@_info_supervisor_en_tl,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/instructors}
% 指导小组成员。
%    \begin{macrocode}
    instructors .clist_set:N = \l_@@_info_instructors_clist,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/department,info/department*}
% 院系。
%    \begin{macrocode}
    department  .tl_set:N    = \l_@@_info_department_tl,
%   department* .tl_set:N    = \l_@@_info_department_en_tl,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/major,info/major*}
% 专业。
%    \begin{macrocode}
    major       .tl_set:N    = \l_@@_info_major_tl,
%   major*      .tl_set:N    = \l_@@_info_major_en_tl,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/student-id}
% 学号。
%    \begin{macrocode}
    student-id  .tl_set:N    = \l_@@_info_student_id_tl,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/school-id}
% 学校代码。
%    \begin{macrocode}
    school-id   .tl_set:N    = \l_@@_info_school_id_tl,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/keywords,info/keywords*}
% 论文关键词。
%    \begin{macrocode}
    keywords    .clist_set:N = \l_@@_info_keywords_clist,
    keywords*   .clist_set:N = \l_@@_info_keywords_en_clist,
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.8}{2021/09/16}{新增 \opt{info/jel} 选项。}
%
% \begin{macro}{info/clc,info/jel}
% 中图分类号和 JEL 分类号。
%    \begin{macrocode}
    clc         .tl_set:N    = \l_@@_info_clc_tl,
    jel         .tl_set:N    = \l_@@_info_jel_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.4}{2017/08/10}{新增 \opt{style/logo} 与
%   \opt{style/logo-size} 选项。}
%
% \begin{variable}{\l_@@_cover_logo_tl,\l_@@_cover_logo_size_clist}
%    \begin{macrocode}
\tl_new:N    \l_@@_cover_logo_tl
\clist_new:N \l_@@_cover_logo_size_clist
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{style/logo,style/logo-size}
% 校名图片的文件名和尺寸。
%    \begin{macrocode}
\keys_define:nn { fdu / style }
  {
    logo      .tl_set:N    = \l_@@_cover_logo_tl,
    logo-size .clist_set:N = \l_@@_cover_logo_size_clist
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{密级}
%
% \changes{v0.3}{2017/07/04}{新增 \opt{info/secret-level} 与
%   \opt{info/secret-year} 选项。}
%
% \begin{variable}{\l_@@_info_secret_level_tl}
% 保存当前的密级。
%    \begin{macrocode}
\tl_new:N \l_@@_info_secret_level_tl
%    \end{macrocode}
% \end{variable}
%
%    \begin{macrocode}
\keys_define:nn { fdu / info }
  {
%    \end{macrocode}
%
% \begin{macro}{info/secret-level}
% \changes{v0.6}{2017/11/11}{不再依赖 XITS-Math 字体。}
% 密级。\opt{none} 表示不涉密，\opt{i}、\opt{ii}、\opt{iii} 分别为
% 秘密、机密、绝密。
%    \begin{macrocode}
    secret-level .choices:nn  =
      { none, i, ii, iii }
      { \tl_set_eq:NN \l_@@_info_secret_level_tl \l_keys_choice_tl },
    secret-level .value_required:n = true,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/secret-year}
% 保密年限。
%    \begin{macrocode}
    secret-year  .tl_set:N = \l_@@_info_secret_year_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{定义内部函数}
%
% \begin{macro}{\@@_spread_box:nn,\@@_spread_box:no}
% 分散对齐的水平盒子。
% \begin{arguments}
%   \item 宽度
%   \item 内容
% \end{arguments}
% 利用 \cs{tl_map_inline:nn} 在字符间插入 \tn{hfil}；紧随其后的 \tn{unskip}
% 将会去掉最后一个 \tn{hfil}。见 \url{https://tex.stackexchange.com/q/169689}。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_spread_box:nn #1#2
  {
    \mode_leave_vertical:
    \hbox_to_wd:nn {#1} { \tl_map_inline:nn {#2} { ##1 \hfil } \unskip }
  }
\cs_generate_variant:Nn \@@_spread_box:nn { no }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_center_box:nn,\@@_center_box:Vn}
% 居中对齐的水平盒子。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_center_box:nn #1#2
  {
    \mode_leave_vertical:
    \hbox_to_wd:nn {#1} { \hfil #2 \hfil }
  }
\cs_generate_variant:Nn \@@_center_box:nn { Vn }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fixed_width_box:nn}
% 限宽盒子（允许换行）。
%    \begin{macrocode}
\cs_new:Npn \@@_fixed_width_box:nn #1#2
  { \parbox {#1} {#2} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fixed_width_center_box:nn}
% 居中对齐的限宽盒子（允许换行）。
%    \begin{macrocode}
\cs_new:Npn \@@_fixed_width_center_box:nn #1#2
  { \parbox {#1} { \centering #2 } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_get_text_width:Nn,\@@_get_text_width:NV}
% 获取文本宽度，并存入 |dim| 型变量。
% \begin{arguments}
%   \item |dim| 型变量
%   \item 内容
% \end{arguments}
%    \begin{macrocode}
\cs_new:Npn \@@_get_text_width:Nn #1#2
  {
    \hbox_set:Nn \l_@@_tmpa_box {#2}
    \dim_set:Nn #1 { \box_wd:N \l_@@_tmpa_box }
  }
\cs_generate_variant:Nn \@@_get_text_width:Nn { NV }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_blank_underline:n}
% \changes{v0.4}{2017/08/14}{改用 \tn{rule} 绘制下划线，不再依赖
%   \pkg{ulem} 宏包。}
% 下划线占位符。|#1|: 长度。
%    \begin{macrocode}
\cs_new:Npn \@@_blank_underline:n #1
  { \rule [ -0.5 ex ] {#1} { 0.4 pt } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_line_spread:N,\@@_line_spread:n}
% 设置行距。|#1|: 行距倍数 |fp| 变量。
%    \begin{macrocode}
\cs_new:Npn \@@_line_spread:N #1
  { \linespread { \fp_use:N #1 } \selectfont }
\cs_new:Npn \@@_line_spread:n #1
  { \linespread {#1} \selectfont }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{封面各部件}
%
% \changes{v0.5}{2017/09/19}{使用 \pkg{expl3} 以及内部函数改写
%   封面，减少对 \LaTeXe{} 的依赖。}
%
% \begin{macro}{\@@_cover_id:,\@@_cover_id_tabular:n,\@@_cover_id_aux:n}
% 右上角的密级、学校代码和学号。
% \changes{v0.9a}{2023/05/21}{封面密级、学校代码和学号改用表格实现。}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cover_id:
  {
    \tl_if_eq:NnTF \l_@@_info_secret_level_tl { none }
      { \@@_cover_id_tabular:n { } }
      { \@@_cover_id_tabular:n { \@@_cover_secret: \\ } }
  }
\cs_new_protected:Npn \@@_cover_id_tabular:n #1
  {
    \exp_args:Nnx \begin{tabular} { \c_@@_cover_id_align_tl }
      #1
      \@@_cover_id_aux:n { school_id  } \\
      \@@_cover_id_aux:n { student_id }
    \end{tabular}
  }
\cs_new:Npn \@@_cover_id_aux:n #1
  {
    \tl_use:c { c_@@_name_ #1 _tl } &
    \tl_use:c { l_@@_info_ #1 _tl }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\c_@@_cover_id_align_tl}
% 密级、学号栏对齐格式：左右两栏均左对齐，中间以冒号分隔，并且不加间距。
%    \begin{macrocode}
\tl_const:Nn \c_@@_cover_id_align_tl
  { l @ { \c_@@_fwid_colon_tl } l @ { } }
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_cover_secret:}
% 密级，使用无衬线字体。
%    \begin{macrocode}
\cs_new:Npn \@@_cover_secret:
  {
    \multicolumn { 2 } { l }
      {
        \sffamily
        \c_@@_name_secret_level_tl
        \c_@@_fwid_colon_tl
        \prop_item:No \c_@@_secret_prop
          { \l_@@_info_secret_level_tl }
        \c_@@_name_secret_star_tl
        \l_@@_info_secret_year_tl
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_cover_logo:}
% 插入校名图片。根据参数 \opt{width} 和 \opt{height} 是否为空依次
% 判断。\cs{l_@@_cover_logo_size_clist} 中超过两个的参数将被忽略。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cover_logo:
  {
    \clist_pop:NN   \l_@@_cover_logo_size_clist \l_@@_tmpa_tl
    \clist_pop:NNTF \l_@@_cover_logo_size_clist \l_@@_tmpb_tl
      {
        \tl_if_empty:NTF \l_@@_tmpa_tl
          { \includegraphics [ height = \l_@@_tmpb_tl ] }
          {
            \includegraphics
              [ width  = \l_@@_tmpa_tl, height = \l_@@_tmpb_tl ]
          }
      }
      { \includegraphics [ width = \l_@@_tmpa_tl ] }
    { \l_@@_cover_logo_tl }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_cover_type:}
% 论文类型。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cover_type:
  {
    \prop_get:NVN \c_@@_thesis_type_prop
      \g_@@_thesis_type_tl \l_@@_tmpa_tl
    \@@_spread_box:no { 0.45 \textwidth } { \l_@@_tmpa_tl }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_cover_degree:}
% \changes{v0.7c}{2019/03/12}{允许博士学位论文使用学位类型。}
% 学位类型。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cover_degree:
  {
    \tl_if_eq:NnF \g_@@_thesis_type_tl { bachelor }
      {
        \c_@@_fwid_left_paren_tl
        \prop_item:No \c_@@_degree_type_prop
          { \l_@@_info_degree_type_tl }
        \c_@@_fwid_right_paren_tl
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_cover_info:}
% \changes{v0.8}{2021/09/21}{调整专业学位的封面信息栏。}
% \changes{v0.9}{2023/02/05}{封面信息栏改用表格实现。}
% 信息栏。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cover_info:
  {
    \group_begin:
      \zihao { 4 }
%    \end{macrocode}
% 专业学位与学术学位对应的左侧字段有所不同，这里统一存入 \cs{c_@@_name_major_tl}。
%    \begin{macrocode}
      \tl_if_eq:NnT \l_@@_info_degree_type_tl { professional }
        {
          \tl_set_eq:NN
            \c_@@_name_major_tl \c_@@_name_major_professional_tl
        }
%    \end{macrocode}
% 将信息栏的每一行存入 |clist| 变量中。
%    \begin{macrocode}
      \clist_clear:N \l_@@_tmpa_clist
      \clist_map_inline:nn { department, major, author, supervisor, date }
        {
          \clist_gput_right:Nn \l_@@_tmpa_clist
            {
              \exp_args:Nx \@@_cover_info_left:n
                { \tl_use:c { c_@@_name_ ##1 _tl } }
              &
              \tl_use:c { l_@@_info_ ##1 _tl }
            }
        }
%    \end{macrocode}
% 通过 \env{tabular} 环境输出。
% \changes{v0.9a}{2023/05/07}{展开列格式参数以修复与 \pkg{array} 宏包的兼容性问题。}
%    \begin{macrocode}
      \exp_args:Nnx \begin{tabular} { \c_@@_cover_info_align_tl }
        \clist_use:Nn \l_@@_tmpa_clist { \\ [ 1 ex ] }
      \end{tabular}
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\c_@@_cover_info_align_tl}
% 信息栏对齐格式：左右两栏均居中，中间以冒号分隔。
%    \begin{macrocode}
\tl_const:Nn \c_@@_cover_info_align_tl
  { c @ { \c_@@_fwid_colon_tl } c }
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_cover_info_left:n}
% 信息栏左侧字段。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cover_info_left:n #1
  {
    \tl_if_eq:NnTF \l_@@_info_degree_type_tl { professional }
      { \@@_spread_box:nn { 9 em } {#1} }
      { \@@_spread_box:nn { 6 em } {#1} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_cover_signature:N}
% 签名行。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cover_signature:N #1
  {
    \clist_map_inline:Nn #1
      {
        ##1 \c_@@_fwid_colon_tl
        \@@_blank_underline:n { 6 em }
        \@@_quad:
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{封面模板}
%
% \changes{v0.7}{2018/02/27}{使用 \pkg{xtemplate} 重构封面布局。}
%
% 声明封面对象。不需要带参数。
%    \begin{macrocode}
%<@@=fdu_cover>
\DeclareObjectType { fdu / cover } { \c_zero_int }
%    \end{macrocode}
%
% \begin{macro}{\DeclareCoverTemplate,\fdu_cover_declare_template:nn}
% 声明封面模板。
% \begin{arguments}
%   \item 模板名称
%   \item 封面部件列表，以逗号分隔
% \end{arguments}
%    \begin{macrocode}
\NewDocumentCommand \DeclareCoverTemplate { m m }
  { \fdu_cover_declare_template:nn {#1} {#2} }
\cs_new_protected:Npn \fdu_cover_declare_template:nn #1#2
  {
    \tl_set:Nn \l_@@_template_tl {#1}
%    \end{macrocode}
% 构建模板接口。
%    \begin{macrocode}
    \@@_declare_template_interface:nx {#1}
      {
        format      : tokenlist,
        top-skip    : skip,
        bottom-skip : skip,
        \clist_map_function:nN {#2} \@@_key_type:n
      }
%    \end{macrocode}
% 声明所用变量。
%    \begin{macrocode}
    \tl_new:c   { l_@@ / #1 / format_tl   }
    \skip_new:c { l_@@ / #1 / top_skip    }
    \skip_new:c { l_@@ / #1 / bottom_skip }
    \clist_map_inline:nn {#2}
      {
        \tl_new:c   { l_@@ / #1 / ##1 / content_tl  }
        \tl_new:c   { l_@@ / #1 / ##1 / format_tl   }
        \skip_new:c { l_@@ / #1 / ##1 / bottom_skip }
      }
%    \end{macrocode}
% 声明模板代码。^^A 以下名字空间为 `fdu_cover' 而非 `fdu'
%    \begin{macrocode}
    \@@_declare_template_code:nxn {#1}
      {
        format      = \exp_not:c { l_@@ / #1 / format_tl   },
        top-skip    = \use:c     { l_@@ / #1 / top_skip    },
        bottom-skip = \use:c     { l_@@ / #1 / bottom_skip },
        \clist_map_function:nN {#2} \@@_key_binding:n
      }
      {
        \AssignTemplateKeys
        \tl_use:c       { l_@@ / #1 / format_tl }
        \__fdu_vspace:c { l_@@ / #1 / top_skip  }
        \clist_map_inline:nn {#2}
          {
            \use:c { @@ / #1 / ####1 / align:n }
              {
                \tl_use:c { l_@@ / #1 / ####1 / format_tl  }
                \tl_use:c { l_@@ / #1 / ####1 / content_tl }
                \par
              }
            \__fdu_vspace:c { l_@@ / #1 / ####1 / bottom_skip }
          }
        \__fdu_vspace:c { l_@@ / #1 / bottom_skip }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\l_@@_template_tl}
% 保存模板名称。
%    \begin{macrocode}
\tl_new:N \l_@@_template_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_declare_template_interface:nn,
%   \@@_declare_template_code:nnn,
%   \@@_declare_template_interface:nx,
%   \@@_declare_template_code:nxn}
% 为了展开的方便，这里需要封装 \pkg{xtemplate} 的一些函数。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_declare_template_interface:nn #1#2
  { \DeclareTemplateInterface { fdu / cover } {#1} { \c_zero_int } {#2} }
\cs_new_protected:Npn \@@_declare_template_code:nnn #1#2#3
  { \DeclareTemplateCode { fdu / cover } {#1} { \c_zero_int } {#2} {#3} }
\cs_generate_variant:Nn \@@_declare_template_interface:nn { nx  }
\cs_generate_variant:Nn \@@_declare_template_code:nnn     { nxn }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_key_type:n}
%    \begin{macrocode}
\cs_new:Npn \@@_key_type:n #1
  {
    #1 / content     : tokenlist,
    #1 / format      : tokenlist,
    #1 / bottom-skip : skip,
    #1 / align       : choice { left, right, center, normal } = normal,
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_key_binding:n}
%    \begin{macrocode}
\cs_new:Npn \@@_key_binding:n #1
  {
    #1 / content     =
      \exp_not:c
        { l_@@ / \l_@@_template_tl / #1 / content_tl  },
    #1 / format      =
      \exp_not:c
        { l_@@ / \l_@@_template_tl / #1 / format_tl   },
    #1 / bottom-skip =
      \exp_not:c
        { l_@@ / \l_@@_template_tl / #1 / bottom_skip },
    #1 / align       =
      {
        left   =
          \exp_not:N \cs_set_protected:cpn
            { @@ / \l_@@_template_tl / #1 / align:n }
            \exp_not:n {##1}
            {
              \exp_not:n
                {
                  \group_begin:
                    \flushleft ##1 \endflushleft
                  \group_end:
                }
            },
        right  =
          \exp_not:N \cs_set_protected:cpn
            { @@ / \l_@@_template_tl / #1 / align:n }
            \exp_not:n {##1}
            {
              \exp_not:n
                {
                  \group_begin:
                    \flushright ##1 \endflushright
                  \group_end:
                }
            },
        center =
          \exp_not:N \cs_set_protected:cpn
            { @@ / \l_@@_template_tl / #1 / align:n }
            \exp_not:n {##1}
            {
              \exp_not:n
                {
                  \group_begin:
                    \center ##1 \endcenter
                  \group_end:
                }
            },
        normal =
          \exp_not:N \cs_set_protected:cpn
            { @@ / \l_@@_template_tl / #1 / align:n }
            \exp_not:n {##1}
            { \exp_not:n { \group_begin: ##1 \group_end: } }
      },
  }
%<@@=fdu>
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{绘制封面}
%
% \changes{v0.9}{2023/02/18}{为封面添加 PDF 页码。}
%
% \begin{macro}{\makecoveri}
% 论文封面（封一）。
%    \begin{macrocode}
\NewDocumentCommand \makecoveri { }
  {
    \thispagestyle { empty }
    \tl_set:Nn \thepage { A }
    \UseInstance { fdu / cover } { cover-i-default }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\makecoverii}
% \changes{v0.8}{2021/09/21}{\opt{info/instructors} 为空时不再显示指导小组
%   成员名单。}
% 指导小组成员名单（封二）。
%    \begin{macrocode}
\NewDocumentCommand \makecoverii { }
  {
    \thispagestyle { empty }
    \tl_set:Nn \thepage { B }
    \clist_if_empty:NTF \l_@@_info_instructors_clist
      { \hbox:n { } }
      { \UseInstance { fdu / cover } { cover-ii-default } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\makecoveriii}
% 声明页（封三）。
%    \begin{macrocode}
\NewDocumentCommand \makecoveriii { }
  {
    \cleardoublepage
    \thispagestyle { empty }
    \tl_set:Nn \thepage { C }
    \tl_if_empty:NTF \l_@@_declaration_page_tl
      { \UseInstance { fdu / cover } { cover-iii-default } }
      { \includepdf { \l_@@_declaration_page_tl } }
  }
%    \end{macrocode}
% \end{macro}
%
% 声明各封面模板组成部分。
%    \begin{macrocode}
\DeclareCoverTemplate { cover-i   }
  { id, logo, type, degree, title, title-en, info }
\DeclareCoverTemplate { cover-ii  } { title, name-list }
\DeclareCoverTemplate { cover-iii }
  {
    originality-decl-name,
    originality-decl-text,
    originality-decl-sig,
    authorization-decl-name,
    authorization-decl-text,
    authorization-decl-sig
  }
%    \end{macrocode}
%
% \changes{v0.7d}{2019/03/29}{封面中文标题改为加粗宋体（可能使用伪粗）。}
%
% 定义封面的具体配置参数。
%    \begin{macrocode}
\DeclareInstance { fdu / cover } { cover-i-default } { cover-i }
  {
%<class-en>    format                 = \@@_line_spread:N \c_@@_line_spread_fp,
    bottom-skip            = 0 pt plus 1.5 fill,
    id       / content     = \@@_cover_id:,
    logo     / content     = \@@_cover_logo:,
    type     / content     = \@@_cover_type:,
    degree   / content     = \@@_cover_degree:,
    title    / content     =
      \@@_fixed_width_center_box:nn
        { 0.9 \textwidth } { \l_@@_info_title_tl },
    title-en / content     =
      \@@_fixed_width_center_box:nn
        { 0.9 \textwidth } { \l_@@_info_title_en_tl },
    info     / content     = \@@_cover_info:,
    id       / format      = \zihao { -5 },
    type     / format      = \zihao {  2 },
    degree   / format      = \zihao {  4 },
    title    / format      = \zihao { -2 } \bfseries,
    title-en / format      =
      \@@_line_spread:n { 1.2 } \zihao { 4 } \bfseries,
    id       / bottom-skip = 0 pt plus 1.6 fill,
    logo     / bottom-skip = 0 pt plus 0.3 fill,
    type     / bottom-skip = -18 pt,
    degree   / bottom-skip = 0 pt plus 0.8 fill,
    title-en / bottom-skip = 0 pt plus 2.5 fill,
    id       / align       = right,
    logo     / align       = center,
    type     / align       = center,
    degree   / align       = center,
    title    / align       = center,
    title-en / align       = center,
    info     / align       = center,
  }
\DeclareInstance { fdu / cover } { cover-ii-default } { cover-ii }
  {
%<class-en>    format              = \@@_line_spread:N \c_@@_line_spread_fp,
    title     / content =
      \@@_spread_box:no { 7 em } { \c_@@_name_instructors_tl },
    name-list / content =
      \clist_use:Nn \l_@@_info_instructors_clist { \par },
    title     / format  = \zihao { 2 } \sffamily,
    name-list / format  = \large,
    title     / align   = center,
    name-list / align   = center,
  }
\DeclareInstance { fdu / cover } { cover-iii-default } { cover-iii }
  {
    format                                =
%<class>      \@@_line_spread:n { 1.8 },
%<class-en>      \@@_line_spread:n { 1.8 } \dim_set:Nn \parindent { 2 \ccwd },
    top-skip                              = 0 pt plus 0.2 fill,
    bottom-skip                           = 0 pt plus 2.5 fill,
    originality-decl-name   / content     = \c_@@_name_orig_decl_tl,
    originality-decl-text   / content     = \c_@@_orig_decl_text_tl,
    originality-decl-sig    / content     =
      \@@_cover_signature:N \c_@@_orig_decl_sign_clist,
    authorization-decl-name / content     = \c_@@_name_auth_decl_tl,
    authorization-decl-text / content     = \c_@@_auth_decl_text_tl,
    authorization-decl-sig  / content     =
      \@@_cover_signature:N \c_@@_auth_decl_sign_clist,
    originality-decl-name   / format      =
      \@@_line_spread:n { 1.2 } \zihao { -2 } \bfseries,
    authorization-decl-name / format      =
      \@@_line_spread:n { 1.2 } \zihao { -2 } \bfseries,
    originality-decl-name   / bottom-skip = 0.4 cm,
    originality-decl-text   / bottom-skip = 0.4 cm,
    originality-decl-sig    / bottom-skip = 0 pt plus 2.5 fill,
    authorization-decl-name / bottom-skip = 0.4 cm,
    authorization-decl-text / bottom-skip = 0.4 cm,
    originality-decl-name   / align       = center,
    originality-decl-sig    / align       = right,
    authorization-decl-name / align       = center,
    authorization-decl-sig  / align       = right,
  }
%    \end{macrocode}
%
% \begin{variable}{\l_@@_auto_make_cover_bool,\l_@@_declaration_page_tl}
%    \begin{macrocode}
\bool_new:N \l_@@_auto_make_cover_bool
\tl_new:N   \l_@@_declaration_page_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{style/auto-make-cover}
% 是否自动生成封面。
%    \begin{macrocode}
\keys_define:nn { fdu / style }
  {
    auto-make-cover  .bool_set:N = \l_@@_auto_make_cover_bool,
    auto-make-cover  .default:n  = true,
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.8}{2021/09/21}{新增 \opt{style/declaration-page} 选项。}
%
% \begin{macro}{style/declaration-page}
% 设置扫描版的声明页 PDF 文档。
%    \begin{macrocode}
    declaration-page .code:n     =
      {
        \tl_set_eq:NN \l_@@_declaration_page_tl \l_keys_value_tl
        \RequirePackage { pdfpages }
      },
  }
%    \end{macrocode}
% \end{macro}
%
% 在 \env{document} 开始位置添加封面以及指导小组成员名单。
%    \begin{macrocode}
\ctex_after_end_preamble:n
  {
    \bool_if:NT \l_@@_auto_make_cover_bool
      {
        \begin{titlepage}
          \makecoveri \newpage \makecoverii
        \end{titlepage}
      }
  }
%    \end{macrocode}
%
% 在 \env{document} 结束位置添加声明页。
%    \begin{macrocode}
\@@_gadd_ltxhook:nn { enddocument }
  { \bool_if:NT \l_@@_auto_make_cover_bool { \makecoveriii } }
%    \end{macrocode}
%
% \subsection{目录}
%
% 设置目录标题。
%    \begin{macrocode}
\keys_set:nn { ctex }
  {
%<class>    contentsname   = \c_@@_name_toc_tl,
%<class>    listfigurename = \c_@@_name_lof_tl,
%<class>    listtablename  = \c_@@_name_lot_tl,
%    \end{macrocode}
%
% 设置目录中章节标题的样式。
%    \begin{macrocode}
    chapter / tocline =
      {
%<class>        \normalfont \sffamily
%<class-en>        \bfseries
        \CTEXnumberline {#1} #2
      },
    section / tocline =
      {
%<class-en>        \bfseries
        \CTEXnumberline {#1} #2
      },
    subsection / tocline =
      {
%<class>        \fdu@kai
        \CTEXnumberline {#1} #2
      }
  }
%    \end{macrocode}
%
% \changes{v0.7e}{2019/05/12}{增加对插图、表格目录的处理。}
%
% \begin{macro}{\tableofcontents,\listoffigures,\listoftables}
% 修改 \cs{tableofcontents}、\cs{listoffigures} 和 \cs{listoftables} 的定义，
% 使得页眉正确显示，并出现在目录及 PDF 书签中。来自于 \LaTeXe{} 标准文档类
% \file{book.cls}^^A
% \footnote{原代码中只有 \cs{tableofcontents} 的 \cs{@mkboth} 出现在
% \cs{chapter*} 内部，这是出于兼容性的考虑而非 typo。}。
%    \begin{macrocode}
\@@_patch_cmd:Nnn \tableofcontents
  {
    \chapter*{\contentsname
      \@mkboth{\MakeUppercase\contentsname}
              {\MakeUppercase\contentsname}}
  }
  { \@@_chapter_no_toc:V \contentsname }
\@@_patch_cmd:Nnn \listoffigures
  {
    \chapter*{\listfigurename}
    \@mkboth{\MakeUppercase\listfigurename}
            {\MakeUppercase\listfigurename}
  }
  { \@@_chapter:V \listfigurename }
\@@_patch_cmd:Nnn \listoftables
  {
    \chapter*{\listtablename}
    \@mkboth{\MakeUppercase\listtablename}
            {\MakeUppercase\listtablename}
  }
  { \@@_chapter:V \listtablename }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@starttoc}
% 修改 \tn{@starttoc} 的定义以调整英文模板中的目录行距。
%    \begin{macrocode}
%<*class-en>
\@@_patch_cmd:Nnn \@starttoc
  { \begingroup }
  {
    \begingroup
      \@@_line_spread:N \c_@@_line_spread_fp
  }
%</class-en>
%    \end{macrocode}
% \end{macro}
%
% \subsection{摘要}
%
% \begin{environment}{abstract}
% \begin{environment}{abstract*}
% \changes{v0.7}{2018/03/05}{整理代码。}
% 摘要环境。在中文模板定义了中英文双语摘要，但在英文模板中则没有定义中文摘要。
%    \begin{macrocode}
\NewDocumentEnvironment { abstract  } { }
%<class>  { \@@_abstract_begin:    } { \@@_abstract_end:      }
%<class-en>  { \@@_abstract_en_begin: } { \@@_abstract_en_end:   }
%<*class>
\NewDocumentEnvironment { abstract* } { }
  { \@@_abstract_en_begin: } { \@@_abstract_en_end:   }
%</class>
%    \end{macrocode}
% \end{environment}
% \end{environment}
%
% \begin{macro}{\@@_abstract_begin:,\@@_abstract_en_begin:}
% 摘要页标题。
%    \begin{macrocode}
%<*class>
\cs_new_protected:Npn \@@_abstract_begin:
  { \@@_chapter:V \c_@@_name_abstract_tl    }
%</class>
\cs_new_protected:Npn \@@_abstract_en_begin:
  { \@@_chapter:V \c_@@_name_abstract_en_tl }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.7d}{2019/03/28}{优化关键词列表的显示。}
% \changes{v0.8}{2021/12/22}{没有指定 CLC/JEL 分类号时不再显示。}
%
% \begin{macro}{\@@_abstract_end:}
% 摘要正文完成后，输出关键词列表和 CLC/JEL 分类号。
%    \begin{macrocode}
%<*class>
\cs_new_protected:Npn \@@_abstract_end:
  {
    \@@_keywords:nNn
      { \sffamily \c_@@_name_keywords_tl \c_@@_fwid_colon_tl }
      \l_@@_info_keywords_clist { \c_@@_fwid_semicolon_tl }
    \tl_if_empty:NF \l_@@_info_clc_tl
      {
        \@@_clc_jel:nn
          { \sffamily \c_@@_name_clc_tl \c_@@_fwid_colon_tl }
          { \l_@@_info_clc_tl }
      }
  }
%</class>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_abstract_en_end:}
% 英文摘要中，如果指定了 JEL 分类号，则 CLC 分类号不再显示。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_abstract_en_end:
  {
    \@@_keywords:nNn
      { \bfseries \c_@@_name_keywords_en_tl \@@_quad: }
      \l_@@_info_keywords_en_clist { ; ~ }
    \tl_if_empty:NTF \l_@@_info_jel_tl
      {
        \tl_if_empty:NF \l_@@_info_clc_tl
          {
            \@@_clc_jel:nn
              { \bfseries \c_@@_name_clc_en_tl \@@_quad: }
              { \l_@@_info_clc_tl }
          }
      }
      {
        \@@_clc_jel:nn
          { \bfseries \c_@@_name_jel_en_tl \@@_quad: }
          { \l_@@_info_jel_tl }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_keywords:nNn,\@@_keywords_prevdepth:,\@@_clc_jel:nn}
% 关键词列表前要空一行，使用悬挂缩进；分类号不缩进。\tn{parbox} 之后的间距
% 需要调整，见 \url{https://tex.stackexchange.com/a/34982}。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_keywords:nNn #1#2#3
  {
    \par \mode_leave_vertical: \par \noindent
    \@@_get_text_width:Nn \l_@@_tmpa_dim {#1}
    \group_begin: #1 \group_end:
    \parbox [t] { \dim_eval:n { \textwidth - \l_@@_tmpa_dim } }
      {
        \clist_use:Nn #2 {#3} \par
        \cs_gset:Npx \@@_keywords_prevdepth:
          { \dim_use:N \tex_prevdepth:D }
      }
  }
\cs_new_protected:Npn \@@_clc_jel:nn #1#2
  {
    \par \tex_prevdepth:D \@@_keywords_prevdepth: \noindent
    \group_begin: #1 \group_end:
    #2
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{符号表}
%
% \begin{environment}{notation}
% \changes{v0.7}{2018/03/05}{整理代码。}
% 符号表环境，利用 \env{longtable} 封装。可选参数为表格列格式说明符。
%    \begin{macrocode}
\NewDocumentEnvironment { notation } { O { l p { 7.5 cm } } }
  {
    \@@_notation_begin:
    \group_begin:
      \@@_notation_long_table_setup:
      \longtable {#1}
  }
  {
      \endlongtable
    \group_end:
  }
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\@@_notation_begin:}
% 符号表页标题。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_notation_begin:
  {
%<class>    \@@_chapter:V \c_@@_name_notation_tl
%<class-en>    \@@_chapter:V \c_@@_name_notation_en_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_notation_long_table_setup:}
% 调整 \cs{LTpre} 和 \cs{LTpost}，以删去 \env{longtable} 前后的空白。
% 英文模板中还需要调整表格的行距。注意 \tn{arraystretch} 只是一个简单
% 宏，不能使用 \cs{fp_set:Nn}。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_notation_long_table_setup:
  {
%<class-en>    \tl_set:Nn \arraystretch { 1.3 }
    \dim_set_eq:NN \LTpre  \c_zero_dim
    \dim_set_eq:NN \LTpost \c_zero_dim
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{致谢}
%
% \changes{v0.9}{2023/02/06}{新增致谢环境。}
%
% \begin{environment}{acknowledgements}
% 致谢环境。
%    \begin{macrocode}
\NewDocumentEnvironment { acknowledgements } { }
  { \@@_acknowledgements_begin: } { }
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\@@_acknowledgements_begin:}
% 致谢页标题。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_acknowledgements_begin:
  {
%<class>    \@@_chapter:V \c_@@_name_acknowledgements_tl
%<class-en>    \@@_chapter:V \c_@@_name_acknowledgements_en_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{参考文献著录与引用}
%
% \changes{v0.6}{2017/10/27}{支持 \BibTeX{}，以实现参考文献的著录与引用。}
% \changes{v0.7}{2018/01/25}{支持 \biber{} 与 \pkg{biblatex}。}
% \changes{v0.9a}{2023/05/11}{允许同时不使用 \BibTeX{} 与 \pkg{biblatex}。}
%
% \begin{variable}{\l_@@_bib_backend_tl}
% 保存参考文献处理程序（后端），默认为空，即同时不使用 \BibTeX{} 与 \pkg{biblatex}。
% \pkg{biblatex}/\biber{}。
%    \begin{macrocode}
\tl_new:N \l_@@_bib_backend_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_bib_style_tl,\l_@@_bib_gb_style_tl,\l_@@_cite_style_tl}
% 保存参考文献及引用样式。
%    \begin{macrocode}
\tl_new:N \l_@@_bib_style_tl
\tl_new:N \l_@@_bib_gb_style_tl
\tl_new:N \l_@@_cite_style_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_bib_resource_clist}
% \changes{v0.8}{2021/03/07}{改用 \texttt{clist} 型变量，允许在 \pkg{biblatex}
%   下使用多个数据源。}
% 保存参考文献数据库列表。
%    \begin{macrocode}
\clist_new:N \l_@@_bib_resource_clist
%    \end{macrocode}
% \end{variable}
%
% \changes{v0.6}{2017/10/28}{新增 \opt{style/bib-style} 选项。}
% \changes{v0.7}{2018/01/25}{新增 \opt{style/bib-backend}、
%   \opt{style/cite-style} 和 \opt{style/bib-resource} 选项。}
% \changes{v0.8}{2021/09/20}{直接调用 \pkg{gbt7714} 宏包。}
%
%    \begin{macrocode}
\keys_define:nn { fdu / style }
  {
%    \end{macrocode}
% \begin{macro}{style/bib-backend}
% 参考文献后端。
%    \begin{macrocode}
    bib-backend .choice:,
    bib-backend .value_required:n = true,
    bib-backend / bibtex   .code:n =
      { \tl_set:Nn \l_@@_bib_backend_tl { bibtex } },
%    \end{macrocode}
% \changes{v0.8}{2022/01/08}{补充定义 \tn{addbibresource} 命令以兼容 \pkg{biblatex} 的用法。}
% 由于 \pkg{biblatex} 在导言区后才载入，需要单独定义添加参考文献数据源的命令以实现兼容。
% 该命令需要在载入宏包前取消定义。
%    \begin{macrocode}
    bib-backend / biblatex .code:n =
      {
        \tl_set:Nn \l_@@_bib_backend_tl { biblatex }
        \NewDocumentCommand \addbibresource { m }
          { \clist_gput_right:Nn \l_@@_bib_resource_clist {#1} }
      },
%    \end{macrocode}
% \end{macro}
% \begin{macro}{style/bib-style}
% 参考文献样式。
%    \begin{macrocode}
    bib-style .choice:,
    bib-style .value_required:n = true,
    bib-style / numerical    .code:n =
      {
        \tl_set:Nn  \l_@@_bib_gb_style_tl { numerical  }
        \tl_clear:N \l_@@_bib_style_tl
      },
    bib-style / author-year .code:n =
      {
        \tl_set:Nn  \l_@@_bib_gb_style_tl { author-year }
        \tl_clear:N \l_@@_bib_style_tl
      },
    bib-style / unknown     .code:n =
      {
        \tl_set_eq:NN \l_@@_bib_style_tl \l_keys_value_tl
        \tl_clear:N   \l_@@_bib_gb_style_tl
      },
%    \end{macrocode}
% \end{macro}
% \begin{macro}{style/cite-style}
% \changes{v0.8}{2021/09/17}{允许在 \BibTeX{} 下使用。}
% 引用样式。
%    \begin{macrocode}
    cite-style .tl_set:N = \l_@@_cite_style_tl,
%    \end{macrocode}
% \end{macro}
% \begin{macro}{style/bib-resource}
% 参考文献数据源。
%    \begin{macrocode}
    bib-resource .clist_set:N = \l_@@_bib_resource_clist
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.8}{2021/03/28}{正确使用导言区末尾钩子。}
%
% 为了保证导言区中的设置能起作用，\pkg{gbt774}、\pkg{natbib} 或 \pkg{biblatex}
% 宏包均需要在导言区末尾载入（仍在 \pkg{hyperref} 之前），并做相关设置。
%    \begin{macrocode}
\ctex_at_end_preamble:n
  {
    \tl_if_eq:NnT \l_@@_bib_backend_tl { bibtex }
      {
        \tl_if_empty:NTF \l_@@_bib_style_tl
          {
            \RequirePackage [ sort & compress ] { gbt7714 }
            \exp_args:No \bibliographystyle
              { gbt7714- \l_@@_bib_gb_style_tl }
          }
          {
            \RequirePackage [ sort & compress ] { natbib }
            \exp_args:No \bibliographystyle
              { \l_@@_bib_style_tl }
          }
        \@@_bibtex_setup:
      }
  }
%    \end{macrocode}
% \pkg{biblatex} 会写入 |begindocument/before| 钩子，因此需在其之前通过
% \texttt{env/doc\-u\-ment/begin} 钩子载入 \pkg{biblatex} 宏包。注意这个
% 钩子仅适用于 |\begin{document}| 的写法，对于 |\document| 命令本身无效。
%    \begin{macrocode}
\@@_gadd_ltxhook:nn { env/document/begin }
  {
    \tl_if_eq:NnT \l_@@_bib_backend_tl { biblatex }
      {
        \@@_biblatex_pre_setup:
        \RequirePackage { biblatex }
        \@@_biblatex_post_setup:
      }
  }
%    \end{macrocode}
%
% \changes{v0.7}{2018/01/25}{统一使用 \cs{printbibliography} 命令
%   生成参考文献列表。}
% \changes{v0.7d}{2019/03/23}{使参考文献在目录中正常显示。}
% \changes{v0.7e}{2020/08/30}{同步 \pkg{gbt7714} v2.0。}
% \changes{v0.8}{2021/09/20}{新增不带上标的文内引用命令。}
%
% \begin{macro}{\@@_bibtex_setup:,\parencite,\printbibliography}
% \BibTeX{} 相关设置。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_bibtex_setup:
  {
%    \end{macrocode}
% 行内引用命令。这里定义比较繁琐，是为了与 \tn{cite} 等命令保持一致。
%    \begin{macrocode}
    \tl_if_eq:VnTF \l_@@_bib_gb_style_tl { numerical }
      {
        \exp_args:NNx \DeclareRobustCommand \parencite
          { \exp_args:No \exp_not:o { \cs:w cite ~ \cs_end: } }
        \exp_args:Nc \ctex_patch_cmd:Nnn { parencite ~ }
          { \begingroup }
          { \begingroup \bibstyle@numbers }
      }
      { \cs_set_eq:NN \parencite \cite }
%    \end{macrocode}
% 引用样式。
%    \begin{macrocode}
    \tl_if_empty:NF \l_@@_cite_style_tl
      { \exp_args:NV \citestyle \l_@@_cite_style_tl }
%    \end{macrocode}
% 使用 \tn{textendash} “\textendash”作为数字间的连接号。
%    \begin{macrocode}
    \ctex_patch_cmd:Nnn \NAT@citexnum
      { - \NAT@penalty }
      { \textendash \NAT@penalty }
%    \end{macrocode}
% 修改参考文献标题。
%    \begin{macrocode}
    \cs_set:Npn \bibsection { \@@_chapter:V \bibname }
%    \end{macrocode}
% \BibTeX{} 下接口与 \pkg{biblatex} 保持统一。
%    \begin{macrocode}
    \NewDocumentCommand \printbibliography { o }
      {
        \exp_args:NV \bibliography \l_@@_bib_resource_clist
        \IfValueT {##1}
          { \@@_warning:nn { invalid-option-in-bibtex } {##1} }
      }
  }
\@@_msg_new:nn { invalid-option-in-bibtex }
  { Option(s)~ "#1"~ are~ invalid~ in~ BibTeX. }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_biblatex_pre_setup:,\@@_biblatex_post_setup:}
% \pkg{biblatex} 相关设置。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_biblatex_pre_setup:
  {
    \cs_undefine:N \addbibresource
    \clist_new:N \l_@@_biblatex_options_clist
    \clist_put_right:Nn \l_@@_biblatex_options_clist { hyperref = manual }
%    \end{macrocode}
% 参考文献样式。
%    \begin{macrocode}
    \clist_put_right:Nx \l_@@_biblatex_options_clist
      {
        style =
        \tl_if_empty:NTF \l_@@_bib_style_tl
          {
            \str_if_eq:VnTF \l_@@_bib_gb_style_tl { numerical }
              { gb7714-2015 } { gb7714-2015ay }
          }
          { \l_@@_bib_style_tl }
      }
%    \end{macrocode}
% 引用样式。
% \changes{v0.8}{2021/03/09}{正确调用引用样式。}
%    \begin{macrocode}
    \tl_if_empty:NF \l_@@_cite_style_tl
      {
        \clist_put_right:Nx \l_@@_biblatex_options_clist
          { citestyle = \l_@@_cite_style_tl }
      }
    \exp_args:NV \PassOptionsToPackage \l_@@_biblatex_options_clist
      { biblatex }
  }
\cs_new_protected:Npn \@@_biblatex_post_setup:
  {
    \clist_map_function:NN \l_@@_bib_resource_clist \addbibresource
    \@@_biblatex_allow_url_break:
    \@@_biblatex_use_en_dash:
%    \end{macrocode}
% 修改参考文献标题。
%    \begin{macrocode}
    \defbibheading { bibliography } [ \bibname ] { \@@_chapter:n {##1} }
%<*class-en>
    \exp_args:Nnx \DefineBibliographyStrings { english }
      { bibliography = { \c_@@_name_bib_en_tl } }
%</class-en>
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_biblatex_allow_url_break:}
% \pkg{biblatex} 下允许 URL 在字母、数字和一些特殊符号处断行。
%    \begin{macrocode}
\cs_new:Npn \@@_biblatex_allow_url_break:
  {
    \int_set_eq:NN \c@biburlucpenalty  \c_one_int
    \int_set_eq:NN \c@biburlnumpenalty \c_one_int
    \int_set_eq:NN \c@biburllcpenalty  \c_one_int
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_biblatex_use_en_dash:}
% 使用 \tn{textendash} “\textendash”作为数字间的连接号。
%    \begin{macrocode}
\cs_new:Npn \@@_biblatex_use_en_dash:
  {
    \DefineBibliographyExtras { english }
      {
        \cs_set_nopar:Npn \bibrangedash
          { \textendash \penalty \hyphenpenalty }
      }
    \DefineBibliographyExtras { russian }
      {
        \cs_set_nopar:Npn \bibrangedash
          { \textendash \penalty \hyphenpenalty }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.7}{2018/01/25}{同步 \pkg{gbt7714} v1.0，移除有关超链接的额外设置。}
% \changes{v0.8}{2021/09/20}{不再将著录用符号修改为中文标点符号。}
%
% \subsection{\pkg{hyperref} 相关配置}
%
% \changes{v0.4}{2017/08/13}{新增 \pkg{hyperref} 相关配置，包括超链接
%   样式（\opt{style/hyperlink} 与 \opt{style/hyperlink-color} 选项）
%   及 PDF 元信息等。}
% \changes{v0.7}{2018/01/23}{将 \pkg{hyperref} 相关配置移至模板末尾，
%   以减少冲突。}
%
% \begin{macro}{\hypersetup}
% \changes{v0.9}{2023/02/08}{改用 \cs{DeclareDocumentCommand} 定义。}
% \begin{macro}{\fdu_hyperref_setup:n}
% \pkg{hyperref} 宏包是在导言区之后才引入的。若要在导言区中使用
% \tn{hypersetup} 命令，必须另行定义。
%    \begin{macrocode}
\DeclareDocumentCommand \hypersetup { m }
  { \fdu_hyperref_setup:n {#1} }
\cs_new_protected:Npn \fdu_hyperref_setup:n #1
  { \clist_gput_right:Nn \g_@@_to_hyperref_clist {#1} }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_set_hyperlink_color_key:n}
% 设置超链接颜色选项。最后的逗号用于确保 \pkg{l3keys} 可以正确解析，不能省去。
%    \begin{macrocode}
\cs_new:Npn \@@_set_hyperlink_color_key:n #1
  {
    hyperlink-color / \clist_item:nn {#1} {1} .code:n =
      {
        \@@_define_hyperlink_color:nnn
          { \clist_item:nn {#1} {2} }
          { \clist_item:nn {#1} {3} }
          { \clist_item:nn {#1} {4} }
        \fdu_hyperref_setup:n
          {
            linkcolor = fdu@link, linkbordercolor = fdu@link,
            urlcolor  = fdu@url,  urlbordercolor  = fdu@url,
            citecolor = fdu@cite, citebordercolor = fdu@cite
          }
      },
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_define_hyperlink_color:nnn}
% 定义超链接颜色。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_define_hyperlink_color:nnn #1#2#3
  {
    \definecolorset { HTML } { fdu@ } { }
      { link, #1; url, #2; cite, #3 }
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\keys_define:nx { fdu / style }
  {
%    \end{macrocode}
%
% \begin{macro}{style/hyperlink}
% \changes{v0.8}{2021/12/27}{修复边框不显示的问题；不需要为 \opt{hidelinks} 选项传递参数。}
% 超链接样式。
%    \begin{macrocode}
    hyperlink .choice:,
    hyperlink .value_required:n = true,
    hyperlink / border .code:n =
      { \fdu_hyperref_setup:n { colorlinks = false } },
    hyperlink / color  .code:n =
      { \fdu_hyperref_setup:n { colorlinks = true  } },
    hyperlink / none   .code:n =
      { \fdu_hyperref_setup:n { hidelinks } },
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{style/hyperlink-color}
% \changes{v0.8}{2021/12/27}{移除不常用的超链接颜色。}
% 超链接颜色。
%    \begin{macrocode}
    hyperlink-color .choice:,
    hyperlink-color .value_required:n = true,
    \clist_map_function:nN
      {
        { classic,   FF0000, 0000FF, 00FF00 },
        { default,   990000, 0000B2, 007F00 },
        { material,  E91E63, 009688, 4CAF50 },
        { graylevel, 616161, 616161, 616161 },
        { prl,       2D3092, 2D3092, 2D3092 }
      }
      \@@_set_hyperlink_color_key:n
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.6}{2017/10/29}{优化 URL 断行设置。}
%
% \begin{macro}{\fdu_allow_url_break:,\@@_add_url_break_points:}
% 允许 URL 在字母、数字和一些特殊符号处断行。见
% \url{https://bit.ly/2hhIjLW}。
%    \begin{macrocode}
\cs_new:Npn \fdu_allow_url_break:
  {
    \cs_new:Npn \@@_add_url_break_points:
      { \tl_map_function:NN \c_@@_url_break_points_tl \do }
    \@@_appto_cmd:Nn \UrlBreaks
      { \UrlOrds \@@_add_url_break_points: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\c_@@_url_break_points_tl}
% 额外的断行位置是 26 个英文字母（大小写）以及 10 个阿拉伯数字。
% \pkg{url} 提供的宏 \tn{UrlBreaks} 还包含了特殊符号 |*|、|-|、
% |~|、|'|、|"|、|-|，也被设置为允许断行。
%    \begin{macrocode}
\tl_const:Nn \c_@@_url_break_points_tl
  {
    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    0123456789
  }
%    \end{macrocode}
% \end{variable}
%
% \changes{v0.7e}{2019/04/23}{处理 \pkg{hyperref} 与 \pkg{unicode-math}
%   的兼容性问题。}
%
% 在导言区末尾引入 \pkg{hyperref} 宏包。
%    \begin{macrocode}
\ctex_at_end_preamble:n
  {
    \RequirePackage { hyperref }
%    \end{macrocode}
% 此后 \tn{hypersetup} 命令由 \pkg{hyperref} 宏包接管。
%    \begin{macrocode}
    \hypersetup
      {
        bookmarksnumbered = true,
        psdextra          = true,
        unicode           = true,
%    \end{macrocode}
% 填写 PDF 元信息。
%    \begin{macrocode}
%<*class>
        pdftitle    = \l_@@_info_title_sanitized_tl,
        pdfauthor   = \l_@@_info_author_tl,
        pdfkeywords = \l_@@_info_keywords_clist,
%</class>
%<*class-en>
        pdftitle    = \l_@@_info_title_en_sanitized_tl,
        pdfauthor   = \l_@@_info_author_en_tl,
        pdfkeywords = \l_@@_info_keywords_en_clist,
%</class-en>
%       pdfsubject  = ,
        pdfcreator  = \c_@@_name_pdf_creator_tl
      }
%    \end{macrocode}
% 将导言区中通过 \cs{fdu_hyperref_setup:n} 进行的设置传入 \tn{hypersetup}。
%    \begin{macrocode}
    \exp_args:NV \hypersetup \g_@@_to_hyperref_clist
%    \end{macrocode}
% URL 断行处理。
%    \begin{macrocode}
    \fdu_allow_url_break:
%    \end{macrocode}
% 由于 \pkg{hyperref} 在 \pkg{biblatex} 之后调用，所以需要手动开启相关功能。
%    \begin{macrocode}
    \tl_if_eq:NnT \l_@@_bib_backend_tl { biblatex }
      { \BiblatexManualHyperrefOn }
  }
%    \end{macrocode}
%
% 在 PDF 字符串中设置 \tn{fdu@kai} 命令为空，以抑制 \pkg{hyperref} 的警告信息。
%    \begin{macrocode}
\ctex_at_end_package:nn { hyperref }
  {
    \pdfstringdefDisableCommands
      {
        \cs_set_eq:NN \fdu@kai \prg_do_nothing:
        \cs_set_eq:NN \quad    \c_space_tl
        \cs_set_eq:NN \qquad   \c_space_tl
      }
  }
%    \end{macrocode}
%
% \subsection{用户接口}
%
% \begin{macro}{info,style}
% 定义元（meta）键值对。
%    \begin{macrocode}
\keys_define:nn { fdu }
  {
    info  .meta:nn = { fdu / info  } {#1},
    style .meta:nn = { fdu / style } {#1}
  }
%    \end{macrocode}
% \end{macro}
%
% 文档类初始设置。
%    \begin{macrocode}
\keys_set:nn { fdu }
  {
    style   / font            = times,
%<class>    style   / cjk-font        = fandol,
    style   / font-size       = -4,
%<class>    style   / fullwidth-stop  = false,
    style   / auto-make-cover = true,
    style   / logo            = { fudan-name.pdf },
    style   / logo-size       = { 0.5 \textwidth },
    style   / hyperlink       = color,
    style   / hyperlink-color = default,
    style   / bib-style       = numerical,
    info    / degree          = academic,
    info    / secret-level    = none,
    info    / school-id       = { 10246 },
    info    / date            = { \zhtoday },
%<class>    theorem / header-font     = { \sffamily },
%<class-en>    theorem / header-font     = { \bfseries \upshape },
%<class>    theorem / body-font       = { \fdu@kai },
%<class-en>    theorem / body-font       = { \itshape },
    theorem / counter         = { chapter }
  }
%    \end{macrocode}
%
% \begin{macro}{\fdusetup}
% 用户设置接口。
%    \begin{macrocode}
\NewDocumentCommand \fdusetup { m }
  { \keys_set:nn { fdu } {#1} }
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{proof}
% \begin{environment}{axiom}
% \begin{environment}{corollary}
% \begin{environment}{definition}
% \begin{environment}{example}
% \begin{environment}{lemma}
% \begin{environment}{theorem}
% 模板预定义的常用数学环境。
% 其中的“证明”比较特殊，它不编号，但会添加证毕符号。
%    \begin{macrocode}
%<*class>
\newtheorem* { proof       } { \c_@@_name_proof_tl      }
\newtheorem  { axiom       } { \c_@@_name_axiom_tl      }
\newtheorem  { corollary   } { \c_@@_name_corollary_tl  }
\newtheorem  { definition  } { \c_@@_name_definition_tl }
\newtheorem  { example     } { \c_@@_name_example_tl    }
\newtheorem  { lemma       } { \c_@@_name_lemma_tl      }
\newtheorem  { theorem     } { \c_@@_name_theorem_tl    }
%</class>
%<*class-en>
\newtheorem* { proof       } { \c_@@_name_proof_en_tl      }
\newtheorem  { axiom       } { \c_@@_name_axiom_en_tl      }
\newtheorem  { corollary   } { \c_@@_name_corollary_en_tl  }
\newtheorem  { definition  } { \c_@@_name_definition_en_tl }
\newtheorem  { example     } { \c_@@_name_example_en_tl    }
\newtheorem  { lemma       } { \c_@@_name_lemma_en_tl      }
\newtheorem  { theorem     } { \c_@@_name_theorem_en_tl    }
%</class-en>
%</class|class-en>
%    \end{macrocode}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
%
% \subsection{模板参数配置文件}
%
% \changes{v0.3}{2017/06/27}{分离文档类与参数配置文件。}
%
%    \begin{macrocode}
%<*definition>
%    \end{macrocode}
%
% \subsubsection{通用配置}
%
% \begin{variable}{\c_@@_name_simp_tl,\c_@@_name_trad_tl,\c_@@_name_en_tl}
% 学校名称。
%    \begin{macrocode}
\tl_const:Nn \c_@@_name_simp_tl { 复旦大学          }
\tl_const:Nn \c_@@_name_trad_tl { 復旦大學          }
\tl_const:Nn \c_@@_name_en_tl   { Fudan~ University }
%    \end{macrocode}
% \end{variable}
%
% 常用标点符号，见表~\ref{tab:punctuations}。
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { ideo_comma       } { ^^^^3001 },
    { ideo_full_stop   } { ^^^^3002 },
    { fwid_comma       } { ^^^^ff0c },
    { fwid_full_stop   } { ^^^^ff0e },
    { fwid_colon       } { ^^^^ff1a },
    { fwid_semicolon   } { ^^^^ff1b },
    { fwid_left_paren  } { ^^^^ff08 },
    { fwid_right_paren } { ^^^^ff09 }
  }
  { \@@_define_punct:nn #1 }
%    \end{macrocode}
%
% \begin{table}[ht]
%   \caption{常用标点符号}
%   \label{tab:punctuations}
%   \centering
%   \begin{tabular}{cccc}
%     \toprule
%       \textbf{中文名称} &
%       \textbf{英文名称} &
%       \textbf{符号} &
%       \textbf{Unicode 码位} \\
%     \midrule
%       中文顿号     & Ideographic comma           & ^^^^3001 & U+3001 \\
%       中文句号     & Ideographic full stop       & ^^^^3002 & U+3002 \\
%       中文逗号     & Fullwidth comma             & ^^^^ff0c & U+FF0C \\
%       全角西文句点 & Fullwidth full stop         & ^^^^ff0e & U+FF0E \\
%       中文冒号     & Fullwidth colon             & ^^^^ff1a & U+FF1A \\
%       中文分号     & Fullwidth semicolon         & ^^^^ff1b & U+FF1B \\
%       中文左圆括号 & Fullwidth left parenthesis  & ^^^^ff08 & U+FF08 \\
%       中文右圆括号 & Fullwidth right parenthesis & ^^^^ff09 & U+FF09 \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%
% \begin{variable}{\c_@@_line_spread_fp}
% 行距倍数。行距倍数 $k$ 由下式确定：
% \begin{equation*}
%   1.2 \times k \times \qty{12}{bp} = \qty{20}{pt}.
% \end{equation*}
% 式中，1.2 是基本行距与文字大小之比，\qty{12}{bp} 是小四号字的大小，
% \qty{20}{pt} 是行距固定值。
%    \begin{macrocode}
\fp_const:Nn \c_@@_line_spread_fp
  { \dim_ratio:nn { 20 pt } { 12 bp } / 1.2 }
%    \end{macrocode}
% \end{variable}
%
% \subsubsection{声明页}
%
% \begin{variable}{\c_@@_orig_decl_text_tl}
% 论文独创性声明。
%    \begin{macrocode}
\tl_const:Nn \c_@@_orig_decl_text_tl
  {
    本人郑重声明：所呈交的学位论文，是本人在导师的指导下，独立进行研究
    工作所取得的成果。论文中除特别标注的内容外，不包含任何其他个人或机
    构已经发表或撰写过的研究成果。对本研究做出重要贡献的个人和集体，均
    已在论文中作了明确的声明并表示了谢意。本声明的法律结果由本人承担。
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_auth_decl_text_tl}
% 论文使用授权声明。
%    \begin{macrocode}
\tl_const:Nn \c_@@_auth_decl_text_tl
  {
    本人完全了解复旦大学有关收藏和利用博士、硕士学位论文的规定，即：学
    校有权收藏、使用并向国家有关部门或机构送交论文的印刷本和电子版本；
    允许论文被查阅和借阅；学校可以公布论文的全部或部分内容，可以采用影
    印、缩印或其它复制手段保存论文。涉密学位论文在解密后遵守此规定。
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_orig_decl_sign_clist,
%   \c_@@_auth_decl_sign_clist}
% 声明页签名项目。
%    \begin{macrocode}
\clist_const:Nn \c_@@_orig_decl_sign_clist
  { 作者签名, 日期 }
\clist_const:Nn \c_@@_auth_decl_sign_clist
  { 作者签名, 导师签名, 日期 }
%    \end{macrocode}
% \end{variable}
%
% \subsubsection{杂项}
%
% \begin{variable}{\c_@@_thesis_type_prop,\c_@@_degree_type_prop}
% 论文类型与学位类型。
%    \begin{macrocode}
\prop_const_from_keyval:Nn \c_@@_thesis_type_prop
  {
    doctor   = 博士学位论文,
    master   = 硕士学位论文,
    bachelor = 本科毕业论文,
  }
\prop_const_from_keyval:Nn \c_@@_degree_type_prop
  {
    academic     = 学术学位,
    professional = 专业学位,
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_secret_prop}
% 三种密级。
%    \begin{macrocode}
\prop_const_from_keyval:Nn \c_@@_secret_prop
  {
    i   = 秘密,
    ii  = 机密,
    iii = 绝密,
  }
%    \end{macrocode}
% \end{variable}
%
% \changes{v0.9a}{2023/03/23}{“关键字”更改为“关键词”。}
%
% 默认名称。注意空格是忽略掉的。
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { secret_level       } { 密 \qquad 级                  },
    { secret_star        } { \textrm { \bigstar }          },
    { school_id          } { 学校代码                      },
    { student_id         } { 学 \qquad 号                  },
    { department         } { 院系                          },
    { major              } { 专业                          },
    { major_professional } { 专业学位类别（领域）          },
    { author             } { 姓名                          },
    { supervisor         } { 指导教师                      },
    { date               } { 完成日期                      },
    { instructors        } { 指导小组成员                  },
    { author_sign        } { 作者签名                      },
    { supervisor_sign    } { 导师签名                      },
    { sign_date          } { 日期                          },
    { toc                } { 目 \quad 录                   },
    { lof                } { 插图目录                      },
    { lot                } { 表格目录                      },
    { bib_en             } { Bibliography                  },
    { pdf_creator        } { LaTeX~ with~ fduthesis~ class },
    { orig_decl          }
      { \c_@@_name_simp_tl \\ 学位论文独创性声明   },
    { auth_decl          }
      { \c_@@_name_simp_tl \\ 学位论文使用授权声明 },
  }
  { \@@_define_name:nn #1 }
\clist_map_inline:nn
  {
    { abstract         } { 摘 \quad 要 } { Abstract          },
    { keywords         } { 关键词      } { Keywords:         },
    { clc              } { 中图分类号  } { CLC~ code:        },
    { jel              } { JEL 分类号  } { JEL~ code:        },
    { notation         } { 符号表      } { List~ of~ Symbols },
    { acknowledgements } { 致 \quad 谢 } { Acknowledgements  }
  }
  { \@@_define_name:nnn #1 }
%    \end{macrocode}
%
% 默认定理头名称。
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { proof      } { 证明 } { Proof      },
    { axiom      } { 公理 } { Axiom      },
    { corollary  } { 推论 } { Corollary  },
    { definition } { 定义 } { Definition },
    { example    } { 例   } { Example    },
    { lemma      } { 引理 } { Lemma      },
    { theorem    } { 定理 } { Theorem    }
  }
  { \@@_define_name:nnn #1 }
%    \end{macrocode}
%
% \begin{variable}{\c_@@_name_major_professional_tl}
% \changes{v0.9}{2023/02/05}{处理右括号带来的间距。}
% 处理右括号带来的间距。
%    \begin{macrocode}
\tl_put_right:Nn \c_@@_name_major_professional_tl
  { { \skip_horizontal:n { -0.5 em } } }
%</definition>
%<@@=>
%    \end{macrocode}
% \end{variable}
%
% \clearpage
%
% \end{implementation}
%
