% \iffalse meta-comment
%
% Copyright (C) 2005-2021 by Nanjing University Linux User Group <my@yaoge123.com>
% -------------------------------------------------------
% 
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% 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.
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{njuthesis.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesExplClass{njuthesis}{2021-09-12}{0.8.3}{NJU Thesis LaTeX Template}
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{dtx-style}

\EnableCrossrefs
\CodelineIndex

\begin{document}
  \DocInput{njuthesis.dtx}
\end{document}
%</driver>
% \fi
%
% \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         \~}
%
%
% \DoNotIndex{\newenvironment,\@bsphack,\@empty,\@esphack,\sfcode}
% \DoNotIndex{\addtocounter,\label,\let,\linewidth,\newcounter}
% \DoNotIndex{\noindent,\normalfont,\par,\parskip,\phantomsection}
% \DoNotIndex{\providecommand,\ProvidesPackage,\refstepcounter}
% \DoNotIndex{\RequirePackage,\setcounter,\setlength,\string,\strut}
% \DoNotIndex{\textbackslash,\texttt,\ttfamily,\usepackage}
% \DoNotIndex{\begin,\end,\begingroup,\endgroup,\par,\\}
% \DoNotIndex{\if,\ifx,\ifdim,\ifnum,\ifcase,\else,\or,\fi}
% \DoNotIndex{\let,\def,\xdef,\edef,\newcommand,\renewcommand}
% \DoNotIndex{\expandafter,\csname,\endcsname,\relax,\protect}
% \DoNotIndex{\Huge,\huge,\LARGE,\Large,\large,\normalsize}
% \DoNotIndex{\small,\footnotesize,\scriptsize,\tiny}
% \DoNotIndex{\normalfont,\bfseries,\slshape,\sffamily,\interlinepenalty}
% \DoNotIndex{\textbf,\textit,\textsf,\textsc}
% \DoNotIndex{\hfil,\par,\hskip,\vskip,\vspace,\quad}
% \DoNotIndex{\centering,\raggedright,\ref}
% \DoNotIndex{\c@secnumdepth,\@startsection,\@setfontsize}
% \DoNotIndex{\ ,\@plus,\@minus,\p@,\z@,\@m,\@M,\@ne,\m@ne}
% \DoNotIndex{\@@par,\DeclareOperation,\RequirePackage,\LoadClass}
% \DoNotIndex{\AtBeginDocument,\AtEndDocument}
%
%
% \changes{v0.8.3}{2021/09/12}{Initial docstrip version}
%
% \GetFileInfo{njuthesis.dtx}
%
% \def\indexname{索引}
% \IndexPrologue{\section{\indexname}}
%
% \title{南京大学学位论文模板}
% \author{Nanjing University Linux User Group \\[5pt]\texttt{my@yaoge123.com}}
% \date{v\fileversion\ (\filedate)}
% \maketitle\thispagestyle{empty}
%
% \section{Introduction}
%
% Put text here.
%
% \section{Usage}
%
% Put text here.
%    \begin{macrocode}
\LoadClass[
  a4paper,
  twoside,
  UTF8,
  scheme=chinese,
  linespread=1.625,% laTex默认1.2行距,word默认行距是1.3,要求1.5倍word行距,故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,

  secondmentor      .bool_set:N   =   \nju_second_mentor,
  secondmentor      .initial:n    =   false,

  nlcover           .bool_set:N   =   \nju_nl_cover,
  nlcover           .initial:n    =   false,

  degree            .tl_set:N     =   \nju_degree,
  degree            .initial:n    =   UG,

  type              .tl_set:N     =   \nju_type,
  type              .initial:n    =   thesis,

  systemfont        .bool_set:N   =   \nju_systemfont,
  systemfont        .initial:n    =   true,

  customlatinfont   .tl_set:N     =   \nju_customlatinfont,
  customlatinfont   .initial:n    =   windows,

  customchinesefont .tl_set:N     =   \nju_customchinesefont,
  customchinesefont .initial:n    =   windows,

  info              .meta:nn      =   { nju / info } { #1 }
}
%    \end{macrocode}
%
% Put text here.
%
%    \begin{macrocode}
\keys_define:nn { nju / info }
{
  % 题目
  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,

  % 年级学号姓名
  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,

  % 院系专业方向
  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,

  % 导师
  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,

  % 第二导师
  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,

  % 提交日期
  SubmitDate        .tl_set:N     =   \nju_submit_date,

  % 答辩
  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,

  % 国家图书馆封面相关
  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}
%
% \DescribeEnv{dummyEnv}
% 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} % 修改章节标题功能由CTeX提供
\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} % 清除空白页的页码

\RequirePackage{listings} % 代码环境
\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
\sys_if_engine_xetex:T
{
    \RequirePackage{microtype}

    % 加中文下划线,不能用于lualatex
    \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.
}

\RequirePackage{blindtext} % 生成用于测试的大段无意义英文文字
\RequirePackage{zhlipsum} % 生成用于测试的大段无意义中文文字
% \RequirePackage{showframe} % 加载以后展示内容边界

\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={% 消除与mathtools合用产生的警告
        mathtools-colon,
        mathtools-overbracket}
        ]{unicode-math} % Math fonts in xetex or luatex

\RequirePackage{graphicx}
\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
\graphicspath{{figure/}} % 图片路径
\RequirePackage{wrapfig} % Wrap text around figures

% 必须以该顺序加载以下三个包
% \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]
}

\NewDocumentCommand\set_latin_fontset_macos{}{
  \setmainfont{Times~New~Roman}
  \setsansfont{Arial}
  \setmonofont{Menlo}[Scale=MatchLowercase]
}

\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]
}

% 设置中文字体
\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]
}

\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,      
      % 参考CTeX手册第9节 LuaLATEX 下的中文支持方式
      % AlternateFont =
      %   {
      %   {⟨character range1⟩} {⟨alternate font name1⟩} 
      %   {⟨alternate font features2⟩} ,
      %   ......
      %   }
    ]
  \setCJKfamilyfont{zhnewhei}{PingFang~SC}
}

\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]
}

% 方正字符集
\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]
}

\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}

  % 方正楷体、方正仿宋为免费商用字体,且支持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]
}

% 字体判断
\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 } {}
  }
}
% 选择其他字体,请确保相应字体已安装

% 设置数学字体 (XITS, 或者 STIX, 与 Times New Roman 最为相近)
% \setmathfont{STIXTwoMath-Regular}[Extension = .otf]
\setmathfont{XITSMath-Regular}[
  BoldFont = XITSMath-Bold,
  Extension = .otf]

\NewDocumentCommand\songti{}{\CJKfamily{zhsong}}
\NewDocumentCommand\heiti{}{\CJKfamily{zhhei}}
\NewDocumentCommand\fangsong{}{\CJKfamily{zhfs}}
\NewDocumentCommand\kaishu{}{\CJKfamily{zhkai}}
% \NewDocumentCommand\lishu{}{\CJKfamily{zhli}}

% 本科生页眉页脚 
\fancypagestyle{njuplain}{%
   \fancyhead{}               
   \fancyfoot[C]{\zihao{5}\thepage} % 页脚居中 五号新罗马体数字
}

% TODO: 研究生页眉页脚 
\fancypagestyle{njuheadings}{%
   \fancyhead{}               
   \fancyfoot[C]{\zihao{5}\thepage}        
}

\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}} % 研究生有页眉页脚
}

% 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}

\cs_set:Npn \CTEX@addtocline #1#2
{ 
  \addcontentsline { toc } {#1} 
  { \use:c { CTEX@#1@tocline } {#1} {#2} } 
}

% 目录页面格式修改
\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
}

\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}
}

% 定制前言、致谢环境
\newenvironment{preface}
{%
  \chapter*{前言}
  \addcontentsline{toc}{chapter}{前言}
}{}
\newenvironment{acknowledgement}
{%
  \chapter*{致谢}
  \addcontentsline{toc}{chapter}{致谢}
}{}

\ProvidesExplPackage{profile/reference}{2021-09-11}{0.6.0}{NJU Thesis bibliography and reference} 

% 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}

% 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}}{}
}

% 修改标签名称
\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}{假设}{假设}

\ProvidesExplPackage{profile/components}{2021-09-11}{0.6.0}{NJU Thesis components configuration} 

% 图表位置调整
\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%
}

% 代码样式
\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
}

\lstdefinestyle{LaTeX}{
  language=TeX,
  morekeywords={begin, caption, label, mathrm, frac, toprule, midrule, bottomrule, includegraphics}
}

% 图表标题样式
\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
}

% list configuration
\renewcommand{\labelitemi}{\tiny$\blacktriangleright$}
\renewcommand{\labelitemii}{\textbullet}

\setlist[itemize]{noitemsep}
\setlist[enumerate]{noitemsep}
\setlist[description]{noitemsep}

% 数学环境
\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}

\let\oldproofname=\proofname
\renewcommand*{\proofname}{\rm\bf\songti{\oldproofname}} % 修改证明环境标题

\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}

\ProvidesExplPackage{profile/cover}{2021-09-11}{0.7.0}{NJU Thesis cover design} 

% 拼合标题
\tl_const:Nn \nju_title {\nju_title_a \nju_title_b \nju_title_c}

% 拼合导师
\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
  }
}

% 判断学位进行命令定义
\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 {博士} }
  }
}

% 判断类型
\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 计 }
}

% 封面信息栏 本科
\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}
}

% 封面信息栏 研究生
\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}
}

% 绘制封面命令
\tl_new:N \nju_printcover_nl % 国家图书馆封面
\tl_new:N \nju_printcover_ug % 本科封面
\tl_new:N \nju_printcover_g % 研究生封面

% 按需绘制国家图书馆封面,修改自旧模板
\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{封面}{封面} % 将封面插入pdf书签
  \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{封面}{封面} % 将封面插入pdf书签
  \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
}

% 重定义maketitle生成封面
\tl_set:Nn \maketitle 
{%
  \str_if_eq:NNTF { \nju_degree } { ug } 
  {
    \nju_printcover_nl % 国家图书馆封面
    \nju_printcover_ug % 本科封面
  } 
  { 
    \nju_printcover_nl % 国家图书馆封面
    \nju_printcover_g % 研究生封面 
  } 
}

\ProvidesExplPackage{profile/abstract}{2021-09-11}{0.7.0}{NJU Thesis abstract design}

% 判断学位
\str_if_eq:NNTF {\nju_degree} { ug } 
{   
  % 本科摘要环境
  \NewDocumentEnvironment{abstract} {}
  {%
    % \pagestyle{plain}
    % \pagenumbering{Roman}
    % \phantomsection\addcontentsline{toc}{chapter}{中文摘要} % 将摘要插入目录和pdf书签
    \pdfbookmark[0]{中文摘要}{中文摘要} % 将摘要插入pdf书签,与上一行不可共存
    \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]{英文摘要}{英文摘要} % 将摘要插入pdf书签,与上一行不可共存
    \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]{中文摘要}{中文摘要} % 将摘要插入pdf书签,与上一行不可共存
    \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]{英文摘要}{英文摘要} % 将摘要插入pdf书签,与上一行不可共存
    \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}
%
% \Finale
\endinput