texlive[60172] Master: nwafuthesis (5aug21)

commits+karl at tug.org commits+karl at tug.org
Thu Aug 5 22:53:34 CEST 2021


Revision: 60172
          http://tug.org/svn/texlive?view=revision&revision=60172
Author:   karl
Date:     2021-08-05 22:53:34 +0200 (Thu, 05 Aug 2021)
Log Message:
-----------
nwafuthesis (5aug21)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/libexec/ctan2tds
    trunk/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/README.md
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/building.jpg
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/motto.png
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-bar.pdf
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-circle.pdf
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafudoc.cls
    trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafuthesis.pdf
    trunk/Master/texmf-dist/source/latex/nwafuthesis/
    trunk/Master/texmf-dist/source/latex/nwafuthesis/build-win.bat
    trunk/Master/texmf-dist/source/latex/nwafuthesis/build.sh
    trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis-doc.dtx
    trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis.dtx
    trunk/Master/texmf-dist/tex/latex/nwafuthesis/
    trunk/Master/texmf-dist/tex/latex/nwafuthesis/nwafuthesis.cls
    trunk/Master/tlpkg/tlpsrc/nwafuthesis.tlpsrc

Added: trunk/Master/texmf-dist/doc/latex/nwafuthesis/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nwafuthesis/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/nwafuthesis/README.md	2021-08-05 20:53:34 UTC (rev 60172)
@@ -0,0 +1,33 @@
+The nwafuthesis Class
+LaTeX thesis template for Northwest A&F University, China, v1.00
+
+Overview
+This template supports doctoral or master dissertion and undergraduate thesis in Chinese. With the help of modern LaTeX3 technology, nwafuthesis aims to create a simple interface, a normative format, as well as a hackable class for the users.
+
+At present, nwafuthesis only supports XETEX and LuaTEX engines. nwafuthesis only allows UTF-8 encoding.
+
+The documentation can be found in nwafuthesis.pdf (in Chinese).
+
+Gitee re­pos­i­tory: https://gitee.com/nwafu_nan/nwafuthesis-l3.
+
+Installation 
+To install nwafuthesis, you can use one of the following methods:
+
+If you are running TEX Live or MikTeX, the simplest way is to run
+  tlmgr install nwafuthesis
+Get the source from Gitee:
+  git clone git at gitee.com:nwafu_nan/nwafuthesis-l3.git
+Run build-win.bat (on Windows) or build.sh (on Linux) to generate the templates file. This file would be found in a same folder. You can enjoy nwafuthesis here at once.
+
+For permanent installation, you may move the following files into a directory where LaTeX will find them (e.g. TEXMF/tex/LaTeX/nwafuthesis/):
+
+nwafuthesis.cls
+Do not forget to update the filename database afterwards.
+
+Contributing
+Issues and pull requests are always welcome.
+
+License
+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.
+
+Copyright (C) 2017–2021 by Nan Geng <nangeng at nwafu.edu.cn>.


Property changes on: trunk/Master/texmf-dist/doc/latex/nwafuthesis/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/building.jpg
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/building.jpg
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/building.jpg	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/building.jpg	2021-08-05 20:53:34 UTC (rev 60172)

Property changes on: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/building.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/motto.png
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/motto.png
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/motto.png	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/motto.png	2021-08-05 20:53:34 UTC (rev 60172)

Property changes on: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/motto.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-bar.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-bar.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-bar.pdf	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-bar.pdf	2021-08-05 20:53:34 UTC (rev 60172)

Property changes on: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-bar.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-circle.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-circle.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-circle.pdf	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-circle.pdf	2021-08-05 20:53:34 UTC (rev 60172)

Property changes on: trunk/Master/texmf-dist/doc/latex/nwafuthesis/logo/nwafu-circle.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafudoc.cls
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafudoc.cls	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafudoc.cls	2021-08-05 20:53:34 UTC (rev 60172)
@@ -0,0 +1,1016 @@
+%%
+%% This is file `nwafudoc.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% nwafuthesis.dtx  (with options: `doc')
+%% nwafuthesis-doc.dtx  (with options: `doc')
+%% 
+%%     Copyright (C) 2019--2022 by Nan Geng <nangeng at nwafu.edu.cn>
+%% 
+%%     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 Nan Geng.
+%% 
+%%     This work consists of the files nwafuthesis.dtx,
+%%                                     nwafuthesis-doc.dtx,
+%%               and the derived files nwafuthesis.ins,
+%%                                     nwafuthesis.cls,
+%%                                     nwafudoc.cls,
+%% 
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}
+\GetIdInfo $Id: nwafuthesis.dtx 1.00 2021-05-12 15:30:00Z Nan Geng <nangeng at nwafu.edu.cn> $
+  {Documentation class for nwafuthesis}
+\ProvidesExplClass{nwafudoc}
+  {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
+\ExplSyntaxOff
+\@namedef{ver at thumbpdf.sty}{9999/99/99}
+\PassOptionsToPackage{log-declarations = false}{xparse}
+\LoadClass[a4paper, full]{l3doc}
+\RequirePackage[UTF8, heading, sub3section]{ctex}
+\RequirePackage{%
+  caption,
+  geometry,
+  graphicx,
+  listings,
+  makecell,
+  siunitx,
+  tabularx,
+  threeparttable,
+  unicode-math,
+  xcolor,
+  xcolor-material,
+  xunicode,
+  zref-base
+}
+\def\macro at code{%
+  \topsep \MacrocodeTopsep
+  \@beginparpenalty \predisplaypenalty
+  \partopsep \z at skip
+  \trivlist \parskip \z@ \item[]%
+  \MacroFont
+  \leftskip\@totalleftmargin \advance\leftskip\MacroIndent
+  \rightskip\z@ \parindent\z@ \parfillskip\@flushglue
+  \blank at linefalse \def\par{\ifblank at line
+                            \leavevmode\fi
+                            \blank at linetrue\@@par
+                            \penalty\interlinepenalty}
+  \obeylines
+  \let\do\do at noligs \verbatim at nolig@list
+  \let\do\@makeother \dospecials
+  \global\@newlistfalse
+  \global\@minipagefalse
+  \init at crossref}
+\ExplSyntaxOn
+\tl_new:N \l__nwafudoc_tmpa_tl
+\tl_new:N \l__nwafudoc_tmpb_tl
+\cs_new_protected:Npn \__nwafudoc_patch_cmd:Nnn #1#2#3
+  {
+    \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \__nwafudoc_preto_cmd:Nn #1#2
+  {
+    \ctex_preto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \__nwafudoc_appto_cmd:Nn #1#2
+  {
+    \ctex_appto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_set_protected_nopar:Npn \xmacro at code
+  { \__nwafudoc_marco_code:w }
+\cs_set_protected_nopar:Npn \sxmacro at code
+  {
+    \fontspec_print_visible_spaces:
+    \xmacro at code
+  }
+\cs_new_protected_nopar:Npn \__nwafudoc_marco_code:w
+  {
+    \ifcodeline at index
+      \__nwafudoc_marco_code_every_par:n { \__nwafudoc_code_line_no: }
+    \else:
+      \__nwafudoc_marco_code_every_par:n { }
+    \fi:
+    \__nwafudoc_make_finish_tag:x { \@currenvir }
+    \__nwafudoc_macro_code_start:w
+  }
+\cs_new_protected:Npn \__nwafudoc_marco_code_every_par:n #1
+  {
+    \everypar
+      {
+        \everypar {#1}
+        \if at inlabel
+          \global \@inlabelfalse \@noparlistfalse
+          \llap { \box \@labels \hskip \leftskip }
+        \fi
+        #1
+      }
+  }
+\group_begin:
+  \int_set:Nn \tex_endlinechar:D { -1 }
+  \use:n
+    {
+      \char_set_catcode_active:n { 32 }
+      \tl_const:Nn \c__nwafudoc_active_space_tl
+    }
+    { }
+\group_end:
+\group_begin:
+  \char_set_catcode_active:n { 13 }
+  \cs_new_protected:Npx \__nwafudoc_make_finish_tag:n #1
+    {
+      \tl_set:Nn \exp_not:N \l__nwafudoc_macro_code_finish_tl
+        {
+          \c_percent_str
+          \prg_replicate:nn { 4 }
+            { \exp_not:o { \c__nwafudoc_active_space_tl } }
+          \exp_not:o { \active at escape@char } end
+          \c_left_brace_str #1 \c_right_brace_str
+          \exp_not:N ^^M
+        }
+    }
+  \cs_generate_variant:Nn \__nwafudoc_make_finish_tag:n { x }
+  \cs_new_protected:Npn \__nwafudoc_macro_code_start:w #1
+    {
+      \str_if_eq:nnTF {#1} { ^^M }
+        { \__nwafudoc_macro_code_read_line:w }
+        { \__nwafudoc_macro_code_read_line:w #1 }
+    }
+  \cs_new_protected:Npn \__nwafudoc_macro_code_read_line:w #1 ^^M
+    {
+      \tl_set:Nn \l__nwafudoc_macro_code_line_tl { #1 ^^M }
+      \tl_if_eq:NNTF
+        \l__nwafudoc_macro_code_line_tl \l__nwafudoc_macro_code_finish_tl
+        { \exp_args:Nx \end { \@currenvir } }
+        {
+          \__nwafudoc_macro_code_process_line:
+          \__nwafudoc_macro_code_read_line:w
+        }
+    }
+  \cs_new_protected:Npn \__nwafudoc_swap_cr:
+    {
+      \exp_after:wN
+        \__nwafudoc_swap_cr_aux:w \l__nwafudoc_macro_code_line_tl
+    }
+  \cs_new_protected:Npn \__nwafudoc_swap_cr_aux:w #1 ^^M
+    {
+      \group_insert_after:N ^^M
+      \tl_set:Nn \l__nwafudoc_macro_code_line_tl {#1}
+    }
+  \tl_const:Nn \c__nwafudoc_active_cr_tl { ^^M }
+\group_end:
+\tl_new:N \l__nwafudoc_macro_code_line_tl
+\tl_new:N \l__nwafudoc_macro_code_finish_tl
+\tl_new:N \g__nwafudoc_macro_code_verbatim_stop_tl
+\cs_new_protected_nopar:Npn \__nwafudoc_process_normal_line:
+  {
+    \str_case_e:nnF
+      { \str_head:N \l__nwafudoc_macro_code_line_tl }
+      {
+        { \c_percent_str }
+        {
+          \__nwafudoc_check_angle:x
+            { \tl_tail:N \l__nwafudoc_macro_code_line_tl }
+        }
+        { \c_hash_str }
+        { \__nwafudoc_output_comment_line: }
+      }
+      { \__nwafudoc_output_line: }
+  }
+\cs_new_protected_nopar:Npn \__nwafudoc_process_verbatim_line:
+  {
+    \tl_if_eq:NNTF \l__nwafudoc_macro_code_line_tl
+        \g__nwafudoc_macro_code_verbatim_stop_tl
+      {
+        \tl_gclear:N \g__nwafudoc_macro_code_verbatim_stop_tl
+        \cs_gset_eq:NN \__nwafudoc_macro_code_process_line:
+          \__nwafudoc_process_normal_line:
+        \__nwafudoc_output_module:nn
+          { \color { verb at guard } }
+          {
+            \__nwafudoc_swap_cr:
+            \__nwafudoc_module_pop:n { \l__nwafudoc_macro_code_line_tl }
+          }
+      }
+      { \tl_use:N \l__nwafudoc_macro_code_line_tl }
+  }
+\cs_new_eq:NN \__nwafudoc_macro_code_process_line:
+  \__nwafudoc_process_normal_line:
+\DeclareDocumentCommand \CheckModules { }
+  {
+    \cs_set_eq:NN \__nwafudoc_macro_code_process_line:
+      \__nwafudoc_process_normal_line:
+  }
+\DeclareDocumentCommand \DontCheckModules { }
+  {
+    \cs_set_eq:NN \__nwafudoc_macro_code_process_line:
+      \__nwafudoc_output_line:
+  }
+\cs_new_protected:Npn \__nwafudoc_check_angle:n #1
+  {
+    \str_if_eq:eeTF { \str_head:n {#1} } { < }
+      { \__nwafudoc_check_module:x { \tl_tail:n {#1} } }
+      { \__nwafudoc_output_comment_line: }
+  }
+\cs_generate_variant:Nn \__nwafudoc_check_angle:n { x }
+\cs_new_protected:Npn \__nwafudoc_check_module:n #1
+  {
+    \str_case_e:nnF { \str_head:n {#1} }
+      {
+        { * } { \__nwafudoc_module_star:w }
+        { / } { \__nwafudoc_module_slash:w }
+        { @ } { \__nwafudoc_module_at:w }
+        { < } { \__nwafudoc_module_verb:w }
+      }
+      { \__nwafudoc_module_pm:w }
+    #1 \q_stop
+  }
+\cs_generate_variant:Nn \__nwafudoc_check_module:n { x }
+\group_begin:
+  \char_set_catcode_active:N \>
+  \cs_new_protected:Npn \__nwafudoc_module_star:w #1 > #2 \q_stop
+    {
+      \tl_set:Nn \l__nwafudoc_tmpa_tl {#2}
+      \tl_if_eq:NNTF \l__nwafudoc_tmpa_tl \c__nwafudoc_active_cr_tl
+        {
+          \__nwafudoc_output_module:nn
+            { \__nwafudoc_star_color: }
+            {
+              \__nwafudoc_module_push:n
+                { \__nwafudoc_module_angle:n {#1} }
+            }
+        }
+        {
+          \__nwafudoc_output_module_left:nn
+            { \__nwafudoc_star_color: }
+            {
+              \__nwafudoc_module_push:n
+                { \__nwafudoc_module_angle:n {#1} }
+            }
+        }
+      \__nwafudoc_output_line:n {#2}
+    }
+  \cs_new_protected:Npn \__nwafudoc_module_slash:w #1 > #2 \q_stop
+    {
+      \tl_set:Nn \l__nwafudoc_tmpa_tl {#2}
+      \tl_if_eq:NNTF \l__nwafudoc_tmpa_tl \c__nwafudoc_active_cr_tl
+        {
+          \__nwafudoc_output_module:nn
+            { \__nwafudoc_slash_color: }
+            {
+              \__nwafudoc_module_pop:n
+                { \__nwafudoc_module_angle:n {#1} }
+            }
+        }
+        {
+          \__nwafudoc_output_module_left:nn
+            { \__nwafudoc_slash_color: }
+            {
+              \__nwafudoc_module_pop:n
+                { \__nwafudoc_module_angle:n {#1} }
+            }
+        }
+      \__nwafudoc_output_line:n {#2}
+    }
+  \cs_new_protected:Npn \__nwafudoc_module_at:w @ @ = #1 > #2 \q_stop
+    {
+      \__nwafudoc_output_module:nn
+        { \color { at at guard } }
+        { \__nwafudoc_module_angle:n { @ @ = #1 } }
+      \tl_gset:Nn \g__codedoc_module_name_tl {#1}
+      \__nwafudoc_output_line:n {#2}
+    }
+  \cs_new_protected:Npn \__nwafudoc_module_verb:w #1 \q_stop
+    {
+      \cs_gset_eq:NN \__nwafudoc_macro_code_process_line:
+        \__nwafudoc_process_verbatim_line:
+      \tl_gset:Nx \g__nwafudoc_macro_code_verbatim_stop_tl
+        { \c_percent_str \tl_tail:n {#1} }
+      \__nwafudoc_output_module:nn
+        { \color { verb at guard } }
+        {
+          \__nwafudoc_swap_cr:
+          \__nwafudoc_module_push:n { \l__nwafudoc_macro_code_line_tl }
+        }
+    }
+  \cs_new_protected:Npn \__nwafudoc_module_pm:w #1 > #2 \q_stop
+    {
+      \__nwafudoc_output_module_left:nn
+        { \__nwafudoc_pm_color: }
+        { \__nwafudoc_module_angle:n {#1} }
+      \__nwafudoc_output_line:n {#2}
+    }
+\group_end:
+\cs_new_protected:Npn \__nwafudoc_output_line:n #1
+  {
+    \tl_set:Nn \l__nwafudoc_macro_code_line_tl {#1}
+    \tl_if_eq:NNTF
+      \l__nwafudoc_macro_code_line_tl \c__nwafudoc_active_cr_tl
+      { \tl_use:N \l__nwafudoc_macro_code_line_tl }
+      {
+        \str_if_eq:eeTF
+          { \str_head:N \l__nwafudoc_macro_code_line_tl } { \c_percent_str }
+          { \__nwafudoc_output_comment_line: } { \__nwafudoc_output_line: }
+      }
+  }
+\cs_new_protected_nopar:Npn \__nwafudoc_output_line:
+  {
+    \tex_noindent:D
+    \__nwafudoc_replace_at_at:N \l__nwafudoc_macro_code_line_tl
+    \tl_use:N \l__nwafudoc_macro_code_line_tl
+  }
+\cs_new_protected:Npn \__nwafudoc_output_comment_line:
+  {
+    \tex_noindent:D
+    \group_begin:
+      \__nwafudoc_swap_cr:
+      \color { code at gray } \slshape \__nwafudoc_output_line:
+    \group_end:
+  }
+\cs_new_protected:Npn \__nwafudoc_replace_at_at:N #1
+  {
+    \tl_if_empty:NF \g__codedoc_module_name_tl
+      { \__nwafudoc_replace_at_at_aux:No #1 \g__codedoc_module_name_tl }
+  }
+\cs_new_protected:Npn \__nwafudoc_replace_at_at_aux:Nn #1#2
+  {
+    \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 }
+    \tl_replace_all:Nnn #1 {   @ @ } { _ _ #2 }
+  }
+\cs_generate_variant:Nn \__nwafudoc_replace_at_at_aux:Nn { No }
+\cs_new_protected_nopar:Npn \__nwafudoc_module_push:n
+  { \__nwafudoc_module_push_aux:on { \int_use:N \c at HD@hypercount } }
+\cs_new_protected:Npn \__nwafudoc_module_push_aux:nn #1
+  {
+    \seq_gpush:Nn \g__nwafudoc_module_dest_seq {#1}
+    \hypersetup { hidelinks }
+    \exp_args:Nx \hdclindex
+      { \zref at extractdefault { HD.#1 } { guard at end } { 1 } } { }
+  }
+\cs_generate_variant:Nn \__nwafudoc_module_push_aux:nn { on }
+\cs_new_protected_nopar:Npn \__nwafudoc_module_pop:n
+  {
+    \seq_gpop:NNTF \g__nwafudoc_module_dest_seq \l__nwafudoc_tmpa_tl
+      { \__nwafudoc_module_pop_aux:on { \l__nwafudoc_tmpa_tl } }
+      { \BOOM \use:n }
+  }
+\cs_new_protected:Npn \__nwafudoc_module_pop_aux:nn #1
+  {
+    \zref at labelbylist { HD.#1 } { nwafudoc }
+    \hypersetup { hidelinks }
+    \hdclindex {#1} { }
+  }
+\cs_generate_variant:Nn \__nwafudoc_module_pop_aux:nn { on }
+\seq_new:N \g__nwafudoc_module_dest_seq
+\zref at newlist { nwafudoc }
+\zref at newprop { guard at end } [ 1 ]
+  { \int_eval:n { \c at HD@hypercount - 1 } }
+\zref at addprop { nwafudoc } { guard at end }
+\cs_set_protected:Npn \MacroFont
+  {
+    \linespread { 1.05 }
+    \small \ttfamily \mdseries \upshape
+    \__nwafudoc_verb_addon:
+  }
+\cs_new_protected:Npn \__nwafudoc_output_module:nn #1#2
+  {
+    \tex_noindent:D
+    \group_begin:
+      #1
+      \footnotesize \normalfont \sffamily #2
+    \group_end:
+  }
+\cs_new_protected:Npn \__nwafudoc_output_module_left:nn #1#2
+  {
+    \tex_noindent:D
+    \hbox_overlap_left:n
+      {
+        \__nwafudoc_output_module:nn {#1} {#2}
+        \skip_horizontal:n { \leftskip + \smallskipamount }
+      }
+  }
+\cs_new_protected_nopar:Npn \__nwafudoc_star_color:
+  {
+    \seq_gpop:NNTF \g__nwafudoc_star_color_seq \current at color
+      { \set at color }
+      { \__nwafudoc_select_color: }
+    \seq_gpush:No \g__nwafudoc_slash_color_seq { \current at color }
+  }
+\cs_new_protected_nopar:Npn \__nwafudoc_slash_color:
+  {
+    \seq_gpop:NNTF \g__nwafudoc_slash_color_seq \current at color
+      {
+        \set at color
+        \seq_gpush:No \g__nwafudoc_star_color_seq { \current at color }
+      }
+      { \BOOM }
+  }
+\cs_new_protected_nopar:Npn \__nwafudoc_pm_color:
+  {
+    \seq_get:NNTF \g__nwafudoc_star_color_seq \current at color
+      { \set at color }
+      {
+        \__nwafudoc_select_color:
+        \seq_gpush:No \g__nwafudoc_star_color_seq { \current at color }
+      }
+  }
+\seq_new:N \g__nwafudoc_star_color_seq
+\seq_new:N \g__nwafudoc_slash_color_seq
+\cs_new_protected_nopar:Npn \__nwafudoc_select_color:
+  { \color { guard at series!!+ } }
+\definecolorseries { guard at series }
+  { cmyk } { last } { blue } { purple }
+\resetcolorseries [ 3 ] { guard at series }
+\definecolor { verb at guard } { named } { MaterialLime600 }
+\definecolor { at at guard   } { named } { MaterialPink    }
+\definecolor { code at gray  } { named } { MaterialGrey    }
+\cs_new_protected:Npn \__nwafudoc_module_angle:n #1
+  { < #1 > }
+\cs_new_protected_nopar:Npn \__nwafudoc_code_line_no:
+  {
+    \int_gincr:N \c at CodelineNo
+    \hbox_overlap_left:n
+      {
+        \hbox_to_wd:nn
+          { \MacroIndent }
+          {
+            \HD at target
+            \tex_hss:D \__nwafudoc_code_line_no_style:
+            \theCodelineNo \enspace
+          }
+        \tex_kern:D \@totalleftmargin
+      }
+  }
+\tl_set:Nn \theCodelineNo { \arabic { CodelineNo } }
+\cs_new_protected_nopar:Npn \__nwafudoc_code_line_no_style:
+  { \color { code at gray } \normalfont \sffamily \tiny }
+\cs_set_protected:Npn \HD at SetMacroIndent #1
+  {
+    \group_begin:
+      \settowidth \MacroIndent
+        {
+          \__nwafudoc_code_line_no_style:
+          \prg_replicate:nn { \tl_count:n {#1} } { 0 }
+          \enspace
+        }
+      \dim_gset_eq:NN \MacroIndent \MacroIndent
+    \group_end:
+  }
+\sys_if_engine_xetex:TF
+  {
+    \cs_set_eq:NN \__nwafudoc_verb_addon: \xeCJKVerbAddon
+    \cs_set:Nn \__nwafudoc_plain_punct_style:
+      { \xeCJKsetup { PunctStyle = plain } }
+    \cs_set:Nn \__nwafudoc_disable_ecglue:
+      { \xeCJKsetup { CJKecglue } }
+    \__nwafudoc_appto_cmd:Nn \meta at font@select
+      { \mode_if_inner:T { \__nwafudoc_disable_ecglue: } }
+  }
+  {
+    \cs_set_eq:NN \__nwafudoc_verb_addon:        \prg_do_nothing:
+    \cs_set_eq:NN \__nwafudoc_plain_punct_style: \prg_do_nothing:
+    \cs_set:Nn \__nwafudoc_disable_ecglue:
+      { \ltjsetparameter { autoxspacing = false } }
+    \__nwafudoc_appto_cmd:Nn \meta at font@select
+      { \__nwafudoc_disable_ecglue: }
+  }
+\BeforeBeginEnvironment { function }
+  { \par \nointerlineskip }
+\AtEndEnvironment { function }
+  {
+    \par
+    \cs_gset:Nx \__nwafudoc_fix_previous_depth:
+      { \prevdepth = \the \prevdepth \space }
+  }
+\AfterEndEnvironment { function }
+  { \__nwafudoc_fix_previous_depth: }
+\AtBeginEnvironment { syntax }
+  {
+    \linespread { 1.2 }
+    \__nwafudoc_plain_punct_style:
+    \__nwafudoc_disable_ecglue:
+  }
+\AtBeginEnvironment { nwafusyntax }
+  {
+    \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 at aux
+    \char_set_active_eq:NN ( \defaultval at aux
+  }
+\cs_new_eq:NN \__nwafudoc_ltx_changes:nnn \changes@
+\cs_set_protected:Npn \changes@ #1#2
+  {
+    \__nwafudoc_save_version_date:nn {#1} {#2}
+    \__nwafudoc_ltx_changes:nnn {#1} {#2}
+  }
+\prop_new:N \g__nwafudoc_version_date_prop
+\cs_new_protected:Npn \__nwafudoc_save_version_date:nn #1#2
+  {
+    \prop_get:NnNTF \g__nwafudoc_version_date_prop
+      {#1} \l__nwafudoc_tmpa_tl
+      {
+        \exp_after:wN
+          \__nwafudoc_save_version_date_aux:nnnn \l__nwafudoc_tmpa_tl
+        {#2} {#1}
+      }
+      { \__nwafudoc_save_version_date_aux:nnn {#1} {#2} {#2} }
+  }
+\cs_new_protected:Npn \__nwafudoc_save_version_date_aux:nnnn #1#2#3#4
+  {
+    \__nwafudoc_if_date_later:nnTF {#1} {#3}
+      { \__nwafudoc_save_version_date_aux:nnn {#4} {#3} {#2} }
+      {
+        \__nwafudoc_if_date_later:nnT {#3} {#2}
+          { \__nwafudoc_save_version_date_aux:nnn {#4} {#1} {#3} }
+      }
+  }
+\cs_new_protected:Npn \__nwafudoc_save_version_date_aux:nnn #1#2#3
+  { \prop_gput:Nnn \g__nwafudoc_version_date_prop {#1} { {#2} {#3} } }
+\prg_new_conditional:Npnn \__nwafudoc_if_date_later:nn #1#2 { TF, T }
+  {
+    \if_int_compare:w
+        \__nwafudoc_parse_date:w #1 / / / 0 \q_stop >
+        \__nwafudoc_parse_date:w #2 / / / 0 \q_stop \exp_stop_f:
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+\cs_new:Npn \__nwafudoc_parse_date:w #1/#2/#3/ #4 \q_stop
+  { #1#2#3 }
+\cs_new_protected:Npn \CTEX at versionitem #1 \efill
+  {
+    \@idxitem
+    \prop_get:NnNTF \g__nwafudoc_version_date_prop
+      {#1} \l__nwafudoc_tmpa_tl
+      {
+        \exp_after:wN
+          \__nwafudoc_print_version_date:nnn \l__nwafudoc_tmpa_tl
+        {#1}
+      }
+      { \BOOM }
+  }
+\cs_new_protected:Npn \__nwafudoc_print_version_date:nnn #1#2#3
+  {
+    \noindent
+    \Hy at raisedlink { \belowpdfbookmark {#3} { HD.#3 } }
+    \textbf {#3} \hfill
+    \hbox:n
+      {
+        \footnotesize
+        \str_if_eq:nnTF {#1} {#2}
+          { ( #1 ) } { ( #1 ~ -- ~ #2 ) }
+      }
+    \par \nopagebreak
+  }
+\ctex_patch_cmd:Nnn \HDorg at theglossary
+  { \let \item \@idxitem }
+  { \let \item \CTEX at versionitem }
+\ctex_patch_cmd:Nnn \@wrglossary
+  { hdpindex }
+  {
+    \ifnum \c at HD@hypercount = \z@
+      hdpindex
+    \else
+      hdclindex { \the \c at HD@hypercount }
+    \fi
+  }
+\ctex_patch_cmd:Nnn \@addtocurcol
+  { \vskip \intextsep }
+  {
+    \edef \save at first@penalty { \the \lastpenalty } \unpenalty
+    \ifnum \lastpenalty = \@M
+      \unpenalty
+    \else
+      \penalty \save at 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
+  }
+\ctex_patch_cmd:Nnn \@getpen { \@M } { \@Mi }
+\ctex_patch_cmd:Nnn \l at section    { 2.5em } { 1.5em }
+\ctex_patch_cmd:Nnn \l at subsection { 2.5em } { 1.5em }
+\__nwafudoc_preto_cmd:Nn \@thehead
+  { \cs_set_eq:cN { MakeUppercase \space } \@iden }
+\ctex_patch_cmd:Nnn \HDorg at thebibliography
+  { \section* } { \section }
+\cs_set_eq:NN \thebibliography \HDorg at thebibliography
+\__nwafudoc_appto_cmd:Nn \GlossaryParms
+  {
+    \raggedcolumns
+    \cs_set_eq:NN \Hy at writebookmark \HDorg at writebookmark
+    \cs_set:Npn \@idxitem   { \par \hangindent 2em }
+    \cs_set:Npn \subitem    { \@idxitem \hspace* { 1em } }
+    \cs_set:Npn \subsubitem { \@idxitem \hspace* { 2em } }
+  }
+\ctex_patch_cmd:Nnn \HoLogo at LaTeXe
+  { \hbox { \HOLOGO at MathSetup 2 $ _{ \textstyle \varepsilon } $ } }
+  {
+    \hbox
+      {
+        \mathsurround 0pt \relax
+        2
+        \if b \expandafter \@car \f at series \@nil
+          $ _{ \textstyle \symbf { \varepsilon } } $
+        \else
+          $ _{ \textstyle \varepsilon } $
+        \fi
+      }
+  }
+\ctex_patch_cmd:Nnn \SpecialMainEnvIndex
+  { (environment) } { ~ 环境 }
+\ctex_patch_cmd:Nnn \SpecialMainEnvIndex
+  { environments: } { 环境: }
+\ctex_patch_cmd:Nnn \HDorg at SpecialEnvIndex
+  { (environment) } { ~ 环境 }
+\ctex_patch_cmd:Nnn \HDorg at SpecialEnvIndex
+  { environments: } { 环境: }
+\cs_set_eq:NN \list \__codedoc_oldlist:nn
+\__nwafudoc_patch_cmd:Nnn \__codedoc_function_descr_start:w
+  { \noindent }
+  { \skip_vertical:n { -\parskip } \noindent }
+\__nwafudoc_preto_cmd:Nn \__codedoc_function_assemble:
+  {
+    \box_if_empty:NTF \g__codedoc_syntax_box
+      { \skip_zero:N \medskipamount }
+      { \skip_add:Nn \medskipamount { \parskip } }
+  }
+\__nwafudoc_patch_cmd:Nnn \__codedoc_typeset_functions:
+  { \small \ttfamily } { \footnotesize \ttfamily }
+\__nwafudoc_preto_cmd:Nn \__codedoc_typeset_functions:
+  { \MacroFont }
+\__nwafudoc_patch_cmd:Nnn \__codedoc_macro_init:
+  { \hbox:n } { \MacroFont \hbox:n }
+\__nwafudoc_patch_cmd:Nnn \__codedoc_macro_dump:
+  { \hbox_unpack_drop:N } { \MacroFont \hbox_unpack_drop:N }
+\__nwafudoc_patch_cmd:Nnn \__codedoc_meta_original:n
+  { \ensuremath \langle } { \textlangle }
+\__nwafudoc_patch_cmd:Nnn \__codedoc_meta_original:n
+  { \ensuremath \rangle } { \textrangle }
+\cs_set_eq:NN \__codedoc_macro_end_style:n \use_none:n
+\cs_set_protected:Npn \__codedoc_typeset_TF:
+  {
+    \group_begin:
+      \exp_args:No \__codedoc_if_macro_internal:nT \l__codedoc_tmpa_tl
+        { \color [ gray ] { 0.5 } }
+      \itshape TF
+      \makebox [ 0 pt ] [ r ]
+        {
+          \color { red }
+          \underline { \phantom { \itshape TF } \kern -0.1 em }
+        }
+    \group_end:
+  }
+\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
+  {
+    \vbox_set:Nn \l__codedoc_macro_box
+      {
+        \MacroFont
+        \vbox_unpack_drop:N \l__codedoc_macro_box
+        \hbox_set:Nn \l_tmpa_box
+          { \__codedoc_print_macroname:nN {#1} #2 }
+        \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__codedoc_macro_int
+  }
+\cs_set_protected:Npn \__codedoc_print_macroname:nN #1#2
+  {
+    \strut
+    \__codedoc_get_hyper_target:xN
+      {
+        \exp_not:n {#1}
+        \bool_if:NT #2 { \tl_to_str:n {TF} }
+      }
+      \l__codedoc_tmpa_tl
+    \cs_if_exist:cTF { r@ \l__codedoc_tmpa_tl }
+      { \exp_args:NNo \label at hyperref [ \l__codedoc_tmpa_tl ] }
+      { \use:n }
+      {
+        \tl_set:Nn \l__codedoc_tmpa_tl {#1}
+        \tl_replace_all:Non \l__codedoc_tmpa_tl
+          { \c_catcode_other_space_tl }
+          { \fontspec_visible_space: }
+        \__codedoc_macroname_prefix:o \l__codedoc_tmpa_tl
+        \__codedoc_macroname_suffix:N #2
+      }
+  }
+\cs_set_protected:Npn \__codedoc_special_index_module:nnnnN #1#2#3#4#5
+  {
+    \use:x
+      {
+        \exp_not:n { \__codedoc_special_index_aux:nnnnnnn {#1} {#2} }
+          \tl_if_empty:nTF {#3}
+            { { } { } { } { } }
+            {
+              \str_if_eq:eeTF {#3} { TeX }
+                {
+                  { TeX~ and~ LaTeX2e }
+                  { \string \TeX{}~ 和~ \string \LaTeXe{} }
+                }
+                { {#3} { \string \pkg {#3} } }
+              \bool_if:NTF #5
+                { { commands~ internal } { ~ 内部命令: } }
+                { { commands           } { ~ 命令:     } }
+            }
+      }
+    {#4}
+  }
+\cs_new_protected:Npn \__codedoc_special_index_aux:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \tl_set:Nn \l__codedoc_index_escaped_key_tl {#1}
+    \__codedoc_quote_special_char:N \l__codedoc_index_escaped_key_tl
+    \__codedoc_special_index_set:Nn
+      \l__codedoc_index_escaped_macro_tl {#2}
+    \str_if_eq:onTF { \@currenvir } { macrocode }
+      { \codeline at wrindex }
+      {
+        \str_case:nnF {#7}
+          {
+            { main  } { \codeline at wrindex }
+            { usage } { \index }
+          }
+          { \HD at target \index }
+      }
+      {
+        \tl_if_empty:nF { #3 #4 #5 #6 }
+          { #3 #5 \actualchar #4 #6 \levelchar }
+        \l__codedoc_index_escaped_key_tl
+        \actualchar
+        {
+          \token_to_str:N \verbatim at font \c_space_tl
+          \l__codedoc_index_escaped_macro_tl
+        }
+        \encapchar
+        hdclindex { \the \c at HD@hypercount } {#7}
+      }
+  }
+\DeclareDocumentCommand \StopSpecialIndexModule { }
+  {
+    \cs_set_eq:NN
+      \__codedoc_special_index_module:nnnnN \use_none:nnnnn
+  }
+\tl_map_inline:nn { \actualchar \encapchar \levelchar }
+  { \exp_args:Nx \DoNotIndex { \bslash \tl_to_str:N #1 } }
+\RenewDocumentCommand \meta { m }
+  {
+    \group_begin:
+      \sys_if_engine_xetex:T { \xeCJKsetup { CJKecglue = { } } }
+      \__codedoc_meta:n {#1}
+    \group_end:
+  }
+\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 }
+\ExplSyntaxOff
+\AtBeginDocument{%
+  \addtocontents{toc}{\StopSpecialIndexModule}}
+\pdfstringdefDisableCommands{%
+  \let\path\meta
+  \let\opt\@firstofone}
+\let\@multitoc at starttoc\@starttoc
+\renewcommand*\@starttoc[1]{%
+  \begin{multicols}{2}%
+    \@multitoc at starttoc{#1}%
+  \end{multicols}}
+\renewcommand\@makefntext[1]{\parindent 0em\noindent\@makefnmark~#1}
+\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{代码索引}
+\GlossaryPrologue{\section{\glossaryname}}
+\def\glossaryname{修订记录}
+\ctexset{%
+  section/name        = {第,节},
+  section/format+     = \raggedright,
+  paragraph/runin     = false,
+  paragraph/numbering = false,
+  punct               = kaiming}
+\setcounter{secnumdepth}{4}
+\setcounter{tocdepth}{3}
+\pagestyle{plain}
+\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}
+\hypersetup{%
+  bookmarksdepth    = 4,
+  bookmarksnumbered = true,
+  colorlinks        = true,
+  citecolor         = MaterialGreen,
+  linkcolor         = MaterialPink,
+  urlcolor          = MaterialIndigo}
+\captionsetup{labelsep = quad, labelfont+ = bf}
+\setlist{noitemsep, topsep=\smallskipamount}
+\setlist[1]{labelindent=\parindent}
+\setlist[enumerate]{leftmargin=*}
+\setlist[itemize]{leftmargin=*}
+\newlist{optdesc}{description}{3}
+\setlist[optdesc]{%
+  font=\mdseries\small\ttfamily, align=right,
+  listparindent=\parindent,
+  labelsep=\marginparsep, labelindent=-\marginparsep,
+  leftmargin=*}
+\renewlist{tablenotes}{description}{1}
+\setlist[tablenotes]{%
+  format=\normalfont\tnote at item, align=right,
+  listparindent=\parindent, labelindent=\tabcolsep,
+  leftmargin=*, rightmargin=\tabcolsep,
+  after=\@noparlisttrue}
+\AtBeginEnvironment{tablenotes}{%
+  \setlength\parindent{2\ccwd}%
+  \normalfont\footnotesize}
+\AtBeginEnvironment{threeparttable}{%
+  \stepcounter{tpt at id}%
+  \edef\curr at tpt@id{tpt@\arabic{tpt at id}}}
+\newcounter{tpt at id}
+\def\tnote at item#1{%
+  \Hy at raisedlink{\hyper at anchor{\curr at tpt@id-#1}}#1}
+\def\TPTtagStyle#1{\hyperlink{\curr at tpt@id-#1}{#1}}
+\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 at addto@macro\UrlBreaks{\UrlOrds}
+\g at addto@macro\UrlBreaks{\UrlAlphabet}
+\g at addto@macro\UrlBreaks{\UrlDigits}
+\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}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\newcommand*\exptarget{\Hy at raisedlink{\hypertarget{expstar}{}}}
+\newcommand*\rexptarget{\Hy at raisedlink{\hypertarget{rexpstar}{}}}
+\newcommand*\expstar{\hyperlink{expstar}{$\symbol{"263B}$}}
+\newcommand*\rexpstar{\hyperlink{rexpstar}{$\symbol{"263A}$}}
+\ExplSyntaxOn
+\cs_set_eq:NN \__codedoc_typeset_exp:  \expstar
+\cs_set_eq:NN \__codedoc_typeset_rexp: \rexpstar
+\ExplSyntaxOff
+\renewcommand*\marg[1]{\{\meta{#1}\}}
+\renewcommand*\oarg[1]{[\meta{#1}]}
+\renewcommand*\parg[1]{(\meta{#1})}
+\DeclareDocumentCommand\opt{m}{\texttt{#1}}
+\DeclareDocumentCommand\kvopt{mm}
+  {\texttt{#1\breakablethinspace=\breakablethinspace#2}}
+\def\breakablethinspace{\hskip 0.16667em\relax}
+\def\syntaxopt#1{\textit{#1}}
+\def\defaultval#1{\textbf{\textup{#1}}}
+\def\syntaxopt at aux#1>{\syntaxopt{#1}}
+\def\defaultval at aux#1){\defaultval{#1}}
+\def\orbar{\textup{\textbar}}
+\def\TF{true\orbar false}
+\def\TTF{\defaultval{true}\orbar false}
+\def\TFF{true\orbar\defaultval{false}}
+\DeclareDocumentEnvironment{arguments}{}
+  {\enumerate[%
+    label={\texttt{\#\arabic*:~}}, labelsep=0pt, nolistsep]}%
+  {\endenumerate}
+\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}}
+\def\TikZ{Ti\emph{k}Z}
+\renewcommand*\env[1]{\textbf{\texttt{#1}}}
+\newcommand*\bashcmd[1]{\texttt{#1}}
+\newcommand*\scite[1]{\textsuperscript{\cite{#1}}}
+\lst at CCPutMacro\lst at ProcessOther {"2D}{\lst at ttfamily{-{}}{-{}}}
+\@empty\z@\@empty
+\lstdefinestyle{style at base}
+  {
+    basewidth       = 0.5 em,
+    gobble          = 3,
+    lineskip        = 2 pt,
+    frame           = l,
+    framerule       = 1 pt,
+    framesep        = 0 pt,
+    escapeinside    = {(*}{*)},
+    basicstyle      = \small\ttfamily\color{MaterialGrey900},
+    keywordstyle    = \bfseries\color{MaterialIndigo},
+    commentstyle    = \itshape\color{MaterialGrey600},
+    stringstyle     = \color{MaterialRed},
+    backgroundcolor = \color{MaterialGrey50}
+  }
+\lstdefinestyle{style at shell}
+  {
+    style      = style at base,
+    rulecolor  = \color{MaterialPink},
+    language   = bash,
+    alsoletter = {-},
+    emphstyle  = \color{MaterialGreen800}
+  }
+\lstdefinestyle{style at latex}
+  {
+    style      = style at base,
+    rulecolor  = \color{MaterialIndigo},
+    language   = [LaTeX]TeX,
+    alsoletter = {*, -},
+    texcsstyle = *\color{MaterialDeepOrange},
+    emphstyle  = [1]\color{MaterialGreen800},
+    emphstyle  = [2]\color{MaterialTeal}
+  }
+\lstdefinestyle{style at syntax}
+  {
+    basewidth     = 0.5 em,
+    gobble        = 6,
+    escapeinside  = {(*}{*)},
+    language      = [LaTeX]TeX,
+    alsoletter    = {*, -},
+    basicstyle    = \footnotesize\ttfamily\color{MaterialGrey900},
+    keywordstyle  = \bfseries\color{MaterialIndigo},
+    commentstyle  = \itshape\color{MaterialGrey600},
+    texcsstyle    = *\color{MaterialDeepOrange},
+    emphstyle     = [1]\color{MaterialGreen800},
+    emphstyle     = [2]\color{MaterialTeal}
+  }
+\lstnewenvironment{shellexample}[1][]{%
+  \lstset{style=style at shell, #1}}{}
+\lstnewenvironment{latexexample}[1][]{%
+  \lstset{style=style at latex, #1}}{}
+\lstnewenvironment{nwafusyntax}[1][]{%
+  \lstset{style=style at syntax, #1}\vspace{-1.8ex}}{}
+\endinput
+%%
+%% End of file `nwafudoc.cls'.


Property changes on: trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafudoc.cls
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafuthesis.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafuthesis.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafuthesis.pdf	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafuthesis.pdf	2021-08-05 20:53:34 UTC (rev 60172)

Property changes on: trunk/Master/texmf-dist/doc/latex/nwafuthesis/nwafuthesis.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/nwafuthesis/build-win.bat
===================================================================
--- trunk/Master/texmf-dist/source/latex/nwafuthesis/build-win.bat	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/nwafuthesis/build-win.bat	2021-08-05 20:53:34 UTC (rev 60172)
@@ -0,0 +1,7 @@
+xetex nwafuthesis.dtx &&\
+xelatex nwafuthesis.dtx &&\
+makeindex -s gind.ist -o nwafuthesis.ind nwafuthesis.idx &&\
+makeindex -s gglo.ist -o nwafuthesis.gls nwafuthesis.glo &&\
+xelatex nwafuthesis.dtx &&\
+xelatex nwafuthesis.dtx &&\
+xelatex nwafuthesis.dtx


Property changes on: trunk/Master/texmf-dist/source/latex/nwafuthesis/build-win.bat
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/nwafuthesis/build.sh
===================================================================
--- trunk/Master/texmf-dist/source/latex/nwafuthesis/build.sh	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/nwafuthesis/build.sh	2021-08-05 20:53:34 UTC (rev 60172)
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+xetex nwafuthesis.dtx &&\
+xelatex nwafuthesis.dtx &&\
+makeindex -s gind.ist -o nwafuthesis.ind nwafuthesis.idx &&\
+makeindex -s gglo.ist -o nwafuthesis.gls nwafuthesis.glo &&\
+xelatex nwafuthesis.dtx &&\
+xelatex nwafuthesis.dtx &&\
+xelatex nwafuthesis.dtx


Property changes on: trunk/Master/texmf-dist/source/latex/nwafuthesis/build.sh
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis-doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis-doc.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis-doc.dtx	2021-08-05 20:53:34 UTC (rev 60172)
@@ -0,0 +1,2115 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2019--2022 by Nan Geng <nangeng at nwafu.edu.cn>
+%
+% 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 Nan Geng.
+%
+% \fi
+%
+% \EnableImplementation
+%
+% \begin{implementation}
+%
+% 代码部分的页边距
+% \newgeometry{
+%   left      = 2.25 in,
+%   right     = 1.00 in,
+%   top       = 1.25 in,
+%   bottom    = 1.00 in,
+%   marginpar = 2.25 in
+% }
+%
+% \subsection{模板文档样式 \cls{nwafudoc}}
+%
+% \changes{v0.4}{2017/07/29}{在 \cls{ctxdoc} 的基础上完成
+%   \cls{nwafudoc} 文档类,用于模板手册的编写。}
+%
+% 编写 \LaTeX{} 宏包文档,传统上会采用 \pkg{doc} 宏包或
+% \cls{ltxdoc} 文档类。而对于使用 \LaTeX3 开发的宏包,\cls{l3doc}
+% 文档类将是一个更好的选择。\CTeX{} 宏集所附带的
+% \href{https://github.com/CTeX-org/ctex-kit/blob/master/tool/ctxdoc.cls}
+% {\cls{ctxdoc}} 文档类,则在 \cls{l3doc} 的基础上进行了一些修正,
+% 特别是重新实现了 \env{macrocode} 环境,使之能更好地应用于中文
+% 文档。\cls{ctxdoc} 的主要功能如下:
+%
+% \begin{itemize}
+%   \item 注释使用灰色、倾斜字体,以便与一般代码区分;
+%   \item 模块、名字空间等使用彩色标注,并添加超链接;
+%   \item 自动更新行号宽度;
+%   \item 边注中的长命令使用盒子进行缩放,防止溢出;
+%   \item 修订记录中将显示修改日期;
+%   \item 添加中文支持。
+% \end{itemize}
+%
+% 然而,\cls{ctxdoc} 主要供内部使用,代码较为混乱和随意。
+% 本模板的文档样式(\cls{nwafudoc})为适应具体需求,对其代码
+% 进行了整理,添加了相关注释,并做了一些改动:
+%
+% \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{nwafudoc} 的具体实现。
+%
+% \subsubsection{载入宏包、文档类}
+%
+%    \begin{macrocode}
+%<*doc>
+\ExplSyntaxOff
+%    \end{macrocode}
+%
+% 无需载入 \pkg{thumbpdf}。
+%    \begin{macrocode}
+\@namedef{ver at 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]{ctex}
+%    \end{macrocode}
+% 与 \pkg{hypdoc}(由 \cls{l3doc} 调用)冲突,导致脚注超链接
+% 无法正常跳转。暂时禁用。
+%    \begin{macrocode}
+% \RequirePackage[stable, bottom]{footmisc}
+\RequirePackage{%
+  caption,
+  geometry,
+  graphicx,
+  listings,
+  makecell,
+  siunitx,
+  tabularx,
+  threeparttable,
+  unicode-math,
+  xcolor,
+  xcolor-material,
+  xunicode,
+  zref-base
+}
+%    \end{macrocode}
+%
+% \subsubsection{\env{macrocode} 环境}
+%
+% \paragraph{继承的代码}
+%
+% \begin{macro}[int]{\macro at code}
+% 在 \pkg{doc} 宏包中,\env{macrocode} 环境的核心功能由命令
+% \tn{macro at code} 负责实现,而 \tn{xmacro at code} 只用来结束
+% \env{macrocode} 环境。但在 \cls{l3doc} 以及 \cls{ctxdoc} 中,
+% \tn{xmacro\-@\-code} 则基本接管了 \tn{macro at code} 的功能。
+% 后者此时只起辅助作用。
+%    \begin{macrocode}
+\def\macro at code{%
+%    \end{macrocode}
+% 调整前后间距,禁止 \env{macrocode} 环境前的分页。
+%    \begin{macrocode}
+  \topsep \MacrocodeTopsep
+  \@beginparpenalty \predisplaypenalty
+%    \end{macrocode}
+% 将列表前后的附加垂直空白设为 0。根据 \cls{ctxdoc} 修改。
+%    \begin{macrocode}
+  \partopsep \z at skip
+%    \if at inlabel\leavevmode\fi
+%    \end{macrocode}
+% 构建 \env{trivlist} 环境,设置段间距为 0。
+% 之后修改字体,并调节左右间距。\tn{MacroIndent} 会根据代码行数
+% 更新,具体细节见后文。
+% \tn{macro at font} 用来在不同模块见切换字体。本文档类不使用
+% \tn{AltMacroFont},因此这里改用 \tn{MacroFont} 代替。
+%    \begin{macrocode}
+  \trivlist \parskip \z@ \item[]%
+%    \macro at font
+  \MacroFont
+  \leftskip\@totalleftmargin \advance\leftskip\MacroIndent
+  \rightskip\z@ \parindent\z@ \parfillskip\@flushglue
+%    \end{macrocode}
+% 按照 \LaTeXe{} 中 \tn{verbatim} 环境中定义 \tn{par},使得空行
+% 可以原样输出,否则空行会被吃掉。
+%    \begin{macrocode}
+  \blank at linefalse \def\par{\ifblank at line
+                            \leavevmode\fi
+                            \blank at linetrue\@@par
+                            \penalty\interlinepenalty}
+%    \end{macrocode}
+% \tn{obeylines} 将把回车符 |^^M| 变成 \tn{par}。
+% 接下来将所有特殊符号的类别码设为 12,即“其他”类。
+%    \begin{macrocode}
+  \obeylines
+  \let\do\do at noligs \verbatim at nolig@list
+  \let\do\@makeother \dospecials
+%    \end{macrocode}
+% 相当于退出 |\begin{list}| 和 |\begin{minipage}|。
+%    \begin{macrocode}
+  \global\@newlistfalse
+  \global\@minipagefalse
+%    \end{macrocode}
+% 初始化交叉引用功能。
+%    \begin{macrocode}
+  \init at crossref}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+%<@@=nwafudoc>
+\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 at code,\sxmacro at code}
+% 重新实现 \env{macrocode} 与 \env{macrocode*} 环境的核心功能,
+% 将对代码逐行处理。后者会将空格显示为“\verb*| |”。
+%    \begin{macrocode}
+\cs_set_protected_nopar:Npn \xmacro at code
+  { \@@_marco_code:w }
+\cs_set_protected_nopar:Npn \sxmacro at code
+  {
+    \fontspec_print_visible_spaces:
+    \xmacro at code
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_marco_code:w}
+%    \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_marco_code:w
+  {
+%    \end{macrocode}
+% 根据 \tn{codeline at index} 是否为 |true| 选择是否显示行号。
+%    \begin{macrocode}
+    \ifcodeline at 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 at 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 at 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{nwafudoc}] 修复 \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_e: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 at 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:eeTF { \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_e: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 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 at 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:eeTF
+          { \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:
+      \__nwafudoc_swap_cr:
+      \color { code at 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 at 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 at extractdefault { HD.#1 } { guard at 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 at labelbylist { HD.#1 } { nwafudoc }
+    \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 at newlist { nwafudoc }
+\zref at newprop { guard at end } [ 1 ]
+  { \int_eval:n { \c at HD@hypercount - 1 } }
+\zref at addprop { nwafudoc } { guard at 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 at color
+      { \set at color }
+      { \@@_select_color: }
+    \seq_gpush:No \g_@@_slash_color_seq { \current at color }
+  }
+\cs_new_protected_nopar:Npn \@@_slash_color:
+  {
+    \seq_gpop:NNTF \g_@@_slash_color_seq \current at color
+      {
+        \set at color
+        \seq_gpush:No \g_@@_star_color_seq { \current at color }
+      }
+% TODO: 需要报错:star 与 slash 没有匹配
+      { \BOOM }
+  }
+\cs_new_protected_nopar:Npn \@@_pm_color:
+  {
+    \seq_get:NNTF \g_@@_star_color_seq \current at color
+      { \set at color }
+      {
+        \@@_select_color:
+        \seq_gpush:No \g_@@_star_color_seq { \current at 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 at series}
+% 设置模块标记的色系。
+%    \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_select_color:
+  { \color { guard at series!!+ } }
+\definecolorseries { guard at series }
+  { cmyk } { last } { blue } { purple }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% 设置色系的增量大小。可选参数 |3| 意味着基色(blue)与
+% 末色(purple)之间将等分为三份。该数字比嵌套最大深度小 1。
+%    \begin{macrocode}
+\resetcolorseries [ 3 ] { guard at series }
+%    \end{macrocode}
+%
+% \begin{macro}[int]{verb at guard,at at guard,code at gray}
+% 设置颜色。
+%    \begin{macrocode}
+\definecolor { verb at guard } { named } { MaterialLime600 }
+\definecolor { at at guard   } { named } { MaterialPink    }
+\definecolor { code at gray  } { named } { MaterialGrey    }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_module_angle:n}
+% 输出“$\langle\cdots\rangle$”。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_module_angle:n #1
+  { < #1 > }
+%   { \textlangle #1 \textrangle }
+%   { \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 at CodelineNo
+    \hbox_overlap_left:n
+      {
+        \hbox_to_wd:nn
+          { \MacroIndent }
+          {
+            \HD at 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 at gray } \normalfont \sffamily \tiny }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\HD at SetMacroIndent}
+% 设置代码缩进(行号一栏的宽度)。该命令会写进 |.aux| 辅助文件,
+% 以便在二次编译时确定最大行号宽度。
+%    \begin{macrocode}
+\cs_set_protected:Npn \HD at 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 at 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 at 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 at 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}{nwafusyntax}
+% 在 \env{syntax} 和 \env{nwafusyntax} 环境前设置若干活动字符。
+% \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 at aux
+  }
+\AtBeginEnvironment { nwafusyntax }
+  {
+    \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 at aux
+    \char_set_active_eq:NN ( \defaultval at 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 at versionitem}
+% 版本条目标签。如果版本号不在 \cs{g_@@_version_date_prop} 的
+% key 里面,则利用未定义的 \cs{BOOM} 报错。
+%    \begin{macrocode}
+\cs_new_protected:Npn \CTEX at 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 at 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 at theglossary}
+% 该命令由 \pkg{hypdoc} 宏包定义,用于存放标准文档类 \cls{book}
+% 中定义的 \tn{theindex} 命令。
+% 此处的补丁将在版本号一行最后加上修改日期。
+%    \begin{macrocode}
+\ctex_patch_cmd:Nnn \HDorg at theglossary
+  { \let \item \@idxitem }
+  { \let \item \CTEX at versionitem }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@wrglossary}
+% 该命令由 \LaTeXe{} 内核定义,又由 \pkg{hypdoc} 宏包作了修改。
+% 此处的补丁使得修订记录条目的页码能够指向对应行。
+%    \begin{macrocode}
+\ctex_patch_cmd:Nnn \@wrglossary
+  { hdpindex }
+  {
+    \ifnum \c at HD@hypercount = \z@
+      hdpindex
+    \else
+      hdclindex { \the \c at 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 at first@penalty { \the \lastpenalty } \unpenalty
+    \ifnum \lastpenalty = \@M
+      \unpenalty
+    \else
+      \penalty \save at 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 at section,\l at subsection}
+% 修改目录条目的缩进。
+%    \begin{macrocode}
+\ctex_patch_cmd:Nnn \l at section    { 2.5em } { 1.5em }
+\ctex_patch_cmd:Nnn \l at 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 at thebibliography}
+% 参考文献一节需要编号。
+%    \begin{macrocode}
+\ctex_patch_cmd:Nnn \HDorg at thebibliography
+  { \section* } { \section }
+\cs_set_eq:NN \thebibliography \HDorg at thebibliography
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\GlossaryParms}
+% 修改修订记录中的一些缩进。
+%    \begin{macrocode}
+\@@_appto_cmd:Nn \GlossaryParms
+  {
+    \raggedcolumns
+    \cs_set_eq:NN \Hy at writebookmark \HDorg at 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 at LaTeXe}
+% 由于使用了 \pkg{unicode-math},需要额外修改 \pkg{hologo} 中的
+% \tn{LaTeXe} 命令,以使粗体正常显示。
+%    \begin{macrocode}
+\ctex_patch_cmd:Nnn \HoLogo at LaTeXe
+  { \hbox { \HOLOGO at MathSetup 2 $ _{ \textstyle \varepsilon } $ } }
+  {
+    \hbox
+      {
+        \mathsurround 0pt \relax
+        2
+        \if b \expandafter \@car \f at 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 at SpecialEnvIndex}
+% \pkg{hypdoc} 宏包重新定义了 \tn{SpecialEnvIndex} 命令,因此需要
+% 修改内部定义。
+%    \begin{macrocode}
+\ctex_patch_cmd:Nnn \HDorg at SpecialEnvIndex
+  { (environment) } { ~ 环境 }
+\ctex_patch_cmd:Nnn \HDorg at 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}
+\__nwafudoc_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}
+\__nwafudoc_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}
+\__nwafudoc_patch_cmd:Nnn \@@_typeset_functions:
+  { \small \ttfamily } { \footnotesize \ttfamily }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_typeset_functions:,\@@_macro_init:,
+%   \@@_macro_dump:}
+% 左侧边注的函数列表采用单倍行距。
+%    \begin{macrocode}
+\__nwafudoc_preto_cmd:Nn \@@_typeset_functions:
+  { \MacroFont }
+\__nwafudoc_patch_cmd:Nnn \@@_macro_init:
+  { \hbox:n } { \MacroFont \hbox:n }
+\__nwafudoc_patch_cmd:Nnn \@@_macro_dump:
+  { \hbox_unpack_drop:N } { \MacroFont \hbox_unpack_drop:N }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_meta_original:n}
+% 改用文本模式显示尖括号。
+%    \begin{macrocode}
+\__nwafudoc_patch_cmd:Nnn \@@_meta_original:n
+  { \ensuremath \langle } { \textlangle }
+\__nwafudoc_patch_cmd:Nnn \@@_meta_original:n
+  { \ensuremath \rangle } { \textrangle }
+%    \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_drop: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 at 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:eeTF {#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 at wrindex }
+      {
+        \str_case:nnF {#7}
+          {
+            { main  } { \codeline at wrindex }
+            { usage } { \index }
+          }
+          { \HD at 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 at font \c_space_tl
+          \l_@@_index_escaped_macro_tl
+        }
+        \encapchar
+        hdclindex { \the \c at 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 = { } } }
+      \@@_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}
+%
+% 设置 PDF 字符串中的命令替换。
+%    \begin{macrocode}
+\pdfstringdefDisableCommands{%
+  \let\path\meta
+  \let\opt\@firstofone}
+%    \end{macrocode}
+%
+% \begin{macro}[int]{\@multitoc at starttoc,\@starttoc}
+% 目录分栏,相当于调用 \pkg{multitoc} 宏包。
+%    \begin{macrocode}
+\let\@multitoc at starttoc\@starttoc
+\renewcommand*\@starttoc[1]{%
+  \begin{multicols}{2}%
+    \@multitoc at starttoc{#1}%
+  \end{multicols}}
+%    \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}
+\ctexset{%
+  section/name        = {第,节},
+  section/format+     = \raggedright,
+  paragraph/runin     = false,
+  paragraph/numbering = false,
+  punct               = kaiming}
+\setcounter{secnumdepth}{4}
+\setcounter{tocdepth}{3}
+\pagestyle{plain}
+%    \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 at id}
+% 重新定义 \pkg{threeparttable} 包的 \env{tablenotes} 环境,
+% 用于表格的注释。
+%    \begin{macrocode}
+\renewlist{tablenotes}{description}{1}
+\setlist[tablenotes]{%
+  format=\normalfont\tnote at item, align=right,
+  listparindent=\parindent, labelindent=\tabcolsep,
+  leftmargin=*, rightmargin=\tabcolsep,
+  after=\@noparlisttrue}
+\AtBeginEnvironment{tablenotes}{%
+  \setlength\parindent{2\ccwd}%
+  \normalfont\footnotesize}
+\AtBeginEnvironment{threeparttable}{%
+  \stepcounter{tpt at id}%
+  \edef\curr at tpt@id{tpt@\arabic{tpt at id}}}
+\newcounter{tpt at id}
+%    \end{macrocode}
+% \end{variable}
+% \end{environment}
+%
+% \begin{macro}[int]{\tnote at item,\TPTtagStyle}
+% 为 \tn{tnote} 增加超链接。
+%    \begin{macrocode}
+\def\tnote at item#1{%
+  \Hy at raisedlink{\hyper at anchor{\curr at tpt@id-#1}}#1}
+\def\TPTtagStyle#1{\hyperlink{\curr at tpt@id-#1}{#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UrlAlphabet,\UrlDigits}
+% 网址断行。\tn{UrlOrds}、\tn{UrlAlphabet} 和 \tn{UrlDigits}
+% 分别记录了特殊符号、字母和数字,把它们依次附加在 \pkg{url} 宏包
+% 提供的命令 \tn{UrlBreaks} 之后,即可允许在这些位置处断行。与
+% \cs{nwafu_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 at addto@macro\UrlBreaks{\UrlOrds}
+\g at addto@macro\UrlBreaks{\UrlAlphabet}
+\g at 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:}
+% 部分命令之后的特殊符号($\symbol{"263A}$ 或 $\symbol{"263B}$),表明其不同用法。
+% 这里的“exp”和“rexp”分别源自 \LaTeX3 中的“expandable”
+% 和“restricted-expandable”。
+%    \begin{macrocode}
+\newcommand*\exptarget{\Hy at raisedlink{\hypertarget{expstar}{}}}
+\newcommand*\rexptarget{\Hy at raisedlink{\hypertarget{rexpstar}{}}}
+\newcommand*\expstar{\hyperlink{expstar}{$\symbol{"263B}$}}
+\newcommand*\rexpstar{\hyperlink{rexpstar}{$\symbol{"263A}$}}
+\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 at aux,\defaultval at aux}
+% \env{syntax} 中的选项及命令选项。
+% |aux| 结尾的两个命令用于定义利用 |<>| 和 |()| 的简写形式。
+%    \begin{macrocode}
+\def\syntaxopt#1{\textit{#1}}
+\def\defaultval#1{\textbf{\textup{#1}}}
+\def\syntaxopt at aux#1>{\syntaxopt{#1}}
+\def\defaultval at 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 at cs,\codedoc at tn}
+% 控制序列。
+%^^A Colors are used for debug.
+%    \begin{macrocode}
+% \let\codedoc at cs=\cs
+% \let\codedoc at tn=\tn
+% \renewcommand*\cs[2][]{%
+%   \textcolor{MaterialIndigo}{\codedoc at cs[#1]{#2}}}
+% \renewcommand*\tn[2][]{%
+%   \textcolor{MaterialPink}{\codedoc at 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}
+%
+% \paragraph{示例代码环境}
+%
+% \pkg{listings} 宏包中连字符 |-| 原本以数学模式输出,此处改为普通文本。
+% 见 \url{https://tex.stackexchange.com/a/33188}。
+%    \begin{macrocode}
+\lst at CCPutMacro\lst at ProcessOther {"2D}{\lst at ttfamily{-{}}{-{}}}
+\@empty\z@\@empty
+%    \end{macrocode}
+%
+% \changes{v0.5}{2017/09/05}{[\pkg{nwafudoc}] 移除 \pkg{listings}
+%   关键字定义文件。}
+%
+% 定义几种代码样式。
+% \begin{macro}[int]{style at base}
+%    \begin{macrocode}
+\lstdefinestyle{style at base}
+  {
+    basewidth       = 0.5 em,
+    gobble          = 3,
+    lineskip        = 2 pt,
+    frame           = l,
+    framerule       = 1 pt,
+    framesep        = 0 pt,
+    escapeinside    = {(*}{*)},
+    basicstyle      = \small\ttfamily\color{MaterialGrey900},
+    keywordstyle    = \bfseries\color{MaterialIndigo},
+    commentstyle    = \itshape\color{MaterialGrey600},
+    stringstyle     = \color{MaterialRed},
+    backgroundcolor = \color{MaterialGrey50}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{style at shell}
+%    \begin{macrocode}
+\lstdefinestyle{style at shell}
+  {
+    style      = style at base,
+    rulecolor  = \color{MaterialPink},
+    language   = bash,
+    alsoletter = {-},
+    emphstyle  = \color{MaterialGreen800}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{style at latex}
+%    \begin{macrocode}
+\lstdefinestyle{style at latex}
+  {
+    style      = style at 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 at syntax}
+%    \begin{macrocode}
+\lstdefinestyle{style at syntax}
+  {
+    basewidth     = 0.5 em,
+    gobble        = 6,
+    escapeinside  = {(*}{*)},
+    language      = [LaTeX]TeX,
+    alsoletter    = {*, -},
+    basicstyle    = \footnotesize\ttfamily\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 at shell, #1}}{}
+\lstnewenvironment{latexexample}[1][]{%
+  \lstset{style=style at latex, #1}}{}
+%    \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{environment}{nwafusyntax}
+% 语法说明。用于代替 \cls{l3doc} 中的 \env{syntax} 环境。
+%    \begin{macrocode}
+\lstnewenvironment{nwafusyntax}[1][]{%
+  \lstset{style=style at syntax, #1}\vspace{-1.8ex}}{}
+%</doc>
+%    \end{macrocode}
+% \end{environment}
+%
+% \changes{v0.7c}{2019/03/15}{不再附带 \pkg{latexmk} 配置文件。}
+%
+% \clearpage
+%
+% \end{implementation}
+%


Property changes on: trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis-doc.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis.dtx	2021-08-05 20:53:34 UTC (rev 60172)
@@ -0,0 +1,7911 @@
+% \iffalse meta-comment
+% !TeX program  = XeLaTeX
+% !TeX encoding = UTF-8
+%
+% Copyright (C) 2019--2022 by Nan Geng <nangeng at nwafu.edu.cn>
+%
+% 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 Nan Geng.
+%
+% This work consists of the files nwafuthesis.dtx,
+%                                 nwafuthesis-doc.dtx,
+%           and the derived files nwafuthesis.ins,
+%                                 nwafuthesis.cls,
+%                                 nwafudoc.cls,
+%
+%<*internal>
+\iffalse
+%</internal>
+%
+%<*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) 2019--2022 by Nan Geng <nangeng at nwafu.edu.cn>
+
+    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 Nan Geng.
+
+    This work consists of the files nwafuthesis.dtx,
+                                    nwafuthesis-doc.dtx,
+              and the derived files nwafuthesis.ins,
+                                    nwafuthesis.cls,
+                                    nwafudoc.cls,
+
+\endpreamble
+
+\generate{
+  \usedir{tex/latex/nwafuthesis}
+    \file{\jobname.cls}        {\from{\jobname.dtx}{class}}
+    \file{nwafudoc.cls}          {\from{\jobname.dtx}{doc}
+                                \from{\jobname-doc.dtx}{doc}}
+%</install>
+%<*internal>
+  \usedir{source/latex/nwafuthesis}
+    \file{\jobname.ins}        {\from{\jobname.dtx}{install}}
+%</internal>
+%<*install>
+  \usedir{doc/latex/nwafuthesis}
+  \nopreamble\nopostamble
+}
+
+\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/nwafuthesis    *}
+\Msg{*                                                           *}
+\Msg{*     nwafuthesis.cls                                       *}
+\Msg{*     nwafudoc.cls                                          *}
+\Msg{*                                                           *}
+\Msg{* To produce the documentation, run the file nwafuthesis.dtx*}
+\Msg{* through XeLaTeX.                                          *}
+\Msg{*                                                           *}
+\Msg{* Happy TeXing!                                             *}
+\Msg{*                                                           *}
+\Msg{*************************************************************}
+
+\endbatchfile
+%</install>
+%
+%<*internal>
+\fi
+%</internal>
+%
+%<class|doc>\NeedsTeXFormat{LaTeX2e}
+%<class|doc>\RequirePackage{expl3}
+%<*!(driver|install)>
+%<!readme>\GetIdInfo $Id: nwafuthesis.dtx 1.00 2021-05-12 15:30:00Z Nan Geng <nangeng at nwafu.edu.cn> $
+%<class>  {Thesis template for Northwest A\&F University}
+%<class>\ProvidesExplClass{\ExplFileName}
+%<definition>  {Definition file for nwafuthesis}
+%<definition>\ProvidesExplFile{\ExplFileName.def}
+%<doc>  {Documentation class for nwafuthesis}
+%<doc>\ProvidesExplClass{nwafudoc}
+%<!readme>  {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
+%</!(driver|install)>
+%<*driver>
+% \PassOptionsToPackage{showframe}{geometry}
+\documentclass{nwafudoc}
+\usepackage{multirow,xeCJKfntef,xpinyin,csquotes}
+\hypersetup{
+  pdftitle  = {nwafuthesis: 西北农林科技大学学位论文模板},
+  pdfauthor = {耿楠}
+  }
+% 全角标点放在引号中,需要改成半角式,否则间距过大,不好看
+\def\FSID{“{\xeCJKsetup{PunctStyle=banjiao}。}”} % U+3002
+\def\FSFW{“{\xeCJKsetup{PunctStyle=banjiao}.}”} % U+FF0E
+\def\COFW{“{\xeCJKsetup{PunctStyle=banjiao}:}”} % U+FF1A
+\def\SCFW{“{\xeCJKsetup{PunctStyle=banjiao};}”} % U+FF1B
+
+% nwafuthesis的LOGO
+\newcommand{\nwafuthesis}{%
+  \makebox{\rmfamily%
+    N\hspace{-0.2ex}\raisebox{-0.5ex}{W}\raisebox{0.5ex}{\hspace{-0.2ex}\textsc{AFU}}\hspace{0.3ex}%
+    \textsc{Thesis}}}
+
+\title{\textcolor{MaterialIndigo800}{%
+  \textbf{\nwafuthesis: 西北农林科技大学学位论文
+          \xpinyin[font=\sffamily,format=\color{MaterialIndigo800}]{模}{mu2}板}}}
+\author{耿楠}
+\date{\today\quad v1.00%
+  \thanks{\url{https://gitee.com/nwafu_nan/nwafuthesis-l3}.}}
+
+\begin{document}
+\DisableImplementation
+%<!--CODEDOC-->  \EnableImplementation
+%<!--CODEDOC-->  \def\nwafuCODEDOC{}
+  \DocInput{nwafuthesis.dtx}
+  \DocInput{nwafuthesis-doc.dtx}
+\IndexLayout
+\PrintChanges
+\PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \changes{v1.00}{2021/06/06}{开始发布测试。}
+% \changes{v1.00}{2021/05/12}{开始编写模板。}
+%
+% \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 禁止使用 " 符号作为抄录文本缩略符
+% \DeleteShortVerb\"
+%
+%^^A 封面与目录的页边距
+% \newgeometry{
+%   left   = 1.25 in,
+%   right  = 1.25 in,
+%   top    = 1.25 in,
+%   bottom = 1.00 in
+% }
+%
+% \maketitle
+% \vfill
+% \begin{center}
+%   \includegraphics[width=0.20\textwidth]{logo/nwafu-circle.pdf}\\[3ex]
+%   \includegraphics[width=0.5\textwidth]{logo/motto}
+% \end{center}
+% \vfill
+% \begin{center}
+%   \includegraphics[width=0.6\textwidth]{logo/building}
+% \end{center}
+% \vfill
+% \begin{center}
+%   \bfseries\zihao{1}经国本\qquad{}解民生\qquad{}尚科学
+% \end{center}
+% \vfill
+% \thispagestyle{empty}
+% \clearpage
+%
+% \pagenumbering{Roman}
+% \tableofcontents
+% \clearpage
+%
+% \pagenumbering{arabic}
+% \EnableDocumentation
+%^^A \DisableDocumentation
+%
+% \begin{documentation}
+%
+%^^A 用户手册的页边距
+% \newgeometry{
+%   left   = 1.65 in,
+%   right  = 0.80 in,
+%   top    = 1.25 in,
+%   bottom = 1.00 in
+% }
+%
+% \section{简介}
+%
+% 目前,西北农林科技大学 \LaTeX{} 学位论文模板是由信息工程学院
+% 耿楠老师编写的\cls{nwafuthesis}模板。
+% 该模板是基于\LaTeXe{}开发,虽然一直在维护,但由于初期开发代码的不规范,
+% 其维护成本较高,为此,在借鉴\scite{fduthesis}的基础上,
+% 用 \LaTeX3 \scite{source3}根据\scite{西北农林科技大学研究生论文写作指南}和
+% \scite{西北农林科技大学本科生论文撰写规范}
+% 重构了\cls{nwafuthesis}模板,以适应 \TeX{} 技术的发展。
+% 同时\cls{nwafuthesis}还构建了一套简洁的用户接口,以方便用户使用。
+% 新模板更加稳定,普适性更强,运行效率更高。
+%
+% \subsection*{\LaTeX{} 入门}
+%
+% 本文档并非是一份 \LaTeX{} 零基础教程。如果是完完全全的新手,
+% 建议先阅读相关入门文档,如刘海洋编著的《\LaTeX{} 入门》
+% \scite{刘海洋2013latex入门} 第一章,或大名鼎鼎的“\pkg{lshort}”
+% \scite{lshort} 及其中文翻译版 \scite{lshort-zh-cn}。当然,
+% 网络上诸如耿楠录制的\LaTeX{}教学系列视频等入门教程多如牛毛,可以自行选取学习。
+%
+% \subsection*{关于本文档}
+%
+% 本文采用不同字体表示不同内容。无衬线字体表示宏包名称,如
+% \pkg{xeCJK} 宏包、\cls{nwafuthesis} 文档类等;等宽字体表示代码或
+% 文件名,如 \cs{nwafuset} 命令、\env{abstract} 环境、\TeX{} 文档
+% \file{thesis.tex} 等;带有尖括号的楷体(或西文斜体)表示命令参数,
+% 如 \meta{模板选项}、\meta{English title} 等。在使用时,不必输入参数两侧
+% 的尖括号。示例代码进行了语法高亮处理,以方便阅读。
+%
+% 在用户手册中,带有蓝色侧边线的为 \LaTeX{} 代码,而带有粉色侧边线
+% 的则为电脑命令行代码,请注意区分。模板提供的选项、命令、环境等,
+% 均用横线框起,同时给出使用语法和相关说明。
+%
+% 手册中的代码实现部分主要面向对 \LaTeX{} 宏包开发感兴趣的用户。
+% 如果有任何改进意见或者功能需求,欢迎前往 Gitee 仓库提交issue。
+%
+% 文档的最后还提供了版本历史和代码索引,以供查阅。
+%
+% \section{安装}
+%
+% \changes{v1.00}{2021/08/05}{修改安装说明,提交ctan。}
+% \subsection{获取 \cls{nwafuthesis}}
+%
+% \subsubsection{标准安装}
+%
+% 如果没有特殊理由,强烈建议使用宏包管理器安装 \cls{nwafuthesis}。
+% 例如在 \TeXLive{} 中,执行(可能需要管理员权限)
+% \begin{shellexample}[morekeywords={tlmgr,install}]
+%   tlmgr install nwafuthesis
+% \end{shellexample}
+% 即可完成安装。
+%
+% 当然,在 \TeXLive{} 和 \MiKTeX{} 中,也可以通过图形界面进行安装,
+% 此处不再赘述,请参阅软件帮助。
+%
+% \subsubsection{手动安装}
+%
+% 可以从\cls{nwafuthesis}源代码直接生成模板(不推荐):
+%
+% \begin{itemize}
+%   \item 打开 \href{https://gitee.com/nwafu_nan/nwafuthesis-l3}^^A
+%     {Gitee仓库主页},点击“克隆/下载”,并选择“下载ZIP”,
+%     下载 \file{nwafuthesis-master.zip};如果的电脑中安装有 git
+%     程序,也可通过以下命令直接克隆代码仓库:
+%     \begin{shellexample}[gobble=7,alsoletter={.},^^A
+%         morekeywords={git,clone}]
+%       git clone git at gitee.com:nwafu_nan/nwafuthesis-l3.git
+%     \end{shellexample}
+%   \item 在解压后的目录中或进入克隆后的仓库目录,然后执行以下命令以生成
+%     模板的各组件:
+%     \begin{shellexample}[gobble=7,morekeywords={xetex}]
+%       xetex nwafuthesis.dtx
+%     \end{shellexample}
+%   \item 将生成的文档类(\file{.cls})复制到 \TeX{} 发行版本地 TDS 树
+%     的 \path{texmf-local/tex/latex/nwafuthesis/} 目录下,并执行
+%     \bashcmd{mktexlsr} 刷新文件名数据库,方可完成安装。
+% \end{itemize}
+%
+% \subsubsection{扁平化安装}
+%
+% 如果您不希望安装本模板,但需要立刻使用,也可以使用模板提供的安装脚本。
+%
+% \begin{itemize}
+%   \item 打开 \href{https://gitee.com/nwafu_nan/nwafuthesis-l3}^^A
+%     {Gitee仓库主页},点击“克隆/下载”,并选择“下载ZIP”,
+%     下载 \file{nwafuthesis-master.zip};如果的电脑中安装有 git
+%     程序,也可通过以下命令直接克隆代码仓库:
+%     \begin{shellexample}[gobble=7,alsoletter={.},^^A
+%         morekeywords={git,clone}]
+%       git clone git at gitee.com:nwafu_nan/nwafuthesis-l3.git
+%     \end{shellexample}
+%   \item 在解压后的目录中或进入克隆后的仓库目录,然后执行以下命令以生成
+%     模板的各组件:
+%     \begin{itemize}
+%       \item Windows系统:
+%         \begin{shellexample}[gobble=11,morekeywords={build-win}]
+%           build-win
+%         \end{shellexample}
+%       \item Linux系统:
+%         \begin{shellexample}[gobble=11,morekeywords={build.sh}]
+%           ./build.sh
+%         \end{shellexample}
+%     \end{itemize}
+%   \item 将生成的文档类文件(\file{nwafuthesis.cls})复制到
+%         论文撰写工作目录,然后开始撰写论文。
+% \end{itemize}
+%
+% \subsection{模板组成}
+%
+% 本模板主要包含核心文档类、示例项目以及用户文档等几个
+% 部分,其具体组成见表~\ref{tab:nwafuthesis-components}。
+%
+% \begin{table}[ht]
+%   \caption{\cls{nwafuthesis} 的主要组成部分}
+%   \label{tab:nwafuthesis-components}
+%   \centering
+%   \begin{tabular}{lp{20em}}
+%     \toprule
+%     \textbf{文件} & \textbf{功能说明} \\
+%     \midrule
+%     \file{nwafuthesis.cls} & 模板文档类 \\
+%     \file{nwafudoc.cls}    & 编译该用户手册时需要的文档类 \\
+%     \file{nwafuthesis.pdf} & 用户手册 \\
+%     \file{main.tex}        & 空白模板,可以此为基础撰写论文 \\
+%     \bottomrule
+%   \end{tabular}
+% \end{table}
+%
+% \section{使用说明}
+%
+% \subsection{基本用法}
+%
+% 以下是一份简单的 \TeX{} 文档,它演示了 \cls{nwafuthesis}
+% 的最基本用法:
+% \begin{latexexample}[deletetexcs={\documentclass},%
+%     moretexcs={\chapter},morekeywords={\documentclass},%
+%     emph={[2]document}]
+%   % main.tex
+%   \documentclass{nwafuthesis}
+%   \begin{document}
+%     \chapter{欢迎}
+%     \section{欢迎使用nwafuthesis!}
+%     你好,\LaTeX{}!
+%   \end{document}
+% \end{latexexample}
+%
+% 按照 \ref{subsec:编译方式}~小节中的方式编译该文档,应当得到
+% 一篇包含封面、独创声明等在内的空白论文(研究生7页,本科生3页)。
+%
+%
+% \subsection{编译方式} \label{subsec:编译方式}
+%
+% 本模板不支持 \pdfTeX{} 引擎,请使用 \XeLaTeX{} 或 \LuaLaTeX{}
+% 编译,推荐使用 \XeLaTeX{}编译。为了生成正确的目录、脚注、参考文献以及交叉引用,
+% 至少需要连续编译四次。
+%
+% 假设\TeX{} 源文件名为 \file{main.tex},使用 \XeLaTeX{} 编译论文。
+% 则在命令行中可以顺序执行:
+% \begin{shellexample}[morekeywords={xelatex}]
+%   xelatex main
+%   biber   main
+%   xelatex main
+%   xelatex main
+% \end{shellexample}
+% 或使用带有参数\meta{-xelatex}的 \pkg{latexmk}命令:
+% \begin{shellexample}[morekeywords={latexmk},emph={-xelatex}]
+%   latexmk -xelatex main
+% \end{shellexample}
+%
+% 如果使用 \LuaLaTeX{} 编译论文,请在命令行中顺序执行:
+% \begin{shellexample}[morekeywords={lualatex}]
+%   lualatex main
+%   biber   main
+%   lualatex main
+%   lualatex main
+% \end{shellexample}
+% 或者执行带有\meta{-lualatex}的latexmk命令
+% \begin{shellexample}[morekeywords={latexmk},emph={-lualatex}]
+%   latexmk -lualatex main
+% \end{shellexample}
+%
+% 由于我校参考文献格式的特殊性,本模板基于
+% 胡振震编写的符合GB/T7714-2015的biblatex样式文件\scite{biblatex-gb7714-2015}
+% 实现了参考文献排版,并在后台强制使用biber引擎编译参考文献。
+% 因此,在第2次编译时,请务必\textbf{使用biber进行编译}。
+%
+% 关于如何配置TeXStudio等IDE工具,以实现正确编译,请
+% 参阅其使用说明书。
+%
+% \subsection{模板选项}
+%
+% 所谓\enquote{模板选项}是指在用\tn{documentclass}命令引入文档类时能够指定的选项:
+% \begin{latexexample}[deletetexcs={\documentclass},%
+%     morekeywords={\documentclass}]
+%   \documentclass(*\oarg{模板选项}*){nwafuthesis}
+% \end{latexexample}
+%
+% 有些模板选项为布尔型,只能取 \opt{true} 或 \opt{false}。
+% 对于这些选项,\kvopt{\meta{选项}}{true} 中的“|= true|”
+% 可以省略。
+%
+% \begin{function}[added=2021-05-12]{type}
+%   \begin{nwafusyntax}[emph={[1]type}]
+%     type = (*<doctor|master|(bachelor)>*)
+%   \end{nwafusyntax}
+%   选择论文类型。三种选项分别代表博士学位论文、硕士学位论文和本科
+%   毕业论文。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{oneside,twoside}
+%   指明论文的单双面模式,默认为 \opt{twoside}。
+% \end{function}
+%
+% 无论是双面模式(\opt{twoside}),还是单面模式(\opt{oneside}),
+% 第一章都是从奇数页开始,而其后各章都是接上一章另起一页起排。
+% 本模板中,目录、摘要、主要符号表对照表、附录、参考文献、致谢、
+% 个人简历等均视作章,也按相同方式排版。
+%
+% 对于研究生学位论文,奇数页页眉是章名称,偶数页页眉是
+% “西北农林科技大学博士(或硕士)学位论文”。
+% 对于本科生生毕业论文(设计),奇数页页眉是章名称,偶数页页眉是
+% 论文(设计)题目。
+%
+% \begin{function}[added=2021-05-12]{draft}
+%   \begin{nwafusyntax}[emph={[1]draft}]
+%     draft = (*<\TFF>*)
+%   \end{nwafusyntax}
+%   选择是否开启草稿模式,默认关闭。
+% \end{function}
+%
+% 草稿模式为全局选项,会影响到很多宏包的工作方式。
+% 开启之后,主要的变化有:
+% \begin{itemize}
+%   \item 将行溢出的盒子显示为黑色方块;
+%   \item 不插入图片,只输出一个占位方框;
+%   \item 关闭超链接渲染,也不生成 PDF 书签;
+%   \item 显示页面边框。
+% \end{itemize}
+%
+% \subsection{参数设置}
+%
+% \begin{function}[added=2021-05-12]{\nwafuset}
+%   \begin{nwafusyntax}[morekeywords={\nwafuset}]
+%     \nwafuset(*\marg{键值列表}*)
+%   \end{nwafusyntax}
+%   本模板提供了一系列选项,以实现论文格式和作者、指导教师等
+%   基本信息的配置。载入\pkg{nwafuthesis}文档类之后,以下
+%   所有选项均可通过统一的\cs{nwafuset}命令进行设置。
+% \end{function}
+%
+% \cs{nwafuset} 的参数是一组由(英文)逗号隔开的选项列表,列表中的
+% 选项通常是 \kvopt{\meta{key}}{\meta{value}} 形式。部分选项的
+% \meta{value} 可以省略。对于同一项,后续设置会覆盖以前的设置。
+% 在下文的说明中,将用\textbf{粗体}表示默认值。
+%
+% \cs{nwafuset} 采用 \LaTeX3 风格的键值设置,支持不同类型以及多种
+% 层次的选项设定。键值列表中,“|=|”左右的空格不影响设置;但需注意,
+% 参数列表中\textbf{不可以出现空行}。
+%
+% 与模板选项相同,布尔型的参数 \kvopt{\meta{选项}}{true}
+% 中的“|= true|”可以省略。
+%
+% 另有一些选项包含子选项,如 \opt{style} 、\opt{abstract}和 \opt{info} 等。它们可以
+% 按如下两种等价方式来设定:
+% \begin{latexexample}[morekeywords={\nwafuset},%
+%     emph={[1]style,cjk-font,font-size,info,title,title*,author,author*,department}]
+%   \nwafuset{
+%     style = {cjk-font = adobe, font-size = -4},
+%     info  = {
+%       title      = {说C解C},
+%       title*     = {C Story},
+%       author     = {耿楠},
+%       author*    = {Nan Geng},
+%       department = {信息工程学院}
+%     }
+%   }
+% \end{latexexample}
+% 或者
+% \begin{latexexample}[morekeywords={\nwafuset},%
+%     emph={[1]style,cjk-font,font-size,info,title,title*,author,author*,department}]
+%   \nwafuset{
+%     style/cjk-font  = adobe,
+%     style/font-size = -4,
+%     info/title      = {说C解C},
+%     info/title*     = {C Story},
+%     info/author     = {耿楠},
+%     info/author*    = {Nan Geng},
+%     info/department = {信息工程学院}
+%   }
+% \end{latexexample}
+%
+% 注意 “|/|” 的前后均不可以出现空白字符。
+%
+% \subsubsection{论文格式} \label{subsubsec:论文格式}
+%
+% \begin{function}[added=2021-05-12]{style}
+%   \begin{nwafusyntax}[emph={[1]style}]
+%     style = (*\marg{键值列表}*)
+%     style/(*\meta{key}*) = (*\meta{value}*)
+%   \end{nwafusyntax}
+%   该选项包含多个子项目,用于设置字体、字号等论文格式,具体内容见下。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{style/font}
+%   \begin{nwafusyntax}[emph={[1]font}]
+%     font = (*<garamond|libertinus|lm|palatino|times|times*|none>*)
+%   \end{nwafusyntax}
+%   设置西文字体(包括数学字体)。具体配置见表~\ref{tab:font}。
+%   该选项若未指定,则由根据操作系统进行选择,Windows取times*,MacOS取times*,Linux取times。
+% \end{function}
+%
+% \begin{table}[ht]
+% \begin{threeparttable}
+%   \caption{西文字体配置}
+%   \label{tab:font}
+%   \centering
+%   \begin{tabular}{ccccc}
+%     \toprule
+%       & \strong{正文字体} & \strong{无衬线字体} & \strong{等宽字体} & \strong{数学字体} \\
+%     \midrule
+%       |garamond|        & EB Garamond         & Libertinus Sans & LM Mono\tnote{a} & Garamond Math   \\
+%       |libertinus|      & Libertinus Serif    & Libertinus Sans & LM Mono          & Libertinus Math \\
+%       |lm|              & LM Roman            & LM Sans         & LM Mono          & LM Math         \\
+%       |palatino|        & TG Pagella\tnote{b} & Libertinus Sans & LM Mono          & TG Pagella Math \\
+%       |times|           & XITS                & TG Heros        & TG Cursor        & XITS Math       \\
+%       |times*|\tnote{c} & Times New Roman     & Arial           & Courier New      & XITS Math       \\
+%     \bottomrule
+%   \end{tabular}
+%   \begin{tablenotes}
+%     \item[a] “LM”是 Latin Modern 的缩写。
+%     \item[b] “TG”是 TeX Gyre 的缩写。
+%     \item[c] 本行中,Times New Roman、Arial 和 Courier New 是商业字体,
+%       在 Windows 和 macOS 系统上均默认安装。
+%   \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%
+% \begin{function}[added=2021-05-12]{style/cjk-font}
+%   \begin{nwafusyntax}[emph={[1]cjk-font}]
+%     cjk-font = (*<adobe|fandol|founder|mac|sinotype|sourcehan|windows|none>*)
+%   \end{nwafusyntax}
+%   设置中文字体。具体配置见表~\ref{tab:cjk-font}。
+%   该选项若未指定,则由根据操作系统进行选择,Windows取windows,MacOS取mac,Linux取fandol。
+% \end{function}
+%
+% \begin{table}[ht]
+%   \caption{中文字体配置}
+%   \label{tab:cjk-font}
+%   \centering
+%   \begin{tabular}{cccc}
+%     \toprule
+%       & \strong{正文字体(宋体)} & \strong{无衬线字体(黑体)} & \strong{等宽字体(仿宋)} \\
+%     \midrule
+%       \multirow{2}*{|adobe|}     & Adobe 宋体          & Adobe  黑体        & Adobe  仿宋        \\
+%                                  & Adobe Song Std      & Adobe Heiti Std    & Adobe Fangsong Std \\
+%       \multirow{2}*{|fandol|}    & Fandol 宋体         & Fandol 黑体        & Fandol 仿宋        \\
+%                                  & FandolSong          & FandolHei          & FandolFang         \\
+%       \multirow{2}*{|founder|}   & 方正书宋            & 方正黑体           & 方正仿宋           \\
+%                                  & FZShuSong-Z01       & FZHei-B01          & FZFangSong-Z02     \\
+%       \multirow{2}*{|mac|}       & (华文)宋体-简     & (华文)黑体-简    & 华文仿宋           \\
+%                                  & Songti SC           & Heiti SC           & STFangsong         \\
+%       \multirow{2}*{|sinotype|}  & 华文宋体            & 华文黑体           & 华文仿宋           \\
+%                                  & STSong              & STHeiti            & STFangsong         \\
+%       \multirow{2}*{|sourcehan|} & 思源宋体            & 思源黑体           & ---                \\
+%                                  & Source Han Serif SC & Source Han Sans SC & ---                \\
+%       \multirow{2}*{|windows|}   & (中易)宋体        & (中易)黑体       & (中易)仿宋       \\
+%                                  & SimSun              & SimHei             & FangSong           \\
+%     \bottomrule
+%   \end{tabular}
+% \end{table}
+%
+% 启用 \kvopt{font}{none} 或 \kvopt{cjk-font}{none} 之后,模板将关闭
+% 默认西文 / 中文字体设置。此时,需要自行使用 \cs{setmainfont}、
+% \cs{setCJKmainfont}、\cs{setmathfont} 等命令来配置字体。
+%
+% \emph{关于字体配置,本模板完全采用\cls{fduthesis}模板代码}。
+%
+% \begin{function}[added=2021-05-12]{style/font-size}
+%   \begin{nwafusyntax}[emph={[1]font-size}]
+%     font-size = (*<(-4)|5>*)
+%   \end{nwafusyntax}
+%   设置论文的基础字号。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{style/fullwidth-stop}
+%   \begin{nwafusyntax}[emph={[1]fullwidth-stop}]
+%     fullwidth-stop = (*<catcode|mapping|(false)>*)
+%   \end{nwafusyntax}
+%   选择是否把全角实心句点\FSFW 作为默认的句号形状。
+%   这种句号一般用于科技类文章,以避免与下标“$_o$”或“$_0$”混淆。
+% \end{function}
+%
+% 选择 \kvopt{fullwidth-stop}{catcode} 或 \opt{mapping} 后,都会实现
+% 上述效果。有所不同的是,在选择 \opt{catcode} 后,只有
+% \emph{显式的}\FSID 会被替换为\FSFW;但在选择 \opt{mapping} 后,
+% \emph{所有的}\FSID 都会被替换。例如,如果用宏保存了一些含有
+% \FSID 的文字,那么在选择 \opt{catcode} 时,其中的\FSID 不会被
+% 替换为\FSFW。
+%
+% 选项 \kvopt{fullwidth-stop}{mapping} 只在 \XeTeX{} 下有效。使用
+% \LuaTeX{} 编译时,该选项相当于 \kvopt{fullwidth-stop}{catcode}。
+%
+% 如果在选择 \kvopt{fullwidth-stop}{mapping} 后仍需要临时显示
+% \FSID,可以按如下方法操作:
+% \begin{latexexample}[moretexcs={\CJKfontspec},emph={[1]Mapping}]
+%   % 请使用 XeTeX 编译
+%   % 外侧的花括号表示分组
+%   这是一个句号{\CJKfontspec{(*\meta{字体名}*)}[Mapping=full-stop]。}
+% \end{latexexample}
+%
+% \emph{关于标点符号压缩,本模板完全采用\cls{fduthesis}模板代码}。
+%
+% \begin{function}[added=2021-05-12]{style/footnote-style}
+%^^A 这里奇怪的东西是用来控制对齐的。nwafusyntax 会吃掉开头的几个
+%^^A 空格,因此这里用 X 来占位。
+%   \begin{nwafusyntax}[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{nwafusyntax}
+%   设置脚注编号样式。西文字体设置会影响其默认取值(见
+%   表~\ref{tab:footnote-font})。因此,要使得该选项生效,需将其
+%   放置在 \opt{font} 选项之后。带有 |sans| 的为相应的无衬线字体
+%   版本;带有 |*| 的为阴文样式(即黑底白字)。
+% \end{function}
+%
+% \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}
+%
+% \emph{关于脚注字体配置,本模板完全采用\cls{fduthesis}模板代码}。
+%
+% \begin{function}[added=2021-05-12]{style/hyperlink}
+%   \begin{nwafusyntax}[emph={[1]hyperlink}]
+%     hyperlink = (*<border|color|(none)>*)
+%   \end{nwafusyntax}
+%   设置超链接样式。\opt{border} 表示在超链接四周绘制方框;
+%   \opt{color} 表示用彩色显示超链接,可输出用于批阅的电子稿;
+%   \opt{none} 表示没有特殊装饰,可用于生成最终的打印版文稿。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12,updated=2021-05-12]{style/hyperlink-color}
+%   \begin{nwafusyntax}[emph={[1]hyperlink-color}]
+%     hyperlink-color = (*<(default)|classic|elegant|fantasy|material|\\
+%       XXXXXX\mbox{}~~~~~~~~~~~~~~~~~~business|science|summer|autumn|graylevel|prl>*)
+%   \end{nwafusyntax}
+%   设置超链接颜色。该选项在 \kvopt{hyperlink}{none} 时无效。
+%   各选项所代表的颜色见表~\ref{tab:hyperlink-color}。
+% \end{function}
+%
+% \begin{table}[ht]
+% \centering
+% \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})}}
+% \begin{threeparttable}
+% \caption{预定义的超链接颜色方案}
+% \label{tab:hyperlink-color}
+% \begin{tabular}{c*{3}{>{\hspace{0.2cm}}c<{\hspace{0.2cm}}}}
+%   \toprule
+%   \textsf{选项} & \textsf{链接} & \textsf{URL} & \textsf{引用} \\
+%   \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}
+%   \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} 杂志配色。
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%
+% \emph{关于超链接配置,本模板完全采用\cls{fduthesis}模板的配置代码}。
+%
+% \begin{function}[added=2021-05-12]{style/bib-resource}
+%   \begin{nwafusyntax}[emph={[1]bib-resource}]
+%     bib-resource = (*\marg{文件}*)
+%   \end{nwafusyntax}
+%   参考文献数据源。可以是单个文件,也可以是用英文逗号隔开的一组文件。
+%   其中,各文献数据源文件必须明确给出 \file{.bib}
+%   后缀名。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{style/logo}
+%   \begin{nwafusyntax}[emph={[1]logo}]
+%     logo = (*\marg{文件}*)
+%   \end{nwafusyntax}
+%   封面中校名图片的文件名。默认值为 \file{logo/nwafu-bar.pdf}。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{style/logo-size}
+%   \begin{nwafusyntax}[emph={[1]logo-size}]
+%     logo-size = (*\marg{宽度}*)
+%     logo-size = {(*\meta{宽度}*), (*\meta{高度}*)}
+%   \end{nwafusyntax}
+%   校名图片的大小。默认仅指定了宽度,为 |0.65\textwidth|\/。
+%   如果仅需指定高度,可在 \meta{宽度} 处填入一个空的分组 |{}|。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12,updated=2021-5-22]{style/auto-make-cover}
+%   \begin{nwafusyntax}[emph={[1]auto-make-cover}]
+%     auto-make-cover = (*<\TTF>*)
+%   \end{nwafusyntax}
+%   是否自动生成研究生论文的封面(封一)、英文封面(封二)、
+%   题名页(封三)、项目资助页(封四)、声明页(封五)和
+%   使用授权页(封六)。本科论文(设计)的封面(封一)和
+%   声明及使用授权页(封二)。
+%   封面中的各项信息,可通过 \cs{nwafuset} 录入,
+%   具体请参阅 \ref{subsubsec:信息录入}~节。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{style/withchapter}
+%   \begin{nwafusyntax}[emph={[1]withchapter}]
+%     withchapter = (*<\TTF>*)
+%   \end{nwafusyntax}
+%   选择论文章标题格式为章格式(如:第1章 绪论)还是报告格式(如:1 绪论)。
+% \end{function}
+%
+% \subsubsection{信息录入} \label{subsubsec:信息录入}
+%
+% \emph{这一部分代码基于\cls{fduthesis},并针对西北农林科技大学的要求,
+% 进行了必要的删除和添加}。
+%
+% \begin{function}[added=2021-05-12]{info}
+%   \begin{nwafusyntax}[emph={[1]info}]
+%     info = (*\marg{键值列表}*)
+%     info/(*\meta{key}*) = (*\meta{value}*)
+%   \end{nwafusyntax}
+%   该选项包含许多子项目,用于录入论文信息。具体内容见下。以下带“|*|”
+%   的项目表示对应的英文字段。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{info/degree}
+%   \begin{nwafusyntax}[emph={[1]degree}]
+%     degree = (*<(academic)|professional>*)
+%   \end{nwafusyntax}
+%   学位类型,仅适用于硕士学位论文。\opt{academic} 和 \opt{professional}
+%   分别表示学术学位和专业学位。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/btype}
+%   \begin{nwafusyntax}[emph={[1]btype}]
+%     btype = (*<(paper)|design>*)
+%   \end{nwafusyntax}
+%   本科毕业类型,仅适用于本科。\opt{paper} 和 \opt{design}
+%   分别表示论文和设计。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{info/title,info/title*}
+%   \begin{nwafusyntax}[emph={[1]title,title*}]
+%     title  = (*\marg{中文标题}*)
+%     title* = (*\marg{英文标题}*)
+%   \end{nwafusyntax}
+%   论文标题。默认会在约 20 个汉字字宽处强制断行,但为了语义的
+%   连贯以及排版的美观,如果的标题长于一行,建议使用“|\\|”
+%   进行手动断行。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{info/author,info/author*}
+%   \begin{nwafusyntax}[emph={[1]author,author*}]
+%     author  = (*\marg{姓名}*)
+%     author* = (*\marg{英文姓名或拼音}*)
+%   \end{nwafusyntax}
+%   作者姓名。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/supervisor, info/supervisor*}
+%   \begin{nwafusyntax}[emph={[1]supervisor, supervisor*}]
+%     supervisor  = (*\marg{姓名}*)
+%     supervisor* = (*\marg{英文姓名或拼音}*)
+%   \end{nwafusyntax}
+%   导师姓名。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/cosupervisor, info/cosupervisor*}
+%   \begin{nwafusyntax}[emph={[1]cosupervisor, cosupervisor*}]
+%     cosupervisor  = (*\marg{姓名}*)
+%     cosupervisor* = (*\marg{英文姓名或拼音}*)
+%   \end{nwafusyntax}
+%   联合(协助)指导教师姓名。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/department, info/department*}
+%   \begin{nwafusyntax}[emph={[1]department, department*}]
+%     department  = (*\marg{名称}*)
+%     department* = (*\marg{英文名称}*)
+%   \end{nwafusyntax}
+%   学院名称。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/major,info/major*}
+%   \begin{nwafusyntax}[emph={[1]major, major*}]
+%     major  = (*\marg{名称}*)
+%     major* = (*\marg{英文名称}*)
+%   \end{nwafusyntax}
+%   专业名称。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/researchfield, info/researchfield*}
+%   \begin{nwafusyntax}[emph={[1]researchfield, researchfield*}]
+%     researchfield  = (*\marg{名称}*)
+%     researchfield* = (*\marg{英文名称}*)
+%   \end{nwafusyntax}
+%   研究方向名称(仅学硕需要)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/professionaltype, info/professionaltype*}
+%   \begin{nwafusyntax}[emph={[1]professionaltype, professionaltype*}]
+%     professionaltype  = (*\marg{名称}*)
+%     professionaltype* = (*\marg{英文名称}*)
+%   \end{nwafusyntax}
+%   专业学位类型名称(仅专硕需要)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/professionalfield, info/professionalfield*}
+%   \begin{nwafusyntax}[emph={[1]professionalfield, professionalfield*}]
+%     professionalfield  = (*\marg{名称}*)
+%     professionalfield* = (*\marg{英文名称}*)
+%   \end{nwafusyntax}
+%   专业学位领域名称(仅专硕需要)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-23]{info/mastertype}
+%   \begin{nwafusyntax}[emph={[1]mastertype}]
+%     mastertype  = (*\marg{研究生学位英文名称}*)
+%   \end{nwafusyntax}
+%   研究生学位英文名称(用于硕士研究生英文封面)。
+%
+%   对于学术硕士可以取:Philosophy(哲学);Economics(经济学);
+%   Science(理学);Engineering(工学);Agriculture(农学);
+%   Management(管理学)等(注意首字母需要大写)。
+%
+%   对于专业硕士可以取:Engineering(工程硕士);
+%   Agricultural(农业硕士) 等(注意首字母需要大写)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{info/student-id}
+%   \begin{nwafusyntax}[emph={[1]student-id}]
+%     student-id = (*\marg{数字}*)
+%   \end{nwafusyntax}
+%   作者学号。
+% \end{function}
+%
+% 西北农林科技大学学号采用10位4段制编码:X1--X4/X5/X6/X7--X10。
+% 其中:
+%
+% X1--X4代表入学年份。
+% 
+% X5=0表示学生,此时,X6=1-2表示本科生,
+% X6=3表示成人教育学生,X6=4表示预科生,X6=5-6表示研究生,
+% X6=7表示国际学院学生,X6=8表示水土保持研究所学生。
+% X7-X10为流水号。
+%
+% \begin{function}[added=2021-05-18]{info/class-id}
+%   \begin{nwafusyntax}[emph={[1]class-id}]
+%     class-id = (*\marg{数字}*)
+%   \end{nwafusyntax}
+%   作者班级号,班号数字。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/grade}
+%   \begin{nwafusyntax}[emph={[1]grade}]
+%     grade = (*\marg{数字}*)
+%   \end{nwafusyntax}
+%   毕业年份(届)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/enroll}
+%   \begin{nwafusyntax}[emph={[1]enroll}]
+%     enroll = (*\marg{数字}*)
+%   \end{nwafusyntax}
+%   入学年份(年级)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12,updated=2021-05-23]{info/school-id}
+%   \begin{nwafusyntax}[emph={[1]school-id}]
+%     school-id = (*\marg{数字}*)
+%   \end{nwafusyntax}
+%   学校代码。默认值为 10712(西北农林科技大学学校代码)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12, updated=2021-05-24]{info/date, info/date*}
+%   \begin{nwafusyntax}[emph={[1]date, date*}]
+%     date  = (*\marg{日期}*)
+%     date* = (*\marg{英文日期}*)
+%   \end{nwafusyntax}
+%   论文完成日期。默认值为文档编译年月(\tn{datezh}和\tn{dateen})。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/defensedate}
+%   \begin{nwafusyntax}[emph={[1]defensedate}]
+%     defensedate  = (*\marg{日期}*)
+%   \end{nwafusyntax}
+%   论文答辩日期。默认值为文档编译日期(\tn{today})。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12, updated=2021-05-18]{info/secret-level}
+%   \begin{nwafusyntax}[emph={[1]secret-level}]
+%     secret-level = (*<(none)|i|ii|iii|iv>*)
+%   \end{nwafusyntax}
+%   密级。\opt{i}、\opt{ii}、\opt{iii}、\opt{iv} 分别表示限制、
+%   秘密、机密、绝密;
+%   \opt{none} 表示论文不涉密,密级为公开。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{info/instructors}
+%   \begin{nwafusyntax}[emph={[1]instructors}]
+%     instructors = (*\marg{成员 1, 成员 2, ...}*)
+%   \end{nwafusyntax}
+%   指导小组成员。各成员之间需使用英文逗号隔开。为防止歧义,
+%   可以用分组括号“|{...}|”把各成员字段括起来。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/defensecommittees}
+%   \begin{nwafusyntax}[emph={[1]defensecommittees}]
+%     defensecommittees = (*\marg{\{单位, 姓名, 职称\}, \{单位, 姓名, 职称\}, ...}*)
+%   \end{nwafusyntax}
+%   答辩委员会构成(仅研究生需要),每个成员由单位、姓名和职称三部分构成,
+%   用英文逗号分隔后置于大括号内,不同成员间用英文逗号隔开。为防止歧义,
+%   可以用分组括号“|{...}|”把每个成员中的各个字段括起来。
+% \end{function}
+%
+% \begin{function}[added=2021-05-18]{info/foundation}
+%   \begin{nwafusyntax}[emph={[1]foundation}]
+%     foundation = (*\marg{\{来源, 名称, 编号\}, \{来源, 名称, 编号\}, ...}*)
+%   \end{nwafusyntax}
+%   论文资助项目(仅研究生需要),每个项目由来源、名称和编号三部分构成,
+%   用英文逗号分隔后置于大括号内,不同项目间用英文逗号隔开。为防止歧义,
+%   可以用分组括号“|{...}|”把每个项目中的各个字段括起来。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{info/clc}
+%   \begin{nwafusyntax}[emph={[1]clc}]
+%     clc = (*\marg{分类号}*)
+%   \end{nwafusyntax}
+%   中图分类号(CLC)。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{info/udc}
+%   \begin{nwafusyntax}[emph={[1]udc}]
+%     udc = (*\marg{UDC码}*)
+%   \end{nwafusyntax}
+%   UDC码(UDC)。
+% \end{function}
+%
+% \subsubsection{摘要数据录入} \label{subsubsec:摘要数据录入}
+%
+% \begin{function}[added=2021-05-31]{nwafu / abstract}
+%   \begin{nwafusyntax}[emph={[1]abstract}]
+%     abstract = (*\marg{键值列表}*)
+%     abstract/(*\meta{key}*) = (*\meta{value}*)
+%   \end{nwafusyntax}
+%   该选项包含多个子项目,用于录入或指定论文摘要数据文件,
+%   具体内容见下。以下带“|*|” 的项目表示对应的英文字段。
+% \end{function}
+%
+% \begin{function}[added=2021-05-31]{abstract/abstractfile,abstract/abstractfile*}
+%   \begin{nwafusyntax}[emph={[1]abstractfile,abstractfile*}]
+%     abstractfile  = (*\marg{中文摘要文件名}*)
+%     abstractfile* = (*\marg{英文摘要文件名}*)
+%   \end{nwafusyntax}
+%   摘要内容\file{.tex}源文件的文件名称。在文件名中可以使用路径信息,
+%   文件名中需包括\file{.tex}扩展名。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12,updated=2021-05-31]{abstract/keywords,abstract/keywords*}
+%   \begin{nwafusyntax}[emph={[1]keywords,keywords*}]
+%     keywords  = (*\marg{中文关键字}*)
+%     keywords* = (*\marg{英文关键字}*)
+%   \end{nwafusyntax}
+%   关键字列表。各关键字之间需\textbf{使用英文逗号隔开}。为防止歧义,
+%   可以用分组括号“|{...}|”把各关键字括起来。
+% \end{function}
+%
+% \begin{function}[added=2021-05-31]{abstract/notationfile}
+%   \begin{nwafusyntax}[emph={[1]notationfile}]
+%     notationfile  = (*\marg{主要符号对照表文件名}*)
+%   \end{nwafusyntax}
+%   主要符号对照表内容\file{.tex}源文件的文件名称。在文件名中可以使用路径信息。
+%   文件名中需包括\file{.tex}扩展名。
+% \end{function}
+%
+% \subsection{正文编写}
+%
+% \begin{quotation}
+%   喬孟符(吉)博學多能,以樂府稱。嘗云:「作樂府亦有法,曰^^A
+%   \CJKunderdot{鳳頭、豬肚、豹尾}六字是也。」大概起要美麗,中要浩蕩,
+%   結要響亮。尤貴在首尾貫穿,意思清新。苟能若是,斯可以言樂府矣。
+% \end{quotation}
+% \hfill ——陶宗儀《南村輟耕錄·作今樂府法》
+%
+% \subsubsection{凤头}
+%
+% 对于研究生学位论文,该部分包含封面(研究生包括封面一$\sim$七,
+% 本科生包括封面一和封面七)、中英文摘要、主要符号对照表和目录。
+% 在前置部分中,中英文摘要开始至主要符号对照表,页码采用大写罗马字母,并且与目录分开计数。
+% 目录应该放在奇数页起排,页码采用大写罗马字母,并与正文分开计数
+%
+% 对于本科生毕业论文(设计),该部分包含中英文摘要和目录。其中,
+% 中英文摘要无页码。目录应该放在奇数页起排,部分页码采用大写罗马字母,并与正文分开计数
+%
+% 建议将中英文摘要内容分别写在不同\file{.tex}源文件中,然后用\cs{nwafuset}设置文件名后,
+% 自动排版。在摘要的最后,会显示关键字列表,可通过 \cs{nwafuset} 录入关键字列表。
+% 关于摘要数据录入,具体请参阅 \ref{subsubsec:摘要数据录入}~节。
+%
+% 建议将主要符号对照表写在\file{.tex}源文件中,然后用\cs{nwafuset}设置文件名后,
+% 自动排版。关于主要符号对照表数据录入,具体请参阅 \ref{subsubsec:摘要数据录入}~节。
+%
+% 为正确按要求实现排版顺序和页码,不建议手动排版封面、中英文摘要、主要符号对照表和目录,
+% 在提供基本内容后,由模板自动实现前置部分(凤头)排版
+%
+% \subsubsection{猪肚}
+%
+% \begin{function}[added=2021-05-29]{\mainmatter,\mainmatter*}
+%   \begin{nwafusyntax}[deletetexcs={\mainmatter,\mainmatter*},
+%                       morekeywords={\mainmatter,\mainmatter*}]
+%     \mainmatter(*\oarg{编号格式|(Roman)}*)
+%     \mainmatter*(*\oarg{编号格式|(Roman)}*)
+%   \end{nwafusyntax}
+%   \cs{mainmatter} 为主文区命令,章标题正常编号,
+%   且页码为从1开始计数的阿拉伯数字,
+%   带有星号的命令 \cs{mainmatter*} 不使用清双页命令 \tn{cleardoublepage}。
+%
+%   注意,由于要求第一章从奇数页开始排版,
+%   因此应该使用不带星号的\cs{mainmatter}开始正文主体区的排版。
+% \end{function}
+%
+% 主体部分是论文的核心,可以分章节撰写。如有需求,也可以采用
+% 多文件方式撰写,然后用\cs{include}命令将各个子文件包含入主文件。
+% 主体部分的页码采用阿拉伯数字连续编号。
+%
+% \begin{function}[added=2021-05-12]{\footnote}
+%   \begin{nwafusyntax}[deletetexcs={\footnote},%
+%       morekeywords={\footnote}]
+%     \footnote(*\marg{脚注文字}*)
+%   \end{nwafusyntax}
+%   插入脚注。脚注编号样式可利用 \opt{style/footnote-style} 选项控制,
+%   具体见 \ref{subsubsec:论文格式}~小节。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{axiom,corollary,definition,example,lemma,
+%   proof,theorem}
+%   \begin{nwafusyntax}[emph={[2]proof}]
+%     \begin{proof}(*\oarg{小标题}*)
+%       (*\meta{证明过程}*)
+%     \end{proof}
+%   \end{nwafusyntax}
+%   一系列预定义的数学环境。具体含义见表~\ref{tab:theorem}。
+% \end{function}
+%
+% \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{两次},可不执行biber main参考文献编译操作。
+%
+% \begin{function}[added=2021-05-12]{\newtheorem}
+%   \begin{nwafusyntax}[deletetexcs={\newtheorem},
+%       morekeywords={\newtheorem,\newtheorem*}]
+%     \newtheorem(*\oarg{选项}\marg{环境名}\marg{标题}*)
+%     \newtheorem*(*\oarg{选项}\marg{环境名}\marg{标题}*)
+%     \begin(*\marg{环境名}\oarg{小标题}*)
+%       (*\meta{内容}*)
+%     \end(*\marg{环境名}*)
+%   \end{nwafusyntax}
+%   声明新的定理类环境(数学环境)。带星号的版本表示不进行编号,
+%   并且会默认添加证毕符号“$\QED$”。声明后,即可同预定义的数学环境
+%   一样使用。
+% \end{function}
+%
+% 事实上,表~\ref{tab:theorem} 中预定义的环境正是通过以下方式定义的:
+% \begin{latexexample}[deletetexcs={\newtheorem},
+%     morekeywords={\newtheorem,\newtheorem*}]
+%   \newtheorem*{proof}{证明}
+%   \newtheorem{axiom}{公理}
+%   \newtheorem{corollary}{定理}
+%   ...
+% \end{latexexample}
+%
+% 与 \cs{nwafuset} 相同,\cs{newtheorem} 的可选参数 \meta{选项}
+% 也为一组键值列表。可用的选项见下。注意无需输入“|theorem/|”。
+%
+% \begin{function}[added=2021-05-12]{theorem/style}
+%   \begin{nwafusyntax}[emph={[1]style}]
+%     style = (*<(plain)|margin|change|\\
+%       XXXXXX\mbox{}~~~~~~~~break|marginbreak|changebreak>*)
+%   \end{nwafusyntax}
+%   定理类环境的总体样式。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{theorem/header-font}
+%   \begin{nwafusyntax}[emph={[1]header-font}]
+%     header-font = (*\marg{字体}*)
+%   \end{nwafusyntax}
+%   定理头(即标题)的字体。中文模板默认为 \tn{sffamily},即无衬线体
+%   (黑体);英文模板默认为 |\bfseries\upshape|,即加粗直立体。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{theorem/body-font}
+%   \begin{nwafusyntax}[emph={[1]body-font}]
+%     body-font = (*\marg{字体}*)
+%   \end{nwafusyntax}
+%   定理内容的字体。中文模板默认为 \tn{nwafu at kai},即楷体;英文模板
+%   默认为 \tn{itshape},即斜体。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{theorem/qed}
+%   \begin{nwafusyntax}[emph={[1]qed}]
+%     qed = (*\marg{符号}*)
+%   \end{nwafusyntax}
+%   定理结束标记(即证毕符号)。如果用 \cs{newtheorem} 声明定理,
+%   则默认为空;用 \cs{newtheorem*} 声明,则默认为
+%   |\ensuremath{\QED}|,即“$\QED$”。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{theorem/counter}
+%   \begin{nwafusyntax}[emph={[1]counter}]
+%     counter = (*\marg{计数器}*)
+%   \end{nwafusyntax}
+%   定理计数器,表示定理编号在 \meta{计数器} 的下一级,并会随
+%   \meta{计数器} 的变化而清零。\scite{刘海洋2013latex入门}
+%   默认为 |chapter|,表示按章编号。使用 \cs{newtheorem*} 时,
+%   该选项无效。
+% \end{function}
+%
+% \emph{关于定理部分命令定义和设置,完全采用\cls{fduthesis}的代码实现}。
+%
+% \begin{function}[added=2021-05-12]{\caption}
+%   \begin{nwafusyntax}[deletetexcs={\caption},morekeywords={\caption}]
+%     \caption(*\marg{图表标题}*)
+%     \caption(*\oarg{短标题}\marg{长标题}*)
+%   \end{nwafusyntax}
+%   插入图表标题。可选参数 \meta{短标题} 用于图表目录。在
+%   \meta{长标题} 中,可以进行长达多段的叙述;但 \meta{短标题}
+%   和单独的 \meta{图表标题} 中则不允许分段。
+%   \scite{刘海洋2013latex入门}
+% \end{function}
+%
+% \begin{function}[added=2021-05-22]{\bicaption}
+%   \begin{nwafusyntax}[deletetexcs={\bicaption},morekeywords={\bicaption}]
+%     \bicaption(*\marg{中文标题}\marg{英文标题}*)
+%   \end{nwafusyntax}
+%   插入图表双语标题。双语标题基于\cls{bicaption}宏包实现。
+% \end{function}
+%
+% 按照排版惯例,建议将表格的标题放置在绘制表格的命令之前,
+% 而将图片的标题放置在绘图或插图的命令之后。另需注意,
+% \tn{caption} 命令必须放置在浮动体环境(如 \env{table} 或
+% \env{figure})中。
+%
+% \subsubsection{豹尾}
+%
+% \begin{function}[added=2021-05-26]{\bibmatter}
+%   参考文献开始开始。
+% \end{function}
+%
+% 用于为参考文献部分设置正确的页眉,后续页码接正文区连续编码。
+%
+% \begin{function}[added=2021-05-12]{\printbibliography}
+%   \begin{nwafusyntax}[morekeywords={\printbibliography}]
+%     \printbibliography(*\oarg{选项}*)
+%   \end{nwafusyntax}
+%   打印参考文献列表。
+% \meta{文献数据库} 可利用 \opt{style/bib-resource} 选项指定,具体见
+%   \ref{subsubsec:论文格式}~小节。
+% \end{function}
+%
+% 注:本模板参考文献是胡振震根据西北农林科技大学的基本要求,通过
+% 添加部分样式控制代码实现的\scite{biblatex,biblatex-gb7714-2015},
+% 因此,\textbf{无法进行个性化定制}。
+%
+% \begin{function}[added=2021-05-24]{\appdendix}
+%   声明附录开始。
+% \end{function}
+%
+% 用于为附录部分设置正确的页眉及按要求实现附录中的图、表和公式编号。
+% 后续页码接参考文献区连续编码。
+%
+% \begin{function}[added=2021-05-29]{\backmatter}
+%   \cs{backmatter} 为后置区命令,页码格式与编号保持不变,
+%   章标题不编号。
+% \end{function}
+%
+% 用于为后置部分设置正确页眉,后置部分主要包括致谢和个人简历。
+% 后续页码接附录区连续编码。
+%
+% \begin{function}[added=2021-06-01]{acknowledgement}
+%   \begin{nwafusyntax}[emph={[2]acknowledgement}]
+%     \begin{acknowledgement}
+%       (*\meta{致谢内容}*)
+%     \end{acknowledgement}
+%   \end{nwafusyntax}
+%   致谢排版环境。使用该环境的主要作用是设置页眉及产生不编号章标题。
+% \end{function}
+%
+% \begin{function}[added=2021-06-01]{resume}
+%   \begin{nwafusyntax}[emph={[2]resume}]
+%     \begin{resume}
+%       (*\meta{简历内容}*)
+%     \end{resume}
+%   \end{nwafusyntax}
+%   简历排版环境。使用该环境的主要作用是设置页眉及产生不编号章标题。
+% \end{function}
+%
+% \begin{function}[added=2021-06-01]{\researchitem}
+%   \begin{nwafusyntax}[deletetexcs={\researchitem},morekeywords={\researchitem}]
+%     \researchitem(*\oarg{个人简历分类名称}*)
+%   \end{nwafusyntax}
+%   在简历排版中,指定成果类型,按标题的格式(非标题)居中排版。
+% \end{function}
+%
+% \begin{function}[added=2021-06-01]{publications}
+%   \begin{nwafusyntax}[emph={[2]publications}]
+%     \begin{publications}
+%       (*\meta{简历中发表的学术论文列表}*)
+%     \end{publications}
+%   \end{nwafusyntax}
+%   简历中发表的学术论文排版列表环境。
+% \end{function}
+%
+% \begin{function}[added=2021-06-01]{achievements}
+%   \begin{nwafusyntax}[emph={[2]achievements}]
+%     \begin{achievements}
+%       (*\meta{简历中发表的学术论文列表}*)
+%     \end{achievements}
+%   \end{nwafusyntax}
+%   简历中专利等研究成果排版列表环境。
+% \end{function}
+%
+% \section{其他命令接口}
+%
+% \begin{function}[added=2021-05-20]{\nwafuthesis}
+%   \cs{nwafuthesis} 命令用于输出\cls{nwafuthesis}模板
+%   的LOGO:~\nwafuthesis{}。
+% \end{function}
+%
+% \begin{function}[added=2021-05-20]{\datezh}
+%   \cs{datezh} 命令用于输出中文格式的当前年、月。
+% \end{function}
+%
+% \begin{function}[added=2021-05-20]{\dateen}
+%   \cs{dateen} 命令用于输出英文格式的当前月,年。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12,updated=2021-5-28]{\makecoveri,
+%                  \makecoverii,\makecoveriii, \makecoveriv,
+%                  \makecoverv,\makecovervi,\makecovervii}
+%   分别用于生成封面(一)$\sim$(七)。单独使用这几个命令可能
+%   会造成页面顺序错误,因此若非必要,应避免直接使用这些命令排版。
+% \end{function}
+%
+% \begin{function}[added=2021-06-04]{\makecovers}
+%   生成所有封面。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{\tableofcontents,\listoffigures,\listoftables}
+% 修改 \cs{tableofcontents}、\cs{listoffigures} 和 \cs{listoftables} 的定义,
+% 使得页眉正确显示,并出现在目录及 PDF 书签中。来自于 \LaTeXe{} 标准文档类
+% \file{book.cls}
+% \footnote{原代码中只有 \cs{tableofcontents} 的 \cs{@mkboth} 出现在
+% \cs{chapter*} 内部,这是出于兼容性的考虑而非 typo。}。
+% \end{function}
+%
+% \begin{function}[added=2021-05-28]{\makefront}
+%   用于生成中英文摘要、目录和主要符号对照表。
+%
+%   注意:不建议直接使用该命令排版,
+%   应该由模板自动调用进行排版。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{abstract}
+%   \begin{nwafusyntax}[emph={[2]abstract}]
+%     \begin{abstract}
+%       (*\meta{中文摘要}*)
+%     \end{abstract}
+%   \end{nwafusyntax}
+% \end{function}
+% \begin{function}[added=2021-05-12]{abstract*}
+%   \begin{nwafusyntax}[emph={[2]abstract*}]
+%     \begin{abstract*}
+%       (*\meta{英文摘要}*)
+%     \end{abstract*}
+%   \end{nwafusyntax}
+%   摘要排版环境。不带星号和带星号的版本分别用来排版中文摘要
+%   和英文摘要。
+%
+%   注意:不建议直接排版摘要,应该提供摘要内容\file{.tex}源文件名后,由
+%   \cs{makefront}命令自动排版。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{notation}
+%   \begin{nwafusyntax}[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{nwafusyntax}
+%   主要符号对照表环境。可选参数 \meta{列格式说明}与 \LaTeX{} 中标准表格的列格
+%   式说明语法一致,默认值为“|lp{7.5cm}|”,即第一列宽度自动调整,
+%   第二列限宽 \SI{7.5}{cm},两列均为左对齐。
+%
+%   注意:不建议直接排版主要符号对照表,
+%   应该提供主要符号对照表内容\file{.tex}源文件名后,由
+%   \cs{makefront}命令自动排版。
+% \end{function}
+%
+% \begin{function}[added=2021-05-29]{\frontmatter,\frontmatter*}
+%   \begin{nwafusyntax}[deletetexcs={\frontmatter,\frontmatter*},
+%                       morekeywords={\frontmatter,\frontmatter*}]
+%     \frontmatter(*\oarg{编号格式|(Roman)}*)
+%     \frontmatter*(*\oarg{编号格式|(Roman)}*)
+%   \end{nwafusyntax}
+%   \cs{frontmatter} 为前置区命令,章标题不编号,
+%   页码可设置为例如 \opt{roman}、\opt{Alph} 等格式,
+%   带有星号的命令 \cs{frontmatter*} 不使用清双页命令 \tn{cleardoublepage}。
+% \end{function}
+%
+% \begin{function}[added=2021-05-12]{\cleardoublepage}
+%   \begin{nwafusyntax}[deletetexcs={\cleardoublepage},morekeywords={\cleardoublepage}]
+%     \cleardoublepage(*\oarg{页面风格|(empty)}*)
+%   \end{nwafusyntax}
+%   在奇数页使用命令 \tn{cleardoublepage} 时可选参数为
+%   下一页多出的空白偶数页的页面风格,默认为 \opt{empty} 即空的页眉页脚。
+% \end{function}
+%
+% \section{宏包依赖情况}
+%
+% 使用不同编译方式、指定不同选项,会导致宏包依赖情况有所不同。
+% 具体如下:
+% \begin{itemize}
+%   \item 在任何情况下,本模板都会\emph{显式}调用以下宏包
+%     (或文档类):
+%     \begin{itemize}
+%       \item \pkg{expl3}、\pkg{xparse}、\pkg{xtemplate} 和
+%         \pkg{l3keys2e},用于构建 \LaTeX3 编程环境
+%         \scite{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{booktabs},三线表支持。
+%       \item \pkg{caption},用于设置标题。
+%       \item \pkg{bicaption},用于设置标题。
+%       \item \pkg{xcolor},提供彩色支持。
+%       \item \pkg{enumitem},提供列表环境的个性化设置。
+%       \item \pkg{biblatex},提供参考文献排版。
+%       \item \pkg{hyperref},提供交叉引用、超链接、电子书签等功能。
+%     \end{itemize}
+%   \item 开启 \kvopt{style/footnote-style}{pifont} 后,会调用
+%     \pkg{pifont} 宏包。它属于 \pkg{psnfss} 套件。
+%   \item \pkg{biblatex} 宏包需要依赖 \biber{} 程序。参考文献样式由
+%     \pkg{biblatex-gb7714-2015} 宏包提供\scite{biblatex,biblatex-gb7714-2015}。
+% \end{itemize}
+%
+% 这里只列出了本模板直接调用的宏包。这些宏包自身的调用情况,
+% 此处不再具体展开。如有需要,请参阅相关文档。
+%
+% \begin{thebibliography}{99}
+%
+% \newcommand\urlprefix{\newline\hspace*{\fill}}
+% \let\OldUrl=\url
+% \renewcommand\url[2][]{{\small\textit{#1}~\OldUrl{#2}}}
+% \newcommand\CTANurl[2][]{{\small\textit{#1}~\href{http://mirror.ctan.org/#2}^^A
+%   {\ttfamily CTAN://#2}}}
+%
+% \subsection{图书}
+%
+% \bibitem{knuth1986texbook}
+% \textsc{Knuth D E}.
+% \newblock \textit{The \TeX book: Computers \& Typesetting, volume A} [M].
+% \newblock Boston: Addison--Wesley Publishing Company, 1986
+% \urlprefix \CTANurl[源代码^^A
+%   \footnote{此代码只可作为学习之用。未经 Knuth 本人同意,不应当编译此文档。}:]^^A
+%   {systems/knuth/dist/tex/texbook.tex}
+%
+% \bibitem{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{胡伟2017latex2e}
+% 胡伟.
+% \newblock \textit{\LaTeXe{} 文类和宏包学习手册} [M].
+% \newblock 北京: 清华大学出版社, 2017
+%
+% \bibitem{刘海洋2013latex入门}
+% 刘海洋.
+% \newblock \textit{\LaTeX{} 入门} [M].
+% \newblock 北京: 电子工业出版社, 2013
+%
+% \subsection{标准、规范}
+%
+% \bibitem{gb-t-7713.1-2006}
+% 国务院学位委员会办公室, 全国信息与文献标准化技术委员会.
+% \newblock \textit{学位论文编写规则: GB/T 7713.1--2006} [S].
+% \newblock 北京: 中国标准出版社, 2007
+%
+% \bibitem{gb-t-7714-2015}
+% 全国信息与文献标准化技术委员会.
+% \newblock \textit{信息与文献\quad 参考文献著录规则: GB/T 7714--2015} [S].
+% \newblock 北京: 中国标准出版社, 2015
+%
+% \bibitem{gb-t-15834-2011}
+% 教育部语言文字信息管理司.
+% \newblock \textit{标点符号用法: GB/T 15834--2011} [S/OL].
+% \newblock 北京: 中国标准出版社, 2012
+% \urlprefix\url{http://www.moe.gov.cn/ewebeditor/uploadfile/2015/01/13/20150113091548267.pdf}
+%
+% \bibitem{clreq}
+% W3C.
+% \newblock \textit{中文排版需求(Requirements for Chinese Text Layout)} [EB/OL].
+% \newblock (2020-08-17)
+% \urlprefix\url{https://w3c.github.io/clreq/}
+%
+% \bibitem{西北农林科技大学研究生论文写作指南}
+% 西北农林科技大学研究生院.
+% \newblock \textit{研究生学位论文写作指南(试用版)} [EB/OL].
+% \newblock 2021 年 3 月修订版.
+% \newblock (2021-03-17)
+% \urlprefix\url{https://yjshy.nwafu.edu.cn/docs//2021-03/0d686e7d3f204af9880822db5fd7045c.pdf}
+%
+% \bibitem{西北农林科技大学本科生论文撰写规范}
+% 西北农林科技大学教务处.
+% \newblock \textit{西北农林科技大学本科毕业论文(设计)写作规范(试用)} [EB/OL].
+% \newblock 2021 年 5 月修订版.
+% \newblock (2021-05-07)
+% \urlprefix\url{https://jiaowu.nwafu.edu.cn/docs//2021-05/8aa0ef88fcf94e5ebf0bdcc2a6f42785.pdf}
+%
+% \subsection{宏包、模版}
+%
+% \bibitem{source2e}
+% \textsc{Braams J}, \textsc{Carlisle D}, \textsc{Jeffrey A}, et al.
+% \newblock \textit{The \LaTeXe{} Sources} [CP/OL].
+% \newblock (2020-02-02)
+% \urlprefix\url{https://ctan.org/pkg/latex}
+% \urlprefix\CTANurl[源代码:]{macros/latex/base/source2e.pdf}
+%
+% \bibitem{CTeX}
+% \textsc{CTEX.ORG}.
+% \newblock \textit{\CTeX{} 宏集手册} [EB/OL].
+% \newblock version 2.5.4,
+% \newblock (2020-08-23)
+% \urlprefix\url{https://ctan.org/pkg/ctex}
+% \urlprefix\CTANurl[文档及源代码:]{language/chinese/ctex/ctex.pdf}
+%
+% \bibitem{xeCJK}
+% \textsc{CTEX.ORG}.
+% \newblock \textit{\pkg{xeCJK} 宏包} [EB/OL].
+% \newblock version 3.8.5,
+% \newblock (2020-08-23)
+% \urlprefix\url{https://ctan.org/pkg/xecjk}
+% \urlprefix\CTANurl[文档及源代码:]{macros/xetex/latex/xecjk/xeCJK.pdf}
+%
+% \bibitem{source3}
+% \textsc{The \LaTeX3 Project}.
+% \newblock \textit{The \LaTeX3 Sources} [CP/OL].
+% \newblock (2020-08-07)
+% \urlprefix\url{https://ctan.org/pkg/l3kernel}
+% \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.15a,
+% \newblock (2020-08-23)
+% \urlprefix\url{https://ctan.org/pkg/biblatex}
+% \urlprefix\CTANurl[文档:]{macros/latex/contrib/biblatex/doc/biblatex.pdf}
+%
+% \bibitem{lshort}
+% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al.
+% \newblock \textit{The Not So Short Introduction to \LaTeXe{}: Or \LaTeXe{} in 139 minutes} [EB/OL].
+% \newblock version 6.2,
+% \newblock (2018-02-28)
+% \urlprefix\url{https://ctan.org/pkg/lshort-english}
+% \urlprefix\CTANurl[文档:]{info/lshort/english/lshort.pdf}
+%
+% \bibitem{lshort-zh-cn}
+% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al.
+% \newblock \textit{一份(不太)简短的 \LaTeXe{} 介绍: 或 112 分钟了解 \LaTeXe{}} [EB/OL].
+% \newblock \CTeX{} 开发小组, 译.
+% \newblock 原版版本 version 6.2, 中文版本 version 6.02,
+% \newblock (2020-08-03)
+% \urlprefix\url{https://ctan.org/pkg/lshort-zh-cn}
+% \urlprefix\CTANurl[文档:]{info/lshort/chinese/lshort-zh-cn.pdf}
+%
+% \bibitem{biblatex-gb7714-2015}
+% 胡振震.
+% \newblock \textit{符合 GB/T 7714-2015 标准的 biblatex 参考文献样式} [EB/OL].
+% \newblock version 1.0v,
+% \newblock (2020-07-21)
+% \urlprefix\url{https://ctan.org/pkg/biblatex-gb7714-2015}
+% \urlprefix\CTANurl[文档:]{biblatex-contrib/biblatex-gb7714-2015/biblatex-gb7714-2015.pdf}
+%
+% \bibitem{fduthesis}
+% 曾祥东(\textsc{Xiangdong Z}).
+% \newblock \textit{\textsc{fduThesis}:复旦大学毕业论文 \LaTeX{} 模板} [EB/OL].
+% \newblock version 0.7e,
+% \newblock (2020-08-30)
+% \urlprefix\url{https://ctan.org/pkg/fduthesis}
+% \urlprefix\CTANurl[文档及源代码:]{macros/latex/contrib/fduthesis/fduthesis.pdf}
+%
+% \subsection{其他}
+%
+% \bibitem{wright2009dtxfile}
+% \textsc{Wright J}.
+% \newblock \textit{A model dtx file} [EB/OL].
+% \newblock (2009-10-06)
+% \urlprefix\url{https://www.texdev.net/2009/10/06/a-model-dtx-file/}
+%
+% \bibitem{孔雀计划}
+% 刘庆(\textsc{Eric Q L}).
+% \newblock \textit{孔雀计划:中文字体排印的思路} [EB/OL].
+% \urlprefix\url{https://thetype.com/kongque/}
+%
+% \end{thebibliography}
+%
+% \clearpage
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+%^^A 代码部分的页边距
+% \newgeometry{
+%   left      = 2.25 in,
+%   right     = 1.00 in,
+%   top       = 1.25 in,
+%   bottom    = 1.00 in,
+%   marginpar = 2.25 in
+% }
+%
+% \section{实现细节}
+%
+% 本模板使用 \LaTeX3 语法编写,依赖 \pkg{expl3} 环境,
+% 并需调用 \pkg{l3packages} 中的相关宏包。
+%
+% 按照 \LaTeX3 语法,代码中的空格、换行、回车与制表符完全被忽略,
+% 而下划线“|_|”和冒号“|:|”则可作为一般字母使用。
+% 正常的空格可以使用“|~|”代替;至于 |~| 原来所表示的“带子”,
+% 则要用 \LaTeXe{} 的原始命令 \tn{nobreakspace} 代替。
+%
+% 以下代码中有一些形如 \textcolor[HTML]{2E3191}{\textsf{<*class>}}
+% 的标记,这是 \pkg{DocStrip} 中的“guard”,用来选择性地提取文件。
+% “\textsf{*}”和“\textsf{/}”分别表示该部分的开始和结束。不含
+% “\textsf{*}”和“\textsf{/}”的 guard 出现在行号右侧,它们用来确定
+% 单独一行代码的归属。这些 guard 的颜色深浅不一,用以明确嵌套关系。
+%
+% 另有若干形如 \textcolor{MaterialPink}{\textsf{<@@=nwafu>}} 的 guard,
+% 它们由 \pkg{l3docstrip} 定义,用来标识名字空间(模块)。
+%
+% \subsection{准备}
+%
+%    \begin{macrocode}
+%<@@=nwafu>
+%<*class>
+%    \end{macrocode}
+%
+% 检查 \LaTeX3 编程环境。
+%    \begin{macrocode}
+\RequirePackage { xparse, xtemplate, l3keys2e }
+\clist_map_inline:nn { expl3, xparse, xtemplate, l3keys2e }
+  {
+    \@ifpackagelater {#1} { 2018/05/12 }
+      { } { \msg_error:nnn { nwafuthesis } { l3-too-old } {#1} }
+  }
+\msg_new:nnn { nwafuthesis } { 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{nwafuthesis} 仅支持 \XeTeX{} 和 \LuaTeX{}。
+%    \begin{macrocode}
+\sys_if_engine_xetex:F
+  {
+    \sys_if_engine_luatex:F
+      {
+        \msg_fatal:nnx { nwafuthesis } { unsupported-engine }
+          { \c_sys_engine_str }
+      }
+  }
+\msg_new:nnn { nwafuthesis } { unsupported-engine }
+  {
+    The~ nwafuthesis~ class~ requires~ either~ XeTeX~ or~ LuaTeX. \\\\
+    "#1"~ is~ not~ supported~ at~ present.~ You~ must~ change \\
+    your~ typesetting~ engine~ to~ "xelatex"~ or~ "lualatex".
+  }
+\hook_gset_rule:nnnn { begindocument/before } { nwafuthesis } { < } { xeCJK }
+%    \end{macrocode}
+%
+% \subsubsection{内部变量声明}
+%
+% \begin{variable}{\l_@@_tmpa_box,
+%   \l_@@_tmpa_clist,
+%   \l_@@_tmpb_clist,
+%   \l_@@_tmpc_clist,
+%   \l_@@_tmpt_clist,
+%   \l_@@_tmpa_dim,
+%   \l_@@_tmpb_dim,
+%   \l_@@_tmpc_dim,
+%   \l_@@_tmpd_dim,
+%   \l_@@_tmpt_dim,
+%   \l_@@_tmpa_skip,
+%   \l_@@_tmpa_tl,
+%   \l_@@_tmpb_tl,
+%   \l_@@_tmpt_tl
+%  }
+% 临时变量。
+%    \begin{macrocode}
+\box_new:N   \l_@@_tmpa_box
+\clist_new:N \l_@@_tmpa_clist
+\clist_new:N \l_@@_tmpb_clist
+\clist_new:N \l_@@_tmpc_clist
+\clist_new:N \l_@@_tmpd_clist
+\clist_new:N \l_@@_tmpt_clist
+\dim_new:N   \l_@@_tmpa_dim
+\dim_new:N   \l_@@_tmpb_dim
+\dim_new:N   \l_@@_tmpc_dim
+\dim_new:N   \l_@@_tmpd_dim
+\dim_new:N   \l_@@_tmpt_dim
+\skip_new:N  \l_@@_tmpa_skip
+\tl_new:N    \l_@@_tmpa_tl
+\tl_new:N    \l_@@_tmpb_tl
+\tl_new:N    \l_@@_tmpc_tl
+\tl_new:N    \l_@@_tmpd_tl
+\tl_new:N    \l_@@_tmpt_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{nwafuthesis} 传入 \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}{\l_@@_withchap_bool}
+% 是否按章编写论文(默认按章编写)。
+% 该选项是针对部分学院需要按报告形式(类似"1 绪论")撰写本科毕业论文(设计)
+% 而设置的。
+%    \begin{macrocode}
+\bool_new:N \l_@@_withchap_bool
+%    \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}
+%
+% \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,\@@_preto_cmd:Nn,\@@_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 \@@_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}
+%
+% \begin{macro}{\@@_at_begin_environment:nn}
+% 在环境开始添加代码的补丁函数。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_at_begin_environment:nn #1#2
+  {
+    \seq_set_from_clist:Nn \l_@@_env_hook_name_seq {#1}
+    \seq_map_inline:Nn \l_@@_env_hook_name_seq
+      { \AtBeginEnvironment{##1}{#2} }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_at_end_preamble:n}
+% 在导言区结束位置添加代码的补丁函数。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_at_end_preamble:n
+  {
+    \ctex_gadd_ltxhook:nn { env/document/before }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_define_fn_style:nn,
+%   \@@_define_punct:nn,
+%   \@@_define_name:nn,
+%   \@@_define_name:nnn}
+% 用来定义脚注样式、标点、默认名称的辅助函数。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_define_fn_style:nn #1#2
+  { \tl_const:cn { c_@@_fn_style_ #1 _tl } {#2} }
+\cs_new_protected:Npn \@@_define_punct:nn #1#2
+  { \tl_const:cn { c_@@_ #1 _tl } { \@@_symbol:n {#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      { nwafuthesis } }
+\cs_new:Npn \@@_error:n     { \msg_error:nn     { nwafuthesis } }
+\cs_new:Npn \@@_error:nn    { \msg_error:nnn    { nwafuthesis } }
+\cs_new:Npn \@@_error:nx    { \msg_error:nnx    { nwafuthesis } }
+\cs_new:Npn \@@_error:nnn   { \msg_error:nnnn   { nwafuthesis } }
+\cs_new:Npn \@@_warning:n   { \msg_warning:nn   { nwafuthesis } }
+\cs_new:Npn \@@_warning:nn  { \msg_warning:nnn  { nwafuthesis } }
+\cs_new:Npn \@@_warning:nxx { \msg_warning:nnxx { nwafuthesis } }
+\cs_new:Npn \@@_info:nx     { \msg_info:nnx     { nwafuthesis } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{选项处理}
+%
+% 定义 |nwafu/option| 键值类。
+%    \begin{macrocode}
+\keys_define:nn { nwafu / option }
+  {
+%    \end{macrocode}
+%
+% \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 =
+      {
+%    \end{macrocode}
+% 将双面设置为openany,从结果来讲与单面一样,
+% 此处是为后续诸如页边距调整为左右不同保留的设置。
+%    \begin{macrocode}
+        \clist_gput_right:Nn \g_@@_to_ctexbook_clist { twoside, openany }
+        \bool_set_true:N     \g_@@_twoside_bool
+      },
+%    \end{macrocode}
+% \end{macro}
+%
+% \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}
+%
+% 处理未知选项。
+%    \begin{macrocode}
+    unknown .code:n = { \@@_error:n { unknown-option } }
+  }
+\@@_msg_new:nn { unknown-option }
+  { Class~ option~ "\l_keys_key_tl"~ is~ unknown. }
+%    \end{macrocode}
+%
+% 将文档类选项传给 |nwafu/option|。
+%    \begin{macrocode}
+\ProcessKeysOptions { nwafu / option }
+%    \end{macrocode}
+%
+% \subsection{模板参数配置}
+%
+% \subsubsection{定义模板LOGO和中英文年月命令}
+%
+% \begin{macro}{\nwafuthesis}
+% nwafuthesis模板的LOGO。
+%    \begin{macrocode}
+\NewDocumentCommand \nwafuthesis { }
+  {%
+    \makebox{\rmfamily%
+      N\hspace{-0.2ex}\raisebox{-0.5ex}{W}\raisebox{0.5ex}{\hspace{-0.2ex}\textsc{AFU}}\hspace{0.3ex}%
+      \textsc{Thesis}
+    }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\datezh}
+% 取得中文年月。
+%    \begin{macrocode}
+\NewDocumentCommand \datezh { }
+  {
+    \int_use:N \c_sys_year_int 年
+    \int_use:N \c_sys_month_int 月
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dateen}
+% 取得英文月年,详见:
+% 1  = Jan.(January),
+% 2  = Feb.(February),
+% 3  = Mar.(March),
+% 4  = Apr.(April),
+% 5  = May.(May),
+% 6  = Jun.(June),
+% 7  = Jul.(July),
+% 8  = Aug.(August),
+% 9  = Sept.(September),
+% 10 = Oct.(October),
+% 11 = Nov.(November),
+% 12 = Dec.(December),
+%    \begin{macrocode}
+\prop_new:N \l_@@_dateen_prop
+\prop_set_from_keyval:Nn \l_@@_dateen_prop
+  {
+    1  = Jan.,
+    2  = Feb.,
+    3  = Mar.,
+    4  = Apr.,
+    5  = May.,
+    6  = Jun.,
+    7  = Jul.,
+    8  = Aug.,
+    9  = Sept.,
+    10 = Oct.,
+    11 = Nov.,
+    12 = Dec.,
+  }
+\NewDocumentCommand \dateen { }
+  {
+    \prop_get:NVN \l_@@_dateen_prop \c_sys_month_int \l_@@_tmpa_tl
+    \l_@@_tmpa_tl ,~ \int_use:N \c_sys_year_int
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{通用常量}
+%
+% 这一部分内容在原\cls{fduthesis}中,是通过``*.def''文件实现的,
+% 由于针对本校而言这些内容极少发生改变,为了减少文件依赖,将其
+% 全部写入了\cls{nwafuthesis.cls}文件。
+%
+% \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   { Northwest~ A\&F~ University }
+%    \end{macrocode}
+% \end{variable}
+%
+% 常用标点符号,见表~\ref{tab:punctuations}。
+%    \begin{macrocode}
+\clist_map_inline:nn
+  {
+    { ideo_comma       } { "3001 },
+    { ideo_full_stop   } { "3002 },
+    { fwid_comma       } { "FF0C },
+    { fwid_full_stop   } { "FF0E },
+    { fwid_colon       } { "FF1A },
+    { fwid_semicolon   } { "FF1B },
+    { fwid_left_paren  } { "FF08 },
+    { fwid_right_paren } { "FF09 }
+  }
+  { \@@_define_punct:nn #1 }
+%    \end{macrocode}
+%
+% \begin{table}[ht]
+%   \caption{常用标点符号}
+%   \label{tab:punctuations}
+%   \centering
+%   \begin{tabular}{cccc}
+%     \toprule
+%       \textbf{中文名称} & \textbf{英文名称} & \textbf{符号} & \textbf{Unicode} \\
+%     \midrule
+%       中文顿号     & Ideographic comma           & \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}
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%    \end{macrocode}
+% 研究生独创性声明,注意测试后,此处分段只能用\tn{par}实现。
+%    \begin{macrocode}
+    \tl_const:Nn \c_@@_orig_decl_text_tl
+      {
+        本人声明:所呈交的学位论文是我个人在导师指导下独立进行的研究工作及取
+        得的研究结果;论文中的研究数据及结果的获得完全符合学校《关于规范西北
+        农林科技大学研究生学术道德的暂行规定》,如果违反此规定,一切后果与法
+        律责任均由本人承担。\par
+        尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经
+        发表或撰写过的研究结果,也不包含其他人和自己本人已获得西北农林科技大
+        学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同事对本
+        研究所做的任何贡献均已在论文的致谢中作了明确的说明并表示了谢意。
+      }
+  }
+  {
+%    \end{macrocode}
+% 本科生生独创性声明,注意测试后,此处分段只能用\tn{par}实现。
+%    \begin{macrocode}
+    \tl_const:Nn \c_@@_orig_decl_text_tl
+      {
+        本人声明:所呈交的毕业
+        \clist_item:Nn \c__@@_bachelor_type_clist { \l__@@_info_bachelor_type_int }
+        是我个人在导师指导下
+        独立进行的研究工作及取得的研究结果。尽我所知,除了文中特别加
+        以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究结果,
+        也不包含其他人和自己本人已获得\c_@@_name_simp_tl{}或其它教育
+        机构的学位或证书而使用过的材料。与我一同工作的同事对本研究所做
+        的任何贡献均已在论文的致谢中作了明确的说明并表示了谢意。
+        如违反此声明,一切后果与法律责任均由本人承担。
+      }
+  }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_super_decl_text_tl}
+% 研究生学位导师承诺。
+%    \begin{macrocode}
+\tl_const:Nn \c_@@_super_decl_text_tl
+  {
+    本人承诺:我的研究生{\@@_text_uline:V \l_@@_info_author_tl}所呈交的
+    学位论文是在我指导下独立开展研究工作及取得的研究结果,属于我现
+    岗职务工作的结果,并严格按照学校《关于规范西北农林科技大学研究生学术
+    道德的暂行规定》而获得的研究结果。如果违反学校《关于规范西北农林科
+    技大学研究生学术道德的暂行规定》,我愿接受按学校有关规定的处罚处理并
+    承担相应导师连带责任。
+  }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_auth_decl_text_tl}
+% 论文使用授权声明。
+%    \begin{macrocode}
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%    \end{macrocode}
+% 研究生使用授权声明,注意测试后,此处分段只能用\tn{par}实现。
+%    \begin{macrocode}
+    \tl_const:Nn \c_@@_auth_decl_text_tl
+      {
+        本学位论文的知识产权归属西北农林科技大学。本人同意西北农林科技大学
+        保存或向国家有关部门或机构送交论文的纸质版和电子版,允许论文被查阅和
+        借阅;同意西北农林科技大学将本学位论文的全部或部分内容授权汇编录入
+        中国博士/硕士学位论文全文数据库》和《中国学位论文全文数据库》进行
+        出版,并享受相关权益。\par
+
+        本人保证,在毕业离开(或者工作调离)西北农林科技大学后,发表或者使用本
+        学位论文及其相关的工作成果时,将以西北农林科技大学为第一署名单位,否
+        则,愿意按《中华人民共和国著作权法》等有关规定接受处理并承担法律责任。\par
+
+        任何收存和保管本论文各种版本的其他单位和个人(包括研究生本人)未经本
+        论文作者的导师同意,不得有对本论文进行复制、修改、发行、出租、改编等
+        侵犯著作权的行为,否则,按违背《中华人民共和国著作权法》等有关规定处
+        理并追究法律责任。\par
+
+        {\sffamily (保密的学位论文在保密期限内,不得以任何方式发表、借阅、复印、
+            缩印或扫描复制手段保存、汇编论文)}
+      }
+  }
+  {
+%    \end{macrocode}
+% 本科生使用授权声明,注意测试后,此处分段只能用\tn{par}实现。
+%    \begin{macrocode}
+    \tl_const:Nn \c_@@_auth_decl_text_tl
+      {
+        本毕业
+        \clist_item:Nn \c__@@_bachelor_type_clist { \l__@@_info_bachelor_type_int }
+        的知识产权归属\c_@@_name_simp_tl{}。
+        本人同意\c_@@_name_simp_tl{}保存或向国家有关部门或机构
+        送交论文的纸质版和电子版,允许论文被查阅和借阅。\par
+
+        本人保证,在毕业离开\c_@@_name_simp_tl{}后,发表或者使用本毕业
+        \clist_item:Nn \c__@@_bachelor_type_clist { \l__@@_info_bachelor_type_int }
+        及其相关的工作成果时,将以\c_@@_name_simp_tl{}
+        为第一署名单位,否则,愿意按《中华人民共和国著作权法》等
+        有关规定接受处理并承担法律责任。\par
+
+        任何收存和保管本论文各种版本的其他单位和个人(包括作者本人)未经
+        本论文作者的导师同意,不得有对本论文进行复制、修改、发行、出租、
+        改编等侵犯著作权的行为,否则,按违背《中华人民共和国著作权法》
+        等有关规定处理并追究法律责任。
+      }
+  }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_orig_decl_sign_tl,
+%   \c_@@_super_decl_sign_tl}
+% 声明页签名项目。
+%    \begin{macrocode}
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%    \end{macrocode}
+% 研究生。
+%    \begin{macrocode}
+    \tl_const:Nn \c_@@_orig_decl_sign_tl
+      { 研究生签名 }
+    \tl_const:Nn \c_@@_super_decl_sign_tl
+      { 导师签名 }
+  }
+  {
+%    \end{macrocode}
+% 本科生。
+%    \begin{macrocode}
+    \tl_const:Nn \c_@@_orig_decl_sign_tl
+      { 本科生签名 }
+    \tl_const:Nn \c_@@_super_decl_sign_tl
+      { 指导教师签名 }
+  }
+\clist_const:Nn \c_@@_auth_decl_sign_clist
+  { 作者签名, 导师签名, 日期 }
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsubsection{杂项常量定义}
+%
+% \begin{variable}{\c_@@_thesis_type_clist,
+%   \c_@@_degree_type_clist,
+%   \c_@@_bachelor_type_clist}
+% 论文类型与学位类型。
+%    \begin{macrocode}
+\clist_const:Nn \c_@@_thesis_type_clist
+  { 博士学位论文, 硕士学位论文, 本科毕业 }
+\clist_const:Nn \c_@@_degree_type_clist
+  { 学术学位, 专业学位 }
+\clist_const:Nn \c_@@_bachelor_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      } { 密级                          },
+   { udc               } { UDC                           },
+   { school_id         } { 学校代码                      },
+   { department        } { 学院                          },
+   { enroll            } { 年级                          },
+   { class_id          } { 班级                          },
+   { instructors       } { 指导小组                      },
+   { author_sign       } { 作者签名                      },
+   { supervisor_sign   } { 导师签名                      },
+   { sign_date         } { 日期                          },
+   { toc               } { 目 \quad 录                   },
+   { lof               } { 插图目录                      },
+   { lot               } { 表格目录                      },
+   { bib_en            } { Bibliography                  },
+   { ack               } { 致 \quad 谢                   },
+   { resume            } { 个人简历                      },
+   { pdf_creator       } { LaTeX~ with~ nwafuthesis~ class },
+ }
+ { \@@_define_name:nn #1 }
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%
+%    \end{macrocode}
+% 研究生的字段。
+%    \begin{macrocode}
+%
+    \clist_map_inline:nn
+      {
+        { student_id      } { 研究生学号                       },
+        { orig_decl       } { 研究生学位论文的独创性声明       },
+        { super_decl      } { 导师指导研究生学位论文的承诺     },
+        { auth_decl       } { 关于研究生学位论文使用授权的说明 }
+      }
+      { \@@_define_name:nn #1 }
+   }{
+%
+%    \end{macrocode}
+% 本科生的字段。
+%    \begin{macrocode}
+%
+    \clist_map_inline:nn
+      {
+        { major           } { 专业                           },
+        { student_id      } { 学号                           },
+        { author          } { 学生姓名                       },
+        { cosupervisor    } { 协助指导教师                   },
+        { date            } { 完成日期                       },
+        { orig_decl       } { 本科生毕业\clist_item:Nn
+                              \c__@@_bachelor_type_clist {
+                              \l__@@_info_bachelor_type_int
+                              }的独创性声明                  },
+        { auth_decl       } { 关于本科生毕业\clist_item:Nn
+                              \c__@@_bachelor_type_clist {
+                              \l__@@_info_bachelor_type_int
+                              }知识产权的说明                }
+      }
+      { \@@_define_name:nn #1 }
+  }
+%
+%    \end{macrocode}
+% 研究生与本科生相同的中英文字段。
+%    \begin{macrocode}
+%
+\clist_map_inline:nn
+  {
+    { supervisor } { 指导教师 } { Supervisor },
+  }
+  { \@@_define_name:nnn #1 }
+%
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%
+%    \end{macrocode}
+% 研究生。
+%    \begin{macrocode}
+%
+    \clist_map_inline:nn
+      {
+        { major             } { 学科专业       } { Major                },
+        { researchfield     } { 研究方向       } { Research~ Field      },
+        { professionaltype  } { 专业学位类型   } { Degree~ Type         },
+        { professionalfield } { 领域名称       } { Field                },
+        { author            } { 论文作者       } { Candidate            },
+        { cosupervisor      } { 联合指导教师   } { Co-Supervisor        },
+        { date              } { 论文提交时间   } { Date~ of~ Submission },
+        { abstract          } { 摘 \quad 要    } { ABSTRACT             },
+        { keywords          } { 关键字         } { KEYWORDS             },
+        { clc               } { 分类号         } { CLC~ number:         },
+        { notation          } { 主要符号对照表 } { List~ of~ Symbols    }
+      }
+      { \@@_define_name:nnn #1 }
+  }{
+%
+%    \end{macrocode}
+% 本科生。
+%    \begin{macrocode}
+%
+    \clist_map_inline:nn
+      {
+        { abstract } { 摘要        } { Abstract          },
+        { keywords } { 关键字      } { Keywords          },
+        { clc      } { 分类号      } { CLC~ number       },
+      }
+      { \@@_define_name:nnn #1 }
+  }
+%    \end{macrocode}
+%
+% 定理标题中英文名称常量。
+%    \begin{macrocode}
+%
+\clist_map_inline:nn
+  {
+    { proof      } { 证明 } { Proof      },
+    { axiom      } { 公理 } { Axiom      },
+    { corollary  } { 推论 } { Corollary  },
+    { definition } { 定义 } { Definition },
+    { example    } { 例   } { Example    },
+    { lemma      } { 引理 } { Lemma      },
+    { theorem    } { 定理 } { Theorem    }
+  }
+  { \@@_define_name:nnn #1 }
+%    \end{macrocode}
+%
+% \subsection{载入宏包、文档类}
+%
+% 将选项传入 \cls{ctexbook} 文档类。
+%    \begin{macrocode}
+\PassOptionsToClass
+  {
+    UTF8,
+    heading    = true,
+    fontset    = none,
+    zihao      = -4,
+    linespread = \c_@@_line_spread_fp,
+    \g_@@_to_ctexbook_clist
+  }
+  { ctexbook }
+%    \end{macrocode}
+%
+% 传入各宏包选项。
+%    \begin{macrocode}
+\clist_map_inline:nn
+  {
+    { shortlabels       } { enumitem },
+    { 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 at document@left at 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}
+%
+%
+% 载入各宏包。其中,\pkg{amsmath} 必须在 \pkg{unicode-math} 之前引入。
+%    \begin{macrocode}
+\RequirePackage
+  {
+    amsmath,
+    unicode-math,
+    geometry,
+    fancyhdr,
+    titletoc,
+    footmisc,
+    ntheorem,
+    enumitem,
+    graphicx,
+    longtable,
+    booktabs,
+    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~ nwafuthesis~ 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 } }
+\sys_if_engine_luatex:T
+  { \@@_check_package:nnn { xunicode-addon } { 2018/04/30 } { 3.7.1 } }
+%    \end{macrocode}
+%
+% \subsection{页面布局}
+%
+% 利用 \pkg{geometry} 宏包设置纸张大小、页面边距以及页眉高度。这里,
+% $\SI{2.54}{\centi\meter}=\SI{1}{in}$,
+% $\SI{3.18}{\centi\meter}=\SI{1.25}{in}$。
+%
+% 研究论文页面尺寸与本科生毕业论文(设计)的
+% 页面尺寸不一致,需要分开设置。
+%    \begin{macrocode}
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%    \end{macrocode}
+% 研究生论文页边距
+%    \begin{macrocode}
+    \geometry
+      {
+        paper=a4paper,
+        top=3.1cm,
+        bottom=3.3cm,
+        left=2.6cm,
+        right=2.6cm,
+        headheight=0.8cm,
+        headsep=0.7cm,
+        footskip=1.4cm,
+        %includehead,
+        %includefoot,
+      }
+  }{
+%    \end{macrocode}
+% 本科生论文页边距
+%    \begin{macrocode}
+    \geometry
+      {
+        paper=a4paper,
+        top=3.14cm,
+        bottom=3.8cm,
+        left=2.45cm,
+        right=2.45cm,
+        headheight=0.8cm,
+        headsep=0.63cm,
+        footskip=2.3cm,
+      }
+  }
+%    \end{macrocode}
+%
+% 草稿模式下显示页面边框及页眉、页脚线 。
+%    \begin{macrocode}
+\bool_if:NT \g_@@_draft_bool { \geometry { showframe } }
+%    \end{macrocode}
+%
+% \subsection{字体}
+%
+% \subsubsection{预定义字体配置}
+%
+% \begin{variable}{\g_@@_fontset_tl, \g_@@_cjk_fontset_tl}
+% 存放字体选项值。
+%    \begin{macrocode}
+\tl_new:N \g_@@_fontset_tl
+\tl_new:N \g_@@_cjk_fontset_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{style/font}
+% 预定义西文字体。
+%    \begin{macrocode}
+\keys_define:nn { nwafu / style }
+  {
+    font .choices:nn =
+      { garamond, libertinus, lm, palatino, times, times*, none }
+      { \tl_set_eq:NN \g_@@_fontset_tl \l_keys_choice_tl }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{style/cjk-font}
+% 预定义中文字体。
+%    \begin{macrocode}
+%<*class>
+\keys_define:nn { nwafu / style }
+  {
+    cjk-font .choices:nn =
+      { adobe, fandol, founder, mac, sinotype, sourcehan, windows, none }
+      { \tl_set_eq:NN \g_@@_cjk_fontset_tl \l_keys_choice_tl }
+  }
+%    \end{macrocode}
+%</class>
+% \end{macro}
+%
+% \begin{macro}{withchapter}
+% 设置本科论文章标题是否为章格式。
+%    \begin{macrocode}
+\keys_define:nn { nwafu / style }
+  {
+    withchapter .bool_set:N = \l_@@_withchap_bool,
+    withchapter .default:n  = true,
+    withchapter .initial:n  = true,
+  }
+%    \end{macrocode}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+%   \@@_setmainfont:nn,
+%   \@@_setsansfont:nn,
+%   \@@_setmonofont:nn,
+%   \@@_setmathfont:nn}
+% 用于设置西文字体的辅助函数,来源于 \pkg{fontspec} 和 \pkg{unicode-math}。
+% \begin{arguments}
+%   \item 字体名
+%   \item 选项
+% \end{arguments}
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_setmainfont:nn #1#2
+  { \__fontspec_main_setmainfont:nn {#2} {#1} }
+\cs_new_protected:Npn \@@_setsansfont:nn #1#2
+  { \__fontspec_main_setsansfont:nn {#2} {#1} }
+\cs_new_protected:Npn \@@_setmonofont:nn #1#2
+  { \__fontspec_main_setmonofont:nn {#2} {#1} }
+\cs_new_protected:Npn \@@_setmathfont:nn #1#2
+  { \__um_setmathfont:nn {#2} {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+%   \@@_setCJKmainfont:nn,
+%   \@@_setCJKsansfont:nn,
+%   \@@_setCJKmonofont:nn}
+% 用于设置中文字体的辅助函数,来源于 \pkg{xeCJK} 和 \pkg{ctex} 宏包。
+%    \begin{macrocode}
+%<*class>
+\cs_new_protected:Npn \@@_setCJKmainfont:nn #1#2
+  { \@@_set_family:nnn { \CJKrmdefault } {#2} {#1} }
+\cs_new_protected:Npn \@@_setCJKsansfont:nn #1#2
+  { \@@_set_family:nnn { \CJKsfdefault } {#2} {#1} }
+\cs_new_protected:Npn \@@_setCJKmonofont:nn #1#2
+  { \@@_set_family:nnn { \CJKttdefault } {#2} {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_cjk_font_hei:nn,\nwafu at hei}
+% 中文黑体需要单独设置。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_set_cjk_font_hei:nn #1#2
+  { \@@_set_family:nnn { nwafu at hei } {#2} {#1} }
+\cs_new_protected:Npn \nwafu at hei
+  { \@@_switch_family:n { nwafu at hei } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_cjk_font_kai:nn,\nwafu at kai}
+% 楷体需要单独设置。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_set_cjk_font_kai:nn #1#2
+  { \@@_set_family:nnn { nwafu at kai } {#2} {#1} }
+\cs_new_protected:Npn \nwafu at kai
+  { \@@_switch_family:n { nwafu at kai } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+%   \@@_cjk_font_options:,
+%   \@@_cjk_font_hei_options:,
+%   \@@_setCJKmainfont:n,
+%   \@@_setCJKsansfont:n,
+%   \@@_setCJKmonofont:n,
+%   \@@_set_cjk_font_hei:n,
+%   \@@_set_cjk_font_kai:n}
+% 将 bold、italic 和 bold italic 统一按照 roman 设置。
+%    \begin{macrocode}
+\tl_const:Nn \@@_cjk_font_options:
+ { UprightFont = *, ItalicFont = *, AutoFakeBold = true }
+%    \end{macrocode}
+% 设置为黑体时不启用伪粗体
+%    \begin{macrocode}
+\tl_const:Nn \@@_cjk_font_hei_options:
+ { UprightFont = *, ItalicFont = *, AutoFakeBold = false }
+%    \end{macrocode}
+% 设置正文常规字体
+%    \begin{macrocode}
+\cs_new_protected:Npx \@@_setCJKmainfont:n   #1
+  { \@@_setCJKmainfont:nn   {#1} { \@@_cjk_font_options: } }
+%    \end{macrocode}
+% 设置无衬线字体
+%    \begin{macrocode}
+\cs_new_protected:Npx \@@_setCJKsansfont:n   #1
+  { \@@_setCJKsansfont:nn   {#1} { \@@_cjk_font_hei_options: } }
+%    \end{macrocode}
+% 设置等宽字体
+%    \begin{macrocode}
+\cs_new_protected:Npx \@@_setCJKmonofont:n   #1
+  { \@@_setCJKmonofont:nn   {#1} { \@@_cjk_font_options: } }
+%    \end{macrocode}
+% 设置黑体字体
+%    \begin{macrocode}
+\cs_new_protected:Npx \@@_set_cjk_font_hei:n #1
+  { \@@_set_cjk_font_hei:nn {#1} { \@@_cjk_font_hei_options: } }
+%    \end{macrocode}
+% 设置楷体字体
+%    \begin{macrocode}
+\cs_new_protected:Npx \@@_set_cjk_font_kai:n #1
+  { \@@_set_cjk_font_kai:nn {#1} { \@@_cjk_font_options: } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_family:nnn,\@@_switch_family:n}
+% 封装 CJK 字体族的设定和切换命令。
+%    \begin{macrocode}
+\sys_if_engine_xetex:TF
+  {
+    \cs_new_eq:NN \@@_set_family:nnn  \xeCJK_set_family:nnn
+    \cs_new_eq:NN \@@_switch_family:n \xeCJK_switch_family:n
+  }
+  {
+    \cs_new_eq:NN \@@_set_family:nnn  \ctex_ltj_set_family:nnn
+    \cs_new_eq:NN \@@_switch_family:n \ctex_ltj_switch_family:n
+  }
+%</class>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+%   \setmainfont,
+%   \setsansfont,
+%   \setmonofont,
+%   \setmathfont,
+%   \setCJKmainfont,
+%   \setCJKsansfont,
+%   \setCJKmonofont,
+%   \@@_set_font:n}
+% 重新定义以上宏包提供的字体选择命令。把它放在导言区末尾,使得用户配置不被
+% 模板配置覆盖。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_set_font_helper:n #1
+  {
+    \exp_args:Nc \RenewDocumentCommand { set #1 font } { O { } m O { } }
+      {
+        \ctex_at_end_preamble:n
+          { \use:c { @@_set #1 font:nn } {##2} { ##1, ##3 } }
+      }
+  }
+\clist_map_inline:nn { main, sans, mono, math    } { \@@_set_font_helper:n {#1} }
+\clist_map_inline:nn { CJKmain, CJKsans, CJKmono } { \@@_set_font_helper:n {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+%   \g_@@_font_family_libertinus_serif_tl,
+%   \g_@@_font_family_libertinus_sans_tl,
+%   \g_@@_font_style_libertinus_rm_tl,
+%   \g_@@_font_style_libertinus_bf_tl,
+%   \g_@@_font_style_libertinus_it_tl,
+%   \g_@@_font_style_libertinus_bfit_tl,
+%   \g_@@_font_style_libertinus_bfsl_tl,
+%   \g_@@_font_family_xits_tl,
+%   \g_@@_font_style_xits_rm_tl,
+%   \g_@@_font_style_xits_bf_tl,
+%   \g_@@_font_style_xits_it_tl,
+%   \g_@@_font_style_xits_bfit_tl,
+%   \g_@@_font_name_libertinus_serif_tl,
+%   \g_@@_font_name_libertinus_sans_tl,
+%   \g_@@_font_name_libertinus_math_tl,
+%   \g_@@_font_name_xits_tl,
+%   \g_@@_font_name_xits_math_rm_tl,
+%   \g_@@_font_name_xits_math_bf_tl}
+% Libertinus 和 XITS 字体的文件名做过变动,需要特殊处理。
+%    \begin{macrocode}
+\tl_new:N \g_@@_font_family_libertinus_serif_tl
+\tl_new:N \g_@@_font_family_libertinus_sans_tl
+\tl_new:N \g_@@_font_style_libertinus_rm_tl
+\tl_new:N \g_@@_font_style_libertinus_bf_tl
+\tl_new:N \g_@@_font_style_libertinus_it_tl
+\tl_new:N \g_@@_font_style_libertinus_bfit_tl
+\tl_new:N \g_@@_font_style_libertinus_bfsl_tl
+\tl_new:N \g_@@_font_family_xits_tl
+\tl_new:N \g_@@_font_style_xits_rm_tl
+\tl_new:N \g_@@_font_style_xits_bf_tl
+\tl_new:N \g_@@_font_style_xits_it_tl
+\tl_new:N \g_@@_font_style_xits_bfit_tl
+\tl_new:N \g_@@_font_name_libertinus_serif_tl
+\tl_new:N \g_@@_font_name_libertinus_sans_tl
+\tl_new:N \g_@@_font_name_libertinus_math_tl
+\tl_new:N \g_@@_font_name_xits_tl
+\tl_new:N \g_@@_font_name_xits_math_rm_tl
+\tl_new:N \g_@@_font_name_xits_math_bf_tl
+\fontspec_font_if_exist:nTF { LibertinusSerif-Regular.otf }
+  {
+    \tl_set:Nn \g_@@_font_family_libertinus_serif_tl { LibertinusSerif }
+    \tl_set:Nn \g_@@_font_family_libertinus_sans_tl  { LibertinusSans  }
+    \tl_set:Nn \g_@@_font_family_libertinus_math_tl  { LibertinusMath  }
+    \tl_set:Nn \g_@@_font_style_libertinus_rm_tl     { Regular         }
+    \tl_set:Nn \g_@@_font_style_libertinus_bf_tl     { Bold            }
+    \tl_set:Nn \g_@@_font_style_libertinus_it_tl     { Italic          }
+    \tl_set:Nn \g_@@_font_style_libertinus_bfit_tl   { BoldItalic      }
+    \tl_set:Nn \g_@@_font_style_libertinus_bfsl_tl   { BoldOblique     }
+  }
+  {
+    \tl_set:Nn \g_@@_font_family_libertinus_serif_tl { libertinusserif }
+    \tl_set:Nn \g_@@_font_family_libertinus_sans_tl  { libertinussans  }
+    \tl_set:Nn \g_@@_font_family_libertinus_math_tl  { libertinusmath  }
+    \tl_set:Nn \g_@@_font_style_libertinus_rm_tl     { regular         }
+    \tl_set:Nn \g_@@_font_style_libertinus_bf_tl     { bold            }
+    \tl_set:Nn \g_@@_font_style_libertinus_it_tl     { italic          }
+    \tl_set:Nn \g_@@_font_style_libertinus_bfit_tl   { bolditalic      }
+    \tl_set:Nn \g_@@_font_style_libertinus_bfsl_tl   { bolditalic      }
+  }
+\fontspec_font_if_exist:nTF { XITS-Regular.otf }
+  {
+    \tl_set:Nn \g_@@_font_family_xits_tl        { XITS             }
+    \tl_set:Nn \g_@@_font_style_xits_rm_tl      { Regular          }
+    \tl_set:Nn \g_@@_font_style_xits_bf_tl      { Bold             }
+    \tl_set:Nn \g_@@_font_style_xits_it_tl      { Italic           }
+    \tl_set:Nn \g_@@_font_style_xits_bfit_tl    { BoldItalic       }
+    \tl_set:Nn \g_@@_font_name_xits_math_rm_tl  { XITSMath-Regular }
+    \tl_set:Nn \g_@@_font_name_xits_math_bf_tl  { XITSMath-Bold    }
+  }
+  {
+    \tl_set:Nn \g_@@_font_family_xits_tl        { xits          }
+    \tl_set:Nn \g_@@_font_style_xits_rm_tl      { regular       }
+    \tl_set:Nn \g_@@_font_style_xits_bf_tl      { bold          }
+    \tl_set:Nn \g_@@_font_style_xits_it_tl      { italic        }
+    \tl_set:Nn \g_@@_font_style_xits_bfit_tl    { bolditalic    }
+    \tl_set:Nn \g_@@_font_name_xits_math_rm_tl  { xits-math     }
+    \tl_set:Nn \g_@@_font_name_xits_math_bf_tl  { xits-mathbold }
+  }
+\tl_set:Nx \g_@@_font_name_libertinus_serif_tl
+  { \g_@@_font_family_libertinus_serif_tl - \g_@@_font_style_libertinus_rm_tl }
+\tl_set:Nx \g_@@_font_name_libertinus_sans_tl
+  { \g_@@_font_family_libertinus_sans_tl  - \g_@@_font_style_libertinus_rm_tl }
+\tl_set:Nx \g_@@_font_name_libertinus_math_tl
+  { \g_@@_font_family_libertinus_math_tl  - \g_@@_font_style_libertinus_rm_tl }
+\tl_set:Nx \g_@@_font_name_xits_tl
+  { \g_@@_font_family_xits_tl - \g_@@_font_style_xits_rm_tl }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_font_garamond:}
+% EB Garamond 系列。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_font_garamond:
+  {
+    \@@_setmainfont:nn { EBGaramond }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      }
+    \@@_setsansfont:nn { \g_@@_font_family_libertinus_sans_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g_@@_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g_@@_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g_@@_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g_@@_font_style_libertinus_bfsl_tl
+      }
+    \@@_setmonofont:nn { lmmonolt10 }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-oblique,
+        BoldItalicFont = *-boldoblique
+      }
+    \@@_setmathfont:nn { Garamond-Math.otf } { }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_font_libertinus:}
+% Libertinus 系列。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_font_libertinus:
+  {
+    \@@_setmainfont:nn { \g_@@_font_family_libertinus_serif_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g_@@_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g_@@_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g_@@_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g_@@_font_style_libertinus_bfit_tl
+      }
+    \@@_setsansfont:nn { \g_@@_font_family_libertinus_sans_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g_@@_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g_@@_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g_@@_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g_@@_font_style_libertinus_bfsl_tl
+      }
+    \@@_setmonofont:nn { lmmonolt10 }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-oblique,
+        BoldItalicFont = *-boldoblique
+      }
+    \@@_setmathfont:nn { \g_@@_font_name_libertinus_math_tl .otf } { }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_font_lm:}
+% Latin Modern 系列。在 \XeLaTeX{} 和 \LuaLaTeX{} 中已作为默认字体,所以仅需
+% 额外处理数学部分。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_font_lm:
+  { \@@_setmathfont:nn { latinmodern-math.otf } { } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_font_palatino:}
+% Palatino 系列。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_font_palatino:
+  {
+    \@@_setmainfont:nn { texgyrepagella }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic
+      }
+    \@@_setsansfont:nn { \g_@@_font_family_libertinus_sans_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g_@@_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g_@@_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g_@@_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g_@@_font_style_libertinus_bfsl_tl,
+        Scale          = MatchUppercase
+      }
+    \@@_setmonofont:nn { lmmonolt10 }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-oblique,
+        BoldItalicFont = *-boldoblique
+      }
+    \@@_setmathfont:nn { texgyrepagella-math.otf } { }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_font_times:}
+% Times 系列。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_font_times:
+  {
+    \@@_setmainfont:nn { \g_@@_font_family_xits_tl }
+      {
+        Extension          = .otf,
+        UprightFont        = *-\g_@@_font_style_xits_rm_tl,
+        BoldFont           = *-\g_@@_font_style_xits_bf_tl,
+        ItalicFont         = *-\g_@@_font_style_xits_it_tl,
+        BoldItalicFont     = *-\g_@@_font_style_xits_bfit_tl
+      }
+    \@@_setsansfont:nn { texgyreheros }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic
+      }
+    \@@_setmonofont:nn { texgyrecursor }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      }
+    \@@_setmathfont:nn { \g_@@_font_name_xits_math_rm_tl .otf }
+      { BoldFont = \g_@@_font_name_xits_math_bf_tl .otf }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_font_times*:}
+% Times* 系列,除数学部分外采用系统字体。
+%    \begin{macrocode}
+\cs_new_protected:cpn { @@_load_font_ times* : }
+  {
+    \@@_setmainfont:nn { Times~ New~ Roman    } { }
+    \@@_setsansfont:nn { Arial                } { }
+    \@@_setmonofont:nn { Courier~ New         } { }
+    \@@_setmathfont:nn { \g_@@_font_name_xits_math_rm_tl .otf }
+      { BoldFont = \g_@@_font_name_xits_math_bf_tl .otf }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_adobe:}
+% Adobe 字库。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_adobe:
+  {
+    \@@_setCJKmainfont:n   { AdobeSongStd-Light       }
+    \@@_setCJKsansfont:n   { AdobeHeitiStd-Regular    }
+    \@@_setCJKmonofont:n   { AdobeFangsongStd-Regular }
+    \@@_set_cjk_font_hei:n { AdobeHeitiStd-Regular    }
+    \@@_set_cjk_font_kai:n { AdobeKaitiStd-Regular    }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_fandol:}
+% Fandol 字库。注意它是安装在 TeX 发行版中的,所以使用文件名调用。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_fandol:
+  {
+    \@@_setCJKmainfont:nn   { FandolSong }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \@@_setCJKsansfont:nn   { FandolHei  }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \@@_setCJKmonofont:nn   { FandolFang }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Regular,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Regular
+      }
+    \@@_set_cjk_font_hei:nn { FandolHei  }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \@@_set_cjk_font_kai:nn { FandolKai  }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Regular,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Regular
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_founder:}
+% 方正字库。虽然有粗体(方正小标宋)等,但并非免费,故这里不做处理。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_founder:
+  {
+    \@@_setCJKmainfont:nn   { FZShuSong-Z01 }
+      {
+        UprightFont    = *,
+        BoldFont       = FZHei-B01,
+        ItalicFont     = FZKai-Z03,
+      }
+    \@@_setCJKsansfont:n   { FZHei-B01      }
+    \@@_setCJKmonofont:n   { FZFangSong-Z02 }
+    \@@_set_cjk_font_hei:n { FZHei-B01      }
+    \@@_set_cjk_font_kai:n { FZKai-Z03      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_mac:}
+% macOS 自带中文字体。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_mac:
+  {
+    \@@_setCJKmainfont:nn   { STSongti-SC }
+      {
+        UprightFont    = *-Light,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Light,
+        BoldItalicFont = *-Bold
+      }
+    \@@_setCJKsansfont:nn   { STHeitiSC   }
+      {
+        UprightFont    = *-Medium,
+        BoldFont       = *-Medium,
+        ItalicFont     = *-Medium,
+        BoldItalicFont = *-Medium
+      }
+    \@@_setCJKmonofont:n    { STFangsong  }
+    \@@_set_cjk_font_hei:nn { STHeitiSC   }
+      {
+        UprightFont    = *-Medium,
+        BoldFont       = *-Medium,
+        ItalicFont     = *-Medium,
+        BoldItalicFont = *-Medium
+      }
+    \@@_set_cjk_font_kai:nn { STKaitiSC   }
+      {
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_sinotype:}
+% 华文字库。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_sinotype:
+  {
+    \@@_setCJKmainfont:n   { STSong     }
+    \@@_setCJKsansfont:n   { STHeiti    }
+    \@@_setCJKmonofont:n   { STFangsong }
+    \@@_set_cjk_font_hei:n { STHeiti    }
+    \@@_set_cjk_font_kai:n { STKaiti    }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_sourcehan:}
+% 思源宋体、思源黑体。由于没有对应的楷体和仿宋,这里直接给出警告。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_sourcehan:
+  {
+    \@@_setCJKmainfont:nn { SourceHanSerifSC }
+      {
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \@@_setCJKsansfont:nn { SourceHanSansSC  }
+      {
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \@@_warning:n { source-han }
+  }
+\@@_msg_new:nn { source-han }
+  { Font~ set~ `sourcehan'~ does~ not~ contain~ kaiti~ and~ fangsong. }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_windows:}
+% Windows 自带中文字体。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_windows:
+  {
+    \@@_setCJKmainfont:n   { SimSun   }
+    \@@_setCJKsansfont:n   { SimHei   }
+    \@@_setCJKmonofont:n   { FangSong }
+    \@@_set_cjk_font_hei:n { SimHei   }
+    \@@_set_cjk_font_kai:n { KaiTi    }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% 探测操作系统,以设置中英文字体。
+%    \begin{macrocode}
+\tl_new:N \l_@@_cjkfont_tl
+\tl_new:N \l_@@_font_tl
+\cs_new_protected:Npn \@@_detect_platform:
+  {
+    \sys_if_platform_windows:TF
+      {
+        \tl_set:Nn \l_@@_cjkfont_tl { windows }
+        \tl_set:Nn \l_@@_font_tl { times* }
+      }
+      {
+        \@@_if_platform_macos:TF
+          {
+            \tl_set:Nn \l_@@_cjkfont_tl { mac }
+            \tl_set:Nn \l_@@_font_tl { times* }
+          }{
+            \tl_set:Nn \l_@@_cjkfont_tl { fandol }
+            \tl_set:Nn \l_@@_font_tl { times }
+          }
+      }
+  }
+\cs_new_protected:Npn \@@_if_platform_macos:TF
+  { \file_if_exist:nTF { /System/Library/Fonts/Menlo.ttc } }
+%    \end{macrocode}
+%
+% \begin{macro}{\@@_load_font:}
+% 字体加载命令。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_load_font:
+  {
+    \tl_if_empty:NTF \g_@@_fontset_tl
+      {
+        \@@_detect_platform:
+        \tl_gset_eq:NN \g_@@_fontset_tl \l_@@_font_tl
+      }{
+      }
+    \tl_if_empty:NTF \g_@@_cjk_fontset_tl
+      {
+        \@@_detect_platform:
+        \tl_gset_eq:NN \g_@@_cjk_fontset_tl \l_@@_cjkfont_tl
+      }{
+      }
+    \use:c { @@_load_font_     \g_@@_fontset_tl     : }
+    \use:c { @@_load_cjk_font_ \g_@@_cjk_fontset_tl : }
+  }
+\ctex_at_end_preamble:n { \@@_load_font: }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{数学字体设置}
+%
+% 根据 GB 3102.11--93 以及 ISO 80000-2:2009 的规定,数学表达式中
+% 表示变量的拉丁字母和希腊字母均应当使用斜体。
+% 这里的 |\keys_set:nn{unicode-math}| 实际相当于 \cs{unimathsetup}。
+%    \begin{macrocode}
+\keys_set:nn { unicode-math }
+  {
+    math-style = ISO,
+    bold-style = ISO,
+%   mathrm     = sym
+  }
+%    \end{macrocode}
+%
+% \subsubsection{字号}
+%
+%    \begin{macrocode}
+\keys_define:nn { nwafu / 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>
+      },
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{句号}
+%
+% \begin{macro}{style/fullwidth-stop}
+% 设置句号形状(圆圈或是圆点)。
+%    \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_@@_fwid_full_stop_tl
+    \char_set_catcode_active:n { "3002 }
+  }
+%</class>
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \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}
+%
+% 关闭横线显示(未启用)。
+%    \begin{macrocode}
+% \RenewDocumentCommand \headrulewidth { } { 0 pt }
+%    \end{macrocode}
+%
+% \begin{macro}{\cleardoublepage}
+% 重定义 \tn{cleardoublepage},使得偶数页面在没有内容时也不显示页眉页脚,见
+% \url{https://tex.stackexchange.com/a/1683}。最后清空中间页眉,确保正文部分
+% 页眉显示正确。
+%    \begin{macrocode}
+\RenewDocumentCommand \cleardoublepage { }
+  {
+    \clearpage
+    \bool_if:NT \g_@@_twoside_bool
+      {
+        \int_if_odd:nF \c at 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}
+%
+% \begin{macro}{\frontmatter,\mainmatter}
+% 重定义 \tn{frontmatter}和\tn{frontmatter},
+% 以根据学校要求定制摘要、目录、主要符号对照表等前置部分的页眉页脚。
+%    \begin{macrocode}
+\cs_gset_eq:NN \nwafuhead\fancyhead
+\cs_gset_eq:NN \nwafufoot\fancyfoot
+%    \end{macrocode}
+% 重定义 \tn{frontmatter},带星号的命令不会启用\cs{cleardoublepage}。
+%    \begin{macrocode}
+\RenewDocumentCommand{\frontmatter}{sO{Roman}}
+  {
+%    \end{macrocode}
+% 判断是否有*号参数
+%    \begin{macrocode}
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmatterfalse
+%    \end{macrocode}
+% 页码格式
+%    \begin{macrocode}
+    \pagenumbering{#2}
+%    \end{macrocode}
+% 双面模式
+%    \begin{macrocode}
+    \bool_if:NTF \g_@@_twoside_bool
+      {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+          {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{
+                \c_@@_name_simp_tl \clist_item:Nn
+                \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+              }
+          }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{ \leftmark } }
+          }
+      }{
+%    \end{macrocode}
+% 单面模式,奇偶页设成一样
+%    \begin{macrocode}
+        \nwafuhead [ C ]
+          {
+            \small \nouppercase { \l_@@_header_center_mark_tl }
+          }
+      }
+    \nwafufoot[C]{\small\thepage}
+  }
+%    \end{macrocode}
+% 重定义 \tn{mainmatter},带星号的命令不会启用\cs{cleardoublepage}。
+%    \begin{macrocode}
+\RenewDocumentCommand{\mainmatter}{s}
+  {
+%    \end{macrocode}
+% 判断是否有*号参数
+%    \begin{macrocode}
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmattertrue
+%    \end{macrocode}
+% 页码格式
+%    \begin{macrocode}
+    \pagenumbering{arabic}
+%    \end{macrocode}
+% 双面模式
+%    \begin{macrocode}
+    \bool_if:NTF \g_@@_twoside_bool
+      {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+          {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{
+                \c_@@_name_simp_tl \clist_item:Nn
+                \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+              }
+          }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{ \l__@@_info_title_tl } }
+          }
+      }{
+%    \end{macrocode}
+% 单面模式,奇偶页设成一样
+%    \begin{macrocode}
+        \nwafuhead [ C ]
+          {
+            \int_if_odd:nTF \c at page
+              {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+                \small \nouppercase{ \leftmark }
+              }{
+                \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+                  {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{
+                        \c_@@_name_simp_tl \clist_item:Nn
+                        \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+                  }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{ \l__@@_info_title_tl }
+                  }
+              }
+          }
+      }
+    \int_compare:nNnTF{ \g_@@_thesis_type_int } < { 3 }
+      {
+%    \end{macrocode}
+% 研究生页脚
+%    \begin{macrocode}
+        \nwafufoot[C]{\small\thepage}
+      }{
+%    \end{macrocode}
+% 本科生页脚
+%    \begin{macrocode}
+        \nwafufoot[C]{\small-\ \thepage\ -}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibmatter}
+% 新定义 \cs{bibmatter},以根据学校要求定制参考文献页眉页脚。
+%    \begin{macrocode}
+\NewDocumentCommand{\bibmatter}{s}
+  {
+%    \end{macrocode}
+% 判断是否有*号参数
+%    \begin{macrocode}
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmattertrue
+%    \end{macrocode}
+% 是否为双面排版
+%    \begin{macrocode}
+    \bool_if:NTF \g_@@_twoside_bool
+      {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+          {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{
+                \c_@@_name_simp_tl \clist_item:Nn
+                \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+              }
+          }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{ \leftmark } }
+          }
+      }{
+%    \end{macrocode}
+% 单面排版
+%    \begin{macrocode}
+        \nwafuhead [ C ]
+          {
+            \int_if_odd:nTF \c at page
+              {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+                \small \nouppercase{ \leftmark }
+              }{
+                \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+                  {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{
+                        \c_@@_name_simp_tl \clist_item:Nn
+                        \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+                  }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{ \leftmark }
+                  }
+              }
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\appendix,\backmatter}
+% 为 \cs{appendix}和\cs{backmatter}命令追加代码,
+% 以根据学校要求定制附录及后置(致谢、个人简历等)页眉页脚。
+%    \begin{macrocode}
+\@@_appto_cmd:Nn \appendix
+  {
+    \clearpage
+    \bool_if:NTF \g_@@_twoside_bool
+%    \end{macrocode}
+% 双面
+%    \begin{macrocode}
+      {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+        \nwafuhead[OC]{\small \nouppercase{ \@chapapp } }
+        \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+          {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{
+                \c_@@_name_simp_tl \clist_item:Nn
+                \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+              }
+          }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{ \@chapapp } }
+          }
+      }{
+%    \end{macrocode}
+% 单面
+%    \begin{macrocode}
+        \nwafuhead [ C ]
+          {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+            \int_if_odd:nTF \c at page
+              {
+                \small \nouppercase{ \@chapapp }
+              }{
+                \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+                  {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{
+                        \c_@@_name_simp_tl \clist_item:Nn
+                        \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+                  }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{ \@chapapp }
+                  }
+              }
+          }
+      }
+  }
+
+\@@_appto_cmd:Nn \backmatter
+  {
+    \clearpage
+    \bool_if:NTF \g_@@_twoside_bool
+      {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+          {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{
+                \c_@@_name_simp_tl \clist_item:Nn
+                \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+              }
+          }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+            \nwafuhead[EC]{\small \nouppercase{ \leftmark } }
+          }
+      }{
+%    \end{macrocode}
+% 单面
+%    \begin{macrocode}
+        \nwafuhead [ C ]
+          {
+            \int_if_odd:nTF \c at page
+              {
+%    \end{macrocode}
+% 奇数页页眉
+%    \begin{macrocode}
+                \small \nouppercase{ \leftmark }
+              }{
+                \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+                  {
+%    \end{macrocode}
+% 研究生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{
+                        \c_@@_name_simp_tl \clist_item:Nn
+                        \c_@@_thesis_type_clist { \g_@@_thesis_type_int } }
+                  }{
+%    \end{macrocode}
+% 本科生偶数页页眉
+%    \begin{macrocode}
+                    \small \nouppercase{ \leftmark }
+                  }
+              }
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{章节标题设置}
+%
+% |\keys_set:nn{ctex}| 实际相当于 \cs{ctexset}。
+%
+% 设置章(chapter)、节(section)与小节(sub-section)标题样式。
+% 此处使用 \kvopt{fixskip}{true} 选项来抑制前后的多余间距。
+%
+% 设置标题级别
+%    \begin{macrocode}
+\int_compare:nNnTF{ \g_@@_thesis_type_int } < { 3 }
+  {
+%    \end{macrocode}
+% 研究生
+%    \begin{macrocode}
+    \keys_set:nn { ctex }
+      {
+        secnumdepth = 3,
+        chapter =
+          {
+            pagestyle   = fancy,
+            aftername   = \hspace*{1.0\ccwd},
+            format      = \zihao{3} \normalfont \nwafu at hei \bfseries \centering,
+            beforeskip  = 1.47\baselineskip,
+            afterskip   = 1.24\baselineskip,
+            number      = \@@_arabic:n { chapter },
+            fixskip     = true
+          },
+        section =
+          {
+            format      = \zihao{-3} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 1.09\baselineskip,
+            afterskip   = 0.80\baselineskip,
+            fixskip     = true
+          },
+        subsection =
+          {
+            format      = \zihao{4} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 0.80\baselineskip,
+            fixskip     = true
+          },
+        subsubsection =
+          {
+            format      = \zihao{-4} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 0.40\baselineskip,
+            afterskip   = 0.40\baselineskip,
+            fixskip     = true
+          }
+      }
+  }{
+%    \end{macrocode}
+% 本科生
+%    \begin{macrocode}
+    \keys_set:nn { ctex }
+      {
+        secnumdepth = 3,
+        chapter =
+          {
+            pagestyle   = fancy,
+            name = { \bool_if:NT \l_@@_withchap_bool {第},
+                     \bool_if:NT \l_@@_withchap_bool {章} },
+            number      = \@@_arabic:n { chapter },
+            aftername   = \hspace*{\ccwd},
+            format      = \zihao{3} \normalfont \nwafu at hei \bfseries \centering,
+            beforeskip  = 0.25\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true
+          },
+        section =
+          {
+            aftername   = \hspace*{0.5\ccwd},
+            format      = \zihao{4} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 0.60\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true,
+            afterindent = true,
+          },
+        subsection =
+          {
+            aftername   = \hspace*{0.5\ccwd},
+            format      = \zihao{-4} \normalfont \nwafu at hei \bfseries,
+            beforeskip  = 0.60\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true,
+            afterindent = true,
+            % indent      = 2\ccwd,
+          },
+        subsubsection =
+          {
+            name        = {(,)},
+            aftername   = \hspace*{0.5\ccwd},
+            number      = \@@_arabic:n { subsubsection },
+            format      = \zihao{-4} \normalfont,
+            beforeskip  = 0.60\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true,
+            % afterindent = true,
+            indent      = 2\ccwd,
+          }
+      }
+  }
+%    \end{macrocode}
+%
+%
+% \begin{macro}{\@@_chapter:n,\@@_chapter:V}
+% 手动生成章的标题,用于摘要、参考文献等。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_chapter:n #1
+  {
+    \group_begin:
+      \ctexset { chapter / numbering = false }
+      \chapter {#1}
+      \@@_chapter_header:n {#1}
+    \group_end:
+  }
+\cs_generate_variant:Nn \@@_chapter:n { V }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_chapter_no_toc:n,\@@_chapter_no_toc:V}
+% 目录自身不出现在目录中,需特别处理。参考
+% \url{https://tex.stackexchange.com/a/1821}。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_chapter_no_toc:n #1
+  {
+    \chapter *           {#1}
+    \@@_chapter_header:n {#1}
+    \pdfbookmark [0] {#1} { toc }
+  }
+\cs_generate_variant:Nn \@@_chapter_no_toc:n { V }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_chapter_header:n}
+% 单页模式下,目录、摘要、符号表等的页眉中间为相应标题,左右为空。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_chapter_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}
+%
+% \subsection{脚注}
+%
+% \emph{脚注部分的代码完全使用\cls{fduthesis}模板的代码}。
+%
+% \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 { nwafu / 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}
+% 若使用 \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}
+% 重定义脚注编号。
+%    \begin{macrocode}
+\cs_set:Npn \thefootnote { \nwafu_footnote_number:N \c at footnote }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nwafu_footnote_number:N}
+% 脚注编号样式。
+%    \begin{macrocode}
+\cs_new:Npn \nwafu_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 { \g_@@_font_name_libertinus_serif_tl .otf }
+            \@@_fn_symbol_libertinus:n {#1}
+          }
+        \c_@@_fn_style_libertinus_neg_tl
+          {
+            \fontspec { \g_@@_font_name_libertinus_serif_tl .otf }
+            \@@_fn_symbol_libertinus_neg:n {#1}
+          }
+        \c_@@_fn_style_libertinus_sans_tl
+          {
+            \fontspec { \g_@@_font_name_libertinus_sans_tl .otf }
+            \@@_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 { \g_@@_font_name_xits_tl .otf }
+            \@@_fn_symbol_xits:n {#1}
+          }
+        \c_@@_fn_style_xits_sans_tl
+          {
+            \fontspec { \g_@@_font_name_xits_tl .otf }
+            \@@_fn_symbol_xits_sans:n {#1}
+          }
+        \c_@@_fn_style_xits_sans_neg_tl
+          {
+            \fontspec { \g_@@_font_name_xits_tl .otf }
+            \@@_fn_symbol_xits_sans_neg:n {#1}
+          }
+      }
+%    \end{macrocode}
+% 变量 \cs{l_@@_fn_style_tl} 保存的类型未知时,默认使用 \opt{plain}
+% 类型。
+%    \begin{macrocode}
+      { \int_use:N #1 }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{整体样式}
+%
+% \begin{macro}[int]{\@makefntext}
+% 重定义内部脚注文字命令,使脚注编号不使用上标,宽度为 \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{定理环境}
+%
+% \emph{定理环境部分的代码完全使用\cls{fduthesis}模板的代码}。
+%
+% \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}
+% 定义 |nwafu/theorem| 键值类。
+%    \begin{macrocode}
+\keys_define:nn { nwafu / 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}
+%
+%
+% \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}
+% 处理可选参数。利用 |nwafu/theorem| 键值对设置,并按此修改证毕符号、
+% 定理头字体和定理正文字体。
+%    \begin{macrocode}
+    \IfValueT {#2} { \keys_set:nn { nwafu / theorem } {#2} }
+    \nwafu_thm_set_header_font:V \l_@@_thm_header_font_tl
+    \nwafu_thm_set_body_font:V   \l_@@_thm_body_font_tl
+    \nwafu_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 }
+        \nwafu_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 }
+          }
+        \nwafu_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}{\nwafu_thm_new:nnnn,\nwafu_thm_new:VVxx}
+% 带编号的定理环境。
+% \begin{arguments}
+%   \item 样式
+%   \item 计数器
+%   \item 定理环境名称
+%   \item 定理头文字
+% \end{arguments}
+%    \begin{macrocode}
+\cs_new:Npn \nwafu_thm_new:nnnn #1#2#3#4
+  {
+    \@@_thm_ntheorem_style:n {#1}
+    \@@_thm_ntheorem_new:w   {#3} {#4} [#2]
+  }
+\cs_generate_variant:Nn \nwafu_thm_new:nnnn { VVxx }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nwafu_thm_new_no_number:nnn,
+%   \nwafu_thm_new_no_number:Vxx}
+% 不带编号的定理环境。
+% \begin{arguments}
+%   \item 样式
+%   \item 定理环境名称
+%   \item 定理头文字
+% \end{arguments}
+%    \begin{macrocode}
+\cs_new:Npn \nwafu_thm_new_no_number:nnn #1#2#3
+  {
+    \@@_thm_ntheorem_style:n {#1}
+    \@@_thm_ntheorem_new:w   {#2} {#3}
+  }
+\cs_generate_variant:Nn \nwafu_thm_new_no_number:nnn { Vxx }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nwafu_thm_set_qed:n,
+%   \nwafu_thm_set_header_font:n,
+%   \nwafu_thm_set_body_font:n,
+%   \nwafu_thm_set_qed:V,
+%   \nwafu_thm_set_header_font:V,
+%   \nwafu_thm_set_body_font:V}
+% 封装 \pkg{ntheorem} 宏包提供的若干命令,分别用以设置证毕符号、
+% 定理头字体和定理正文字体。
+%    \begin{macrocode}
+\cs_new:Npn \nwafu_thm_set_qed:n         #1 { \theoremsymbol     {#1} }
+\cs_new:Npn \nwafu_thm_set_header_font:n #1 { \theoremheaderfont {#1} }
+\cs_new:Npn \nwafu_thm_set_body_font:n   #1 { \theorembodyfont   {#1} }
+\cs_generate_variant:Nn \nwafu_thm_set_qed:n         { V }
+\cs_generate_variant:Nn \nwafu_thm_set_header_font:n { V }
+\cs_generate_variant:Nn \nwafu_thm_set_body_font:n   { V }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{图表绘制;浮动体}
+%
+%
+% 分别设置浮动体 \env{figure} 和 \env{table} 的标题样式。
+%    \begin{macrocode}
+\DeclareCaptionLabelSeparator{ccwd}{\hspace{0.5\ccwd}}
+\DeclareCaptionLabelFormat{parens}{\bothIfFirst{#1}{~}(#2)}
+\DeclareCaptionFont{nwafu at table@font}{\sffamily\small}
+\DeclareCaptionFont{nwafu at figure@font}{\sffamily\small}
+\DeclareCaptionFont{nwafu at subtable@font}{\small}
+\DeclareCaptionFont{nwafu at subfigure@font}{\small}
+%    \end{macrocode}
+% 图表题注设置。
+%    \begin{macrocode}
+\captionsetup
+  {
+    format          = hang,
+    font            = {stretch = 1},
+    labelsep        = ccwd,
+    singlelinecheck = true,
+    skip=4bp,
+  }
+%    \end{macrocode}
+% 图表题注字体设置。
+%    \begin{macrocode}
+\captionsetup[table]{font += nwafu at table@font}
+\captionsetup[longtable]{font += nwafu at table@font}
+\captionsetup[figure]{font += nwafu at figure@font}
+%    \end{macrocode}
+% 子图题注设置。
+%    \begin{macrocode}
+\captionsetup[subfigure]
+  {
+    labelformat = parens,
+    font       = nwafu at subfigure@font,
+    belowskip   = 2pt,
+    aboveskip   = 6pt
+  }
+%    \end{macrocode}
+% 设置双语标题前缀
+% 直接采用类似\cs{captionsetup}[figure][bi-first]{name=图}
+% 设置会与longtable宏包的caption冲突
+% 需要改成如下设置,[]中的可选参数可以根据需要选择
+%    \begin{macrocode}
+\DeclareCaptionOption{bi-first}[format=hang,hangindent=-0.5em]{
+    \def\tablename{表}
+    \def\figurename{图}
+  }
+\DeclareCaptionOption{bi-second}[format=hang,hangindent=-2em]{
+    \def\tablename{Tab.}
+    \def\figurename{Fig.}
+  }
+\captionsetup[bi-first]{bi-first}
+\captionsetup[bi-second]{bi-second}
+%
+\AddToHook
+  { env/figure/end }
+  {
+    \centering
+  }
+\AddToHook
+  { env/table/end }
+  {
+    \centering
+  }
+%
+%    \end{macrocode}
+% 在tabular、tabularx、longtable环境开始处添加代码,
+% 设置表格行距和字号。
+%    \begin{macrocode}
+\@@_at_begin_environment:nn { tabular,tabularx,longtable,tblr }
+  {
+    \exp_args:Nx \linespread { 1.05 }
+    \small\selectfont\ignorespaces
+  }
+%    \end{macrocode}
+%
+% \begin{macro}{\thefigure,\thetable}
+% 重定义图表编号。
+%    \begin{macrocode}
+\cs_set:Npn \thefigure
+  { \thechapter - \@@_arabic:n { figure } }
+\cs_set:Npn \thetable
+  { \thechapter - \@@_arabic:n { table  } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{封面}
+%
+% \subsubsection{信息录入}
+%
+% \begin{variable}{\l_@@_info_title_tl,
+%   \l_@@_info_date_tl,
+%   \l_@@_info_grade_tl,
+%   \l_@@_info_enroll_tl,
+%   \l_@@_info_author_tl,
+%   \l_@@_info_supervisor_tl,
+%   \l_@@_info_cosupervisor_tl,
+%   \l_@@_info_department_tl,
+%   \l_@@_info_major_tl,
+%   \l_@@_info_researchfield_tl,
+%   \l_@@_info_professionaltype_tl,
+%   \l_@@_info_professionalfield_tl,
+%   \l_@@_info_class_id_tl,
+%   \l_@@_info_student_id_tl,
+%   \l_@@_info_school_id_tl,
+%   \l_@@_info_clc_tl,
+%   \l_@@_info_defensedate_tl,
+%   \l_@@_info_instructors_clist,
+%   \l_@@_info_defensecommittees_clist,
+%   \l_@@_info_foundation_clist}
+% 封面所需的一些字段。
+%    \begin{macrocode}
+\clist_map_inline:nn
+  {
+    title, date, grade, enroll, author, supervisor, cosupervisor
+    department, major, researchfield, professionaltype, professionalfield,
+    class_id, student_id, school_id, clc, defensedate, udc
+  }
+  { \tl_new:c { l_@@_info_ #1 _tl } }
+\clist_new:N \l_@@_info_instructors_clist
+\clist_new:N \l_@@_info_defensecommittees_clist
+\clist_new:N \l_@@_info_foundation_clist
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_info_title_en_tl,
+%   \l_@@_info_author_en_tl,
+%   \l_@@_info_supervisor_en_tl,
+%   \l_@@_info_cosupervisor_en_tl,
+%   \l_@@_info_department_en_tl,
+%   \l_@@_info_major_en_tl,
+%   \l_@@_info_mastertype_en_tl,
+%   \l_@@_info_researchfield_en_tl,
+%   \l_@@_info_professionaltype_en_tl,
+%   \l_@@_info_professionalfield_en_tl,
+%   \l_@@_info_date_en_tl}
+% 对应的英文字段。
+%    \begin{macrocode}
+\clist_map_inline:nn
+  { title, author, supervisor, cosupervisor, department,
+    major, mastertype, researchfield, professionaltype, professionalfield,date }
+  { \tl_new:c { l_@@_info_ #1 _en_tl } }
+%    \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}
+%
+% \begin{variable}{\l_@@_info_bachelor_type_int}
+% 本科毕业类型。1 为论文,2 为设计。仅对本科生有效。
+%    \begin{macrocode}
+\int_new:N \l_@@_info_bachelor_type_int
+%    \end{macrocode}
+% \end{variable}
+%
+% 定义 |nwafu/info| 键值类。
+%    \begin{macrocode}
+\keys_define:nn { nwafu / info }
+  {
+%    \end{macrocode}
+%
+% \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/btype}
+% 本科毕业类型。仅对本科生有效。
+%    \begin{macrocode}
+    btype      .choice:,
+    btype      .value_required:n = true,
+    btype      .choices:nn  =
+      { paper, design }
+      { \int_set_eq:NN \l_@@_info_bachelor_type_int \l_keys_choice_int },
+    btype      .initial:n = paper,
+%    \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, info/date*}
+% 论文完成日期。
+%    \begin{macrocode}
+    date        .tl_set:N    = \l_@@_info_date_tl,
+    date*       .tl_set:N    = \l_@@_info_date_en_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/grade}
+% 毕业年份(届)。
+%    \begin{macrocode}
+    grade        .tl_set:N    = \l_@@_info_grade_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/enroll}
+% 入学年份(级)。
+%    \begin{macrocode}
+    enroll        .tl_set:N    = \l_@@_info_enroll_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/cosupervisor, info/cosupervisor}
+% 协助指导教师。
+%    \begin{macrocode}
+    cosupervisor        .tl_set:N    = \l_@@_info_cosupervisor_tl,
+    cosupervisor*       .tl_set:N    = \l_@@_info_cosupervisor_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/defensecommittees}
+% 答辩委员会成员,每个成员包含单位、姓名、职称。仅研究生需要。
+%    \begin{macrocode}
+    defensecommittees .clist_set:N = \l_@@_info_defensecommittees_clist,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/defensedate}
+% 论文答辩日期。
+%    \begin{macrocode}
+    defensedate        .tl_set:N    = \l_@@_info_defensedate_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/foundation}
+% 资助项目,每个项目包含项目类型、项目名称、项目编号。仅研究生需要。
+%    \begin{macrocode}
+    foundation .clist_set:N = \l_@@_info_foundation_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/mastertype}
+% 硕士学位类型英文名称,仅硕士需要。
+%    \begin{macrocode}
+    mastertype .tl_set:N    = \l_@@_info_mastertype_en_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/researchfield,info/researchfield*}
+% 研究方向,仅博士、学历硕士需要。
+%    \begin{macrocode}
+    researchfield  .tl_set:N    = \l_@@_info_researchfield_tl,
+    researchfield* .tl_set:N    = \l_@@_info_researchfield_en_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/professionaltype,info/professionaltype*}
+% 专业学位类型,仅专业学位硕士需要。
+%    \begin{macrocode}
+    professionaltype  .tl_set:N    = \l_@@_info_professionaltype_tl,
+    professionaltype* .tl_set:N    = \l_@@_info_professionaltype_en_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/professionalfield,info/professionalfield*}
+% 领域名称,仅专业学位硕士需要。
+%    \begin{macrocode}
+    professionalfield  .tl_set:N    = \l_@@_info_professionalfield_tl,
+    professionalfield* .tl_set:N    = \l_@@_info_professionalfield_en_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/class-id}
+% 班级号。仅本科生需要
+%    \begin{macrocode}
+    class-id  .tl_set:N    = \l_@@_info_class_id_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/clc}
+% 中图分类号。
+%    \begin{macrocode}
+    clc         .tl_set:N    = \l_@@_info_clc_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/udc}
+% UDC码。
+%    \begin{macrocode}
+    udc         .tl_set:N    = \l_@@_info_udc_tl,
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \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 { nwafu / style }
+  {
+    logo      .tl_set:N    = \l_@@_cover_logo_tl,
+    logo-size .clist_set:N = \l_@@_cover_logo_size_clist
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{密级}
+%
+% \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 { nwafu / info }
+  {
+%    \end{macrocode}
+%
+% \begin{macro}{info/secret-level}
+  % 密级。\opt{none} 表示公开,\opt{i}、\opt{ii}、\opt{iii}、\opt{iv} 分别为
+% 限制、秘密、机密、绝密。
+%    \begin{macrocode}
+    secret-level .choices:nn  =
+      { none, i, ii, iii, iv }
+      {
+        \int_compare:nNnTF { \l_keys_choice_int } > { 1 }
+          {
+            \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
+            \tl_set:Nn \l_@@_info_secret_level_tl { 公开 }
+          }
+      },
+    secret-level .value_required:n = true,
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{定义内部函数}
+%
+% \begin{macro}{\@@_spread_box:nn,\@@_spread_box:Vn,\@@_spread_box:nV}
+% 分散对齐的水平盒子。
+% \begin{arguments}
+%   \item 宽度
+%   \item 内容
+% \end{arguments}
+% 利用 \cs{tl_map_inline:nn} 在字符间插入 \tn{hfil};紧随其后的 \tn{unskip}
+% 将会去掉最后一个 \tn{hfil}。见 \url{https://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 }
+  }
+\cs_generate_variant:Nn \@@_spread_box:nn  { Vn }
+\cs_generate_variant:Nn \@@_spread_box:nn  { nV }
+%    \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:
+    \dim_set:Nn \l_@@_tmpt_dim {#1}
+    \dim_add:Nn \l_@@_tmpt_dim {0.6em}
+    \makebox[0cm][l]{\rule[-0.5ex]{\l_@@_tmpt_dim}{0.4 pt}}
+      {\hbox_to_wd:nn {\l_@@_tmpt_dim} { \hfil #2 \hfil }}
+    % \fbox[b]{\parbox {#1} { \centering #2 }}
+  }
+\cs_generate_variant:Nn \@@_center_box:nn  { Vn }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_fixed_width_box:nn,\@@_fixed_width_box:Vn}
+% 限宽盒子(允许换行)。
+%    \begin{macrocode}
+\cs_new:Npn \@@_fixed_width_box:nn #1#2
+  { \parbox {#1} {#2} }
+\cs_generate_variant:Nn \@@_fixed_width_box:nn  { Vn }
+%    \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}
+% 获取多个文本中的最大宽度,并存入 |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:
+      \dim_set:Nn #1 {-999pt}
+      \clist_set_eq:NN \l_@@_tmpt_clist #2
+      \bool_until_do:nn { \clist_if_empty_p:N \l_@@_tmpt_clist }
+        {
+          \clist_pop:NN \l_@@_tmpt_clist \l_@@_tmpt_tl
+          \@@_get_text_width:NV \l_@@_tmpt_dim \l_@@_tmpt_tl
+          \dim_gset:Nn #1 { \dim_max:nn {#1} { \l_@@_tmpt_dim } }
+        }
+    \group_end:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_blank_underline:n}
+% 下划线占位符。|#1|: 长度。
+%    \begin{macrocode}
+\cs_new:Npn \@@_blank_underline:n #1
+  { \rule [ -0.5 ex ] {#1} { 0.4 pt } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_text_uline:n,\@@_text_uline:V}
+% 下划线文字。|#1|: 文字。
+%    \begin{macrocode}
+\cs_new:Npn \@@_text_uline:n #1
+  {
+    \@@_get_text_width:Nn \l_@@_tmpt_dim {#1}
+    \dim_add:Nn \l_@@_tmpt_dim {0.6em}
+    \makebox[0cm][l]{\rule[-0.5ex]{\l_@@_tmpt_dim}{0.4 pt}} 
+      \rule{.3em}{0cm}#1\rule{.3em}{0cm}
+  }
+\cs_generate_variant:Nn \@@_text_uline:n { V }
+%    \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{封面各部件}
+%
+% \begin{macro}{\@@_cover_id:,\@@_cover_id_aux:n}
+% 封面中的中图分类号、udc码、密级、学校代码和学号。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_id:
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+%    \end{macrocode}
+% 研究生
+%    \begin{macrocode}
+        \group_begin:
+%    \end{macrocode}
+% 将中图分类号、udc码和密级标记名称存入逗号分隔列表,并计算最宽宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+        \clist_clear:N \l_@@_tmpa_clist
+        \clist_set:Nx \l_@@_tmpa_clist
+          {
+            { \c_@@_name_clc_tl          },
+            { \c_@@_name_udc_tl          },
+            { \c_@@_name_secret_level_tl }
+          }
+        \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 将中图分类号、udc码和密级信息值存入逗号分隔列表,并计算最宽宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+        \clist_set:Nx \l_@@_tmpb_clist
+          {
+            { \l_@@_info_clc_tl              },
+            { \l_@@_info_udc_tl              },
+            { \l_@@_info_secret_level_tl     }
+          }
+        \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+%    \end{macrocode}
+% 将学校代码、研究生学号标记名称存入逗号分隔列表,并计算最宽宽度赋给
+% \cs{l_@@_tmpc_dim}。
+%    \begin{macrocode}
+        \clist_set:Nx \l_@@_tmpc_clist
+          {
+            { \c_@@_name_school_id_tl         },
+            {                                 },
+            { \c_@@_name_student_id_tl        }
+          }
+        \@@_get_max_text_width:NN \l_@@_tmpc_dim \l_@@_tmpc_clist
+%    \end{macrocode}
+% 将学校代码、研究生学号信息值存入逗号分隔列表,并计算最宽宽度赋给
+% \cs{l_@@_tmpd_dim}。
+%    \begin{macrocode}
+        \clist_set:Nx \l_@@_tmpd_clist
+          {
+            { \l_@@_info_school_id_tl              },
+            {                                      },
+            { \l_@@_info_student_id_tl             }
+          }
+        \@@_get_max_text_width:NN \l_@@_tmpd_dim \l_@@_tmpd_clist
+%    \end{macrocode}
+% 用minipage环境通过循环输出结果。
+%    \begin{macrocode}
+        \begin{minipage} [ c ] { \textwidth }
+        \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
+            \clist_pop:NN \l_@@_tmpc_clist \l_@@_tmpc_tl
+            \clist_pop:NN \l_@@_tmpd_clist \l_@@_tmpd_tl
+%    \end{macrocode}
+% udc码标记需要左对齐。
+%    \begin{macrocode}
+            \tl_if_eq:NNTF \l_@@_tmpa_tl \c_@@_name_udc_tl
+              {
+                \@@_fixed_width_box:Vn \l_@@_tmpa_dim { \l_@@_tmpa_tl }
+              }{
+                \@@_spread_box:Vn \l_@@_tmpa_dim { \l_@@_tmpa_tl }
+              }
+            \c_@@_fwid_colon_tl
+            \@@_center_box:Vn \l_@@_tmpb_dim { \l_@@_tmpb_tl }
+            \hfill
+%    \end{macrocode}
+% 用空值占有一行。
+%    \begin{macrocode}
+            \tl_if_empty:NTF \l_@@_tmpc_tl
+              {
+              }{
+                \@@_spread_box:Vn \l_@@_tmpc_dim { \l_@@_tmpc_tl }
+                \c_@@_fwid_colon_tl
+                \@@_center_box:Vn \l_@@_tmpd_dim { \l_@@_tmpd_tl }
+              }
+            \par
+          }
+        \end{minipage}
+        \group_end:
+      }
+      {
+%    \end{macrocode}
+% 本科生。
+%    \begin{macrocode}
+        \@@_fixed_width_box:nn { 120 pt }
+          {
+            \@@_cover_id_aux:n { student_id }
+          }
+      }
+  }
+\cs_new:Npn \@@_cover_id_aux:n #1
+  {
+    \tl_use:c { c_@@_name_ #1 _tl }
+    \c_@@_fwid_colon_tl
+    \@@_text_uline:n {\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
+      {
+%    \end{macrocode}
+% 取出论文类型。
+%    \begin{macrocode}
+        \clist_item:Nn \c_@@_thesis_type_clist { \g_@@_thesis_type_int }
+      }
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+%    \end{macrocode}
+% 研究生论文。
+%    \begin{macrocode}
+        \@@_spread_box:nn { 0.75 \textwidth } { \l_@@_tmpa_tl }
+      }{
+%    \end{macrocode}
+% 本科毕业年份(届)。
+%    \begin{macrocode}
+        \@@_get_text_width:NV \l__@@_tmpa_dim \l__@@_info_grade_tl
+        \@@_center_box:Vn \l__@@_tmpa_dim { \l__@@_info_grade_tl }
+        \@@_spread_box:nn { 0.50 \textwidth }{
+            届
+            \l_@@_tmpa_tl
+%    \end{macrocode}
+% 本科的论文或设计。
+%    \begin{macrocode}
+            \clist_item:Nn \c__@@_bachelor_type_clist { \l__@@_info_bachelor_type_int }
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_info:}
+% 作者信息栏。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_info:
+  {
+    \begin{minipage} [ c ] { \textwidth }
+      \centering
+%    \end{macrocode}
+% 根据论文类型(博士、硕士、本科)分支输出不同信息
+%    \begin{macrocode}
+      \int_case:nn {\g_@@_thesis_type_int}
+        {
+%    \end{macrocode}
+% 博士论文
+%    \begin{macrocode}
+          {1}{
+%    \end{macrocode}
+% 读取左侧作者信息标识名称字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+            \clist_set:Nx \l_@@_tmpa_clist
+              {
+                \c_@@_name_major_tl,
+                \c_@@_name_researchfield_tl,
+                \c_@@_name_author_tl,
+                \c_@@_name_supervisor_tl,
+                \c_@@_name_cosupervisor_tl,
+                \c_@@_name_date_tl,
+              }
+            \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 读取右侧作者信息各栏字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+            \clist_set:Nx \l_@@_tmpb_clist
+              {
+                { \l_@@_info_major_tl              },
+                { \l_@@_info_researchfield_tl      },
+                { \l_@@_info_author_tl             },
+                { \l_@@_info_supervisor_tl         },
+                { \l_@@_info_cosupervisor_tl       },
+                { \l_@@_info_date_tl               }
+              }
+            \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+          }
+%    \end{macrocode}
+% 硕士论文
+%    \begin{macrocode}
+          {2}{
+            \int_case:nn {\l_@@_info_degree_type_int}
+            {
+%    \end{macrocode}
+% 学术硕士
+%    \begin{macrocode}
+              {1}{
+%    \end{macrocode}
+% 读取左侧作者信息标识名称字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+                \clist_set:Nx \l_@@_tmpa_clist
+                  {
+                    \c_@@_name_major_tl,
+                    \c_@@_name_researchfield_tl,
+                    \c_@@_name_author_tl,
+                    \c_@@_name_supervisor_tl,
+                    \c_@@_name_cosupervisor_tl,
+                    \c_@@_name_date_tl,
+                  }
+                \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 读取右侧作者信息各栏字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+                \clist_set:Nx \l_@@_tmpb_clist
+                  {
+                    { \l_@@_info_major_tl              },
+                    { \l_@@_info_researchfield_tl      },
+                    { \l_@@_info_author_tl             },
+                    { \l_@@_info_supervisor_tl         },
+                    { \l_@@_info_cosupervisor_tl       },
+                    { \l_@@_info_date_tl               }
+                  }
+                \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+              }
+%    \end{macrocode}
+% 专业学位硕士
+%    \begin{macrocode}
+              {2}{
+%    \end{macrocode}
+% 读取左侧作者信息标识名称字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+                \clist_set:Nx \l_@@_tmpa_clist
+                  {
+                    \c_@@_name_professionaltype_tl,
+                    \c_@@_name_professionalfield_tl,
+                    \c_@@_name_author_tl,
+                    \c_@@_name_supervisor_tl,
+                    \c_@@_name_cosupervisor_tl,
+                    \c_@@_name_date_tl,
+                  }
+                \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 读取右侧作者信息各栏字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+                \clist_set:Nx \l_@@_tmpb_clist
+                  {
+                    { \l_@@_info_professionaltype_tl   },
+                    { \l_@@_info_professionalfield_tl  },
+                    { \l_@@_info_author_tl             },
+                    { \l_@@_info_supervisor_tl         },
+                    { \l_@@_info_cosupervisor_tl       },
+                    { \l_@@_info_date_tl               }
+                  }
+                \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+              }
+            }
+          }
+%    \end{macrocode}
+% 本科论文
+%    \begin{macrocode}
+          {3}{
+%    \end{macrocode}
+% 读取左侧作者信息标识名称字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+            \clist_set:Nx \l_@@_tmpa_clist
+              {
+                \c_@@_name_department_tl,
+                \c_@@_name_major_tl,
+                \c_@@_name_enroll_tl\c_@@_name_class_id_tl,
+                \c_@@_name_author_tl,
+                \c_@@_name_supervisor_tl,
+                \c_@@_name_cosupervisor_tl,
+                \c_@@_name_date_tl,
+              }
+            \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 读取右侧作者信息各栏字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+            \clist_set:Nx \l_@@_tmpb_clist
+              {
+                { \l_@@_info_department_tl                          },
+                { \l_@@_info_major_tl                               },
+                { \l_@@_info_enroll_tl 级 \l_@@_info_class_id_tl 班 },
+                { \l_@@_info_author_tl                              },
+                { \l_@@_info_supervisor_tl                          },
+                { \l_@@_info_cosupervisor_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:Vn \l_@@_tmpa_dim { \l_@@_tmpa_tl }
+          \c_@@_fwid_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_info_en:}
+% 英文作者信息栏,仅对研究生有效。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_info_en:
+  {
+    \int_case:nn {\g_@@_thesis_type_int}
+      {
+        {1}{
+%    \end{macrocode}
+% 计算各标识名称和信息字段的总计宽度,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+          \clist_set:Nx \l_@@_tmpa_clist
+            {
+              {\c_@@_name_major_en_tl{\l_@@_info_major_en_tl}},
+              {\c_@@_name_researchfield_en_tl{\l_@@_info_researchfield_en_tl}},
+              {\c_@@_name_author_en_tl{\l_@@_info_author_en_tl}},
+              {\c_@@_name_supervisor_en_tl{\l_@@_info_supervisor_en_tl}},
+              {\c_@@_name_cosupervisor_en_tl{\l_@@_info_cosupervisor_en_tl}},
+              {\c_@@_name_date_en_tl{\l_@@_info_date_en_tl}},
+            }
+          \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 将宽度值适当放宽。
+%    \begin{macrocode}
+          \dim_add:Nn \l_@@_tmpa_dim {2.5em}
+          \begin{minipage} [ c ] { \l_@@_tmpa_dim }
+            \flushleft
+%    \end{macrocode}
+% 读取左侧作者信息标识名称字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+            \clist_set:Nx \l_@@_tmpa_clist
+              {
+                \c_@@_name_major_en_tl,
+                \c_@@_name_researchfield_en_tl,
+                \c_@@_name_author_en_tl,
+                \c_@@_name_supervisor_en_tl,
+                \c_@@_name_cosupervisor_en_tl,
+                \c_@@_name_date_en_tl,
+              }
+%    \end{macrocode}
+% 读取右侧作者信息各栏字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+            \clist_set:Nx \l_@@_tmpb_clist
+              {
+                { \l_@@_info_major_en_tl              },
+                { \l_@@_info_researchfield_en_tl      },
+                { \l_@@_info_author_en_tl             },
+                { \l_@@_info_supervisor_en_tl         },
+                { \l_@@_info_cosupervisor_en_tl       },
+                { \l_@@_info_date_en_tl               }
+              }
+%    \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
+                \l_@@_tmpa_tl
+                \c_@@_fwid_colon_tl
+                \l_@@_tmpb_tl
+                \skip_vertical:n { 1 ex }
+              }
+          \end{minipage}
+        }
+        {2}{
+          \int_case:nn {\l_@@_info_degree_type_int}
+            {
+%    \end{macrocode}
+% 学术硕士
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+              {1}{
+%    \end{macrocode}
+% 计算各标识名称和信息字段的总计宽度,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+                \clist_set:Nx \l_@@_tmpa_clist
+                  {
+                    {\c_@@_name_major_en_tl{\l_@@_info_major_en_tl}},
+                    {\c_@@_name_researchfield_en_tl{\l_@@_info_researchfield_en_tl}},
+                    {\c_@@_name_author_en_tl{\l_@@_info_author_en_tl}},
+                    {\c_@@_name_supervisor_en_tl{\l_@@_info_supervisor_en_tl}},
+                    {\c_@@_name_cosupervisor_en_tl{\l_@@_info_cosupervisor_en_tl}},
+                    {\c_@@_name_date_en_tl{\l_@@_info_date_en_tl}},
+                  }
+                \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 将宽度值适当放宽。
+%    \begin{macrocode}
+                \dim_add:Nn \l_@@_tmpa_dim {2.5em}
+                \begin{minipage} [ c ] { \l_@@_tmpa_dim }
+                  \flushleft
+%    \end{macrocode}
+% 读取左侧作者信息标识名称字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+                  \clist_set:Nx \l_@@_tmpa_clist
+                     {
+                       \c_@@_name_major_en_tl,
+                       \c_@@_name_researchfield_en_tl,
+                       \c_@@_name_author_en_tl,
+                       \c_@@_name_supervisor_en_tl,
+                       \c_@@_name_cosupervisor_en_tl,
+                       \c_@@_name_date_en_tl,
+                     }
+%    \end{macrocode}
+% 读取右侧作者信息各栏字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+                  \clist_set:Nx \l_@@_tmpb_clist
+                    {
+                      { \l_@@_info_major_en_tl              },
+                      { \l_@@_info_researchfield_en_tl      },
+                      { \l_@@_info_author_en_tl             },
+                      { \l_@@_info_supervisor_en_tl         },
+                      { \l_@@_info_cosupervisor_en_tl       },
+                      { \l_@@_info_date_en_tl               }
+                    }
+%    \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
+                      \l_@@_tmpa_tl
+                      \c_@@_fwid_colon_tl
+                      \l_@@_tmpb_tl
+                      \skip_vertical:n { 1 ex }
+                    }
+                \end{minipage}
+              }
+%    \end{macrocode}
+% 专业学位硕士。
+%    \begin{macrocode}
+              {2}{
+%    \end{macrocode}
+% 计算各标识名称和信息字段的总计宽度,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+                \clist_set:Nx \l_@@_tmpa_clist
+                  {
+                    {\c_@@_name_professionaltype_en_tl{Master~of~\l_@@_info_professionaltype_en_tl}},
+                    {\c_@@_name_professionalfield_en_tl{\l_@@_info_professionalfield_en_tl}},
+                    {\c_@@_name_author_en_tl{\l_@@_info_author_en_tl}},
+                    {\c_@@_name_supervisor_en_tl{\l_@@_info_supervisor_en_tl}},
+                    {\c_@@_name_cosupervisor_en_tl{\l_@@_info_cosupervisor_en_tl}},
+                    {\c_@@_name_date_en_tl{\l_@@_info_date_en_tl}},
+                  }
+                \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 将宽度值适当放宽。
+%    \begin{macrocode}
+                \dim_add:Nn \l_@@_tmpa_dim {2.5em}
+                \begin{minipage} [ c ] { \l_@@_tmpa_dim }
+                  \flushleft
+%    \end{macrocode}
+% 读取左侧作者信息标识名称字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpa_dim}。
+%    \begin{macrocode}
+                  \clist_set:Nx \l_@@_tmpa_clist
+                     {
+                       \c_@@_name_professionaltype_en_tl,
+                       \c_@@_name_professionalfield_en_tl,
+                       \c_@@_name_author_en_tl,
+                       \c_@@_name_supervisor_en_tl,
+                       \c_@@_name_cosupervisor_en_tl,
+                       \c_@@_name_date_en_tl,
+                     }
+%    \end{macrocode}
+% 读取右侧作者信息各栏字段,并将最宽者的宽度赋给
+% \cs{l_@@_tmpb_dim}。
+%    \begin{macrocode}
+                  \clist_set:Nx \l_@@_tmpb_clist
+                    {
+                      { Master ~ of ~ \l_@@_info_professionaltype_en_tl },
+                      { \l_@@_info_professionalfield_en_tl              },
+                      { \l_@@_info_author_en_tl                         },
+                      { \l_@@_info_supervisor_en_tl                     },
+                      { \l_@@_info_cosupervisor_en_tl                   },
+                      { \l_@@_info_date_en_tl                           }
+                    }
+%    \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
+                      \l_@@_tmpa_tl
+                      \c_@@_fwid_colon_tl
+                      \l_@@_tmpb_tl
+                      \skip_vertical:n { 1 ex }
+                    }
+                \end{minipage}
+              }
+            }
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_instructors:}
+% 标题内页作者、指导教师、指导小组签名,仅对研究生有效。
+% 此处应该是签名,在此直接设计为打印出姓名。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_instructors:
+  {
+    \int_case:nn {\g_@@_thesis_type_int}
+      {
+%    \end{macrocode}
+% 博士生,需要指导小组。
+%    \begin{macrocode}
+        {1}{
+%    \end{macrocode}
+% 作者、导师、指导小组标识,并取得最宽宽度。
+%    \begin{macrocode}
+          \clist_set:Nx \l_@@_tmpa_clist
+            {
+              {\c_@@_name_author_tl      },
+              {\c_@@_name_supervisor_tl  },
+              {\c_@@_name_instructors_tl },
+            }
+          \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 取得指导小组名单。
+%    \begin{macrocode}
+          \tl_set:Nn \l_@@_tmpa_tl {\clist_use:Nn \l_@@_info_instructors_clist {\@@_quad: }}
+%    \end{macrocode}
+% 作者、导师、指导小组信息,并取得最宽宽度。
+%    \begin{macrocode}
+          \clist_set:Nx \l_@@_tmpb_clist
+            {
+              {\l_@@_info_author_tl     },
+              {\l_@@_info_supervisor_tl },
+              {\l_@@_tmpa_tl            },
+            }
+          \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+%    \end{macrocode}
+% 计算小页环境宽度。
+%    \begin{macrocode}
+          \dim_set_eq:NN \l_@@_tmpt_dim \l_@@_tmpa_dim
+          \dim_add:Nn \l_@@_tmpt_dim { \l_@@_tmpb_dim }
+          \dim_add:Nn \l_@@_tmpt_dim {2.5em}
+          \begin{minipage} [ c ] { \l_@@_tmpt_dim }
+            \centering
+%    \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
+                \l_@@_tmpa_tl
+                \c_@@_fwid_colon_tl
+                \@@_center_box:Vn \l_@@_tmpb_dim { \l_@@_tmpb_tl }
+                \skip_vertical:n { 1 ex }
+              }
+%    \end{macrocode}
+% 不输出姓名,输出下划线,留作签名空间(暂未启用)。
+%    \begin{macrocode}
+            % \c_@@_name_author_tl
+            % \c_@@_fwid_colon_tl
+            % \@@_blank_underline:n{ 12em }
+            % \skip_vertical:n { 1 ex }
+            % \c_@@_name_supervisor_tl
+            % \c_@@_fwid_colon_tl
+            % \@@_blank_underline:n{ 12em }
+            % \skip_vertical:n { 1 ex }
+            % \c_@@_name_instructors_tl
+            % \c_@@_fwid_colon_tl
+            % \@@_blank_underline:n{ 12em }
+            % \skip_vertical:n { 1 ex }
+          \end{minipage}
+        }
+%    \end{macrocode}
+% 硕士生,仅需作者和导师。
+%    \begin{macrocode}
+        {2}{
+%    \end{macrocode}
+% 作者、导师标识,并取得最宽宽度。
+%    \begin{macrocode}
+          \clist_set:Nx \l_@@_tmpa_clist
+            {
+              {\c_@@_name_author_tl      },
+              {\c_@@_name_supervisor_tl  },
+            }
+          \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+%    \end{macrocode}
+% 作者、导师信息,并取得最宽宽度。
+%    \begin{macrocode}
+          \clist_set:Nx \l_@@_tmpb_clist
+            {
+              {\l_@@_info_author_tl     },
+              {\l_@@_info_supervisor_tl },
+            }
+          \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+          \dim_add:Nn \l_@@_tmpb_dim { \l_@@_tmpb_dim }
+%    \end{macrocode}
+% 计算小页环境宽度。
+%    \begin{macrocode}
+          \dim_set_eq:NN \l_@@_tmpt_dim \l_@@_tmpa_dim
+          \dim_add:Nn \l_@@_tmpt_dim { \l_@@_tmpb_dim }
+          \dim_add:Nn \l_@@_tmpt_dim {2.5em}
+          \begin{minipage} [ c ] { \l_@@_tmpt_dim }
+            \centering
+%    \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
+                \l_@@_tmpa_tl
+                \c_@@_fwid_colon_tl
+                \@@_center_box:Vn \l_@@_tmpb_dim { \l_@@_tmpb_tl }
+                \skip_vertical:n { 1 ex }
+              }
+%    \end{macrocode}
+% 不输出姓名,输出下划线,留作签名空间(暂未启用)。
+%    \begin{macrocode}
+          % \begin{minipage} [ c ] { 17em }
+          %   \flushleft
+          %   \c_@@_name_author_tl
+          %   \c_@@_fwid_colon_tl
+          %   \@@_blank_underline:n{ 12em }
+          %   \skip_vertical:n { 1 ex }
+          %   \c_@@_name_supervisor_tl
+          %   \c_@@_fwid_colon_tl
+          %   \@@_blank_underline:n{ 12em }
+          %   \skip_vertical:n { 1 ex }
+          \end{minipage}
+        }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_defensecommittees:}
+% 答辩委员会名单,仅对研究生有效。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_defensecommittees:
+  {
+%    \end{macrocode}
+% 清空临时变量。
+%    \begin{macrocode}
+    \clist_set:Nn \l_@@_tmpa_clist {}
+    \clist_set:Nn \l_@@_tmpb_clist {}
+    \clist_set:Nn \l_@@_tmpc_clist {}
+    \bool_until_do:nn { \clist_if_empty_p:N \l_@@_info_defensecommittees_clist }
+      {
+        \clist_set:Nn \l_@@_tmpt_clist {}
+%    \end{macrocode}
+% 取出一个答辩委员的信息。
+%    \begin{macrocode}
+        \clist_pop:NN \l_@@_info_defensecommittees_clist \l_@@_tmpa_tl
+        \clist_set:NV \l_@@_tmpt_clist \l_@@_tmpa_tl
+%    \end{macrocode}
+% 构造单位列表。
+%    \begin{macrocode}
+        \clist_put_right:Nx \l_@@_tmpa_clist {
+            \clist_item:Nn \l_@@_tmpt_clist {1}
+        }
+%    \end{macrocode}
+% 构造姓名列表。
+%    \begin{macrocode}
+        \clist_put_right:Nx \l_@@_tmpb_clist {
+            \clist_item:Nn \l_@@_tmpt_clist {2}
+        }
+%    \end{macrocode}
+% 构造职称列表。
+%    \begin{macrocode}
+        \clist_put_right:Nx \l_@@_tmpc_clist {
+            \clist_item:Nn \l_@@_tmpt_clist {3}
+        }
+      }
+%    \end{macrocode}
+% 分别计算单位列表、姓名列表、职称列表的最宽宽度。
+%    \begin{macrocode}
+    \@@_get_max_text_width:NN \l_@@_tmpa_dim \l_@@_tmpa_clist
+    \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist
+    \@@_get_max_text_width:NN \l_@@_tmpc_dim \l_@@_tmpc_clist
+%    \end{macrocode}
+% 输出答辩委员会信息。
+%    \begin{macrocode}
+    \begin{minipage} [ c ] { \textwidth }
+      \centering
+      \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
+          \clist_pop:NN \l_@@_tmpc_clist \l_@@_tmpc_tl
+          \@@_spread_box:Vn \l_@@_tmpa_dim { \l_@@_tmpa_tl }
+          \@@_center_box:Vn \l_@@_tmpb_dim { \l_@@_tmpb_tl }
+          \@@_spread_box:Vn \l_@@_tmpc_dim { \l_@@_tmpc_tl }
+          \skip_vertical:n { 0.5 ex }
+        }
+    \end{minipage}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_foundation:}
+% 项目资助列表,仅对研究生有效。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_foundation:
+  {
+%    \end{macrocode}
+% 清空临时变量。
+%    \begin{macrocode}
+    \clist_set:Nn \l_@@_tmpa_clist {}
+    \clist_set:Nn \l_@@_tmpb_clist {}
+    \clist_set:Nn \l_@@_tmpc_clist {}
+    \bool_until_do:nn { \clist_if_empty_p:N \l_@@_info_foundation_clist }
+      {
+        \clist_set:Nn \l_@@_tmpt_clist {}
+%    \end{macrocode}
+% 取出一个资助项目的信息。
+%    \begin{macrocode}
+        \clist_pop:NN \l_@@_info_foundation_clist \l_@@_tmpa_tl
+        \clist_set:NV \l_@@_tmpt_clist \l_@@_tmpa_tl
+%    \end{macrocode}
+% 构造项目来源列表。
+%    \begin{macrocode}
+        \clist_put_right:Nx \l_@@_tmpa_clist {
+            \clist_item:Nn \l_@@_tmpt_clist {1}
+        }
+%    \end{macrocode}
+% 构造项目名称列表。
+%    \begin{macrocode}
+        \clist_put_right:Nx \l_@@_tmpb_clist {
+            \clist_item:Nn \l_@@_tmpt_clist {2}
+        }
+%    \end{macrocode}
+% 构造项目编号列表。
+%    \begin{macrocode}
+        \clist_put_right:Nx \l_@@_tmpc_clist {
+            \clist_item:Nn \l_@@_tmpt_clist {3}
+        }
+      }
+%    \end{macrocode}
+% 输出资助项目信息。
+%    \begin{macrocode}
+    \begin{minipage} [ c ] { \textwidth }
+    \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
+        \clist_pop:NN \l_@@_tmpc_clist \l_@@_tmpc_tl
+        \indent
+        \@@_qquad:
+        本研究得到
+        \l_@@_tmpa_tl
+        \c_@@_fwid_colon_tl
+        \l_@@_tmpb_tl
+        (编号\c_@@_fwid_colon_tl
+        \l_@@_tmpc_tl
+        )资助
+        \par
+      }
+    \end{minipage}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_signature:N}
+% 签名行。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_signature:N #1
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+%    \end{macrocode}
+% 研究生。
+%    \begin{macrocode}
+        \@@_qquad:
+        \@@_spread_box:nV { 5 em } #1
+        \c_@@_fwid_colon_tl
+        \hspace*{\fill}
+      }{
+%    \end{macrocode}
+% 本科生。
+%    \begin{macrocode}
+        \@@_spread_box:nV { 6 em } #1
+        \c_@@_fwid_colon_tl
+        % \@@_blank_underline:n { 6 em }
+        \hspace*{\fill}
+      }
+%    \end{macrocode}
+% 签名时间。
+%    \begin{macrocode}
+    时间\c_@@_fwid_colon_tl
+    \@@_qquad:\@@_qquad: 年
+    \@@_qquad: 月
+    \@@_qquad: 日
+    \hspace*{\fill}
+    % \@@_qquad:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{封面模板}
+%
+% 声明封面对象。不需要带参数(\emph{完全复制fduthesis.dtx未做任何修改})。
+%    \begin{macrocode}
+%<@@=nwafu_cover>
+\DeclareObjectType { nwafu / cover } { \c_zero_int }
+%    \end{macrocode}
+%
+% \begin{macro}{\DeclareCoverTemplate,\nwafu_cover_declare_template:nn}
+% 声明封面模板。
+% \begin{arguments}
+%   \item 模板名称
+%   \item 封面部件列表,以逗号分隔
+% \end{arguments}
+%    \begin{macrocode}
+\NewDocumentCommand \DeclareCoverTemplate { m m }
+  { \nwafu_cover_declare_template:nn {#1} {#2} }
+\cs_new_protected:Npn \nwafu_cover_declare_template:nn #1#2
+  {
+    \tl_set:Nn \l_@@_template_tl {#1}
+%    \end{macrocode}
+% 构建模板接口。
+%    \begin{macrocode}
+    \@@_declare_template_interface:nx {#1}
+      {
+        format      : tokenlist,
+        top-skip    : skip,
+        bottom-skip : skip,
+        \clist_map_function:nN {#2} \@@_key_type:n
+      }
+%    \end{macrocode}
+% 声明所用变量。
+%    \begin{macrocode}
+    \tl_new:c   { l_@@ / #1 / format_tl   }
+    \skip_new:c { l_@@ / #1 / top_skip    }
+    \skip_new:c { l_@@ / #1 / bottom_skip }
+    \clist_map_inline:nn {#2}
+      {
+        \tl_new:c   { l_@@ / #1 / ##1 / content_tl  }
+        \tl_new:c   { l_@@ / #1 / ##1 / format_tl   }
+        \skip_new:c { l_@@ / #1 / ##1 / bottom_skip }
+      }
+%    \end{macrocode}
+% 声明模板代码。^^A 以下名字空间为 `nwafu_cover' 而非 `nwafu'
+%    \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 }
+        \__nwafu_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
+              }
+            \__nwafu_vspace:c { l_@@ / #1 / ####1 / bottom_skip }
+          }
+        \__nwafu_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 { nwafu / cover } {#1} { \c_zero_int } {#2} }
+\cs_new_protected:Npn \@@_declare_template_code:nnn #1#2#3
+  { \DeclareTemplateCode { nwafu / cover } {#1} { \c_zero_int } {#2} {#3} }
+\cs_generate_variant:Nn \@@_declare_template_interface:nn { nx  }
+\cs_generate_variant:Nn \@@_declare_template_code:nnn     { nxn }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_key_type:n}
+%    \begin{macrocode}
+\cs_new:Npn \@@_key_type:n #1
+  {
+    #1 / content     : tokenlist,
+    #1 / format      : tokenlist,
+    #1 / bottom-skip : skip,
+    #1 / align       : choice { left, right, center, normal } = normal,
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_key_binding:n}
+%    \begin{macrocode}
+\cs_new:Npn \@@_key_binding:n #1
+  {
+    #1 / content     =
+      \exp_not:c
+        { l_@@ / \l_@@_template_tl / #1 / content_tl  },
+    #1 / format      =
+      \exp_not:c
+        { l_@@ / \l_@@_template_tl / #1 / format_tl   },
+    #1 / bottom-skip =
+      \exp_not:c
+        { l_@@ / \l_@@_template_tl / #1 / bottom_skip },
+    #1 / align       =
+      {
+        left   =
+          \exp_not:N \cs_set_protected:cpn
+            { @@ / \l_@@_template_tl / #1 / align:n }
+            \exp_not:n {##1}
+            {
+              \exp_not:n
+                {
+                  \group_begin:
+                    \flushleft ##1 \endflushleft
+                  \group_end:
+                }
+            },
+        right  =
+          \exp_not:N \cs_set_protected:cpn
+            { @@ / \l_@@_template_tl / #1 / align:n }
+            \exp_not:n {##1}
+            {
+              \exp_not:n
+                {
+                  \group_begin:
+                    \flushright ##1 \endflushright
+                  \group_end:
+                }
+            },
+        center =
+          \exp_not:N \cs_set_protected:cpn
+            { @@ / \l_@@_template_tl / #1 / align:n }
+            \exp_not:n {##1}
+            {
+              \exp_not:n
+                {
+                  \group_begin:
+                    \center ##1 \endcenter
+                  \group_end:
+                }
+            },
+        normal =
+          \exp_not:N \cs_set_protected:cpn
+            { @@ / \l_@@_template_tl / #1 / align:n }
+            \exp_not:n {##1}
+            { \exp_not:n { \group_begin: ##1 \group_end: } }
+      },
+  }
+%<@@=nwafu>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{绘制封面}
+%
+% \begin{macro}{\makecoveri,\makecoverii,\makecoveriii,
+%     \makecoveriv,\makecoverv,\makecovervi,\makecovervii}
+% 封面一~七,其中一~六为研究生使用,一和七为本科生使用。
+%    \begin{macrocode}
+% 封面一,研究生、本科生中文封面
+\NewDocumentCommand \makecoveri { }
+  {
+    \thispagestyle { empty }
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \UseInstance { nwafu / cover } { cover-i-default }
+    \restoregeometry
+  }
+%    \end{macrocode}
+% 封面二,研究生英文封面
+%    \begin{macrocode}
+\NewDocumentCommand \makecoverii { }
+  {
+    \thispagestyle { empty }
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \UseInstance { nwafu / cover } { cover-ii-default }
+    \restoregeometry
+  }
+%    \end{macrocode}
+% 封面三,研究生封面内页(ID、答辩委员会等)
+%    \begin{macrocode}
+\NewDocumentCommand \makecoveriii { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-iii-default }
+    \restoregeometry
+  }
+%    \end{macrocode}
+% 封面四,研究生项目资助页
+%    \begin{macrocode}
+\NewDocumentCommand \makecoveriv { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-iv-default }
+    \restoregeometry
+  }
+%    \end{macrocode}
+% 封面五,研究生独创性声明与导师承诺
+%    \begin{macrocode}
+\NewDocumentCommand \makecoverv { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-v-default }
+    \restoregeometry
+  }
+%    \end{macrocode}
+% 封面六,研究生论文使用授权说明
+%    \begin{macrocode}
+\NewDocumentCommand \makecovervi { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-vi-default }
+    \restoregeometry
+  }
+%    \end{macrocode}
+% 封面七,本科生独创性声明及论文使用授权说明
+%    \begin{macrocode}
+\NewDocumentCommand \makecovervii { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-vii-default }
+    \restoregeometry
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% 声明各封面模板组成部分。
+%    \begin{macrocode}
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%    \end{macrocode}
+% 研究生封面一
+%    \begin{macrocode}
+    \DeclareCoverTemplate { cover-i   }
+      { logo, type, title, info }
+  }{
+%    \end{macrocode}
+% 本科生封面一
+%    \begin{macrocode}
+    \DeclareCoverTemplate { cover-i   }
+      { id, logo, type, title, info }
+  }
+%    \end{macrocode}
+% 研究生封面二
+%    \begin{macrocode}
+\DeclareCoverTemplate { cover-ii  } {
+  type, title, info, department, nwafu
+  }
+%    \end{macrocode}
+% 研究生封面三
+%    \begin{macrocode}
+\DeclareCoverTemplate { cover-iii } { id, name, title, instructors,
+    ctitle, committees, dtitle, date
+  }
+%    \end{macrocode}
+% 研究生封面四
+%    \begin{macrocode}
+\DeclareCoverTemplate { cover-iv  } { name-list }
+%    \end{macrocode}
+% 研究生封面五
+%    \begin{macrocode}
+\DeclareCoverTemplate { cover-v }
+  {
+    originality-decl-name,
+    originality-decl-text,
+    originality-decl-sig,
+    supervisor-decl-name,
+    supervisor-decl-text,
+    supervisor-decl-sig
+  }
+%    \end{macrocode}
+% 研究生封面六
+%    \begin{macrocode}
+\DeclareCoverTemplate { cover-vi }
+  {
+    authorization-decl-name,
+    authorization-decl-text,
+    authorization-decl-sig,
+    supervisor-decl-sig
+  }
+%    \end{macrocode}
+% 封面七,仅用于本科生独创性声明和授权说明
+%    \begin{macrocode}
+\DeclareCoverTemplate { cover-vii }
+  {
+    originality-decl-name,
+    originality-decl-text,
+    originality-decl-sig,
+    authorization-decl-name,
+    authorization-decl-text,
+    authorization-decl-sig,
+    supervisor-decl-sig
+  }
+%    \end{macrocode}
+%
+% 定义封面的具体配置参数。
+% 封面一
+%    \begin{macrocode}
+\int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+  {
+%    \end{macrocode}
+% 研究生
+%    \begin{macrocode}
+    \DeclareInstance { nwafu / cover } { cover-i-default } { cover-i }
+      {
+        bottom-skip            = 0 pt plus 1.5 fill,
+        logo     / content     = \@@_cover_logo:,
+        logo     / bottom-skip = -45 pt plus 0.3 fill,
+        logo     / align       = center,
+        type     / content     = \@@_cover_type:,
+        type     / format      = \sffamily \zihao {  0 },% \bfseries,
+        type     / bottom-skip = -20 pt plus 0.3 fill,
+        type     / align       = center,
+        title    / content     =
+          \@@_fixed_width_center_box:nn
+            { 0.9 \textwidth } { \l_@@_info_title_tl },
+        title    / format      = \nwafu at hei \bfseries \zihao { 2 },
+        title    / bottom-skip = 80 pt plus 0.3 fill,
+        title    / align       = center,
+        info     / content     = \@@_cover_info:,
+        info     / format      = \@@_line_spread:n {1.05}\nwafu at hei \zihao { -3 },
+        info     / align       = center,
+      }
+  }{
+%    \end{macrocode}
+% 本科生
+%    \begin{macrocode}
+    \DeclareInstance { nwafu / cover } { cover-i-default } { cover-i }
+      {
+        bottom-skip            = 0 pt plus 0.5 fill,
+        id       / content     = \@@_cover_id:,
+        id       / format      = \bfseries\zihao { 4 },
+        id       / bottom-skip = 0 pt plus 0.3 fill,
+        id       / align       = right,
+        logo     / content     = \@@_cover_logo:,
+        logo     / bottom-skip = -30 pt,% plus 0.3 fill,
+        logo     / align       = center,
+        type     / content     = \@@_cover_type:,
+        type     / format      = \bfseries\nwafu at kai\zihao {  1 },
+        type     / bottom-skip = -20 pt plus 0.3 fill,
+        type     / align       = center,
+        title    / content     =
+          \@@_fixed_width_center_box:nn
+            { 0.9 \textwidth } { \l_@@_info_title_tl },
+        title    / format      = \nwafu at hei \bfseries\zihao { 2 },
+        title    / bottom-skip = 80 pt plus 0.3 fill,
+        title    / align       = center,
+        info     / content     = \@@_cover_info:,
+        info     / format      = \rmfamily\zihao { 3 },
+        info     / align       = center,
+      }
+  }
+%    \end{macrocode}
+% 封面二
+%    \begin{macrocode}
+\int_case:nn {\g_@@_thesis_type_int}
+  {
+    {1}{
+%    \end{macrocode}
+% 博士研究生
+%    \begin{macrocode}
+         \DeclareInstance { nwafu / cover } { cover-ii-default } { cover-ii }
+           {
+             bottom-skip            = 0 pt plus 0.5 fill,
+             type     / content =
+               \@@_fixed_width_center_box:nn { 0.7\textwidth } {
+                  Thesis~Submitted~to~\c_@@_name_en_tl\\
+                  in~Partial~Fulfillment~of~the~Requirements\\
+                  for~Degree~of\\
+                  Doctor~of~Philosophy
+              },
+             type     / format  = \@@_line_spread:n {1.22} \zihao { -3 },
+             type     / bottom-skip = 42 pt,% plus 0.3 fill,
+             type     / align   = center,
+             title     / content = \l_@@_info_title_en_tl,
+             title     / format  = \@@_line_spread:n {0.90}
+                                   \zihao { 1 } \bfseries,
+             title     / bottom-skip = 35 pt,% plus 0.3 fill,
+             title     / align   = center,
+             info     / content     = \@@_cover_info_en:,
+             info     / format      = \@@_line_spread:n {1.12} \zihao { -3 },
+             info    / bottom-skip = 72 pt,% plus 0.3 fill,
+             info     / align       = center,
+             department     / content     = \l_@@_info_department_en_tl,
+             department     / format      = \zihao { -3 },
+             department     / bottom-skip = -32 pt,% plus 0.3 fill,
+             department     / align       = center,
+             nwafu     / content     = \c_@@_name_en_tl,
+             nwafu     / format      = \zihao { -3 },
+             nwafu     / align       = center,
+           }
+    }
+    {2}{
+%    \end{macrocode}
+% 硕士研究生
+%    \begin{macrocode}
+         \DeclareInstance { nwafu / cover } { cover-ii-default } { cover-ii }
+           {
+             bottom-skip            = 0 pt plus 0.5 fill,
+             type     / content =
+               \@@_fixed_width_center_box:nn { 0.7\textwidth } {
+                  Thesis~Submitted~to~\c_@@_name_en_tl\\
+                  in~Partial~Fulfillment~of~the~Requirements\\
+                  for~Degree~of\\
+                  Master~of
+                 \int_case:nn {\l_@@_info_degree_type_int}
+                  {
+                    {1}{
+                      \@@_text_uline:V \l_@@_info_mastertype_en_tl
+                    }
+                    {2}{
+                      \@@_text_uline:V \l_@@_info_professionaltype_en_tl
+                    }
+                  }
+               },
+             type     / format  = \@@_line_spread:n {1.22} \zihao { -3 },
+             type     / bottom-skip = 42 pt,% plus 0.3 fill,
+             type     / align   = center,
+             title     / content = \l_@@_info_title_en_tl,
+             title     / format  = \@@_line_spread:n {0.90} \zihao { 1 } \bfseries,
+             title     / bottom-skip = 35 pt,% plus 0.3 fill,
+             title     / align   = center,
+             info     / content     = \@@_cover_info_en:,
+             info     / format      = \@@_line_spread:n {1.12} \zihao { -3 },
+             info    / bottom-skip = 72 pt,% plus 0.3 fill,
+             info     / align       = center,
+             department     / content     = \l_@@_info_department_en_tl,
+             department     / format      = \zihao { -3 },
+             department     / bottom-skip = -32 pt,% plus 0.3 fill,
+             department     / align       = center,
+             nwafu     / content     = \c_@@_name_en_tl,
+             nwafu     / format      = \zihao { -3 },
+             nwafu     / align       = center,
+           }
+    }
+  }
+%    \end{macrocode}
+% 封面三
+%    \begin{macrocode}
+\DeclareInstance { nwafu / cover } { cover-iii-default } { cover-iii }
+  {
+    top-skip            = -55 pt plus 0.1 fill,
+    bottom-skip            = 0 pt plus 0.5 fill,
+    id     / content = \@@_cover_id:,
+    id     / format  =  \@@_line_spread:n {1.12}\zihao { -4 },
+    id     / bottom-skip = 35 pt plus 0.3 fill,
+    id     / align   = center,
+    name     / content = \c_@@_name_simp_tl
+                         \clist_item:Nn \c_@@_thesis_type_clist { \g_@@_thesis_type_int },
+    name     / format  = \zihao { -2 }\bfseries,
+    name     / bottom-skip = 0 pt plus 0.3 fill,
+    name     / align   = center,
+    title     / content = \l_@@_info_title_tl,
+    title     / format  = \zihao { 2 } \sffamily,
+    title     / bottom-skip = 65 pt plus 0.3 fill,
+    title     / align   = center,
+    instructors     / content     = \@@_cover_instructors:,
+    instructors     / format      = \@@_line_spread:n {0.88}\zihao { 3 }\bfseries,
+    instructors     / bottom-skip = 75 pt plus 0.3 fill,
+    instructors     / align       = center,
+    ctitle     / content = 答辩委员会\c_@@_fwid_colon_tl,
+    ctitle     / format  = \zihao { -3 }\bfseries,
+    ctitle     / bottom-skip = -20 pt plus 0.3 fill,
+    ctitle     / align   = left,
+    committees     / content     = \@@_cover_defensecommittees:,
+    committees     / format      = \@@_line_spread:n {1.12}\zihao { -3 },
+    committees     / bottom-skip = 60 pt plus 0.3 fill,
+    committees     / align       = center,
+    date     / content     = {\bfseries{}答辩日期}\c_@@_fwid_colon_tl\l_@@_info_defensedate_tl,
+    date     / format      = \zihao { -3 },
+    date     / bottom-skip = 0 pt plus 0.3 fill,
+    date     / align       = left,
+  }
+%    \end{macrocode}
+% 封面四
+%    \begin{macrocode}
+\DeclareInstance { nwafu / cover } { cover-iv-default } { cover-iv }
+  {
+    name-list / content = \@@_cover_foundation:,
+    name-list / format = \sffamily\zihao{3},
+    name-list / align = center,
+  }
+%    \end{macrocode}
+% 封面五
+%    \begin{macrocode}
+\DeclareInstance { nwafu / cover } { cover-v-default } { cover-v }
+  {
+    format                                =
+      \@@_line_spread:n { 1.25 },
+    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_tl,
+    supervisor-decl-name / content     = \c_@@_name_super_decl_tl,
+    supervisor-decl-text / content     = \c_@@_super_decl_text_tl,
+    supervisor-decl-sig  / content     =
+      \@@_cover_signature:N \c_@@_super_decl_sign_tl,
+    originality-decl-name   / format      =
+      \@@_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    supervisor-decl-name / format      =
+      \@@_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    originality-decl-text   / format      = \zihao { -4 },
+    supervisor-decl-text / format      = \zihao { -4 },
+    originality-decl-name   / bottom-skip = 0.25 cm,
+    originality-decl-text   / bottom-skip = 0.4 cm,
+    originality-decl-sig    / bottom-skip = 0.4 cm,
+    supervisor-decl-name / bottom-skip = 0.25 cm,
+    supervisor-decl-text / bottom-skip = 0.4 cm,
+    originality-decl-name   / align       = center,
+    originality-decl-sig    / align       = left,
+    supervisor-decl-name / align       = center,
+    supervisor-decl-sig  / align       = left,
+  }
+%    \end{macrocode}
+% 封面六
+%    \begin{macrocode}
+\DeclareInstance { nwafu / cover } { cover-vi-default } { cover-vi }
+  {
+    format                                =
+      \@@_line_spread:n { 1.25 },
+    top-skip                              = 0 pt plus 0.2 fill,
+    bottom-skip                           = 0 pt plus 2.5 fill,
+    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_@@_orig_decl_sign_tl,
+    supervisor-decl-sig  / content     =
+      \@@_cover_signature:N \c_@@_super_decl_sign_tl,
+    authorization-decl-name   / format      =
+      \@@_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    authorization-decl-text   / format      = \zihao { -4 },
+    authorization-decl-name   / bottom-skip = 0.25 cm,
+    authorization-decl-text   / bottom-skip = 0.8 cm,
+    authorization-decl-sig    / bottom-skip = -0.50 cm,
+    authorization-decl-name   / align       = center,
+    authorization-decl-sig    / align       = left,
+    supervisor-decl-sig  / align       = left,
+  }
+%    \end{macrocode}
+% 封面七
+%    \begin{macrocode}
+\DeclareInstance { nwafu / cover } { cover-vii-default } { cover-vii }
+  {
+    format                                =
+      \@@_line_spread:n { 1.25 },
+    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_tl,
+    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_@@_orig_decl_sign_tl,
+    supervisor-decl-sig  / content     =
+      \@@_cover_signature:N \c_@@_super_decl_sign_tl,
+    originality-decl-name   / format      =
+      \@@_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    authorization-decl-name / format      =
+      \@@_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    originality-decl-text   / format      = \zihao { -4 } \nwafu at kai,
+    authorization-decl-text / format      = \zihao { -4 } \nwafu at kai,
+    originality-decl-sig   / format      = \zihao { -4 } \nwafu at kai,
+    authorization-decl-sig / format      = \zihao { -4 } \nwafu at kai,
+    supervisor-decl-sig / format      = \zihao { -4 } \nwafu at kai,
+    originality-decl-name   / bottom-skip = 0.25 cm,
+    originality-decl-text   / bottom-skip = 0.4 cm,
+    originality-decl-sig    / bottom-skip = 0.4 cm,
+    authorization-decl-name / bottom-skip = 0.25 cm,
+    authorization-decl-text / bottom-skip = 0.4 cm,
+    authorization-decl-sig    / bottom-skip = -0.5 cm,
+    originality-decl-name   / align       = center,
+    originality-decl-sig    / align       = left,
+    authorization-decl-name / align       = center,
+    authorization-decl-sig  / align       = left,
+    supervisor-decl-sig  / align       = left,
+  }
+%    \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 { nwafu / style }
+  {
+    auto-make-cover .bool_set:N = \l_@@_auto_make_cover_bool,
+    auto-make-cover .default:n  = true
+  }
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
+% \begin{macro}{\makecovers}
+% 在排版所有封面。
+%    \begin{macrocode}
+\NewDocumentCommand \makecovers { }
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+%    \end{macrocode}
+% 研究生
+%    \begin{macrocode}
+        \begin{titlepage}
+          \makecoveri
+          \newpage
+          \makecoverii
+          \newpage
+          \makecoveriii
+          \newpage
+          \makecoveriv
+          \newpage
+          \makecoverv
+          \newpage
+          \makecovervi
+        \end{titlepage}
+      }{
+%    \end{macrocode}
+% 本科生
+%    \begin{macrocode}
+        \begin{titlepage}
+          \makecoveri
+          \cleardoublepage
+          \makecovervii
+        \end{titlepage}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{摘要及符号表}
+%
+% \begin{variable}{\l_@@_abstract_file_tl,
+%   \l_@@_abstract_file_en_tl,
+%   \l_@@_abstract_keywords_clist,
+%   \l_@@_abstract_keywords_en_clist,
+%   \l_@@_notation_file_tl}
+% 摘要数据所需字段。
+%    \begin{macrocode}
+\tl_new:c { l_@@_abstract_file_tl }
+\tl_new:c { l_@@_abstract_file_en_tl }
+\clist_new:N \l_@@_abstract_keywords_clist
+\clist_new:N \l_@@_abstract_keywords_en_clist
+\tl_new:c { l_@@_notation_file_tl }
+%    \end{macrocode}
+% \end{variable}
+%
+%    \begin{macrocode}
+\keys_define:nn { nwafu / abstract }
+  {
+%    \end{macrocode}
+%
+% \begin{macro}{abstract/abstractfile, abstract/abstractfile*}
+% 摘要文件的文件名
+%    \begin{macrocode}
+    abstractfile  .tl_set:N = \l_@@_abstract_file_tl,
+    abstractfile* .tl_set:N = \l_@@_abstract_file_en_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{abstract/keywords, abstract/keywords*}
+% 论文关键字列表。
+%    \begin{macrocode}
+    keywords  .clist_set:N = \l_@@_abstract_keywords_clist,
+    keywords* .clist_set:N = \l_@@_abstract_keywords_en_clist,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{abstract/notation}
+% 论文符号表文件的文件名。
+%    \begin{macrocode}
+    notationfile  .tl_set:N  = \l_@@_notation_file_tl,
+    notationfile  .default:n = {},
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\makefront}
+% 排版摘要、目录等前料。
+%    \begin{macrocode}
+\NewDocumentCommand \makefront { }
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+%    \end{macrocode}
+% 研究生,\cs{frontmatter}命令用于设置页眉页脚,页码格式
+% 并于奇数页起排。
+%    \begin{macrocode}
+        \frontmatter
+        \tl_if_empty:NF \l_@@_abstract_file_tl
+          {
+%    \end{macrocode}
+% 根据提供的文件,排版中文摘要,否则什么都不做。
+%    \begin{macrocode}
+            \begin{abstract}
+              \file_input:V \l_@@_abstract_file_tl
+            \end{abstract}
+          }
+        \tl_if_empty:NF \l_@@_abstract_file_en_tl
+          {
+%    \end{macrocode}
+% 根据提供的文件,排版英文摘要,否则什么都不做。
+%    \begin{macrocode}
+            \begin{abstract*}
+              \file_input:V \l_@@_abstract_file_en_tl
+            \end{abstract*}
+          }
+%    \end{macrocode}
+% 排版目录,需要在奇数页起排。
+%    \begin{macrocode}
+        \cleardoublepage
+        \pagenumbering{Roman}
+        \tableofcontents
+%    \end{macrocode}
+% 排版主要符号对照表,需要在奇数页起排。
+%    \begin{macrocode}
+        % \frontmatter
+        \tl_if_empty:NF \l_@@_notation_file_tl
+          {
+%    \end{macrocode}
+% 根据提供的文件,排版主要符号对照表,否则什么都不做。
+%    \begin{macrocode}
+            \cleardoublepage
+            \pagenumbering{Roman}
+            \file_input:V \l_@@_notation_file_tl
+          }
+      }{
+%    \end{macrocode}
+% 本科生,无页眉页脚
+%    \begin{macrocode}
+        \cleardoublepage
+        \thispagestyle { empty }
+        \tl_if_empty:NF \l_@@_abstract_file_tl
+          {
+%    \end{macrocode}
+% 根据提供的文件,排版中文摘要,否则什么都不做。
+%    \begin{macrocode}
+            \begin{abstract}
+              \@@_get_text_width:Nn \l_@@_tmpa_dim {\c_@@_name_keywords_tl}
+              \group_begin:
+                \par \indent
+                {\sffamily\zihao{-4}
+                \@@_spread_box:Vn \l_@@_tmpa_dim {\c_@@_name_abstract_tl}
+                \c_@@_fwid_colon_tl}
+                \normalfont
+                \file_input:V \l_@@_abstract_file_tl
+              \group_end:
+            \end{abstract}
+          }
+        \clearpage
+        \thispagestyle { empty }
+        \tl_if_empty:NF \l_@@_abstract_file_en_tl
+          {
+%    \end{macrocode}
+% 根据提供的文件,排版英文摘要,否则什么都不做。
+%    \begin{macrocode}
+            \begin{abstract*}
+              \group_begin:
+                \par \indent
+                {\bfseries\zihao{-4}
+                \c_@@_name_abstract_en_tl : ~}
+                \normalfont
+                \file_input:V \l_@@_abstract_file_en_tl
+              \group_end:
+            \end{abstract*}
+          }
+        \frontmatter
+        \tableofcontents
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\AfterEndPreamble
+  {
+    \bool_if:NT \l_@@_auto_make_cover_bool
+      {
+        \makecovers
+        \makefront
+      }
+  }
+%    \end{macrocode}
+%
+% \subsection{目录}
+%
+% 设置目录标题。
+%    \begin{macrocode}
+\keys_set:nn { ctex }
+  {
+    contentsname   = \c_@@_name_toc_tl,
+    listfigurename = \c_@@_name_lof_tl,
+    listtablename  = \c_@@_name_lot_tl,
+  }
+%    \end{macrocode}
+%
+% \begin{variable}{\@@_toc_chapter_format_tl,
+%   \@@_toc_chapter_indent_tl,
+%   \@@_toc_chapter_rule_tl,
+%   \@@_toc_chapter_numsep_tl,
+%   \@@_toc_chapter_offset_dim,
+%   \@@_toc_section_format_tl,
+%   \@@_toc_section_indent_tl,
+%   \@@_toc_section_rule_tl,
+%   \@@_toc_section_numsep_tl,
+%   \@@_toc_section_offset_dim,
+%   \@@_toc_subsection_format_tl,
+%   \@@_toc_subsection_indent_tl,
+%   \@@_toc_subsection_rule_tl,
+%   \@@_toc_subsection_numsep_tl,
+%   \@@_toc_subsection_offset_dim,
+%   \@@_toc_list_format_tl,
+%   \@@_toc_list_indent_tl,
+%   \@@_toc_list_rule_tl,
+%   \@@_toc_list_numsep_tl,
+%   \@@_toc_list_offset_dim,
+%   \@@_toc_line_align_bool,
+%   \@@_titletoc_hang_fix_bool}
+% 目录设置中需要的字段。
+%    \begin{macrocode}
+\clist_map_inline:nn
+  {
+      chapter, section, subsection, figure, table
+  }
+  {
+    \clist_map_inline:nn
+      {
+        format, indent, rule, numsep
+      }
+      {
+        \tl_new:c {@@_toc_ #1 _ ##1 _ tl}
+      }
+  }
+\clist_map_inline:nn
+  {
+      chapter, section, subsection, figure, table
+  }
+  { \dim_new:c { @@_toc_ #1 _offset_dim } }
+\bool_new:N \@@_toc_line_align_bool
+\bool_new:N \@@_titletoc_hang_fix_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% 目录格式设置,研究生与本科生需设置不同参数
+%    \begin{macrocode}
+\tl_set:Nn \@@_toc_chapter_format_tl { \addvspace{1pt}\nwafu at hei \bfseries }
+\tl_set:Nn \@@_toc_chapter_indent_tl {0pc}
+\tl_set:Nn \@@_toc_chapter_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \@@_toc_chapter_numsep_tl {0.5\ccwd}
+\dim_set:Nn \@@_toc_chapter_offset_dim
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \@@_toc_section_format_tl
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}\small
+      }
+  }
+\tl_set:Nn \@@_toc_section_indent_tl { \ccwd }
+\tl_set:Nn \@@_toc_section_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \@@_toc_section_numsep_tl {0.5\ccwd}
+\dim_set:Nn \@@_toc_section_offset_dim
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \@@_toc_subsection_format_tl
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}\small
+      }
+  }
+\tl_set:Nn \@@_toc_subsection_indent_tl {2.0\ccwd}
+\tl_set:Nn \@@_toc_subsection_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \@@_toc_subsection_numsep_tl {0.5\ccwd}
+\dim_set:Nn \@@_toc_subsection_offset_dim
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \@@_toc_figure_format_tl
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}
+      }
+  }
+\tl_set:Nn \@@_toc_figure_indent_tl {0pc}
+\tl_set:Nn \@@_toc_figure_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \@@_toc_figure_numsep_tl {0.5\ccwd}
+\dim_set:Nn \@@_toc_figure_offset_dim
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \@@_toc_table_format_tl
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}
+      }
+  }
+\tl_set:Nn \@@_toc_table_indent_tl {0pc}
+\tl_set:Nn \@@_toc_table_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \@@_toc_table_numsep_tl {0.5\ccwd}
+\dim_set:Nn \@@_toc_table_offset_dim
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\bool_set_false:N \@@_toc_line_align_bool
+\bool_set_false:N \@@_titletoc_hang_fix_bool
+%
+%    \end{macrocode}
+% 循环设置各级别目录格式。
+% 代码借鉴于easybook(\url{https://gitee.com/texl3/easybook})。
+%    \begin{macrocode}
+%
+\clist_map_inline:nn
+  {
+      chapter, section, subsection, figure, table
+  }
+  {
+    \titlecontents{#1}
+%    \end{macrocode}
+% 左侧缩进距离。
+%    \begin{macrocode}
+      [ \use:c { @@_toc_#1_indent_tl } ]
+%    \end{macrocode}
+% 标题格式,可以设置字体、加入垂直间距等,
+% 垂直间距最好使用无间距重合的\textbackslash addvspace命令。
+%    \begin{macrocode}
+      { \use:c { @@_toc_#1_format_tl } }
+%    \end{macrocode}
+% 标题标志格式,如序号格式、序号宽度、序号与标题内容之间的间距等。
+% 该参数若为空,则无标题标志。
+%    \begin{macrocode}
+      {
+        \bool_if:NT \@@_titletoc_hang_fix_bool
+          {
+            \contentspush
+              {
+                \thecontentslabel
+%    \end{macrocode}
+% 有编号的标题在目录中编号与标题的间距。
+%    \begin{macrocode}
+                \hspace{\use:c { @@_toc_#1_numsep_tl }}
+              }
+          }
+      }
+%    \end{macrocode}
+% 无序号标题格式。
+%    \begin{macrocode}
+      {}
+%    \end{macrocode}
+% 标题与页码之间的导引线。
+%    \begin{macrocode}
+      {\use:c { @@_toc_#1_rule_tl }}
+%    \end{macrocode}
+% 下间距,可选参数, 用于设置标题排版后还需要执行的命令,
+% 例如与下个标题的垂直间距等。
+%    \begin{macrocode}
+      [\addvspace{\use:c{ @@_toc_ #1 _offset_dim }}]
+  }
+
+%    \end{macrocode}
+% 自定义导引线命令。
+% 代码借鉴于easybook(\url{https://gitee.com/texl3/easybook})。
+%    \begin{macrocode}
+\cs_new:Npn \NWAFUNumberLine #1
+  {
+    \CTEXifname
+      {
+        \use:c { CTEXthe#1 }
+        \hspace{\use:c { @@_toc_#1_numsep_tl }}
+      }{}
+  }
+
+%    \end{macrocode}
+% 导引线。
+%    \begin{macrocode}
+\bool_if:NTF \@@_titletoc_hang_fix_bool
+  {
+%    \end{macrocode}
+% CTeX格式导引线。
+%    \begin{macrocode}
+    \keys_set:nn { ctex }
+      {
+        chapter/tocline     = \CTEXnumberline{#1}#2,
+        section/tocline     = \CTEXnumberline{#1}#2,
+        subsection/tocline  = \CTEXnumberline{#1}#2
+      }
+  }{
+%    \end{macrocode}
+% 自定义导引线。
+%    \begin{macrocode}
+    \keys_set:nn { ctex }
+      {
+        chapter/tocline     = \NWAFUNumberLine{#1}#2,
+        section/tocline     = \NWAFUNumberLine{#1}#2,
+        subsection/tocline  = \NWAFUNumberLine{#1}#2
+      }
+ }
+%
+%    \end{macrocode}
+% 定义tocrule目录导引线命令。
+% *星号命令能够使右侧与页码连接与不是对齐。
+% 代码借鉴于easybook(\url{https://gitee.com/texl3/easybook})。
+%    \begin{macrocode}
+%
+\NewDocumentCommand{\tocrule}{sO{0.3pc}D(){1.2}mO{}}
+  {
+    \small\normalfont
+    \titlerule*[#2]{\scalebox{#3}{#4}}#5
+    \IfBooleanTF{#1}
+      {\thecontentspage}
+      {
+        \bool_if:NTF \@@_toc_line_align_bool
+          {\contentspage}{\thecontentspage}
+      }
+  }
+%    \end{macrocode}
+%
+% \begin{macro}{\tableofcontents,\listoffigures,\listoftables}
+% 修改 \cs{tableofcontents}、\cs{listoffigures} 和 \cs{listoftables} 的定义,
+% 使得页眉正确显示,并出现在目录及 PDF 书签中。来自于 \LaTeXe{} 标准文档类
+% \file{book.cls}
+% \footnote{原代码中只有 \cs{tableofcontents} 的 \cs{@mkboth} 出现在
+% \cs{chapter*} 内部,这是出于兼容性的考虑而非 typo。}。
+%    \begin{macrocode}
+\@@_patch_cmd:Nnn \tableofcontents
+  {
+    \chapter*{\contentsname
+      \@mkboth{\MakeUppercase\contentsname}
+              {\MakeUppercase\contentsname}}
+  }
+  { \@@_chapter_no_toc:V \contentsname }
+\@@_patch_cmd:Nnn \listoffigures
+  {
+    \chapter*{\listfigurename}
+    \@mkboth{\MakeUppercase\listfigurename}
+            {\MakeUppercase\listfigurename}
+  }
+  { \@@_chapter:V \listfigurename }
+\@@_patch_cmd:Nnn \listoftables
+  {
+    \chapter*{\listtablename}
+    \@mkboth{\MakeUppercase\listtablename}
+            {\MakeUppercase\listtablename}
+  }
+  { \@@_chapter:V \listtablename }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{摘要}
+%
+% \begin{environment}{abstract}
+% \begin{environment}{abstract*}
+% 摘要环境,定义中英文双语摘要。
+%    \begin{macrocode}
+\NewDocumentEnvironment { abstract  } { }
+  { \@@_abstract_begin:    } { \@@_abstract_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:
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+        \@@_chapter:V \c_@@_name_abstract_tl
+      }{
+        \par \mode_leave_vertical: \par
+        \begin{center}\nwafu at hei\bfseries\zihao{3}\l_@@_info_title_tl\end{center}
+      }
+  }
+%</class>
+\cs_new_protected:Npn \@@_abstract_en_begin:
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+        \@@_chapter:n \c_@@_name_abstract_en_tl
+      }{
+        \par \mode_leave_vertical: \par
+        \begin{center}\bfseries\zihao{3}\l_@@_info_title_en_tl\end{center}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_abstract_end:,\@@_abstract_en_end:}
+% 摘要正文完成后,输出关键字列表。
+%    \begin{macrocode}
+%<*class>
+\cs_new_protected:Npn \@@_abstract_end:
+  {
+    \@@_keywords:nNn
+      { \sffamily \zihao{-4} \c_@@_name_keywords_tl \c_@@_fwid_colon_tl  }
+      \l_@@_abstract_keywords_clist { ; ~}
+  }
+%</class>
+\cs_new_protected:Npn \@@_abstract_en_end:
+  {
+    \@@_keywords:nNn
+      { \bfseries \c_@@_name_keywords_en_tl : ~ }
+      \l_@@_abstract_keywords_en_clist { ; ~ }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_keywords:nNn,\@@_keywords_prevdepth:}
+% 关键字列表前要空一行,使用悬挂缩进。|\parbox| 之后的间距
+% 需要调整,见 \url{https://tex.stackexchange.com/a/34982}。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_keywords:nNn #1#2#3
+  {
+    \int_compare:nNnTF { \g_@@_thesis_type_int } < { 3 }
+      {
+        \par \mode_leave_vertical: \par \noindent
+        \@@_get_text_width:Nn \l_@@_tmpa_dim {#1}
+        \group_begin: \MakeUppercase{#1} \group_end:
+        \parbox [t] { \dim_eval:n { \textwidth - \l_@@_tmpa_dim } }
+          {
+            \clist_use:Nn #2 {#3} \par
+            \cs_gset:Npx \@@_keywords_prevdepth: { \dim_use:N \tex_prevdepth:D }
+          }
+      }{
+        \par \mode_leave_vertical: \par
+        \@@_get_text_width:Nn \l_@@_tmpa_dim {#1}
+        \group_begin: #1 \group_end:
+        \clist_use:Nn #2 {#3} \par
+        \cs_gset:Npx \@@_keywords_prevdepth: { \dim_use:N \tex_prevdepth:D }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{符号表}
+%
+% \begin{environment}{notation}
+% 符号表环境,利用 \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:
+  {
+    \@@_chapter_no_toc:V \c_@@_name_notation_tl
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_notation_long_table_setup:}
+% 调整 \cs{LTpre} 和 \cs{LTpost},以删去 \env{longtable} 前后的空白。
+% 英文模板中还需要调整表格的行距。注意 \tn{arraystretch} 只是一个简单
+% 宏,不能使用 \cs{fp_set:Nn}。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_notation_long_table_setup:
+  {
+    \dim_set_eq:NN \LTpre  \c_zero_dim
+    \dim_set_eq:NN \LTpost \c_zero_dim
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{致谢}
+%
+% \begin{environment}{acknowledgement}
+% 致谢环境,只是简单地设置章节不编号标题。
+%    \begin{macrocode}
+\NewDocumentEnvironment { acknowledgement } { }
+  {
+    \group_begin:
+    \@@_chapter:V \c_@@_name_ack_tl
+  }
+  {
+    \group_end:
+  }
+%    \end{macrocode}
+% \end{environment}
+%
+% \subsection{个人简历}
+%
+% \begin{environment}{resume}
+% 致谢环境,只是简单地设置章节不编号标题。
+%    \begin{macrocode}
+\NewDocumentEnvironment { resume } { }
+  {
+    \group_begin:
+    \@@_chapter:V \c_@@_name_resume_tl
+  }
+  {
+    \group_end:
+  }
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\resumeitem,\researchitem}
+% 摘要页标题。
+%    \begin{macrocode}
+\NewDocumentCommand{ \resumitem }{ O{ 学习经历 } }
+  {%
+    \vspace{24bp}{\zihao{-4}\nwafu at hei\bfseries\centerline{#1}}\par\vspace{6bp}
+  }
+\NewDocumentCommand{ \researchitem }{ O{ 发表的学术论文 } }
+  {%
+    \vspace{32bp}{\zihao{-4}\nwafu at hei\bfseries\centerline{#1}}\par\vspace{14bp}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{publications}
+% \begin{environment}{achievements}
+% 个人简历中发论文和研究成果列表环境。
+%    \begin{macrocode}
+\newlist{publications}{enumerate}{1}
+\setlist[publications]{label=[\arabic*],align=left,nosep,itemsep=6bp,
+  leftmargin=10mm,before=\zihao{-4},resume}
+\newlist{achievements}{enumerate}{1}
+\setlist[achievements]{label=[\arabic*],align=left,nosep,itemsep=6bp,
+  leftmargin=10mm,before=\zihao{-4}}
+\def\publicationskip{\bigskip\bigskip}
+%    \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \subsection{参考文献著录与引用}
+%
+% \begin{variable}{\l_@@_bib_resource_clist}
+% 保存参考文献数据库列表。
+%    \begin{macrocode}
+\clist_new:N \l_@@_bib_resource_clist
+%    \end{macrocode}
+% \end{variable}
+%
+%    \begin{macrocode}
+\keys_define:nn { nwafu / style }
+  {
+%    \end{macrocode}
+% \begin{macro}{style/bib-resource}
+% 参考文献数据源。
+%    \begin{macrocode}
+    bib-resource .clist_set:N = \l_@@_bib_resource_clist
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% 为了保证导言区中的设置能起作用,\pkg{biblatex} 宏包均需要在
+% 导言区末尾载入(仍在 \pkg{hyperref} 之前),并做相关设置。
+%    \begin{macrocode}
+% \AddToHook
+%   { env/document/begin }
+\@@_at_end_preamble:n
+  {
+    \@@_biblatex_pre_setup:
+    \RequirePackage { biblatex }
+    \@@_biblatex_post_setup:
+  }
+%    \end{macrocode}
+%
+% \begin{macro}{
+%   \@@_biblatex_pre_setup:,
+%   \@@_biblatex_post_setup:,
+%   \@@_pass_options_to_biblatex:n}
+% \pkg{biblatex} 相关设置。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_biblatex_pre_setup:
+  {
+%    \end{macrocode}
+% 参考文献引用与著录样式。
+%    \begin{macrocode}
+    \@@_pass_options_to_biblatex:n { style = gb7714-2015ay }
+%    \end{macrocode}
+% 其它参数。
+%    \begin{macrocode}
+    \@@_pass_options_to_biblatex:n { backend = biber, sortlocale=zh__pinyin,
+        gbtype=false, maxbibnames=99, maxcitenames=2, mincitenames=1,
+        gbpub=false, uniquename=false, uniquelist=false, gbnamefmt=lowercase,
+        doi=false, isbn=false, gbfieldtype=true, gbpunctin=false,
+      }
+  }
+\cs_new_protected:Npn \@@_biblatex_post_setup:
+  {
+%    \end{macrocode}
+% 载入参考文献数据源文件。
+%    \begin{macrocode}
+    \@@_biblatex_misc:
+    \clist_map_function:NN \l_@@_bib_resource_clist \addbibresource
+    \@@_biblatex_allow_url_break:
+%    \end{macrocode}
+% 修改参考文献标题。
+%    \begin{macrocode}
+    \defbibheading { bibliography } [ \bibname ] { \@@_chapter:n {##1} }
+  }
+\cs_new_protected:Npn \@@_pass_options_to_biblatex:n #1
+  { \PassOptionsToPackage {#1} { biblatex } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_biblatex_misc:}
+% \pkg{biblatex} 中需要针对西北农林科技大学参考文献规范的特殊设置。
+% 由符合 GB/T 7714-2015 标准的 biblatex 参考文献样式
+% (\url{https://github.com/hushidong/biblatex-gb7714-2015})
+% 作者胡振震协助实现。
+%    \begin{macrocode}
+\cs_new:Npn \@@_biblatex_misc:
+  {
+%    \end{macrocode}
+% 表示范围的波浪线符号
+%    \begin{macrocode}
+    \DefineBibliographyExtras{english}{\renewcommand*{\bibrangedash}{$\sim$}}
+%    \end{macrocode}
+% 设置全局字体字号(5号字,行间距为1.3)
+%    \begin{macrocode}
+    \newcommand\nwafu at font@bib{\@@_line_spread:n {1.3}\zihao{5}}
+    \renewcommand{\bibfont}{\nwafu at font@bib}
+%    \end{macrocode}
+% 英文期刊名称用斜休(Italic体)
+%    \begin{macrocode}
+    \DeclareFieldFormat[article]{journaltitle}{\iffieldequalstr{userd}{chinese}{##1}{\textit{##1}}\isdot}
+%    \end{macrocode}
+% \tn{parencite}命令引用标注后导分割符
+%    \begin{macrocode}
+    \renewcommand{\postnotedelim}{\addcolon\space}
+%    \end{macrocode}
+% 删除\tn{parencite}命令引用标注中有页码选项时的p. pp.字符
+%    \begin{macrocode}
+    \DeclareFieldFormat{postnote}{##1}
+%    \end{macrocode}
+% 引用标注作者年制中作者和年份之间的标点(人名与年之间用空格分隔)
+%    \begin{macrocode}
+    \DeclareDelimFormat[cite,parencite,pagescite]{nameyeardelim}{\space}
+    \DeclareDelimFormat[textcite]{nameyeardelim}{\space}
+%    \end{macrocode}
+% 文献著录列表中作者与年之间的分割符(最后一个作者后用点)
+%    \begin{macrocode}
+    \DeclareDelimFormat[bib,biblist]{nameyeardelim}{\addperiod\space}
+%    \end{macrocode}
+% 删除文献著录列表中最后的点
+%    \begin{macrocode}
+    \renewcommand*{\finentrypunct}{}
+%    \end{macrocode}
+% 修改部分中文化字符串
+%    \begin{macrocode}
+    \DefineBibliographyStrings{english}{
+        andincitecn = {和},
+        andincite   = {and},
+        mathesiscn={[硕士学位论文]},
+        phdthesiscn={[博士学位论文]},
+        in={In:\addspace},
+        incn={见:\addspace},
+      }
+%    \end{macrocode}
+% 修改最后一个作者前的字符串,比如“and”、“和”。
+%
+% 原理方法:默认情况下判断作者或译者是否中文,若中文用字符andcn=“和”,否则用and=“and”。
+% 非默认情况,根据选项信息,选择选择强制中文或英文
+% 首先设置全局的,然后设置文献表中的,这一等价于将所有的cite命令环境都设置过了
+% 而不用对每一个引用命令单独设置,比如cite,parancite,textcite都设置
+%    \begin{macrocode}
+    \DeclareDelimFormat{finalnamedelim}{%
+        \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}%
+        \edef\userfieldabcde{userd}%
+        \ifcurrentname{translator}{\edef\userfieldabcde{usere}}{}%
+        \ifcurrentname{editor}{\edef\userfieldabcde{userc}}{}%
+        \ifcurrentname{author}{\edef\userfieldabcde{userf}}{}%
+        \ifcurrentname{bookauthor}{\edef\userfieldabcde{userb}}{}%
+        \ifcase\value{gbcitelocalcase}%
+          \iffieldequalstr{\userfieldabcde}{chinese}{\bibstring{andincitecn}}{}%
+          \iffieldequalstr{\userfieldabcde}{korean}{\bibstring{andkr}}{}%
+          \iffieldequalstr{\userfieldabcde}{japnese}{\bibstring{andjp}}{}%
+          \iffieldequalstr{\userfieldabcde}{english}{\addspace\bibstring{andincite}\addspace}{}%
+          \iffieldequalstr{\userfieldabcde}{french}{\addspace\bibstring{and}\addspace}{}%
+          \iffieldequalstr{\userfieldabcde}{russian}{\addspace\bibstring{and}\addspace}{}%
+        \or%
+        \bibstring{andincitecn}%
+        \or%
+        \addspace\bibstring{andincite}\addspace%
+        \fi
+      }
+%    \end{macrocode}
+% 20190215, 胡振震邮件指导代码
+% 去掉超过3个著者时汉字“等”前的空格(GB/T 7714-2015规定需要有空格)
+%    \begin{macrocode}
+    \DeclareDelimFormat{strandothersdelim}{%
+        \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}%
+        %\addspace%
+        \edef\userfieldabcde{userd}%
+        \ifcurrentname{translator}{\edef\userfieldabcde{usere}}{}%
+        \ifcurrentname{editor}{\edef\userfieldabcde{userc}}{}%
+        \ifcurrentname{author}{\edef\userfieldabcde{userf}}{}%
+        \ifcurrentname{bookauthor}{\edef\userfieldabcde{userb}}{}%
+        \ifcase\value{gbcitelocalcase}%
+          \iffieldequalstr{\userfieldabcde}{chinese}{\bibstring{andothersincitecn}}{}%
+          \iffieldequalstr{\userfieldabcde}{korean}{\bibstring{andotherskr}}{}%
+          \iffieldequalstr{\userfieldabcde}{japnese}{\bibstring{andothersjp}}{}%
+          \iffieldequalstr{\userfieldabcde}{english}{\bibstring{andothersincite}}{}%
+          \iffieldequalstr{\userfieldabcde}{french}{\bibstring{andothers}}{}%
+          \iffieldequalstr{\userfieldabcde}{russian}{\bibstring{andothers}}{}%
+        \or%
+        \bibstring{andothersincitecn}%
+        \or%
+        \bibstring{andothersincite}%
+        \fi
+      }
+%    \end{macrocode}
+% 设置andothersdelim
+%    \begin{macrocode}
+    \AtEveryCitekey{%
+        \iffieldequalstr{userf}{chinese}{\renewcommand*{\andothersdelim}{}}%\addthinspace
+        {\renewcommand*{\andothersdelim}{\addspace}}%
+      }
+%    \end{macrocode}
+% 标注压缩时,直接用date+extradate代替extradate实现2006a,2006b的效果
+%    \begin{macrocode}
+    \renewbibmacro*{cite:extradate}{%
+        \iffieldundef{extradate} {}
+        {\printtext[bibhyperref]{\printlabeldateextra}}%\printfield{extradate}
+      }
+%    \end{macrocode}
+% 文献表中的日期格式
+%    \begin{macrocode}
+    \renewbibmacro*{date+extradate}{%
+        \iffieldundef{labelyear}{}%
+        {\ifboolexpr{%
+           test {\ifentrytype{patent}}
+           or
+           (test {\ifentrytype{newspaper}} )%
+         }%
+         {\printtext{\blx at isodate{}{}}}%
+         {\printtext{%
+             \iflabeldateisdate
+             {\printdateextra}
+             {\printlabeldateextra}
+          }
+         }%
+        }%
+      }
+    \newbibmacro*{origdate+extradate}{%
+        \printtext{\printorigdate}%
+      }
+%    \end{macrocode}
+% 修改译者位置格式
+%    \begin{macrocode}
+    \renewbibmacro*{bytranslator+others}{%
+        \ifnameundef{translator}
+          {}
+          {\printnames[bytranslator]{translator}%
+           \usebibmacro{bytranslator+othersstrg}%“译”的位置换到下面来,即放到译者后面。
+           \newunit
+          }%
+        \usebibmacro{withothers}%
+        \ifboolexpr{%
+          test {\iffieldundef{origyear}} or test {\ifnameundef{translator}}%%
+        }{}{\printtext{\printdate}}%
+      }
+%    \end{macrocode}
+% url和url日期格式
+%    \begin{macrocode}
+    \renewbibmacro*{url+urldate}{%
+        \usebibmacro{url}%
+        \iffieldundef{urlyear}%
+        {}
+        {\usebibmacro{urldate}
+        }
+      }
+    \DeclareFieldFormat{addnumflag}{%
+        \ifentrytype{newspaper}
+        {\setunit{\addcomma\addspace}\printtext{##1}}
+        {\nobreak\printtext{(}\nobreak ##1\nobreak\printtext{)}}
+      }
+%    \end{macrocode}
+% 重设专利title的输出,输出文献类型标识符
+%    \begin{macrocode}
+    \renewbibmacro*{patenttitle}{%原输出来自biblatex.def文件
+        \ifboolexpr{%
+          test{\iffieldundef{title}}%
+          and%
+          test{\iffieldundef{subtitle}}%
+        }%
+        {}%
+        {
+          \printtext[title]{\bibtitlefont%
+          \printfield[titlecase]{title}%
+          \ifboolexpr{test {\iffieldundef{subtitle}}}%这里增加了对子标题的判断,解决不判断多一个点的问题
+          {}
+          {
+            \setunit{\subtitlepunct}%
+            \printfield[titlecase]{subtitle}}%
+            \iffieldundef{titleaddon}{}%判断一下titleaddon,否则直接加可能多一个空格
+            {\setunit{\subtitlepunct}\printfield{titleaddon}}%
+            \setunit{\adddot\addspace}\printfield{number}%写专利号
+            \iftoggle{bbx:gbtype}{\printfield[gbtypeflag]{usera}}{}%
+          }%
+        }%
+      }
+%    \end{macrocode}
+% 修改作者数量超过限定值,省略时的处理格式
+% 20190103,hzz,修改利用新定义的一个分隔符strandothersdelim
+%
+% 原理方法:判断作者或译者是否中文,若中文用字符等,否则用et al. 。
+%    \begin{macrocode}
+    \renewbibmacro*{name:andothers}{%
+        \ifboolexpr{
+          test {\ifnumequal{\value{listcount}}{\value{liststop}}}
+          and
+          test \ifmorenames
+        }{\ifnumgreater{\value{liststop}}{1}%
+            {\finalandcomma}%
+            {}%
+            \printdelim{andothersdelim}\printdelim{strandothersdelim}%
+        }{%当是译者的时候需要特殊处理
+          \ifcurrentname{translator}{\addcomma}{}%
+        }
+      }
+%    \end{macrocode}
+% 修改对edition版本信息格式
+%    \begin{macrocode}
+    \DeclareFieldFormat{edition}{%
+        \testCJKfirst{userd}%
+        \iftoggle{ifCJKforgbt}%
+        {\ifinteger{##1}%
+          {\printtext{\bibstring{serialcn}\zhnumber{##1}\str at edition}}%
+          {##1\isdot}
+        }%
+        {\ifinteger{##1}%
+          {\mkbibordedition{##1}~\bibstring{edition}}%
+          {##1\isdot}
+        }
+      }
+%    \end{macrocode}
+% 注意这里当没有作者只有标题时在年份之前的标点是否需要
+% 标准并未涉及,所以未做处理。
+%    \begin{macrocode}
+    \renewbibmacro*{author}{%
+        \ifboolexpr{
+          test \ifuseauthor
+          and
+          not test {\ifnameundef{author}}
+        }{\usebibmacro{bbx:dashcheck}
+           {\printnames{author}\setunit{\printdelim{nameyeardelim}}%把标点也带上
+           }{\usebibmacro{bbx:savehash}%
+             \printnames{author}%
+             \iffieldundef{authortype}
+               {\setunit{\printdelim{nameyeardelim}}}
+               {\setunit{\printdelim{authortypedelim}}}
+           }%
+           \iffieldundef{authortype}
+             {}
+             {\usebibmacro{authorstrg}%
+              \setunit{\printdelim{nameyeardelim}}
+             }
+        }%
+        {\global\undef\bbx at lasthash
+         \usebibmacro{labeltitle}%
+         \setunit*{\printdelim{nonameyeardelim}}
+        }%
+        \ifboolexpr{%
+          test {\iffieldundef{origyear}} or test {\ifnameundef{translator}}%
+        }{\usebibmacro{date+extradate}}%
+        {\usebibmacro{origdate+extradate}}%
+      }
+%    \end{macrocode}
+% book条目类的驱动
+%    \begin{macrocode}
+    \DeclareBibliographyDriver{book}{%源来自standard.bbx文件
+        \usebibmacro{bibindex}%
+        \usebibmacro{begentry}%
+        \usebibmacro{author/editor+others/translator+others}%
+        \ifnameundef{author}{}{\setunit{\labelnamepunct}\newblock}%这一段用于去除作者不存在时多出的标点
+        \usebibmacro{maintitle+title}%
+        \iftoggle{bbx:gbstrict}{}{%
+          \newunit%
+          \printlist{language}%
+          \newunit\newblock%
+          \usebibmacro{byauthor}%
+          \newunit\newblock%
+        }%
+        \newunit%
+        \printfield{edition}%
+        \newunit%
+        \usebibmacro{byeditor+others}%
+        \newunit\newblock%
+        \iftoggle{bbx:gbstrict}{}{%
+          \iffieldundef{maintitle}%
+          {%
+            \printfield{volume}%
+            \printfield{part}%
+          }%
+          {}%
+          \newunit%
+          \printfield{volumes}%
+          \newunit\newblock%
+          \usebibmacro{series+number}%
+        }%
+        \newunit\newblock%
+        \usebibmacro{publisher+location+date}%
+        \usebibmacro{chapter+pages}%
+        \iffieldundef{url}{}{%当没有网址时也不输出
+          \usebibmacro{modifydate}%带括号的修改或更新日期,
+        }%
+        \usebibmacro{doi+eprint+url}%从下面移动到上面来,因为gbt2015的url需直接放在页码后面。
+        \newunit\newblock%
+        \printfield{pagetotal}%
+        \newunit\newblock%
+        \iftoggle{bbx:isbn}%
+          {\printfield{isbn}}
+          {}%
+        \newunit\newblock%
+        \usebibmacro{addendum+pubstate}%
+        \setunit{\bibpagerefpunct}\newblock
+        \usebibmacro{pageref}%
+        \newunit\newblock%
+        \iftoggle{bbx:related}%
+          {\usebibmacro{related:init}%
+           \usebibmacro{related}%
+          }{}%
+        \usebibmacro{finentry}
+      }
+%    \end{macrocode}
+% 在线文献驱动
+%    \begin{macrocode}
+    \DeclareBibliographyDriver{online}{%源来自standard.BBX
+        \usebibmacro{bibindex}%
+        \usebibmacro{begentry}%
+        \usebibmacro{author/editor+others/translator+others}%
+        \ifnameundef{author}{}{\setunit{\labelnamepunct}\newblock}%这一段用于去除作者不存在时多出的标点
+        \usebibmacro{title}%
+        \iftoggle{bbx:gbstrict}{}{%
+          \newunit%
+          \printlist{language}%
+          \newunit\newblock
+          \usebibmacro{byauthor}%
+          \newunit\newblock
+          \usebibmacro{byeditor+others}%
+          \newunit\newblock
+          \printfield{note}
+        }%
+        \newunit
+        \printfield{version}%
+        \newunit\newblock
+        \printlist{institution}%
+        \newunit\newblock
+        \ifboolexpr{%
+          test{\iffieldundef{day}} and test{\iffieldundef{endday}} and test{\iffieldundef{eventday}}%
+        }{\usebibmacro{date}}%
+        \usebibmacro{url+urldate}%从下面移上来
+        \newunit\newblock
+        \iftoggle{bbx:eprint}
+          {\usebibmacro{eprint}}
+          {}%
+        \newunit\newblock
+        \usebibmacro{addendum+pubstate}%
+        \setunit{\bibpagerefpunct}\newblock
+        \usebibmacro{pageref}%
+        \newunit\newblock
+        \iftoggle{bbx:related}
+          {\usebibmacro{related:init}%
+           \usebibmacro{related}}
+          {}%
+        \usebibmacro{finentry}
+      }
+%    \end{macrocode}
+% 专利文献驱动
+%    \begin{macrocode}
+    \DeclareBibliographyDriver{patent}{%源来自standard.BBX
+        \usebibmacro{bibindex}%
+        \usebibmacro{begentry}%
+        \usebibmacro{author}%
+        \ifnameundef{author}{}{\setunit{\labelnamepunct}\newblock}%这一段用于去除作者不存在时多出的标点
+        \usebibmacro{patenttitle}%给出专利专用的标题输出
+        \iftoggle{bbx:gbstrict}{}{%
+          \newunit%
+          \printlist{language}%
+          \newunit\newblock
+          \usebibmacro{byauthor}
+        }%
+        \newunit\newblock
+        \printfield{type}%
+        \setunit*{\addspace}%
+        \iflistundef{location}
+          {}
+          {\setunit*{\addspace}%
+           \printtext{%[parens]
+           \printlist[][-\value{listtotal}]{location}}
+          }%
+        \newunit\newblock
+        \usebibmacro{byholder}%
+        \newunit\newblock
+        \printfield{note}%
+        \newunit\newblock
+        \usebibmacro{doi+eprint+url}%
+        \newunit\newblock
+        \usebibmacro{addendum+pubstate}%
+        \setunit{\bibpagerefpunct}\newblock
+        \usebibmacro{pageref}%
+        \newunit\newblock
+        \iftoggle{bbx:related}
+          {\usebibmacro{related:init}%
+           \usebibmacro{related}
+          }
+          {}%
+        \usebibmacro{finentry}
+      }
+%    \end{macrocode}
+% 间距的控制
+%    \begin{macrocode}
+    \setlength{\bibitemsep}{2pt}
+    \setlength{\bibnamesep}{0ex}
+    \setlength{\bibinitsep}{0ex}
+%    \end{macrocode}
+% 文献著录条目缩进控制(悬挂缩进4英文字符)
+%    \begin{macrocode}
+    \setlength{\bibitemindent}{-2\ccwd}% bibitemindent表示一条文献中第一行相对后面各行的缩进
+    \setlength{\bibhang}{2\ccwd} % 表示的各行起始位置到页边的距离
+  }
+%    \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 at biburlucpenalty  \c_one_int
+    \int_set_eq:NN \c at biburlnumpenalty \c_one_int
+    \int_set_eq:NN \c at biburllcpenalty  \c_one_int
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_cite_style_author_year:}
+% 著者—出版年制下的引用样式。
+%    \begin{macrocode}
+\cs_new:Npn \@@_set_cite_style_author_year:
+  {
+    \NAT at numbersfalse
+%<*class>
+    \cs_set_eq:NN \NAT at open  \c_@@_fwid_left_paren_tl
+    \cs_set_eq:NN \NAT at close \c_@@_fwid_right_paren_tl
+    \cs_set_eq:NN \NAT at sep   \c_@@_fwid_semicolon_tl
+    \cs_set_eq:NN \NAT at aysep \c_@@_fwid_comma_tl
+    \cs_set_eq:NN \NAT at yrsep \c_@@_ideo_comma_tl
+%</class>
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{间距设置}
+%
+% 段落间距
+%    \begin{macrocode}
+\skip_set:Nn \parskip { 0pt plus 2pt minus 1pt }
+%    \end{macrocode}
+% 浮动体顶商与底端所留距离
+%    \begin{macrocode}
+\skip_set:Nn \intextsep { 14pt plus 2pt minus 2pt }
+%    \end{macrocode}
+% 最后一个浮动对象顶端或第一个浮动对象底端与正文之间的距离
+%    \begin{macrocode}
+\skip_set:Nn \textfloatsep { 16pt plus 2pt minus 4pt }
+\allowdisplaybreaks[4]
+\ctex_after_end_preamble:n
+  {
+%    \end{macrocode}
+% 公式前的距离
+%    \begin{macrocode}
+    \skip_set:Nn \abovedisplayskip { 5pt plus 1pt minus 1pt }
+%    \end{macrocode}
+% 公式后的距离
+%    \begin{macrocode}
+    \skip_set:Nn \belowdisplayskip { 5pt plus 1pt minus 1pt }
+%    \end{macrocode}
+% 公式前与文本的距离
+%    \begin{macrocode}
+    \skip_set:Nn \abovedisplayshortskip { 0pt }
+%    \end{macrocode}
+% 公式后与文本的距离
+%    \begin{macrocode}
+    \skip_set:Nn \belowdisplayshortskip { 5pt plus 1pt minus 1pt }
+  }
+%    \end{macrocode}
+%
+% \subsection{\env{enumerate}列表环境设置}
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_enumitem_label_set:nn #1#2
+  { \SetEnumitemValue{label}{#1}{#2} }
+\clist_map_inline:nn
+  {
+    { bullet   } { \textbullet                      },
+    { endash   } { \normalfont\bfseries\textendash  },
+    { asterisk } { \textasteriskcentered            },
+    { arabic   } { \bool_if:NTF \l_@@_withchap_bool
+                      { \arabic*. }{ (\arabic*) }   },
+    { alph     } { \bool_if:NTF \l_@@_withchap_bool
+                      { \alph*. }{ (\alph*) }       },
+    { roman    } { \bool_if:NTF \l_@@_withchap_bool
+                      { \roman*. }{ (\roman*) }     },
+    { alph     } { (\alph*)                         },
+    { roman    } { \roman*.                         },
+    { outline  } { \upshape\ding{111}               }
+  }
+  { \@@_enumitem_label_set:nn #1 }
+\SetEnumitemValue{font}{sf}{\normalfont\sffamily}
+\SetEnumitemValue{ref}{enumii}{\arabic{enumi}.\alph*}
+\SetEnumitemValue{ref}{enumiii}{\arabic{enumi}.\alph{enumii}.\roman*}
+\setlist
+  {
+    nosep,
+    leftmargin = *,
+    labelindent = \dimexpr\parindent+0pt\relax,
+    wide=\parindent,
+  }
+\setlist[itemize,1]{label = bullet}
+\setlist[itemize,2]{label = endash}
+\setlist[itemize,3]{label = asterisk}
+\setlist[enumerate,1]{label = arabic,ref = \arabic*}
+\setlist[enumerate,2]{label = alph,ref = enumii}
+\setlist[enumerate,3]{label = roman,ref = enumiii,labelwidth = *}
+\setlist[description]{font = sf,labelwidth = *,leftmargin = 2\ccwd}
+%    \end{macrocode}
+%
+% \subsection{\pkg{hyperref} 相关配置}
+%
+% \emph{\pkg{hyperref}相关配置完成使用\cls{fduthesis}模板的代码}。
+%
+% \begin{macro}{\hypersetup,\nwafu_hyperref_setup:n}
+% \pkg{hyperref} 宏包是在导言区之后才引入的。若要在导言区中使用
+% \tn{hypersetup} 命令,必须另行定义。
+%    \begin{macrocode}
+\NewDocumentCommand \hypersetup { m }
+  { \nwafu_hyperref_setup:n {#1} }
+\cs_new_protected:Npn \nwafu_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} }
+        \nwafu_hyperref_setup:n
+          {
+            linkcolor = nwafu at link, linkbordercolor = nwafu at link,
+            urlcolor  = nwafu at url,  urlbordercolor  = nwafu at url,
+            citecolor = nwafu at cite, citebordercolor = nwafu at 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 } { nwafu@ } { }
+      { link, #1; url, #2; cite, #3 }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\keys_define:nx { nwafu / style }
+  {
+%    \end{macrocode}
+%
+% \begin{macro}{style/hyperlink}
+% 超链接样式。
+%    \begin{macrocode}
+    hyperlink .choice:,
+    hyperlink .value_required:n = true,
+    hyperlink / border .code:n = { },
+    hyperlink / color  .code:n =
+      { \nwafu_hyperref_setup:n { colorlinks = true } },
+    hyperlink / none   .code:n =
+      { \nwafu_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}
+%
+% \begin{macro}{\nwafu_allow_url_break:,\@@_add_url_break_points:}
+% 允许 URL 在字母、数字和一些特殊符号处断行。见
+% \url{https://bit.ly/2hhIjLW}。
+%    \begin{macrocode}
+\cs_new:Npn \nwafu_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,
+        psdextra          = true,
+        unicode           = true,
+%    \end{macrocode}
+% 填写 PDF 元信息。
+%    \begin{macrocode}
+%<*class>
+        pdftitle    = \l_@@_info_title_tl,
+        pdfauthor   = \l_@@_info_author_tl,
+        pdfkeywords = \l_@@_abstract_keywords_clist,
+%</class>
+%       pdfsubject  = ,
+        pdfcreator  = \c_@@_name_pdf_creator_tl
+      }
+%    \end{macrocode}
+% 将导言区中通过 \cs{nwafu_hyperref_setup:n} 进行的设置传入
+% \tn{hypersetup}。
+%    \begin{macrocode}
+    \exp_args:NV \hypersetup \g_@@_to_hyperref_clist
+%    \end{macrocode}
+% URL 断行处理。
+%    \begin{macrocode}
+    \nwafu_allow_url_break:
+%    \end{macrocode}
+% 手动开启 \pkg{biblatex} 的 \pkg{hyperref} 支持。
+%    \begin{macrocode}
+    \BiblatexManualHyperrefOn
+  }
+%    \end{macrocode}
+%
+% 在 PDF 字符串中设置 \tn{nwafu at kai} 命令为空,以抑制 \pkg{hyperref}
+% 的警告信息。
+%    \begin{macrocode}
+\ctex_at_end_package:nn { hyperref }
+  {
+    \pdfstringdefDisableCommands
+      {
+        \cs_set_eq:NN \nwafu at kai \prg_do_nothing:
+        \cs_set_eq:NN \quad    \c_space_tl
+        \cs_set_eq:NN \qquad   \c_space_tl
+      }
+  }
+%    \end{macrocode}
+%
+% 引用标题配置。
+%    \begin{macrocode}
+\labelformat{part}{\CTEXthepart}
+\labelformat{chapter}{\CTEXthechapter}
+\labelformat{figure}{\figurename~#1}
+\labelformat{table}{\tablename~#1}
+\def\figureautorefname{图}
+\def\tableautorefname{表}
+\keys_set_known:nn { ctex }
+  {
+    figurename          = 图,
+    tablename           = 表,
+  }
+\labelformat{equation}{式(#1)}
+\labelformat{section}{节 #1}
+\labelformat{subsection}{小节 #1}
+%    \end{macrocode}
+%
+% \subsection{用户接口}
+%
+% \begin{macro}{abstract,info,style}
+% 定义元(meta)键值对。
+%    \begin{macrocode}
+\keys_define:nn { nwafu }
+  {
+    abstract  .meta:nn = { nwafu / abstract } {#1},
+    info      .meta:nn = { nwafu / info     } {#1},
+    style     .meta:nn = { nwafu / style    } {#1}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% 文档类初始设置。
+%    \begin{macrocode}
+\keys_set:nn { nwafu }
+  {
+    style   / font-size       = -4,
+    style   / fullwidth-stop  = false,
+    style   / auto-make-cover = true,
+    style   / logo            = { logo/nwafu-bar.pdf },
+    style   / logo-size       = { 0.65 \textwidth },
+    style   / hyperlink       = none,
+    style   / hyperlink-color = default,
+    info    / degree          = academic,
+    info    / secret-level    = none,
+    info    / school-id       = { 10712 },
+    info    / date            = { \zhtoday },
+    theorem / header-font     = { \sffamily },
+    theorem / body-font       = { \nwafu at kai },
+    theorem / counter         = { chapter }
+  }
+%    \end{macrocode}
+%
+% \begin{macro}{\nwafuset}
+% 用户设置接口。
+%    \begin{macrocode}
+\NewDocumentCommand \nwafuset { m }
+  { \keys_set:nn { nwafu } {#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>
+%    \end{macrocode}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+%
+%    \begin{macrocode}
+%<@@=>
+%    \end{macrocode}
+%
+% \clearpage
+%
+% \end{implementation}
+%


Property changes on: trunk/Master/texmf-dist/source/latex/nwafuthesis/nwafuthesis.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/nwafuthesis/nwafuthesis.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/nwafuthesis/nwafuthesis.cls	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/nwafuthesis/nwafuthesis.cls	2021-08-05 20:53:34 UTC (rev 60172)
@@ -0,0 +1,3729 @@
+%%
+%% This is file `nwafuthesis.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% nwafuthesis.dtx  (with options: `class')
+%% 
+%%     Copyright (C) 2019--2022 by Nan Geng <nangeng at nwafu.edu.cn>
+%% 
+%%     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 Nan Geng.
+%% 
+%%     This work consists of the files nwafuthesis.dtx,
+%%                                     nwafuthesis-doc.dtx,
+%%               and the derived files nwafuthesis.ins,
+%%                                     nwafuthesis.cls,
+%%                                     nwafudoc.cls,
+%% 
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}
+\GetIdInfo $Id: nwafuthesis.dtx 1.00 2021-05-12 15:30:00Z Nan Geng <nangeng at nwafu.edu.cn> $
+  {Thesis template for Northwest A\&F University}
+\ProvidesExplClass{\ExplFileName}
+  {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
+\RequirePackage { xparse, xtemplate, l3keys2e }
+\clist_map_inline:nn { expl3, xparse, xtemplate, l3keys2e }
+  {
+    \@ifpackagelater {#1} { 2018/05/12 }
+      { } { \msg_error:nnn { nwafuthesis } { l3-too-old } {#1} }
+  }
+\msg_new:nnn { nwafuthesis } { 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.
+  }
+\sys_if_engine_xetex:F
+  {
+    \sys_if_engine_luatex:F
+      {
+        \msg_fatal:nnx { nwafuthesis } { unsupported-engine }
+          { \c_sys_engine_str }
+      }
+  }
+\msg_new:nnn { nwafuthesis } { unsupported-engine }
+  {
+    The~ nwafuthesis~ class~ requires~ either~ XeTeX~ or~ LuaTeX. \\\\
+    "#1"~ is~ not~ supported~ at~ present.~ You~ must~ change \\
+    your~ typesetting~ engine~ to~ "xelatex"~ or~ "lualatex".
+  }
+\hook_gset_rule:nnnn { begindocument/before } { nwafuthesis } { < } { xeCJK }
+\box_new:N   \l__nwafu_tmpa_box
+\clist_new:N \l__nwafu_tmpa_clist
+\clist_new:N \l__nwafu_tmpb_clist
+\clist_new:N \l__nwafu_tmpc_clist
+\clist_new:N \l__nwafu_tmpd_clist
+\clist_new:N \l__nwafu_tmpt_clist
+\dim_new:N   \l__nwafu_tmpa_dim
+\dim_new:N   \l__nwafu_tmpb_dim
+\dim_new:N   \l__nwafu_tmpc_dim
+\dim_new:N   \l__nwafu_tmpd_dim
+\dim_new:N   \l__nwafu_tmpt_dim
+\skip_new:N  \l__nwafu_tmpa_skip
+\tl_new:N    \l__nwafu_tmpa_tl
+\tl_new:N    \l__nwafu_tmpb_tl
+\tl_new:N    \l__nwafu_tmpc_tl
+\tl_new:N    \l__nwafu_tmpd_tl
+\tl_new:N    \l__nwafu_tmpt_tl
+\int_new:N \g__nwafu_thesis_type_int
+\clist_new:N \g__nwafu_to_ctexbook_clist
+\clist_new:N \g__nwafu_to_hyperref_clist
+\bool_new:N \l__nwafu_withchap_bool
+\bool_new:N \g__nwafu_twoside_bool
+\bool_set_true:N \g__nwafu_twoside_bool
+\bool_new:N \g__nwafu_draft_bool
+\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 }
+\cs_new:Npn \__nwafu_quad:  { \skip_horizontal:n { 1 em } }
+\cs_new:Npn \__nwafu_qquad: { \skip_horizontal:n { 2 em } }
+\cs_new_protected:Npn \__nwafu_vspace:N #1
+  {
+    \dim_set_eq:NN \l__nwafu_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__nwafu_tmpa_dim
+  }
+\cs_new_protected:Npn \__nwafu_vspace:n #1
+  {
+    \skip_set:Nn \l__nwafu_tmpa_skip {#1}
+    \__nwafu_vspace:N \l__nwafu_tmpa_skip
+  }
+\cs_generate_variant:Nn \__nwafu_vspace:N { c }
+\cs_new:Npn \__nwafu_symbol:n #1 { \tex_char:D #1 \scan_stop: }
+\cs_new:Npn \__nwafu_arabic:n #1
+  { \int_to_arabic:v { c@ #1 } }
+\cs_new_protected:Npn \__nwafu_patch_cmd:Nnn #1#2#3
+  {
+    \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \__nwafu_preto_cmd:Nn #1#2
+  {
+    \ctex_preto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \__nwafu_appto_cmd:Nn #1#2
+  {
+    \ctex_appto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \__nwafu_at_begin_environment:nn #1#2
+  {
+    \seq_set_from_clist:Nn \l__nwafu_env_hook_name_seq {#1}
+    \seq_map_inline:Nn \l__nwafu_env_hook_name_seq
+      { \AtBeginEnvironment{##1}{#2} }
+  }
+\cs_new_protected:Npn \__nwafu_at_end_preamble:n
+  {
+    \ctex_gadd_ltxhook:nn { env/document/before }
+  }
+\cs_new_protected:Npn \__nwafu_define_fn_style:nn #1#2
+  { \tl_const:cn { c__nwafu_fn_style_ #1 _tl } {#2} }
+\cs_new_protected:Npn \__nwafu_define_punct:nn #1#2
+  { \tl_const:cn { c__nwafu_ #1 _tl } { \__nwafu_symbol:n {#2} } }
+\cs_new_protected:Npn \__nwafu_define_name:nn #1#2
+  { \tl_const:cn { c__nwafu_name_ #1 _tl } {#2} }
+\cs_new_protected:Npn \__nwafu_define_name:nnn #1#2#3
+  {
+    \tl_const:cn { c__nwafu_name_ #1    _tl } {#2}
+    \tl_const:cn { c__nwafu_name_ #1 _en_tl } {#3}
+  }
+\cs_new:Npn \__nwafu_msg_new:nn  { \msg_new:nnn      { nwafuthesis } }
+\cs_new:Npn \__nwafu_error:n     { \msg_error:nn     { nwafuthesis } }
+\cs_new:Npn \__nwafu_error:nn    { \msg_error:nnn    { nwafuthesis } }
+\cs_new:Npn \__nwafu_error:nx    { \msg_error:nnx    { nwafuthesis } }
+\cs_new:Npn \__nwafu_error:nnn   { \msg_error:nnnn   { nwafuthesis } }
+\cs_new:Npn \__nwafu_warning:n   { \msg_warning:nn   { nwafuthesis } }
+\cs_new:Npn \__nwafu_warning:nn  { \msg_warning:nnn  { nwafuthesis } }
+\cs_new:Npn \__nwafu_warning:nxx { \msg_warning:nnxx { nwafuthesis } }
+\cs_new:Npn \__nwafu_info:nx     { \msg_info:nnx     { nwafuthesis } }
+\keys_define:nn { nwafu / option }
+  {
+    type .choice:,
+    type .value_required:n = true,
+    type .choices:nn =
+      { doctor, master, bachelor }
+      { \int_set_eq:NN \g__nwafu_thesis_type_int \l_keys_choice_int },
+    type .initial:n = bachelor,
+    oneside .value_forbidden:n = true,
+    twoside .value_forbidden:n = true,
+    oneside .code:n =
+      {
+        \clist_gput_right:Nn \g__nwafu_to_ctexbook_clist { oneside }
+        \bool_set_false:N    \g__nwafu_twoside_bool
+      },
+    twoside .code:n =
+      {
+        \clist_gput_right:Nn \g__nwafu_to_ctexbook_clist { twoside, openany }
+        \bool_set_true:N     \g__nwafu_twoside_bool
+      },
+    draft .choice:,
+    draft / true  .code:n =
+      {
+        \bool_set_true:N     \g__nwafu_draft_bool
+        \clist_gput_right:Nn \g__nwafu_to_ctexbook_clist { draft }
+      },
+    draft / false .code:n =
+      { \bool_set_false:N    \g__nwafu_draft_bool },
+    draft .default:n = true,
+    draft .initial:n = false,
+    unknown .code:n = { \__nwafu_error:n { unknown-option } }
+  }
+\__nwafu_msg_new:nn { unknown-option }
+  { Class~ option~ "\l_keys_key_tl"~ is~ unknown. }
+\ProcessKeysOptions { nwafu / option }
+\NewDocumentCommand \nwafuthesis { }
+  {%
+    \makebox{\rmfamily%
+      N\hspace{-0.2ex}\raisebox{-0.5ex}{W}\raisebox{0.5ex}{\hspace{-0.2ex}\textsc{AFU}}\hspace{0.3ex}%
+      \textsc{Thesis}
+    }
+  }
+\NewDocumentCommand \datezh { }
+  {
+    \int_use:N \c_sys_year_int 年
+    \int_use:N \c_sys_month_int 月
+  }
+\prop_new:N \l__nwafu_dateen_prop
+\prop_set_from_keyval:Nn \l__nwafu_dateen_prop
+  {
+    1  = Jan.,
+    2  = Feb.,
+    3  = Mar.,
+    4  = Apr.,
+    5  = May.,
+    6  = Jun.,
+    7  = Jul.,
+    8  = Aug.,
+    9  = Sept.,
+    10 = Oct.,
+    11 = Nov.,
+    12 = Dec.,
+  }
+\NewDocumentCommand \dateen { }
+  {
+    \prop_get:NVN \l__nwafu_dateen_prop \c_sys_month_int \l__nwafu_tmpa_tl
+    \l__nwafu_tmpa_tl ,~ \int_use:N \c_sys_year_int
+  }
+\tl_const:Nn \c__nwafu_name_simp_tl { 西北农林科技大学            }
+\tl_const:Nn \c__nwafu_name_trad_tl { 西北農林科技大學            }
+\tl_const:Nn \c__nwafu_name_en_tl   { Northwest~ A\&F~ University }
+\clist_map_inline:nn
+  {
+    { ideo_comma       } { "3001 },
+    { ideo_full_stop   } { "3002 },
+    { fwid_comma       } { "FF0C },
+    { fwid_full_stop   } { "FF0E },
+    { fwid_colon       } { "FF1A },
+    { fwid_semicolon   } { "FF1B },
+    { fwid_left_paren  } { "FF08 },
+    { fwid_right_paren } { "FF09 }
+  }
+  { \__nwafu_define_punct:nn #1 }
+\fp_const:Nn \c__nwafu_line_spread_fp
+  { \dim_ratio:nn { 20 pt } { 12 bp } / 1.2 }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \tl_const:Nn \c__nwafu_orig_decl_text_tl
+      {
+        本人声明:所呈交的学位论文是我个人在导师指导下独立进行的研究工作及取
+        得的研究结果;论文中的研究数据及结果的获得完全符合学校《关于规范西北
+        农林科技大学研究生学术道德的暂行规定》,如果违反此规定,一切后果与法
+        律责任均由本人承担。\par
+        尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经
+        发表或撰写过的研究结果,也不包含其他人和自己本人已获得西北农林科技大
+        学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同事对本
+        研究所做的任何贡献均已在论文的致谢中作了明确的说明并表示了谢意。
+      }
+  }
+  {
+    \tl_const:Nn \c__nwafu_orig_decl_text_tl
+      {
+        本人声明:所呈交的毕业
+        \clist_item:Nn \c__nwafu_bachelor_type_clist { \l__nwafu_info_bachelor_type_int }
+        是我个人在导师指导下
+        独立进行的研究工作及取得的研究结果。尽我所知,除了文中特别加
+        以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究结果,
+        也不包含其他人和自己本人已获得\c__nwafu_name_simp_tl{}或其它教育
+        机构的学位或证书而使用过的材料。与我一同工作的同事对本研究所做
+        的任何贡献均已在论文的致谢中作了明确的说明并表示了谢意。
+        如违反此声明,一切后果与法律责任均由本人承担。
+      }
+  }
+\tl_const:Nn \c__nwafu_super_decl_text_tl
+  {
+    本人承诺:我的研究生{\__nwafu_text_uline:V \l__nwafu_info_author_tl}所呈交的
+    学位论文是在我指导下独立开展研究工作及取得的研究结果,属于我现
+    岗职务工作的结果,并严格按照学校《关于规范西北农林科技大学研究生学术
+    道德的暂行规定》而获得的研究结果。如果违反学校《关于规范西北农林科
+    技大学研究生学术道德的暂行规定》,我愿接受按学校有关规定的处罚处理并
+    承担相应导师连带责任。
+  }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \tl_const:Nn \c__nwafu_auth_decl_text_tl
+      {
+        本学位论文的知识产权归属西北农林科技大学。本人同意西北农林科技大学
+        保存或向国家有关部门或机构送交论文的纸质版和电子版,允许论文被查阅和
+        借阅;同意西北农林科技大学将本学位论文的全部或部分内容授权汇编录入
+        中国博士/硕士学位论文全文数据库》和《中国学位论文全文数据库》进行
+        出版,并享受相关权益。\par
+
+        本人保证,在毕业离开(或者工作调离)西北农林科技大学后,发表或者使用本
+        学位论文及其相关的工作成果时,将以西北农林科技大学为第一署名单位,否
+        则,愿意按《中华人民共和国著作权法》等有关规定接受处理并承担法律责任。\par
+
+        任何收存和保管本论文各种版本的其他单位和个人(包括研究生本人)未经本
+        论文作者的导师同意,不得有对本论文进行复制、修改、发行、出租、改编等
+        侵犯著作权的行为,否则,按违背《中华人民共和国著作权法》等有关规定处
+        理并追究法律责任。\par
+
+        {\sffamily (保密的学位论文在保密期限内,不得以任何方式发表、借阅、复印、
+            缩印或扫描复制手段保存、汇编论文)}
+      }
+  }
+  {
+    \tl_const:Nn \c__nwafu_auth_decl_text_tl
+      {
+        本毕业
+        \clist_item:Nn \c__nwafu_bachelor_type_clist { \l__nwafu_info_bachelor_type_int }
+        的知识产权归属\c__nwafu_name_simp_tl{}。
+        本人同意\c__nwafu_name_simp_tl{}保存或向国家有关部门或机构
+        送交论文的纸质版和电子版,允许论文被查阅和借阅。\par
+
+        本人保证,在毕业离开\c__nwafu_name_simp_tl{}后,发表或者使用本毕业
+        \clist_item:Nn \c__nwafu_bachelor_type_clist { \l__nwafu_info_bachelor_type_int }
+        及其相关的工作成果时,将以\c__nwafu_name_simp_tl{}
+        为第一署名单位,否则,愿意按《中华人民共和国著作权法》等
+        有关规定接受处理并承担法律责任。\par
+
+        任何收存和保管本论文各种版本的其他单位和个人(包括作者本人)未经
+        本论文作者的导师同意,不得有对本论文进行复制、修改、发行、出租、
+        改编等侵犯著作权的行为,否则,按违背《中华人民共和国著作权法》
+        等有关规定处理并追究法律责任。
+      }
+  }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \tl_const:Nn \c__nwafu_orig_decl_sign_tl
+      { 研究生签名 }
+    \tl_const:Nn \c__nwafu_super_decl_sign_tl
+      { 导师签名 }
+  }
+  {
+    \tl_const:Nn \c__nwafu_orig_decl_sign_tl
+      { 本科生签名 }
+    \tl_const:Nn \c__nwafu_super_decl_sign_tl
+      { 指导教师签名 }
+  }
+\clist_const:Nn \c__nwafu_auth_decl_sign_clist
+  { 作者签名, 导师签名, 日期 }
+\clist_const:Nn \c__nwafu_thesis_type_clist
+  { 博士学位论文, 硕士学位论文, 本科毕业 }
+\clist_const:Nn \c__nwafu_degree_type_clist
+  { 学术学位, 专业学位 }
+\clist_const:Nn \c__nwafu_bachelor_type_clist
+  { 论文, 设计 }
+\clist_const:Nn \c__nwafu_secret_clist { 限制, 秘密, 机密, 绝密 }
+\clist_map_inline:nn
+ {
+   { secret_level      } { 密级                          },
+   { udc               } { UDC                           },
+   { school_id         } { 学校代码                      },
+   { department        } { 学院                          },
+   { enroll            } { 年级                          },
+   { class_id          } { 班级                          },
+   { instructors       } { 指导小组                      },
+   { author_sign       } { 作者签名                      },
+   { supervisor_sign   } { 导师签名                      },
+   { sign_date         } { 日期                          },
+   { toc               } { 目 \quad 录                   },
+   { lof               } { 插图目录                      },
+   { lot               } { 表格目录                      },
+   { bib_en            } { Bibliography                  },
+   { ack               } { 致 \quad 谢                   },
+   { resume            } { 个人简历                      },
+   { pdf_creator       } { LaTeX~ with~ nwafuthesis~ class },
+ }
+ { \__nwafu_define_name:nn #1 }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \clist_map_inline:nn
+      {
+        { student_id      } { 研究生学号                       },
+        { orig_decl       } { 研究生学位论文的独创性声明       },
+        { super_decl      } { 导师指导研究生学位论文的承诺     },
+        { auth_decl       } { 关于研究生学位论文使用授权的说明 }
+      }
+      { \__nwafu_define_name:nn #1 }
+   }{
+    \clist_map_inline:nn
+      {
+        { major           } { 专业                           },
+        { student_id      } { 学号                           },
+        { author          } { 学生姓名                       },
+        { cosupervisor    } { 协助指导教师                   },
+        { date            } { 完成日期                       },
+        { orig_decl       } { 本科生毕业\clist_item:Nn
+                              \c__nwafu_bachelor_type_clist {
+                              \l__nwafu_info_bachelor_type_int
+                              }的独创性声明                  },
+        { auth_decl       } { 关于本科生毕业\clist_item:Nn
+                              \c__nwafu_bachelor_type_clist {
+                              \l__nwafu_info_bachelor_type_int
+                              }知识产权的说明                }
+      }
+      { \__nwafu_define_name:nn #1 }
+  }
+\clist_map_inline:nn
+  {
+    { supervisor } { 指导教师 } { Supervisor },
+  }
+  { \__nwafu_define_name:nnn #1 }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \clist_map_inline:nn
+      {
+        { major             } { 学科专业       } { Major                },
+        { researchfield     } { 研究方向       } { Research~ Field      },
+        { professionaltype  } { 专业学位类型   } { Degree~ Type         },
+        { professionalfield } { 领域名称       } { Field                },
+        { author            } { 论文作者       } { Candidate            },
+        { cosupervisor      } { 联合指导教师   } { Co-Supervisor        },
+        { date              } { 论文提交时间   } { Date~ of~ Submission },
+        { abstract          } { 摘 \quad 要    } { ABSTRACT             },
+        { keywords          } { 关键字         } { KEYWORDS             },
+        { clc               } { 分类号         } { CLC~ number:         },
+        { notation          } { 主要符号对照表 } { List~ of~ Symbols    }
+      }
+      { \__nwafu_define_name:nnn #1 }
+  }{
+    \clist_map_inline:nn
+      {
+        { abstract } { 摘要        } { Abstract          },
+        { keywords } { 关键字      } { Keywords          },
+        { clc      } { 分类号      } { CLC~ number       },
+      }
+      { \__nwafu_define_name:nnn #1 }
+  }
+\clist_map_inline:nn
+  {
+    { proof      } { 证明 } { Proof      },
+    { axiom      } { 公理 } { Axiom      },
+    { corollary  } { 推论 } { Corollary  },
+    { definition } { 定义 } { Definition },
+    { example    } { 例   } { Example    },
+    { lemma      } { 引理 } { Lemma      },
+    { theorem    } { 定理 } { Theorem    }
+  }
+  { \__nwafu_define_name:nnn #1 }
+\PassOptionsToClass
+  {
+    UTF8,
+    heading    = true,
+    fontset    = none,
+    zihao      = -4,
+    linespread = \c__nwafu_line_spread_fp,
+    \g__nwafu_to_ctexbook_clist
+  }
+  { ctexbook }
+\clist_map_inline:nn
+  {
+    { shortlabels       } { enumitem },
+    { no-math           } { fontspec },
+    { perpage           } { footmisc },
+    { amsmath, thmmarks } { ntheorem }
+  }
+  { \PassOptionsToPackage #1 }
+\RequirePackage { etoolbox }
+\LoadClass { ctexbook }
+\RequirePackage
+  {
+    amsmath,
+    unicode-math,
+    geometry,
+    fancyhdr,
+    titletoc,
+    footmisc,
+    ntheorem,
+    enumitem,
+    graphicx,
+    longtable,
+    booktabs,
+    caption,
+    xcolor,
+  }
+\cs_new_protected:Npn \__nwafu_check_package:nnn #1#2#3
+  {
+    \@ifpackagelater {#1} {#2}
+      { } { \__nwafu_error:nnn { package-too-old } {#1} {#3} }
+  }
+\__nwafu_msg_new:nn { package-too-old }
+  {
+    Package~ "#1"~ is~ too~ old. \\
+    The~ nwafuthesis~ 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.
+  }
+\__nwafu_check_package:nnn { ctex         } { 2017/08/07 } { 2.4.10 }
+\__nwafu_check_package:nnn { fontspec     } { 2017/09/22 } { 2.6e   }
+\__nwafu_check_package:nnn { unicode-math } { 2017/11/18 } { 0.8i   }
+\sys_if_engine_xetex:T
+  { \__nwafu_check_package:nnn { xeCJK          } { 2017/08/07 } { 3.5.0 } }
+\sys_if_engine_luatex:T
+  { \__nwafu_check_package:nnn { xunicode-addon } { 2018/04/30 } { 3.7.1 } }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \geometry
+      {
+        paper=a4paper,
+        top=3.1cm,
+        bottom=3.3cm,
+        left=2.6cm,
+        right=2.6cm,
+        headheight=0.8cm,
+        headsep=0.7cm,
+        footskip=1.4cm,
+        %includehead,
+        %includefoot,
+      }
+  }{
+    \geometry
+      {
+        paper=a4paper,
+        top=3.14cm,
+        bottom=3.8cm,
+        left=2.45cm,
+        right=2.45cm,
+        headheight=0.8cm,
+        headsep=0.63cm,
+        footskip=2.3cm,
+      }
+  }
+\bool_if:NT \g__nwafu_draft_bool { \geometry { showframe } }
+\tl_new:N \g__nwafu_fontset_tl
+\tl_new:N \g__nwafu_cjk_fontset_tl
+\keys_define:nn { nwafu / style }
+  {
+    font .choices:nn =
+      { garamond, libertinus, lm, palatino, times, times*, none }
+      { \tl_set_eq:NN \g__nwafu_fontset_tl \l_keys_choice_tl }
+  }
+\keys_define:nn { nwafu / style }
+  {
+    cjk-font .choices:nn =
+      { adobe, fandol, founder, mac, sinotype, sourcehan, windows, none }
+      { \tl_set_eq:NN \g__nwafu_cjk_fontset_tl \l_keys_choice_tl }
+  }
+\keys_define:nn { nwafu / style }
+  {
+    withchapter .bool_set:N = \l__nwafu_withchap_bool,
+    withchapter .default:n  = true,
+    withchapter .initial:n  = true,
+  }
+\cs_new_protected:Npn \__nwafu_setmainfont:nn #1#2
+  { \__fontspec_main_setmainfont:nn {#2} {#1} }
+\cs_new_protected:Npn \__nwafu_setsansfont:nn #1#2
+  { \__fontspec_main_setsansfont:nn {#2} {#1} }
+\cs_new_protected:Npn \__nwafu_setmonofont:nn #1#2
+  { \__fontspec_main_setmonofont:nn {#2} {#1} }
+\cs_new_protected:Npn \__nwafu_setmathfont:nn #1#2
+  { \__um_setmathfont:nn {#2} {#1} }
+\cs_new_protected:Npn \__nwafu_setCJKmainfont:nn #1#2
+  { \__nwafu_set_family:nnn { \CJKrmdefault } {#2} {#1} }
+\cs_new_protected:Npn \__nwafu_setCJKsansfont:nn #1#2
+  { \__nwafu_set_family:nnn { \CJKsfdefault } {#2} {#1} }
+\cs_new_protected:Npn \__nwafu_setCJKmonofont:nn #1#2
+  { \__nwafu_set_family:nnn { \CJKttdefault } {#2} {#1} }
+\cs_new_protected:Npn \__nwafu_set_cjk_font_hei:nn #1#2
+  { \__nwafu_set_family:nnn { nwafu at hei } {#2} {#1} }
+\cs_new_protected:Npn \nwafu at hei
+  { \__nwafu_switch_family:n { nwafu at hei } }
+\cs_new_protected:Npn \__nwafu_set_cjk_font_kai:nn #1#2
+  { \__nwafu_set_family:nnn { nwafu at kai } {#2} {#1} }
+\cs_new_protected:Npn \nwafu at kai
+  { \__nwafu_switch_family:n { nwafu at kai } }
+\tl_const:Nn \__nwafu_cjk_font_options:
+ { UprightFont = *, ItalicFont = *, AutoFakeBold = true }
+\tl_const:Nn \__nwafu_cjk_font_hei_options:
+ { UprightFont = *, ItalicFont = *, AutoFakeBold = false }
+\cs_new_protected:Npx \__nwafu_setCJKmainfont:n   #1
+  { \__nwafu_setCJKmainfont:nn   {#1} { \__nwafu_cjk_font_options: } }
+\cs_new_protected:Npx \__nwafu_setCJKsansfont:n   #1
+  { \__nwafu_setCJKsansfont:nn   {#1} { \__nwafu_cjk_font_hei_options: } }
+\cs_new_protected:Npx \__nwafu_setCJKmonofont:n   #1
+  { \__nwafu_setCJKmonofont:nn   {#1} { \__nwafu_cjk_font_options: } }
+\cs_new_protected:Npx \__nwafu_set_cjk_font_hei:n #1
+  { \__nwafu_set_cjk_font_hei:nn {#1} { \__nwafu_cjk_font_hei_options: } }
+\cs_new_protected:Npx \__nwafu_set_cjk_font_kai:n #1
+  { \__nwafu_set_cjk_font_kai:nn {#1} { \__nwafu_cjk_font_options: } }
+\sys_if_engine_xetex:TF
+  {
+    \cs_new_eq:NN \__nwafu_set_family:nnn  \xeCJK_set_family:nnn
+    \cs_new_eq:NN \__nwafu_switch_family:n \xeCJK_switch_family:n
+  }
+  {
+    \cs_new_eq:NN \__nwafu_set_family:nnn  \ctex_ltj_set_family:nnn
+    \cs_new_eq:NN \__nwafu_switch_family:n \ctex_ltj_switch_family:n
+  }
+\cs_new_protected:Npn \__nwafu_set_font_helper:n #1
+  {
+    \exp_args:Nc \RenewDocumentCommand { set #1 font } { O { } m O { } }
+      {
+        \ctex_at_end_preamble:n
+          { \use:c { __nwafu_set #1 font:nn } {##2} { ##1, ##3 } }
+      }
+  }
+\clist_map_inline:nn { main, sans, mono, math    } { \__nwafu_set_font_helper:n {#1} }
+\clist_map_inline:nn { CJKmain, CJKsans, CJKmono } { \__nwafu_set_font_helper:n {#1} }
+\tl_new:N \g__nwafu_font_family_libertinus_serif_tl
+\tl_new:N \g__nwafu_font_family_libertinus_sans_tl
+\tl_new:N \g__nwafu_font_style_libertinus_rm_tl
+\tl_new:N \g__nwafu_font_style_libertinus_bf_tl
+\tl_new:N \g__nwafu_font_style_libertinus_it_tl
+\tl_new:N \g__nwafu_font_style_libertinus_bfit_tl
+\tl_new:N \g__nwafu_font_style_libertinus_bfsl_tl
+\tl_new:N \g__nwafu_font_family_xits_tl
+\tl_new:N \g__nwafu_font_style_xits_rm_tl
+\tl_new:N \g__nwafu_font_style_xits_bf_tl
+\tl_new:N \g__nwafu_font_style_xits_it_tl
+\tl_new:N \g__nwafu_font_style_xits_bfit_tl
+\tl_new:N \g__nwafu_font_name_libertinus_serif_tl
+\tl_new:N \g__nwafu_font_name_libertinus_sans_tl
+\tl_new:N \g__nwafu_font_name_libertinus_math_tl
+\tl_new:N \g__nwafu_font_name_xits_tl
+\tl_new:N \g__nwafu_font_name_xits_math_rm_tl
+\tl_new:N \g__nwafu_font_name_xits_math_bf_tl
+\fontspec_font_if_exist:nTF { LibertinusSerif-Regular.otf }
+  {
+    \tl_set:Nn \g__nwafu_font_family_libertinus_serif_tl { LibertinusSerif }
+    \tl_set:Nn \g__nwafu_font_family_libertinus_sans_tl  { LibertinusSans  }
+    \tl_set:Nn \g__nwafu_font_family_libertinus_math_tl  { LibertinusMath  }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_rm_tl     { Regular         }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_bf_tl     { Bold            }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_it_tl     { Italic          }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_bfit_tl   { BoldItalic      }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_bfsl_tl   { BoldOblique     }
+  }
+  {
+    \tl_set:Nn \g__nwafu_font_family_libertinus_serif_tl { libertinusserif }
+    \tl_set:Nn \g__nwafu_font_family_libertinus_sans_tl  { libertinussans  }
+    \tl_set:Nn \g__nwafu_font_family_libertinus_math_tl  { libertinusmath  }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_rm_tl     { regular         }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_bf_tl     { bold            }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_it_tl     { italic          }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_bfit_tl   { bolditalic      }
+    \tl_set:Nn \g__nwafu_font_style_libertinus_bfsl_tl   { bolditalic      }
+  }
+\fontspec_font_if_exist:nTF { XITS-Regular.otf }
+  {
+    \tl_set:Nn \g__nwafu_font_family_xits_tl        { XITS             }
+    \tl_set:Nn \g__nwafu_font_style_xits_rm_tl      { Regular          }
+    \tl_set:Nn \g__nwafu_font_style_xits_bf_tl      { Bold             }
+    \tl_set:Nn \g__nwafu_font_style_xits_it_tl      { Italic           }
+    \tl_set:Nn \g__nwafu_font_style_xits_bfit_tl    { BoldItalic       }
+    \tl_set:Nn \g__nwafu_font_name_xits_math_rm_tl  { XITSMath-Regular }
+    \tl_set:Nn \g__nwafu_font_name_xits_math_bf_tl  { XITSMath-Bold    }
+  }
+  {
+    \tl_set:Nn \g__nwafu_font_family_xits_tl        { xits          }
+    \tl_set:Nn \g__nwafu_font_style_xits_rm_tl      { regular       }
+    \tl_set:Nn \g__nwafu_font_style_xits_bf_tl      { bold          }
+    \tl_set:Nn \g__nwafu_font_style_xits_it_tl      { italic        }
+    \tl_set:Nn \g__nwafu_font_style_xits_bfit_tl    { bolditalic    }
+    \tl_set:Nn \g__nwafu_font_name_xits_math_rm_tl  { xits-math     }
+    \tl_set:Nn \g__nwafu_font_name_xits_math_bf_tl  { xits-mathbold }
+  }
+\tl_set:Nx \g__nwafu_font_name_libertinus_serif_tl
+  { \g__nwafu_font_family_libertinus_serif_tl - \g__nwafu_font_style_libertinus_rm_tl }
+\tl_set:Nx \g__nwafu_font_name_libertinus_sans_tl
+  { \g__nwafu_font_family_libertinus_sans_tl  - \g__nwafu_font_style_libertinus_rm_tl }
+\tl_set:Nx \g__nwafu_font_name_libertinus_math_tl
+  { \g__nwafu_font_family_libertinus_math_tl  - \g__nwafu_font_style_libertinus_rm_tl }
+\tl_set:Nx \g__nwafu_font_name_xits_tl
+  { \g__nwafu_font_family_xits_tl - \g__nwafu_font_style_xits_rm_tl }
+\cs_new_protected:Npn \__nwafu_load_font_garamond:
+  {
+    \__nwafu_setmainfont:nn { EBGaramond }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      }
+    \__nwafu_setsansfont:nn { \g__nwafu_font_family_libertinus_sans_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g__nwafu_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g__nwafu_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g__nwafu_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g__nwafu_font_style_libertinus_bfsl_tl
+      }
+    \__nwafu_setmonofont:nn { lmmonolt10 }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-oblique,
+        BoldItalicFont = *-boldoblique
+      }
+    \__nwafu_setmathfont:nn { Garamond-Math.otf } { }
+  }
+\cs_new_protected:Npn \__nwafu_load_font_libertinus:
+  {
+    \__nwafu_setmainfont:nn { \g__nwafu_font_family_libertinus_serif_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g__nwafu_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g__nwafu_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g__nwafu_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g__nwafu_font_style_libertinus_bfit_tl
+      }
+    \__nwafu_setsansfont:nn { \g__nwafu_font_family_libertinus_sans_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g__nwafu_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g__nwafu_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g__nwafu_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g__nwafu_font_style_libertinus_bfsl_tl
+      }
+    \__nwafu_setmonofont:nn { lmmonolt10 }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-oblique,
+        BoldItalicFont = *-boldoblique
+      }
+    \__nwafu_setmathfont:nn { \g__nwafu_font_name_libertinus_math_tl .otf } { }
+  }
+\cs_new_protected:Npn \__nwafu_load_font_lm:
+  { \__nwafu_setmathfont:nn { latinmodern-math.otf } { } }
+\cs_new_protected:Npn \__nwafu_load_font_palatino:
+  {
+    \__nwafu_setmainfont:nn { texgyrepagella }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic
+      }
+    \__nwafu_setsansfont:nn { \g__nwafu_font_family_libertinus_sans_tl }
+      {
+        Extension      = .otf,
+        UprightFont    = *-\g__nwafu_font_style_libertinus_rm_tl,
+        BoldFont       = *-\g__nwafu_font_style_libertinus_bf_tl,
+        ItalicFont     = *-\g__nwafu_font_style_libertinus_it_tl,
+        BoldItalicFont = *-\g__nwafu_font_style_libertinus_bfsl_tl,
+        Scale          = MatchUppercase
+      }
+    \__nwafu_setmonofont:nn { lmmonolt10 }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-oblique,
+        BoldItalicFont = *-boldoblique
+      }
+    \__nwafu_setmathfont:nn { texgyrepagella-math.otf } { }
+  }
+\cs_new_protected:Npn \__nwafu_load_font_times:
+  {
+    \__nwafu_setmainfont:nn { \g__nwafu_font_family_xits_tl }
+      {
+        Extension          = .otf,
+        UprightFont        = *-\g__nwafu_font_style_xits_rm_tl,
+        BoldFont           = *-\g__nwafu_font_style_xits_bf_tl,
+        ItalicFont         = *-\g__nwafu_font_style_xits_it_tl,
+        BoldItalicFont     = *-\g__nwafu_font_style_xits_bfit_tl
+      }
+    \__nwafu_setsansfont:nn { texgyreheros }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic
+      }
+    \__nwafu_setmonofont:nn { texgyrecursor }
+      {
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      }
+    \__nwafu_setmathfont:nn { \g__nwafu_font_name_xits_math_rm_tl .otf }
+      { BoldFont = \g__nwafu_font_name_xits_math_bf_tl .otf }
+  }
+\cs_new_protected:cpn { __nwafu_load_font_ times* : }
+  {
+    \__nwafu_setmainfont:nn { Times~ New~ Roman    } { }
+    \__nwafu_setsansfont:nn { Arial                } { }
+    \__nwafu_setmonofont:nn { Courier~ New         } { }
+    \__nwafu_setmathfont:nn { \g__nwafu_font_name_xits_math_rm_tl .otf }
+      { BoldFont = \g__nwafu_font_name_xits_math_bf_tl .otf }
+  }
+\cs_new_protected:Npn \__nwafu_load_cjk_font_adobe:
+  {
+    \__nwafu_setCJKmainfont:n   { AdobeSongStd-Light       }
+    \__nwafu_setCJKsansfont:n   { AdobeHeitiStd-Regular    }
+    \__nwafu_setCJKmonofont:n   { AdobeFangsongStd-Regular }
+    \__nwafu_set_cjk_font_hei:n { AdobeHeitiStd-Regular    }
+    \__nwafu_set_cjk_font_kai:n { AdobeKaitiStd-Regular    }
+  }
+\cs_new_protected:Npn \__nwafu_load_cjk_font_fandol:
+  {
+    \__nwafu_setCJKmainfont:nn   { FandolSong }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \__nwafu_setCJKsansfont:nn   { FandolHei  }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \__nwafu_setCJKmonofont:nn   { FandolFang }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Regular,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Regular
+      }
+    \__nwafu_set_cjk_font_hei:nn { FandolHei  }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \__nwafu_set_cjk_font_kai:nn { FandolKai  }
+      {
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Regular,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Regular
+      }
+  }
+\cs_new_protected:Npn \__nwafu_load_cjk_font_founder:
+  {
+    \__nwafu_setCJKmainfont:nn   { FZShuSong-Z01 }
+      {
+        UprightFont    = *,
+        BoldFont       = FZHei-B01,
+        ItalicFont     = FZKai-Z03,
+      }
+    \__nwafu_setCJKsansfont:n   { FZHei-B01      }
+    \__nwafu_setCJKmonofont:n   { FZFangSong-Z02 }
+    \__nwafu_set_cjk_font_hei:n { FZHei-B01      }
+    \__nwafu_set_cjk_font_kai:n { FZKai-Z03      }
+  }
+\cs_new_protected:Npn \__nwafu_load_cjk_font_mac:
+  {
+    \__nwafu_setCJKmainfont:nn   { STSongti-SC }
+      {
+        UprightFont    = *-Light,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Light,
+        BoldItalicFont = *-Bold
+      }
+    \__nwafu_setCJKsansfont:nn   { STHeitiSC   }
+      {
+        UprightFont    = *-Medium,
+        BoldFont       = *-Medium,
+        ItalicFont     = *-Medium,
+        BoldItalicFont = *-Medium
+      }
+    \__nwafu_setCJKmonofont:n    { STFangsong  }
+    \__nwafu_set_cjk_font_hei:nn { STHeitiSC   }
+      {
+        UprightFont    = *-Medium,
+        BoldFont       = *-Medium,
+        ItalicFont     = *-Medium,
+        BoldItalicFont = *-Medium
+      }
+    \__nwafu_set_cjk_font_kai:nn { STKaitiSC   }
+      {
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+  }
+\cs_new_protected:Npn \__nwafu_load_cjk_font_sinotype:
+  {
+    \__nwafu_setCJKmainfont:n   { STSong     }
+    \__nwafu_setCJKsansfont:n   { STHeiti    }
+    \__nwafu_setCJKmonofont:n   { STFangsong }
+    \__nwafu_set_cjk_font_hei:n { STHeiti    }
+    \__nwafu_set_cjk_font_kai:n { STKaiti    }
+  }
+\cs_new_protected:Npn \__nwafu_load_cjk_font_sourcehan:
+  {
+    \__nwafu_setCJKmainfont:nn { SourceHanSerifSC }
+      {
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \__nwafu_setCJKsansfont:nn { SourceHanSansSC  }
+      {
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Regular,
+        BoldItalicFont = *-Bold
+      }
+    \__nwafu_warning:n { source-han }
+  }
+\__nwafu_msg_new:nn { source-han }
+  { Font~ set~ `sourcehan'~ does~ not~ contain~ kaiti~ and~ fangsong. }
+\cs_new_protected:Npn \__nwafu_load_cjk_font_windows:
+  {
+    \__nwafu_setCJKmainfont:n   { SimSun   }
+    \__nwafu_setCJKsansfont:n   { SimHei   }
+    \__nwafu_setCJKmonofont:n   { FangSong }
+    \__nwafu_set_cjk_font_hei:n { SimHei   }
+    \__nwafu_set_cjk_font_kai:n { KaiTi    }
+  }
+\tl_new:N \l__nwafu_cjkfont_tl
+\tl_new:N \l__nwafu_font_tl
+\cs_new_protected:Npn \__nwafu_detect_platform:
+  {
+    \sys_if_platform_windows:TF
+      {
+        \tl_set:Nn \l__nwafu_cjkfont_tl { windows }
+        \tl_set:Nn \l__nwafu_font_tl { times* }
+      }
+      {
+        \__nwafu_if_platform_macos:TF
+          {
+            \tl_set:Nn \l__nwafu_cjkfont_tl { mac }
+            \tl_set:Nn \l__nwafu_font_tl { times* }
+          }{
+            \tl_set:Nn \l__nwafu_cjkfont_tl { fandol }
+            \tl_set:Nn \l__nwafu_font_tl { times }
+          }
+      }
+  }
+\cs_new_protected:Npn \__nwafu_if_platform_macos:TF
+  { \file_if_exist:nTF { /System/Library/Fonts/Menlo.ttc } }
+\cs_new_protected:Npn \__nwafu_load_font:
+  {
+    \tl_if_empty:NTF \g__nwafu_fontset_tl
+      {
+        \__nwafu_detect_platform:
+        \tl_gset_eq:NN \g__nwafu_fontset_tl \l__nwafu_font_tl
+      }{
+      }
+    \tl_if_empty:NTF \g__nwafu_cjk_fontset_tl
+      {
+        \__nwafu_detect_platform:
+        \tl_gset_eq:NN \g__nwafu_cjk_fontset_tl \l__nwafu_cjkfont_tl
+      }{
+      }
+    \use:c { __nwafu_load_font_     \g__nwafu_fontset_tl     : }
+    \use:c { __nwafu_load_cjk_font_ \g__nwafu_cjk_fontset_tl : }
+  }
+\ctex_at_end_preamble:n { \__nwafu_load_font: }
+\keys_set:nn { unicode-math }
+  {
+    math-style = ISO,
+    bold-style = ISO,
+  }
+\keys_define:nn { nwafu / style }
+  {
+    font-size .choice:,
+    font-size .value_required:n = true,
+    font-size / -4 .code:n = { },
+    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 } }
+      },
+    fullwidth-stop .choice:,
+    fullwidth-stop .value_required:n = true,
+    fullwidth-stop / catcode .code:n =
+      { \__nwafu_set_fullwidth_stop_catcode: },
+    fullwidth-stop / mapping .code:n =
+      {
+        \sys_if_engine_xetex:TF
+          {
+            \clist_gset:Nn \g__xeCJK_default_features_clist
+              { Mapping = fullwidth-stop }
+          }
+          {
+            \sys_if_engine_luatex:T
+              {
+                \__nwafu_warning:n { mapping-not-available }
+                \__nwafu_set_fullwidth_stop_catcode:
+              }
+          }
+      },
+    fullwidth-stop / false .code:n = { }
+  }
+\__nwafu_msg_new:nn { mapping-not-available }
+  {
+    Option~ "fullwidth-stop = mapping"~ is~ not~ available~ in~ LuaTeX. \\
+    "fullwidth-stop = catcode"~ will~ be~ set~ instead.
+  }
+\cs_new:Npn \__nwafu_set_fullwidth_stop_catcode:
+  {
+    \char_set_active_eq:nN { "3002 } \c__nwafu_fwid_full_stop_tl
+    \char_set_catcode_active:n { "3002 }
+  }
+\fancyhf { }
+\tl_new:N \l__nwafu_header_center_mark_tl
+\RenewDocumentCommand \cleardoublepage { }
+  {
+    \clearpage
+    \bool_if:NT \g__nwafu_twoside_bool
+      {
+        \int_if_odd:nF \c at page
+          { \hbox:n { } \thispagestyle { empty } \newpage }
+      }
+    \tl_gset:Nn \l__nwafu_header_center_mark_tl { }
+  }
+\pagestyle { fancy }
+\cs_gset_eq:NN \nwafuhead\fancyhead
+\cs_gset_eq:NN \nwafufoot\fancyfoot
+\RenewDocumentCommand{\frontmatter}{sO{Roman}}
+  {
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmatterfalse
+    \pagenumbering{#2}
+    \bool_if:NTF \g__nwafu_twoside_bool
+      {
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+          {
+            \nwafuhead[EC]{\small \nouppercase{
+                \c__nwafu_name_simp_tl \clist_item:Nn
+                \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+              }
+          }{
+            \nwafuhead[EC]{\small \nouppercase{ \leftmark } }
+          }
+      }{
+        \nwafuhead [ C ]
+          {
+            \small \nouppercase { \l__nwafu_header_center_mark_tl }
+          }
+      }
+    \nwafufoot[C]{\small\thepage}
+  }
+\RenewDocumentCommand{\mainmatter}{s}
+  {
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmattertrue
+    \pagenumbering{arabic}
+    \bool_if:NTF \g__nwafu_twoside_bool
+      {
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+          {
+            \nwafuhead[EC]{\small \nouppercase{
+                \c__nwafu_name_simp_tl \clist_item:Nn
+                \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+              }
+          }{
+            \nwafuhead[EC]{\small \nouppercase{ \l__nwafu_info_title_tl } }
+          }
+      }{
+        \nwafuhead [ C ]
+          {
+            \int_if_odd:nTF \c at page
+              {
+                \small \nouppercase{ \leftmark }
+              }{
+                \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+                  {
+                    \small \nouppercase{
+                        \c__nwafu_name_simp_tl \clist_item:Nn
+                        \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+                  }{
+                    \small \nouppercase{ \l__nwafu_info_title_tl }
+                  }
+              }
+          }
+      }
+    \int_compare:nNnTF{ \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \nwafufoot[C]{\small\thepage}
+      }{
+        \nwafufoot[C]{\small-\ \thepage\ -}
+      }
+  }
+\NewDocumentCommand{\bibmatter}{s}
+  {
+    \IfBooleanTF{#1}{\clearpage}{\cleardoublepage}
+    \@mainmattertrue
+    \bool_if:NTF \g__nwafu_twoside_bool
+      {
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+          {
+            \nwafuhead[EC]{\small \nouppercase{
+                \c__nwafu_name_simp_tl \clist_item:Nn
+                \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+              }
+          }{
+            \nwafuhead[EC]{\small \nouppercase{ \leftmark } }
+          }
+      }{
+        \nwafuhead [ C ]
+          {
+            \int_if_odd:nTF \c at page
+              {
+                \small \nouppercase{ \leftmark }
+              }{
+                \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+                  {
+                    \small \nouppercase{
+                        \c__nwafu_name_simp_tl \clist_item:Nn
+                        \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+                  }{
+                    \small \nouppercase{ \leftmark }
+                  }
+              }
+          }
+      }
+  }
+
+\__nwafu_appto_cmd:Nn \appendix
+  {
+    \clearpage
+    \bool_if:NTF \g__nwafu_twoside_bool
+      {
+        \nwafuhead[OC]{\small \nouppercase{ \@chapapp } }
+        \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+          {
+            \nwafuhead[EC]{\small \nouppercase{
+                \c__nwafu_name_simp_tl \clist_item:Nn
+                \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+              }
+          }{
+            \nwafuhead[EC]{\small \nouppercase{ \@chapapp } }
+          }
+      }{
+        \nwafuhead [ C ]
+          {
+            \int_if_odd:nTF \c at page
+              {
+                \small \nouppercase{ \@chapapp }
+              }{
+                \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+                  {
+                    \small \nouppercase{
+                        \c__nwafu_name_simp_tl \clist_item:Nn
+                        \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+                  }{
+                    \small \nouppercase{ \@chapapp }
+                  }
+              }
+          }
+      }
+  }
+
+\__nwafu_appto_cmd:Nn \backmatter
+  {
+    \clearpage
+    \bool_if:NTF \g__nwafu_twoside_bool
+      {
+        \nwafuhead[OC]{\small \nouppercase{ \leftmark } }
+        \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+          {
+            \nwafuhead[EC]{\small \nouppercase{
+                \c__nwafu_name_simp_tl \clist_item:Nn
+                \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+              }
+          }{
+            \nwafuhead[EC]{\small \nouppercase{ \leftmark } }
+          }
+      }{
+        \nwafuhead [ C ]
+          {
+            \int_if_odd:nTF \c at page
+              {
+                \small \nouppercase{ \leftmark }
+              }{
+                \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+                  {
+                    \small \nouppercase{
+                        \c__nwafu_name_simp_tl \clist_item:Nn
+                        \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int } }
+                  }{
+                    \small \nouppercase{ \leftmark }
+                  }
+              }
+          }
+      }
+  }
+\int_compare:nNnTF{ \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \keys_set:nn { ctex }
+      {
+        secnumdepth = 3,
+        chapter =
+          {
+            pagestyle   = fancy,
+            aftername   = \hspace*{1.0\ccwd},
+            format      = \zihao{3} \normalfont \nwafu at hei \bfseries \centering,
+            beforeskip  = 1.47\baselineskip,
+            afterskip   = 1.24\baselineskip,
+            number      = \__nwafu_arabic:n { chapter },
+            fixskip     = true
+          },
+        section =
+          {
+            format      = \zihao{-3} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 1.09\baselineskip,
+            afterskip   = 0.80\baselineskip,
+            fixskip     = true
+          },
+        subsection =
+          {
+            format      = \zihao{4} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 0.80\baselineskip,
+            fixskip     = true
+          },
+        subsubsection =
+          {
+            format      = \zihao{-4} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 0.40\baselineskip,
+            afterskip   = 0.40\baselineskip,
+            fixskip     = true
+          }
+      }
+  }{
+    \keys_set:nn { ctex }
+      {
+        secnumdepth = 3,
+        chapter =
+          {
+            pagestyle   = fancy,
+            name = { \bool_if:NT \l__nwafu_withchap_bool {第},
+                     \bool_if:NT \l__nwafu_withchap_bool {章} },
+            number      = \__nwafu_arabic:n { chapter },
+            aftername   = \hspace*{\ccwd},
+            format      = \zihao{3} \normalfont \nwafu at hei \bfseries \centering,
+            beforeskip  = 0.25\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true
+          },
+        section =
+          {
+            aftername   = \hspace*{0.5\ccwd},
+            format      = \zihao{4} \normalfont \nwafu at hei \bfseries \raggedright,
+            beforeskip  = 0.60\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true,
+            afterindent = true,
+          },
+        subsection =
+          {
+            aftername   = \hspace*{0.5\ccwd},
+            format      = \zihao{-4} \normalfont \nwafu at hei \bfseries,
+            beforeskip  = 0.60\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true,
+            afterindent = true,
+            % indent      = 2\ccwd,
+          },
+        subsubsection =
+          {
+            name        = {(,)},
+            aftername   = \hspace*{0.5\ccwd},
+            number      = \__nwafu_arabic:n { subsubsection },
+            format      = \zihao{-4} \normalfont,
+            beforeskip  = 0.60\baselineskip,
+            afterskip   = 0.65\baselineskip,
+            fixskip     = true,
+            % afterindent = true,
+            indent      = 2\ccwd,
+          }
+      }
+  }
+\cs_new_protected:Npn \__nwafu_chapter:n #1
+  {
+    \group_begin:
+      \ctexset { chapter / numbering = false }
+      \chapter {#1}
+      \__nwafu_chapter_header:n {#1}
+    \group_end:
+  }
+\cs_generate_variant:Nn \__nwafu_chapter:n { V }
+\cs_new_protected:Npn \__nwafu_chapter_no_toc:n #1
+  {
+    \chapter *           {#1}
+    \__nwafu_chapter_header:n {#1}
+    \pdfbookmark [0] {#1} { toc }
+  }
+\cs_generate_variant:Nn \__nwafu_chapter_no_toc:n { V }
+\cs_new_protected:Npn \__nwafu_chapter_header:n #1
+  {
+    \bool_if:NTF \g__nwafu_twoside_bool
+      { \markboth {#1} {#1} }
+      {
+        \markboth { } { }
+        \tl_gset:Nn \l__nwafu_header_center_mark_tl {#1}
+      }
+  }
+\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*      }
+  }
+  { \__nwafu_define_fn_style:nn #1 }
+\tl_new:N \l__nwafu_fn_style_tl
+\keys_define:nn { nwafu / style }
+  {
+    footnote-style .choices:nn =
+      {
+        plain,
+        libertinus, libertinus*, libertinus-sans,
+        pifont,     pifont*,     pifont-sans,     pifont-sans*,
+        xits,                    xits-sans,       xits-sans*
+      }
+      {
+        \tl_gset_eq:NN \l__nwafu_fn_style_tl \l_keys_choice_tl
+        \int_compare:nT { 5 <= \l_keys_choice_int <= 8 }
+          { \RequirePackage { pifont } }
+      },
+    footnote-style .value_required:n = true
+  }
+\cs_new:Npn \__nwafu_fn_symbol_libertinus:n #1
+  {
+    \int_compare:nTF { #1 >= 21 }
+      {
+        \int_compare:nTF { #1 >= 47 }
+          { \__nwafu_symbol:n { \int_eval:n { "24B6 - 47 + #1 } } }
+          { \__nwafu_symbol:n { \int_eval:n { "24D0 - 21 + #1 } } }
+      }
+      { \__nwafu_symbol:n { \int_eval:n { "2460 - 1 + #1 } } }
+  }
+\cs_new:Npn \__nwafu_fn_symbol_libertinus_neg:n #1
+  {
+    \int_compare:nTF { #1 >= 11 }
+      { \__nwafu_symbol:n { \int_eval:n { "24EB - 11 + #1 } } }
+      { \__nwafu_symbol:n { \int_eval:n { "2776 -  1 + #1 } } }
+  }
+\cs_new_eq:NN \__nwafu_fn_symbol_libertinus_sans:n \__nwafu_fn_symbol_libertinus:n
+\cs_new:Npn \__nwafu_fn_symbol_pifont:n #1
+  { \ding { \int_eval:n { 171 + #1 } } }
+\cs_new:Npn \__nwafu_fn_symbol_pifont_neg:n #1
+  { \ding { \int_eval:n { 181 + #1 } } }
+\cs_new:Npn \__nwafu_fn_symbol_pifont_sans:n #1
+  { \ding { \int_eval:n { 191 + #1 } } }
+\cs_new:Npn \__nwafu_fn_symbol_pifont_sans_neg:n #1
+  { \ding { \int_eval:n { 201 + #1 } } }
+\cs_new:Npn \__nwafu_fn_symbol_xits:n #1
+  {
+    \int_compare:nTF { #1 >= 10 }
+      {
+        \int_compare:nTF { #1 >= 36 }
+          { \__nwafu_symbol:n { \int_eval:n { "24B6 - 36 + #1 } } }
+          { \__nwafu_symbol:n { \int_eval:n { "24D0 - 10 + #1 } } }
+      }
+      { \__nwafu_symbol:n { \int_eval:n { "2460 - 1 + #1 } } }
+  }
+\cs_new:Npn \__nwafu_fn_symbol_xits_sans:n #1
+  { \__nwafu_symbol:n { \int_eval:n { "2780 - 1 + #1 } } }
+\cs_new:Npn \__nwafu_fn_symbol_xits_sans_neg:n #1
+  { \__nwafu_symbol:n { \int_eval:n { "278A - 1 + #1 } } }
+\cs_set:Npn \thefootnote { \nwafu_footnote_number:N \c at footnote }
+\cs_new:Npn \nwafu_footnote_number:N #1
+  {
+    \tl_case:NnF \l__nwafu_fn_style_tl
+      {
+        \c__nwafu_fn_style_plain_tl
+          { \int_use:N #1 }
+        \c__nwafu_fn_style_libertinus_tl
+          {
+            \fontspec { \g__nwafu_font_name_libertinus_serif_tl .otf }
+            \__nwafu_fn_symbol_libertinus:n {#1}
+          }
+        \c__nwafu_fn_style_libertinus_neg_tl
+          {
+            \fontspec { \g__nwafu_font_name_libertinus_serif_tl .otf }
+            \__nwafu_fn_symbol_libertinus_neg:n {#1}
+          }
+        \c__nwafu_fn_style_libertinus_sans_tl
+          {
+            \fontspec { \g__nwafu_font_name_libertinus_sans_tl .otf }
+            \__nwafu_fn_symbol_libertinus_sans:n {#1}
+          }
+        \c__nwafu_fn_style_pifont_tl
+          { \__nwafu_fn_symbol_pifont:n {#1} }
+        \c__nwafu_fn_style_pifont_neg_tl
+          { \__nwafu_fn_symbol_pifont_neg:n {#1} }
+        \c__nwafu_fn_style_pifont_sans_tl
+          { \__nwafu_fn_symbol_pifont_sans:n {#1} }
+        \c__nwafu_fn_style_pifont_sans_neg_tl
+          { \__nwafu_fn_symbol_pifont_sans_neg:n {#1} }
+        \c__nwafu_fn_style_xits_tl
+          {
+            \fontspec { \g__nwafu_font_name_xits_tl .otf }
+            \__nwafu_fn_symbol_xits:n {#1}
+          }
+        \c__nwafu_fn_style_xits_sans_tl
+          {
+            \fontspec { \g__nwafu_font_name_xits_tl .otf }
+            \__nwafu_fn_symbol_xits_sans:n {#1}
+          }
+        \c__nwafu_fn_style_xits_sans_neg_tl
+          {
+            \fontspec { \g__nwafu_font_name_xits_tl .otf }
+            \__nwafu_fn_symbol_xits_sans_neg:n {#1}
+          }
+      }
+      { \int_use:N #1 }
+  }
+\cs_set:Npn \@makefntext #1
+  {
+    \mode_leave_vertical:
+    \hbox_to_wd:nn { 1.5 em } { \@thefnmark \hfil }
+    #1
+  }
+\clist_const:Nn \c__nwafu_thm_style_plain_clist
+  { plain, margin, change }
+\clist_const:Nn \c__nwafu_thm_style_break_clist
+  { break, marginbreak, changebreak }
+\tl_new:N \l__nwafu_thm_style_tl
+\tl_new:N \l__nwafu_thm_header_font_tl
+\tl_new:N \l__nwafu_thm_body_font_tl
+\tl_new:N \l__nwafu_thm_qed_tl
+\tl_new:N \l__nwafu_thm_counter_tl
+\keys_define:nn { nwafu / theorem }
+  {
+    style       .tl_set:N  = \l__nwafu_thm_style_tl,
+    header-font .tl_set:N  = \l__nwafu_thm_header_font_tl,
+    body-font   .tl_set:N  = \l__nwafu_thm_body_font_tl,
+    qed         .tl_set:N  = \l__nwafu_thm_qed_tl,
+    counter     .tl_set:N  = \l__nwafu_thm_counter_tl
+  }
+\cs_new_eq:NN \__nwafu_thm_ntheorem_style:n \theoremstyle
+\cs_new_eq:NN \__nwafu_thm_ntheorem_new:w   \newtheorem
+\RenewDocumentCommand \newtheorem { s o m m }
+  {
+    \IfBooleanTF {#1}
+      { \tl_set:Nn \l__nwafu_thm_qed_tl { \ensuremath { \QED } } }
+      { \tl_set:Nn \l__nwafu_thm_qed_tl { } }
+    \tl_set:Nn \l__nwafu_thm_style_tl { plain }
+    \IfValueT {#2} { \keys_set:nn { nwafu / theorem } {#2} }
+    \nwafu_thm_set_header_font:V \l__nwafu_thm_header_font_tl
+    \nwafu_thm_set_body_font:V   \l__nwafu_thm_body_font_tl
+    \nwafu_thm_set_qed:V         \l__nwafu_thm_qed_tl
+    \IfBooleanTF {#1}
+      {
+        \clist_if_in:nVF { plain, break } \l__nwafu_thm_style_tl
+          {
+            \clist_if_in:NVTF
+              \c__nwafu_thm_style_plain_clist \l__nwafu_thm_style_tl
+              { \__nwafu_thm_redefine_style:n { plain } }
+              {
+                \clist_if_in:NVTF
+                  \c__nwafu_thm_style_break_clist \l__nwafu_thm_style_tl
+                  { \__nwafu_thm_redefine_style:n { break } }
+                  {
+                    \__nwafu_error:nx { unknown-theorem-style }
+                      { \l__nwafu_thm_style_tl }
+                  }
+              }
+          }
+        \tl_put_left:Nn \l__nwafu_thm_style_tl { nonumber }
+        \nwafu_thm_new_no_number:Vxx \l__nwafu_thm_style_tl {#3} {#4}
+      }
+      {
+        \clist_clear:N \l__nwafu_tmpa_clist
+        \clist_concat:NNN \l__nwafu_tmpa_clist
+          \c__nwafu_thm_style_plain_clist \c__nwafu_thm_style_break_clist
+        \clist_if_in:NVF \l__nwafu_tmpa_clist \l__nwafu_thm_style_tl
+          {
+            \__nwafu_error:nx { unknown-theorem-style }
+              { \l__nwafu_thm_style_tl }
+          }
+        \nwafu_thm_new:VVxx \l__nwafu_thm_style_tl \l__nwafu_thm_counter_tl
+          {#3} {#4}
+      }
+  }
+\cs_new:Npn \__nwafu_thm_redefine_style:n #1
+  {
+    \__nwafu_warning:nxx { redefine-theorem-style }
+      {#1} { \l__nwafu_thm_style_tl }
+    \tl_set:Nn \l__nwafu_thm_style_tl {#1}
+  }
+\__nwafu_msg_new:nn { redefine-theorem-style }
+  { Theorem~ style~ "#2"~ will~ be~ redefined~ as~ "#1". }
+\__nwafu_msg_new:nn { unknown-theorem-style }
+  { Theorem~ style~ "#1"~ is~ unknown. }
+\cs_new:Npn \nwafu_thm_new:nnnn #1#2#3#4
+  {
+    \__nwafu_thm_ntheorem_style:n {#1}
+    \__nwafu_thm_ntheorem_new:w   {#3} {#4} [#2]
+  }
+\cs_generate_variant:Nn \nwafu_thm_new:nnnn { VVxx }
+\cs_new:Npn \nwafu_thm_new_no_number:nnn #1#2#3
+  {
+    \__nwafu_thm_ntheorem_style:n {#1}
+    \__nwafu_thm_ntheorem_new:w   {#2} {#3}
+  }
+\cs_generate_variant:Nn \nwafu_thm_new_no_number:nnn { Vxx }
+\cs_new:Npn \nwafu_thm_set_qed:n         #1 { \theoremsymbol     {#1} }
+\cs_new:Npn \nwafu_thm_set_header_font:n #1 { \theoremheaderfont {#1} }
+\cs_new:Npn \nwafu_thm_set_body_font:n   #1 { \theorembodyfont   {#1} }
+\cs_generate_variant:Nn \nwafu_thm_set_qed:n         { V }
+\cs_generate_variant:Nn \nwafu_thm_set_header_font:n { V }
+\cs_generate_variant:Nn \nwafu_thm_set_body_font:n   { V }
+\DeclareCaptionLabelSeparator{ccwd}{\hspace{0.5\ccwd}}
+\DeclareCaptionLabelFormat{parens}{\bothIfFirst{#1}{~}(#2)}
+\DeclareCaptionFont{nwafu at table@font}{\sffamily\small}
+\DeclareCaptionFont{nwafu at figure@font}{\sffamily\small}
+\DeclareCaptionFont{nwafu at subtable@font}{\small}
+\DeclareCaptionFont{nwafu at subfigure@font}{\small}
+\captionsetup
+  {
+    format          = hang,
+    font            = {stretch = 1},
+    labelsep        = ccwd,
+    singlelinecheck = true,
+    skip=4bp,
+  }
+\captionsetup[table]{font += nwafu at table@font}
+\captionsetup[longtable]{font += nwafu at table@font}
+\captionsetup[figure]{font += nwafu at figure@font}
+\captionsetup[subfigure]
+  {
+    labelformat = parens,
+    font       = nwafu at subfigure@font,
+    belowskip   = 2pt,
+    aboveskip   = 6pt
+  }
+\DeclareCaptionOption{bi-first}[format=hang,hangindent=-0.5em]{
+    \def\tablename{表}
+    \def\figurename{图}
+  }
+\DeclareCaptionOption{bi-second}[format=hang,hangindent=-2em]{
+    \def\tablename{Tab.}
+    \def\figurename{Fig.}
+  }
+\captionsetup[bi-first]{bi-first}
+\captionsetup[bi-second]{bi-second}
+\AddToHook
+  { env/figure/end }
+  {
+    \centering
+  }
+\AddToHook
+  { env/table/end }
+  {
+    \centering
+  }
+\__nwafu_at_begin_environment:nn { tabular,tabularx,longtable,tblr }
+  {
+    \exp_args:Nx \linespread { 1.05 }
+    \small\selectfont\ignorespaces
+  }
+\cs_set:Npn \thefigure
+  { \thechapter - \__nwafu_arabic:n { figure } }
+\cs_set:Npn \thetable
+  { \thechapter - \__nwafu_arabic:n { table  } }
+\clist_map_inline:nn
+  {
+    title, date, grade, enroll, author, supervisor, cosupervisor
+    department, major, researchfield, professionaltype, professionalfield,
+    class_id, student_id, school_id, clc, defensedate, udc
+  }
+  { \tl_new:c { l__nwafu_info_ #1 _tl } }
+\clist_new:N \l__nwafu_info_instructors_clist
+\clist_new:N \l__nwafu_info_defensecommittees_clist
+\clist_new:N \l__nwafu_info_foundation_clist
+\clist_map_inline:nn
+  { title, author, supervisor, cosupervisor, department,
+    major, mastertype, researchfield, professionaltype, professionalfield,date }
+  { \tl_new:c { l__nwafu_info_ #1 _en_tl } }
+\int_new:N \l__nwafu_info_degree_type_int
+\int_new:N \l__nwafu_info_bachelor_type_int
+\keys_define:nn { nwafu / info }
+  {
+    degree      .choices:nn  =
+      { academic, professional }
+      { \int_set_eq:NN \l__nwafu_info_degree_type_int \l_keys_choice_int },
+    btype      .choice:,
+    btype      .value_required:n = true,
+    btype      .choices:nn  =
+      { paper, design }
+      { \int_set_eq:NN \l__nwafu_info_bachelor_type_int \l_keys_choice_int },
+    btype      .initial:n = paper,
+    title       .tl_set:N    = \l__nwafu_info_title_tl,
+    title*      .tl_set:N    = \l__nwafu_info_title_en_tl,
+    date        .tl_set:N    = \l__nwafu_info_date_tl,
+    date*       .tl_set:N    = \l__nwafu_info_date_en_tl,
+    grade        .tl_set:N    = \l__nwafu_info_grade_tl,
+    enroll        .tl_set:N    = \l__nwafu_info_enroll_tl,
+    author      .tl_set:N    = \l__nwafu_info_author_tl,
+    author*     .tl_set:N    = \l__nwafu_info_author_en_tl,
+    supervisor  .tl_set:N    = \l__nwafu_info_supervisor_tl,
+    supervisor* .tl_set:N    = \l__nwafu_info_supervisor_en_tl,
+    cosupervisor        .tl_set:N    = \l__nwafu_info_cosupervisor_tl,
+    cosupervisor*       .tl_set:N    = \l__nwafu_info_cosupervisor_en_tl,
+    instructors .clist_set:N = \l__nwafu_info_instructors_clist,
+    defensecommittees .clist_set:N = \l__nwafu_info_defensecommittees_clist,
+    defensedate        .tl_set:N    = \l__nwafu_info_defensedate_tl,
+    foundation .clist_set:N = \l__nwafu_info_foundation_clist,
+    department  .tl_set:N    = \l__nwafu_info_department_tl,
+    department* .tl_set:N    = \l__nwafu_info_department_en_tl,
+    major       .tl_set:N    = \l__nwafu_info_major_tl,
+    major*      .tl_set:N    = \l__nwafu_info_major_en_tl,
+    mastertype .tl_set:N    = \l__nwafu_info_mastertype_en_tl,
+    researchfield  .tl_set:N    = \l__nwafu_info_researchfield_tl,
+    researchfield* .tl_set:N    = \l__nwafu_info_researchfield_en_tl,
+    professionaltype  .tl_set:N    = \l__nwafu_info_professionaltype_tl,
+    professionaltype* .tl_set:N    = \l__nwafu_info_professionaltype_en_tl,
+    professionalfield  .tl_set:N    = \l__nwafu_info_professionalfield_tl,
+    professionalfield* .tl_set:N    = \l__nwafu_info_professionalfield_en_tl,
+    class-id  .tl_set:N    = \l__nwafu_info_class_id_tl,
+    student-id  .tl_set:N    = \l__nwafu_info_student_id_tl,
+    school-id   .tl_set:N    = \l__nwafu_info_school_id_tl,
+    clc         .tl_set:N    = \l__nwafu_info_clc_tl,
+    udc         .tl_set:N    = \l__nwafu_info_udc_tl,
+  }
+\tl_new:N    \l__nwafu_cover_logo_tl
+\clist_new:N \l__nwafu_cover_logo_size_clist
+\keys_define:nn { nwafu / style }
+  {
+    logo      .tl_set:N    = \l__nwafu_cover_logo_tl,
+    logo-size .clist_set:N = \l__nwafu_cover_logo_size_clist
+  }
+\bool_new:N \l__nwafu_secret_bool
+\tl_new:N \l__nwafu_info_secret_level_tl
+\keys_define:nn { nwafu / info }
+  {
+  % 密级。\opt{none} 表示公开,\opt{i}、\opt{ii}、\opt{iii}、\opt{iv} 分别为
+    secret-level .choices:nn  =
+      { none, i, ii, iii, iv }
+      {
+        \int_compare:nNnTF { \l_keys_choice_int } > { 1 }
+          {
+            \bool_set_true:N \l__nwafu_secret_bool
+            \tl_set:Nn \l__nwafu_info_secret_level_tl
+              {
+                \clist_item:Nn \c__nwafu_secret_clist
+                  { \l_keys_choice_int - 1 }
+              }
+          }
+          {
+            \bool_set_false:N \l__nwafu_secret_bool
+            \tl_set:Nn \l__nwafu_info_secret_level_tl { 公开 }
+          }
+      },
+    secret-level .value_required:n = true,
+  }
+\cs_new_protected:Npn \__nwafu_spread_box:nn #1#2
+  {
+    \mode_leave_vertical:
+    \hbox_to_wd:nn {#1}
+      { \tl_map_inline:xn {#2} { ##1 \hfil } \unskip }
+  }
+\cs_generate_variant:Nn \__nwafu_spread_box:nn  { Vn }
+\cs_generate_variant:Nn \__nwafu_spread_box:nn  { nV }
+\cs_new_protected:Npn \__nwafu_center_box:nn #1#2
+  {
+    \mode_leave_vertical:
+    \dim_set:Nn \l__nwafu_tmpt_dim {#1}
+    \dim_add:Nn \l__nwafu_tmpt_dim {0.6em}
+    \makebox[0cm][l]{\rule[-0.5ex]{\l__nwafu_tmpt_dim}{0.4 pt}}
+      {\hbox_to_wd:nn {\l__nwafu_tmpt_dim} { \hfil #2 \hfil }}
+    % \fbox[b]{\parbox {#1} { \centering #2 }}
+  }
+\cs_generate_variant:Nn \__nwafu_center_box:nn  { Vn }
+\cs_new:Npn \__nwafu_fixed_width_box:nn #1#2
+  { \parbox {#1} {#2} }
+\cs_generate_variant:Nn \__nwafu_fixed_width_box:nn  { Vn }
+\cs_new:Npn \__nwafu_fixed_width_center_box:nn #1#2
+  { \parbox {#1} { \centering #2 } }
+\cs_new:Npn \__nwafu_get_text_width:Nn #1#2
+  {
+    \hbox_set:Nn \l__nwafu_tmpa_box {#2}
+    \dim_set:Nn #1 { \box_wd:N \l__nwafu_tmpa_box }
+  }
+\cs_generate_variant:Nn \__nwafu_get_text_width:Nn { NV }
+\cs_new:Npn \__nwafu_get_max_text_width:NN #1#2
+  {
+    \group_begin:
+      \dim_set:Nn #1 {-999pt}
+      \clist_set_eq:NN \l__nwafu_tmpt_clist #2
+      \bool_until_do:nn { \clist_if_empty_p:N \l__nwafu_tmpt_clist }
+        {
+          \clist_pop:NN \l__nwafu_tmpt_clist \l__nwafu_tmpt_tl
+          \__nwafu_get_text_width:NV \l__nwafu_tmpt_dim \l__nwafu_tmpt_tl
+          \dim_gset:Nn #1 { \dim_max:nn {#1} { \l__nwafu_tmpt_dim } }
+        }
+    \group_end:
+  }
+\cs_new:Npn \__nwafu_blank_underline:n #1
+  { \rule [ -0.5 ex ] {#1} { 0.4 pt } }
+\cs_new:Npn \__nwafu_text_uline:n #1
+  {
+    \__nwafu_get_text_width:Nn \l__nwafu_tmpt_dim {#1}
+    \dim_add:Nn \l__nwafu_tmpt_dim {0.6em}
+    \makebox[0cm][l]{\rule[-0.5ex]{\l__nwafu_tmpt_dim}{0.4 pt}}
+      \rule{.3em}{0cm}#1\rule{.3em}{0cm}
+  }
+\cs_generate_variant:Nn \__nwafu_text_uline:n { V }
+\cs_new:Npn \__nwafu_line_spread:N #1
+  { \linespread { \fp_use:N #1 } \selectfont }
+\cs_new:Npn \__nwafu_line_spread:n #1
+  { \linespread {#1} \selectfont }
+\cs_new_protected:Npn \__nwafu_cover_id:
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \group_begin:
+        \clist_clear:N \l__nwafu_tmpa_clist
+        \clist_set:Nx \l__nwafu_tmpa_clist
+          {
+            { \c__nwafu_name_clc_tl          },
+            { \c__nwafu_name_udc_tl          },
+            { \c__nwafu_name_secret_level_tl }
+          }
+        \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+        \clist_set:Nx \l__nwafu_tmpb_clist
+          {
+            { \l__nwafu_info_clc_tl              },
+            { \l__nwafu_info_udc_tl              },
+            { \l__nwafu_info_secret_level_tl     }
+          }
+        \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+        \clist_set:Nx \l__nwafu_tmpc_clist
+          {
+            { \c__nwafu_name_school_id_tl         },
+            {                                 },
+            { \c__nwafu_name_student_id_tl        }
+          }
+        \__nwafu_get_max_text_width:NN \l__nwafu_tmpc_dim \l__nwafu_tmpc_clist
+        \clist_set:Nx \l__nwafu_tmpd_clist
+          {
+            { \l__nwafu_info_school_id_tl              },
+            {                                      },
+            { \l__nwafu_info_student_id_tl             }
+          }
+        \__nwafu_get_max_text_width:NN \l__nwafu_tmpd_dim \l__nwafu_tmpd_clist
+        \begin{minipage} [ c ] { \textwidth }
+        \bool_until_do:nn { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+          {
+            \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+            \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+            \clist_pop:NN \l__nwafu_tmpc_clist \l__nwafu_tmpc_tl
+            \clist_pop:NN \l__nwafu_tmpd_clist \l__nwafu_tmpd_tl
+            \tl_if_eq:NNTF \l__nwafu_tmpa_tl \c__nwafu_name_udc_tl
+              {
+                \__nwafu_fixed_width_box:Vn \l__nwafu_tmpa_dim { \l__nwafu_tmpa_tl }
+              }{
+                \__nwafu_spread_box:Vn \l__nwafu_tmpa_dim { \l__nwafu_tmpa_tl }
+              }
+            \c__nwafu_fwid_colon_tl
+            \__nwafu_center_box:Vn \l__nwafu_tmpb_dim { \l__nwafu_tmpb_tl }
+            \hfill
+            \tl_if_empty:NTF \l__nwafu_tmpc_tl
+              {
+              }{
+                \__nwafu_spread_box:Vn \l__nwafu_tmpc_dim { \l__nwafu_tmpc_tl }
+                \c__nwafu_fwid_colon_tl
+                \__nwafu_center_box:Vn \l__nwafu_tmpd_dim { \l__nwafu_tmpd_tl }
+              }
+            \par
+          }
+        \end{minipage}
+        \group_end:
+      }
+      {
+        \__nwafu_fixed_width_box:nn { 120 pt }
+          {
+            \__nwafu_cover_id_aux:n { student_id }
+          }
+      }
+  }
+\cs_new:Npn \__nwafu_cover_id_aux:n #1
+  {
+    \tl_use:c { c__nwafu_name_ #1 _tl }
+    \c__nwafu_fwid_colon_tl
+    \__nwafu_text_uline:n {\tl_use:c { l__nwafu_info_ #1 _tl }}
+  }
+\cs_new_protected:Npn \__nwafu_cover_logo:
+  {
+    \clist_pop:NN   \l__nwafu_cover_logo_size_clist \l__nwafu_tmpa_tl
+    \clist_pop:NNTF \l__nwafu_cover_logo_size_clist \l__nwafu_tmpb_tl
+      {
+        \tl_if_empty:NTF \l__nwafu_tmpa_tl
+          { \includegraphics [ height = \l__nwafu_tmpb_tl ] }
+          {
+            \includegraphics
+              [ width  = \l__nwafu_tmpa_tl, height = \l__nwafu_tmpb_tl ]
+          }
+      }
+      { \includegraphics [ width = \l__nwafu_tmpa_tl ] }
+    { \l__nwafu_cover_logo_tl }
+  }
+\cs_new_protected:Npn \__nwafu_cover_type:
+  {
+    \tl_set:Nx \l__nwafu_tmpa_tl
+      {
+        \clist_item:Nn \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int }
+      }
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \__nwafu_spread_box:nn { 0.75 \textwidth } { \l__nwafu_tmpa_tl }
+      }{
+        \__nwafu_get_text_width:NV \l__nwafu_tmpa_dim \l__nwafu_info_grade_tl
+        \__nwafu_center_box:Vn \l__nwafu_tmpa_dim { \l__nwafu_info_grade_tl }
+        \__nwafu_spread_box:nn { 0.50 \textwidth }{
+            届
+            \l__nwafu_tmpa_tl
+            \clist_item:Nn \c__nwafu_bachelor_type_clist { \l__nwafu_info_bachelor_type_int }
+          }
+      }
+  }
+\cs_new_protected:Npn \__nwafu_cover_info:
+  {
+    \begin{minipage} [ c ] { \textwidth }
+      \centering
+      \int_case:nn {\g__nwafu_thesis_type_int}
+        {
+          {1}{
+            \clist_set:Nx \l__nwafu_tmpa_clist
+              {
+                \c__nwafu_name_major_tl,
+                \c__nwafu_name_researchfield_tl,
+                \c__nwafu_name_author_tl,
+                \c__nwafu_name_supervisor_tl,
+                \c__nwafu_name_cosupervisor_tl,
+                \c__nwafu_name_date_tl,
+              }
+            \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+            \clist_set:Nx \l__nwafu_tmpb_clist
+              {
+                { \l__nwafu_info_major_tl              },
+                { \l__nwafu_info_researchfield_tl      },
+                { \l__nwafu_info_author_tl             },
+                { \l__nwafu_info_supervisor_tl         },
+                { \l__nwafu_info_cosupervisor_tl       },
+                { \l__nwafu_info_date_tl               }
+              }
+            \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+          }
+          {2}{
+            \int_case:nn {\l__nwafu_info_degree_type_int}
+            {
+              {1}{
+                \clist_set:Nx \l__nwafu_tmpa_clist
+                  {
+                    \c__nwafu_name_major_tl,
+                    \c__nwafu_name_researchfield_tl,
+                    \c__nwafu_name_author_tl,
+                    \c__nwafu_name_supervisor_tl,
+                    \c__nwafu_name_cosupervisor_tl,
+                    \c__nwafu_name_date_tl,
+                  }
+                \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+                \clist_set:Nx \l__nwafu_tmpb_clist
+                  {
+                    { \l__nwafu_info_major_tl              },
+                    { \l__nwafu_info_researchfield_tl      },
+                    { \l__nwafu_info_author_tl             },
+                    { \l__nwafu_info_supervisor_tl         },
+                    { \l__nwafu_info_cosupervisor_tl       },
+                    { \l__nwafu_info_date_tl               }
+                  }
+                \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+              }
+              {2}{
+                \clist_set:Nx \l__nwafu_tmpa_clist
+                  {
+                    \c__nwafu_name_professionaltype_tl,
+                    \c__nwafu_name_professionalfield_tl,
+                    \c__nwafu_name_author_tl,
+                    \c__nwafu_name_supervisor_tl,
+                    \c__nwafu_name_cosupervisor_tl,
+                    \c__nwafu_name_date_tl,
+                  }
+                \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+                \clist_set:Nx \l__nwafu_tmpb_clist
+                  {
+                    { \l__nwafu_info_professionaltype_tl   },
+                    { \l__nwafu_info_professionalfield_tl  },
+                    { \l__nwafu_info_author_tl             },
+                    { \l__nwafu_info_supervisor_tl         },
+                    { \l__nwafu_info_cosupervisor_tl       },
+                    { \l__nwafu_info_date_tl               }
+                  }
+                \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+              }
+            }
+          }
+          {3}{
+            \clist_set:Nx \l__nwafu_tmpa_clist
+              {
+                \c__nwafu_name_department_tl,
+                \c__nwafu_name_major_tl,
+                \c__nwafu_name_enroll_tl\c__nwafu_name_class_id_tl,
+                \c__nwafu_name_author_tl,
+                \c__nwafu_name_supervisor_tl,
+                \c__nwafu_name_cosupervisor_tl,
+                \c__nwafu_name_date_tl,
+              }
+            \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+            \clist_set:Nx \l__nwafu_tmpb_clist
+              {
+                { \l__nwafu_info_department_tl                          },
+                { \l__nwafu_info_major_tl                               },
+                { \l__nwafu_info_enroll_tl 级 \l__nwafu_info_class_id_tl 班 },
+                { \l__nwafu_info_author_tl                              },
+                { \l__nwafu_info_supervisor_tl                          },
+                { \l__nwafu_info_cosupervisor_tl                        },
+                { \l__nwafu_info_date_tl                                }
+              }
+            \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+          }
+      }
+      \bool_until_do:nn
+        { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+        {
+          \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+          \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+          \__nwafu_spread_box:Vn \l__nwafu_tmpa_dim { \l__nwafu_tmpa_tl }
+          \c__nwafu_fwid_colon_tl
+          \__nwafu_center_box:Vn \l__nwafu_tmpb_dim { \l__nwafu_tmpb_tl }
+          \skip_vertical:n { 1 ex }
+        }
+    \end{minipage}
+  }
+\cs_new_protected:Npn \__nwafu_cover_info_en:
+  {
+    \int_case:nn {\g__nwafu_thesis_type_int}
+      {
+        {1}{
+          \clist_set:Nx \l__nwafu_tmpa_clist
+            {
+              {\c__nwafu_name_major_en_tl{\l__nwafu_info_major_en_tl}},
+              {\c__nwafu_name_researchfield_en_tl{\l__nwafu_info_researchfield_en_tl}},
+              {\c__nwafu_name_author_en_tl{\l__nwafu_info_author_en_tl}},
+              {\c__nwafu_name_supervisor_en_tl{\l__nwafu_info_supervisor_en_tl}},
+              {\c__nwafu_name_cosupervisor_en_tl{\l__nwafu_info_cosupervisor_en_tl}},
+              {\c__nwafu_name_date_en_tl{\l__nwafu_info_date_en_tl}},
+            }
+          \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+          \dim_add:Nn \l__nwafu_tmpa_dim {2.5em}
+          \begin{minipage} [ c ] { \l__nwafu_tmpa_dim }
+            \flushleft
+            \clist_set:Nx \l__nwafu_tmpa_clist
+              {
+                \c__nwafu_name_major_en_tl,
+                \c__nwafu_name_researchfield_en_tl,
+                \c__nwafu_name_author_en_tl,
+                \c__nwafu_name_supervisor_en_tl,
+                \c__nwafu_name_cosupervisor_en_tl,
+                \c__nwafu_name_date_en_tl,
+              }
+            \clist_set:Nx \l__nwafu_tmpb_clist
+              {
+                { \l__nwafu_info_major_en_tl              },
+                { \l__nwafu_info_researchfield_en_tl      },
+                { \l__nwafu_info_author_en_tl             },
+                { \l__nwafu_info_supervisor_en_tl         },
+                { \l__nwafu_info_cosupervisor_en_tl       },
+                { \l__nwafu_info_date_en_tl               }
+              }
+            \bool_until_do:nn
+              { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+              {
+                \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+                \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+                \l__nwafu_tmpa_tl
+                \c__nwafu_fwid_colon_tl
+                \l__nwafu_tmpb_tl
+                \skip_vertical:n { 1 ex }
+              }
+          \end{minipage}
+        }
+        {2}{
+          \int_case:nn {\l__nwafu_info_degree_type_int}
+            {
+              {1}{
+                \clist_set:Nx \l__nwafu_tmpa_clist
+                  {
+                    {\c__nwafu_name_major_en_tl{\l__nwafu_info_major_en_tl}},
+                    {\c__nwafu_name_researchfield_en_tl{\l__nwafu_info_researchfield_en_tl}},
+                    {\c__nwafu_name_author_en_tl{\l__nwafu_info_author_en_tl}},
+                    {\c__nwafu_name_supervisor_en_tl{\l__nwafu_info_supervisor_en_tl}},
+                    {\c__nwafu_name_cosupervisor_en_tl{\l__nwafu_info_cosupervisor_en_tl}},
+                    {\c__nwafu_name_date_en_tl{\l__nwafu_info_date_en_tl}},
+                  }
+                \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+                \dim_add:Nn \l__nwafu_tmpa_dim {2.5em}
+                \begin{minipage} [ c ] { \l__nwafu_tmpa_dim }
+                  \flushleft
+                  \clist_set:Nx \l__nwafu_tmpa_clist
+                     {
+                       \c__nwafu_name_major_en_tl,
+                       \c__nwafu_name_researchfield_en_tl,
+                       \c__nwafu_name_author_en_tl,
+                       \c__nwafu_name_supervisor_en_tl,
+                       \c__nwafu_name_cosupervisor_en_tl,
+                       \c__nwafu_name_date_en_tl,
+                     }
+                  \clist_set:Nx \l__nwafu_tmpb_clist
+                    {
+                      { \l__nwafu_info_major_en_tl              },
+                      { \l__nwafu_info_researchfield_en_tl      },
+                      { \l__nwafu_info_author_en_tl             },
+                      { \l__nwafu_info_supervisor_en_tl         },
+                      { \l__nwafu_info_cosupervisor_en_tl       },
+                      { \l__nwafu_info_date_en_tl               }
+                    }
+                  \bool_until_do:nn
+                    { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+                    {
+                      \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+                      \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+                      \l__nwafu_tmpa_tl
+                      \c__nwafu_fwid_colon_tl
+                      \l__nwafu_tmpb_tl
+                      \skip_vertical:n { 1 ex }
+                    }
+                \end{minipage}
+              }
+              {2}{
+                \clist_set:Nx \l__nwafu_tmpa_clist
+                  {
+                    {\c__nwafu_name_professionaltype_en_tl{Master~of~\l__nwafu_info_professionaltype_en_tl}},
+                    {\c__nwafu_name_professionalfield_en_tl{\l__nwafu_info_professionalfield_en_tl}},
+                    {\c__nwafu_name_author_en_tl{\l__nwafu_info_author_en_tl}},
+                    {\c__nwafu_name_supervisor_en_tl{\l__nwafu_info_supervisor_en_tl}},
+                    {\c__nwafu_name_cosupervisor_en_tl{\l__nwafu_info_cosupervisor_en_tl}},
+                    {\c__nwafu_name_date_en_tl{\l__nwafu_info_date_en_tl}},
+                  }
+                \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+                \dim_add:Nn \l__nwafu_tmpa_dim {2.5em}
+                \begin{minipage} [ c ] { \l__nwafu_tmpa_dim }
+                  \flushleft
+                  \clist_set:Nx \l__nwafu_tmpa_clist
+                     {
+                       \c__nwafu_name_professionaltype_en_tl,
+                       \c__nwafu_name_professionalfield_en_tl,
+                       \c__nwafu_name_author_en_tl,
+                       \c__nwafu_name_supervisor_en_tl,
+                       \c__nwafu_name_cosupervisor_en_tl,
+                       \c__nwafu_name_date_en_tl,
+                     }
+                  \clist_set:Nx \l__nwafu_tmpb_clist
+                    {
+                      { Master ~ of ~ \l__nwafu_info_professionaltype_en_tl },
+                      { \l__nwafu_info_professionalfield_en_tl              },
+                      { \l__nwafu_info_author_en_tl                         },
+                      { \l__nwafu_info_supervisor_en_tl                     },
+                      { \l__nwafu_info_cosupervisor_en_tl                   },
+                      { \l__nwafu_info_date_en_tl                           }
+                    }
+                  \bool_until_do:nn
+                    { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+                    {
+                      \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+                      \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+                      \l__nwafu_tmpa_tl
+                      \c__nwafu_fwid_colon_tl
+                      \l__nwafu_tmpb_tl
+                      \skip_vertical:n { 1 ex }
+                    }
+                \end{minipage}
+              }
+            }
+          }
+      }
+  }
+\cs_new_protected:Npn \__nwafu_cover_instructors:
+  {
+    \int_case:nn {\g__nwafu_thesis_type_int}
+      {
+        {1}{
+          \clist_set:Nx \l__nwafu_tmpa_clist
+            {
+              {\c__nwafu_name_author_tl      },
+              {\c__nwafu_name_supervisor_tl  },
+              {\c__nwafu_name_instructors_tl },
+            }
+          \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+          \tl_set:Nn \l__nwafu_tmpa_tl {\clist_use:Nn \l__nwafu_info_instructors_clist {\__nwafu_quad: }}
+          \clist_set:Nx \l__nwafu_tmpb_clist
+            {
+              {\l__nwafu_info_author_tl     },
+              {\l__nwafu_info_supervisor_tl },
+              {\l__nwafu_tmpa_tl            },
+            }
+          \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+          \dim_set_eq:NN \l__nwafu_tmpt_dim \l__nwafu_tmpa_dim
+          \dim_add:Nn \l__nwafu_tmpt_dim { \l__nwafu_tmpb_dim }
+          \dim_add:Nn \l__nwafu_tmpt_dim {2.5em}
+          \begin{minipage} [ c ] { \l__nwafu_tmpt_dim }
+            \centering
+            \bool_until_do:nn
+              { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+              {
+                \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+                \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+                \l__nwafu_tmpa_tl
+                \c__nwafu_fwid_colon_tl
+                \__nwafu_center_box:Vn \l__nwafu_tmpb_dim { \l__nwafu_tmpb_tl }
+                \skip_vertical:n { 1 ex }
+              }
+            % \c__nwafu_name_author_tl
+            % \c__nwafu_fwid_colon_tl
+            % \__nwafu_blank_underline:n{ 12em }
+            % \skip_vertical:n { 1 ex }
+            % \c__nwafu_name_supervisor_tl
+            % \c__nwafu_fwid_colon_tl
+            % \__nwafu_blank_underline:n{ 12em }
+            % \skip_vertical:n { 1 ex }
+            % \c__nwafu_name_instructors_tl
+            % \c__nwafu_fwid_colon_tl
+            % \__nwafu_blank_underline:n{ 12em }
+            % \skip_vertical:n { 1 ex }
+          \end{minipage}
+        }
+        {2}{
+          \clist_set:Nx \l__nwafu_tmpa_clist
+            {
+              {\c__nwafu_name_author_tl      },
+              {\c__nwafu_name_supervisor_tl  },
+            }
+          \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+          \clist_set:Nx \l__nwafu_tmpb_clist
+            {
+              {\l__nwafu_info_author_tl     },
+              {\l__nwafu_info_supervisor_tl },
+            }
+          \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+          \dim_add:Nn \l__nwafu_tmpb_dim { \l__nwafu_tmpb_dim }
+          \dim_set_eq:NN \l__nwafu_tmpt_dim \l__nwafu_tmpa_dim
+          \dim_add:Nn \l__nwafu_tmpt_dim { \l__nwafu_tmpb_dim }
+          \dim_add:Nn \l__nwafu_tmpt_dim {2.5em}
+          \begin{minipage} [ c ] { \l__nwafu_tmpt_dim }
+            \centering
+            \bool_until_do:nn
+              { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+              {
+                \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+                \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+                \l__nwafu_tmpa_tl
+                \c__nwafu_fwid_colon_tl
+                \__nwafu_center_box:Vn \l__nwafu_tmpb_dim { \l__nwafu_tmpb_tl }
+                \skip_vertical:n { 1 ex }
+              }
+          % \begin{minipage} [ c ] { 17em }
+          %   \flushleft
+          %   \c__nwafu_name_author_tl
+          %   \c__nwafu_fwid_colon_tl
+          %   \__nwafu_blank_underline:n{ 12em }
+          %   \skip_vertical:n { 1 ex }
+          %   \c__nwafu_name_supervisor_tl
+          %   \c__nwafu_fwid_colon_tl
+          %   \__nwafu_blank_underline:n{ 12em }
+          %   \skip_vertical:n { 1 ex }
+          \end{minipage}
+        }
+      }
+  }
+\cs_new_protected:Npn \__nwafu_cover_defensecommittees:
+  {
+    \clist_set:Nn \l__nwafu_tmpa_clist {}
+    \clist_set:Nn \l__nwafu_tmpb_clist {}
+    \clist_set:Nn \l__nwafu_tmpc_clist {}
+    \bool_until_do:nn { \clist_if_empty_p:N \l__nwafu_info_defensecommittees_clist }
+      {
+        \clist_set:Nn \l__nwafu_tmpt_clist {}
+        \clist_pop:NN \l__nwafu_info_defensecommittees_clist \l__nwafu_tmpa_tl
+        \clist_set:NV \l__nwafu_tmpt_clist \l__nwafu_tmpa_tl
+        \clist_put_right:Nx \l__nwafu_tmpa_clist {
+            \clist_item:Nn \l__nwafu_tmpt_clist {1}
+        }
+        \clist_put_right:Nx \l__nwafu_tmpb_clist {
+            \clist_item:Nn \l__nwafu_tmpt_clist {2}
+        }
+        \clist_put_right:Nx \l__nwafu_tmpc_clist {
+            \clist_item:Nn \l__nwafu_tmpt_clist {3}
+        }
+      }
+    \__nwafu_get_max_text_width:NN \l__nwafu_tmpa_dim \l__nwafu_tmpa_clist
+    \__nwafu_get_max_text_width:NN \l__nwafu_tmpb_dim \l__nwafu_tmpb_clist
+    \__nwafu_get_max_text_width:NN \l__nwafu_tmpc_dim \l__nwafu_tmpc_clist
+    \begin{minipage} [ c ] { \textwidth }
+      \centering
+      \bool_until_do:nn { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+        {
+          \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+          \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+          \clist_pop:NN \l__nwafu_tmpc_clist \l__nwafu_tmpc_tl
+          \__nwafu_spread_box:Vn \l__nwafu_tmpa_dim { \l__nwafu_tmpa_tl }
+          \__nwafu_center_box:Vn \l__nwafu_tmpb_dim { \l__nwafu_tmpb_tl }
+          \__nwafu_spread_box:Vn \l__nwafu_tmpc_dim { \l__nwafu_tmpc_tl }
+          \skip_vertical:n { 0.5 ex }
+        }
+    \end{minipage}
+  }
+\cs_new_protected:Npn \__nwafu_cover_foundation:
+  {
+    \clist_set:Nn \l__nwafu_tmpa_clist {}
+    \clist_set:Nn \l__nwafu_tmpb_clist {}
+    \clist_set:Nn \l__nwafu_tmpc_clist {}
+    \bool_until_do:nn { \clist_if_empty_p:N \l__nwafu_info_foundation_clist }
+      {
+        \clist_set:Nn \l__nwafu_tmpt_clist {}
+        \clist_pop:NN \l__nwafu_info_foundation_clist \l__nwafu_tmpa_tl
+        \clist_set:NV \l__nwafu_tmpt_clist \l__nwafu_tmpa_tl
+        \clist_put_right:Nx \l__nwafu_tmpa_clist {
+            \clist_item:Nn \l__nwafu_tmpt_clist {1}
+        }
+        \clist_put_right:Nx \l__nwafu_tmpb_clist {
+            \clist_item:Nn \l__nwafu_tmpt_clist {2}
+        }
+        \clist_put_right:Nx \l__nwafu_tmpc_clist {
+            \clist_item:Nn \l__nwafu_tmpt_clist {3}
+        }
+      }
+    \begin{minipage} [ c ] { \textwidth }
+    \bool_until_do:nn { \clist_if_empty_p:N \l__nwafu_tmpa_clist }
+      {
+        \clist_pop:NN \l__nwafu_tmpa_clist \l__nwafu_tmpa_tl
+        \clist_pop:NN \l__nwafu_tmpb_clist \l__nwafu_tmpb_tl
+        \clist_pop:NN \l__nwafu_tmpc_clist \l__nwafu_tmpc_tl
+        \indent
+        \__nwafu_qquad:
+        本研究得到
+        \l__nwafu_tmpa_tl
+        \c__nwafu_fwid_colon_tl
+        \l__nwafu_tmpb_tl
+        (编号\c__nwafu_fwid_colon_tl
+        \l__nwafu_tmpc_tl
+        )资助
+        \par
+      }
+    \end{minipage}
+  }
+\cs_new_protected:Npn \__nwafu_cover_signature:N #1
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \__nwafu_qquad:
+        \__nwafu_spread_box:nV { 5 em } #1
+        \c__nwafu_fwid_colon_tl
+        \hspace*{\fill}
+      }{
+        \__nwafu_spread_box:nV { 6 em } #1
+        \c__nwafu_fwid_colon_tl
+        % \__nwafu_blank_underline:n { 6 em }
+        \hspace*{\fill}
+      }
+    时间\c__nwafu_fwid_colon_tl
+    \__nwafu_qquad:\__nwafu_qquad: 年
+    \__nwafu_qquad: 月
+    \__nwafu_qquad: 日
+    \hspace*{\fill}
+    % \__nwafu_qquad:
+  }
+\DeclareObjectType { nwafu / cover } { \c_zero_int }
+\NewDocumentCommand \DeclareCoverTemplate { m m }
+  { \nwafu_cover_declare_template:nn {#1} {#2} }
+\cs_new_protected:Npn \nwafu_cover_declare_template:nn #1#2
+  {
+    \tl_set:Nn \l__nwafu_cover_template_tl {#1}
+    \__nwafu_cover_declare_template_interface:nx {#1}
+      {
+        format      : tokenlist,
+        top-skip    : skip,
+        bottom-skip : skip,
+        \clist_map_function:nN {#2} \__nwafu_cover_key_type:n
+      }
+    \tl_new:c   { l__nwafu_cover / #1 / format_tl   }
+    \skip_new:c { l__nwafu_cover / #1 / top_skip    }
+    \skip_new:c { l__nwafu_cover / #1 / bottom_skip }
+    \clist_map_inline:nn {#2}
+      {
+        \tl_new:c   { l__nwafu_cover / #1 / ##1 / content_tl  }
+        \tl_new:c   { l__nwafu_cover / #1 / ##1 / format_tl   }
+        \skip_new:c { l__nwafu_cover / #1 / ##1 / bottom_skip }
+      }
+    \__nwafu_cover_declare_template_code:nxn {#1}
+      {
+        format      = \exp_not:c { l__nwafu_cover / #1 / format_tl   },
+        top-skip    = \use:c     { l__nwafu_cover / #1 / top_skip    },
+        bottom-skip = \use:c     { l__nwafu_cover / #1 / bottom_skip },
+        \clist_map_function:nN {#2} \__nwafu_cover_key_binding:n
+      }
+      {
+        \AssignTemplateKeys
+        \tl_use:c       { l__nwafu_cover / #1 / format_tl }
+        \__nwafu_vspace:c { l__nwafu_cover / #1 / top_skip  }
+        \clist_map_inline:nn {#2}
+          {
+            \use:c { __nwafu_cover / #1 / ####1 / align:n }
+              {
+                \tl_use:c { l__nwafu_cover / #1 / ####1 / format_tl  }
+                \tl_use:c { l__nwafu_cover / #1 / ####1 / content_tl }
+                \par
+              }
+            \__nwafu_vspace:c { l__nwafu_cover / #1 / ####1 / bottom_skip }
+          }
+        \__nwafu_vspace:c { l__nwafu_cover / #1 / bottom_skip }
+      }
+  }
+\tl_new:N \l__nwafu_cover_template_tl
+\cs_new_protected:Npn \__nwafu_cover_declare_template_interface:nn #1#2
+  { \DeclareTemplateInterface { nwafu / cover } {#1} { \c_zero_int } {#2} }
+\cs_new_protected:Npn \__nwafu_cover_declare_template_code:nnn #1#2#3
+  { \DeclareTemplateCode { nwafu / cover } {#1} { \c_zero_int } {#2} {#3} }
+\cs_generate_variant:Nn \__nwafu_cover_declare_template_interface:nn { nx  }
+\cs_generate_variant:Nn \__nwafu_cover_declare_template_code:nnn     { nxn }
+\cs_new:Npn \__nwafu_cover_key_type:n #1
+  {
+    #1 / content     : tokenlist,
+    #1 / format      : tokenlist,
+    #1 / bottom-skip : skip,
+    #1 / align       : choice { left, right, center, normal } = normal,
+  }
+\cs_new:Npn \__nwafu_cover_key_binding:n #1
+  {
+    #1 / content     =
+      \exp_not:c
+        { l__nwafu_cover / \l__nwafu_cover_template_tl / #1 / content_tl  },
+    #1 / format      =
+      \exp_not:c
+        { l__nwafu_cover / \l__nwafu_cover_template_tl / #1 / format_tl   },
+    #1 / bottom-skip =
+      \exp_not:c
+        { l__nwafu_cover / \l__nwafu_cover_template_tl / #1 / bottom_skip },
+    #1 / align       =
+      {
+        left   =
+          \exp_not:N \cs_set_protected:cpn
+            { __nwafu_cover / \l__nwafu_cover_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
+            { __nwafu_cover / \l__nwafu_cover_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
+            { __nwafu_cover / \l__nwafu_cover_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
+            { __nwafu_cover / \l__nwafu_cover_template_tl / #1 / align:n }
+            \exp_not:n {##1}
+            { \exp_not:n { \group_begin: ##1 \group_end: } }
+      },
+  }
+\NewDocumentCommand \makecoveri { }
+  {
+    \thispagestyle { empty }
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \UseInstance { nwafu / cover } { cover-i-default }
+    \restoregeometry
+  }
+\NewDocumentCommand \makecoverii { }
+  {
+    \thispagestyle { empty }
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \UseInstance { nwafu / cover } { cover-ii-default }
+    \restoregeometry
+  }
+\NewDocumentCommand \makecoveriii { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-iii-default }
+    \restoregeometry
+  }
+\NewDocumentCommand \makecoveriv { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-iv-default }
+    \restoregeometry
+  }
+\NewDocumentCommand \makecoverv { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-v-default }
+    \restoregeometry
+  }
+\NewDocumentCommand \makecovervi { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-vi-default }
+    \restoregeometry
+  }
+\NewDocumentCommand \makecovervii { }
+  {
+    % \cleardoublepage
+    \newgeometry{top=1.0in, bottom=1.0in, left=1.25in, right=1.25in}
+    \thispagestyle { empty }
+    \UseInstance { nwafu / cover } { cover-vii-default }
+    \restoregeometry
+  }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \DeclareCoverTemplate { cover-i   }
+      { logo, type, title, info }
+  }{
+    \DeclareCoverTemplate { cover-i   }
+      { id, logo, type, title, info }
+  }
+\DeclareCoverTemplate { cover-ii  } {
+  type, title, info, department, nwafu
+  }
+\DeclareCoverTemplate { cover-iii } { id, name, title, instructors,
+    ctitle, committees, dtitle, date
+  }
+\DeclareCoverTemplate { cover-iv  } { name-list }
+\DeclareCoverTemplate { cover-v }
+  {
+    originality-decl-name,
+    originality-decl-text,
+    originality-decl-sig,
+    supervisor-decl-name,
+    supervisor-decl-text,
+    supervisor-decl-sig
+  }
+\DeclareCoverTemplate { cover-vi }
+  {
+    authorization-decl-name,
+    authorization-decl-text,
+    authorization-decl-sig,
+    supervisor-decl-sig
+  }
+\DeclareCoverTemplate { cover-vii }
+  {
+    originality-decl-name,
+    originality-decl-text,
+    originality-decl-sig,
+    authorization-decl-name,
+    authorization-decl-text,
+    authorization-decl-sig,
+    supervisor-decl-sig
+  }
+\int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+  {
+    \DeclareInstance { nwafu / cover } { cover-i-default } { cover-i }
+      {
+        bottom-skip            = 0 pt plus 1.5 fill,
+        logo     / content     = \__nwafu_cover_logo:,
+        logo     / bottom-skip = -45 pt plus 0.3 fill,
+        logo     / align       = center,
+        type     / content     = \__nwafu_cover_type:,
+        type     / format      = \sffamily \zihao {  0 },% \bfseries,
+        type     / bottom-skip = -20 pt plus 0.3 fill,
+        type     / align       = center,
+        title    / content     =
+          \__nwafu_fixed_width_center_box:nn
+            { 0.9 \textwidth } { \l__nwafu_info_title_tl },
+        title    / format      = \nwafu at hei \bfseries \zihao { 2 },
+        title    / bottom-skip = 80 pt plus 0.3 fill,
+        title    / align       = center,
+        info     / content     = \__nwafu_cover_info:,
+        info     / format      = \__nwafu_line_spread:n {1.05}\nwafu at hei \zihao { -3 },
+        info     / align       = center,
+      }
+  }{
+    \DeclareInstance { nwafu / cover } { cover-i-default } { cover-i }
+      {
+        bottom-skip            = 0 pt plus 0.5 fill,
+        id       / content     = \__nwafu_cover_id:,
+        id       / format      = \bfseries\zihao { 4 },
+        id       / bottom-skip = 0 pt plus 0.3 fill,
+        id       / align       = right,
+        logo     / content     = \__nwafu_cover_logo:,
+        logo     / bottom-skip = -30 pt,% plus 0.3 fill,
+        logo     / align       = center,
+        type     / content     = \__nwafu_cover_type:,
+        type     / format      = \bfseries\nwafu at kai\zihao {  1 },
+        type     / bottom-skip = -20 pt plus 0.3 fill,
+        type     / align       = center,
+        title    / content     =
+          \__nwafu_fixed_width_center_box:nn
+            { 0.9 \textwidth } { \l__nwafu_info_title_tl },
+        title    / format      = \nwafu at hei \bfseries\zihao { 2 },
+        title    / bottom-skip = 80 pt plus 0.3 fill,
+        title    / align       = center,
+        info     / content     = \__nwafu_cover_info:,
+        info     / format      = \rmfamily\zihao { 3 },
+        info     / align       = center,
+      }
+  }
+\int_case:nn {\g__nwafu_thesis_type_int}
+  {
+    {1}{
+         \DeclareInstance { nwafu / cover } { cover-ii-default } { cover-ii }
+           {
+             bottom-skip            = 0 pt plus 0.5 fill,
+             type     / content =
+               \__nwafu_fixed_width_center_box:nn { 0.7\textwidth } {
+                  Thesis~Submitted~to~\c__nwafu_name_en_tl\\
+                  in~Partial~Fulfillment~of~the~Requirements\\
+                  for~Degree~of\\
+                  Doctor~of~Philosophy
+              },
+             type     / format  = \__nwafu_line_spread:n {1.22} \zihao { -3 },
+             type     / bottom-skip = 42 pt,% plus 0.3 fill,
+             type     / align   = center,
+             title     / content = \l__nwafu_info_title_en_tl,
+             title     / format  = \__nwafu_line_spread:n {0.90}
+                                   \zihao { 1 } \bfseries,
+             title     / bottom-skip = 35 pt,% plus 0.3 fill,
+             title     / align   = center,
+             info     / content     = \__nwafu_cover_info_en:,
+             info     / format      = \__nwafu_line_spread:n {1.12} \zihao { -3 },
+             info    / bottom-skip = 72 pt,% plus 0.3 fill,
+             info     / align       = center,
+             department     / content     = \l__nwafu_info_department_en_tl,
+             department     / format      = \zihao { -3 },
+             department     / bottom-skip = -32 pt,% plus 0.3 fill,
+             department     / align       = center,
+             nwafu     / content     = \c__nwafu_name_en_tl,
+             nwafu     / format      = \zihao { -3 },
+             nwafu     / align       = center,
+           }
+    }
+    {2}{
+         \DeclareInstance { nwafu / cover } { cover-ii-default } { cover-ii }
+           {
+             bottom-skip            = 0 pt plus 0.5 fill,
+             type     / content =
+               \__nwafu_fixed_width_center_box:nn { 0.7\textwidth } {
+                  Thesis~Submitted~to~\c__nwafu_name_en_tl\\
+                  in~Partial~Fulfillment~of~the~Requirements\\
+                  for~Degree~of\\
+                  Master~of
+                 \int_case:nn {\l__nwafu_info_degree_type_int}
+                  {
+                    {1}{
+                      \__nwafu_text_uline:V \l__nwafu_info_mastertype_en_tl
+                    }
+                    {2}{
+                      \__nwafu_text_uline:V \l__nwafu_info_professionaltype_en_tl
+                    }
+                  }
+               },
+             type     / format  = \__nwafu_line_spread:n {1.22} \zihao { -3 },
+             type     / bottom-skip = 42 pt,% plus 0.3 fill,
+             type     / align   = center,
+             title     / content = \l__nwafu_info_title_en_tl,
+             title     / format  = \__nwafu_line_spread:n {0.90} \zihao { 1 } \bfseries,
+             title     / bottom-skip = 35 pt,% plus 0.3 fill,
+             title     / align   = center,
+             info     / content     = \__nwafu_cover_info_en:,
+             info     / format      = \__nwafu_line_spread:n {1.12} \zihao { -3 },
+             info    / bottom-skip = 72 pt,% plus 0.3 fill,
+             info     / align       = center,
+             department     / content     = \l__nwafu_info_department_en_tl,
+             department     / format      = \zihao { -3 },
+             department     / bottom-skip = -32 pt,% plus 0.3 fill,
+             department     / align       = center,
+             nwafu     / content     = \c__nwafu_name_en_tl,
+             nwafu     / format      = \zihao { -3 },
+             nwafu     / align       = center,
+           }
+    }
+  }
+\DeclareInstance { nwafu / cover } { cover-iii-default } { cover-iii }
+  {
+    top-skip            = -55 pt plus 0.1 fill,
+    bottom-skip            = 0 pt plus 0.5 fill,
+    id     / content = \__nwafu_cover_id:,
+    id     / format  =  \__nwafu_line_spread:n {1.12}\zihao { -4 },
+    id     / bottom-skip = 35 pt plus 0.3 fill,
+    id     / align   = center,
+    name     / content = \c__nwafu_name_simp_tl
+                         \clist_item:Nn \c__nwafu_thesis_type_clist { \g__nwafu_thesis_type_int },
+    name     / format  = \zihao { -2 }\bfseries,
+    name     / bottom-skip = 0 pt plus 0.3 fill,
+    name     / align   = center,
+    title     / content = \l__nwafu_info_title_tl,
+    title     / format  = \zihao { 2 } \sffamily,
+    title     / bottom-skip = 65 pt plus 0.3 fill,
+    title     / align   = center,
+    instructors     / content     = \__nwafu_cover_instructors:,
+    instructors     / format      = \__nwafu_line_spread:n {0.88}\zihao { 3 }\bfseries,
+    instructors     / bottom-skip = 75 pt plus 0.3 fill,
+    instructors     / align       = center,
+    ctitle     / content = 答辩委员会\c__nwafu_fwid_colon_tl,
+    ctitle     / format  = \zihao { -3 }\bfseries,
+    ctitle     / bottom-skip = -20 pt plus 0.3 fill,
+    ctitle     / align   = left,
+    committees     / content     = \__nwafu_cover_defensecommittees:,
+    committees     / format      = \__nwafu_line_spread:n {1.12}\zihao { -3 },
+    committees     / bottom-skip = 60 pt plus 0.3 fill,
+    committees     / align       = center,
+    date     / content     = {\bfseries{}答辩日期}\c__nwafu_fwid_colon_tl\l__nwafu_info_defensedate_tl,
+    date     / format      = \zihao { -3 },
+    date     / bottom-skip = 0 pt plus 0.3 fill,
+    date     / align       = left,
+  }
+\DeclareInstance { nwafu / cover } { cover-iv-default } { cover-iv }
+  {
+    name-list / content = \__nwafu_cover_foundation:,
+    name-list / format = \sffamily\zihao{3},
+    name-list / align = center,
+  }
+\DeclareInstance { nwafu / cover } { cover-v-default } { cover-v }
+  {
+    format                                =
+      \__nwafu_line_spread:n { 1.25 },
+    top-skip                              = 0 pt plus 0.2 fill,
+    bottom-skip                           = 0 pt plus 2.5 fill,
+    originality-decl-name   / content     = \c__nwafu_name_orig_decl_tl,
+    originality-decl-text   / content     = \c__nwafu_orig_decl_text_tl,
+    originality-decl-sig    / content     =
+      \__nwafu_cover_signature:N \c__nwafu_orig_decl_sign_tl,
+    supervisor-decl-name / content     = \c__nwafu_name_super_decl_tl,
+    supervisor-decl-text / content     = \c__nwafu_super_decl_text_tl,
+    supervisor-decl-sig  / content     =
+      \__nwafu_cover_signature:N \c__nwafu_super_decl_sign_tl,
+    originality-decl-name   / format      =
+      \__nwafu_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    supervisor-decl-name / format      =
+      \__nwafu_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    originality-decl-text   / format      = \zihao { -4 },
+    supervisor-decl-text / format      = \zihao { -4 },
+    originality-decl-name   / bottom-skip = 0.25 cm,
+    originality-decl-text   / bottom-skip = 0.4 cm,
+    originality-decl-sig    / bottom-skip = 0.4 cm,
+    supervisor-decl-name / bottom-skip = 0.25 cm,
+    supervisor-decl-text / bottom-skip = 0.4 cm,
+    originality-decl-name   / align       = center,
+    originality-decl-sig    / align       = left,
+    supervisor-decl-name / align       = center,
+    supervisor-decl-sig  / align       = left,
+  }
+\DeclareInstance { nwafu / cover } { cover-vi-default } { cover-vi }
+  {
+    format                                =
+      \__nwafu_line_spread:n { 1.25 },
+    top-skip                              = 0 pt plus 0.2 fill,
+    bottom-skip                           = 0 pt plus 2.5 fill,
+    authorization-decl-name   / content     = \c__nwafu_name_auth_decl_tl,
+    authorization-decl-text   / content     = \c__nwafu_auth_decl_text_tl,
+    authorization-decl-sig    / content     =
+      \__nwafu_cover_signature:N \c__nwafu_orig_decl_sign_tl,
+    supervisor-decl-sig  / content     =
+      \__nwafu_cover_signature:N \c__nwafu_super_decl_sign_tl,
+    authorization-decl-name   / format      =
+      \__nwafu_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    authorization-decl-text   / format      = \zihao { -4 },
+    authorization-decl-name   / bottom-skip = 0.25 cm,
+    authorization-decl-text   / bottom-skip = 0.8 cm,
+    authorization-decl-sig    / bottom-skip = -0.50 cm,
+    authorization-decl-name   / align       = center,
+    authorization-decl-sig    / align       = left,
+    supervisor-decl-sig  / align       = left,
+  }
+\DeclareInstance { nwafu / cover } { cover-vii-default } { cover-vii }
+  {
+    format                                =
+      \__nwafu_line_spread:n { 1.25 },
+    top-skip                              = 0 pt plus 0.2 fill,
+    bottom-skip                           = 0 pt plus 2.5 fill,
+    originality-decl-name   / content     = \c__nwafu_name_orig_decl_tl,
+    originality-decl-text   / content     = \c__nwafu_orig_decl_text_tl,
+    originality-decl-sig    / content     =
+      \__nwafu_cover_signature:N \c__nwafu_orig_decl_sign_tl,
+    authorization-decl-name / content     = \c__nwafu_name_auth_decl_tl,
+    authorization-decl-text / content     = \c__nwafu_auth_decl_text_tl,
+    authorization-decl-sig  / content     =
+      \__nwafu_cover_signature:N \c__nwafu_orig_decl_sign_tl,
+    supervisor-decl-sig  / content     =
+      \__nwafu_cover_signature:N \c__nwafu_super_decl_sign_tl,
+    originality-decl-name   / format      =
+      \__nwafu_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    authorization-decl-name / format      =
+      \__nwafu_line_spread:n { 1.2 } \zihao { 3 } \sffamily,
+    originality-decl-text   / format      = \zihao { -4 } \nwafu at kai,
+    authorization-decl-text / format      = \zihao { -4 } \nwafu at kai,
+    originality-decl-sig   / format      = \zihao { -4 } \nwafu at kai,
+    authorization-decl-sig / format      = \zihao { -4 } \nwafu at kai,
+    supervisor-decl-sig / format      = \zihao { -4 } \nwafu at kai,
+    originality-decl-name   / bottom-skip = 0.25 cm,
+    originality-decl-text   / bottom-skip = 0.4 cm,
+    originality-decl-sig    / bottom-skip = 0.4 cm,
+    authorization-decl-name / bottom-skip = 0.25 cm,
+    authorization-decl-text / bottom-skip = 0.4 cm,
+    authorization-decl-sig    / bottom-skip = -0.5 cm,
+    originality-decl-name   / align       = center,
+    originality-decl-sig    / align       = left,
+    authorization-decl-name / align       = center,
+    authorization-decl-sig  / align       = left,
+    supervisor-decl-sig  / align       = left,
+  }
+\bool_new:N \l__nwafu_auto_make_cover_bool
+\keys_define:nn { nwafu / style }
+  {
+    auto-make-cover .bool_set:N = \l__nwafu_auto_make_cover_bool,
+    auto-make-cover .default:n  = true
+  }
+\NewDocumentCommand \makecovers { }
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \begin{titlepage}
+          \makecoveri
+          \newpage
+          \makecoverii
+          \newpage
+          \makecoveriii
+          \newpage
+          \makecoveriv
+          \newpage
+          \makecoverv
+          \newpage
+          \makecovervi
+        \end{titlepage}
+      }{
+        \begin{titlepage}
+          \makecoveri
+          \cleardoublepage
+          \makecovervii
+        \end{titlepage}
+      }
+  }
+\tl_new:c { l__nwafu_abstract_file_tl }
+\tl_new:c { l__nwafu_abstract_file_en_tl }
+\clist_new:N \l__nwafu_abstract_keywords_clist
+\clist_new:N \l__nwafu_abstract_keywords_en_clist
+\tl_new:c { l__nwafu_notation_file_tl }
+\keys_define:nn { nwafu / abstract }
+  {
+    abstractfile  .tl_set:N = \l__nwafu_abstract_file_tl,
+    abstractfile* .tl_set:N = \l__nwafu_abstract_file_en_tl,
+    keywords  .clist_set:N = \l__nwafu_abstract_keywords_clist,
+    keywords* .clist_set:N = \l__nwafu_abstract_keywords_en_clist,
+    notationfile  .tl_set:N  = \l__nwafu_notation_file_tl,
+    notationfile  .default:n = {},
+  }
+\NewDocumentCommand \makefront { }
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \frontmatter
+        \tl_if_empty:NF \l__nwafu_abstract_file_tl
+          {
+            \begin{abstract}
+              \file_input:V \l__nwafu_abstract_file_tl
+            \end{abstract}
+          }
+        \tl_if_empty:NF \l__nwafu_abstract_file_en_tl
+          {
+            \begin{abstract*}
+              \file_input:V \l__nwafu_abstract_file_en_tl
+            \end{abstract*}
+          }
+        \cleardoublepage
+        \pagenumbering{Roman}
+        \tableofcontents
+        % \frontmatter
+        \tl_if_empty:NF \l__nwafu_notation_file_tl
+          {
+            \cleardoublepage
+            \pagenumbering{Roman}
+            \file_input:V \l__nwafu_notation_file_tl
+          }
+      }{
+        \cleardoublepage
+        \thispagestyle { empty }
+        \tl_if_empty:NF \l__nwafu_abstract_file_tl
+          {
+            \begin{abstract}
+              \__nwafu_get_text_width:Nn \l__nwafu_tmpa_dim {\c__nwafu_name_keywords_tl}
+              \group_begin:
+                \par \indent
+                {\sffamily\zihao{-4}
+                \__nwafu_spread_box:Vn \l__nwafu_tmpa_dim {\c__nwafu_name_abstract_tl}
+                \c__nwafu_fwid_colon_tl}
+                \normalfont
+                \file_input:V \l__nwafu_abstract_file_tl
+              \group_end:
+            \end{abstract}
+          }
+        \clearpage
+        \thispagestyle { empty }
+        \tl_if_empty:NF \l__nwafu_abstract_file_en_tl
+          {
+            \begin{abstract*}
+              \group_begin:
+                \par \indent
+                {\bfseries\zihao{-4}
+                \c__nwafu_name_abstract_en_tl : ~}
+                \normalfont
+                \file_input:V \l__nwafu_abstract_file_en_tl
+              \group_end:
+            \end{abstract*}
+          }
+        \frontmatter
+        \tableofcontents
+      }
+  }
+\AfterEndPreamble
+  {
+    \bool_if:NT \l__nwafu_auto_make_cover_bool
+      {
+        \makecovers
+        \makefront
+      }
+  }
+\keys_set:nn { ctex }
+  {
+    contentsname   = \c__nwafu_name_toc_tl,
+    listfigurename = \c__nwafu_name_lof_tl,
+    listtablename  = \c__nwafu_name_lot_tl,
+  }
+\clist_map_inline:nn
+  {
+      chapter, section, subsection, figure, table
+  }
+  {
+    \clist_map_inline:nn
+      {
+        format, indent, rule, numsep
+      }
+      {
+        \tl_new:c {__nwafu_toc_ #1 _ ##1 _ tl}
+      }
+  }
+\clist_map_inline:nn
+  {
+      chapter, section, subsection, figure, table
+  }
+  { \dim_new:c { __nwafu_toc_ #1 _offset_dim } }
+\bool_new:N \__nwafu_toc_line_align_bool
+\bool_new:N \__nwafu_titletoc_hang_fix_bool
+\tl_set:Nn \__nwafu_toc_chapter_format_tl { \addvspace{1pt}\nwafu at hei \bfseries }
+\tl_set:Nn \__nwafu_toc_chapter_indent_tl {0pc}
+\tl_set:Nn \__nwafu_toc_chapter_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \__nwafu_toc_chapter_numsep_tl {0.5\ccwd}
+\dim_set:Nn \__nwafu_toc_chapter_offset_dim
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \__nwafu_toc_section_format_tl
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}\small
+      }
+  }
+\tl_set:Nn \__nwafu_toc_section_indent_tl { \ccwd }
+\tl_set:Nn \__nwafu_toc_section_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \__nwafu_toc_section_numsep_tl {0.5\ccwd}
+\dim_set:Nn \__nwafu_toc_section_offset_dim
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \__nwafu_toc_subsection_format_tl
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}\small
+      }
+  }
+\tl_set:Nn \__nwafu_toc_subsection_indent_tl {2.0\ccwd}
+\tl_set:Nn \__nwafu_toc_subsection_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \__nwafu_toc_subsection_numsep_tl {0.5\ccwd}
+\dim_set:Nn \__nwafu_toc_subsection_offset_dim
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \__nwafu_toc_figure_format_tl
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}
+      }
+  }
+\tl_set:Nn \__nwafu_toc_figure_indent_tl {0pc}
+\tl_set:Nn \__nwafu_toc_figure_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \__nwafu_toc_figure_numsep_tl {0.5\ccwd}
+\dim_set:Nn \__nwafu_toc_figure_offset_dim
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\tl_set:Nn \__nwafu_toc_table_format_tl
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          \addvspace{0pt}
+      }{
+          \addvspace{1pt}
+      }
+  }
+\tl_set:Nn \__nwafu_toc_table_indent_tl {0pc}
+\tl_set:Nn \__nwafu_toc_table_rule_tl {\tocrule{$\cdot$}}
+\tl_set:Nn \__nwafu_toc_table_numsep_tl {0.5\ccwd}
+\dim_set:Nn \__nwafu_toc_table_offset_dim
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+          0pc
+      }{
+          1pt
+      }
+  }
+\bool_set_false:N \__nwafu_toc_line_align_bool
+\bool_set_false:N \__nwafu_titletoc_hang_fix_bool
+\clist_map_inline:nn
+  {
+      chapter, section, subsection, figure, table
+  }
+  {
+    \titlecontents{#1}
+      [ \use:c { __nwafu_toc_#1_indent_tl } ]
+      { \use:c { __nwafu_toc_#1_format_tl } }
+      {
+        \bool_if:NT \__nwafu_titletoc_hang_fix_bool
+          {
+            \contentspush
+              {
+                \thecontentslabel
+                \hspace{\use:c { __nwafu_toc_#1_numsep_tl }}
+              }
+          }
+      }
+      {}
+      {\use:c { __nwafu_toc_#1_rule_tl }}
+      [\addvspace{\use:c{ __nwafu_toc_ #1 _offset_dim }}]
+  }
+
+\cs_new:Npn \NWAFUNumberLine #1
+  {
+    \CTEXifname
+      {
+        \use:c { CTEXthe#1 }
+        \hspace{\use:c { __nwafu_toc_#1_numsep_tl }}
+      }{}
+  }
+
+\bool_if:NTF \__nwafu_titletoc_hang_fix_bool
+  {
+    \keys_set:nn { ctex }
+      {
+        chapter/tocline     = \CTEXnumberline{#1}#2,
+        section/tocline     = \CTEXnumberline{#1}#2,
+        subsection/tocline  = \CTEXnumberline{#1}#2
+      }
+  }{
+    \keys_set:nn { ctex }
+      {
+        chapter/tocline     = \NWAFUNumberLine{#1}#2,
+        section/tocline     = \NWAFUNumberLine{#1}#2,
+        subsection/tocline  = \NWAFUNumberLine{#1}#2
+      }
+ }
+\NewDocumentCommand{\tocrule}{sO{0.3pc}D(){1.2}mO{}}
+  {
+    \small\normalfont
+    \titlerule*[#2]{\scalebox{#3}{#4}}#5
+    \IfBooleanTF{#1}
+      {\thecontentspage}
+      {
+        \bool_if:NTF \__nwafu_toc_line_align_bool
+          {\contentspage}{\thecontentspage}
+      }
+  }
+\__nwafu_patch_cmd:Nnn \tableofcontents
+  {
+    \chapter*{\contentsname
+      \@mkboth{\MakeUppercase\contentsname}
+              {\MakeUppercase\contentsname}}
+  }
+  { \__nwafu_chapter_no_toc:V \contentsname }
+\__nwafu_patch_cmd:Nnn \listoffigures
+  {
+    \chapter*{\listfigurename}
+    \@mkboth{\MakeUppercase\listfigurename}
+            {\MakeUppercase\listfigurename}
+  }
+  { \__nwafu_chapter:V \listfigurename }
+\__nwafu_patch_cmd:Nnn \listoftables
+  {
+    \chapter*{\listtablename}
+    \@mkboth{\MakeUppercase\listtablename}
+            {\MakeUppercase\listtablename}
+  }
+  { \__nwafu_chapter:V \listtablename }
+\NewDocumentEnvironment { abstract  } { }
+  { \__nwafu_abstract_begin:    } { \__nwafu_abstract_end:      }
+\NewDocumentEnvironment { abstract* } { }
+  { \__nwafu_abstract_en_begin: } { \__nwafu_abstract_en_end:   }
+\cs_new_protected:Npn \__nwafu_abstract_begin:
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \__nwafu_chapter:V \c__nwafu_name_abstract_tl
+      }{
+        \par \mode_leave_vertical: \par
+        \begin{center}\nwafu at hei\bfseries\zihao{3}\l__nwafu_info_title_tl\end{center}
+      }
+  }
+\cs_new_protected:Npn \__nwafu_abstract_en_begin:
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \__nwafu_chapter:n \c__nwafu_name_abstract_en_tl
+      }{
+        \par \mode_leave_vertical: \par
+        \begin{center}\bfseries\zihao{3}\l__nwafu_info_title_en_tl\end{center}
+      }
+  }
+\cs_new_protected:Npn \__nwafu_abstract_end:
+  {
+    \__nwafu_keywords:nNn
+      { \sffamily \zihao{-4} \c__nwafu_name_keywords_tl \c__nwafu_fwid_colon_tl  }
+      \l__nwafu_abstract_keywords_clist { ; ~}
+  }
+\cs_new_protected:Npn \__nwafu_abstract_en_end:
+  {
+    \__nwafu_keywords:nNn
+      { \bfseries \c__nwafu_name_keywords_en_tl : ~ }
+      \l__nwafu_abstract_keywords_en_clist { ; ~ }
+  }
+\cs_new_protected:Npn \__nwafu_keywords:nNn #1#2#3
+  {
+    \int_compare:nNnTF { \g__nwafu_thesis_type_int } < { 3 }
+      {
+        \par \mode_leave_vertical: \par \noindent
+        \__nwafu_get_text_width:Nn \l__nwafu_tmpa_dim {#1}
+        \group_begin: \MakeUppercase{#1} \group_end:
+        \parbox [t] { \dim_eval:n { \textwidth - \l__nwafu_tmpa_dim } }
+          {
+            \clist_use:Nn #2 {#3} \par
+            \cs_gset:Npx \__nwafu_keywords_prevdepth: { \dim_use:N \tex_prevdepth:D }
+          }
+      }{
+        \par \mode_leave_vertical: \par
+        \__nwafu_get_text_width:Nn \l__nwafu_tmpa_dim {#1}
+        \group_begin: #1 \group_end:
+        \clist_use:Nn #2 {#3} \par
+        \cs_gset:Npx \__nwafu_keywords_prevdepth: { \dim_use:N \tex_prevdepth:D }
+      }
+  }
+\NewDocumentEnvironment { notation } { O { l p { 7.5 cm } } }
+  {
+    \__nwafu_notation_begin:
+    \group_begin:
+      \__nwafu_notation_long_table_setup:
+      \longtable {#1}
+  }
+  {
+      \endlongtable
+    \group_end:
+  }
+\cs_new_protected:Npn \__nwafu_notation_begin:
+  {
+    \__nwafu_chapter_no_toc:V \c__nwafu_name_notation_tl
+  }
+\cs_new_protected:Npn \__nwafu_notation_long_table_setup:
+  {
+    \dim_set_eq:NN \LTpre  \c_zero_dim
+    \dim_set_eq:NN \LTpost \c_zero_dim
+  }
+\NewDocumentEnvironment { acknowledgement } { }
+  {
+    \group_begin:
+    \__nwafu_chapter:V \c__nwafu_name_ack_tl
+  }
+  {
+    \group_end:
+  }
+\NewDocumentEnvironment { resume } { }
+  {
+    \group_begin:
+    \__nwafu_chapter:V \c__nwafu_name_resume_tl
+  }
+  {
+    \group_end:
+  }
+\NewDocumentCommand{ \resumitem }{ O{ 学习经历 } }
+  {%
+    \vspace{24bp}{\zihao{-4}\nwafu at hei\bfseries\centerline{#1}}\par\vspace{6bp}
+  }
+\NewDocumentCommand{ \researchitem }{ O{ 发表的学术论文 } }
+  {%
+    \vspace{32bp}{\zihao{-4}\nwafu at hei\bfseries\centerline{#1}}\par\vspace{14bp}
+  }
+\newlist{publications}{enumerate}{1}
+\setlist[publications]{label=[\arabic*],align=left,nosep,itemsep=6bp,
+  leftmargin=10mm,before=\zihao{-4},resume}
+\newlist{achievements}{enumerate}{1}
+\setlist[achievements]{label=[\arabic*],align=left,nosep,itemsep=6bp,
+  leftmargin=10mm,before=\zihao{-4}}
+\def\publicationskip{\bigskip\bigskip}
+\clist_new:N \l__nwafu_bib_resource_clist
+\keys_define:nn { nwafu / style }
+  {
+    bib-resource .clist_set:N = \l__nwafu_bib_resource_clist
+  }
+\__nwafu_at_end_preamble:n
+  {
+    \__nwafu_biblatex_pre_setup:
+    \RequirePackage { biblatex }
+    \__nwafu_biblatex_post_setup:
+  }
+\cs_new_protected:Npn \__nwafu_biblatex_pre_setup:
+  {
+    \__nwafu_pass_options_to_biblatex:n { style = gb7714-2015ay }
+    \__nwafu_pass_options_to_biblatex:n { backend = biber, sortlocale=zh__pinyin,
+        gbtype=false, maxbibnames=99, maxcitenames=2, mincitenames=1,
+        gbpub=false, uniquename=false, uniquelist=false, gbnamefmt=lowercase,
+        doi=false, isbn=false, gbfieldtype=true, gbpunctin=false,
+      }
+  }
+\cs_new_protected:Npn \__nwafu_biblatex_post_setup:
+  {
+    \__nwafu_biblatex_misc:
+    \clist_map_function:NN \l__nwafu_bib_resource_clist \addbibresource
+    \__nwafu_biblatex_allow_url_break:
+    \defbibheading { bibliography } [ \bibname ] { \__nwafu_chapter:n {##1} }
+  }
+\cs_new_protected:Npn \__nwafu_pass_options_to_biblatex:n #1
+  { \PassOptionsToPackage {#1} { biblatex } }
+\cs_new:Npn \__nwafu_biblatex_misc:
+  {
+    \DefineBibliographyExtras{english}{\renewcommand*{\bibrangedash}{$\sim$}}
+    \newcommand\nwafu at font@bib{\__nwafu_line_spread:n {1.3}\zihao{5}}
+    \renewcommand{\bibfont}{\nwafu at font@bib}
+    \DeclareFieldFormat[article]{journaltitle}{\iffieldequalstr{userd}{chinese}{##1}{\textit{##1}}\isdot}
+    \renewcommand{\postnotedelim}{\addcolon\space}
+    \DeclareFieldFormat{postnote}{##1}
+    \DeclareDelimFormat[cite,parencite,pagescite]{nameyeardelim}{\space}
+    \DeclareDelimFormat[textcite]{nameyeardelim}{\space}
+    \DeclareDelimFormat[bib,biblist]{nameyeardelim}{\addperiod\space}
+    \renewcommand*{\finentrypunct}{}
+    \DefineBibliographyStrings{english}{
+        andincitecn = {和},
+        andincite   = {and},
+        mathesiscn={[硕士学位论文]},
+        phdthesiscn={[博士学位论文]},
+        in={In:\addspace},
+        incn={见:\addspace},
+      }
+    \DeclareDelimFormat{finalnamedelim}{%
+        \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}%
+        \edef\userfieldabcde{userd}%
+        \ifcurrentname{translator}{\edef\userfieldabcde{usere}}{}%
+        \ifcurrentname{editor}{\edef\userfieldabcde{userc}}{}%
+        \ifcurrentname{author}{\edef\userfieldabcde{userf}}{}%
+        \ifcurrentname{bookauthor}{\edef\userfieldabcde{userb}}{}%
+        \ifcase\value{gbcitelocalcase}%
+          \iffieldequalstr{\userfieldabcde}{chinese}{\bibstring{andincitecn}}{}%
+          \iffieldequalstr{\userfieldabcde}{korean}{\bibstring{andkr}}{}%
+          \iffieldequalstr{\userfieldabcde}{japnese}{\bibstring{andjp}}{}%
+          \iffieldequalstr{\userfieldabcde}{english}{\addspace\bibstring{andincite}\addspace}{}%
+          \iffieldequalstr{\userfieldabcde}{french}{\addspace\bibstring{and}\addspace}{}%
+          \iffieldequalstr{\userfieldabcde}{russian}{\addspace\bibstring{and}\addspace}{}%
+        \or%
+        \bibstring{andincitecn}%
+        \or%
+        \addspace\bibstring{andincite}\addspace%
+        \fi
+      }
+    \DeclareDelimFormat{strandothersdelim}{%
+        \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}%
+        %\addspace%
+        \edef\userfieldabcde{userd}%
+        \ifcurrentname{translator}{\edef\userfieldabcde{usere}}{}%
+        \ifcurrentname{editor}{\edef\userfieldabcde{userc}}{}%
+        \ifcurrentname{author}{\edef\userfieldabcde{userf}}{}%
+        \ifcurrentname{bookauthor}{\edef\userfieldabcde{userb}}{}%
+        \ifcase\value{gbcitelocalcase}%
+          \iffieldequalstr{\userfieldabcde}{chinese}{\bibstring{andothersincitecn}}{}%
+          \iffieldequalstr{\userfieldabcde}{korean}{\bibstring{andotherskr}}{}%
+          \iffieldequalstr{\userfieldabcde}{japnese}{\bibstring{andothersjp}}{}%
+          \iffieldequalstr{\userfieldabcde}{english}{\bibstring{andothersincite}}{}%
+          \iffieldequalstr{\userfieldabcde}{french}{\bibstring{andothers}}{}%
+          \iffieldequalstr{\userfieldabcde}{russian}{\bibstring{andothers}}{}%
+        \or%
+        \bibstring{andothersincitecn}%
+        \or%
+        \bibstring{andothersincite}%
+        \fi
+      }
+    \AtEveryCitekey{%
+        \iffieldequalstr{userf}{chinese}{\renewcommand*{\andothersdelim}{}}%\addthinspace
+        {\renewcommand*{\andothersdelim}{\addspace}}%
+      }
+    \renewbibmacro*{cite:extradate}{%
+        \iffieldundef{extradate} {}
+        {\printtext[bibhyperref]{\printlabeldateextra}}%\printfield{extradate}
+      }
+    \renewbibmacro*{date+extradate}{%
+        \iffieldundef{labelyear}{}%
+        {\ifboolexpr{%
+           test {\ifentrytype{patent}}
+           or
+           (test {\ifentrytype{newspaper}} )%
+         }%
+         {\printtext{\blx at isodate{}{}}}%
+         {\printtext{%
+             \iflabeldateisdate
+             {\printdateextra}
+             {\printlabeldateextra}
+          }
+         }%
+        }%
+      }
+    \newbibmacro*{origdate+extradate}{%
+        \printtext{\printorigdate}%
+      }
+    \renewbibmacro*{bytranslator+others}{%
+        \ifnameundef{translator}
+          {}
+          {\printnames[bytranslator]{translator}%
+           \usebibmacro{bytranslator+othersstrg}%“译”的位置换到下面来,即放到译者后面。
+           \newunit
+          }%
+        \usebibmacro{withothers}%
+        \ifboolexpr{%
+          test {\iffieldundef{origyear}} or test {\ifnameundef{translator}}%%
+        }{}{\printtext{\printdate}}%
+      }
+    \renewbibmacro*{url+urldate}{%
+        \usebibmacro{url}%
+        \iffieldundef{urlyear}%
+        {}
+        {\usebibmacro{urldate}
+        }
+      }
+    \DeclareFieldFormat{addnumflag}{%
+        \ifentrytype{newspaper}
+        {\setunit{\addcomma\addspace}\printtext{##1}}
+        {\nobreak\printtext{(}\nobreak ##1\nobreak\printtext{)}}
+      }
+    \renewbibmacro*{patenttitle}{%原输出来自biblatex.def文件
+        \ifboolexpr{%
+          test{\iffieldundef{title}}%
+          and%
+          test{\iffieldundef{subtitle}}%
+        }%
+        {}%
+        {
+          \printtext[title]{\bibtitlefont%
+          \printfield[titlecase]{title}%
+          \ifboolexpr{test {\iffieldundef{subtitle}}}%这里增加了对子标题的判断,解决不判断多一个点的问题
+          {}
+          {
+            \setunit{\subtitlepunct}%
+            \printfield[titlecase]{subtitle}}%
+            \iffieldundef{titleaddon}{}%判断一下titleaddon,否则直接加可能多一个空格
+            {\setunit{\subtitlepunct}\printfield{titleaddon}}%
+            \setunit{\adddot\addspace}\printfield{number}%写专利号
+            \iftoggle{bbx:gbtype}{\printfield[gbtypeflag]{usera}}{}%
+          }%
+        }%
+      }
+    \renewbibmacro*{name:andothers}{%
+        \ifboolexpr{
+          test {\ifnumequal{\value{listcount}}{\value{liststop}}}
+          and
+          test \ifmorenames
+        }{\ifnumgreater{\value{liststop}}{1}%
+            {\finalandcomma}%
+            {}%
+            \printdelim{andothersdelim}\printdelim{strandothersdelim}%
+        }{%当是译者的时候需要特殊处理
+          \ifcurrentname{translator}{\addcomma}{}%
+        }
+      }
+    \DeclareFieldFormat{edition}{%
+        \testCJKfirst{userd}%
+        \iftoggle{ifCJKforgbt}%
+        {\ifinteger{##1}%
+          {\printtext{\bibstring{serialcn}\zhnumber{##1}\str at edition}}%
+          {##1\isdot}
+        }%
+        {\ifinteger{##1}%
+          {\mkbibordedition{##1}~\bibstring{edition}}%
+          {##1\isdot}
+        }
+      }
+    \renewbibmacro*{author}{%
+        \ifboolexpr{
+          test \ifuseauthor
+          and
+          not test {\ifnameundef{author}}
+        }{\usebibmacro{bbx:dashcheck}
+           {\printnames{author}\setunit{\printdelim{nameyeardelim}}%把标点也带上
+           }{\usebibmacro{bbx:savehash}%
+             \printnames{author}%
+             \iffieldundef{authortype}
+               {\setunit{\printdelim{nameyeardelim}}}
+               {\setunit{\printdelim{authortypedelim}}}
+           }%
+           \iffieldundef{authortype}
+             {}
+             {\usebibmacro{authorstrg}%
+              \setunit{\printdelim{nameyeardelim}}
+             }
+        }%
+        {\global\undef\bbx at lasthash
+         \usebibmacro{labeltitle}%
+         \setunit*{\printdelim{nonameyeardelim}}
+        }%
+        \ifboolexpr{%
+          test {\iffieldundef{origyear}} or test {\ifnameundef{translator}}%
+        }{\usebibmacro{date+extradate}}%
+        {\usebibmacro{origdate+extradate}}%
+      }
+    \DeclareBibliographyDriver{book}{%源来自standard.bbx文件
+        \usebibmacro{bibindex}%
+        \usebibmacro{begentry}%
+        \usebibmacro{author/editor+others/translator+others}%
+        \ifnameundef{author}{}{\setunit{\labelnamepunct}\newblock}%这一段用于去除作者不存在时多出的标点
+        \usebibmacro{maintitle+title}%
+        \iftoggle{bbx:gbstrict}{}{%
+          \newunit%
+          \printlist{language}%
+          \newunit\newblock%
+          \usebibmacro{byauthor}%
+          \newunit\newblock%
+        }%
+        \newunit%
+        \printfield{edition}%
+        \newunit%
+        \usebibmacro{byeditor+others}%
+        \newunit\newblock%
+        \iftoggle{bbx:gbstrict}{}{%
+          \iffieldundef{maintitle}%
+          {%
+            \printfield{volume}%
+            \printfield{part}%
+          }%
+          {}%
+          \newunit%
+          \printfield{volumes}%
+          \newunit\newblock%
+          \usebibmacro{series+number}%
+        }%
+        \newunit\newblock%
+        \usebibmacro{publisher+location+date}%
+        \usebibmacro{chapter+pages}%
+        \iffieldundef{url}{}{%当没有网址时也不输出
+          \usebibmacro{modifydate}%带括号的修改或更新日期,
+        }%
+        \usebibmacro{doi+eprint+url}%从下面移动到上面来,因为gbt2015的url需直接放在页码后面。
+        \newunit\newblock%
+        \printfield{pagetotal}%
+        \newunit\newblock%
+        \iftoggle{bbx:isbn}%
+          {\printfield{isbn}}
+          {}%
+        \newunit\newblock%
+        \usebibmacro{addendum+pubstate}%
+        \setunit{\bibpagerefpunct}\newblock
+        \usebibmacro{pageref}%
+        \newunit\newblock%
+        \iftoggle{bbx:related}%
+          {\usebibmacro{related:init}%
+           \usebibmacro{related}%
+          }{}%
+        \usebibmacro{finentry}
+      }
+    \DeclareBibliographyDriver{online}{%源来自standard.BBX
+        \usebibmacro{bibindex}%
+        \usebibmacro{begentry}%
+        \usebibmacro{author/editor+others/translator+others}%
+        \ifnameundef{author}{}{\setunit{\labelnamepunct}\newblock}%这一段用于去除作者不存在时多出的标点
+        \usebibmacro{title}%
+        \iftoggle{bbx:gbstrict}{}{%
+          \newunit%
+          \printlist{language}%
+          \newunit\newblock
+          \usebibmacro{byauthor}%
+          \newunit\newblock
+          \usebibmacro{byeditor+others}%
+          \newunit\newblock
+          \printfield{note}
+        }%
+        \newunit
+        \printfield{version}%
+        \newunit\newblock
+        \printlist{institution}%
+        \newunit\newblock
+        \ifboolexpr{%
+          test{\iffieldundef{day}} and test{\iffieldundef{endday}} and test{\iffieldundef{eventday}}%
+        }{\usebibmacro{date}}%
+        \usebibmacro{url+urldate}%从下面移上来
+        \newunit\newblock
+        \iftoggle{bbx:eprint}
+          {\usebibmacro{eprint}}
+          {}%
+        \newunit\newblock
+        \usebibmacro{addendum+pubstate}%
+        \setunit{\bibpagerefpunct}\newblock
+        \usebibmacro{pageref}%
+        \newunit\newblock
+        \iftoggle{bbx:related}
+          {\usebibmacro{related:init}%
+           \usebibmacro{related}}
+          {}%
+        \usebibmacro{finentry}
+      }
+    \DeclareBibliographyDriver{patent}{%源来自standard.BBX
+        \usebibmacro{bibindex}%
+        \usebibmacro{begentry}%
+        \usebibmacro{author}%
+        \ifnameundef{author}{}{\setunit{\labelnamepunct}\newblock}%这一段用于去除作者不存在时多出的标点
+        \usebibmacro{patenttitle}%给出专利专用的标题输出
+        \iftoggle{bbx:gbstrict}{}{%
+          \newunit%
+          \printlist{language}%
+          \newunit\newblock
+          \usebibmacro{byauthor}
+        }%
+        \newunit\newblock
+        \printfield{type}%
+        \setunit*{\addspace}%
+        \iflistundef{location}
+          {}
+          {\setunit*{\addspace}%
+           \printtext{%[parens]
+           \printlist[][-\value{listtotal}]{location}}
+          }%
+        \newunit\newblock
+        \usebibmacro{byholder}%
+        \newunit\newblock
+        \printfield{note}%
+        \newunit\newblock
+        \usebibmacro{doi+eprint+url}%
+        \newunit\newblock
+        \usebibmacro{addendum+pubstate}%
+        \setunit{\bibpagerefpunct}\newblock
+        \usebibmacro{pageref}%
+        \newunit\newblock
+        \iftoggle{bbx:related}
+          {\usebibmacro{related:init}%
+           \usebibmacro{related}
+          }
+          {}%
+        \usebibmacro{finentry}
+      }
+    \setlength{\bibitemsep}{2pt}
+    \setlength{\bibnamesep}{0ex}
+    \setlength{\bibinitsep}{0ex}
+    \setlength{\bibitemindent}{-2\ccwd}% bibitemindent表示一条文献中第一行相对后面各行的缩进
+    \setlength{\bibhang}{2\ccwd} % 表示的各行起始位置到页边的距离
+  }
+\cs_new:Npn \__nwafu_biblatex_allow_url_break:
+  {
+    \int_set_eq:NN \c at biburlucpenalty  \c_one_int
+    \int_set_eq:NN \c at biburlnumpenalty \c_one_int
+    \int_set_eq:NN \c at biburllcpenalty  \c_one_int
+  }
+\cs_new:Npn \__nwafu_set_cite_style_author_year:
+  {
+    \NAT at numbersfalse
+    \cs_set_eq:NN \NAT at open  \c__nwafu_fwid_left_paren_tl
+    \cs_set_eq:NN \NAT at close \c__nwafu_fwid_right_paren_tl
+    \cs_set_eq:NN \NAT at sep   \c__nwafu_fwid_semicolon_tl
+    \cs_set_eq:NN \NAT at aysep \c__nwafu_fwid_comma_tl
+    \cs_set_eq:NN \NAT at yrsep \c__nwafu_ideo_comma_tl
+  }
+\skip_set:Nn \parskip { 0pt plus 2pt minus 1pt }
+\skip_set:Nn \intextsep { 14pt plus 2pt minus 2pt }
+\skip_set:Nn \textfloatsep { 16pt plus 2pt minus 4pt }
+\allowdisplaybreaks[4]
+\ctex_after_end_preamble:n
+  {
+    \skip_set:Nn \abovedisplayskip { 5pt plus 1pt minus 1pt }
+    \skip_set:Nn \belowdisplayskip { 5pt plus 1pt minus 1pt }
+    \skip_set:Nn \abovedisplayshortskip { 0pt }
+    \skip_set:Nn \belowdisplayshortskip { 5pt plus 1pt minus 1pt }
+  }
+\cs_new_protected:Npn \__nwafu_enumitem_label_set:nn #1#2
+  { \SetEnumitemValue{label}{#1}{#2} }
+\clist_map_inline:nn
+  {
+    { bullet   } { \textbullet                      },
+    { endash   } { \normalfont\bfseries\textendash  },
+    { asterisk } { \textasteriskcentered            },
+    { arabic   } { \bool_if:NTF \l__nwafu_withchap_bool
+                      { \arabic*. }{ (\arabic*) }   },
+    { alph     } { \bool_if:NTF \l__nwafu_withchap_bool
+                      { \alph*. }{ (\alph*) }       },
+    { roman    } { \bool_if:NTF \l__nwafu_withchap_bool
+                      { \roman*. }{ (\roman*) }     },
+    { alph     } { (\alph*)                         },
+    { roman    } { \roman*.                         },
+    { outline  } { \upshape\ding{111}               }
+  }
+  { \__nwafu_enumitem_label_set:nn #1 }
+\SetEnumitemValue{font}{sf}{\normalfont\sffamily}
+\SetEnumitemValue{ref}{enumii}{\arabic{enumi}.\alph*}
+\SetEnumitemValue{ref}{enumiii}{\arabic{enumi}.\alph{enumii}.\roman*}
+\setlist
+  {
+    nosep,
+    leftmargin = *,
+    labelindent = \dimexpr\parindent+0pt\relax,
+    wide=\parindent,
+  }
+\setlist[itemize,1]{label = bullet}
+\setlist[itemize,2]{label = endash}
+\setlist[itemize,3]{label = asterisk}
+\setlist[enumerate,1]{label = arabic,ref = \arabic*}
+\setlist[enumerate,2]{label = alph,ref = enumii}
+\setlist[enumerate,3]{label = roman,ref = enumiii,labelwidth = *}
+\setlist[description]{font = sf,labelwidth = *,leftmargin = 2\ccwd}
+\NewDocumentCommand \hypersetup { m }
+  { \nwafu_hyperref_setup:n {#1} }
+\cs_new_protected:Npn \nwafu_hyperref_setup:n #1
+  { \clist_gput_right:Nn \g__nwafu_to_hyperref_clist {#1} }
+\cs_new:Npn \__nwafu_set_hyperlink_color_key:n #1
+  {
+    hyperlink-color / \clist_item:nn {#1} {1} .code:n =
+      {
+        \__nwafu_define_hyperlink_color:nnn
+          { \clist_item:nn {#1} {2} }
+          { \clist_item:nn {#1} {3} }
+          { \clist_item:nn {#1} {4} }
+        \nwafu_hyperref_setup:n
+          {
+            linkcolor = nwafu at link, linkbordercolor = nwafu at link,
+            urlcolor  = nwafu at url,  urlbordercolor  = nwafu at url,
+            citecolor = nwafu at cite, citebordercolor = nwafu at cite
+          }
+      },
+  }
+\cs_new_protected:Npn \__nwafu_define_hyperlink_color:nnn #1#2#3
+  {
+    \definecolorset { HTML } { nwafu@ } { }
+      { link, #1; url, #2; cite, #3 }
+  }
+\keys_define:nx { nwafu / style }
+  {
+    hyperlink .choice:,
+    hyperlink .value_required:n = true,
+    hyperlink / border .code:n = { },
+    hyperlink / color  .code:n =
+      { \nwafu_hyperref_setup:n { colorlinks = true } },
+    hyperlink / none   .code:n =
+      { \nwafu_hyperref_setup:n { hidelinks  = true } },
+    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 }
+      }
+      \__nwafu_set_hyperlink_color_key:n
+  }
+\cs_new:Npn \nwafu_allow_url_break:
+  {
+    \cs_new:Npn \__nwafu_add_url_break_points:
+      { \tl_map_function:NN \c__nwafu_url_break_points_tl \do }
+    \__nwafu_appto_cmd:Nn \UrlBreaks
+      { \UrlOrds \__nwafu_add_url_break_points: }
+  }
+\tl_const:Nn \c__nwafu_url_break_points_tl
+  {
+    abcdefghijklmnopqrstuvwxyz
+    ABCDEFGHIJKLMNOPQRSTUVWXYZ
+    0123456789
+  }
+\ctex_at_end_preamble:n
+  {
+    \RequirePackage { hyperref }
+    \hypersetup
+      {
+        bookmarksnumbered = true,
+        psdextra          = true,
+        unicode           = true,
+        pdftitle    = \l__nwafu_info_title_tl,
+        pdfauthor   = \l__nwafu_info_author_tl,
+        pdfkeywords = \l__nwafu_abstract_keywords_clist,
+        pdfcreator  = \c__nwafu_name_pdf_creator_tl
+      }
+    \exp_args:NV \hypersetup \g__nwafu_to_hyperref_clist
+    \nwafu_allow_url_break:
+    \BiblatexManualHyperrefOn
+  }
+\ctex_at_end_package:nn { hyperref }
+  {
+    \pdfstringdefDisableCommands
+      {
+        \cs_set_eq:NN \nwafu at kai \prg_do_nothing:
+        \cs_set_eq:NN \quad    \c_space_tl
+        \cs_set_eq:NN \qquad   \c_space_tl
+      }
+  }
+\labelformat{part}{\CTEXthepart}
+\labelformat{chapter}{\CTEXthechapter}
+\labelformat{figure}{\figurename~#1}
+\labelformat{table}{\tablename~#1}
+\def\figureautorefname{图}
+\def\tableautorefname{表}
+\keys_set_known:nn { ctex }
+  {
+    figurename          = 图,
+    tablename           = 表,
+  }
+\labelformat{equation}{式(#1)}
+\labelformat{section}{节 #1}
+\labelformat{subsection}{小节 #1}
+\keys_define:nn { nwafu }
+  {
+    abstract  .meta:nn = { nwafu / abstract } {#1},
+    info      .meta:nn = { nwafu / info     } {#1},
+    style     .meta:nn = { nwafu / style    } {#1}
+  }
+\keys_set:nn { nwafu }
+  {
+    style   / font-size       = -4,
+    style   / fullwidth-stop  = false,
+    style   / auto-make-cover = true,
+    style   / logo            = { logo/nwafu-bar.pdf },
+    style   / logo-size       = { 0.65 \textwidth },
+    style   / hyperlink       = none,
+    style   / hyperlink-color = default,
+    info    / degree          = academic,
+    info    / secret-level    = none,
+    info    / school-id       = { 10712 },
+    info    / date            = { \zhtoday },
+    theorem / header-font     = { \sffamily },
+    theorem / body-font       = { \nwafu at kai },
+    theorem / counter         = { chapter }
+  }
+\NewDocumentCommand \nwafuset { m }
+  { \keys_set:nn { nwafu } {#1} }
+\newtheorem* { proof       } { \c__nwafu_name_proof_tl      }
+\newtheorem  { axiom       } { \c__nwafu_name_axiom_tl      }
+\newtheorem  { corollary   } { \c__nwafu_name_corollary_tl  }
+\newtheorem  { definition  } { \c__nwafu_name_definition_tl }
+\newtheorem  { example     } { \c__nwafu_name_example_tl    }
+\newtheorem  { lemma       } { \c__nwafu_name_lemma_tl      }
+\newtheorem  { theorem     } { \c__nwafu_name_theorem_tl    }
+\endinput
+%%
+%% End of file `nwafuthesis.cls'.


Property changes on: trunk/Master/texmf-dist/tex/latex/nwafuthesis/nwafuthesis.cls
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2021-08-05 20:53:34 UTC (rev 60172)
@@ -564,7 +564,8 @@
     novel nowidow nox npp-for-context
     nrc ntgclass nth ntheorem ntheorem-vn nuc nucleardata
     numberedblock numberpt
-    numerica numericplots numname numnameru numprint numspell nunito nwejm
+    numerica numericplots numname numnameru numprint numspell nunito
+    nwafuthesis nwejm
   oberdiek objectz obnov
     ocg-p ocgx ocgx2 ocherokee ocr-b ocr-b-outline ocr-latex octave octavo
     odsfile ofs

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2021-08-05 20:53:34 UTC (rev 60172)
@@ -2128,6 +2128,7 @@
  'nth',		'\.sty',
  'ntheorem',    '\.sty|\.std',
  'nucleardata',	'\.(csv|hd|pytxcode)|' . $standardtex,
+ 'nwafuthesis',	'nwafuthesis\.cls', # not *doc.cls
  'nwejm',	'[^c]\.cfg$|\.(.bx|sty|cls)$',	# not ltxdoc.cfg
  'ocgx',        'tikz.*\.code\.tex|' . $standardtex,
  'odsfile',     '\.lua|' . $standardtex,
@@ -2789,6 +2790,7 @@
  'mkjobtexmf',          'Makefile.in|' . $standardsource,
  'mpman-ru',            'NULL', # doc package
  'needspace',           '\.tex|' . $standardsource,
+ 'nwafuthesis',		'\.sh$|' . $standardsource,
  'optexcount',		'\.(py|sh)$|' . $standardsource,
  'ot2cyr',              '\.afm|\.etx|' . $standardsource,
  'patch',               '\.doc',
@@ -2836,6 +2838,7 @@
  'gloss-occitan','NULL',		# polyglossia installs .ldf now
  'lettre',      'NULL',
  'ltximg',	'NULL',                 # doc, no need to build
+ 'nwafuthesis',	'nwafuthesis.dtx',
  'paper',       'install',
  'seuthesis',   'NULL',                 # don't want to run iconv, etc.
  'stix2-type1',	'\.ins|\.fdd',
@@ -3006,6 +3009,7 @@
  'mylatexformat'=> 'pdflatex',
  'nameauth'	=> 'pdflatex-preserve-pdf',
  'notespages'   => 'latex',  # requires interaction
+ 'nwafuthesis'	=> 'xetex',
  'nwejm'	=> 'tex',
  'nomentbl'     => 'latex -translate-file=empty.tcx',   # no 8-bit
  'pbsheet'      => 'latex',  # requires interaction

Modified: trunk/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc	2021-08-05 20:47:40 UTC (rev 60171)
+++ trunk/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc	2021-08-05 20:53:34 UTC (rev 60172)
@@ -139,6 +139,7 @@
 depend nddiss
 depend ndsu-thesis
 depend novel
+depend nwafuthesis
 depend nwejm
 depend nih
 depend nihbiosketch

Added: trunk/Master/tlpkg/tlpsrc/nwafuthesis.tlpsrc
===================================================================


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