texlive[70705] Master/texmf-dist: njuthesis (19mar24)

commits+karl at tug.org commits+karl at tug.org
Tue Mar 19 21:38:58 CET 2024


Revision: 70705
          https://tug.org/svn/texlive?view=revision&revision=70705
Author:   karl
Date:     2024-03-19 21:38:58 +0100 (Tue, 19 Mar 2024)
Log Message:
-----------
njuthesis (19mar24)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/njuthesis/README.md
    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-doc.cls
    trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def
    trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-postdoctoral.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/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/njuthesis/README.md	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/doc/latex/njuthesis/README.md	2024-03-19 20:38:58 UTC (rev 70705)
@@ -46,4 +46,4 @@
 
 -----
 
-Copyright (C) 2021 - 2023 by NJU LUG.
+Copyright (C) 2021 - 2024 by NJU LUG.

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	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.dtx	2024-03-19 20:38:58 UTC (rev 70705)
@@ -2,7 +2,7 @@
 % !TeX program  = XeLaTeX
 % !TeX encoding = UTF-8
 %
-% Copyright (C) 2021 - 2023
+% Copyright (C) 2021 - 2024
 % by Nanjing University Linux User Group
 % <git+nju-lug-email-3104-issue- at yaoge123.cn>
 %
@@ -49,7 +49,7 @@
 
 \preamble
 
-Copyright (C) 2021 - 2023
+Copyright (C) 2021 - 2024
 by Nanjing University Linux User Group
 <git+nju-lug-email-3104-issue- at yaoge123.cn>
 
@@ -112,16 +112,16 @@
 %
 %<class>\NeedsTeXFormat{LaTeX2e}
 %<*!(driver|install)>
-%<+!driver>\GetIdInfo $Id: njuthesis.dtx 1.3.2 2023-12-05 16:30:00
+%<+!driver>\GetIdInfo $Id: njuthesis.dtx 1.4.0 2024-03-19 20:30:00
 %<+!driver>  +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
 %<class>  {Thesis template for Nanjing University}
 %<class>\ProvidesExplClass{njuthesis}
 %<def-u>  {Undergraduate definition file for njuthesis}
+% ^^A 诚耀百廿,雄创一流
+% ^^A 南京大学一百二十周年华诞邀您共襄盛举!
 %<def-u>\ProvidesExplFile{njuthesis-undergraduate.def}
 %<def-g>  {Graduate definition file for njuthesis}
 %<def-g>\ProvidesExplFile{njuthesis-graduate.def}
-% ^^A 诚耀百廿,雄创一流
-% ^^A 南京大学一百二十周年华诞邀您共襄盛举!
 %<def-p>  {Postdoctoral definition file for njuthesis}
 %<def-p>\ProvidesExplFile{njuthesis-postdoctoral.def}
 %<doc-cls>  {Documentation style for njuthesis}
@@ -148,7 +148,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{v1.3.2 \quad 2023-12-05}
+% \date{v1.4.0 \quad 2024-03-19}
 %
 % \changes{v0.1}{2021/09/04}{开始开发。}
 % \changes{v0.2}{2021/09/07}{初步搭建了可用的模板。}
@@ -183,6 +183,8 @@
 % \changes{v1.0}{2022/08/02}{删除 \LaTeX 基础用法的说明。}
 % \changes{v1.1}{2023/01/05}{适配2023届本科生毕业毕业论文(设计)规范。}
 % \changes{v1.1}{2023/01/05}{适配新版南大 \LaTeX 在线编辑器。}
+% \changes{v1.4}{2024/03/11}{总是全局修改全局变量。}
+% \changes{v1.4}{2024/03/18}{将变量统一为 |l| 类型。}
 %
 % \maketitle
 %
@@ -232,7 +234,7 @@
 % 用户组维护的,用于处理本校学生毕业论文排版需求的 \LaTeX 模板。
 %
 % 本模板使用的本科生毕业论文模板格式依据
-% 《关于启动南京大学2023届本科毕业论文(设计)工作的通知》\cite{nju-bachelor-2023},
+% 《关于启动南京大学2024届本科毕业论文(设计)工作的通知》\cite{nju-bachelor-2024},
 % 研究生学位论文格式依据研究生院提供的材料包\cite{nju-graduate-2023}。
 % 博士后出站报告格式要求与博士学位论文一致\cite{nju-postdoc-2022},
 % 封面、摘要的设计参考了部分既有报告。
@@ -799,9 +801,9 @@
 % 新的一章以及封面、摘要、参考文献表等特殊页面都会从奇数页开始,
 % 在奇数页结束的内容后会补上一页空页,更适合印刷输出。
 %
-% \begin{function}[added=2021-12-15]{draft}
+% \begin{function}[added=2021-12-15,updated=2024-03-19]{draft}
 %   \begin{syntax}
-%     \OPT{draft} = <\TFF>
+%      <\OPT{draft}>
 %   \end{syntax}
 % 是否开启草稿模式,默认关闭。
 % \end{function}
@@ -894,14 +896,23 @@
 %
 % 学校论文格式要求使用的字体一般已经预装在各个操作系统,
 % 本模板针对不同平台进行了自动检测适配,可以开箱即用。
-% 如果希望更改本模板使用的字体,请填写以下两个选项以覆盖默认设置。
+% 如果希望更改本模板使用的字体,请填写以下选项以覆盖默认设置。
 %
+% \begin{function}[added=2023-12-15]{fontset}
+%   \begin{syntax}
+%     \OPT{fontset} = <win|macoffice|mac|fandol|none>
+%   \end{syntax}
+% 手动指定字体库。
+% \end{function}
+%
+% \opt{fontset} 这个选项名继承自 \pkg{ctex},相当于在本模板中分别填写以下两项。
+%
 % \begin{function}[added=2021-09-07,updated=2021-12-18]{cjk-font,latin-font}
 %   \begin{syntax}
 %     \OPT{cjk-font} = <win|mac|fandol|founder|noto|source|none>
 %     \OPT{latin-font} = <win|mac|gyre|none>
 %   \end{syntax}
-% 手动指定字体。
+% 更精细的字体库设定。
 % \end{function}
 %
 % 根据学校论文格式的要求,本模板使用的中文字体主要有{\songti 宋体}、
@@ -923,16 +934,17 @@
 % 字体文件目录。
 % \end{function}
 %
-% 模板用到的部分字体(例如华文中宋)可能尚未安装在操作系统,
-% 可以使用此选项手动指定搜索路径。
+% 模板用到的部分字体可能尚未安装在操作系统,可以使用此选项手动指定搜索路径。
+% 例如,研究生模板封面上使用到了华文中宋,该字体默认只存在于
+% \opt{win} 和 \opt{macoffice} 对应的系统配置,
+% 在其他平台编译需使用此选项手动指向 \file{STZHONGS.TTF}。
 %
-% ^^A 本模板默认使用操作系统安装的字体。可以使用本选项从任意目录载入字体。
-%
 % \paragraph{中文}
 %
 % 本模板提供的中文字体配置如表 \ref{tab:cjk-fontset} 所示。
 % 在不指定字体配置的情况下,本模板默认使用与操作系统相对应的字体配置
-% (见表中前三行,Windows 和 macOS 以外的系统采用
+% (见表中前四行,在装有 MS Office 的 macOS 上优先使用 Office 字体库。
+% Windows 和 macOS 以外的系统采用
 % \href{https://www.ctan.org/pkg/fandol}{Fandol} 配置)。
 % 此外,我们也单独提供了\href{https://www.foundertype.com}
 % {方正}和\href{https://github.com/adobe-fonts}{思源}两套中文字体配置。
@@ -955,13 +967,15 @@
 %       表示思源字体,请下载 Simplified Chinese(即后缀名为 SC)的版本},
 %     note{e} = {思源字体并不包含楷书和仿宋,而 Adobe
 %       楷体和仿宋难以直接下载,因此使用方正字体代替} ]
-%     { cell{2}{2,4} = {white!70!njuyellow},
-%       cell{4}{4}   = {white!70!njuyellow},
+%     { cell{2}{2-5} = {white!70!njuyellow},
+%       cell{3}{2-5} = {white!70!njuyellow},
+%       cell{5-8}{4} = {white!70!njuyellow},
 %       colspec = {ccccc} }
 %   \toprule
 %     配置名称         & 宋体             & 黑体               & 楷书          & 仿宋          \\
 %   \midrule
 %     \opt{win}        & 中易宋体         & 中易黑体           & 中易楷体      & 中易仿宋      \\
+%     \opt{macoffice}  & 中易宋体         & 中易黑体           & 中易楷体      & 中易仿宋      \\
 %     \opt{mac}        & 华文宋体         & 华文黑体           & 华文楷体      & 华文仿宋      \\
 %     \opt{fandol}     & Fandol 宋体      & Fandol 黑体        & Fandol 楷体   & Fandol 仿宋   \\
 %     \opt{founder}\TA & \FZ{51}{书宋}\TB & \FZ{61}{细黑一}\TC & \FZ{37}{楷体} & \FZ{28}{仿宋} \\
@@ -993,16 +1007,17 @@
 %       note{a} = {TG 表示 \href{http://www.gust.org.pl/projects/e-foundry/tex-gyre}{\TeX~Gyre}。} ]
 %     { colspec = {cccc} }
 %     \toprule
-%       配置名称   & 衬线体          & 无衬线体   & 等宽字体    \\
+%       配置名称         & 衬线体          & 无衬线体   & 等宽字体    \\
 %     \midrule
-%       \opt{win}  & Times~New~Roman & Arial      & Courier~New \\
-%       \opt{mac}  & Times~New~Roman & Arial      & Menlo       \\
-%       \opt{gyre} & \TG{Termes}     & \TG{Heros} & \TG{Cursor} \\
+%       \opt{win}        & Times~New~Roman & Arial      & Courier~New \\
+%       \opt{macoffice}  & Times~New~Roman & Arial      & Menlo       \\
+%       \opt{mac}        & Times~New~Roman & Arial      & Menlo       \\
+%       \opt{gyre}       & \TG{Termes}     & \TG{Heros} & \TG{Cursor} \\
 %     \bottomrule
 %   \end{talltblr}
 % \end{table}
 %
-% macOS 用户需要额外注意的是,此系统内置的 Times New Roman 并没有 smcp
+% macOS 用户需要额外注意的是,系统内置的 Times New Roman 并没有 smcp
 % 这一特性,所以 \tn{textsc} 命令无法产生正确的小型大写字母字型,导致
 % 研究生模板英文封面的部分内容不能正确显示。另外,macOS 中的 Times 字体
 % 也不包含 smcp 特性。
@@ -2393,11 +2408,11 @@
 % \newblock \textit{信息与文献\quad 参考文献著录规则: GB/T 7714--2015} [S].
 % \newblock 北京: 中国标准出版社, 2015
 %
-% \bibitem{nju-bachelor-2023}
+% \bibitem{nju-bachelor-2024}
 % 南京大学本科生院.
-% \newblock \textit{关于启动南京大学2022届本科毕业论文(设计)工作的通知} [EB/OL].
-% \newblock (2022-12-19)
-% \urlprefix\url{https://jw.nju.edu.cn/29/d8/c26263a600536/page.htm}
+% \newblock \textit{关于启动南京大学2024届本科毕业论文(设计)工作的通知} [EB/OL].
+% \newblock (2023-12-19)
+% \urlprefix\url{https://jw.nju.edu.cn/db/23/c26263a645923/page.htm}
 %
 % \bibitem{nju-graduate-2023}
 % 南京大学研究生院.
@@ -2637,6 +2652,7 @@
 \@ifpackagelater { expl3 } { 2023/10/10 } { }
   {
     \cs_generate_variant:Nn \tl_set:Nn        { Ne }
+    \cs_generate_variant:Nn \tl_gset:Nn       { Ne }
     \cs_generate_variant:Nn \tl_const:Nn      { Ne }
     \cs_generate_variant:Nn \tl_gput_right:Nn { Ne }
   }
@@ -2700,11 +2716,11 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\g_@@_opt_twoside_bool}
-% 定义用于判断是否使用双面模式的变量,初始值为使用双面模式。
+% \begin{variable}{\g_@@_opt_draft_bool}
+% 用于判断草稿模式的变量。
 %    \begin{macrocode}
-\bool_new:N      \g_@@_opt_twoside_bool
-\bool_set_true:N \g_@@_opt_twoside_bool
+\bool_new:N        \g_@@_opt_draft_bool
+\bool_gset_false:N \g_@@_opt_draft_bool
 %    \end{macrocode}
 % \end{variable}
 %
@@ -2726,11 +2742,23 @@
 % \end{variable}
 %
 % \begin{variable}{
+%   \g_@@_info_major_tl,
+%   \g_@@_info_majorc_tl}
+% 用于存储专业名称的变量。
+%    \begin{macrocode}
+\tl_new:N \g_@@_info_major_tl
+\tl_new:N \g_@@_info_majorc_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{
+%   \g_@@_font_set_tl,
 %   \g_@@_font_latin_tl,
 %   \g_@@_font_cjk_tl,
 %   \g_@@_font_math_tl}
 % 存储所使用字体名称的全局变量。
 %    \begin{macrocode}
+\tl_new:N \g_@@_font_set_tl
 \tl_new:N \g_@@_font_latin_tl
 \tl_new:N \g_@@_font_cjk_tl
 \tl_new:N \g_@@_font_math_tl
@@ -2815,11 +2843,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_quad:,\@@_qquad:}
+% \begin{macro}{\@@_space:,\@@_quad:,\@@_qquad:}
 % 等价于 \LaTeXe{} 中的 \tn{quad} 和 \tn{qquad}。
 %    \begin{macrocode}
-\cs_new:Nn \@@_quad:  { \skip_horizontal:n { 1 em } }
-\cs_new:Nn \@@_qquad: { \skip_horizontal:n { 2 em } }
+\cs_new:Nn \@@_space: { \skip_horizontal:n { .5 em } }
+\cs_new:Nn \@@_quad:  { \skip_horizontal:n {  1 em } }
+% \cs_new:Nn \@@_qquad: { \skip_horizontal:n {  2 em } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2826,8 +2855,8 @@
 % \begin{macro}{\@@_vskip:,\@@_hskip:}
 % 生成一个较小的 skip。
 %    \begin{macrocode}
-\cs_new:Nn \@@_vskip: { \skip_vertical:N   \c_@@_vsep_dim }
-\cs_new:Nn \@@_hskip: { \skip_horizontal:N \c_@@_hsep_dim }
+\cs_new:Nn \@@_vskip: { \skip_vertical:N   \l_@@_vsep_dim }
+\cs_new:Nn \@@_hskip: { \skip_horizontal:N \l_@@_hsep_dim }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2849,13 +2878,16 @@
 % \begin{macro}{\@@_define_name:nn,\@@_define_name:nnn}
 % 用来定义默认名称的辅助函数。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_define_name:nn #1#2
-  { \tl_const:cn { c_@@_name_ #1    _tl } {#2} }
-\cs_new_protected:Npn \@@_define_name:nnn #1#2#3
+\cs_new:Npn \@@_define_name:nn #1
   {
-    \tl_const:cn { c_@@_name_ #1    _tl } {#2}
-    \tl_const:cn { c_@@_name_ #1 _en_tl } {#3}
+    \tl_new:c  { l_@@_name_ #1    _tl }
+    \tl_set:cn { l_@@_name_ #1    _tl }
   }
+\cs_new:Npn \@@_define_name:nnn #1#2#3
+  {
+    \@@_define_name:nn { #1     } {#2}
+    \@@_define_name:nn { #1 _en } {#3}
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2862,8 +2894,7 @@
 % \begin{macro}{\@@_define_fmt:nn}
 % 用来定义默认样式的辅助函数。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_define_fmt:nn #1#2
-  { \tl_const:cn { c_@@_fmt_ #1 _tl } {#2} }
+\cs_new:Npn \@@_define_fmt:nn #1 { \tl_set:cn { l_@@_fmt_ #1 _tl } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2870,19 +2901,25 @@
 % \begin{macro}{\@@_define_dim:nn,\@@_define_skip:nn}
 % 用来定义默认间距的辅助函数。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_define_dim:nn #1#2
-  { \dim_const:cn  { c_@@_ #1 _dim  } {#2} }
-\cs_new_protected:Npn \@@_define_skip:nn #1#2
-  { \skip_const:cn { c_@@_ #1 _skip } {#2} }
+\cs_new:Npn \@@_define_dim:nn  #1
+  {
+    \dim_new:c   { l_@@_ #1 _dim  }
+    \dim_set:cn  { l_@@_ #1 _dim  }
+  }
+\cs_new:Npn \@@_define_skip:nn #1
+  {
+    \skip_new:c  { l_@@_ #1 _skip }
+    \skip_set:cn { l_@@_ #1 _skip }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_name:n,\@@_info:n,\@@_fmt:n}
+% \begin{macro}{\@@_info:n,\@@_name:n,\@@_fmt: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 { g_@@_info_ #1 _tl } }
-\cs_new:Npn \@@_fmt:n  #1 { \tl_use:c { c_@@_fmt_  #1 _tl } }
+\cs_new:Npn \@@_name:n #1 { \tl_use:c { l_@@_name_ #1 _tl } }
+\cs_new:Npn \@@_fmt:n  #1 { \tl_use:c { l_@@_fmt_  #1 _tl } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2951,7 +2988,7 @@
 \cs_new_protected:Npn \@@_box_ulined:NN #1#2
   {
     \mode_leave_vertical:
-    \rule [ \c_@@_ruledpi_dim ] {#1} { \c_@@_rulehti_dim }
+    \rule [ \l_@@_ruledpi_dim ] {#1} { \l_@@_rulehti_dim }
     \skip_horizontal:n { -#1 }
     \hbox_to_wd:nn {#1} { \tex_hfil:D #2 \tex_hfil:D }
   }
@@ -3006,12 +3043,12 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_box_spread_name:Nn,\@@_box_spread_name:NNn}
-% 以上盒子只用来打印 \cs[no-index]{c_@@_name_\meta{描述}_tl} 变量。
+% 以上盒子只用来打印 \cs[no-index]{l_@@_name_\meta{描述}_tl} 变量。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_box_spread_name:Nn #1#2
-  { \@@_box_spread:NNv #1 \c_empty_tl { c_@@_name_ #2 _tl } }
+  { \@@_box_spread:NNv #1 \c_empty_tl { l_@@_name_ #2 _tl } }
 \cs_new_protected:Npn \@@_box_spread_name:NNn #1#2#3
-  { \@@_box_spread:NNv #1 #2 { c_@@_name_ #3 _tl } }
+  { \@@_box_spread:NNv #1 #2 { l_@@_name_ #3 _tl } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3046,7 +3083,7 @@
 % \changes{v1.1}{2022/11/29}{修复空返回值在国家图书馆封面引发的死循环。}
 % 防止空的返回值引发死循环。
 %    \begin{macrocode}
-        \clist_pop:NNF #3 #2 { \tl_set_eq:NN #2 \c_empty_tl }
+        \clist_gpop:NNF #3 #2 { \tl_set_eq:NN #2 \c_empty_tl }
         \@@_box_ulined:NN #4 #2 \tex_par:D
       }
   }
@@ -3069,7 +3106,7 @@
 \cs_new_protected:Npn \@@_uline:n #1
   {
     \mode_leave_vertical:
-    \rule [ \c_@@_ruledpi_dim ] {#1} { \c_@@_rulehti_dim }
+    \rule [ \l_@@_ruledpi_dim ] {#1} { \l_@@_rulehti_dim }
     \skip_horizontal:n { -#1 }
   }
 %    \end{macrocode}
@@ -3084,9 +3121,9 @@
 \cs_new_protected:Npn \@@_uuline:N #1
   {
     \mode_leave_vertical:
-    \rule [ \c_@@_ruledpii_dim  ] {#1} { \c_@@_rulehtii_dim }
+    \rule [ \l_@@_ruledpii_dim  ] {#1} { \l_@@_rulehtii_dim }
     \skip_horizontal:n { -#1 }
-    \rule [ \c_@@_ruledpiii_dim ] {#1} { \c_@@_rulehtii_dim }
+    \rule [ \l_@@_ruledpiii_dim ] {#1} { \l_@@_rulehtii_dim }
     \skip_horizontal:n { -#1 }
   }
 %    \end{macrocode}
@@ -3164,7 +3201,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_uline_entry:Nn #1#2
   {
-    \@@_get_width_print:Nv #1 { c_@@_name_ #2 _tl }
+    \@@_get_width_print:Nv #1 { l_@@_name_ #2 _tl }
     \@@_box_ulined_info:Nn #1 {#2}
   }
 %    \end{macrocode}
@@ -3179,7 +3216,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_uline_bientry:Nn #1#2
   {
-    \@@_get_width_print:Nv #1 { c_@@_name_ #2 _tl }
+    \@@_get_width_print:Nv #1 { l_@@_name_ #2 _tl }
     \dim_sub:Nn #1 { \textwidth / 2 }
     \@@_box_ulined_info:Nn #1 {#2}
   }
@@ -3219,7 +3256,7 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_date:nnn #1#2#3
   {
-    \tl_set:cx { g_@@_info_ #2 date #1 _tl }
+    \tl_gset:cx { g_@@_info_ #2 date #1 _tl }
       {
         \tl_if_empty:nTF {#3}
           { \@@_name:n { blankdate #1 } }
@@ -3279,7 +3316,7 @@
 \cs_new:Npn \@@_breakpar_loop:n #1
   {
     \dim_set:Nn \l_@@_tmpa_dim
-      { - \tex_prevdepth:D - \c_@@_ruledpi_dim - \c_@@_rulehti_dim }
+      { - \tex_prevdepth:D - \l_@@_ruledpi_dim - \l_@@_rulehti_dim }
     \hbox_gset:Nn \l_@@_tmpc_box { }
     \@@_loop_until:nnn { \box_if_empty_p:N \l_@@_tmpb_box }
       {
@@ -3364,7 +3401,7 @@
 %    \begin{macrocode}
     \parbox [ t ] {#3}
       {
-        \c_@@_fmt_covertitle_tl \@@_uline_title:
+        \l_@@_fmt_covertitle_tl \@@_uline_title:
         \dim_gset_eq:NN \l_@@_tmpa_dim \tex_prevdepth:D
       }
     \tex_par:D
@@ -3443,9 +3480,9 @@
 % 此时 \tn{njuemblem}、\tn{njuname} 和相关长度都是没有定义的。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_emblem:N #1
-  { \njuemblem [ \c_@@_fmt_emblemcolor_tl ] {#1} { ! } }
+  { \njuemblem [ \l_@@_fmt_emblemcolor_tl ] {#1} { ! } }
 \cs_new_protected:Npn \@@_name:N   #1
-  { \njuname   [ \c_@@_fmt_namecolor_tl   ] {#1} { ! } }
+  { \njuname   [ \l_@@_fmt_namecolor_tl   ] {#1} { ! } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3784,7 +3821,27 @@
 % \subsection{模板选项}
 % \changes{v0.11}{2021/11/15}{进行了效率优化。}
 %
+% \begin{macro}{\@@_pass_option:nn}
+% 封装 \LaTeXe{} 传参函数。注意参数顺序有变化。
 %    \begin{macrocode}
+\cs_new:Npn \@@_pass_option:nn #1#2 { \PassOptionsToClass {#2} {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_pass_option:n,\@@_pass_option:V,\@@_pass_option:e}
+%    \begin{macrocode}
+\cs_new:Npn \@@_pass_option:n { \@@_pass_option:nn { ctexbook } }
+\cs_generate_variant:Nn \@@_pass_option:n { V }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_pass_option:}
+%    \begin{macrocode}
+\cs_new:Npn \@@_pass_option: { \@@_pass_option:V \l_keys_key_str }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 \keys_define:nn { nju }
   {
 %    \end{macrocode}
@@ -3805,9 +3862,9 @@
 %    \begin{macrocode}
     degree              .choice:,
     degree / academic     .code:n  =
-      { \bool_set_true:N  \g_@@_opt_academic_bool },
+      { \bool_gset_true:N  \g_@@_opt_academic_bool },
     degree / professional .code:n  =
-      { \bool_set_false:N \g_@@_opt_academic_bool },
+      { \bool_gset_false:N \g_@@_opt_academic_bool },
     degree             .initial:n  = academic,
 %    \end{macrocode}
 % \end{macro}
@@ -3816,7 +3873,7 @@
 % 是否需要国家图书馆封面。本选项仅用于研究生模板,默认关闭。
 % \footnote{nl 代表 National Library。}
 %    \begin{macrocode}
-    nl-cover          .bool_set:N  = \g_@@_opt_nlcover_bool,
+    nl-cover         .bool_gset:N  = \g_@@_opt_nlcover_bool,
     nl-cover           .initial:n  = false,
 %    \end{macrocode}
 % \end{macro}
@@ -3828,17 +3885,22 @@
 % \footnote{原创性声明的英文翻译为 Declaration of Originality,
 % 为了使选项表义更清晰同时缩减名称长度,将其修改为“声明页”这一名称。}
 %    \begin{macrocode}
-    decl-page         .bool_set:N  = \g_@@_opt_decl_bool,
+    decl-page        .bool_gset:N  = \g_@@_opt_decl_bool,
     decl-page          .initial:n  = false,
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{draft,\g_@@_opt_draft_bool}
+% \begin{macro}{draft}
 % \changes{v0.13}{2021/12/15}{新增草稿模式选项。}
+% \changes{v1.4}{2024/03/19}{草稿模式选项不接受传入值。}
 % 是否开启草稿模式(默认关闭)。
 %    \begin{macrocode}
-    draft            .bool_gset:N  = \g_@@_opt_draft_bool,
-    draft              .initial:n  = false,
+    draft      .value_forbidden:n  = true,
+    draft                 .code:n  =
+      {
+        \bool_gset_true:N \g_@@_opt_draft_bool
+        \@@_pass_option:
+      },
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3848,7 +3910,18 @@
 %    \begin{macrocode}
     oneside    .value_forbidden:n  = true,
     twoside    .value_forbidden:n  = true,
-    oneside  .bool_gset_inverse:N  = \g_@@_opt_twoside_bool,
+    oneside               .code:n  =
+      {
+        \bool_gset_false:N \g_@@_opt_twoside_bool
+        \tl_gset:Nn \g_@@_name_pagemode_tl { oneside }
+        \@@_pass_option:
+      },
+    twoside               .code:n  =
+      {
+        \bool_gset_true:N  \g_@@_opt_twoside_bool
+        \tl_gset:Nn \g_@@_name_pagemode_tl { twoside }
+        \@@_pass_option:
+      },
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3858,7 +3931,7 @@
 % \begin{macro}{\g_@@_opt_anon_bool}
 % 盲审模式。
 %    \begin{macrocode}
-    anonymous         .bool_set:N  = \g_@@_opt_anon_bool,
+    anonymous        .bool_gset:N  = \g_@@_opt_anon_bool,
     anonymous          .initial:n  = false,
 %    \end{macrocode}
 % \end{macro}
@@ -3866,17 +3939,27 @@
 %
 % \begin{macro}{latin-font,cjk-font}
 % \changes{v0.14}{2021/12/12}{简化字体选项名称。}
-% 中英文字体选项。
+% 中英文字体选项。\opt{fandol} 和 \opt{gyre} 是等价的。
 %    \begin{macrocode}
     latin-font         .choices:nn =
-      { gyre, mac, win, none }
-      { \tl_set_eq:NN \g_@@_font_latin_tl \l_keys_choice_tl },
+      { fandol, gyre, mac, macoffice, win, none }
+      { \tl_gset:Nn \g_@@_font_latin_tl {#1} },
     cjk-font           .choices:nn =
-      { fandol, founder, mac, noto, source, win, none }
-      { \tl_set_eq:NN \g_@@_font_cjk_tl   \l_keys_choice_tl },
+      { fandol, founder, mac, macoffice, noto, source, win, none }
+      { \tl_gset:Nn \g_@@_font_cjk_tl   {#1} },
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{latin-font,cjk-font}
+% \changes{v1.4}{2023/12/15}{增加统一的字体选项名称。}
+% 中英文字体选项。\opt{fontset} 这个名称和 \pkg{ctex} 是一致的。
+%    \begin{macrocode}
+    fontset            .choices:nn =
+      { fandol, mac, macoffice, win, none }
+      { \keys_set:nn { nju } { latin-font = #1, cjk-font = #1 } },
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{math-font}
 % \changes{v1.0}{2022/07/02}{增加数学字库选择功能。}
 % 数学字体选项。
@@ -3887,7 +3970,7 @@
         asana, cambria, fira, garamond, lm, libertinus, newcm,
         stix, bonum, dejavu, pagella, schola, termes, xits, none
       }
-      { \tl_set_eq:NN \g_@@_font_math_tl  \l_keys_choice_tl },
+      { \tl_gset_eq:NN \g_@@_font_math_tl  \l_keys_choice_tl },
     math-font          .initial:n  = xits,
 %    \end{macrocode}
 % \end{macro}
@@ -3897,8 +3980,8 @@
 %    \begin{macrocode}
     font-path             .code:n  =
       {
-        \bool_set_true:N \g_@@_font_path_bool
-        \tl_set_eq:NN \g_@@_font_path_tl \l_keys_value_tl
+        \bool_gset_true:N \g_@@_font_path_bool
+        \tl_gset_eq:NN \g_@@_font_path_tl \l_keys_value_tl
       },
 %    \end{macrocode}
 % \end{macro}
@@ -3908,7 +3991,8 @@
 % \begin{macro}{\g_@@_opt_zihao_tl}
 % 字号。默认为小四号。
 %    \begin{macrocode}
-    zihao               .tl_set:N  = \g_@@_opt_zihao_tl,
+    zihao                 .code:n  =
+      { \@@_pass_option:n { zihao      = #1 } },
     zihao              .initial:n  = -4,
 %    \end{macrocode}
 % \end{macro}
@@ -3921,7 +4005,8 @@
 % Word 行距,故默认值为 $1.5\times\frac{1.3}{1.2} = 1.625$。
 % 更详细的说明请参考 \pkg{zhlineskip} 宏包文档。
 %    \begin{macrocode}
-    linespread          .tl_set:N  = \g_@@_opt_linespread_tl,
+    linespread            .code:n  =
+      { \@@_pass_option:n { linespread = #1 } },
     linespread         .initial:n  = 1.625,
 %    \end{macrocode}
 % \end{macro}
@@ -3931,11 +4016,16 @@
 % \changes{v0.16}{2022/02/23}{新增 \opt{config} 选项。}
 % 配置文件路径。
 %    \begin{macrocode}
-    config           .clist_set:N  = \g_@@_config_clist
+    config          .clist_gset:N  = \g_@@_config_clist
   }
 %    \end{macrocode}
 % \end{macro}
 %
+% 初始化为双页模式。
+%    \begin{macrocode}
+\keys_set:nn { nju } { twoside }
+%    \end{macrocode}
+%
 % \begin{macro}{\g_@@_name_optional_pkg_clist}
 %    \begin{macrocode}
 \clist_new:N \g_@@_name_optional_pkg_clist
@@ -3962,7 +4052,7 @@
         \bool_if:cT { g_@@_opt_load_ #2 _bool }
           { \RequirePackage {#1} }
       }
-    \clist_put_right:Nn \g_@@_name_optional_pkg_clist {#1}
+    \clist_gput_right:Nn \g_@@_name_optional_pkg_clist {#1}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4022,18 +4112,11 @@
 \ProcessKeysOptions { nju }
 %    \end{macrocode}
 %
-% 处理单双面模式选项。
-%    \begin{macrocode}
-\bool_if:NTF \g_@@_opt_twoside_bool
-  { \tl_const:Nn \c_@@_name_pagemode_tl { twoside } }
-  { \tl_const:Nn \c_@@_name_pagemode_tl { oneside } }
-%    \end{macrocode}
-%
 % \changes{v1.1}{2022/09/26}{盲审模式下不显示声明页。}
 % 盲审模式下不显示声明页。
 %    \begin{macrocode}
 \bool_if:NT \g_@@_opt_anon_bool
-  { \bool_set_false:N \g_@@_opt_decl_bool }
+  { \bool_gset_false:N \g_@@_opt_decl_bool }
 %    \end{macrocode}
 %
 %
@@ -4106,7 +4189,7 @@
 % 定义修改默认样式的接口。
 %    \begin{macrocode}
 \NewDocumentCommand \njusetformat { m m }
-  { \tl_gset:cn { c_@@_fmt_ #1 _tl } {#2} }
+  { \@@_define_fmt:nn {#1} {#2} }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4118,8 +4201,8 @@
 \NewDocumentCommand \njusetlength { s m m }
   {
     \bool_if:nTF {#1}
-      { \skip_gset:cn { c_@@_ #2 _skip } {#3} }
-      { \dim_gset:cn  { c_@@_ #2 _dim  } {#3} }
+      { \skip_gset:cn { l_@@_ #2 _skip } {#3} }
+      { \dim_gset:cn  { l_@@_ #2 _dim  } {#3} }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4149,9 +4232,9 @@
 \cs_new_protected:Npn \@@_set_tokenlist:nnnnn #1#2#3#4#5
   {
     \bool_if:nTF {#1}
-      { \tl_set_eq:NN \l_@@_tmpb_tl \c_@@_name_suffix_en_tl }
+      { \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_name_suffix_en_tl }
       { \tl_clear:N   \l_@@_tmpb_tl }
-    \tl_gset:cn { c_@@_ #5 _ #2 #3 \l_@@_tmpb_tl _tl } {#4}
+    \tl_gset:cn { l_@@_ #5 _ #2 #3 \l_@@_tmpb_tl _tl } {#4}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4164,33 +4247,16 @@
 % \changes{v0.12}{2021/12/07}{重新组织宏包载入顺序。}
 % 将选项传入 \cls{ctexbook} 文档类。
 %    \begin{macrocode}
-\exp_args:Ne \PassOptionsToClass
+\@@_pass_option:n
   {
     a4paper,
     UTF8,
     scheme = chinese,
 %    \end{macrocode}
-% 传入单双面模式选项。
-%    \begin{macrocode}
-    \c_@@_name_pagemode_tl,
-%    \end{macrocode}
-% 开启草稿模式后传入 |draft| 选项。
-%    \begin{macrocode}
-    \bool_if:NT \g_@@_opt_draft_bool { draft, }
-%    \end{macrocode}
-% 行距。
-%    \begin{macrocode}
-    linespread = \g_@@_opt_linespread_tl,
-%    \end{macrocode}
 % 默认不载入任何字体,供本模板自行设置。
 %    \begin{macrocode}
-    fontset    = none,
-%    \end{macrocode}
-% 正文字号设置。
-%    \begin{macrocode}
-    zihao      = \g_@@_opt_zihao_tl
+    fontset    = none
   }
-  { ctexbook }
 %    \end{macrocode}
 %
 % 传入各宏包选项。
@@ -4200,10 +4266,14 @@
 %    \end{macrocode}
 % 隐藏 |does not contain script "CJK"| 警告。
 %    \begin{macrocode}
-    { quiet   } { xeCJK    },
+%     { quiet   } { xeCJK    },
     { no-math } { fontspec },
     { perpage } { footmisc },
-    { capitalise, nameinlink, noabbrev } { cleveref }
+    { capitalise, nameinlink, noabbrev } { cleveref },
+%    \end{macrocode}
+% \pkg{ntheorem} 依赖 \pkg{amsthm} 和 \pkg{thmmarks} 实现 QED 符号等功能。
+%    \begin{macrocode}
+    { amsmath, thmmarks, noconfig      } { ntheorem }
   }
   { \PassOptionsToPackage #1 }
 %    \end{macrocode}
@@ -4261,23 +4331,18 @@
     booktabs,
     caption,
     graphicx,
+  }
+\@@_loadpkg_nthm:
 %    \end{macrocode}
-% 按以下顺序加载两个关于引用的包。
 % \pkg{hyperref} 覆写了大量命令,因此需要在其他包最后载入。
-% 仅有 \pkg{cleveref} 需要在 \pkg{hyperref} 后载入,否则会报错。
 %    \begin{macrocode}
-    hyperref
-  }
-\@@_loadpkg_cref:
+\RequirePackage { hyperref }
 %    \end{macrocode}
 %
-% \pkg{ntheorem} 依赖 \pkg{amsthm} 和 \pkg{thmmarks} 实现 QED 符号等功能。
+% \changes{v1.3}{2024/01/16}{调整 \pkg{cleveref} 到 \pkg{ntheorem} 后载入。}
+% \pkg{cleveref} 需要在 \pkg{ntheorem} 和 \pkg{hyperref} 后载入。
 %    \begin{macrocode}
-\bool_if:NT \g_@@_opt_load_nthm_bool
-  {
-    \PassOptionsToPackage { amsmath, thmmarks, noconfig } { ntheorem }
-    \RequirePackage { ntheorem }
-  }
+\@@_loadpkg_cref:
 %    \end{macrocode}
 %
 % 在双面模式下,使用 \pkg{emptypage} 清除空白页的页眉、页脚和页码。
@@ -4409,9 +4474,9 @@
 % \changes{v0.14}{2022/01/14}{将标题断行控制符修改为 |\\|。}
 % 题目。中文题目可使用 |\\| 手动断行。以下标注星号(|*|)的皆为对应的英文字段。
 %    \begin{macrocode}
-    title               .tl_set:N = \g_@@_info_title_tl             ,
+    title              .tl_gset:N = \g_@@_info_title_tl             ,
     title              .initial:n = { 空 }                            ,
-    title*              .tl_set:N = \g_@@_info_title_en_tl          ,
+    title*             .tl_gset:N = \g_@@_info_title_en_tl          ,
     title*             .initial:n = { Empty }                         ,
 %    \end{macrocode}
 % \end{macro}
@@ -4420,8 +4485,8 @@
 % \changes{v0.11}{2021/10/01}{修改了添加关键词的方式。}
 % 关键词列表。
 %    \begin{macrocode}
-    keywords         .clist_set:N = \g_@@_info_keywords_clist       ,
-    keywords*        .clist_set:N = \g_@@_info_keywords_en_clist    ,
+    keywords        .clist_gset:N = \g_@@_info_keywords_clist       ,
+    keywords*       .clist_gset:N = \g_@@_info_keywords_en_clist    ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4428,10 +4493,10 @@
 % \begin{macro}{info/grade,info/student-id,info/author,info/author*}
 % 年级、学号、姓名。
 %    \begin{macrocode}
-    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         ,
+    grade              .tl_gset:N = \g_@@_info_grade_tl             ,
+    student-id         .tl_gset:N = \g_@@_info_id_tl                ,
+    author             .tl_gset:N = \g_@@_info_author_tl            ,
+    author*            .tl_gset:N = \g_@@_info_author_en_tl         ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4439,11 +4504,11 @@
 %   info/major*,info/field,info/field*}
 % 院系、专业、方向。
 %    \begin{macrocode}
-    department          .tl_set:N = \g_@@_info_dept_tl              ,
-    department*         .tl_set:N = \g_@@_info_dept_en_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          ,
+    department         .tl_gset:N = \g_@@_info_dept_tl              ,
+    department*        .tl_gset:N = \g_@@_info_dept_en_tl           ,
+    major*             .tl_gset:N = \g_@@_info_major_en_tl          ,
+    field              .tl_gset:N = \g_@@_info_field_tl             ,
+    field*             .tl_gset:N = \g_@@_info_field_en_tl          ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4455,12 +4520,17 @@
     major                 .code:n =
       {
         \bool_if:NTF \g_@@_opt_academic_bool
-          { \clist_pop:NN  \l_keys_value_tl \g_@@_info_major_tl }
           {
-            \clist_pop:NN  \l_keys_value_tl \g_@@_info_majorc_tl
-            \clist_pop:NNF \l_keys_value_tl \g_@@_info_major_tl
-              { \tl_set_eq:NN \g_@@_info_major_tl \g_@@_info_majorc_tl }
+            \clist_pop:NN  \l_keys_value_tl \l_@@_tmpa_tl
+            \tl_gset_eq:NN \g_@@_info_major_tl \l_@@_tmpa_tl
           }
+          {
+            \clist_pop:NN  \l_keys_value_tl \l_@@_tmpa_tl
+            \tl_gset_eq:NN \g_@@_info_majorc_tl \l_@@_tmpa_tl
+            \clist_pop:NNTF \l_keys_value_tl \l_@@_tmpa_tl
+              { \tl_gset_eq:NN \g_@@_info_major_tl \l_@@_tmpa_tl }
+              { \tl_gset_eq:NN \g_@@_info_major_tl \g_@@_info_majorc_tl }
+          }
       },
 %    \end{macrocode}
 % \end{macro}
@@ -4470,8 +4540,8 @@
 % \changes{v0.14}{2022/01/12}{精简导师信息选项。}
 % 导师信息。中文导师全称使用 |clist| 存储,便于在本科生封面中进行分割。
 %    \begin{macrocode}
-    supervisor       .clist_set:N = \g_@@_info_supv_clist           ,
-    supervisor*         .tl_set:N = \g_@@_info_supv_en_tl           ,
+    supervisor      .clist_gset:N = \g_@@_info_supv_clist           ,
+    supervisor*        .tl_gset:N = \g_@@_info_supv_en_tl           ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4478,8 +4548,8 @@
 % \begin{macro}{info/supervisor-ii,info/supervisor-ii*}
 % 第二导师信息。
 %    \begin{macrocode}
-    supervisor-ii    .clist_set:N = \g_@@_info_supvii_clist         ,
-    supervisor-ii*      .tl_set:N = \g_@@_info_supvii_en_tl         ,
+    supervisor-ii   .clist_gset:N = \g_@@_info_supvii_clist         ,
+    supervisor-ii*     .tl_gset:N = \g_@@_info_supvii_en_tl         ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4486,8 +4556,8 @@
 % \begin{macro}{info/chairman,info/reviewer}
 % 答辩委员会信息。
 %    \begin{macrocode}
-    chairman            .tl_set:N = \g_@@_info_chairman_tl          ,
-    reviewer         .clist_set:N = \g_@@_info_reviewer_clist       ,
+    chairman           .tl_gset:N = \g_@@_info_chairman_tl          ,
+    reviewer        .clist_gset:N = \g_@@_info_reviewer_clist       ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4494,8 +4564,8 @@
 % \begin{macro}{info/clc,info/udc}
 % 分类号。
 %    \begin{macrocode}
-    clc                 .tl_set:N = \g_@@_info_clc_tl               ,
-    udc                 .tl_set:N = \g_@@_info_udc_tl               ,
+    clc                .tl_gset:N = \g_@@_info_clc_tl               ,
+    udc                .tl_gset:N = \g_@@_info_udc_tl               ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4502,7 +4572,7 @@
 % \begin{macro}{info/secret-level}
 % 密级。
 %    \begin{macrocode}
-    secret-level        .tl_set:N = \g_@@_info_secretlv_tl          ,
+    secret-level       .tl_gset:N = \g_@@_info_secretlv_tl          ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4509,7 +4579,7 @@
 % \begin{macro}{info/supervisor-contact}
 % 导师联系方式。
 %    \begin{macrocode}
-    supervisor-contact  .tl_set:N = \g_@@_info_supvcont_tl          ,
+    supervisor-contact .tl_gset:N = \g_@@_info_supvcont_tl          ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4517,7 +4587,7 @@
 % \changes{v0.14}{2022/01/12}{新增电邮地址设置项。}
 % 用于学位论文出版授权书的电子邮件地址。
 %    \begin{macrocode}
-    email               .tl_set:N = \g_@@_info_email_tl             ,
+    email              .tl_gset:N = \g_@@_info_email_tl             ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4525,7 +4595,7 @@
 % \changes{v1.2}{2023/04/27}{新增学校代码设置项。}
 % 学校代码。
 %    \begin{macrocode}
-    school-code         .tl_set:N = \g_@@_info_code_tl              ,
+    school-code        .tl_gset:N = \g_@@_info_code_tl              ,
     school-code        .initial:n = { 10284 }                       ,
 %    \end{macrocode}
 % \end{macro}
@@ -4534,8 +4604,8 @@
 % \changes{v1.2}{2023/04/24}{新增学位名称设置项。}
 % 覆盖预定义的学位字段。
 %    \begin{macrocode}
-    degree              .tl_set:N = \g_@@_info_degree_tl            ,
-    degree*             .tl_set:N = \g_@@_info_degree_en_tl         ,
+    degree             .tl_gset:N = \g_@@_info_degree_tl            ,
+    degree*            .tl_gset:N = \g_@@_info_degree_en_tl         ,
 %    \end{macrocode}
 % \end{macro}
 %
@@ -4591,15 +4661,15 @@
 %    \end{macrocode}
 % 拼合双导师的姓名和职称。
 %    \begin{macrocode}
-    \tl_set:Ne \g_@@_info_supvfull_tl
-      { \clist_use:Nn \g_@@_info_supv_clist { \@@_hskip: } }
+    \tl_gset:Ne \g_@@_info_supvfull_tl
+      { \clist_use:Nn \g_@@_info_supv_clist { \@@_quad: } }
     \clist_if_empty:NF \g_@@_info_supvii_clist
       {
         \bool_gset_true:N \g_@@_opt_supvii_bool
         \tl_gput_right:Ne \g_@@_info_supvfull_tl
-          { \@@_quad: \clist_use:Nn \g_@@_info_supvii_clist { \@@_hskip: } }
+          { \@@_quad: \clist_use:Nn \g_@@_info_supvii_clist { \@@_quad: } }
       }
-    \tl_set_eq:NN \g_@@_info_supvfull_en_tl \g_@@_info_supv_en_tl
+    \tl_gset_eq:NN \g_@@_info_supvfull_en_tl \g_@@_info_supv_en_tl
     \tl_if_empty:NF \g_@@_info_supvii_en_tl
       {
         \tl_gput_right:Ne \g_@@_info_supvfull_en_tl
@@ -4621,9 +4691,9 @@
 % \begin{variable}{\g_@@_info_confer_tl}
 %    \begin{macrocode}
 \tl_new:N  \g_@@_info_confer_tl
-\tl_set:Nn \g_@@_info_confer_tl
+\tl_gset:Nn \g_@@_info_confer_tl
   {
-    \textbf { \c_@@_name_nju_tl } \hfil
+    \textbf { \l_@@_name_nju_tl } \hfil
     \g_@@_info_conferdate_tl
   }
 %    \end{macrocode}
@@ -4636,7 +4706,7 @@
 % 文档类型字样。
 %    \begin{macrocode}
 \tl_new:N  \g_@@_info_type_tl
-\tl_set:Ne \g_@@_info_type_tl
+\tl_gset:Ne \g_@@_info_type_tl
   { \clist_item:Nn \c_@@_name_type_clist { \g_@@_info_type_int } }
 %    \end{macrocode}
 % \end{variable}
@@ -4645,9 +4715,9 @@
 % 学位类型字样。
 %    \begin{macrocode}
 \tl_new:N     \g_@@_info_degree_tl
-\tl_set_eq:NN \g_@@_info_degree_tl \g_@@_info_type_tl
+\tl_gset_eq:NN \g_@@_info_degree_tl \g_@@_info_type_tl
 \bool_if:NF \g_@@_opt_academic_bool
-  { \tl_put_right:Nn \g_@@_info_degree_tl { 专业 } }
+  { \tl_gput_right:Nn \g_@@_info_degree_tl { 专业 } }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -4655,7 +4725,7 @@
 % 英文的学位字样。
 %    \begin{macrocode}
 \tl_new:N  \g_@@_info_degree_en_tl
-\tl_set:Ne \g_@@_info_degree_en_tl
+\tl_gset:Ne \g_@@_info_degree_en_tl
   { \clist_item:Nn \c_@@_name_type_en_clist { \g_@@_info_type_int } }
 %</def-g>
 %    \end{macrocode}
@@ -4666,8 +4736,8 @@
 %<*class>
 \bool_if:NT \g_@@_opt_anon_bool
   {
-    \tl_gclear:N \c_@@_name_nju_tl
-    \tl_gclear:N \c_@@_name_nju_en_tl
+    \tl_clear:N \l_@@_name_nju_tl
+    \tl_clear:N \l_@@_name_nju_en_tl
   }
 %    \end{macrocode}
 %
@@ -4678,18 +4748,37 @@
 %
 % \subsubsection{操作系统检测}
 %
-% 调用 \pkg{ctex} 提供的操作系统检测。
+% \begin{variable}{\c_@@_path_macoffice_tl}
+% mac Office 字体路径。
 %    \begin{macrocode}
-\ctex_detect_platform:
+\tl_const:Nn \c_@@_path_macoffice_tl
+  { /Applications/Microsoft~ Word.app/Contents/Resources/DFonts/ }
 %    \end{macrocode}
+% \end{variable}
+%
+% 操作系统检测。相较于 \pkg{ctex} 提供的 \cs{ctex_detect_platform:},
+% 额外增加了对 macOS 上 MS Office 的检测。
+%    \begin{macrocode}
+\sys_if_platform_windows:TF
+  { \tl_gset:Nn \g_@@_font_set_tl { win } }
+  {
+    \ctex_if_platform_macos:TF
+      {
+        \file_if_exist:nTF { \c_@@_path_macoffice_tl times.ttf }
+          { \tl_gset:Nn \g_@@_font_set_tl { macoffice } }
+          { \tl_gset:Nn \g_@@_font_set_tl { mac       } }
+      }
+      { \tl_gset:Nn \g_@@_font_set_tl { fandol } }
+  }
+%    \end{macrocode}
 % 判断用户是否自定义了中英文字体。如果其中任意一种未被定义,
 % 则使用系统预装字体覆盖字体选项。
 % Windows 或 macOS 外的系统被判断为 Linux,一律使用自由字体。
 %    \begin{macrocode}
 \tl_if_empty:NT \g_@@_font_latin_tl
-  { \tl_gset_eq:NN \g_@@_font_latin_tl \g__ctex_fontset_tl }
+  { \tl_gset_eq:NN \g_@@_font_latin_tl \g_@@_font_set_tl }
 \tl_if_empty:NT \g_@@_font_cjk_tl
-  { \tl_gset_eq:NN \g_@@_font_cjk_tl   \g__ctex_fontset_tl }
+  { \tl_gset_eq:NN \g_@@_font_cjk_tl   \g_@@_font_set_tl }
 %    \end{macrocode}
 %
 %
@@ -4701,7 +4790,7 @@
 %   \@@_loadfont_latin_win:,\@@_loadfont_latin_mac:}
 % Windows 与 macOS 西文字体的区别主要在于默认等宽字体。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_loadfont_latin:n #1
+\cs_new:Npn \@@_loadfont_latin:n #1
   {
     \__fontspec_main_setmainfont:nn { } { Times~New~Roman }
     \__fontspec_main_setsansfont:nn { } { Arial           }
@@ -4727,6 +4816,36 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_loadfont_latin_macoffice:}
+% mac Office 西文字体。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_loadfont_latin_macoffice:
+  {
+    \__fontspec_main_setmainfont:nn
+      { \l_@@_name_macofficefeature_clist } { times }
+    \__fontspec_main_setsansfont:nn
+      { \l_@@_name_macofficefeature_clist } { arial }
+    \__fontspec_main_setmonofont:nn
+      { Scale     = MatchLowercase } { Menlo }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_name_macofficefeature_clist}
+% 用于 \pkg{fontspec} 的 mac Office 字体特性列表。
+%    \begin{macrocode}
+\clist_const:Nn \c_@@_name_macofficefeature_clist
+  {
+    Path           = \c_@@_path_macoffice_tl,
+    Extension      = .ttf,
+    UprightFont    = *,
+    BoldFont       = *bd,
+    ItalicFont     = *i,
+    BoldItalicFont = *bi
+  }
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\@@_loadfont_latin_gyre:}
 % 开源的 \TeX Gyre 西文字体。
 %    \begin{macrocode}
@@ -4747,6 +4866,13 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_loadfont_latin_fandol:}
+% 为兼容 \pkg{ctex} 做出的名称改变。
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_loadfont_latin_fandol:  \@@_loadfont_latin_gyre:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{variable}{\c_@@_name_gyrefeature_clist}
 % 用于 \pkg{fontspec} 的 \TeX Gyre 字体特性列表。
 %    \begin{macrocode}
@@ -4784,6 +4910,7 @@
     \setCJKfamilyfont { zhhei  } { SimHei   } [#1]
     \setCJKfamilyfont { zhfs   } { FangSong } [#1]
     \setCJKfamilyfont { zhkai  } { KaiTi    } [#1]
+    \@@_stzhongs:n {#1}
   }
 \cs_new:Npn \@@_loadfont_cjk_win:
   { \@@_loadfont_cjk_win:N \c_@@_name_fakebold_tl }
@@ -4814,8 +4941,30 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_loadfont_cjk_macoffice:n,\@@_loadfont_cjk_macoffice:}
+% mac Office 中文字体。
+%    \begin{macrocode}
+\cs_new:Npn \@@_loadfont_cjk_macoffice:n #1
+  {
+    \setCJKmainfont { Simsun.ttc   } [ ItalicFont = Kaiti.ttf, #1 ]
+    \setCJKsansfont { SimHei.ttf   } [#1]
+    \setCJKmonofont { Fangsong.ttf } [#1]
+    \setCJKfamilyfont { zhsong } { Simsun.ttc   } [#1]
+    \setCJKfamilyfont { zhhei  } { SimHei.ttf   } [#1]
+    \setCJKfamilyfont { zhfs   } { Fangsong.ttf } [#1]
+    \setCJKfamilyfont { zhkai  } { Kaiti.ttf    } [#1]
+    \@@_stzhongs:nn { STZHONGS.ttf } {#1}
+  }
+\cs_new:Npn \@@_loadfont_cjk_macoffice:
+  {
+    \@@_loadfont_cjk_macoffice:n
+      { Path = \c_@@_path_macoffice_tl, \c_@@_name_fakebold_tl }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_loadfont_cjk_fandol:}
-% Fandol 字体
+% Fandol 字体。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_loadfont_cjk_fandol:
   {
@@ -4895,7 +5044,7 @@
     \setCJKfamilyfont { zhhei  } { Noto~Sans~CJK~SC  }
     \setCJKfamilyfont { zhfs   } { FZFangSong-Z02    }
     \setCJKfamilyfont { zhkai  } { FZKai-Z03         }
-      [ \c__nju_name_fakebold_tl ]
+      [ \c_@@_name_fakebold_tl ]
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4942,28 +5091,31 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\@@_loadfont_stzhongs:,\@@_stzhongs:}
+% \begin{macro}{\@@_loadfont_stzhongs:,\@@_stzhongs:nn,\@@_stzhongs:n,\@@_stzhongs:}
 % \changes{v1.2}{2023/04/30}{在研究生模板载入华文中宋。}
 % \changes{v1.3}{2023/10/09}{可以手动指定华文中宋文件位置。}
 % 研究生封面额外需要的华文中宋。
 %    \begin{macrocode}
-\cs_new:Npn \@@_loadfont_stzhongs:
+\cs_new:Npn \@@_stzhongs:nn #1#2
+  { \newCJKfontfamily \@@_stzhongs: {#1} [#2] }
+\cs_new:Npn \@@_stzhongs:n { \@@_stzhongs:nn { 华文中宋 } }
+\cs_new_protected:Npn \@@_loadfont_stzhongs:
   {
-    \fontspec_font_if_exist:nTF { 华文中宋 }
+    \cs_if_exist_use:NF \@@_stzhongs:
       {
-        \newCJKfontfamily \@@_stzhongs: { 华文中宋 }
-          [ \c_@@_name_fakebold_tl ]
-      }
-      {
-        \bool_if:NTF \g_@@_font_path_bool
+        \fontspec_font_if_exist:nTF { 华文中宋 }
+          { \@@_stzhongs:n { \c_@@_name_fakebold_tl } }
           {
-            \newCJKfontfamily \@@_stzhongs: { \c_@@_name_stzhongsfile_tl }
-              [ Path = \g_@@_font_path_tl, \c_@@_name_fakebold_tl ]
+            \bool_if:NTF \g_@@_font_path_bool
+              {
+                \@@_stzhongs:nn { \l_@@_name_stzhongsfile_tl }
+                  { Path = \g_@@_font_path_tl, \c_@@_name_fakebold_tl }
+              }
+              {
+                \cs_set_eq:NN \@@_stzhongs: \rmfamily
+                \msg_warning:nn { njuthesis } { missing-stzhongs }
+              }
           }
-          {
-            \cs_set_eq:NN \@@_stzhongs: \rmfamily
-            \msg_warning:nn { njuthesis } { missing-stzhongs }
-          }
       }
   }
 %    \end{macrocode}
@@ -5120,16 +5272,6 @@
 % \subsubsection{载入指定字库}
 % \changes{v0.10}{2021/09/28}{修正了数学字体。}
 %
-% \begin{macro}{\@@_loadfont_latin_windows:
-%   \@@_loadfont_latin_fandol:,\@@_loadfont_cjk_windows:}
-% 为兼容 \pkg{ctex} 做出的名称改变。
-%    \begin{macrocode}
-\cs_new_eq:NN \@@_loadfont_latin_windows: \@@_loadfont_latin_win:
-\cs_new_eq:NN \@@_loadfont_latin_fandol:  \@@_loadfont_latin_gyre:
-\cs_new_eq:NN \@@_loadfont_cjk_windows:   \@@_loadfont_cjk_win:
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\@@_loadfont:}
 % 载入字体命令。
 %    \begin{macrocode}
@@ -5246,10 +5388,10 @@
 %    \begin{macrocode}
 \ctex_at_end_preamble:n
   {
-    \clist_set_eq:Nc \g_@@_header_clist
-      { g_@@_header_ \c_@@_name_pagemode_tl _clist }
-    \clist_set_eq:Nc \g_@@_footer_clist
-      { g_@@_footer_ \c_@@_name_pagemode_tl _clist }
+    \clist_gset_eq:Nc \g_@@_header_clist
+      { g_@@_header_ \g_@@_name_pagemode_tl _clist }
+    \clist_gset_eq:Nc \g_@@_footer_clist
+      { g_@@_footer_ \g_@@_name_pagemode_tl _clist }
   }
 %    \end{macrocode}
 %
@@ -5257,9 +5399,9 @@
 % 对 \pkg{fancyhdr} 的命令进行包装,便于设置页眉页脚。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_header:nn #1#2
-  { \fancyhead [#1] { \c_@@_fmt_header_tl \nouppercase {#2} } }
+  { \fancyhead [#1] { \l_@@_fmt_header_tl \nouppercase {#2} } }
 \cs_new_protected:Npn \@@_footer:nn #1#2
-  { \fancyfoot [#1] { \c_@@_fmt_footer_tl \nouppercase {#2} } }
+  { \fancyfoot [#1] { \l_@@_fmt_footer_tl \nouppercase {#2} } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5303,7 +5445,7 @@
 \RenewDocumentCommand \frontmatter { }
   {
     \cleardoublepage
-    \exp_args:NV \pagestyle \c_@@_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l_@@_fmt_pagestyle_tl
     \pagenumbering { Roman }
   }
 %    \end{macrocode}
@@ -5318,7 +5460,7 @@
 \RenewDocumentCommand \mainmatter { }
   {
     \cleardoublepage
-    \exp_args:NV \pagestyle \c_@@_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l_@@_fmt_pagestyle_tl
     \pagenumbering { arabic }
     \normalfont \normalsize
   }
@@ -5330,7 +5472,7 @@
 %    \begin{macrocode}
 \AtBeginEnvironment { document }
   {
-    \exp_args:NV \pagestyle \c_@@_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l_@@_fmt_pagestyle_tl
     \pagenumbering { Roman }
   }
 %    \end{macrocode}
@@ -5342,7 +5484,7 @@
 % 为无编号章添加目录条目,需手动指定格式为四号、不加粗、黑体。
 %    \begin{macrocode}
 \cs_new:Npn \@@_bookmark_toc:n #1
-  { \addcontentsline { toc } { chapter } { \c_@@_fmt_chapterintoc_tl #1 } }
+  { \addcontentsline { toc } { chapter } { \l_@@_fmt_chapterintoc_tl #1 } }
 \cs_generate_variant:Nn \@@_bookmark_toc:n { V }
 %    \end{macrocode}
 % \end{macro}
@@ -5358,10 +5500,9 @@
 % \begin{macro}{\@@_bookmark_pdf_nosec:nn,\@@_bookmark_pdf:nn}
 % 封装 \pkg{hyperref} 的 PDF 书签命令。
 %    \begin{macrocode}
-\cs_new:Npn \@@_bookmark_pdf_nosec:nn #1#2
-  { \pdfbookmark [0] {#1} {#2} }
-\cs_new:Npn \@@_bookmark_pdf:nn #1#2
-  { \phantomsection \@@_bookmark_pdf_nosec:nn {#1} {#2} }
+\cs_new:Npn \@@_bookmark_pdf_nosec:nn { \pdfbookmark [0] }
+\cs_new:Npn \@@_bookmark_pdf:nn
+  { \phantomsection \@@_bookmark_pdf_nosec:nn }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5417,14 +5558,14 @@
 %    \begin{macrocode}
 \keys_set:nn { ctex }
   {
-    chapter        / beforeskip = \c_@@_chapterbefore_dim,
-    chapter        / afterskip  = \c_@@_chapterafter_dim,
-    chapter        / format     = \c_@@_fmt_chapter_tl,
-    section        / format     = \c_@@_fmt_section_tl,
-    subsection     / format     = \c_@@_fmt_subsection_tl,
-    subsubsection  / format     = \c_@@_fmt_subsubsection_tl,
-    paragraph      / format     = \c_@@_fmt_paragraph_tl,
-    subparagraph   / format     = \c_@@_fmt_subparagraph_tl,
+    chapter        / beforeskip = \l_@@_chapterbefore_dim,
+    chapter        / afterskip  = \l_@@_chapterafter_dim,
+    chapter        / format     = \l_@@_fmt_chapter_tl,
+    section        / format     = \l_@@_fmt_section_tl,
+    subsection     / format     = \l_@@_fmt_subsection_tl,
+    subsubsection  / format     = \l_@@_fmt_subsubsection_tl,
+    paragraph      / format     = \l_@@_fmt_paragraph_tl,
+    subparagraph   / format     = \l_@@_fmt_subparagraph_tl,
 %    \end{macrocode}
 %
 %
@@ -5433,13 +5574,13 @@
 %
 % 设置目录标题默认名称。
 %    \begin{macrocode}
-    contentsname   = \c_@@_name_tableofcontents_tl,
-    listfigurename = \c_@@_name_listoffigures_tl,
-    listtablename  = \c_@@_name_listoftables_tl,
+    contentsname   = \l_@@_name_tableofcontents_tl,
+    listfigurename = \l_@@_name_listoffigures_tl,
+    listtablename  = \l_@@_name_listoftables_tl,
 %    \end{macrocode}
 % 设置目录中章标题的样式。
 %    \begin{macrocode}
-    chapter / tocline = \c_@@_fmt_chapterintoc_tl \CTEXnumberline {#1} #2
+    chapter / tocline = \l_@@_fmt_chapterintoc_tl \CTEXnumberline {#1} #2
   }
 %    \end{macrocode}
 %
@@ -5453,7 +5594,7 @@
   {
     \group_begin:
       \keys_set:nn { ctex }
-        { chapter/format = \c_@@_fmt_toctitle_tl }
+        { chapter/format = \l_@@_fmt_toctitle_tl }
       \@@_chapter:cnn { g_@@_ #2 _showentry_bool } {#1} {#2}
     \group_end:
     \@starttoc {#2}
@@ -5470,7 +5611,7 @@
   {
     \keys_define:nn { nju / #1 }
       {
-        toc-entry  .bool_set:c = { g_@@_ #3 _showentry_bool },
+        toc-entry .bool_gset:c = { g_@@_ #3 _showentry_bool },
         toc-entry   .initial:n = true
       }
     \exp_args:Nc \RenewDocumentCommand {#1} { }
@@ -5504,8 +5645,8 @@
   {
     \bool_if:NF \g_@@_toc_showentry_bool
       {
-        \bool_set_false:N \g_@@_lof_showentry_bool
-        \bool_set_false:N \g_@@_lot_showentry_bool
+        \bool_gset_false:N \g_@@_lof_showentry_bool
+        \bool_gset_false:N \g_@@_lot_showentry_bool
       }
   }
 %    \end{macrocode}
@@ -5585,10 +5726,7 @@
 % |\PassoptionsToPackage{|\meta{key}|=|\meta{value}|}{biblatex}| 命令。
 %    \begin{macrocode}
     option              .code:n =
-      {
-            \clist_gput_right:NV \g_@@_blx_option_clist
-              \l_keys_value_tl
-      },
+      { \clist_gput_right:NV \g_@@_blx_option_clist \l_keys_value_tl },
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5640,7 +5778,7 @@
 % 如果需要在每章后附上一个参考文献表,即对 \pkg{biblatex} 传入了
 %  |refsection = chapter| 选项,则默认为 |section| 级别。
 %    \begin{macrocode}
-    \defbibheading { njubibintoc } [ \bibname ] { \@@_chapter:n { ##1 } }
+    \defbibheading { njubibintoc } [ \bibname ] { \@@_chapter:n {##1} }
     \tl_if_eq:NnTF \blx at refsecreset@level { 2 }
       { \DeclarePrintbibliographyDefaults { heading = subbibintoc } }
       { \DeclarePrintbibliographyDefaults { heading = njubibintoc } }
@@ -5647,8 +5785,7 @@
 %    \end{macrocode}
 % 传入参考文献源文件,此时可正常使用 \tn{addbibresource} 命令。
 %    \begin{macrocode}
-    \clist_map_inline:Nn \g_@@_blx_resource_clist
-      { \addbibresource { ##1 } }
+    \clist_map_inline:Nn \g_@@_blx_resource_clist { \addbibresource {##1} }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -5670,34 +5807,38 @@
 %
 % \subsection{引用}
 %
-% 在导言区末尾进行 \pkg{hyperref} 设置。
-% \changes{v0.11}{2021/10/01}{写入 PDF 元数据。}
-% \changes{v0.17}{2022/04/09}{PDF 书签中不生成额外空格。}
+% \changes{v1.4}{2024/03/06}{将可能需要覆盖的 \pkg{hyperref} 设置移动到导言区前。}
 %    \begin{macrocode}
-\ctex_at_end_preamble:n
+\hypersetup
   {
+    bookmarksnumbered = true,
+    psdextra          = true,
+    unicode           = true,
+    hidelinks
+  }
 %    \end{macrocode}
+% \changes{v0.17}{2022/04/09}{PDF 书签中不生成额外空格。}
 % 忽略 PDF 字符串中的特定命令,从而抑制 \pkg{hyperref} 警告。
 %    \begin{macrocode}
-    \pdfstringdefDisableCommands
-      {
-        \clist_map_inline:nn
-          { \\, \quad, \qquad, \bigger }
-          { \@@_cs_clear:N #1 }
-      }
+\pdfstringdefDisableCommands
+  {
+    \clist_map_inline:nn
+      { \\, \quad, \qquad, \bigger }
+      { \@@_cs_clear:N #1 }
+    \cs_set_eq:NN \zihao \use_none:n
+  }
+%    \end{macrocode}
+% 在导言区末尾进行 \pkg{hyperref} 设置。填写 PDF 元信息。
+% \changes{v0.11}{2021/10/01}{写入 PDF 元数据。}
+%    \begin{macrocode}
+\ctex_at_end_preamble:n
+  {
     \hypersetup
       {
-        bookmarksnumbered = true,
-        psdextra          = true,
-        unicode           = true,
-        hidelinks,
-%    \end{macrocode}
-% 填写 PDF 元信息。
-%    \begin{macrocode}
         pdftitle    = \g_@@_info_title_tl,
         pdfauthor   = \g_@@_info_author_tl,
         pdfkeywords = \g_@@_info_keywords_clist,
-        pdfcreator  = \c_@@_name_pdfcreator_tl
+        pdfcreator  = \l_@@_name_pdfcreator_tl
       }
   }
 %    \end{macrocode}
@@ -5726,7 +5867,7 @@
 %    \end{macrocode}
 % 修改 \pkg{cleveref} 的标签名称。
 %    \begin{macrocode}
-    \clist_map_inline:nn { figure, table, appendix, proof }
+    \clist_map_inline:nn { figure, table, appendix }
       { \@@_cref_name:n {#1} }
   }
 %    \end{macrocode}
@@ -5740,7 +5881,7 @@
 % 存储传入 \pkg{circledtext} 宏包的选项列表。
 % 由于当前版本放在编号位置的带圈数字无法正确缩放,这里手动指定了字体大小。
 %    \begin{macrocode}
-\clist_set:Nn \g_@@_fn_ctext_option_clist { charf = \scriptsize }
+\clist_gset:Nn \g_@@_fn_ctext_option_clist { charf = \scriptsize }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -5807,7 +5948,7 @@
         \cs_set:Npn \@@_fn_hang:
           {
             \int_set:Nn \tex_hangafter:D { 1 }
-            \dim_set_eq:NN \tex_hangindent:D \c_@@_fnhang_dim
+            \dim_set_eq:NN \tex_hangindent:D \l_@@_fnhang_dim
           }
       },
     hang / false       .code:n = { \@@_cs_clear:N \@@_fn_hang: },
@@ -5865,7 +6006,7 @@
     \cs_set:Npn \@makefntext #1
       {
         \mode_leave_vertical:
-        \hbox_to_wd:nn { \c_@@_fnhang_dim } { \@thefnmark \tex_hfil:D }
+        \hbox_to_wd:nn { \l_@@_fnhang_dim } { \@thefnmark \tex_hfil:D }
         \tex_penalty:D \@M
         \@@_fn_hang:
         #1
@@ -5892,9 +6033,10 @@
 %
 % \changes{v0.16}{2022/03/11}{表格内字体设为五号。}
 % \changes{v1.0}{2022/08/06}{兼容 \pkg{tabularray} 设置。}
+% \changes{v1.4}{2024/03/06}{调整 \pkg{tabularray} 设置。}
 % 表格默认居中,字号设置为五号。^^A  https://www.zhihu.com/question/366803177/answer/977853129
 %    \begin{macrocode}
-\BeforeBeginEnvironment { tabular } { \centering \c_@@_fmt_tabular_tl }
+\BeforeBeginEnvironment { tabular } { \centering \l_@@_fmt_tabular_tl }
 \ctex_at_end_package:nn { tabularray }
   {
 %    \end{macrocode}
@@ -5902,16 +6044,21 @@
 %    \begin{macrocode}
     \__tblr_use_lib_booktabs:
     \tl_set:Nn \l_@@_tmpb_tl
-      { , abovesep = 4 pt, stretch  = 0.8, cells = { font = \c_@@_fmt_tabular_tl } }
+      { , abovesep = 4 pt, stretch  = 0.8, cells = { font = \l_@@_fmt_tabular_tl } }
     \tl_put_right:NV \l__tblr_default_tblr_inner_tl     \l_@@_tmpb_tl
     \tl_put_right:NV \l__tblr_default_talltblr_inner_tl \l_@@_tmpb_tl
-    \tl_put_right:Nn \l__tblr_default_talltblr_outer_tl { , headsep = -4 pt }
+    \tl_put_right:NV \l__tblr_default_longtblr_inner_tl \l_@@_tmpb_tl
 %    \end{macrocode}
+% 为了和标准文档类中的间距一致,文档介绍的值为 \qty{10}{pt},实际是 \qty{12.63}{pt}。
+%    \begin{macrocode}
+    \tl_put_right:Nn \l__tblr_default_talltblr_outer_tl { , headsep = 12.63 pt }
+    \tl_put_right:Nn \l__tblr_default_longtblr_outer_tl { , headsep = 12.63 pt }
+%    \end{macrocode}
 % 处理 \env{talltblr} 表注的限宽问题。
 % \footnote{\url{https://github.com/lvjr/tabularray/issues/255}}
 %    \begin{macrocode}
     \DefTblrTemplate { caption-tag } { default }
-      { \c_@@_name_table_tl \hspace { 0.25em } \thetable }
+      { \l_@@_name_table_tl \hspace { 0.25em } \thetable }
     \DefTblrTemplate { caption-sep } { default } { \quad }
     \DefTblrTemplate { firsthead   } { caption }
       {
@@ -5921,6 +6068,7 @@
     \SetTblrTemplate { firsthead   } { caption }
     \SetTblrStyle { caption } { font = \normalfont \bfseries \small }
     \SetTblrStyle { note    } { font = \normalfont \footnotesize    }
+    \SetTblrStyle { remark  } { font = \normalfont \footnotesize    }
   }
 %    \end{macrocode}
 %
@@ -5930,8 +6078,7 @@
 %    \begin{macrocode}
 \DeclareCaptionStyle{njucap}
   {
-    font          = small,
-    font         += bf,
+    font          = {small, bf},
     labelsep      = quad,
     justification = centering
   }
@@ -5954,7 +6101,7 @@
   {
     \keys_define:nn { nju / label-sep }
       {
-        #1  .tl_set:c = { g_@@_sep_ #1 _tl },
+        #1 .tl_gset:c = { g_@@_sep_ #1 _tl },
 %    \end{macrocode}
 % 根据本科生撰写规范的建议,默认连接符为短横线(en dash)。
 %    \begin{macrocode}
@@ -6169,12 +6316,12 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\c_@@_name_integral_tl}
+% \begin{variable}{\l_@@_name_integral_tl}
 % 保存 \pkg{unicode-math} 内置的所有积分号命令。
 %    \begin{macrocode}
 \bool_if:NTF \g_@@_opt_load_um_bool
-  { \tl_set_eq:NN \c_@@_name_integral_tl \l__um_nolimits_tl }
-  { \tl_set_eq:NN \c_@@_name_integral_tl \c_empty_tl        }
+  { \tl_set_eq:NN \l_@@_name_integral_tl \l__um_nolimits_tl }
+  { \tl_set_eq:NN \l_@@_name_integral_tl \c_empty_tl        }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -6197,9 +6344,9 @@
 %    \begin{macrocode}
     integral                      .choice:,
     integral / upright              .code:n  =
-      { \bool_set_true:N  \g_@@_opt_math_int_bool },
+      { \bool_gset_true:N  \g_@@_opt_math_int_bool },
     integral / slanted              .code:n  =
-      { \bool_set_false:N \g_@@_opt_math_int_bool },
+      { \bool_gset_false:N \g_@@_opt_math_int_bool },
 %    \end{macrocode}
 % \end{macro}
 %
@@ -6211,7 +6358,7 @@
     integral-limits / true          .code:n  =
       { \tl_clear:N   \l__um_nolimits_tl },
     integral-limits / false         .code:n  =
-      { \tl_set_eq:NN \l__um_nolimits_tl \c_@@_name_integral_tl },
+      { \tl_set_eq:NN \l__um_nolimits_tl \l_@@_name_integral_tl },
 %    \end{macrocode}
 % \end{macro}
 %
@@ -6220,9 +6367,9 @@
 %    \begin{macrocode}
     less-than-or-equal            .choice:,
     less-than-or-equal / slanted    .code:n  =
-      { \bool_set_true:N  \g_@@_opt_math_leq_bool },
+      { \bool_gset_true:N  \g_@@_opt_math_leq_bool },
     less-than-or-equal / horizontal .code:n  =
-      { \bool_set_false:N \g_@@_opt_math_leq_bool },
+      { \bool_gset_false:N \g_@@_opt_math_leq_bool },
 %    \end{macrocode}
 % \end{macro}
 %
@@ -6267,9 +6414,9 @@
 %    \begin{macrocode}
     vector                        .choice:,
     vector / boldfont               .code:n  =
-      { \bool_set_true:N  \g_@@_opt_math_vec_bool },
+      { \bool_gset_true:N  \g_@@_opt_math_vec_bool },
     vector / arrow                  .code:n  =
-      { \bool_set_false:N \g_@@_opt_math_vec_bool },
+      { \bool_gset_false:N \g_@@_opt_math_vec_bool },
 %    \end{macrocode}
 % \end{macro}
 %
@@ -6384,7 +6531,7 @@
 %<*def-u>
 \@@_declare_element:nn { u / cover / emblem-img }
   {
-    content     = \@@_emblem:N \c_@@_emblemwd_dim,
+    content     = \@@_emblem:N \l_@@_emblemwd_dim,
     bottom-skip = 1.2 cm
   }
 %    \end{macrocode}
@@ -6395,7 +6542,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { u / cover / name-img }
   {
-    content     = \@@_name:N \c_@@_namewd_dim,
+    content     = \@@_name:N \l_@@_namewd_dim,
     bottom-skip = 1 cm,
   }
 %    \end{macrocode}
@@ -6458,8 +6605,8 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_u_cover_info:
   {
-    \@@_u_cover_info:NNNN \c_@@_clabelwd_dim \c_@@_crulewd_dim
-      \c_@@_hsep_dim \kaishu
+    \@@_u_cover_info:NNNN \l_@@_clabelwd_dim \l_@@_crulewd_dim
+      \l_@@_hsep_dim \kaishu
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6472,7 +6619,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { u / decl / orig / emblem }
   {
-    content     = \@@_emblem:N \c_@@_emblemwdi_dim,
+    content     = \@@_emblem:N \l_@@_emblemwdi_dim,
     bottom-skip = 30 pt
   }
 %    \end{macrocode}
@@ -6484,7 +6631,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { u / decl / orig / title }
   {
-    content     = \c_@@_name_origdecl_tl,
+    content     = \l_@@_name_origdecl_tl,
     format      = \sffamily \@@_fontsize:nn { 24 bp } { 22.15 bp } \bfseries,
     bottom-skip = 50 pt
   }
@@ -6496,7 +6643,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { u / decl / orig / text }
   {
-    content     = \c_@@_text_origdecl_tl,
+    content     = \l_@@_text_origdecl_tl,
     format      = \@@_zihao:nn { 1.9 } { -3 },
     align       = n,
     bottom-skip = 2.7 cm
@@ -6525,7 +6672,7 @@
   {
 %<def-u>    \clist_map_inline:nn { origsign, id, date }
 %<def-g>    \clist_map_inline:nn { origsign,     date }
-      { \tex_par:D \@@_name:n { ##1 } : \hbox_to_wd:nn { 6 em } { } }
+      { \tex_par:D \@@_name:n {##1} : \hbox_to_wd:nn { 6 em } { } }
   }
 %</(def-u|def-g)>
 %    \end{macrocode}
@@ -6559,7 +6706,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { g / cover-front / emblem-img }
   {
-    content     = \@@_emblem:N \c_@@_emblemwd_dim,
+    content     = \@@_emblem:N \l_@@_emblemwd_dim,
     bottom-skip = .47 cm
   }
 %    \end{macrocode}
@@ -6570,7 +6717,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { g / cover-front / name-img }
   {
-    content     = \@@_name:N \c_@@_namewd_dim,
+    content     = \@@_name:N \l_@@_namewd_dim,
     bottom-skip = 2.25 cm
   }
 %    \end{macrocode}
@@ -6622,8 +6769,8 @@
     \@@_get_width:NV \l_@@_tmpb_dim \g_@@_info_id_tl
     \clist_map_inline:nn { code, clc, secretlv, udc, id }
       {
-        \@@_cover_entry:NNNNn \c_@@_name_colon_tl \l_@@_tmpa_dim
-          \l_@@_tmpb_dim \tex_relax:D { ##1 }
+        \@@_cover_entry:NNNNn \l_@@_name_colon_tl \l_@@_tmpa_dim
+          \l_@@_tmpb_dim \tex_relax:D {##1}
       }
   }
 %    \end{macrocode}
@@ -6639,7 +6786,7 @@
       { \clist_set:Nn #1 { author, majorc, field, supvfull } }
     \@@_cover_entry_title:NNNN #2 #3 #4 #5
     \clist_map_inline:Nn #1
-      { \@@_cover_entry:NNNNn #2 #3 #4 #5 { ##1 } }
+      { \@@_cover_entry:NNNNn #2 #3 #4 #5 {##1} }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6650,7 +6797,7 @@
   {
     \tl_set:Nn \l_@@_tmpa_tl { \skip_horizontal:n { .7 cm } }
     \@@_g_cover_info:NNNNN \l_@@_tmp_clist \l_@@_tmpa_tl
-      \c_@@_clabelwd_dim \c_@@_crulewd_dim \c_@@_fmt_coverlabel_tl
+      \l_@@_clabelwd_dim \l_@@_crulewd_dim \l_@@_fmt_coverlabel_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6704,8 +6851,8 @@
   }
 \cs_new:Npn \@@_g_cover_back:
   {
-    \@@_g_cover_back:NNN \c_@@_clabelwdi_dim
-      \c_@@_crulewdi_dim \c_@@_fmt_coverlabel_tl
+    \@@_g_cover_back:NNN \l_@@_clabelwdi_dim
+      \l_@@_crulewdi_dim \l_@@_fmt_coverlabel_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6725,8 +6872,8 @@
   }
 \cs_new:Npn \@@_g_cover_sign:
   {
-    \@@_g_cover_sign:NNN \c_@@_clabelwdii_dim
-      \c_@@_fmt_coverlabel_tl \c_@@_name_colon_tl
+    \@@_g_cover_sign:NNN \l_@@_clabelwdii_dim
+      \l_@@_fmt_coverlabel_tl \l_@@_name_colon_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6772,7 +6919,7 @@
 \@@_declare_element:nn { g / cover-en / middle }
   {
     content     =
-      \c_@@_text_cover_en_tl \@@_vskip:
+      \l_@@_text_cover_en_tl \@@_vskip:
       \group_begin: \scshape \g_@@_info_degree_en_tl \group_end:
       \@@_vskip: { in } \@@_vskip: \g_@@_info_major_en_tl,
     bottom-skip = .5 cm plus 1 fil
@@ -6785,7 +6932,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { g / cover-en / emblem-img }
   {
-    content     = \@@_emblem:N \c_@@_emblemwdii_dim,
+    content     = \@@_emblem:N \l_@@_emblemwdii_dim,
     bottom-skip = 1 cm minus .5 cm
   }
 %    \end{macrocode}
@@ -6798,7 +6945,7 @@
   {
     content =
       \g_@@_info_dept_en_tl \skip_vertical:N \c_zero_skip
-      \c_@@_name_nju_en_tl  \skip_vertical:n { 1 cm }
+      \l_@@_name_nju_en_tl  \skip_vertical:n { 1 cm }
       \g_@@_info_submitdate_en_tl
   }
 %    \end{macrocode}
@@ -6878,19 +7025,21 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_cover_top_nl:}
+% \begin{macro}{\@@_cover_top_nl:,\@@_cover_top_nl:NN}
 % 国家图书馆封面顶部信息。
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cover_top_nl:
+\cs_new:Npn \@@_cover_top_nl:
+  { \@@_cover_top_nl:NN \l_@@_tmpa_dim \l_@@_tmpb_dim }
+\cs_new_protected:Npn \@@_cover_top_nl:NN #1#2
   {
-    \dim_set:Nn               \l_@@_tmpa_dim { 38.6 pt  }
-    \dim_set:Nn               \l_@@_tmpb_dim { 109  pt  }
-    \@@_box_spread_name:Nn \l_@@_tmpa_dim { clc      } \@@_hskip:
-    \@@_box_ulined_info:Nn \l_@@_tmpb_dim { clc      } \tex_hfill:D
-    \@@_box_spread_name:Nn \l_@@_tmpa_dim { secretlv } \@@_hskip:
-    \@@_box_ulined_info:Nn \l_@@_tmpb_dim { secretlv } \tex_par:D
-    \@@_box_spread_name:Nn \l_@@_tmpa_dim { udc      } \@@_hskip:
-    \@@_box_ulined_info:Nn \l_@@_tmpb_dim { udc      } \tex_hfill:D
+    \dim_set:Nn               #1 { 38.6 pt  }
+    \dim_set:Nn               #2 { 109  pt  }
+    \@@_box_spread_name:Nn #1 { clc      } \@@_hskip:
+    \@@_box_ulined_info:Nn #2 { clc      } \tex_hfill:D
+    \@@_box_spread_name:Nn #1 { secretlv } \@@_hskip:
+    \@@_box_ulined_info:Nn #2 { secretlv } \tex_par:D
+    \@@_box_spread_name:Nn #1 { udc      } \@@_hskip:
+    \@@_box_ulined_info:Nn #2 { udc      } \tex_hfill:D
     \@@_null:
   }
 %    \end{macrocode}
@@ -6903,12 +7052,12 @@
   {
     \parbox [ b ] { 15 em } { \@@_uline_title: } \tex_par:D
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } \c_@@_name_subtitle_tl }
+    { \zihao { 4 } \l_@@_name_subtitle_tl }
     \skip_vertical:N \c_zero_skip
     \dim_set:Nn \l_@@_tmpa_dim { 4.5 em }
     \@@_box_ulined_info:Nn \l_@@_tmpa_dim { author }
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } { ( } \c_@@_name_author_tl { ) } }
+    { \zihao { 4 } { ( } \l_@@_name_author_tl { ) } }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6928,12 +7077,12 @@
       }
     \skip_set:Nn \l_@@_tmp_skip { .5 em plus 1 fill }
     \@@_uline_list:NNn \l_@@_tmpa_tl \l_@@_tmp_skip
-      { \c_@@_name_supvinfo_tl }
+      { \l_@@_name_supvinfo_tl }
 %    \end{macrocode}
 % 临时替换显示的名称字样。
 %    \begin{macrocode}
     \group_begin:
-      \tl_set_eq:NN \c_@@_name_major_tl \c_@@_name_majorb_tl
+      \tl_set_eq:NN \l_@@_name_major_tl \l_@@_name_majorb_tl
       \@@_uline_bientry:Nn \l_@@_tmpa_dim { degree   }
       \@@_uline_bientry:Nn \l_@@_tmpa_dim { major    }
       \tex_par:D
@@ -6969,9 +7118,9 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { g / decl / orig / title }
   {
-    content     = \c_@@_name_origdecl_tl,
-    format      = \c_@@_fmt_chapter_tl,
-    bottom-skip = \c_@@_chapterafter_dim
+    content     = \l_@@_name_origdecl_tl,
+    format      = \l_@@_fmt_chapter_tl,
+    bottom-skip = \l_@@_chapterafter_dim
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6981,7 +7130,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { g / decl / orig / text }
   {
-    content     = \c_@@_text_origdecl_tl,
+    content     = \l_@@_text_origdecl_tl,
     align       = n,
     bottom-skip = 0 pt plus 1 fil
   }
@@ -7006,9 +7155,9 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { g / decl / auth / title }
   {
-    content     = \c_@@_name_authdecl_tl,
-    format      = \c_@@_fmt_chapter_tl,
-    bottom-skip = \c_@@_chapterafter_dim
+    content     = \l_@@_name_authdecl_tl,
+    format      = \l_@@_fmt_chapter_tl,
+    bottom-skip = \l_@@_chapterafter_dim
   }
 %    \end{macrocode}
 % \end{macro}
@@ -7018,7 +7167,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { g / decl / auth / text }
   {
-    content     = \c_@@_text_authdecl_tl,
+    content     = \l_@@_text_authdecl_tl,
     align       = n,
     bottom-skip = 2 cm
   }
@@ -7093,12 +7242,12 @@
         cell{1}{2} = {c=5}{m}, cell{3}{2} = {c=5}{m},
         cell{4}{2} = {c=5}{m}, cell{5}{2} = {c=5}{m}
       }
-      \c_@@_name_titlec_tl  & \g_@@_info_title_tl \\
-      \c_@@_name_ida_tl     & \g_@@_info_id_tl    &
-      \c_@@_name_depta_tl   & \g_@@_info_dept_tl  &
-      \c_@@_name_year_tl    &
+      \l_@@_name_titlec_tl  & \g_@@_info_title_tl \\
+      \l_@@_name_ida_tl     & \g_@@_info_id_tl    &
+      \l_@@_name_depta_tl   & \g_@@_info_dept_tl  &
+      \l_@@_name_year_tl    &
         \tl_range:Nnn \g_@@_info_submitdate_tl {1} {4} \\
-      \c_@@_name_degreea_tl &
+      \l_@@_name_degreea_tl &
         {
           \@@_degree_checkbox:nn {   } { 2 } 学术学位硕士 \qquad
           \@@_degree_checkbox:nn { ! } { 2 } 专业学位硕士 \\
@@ -7105,8 +7254,8 @@
           \@@_degree_checkbox:nn {   } { 3 } 学术学位博士 \qquad
           \@@_degree_checkbox:nn { ! } { 3 } 专业学位博士
         } \\
-      \c_@@_name_email_tl   & \g_@@_info_email_tl \\
-      \c_@@_name_supvb_tl   &
+      \l_@@_name_email_tl   & \g_@@_info_email_tl \\
+      \l_@@_name_supvb_tl   &
         \clist_item:Nn \g_@@_info_supv_clist { 1 }
         \bool_if:NT \g_@@_opt_supvii_bool
           { \@@_quad: \clist_item:Nn \g_@@_info_supvii_clist { 1 } } \\
@@ -7119,10 +7268,7 @@
 % 签名区内容。
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_g_decl_auth_sign:
-  {
-    \c_@@_name_authsign_tl \tex_par:D
-    \c_@@_name_blankdatea_tl
-  }
+  { \l_@@_name_authsign_tl \tex_par:D \l_@@_name_blankdatea_tl }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -7131,9 +7277,9 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_g_decl_auth_secretlv:
   {
-    \c_@@_name_secretstatus_tl \tex_par:D
-    \ensuremath { \mdwhtsquare } \c_@@_name_secretfree_tl \tex_par:D
-    \ensuremath { \mdwhtsquare } \c_@@_name_secretdate_tl
+    \l_@@_name_secretstatus_tl \tex_par:D
+    \ensuremath { \mdwhtsquare } \l_@@_name_secretfree_tl \tex_par:D
+    \ensuremath { \mdwhtsquare } \l_@@_name_secretdate_tl
   }
 %</def-g>
 %    \end{macrocode}
@@ -7147,7 +7293,7 @@
 %<*def-p>
 \@@_declare_element:nn { p / cover / name-img }
   {
-    content     = \@@_name:N \c_@@_namewd_dim,
+    content     = \@@_name:N \l_@@_namewd_dim,
     bottom-skip = 40 pt
   }
 %    \end{macrocode}
@@ -7158,7 +7304,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { p / cover / report }
   {
-    content     = \c_@@_name_report_tl,
+    content     = \l_@@_name_report_tl,
     format      = \zihao { 0 } \sffamily,
     bottom-skip = 40 pt plus 1.5 fil
   }
@@ -7171,8 +7317,8 @@
 \@@_declare_element:nn { p / cover / title }
   {
     content     =
-      \c_@@_name_title_tl
-      \c_@@_name_colon_tl
+      \l_@@_name_title_tl
+      \l_@@_name_colon_tl
       \g_@@_info_title_tl,
     format      = \zihao { 4 },
     bottom-skip = 80 pt
@@ -7185,10 +7331,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { p / cover / info }
   {
-    content     =
-      \@@_p_cover_info:NN
-        \c_@@_clabelwd_dim
-        \c_@@_fmt_coverlabel_tl,
+    content     = \@@_p_cover_info:,
     format      = \zihao { -4 },
     bottom-skip = 0 pt
   }
@@ -7195,7 +7338,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_p_cover_info:NN}
+% \begin{macro}{\@@_p_cover_info:,\@@_p_cover_info:NN}
 % 博士后封面信息栏。
 % \begin{arguments}
 %   \item 名称盒子宽度,|dim| 型变量
@@ -7202,6 +7345,8 @@
 %   \item 标签格式
 % \end{arguments}
 %    \begin{macrocode}
+\cs_new:Npn \@@_p_cover_info:
+  { \@@_p_cover_info:NN \l_@@_clabelwd_dim \l_@@_fmt_coverlabel_tl }
 \cs_new_protected:Npn \@@_p_cover_info:NN #1#2
   {
     \clist_set:Nn \l_@@_tmp_clist
@@ -7216,9 +7361,9 @@
 %    \begin{macrocode}
     \clist_map_inline:Nn \l_@@_tmp_clist
       {
-        \@@_box_spread_name:NNn #1 #2 { ##1 }
-        \c_@@_name_colon_tl
-        \@@_box_center:Nn \l_@@_tmpb_dim { \@@_info:n { ##1 } }
+        \@@_box_spread_name:NNn #1 #2 {##1}
+        \l_@@_name_colon_tl
+        \@@_box_center:Nn \l_@@_tmpb_dim { \@@_info:n {##1} }
         \tex_par:D
       }
   }
@@ -7232,9 +7377,9 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { p / decl / orig / title }
   {
-    content     = \c_@@_name_origdecl_tl,
-    format      = \c_@@_fmt_chapter_tl,
-    bottom-skip = \c_@@_chapterafter_dim
+    content     = \l_@@_name_origdecl_tl,
+    format      = \l_@@_fmt_chapter_tl,
+    bottom-skip = \l_@@_chapterafter_dim
   }
 %    \end{macrocode}
 % \end{macro}
@@ -7244,7 +7389,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { p / decl / orig / text }
   {
-    content     = \c_@@_text_origdecl_tl,
+    content     = \l_@@_text_origdecl_tl,
     align       = n,
     bottom-skip = 2 cm
   }
@@ -7267,9 +7412,9 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { p / decl / auth / title }
   {
-    content     = \c_@@_name_authdecl_tl,
-    format      = \c_@@_fmt_chapter_tl,
-    bottom-skip = \c_@@_chapterafter_dim
+    content     = \l_@@_name_authdecl_tl,
+    format      = \l_@@_fmt_chapter_tl,
+    bottom-skip = \l_@@_chapterafter_dim
   }
 %    \end{macrocode}
 % \end{macro}
@@ -7279,7 +7424,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { p / decl / auth / text }
   {
-    content     = \c_@@_text_authdecl_tl,
+    content     = \l_@@_text_authdecl_tl,
     align       = n,
     bottom-skip = 2 cm
   }
@@ -7304,8 +7449,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_p_decl_sign:nn #1#2
   {
-    \@@_name:n {#1} \c_@@_name_colon_tl \tex_hfill:D
-    \@@_name:n {#2} \c_@@_name_colon_tl
+    \@@_name:n {#1} \l_@@_name_colon_tl \tex_hfill:D
+    \@@_name:n {#2} \l_@@_name_colon_tl
     \skip_horizontal:n { 160 pt } \@@_null: \@@_vskip:
   }
 %</def-p>
@@ -7407,9 +7552,9 @@
   {
     element     = { title, text, sign },
     prefix      = g / decl / orig /,
-    top-skip    = \c_@@_chapterbefore_dim,
+    top-skip    = \l_@@_chapterbefore_dim,
     bottom-skip = 0 pt plus 1 fil,
-    bm-text     = \c_@@_name_origdecl_tl,
+    bm-text     = \l_@@_name_origdecl_tl,
     bm-name     = origdecl
   }
 %    \end{macrocode}
@@ -7422,9 +7567,9 @@
   {
     element     = { title, text, sign, info, date },
     prefix      = g / decl / auth /,
-    top-skip    = \c_@@_chapterbefore_dim,
+    top-skip    = \l_@@_chapterbefore_dim,
     bottom-skip = 0.5 cm plus 1.5 fill,
-    bm-text     = \c_@@_name_authdecl_tl,
+    bm-text     = \l_@@_name_authdecl_tl,
     bm-name     = authdecl,
     bookmark    = toc
   }
@@ -7459,7 +7604,7 @@
     prefix      = p / decl /,
     bm-text     = 声明页,
     bm-name     = decl,
-    top-skip    = \c_@@_chapterbefore_dim,
+    top-skip    = \l_@@_chapterbefore_dim,
     bottom-skip = 0 pt
   }
 %</def-p>
@@ -7595,6 +7740,7 @@
 % \changes{v0.12}{2021/12/01}{仅会生成国家图书馆封面或者普通封面之一。}
 % \changes{v0.13}{2021/12/12}{重新绘制封面。}
 % \changes{v0.13}{2021/12/15}{草稿模式下不绘制封面。}
+% \changes{v1.4}{2024/03/12}{在生成封面时删除标题换行符。}
 % 重定义 \tn{maketitle} 以生成封面。
 % 在草稿模式下,封面绘制将被禁用,有助于提升编译速度。
 %    \begin{macrocode}
@@ -7605,23 +7751,21 @@
         \pagenumbering { gobble }
         \@@_make_cover:
       }
+    \tl_gremove_all:Nn \g_@@_info_title_tl    { \\ }
+    \tl_gremove_all:Nn \g_@@_info_title_en_tl { \\ }
 %    \end{macrocode}
 % 如果在选择了 \opt{decl-page},就生成本科生的诚信承诺书,
 % 或研究生的原创性声明和出版授权书。
 %    \begin{macrocode}
-    \bool_if:NF \g_@@_opt_draft_bool
-      {
-        \bool_if:NT \g_@@_opt_decl_bool
-          {
-            \@@_make_decl_i:
-            \@@_make_decl_ii:
-          }
-      }
+    \bool_lazy_and:nnT
+      { ! \g_@@_opt_draft_bool }
+      {   \g_@@_opt_decl_bool  }
+      { \@@_make_decl_i: \@@_make_decl_ii: }
 %    \end{macrocode}
 % 在标题页后使用大写罗马字母页码,恢复正常字体设置。
 %    \begin{macrocode}
     \cleardoublepage
-    \exp_args:NV \pagestyle \c_@@_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l_@@_fmt_pagestyle_tl
     \pagenumbering { Roman }
   }
 %</class>
@@ -7641,7 +7785,7 @@
 %<*(def-u|def-g|def-p)>
 \@@_declare_element:nn { abstract / title }
   {
-%<def-u|def-g>    content     = \@@_abs_title:N \c_@@_name_abstracttitle_tl,
+%<def-u|def-g>    content     = \@@_abs_title:N \l_@@_name_abstracttitle_tl,
 %<def-p>    content     = \g_@@_info_title_tl,
 %<def-u|def-g>    format      = \bfseries \kaishu \zihao { -2 },
 %<def-p>    format      = \bfseries,
@@ -7655,7 +7799,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { abstract / en / title }
   {
-%<def-u|def-g>    content     = \@@_abs_title:N \c_@@_name_abstracttitle_en_tl,
+%<def-u|def-g>    content     = \@@_abs_title:N \l_@@_name_abstracttitle_en_tl,
 %<def-p>    content     = \g_@@_info_title_en_tl,
 %<def-u|def-g>    format      = \bfseries \kaishu \zihao { -2 },
 %<def-p>    format      = \bfseries,
@@ -7705,7 +7849,7 @@
 %<*(def-g|def-p)>
 \@@_declare_element:nn { abstract / mark }
   {
-    content     = \c_@@_name_abstractb_tl,
+    content     = \l_@@_name_abstractb_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 15 pt
   }
@@ -7717,7 +7861,7 @@
 %    \begin{macrocode}
 \@@_declare_element:nn { abstract / en / mark }
   {
-    content     = \c_@@_name_abstractb_en_tl,
+    content     = \l_@@_name_abstractb_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 15 pt
   }
@@ -7734,9 +7878,9 @@
 %    \begin{macrocode}
 %<*def-u>
 \cs_new_protected:Npn \@@_abs_info_u:
-  { \@@_abs_info_u:nn {     } { \c_@@_name_colon_tl    } }
+  { \@@_abs_info_u:nn {     } { \l_@@_name_colon_tl    } }
 \cs_new_protected:Npn \@@_abs_info_en_u:
-  { \@@_abs_info_u:nn { _en } { \c_@@_name_colon_en_tl } }
+  { \@@_abs_info_u:nn { _en } { \l_@@_name_colon_en_tl } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -7753,7 +7897,7 @@
 %    \end{macrocode}
 % 由于作者姓名使用的字样发生了变动,这里进行替换以便嵌入循环。
 %    \begin{macrocode}
-    \tl_set_eq:NN \c_@@_name_author_tl \c_@@_name_authora_tl
+    \tl_set_eq:NN \l_@@_name_author_tl \l_@@_name_authora_tl
 %    \end{macrocode}
 % 使用循环输出院系、专业、作者、导师信息。
 %    \begin{macrocode}
@@ -7776,9 +7920,9 @@
 %    \begin{macrocode}
 %<*def-g>
 \cs_new_protected:Npn \@@_abs_info_g:
-  { \@@_abs_info_g:N    \c_@@_name_colon_tl    }
+  { \@@_abs_info_g:N    \l_@@_name_colon_tl    }
 \cs_new_protected:Npn \@@_abs_info_en_g:
-  { \@@_abs_info_en_g:N \c_@@_name_colon_en_tl }
+  { \@@_abs_info_en_g:N \l_@@_name_colon_en_tl }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -7795,7 +7939,7 @@
 \cs_new_protected:Npn \@@_abs_info_g:N #1
   {
     \@@_uline_list:NNe \g_@@_info_title_tl \g_@@_abs_title_left_skip
-      { \c_@@_name_titlea_tl #1 }
+      { \l_@@_name_titlea_tl #1 }
 %    \end{macrocode}
 % 专业、年级、姓名。
 %    \begin{macrocode}
@@ -7804,15 +7948,15 @@
         \dim_set:Nn \l_@@_tmpa_dim { 11 em }
         \dim_set:Nn \l_@@_tmpb_dim { 4  em }
         \@@_box_ulined_info:Nn \l_@@_tmpa_dim { major }
-        \c_@@_name_majora_tl
+        \l_@@_name_majora_tl
         \@@_box_ulined_info:Nn \l_@@_tmpb_dim { grade }
-        \c_@@_name_grade_tl \c_@@_name_authora_tl #1
+        \l_@@_name_grade_tl \l_@@_name_authora_tl #1
       }
     \@@_box_ulined_info:Nn \l_@@_tmp_skip { author } \tex_par:D
 %    \end{macrocode}
 % 导师姓名、职称。
 %    \begin{macrocode}
-    \@@_get_width_print:Ne \l_@@_tmpa_dim { \c_@@_name_supva_tl #1 }
+    \@@_get_width_print:Ne \l_@@_tmpa_dim { \l_@@_name_supva_tl #1 }
     \@@_box_ulined_info:Nn \l_@@_tmpa_dim { supvfull }
   }
 %    \end{macrocode}
@@ -7832,7 +7976,7 @@
     \bool_if:NTF \g_@@_abs_underline_bool
       {
         \@@_uline_list:NNe \g_@@_info_title_en_tl
-          \g_@@_abs_title_left_skip { \c_@@_name_title_en_tl #1 }
+          \g_@@_abs_title_left_skip { \l_@@_name_title_en_tl #1 }
         \clist_map_inline:nn { major, author, supvfull }
           {
             \tex_par:D
@@ -7853,8 +7997,6 @@
 % \paragraph{关键词列表}
 %
 % \begin{macro}{\@@_print_keywords:nn}
-% \changes{v0.15}{2022/01/26}{为关键词列表添加悬挂缩进。}
-% \changes{v0.20}{2022/05/26}{修复英文关键词列表不整齐的缩进间距。}
 % 生成中英文关键词列表。
 % \begin{arguments}
 %   \item 语言,空置为中文,|_en| 为英文
@@ -7862,30 +8004,39 @@
 % \end{arguments}
 %    \begin{macrocode}
 %<*class>
-\cs_new_protected:Npn \@@_print_keywords:nn #1#2
+\cs_new_protected:Npn \@@_print_keywords:nn
+  { \@@_print_keywords:NNnn \l_@@_tmpa_tl \l_@@_tmpa_dim }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_print_keywords:NNnn}
+% \begin{arguments}
+%   \item |tl| 临时变量
+%   \item |dim| 临时变量
+% \end{arguments}
+%    \begin{macrocode}
+\cs_new:Npn \@@_print_keywords:NNnn #1#2#3#4
   {
-    \tl_set:Nv \l_@@_tmpa_tl { c_@@_name_keywords #1 _tl }
-    \exp_args:NNv \tl_put_left:Nn
-      \l_@@_tmpa_tl { c_@@_fmt_abslabel #1 _tl }
-    \exp_args:NNv \tl_put_right:Nn
-      \l_@@_tmpa_tl { c_@@_name_colon #1 _tl }
-    \@@_get_width:NV \l_@@_tmpa_dim \l_@@_tmpa_tl
+    \tl_set:Nv #1 { l_@@_name_keywords #3 _tl }
+    \exp_args:NNv \tl_put_left:Nn  #1 { l_@@_fmt_abslabel #3 _tl }
+    \exp_args:NNv \tl_put_right:Nn #1 { l_@@_name_colon   #3 _tl }
+    \@@_get_width:NV #2 #1
 %    \end{macrocode}
 % 关键词列表的悬挂缩进样式由 \tn{list} 环境产生。
 %    \begin{macrocode}
-    \list { \l_@@_tmpa_tl }
+    \list {#1}
       {
-        \labelwidth  \l_@@_tmpa_dim
+        \labelwidth  #2
         \labelsep    \c_zero_dim
         \leftmargin  \c_zero_dim
         \rightmargin \c_zero_dim
-        \advance \leftmargin \l_@@_tmpa_dim
+        \advance \leftmargin #2
 %    \end{macrocode}
 % 使用粗体作为标签样式。
 %    \begin{macrocode}
         \__nju_cs_clear:N \makelabel
       }
-    \item \clist_use:cn { g_@@_info_keywords #1 _clist } {#2}
+    \item \clist_use:cn { g_@@_info_keywords #3 _clist } {#4}
     \endlist
   }
 %</class>
@@ -7936,7 +8087,7 @@
 % \changes{v0.15}{2022/02/04}{可选择摘要是否出现在目录中。}
 % 是否将摘要添加到目录。
 %    \begin{macrocode}
-    toc-entry          .bool_set:N = \g_@@_abs_showentry_bool,
+    toc-entry         .bool_gset:N = \g_@@_abs_showentry_bool,
     toc-entry           .initial:n = true,
 %    \end{macrocode}
 % \end{macro}
@@ -7945,7 +8096,7 @@
 % \changes{v1.2}{2023/04/23}{新增研究生英文摘要页下划线选项。}
 % 是否为研究生英文摘要条目内容添加下划线。
 %    \begin{macrocode}
-    underline          .bool_set:N = \g_@@_abs_underline_bool,
+    underline         .bool_gset:N = \g_@@_abs_underline_bool,
     underline           .initial:n = true,
 %    \end{macrocode}
 % \end{macro}
@@ -7957,18 +8108,18 @@
     title-style          .choice:,
     title-style / strict   .code:n =
       {
-        \bool_set_true:N  \g_@@_abs_title_strict_bool
-        \skip_set:Nn \g_@@_abs_title_left_skip { .5 em }
+        \bool_gset_true:N  \g_@@_abs_title_strict_bool
+        \skip_gset:Nn \g_@@_abs_title_left_skip { .5 em }
       },
     title-style / centered .code:n =
       {
-        \bool_set_true:N \g_@@_abs_title_strict_bool
-        \skip_set:Nn \g_@@_abs_title_left_skip { .5 em plus 1 fill }
+        \bool_gset_true:N \g_@@_abs_title_strict_bool
+        \skip_gset:Nn \g_@@_abs_title_left_skip { .5 em plus 1 fill }
       },
     title-style / natural  .code:n =
       {
-        \bool_set_false:N \g_@@_abs_title_strict_bool
-        \skip_set:Nn \g_@@_abs_title_left_skip { .5 em plus 1 fill }
+        \bool_gset_false:N \g_@@_abs_title_strict_bool
+        \skip_gset:Nn \g_@@_abs_title_left_skip { .5 em plus 1 fill }
       },
     title-style         .initial:n = strict
   }
@@ -7983,7 +8134,7 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \@@_abs_bookmark:Vn \c_@@_name_abstracta_tl { abstract }
+    \@@_abs_bookmark:Vn \l_@@_name_abstracta_tl { abstract }
     \tl_gremove_all:Nn \g_@@_info_title_tl { \\ }
     \@@_make_abstract:
     \group_begin: \kaishu \zihao { -4 } #1
@@ -7999,7 +8150,7 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \@@_abs_bookmark:Vn \c_@@_name_abstracta_en_tl { abstract-en }
+    \@@_abs_bookmark:Vn \l_@@_name_abstracta_en_tl { abstract-en }
 %    \end{macrocode}
 % \changes{v1.3}{2023/08/21}{修复英文标题手动换行与摘要页的冲突。}
 % 生成封面后清除标题中的换行控制符,便于在摘要中输出。
@@ -8020,13 +8171,13 @@
 % 单独制作的前言致谢页。
 %    \begin{macrocode}
 \NewDocumentEnvironment { preface         } { +b }
-  { \@@_chapter:V \c_@@_name_preface_tl #1 }
+  { \@@_chapter:V \l_@@_name_preface_tl #1 }
   { \cleardoublepage }
 \NewDocumentEnvironment { acknowledgement } { +b }
   {
     \bool_if:NTF \g_@@_opt_anon_bool
-      { \@@_bookmark_toc:V \c_@@_name_acknowledgementa_tl   }
-      { \@@_chapter:V      \c_@@_name_acknowledgement_tl #1 }
+      { \@@_bookmark_toc:V \l_@@_name_acknowledgementa_tl   }
+      { \@@_chapter:V      \l_@@_name_acknowledgement_tl #1 }
   }
   { \cleardoublepage }
 %    \end{macrocode}
@@ -8043,7 +8194,7 @@
 % 成果列表。
 %    \begin{macrocode}
 \NewDocumentCommand \njupaperlist
-  { O { \c_@@_name_paperlist_tl } m }
+  { O { \l_@@_name_paperlist_tl } m }
   {
     \group_begin:
 %    \end{macrocode}
@@ -8051,15 +8202,15 @@
 %    \begin{macrocode}
       \RenewDocumentCommand \mkbibnamegiven  { m }
         { \ifitemannotation { thesisauthor }
-            { \njuline { \bf ##1 } } { ##1 } }
+            { \njuline { \bf ##1 } } {##1} }
       \RenewDocumentCommand \mkbibnamefamily { m }
         { \ifitemannotation { thesisauthor }
-            { \njuline { \bf ##1 } } { ##1 } }
+            { \njuline { \bf ##1 } } {##1} }
 %    \end{macrocode}
 % 修改年份的显示方式,默认进行加粗。
 %    \begin{macrocode}
       \RenewDocumentCommand \mkbibdateshort { m m m }
-        { \textbf { \thefield { ##1 } } }
+        { \textbf { \thefield {##1} } }
 %    \end{macrocode}
 % \changes{v1.1}{2023/04/07}{修复章末参考文献表与成果列表的冲突问题。}
 % 相较于直接使用 \env{refsection} 环境,\tn{newrefsection} 命令可以
@@ -8126,7 +8277,7 @@
 %    \begin{macrocode}
 \NewDocumentEnvironment { notation } { O { 10 em } O { 5 em } }
   {
-    \@@_chapter:V \c_@@_name_notation_tl
+    \@@_chapter:V \l_@@_name_notation_tl
     \@@_make_notation:nn {#1} {#2}
   }
   { \endlist \cleardoublepage }
@@ -8138,7 +8289,7 @@
 %    \begin{macrocode}
 \NewDocumentEnvironment { notation* } { O { 10 em } O { 5 em } }
   {
-    \chapter * { \c_@@_name_notation_tl }
+    \chapter * { \l_@@_name_notation_tl }
     \@@_make_notation:nn {#1} {#2}
   }
   { \endlist \cleardoublepage }
@@ -8241,8 +8392,8 @@
 %<def-g>    { secret status     } { 论文涉密情况:                     },
 %<def-g>    { secret free       } { 不保密                             },
 %<def-g>    { secret date       }
-%<def-g>      { 保密,保密期( \c_@@_name_blankdatea_tl 至
-%<def-g>                       \c_@@_name_blankdatea_tl )           },
+%<def-g>      { 保密,保密期( \l_@@_name_blankdatea_tl 至
+%<def-g>                       \l_@@_name_blankdatea_tl )           },
 %<def-g>    { sign              } { (签字)                           },
 %<def-g>    { sign            a } { 研究生签名                         },
 %<def-g>    { sign            b } { 导师签名                           },
@@ -8300,10 +8451,10 @@
 %    \begin{macrocode}
     { abstract    b } { 摘\qquad{}要    } { ABSTRACT              },
 %<def-u|def-g>    { abstracttitle }
-%<def-u>      { \c_@@_name_nju_tl 本科生毕业论文(设计、作品)中文摘要  }
-%<def-u>      { \c_@@_name_nju_tl 本科生毕业论文(设计、作品)英文摘要  },
-%<def-g>      { \c_@@_name_nju_tl 研究生毕业论文中文摘要首页用纸        }
-%<def-g>      { \c_@@_name_nju_tl 研究生毕业论文英文摘要首页用纸        },
+%<def-u>      { \l_@@_name_nju_tl 本科生毕业论文(设计、作品)中文摘要  }
+%<def-u>      { \l_@@_name_nju_tl 本科生毕业论文(设计、作品)英文摘要  },
+%<def-g>      { \l_@@_name_nju_tl 研究生毕业论文中文摘要首页用纸        }
+%<def-g>      { \l_@@_name_nju_tl 研究生毕业论文英文摘要首页用纸        },
     { appendix      } { 附录            } { appendix              },
 %<def-u>    { author        } { 学生姓名        } { UNDERGRADUATE         },
 %<def-g>    { author        } { 作者姓名        } { POSTGRADUATE          },
@@ -8333,10 +8484,10 @@
 % \subsubsection{文本}
 % \label{subsubsec:constant-text}
 %
-% \begin{variable}{\c_@@_text_origdecl_tl}
+% \begin{variable}{\l_@@_text_origdecl_tl}
 % 本科生的学位论文诚信承诺书,或研究生的学位论文原创性声明。
 %    \begin{macrocode}
-\tl_const:Nn \c_@@_text_origdecl_tl
+\tl_set:Nn \l_@@_text_origdecl_tl
   {
 %<*def-u>
     本人郑重承诺:所呈交的毕业论文(设计)(题目: \g_@@_info_title_tl )
@@ -8362,11 +8513,11 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\c_@@_text_authdecl_tl}
+% \begin{variable}{\l_@@_text_authdecl_tl}
 % 研究生的学位论文出版授权书。
 %    \begin{macrocode}
 %<*(def-g|def-p)>
-\tl_const:Nn \c_@@_text_authdecl_tl
+\tl_set:Nn \l_@@_text_authdecl_tl
   {
 %<*def-g>
     本人完全同意《中国优秀博硕士学位论文全文数据库出版章程》(以下简称“章
@@ -8389,14 +8540,14 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\c_@@_text_cover_en_tl}
+% \begin{variable}{\l_@@_text_cover_en_tl}
 % 研究生的英文封面字样。
 %    \begin{macrocode}
 %<*def-g>
-\tl_const:Nn \c_@@_text_cover_en_tl
+\tl_set:Nn \l_@@_text_cover_en_tl
   {
     A~ dissertation~ submitted~ to \\
-    the~ graduate~ school~ of~ \c_@@_name_nju_en_tl \\
+    the~ graduate~ school~ of~ \l_@@_name_nju_en_tl \\
     in~ partial~ fulfilment~ of~ the~ requirements~ for~ the~ degree~ of
   }
 %</def-g>
@@ -8497,15 +8648,15 @@
 % 各级标题样式。
 %    \begin{macrocode}
     { section       } { \bigger \normalfont \sffamily     },
-    { chapter       } { \c_@@_fmt_section_tl \centering },
-    { subsection    } { \c_@@_fmt_section_tl            },
-    { subsubsection } { \c_@@_fmt_section_tl            },
-    { paragraph     } { \c_@@_fmt_section_tl            },
-    { subparagraph  } { \c_@@_fmt_section_tl            },
+    { chapter       } { \l_@@_fmt_section_tl \centering },
+    { subsection    } { \l_@@_fmt_section_tl            },
+    { subsubsection } { \l_@@_fmt_section_tl            },
+    { paragraph     } { \l_@@_fmt_section_tl            },
+    { subparagraph  } { \l_@@_fmt_section_tl            },
 %    \end{macrocode}
 % 目录中的章标题样式。
 %    \begin{macrocode}
-    { chapterintoc  } { \c_@@_fmt_section_tl            },
+    { chapterintoc  } { \l_@@_fmt_section_tl            },
 %    \end{macrocode}
 % “目录”二字的样式。
 %    \begin{macrocode}
@@ -8541,8 +8692,8 @@
 %    \begin{macrocode}
 \keys_define:nn { njudoc }
   {
-    codehigh .bool_set:N = \g_@@_codehigh_bool,
-    codehigh  .initial:n = false
+    codehigh .bool_gset:N = \g_@@_codehigh_bool,
+    codehigh   .initial:n = false
   }
 \ProcessKeysOptions { njudoc }
 %    \end{macrocode}
@@ -8585,12 +8736,29 @@
   }
 %    \end{macrocode}
 %
-% 处理 \cls{l3doc} 新追加的 |e| 型展开。
+% 处理丢失的展开类型实现向后兼容。在2023年11月,\cls{l3doc} 进行了一系列展开类型修改。
+% 详见 \href{https://github.com/CTeX-org/ctex-kit/pull/678}{\texttt{CTeX-org/ctex-kit\#678}}
+% 以及 \href{https://github.com/CTeX-org/ctex-kit/pull/700}{\texttt{CTeX-org/ctex-kit\#700}}。
 %    \begin{macrocode}
-\cs_if_exist:NF \__codedoc_get_hyper_target:xN
-  { \cs_new_eq:NN \__codedoc_get_hyper_target:xN \__codedoc_get_hyper_target:eN }
+\cs_generate_variant:Nn \__codedoc_get_hyper_target:nN { x }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { No }
 %    \end{macrocode}
 %
+% 处理向后兼容。见 \href{https://github.com/CTeX-org/ctex-kit/pull/703}{\texttt{CTeX-org/ctex-kit\#703}}。
+%    \begin{macrocode}
+\cs_if_exist:NF \__codedoc_macroname_prefix:o
+  {
+    \cs_new_protected:Npn \__codedoc_macroname_prefix:n #1
+      {
+        \__codedoc_if_macro_internal:nTF {#1}
+          { \__codedoc_typeset_aux:n {#1} } {#1}
+      }
+    \cs_generate_variant:Nn \__codedoc_macroname_prefix:n { o }
+    \cs_new_protected:Npn \__codedoc_macroname_suffix:N #1
+      { \bool_if:NTF #1 { \__codedoc_typeset_TF: } { } }
+  }
+%    \end{macrocode}
+%
 % \subsubsection{杂项}
 %
 % 封面背景图案。

Modified: trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.ins	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/source/latex/njuthesis/njuthesis.ins	2024-03-19 20:38:58 UTC (rev 70705)
@@ -6,7 +6,7 @@
 %%
 %% njuthesis.dtx  (with options: `install')
 %% 
-%% Copyright (C) 2021 - 2023
+%% Copyright (C) 2021 - 2024
 %% by Nanjing University Linux User Group
 %% <git+nju-lug-email-3104-issue- at yaoge123.cn>
 %% 
@@ -29,7 +29,7 @@
 
 \preamble
 
-Copyright (C) 2021 - 2023
+Copyright (C) 2021 - 2024
 by Nanjing University Linux User Group
 <git+nju-lug-email-3104-issue- at yaoge123.cn>
 

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-doc.cls	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-doc.cls	2024-03-19 20:38:58 UTC (rev 70705)
@@ -6,7 +6,7 @@
 %%
 %% njuthesis.dtx  (with options: `doc-cls')
 %% 
-%% Copyright (C) 2021 - 2023
+%% Copyright (C) 2021 - 2024
 %% by Nanjing University Linux User Group
 %% <git+nju-lug-email-3104-issue- at yaoge123.cn>
 %% 
@@ -23,7 +23,7 @@
 %% To produce the documentation run the original source files ending with
 %% `.dtx' through XeTeX.
 %% 
-\GetIdInfo $Id: njuthesis.dtx 1.3.2 2023-12-05 16:30:00
+\GetIdInfo $Id: njuthesis.dtx 1.4.0 2024-03-19 20:30:00
   +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Documentation style for njuthesis}
 \ProvidesExplFile{njuthesis-doc.cls}
@@ -32,8 +32,8 @@
 \RequirePackage { l3keys2e }
 \keys_define:nn { njudoc }
   {
-    codehigh .bool_set:N = \g__njudoc_codehigh_bool,
-    codehigh  .initial:n = false
+    codehigh .bool_gset:N = \g__njudoc_codehigh_bool,
+    codehigh   .initial:n = false
   }
 \ProcessKeysOptions { njudoc }
 \PassOptionsToPackage { fontset = fandol } { ctex       }
@@ -61,8 +61,19 @@
     \NewDocumentCommand \CJKsout      { o m }
       { \textcolor { black!50 } {#1} }
   }
-\cs_if_exist:NF \__codedoc_get_hyper_target:xN
-  { \cs_new_eq:NN \__codedoc_get_hyper_target:xN \__codedoc_get_hyper_target:eN }
+\cs_generate_variant:Nn \__codedoc_get_hyper_target:nN { x }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { No }
+\cs_if_exist:NF \__codedoc_macroname_prefix:o
+  {
+    \cs_new_protected:Npn \__codedoc_macroname_prefix:n #1
+      {
+        \__codedoc_if_macro_internal:nTF {#1}
+          { \__codedoc_typeset_aux:n {#1} } {#1}
+      }
+    \cs_generate_variant:Nn \__codedoc_macroname_prefix:n { o }
+    \cs_new_protected:Npn \__codedoc_macroname_suffix:N #1
+      { \bool_if:NTF #1 { \__codedoc_typeset_TF: } { } }
+  }
 \backgroundsetup{
   contents={\njuemblem[white!85!gray]{22cm}{!}},
   scale=1, angle=0, hshift=-4cm

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-graduate.def	2024-03-19 20:38:58 UTC (rev 70705)
@@ -6,7 +6,7 @@
 %%
 %% njuthesis.dtx  (with options: `def-g')
 %% 
-%% Copyright (C) 2021 - 2023
+%% Copyright (C) 2021 - 2024
 %% by Nanjing University Linux User Group
 %% <git+nju-lug-email-3104-issue- at yaoge123.cn>
 %% 
@@ -23,7 +23,7 @@
 %% To produce the documentation run the original source files ending with
 %% `.dtx' through XeTeX.
 %% 
-\GetIdInfo $Id: njuthesis.dtx 1.3.2 2023-12-05 16:30:00
+\GetIdInfo $Id: njuthesis.dtx 1.4.0 2024-03-19 20:30:00
   +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Graduate definition file for njuthesis}
 \ProvidesExplFile{njuthesis-graduate.def}
@@ -33,26 +33,26 @@
 \cs_set:Npn \__nju_date:nn #1#2
   { \__nju_date:nnn { } {#1} {#2} \__nju_date:nnn { _en } {#1} {#2} }
 \tl_new:N  \g__nju_info_confer_tl
-\tl_set:Nn \g__nju_info_confer_tl
+\tl_gset:Nn \g__nju_info_confer_tl
   {
-    \textbf { \c__nju_name_nju_tl } \hfil
+    \textbf { \l__nju_name_nju_tl } \hfil
     \g__nju_info_conferdate_tl
   }
 \tl_new:N  \g__nju_info_type_tl
-\tl_set:Ne \g__nju_info_type_tl
+\tl_gset:Ne \g__nju_info_type_tl
   { \clist_item:Nn \c__nju_name_type_clist { \g__nju_info_type_int } }
 \tl_new:N     \g__nju_info_degree_tl
-\tl_set_eq:NN \g__nju_info_degree_tl \g__nju_info_type_tl
+\tl_gset_eq:NN \g__nju_info_degree_tl \g__nju_info_type_tl
 \bool_if:NF \g__nju_opt_academic_bool
-  { \tl_put_right:Nn \g__nju_info_degree_tl { 专业 } }
+  { \tl_gput_right:Nn \g__nju_info_degree_tl { 专业 } }
 \tl_new:N  \g__nju_info_degree_en_tl
-\tl_set:Ne \g__nju_info_degree_en_tl
+\tl_gset:Ne \g__nju_info_degree_en_tl
   { \clist_item:Nn \c__nju_name_type_en_clist { \g__nju_info_type_int } }
 \ctex_at_end_preamble:n { \__nju_loadfont_stzhongs: }
 \cs_new_protected:Npn \__nju_decl_sign:
   {
     \clist_map_inline:nn { origsign,     date }
-      { \tex_par:D \__nju_name:n { ##1 } : \hbox_to_wd:nn { 6 em } { } }
+      { \tex_par:D \__nju_name:n {##1} : \hbox_to_wd:nn { 6 em } { } }
   }
 \__nju_declare_element:nn { g / cover-front / top }
   {
@@ -65,12 +65,12 @@
   }
 \__nju_declare_element:nn { g / cover-front / emblem-img }
   {
-    content     = \__nju_emblem:N \c__nju_emblemwd_dim,
+    content     = \__nju_emblem:N \l__nju_emblemwd_dim,
     bottom-skip = .47 cm
   }
 \__nju_declare_element:nn { g / cover-front / name-img }
   {
-    content     = \__nju_name:N \c__nju_namewd_dim,
+    content     = \__nju_name:N \l__nju_namewd_dim,
     bottom-skip = 2.25 cm
   }
 \__nju_declare_element:nn { g / cover-front / type }
@@ -97,8 +97,8 @@
     \__nju_get_width:NV \l__nju_tmpb_dim \g__nju_info_id_tl
     \clist_map_inline:nn { code, clc, secretlv, udc, id }
       {
-        \__nju_cover_entry:NNNNn \c__nju_name_colon_tl \l__nju_tmpa_dim
-          \l__nju_tmpb_dim \tex_relax:D { ##1 }
+        \__nju_cover_entry:NNNNn \l__nju_name_colon_tl \l__nju_tmpa_dim
+          \l__nju_tmpb_dim \tex_relax:D {##1}
       }
   }
 \cs_new_protected:Npn \__nju_g_cover_info:NNNNN #1#2#3#4#5
@@ -108,13 +108,13 @@
       { \clist_set:Nn #1 { author, majorc, field, supvfull } }
     \__nju_cover_entry_title:NNNN #2 #3 #4 #5
     \clist_map_inline:Nn #1
-      { \__nju_cover_entry:NNNNn #2 #3 #4 #5 { ##1 } }
+      { \__nju_cover_entry:NNNNn #2 #3 #4 #5 {##1} }
   }
 \cs_new:Npn \__nju_g_cover_info:
   {
     \tl_set:Nn \l__nju_tmpa_tl { \skip_horizontal:n { .7 cm } }
     \__nju_g_cover_info:NNNNN \l__nju_tmp_clist \l__nju_tmpa_tl
-      \c__nju_clabelwd_dim \c__nju_crulewd_dim \c__nju_fmt_coverlabel_tl
+      \l__nju_clabelwd_dim \l__nju_crulewd_dim \l__nju_fmt_coverlabel_tl
   }
 \__nju_declare_element:nn { g / cover-back / info }
   {
@@ -143,8 +143,8 @@
   }
 \cs_new:Npn \__nju_g_cover_back:
   {
-    \__nju_g_cover_back:NNN \c__nju_clabelwdi_dim
-      \c__nju_crulewdi_dim \c__nju_fmt_coverlabel_tl
+    \__nju_g_cover_back:NNN \l__nju_clabelwdi_dim
+      \l__nju_crulewdi_dim \l__nju_fmt_coverlabel_tl
   }
 \cs_new_protected:Npn \__nju_g_cover_sign:NNN #1#2#3
   {
@@ -153,8 +153,8 @@
   }
 \cs_new:Npn \__nju_g_cover_sign:
   {
-    \__nju_g_cover_sign:NNN \c__nju_clabelwdii_dim
-      \c__nju_fmt_coverlabel_tl \c__nju_name_colon_tl
+    \__nju_g_cover_sign:NNN \l__nju_clabelwdii_dim
+      \l__nju_fmt_coverlabel_tl \l__nju_name_colon_tl
   }
 \__nju_declare_element:nn { g / cover-en / title }
   {
@@ -179,7 +179,7 @@
 \__nju_declare_element:nn { g / cover-en / middle }
   {
     content     =
-      \c__nju_text_cover_en_tl \__nju_vskip:
+      \l__nju_text_cover_en_tl \__nju_vskip:
       \group_begin: \scshape \g__nju_info_degree_en_tl \group_end:
       \__nju_vskip: { in } \__nju_vskip: \g__nju_info_major_en_tl,
     bottom-skip = .5 cm plus 1 fil
@@ -186,7 +186,7 @@
   }
 \__nju_declare_element:nn { g / cover-en / emblem-img }
   {
-    content     = \__nju_emblem:N \c__nju_emblemwdii_dim,
+    content     = \__nju_emblem:N \l__nju_emblemwdii_dim,
     bottom-skip = 1 cm minus .5 cm
   }
 \__nju_declare_element:nn { g / cover-en / bottom }
@@ -193,7 +193,7 @@
   {
     content =
       \g__nju_info_dept_en_tl \skip_vertical:N \c_zero_skip
-      \c__nju_name_nju_en_tl  \skip_vertical:n { 1 cm }
+      \l__nju_name_nju_en_tl  \skip_vertical:n { 1 cm }
       \g__nju_info_submitdate_en_tl
   }
 \__nju_declare_element:nn { cover-nl / top }
@@ -232,16 +232,18 @@
     content = \g__nju_info_bottomdate_tl,
     format  = \kaishu \zihao { 3 }
   }
-\cs_new_protected:Npn \__nju_cover_top_nl:
+\cs_new:Npn \__nju_cover_top_nl:
+  { \__nju_cover_top_nl:NN \l__nju_tmpa_dim \l__nju_tmpb_dim }
+\cs_new_protected:Npn \__nju_cover_top_nl:NN #1#2
   {
-    \dim_set:Nn               \l__nju_tmpa_dim { 38.6 pt  }
-    \dim_set:Nn               \l__nju_tmpb_dim { 109  pt  }
-    \__nju_box_spread_name:Nn \l__nju_tmpa_dim { clc      } \__nju_hskip:
-    \__nju_box_ulined_info:Nn \l__nju_tmpb_dim { clc      } \tex_hfill:D
-    \__nju_box_spread_name:Nn \l__nju_tmpa_dim { secretlv } \__nju_hskip:
-    \__nju_box_ulined_info:Nn \l__nju_tmpb_dim { secretlv } \tex_par:D
-    \__nju_box_spread_name:Nn \l__nju_tmpa_dim { udc      } \__nju_hskip:
-    \__nju_box_ulined_info:Nn \l__nju_tmpb_dim { udc      } \tex_hfill:D
+    \dim_set:Nn               #1 { 38.6 pt  }
+    \dim_set:Nn               #2 { 109  pt  }
+    \__nju_box_spread_name:Nn #1 { clc      } \__nju_hskip:
+    \__nju_box_ulined_info:Nn #2 { clc      } \tex_hfill:D
+    \__nju_box_spread_name:Nn #1 { secretlv } \__nju_hskip:
+    \__nju_box_ulined_info:Nn #2 { secretlv } \tex_par:D
+    \__nju_box_spread_name:Nn #1 { udc      } \__nju_hskip:
+    \__nju_box_ulined_info:Nn #2 { udc      } \tex_hfill:D
     \__nju_null:
   }
 \cs_new_protected:Npn \__nju_cover_title_nl:
@@ -248,12 +250,12 @@
   {
     \parbox [ b ] { 15 em } { \__nju_uline_title: } \tex_par:D
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } \c__nju_name_subtitle_tl }
+    { \zihao { 4 } \l__nju_name_subtitle_tl }
     \skip_vertical:N \c_zero_skip
     \dim_set:Nn \l__nju_tmpa_dim { 4.5 em }
     \__nju_box_ulined_info:Nn \l__nju_tmpa_dim { author }
     \skip_vertical:n { - 0.5 cm }
-    { \zihao { 4 } { ( } \c__nju_name_author_tl { ) } }
+    { \zihao { 4 } { ( } \l__nju_name_author_tl { ) } }
   }
 \cs_new_protected:Npn \__nju_cover_info_nl:
   {
@@ -265,9 +267,9 @@
       }
     \skip_set:Nn \l__nju_tmp_skip { .5 em plus 1 fill }
     \__nju_uline_list:NNn \l__nju_tmpa_tl \l__nju_tmp_skip
-      { \c__nju_name_supvinfo_tl }
+      { \l__nju_name_supvinfo_tl }
     \group_begin:
-      \tl_set_eq:NN \c__nju_name_major_tl \c__nju_name_majorb_tl
+      \tl_set_eq:NN \l__nju_name_major_tl \l__nju_name_majorb_tl
       \__nju_uline_bientry:Nn \l__nju_tmpa_dim { degree   }
       \__nju_uline_bientry:Nn \l__nju_tmpa_dim { major    }
       \tex_par:D
@@ -287,13 +289,13 @@
   }
 \__nju_declare_element:nn { g / decl / orig / title }
   {
-    content     = \c__nju_name_origdecl_tl,
-    format      = \c__nju_fmt_chapter_tl,
-    bottom-skip = \c__nju_chapterafter_dim
+    content     = \l__nju_name_origdecl_tl,
+    format      = \l__nju_fmt_chapter_tl,
+    bottom-skip = \l__nju_chapterafter_dim
   }
 \__nju_declare_element:nn { g / decl / orig / text }
   {
-    content     = \c__nju_text_origdecl_tl,
+    content     = \l__nju_text_origdecl_tl,
     align       = n,
     bottom-skip = 0 pt plus 1 fil
   }
@@ -304,13 +306,13 @@
   }
 \__nju_declare_element:nn { g / decl / auth / title }
   {
-    content     = \c__nju_name_authdecl_tl,
-    format      = \c__nju_fmt_chapter_tl,
-    bottom-skip = \c__nju_chapterafter_dim
+    content     = \l__nju_name_authdecl_tl,
+    format      = \l__nju_fmt_chapter_tl,
+    bottom-skip = \l__nju_chapterafter_dim
   }
 \__nju_declare_element:nn { g / decl / auth / text }
   {
-    content     = \c__nju_text_authdecl_tl,
+    content     = \l__nju_text_authdecl_tl,
     align       = n,
     bottom-skip = 2 cm
   }
@@ -354,12 +356,12 @@
         cell{1}{2} = {c=5}{m}, cell{3}{2} = {c=5}{m},
         cell{4}{2} = {c=5}{m}, cell{5}{2} = {c=5}{m}
       }
-      \c__nju_name_titlec_tl  & \g__nju_info_title_tl \\
-      \c__nju_name_ida_tl     & \g__nju_info_id_tl    &
-      \c__nju_name_depta_tl   & \g__nju_info_dept_tl  &
-      \c__nju_name_year_tl    &
+      \l__nju_name_titlec_tl  & \g__nju_info_title_tl \\
+      \l__nju_name_ida_tl     & \g__nju_info_id_tl    &
+      \l__nju_name_depta_tl   & \g__nju_info_dept_tl  &
+      \l__nju_name_year_tl    &
         \tl_range:Nnn \g__nju_info_submitdate_tl {1} {4} \\
-      \c__nju_name_degreea_tl &
+      \l__nju_name_degreea_tl &
         {
           \__nju_degree_checkbox:nn {   } { 2 } 学术学位硕士 \qquad
           \__nju_degree_checkbox:nn { ! } { 2 } 专业学位硕士 \\
@@ -366,8 +368,8 @@
           \__nju_degree_checkbox:nn {   } { 3 } 学术学位博士 \qquad
           \__nju_degree_checkbox:nn { ! } { 3 } 专业学位博士
         } \\
-      \c__nju_name_email_tl   & \g__nju_info_email_tl \\
-      \c__nju_name_supvb_tl   &
+      \l__nju_name_email_tl   & \g__nju_info_email_tl \\
+      \l__nju_name_supvb_tl   &
         \clist_item:Nn \g__nju_info_supv_clist { 1 }
         \bool_if:NT \g__nju_opt_supvii_bool
           { \__nju_quad: \clist_item:Nn \g__nju_info_supvii_clist { 1 } } \\
@@ -374,15 +376,12 @@
     \end{tblr}
   }
 \cs_new_protected:Npn \__nju_g_decl_auth_sign:
-  {
-    \c__nju_name_authsign_tl \tex_par:D
-    \c__nju_name_blankdatea_tl
-  }
+  { \l__nju_name_authsign_tl \tex_par:D \l__nju_name_blankdatea_tl }
 \cs_new_protected:Npn \__nju_g_decl_auth_secretlv:
   {
-    \c__nju_name_secretstatus_tl \tex_par:D
-    \ensuremath { \mdwhtsquare } \c__nju_name_secretfree_tl \tex_par:D
-    \ensuremath { \mdwhtsquare } \c__nju_name_secretdate_tl
+    \l__nju_name_secretstatus_tl \tex_par:D
+    \ensuremath { \mdwhtsquare } \l__nju_name_secretfree_tl \tex_par:D
+    \ensuremath { \mdwhtsquare } \l__nju_name_secretdate_tl
   }
 \__nju_declare_page:nn { cover-g-front }
   {
@@ -415,9 +414,9 @@
   {
     element     = { title, text, sign },
     prefix      = g / decl / orig /,
-    top-skip    = \c__nju_chapterbefore_dim,
+    top-skip    = \l__nju_chapterbefore_dim,
     bottom-skip = 0 pt plus 1 fil,
-    bm-text     = \c__nju_name_origdecl_tl,
+    bm-text     = \l__nju_name_origdecl_tl,
     bm-name     = origdecl
   }
 \__nju_declare_page:nn { authdecl-g }
@@ -424,9 +423,9 @@
   {
     element     = { title, text, sign, info, date },
     prefix      = g / decl / auth /,
-    top-skip    = \c__nju_chapterbefore_dim,
+    top-skip    = \l__nju_chapterbefore_dim,
     bottom-skip = 0.5 cm plus 1.5 fill,
-    bm-text     = \c__nju_name_authdecl_tl,
+    bm-text     = \l__nju_name_authdecl_tl,
     bm-name     = authdecl,
     bookmark    = toc
   }
@@ -457,13 +456,13 @@
   }
 \__nju_declare_element:nn { abstract / title }
   {
-    content     = \__nju_abs_title:N \c__nju_name_abstracttitle_tl,
+    content     = \__nju_abs_title:N \l__nju_name_abstracttitle_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 20 pt
   }
 \__nju_declare_element:nn { abstract / en / title }
   {
-    content     = \__nju_abs_title:N \c__nju_name_abstracttitle_en_tl,
+    content     = \__nju_abs_title:N \l__nju_name_abstracttitle_en_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 20 pt
   }
@@ -483,35 +482,35 @@
   }
 \__nju_declare_element:nn { abstract / mark }
   {
-    content     = \c__nju_name_abstractb_tl,
+    content     = \l__nju_name_abstractb_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 15 pt
   }
 \__nju_declare_element:nn { abstract / en / mark }
   {
-    content     = \c__nju_name_abstractb_en_tl,
+    content     = \l__nju_name_abstractb_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 15 pt
   }
 \cs_new_protected:Npn \__nju_abs_info_g:
-  { \__nju_abs_info_g:N    \c__nju_name_colon_tl    }
+  { \__nju_abs_info_g:N    \l__nju_name_colon_tl    }
 \cs_new_protected:Npn \__nju_abs_info_en_g:
-  { \__nju_abs_info_en_g:N \c__nju_name_colon_en_tl }
+  { \__nju_abs_info_en_g:N \l__nju_name_colon_en_tl }
 \cs_new_protected:Npn \__nju_abs_info_g:N #1
   {
     \__nju_uline_list:NNe \g__nju_info_title_tl \g__nju_abs_title_left_skip
-      { \c__nju_name_titlea_tl #1 }
+      { \l__nju_name_titlea_tl #1 }
     \__nju_get_width_print:Ne \l__nju_tmp_skip
       {
         \dim_set:Nn \l__nju_tmpa_dim { 11 em }
         \dim_set:Nn \l__nju_tmpb_dim { 4  em }
         \__nju_box_ulined_info:Nn \l__nju_tmpa_dim { major }
-        \c__nju_name_majora_tl
+        \l__nju_name_majora_tl
         \__nju_box_ulined_info:Nn \l__nju_tmpb_dim { grade }
-        \c__nju_name_grade_tl \c__nju_name_authora_tl #1
+        \l__nju_name_grade_tl \l__nju_name_authora_tl #1
       }
     \__nju_box_ulined_info:Nn \l__nju_tmp_skip { author } \tex_par:D
-    \__nju_get_width_print:Ne \l__nju_tmpa_dim { \c__nju_name_supva_tl #1 }
+    \__nju_get_width_print:Ne \l__nju_tmpa_dim { \l__nju_name_supva_tl #1 }
     \__nju_box_ulined_info:Nn \l__nju_tmpa_dim { supvfull }
   }
 \cs_new_protected:Npn \__nju_abs_info_en_g:N #1
@@ -519,7 +518,7 @@
     \bool_if:NTF \g__nju_abs_underline_bool
       {
         \__nju_uline_list:NNe \g__nju_info_title_en_tl
-          \g__nju_abs_title_left_skip { \c__nju_name_title_en_tl #1 }
+          \g__nju_abs_title_left_skip { \l__nju_name_title_en_tl #1 }
         \clist_map_inline:nn { major, author, supvfull }
           {
             \tex_par:D
@@ -582,8 +581,8 @@
     { secret status     } { 论文涉密情况:                     },
     { secret free       } { 不保密                             },
     { secret date       }
-      { 保密,保密期( \c__nju_name_blankdatea_tl 至
-                       \c__nju_name_blankdatea_tl )           },
+      { 保密,保密期( \l__nju_name_blankdatea_tl 至
+                       \l__nju_name_blankdatea_tl )           },
     { sign              } { (签字)                           },
     { sign            a } { 研究生签名                         },
     { sign            b } { 导师签名                           },
@@ -611,8 +610,8 @@
     { abstract    a } { 中文摘要        } { ABSTRACT              },
     { abstract    b } { 摘\qquad{}要    } { ABSTRACT              },
     { abstracttitle }
-      { \c__nju_name_nju_tl 研究生毕业论文中文摘要首页用纸        }
-      { \c__nju_name_nju_tl 研究生毕业论文英文摘要首页用纸        },
+      { \l__nju_name_nju_tl 研究生毕业论文中文摘要首页用纸        }
+      { \l__nju_name_nju_tl 研究生毕业论文英文摘要首页用纸        },
     { appendix      } { 附录            } { appendix              },
     { author        } { 作者姓名        } { POSTGRADUATE          },
     { blankdate     } { \qquad{}年 \quad{}月 \quad{}日   } {      },
@@ -632,7 +631,7 @@
     { type          } {     学位论文                        } { g }
   }
   { \__nju_define_name:nnn #1 }
-\tl_const:Nn \c__nju_text_origdecl_tl
+\tl_set:Nn \l__nju_text_origdecl_tl
   {
     本人郑重声明,所提交的学位论文是本人在导师指导下独立进行科学研究工作所
     取得的成果。除本论文中已经注明引用的内容外,本论文不包含其他个人或集体
@@ -640,7 +639,7 @@
     证书而使用过的材料。对本文的研究做出重要贡献的个人和集体,均已在论文的
     致谢部分明确标明。本人郑重申明愿承担本声明的法律责任。
   }
-\tl_const:Nn \c__nju_text_authdecl_tl
+\tl_set:Nn \l__nju_text_authdecl_tl
   {
     本人完全同意《中国优秀博硕士学位论文全文数据库出版章程》(以下简称“章
     程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《
@@ -650,10 +649,10 @@
     总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意
     按“章程”规定享受相关权益。
   }
-\tl_const:Nn \c__nju_text_cover_en_tl
+\tl_set:Nn \l__nju_text_cover_en_tl
   {
     A~ dissertation~ submitted~ to \\
-    the~ graduate~ school~ of~ \c__nju_name_nju_en_tl \\
+    the~ graduate~ school~ of~ \l__nju_name_nju_en_tl \\
     in~ partial~ fulfilment~ of~ the~ requirements~ for~ the~ degree~ of
   }
 \clist_map_inline:nn
@@ -689,12 +688,12 @@
     { emblem color  } { black                             },
     { name   color  } { black                             },
     { section       } { \bigger \normalfont \sffamily     },
-    { chapter       } { \c__nju_fmt_section_tl \centering },
-    { subsection    } { \c__nju_fmt_section_tl            },
-    { subsubsection } { \c__nju_fmt_section_tl            },
-    { paragraph     } { \c__nju_fmt_section_tl            },
-    { subparagraph  } { \c__nju_fmt_section_tl            },
-    { chapterintoc  } { \c__nju_fmt_section_tl            },
+    { chapter       } { \l__nju_fmt_section_tl \centering },
+    { subsection    } { \l__nju_fmt_section_tl            },
+    { subsubsection } { \l__nju_fmt_section_tl            },
+    { paragraph     } { \l__nju_fmt_section_tl            },
+    { subparagraph  } { \l__nju_fmt_section_tl            },
+    { chapterintoc  } { \l__nju_fmt_section_tl            },
     { tabular       } { \zihao { 5 }                      },
     { toc title     } { \centering \zihao { 3 } \bfseries },
     { header        } { \small \kaishu                    },

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-postdoctoral.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-postdoctoral.def	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-postdoctoral.def	2024-03-19 20:38:58 UTC (rev 70705)
@@ -6,7 +6,7 @@
 %%
 %% njuthesis.dtx  (with options: `def-p')
 %% 
-%% Copyright (C) 2021 - 2023
+%% Copyright (C) 2021 - 2024
 %% by Nanjing University Linux User Group
 %% <git+nju-lug-email-3104-issue- at yaoge123.cn>
 %% 
@@ -23,7 +23,7 @@
 %% To produce the documentation run the original source files ending with
 %% `.dtx' through XeTeX.
 %% 
-\GetIdInfo $Id: njuthesis.dtx 1.3.2 2023-12-05 16:30:00
+\GetIdInfo $Id: njuthesis.dtx 1.4.0 2024-03-19 20:30:00
   +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Postdoctoral definition file for njuthesis}
 \ProvidesExplFile{njuthesis-postdoctoral.def}
@@ -31,12 +31,12 @@
 
 \__nju_declare_element:nn { p / cover / name-img }
   {
-    content     = \__nju_name:N \c__nju_namewd_dim,
+    content     = \__nju_name:N \l__nju_namewd_dim,
     bottom-skip = 40 pt
   }
 \__nju_declare_element:nn { p / cover / report }
   {
-    content     = \c__nju_name_report_tl,
+    content     = \l__nju_name_report_tl,
     format      = \zihao { 0 } \sffamily,
     bottom-skip = 40 pt plus 1.5 fil
   }
@@ -43,8 +43,8 @@
 \__nju_declare_element:nn { p / cover / title }
   {
     content     =
-      \c__nju_name_title_tl
-      \c__nju_name_colon_tl
+      \l__nju_name_title_tl
+      \l__nju_name_colon_tl
       \g__nju_info_title_tl,
     format      = \zihao { 4 },
     bottom-skip = 80 pt
@@ -51,13 +51,12 @@
   }
 \__nju_declare_element:nn { p / cover / info }
   {
-    content     =
-      \__nju_p_cover_info:NN
-        \c__nju_clabelwd_dim
-        \c__nju_fmt_coverlabel_tl,
+    content     = \__nju_p_cover_info:,
     format      = \zihao { -4 },
     bottom-skip = 0 pt
   }
+\cs_new:Npn \__nju_p_cover_info:
+  { \__nju_p_cover_info:NN \l__nju_clabelwd_dim \l__nju_fmt_coverlabel_tl }
 \cs_new_protected:Npn \__nju_p_cover_info:NN #1#2
   {
     \clist_set:Nn \l__nju_tmp_clist
@@ -65,21 +64,21 @@
     \__nju_get_max_width:NN \l__nju_tmpb_dim \l__nju_tmp_clist
     \clist_map_inline:Nn \l__nju_tmp_clist
       {
-        \__nju_box_spread_name:NNn #1 #2 { ##1 }
-        \c__nju_name_colon_tl
-        \__nju_box_center:Nn \l__nju_tmpb_dim { \__nju_info:n { ##1 } }
+        \__nju_box_spread_name:NNn #1 #2 {##1}
+        \l__nju_name_colon_tl
+        \__nju_box_center:Nn \l__nju_tmpb_dim { \__nju_info:n {##1} }
         \tex_par:D
       }
   }
 \__nju_declare_element:nn { p / decl / orig / title }
   {
-    content     = \c__nju_name_origdecl_tl,
-    format      = \c__nju_fmt_chapter_tl,
-    bottom-skip = \c__nju_chapterafter_dim
+    content     = \l__nju_name_origdecl_tl,
+    format      = \l__nju_fmt_chapter_tl,
+    bottom-skip = \l__nju_chapterafter_dim
   }
 \__nju_declare_element:nn { p / decl / orig / text }
   {
-    content     = \c__nju_text_origdecl_tl,
+    content     = \l__nju_text_origdecl_tl,
     align       = n,
     bottom-skip = 2 cm
   }
@@ -90,13 +89,13 @@
   }
 \__nju_declare_element:nn { p / decl / auth / title }
   {
-    content     = \c__nju_name_authdecl_tl,
-    format      = \c__nju_fmt_chapter_tl,
-    bottom-skip = \c__nju_chapterafter_dim
+    content     = \l__nju_name_authdecl_tl,
+    format      = \l__nju_fmt_chapter_tl,
+    bottom-skip = \l__nju_chapterafter_dim
   }
 \__nju_declare_element:nn { p / decl / auth / text }
   {
-    content     = \c__nju_text_authdecl_tl,
+    content     = \l__nju_text_authdecl_tl,
     align       = n,
     bottom-skip = 2 cm
   }
@@ -109,8 +108,8 @@
   }
 \cs_new_protected:Npn \__nju_p_decl_sign:nn #1#2
   {
-    \__nju_name:n {#1} \c__nju_name_colon_tl \tex_hfill:D
-    \__nju_name:n {#2} \c__nju_name_colon_tl
+    \__nju_name:n {#1} \l__nju_name_colon_tl \tex_hfill:D
+    \__nju_name:n {#2} \l__nju_name_colon_tl
     \skip_horizontal:n { 160 pt } \__nju_null: \__nju_vskip:
   }
 \__nju_declare_page:nn { cover-p }
@@ -130,7 +129,7 @@
     prefix      = p / decl /,
     bm-text     = 声明页,
     bm-name     = decl,
-    top-skip    = \c__nju_chapterbefore_dim,
+    top-skip    = \l__nju_chapterbefore_dim,
     bottom-skip = 0 pt
   }
 \cs_new_protected:Npn \__nju_make_cover:
@@ -160,13 +159,13 @@
   }
 \__nju_declare_element:nn { abstract / mark }
   {
-    content     = \c__nju_name_abstractb_tl,
+    content     = \l__nju_name_abstractb_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 15 pt
   }
 \__nju_declare_element:nn { abstract / en / mark }
   {
-    content     = \c__nju_name_abstractb_en_tl,
+    content     = \l__nju_name_abstractb_en_tl,
     format      = \sffamily \zihao { -3 },
     bottom-skip = 15 pt
   }
@@ -227,7 +226,7 @@
     { table         } { 表              } { table                 },
   }
   { \__nju_define_name:nnn #1 }
-\tl_const:Nn \c__nju_text_origdecl_tl
+\tl_set:Nn \l__nju_text_origdecl_tl
   {
     本人郑重声明:所呈交的研究报告,是本人独立进行研究工作所取得的成果。除
     文中已经注明引用的内容外,本报告不含任何其他个人或集体已经发表或撰写过
@@ -234,7 +233,7 @@
     的作品成果。对本报告的研究做出重要贡献的个人和集体,均已在报告中以明确
     方式标明。本人完全意识到本声明的法律结果由本人承担。
   }
-\tl_const:Nn \c__nju_text_authdecl_tl
+\tl_set:Nn \l__nju_text_authdecl_tl
   {
     本研究报告作者完全了解南京大学有关保留和使用该报告的规定,即:博士后在
     职期间的知识产权单位属南京大学。学校有权保留并向国家有关部门或机构送交
@@ -267,12 +266,12 @@
     { emblem color  } { black                             },
     { name   color  } { black                             },
     { section       } { \bigger \normalfont \sffamily     },
-    { chapter       } { \c__nju_fmt_section_tl \centering },
-    { subsection    } { \c__nju_fmt_section_tl            },
-    { subsubsection } { \c__nju_fmt_section_tl            },
-    { paragraph     } { \c__nju_fmt_section_tl            },
-    { subparagraph  } { \c__nju_fmt_section_tl            },
-    { chapterintoc  } { \c__nju_fmt_section_tl            },
+    { chapter       } { \l__nju_fmt_section_tl \centering },
+    { subsection    } { \l__nju_fmt_section_tl            },
+    { subsubsection } { \l__nju_fmt_section_tl            },
+    { paragraph     } { \l__nju_fmt_section_tl            },
+    { subparagraph  } { \l__nju_fmt_section_tl            },
+    { chapterintoc  } { \l__nju_fmt_section_tl            },
     { tabular       } { \zihao { 5 }                      },
     { toc title     } { \centering \zihao { 3 } \bfseries },
     { header        } { \small \kaishu                    },

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-undergraduate.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-undergraduate.def	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis-undergraduate.def	2024-03-19 20:38:58 UTC (rev 70705)
@@ -6,7 +6,7 @@
 %%
 %% njuthesis.dtx  (with options: `def-u')
 %% 
-%% Copyright (C) 2021 - 2023
+%% Copyright (C) 2021 - 2024
 %% by Nanjing University Linux User Group
 %% <git+nju-lug-email-3104-issue- at yaoge123.cn>
 %% 
@@ -23,7 +23,7 @@
 %% To produce the documentation run the original source files ending with
 %% `.dtx' through XeTeX.
 %% 
-\GetIdInfo $Id: njuthesis.dtx 1.3.2 2023-12-05 16:30:00
+\GetIdInfo $Id: njuthesis.dtx 1.4.0 2024-03-19 20:30:00
   +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Undergraduate definition file for njuthesis}
 \ProvidesExplFile{njuthesis-undergraduate.def}
@@ -31,12 +31,12 @@
 
 \__nju_declare_element:nn { u / cover / emblem-img }
   {
-    content     = \__nju_emblem:N \c__nju_emblemwd_dim,
+    content     = \__nju_emblem:N \l__nju_emblemwd_dim,
     bottom-skip = 1.2 cm
   }
 \__nju_declare_element:nn { u / cover / name-img }
   {
-    content     = \__nju_name:N \c__nju_namewd_dim,
+    content     = \__nju_name:N \l__nju_namewd_dim,
     bottom-skip = 1 cm,
   }
 \__nju_declare_element:nn { u / cover / title }
@@ -65,23 +65,23 @@
   }
 \cs_new:Npn \__nju_u_cover_info:
   {
-    \__nju_u_cover_info:NNNN \c__nju_clabelwd_dim \c__nju_crulewd_dim
-      \c__nju_hsep_dim \kaishu
+    \__nju_u_cover_info:NNNN \l__nju_clabelwd_dim \l__nju_crulewd_dim
+      \l__nju_hsep_dim \kaishu
   }
 \__nju_declare_element:nn { u / decl / orig / emblem }
   {
-    content     = \__nju_emblem:N \c__nju_emblemwdi_dim,
+    content     = \__nju_emblem:N \l__nju_emblemwdi_dim,
     bottom-skip = 30 pt
   }
 \__nju_declare_element:nn { u / decl / orig / title }
   {
-    content     = \c__nju_name_origdecl_tl,
+    content     = \l__nju_name_origdecl_tl,
     format      = \sffamily \__nju_fontsize:nn { 24 bp } { 22.15 bp } \bfseries,
     bottom-skip = 50 pt
   }
 \__nju_declare_element:nn { u / decl / orig / text }
   {
-    content     = \c__nju_text_origdecl_tl,
+    content     = \l__nju_text_origdecl_tl,
     format      = \__nju_zihao:nn { 1.9 } { -3 },
     align       = n,
     bottom-skip = 2.7 cm
@@ -95,7 +95,7 @@
 \cs_new_protected:Npn \__nju_decl_sign:
   {
     \clist_map_inline:nn { origsign, id, date }
-      { \tex_par:D \__nju_name:n { ##1 } : \hbox_to_wd:nn { 6 em } { } }
+      { \tex_par:D \__nju_name:n {##1} : \hbox_to_wd:nn { 6 em } { } }
   }
 \__nju_declare_page:nn { cover-u }
   {
@@ -125,13 +125,13 @@
   }
 \__nju_declare_element:nn { abstract / title }
   {
-    content     = \__nju_abs_title:N \c__nju_name_abstracttitle_tl,
+    content     = \__nju_abs_title:N \l__nju_name_abstracttitle_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 20 pt
   }
 \__nju_declare_element:nn { abstract / en / title }
   {
-    content     = \__nju_abs_title:N \c__nju_name_abstracttitle_en_tl,
+    content     = \__nju_abs_title:N \l__nju_name_abstracttitle_en_tl,
     format      = \bfseries \kaishu \zihao { -2 },
     bottom-skip = 20 pt
   }
@@ -150,12 +150,12 @@
     align       = l
   }
 \cs_new_protected:Npn \__nju_abs_info_u:
-  { \__nju_abs_info_u:nn {     } { \c__nju_name_colon_tl    } }
+  { \__nju_abs_info_u:nn {     } { \l__nju_name_colon_tl    } }
 \cs_new_protected:Npn \__nju_abs_info_en_u:
-  { \__nju_abs_info_u:nn { _en } { \c__nju_name_colon_en_tl } }
+  { \__nju_abs_info_u:nn { _en } { \l__nju_name_colon_en_tl } }
 \cs_new_protected:Npn \__nju_abs_info_u:nn #1#2
   {
-    \tl_set_eq:NN \c__nju_name_author_tl \c__nju_name_authora_tl
+    \tl_set_eq:NN \l__nju_name_author_tl \l__nju_name_authora_tl
     \clist_map_inline:nn { title, dept, major, author, supvfull }
       {
         \__nju_name:nn { abslabel #1 } { ##1 #1 } #2
@@ -203,8 +203,8 @@
     { abstract    a } { 中文摘要        } { ABSTRACT              },
     { abstract    b } { 摘\qquad{}要    } { ABSTRACT              },
     { abstracttitle }
-      { \c__nju_name_nju_tl 本科生毕业论文(设计、作品)中文摘要  }
-      { \c__nju_name_nju_tl 本科生毕业论文(设计、作品)英文摘要  },
+      { \l__nju_name_nju_tl 本科生毕业论文(设计、作品)中文摘要  }
+      { \l__nju_name_nju_tl 本科生毕业论文(设计、作品)英文摘要  },
     { appendix      } { 附录            } { appendix              },
     { author        } { 学生姓名        } { UNDERGRADUATE         },
     { blankdate     } { \qquad{}年 \quad{}月 \quad{}日   } {      },
@@ -224,7 +224,7 @@
     { type          } { 本科毕业论文                        } { u }
   }
   { \__nju_define_name:nnn #1 }
-\tl_const:Nn \c__nju_text_origdecl_tl
+\tl_set:Nn \l__nju_text_origdecl_tl
   {
     本人郑重承诺:所呈交的毕业论文(设计)(题目: \g__nju_info_title_tl )
     是在指导教师的指导下严格按照学校和院系有关规定由本人独立完成的。
@@ -261,12 +261,12 @@
     { emblem color  } { black                             },
     { name   color  } { black                             },
     { section       } { \bigger \normalfont \sffamily     },
-    { chapter       } { \c__nju_fmt_section_tl \centering },
-    { subsection    } { \c__nju_fmt_section_tl            },
-    { subsubsection } { \c__nju_fmt_section_tl            },
-    { paragraph     } { \c__nju_fmt_section_tl            },
-    { subparagraph  } { \c__nju_fmt_section_tl            },
-    { chapterintoc  } { \c__nju_fmt_section_tl            },
+    { chapter       } { \l__nju_fmt_section_tl \centering },
+    { subsection    } { \l__nju_fmt_section_tl            },
+    { subsubsection } { \l__nju_fmt_section_tl            },
+    { paragraph     } { \l__nju_fmt_section_tl            },
+    { subparagraph  } { \l__nju_fmt_section_tl            },
+    { chapterintoc  } { \l__nju_fmt_section_tl            },
     { tabular       } { \zihao { 5 }                      },
     { toc title     } { \centering \zihao { 3 } \bfseries },
     { header        } { \small \kaishu                    },

Modified: trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis.cls	2024-03-19 20:38:45 UTC (rev 70704)
+++ trunk/Master/texmf-dist/tex/latex/njuthesis/njuthesis.cls	2024-03-19 20:38:58 UTC (rev 70705)
@@ -6,7 +6,7 @@
 %%
 %% njuthesis.dtx  (with options: `class')
 %% 
-%% Copyright (C) 2021 - 2023
+%% Copyright (C) 2021 - 2024
 %% by Nanjing University Linux User Group
 %% <git+nju-lug-email-3104-issue- at yaoge123.cn>
 %% 
@@ -24,7 +24,7 @@
 %% `.dtx' through XeTeX.
 %% 
 \NeedsTeXFormat{LaTeX2e}
-\GetIdInfo $Id: njuthesis.dtx 1.3.2 2023-12-05 16:30:00
+\GetIdInfo $Id: njuthesis.dtx 1.4.0 2024-03-19 20:30:00
   +0800 NJU LUG <git+nju-lug-email-3104-issue- at yaoge123.cn>$
   {Thesis template for Nanjing University}
 \ProvidesExplClass{njuthesis}
@@ -46,6 +46,7 @@
 \@ifpackagelater { expl3 } { 2023/10/10 } { }
   {
     \cs_generate_variant:Nn \tl_set:Nn        { Ne }
+    \cs_generate_variant:Nn \tl_gset:Nn       { Ne }
     \cs_generate_variant:Nn \tl_const:Nn      { Ne }
     \cs_generate_variant:Nn \tl_gput_right:Nn { Ne }
   }
@@ -74,11 +75,14 @@
 \tl_new:N    \l__nju_tmpb_tl
 \int_new:N \g__nju_info_type_int
 \bool_new:N \g__nju_opt_academic_bool
-\bool_new:N      \g__nju_opt_twoside_bool
-\bool_set_true:N \g__nju_opt_twoside_bool
+\bool_new:N        \g__nju_opt_draft_bool
+\bool_gset_false:N \g__nju_opt_draft_bool
 \bool_new:N \g__nju_opt_supvii_bool
 \tl_new:N \g__nju_info_supvfull_tl
 \tl_new:N \g__nju_info_supvfull_en_tl
+\tl_new:N \g__nju_info_major_tl
+\tl_new:N \g__nju_info_majorc_tl
+\tl_new:N \g__nju_font_set_tl
 \tl_new:N \g__nju_font_latin_tl
 \tl_new:N \g__nju_font_cjk_tl
 \tl_new:N \g__nju_font_math_tl
@@ -108,10 +112,10 @@
 \clist_const:Nn \c__nju_name_anon_en_clist
   { author, supervisor, supervisor-ii }
 \cs_new:Nn \__nju_null: { \hbox:n { } }
-\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   \c__nju_vsep_dim }
-\cs_new:Nn \__nju_hskip: { \skip_horizontal:N \c__nju_hsep_dim }
+\cs_new:Nn \__nju_space: { \skip_horizontal:n { .5 em } }
+\cs_new:Nn \__nju_quad:  { \skip_horizontal:n {  1 em } }
+\cs_new:Nn \__nju_vskip: { \skip_vertical:N   \l__nju_vsep_dim }
+\cs_new:Nn \__nju_hskip: { \skip_horizontal:N \l__nju_hsep_dim }
 \cs_set_protected:Npn \__nju_vskip:N #1
   {
     \tex_hrule:D \@height \c_zero_dim \scan_stop:
@@ -119,22 +123,30 @@
     \skip_vertical:N #1
     \skip_vertical:N \c_zero_dim
   }
-\cs_new_protected:Npn \__nju_define_name:nn #1#2
-  { \tl_const:cn { c__nju_name_ #1    _tl } {#2} }
-\cs_new_protected:Npn \__nju_define_name:nnn #1#2#3
+\cs_new:Npn \__nju_define_name:nn #1
   {
-    \tl_const:cn { c__nju_name_ #1    _tl } {#2}
-    \tl_const:cn { c__nju_name_ #1 _en_tl } {#3}
+    \tl_new:c  { l__nju_name_ #1    _tl }
+    \tl_set:cn { l__nju_name_ #1    _tl }
   }
-\cs_new_protected:Npn \__nju_define_fmt:nn #1#2
-  { \tl_const:cn { c__nju_fmt_ #1 _tl } {#2} }
-\cs_new_protected:Npn \__nju_define_dim:nn #1#2
-  { \dim_const:cn  { c__nju_ #1 _dim  } {#2} }
-\cs_new_protected:Npn \__nju_define_skip:nn #1#2
-  { \skip_const:cn { c__nju_ #1 _skip } {#2} }
-\cs_new:Npn \__nju_name:n #1 { \tl_use:c { c__nju_name_ #1 _tl } }
+\cs_new:Npn \__nju_define_name:nnn #1#2#3
+  {
+    \__nju_define_name:nn { #1     } {#2}
+    \__nju_define_name:nn { #1 _en } {#3}
+  }
+\cs_new:Npn \__nju_define_fmt:nn #1 { \tl_set:cn { l__nju_fmt_ #1 _tl } }
+\cs_new:Npn \__nju_define_dim:nn  #1
+  {
+    \dim_new:c   { l__nju_ #1 _dim  }
+    \dim_set:cn  { l__nju_ #1 _dim  }
+  }
+\cs_new:Npn \__nju_define_skip:nn #1
+  {
+    \skip_new:c  { l__nju_ #1 _skip }
+    \skip_set:cn { l__nju_ #1 _skip }
+  }
 \cs_new:Npn \__nju_info:n #1 { \tl_use:c { g__nju_info_ #1 _tl } }
-\cs_new:Npn \__nju_fmt:n  #1 { \tl_use:c { c__nju_fmt_  #1 _tl } }
+\cs_new:Npn \__nju_name:n #1 { \tl_use:c { l__nju_name_ #1 _tl } }
+\cs_new:Npn \__nju_fmt:n  #1 { \tl_use:c { l__nju_fmt_  #1 _tl } }
 \cs_new:Npn \__nju_name:nn #1#2
   { \group_begin: \__nju_fmt:n {#1} \__nju_name:n {#2} \group_end: }
 \cs_new:Npn \__nju_fontsize:nn #1#2
@@ -158,7 +170,7 @@
 \cs_new_protected:Npn \__nju_box_ulined:NN #1#2
   {
     \mode_leave_vertical:
-    \rule [ \c__nju_ruledpi_dim ] {#1} { \c__nju_rulehti_dim }
+    \rule [ \l__nju_ruledpi_dim ] {#1} { \l__nju_rulehti_dim }
     \skip_horizontal:n { -#1 }
     \hbox_to_wd:nn {#1} { \tex_hfil:D #2 \tex_hfil:D }
   }
@@ -184,9 +196,9 @@
 \cs_generate_variant:Nn \__nju_box_spread:NNn { NNv }
 \cs_generate_variant:Nn \__nju_box_spread:NNn { NNe }
 \cs_new_protected:Npn \__nju_box_spread_name:Nn #1#2
-  { \__nju_box_spread:NNv #1 \c_empty_tl { c__nju_name_ #2 _tl } }
+  { \__nju_box_spread:NNv #1 \c_empty_tl { l__nju_name_ #2 _tl } }
 \cs_new_protected:Npn \__nju_box_spread_name:NNn #1#2#3
-  { \__nju_box_spread:NNv #1 #2 { c__nju_name_ #3 _tl } }
+  { \__nju_box_spread:NNv #1 #2 { l__nju_name_ #3 _tl } }
 \cs_new_protected:Npn \__nju_box_center:Nn #1#2
   {
     \mode_leave_vertical:
@@ -197,7 +209,7 @@
     \int_set:Nn #1 { \int_max:nn { \clist_count:N #3 } {#5} }
     \int_step_inline:nn {#1}
       {
-        \clist_pop:NNF #3 #2 { \tl_set_eq:NN #2 \c_empty_tl }
+        \clist_gpop:NNF #3 #2 { \tl_set_eq:NN #2 \c_empty_tl }
         \__nju_box_ulined:NN #4 #2 \tex_par:D
       }
   }
@@ -206,15 +218,15 @@
 \cs_new_protected:Npn \__nju_uline:n #1
   {
     \mode_leave_vertical:
-    \rule [ \c__nju_ruledpi_dim ] {#1} { \c__nju_rulehti_dim }
+    \rule [ \l__nju_ruledpi_dim ] {#1} { \l__nju_rulehti_dim }
     \skip_horizontal:n { -#1 }
   }
 \cs_new_protected:Npn \__nju_uuline:N #1
   {
     \mode_leave_vertical:
-    \rule [ \c__nju_ruledpii_dim  ] {#1} { \c__nju_rulehtii_dim }
+    \rule [ \l__nju_ruledpii_dim  ] {#1} { \l__nju_rulehtii_dim }
     \skip_horizontal:n { -#1 }
-    \rule [ \c__nju_ruledpiii_dim ] {#1} { \c__nju_rulehtii_dim }
+    \rule [ \l__nju_ruledpiii_dim ] {#1} { \l__nju_rulehtii_dim }
     \skip_horizontal:n { -#1 }
   }
 \cs_new:Npn \__nju_get_width:Nn #1#2
@@ -241,12 +253,12 @@
 \cs_generate_variant:Nn \__nju_get_width_print:Nn { Ne }
 \cs_new_protected:Npn \__nju_uline_entry:Nn #1#2
   {
-    \__nju_get_width_print:Nv #1 { c__nju_name_ #2 _tl }
+    \__nju_get_width_print:Nv #1 { l__nju_name_ #2 _tl }
     \__nju_box_ulined_info:Nn #1 {#2}
   }
 \cs_new_protected:Npn \__nju_uline_bientry:Nn #1#2
   {
-    \__nju_get_width_print:Nv #1 { c__nju_name_ #2 _tl }
+    \__nju_get_width_print:Nv #1 { l__nju_name_ #2 _tl }
     \dim_sub:Nn #1 { \textwidth / 2 }
     \__nju_box_ulined_info:Nn #1 {#2}
   }
@@ -257,7 +269,7 @@
 \cs_new:Npn \__nju_date:nn { \__nju_date:nnn { } }
 \cs_new:Npn \__nju_date:nnn #1#2#3
   {
-    \tl_set:cx { g__nju_info_ #2 date #1 _tl }
+    \tl_gset:cx { g__nju_info_ #2 date #1 _tl }
       {
         \tl_if_empty:nTF {#3}
           { \__nju_name:n { blankdate #1 } }
@@ -273,7 +285,7 @@
 \cs_new:Npn \__nju_breakpar_loop:n #1
   {
     \dim_set:Nn \l__nju_tmpa_dim
-      { - \tex_prevdepth:D - \c__nju_ruledpi_dim - \c__nju_rulehti_dim }
+      { - \tex_prevdepth:D - \l__nju_ruledpi_dim - \l__nju_rulehti_dim }
     \hbox_gset:Nn \l__nju_tmpc_box { }
     \__nju_loop_until:nnn { \box_if_empty_p:N \l__nju_tmpb_box }
       {
@@ -323,7 +335,7 @@
     \mode_leave_vertical: #1
     \parbox [ t ] {#3}
       {
-        \c__nju_fmt_covertitle_tl \__nju_uline_title:
+        \l__nju_fmt_covertitle_tl \__nju_uline_title:
         \dim_gset_eq:NN \l__nju_tmpa_dim \tex_prevdepth:D
       }
     \tex_par:D
@@ -355,9 +367,9 @@
     \__nju_box_ulined:NN #2 \l__nju_tmpb_tl        \tex_par:D
   }
 \cs_new_protected:Npn \__nju_emblem:N #1
-  { \njuemblem [ \c__nju_fmt_emblemcolor_tl ] {#1} { ! } }
+  { \njuemblem [ \l__nju_fmt_emblemcolor_tl ] {#1} { ! } }
 \cs_new_protected:Npn \__nju_name:N   #1
-  { \njuname   [ \c__nju_fmt_namecolor_tl   ] {#1} { ! } }
+  { \njuname   [ \l__nju_fmt_namecolor_tl   ] {#1} { ! } }
 \cs_new_protected:Npn \__nju_abs_bookmark:nn #1#2
   {
     \phantomsection
@@ -547,6 +559,10 @@
     The~ font~ is~ normally~ distributed~ with~ MS~ Windows.~
     I~ have~ used~ songti~ for~ substitution.
   }
+\cs_new:Npn \__nju_pass_option:nn #1#2 { \PassOptionsToClass {#2} {#1} }
+\cs_new:Npn \__nju_pass_option:n { \__nju_pass_option:nn { ctexbook } }
+\cs_generate_variant:Nn \__nju_pass_option:n { V }
+\cs_new:Npn \__nju_pass_option: { \__nju_pass_option:V \l_keys_key_str }
 \keys_define:nn { nju }
   {
     type               .choices:nn = { bachelor, master, doctor, postdoc }
@@ -554,45 +570,66 @@
     type               .initial:n  = bachelor,
     degree              .choice:,
     degree / academic     .code:n  =
-      { \bool_set_true:N  \g__nju_opt_academic_bool },
+      { \bool_gset_true:N  \g__nju_opt_academic_bool },
     degree / professional .code:n  =
-      { \bool_set_false:N \g__nju_opt_academic_bool },
+      { \bool_gset_false:N \g__nju_opt_academic_bool },
     degree             .initial:n  = academic,
-    nl-cover          .bool_set:N  = \g__nju_opt_nlcover_bool,
+    nl-cover         .bool_gset:N  = \g__nju_opt_nlcover_bool,
     nl-cover           .initial:n  = false,
-    decl-page         .bool_set:N  = \g__nju_opt_decl_bool,
+    decl-page        .bool_gset:N  = \g__nju_opt_decl_bool,
     decl-page          .initial:n  = false,
-    draft            .bool_gset:N  = \g__nju_opt_draft_bool,
-    draft              .initial:n  = false,
+    draft      .value_forbidden:n  = true,
+    draft                 .code:n  =
+      {
+        \bool_gset_true:N \g__nju_opt_draft_bool
+        \__nju_pass_option:
+      },
     oneside    .value_forbidden:n  = true,
     twoside    .value_forbidden:n  = true,
-    oneside  .bool_gset_inverse:N  = \g__nju_opt_twoside_bool,
-    anonymous         .bool_set:N  = \g__nju_opt_anon_bool,
+    oneside               .code:n  =
+      {
+        \bool_gset_false:N \g__nju_opt_twoside_bool
+        \tl_gset:Nn \g__nju_name_pagemode_tl { oneside }
+        \__nju_pass_option:
+      },
+    twoside               .code:n  =
+      {
+        \bool_gset_true:N  \g__nju_opt_twoside_bool
+        \tl_gset:Nn \g__nju_name_pagemode_tl { twoside }
+        \__nju_pass_option:
+      },
+    anonymous        .bool_gset:N  = \g__nju_opt_anon_bool,
     anonymous          .initial:n  = false,
     latin-font         .choices:nn =
-      { gyre, mac, win, none }
-      { \tl_set_eq:NN \g__nju_font_latin_tl \l_keys_choice_tl },
+      { fandol, gyre, mac, macoffice, win, none }
+      { \tl_gset:Nn \g__nju_font_latin_tl {#1} },
     cjk-font           .choices:nn =
-      { fandol, founder, mac, noto, source, win, none }
-      { \tl_set_eq:NN \g__nju_font_cjk_tl   \l_keys_choice_tl },
+      { fandol, founder, mac, macoffice, noto, source, win, none }
+      { \tl_gset:Nn \g__nju_font_cjk_tl   {#1} },
+    fontset            .choices:nn =
+      { fandol, mac, macoffice, win, none }
+      { \keys_set:nn { nju } { latin-font = #1, cjk-font = #1 } },
     math-font          .choices:nn =
       {
         asana, cambria, fira, garamond, lm, libertinus, newcm,
         stix, bonum, dejavu, pagella, schola, termes, xits, none
       }
-      { \tl_set_eq:NN \g__nju_font_math_tl  \l_keys_choice_tl },
+      { \tl_gset_eq:NN \g__nju_font_math_tl  \l_keys_choice_tl },
     math-font          .initial:n  = xits,
     font-path             .code:n  =
       {
-        \bool_set_true:N \g__nju_font_path_bool
-        \tl_set_eq:NN \g__nju_font_path_tl \l_keys_value_tl
+        \bool_gset_true:N \g__nju_font_path_bool
+        \tl_gset_eq:NN \g__nju_font_path_tl \l_keys_value_tl
       },
-    zihao               .tl_set:N  = \g__nju_opt_zihao_tl,
+    zihao                 .code:n  =
+      { \__nju_pass_option:n { zihao      = #1 } },
     zihao              .initial:n  = -4,
-    linespread          .tl_set:N  = \g__nju_opt_linespread_tl,
+    linespread            .code:n  =
+      { \__nju_pass_option:n { linespread = #1 } },
     linespread         .initial:n  = 1.625,
-    config           .clist_set:N  = \g__nju_config_clist
+    config          .clist_gset:N  = \g__nju_config_clist
   }
+\keys_set:nn { nju } { twoside }
 \clist_new:N \g__nju_name_optional_pkg_clist
 \cs_new_protected:Npn \__nju_define_pkg_keys:nnn #1#2#3
   {
@@ -606,7 +643,7 @@
         \bool_if:cT { g__nju_opt_load_ #2 _bool }
           { \RequirePackage {#1} }
       }
-    \clist_put_right:Nn \g__nju_name_optional_pkg_clist {#1}
+    \clist_gput_right:Nn \g__nju_name_optional_pkg_clist {#1}
   }
 \clist_map_inline:nn
   {
@@ -629,11 +666,8 @@
       }
   }
 \ProcessKeysOptions { nju }
-\bool_if:NTF \g__nju_opt_twoside_bool
-  { \tl_const:Nn \c__nju_name_pagemode_tl { twoside } }
-  { \tl_const:Nn \c__nju_name_pagemode_tl { oneside } }
 \bool_if:NT \g__nju_opt_anon_bool
-  { \bool_set_false:N \g__nju_opt_decl_bool }
+  { \bool_gset_false:N \g__nju_opt_decl_bool }
 \clist_map_inline:nn
   {
     abstract, bib, image, footer, footnote, header,
@@ -659,12 +693,12 @@
   }
 \@onlypreamble \njusetup
 \NewDocumentCommand \njusetformat { m m }
-  { \tl_gset:cn { c__nju_fmt_ #1 _tl } {#2} }
+  { \__nju_define_fmt:nn {#1} {#2} }
 \NewDocumentCommand \njusetlength { s m m }
   {
     \bool_if:nTF {#1}
-      { \skip_gset:cn { c__nju_ #2 _skip } {#3} }
-      { \dim_gset:cn  { c__nju_ #2 _dim  } {#3} }
+      { \skip_gset:cn { l__nju_ #2 _skip } {#3} }
+      { \dim_gset:cn  { l__nju_ #2 _dim  } {#3} }
   }
 \NewDocumentCommand \njusetname { s m O{} m }
   { \__nju_set_tokenlist:nnnnn {#1} {#2} {#3} {#4} { name } }
@@ -673,28 +707,23 @@
 \cs_new_protected:Npn \__nju_set_tokenlist:nnnnn #1#2#3#4#5
   {
     \bool_if:nTF {#1}
-      { \tl_set_eq:NN \l__nju_tmpb_tl \c__nju_name_suffix_en_tl }
+      { \tl_set_eq:NN \l__nju_tmpb_tl \l__nju_name_suffix_en_tl }
       { \tl_clear:N   \l__nju_tmpb_tl }
-    \tl_gset:cn { c__nju_ #5 _ #2 #3 \l__nju_tmpb_tl _tl } {#4}
+    \tl_gset:cn { l__nju_ #5 _ #2 #3 \l__nju_tmpb_tl _tl } {#4}
   }
-\exp_args:Ne \PassOptionsToClass
+\__nju_pass_option:n
   {
     a4paper,
     UTF8,
     scheme = chinese,
-    \c__nju_name_pagemode_tl,
-    \bool_if:NT \g__nju_opt_draft_bool { draft, }
-    linespread = \g__nju_opt_linespread_tl,
-    fontset    = none,
-    zihao      = \g__nju_opt_zihao_tl
+    fontset    = none
   }
-  { ctexbook }
 \clist_map_inline:nn
   {
-    { quiet   } { xeCJK    },
     { no-math } { fontspec },
     { perpage } { footmisc },
-    { capitalise, nameinlink, noabbrev } { cleveref }
+    { capitalise, nameinlink, noabbrev } { cleveref },
+    { amsmath, thmmarks, noconfig      } { ntheorem }
   }
   { \PassOptionsToPackage #1 }
 \LoadClass { ctexbook } [ 2018/04/01 ]
@@ -719,14 +748,10 @@
     booktabs,
     caption,
     graphicx,
-    hyperref
   }
+\__nju_loadpkg_nthm:
+\RequirePackage { hyperref }
 \__nju_loadpkg_cref:
-\bool_if:NT \g__nju_opt_load_nthm_bool
-  {
-    \PassOptionsToPackage { amsmath, thmmarks, noconfig } { ntheorem }
-    \RequirePackage { ntheorem }
-  }
 \bool_if:NT \g__nju_opt_twoside_bool { \RequirePackage { emptypage } }
 \sys_if_engine_xetex:T
   {
@@ -778,46 +803,51 @@
   }
 \keys_define:nn { nju / info }
   {
-    title               .tl_set:N = \g__nju_info_title_tl             ,
+    title              .tl_gset:N = \g__nju_info_title_tl             ,
     title              .initial:n = { 空 }                            ,
-    title*              .tl_set:N = \g__nju_info_title_en_tl          ,
+    title*             .tl_gset:N = \g__nju_info_title_en_tl          ,
     title*             .initial:n = { Empty }                         ,
-    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_en_tl          ,
-    field               .tl_set:N = \g__nju_info_field_tl             ,
-    field*              .tl_set:N = \g__nju_info_field_en_tl          ,
+    keywords        .clist_gset:N = \g__nju_info_keywords_clist       ,
+    keywords*       .clist_gset:N = \g__nju_info_keywords_en_clist    ,
+    grade              .tl_gset:N = \g__nju_info_grade_tl             ,
+    student-id         .tl_gset:N = \g__nju_info_id_tl                ,
+    author             .tl_gset:N = \g__nju_info_author_tl            ,
+    author*            .tl_gset:N = \g__nju_info_author_en_tl         ,
+    department         .tl_gset:N = \g__nju_info_dept_tl              ,
+    department*        .tl_gset:N = \g__nju_info_dept_en_tl           ,
+    major*             .tl_gset:N = \g__nju_info_major_en_tl          ,
+    field              .tl_gset:N = \g__nju_info_field_tl             ,
+    field*             .tl_gset:N = \g__nju_info_field_en_tl          ,
     major                 .code:n =
       {
         \bool_if:NTF \g__nju_opt_academic_bool
-          { \clist_pop:NN  \l_keys_value_tl \g__nju_info_major_tl }
           {
-            \clist_pop:NN  \l_keys_value_tl \g__nju_info_majorc_tl
-            \clist_pop:NNF \l_keys_value_tl \g__nju_info_major_tl
-              { \tl_set_eq:NN \g__nju_info_major_tl \g__nju_info_majorc_tl }
+            \clist_pop:NN  \l_keys_value_tl \l__nju_tmpa_tl
+            \tl_gset_eq:NN \g__nju_info_major_tl \l__nju_tmpa_tl
           }
+          {
+            \clist_pop:NN  \l_keys_value_tl \l__nju_tmpa_tl
+            \tl_gset_eq:NN \g__nju_info_majorc_tl \l__nju_tmpa_tl
+            \clist_pop:NNTF \l_keys_value_tl \l__nju_tmpa_tl
+              { \tl_gset_eq:NN \g__nju_info_major_tl \l__nju_tmpa_tl }
+              { \tl_gset_eq:NN \g__nju_info_major_tl \g__nju_info_majorc_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_supvii_clist         ,
-    supervisor-ii*      .tl_set:N = \g__nju_info_supvii_en_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               ,
-    udc                 .tl_set:N = \g__nju_info_udc_tl               ,
-    secret-level        .tl_set:N = \g__nju_info_secretlv_tl          ,
-    supervisor-contact  .tl_set:N = \g__nju_info_supvcont_tl          ,
-    email               .tl_set:N = \g__nju_info_email_tl             ,
-    school-code         .tl_set:N = \g__nju_info_code_tl              ,
+    supervisor      .clist_gset:N = \g__nju_info_supv_clist           ,
+    supervisor*        .tl_gset:N = \g__nju_info_supv_en_tl           ,
+    supervisor-ii   .clist_gset:N = \g__nju_info_supvii_clist         ,
+    supervisor-ii*     .tl_gset:N = \g__nju_info_supvii_en_tl         ,
+    chairman           .tl_gset:N = \g__nju_info_chairman_tl          ,
+    reviewer        .clist_gset:N = \g__nju_info_reviewer_clist       ,
+    clc                .tl_gset:N = \g__nju_info_clc_tl               ,
+    udc                .tl_gset:N = \g__nju_info_udc_tl               ,
+    secret-level       .tl_gset:N = \g__nju_info_secretlv_tl          ,
+    supervisor-contact .tl_gset:N = \g__nju_info_supvcont_tl          ,
+    email              .tl_gset:N = \g__nju_info_email_tl             ,
+    school-code        .tl_gset:N = \g__nju_info_code_tl              ,
     school-code        .initial:n = { 10284 }                       ,
-    degree              .tl_set:N = \g__nju_info_degree_tl            ,
-    degree*             .tl_set:N = \g__nju_info_degree_en_tl         ,
+    degree             .tl_gset:N = \g__nju_info_degree_tl            ,
+    degree*            .tl_gset:N = \g__nju_info_degree_en_tl         ,
   }
 \clist_map_inline:nn { submit, defend, confer, bottom }
   {
@@ -833,15 +863,15 @@
   { \keys_define:nn { nju / info } { #1 * .groups:n = { anonymous } } }
 \__nju_at_begin_document:n
   {
-    \tl_set:Ne \g__nju_info_supvfull_tl
-      { \clist_use:Nn \g__nju_info_supv_clist { \__nju_hskip: } }
+    \tl_gset:Ne \g__nju_info_supvfull_tl
+      { \clist_use:Nn \g__nju_info_supv_clist { \__nju_quad: } }
     \clist_if_empty:NF \g__nju_info_supvii_clist
       {
         \bool_gset_true:N \g__nju_opt_supvii_bool
         \tl_gput_right:Ne \g__nju_info_supvfull_tl
-          { \__nju_quad: \clist_use:Nn \g__nju_info_supvii_clist { \__nju_hskip: } }
+          { \__nju_quad: \clist_use:Nn \g__nju_info_supvii_clist { \__nju_quad: } }
       }
-    \tl_set_eq:NN \g__nju_info_supvfull_en_tl \g__nju_info_supv_en_tl
+    \tl_gset_eq:NN \g__nju_info_supvfull_en_tl \g__nju_info_supv_en_tl
     \tl_if_empty:NF \g__nju_info_supvii_en_tl
       {
         \tl_gput_right:Ne \g__nju_info_supvfull_en_tl
@@ -850,15 +880,27 @@
   }
 \bool_if:NT \g__nju_opt_anon_bool
   {
-    \tl_gclear:N \c__nju_name_nju_tl
-    \tl_gclear:N \c__nju_name_nju_en_tl
+    \tl_clear:N \l__nju_name_nju_tl
+    \tl_clear:N \l__nju_name_nju_en_tl
   }
-\ctex_detect_platform:
+\tl_const:Nn \c__nju_path_macoffice_tl
+  { /Applications/Microsoft~ Word.app/Contents/Resources/DFonts/ }
+\sys_if_platform_windows:TF
+  { \tl_gset:Nn \g__nju_font_set_tl { win } }
+  {
+    \ctex_if_platform_macos:TF
+      {
+        \file_if_exist:nTF { \c__nju_path_macoffice_tl times.ttf }
+          { \tl_gset:Nn \g__nju_font_set_tl { macoffice } }
+          { \tl_gset:Nn \g__nju_font_set_tl { mac       } }
+      }
+      { \tl_gset:Nn \g__nju_font_set_tl { fandol } }
+  }
 \tl_if_empty:NT \g__nju_font_latin_tl
-  { \tl_gset_eq:NN \g__nju_font_latin_tl \g__ctex_fontset_tl }
+  { \tl_gset_eq:NN \g__nju_font_latin_tl \g__nju_font_set_tl }
 \tl_if_empty:NT \g__nju_font_cjk_tl
-  { \tl_gset_eq:NN \g__nju_font_cjk_tl   \g__ctex_fontset_tl }
-\cs_new_protected:Npn \__nju_loadfont_latin:n #1
+  { \tl_gset_eq:NN \g__nju_font_cjk_tl   \g__nju_font_set_tl }
+\cs_new:Npn \__nju_loadfont_latin:n #1
   {
     \__fontspec_main_setmainfont:nn { } { Times~New~Roman }
     \__fontspec_main_setsansfont:nn { } { Arial           }
@@ -876,6 +918,24 @@
           { \c__nju_name_gyrefeature_clist } { texgyretermes }
       }
   }
+\cs_new_protected:Npn \__nju_loadfont_latin_macoffice:
+  {
+    \__fontspec_main_setmainfont:nn
+      { \l__nju_name_macofficefeature_clist } { times }
+    \__fontspec_main_setsansfont:nn
+      { \l__nju_name_macofficefeature_clist } { arial }
+    \__fontspec_main_setmonofont:nn
+      { Scale     = MatchLowercase } { Menlo }
+  }
+\clist_const:Nn \c__nju_name_macofficefeature_clist
+  {
+    Path           = \c__nju_path_macoffice_tl,
+    Extension      = .ttf,
+    UprightFont    = *,
+    BoldFont       = *bd,
+    ItalicFont     = *i,
+    BoldItalicFont = *bi
+  }
 \cs_new_protected:Npn \__nju_loadfont_latin_gyre:
   {
     \__fontspec_main_setmainfont:nn
@@ -890,6 +950,7 @@
       }
       { texgyrecursor }
   }
+\cs_new_eq:NN \__nju_loadfont_latin_fandol:  \__nju_loadfont_latin_gyre:
 \clist_const:Nn \c__nju_name_gyrefeature_clist
   {
     Extension      = .otf,
@@ -909,6 +970,7 @@
     \setCJKfamilyfont { zhhei  } { SimHei   } [#1]
     \setCJKfamilyfont { zhfs   } { FangSong } [#1]
     \setCJKfamilyfont { zhkai  } { KaiTi    } [#1]
+    \__nju_stzhongs:n {#1}
   }
 \cs_new:Npn \__nju_loadfont_cjk_win:
   { \__nju_loadfont_cjk_win:N \c__nju_name_fakebold_tl }
@@ -928,6 +990,22 @@
     \setCJKfamilyfont { zhfs   } { STFangsong      }
     \setCJKfamilyfont { zhkai  } { Kaiti~SC        } [ BoldFont = Kaiti~SC~Bold ]
   }
+\cs_new:Npn \__nju_loadfont_cjk_macoffice:n #1
+  {
+    \setCJKmainfont { Simsun.ttc   } [ ItalicFont = Kaiti.ttf, #1 ]
+    \setCJKsansfont { SimHei.ttf   } [#1]
+    \setCJKmonofont { Fangsong.ttf } [#1]
+    \setCJKfamilyfont { zhsong } { Simsun.ttc   } [#1]
+    \setCJKfamilyfont { zhhei  } { SimHei.ttf   } [#1]
+    \setCJKfamilyfont { zhfs   } { Fangsong.ttf } [#1]
+    \setCJKfamilyfont { zhkai  } { Kaiti.ttf    } [#1]
+    \__nju_stzhongs:nn { STZHONGS.ttf } {#1}
+  }
+\cs_new:Npn \__nju_loadfont_cjk_macoffice:
+  {
+    \__nju_loadfont_cjk_macoffice:n
+      { Path = \c__nju_path_macoffice_tl, \c__nju_name_fakebold_tl }
+  }
 \cs_new_protected:Npn \__nju_loadfont_cjk_fandol:
   {
     \__nju_hide_no_script_msg:
@@ -1015,23 +1093,26 @@
     ItalicFeatures     = FakeSlant,
     BoldItalicFeatures = FakeSlant
   }
-\cs_new:Npn \__nju_loadfont_stzhongs:
+\cs_new:Npn \__nju_stzhongs:nn #1#2
+  { \newCJKfontfamily \__nju_stzhongs: {#1} [#2] }
+\cs_new:Npn \__nju_stzhongs:n { \__nju_stzhongs:nn { 华文中宋 } }
+\cs_new_protected:Npn \__nju_loadfont_stzhongs:
   {
-    \fontspec_font_if_exist:nTF { 华文中宋 }
+    \cs_if_exist_use:NF \__nju_stzhongs:
       {
-        \newCJKfontfamily \__nju_stzhongs: { 华文中宋 }
-          [ \c__nju_name_fakebold_tl ]
-      }
-      {
-        \bool_if:NTF \g__nju_font_path_bool
+        \fontspec_font_if_exist:nTF { 华文中宋 }
+          { \__nju_stzhongs:n { \c__nju_name_fakebold_tl } }
           {
-            \newCJKfontfamily \__nju_stzhongs: { \c__nju_name_stzhongsfile_tl }
-              [ Path = \g__nju_font_path_tl, \c__nju_name_fakebold_tl ]
+            \bool_if:NTF \g__nju_font_path_bool
+              {
+                \__nju_stzhongs:nn { \l__nju_name_stzhongsfile_tl }
+                  { Path = \g__nju_font_path_tl, \c__nju_name_fakebold_tl }
+              }
+              {
+                \cs_set_eq:NN \__nju_stzhongs: \rmfamily
+                \msg_warning:nn { njuthesis } { missing-stzhongs }
+              }
           }
-          {
-            \cs_set_eq:NN \__nju_stzhongs: \rmfamily
-            \msg_warning:nn { njuthesis } { missing-stzhongs }
-          }
       }
   }
 \cs_new:Npn \__nju_define_math_font:nn #1#2
@@ -1131,9 +1212,6 @@
       { NewCMMono10 }
   }
 \__nju_cs_clear:N \__nju_loadfont_math_none:
-\cs_new_eq:NN \__nju_loadfont_latin_windows: \__nju_loadfont_latin_win:
-\cs_new_eq:NN \__nju_loadfont_latin_fandol:  \__nju_loadfont_latin_gyre:
-\cs_new_eq:NN \__nju_loadfont_cjk_windows:   \__nju_loadfont_cjk_win:
 \cs_new_protected:Npn \__nju_loadfont:
   {
     \use:c { __nju_loadfont_latin_ \g__nju_font_latin_tl : }
@@ -1172,15 +1250,15 @@
 \clist_new:N \g__nju_footer_clist
 \ctex_at_end_preamble:n
   {
-    \clist_set_eq:Nc \g__nju_header_clist
-      { g__nju_header_ \c__nju_name_pagemode_tl _clist }
-    \clist_set_eq:Nc \g__nju_footer_clist
-      { g__nju_footer_ \c__nju_name_pagemode_tl _clist }
+    \clist_gset_eq:Nc \g__nju_header_clist
+      { g__nju_header_ \g__nju_name_pagemode_tl _clist }
+    \clist_gset_eq:Nc \g__nju_footer_clist
+      { g__nju_footer_ \g__nju_name_pagemode_tl _clist }
   }
 \cs_new_protected:Npn \__nju_header:nn #1#2
-  { \fancyhead [#1] { \c__nju_fmt_header_tl \nouppercase {#2} } }
+  { \fancyhead [#1] { \l__nju_fmt_header_tl \nouppercase {#2} } }
 \cs_new_protected:Npn \__nju_footer:nn #1#2
-  { \fancyfoot [#1] { \c__nju_fmt_footer_tl \nouppercase {#2} } }
+  { \fancyfoot [#1] { \l__nju_fmt_footer_tl \nouppercase {#2} } }
 \fancypagestyle { plain }
   {
     \fancyhf { }
@@ -1207,30 +1285,29 @@
 \RenewDocumentCommand \frontmatter { }
   {
     \cleardoublepage
-    \exp_args:NV \pagestyle \c__nju_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l__nju_fmt_pagestyle_tl
     \pagenumbering { Roman }
   }
 \RenewDocumentCommand \mainmatter { }
   {
     \cleardoublepage
-    \exp_args:NV \pagestyle \c__nju_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l__nju_fmt_pagestyle_tl
     \pagenumbering { arabic }
     \normalfont \normalsize
   }
 \AtBeginEnvironment { document }
   {
-    \exp_args:NV \pagestyle \c__nju_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l__nju_fmt_pagestyle_tl
     \pagenumbering { Roman }
   }
 \cs_new:Npn \__nju_bookmark_toc:n #1
-  { \addcontentsline { toc } { chapter } { \c__nju_fmt_chapterintoc_tl #1 } }
+  { \addcontentsline { toc } { chapter } { \l__nju_fmt_chapterintoc_tl #1 } }
 \cs_generate_variant:Nn \__nju_bookmark_toc:n { V }
 \cs_new:Npn \__nju_bookmark_toc:nn #1#2
   { \phantomsection \__nju_bookmark_toc:n {#1} }
-\cs_new:Npn \__nju_bookmark_pdf_nosec:nn #1#2
-  { \pdfbookmark [0] {#1} {#2} }
-\cs_new:Npn \__nju_bookmark_pdf:nn #1#2
-  { \phantomsection \__nju_bookmark_pdf_nosec:nn {#1} {#2} }
+\cs_new:Npn \__nju_bookmark_pdf_nosec:nn { \pdfbookmark [0] }
+\cs_new:Npn \__nju_bookmark_pdf:nn
+  { \phantomsection \__nju_bookmark_pdf_nosec:nn }
 \cs_new:Npn \__nju_bookmark:Nnn #1#2#3
   {
     \bool_if:NTF #1
@@ -1256,24 +1333,24 @@
 \NewDocumentCommand \njuchapter { m } { \__nju_chapter:n {#1} }
 \keys_set:nn { ctex }
   {
-    chapter        / beforeskip = \c__nju_chapterbefore_dim,
-    chapter        / afterskip  = \c__nju_chapterafter_dim,
-    chapter        / format     = \c__nju_fmt_chapter_tl,
-    section        / format     = \c__nju_fmt_section_tl,
-    subsection     / format     = \c__nju_fmt_subsection_tl,
-    subsubsection  / format     = \c__nju_fmt_subsubsection_tl,
-    paragraph      / format     = \c__nju_fmt_paragraph_tl,
-    subparagraph   / format     = \c__nju_fmt_subparagraph_tl,
-    contentsname   = \c__nju_name_tableofcontents_tl,
-    listfigurename = \c__nju_name_listoffigures_tl,
-    listtablename  = \c__nju_name_listoftables_tl,
-    chapter / tocline = \c__nju_fmt_chapterintoc_tl \CTEXnumberline {#1} #2
+    chapter        / beforeskip = \l__nju_chapterbefore_dim,
+    chapter        / afterskip  = \l__nju_chapterafter_dim,
+    chapter        / format     = \l__nju_fmt_chapter_tl,
+    section        / format     = \l__nju_fmt_section_tl,
+    subsection     / format     = \l__nju_fmt_subsection_tl,
+    subsubsection  / format     = \l__nju_fmt_subsubsection_tl,
+    paragraph      / format     = \l__nju_fmt_paragraph_tl,
+    subparagraph   / format     = \l__nju_fmt_subparagraph_tl,
+    contentsname   = \l__nju_name_tableofcontents_tl,
+    listfigurename = \l__nju_name_listoffigures_tl,
+    listtablename  = \l__nju_name_listoftables_tl,
+    chapter / tocline = \l__nju_fmt_chapterintoc_tl \CTEXnumberline {#1} #2
   }
 \cs_new_protected:Npn \__nju_make_toc:nn #1#2
   {
     \group_begin:
       \keys_set:nn { ctex }
-        { chapter/format = \c__nju_fmt_toctitle_tl }
+        { chapter/format = \l__nju_fmt_toctitle_tl }
       \__nju_chapter:cnn { g__nju_ #2 _showentry_bool } {#1} {#2}
     \group_end:
     \@starttoc {#2}
@@ -1283,7 +1360,7 @@
   {
     \keys_define:nn { nju / #1 }
       {
-        toc-entry  .bool_set:c = { g__nju_ #3 _showentry_bool },
+        toc-entry .bool_gset:c = { g__nju_ #3 _showentry_bool },
         toc-entry   .initial:n = true
       }
     \exp_args:Nc \RenewDocumentCommand {#1} { }
@@ -1300,8 +1377,8 @@
   {
     \bool_if:NF \g__nju_toc_showentry_bool
       {
-        \bool_set_false:N \g__nju_lof_showentry_bool
-        \bool_set_false:N \g__nju_lot_showentry_bool
+        \bool_gset_false:N \g__nju_lof_showentry_bool
+        \bool_gset_false:N \g__nju_lot_showentry_bool
       }
   }
 \keys_define:nn { nju / tableofcontents }
@@ -1336,10 +1413,7 @@
       { \clist_gput_right:Nn \g__nju_blx_option_clist { style = #1 } },
     style            .initial:n = numeric,
     option              .code:n =
-      {
-            \clist_gput_right:NV \g__nju_blx_option_clist
-              \l_keys_value_tl
-      },
+      { \clist_gput_right:NV \g__nju_blx_option_clist \l_keys_value_tl },
     resource            .code:n =
       { \clist_gput_right:NV \g__nju_blx_resource_clist \l_keys_value_tl },
   }
@@ -1356,12 +1430,11 @@
   }
 \cs_new_protected:Npn \__nju_blx_post_setup:
   {
-    \defbibheading { njubibintoc } [ \bibname ] { \__nju_chapter:n { ##1 } }
+    \defbibheading { njubibintoc } [ \bibname ] { \__nju_chapter:n {##1} }
     \tl_if_eq:NnTF \blx at refsecreset@level { 2 }
       { \DeclarePrintbibliographyDefaults { heading = subbibintoc } }
       { \DeclarePrintbibliographyDefaults { heading = njubibintoc } }
-    \clist_map_inline:Nn \g__nju_blx_resource_clist
-      { \addbibresource { ##1 } }
+    \clist_map_inline:Nn \g__nju_blx_resource_clist { \addbibresource {##1} }
   }
 \bool_if:NT \g__nju_opt_load_blx_bool
   {
@@ -1372,24 +1445,28 @@
         \__nju_blx_post_setup:
       }
   }
+\hypersetup
+  {
+    bookmarksnumbered = true,
+    psdextra          = true,
+    unicode           = true,
+    hidelinks
+  }
+\pdfstringdefDisableCommands
+  {
+    \clist_map_inline:nn
+      { \\, \quad, \qquad, \bigger }
+      { \__nju_cs_clear:N #1 }
+    \cs_set_eq:NN \zihao \use_none:n
+  }
 \ctex_at_end_preamble:n
   {
-    \pdfstringdefDisableCommands
-      {
-        \clist_map_inline:nn
-          { \\, \quad, \qquad, \bigger }
-          { \__nju_cs_clear:N #1 }
-      }
     \hypersetup
       {
-        bookmarksnumbered = true,
-        psdextra          = true,
-        unicode           = true,
-        hidelinks,
         pdftitle    = \g__nju_info_title_tl,
         pdfauthor   = \g__nju_info_author_tl,
         pdfkeywords = \g__nju_info_keywords_clist,
-        pdfcreator  = \c__nju_name_pdfcreator_tl
+        pdfcreator  = \l__nju_name_pdfcreator_tl
       }
   }
 \cs_new:Npn \__nju_cref_name:n #1
@@ -1402,10 +1479,10 @@
     \crefformat { section       } { 第~#2#1#3~节   }
     \crefformat { subsection    } { 第~#2#1#3~小节 }
     \crefformat { subsubsection } { 第~#2#1#3~小节 }
-    \clist_map_inline:nn { figure, table, appendix, proof }
+    \clist_map_inline:nn { figure, table, appendix }
       { \__nju_cref_name:n {#1} }
   }
-\clist_set:Nn \g__nju_fn_ctext_option_clist { charf = \scriptsize }
+\clist_gset:Nn \g__nju_fn_ctext_option_clist { charf = \scriptsize }
 \keys_define:nn { nju / footnote }
   {
     style .choices:nn = { plain, pifont, circled, circled* }
@@ -1440,7 +1517,7 @@
         \cs_set:Npn \__nju_fn_hang:
           {
             \int_set:Nn \tex_hangafter:D { 1 }
-            \dim_set_eq:NN \tex_hangindent:D \c__nju_fnhang_dim
+            \dim_set_eq:NN \tex_hangindent:D \l__nju_fnhang_dim
           }
       },
     hang / false       .code:n = { \__nju_cs_clear:N \__nju_fn_hang: },
@@ -1463,7 +1540,7 @@
     \cs_set:Npn \@makefntext #1
       {
         \mode_leave_vertical:
-        \hbox_to_wd:nn { \c__nju_fnhang_dim } { \@thefnmark \tex_hfil:D }
+        \hbox_to_wd:nn { \l__nju_fnhang_dim } { \@thefnmark \tex_hfil:D }
         \tex_penalty:D \@M
         \__nju_fn_hang:
         #1
@@ -1471,17 +1548,19 @@
   }
 \keys_define:nn { nju / image } { path .code:n = { \graphicspath {#1} } }
 \DeclareGraphicsExtensions { .pdf, .eps, .jpg, .png }
-\BeforeBeginEnvironment { tabular } { \centering \c__nju_fmt_tabular_tl }
+\BeforeBeginEnvironment { tabular } { \centering \l__nju_fmt_tabular_tl }
 \ctex_at_end_package:nn { tabularray }
   {
     \__tblr_use_lib_booktabs:
     \tl_set:Nn \l__nju_tmpb_tl
-      { , abovesep = 4 pt, stretch  = 0.8, cells = { font = \c__nju_fmt_tabular_tl } }
+      { , abovesep = 4 pt, stretch  = 0.8, cells = { font = \l__nju_fmt_tabular_tl } }
     \tl_put_right:NV \l__tblr_default_tblr_inner_tl     \l__nju_tmpb_tl
     \tl_put_right:NV \l__tblr_default_talltblr_inner_tl \l__nju_tmpb_tl
-    \tl_put_right:Nn \l__tblr_default_talltblr_outer_tl { , headsep = -4 pt }
+    \tl_put_right:NV \l__tblr_default_longtblr_inner_tl \l__nju_tmpb_tl
+    \tl_put_right:Nn \l__tblr_default_talltblr_outer_tl { , headsep = 12.63 pt }
+    \tl_put_right:Nn \l__tblr_default_longtblr_outer_tl { , headsep = 12.63 pt }
     \DefTblrTemplate { caption-tag } { default }
-      { \c__nju_name_table_tl \hspace { 0.25em } \thetable }
+      { \l__nju_name_table_tl \hspace { 0.25em } \thetable }
     \DefTblrTemplate { caption-sep } { default } { \quad }
     \DefTblrTemplate { firsthead   } { caption }
       {
@@ -1491,11 +1570,11 @@
     \SetTblrTemplate { firsthead   } { caption }
     \SetTblrStyle { caption } { font = \normalfont \bfseries \small }
     \SetTblrStyle { note    } { font = \normalfont \footnotesize    }
+    \SetTblrStyle { remark  } { font = \normalfont \footnotesize    }
   }
 \DeclareCaptionStyle{njucap}
   {
-    font          = small,
-    font         += bf,
+    font          = {small, bf},
     labelsep      = quad,
     justification = centering
   }
@@ -1506,7 +1585,7 @@
   {
     \keys_define:nn { nju / label-sep }
       {
-        #1  .tl_set:c = { g__nju_sep_ #1 _tl },
+        #1 .tl_gset:c = { g__nju_sep_ #1 _tl },
         #1 .initial:n = { - }
       }
     \__nju_at_begin_document:n
@@ -1598,8 +1677,8 @@
 \bool_new:N \g__nju_opt_math_leq_bool
 \bool_new:N \g__nju_opt_math_vec_bool
 \bool_if:NTF \g__nju_opt_load_um_bool
-  { \tl_set_eq:NN \c__nju_name_integral_tl \l__um_nolimits_tl }
-  { \tl_set_eq:NN \c__nju_name_integral_tl \c_empty_tl        }
+  { \tl_set_eq:NN \l__nju_name_integral_tl \l__um_nolimits_tl }
+  { \tl_set_eq:NN \l__nju_name_integral_tl \c_empty_tl        }
 \bool_if:NTF \g__nju_opt_load_um_bool
   { \cs_new:Npn   \__nju_um_setup:n #1 { \keys_set:nn { unicode-math } {#1} } }
   { \cs_new_eq:NN \__nju_um_setup:n \use_none:n }
@@ -1607,19 +1686,19 @@
   {
     integral                      .choice:,
     integral / upright              .code:n  =
-      { \bool_set_true:N  \g__nju_opt_math_int_bool },
+      { \bool_gset_true:N  \g__nju_opt_math_int_bool },
     integral / slanted              .code:n  =
-      { \bool_set_false:N \g__nju_opt_math_int_bool },
+      { \bool_gset_false:N \g__nju_opt_math_int_bool },
     integral-limits               .choice:,
     integral-limits / true          .code:n  =
       { \tl_clear:N   \l__um_nolimits_tl },
     integral-limits / false         .code:n  =
-      { \tl_set_eq:NN \l__um_nolimits_tl \c__nju_name_integral_tl },
+      { \tl_set_eq:NN \l__um_nolimits_tl \l__nju_name_integral_tl },
     less-than-or-equal            .choice:,
     less-than-or-equal / slanted    .code:n  =
-      { \bool_set_true:N  \g__nju_opt_math_leq_bool },
+      { \bool_gset_true:N  \g__nju_opt_math_leq_bool },
     less-than-or-equal / horizontal .code:n  =
-      { \bool_set_false:N \g__nju_opt_math_leq_bool },
+      { \bool_gset_false:N \g__nju_opt_math_leq_bool },
     math-ellipsis                 .choice:,
     math-ellipsis / centered        .code:n  =
       {
@@ -1640,9 +1719,9 @@
       { \bool_set_false:N \g__nju_opt_math_re_bool },
     vector                        .choice:,
     vector / boldfont               .code:n  =
-      { \bool_set_true:N  \g__nju_opt_math_vec_bool },
+      { \bool_gset_true:N  \g__nju_opt_math_vec_bool },
     vector / arrow                  .code:n  =
-      { \bool_set_false:N \g__nju_opt_math_vec_bool },
+      { \bool_gset_false:N \g__nju_opt_math_vec_bool },
     uppercase-greek               .choice:,
     uppercase-greek / upright       .code:n  =
       { \__nju_um_setup:n { math-style = ISO } },
@@ -1751,60 +1830,58 @@
         \pagenumbering { gobble }
         \__nju_make_cover:
       }
-    \bool_if:NF \g__nju_opt_draft_bool
-      {
-        \bool_if:NT \g__nju_opt_decl_bool
-          {
-            \__nju_make_decl_i:
-            \__nju_make_decl_ii:
-          }
-      }
+    \tl_gremove_all:Nn \g__nju_info_title_tl    { \\ }
+    \tl_gremove_all:Nn \g__nju_info_title_en_tl { \\ }
+    \bool_lazy_and:nnT
+      { ! \g__nju_opt_draft_bool }
+      {   \g__nju_opt_decl_bool  }
+      { \__nju_make_decl_i: \__nju_make_decl_ii: }
     \cleardoublepage
-    \exp_args:NV \pagestyle \c__nju_fmt_pagestyle_tl
+    \exp_args:NV \pagestyle \l__nju_fmt_pagestyle_tl
     \pagenumbering { Roman }
   }
-\cs_new_protected:Npn \__nju_print_keywords:nn #1#2
+\cs_new_protected:Npn \__nju_print_keywords:nn
+  { \__nju_print_keywords:NNnn \l__nju_tmpa_tl \l__nju_tmpa_dim }
+\cs_new:Npn \__nju_print_keywords:NNnn #1#2#3#4
   {
-    \tl_set:Nv \l__nju_tmpa_tl { c__nju_name_keywords #1 _tl }
-    \exp_args:NNv \tl_put_left:Nn
-      \l__nju_tmpa_tl { c__nju_fmt_abslabel #1 _tl }
-    \exp_args:NNv \tl_put_right:Nn
-      \l__nju_tmpa_tl { c__nju_name_colon #1 _tl }
-    \__nju_get_width:NV \l__nju_tmpa_dim \l__nju_tmpa_tl
-    \list { \l__nju_tmpa_tl }
+    \tl_set:Nv #1 { l__nju_name_keywords #3 _tl }
+    \exp_args:NNv \tl_put_left:Nn  #1 { l__nju_fmt_abslabel #3 _tl }
+    \exp_args:NNv \tl_put_right:Nn #1 { l__nju_name_colon   #3 _tl }
+    \__nju_get_width:NV #2 #1
+    \list {#1}
       {
-        \labelwidth  \l__nju_tmpa_dim
+        \labelwidth  #2
         \labelsep    \c_zero_dim
         \leftmargin  \c_zero_dim
         \rightmargin \c_zero_dim
-        \advance \leftmargin \l__nju_tmpa_dim
+        \advance \leftmargin #2
         \__nju_cs_clear:N \makelabel
       }
-    \item \clist_use:cn { g__nju_info_keywords #1 _clist } {#2}
+    \item \clist_use:cn { g__nju_info_keywords #3 _clist } {#4}
     \endlist
   }
 \skip_new:N \g__nju_abs_title_left_skip
 \keys_define:nn { nju / abstract }
   {
-    toc-entry          .bool_set:N = \g__nju_abs_showentry_bool,
+    toc-entry         .bool_gset:N = \g__nju_abs_showentry_bool,
     toc-entry           .initial:n = true,
-    underline          .bool_set:N = \g__nju_abs_underline_bool,
+    underline         .bool_gset:N = \g__nju_abs_underline_bool,
     underline           .initial:n = true,
     title-style          .choice:,
     title-style / strict   .code:n =
       {
-        \bool_set_true:N  \g__nju_abs_title_strict_bool
-        \skip_set:Nn \g__nju_abs_title_left_skip { .5 em }
+        \bool_gset_true:N  \g__nju_abs_title_strict_bool
+        \skip_gset:Nn \g__nju_abs_title_left_skip { .5 em }
       },
     title-style / centered .code:n =
       {
-        \bool_set_true:N \g__nju_abs_title_strict_bool
-        \skip_set:Nn \g__nju_abs_title_left_skip { .5 em plus 1 fill }
+        \bool_gset_true:N \g__nju_abs_title_strict_bool
+        \skip_gset:Nn \g__nju_abs_title_left_skip { .5 em plus 1 fill }
       },
     title-style / natural  .code:n =
       {
-        \bool_set_false:N \g__nju_abs_title_strict_bool
-        \skip_set:Nn \g__nju_abs_title_left_skip { .5 em plus 1 fill }
+        \bool_gset_false:N \g__nju_abs_title_strict_bool
+        \skip_gset:Nn \g__nju_abs_title_left_skip { .5 em plus 1 fill }
       },
     title-style         .initial:n = strict
   }
@@ -1812,7 +1889,7 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \__nju_abs_bookmark:Vn \c__nju_name_abstracta_tl { abstract }
+    \__nju_abs_bookmark:Vn \l__nju_name_abstracta_tl { abstract }
     \tl_gremove_all:Nn \g__nju_info_title_tl { \\ }
     \__nju_make_abstract:
     \group_begin: \kaishu \zihao { -4 } #1
@@ -1822,7 +1899,7 @@
   {
     \cleardoublepage
     \thispagestyle { plain }
-    \__nju_abs_bookmark:Vn \c__nju_name_abstracta_en_tl { abstract-en }
+    \__nju_abs_bookmark:Vn \l__nju_name_abstracta_en_tl { abstract-en }
     \tl_gremove_all:Nn \g__nju_info_title_en_tl { \\ }
     \__nju_make_abstract_en:
     \group_begin: \zihao { -4 } #1
@@ -1829,27 +1906,27 @@
   }
   { \__nju_print_keywords:nn { _en } { ;~ } \group_end: }
 \NewDocumentEnvironment { preface         } { +b }
-  { \__nju_chapter:V \c__nju_name_preface_tl #1 }
+  { \__nju_chapter:V \l__nju_name_preface_tl #1 }
   { \cleardoublepage }
 \NewDocumentEnvironment { acknowledgement } { +b }
   {
     \bool_if:NTF \g__nju_opt_anon_bool
-      { \__nju_bookmark_toc:V \c__nju_name_acknowledgementa_tl   }
-      { \__nju_chapter:V      \c__nju_name_acknowledgement_tl #1 }
+      { \__nju_bookmark_toc:V \l__nju_name_acknowledgementa_tl   }
+      { \__nju_chapter:V      \l__nju_name_acknowledgement_tl #1 }
   }
   { \cleardoublepage }
 \NewDocumentCommand \njupaperlist
-  { O { \c__nju_name_paperlist_tl } m }
+  { O { \l__nju_name_paperlist_tl } m }
   {
     \group_begin:
       \RenewDocumentCommand \mkbibnamegiven  { m }
         { \ifitemannotation { thesisauthor }
-            { \njuline { \bf ##1 } } { ##1 } }
+            { \njuline { \bf ##1 } } {##1} }
       \RenewDocumentCommand \mkbibnamefamily { m }
         { \ifitemannotation { thesisauthor }
-            { \njuline { \bf ##1 } } { ##1 } }
+            { \njuline { \bf ##1 } } {##1} }
       \RenewDocumentCommand \mkbibdateshort { m m m }
-        { \textbf { \thefield { ##1 } } }
+        { \textbf { \thefield {##1} } }
       \newrefsection
       \nocite {#2}
       \printbibliography [ heading = subbibliography, title = #1 ]
@@ -1874,13 +1951,13 @@
   }
 \NewDocumentEnvironment { notation } { O { 10 em } O { 5 em } }
   {
-    \__nju_chapter:V \c__nju_name_notation_tl
+    \__nju_chapter:V \l__nju_name_notation_tl
     \__nju_make_notation:nn {#1} {#2}
   }
   { \endlist \cleardoublepage }
 \NewDocumentEnvironment { notation* } { O { 10 em } O { 5 em } }
   {
-    \chapter * { \c__nju_name_notation_tl }
+    \chapter * { \l__nju_name_notation_tl }
     \__nju_make_notation:nn {#1} {#2}
   }
   { \endlist \cleardoublepage }



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