From 064bbfdbebde200457d9741e62f244d891b08a75 Mon Sep 17 00:00:00 2001
From: atxy <181850195@smail.nju.edu.cn>
Date: Mon, 13 Sep 2021 21:43:02 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E4=BB=93=E5=BA=93?=
 =?UTF-8?q?=E7=9A=84cls=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AAl3?=
 =?UTF-8?q?=E7=89=88=E7=9A=84DocStrip?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore                            |    6 +
 README.md                             |   14 +-
 latexmkrc                             |   18 -
 njuthesis-l3.dtx                      | 1672 +++++++++++++++++++++++++
 njuthesis.tex => njuthesis-sample.tex |    0
 njuthesis.cls                         |    1 +
 njuthesis.dtx                         |   11 +
 njuthesis.ins                         |    2 +-
 8 files changed, 1698 insertions(+), 26 deletions(-)
 delete mode 100644 latexmkrc
 create mode 100644 njuthesis-l3.dtx
 rename njuthesis.tex => njuthesis-sample.tex (100%)
 mode change 100755 => 100644

diff --git a/.gitignore b/.gitignore
index 169ad12..c27a114 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,11 +12,16 @@
 *.cb2
 .*.lb
 
+## LaTeX class and package
+*.cls
+*.sty
+
 ## Intermediate documents:
 *.hd
 *.dvi
 *.xdv
 *-converted-to.*
+
 # these rules might exclude image files for figures etc.
 # *.ps
 # *.eps
@@ -24,6 +29,7 @@
 
 ## Generated if empty string is given at "Please type another file name for output:"
 njuthesis.pdf
+njuthesis-sample.pdf
 
 ## Bibliography auxiliary files (bibtex/biblatex/biber):
 *.bbl
diff --git a/README.md b/README.md
index 8cdb717..0b010bf 100644
--- a/README.md
+++ b/README.md
@@ -12,22 +12,22 @@
 
 ## 蹇€熷紑濮�
 
-浠�0.9.0鐗堜互鍚庯紝鏈ā鏉夸互`.dtx`鏍煎紡鍙戝竷锛屽悓鏃跺湪release鍖烘彁渚沜ls鏂囦欢銆�
+浠�0.9.0鐗堜互鍚庯紝鏈ā鏉夸互DocStrip(`.dtx`)鏍煎紡鍙戝竷锛屽悓鏃跺湪release鍖烘彁渚沜ls鏂囦欢銆�
 
-### 浣跨敤`.dtx`鏂囦欢
+### 浣跨敤DocStrip鏂囦欢
 
-`.dtx`鍚堝苟浜哃aTeX婧愪唬鐮佸拰鏂囨。锛屾洿鏈夊埄浜庡畯鍖呯殑鍙戝竷銆傝浣跨敤璇ユ枃浠讹紝璇峰湪褰撳墠宸ヤ綔鐩綍涓嬫墦寮€缁堢锛�
+DocStrip鍚堝苟浜哃aTeX婧愪唬鐮佸拰鏂囨。锛屾洿鏈夊埄浜庡畯鍖呯殑鍙戝竷銆傝浣跨敤璇ユ枃浠讹紝璇峰湪褰撳墠宸ヤ綔鐩綍涓嬫墦寮€缁堢锛�
 
 - 杈撳叆`xetex njuthesis.ins`浠ヨВ鍑哄父瑙勪娇鐢ㄧ殑`.cls`鏂囦欢
 - 杈撳叆`latexmk -pv njuthesis.dtx`浠ョ敓鎴愬苟鏌ョ湅鍐呯疆鐨勬枃妗�
 
-璇锋敞鎰忥紝鐩墠鐢变簬鏂囦欢閲嶅悕鍘熷洜锛岀紪璇戣鏂囨ā鏉夸笌鐢熸垚璇存槑鏂囨。寰楀埌鐨凱DF鏂囦欢浼氬啿绐侊紝鍙兘淇濈暀涓€涓€�
+璇锋敞鎰忥紝鐢变簬鏂囦欢閲嶅悕鍘熷洜锛岄」鐩腑鐨勭ず渚嬭鏂囨ā鏉垮凡琚噸鍛藉悕涓篳njuthesis-sample.tex`銆�
 
 ### 鏈湴缂栬瘧
 
 1. 鎺ㄨ崘[浠庡崡澶ч暅鍍忕珯涓嬭浇](https://mirror.nju.edu.cn/download/app/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F)骞跺畨瑁匱eXLive鎴栬€匨iKTeX鏈€鏂扮増
 2. 浠巖elease涓嬭浇鍖呭惈[妯℃澘鍏ㄩ儴鏂囦欢](https://github.com/nju-lug/NJUThesis/releases/latest)鐨勫帇缂╁寘
-3. 鏍规嵁闇€瑕佹洿鏀筦njuthesis.tex`鏂囦欢涓殑鍐呭
+3. 鏍规嵁闇€瑕佹洿鏀筦njuthesis-sample.tex`鏂囦欢涓殑鍐呭
 4. 鍦ㄦā鏉挎牴鐩綍涓嬭繍琛宍latexmk -xelatex`缂栬瘧鏂囦欢锛屽緱鍒板搴旂殑PDF
 
 #### **鍏充簬鏈湴缂栬瘧**
@@ -40,7 +40,7 @@
 ### [鍗楀ぇTeX](https://tex.nju.edu.cn)缂栬瘧
 
 1. 浠巖elease涓嬭浇鍖呭惈[妯℃澘鍏ㄩ儴鏂囦欢](https://github.com/nju-lug/NJUThesis/releases/latest)鐨勫帇缂╁寘
-2. 鐧诲綍[鍗楀ぇTeX](https://tex.nju.edu.cn)锛岀偣鍑籒ew Project -> Upload Project涓婁紶鍒氬垰寰楀埌鐨剒ip鏂囦欢锛屼笂浼犲悗`njuthesis.tex`銆乣njuthesis.cls`绛夋枃浠跺簲鍦ㄦ牴鐩綍锛�0.9.0浠ュ悗鐨勭洰褰曠粨鏋勫涓嬫墍绀猴細
+2. 鐧诲綍[鍗楀ぇTeX](https://tex.nju.edu.cn)锛岀偣鍑籒ew Project -> Upload Project涓婁紶鍒氬垰寰楀埌鐨剒ip鏂囦欢锛屼笂浼犲悗`njuthesis-sample.tex`銆乣njuthesis.cls`绛夋枃浠跺簲鍦ㄦ牴鐩綍锛�0.9.0浠ュ悗鐨勭洰褰曠粨鏋勫涓嬫墍绀猴細
 
     ```shell
     NJUThesis-master/
@@ -51,7 +51,7 @@
     鈹�
     鈹� njuthesis.bib
     鈹� njuthesis.cls
-    鈹� njuthesis.tex
+    鈹� njuthesis-sample.tex
     ```
     
 3. 鍦ㄥ崡澶eX椤圭洰鍐呴〉闈㈠乏涓婅鐨刞Menu`涓紝灏嗙紪璇戝櫒鏀逛负`XeLaTeX`
diff --git a/latexmkrc b/latexmkrc
deleted file mode 100644
index 17e9557..0000000
--- a/latexmkrc
+++ /dev/null
@@ -1,18 +0,0 @@
-# vim: set ft=perl:
-
-$pdf_mode = 5;
-
-$xelatex = "xelatex -shell-escape -file-line-error -halt-on-error -interaction=nonstopmode -no-pdf -synctex=1 %O %S";
-$xdvipdfmx = "xdvipdfmx -q -E -o %D %O %S";
-
-$bibtex_use = 1.5;
-
-$clean_ext = "hd loe ptc run.xml synctex.gz thm xdv";
-
-$makeindex = "makeindex -s gind.ist %O -o %D %S";
-
-add_cus_dep('nlo', 'nls', 0, 'nlo2nls');
-sub nlo2nls {
-    system("makeindex -s nomencl.ist -o \"$_[0].nls\" \"$_[0].nlo\"");
-}
-push @generated_exts, 'nlo', 'nls';
diff --git a/njuthesis-l3.dtx b/njuthesis-l3.dtx
new file mode 100644
index 0000000..b38cb65
--- /dev/null
+++ b/njuthesis-l3.dtx
@@ -0,0 +1,1672 @@
+% \iffalse meta-comment
+%
+%% File njuthesis.dtx
+%
+% Copyright (C) 2005-2021 by Nanjing University Linux User Group <my@yaoge123.com>
+% 
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    https://www.latex-project.org/lppl.txt
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the template can be found at
+%
+%    https://github.com/nju-lug/NJUThesis
+%
+% for those people who are interested.
+%
+%<*driver|program>
+\ProvidesFile{njuthesis.dtx}[2021/09/12 0.8.3 Nanjing University Thesis Template]
+%</driver|program>
+%<class>\NeedsTeXFormat{LaTeX2e}
+%<class>\ProvidesExplClass{njuthesis}{2021-09-12}{0.8.3}{NJU Thesis LaTeX Template}
+%<*driver>
+% The same approach as used in \textsf{DocStrip}: if \cs{documentclass}
+% is undefined then skip the driver, allowing the file to be used to extract
+% \texttt{l3docstrip.tex} from \texttt{l3docstrip.dtx} directly. This works
+% as the \cs{fi} is only seen if \LaTeX{} is not in use. The odd \cs{jobname}
+% business allows the extraction to work with \LaTeX{} provided an appropriate
+% \texttt{.ins} file is set up.
+%<*gobble>
+\ifx\jobname\relax\let\documentclass\undefined\fi
+\ifx\documentclass\undefined
+\else \csname fi\endcsname
+%</gobble>
+  \def\filename{njuthesis.dtx}
+  \documentclass[full,cm-default]{l3doc}
+  \usepackage{hologo}
+  \usepackage{xeCJK}
+  \ExplSyntaxOn
+  \cs_set_eq:NN \__codedoc_replace_at_at:N \use_none:n
+  \ExplSyntaxOff
+  \begin{document}
+    \DocInput{\jobname.dtx}
+  \end{document}
+%<*gobble>
+\fi
+%</gobble>
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{njuthesis} package\\ 鍗椾含澶у瀛︿綅璁烘枃妯℃澘^^A
+% }
+%
+% \author{^^A
+%  Nanjing University Linux User Group\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:my@yaoge123.com}
+%          {my@yaoge123.com}^^A
+%    }^^A
+% }
+%
+% \date{Released 2021-09-13}
+%
+% \maketitle
+%
+%
+% \tableofcontents
+%
+%
+% \section{妯℃澘浠嬬粛}
+%
+% \section{璐$尞鑰厎
+% \label{sec:contributors}
+%
+% Put text here.
+%
+% \section{閰嶇疆鐜}
+% \label{sec:setup}
+%
+% 涓嬭〃鏄洰鍓嶇粡杩囨祴璇曠殑鐜銆傚鏋滄湁鍏朵粬鍙敤涓嶅彲鐢ㄧ殑鐜锛屾杩庤ˉ鍏呫€�
+%
+% \begin{table}[ht]
+%     \caption{缁忚繃娴嬭瘯鐨勭幆澧儅
+%     % \label{tab:1}
+%     \begin{tabular}{ccc}
+%         \toprule
+%         OS & TeX & 娴嬭瘯鎯呭喌 \\
+%         \midrule
+%         Windows 10 & \hologo{TeX}\,Live 2021 & 閫氳繃 \\
+%         Windows 10 & \hologo{MiKTeX} & 閫氳繃 \\
+%         Windows 10 & \hologo{TeX}\,Live 2020 & cref瀛樺湪鏍煎紡闂  \\
+%         macOS 10.15 & \hologo{TeX}\,Live 2021 & 閫氳繃 \\
+%         Ubuntu 20.04 & \hologo{TeX}\,Live 2021 & 閫氳繃 \\
+%         鍗楀ぇ\hologo{TeX} & \hologo{TeX}\,Live 2021 & 閫氳繃 \\
+%         Overleaf & \hologo{TeX}\,Live 2020 & cref瀛樺湪鏍煎紡闂  \\
+%         \bottomrule
+%     \end{tabular}
+% \end{table}
+%
+% \section{鏈湴缂栬瘧}
+%
+% \subsubsection{瀹夎\hologo{TeX}鍙戣鐗坿
+%
+% 棣栧厛闇€瑕佷笅杞絓hologo{TeX}杞欢鍙戣鐗堬紝鏍″洯缃戠幆澧冧腑浣跨敤\href{https://mirror.nju.edu.cn/download/app/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F}{鍗楀ぇ闀滃儚绔檥鍙互鑾峰緱鏈€濂界殑浣撻獙銆俓textbf{鎺ㄨ崘浣跨敤鏈€鏂扮殑\hologo{TeX}\,Live 2021鎴栬€匼hologo{MiKTeX} 21浠ラ伩鍏嶆綔鍦ㄧ殑鍏煎鎬ч棶棰樸€倉
+%
+% \begin{itemize}
+%     \item 涓轰簡閬垮厤涓嶅繀瑕佺殑楹荤儲锛岃灏藉彲鑳戒笅杞� full 鐗堟湰锛屽 texlive-full銆傜畝鑰岃█涔嬶紝涓嬭浇澶х殑閭d釜銆�
+%     \item 骞朵笖锛屽敖鍙兘浣跨敤鏈€鏂扮増锛堟埅鑷崇洰鍓嶆槸 2021锛夈€�2020 鍙婁箣鍓嶇増鏈娇鐢� PDF 鏍煎紡鐨勫浘鐗囧彲鑳戒細鍑虹幇鍔犵矖闂銆�
+% \end{itemize}
+%
+% \subsubsection{閫夋嫨缂栬緫鍣▆
+%
+% 閰嶇疆瀹岀紪璇戝櫒鍚庯紝杩橀渶瑕佷竴涓猏textbf{鏂囨湰缂栬緫鍣▆浣滀负鍓嶇鏉ュ畬鎴怽texttt{.tex}鏂囦欢鍐呭鐨勫啓浣溿€�
+%
+% 鑷充粖浠嶆湁鐩稿綋涓€閮ㄥ垎浜鸿涓篧indows鑷甫鐨刓textit{璁颁簨鏈瑌鏄渶濂界殑鏂囨湰缂栬緫鍣紝浣嗗浜庢湰椤圭洰鑰岃█锛屽湪姝よ瘹蹇冭瘹鎰忓湴鎺ㄨ崘浣犱娇鐢╘textbf{鏇寸幇浠f洿缇庤鏇村鍔熻兘}鐨勭紪杈戝櫒锛岃濡俓emph{瀹夎浜� LaTeX Workshop 鎻掍欢 鐨� \href{https://code.visualstudio.com/}{Visual Studio Code}}锛屾潵瀹屾垚璁烘枃缂栧啓銆備綘涔熷彲浠ユ牴鎹釜浜虹殑鍠滃ソ闅忎究浣跨敤鍏朵粬缂栬緫鍣紝濡� TeXworks銆乀eX Studio 绛夛紝椤烘墜灏辫銆�
+%
+% 鑻ヤ娇鐢� LaTeX Workshop 鎻掍欢锛屾湰椤圭洰鍦▅.vscode/|涓彁渚涗竴浠界畝鏄撻厤缃紝鍙互鐪佺暐鍒濆閰嶇疆姝ラ鐩存帴浣跨敤銆�
+%
+% \subsubsection{缂栬瘧椤哄簭}
+% 搴旈噰鐢ㄤ互涓嬪懡浠ら『搴忚繘琛岀紪璇戯紝浠ョ敓鎴愭纭殑鐩綍銆佺紪鍙峰拰鍙傝€冩枃鐚潯鐩€�
+% \begin{enumerate}
+%     \item |xelatex| / |lualatex|
+%     \item |biber|
+%     \item |xelatex| / |lualatex|
+%     \item |xelatex| / |lualatex|
+% \end{enumerate}
+%
+% 缂栬瘧浜х墿\footnote{浣滀负鍖栧瀛︾敓锛屼亢璁や负鐢ㄢ€滀骇鐗┾€濅唬鏇库€滅紪璇戠敓鎴愮殑鏂囦欢鈥濇槸涓€涓€氫織鏄撴噦鐨勮娉晑涓簗njuthesis.pdf|锛屼綅浜庝富鐩綍涓嬨€傛澶栬繕浼氱敓鎴愪竴绯诲垪涓棿鏂囦欢锛屽彲浠ラ€夋嫨浣跨敤|latexmk -c|杩涜娓呯悊銆�
+%
+% \subsection{鍦ㄧ嚎缂栬瘧}
+%
+% 鐩镐俊浣犲湪鎺ヨЕ浜嗘湰鍦扮紪璇戜互鍚庯紝寰堝揩灏变細鎰忚瘑鍒颁竴浜涘崄鍒嗘樉鐒剁殑浜嬪疄锛岃濡俓hologo{TeX}缂栬瘧鍣ㄥ畨瑁呰繃绋嬭緝涓烘极闀匡紝鍗犵敤绌洪棿杩囧ぇ锛岃€屼笖鍦ㄤ竴閮ㄥ垎澶勭悊鍣ㄦ€ц兘涓嶄匠鐨勭數鑴戜笂闇€瑕佽緝闀跨紪璇戞椂闂碶footnote{鍏跺疄杩欎笁鐐归兘鏄骞垮ぇ鐨刉indows鐢ㄦ埛璇寸殑锛屽悓涓€涓ā鏉垮湪Linux缂栬瘧鍙互鑺傜渷涓€鍗婅€楁椂}銆傛嫆缁濇帴鍙楄繖浜涢夯鐑︾殑鍚屽涓嶅Θ灏濊瘯鏈妭浠嬬粛鐨勫湪绾跨紪璇戞柟娉曘€�
+%
+% \subsubsection{鍗楀ぇ\hologo{TeX}骞冲彴绠€浠媫
+%
+% \href{https://tex.nju.edu.cn}{鍗楀ぇ\hologo{TeX}}鍩轰簬寮€婧愮殑ShareLaTeX骞冲彴\footnote{鐞嗚涓婂湪\href{https://doc.nju.edu.cn/books/latex}{杩欎釜缃戠珯}鑳芥壘鍒颁竴娈靛钩鍙扮畝浠嬶紝瀹為檯涓婂ぇ瀹堕兘鏈夋剰鏃犳剰鍦伴附浜嗭紝涓嬫涓€瀹氳ˉ涓娿€倉锛屼簬2021骞�3鏈�4鏃ユ寮忎笂绾匡紝闈㈠悜鍗椾含澶у鍏ㄤ綋甯堢敓寮€鏀撅紝棣栨浣跨敤闇€鍑鏍¢偖绠辫嚜鍔╂敞鍐岃处鍙枫€�
+%
+% \subsubsection{鎿嶄綔姝ラ}
+%
+% \begin{enumerate}
+%     \item 涓嬭浇\href{https://github.com/nju-lug/NJUThesisUndergraduate/archive/refs/heads/master.zip}{妯℃澘鍏ㄩ儴鏂囦欢}
+%     \item 璁块棶\href{https://tex.nju.edu.cn}{鍗楀ぇ\hologo{TeX}}锛岀偣鍑荤晫闈㈠彸涓婃柟Register锛屼娇鐢╘emph{鍗椾含澶у閭}娉ㄥ唽璐﹀彿骞剁櫥褰�
+%     \item 鐐瑰嚮New Project -> Upload Project涓婁紶鍒氬垰寰楀埌鐨剒ip鏂囦欢锛屼笂浼犲悗njuthesis.tex銆乶juthesis.cls绛夋枃浠跺簲鍦ㄦ牴鐩綍锛岀洰褰曠粨鏋勫{{sec:directory}}鎵€绀�
+%     \item 鍦ㄩ」鐩〉闈㈠乏涓婅鐨凪enu涓紝灏嗙紪璇戝櫒鏀逛负\hologo{XeLaTeX}鎴栬€匼hologo{LuaLaTeX}
+%     \item 缂栧啓璁烘枃
+%     \item 鐐瑰嚮Compile鎸夐挳杩涜缂栬瘧鍜岄瑙�
+%     \item 鐐瑰嚮缂栬瘧鎸夐挳鍙充晶绗笁涓寜閽笅杞戒骇鐗�
+% \end{enumerate}
+%
+% \subsubsection{鍏充簬Overleaf骞冲彴}
+%
+% 鐢变簬\href{https://www.overleaf.com/}{Overleaf骞冲彴}鐨刓hologo{TeX}\,Live鐗堟湰鍋滅暀鍦�2020锛孿texttt{cleveref}鍖呭湪寮曠敤绔犺妭鏃朵細鐢熸垚閿欒鐨勬爣绛撅紝寮曞彂鏍煎紡閿欒锛涜€屽崡澶hologo{TeX}閫氳繃鍙婃椂鏇存柊瑙勯伩浜嗚繖涓€闂銆傚洜姝emph{璇峰姟蹇呬笉瑕佷娇鐢∣verleaf瀹樼綉杩涜缂栬瘧}銆�
+%
+% \subsection{瀛椾綋}
+%
+% 瀛︽牎璁烘枃鏍煎紡瑕佹眰浣跨敤鐨勫瓧浣撲竴鑸凡缁忛瑁呭湪鍚勪釜鎿嶄綔绯荤粺锛屾湰妯℃澘閽堝涓嶅悓骞冲彴杩涜浜嗚嚜鍔ㄦ娴嬮€傞厤锛屽彲浠ュ紑绠卞嵆鐢ㄣ€�
+%
+% 鍚勪釜绯荤粺鐨勯粯璁ゅ瓧浣撹鍙傝€儃tab:defaultfontset}銆傚彲浠ョ湅鍒帮紝涓嶅悓绯荤粺涓婁娇鐢ㄧ殑瀛椾綋鏈夋墍宸埆锛屽疄闄呰緭鍑虹粨鏋滃彲鑳藉瓨鍦ㄧ粏寰笉鍚�, 浣跨敤鏃惰娉ㄦ剰銆備緥濡傦紝鍦↙inux骞冲彴鎴栬€呬娇鐢ㄤ簡Ubuntu鍚庣鐨勫崡澶hologo{TeX}涓婏紝瀹嬩綋鍔犵矖鏁堟灉鏇存槑鏄撅紱鍙︿竴鏂归潰锛屽湪Windows骞冲彴杩涜缂栬瘧鐨勬晥鏋滄洿鎺ヨ繎Word鍔犵矖\footnote{鍥犱负SimSun娌℃湁鍘熺敓绮椾綋锛岄€氳繃AutoFakeBold=2.17杩涜妯′豢}銆�
+%
+%
+% \section{Usage}
+%
+% Put text here.
+% \begin{documentation}
+%
+% \subsection{瀛︿綅}
+% \DescribeOption{degree}
+% 閫夋嫨瀛︿綅锛屽彲閫夛細
+% -option{ug}锛堥粯璁わ級锛�-option{mg}锛�-option{mf}锛�-option{phd}銆�
+%
+% \subsection{绫诲瀷}
+% \DescribeOption{type}
+% 閫夋嫨瀛︿綅锛屽彲閫夛細
+% -option{thesis}锛堥粯璁わ級锛�-option{design}銆�
+%
+% \DescribeOption{systemfont}
+% 鏄惁浣跨敤绯荤粺棰勮鐨勫瓧浣擄紝鍙€夛細
+% -option{true}锛堥粯璁わ級锛�-option{false}銆�
+%
+% This is a stub file to allow extraction of \texttt{l3docstrip}: all
+% functionality has been moved to the main DocStrip program.
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{njuthesis} implementation}
+%
+%    \begin{macrocode}
+\LoadClass[
+  a4paper,
+  twoside,
+  UTF8,
+  scheme=chinese,
+  linespread=1.625,% laTex榛樿1.2琛岃窛锛寃ord榛樿琛岃窛鏄�1.3锛岃姹�1.5鍊峸ord琛岃窛锛屾晠1.5/1.2*1.3 = 1.625
+  fontset=none,
+  zihao=-4
+  ]{ctexbook}[2018/04/01]
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\RequirePackage{l3keys2e}
+%    \end{macrocode}
+%
+% \DescribeMacro{\dummyMacro}
+% This macro does nothing.\index{doing nothing|usage} It is merely an
+% example.  If this were a real macro, you would put a paragraph here
+% describing what the macro is supposed to do, what its mandatory and
+% optional arguments are, and so forth.
+%    \begin{macrocode}
+\keys_define:nn { nju }
+{
+  titlelength       .int_set:N    =   \nju_titlelength,
+  titlelength       .initial:n    =   1,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  secondmentor      .bool_set:N   =   \nju_second_mentor,
+  secondmentor      .initial:n    =   false,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  nlcover           .bool_set:N   =   \nju_nl_cover,
+  nlcover           .initial:n    =   false,
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+  degree            .tl_set:N     =   \nju_degree,
+  degree            .initial:n    =   ug,
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+  type              .tl_set:N     =   \nju_type,
+  type              .initial:n    =   thesis,
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+  systemfont        .bool_set:N   =   \nju_systemfont,
+  systemfont        .initial:n    =   true,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  customlatinfont   .tl_set:N     =   \nju_customlatinfont,
+  customlatinfont   .initial:n    =   windows,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  customchinesefont .tl_set:N     =   \nju_customchinesefont,
+  customchinesefont .initial:n    =   windows,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  info              .meta:nn      =   { nju / info } { #1 }
+}
+%    \end{macrocode}
+%
+% Put text here.
+%
+%    \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 棰樼洰
+  TitleA            .tl_set:N     =   \nju_title_a,
+  TitleB            .tl_set:N     =   \nju_title_b,
+  TitleC            .tl_set:N     =   \nju_title_c,
+  TitleEN           .tl_set:N     =   \nju_title_en,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 骞寸骇瀛﹀彿濮撳悕
+  Grade             .tl_set:N     =   \nju_grade,
+  StudentID         .tl_set:N     =   \nju_student_id,
+  StudentName       .tl_set:N     =   \nju_student_name,
+  StudentNameEN     .tl_set:N     =   \nju_student_name_en,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 闄㈢郴涓撲笟鏂瑰悜
+  Department        .tl_set:N     =   \nju_department,
+  DepartmentEN      .tl_set:N     =   \nju_department_en,
+  Major             .tl_set:N     =   \nju_major,
+  MajorEN           .tl_set:N     =   \nju_major_en,
+  Field             .tl_set:N     =   \nju_field,
+  FieldEN           .tl_set:N     =   \nju_field_en,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 瀵煎笀
+  MentorA           .tl_set:N     =   \nju_mentor_a,
+  MentorAEN         .tl_set:N     =   \nju_mentor_a_en,
+  MentorATitle      .tl_set:N     =   \nju_mentor_a_title,
+  MentorATitleEN    .tl_set:N     =   \nju_mentor_a_title_en,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 绗簩瀵煎笀
+  MentorB           .tl_set:N     =   \nju_mentor_b,
+  MentorBEN         .tl_set:N     =   \nju_mentor_b_en,
+  MentorBTitle      .tl_set:N     =   \nju_mentor_b_title,
+  MentorBTitleEN    .tl_set:N     =   \nju_mentor_b_title_en,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 鎻愪氦鏃ユ湡
+  SubmitDate        .tl_set:N     =   \nju_submit_date,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 绛旇京
+  DefendDate        .tl_set:N     =   \nju_defend_date,
+  ReviewerChairman  .tl_set:N     =   \nju_reviewer_chairman,
+  ReviewerA         .tl_set:N     =   \nju_reviewer_a,
+  ReviewerB         .tl_set:N     =   \nju_reviewer_b,
+  ReviewerC         .tl_set:N     =   \nju_reviewer_c,
+  ReviewerD         .tl_set:N     =   \nju_reviewer_d,
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+  % 鍥藉鍥句功棣嗗皝闈㈢浉鍏�
+  Classification    .tl_set:N     =   \nju_classification,
+  SecurityLevel     .tl_set:N     =   \nju_securitylevel,
+  UDC               .tl_set:N     =   \nju_udc,
+  MentorInfo        .tl_set:N     =   \nju_mentor_info,
+}
+%    \end{macrocode}
+%
+% This environment does nothing.  It is merely an example.
+% If this were a real environment, you would put a paragraph here
+% describing what the environment is supposed to do, what its
+% mandatory and optional arguments are, and so forth.
+%    \begin{macrocode}
+\NewDocumentCommand \njusetup { m }
+{ \keys_set:nn { nju } { #1 } }
+%    \end{macrocode}
+% mandatory and optional arguments are, and so forth.
+%    \begin{macrocode}
+\ProcessKeysOptions { nju }
+%    \end{macrocode}
+%
+% mandatory and optional arguments are, and so forth.
+%    \begin{macrocode}
+\RequirePackage{expl3}
+\RequirePackage{fontspec}
+\RequirePackage[    
+    top=2.5cm,
+    bottom=2.5cm,
+    left=3.2cm,
+    right=3.2cm
+]{geometry}
+% \RequirePackage{ifthen}
+\RequirePackage{xparse}
+% \RequirePackage{etoolbox}
+% \RequirePackage{titlesec} % 淇敼绔犺妭鏍囬鍔熻兘鐢盋TeX鎻愪緵
+\RequirePackage{titletoc} % 淇敼鐩綍鍐呮爣棰樻牸寮�
+% \RequirePackage{appendix} % 瀹氫箟闄勫綍鏍峰紡
+\RequirePackage{fancyhdr} % 璋冩暣椤电湁椤佃剼
+\RequirePackage[hyphens]{url} % generate better linebreaks in the url
+% \RequirePackage[normalem]{ulem} % 缁樺埗涓嬪垝绾�
+% \RequirePackage{soul} % 鐢ㄤ笉璧锋潵
+% \RequirePackage{soulutf8} 
+\RequirePackage{dashundergaps}
+\RequirePackage{setspace}
+\RequirePackage{lastpage}
+\RequirePackage{emptypage} % 娓呴櫎绌虹櫧椤电殑椤电爜
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\RequirePackage{listings} % 浠g爜鐜
+\RequirePackage{enumitem} % 鐢ㄤ簬淇敼鍒楄〃鐜
+\RequirePackage{caption}
+\RequirePackage{floatrow} % 鐢ㄤ簬鍥捐〃绛夐〉闈㈠厓绱犵殑瀹氫綅
+\RequirePackage{booktabs} % 鐢ㄤ簬缁樺埗涓夌嚎琛�
+\RequirePackage{multirow} % Cells occupying multiple rows in tables
+\RequirePackage{multicol} % Multiple columns in dictionary
+\RequirePackage{siunitx} % 鐢ㄤ簬涔﹀啓鍗曚綅绗﹀彿
+\RequirePackage[version=4]{mhchem} % 鐢ㄤ簬缁樺埗鍒嗗瓙寮�
+\RequirePackage{hologo} % 鐢ㄤ簬鐢熸垚鍙互琚彃鍏ヤ功绛剧殑LaTeX logo
+% \RequirePackage{needspace} % Required to prevent page break right after a sectioning command
+% \RequirePackage{xspace} % Better print trailing whitespace
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\sys_if_engine_xetex:T
+{
+    \RequirePackage{microtype}
+
+    % 鍔犱腑鏂囦笅鍒掔嚎锛屼笉鑳界敤浜巐ualatex
+    \RequirePackage{xeCJKfntef} 
+    \cs_new:Npn \nju_underline:n #1 {\CJKunderline{#1}}
+}
+\sys_if_engine_luatex:T{
+    % 鍔犱腑鏂囦笅鍒掔嚎
+    \RequirePackage{lua-ul}
+    \cs_new:Npn \nju_underline:n #1 {\underLine{#1}}
+
+    % emoji鏀寔
+    % \RequirePackage{emoji}
+    % \setemojifont{Segoe~UI~Emoji} % windows
+    % \setemojifont{Apple~Color~Emoji} % macos
+    % \setemojifont{Noto~Color~Emoji}
+    % For windows. 
+    % Shipped with the best `grinning-face-with-sweat' support.
+}
+%    \end{macrocode}
+%
+% 鍑犱釜鐢ㄦ潵杩涜寮€鍙戞祴璇曠殑鍖�
+%    \begin{macrocode}
+\RequirePackage{blindtext} % 鐢熸垚鐢ㄤ簬娴嬭瘯鐨勫ぇ娈垫棤鎰忎箟鑻辨枃鏂囧瓧
+\RequirePackage{zhlipsum} % 鐢熸垚鐢ㄤ簬娴嬭瘯鐨勫ぇ娈垫棤鎰忎箟涓枃鏂囧瓧
+% \RequirePackage{showframe} % 鍔犺浇浠ュ悗灞曠ず鍐呭杈圭晫
+%    \end{macrocode}
+%
+% 鏁板
+%    \begin{macrocode}
+\RequirePackage{amsmath} % Must be loaded before unicode-math
+\RequirePackage{amsthm} % Mathematical environments
+\RequirePackage{mathtools} % Mathematical tools to use with amsmath
+\RequirePackage{thmtools} % Theorem styles
+\RequirePackage[
+    warnings-off={% 娑堥櫎涓巑athtools鍚堢敤浜х敓鐨勮鍛�
+        mathtools-colon,
+        mathtools-overbracket}
+        ]{unicode-math} % Math fonts in xetex or luatex
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\RequirePackage{graphicx}
+\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
+\graphicspath{{figure/}} % 鍥剧墖璺緞
+\RequirePackage{wrapfig} % Wrap text around figures
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 蹇呴』浠ヨ椤哄簭鍔犺浇浠ヤ笅涓変釜鍖�
+% \RequirePackage{varioref}
+\RequirePackage[hidelinks,bookmarksnumbered=true]{hyperref}
+\RequirePackage[capitalise,nameinlink,noabbrev]{cleveref}
+%    \end{macrocode}
+%
+% and so forth.
+%    \begin{macrocode}
+% 璁剧疆瑗挎枃瀛椾綋
+\NewDocumentCommand\set_latin_fontset_windows{}{
+  \setmainfont{Times~New~Roman}
+  \setsansfont{Arial}
+  \setmonofont{Courier~New}[Scale=MatchLowercase]
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\NewDocumentCommand\set_latin_fontset_macos{}{
+  \setmainfont{Times~New~Roman}
+  \setsansfont{Arial}
+  \setmonofont{Menlo}[Scale=MatchLowercase]
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\NewDocumentCommand\set_latin_fontset_gyre{}{
+  \setmainfont{texgyretermes}[
+    Extension=.otf,
+    UprightFont=*-regular,
+    BoldFont=*-bold,
+    ItalicFont=*-italic,
+    BoldItalicFont=*-bolditalic]
+  \setsansfont{texgyreheros}[
+    Extension=.otf,
+    UprightFont=*-regular,
+    BoldFont=*-bold,
+    ItalicFont=*-italic,
+    BoldItalicFont=*-bolditalic]
+  \setmonofont{texgyrecursor}[
+    Extension=.otf,
+    UprightFont=*-regular,
+    BoldFont=*-bold,
+    ItalicFont=*-italic,
+    BoldItalicFont=*-bolditalic,
+    Scale=MatchLowercase,
+    Ligatures=CommonOff]
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 璁剧疆涓枃瀛椾綋
+\NewDocumentCommand\set_chinese_fontset_windows{}{
+  \setCJKmainfont{SimSun}[
+    AutoFakeBold=2.17, 
+    ItalicFont=KaiTi]
+  \setCJKsansfont{SimHei}
+  \setCJKmonofont{FangSong}
+  \setCJKfamilyfont{zhsong}{SimSun}[AutoFakeBold=2.17]
+  \setCJKfamilyfont{zhhei}{SimHei}
+  \setCJKfamilyfont{zhfs}{FangSong}
+  \setCJKfamilyfont{zhkai}{KaiTi}[AutoFakeBold=2.17]
+  \setCJKfamilyfont{zhnewhei}{Microsoft~YaHei}[BoldFont=Microsoft~YaHei~Bold]
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\NewDocumentCommand\set_chinese_fontset_macos{}{
+  \msg_redirect_name:nnn {fontspec} {no-script} {info} % 绉婚櫎 does not contain script "CJK" 璀﹀憡
+  \setCJKmainfont{Songti~SC~Light}[
+    BoldFont=Songti~SC~Bold,
+    ItalicFont=Kaiti~SC,
+    BoldItalicFont=Kaiti~SC~Bold]
+  \setCJKsansfont{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
+  \setCJKmonofont{STFangsong}
+  \setCJKfamilyfont{zhsong}{Songti~SC~Light}[BoldFont=Songti~SC~Bold]
+  \setCJKfamilyfont{zhhei}{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
+  \setCJKfamilyfont{zhfs}{STFangsong}
+  \setCJKfamilyfont{zhkai}{Kaiti~SC}
+    [
+      BoldFont=Kaiti~SC~Bold,      
+      % 鍙傝€僀TeX鎵嬪唽绗�9鑺� LuaLATEX 涓嬬殑涓枃鏀寔鏂瑰紡
+      % AlternateFont =
+      %   {
+      %   {鉄╟haracter range1鉄﹠ {鉄╝lternate font name1鉄﹠ 
+      %   {鉄╝lternate font features2鉄﹠ ,
+      %   ......
+      %   }
+    ]
+  \setCJKfamilyfont{zhnewhei}{PingFang~SC}
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\NewDocumentCommand\set_chinese_fontset_fandol{}{
+  \msg_redirect_name:nnn {fontspec} {no-script} {info} % 绉婚櫎 does not contain script "CJK" 璀﹀憡
+  \setCJKmainfont{FandolSong-Regular}[
+    Extension=.otf,
+    BoldFont=FandolSong-Bold,
+    ItalicFont=FandolKai-Regular]
+  \setCJKsansfont{FandolHei-Regular}[
+    Extension=.otf,
+    BoldFont=FandolHei-Bold]
+  \setCJKmonofont{FandolFang-Regular}[Extension=.otf]
+  \setCJKfamilyfont{zhsong}{FandolSong-Regular}[
+    Extension=.otf,
+    BoldFont=FandolSong-Bold]
+  \setCJKfamilyfont{zhhei}{FandolHei-Regular}[
+    Extension=.otf,
+    BoldFont=FandolHei-Bold]
+  \setCJKfamilyfont{zhfs}{FandolFang-Regular}[Extension=.otf]
+  \setCJKfamilyfont{zhkai}{FandolKai-Regular}[
+    Extension=.otf,
+    AutoFakeBold=2.17]
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鏂规瀛楃闆�
+\NewDocumentCommand\set_chinese_fontset_founder{}{
+  % FZSSK 鏂规涔﹀畫锛堢畝绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/151 鍏嶈垂鍟嗙敤
+  % FZXBSK 鏂规灏忔爣瀹嬶紙绠€绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/164 璁捐甯堥潪鍟嗗厤璐�
+  % FZKTK 鏂规妤蜂綋锛堢畝绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/137 鍏嶈垂鍟嗙敤
+  \setCJKmainfont{FZSSK}[
+    Extension=.ttf,
+    BoldFont=FZXBSK,
+    ItalicFont=FZKTK]
+  % FZXH1K 鏂规缁嗛粦涓€锛堢畝绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/161 璁捐甯堥潪鍟嗗厤璐�
+  % FZHTK 鏂规榛戜綋锛堢畝绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/131 鍏嶈垂鍟嗙敤
+  \setCJKsansfont{FZXH1K}[
+    Extension=.ttf,
+    BoldFont=FZHTK]
+  % FZFSK 鏂规浠垮畫锛堢畝绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/128
+  \setCJKmonofont{FZFSK}[Extension=.ttf]
+
+  \setCJKfamilyfont{zhsong}{FZSSK}[
+    Extension=.ttf,
+    BoldFont=FZXBSK]
+  \setCJKfamilyfont{zhhei}{FZHTK}[
+    Extension=.ttf,
+    AutoFakeBold=2.17]
+  \setCJKfamilyfont{zhfs}{FZFSK}[Extension=.ttf]
+  \setCJKfamilyfont{zhkai}{FZKTK}[Extension=.ttf]
+  % FZYouHK_508R 鏂规鎮犻粦508R锛堢畝绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/244 璁捐甯堥潪鍟嗗厤璐�
+  % FZYouHK_511M 鏂规鎮犻粦511M锛堢畝绻佹墿灞曪級 http://www.foundertype.com/index.php/FontInfo/index/id/244 璁捐甯堥潪鍟嗗厤璐�
+  \setCJKfamilyfont{zhnewhei}{FZYouHK_508R}[
+    Extension=.ttf,
+    BoldFont=FZYouHK_511M]
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\NewDocumentCommand\set_chinese_fontset_noto{}{
+  % 鎬濇簮瀹嬩綋 https://www.google.com/get/noto/#serif-hans
+  \setCJKmainfont[
+    UprightFont=NotoSerifCJKsc-Regular,
+    BoldFont=NotoSerifCJKsc-Bold,
+    ItalicFont=NotoSerifCJKsc-Regular,
+    BoldItalicFont=NotoSerifCJKsc-Bold,
+    ItalicFeatures=FakeSlant,
+    BoldItalicFeatures=FakeSlant]{Noto~Serif~CJK~SC}
+
+  % 鎬濇簮榛戜綋 https://www.google.com/get/noto/#sans-hans
+  \setCJKsansfont[
+    UprightFont=NotoSansCJKsc-Regular,
+    BoldFont=NotoSansCJKsc-Bold,
+    ItalicFont=NotoSansCJKsc-Regular,
+    BoldItalicFont=NotoSansCJKsc-Bold,
+    ItalicFeatures=FakeSlant,
+    BoldItalicFeatures=FakeSlant]{Noto~Sans~CJK~SC}
+
+  % 鍖呭惈浜庝笂杩版€濇簮榛戜綋
+  \setCJKmonofont[
+    UprightFont=NotoSansMonoCJKsc-Regular,
+    BoldFont=NotoSansMonoCJKsc-Bold,
+    ItalicFont=NotoSansMonoCJKsc-Regular,
+    BoldItalicFont=NotoSansMonoCJKsc-Bold,
+    ItalicFeatures=FakeSlant,
+    BoldItalicFeatures=FakeSlant]{Noto~Sans~Mono~SC}
+
+  \setCJKfamilyfont{zhsong}{Noto~Serif~CJK~SC}
+  \setCJKfamilyfont{zhhei}{Noto~Sans~CJK~SC}
+
+  % 鏂规妤蜂綋銆佹柟姝d豢瀹嬩负鍏嶈垂鍟嗙敤瀛椾綋锛屼笖鏀寔CJK瀛楃闆�
+  % 鏂规浠垮畫 http://www.foundertype.com/index.php/FontInfo/index/id/128.html
+  % 鏂规妤蜂綋 http://www.foundertype.com/index.php/FontInfo/index/id/137.html
+  \setCJKfamilyfont{zhfs}{鏂规浠垮畫绠€浣搣[AutoFakeBold=2.17]
+  \setCJKfamilyfont{zhkai}{鏂规妤蜂綋绠€浣搣[AutoFakeBold=2.17]
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 瀛椾綋鍒ゆ柇
+\bool_if:NTF \nju_systemfont
+% 鏍规嵁鎿嶄綔绯荤粺鑷姩閫夋嫨鐩稿簲瀛椾綋
+{
+  % 妫€娴嬫槸鍚︽槸 Windows
+  \sys_if_platform_windows:TF
+  {
+    \set_latin_fontset_windows
+    \set_chinese_fontset_windows
+  }
+  {
+    % 妫€娴嬫槸鍚︽槸 macOS
+    \ctex_if_platform_macos:TF
+    {
+      \set_latin_fontset_macos
+      \set_chinese_fontset_macos
+    }
+    % 鍏朵綑绯荤粺涓€寰嬩娇鐢ㄨ嚜鐢卞瓧浣�
+    {
+      \set_latin_fontset_gyre
+      \set_chinese_fontset_fandol
+    }
+  }
+}
+{
+  % 濡傛灉鐢ㄦ埛闇€瑕佽嚜瀹氫箟瀛椾綋
+  % 姝ゅ闇€瑕佷娇鐢╘str_case_e鑰屼笉鏄痋str_case浣垮畯灞曞紑涓哄瓧绗︿覆
+  \str_case_e:nn { \nju_customlatinfont }
+  {
+    { windows } { \set_latin_fontset_windows }
+    { macos } { \set_latin_fontset_macos }
+    { gyre } { \set_latin_fontset_gyre }
+    { null } {}
+  }
+  \str_case_e:nn { \nju_customchinesefont }
+  {
+    { windows } { \set_chinese_fontset_windows }
+    { macos } { \set_chinese_fontset_macos }
+    { gyre } { \set_chinese_fontset_gyre }
+    { founder } { \set_chinese_fontset_founder }
+    { noto } { \set_chinese_fontset_noto }
+    { null } {}
+  }
+}
+% 閫夋嫨鍏朵粬瀛椾綋锛岃纭繚鐩稿簲瀛椾綋宸插畨瑁�
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 璁剧疆鏁板瀛椾綋 (XITS, 鎴栬€� STIX, 涓� Times New Roman 鏈€涓虹浉杩�)
+% \setmathfont{STIXTwoMath-Regular}[Extension = .otf]
+\setmathfont{XITSMath-Regular}[
+  BoldFont = XITSMath-Bold,
+  Extension = .otf]
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\NewDocumentCommand\songti{}{\CJKfamily{zhsong}}
+\NewDocumentCommand\heiti{}{\CJKfamily{zhhei}}
+\NewDocumentCommand\fangsong{}{\CJKfamily{zhfs}}
+\NewDocumentCommand\kaishu{}{\CJKfamily{zhkai}}
+% \NewDocumentCommand\lishu{}{\CJKfamily{zhli}}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鏈鐢熼〉鐪夐〉鑴� 
+\fancypagestyle{njuplain}{%
+   \fancyhead{}               
+   \fancyfoot[C]{\zihao{5}\thepage} % 椤佃剼灞呬腑 浜斿彿鏂扮綏椹綋鏁板瓧
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% TODO: 鐮旂┒鐢熼〉鐪夐〉鑴� 
+\fancypagestyle{njuheadings}{%
+   \fancyhead{}               
+   \fancyfoot[C]{\zihao{5}\thepage}        
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\str_if_eq:NNTF {\nju_degree} { ug } 
+{
+  % the header line
+  \tl_set:Nn \headrulewidth {0pt}
+  % the footer line
+  \tl_set:Nn \footrulewidth {0pt}
+  
+  \AtBeginDocument{\pagestyle{njuplain}} % 鏈鏃犻〉鐪夐〉鑴�
+}
+{
+  % the header line
+  \tl_set:Nn \headrulewidth {1pt}
+  % the footer line
+  \tl_set:Nn \footrulewidth {0pt}
+
+  % \AtBeginDocument{\pagestyle{njuplain}} % 鏃犻〉鐪夐〉鑴�
+  \AtBeginDocument{\pagestyle{headings}} % 鐮旂┒鐢熸湁椤电湁椤佃剼
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% ctex鏍煎紡璁剧疆
+% 鐩綍鏍囬 涓夊彿瀹嬩綋鍔犵矖
+% 鍚勯儴鍒嗘爣棰� 鍥涘彿榛戜綋
+\ctexset{
+    contentsname = 鐩綍,
+    listfigurename = 鎻掑浘娓呭崟, 
+    listtablename = 琛ㄦ牸娓呭崟,
+    chapter/format = \zihao{4}\heiti\centering,
+    chapter/beforeskip = 10pt,
+    chapter/afterskip = 60pt,
+    section/format = \zihao{4}\heiti\raggedright,
+    subsection/format = \zihao{4}\heiti\raggedright,
+    subsubsection/format = \zihao{4}\heiti\raggedright
+}
+
+% 閲嶅畾涔夌洰褰曚腑绔犺妭鏍囬鏍峰紡
+% 鐩綍鍐呭涓珷鐨勬爣棰� 鍥涘彿榛戜綋
+% 鐩綍涓叾浠栧唴瀹� 灏忓洓鍙峰畫浣�
+\titlecontents{chapter}% 鏍囬绾у埆
+                [5em]% 鏍囬宸﹂棿璺�
+                {\heiti\zihao{4}\vspace{10pt}}% 鏍囬鏍煎紡
+                {\contentslabel{4em}}% 鏍囬鏍囧織
+                {\hspace*{-4em}}% 鏃犲簭鍙锋爣棰�
+                {~\titlerule*[0.6pc]{$.$}~\contentspage}% 鎸囧紩绾夸笌椤电爜
+
+                \titlecontents{section}
+                [5em]
+                {\zihao{-4}\vspace{0pt}}
+                {\contentslabel{2.5em}}
+                {\hspace*{-4em}}
+                {~\titlerule*[0.6pc]{$.$}~\contentspage}
+
+\titlecontents{subsection}
+                [8em]
+                {\zihao{-4}\vspace{0pt}}
+                {\contentslabel{3em}}
+                {\hspace*{-4em}}
+                {~\titlerule*[0.6pc]{$.$}~\contentspage}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\cs_set:Npn \CTEX@addtocline #1#2
+{ 
+  \addcontentsline { toc } {#1} 
+  { \use:c { CTEX@#1@tocline } {#1} {#2} } 
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鐩綍椤甸潰鏍煎紡淇敼
+\cs_new:Npn \nju_tocpagestyle:nnn #1 #2 #3
+{
+  \newpage
+  \hspace{0pt}
+  \vskip 10pt
+  \begin{center}
+    \mbox{\songti\bf\zihao{3}{#1}} % 鐩綍椤甸潰鏍囬
+    \phantomsection
+    \addcontentsline{toc}{chapter}{#2} % 鎻掑叆鐩綍
+  \end{center}
+  \vskip 40pt 
+  \@starttoc{#3}%
+  \cleardoublepage
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\tl_set:Nn \tableofcontents 
+{
+  \nju_tocpagestyle:nnn {鐩甛hspace{2em}褰晑{\contentsname}{toc}
+}
+\tl_set:Nn \listoffigures
+{
+  \nju_tocpagestyle:nnn {\listfigurename}{\listfigurename}{lof}
+}
+\tl_set:Nn \listoftables 
+{
+  \nju_tocpagestyle:nnn {\listtablename}{\listtablename}{lot}
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 瀹氬埗鍓嶈█銆佽嚧璋㈢幆澧�
+\newenvironment{preface}
+{%
+  \chapter*{鍓嶈█}
+  \addcontentsline{toc}{chapter}{鍓嶈█}
+}{}
+%    \end{macrocode}
+%
+% \DescribeEnv{acknowledgements}
+% 鍗曠嫭鍒朵綔鐨勮嚧璋㈤〉銆�
+%    \begin{macrocode}
+\newenvironment{acknowledgement}
+{%
+  \chapter*{鑷磋阿}
+  \addcontentsline{toc}{chapter}{鑷磋阿}
+}{}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% biblatex璁剧疆
+\RequirePackage[
+    style=gb7714-2015,
+    %style=numeric-comp,
+    %citestyle=authortitle-icomp,
+    % citestyle=numeric-comp,
+    %bibstyle=authoryear,
+    % bibstyle=numeric,
+    sorting=none,
+    %sorting=nyt,
+    %sortcites=true,
+    %autocite=footnote,
+    backend=biber, % Compile the bibliography with biber
+    hyperref=true,
+    backref=false,
+    citecounter=true,
+    pagetracker=true,
+    citetracker=true,
+    ibidtracker=context,
+    autopunct=true,
+    autocite=plain,
+    % gbpub=false,         % Uncomment if you do NOT want '[S.l. : s.n.]' in reference entries, GitHub Issue (#47)
+    % gbnamefmt=lowercase, % Uncomment if you do NOT want uppercase author names in reference entries, GitHub Issue (#23)
+]{biblatex}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% Remove some unwanted entries from the bibliography
+\AtEveryBibitem{
+	\clearfield{abstract}
+	\clearfield{issn}
+	\clearfield{isbn}
+	\clearfield{archivePrefix}
+	\clearfield{arxivId}
+	\clearfield{pmid}
+	\clearfield{eprint}
+	\ifentrytype{online}{}{\ifentrytype{misc}{}{\clearfield{url}}}
+	% \ifentrytype{book}{\clearfield{doi}}{}
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 淇敼鏍囩鍚嶇О
+\crefdefaultlabelformat{#2#1#3\,} % 榛樿鍦ㄥ悕绉板悗闈㈡坊鍔犵┖鏍�
+
+\crefname{figure}{鍥緘{鍥緘
+\crefname{table}{琛▆{琛▆
+% \crefname{equation}{鍏紡}{鍏紡}
+\crefformat{equation}{鍏紡~#2#1#3~} % 鍒犻櫎鍏紡缂栧彿鐨勬嫭鍙�
+
+\crefformat{chapter}{绗�#2#1#3绔爙
+\crefformat{section}{绗瑍#2#1#3~鑺倉
+\crefformat{subsection}{绗瑍#2#1#3~灏忚妭}
+\crefformat{subsubsection}{绗瑍#2#1#3~灏忚妭}
+% \crefname{chapter}{搂}{搂}
+% \crefname{section}{搂}{搂}
+% \crefname{subsection}{搂}{搂}
+% \crefname{subsubsection}{搂}{搂}
+\crefname{appendix}{闄勫綍}{闄勫綍}
+
+% \crefname{definition}{瀹氫箟}{瀹氫箟}
+% \crefname{axiom}{鍏悊}{鍏悊}
+% \crefname{property}{鎬ц川}{鎬ц川}
+% \crefname{proposition}{鍛介}{鍛介}
+% \crefname{lemma}{寮曠悊}{寮曠悊}
+% \crefname{corollary}{鎺ㄨ}{鎺ㄨ}
+% \crefname{remark}{娉ㄨВ}{娉ㄨВ}
+% \crefname{condition}{鏉′欢}{鏉′欢}
+% \crefname{conclusion}{缁撹}{缁撹}
+% \crefname{assumption}{鍋囪}{鍋囪}
+%    \end{macrocode}
+%
+% soifjsojfosjfos
+%    \begin{macrocode}
+% 鍥捐〃浣嶇疆璋冩暣
+\floatsetup[lstlisting]{ % Captions for lstlistings
+	capposition=above,%
+	margins=centering,%
+	floatwidth=\textwidth%
+}
+\floatsetup[figure]{ % Captions for figures
+	capposition=bottom,%
+	margins=centering,%
+	floatwidth=\textwidth%
+}
+\floatsetup[table]{ % Captions for tables
+	capposition=above,%
+	margins=centering,%
+	floatwidth=\textwidth%
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 浠g爜鏍峰紡
+\lstset{
+	basicstyle=\ttfamily\linespread{1}\small\selectfont,
+    keywordstyle=\bfseries,% use bold style for keywords
+    commentstyle=\rmfamily\itshape,% use italic style for comments
+    stringstyle=\ttfamily,% 瀛楃涓查鏍�
+    flexiblecolumns,% ?
+    numbers=left,% left-aligned numbering
+    showspaces=false,% hide markers for spaces
+    showstringspaces=false,
+    captionpos=t,% place the caption at the top
+	% frame=lrtb,% show all four sides of the frame
+	% linewidth=.8\textwidth,
+	% breakatwhitespace=true,
+	breaklines=true,
+	xleftmargin=2em,xrightmargin=2em,% set the width of the code environment
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\lstdefinestyle{LaTeX}{
+  language=TeX,
+  morekeywords={begin, caption, label, mathrm, frac, toprule, midrule, bottomrule, includegraphics}
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鍥捐〃鏍囬鏍峰紡
+\DeclareCaptionFont{songticap}{\zihao{5}\bf\songti}
+\captionsetup{
+    font=small,%
+    labelfont=songticap,
+	textfont=songticap,
+	strut=no,%
+	hypcap=true, % Links point to the top of the figure
+	% indention=0pt, % Suppress indentation
+	% % parindent=0pt, % Suppress space between paragraphs
+	aboveskip=6pt, % Increase the space between the figure and the caption
+	belowskip=6pt, % Increase the space between the caption and the table
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% list configuration
+\renewcommand{\labelitemi}{\tiny$\blacktriangleright$}
+\renewcommand{\labelitemii}{\textbullet}
+
+\setlist[itemize]{noitemsep}
+\setlist[enumerate]{noitemsep}
+\setlist[description]{noitemsep}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鏁板鐜
+\declaretheoremstyle[
+    	%spaceabove=.5\thm@preskip,
+    	%spacebelow=.5\thm@postskip,
+    	headfont=\bf\songti,%\scshape,
+    	notefont=\songti,% notebraces={ (}{)},
+    	bodyfont=\songti,
+    	%headformat={\NAME\space\NUMBER\space\NOTE},
+    	headpunct={},
+    	%postheadspace={.5em plus .1em minus .1em},
+    	%prefoothook={\hfill\qedsymbol}
+    ]{njuthm}
+
+\theoremstyle{njuthm}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\let\oldproofname=\proofname
+\renewcommand*{\proofname}{\rm\bf\songti{\oldproofname}} % 淇敼璇佹槑鐜鏍囬
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+\declaretheorem[
+	name=绠楁硶,
+	style=njuthm,
+	refname={绠楁硶,绠楁硶},
+	Refname={绠楁硶,绠楁硶},
+	% numberwithin=section,
+]{algorithm}
+\declaretheorem[
+	name=鍋囪,
+	style=njuthm,
+	refname={鍋囪,鍋囪},
+	Refname={鍋囪,鍋囪},
+	% numberwithin=section,
+]{assumption}
+\declaretheorem[
+	name=鍏悊,
+	style=njuthm,
+	refname={鍏悊,鍏悊},
+	Refname={鍏悊,鍏悊},
+	% numberwithin=section,
+]{axiom}
+\declaretheorem[
+	name=缁撹,
+	style=njuthm,
+	refname={缁撹,缁撹},
+	Refname={缁撹,缁撹},
+	% numberwithin=section,
+]{conclusion}
+\declaretheorem[
+	name=鏉′欢,
+	style=njuthm,
+	refname={鏉′欢,鏉′欢},
+	Refname={鏉′欢,鏉′欢},
+	% numberwithin=section,
+]{condition}
+\declaretheorem[
+	name=鎺ㄨ,
+	style=njuthm,
+	refname={鎺ㄨ,鎺ㄨ},
+	Refname={鎺ㄨ,鎺ㄨ},
+	% numberwithin=section,
+]{corollary}
+\declaretheorem[
+	name=瀹氫箟,
+	style=njuthm,
+	refname={瀹氫箟,瀹氫箟},
+	Refname={瀹氫箟,瀹氫箟},
+	% numberwithin=section,
+]{definition}
+\declaretheorem[
+    	name=渚�,
+    	style=njuthm,
+    	refname={渚�,渚媫,
+    	Refname={渚�,渚媫,
+    	% numberwithin=section,
+]{example}
+\declaretheorem[
+	name=寮曠悊,
+	style=njuthm,
+	refname={寮曠悊,寮曠悊},
+	Refname={寮曠悊,寮曠悊},
+	% numberwithin=section,
+]{lemma}
+\declaretheorem[
+	name=鎬ц川,
+	style=njuthm,
+	refname={鎬ц川,鎬ц川},
+	Refname={鎬ц川,鎬ц川},
+	% numberwithin=section,
+]{property}
+\declaretheorem[
+	name=鍛介,
+	style=njuthm,
+	refname={鍛介,鍛介},
+	Refname={鍛介,鍛介},
+	% numberwithin=section,
+]{proposition}
+\declaretheorem[
+	name=娉ㄨВ,
+	style=njuthm,
+	refname={娉ㄨВ,娉ㄨВ},
+	Refname={娉ㄨВ,娉ㄨВ},
+	% numberwithin=section,
+]{remark}
+\declaretheorem[
+	name=瀹氱悊,
+	style=njuthm,
+	refname={瀹氱悊,瀹氱悊},
+	Refname={瀹氱悊,瀹氱悊},
+	numberwithin=section,
+]{theorem}
+%    \end{macrocode}
+%
+% \section{灏侀潰璁捐}
+%    \begin{macrocode}
+% 鎷煎悎鏍囬
+\tl_const:Nn \nju_title {\nju_title_a \nju_title_b \nju_title_c}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鎷煎悎瀵煎笀
+\bool_if:NTF \nju_second_mentor
+{ 
+  \tl_const:Nn \nju_mentor_full
+  {
+    \nju_mentor_a\ \nju_mentor_a_title
+    \ \ \nju_mentor_b\ \nju_mentor_b_title
+  }
+  \tl_const:Nn \nju_mentor_full_en
+  {
+    \nju_mentor_a_en\ \nju_mentor_a_title_en
+    \ \ \nju_mentor_b_en\ \nju_mentor_b_title_en
+  }
+}
+{
+  \tl_const:Nn \nju_mentor_full
+  {
+    \nju_mentor_a\ \nju_mentor_a_title
+  }
+  \tl_const:Nn \nju_mentor_full_en
+  {
+    \nju_mentor_a_en\ \nju_mentor_a_title_en
+  }
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鍒ゆ柇瀛︿綅杩涜鍛戒护瀹氫箟
+\str_if_eq:NNTF {\nju_degree} { ug } 
+{
+  % 鏈
+  \tl_const:Nn \nju_degree_name {鏈琝hfill 绉慭hfill }
+
+  % 鏈寮哄埗涓嶆墦鍗板浗瀹跺浘涔﹂灏侀潰
+  \bool_set_false:N \nju_nl_cover
+  
+  % 灏侀潰涓嬪垝绾�
+  \cs_new:Npn \nju_cover_underline_ug:nn #1 #2 
+  {
+    \uline{\makebox[#1]{\rm\songti#2}}
+  }
+ 
+  % 灏侀潰琛ㄦ牸杈规
+  \cs_new:Npn \nju_coverbox_ug:n #1 
+  {
+    \makebox[4.2em][s]{#1}
+  }
+} 
+{ 
+  % 鏈浠ュ閮芥槸鐮旂┒鐢� 
+  \tl_const:Nn \nju_degree_name {鐮擻hfill 绌禱hfill 鐢焅hfill }
+
+  % 灏侀潰涓嬪垝绾�
+  \cs_new:Npn \nju_cover_underline_g:n #1 
+  {
+    \uline{\makebox[250pt]{\rm\kaishu#1}}
+  }
+
+  % 鍥藉鍥句功棣嗗皝闈笅鍒掔嚎
+  \cs_new:Npn \nju_cover_underline_nl:nn #1 #2 
+  {
+    \uline{\makebox[#1]{#2}}
+  }
+
+  % 灏侀潰琛ㄦ牸杈规
+  \cs_new:Npn \nju_coverbox_g:n #1 
+  {
+    \makebox[6em][s]{#1\hspace{1em}}
+  }
+  
+  % 鐮旂┒鐢熷浣嶅垎绫�
+  \str_case:Nn { \nju_degree }
+  {
+    { mg } { \tl_const:Nn \nju_degree_title {纭曞+} }
+    { mf } { \tl_const:Nn \nju_degree_title {纭曞+涓撲笟} }
+    { phd } { \tl_const:Nn \nju_degree_title {鍗氬+} }
+  }
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鍒ゆ柇绫诲瀷
+\str_if_eq:NNTF {\nju_type} {thesis} 
+{
+  \tl_const:Nn \nju_type_name 
+    { \nju_degree_name 姣昞hfill 涓歕hfill 璁篭hfill 鏂� }
+}
+{
+  \tl_const:Nn \nju_type_name 
+    { \nju_degree_name 姣昞hfill 涓歕hfill 璁綷hfill 璁� }
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 灏侀潰淇℃伅鏍� 鏈
+\tl_new:N \nju_printcoverinfo_ug
+\tl_set:Nn \nju_printcoverinfo_ug 
+{
+  \begin{tabular}{p{4.2em}c}
+    \nju_coverbox_ug:n {闄hfill 绯粆
+    & \nju_cover_underline_ug:nn {250pt}{\nju_department}\\
+    \nju_coverbox_ug:n {涓揬hfill 涓殅
+    & \nju_cover_underline_ug:nn {250pt}{\nju_major}\\
+
+    % 鏍囬鎹㈣
+    \int_case:nn { \nju_titlelength }
+      {
+        { 1 } { 
+          \nju_coverbox_ug:n {棰榎hfill 鐩畗
+          & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_a}} \\ }
+        { 2 } {
+          \nju_coverbox_ug:n {棰榎hfill 鐩畗
+          & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_a}} \\
+          & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_b}} \\ }
+        { 3 } { 
+          \nju_coverbox_ug:n {棰榎hfill 鐩畗
+          & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_a}} \\
+          & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_b}} \\
+          & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_c}} \\}
+      }
+  \end{tabular}\\
+
+  \begin{tabular}{p{4.2em}cp{4.2em}c}
+    \nju_coverbox_ug:n {骞碶hfill 绾
+    & \nju_cover_underline_ug:nn {90pt}{\nju_grade}
+    & \nju_coverbox_ug:n {瀛hfill 鍙穧
+    & \nju_cover_underline_ug:nn {90pt}{\nju_student_id}\\
+  \end{tabular}\\
+  
+  \begin{tabular}{p{4.2em}c}
+    \nju_coverbox_ug:n {瀛hfill 鐢焅hfill 濮揬hfill 鍚峿
+    & \nju_cover_underline_ug:nn {250pt}{\nju_student_name}
+  \end{tabular}\\
+  \begin{tabular}{p{4.2em}cp{4.2em}c}
+    \nju_coverbox_ug:n {瀵糪hfill 甯坿
+    & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_a}
+    & \nju_coverbox_ug:n {鑱孿hfill 绉皚
+    & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_a_title}\\
+
+    % 绗簩瀵煎笀
+    \bool_if:NT \nju_second_mentor
+    {
+      \nju_coverbox_ug:n {绗琝hfill 浜孿hfill 瀵糪hfill 甯坿
+      & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_b}
+      & \nju_coverbox_ug:n {鑱孿hfill 绉皚
+      & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_b_title}\\
+    }
+  \end{tabular}\\
+
+  \begin{tabular}{p{4.2em}c}
+    \nju_coverbox_ug:n {鎻怽hfill 浜hfill 鏃hfill 鏈焳
+    & \nju_cover_underline_ug:nn {250pt}{\nju_submit_date}\\
+  \end{tabular}
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 灏侀潰淇℃伅鏍� 鐮旂┒鐢�
+\tl_new:N \nju_printcoverinfo_g
+\tl_set:Nn \nju_printcoverinfo_g 
+{
+  \begin{tabular}{p{6em}c}
+    % 鏍囬鎹㈣
+    \int_case:nn {\nju_titlelength}
+      {
+        { 1 } { 
+          \nju_coverbox_g:n {璁篭hfill 鏂嘰hfill 棰榎hfill 鐩畗
+          & \nju_cover_underline_g:n {\nju_title_a} \\ }
+        { 2 } {
+          \nju_coverbox_g:n {璁篭hfill 鏂嘰hfill 棰榎hfill 鐩畗
+          & \nju_cover_underline_g:n {\nju_title_a} \\
+          & \nju_cover_underline_g:n {\nju_title_b} \\ }
+        { 3 } { 
+          \nju_coverbox_g:n {璁篭hfill 鏂嘰hfill 棰榎hfill 鐩畗
+          & \nju_cover_underline_g:n {\nju_title_a} \\
+          & \nju_cover_underline_g:n {\nju_title_b} \\
+          & \nju_cover_underline_g:n {\nju_title_c} \\}
+      }
+
+    \nju_coverbox_g:n {浣淺hfill 鑰匼hfill 濮揬hfill 鍚峿
+    & \nju_cover_underline_g:n {\nju_student_name}\\
+    \nju_coverbox_g:n {涓揬hfill 涓歕hfill 鍚峔hfill 绉皚
+    & \nju_cover_underline_g:n {\nju_major}\\
+    \nju_coverbox_g:n {鐮擻hfill 绌禱hfill 鏂筡hfill 鍚憓
+    & \nju_cover_underline_g:n {\nju_field}\\
+    \nju_coverbox_g:n {鎸嘰hfill 瀵糪hfill 鏁橽hfill 甯坿
+    & \nju_cover_underline_g:n {\nju_mentor_full}\\
+  \end{tabular}
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 缁樺埗灏侀潰鍛戒护
+\tl_new:N \nju_printcover_nl % 鍥藉鍥句功棣嗗皝闈�
+\tl_new:N \nju_printcover_ug % 鏈灏侀潰
+\tl_new:N \nju_printcover_g % 鐮旂┒鐢熷皝闈�
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鎸夐渶缁樺埗鍥藉鍥句功棣嗗皝闈紝淇敼鑷棫妯℃澘
+\bool_if:NT \nju_nl_cover
+{
+  \tl_set:Nn \nju_printcover_nl 
+  {
+    \thispagestyle{empty}
+    \pdfbookmark[0]{鍥藉鍥句功棣嗗皝闈{nl}
+    {
+      % 椤剁
+      \hspace{0mm}
+      \vskip -20mm \hskip -15mm
+      \songti\zihao{-4}
+      \makebox[40pt][l]{鍒嗙被鍙穧
+      \nju_cover_underline_nl:nn {150pt}{\nju_classification}
+      \hfill
+      \makebox[40pt][l]{瀵嗙骇}
+      \nju_cover_underline_nl:nn {150pt}{\nju_securitylevel}
+      \vskip 10pt \hskip -15mm
+      \makebox[40pt][l]{UDC}
+      \nju_cover_underline_nl:nn {150pt}{\nju_udc}
+    }
+  
+    % 涓儴
+    \vskip\stretch{2}
+    \begin{center}
+      \def\ULthickness{1pt}
+      {\kaishu\zihao{-0} 瀛hspace{0.5em}浣峔hspace{0.5em}璁篭hspace{0.5em}鏂噠
+      {
+        \kaishu\zihao{1}
+        \vskip \stretch{1}
+        \nju_cover_underline_nl:nn {14em}{\nju_title_a}\\
+        \nju_cover_underline_nl:nn {14em}{\nju_title_b}\\
+        \nju_cover_underline_nl:nn {14em}{\nju_title_c}\\
+      }
+      \vskip \stretch{1}
+      {\kaishu\zihao{4}锛堥鍚嶅拰鍓鍚嶏級}
+      \vskip \stretch{1} \vskip 5mm
+      {\kaishu\zihao{1}\uline{\makebox{\nju_student_name}}}
+      \vskip \stretch{1}
+      {\kaishu\zihao{4}锛堜綔鑰呭鍚嶏級}
+    \end{center}
+  
+    % 搴曢儴
+    \vskip\stretch{1}
+    {
+      \kaishu\zihao{4}
+      \noindent 鎸囧鏁欏笀濮撳悕銆佽亴鍔°€佽亴绉般€佸浣嶃€佸崟浣嶅悕绉板強鍦板潃%
+      \nju_cover_underline_nl:nn {94pt}{\nju_mentor_a}\par
+      \noindent\nju_cover_underline_nl:nn {\textwidth}{%
+      \nju_mentor_info}\par
+      \noindent 鐢宠瀛︿綅绾у埆%
+      \nju_cover_underline_nl:nn {9em}{\nju_degree_title}%
+      \noindent 涓撲笟鍚嶇О%
+      \uline{\hfill\nju_major\hfill}\par% 闇€瑕佽皟鏁翠笅鍒掔嚎闀垮害
+      \noindent 璁烘枃鎻愪氦鏃ユ湡%
+      \nju_cover_underline_nl:nn {9em}{\nju_submit_date}%
+      璁烘枃绛旇京鏃ユ湡%
+      \uline{\hfill\nju_defend_date\hfill}\par% 闇€瑕佽皟鏁翠笅鍒掔嚎闀垮害
+      \noindent 瀛︿綅鎺堜簣鍗曚綅鍜屾棩鏈焅uline{\hfill}\par
+      \noindent\hfill 绛旇京濮斿憳浼氫富甯細%
+      \nju_cover_underline_nl:nn {9em}{\nju_reviewer_chairman}\par
+      \noindent\hfill 璇勯槄浜猴細%
+      \nju_cover_underline_nl:nn {9em}{\nju_reviewer_a}\par
+      \noindent\hfill\nju_cover_underline_nl:nn {9em}{\nju_reviewer_b}\par
+      \noindent\hfill\nju_cover_underline_nl:nn {9em}{\nju_reviewer_c}\par
+      \noindent\hfill\nju_cover_underline_nl:nn {9em}{\nju_reviewer_d}\par
+      
+      \begin{center}
+        \kaishu\zihao{3}\hspace{2em} 骞碶hspace{1em} 鏈圽hspace{1em} 鏃�
+      \end{center}
+      \vskip -10mm
+      }
+    \cleardoublepage
+  }
+}
+
+% 鏈灏侀潰
+\tl_set:Nn \nju_printcover_ug 
+{
+  \thispagestyle{empty}
+  \pagenumbering{Roman}
+  % Start
+  \pdfbookmark{灏侀潰}{灏侀潰} % 灏嗗皝闈㈡彃鍏df涔︾
+  \begin{spacing}{1.25}
+  \vskip 0mm
+  \hspace{-10mm}
+  \includegraphics[height=3cm]{njulogo}\smallskip 
+  \begin{center}
+    \includegraphics[height=3.35cm]{njuname}
+    \vskip 10mm 
+    {\zihao{1}\makebox[9em][s]{\bf{\songti\nju_type_name}}}
+    \vfill
+    \vskip\stretch{0}
+    {\bgroup
+    \kaishu\zihao{3}
+    \def\tabcolsep{1pt}
+    \def\arraystretch{1.5}
+    \nju_printcoverinfo_ug % 缁樺埗淇℃伅妗�
+    \egroup}
+    \vfill
+  \end{center}
+  \end{spacing}
+  \cleardoublepage
+  % \vfill
+  % \newpage
+}
+
+% 鐮旂┒鐢熷皝闈�
+\tl_set:Nn \nju_printcover_g 
+{
+  \thispagestyle{empty}
+  \pagenumbering{Roman}
+  % Start
+  \pdfbookmark{灏侀潰}{灏侀潰} % 灏嗗皝闈㈡彃鍏df涔︾
+  \begin{spacing}{1.25}
+  \begin{center}
+    \hspace{0pt} \vskip 5mm
+    \includegraphics[height=1.9cm]{njulogo}
+    \vskip 10mm 
+    \includegraphics[height=2cm]{njuname-large}
+    \vskip 15mm 
+    {\zihao{1}\makebox[10em][s]{\bf{\kaishu\nju_type_name}}}
+    \vskip 5mm
+    {\zihao{1}\bf{\kaishu{锛堢敵璇穃nju_degree_title 瀛︿綅锛墋}}
+    \par\vfill
+    \vskip\stretch{0}
+    {\bgroup
+    \bf\kaishu\zihao{3}
+    \def\tabcolsep{1pt}
+    \def\arraystretch{1.5}
+    \vskip 10mm
+    \nju_printcoverinfo_g % 缁樺埗淇℃伅妗�
+    \egroup}
+    \vfill
+    \vskip 10mm
+    \bf\kaishu\zihao{4}\nju_submit_date
+    \vskip 15mm
+  \end{center}
+  \end{spacing}
+
+  \newpage % 灏侀潰鑳岄潰
+  \thispagestyle{empty}
+  \begin{spacing}{1.625}
+    % TODO: 绛夊緟璋冩暣鏍煎紡
+    \hspace{0pt} \vfill
+    {\bgroup
+    \kaishu\zihao{3}
+    \makebox[6em][s]{\bf\kaishu 瀛hfill 鍙穧锛歕MakeUppercase{\nju_student_id}
+    \par
+    \makebox[6em][s]{\bf\kaishu 璁烘枃绛旇京鏃ユ湡}锛歕nju_defend_date
+    \par
+    \makebox[6em][s]{\bf\kaishu 鎸嘰hfill 瀵糪hfill 鏁橽hfill 甯坿锛歕hspace{50mm}锛堢瀛楋級
+    \par
+    \egroup}
+    \vskip 15mm
+  \end{spacing}
+  \cleardoublepage
+}
+
+% 閲嶅畾涔塵aketitle鐢熸垚灏侀潰
+\tl_set:Nn \maketitle 
+{%
+  \str_if_eq:NNTF { \nju_degree } { ug } 
+  {
+    \nju_printcover_nl % 鍥藉鍥句功棣嗗皝闈�
+    \nju_printcover_ug % 鏈灏侀潰
+  } 
+  { 
+    \nju_printcover_nl % 鍥藉鍥句功棣嗗皝闈�
+    \nju_printcover_g % 鐮旂┒鐢熷皝闈� 
+  } 
+}
+%    \end{macrocode}
+%
+% Put text here.
+%    \begin{macrocode}
+% 鍒ゆ柇瀛︿綅
+\str_if_eq:NNTF {\nju_degree} { ug } 
+{   
+  % 鏈鎽樿鐜
+  \NewDocumentEnvironment{abstract} {}
+  {%
+    % \pagestyle{plain}
+    % \pagenumbering{Roman}
+    % \phantomsection\addcontentsline{toc}{chapter}{涓枃鎽樿} % 灏嗘憳瑕佹彃鍏ョ洰褰曞拰pdf涔︾
+    \pdfbookmark[0]{涓枃鎽樿}{涓枃鎽樿} % 灏嗘憳瑕佹彃鍏df涔︾锛屼笌涓婁竴琛屼笉鍙叡瀛�
+    \begin{center}
+      \kaishu\zihao{-2}{\textbf{\uuline{鍗椾含澶у鏈鐢熸瘯涓氳鏂囷紙璁捐銆佷綔鍝侊級涓枃鎽樿}}}
+    \end{center}
+    {\bgroup
+      \kaishu\zihao{-4}
+      \tl_set:Nn \tabcolsep {0pt}
+      \tl_set:Nn \arraystretch {0.8}
+      \noindent
+      棰樼洰锛� \nju_title \\
+      闄㈢郴锛� \nju_department \\
+      涓撲笟锛� \nju_major \\
+      鏈鐢熷鍚嶏細 \nju_student_name \\
+      鎸囧鏁欏笀锛堝鍚嶃€佽亴绉帮級锛歕nju_mentor_full \\
+      鎽樿锛�
+      \egroup
+    }
+    \kaishu\zihao{-4}\par%
+  }{%
+  \newpage
+  }
+
+  % 涓枃鍏抽敭璇�
+  \NewDocumentCommand \keywords {m} {%
+    \par\vspace{2ex}\noindent%
+    {\kaishu\zihao{-4}\makebox[4em][s]{鍏抽敭璇峽锛殅}}~{#1}%
+  }
+
+  % 鑻辨枃鎽樿
+  \NewDocumentEnvironment{englishabstract} {}
+  {%
+    \pagestyle{plain}
+    % \phantomsection\addcontentsline{toc}{chapter}{鑻辨枃鎽樿} % 灏嗘憳瑕佹彃鍏ョ洰褰曞拰pdf涔︾
+    \pdfbookmark[0]{鑻辨枃鎽樿}{鑻辨枃鎽樿} % 灏嗘憳瑕佹彃鍏df涔︾锛屼笌涓婁竴琛屼笉鍙叡瀛�
+    \begin{center}
+        \kaishu\zihao{-2}{\textbf{\uuline{鍗椾含澶у鏈鐢熸瘯涓氳鏂囷紙璁捐銆佷綔鍝侊級鑻辨枃鎽樿}}}
+    \end{center}
+    {
+      \bgroup
+      THESIS: ~~\nju_title_en \\
+      DEPARTMENT: ~~\nju_department_en \\
+      SPECIALIZATION: ~~\nju_major_en \\
+      UNDERGRADUATE:~~\nju_student_name_en \\
+      MENTOR:~~\nju_mentor_full_en \\
+      ABSTRACT:
+      \egroup
+    }
+    \zihao{-4}\par%
+  }{%
+  \cleardoublepage
+  \newpage
+  }
+
+  % 鑻辨枃鍏抽敭璇�
+  \NewDocumentCommand \englishkeywords {m} {%
+    \par\vspace{2ex}\noindent%
+    {KEYWORDS{:}}~~{#1}%
+  }
+}
+{ 
+  % 鐮旂┒鐢熸憳瑕佺幆澧�
+  \NewDocumentEnvironment{abstract} {}
+  {%
+    \pagestyle{plain}
+    \pagenumbering{Roman}
+    % \phantomsection\addcontentsline{toc}{chapter}{涓枃鎽樿} % 灏嗘憳瑕佹彃鍏ョ洰褰曞拰pdf涔︾
+    \pdfbookmark[0]{涓枃鎽樿}{涓枃鎽樿} % 灏嗘憳瑕佹彃鍏df涔︾锛屼笌涓婁竴琛屼笉鍙叡瀛�
+    \begin{center}
+      \kaishu\zihao{-2}{\textbf{\uuline{鍗椾含澶у鐮旂┒鐢熸瘯涓氳鏂囦腑鏂囨憳瑕侀椤电敤绾竲}}
+    \end{center}
+    
+    \bgroup
+    \kaishu\zihao{4}
+    \tl_set:Nn \tabcolsep {0pt}
+    \tl_set:Nn \arraystretch {0.8}
+    \noindent
+    姣曚笟璁烘枃棰樼洰锛歕hspace{0.5em}\nju_underline:n {\nju_title\hfill}\\    
+    \uline{\makebox[9em]{\nju_major}}涓撲笟\uline{\makebox[4em]{\nju_grade}}绾�
+    \str_if_eq:NNTF {\nju_degree} { phd } {鍗殅{纭晑
+    澹敓濮撳悕锛歕uline{\hfill\nju_student_name\hfill} \\
+    鎸囧鏁欏笀锛堝鍚嶃€佽亴绉帮級锛歕uline{\hfill\nju_mentor_full\hfill}\par
+    \egroup
+  
+    \kaishu\zihao{4}\par%
+  }{%
+  \newpage
+  }
+  
+  % 涓枃鍏抽敭璇�
+  \NewDocumentCommand \keywords {m} {%
+    \par\vspace{2ex}\noindent%
+    {\kaishu\zihao{4}\makebox[4em][s]{鍏抽敭璇峽锛殅}}~{#1}%
+  }
+  
+  % 鑻辨枃鎽樿
+  \NewDocumentEnvironment{englishabstract} {}
+  {%
+    \pagestyle{plain}
+    % \phantomsection\addcontentsline{toc}{chapter}{鑻辨枃鎽樿} % 灏嗘憳瑕佹彃鍏ョ洰褰曞拰pdf涔︾
+    \pdfbookmark[0]{鑻辨枃鎽樿}{鑻辨枃鎽樿} % 灏嗘憳瑕佹彃鍏df涔︾锛屼笌涓婁竴琛屼笉鍙叡瀛�
+    \begin{center}
+        \kaishu\zihao{-2}{\textbf{\uuline{鍗椾含澶у鐮旂┒鐢熸瘯涓氳鏂囪嫳鏂囨憳瑕侀椤电敤绾竲}}
+    \end{center}
+    {
+      \bgroup
+      \zihao{4}
+      THESIS: ~~\nju_title_en \\
+      SPECIALIZATION: ~~\nju_major_en \\
+      POSTGRADUATE:~~\nju_student_name_en \\
+      MENTOR:~~\nju_mentor_full_en\par
+      \egroup
+    }
+    \zihao{4}\par%
+  }{%
+  \cleardoublepage
+  \newpage
+  }
+  
+  % 鑻辨枃鍏抽敭璇�
+  \NewDocumentCommand \englishkeywords {m} {%
+    \par\vspace{2ex}\noindent%
+    {KEYWORDS{:}}~~{#1}%
+  }
+}
+%    \end{macrocode}
+%
+%
+%
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/njuthesis.tex b/njuthesis-sample.tex
old mode 100755
new mode 100644
similarity index 100%
rename from njuthesis.tex
rename to njuthesis-sample.tex
diff --git a/njuthesis.cls b/njuthesis.cls
index 27e42ab..b784396 100644
--- a/njuthesis.cls
+++ b/njuthesis.cls
@@ -23,6 +23,7 @@
 %% To produce the documentation run the original source files ending with `.dtx'
 %% through LaTeX.
 %% 
+%% File njuthesis.dtx
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesExplClass{njuthesis}{2021-09-12}{0.8.3}{NJU Thesis LaTeX Template}
 \LoadClass[
diff --git a/njuthesis.dtx b/njuthesis.dtx
index 3677cc7..bd9a8fc 100644
--- a/njuthesis.dtx
+++ b/njuthesis.dtx
@@ -94,6 +94,17 @@
 %  鍗椾含澶у瀛︿綅璁烘枃\hologo{LaTeX}妯℃澘鍩轰簬鏈鐢熼櫌鐨勮鏂囨挵鍐欒鑼冨埗浣滐紝鍚屾椂鍙傝€冪爺绌剁敓闄㈡彁渚涚殑纭曞+銆佸崥澹浣嶆潗鏂欏寘锛岀敤浜庣敓鎴愮鍚堝崡浜ぇ瀛﹀浣嶈鏂囨帓鐗堣姹傚拰鐩稿簲鐨勫浗瀹惰鑼冦€佽涓氭爣鍑嗙殑瀛︿綅璁烘枃锛屾棬鍦ㄤ负鍚屽鎻愪緵姣曚笟璁烘枃涔﹀啓鐨勬柟渚裤€�
 % \end{abstract}
 %
+%
+% \clearpage
+% \pagestyle{fancy}
+% \begin{multicols}{2}[
+%   \setlength{\columnseprule}{.4pt}
+%   \setlength{\columnsep}{18pt}]
+%   \tableofcontents
+% \end{multicols}
+% \clearpage
+%
+%
 % \section{妯℃澘浠嬬粛}
 %
 % \section{璐$尞鑰厎
diff --git a/njuthesis.ins b/njuthesis.ins
index 236bb44..40e4b30 100644
--- a/njuthesis.ins
+++ b/njuthesis.ins
@@ -53,7 +53,7 @@ through LaTeX.
 \Msg{*     njuthesis.cls                                         *}
 \Msg{*                                                           *}
 \Msg{* To produce the documentation run the file njuthesis.dtx   *}
-\Msg{* through LaTeX.                                            *}
+\Msg{* through XeTeX.                                            *}
 \Msg{*                                                           *}
 \Msg{* Happy TeXing!                                             *}
 \Msg{*                                                           *}
-- 
GitLab