summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-04-09 21:17:26 +0000
committerKarl Berry <karl@freefriends.org>2018-04-09 21:17:26 +0000
commitc2963777bab7935e5a01b69f45bd913766ac922a (patch)
tree152c47e9e84e5c33e49ad7235c752db0ab5abea7 /Master/texmf-dist/source
parent6c211336f233c6fa76374d84bdec20e12ab498c9 (diff)
fduthesis (9apr18)
git-svn-id: svn://tug.org/texlive/trunk@47408 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx2202
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx2537
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx6205
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis.ins135
4 files changed, 11079 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx b/Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx
new file mode 100644
index 00000000000..54e7ab74558
--- /dev/null
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx
@@ -0,0 +1,2202 @@
+% \iffalse meta-comment
+%
+% 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.
+%
+% \fi
+%
+% \EnableImplementation
+%
+% \begin{implementation}
+%
+%^^A 代码部分的页边距
+% \newgeometry{
+% left = 2.25 in,
+% right = 1.00 in,
+% top = 1.25 in,
+% bottom = 1.00 in,
+% marginpar = 2.25 in
+% }
+%
+% \subsection{模板文档样式 \cls{fdudoc}}
+%
+% \changes{v0.4}{2017/07/29}{在 \cls{ctxdoc} 的基础上完成
+% \cls{fdudoc} 文档类,用于模板手册的编写。}
+%
+% 编写 \LaTeX{} 宏包文档,传统上会采用 \pkg{doc} 宏包或
+% \cls{ltxdoc} 文档类。而对于使用 \LaTeX3 开发的宏包,\cls{l3doc}
+% 文档类将是一个更好的选择。\CTeX{} 宏集所附带的
+% \href{https://github.com/CTeX-org/ctex-kit/blob/master/tool/ctxdoc.cls}^^A
+% {\cls{ctxdoc}} 文档类,则在 \cls{l3doc} 的基础上进行了一些修正,
+% 特别是重新实现了 \env{macrocode} 环境,使之能更好地应用于中文
+% 文档。\cls{ctxdoc} 的主要功能如下:
+%
+% \begin{itemize}
+% \item 注释使用灰色、倾斜字体,以便与一般代码区分;
+% \item 模块、名字空间等使用彩色标注,并添加超链接;
+% \item 自动更新行号宽度;
+% \item 边注中的长命令使用盒子进行缩放,防止溢出;
+% \item 修订记录中将显示修改日期;
+% \item 添加中文支持。
+% \end{itemize}
+%
+% 然而,\cls{ctxdoc} 主要供内部使用,代码较为混乱和随意。
+% 本模板的文档样式(\cls{fdudoc})为适应具体需求,对其代码
+% 进行了整理,添加了相关注释,并做了一些改动:
+%
+% \begin{itemize}
+% \item 允许模块标记 |<*|\meta{module}|>| 和
+% |</|\meta{module}|>| 出现在行号左侧;
+% \item 不再以直立、倾斜字体区分不同嵌套层次的模块;
+% \item 调整索引中版本号的排序方式;
+% \item 新增一系列实用命令;
+% \item 修改文档字体、配色等。
+% \end{itemize}
+%
+% 本文档样式的核心代码主要来自 \cls{ctxdoc} 文档类 v2.4.10。
+% 在此,本人要向原开发者
+% \href{https://github.com/CTeX-org/}{CTEX.ORG}
+% 团队表示由衷的感谢。
+%
+% 以下为 \cls{fdudoc} 的具体实现。
+%
+% \subsubsection{载入宏包、文档类}
+%
+% \begin{macrocode}
+%<*doc>
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% 无需载入 \pkg{thumbpdf}。
+% \begin{macrocode}
+\@namedef{ver@thumbpdf.sty}{9999/99/99}
+% \end{macrocode}
+%
+% 关闭 \pkg{xparse} 中的命令声明信息。
+% \begin{macrocode}
+\PassOptionsToPackage{log-declarations = false}{xparse}
+% \end{macrocode}
+%
+% 载入宏包和文档类。
+% \begin{macrocode}
+\LoadClass[a4paper, full]{l3doc}
+\RequirePackage[UTF8, heading, sub3section, fontset = none]{ctex}
+% \end{macrocode}
+% 与 \pkg{hypdoc}(由 \cls{l3doc} 调用)冲突,导致脚注超链接
+% 无法正常跳转。临时禁用。
+% \begin{macrocode}
+% \RequirePackage[stable, bottom]{footmisc}
+\RequirePackage{graphicx}
+\RequirePackage{caption}
+\RequirePackage{geometry}
+\RequirePackage{listings}
+\RequirePackage{makecell}
+\RequirePackage[toc]{multitoc}
+\RequirePackage{siunitx}
+\RequirePackage{tabularx}
+\RequirePackage{threeparttable}
+\RequirePackage{unicode-math}
+\RequirePackage{xcolor}
+\RequirePackage{xcolor-material}
+\RequirePackage{zref-base}
+% \end{macrocode}
+%
+% \subsubsection{\env{macrocode} 环境}
+%
+% \paragraph{继承的代码}
+%
+% \begin{macro}[int]{\macro@code}
+% 在 \pkg{doc} 宏包中,\env{macrocode} 环境的核心功能由命令
+% \tn{macro@code} 负责实现,而 \tn{xmacro@code} 只用来结束
+% \env{macrocode} 环境。但在 \cls{l3doc} 以及 \cls{ctxdoc} 中,
+% \tn{xmacro\-@\-code} 则基本接管了 \tn{macro@code} 的功能。
+% 后者此时只起辅助作用。
+% \begin{macrocode}
+\def\macro@code{%
+% \end{macrocode}
+% 调整前后间距,禁止 \env{macrocode} 环境前的分页。
+% \begin{macrocode}
+ \topsep \MacrocodeTopsep
+ \@beginparpenalty \predisplaypenalty
+% \end{macrocode}
+% 将列表前后的附加垂直空白设为 0。根据 \cls{ctxdoc} 修改。
+% \begin{macrocode}
+ \partopsep \z@skip
+% \if@inlabel\leavevmode\fi
+% \end{macrocode}
+% 构建 \env{trivlist} 环境,设置段间距为 0。
+% 之后修改字体,并调节左右间距。\tn{MacroIndent} 会根据代码行数
+% 更新,具体细节见后文。
+% \tn{macro@font} 用来在不同模块见切换字体。本文档类不使用
+% \tn{AltMacroFont},因此这里改用 \tn{MacroFont} 代替。
+% \begin{macrocode}
+ \trivlist \parskip \z@ \item[]%
+% \macro@font
+ \MacroFont
+ \leftskip\@totalleftmargin \advance\leftskip\MacroIndent
+ \rightskip\z@ \parindent\z@ \parfillskip\@flushglue
+% \end{macrocode}
+% 按照 \LaTeXe{} 中 \tn{verbatim} 环境中定义 \tn{par},使得空行
+% 可以原样输出,否则空行会被吃掉。
+% \begin{macrocode}
+ \blank@linefalse \def\par{\ifblank@line
+ \leavevmode\fi
+ \blank@linetrue\@@par
+ \penalty\interlinepenalty}
+% \end{macrocode}
+% \tn{obeylines} 将把回车符 |^^M| 变成 \tn{par}。
+% 接下来将所有特殊符号的类别码设为 12,即“其他”类。
+% \begin{macrocode}
+ \obeylines
+ \let\do\do@noligs \verbatim@nolig@list
+ \let\do\@makeother \dospecials
+% \end{macrocode}
+% 相当于退出 |\begin{list}| 和 |\begin{minipage}|。
+% \begin{macrocode}
+ \global\@newlistfalse
+ \global\@minipagefalse
+% \end{macrocode}
+% 初始化交叉引用功能。
+% \begin{macrocode}
+ \init@crossref}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<@@=fdudoc>
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_tmpa_tl,\l_@@_tmpb_tl}
+% 临时变量。
+% \begin{macrocode}
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_patch_cmd:Nnn,\@@_preto_cmd:Nn,\@@_appto_cmd:Nn}
+% 补丁工具。
+% \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 \@@_preto_cmd:Nn #1#2
+ {
+ \ctex_preto_cmd:NnnTF #1 { } {#2}
+ { } { \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}
+%
+% \paragraph{代码行处理}
+%
+% \begin{macro}[int]{\xmacro@code,\sxmacro@code}
+% 重新实现 \env{macrocode} 与 \env{macrocode*} 环境的核心功能,
+% 将对代码逐行处理。后者会将空格显示为“\textvisiblespace”。
+% \begin{macrocode}
+\cs_set_protected_nopar:Npn \xmacro@code
+ { \@@_marco_code:w }
+\cs_set_protected_nopar:Npn \sxmacro@code
+ {
+ \fontspec_print_visible_spaces:
+ \xmacro@code
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_marco_code:w}
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_marco_code:w
+ {
+% \end{macrocode}
+% 根据 \tn{codeline@index} 是否为 |true| 选择是否显示行号。
+% \begin{macrocode}
+ \ifcodeline@index
+ \@@_marco_code_every_par:n { \@@_code_line_no: }
+ \else:
+ \@@_marco_code_every_par:n { }
+ \fi:
+% \end{macrocode}
+% 设置代码段结束标记为“\verb*|% \end{macrocode}^^M|”。
+% \begin{macrocode}
+ \@@_make_finish_tag:x { \@currenvir }
+% \end{macrocode}
+% 开始 \env{macrocode}。
+% \begin{macrocode}
+ \@@_macro_code_start:w
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_marco_code_every_par:n}
+% 在每段之前插入内容。这里每段即相当于每行。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_marco_code_every_par:n #1
+ {
+ \everypar
+ {
+ \everypar {#1}
+ \if@inlabel
+ \global \@inlabelfalse \@noparlistfalse
+ \llap { \box \@labels \hskip \leftskip }
+ \fi
+ #1
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% 设置 \tn{endlinechar} 为 $-1$,表示行末不插入任何字符
+% (实际上相当于在行尾插入注释符 |%|)。
+% \begin{macrocode}
+\group_begin:
+ \int_set:Nn \tex_endlinechar:D { -1 }
+% \end{macrocode}
+%
+% \begin{variable}{\c_@@_active_space_tl}
+% 活动字符类的空格(ASCII 码为 32)。
+% \begin{macrocode}
+ \use:n
+ {
+ \char_set_catcode_active:n { 32 }
+ \tl_const:Nn \c_@@_active_space_tl
+ }
+ { }
+\group_end:
+% \end{macrocode}
+% \end{variable}
+%
+% ASCII 码 13 是回车符 |^^M|。将其设置为活动字符。
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_active:n { 13 }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_make_finish_tag:n,\@@_make_finish_tag:x}
+% \env{macrocode} 结尾标记。展开后变成
+% “\verb*|% \end{#1}^^M|”。
+% \begin{macrocode}
+ \cs_new_protected:Npx \@@_make_finish_tag:n #1
+ {
+ \tl_set:Nn \exp_not:N \l_@@_macro_code_finish_tl
+ {
+ \c_percent_str
+ \prg_replicate:nn { 4 }
+ { \exp_not:o { \c_@@_active_space_tl } }
+ \exp_not:o { \active@escape@char } end
+ \c_left_brace_str #1 \c_right_brace_str
+ \exp_not:N ^^M
+ }
+ }
+ \cs_generate_variant:Nn \@@_make_finish_tag:n { x }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_macro_code_start:w}
+% 开始代码环境。此命令主要是为了防止 |\begin{macrocode}|
+% 后出现多余的空行。
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_macro_code_start:w #1
+ {
+ \str_if_eq:nnTF {#1} { ^^M }
+ { \@@_macro_code_read_line:w }
+ { \@@_macro_code_read_line:w #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_macro_code_read_line:w}
+% 逐行读取代码,并连同行尾回车符一并存入
+% \cs{l_@@_macro_code_line_tl}。如果该行与结束标记
+% “\verb*|% \end{macrocode}^^M|”相同,则结束此
+% \env{macrocode};否则继续处理该行代码。
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_macro_code_read_line:w #1 ^^M
+ {
+ \tl_set:Nn \l_@@_macro_code_line_tl { #1 ^^M }
+ \tl_if_eq:NNTF
+ \l_@@_macro_code_line_tl \l_@@_macro_code_finish_tl
+ { \exp_args:Nx \end { \@currenvir } }
+ {
+ \@@_macro_code_process_line:
+ \@@_macro_code_read_line:w
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.4}{2017/08/09}{[\pkg{fdudoc}] 修复 \cls{ctxdoc}
+% 文档类 v2.4.10 之前版本中行距偏小的问题,见 ctex-kit
+% \href{https://github.com/CTeX-org/ctex-kit/issues/303}{\#~303}。}
+%
+% \begin{macro}{\@@_swap_cr:,\@@_swap_cr_aux:w}
+% 把 \cs{l_@@_macro_code_line_tl} 中的回车符 |^^M| 挪到外面。
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_swap_cr:
+ {
+ \exp_after:wN
+ \@@_swap_cr_aux:w \l_@@_macro_code_line_tl
+ }
+ \cs_new_protected:Npn \@@_swap_cr_aux:w #1 ^^M
+ {
+ \group_insert_after:N ^^M
+ \tl_set:Nn \l_@@_macro_code_line_tl {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\c_@@_active_cr_tl}
+% 活动字符类的回车符。
+% \begin{macrocode}
+ \tl_const:Nn \c_@@_active_cr_tl { ^^M }
+\group_end:
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_macro_code_line_tl,
+% \l_@@_macro_code_finish_tl,
+% \g_@@_macro_code_verbatim_stop_tl}
+% 分别用来存储代码行、\env{macrocode} 结束标记以及抄录停止标记。
+% \begin{macrocode}
+\tl_new:N \l_@@_macro_code_line_tl
+\tl_new:N \l_@@_macro_code_finish_tl
+\tl_new:N \g_@@_macro_code_verbatim_stop_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_process_normal_line:}
+% 普通代码行根据开头字符分别处理。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_process_normal_line:
+ {
+ \str_case_x:nnF
+ { \str_head:N \l_@@_macro_code_line_tl }
+ {
+% \end{macrocode}
+% 以 |%| 开头的行先由 \cs{tl_tail:N} 去掉 |%|,之后再检查 |<|。
+% \begin{macrocode}
+ { \c_percent_str }
+ {
+ \@@_check_angle:x
+ { \tl_tail:N \l_@@_macro_code_line_tl }
+ }
+% \end{macrocode}
+% 以 |#| 开头的行按注释的格式输出。
+% \begin{macrocode}
+ { \c_hash_str }
+ { \@@_output_comment_line: }
+ }
+% \end{macrocode}
+% 其余正常输出。
+% \begin{macrocode}
+ { \@@_output_line: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_process_verbatim_line:}
+% 处理抄录代码行(不检查 |%| 与 |<|)。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_process_verbatim_line:
+ {
+% \end{macrocode}
+% 将该行与抄录停止标记进行比较。
+% \begin{macrocode}
+ \tl_if_eq:NNTF \l_@@_macro_code_line_tl
+ \g_@@_macro_code_verbatim_stop_tl
+% \end{macrocode}
+% 若相同,则结束抄录环境,清空抄录停止标记,并输出该标记;
+% \begin{macrocode}
+ {
+ \tl_gclear:N \g_@@_macro_code_verbatim_stop_tl
+ \cs_gset_eq:NN \@@_macro_code_process_line:
+ \@@_process_normal_line:
+ \@@_output_module:nn
+ { \color { verb@guard } }
+ {
+ \@@_swap_cr:
+ \@@_module_pop:n { \l_@@_macro_code_line_tl }
+ }
+ }
+% \end{macrocode}
+% 否则直接输出抄录代码。
+% \begin{macrocode}
+ { \tl_use:N \l_@@_macro_code_line_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_macro_code_process_line:}
+% 处理代码行。该命令的作用如下:
+% \begin{itemize}
+% \item 正常情况下,等同于 \cs{@@_process_normal_line:};
+% \item 在 \cs{DontCheckModules} 之后,等价于
+% \cs{@@_output_line:},即不检查模块标记,直接输出;
+% \item 在抄录环境中,等价于 \cs{@@_process_verbatim_line:},
+% 此时将不再特殊处理以 |%| 开头的代码行。
+% \end{itemize}
+% \begin{macrocode}
+\cs_new_eq:NN \@@_macro_code_process_line:
+ \@@_process_normal_line:
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{模块标记处理}
+%
+% \begin{macro}{\CheckModules,\DontCheckModules}
+% 选择是否检查模块标记。这两个命令在 \pkg{doc} 宏包中已有定义,
+% 此处重新声明。
+% \begin{macrocode}
+\DeclareDocumentCommand \CheckModules { }
+ {
+ \cs_set_eq:NN \@@_macro_code_process_line:
+ \@@_process_normal_line:
+ }
+\DeclareDocumentCommand \DontCheckModules { }
+ {
+ \cs_set_eq:NN \@@_macro_code_process_line:
+ \@@_output_line:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_check_angle:n,\@@_check_angle:x}
+% 检查第一个字符是否是 |<|。若是,则检查模块;否则立刻输出改行。
+% 该函数的参数不带 |%|。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_check_angle:n #1
+ {
+ \str_if_eq_x:nnTF { \str_head:n {#1} } { < }
+ { \@@_check_module:x { \tl_tail:n {#1} } }
+ { \@@_output_comment_line: }
+ }
+\cs_generate_variant:Nn \@@_check_angle:n { x }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_check_module:n,\@@_check_module:x}
+% 检查紧跟 |<| 之后的字符。共有四种情况:
+% \begin{itemize}
+% \item |*|:模块开始(|%<*|\meta{module}|>|);
+% \item |/|:模块结束(|%</|\meta{module}|>|);
+% \item |@|:名字空间(|%<@@=|\meta{namespace}|>|);
+% \item |<|:抄录环境开始(|%<<|\meta{end-tag})。
+% \end{itemize}
+% 若不是这几种情况,则为单独一行的独立模块
+% (|%<|\meta{module}|>|)。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_check_module:n #1
+ {
+ \str_case_x:nnF { \str_head:n {#1} }
+ {
+ { * } { \@@_module_star:w }
+ { / } { \@@_module_slash:w }
+ { @ } { \@@_module_at:w }
+ { < } { \@@_module_verb:w }
+ }
+ { \@@_module_pm:w }
+% \end{macrocode}
+% 参数 |#1| 将被上面几个 |:w| 型函数吃掉。
+% \begin{macrocode}
+ #1 \q_stop
+ }
+\cs_generate_variant:Nn \@@_check_module:n { x }
+% \end{macrocode}
+% \end{macro}
+%
+% 设置 |>| 为活动字符。
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_active:N \>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_module_star:w}
+% 模块开始标记。
+% \begin{arguments}
+% \item |*|\meta{module}
+% \item 之后的代码
+% \end{arguments}
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_module_star:w #1 > #2 \q_stop
+ {
+% \end{macrocode}
+% 临时变量 \cs{l_@@_tmp_tl} 保存 |<*|\meta{module}|>|
+% 之后的部分,即真实代码。
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_tmpa_tl {#2}
+% \end{macrocode}
+% 判断该行是否为空(只含一个回车符 |^^M|)。
+% \begin{macrocode}
+ \tl_if_eq:NNTF \l_@@_tmpa_tl \c_@@_active_cr_tl
+% \end{macrocode}
+% 若是,则将 |<|\meta{module}|>| 放在行号的右侧;
+% \begin{macrocode}
+ {
+ \@@_output_module:nn
+ { \@@_star_color: }
+ {
+ \@@_module_push:n
+ { \@@_module_angle:n {#1} }
+ }
+ }
+% \end{macrocode}
+% 否则放在左侧,并输出相应代码。
+% \begin{macrocode}
+ {
+ \@@_output_module_left:nn
+ { \@@_star_color: }
+ {
+ \@@_module_push:n
+ { \@@_module_angle:n {#1} }
+ }
+ }
+ \@@_output_line:n {#2}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_slash:w}
+% 模块结束标记。结构与 \cs{@@_module_star:w} 相同。
+% \begin{arguments}
+% \item |/|\meta{module}
+% \item 之后的代码
+% \end{arguments}
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_module_slash:w #1 > #2 \q_stop
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {#2}
+ \tl_if_eq:NNTF \l_@@_tmpa_tl \c_@@_active_cr_tl
+ {
+ \@@_output_module:nn
+ { \@@_slash_color: }
+ {
+ \@@_module_pop:n
+ { \@@_module_angle:n {#1} }
+ }
+ }
+ {
+ \@@_output_module_left:nn
+ { \@@_slash_color: }
+ {
+ \@@_module_pop:n
+ { \@@_module_angle:n {#1} }
+ }
+ }
+ \@@_output_line:n {#2}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_at:w}
+% 名字空间。
+% \begin{arguments}
+% \item 名字空间的名称(不含 |@@=|)
+% \item 之后的代码
+% \end{arguments}
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_module_at:w @ @ = #1 > #2 \q_stop
+ {
+ \@@_output_module:nn
+ { \color { at@guard } }
+ { \@@_module_angle:n { @ @ = #1 } }
+% \end{macrocode}
+% 设置名字空间为 |#1|。\cls{l3doc} 中将名字空间称为
+% “模块”(module),注意不要混淆。
+% \begin{macrocode}
+ \tl_gset:Nn \g__codedoc_module_name_tl {#1}
+ \@@_output_line:n {#2}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_verb:w}
+% 抄录开始。|#1|: |<|\meta{end-tag},只有一个 |<|。
+% \meta{end-tag} 的最后会带有一个回车符 |^^M|。
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_module_verb:w #1 \q_stop
+ {
+% \end{macrocode}
+% 重定义 \cs{@@_macro_code_process_line:},用以输出抄录行。
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_macro_code_process_line:
+ \@@_process_verbatim_line:
+% \end{macrocode}
+% 设置抄录停止标记。用 \cs{tl_tail:n} 去掉开头的 |<|。
+% \begin{macrocode}
+ \tl_gset:Nx \g_@@_macro_code_verbatim_stop_tl
+ { \c_percent_str \tl_tail:n {#1} }
+% \end{macrocode}
+% 输出 |%<<|\meta{end-tag}。
+% \begin{macrocode}
+ \@@_output_module:nn
+ { \color { verb@guard } }
+ {
+ \@@_swap_cr:
+ \@@_module_push:n { \l_@@_macro_code_line_tl }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_pm:w}
+% 处理单独一行的模块。|<|\meta{module}|>| 放在行号的左侧。
+% \begin{arguments}
+% \item \meta{module}
+% \item 之后的代码
+% \end{arguments}
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_module_pm:w #1 > #2 \q_stop
+ {
+ \@@_output_module_left:nn
+ { \@@_pm_color: }
+ { \@@_module_angle:n {#1} }
+ \@@_output_line:n {#2}
+ }
+\group_end:
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_output_line:n,\@@_output_line:}
+% 输出代码行。参数将被存入 \cs{l_@@_macro_code_line_tl},
+% 再由不带参数的版本调用。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_output_line:n #1
+ {
+ \tl_set:Nn \l_@@_macro_code_line_tl {#1}
+% \end{macrocode}
+% 若为空行(只含一个 |^^M|),则直接输出(换行)。
+% \begin{macrocode}
+ \tl_if_eq:NNTF
+ \l_@@_macro_code_line_tl \c_@@_active_cr_tl
+ { \tl_use:N \l_@@_macro_code_line_tl }
+ {
+% \end{macrocode}
+% 检查开头是否为 |%|,据此分别处理。
+% \begin{macrocode}
+ \str_if_eq_x:nnTF
+ { \str_head:N \l_@@_macro_code_line_tl } { \c_percent_str }
+ { \@@_output_comment_line: } { \@@_output_line: }
+ }
+ }
+\cs_new_protected_nopar:Npn \@@_output_line:
+ {
+ \tex_noindent:D
+% \end{macrocode}
+% 此处将把 |@@| 替换为相应的名字空间。
+% \begin{macrocode}
+ \@@_replace_at_at:N \l_@@_macro_code_line_tl
+ \tl_use:N \l_@@_macro_code_line_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_output_comment_line:}
+% 输出注释代码行。用灰色、斜体显示。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_output_comment_line:
+ {
+ \tex_noindent:D
+ \group_begin:
+ \__fdudoc_swap_cr:
+ \color { code@gray } \slshape \@@_output_line:
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_replace_at_at:N,
+% \@@_replace_at_at_aux:Nn,\@@_replace_at_at_aux:No}
+% 把 |@@| 替换为相应的名字空间。其名称存放在全局变量
+% \cs{g__codedoc_module_name_tl} 中。
+% 它为空时(|%<@@=>|),不做替换。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_replace_at_at:N #1
+ {
+ \tl_if_empty:NF \g__codedoc_module_name_tl
+ { \@@_replace_at_at_aux:No #1 \g__codedoc_module_name_tl }
+ }
+\cs_new_protected:Npn \@@_replace_at_at_aux:Nn #1#2
+ {
+% \end{macrocode}
+% 以下代码分别对应两种名字空间的替换:
+% \begin{itemize}
+% \item 内部变量:|\|\meta{type}|_@@_|\meta{name} $\to$
+% |\|\meta{type}|__|\meta{namespace}|_|\meta{name};
+% \item 内部函数:|\@@_|\meta{name}” $\to$
+% |\__|\meta{namespace}|_|\meta{name}”)。
+% \end{itemize}
+% \begin{macrocode}
+ \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 }
+ \tl_replace_all:Nnn #1 { @ @ } { _ _ #2 }
+ }
+\cs_generate_variant:Nn \@@_replace_at_at_aux:Nn { No }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_push:n,
+% \@@_module_push_aux:nn,\@@_module_push_aux:on}
+% 将模块名压入栈中。此处的栈主要用来处理模块名(包括抄录标记)
+% 之间的超链接。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_module_push:n
+ { \@@_module_push_aux:on { \int_use:N \c@HD@hypercount } }
+\cs_new_protected:Npn \@@_module_push_aux:nn #1
+ {
+ \seq_gpush:Nn \g_@@_module_dest_seq {#1}
+ \hypersetup { hidelinks }
+ \exp_args:Nx \hdclindex
+ { \zref@extractdefault { HD.#1 } { guard@end } { 1 } } { }
+ }
+\cs_generate_variant:Nn \@@_module_push_aux:nn { on }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_pop:n,
+% \@@_module_pop_aux:nn,\@@_module_pop_aux:on}
+% 将模块名释放出栈。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_module_pop:n
+ {
+ \seq_gpop:NNTF \g_@@_module_dest_seq \l_@@_tmpa_tl
+ { \@@_module_pop_aux:on { \l_@@_tmpa_tl } }
+ { \BOOM \use:n }
+ }
+\cs_new_protected:Npn \@@_module_pop_aux:nn #1
+ {
+ \zref@labelbylist { HD.#1 } { fdudoc }
+ \hypersetup { hidelinks }
+ \hdclindex {#1} { }
+ }
+\cs_generate_variant:Nn \@@_module_pop_aux:nn { on }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_module_dest_seq}
+% 存放模块名的序列(栈)。
+% \begin{macrocode}
+\seq_new:N \g_@@_module_dest_seq
+% \end{macrocode}
+% \end{variable}
+%
+% 处理行号超链接。使用 \pkg{zref} 宏包。
+% \begin{macrocode}
+\zref@newlist { fdudoc }
+\zref@newprop { guard@end } [ 1 ]
+ { \int_eval:n { \c@HD@hypercount - 1 } }
+\zref@addprop { fdudoc } { guard@end }
+% \end{macrocode}
+%
+% \paragraph{格式处理}
+%
+% \begin{macro}{\MacroFont}
+% 代码部分的字体。
+% \begin{macrocode}
+\cs_set_protected:Npn \MacroFont
+ {
+ \linespread { 1.05 }
+ \small \ttfamily \mdseries \upshape
+ \@@_verb_addon:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_output_module:nn,\@@_output_module_left:nn}
+% 输出模块名(分行内和行号左侧两种)。
+% \begin{arguments}
+% \item 颜色等样式
+% \item 模块名
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_output_module:nn #1#2
+ {
+ \tex_noindent:D
+ \group_begin:
+ #1
+ \footnotesize \normalfont \sffamily #2
+ \group_end:
+ }
+\cs_new_protected:Npn \@@_output_module_left:nn #1#2
+ {
+ \tex_noindent:D
+ \hbox_overlap_left:n
+ {
+ \@@_output_module:nn {#1} {#2}
+ \skip_horizontal:n { \leftskip + \smallskipamount }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_star_color:,\@@_slash_color:,\@@_pm_color:}
+% 选择模块标记的颜色。模块标记的颜色会根据嵌套层次而改变。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_star_color:
+ {
+ \seq_gpop:NNTF \g_@@_star_color_seq \current@color
+ { \set@color }
+ { \@@_select_color: }
+ \seq_gpush:No \g_@@_slash_color_seq { \current@color }
+ }
+\cs_new_protected_nopar:Npn \@@_slash_color:
+ {
+ \seq_gpop:NNTF \g_@@_slash_color_seq \current@color
+ {
+ \set@color
+ \seq_gpush:No \g_@@_star_color_seq { \current@color }
+ }
+% TODO: 需要报错:star 与 slash 没有匹配
+ { \BOOM }
+ }
+\cs_new_protected_nopar:Npn \@@_pm_color:
+ {
+ \seq_get:NNTF \g_@@_star_color_seq \current@color
+ { \set@color }
+ {
+ \@@_select_color:
+ \seq_gpush:No \g_@@_star_color_seq { \current@color }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_star_color_seq,\g_@@_slash_color_seq}
+% 存放模块标记颜色的序列。
+% \begin{macrocode}
+\seq_new:N \g_@@_star_color_seq
+\seq_new:N \g_@@_slash_color_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_select_color:}
+% \begin{macro}[int]{guard@series}
+% 设置模块标记的色系。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_select_color:
+ { \color { guard@series!!+ } }
+\definecolorseries { guard@series }
+ { cmyk } { last } { blue } { purple }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% 设置色系的增量大小。可选参数 |3| 意味着基色(blue)与
+% 末色(purple)之间将等分为三份。该数字比嵌套最大深度小 1。
+% \begin{macrocode}
+\resetcolorseries [ 3 ] { guard@series }
+% \end{macrocode}
+%
+% \begin{macro}[int]{verb@guard,at@guard,code@gray}
+% 设置颜色。
+% \begin{macrocode}
+\definecolor { verb@guard } { named } { MaterialLime600 }
+\definecolor { at@guard } { named } { MaterialPink }
+\definecolor { code@gray } { named } { MaterialGrey }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_angle:n}
+% 输出“$\langle\cdots\rangle$”。^^A\\
+%^^A 注:原来所使用的 \tn{textlangle} 和 \tn{textrangle} 在
+%^^A Source Sans Pro 字体下不可用。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_module_angle:n #1
+ { \textlangle #1 \textrangle }
+% { < #1 > }
+% { \ensuremath \langle #1 \ensuremath \rangle }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_code_line_no:}
+% 行号。设置为阿拉伯数字。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_code_line_no:
+ {
+ \int_gincr:N \c@CodelineNo
+ \hbox_overlap_left:n
+ {
+ \hbox_to_wd:nn
+ { \MacroIndent }
+ {
+ \HD@target
+ \tex_hss:D \@@_code_line_no_style:
+ \theCodelineNo \enspace
+ }
+ \tex_kern:D \@totalleftmargin
+ }
+ }
+\tl_set:Nn \theCodelineNo { \arabic { CodelineNo } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_code_line_no_style:}
+% 行号格式。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_code_line_no_style:
+ { \color { code@gray } \normalfont \sffamily \tiny }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\HD@SetMacroIndent}
+% 设置代码缩进(行号一栏的宽度)。该命令会写进 |.aux| 辅助文件,
+% 以便在二次编译时确定最大行号宽度。
+% \begin{macrocode}
+\cs_set_protected:Npn \HD@SetMacroIndent #1
+ {
+ \group_begin:
+ \settowidth \MacroIndent
+ {
+ \@@_code_line_no_style:
+ \prg_replicate:nn { \tl_count:n {#1} } { 0 }
+ \enspace
+ }
+ \dim_gset_eq:NN \MacroIndent \MacroIndent
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\env{function} 环境}
+%
+% \begin{macro}{\@@_verb_addon:,
+% \@@_disable_ecglue:,
+% \@@_plain_punct_style:}
+% \begin{macro}[int]{\meta@font@select}
+% 调整文字间距,以便于让 CJK 字符占的宽度等于西文等宽字体中两个
+% 空格的宽度。需要按编译情况分别定义。
+% \begin{macrocode}
+\sys_if_engine_xetex:TF
+ {
+ \cs_set_eq:NN \@@_verb_addon: \xeCJKVerbAddon
+ \cs_set:Nn \@@_plain_punct_style:
+ { \xeCJKsetup { PunctStyle = plain } }
+ \cs_set:Nn \@@_disable_ecglue:
+ { \xeCJKsetup { CJKecglue } }
+ \@@_appto_cmd:Nn \meta@font@select
+ { \mode_if_inner:T { \@@_disable_ecglue: } }
+ }
+ {
+ \cs_set_eq:NN \@@_verb_addon: \prg_do_nothing:
+ \cs_set_eq:NN \@@_plain_punct_style: \prg_do_nothing:
+ \cs_set:Nn \@@_disable_ecglue:
+ { \ltjsetparameter { autoxspacing = false } }
+ \@@_appto_cmd:Nn \meta@font@select
+ { \@@_disable_ecglue: }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{environment}{function}
+% \begin{macro}{\@@_fix_previous_depth:}
+% 调整 \env{function} 环境前后间距。
+% \begin{macrocode}
+\BeforeBeginEnvironment { function }
+ { \par \nointerlineskip }
+\AtEndEnvironment { function }
+ {
+ \par
+ \cs_gset:Nx \@@_fix_previous_depth:
+ { \prevdepth = \the \prevdepth \space }
+ }
+\AfterEndEnvironment { function }
+ { \@@_fix_previous_depth: }
+% \end{macrocode}
+% \end{macro}
+% \end{environment}
+%
+% \begin{environment}{syntax}
+% \begin{environment}{fdusyntax}
+% 在 \env{syntax} 和 \env{fdusyntax} 环境前设置若干活动字符。
+% \texttt{\textbar} 用于分隔多个选项,无需倾斜;|<xxx>| 表示选项,
+% |(xxx)| 表示默认选项。原来的括号用宏保存,并且使用直立字体。
+% \env{syntax} 环境另需要额外调整行距、标点样式及字符间距。
+% \begin{macrocode}
+\AtBeginEnvironment { syntax }
+ {
+ \linespread { 1.2 }
+ \@@_plain_punct_style:
+ \@@_disable_ecglue:
+% \char_set_catcode_active:N |
+% \char_set_catcode_active:N (
+% \char_set_active_eq:NN | \orbar
+% \char_set_active_eq:NN ( \defaultval@aux
+ }
+\AtBeginEnvironment { fdusyntax }
+ {
+ \cs_set:Npn \lparen { \textup { ( } }
+ \cs_set:Npn \rparen { \textup { ) } }
+ \char_set_catcode_active:N |
+ \char_set_catcode_active:N <
+ \char_set_catcode_active:N (
+ \char_set_active_eq:NN | \orbar
+ \char_set_active_eq:NN < \syntaxopt@aux
+ \char_set_active_eq:NN ( \defaultval@aux
+ }
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \subsubsection{修订记录索引项}
+%
+% \begin{macro}{\@@_ltx_changes:nnn}
+% 保存 \pkg{doc} 中 \tn{changes@} 的定义。
+% \begin{macrocode}
+\cs_new_eq:NN \@@_ltx_changes:nnn \changes@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\changes@}
+% \changes{v0.4}{2017/07/30}{调整索引排序方式。}
+% 重定义 \tn{changes@},在版本号一行显示修改日期。
+% \begin{macrocode}
+\cs_set_protected:Npn \changes@ #1#2
+ {
+ \@@_save_version_date:nn {#1} {#2}
+ \@@_ltx_changes:nnn {#1} {#2}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_version_date_prop}
+% 存放版本号与对应的修改日期。
+% key = 版本号,value = \{ 开始日期,结束日期 \}。
+% 开始日期与结束日期可以相同。
+% \begin{macrocode}
+\prop_new:N \g_@@_version_date_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_save_version_date:nn}
+% |nn| 版本最终将被 \tn{changes@} 调用。
+% \begin{arguments}
+% \item 版本号
+% \item 日期
+% \end{arguments}
+% 它们分别对应 \tn{change} 的前两个参数(第三个是说明文字)。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_save_version_date:nn #1#2
+ {
+ \prop_get:NnNTF \g_@@_version_date_prop
+ {#1} \l_@@_tmpa_tl
+ {
+% \end{macrocode}
+% \cs{l_@@_tmp_tl} 相当于两个参数(开始日期、结束日期),
+% 因此需要提前展开。
+% \begin{macrocode}
+ \exp_after:wN
+ \@@_save_version_date_aux:nnnn \l_@@_tmpa_tl
+ {#2} {#1}
+ }
+ { \@@_save_version_date_aux:nnn {#1} {#2} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_save_version_date_aux:nnnn}
+% \begin{arguments}
+% \item 原开始日期
+% \item 原结束日期(显然应有 |#1| < |#2|)
+% \item 新读入的日期
+% \item 版本号
+% \end{arguments}
+% 如果 |#3| < |#1|,则读入日期 |#3|、|#2|;
+% 如果 |#3| > |#2|,则读入日期 |#1|、|#3|。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_save_version_date_aux:nnnn #1#2#3#4
+ {
+ \@@_if_date_later:nnTF {#1} {#3}
+ { \@@_save_version_date_aux:nnn {#4} {#3} {#2} }
+ {
+ \@@_if_date_later:nnT {#3} {#2}
+ { \@@_save_version_date_aux:nnn {#4} {#1} {#3} }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_save_version_date_aux:nnn}
+% 将版本号和日期存入 \cs{g_@@_version_date_prop}。
+% \begin{arguments}
+% \item 版本号
+% \item 开始日期
+% \item 结束日期
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_save_version_date_aux:nnn #1#2#3
+ { \prop_gput:Nnn \g_@@_version_date_prop {#1} { {#2} {#3} } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_if_date_later:nn}
+% \begin{macro}{\@@_parse_date:w}
+% 比较两个日期。如果 |#1| 在 |#2| 之后,则为 |true|;反之为 |false|。
+% 日期的格式为 YYYY/MM/DD。比较方法是直接将日期化成 8 位数字,
+% 所以月、日前的 0 不可以省略。
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_date_later:nn #1#2 { TF, T }
+ {
+ \if_int_compare:w
+ \@@_parse_date:w #1 / / / 0 \q_stop >
+ \@@_parse_date:w #2 / / / 0 \q_stop \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\cs_new:Npn \@@_parse_date:w #1/#2/#3/ #4 \q_stop
+ { #1#2#3 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]{\CTEX@versionitem}
+% 版本条目标签。如果版本号不在 \cs{g_@@_version_date_prop} 的
+% key 里面,则利用未定义的 \cs{BOOM} 报错。
+% \begin{macrocode}
+\cs_new_protected:Npn \CTEX@versionitem #1 \efill
+ {
+ \@idxitem
+ \prop_get:NnNTF \g_@@_version_date_prop
+ {#1} \l_@@_tmpa_tl
+ {
+ \exp_after:wN
+ \@@_print_version_date:nnn \l_@@_tmpa_tl
+ {#1}
+ }
+ { \BOOM }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_print_version_date:nnn}
+% 输出版本号和日期。如果开始日期和结束日期相同,则只输出一项。
+% \begin{arguments}
+% \item 开始日期
+% \item 结束日期
+% \item 版本号
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_version_date:nnn #1#2#3
+ {
+ \noindent
+ \Hy@raisedlink { \belowpdfbookmark {#3} { HD.#3 } }
+ \textbf {#3} \hfill
+ \hbox:n
+ {
+ \footnotesize
+ \str_if_eq:nnTF {#1} {#2}
+ { ( #1 ) } { ( #1 ~ -- ~ #2 ) }
+ }
+ \par \nopagebreak
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\HDorg@theglossary}
+% 该命令由 \pkg{hypdoc} 宏包定义,用于存放标准文档类 \cls{book}
+% 中定义的 \tn{theindex} 命令。
+% 此处的补丁将在版本号一行最后加上修改日期。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \HDorg@theglossary
+ { \let \item \@idxitem }
+ { \let \item \CTEX@versionitem }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@wrglossary}
+% 该命令由 \LaTeXe{} 内核定义,又由 \pkg{hypdoc} 宏包作了修改。
+% 此处的补丁使得修订记录条目的页码能够指向对应行。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \@wrglossary
+ { hdpindex }
+ {
+ \ifnum \c@HD@hypercount = \z@
+ hdpindex
+ \else
+ hdclindex { \the \c@HD@hypercount }
+ \fi
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{命令补丁}
+%
+% \paragraph{\LaTeXe{} 补丁}
+%
+% \begin{macro}[int]{\@addtocurcol}
+% 调整浮动体、代码等与文字的间距。
+% 见 \url{http://tex.stackexchange.com/a/40896}。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \@addtocurcol
+ { \vskip \intextsep }
+ {
+ \edef \save@first@penalty { \the \lastpenalty } \unpenalty
+ \ifnum \lastpenalty = \@M
+ \unpenalty
+ \else
+ \penalty \save@first@penalty \relax
+ \fi
+ \ifnum \outputpenalty < -\@Mii
+ \addvspace\intextsep
+ \vskip\parskip
+ \else
+ \addvspace\intextsep
+ \fi
+ }
+\ctex_patch_cmd:Nnn \@addtocurcol
+ {
+ \vskip \intextsep
+ \ifnum \outputpenalty < -\@Mii
+ \vskip -\parskip
+ \fi
+ }
+ {
+ \ifnum \outputpenalty < -\@Mii
+ \aftergroup \vskip \aftergroup \intextsep
+ \aftergroup \nointerlineskip
+ \else
+ \vskip \intextsep
+ \fi
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@getpen}
+% 将换行或换页的最大罚值由 \num{10000} 改为 \num{10001}。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \@getpen { \@M } { \@Mi }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\l@section,\l@subsection}
+% 修改目录条目的缩进。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \l@section { 2.5em } { 1.5em }
+\ctex_patch_cmd:Nnn \l@subsection { 2.5em } { 1.5em }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@thehead}
+% 修改页眉,禁用 \tn{MakeUppercase}。
+% \begin{macrocode}
+\@@_preto_cmd:Nn \@thehead
+ { \cs_set_eq:cN { MakeUppercase \space } \@iden }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thebibliography}
+% \begin{macro}[int]{\HDorg@thebibliography}
+% 参考文献一节需要编号。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \HDorg@thebibliography
+ { \section* } { \section }
+\cs_set_eq:NN \thebibliography \HDorg@thebibliography
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\GlossaryParms}
+% 修改修订记录中的一些缩进。
+% \begin{macrocode}
+\@@_appto_cmd:Nn \GlossaryParms
+ {
+ \raggedcolumns
+ \cs_set_eq:NN \Hy@writebookmark \HDorg@writebookmark
+ \cs_set:Npn \@idxitem { \par \hangindent 2em }
+ \cs_set:Npn \subitem { \@idxitem \hspace* { 1em } }
+ \cs_set:Npn \subsubitem { \@idxitem \hspace* { 2em } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\HoLogo@LaTeXe}
+% 由于使用了 \pkg{unicode-math},需要额外修改 \pkg{hologo} 中的
+% \tn{LaTeXe} 命令,以使粗体正常显示。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \HoLogo@LaTeXe
+ { \hbox { \HOLOGO@MathSetup 2 $ _{ \textstyle \varepsilon } $ } }
+ {
+ \hbox
+ {
+ \mathsurround 0pt \relax
+ 2
+ \if b \expandafter \@car \f@series \@nil
+ $ _{ \textstyle \symbf { \varepsilon } } $
+ \else
+ $ _{ \textstyle \varepsilon } $
+ \fi
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SpecialMainEnvIndex}
+% 索引汉化。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \SpecialMainEnvIndex
+ { (environment) } { ~ 环境 }
+\ctex_patch_cmd:Nnn \SpecialMainEnvIndex
+ { environments: } { 环境: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\HDorg@SpecialEnvIndex}
+% \pkg{hypdoc} 宏包重新定义了 \tn{SpecialEnvIndex} 命令,因此需要
+% 修改内部定义。
+% \begin{macrocode}
+\ctex_patch_cmd:Nnn \HDorg@SpecialEnvIndex
+ { (environment) } { ~ 环境 }
+\ctex_patch_cmd:Nnn \HDorg@SpecialEnvIndex
+ { environments: } { 环境: }
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{\cls{l3doc} 补丁}
+%
+% \begin{macrocode}
+%<@@=codedoc>
+% \end{macrocode}
+%
+% \begin{macro}{\list}
+% \cls{l3doc} 会设置列表环境中 \tn{listparindent} |=| \tn{z@},
+% 这里将其恢复。
+% \begin{macrocode}
+\cs_set_eq:NN \list \@@_oldlist:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_function_descr_start:w}
+% 抑制首段的 \tn{parskip}。
+% \begin{macrocode}
+\__fdudoc_patch_cmd:Nnn \@@_function_descr_start:w
+ { \noindent }
+ { \skip_vertical:n { -\parskip } \noindent }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_function_assemble:}
+% 在 \cls{l3doc} 中,\env{function} 环境里的 \env{syntax} 和
+% \env{descr} 盒子中间存在一段 \tn{med\-skip\-amount} 的距离。
+% 但是如果 \env{syntax} 盒子为空(未使用 \env{syntax} 环境),
+% 就会显得不好看。此时通过把 \tn{medskipamount} 设置为零来修正。
+% 若盒子非空,则把 \tn{parskip} 还回去。
+% \begin{macrocode}
+\__fdudoc_preto_cmd:Nn \@@_function_assemble:
+ {
+ \box_if_empty:NTF \g_@@_syntax_box
+ { \skip_zero:N \medskipamount }
+ { \skip_add:Nn \medskipamount { \parskip } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_typeset_functions:}
+% 调整 \env{function} 环境的字体。
+% \begin{macrocode}
+\__fdudoc_patch_cmd:Nnn \@@_typeset_functions:
+ { \small \ttfamily } { \footnotesize \CodeFont }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_typeset_functions:,\@@_macro_init:,
+% \@@_macro_dump:}
+% 左侧边注的函数列表采用单倍行距。
+% \begin{macrocode}
+\__fdudoc_preto_cmd:Nn \@@_typeset_functions:
+ { \MacroFont }
+\__fdudoc_patch_cmd:Nnn \@@_macro_init:
+ { \hbox:n } { \MacroFont \hbox:n }
+\__fdudoc_patch_cmd:Nnn \@@_macro_dump:
+ { \hbox_unpack_clear:N } { \MacroFont \hbox_unpack_clear:N }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_macro_end_style:n}
+% 禁止显示 \env{macro} 环境最后的 “(\emph{End definition for ...})”。
+% \begin{macrocode}
+\cs_set_eq:NN \@@_macro_end_style:n \use_none:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_typeset_TF:}
+% 关闭 |TF| 上的超链接,并且保证颜色与函数主体一致。
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_typeset_TF:
+ {
+ \group_begin:
+ \exp_args:No \@@_if_macro_internal:nT \l_@@_tmpa_tl
+ { \color [ gray ] { 0.5 } }
+ \itshape TF
+ \makebox [ 0 pt ] [ r ]
+ {
+ \color { red }
+ \underline { \phantom { \itshape TF } \kern -0.1 em }
+ }
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_macro_typeset_one:nN}
+% 在 \env{macro} 环境的侧边栏中,\cls{l3doc} 根据命令的长短,分别用
+% 普通字体和紧缩字体输出。然而很长的命令还是会超出页边。这里用缩放
+% 盒子的手段使得长命令也可正常显示。
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_macro_typeset_one:nN #1#2
+ {
+ \vbox_set:Nn \l_@@_macro_box
+ {
+ \MacroFont
+ \vbox_unpack_clear:N \l_@@_macro_box
+ \hbox_set:Nn \l_tmpa_box
+ { \@@_print_macroname:nN {#1} #2 }
+% \end{macrocode}
+% \tn{marginparwidth} 和 \tn{marginparsep} 分别是边注的宽度及其到
+% 版心的距离,\tn{la\-bel\-sep} 则是编号盒子右端与条目首行文本之间
+% 的距离。
+% \begin{macrocode}
+ \dim_set:Nn \l_tmpa_dim
+ { \marginparwidth - \labelsep - \marginparsep }
+ \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
+ {
+ \box_resize_to_wd_and_ht:Nnn \l_tmpa_box
+ { \l_tmpa_dim } { \box_ht:N \l_tmpa_box }
+ }
+ \hbox_overlap_left:n
+ {
+ \box_use:N \l_tmpa_box
+ \skip_horizontal:n { \marginparsep - \labelsep }
+ }
+ }
+ \int_incr:N \l_@@_macro_int
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_print_macroname:nN}
+% 该函数不再需要根据命令的长短切换字体。
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_print_macroname:nN #1#2
+ {
+ \strut
+ \@@_get_hyper_target:xN
+ {
+ \exp_not:n {#1}
+ \bool_if:NT #2 { \tl_to_str:n {TF} }
+ }
+ \l_@@_tmpa_tl
+ \cs_if_exist:cTF { r@ \l_@@_tmpa_tl }
+ { \exp_args:NNo \label@hyperref [ \l_@@_tmpa_tl ] }
+ { \use:n }
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+% \end{macrocode}
+% 命令中的空格改用“\textvisiblespace”显示。
+% \begin{macrocode}
+ \tl_replace_all:Non \l_@@_tmpa_tl
+ { \c_catcode_other_space_tl }
+ { \fontspec_visible_space: }
+ \@@_macroname_prefix:o \l_@@_tmpa_tl
+ \@@_macroname_suffix:N #2
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_special_index_module:nnnnN}
+% 索引汉化。
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_special_index_module:nnnnN #1#2#3#4#5
+ {
+ \use:x
+ {
+ \exp_not:n { \@@_special_index_aux:nnnnnnn {#1} {#2} }
+ \tl_if_empty:nTF {#3}
+ { { } { } { } { } }
+ {
+ \str_if_eq_x:nnTF {#3} { TeX }
+ {
+ { TeX~ and~ LaTeX2e }
+ { \string \TeX{}~ 和~ \string \LaTeXe{} }
+ }
+ { {#3} { \string \pkg {#3} } }
+ \bool_if:NTF #5
+ { { commands~ internal } { ~ 内部命令: } }
+ { { commands } { ~ 命令: } }
+ }
+ }
+ {#4}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_special_index_aux:nnnnnnn}
+% 该函数在 \cls{l3doc} 中本来只有 6 个参数。这里增加了一个,用来辅助
+% 排序。
+% \begin{arguments}
+% \item 键(即宏名称字符串,用来排序)
+% \item 宏名称
+% \item 索引头排序字符串(排序)
+% \item 索引头文字
+% \item 索引头后缀字符串(排序,新增)
+% \item 索引头后缀文字
+% \item 索引类型(\opt{main}/\opt{usage} 等)
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_special_index_aux:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \tl_set:Nn \l_@@_index_escaped_key_tl {#1}
+ \@@_quote_special_char:N \l_@@_index_escaped_key_tl
+ \@@_special_index_set:Nn
+ \l_@@_index_escaped_macro_tl {#2}
+ \str_if_eq:onTF { \@currenvir } { macrocode }
+ { \codeline@wrindex }
+ {
+ \str_case:nnF {#7}
+ {
+ { main } { \codeline@wrindex }
+ { usage } { \index }
+ }
+ { \HD@target \index }
+ }
+ {
+ \tl_if_empty:nF { #3 #4 #5 #6 }
+ { #3 #5 \actualchar #4 #6 \levelchar }
+ \l_@@_index_escaped_key_tl
+ \actualchar
+ {
+ \token_to_str:N \verbatim@font \c_space_tl
+ \l_@@_index_escaped_macro_tl
+ }
+ \encapchar
+ hdclindex { \the \c@HD@hypercount } {#7}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{杂项}
+%
+% \begin{macro}{\StopSpecialIndexModule,
+% \@@_special_index_module:nnnnN}
+% 不对 \cs{cs} 和 \cs{tn} 等编索引。用于目录、索引等。
+% \begin{macrocode}
+\DeclareDocumentCommand \StopSpecialIndexModule { }
+ {
+ \cs_set_eq:NN
+ \@@_special_index_module:nnnnN \use_none:nnnnn
+ }
+\tl_map_inline:nn { \actualchar \encapchar \levelchar }
+ { \exp_args:Nx \DoNotIndex { \bslash \tl_to_str:N #1 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\meta}
+% 重定义 \cs{meta} 命令,需要禁用中文、西文之间的空格,
+% 并确保为罗马字体族。
+% \begin{macrocode}
+\RenewDocumentCommand \meta { m }
+ {
+ \group_begin:
+ \sys_if_engine_xetex:T { \xeCJKsetup { CJKecglue = { } } }
+ \rmfamily \@@_meta:n {#1}
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% 重定向 \cls{l3doc} 中的一些提示信息。
+% \begin{macrocode}
+\msg_redirect_name:nnn { l3doc } { foreign-internal } { log }
+\msg_redirect_name:nnn { l3doc } { print-changes-howto } { log }
+\msg_redirect_name:nnn { l3doc } { print-index-howto } { log }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=>
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \subsubsection{排版样式设置}
+%
+% 目录中禁止对 \cs{cs} 和 \cs{tn} 等的索引。
+% \begin{macrocode}
+\AtBeginDocument{%
+ \addtocontents{toc}{\StopSpecialIndexModule}}
+% \end{macrocode}
+%
+% \begin{macro}{\path,\opt,\kaishu}
+% 设置 PDF 字符串中的命令替换。
+% \begin{macrocode}
+\pdfstringdefDisableCommands{%
+ \let\path\meta
+ \let\opt\@firstofone
+ \let\kaishu\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@makefntext}
+% 调整脚注文本缩进。
+% \begin{macrocode}
+\renewcommand\@makefntext[1]{\parindent 0em\noindent\@makefnmark~#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IndexLayout,\indexname}
+% 调整索引外观。
+% \begin{macrocode}
+\IndexPrologue{%
+ \section{\indexname}%
+ \textit{无衬线字体的数字表示对应索引项出现的页码;
+ 带下划线的数字表示定义对应索引项的代码行号;
+ 其他普通数字则表示使用对应索引项的代码行号.}}
+\def\IndexLayout{%
+ \newgeometry{%
+ left = 0.85 in,
+ right = 0.85 in,
+ top = 1.25 in,
+ bottom = 1.00 in}%
+ \setlength\IndexMin{0.5\textheight}%
+ \ctexset{section/numbering=false}%
+ \StopSpecialIndexModule}
+\def\indexname{代码索引}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\usage}
+% 控制“描述对应索引项的页码”样式。在 \pkg{doc} 宏包中的定义为
+% \tn{textit}。
+% \begin{macrocode}
+\def\usage#1{\textsf{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\glossaryname}
+% 调整修订记录外观。
+% \begin{macrocode}
+\GlossaryPrologue{\section{\glossaryname}}
+\def\glossaryname{修订记录}
+% \end{macrocode}
+% \end{macro}
+%
+% 西文字体。
+% \begin{macrocode}
+\setmainfont{TeX Gyre Pagella}
+\setsansfont{TeX Gyre Heros}
+\setmathfont{TeX Gyre Pagella Math}
+% \end{macrocode}
+%
+% \begin{macro}{\kaishu,\fangsong}
+% 中文字体。
+% \begin{macrocode}
+\setCJKmainfont{FZShuSong-Z01}%
+ [
+ BoldFont = FZHei-B01,
+ ItalicFont = FZKai-Z03,
+ BoldItalicFont = FZKai-Z03
+ ]
+\setCJKsansfont{FZHei-B01}%
+ [
+ BoldFont = FZHei-B01,
+ ItalicFont = FZKai-Z03,
+ BoldItalicFont = FZKai-Z03
+ ]
+\setCJKmonofont{FZFangSong-Z02}%
+ [
+ BoldFont = FZHei-B01,
+ ItalicFont = FZKai-Z03,
+ BoldItalicFont = FZKai-Z03
+ ]
+\newCJKfontfamily\kaishu{FZKai-Z03}%
+ [BoldFont = *, ItalicFont = *, BoldItalicFont = *]
+\newCJKfontfamily\fangsong{FZFangSong-Z02}%
+ [BoldFont = *, ItalicFont = *, BoldItalicFont = *]
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CodeFont}
+% \begin{macro}[int]{\fdudoc@code@font,\fdudoc@cjk@code@font}
+% 代码部分的字体,这里用了两种系列。
+% \begin{macrocode}
+\setmonofont{CMU Typewriter Text}%
+ [
+ UprightFont = * Light,
+ BoldFont = * Bold,
+ SlantedFont = * Light Oblique,
+ HyphenChar = None
+ ]
+\newfontfamily\fdudoc@code@font{Source Code Pro}%
+ [BoldFont = * Semibold]
+\newCJKfontfamily\fdudoc@cjk@code@font{Source Han Sans SC}%
+ [BoldFont = * Bold, AutoFakeSlant = 0.22]
+\newcommand*\CodeFont{\fdudoc@code@font\fdudoc@cjk@code@font}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% 中文排版格式(\pkg{ctex} 宏包)。
+% \begin{macrocode}
+\ctexset
+ {
+ section = {name = {第,节}, format+ = \raggedright},
+ subsubsection/tocline = {\kaishu\CTEXnumberline{#1}#2},
+ paragraph = {runin = false, numbering = false}
+ }
+% \end{macrocode}
+%
+% 设定章节标题、目录深度。
+% \begin{macrocode}
+\setcounter{secnumdepth}{4}
+\setcounter{tocdepth}{3}
+% \end{macrocode}
+%
+% 单位设置(\pkg{siunitx} 宏包)。
+% \begin{macrocode}
+\sisetup
+ {
+ number-math-rm = \ensuremath,
+ inter-unit-product = \ensuremath{{}\cdot{}},
+ group-digits = true,
+ group-minimum-digits = 4,
+ group-separator = \text{~},
+ range-phrase = \symbol{"FF5E},
+ separate-uncertainty = true
+ }
+% \end{macrocode}
+%
+% 超链接设置(\pkg{hyperref} 宏包)。
+% \begin{macrocode}
+\hypersetup
+ {
+ bookmarksdepth = 4,
+ bookmarksnumbered = true,
+ colorlinks = true,
+ citecolor = MaterialGreen,
+ linkcolor = MaterialPink,
+ urlcolor = MaterialIndigo
+ }
+% \end{macrocode}
+%
+% 浮动体标题设置(\pkg{caption} 宏包)。
+% \begin{macrocode}
+\captionsetup{labelsep = quad, labelfont+ = bf}
+% \end{macrocode}
+%
+% 设置标准列表环境样式。
+% \begin{macrocode}
+\setlist{noitemsep, topsep=\smallskipamount}
+\setlist[1]{labelindent=\parindent}
+\setlist[enumerate]{leftmargin=*}
+\setlist[itemize]{leftmargin=*}
+% \end{macrocode}
+%
+% \begin{environment}{optdesc}
+% 用于描述各选项。设置条目间距为 \tn{marginparsep},与
+% \cls{l3doc} 一致。
+% \begin{macrocode}
+\newlist{optdesc}{description}{3}
+\setlist[optdesc]{%
+ font=\mdseries\small\ttfamily, align=right,
+ listparindent=\parindent,
+ labelsep=\marginparsep, labelindent=-\marginparsep,
+ leftmargin=*}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{tablenotes}
+% \begin{variable}{tpt@id}
+% 重新定义 \pkg{threeparttable} 包的 \env{tablenotes} 环境,
+% 用于表格的注释。
+% \begin{macrocode}
+\renewlist{tablenotes}{description}{1}
+\setlist[tablenotes]{%
+ format=\normalfont\tnote@item, align=right,
+ listparindent=\parindent, labelindent=\tabcolsep,
+ leftmargin=*, rightmargin=\tabcolsep,
+ after=\@noparlisttrue}
+\AtBeginEnvironment{tablenotes}{%
+ \setlength\parindent{2\ccwd}%
+ \normalfont\footnotesize}
+\AtBeginEnvironment{threeparttable}{%
+ \stepcounter{tpt@id}%
+ \edef\curr@tpt@id{tpt@\arabic{tpt@id}}}
+\newcounter{tpt@id}
+% \end{macrocode}
+% \end{variable}
+% \end{environment}
+%
+% \begin{macro}[int]{\tnote@item,\TPTtagStyle}
+% 为 \tn{tnote} 增加超链接。
+% \begin{macrocode}
+\def\tnote@item#1{%
+ \Hy@raisedlink{\hyper@anchor{\curr@tpt@id-#1}}#1}
+\def\TPTtagStyle#1{\hyperlink{\curr@tpt@id-#1}{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UrlAlphabet,\UrlDigits}
+% 网址断行。\tn{UrlOrds}、\tn{UrlAlphabet} 和 \tn{UrlDigits}
+% 分别记录了特殊符号、字母和数字,把它们依次附加在 \pkg{url} 宏包
+% 提供的命令 \tn{UrlBreaks} 之后,即可允许在这些位置处断行。与
+% \cs{fdu_allow_url_break:} 的原理是相同的。
+% \begin{macrocode}
+\def\UrlAlphabet{%
+ \do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j%
+ \do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t%
+ \do\u\do\v\do\w\do\x\do\y\do\z\do\A\do\B\do\C\do\D%
+ \do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M\do\N%
+ \do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X%
+ \do\Y\do\Z}
+\def\UrlDigits{%
+ \do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9\do\0}
+\g@addto@macro\UrlBreaks{\UrlOrds}
+\g@addto@macro\UrlBreaks{\UrlAlphabet}
+\g@addto@macro\UrlBreaks{\UrlDigits}
+% \end{macrocode}
+% \end{macro}
+%
+% 不对下列各项添加索引。
+% \begin{macrocode}
+\DoNotIndex{\begin,\end,
+ \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,
+ \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,
+ \0,\1,\2,\3,\4,\5,\6,\7,\8,\9}
+% \end{macrocode}
+%
+% 启用索引、交叉引用、历史记录。
+% \begin{macrocode}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+% \end{macrocode}
+%
+% \subsubsection{文档层命令}
+%
+% \begin{macro}{\exptarget,\rexptarget,\expstar,\rexpstar,
+% \__codedoc_typeset_exp:,\__codedoc_typeset_rexp:}
+% 部分命令之后的星号($\star$ 或 \ding{73}),表明其不同用法。
+% 这里的“exp”和“rexp”分别源自 \LaTeX3 中的“expandable”
+% 和“restricted-expandable”。
+% \begin{macrocode}
+\newcommand*\exptarget{\Hy@raisedlink{\hypertarget{expstar}{}}}
+\newcommand*\rexptarget{\Hy@raisedlink{\hypertarget{rexpstar}{}}}
+\newcommand*\expstar{\hyperlink{expstar}{$\star$}}
+\newcommand*\rexpstar{\hyperlink{rexpstar}{\ding{73}}}
+% TODO: (2017/08/12) 允许修改 exptstar 和 rexpstar
+\renewcommand*\expstar{\hyperlink{expstar}{$\mfrake$}}
+\renewcommand*\rexpstar{\hyperlink{rexpstar}{$\mfrakc$}}
+\ExplSyntaxOn
+\cs_set_eq:NN \__codedoc_typeset_exp: \expstar
+\cs_set_eq:NN \__codedoc_typeset_rexp: \rexpstar
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\marg,\oarg,\parg}
+% 几种命令参数:
+% \begin{itemize}
+% \item 必选参数:|{|\meta{arg}|}|;
+% \item 可选参数:|[|\meta{arg}|]|;
+% \item 图形参数:|(|\meta{arg}|)|。
+% \end{itemize}
+% \begin{macrocode}
+\renewcommand*\marg[1]{\{\meta{#1}\}}
+\renewcommand*\oarg[1]{[\meta{#1}]}
+\renewcommand*\parg[1]{(\meta{#1})}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\opt}
+% 选项名。
+% \begin{macrocode}
+\DeclareDocumentCommand\opt{m}{\texttt{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kvopt}
+% \meta{key} |=| \meta{value} 型选项。
+% \begin{macrocode}
+\DeclareDocumentCommand\kvopt{mm}
+ {\texttt{#1\breakablethinspace=\breakablethinspace#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\breakablethinspace}
+% 允许换行的细间距。
+% \begin{macrocode}
+\def\breakablethinspace{\hskip 0.16667em\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\syntaxopt,\defaultval}
+% \begin{macro}[int]{\syntaxopt@aux,\defaultval@aux}
+% \env{syntax} 中的选项及命令选项。
+% |aux| 结尾的两个命令用于定义利用 |<>| 和 |()| 的简写形式。
+% \begin{macrocode}
+\def\syntaxopt#1{\textit{#1}}
+\def\defaultval#1{\textbf{\textup{#1}}}
+\def\syntaxopt@aux#1>{\syntaxopt{#1}}
+\def\defaultval@aux#1){\defaultval{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\orbar,\TF,\TTF,\TFF}
+% \env{syntax} 中的选项分隔符,以及 \opt{true} 或 \opt{false}
+% 选项的几种快捷方式。
+% \begin{macrocode}
+\def\orbar{\textup{\textbar}}
+\def\TF{true\orbar false}
+\def\TTF{\defaultval{true}\orbar false}
+\def\TFF{true\orbar\defaultval{false}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{arguments}
+% 放在 \env{macro} 环境中,用于描述对应命令的参数。
+% \cls{l3doc} 中的定义 \opt{labelsep} 设置不太合理,会使标签被覆盖,
+% 这里重新定义。
+% \begin{macrocode}
+\DeclareDocumentEnvironment{arguments}{}
+ {\enumerate[%
+ label={\texttt{\#\arabic*:~}}, labelsep=0pt, nolistsep]}%
+ {\endenumerate}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\TeX,\LaTeX,\LaTeXe,
+% \pdfTeX,\pdfLaTeX,\XeTeX,\XeLaTeX,\LuaTeX,\LuaLaTeX,
+% \AmSLaTeX,\TeXLive,\MiKTeX,\BibTeX,\biber,\TikZ}
+% \TeX{} 相关标志。
+% \begin{macrocode}
+\def\TeX{\hologo{TeX}}
+\def\LaTeX{\hologo{LaTeX}}
+\def\LaTeXe{\hologo{LaTeXe}}
+\def\pdfTeX{\hologo{pdfTeX}}
+\def\pdfLaTeX{\hologo{pdfLaTeX}}
+\def\XeTeX{\hologo{XeTeX}}
+\def\XeLaTeX{\hologo{XeLaTeX}}
+\def\LuaTeX{\hologo{LuaTeX}}
+\def\LuaLaTeX{\hologo{LuaLaTeX}}
+\def\AmSLaTeX{\hologo{AmSLaTeX}}
+\def\TeXLive{\TeX\ Live}
+\def\MiKTeX{\hologo{MiKTeX}}
+\def\BibTeX{\hologo{BibTeX}}
+\def\BibTeX{\hologo{BibTeX}}
+\def\biber{\hologo{biber}}
+% \end{macrocode}
+% 该定义来自 \file{pgfmanual-en-macros.tex}。
+% \begin{macrocode}
+\def\TikZ{Ti\emph{k}Z}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cs,\tn}
+% \begin{macro}[int]{\codedoc@cs,\codedoc@tn}
+% 控制序列。
+%^^A Colors are used for debug.
+% \begin{macrocode}
+% \let\codedoc@cs=\cs
+% \let\codedoc@tn=\tn
+% \renewcommand*\cs[2][]{%
+% \textcolor{MaterialIndigo}{\codedoc@cs[#1]{#2}}}
+% \renewcommand*\tn[2][]{%
+% \textcolor{MaterialPink}{\codedoc@tn[#1]{#2}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\file,\env,\pkg,\cls}
+% 文件、环境、宏包、文档类。
+% \begin{macrocode}
+% \renewcommand*\file[1]{%
+% \textcolor{MaterialGrey900}{\texttt{#1}}}
+\renewcommand*\env[1]{\textbf{\texttt{#1}}}
+% \renewcommand*\pkg[1]{\textsf{#1}}
+% \renewcommand*\cls[1]{\textit{\textsf{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bashcmd}
+% Bash 中的命令。
+% \begin{macrocode}
+\newcommand*\bashcmd[1]{\texttt{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\scite}
+% 位于上标的文献引用。
+% \begin{macrocode}
+\newcommand*\scite[1]{\textsuperscript{\cite{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{quote*}
+% 引述环境。
+% \begin{arguments}
+% \item 作者
+% \item 朝代
+% \end{arguments}
+% \begin{macrocode}
+\DeclareDocumentEnvironment{quote*}{oo}
+ {\quote\fangsong\qquad}%
+ {\endquote\IfNoValueF{#1}{%
+ \hfill —— \IfNoValueF{#2}{〔#2〕}#1}}
+% \end{macrocode}
+% \end{environment}
+%
+% \paragraph{示例代码环境}
+%
+% \pkg{listings} 宏包中连字符 |-| 原本以数学模式输出,
+% 此处改为普通文本。
+% 见 \url{https://tex.stackexchange.com/a/33188/136923}。
+% \begin{macrocode}
+\lst@CCPutMacro\lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{-{}}}
+\@empty\z@\@empty
+% \end{macrocode}
+%
+% \changes{v0.5}{2017/09/05}{[\pkg{fdudoc}] 移除 \pkg{listings}
+% 关键字定义文件。}
+%
+% 定义几种代码样式。
+% \begin{macro}[int]{style@base}
+% \begin{macrocode}
+\lstdefinestyle{style@base}
+ {
+ extendedchars = true,
+ gobble = 3,
+ lineskip = 2 pt,
+ frame = l,
+ framerule = 1 pt,
+ framesep = 0 pt,
+ escapeinside = {(*}{*)},
+ basicstyle = \small\CodeFont\color{MaterialGrey900},
+ keywordstyle = \bfseries\color{MaterialIndigo},
+ commentstyle = \itshape\color{MaterialGrey600},
+ stringstyle = \color{MaterialRed},
+ backgroundcolor = \color{MaterialGrey50}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{style@shell}
+% \begin{macrocode}
+\lstdefinestyle{style@shell}
+ {
+ style = style@base,
+ rulecolor = \color{MaterialPink},
+ language = bash,
+ alsoletter = {-},
+ emphstyle = \color{MaterialGreen800}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{style@latex}
+% \begin{macrocode}
+\lstdefinestyle{style@latex}
+ {
+ style = style@base,
+ rulecolor = \color{MaterialIndigo},
+ language = [LaTeX]TeX,
+ alsoletter = {*, -},
+ texcsstyle = *\color{MaterialDeepOrange},
+ emphstyle = [1]\color{MaterialGreen800},
+ emphstyle = [2]\color{MaterialTeal}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{style@syntax}
+% \begin{macrocode}
+\lstdefinestyle{style@syntax}
+ {
+ extendedchars = true,
+ gobble = 6,
+ escapeinside = {(*}{*)},
+ language = [LaTeX]TeX,
+ alsoletter = {*, -},
+ basicstyle = \footnotesize\CodeFont\color{MaterialGrey900},
+ keywordstyle = \bfseries\color{MaterialIndigo},
+ commentstyle = \itshape\color{MaterialGrey600},
+ texcsstyle = *\color{MaterialDeepOrange},
+ emphstyle = [1]\color{MaterialGreen800},
+ emphstyle = [2]\color{MaterialTeal}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{shellexample}
+% \begin{environment}{latexexample}
+% Shell 和 \LaTeX{} 示例代码。
+% \begin{macrocode}
+\lstnewenvironment{shellexample}[1][]{%
+ \lstset{style=style@shell, #1}}{}
+\lstnewenvironment{latexexample}[1][]{%
+ \lstset{style=style@latex, #1}}{}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{environment}{fdusyntax}
+% 语法说明。用于代替 \cls{l3doc} 中的 \env{syntax} 环境。
+% \begin{macrocode}
+\lstnewenvironment{fdusyntax}[1][]{%
+ \lstset{style=style@syntax, #1}\vspace{-1.8ex}}{}
+%</doc>
+% \end{macrocode}
+% \end{environment}
+%
+% \subsubsection{\pkg{latexmk} 配置文件}
+%
+% \begin{macrocode}
+%<*latexmk|latexmk-en>
+# Latexmk configuration file.
+
+# Use XeLaTeX to compile.
+$pdf_mode = 5;
+
+# Process index.
+$makeindex = 'zhmakeindex -s gind.ist %O -o %D %S';
+
+# Show CPU time used.
+$show_time = 1;
+%</latexmk|latexmk-en>
+%<*latexmk>
+
+# Process glossary (change history).
+add_cus_dep('glo', 'gls', 0, 'makeglo2gls');
+sub makeglo2gls {
+ system("zhmakeindex -s gglo.ist -o \"$_[0].gls\"
+ -t \"$_[0].glg\" \"$_[0].glo\"");
+}
+%</latexmk>
+% \end{macrocode}
+%
+% \clearpage
+%
+% \end{implementation}
+%
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx b/Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx
new file mode 100644
index 00000000000..0b2ae76f1ee
--- /dev/null
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx
@@ -0,0 +1,2537 @@
+% \iffalse meta-comment
+%
+% 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.
+%
+% \fi
+%
+% \EnableImplementation
+%
+% \begin{implementation}
+%
+%^^A 代码部分的页边距
+% \newgeometry{
+% left = 2.25 in,
+% right = 1.00 in,
+% top = 1.25 in,
+% bottom = 1.00 in,
+% marginpar = 2.25 in
+% }
+%
+% \subsection{视觉识别系统 \pkg{fdulogo}}
+%
+% \changes{v0.5}{2017/08/30}{将视觉识别系统移入 \pkg{fdulogo}
+% 宏包,并添加重修版校徽。}
+%
+% 本宏包附属于 \cls{fduthesis},利用 \TikZ{} 宏包绘制复旦大学
+% 校名、校徽与校训,并提供标准色以供参考。
+%
+% \begin{macrocode}
+%<@@=fdulogo>
+%<*logo>
+\RequirePackage { luatex85 }
+\RequirePackage { xcolor, tikz }
+\RequirePackage { xparse }
+% \end{macrocode}
+%
+% \subsubsection{用户接口}
+%
+% \begin{macro}{\fduname}
+% 复旦大学校名(復旦大學),由毛泽东题写。原始图片来源:
+% \url{http://www.fudan.edu.cn/2016/channels/view/74/}。
+% \begin{macrocode}
+\NewDocumentCommand \fduname { O { } }
+ {
+ \@@_tikz:Nx \fdulogo@name
+ { \l_@@_default_arg_tl, #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fduemblem}
+% 复旦大学校徽。第一个可选参数(加号)用于选择是否使用重修版本
+% 的图案,第二个(星号)用于选择是否选用阴文图案。原始图片来源:
+% \url{http://www.fudan.edu.cn/2016/channels/view/74/}。
+% 重修版本的核心图案来自江湾永久校址奠基石(来源:
+% \url{http://www.fda.fudan.edu.cn/zphc/list.htm}),字体使用
+% FreeSerif Bold。
+% \begin{macrocode}
+\NewDocumentCommand \fduemblem { t+ s O { } }
+ {
+ \@@_tikz:cx
+ {
+ \IfBooleanTF {#1}
+ {
+ \IfBooleanTF {#2}
+ { fdulogo@emblem@new@reversed } { fdulogo@emblem@new }
+ }
+ {
+ \IfBooleanTF {#2}
+ { fdulogo@emblem@reversed } { fdulogo@emblem }
+ }
+ }
+ { \l_@@_default_arg_tl, #3 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fdumotto}
+% 复旦大学校训:博學而篤志,切問而近思(简体:博学而笃志,
+% 切问而近思),由马相伯题写。原始图片来源:
+% \url{http://www.fudan.edu.cn/2016/channels/view/74/}。
+% \begin{macrocode}
+\NewDocumentCommand \fdumotto { O { } }
+ {
+ \@@_tikz:Nx \fdulogo@motto
+ { \l_@@_default_arg_tl, #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_default_arg_tl}
+% 默认参数。
+% \begin{macrocode}
+\tl_const:Nn \l_@@_default_arg_tl { x = 1 pt, y = 1 pt }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_tikz:Nn,\@@_tikz:Nx,\@@_tikz:cx}
+% 对 \env{tikzpicture} 环境的封装。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tikz:Nn #1#2
+ {
+ \begin{tikzpicture} [#2]
+ #1
+ \end{tikzpicture}
+ }
+\cs_generate_variant:Nn \@@_tikz:Nn { Nx, cx }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{FudanBlue,FudanRed}
+% 标准色(复旦蓝、复旦红)。
+% \begin{macrocode}
+\definecolor { FudanBlue } { HTML } { 0E419C }
+\definecolor { FudanRed } { HTML } { C80000 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{MaterialGrey}
+% Google Material 颜色系列。
+% \begin{macrocode}
+\definecolor { MaterialGrey } { HTML } { 9E9E9E }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{内部命令}
+%
+% \begin{macrocode}
+%<@@=>
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \begin{macro}[int]{\fdulogo@name}
+% 校名。
+% \begin{macrocode}
+\def\fdulogo@name{%
+ \fill \fdulogo@name@fu
+ \fdulogo@name@dan
+ \fdulogo@name@da
+ \fdulogo@name@xue;}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\fdulogo@emblem,
+% \fdulogo@emblem@reversed,
+% \fdulogo@emblem@text,
+% \fdulogo@emblem@year}
+% 校徽。
+% \begin{macrocode}
+\def\fdulogo@emblem{%
+ \fill \fdulogo@emblem@kernel
+ \fdulogo@emblem@text
+ \fdulogo@emblem@year
+ \fdulogo@emblem@ring@inner@i
+ \fdulogo@emblem@ring@inner@ii
+ \fdulogo@emblem@ring@outer@i
+ \fdulogo@emblem@ring@outer@ii;}
+\def\fdulogo@emblem@reversed{%
+ \fill \fdulogo@emblem@text
+ \fdulogo@emblem@year;
+ \fill[even odd rule]
+ \fdulogo@emblem@kernel
+ \fdulogo@emblem@ring@inner@i
+ \fdulogo@emblem@ring@outer@i
+ \fdulogo@emblem@ring@outer@ii;}
+\def\fdulogo@emblem@text{%
+ \fdulogo@emblem@F
+ \fdulogo@emblem@U@i
+ \fdulogo@emblem@D
+ \fdulogo@emblem@A
+ \fdulogo@emblem@N@i
+ \fdulogo@emblem@U@ii
+ \fdulogo@emblem@N@ii
+ \fdulogo@emblem@I@i
+ \fdulogo@emblem@V
+ \fdulogo@emblem@E
+ \fdulogo@emblem@R
+ \fdulogo@emblem@S
+ \fdulogo@emblem@I@ii
+ \fdulogo@emblem@T
+ \fdulogo@emblem@Y}
+\def\fdulogo@emblem@year{%
+ \fdulogo@emblem@one
+ \fdulogo@emblem@nine
+ \fdulogo@emblem@zero
+ \fdulogo@emblem@five}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\fdulogo@emblem@new,
+% \fdulogo@emblem@new@reversed,
+% \fdulogo@emblem@new@text,
+% \fdulogo@emblem@new@year}
+% 校徽(重修版)。
+% \begin{macrocode}
+\def\fdulogo@emblem@new{%
+ \fill \fdulogo@emblem@new@kernel
+ \fdulogo@emblem@new@text
+ \fdulogo@emblem@new@year;
+ \fill[even odd rule]
+ \fdulogo@emblem@new@ring@inner@i
+ \fdulogo@emblem@new@ring@inner@ii
+ \fdulogo@emblem@new@ring@outer@i
+ \fdulogo@emblem@new@ring@outer@ii;}
+\def\fdulogo@emblem@new@reversed{%
+ \fill \fdulogo@emblem@new@text
+ \fdulogo@emblem@new@year;
+ \fill[even odd rule]
+ \fdulogo@emblem@new@kernel
+ \fdulogo@emblem@new@ring@inner@i
+ \fdulogo@emblem@new@ring@outer@i
+ \fdulogo@emblem@new@ring@outer@ii;}
+\def\fdulogo@emblem@new@text{%
+ \fdulogo@emblem@new@F
+ \fdulogo@emblem@new@U@i
+ \fdulogo@emblem@new@D
+ \fdulogo@emblem@new@A
+ \fdulogo@emblem@new@N@i
+ \fdulogo@emblem@new@U@ii
+ \fdulogo@emblem@new@N@ii
+ \fdulogo@emblem@new@I@i
+ \fdulogo@emblem@new@V
+ \fdulogo@emblem@new@E
+ \fdulogo@emblem@new@R
+ \fdulogo@emblem@new@S
+ \fdulogo@emblem@new@I@ii
+ \fdulogo@emblem@new@T
+ \fdulogo@emblem@new@Y}
+\def\fdulogo@emblem@new@year{%
+ \fdulogo@emblem@new@one
+ \fdulogo@emblem@new@nine
+ \fdulogo@emblem@new@zero
+ \fdulogo@emblem@new@five}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\fdulogo@motto,
+% \fdulogo@motto@i,
+% \fdulogo@motto@ii}
+% 校训。
+% \begin{macrocode}
+\def\fdulogo@motto{%
+ \fill \fdulogo@motto@i
+ \fdulogo@motto@ii;}
+\def\fdulogo@motto@i{%
+ \fdulogo@motto@bo
+ \fdulogo@motto@xue
+ \fdulogo@motto@er@i
+ \fdulogo@motto@du
+ \fdulogo@motto@zhi}
+\def\fdulogo@motto@ii{%
+ \fdulogo@motto@qie
+ \fdulogo@motto@wen
+ \fdulogo@motto@er@ii
+ \fdulogo@motto@jin
+ \fdulogo@motto@si}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\fduthesis@cover}
+% \cls{fduthesis} 用户手册的封面图案。内部使用。
+% \begin{macrocode}
+\def\fduthesis@cover{%
+ \hspace{1.5cm}
+ \begin{tikzpicture}[x=1pt, y=1pt, scale=1.1, color=MaterialGrey]
+ \useasboundingbox ( 100, -140) rectangle ( 800, 800);
+ \fdulogo@emblem@new
+ \end{tikzpicture}
+ \begin{tikzpicture}[x=1pt, y=1pt]
+ \useasboundingbox ( 750, -150) rectangle (1350, 850);
+ \fill \fdulogo@motto@i;
+ \end{tikzpicture}
+ \begin{tikzpicture}[x=1pt, y=1pt]
+ \useasboundingbox (1280, 10) rectangle (1880, 1210);
+ \fill \fdulogo@motto@ii;
+ \end{tikzpicture}
+ \hspace*{-42.5cm}}
+%</logo>
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{生成文件}
+%
+% 以下两个文件用于生成各图案。
+% \DoNotIndex{\FIG,\BG}
+% \begin{macrocode}
+%<*(ex-logo|cover)>
+%<ex-logo>\documentclass{article}
+%<cover>\documentclass{standalone}
+\usepackage{fdulogo}
+%<*ex-logo>
+\usetikzlibrary{backgrounds,external}
+\tikzexternalize[prefix=fudan-]
+\let\FIG=\tikzsetnextfilename
+\def\BG#1{color=white, show background rectangle,
+ background rectangle/.style={#1}}
+%</ex-logo>
+\begin{document}
+% \end{macrocode}
+%
+% 校名。
+% \begin{macrocode}
+%<*ex-logo>
+\FIG{name-black} \fduname
+\FIG{name-blue} \fduname[color=FudanBlue]
+\FIG{name-red} \fduname[color=FudanRed]
+% \end{macrocode}
+%
+% 校徽。
+% \begin{macrocode}
+\FIG{emblem-a-black} \fduemblem
+\FIG{emblem-a-blue} \fduemblem[color=FudanBlue]
+\FIG{emblem-a-red} \fduemblem[color=FudanRed]
+\FIG{emblem-b-black} \fduemblem*
+\FIG{emblem-b-blue} \fduemblem*[color=FudanBlue]
+\FIG{emblem-b-red} \fduemblem*[color=FudanRed]
+% \end{macrocode}
+%
+% 校徽(重修版)。
+% \begin{macrocode}
+\FIG{emblem-new-a-black} \fduemblem+
+\FIG{emblem-new-a-blue} \fduemblem+[color=FudanBlue]
+\FIG{emblem-new-a-red} \fduemblem+[color=FudanRed]
+\FIG{emblem-new-b-black} \fduemblem+*
+\FIG{emblem-new-b-blue} \fduemblem+*[color=FudanBlue]
+\FIG{emblem-new-b-red} \fduemblem+*[color=FudanRed]
+\FIG{emblem-new-a-reversed-black} \fduemblem+[\BG{fill}]
+\FIG{emblem-new-a-reversed-blue} \fduemblem+[\BG{fill=FudanBlue}]
+\FIG{emblem-new-a-reversed-red} \fduemblem+[\BG{fill=FudanRed}]
+\FIG{emblem-new-b-reversed-black} \fduemblem+*[\BG{fill}]
+\FIG{emblem-new-b-reversed-blue} \fduemblem+*[\BG{fill=FudanBlue}]
+\FIG{emblem-new-b-reversed-red} \fduemblem+*[\BG{fill=FudanRed}]
+% \end{macrocode}
+%
+% 校训。
+% \begin{macrocode}
+\FIG{motto} \fdumotto
+\FIG{motto-reversed} \fdumotto[\BG{fill}]
+%</ex-logo>
+% \end{macrocode}
+%
+% \cls{fduthesis} 封面。
+% \begin{macrocode}
+%<*cover>
+\makeatletter
+\fduthesis@cover
+\makeatother
+%</cover>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\end{document}
+%</(ex-logo|cover)>
+% \end{macrocode}
+%
+% \subsubsection{路径}
+%
+% 各图案的路径均使用 Bézier 曲线生成。曲线的具体数据参见源代码,
+% 此处从略。
+%
+% \clearpage
+%
+% \end{implementation}
+%
+% \DisableImplementation
+%
+% \begin{implementation}
+%
+% \paragraph{校名}
+%
+% 复。
+% \begin{macrocode}
+%<*logo>
+\def\fdulogo@name@fu{%
+ ( 86.79426450, 309.23000203)
+ .. controls ( 90.52759774, 306.43000210) and ( 95.27426428, 304.13666883) .. ( 96.80759758, 299.37666895)
+ .. controls (100.07426416, 292.95000244) and (100.74093081, 285.69666929) .. (101.08759747, 278.60333613)
+ .. controls ( 97.58093089, 266.51000310) and ( 89.47426443, 256.63000335) .. ( 83.27426458, 245.87000362)
+ .. controls ( 76.79426475, 235.84333720) and ( 70.78093156, 225.51000413) .. ( 64.22093173, 215.53667104)
+ .. controls ( 62.24759844, 212.88333778) and ( 62.18093178, 209.48333786) .. ( 61.44759846, 206.37667127)
+ .. controls ( 66.44759834, 207.63000457) and ( 71.00759822, 205.08333797) .. ( 75.68759811, 203.80333800)
+ .. controls ( 77.31426473, 200.65667142) and ( 78.78093136, 197.41667150) .. ( 80.55426465, 194.33667157)
+ .. controls ( 80.19426466, 188.60333838) and ( 77.71426472, 183.32333852) .. ( 74.72759813, 178.52333864)
+ .. controls ( 68.70093162, 167.31000558) and ( 62.86093176, 155.99000587) .. ( 56.75426525, 144.81667281)
+ .. controls ( 54.87426529, 140.92333958) and ( 54.19426531, 136.60333968) .. ( 52.91426534, 132.51000645)
+ .. controls ( 54.60759863, 129.12333987) and ( 56.99426524, 126.08333995) .. ( 58.50093187, 122.61667337)
+ .. controls ( 59.66093184, 116.97667351) and ( 61.08759847, 111.27000698) .. ( 60.52759849, 105.45667380)
+ .. controls ( 59.15426519, 78.25667448) and ( 58.22093188, 51.01667516) .. ( 56.68759858, 23.83000917)
+ .. controls ( 54.52759864, 19.44334261) and ( 53.56759866, 12.80334278) .. ( 47.75426547, 12.03000946)
+ .. controls ( 42.10093228, 14.51000940) and ( 39.03426569, 20.09667593) .. ( 37.23426574, 25.71000912)
+ .. controls ( 36.24759909, 37.23000883) and ( 41.36759897, 48.00334190) .. ( 42.15426561, 59.35000828)
+ .. controls ( 43.31426558, 69.33667470) and ( 41.59426563, 79.37667445) .. ( 41.47426563, 89.39000753)
+ .. controls ( 41.72759896, 92.87000744) and ( 39.83426567, 95.81667404) .. ( 38.20759904, 98.71000730)
+ .. controls ( 36.59426575, 98.21667398) and ( 34.98093246, 97.73667399) .. ( 33.35426583, 97.24334067)
+ .. controls ( 28.54093262, 89.83000752) and ( 23.40759941, 82.63000770) .. ( 18.54093287, 75.25667455)
+ .. controls ( 16.62093292, 75.76334120) and ( 14.67426630, 76.15000786) .. ( 12.80759968, 76.81667451)
+ .. controls ( 12.07426636, 78.93667446) and ( 11.02093306, 81.43000773) .. ( 12.54093302, 83.45667435)
+ .. controls ( 20.94093281, 99.43000728) and ( 29.63426593, 115.23000688) .. ( 38.19426571, 131.11000649)
+ .. controls ( 42.94093226, 140.45667292) and ( 48.59426545, 149.36333936) .. ( 52.68759868, 159.00333912)
+ .. controls ( 55.28759862, 168.04333890) and ( 60.40759849, 176.51000535) .. ( 59.79426517, 186.20333844)
+ .. controls ( 54.76759863, 185.93667178) and ( 51.83426537, 181.23000523) .. ( 47.56759881, 179.16333862)
+ .. controls ( 44.71426555, 181.43000523) and ( 41.87426562, 183.71000517) .. ( 39.04759902, 186.01667178)
+ .. controls ( 40.84759898, 191.27000498) and ( 41.78093229, 196.92333818) .. ( 44.86093221, 201.65667139)
+ .. controls ( 52.82093201, 215.04333772) and ( 60.74093181, 228.45667072) .. ( 68.78093161, 241.80333705)
+ .. controls ( 74.71426480, 252.79000345) and ( 83.66093124, 262.99000319) .. ( 83.84759790, 276.12333620)
+ .. controls ( 83.06093126, 284.17666933) and ( 81.95426462, 292.19000246) .. ( 81.08759797, 300.24333559)
+ .. controls ( 82.94093126, 303.27000218) and ( 84.82093121, 306.28333544) .. ( 86.79426450, 309.23000203)
+ (143.71426307, 60.96334157)
+ .. controls (144.87426304, 59.85667494) and (146.06092968, 58.77667496) .. (147.26092965, 57.72334166)
+ .. controls (149.38092960, 57.35000833) and (151.54092954, 57.99000832) .. (153.66092949, 58.11000831)
+ .. controls (154.46092947, 59.65667494) and (155.27426278, 61.20334157) .. (156.08759610, 62.75000820)
+ .. controls (152.87426284, 64.45667482) and (149.39426293, 65.55000813) .. (145.88759635, 66.47000810)
+ .. controls (145.16759637, 64.64334148) and (144.43426306, 62.80334153) .. (143.71426307, 60.96334157)
+ (144.91426304, 141.67000622)
+ .. controls (143.54092974, 139.96333960) and (143.79426307, 137.71000632) .. (143.52759641, 135.67000637)
+ .. controls (146.12759635, 135.72333971) and (148.42092962, 137.09667300) .. (150.07426291, 139.03000629)
+ .. controls (154.63426280, 143.33667285) and (153.22092950, 150.21667268) .. (154.36759614, 155.79000587)
+ .. controls (151.31426288, 151.01667266) and (148.14092963, 146.32333944) .. (144.91426304, 141.67000622)
+ (139.83426317, 253.56333676)
+ .. controls (153.16759617, 263.92333650) and (166.98092916, 273.65666959) .. (180.19426216, 284.17666933)
+ .. controls (184.74092871, 283.19000269) and (188.98092861, 281.07000274) .. (192.24759519, 277.71000282)
+ .. controls (182.23426211, 263.05666986) and (165.90092919, 254.75000340) .. (153.84759615, 242.09667038)
+ .. controls (146.96759633, 233.00333727) and (139.40759651, 224.41667082) .. (132.67426335, 215.21667105)
+ .. controls (126.63426350, 204.79000465) and (121.22093030, 194.00333825) .. (115.50093045, 183.39000518)
+ .. controls (113.88759715, 181.04333857) and (113.86093049, 178.20333864) .. (113.84759715, 175.44333871)
+ .. controls (120.24759699, 184.61667182) and (126.19426351, 194.09667158) .. (132.54093002, 203.31000468)
+ .. controls (140.58092982, 217.01667101) and (152.38092952, 229.56333736) .. (167.99426247, 234.25667058)
+ .. controls (172.19426236, 231.63000397) and (176.00759560, 228.21667073) .. (178.48759554, 223.88333750)
+ .. controls (178.03426222, 208.04333790) and (170.72759573, 193.64333826) .. (166.24759584, 178.71000530)
+ .. controls (159.55426268, 161.00333907) and (159.48759601, 141.69667289) .. (154.91426279, 123.47000668)
+ .. controls (152.00759620, 118.13667348) and (151.20759622, 111.04334032) .. (145.19426304, 108.15000706)
+ .. controls (142.22092978, 112.72334028) and (137.62092989, 115.56334021) .. (132.30093003, 116.57667352)
+ .. controls (129.06093011, 111.89667363) and (125.34093020, 107.51000708) .. (122.47426360, 102.59000720)
+ .. controls (120.10093033, 96.57667402) and (117.70093039, 90.31000751) .. (118.26093038, 83.71000767)
+ .. controls (126.60759683, 88.87000754) and (134.99426329, 93.95000742) .. (143.28759642, 99.20334062)
+ .. controls (149.03426294, 101.97667388) and (155.03426279, 104.23000716) .. (160.84759598, 106.89667376)
+ .. controls (165.36759587, 109.01667371) and (171.96759570, 109.15000704) .. (174.74092896, 104.25667383)
+ .. controls (180.14092883, 99.07000729) and (179.06092886, 91.27000748) .. (179.26092885, 84.47000765)
+ .. controls (176.34092892, 77.25667450) and (172.12759570, 70.45667467) .. (170.91426239, 62.64334153)
+ .. controls (177.99426222, 55.12334172) and (184.76759538, 47.13667525) .. (193.68759516, 41.68334206)
+ .. controls (194.34092847, 38.95000879) and (195.18092845, 36.17667553) .. (194.71426180, 33.32334227)
+ .. controls (192.94092851, 33.12334227) and (191.18092855, 32.92334228) .. (189.42092860, 32.71000895)
+ .. controls (185.27426203, 35.52334221) and (180.14092883, 37.20334217) .. (177.14092890, 41.41667540)
+ .. controls (173.59426233, 46.16334194) and (168.66092912, 49.52334186) .. (163.82092924, 52.81667511)
+ .. controls (161.22092930, 47.79000857) and (157.30092940, 43.59000868) .. (152.34092952, 40.83000874)
+ .. controls (145.87426302, 45.28334197) and (139.71426317, 50.23000851) .. (134.72759663, 56.35000836)
+ .. controls (132.92759668, 59.23000828) and (132.14093003, 62.59000820) .. (130.94093006, 65.73667479)
+ .. controls (132.47426335, 69.56334136) and (134.59426330, 73.12334127) .. (137.24759657, 76.27000786)
+ .. controls (143.88759640, 74.47000790) and (150.47426290, 72.52334129) .. (157.11426274, 70.73667466)
+ .. controls (160.58092932, 73.36334126) and (164.75426255, 75.89667453) .. (166.18092918, 80.25667443)
+ .. controls (168.00759580, 85.73667429) and (170.20759574, 91.05667416) .. (172.34092902, 96.43000735)
+ .. controls (169.06092911, 96.77667401) and (165.74092919, 98.00334065) .. (162.46092927, 97.59000733)
+ .. controls (155.74092944, 94.68334073) and (148.95426294, 91.79000747) .. (142.84759643, 87.72334091)
+ .. controls (137.52759656, 84.17667433) and (131.24759672, 81.96334105) .. (126.76759683, 77.24334117)
+ .. controls (121.84759695, 72.37667462) and (116.75426375, 67.65667474) .. (111.88759720, 62.72334153)
+ .. controls (106.62093067, 55.99000837) and (101.46093080, 49.15000854) .. ( 96.48759759, 42.20334204)
+ .. controls ( 93.54093099, 36.41667552) and ( 90.70093107, 30.57667567) .. ( 87.42093115, 24.96334247)
+ .. controls ( 83.87426457, 26.44334244) and ( 79.19426469, 28.04334240) .. ( 78.46093137, 32.35000896)
+ .. controls ( 80.48759799, 37.96334215) and ( 83.39426458, 43.21667535) .. ( 85.60759786, 48.75000855)
+ .. controls ( 87.51426448, 54.04334175) and ( 92.48759769, 57.36334166) .. ( 95.11426429, 62.25667488)
+ .. controls ( 96.75426425, 65.41667480) and ( 98.54093087, 68.48334139) .. (100.08759750, 71.68334131)
+ .. controls (102.40759744, 76.51000785) and (102.58093077, 82.07000771) .. (105.12759737, 86.80334093)
+ .. controls (109.44759726, 94.08334075) and (113.92759715, 101.27000723) .. (118.08759705, 108.63000705)
+ .. controls (121.11426364, 116.92334018) and (125.23426354, 124.81667331) .. (127.67426347, 133.31000643)
+ .. controls (127.40759681, 142.21667288) and (125.86093019, 151.13667265) .. (127.35426348, 160.04333910)
+ .. controls (126.95426349, 166.37667227) and (130.68759673, 171.60333881) .. (133.59426333, 176.88333868)
+ .. controls (135.03426329, 179.41667195) and (138.31426321, 179.64333861) .. (140.76759648, 180.61667192)
+ .. controls (145.40759636, 173.87000542) and (150.78092956, 167.68333891) .. (155.87426277, 161.28333907)
+ .. controls (154.00759615, 168.75000555) and (157.66092939, 175.69667204) .. (159.02092936, 182.88333853)
+ .. controls (161.96759595, 195.19000489) and (167.38092915, 207.07000459) .. (167.04759582, 219.96333760)
+ .. controls (164.47426255, 219.76333760) and (161.64759596, 220.45667092) .. (159.34092935, 219.03000429)
+ .. controls (154.63426280, 216.43000435) and (149.44759626, 214.25667108) .. (146.07426301, 209.87000452)
+ .. controls (141.96759645, 204.55000465) and (136.86092991, 200.01667143) .. (133.08759667, 194.44333824)
+ .. controls (126.78093016, 180.76333858) and (120.64759698, 166.89667226) .. (117.15426374, 152.17667263)
+ .. controls (111.54093054, 136.29667302) and (108.63426395, 119.43000678) .. (100.72759748, 104.43000715)
+ .. controls ( 99.18093085, 102.67000720) and ( 96.75426425, 101.97667388) .. ( 94.79426430, 100.76334058)
+ .. controls ( 93.07426434, 102.04334055) and ( 91.35426438, 103.32334052) .. ( 89.62093109, 104.59000715)
+ .. controls ( 88.06093113, 110.39000701) and ( 84.32759789, 116.45667352) .. ( 86.74093116, 122.52334004)
+ .. controls ( 92.48759769, 139.11000629) and ( 97.71426422, 155.87000587) .. (103.47426408, 172.44333879)
+ .. controls (111.64759721, 187.41667175) and (119.76759701, 202.41667137) .. (127.88759680, 217.41667100)
+ .. controls (139.84759650, 232.69667061) and (152.04759620, 247.83000357) .. (163.92759590, 263.19000319)
+ .. controls (153.66092949, 255.16333672) and (145.20759637, 245.01667031) .. (135.38092995, 236.47000385)
+ .. controls (130.47426340, 233.84333725) and (124.72759688, 232.63000395) .. (120.52759699, 228.76333738)
+ .. controls (115.07426379, 223.92333750) and (109.78093059, 218.89667096) .. (104.15426406, 214.25667108)
+ .. controls (101.86093079, 217.11000434) and ( 99.04759752, 219.79000427) .. ( 97.95426422, 223.39000418)
+ .. controls ( 96.06093093, 230.88333733) and ( 96.82093091, 239.12333712) .. (100.50093082, 245.96333695)
+ .. controls (104.34093072, 255.28333672) and (108.88759728, 264.28333649) .. (112.63426385, 273.64333626)
+ .. controls (113.75426382, 277.21666950) and (116.74093041, 279.49666944) .. (119.50093035, 281.76333605)
+ .. controls (121.56759696, 280.59000275) and (123.74093024, 279.56333611) .. (125.63426353, 278.11000281)
+ .. controls (128.27426346, 274.76333623) and (129.70093009, 270.69666966) .. (131.18093005, 266.76333643)
+ .. controls (129.26093010, 259.37666995) and (126.90093016, 252.08333680) .. (125.56759686, 244.55000365)
+ .. controls (131.00759672, 246.40333694) and (135.18092995, 250.37667017) .. (139.83426317, 253.56333676)}
+% \end{macrocode}
+%
+% 旦。
+% \begin{macrocode}
+\def\fdulogo@name@dan{%
+ (318.28759204, 86.52334094)
+ .. controls (328.19425846, 87.00334092) and (337.14092490, 91.81667414) .. (346.11425801, 95.59000738)
+ .. controls (351.20759122, 94.93667406) and (356.20759109, 93.69667409) .. (360.83425765, 91.41667415)
+ .. controls (361.59425763, 89.11000754) and (362.34092427, 86.79000760) .. (363.11425759, 84.47000765)
+ .. controls (357.78092439, 79.79000777) and (350.70092457, 78.47000780) .. (344.07425806, 76.67000785)
+ .. controls (343.51425808, 77.64334116) and (342.42092477, 79.59000778) .. (341.87425812, 80.56334108)
+ .. controls (332.26092503, 77.56334116) and (322.44759194, 75.27000788) .. (312.82092551, 72.32334129)
+ .. controls (306.68759233, 70.84334133) and (301.54092579, 66.97667476) .. (296.48759259, 63.39000818)
+ .. controls (292.74092601, 58.63000830) and (291.00759272, 52.12334180) .. (285.50092620, 48.87000854)
+ .. controls (279.98092633, 44.65667532) and (272.30092653, 47.80334190) .. (268.44759329, 52.75000845)
+ .. controls (266.51426000, 56.84334168) and (264.15426006, 60.80334158) .. (262.72759343, 65.11000814)
+ .. controls (262.96759343, 67.80334140) and (263.51426008, 70.45667467) .. (263.96759340, 73.12334127)
+ .. controls (267.08759332, 73.39000793) and (270.23425991, 73.53667459) .. (273.32759317, 74.08334125)
+ .. controls (288.47425945, 77.64334116) and (303.11425909, 83.09667435) .. (318.28759204, 86.52334094)
+ (347.60759131, 212.41667112)
+ .. controls (352.20759119, 214.71000440) and (357.26092440, 212.57667112) .. (362.04759095, 212.12333780)
+ .. controls (363.84759090, 209.92333785) and (365.60759086, 207.69667124) .. (367.28759082, 205.39000463)
+ .. controls (364.44759089, 193.92333825) and (356.31425776, 184.75000515) .. (353.11425784, 173.41667210)
+ .. controls (350.19425791, 164.27000566) and (347.51425798, 155.04333922) .. (344.23425806, 146.01667278)
+ .. controls (342.48759144, 141.53667289) and (342.50092477, 136.68333968) .. (341.74092479, 132.00333980)
+ .. controls (340.55425815, 124.59000665) and (339.36759152, 117.16334017) .. (338.18092488, 109.73667369)
+ .. controls (336.31425826, 108.56334038) and (334.43425831, 107.39000708) .. (332.59425835, 106.17667378)
+ .. controls (329.91425842, 108.37667372) and (326.87425849, 110.39000701) .. (325.35425853, 113.61667359)
+ .. controls (323.51425858, 117.24334017) and (321.70092529, 121.09667340) .. (317.79425872, 122.88334003)
+ .. controls (314.35425881, 120.28334009) and (311.04759222, 117.48334016) .. (307.38092565, 115.20334022)
+ .. controls (303.08759242, 121.15000674) and (307.50092565, 127.88333990) .. (309.52759226, 133.76333975)
+ .. controls (308.32759229, 143.05667286) and (300.79425915, 151.83000597) .. (304.55425905, 161.37667240)
+ .. controls (305.95425902, 164.12333900) and (308.52759229, 166.09667228) .. (310.39425891, 168.52333889)
+ .. controls (313.00759217, 167.01667226) and (315.76759211, 165.71000562) .. (318.16759205, 163.84333900)
+ .. controls (322.47425860, 158.48333914) and (326.20759184, 152.29667262) .. (327.11425849, 145.35000613)
+ .. controls (327.94092513, 140.35000626) and (328.71425845, 135.32333972) .. (329.59425843, 130.32333984)
+ .. controls (330.34092507, 130.55000650) and (331.83425837, 131.00333982) .. (332.59425835, 131.21667315)
+ .. controls (335.83425827, 146.37667277) and (340.43425816, 161.20333907) .. (343.70092474, 176.35000536)
+ .. controls (345.04759137, 181.07000524) and (345.90092469, 185.93667178) .. (347.64759131, 190.53667167)
+ .. controls (350.00759125, 194.93667156) and (353.07425784, 199.07000479) .. (353.80759115, 204.15000466)
+ .. controls (347.32759132, 204.91000464) and (341.32759147, 201.87000472) .. (335.78092494, 198.93667146)
+ .. controls (331.47425838, 196.45667152) and (326.50092517, 195.12333822) .. (322.70092527, 191.79000497)
+ .. controls (315.19425879, 185.56333846) and (307.60759231, 179.45667195) .. (300.19425916, 173.12333877)
+ .. controls (296.47425925, 170.24333884) and (294.80759263, 165.69667229) .. (291.99425937, 162.05667238)
+ .. controls (292.47425935, 156.11000586) and (295.62092594, 150.99000599) .. (297.87425922, 145.64333946)
+ .. controls (299.80759250, 137.37667300) and (302.00759245, 127.76333990) .. (297.06092591, 120.15000676)
+ .. controls (295.79425927, 117.40334016) and (293.94092598, 115.01667356) .. (291.96759270, 112.76334028)
+ .. controls (289.50092610, 118.09667348) and (285.55425953, 123.29667335) .. (286.28759284, 129.49667319)
+ .. controls (286.84759283, 138.20333964) and (284.63425955, 146.71000610) .. (283.44759291, 155.27000588)
+ .. controls (286.83425950, 162.61667237) and (286.67425950, 170.93667216) .. (288.94092611, 178.63000530)
+ .. controls (291.67425937, 180.88333858) and (293.70092599, 183.88333850) .. (296.54092592, 186.00333845)
+ .. controls (306.46092567, 191.56333831) and (316.12759210, 197.56333816) .. (325.99425852, 203.21667135)
+ .. controls (333.27425833, 206.09667128) and (340.30092483, 209.61667119) .. (347.60759131, 212.41667112)}
+% \end{macrocode}
+%
+% 大。
+% \begin{macrocode}
+\def\fdulogo@name@da{%
+ (500.52758749, 206.59000460)
+ .. controls (503.94092073, 220.15000426) and (500.12758750, 234.41667057) .. (504.03425407, 247.92333690)
+ .. controls (511.07425389, 246.55000360) and (517.44758706, 242.07000371) .. (519.55425368, 234.97667056)
+ .. controls (516.83425375, 217.67000432) and (512.24758719, 200.72333808) .. (509.44758726, 183.43000518)
+ .. controls (505.98092068, 167.81667224) and (503.00758742, 152.09667263) .. (499.86092084, 136.41667302)
+ .. controls (505.75425402, 140.20333959) and (512.02092053, 143.41667285) .. (517.80758705, 147.37667275)
+ .. controls (519.20758702, 148.73667271) and (519.98092033, 150.59000600) .. (521.03425364, 152.20333929)
+ .. controls (519.78092034, 156.32333919) and (518.88758703, 160.77667241) .. (522.32758694, 164.09667233)
+ .. controls (528.04758680, 164.07000566) and (533.75425332, 164.08333900) .. (539.46091985, 164.07000566)
+ .. controls (541.24758647, 162.17667238) and (544.28758639, 160.44333909) .. (542.76758643, 157.40333916)
+ .. controls (541.94091978, 149.95000602) and (534.75425330, 146.48333944) .. (529.51425343, 142.35000621)
+ .. controls (520.10092033, 136.29667302) and (510.22092058, 131.00333982) .. (500.80758748, 124.93667331)
+ .. controls (503.71425407, 118.32334014) and (507.70092064, 112.28334029) .. (510.84758723, 105.77667379)
+ .. controls (515.51425378, 95.17667405) and (524.40758689, 87.40334091) .. (531.72758671, 78.67000780)
+ .. controls (538.30091988, 74.05667458) and (544.99425304, 69.55000803) .. (551.88758620, 65.37667480)
+ .. controls (556.27425276, 63.48334151) and (560.44758599, 61.11000824) .. (564.12758590, 58.03000831)
+ .. controls (558.10091938, 53.81667509) and (550.71425290, 52.76334178) .. (543.98091973, 50.16334184)
+ .. controls (539.66091984, 48.55000855) and (534.92758663, 48.35000856) .. (530.38092007, 48.51000855)
+ .. controls (520.74092031, 51.48334181) and (513.10092051, 59.24334162) .. (509.72758726, 68.72334138)
+ .. controls (504.24758739, 85.40334096) and (500.02092083, 102.44334054) .. (494.66092097, 119.16334012)
+ .. controls (491.66092104, 110.84334033) and (488.38092112, 102.61667387) .. (485.64758786, 94.20334074)
+ .. controls (481.35425463, 87.89667423) and (477.18092140, 81.47000773) .. (472.75425485, 75.24334122)
+ .. controls (465.78092169, 65.49667479) and (454.34092197, 59.77667494) .. (442.62092227, 58.23000831)
+ .. controls (439.51425568, 58.68334163) and (436.43425576, 59.39000828) .. (433.48758916, 60.48334159)
+ .. controls (430.78092256, 61.73667489) and (429.92758925, 64.85667481) .. (428.51425595, 67.21667475)
+ .. controls (434.07425581, 68.15000806) and (439.74092234, 68.56334138) .. (445.26092220, 69.84334135)
+ .. controls (455.00758862, 73.60334126) and (464.20758839, 79.99000777) .. (469.18092160, 89.41667420)
+ .. controls (473.36758817, 98.01667398) and (479.90092134, 105.60334046) .. (481.12758797, 115.40334021)
+ .. controls (475.23425479, 113.83000692) and (470.84758823, 109.43000703) .. (466.18092168, 105.79000712)
+ .. controls (460.79425515, 100.05667393) and (457.03425524, 91.63000747) .. (448.46092212, 90.15000751)
+ .. controls (445.51425553, 95.32334072) and (444.71425555, 101.31000723) .. (443.67425557, 107.07000709)
+ .. controls (446.92758883, 106.27000711) and (450.19425541, 105.51000713) .. (453.47425533, 104.79000715)
+ .. controls (462.60758843, 111.72334031) and (470.71425490, 120.11000676) .. (480.90092131, 125.56333996)
+ .. controls (485.82092119, 128.04333990) and (487.58092114, 133.69667309) .. (488.79425445, 138.65667297)
+ .. controls (493.14092100, 161.23000573) and (496.22092093, 184.00333850) .. (500.52758749, 206.59000460)}
+% \end{macrocode}
+%
+% 学。
+% \begin{macrocode}
+\def\fdulogo@name@xue{%
+ (747.62091464, 258.36333664)
+ .. controls (750.15424791, 256.21667003) and (752.74091451, 254.15000341) .. (755.38091445, 252.13667013)
+ .. controls (750.84758123, 243.33667035) and (742.26091478, 238.23000381) .. (734.47424830, 232.65667062)
+ .. controls (736.20758159, 230.40333734) and (737.98091488, 228.19000406) .. (739.79424817, 226.00333745)
+ .. controls (743.27424808, 226.81667076) and (746.76758133, 227.55000408) .. (750.28758124, 228.23000406)
+ .. controls (751.46091455, 225.40333746) and (752.64758118, 222.57667087) .. (753.86091449, 219.76333760)
+ .. controls (750.62091457, 213.24333777) and (748.54091462, 206.27000461) .. (746.78091466, 199.23000478)
+ .. controls (748.22091463, 197.71000482) and (749.67424792, 196.17667153) .. (751.14091455, 194.67000490)
+ .. controls (760.71424765, 211.47000448) and (769.88758075, 228.49667072) .. (779.47424718, 245.29667030)
+ .. controls (773.42091400, 244.24333699) and (767.28758082, 243.89667033) .. (761.19424764, 243.24333702)
+ .. controls (760.47424765, 248.00333690) and (766.58091417, 249.36333686) .. (769.60758076, 251.87000347)
+ .. controls (775.06091396, 251.71000347) and (782.16758045, 254.05667008) .. (786.15424701, 249.12333687)
+ .. controls (787.15424699, 247.96333690) and (788.06091363, 246.71000360) .. (788.99424694, 245.47000363)
+ .. controls (786.26091368, 234.07000391) and (778.42091387, 225.05667081) .. (772.88758068, 214.99000439)
+ .. controls (768.59424745, 208.51000455) and (764.74091421, 201.75000472) .. (760.55424765, 195.21667155)
+ .. controls (758.16758105, 190.29667167) and (756.44758109, 185.07000514) .. (754.07424781, 180.13667193)
+ .. controls (759.44758101, 179.95000527) and (764.83424755, 179.33667195) .. (770.22091408, 179.47000528)
+ .. controls (776.19424726, 180.55000525) and (781.90091379, 182.84333853) .. (787.99424697, 183.31000518)
+ .. controls (792.42091352, 184.25667183) and (796.32758009, 181.16333857) .. (800.31424666, 179.72333861)
+ .. controls (800.47424665, 177.73667199) and (800.64757998, 175.75000537) .. (800.83424665, 173.76333875)
+ .. controls (790.94091356, 167.73667224) and (782.19424711, 159.31000578) .. (770.64758073, 156.49667252)
+ .. controls (756.94091441, 154.17667258) and (743.36758142, 151.12333932) .. (729.70091509, 148.53667272)
+ .. controls (723.98091523, 147.25667275) and (717.72758206, 145.35000613) .. (714.59424880, 139.93667293)
+ .. controls (723.31424858, 140.35000626) and (731.92758170, 145.47000613) .. (740.60758148, 142.33667287)
+ .. controls (742.23424811, 139.56333961) and (743.82091474, 136.75000635) .. (745.38091470, 133.92333975)
+ .. controls (743.54091474, 131.48333981) and (742.03424812, 128.80333988) .. (740.20758149, 126.36333994)
+ .. controls (735.48758161, 121.79000672) and (729.54091509, 118.80334013) .. (723.72758191, 115.85667354)
+ .. controls (728.02091513, 114.00334025) and (732.62091502, 115.64334021) .. (737.06091491, 115.85667354)
+ .. controls (744.58091472, 116.27000686) and (752.03424787, 117.36334016) .. (759.52758101, 118.15000681)
+ .. controls (762.92758093, 116.28334019) and (766.28758084, 114.35000691) .. (769.48758076, 112.13667363)
+ .. controls (770.55424740, 108.49667372) and (771.60758071, 104.85667381) .. (772.66091402, 101.21667390)
+ .. controls (771.22091405, 98.23000731) and (769.11424744, 95.67000737) .. (766.28758084, 93.91000742)
+ .. controls (756.02091443, 97.39000733) and (745.16758137, 96.35000736) .. (734.52758164, 96.37667402)
+ .. controls (729.95424842, 95.96334070) and (725.63424853, 94.23000741) .. (721.18091530, 93.17667410)
+ .. controls (717.24758207, 83.47000768) and (718.54091537, 72.91000794) .. (717.83424872, 62.71000820)
+ .. controls (717.24758207, 53.75000842) and (722.64758193, 43.71000867) .. (716.04758210, 35.91000887)
+ .. controls (712.07424886, 35.36334221) and (708.03424897, 33.52334226) .. (704.04758240, 34.85667556)
+ .. controls (697.94091588, 36.35000886) and (691.66091604, 37.27000883) .. (685.71424952, 39.37667545)
+ .. controls (678.32758304, 44.67000865) and (670.20758324, 49.53667519) .. (665.38091670, 57.52334166)
+ .. controls (673.52758316, 53.41667510) and (681.47424963, 48.71000855) .. (690.28758274, 46.15000861)
+ .. controls (694.52758264, 44.61667532) and (698.95424919, 46.32334194) .. (703.22091575, 46.88334193)
+ .. controls (704.35424906, 49.84334185) and (705.78091569, 52.71000845) .. (706.66091567, 55.76334170)
+ .. controls (707.98091563, 66.84334143) and (706.18091568, 78.27000781) .. (709.15424894, 89.13667420)
+ .. controls (708.72758228, 89.65667419) and (707.86091564, 90.69667416) .. (707.43424898, 91.21667415)
+ .. controls (695.24758262, 90.37667417) and (683.74091624, 85.91000762) .. (673.22091650, 79.89667443)
+ .. controls (667.54091664, 76.23000786) and (660.62091682, 76.04334120) .. (654.28758364, 74.23000791)
+ .. controls (648.38091712, 73.23000793) and (643.48758391, 77.65667449) .. (639.82091734, 81.69667439)
+ .. controls (638.15425071, 84.59000765) and (637.00758407, 87.73667424) .. (635.58091744, 90.75000750)
+ .. controls (641.15425064, 95.83000737) and (649.06091711, 94.83000739) .. (655.91425027, 96.53667402)
+ .. controls (669.07424994, 99.97667393) and (682.16758295, 103.71000717) .. (695.24758262, 107.53667374)
+ .. controls (700.00758250, 109.08334037) and (706.22091568, 108.84334038) .. (709.24758227, 113.48334026)
+ .. controls (713.56758216, 119.85667344) and (721.44758196, 123.11000669) .. (724.18091523, 130.64333983)
+ .. controls (717.19424874, 130.88333983) and (710.54091557, 128.16333989) .. (703.74091574, 127.00333992)
+ .. controls (700.96758248, 129.33667320) and (700.46091582, 132.96333977) .. (699.67424917, 136.28333969)
+ .. controls (702.44758244, 139.24333962) and (705.16758237, 142.28333954) .. (708.15424896, 145.04333947)
+ .. controls (713.63424883, 149.91000602) and (720.66091532, 152.35000596) .. (727.23424849, 155.35000588)
+ .. controls (731.56758171, 157.07000584) and (731.92758170, 162.24333904) .. (732.67424835, 166.16333894)
+ .. controls (723.46091525, 167.77667224) and (714.14091548, 164.72333898) .. (705.96758235, 160.63000575)
+ .. controls (700.03424917, 157.68333916) and (693.82091599, 155.39000588) .. (687.82091614, 152.59000595)
+ .. controls (684.79424955, 153.49667259) and (682.08758295, 155.12333922) .. (679.58091634, 157.03000584)
+ .. controls (680.38091632, 167.76333890) and (682.68758293, 178.51000530) .. (681.42091630, 189.31000503)
+ .. controls (680.79424965, 193.81667159) and (681.86091629, 198.25667148) .. (682.78091626, 202.64333803)
+ .. controls (683.50091625, 202.24333804) and (684.95424954, 201.45667140) .. (685.67424952, 201.05667141)
+ .. controls (687.36758282, 198.41667147) and (689.34091610, 195.97667153) .. (691.35424938, 193.57667159)
+ .. controls (694.04758265, 194.40333824) and (696.83424925, 195.01667156) .. (699.39424918, 196.21667153)
+ .. controls (701.24758247, 198.09667148) and (702.44758244, 200.47000475) .. (704.11424906, 202.49667137)
+ .. controls (709.31424893, 207.03000459) and (715.47424878, 210.37667117) .. (722.04758195, 212.47000445)
+ .. controls (724.15424856, 214.63000440) and (726.15424851, 216.88333768) .. (728.10091513, 219.19000429)
+ .. controls (727.86091514, 220.85667091) and (727.62091514, 222.52333754) .. (727.40758181, 224.19000416)
+ .. controls (723.18091525, 223.24333752) and (719.78091534, 220.56333758) .. (716.82091541, 217.55000433)
+ .. controls (716.16758210, 224.28333749) and (713.46091550, 231.16333732) .. (716.06091543, 237.81667049)
+ .. controls (718.95424869, 236.79000385) and (721.88758195, 235.89667053) .. (724.86091521, 235.07000389)
+ .. controls (732.74091501, 242.52333704) and (743.15424809, 247.96333690) .. (747.62091464, 258.36333664)
+ (696.82091591, 220.16333759)
+ .. controls (700.36758249, 219.00333762) and (703.24758242, 216.63000435) .. (705.64758236, 213.81667109)
+ .. controls (704.32758239, 210.63000450) and (703.11424909, 207.39000458) .. (702.15424911, 204.07000466)
+ .. controls (700.64758248, 203.27000468) and (699.14091585, 202.45667137) .. (697.63424923, 201.64333806)
+ .. controls (696.60758258, 203.37667135) and (695.56758261, 205.08333797) .. (694.55424930, 206.80333793)
+ .. controls (695.31424928, 211.25667115) and (696.06091593, 215.71000437) .. (696.82091591, 220.16333759)
+ (749.11424794, 167.77667224)
+ .. controls (747.63424798, 165.07000564) and (746.10091468, 162.37667237) .. (744.63424805, 159.67000577)
+ .. controls (755.00758112, 160.13667243) and (764.79424755, 163.65667234) .. (774.58091397, 166.85667226)
+ .. controls (778.28758054, 167.81667224) and (780.35424716, 171.29667215) .. (782.99424709, 173.76333875)
+ .. controls (771.44758071, 174.45667207) and (759.56758101, 172.97667211) .. (749.11424794, 167.77667224)
+ (742.71424810, 179.96333860)
+ .. controls (740.74091481, 176.05667203) and (747.15424799, 179.88333860) .. (742.71424810, 179.96333860)
+ (713.83424882, 188.16333839)
+ .. controls (711.34091555, 184.93667181) and (709.32758227, 181.25667190) .. (706.18091568, 178.57667197)
+ .. controls (699.63424918, 177.63000532) and (692.48758269, 178.65667197) .. (687.60758281, 183.47000518)
+ .. controls (687.67424947, 177.49667199) and (687.62091614, 171.52333881) .. (687.64758281, 165.53667229)
+ .. controls (699.67424917, 169.11000554) and (711.88758220, 172.00333880) .. (723.98091523, 175.37667205)
+ .. controls (721.91424862, 176.56333868) and (719.84758200, 177.75000532) .. (717.79424872, 178.93667196)
+ .. controls (718.16758205, 181.56333856) and (718.52758204, 184.19000516) .. (718.88758203, 186.81667176)
+ .. controls (717.19424874, 187.27000508) and (715.51424878, 187.71000507) .. (713.83424882, 188.16333839)
+ (741.00758147, 214.85667106)
+ .. controls (737.16758157, 207.41667125) and (733.72758166, 199.53667144) .. (734.23424831, 190.96333832)
+ .. controls (735.32758162, 190.33667167) and (736.43424826, 189.69667169) .. (737.55424823, 189.07000504)
+ .. controls (738.12758155, 193.45667160) and (738.30091488, 197.91000482) .. (739.31424818, 202.21667138)
+ .. controls (740.48758149, 206.29667127) and (743.34091475, 210.61667117) .. (741.00758147, 214.85667106)
+ (701.99424912, 258.20333664)
+ .. controls (704.94091571, 255.97667003) and (708.68758228, 254.55000340) .. (711.04758222, 251.68333681)
+ .. controls (711.56758221, 247.73667024) and (712.63424885, 242.96333702) .. (709.48758226, 239.81667044)
+ .. controls (703.08758242, 233.87000392) and (696.68758258, 227.91000407) .. (690.47424940, 221.77667089)
+ .. controls (689.72758276, 223.44333751) and (688.99424944, 225.11000414) .. (688.27424946, 226.76333743)
+ .. controls (691.99424937, 232.81667061) and (695.06091596, 239.23000378) .. (698.54091587, 245.41667030)
+ .. controls (700.23424916, 249.49667019) and (700.87424914, 253.93667008) .. (701.99424912, 258.20333664)
+ (654.71425030, 137.15000634)
+ .. controls (658.28758354, 146.24333944) and (659.68758351, 156.59000585) .. (667.11424999, 163.60333901)
+ .. controls (667.80758330, 160.27000576) and (668.83424995, 157.00333917) .. (669.26091660, 153.63000592)
+ .. controls (668.40758329, 150.57667267) and (666.80758333, 147.80333940) .. (665.84758335, 144.79000615)
+ .. controls (665.35425003, 140.60333958) and (665.68758336, 136.36333969) .. (665.72758336, 132.15000646)
+ .. controls (664.06091673, 130.12333985) and (662.02091678, 128.45667322) .. (659.56758351, 127.47000658)
+ .. controls (657.88758355, 130.67000650) and (656.24758359, 133.88333975) .. (654.71425030, 137.15000634)}
+% \end{macrocode}
+%
+% \paragraph{校徽}
+%
+% 核心图案。
+% \begin{macrocode}
+\def\fdulogo@emblem@kernel{%
+ (351.02572456, 574.53945678)
+ .. controls (353.31905783, 587.19278979) and (370.06572408, 593.55278963) .. (380.65239048, 586.95278980)
+ .. controls (386.01239035, 582.31278991) and (389.51905693, 574.99279010) .. (388.22572363, 567.81945694)
+ .. controls (386.66572367, 555.08612393) and (380.57239049, 543.57945755) .. (377.06572391, 531.37945785)
+ .. controls (375.69239061, 525.83279133) and (379.82572384, 521.44612477) .. (382.75905710, 517.29945821)
+ .. controls (419.97238950, 519.71279148) and (457.09238857, 523.61945805) .. (494.39905431, 524.81945802)
+ .. controls (505.81238735, 525.81945799) and (517.31905373, 525.21945801) .. (528.69238678, 524.05945804)
+ .. controls (539.05238652, 523.29945806) and (548.67905295, 513.85945829) .. (547.86571964, 503.17945856)
+ .. controls (547.22571965, 497.11279204) and (542.46571977, 490.89945887) .. (535.86571994, 491.12612553)
+ .. controls (523.49238691, 491.00612553) and (511.29238722, 493.79279213) .. (498.93238753, 494.09945879)
+ .. controls (478.77238803, 495.83279208) and (458.51905520, 495.72612541) .. (438.31905571, 495.01945876)
+ .. controls (427.34572265, 493.97945879) and (416.13238960, 494.20612545) .. (405.57238986, 490.60612554)
+ .. controls (398.26572338, 488.08612560) and (390.46572357, 486.52612564) .. (383.90572374, 482.24612575)
+ .. controls (379.85239050, 479.57945915) and (376.14572393, 475.11279259) .. (376.97239058, 469.93945939)
+ .. controls (378.22572388, 458.71279300) and (386.95905699, 449.31279324) .. (386.15905701, 437.71279353)
+ .. controls (383.69239041, 424.51279386) and (378.01239055, 412.21946083) .. (374.45239064, 399.31279449)
+ .. controls (371.06572406, 387.49946145) and (370.10572408, 375.17946176) .. (368.23905746, 363.07279540)
+ .. controls (367.66572414, 356.96612888) and (366.55905750, 350.91279570) .. (366.34572417, 344.76612919)
+ .. controls (363.49239091, 318.55279651) and (365.89239085, 292.17946383) .. (366.31905751, 265.91279782)
+ .. controls (366.58572417, 249.05946491) and (367.50572415, 232.21946533) .. (369.07905744, 215.44613242)
+ .. controls (369.79905742, 204.24613270) and (372.17239070, 193.21946631) .. (372.89239068, 182.01946659)
+ .. controls (372.62572402, 175.80613341) and (371.38572405, 167.51280028) .. (364.62572422, 165.19280034)
+ .. controls (358.59905770, 163.63280038) and (350.94572456, 163.64613371) .. (346.71905800, 168.96613358)
+ .. controls (338.13239155, 178.77946667) and (337.71905822, 192.48613299) .. (335.77239161, 204.72613269)
+ .. controls (331.25239172, 230.40613205) and (330.90572506, 256.55279806) .. (331.15905839, 282.55279741)
+ .. controls (288.67905945, 280.91279745) and (245.66572719, 283.05946406) .. (203.82572824, 274.09946429)
+ .. controls (200.02572833, 273.43279764) and (195.38572845, 270.87279770) .. (192.34572852, 274.64613094)
+ .. controls (185.49239536, 281.73946410) and (184.87906204, 292.20613050) .. (182.30572878, 301.25946361)
+ .. controls (185.73239536, 303.24613022) and (188.99906194, 305.72613016) .. (192.98572851, 306.45946348)
+ .. controls (217.54572789, 311.79279668) and (242.75906060, 313.05946331) .. (267.81239330, 313.27279664)
+ .. controls (289.33239277, 313.92612996) and (310.87905889, 315.92612991) .. (332.42572502, 314.57946327)
+ .. controls (332.63905835, 354.81946227) and (336.22572493, 396.36612790) .. (353.90572449, 433.12612698)
+ .. controls (355.45239111, 435.01946026) and (353.79905782, 436.64612689) .. (352.65239118, 438.15279352)
+ .. controls (344.61239138, 431.49946035) and (339.75905817, 422.07279392) .. (335.77239161, 412.61946082)
+ .. controls (331.29239172, 401.53946110) and (322.95905859, 391.68612801) .. (322.25239194, 379.32612832)
+ .. controls (320.61239198, 363.93946204) and (319.06572536, 347.01946246) .. (308.14572563, 335.00612943)
+ .. controls (294.86572596, 321.71279643) and (275.35905978, 317.88612986) .. (257.25239357, 317.31279654)
+ .. controls (244.57239389, 317.01946321) and (231.38572755, 315.24612992) .. (219.17239452, 319.59279648)
+ .. controls (199.06572836, 326.67279631) and (183.39906208, 345.41946250) .. (180.62572882, 366.63279531)
+ .. controls (176.82572891, 393.49946130) and (177.69239556, 421.24612727) .. (185.07906204, 447.43279329)
+ .. controls (187.31906198, 454.19279312) and (188.82572861, 462.31279291) .. (195.33239512, 466.37945948)
+ .. controls (225.99906102, 487.49945895) and (267.79905997, 488.05945894) .. (300.91905914, 472.39279266)
+ .. controls (312.34572552, 465.79279283) and (313.77239216, 451.15279319) .. (315.38572545, 439.37946015)
+ .. controls (318.67905870, 442.36612675) and (320.02572533, 446.68612664) .. (322.13239195, 450.47279321)
+ .. controls (330.99905839, 465.63279283) and (344.74572471, 477.15279254) .. (354.63905780, 491.48612552)
+ .. controls (353.30572450, 493.36612547) and (350.90572456, 494.19279212) .. (349.06572461, 495.49945875)
+ .. controls (339.71905817, 486.91279230) and (328.70572512, 479.15279249) .. (315.81239210, 477.43279254)
+ .. controls (308.29239229, 476.05945924) and (300.81239248, 482.25945908) .. (300.05239250, 489.71279223)
+ .. controls (300.29239249, 493.88612546) and (303.38572575, 496.91279205) .. (305.75905902, 500.05945864)
+ .. controls (316.66572542, 513.49945830) and (329.54572509, 525.39279134) .. (338.87905819, 540.08612430)
+ .. controls (345.31905803, 550.57945737) and (348.10572463, 562.72612374) .. (351.02572456, 574.53945678)
+ (211.99906137, 380.15279497)
+ .. controls (213.41239466, 369.35279524) and (216.90572791, 357.49946220) .. (226.42572767, 351.12612903)
+ .. controls (238.31906071, 346.09946249) and (251.69239371, 345.40612917) .. (264.37239339, 347.04612913)
+ .. controls (269.66572659, 347.21946246) and (275.17239312, 348.29946243) .. (279.49239301, 351.53946235)
+ .. controls (289.10572611, 358.76612884) and (292.73239268, 371.93946184) .. (290.85239273, 383.45946155)
+ .. controls (264.70572672, 389.28612807) and (238.03906072, 383.60612822) .. (211.99906137, 380.15279497)
+ (220.85239448, 442.37946008)
+ .. controls (211.53239471, 434.35279361) and (209.46572810, 421.25946061) .. (209.38572810, 409.60612757)
+ .. controls (235.99906077, 409.13946091) and (262.61239343, 411.53946085) .. (289.21239277, 412.67279416)
+ .. controls (289.95905942, 420.89946062) and (289.99905942, 429.51279373) .. (286.93239283, 437.32612687)
+ .. controls (284.69239288, 443.07279340) and (279.74572634, 448.15279327) .. (273.42572650, 449.03279325)
+ .. controls (266.31906001, 450.25945988) and (259.06572686, 450.32612655) .. (251.90572704, 451.01945986)
+ .. controls (241.14572730, 450.67279321) and (229.57239426, 449.28612657) .. (220.85239448, 442.37946008)
+ (450.54572207, 484.52612569)
+ .. controls (463.87905507, 485.19279234) and (477.23905474, 484.59279236) .. (490.58572107, 484.91279235)
+ .. controls (506.99905399, 486.12612565) and (524.78572021, 485.08612568) .. (538.90571986, 475.72612591)
+ .. controls (546.77238633, 470.17945938) and (548.85238628, 459.53945965) .. (547.14571965, 450.56612654)
+ .. controls (546.15905301, 446.07279332) and (545.11905304, 440.93946012) .. (541.03905314, 438.16612685)
+ .. controls (528.78572011, 428.23279377) and (512.14572053, 427.39279379) .. (497.05238757, 427.35279379)
+ .. controls (466.02572168, 428.56612709) and (434.85238913, 425.24612717) .. (403.91905657, 428.87279375)
+ .. controls (397.62572339, 429.84612706) and (392.70572352, 435.05946026) .. (390.78572356, 440.95279345)
+ .. controls (388.53239029, 447.27279329) and (388.27905696, 454.15279312) .. (388.61239028, 460.79279295)
+ .. controls (390.07905691, 469.07279275) and (397.18572340, 474.97945926) .. (404.33238989, 478.60612584)
+ .. controls (418.87905619, 485.12612568) and (435.21238912, 482.07279242) .. (450.54572207, 484.52612569)
+ (415.59905628, 458.27279302)
+ .. controls (412.73238968, 456.53945973) and (413.49238966, 452.84612648) .. (413.25238967, 450.03279322)
+ .. controls (414.81238963, 448.92612658) and (416.33238959, 447.43279329) .. (418.39905621, 447.41945995)
+ .. controls (447.37238882, 446.75279330) and (476.33238809, 448.08612660) .. (505.29238737, 448.96612658)
+ .. controls (510.42572057, 449.33945991) and (515.23905379, 451.27279319) .. (520.01238700, 453.05945981)
+ .. controls (519.62572034, 456.45945973) and (518.38572037, 459.73945965) .. (515.66572044, 461.93945959)
+ .. controls (487.70572114, 462.57945957) and (459.71905517, 462.08612625) .. (431.78572254, 460.81945962)
+ .. controls (426.35905601, 460.52612629) and (420.41238949, 461.31279294) .. (415.59905628, 458.27279302)
+ (434.01238915,419.45946065)
+ .. controls (450.58572207, 421.12612728) and (467.27905498, 420.31279396) .. (483.87905457, 421.35279394)
+ .. controls (500.83905415, 422.59279391) and (517.85238705, 420.91279395) .. (534.57238664, 418.08612735)
+ .. controls (542.10571978, 417.03279405) and (547.46571965, 410.41946088) .. (549.71905292, 403.55279438)
+ .. controls (552.38571952, 395.33946126) and (553.19905284, 385.84612816) .. (548.91905294, 378.03279502)
+ .. controls (544.65238638, 370.49946188) and (536.97238658, 364.72612869) .. (528.23905346, 363.79279538)
+ .. controls (491.77238771, 359.75279548) and (454.99905529, 362.17946208) .. (418.42572287, 360.08612880)
+ .. controls (411.46572305, 358.71279550) and (403.94572323, 360.21946213) .. (398.41239004, 364.75279535)
+ .. controls (389.18572360, 372.11279517) and (385.21239037, 385.13946151) .. (388.13239030, 396.48612789)
+ .. controls (389.59905693, 400.72612779) and (392.98572351, 403.88612771) .. (395.93239010, 407.13946096)
+ .. controls (400.77238998, 412.32612750) and (407.02572316, 416.53946073) .. (414.21238964, 417.44612737)
+ .. controls (420.79905615, 418.16612735) and (427.35905598, 419.32612732) .. (434.01238915, 419.45946065)
+ (434.35905581, 393.23279464)
+ .. controls (427.49238931, 392.47279466) and (420.30572283, 393.41946130) .. (413.71905632, 390.99279470)
+ .. controls (413.31905633, 390.03279472) and (412.51905635, 388.11279477) .. (412.13238970, 387.15279479)
+ .. controls (413.11905634, 385.65946150) and (413.75905632, 383.40612822) .. (415.87905627, 383.20612823)
+ .. controls (424.22572273, 380.80612829) and (432.86572251, 383.40612822) .. (441.34572230, 383.33946156)
+ .. controls (465.45238836, 385.19279484) and (489.63905443, 385.57946150) .. (513.75905382, 387.15279479)
+ .. controls (517.51905373, 387.05946146) and (519.97238700, 390.40612805) .. (521.50572030, 393.41946130)
+ .. controls (509.73238726, 396.53946123) and (497.45238756, 395.43279459) .. (485.46572120, 394.75279460)
+ .. controls (468.42572162, 394.47279461) and (451.41238871, 393.20612798) .. (434.35905581, 393.23279464)
+ (409.93238975, 351.67279568)
+ .. controls (434.37238914, 354.71279560) and (459.05238852, 354.63279561) .. (483.62572124, 355.91279557)
+ .. controls (485.82572119, 350.48612904) and (483.75905457, 344.68612919) .. (479.95905467, 340.59279596)
+ .. controls (476.77238808, 336.71279605) and (472.75905485, 333.45946280) .. (470.66572157, 328.76612959)
+ .. controls (481.29238797, 329.64612956) and (491.83905437, 331.35279619) .. (502.50572077, 331.65946285)
+ .. controls (510.19905391, 333.91279612) and (513.45238716, 342.01946259) .. (519.03905369, 346.97946246)
+ .. controls (523.06572026, 349.80612906) and (527.89238680, 353.35279564) .. (533.07905334, 351.55279568)
+ .. controls (540.77238648, 348.75279575) and (544.71905305, 339.03279600) .. (542.39905311, 331.43279619)
+ .. controls (536.53238659, 309.72613006) and (530.59905340, 287.99279727) .. (522.91905359, 266.85946447)
+ .. controls (511.78572054, 262.21946458) and (499.50572085, 266.01946449) .. (487.89238780, 265.24613117)
+ .. controls (483.34572125, 264.73946452) and (478.39905471, 265.49946450) .. (474.30572148, 263.07279790)
+ .. controls (474.23905481, 261.36613127) and (474.34572147, 259.65946465) .. (474.65238813, 257.96613136)
+ .. controls (478.51905470, 242.35279841) and (481.25238797, 226.47279881) .. (485.98572118, 211.08613253)
+ .. controls (487.06572116, 204.00613271) and (487.67905447, 196.05946624) .. (484.25238789, 189.51279973)
+ .. controls (476.31905476, 184.71279985) and (465.85238835, 189.35279974) .. (460.89238848, 196.41946623)
+ .. controls (451.43905538, 210.80613254) and (446.58572217, 227.61946545) .. (443.34572225, 244.36613170)
+ .. controls (442.22572228, 249.07279825) and (441.66572229, 254.07279812) .. (438.85238903, 258.15279802)
+ .. controls (419.99905617, 259.47279799) and (405.93238985, 243.37946505) .. (387.73239031, 241.71279843)
+ .. controls (379.39905718, 242.19279842) and (375.17239062, 251.88613151) .. (376.69239058, 259.24613132)
+ .. controls (377.26572390, 264.15279787) and (381.23905714, 267.63279778) .. (385.10572371, 270.17946438)
+ .. controls (391.30572355, 273.80613096) and (398.41239004, 275.27279759) .. (405.15905654, 277.51279753)
+ .. controls (415.71905627, 280.60613079) and (426.22572268, 284.92613068) .. (437.39905573, 284.68613069)
+ .. controls (437.42572240, 291.23279719) and (437.54572239, 297.80613036) .. (436.70572242, 304.32613020)
+ .. controls (418.06572288, 303.93946354) and (402.18572328, 292.19279717) .. (383.91905707, 289.95279722)
+ .. controls (379.93239050, 289.39279724) and (376.61239058, 292.69946382) .. (375.42572395, 296.21946373)
+ .. controls (373.71905732, 301.08613028) and (374.13239065, 306.87279680) .. (376.93239058, 311.27279669)
+ .. controls (384.66572372, 317.89946319) and (395.17239012, 320.05946314) .. (405.07905654, 320.76612979)
+ .. controls (417.17238957, 322.07279642) and (429.94572258, 321.69946310) .. (441.02572231, 327.49946295)
+ .. controls (440.74572231, 329.12612958) and (440.49238899, 330.76612954) .. (440.25238899, 332.37946283)
+ .. controls (429.37238927, 333.83279613) and (417.82572289, 328.43279626) .. (407.47905648, 333.69946280)
+ .. controls (400.06572333, 337.24612937) and (401.46572330, 350.71279570) .. (409.93238975, 351.67279568)
+ (470.38572157, 306.49946348)
+ .. controls (470.22572158, 300.08613030) and (470.13238825, 293.64613046) .. (470.43905491, 287.23279729)
+ .. controls (479.91905467, 288.63279726) and (489.97238775, 287.17946396) .. (499.06572086, 290.41946388)
+ .. controls (502.74572076, 295.76613041) and (502.45238744, 302.59279691) .. (502.78572076, 308.79279675)
+ .. controls (491.93238770, 310.05946339) and (481.17238797, 307.24613012) .. (470.38572157, 306.49946348)}
+% \end{macrocode}
+%
+% 文字“FUDAN UNIVERSITY”。
+% \begin{macrocode}
+\def\fdulogo@emblem@F{%
+ ( 85.70573119, 304.00613021)
+ .. controls ( 90.07906441, 311.59279668) and (100.06573083, 314.24612995) .. (108.09239730, 311.64613001)
+ .. controls (103.82573074, 301.69946360) and (107.82573064, 290.84613053) .. (112.17239720, 281.68613076)
+ .. controls (119.41239701, 280.19279747) and (126.06573018, 284.45946403) .. (132.95906334, 285.88613066)
+ .. controls (137.94572988, 286.45946398) and (139.27906318, 291.77946384) .. (141.21239647, 295.53946375)
+ .. controls (142.14572978, 295.53946375) and (144.01239640, 295.52613042) .. (144.94572971, 295.52613042)
+ .. controls (148.49239629, 287.19279729) and (154.53239614, 279.35279749) .. (153.91906282, 269.83279773)
+ .. controls (149.89239625, 270.88613103) and (145.59906303, 272.07279767) .. (141.47906313, 270.85946437)
+ .. controls (125.89239685, 265.43279784) and (110.17239725, 260.40613130) .. ( 94.46573097, 255.35279809)
+ .. controls ( 89.01239777, 253.68613146) and ( 84.71906455, 249.71279823) .. ( 80.70573132, 245.81946499)
+ .. controls ( 73.74573149, 252.05946484) and ( 70.87906489, 261.25946461) .. ( 68.05239830, 269.87279773)
+ .. controls ( 64.50573172, 280.96613078) and ( 57.47906523, 291.33946386) .. ( 58.22573188, 303.44613022)
+ .. controls ( 62.19906511, 305.32613017) and ( 65.98573168, 307.81946344) .. ( 70.30573158, 308.83279675)
+ .. controls ( 74.57239814, 304.05946354) and ( 71.82573154, 297.28613037) .. ( 71.27906488, 291.71279718)
+ .. controls ( 72.87906484, 283.55279738) and ( 77.30573140, 276.27279757) .. ( 80.70573132, 268.76613109)
+ .. controls ( 88.21239779, 270.85946437) and ( 96.07906426, 272.48613099) .. (102.67906410, 276.83279755)
+ .. controls (102.70573077, 283.04613073) and ( 99.11906419, 288.36613060) .. ( 97.53239756, 294.19279712)
+ .. controls ( 95.97239760, 299.61946365) and ( 90.13239775, 301.51279693) .. ( 85.70573119, 304.00613021)}
+\def\fdulogo@emblem@U@i{%
+ ( 50.99906539, 392.96612798)
+ .. controls ( 54.67906530, 390.99279470) and ( 58.05239855, 387.84612811) .. ( 62.49239844, 387.95279477)
+ .. controls ( 76.31906476, 388.51279476) and ( 90.14573108, 389.13946141) .. (103.97239740, 389.69946140)
+ .. controls (110.18573058, 389.12612808) and (117.35906373, 390.09946139) .. (122.42573027, 385.65946150)
+ .. controls (129.65239676, 379.60612832) and (131.54573004, 369.59279523) .. (131.63906338, 360.61946212)
+ .. controls (131.19906339, 353.85946229) and (131.29239672, 346.59279581) .. (127.78573014, 340.53946263)
+ .. controls (126.01239685, 337.35279604) and (122.75906360, 335.13946276) .. (119.15906369, 334.52612944)
+ .. controls (101.30573080, 331.45946285) and ( 83.07906459, 332.15279617) .. ( 65.17239837, 329.57946290)
+ .. controls ( 61.19906514, 328.36612960) and ( 57.73239856, 324.13946304) .. ( 53.25239867, 325.91279632)
+ .. controls ( 51.42573205, 332.44612949) and ( 51.81239870, 339.35279599) .. ( 53.03906534, 345.95279582)
+ .. controls ( 74.42573147, 345.69946250) and ( 95.83906427, 346.47279581) .. (117.07906374, 348.97946241)
+ .. controls (119.71906367, 350.11279572) and (120.93239698, 353.23279564) .. (121.71906362, 355.83279558)
+ .. controls (123.27906358, 362.08612875) and (121.62573029, 368.72612859) .. (119.06573036, 374.47279511)
+ .. controls (117.10573041, 378.72612834) and (111.81239720, 378.75279500) .. (107.82573064, 378.64612834)
+ .. controls ( 92.15906436, 378.25946168) and ( 76.47906475, 377.84612836) .. ( 60.86573181, 376.51279506)
+ .. controls ( 58.59906520, 373.07279515) and ( 56.30573193, 366.75279530) .. ( 51.03906539, 368.65946192)
+ .. controls ( 50.62573207, 369.13946191) and ( 49.82573209, 370.11279522) .. ( 49.41239876, 370.59279521)
+ .. controls ( 47.93239880, 378.00612836) and ( 46.78573216, 386.17946148) .. ( 50.99906539, 392.96612798)}
+\def\fdulogo@emblem@D{%
+ (64.02573173, 473.6194593)
+ .. controls ( 78.02573138, 477.27279254) and ( 92.67906435, 474.61945927) .. (106.45239734, 471.21945936)
+ .. controls (111.21239722, 469.93945939) and (116.33239709, 469.28612607) .. (120.49239699, 466.43279281)
+ .. controls (127.27906348, 462.27279292) and (131.21239672, 454.53945978) .. (132.19906336, 446.80612664)
+ .. controls (133.41239666, 440.40612680) and (130.65239673, 434.23279362) .. (129.90573009, 427.96612711)
+ .. controls (128.55906345, 418.87279400) and (127.78573014, 408.80612759) .. (121.33239697, 401.63279443)
+ .. controls (114.69239713, 407.53946095) and (105.42573070, 407.83279428) .. ( 97.10573091, 409.17946091)
+ .. controls ( 80.67906465, 411.91279417) and ( 63.93239840, 417.91279402) .. ( 47.22573215, 413.43279414)
+ .. controls ( 48.17239880, 428.72612709) and ( 50.41239874, 443.89946004) .. ( 52.57239869, 459.05945966)
+ .. controls ( 53.59906533, 465.39279284) and ( 57.58573189, 471.75279268) .. ( 64.02573173, 473.61945930)
+ ( 67.21239832, 459.93945964)
+ .. controls ( 60.79906515, 452.17945983) and ( 60.07906516, 441.68612676) .. ( 58.89239853, 432.11279367)
+ .. controls ( 78.57239804, 427.71279378) and ( 98.43906421, 424.23279387) .. (118.22573038, 420.35279396)
+ .. controls (119.94573033, 426.56612714) and (122.21239694, 432.80612699) .. (122.02573028, 439.35279349)
+ .. controls (121.94573028, 443.07279340) and (121.23906364, 447.20612663) .. (118.14573038, 449.64612656)
+ .. controls (107.43906398, 459.37945965) and ( 92.27906436, 460.72612629) .. ( 78.53239804, 462.00612626)
+ .. controls ( 74.75906480, 461.88612626) and ( 69.99906492, 463.28612622) .. ( 67.21239832, 459.93945964)}
+\def\fdulogo@emblem@A{%
+ (107.38573065, 530.41945788)
+ .. controls (111.05239722, 526.09945799) and (114.81239713, 521.85945809) .. (118.71906370, 517.76612486)
+ .. controls (120.58573032, 520.44612479) and (122.43906361, 523.13945806) .. (124.26573023, 525.84612466)
+ .. controls (118.67906370, 527.49945795) and (113.02573051, 528.93945792) .. (107.38573065, 530.41945788)
+ ( 89.70573109, 544.55279086)
+ .. controls ( 91.74573104, 545.16612418) and ( 93.89239765, 544.69945752) .. ( 95.93239760, 544.41945753)
+ .. controls (115.55906378, 540.88612428) and (134.86572996, 535.79279108) .. (154.51906280, 532.49945783)
+ .. controls (160.10572933, 531.44612452) and (167.25239582, 533.00612448) .. (170.87906239, 527.48612462)
+ .. controls (168.58572912, 523.08612473) and (165.61239586, 519.11279149) .. (162.43906261, 515.32612492)
+ .. controls (157.33239607, 519.85945814) and (150.53239624, 521.39279144) .. (144.02572973, 522.69945807)
+ .. controls (139.35906318, 516.29945823) and (134.78572996, 509.81945839) .. (130.29239674, 503.28612522)
+ .. controls (132.79906335, 500.36612530) and (135.02572996, 497.21945871) .. (137.59906323, 494.33945878)
+ .. controls (140.86572981, 490.48612554) and (146.43906301, 490.76612554) .. (150.51906290, 488.17945893)
+ .. controls (145.53239636, 481.44612577) and (143.07906309, 472.28612600) .. (135.02572996, 468.32612610)
+ .. controls (120.83906365, 493.68612546) and (101.47906413, 515.53945825) .. ( 85.14573120, 539.44612432)
+ .. controls ( 86.58573117, 541.20612428) and ( 87.99906447, 543.03279090) .. ( 89.70573109, 544.55279086)}
+\def\fdulogo@emblem@N@i{%
+ (153.31906283, 624.63278886)
+ .. controls (156.06572943, 630.35278871) and (161.94572928, 633.68612196) .. (167.59906248, 635.97945524)
+ .. controls (179.55906218, 618.63278901) and (194.97239513, 604.12612270) .. (208.77239478, 588.31278976)
+ .. controls (212.86572801, 584.17945653) and (219.05239452, 578.93945667) .. (215.43906128, 572.49945683)
+ .. controls (210.57239474, 572.80612349) and (206.01239485, 574.61945677) .. (201.35906163, 575.87279008)
+ .. controls (183.07906209, 581.17945661) and (165.26572920, 588.16612310) .. (146.61239633, 592.09945634)
+ .. controls (156.63906275, 580.55278996) and (168.83906245, 571.23279019) .. (179.42572885, 560.24612380)
+ .. controls (183.30572875, 555.93945724) and (189.82572859, 557.67279053) .. (194.91906179, 556.27279057)
+ .. controls (192.39906186, 547.75279078) and (184.19906206, 542.28612425) .. (177.15906224, 537.52612437)
+ .. controls (172.38572902, 539.67279098) and (172.66572902, 546.39279081) .. (168.70572912, 549.51279073)
+ .. controls (157.05239607, 560.07279047) and (146.07906301, 571.32612352) .. (134.61239663, 582.08612325)
+ .. controls (131.57239671, 585.24612317) and (126.90573016, 585.17945651) .. (122.93239693, 586.12612315)
+ -- (119.852397, 589.08612308)
+ .. controls (124.66573022, 596.48612289) and (131.69239671, 601.99278942) .. (137.39906323, 608.63278926)
+ .. controls (154.65239613, 603.63278938) and (171.90572904, 598.63278951) .. (189.26572860, 594.00612296)
+ .. controls (183.41239541, 601.83278943) and (175.70572894, 608.04612260) .. (169.03906244, 615.16612243)
+ .. controls (165.26572920, 619.17945566) and (159.41239601, 617.56612237) .. (154.55906280, 618.04612235)
+ .. controls (152.37239619, 619.28612232) and (152.86572951, 622.55278891) .. (153.31906283, 624.63278886)}
+\def\fdulogo@emblem@U@ii{%
+ (258.77239353, 689.04612058)
+ .. controls (263.03906009, 694.20612045) and (270.21239324, 695.88612041) .. (276.62572642, 694.88612043)
+ .. controls (276.59905975, 690.75278720) and (275.33239312, 686.48612064) .. (276.51905975, 682.41945408)
+ .. controls (282.11905961, 665.88612116) and (289.74572609, 649.93945489) .. (293.02572601, 632.69945532)
+ .. controls (294.21239264, 626.47278881) and (291.66572604, 619.00612233) .. (285.58572619, 616.32612240)
+ .. controls (278.66572637, 613.15278914) and (271.43905988, 610.23278922) .. (263.81239340, 609.36612257)
+ .. controls (254.57239364, 608.23278927) and (245.35906053, 614.29945578) .. (241.86572729, 622.75278890)
+ .. controls (236.78572741, 634.63278861) and (232.09239420, 646.68612164) .. (227.06572766, 658.57945467)
+ .. controls (224.87906104, 664.13945454) and (217.69239456, 665.99278782) .. (216.43906126, 672.12612100)
+ .. controls (224.42572772, 675.79278758) and (232.47906085, 680.09945414) .. (241.53239396, 680.01945414)
+ .. controls (240.37239399, 674.65945427) and (235.95906077, 669.33945441) .. (238.66572737, 663.75278788)
+ .. controls (244.29239389, 650.99278820) and (248.97239378, 637.77945519) .. (255.50572695, 625.41945550)
+ .. controls (257.49239356, 621.37945560) and (262.10572678, 619.03278900) .. (266.54572667, 619.45945565)
+ .. controls (273.71905982, 620.08612230) and (280.29239299, 623.95278887) .. (285.22572620, 629.05945541)
+ .. controls (285.79905952, 636.09945524) and (282.41239294, 642.45945508) .. (280.02572633, 648.84612158)
+ .. controls (275.86572644, 658.92612133) and (272.35905986, 669.28612107) .. (267.86572664, 679.23278749)
+ .. controls (266.06572668, 683.59278738) and (260.81239348, 684.91278735) .. (258.77239353, 689.04612058)}
+\def\fdulogo@emblem@N@ii{%
+ (345.57239136, 707.99278677)
+ .. controls (351.03905789, 715.44611992) and (361.02572431, 712.24612000) .. (368.81239078, 712.56611999)
+ .. controls (367.34572415, 708.07278677) and (363.99905757, 704.12612020) .. (363.83905757, 699.28612032)
+ .. controls (365.07905754, 679.73945415) and (367.55905748, 660.25945463) .. (368.05239080, 640.65945512)
+ .. controls (368.63905745, 636.84612188) and (362.54572427, 633.19278864) .. (360.34572432, 637.16612188)
+ .. controls (349.19905794, 652.40612150) and (338.90572486, 668.24612110) .. (328.15905846, 683.76612071)
+ .. controls (326.07905851, 686.48612064) and (324.19905856, 690.83278720) .. (320.06572533, 690.09945389)
+ .. controls (319.41239201, 685.96612066) and (319.43905868, 681.75278743) .. (320.21239199, 677.63278753)
+ .. controls (322.09239195, 666.87278780) and (322.53239194, 655.93945474) .. (324.17239190, 645.15278834)
+ .. controls (325.58572519, 640.72612179) and (329.97239175, 638.20612185) .. (332.14572503, 634.19278862)
+ .. controls (326.27905851, 628.95278875) and (317.94572538, 628.97945541) .. (310.55905890, 628.49945543)
+ .. controls (305.85239235, 632.85945532) and (311.27905888, 638.31278851) .. (311.17239222, 643.37945505)
+ .. controls (310.53239224, 656.73945472) and (307.94572563, 669.89945439) .. (306.62572567, 683.19278739)
+ .. controls (306.25239234, 686.61945397) and (306.75905900, 690.33945388) .. (304.94572571, 693.44612047)
+ .. controls (302.85239243, 697.00612038) and (300.17239250, 700.25945363) .. (298.98572586, 704.29945353)
+ .. controls (306.07905901, 706.59278681) and (314.30572548, 709.81945339) .. (321.50572530, 706.32612015)
+ .. controls (335.55905828, 694.53945378) and (342.13239145, 675.93945424) .. (356.90572441, 664.89945452)
+ .. controls (356.95905774, 675.96612091) and (354.50572447, 686.87278730) .. (354.14572448, 697.93945369)
+ .. controls (353.74572449, 702.85945357) and (348.65239128, 704.89945352) .. (345.57239136, 707.99278677)}
+\def\fdulogo@emblem@I@i{%
+ (393.63905683, 711.84612001)
+ .. controls (401.78572329, 713.56611997) and (410.42572307, 711.12612003) .. (418.22572288, 708.49945343)
+ .. controls (419.49238951, 706.96612013) and (420.79905615, 704.49945353) .. (418.99905619, 702.80612024)
+ .. controls (417.34572290, 700.15278697) and (413.27905633, 699.49945365) .. (412.61238968, 696.23278707)
+ .. controls (410.30572308, 680.88612078) and (409.26572310, 665.35278784) .. (406.74572316, 650.01945489)
+ .. controls (407.15905649, 644.20612170) and (412.57238969, 639.67278848) .. (411.42572305, 633.57945530)
+ .. controls (402.90572326, 634.09945529) and (393.87905682, 633.55278863) .. (385.95905702, 637.24612187)
+ .. controls (382.23905711, 642.79278840) and (392.01239020, 645.07278835) .. (392.18572353, 650.45945488)
+ .. controls (394.46572347, 666.68612114) and (395.21239012, 683.08612073) .. (397.15905674, 699.33945366)
+ .. controls (396.67905675, 703.57945355) and (388.99905694, 707.79278678) .. (393.63905683, 711.84612001)}
+\def\fdulogo@emblem@V{%
+ (441.78572229, 703.56612022)
+ .. controls (448.49238879, 702.35278691) and (455.27905528, 701.24612027) .. (461.71905512, 698.95278700)
+ .. controls (463.45238841, 698.27278702) and (465.39905503, 697.71278703) .. (466.45238834, 696.01945374)
+ .. controls (466.90572166, 691.77945384) and (462.97238843, 688.87278725) .. (461.18572180, 685.39278734)
+ .. controls (460.79905515, 673.55278763) and (460.79905515, 661.69945460) .. (461.15905514, 649.85945489)
+ .. controls (460.83905515, 646.92612163) and (463.10572176, 644.73945502) .. (464.71905505, 642.59278841)
+ .. controls (473.78572149, 651.93945484) and (480.62572132, 663.12612123) .. (488.50572112, 673.44612097)
+ .. controls (491.79905437, 677.59278753) and (488.85238778, 683.29945406) .. (491.63905438, 687.63278728)
+ .. controls (498.55905420, 687.17945396) and (507.41238731, 686.35278731) .. (511.02572056, 679.44612082)
+ .. controls (503.19905409, 674.83278760) and (496.61238758, 668.47278776) .. (491.50572105, 660.96612128)
+ .. controls (480.99905464, 647.37945495) and (471.69238821, 632.75278865) .. (459.53238851, 620.52612229)
+ .. controls (456.67905525, 622.16612225) and (453.65238866, 623.43278889) .. (450.57238874, 624.53945553)
+ .. controls (448.95905544, 641.12612178) and (447.43905548, 657.71278803) .. (445.82572219, 674.29945428)
+ .. controls (445.07905554, 679.45945415) and (445.34572220, 684.76612069) .. (443.85238890, 689.79278723)
+ .. controls (442.51905560, 694.27278712) and (441.53238896, 698.87278700) .. (441.78572229, 703.56612022)}
+\def\fdulogo@emblem@E{%
+ (526.98572016, 668.59278776)
+ .. controls (530.17238675, 669.21945441) and (532.65238668, 666.80612114) .. (535.09238662, 665.19278784)
+ .. controls (547.45238631, 655.96612141) and (561.49238596, 649.28612157) .. (573.99905232, 640.27278847)
+ .. controls (578.85238553, 635.77945524) and (575.13238562, 627.07278880) .. (569.21238577, 625.37945550)
+ .. controls (565.73238586, 639.41945515) and (550.83905290, 644.23278837) .. (539.90571984, 651.08612153)
+ .. controls (535.22571995, 646.21945498) and (529.57238676, 641.72612176) .. (527.15905349, 635.21945526)
+ .. controls (529.51905343, 629.52612207) and (535.87905327, 627.33945546) .. (540.77238648, 624.31278886)
+ .. controls (546.33238634, 620.17945563) and (553.49238616, 625.57945550) .. (559.19905269, 622.00612226)
+ .. controls (557.10571941, 614.04612245) and (552.87905284, 605.24612267) .. (544.41238639, 602.64612274)
+ .. controls (542.49238644, 612.75278915) and (533.62571999, 619.48612232) .. (524.83905355, 623.59278888)
+ .. controls (521.87905362, 625.23278884) and (519.13238702, 622.43278891) .. (517.53238706, 620.20612230)
+ .. controls (514.90572046, 616.47278906) and (511.87905387, 612.81945582) .. (510.49238724, 608.40612260)
+ .. controls (509.59905393, 605.47278934) and (511.30572055, 602.61945607) .. (513.65238716, 600.96612278)
+ .. controls (519.42572035, 596.49945623) and (525.18572020, 591.80612301) .. (531.94572003, 588.91278975)
+ .. controls (536.98571991, 588.85945642) and (541.79905312, 590.76612304) .. (546.73238633, 591.63278968)
+ .. controls (550.63905290, 583.88612321) and (541.33238647, 575.32612342) .. (533.66571999, 578.12612335)
+ .. controls (521.42572030, 583.35278989) and (511.61238721, 592.63278966) .. (500.49238749, 599.72612281)
+ .. controls (495.63905428, 603.19278939) and (489.46572110, 605.95278932) .. (487.42572115, 612.03278917)
+ .. controls (495.85238760, 615.57945575) and (501.03905414, 623.43278889) .. (505.39905403, 631.05945536)
+ .. controls (511.77238721, 642.09945509) and (521.27905363, 651.56612152) .. (524.62572022, 664.15278787)
+ .. controls (525.11905354, 665.76612116) and (525.31905353, 667.68612111) .. (526.98572016, 668.59278776)}
+\def\fdulogo@emblem@R{%
+ (594.53238514, 624.33945553)
+ .. controls (604.35905156, 620.15278897) and (610.29238474, 610.84612253) .. (618.54571787, 604.51278936)
+ .. controls (626.91905099, 597.44612287) and (634.30571748, 587.99278977) .. (635.51905078, 576.76612339)
+ .. controls (636.38571742, 567.01945696) and (628.43905096, 557.52612387) .. (618.63905120, 556.84612388)
+ .. controls (612.81238468, 556.05945724) and (607.19905149, 559.85945714) .. (601.46571830, 557.91279052)
+ .. controls (599.13238502, 548.69945742) and (595.37238512, 539.60612432) .. (596.02571843, 529.89945789)
+ .. controls (596.55905175, 525.01945801) and (590.23905191, 525.37945800) .. (587.15905199, 526.69945797)
+ .. controls (579.63905218, 528.67279126) and (576.29238559, 538.76612434) .. (580.51905215, 545.09945751)
+ .. controls (584.26571873, 550.67279071) and (587.94571863, 556.56612389) .. (589.05238527, 563.32612372)
+ .. controls (589.65238526, 567.80612361) and (587.42571865, 572.03279017) .. (584.82571871, 575.51279008)
+ .. controls (584.02571873, 575.35279009) and (582.41238544, 575.04612343) .. (581.61238546, 574.88612343)
+ .. controls (576.83905225, 570.57945687) and (571.67905237, 566.53945698) .. (567.95905247, 561.21945711)
+ .. controls (567.26571915, 557.91279052) and (567.86571914, 553.57945730) .. (564.86571921, 551.31279069)
+ .. controls (561.95905262, 550.63279071) and (560.17238600, 553.53945730) .. (558.30571938, 555.21945726)
+ .. controls (554.73238613, 559.59279048) and (550.77238623, 563.65945705) .. (547.39905298, 568.17945693)
+ .. controls (545.87905302, 569.69945690) and (546.42571967, 571.96612351) .. (546.21238634, 573.85945679)
+ .. controls (549.82571959, 575.89945674) and (554.03905282, 574.81945677) .. (557.94571938, 575.44612342)
+ .. controls (561.51905263, 577.15279004) and (563.70571924, 580.59278996) .. (566.37238584, 583.36612322)
+ .. controls (574.14571898, 591.17945636) and (581.69238546, 599.20612283) .. (589.57238526, 606.91278930)
+ .. controls (594.50571847, 611.35278919) and (593.13238517, 618.48612234) .. (594.53238514, 624.33945553)
+ (592.65238518, 585.5394565)
+ .. controls (591.53238521, 581.93945659) and (593.85238515, 578.40612335) .. (596.10571843, 575.77945674)
+ .. controls (598.30571838, 573.47279014) and (600.42571832, 570.77945687) .. (603.53238491, 569.68612356)
+ .. controls (612.70571802, 566.64612364) and (624.47905105, 576.00612341) .. (621.10571781, 585.80612316)
+ .. controls (617.58571789, 591.11278969) and (613.22571800, 596.53945623) .. (606.97238483, 598.64612284)
+ .. controls (601.49238496, 595.15278959) and (596.38571842, 590.89945637) .. (592.65238518, 585.53945650)}
+\def\fdulogo@emblem@S{%
+ (638.23905071, 535.65945775)
+ .. controls (644.62571722, 539.87279098) and (653.18571700, 542.09945759) .. (660.43905016, 538.80612434)
+ .. controls (669.22571660, 534.85945777) and (674.87904979, 525.96612466) .. (676.86571641, 516.77945822)
+ .. controls (677.59904973, 511.88612501) and (677.78571639, 506.92612513) .. (678.57238304, 502.03279192)
+ .. controls (679.25238302, 497.08612538) and (683.17238292, 493.05945881) .. (682.65238293, 487.87279228)
+ .. controls (676.70571642, 483.33945906) and (669.71904992, 479.61945915) .. (661.99905012, 480.09945914)
+ .. controls (660.69238348, 487.24612562) and (669.39904993, 491.04612553) .. (669.37238327, 497.92612536)
+ .. controls (669.99904992, 507.01945846) and (667.61238331, 516.13945824) .. (663.41238341, 524.16612470)
+ .. controls (660.99905014, 528.63279126) and (654.89238363, 529.96612456) .. (650.89238373, 526.83279130)
+ .. controls (645.69238386, 512.75279165) and (649.19905044, 497.60612537) .. (650.66571707, 483.17945906)
+ .. controls (651.43905038, 478.12612585) and (648.98571711, 473.13945931) .. (645.39905053, 469.73945940)
+ .. controls (634.13238415, 460.97945961) and (616.05238460, 463.81945954) .. (607.49238481, 475.07279260)
+ .. controls (599.98571833, 484.69945902) and (597.97238505, 497.76612536) .. (599.85238500, 509.60612507)
+ .. controls (597.17238507, 510.68612504) and (594.49238514, 511.72612501) .. (591.83905187, 512.81945832)
+ .. controls (591.82571854, 514.47279161) and (591.81238520, 516.12612490) .. (591.81238520, 517.77945819)
+ .. controls (599.25238502, 521.72612476) and (606.35905151, 526.57945797) .. (614.50571797, 528.99279125)
+ .. controls (618.49238454, 530.51279121) and (621.70571779, 524.55279136) .. (618.77238453, 521.79279143)
+ .. controls (615.51905128, 517.81945819) and (610.41238474, 514.41945828) .. (610.30571808, 508.77945842)
+ .. controls (609.93238475, 501.56612527) and (609.59905143, 493.80612546) .. (613.13238467, 487.24612562)
+ .. controls (615.38571795, 482.81945907) and (620.01238450, 479.41945915) .. (625.03905104, 479.24612582)
+ .. controls (630.01238425, 480.01945914) and (632.85238418, 485.43279234) .. (633.13238417, 490.04612555)
+ .. controls (632.71905085, 499.36612532) and (629.99905092, 508.51279176) .. (630.45238424, 517.88612486)
+ .. controls (630.45238424, 524.44612469) and (632.39905086, 531.89945784) .. (638.23905071, 535.65945775)}
+\def\fdulogo@emblem@I@ii{%
+ (693.17238267, 460.65945962)
+ .. controls (695.39904928, 458.89945967) and (698.14571588, 457.08612638) .. (698.39904921, 453.96612646)
+ .. controls (700.21238249, 444.25946003) and (703.63904908, 434.81946027) .. (704.10571573, 424.88612718)
+ .. controls (702.42571577, 424.35279386) and (700.77238248, 423.80612721) .. (699.13238252, 423.24612722)
+ .. controls (696.71904925, 426.16612715) and (694.93238263, 430.25946038) .. (690.86571606, 431.11279369)
+ .. controls (676.33238309, 429.47279374) and (662.25238344, 425.27279384) .. (647.78571714, 423.21946056)
+ .. controls (642.43905061, 422.31279391) and (636.83905075, 421.92612726) .. (632.07905086, 419.04612733)
+ .. controls (631.17238422, 414.68612744) and (630.98571756, 409.28612757) .. (626.54571767, 406.89946097)
+ .. controls (625.27905103, 407.88612761) and (623.54571774, 408.52612759) .. (622.90571776, 410.12612755)
+ .. controls (618.81238453, 419.75279398) and (617.74571789, 430.27279372) .. (615.85238460, 440.47279346)
+ .. controls (615.19905129, 444.11279337) and (616.45238459, 449.79279323) .. (621.06571781, 449.76612656)
+ .. controls (626.46571767, 447.93945994) and (625.82571769, 440.51279346) .. (630.81238423, 438.12612685)
+ .. controls (649.21238377, 441.15279344) and (667.62571664, 444.21946003) .. (685.87904952, 447.96612661)
+ .. controls (691.09238272, 449.81945989) and (691.13238272, 456.33945973) .. (693.17238267, 460.65945962)}
+\def\fdulogo@emblem@T{%
+ (687.11904949, 391.40612802)
+ .. controls (692.18571603, 396.44612789) and (700.15904916, 398.43279451) .. (706.61238233, 394.81946127)
+ .. controls (706.78571566, 374.25946178) and (705.19904904, 353.75279563) .. (703.82571574, 333.25946281)
+ .. controls (700.34571582, 329.09946291) and (694.30571598, 327.64612961) .. (689.37238277, 329.96612956)
+ .. controls (688.77238278, 331.28612952) and (686.81238283, 333.12612948) .. (688.65238278, 334.40612945)
+ .. controls (693.03904934, 338.87279600) and (696.07904926, 344.75279585) .. (696.21238259, 351.11279569)
+ .. controls (676.75904975, 354.25946228) and (656.98571691, 354.79279560) .. (637.30571740, 354.53946228)
+ .. controls (634.55905080, 351.79279568) and (633.61238416, 346.79279580) .. (629.33238427, 345.80612916)
+ .. controls (626.47905100, 344.97946251) and (624.83905105, 348.13946244) .. (624.63905105, 350.49946238)
+ .. controls (623.18571775, 359.37946215) and (623.46571775, 368.61946192) .. (625.85238435, 377.31279504)
+ .. controls (626.31905101, 378.97946166) and (627.93238430, 379.81946164) .. (629.11905094, 380.89946162)
+ .. controls (632.85238418, 378.88612833) and (634.81238413, 374.55279511) .. (638.83905070, 373.08612848)
+ .. controls (652.43905036, 371.25946186) and (666.17238335, 370.56612854) .. (679.85238300, 369.60612857)
+ .. controls (683.91904957, 369.20612858) and (688.18571613, 368.07279527) .. (692.10571603, 369.79279523)
+ .. controls (696.71904925, 371.05946186) and (698.61238253, 377.13946171) .. (696.22571593, 381.05946161)
+ .. controls (694.06571598, 385.20612818) and (690.09238275, 387.91279477) .. (687.11904949, 391.40612802)}
+\def\fdulogo@emblem@Y{%
+ (617.57238456, 308.67279676)
+ .. controls (618.33238454, 308.65946342) and (619.85238450, 308.63279676) .. (620.61238448, 308.63279676)
+ .. controls (623.38571775, 305.37946350) and (624.41238439, 301.15279694) .. (625.58571769, 297.15279704)
+ .. controls (633.54571749, 294.43279711) and (641.94571728, 290.29946388) .. (650.53238374, 292.67279716)
+ .. controls (660.39905016, 294.88613043) and (670.37238324, 296.63279706) .. (680.22571633, 298.93946367)
+ .. controls (686.91904949, 299.96613031) and (690.85238273, 306.43279681) .. (697.30571590, 308.08613010)
+ .. controls (698.06571588, 299.28613032) and (694.90571596, 290.91279720) .. (692.13238270, 282.73946407)
+ .. controls (691.75904937, 281.24613077) and (690.83904940, 280.21946413) .. (689.37238277, 279.64613081)
+ .. controls (686.74571616, 280.49946413) and (685.17238287, 282.87279740) .. (683.39904958, 284.80613069)
+ .. controls (673.79904982, 282.88613073) and (664.23905006, 280.71279745) .. (654.85238363, 277.89946419)
+ .. controls (662.07905011, 271.45946435) and (667.39904998, 262.52613124) .. (676.59904975, 258.60613134)
+ .. controls (678.67904970, 257.53946470) and (681.47904963, 257.63279803) .. (683.17238292, 255.99279807)
+ .. controls (684.90571621, 248.51279826) and (682.79904960, 238.67279851) .. (674.89238313, 235.51279858)
+ .. controls (669.46571660, 249.71279823) and (655.46571695, 257.24613137) .. (646.86571716, 269.09946441)
+ .. controls (641.23905064, 276.16613090) and (631.89238420, 278.01946419) .. (623.53238441, 279.72613081)
+ .. controls (617.95905122, 280.92613078) and (613.19905134, 272.47279766) .. (607.85238480, 276.92613088)
+ .. controls (608.41238479, 285.40613067) and (611.27905138, 293.47279714) .. (613.22571800, 301.68613026)
+ .. controls (613.77238466, 304.49946353) and (615.46571795, 306.80613014) .. (617.57238456, 308.67279676)}
+% \end{macrocode}
+%
+% 年份“1905”。
+% \begin{macrocode}
+\def\fdulogo@emblem@one{%
+ (210.6390614,174.63280011)
+ .. controls (216.67906125, 175.21946676) and (221.81239445, 178.87280000) .. (227.55906098, 180.56613329)
+ .. controls (232.15906086, 177.80613336) and (236.70572742, 174.56613344) .. (239.37239402, 169.75280023)
+ .. controls (238.14572738, 166.88613363) and (236.77239408, 164.03280037) .. (234.83906080, 161.55280043)
+ .. controls (221.77239446, 143.96613421) and (209.17239477, 126.04613465) .. (196.18572843, 108.40613510)
+ .. controls (194.77239513, 106.56613514) and (193.47906183, 104.56613519) .. (191.71906187, 103.00613523)
+ .. controls (187.97239530, 101.52613527) and (184.55906205, 104.48613519) .. (181.98572878, 106.81946847)
+ .. controls (179.35906218, 109.25946841) and (175.50572895, 112.13946834) .. (177.26572890, 116.21946823)
+ .. controls (185.81239535, 129.96613456) and (196.33239509, 142.37946758) .. (204.86572821, 156.15280057)
+ .. controls (200.26572833, 159.91280047) and (195.41239511, 163.57946705) .. (191.87906187, 168.41946693)
+ .. controls (191.99906187, 173.07280015) and (195.02572846, 177.91280002) .. (199.63906168, 179.32613332)
+ .. controls (203.25239492, 177.65946670) and (206.67906150, 175.33946676) .. (210.63906140, 174.63280011)}
+\def\fdulogo@emblem@nine{%
+ (293.61239266, 125.28613467)
+ .. controls (287.66572614, 121.88613476) and (283.09239292, 113.28613497) .. (287.54572614, 106.99280180)
+ .. controls (291.95905937, 100.09946864) and (301.35905913, 98.67280201) .. (308.67905895, 100.99280195)
+ .. controls (313.38572550, 103.20613523) and (316.67905875, 108.65946842) .. (315.75905877, 113.87280163)
+ .. controls (314.18572548, 118.32613485) and (309.63905893, 120.55280146) .. (305.89239235, 122.89946807)
+ .. controls (302.19905911, 124.79280135) and (297.74572589, 127.05946796) .. (293.61239266, 125.28613467)
+ (283.21239292, 137.61946770)
+ .. controls (289.81239275, 139.92613431) and (297.09239257, 139.31280099) .. (303.86572574, 138.12613435)
+ .. controls (314.97239213, 136.04613440) and (326.23905851, 129.27280124) .. (330.05239175, 118.11280152)
+ .. controls (332.94572501, 105.13946851) and (328.85239178, 92.08613550) .. (324.65239188, 79.88613581)
+ .. controls (321.90572529, 69.68613606) and (312.95905884, 62.39280291) .. (303.49239241, 58.59280301)
+ .. controls (296.41239259, 55.49946975) and (288.41239279, 57.07280305) .. (281.25239297, 59.04613633)
+ .. controls (270.17239325, 62.33946958) and (260.70572682, 71.61946935) .. (258.78572686, 83.21946906)
+ .. controls (258.14572688, 88.32613560) and (261.02572681, 92.88613548) .. (265.11906004, 95.67280208)
+ .. controls (271.74572654, 93.39280214) and (272.38572652, 85.77946899) .. (275.58572644, 80.55280246)
+ .. controls (281.01239297, 73.16613598) and (292.19905936, 70.15280272) .. (300.31905916, 74.83280260)
+ .. controls (303.61239241, 76.65946922) and (306.47905900, 80.12613580) .. (306.43905901, 84.04613570)
+ .. controls (296.22572593, 85.09946901) and (285.02572621, 86.75280230) .. (277.26572640, 94.09946879)
+ .. controls (271.26572655, 100.64613529) and (266.10572668, 110.17946838) .. (269.73239326, 119.12613483)
+ .. controls (272.42572652, 126.23280132) and (275.69239311, 134.44613444) .. (283.21239292, 137.61946770)}
+\def\fdulogo@emblem@zero{%
+ (411.01238972, 111.88613501)
+ .. controls (404.38572322, 109.99280172) and (402.09238995, 102.60613524) .. (401.35905663, 96.49946873)
+ .. controls (400.65238998, 86.93946897) and (400.89238998, 76.60613589) .. (406.01238985, 68.15280277)
+ .. controls (408.30572313, 64.69946952) and (411.50572305, 61.23280294) .. (415.78572294, 60.48613629)
+ .. controls (424.71905605, 58.92613633) and (433.35905583, 66.55280281) .. (434.53238914, 75.23280259)
+ .. controls (435.43905578, 84.84613568) and (432.83905585, 94.45946878) .. (429.02572261, 103.20613523)
+ .. controls (425.89238935, 109.53946840) and (418.07905621, 114.51280161) .. (411.01238972, 111.88613501)
+ (405.74572319, 127.83280128)
+ .. controls (415.94572293, 129.47280124) and (427.99905597, 129.88613456) .. (436.03905577, 122.24613475)
+ .. controls (447.95905547, 108.76613509) and (453.13238867, 90.09946889) .. (451.81238870, 72.33946933)
+ .. controls (450.19905541, 58.21946968) and (438.79905570, 43.93947004) .. (423.73238941, 43.91280337)
+ .. controls (411.93238970, 44.16613670) and (398.71905670, 47.67280328) .. (391.73239021, 57.95280302)
+ .. controls (384.51905705, 68.47280276) and (383.82572374, 81.67280243) .. (382.77239043, 93.95280212)
+ .. controls (382.50572377, 108.28613510) and (390.71905690, 124.67280136) .. (405.74572319, 127.83280128)}
+\def\fdulogo@emblem@five{%
+ (521.86572029, 172.09946684)
+ .. controls (529.15905344, 177.17946671) and (539.82571984, 165.40613367) .. (533.55905333, 158.84613383)
+ .. controls (531.37238672, 156.05946724) and (528.26572013, 154.12613395) .. (525.10572021, 152.59280066)
+ .. controls (518.22572038, 149.35280074) and (511.30572055, 146.17946748) .. (504.49238739, 142.79280090)
+ .. controls (505.89238735, 138.48613434) and (507.39905398, 134.20613445) .. (509.29238727, 130.08613455)
+ .. controls (513.69238716, 132.57946782) and (518.31905371, 134.84613443) .. (521.93238695, 138.48613434)
+ .. controls (531.25238672, 148.75280075) and (549.73238626, 147.07280080) .. (557.66571939, 135.93946774)
+ .. controls (564.54571922, 127.15280129) and (566.22571918, 114.91280160) .. (563.05238592, 104.33946853)
+ .. controls (560.75905265, 96.36613540) and (554.18571948, 90.75280220) .. (547.63905298, 86.16613565)
+ .. controls (536.71905325, 79.13946916) and (521.10572031, 79.37946915) .. (511.09238722, 87.96613561)
+ .. controls (506.94572066, 92.15280217) and (511.54572054, 97.87280203) .. (515.22572045, 100.51280196)
+ .. controls (522.31905361, 102.40613525) and (528.73238678, 95.71280208) .. (535.89238660, 98.12613535)
+ .. controls (541.66571979, 101.15280194) and (546.25238634, 106.04613515) .. (549.17238627, 111.84613501)
+ .. controls (550.74571956, 119.79280148) and (545.49238636, 128.76613459) .. (537.27905323, 130.08613455)
+ .. controls (532.50572002, 130.93946787) and (529.15905344, 126.76613464) .. (525.82572019, 124.11280137)
+ .. controls (519.34572035, 118.00613486) and (511.38572055, 113.83280163) .. (503.55905408, 109.76613506)
+ .. controls (496.57238759, 123.39280139) and (487.81238780, 136.40613440) .. (484.21238789, 151.49946735)
+ .. controls (496.54572092, 158.76613384) and (509.27905393, 165.29946701) .. (521.86572029, 172.09946684)}
+% \end{macrocode}
+%
+% 内环。
+% \begin{macrocode}
+\def\fdulogo@emblem@ring@inner@i{%
+ (361.25239097, 616.49945573)
+ .. controls (394.65239013, 618.07278902) and (428.63905595, 615.12612243) .. (460.33238849, 603.93945604)
+ .. controls (533.42572000, 578.20612335) and (592.38571852, 515.31279159) .. (612.77238468, 440.47279346)
+ .. controls (618.50571787, 421.04612728) and (619.83905117, 400.69946112) .. (620.91905114, 380.57946162)
+ .. controls (621.31905113, 350.97946236) and (617.47905123, 321.11279644) .. (607.53238481, 293.12613048)
+ .. controls (581.78571879, 222.35279891) and (521.59905363, 164.84613368) .. (449.29238877, 143.36613422)
+ .. controls (411.30572305, 132.47280116) and (370.74572406, 131.20613453) .. (331.93239170, 138.13946769)
+ .. controls (299.90572584, 143.89946754) and (269.06572661, 156.40613390) .. (242.41239394, 175.12613343)
+ .. controls (198.49239504, 205.71279933) and (163.47906258, 250.28613155) .. (147.89239630, 301.81946359)
+ .. controls (138.98572986, 331.20612953) and (135.87906327, 362.25946208) .. (138.06572988, 392.84612798)
+ .. controls (139.77239651, 425.36612717) and (148.53239629, 457.45945970) .. (163.30572925, 486.47279231)
+ .. controls (189.25239527, 536.12612440) and (232.15906086, 577.09945671) .. (283.82572624, 599.16612283)
+ .. controls (308.26572563, 609.68612256) and (334.66572497, 615.49945575) .. (361.25239097, 616.49945573)}
+\def\fdulogo@emblem@ring@inner@ii{%
+ (349.85239125, 596.91278955)
+ .. controls (326.69239183, 594.15278962) and (303.94572573, 587.73945645) .. (282.86572626, 577.75279003)
+ .. controls (223.78572774, 548.76612409) and (176.71906225, 493.71279213) .. (161.78572929, 429.11279374)
+ .. controls (149.99906292, 378.21946168) and (154.90572946, 323.12612973) .. (178.09239555, 276.07279757)
+ .. controls (192.53239519, 247.36613162) and (213.46572800, 222.12613225) .. (238.09239405, 201.59279943)
+ .. controls (263.25239342, 180.57946662) and (293.22572600, 165.37946700) .. (325.15905854, 157.91280052)
+ .. controls (375.03905729, 145.87280083) and (429.05238927, 150.95280070) .. (475.53238811, 172.84613348)
+ .. controls (499.71905417, 184.55279986) and (521.54572029, 200.91279945) .. (540.18571983, 220.23279897)
+ .. controls (557.53238606, 238.29946518) and (572.49238569, 258.88613133) .. (582.82571876, 281.77946409)
+ .. controls (605.98571818, 332.51279616) and (608.94571811, 391.84612801) .. (592.09238520, 444.89946002)
+ .. controls (582.54571877, 475.56612592) and (565.71905252, 503.83279188) .. (543.55905308, 527.05945796)
+ .. controls (521.82572029, 550.60612404) and (495.25238762, 569.84612356) .. (465.65238836, 582.24612325)
+ .. controls (449.98572208, 588.81945642) and (433.39905583, 592.84612298) .. (416.79905625, 596.25945623)
+ .. controls (394.66572347, 599.43278949) and (372.03905737, 599.48612282) .. (349.85239125, 596.91278955)}
+% \end{macrocode}
+%
+% 外环。
+% \begin{macrocode}
+\def\fdulogo@emblem@ring@outer@i{%
+ (368.57239079, 736.61945272)
+ -- (390.89239023, 736.61945272)
+ .. controls (400.37238999, 735.31278609) and (409.98572308, 735.60611942) .. (419.45238951, 734.27278612)
+ .. controls (471.66572154, 729.01945291) and (522.85238693, 712.13945334) .. (567.25238582, 684.00612071)
+ .. controls (616.45238459, 652.68612149) and (658.38571687, 609.85945589) .. (688.45238279, 559.87279048)
+ .. controls (704.79904905, 532.39279116) and (717.45238206, 502.64612524) .. (725.18571520, 471.59279268)
+ .. controls (732.34571502, 444.25946003) and (735.50571495, 416.08612740) .. (737.17238157, 387.93946144)
+ -- (737.17238157, 364.21946203)
+ .. controls (736.39904826, 358.60612884) and (736.11904826, 352.95279565) .. (735.83904827, 347.29946246)
+ .. controls (731.38571505, 289.00613058) and (713.05238217, 231.36613202) .. (680.23904966, 182.75279990)
+ .. controls (638.58571737, 120.48613479) and (578.70571887, 69.67280273) .. (508.59905395, 42.48613674)
+ .. controls (471.46572155, 28.04613710) and (431.73238921, 21.32613727) .. (392.06572353, 19.28613732)
+ -- (362.01239095, 19.28613732)
+ .. controls (301.01239247, 21.79280393) and (240.03906067, 38.79280350) .. (188.59906195, 72.15280267)
+ .. controls (137.71906322, 104.44613519) and ( 94.53239764, 148.89946742) .. ( 64.27906506, 201.05946611)
+ .. controls ( 39.81239900, 242.93946507) and ( 25.45239936, 290.41946388) .. ( 20.70573282, 338.60612934)
+ .. controls ( 16.61239958, 377.51279503) and ( 19.02573286, 416.99279405) .. ( 26.67906600, 455.32612642)
+ .. controls ( 38.51906570, 513.71279163) and ( 66.61239833, 568.51279026) .. (106.13239735, 612.99278915)
+ .. controls (125.09239687, 634.91278860) and (146.65239633, 654.56612144) .. (170.07906241, 671.60612102)
+ .. controls (218.11906121, 706.80612014) and (275.75905977, 728.24611960) .. (334.91905829, 734.28611945)
+ .. controls (346.09239135, 735.72611941) and (357.37239107, 735.51278608) .. (368.57239079, 736.61945272)}
+\def\fdulogo@emblem@ring@outer@ii{%
+ (354.53239114, 717.84611986)
+ .. controls (321.10572531, 715.17945326) and (287.69239281, 709.16612008) .. (256.34572692, 696.99278705)
+ .. controls (208.13239480, 678.63278751) and (164.83906255, 648.37945493) .. (129.51906343, 610.92612253)
+ .. controls (106.35906401, 586.08612315) and ( 86.22573118, 558.24612385) .. ( 71.11906489, 527.77945794)
+ .. controls ( 36.07906576, 456.27279307) and ( 28.85239928, 372.71279515) .. ( 46.18573218, 295.37946375)
+ .. controls ( 61.50573180, 225.76613216) and (102.38573077, 163.29946706) .. (155.91906277, 116.89946822)
+ .. controls (196.98572841, 80.45946913) and (247.34572715, 54.51280311) .. (301.01239247, 42.79280340)
+ .. controls (383.25239042, 25.40613717) and (472.61238818, 34.95280360) .. (546.25238634, 76.84613588)
+ .. controls (609.82571809, 113.67280163) and (662.57238344, 169.83280023) .. (692.95904934, 236.93946522)
+ .. controls (715.01238212, 285.51279733) and (723.18571525, 339.56612932) .. (721.19904864, 392.63279466)
+ .. controls (718.73238203, 452.08612650) and (701.41238246, 511.41945835) .. (668.46571662, 561.23279044)
+ .. controls (631.46571755, 617.03278905) and (579.43905218, 663.59278788) .. (517.91905372, 690.64612054)
+ .. controls (466.78572166, 713.11278664) and (410.05238975, 721.16611978) .. (354.53239114, 717.84611986)}
+% \end{macrocode}
+%
+% \paragraph{校徽(重修版)}
+%
+% 核心图案。
+% \begin{macrocode}
+\def\fdulogo@emblem@new@kernel{%
+ (284.68492622, 377.38587424)
+ .. controls (296.85159258, 374.46587432) and (317.35159207, 372.84454102) .. (328.85159178, 381.34454081)
+ .. controls (340.07825816, 389.64187394) and (342.01825812, 410.17787342) .. (336.41292492, 413.51120667)
+ .. controls (327.05025849, 419.07920653) and (273.18492650, 410.84454007) .. (263.01826009, 410.17787342)
+ .. controls (261.01826014, 399.01120704) and (271.06492656, 380.65520750) .. (284.68492622, 377.38587424)
+ (336.35159159, 441.01120599)
+ .. controls (336.35159159, 441.01120599) and (337.68492489, 455.17787230) .. (334.68625830, 462.27653879)
+ .. controls (329.13025844, 475.43120513) and (323.68492524, 480.17253834) .. (299.01825919, 480.17253834)
+ .. controls (282.14492628, 480.17253834) and (267.18492665, 476.01120511) .. (261.31159347, 461.96720546)
+ .. controls (257.23692690, 452.22453904) and (258.30759354, 437.71253940) .. (262.91292676, 437.06587275)
+ .. controls (270.44892657, 436.00720611) and (336.35159159, 441.01120599) .. (336.35159159, 441.01120599)
+ (246.59292717, 497.03520459)
+ .. controls (259.37426018, 506.15653769) and (276.74092641, 512.23387087) .. (300.29559249, 512.23387087)
+ .. controls (348.32492463, 512.23387087) and (363.12892426, 484.62187156) .. (364.18492423, 471.84453855)
+ -- (364.78892421, 471.84453855)
+ .. controls (368.40759079, 488.78853813) and (395.43425678, 511.51120422) .. (399.44359001,521.76720397)
+ .. controls (400.91825664, 525.54053721) and (395.33292345, 527.64187049) .. (392.01825687,525.67787054)
+ .. controls (389.01825694, 523.90053725) and (372.68492402, 506.42853768) .. (360.51825765,506.42853768)
+ .. controls (354.64359113, 506.42853768) and (344.76892471, 511.67787089) .. (344.76892471,520.02320401)
+ .. controls (344.76892471, 527.51120382) and (366.72892417, 547.37253666) .. (375.35159062,559.84453635)
+ .. controls (381.31959047, 568.47653613) and (388.58492362, 581.05386915) .. (391.51825688,595.84453545)
+ .. controls (395.51825678, 616.01120161) and (404.51825655, 623.17786810) .. (415.85158960,623.17786810)
+ .. controls (424.46225606, 623.17786810) and (437.85158905, 613.67786834) .. (429.85158925,588.01120231)
+ .. controls (425.73692269, 574.80853597) and (419.22092285, 550.54453658) .. (430.35158924,549.51120327)
+ .. controls (446.51825550, 548.01120331) and (563.19691925, 564.04320291) .. (582.07425211,556.90053642)
+ .. controls (592.35158519, 553.01120319) and (602.68491827, 540.51120350) .. (592.74091851,526.23387052)
+ .. controls (590.55558524, 523.09653727) and (546.51825300, 529.51120377) .. (514.51825380,529.51120377)
+ .. controls (502.89825409, 529.51120377) and (439.94758900, 527.47387049) .. (429.24358927,513.09253752)
+ .. controls (418.18492288, 498.23387122) and (433.51825583, 482.17787162) .. (433.51825583,471.17787190)
+ .. controls (433.51825583, 452.84453902) and (415.35158962, 427.34453966) .. (415.35158962,364.34454124)
+ .. controls (415.35158962, 329.84320877) and (418.18492288, 298.67787621) .. (422.96225609,221.78854480)
+ .. controls (424.97425604, 189.40721228) and (394.85159013, 194.47654548) .. (389.85159025,223.34454476)
+ .. controls (386.22225701, 244.30187757) and (382.29559044, 297.12187625) .. (382.07425711,314.23387582)
+ .. controls (336.68492492, 315.84454245) and (279.18492635, 309.56720927) .. (249.18492710,302.23387612)
+ .. controls (241.04359397, 300.24320951) and (230.30226091, 322.72854228) .. (232.73692751,328.19387547)
+ .. controls (237.18492740, 338.17787522) and (304.07292573, 341.84587513) .. (337.85159155,344.01120841)
+ .. controls (352.71159118, 344.96454172) and (362.68492427, 344.77654173) .. (382.07425711,343.78854175)
+ .. controls (382.24359044, 356.26587477) and (382.09159045, 361.90454130) .. (383.18492375,378.67787421)
+ .. controls (384.31292373, 395.98454045) and (387.89425697, 424.28187307) .. (391.45825688,437.71787274)
+ .. controls (396.07425676, 455.12187230) and (405.51825653, 466.34453869) .. (400.96225664,468.67787196)
+ .. controls (394.59159014, 471.94053855) and (374.85159063, 431.14587290) .. (370.35159074,409.49120677)
+ .. controls (367.44625748, 395.51120712) and (371.86359070, 373.07254102) .. (349.62892459,358.67787471)
+ .. controls (331.35159172, 346.84454167) and (282.04359295, 338.87787521) .. (256.35159359,354.84454147)
+ .. controls (238.74092736, 365.78854120) and (226.51826100, 381.78854080) .. (226.51826100,426.23387302)
+ .. controls (226.51826100, 452.40053904) and (225.85159435, 482.23387162) .. (246.59292717,497.03520459)
+ (519.40705368, 324.28907557)
+ .. controls (520.27772033, 321.35440898) and (522.26838694, 319.59440902) .. (524.01905357, 319.40640903)
+ .. controls (527.39772015, 319.04240904) and (544.90705304, 319.34507569) .. (546.76838633, 320.92774232)
+ .. controls (552.93238618, 326.17174219) and (554.93505279, 341.67840847) .. (551.93905287, 343.33840843)
+ .. controls (549.50438626, 344.68640839) and (532.46305336, 343.27307510) .. (523.78705357, 340.68507516)
+ .. controls (522.12038695, 340.18907517) and (519.07372036, 338.67840854) .. (518.75372036, 335.68107529)
+ .. controls (518.29638704, 331.41174206) and (518.48438704, 327.39974216) .. (519.40705368, 324.28907557)
+ (452.62972202, 377.89974090)
+ .. controls (454.40705531, 380.67840749) and (460.51772182, 383.39974076) .. (470.18438825, 383.89974075)
+ .. controls (482.77238793, 384.55174073) and (526.92305349, 388.98507395) .. (532.97372001, 387.58640732)
+ .. controls (536.18438660, 386.84507401) and (534.01771998, 379.17840753) .. (531.37772005, 375.70774095)
+ .. controls (529.41638676, 373.13040768) and (525.70172019, 369.17707445) .. (524.01772023, 366.92774117)
+ .. controls (522.12572028, 364.39974124) and (521.15772030, 361.51707464) .. (523.38305358, 360.27574134)
+ .. controls (525.85105352, 358.89974137) and (546.79638633, 361.95574130) .. (553.22705284, 363.09440793)
+ .. controls (558.79771936, 364.08107458) and (560.80971931, 369.80240777) .. (563.93505257, 374.26107432)
+ .. controls (569.21238577, 381.79040747) and (577.07371891, 386.01174069) .. (582.85105210, 386.01174069)
+ .. controls (589.62971859, 386.01174069) and (591.42305188, 374.38374099) .. (590.75238523, 366.33574119)
+ .. controls (589.71238526, 353.83574150) and (577.80438555, 312.07974254) .. (574.23505231, 303.75707608)
+ .. controls (573.29638567, 301.56640947) and (569.88438575, 300.01174284) .. (566.93505249, 300.01174284)
+ .. controls (562.33771927, 300.01174284) and (536.85105325, 301.92774280) .. (526.56705350, 298.69440954)
+ .. controls (524.00438690, 297.88907623) and (523.26838692, 295.76107628) .. (524.01772023, 290.26107642)
+ .. controls (524.61238688, 285.90107653) and (533.49905333, 247.55841082) .. (534.66171997, 239.50507769)
+ .. controls (536.96305324, 223.56641142) and (521.42305363, 220.83707816) .. (512.54305385, 232.40374453)
+ .. controls (504.74038738, 242.56641095) and (500.54705415, 254.53174398) .. (496.62305425, 267.26774366)
+ .. controls (491.90438770, 282.58240995) and (493.95505432, 293.84107633) .. (483.74038791, 292.78907636)
+ .. controls (470.72438823, 291.44774306) and (447.51772215, 274.87174347) .. (435.67372244, 274.87174347)
+ .. controls (427.17638932, 274.87174347) and (425.42038936, 289.38107644) .. (429.01772261, 295.34507629)
+ .. controls (435.35105578, 305.84507603) and (475.30972145, 316.46907577) .. (487.88172114, 317.47040907)
+ .. controls (488.71505445, 325.38774221) and (488.68438778, 330.42774208) .. (486.68438783, 337.09440858)
+ .. controls (479.43505468, 337.17840858) and (471.10172156, 335.26107530) .. (461.92172179, 331.04507540)
+ .. controls (450.90705539, 325.98640886) and (436.74438908, 322.49307562) .. (431.17372255, 322.49307562)
+ .. controls (425.06172271, 322.49307562) and (420.74038948, 337.89974190) .. (430.29638924, 345.12240838)
+ .. controls (435.23905579, 348.85840829) and (445.41505553, 351.63307489) .. (449.95372208, 352.43707487)
+ .. controls (458.85105520, 354.01174149) and (486.96305449, 353.34507484) .. (489.68172109, 359.03040804)
+ .. controls (490.40038774, 360.53574133) and (490.68438773, 364.39974124) .. (488.19772113, 365.49040787)
+ .. controls (485.73372119, 366.57174118) and (469.18438827, 363.01174127) .. (460.40705516, 363.89974125)
+ .. controls (451.95905537, 364.75574123) and (450.23372208, 374.15707432) .. (452.62972202, 377.89974090)
+ (465.02505504, 479.10973837)
+ .. controls (470.18505491, 476.67773843) and (560.01838600, 480.17773834) .. (564.76771921,482.34440495)
+ .. controls (570.23305241, 484.83640489) and (569.77571909, 493.67773800) .. (564.35171922,496.01107128)
+ .. controls (558.92771936, 498.34440455) and (473.45438816, 494.42840465) .. (468.18505496,492.56707136)
+ .. controls (461.68105512, 490.26840476) and (460.15705516, 481.40440498) .. (465.02505504,479.10973837)
+ (512.51838719, 517.56707074)
+ .. controls (550.96238623, 517.56707074) and (578.74105220, 517.56707074) .. (590.23038524,506.59240435)
+ .. controls (595.69438511, 501.37240448) and (599.18505169, 483.56707159) .. (588.92905194,472.13107188)
+ .. controls (579.25038552, 461.33773881) and (539.85171984, 459.34440553) .. (504.85972071,459.19507220)
+ .. controls (494.19305431, 459.14840553) and (455.35172195, 457.17773892) .. (449.05705544,461.39240548)
+ .. controls (429.26772260, 474.64440515) and (433.46105583, 495.05640464) .. (442.07438895,502.23373779)
+ .. controls (455.40772195, 513.34440418) and (467.40772165, 516.67773743) .. (512.51838719,517.56707074)
+ (469.51812160, 412.41240670)
+ .. controls (478.85145470, 412.22040671) and (551.62878621, 415.45640663) .. (562.58611927,417.44173991)
+ .. controls (572.83011901, 419.29907320) and (572.35145236, 428.51107297) .. (566.51811917,429.34440628)
+ .. controls (558.35945271, 430.50973958) and (474.17278815, 426.64840635) .. (466.69545500,424.28307307)
+ .. controls (460.51812182, 422.32973979) and (462.43545511, 412.55774003) .. (469.51812160,412.41240670)
+ (453.04878867, 444.45907257)
+ .. controls (474.88078813, 454.19773899) and (578.96211886, 454.67773898) .. (587.85145197,448.01107248)
+ .. controls (600.58211832, 438.46307272) and (600.43145166, 419.22840653) .. (595.50211845,409.49107344)
+ .. controls (586.74078533, 392.17774054) and (506.59678734, 392.17774054) .. (466.18478835,392.17774054)
+ .. controls (452.18478870, 392.17774054) and (435.68478911, 400.67774033) .. (435.68478911,416.51107327)
+ .. controls (435.68478911, 423.84440642) and (435.60612244, 436.67773943) .. (453.04878867,444.45907257)}
+% \end{macrocode}
+%
+% 文字“FUDAN UNIVERSITY”。
+% \begin{macrocode}
+\def\fdulogo@emblem@new@F{%
+ (128.08471915, 329.48133989)
+ -- (127.14177837, 332.01133349)
+ -- (105.95308200, 324.11420442)
+ -- (128.23005803, 264.34310569)
+ -- (130.86546803, 265.32533568)
+ .. controls (128.57617887, 272.75622407) and (129.41093008, 275.34847365) .. (134.89258287, 277.39151202)
+ -- (185.91412041, 296.40748451)
+ .. controls (191.39577320, 298.45052287) and (193.10540239, 297.40687447) .. (196.85613434, 289.92037447)
+ -- (199.49154434, 290.90260446)
+ -- (185.34743257, 328.85250841)
+ -- (182.71202258, 327.87027842)
+ .. controls (185.90496332, 318.01481284) and (185.34717211, 315.64584725) .. (179.54927011, 313.48494128)
+ -- (154.98724894, 304.33055784)
+ .. controls (151.19058341, 315.16160902) and (153.63728983, 320.51571619) .. (165.31554342, 326.54909292)
+ -- (164.33331344, 329.18450291)
+ -- (128.70257028, 315.90475353)
+ -- (129.68480027, 313.26934353)
+ .. controls (142.40947544, 315.85081706) and (147.47417141, 313.53636504) .. (151.40309135, 302.99472506)
+ -- (126.94648658, 293.87963081)
+ .. controls (123.04607978, 292.42593043) and (121.48115619, 293.40345164) .. (119.47740703, 298.77968803)
+ .. controls (111.81601315, 319.33588600) and (119.27761075, 323.79769475) .. (128.08471915, 329.48133989)}
+\def\fdulogo@emblem@new@U@i{%
+ (100.51870590, 377.96853391)
+ -- ( 97.71928261, 377.69763724)
+ -- (101.38180565, 339.84943428)
+ -- (104.18122894, 340.12033095)
+ .. controls (104.20655678, 348.03456725) and (105.53222649, 349.51915670) .. (113.59456558, 350.29933913)
+ -- (150.99486081, 353.91851870)
+ .. controls (161.96860013, 354.98043366) and (167.22791658, 357.86290671) .. (171.49391369, 365.17027770)
+ .. controls (174.89298469, 370.92442577) and (176.21507398, 378.28599501) .. (175.42405569, 386.46031104)
+ .. controls (173.33273336, 408.07185888) and (159.86303178, 414.11507061) .. (142.84253814, 412.46801883)
+ -- (107.12189689, 409.01137727)
+ .. controls (100.51525791, 408.37206111) and ( 98.57192487, 409.76636429) .. ( 96.75866006, 416.82452926)
+ -- ( 93.95923677, 416.55363258)
+ -- ( 96.34312750, 391.91870758)
+ -- ( 99.14255080, 392.18960425)
+ .. controls ( 98.96921476, 400.98882014) and (100.99203606, 403.44507611) .. (109.16635208, 404.23609440)
+ -- (143.31931629, 407.54103383)
+ .. controls (159.89190220, 409.14474215) and (168.22511905, 403.62170878) .. (169.51458722, 390.29645390)
+ .. controls (170.61984565, 378.87480685) and (164.50082069, 373.19652877) .. (149.27195796, 371.72285086)
+ -- (111.87166273, 368.10367129)
+ .. controls (103.02548511, 367.24763780) and (101.68899846, 369.37881776) .. (100.51870590, 377.96853391)}
+\def\fdulogo@emblem@new@D{%
+ (161.13377402, 431.77641390)
+ .. controls (165.99478812, 430.84205928) and (167.67345668, 427.65541280) .. (166.66276259, 421.20524173)
+ -- (169.42470242, 420.67435842)
+ -- (176.13506745, 455.58527790)
+ .. controls (180.72189924, 479.44843805) and (168.53387923, 498.28768735) .. (145.66501742, 502.68340115)
+ .. controls (122.90663320, 507.05787961) and (106.12398751, 494.24543310) .. (101.21862573, 468.72510905)
+ -- ( 94.74184936, 435.02944310)
+ -- ( 97.50378919, 434.49855979)
+ .. controls ( 99.52571602, 441.44171376) and (101.58635124, 443.22225805) .. (106.66832053, 442.24543276)
+ (143.62723349, 483.14176993)
+ .. controls (169.25803513, 478.21517282) and (174.20076693, 466.38197552) .. (171.99229236, 454.89230582)
+ .. controls (171.03670241, 449.92081412) and (169.32443437, 448.76066473) .. (164.35294268, 449.71625468)
+ -- (107.56745973, 460.63121552)
+ .. controls (105.02647508, 461.11962816) and (104.12545061, 463.58400402) .. (104.95362857, 467.89263016)
+ .. controls (106.86480848, 477.83561355) and (116.44974554, 488.36566169) .. (143.62723349, 483.14176993)}
+\def\fdulogo@emblem@new@A{%
+ (213.73056745, 560.05088194)
+ -- (213.52877972, 559.64866116)
+ .. controls (211.56134940, 555.72700852) and (208.64253939, 555.17751094) .. (194.25467970, 556.10248902)
+ -- (130.11298094, 560.21376615)
+ -- (128.70046687, 557.39822066)
+ -- (172.60549553, 507.43004883)
+ .. controls (180.04014537, 498.91738678) and (180.94311014, 496.95402046) .. (179.42665420, 491.67334867)
+ -- (181.94053410, 490.41217539)
+ -- (192.18126114, 510.82488017)
+ -- (189.66738124, 512.08605346)
+ .. controls (186.28879152, 506.35508462) and (184.02240494, 504.59723135) .. (181.40796985, 505.90885157)
+ .. controls (180.10075230, 506.56466167) and (177.99044785, 508.63027652) .. (173.61985282, 513.46606992)
+ -- (170.45490415, 516.94182818)
+ -- (181.80546368, 539.56674728)
+ .. controls (191.36396463, 539.05076331) and (195.58931486, 538.44133613) .. (197.80152917, 537.33150365)
+ .. controls (199.91318828, 536.27211809) and (200.26293014, 534.46043123) .. (198.69839794, 530.84010551)
+ .. controls (198.44616328, 530.33732953) and (197.89090837, 528.97966505) .. (197.38576172, 527.47099844)
+ -- (199.89964162, 526.20982516)
+ -- (216.24444735, 558.78970866)
+ (167.28995547, 520.41758644)
+ -- (147.59705438, 542.12837916)
+ -- (177.12710706, 540.02584966)}
+\def\fdulogo@emblem@new@N@i{%
+ (180.22686421, 631.40888576)
+ -- (163.64330505, 614.42493307)
+ -- (165.65562172, 612.46005639)
+ .. controls (167.22752306, 614.06990973) and (169.77102921, 614.25935906) .. (178.13167444, 613.64308824)
+ -- (216.28519850, 576.38902642)
+ .. controls (220.87328050, 571.90910759) and (220.82125183, 569.60138665) .. (215.80824593, 563.01806637)
+ -- (217.82056260, 561.05318969)
+ -- (235.66164284, 579.32502506)
+ -- (233.64932617, 581.28990174)
+ .. controls (226.87307200, 575.79932200) and (223.92900012, 575.84376027) .. (218.21402078, 581.42401004)
+ -- (185.85596873, 613.01922702)
+ -- (264.77597447, 606.24373256)
+ -- (266.97663635, 608.49752723)
+ -- (219.56645561, 654.79002177)
+ .. controls (214.97837360, 659.26994059) and (214.95370480, 661.33808113) .. (219.2574575, 667.35605515)
+ -- (217.24514083, 669.32093182)
+ -- (200.34720140, 652.01500846)
+ -- (202.35951807, 650.05013179)
+ .. controls (208.73900170, 655.45642366) and (211.92265398, 655.33528792) .. (217.63763332, 649.75503815)
+ -- (242.18789670, 625.78354268)}
+\def\fdulogo@emblem@new@U@ii{%
+ (331.45282512, 724.53468765)
+ -- (330.63705847, 727.22628423)
+ -- (294.24667267, 716.19711919)
+ -- (295.06243932, 713.50552261)
+ .. controls (302.82732441, 715.03602217) and (304.54348943, 714.02795994) .. (306.89289736, 706.27616178)
+ -- (317.79153974, 670.31643143)
+ .. controls (320.98934498, 659.76537283) and (324.84918874, 655.17508751) .. (332.85243369, 652.42834813)
+ .. controls (339.16237243, 650.22638488) and (346.64021167, 650.37679795) .. (354.49967369, 652.75883655)
+ .. controls (375.27879931, 659.05655505) and (378.55705453, 673.45122874) .. (373.59719333, 689.81613596)
+ -- (363.18801094, 724.16090836)
+ .. controls (361.26280166, 730.51307630) and (362.24800509, 732.69252743) .. (368.81218569, 735.85752868)
+ -- (367.99641904, 738.54912526)
+ -- (344.31036911, 731.37037878)
+ -- (345.12613576, 728.67878220)
+ .. controls (353.71970109, 730.57799095) and (356.52559167, 729.07732700) .. (358.90763028, 721.21786498)
+ -- (368.85998334, 688.38038667)
+ .. controls (373.68932188, 672.44613490) and (369.91166147, 663.19001105) .. (357.09966174, 659.30696182)
+ .. controls (346.11794768, 655.97863391) and (339.34786455, 660.86242188) .. (334.91009400, 675.50470729)
+ -- (324.01145163, 711.46443764)
+ .. controls (321.43362903, 719.96988284) and (323.26059964, 721.69913479) .. (331.45282512, 724.53468765)}
+\def\fdulogo@emblem@new@N@ii{%
+ (409.66623928, 741.32018157)
+ -- (385.93186303, 740.93540199)
+ -- (385.97745303, 738.12327211)
+ .. controls (388.22715694, 738.15974410) and (390.16675926, 736.50346737) .. (395.66999384, 730.17934402)
+ -- (396.53438018, 676.86136137)
+ .. controls (396.63832537, 670.44970523) and (394.97657784, 668.84755849) .. (386.78157096, 667.70206894)
+ -- (386.82716096, 664.88993905)
+ -- (412.36130033, 665.30389623)
+ -- (412.31571034, 668.11602611)
+ .. controls (403.63793789, 668.98797568) and (401.57855597, 671.09236960) .. (401.44908038, 679.07881848)
+ -- (400.71599323, 724.29786706)
+ -- (451.98891394, 663.92106986)
+ -- (455.13849941, 663.97213066)
+ -- (454.06439908, 730.22591079)
+ .. controls (453.96045389, 736.63756693) and (455.39905463, 738.12358127) .. (462.69235634, 739.36696722)
+ -- (462.64676634, 742.17909711)
+ -- (438.46244932, 741.78702313)
+ -- (438.50803931, 738.97489325)
+ .. controls (446.84470898, 738.32244327) and (449.02022329, 735.99490256) .. (449.14969888, 728.00845368)
+ -- (449.70589684, 693.70046907)}
+\def\fdulogo@emblem@new@I@i{%
+ (476.71960763, 671.89702757)
+ .. controls (475.48868767, 666.40836111) and (473.16811016, 665.31466569) .. (464.76278168, 666.39263232)
+ -- (464.14732170, 663.64829909)
+ -- (502.56798690, 655.03185940)
+ -- (503.18344687, 657.77619262)
+ .. controls (494.96376586, 660.19605760) and (493.22273019, 662.20063379) .. (494.50288695, 667.90884691)
+ -- (506.41819213, 721.03913821)
+ .. controls (507.69834888, 726.74735132) and (510.39748318, 727.98673821) .. (518.59456473, 726.49429666)
+ -- (519.21002471, 729.23862989)
+ -- (480.78935952, 737.85506958)
+ -- (480.17389954, 735.11073636)
+ .. controls (487.95448724, 732.78934497) and (489.89045116, 730.62575865) .. (488.63491281, 725.02731887)}
+\def\fdulogo@emblem@new@V{%
+ (602.12727238, 694.33228933)
+ -- (580.41288862, 704.46574992)
+ -- (579.22351531, 701.91711333)
+ .. controls (586.22376857, 698.02956582) and (587.41992600, 696.60232359) .. (585.89752816, 693.34006875)
+ .. controls (585.13632925, 691.70894133) and (584.25959367, 690.62832056) .. (580.48079869, 687.05343948)
+ -- (551.88157206, 659.55539834)
+ -- (553.70312548, 700.17052387)
+ .. controls (553.90703363, 705.66199345) and (554.07015096, 707.07563874) .. (554.78377495, 708.60482070)
+ .. controls (555.87799839, 710.94956636) and (557.93050460, 711.35734248) .. (561.89958209, 709.75338598)
+ .. controls (562.40930941, 709.51551131) and (563.78217537, 708.99898266) .. (565.35893225, 708.38730413)
+ -- (566.54830556, 710.93594073)
+ -- (532.29462977, 726.92111800)
+ -- (531.10525646, 724.37248141)
+ .. controls (535.86950512, 721.28011654) and (536.40641483, 720.03637844) .. (536.33843014, 713.24000463)
+ -- (533.93908436, 639.99548921)
+ -- (536.69161188, 638.71096604)
+ -- (587.86166289, 687.70586863)
+ .. controls (593.25799982, 692.88468900) and (595.30371044, 693.54393098) .. (600.93789907, 691.78365274)}
+\def\fdulogo@emblem@new@E{%
+ (594.15792842, 607.98334063)
+ .. controls (588.62449694, 612.58998385) and (587.91748388, 615.08155932) .. (591.01257229, 618.79933359)
+ -- (608.43144194, 639.72262136)
+ .. controls (617.85556742, 631.87693213) and (618.59324875, 625.55386652) .. (611.28122633, 614.66077637)
+ -- (613.52918286, 612.78932756)
+ -- (637.85801734, 642.01276254)
+ -- (635.61006080, 643.88421134)
+ .. controls (626.25153717, 635.28038827) and (620.30284663, 634.81656760) .. (611.22456061, 642.37434163)
+ -- (610.87872115, 642.66225683)
+ -- (627.57780280, 662.72094592)
+ .. controls (630.31299721, 666.00642086) and (632.08478468, 665.84883526) .. (636.58069775, 662.10593765)
+ .. controls (650.67365604, 650.37339321) and (652.46291030, 643.90679653) .. (645.05122654, 630.60816424)
+ -- (647.21272321, 628.80869424)
+ -- (661.68046206, 646.18712746)
+ -- (611.79311892, 687.71889519)
+ -- (609.99364891, 685.55739852)
+ .. controls (615.67146452, 680.24502184) and (616.16254119, 677.49406677) .. (612.49162238, 673.08461356)
+ -- (577.65388307, 631.23803803)
+ .. controls (573.91098546, 626.74212496) and (571.90878052, 626.79876963) .. (564.93491997, 631.43352191)
+ -- (563.13544997, 629.27202524)
+ -- (613.71447204, 587.16442711)
+ -- (632.14445716, 602.26892739)
+ -- (629.72358089, 604.28433380)
+ .. controls (618.15969086, 598.83394993) and (607.81858737, 596.61069020) .. (594.15792842, 607.98334063)}
+\def\fdulogo@emblem@new@R{%
+ (703.67107461, 556.48625378)
+ .. controls (714.47632067, 563.60142604) and (714.27048109, 576.80121049) .. (702.94807655, 593.99564552)
+ -- (683.02559423, 624.25033449)
+ -- (680.67662770, 622.70355791)
+ .. controls (684.78529306, 615.44126165) and (684.24210802, 613.19777445) .. (677.47708440, 608.74305790)
+ -- (635.94735607, 581.39604802)
+ .. controls (629.08837379, 576.87946042) and (627.53007655, 577.20033640) .. (621.85850567, 583.97227242)
+ -- (619.50953914, 582.42549584)
+ -- (640.42195846, 550.66746829)
+ -- (642.77092499, 552.21424487)
+ .. controls (638.88456869, 560.16173109) and (639.29940333, 561.78189940) .. (645.97046829, 566.17474488)
+ -- (664.38636592, 578.30147324)
+ -- (666.05688463, 575.76458938)
+ -- (649.45513367, 536.94950373)
+ -- (662.13870160, 517.68797815)
+ -- (664.48766814, 519.23475473)
+ .. controls (663.37398900, 520.92601063) and (663.13341715, 522.51869961) .. (663.73616912, 524.26261004)
+ -- (678.07830393, 560.78155396)
+ .. controls (685.19134232, 555.09351361) and (693.42958052, 549.74230791) .. (703.67107461, 556.48625378)
+ (698.63980292, 593.58328528)
+ .. controls (704.33194073, 584.93908843) and (702.58094762, 578.80216225) .. (692.71528818, 572.30570063)
+ .. controls (681.25233149, 564.75743093) and (676.11916711, 567.43879411) .. (667.39304309, 580.28134726)
+ -- (691.35250174, 596.05846835)
+ .. controls (694.64105489, 598.22395555) and (696.72179997, 596.49600378) .. (698.63980292, 593.58328528)}
+\def\fdulogo@emblem@new@S{%
+ (743.20312975, 515.46936653)
+ .. controls (738.43076287, 530.00602567) and (727.28790107, 536.17566139) .. (713.82011393, 531.75420384)
+ .. controls (704.41404037, 528.66620174) and (699.50487531, 520.89733859) .. (697.58812596, 506.17757866)
+ -- (696.51882808, 497.89322644)
+ .. controls (695.11756780, 487.01333370) and (693.18068300, 483.53567665) .. (687.62254863, 481.71094814)
+ .. controls (680.24733186, 479.28967377) and (673.71795216, 482.94805456) .. (671.01595033, 491.17836892)
+ .. controls (665.64703758, 507.53211045) and (681.41553406, 517.20837331) .. (686.73126071, 520.49281728)
+ -- (685.71362365, 523.59254607)
+ -- (659.31248536, 514.92508563)
+ -- (660.33012242, 511.82535684)
+ .. controls (663.21284801, 512.06130697) and (664.45556027, 511.52202777) .. (665.01701519, 509.81183258)
+ .. controls (666.21010691, 506.17766779) and (664.11994318, 500.28153929) .. (667.38339994, 490.34102974)
+ .. controls (672.57685802, 474.52172420) and (685.17136327, 466.81573355) .. (698.63915042, 471.23719110)
+ .. controls (706.65569038, 473.86901107) and (713.05804743, 481.41764222) .. (714.23261811, 489.38133285)
+ -- (716.87701653, 507.65538929)
+ .. controls (718.31013894, 517.71688977) and (720.21031841, 520.94568148) .. (725.34090398, 522.63004626)
+ .. controls (731.96791036, 524.80568411) and (737.50344312, 521.64987718) .. (739.88962656, 514.38154761)
+ .. controls (742.55653747, 506.25812044) and (739.77220119, 496.34505570) .. (726.88804471, 487.26049550)
+ -- (727.87059083, 484.26765391)
+ -- (751.06511313, 491.88238636)
+ -- (750.01238514, 495.08900235)
+ .. controls (746.98768142, 494.92484849) and (745.85185636, 495.49921862) .. (745.25531050, 497.31630102)
+ .. controls (744.27276438, 500.30914260) and (746.11567718, 506.59772897) .. (743.20312975, 515.46936653)}
+\def\fdulogo@emblem@new@I@ii{%
+ (690.18650034, 451.64645084)
+ .. controls (684.60177379, 450.97454421) and (682.79616397, 452.79691191) .. (681.00644231, 461.07993480)
+ -- (678.21407904, 460.74398149)
+ -- (682.91742546, 421.65089566)
+ -- (685.70978873, 421.98684897)
+ .. controls (685.24696331, 430.54282399) and (686.55536222, 432.85315393) .. (692.36347783, 433.55193683)
+ -- (746.42363080, 440.05599302)
+ .. controls (752.23174641, 440.75477592) and (754.30105969, 438.62420089) .. (755.63056509, 430.39912000)
+ -- (758.42292837, 430.73507332)
+ -- (753.71958195, 469.82815914)
+ -- (750.92721867, 469.49220583)
+ .. controls (751.33629157, 461.38300894) and (749.94307439, 458.83585180) .. (744.24665331, 458.15050703)}
+\def\fdulogo@emblem@new@T{%
+ (695.27817006, 394.86431990)
+ .. controls (686.98727938, 395.61711698) and (685.86675195, 396.96144894) .. (685.95735078, 406.66801892)
+ -- (683.15637420, 406.92234225)
+ -- (679.52463696, 366.92439666)
+ -- (682.32561355, 366.67007332)
+ .. controls (683.88289314, 376.35643423) and (685.11518604, 377.48713459) .. (693.63015485, 376.71399165)
+ -- (752.67474121, 371.35285572)
+ .. controls (750.97531414, 357.61274267) and (745.29252469, 352.25466632) .. (731.78693629, 351.56058132)
+ -- (731.49192122, 348.31144849)
+ -- (754.03211881, 346.49076699)
+ -- (760.13587887, 413.71420497)
+ -- (737.64654595, 416.09508178)
+ -- (737.35153088, 412.84594895)
+ .. controls (750.51123954, 409.73070579) and (755.13604392, 403.43671956) .. (754.32275642, 389.50318398)}
+\def\fdulogo@emblem@new@Y{%
+ (727.37709643, 264.98714859)
+ -- (735.52753927, 288.35663423)
+ -- (732.87191590, 289.28282091)
+ .. controls (729.85861091, 282.35098762) and (728.37900448, 280.84154347) .. (725.29848138, 281.91592003)
+ .. controls (723.28020762, 282.61982191) and (720.08099945, 285.40363235) .. (716.65196381, 289.57820189)
+ -- (701.11261978, 308.22295111)
+ -- (730.20250072, 312.37493083)
+ .. controls (731.62538980, 312.35526096) and (735.02196252, 313.55357297) .. (737.35891108, 312.73852869)
+ .. controls (739.69585965, 311.92348440) and (739.98994711, 310.03373064) .. (738.47100095, 305.67850832)
+ -- (737.65103920, 302.98583749)
+ -- (740.30666256, 302.05965080)
+ -- (752.71756415, 337.64500393)
+ -- (750.06194078, 338.57119061)
+ .. controls (748.58987702, 335.03363777) and (745.60836911, 332.97569135) .. (741.25577198, 332.11080654)
+ -- (699.20940712, 324.97140268)
+ -- (683.59434172, 330.41738039)
+ .. controls (675.83992149, 333.12184551) and (675.07896935, 334.69784194) .. (677.26706220, 343.70466632)
+ -- (674.61143883, 344.63085301)
+ -- (661.75596764, 307.77080066)
+ -- (664.41159100, 306.84461398)
+ .. controls (668.29928281, 315.25867889) and (669.73200683, 315.95045356) .. (677.59265200, 313.20894097)
+ -- (697.13803998, 306.39220696)
+ -- (723.09792840, 274.58148207)
+ .. controls (725.02243735, 272.24224123) and (725.44996228, 269.71022039) .. (724.72147307, 265.91333528)}
+% \end{macrocode}
+%
+% 年份“1905”。
+% \begin{macrocode}
+\def\fdulogo@emblem@new@one{%
+ (274.53952078, 192.6967679)
+ .. controls (276.90649749, 191.17738787) and (276.61091282, 188.42592116) .. (273.75447837, 183.97600496)
+ -- (250.35602597, 147.52456373)
+ .. controls (245.37245949, 139.76088014) and (242.44569971, 139.36684000) .. (233.01169676, 145.28890583)
+ -- (231.55309194, 143.01660820)
+ -- (267.05774249, 120.22590781)
+ -- (268.51634731, 122.49820545)
+ .. controls (260.02210251, 128.21810688) and (259.32418637, 130.67147132) .. (264.00387685, 137.96175957)
+ -- (298.64574144, 191.92882841)
+ -- (297.03619728, 192.96200682)
+ -- (266.55257519, 197.95733905)
+ -- (264.97241997, 195.49568328)
+ .. controls (266.79116106, 194.99667541) and (272.07786501, 194.27692313) .. (274.53952078, 192.6967679)}
+\def\fdulogo@emblem@new@nine{%
+ (346.53719503, 87.17026768)
+ .. controls (362.44194107, 86.72957443) and (370.45737301, 88.21059494) .. (380.22737659, 93.27206544)
+ .. controls (393.00061366, 99.87385110) and (401.02069729, 110.71391337) .. (403.43237633, 124.79726455)
+ .. controls (406.71757692, 143.98167207) and (398.66128891, 158.25957093) .. (383.13633486, 160.91811476)
+ .. controls (369.27476873, 163.29181460) and (357.41447084, 154.02251812) .. (354.81289581, 138.83024165)
+ .. controls (352.57212316, 125.74492323) and (359.14810987, 115.48728020) .. (371.23539553, 113.41741394)
+ .. controls (375.44931164, 112.69580918) and (378.42746538, 112.75654226) .. (381.68741805, 113.79631850)
+ .. controls (374.03262029, 97.75720684) and (363.55014714, 90.53485455) .. (347.03092460, 90.05347343)
+ (387.19655934, 133.96962358)
+ .. controls (386.68384018, 130.97552530) and (385.85438796, 127.46494357) .. (384.66717843, 122.53174856)
+ -- (383.84077127,1 19.70551161)
+ .. controls (383.52099316, 118.50468339) and (383.51185796, 116.45164907) .. (378.18901657, 117.36314981)
+ .. controls (371.31367978, 118.54050493) and (369.88353794, 125.51992491) .. (372.86490494, 142.93005197)
+ .. controls (375.06769840, 155.79358533) and (376.96809671, 158.89248601) .. (382.40183063, 157.96199567)
+ .. controls (387.61377949, 157.06948453) and (390.23489515, 151.71242822) .. (387.19655934, 133.96962358)}
+\def\fdulogo@emblem@new@zero{%
+ (468.53843186, 119.70741769)
+ .. controls (473.74690799, 97.12388612) and (487.76874274, 83.38513668) .. (502.34937235, 86.74789069)
+ .. controls (516.49148678, 90.00950924) and (523.24855517, 108.77145056) .. (518.16649836, 130.80683817)
+ .. controls (513.10972541, 152.73259697) and (498.65786882, 166.83401000) .. (484.51575438, 163.57239145)
+ .. controls (470.37363995, 160.31077290) and (463.58279437, 141.19466133) .. (468.53843186, 119.70741769)
+ (501.64142414, 89.81749692)
+ .. controls (496.15998444, 88.55330369) and (492.58528933, 94.54100910) .. (488.84327735, 110.76607062)
+ -- (483.05327233, 135.87106446)
+ .. controls (479.23540876, 152.42501236) and (479.85189169, 159.26387584) .. (485.11407380, 160.47750135)
+ .. controls (490.48588471, 161.71641072) and (494.24606002, 155.42510278) .. (497.96278832, 139.30967006)
+ -- (503.75279334, 114.20467623)
+ .. controls (507.94991488, 96.00629641) and (506.02657590, 90.82885151) .. (501.64142414, 89.81749692)}
+\def\fdulogo@emblem@new@five{%
+ (596.81323106, 144.25778675)
+ .. controls (593.53398643, 141.88060609) and (592.81646298, 137.88650017) .. (595.12761085, 134.69834567)
+ .. controls (598.62734904, 129.87056885) and (606.22172437, 130.51231652) .. (614.32874582, 136.38923538)
+ .. controls (629.35861705, 147.28464673) and (633.41288249, 164.11949675) .. (624.10225824, 176.96320489)
+ .. controls (617.23484744, 186.43657827) and (606.12245552, 189.49768961) .. (594.14661482, 185.12390882)
+ .. controls (589.95882917, 183.61665399) and (586.87090400, 181.93399782) .. (579.07134947, 176.97475918)
+ -- (575.72667581, 185.80578112)
+ -- (601.04973158, 204.16289844)
+ -- (596.58044201, 218.57075501)
+ -- (567.24942058, 197.30819466)
+ -- (581.19499276, 159.47691905)
+ .. controls (590.31078455, 165.11240378) and (594.44167660, 167.27320765) .. (599.37410141, 168.90338888)
+ .. controls (609.33004115, 172.22978413) and (617.92168735, 170.53738499) .. (622.27985189, 164.52543650)
+ .. controls (625.97768848, 159.42438929) and (624.87516584, 152.51098060) .. (619.77411864, 148.81314402)
+ .. controls (613.94435040, 144.58704507) and (603.28063019, 148.94611527) .. (596.81323106, 144.25778675)}
+% \end{macrocode}
+%
+% 内环。
+% \begin{macrocode}
+\def\fdulogo@emblem@new@ring@inner@i{%
+ (427.28478932, 410.40467342) circle [radius=241.88932729]}
+\def\fdulogo@emblem@new@ring@inner@ii{%
+ (427.28478932, 410.40467342) circle [radius=226.77199428]}
+% \end{macrocode}
+%
+% 外环。
+% \begin{macrocode}
+\def\fdulogo@emblem@new@ring@outer@i{%
+ (427.28478932, 410.40467342) circle [radius=359.05469569]}
+\def\fdulogo@emblem@new@ring@outer@ii{%
+ (427.28478932, 410.40467342) circle [radius=343.93732473]}
+% \end{macrocode}
+%
+% \paragraph{校训}
+%
+% 博。
+% \begin{macrocode}
+\def\fdulogo@motto@bo{%
+ (446.44078884, 999.91565267)
+ .. controls (447.61812214, 1000.07431933) and (456.16345526, 1001.95698595) .. (459.29012185, 1001.31565264)
+ .. controls (462.45812177, 1000.66498599) and (466.03678835, 997.51565273) .. (466.58345500, 994.39565281)
+ .. controls (466.94345499, 992.40898619) and (463.75145507, 988.95165295) .. (461.25012180, 987.90231964)
+ .. controls (452.27412203, 984.13831973) and (442.91278893, 980.49831982) .. (442.91278893, 980.49831982)
+ .. controls (442.83012226, 967.45698682) and (443.36478892, 968.93832011) .. (444.83012221, 956.91298708)
+ .. controls (446.84478883, 940.36898749) and (445.10745554, 926.59832117) .. (444.86612221, 909.79965492)
+ .. controls (444.24612223, 900.95698848) and (440.71412232, 902.67165510) .. (438.57945570, 901.24898847)
+ .. controls (434.45412247, 898.49832187) and (433.83012249, 894.41565531) .. (429.68345592, 901.04098848)
+ .. controls (426.80745600, 905.63832169) and (420.49412282, 921.06898798) .. (424.47678939, 936.04898760)
+ .. controls (429.10745594, 953.47165383) and (434.23278914, 978.47565321) .. (433.49678916, 979.24898652)
+ .. controls (432.91545584, 979.85965317) and (422.17945611, 977.18765324) .. (413.71812299, 974.91565330)
+ .. controls (406.57945650, 972.99965334) and (404.51812322, 974.85431996) .. (404.16345656, 976.97165324)
+ .. controls (402.99678993, 983.91565307) and (425.50345603, 995.32898612) .. (429.25012260, 996.32898609)
+ .. controls (430.26345591, 1003.82231924) and (427.74345597, 1012.83565235) .. (433.50345583, 1018.02231889)
+ .. controls (435.66345578, 1019.96898550) and (445.62345553, 1020.43565216) .. (447.27678882, 1014.63565230)
+ .. controls (448.91678878, 1008.86231911) and (447.44078881, 1006.90231916) .. (446.44078884, 999.91565267)
+ (504.16305406, 912.58232152)
+ .. controls (502.92838743, 909.46365493) and (498.38572087, 907.08232166) .. (494.82972096, 907.85965497)
+ .. controls (491.09905439, 908.67565495) and (482.10838795, 915.89165477) .. (480.82972131, 920.52632132)
+ .. controls (479.89638800, 923.90898790) and (488.12438780, 925.41565453) .. (489.60705443, 925.35965454)
+ .. controls (498.44038754, 925.02632121) and (501.60705413, 921.81565462) .. (502.99638743, 919.69298801)
+ .. controls (504.38572072, 917.57165473) and (505.21905404, 915.24898812) .. (504.16305406, 912.58232152)
+ (487.05198782, 975.33231995)
+ .. controls (487.49865448, 974.51765331) and (488.71198778, 974.55231997) .. (490.13598775, 974.72165330)
+ (485.82932119, 957.10565374)
+ .. controls (485.94132118, 952.99898718) and (484.68132122, 952.39632053) .. (483.66265458, 949.99898725)
+ .. controls (482.81865460, 948.00832064) and (481.70665462, 945.06965404) .. (480.71865465, 944.74965405)
+ (495.41332095, 1000.22165266)
+ .. controls (494.64398763, 1000.57898599) and (492.11598770, 998.61231937) .. (491.45465438, 997.29098607)
+ .. controls (490.95465439, 996.29098610) and (490.28798774, 993.45765283) .. (490.99598773, 992.91631951)
+ .. controls (491.70532104, 992.37365286) and (494.96932096, 994.68965280) .. (495.78798761, 996.16565277)
+ .. controls (496.77465425, 997.94298605) and (496.19065426, 999.86031934) .. (495.41332095, 1000.22165266)
+ (494.57998764, 976.58165325)
+ .. controls (495.53865428, 977.18698657) and (495.93332094, 978.03098655) .. (496.24665426, 979.35098652)
+ .. controls (496.74665425, 981.45498647) and (496.53865425, 983.79098641) .. (496.03865427, 984.41498639)
+ .. controls (495.54132094, 985.03631971) and (492.46798769, 984.60965305) .. (490.51598774, 983.77231974)
+ .. controls (489.52798776, 983.34831975) and (488.04798780, 982.33498644) .. (487.69065447, 981.66565313)
+ .. controls (487.11598782, 980.58698649) and (486.61598783, 976.12831993) .. (487.05198782, 975.33231995)
+ .. controls (487.49865448, 974.51765331) and (488.75465445, 974.33631998) .. (490.13598775, 974.72165330)
+ .. controls (492.30132103, 975.32565329) and (493.25332100, 975.74565328) .. (494.57998764, 976.58165325)
+ (520.88532031, 963.13765359)
+ .. controls (524.19465356, 967.71765348) and (523.08932026, 983.79631974) .. (523.80665357, 995.49498612)
+ .. controls (523.94532023, 997.75898606) and (525.24665354, 1006.99898583) .. (523.16265359, 1009.24831910)
+ .. controls (521.97332028, 1010.53365241) and (513.52398716, 1009.74831909) .. (511.99598720, 1008.30431913)
+ .. controls (509.65198726, 1006.08698585) and (508.88132061, 1000.42298599) .. (509.94132058, 1000.13765267)
+ .. controls (512.82932051, 999.36031935) and (513.82932049, 999.47098602) .. (513.82932049, 996.41631943)
+ .. controls (513.82932049, 990.90031956) and (509.78132059, 991.59898621) .. (509.92532059, 987.34565299)
+ .. controls (510.05198725, 983.63765308) and (513.54265383, 986.85098633) .. (514.74665380, 986.24965301)
+ .. controls (516.74665375, 985.24831970) and (517.45732040, 982.63365310) .. (517.66265373, 980.83231982)
+ .. controls (517.99598705, 977.91498655) and (517.02665374, 975.56431995) .. (514.49598714, 975.41498662)
+ .. controls (511.66265388, 975.24965329) and (510.16265391, 973.54832000) .. (510.07732058, 971.16565339)
+ .. controls (509.99598725, 968.91632011) and (514.39198714, 969.35098677) .. (515.66265378, 966.99898683)
+ .. controls (517.32932040, 963.91498690) and (518.41332037, 961.24832030) .. (520.88532031, 963.13765359)
+ (483.99598790, 899.66565518)
+ .. controls (487.24665449, 903.33232175) and (507.74665397, 888.08165547) .. (511.30265388, 891.05765539)
+ .. controls (513.19465384, 892.64032202) and (511.71865387, 906.86432166) .. (512.18665386, 913.54298816)
+ .. controls (512.63732052, 919.98832134) and (515.78532044, 933.76832099) .. (514.72265380, 935.48565428)
+ .. controls (514.09598715, 936.49632092) and (501.18798747, 932.59232102) .. (496.16265426, 931.74832104)
+ .. controls (488.43332112, 930.45098774) and (478.10798805, 930.19365441) .. (474.21865481, 929.24832110)
+ .. controls (468.21732163, 927.79098781) and (456.01998860, 919.60298801) .. (453.84132199, 924.58165455)
+ .. controls (450.99598873, 931.08165439) and (458.29332188, 935.63898761) .. (462.16265511, 936.91632091)
+ .. controls (464.67465505, 937.74432089) and (478.34665471, 939.01632086) .. (489.07998777, 940.41632083)
+ .. controls (496.60132092, 941.39632080) and (507.15598732, 942.95632076) .. (513.44132050, 944.02698740)
+ .. controls (516.05198710, 944.47098739) and (516.43465376, 948.35098729) .. (516.59732042, 951.64698721)
+ .. controls (516.77465375, 955.24832045) and (514.17465381, 955.60298711) .. (512.23198719, 956.74832042)
+ .. controls (509.83865392, 958.16032038) and (510.12132058, 960.30698699) .. (507.41332065, 960.49898699)
+ .. controls (504.66265405, 960.69365365) and (504.12798740, 957.67765373) .. (501.38532080, 957.74832039)
+ .. controls (498.16265421, 957.83232039) and (501.09598747, 966.30165351) .. (497.32932090, 969.33232010)
+ .. controls (495.62132094, 970.70698673) and (487.37598782, 970.38298674) .. (485.87065452, 969.15898677)
+ .. controls (484.53732122, 968.07632013) and (485.74398786, 960.27498700) .. (485.82932119, 957.10565374)
+ .. controls (485.94132118, 952.99898718) and (484.79198788, 952.31365386) .. (483.77465457, 949.91632059)
+ .. controls (482.92932126, 947.92432064) and (481.70665462, 945.06965404) .. (480.71865465, 944.74965405)
+ .. controls (478.66265470, 944.08298740) and (472.59065485, 949.98965392) .. (469.74132159, 953.72698716)
+ .. controls (466.61065500, 957.83232039) and (467.63465498, 960.38298699) .. (468.94132161, 967.91632014)
+ .. controls (469.49465493, 971.10832006) and (471.41332155, 977.09365324) .. (471.41332155, 981.08165314)
+ .. controls (471.41332155, 986.33231968) and (472.23865486, 991.96165287) .. (473.07998817, 995.74965278)
+ .. controls (474.03465482, 1000.04965267) and (477.52798806, 1001.20031931) .. (479.45465468, 999.91498600)
+ .. controls (481.82932129, 998.33231938) and (481.97598795, 990.93898623) .. (482.67732127, 990.00565292)
+ .. controls (483.66265458, 988.69365295) and (485.42132120, 987.09631966) .. (486.37998784, 994.39498614)
+ .. controls (486.58132117, 995.93498610) and (487.43332115, 998.91098603) .. (488.38532112, 1000.41498599)
+ .. controls (489.42265443, 1002.05631928) and (492.01598770, 1004.67098589) .. (492.99598768, 1005.52698586)
+ .. controls (496.49598759, 1008.58165245) and (496.16265426, 1011.02698573) .. (494.88532096, 1012.08165237)
+ .. controls (493.79065432, 1012.98698568) and (483.77465457, 1009.74831909) .. (481.49598796, 1012.91498568)
+ .. controls (480.45732132, 1014.36031898) and (485.74265452, 1020.96165215) .. (489.34398777, 1022.80698543)
+ .. controls (492.48532102, 1024.41631873) and (496.27465426, 1024.33098539) .. (496.44132092, 1025.88831869)
+ .. controls (497.03865424, 1031.49898522) and (496.94532091, 1036.76165175) .. (500.86265415, 1037.07631841)
+ .. controls (504.53998739, 1037.37098507) and (506.16265401, 1031.02698523) .. (506.94132066, 1030.86031856)
+ .. controls (508.01198730, 1030.63098524) and (512.47198719, 1032.08965187) .. (514.41332047, 1030.91631856)
+ .. controls (516.65865375, 1028.92031861) and (517.26398707, 1026.54031867) .. (516.80932041, 1023.91231874)
+ .. controls (516.31332043, 1021.04565214) and (512.73732051, 1017.26031890) .. (513.41332050, 1016.66565225)
+ .. controls (514.63465380, 1015.59231895) and (525.93465352, 1018.33498554) .. (532.07998670, 1014.33365231)
+ .. controls (535.66265328, 1012.00031904) and (535.94265327, 1009.57498576) .. (536.58665325, 1005.58165253)
+ .. controls (538.77465320, 992.02698620) and (540.78798648, 985.29098637) .. (541.55198646, 979.91631984)
+ .. controls (542.38265311, 974.06965332) and (543.99598640, 967.41632015) .. (540.91331981, 961.91498695)
+ .. controls (539.51465318, 959.42032035) and (536.03465327, 957.03232041) .. (533.41332000, 954.83232047)
+ .. controls (531.54665338, 953.26565384) and (529.13465344, 949.64698726) .. (533.18265334, 950.15232058)
+ .. controls (536.95465324, 950.62432057) and (541.92398645, 952.08032053) .. (549.91331959, 953.24965384)
+ .. controls (555.96931943, 954.13498715) and (570.27465241, 955.47098712) .. (571.20665239, 949.68432059)
+ .. controls (571.71865237, 946.50965401) and (568.74398578, 945.94832069) .. (565.86131919, 945.04432071)
+ .. controls (563.78798591, 944.39498739) and (561.29065263, 942.25898745) .. (557.24665274, 941.41632080)
+ .. controls (551.87198620, 940.29498750) and (544.23198639, 941.14698747) .. (540.16265316, 940.83232082)
+ .. controls (532.11198670, 940.20965416) and (526.47332017, 939.24965419) .. (524.99598688, 938.02698755)
+ .. controls (523.46798691, 936.76298758) and (524.03465357, 929.96565442) .. (525.66265353, 923.74832124)
+ .. controls (528.00398680, 914.80965480) and (531.32265338, 900.78298848) .. (531.09598672, 891.45898872)
+ .. controls (530.84665340, 881.19365564) and (521.08132031, 876.64032242) .. (510.91332056, 877.16565574)
+ .. controls (501.17598747, 877.66832239) and (499.74665417, 883.16565559) .. (492.26265436, 888.25898880)
+ .. controls (486.28665451, 892.32432203) and (482.35332127, 897.81098856) .. (483.99598790, 899.66565518)
+ (534.55198664, 1039.13791836)
+ .. controls (543.04798642, 1039.49258502) and (549.71998626, 1035.34591845) .. (549.16265294, 1026.74725200)
+ .. controls (548.87598628, 1022.31791878) and (542.22665311, 1014.58591897) .. (540.43598649, 1014.33258564)
+ .. controls (538.85731986, 1014.10991898) and (526.66265350, 1026.91525200) .. (524.09732023, 1031.66991854)
+ .. controls (523.03732026, 1033.63525183) and (529.21865344, 1038.91525170) .. (534.55198664, 1039.13791836)}
+% \end{macrocode}
+%
+% 学。
+% \begin{macrocode}
+\def\fdulogo@motto@xue{%
+ (441.96958895, 769.22205844)
+ .. controls (449.34558877, 772.01539170) and (456.88558858, 744.13805907) .. (451.85358870, 731.95805937)
+ .. controls (450.76292206, 729.32072610) and (447.74692214, 726.46339284) .. (444.82958888, 726.49939284)
+ .. controls (442.41225561, 726.52872617) and (439.10692236, 728.52739279) .. (438.10692238, 733.74872599)
+ .. controls (437.51892240, 736.82472592) and (439.10692236, 768.13805847) .. (441.96958895, 769.22205844)
+ (527.62132014, 755.16565879)
+ .. controls (527.63065348, 757.19099207) and (526.74665350, 758.41632538) .. (525.24665354, 758.12432538)
+ .. controls (523.81998690, 757.84699206) and (522.13065361, 756.10565877) .. (522.80132026, 753.97099215)
+ .. controls (523.57998691, 751.49899222) and (525.21865354, 750.05499225) .. (525.78798686, 750.20699225)
+ .. controls (526.35732017, 750.36032558) and (527.60798681, 752.33232553) .. (527.62132014, 755.16565879)
+ (487.79865447, 742.41365911)
+ .. controls (490.32932108, 743.13765909) and (486.96798783, 751.05499223) .. (486.33998784, 750.40299224)
+ .. controls (485.70532119, 749.74565893) and (485.20932120, 747.66165898) .. (485.16265454, 746.41632568)
+ .. controls (485.05198787, 743.41499242) and (484.87332121, 741.57765913) .. (487.79865447, 742.41365911)
+ (493.82932099, 758.16565872)
+ .. controls (496.82932091, 757.58165873) and (496.82932091, 760.87365865) .. (496.78132091, 762.59099194)
+ .. controls (496.73332092, 764.27499190) and (496.70532092, 764.91499188) .. (495.07998762, 765.24832520)
+ .. controls (494.02932098, 765.46432520) and (491.57998771, 765.20699187) .. (490.20532108, 763.41499192)
+ .. controls (489.97198775, 763.11365859) and (489.53865443, 761.12432531) .. (489.82932109, 760.33232533)
+ .. controls (490.27998774, 759.10832536) and (492.20532103, 758.48165871) .. (493.82932099, 758.16565872)
+ (490.89598773, 727.51099281)
+ .. controls (489.52532110, 726.15365952) and (488.32932113, 724.58299289) .. (490.78798773, 724.49899289)
+ .. controls (493.61998766, 724.40299289) and (501.82932079, 726.29099285) .. (503.57998741, 727.16565949)
+ .. controls (504.53465405, 727.64299281) and (506.07998735, 730.58299274) .. (502.34532077, 731.84565937)
+ .. controls (498.24932088, 733.23365934) and (492.55065435, 729.14832611) .. (490.89598773, 727.51099281)
+ (536.09598660, 719.86165967)
+ .. controls (533.92931999, 720.36432633) and (512.19865386, 716.67765975) .. (499.91332084, 714.49899314)
+ .. controls (481.93332129, 711.31099322) and (470.32932158, 708.16565997) .. (462.88532176, 705.36032670)
+ .. controls (458.57198854, 703.73499341) and (445.98265552, 698.81366020) .. (440.94132231, 691.36032705)
+ .. controls (439.66265568, 689.47099377) and (439.80798900, 683.43632725) .. (439.44398901, 681.91632729)
+ .. controls (438.88532236, 679.58299401) and (437.19065574, 678.58432737) .. (434.18265581, 678.02299405)
+ .. controls (426.91332266, 676.66566075) and (419.64398951, 682.58299394) .. (419.66265618, 689.86032709)
+ .. controls (419.68532284, 698.31632688) and (425.60798936, 703.41499342) .. (429.55332259, 706.96966000)
+ .. controls (433.74398916, 710.74565990) and (447.44132215, 720.13765967) .. (448.70532212, 718.47099304)
+ .. controls (449.57065543, 717.33099307) and (444.53465555, 711.52699321) .. (445.32932220, 709.80432659)
+ .. controls (445.73732219, 708.92032661) and (451.32132205, 711.04432656) .. (452.85598868, 711.66432654)
+ .. controls (455.20532195, 712.61232652) and (461.95198845, 715.57632645) .. (463.49598841, 716.52699309)
+ .. controls (464.21865506, 716.97099308) and (462.32932178, 717.99899305) .. (460.57998849, 724.16565957)
+ .. controls (459.75065517, 727.08832616) and (459.89332184, 733.08832601) .. (460.10798850, 736.99765924)
+ .. controls (460.41332182, 742.58165910) and (461.99598845, 743.69365908) .. (462.88532176, 750.13765892)
+ .. controls (463.40932175, 753.94165882) and (463.21332175, 758.85099203) .. (463.24665509, 763.49899192)
+ .. controls (463.28798842, 769.28832510) and (462.91332176, 776.79099158) .. (461.28798847, 779.58165818)
+ .. controls (459.10398852, 783.33499142) and (459.16265519, 785.41499137) .. (461.56398846, 787.06165799)
+ .. controls (463.69598841, 788.52299129) and (467.03998832, 789.16299127) .. (469.55865493, 788.64032462)
+ .. controls (471.07332156, 788.32565796) and (473.38532150, 787.30432465) .. (472.97198818, 783.31899142)
+ .. controls (472.81198818, 781.77632479) and (471.38532155, 779.80432484) .. (470.74665490, 777.16565824)
+ .. controls (469.54398826, 772.19899170) and (468.71732162, 766.42432518) .. (468.66265495, 761.49899197)
+ .. controls (468.61732162, 757.31899207) and (472.82932151, 758.83232537) .. (473.66265483, 752.13765887)
+ .. controls (474.53732147, 745.11632571) and (474.95732146, 736.34032593) .. (474.99598813, 730.97099273)
+ .. controls (475.05465479, 722.92565960) and (474.30932148, 719.34165969) .. (474.71865480, 719.36032635)
+ .. controls (476.88398808, 719.45899302) and (483.88532124, 721.52699296) .. (483.99598790, 723.16565959)
+ .. controls (484.12798790, 725.10699287) and (480.57732132, 724.27899290) .. (479.80532134, 726.25499285)
+ .. controls (478.07998805, 730.66565940) and (478.49598804, 745.20699237) .. (479.41332135, 752.24832553)
+ .. controls (479.91865467, 756.13365877) and (480.64132132, 758.04299205) .. (480.78798798, 760.54032532)
+ .. controls (480.97598798, 763.72832524) and (480.49598799, 766.24965851) .. (480.70398798, 770.04032508)
+ .. controls (480.98932131, 775.22965829) and (484.05465457, 781.59499146) .. (485.17732120, 786.51099134)
+ .. controls (486.52398784, 792.40965786) and (487.44132115, 797.87499106) .. (496.07598760, 795.66699111)
+ .. controls (502.05198745, 794.13765782) and (500.72532082, 787.43099132) .. (499.95332083, 782.88432476)
+ .. controls (499.41332085, 779.70699151) and (496.60798758, 777.52699156) .. (497.66265423, 772.69365835)
+ .. controls (498.08265421, 770.77499173) and (501.99598745, 773.30432500) .. (506.21865401, 772.08299170)
+ .. controls (507.91465397, 771.59099171) and (508.25598729, 765.93632519) .. (508.05198730, 761.08165864)
+ .. controls (507.97332063, 759.21765869) and (507.81465397, 752.69899219) .. (507.82932064, 751.83232554)
+ .. controls (507.88532064, 748.66565895) and (511.99598720, 749.74965893) .. (512.80132051, 745.85232569)
+ .. controls (513.32798717, 743.29499242) and (513.53598716, 740.52565916) .. (513.21865384, 737.63765923)
+ .. controls (512.96798718, 735.35632595) and (510.01598725, 735.36832595) .. (509.66265393, 733.80432599)
+ .. controls (509.16398727, 731.59099271) and (508.98532061, 729.32832610) .. (510.21865391, 729.24965944)
+ .. controls (512.19065386, 729.12299277) and (519.91332034, 729.80432609) .. (525.11465354, 731.78299271)
+ .. controls (526.53998684, 732.32565936) and (525.49598686, 735.12432596) .. (523.71865357, 736.80432592)
+ .. controls (522.23465361, 738.20699255) and (521.82932029, 738.29099255) .. (519.10798702, 743.69365908)
+ .. controls (517.51465373, 746.85499233) and (515.41065378, 753.78565882) .. (515.16265379, 756.63765875)
+ .. controls (514.96132046, 758.96965870) and (517.07998707, 759.16032536) .. (517.83598705, 759.73765868)
+ .. controls (518.54398704, 760.28032533) and (518.53732037, 762.00432529) .. (518.32932038, 763.13765859)
+ .. controls (517.97332038, 765.08032521) and (515.11598712, 764.31099189) .. (514.99598713, 765.47099187)
+ .. controls (514.44132047, 770.86032506) and (518.88532036, 773.13765834) .. (522.85865360, 772.50165836)
+ .. controls (526.36132017, 771.94032504) and (529.00532011, 768.54165846) .. (530.20398674, 769.87365842)
+ .. controls (531.70532004, 771.54032505) and (531.45465338, 780.09632483) .. (531.03865339, 782.70699143)
+ .. controls (530.82532006, 784.04299140) and (528.88932011, 783.82299141) .. (527.10798682, 783.47099142)
+ .. controls (523.13732025, 782.68699144) and (517.91998705, 780.70699148) .. (517.25465374, 781.47899147)
+ .. controls (515.95998710, 782.98432476) and (521.16265364, 794.74832447) .. (531.75198671, 795.31232445)
+ .. controls (539.35731985, 795.71765778) and (542.37465311, 791.12832456) .. (544.21198639, 783.24565809)
+ .. controls (546.43865301, 773.70032499) and (548.21865296, 762.08165862) .. (546.05198635, 752.02699220)
+ .. controls (545.21331970, 748.13499230) and (539.41331985, 740.49899249) .. (535.16265329, 737.49899257)
+ .. controls (532.96798668, 735.94965927) and (532.85998668, 732.85099268) .. (533.66265333, 732.97099268)
+ .. controls (544.88531971, 734.64965930) and (554.99598613, 736.24832593) .. (566.55731917, 727.45899282)
+ .. controls (574.73198563, 721.24432630) and (574.61065230, 714.82165980) .. (565.06798587, 710.35899324)
+ .. controls (557.28265273, 706.71766000) and (548.89731961, 704.19232673) .. (540.56131982, 701.98566012)
+ .. controls (537.63065323, 701.20832681) and (531.57998671, 699.49899352) .. (529.82932009, 701.83232679)
+ .. controls (527.94265347, 704.34832673) and (531.13465339, 710.47632657) .. (533.77598666, 713.74832649)
+ .. controls (536.73998658, 717.41899307) and (539.21865319, 719.13765969) .. (536.09598660, 719.86165967)
+ (490.44078774, 696.97126024)
+ .. controls (487.89412114, 695.43659362) and (486.00745452, 693.61259366) .. (483.05145459, 690.91526040)
+ .. controls (482.00212128, 689.95792709) and (479.99412133, 686.74859383) .. (476.99678808, 685.85526052)
+ .. controls (474.50212147, 685.11126054) and (471.99678820, 687.91526047) .. (471.27412155, 690.13792708)
+ .. controls (470.29012158, 693.16726034) and (470.77412156, 698.66992687) .. (473.10745484, 699.75259351)
+ .. controls (475.92345477, 701.06059348) and (480.03812133, 700.83259348) .. (484.24612123, 702.16592678)
+ .. controls (488.11945446, 703.39259342) and (490.63545440, 704.66459339) .. (494.55945430, 706.37126001)
+ .. controls (501.39412080, 709.34459327) and (506.33012068, 710.69392657) .. (511.83012054, 710.69392657)
+ .. controls (518.55145370, 710.69392657) and (525.10078687, 706.36059334) .. (525.10745354, 702.91526010)
+ .. controls (525.12078687, 695.37392695) and (519.03145369, 693.97259365) .. (515.51145378, 691.53392705)
+ .. controls (512.77412051, 689.63792709) and (514.33012048, 683.41526058) .. (517.43545373, 684.01659390)
+ .. controls (521.96345362, 684.89126055) and (530.48745340, 684.91926055) .. (534.16345331, 684.74859388)
+ .. controls (540.16345316, 684.47126056) and (544.93145304, 682.47126061) .. (544.91278638, 679.08192736)
+ .. controls (544.89145304, 674.88592746) and (542.62745310, 670.13126092) .. (537.38478657, 667.86059431)
+ .. controls (533.95411998, 666.37392768) and (528.09945346, 667.61526098) .. (527.33012015, 666.41526101)
+ .. controls (526.74745350, 665.50859436) and (527.69012014, 659.94859450) .. (527.57945348, 654.74859463)
+ .. controls (527.48878681, 650.44326141) and (527.17945349, 646.96726150) .. (524.66345355, 643.13792826)
+ .. controls (522.54345360, 639.91259500) and (518.18478705, 633.90859515) .. (512.33012053, 628.91526195)
+ .. controls (507.59412064, 624.87659538) and (503.12078742, 621.70726213) .. (497.83012089, 621.70726213)
+ .. controls (490.16345441, 621.70726213) and (480.87145464, 628.54059529) .. (474.33012148, 633.99926182)
+ .. controls (465.15278837, 641.65526163) and (458.24612188, 649.79126142) .. (460.33012183, 651.91526137)
+ .. controls (461.24745514, 652.85126135) and (466.77545500, 651.87659471) .. (472.66345485, 649.87392809)
+ .. controls (476.99412141, 648.40059479) and (490.94878773, 639.93526167) .. (494.03145432, 638.97659503)
+ .. controls (497.28612090, 637.96459505) and (503.92612074, 644.68592822) .. (504.99678738, 654.41526131)
+ .. controls (505.51012070, 659.08192786) and (506.02078735, 671.32592755) .. (504.33012073, 671.02726089)
+ .. controls (500.71812082, 670.38859424) and (473.93678815, 661.41259447) .. (470.49678824, 659.97126117)
+ .. controls (468.10478830, 658.96992786) and (461.67145512, 656.10059460) .. (459.38478852, 655.02726129)
+ .. controls (455.24612195, 653.08192801) and (447.97945547, 653.66192799) .. (448.78745545, 661.70326113)
+ .. controls (449.37012210, 667.50326098) and (450.90078873, 671.64459421) .. (459.08745519, 672.16859420)
+ .. controls (472.32078819, 673.01792751) and (499.05412086, 678.70992737) .. (501.03812081, 679.37392735)
+ .. controls (501.72345412, 679.60326068) and (499.70478751, 682.41526061) .. (497.16345424, 685.47126053)
+ .. controls (495.04878762, 688.01259380) and (493.23012100, 689.90592709) .. (493.24612100, 692.20726036)
+ .. controls (493.27412100, 696.13792693) and (504.57145405, 694.69926030) .. (506.05145402, 695.91526027)
+ .. controls (507.53278731, 697.13259357) and (508.72078728, 701.09259348) .. (506.99678733, 701.52726013)
+ .. controls (502.35812077, 702.69392677) and (494.49678764, 699.41526018) .. (490.44078774, 696.97126024)}
+% \end{macrocode}
+%
+% 而。
+% \begin{macrocode}
+\def\fdulogo@motto@er@i{%
+ (461.66398846, 521.23979797)
+ .. controls (458.99598853, 527.08246449) and (472.53065485, 539.48513085) .. (475.21865479, 544.85979738)
+ .. controls (476.99598808, 548.41579729) and (475.94132143, 551.52646388) .. (472.38532152, 549.41579727)
+ .. controls (469.05465494, 547.43846398) and (458.63332187, 543.46246408) .. (456.42132192, 547.74913064)
+ .. controls (454.32932198, 551.80513054) and (460.82932181, 560.35979699) .. (466.95065499, 564.42246356)
+ .. controls (473.84532149, 568.99713011) and (490.41865441, 577.49579657) .. (502.87198743, 569.37446343)
+ .. controls (511.49598721, 563.74913024) and (511.32932055, 558.33179704) .. (505.56532069, 552.93046385)
+ .. controls (501.92398745, 549.51846393) and (496.83465425, 546.36113068) .. (493.24665434, 543.41579742)
+ .. controls (485.96265452, 537.43446423) and (478.11865471, 528.56513112) .. (473.66132149, 524.41713123)
+ .. controls (469.71865492, 520.74779798) and (462.48265510, 519.44779802) .. (461.66398846, 521.23979797)
+ (546.32931968, 518.98566469)
+ .. controls (546.61998633, 523.10033126) and (546.32931968, 527.41633115) .. (542.66265310, 527.65633114)
+ .. controls (537.49065323, 527.99499780) and (510.67465390, 525.49633120) .. (509.65598726, 521.49899797)
+ .. controls (508.91332061, 518.58299804) and (515.44132045, 517.13766474) .. (518.57998704, 507.58299831)
+ .. controls (520.01065367, 503.22566509) and (518.96798703, 496.66566525) .. (520.91332031, 494.33233198)
+ .. controls (523.59598691, 491.11366539) and (528.76398678, 488.95766545) .. (531.66265338, 488.08299880)
+ .. controls (534.60798663, 487.19366549) and (536.81465325, 490.43366541) .. (539.74665317, 494.83233197)
+ .. controls (544.41331972, 501.83233179) and (545.82931969, 511.90299821) .. (546.32931968, 518.98566469)
+ (498.49732087, 530.70833107)
+ .. controls (508.24665396, 533.74966433) and (529.91465342, 538.43633088) .. (543.32931975, 539.08299753)
+ .. controls (556.60798608, 539.72166418) and (567.39998582, 534.18699765) .. (568.66265245, 525.86033119)
+ .. controls (570.82931906, 511.58299821) and (570.88531906, 504.47099839) .. (563.89731924, 491.04966539)
+ .. controls (561.09331931, 485.66433219) and (556.52665275, 481.04699898) .. (551.93198620, 477.05099908)
+ .. controls (545.75065302, 471.67499921) and (541.49731980, 470.89633256) .. (536.21865326, 470.58299924)
+ .. controls (526.88532016, 470.02699925) and (520.67332032, 480.32966566) .. (518.57998704, 480.24966566)
+ .. controls (514.24665381, 480.08299900) and (511.57998721, 464.91633271) .. (506.83732066, 462.48966611)
+ .. controls (504.57865405, 461.33366614) and (502.17065411, 462.86433276) .. (501.41332080, 467.08299933)
+ .. controls (500.24665416, 473.58299916) and (500.84265415, 491.84966537) .. (500.22265416, 499.16699852)
+ .. controls (499.82932084, 503.80433174) and (495.77065427, 504.87633171) .. (495.12532096, 503.36833175)
+ .. controls (494.05198765, 500.86033181) and (495.27465428, 494.91633196) .. (494.46798764, 489.60966543)
+ .. controls (493.74532099, 484.84699888) and (490.16265441, 482.50299894) .. (487.44132115, 482.02699895)
+ .. controls (485.21065454, 481.63633230) and (481.55198796, 482.52699894) .. (479.49598801, 488.63766545)
+ .. controls (476.59865475, 497.25499857) and (477.41198806, 510.16433158) .. (483.77465457, 510.58299824)
+ .. controls (487.57998781, 510.83233157) and (490.55465440, 506.33366501) .. (491.91865437, 507.90699830)
+ .. controls (493.66265433, 509.91633159) and (496.05332093, 517.31233140) .. (493.71865432, 517.91633139)
+ .. controls (492.40132102, 518.25633138) and (485.25598787, 515.80299811) .. (477.91332139, 511.91633154)
+ .. controls (470.44398824, 507.96166497) and (463.58798841, 501.50166513) .. (460.88532181, 496.24966526)
+ .. controls (458.21998854, 491.07099873) and (459.75598851, 486.31899884) .. (459.16265519, 480.33233233)
+ .. controls (458.32932188, 471.91633254) and (452.09198870, 467.21099932) .. (447.79465547, 466.89633266)
+ .. controls (443.49598891, 466.58299934) and (437.99598905, 472.24966586) .. (437.07198907, 480.16566567)
+ .. controls (436.15998910, 487.98166547) and (437.70132239, 497.62033190) .. (439.57998901, 505.83233169)
+ .. controls (440.57998899, 510.20566491) and (443.49065558, 518.47899804) .. (447.27465548, 518.52699804)
+ .. controls (451.60798871, 518.58299804) and (455.63332194, 506.69366500) .. (457.10798857, 506.91633166)
+ .. controls (460.49598849, 507.42699832) and (467.16265499, 515.36433145) .. (471.71865487, 518.30433138)
+ .. controls (477.82932139, 522.24966461) and (485.80665452, 526.74966450) .. (498.49732087, 530.70833107)}
+% \end{macrocode}
+%
+% 笃。
+% \begin{macrocode}
+\def\fdulogo@motto@du{%
+ (491.26185439,364.0330019)
+ .. controls (490.21918774, 365.05433521) and (485.86052119, 365.21300187) .. (483.96852123, 364.85966855)
+ .. controls (482.05785462, 364.50366856) and (480.77652131, 361.88100196) .. (482.45518794, 361.16633531)
+ .. controls (484.01785457, 360.49966866) and (488.39652112, 360.37033533) .. (489.88185442, 360.56766866)
+ .. controls (491.13118772, 360.73433532) and (491.72185437, 363.58233525) .. (491.26185439, 364.03300190)
+ (498.07918755, 309.24900327)
+ .. controls (495.40718761, 308.81433662) and (494.07918765, 307.79033664) .. (494.82985430, 305.12367004)
+ .. controls (495.38718762, 303.13967009) and (497.10052091, 300.70767015) .. (499.20452085, 301.35300347)
+ .. controls (500.60318748, 301.78233679) and (501.00318747, 302.68633677) .. (501.07918747, 304.95700338)
+ .. controls (501.16318747, 307.43700332) and (499.87118750, 309.54100326) .. (498.07918755, 309.24900327)
+ (513.70452049, 390.37433458)
+ .. controls (513.75385382, 392.10633453) and (512.80585385, 393.27566784) .. (510.68052057, 391.91433454)
+ .. controls (509.81918725, 391.36366789) and (508.63385395, 389.53966793) .. (507.32985398, 387.94366797)
+ .. controls (506.33518734, 386.72633467) and (505.35785403, 385.49300137) .. (504.91252071, 384.44366806)
+ .. controls (503.66318741, 381.49966813) and (505.89252069, 379.53300151) .. (508.24585396, 381.02633481)
+ .. controls (509.30718727, 381.69966813) and (509.86718725, 383.61700141) .. (510.91252056, 385.24900137)
+ .. controls (512.14452053, 387.17166799) and (513.66318716, 388.91566795) .. (513.70452049, 390.37433458)
+ (496.44052092, 347.91566897)
+ .. controls (493.14852100, 342.35966911) and (487.07918782, 342.66633577) .. (482.74585460, 346.08233568)
+ .. controls (477.92052139, 349.88766892) and (479.77385467, 357.30233540) .. (477.27518807, 357.35700207)
+ .. controls (474.57918814, 357.41566873) and (474.95785479, 352.38100219) .. (474.49652147, 351.44366888)
+ .. controls (473.63518816, 349.69300226) and (471.25918822, 350.27033558) .. (468.88585494, 349.97166892)
+ .. controls (465.80185502, 349.58233560) and (465.21918837, 348.16633563) .. (463.74585507, 348.30500229)
+ .. controls (461.03252181, 348.56100229) and (460.10718850, 349.27700227) .. (457.91252189, 349.74900226)
+ .. controls (455.31252195, 350.30900224) and (450.94052206, 349.41566893) .. (450.44052207, 355.63833544)
+ .. controls (449.97918875, 361.37833530) and (454.17918865, 365.29966854) .. (457.82985522, 371.66633504)
+ .. controls (460.86985514, 376.96633491) and (461.78852179, 382.66633477) .. (464.32985506, 384.74900138)
+ .. controls (466.36718834, 386.41966801) and (469.16852160, 385.19700137) .. (471.32985488, 385.66633469)
+ .. controls (473.82985482, 386.20766801) and (475.22452145, 387.77966797) .. (476.57918809, 387.74900131)
+ .. controls (482.69918793, 387.61433465) and (483.38585458, 381.13833481) .. (488.16318780, 381.08233481)
+ .. controls (493.07652101, 381.02500148) and (506.05252068, 393.85966782) .. (511.32985388, 398.63833437)
+ .. controls (516.60718708, 403.41566758) and (526.18318685, 412.05033403) .. (534.27385331, 405.24900087)
+ .. controls (535.89118660, 403.88900091) and (538.52051987, 400.89300098) .. (538.27385321, 398.02633439)
+ .. controls (537.66318656, 390.91566790) and (529.43385343, 387.95833464) .. (531.07918672, 384.66633472)
+ .. controls (531.99652003, 382.83300143) and (536.99651991, 384.30500139) .. (541.85385312, 382.19700145)
+ .. controls (548.41118629, 379.35166819) and (549.44051960, 373.19300167) .. (542.82985310, 368.24900180)
+ .. controls (537.34718657, 364.14900190) and (531.04452006, 363.72500191) .. (534.22051998, 357.18633541)
+ .. controls (536.05251993, 353.41566883) and (536.30451993, 350.42900224) .. (533.28318667, 347.61433565)
+ .. controls (530.38585341, 344.91566905) and (525.47118686, 346.40500234) .. (524.07918690, 344.74900238)
+ .. controls (522.23518694, 342.55433577) and (525.44052020, 341.22233581) .. (525.32985353, 337.02633591)
+ .. controls (525.21918687, 332.80500268) and (517.32985373, 332.35966936) .. (517.32985373, 329.91566942)
+ .. controls (517.32985373, 328.06100280) and (517.00452041, 326.62233617) .. (518.37918704, 326.18100285)
+ .. controls (520.82985365, 325.39433620) and (525.69518686, 326.30766951) .. (526.10052018, 323.50233625)
+ .. controls (526.45118684, 321.08766964) and (526.44052017, 316.61033642) .. (524.99652021, 315.74900311)
+ .. controls (523.49385358, 314.85300313) and (520.01518700, 315.67166978) .. (519.57118701, 314.44900314)
+ .. controls (519.19785369, 313.42366983) and (519.28585368, 311.29433655) .. (520.05252033, 311.08233656)
+ .. controls (522.37385361, 310.43966991) and (526.12985351, 311.77966987) .. (528.99652011, 311.58233655)
+ .. controls (531.51518671, 311.40900322) and (532.50452002, 309.87300326) .. (532.45518669, 306.41567001)
+ .. controls (532.34852002, 299.02367019) and (526.09652018, 299.02900353) .. (522.49652027, 296.83300358)
+ .. controls (519.28852035, 294.87433696) and (518.28852038, 288.99967044) .. (521.06585364, 287.72500381)
+ .. controls (523.74318691, 286.49567051) and (532.77652001, 291.14233706) .. (541.38585313, 293.85967032)
+ .. controls (548.53651962, 296.11700360) and (554.31251948, 297.13300357) .. (560.75918598, 297.13833691)
+ .. controls (572.57651902, 297.14767024) and (579.51918551, 289.53033710) .. (579.20318552, 278.51967071)
+ .. controls (578.60185220, 257.56100456) and (564.04051923, 237.39967173) .. (545.09118637, 229.35300527)
+ .. controls (532.67518668, 224.07967207) and (522.02318695, 225.81567202) .. (513.44052050, 235.58233845)
+ .. controls (507.82985397, 241.96900495) and (499.03252086, 249.68633809) .. (496.38585426, 249.35967144)
+ .. controls (493.72185432, 249.03300478) and (482.01785462, 246.01167152) .. (473.93118815, 244.41033823)
+ .. controls (466.41918834, 242.92233826) and (446.60718883, 239.41567168) .. (436.60718908, 238.35967171)
+ .. controls (432.82718918, 237.96100505) and (431.32985588, 236.49967176) .. (428.49652262, 236.41567176)
+ .. controls (425.05652271, 236.31433843) and (422.24585611, 237.95700505) .. (419.66318951, 241.66633829)
+ .. controls (417.99918955, 244.05433823) and (416.92052291, 247.78500481) .. (417.28852290, 251.12367139)
+ .. controls (417.70452289, 254.91567130) and (421.87918945, 256.95833791) .. (428.66318928, 257.62367123)
+ .. controls (436.16318910, 258.35967121) and (438.25385571, 256.52100459) .. (446.88985549, 256.70900458)
+ .. controls (453.82985532, 256.85967125) and (472.74585485, 258.33300454) .. (481.45518796, 259.49967118)
+ .. controls (483.41785458, 259.76233784) and (485.44185453, 260.25567116) .. (486.83252116, 260.77167115)
+ .. controls (487.26585449, 260.93167115) and (485.01252121, 265.87167102) .. (485.82985452, 266.08233768)
+ .. controls (487.77385447, 266.58233767) and (492.26718769, 263.18367109) .. (494.82985430, 263.58233775)
+ .. controls (501.17118747, 264.57167105) and (510.05785392, 265.77833769) .. (516.13518710, 266.74900433)
+ .. controls (523.76585357, 267.96767097) and (532.82985335, 268.13833763) .. (533.53518666, 265.93967102)
+ .. controls (534.00451998, 264.47833772) and (528.48852012, 260.62500449) .. (522.77385360, 257.91567122)
+ .. controls (517.58452039, 255.45567128) and (511.47918721, 254.14900465) .. (512.32985386, 253.49967133)
+ .. controls (513.60185383, 252.52767136) and (530.44452007, 246.09833818) .. (534.49651997, 247.08233816)
+ .. controls (537.41251990, 247.79033814) and (543.77785307, 254.45700464) .. (549.55251959, 264.91567105)
+ .. controls (553.81251949, 272.63167085) and (558.50718604, 288.15433713) .. (556.57918609, 289.33300377)
+ .. controls (554.65251947, 290.51033707) and (541.27785313, 286.57700384) .. (534.14051998, 284.39833723)
+ .. controls (520.45918699, 279.91300400) and (507.27385398, 274.85967080) .. (492.93518768, 271.51167088)
+ .. controls (488.76185445, 270.53700424) and (481.10718797, 269.69567093) .. (478.88585469, 272.91567085)
+ .. controls (476.11518810, 276.93033741) and (476.04052143, 285.11433721) .. (476.32985476, 293.16633701)
+ .. controls (476.60852142, 300.93567015) and (477.15518807, 308.58766995) .. (479.77385467, 311.91566987)
+ .. controls (482.19918795, 314.99700313) and (490.84052106, 317.42366973) .. (493.74585432, 318.08233638)
+ .. controls (499.99652083, 319.49966968) and (498.51652087, 322.47033627) .. (498.51652087, 325.80500286)
+ .. controls (498.51652087, 328.13833613) and (494.71918763, 327.13833616) .. (490.66318773, 327.91566947)
+ .. controls (487.01652116, 328.61566945) and (485.28718787, 332.57566935) .. (489.75652109, 337.50100257)
+ .. controls (491.45918771, 339.37833585) and (495.38585428, 341.74900246) .. (496.49652092, 342.41566911)
+ .. controls (497.60718756, 343.08233576) and (503.04452076, 345.68900236) .. (507.21918732, 346.13833568)
+ .. controls (512.50318719, 346.70500233) and (514.66318713, 346.02633569) .. (517.44052040, 347.52633565)
+ .. controls (521.31518697, 349.61966893) and (521.26318697, 364.89166855) .. (520.91252031, 366.74900183)
+ .. controls (520.44185366, 369.25033510) and (515.92585377, 366.09566852) .. (514.05252048, 366.47166851)
+ .. controls (509.62585393, 367.47966848) and (507.55252064, 370.80500173) .. (503.71918741, 370.02633509)
+ .. controls (498.80452086, 369.03033511) and (495.55652094, 362.61833527) .. (495.71652094, 357.26366874)
+ .. controls (495.84185427, 353.03433551) and (499.10718752, 352.41566886) .. (496.44052092, 347.91566897)}
+% \end{macrocode}
+%
+% 志。
+% \begin{macrocode}
+\def\fdulogo@motto@zhi{%
+ (512.24638719, 153.66567383)
+ .. controls (512.47838719, 150.62834057) and (511.49705388, 146.99900733) .. (513.74638716, 147.41634065)
+ .. controls (518.23038704, 148.24567396) and (526.40638684, 149.32967394) .. (527.24638682, 145.37367403)
+ .. controls (527.95438680, 142.04034078) and (528.16238680, 138.71500753) .. (523.77438691, 135.19367429)
+ .. controls (520.66372032, 132.69767435) and (517.50372040, 132.90034101) .. (515.55172044, 130.47100774)
+ .. controls (513.99438715, 128.53500779) and (513.96905382, 119.16567469) .. (516.77438708, 119.63767468)
+ .. controls (519.48905368, 120.09500800) and (524.63572022, 121.27634130) .. (528.07972013, 121.41634130)
+ .. controls (533.64771999, 121.64034129) and (537.49438656, 118.33367471) .. (537.49571990, 113.41634150)
+ .. controls (537.49705323, 110.36034158) and (533.90638665, 106.28300835) .. (530.34105341, 105.88567502)
+ .. controls (526.60772017, 105.47100837) and (525.24638687, 108.58167495) .. (521.07972031, 108.62434162)
+ .. controls (515.94905377, 108.67500829) and (510.59972057, 106.95100833) .. (499.49572085, 104.08167507)
+ .. controls (493.72772099, 102.59234177) and (488.03838780, 100.72834182) .. (482.69705460, 99.520341850)
+ .. controls (477.65972139, 98.38034188) and (471.57838821, 96.480341920) .. (465.94105502, 96.248341930)
+ .. controls (463.30372175, 96.14034193) and (458.61438853, 96.236341930) .. (457.80238855, 100.31100849)
+ .. controls (457.05172191, 104.08167507) and (457.67972189, 107.07500833) .. (462.44105511, 109.24834160)
+ .. controls (467.55172164, 111.58300821) and (482.99705459, 112.86034151) .. (489.38505443, 114.30434148)
+ .. controls (492.46772102, 115.00167479) and (491.70505437, 123.16567459) .. (490.12105441, 123.70700791)
+ .. controls (487.46638781, 124.61634122) and (478.63838803, 121.42434130) .. (472.78238818, 122.42567461)
+ .. controls (469.96772158, 122.90700793) and (463.91305507, 123.10700792) .. (464.49572172, 129.33234110)
+ .. controls (465.10772171, 135.86034094) and (484.69438788, 137.48434090) .. (488.35172112, 138.72967420)
+ .. controls (491.99572103, 139.97100750) and (491.07438772, 146.65634067) .. (490.57972107, 149.11767394)
+ .. controls (488.73572111, 158.29634038) and (489.04505444, 164.86034021) .. (500.27838749, 165.97367352)
+ .. controls (511.62238721, 167.09767349) and (512.05572053, 156.16300710) .. (512.24638719, 153.66567383)
+ (477.14665474, 84.89994221)
+ .. controls (472.73998818, 81.22527564) and (467.58798831, 76.65460909) .. (463.99598840, 72.30394253)
+ .. controls (462.33465511, 70.29194258) and (463.05465509, 58.65327620) .. (463.10798842, 55.47060962)
+ .. controls (463.21865509, 48.80394312) and (460.37198849, 40.91594331) .. (453.45465533, 40.91594331)
+ .. controls (445.28798887, 40.91594331) and (444.20265556, 46.74927650) .. (443.32932225, 50.99860973)
+ .. controls (442.19732228, 56.51327626) and (443.66132224, 63.83994274) .. (445.21865554, 66.35994268)
+ .. controls (446.79598883, 68.91194261) and (452.75865535, 71.92527587) .. (457.92665522, 75.68794244)
+ .. controls (468.97065494, 83.72927558) and (482.18532128, 94.29727531) .. (483.77465457, 92.64660869)
+ .. controls (485.03865454, 91.33194205) and (479.27598802, 86.67460884) .. (477.14665474, 84.89994221)
+ (476.49638809, 72.74900918)
+ .. controls (480.21905466, 74.35967581) and (501.89638745, 50.07834308) .. (510.82972056, 47.24900982)
+ .. controls (515.82972044, 45.66634319) and (532.30172003, 46.16634318) .. (537.63505323, 46.24900985)
+ .. controls (538.76705320, 46.26634318) and (540.66305315, 46.49967651) .. (540.59505315, 47.73300981)
+ .. controls (540.52038649, 49.09834311) and (500.66305415, 75.58234245) .. (503.74572074, 79.16500902)
+ .. controls (505.18172070, 80.83300898) and (525.21905354, 70.58234257) .. (540.71905315, 64.52634272)
+ .. controls (556.74171941, 58.26634288) and (572.32971903, 53.35967634) .. (572.32971903, 48.58234312)
+ .. controls (572.32971903, 43.46367658) and (566.08038585, 43.41567658) .. (563.08038592, 39.49967668)
+ .. controls (561.54438596, 37.49567673) and (561.41371930, 34.58234347) .. (558.66305270, 32.58234352)
+ .. controls (549.60438626, 25.99434369) and (535.51105328, 25.81434369) .. (524.88572021, 26.15834368)
+ .. controls (504.88572071, 26.80501033) and (495.99638760, 29.91567692) .. (487.99638780, 40.91567665)
+ .. controls (478.70838803, 53.68767633) and (473.71505482, 71.54500921) .. (476.49638809, 72.74900918)
+ (507.10745399, 87.63794214)
+ .. controls (508.21812063, 90.80460873) and (515.55412044, 93.42460867) .. (524.74612021, 94.66594197)
+ .. controls (535.22878662, 96.08060860) and (548.44611962, 96.18060860) .. (551.57945288, 95.24860862)
+ .. controls (557.74611939, 93.41527533) and (560.91278598, 86.41527551) .. (560.49678599, 80.49927566)
+ .. controls (560.21945266, 76.56594242) and (556.38478609, 75.08194246) .. (553.55145283, 75.08194246)
+ .. controls (549.55145293, 75.08194246) and (543.79011974, 76.84460908) .. (539.55811984, 77.15260907)
+ .. controls (532.15012003, 77.69394239) and (524.42745356, 78.01127572) .. (520.71812032, 78.58194237)
+ .. controls (514.94078713, 79.47127568) and (505.79145402, 83.88727557) .. (507.10745399, 87.63794214)}
+% \end{macrocode}
+%
+% 切。
+% \begin{macrocode}
+\def\fdulogo@motto@qie{%
+ ( 70.41306491, 978.12405322)
+ .. controls ( 68.59973162, 977.99071989) and ( 61.77439846, 976.13738660) .. ( 56.44106526, 974.19338665)
+ .. controls ( 51.01039872, 972.21338670) and ( 47.16373215, 968.74938678) .. ( 42.77439893, 967.74938681)
+ .. controls ( 38.32373238, 966.73472017) and ( 27.71839931, 965.08272021) .. ( 25.59173269, 972.32672003)
+ .. controls ( 24.69706605, 975.37205328) and ( 31.35573255, 978.65738654) .. ( 35.71839911, 981.09738648)
+ .. controls ( 40.16373233, 983.58271975) and ( 50.54506540, 987.01471966) .. ( 56.73839858, 988.37605296)
+ .. controls ( 60.80639848, 989.26938627) and ( 70.49573157, 991.41605288) .. ( 72.62106485, 992.66538619)
+ .. controls ( 74.04239815, 993.50138617) and ( 73.41306483, 1004.24938590) .. ( 72.24639819, 1007.16538582)
+ .. controls ( 69.62239826, 1013.72405233) and ( 69.98906492, 1025.04271871) .. ( 79.22106469, 1025.33205204)
+ .. controls ( 87.39039782, 1025.58938536) and ( 88.54373112, 1019.55471885) .. ( 88.66373112, 1011.74938571)
+ .. controls ( 88.73039778, 1007.33605249) and ( 85.75306452, 999.49871935) .. ( 87.44106448, 996.69338609)
+ .. controls ( 89.12906444, 993.88805282) and ( 95.55173094, 997.80405272) .. ( 96.82639758, 996.37605276)
+ .. controls ( 98.79706420, 994.16671948) and ( 99.24373085, 989.33205294) .. ( 96.61173092, 988.43205296)
+ .. controls ( 90.38506441, 986.30405301) and ( 86.55173117, 986.91605300) .. ( 85.04773121, 978.98671986)
+ .. controls ( 84.33173123, 975.21471996) and ( 84.13839790, 971.34805339) .. ( 83.83039790, 966.74938683)
+ .. controls ( 83.38773125, 960.16272033) and ( 83.64373124, 956.11872043) .. ( 84.03173123, 955.66538711)
+ .. controls ( 85.20506454, 954.29072048) and (101.00239747, 967.46805348) .. (109.66239726, 973.83205332)
+ .. controls (119.56506368, 981.10938647) and (128.27839679, 988.06005297) .. (131.55173004, 989.97071959)
+ .. controls (133.45439666, 991.08271956) and (135.66906327, 994.46271947) .. (136.49706325, 993.99871949)
+ .. controls (138.57972987, 992.83205285) and (137.16372990, 989.69338626) .. (141.07972981, 989.66538626)
+ .. controls (146.73839633, 989.62538626) and (150.99706289, 989.74938626) .. (150.41306291, 983.16538642)
+ .. controls (149.91972959, 977.59471990) and (149.02906294, 971.76405338) .. (148.24639629, 966.99872016)
+ .. controls (147.24639632, 960.91605365) and (152.66372952, 965.49872020) .. (153.99972948, 959.75472034)
+ .. controls (154.93972946, 955.71338711) and (159.54106268, 956.39872043) .. (161.71306262, 958.37872038)
+ .. controls (163.88506257, 960.36005366) and (167.24372915, 970.34538674) .. (168.57972912, 981.08271981)
+ .. controls (169.87439575, 991.48805288) and (171.32772905, 1007.98271914) .. (169.68772909, 1009.37205243)
+ .. controls (167.74239581, 1011.02138573) and (157.99706272, 1000.24938600) .. (149.74639626, 1000.41605266)
+ .. controls (142.70639643, 999.65471934) and (137.03706324, 1002.73205260) .. (136.51572992, 1004.14138590)
+ .. controls (135.48372995, 1006.93471916) and (143.43439641, 1010.10538575) .. (147.18639632, 1011.49471905)
+ .. controls (154.63972947, 1014.25338565) and (161.57972929, 1014.66538564) .. (168.57972912, 1017.83205222)
+ .. controls (171.25039572, 1019.04005219) and (172.36639569, 1022.16405212) .. (173.91306232, 1021.83205212)
+ .. controls (181.62772879, 1020.17738550) and (191.32772855, 1014.26005231) .. (191.90772854, 1006.67205250)
+ .. controls (192.90639518, 993.61871950) and (192.74639518, 980.61738649) .. (190.68106190, 965.57872020)
+ .. controls (189.56506193, 957.44672040) and (184.02772873, 952.24005386) .. (178.35172887, 946.71472067)
+ .. controls (172.59039569, 941.10672081) and (157.91306272, 936.49872092) .. (152.73706285, 940.72538748)
+ .. controls (147.28239632, 945.18005404) and (145.86106302, 950.55472057) .. (144.49706305, 951.86005387)
+ .. controls (143.37972975, 952.92805385) and (141.25306314, 950.52005391) .. (139.24639652, 947.33205399)
+ .. controls (134.99706329, 940.58272082) and (127.31439682, 929.87605442) .. (121.49706363, 923.08272126)
+ .. controls (115.30639712, 915.85338811) and (111.05173056, 911.24938822) .. (109.11439727, 912.24938820)
+ .. controls (107.65439731, 913.00272151) and (116.65706375, 928.63472112) .. (123.88506357, 945.80405402)
+ .. controls (130.10106341, 960.57072032) and (135.21172995, 976.57605325) .. (134.44106331, 982.30405311)
+ .. controls (133.99572998, 985.60805303) and (131.79706337, 985.56138636) .. (129.92239675, 984.51471972)
+ .. controls (124.86506355, 981.68938646) and (118.97706369, 970.97472006) .. (114.49706380, 965.99872019)
+ .. controls (101.56239746, 951.63472055) and (100.63439748, 950.83205390) .. ( 87.21839782, 936.91605425)
+ .. controls ( 81.92773129, 931.42805438) and ( 71.99573153, 921.13738797) .. ( 69.28773160, 920.91605465)
+ .. controls ( 66.92506499, 920.72138798) and ( 66.88506499, 923.74938791) .. ( 64.83039838, 924.58272122)
+ .. controls ( 62.35306511, 925.58672120) and ( 60.49706515, 924.19338790) .. ( 57.99039855, 926.09872118)
+ .. controls ( 50.60506540, 931.71205438) and ( 62.66373177, 937.69338756) .. ( 66.88506499, 948.02672064)
+ .. controls ( 71.88239820, 960.25605366) and ( 73.33039817, 968.25205346) .. ( 73.83039815, 974.16538665)
+ .. controls ( 74.15306481, 977.99338655) and ( 72.20506486, 978.25605321) .. ( 70.41306491, 978.12405322)}
+% \end{macrocode}
+%
+% 问。
+% \begin{macrocode}
+\def\fdulogo@motto@wen{%
+ (113.88533049, 800.33232433)
+ .. controls (113.88533049, 792.49899119) and (103.44133075, 785.91499135) .. ( 93.77466432, 787.69365798)
+ .. controls ( 91.97599770, 788.02432464) and ( 91.99599770, 790.54032457) .. ( 92.36799769, 792.02699120)
+ .. controls ( 93.00133101, 794.55499114) and ( 94.03866432, 794.79099113) .. ( 94.21866431, 797.41499107)
+ .. controls ( 94.41999764, 800.34565766) and ( 90.55199774, 798.87365770) .. ( 90.55199774, 802.45765761)
+ .. controls ( 90.55199774, 807.73499081) and ( 91.41999771, 813.70699066) .. ( 93.82799765, 814.61899064)
+ .. controls ( 95.18533095, 815.13232396) and ( 99.94266417, 810.02832409) .. (104.23466406, 809.80299076)
+ .. controls (109.99599725, 809.49899077) and (113.88533049, 808.05499080) .. (113.88533049, 800.33232433)
+ ( 68.24639829, 746.24899235)
+ .. controls ( 76.02373143, 746.24899235) and ( 76.30906476, 717.77832639) .. ( 76.32906476, 695.74899361)
+ .. controls ( 76.34639809, 678.91566070) and ( 73.70373149, 668.63299429) .. ( 68.82639828, 668.61832762)
+ .. controls ( 65.44106503, 668.60899429) and ( 58.49173187, 673.23166084) .. ( 57.54506523, 683.24899392)
+ .. controls ( 55.93039860, 700.35032683) and ( 58.49706520, 720.08232633) .. ( 62.50239844, 732.20499270)
+ .. controls ( 63.84106507, 736.25832593) and ( 65.57973169, 746.24899235) .. ( 68.24639829, 746.24899235)
+ (117.19559707, 733.34792600)
+ .. controls (114.83026380, 735.24925929) and ( 94.68759763, 733.44392600) .. ( 94.49693097, 732.49859269)
+ .. controls ( 93.99693098, 730.02659275) and ( 98.73693086, 730.33459274) .. ( 99.60759751, 726.35992618)
+ .. controls (100.98626414, 720.06125967) and (103.24626409, 712.70792652) .. (105.56093069, 712.68259319)
+ .. controls (106.91293066, 712.66792652) and (110.07293058, 717.64525973) .. (112.74626385, 722.74925960)
+ .. controls (115.32226378, 727.66792614) and (118.09959705, 732.62125935) .. (117.19559707, 733.34792600)
+ (125.07959687, 717.74925973)
+ .. controls (125.16359687, 710.58259324) and (136.33026326, 717.41592640) .. (136.33026326, 709.91592659)
+ .. controls (136.33026326, 706.99859333) and (134.99692996, 703.58259341) .. (132.91293001, 703.16526009)
+ .. controls (128.86226345, 702.35592678) and (122.66493027, 701.93192679) .. (122.83026360, 700.99859348)
+ .. controls (123.33026358, 698.16526022) and (134.45826331, 690.91192706) .. (137.88492989, 690.69326040)
+ .. controls (139.35426318, 690.59992707) and (141.45292980, 694.44792697) .. (141.41292980, 701.24926014)
+ .. controls (141.33026313, 715.33192645) and (141.46226313, 737.09459258) .. (141.41292980, 747.83192564)
+ .. controls (141.33026313, 766.24925851) and (140.87559648, 775.70525828) .. (135.57959661, 774.99859163)
+ .. controls (130.28359674, 774.29192498) and (125.66359686, 768.83192512) .. (123.01693026, 763.93192524)
+ .. controls (119.17693035, 756.81859208) and (114.00093048, 755.98125877) .. (107.77559731, 760.51859199)
+ .. controls (103.80893074, 763.40925858) and ( 98.44093087, 763.85725857) .. ( 95.31426428, 763.30525859)
+ .. controls ( 91.04359772, 762.55192527) and ( 89.00626444, 756.68125875) .. ( 87.94093113, 755.30392545)
+ .. controls ( 85.66359786, 752.35992553) and ( 82.55159794, 750.35992558) .. ( 78.55159804, 751.41592555)
+ .. controls ( 74.74493146, 752.41992553) and ( 68.07959830, 757.89592539) .. ( 68.07959830, 764.08259190)
+ .. controls ( 68.07959830, 770.26925841) and ( 73.10359817, 771.43059172) .. ( 75.41826478, 770.34659174)
+ .. controls ( 78.83026470, 768.74925845) and ( 80.62226465, 763.49992525) .. ( 86.29693118, 765.48925853)
+ .. controls ( 89.41293110, 766.58259184) and ( 95.18626429, 773.48792500) .. (102.21826411, 775.08259163)
+ .. controls (106.99693066, 776.16525827) and (113.86626382, 773.31725834) .. (116.63959708, 776.18925826)
+ .. controls (122.11293028, 781.85592479) and (125.22626354, 780.03192484) .. (130.24626341, 783.74925808)
+ .. controls (133.91559665, 786.46659134) and (136.36892992, 790.42792458) .. (144.21826306, 790.47059124)
+ .. controls (150.91292956, 790.50792457) and (155.77292944, 786.62259134) .. (160.33026266, 779.80392484)
+ .. controls (164.95292921, 772.88792501) and (165.57559586, 766.17059185) .. (165.99692918, 757.80392539)
+ .. controls (166.52626250, 747.25325899) and (165.26626254, 744.26125906) .. (165.66359586, 734.41592598)
+ .. controls (166.04092918, 725.02125954) and (169.01826244, 708.54259329) .. (169.90626242, 696.58259359)
+ .. controls (171.03426239, 681.39592730) and (156.09159610, 668.34259429) .. (145.21826304, 666.42526101)
+ .. controls (136.66359658, 664.91592771) and (132.88493001, 670.47059424) .. (130.10759675, 675.24926079)
+ .. controls (123.69826357, 686.27192718) and (115.95026377, 694.92259363) .. (110.10759725, 698.24926021)
+ .. controls (106.83959733, 700.10926017) and (101.64359746, 698.15726022) .. ( 96.44093092, 699.02659353)
+ .. controls ( 89.31159777, 700.21726016) and ( 86.33293118, 709.19592661) .. ( 85.74626452, 719.16525969)
+ .. controls ( 85.49693120, 723.41592625) and ( 89.71026442, 729.00125944) .. ( 90.50226440, 730.49725941)
+ .. controls ( 91.91293104, 733.16525934) and ( 90.13959775, 736.64125925) .. ( 92.66359768, 738.58259254)
+ .. controls (100.24626416, 744.41592573) and (111.62759721, 747.60659231) .. (119.89826367, 748.24125896)
+ .. controls (123.97026357, 748.55325896) and (129.79693009, 746.79459233) .. (132.24626336, 743.41592575)
+ .. controls (134.66359663, 740.08259250) and (134.83026330, 735.58259261) .. (133.07559667, 730.62659274)
+ .. controls (131.31159672, 725.63992619) and (125.03826354, 721.36525964) .. (125.07959687, 717.74925973)}
+% \end{macrocode}
+%
+% 而。
+% \begin{macrocode}
+\def\fdulogo@motto@er@ii{%
+ (108.90466394, 536.58766425)
+ .. controls (109.87666392, 538.57566420) and (102.97266409, 537.08499758) .. ( 98.66333087, 536.37433093)
+ .. controls ( 94.84066430, 535.74366428) and ( 88.89133111, 534.12899765) .. ( 86.55266450, 538.04633088)
+ .. controls ( 84.44066456, 541.58233080) and ( 89.92999775, 547.88499731) .. ( 94.20733098, 550.49299724)
+ .. controls ( 99.89399750, 553.95833049) and (111.29533055, 558.12099705) .. (118.74599703, 558.49966371)
+ .. controls (125.64599686, 558.84899703) and (133.83799665, 551.11166389) .. (133.85132999, 544.52899739)
+ .. controls (133.85932999, 539.75166418) and (127.88866347, 534.22766431) .. (126.31133018, 532.76633102)
+ .. controls (121.78999696, 528.57966445) and ( 98.29533088, 509.82766492) .. ( 92.82999768, 505.85966502)
+ .. controls ( 88.25133113, 502.53566511) and ( 86.05133118, 503.03566509) .. ( 85.59266453, 503.66499841)
+ .. controls ( 85.02466454, 504.44366506) and ( 86.99666449, 508.74899828) .. ( 91.82999770, 514.91566480)
+ .. controls ( 98.69266420, 523.67166458) and (106.80599733, 532.29699770) .. (108.90466394, 536.58766425)
+ (133.85066332, 493.80459866)
+ .. controls (134.29466331, 488.91526545) and (146.75732966, 471.29926589) .. (155.10399612, 472.01393254)
+ .. controls (160.93732931, 472.51393252) and (165.88532919, 481.74859896) .. (167.66266248, 488.19393213)
+ .. controls (168.81732911, 492.37926536) and (169.31332910, 501.70726513) .. (168.63866245, 502.65793177)
+ .. controls (167.98799580, 503.57259841) and (159.59866268, 500.35793183) .. (151.99599620, 498.87393186)
+ .. controls (143.42132975, 497.20059857) and (133.68132999, 495.66459861) .. (133.85066332, 493.80459866)
+ (119.70533034, 486.04059885)
+ .. controls (118.57999704, 486.62459884) and (116.17199710, 486.29259885) .. (115.62133044, 485.54059886)
+ .. controls (115.16266379, 484.91526555) and (116.61999708, 465.61526603) .. (113.77733049, 461.77526612)
+ .. controls (110.88399723, 457.86993289) and (102.49199744, 457.94193289) .. ( 99.68399751, 460.35259949)
+ .. controls ( 96.45466426, 463.12459942) and ( 94.27733098, 467.76593264) .. ( 94.44133097, 472.47126586)
+ .. controls ( 94.62133097, 477.66593239) and ( 97.28666423, 483.17793226) .. ( 95.79999761, 484.01126557)
+ .. controls ( 94.97599763, 484.47393222) and ( 86.97466449, 480.91259898) .. ( 82.37199794, 480.20726566)
+ .. controls ( 75.94133143, 479.22059902) and ( 74.85066480, 485.58193220) .. ( 73.28799817, 485.33259887)
+ .. controls ( 70.95599823, 484.95926555) and ( 72.57999819, 474.64459914) .. ( 73.60799816, 468.02726597)
+ .. controls ( 74.32133148, 463.43126608) and ( 75.78533144, 458.58059954) .. ( 75.32933145, 455.63793294)
+ .. controls ( 74.49599814, 450.24859975) and ( 71.07999822, 448.08193313) .. ( 66.74399833, 447.52726648)
+ .. controls ( 62.58933177, 446.99659983) and ( 58.03866522, 450.99926639) .. ( 55.91333194, 456.29126626)
+ .. controls ( 54.88399863, 458.85259953) and ( 53.27866533, 461.95393279) .. ( 53.38933200, 475.23793245)
+ .. controls ( 53.47866533, 485.96859885) and ( 56.64133192, 504.78593172) .. ( 61.67199846, 508.24993163)
+ .. controls ( 67.35733165, 512.16326487) and ( 70.84266490, 506.77793167) .. ( 71.96133153, 503.75393174)
+ .. controls ( 73.07999817, 500.72993182) and ( 71.44799821, 494.38059864) .. ( 73.20533150, 493.24859867)
+ .. controls ( 74.21866481, 492.59659869) and ( 85.44933120, 497.09259858) .. ( 99.66266418, 500.83259848)
+ .. controls (114.55199714, 504.74859838) and (131.64933004, 508.53526496) .. (143.95466307, 510.95793156)
+ .. controls (156.87199608, 513.49926483) and (174.41332897, 516.70726475) .. (181.47199546, 514.83393147)
+ .. controls (187.07332866, 513.34859817) and (191.83332854, 505.08059838) .. (193.02266184, 499.35526519)
+ .. controls (194.44132847, 492.52726536) and (194.20799514, 479.94593234) .. (188.99599528, 470.13793258)
+ .. controls (185.57732869, 463.70459941) and (180.38532882, 460.47126616) .. (173.56799566, 457.37926623)
+ .. controls (169.12932911, 455.36726629) and (158.60132937, 452.72859968) .. (153.71866282, 453.13793301)
+ .. controls (145.77466302, 453.80459966) and (142.66399643, 465.36459937) .. (139.82932984, 465.58193270)
+ .. controls (136.21866326, 465.86059936) and (133.63332999, 458.01526622) .. (130.27466341, 452.41526636)
+ .. controls (127.86533014, 448.40059979) and (124.58533022, 445.84059986) .. (123.16266359, 446.02726652)
+ .. controls (120.82933031, 446.33259984) and (121.47333030, 457.59259956) .. (121.60799696, 467.80459931)
+ .. controls (121.71866362, 476.24859910) and (120.89599698, 485.42326553) .. (119.70533034, 486.04059885)}
+% \end{macrocode}
+%
+% 近。
+% \begin{macrocode}
+\def\fdulogo@motto@jin{%
+ (147.52999631, 311.63046988)
+ .. controls (148.58999629, 309.42913660) and (152.49666285, 307.13846999) .. (155.99532943, 297.70780356)
+ .. controls (158.12599605, 291.96247037) and (159.99666267, 280.74913732) .. (159.64332934, 273.74780416)
+ .. controls (159.23266269, 265.59180436) and (157.10066274, 260.92113781) .. (154.41532947, 257.01847124)
+ .. controls (150.25666291, 250.97713806) and (146.14599635, 247.36913815) .. (147.32999632, 247.08247149)
+ .. controls (150.07932958, 246.41580484) and (181.78199546, 246.25847151) .. (191.17132855, 248.63447145)
+ .. controls (201.71799496, 251.30513805) and (223.91666107, 249.58647143) .. (224.21799439, 243.24913825)
+ .. controls (224.52066105, 236.91180508) and (214.10332798, 233.82647182) .. (202.32999494, 231.99847187)
+ .. controls (191.77399521, 230.35980524) and (153.31132950, 227.27047199) .. (134.81932996, 228.33180529)
+ .. controls (111.10733056, 229.69313859) and ( 94.27533098, 234.98247179) .. ( 80.55133132, 240.13847167)
+ .. controls ( 70.49666490, 243.91580490) and ( 62.00199845, 249.09180478) .. ( 55.44066528, 249.69313809)
+ .. controls ( 50.32866541, 250.16247142) and ( 46.21799884, 248.13847147) .. ( 42.82999893, 244.69313822)
+ .. controls ( 39.36333235, 241.17047164) and ( 34.71799913, 241.69313829) .. ( 32.66333252, 244.24913823)
+ .. controls ( 31.71666587, 245.42647153) and ( 29.24599927, 249.70780476) .. ( 31.59799921, 254.44247131)
+ .. controls ( 33.57133249, 258.41313788) and ( 37.53133240, 261.19180447) .. ( 41.82999895, 262.62380444)
+ .. controls ( 47.16333215, 264.40113773) and ( 54.84866530, 263.66647108) .. ( 54.91266529, 265.66513769)
+ .. controls ( 55.03799862, 269.54113760) and ( 50.16333208, 275.91580410) .. ( 47.32999882, 284.91580388)
+ .. controls ( 45.24466554, 291.53713705) and ( 44.63399888, 303.49313675) .. ( 44.74599888, 312.16513653)
+ .. controls ( 44.79666555, 316.04113643) and ( 45.49933220, 319.51446968) .. ( 45.44066553, 322.30513628)
+ .. controls ( 45.32999887, 327.63846948) and ( 43.71533224, 330.87180273) .. ( 43.77133224, 334.48246931)
+ .. controls ( 43.83799890, 338.86646920) and ( 44.82733221, 343.80513574) .. ( 48.99666544, 343.91580240)
+ .. controls ( 55.24599862, 344.08246907) and ( 57.56066523, 337.90380256) .. ( 58.24599854, 331.83180271)
+ .. controls ( 58.82999853, 326.66513617) and ( 56.79799858, 319.75846968) .. ( 56.75133191, 314.24913648)
+ .. controls ( 56.66333192, 303.58247008) and ( 59.79266517, 301.92113679) .. ( 63.00733176, 295.52513695)
+ .. controls ( 66.16333168, 289.24913710) and ( 66.24466501, 276.24913743) .. ( 66.24466501, 265.97180435)
+ .. controls ( 66.24466501, 262.88780443) and ( 71.16733155, 260.61713782) .. ( 78.21799804, 257.80513789)
+ .. controls ( 84.61666455, 255.25180462) and ( 92.80599768, 252.25713803) .. (100.57933082, 250.49847141)
+ .. controls (110.16333058, 248.33180479) and (137.50332990, 246.89447150) .. (138.89132986, 247.36647149)
+ .. controls (141.16332980, 248.13847147) and (137.05132991, 250.52647141) .. (136.85932991, 256.47047126)
+ .. controls (136.64999658, 262.92113776) and (136.15666326, 308.45713662) .. (135.71532994, 308.55313662)
+ .. controls (132.49666335, 309.24913660) and (118.69266370, 301.95047012) .. (118.55133037, 293.58247033)
+ .. controls (118.41266371, 285.33180387) and (116.57933042, 277.41580407) .. (112.66466385, 268.59847095)
+ .. controls (109.55666393, 261.59980446) and (104.05666407, 254.43580464) .. ( 99.10999752, 255.39847128)
+ .. controls ( 93.57799766, 256.47447126) and ( 89.94599775, 263.78247107) .. ( 89.47133110, 271.23847089)
+ .. controls ( 88.99666444, 278.69313737) and ( 91.36733105, 295.31580362) .. ( 94.57799764, 309.33313660)
+ .. controls ( 97.74599756, 323.16513626) and (104.65399738, 336.30380260) .. (107.88466397, 341.63846913)
+ .. controls (109.72599726, 344.67713572) and (112.85266385, 350.43046891) .. (116.38466376, 358.30513538)
+ .. controls (118.76999703, 363.61980191) and (119.21799702, 369.63846843) .. (123.07933026, 370.91580173)
+ .. controls (127.88866347, 372.50646836) and (130.19533008, 369.12780177) .. (133.12199667, 368.58246845)
+ .. controls (135.57932994, 368.12380180) and (138.91266319, 368.54113512) .. (141.18599647, 367.05313516)
+ .. controls (142.73132977, 366.04246852) and (143.94066307, 364.24913523) .. (143.85399640, 359.57980201)
+ .. controls (143.76199641, 354.61713547) and (140.43399649, 350.66780224) .. (135.32999662, 347.63846898)
+ .. controls (130.22599674, 344.60780239) and (118.23266371, 338.83313587) .. (116.71799708, 335.08246929)
+ .. controls (116.09933043, 333.54780266) and (116.42466376, 327.45046948) .. (116.66333042, 321.74913629)
+ .. controls (116.91666374, 315.68780311) and (117.13933040, 310.05313658) .. (118.41266371, 310.08246992)
+ .. controls (119.71799701, 310.11180325) and (125.09799687, 319.04113636) .. (132.78866335, 324.87446955)
+ .. controls (138.17266321, 328.95846945) and (144.78466305, 331.71446938) .. (149.10732961, 333.74913599)
+ .. controls (154.41799614, 336.24913593) and (162.34866261, 337.07046924) .. (165.78866252, 335.24913595)
+ .. controls (170.03799575, 332.99846934) and (172.99666234, 329.83180276) .. (173.16332900, 325.99846952)
+ .. controls (173.30732900, 322.66780294) and (172.03799570, 320.29046966) .. (169.21799577, 317.74913639)
+ .. controls (166.46066251, 315.26246979) and (162.63532927, 314.11046982) .. (158.74599603, 313.88780316)
+ .. controls (153.96466282, 313.61446983) and (146.78332966, 313.18246984) .. (147.52999631, 311.63046988)}
+% \end{macrocode}
+%
+% 思。
+% \begin{macrocode}
+\def\fdulogo@motto@si{%
+ (106.49093067, 108.99527494)
+ .. controls (107.99626397, 108.66594162) and (109.39359727, 109.32060827) .. (110.41359724, 111.66594154)
+ .. controls (112.08026386, 115.49927478) and (112.58026385, 120.99927464) .. (111.08026389, 121.66594129)
+ .. controls (109.64693059, 122.30327461) and (104.98826404, 120.65127465) .. (104.03359740, 120.00460800)
+ .. controls (102.34959744, 118.86460803) and (105.34026403, 109.24727494) .. (106.49093067, 108.99527494)
+ ( 93.55226433, 38.30461004)
+ .. controls ( 91.74159771, 33.33527684) and ( 87.66293114, 27.77527697) .. ( 79.82959800, 27.80461031)
+ .. controls ( 74.49759814, 27.82461031) and ( 71.40826488, 31.66327688) .. ( 69.12159827, 36.40061009)
+ .. controls ( 66.58026500, 41.66594329) and ( 68.38293162, 53.36727634) .. ( 71.54026488, 59.73527618)
+ .. controls ( 76.03759810, 68.80594262) and ( 85.36026453, 77.49794240) .. ( 85.16693120, 78.80327570)
+ .. controls ( 84.83893121, 81.01527564) and ( 79.32959802, 82.33260894) .. ( 78.16293138, 86.70727550)
+ .. controls ( 76.04826477, 94.63794197) and ( 89.88559775, 94.02727532) .. ( 90.00826442, 96.90727525)
+ .. controls ( 90.17359775, 100.80327515) and ( 80.55226465, 107.13794166) .. ( 80.24693133, 118.99927469)
+ .. controls ( 79.98826467, 129.03394111) and ( 82.75626460, 143.82727407) .. ( 85.77359786, 144.24860740)
+ .. controls ( 87.65226448, 144.51127406) and ( 98.21893088, 128.58194112) .. (101.22559747, 129.59527443)
+ .. controls (103.59626408, 130.39260774) and (107.60693064, 133.24860767) .. (109.16293060, 135.36060762)
+ .. controls (110.87093056, 137.67660756) and (111.02693056, 140.45927416) .. (111.60693054, 143.52727408)
+ .. controls (112.38559719, 147.63794064) and (119.11893036, 149.52327393) .. (121.90026362, 148.91527395)
+ .. controls (125.71893019, 148.08194063) and (128.20959679, 143.25127409) .. (129.77359676, 141.63794079)
+ .. controls (131.55226338, 139.80460751) and (134.96692996, 139.03794086) .. (134.98426329, 134.57794097)
+ .. controls (134.99626329, 131.19394106) and (132.67226335, 130.15794108) .. (131.78826337, 128.12460780)
+ .. controls (130.95493006, 126.20727451) and (130.85093006, 124.21527456) .. (130.12159675, 122.58194127)
+ .. controls (128.01093013, 117.86060806) and (125.46959686, 112.70860818) .. (126.91359683, 112.66594152)
+ .. controls (129.74693009, 112.58194152) and (135.20426329, 125.02727454) .. (142.32959644, 136.91527425)
+ .. controls (148.52026295, 147.24194065) and (151.95492953, 152.08194053) .. (151.95492953, 155.20727379)
+ .. controls (151.95492953, 157.78460706) and (139.55226318, 156.80460708) .. (128.66293012, 155.97127377)
+ .. controls (120.72559698, 155.36327379) and (105.30026403, 154.68727380) .. (105.06293071, 155.59527378)
+ .. controls (104.41359739, 158.08194038) and (107.78293064, 163.07260693) .. (118.44026371, 166.24860685)
+ .. controls (123.65626358, 167.80327347) and (143.06559642, 168.37794013) .. (152.58026285, 165.99927352)
+ .. controls (160.91359598, 163.91527357) and (172.26826236, 150.59127390) .. (174.74692896, 146.41527401)
+ .. controls (176.73626225, 143.06327409) and (175.10692896, 138.36060754) .. (171.26426239, 131.99527437)
+ .. controls (168.19492913, 126.91260783) and (160.09092933, 118.71260803) .. (153.99626282, 111.69394154)
+ .. controls (150.84292956, 108.06194163) and (148.52026295, 103.64327508) .. (146.05226302, 100.86060848)
+ .. controls (142.99626309, 97.41527523) and (132.12159670, 94.86060863) .. (124.58026355, 92.99927534)
+ .. controls (118.95359703, 91.60994205) and (106.72959733, 87.84860881) .. (103.41359741, 86.33260884)
+ .. controls (101.65893079, 85.52994220) and ( 98.92026419, 81.12727564) .. ( 98.98426419, 76.91394241)
+ .. controls ( 99.10693086, 68.86060928) and ( 98.60693087, 63.08194276) .. ( 97.66293089, 55.83260961)
+ .. controls ( 96.79493091, 49.16860977) and ( 96.03493093, 45.12060987) .. ( 93.55226433, 38.30461004)
+ (100.89439748, 57.58234290)
+ .. controls (101.56773079, 59.78367617) and (110.22639724, 56.74234292) .. (114.57306380, 54.50500964)
+ .. controls (123.16373025, 50.08234308) and (132.66373002, 41.41567663) .. (140.20506316, 39.04101003)
+ .. controls (143.06772976, 38.13967672) and (158.71839603, 37.29034340) .. (158.83039603, 39.58234335)
+ .. controls (158.94639603, 41.98367662) and (148.73839628, 46.95167650) .. (144.33039639, 50.74900973)
+ .. controls (140.16906316, 54.33167631) and (130.74639673, 62.99834276) .. (132.24106336, 65.39700937)
+ .. controls (133.55972999, 67.51167598) and (143.95706307, 62.07167612) .. (149.83039625, 60.49967616)
+ .. controls (154.49706280, 59.24900952) and (163.29172925, 58.37167621) .. (171.74639571, 56.66634292)
+ .. controls (181.79706212, 54.63834297) and (192.89039518, 51.46900972) .. (199.00639502, 48.75967645)
+ .. controls (206.71039483, 45.34634320) and (207.40239481, 43.34900992) .. (202.28639494, 37.40901007)
+ .. controls (197.58372839, 31.94767687) and (190.61039523, 25.90234369) .. (183.41306208, 23.33301042)
+ .. controls (169.41306243, 18.33301054) and (150.69039623, 18.54634387) .. (136.69706325, 20.04767717)
+ .. controls (120.84639698, 21.74634379) and (113.83039715, 31.41567688) .. (110.24639724, 37.24901007)
+ .. controls (107.79973064, 41.23167664) and (104.83573071, 49.55034310) .. (103.57973074, 52.16634303)
+ .. controls (102.32373078, 54.78234297) and (100.67573082, 56.86634291) .. (100.89439748, 57.58234290)
+ (128.04773013, 74.22207581)
+ .. controls (126.84373016, 74.84474246) and (132.99706334, 84.33274223) .. (142.83039643, 90.16607542)
+ .. controls (150.18506291, 94.52874197) and (161.83039595, 99.36074185) .. (170.55172907, 99.36074185)
+ .. controls (176.49706225, 99.36074185) and (181.49706213, 96.74874192) .. (184.56239539, 93.83274199)
+ .. controls (187.18772865, 91.33540872) and (188.57306195, 88.19274213) .. (188.28106196, 83.24874225)
+ .. controls (187.99706197, 78.41540904) and (183.91306207, 75.57407578) .. (178.07572888, 75.45407578)
+ .. controls (163.99706257, 75.16607579) and (146.80906300, 79.21140902) .. (141.89306312, 79.04474236)
+ .. controls (135.37706328, 78.82340903) and (130.41306341, 72.99940918) .. (128.04773013, 74.22207581)}
+%</logo>
+% \end{macrocode}
+%
+% \end{implementation}
+%
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}
+%
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis.ins b/Master/texmf-dist/source/latex/fduthesis/fduthesis.ins
new file mode 100644
index 00000000000..e311d716b54
--- /dev/null
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis.ins
@@ -0,0 +1,135 @@
+%%
+%% This is file `fduthesis.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fduthesis.dtx (with options: `install')
+%%
+%% 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.
+%%
+\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}}
+ \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
+\endinput
+%%
+%% End of file `fduthesis.ins'.