summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx')
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx6205
1 files changed, 6205 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx b/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx
new file mode 100644
index 00000000000..15e14f125fb
--- /dev/null
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx
@@ -0,0 +1,6205 @@
+% \iffalse meta-comment
+% !TeX program = XeLaTeX
+% !TeX encoding = UTF-8
+%
+% Copyright (C) 2017, 2018 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,
+% fduthesis-template.tex,
+% 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,
+% fduthesis.pdf,
+% fduthesis-en.pdf,
+% fduthesis-code.pdf,
+% latexmkrc,
+% latexmkrc-en,
+% and README.md.
+%
+%<*internal>
+\iffalse
+%</internal>
+%
+%<*readme>
+The `fduthesis` Class
+=====================
+
+*LaTeX thesis template for Fudan University, v0.7a*
+
+Overview
+--------
+
+`fduthesis` is a thesis template for Fudan University. This template
+is mostly written in LaTeX3, with a simple interface for users.
+
+At present, only XeTeX, LuaTeX and [ApTeX](https://github.com/clerkma/ptex-ng)
+(experimental) are supported.
+
+The documentation can be found in
+[fduthesis.pdf](https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis.pdf)
+(in Chinese) or
+[fduthesis-en.pdf](https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis-en.pdf)
+(in English).
+
+Installation
+------------
+
+To install `fduthesis`, you can use one of the following methods:
+
+- Download
+ [fduthesis.tds.zip](https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis.tds.zip)
+ from GitHub, extract it in the root of one of your TDS trees, and
+ update the filename database.
+
+- Get the source (`fduthesis.zip`) from GitHub:
+
+ git clone https://github.com/Stone-Zeng/fduthesis.git
+
+ Run
+
+ xetex fduthesis.dtx
+
+ to generate the templates and configuration files. Then 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`
+
+ 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, 2018 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 l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+ Copyright (C) 2017, 2018 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,
+ fduthesis-template.tex,
+ 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,
+ fduthesis.pdf,
+ fduthesis-en.pdf,
+ fduthesis-code.pdf,
+ latexmkrc,
+ latexmkrc-en,
+ 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}}
+%</install>
+%<*internal>
+ \usedir{source/latex/fduthesis}
+ \file{\jobname.ins} {\from{\jobname.dtx}{install}}
+%</internal>
+%<*install>
+ \usedir{doc/latex/fduthesis}
+ \nopreamble\nopostamble
+ \file{README.md} {\from{\jobname.dtx}{readme}}
+ % ``.cfg'' is only for internal/temporal use.
+ % They will be renamed by external scripts.
+ \file{latexmkrc.cfg} {\from{\jobname-doc.dtx}{latexmk}}
+ \file{latexmkrc-en.cfg} {\from{\jobname-doc.dtx}{latexmk-en}}
+}
+
+\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}
+%<class|class-en|doc|logo>\RequirePackage{expl3}
+%<*!(driver|install|ex-logo|cover)>
+%<!readme>\GetIdInfo $Id: fduthesis.dtx 0.7a 2018-04-09 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{xpinyin}
+\hypersetup
+ {
+ pdftitle = {fduthesis: 复旦大学论文模板},
+ pdfauthor = {曾祥东}
+ }
+\renewcommand*\expstar{\hyperlink{expstar}{$\mfrake$}}
+\renewcommand*\rexpstar{\hyperlink{rexpstar}{$\mfrakc$}}
+% 全角标点放在引号中,需要改成半角式,否则间距过大,不好看
+\newcommand\FSID{“{\xeCJKsetup{PunctStyle=banjiao}。}”} ^^A U+3002
+\newcommand\FSFW{“{\xeCJKsetup{PunctStyle=banjiao}.}”} ^^A U+FF0E
+\newcommand\COFW{“{\xeCJKsetup{PunctStyle=banjiao}:}”} ^^A U+FF1A
+\newcommand\SCFW{“{\xeCJKsetup{PunctStyle=banjiao};}”} ^^A U+FF1B
+\begin{document}
+ \DisableImplementation
+%<!--CODEDOC--> \EnableImplementation
+%<!--CODEDOC--> \def\FDUCODEDOC{}
+ \DocInput{fduthesis.dtx}
+%<!--CODEDOC--> \DocInput{fduthesis-doc.dtx,fduthesis-logo.dtx}
+ \IndexLayout
+ \PrintChanges
+ \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。}
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%^^A! \PassOptionsToPackage{scheme=plain, linespread=1.1}{ctex}
+%^^A! \documentclass{fdudoc}
+%^^A! \hypersetup
+%^^A! {
+%^^A! pdftitle = {fduthesis: LaTeX Thesis Template for Fudan University},
+%^^A! pdfauthor = {Xiangdong Zeng}
+%^^A! }
+%^^A! \ctexset
+%^^A! {
+%^^A! section = {name = {}, format+ = \raggedright},
+%^^A! subsubsection/tocline = {\CTEXnumberline{#1}#2}
+%^^A! }
+%^^A! \pagestyle{headings}
+%^^A! \renewcommand*\expstar{\hyperlink{expstar}{$\mfrake$}}
+%^^A! \renewcommand*\rexpstar{\hyperlink{rexpstar}{$\mfrakc$}}
+%^^A! \newcommand\FSID{{\xeCJKsetup{PunctStyle=banjiao}。}}
+%^^A! \newcommand\FSFW{{\xeCJKsetup{PunctStyle=banjiao}.}}
+%^^A! \IndexPrologue{\section{Index}}
+%^^A! \def\IndexLayout{%
+%^^A! \setlength\IndexMin{0.5\textheight}%
+%^^A! \ctexset{section/numbering=false}%
+%^^A! \StopSpecialIndexModule}
+%^^A! \def\indexname{Index}
+%^^A! \let\usage\relax
+%^^A!
+%
+% \title{\textcolor{MaterialIndigo800}{^^A
+% \textbf{fduthesis: 复旦大学论文^^A
+% \xpinyin[font=\sffamily]{模}{mu2}板}}}
+% \author{曾祥东}
+% \date{\today \quad v0.7a^^A
+% \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{\today \quad v0.7a%
+%^^A! \thanks{\url{https://github.com/Stone-Zeng/fduthesis}.}}
+%^^A!
+%^^A! \begin{document}
+%^^A!
+%
+%^^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.75 in,
+% right = 1.00 in,
+% top = 1.25 in,
+% bottom = 1.00 in
+% }
+%
+%^^A-
+%
+% \section{介绍}
+%^^A! \section{Introduction}
+%^^A!
+%
+% 目前,在网上可以找到的复旦大学 \LaTeX{} 论文模板主要有以下这些:
+% \begin{itemize}
+% \item 数学科学学院 2001 级的何力同学和李湛同学在 2005 年根据
+% 学校要求所设计的 \cls{毕业论文格式 tex04 版},以及 2008 年
+% 张越同学修改之后的 \cls{毕业论文格式 tex08 版},这是专为
+% 数院本科生撰写毕业论文而设计的
+% \scite{数院毕业论文格式,数院毕业论文格式更新};
+% \item Pandoxie 编写的 \cls{FDU-Thesis-Latex}
+% \scite{pandoxie2014fduthesislatex},基本满足了博士(硕士)
+% 毕业论文格式要求,使用人数较多;
+% \item richarddzh 编写的硕士论文模板 \cls{fudan-thesis}
+% \scite{richard2016fudanthesis};
+% \item hmshan 编写的博士论文模板 \cls{FDU_PhD_Thesis_Template}
+% \scite{hmshan2017fduphdthesistemplate}。
+% \end{itemize}
+% 以上这些模板大都没有经过系统的设计,也鲜有后续维护。相比之下,
+% 清华大学 \scite{thuthesis}、重庆大学 \scite{cquthesis}、
+% 中国科学技术大学 \scite{zepinglee2017ustcthesis} 以及友校
+% 上海交通大学 \scite{weijianwen2017sjtuthesis}等,都有成熟、
+% 稳定的解决方案,值得参考。
+%
+% 本模板将借鉴前辈经验,重新设计,并使用 \LaTeX3
+% \scite{interfaces3,source3} 编写,以适应 \TeX{} 技术发展潮流;
+% 同时还将构建一套简洁的接口,方便用户使用。
+%^^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{} 入门》
+% \scite{刘海洋2013latex入门} 第一章,或大名鼎鼎的“\pkg{lshort}”
+% \scite{lshort} 及其中文翻译版 \scite{lshort-zh-cn}。当然,
+% 网络上的入门教程多如牛毛,您可以自行选取。
+%^^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{} 的,表示只能在^^A
+% \emph{中文模板}中使用;
+% \item 名字后面带有 \exptarget\expstar{} 的,表示只能在^^A
+% \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 special characters afterwards, then
+%^^A! you can use them in both Chinese and English templates.
+%^^A! \end{itemize}
+%^^A!
+%
+% 代码实现主要面向对 \LaTeX{} 宏包开发感兴趣的用户。如果您有任何改进
+% 意见或者功能需求,欢迎前往 GitHub 仓库
+% \href{https://github.com/Stone-Zeng/fduthesis/issues}{提交 issue}。
+%^^A! If you want to read the implementation part, please turn to the
+%^^A! Chinese version. Any issues or feature requests can be submitted
+%^^A! in the \href{https://github.com/Stone-Zeng/fduthesis/issues}%
+%^^A! {GitHub repository}.
+%^^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}
+% 即可完成安装。
+%^^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!
+%
+% 如果您需要从 GitHub 上自行下载并手动安装,较好的方法是使用 TDS
+% 安装包:
+% \begin{itemize}
+% \item 从 GitHub 上下载 \cls{fduthesis} 的
+% \href{https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis.tds.zip}{TDS 安装包};
+% \item 按目录结构将 \file{fduthesis.tds.zip} 中的文件复制到 \TeX{}
+% 发行版的本地 TDS 根目录;
+% \item 执行 \bashcmd{mktexlsr} 刷新文件名数据库以完成安装。
+% \end{itemize}
+%^^A! If you want to download the template from GitHub and install it
+%^^A! manually, the recommended way is to use the TDS ZIP file:
+%^^A! \begin{itemize}
+%^^A! \item Download the \href{https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/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 \bashcmd{mktexlsr} to update the ls-R database.
+%^^A! \end{itemize}
+%^^A
+% 您也可以从源代码直接生成模板(不推荐):
+% \begin{itemize}
+% \item 打开 \href{https://github.com/Stone-Zeng/fduthesis}^^A
+% {项目主页},点击“Clone or download”,并选择“Download ZIP”,
+% 下载 \file{fduthesis-master.zip};如果您的电脑中安装有 git
+% 程序,也可通过以下命令直接克隆代码仓库:
+% \begin{shellexample}[gobble=7,alsoletter={.},^^A
+% morekeywords={git,clone}]
+% git clone https://github.com/Stone-Zeng/fduthesis.git
+% \end{shellexample}
+% \item 解压并进入到 \file{source} 文件夹,执行以下命令以生成
+% 模板的各组件:
+% \begin{shellexample}[gobble=7,morekeywords={xetex}]
+% xetex fduthesis.dtx
+% \end{shellexample}
+% \item 将生成的文档类(\file{.cls})、宏包(\file{.sty})以及
+% 参数配置文件(\file{.def})复制到 \TeX{} 发行版本地 TDS 树
+% 的 \path{texmf-local/tex/latex/fduthesis/} 目录下,并执行
+% \bashcmd{mktexlsr} 刷新文件名数据库,方可完成安装。
+% \end{itemize}
+%^^A! Although not recommended, you may generate the whole template
+%^^A! from source code as well:
+%^^A! \begin{itemize}
+%^^A! \item Open the project's \href{https://github.com/Stone-Zeng/fduthesis}%
+%^^A! {homepage}, click ``Clone or download'' and choose
+%^^A! ``Download ZIP'' to download \file{fduthesis-master.zip}.
+%^^A! If you have git program on your computer, you can also
+%^^A! clone the repository directly:
+%^^A! \begin{shellexample}[gobble=5,alsoletter={.},%
+%^^A! morekeywords={git,clone}]
+%^^A! git clone https://github.com/Stone-Zeng/fduthesis.git
+%^^A! \end{shellexample}
+%^^A! \item Extract files, and get into the \file{source} directory.
+%^^A! Run the following command to generate all the components:
+%^^A! \begin{shellexample}[gobble=5,morekeywords={xetex}]
+%^^A! xetex fduthesis.dtx
+%^^A! \end{shellexample}
+%^^A! \item Copy the generated document classes (\file{.cls}),
+%^^A! packages (\file{.sty}) and configuration files (\file{.def})
+%^^A! into \path{texmf-local/tex/latex/fduthesis/} under the local
+%^^A! TDS tree of \TeX{} distribution. Then run \bashcmd{mktexlsr}
+%^^A! to update the ls-R database.
+%^^A! \end{itemize}
+%^^A!
+%
+% \subsubsection{扁平化安装}
+%^^A! \subsubsection{\cls{fduthesis} on the fly}
+%^^A!
+%
+% 如果您不希望安装本模板,但需要立刻使用,也可以使用模板提供的安装脚本。
+% 从 GitHub 上获取代码仓库后,执行 \file{install-win.bat}(Windows 系统)
+% 或 \file{install-linux.sh}(Linux 系统),所有需要的文件便会在
+% \file{thesis} 文件夹中生成。
+%^^A! If you don't want to install \cls{fduthesis} but need to use it
+%^^A! at once, you can try the installation scripts. Download the
+%^^A! repository from GitHub, run \file{install-win.bat} (on Windows)
+%^^A! or \file{install-linux.sh} (on Linux), then all the necessary
+%^^A! files will be found in the \file{thesis} folder.
+%^^A!
+%
+% \subsection{模板组成}
+%^^A! \subsection{Composition of the template}
+%^^A!
+%
+% 本模板主要包含核心文档类、配置文件、附属宏包以及用户文档等几个
+% 部分,其具体组成见表~\ref{tab:fduthesis-components}。
+%^^A! There are several parts in \cls{fduthesis}, including kernel
+%^^A! template classes, configuration files, affiliated packages and
+%^^A! user's guides. More details are listed in table~%
+%^^A! \ref{tab:fduthesis-components}.
+%^^A!
+%
+% \begin{table}[ht]
+% \caption{\cls{fduthesis} 的主要组成部分}
+% \label{tab:fduthesis-components}
+% \centering
+% \begin{tabular}{lp{24em}}
+% \toprule
+% \textbf{文件} & \textbf{功能说明} \\
+% \midrule
+% \file{fduthesis.cls} & 中文模板文档类 \\
+% \file{fduthesis-en.cls} & 英文模板文档类 \\
+% \file{fduthesis.def} & 参数配置文件,用于设定
+% \cls{fduthesis} 的初始参数,不建议您自行改动 \\
+% \file{fdudoc.cls} & 用户手册文档类 \\
+% \file{fdulogo.sty} & 复旦大学视觉识别系统 \\
+% \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
+% \file{fduthesis-template.tex} & 空白模板,可据此为基础完成论文
+% 撰写 \\
+% \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{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! \file{fduthesis-template.tex} & An empty thesis template, and you can
+%^^A! write your thesis based on it. \\
+%^^A! \bottomrule
+%^^A! \end{tabular}
+%^^A! \end{table}
+%^^A!
+%
+% 如需生成用户手册 \file{fduthesis.pdf},可在命令行中执行
+% \begin{shellexample}[morekeywords={xelatex,makeindex},emph={-o,-s,-t}]
+% xelatex fduthesis.dtx
+% makeindex -s gind.ist -o fduthesis.ind fduthesis.idx
+% makeindex -s gglo.ist -o fduthesis.gls -t fduthesis.glg fduthesis.glo
+% xelatex fduthesis.dtx
+% xelatex fduthesis.dtx
+% \end{shellexample}
+% 也可使用 \pkg{latexmk}:
+% \begin{shellexample}[morekeywords={latexmk}]
+% latexmk fduthesis.dtx
+% \end{shellexample}
+% 本模板已经为编译用户手册提供了 \pkg{latexmk} 配置文件
+% \file{latexmkrc}。
+%
+% \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 subsection~%
+%^^A! \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!
+%
+% 需要注意,请不要把模板中的配置文件 \file{latexmkrc} 放置在工作
+% 文件夹下。该配置文件仅适用于生成模板用户手册。
+%^^A! Note that you should not put the profile \file{latexmkrc} in
+%^^A! your working directory. This file is meant to generate the
+%^^A! user's guide.
+%^^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!
+%
+% 双面模式下,正文部分偶数页(在左)的左页眉显示章标题,奇数页
+% (在右)的右页眉显示节标题;前置部分的页眉按同样格式显示,但文字
+% 均为对应标题(如“{\kaishu 目\textvisiblespace{}录}”、
+% “{\kaishu 摘\textvisiblespace{}要}”等)。
+% 而在单面模式下,正文部分则页面不分奇偶,均同时显示左、右页眉,
+% 文字分别为章标题和节标题;前置部分只有中间页眉,显示对应标题。
+%^^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
+%^^A! ``\textit{Contents}'', ``\textit{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
+%^^A! list. The options usually have the form of \kvopt{\meta{key}}%
+%^^A! {\meta{value}} 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}
+% 中的“|= 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 a Heuristic Viewpoint Concerning the Production
+% and Transformation of Light},
+% 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 a Heuristic Viewpoint Concerning the Production
+% and Transformation of Light},
+% 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=2017-09-23]{style/font}
+% \begin{fdusyntax}[emph={[1]font}]
+% font = (*<libertinus|lm|palatino|(times)|none>*)
+% \end{fdusyntax}
+%^^A-
+% 设置西文字体(包括数学字体)。
+% \end{function}
+%^^A! Set the western fonts (including math fonts).
+%^^A! \end{function}
+%^^A!
+%
+%^^A+
+% \begin{function}[rEXP,updated=2017-09-23]{style/cjk-font}
+% \begin{fdusyntax}[emph={[1]cjk-font}]
+% cjk-font = (*<adobe|(fandol)|founder|mac|windows|none>*)
+% \end{fdusyntax}
+%^^A-
+% 设置中文字体。
+% \end{function}
+%^^A! Set CJK (Chinese, Japanese and Korean) fonts.
+%^^A! \end{function}
+%^^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} 后,只有^^A
+% \emph{显式的}\FSID 会被替换为\FSFW,但在选择 \opt{mapping} 后,
+% \emph{所有的}\FSID 都会被替换。例如,如果您用宏保存了一些含有^^A
+% \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} 后仍需要临时显示^^A
+% \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 空格,因此这里用 X 来占位。
+% \begin{fdusyntax}[emph={[1]footnote-style}]
+% footnote-style = (*<plain|\\
+% XXXXXX\mbox{}~~~~~~~~~~~~~~~~~libertinus|libertinus*|libertinus-sans|\\
+% XXXXXX\mbox{}~~~~~~~~~~~~~~~~~pifont|pifont*|pifont-sans|pifont-sans*|\\
+% XXXXXX\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! XXXX\mbox{}~~~~~~~~~~~~~~~~~libertinus|libertinus*|libertinus-sans|\\
+%^^A! XXXX\mbox{}~~~~~~~~~~~~~~~~~pifont|pifont*|pifont-sans|pifont-sans*|\\
+%^^A! XXXX\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
+% \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=2017-12-08]{style/hyperlink-color}
+% \begin{fdusyntax}[emph={[1]hyperlink-color}]
+% hyperlink-color = (*<(default)|classic|elegant|fantasy|material|\\
+% XXXXXX\mbox{}~~~~~~~~~~~~~~~~~~business|science|summer|autumn|graylevel|prl>*)
+% \end{fdusyntax}
+% 设置超链接颜色。该选项在 \kvopt{hyperlink}{none} 时无效。
+% 各选项所代表的颜色见表~\ref{tab:hyperlink-color}。
+% \end{function}
+%^^A! \begin{function}[added=2017-08-13,updated=2017-12-08]{style/hyperlink-color}
+%^^A! \begin{fdusyntax}[emph={[1]hyperlink-color}]
+%^^A! hyperlink-color = (*<(default)|classic|elegant|fantasy|material|\\
+%^^A! XXXX\mbox{}~~~~~~~~~~~~~~~~~~business|science|summer|autumn|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
+%^^A-
+% \newcommand\linkcolorexam[3]{^^A
+% {\small 图~\textcolor[HTML]{#1}{1-2},
+% (\textcolor[HTML]{#1}{3.4})~式} &
+% {\small \textcolor[HTML]{#2}{\texttt{http://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
+% \textsf{选项} & \textsf{链接} & \textsf{URL} & \textsf{引用} \\
+%^^A! \begin{tabular}{c*{3}{>{\hspace{0.2cm}}c<{\hspace{0.2cm}}}}
+%^^A! \toprule
+%^^A! \textsf{Options} & \textsf{Cross references} & \textsf{URL} & \textsf{Citation} \\
+%^^A+
+% \midrule
+% \opt{default} & \linkcolorexam{990000}{0000B2}{007F00} \\
+% \opt{classic} & \linkcolorexam{FF0000}{0000FF}{00FF00} \\
+% \opt{elegant}\tnote{a} & \linkcolorexam{961212}{C31818}{9B764F} \\
+% \opt{fantasy}\tnote{b} & \linkcolorexam{FF4A19}{FF3F94}{934BA1} \\
+% \opt{material}\tnote{c} & \linkcolorexam{E91E63}{009688}{4CAF50} \\
+% \opt{business}\tnote{d} & \linkcolorexam{D14542}{295497}{1F6E43} \\
+% \opt{science}\tnote{e} & \linkcolorexam{CA0619}{389F9D}{FF8920} \\
+% \opt{summer}\tnote{f} & \linkcolorexam{00AFAF}{5F5FAF}{5F8700} \\
+% \opt{autumn}\tnote{f} & \linkcolorexam{D70000}{D75F00}{AF8700} \\
+% \opt{graylevel}\tnote{c} & \linkcolorexam{616161}{616161}{616161} \\
+% \opt{prl}\tnote{g} & \linkcolorexam{2D3092}{2D3092}{2D3092} \\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}
+%^^A-
+% \item[a] 来自 \href{https://tex.stackexchange.com/}^^A
+% {\TeX{} - \LaTeX{} Stack Exchange 网站}。
+% \item[b] Adobe CC 产品配色。
+% \item[c] 取自 Material 色彩方案
+% (见 \url{https://material.io/guidelines/style/color.html})。
+% \item[d] Microsoft Office 2016 产品配色。
+% \item[e] 来自 \href{https://www.wolfram.com/}{Wolfram Research 网站}。
+% \item[f] 均取自 Solarized 色彩方案
+% (见 \url{http://ethanschoonover.com/solarized})。
+% \item[g] \textit{Physical Review Letter} 杂志配色。
+%^^A! \item[a] From \href{https://tex.stackexchange.com/}%
+%^^A! {\TeX{} - \LaTeX{} Stack Exchange}.
+%^^A! \item[b] Adobe CC.
+%^^A! \item[c] Material Design color palette
+%^^A! (See \url{https://material.io/guidelines/style/color.html}).
+%^^A! \item[d] Microsoft Office 2016.
+%^^A! \item[e] From \href{https://www.wolfram.com/}{Wolfram Research website}.
+%^^A! \item[f] Solarized color palette
+%^^A! (See \url{http://ethanschoonover.com/solarized}).
+%^^A! \item[g] \textit{Physical Review Letter} magazine.
+%^^A+
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%^^A-
+%^^A!
+%
+%^^A+
+% \begin{function}[added=2018-01-25]{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}.
+%^^A! \end{function}
+%^^A!
+%
+% \begin{function}[added=2017-10-28,updated=2018-01-25]^^A
+% {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 \scite{gb-t-7714-2015} 中的著者—出版年制
+% 和顺序编码制。选择 \meta{其他样式} 时,如果 \kvopt{bib-backend}^^A
+% {bibtex},需保证相应的 \file{.bst} 格式文件能被调用;而如果
+% \kvopt{bib-backend}{biblatex},则需保证相应的 \file{.bbx} 格式文件
+% 能被调用。
+% \end{function}
+%^^A! \begin{function}[added=2017-10-28,updated=2018-01-25]%
+%^^A! {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(s)}*)
+%^^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}{\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 ensure
+%^^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]{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 \SI{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!
+%
+% \subsection{正文编写}
+%^^A! \subsection{Writing your thesis}
+%^^A!
+%
+% \begin{quote*}[喬孟符][宋]
+% 作樂府亦有法,曰\CJKunderdot{鳳頭豬肚豹尾}六字是也。
+% 大概起要美麗,中要浩蕩,結要響亮。尤貴在首尾貫穿,意思清新。
+% 茍能若是,斯可以言樂府矣。
+% \end{quote*}
+%
+% \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}
+% 生成目录。为了生成完整、正确的目录,您至少需要编译\emph{两次}。
+% \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! \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)。
+% 这两项可通过 \cs{fdusetup} 录入,具体
+% 请参阅 \ref{subsubsec:信息录入}~节。
+%^^A! At the end of abstract (both Chinese and English, if available),
+%^^A! keywords list and CLC number 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}|”,即第一列宽度自动调整,
+% 第二列限宽 \SI{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 (\SI{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},%
+%^^A! 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 subsubsection~%
+%^^A! \ref{subsubsec:style-and-format} for more details.
+%^^A! \end{function}
+%^^A!
+%
+%^^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
+% \begin{tabular}{cccccccc}
+% \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=2017-12-12]{\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{newtheorem} and \cs{newtheorem*}:
+%^^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{计数器} 的变化而清零。\scite{刘海洋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!
+%
+% \begin{function}{\caption}
+% \begin{fdusyntax}[deletetexcs={\caption},morekeywords={\caption}]
+% \caption(*\marg{图表标题}*)
+% \caption(*\oarg{短标题}\marg{长标题}*)
+% \end{fdusyntax}
+% 插入图表标题。可选参数 \meta{短标题} 用于图表目录。在
+% \meta{长标题} 中,您可以进行长达多段的叙述;但 \meta{短标题}
+% 和单独的 \meta{图表标题} 中则不允许分段。
+% \scite{刘海洋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!
+%
+% \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}^^A
+% {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
+%^^A! \meta{bib files} should be specified with option
+%^^A! \opt{style/bib-resource} (see subsubsection~%
+%^^A! \ref{subsubsec:style-and-format}). When \kvopt{bib-backend}%
+%^^A! {bibtex}, then \tn{printbibliography} is provided by
+%^^A! \pkg{biblatex} and the available options can be found in its
+%^^A! documentation.
+%^^A! \end{function}
+%^^A!
+%
+% \section{宏包依赖情况}
+%^^A! \section{Packages dependencies}
+%^^A!
+%
+% 使用不同编译方式、指定不同选项,会导致宏包依赖情况有所不同。
+% 具体如下:
+% \begin{itemize}
+% \item 在任何情况下,本模板都会\emph{显式}调用以下宏包
+% (或文档类):
+% \begin{itemize}
+% \item \pkg{expl3}、\pkg{xparse}、\pkg{xtemplate} 和
+% \pkg{l3keys2e},用于构建 \LaTeX3 编程环境
+% \scite{interfaces3,source3}。它们分属 \pkg{l3kernel} 和
+% \pkg{l3packages} 宏集。
+% \item \cls{ctexbook},提供中文排版的通用框架。属于 \CTeX{}
+% 宏集 \scite{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{natbib},提供增强的参考文献著录及引用支持。
+% \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} 宏包提供 \scite{natbib,gbt7714}。
+% \item 开启 \kvopt{style/bib-backend}{biblatex} 后,会调用
+% \pkg{biblatex} 宏包,并依赖 \biber{} 程序。参考文献样式由
+% \pkg{biblatex-gb7714-2015} 宏包提供
+% \scite{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{expl3}, \pkg{xparse}, \pkg{xtemplate} and
+%^^A! \pkg{l3keys2e}, belong to \pkg{l3kernel} and
+%^^A! \pkg{l3packages} bundles
+%^^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{natbib}
+%^^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[1]{{\small\OldUrl{#1}}}
+% \newcommand\CTANurl[1]{{\small\href{http://mirror.ctan.org/#1}^^A
+% {\ttfamily CTAN://#1}}}
+%
+% \bibitem{source2e}
+% \textsc{Braams J}, \textsc{Carlisle D}, \textsc{Jeffrey A}, et al.
+% \newblock \textit{The \LaTeXe{} Sources} [CP/OL].
+% \newblock (2018-04-01) \urlprefix
+% \CTANurl{macros/latex/base/source2e.pdf}
+%
+% \bibitem{CTeX}
+% \textsc{CTEX.ORG}.
+% \newblock \textit{\CTeX{} 宏集手册} [EB/OL].
+% \newblock version 2.4.12,
+% \newblock (2018-01-28) \urlprefix
+% \CTANurl{language/chinese/ctex/ctex.pdf}
+%
+% \bibitem{xeCJK}
+% \textsc{CTEX.ORG}.
+% \newblock \textit{\pkg{xeCJK} 宏包} [EB/OL].
+% \newblock version 3.7.0,
+% \newblock (2018-04-07) \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
+% \CTANurl{macros/latex/contrib/natbib/natbib.pdf}
+%
+% \bibitem{hmshan2017fduphdthesistemplate}
+% \textsc{hmshan}.
+% \newblock \textit{复旦博士论文模板} [EB/OL].
+% \newblock (2017-04-04) \urlprefix
+% \url{https://github.com/hmshan/FDU_PhD_Thesis_Template}
+%
+% \bibitem{knuth1986texbook}
+% \textsc{Knuth D E}.
+% \newblock \textit{The \TeX book: Computers \& Typesetting, volumn A} [M].
+% \newblock Boston: Addison--Wesley Publishing Company, 1986
+% \urlprefix {\small {\kaishu 源代码
+% \footnote{此代码只可作为学习之用。未经 Knuth 本人同意,您不应当编译此文档。}:}
+% \CTANurl{systems/knuth/dist/tex/texbook.tex}}
+%
+% \bibitem{interfaces3}
+% \textsc{The \LaTeX3 Project}.
+% \newblock \textit{The \LaTeX3 Interfaces} [EB/OL].
+% \newblock (2018-03-05) \urlprefix
+% \CTANurl{macros/latex/contrib/l3kernel/interface3.pdf}
+%
+% \bibitem{source3}
+% \textsc{The \LaTeX3 Project}.
+% \newblock \textit{The \LaTeX3 Sources} [CP/OL].
+% \newblock (2018-03-05) \urlprefix
+% \CTANurl{macros/latex/contrib/l3kernel/source3.pdf}
+%
+% \bibitem{biblatex}
+% \textsc{Lehman P}, \textsc{Kime P}, \textsc{Boruvka A}, et al.
+% \newblock \textit{The \pkg{biblatex} Package} [EB/OL].
+% \newblock version 3.11,
+% \newblock (2018-03-01) \urlprefix
+% \CTANurl{macros/latex/contrib/biblatex/doc/biblatex.pdf}
+%
+% \bibitem{mittelbach2004latexcompanion}
+% \textsc{Mittelbach F} and \textsc{Goossens M}.
+% \newblock \textit{The \LaTeX{} Companion} [M].
+% \newblock 2nd ed.
+% \newblock Boston: Addison--Wesley Publishing Company, 2004
+%
+% \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.2,
+% \newblock (2018-02-28) \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{} 介绍: 或 102 分钟了解 \LaTeXe{}} [EB/OL].
+% \newblock China\TeX{} 论坛, 译.
+% \newblock 原版版本 version 5.05, 中文版本 version 5.10,
+% \newblock (2017-03-26) \urlprefix
+% \CTANurl{info/lshort/chinese/lshort-zh-cn.pdf}
+%
+% \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{weijianwen2017sjtuthesis}
+% \textsc{weijianwen}.
+% \newblock \textit{A \XeLaTeX{} template for Shanghai Jiao Tong University (SJTU) thesis} [EB/OL].
+% \newblock version 0.10,
+% \newblock (2018-02-11) \urlprefix
+% \url{https://github.com/weijianwen/SJTUThesis}
+%
+% \bibitem{wright2009dtxfile}
+% \textsc{Wright J}.
+% \newblock \textit{A model dtx file} [EB/OL].
+% \newblock (2009-10-06) \urlprefix
+% \url{http://www.texdev.net/2009/10/06/a-model-dtx-file}
+%
+% \bibitem{gbt7714}
+% \textsc{Zeping Lee}.
+% \newblock \textit{GB/T 7714-2015 \BibTeX{} Style} [EB/OL].
+% \newblock version 1.0.3,
+% \newblock (2018-03-16) \urlprefix
+% \CTANurl{biblio/bibtex/contrib/gbt7714/gbt7714.pdf}
+%
+% \bibitem{zepinglee2017ustcthesis}
+% \textsc{Zeping Lee} and \textsc{seisman}.
+% \newblock \textit{\LaTeX{} template for USTC thesis v3.0} [EB/OL].
+% \newblock version 3.0.4,
+% \newblock (2018-04-03) \urlprefix
+% \url{https://github.com/ustctug/ustcthesis}
+%
+% \bibitem{数院毕业论文格式}
+% 复旦大学数学科学学院.
+% \newblock \textit{毕业论文格式 tex 版和 word 版} [EB/OL]. \urlprefix
+% \url{http://math.fudan.edu.cn/show.aspx?info_lb=664&flag=101&info_id=1816}
+%
+% \bibitem{数院毕业论文格式更新}
+% 复旦大学数学科学学院.
+% \newblock \textit{毕业论文格式: Word、\TeX{} 模板更新} [EB/OL]. \urlprefix
+% \url{http://math.fudan.edu.cn/Show.aspx?info_lb=664&info_id=1855&flag=101}
+%
+% \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}
+%
+% \bibitem{gb-t-7713.1-2006}
+% 国务院学位委员会办公室, 全国信息与文献标准化技术委员会.
+% \newblock \textit{学位论文编写规则: GB/T 7713.1--2006} [S].
+% \newblock 北京: 中国标准出版社, 2007
+%
+% \bibitem{胡伟2017latex2e}
+% 胡伟.
+% \newblock \textit{\LaTeXe{} 文类和宏包学习手册} [M].
+% \newblock 北京: 清华大学出版社, 2017
+%
+% \bibitem{biblatex-gb7714-2015}
+% 胡振震.
+% \newblock \textit{符合 GB/T 7714-2015 标准的 biblatex 参考文献样式} [EB/OL].
+% \newblock version 1.0i,
+% \newblock (2018-01-14) \urlprefix
+% {\small\href{http://mirror.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-gb7714-2015.pdf}^^A
+% {\ttfamily CTAN://macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-gb77 14-2015.pdf}}
+%
+% \bibitem{gb-t-15834-2011}
+% 教育部语言文字信息管理司.
+% \newblock \textit{标点符号用法: GB/T 15834--2011} [S].
+% \newblock 北京: 中国标准出版社, 2012
+%
+% \bibitem{cquthesis}
+% 李振楠.
+% \newblock \textit{\textsc{CquThesis}:重庆大学毕业论文 \LaTeX{} 模板} [EB/OL].
+% \newblock version 1.30,
+% \newblock (2018-02-23) \urlprefix
+% \CTANurl{macros/latex/contrib/cquthesis/cquthesis.pdf}
+%
+% \bibitem{刘海洋2013latex入门}
+% 刘海洋.
+% \newblock \textit{\LaTeX{} 入门} [M].
+% \newblock 北京: 电子工业出版社, 2013
+%
+% \bibitem{gb-t-7714-2015}
+% 全国信息与文献标准化技术委员会.
+% \newblock \textit{信息与文献 参考文献著录规则: GB/T 7714--2015} [S].
+% \newblock 北京: 中国标准出版社, 2015
+%
+% \bibitem{thuthesis}
+% 薛瑞尼.
+% \newblock \textit{\textsc{ThuThesis}:清华大学学位论文模板} [EB/OL].
+% \newblock version 5.4.3,
+% \newblock (2017-12-24) \urlprefix
+% \CTANurl{macros/latex/contrib/thuthesis/thuthesis.pdf}
+%
+% \end{thebibliography}
+%
+% \clearpage
+%
+%^^A! \end{document}
+%
+% \end{documentation}
+%
+%^^A \EnableImplementation
+%^^A \DisableImplementation
+%
+% \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}^^A
+% {\textsf{\textlangle *class\textrangle}} 的标记,这是
+% \pkg{DocStrip} 中的“guard”,用来选择性地提取文件。
+% “\textsf{*}”和“\textsf{/}”分别表示该部分的开始和结束。不含
+% “\textsf{*}”和“\textsf{/}”的 guard 出现在行号右侧,它们用来确定
+% 单独一行代码的归属。这些 guard 的颜色深浅不一,用以明确嵌套关系。
+%
+% 另有若干形如 \textcolor{MaterialPink}^^A
+% {\textsf{\textlangle @@=fdu\textrangle}} 的 guard ,它们由
+% \pkg{l3docstrip} 定义,用来指示名字空间(模块)。
+%
+% \subsection{准备}
+%
+% \begin{macrocode}
+%<@@=fdu>
+%<*class|class-en>
+% \end{macrocode}
+%
+% 检查 \LaTeX3 编程环境。
+% \begin{macrocode}
+\RequirePackage { xparse, xtemplate, l3keys2e }
+\clist_map_inline:nn { expl3, xparse, xtemplate, l3keys2e }
+ {
+ \@ifpackagelater {#1} { 2017/12/16 }
+ { } { \msg_error:nnn { fduthesis } { l3-too-old } {#1} }
+ }
+\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.
+ }
+% \end{macrocode}
+%
+% 目前 \cls{fduthesis} 仅支持 \XeTeX{} 和 \LuaTeX{}。
+% \begin{macrocode}
+\sys_if_engine_xetex:F
+ {
+ \sys_if_engine_luatex:F
+ {
+ \msg_fatal:nnx { fduthesis } { unsupported-engine }
+ { \c_sys_engine_str }
+ }
+ }
+\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".
+ }
+% \end{macrocode}
+%
+% \subsubsection{内部变量声明}
+%
+% \begin{variable}{\l_@@_tmpa_box,
+% \l_@@_tmpa_clist,\l_@@_tmpb_clist,
+% \l_@@_tmpa_dim,\l_@@_tmpb_dim,
+% \l_@@_tmpa_skip,
+% \l_@@_tmpa_tl,\l_@@_tmpb_tl}
+% 临时变量。
+% \begin{macrocode}
+\box_new:N \l_@@_tmpa_box
+\clist_new:N \l_@@_tmpa_clist
+\clist_new:N \l_@@_tmpb_clist
+\dim_new:N \l_@@_tmpa_dim
+\dim_new:N \l_@@_tmpb_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_int}
+% 论文类型。取值 1、2、3 分别对应博士、硕士、本科(学士),这与学号
+% 第三位是一致的。
+% \begin{macrocode}
+\int_new:N \g_@@_thesis_type_int
+% \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}{\cs_generate_variant:cn,
+% \file_input:V,
+% \int_to_arabic:v,
+% \keys_define:nx,
+% \tl_map_inline:xn}
+% \begin{macro}[TF]{\tl_if_eq:Vn}
+% \LaTeX3{} 函数变体。
+% \begin{macrocode}
+\cs_generate_variant:Nn \cs_generate_variant:Nn { cn }
+\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 \tl_map_inline:nn { xn }
+\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}
+%
+% \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_sep:nn,
+% \@@_define_format: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 } { \@@_symbol:n {#2} } }
+% \cs_new_protected:Npn \@@_define_sep:nn #1#2
+% { \tl_const:cn { c_@@_ #1 _sep_tl } {#2} }
+% \cs_new_protected:Npn \@@_define_format:nn #1#2
+% { \tl_const:cn { c_@@_ #1 _format_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,
+% \@@_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 \@@_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 .choice:,
+ type .value_required:n = true,
+ type .choices:nn =
+ { doctor, master, bachelor }
+ { \int_set_eq:NN \g_@@_thesis_type_int \l_keys_choice_int },
+ 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_tl"~ is~ unknown. }
+% \end{macrocode}
+%
+% 将文档类选项传给 |fdu/option|。
+% \begin{macrocode}
+\ProcessKeysOptions { fdu / option }
+% \end{macrocode}
+%
+% 载入参数配置文件。
+% \begin{macrocode}
+\file_input:n { fduthesis.def }
+\tl_if_empty:NF \g_@@_config_tl
+ {
+ \file_input:V \g_@@_config_tl
+ \@@_info:nx { load-config-file } { \g_@@_config_tl }
+ }
+\@@_msg_new:nn { load-config-file }
+ { You~ are~ loading~ config~ file~ '#1'. }
+% \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}
+%
+% 本模板会在 \pkg{ctexhook} 提供的钩子 \cs{ctex_at_end_preamble:n}
+% 中调用 \pkg{biblatex},而 \pkg{biblatex} 自身又会使用 \pkg{etoolbox}
+% 的钩子 \tn{AtEndPreamble},因此需要在载入 \cls{ctexbook} 之前调用
+% \pkg{etoolbox}。
+%
+% 钩子的顺序为:$\text{\tn{CTEX@document@left@hook}} \prec
+% \text{\tn{@endpreamblehook}} \prec
+% \text{\texttt{\textbackslash begin\{document\}}}$。
+% \begin{macrocode}
+\RequirePackage { etoolbox }
+% \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}
+%
+% \begin{macro}{\@@_check_package:nnn}
+% 检查过时宏包。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_check_package:nnn #1#2#3
+ {
+ \@ifpackagelater {#1} {#2}
+ { } { \@@_error:nnn { package-too-old } {#1} {#3} }
+ }
+\@@_msg_new:nn { package-too-old }
+ {
+ Package~ "#1"~ is~ too~ old. \\
+ The~ fduthesis~ class~ only~ supports~ "#1"~ with~ a~ version \\
+ higher~ than~ v#2. \\\\
+ Please~ update~ an~ up-to-date~ version~ of~ it~ using~ your \\
+ TeX~ package~ manager~ or~ from~ CTAN.
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\@@_check_package:nnn { ctex } { 2017/08/07 } { 2.4.10 }
+\@@_check_package:nnn { fontspec } { 2017/09/22 } { 2.6e }
+\@@_check_package:nnn { unicode-math } { 2017/11/18 } { 0.8i }
+\sys_if_engine_xetex:T
+ { \@@_check_package:nnn { xeCJK } { 2017/08/07 } { 3.5.0 } }
+% \end{macrocode}
+%
+% \subsection{页面布局}
+%
+% 利用 \pkg{geometry} 宏包设置纸张大小、页面边距以及页眉高度。这里,
+% $\SI{2.54}{\centi\meter}=\SI{1}{in}$,
+% $\SI{3.18}{\centi\meter}=\SI{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{字体}
+%
+% \changes{v0.5}{2017/09/09}{重新实现字体调用。核心内容是分离
+% 字体的声明与设定,并按照宋、黑、仿、楷划分中文字体。}
+%
+% 为了避免不必要的字体调用开销
+% \footnote{事实上,此处的修正对性能的提升并不大。},
+% 本模板把字体的\emph{声明}与\emph{设定}分离了开来。使用
+% \cs{fdusetup} 设置的字体选项,以及导言区中通过 \cs{setmainfont}、
+% \cs{setCJKmainfont} 等命令设置的字体,均按照字体\emph{声明}处理。
+% 此时,字体名及其选项被存入相关变量中,但不进行实际调用。导言区
+% 末尾,再进行统一调用。本模板将重新定义 \cs{setmainfont}、
+% \cs{setCJKmainfont} 等命令。
+%
+% 对于中文字体,\pkg{ctex} 宏包及其底层 \pkg{xeCJK} 和
+% \pkg{LuaTeX-ja},均与 \pkg{fontspec} 保持一致,以
+% |main|、|sans|、|mono| 三类进行划分;而本模板则按照
+% 宋、黑、仿、楷等进行划分。为此,需要额外建立二者之间的对应关系。
+%
+% \begin{variable}{\g_@@_font_name_prop,\g_@@_font_options_prop}
+% 存放西文字体名称及选项。
+% \begin{macrocode}
+\prop_new:N \g_@@_font_name_prop
+\prop_new:N \g_@@_font_options_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_cjk_font_name_prop,
+% \g_@@_cjk_font_options_prop}
+% 存放中文字体及选项。
+% \begin{macrocode}
+\prop_new:N \g_@@_cjk_font_name_prop
+\prop_new:N \g_@@_cjk_font_options_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \subsubsection{选项处理}
+%
+% 定义 |fdu/style| 键值类。
+% \begin{macrocode}
+\keys_define:nn { fdu / style }
+ {
+% \end{macrocode}
+%
+% \begin{macro}{style/font}
+% 预定义西文字体。部分等宽字体(TeX Gyre Cursor)使用
+% \kvopt{Ligatures}{Common\-Off} 选项以禁用连字。
+% \begin{macrocode}
+ font .choice:,
+ font .value_required:n = true,
+% \end{macrocode}
+% Libertinus 系列。
+% \begin{macrocode}
+ font / libertinus .code:n =
+ {
+ \fdu_choose_font:nn { main } { Libertinus~ Serif }
+ \fdu_choose_font:nn { sans } { Libertinus~ Sans }
+ \fdu_choose_font_with_option:nnn { mono }
+ { TeX~ Gyre~ Cursor } { Ligatures = Common Off }
+ \fdu_choose_font:nn { math } { Libertinus~ Math }
+ \keys_set:nn { fdu / style } { footnote-style = libertinus }
+ },
+% \end{macrocode}
+% Latin Modern 系列。
+% \begin{macrocode}
+ font / lm .code:n =
+ {
+ \fdu_choose_font:nn { main } { Latin~ Modern~ Roman }
+ \fdu_choose_font:nn { sans } { Latin~ Modern~ Sans }
+ \fdu_choose_font:nn { mono } { Latin~ Modern~ Mono }
+ \fdu_choose_font:nn { math } { Latin~ Modern~ Math }
+ \keys_set:nn { fdu / style } { footnote-style = pifont }
+ },
+% \end{macrocode}
+% Palatino 系列。
+% \begin{macrocode}
+ font / palatino .code:n =
+ {
+ \fdu_choose_font:nn { main } { TeX~ Gyre~ Pagella }
+ \fdu_choose_font:nn { sans } { TeX~ Gyre~ Heros }
+ \fdu_choose_font_with_option:nnn { mono }
+ { TeX~ Gyre~ Cursor } { Ligatures = Common Off }
+ \fdu_choose_font:nn { math } { TeX~ Gyre~ Pagella~ Math }
+ \keys_set:nn { fdu / style } { footnote-style = pifont }
+ },
+% \end{macrocode}
+% \changes{v0.6}{2017/11/11}{额外处理 XITS 字体的小型大写字母。}
+% Times Roman 系列。XITS 字体没有小型大写字母,因此使用普通字体代替。
+% \begin{macrocode}
+ font / times .code:n =
+ {
+ \fdu_choose_font_with_option:nnn { main } { XITS }
+ {
+ UprightFeatures = { SmallCapsFont = * },
+ BoldFeatures = { SmallCapsFont = *~ Bold },
+ ItalicFeatures = { SmallCapsFont = *~ Italic },
+ BoldItalicFeatures = { SmallCapsFont = *~ Bold~ Italic },
+ }
+ \fdu_choose_font:nn { sans } { TeX~ Gyre~ Heros }
+ \fdu_choose_font_with_option:nnn { mono }
+ { TeX~ Gyre~ Cursor } { Ligatures = Common Off }
+ \fdu_choose_font:nn { math } { XITS~ Math }
+ \keys_set:nn { fdu / style } { footnote-style = xits }
+ },
+% \end{macrocode}
+% \changes{v0.5}{2017/09/23}{新增 \kvopt{font}{none} 选项。}
+% 不设置西文字体。
+% \begin{macrocode}
+ font / none .code:n =
+ {
+ \@@_initialize_prop:Nn \g_@@_font_name_prop
+ { main, sans, mono, math }
+ \@@_initialize_prop:Nn \g_@@_font_options_prop
+ { main, sans, mono, math }
+ \keys_set:nn { fdu / style } { footnote-style = plain }
+%<*class>
+ },
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{style/cjk-font}
+% 预定义中文(CJK)字体。Adobe 和中易系列没有粗宋体。
+% \begin{macrocode}
+ cjk-font .choice:,
+ cjk-font .value_required:n = true,
+% \end{macrocode}
+% Adobe 系列。
+% \begin{macrocode}
+ cjk-font / adobe .code:n =
+ {
+ \fdu_choose_cjk_font:nn { song } { Adobe~ Song~ Std }
+ \fdu_choose_cjk_font:nn { hei } { Adobe~ Heiti~ Std }
+ \fdu_choose_cjk_font:nn { fang } { Adobe~ Fangsong~ Std }
+ \fdu_choose_cjk_font:nn { kai } { Adobe~ Kaiti~ Std }
+ },
+% \end{macrocode}
+% Fandol 系列。
+% \begin{macrocode}
+ cjk-font / fandol .code:n =
+ {
+ \fdu_choose_cjk_font_with_option:nnn { song }
+ { FandolSong } { BoldFont = FandolSong~ Bold }
+ \fdu_choose_cjk_font:nn { hei } { FandolHei }
+ \fdu_choose_cjk_font:nn { fang } { FandolFang }
+ \fdu_choose_cjk_font:nn { kai } { FandolKai }
+ },
+% \end{macrocode}
+% 方正系列。
+% \begin{macrocode}
+ cjk-font / founder .code:n =
+ {
+ \fdu_choose_cjk_font_with_option:nnn { song }
+ { FZShuSong-Z01 } { BoldFont = FZXiaoBiaoSong-B05 }
+ \fdu_choose_cjk_font:nn { hei } { FZHei-B01 }
+ \fdu_choose_cjk_font:nn { fang } { FZFangSong-Z02 }
+ \fdu_choose_cjk_font:nn { kai } { FZKai-Z03 }
+ },
+% \end{macrocode}
+% Mac (华文)系列。
+% \begin{macrocode}
+ cjk-font / mac .code:n =
+ {
+ \fdu_choose_cjk_font_with_option:nnn { song }
+ { STSong } { BoldFont = STZhongsong }
+ \fdu_choose_cjk_font:nn { hei } { STHeiti }
+ \fdu_choose_cjk_font:nn { fang } { STFangsong }
+ \fdu_choose_cjk_font:nn { kai } { STKaiti }
+ },
+% \end{macrocode}
+% Windows (中易)系列。
+% \begin{macrocode}
+ cjk-font / windows .code:n =
+ {
+ \fdu_choose_cjk_font:nn { song } { SimSun }
+ \fdu_choose_cjk_font:nn { hei } { SimHei }
+ \fdu_choose_cjk_font:nn { fang } { FangSong }
+ \fdu_choose_cjk_font:nn { kai } { KaiTi }
+ },
+% \end{macrocode}
+% \changes{v0.5}{2017/09/23}{新增 \kvopt{cjk-font}{none} 选项。}
+% 不设置中文字体。
+% \begin{macrocode}
+ cjk-font / none .code:n =
+ {
+ \@@_initialize_prop:Nn \g_@@_cjk_font_name_prop
+ { rm, sf, tt, kai }
+ \@@_initialize_prop:Nn \g_@@_cjk_font_options_prop
+ { rm, sf, tt, kai }
+%</class>
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_initialize_prop:Nn}
+% 把 |prop-list| 清空,将其并设置为 |main={},| |sans={}| 等。
+% \begin{arguments}
+% \item |prop-list|
+% \item {\meta{family 1}, \meta{family 2}, \ldots},如
+% |{main,| |sans,| |mono,| |math}|
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialize_prop:Nn #1#2
+ {
+ \prop_gclear:N #1
+ \clist_map_inline:nn {#2} { \prop_gput:Nnn #1 {##1} { } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{字体声明}
+%
+% 重定义文档命令,使其只声明字体,而不进行实际调用。
+%
+% \begin{macro}{\setmainfont,\setsansfont,\setmonofont,\setmathfont}
+% 声明西文字体。参数按照 \pkg{fontspec} 的风格,字体选项
+% 在前在后均可。
+% \begin{macrocode}
+\clist_map_inline:nn
+ { main, sans, mono, math }
+ {
+ \exp_args:Nc \RenewDocumentCommand { set #1 font } { O { } m O { } }
+ { \fdu_choose_font_with_option:nnn { #1 } {##2} { ##1, ##3 } }
+ }
+% \RenewDocumentCommand \setmainfont { O { } m O { } }
+% { \fdu_choose_font_with_option:nnn { main } {#2} { #1, #3 } }
+% \RenewDocumentCommand \setsansfont { O { } m O { } }
+% { \fdu_choose_font_with_option:nnn { sans } {#2} { #1, #3 } }
+% \RenewDocumentCommand \setmonofont { O { } m O { } }
+% { \fdu_choose_font_with_option:nnn { mono } {#2} { #1, #3 } }
+% \RenewDocumentCommand \setmathfont { O { } m O { } }
+% { \fdu_choose_font_with_option:nnn { math } {#2} { #1, #3 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setCJKmainfont,\setCJKsansfont,\setCJKmonofont,
+% \setCJKfamilyfont}
+% 声明中文字体。参数同样按照 \pkg{fontspec} 的风格
+% \footnote{\pkg{xeCJK} 和 \pkg{ctex} 与之稍有区别,它们要求字体
+% 选项只能位于字体名的\emph{前或后},而不能同时出现(即不允许形如
+% \cs{setCJKmainfont}\texttt{\oarg{选项 1}\marg{字体}\oarg{选项 2}}
+% 这样的语句)。}。
+% \begin{macrocode}
+%<*class>
+\RenewDocumentCommand \setCJKmainfont { O { } m O { } }
+ { \fdu_choose_cjk_font_with_option:nnn { rm } {#2} { #1, #3 } }
+\RenewDocumentCommand \setCJKsansfont { O { } m O { } }
+ { \fdu_choose_cjk_font_with_option:nnn { sf } {#2} { #1, #3 } }
+\RenewDocumentCommand \setCJKmonofont { O { } m O { } }
+ { \fdu_choose_cjk_font_with_option:nnn { tt } {#2} { #1, #3 } }
+\RenewDocumentCommand \setCJKfamilyfont { m O { } m O { } }
+ { \fdu_choose_cjk_font_with_option:nnn {#1} {#3} { #2, #4 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setCJKsongfont,\setCJKheifont,
+% \setCJKfangfont,\setCJKkaifont}
+% 声明中文宋、黑、仿、楷字体,暂时不用。
+% \begin{macrocode}
+% \DeclareDocumentCommand \setCJKsongfont { O { } m O { } }
+% { \fdu_choose_cjk_font_with_option:nnn { song } {#2} { #1, #3 } }
+% \DeclareDocumentCommand \setCJKheifont { O { } m O { } }
+% { \fdu_choose_cjk_font_with_option:nnn { hei } {#2} { #1, #3 } }
+% \DeclareDocumentCommand \setCJKfangfont { O { } m O { } }
+% { \fdu_choose_cjk_font_with_option:nnn { fang } {#2} { #1, #3 } }
+% \DeclareDocumentCommand \setCJKkaifont { O { } m O { } }
+% { \fdu_choose_cjk_font_with_option:nnn { kai } {#2} { #1, #3 } }
+%</class>
+% \end{macrocode}
+% \end{macro}
+%
+% 字体选择只需将字体名及选项存入相应变量即可。
+%
+% \begin{macro}{\fdu_choose_font_with_option:nnn,\fdu_choose_font:nn}
+% 选择西文字体。
+% \begin{arguments}
+% \item |main| / |sans| / |mono| / |math|
+% \item 字体名
+% \item 选项
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \fdu_choose_font_with_option:nnn #1#2#3
+ {
+ \prop_gput:Nnn \g_@@_font_name_prop {#1} {#2}
+ \prop_gput:Nnn \g_@@_font_options_prop {#1} {#3}
+ }
+\cs_new_protected:Npn \fdu_choose_font:nn #1#2
+ {
+ \prop_gput:Nnn \g_@@_font_name_prop {#1} {#2}
+ \prop_gput:Nnn \g_@@_font_options_prop {#1} { }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fdu_choose_cjk_font_with_option:nnn,
+% \fdu_choose_cjk_font:nn}
+% 选择中文字体。
+% \begin{arguments}
+% \item |rm| / |sf| / |tt| 或 |song| / |hei| / |fang| / |kai|
+% \item 字体名
+% \item 选项
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \fdu_choose_cjk_font_with_option:nnn #1#2#3
+ {
+ \prop_gput:Nnn \g_@@_cjk_font_name_prop {#1} {#2}
+ \prop_gput:Nnn \g_@@_cjk_font_options_prop {#1} {#3}
+ }
+\cs_new_protected:Npn \fdu_choose_cjk_font:nn #1#2
+ {
+ \prop_gput:Nnn \g_@@_cjk_font_name_prop {#1} {#2}
+ \prop_gput:Nnn \g_@@_cjk_font_options_prop {#1} { }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{字体设定}
+%
+% 此时需要利用 \pkg{fontspec}、\pkg{unicode-math}、\pkg{xeCJK}、
+% \pkg{ctex} 等宏包完成实际的字体调用。会在导言区末尾统一进行。
+%
+% \begin{macro}{\@@_set_font:}
+% 设定西文字体。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_font:
+ {
+ \clist_map_inline:nn { main, sans, mono, math }
+ {
+ \prop_get:NnN \g_@@_font_name_prop {##1} \l_@@_tmpa_tl
+ \prop_get:NnN \g_@@_font_options_prop {##1} \l_@@_tmpb_tl
+ \tl_if_empty:NT \l_@@_tmpa_tl
+ { \@@_error:nn { font-not-defined } {##1} }
+ \use:c { @@_set_ ##1 _font:VV } \l_@@_tmpa_tl \l_@@_tmpb_tl
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.5}{2017/09/23}{同步 \pkg{fontspec} v2.6e。}
+%
+% \begin{macro}{\@@_set_main_font:nn,
+% \@@_set_sans_font:nn,
+% \@@_set_mono_font:nn}
+% 拷贝 \cs{__fontspec_main_setmainfont:nn} 等命令。注意参数顺序
+% 是相反的。
+% \begin{arguments}
+% \item 字体名
+% \item 选项
+% \end{arguments}
+% \begin{macrocode}
+\clist_map_inline:nn { main, sans, mono }
+ {
+ \cs_new_protected:cpx { @@_set_ #1 _font:nn } ##1 ##2
+ { \exp_not:c { __fontspec_main_set #1 font:nn } {##2} {##1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.6}{2017/10/11}{同步 \pkg{unicode-math} v0.8h。}
+%
+% \begin{macro}{\@@_set_math_font:nn}
+% 拷贝 \pkg{unicode-math} 中的 \cs{setmathfont} 命令。参数同上。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_math_font:nn #1#2
+ { \__um_setmathfont:nn {#2} {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% 生成字体设定函数的变体。
+% \begin{macrocode}
+\clist_map_inline:nn { main, sans, mono, math }
+ { \cs_generate_variant:cn { @@_set_ #1 _font:nn } { VV } }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_set_cjk_font:}
+% 设定中文字体。复杂之处在于需要建立宋、黑、仿、楷到
+% |rm| / |sf| / |tt| 的映照,如表~\ref{tab:cjk-font} 所示。
+% \begin{table}[ht]
+% \caption{宋、黑、仿、楷到 \texttt{rm} / \texttt{sf} /
+% \texttt{tt} 的映照}
+% \label{tab:cjk-font}
+% \centering
+% \begin{tabular}{ccccc}
+% \toprule
+% & Normal & Bold & Italic & Bold-italic \\
+% \midrule
+% |rm| & 宋体 & [粗宋] / \textsf{黑体} & \textit{楷体} & (\textit{粗楷}) \\
+% |sf| & \textsf{黑体} & (\textsf{粗黑}) & \textsf{黑体} & \textsf{黑体} \\
+% |tt| & \texttt{仿体} & (\texttt{粗仿}) & \textit{楷体} & (\textit{粗楷}) \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% \begin{macrocode}
+%<*class>
+\cs_new_protected:Npn \@@_set_cjk_font:
+ {
+ \clist_map_inline:nn { rm, sf, tt, kai }
+ {
+ \use:c { @@_parse_cjk_ ##1 _font: }
+ \@@_check_cjk_font:n {##1}
+ \@@_set_cjk_font_aux:n {##1}
+ }
+% \end{macrocode}
+% 清除冗余键值对。
+% \begin{macrocode}
+ \clist_map_inline:nn { song, hei, fang }
+ {
+ \prop_gremove:Nn \g_@@_cjk_font_name_prop {##1}
+ \prop_gremove:Nn \g_@@_cjk_font_options_prop {##1}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_font_name_tl,\l_@@_font_options_clist}
+% 临时存放字体名称和选项。
+% \begin{macrocode}
+\tl_new:N \l_@@_font_name_tl
+\clist_new:N \l_@@_font_options_clist
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_parse_cjk_rm_font:}
+% 解析 |rm| 字体族。未设置 |rm| 字体族(即未调用 \cs{setmainfont})
+% 时,传入 |song| 对应的字体名和选项。|sf| 和 |tt| 字体族的解析
+% 基本类似。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_cjk_rm_font:
+ {
+ \prop_get:NnNF \g_@@_cjk_font_name_prop
+ { rm } \l_@@_font_name_tl
+ {
+ \@@_get_cjk_font_name_options:nn { rm } { song }
+% \end{macrocode}
+% 根据 \opt{粗宋/黑} 选项来进行操作。目前暂未定义该选项,利用
+% \cs{use_ii:nn} 充当条件判断。使用黑体。
+% \begin{macrocode}
+ \use_ii:nn
+ {
+% \end{macrocode}
+% 粗宋。判断是否定义 \opt{BoldFont},若未定义,则设置 \opt{BoldFont}
+% 为普通宋体。
+% \begin{macrocode}
+ \tl_if_in:NnF \l_@@_font_options_clist { BoldFont = }
+ {
+ \clist_put_right:Nx \l_@@_font_options_clist
+ { BoldFont = \l_@@_font_name_tl }
+ }
+ }
+ {
+% \end{macrocode}
+% 黑体。注意右侧选项会覆盖左侧选项。\\
+% \begin{macrocode}
+% TODO: (2017/09/18) `hei` or `sans`?
+ \prop_get:NnN \g_@@_cjk_font_name_prop { hei }
+ \l_@@_tmpa_tl
+ \clist_put_right:Nx \l_@@_font_options_clist
+ { BoldFont = \l_@@_tmpa_tl }
+ }
+ \@@_get_cjk_kai_font:
+ \@@_set_cjk_font_options:n { rm }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_cjk_sf_font:}
+% 解析 |sf| 字体族。未设置 |sf| 字体族(即未调用 \cs{setsansfont})
+% 时,传入 |hei| 对应的字体名和选项。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_cjk_sf_font:
+ {
+ \prop_get:NnNF \g_@@_cjk_font_name_prop
+ { sf } \l_@@_font_name_tl
+ {
+ \@@_get_cjk_font_name_options:nn { sf } { hei }
+% \end{macrocode}
+% 黑体的 \opt{BoldFont}、\opt{ItalicFont}、\opt{BoldItalicFont}
+% 都使用普通字体。不需要载入楷体。
+% \begin{macrocode}
+ \clist_put_right:Nx \l_@@_font_options_clist
+ {
+ BoldFont = \l_@@_font_name_tl,
+ ItalicFont = \l_@@_font_name_tl,
+ BoldItalicFont = \l_@@_font_name_tl
+ }
+ \@@_set_cjk_font_options:n { sf }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_cjk_tt_font:}
+% 解析 |tt| 字体族。未设置 |tt| 字体族(即未调用 \cs{setmonofont})
+% 时,传入 |fang| 对应的字体名和选项。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_cjk_tt_font:
+ {
+ \prop_get:NnNF \g_@@_cjk_font_name_prop
+ { tt } \l_@@_font_name_tl
+ {
+ \@@_get_cjk_font_name_options:nn { tt } { fang }
+ \clist_put_right:Nx \l_@@_font_options_clist
+ { BoldFont = \l_@@_font_name_tl }
+ \@@_get_cjk_kai_font:
+ \@@_set_cjk_font_options:n { tt }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_cjk_kai_font:}
+% 解析 |kai| 字体族。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_cjk_kai_font:
+ {
+ \prop_get:NnN \g_@@_cjk_font_name_prop { kai }
+ \l_@@_font_name_tl
+% \end{macrocode}
+% 与黑体类似,楷体的 \opt{BoldFont}、\opt{ItalicFont}、
+% \opt{BoldItalicFont} 也都使用普通字体。
+% \begin{macrocode}
+ \clist_set:Nx \l_@@_font_options_clist
+ {
+ BoldFont = \l_@@_font_name_tl,
+ ItalicFont = \l_@@_font_name_tl,
+ BoldItalicFont = \l_@@_font_name_tl
+ }
+ \@@_set_cjk_font_options:n { kai }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_get_cjk_font_name_options:nn}
+% 处理字体名称和选项。字体名存入 \cs{l_@@_font_name_tl},字体
+% 选项存入 \cs{l_@@_font_options_clist}。注意字体名还被存入了
+% |prop-list| 中(对应的 \meta{key} = |#1|),但选项则在
+% |\__fdu_parse_cjk_..._font:| 的最后才会被存入 |prop-list| 中。
+% 因此还需要有 \cs{@@_set_cjk_font_options:n} 来设置选项。
+% \begin{arguments}
+% \item |rm| / |sf| / |tt|
+% \item |song| / |hei| / |fang|
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_get_cjk_font_name_options:nn #1#2
+ {
+ \prop_get:NnN \g_@@_cjk_font_name_prop {#2} \l_@@_font_name_tl
+ \prop_gput:NnV \g_@@_cjk_font_name_prop {#1} \l_@@_font_name_tl
+ \prop_get:NnN \g_@@_cjk_font_options_prop {#2} \l_@@_tmpa_tl
+ \clist_set:NV \l_@@_font_options_clist \l_@@_tmpa_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_get_cjk_kai_font:}
+% 补齐斜体、粗斜体(都设置为楷体)。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_get_cjk_kai_font:
+ {
+ \prop_get:NnN \g_@@_cjk_font_name_prop { kai }
+ \l_@@_tmpa_tl
+ \clist_put_right:Nx \l_@@_font_options_clist
+ {
+ ItalicFont = \l_@@_tmpa_tl,
+ BoldItalicFont = \l_@@_tmpa_tl
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_cjk_font_options:n}
+% \begin{macrocode}
+% 设置选项,即把选项存入 |prop-list|,对应 \meta{key} = |#1|。
+% |#1| = |rm| / |sf| / |tt|。
+\cs_new_protected:Npn \@@_set_cjk_font_options:n #1
+ {
+ \prop_put:NnV \g_@@_cjk_font_options_prop {#1}
+ \l_@@_font_options_clist
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_check_cjk_font:n}
+% 检查 CJK 字体族是否已定义。
+% |#1| = |rm| / |sf| / |tt|。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_check_cjk_font:n #1
+ {
+ \prop_get:NnN \g_@@_cjk_font_name_prop {#1}
+ \l_@@_font_name_tl
+ \tl_if_empty:NT \l_@@_font_name_tl
+ { \@@_error:nn { cjk-font-not-defined } {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xeCJK_set_family:nVV,\ctex_ltj_set_family:nVV}
+% 生成 \pkg{xeCJK} 和 \pkg{ctex} 中字体族设定函数的变体。
+% 由于 \cs{@@_set_cjk_font_aux:nnnn} 使用了
+% \cs{cs_new_protected:Npx} 定义,因此必须在它之前给出变体形式。
+% \begin{macrocode}
+\cs_generate_variant:Nn \xeCJK_set_family:nnn { nVV }
+\cs_generate_variant:Nn \ctex_ltj_set_family:nnn { nVV }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_cjk_font_aux:n}
+% 利用 \pkg{xeCJK} 或 \pkg{ctex-ltj} 调用字体,需按照引擎的不同
+% 分别处理。使用 |Npx| 型来定义是为了在定义时直接确定引擎,以避开
+% 调用时的判断。
+% |#1| = |rm| / |sf| / |tt|。
+% \begin{macrocode}
+\cs_new_protected:Npx \@@_set_cjk_font_aux:n #1
+ {
+ \prop_get:NnN \exp_not:N \g_@@_cjk_font_name_prop {#1}
+ \exp_not:N \l_@@_tmpa_tl
+ \prop_get:NnN \exp_not:N \g_@@_cjk_font_options_prop {#1}
+ \exp_not:N \l_@@_tmpb_tl
+ \sys_if_engine_xetex:TF
+ { \xeCJK_set_family:nVV }
+ { \sys_if_engine_luatex:T { \ctex_ltj_set_family:nVV } }
+ {#1} \exp_not:n { \l_@@_tmpb_tl \l_@@_tmpa_tl }
+ }
+%</class>
+% \end{macrocode}
+% \end{macro}
+%
+% 字体族未定义信息。
+% \begin{macrocode}
+\@@_msg_new:nn { font-not-defined }
+ {
+ \str_upper_case:f { \tl_head:n {#1} } \tl_tail:n {#1} ~
+ font~ is~ not~ defined. \\\\
+ You~ can~ set~ option~ "font"~ via~ "\string\fdusetup",~
+ or~ use~ command~ \\
+ "\string\set #1 font"~ to~ define~ new~ font~ families.
+ }
+%<*class>
+\@@_msg_new:nn { cjk-font-not-defined }
+ {
+ CJK~ font~ family~ "#1"~ is~ not~ defined. \\\\
+ You~ can~ set~ option~ "cjk-font"~ via~ "\string\fdusetup",~
+ or~ use~ commands~ \\
+ "\string\setCJKmainfont",~ "\string\setCJKsansfont"~ or~
+ "\string\setCJKmonofont",~ etc~ \\
+ to~ define~ new~ CJK~ font~ families.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\sys_if_engine_xetex:T
+ {
+% \end{macrocode}
+% 这里给这两个 |prop-list| 变量赋一个空值,使得 \pkg{xeCJK} 认为
+% |rm| 字体族已定义,从而避免警告。\LuaTeX{} 引擎下,
+% \pkg{ctex-ltj} 不会给出警告,暂且不管。
+% \begin{macrocode}
+ \prop_gput:Nnn \g__xeCJK_family_font_name_prop { rm } { }
+ \prop_gput:Nnn \g__xeCJK_family_name_prop { rm } { }
+% \end{macrocode}
+% 关闭 \pkg{xeCJK} 中重定义字体族的警告。
+% \begin{macrocode}
+ \msg_redirect_name:nnn { xeCJK } { CJKfamily-redef } { none }
+ }
+%</class>
+% \end{macrocode}
+%
+% 在导言区末尾载入字体。
+% \begin{macrocode}
+\ctex_at_end_preamble:n
+ {
+ \@@_set_font:
+%<class> \@@_set_cjk_font:
+ }
+% \end{macrocode}
+%
+% \subsubsection{字体切换(楷体)}
+%
+% 一般情况下,楷体被用作中文斜体。但有时需要保持西文部分不被倾斜,
+% 因此需要额外定义楷体切换命令。
+%
+% \begin{macro}[TF]{\fdu_family_if_exist:n}
+% \changes{v0.4}{2017/08/10}{修复 \LuaTeX{} 下的展开错误。}
+% 判断字体族是否存在。
+% \XeTeX{} 引擎下直接利用 \pkg{xeCJK} 宏包提供的函数。
+% \begin{macrocode}
+%<*class>
+\sys_if_engine_xetex:TF
+ {
+ \prg_new_protected_conditional:Npnn
+ \fdu_family_if_exist:n #1 { TF }
+ {
+ \xeCJK_family_if_exist:nTF {#1}
+ { \prg_return_true: } { \prg_return_false: }
+ }
+ }
+ {
+% \end{macrocode}
+% \LuaTeX{} 引擎下需要利用 \pkg{ctex} 宏包提供的函数。这两个函数
+% 的参数略有不同。
+% \begin{macrocode}
+ \sys_if_engine_luatex:T
+ {
+ \prg_new_protected_conditional:Npnn
+ \fdu_family_if_exist:n #1 { TF }
+ {
+ \ctex_ltj_family_if_exist:nNTF {#1} \l_@@_tmpa_tl
+ { \prg_return_true: } { \prg_return_false: }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fdu_cjk_font_kai:}
+% 楷体切换命令。
+% \begin{macrocode}
+\cs_new_protected:Npx \fdu_cjk_font_kai:
+ {
+ \fdu_family_if_exist:nTF { kai }
+ {
+ \sys_if_engine_xetex:TF
+ { \xeCJK_switch_family:n { kai } }
+ {
+ \sys_if_engine_luatex:T
+ { \ctex_ltj_switch_family:n { kai } }
+ }
+ }
+ { \exp_not:n { \rmfamily \itshape } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\fdu@kai}
+% 命令 \cs{fdu_cjk_font_kai:} 采用 \LaTeX3 风格,在 \file{.toc}
+% 文件里无法正常使用,因此重新定义为 \LaTeXe{} 风格的命令。
+% \begin{macrocode}
+\cs_new_eq:NN \fdu@kai \fdu_cjk_font_kai:
+%</class>
+% \end{macrocode}
+% \end{macro}
+%
+% \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{macrocode}
+\keys_define:nn { fdu / style }
+ {
+% \end{macrocode}
+%
+% \begin{macro}{style/font-size}
+% |font-size| 不是文档类选项,不能传给 \cls{ctexbook} 文档类,因此
+% 只能手动重定义字号命令。
+% \begin{macrocode}
+ font-size .choice:,
+ font-size .value_required:n = true,
+ font-size / -4 .code:n = { },
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tiny,\scriptsize,\footnotesize,\small,
+% \normalsize,\large,\Large,\LARGE,\huge,\Huge}
+% 默认使用小四号字,所以只有五号字需要重新设置。
+% \begin{macrocode}
+ font-size / 5 .code:n =
+ {
+ \RenewDocumentCommand \tiny { } { \zihao { 7 } }
+ \RenewDocumentCommand \scriptsize { } { \zihao { -6 } }
+ \RenewDocumentCommand \footnotesize { } { \zihao { 6 } }
+ \RenewDocumentCommand \small { } { \zihao { -5 } }
+ \RenewDocumentCommand \normalsize { } { \zihao { 5 } }
+ \RenewDocumentCommand \large { } { \zihao { -4 } }
+ \RenewDocumentCommand \Large { } { \zihao { -3 } }
+ \RenewDocumentCommand \LARGE { } { \zihao { -2 } }
+ \RenewDocumentCommand \huge { } { \zihao { 2 } }
+ \RenewDocumentCommand \Huge { } { \zihao { 1 } }
+%<class-en> }
+%<class-en> }
+%<*class>
+ },
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{句号}
+%
+% \begin{macro}{style/fullwidth-stop}
+% \changes{v0.6}{2017/10/14}{支持类别码和 TECKit 映射两种机制。}
+% 设置句号形状(圆圈或是圆点)。
+% \begin{macrocode}
+ 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:}
+% 将\FSID 设置为活动符,并定义为句点\FSFW。
+% \begin{macrocode}
+\cs_new:Npn \@@_set_fullwidth_stop_catcode:
+ {
+ \char_set_active_eq:nN { "3002 } \c_@@_fullwidth_full_stop_tl
+ \char_set_catcode_active:n { "3002 }
+ }
+%</class>
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.6}{2017/10/28}{优化 \LuaTeX{} 下希腊字母、西里尔字母
+% 和带圈数字的显示(\pkg{ctex} v2.4.11 已默认进行处理)。}
+%
+% \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}
+%
+% \subsection{页眉页脚}
+%
+% 清除默认页眉页脚格式。
+% \begin{macrocode}
+\fancyhf { }
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_header_center_mark_tl}
+% 保存中间页眉的文字。正文中设置为空,目录、摘要、符号表等设置为
+% 相应标题。
+% \begin{macrocode}
+\tl_new:N \l_@@_header_center_mark_tl
+% \end{macrocode}
+% \end{variable}
+%
+% 构建页眉,要在单面或双面下分别设置。
+%
+% \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
+%<*class>
+ {
+ \fancyhead [ EL ] { \small \nouppercase { \fdu@kai \leftmark } }
+ \fancyhead [ OR ] { \small \nouppercase { \fdu@kai \rightmark } }
+ }
+ {
+ \fancyhead [ L ] { \small \nouppercase { \fdu@kai \leftmark } }
+ \fancyhead [ R ] { \small \nouppercase { \fdu@kai \rightmark } }
+ \fancyhead [ C ]
+ {
+ \small \nouppercase
+ { \fdu@kai \l_@@_header_center_mark_tl }
+ }
+ }
+%</class>
+%<*class-en>
+ {
+ \fancyhead [ EL ] { \small \nouppercase { \itshape \leftmark } }
+ \fancyhead [ OR ] { \small \nouppercase { \itshape \rightmark } }
+ }
+ {
+ \fancyhead [ L ] { \small \nouppercase { \itshape \leftmark } }
+ \fancyhead [ R ] { \small \nouppercase { \itshape \rightmark } }
+ \fancyhead [ C ]
+ {
+ \small \nouppercase
+ { \itshape \l_@@_header_center_mark_tl }
+ }
+ }
+%</class-en>
+% \end{macrocode}
+%
+% 构建页脚,用来显示页码。选项 \opt{C} 表示居中(center)。
+% \begin{macrocode}
+\fancyfoot [ C ] { \small \thepage }
+% \end{macrocode}
+%
+% 关闭横线显示(未启用)。
+% \begin{macrocode}
+% \RenewDocumentCommand \headrulewidth { } { 0 pt }
+% \end{macrocode}
+%
+% \begin{macro}{\fdu_front_matter_header:n}
+% 在单页模式下,设置前导部分(包括目录、摘要、符号表等)的页眉中间
+% 为相应标题,左右为空。
+% \begin{macrocode}
+\cs_new:Npn \fdu_front_matter_header:n #1
+ {
+ \bool_if:NTF \g_@@_twoside_bool
+ { \markboth {#1} {#1} }
+ {
+ \markboth { } { }
+ \tl_gset:Nn \l_@@_header_center_mark_tl {#1}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cleardoublepage}
+% 重定义 \tn{cleardoublepage},使得偶数页面在没有内容时也不显示
+% 页眉页脚。\\
+% 见 http://tex.stackexchange.com/q/1681 \\
+% 最后清空中间页眉,确保正文部分页眉显示正确。
+% \begin{macrocode}
+\RenewDocumentCommand \cleardoublepage { }
+ {
+ \clearpage
+ \bool_if:NT \g_@@_twoside_bool
+ {
+ \int_if_odd:nF \c@page
+ { \hbox:n { } \thispagestyle { empty } \newpage }
+ }
+ \tl_gset:Nn \l_@@_header_center_mark_tl { }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \pkg{ctex} 宏包使用 \opt{heading} 选项后,会把页面格式设置为
+% |headings|。因此必须在 \pkg{ctex} 调用之后重新设置 \cs{pagestyle}
+% 为 |fancy|。
+% \begin{macrocode}
+\pagestyle { fancy }
+% \end{macrocode}
+%
+% \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_libertinus_sans:n}
+% \opt{libertinus} 阳文无衬线版。符号排列与普通版相同。
+% \begin{macrocode}
+\cs_new_eq:NN \@@_fn_symbol_libertinus_sans:n
+ \@@_fn_symbol_libertinus:n
+% \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 { Libertinus~ Serif }
+ \@@_fn_symbol_libertinus:n {#1}
+ }
+ \c_@@_fn_style_libertinus_neg_tl
+ {
+ \fontspec { Libertinus~ Serif }
+ \@@_fn_symbol_libertinus_neg:n {#1}
+ }
+ \c_@@_fn_style_libertinus_sans_tl
+ {
+ \fontspec { Libertinus~ Sans }
+ \@@_fn_symbol_libertinus_sans: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 }
+ \@@_fn_symbol_xits:n {#1}
+ }
+ \c_@@_fn_style_xits_sans_tl
+ {
+ \fontspec { XITS }
+ \@@_fn_symbol_xits_sans:n {#1}
+ }
+ \c_@@_fn_style_xits_sans_neg_tl
+ {
+ \fontspec { XITS }
+ \@@_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} 宏包。
+% 不再使用悬挂缩进。}
+% 重定义内部脚注文字命令,使脚注编号不使用上标,宽度为 \SI{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}
+% 定义新的定理环境。
+% \begin{macrocode}
+\RenewDocumentCommand \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}{改为可完全展开的命令。}
+% 重定义图表编号。
+% \begin{macrocode}
+\cs_set:Npn \thefigure
+ { \@@_arabic:n { chapter } - \@@_arabic:n { figure } }
+\cs_set:Npn \thetable
+ { \@@_arabic:n { chapter } - \@@_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_instructors_clist,
+% \l_@@_info_keywords_clist}
+% 封面所需的一些字段。
+% \begin{macrocode}
+\clist_map_inline:nn
+ {
+ title, date, author, supervisor, department, major, student_id,
+ school_id, clc
+ }
+ { \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_int}
+% 学位类型。1 为学术学位,2 为专业学位。
+% \begin{macrocode}
+\int_new:N \l_@@_info_degree_type_int
+% \end{macrocode}
+% \end{variable}
+%
+% 定义 |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 }
+ { \int_set_eq:NN \l_@@_info_degree_type_int \l_keys_choice_int },
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/title,info/title*}
+% 论文题目。以下带星号的项目均表示相应的英文字段。
+% \begin{macrocode}
+ title .tl_set:N = \l_@@_info_title_tl,
+ title* .tl_set:N = \l_@@_info_title_en_tl,
+% \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}
+%
+% \begin{macro}{info/clc}
+% 中图分类号。
+% \begin{macrocode}
+ clc .tl_set:N = \l_@@_info_clc_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_@@_secret_bool}
+% 是否显示密级。
+% \begin{macrocode}
+\bool_new:N \l_@@_secret_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \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 }
+ {
+ \int_compare:nTF
+ { \l_keys_choice_int >= 2 }
+ {
+ \bool_set_true:N \l_@@_secret_bool
+ \tl_set:Nn \l_@@_info_secret_level_tl
+ {
+ \clist_item:Nn \c_@@_secret_clist
+ { \l_keys_choice_int - 1 }
+ }
+ }
+ { \bool_set_false:N \l_@@_secret_bool }
+ },
+ 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}
+% 分散对齐的水平盒子。
+% \begin{arguments}
+% \item 宽度
+% \item 内容
+% \end{arguments}
+% 利用 \cs{tl_map_inline:nn} 在字符间插入 \tn{hfil};紧随其后的
+% \tn{unskip} 将会去掉最后一个 \tn{hfil}。见
+% \url{http://tex.stackexchange.com/q/169689}。|#2| 需要完全展开以
+% 避免 underfull 警告。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_spread_box:nn #1#2
+ {
+ \mode_leave_vertical:
+ \hbox_to_wd:nn {#1}
+ { \tl_map_inline:xn {#2} { ##1 \hfil } \unskip }
+ }
+% \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}{\@@_get_max_text_width:NN}
+% \changes{v0.6}{2017/11/24}{移除不必要的字号设置。}
+% 获取多个文本中的最大宽度,并存入 |dim| 型变量。
+% \begin{arguments}
+% \item |dim| 型变量
+% \item 文本 |clist|
+% \end{arguments}
+% 当 \cs{l_@@_tmpa_clist} 非空时,弹出最后一个元素
+% 赋给 \cs{l_@@_tmpa_tl},获取其长度后与 |#1| 进行比较,
+% 二者中较大的那一个将成为 |#1| 的新值。
+% 不断循环,直至 \cs{l_@@_tmpa_clist} 为空。
+% \begin{macrocode}
+\cs_new:Npn \@@_get_max_text_width:NN #1#2
+ {
+% \end{macrocode}
+% 这里用 |group| 确保局部变量不会被污染。
+% \begin{macrocode}
+ \group_begin:
+ \clist_set_eq:NN \l_@@_tmpa_clist #2
+ \bool_until_do:nn { \clist_if_empty_p:N \l_@@_tmpa_clist }
+ {
+ \clist_pop:NN \l_@@_tmpa_clist \l_@@_tmpa_tl
+ \@@_get_text_width:NV \l_@@_tmpa_dim \l_@@_tmpa_tl
+ \dim_gset:Nn #1 { \dim_max:nn {#1} { \l_@@_tmpa_dim } }
+ }
+ \group_end:
+ }
+% \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_aux:n}
+% 右上角的学校代码和学号。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_id:
+ {
+ \@@_fixed_width_box:nn { 120 pt }
+ {
+ \bool_if:NT \l_@@_secret_bool
+ {
+ \group_begin:
+ \sffamily
+ \@@_cover_id_aux:n { secret_level }
+ \c_@@_name_secret_star_tl
+ \l_@@_info_secret_year_tl
+ \group_end:
+ \par
+ }
+ \@@_cover_id_aux:n { school_id } \par
+ \@@_cover_id_aux:n { student_id }
+ }
+% \end{macrocode}
+% 插入一个宽度为负的水平盒子以减少右侧边距。
+% \begin{macrocode}
+ \hbox_to_wd:nn { -24 pt } { }
+ }
+\cs_new:Npn \@@_cover_id_aux:n #1
+ {
+ \tl_use:c { c_@@_name_ #1 _tl }
+ \c_@@_fullwidth_colon_tl
+ \tl_use:c { l_@@_info_ #1 _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:
+ {
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \clist_item:Nn \c_@@_thesis_type_clist
+ { \g_@@_thesis_type_int }
+ }
+ \@@_spread_box:nn { 0.45 \textwidth } { \l_@@_tmpa_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_degree:}
+% 学位类型。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_degree:
+ {
+ \int_compare:nNnT \g_@@_thesis_type_int = \c_two
+ {
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \clist_item:Nn \c_@@_degree_type_clist
+ { \l_@@_info_degree_type_int }
+ }
+ \c_@@_fullwidth_left_paren_tl
+ \l_@@_tmpa_tl
+ \c_@@_fullwidth_right_paren_tl
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_info:}
+% 信息栏。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_info:
+ {
+ \begin{minipage} [ c ] { \textwidth }
+ \centering \zihao { 4 }
+% \end{macrocode}
+% 读取左侧名称字段。
+% \begin{macrocode}
+ \clist_set:Nx \l_@@_tmpa_clist
+ {
+ \c_@@_name_department_tl,
+ \c_@@_name_major_tl,
+ \c_@@_name_author_tl,
+ \c_@@_name_supervisor_tl,
+ \c_@@_name_date_tl,
+ }
+% \end{macrocode}
+% 设置信息栏右侧宽度。读取各字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+% \begin{macrocode}
+ \clist_set:Nx \l_@@_tmpb_clist
+ {
+ { \l_@@_info_department_tl },
+ { \l_@@_info_major_tl },
+ { \l_@@_info_author_tl },
+ { \l_@@_info_supervisor_tl },
+ { \l_@@_info_date_tl }
+ }
+ \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+% \end{macrocode}
+% 用循环输出各字段。
+% \begin{macrocode}
+ \bool_until_do:nn
+ { \clist_if_empty_p:N \l_@@_tmpa_clist }
+ {
+ \clist_pop:NN \l_@@_tmpa_clist \l_@@_tmpa_tl
+ \clist_pop:NN \l_@@_tmpb_clist \l_@@_tmpb_tl
+ \@@_spread_box:nn { 6 em } { \l_@@_tmpa_tl }
+ \c_@@_fullwidth_colon_tl
+ \@@_center_box:Vn \l_@@_tmpb_dim { \l_@@_tmpb_tl }
+ \skip_vertical:n { 1 ex }
+ }
+ \end{minipage}
+ }
+% \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_@@_fullwidth_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 }
+% \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}
+% 声明模板代码。
+% \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 } {#2} }
+\cs_new_protected:Npn \@@_declare_template_code:nnn #1#2#3
+ { \DeclareTemplateCode { fdu / cover } {#1} { \c_zero } {#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{绘制封面}
+%
+% \begin{macro}{\makecoveri,\makecoverii,\makecoveriii}
+% 使用实例(instance)构建封一、封二、封三。
+% \begin{macrocode}
+\NewDocumentCommand \makecoveri { }
+ {
+ \thispagestyle { empty }
+ \UseInstance { fdu / cover } { cover-i-default }
+ }
+\NewDocumentCommand \makecoverii { }
+ {
+ \thispagestyle { empty }
+ \UseInstance { fdu / cover } { cover-ii-default }
+ }
+\NewDocumentCommand \makecoveriii { }
+ {
+ \cleardoublepage
+ \thispagestyle { empty }
+ \UseInstance { fdu / cover } { cover-iii-default }
+ }
+% \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}
+%
+% 定义封面的具体配置参数。
+% \begin{macrocode}
+\DeclareInstance { fdu / cover } { cover-i-default } { cover-i }
+ {
+%<class-en> format =
+%<class-en> \@@_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 } \sffamily,
+ 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 =
+%<class-en> \@@_line_spread:N \c_@@_line_spread_fp,
+ title / content =
+ \@@_spread_box:nn { 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 } \sffamily,
+ authorization-decl-name / format =
+ \@@_line_spread:n { 1.2 } \zihao { -2 } \sffamily,
+ 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{macro}{style/auto-make-cover}
+% \begin{variable}{\l_@@_auto_make_cover_bool}
+% 是否自动生成封面。
+% \begin{macrocode}
+\bool_new:N \l_@@_auto_make_cover_bool
+\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{variable}
+% \end{macro}
+%
+% 在 \env{document} 开始位置添加封面以及指导小组成员名单。
+% \begin{macrocode}
+\AtBeginDocument
+ {
+ \bool_if:NT \l_@@_auto_make_cover_bool
+ {
+ \begin{titlepage}
+ \makecoveri \newpage \makecoverii
+ \end{titlepage}
+ }
+ }
+% \end{macrocode}
+%
+% 在 \env{document} 结束位置添加声明页。
+% \begin{macrocode}
+\AtEndDocument
+ { \bool_if:NT \l_@@_auto_make_cover_bool { \makecoveriii } }
+% \end{macrocode}
+%
+% \subsection{目录}
+%
+% \begin{variable}{\@@_chapter_toc_format:,\@@_chapter_toc_en_format:}
+% 目录中章标题的样式还要用在摘要、符号表中。因为摘要分中英文,所以这里
+% 需要分别定义其样式。
+% \begin{macrocode}
+\tl_const:Nn \@@_chapter_toc_format: { \normalfont \sffamily }
+\tl_const:Nn \@@_chapter_toc_en_format: { \bfseries }
+% \end{macrocode}
+% \end{variable}
+%
+% 设置目录标题。
+% \begin{macrocode}
+\keys_set:nn { ctex }
+ {
+%<class> contentsname = \c_@@_name_toc_tl,
+%<class-en> contentsname = \c_@@_name_toc_en_tl,
+% \end{macrocode}
+%
+% 设置目录中章节标题的样式。
+% \begin{macrocode}
+ chapter / tocline =
+ {
+%<class> \@@_chapter_toc_format:
+%<class-en> \@@_chapter_toc_en_format:
+ \CTEXnumberline {#1} #2
+ },
+ section / tocline =
+ {
+%<class-en> \bfseries
+ \CTEXnumberline {#1} #2
+ },
+ subsection / tocline =
+ {
+%<class> \fdu@kai
+ \CTEXnumberline {#1} #2
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\tableofcontents}
+% 修改 \tn{tableofcontents} 的定义,使得页眉正确显示。第二个参数中的
+% 代码来源于 \LaTeXe{} 标准文档类 \file{book.cls}。
+% \begin{macrocode}
+\@@_patch_cmd:Nnn \tableofcontents
+ {
+ \chapter*{\contentsname
+ \@mkboth{%
+ \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
+ }
+ {
+ \chapter* { \contentsname }
+%<class> \fdu_front_matter_header:n { \c_@@_name_toc_tl }
+%<class-en> \fdu_front_matter_header:n { \c_@@_name_toc_en_tl }
+ }
+% \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* { \c_@@_name_abstract_tl }
+ \fdu_front_matter_header:n { \c_@@_name_abstract_tl }
+ \addcontentsline { toc } { chapter }
+ {
+ \@@_chapter_toc_format:
+ \c_@@_name_abstract_tl
+ }
+ }
+%</class>
+\cs_new_protected:Npn \@@_abstract_en_begin:
+ {
+ \chapter* { \c_@@_name_abstract_en_tl }
+ \fdu_front_matter_header:n { \c_@@_name_abstract_en_tl }
+ \addcontentsline { toc } { chapter }
+ {
+%<class> \@@_chapter_toc_format:
+%<class-en> \@@_chapter_toc_en_format:
+ \c_@@_name_abstract_en_tl
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_abstract_end:,\@@_abstract_en_end:}
+% 摘要正文完成后,输出关键字列表和中图分类号(CLC)。
+% \begin{macrocode}
+%<*class>
+\cs_new_protected:Npn \@@_abstract_end:
+ {
+ \@@_keywords_par:
+ \textsf { \c_@@_name_keywords_tl \c_@@_fullwidth_colon_tl }
+ \clist_use:Nn \l_@@_info_keywords_clist
+ { \c_@@_fullwidth_semicolon_tl }
+ \@@_clc_par:
+ \textsf { \c_@@_name_clc_tl \c_@@_fullwidth_colon_tl }
+ \l_@@_info_clc_tl
+ }
+%</class>
+\cs_new_protected:Npn \@@_abstract_en_end:
+ {
+ \@@_keywords_par:
+ \textbf { \c_@@_name_keywords_en_tl } \@@_quad:
+ \clist_use:Nn \l_@@_info_keywords_en_clist { \@@_quad: }
+ \@@_clc_par:
+ \textbf { \c_@@_name_clc_en_tl } \@@_quad:
+ \l_@@_info_clc_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_keywords_par:,\@@_clc_par:}
+% 关键字列表前要空一行,使用悬挂缩进;中图分类号不缩进。
+% \begin{macrocode}
+\cs_new:Npn \@@_keywords_par:
+ {
+ \par \mode_leave_vertical: \par
+ \noindent \hangindent = 4 em \hangafter = 1
+ }
+\cs_new:Npn \@@_clc_par:
+ { \par \noindent }
+% \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* { \c_@@_name_notation_tl }
+ \fdu_front_matter_header:n { \c_@@_name_notation_tl }
+ \addcontentsline { toc } { chapter }
+ {
+ \@@_chapter_toc_format:
+ \c_@@_name_notation_tl
+ }
+%</class>
+%<*class-en>
+ \chapter* { \c_@@_name_notation_en_tl }
+ \fdu_front_matter_header:n { \c_@@_name_notation_en_tl }
+ \addcontentsline { toc } { chapter }
+ {
+ \@@_chapter_toc_en_format:
+ \c_@@_name_notation_en_tl
+ }
+%</class-en>
+ }
+% \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.6}{2017/10/27}{支持 \BibTeX{},以实现参考文献的著录
+% 与引用。}
+% \changes{v0.7}{2018/01/25}{支持 \biber{} 与 \pkg{biblatex}。}
+%
+% \begin{variable}{\l_@@_bibtex_bool}
+% 是否使用 \BibTeX{} 作为参考文献处理程序。若为否,则使用
+% \pkg{biblatex}/\biber{}。
+% \begin{macrocode}
+\bool_new:N \l_@@_bibtex_bool
+% \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_tl}
+% 保存参考文献数据库列表。
+% \begin{macrocode}
+\tl_new:N \l_@@_bib_resource_tl
+% \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} 选项。}
+%
+% \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 =
+ { \bool_set_true:N \l_@@_bibtex_bool },
+ bib-backend / biblatex .code:n =
+ { \bool_set_false:N \l_@@_bibtex_bool },
+% \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 },
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{style/cite-style}
+% 引用样式。
+% \begin{macrocode}
+ cite-style .code:n =
+ {
+ \bool_if:NTF \l_@@_bibtex_bool
+ { \@@_warning:n { cite-style-not-available } }
+ { \tl_set:Nn \l_@@_cite_style_tl {#1} }
+ },
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{style/bib-resource}
+% 参考文献数据源。
+% \begin{macrocode}
+ bib-resource .tl_set:N = \l_@@_bib_resource_tl
+ }
+\@@_msg_new:nn { cite-style-not-available }
+ { Option~ "cite-style"~ is~ not~ available~ in~ BibTeX. }
+% \end{macrocode}
+% \end{macro}
+%
+% 为了保证导言区中的设置能起作用,\pkg{natbib} 或 \pkg{biblatex} 宏包
+% 均需要在导言区末尾载入(仍在 \pkg{hyperref} 之前)。
+% \begin{macrocode}
+\ctex_at_end_preamble:n
+ {
+% \end{macrocode}
+%
+% 调用 \pkg{natbib} 宏包并进行配置。
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_bibtex_bool
+ {
+ \RequirePackage [ sort & compress ] { natbib }
+ \@@_bibtex_setup:
+% \end{macrocode}
+%
+% \changes{v0.7}{2018/01/25}{统一使用 \cs{printbibliography} 命令
+% 生成参考文献列表。}
+%
+% \begin{macro}{\printbibliography}
+% \BibTeX{} 下接口与 \pkg{biblatex} 统一。
+% \begin{macrocode}
+ \NewDocumentCommand \printbibliography { o }
+ {
+ \exp_args:NV \bibliography \l_@@_bib_resource_tl
+ \IfValueT {#1}
+ { \@@_warning:nn { invalid-option-in-bibtex } {#1} }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% 调用 \pkg{biblatex} 宏包,并载入参考文献数据库。
+% \cs{@@_biblatex_setup:} 依靠传入宏包选项,因此要放在
+% \tn{RequirePackage} 之前。
+% \begin{macrocode}
+ {
+ \@@_biblatex_setup:
+ \RequirePackage [ backend = biber, hyperref = manual, natbib ]
+ { biblatex }
+ \exp_args:NV \addbibresource \l_@@_bib_resource_tl
+ \@@_biblatex_allow_url_break:
+% \end{macrocode}
+% 英文模板需要重定义参考文献标题。
+% \begin{macrocode}
+%<*class-en>
+ \exp_args:Nnx \DefineBibliographyStrings { english }
+ { bibliography = { \c_@@_name_bib_en_tl } }
+%</class-en>
+ }
+ }
+\@@_msg_new:nn { invalid-option-in-bibtex }
+ { Option(s)~ "#1"~ are~ invalid~ in~ BibTeX. }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_bibtex_setup:}
+% \BibTeX{} 设置。
+% \begin{macrocode}
+\cs_new:Npn \@@_bibtex_setup:
+ {
+ \tl_if_empty:NTF \l_@@_bib_style_tl
+ {
+ \tl_if_eq:VnTF \l_@@_bib_gb_style_tl { numerical }
+ {
+ \bibliographystyle { gbt7714-unsrt }
+ \@@_set_cite_style_numerical:
+ }
+ {
+ \tl_if_eq:VnT \l_@@_bib_gb_style_tl { author-year }
+ {
+ \bibliographystyle { gbt7714-plain }
+ \@@_set_cite_style_author_year:
+ \cs_set_eq:NN \cite \citep
+ }
+ }
+ }
+ { \exp_args:NV \bibliographystyle \l_@@_bib_style_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_biblatex_setup:}
+% \pkg{biblatex} 设置。
+% \begin{macrocode}
+\cs_new:Npn \@@_biblatex_setup:
+ {
+% \end{macrocode}
+% 参考文献样式。
+% \begin{macrocode}
+ \tl_if_empty:NTF \l_@@_bib_style_tl
+ {
+ \tl_if_eq:VnTF \l_@@_bib_gb_style_tl { numerical }
+ { \PassOptionsToPackage { style = gb7714-2015 } }
+ {
+ \tl_if_eq:VnT \l_@@_bib_gb_style_tl { author-year }
+ { \PassOptionsToPackage { style = gb7714-2015ay } }
+ }
+ }
+ { \PassOptionsToPackage { style = \l_@@_bib_style_tl } }
+ { biblatex }
+% \end{macrocode}
+% 引用样式。
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_cite_style_tl
+ {
+ \PassOptionsToPackage { citestyle = \l_@@_bib_style_tl }
+ { biblatex }
+ }
+ }
+% \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_set_eq:NN \c@biburlnumpenalty \c_one
+ \int_set_eq:NN \c@biburllcpenalty \c_one
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_cite_style_numerical:}
+% 顺序编码制下的引用样式。
+% \begin{macrocode}
+\cs_new:Npn \@@_set_cite_style_numerical:
+ {
+ \NAT@numberstrue \NAT@supertrue
+ \cs_set:Npn \NAT@open { [ }
+ \cs_set:Npn \NAT@close { ] }
+ \cs_set:Npn \NAT@sep { ,~ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_cite_style_author_year:}
+% 著者—出版年制下的引用样式。
+% \begin{macrocode}
+\cs_new:Npn \@@_set_cite_style_author_year:
+ {
+ \NAT@numbersfalse
+%<*class>
+ \cs_set_eq:NN \NAT@open \c_@@_fullwidth_left_paren_tl
+ \cs_set_eq:NN \NAT@close \c_@@_fullwidth_right_paren_tl
+ \cs_set_eq:NN \NAT@sep \c_@@_fullwidth_semicolon_tl
+ \cs_set_eq:NN \NAT@aysep \c_@@_fullwidth_comma_tl
+ \cs_set_eq:NN \NAT@yrsep \c_@@_ideographic_comma_tl
+%</class>
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibsection}
+% 修改参考文献部分的页眉,并将其添加到目录。
+% \begin{macrocode}
+\cs_set:Npn \bibsection
+ {
+ \chapter* { \bibname }
+ \fdu_front_matter_header:n { \bibname }
+ \addcontentsline { toc } { chapter }
+ { \@@_chapter_toc_format: \bibname }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.7}{2018/01/25}{同步 \pkg{gbt7714} v1.0,移除有关超链接
+% 的额外设置。}
+%
+% \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,\fdu_hyperref_setup:n}
+% \pkg{hyperref} 宏包是在导言区之后才引入的。若要在导言区中使用
+% \tn{hypersetup} 命令,必须另行定义。
+% \begin{macrocode}
+\NewDocumentCommand \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}
+%
+% \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}
+% 超链接样式。
+% \begin{macrocode}
+ hyperlink .choice:,
+ hyperlink .value_required:n = true,
+ hyperlink / border .code:n = { },
+ hyperlink / color .code:n =
+ { \fdu_hyperref_setup:n { colorlinks = true } },
+ hyperlink / none .code:n =
+ { \fdu_hyperref_setup:n { hidelinks = true } },
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{style/hyperlink-color}
+% 超链接颜色。
+% \begin{macrocode}
+ hyperlink-color .choice:,
+ hyperlink-color .value_required:n = true,
+ \clist_map_function:nN
+ {
+ { autumn, D70000, D75F00, AF8700 },
+ { business, D14542, 295497, 1F6E43 },
+ { classic, FF0000, 0000FF, 00FF00 },
+ { default, 990000, 0000B2, 007F00 },
+ { elegant, 961212, C31818, 9B764F },
+ { fantasy, FF4A19, FF3F94, 934BA1 },
+ { material, E91E63, 009688, 4CAF50 },
+ { science, CA0619, 389F9D, FF8920 },
+ { summer, 00AFAF, 5F5FAF, 5F8700 },
+ { 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}
+%
+% 在导言区末尾引入 \pkg{hyperref} 宏包。
+% \begin{macrocode}
+\ctex_at_end_preamble:n
+ {
+ \RequirePackage { hyperref }
+% \end{macrocode}
+% 此后 \tn{hypersetup} 命令由 \pkg{hyperref} 宏包接管。
+% \begin{macrocode}
+ \hypersetup
+ {
+ bookmarksnumbered = true,
+% \end{macrocode}
+% 填写 PDF 元信息。
+% \begin{macrocode}
+%<*class>
+ pdftitle = \l_@@_info_title_tl,
+ pdfauthor = \l_@@_info_author_tl,
+ pdfkeywords = \l_@@_info_keywords_clist,
+%</class>
+%<*class-en>
+ pdftitle = \l_@@_info_title_en_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{biblatex} 的 \pkg{hyperref} 支持。
+% \begin{macrocode}
+ \bool_if:NF \l_@@_bibtex_bool { \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
+ {
+ { ideographic_comma } { "3001 },
+ { ideographic_full_stop } { "3002 },
+ { fullwidth_comma } { "FF0C },
+ { fullwidth_full_stop } { "FF0E },
+ { fullwidth_colon } { "FF1A },
+ { fullwidth_semicolon } { "FF1B },
+ { fullwidth_left_paren } { "FF08 },
+ { fullwidth_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 & \symbol{"3001} & U+3001 \\
+% 中文句号 & Ideographic full stop & \symbol{"3002} & U+3002 \\
+% 中文逗号 & Fullwidth comma & \symbol{"FF0C} & U+FF0C \\
+% 全角西文句点 & Fullwidth full stop & \symbol{"FF0E} & U+FF0E \\
+% 中文冒号 & Fullwidth colon & \symbol{"FF1A} & U+FF1A \\
+% 中文分号 & Fullwidth semicolon & \symbol{"FF1B} & U+FF1B \\
+% 中文左圆括号 & Fullwidth left parenthesis & \symbol{"FF08} & U+FF08 \\
+% 中文右圆括号 & Fullwidth right parenthesis & \symbol{"FF09} & U+FF09 \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+% \begin{variable}{\c_@@_line_spread_fp}
+% 行距倍数。行距倍数 $k$ 由下式确定:
+% \begin{equation*}
+% \num{1.2} \times k \times \SI{12}{bp} = \SI{20}{pt}.
+% \end{equation*}
+% 式中,\num{1.2} 是基本行距与文字大小之比,\SI{12}{bp} 是小四号字
+% 的大小,\SI{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_clist,
+% \c_@@_degree_type_clist}
+% 论文类型与学位类型。
+% \begin{macrocode}
+\clist_const:Nn \c_@@_thesis_type_clist
+ { 博士学位论文, 硕士学位论文, 本科毕业论文 }
+\clist_const:Nn \c_@@_degree_type_clist
+ { 学术学位, 专业学位 }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_secret_clist}
+% 三种密级。
+% \begin{macrocode}
+\clist_const:Nn \c_@@_secret_clist { 秘密, 机密, 绝密 }
+% \end{macrocode}
+% \end{variable}
+%
+% 默认名称。注意空格是忽略掉的。
+% \begin{macrocode}
+\clist_map_inline:nn
+ {
+ { secret_level } { 密 \qquad 级 },
+ { secret_star } { \textrm { \bigstar } },
+ { school_id } { 学校代码 },
+ { student_id } { 学 \qquad 号 },
+ { department } { 院系 },
+ { major } { 专业 },
+ { author } { 姓名 },
+ { supervisor } { 指导教师 },
+ { date } { 完成日期 },
+ { instructors } { 指导小组成员 },
+ { author_sign } { 作者签名 },
+ { supervisor_sign } { 导师签名 },
+ { sign_date } { 日期 },
+ { 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~ number: },
+ { toc } { 目 \quad 录 } { Contents },
+ { notation } { 符号表 } { List~ of~ Symbols }
+ }
+ { \@@_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 }
+%</definition>
+%<@@=>
+% \end{macrocode}
+%
+% \clearpage
+%
+% \end{implementation}
+%