texlive[62995] Master/texmf-dist: njuthesis

commits+karl at tug.org commits+karl at tug.org
Sun Apr 10 22:45:18 CEST 2022


Revision: 62995
          http://tug.org/svn/texlive?view=revision&revision=62995
Author:   karl
Date:     2022-04-10 22:45:18 +0200 (Sun, 10 Apr 2022)
Log Message:
-----------
njuthesis

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/njuthesis/njuthesis.pdf
    trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.dtx
    trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.ins
    trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def
    trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-undergraduate.def
    trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis.cls

Modified: trunk/Master/texmf-dist/doc/latex/njuthesis/njuthesis.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.dtx	2022-04-10 20:03:48 UTC (rev 62994)
+++ trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.dtx	2022-04-10 20:45:18 UTC (rev 62995)
@@ -111,7 +111,7 @@
 %
 %<class>\NeedsTeXFormat{LaTeX2e}
 %<*!(driver|install)>
-%<+!driver>\GetIdInfo $Id: njuthesis.dtx 0.16.1 2022-03-27 13:00:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
+%<+!driver>\GetIdInfo $Id: njuthesis.dtx 0.17.0 2022-04-09 16:30:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
 %<class>  {Thesis template for Nanjing University}
 %<class>\ProvidesExplClass{njuthesis}
 %<definition-ug>  {Undergraduate definition file for njuthesis}
@@ -200,7 +200,7 @@
 % \thanks{E-mail: \href{mailto:git+nju-lug-email-3104-issue- at yaoge123.cn}
 %   {git+nju-lug-email-3104-issue- at yaoge123.cn}}}
 %
-% \date{v0.16.1 \quad 2022-03-27}
+% \date{v0.17.0 \quad 2022-04-09}
 %
 % \changes{v0.1}{2021/09/04}{开始开发。}
 % \changes{v0.2}{2021/09/07}{初步搭建了可用的模板。}
@@ -429,8 +429,7 @@
 % \footnote{\href{https://ctan.org/pkg/njuthesis}{\cls{njuthesis}} 已经于2021年9
 % 月12日发布在 CTAN,用于绘制南大图标的
 % \href{https://ctan.org/pkg/njuvisual}{\pkg{njuvisual}} 也已于同年11月28日发
-% 布,两者已被 \hologo{TeX}\,Live 和 \hologo{MiKTeX} 收录,将进入 \hologo{TeX}\,
-% Live 2022 发行版。}上提供基本的介绍信息,可以下载说明文档(本文档)和宏包源代
+% 布,两者已被 \hologo{TeX} Live 和 \hologo{MiKTeX} 收录。}上提供基本的介绍信息,可以下载说明文档(本文档)和宏包源代
 % 码。当然,使用这一来源时并不需要接触后者,请参考
 % \ref{subsubsec:standard-installation} 的标准安装方法。
 %
@@ -571,7 +570,7 @@
 %   \item 校园网环境中访问\ignorespaces
 %         \href{https://mirror.nju.edu.cn/download/TeX%20排版系统}
 %         {南京大学开源软件镜像站}可以获得最佳的下载体验。
-%   \item 使用最新的发行版,即版本号为2021或者21。
+%   \item 使用最新的发行版,即版本号为2022或者22。
 %   \item 对于 Windows 和 macOS 用户,更推荐轻量化的 \hologo{MiKTeX} 套件。
 % ^^A   \item Linux 用户请尽可能下载 full 版本,如 |texlive-full|。
 % ^^A         换言之,下载最大的软件包。
@@ -696,7 +695,7 @@
 %
 % \begin{enumerate}
 %   \item 访问\href{https://tex.nju.edu.cn}{南大 \hologo{TeX} 网站},点击界面右上方“注册”按钮,使用\emph{南京大学邮箱}注册账号并登录
-%   \item 新建空白项目,或者上传 \ref{subsubsec:on-the-fly-installation} 得到的压缩文件。
+%   \item 新建空白项目,或者上传 \ref{subsubsec:on-the-fly-installation} 节得到的压缩文件。
 %   \item 在项目页面左上角的“菜单”中,确认编译器为 |XeLaTeX| 或者 |LuaLaTeX|
 %   \item 仿照 \file{njuthesis-sample.tex} 编写论文
 %   \item 点击“重新编译”按钮进行编译和预览
@@ -715,15 +714,23 @@
 %
 % \subsection{版本升级}
 %
-% 考虑到本模板仍在开发中,将不断发布新版本,您可能需要不定期进行更新以得到对于已知问题的修复补丁。每个版本的更新内容记录于 Git 仓库中的 \file{CHANGELOG.md}。考虑到安装和编译方式的差异,不妨直接将论文内容迁移至新版的 \file{njuthesis-sample.tex}\footnote{请赞美 \hologo{TeX} 系统“样式与内容分离”的原则!},然后按照当前工作文件夹内是否有 \file{.cls} 文件分别进行更新操作。
+% 本模板仍在开发中,将不断发布新版本,您可能需要不定期进行更新以得到
+% 对于已知问题的修复补丁。每个版本的更新内容记录于 Git 仓库中的
+% \file{CHANGELOG.md}。除非特别提到选项变化,升级时一般无需更改 \file{.tex}
+% 文件内容\footnote{在确实发生了接口变动,例如选项名称发生了更改,
+% 一种稳妥做法是将论文内容迁移至新版的 \file{njuthesis-sample.tex}}。
+% 基于安装和编译方式的差异,可以按照当前工作文件夹内是否有 \file{.cls}
+% 文件分别进行更新操作。
 %
 % \subparagraph{有}
-% 迁移至 \file{njuthesis-user-v*.zip} 提供的新内容。
+% 下载 \file{njuthesis-user-v*.zip},使用其中新版的 \file{.cls}、\file{.def}
+% 文件覆盖旧版本。
 %
 % \subparagraph{没有}
-% 如果使用的是南大 \hologo{TeX},更新内置模板时会进行公告,一般为上传 CTAN 后一周。如果是本地安装,请直接使用包管理器进行更新:
+% 如果使用的是南大 \hologo{TeX},更新内置模板时会进行公告,一般为上传 CTAN
+% 后一周内。如果是本地安装,请直接使用包管理器进行更新:
 % \begin{shellexample}[morekeywords={tlmgr},emph={update}]
-%   tlmgr update all
+%   tlmgr update --all
 % \end{shellexample}
 %
 %
@@ -733,7 +740,8 @@
 %
 % 典型的 \cls{njuthesis} 主文件结构应该如下所示:
 %
-% \begin{latexexample}[moretexcs={\njusetup,\graphicspath,\tableofcontents,\maketitle,\mainmatter,\chapter,\printbibliography},emph={[1]document}]
+% \begin{latexexample}[moretexcs={\njusetup,\graphicspath,\tableofcontents,
+%   \maketitle,\mainmatter,\chapter,\printbibliography},emph={[1]document}]
 %   \documentclass{njuthesis}
 %   \njusetup{}
 %   \begin{document}
@@ -746,14 +754,15 @@
 %   \end{document}
 % \end{latexexample}
 %
-% 如果您尝试编译上面的代码,会发现自己得到了一个5页的 PDF 文档,是一份空白的本科生论文。
-% 当然,这个文档实际上没有任何内容,接下来将会介绍具体填写内容的方法。
+% 如果您尝试编译上面的代码,会发现自己得到了一个5页的 PDF 文档,
+% 是一份空白的本科生论文。当然,这个文档实际上没有任何内容,
+% 接下来的部分会介绍具体填写内容的方法。
 %
 %
 % \subsection{模板选项}
 %
 % 模板选项位于 \tn{documentclass} 后的方括号内,用于指定模板的行为。
-% 下文中尖括号内列出了若干个允许的选项,其中加粗的为默认选项。
+% 下文中尖括号内列出了若干个允许的选项,其中加粗的为默认选项(缺省值)。
 %
 % \subsubsection{学位信息}
 % \begin{function}[added=2021-09-07]{degree}
@@ -767,7 +776,8 @@
 %   \begin{syntax}
 %     type = <(thesis)|design>
 %   \end{syntax}
-% 用于选择文档类型并将相关字段输出在封面和摘要页,可选值分别为毕业论文和毕业设计,默认为毕业论文。
+% 用于选择文档类型并将相关字段输出在封面和摘要页,
+% 可选值分别为毕业论文和毕业设计,默认为毕业论文。
 % \end{function}
 %
 %
@@ -787,12 +797,20 @@
 %   \begin{syntax}
 %     decl-page = <\TFF>
 %   \end{syntax}
-% 是否需要诚信承诺书或原创性声明页面,默认关闭。
+% 是否需要自动生成声明页面,默认关闭。
 % \end{function}
 %
-% 通过此项可在封面后添加本科生的诚信承诺书或研究生的原创性声明。
+% 通过此项,对于本科生模板可在封面后添加的诚信承诺书,
+% 对于研究生模板可在封面后添加原创性声明,并且在最后一页添加学位论文出版授权书。
 %
+% 对于需要手动插入承诺书扫描页的情况,可以在导言区载入 \pkg{pdfpages} 宏包,
+% 并在所需位置使用该红包提供的 \cs{includepdf} 命令。
+% 例如,可以用如下所示的命令插入扫描件的第一页,并插入紧随的一个空白页。
+% \begin{latexexample}[moretexcs={\includepdf},emph={[2]pages}]
+%   \includepdf[pages={1,{}}]{scanned.pdf}
+% \end{latexexample}
 %
+%
 % \subsubsection{单双面模式}
 %
 % \begin{function}[added=2022-01-14]{oneside,twoside}
@@ -802,7 +820,10 @@
 % 开启单面或双面模式,默认为双面模式。
 % \end{function}
 %
-% 本选项继承自 \hologo{LaTeX2e} \cls{book} 标准文档类。单双面选项为全局选项,开启后会改变页码编号,以及部分宏包的行为。在单面模式下,页面是连续的,不会产生空白页;在双面模式下,封面、摘要、参考文献列表等特殊页面以及新的章节都会从奇数页开始,更适合印刷输出。
+% 本选项继承自 \hologo{LaTeX2e} \cls{book} 标准文档类。
+% 单双面选项为全局选项,开启后会改变页码编号,以及部分宏包的行为。
+% 在单面模式下,页面是连续的,不会产生空白页;在双面模式下,封面、摘要、
+% 参考文献表等特殊页面,以及新的章节都会从奇数页开始,更适合印刷输出。
 %
 %
 % \subsubsection{草稿模式}
@@ -814,7 +835,8 @@
 % 选择是否开启草稿模式,默认关闭。
 % \end{function}
 %
-% 本选项继承自 \hologo{LaTeX2e} \cls{book} 标准文档类。草稿模式为全局选项,启用这一选项将产生以下整体影响:
+% 本选项继承自 \hologo{LaTeX2e} \cls{book} 标准文档类。
+% 草稿模式为全局选项,启用这一选项将产生以下整体影响:
 % \begin{itemize}
 %   \item 禁用封面的绘制(包括承诺和声明)
 %   \item 显示页面文字范围边框以及页眉页脚线
@@ -855,10 +877,13 @@
 % 手动指定字体。
 % \end{function}
 %
-% 根据学校论文格式的要求,本模板使用的中文字体主要有{\songti 宋体}、{\heiti 黑体}、{\kaishu 楷体}、{\fangsong 仿宋}四种;
-% 西文字体主要有衬线体(\textup{serif})、无衬线体(\textsf{sans-serif})和等宽字体(\texttt{monospace})三种。
-% 在生成论文时,需要将每一种字体(宋体、楷体)与一种字库(操作系统中的 ttf 文件)相对应。
-% 由于不同操作系统自带的字库不同,在不同的操作系统上使用同一套配置会导致缺字、编译出错等后果。
+% 根据学校论文格式的要求,本模板使用的中文字体主要有{\songti 宋体}、
+% {\heiti 黑体}、{\kaishu 楷体}、{\fangsong 仿宋}四种;
+% 西文字体主要有衬线体(\textup{serif})、无衬线体(\textsf{sans-serif})
+% 和等宽字体(\texttt{monospace})三种。
+% 在生成论文时,需要将每一种字体(宋体、楷体)与一种字库(操作系统中的
+% \file{.ttf} 文件)相对应。由于不同操作系统自带的字库不同,
+% 在不同的操作系统上使用同一套配置会导致缺字、编译出错等后果。
 % 因此,本模板对于中文字体和西文字体都提供了多种字体配置。
 %
 % 本模板提供的中文字体配置如表 \ref{tab:cjk-fontset} 所示。
@@ -948,10 +973,14 @@
 %   \begin{syntax}
 %     \tn{njusetup} \Arg{键值列表}
 %   \end{syntax}
-% 是 \cls{njuthesis} 文档类的通用设置命令,用来设置各项功能。\tn{njusetup} 的参数是一个使用英文半角逗号分隔的键值列表,通常形如 \meta{key}|=|\meta{value}。
+% 是 \cls{njuthesis} 文档类的通用设置命令,用来设置各项功能。
+% \tn{njusetup} 的参数是一个使用英文半角逗号分隔的键值列表,
+% 通常形如 \meta{key}|=|\meta{value}。
 % \end{function}
 %
-% 目前,\tn{njusetup} 仅包含用于设置个人信息的 |info| 类。以下为全部的个人信息参数,其中带有星号的为对应的英文字段。请注意,部分参数已被弃置,列于后方。
+% 目前,\tn{njusetup} 仅包含用于设置个人信息的 |info| 类。
+% 以下为全部的个人信息参数,其中带有星号的为对应的英文字段。
+% 请注意,部分参数已被弃置,列于后方。
 %
 % \begin{function}[updated=2022-01-14]{info/title,info/title*}
 %   \begin{syntax}
@@ -958,7 +987,10 @@
 %     title  = \Arg{标题}
 %     title* = \Arg{英文标题}
 %   \end{syntax}
-% 题目。由于封面上提供给中文题目的横线长度有限\footnote{单行最长为15个汉字,建议总长度不超过45字},本模板默认会自动对标题进行换行。如果需要手动指定换行位点,请使用换行控制符( |\\| ),最多两处。
+% 题目。由于封面上提供给中文题目的横线长度有限\footnote{单行最长约为15
+% 个汉字,建议总长度不超过45字,当然你也可以对照 \ref{subsubsec:modify-length}
+% 节修改横线长度},本模板默认会自动对标题进行换行。
+% 如果需要手动指定换行位点,请使用换行控制符( |\\| )。
 % \end{function}
 %
 % 绘制封面及摘要中的标题涉及断行处理,无法对空字符串产生正确结果。
@@ -974,7 +1006,8 @@
 %     keywords  = \Arg{关键词}
 %     keywords* = \Arg{英文关键词}
 %   \end{syntax}
-% 关键词列表。关键词之间需要使用英文半角逗号隔开,含有空格的关键字需要使用花括号包裹以避免歧义。可以参照下方的填写示例。
+% 关键词列表。关键词之间需要使用英文半角逗号隔开,
+% 含有空格的关键字需要使用花括号包裹以避免歧义。可以参照下方的填写示例。
 % \end{function}
 %
 % \begin{function}[updated=2021-10-01]{info/grade}
@@ -988,7 +1021,8 @@
 %   \begin{syntax}
 %     student-id = \Arg{学号}
 %   \end{syntax}
-% 学号。南京大学本科生为9位数字学号,研究生为两位大写字母标识加上八位数字组成的学号。
+% 学号。南京大学本科生为9位数字学号,
+% 研究生为两位大写字母标识加上数字组成的学号。
 % \end{function}
 %
 % \begin{function}[updated=2021-10-01]{info/author,info/author*}
@@ -1058,10 +1092,13 @@
 %     chairman = \Arg{答辩主席}
 %     reviewer = \Arg{评委姓名职称}
 %   \end{syntax}
-% 答辩委员会信息,分别为评审委员会主席及四位成员的姓名加职称,只对研究生有效。四位评审成员是以列表的形式存储的,填写方法同关键词。如果是盲审,填入“盲审”二字即可。
+% 答辩委员会信息,分别为评审委员会主席及四位成员的姓名加职称,只对研究生有效。
+% 四位评审成员是以列表的形式存储的,填写方法同关键词。
+% 如果是盲审,填入“盲审”二字即可。
 % \end{function}
 %
-% \begin{function}[updated=2021-10-01]{info/clc,info/secret-level,info/udc,info/supervisor-contact}
+% \begin{function}[updated=2021-10-01]{info/clc,info/secret-level,
+%   info/udc,info/supervisor-contact}
 %   \begin{syntax}
 %     clc = \Arg{中图分类号}
 %     secret-level = <不涉密|秘密|机密|绝密>
@@ -1129,6 +1166,7 @@
 %           supervisor*= {Professor Li Chengdian},
 %           submit-date = {2021-09-12},
 %           defend-date = {2022-01-15},
+%           email = {git+nju-lug-email-3104-issue- at yaoge123.cn},
 %           chairman = {张晓山~教授},
 %           reviewer = {王瑞希~教授,郭德纲~副教授,华芈库~教授,戴菲菲~教授},
 %           clc = {0175.2},
@@ -1158,7 +1196,17 @@
 % 对于过长的标题,目录和页眉中会使用其短描述。
 % \end{function}
 %
+% \begin{function}{\chaptermark,\sectionmark}
+%   \begin{syntax}
+%     \tn{chapter}\oarg{用在页眉的章标题}\marg{完整的章标题}
+%     \tn{sectionmark}\marg{用在目录的章标题}
+%     \tn{section}\oarg{用在页眉的章标题}\marg{完整的节标题}
+%     \tn{sectionmark}\marg{用在目录节标题}
+%   \end{syntax}
+% 如果页眉内容发生了冲突,可使用这两个命令细化定制。
+% \end{function}
 %
+%
 % \subsubsection{页面}
 %
 % 在本模板预定义的页面样式中:本科生使用 \opt{plain} 样式,无页眉,
@@ -1637,7 +1685,7 @@
 %
 % \subparagraph{使用 JabRef}
 %
-% \href{https://www.jabref.org/}{jabRef} 是一款开源、跨平台的文献管理软件。
+% \href{https://www.jabref.org/}{JabRef} 是一款开源、跨平台的文献管理软件。
 % JabRef 提供了对 \hologo{BibTeX} 和 \pkg{biblatex} 的原生支持,
 % 能够直接管理 \file{.bib} 文件, 还可以向 TeXstudio 等外部软件推送引用命令。
 %
@@ -1776,7 +1824,7 @@
 %     \quad\tn{item}\oarg{符号} \meta{说明}
 %     \tn{end}\{notation\}
 %   \end{syntax}
-% 符号表。带有星号的符号表环境不会插入目录。
+% 符号表,或者称为术语表、缩略词对照表。带有星号的符号表环境不会插入目录。
 % \end{function}
 %
 %
@@ -1806,9 +1854,18 @@
 %   \begin{syntax}
 %     \tn{njupaperlist}\oarg{标题}\marg{文献}
 %   \end{syntax}
-% 成果列表,默认标题为发表文章目录。\Arg{文献} 的填写方式同 \tn{cite},多个文献需要使用英文半角逗号隔开。
+% 成果列表,生成一个列举文献条目的无编号节。可选参数为标题,
+% 默认为“发表文章目录”。\Arg{文献} 的填写方式同 \tn{cite},
+% 多个文献需要使用英文半角逗号隔开。
 % \end{function}
 %
+% 一个简单的例子如下所示:
+% \begin{latexexample}[moretexcs={\njuchapter,\njupaperlist}]
+%   \njuchapter{攻读博士学位期间研究成果}
+%   \njupaperlist[攻读博士学位期间发表的学术论文]{
+%     Nemec1997-209-214,Chiani1998-2998-3008,Chiani1998a}
+% \end{latexexample}
+%
 % 为了便于识别,成果列表中默认对发表年份进行加粗处理。而对作者姓名的处理较为复杂。利用 \pkg{biblatex} 的数据注解机制可以实现对特定文献信息的样式修改\footnote{\url{https://blog.csdn.net/xenonhu/article/details/120853247}},在此可以用来实现指定作者姓名的突出。经过注解后的一则参考文献条目如下所示:
 % \begin{latexexample}[emph={[1]@inproceedings},emph={[2]author}]
 %   @inproceedings{Nemec1997-209-214,
@@ -1826,14 +1883,76 @@
 %
 % 除手动进行标记以外,以下也提供一种自动化处理办法。下载 \href{https://github.com/hushidong/biblatex-map}{bibmap} 全部文件后,修改主目录下的 \file{bibmapaddauthoran.py} 中 |fieldsource| 为需要匹配的姓名,将需要进行标记的 \file{.bib} 文件拷贝至本目录(此处使用 \file{test.bib} 进行示范),运行以下命令生成的参考文献数据源即可被成果列表识别加粗。
 %
-% \begin{shellexample}[morekeywords={python}]
+% \begin{shellexample}[morekeywords={python},deletekeywords={test}]
 %   python bibmap.py test.bib -m bibmapaddauthoran.py
 % \end{shellexample}
 %
 %
+% \subsection{额外定制}
+%
+% 在研究生院松散的规定下,本模板仅能提供一个大体适用的框架,
+% 势必需要为用户修改留出空间。这一节将提供一些定制方法。
+%
+% \subsubsection{固定文本}
+%
+% \begin{function}{\njusetname,\njusetname*,\njusettext,\njusettext*}
+%   \begin{syntax}
+%     \tn{njusetname}  = \marg{名称}\oarg{变体}\marg{内容}
+%     \tn{njusetname*} = \marg{名称}\oarg{变体}\marg{内容}
+%     \tn{njusettext}  = \marg{名称}\oarg{变体}\marg{内容}
+%     \tn{njusettext*} = \marg{名称}\oarg{变体}\marg{内容}
+%   \end{syntax}
+% 修改固定文本内容,带星号的命令表示修改对应的英文字段。
+% 名称对应的默认内容可以参见 \ref{subsubsec:constant-name} 与
+% \ref{subsubsec:constant-text} 节。
+% \end{function}
+%
+% 譬如,将英文摘要页的小标题修改为仅首字母大写的样式,示例如下:
+%
+% \begin{latexexample}[moretexcs={\njusetname*}]
+%   \njusetname*{abstract}[b]{Abstract}
+% \end{latexexample}
+%
+% \subsubsection{长度值}
+% \label{subsubsec:modify-length}
+%
+% \begin{function}{\njusetlength,\njusetlength*}
+%   \begin{syntax}
+%     \tn{njusetlength}  = \marg{名称}\marg{长度}
+%     \tn{njusetlength*} = \marg{名称}\marg{长度}
+%   \end{syntax}
+% 修改长度值,默认为修改固定长度(|dim| 类型),
+% 带星号的命令表示修改弹性长度(|skip| 类型,目前未涉及)。
+% 默认长度值可以参见 \ref{subsubsec:constant-length} 节。
+% \end{function}
+%
+% 譬如,将封面页填写个人信息的横线加长,示例如下:
+%
+% \begin{latexexample}[moretexcs={\njusetlength}]
+%   \njusetlength{coveruline}{330pt}
+% \end{latexexample}
+%
+% \subsubsection{样式}
+% \label{subsubsec:modify-format}
+%
+% \begin{function}{\njusetformat}
+%   \begin{syntax}
+%     \tn{njusetformat} = \marg{名称}\marg{样式}
+%   \end{syntax}
+% 修改样式。默认样式可以参见 \ref{subsubsec:constant-format} 节。
+% \end{function}
+%
+% 譬如,将章标题字号加大到小二号,示例如下:
+%
+% \begin{latexexample}[moretexcs={\njusetformat,\zihao}]
+%   \njusetformat{chapter}{\zihao{-2}\normalfont\sffamily\centering}
+% \end{latexexample}
+%
+%
 % \subsection{视觉识别系统}
 %
-% 视觉识别系统 \pkg{njuvisual} 现已被分离为独立宏包\cite{njuvisual},基本使用方法举例如下:
+% 视觉识别系统 \pkg{njuvisual} 现已被分离为独立宏包\cite{njuvisual},
+% 基本使用方法举例如下:
 % \begin{latexexample}[moretexcs={\njuemblem,\njuname,\njuname*}]
 %   \njuemblem{!}{3cm}                           % 生成高 3cm 的紫色校徽
 %   \njuname{4cm}{!}                             % 生成宽 4cm 的紫色中文校名
@@ -1884,6 +2003,7 @@
 %   \item \pkg{fandol}、\pkg{tex-gyre} 和 \pkg{tex-gyre-math},提供自由字体。
 %   \item \pkg{emptypage},在双面模式下清空空白页的页眉、页脚和页码。
 %   \item \pkg{njuvisual},用于绘制封面的校名校徽。
+%   \item \pkg{tabularray},用于绘制研究生的出版授权书信息表格。
 %   \item \pkg{xeCJKfntef} 或 \pkg{lua-ul},用于在对应引擎下绘制下划线。
 % \end{itemize}
 %
@@ -2174,37 +2294,40 @@
 %
 % 在变量名称中,|l| 代表局部变量,|g| 代表全局变量,|c| 代表常量,最后一个下划线后的内容指示其类型。
 %
-% \begin{variable}{\l_@@_tmp_box,\l_@@_tmp_clist,\l_@@_tmp_dim,
-%   \l_@@_tmp_int,\l_@@_tmp_seq,\l_@@_tmp_tl}
+% \begin{variable}{\l_@@_tmp_box,\l_@@_tmp_clist,
+%   \l_@@_tmpa_dim,\l_@@_tmpb_dim,\l_@@_tmp_int,
+%   \l_@@_tmp_seq,\l_@@_tmpa_tl,\l_@@_tmpb_tl}
 % 临时变量。
 %    \begin{macrocode}
 \box_new:N   \l_@@_tmp_box
 \clist_new:N \l_@@_tmp_clist
-\dim_new:N   \l_@@_tmp_dim
+\dim_new:N   \l_@@_tmpa_dim
+\dim_new:N   \l_@@_tmpb_dim
 \int_new:N   \l_@@_tmp_int
 \seq_new:N   \l_@@_tmp_seq
-\tl_new:N    \l_@@_tmp_tl
+\tl_new:N    \l_@@_tmpa_tl
+\tl_new:N    \l_@@_tmpb_tl
 %    \end{macrocode}
 % \end{variable}
 %
 % \begin{variable}{\g_@@_info_degree_int,
-%   \l_@@_info_diploma_int,\g_@@_info_type_int}
+%   \g_@@_info_diploma_int,\g_@@_info_type_int}
 % 用于存储学位类型的变量。
 %    \begin{macrocode}
 \int_new:N \g_@@_info_degree_int
-\int_new:N \l_@@_info_diploma_int
+\int_new:N \g_@@_info_diploma_int
 \int_new:N \g_@@_info_type_int
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_info_degree_tl,\l_@@_info_diploma_tl,
-%   \l_@@_info_type_tl,\l_@@_info_type_en_tl}
+% \begin{variable}{\g_@@_info_degree_tl,\g_@@_info_diploma_tl,
+%   \g_@@_info_type_tl,\g_@@_info_type_en_tl}
 % 用于存储学位名称的变量。
 %    \begin{macrocode}
-\tl_new:N  \l_@@_info_degree_tl
-\tl_new:N  \l_@@_info_diploma_tl
-\tl_new:N  \l_@@_info_type_tl
-\tl_new:N  \l_@@_info_type_en_tl
+\tl_new:N  \g_@@_info_degree_tl
+\tl_new:N  \g_@@_info_diploma_tl
+\tl_new:N  \g_@@_info_type_tl
+\tl_new:N  \g_@@_info_type_en_tl
 %    \end{macrocode}
 % \end{variable}
 %
@@ -2223,11 +2346,11 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_info_supv_full_tl,\l_@@_info_supv_full_en_tl}
+% \begin{variable}{\g_@@_info_supvfull_tl,\g_@@_info_supvfull_en_tl}
 % 用于存储导师姓名加职称的变量。
 %    \begin{macrocode}
-\tl_new:N \l_@@_info_supv_full_tl
-\tl_new:N \l_@@_info_supv_full_en_tl
+\tl_new:N \g_@@_info_supvfull_tl
+\tl_new:N \g_@@_info_supvfull_en_tl
 %    \end{macrocode}
 % \end{variable}
 %
@@ -2253,13 +2376,13 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_info_sm_date_tl,\l_@@_info_sm_date_en_tl,
-% \l_@@_info_df_date_tl}
+% \begin{variable}{\g_@@_info_submitdate_tl,\g_@@_info_submitdate_en_tl,
+% \g_@@_info_defenddate_tl}
 % 用于存储格式化后的论文提交日期和答辩日期的变量。
 %    \begin{macrocode}
-\tl_new:N \l_@@_info_sm_date_tl
-\tl_new:N \l_@@_info_sm_date_en_tl
-\tl_new:N \l_@@_info_df_date_tl
+\tl_new:N \g_@@_info_submitdate_tl
+\tl_new:N \g_@@_info_submitdate_en_tl
+\tl_new:N \g_@@_info_defenddate_tl
 %    \end{macrocode}
 % \end{variable}
 %
@@ -2275,17 +2398,17 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\c_@@_name_type_clist,\c_@@_name_type_en_clist,
-%   \c_@@_name_degree_clist,\c_@@_name_degree_en_clist}
+% \begin{variable}{\g_@@_name_type_clist,\g_@@_name_type_en_clist,
+%   \g_@@_name_degree_clist,\g_@@_name_degree_en_clist}
 % 论文类型与学位类型。
 %    \begin{macrocode}
-\clist_const:Nn \c_@@_name_type_clist
+\clist_const:Nn \g_@@_name_type_clist
   { 毕业论文, 毕业设计 }
-\clist_const:Nn \c_@@_name_type_en_clist
+\clist_const:Nn \g_@@_name_type_en_clist
   { THESIS, DESIGN }
-\clist_const:Nn \c_@@_name_degree_clist
+\clist_const:Nn \g_@@_name_degree_clist
   { 学士, 硕士, 硕士专业, 博士 }
-\clist_const:Nn \c_@@_name_degree_en_clist
+\clist_const:Nn \g_@@_name_degree_en_clist
   { Bachelor, Master, Master, Doctor~of~Philosophy }
 %    \end{macrocode}
 % \end{variable}
@@ -2315,8 +2438,8 @@
 % \begin{macro}{\@@_vskip:,\@@_hskip:}
 % 生成一个较小的 skip。
 %    \begin{macrocode}
-\cs_new:Nn \@@_vskip: { \skip_vertical:n   { 1   ex } }
-\cs_new:Nn \@@_hskip: { \skip_horizontal:n { 0.3 em } }
+\cs_new:Nn \@@_vskip: { \skip_vertical:N   \g_@@_smallvskip_dim }
+\cs_new:Nn \@@_hskip: { \skip_horizontal:N \g_@@_smallhskip_dim }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2338,15 +2461,47 @@
 % 用来定义默认名称的辅助函数。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_define_name:nn #1#2
-  { \tl_const:cn { c_@@_name_ #1    _tl } { #2 } }
+  {
+    \tl_new:c   { g_@@_name_ #1    _tl }
+    \tl_gset:cn { g_@@_name_ #1    _tl } { #2 }
+  }
 \cs_new_protected:Npn \@@_define_name:nnn #1#2#3
   {
-    \tl_const:cn { c_@@_name_ #1    _tl } { #2 }
-    \tl_const:cn { c_@@_name_ #1 _en_tl } { #3 }
+    \tl_new:c   { g_@@_name_ #1    _tl }
+    \tl_gset:cn { g_@@_name_ #1    _tl } { #2 }
+    \tl_new:c   { g_@@_name_ #1 _en_tl }
+    \tl_gset:cn { g_@@_name_ #1 _en_tl } { #3 }
   }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_define_fmt:nn}
+% 用来定义默认样式的辅助函数。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_define_fmt:nn #1#2
+  {
+    \tl_new:c   { g_@@_fmt_ #1 _tl }
+    \tl_gset:cn { g_@@_fmt_ #1 _tl } { #2 }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_define_dim:nn,\@@_define_skip:nn}
+% 用来定义默认间距的辅助函数。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_define_dim:nn #1#2
+  {
+    \dim_new:c   { g_@@_ #1 _dim }
+    \dim_gset:cn { g_@@_ #1 _dim } { #2 }
+  }
+\cs_new_protected:Npn \@@_define_skip:nn #1#2
+  {
+    \skip_new:c   { g_@@_ #1 _skip }
+    \skip_gset:cn { g_@@_ #1 _skip } { #2 }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_add_theorem_type:nnn}
 % 添加已知的定理环境类型。
 %    \begin{macrocode}
@@ -2361,8 +2516,8 @@
 % \begin{macro}{\@@_name:n,\@@_info:n}
 % 根据变量名调用名称和内容信息。
 %    \begin{macrocode}
-\cs_new:Npn \@@_name:n #1 { \tl_use:c { c_@@_name_ #1 _tl } }
-\cs_new:Npn \@@_info:n #1 { \tl_use:c { l_@@_info_ #1 _tl } }
+\cs_new:Npn \@@_name:n #1 { \tl_use:c { g_@@_name_ #1 _tl } }
+\cs_new:Npn \@@_info:n #1 { \tl_use:c { g_@@_info_ #1 _tl } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2434,10 +2589,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_put_inempty_seg:nnn #1#2#3
   {
-    \tl_set:Nx \l_@@_tmp_tl
+    \tl_set:Nx \l_@@_tmpa_tl
       { \tl_range:Nnn { #1 } { #2 } { #2 + #3 - 1 } }
-    \tl_if_empty:NF \l_@@_tmp_tl
-      { \clist_put_right:NV \l_@@_tmp_clist { \l_@@_tmp_tl } }
+    \tl_if_empty:NF \l_@@_tmpa_tl
+      { \clist_put_right:NV \l_@@_tmp_clist { \l_@@_tmpa_tl } }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2572,34 +2727,30 @@
   }
 %    \end{macrocode}
 %
-% \begin{macro}{\@@_split_title:n,\@@_split_title:V}
-% 分割标题。
+% \begin{macro}{\@@_uline_title:}
+% \changes{v0.17}{2022/04/09}{优化封面标题的断行方式。}
+% 多行带下划线标题。使用 \hologo{TeX} 原生断行算法实现。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_split_title:n #1
+\cs_new_protected:Npn \@@_uline_title:
   {
-    \tl_if_in:nnTF { #1 } { \\ }
-      {
-%    \end{macrocode}
-% 从 |\\| 进行分割,存入 |clist|。
-%    \begin{macrocode}
-        \seq_set_split:Nnn \l_@@_tmp_seq { \\ } { #1 }
-        \clist_set_from_seq:NN \l_@@_tmp_clist \l_@@_tmp_seq
+    \setbox0 = \vbox{
+        \leftskip=0.5em plus 1 fill
+        \rightskip=\leftskip \parskip=1cm
+        \parindent=\z@ \g_@@_info_title_tl \par
+        \global\setbox2=\hbox{}
+        \loop
+          \setbox1=\lastbox \unskip\unpenalty
+        \unless\ifvoid1
+          \global\setbox2=\hbox{\@@_uline_box:\penalty0\unhbox2}
+        \repeat
       }
-      {
-%    \end{macrocode}
-% 如果没找到换行符,则手动从固定宽度的位置进行分割。
-%    \begin{macrocode}
-        \@@_put_inempty_seg:nnn { #1 } { 1  } { 15 }
-        \@@_put_inempty_seg:nnn { #1 } { 16 } { 15 }
-        \@@_put_inempty_seg:nnn { #1 } { 31 } { 15 }
-      }
+      { \noindent \unhbox2 \par }
   }
-\cs_generate_variant:Nn \@@_split_title:n { V }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_multiline_title:nnn}
-% 生成多行标题。
+% \begin{macro}{\@@_cover_entry_title:nnn}
+% 生成普通封面页的标题条目,包括标签和标题本身。
 % \begin{arguments}
 %   \item 内容格式
 %   \item 名称盒子宽度,|dim| 型变量
@@ -2606,15 +2757,23 @@
 %   \item 内容盒子宽度,|dim| 型变量
 % \end{arguments}
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_multiline_title:nnn #1#2#3
+\cs_new_protected:Npn \@@_cover_entry_title:nnn #1#2#3
   {
-    \tl_if_empty:NT \l_@@_info_title_tl
+    \tl_if_empty:NT \g_@@_info_title_tl
       { \msg_error:nn { njuthesis } { missing-title } }
-    \@@_split_title:V \l_@@_info_title_tl
-    \@@_spread_box:nnV { #2 } { \kaishu } \c_@@_name_title_tl
-    \@@_hskip:
-    \clist_map_inline:Nn \l_@@_tmp_clist
-      { \@@_ulined_center_box:nn { #3 } { #1 ##1 } \@@_vskip: }
+    \@@_spread_box:nnV { #2 } { \kaishu } \g_@@_name_title_tl
+    \mode_leave_vertical: \@@_hskip:
+%    \end{macrocode}
+% 这里需要存储 \tn{baselineskip} 的值,以使 \tn{parbox} 后行距正确。
+% \footnote{\url{https://tex.stackexchange.com/questions/34971/how-to-keep-a-constant-baselineskip-when-using-minipages-or-parboxes}}
+%    \begin{macrocode}
+    \parbox [ t ] { #3 }
+      {
+        \dim_set_eq:NN \baselineskip \g_@@_coverlineskip_dim
+        #1 \@@_uline_title:
+        \dim_set_eq:NN \l_@@_tmpa_dim \prevdepth
+      }
+    \par \prevdepth \l_@@_tmpa_dim
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2632,7 +2791,7 @@
     \@@_spread_box:nnx { #2 } { \kaishu } { \@@_name:n { #1 } }
     \@@_hskip:
     \@@_ulined_center_box:nn { #3 }       { \@@_info:n { #1 } }
-    \@@_vskip:
+    \par
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2651,16 +2810,16 @@
     \@@_spread_box:nnx { #3 } { \kaishu } { \@@_name:n { #1 } }
     \@@_hskip:
     \@@_ulined_center_box:nn { #4 }       { \@@_info:n { #1 } }
-    \skip_horizontal:n { 0.5 em }
+    \@@_hskip:
     \@@_spread_box:nnx { #3 } { \kaishu } { \@@_name:n { #2 } }
     \@@_hskip:
     \@@_ulined_center_box:nn { #4 }       { \@@_info:n { #2 } }
-    \@@_vskip:
+    \par
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_cover_supv_entry:nnn}
+% \begin{macro}{\@@_cover_entry_supv:nnn}
 % 生成两项导师信息条目,仅用于本科生封面。
 % \begin{arguments}
 %   \item 条目名称
@@ -2668,18 +2827,18 @@
 %   \item 短内容盒子宽度,|dim| 型变量
 % \end{arguments}
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cover_supv_entry:nnn #1#2#3
+\cs_new_protected:Npn \@@_cover_entry_supv:nnn #1#2#3
   {
     \@@_spread_box:nnx { #2 } { \kaishu } { \@@_name:n { #1 } }
     \@@_hskip:
     \@@_ulined_center_box:nn { #3 }
-      { \clist_item:cn { l_@@_info_ #1 _clist } { 1 } }
-    \skip_horizontal:n { 0.5 em }
-    \@@_spread_box:nnV { #2 } { \kaishu } \c_@@_name_supv_ttl_tl
+      { \clist_item:cn { g_@@_info_ #1 _clist } { 1 } }
     \@@_hskip:
+    \@@_spread_box:nnV { #2 } { \kaishu } \g_@@_name_supv_ttl_tl
+    \@@_hskip:
     \@@_ulined_center_box:nn { #3 }
-      { \clist_item:cn { l_@@_info_ #1 _clist } { 2 } }
-    \@@_vskip:
+      { \clist_item:cn { g_@@_info_ #1 _clist } { 2 } }
+    \par
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2710,8 +2869,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_abs_title:n #1
   {
-    \@@_get_text_width:Nn \l_@@_tmp_dim {#1}
-    \@@_uuline:n { \l_@@_tmp_dim } #1
+    \@@_get_text_width:Nn \l_@@_tmpa_dim {#1}
+    \@@_uuline:n { \l_@@_tmpa_dim } #1
   }
 \cs_generate_variant:Nn \@@_abs_title:n { V }
 %    \end{macrocode}
@@ -2752,7 +2911,7 @@
 \cs_new_protected:Npn \@@_uline_list:nnn #1#2#3
   {
     \hbox_set:Nn \l_@@_tmp_box {#1}
-    \setbox0=\vbox{\hangindent=\wd\l_@@_tmp_box \hangafter=-1
+    \setbox0 = \vbox{\hangindent=\wd\l_@@_tmp_box \hangafter=-1
         \leftskip=#3 \rightskip=\leftskip \parindent=\z@ #2\par
         \global\setbox2=\hbox{}
         \int_gzero:N \l_@@_tmp_int
@@ -2794,7 +2953,13 @@
 %
 % 本模板使用 \pkg{xtemplate} 提供的面向对象方法简化封面和摘要的绘制过程。
 %
-% 以下分别从页面元素(element)和页面整体(page)的层次进行了抽象。当我们把页面部件考虑为一个对象时,它天然地只具备有限数量的属性:内容、格式、边距、对齐方式等。而具体的页面是这些对象的实例的集合,附加边距、行距等属性,创建页面只需传入一个列表调用各个 Instance 即可。通过 \pkg{xtemplate} 提供的功能,我们可以根据这些属性创建模板(template),进而能大量构建具有\emph{相似行为}的实例(instance)。这种做法能充分分离内容和样式,极大优化代码的可读性。
+% 以下分别从页面元素(element)和页面整体(page)的层次进行了抽象。
+% 当我们把页面部件考虑为一个对象时,它天然地只具备有限数量的属性:
+% 内容、格式、边距、对齐方式等。而具体的页面是这些对象的实例的集合,
+% 附加边距、行距等属性,创建页面只需传入一个列表调用各个 Instance
+% 即可。通过 \pkg{xtemplate} 提供的功能,我们可以根据这些属性创建模板
+% (template),进而能大量构建具有\emph{相似行为}的实例(instance)。
+% 这种做法能充分分离内容和样式,极大优化代码的可读性。
 %
 % 声明对象类型。此类对象不需要参数。
 %    \begin{macrocode}
@@ -2807,7 +2972,8 @@
 %    \end{macrocode}
 %
 % 声明页面元素模板接口。
-% 元素是一个页面的基本组成单位,包括文段、图片等等。一个抽象的元素应当具备以下属性:
+% 元素是一个页面的基本组成单位,包括文段、图片等等。
+% 一个抽象的元素应当具备以下属性:
 % \begin{description}
 %   \item[\opt{content}] 内容,即剥离样式的元素本身
 %   \item[\opt{format}] 格式,例如字号、字体
@@ -2962,9 +3128,10 @@
 % \changes{v0.13}{2021/12/15}{新增诚信承诺书选项。}
 % \changes{v0.14}{2022/01/06}{修改选项名称。}
 % 是否需要诚信承诺书或原创性声明(默认关闭)。
-% \footnote{原创性声明的英文翻译为 Declaration of Originality,为了使选项表义更清晰同时缩减名称长度,将其修改为“声明页”这一名称。}
+% \footnote{原创性声明的英文翻译为 Declaration of Originality,
+% 为了使选项表义更清晰同时缩减名称长度,将其修改为“声明页”这一名称。}
 %    \begin{macrocode}
-    decl-page        .bool_set:N  = \g_@@_orig_decl_bool,
+    decl-page        .bool_set:N  = \g_@@_decl_bool,
     decl-page         .initial:n  = false,
 %    \end{macrocode}
 % \end{macro}
@@ -3038,7 +3205,63 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\njusetformat}
+% \changes{v0.17}{2022/04/09}{提供修改默认样式的接口。}
+% 定义修改固定文本的接口。
+%    \begin{macrocode}
+\NewDocumentCommand \njusetformat { m m }
+  { \tl_gset:cn { g_@@_fmt_ #1 _tl } { #2 } }
+%    \end{macrocode}
+% \end{macro}
 %
+% \begin{macro}{\njusetlength,\njusetlength*}
+% \changes{v0.17}{2022/04/09}{提供修改长度值的接口。}
+% 定义修改长度值的接口。可选星号表示修改弹性长度。
+%    \begin{macrocode}
+\NewDocumentCommand \njusetlength { s m m }
+  {
+    \bool_if:nTF { #1 }
+      { \skip_gset:cn { g_@@_ #2 _skip } { #3 } }
+      { \dim_gset:cn  { g_@@_ #2 _dim  } { #3 } }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\njusetname,\njusetname*,\njusettext,\njusettext*}
+% \changes{v0.17}{2022/04/01}{提供修改固定文本的接口。}
+% 定义修改固定文本的接口。
+%    \begin{macrocode}
+\NewDocumentCommand \njusetname { s m o m }
+  { \@@_set_tokenlist:nnnnn {#1} {#2} {#3} {#4} { name } }
+\NewDocumentCommand \njusettext { s m o m }
+  { \@@_set_tokenlist:nnnnn {#1} {#2} {#3} {#4} { text } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_tokenlist:nnnnn}
+% 用于修改名称、文字常量的辅助函数。
+% \begin{arguments}
+%   \item 是否含有可选星号,传入 |bool| 型变量
+%   \item 被修改变量名称
+%   \item 可选的变体,用字母标记
+%   \item 修改后的内容
+%   \item 类别,name 或者 text
+% \end{arguments}
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_set_tokenlist:nnnnn #1#2#3#4#5
+  {
+    \tl_if_novalue:nTF { #3 }
+      { \tl_clear:N \l_@@_tmpa_tl          }
+      { \tl_set:Nn  \l_@@_tmpa_tl { _ #3 } }
+    \bool_if:nTF       { #1 }
+      { \tl_set:Nn  \l_@@_tmpb_tl { _en  } }
+      { \tl_clear:N \l_@@_tmpb_tl          }
+    \tl_gset:cn { g_@@_ #5 _ #2 \l_@@_tmpa_tl \l_@@_tmpb_tl _tl } {#4}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%
 % \subsection{载入宏包}
 %
 % \changes{v0.12}{2021/12/07}{重新组织宏包载入顺序。}
@@ -3163,6 +3386,14 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% 使用 \pkg{tabularray} 绘制研究生的出版授权书。
+%    \begin{macrocode}
+\bool_lazy_and:nnT
+  { \g_@@_decl_bool }
+  { !\int_compare_p:n { \g_@@_info_degree_int == 1 } }
+  { \RequirePackage { tabularray } }
+%    \end{macrocode}
+%
 % \begin{macro}{\@@_check_package:nnn}
 % 检查过时宏包。
 %    \begin{macrocode}
@@ -3233,9 +3464,9 @@
 % \changes{v0.14}{2022/01/14}{将标题断行控制符修改为 |\\|。}
 % 题目。中文题目可使用 |\\| 手动断行。以下标注星号(|*|)的皆为对应的英文字段。
 %    \begin{macrocode}
-    title               .tl_set:N = \l_@@_info_title_tl,
+    title               .tl_set:N = \g_@@_info_title_tl,
     title              .initial:n = { 空 },
-    title*              .tl_set:N = \l_@@_info_title_en_tl,
+    title*              .tl_set:N = \g_@@_info_title_en_tl,
     title*             .initial:n = { Empty },
 %    \end{macrocode}
 % \end{macro}
@@ -3244,8 +3475,8 @@
 % \changes{v0.11}{2021/10/01}{修改了添加关键词的方式。}
 % 关键词列表。
 %    \begin{macrocode}
-    keywords         .clist_set:N = \l_@@_info_keywords_clist,
-    keywords*        .clist_set:N = \l_@@_info_keywords_en_clist,
+    keywords         .clist_set:N = \g_@@_info_keywords_clist,
+    keywords*        .clist_set:N = \g_@@_info_keywords_en_clist,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3252,10 +3483,10 @@
 % \begin{macro}{info/grade,info/student-id,info/author,info/author*}
 % 年级、学号、姓名。
 %    \begin{macrocode}
-    grade               .tl_set:N = \l_@@_info_grade_tl,
-    student-id          .tl_set:N = \l_@@_info_id_tl,
-    author              .tl_set:N = \l_@@_info_author_tl,
-    author*             .tl_set:N = \l_@@_info_author_en_tl,
+    grade               .tl_set:N = \g_@@_info_grade_tl,
+    student-id          .tl_set:N = \g_@@_info_id_tl,
+    author              .tl_set:N = \g_@@_info_author_tl,
+    author*             .tl_set:N = \g_@@_info_author_en_tl,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3262,12 +3493,12 @@
 % \begin{macro}{info/department,info/department*,info/major,info/major*,info/field,info/field*}
 % 院系、专业、方向。
 %    \begin{macrocode}
-    department          .tl_set:N = \l_@@_info_dept_tl,
-    department*         .tl_set:N = \l_@@_info_dept_en_tl,
-    major               .tl_set:N = \l_@@_info_major_tl,
-    major*              .tl_set:N = \l_@@_info_major_en_tl,
-    field               .tl_set:N = \l_@@_info_field_tl,
-    field*              .tl_set:N = \l_@@_info_field_en_tl,
+    department          .tl_set:N = \g_@@_info_dept_tl,
+    department*         .tl_set:N = \g_@@_info_dept_en_tl,
+    major               .tl_set:N = \g_@@_info_major_tl,
+    major*              .tl_set:N = \g_@@_info_major_en_tl,
+    field               .tl_set:N = \g_@@_info_field_tl,
+    field*              .tl_set:N = \g_@@_info_field_en_tl,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3276,8 +3507,8 @@
 % \changes{v0.14}{2022/01/12}{精简导师信息选项。}
 % 导师信息。中文导师全称使用 |clist| 存储,便于在本科生封面中进行分割。
 %    \begin{macrocode}
-    supervisor       .clist_set:N = \l_@@_info_supv_clist,
-    supervisor*         .tl_set:N = \l_@@_info_supv_en_tl,
+    supervisor       .clist_set:N = \g_@@_info_supv_clist,
+    supervisor*         .tl_set:N = \g_@@_info_supv_en_tl,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3284,8 +3515,8 @@
 % \begin{macro}{info/supervisor-ii,info/supervisor-ii*}
 % 第二导师信息。
 %    \begin{macrocode}
-    supervisor-ii    .clist_set:N = \l_@@_info_supv_ii_clist,
-    supervisor-ii*      .tl_set:N = \l_@@_info_supv_ii_en_tl,
+    supervisor-ii    .clist_set:N = \g_@@_info_supv_ii_clist,
+    supervisor-ii*      .tl_set:N = \g_@@_info_supv_ii_en_tl,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3293,7 +3524,7 @@
 % \changes{v0.14}{2022/01/14}{精简提交日期选项。}
 % 提交日期,初始值为编译当天日期。
 %    \begin{macrocode}
-    submit-date         .tl_set:N = \l_@@_info_sm_date_raw_tl,
+    submit-date         .tl_set:N = \g_@@_info_submitdate_raw_tl,
     submit-date        .initial:V = \c_@@_today_tl,
 %    \end{macrocode}
 % \end{macro}
@@ -3302,7 +3533,7 @@
 % \changes{v0.14}{2022/01/14}{精简答辩日期选项。}
 % 答辩日期。
 %    \begin{macrocode}
-    defend-date         .tl_set:N = \l_@@_info_df_date_raw_tl,
+    defend-date         .tl_set:N = \g_@@_info_defenddate_raw_tl,
     defend-date        .initial:V = \c_@@_today_tl,
 %    \end{macrocode}
 % \end{macro}
@@ -3310,8 +3541,8 @@
 % \begin{macro}{info/defend-date,info/chairman,info/reviewer}
 % 答辩委员会信息。
 %    \begin{macrocode}
-    chairman            .tl_set:N = \l_@@_info_chairman_tl,
-    reviewer         .clist_set:N = \l_@@_info_reviewer_clist,
+    chairman            .tl_set:N = \g_@@_info_chairman_tl,
+    reviewer         .clist_set:N = \g_@@_info_reviewer_clist,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3318,10 +3549,18 @@
 % \begin{macro}{info/clc,info/secret-level,info/udc,info/supervisor-contact}
 % 国家图书馆封面相关信息。
 %    \begin{macrocode}
-    clc                 .tl_set:N = \l_@@_info_clc_tl,
-    secret-level        .tl_set:N = \l_@@_info_seclv_tl,
-    udc                 .tl_set:N = \l_@@_info_udc_tl,
-    supervisor-contact  .tl_set:N = \l_@@_info_supv_cont_tl,
+    clc                 .tl_set:N = \g_@@_info_clc_tl,
+    secret-level        .tl_set:N = \g_@@_info_secretlv_tl,
+    udc                 .tl_set:N = \g_@@_info_udc_tl,
+    supervisor-contact  .tl_set:N = \g_@@_info_supv_cont_tl,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{info/email}
+% \changes{v0.14}{2022/01/12}{新增电邮地址信息项。}
+% 用于学位论文出版授权书的电子邮件地址。
+%    \begin{macrocode}
+    email               .tl_set:N = \g_@@_info_email_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -3330,24 +3569,24 @@
 % 设置学位信息。该设置需要放在 \cs{ProcessKeysOptions}
 % 命令以及载入配置文件中的常量信息后进行。
 %    \begin{macrocode}
-\tl_set:Nx \l_@@_info_degree_tl
+\tl_set:Nx \g_@@_info_degree_tl
   {
-    \clist_item:Nn \c_@@_name_degree_clist
+    \clist_item:Nn \g_@@_name_degree_clist
       { \g_@@_info_degree_int }
   }
 \int_compare:nTF { \g_@@_info_degree_int == 1 }
-  { \tl_set:Nn \l_@@_info_diploma_tl { ug } }
-  { \tl_set:Nn \l_@@_info_diploma_tl { g  } }
+  { \tl_set:Nn \g_@@_info_diploma_tl { ug } }
+  { \tl_set:Nn \g_@@_info_diploma_tl { g  } }
 %    \end{macrocode}
 %
 % 设置类型信息。
 %    \begin{macrocode}
-\tl_set:Nx \l_@@_info_type_tl
-  { \clist_item:Nn \c_@@_name_type_clist    { \g_@@_info_type_int } }
-\tl_set:Nx \l_@@_info_type_en_tl
-  { \clist_item:Nn \c_@@_name_type_en_clist { \g_@@_info_type_int } }
-\tl_put_left:Nx \l_@@_info_type_tl
-  { \tl_use:c { c_@@_name_ \l_@@_info_diploma_tl _tl } }
+\tl_set:Nx \g_@@_info_type_tl
+  { \clist_item:Nn \g_@@_name_type_clist    { \g_@@_info_type_int } }
+\tl_set:Nx \g_@@_info_type_en_tl
+  { \clist_item:Nn \g_@@_name_type_en_clist { \g_@@_info_type_int } }
+\tl_put_left:Nx \g_@@_info_type_tl
+  { \tl_use:c { g_@@_name_ \g_@@_info_diploma_tl _tl } }
 %    \end{macrocode}
 %
 % \changes{v0.15}{2022/01/22}{正确处理双导师信息。}
@@ -3360,29 +3599,29 @@
 % 拼合双导师的姓名和职称。
 %    \begin{macrocode}
     \bool_set:Nn \l_@@_second_supv_bool
-      { ! \clist_if_empty_p:N \l_@@_info_supv_ii_clist }
-    \tl_set:Nx \l_@@_info_supv_full_tl
+      { ! \clist_if_empty_p:N \g_@@_info_supv_ii_clist }
+    \tl_set:Nx \g_@@_info_supvfull_tl
       {
-        \clist_use:Nn \l_@@_info_supv_clist { \@@_hskip: }
+        \clist_use:Nn \g_@@_info_supv_clist { \@@_hskip: }
         \bool_if:NT \l_@@_second_supv_bool
           {
             \@@_quad:
-            \clist_use:Nn \l_@@_info_supv_ii_clist { \@@_hskip: }
+            \clist_use:Nn \g_@@_info_supv_ii_clist { \@@_hskip: }
           }
       }
-    \tl_set:Nx \l_@@_info_supv_full_en_tl
+    \tl_set:Nx \g_@@_info_supvfull_en_tl
       {
-        \l_@@_info_supv_en_tl
+        \g_@@_info_supv_en_tl
         \bool_if:NT \l_@@_second_supv_bool
-          { \@@_quad: \l_@@_info_supv_ii_en_tl }
+          { \@@_quad: \g_@@_info_supv_ii_en_tl }
       }
 %    \end{macrocode}
 % 将 ISO 格式的原始日期字符串格式化为中文日期表示,该字符串需要进行展开。
 %    \begin{macrocode}
-    \tl_set:Nn \l_@@_info_sm_date_tl
+    \tl_set:Nn \g_@@_info_submitdate_tl
       {
         \exp_last_unbraced:NV
-          \@@_date:www \l_@@_info_sm_date_raw_tl \q_stop
+          \@@_date:www \g_@@_info_submitdate_raw_tl \q_stop
       }
 %    \end{macrocode}
 % 英文提交日期以及答辩日期仅用于研究生封面。
@@ -3389,15 +3628,15 @@
 %    \begin{macrocode}
     \int_compare:nF { \g_@@_info_degree_int == 1 }
       {
-        \tl_set:Nn \l_@@_info_sm_date_en_tl
+        \tl_set:Nn \g_@@_info_submitdate_en_tl
           {
             \exp_last_unbraced:NV
-              \@@_date_en:www \l_@@_info_sm_date_raw_tl \q_stop
+              \@@_date_en:www \g_@@_info_submitdate_raw_tl \q_stop
           }
-        \tl_set:Nn \l_@@_info_df_date_tl
+        \tl_set:Nn \g_@@_info_defenddate_tl
           {
             \exp_last_unbraced:NV
-              \@@_date:www \l_@@_info_df_date_raw_tl \q_stop
+              \@@_date:www \g_@@_info_defenddate_raw_tl \q_stop
           }
       }
   }
@@ -3866,9 +4105,9 @@
 % 对 \pkg{fancyhdr} 的命令进行包装,便于设置页眉页脚。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_header:nn #1#2
-  { \fancyhead [#1] { \g_@@_header_format_tl #2 } }
+  { \fancyhead [#1] { \g_@@_header_format_tl \nouppercase {#2} } }
 \cs_new_protected:Npn \@@_footer:nn #1#2
-  { \fancyfoot [#1] { \g_@@_footer_format_tl #2 } }
+  { \fancyfoot [#1] { \g_@@_footer_format_tl \nouppercase {#2} } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3947,18 +4186,11 @@
 %
 % \subsection{章节标题格式}
 %
-% \begin{macro}{\c_@@_sec_format_tl}
-% 各部分章节以及目录中章标题的格式。设置为四号、不加粗、黑体。
-%    \begin{macrocode}
-\tl_const:Nn \c_@@_sec_format_tl { \large \normalfont \sffamily }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\@@_add_tocline:n,\@@_add_tocline:V}
-% 添加目录条目。
+% 为无编号章添加目录条目,需手动指定格式为四号、不加粗、黑体。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_add_tocline:n #1
-  { \addcontentsline { toc } { chapter } { \c_@@_sec_format_tl #1 } }
+  { \addcontentsline { toc } { chapter } { \g_@@_fmt_chapterintoc_tl #1 } }
 \cs_generate_variant:Nn \@@_add_tocline:n { V }
 %    \end{macrocode}
 % \end{macro}
@@ -4002,10 +4234,10 @@
   {
     chapter        / beforeskip = 10 pt,
     chapter        / afterskip  = 60 pt,
-    chapter        / format     = \c_@@_sec_format_tl \centering,
-    section        / format     = \c_@@_sec_format_tl,
-    subsection     / format     = \c_@@_sec_format_tl,
-    subsubsection  / format     = \c_@@_sec_format_tl,
+    chapter        / format     = \g_@@_fmt_chapter_tl,
+    section        / format     = \g_@@_fmt_section_tl,
+    subsection     / format     = \g_@@_fmt_subsection_tl,
+    subsubsection  / format     = \g_@@_fmt_subsubsection_tl,
 %    \end{macrocode}
 %
 %
@@ -4014,13 +4246,13 @@
 %
 % 设置目录标题默认名称。
 %    \begin{macrocode}
-    contentsname   = { 目\hspace{2em}录 },
-    listfigurename = { 插图目录         },
-    listtablename  = { 表格目录         },
+    contentsname   = \g_@@_name_tableofcontents_tl,
+    listfigurename = \g_@@_name_listoffigures_tl,
+    listtablename  = \g_@@_name_listoftables_tl,
 %    \end{macrocode}
 % 设置目录中章标题的样式。
 %    \begin{macrocode}
-    chapter / tocline = \c_@@_sec_format_tl \CTEXnumberline { #1 } #2
+    chapter / tocline = \g_@@_fmt_chapterintoc_tl \CTEXnumberline { #1 } #2
   }
 %    \end{macrocode}
 %
@@ -4047,7 +4279,7 @@
   {
     \group_begin:
       \keys_set:nn { ctex }
-        { chapter/format = \centering \zihao { 3 } \bfseries }
+        { chapter/format = \g_@@_fmt_toctitle_tl }
       \bool_if:NTF \g_@@_toc_in_toc_bool
         { \@@_chapter:n { #1 } }
         {
@@ -4229,6 +4461,7 @@
 %
 % 在导言区末尾进行 \pkg{hyperref} 设置。
 % \changes{v0.11}{2021/10/01}{写入 PDF 元数据。}
+% \changes{v0.17}{2022/04/09}{PDF 书签中不生成额外空格。}
 %    \begin{macrocode}
 \ctex_at_end_preamble:n
   {
@@ -4236,7 +4469,11 @@
 % 忽略 PDF 字符串中的换行符,从而抑制 \pkg{hyperref} 警告。
 %    \begin{macrocode}
     \pdfstringdefDisableCommands
-      { \cs_set_eq:NN \\ \prg_do_nothing: }
+      {
+        \cs_set_eq:NN \\     \prg_do_nothing:
+        \cs_set_eq:NN \quad  \prg_do_nothing:
+        \cs_set_eq:NN \qquad \prg_do_nothing:
+      }
     \hypersetup
       {
         bookmarksnumbered = true,
@@ -4246,10 +4483,10 @@
 %    \end{macrocode}
 % 填写 PDF 元信息。
 %    \begin{macrocode}
-        pdftitle    = \l_@@_info_title_tl,
-        pdfauthor   = \l_@@_info_author_tl,
-        pdfkeywords = \l_@@_info_keywords_clist,
-        pdfcreator  = \c_@@_name_pdf_creator_tl
+        pdftitle    = \g_@@_info_title_tl,
+        pdfauthor   = \g_@@_info_author_tl,
+        pdfkeywords = \g_@@_info_keywords_clist,
+        pdfcreator  = \g_@@_name_pdfcreator_tl
       }
   }
 %    \end{macrocode}
@@ -4345,7 +4582,7 @@
 % \footnote{\url{https://tex.stackexchange.com/questions/567135/how-get-box-like-symbol-with-xelatex}}。
 %    \begin{macrocode}
 \theoremsymbol { \ensuremath { \mdwhtsquare } }
-\newtheorem* { proof } { \c_@@_name_proof_tl }
+\newtheorem* { proof } { \g_@@_name_proof_tl }
 %    \end{macrocode}
 %
 % 定义普通定理环境,需要排除 \env{proof}。
@@ -4397,7 +4634,7 @@
 \@@_declare_element:nn { cover / ug / title }
   {
     content  =
-      \@@_spread_box:nnV { 9 em } { \bf } \l_@@_info_type_tl,
+      \@@_spread_box:nnV { 9 em } { \bf } \g_@@_info_type_tl,
     format   = \zihao { -1 },
     bottom-skip = 0 pt plus 1.5 fill
   }
@@ -4410,33 +4647,34 @@
 \@@_declare_element:nn { cover / ug / info }
   {
     content  =
-      \@@_cover_info_ug:nnn { 4.2 em } { 16 em } { 5.5 em },
+      \@@_cover_info_ug:NN \g_@@_coverlabel_dim \g_@@_coveruline_dim,
     format   = \zihao { 3 }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_cover_info_ug:nnn}
+% \begin{macro}{\@@_cover_info_ug:NN}
 % 本科生封面信息栏。
 % \begin{arguments}
 %   \item 名称盒子宽度,|dim| 型变量
 %   \item 长内容盒子宽度,|dim| 型变量
-%   \item 短内容盒子宽度,|dim| 型变量
 % \end{arguments}
+% 短内容盒子的长度值是通过计算得到的。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cover_info_ug:nnn #1#2#3
+\cs_new_protected:Npn \@@_cover_info_ug:NN #1#2
   {
-    \begin{minipage} { #1 + #2 + 0.3 em }
-      \raggedleft
+    \begin{minipage} { #1 + #2 + \g_@@_smallhskip_dim }
+      \dim_set_eq:NN \baselineskip \g_@@_coverlineskip_dim
+      \dim_set:Nn \l_@@_tmpb_dim { .5 #2 - .5 #1 - \g_@@_smallhskip_dim }
       \@@_cover_entry:nnn { dept     } { #1 } { #2 }
       \@@_cover_entry:nnn { major    } { #1 } { #2 }
-      \@@_multiline_title:nnn  { \bf } { #1 } { #2 }
-      \@@_cover_bientry:nnnn { grade } { id } { #1 } { #3 }
+      \@@_cover_entry_title:nnn  { \bf } { #1 } { #2 }
+      \@@_cover_bientry:nnnn { grade } { id } { #1 } { \l_@@_tmpb_dim }
       \@@_cover_entry:nnn { author   } { #1 } { #2 }
-      \@@_cover_supv_entry:nnn { supv } { #1 } { #3 }
+      \@@_cover_entry_supv:nnn { supv } { #1 } { \l_@@_tmpb_dim }
       \bool_if:NT \l_@@_second_supv_bool
-        { \@@_cover_supv_entry:nnn { supv_ii } { #1 } { #3 } }
-      \@@_cover_entry:nnn { sm_date  } { #1 } { #2 }
+        { \@@_cover_entry_supv:nnn { supv_ii } { #1 } { \l_@@_tmpb_dim } }
+      \@@_cover_entry:nnn { submitdate  } { #1 } { #2 }
     \end{minipage}
   }
 %</definition-ug>
@@ -4476,7 +4714,7 @@
 \@@_declare_element:nn { cover / g / type }
   {
     content     =
-      \@@_spread_box:nnV { 9 em } { } \l_@@_info_type_tl,
+      \@@_spread_box:nnV { 9 em } { } \g_@@_info_type_tl,
     format      = \zihao { -1 } \bfseries,
     bottom-skip = 1 cm
   }
@@ -4488,7 +4726,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { cover / g / degree }
   {
-    content     = \c_@@_name_apply_tl,
+    content     = \g_@@_name_apply_tl,
     format      = \zihao { -1 } \bfseries,
     bottom-skip = 1 cm plus 1.5 fil
   }
@@ -4500,7 +4738,8 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { cover / g / info }
   {
-    content     = \@@_cover_info_g:nn { 6.2 em } { 18 em },
+    content     =
+      \@@_cover_info_g:NN \g_@@_coverlabel_dim \g_@@_coveruline_dim,
     bottom-skip = 0 pt plus 1.5 fil
   }
 %    \end{macrocode}
@@ -4510,11 +4749,11 @@
 % 研究封面日期实例。
 %    \begin{macrocode}
 \@@_declare_element:nn { cover / g / date }
-  { content = \l_@@_info_sm_date_tl }
+  { content = \g_@@_info_submitdate_tl }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_cover_info_g:nn}
+% \begin{macro}{\@@_cover_info_g:NN}
 % 研究生封面信息栏。
 % \begin{arguments}
 %   \item 名称盒子宽度,|dim| 型变量
@@ -4521,12 +4760,12 @@
 %   \item 内容盒子宽度,|dim| 型变量
 % \end{arguments}
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cover_info_g:nn #1#2
+\cs_new_protected:Npn \@@_cover_info_g:NN #1#2
   {
-    \begin{minipage} { #1 + #2 + 0.3 em }
-      \raggedleft
-      \@@_multiline_title:nnn { } { #1 } { #2 }
-      \clist_map_inline:nn { author, major, field, supv_full }
+    \begin{minipage} { #1 + #2 + \g_@@_smallhskip_dim }
+      \dim_set_eq:NN \baselineskip \g_@@_coverlineskip_dim
+      \@@_cover_entry_title:nnn { } { #1 } { #2 }
+      \clist_map_inline:nn { author, major, field, supvfull }
         { \@@_cover_entry:nnn { ##1 } { #1 } { #2 } }
     \end{minipage}
   }
@@ -4551,14 +4790,14 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_cover_back_g:
   {
-    \@@_spread_box:nnV { 6.2 em } { \kaishu } \c_@@_name_id_tl
-    { : \@@_quad: } \l_@@_info_id_tl
+    \@@_spread_box:nnV { 6.2 em } { \kaishu } \g_@@_name_id_tl
+    { : \@@_quad: } \g_@@_info_id_tl
     \@@_vskip:
-    \@@_spread_box:nnV { 6.2 em } { \kaishu } \c_@@_name_df_date_tl
-    { : \@@_quad: } \l_@@_info_df_date_tl
+    \@@_spread_box:nnV { 6.2 em } { \kaishu } \g_@@_name_defenddate_tl
+    { : \@@_quad: } \g_@@_info_defenddate_tl
     \@@_vskip:
-    \@@_spread_box:nnV { 6.2 em } { \kaishu } \c_@@_name_supv_full_tl
-    { : \@@_quad: } \skip_horizontal:n { 8 em } \c_@@_name_sign_tl
+    \@@_spread_box:nnV { 6.2 em } { \kaishu } \g_@@_name_supvfull_tl
+    { : \@@_quad: } \skip_horizontal:n { 8 em } \g_@@_name_sign_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4570,7 +4809,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { cover / g / en / title }
   {
-    content     = \l_@@_info_title_en_tl,
+    content     = \g_@@_info_title_en_tl,
     format      = \bf \sffamily \zihao { 2 },
     bottom-skip = 2 cm
   }
@@ -4585,11 +4824,11 @@
     content      =
       { by }
       \skip_vertical:N \c_zero_skip
-      \textbf { \sffamily \l_@@_info_author_en_tl }
+      \textbf { \sffamily \g_@@_info_author_en_tl }
       \skip_vertical:n { .5 cm }
       { Supervised~ by }
       \skip_vertical:N \c_zero_skip
-      \textsf { \l_@@_info_supv_full_en_tl },
+      \textsf { \g_@@_info_supvfull_en_tl },
     format      = \zihao { 4 },
     bottom-skip = 0 pt plus 1.2 fil
   }
@@ -4602,11 +4841,11 @@
 \@@_declare_element:nn { cover / g / en / middle }
   {
     content     =
-      \c_@@_cover_en_text_tl \@@_vskip:
-      \textsc { \clist_item:Nn \c_@@_name_degree_en_clist
+      \g_@@_text_cover_en_tl \@@_vskip:
+      \textsc { \clist_item:Nn \g_@@_name_degree_en_clist
                   { \g_@@_info_degree_int } }
       \@@_vskip: { in } \@@_vskip:
-      \l_@@_info_major_en_tl,
+      \g_@@_info_major_en_tl,
     bottom-skip = 2 cm
   }
 %    \end{macrocode}
@@ -4629,9 +4868,9 @@
 \@@_declare_element:nn { cover / g / en / bottom }
   {
     content =
-      \l_@@_info_dept_en_tl \skip_vertical:N \c_zero_skip
-      \c_@@_name_nju_en_tl  \skip_vertical:n { 1 cm }
-      \l_@@_info_sm_date_en_tl
+      \g_@@_info_dept_en_tl \skip_vertical:N \c_zero_skip
+      \g_@@_name_nju_en_tl  \skip_vertical:n { 1 cm }
+      \g_@@_info_submitdate_en_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4655,9 +4894,9 @@
 \@@_declare_element:nn { cover / nl / name }
   {
     content     =
-      \@@_spread_box:nnV { 6 em } { } \c_@@_name_title_tl,
+      \@@_spread_box:nnV { 6 em } { } \g_@@_name_title_tl,
     format      = \zihao { -0 },
-    bottom-skip = 0 pt plus 1.2 fil
+    bottom-skip = 0 pt plus 1 fil
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4669,7 +4908,7 @@
   {
     content     = \@@_cover_title_nl:,
     format      = \zihao { 1 },
-    bottom-skip = 1 cm
+    bottom-skip = 0 pt plus 1 fil
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4714,12 +4953,12 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_cover_top_nl:
   {
-    \@@_spread_box:nnV { 3.2 em } { } \c_@@_name_clc_tl   \@@_hskip:
-    \@@_ulined_center_box:nn { 9 em } { \l_@@_info_clc_tl   } \hfill
-    \@@_spread_box:nnV { 3.2 em } { } \c_@@_name_seclv_tl \@@_hskip:
-    \@@_ulined_center_box:nn { 9 em } { \l_@@_info_seclv_tl } \\
-    \@@_spread_box:nnV { 3.2 em } { } \c_@@_name_udc_tl   \@@_hskip:
-    \@@_ulined_center_box:nn { 9 em } { \l_@@_info_udc_tl   } \hfill \null
+    \@@_spread_box:nnV { 3.2 em } { } \g_@@_name_clc_tl   \@@_hskip:
+    \@@_ulined_center_box:nn { 9 em } { \g_@@_info_clc_tl      } \hfill
+    \@@_spread_box:nnV { 3.2 em } { } \g_@@_name_secretlv_tl \@@_hskip:
+    \@@_ulined_center_box:nn { 9 em } { \g_@@_info_secretlv_tl } \\
+    \@@_spread_box:nnV { 3.2 em } { } \g_@@_name_udc_tl   \@@_hskip:
+    \@@_ulined_center_box:nn { 9 em } { \g_@@_info_udc_tl      } \hfill \null
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4729,36 +4968,36 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_cover_title_nl:
   {
-    \@@_split_title:V \l_@@_info_title_tl
-    \@@_multiline_box:nnnn { \l_@@_tmp_int } \l_@@_tmp_clist { 3 } { 15 em }
+    \parbox [ b ] { 15 em } { \@@_uline_title: } \par
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } \c_@@_name_title_b_tl }
+    { \zihao { 4 } \g_@@_name_title_b_tl }
     \skip_vertical:N \c_zero_skip
-    \@@_ulined_center_box:nn { 4.5 em } { \l__nju_info_author_tl }
+    \@@_ulined_center_box:nn { 4.5 em } { \g_@@_info_author_tl }
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } { ( } \c_@@_name_author_tl { ) } }
+    { \zihao { 4 } { ( } \g_@@_name_author_tl { ) } }
   }
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{\@@_cover_info_nl:}
+% \changes{v0.17}{2022/04/09}{优化国家图书馆封面导师联系方式的输出格式。}
 % 国家图书馆封面信息栏。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_cover_info_nl:
   {
-    \tl_set:Nn \l_@@_info_supv_tl
-      { \clist_item:Nn \l_@@_info_supv_clist { 1 } }
-    \tl_set:Nn \l_@@_info_supv_ttl_tl
-      { \clist_item:Nn \l_@@_info_supv_clist { 2 } }
-    \@@_uline_entry:Nnnn   \l_@@_tmp_dim { supv_info } { supv   } { } \\
-    \@@_ulined_center_box:nn { \textwidth } { \@@_info:n { supv_ttl }
-    \@@_quad: \@@_info:n  { supv_cont } }                             \\
-    \@@_uline_bientry:Nnnn \l_@@_tmp_dim { degree   } { degree  } { }
-    \@@_uline_bientry:Nnnn \l_@@_tmp_dim { major_b  } { major   } { } \\
-    \@@_uline_bientry:Nnnn \l_@@_tmp_dim { sm_date  } { sm_date } { }
-    \@@_uline_bientry:Nnnn \l_@@_tmp_dim { df_date  } { df_date } { } \\
-    \@@_full_uline:Nn \l_@@_tmp_dim { \c_@@_name_confer_tl }
-    \@@_uline:n { \l_@@_tmp_dim }
+    \@@_uline_list:nnn { \g_@@_name_supvinfo_tl }
+      {
+        \clist_use:Nn \g_@@_info_supv_clist    { ~ }
+        \clist_use:Nn \g_@@_info_supv_ii_clist { ~ } ~
+        \g_@@_info_supv_cont_tl
+      }
+      { 1 em plus 1 fill }
+    \@@_uline_bientry:Nnnn \l_@@_tmpa_dim { degree      } { degree     } { }
+    \@@_uline_bientry:Nnnn \l_@@_tmpa_dim { major_b     } { major      } { } \\
+    \@@_uline_bientry:Nnnn \l_@@_tmpa_dim { submitdate  } { submitdate } { }
+    \@@_uline_bientry:Nnnn \l_@@_tmpa_dim { defenddate  } { defenddate } { } \\
+    \@@_full_uline:Nn      \l_@@_tmpa_dim { \g_@@_name_confer_tl }
+    \@@_uline:n          { \l_@@_tmpa_dim }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4772,8 +5011,142 @@
     \@@_ulined_center_box:nn { 9 em } { \@@_info:n { chairman } } \\
     \@@_name:n { reviewer } \@@_hskip:
     \@@_multiline_box:nnnn { \l_@@_tmp_int }
-      { \l_@@_info_reviewer_clist } { 4 } { 9 em }
+      { \g_@@_info_reviewer_clist } { 4 } { 9 em }
   }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subparagraph{出版授权书}
+%
+% \begin{macro}{authdecl/g/title}
+% 出版授权书标题实例。
+%    \begin{macrocode}
+\@@_declare_element:nn { authdecl / g / title }
+  {
+    content     = \g_@@_name_authdecl_tl,
+    format      = \g_@@_fmt_chapter_tl,
+    bottom-skip = 3 cm
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{authdecl/g/text}
+% 出版授权书文本实例。
+%    \begin{macrocode}
+\@@_declare_element:nn { authdecl / g / text }
+  {
+    content     = \g_@@_text_authdecl_tl,
+    align       = n,
+    bottom-skip = 2 cm
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{authdecl/g/sign}
+% 出版授权书签名区实例。
+%    \begin{macrocode}
+\@@_declare_element:nn { authdecl / g / sign }
+  {
+    content     = \@@_authdecl_sign_g:,
+    align       = r,
+    bottom-skip = 0pt plus 1 fill
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{authdecl/g/info}
+% 出版授权书信息表格实例。
+%    \begin{macrocode}
+\@@_declare_element:nn { authdecl / g / info }
+  {
+    content     = \@@_authdecl_info_g:,
+    format      = \zihao { 5 } ,
+    align       = l,
+    bottom-skip = 2 cm
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{authdecl/g/date}
+% 出版授权书保密信息实例。
+%    \begin{macrocode}
+\@@_declare_element:nn { authdecl / g / date }
+  {
+    content     = \@@_authdecl_secretlv_g:,
+    format      = \zihao { 5 } ,
+    align       = l
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_degree_checkbox:n}
+% 信息栏的学位复选框。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_degree_checkbox:n #1
+  {
+    \int_compare:nNnTF { #1 } { = } { \g_@@_info_degree_int }
+      {
+        \makebox [ 0   pt ] [l] { \ensuremath { \mdwhtsquare } }
+        \hspace  { 0.1 em }       \ensuremath { \checkmark   }
+      }
+      { \ensuremath { \mdwhtsquare } }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_authdecl_info_g:}
+% 信息栏内容。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_authdecl_info_g:
+  {
+    \begin{tblr}
+      {
+        hlines, vlines, hspan=minimal,
+        colspec = {cX[c]cX[c]cX[c]},
+        cell{1}{2} = {c=5}{m}, cell{3}{2} = {c=5}{m},
+        cell{4}{2} = {c=5}{m}, cell{5}{2} = {c=5}{m}
+      }
+      \g_@@_name_title_c_tl  & \g_@@_info_title_tl \\
+      \g_@@_name_id_a_tl     & \g_@@_info_id_tl    &
+      \g_@@_name_dept_a_tl   & \g_@@_info_dept_tl  &
+      \g_@@_name_year_tl     &
+        \tl_range:Nnn \g_@@_info_submitdate_raw_tl {1} {4} \\
+      \g_@@_name_degree_a_tl &
+        {
+          \@@_degree_checkbox:n { 2 } 学术学位硕士 \qquad{}
+          \@@_degree_checkbox:n { 3 } 专业学位硕士 \\
+          \@@_degree_checkbox:n { 4 } 学术学位博士 \qquad{}
+          \@@_degree_checkbox:n { 5 } 专业学位博士
+        } \\
+      \g_@@_name_email_tl    & \g_@@_info_email_tl \\
+      \g_@@_name_supv_b_tl   &
+        \clist_item:Nn \g_@@_info_supv_clist    {1}
+        \clist_item:Nn \g_@@_info_supv_ii_clist {1} \\
+    \end{tblr}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_authdecl_sign_g:}
+% 签名区内容。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_authdecl_sign_g:
+  {
+    \g_@@_name_authsign_tl \par
+    \g_@@_name_blankdate_tl
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_authdecl_secretlv_g:}
+% 保密信息内容。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_authdecl_secretlv_g:
+  {
+    \g_@@_name_secretstatus_tl \par
+    \ensuremath { \mdwhtsquare } \g_@@_name_secretfree_tl \par
+    \ensuremath { \mdwhtsquare } \g_@@_name_secretdate_tl
+  }
 %</definition-g>
 %    \end{macrocode}
 % \end{macro}
@@ -4849,6 +5222,19 @@
     prefix  = cover / nl /,
     format  = \kaishu
   }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{authdecl-g-default}
+% 默认出版授权书实例。
+%    \begin{macrocode}
+\@@_declare_page:nn { authdecl-g-default }
+  {
+    element     = { title, text, sign, info, date },
+    prefix      = authdecl / g /,
+    top-skip    = 1 cm,
+    bottom-skip = 0.5 cm plus 1.5 fill
+  }
 %</definition-g>
 %    \end{macrocode}
 % \end{macro}
@@ -4874,23 +5260,39 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_make_orig_decl: }
+% \begin{macro}{\@@_make_origdecl: }
 % \changes{v0.13}{2021/12/15}{加入本科生的诚信承诺书。}
-% 生成生成本科生的诚信承诺书或研究生的学位论文原创性声明。
+% 生成本科生的诚信承诺书或研究生的学位论文原创性声明。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_make_orig_decl:
+\cs_new_protected:Npn \@@_make_origdecl:
   {
-    \chapter* { \c_@@_name_orig_decl_tl }
+    \chapter* { \g_@@_name_origdecl_tl }
     \thispagestyle { empty }
-    \c_@@_orig_decl_text_tl
+    \g_@@_text_origdecl_tl
     \vfil
     \begin{flushright}
-%<definition-ug>      \clist_map_inline:nn { orig_sign, id, orig_date }
-%<definition-g>      \clist_map_inline:nn { orig_sign,     orig_date }
+%<definition-ug>      \clist_map_inline:nn { origsign, id, origdate }
+%<definition-g>      \clist_map_inline:nn { origsign,     origdate }
         { \@@_vskip: \@@_name:n { ##1 } : \@@_uline:n { 7 em } }
     \end{flushright}
     \vfil
   }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_make_authdecl: }
+% \changes{v0.17}{2022/04/04}{加入研究生的学位论文出版授权书。}
+% 生成研究生的学位论文出版授权书。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_make_authdecl:
+  {
+%<definition-ug>      \prg_do_nothing:
+%<*definition-g>
+    \thispagestyle{empty}
+    \UseInstance { nju } { authdecl-g-default }
+    \cleardoublepage
+%</definition-g>
+  }
 %</(definition-ug|definition-g)>
 %    \end{macrocode}
 % \end{macro}
@@ -4974,7 +5376,6 @@
   {
     \bool_if:NF \g_@@_draft_bool
       {
-        \pagestyle     { empty  }
         \pagenumbering { gobble }
 %    \end{macrocode}
 % 如果在研究生模板中选择了 \opt{nlcover},就生成用于申请学位的国家图书馆封面,
@@ -4983,16 +5384,25 @@
         \bool_if:NTF \g_@@_nlcover_bool
           { \@@_make_cover_nl: }
           { \@@_make_cover:    }
-%    \end{macrocode}
-% 如果在选择了 \opt{decl-page},就生成本科生的诚信承诺书或研究生的原创性声明。
-%    \begin{macrocode}
-        \bool_if:NT \g_@@_orig_decl_bool { \@@_make_orig_decl: }
       }
 %    \end{macrocode}
 % 生成封面后清除标题中的换行控制符,便于在摘要中输出。
 %    \begin{macrocode}
-    \tl_remove_all:Nn \l_@@_info_title_tl { \\ }
+    \tl_remove_all:Nn \g_@@_info_title_tl { \\ }
 %    \end{macrocode}
+% 如果在选择了 \opt{decl-page},就生成本科生的诚信承诺书,
+% 或研究生的原创性声明和出版授权书。
+%    \begin{macrocode}
+\bool_if:NF \g_@@_draft_bool
+  {
+    \bool_if:NT \g_@@_decl_bool
+      {
+        \@@_make_origdecl:
+        \AtEndEnvironment { document }
+          { \@@_make_authdecl: }
+      }
+  }
+%    \end{macrocode}
 % 在标题页后使用大写罗马字母页码,恢复正常字体设置。
 %    \begin{macrocode}
     \cleardoublepage
@@ -5016,7 +5426,7 @@
 %<*(definition-ug|definition-g)>
 \@@_declare_element:nn { abstract / title }
   {
-    content     = \@@_abs_title:V \c_@@_name_abstract_title_tl,
+    content     = \@@_abs_title:V \g_@@_name_abstracttitle_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 1.2 cm
   }
@@ -5044,7 +5454,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { abstract / en / title }
   {
-    content     = \@@_abs_title:V \c_@@_name_abstract_title_en_tl,
+    content     = \@@_abs_title:V \g_@@_name_abstracttitle_en_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 1.2 cm
   }
@@ -5086,17 +5496,17 @@
 % 确定标题类型。
 %    \begin{macrocode}
     \tl_if_blank:eTF { #1 }
-      { \c_@@_name_title_tl }
-      { \clist_item:Nn \c_@@_name_type_en_clist { \g_@@_info_type_int } }
-    #2 \tl_use:c { l_@@_info_title #1 _tl } \\
+      { \g_@@_name_title_tl }
+      { \clist_item:Nn \g_@@_name_type_en_clist { \g_@@_info_type_int } }
+    #2 \tl_use:c { g_@@_info_title #1 _tl } \\
 %    \end{macrocode}
 % 由于作者姓名使用的字样发生了变动,这里进行替换以便嵌入循环。
 %    \begin{macrocode}
-    \tl_set_eq:NN \c_@@_name_author_tl \c_@@_name_author_a_tl
+    \tl_set_eq:NN \g_@@_name_author_tl \g_@@_name_author_a_tl
 %    \end{macrocode}
 % 使用循环输出院系、专业、作者、导师信息。
 %    \begin{macrocode}
-    \clist_map_inline:nn { dept, major, author, supv_full }
+    \clist_map_inline:nn { dept, major, author, supvfull }
       { \@@_name:n { ##1 #1 } #2 \@@_info:n { ##1 #1 } \\ }
     \@@_name:n { abstract #1 } #2
   }
@@ -5112,7 +5522,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { abstract / mark }
   {
-    content     = \c_@@_name_abstract_b_tl,
+    content     = \g_@@_name_abstract_b_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
@@ -5124,7 +5534,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { abstract / en / mark }
   {
-    content     = \c_@@_name_abstract_b_en_tl,
+    content     = \g_@@_name_abstract_b_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
@@ -5143,29 +5553,29 @@
   {
     \@@_uline_list:xnn
       {
-        \clist_item:Nn \c_@@_name_type_clist { \g_@@_info_type_int }
-        \c_@@_name_title_a_tl #1
+        \clist_item:Nn \g_@@_name_type_clist { \g_@@_info_type_int }
+        \g_@@_name_title_a_tl #1
       }
-      { \l_@@_info_title_tl } { \g_@@_abs_title_left_skip }
+      { \g_@@_info_title_tl } { \g_@@_abs_title_left_skip }
 %    \end{macrocode}
 % 专业、年级、姓名。
 %    \begin{macrocode}
-    \@@_full_uline:NV \l_@@_tmp_dim
+    \@@_full_uline:NV \l_@@_tmpa_dim
       {
-        \@@_ulined_center_box:nn { 11 em } { \l_@@_info_major_tl }
-        \c_@@_name_major_a_tl
-        \@@_ulined_center_box:nn { 4  em } { \l_@@_info_grade_tl }
-        \c_@@_name_grade_tl \c_@@_name_author_a_tl #1
+        \@@_ulined_center_box:nn { 11 em } { \g_@@_info_major_tl }
+        \g_@@_name_major_a_tl
+        \@@_ulined_center_box:nn { 4  em } { \g_@@_info_grade_tl }
+        \g_@@_name_grade_tl \g_@@_name_author_a_tl #1
       }
-    \@@_ulined_center_box:nn { \l_@@_tmp_dim }
-      { \l_@@_info_author_tl } \\
+    \@@_ulined_center_box:nn { \l_@@_tmpa_dim }
+      { \g_@@_info_author_tl } \\
 %    \end{macrocode}
 % 导师姓名、职称。
 %    \begin{macrocode}
-    \@@_full_uline:NV \l_@@_tmp_dim
-      { \c_@@_name_supv_a_tl #1 }
-    \@@_ulined_center_box:nn { \l_@@_tmp_dim }
-      { \l_@@_info_supv_full_tl }
+    \@@_full_uline:NV \l_@@_tmpa_dim
+      { \g_@@_name_supv_a_tl #1 }
+    \@@_ulined_center_box:nn { \l_@@_tmpa_dim }
+      { \g_@@_info_supvfull_tl }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -5179,15 +5589,15 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_abs_info_en_g:n #1
   {
-    \@@_uline_list:xnn { \l_@@_info_type_en_tl #1 }
-        { \l_@@_info_title_en_tl } { \g_@@_abs_title_left_skip }
+    \@@_uline_list:xnn { \g_@@_info_type_en_tl #1 }
+        { \g_@@_info_title_en_tl } { \g_@@_abs_title_left_skip }
 %    \end{macrocode}
 % 使用循环输出专业、姓名、导师。注意这里将 |\\| 放置在前部,
 % 以避免末尾生成多余的换行符产生 |Underfull \vbox| 信息。
 %    \begin{macrocode}
-    \clist_map_inline:nn { major, author, supv_full }
+    \clist_map_inline:nn { major, author, supvfull }
       {
-        \@@_uline_entry:Nnnn \l_@@_tmp_dim
+        \@@_uline_entry:Nnnn \l_@@_tmpa_dim
           { ##1 _en } { ##1 _en } { #1 } \par
       }
   }
@@ -5208,24 +5618,24 @@
 %<*class>
 \cs_new_protected:Npn \@@_print_keywords:nn #1#2
   {
-    \tl_set:Nv \l_@@_tmp_tl { c_@@_name_keywords #1 _tl }
-    \@@_get_text_width:NV \l_@@_tmp_dim \l_@@_tmp_tl
+    \tl_set:Nv \l_@@_tmpa_tl { g_@@_name_keywords #1 _tl }
+    \@@_get_text_width:NV \l_@@_tmpa_dim \l_@@_tmpa_tl
 %    \end{macrocode}
 % 关键词列表的悬挂缩进样式由 \tn{list} 环境产生。
 %    \begin{macrocode}
-    \list { \l_@@_tmp_tl }
+    \list { \l_@@_tmpa_tl }
       {
-        \labelwidth  \l_@@_tmp_dim
+        \labelwidth  \l_@@_tmpa_dim
         \labelsep    \c_zero_dim
         \leftmargin  \c_zero_dim
         \rightmargin \c_zero_dim
-        \advance \leftmargin \l_@@_tmp_dim
+        \advance \leftmargin \l_@@_tmpa_dim
 %    \end{macrocode}
 % 使用粗体作为标签样式。
 %    \begin{macrocode}
         \cs_set_eq:NN \makelabel \textbf
       }
-    \item \clist_use:cn { l_@@_info_keywords #1 _clist } { #2 }
+    \item \clist_use:cn { g_@@_info_keywords #1 _clist } { #2 }
     \endlist
   }
 %</class>
@@ -5313,7 +5723,7 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \@@_abs_bookmark:Vn \c_@@_name_abstract_a_tl { abstract }
+    \@@_abs_bookmark:Vn \g_@@_name_abstract_a_tl { abstract }
     \@@_make_abstract:
     \group_begin: \kaishu \zihao { -4 } #1
   }
@@ -5328,7 +5738,7 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \@@_abs_bookmark:Vn \c_@@_name_abstract_a_en_tl { abstract-en }
+    \@@_abs_bookmark:Vn \g_@@_name_abstract_a_en_tl { abstract-en }
     \@@_make_abstract_en:
     \group_begin: \zihao { -4 } #1
   }
@@ -5344,9 +5754,9 @@
 % 单独制作的前言致谢页。
 %    \begin{macrocode}
 \NewDocumentEnvironment { preface         } { +b }
-  { \@@_chapter:V \c_@@_name_preface_tl         #1 } { }
+  { \@@_chapter:V \g_@@_name_preface_tl         #1 } { }
 \NewDocumentEnvironment { acknowledgement } { +b }
-  { \@@_chapter:V \c_@@_name_acknowledgement_tl #1 } { }
+  { \@@_chapter:V \g_@@_name_acknowledgement_tl #1 } { }
 %    \end{macrocode}
 % \end{environment}
 % \end{environment}
@@ -5360,7 +5770,7 @@
 % 成果列表。
 %    \begin{macrocode}
 \NewDocumentCommand \njupaperlist
-  { O { \c_@@_name_paperlist_tl } m }
+  { O { \g_@@_name_paperlist_tl } m }
   {
     \group_begin:
 %    \end{macrocode}
@@ -5404,7 +5814,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_make_notation:nn #1#2
   {
-    \dim_set:Nn \l_@@_tmp_dim { \textwidth - #1 - #2 }
+    \dim_set:Nn \l_@@_tmpa_dim { \textwidth - #1 - #2 }
     \list { }
       {
 %    \end{macrocode}
@@ -5419,7 +5829,7 @@
 % 右侧说明文字区域的宽度无法直接指定,而是靠计算左右边距 \tn{leftmargin} 和
 % \tn{rightmargin} 得到的。
 %    \begin{macrocode}
-        \leftmargin  .5\l_@@_tmp_dim
+        \leftmargin  .5\l_@@_tmpa_dim
         \rightmargin \leftmargin
         \advance \leftmargin #2
         \cs_set_eq:NN \makelabel \@@_notation_label:n
@@ -5438,7 +5848,7 @@
 %    \begin{macrocode}
 \NewDocumentEnvironment { notation } { O { 10 em } O { 5 em } }
   {
-    \@@_chapter:V \c_@@_name_notation_tl
+    \@@_chapter:V \g_@@_name_notation_tl
     \@@_make_notation:nn { #1 } { #2 }
   }
   { \endlist }
@@ -5450,7 +5860,7 @@
 %    \begin{macrocode}
 \NewDocumentEnvironment { notation* } { O { 10 em } O { 5 em } }
   {
-    \chapter * { \c_@@_name_notation_tl }
+    \chapter * { \g_@@_name_notation_tl }
     \@@_make_notation:nn { #1 } { #2 }
   }
   { \endlist }
@@ -5460,10 +5870,14 @@
 %
 %
 % \subsection{配置常量}
+% \label{subsec:constant-config}
 % \changes{v0.16}{2022/02/23}{将名称常量分离到 \file{.def} 文件。}
 %
-% 本节内容用于生成名称常量的默认定义,分为本科生和研究生模板两种。
+% 本节内容用于生成常量的默认定义,分为本科生和研究生模板两种。
 %
+% \subsubsection{名称}
+% \label{subsubsec:constant-name}
+%
 % 由于同一名称在不同位置具有不同变体,本模板使用字母后缀名进行了区分,
 % 并在易混淆处添加了注释。
 %
@@ -5472,13 +5886,16 @@
 %<*(definition-ug|definition-g)>
 \clist_map_inline:nn
   {
-    { acknowledgement } { 致\hspace{2em}谢              },
+    { acknowledgement } { 致 \qquad{} 谢                },
+    { tableofcontents } { 目 \qquad{} 录                },
     { id              } { 学号                          },
+    { listoffigures   } { 插图目录                      },
+    { listoftables    } { 表格目录                      },
     { notation        } { 符号表                        },
-    { orig_date       } { 日期                          },
+    { origdate        } { 日期                          },
     { paperlist       } { 发表文章目录                  },
-    { pdf_creator     } { LaTeX~ with~ njuthesis~ class },
-    { preface         } { 前\hspace{2em}言              },
+    { pdfcreator      } { LaTeX~ with~ njuthesis~ class },
+    { preface         } { 前 \qquad{} 言                },
     { supv_ii         } { 第二导师                      },
     { supv_ttl        } { 职称                          }
   }
@@ -5503,7 +5920,6 @@
     { table      } { 表         } { table               }
   }
   { \@@_define_name:nnn #1 }
-%</(definition-ug|definition-g)>
 %    \end{macrocode}
 %
 % 本科生模板默认名称。
@@ -5514,10 +5930,10 @@
     % 用于摘要的作者名称字样
     { author_a    } { 本科生姓名                         },
     { grade       } { 年级                               },
-    { orig_decl   }
-      { \c_@@_name_nju_tl 本科毕业论文(设计)诚信承诺书 },
-    { orig_sign   } { 作者签名                           },
-    { sm_date     } { 提交日期                           },
+    { origdecl    }
+      { \g_@@_name_nju_tl 本科毕业论文(设计)诚信承诺书 },
+    { origsign    } { 作者签名                           },
+    { submitdate  } { 提交日期                           },
     { supv        } { 导师                               },
     { title       } { 题目                               },
     { type        } { 本科生毕业论文(设计、作品)       },
@@ -5526,36 +5942,22 @@
   { \@@_define_name:nn #1 }
 \clist_map_inline:nn
   {
-    { abstract_title }
+    { abstracttitle }
       {
-        \c_@@_name_nju_tl  \c_@@_name_type_tl
-        \c_@@_name_lang_tl \c_@@_name_abstract_tl
+        \g_@@_name_nju_tl  \g_@@_name_type_tl
+        \g_@@_name_lang_tl \g_@@_name_abstract_tl
       }
       {
-        \c_@@_name_nju_tl     \c_@@_name_type_tl
-        \c_@@_name_lang_en_tl \c_@@_name_abstract_tl
+        \g_@@_name_nju_tl     \g_@@_name_type_tl
+        \g_@@_name_lang_en_tl \g_@@_name_abstract_tl
       },
     { author    } { 学生姓名               } { UNDERGRADUATE  },
     { major     } { 专业                   } { SPECIALIZATION },
-    { supv_full } { 指导教师(姓名、职称) } { MENTOR         }
+    { supvfull  } { 指导教师(姓名、职称) } { MENTOR         }
   }
   { \@@_define_name:nnn #1 }
-%    \end{macrocode}
-%
-% \begin{variable}{\c_@@_orig_decl_text_tl}
-% 学位论文诚信承诺书。
-%    \begin{macrocode}
-\tl_const:Nn \c_@@_orig_decl_text_tl
-  {
-    本人郑重承诺:所呈交的毕业论文(设计)(题目:)是在指导教师的指导下
-    严格按照学校和院系有关规定由本人独立完成的。本毕业论文(设计)中引用
-    他人观点及参考资源的内容均已标注引用,如出现侵犯他人知识产权的行为,
-    由本人承担相应法律责任。本人承诺不存在抄袭、伪造、篡改、代写、买卖毕
-    业论文(设计)等违纪行为。
-  }
 %</definition-ug>
 %    \end{macrocode}
-% \end{variable}
 %
 % 研究生模板默认名称。
 %    \begin{macrocode}
@@ -5562,34 +5964,50 @@
 %<*definition-g>
 \clist_map_inline:nn
   {
+    { apply        } {(申请 \g_@@_info_degree_tl 学位)},
+    { authdecl     } { 学位论文出版授权书               },
+    { author_a     }
+      { \tl_item:Nn \g_@@_info_degree_tl { 1 } 士生姓名 },
+    { authsign     } { 作者签名:\njuline{\hspace{6em}} },
+    { blankdate    } { \njuline{\qquad\qquad} 年
+                \njuline{\qquad} 月 \njuline{\qquad} 日 },
     % 用于摘要的作者名称字样
-    { author_a     }
-      { \tl_item:Nn \l_@@_info_degree_tl { 1 } 士生姓名 },
     { chairman     } { 答辩委员会主席:                 },
     { clc          } { 分类号                           },
     { confer       } { 学位授予单位和日期               },
-    { df_date      } { 论文答辩日期                     },
+    { defenddate   } { 论文答辩日期                     },
     { degree       } { 申请学位级别                     },
-    { apply        }
-      { (申请 \l_@@_info_degree_tl 学位)              },
+    % 用于出版授权书的学位名称字样
+    { degree_a     } { 论文级别                         },
+    % 用于出版授权书的院系名称字样
+    { dept_a       } { 所在院系                         },
+    { email        } { 作者 Email                       },
     { field        } { 研究方向                         },
     { g            } { 研究生                           },
     { grade        } { 级                               },
+    % 用于出版授权书的学号名称字样
+    { id_a         } { 研究生学号                       },
     % 用于摘要的专业名称字样
     { major_a      } { 专业                             },
     % 用于国家图书馆封面的专业名称字样
     { major_b      } { 专业名称                         },
-    { orig_decl    }
-      { \c_@@_name_nju_tl 学位论文原创性声明            },
-    { orig_sign    } { 研究生签名                       },
+    { origdecl     } { 南京大学学位论文原创性声明       },
+    { origsign     } { 研究生签名                       },
     { reviewer     } { 评阅人:                         },
-    { seclv        } { 密级                             },
+    { secretlv     } { 密级                             },
+    { secretstatus } { 论文涉密情况:                   },
+    { secretfree   } { 不保密                           },
+    { secretdate   }
+      { 保密,保密期( \g_@@_name_blankdate_tl 至
+                       \g_@@_name_blankdate_tl )       },
     { sign         } { (签字)                         },
-    { sm_date      } { 论文提交日期                     },
+    { submitdate   } { 论文提交日期                     },
     { supv         } { 导师                             },
     % 用于摘要的导师名称字样
     { supv_a       } { 指导教师(姓名、职称)           },
-    { supv_info    }
+    % 用于出版授权书的导师名称字样
+    { supv_b       } { 导师姓名                         },
+    { supvinfo     }
       { 指导教师姓名、职务、职称、学位、单位名称及地址  },
     % 用于普通封面的标题名称字样
     { title        } { 论文题目                         },
@@ -5596,52 +6014,87 @@
     % 用于摘要的标题名称字样
     { title_a      } { 题目                             },
     % 用于国家图书馆封面的标题名称字样
-    { title_b      } { (题名和副题名)                },
-    { udc          } { U D C                           }
+    { title_b      } { (题名和副题名)                 },
+    % 用于出版授权书的标题名称字样
+    { title_c      } { 论文题名                         },
+    { udc          } { U D C                            },
+    { year         } { 学位年度                         }
   }
   { \@@_define_name:nn #1 }
 \clist_map_inline:nn
   {
-    { abstract_title }
-      { 南京大学 \l_@@_info_type_tl 中文摘要首页用纸 }
-      { 南京大学 \l_@@_info_type_tl 英文摘要首页用纸 },
+    { abstracttitle }
+      { 南京大学 \g_@@_info_type_tl 中文摘要首页用纸 }
+      { 南京大学 \g_@@_info_type_tl 英文摘要首页用纸 },
     { author    } { 作者姓名 } { POSTGRADUATE        },
     { major     } { 专业方向 } { SPECIALIZATION      },
-    { supv_full } { 指导教师 } { MENTOR              }
+    { supvfull  } { 指导教师 } { MENTOR              }
   }
   { \@@_define_name:nnn #1 }
+%</definition-g>
 %    \end{macrocode}
 %
-% \begin{variable}{\c_@@_cover_en_text_tl}
-% 英文封面字样。
-%    \begin{macrocode}
-\tl_const:Nn \c_@@_cover_en_text_tl
-  {
-    A~ dissertation~ submitted~ to \\
-    the~ graduate~ school~ of~ Nanjing~ University \\
-    in~ partial~ fulfilment~ of~ the~ requirements~ for~ the~ degree~ of
-  }
-%    \end{macrocode}
-% \end{variable}
+% \subsubsection{文本}
+% \label{subsubsec:constant-text}
 %
-% \begin{variable}{\c_@@_orig_decl_text_tl}
-% 学位论文原创性声明。
+% \begin{variable}{\g_@@_text_origdecl_tl}
+% 本科生的学位论文诚信承诺书,或研究生的学位论文原创性声明。
 %    \begin{macrocode}
-\tl_const:Nn \c_@@_orig_decl_text_tl
+\tl_const:Nn \g_@@_text_origdecl_tl
   {
+%<*definition-ug>
+    本人郑重承诺:所呈交的毕业论文(设计)(题目: \g_@@_info_title_tl )
+    是在指导教师的指导下严格按照学校和院系有关规定由本人独立完成的。
+    本毕业论文(设计)中引用他人观点及参考资源的内容均已标注引用,
+    如出现侵犯他人知识产权的行为,由本人承担相应法律责任。
+    本人承诺不存在抄袭、伪造、篡改、代写、买卖毕业论文(设计)等违纪行为。
+%</definition-ug>
+%<*definition-g>
     本人郑重声明,所提交的学位论文是本人在导师指导下独立进行科学研究工作
     所取得的成果。除本论文中已经注明引用的内容外,本论文不包含其他个人或
     集体已经发表或撰写过的研究成果,也不包含为获得南京大学或其他教育机构
     的学位证书而使用过的材料。对本文的研究做出重要贡献的个人和集体,均已
     在论文的致谢部分明确标明。本人郑重申明愿承担本声明的法律责任。
+%</definition-g>
   }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_text_authdecl_tl}
+% 研究生的学位论文出版授权书。
+%    \begin{macrocode}
+%<*definition-g>
+\tl_gset:Nn \g_@@_text_authdecl_tl
+  {
+    本人完全同意《中国优秀博硕士学位论文全文数据库出版章程》
+    (以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊
+    (光盘版)电子杂志社”在《中国博士学位论文全文数据库》、
+    《中国优秀硕士学位论文全文数据库》中全文发表。《中国博士
+    学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》
+    可以以电子、网络及其他数字媒体形式公开出版,并同意编入
+    《中国知识资源总库》,在《中国博硕士学位论文评价数据库》
+    中使用和在互联网上传播,同意按“章程”规定享受相关权益。
+  }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_text_cover_en_tl}
+% 研究生的英文封面字样。
+%    \begin{macrocode}
+\tl_gset:Nn \g_@@_text_cover_en_tl
+  {
+    A~ dissertation~ submitted~ to \\
+    the~ graduate~ school~ of~ Nanjing~ University \\
+    in~ partial~ fulfilment~ of~ the~ requirements~ for~ the~ degree~ of
+  }
 %</definition-g>
 %    \end{macrocode}
 % \end{variable}
 %
+% \subsubsection{定理}
+%
 % 默认定理类型和头名称。
 %    \begin{macrocode}
-%<*(definition-ug|definition-g)>
 \clist_map_inline:nn
   {
     { axiom      } { 公理 } { Axiom      },
@@ -5653,6 +6106,42 @@
     { theorem    } { 定理 } { Theorem    }
   }
   { \@@_add_theorem_type:nnn #1 }
+%    \end{macrocode}
+%
+% \subsubsection{长度}
+% \label{subsubsec:constant-length}
+%
+% \changes{v0.17}{2022/04/09}{将长度值分离到 \file{.def} 文件。}
+% 默认长度值。
+%    \begin{macrocode}
+\clist_map_inline:nn
+  {
+%<definition-ug>    { coverlabel    } { 68  pt },
+%<definition-g>    { coverlabel    } { 100 pt },
+    { coverlineskip } { 40  pt },
+    { coveruline    } { 270 pt },
+    { smallhskip    } { 5   pt },
+    { smallvskip    } { 1   ex }
+  }
+  { \@@_define_dim:nn #1 }
+%    \end{macrocode}
+%
+% \subsubsection{样式}
+% \label{subsubsec:constant-format}
+%
+% \changes{v0.17}{2022/04/09}{将样式定义分离到 \file{.def} 文件。}
+% 默认样式。
+%    \begin{macrocode}
+\clist_map_inline:nn
+  {
+    { chapterintoc  } { \large \normalfont \sffamily            },
+    { chapter       } { \large \normalfont \sffamily \centering },
+    { section       } { \large \normalfont \sffamily            },
+    { subsection    } { \large \normalfont \sffamily            },
+    { subsubsection } { \large \normalfont \sffamily            },
+    { toctitle      } { \centering \zihao { 3 } \bfseries       }
+  }
+  { \@@_define_fmt:nn #1 }
 %</(definition-ug|definition-g)>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.ins	2022-04-10 20:03:48 UTC (rev 62994)
+++ trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.ins	2022-04-10 20:45:18 UTC (rev 62995)
@@ -78,13 +78,13 @@
 \endbatchfile
 \__nju_declare_element:nn { abstract / mark }
   {
-    content     = \c__nju_name_abstract_b_tl,
+    content     = \g__nju_name_abstract_b_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
 \__nju_declare_element:nn { abstract / en / mark }
   {
-    content     = \c__nju_name_abstract_b_en_tl,
+    content     = \g__nju_name_abstract_b_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def	2022-04-10 20:03:48 UTC (rev 62994)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def	2022-04-10 20:45:18 UTC (rev 62995)
@@ -23,7 +23,7 @@
 %% To produce the documentation run the original source files ending with
 %% `.dtx' through XeTeX.
 %% 
-\GetIdInfo $Id: njuthesis.dtx 0.16.1 2022-03-27 13:00:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
+\GetIdInfo $Id: njuthesis.dtx 0.17.0 2022-04-09 16:30:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Graduate definition file for njuthesis}
 \ProvidesExplFile{njuthesis-graduate.def}
   {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
@@ -41,29 +41,30 @@
 \__nju_declare_element:nn { cover / g / type }
   {
     content     =
-      \__nju_spread_box:nnV { 9 em } { } \l__nju_info_type_tl,
+      \__nju_spread_box:nnV { 9 em } { } \g__nju_info_type_tl,
     format      = \zihao { -1 } \bfseries,
     bottom-skip = 1 cm
   }
 \__nju_declare_element:nn { cover / g / degree }
   {
-    content     = \c__nju_name_apply_tl,
+    content     = \g__nju_name_apply_tl,
     format      = \zihao { -1 } \bfseries,
     bottom-skip = 1 cm plus 1.5 fil
   }
 \__nju_declare_element:nn { cover / g / info }
   {
-    content     = \__nju_cover_info_g:nn { 6.2 em } { 18 em },
+    content     =
+      \__nju_cover_info_g:NN \g__nju_coverlabel_dim \g__nju_coveruline_dim,
     bottom-skip = 0 pt plus 1.5 fil
   }
 \__nju_declare_element:nn { cover / g / date }
-  { content = \l__nju_info_sm_date_tl }
-\cs_new_protected:Npn \__nju_cover_info_g:nn #1#2
+  { content = \g__nju_info_submitdate_tl }
+\cs_new_protected:Npn \__nju_cover_info_g:NN #1#2
   {
-    \begin{minipage} { #1 + #2 + 0.3 em }
-      \raggedleft
-      \__nju_multiline_title:nnn { } { #1 } { #2 }
-      \clist_map_inline:nn { author, major, field, supv_full }
+    \begin{minipage} { #1 + #2 + \g__nju_smallhskip_dim }
+      \dim_set_eq:NN \baselineskip \g__nju_coverlineskip_dim
+      \__nju_cover_entry_title:nnn { } { #1 } { #2 }
+      \clist_map_inline:nn { author, major, field, supvfull }
         { \__nju_cover_entry:nnn { ##1 } { #1 } { #2 } }
     \end{minipage}
   }
@@ -74,18 +75,18 @@
   }
 \cs_new_protected:Npn \__nju_cover_back_g:
   {
-    \__nju_spread_box:nnV { 6.2 em } { \kaishu } \c__nju_name_id_tl
-    { : \__nju_quad: } \l__nju_info_id_tl
+    \__nju_spread_box:nnV { 6.2 em } { \kaishu } \g__nju_name_id_tl
+    { : \__nju_quad: } \g__nju_info_id_tl
     \__nju_vskip:
-    \__nju_spread_box:nnV { 6.2 em } { \kaishu } \c__nju_name_df_date_tl
-    { : \__nju_quad: } \l__nju_info_df_date_tl
+    \__nju_spread_box:nnV { 6.2 em } { \kaishu } \g__nju_name_defenddate_tl
+    { : \__nju_quad: } \g__nju_info_defenddate_tl
     \__nju_vskip:
-    \__nju_spread_box:nnV { 6.2 em } { \kaishu } \c__nju_name_supv_full_tl
-    { : \__nju_quad: } \skip_horizontal:n { 8 em } \c__nju_name_sign_tl
+    \__nju_spread_box:nnV { 6.2 em } { \kaishu } \g__nju_name_supvfull_tl
+    { : \__nju_quad: } \skip_horizontal:n { 8 em } \g__nju_name_sign_tl
   }
 \__nju_declare_element:nn { cover / g / en / title }
   {
-    content     = \l__nju_info_title_en_tl,
+    content     = \g__nju_info_title_en_tl,
     format      = \bf \sffamily \zihao { 2 },
     bottom-skip = 2 cm
   }
@@ -94,11 +95,11 @@
     content      =
       { by }
       \skip_vertical:N \c_zero_skip
-      \textbf { \sffamily \l__nju_info_author_en_tl }
+      \textbf { \sffamily \g__nju_info_author_en_tl }
       \skip_vertical:n { .5 cm }
       { Supervised~ by }
       \skip_vertical:N \c_zero_skip
-      \textsf { \l__nju_info_supv_full_en_tl },
+      \textsf { \g__nju_info_supvfull_en_tl },
     format      = \zihao { 4 },
     bottom-skip = 0 pt plus 1.2 fil
   }
@@ -105,11 +106,11 @@
 \__nju_declare_element:nn { cover / g / en / middle }
   {
     content     =
-      \c__nju_cover_en_text_tl \__nju_vskip:
-      \textsc { \clist_item:Nn \c__nju_name_degree_en_clist
+      \g__nju_text_cover_en_tl \__nju_vskip:
+      \textsc { \clist_item:Nn \g__nju_name_degree_en_clist
                   { \g__nju_info_degree_int } }
       \__nju_vskip: { in } \__nju_vskip:
-      \l__nju_info_major_en_tl,
+      \g__nju_info_major_en_tl,
     bottom-skip = 2 cm
   }
 \__nju_declare_element:nn { cover / g / en / emblem-img }
@@ -120,9 +121,9 @@
 \__nju_declare_element:nn { cover / g / en / bottom }
   {
     content =
-      \l__nju_info_dept_en_tl \skip_vertical:N \c_zero_skip
-      \c__nju_name_nju_en_tl  \skip_vertical:n { 1 cm }
-      \l__nju_info_sm_date_en_tl
+      \g__nju_info_dept_en_tl \skip_vertical:N \c_zero_skip
+      \g__nju_name_nju_en_tl  \skip_vertical:n { 1 cm }
+      \g__nju_info_submitdate_en_tl
   }
 \__nju_declare_element:nn { cover / nl / top }
   {
@@ -132,15 +133,15 @@
 \__nju_declare_element:nn { cover / nl / name }
   {
     content     =
-      \__nju_spread_box:nnV { 6 em } { } \c__nju_name_title_tl,
+      \__nju_spread_box:nnV { 6 em } { } \g__nju_name_title_tl,
     format      = \zihao { -0 },
-    bottom-skip = 0 pt plus 1.2 fil
+    bottom-skip = 0 pt plus 1 fil
   }
 \__nju_declare_element:nn { cover / nl / title }
   {
     content     = \__nju_cover_title_nl:,
     format      = \zihao { 1 },
-    bottom-skip = 1 cm
+    bottom-skip = 0 pt plus 1 fil
   }
 \__nju_declare_element:nn { cover / nl / middle }
   {
@@ -161,39 +162,38 @@
   }
 \cs_new_protected:Npn \__nju_cover_top_nl:
   {
-    \__nju_spread_box:nnV { 3.2 em } { } \c__nju_name_clc_tl   \__nju_hskip:
-    \__nju_ulined_center_box:nn { 9 em } { \l__nju_info_clc_tl   } \hfill
-    \__nju_spread_box:nnV { 3.2 em } { } \c__nju_name_seclv_tl \__nju_hskip:
-    \__nju_ulined_center_box:nn { 9 em } { \l__nju_info_seclv_tl } \\
-    \__nju_spread_box:nnV { 3.2 em } { } \c__nju_name_udc_tl   \__nju_hskip:
-    \__nju_ulined_center_box:nn { 9 em } { \l__nju_info_udc_tl   } \hfill \null
+    \__nju_spread_box:nnV { 3.2 em } { } \g__nju_name_clc_tl   \__nju_hskip:
+    \__nju_ulined_center_box:nn { 9 em } { \g__nju_info_clc_tl      } \hfill
+    \__nju_spread_box:nnV { 3.2 em } { } \g__nju_name_secretlv_tl \__nju_hskip:
+    \__nju_ulined_center_box:nn { 9 em } { \g__nju_info_secretlv_tl } \\
+    \__nju_spread_box:nnV { 3.2 em } { } \g__nju_name_udc_tl   \__nju_hskip:
+    \__nju_ulined_center_box:nn { 9 em } { \g__nju_info_udc_tl      } \hfill \null
   }
 \cs_new_protected:Npn \__nju_cover_title_nl:
   {
-    \__nju_split_title:V \l__nju_info_title_tl
-    \__nju_multiline_box:nnnn { \l__nju_tmp_int } \l__nju_tmp_clist { 3 } { 15 em }
+    \parbox [ b ] { 15 em } { \__nju_uline_title: } \par
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } \c__nju_name_title_b_tl }
+    { \zihao { 4 } \g__nju_name_title_b_tl }
     \skip_vertical:N \c_zero_skip
-    \__nju_ulined_center_box:nn { 4.5 em } { \l__nju_info_author_tl }
+    \__nju_ulined_center_box:nn { 4.5 em } { \g__nju_info_author_tl }
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } { ( } \c__nju_name_author_tl { ) } }
+    { \zihao { 4 } { ( } \g__nju_name_author_tl { ) } }
   }
 \cs_new_protected:Npn \__nju_cover_info_nl:
   {
-    \tl_set:Nn \l__nju_info_supv_tl
-      { \clist_item:Nn \l__nju_info_supv_clist { 1 } }
-    \tl_set:Nn \l__nju_info_supv_ttl_tl
-      { \clist_item:Nn \l__nju_info_supv_clist { 2 } }
-    \__nju_uline_entry:Nnnn   \l__nju_tmp_dim { supv_info } { supv   } { } \\
-    \__nju_ulined_center_box:nn { \textwidth } { \__nju_info:n { supv_ttl }
-    \__nju_quad: \__nju_info:n  { supv_cont } }                             \\
-    \__nju_uline_bientry:Nnnn \l__nju_tmp_dim { degree   } { degree  } { }
-    \__nju_uline_bientry:Nnnn \l__nju_tmp_dim { major_b  } { major   } { } \\
-    \__nju_uline_bientry:Nnnn \l__nju_tmp_dim { sm_date  } { sm_date } { }
-    \__nju_uline_bientry:Nnnn \l__nju_tmp_dim { df_date  } { df_date } { } \\
-    \__nju_full_uline:Nn \l__nju_tmp_dim { \c__nju_name_confer_tl }
-    \__nju_uline:n { \l__nju_tmp_dim }
+    \__nju_uline_list:nnn { \g__nju_name_supvinfo_tl }
+      {
+        \clist_use:Nn \g__nju_info_supv_clist    { ~ }
+        \clist_use:Nn \g__nju_info_supv_ii_clist { ~ } ~
+        \g__nju_info_supv_cont_tl
+      }
+      { 1 em plus 1 fill }
+    \__nju_uline_bientry:Nnnn \l__nju_tmpa_dim { degree      } { degree     } { }
+    \__nju_uline_bientry:Nnnn \l__nju_tmpa_dim { major_b     } { major      } { } \\
+    \__nju_uline_bientry:Nnnn \l__nju_tmpa_dim { submitdate  } { submitdate } { }
+    \__nju_uline_bientry:Nnnn \l__nju_tmpa_dim { defenddate  } { defenddate } { } \\
+    \__nju_full_uline:Nn      \l__nju_tmpa_dim { \g__nju_name_confer_tl }
+    \__nju_uline:n          { \l__nju_tmpa_dim }
   }
 \cs_new_protected:Npn \__nju_cover_bottom_nl:
   {
@@ -201,8 +201,86 @@
     \__nju_ulined_center_box:nn { 9 em } { \__nju_info:n { chairman } } \\
     \__nju_name:n { reviewer } \__nju_hskip:
     \__nju_multiline_box:nnnn { \l__nju_tmp_int }
-      { \l__nju_info_reviewer_clist } { 4 } { 9 em }
+      { \g__nju_info_reviewer_clist } { 4 } { 9 em }
   }
+\__nju_declare_element:nn { authdecl / g / title }
+  {
+    content     = \g__nju_name_authdecl_tl,
+    format      = \g__nju_fmt_chapter_tl,
+    bottom-skip = 3 cm
+  }
+\__nju_declare_element:nn { authdecl / g / text }
+  {
+    content     = \g__nju_text_authdecl_tl,
+    align       = n,
+    bottom-skip = 2 cm
+  }
+\__nju_declare_element:nn { authdecl / g / sign }
+  {
+    content     = \__nju_authdecl_sign_g:,
+    align       = r,
+    bottom-skip = 0pt plus 1 fill
+  }
+\__nju_declare_element:nn { authdecl / g / info }
+  {
+    content     = \__nju_authdecl_info_g:,
+    format      = \zihao { 5 } ,
+    align       = l,
+    bottom-skip = 2 cm
+  }
+\__nju_declare_element:nn { authdecl / g / date }
+  {
+    content     = \__nju_authdecl_secretlv_g:,
+    format      = \zihao { 5 } ,
+    align       = l
+  }
+\cs_new_protected:Npn \__nju_degree_checkbox:n #1
+  {
+    \int_compare:nNnTF { #1 } { = } { \g__nju_info_degree_int }
+      {
+        \makebox [ 0   pt ] [l] { \ensuremath { \mdwhtsquare } }
+        \hspace  { 0.1 em }       \ensuremath { \checkmark   }
+      }
+      { \ensuremath { \mdwhtsquare } }
+  }
+\cs_new_protected:Npn \__nju_authdecl_info_g:
+  {
+    \begin{tblr}
+      {
+        hlines, vlines, hspan=minimal,
+        colspec = {cX[c]cX[c]cX[c]},
+        cell{1}{2} = {c=5}{m}, cell{3}{2} = {c=5}{m},
+        cell{4}{2} = {c=5}{m}, cell{5}{2} = {c=5}{m}
+      }
+      \g__nju_name_title_c_tl  & \g__nju_info_title_tl \\
+      \g__nju_name_id_a_tl     & \g__nju_info_id_tl    &
+      \g__nju_name_dept_a_tl   & \g__nju_info_dept_tl  &
+      \g__nju_name_year_tl     &
+        \tl_range:Nnn \g__nju_info_submitdate_raw_tl {1} {4} \\
+      \g__nju_name_degree_a_tl &
+        {
+          \__nju_degree_checkbox:n { 2 } 学术学位硕士 \qquad{}
+          \__nju_degree_checkbox:n { 3 } 专业学位硕士 \\
+          \__nju_degree_checkbox:n { 4 } 学术学位博士 \qquad{}
+          \__nju_degree_checkbox:n { 5 } 专业学位博士
+        } \\
+      \g__nju_name_email_tl    & \g__nju_info_email_tl \\
+      \g__nju_name_supv_b_tl   &
+        \clist_item:Nn \g__nju_info_supv_clist    {1}
+        \clist_item:Nn \g__nju_info_supv_ii_clist {1} \\
+    \end{tblr}
+  }
+\cs_new_protected:Npn \__nju_authdecl_sign_g:
+  {
+    \g__nju_name_authsign_tl \par
+    \g__nju_name_blankdate_tl
+  }
+\cs_new_protected:Npn \__nju_authdecl_secretlv_g:
+  {
+    \g__nju_name_secretstatus_tl \par
+    \ensuremath { \mdwhtsquare } \g__nju_name_secretfree_tl \par
+    \ensuremath { \mdwhtsquare } \g__nju_name_secretdate_tl
+  }
 \__nju_declare_page:nn { cover-g-front-default }
   {
     element  = { emblem-img, name-img, type, degree, info, date },
@@ -229,6 +307,13 @@
     prefix  = cover / nl /,
     format  = \kaishu
   }
+\__nju_declare_page:nn { authdecl-g-default }
+  {
+    element     = { title, text, sign, info, date },
+    prefix      = authdecl / g /,
+    top-skip    = 1 cm,
+    bottom-skip = 0.5 cm plus 1.5 fill
+  }
 \cs_new_protected:Npn \__nju_make_cover:
   {
     \clist_map_inline:nn { front, back, en }
@@ -236,21 +321,27 @@
   }
 \cs_new_protected:Npn \__nju_make_cover_nl:
   { \UseInstance { nju } { cover-nl-default } }
-\cs_new_protected:Npn \__nju_make_orig_decl:
+\cs_new_protected:Npn \__nju_make_origdecl:
   {
-    \chapter* { \c__nju_name_orig_decl_tl }
+    \chapter* { \g__nju_name_origdecl_tl }
     \thispagestyle { empty }
-    \c__nju_orig_decl_text_tl
+    \g__nju_text_origdecl_tl
     \vfil
     \begin{flushright}
-      \clist_map_inline:nn { orig_sign,     orig_date }
+      \clist_map_inline:nn { origsign,     origdate }
         { \__nju_vskip: \__nju_name:n { ##1 } : \__nju_uline:n { 7 em } }
     \end{flushright}
     \vfil
   }
+\cs_new_protected:Npn \__nju_make_authdecl:
+  {
+    \thispagestyle{empty}
+    \UseInstance { nju } { authdecl-g-default }
+    \cleardoublepage
+  }
 \__nju_declare_element:nn { abstract / title }
   {
-    content     = \__nju_abs_title:V \c__nju_name_abstract_title_tl,
+    content     = \__nju_abs_title:V \g__nju_name_abstracttitle_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 1.2 cm
   }
@@ -263,7 +354,7 @@
   }
 \__nju_declare_element:nn { abstract / en / title }
   {
-    content     = \__nju_abs_title:V \c__nju_name_abstract_title_en_tl,
+    content     = \__nju_abs_title:V \g__nju_name_abstracttitle_en_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 1.2 cm
   }
@@ -276,13 +367,13 @@
   }
 \__nju_declare_element:nn { abstract / mark }
   {
-    content     = \c__nju_name_abstract_b_tl,
+    content     = \g__nju_name_abstract_b_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
 \__nju_declare_element:nn { abstract / en / mark }
   {
-    content     = \c__nju_name_abstract_b_en_tl,
+    content     = \g__nju_name_abstract_b_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
@@ -290,31 +381,31 @@
   {
     \__nju_uline_list:xnn
       {
-        \clist_item:Nn \c__nju_name_type_clist { \g__nju_info_type_int }
-        \c__nju_name_title_a_tl #1
+        \clist_item:Nn \g__nju_name_type_clist { \g__nju_info_type_int }
+        \g__nju_name_title_a_tl #1
       }
-      { \l__nju_info_title_tl } { \g__nju_abs_title_left_skip }
-    \__nju_full_uline:NV \l__nju_tmp_dim
+      { \g__nju_info_title_tl } { \g__nju_abs_title_left_skip }
+    \__nju_full_uline:NV \l__nju_tmpa_dim
       {
-        \__nju_ulined_center_box:nn { 11 em } { \l__nju_info_major_tl }
-        \c__nju_name_major_a_tl
-        \__nju_ulined_center_box:nn { 4  em } { \l__nju_info_grade_tl }
-        \c__nju_name_grade_tl \c__nju_name_author_a_tl #1
+        \__nju_ulined_center_box:nn { 11 em } { \g__nju_info_major_tl }
+        \g__nju_name_major_a_tl
+        \__nju_ulined_center_box:nn { 4  em } { \g__nju_info_grade_tl }
+        \g__nju_name_grade_tl \g__nju_name_author_a_tl #1
       }
-    \__nju_ulined_center_box:nn { \l__nju_tmp_dim }
-      { \l__nju_info_author_tl } \\
-    \__nju_full_uline:NV \l__nju_tmp_dim
-      { \c__nju_name_supv_a_tl #1 }
-    \__nju_ulined_center_box:nn { \l__nju_tmp_dim }
-      { \l__nju_info_supv_full_tl }
+    \__nju_ulined_center_box:nn { \l__nju_tmpa_dim }
+      { \g__nju_info_author_tl } \\
+    \__nju_full_uline:NV \l__nju_tmpa_dim
+      { \g__nju_name_supv_a_tl #1 }
+    \__nju_ulined_center_box:nn { \l__nju_tmpa_dim }
+      { \g__nju_info_supvfull_tl }
   }
 \cs_new_protected:Npn \__nju_abs_info_en_g:n #1
   {
-    \__nju_uline_list:xnn { \l__nju_info_type_en_tl #1 }
-        { \l__nju_info_title_en_tl } { \g__nju_abs_title_left_skip }
-    \clist_map_inline:nn { major, author, supv_full }
+    \__nju_uline_list:xnn { \g__nju_info_type_en_tl #1 }
+        { \g__nju_info_title_en_tl } { \g__nju_abs_title_left_skip }
+    \clist_map_inline:nn { major, author, supvfull }
       {
-        \__nju_uline_entry:Nnnn \l__nju_tmp_dim
+        \__nju_uline_entry:Nnnn \l__nju_tmpa_dim
           { ##1 _en } { ##1 _en } { #1 } \par
       }
   }
@@ -332,13 +423,16 @@
   }
 \clist_map_inline:nn
   {
-    { acknowledgement } { 致\hspace{2em}谢              },
+    { acknowledgement } { 致 \qquad{} 谢                },
+    { tableofcontents } { 目 \qquad{} 录                },
     { id              } { 学号                          },
+    { listoffigures   } { 插图目录                      },
+    { listoftables    } { 表格目录                      },
     { notation        } { 符号表                        },
-    { orig_date       } { 日期                          },
+    { origdate        } { 日期                          },
     { paperlist       } { 发表文章目录                  },
-    { pdf_creator     } { LaTeX~ with~ njuthesis~ class },
-    { preface         } { 前\hspace{2em}言              },
+    { pdfcreator      } { LaTeX~ with~ njuthesis~ class },
+    { preface         } { 前 \qquad{} 言                },
     { supv_ii         } { 第二导师                      },
     { supv_ttl        } { 职称                          }
   }
@@ -361,34 +455,50 @@
   { \__nju_define_name:nnn #1 }
 \clist_map_inline:nn
   {
+    { apply        } {(申请 \g__nju_info_degree_tl 学位)},
+    { authdecl     } { 学位论文出版授权书               },
+    { author_a     }
+      { \tl_item:Nn \g__nju_info_degree_tl { 1 } 士生姓名 },
+    { authsign     } { 作者签名:\njuline{\hspace{6em}} },
+    { blankdate    } { \njuline{\qquad\qquad} 年
+                \njuline{\qquad} 月 \njuline{\qquad} 日 },
     % 用于摘要的作者名称字样
-    { author_a     }
-      { \tl_item:Nn \l__nju_info_degree_tl { 1 } 士生姓名 },
     { chairman     } { 答辩委员会主席:                 },
     { clc          } { 分类号                           },
     { confer       } { 学位授予单位和日期               },
-    { df_date      } { 论文答辩日期                     },
+    { defenddate   } { 论文答辩日期                     },
     { degree       } { 申请学位级别                     },
-    { apply        }
-      { (申请 \l__nju_info_degree_tl 学位)              },
+    % 用于出版授权书的学位名称字样
+    { degree_a     } { 论文级别                         },
+    % 用于出版授权书的院系名称字样
+    { dept_a       } { 所在院系                         },
+    { email        } { 作者 Email                       },
     { field        } { 研究方向                         },
     { g            } { 研究生                           },
     { grade        } { 级                               },
+    % 用于出版授权书的学号名称字样
+    { id_a         } { 研究生学号                       },
     % 用于摘要的专业名称字样
     { major_a      } { 专业                             },
     % 用于国家图书馆封面的专业名称字样
     { major_b      } { 专业名称                         },
-    { orig_decl    }
-      { \c__nju_name_nju_tl 学位论文原创性声明            },
-    { orig_sign    } { 研究生签名                       },
+    { origdecl     } { 南京大学学位论文原创性声明       },
+    { origsign     } { 研究生签名                       },
     { reviewer     } { 评阅人:                         },
-    { seclv        } { 密级                             },
+    { secretlv     } { 密级                             },
+    { secretstatus } { 论文涉密情况:                   },
+    { secretfree   } { 不保密                           },
+    { secretdate   }
+      { 保密,保密期( \g__nju_name_blankdate_tl 至
+                       \g__nju_name_blankdate_tl )       },
     { sign         } { (签字)                         },
-    { sm_date      } { 论文提交日期                     },
+    { submitdate   } { 论文提交日期                     },
     { supv         } { 导师                             },
     % 用于摘要的导师名称字样
     { supv_a       } { 指导教师(姓名、职称)           },
-    { supv_info    }
+    % 用于出版授权书的导师名称字样
+    { supv_b       } { 导师姓名                         },
+    { supvinfo     }
       { 指导教师姓名、职务、职称、学位、单位名称及地址  },
     % 用于普通封面的标题名称字样
     { title        } { 论文题目                         },
@@ -395,28 +505,25 @@
     % 用于摘要的标题名称字样
     { title_a      } { 题目                             },
     % 用于国家图书馆封面的标题名称字样
-    { title_b      } { (题名和副题名)                },
-    { udc          } { U D C                           }
+    { title_b      } { (题名和副题名)                 },
+    % 用于出版授权书的标题名称字样
+    { title_c      } { 论文题名                         },
+    { udc          } { U D C                            },
+    { year         } { 学位年度                         }
   }
   { \__nju_define_name:nn #1 }
 \clist_map_inline:nn
   {
-    { abstract_title }
-      { 南京大学 \l__nju_info_type_tl 中文摘要首页用纸 }
-      { 南京大学 \l__nju_info_type_tl 英文摘要首页用纸 },
+    { abstracttitle }
+      { 南京大学 \g__nju_info_type_tl 中文摘要首页用纸 }
+      { 南京大学 \g__nju_info_type_tl 英文摘要首页用纸 },
     { author    } { 作者姓名 } { POSTGRADUATE        },
     { major     } { 专业方向 } { SPECIALIZATION      },
-    { supv_full } { 指导教师 } { MENTOR              }
+    { supvfull  } { 指导教师 } { MENTOR              }
   }
   { \__nju_define_name:nnn #1 }
-\tl_const:Nn \c__nju_cover_en_text_tl
+\tl_const:Nn \g__nju_text_origdecl_tl
   {
-    A~ dissertation~ submitted~ to \\
-    the~ graduate~ school~ of~ Nanjing~ University \\
-    in~ partial~ fulfilment~ of~ the~ requirements~ for~ the~ degree~ of
-  }
-\tl_const:Nn \c__nju_orig_decl_text_tl
-  {
     本人郑重声明,所提交的学位论文是本人在导师指导下独立进行科学研究工作
     所取得的成果。除本论文中已经注明引用的内容外,本论文不包含其他个人或
     集体已经发表或撰写过的研究成果,也不包含为获得南京大学或其他教育机构
@@ -423,6 +530,23 @@
     的学位证书而使用过的材料。对本文的研究做出重要贡献的个人和集体,均已
     在论文的致谢部分明确标明。本人郑重申明愿承担本声明的法律责任。
   }
+\tl_gset:Nn \g__nju_text_authdecl_tl
+  {
+    本人完全同意《中国优秀博硕士学位论文全文数据库出版章程》
+    (以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊
+    (光盘版)电子杂志社”在《中国博士学位论文全文数据库》、
+    《中国优秀硕士学位论文全文数据库》中全文发表。《中国博士
+    学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》
+    可以以电子、网络及其他数字媒体形式公开出版,并同意编入
+    《中国知识资源总库》,在《中国博硕士学位论文评价数据库》
+    中使用和在互联网上传播,同意按“章程”规定享受相关权益。
+  }
+\tl_gset:Nn \g__nju_text_cover_en_tl
+  {
+    A~ dissertation~ submitted~ to \\
+    the~ graduate~ school~ of~ Nanjing~ University \\
+    in~ partial~ fulfilment~ of~ the~ requirements~ for~ the~ degree~ of
+  }
 \clist_map_inline:nn
   {
     { axiom      } { 公理 } { Axiom      },
@@ -434,6 +558,25 @@
     { theorem    } { 定理 } { Theorem    }
   }
   { \__nju_add_theorem_type:nnn #1 }
+\clist_map_inline:nn
+  {
+    { coverlabel    } { 100 pt },
+    { coverlineskip } { 40  pt },
+    { coveruline    } { 270 pt },
+    { smallhskip    } { 5   pt },
+    { smallvskip    } { 1   ex }
+  }
+  { \__nju_define_dim:nn #1 }
+\clist_map_inline:nn
+  {
+    { chapterintoc  } { \large \normalfont \sffamily            },
+    { chapter       } { \large \normalfont \sffamily \centering },
+    { section       } { \large \normalfont \sffamily            },
+    { subsection    } { \large \normalfont \sffamily            },
+    { subsubsection } { \large \normalfont \sffamily            },
+    { toctitle      } { \centering \zihao { 3 } \bfseries       }
+  }
+  { \__nju_define_fmt:nn #1 }
 \endinput
 %%
 %% End of file `njuthesis-graduate.def'.

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-undergraduate.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-undergraduate.def	2022-04-10 20:03:48 UTC (rev 62994)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-undergraduate.def	2022-04-10 20:45:18 UTC (rev 62995)
@@ -23,7 +23,7 @@
 %% To produce the documentation run the original source files ending with
 %% `.dtx' through XeTeX.
 %% 
-\GetIdInfo $Id: njuthesis.dtx 0.16.1 2022-03-27 13:00:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
+\GetIdInfo $Id: njuthesis.dtx 0.17.0 2022-04-09 16:30:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Undergraduate definition file for njuthesis}
 \ProvidesExplFile{njuthesis-undergraduate.def}
   {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
@@ -42,7 +42,7 @@
 \__nju_declare_element:nn { cover / ug / title }
   {
     content  =
-      \__nju_spread_box:nnV { 9 em } { \bf } \l__nju_info_type_tl,
+      \__nju_spread_box:nnV { 9 em } { \bf } \g__nju_info_type_tl,
     format   = \zihao { -1 },
     bottom-skip = 0 pt plus 1.5 fill
   }
@@ -49,22 +49,23 @@
 \__nju_declare_element:nn { cover / ug / info }
   {
     content  =
-      \__nju_cover_info_ug:nnn { 4.2 em } { 16 em } { 5.5 em },
+      \__nju_cover_info_ug:NN \g__nju_coverlabel_dim \g__nju_coveruline_dim,
     format   = \zihao { 3 }
   }
-\cs_new_protected:Npn \__nju_cover_info_ug:nnn #1#2#3
+\cs_new_protected:Npn \__nju_cover_info_ug:NN #1#2
   {
-    \begin{minipage} { #1 + #2 + 0.3 em }
-      \raggedleft
+    \begin{minipage} { #1 + #2 + \g__nju_smallhskip_dim }
+      \dim_set_eq:NN \baselineskip \g__nju_coverlineskip_dim
+      \dim_set:Nn \l__nju_tmpb_dim { .5 #2 - .5 #1 - \g__nju_smallhskip_dim }
       \__nju_cover_entry:nnn { dept     } { #1 } { #2 }
       \__nju_cover_entry:nnn { major    } { #1 } { #2 }
-      \__nju_multiline_title:nnn  { \bf } { #1 } { #2 }
-      \__nju_cover_bientry:nnnn { grade } { id } { #1 } { #3 }
+      \__nju_cover_entry_title:nnn  { \bf } { #1 } { #2 }
+      \__nju_cover_bientry:nnnn { grade } { id } { #1 } { \l__nju_tmpb_dim }
       \__nju_cover_entry:nnn { author   } { #1 } { #2 }
-      \__nju_cover_supv_entry:nnn { supv } { #1 } { #3 }
+      \__nju_cover_entry_supv:nnn { supv } { #1 } { \l__nju_tmpb_dim }
       \bool_if:NT \l__nju_second_supv_bool
-        { \__nju_cover_supv_entry:nnn { supv_ii } { #1 } { #3 } }
-      \__nju_cover_entry:nnn { sm_date  } { #1 } { #2 }
+        { \__nju_cover_entry_supv:nnn { supv_ii } { #1 } { \l__nju_tmpb_dim } }
+      \__nju_cover_entry:nnn { submitdate  } { #1 } { #2 }
     \end{minipage}
   }
 \__nju_declare_page:nn { cover-ug-default }
@@ -77,21 +78,25 @@
   {
     \UseInstance { nju } { cover-ug-default }
   }
-\cs_new_protected:Npn \__nju_make_orig_decl:
+\cs_new_protected:Npn \__nju_make_origdecl:
   {
-    \chapter* { \c__nju_name_orig_decl_tl }
+    \chapter* { \g__nju_name_origdecl_tl }
     \thispagestyle { empty }
-    \c__nju_orig_decl_text_tl
+    \g__nju_text_origdecl_tl
     \vfil
     \begin{flushright}
-      \clist_map_inline:nn { orig_sign, id, orig_date }
+      \clist_map_inline:nn { origsign, id, origdate }
         { \__nju_vskip: \__nju_name:n { ##1 } : \__nju_uline:n { 7 em } }
     \end{flushright}
     \vfil
   }
+\cs_new_protected:Npn \__nju_make_authdecl:
+  {
+      \prg_do_nothing:
+  }
 \__nju_declare_element:nn { abstract / title }
   {
-    content     = \__nju_abs_title:V \c__nju_name_abstract_title_tl,
+    content     = \__nju_abs_title:V \g__nju_name_abstracttitle_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 1.2 cm
   }
@@ -104,7 +109,7 @@
   }
 \__nju_declare_element:nn { abstract / en / title }
   {
-    content     = \__nju_abs_title:V \c__nju_name_abstract_title_en_tl,
+    content     = \__nju_abs_title:V \g__nju_name_abstracttitle_en_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 1.2 cm
   }
@@ -118,23 +123,23 @@
 \cs_new_protected:Npn \__nju_abs_info_ug:nn #1#2
   {
     \tl_if_blank:eTF { #1 }
-      { \c__nju_name_title_tl }
-      { \clist_item:Nn \c__nju_name_type_en_clist { \g__nju_info_type_int } }
-    #2 \tl_use:c { l__nju_info_title #1 _tl } \\
-    \tl_set_eq:NN \c__nju_name_author_tl \c__nju_name_author_a_tl
-    \clist_map_inline:nn { dept, major, author, supv_full }
+      { \g__nju_name_title_tl }
+      { \clist_item:Nn \g__nju_name_type_en_clist { \g__nju_info_type_int } }
+    #2 \tl_use:c { g__nju_info_title #1 _tl } \\
+    \tl_set_eq:NN \g__nju_name_author_tl \g__nju_name_author_a_tl
+    \clist_map_inline:nn { dept, major, author, supvfull }
       { \__nju_name:n { ##1 #1 } #2 \__nju_info:n { ##1 #1 } \\ }
     \__nju_name:n { abstract #1 } #2
   }
 \__nju_declare_element:nn { abstract / mark }
   {
-    content     = \c__nju_name_abstract_b_tl,
+    content     = \g__nju_name_abstract_b_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
 \__nju_declare_element:nn { abstract / en / mark }
   {
-    content     = \c__nju_name_abstract_b_en_tl,
+    content     = \g__nju_name_abstract_b_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
@@ -150,13 +155,16 @@
   }
 \clist_map_inline:nn
   {
-    { acknowledgement } { 致\hspace{2em}谢              },
+    { acknowledgement } { 致 \qquad{} 谢                },
+    { tableofcontents } { 目 \qquad{} 录                },
     { id              } { 学号                          },
+    { listoffigures   } { 插图目录                      },
+    { listoftables    } { 表格目录                      },
     { notation        } { 符号表                        },
-    { orig_date       } { 日期                          },
+    { origdate        } { 日期                          },
     { paperlist       } { 发表文章目录                  },
-    { pdf_creator     } { LaTeX~ with~ njuthesis~ class },
-    { preface         } { 前\hspace{2em}言              },
+    { pdfcreator      } { LaTeX~ with~ njuthesis~ class },
+    { preface         } { 前 \qquad{} 言                },
     { supv_ii         } { 第二导师                      },
     { supv_ttl        } { 职称                          }
   }
@@ -182,10 +190,10 @@
     % 用于摘要的作者名称字样
     { author_a    } { 本科生姓名                         },
     { grade       } { 年级                               },
-    { orig_decl   }
-      { \c__nju_name_nju_tl 本科毕业论文(设计)诚信承诺书 },
-    { orig_sign   } { 作者签名                           },
-    { sm_date     } { 提交日期                           },
+    { origdecl    }
+      { \g__nju_name_nju_tl 本科毕业论文(设计)诚信承诺书 },
+    { origsign    } { 作者签名                           },
+    { submitdate  } { 提交日期                           },
     { supv        } { 导师                               },
     { title       } { 题目                               },
     { type        } { 本科生毕业论文(设计、作品)       },
@@ -194,27 +202,27 @@
   { \__nju_define_name:nn #1 }
 \clist_map_inline:nn
   {
-    { abstract_title }
+    { abstracttitle }
       {
-        \c__nju_name_nju_tl  \c__nju_name_type_tl
-        \c__nju_name_lang_tl \c__nju_name_abstract_tl
+        \g__nju_name_nju_tl  \g__nju_name_type_tl
+        \g__nju_name_lang_tl \g__nju_name_abstract_tl
       }
       {
-        \c__nju_name_nju_tl     \c__nju_name_type_tl
-        \c__nju_name_lang_en_tl \c__nju_name_abstract_tl
+        \g__nju_name_nju_tl     \g__nju_name_type_tl
+        \g__nju_name_lang_en_tl \g__nju_name_abstract_tl
       },
     { author    } { 学生姓名               } { UNDERGRADUATE  },
     { major     } { 专业                   } { SPECIALIZATION },
-    { supv_full } { 指导教师(姓名、职称) } { MENTOR         }
+    { supvfull  } { 指导教师(姓名、职称) } { MENTOR         }
   }
   { \__nju_define_name:nnn #1 }
-\tl_const:Nn \c__nju_orig_decl_text_tl
+\tl_const:Nn \g__nju_text_origdecl_tl
   {
-    本人郑重承诺:所呈交的毕业论文(设计)(题目:)是在指导教师的指导下
-    严格按照学校和院系有关规定由本人独立完成的。本毕业论文(设计)中引用
-    他人观点及参考资源的内容均已标注引用,如出现侵犯他人知识产权的行为,
-    由本人承担相应法律责任。本人承诺不存在抄袭、伪造、篡改、代写、买卖毕
-    业论文(设计)等违纪行为。
+    本人郑重承诺:所呈交的毕业论文(设计)(题目: \g__nju_info_title_tl )
+    是在指导教师的指导下严格按照学校和院系有关规定由本人独立完成的。
+    本毕业论文(设计)中引用他人观点及参考资源的内容均已标注引用,
+    如出现侵犯他人知识产权的行为,由本人承担相应法律责任。
+    本人承诺不存在抄袭、伪造、篡改、代写、买卖毕业论文(设计)等违纪行为。
   }
 \clist_map_inline:nn
   {
@@ -227,6 +235,25 @@
     { theorem    } { 定理 } { Theorem    }
   }
   { \__nju_add_theorem_type:nnn #1 }
+\clist_map_inline:nn
+  {
+    { coverlabel    } { 68  pt },
+    { coverlineskip } { 40  pt },
+    { coveruline    } { 270 pt },
+    { smallhskip    } { 5   pt },
+    { smallvskip    } { 1   ex }
+  }
+  { \__nju_define_dim:nn #1 }
+\clist_map_inline:nn
+  {
+    { chapterintoc  } { \large \normalfont \sffamily            },
+    { chapter       } { \large \normalfont \sffamily \centering },
+    { section       } { \large \normalfont \sffamily            },
+    { subsection    } { \large \normalfont \sffamily            },
+    { subsubsection } { \large \normalfont \sffamily            },
+    { toctitle      } { \centering \zihao { 3 } \bfseries       }
+  }
+  { \__nju_define_fmt:nn #1 }
 \endinput
 %%
 %% End of file `njuthesis-undergraduate.def'.

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis.cls	2022-04-10 20:03:48 UTC (rev 62994)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis.cls	2022-04-10 20:45:18 UTC (rev 62995)
@@ -24,7 +24,7 @@
 %% `.dtx' through XeTeX.
 %% 
 \NeedsTeXFormat{LaTeX2e}
-\GetIdInfo $Id: njuthesis.dtx 0.16.1 2022-03-27 13:00:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
+\GetIdInfo $Id: njuthesis.dtx 0.17.0 2022-04-09 16:30:00 +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Thesis template for Nanjing University}
 \ProvidesExplClass{njuthesis}
   {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
@@ -55,29 +55,31 @@
   { \msg_fatal:nnx { njuthesis } { unsupported-engine } { \c_sys_engine_str } }
 \box_new:N   \l__nju_tmp_box
 \clist_new:N \l__nju_tmp_clist
-\dim_new:N   \l__nju_tmp_dim
+\dim_new:N   \l__nju_tmpa_dim
+\dim_new:N   \l__nju_tmpb_dim
 \int_new:N   \l__nju_tmp_int
 \seq_new:N   \l__nju_tmp_seq
-\tl_new:N    \l__nju_tmp_tl
+\tl_new:N    \l__nju_tmpa_tl
+\tl_new:N    \l__nju_tmpb_tl
 \int_new:N \g__nju_info_degree_int
-\int_new:N \l__nju_info_diploma_int
+\int_new:N \g__nju_info_diploma_int
 \int_new:N \g__nju_info_type_int
-\tl_new:N  \l__nju_info_degree_tl
-\tl_new:N  \l__nju_info_diploma_tl
-\tl_new:N  \l__nju_info_type_tl
-\tl_new:N  \l__nju_info_type_en_tl
+\tl_new:N  \g__nju_info_degree_tl
+\tl_new:N  \g__nju_info_diploma_tl
+\tl_new:N  \g__nju_info_type_tl
+\tl_new:N  \g__nju_info_type_en_tl
 \bool_new:N \g__nju_twoside_bool
 \bool_set_true:N \g__nju_twoside_bool
 \bool_new:N \l__nju_second_supv_bool
-\tl_new:N \l__nju_info_supv_full_tl
-\tl_new:N \l__nju_info_supv_full_en_tl
+\tl_new:N \g__nju_info_supvfull_tl
+\tl_new:N \g__nju_info_supvfull_en_tl
 \tl_new:N \g__nju_latin_font_tl
 \tl_new:N \g__nju_cjk_font_tl
 \tl_new:N \g__nju_config_tl
 \clist_new:N \g__nju_theorem_type_clist
-\tl_new:N \l__nju_info_sm_date_tl
-\tl_new:N \l__nju_info_sm_date_en_tl
-\tl_new:N \l__nju_info_df_date_tl
+\tl_new:N \g__nju_info_submitdate_tl
+\tl_new:N \g__nju_info_submitdate_en_tl
+\tl_new:N \g__nju_info_defenddate_tl
 \tl_const:Nx \c__nju_today_tl
   {
     \int_to_arabic:n { \c_sys_year_int  } -
@@ -84,13 +86,13 @@
     \int_to_arabic:n { \c_sys_month_int } -
     \int_to_arabic:n { \c_sys_day_int   }
   }
-\clist_const:Nn \c__nju_name_type_clist
+\clist_const:Nn \g__nju_name_type_clist
   { 毕业论文, 毕业设计 }
-\clist_const:Nn \c__nju_name_type_en_clist
+\clist_const:Nn \g__nju_name_type_en_clist
   { THESIS, DESIGN }
-\clist_const:Nn \c__nju_name_degree_clist
+\clist_const:Nn \g__nju_name_degree_clist
   { 学士, 硕士, 硕士专业, 博士 }
-\clist_const:Nn \c__nju_name_degree_en_clist
+\clist_const:Nn \g__nju_name_degree_en_clist
   { Bachelor, Master, Master, Doctor~of~Philosophy }
 \clist_const:Nn \c__nju_month_en_clist
   {
@@ -99,8 +101,8 @@
   }
 \cs_new:Nn \__nju_quad:  { \skip_horizontal:n { 1 em } }
 \cs_new:Nn \__nju_qquad: { \skip_horizontal:n { 2 em } }
-\cs_new:Nn \__nju_vskip: { \skip_vertical:n   { 1   ex } }
-\cs_new:Nn \__nju_hskip: { \skip_horizontal:n { 0.3 em } }
+\cs_new:Nn \__nju_vskip: { \skip_vertical:N   \g__nju_smallvskip_dim }
+\cs_new:Nn \__nju_hskip: { \skip_horizontal:N \g__nju_smallhskip_dim }
 \cs_new_protected:Npn \__nju_vskip:N #1
   {
     \hrule height \c_zero_dim
@@ -109,19 +111,39 @@
     \skip_vertical:N #1
   }
 \cs_new_protected:Npn \__nju_define_name:nn #1#2
-  { \tl_const:cn { c__nju_name_ #1    _tl } { #2 } }
+  {
+    \tl_new:c   { g__nju_name_ #1    _tl }
+    \tl_gset:cn { g__nju_name_ #1    _tl } { #2 }
+  }
 \cs_new_protected:Npn \__nju_define_name:nnn #1#2#3
   {
-    \tl_const:cn { c__nju_name_ #1    _tl } { #2 }
-    \tl_const:cn { c__nju_name_ #1 _en_tl } { #3 }
+    \tl_new:c   { g__nju_name_ #1    _tl }
+    \tl_gset:cn { g__nju_name_ #1    _tl } { #2 }
+    \tl_new:c   { g__nju_name_ #1 _en_tl }
+    \tl_gset:cn { g__nju_name_ #1 _en_tl } { #3 }
   }
+\cs_new_protected:Npn \__nju_define_fmt:nn #1#2
+  {
+    \tl_new:c   { g__nju_fmt_ #1 _tl }
+    \tl_gset:cn { g__nju_fmt_ #1 _tl } { #2 }
+  }
+\cs_new_protected:Npn \__nju_define_dim:nn #1#2
+  {
+    \dim_new:c   { g__nju_ #1 _dim }
+    \dim_gset:cn { g__nju_ #1 _dim } { #2 }
+  }
+\cs_new_protected:Npn \__nju_define_skip:nn #1#2
+  {
+    \skip_new:c   { g__nju_ #1 _skip }
+    \skip_gset:cn { g__nju_ #1 _skip } { #2 }
+  }
 \cs_new_protected:Npn \__nju_add_theorem_type:nnn #1#2#3
   {
     \clist_gput_right:Nn \g__nju_theorem_type_clist { #1 }
     \__nju_define_name:nnn { #1 } { #2 } { #3 }
   }
-\cs_new:Npn \__nju_name:n #1 { \tl_use:c { c__nju_name_ #1 _tl } }
-\cs_new:Npn \__nju_info:n #1 { \tl_use:c { l__nju_info_ #1 _tl } }
+\cs_new:Npn \__nju_name:n #1 { \tl_use:c { g__nju_name_ #1 _tl } }
+\cs_new:Npn \__nju_info:n #1 { \tl_use:c { g__nju_info_ #1 _tl } }
 \cs_new_protected:Npn \__nju_ulined_center_box:nn #1#2
   {
     \mode_leave_vertical:
@@ -149,10 +171,10 @@
   }
 \cs_new_protected:Npn \__nju_put_inempty_seg:nnn #1#2#3
   {
-    \tl_set:Nx \l__nju_tmp_tl
+    \tl_set:Nx \l__nju_tmpa_tl
       { \tl_range:Nnn { #1 } { #2 } { #2 + #3 - 1 } }
-    \tl_if_empty:NF \l__nju_tmp_tl
-      { \clist_put_right:NV \l__nju_tmp_clist { \l__nju_tmp_tl } }
+    \tl_if_empty:NF \l__nju_tmpa_tl
+      { \clist_put_right:NV \l__nju_tmp_clist { \l__nju_tmpa_tl } }
   }
 \cs_new_protected:Npn \__nju_uline:n #1
   {
@@ -201,29 +223,34 @@
     Please~ check~ whether~ you~ have~ fill~ in~
     both~ Chinese~ and~ English~ titles.
   }
-\cs_new_protected:Npn \__nju_split_title:n #1
+\cs_new_protected:Npn \__nju_uline_title:
   {
-    \tl_if_in:nnTF { #1 } { \\ }
-      {
-        \seq_set_split:Nnn \l__nju_tmp_seq { \\ } { #1 }
-        \clist_set_from_seq:NN \l__nju_tmp_clist \l__nju_tmp_seq
+    \setbox0 = \vbox{
+        \leftskip=0.5em plus 1 fill
+        \rightskip=\leftskip \parskip=1cm
+        \parindent=\z@ \g__nju_info_title_tl \par
+        \global\setbox2=\hbox{}
+        \loop
+          \setbox1=\lastbox \unskip\unpenalty
+        \unless\ifvoid1
+          \global\setbox2=\hbox{\__nju_uline_box:\penalty0\unhbox2}
+        \repeat
       }
-      {
-        \__nju_put_inempty_seg:nnn { #1 } { 1  } { 15 }
-        \__nju_put_inempty_seg:nnn { #1 } { 16 } { 15 }
-        \__nju_put_inempty_seg:nnn { #1 } { 31 } { 15 }
-      }
+      { \noindent \unhbox2 \par }
   }
-\cs_generate_variant:Nn \__nju_split_title:n { V }
-\cs_new_protected:Npn \__nju_multiline_title:nnn #1#2#3
+\cs_new_protected:Npn \__nju_cover_entry_title:nnn #1#2#3
   {
-    \tl_if_empty:NT \l__nju_info_title_tl
+    \tl_if_empty:NT \g__nju_info_title_tl
       { \msg_error:nn { njuthesis } { missing-title } }
-    \__nju_split_title:V \l__nju_info_title_tl
-    \__nju_spread_box:nnV { #2 } { \kaishu } \c__nju_name_title_tl
-    \__nju_hskip:
-    \clist_map_inline:Nn \l__nju_tmp_clist
-      { \__nju_ulined_center_box:nn { #3 } { #1 ##1 } \__nju_vskip: }
+    \__nju_spread_box:nnV { #2 } { \kaishu } \g__nju_name_title_tl
+    \mode_leave_vertical: \__nju_hskip:
+    \parbox [ t ] { #3 }
+      {
+        \dim_set_eq:NN \baselineskip \g__nju_coverlineskip_dim
+        #1 \__nju_uline_title:
+        \dim_set_eq:NN \l__nju_tmpa_dim \prevdepth
+      }
+    \par \prevdepth \l__nju_tmpa_dim
   }
 \cs_new_protected:Npn \__nju_cover_entry:nnn #1#2#3
   {
@@ -230,7 +257,7 @@
     \__nju_spread_box:nnx { #2 } { \kaishu } { \__nju_name:n { #1 } }
     \__nju_hskip:
     \__nju_ulined_center_box:nn { #3 }       { \__nju_info:n { #1 } }
-    \__nju_vskip:
+    \par
   }
 \cs_new_protected:Npn \__nju_cover_bientry:nnnn #1#2#3#4
   {
@@ -237,24 +264,24 @@
     \__nju_spread_box:nnx { #3 } { \kaishu } { \__nju_name:n { #1 } }
     \__nju_hskip:
     \__nju_ulined_center_box:nn { #4 }       { \__nju_info:n { #1 } }
-    \skip_horizontal:n { 0.5 em }
+    \__nju_hskip:
     \__nju_spread_box:nnx { #3 } { \kaishu } { \__nju_name:n { #2 } }
     \__nju_hskip:
     \__nju_ulined_center_box:nn { #4 }       { \__nju_info:n { #2 } }
-    \__nju_vskip:
+    \par
   }
-\cs_new_protected:Npn \__nju_cover_supv_entry:nnn #1#2#3
+\cs_new_protected:Npn \__nju_cover_entry_supv:nnn #1#2#3
   {
     \__nju_spread_box:nnx { #2 } { \kaishu } { \__nju_name:n { #1 } }
     \__nju_hskip:
     \__nju_ulined_center_box:nn { #3 }
-      { \clist_item:cn { l__nju_info_ #1 _clist } { 1 } }
-    \skip_horizontal:n { 0.5 em }
-    \__nju_spread_box:nnV { #2 } { \kaishu } \c__nju_name_supv_ttl_tl
+      { \clist_item:cn { g__nju_info_ #1 _clist } { 1 } }
     \__nju_hskip:
+    \__nju_spread_box:nnV { #2 } { \kaishu } \g__nju_name_supv_ttl_tl
+    \__nju_hskip:
     \__nju_ulined_center_box:nn { #3 }
-      { \clist_item:cn { l__nju_info_ #1 _clist } { 2 } }
-    \__nju_vskip:
+      { \clist_item:cn { g__nju_info_ #1 _clist } { 2 } }
+    \par
   }
 \cs_new_protected:Npn \__nju_abs_bookmark:nn #1#2
   {
@@ -267,8 +294,8 @@
 \cs_generate_variant:Nn \__nju_abs_bookmark:nn { Vn }
 \cs_new_protected:Npn \__nju_abs_title:n #1
   {
-    \__nju_get_text_width:Nn \l__nju_tmp_dim {#1}
-    \__nju_uuline:n { \l__nju_tmp_dim } #1
+    \__nju_get_text_width:Nn \l__nju_tmpa_dim {#1}
+    \__nju_uuline:n { \l__nju_tmpa_dim } #1
   }
 \cs_generate_variant:Nn \__nju_abs_title:n { V }
 \cs_new_protected:Npn \__nju_uline_box:
@@ -285,7 +312,7 @@
 \cs_new_protected:Npn \__nju_uline_list:nnn #1#2#3
   {
     \hbox_set:Nn \l__nju_tmp_box {#1}
-    \setbox0=\vbox{\hangindent=\wd\l__nju_tmp_box \hangafter=-1
+    \setbox0 = \vbox{\hangindent=\wd\l__nju_tmp_box \hangafter=-1
         \leftskip=#3 \rightskip=\leftskip \parindent=\z@ #2\par
         \global\setbox2=\hbox{}
         \int_gzero:N \l__nju_tmp_int
@@ -392,7 +419,7 @@
     type              .initial:n    = thesis,
     nlcover          .bool_set:N  = \g__nju_nlcover_bool,
     nlcover           .initial:n  = false,
-    decl-page        .bool_set:N  = \g__nju_orig_decl_bool,
+    decl-page        .bool_set:N  = \g__nju_decl_bool,
     decl-page         .initial:n  = false,
     draft           .bool_gset:N  = \g__nju_draft_bool,
     draft             .initial:n  = false,
@@ -415,6 +442,28 @@
     style .meta:nn = { nju / style } { #1 }
   }
 \NewDocumentCommand \njusetup { m } { \keys_set:nn { nju } { #1 } }
+\NewDocumentCommand \njusetformat { m m }
+  { \tl_gset:cn { g__nju_fmt_ #1 _tl } { #2 } }
+\NewDocumentCommand \njusetlength { s m m }
+  {
+    \bool_if:nTF { #1 }
+      { \skip_gset:cn { g__nju_ #2 _skip } { #3 } }
+      { \dim_gset:cn  { g__nju_ #2 _dim  } { #3 } }
+  }
+\NewDocumentCommand \njusetname { s m o m }
+  { \__nju_set_tokenlist:nnnnn {#1} {#2} {#3} {#4} { name } }
+\NewDocumentCommand \njusettext { s m o m }
+  { \__nju_set_tokenlist:nnnnn {#1} {#2} {#3} {#4} { text } }
+\cs_new_protected:Npn \__nju_set_tokenlist:nnnnn #1#2#3#4#5
+  {
+    \tl_if_novalue:nTF { #3 }
+      { \tl_clear:N \l__nju_tmpa_tl          }
+      { \tl_set:Nn  \l__nju_tmpa_tl { _ #3 } }
+    \bool_if:nTF       { #1 }
+      { \tl_set:Nn  \l__nju_tmpb_tl { _en  } }
+      { \tl_clear:N \l__nju_tmpb_tl          }
+    \tl_gset:cn { g__nju_ #5 _ #2 \l__nju_tmpa_tl \l__nju_tmpb_tl _tl } {#4}
+  }
 \PassOptionsToClass
   {
     a4paper,
@@ -466,6 +515,10 @@
     \RequirePackage{lua-ul}
     \NewDocumentCommand \njuline { m } { \underLine{#1} \null }
   }
+\bool_lazy_and:nnT
+  { \g__nju_decl_bool }
+  { !\int_compare_p:n { \g__nju_info_degree_int == 1 } }
+  { \RequirePackage { tabularray } }
 \msg_new:nnn { njuthesis } { package-too-old }
   {
     Package~ "#1"~ is~ too~ old.\\
@@ -493,86 +546,87 @@
   }
 \keys_define:nn { nju / info }
   {
-    title               .tl_set:N = \l__nju_info_title_tl,
+    title               .tl_set:N = \g__nju_info_title_tl,
     title              .initial:n = { 空 },
-    title*              .tl_set:N = \l__nju_info_title_en_tl,
+    title*              .tl_set:N = \g__nju_info_title_en_tl,
     title*             .initial:n = { Empty },
-    keywords         .clist_set:N = \l__nju_info_keywords_clist,
-    keywords*        .clist_set:N = \l__nju_info_keywords_en_clist,
-    grade               .tl_set:N = \l__nju_info_grade_tl,
-    student-id          .tl_set:N = \l__nju_info_id_tl,
-    author              .tl_set:N = \l__nju_info_author_tl,
-    author*             .tl_set:N = \l__nju_info_author_en_tl,
-    department          .tl_set:N = \l__nju_info_dept_tl,
-    department*         .tl_set:N = \l__nju_info_dept_en_tl,
-    major               .tl_set:N = \l__nju_info_major_tl,
-    major*              .tl_set:N = \l__nju_info_major_en_tl,
-    field               .tl_set:N = \l__nju_info_field_tl,
-    field*              .tl_set:N = \l__nju_info_field_en_tl,
-    supervisor       .clist_set:N = \l__nju_info_supv_clist,
-    supervisor*         .tl_set:N = \l__nju_info_supv_en_tl,
-    supervisor-ii    .clist_set:N = \l__nju_info_supv_ii_clist,
-    supervisor-ii*      .tl_set:N = \l__nju_info_supv_ii_en_tl,
-    submit-date         .tl_set:N = \l__nju_info_sm_date_raw_tl,
+    keywords         .clist_set:N = \g__nju_info_keywords_clist,
+    keywords*        .clist_set:N = \g__nju_info_keywords_en_clist,
+    grade               .tl_set:N = \g__nju_info_grade_tl,
+    student-id          .tl_set:N = \g__nju_info_id_tl,
+    author              .tl_set:N = \g__nju_info_author_tl,
+    author*             .tl_set:N = \g__nju_info_author_en_tl,
+    department          .tl_set:N = \g__nju_info_dept_tl,
+    department*         .tl_set:N = \g__nju_info_dept_en_tl,
+    major               .tl_set:N = \g__nju_info_major_tl,
+    major*              .tl_set:N = \g__nju_info_major_en_tl,
+    field               .tl_set:N = \g__nju_info_field_tl,
+    field*              .tl_set:N = \g__nju_info_field_en_tl,
+    supervisor       .clist_set:N = \g__nju_info_supv_clist,
+    supervisor*         .tl_set:N = \g__nju_info_supv_en_tl,
+    supervisor-ii    .clist_set:N = \g__nju_info_supv_ii_clist,
+    supervisor-ii*      .tl_set:N = \g__nju_info_supv_ii_en_tl,
+    submit-date         .tl_set:N = \g__nju_info_submitdate_raw_tl,
     submit-date        .initial:V = \c__nju_today_tl,
-    defend-date         .tl_set:N = \l__nju_info_df_date_raw_tl,
+    defend-date         .tl_set:N = \g__nju_info_defenddate_raw_tl,
     defend-date        .initial:V = \c__nju_today_tl,
-    chairman            .tl_set:N = \l__nju_info_chairman_tl,
-    reviewer         .clist_set:N = \l__nju_info_reviewer_clist,
-    clc                 .tl_set:N = \l__nju_info_clc_tl,
-    secret-level        .tl_set:N = \l__nju_info_seclv_tl,
-    udc                 .tl_set:N = \l__nju_info_udc_tl,
-    supervisor-contact  .tl_set:N = \l__nju_info_supv_cont_tl,
+    chairman            .tl_set:N = \g__nju_info_chairman_tl,
+    reviewer         .clist_set:N = \g__nju_info_reviewer_clist,
+    clc                 .tl_set:N = \g__nju_info_clc_tl,
+    secret-level        .tl_set:N = \g__nju_info_secretlv_tl,
+    udc                 .tl_set:N = \g__nju_info_udc_tl,
+    supervisor-contact  .tl_set:N = \g__nju_info_supv_cont_tl,
+    email               .tl_set:N = \g__nju_info_email_tl
   }
-\tl_set:Nx \l__nju_info_degree_tl
+\tl_set:Nx \g__nju_info_degree_tl
   {
-    \clist_item:Nn \c__nju_name_degree_clist
+    \clist_item:Nn \g__nju_name_degree_clist
       { \g__nju_info_degree_int }
   }
 \int_compare:nTF { \g__nju_info_degree_int == 1 }
-  { \tl_set:Nn \l__nju_info_diploma_tl { ug } }
-  { \tl_set:Nn \l__nju_info_diploma_tl { g  } }
-\tl_set:Nx \l__nju_info_type_tl
-  { \clist_item:Nn \c__nju_name_type_clist    { \g__nju_info_type_int } }
-\tl_set:Nx \l__nju_info_type_en_tl
-  { \clist_item:Nn \c__nju_name_type_en_clist { \g__nju_info_type_int } }
-\tl_put_left:Nx \l__nju_info_type_tl
-  { \tl_use:c { c__nju_name_ \l__nju_info_diploma_tl _tl } }
+  { \tl_set:Nn \g__nju_info_diploma_tl { ug } }
+  { \tl_set:Nn \g__nju_info_diploma_tl { g  } }
+\tl_set:Nx \g__nju_info_type_tl
+  { \clist_item:Nn \g__nju_name_type_clist    { \g__nju_info_type_int } }
+\tl_set:Nx \g__nju_info_type_en_tl
+  { \clist_item:Nn \g__nju_name_type_en_clist { \g__nju_info_type_int } }
+\tl_put_left:Nx \g__nju_info_type_tl
+  { \tl_use:c { g__nju_name_ \g__nju_info_diploma_tl _tl } }
 \ctex_at_end_preamble:n
   {
     \bool_set:Nn \l__nju_second_supv_bool
-      { ! \clist_if_empty_p:N \l__nju_info_supv_ii_clist }
-    \tl_set:Nx \l__nju_info_supv_full_tl
+      { ! \clist_if_empty_p:N \g__nju_info_supv_ii_clist }
+    \tl_set:Nx \g__nju_info_supvfull_tl
       {
-        \clist_use:Nn \l__nju_info_supv_clist { \__nju_hskip: }
+        \clist_use:Nn \g__nju_info_supv_clist { \__nju_hskip: }
         \bool_if:NT \l__nju_second_supv_bool
           {
             \__nju_quad:
-            \clist_use:Nn \l__nju_info_supv_ii_clist { \__nju_hskip: }
+            \clist_use:Nn \g__nju_info_supv_ii_clist { \__nju_hskip: }
           }
       }
-    \tl_set:Nx \l__nju_info_supv_full_en_tl
+    \tl_set:Nx \g__nju_info_supvfull_en_tl
       {
-        \l__nju_info_supv_en_tl
+        \g__nju_info_supv_en_tl
         \bool_if:NT \l__nju_second_supv_bool
-          { \__nju_quad: \l__nju_info_supv_ii_en_tl }
+          { \__nju_quad: \g__nju_info_supv_ii_en_tl }
       }
-    \tl_set:Nn \l__nju_info_sm_date_tl
+    \tl_set:Nn \g__nju_info_submitdate_tl
       {
         \exp_last_unbraced:NV
-          \__nju_date:www \l__nju_info_sm_date_raw_tl \q_stop
+          \__nju_date:www \g__nju_info_submitdate_raw_tl \q_stop
       }
     \int_compare:nF { \g__nju_info_degree_int == 1 }
       {
-        \tl_set:Nn \l__nju_info_sm_date_en_tl
+        \tl_set:Nn \g__nju_info_submitdate_en_tl
           {
             \exp_last_unbraced:NV
-              \__nju_date_en:www \l__nju_info_sm_date_raw_tl \q_stop
+              \__nju_date_en:www \g__nju_info_submitdate_raw_tl \q_stop
           }
-        \tl_set:Nn \l__nju_info_df_date_tl
+        \tl_set:Nn \g__nju_info_defenddate_tl
           {
             \exp_last_unbraced:NV
-              \__nju_date:www \l__nju_info_df_date_raw_tl \q_stop
+              \__nju_date:www \g__nju_info_defenddate_raw_tl \q_stop
           }
       }
   }
@@ -839,9 +893,9 @@
       }
   }
 \cs_new_protected:Npn \__nju_header:nn #1#2
-  { \fancyhead [#1] { \g__nju_header_format_tl #2 } }
+  { \fancyhead [#1] { \g__nju_header_format_tl \nouppercase {#2} } }
 \cs_new_protected:Npn \__nju_footer:nn #1#2
-  { \fancyfoot [#1] { \g__nju_footer_format_tl #2 } }
+  { \fancyfoot [#1] { \g__nju_footer_format_tl \nouppercase {#2} } }
 \fancypagestyle { plain }
   {
     \fancyhf { }
@@ -883,9 +937,8 @@
     \exp_args:NV \pagestyle \c__nju_pagestyle_tl
     \pagenumbering { Roman }
   }
-\tl_const:Nn \c__nju_sec_format_tl { \large \normalfont \sffamily }
 \cs_new_protected:Npn \__nju_add_tocline:n #1
-  { \addcontentsline { toc } { chapter } { \c__nju_sec_format_tl #1 } }
+  { \addcontentsline { toc } { chapter } { \g__nju_fmt_chapterintoc_tl #1 } }
 \cs_generate_variant:Nn \__nju_add_tocline:n { V }
 \cs_new_protected:Npn \__nju_chapter:n #1
   {
@@ -905,14 +958,14 @@
   {
     chapter        / beforeskip = 10 pt,
     chapter        / afterskip  = 60 pt,
-    chapter        / format     = \c__nju_sec_format_tl \centering,
-    section        / format     = \c__nju_sec_format_tl,
-    subsection     / format     = \c__nju_sec_format_tl,
-    subsubsection  / format     = \c__nju_sec_format_tl,
-    contentsname   = { 目\hspace{2em}录 },
-    listfigurename = { 插图目录         },
-    listtablename  = { 表格目录         },
-    chapter / tocline = \c__nju_sec_format_tl \CTEXnumberline { #1 } #2
+    chapter        / format     = \g__nju_fmt_chapter_tl,
+    section        / format     = \g__nju_fmt_section_tl,
+    subsection     / format     = \g__nju_fmt_subsection_tl,
+    subsubsection  / format     = \g__nju_fmt_subsubsection_tl,
+    contentsname   = \g__nju_name_tableofcontents_tl,
+    listfigurename = \g__nju_name_listoffigures_tl,
+    listtablename  = \g__nju_name_listoftables_tl,
+    chapter / tocline = \g__nju_fmt_chapterintoc_tl \CTEXnumberline { #1 } #2
   }
 \keys_define:nn { nju / style }
   {
@@ -923,7 +976,7 @@
   {
     \group_begin:
       \keys_set:nn { ctex }
-        { chapter/format = \centering \zihao { 3 } \bfseries }
+        { chapter/format = \g__nju_fmt_toctitle_tl }
       \bool_if:NTF \g__nju_toc_in_toc_bool
         { \__nju_chapter:n { #1 } }
         {
@@ -1009,7 +1062,11 @@
 \ctex_at_end_preamble:n
   {
     \pdfstringdefDisableCommands
-      { \cs_set_eq:NN \\ \prg_do_nothing: }
+      {
+        \cs_set_eq:NN \\     \prg_do_nothing:
+        \cs_set_eq:NN \quad  \prg_do_nothing:
+        \cs_set_eq:NN \qquad \prg_do_nothing:
+      }
     \hypersetup
       {
         bookmarksnumbered = true,
@@ -1016,10 +1073,10 @@
         psdextra          = true,
         unicode           = true,
         hidelinks,
-        pdftitle    = \l__nju_info_title_tl,
-        pdfauthor   = \l__nju_info_author_tl,
-        pdfkeywords = \l__nju_info_keywords_clist,
-        pdfcreator  = \c__nju_name_pdf_creator_tl
+        pdftitle    = \g__nju_info_title_tl,
+        pdfauthor   = \g__nju_info_author_tl,
+        pdfkeywords = \g__nju_info_keywords_clist,
+        pdfcreator  = \g__nju_name_pdfcreator_tl
       }
   }
 \cs_new_protected:Npn \__nju_cref_name:n #1
@@ -1058,7 +1115,7 @@
       { \newtheorem { ##1 } { \__nju_name:n { ##1 } } }
   }
 \theoremsymbol { \ensuremath { \mdwhtsquare } }
-\newtheorem* { proof } { \c__nju_name_proof_tl }
+\newtheorem* { proof } { \g__nju_name_proof_tl }
 \group_begin:
   \clist_remove_all:Nn \g__nju_theorem_type_clist { proof }
   \__nju_new_theorem:N \g__nju_theorem_type_clist
@@ -1100,14 +1157,21 @@
   {
     \bool_if:NF \g__nju_draft_bool
       {
-        \pagestyle     { empty  }
         \pagenumbering { gobble }
         \bool_if:NTF \g__nju_nlcover_bool
           { \__nju_make_cover_nl: }
           { \__nju_make_cover:    }
-        \bool_if:NT \g__nju_orig_decl_bool { \__nju_make_orig_decl: }
       }
-    \tl_remove_all:Nn \l__nju_info_title_tl { \\ }
+    \tl_remove_all:Nn \g__nju_info_title_tl { \\ }
+\bool_if:NF \g__nju_draft_bool
+  {
+    \bool_if:NT \g__nju_decl_bool
+      {
+        \__nju_make_origdecl:
+        \AtEndEnvironment { document }
+          { \__nju_make_authdecl: }
+      }
+  }
     \cleardoublepage
     \exp_args:NV \pagestyle \c__nju_pagestyle_tl
     \pagenumbering { Roman }
@@ -1114,30 +1178,30 @@
   }
 \__nju_declare_element:nn { abstract / mark }
   {
-    content     = \c__nju_name_abstract_b_tl,
+    content     = \g__nju_name_abstract_b_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
 \__nju_declare_element:nn { abstract / en / mark }
   {
-    content     = \c__nju_name_abstract_b_en_tl,
+    content     = \g__nju_name_abstract_b_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 1 cm
   }
 \cs_new_protected:Npn \__nju_print_keywords:nn #1#2
   {
-    \tl_set:Nv \l__nju_tmp_tl { c__nju_name_keywords #1 _tl }
-    \__nju_get_text_width:NV \l__nju_tmp_dim \l__nju_tmp_tl
-    \list { \l__nju_tmp_tl }
+    \tl_set:Nv \l__nju_tmpa_tl { g__nju_name_keywords #1 _tl }
+    \__nju_get_text_width:NV \l__nju_tmpa_dim \l__nju_tmpa_tl
+    \list { \l__nju_tmpa_tl }
       {
-        \labelwidth  \l__nju_tmp_dim
+        \labelwidth  \l__nju_tmpa_dim
         \labelsep    \c_zero_dim
         \leftmargin  \c_zero_dim
         \rightmargin \c_zero_dim
-        \advance \leftmargin \l__nju_tmp_dim
+        \advance \leftmargin \l__nju_tmpa_dim
         \cs_set_eq:NN \makelabel \textbf
       }
-    \item \clist_use:cn { l__nju_info_keywords #1 _clist } { #2 }
+    \item \clist_use:cn { g__nju_info_keywords #1 _clist } { #2 }
     \endlist
   }
 \skip_new:N \g__nju_abs_title_left_skip
@@ -1167,7 +1231,7 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \__nju_abs_bookmark:Vn \c__nju_name_abstract_a_tl { abstract }
+    \__nju_abs_bookmark:Vn \g__nju_name_abstract_a_tl { abstract }
     \__nju_make_abstract:
     \group_begin: \kaishu \zihao { -4 } #1
   }
@@ -1176,17 +1240,17 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \__nju_abs_bookmark:Vn \c__nju_name_abstract_a_en_tl { abstract-en }
+    \__nju_abs_bookmark:Vn \g__nju_name_abstract_a_en_tl { abstract-en }
     \__nju_make_abstract_en:
     \group_begin: \zihao { -4 } #1
   }
   { \__nju_print_keywords:nn { _en } { ;~ } \group_end: }
 \NewDocumentEnvironment { preface         } { +b }
-  { \__nju_chapter:V \c__nju_name_preface_tl         #1 } { }
+  { \__nju_chapter:V \g__nju_name_preface_tl         #1 } { }
 \NewDocumentEnvironment { acknowledgement } { +b }
-  { \__nju_chapter:V \c__nju_name_acknowledgement_tl #1 } { }
+  { \__nju_chapter:V \g__nju_name_acknowledgement_tl #1 } { }
 \NewDocumentCommand \njupaperlist
-  { O { \c__nju_name_paperlist_tl } m }
+  { O { \g__nju_name_paperlist_tl } m }
   {
     \group_begin:
     \RenewDocumentCommand \mkbibnamegiven  { m }
@@ -1206,7 +1270,7 @@
 \cs_new_protected:Npn \__nju_notation_label:n #1 { #1 \hfil }
 \cs_new_protected:Npn \__nju_make_notation:nn #1#2
   {
-    \dim_set:Nn \l__nju_tmp_dim { \textwidth - #1 - #2 }
+    \dim_set:Nn \l__nju_tmpa_dim { \textwidth - #1 - #2 }
     \list { }
       {
         \labelwidth #2
@@ -1213,7 +1277,7 @@
         \labelsep   \c_zero_dim
         \itemsep    \c_zero_dim
         \parsep     \c_zero_dim
-        \leftmargin  .5\l__nju_tmp_dim
+        \leftmargin  .5\l__nju_tmpa_dim
         \rightmargin \leftmargin
         \advance \leftmargin #2
         \cs_set_eq:NN \makelabel \__nju_notation_label:n
@@ -1221,13 +1285,13 @@
   }
 \NewDocumentEnvironment { notation } { O { 10 em } O { 5 em } }
   {
-    \__nju_chapter:V \c__nju_name_notation_tl
+    \__nju_chapter:V \g__nju_name_notation_tl
     \__nju_make_notation:nn { #1 } { #2 }
   }
   { \endlist }
 \NewDocumentEnvironment { notation* } { O { 10 em } O { 5 em } }
   {
-    \chapter * { \c__nju_name_notation_tl }
+    \chapter * { \g__nju_name_notation_tl }
     \__nju_make_notation:nn { #1 } { #2 }
   }
   { \endlist }



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