summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-12-14 03:00:49 +0000
committerNorbert Preining <norbert@preining.info>2021-12-14 03:00:49 +0000
commit829614e28f2055883ff74da11eb4e5e57d199be3 (patch)
treee05b47bf922b406e539af54628697bec5b77b4ed /macros
parent8164c2be3b4849a9c77e44b9659a3de8af010bd7 (diff)
CTAN sync 202112140300
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/README.md2
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.pdfbin343541 -> 343605 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.tex1
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-ibid.pdfbin60288 -> 60593 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.def33
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.pdfbin164804 -> 164907 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl-paper.pdfbin78804 -> 79185 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl.cbx3
-rw-r--r--macros/latex/contrib/easybook/easybook.dtx68
-rw-r--r--macros/latex/contrib/easybook/easybook.pdfbin594571 -> 594412 bytes
-rw-r--r--macros/latex/contrib/easybook/easybook.tex32
-rw-r--r--macros/unicodetex/latex/njuthesis/LICENSE415
-rw-r--r--macros/unicodetex/latex/njuthesis/README.md4
-rw-r--r--macros/unicodetex/latex/njuthesis/njuthesis.dtx3760
-rw-r--r--macros/unicodetex/latex/njuthesis/njuthesis.ins75
-rw-r--r--macros/unicodetex/latex/njuthesis/njuthesis.pdfbin796172 -> 861637 bytes
16 files changed, 2285 insertions, 2108 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/README.md b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/README.md
index fefcb07149..17cfc6527b 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/README.md
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/README.md
@@ -50,7 +50,7 @@ The following packages are required:
## Licence
```
-Copyright 2015-2020 David Purton
+Copyright 2015-2021 David Purton
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.pdf
index 00501af9d4..97c42c2f86 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.pdf
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.tex b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.tex
index c7cbc4bcd4..042384d0ad 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.tex
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-examples.tex
@@ -1516,7 +1516,6 @@ Than the Author}
title = {The Great Hymn to the Aten},
shorttitle = {Great Hymn to the Aten},
translator = {Lichtheim, Miriam},
- volume = {1},
part = {26},
pages = {44-46},
related = {hallo:1997},
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-ibid.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-ibid.pdf
index 62d82711bd..c67a65780b 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-ibid.pdf
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl-ibid.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.def b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.def
index 0f8ece1b0d..65bc3e8e81 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.def
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.def
@@ -15,8 +15,8 @@
% VERSION STRINGS
% ------------------------------------------------------------------
-\def\sbl@abx@date{2020/11/04}
-\def\sbl@abx@version{0.12}
+\def\sbl@abx@date{2021/12/13}
+\def\sbl@abx@version{0.13}
\def\sbl@abx@bbxid{\sbl@abx@date\space v\sbl@abx@version\space biblatex-sbl bibliography style (DCP)}
\def\sbl@abx@cbxid{\sbl@abx@date\space v\sbl@abx@version\space biblatex-sbl citation style (DCP)}
\def\sbl@abx@lbxid{\sbl@abx@date\space v\sbl@abx@version\space biblatex-sbl localization (DCP)}
@@ -2682,7 +2682,34 @@
{\printfield{prenote}%
\setunit{\prenotedelim}}}
-\DeclareFieldFormat{altpostnote}{\mkcomprange{#1}}
+% sections and parts of ancient works shouldn't be compressed
+% See SBLHS2 §4.2.6
+\DeclareFieldFormat{altpostnote}{\mknormrange{#1}}
+
+% page ranges beginning with a multiple of 100 shouldn't be compressed
+\def\blx@comprange@check#1#2{%
+ \blx@imc@ifinteger{#1}
+ {\blx@imc@ifinteger{#2}
+ {\@firstoftwo}
+ {\@secondoftwo}}
+ {\@secondoftwo}
+ {\blx@tempcnta=#1
+ \divide\blx@tempcnta by 100
+ \multiply\blx@tempcnta by 100
+ \multiply\blx@tempcnta by -1
+ \advance\blx@tempcnta by #1\relax
+ \ifnum\blx@tempcnta=0
+ \blx@normrange@process{#1}{#2}%
+ \else
+ \blx@comprange@comp{#1}{#2}%
+ \fi}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{\unexpanded{#2}}}}%
+ \blx@tempc}}
% ------------------------------------------------------------------
% BIBLIOGRAPHY REPEATED AUTHOR MACROS
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.pdf
index 2d7f40a15e..7f13d1f78e 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.pdf
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/biblatex-sbl.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl-paper.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl-paper.pdf
index 91e1112207..c35bb5fe82 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl-paper.pdf
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl-paper.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl.cbx b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl.cbx
index 6e67fb24f4..037ffc9621 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl.cbx
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-sbl/sbl.cbx
@@ -306,7 +306,8 @@
{\multicitedelim}
{\usebibmacro{cite:postnote}}
-\newrobustcmd*{\Citefullauthor}{%
+\providecommand\Citefullauthor{}
+\renewrobustcmd*{\Citefullauthor}{%
\@ifstar{\bibsentence\citefullauthor*}{\bibsentence\citefullauthor}}
\DeclareCiteCommand{\citefullauthor}
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx
index 86168e7329..169e50a8a7 100644
--- a/macros/latex/contrib/easybook/easybook.dtx
+++ b/macros/latex/contrib/easybook/easybook.dtx
@@ -15,7 +15,7 @@
%<*class>
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{l3keys2e}
-\ProvidesExplClass{easybook}{2021/12/12}{1.41Q}
+\ProvidesExplClass{easybook}{2021/12/12}{1.41S}
{Typeset Chinese theses or books}
\bool_set_false:N \l__eb_compile_draft_bool
@@ -34,7 +34,7 @@
scheme .code:n = \eb_put_ctexbook:n { scheme = #1 },
enmode .meta:n = { newline,scheme = plain },
font .choices:nn =
- { noto,garamond,times,times*,libertine,palatino,auto }
+ { noto,times,times*,ebgaramond,libertine,palatino,auto }
{ \tl_set:Nn \l__eb_font_value_tl {#1} },
font .value_required:n = true,
font .initial:n = auto,
@@ -79,6 +79,7 @@
\cs_new_eq:NN \eb_set_family:nnn \ctex_ltj_set_family:nnn
\cs_new_eq:NN \eb_switch_family:n \ctex_ltj_switch_family:n
}
+\cs_generate_variant:Nn \eb_switch_family:n { V }
\cs_new_protected:Npn \eb_setmainfont:nn #1#2
{ \__fontspec_main_setmainfont:nn {#2} {#1} }
\cs_new_protected:Npn \eb_setsansfont:nn #1#2
@@ -102,7 +103,7 @@
\tl_set:Nx \l_tmpa_tl
{ \tl_if_novalue:nTF {#1} { \cs_to_str:N #2 } {#1} }
\cs_new_protected:Npx #2
- { \eb_switch_family:n { \l_tmpa_tl } }
+ { \eb_switch_family:V \l_tmpa_tl }
\eb_set_family:nnn { \l_tmpa_tl } {#3,#5} {#4}
}
@@ -184,7 +185,7 @@
BoldItalicFont = *-boldoblique
}
}
-\cs_new_protected:Npn \eb@font@load@garamond
+\cs_new_protected:Npn \eb@font@load@ebgaramond
{
\eb_setmainfont:nn { EBGaramond }
{
@@ -309,7 +310,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{l3keys2e,etoolbox}
-\ProvidesExplPackage{easybase}{2021/12/12}{1.41Q}
+\ProvidesExplPackage{easybase}{2021/12/12}{1.41S}
{Typeset Chinese theses or books}
\cs_generate_variant:Nn \dim_set:Nn { NV }
@@ -567,8 +568,6 @@
withpart .bool_set:N = \l__eb_chap_counter_withpart_bool,
withpart .default:n = true,
withpart .initial:n = false,
- rulewidth .dim_set:N = \l__eb_rule_width_dim,
- rulewidth .initial:n = 0.5pt,
uppercase .bool_set:N = \l__eb_mark_uppercase_bool,
uppercase .default:n = true,
uppercase .initial:n = true,
@@ -658,24 +657,28 @@
}
\ctex_define:nn { hdrset }
{
- chap-mark .cs_set:Np = \eb_fancyhf_chapter_mark:n #1,
- chap-mark .initial:n = \CTEXifname{\eb@mark@chapter@label}{}#1,
- sec-mark .cs_set:Np = \eb_fancyhf_section_mark:n #1,
- sec-mark .initial:n = \CTEXifname{\eb@mark@section@label}{}#1,
- subsec-mark .cs_set:Np = \eb_fancyhf_subsection_mark:n #1,
- subsec-mark .initial:n = \CTEXifname{\eb@mark@subsection@label}{}#1,
- chap-label .code:n = \eb_mark_chapter_name_parse:n {#1},
- chap-label .initial:n = \hspace{1em},
- sec-label .code:n = \eb_mark_section_name_parse:n {#1},
- sec-label .initial:n = \hspace{0.5em},
- subsec-label .code:n = \eb_mark_subsection_name_parse:n {#1},
- subsec-label .initial:n = \hspace{0.5em},
- headrule .tl_gset:N = \headrule,
- headrule .initial:n = \markrule{\l__eb_rule_width_dim},
- footrule .tl_gset:N = \footrule,
- footrule .initial:n = { },
- footnoterule .tl_gset:N = \footnoterule,
- footnoterule .initial:n = \markrule[0.35\textwidth]{\l__eb_rule_width_dim}[|2.6pt]
+ chap-mark .cs_set:Np = \eb_fancyhf_chapter_mark:n #1,
+ chap-mark .initial:n = \CTEXifname{\eb@mark@chapter@label}{}#1,
+ sec-mark .cs_set:Np = \eb_fancyhf_section_mark:n #1,
+ sec-mark .initial:n = \CTEXifname{\eb@mark@section@label}{}#1,
+ subsec-mark .cs_set:Np = \eb_fancyhf_subsection_mark:n #1,
+ subsec-mark .initial:n = \CTEXifname{\eb@mark@subsection@label}{}#1,
+ chap-label .code:n = \eb_mark_chapter_name_parse:n {#1},
+ chap-label .initial:n = \hspace{1em},
+ sec-label .code:n = \eb_mark_section_name_parse:n {#1},
+ sec-label .initial:n = \hspace{0.5em},
+ subsec-label .code:n = \eb_mark_subsection_name_parse:n {#1},
+ subsec-label .initial:n = \hspace{0.5em},
+ headrulewd .dim_set:N = \eb@head@rule@wd,
+ headrulewd .initial:n = 0.5pt,
+ footnoterulewd .dim_set:N = \eb@footnote@rule@wd,
+ footnoterulewd .initial:n = 0.5pt,
+ headrule .tl_gset:N = \headrule,
+ headrule .initial:n = \markrule{\eb@head@rule@wd},
+ footrule .tl_gset:N = \footrule,
+ footrule .initial:n = { },
+ footnoterule .tl_gset:N = \footnoterule,
+ footnoterule .initial:n = \markrule[0.35\textwidth]{\eb@footnote@rule@wd}[|2.6pt]
}
\cs_set_eq:NN \eb_mark_uppercase:n \text_uppercase:n
@@ -2223,11 +2226,11 @@
belowcaptionskip = 1.5ex,
keepspaces = true,
escapeinside = {(*}{*)},
- framerule = \l__eb_rule_width_dim,
+ frame = single,
+ framerule = 0.5pt,
+ framesep = 4.5pt,
xleftmargin = 5pt,
xrightmargin = 5pt,
- framesep = \dimexpr(5pt - \l__eb_rule_width_dim),
- frame = single,
rulecolor = \color{ctex@frame},
commentstyle = \color{SlateGray},
emphstyle = \color{ctex@emph}
@@ -2430,7 +2433,7 @@
}
%</package>
%<*tcolorbox>
-\ProvidesExplFile{eb-tcolorbox.cfg}{2021/12/12}{1.41Q}
+\ProvidesExplFile{eb-tcolorbox.cfg}{2021/12/12}{1.41S}
{Customization of tcolorbox for easybook}
\cs_set_protected:Npn \setexercise #1
@@ -2520,21 +2523,20 @@
{
standard~jigsaw,on~line,
top = 1.5pt,bottom = 1.5pt,left = 1.5pt,right = 1.5pt,
- boxrule = 0.5pt,arc = 1pt,
- opacityback = 0.2
+ arc = 1pt,opacityback = 0.2
}
\deftcbstyle{tc-ebfbox}
{
on~line,sharpish~corners,
top = 1.5pt,bottom = 1.5pt,left = 1pt,right = 1pt,
- boxrule = 0.5pt,leftrule = 0pt,rightrule = 0pt
+ leftrule = 0pt,rightrule = 0pt
}
\tcbset
{
breakable,
boxsep = 0pt,
fonttitle = \sffamily,
- boxrule = \l__eb_rule_width_dim
+ boxrule = 0.5pt
}
\tl_new:N \p@eb@exercise
diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf
index 9dd7f78c37..1b28eb05a9 100644
--- a/macros/latex/contrib/easybook/easybook.pdf
+++ b/macros/latex/contrib/easybook/easybook.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex
index 1d20eef952..6231c55c10 100644
--- a/macros/latex/contrib/easybook/easybook.tex
+++ b/macros/latex/contrib/easybook/easybook.tex
@@ -20,7 +20,7 @@
name = easybook,
color-scheme = blue,
title = EASYBOOK 使用手册,
- version = v1.41Q,
+ version = v1.41S,
date = 2021/12/12,
authors = 瞿毅,
info = 排版简体中文学位论文和书籍,
@@ -246,7 +246,7 @@
\subsection{英文字体}
\begin{options}
- \keychoice{font}{noto,garamond,times,times*,libertine,palatino,auto}\Default{auto}
+ \keychoice{font}{noto,times,times*,ebgaramond,libertine,palatino,auto}\Default{auto}
预置的英文字体相关配置方案如下表所示,这些字体已经包含在了 \TeX Live 发行版中,所以通常不需要再专门安装。如果您想使用其他英文字体,可以使用 \pkg*{fontspec} 宏包的相关命令进行设置。
\insertblr
{
@@ -257,11 +257,11 @@
}{
& 正文字体 & 无衬线字体 & 等宽字体 \\
noto & Noto Serif & Noto Sans & Noto Sans Mono \\
- garamond & EB Garamond & Libertinus Sans & LM Mono \\
- palatino & TG Pagella & Libertinus Sans & LM Mono \\
- libertine & Libertinus Serif & Libertinus Sans & LM Mono \\
times & XITS & TG Heros & TG Cursor \\
- times* & Times New Roman & Arial & Courier New
+ times* & Times New Roman & Arial & Courier New \\
+ ebgaramond & EB Garamond & Libertinus Sans & LM Mono \\
+ palatino & TG Pagella & Libertinus Sans & LM Mono \\
+ libertine & Libertinus Serif & Libertinus Sans & LM Mono
}
\end{options}
@@ -391,7 +391,7 @@
style/color = seaside,
style =
{
- rulewidth = 0.5pt,
+ color = seaside,
uppercase = false
}
}
@@ -418,12 +418,6 @@
使章标题跟随每一部分编号,开启新的一部分时章编号从 1 开始,默认不跟随。
\keychoice{footwith}{part,chapter,page}\Default{chapter}
使脚注跟随编号的计数器,默认跟随章,当开启新的一章时脚注编号从 1 开始。
- \keyval-{rulewidth}{刚性长度}\Default{0.5pt}
- 统一调整页眉、定理盒子以及代码等边框线条的粗细。需要单独设置代码和定理盒子边框线条的粗细时可用它们的宏包自带命令:
- \begin{ctexexam}
- \lstset{framerule = 0.5pt}
- \tcbset{boxrule = 0.5pt}
- \end{ctexexam}
\keybool{uppercase}\Default{true}
使用 \cs*{rightmark} 及 \cs*{leftmark} 等标题标记命令获取标题内容时英文是否大写。
\kvsplit{brackets}{左括号,右括号}\Default{\Carg{(\black{,})}}
@@ -646,7 +640,7 @@
定理环境定义命令 \cs{deftheorem} 更便捷,\meta{键值列表} 中支持的选项与命令 \cs{declaretheorem} 完全相同。但它与后者命令有以下几个区别:
\begin{itemize}
\item 可以重复定义已存在的定理环境而不会报错。
- \item 中英文模式下定理标题自动切换,\meta{英文标题} 默认为首字母大写的 \meta{环境名}。
+ \item 中英文模式下定理标题自动切换。针对中文定理标题的特点将 \meta{中文标题} 设计为必选参数,\meta{英文标题} 则默认为首字母大写的 \meta{环境名}。
\item 自动定义交叉引用的格式,引用标签前缀为相应定理名。
\item 定理盒子选项 \option{thmframe} 仍然生效,\meta{盒子风格} 可以使用 \cs{deftcbstyle} 命令创建。
\item 新建定理环境默认使用的 \meta{定理样式} 为 \code{eb-theorem},而不是 \pkg*{thmtools} 的默认样式。
@@ -712,11 +706,15 @@
\kvsplit-{subsec-label}{\oarg{数字输出命令}\marg{距离命令}}\Default{\cs*{hspace}\Carg{0.5em}}
标题标记命令内容 \cs*{subsectionmark} 的标签,用法与 \option{chap-label} 类似。
\keyval-{headrule}{横线命令}
- 绘制页眉横线的选项,可以使用 \cs*{hrule} 或下述 \cs{markrule} 等画线命令来绘制横线。手动绘制横线时线条粗细选项 \option{rulewidth} 会失效。
+ 绘制页眉横线的选项,可以使用 \cs*{hrule} 或下述 \cs{markrule} 等画线命令来绘制横线。
\keyval-{footrule}{横线命令}\Default
绘制页脚横线的选项,可以使用 \cs*{hrule} 或下述 \cs{markrule} 等画线命令来绘制横线。
\keyval-{footnoterule}{横线命令}
绘制脚注横线的选项,可以使用 \cs*{hrule} 或下述 \cs{markrule} 等画线命令来绘制横线。
+ \keyval-{headrulewd}{刚性长度}\Default{0.5pt}
+ 页眉横线默认的粗细。
+ \keyval-{footnoterulewd}{刚性长度}\Default{0.5pt}
+ 脚注横线默认的粗细。
\end{options}
\begin{commands}\noitemsep
@@ -734,7 +732,7 @@
\begin{commands}
\command{markrule}[\oarg{长度}\darg{颜色名}\marg{线宽}\spemcoarg{上间距,下间距}]
- 命令 \cs{markrule} 既可在 \meta{横线命令} 中用于绘制页眉页脚横线,也可以在正文中使用。\meta{长度} 默认为页面文本区的宽度,上下间距为横线与上下方部件的间距,带有长度单位,上下间距之间用 \code{|} 符号分开,若只有一部分则表示 \meta{上间距}。下面举一个设置页眉内容的例子:
+ 实线命令 \cs{markrule} 既可在 \meta{横线命令} 中用于绘制页眉页脚横线,也可以在正文中使用。\meta{长度} 默认为页面文本区的宽度,上下间距为横线与上下方部件的间距,带有长度单位,上下间距之间用符号 \code{|} 分开,若只有一部分则表示 \meta{上间距}。下面举一个设置页眉内容的例子:
\begin{ctexexam}
\ebhdrset{headrule = \markrule(DarkOrchid){0.5pt}[2pt|2pt]}
\fancyhead[ER]{\leftmark}
@@ -829,7 +827,7 @@
引导线选项 \option{tocrule} 中一般应当使用 \cs{tocrule} 命令绘制引导线,将会在下面介绍。
\keyval-{tocafter}{距离命令}\Default{\cs*{hspace}\Carg{1em}}
在各级别目录中标签与标题间的代码,默认为插入 \code{1em} 横向距离。
- \keyval-{tocline}{目录标签}
+ \keyval-{tocline}{目录中的标题}
这个选项扩展了图片、表格或代码加入目录的题注。选项中参数 \code{\#1} 代表相应题注编号 \cs*{the}\meta{计数器} 的值,参数 \code{\#2} 代表相应题注内容。
\begin{ctexexam}[labelref = exam:list command usage]
\ctexset
diff --git a/macros/unicodetex/latex/njuthesis/LICENSE b/macros/unicodetex/latex/njuthesis/LICENSE
deleted file mode 100644
index 4db9b5af29..0000000000
--- a/macros/unicodetex/latex/njuthesis/LICENSE
+++ /dev/null
@@ -1,415 +0,0 @@
-The LaTeX Project Public License
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-LPPL Version 1.3c 2008-05-04
-
-Copyright 1999 2002-2008 LaTeX3 Project
- Everyone is allowed to distribute verbatim copies of this
- license document, but modification of it is not allowed.
-
-
-PREAMBLE
-========
-
-The LaTeX Project Public License (LPPL) is the primary license under
-which the LaTeX kernel and the base LaTeX packages are distributed.
-
-You may use this license for any work of which you hold the copyright
-and which you wish to distribute. This license may be particularly
-suitable if your work is TeX-related (such as a LaTeX package), but
-it is written in such a way that you can use it even if your work is
-unrelated to TeX.
-
-The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
-below, gives instructions, examples, and recommendations for authors
-who are considering distributing their works under this license.
-
-This license gives conditions under which a work may be distributed
-and modified, as well as conditions under which modified versions of
-that work may be distributed.
-
-We, the LaTeX3 Project, believe that the conditions below give you
-the freedom to make and distribute modified versions of your work
-that conform with whatever technical specifications you wish while
-maintaining the availability, integrity, and reliability of
-that work. If you do not see how to achieve your goal while
-meeting these conditions, then read the document `cfgguide.tex'
-and `modguide.tex' in the base LaTeX distribution for suggestions.
-
-
-DEFINITIONS
-===========
-
-In this license document the following terms are used:
-
- `Work'
- Any work being distributed under this License.
-
- `Derived Work'
- Any work that under any applicable law is derived from the Work.
-
- `Modification'
- Any procedure that produces a Derived Work under any applicable
- law -- for example, the production of a file containing an
- original file associated with the Work or a significant portion of
- such a file, either verbatim or with modifications and/or
- translated into another language.
-
- `Modify'
- To apply any procedure that produces a Derived Work under any
- applicable law.
-
- `Distribution'
- Making copies of the Work available from one person to another, in
- whole or in part. Distribution includes (but is not limited to)
- making any electronic components of the Work accessible by
- file transfer protocols such as FTP or HTTP or by shared file
- systems such as Sun's Network File System (NFS).
-
- `Compiled Work'
- A version of the Work that has been processed into a form where it
- is directly usable on a computer system. This processing may
- include using installation facilities provided by the Work,
- transformations of the Work, copying of components of the Work, or
- other activities. Note that modification of any installation
- facilities provided by the Work constitutes modification of the Work.
-
- `Current Maintainer'
- A person or persons nominated as such within the Work. If there is
- no such explicit nomination then it is the `Copyright Holder' under
- any applicable law.
-
- `Base Interpreter'
- A program or process that is normally needed for running or
- interpreting a part or the whole of the Work.
-
- A Base Interpreter may depend on external components but these
- are not considered part of the Base Interpreter provided that each
- external component clearly identifies itself whenever it is used
- interactively. Unless explicitly specified when applying the
- license to the Work, the only applicable Base Interpreter is a
- `LaTeX-Format' or in the case of files belonging to the
- `LaTeX-format' a program implementing the `TeX language'.
-
-
-
-CONDITIONS ON DISTRIBUTION AND MODIFICATION
-===========================================
-
-1. Activities other than distribution and/or modification of the Work
-are not covered by this license; they are outside its scope. In
-particular, the act of running the Work is not restricted and no
-requirements are made concerning any offers of support for the Work.
-
-2. You may distribute a complete, unmodified copy of the Work as you
-received it. Distribution of only part of the Work is considered
-modification of the Work, and no right to distribute such a Derived
-Work may be assumed under the terms of this clause.
-
-3. You may distribute a Compiled Work that has been generated from a
-complete, unmodified copy of the Work as distributed under Clause 2
-above, as long as that Compiled Work is distributed in such a way that
-the recipients may install the Compiled Work on their system exactly
-as it would have been installed if they generated a Compiled Work
-directly from the Work.
-
-4. If you are the Current Maintainer of the Work, you may, without
-restriction, modify the Work, thus creating a Derived Work. You may
-also distribute the Derived Work without restriction, including
-Compiled Works generated from the Derived Work. Derived Works
-distributed in this manner by the Current Maintainer are considered to
-be updated versions of the Work.
-
-5. If you are not the Current Maintainer of the Work, you may modify
-your copy of the Work, thus creating a Derived Work based on the Work,
-and compile this Derived Work, thus creating a Compiled Work based on
-the Derived Work.
-
-6. If you are not the Current Maintainer of the Work, you may
-distribute a Derived Work provided the following conditions are met
-for every component of the Work unless that component clearly states
-in the copyright notice that it is exempt from that condition. Only
-the Current Maintainer is allowed to add such statements of exemption
-to a component of the Work.
-
- a. If a component of this Derived Work can be a direct replacement
- for a component of the Work when that component is used with the
- Base Interpreter, then, wherever this component of the Work
- identifies itself to the user when used interactively with that
- Base Interpreter, the replacement component of this Derived Work
- clearly and unambiguously identifies itself as a modified version
- of this component to the user when used interactively with that
- Base Interpreter.
-
- b. Every component of the Derived Work contains prominent notices
- detailing the nature of the changes to that component, or a
- prominent reference to another file that is distributed as part
- of the Derived Work and that contains a complete and accurate log
- of the changes.
-
- c. No information in the Derived Work implies that any persons,
- including (but not limited to) the authors of the original version
- of the Work, provide any support, including (but not limited to)
- the reporting and handling of errors, to recipients of the
- Derived Work unless those persons have stated explicitly that
- they do provide such support for the Derived Work.
-
- d. You distribute at least one of the following with the Derived Work:
-
- 1. A complete, unmodified copy of the Work;
- if your distribution of a modified component is made by
- offering access to copy the modified component from a
- designated place, then offering equivalent access to copy
- the Work from the same or some similar place meets this
- condition, even though third parties are not compelled to
- copy the Work along with the modified component;
-
- 2. Information that is sufficient to obtain a complete,
- unmodified copy of the Work.
-
-7. If you are not the Current Maintainer of the Work, you may
-distribute a Compiled Work generated from a Derived Work, as long as
-the Derived Work is distributed to all recipients of the Compiled
-Work, and as long as the conditions of Clause 6, above, are met with
-regard to the Derived Work.
-
-8. The conditions above are not intended to prohibit, and hence do not
-apply to, the modification, by any method, of any component so that it
-becomes identical to an updated version of that component of the Work as
-it is distributed by the Current Maintainer under Clause 4, above.
-
-9. Distribution of the Work or any Derived Work in an alternative
-format, where the Work or that Derived Work (in whole or in part) is
-then produced by applying some process to that format, does not relax or
-nullify any sections of this license as they pertain to the results of
-applying that process.
-
-10. a. A Derived Work may be distributed under a different license
- provided that license itself honors the conditions listed in
- Clause 6 above, in regard to the Work, though it does not have
- to honor the rest of the conditions in this license.
-
- b. If a Derived Work is distributed under a different license, that
- Derived Work must provide sufficient documentation as part of
- itself to allow each recipient of that Derived Work to honor the
- restrictions in Clause 6 above, concerning changes from the Work.
-
-11. This license places no restrictions on works that are unrelated to
-the Work, nor does this license place any restrictions on aggregating
-such works with the Work by any means.
-
-12. Nothing in this license is intended to, or may be used to, prevent
-complete compliance by all parties with all applicable laws.
-
-
-NO WARRANTY
-===========
-
-There is no warranty for the Work. Except when otherwise stated in
-writing, the Copyright Holder provides the Work `as is', without
-warranty of any kind, either expressed or implied, including, but not
-limited to, the implied warranties of merchantability and fitness for a
-particular purpose. The entire risk as to the quality and performance
-of the Work is with you. Should the Work prove defective, you assume
-the cost of all necessary servicing, repair, or correction.
-
-In no event unless required by applicable law or agreed to in writing
-will The Copyright Holder, or any author named in the components of the
-Work, or any other party who may distribute and/or modify the Work as
-permitted above, be liable to you for damages, including any general,
-special, incidental or consequential damages arising out of any use of
-the Work or out of inability to use the Work (including, but not limited
-to, loss of data, data being rendered inaccurate, or losses sustained by
-anyone as a result of any failure of the Work to operate with any other
-programs), even if the Copyright Holder or said author or said other
-party has been advised of the possibility of such damages.
-
-
-MAINTENANCE OF THE WORK
-=======================
-
-The Work has the status `author-maintained' if the Copyright Holder
-explicitly and prominently states near the primary copyright notice in
-the Work that the Work can only be maintained by the Copyright Holder
-or simply that it is `author-maintained'.
-
-The Work has the status `maintained' if there is a Current Maintainer
-who has indicated in the Work that they are willing to receive error
-reports for the Work (for example, by supplying a valid e-mail
-address). It is not required for the Current Maintainer to acknowledge
-or act upon these error reports.
-
-The Work changes from status `maintained' to `unmaintained' if there
-is no Current Maintainer, or the person stated to be Current
-Maintainer of the work cannot be reached through the indicated means
-of communication for a period of six months, and there are no other
-significant signs of active maintenance.
-
-You can become the Current Maintainer of the Work by agreement with
-any existing Current Maintainer to take over this role.
-
-If the Work is unmaintained, you can become the Current Maintainer of
-the Work through the following steps:
-
- 1. Make a reasonable attempt to trace the Current Maintainer (and
- the Copyright Holder, if the two differ) through the means of
- an Internet or similar search.
-
- 2. If this search is successful, then enquire whether the Work
- is still maintained.
-
- a. If it is being maintained, then ask the Current Maintainer
- to update their communication data within one month.
-
- b. If the search is unsuccessful or no action to resume active
- maintenance is taken by the Current Maintainer, then announce
- within the pertinent community your intention to take over
- maintenance. (If the Work is a LaTeX work, this could be
- done, for example, by posting to comp.text.tex.)
-
- 3a. If the Current Maintainer is reachable and agrees to pass
- maintenance of the Work to you, then this takes effect
- immediately upon announcement.
-
- b. If the Current Maintainer is not reachable and the Copyright
- Holder agrees that maintenance of the Work be passed to you,
- then this takes effect immediately upon announcement.
-
- 4. If you make an `intention announcement' as described in 2b. above
- and after three months your intention is challenged neither by
- the Current Maintainer nor by the Copyright Holder nor by other
- people, then you may arrange for the Work to be changed so as
- to name you as the (new) Current Maintainer.
-
- 5. If the previously unreachable Current Maintainer becomes
- reachable once more within three months of a change completed
- under the terms of 3b) or 4), then that Current Maintainer must
- become or remain the Current Maintainer upon request provided
- they then update their communication data within one month.
-
-A change in the Current Maintainer does not, of itself, alter the fact
-that the Work is distributed under the LPPL license.
-
-If you become the Current Maintainer of the Work, you should
-immediately provide, within the Work, a prominent and unambiguous
-statement of your status as Current Maintainer. You should also
-announce your new status to the same pertinent community as
-in 2b) above.
-
-
-WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
-======================================================
-
-This section contains important instructions, examples, and
-recommendations for authors who are considering distributing their
-works under this license. These authors are addressed as `you' in
-this section.
-
-Choosing This License or Another License
-----------------------------------------
-
-If for any part of your work you want or need to use *distribution*
-conditions that differ significantly from those in this license, then
-do not refer to this license anywhere in your work but, instead,
-distribute your work under a different license. You may use the text
-of this license as a model for your own license, but your license
-should not refer to the LPPL or otherwise give the impression that
-your work is distributed under the LPPL.
-
-The document `modguide.tex' in the base LaTeX distribution explains
-the motivation behind the conditions of this license. It explains,
-for example, why distributing LaTeX under the GNU General Public
-License (GPL) was considered inappropriate. Even if your work is
-unrelated to LaTeX, the discussion in `modguide.tex' may still be
-relevant, and authors intending to distribute their works under any
-license are encouraged to read it.
-
-A Recommendation on Modification Without Distribution
------------------------------------------------------
-
-It is wise never to modify a component of the Work, even for your own
-personal use, without also meeting the above conditions for
-distributing the modified component. While you might intend that such
-modifications will never be distributed, often this will happen by
-accident -- you may forget that you have modified that component; or
-it may not occur to you when allowing others to access the modified
-version that you are thus distributing it and violating the conditions
-of this license in ways that could have legal implications and, worse,
-cause problems for the community. It is therefore usually in your
-best interest to keep your copy of the Work identical with the public
-one. Many works provide ways to control the behavior of that work
-without altering any of its licensed components.
-
-How to Use This License
------------------------
-
-To use this license, place in each of the components of your work both
-an explicit copyright notice including your name and the year the work
-was authored and/or last substantially modified. Include also a
-statement that the distribution and/or modification of that
-component is constrained by the conditions in this license.
-
-Here is an example of such a notice and statement:
-
- %% pig.dtx
- %% Copyright 2005 M. Y. Name
- %
- % This work may be distributed and/or modified under the
- % conditions of the LaTeX Project Public License, either version 1.3
- % of this license or (at your option) any later version.
- % The latest version of this license is in
- % http://www.latex-project.org/lppl.txt
- % and version 1.3 or later is part of all distributions of LaTeX
- % version 2005/12/01 or later.
- %
- % This work has the LPPL maintenance status `maintained'.
- %
- % The Current Maintainer of this work is M. Y. Name.
- %
- % This work consists of the files pig.dtx and pig.ins
- % and the derived file pig.sty.
-
-Given such a notice and statement in a file, the conditions
-given in this license document would apply, with the `Work' referring
-to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
-generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
-referring to any `LaTeX-Format', and both `Copyright Holder' and
-`Current Maintainer' referring to the person `M. Y. Name'.
-
-If you do not want the Maintenance section of LPPL to apply to your
-Work, change `maintained' above into `author-maintained'.
-However, we recommend that you use `maintained', as the Maintenance
-section was added in order to ensure that your Work remains useful to
-the community even when you can no longer maintain and support it
-yourself.
-
-Derived Works That Are Not Replacements
----------------------------------------
-
-Several clauses of the LPPL specify means to provide reliability and
-stability for the user community. They therefore concern themselves
-with the case that a Derived Work is intended to be used as a
-(compatible or incompatible) replacement of the original Work. If
-this is not the case (e.g., if a few lines of code are reused for a
-completely different task), then clauses 6b and 6d shall not apply.
-
-
-Important Recommendations
--------------------------
-
- Defining What Constitutes the Work
-
- The LPPL requires that distributions of the Work contain all the
- files of the Work. It is therefore important that you provide a
- way for the licensee to determine which files constitute the Work.
- This could, for example, be achieved by explicitly listing all the
- files of the Work near the copyright notice of each file or by
- using a line such as:
-
- % This work consists of all files listed in manifest.txt.
-
- in that place. In the absence of an unequivocal list it might be
- impossible for the licensee to determine what is considered by you
- to comprise the Work and, in such a case, the licensee would be
- entitled to make reasonable conjectures as to which files comprise
- the Work.
diff --git a/macros/unicodetex/latex/njuthesis/README.md b/macros/unicodetex/latex/njuthesis/README.md
index c80ddf0469..77c522a2be 100644
--- a/macros/unicodetex/latex/njuthesis/README.md
+++ b/macros/unicodetex/latex/njuthesis/README.md
@@ -6,8 +6,8 @@ The `njuthesis` class is intended for typesetting Nanjing University dissertatio
Contributing
------------
-[Issues](https://github.com/nju-lug/NJUVisual/issues) and
-[pull requests](https://github.com/nju-lug/NJUVisual/pulls)
+[Issues](https://github.com/nju-lug/NJUThesis/issues) and
+[pull requests](https://github.com/nju-lug/NJUThesis/pulls)
are always welcome.
Wiki
diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.dtx b/macros/unicodetex/latex/njuthesis/njuthesis.dtx
index 926b68a51c..d08e3c987f 100644
--- a/macros/unicodetex/latex/njuthesis/njuthesis.dtx
+++ b/macros/unicodetex/latex/njuthesis/njuthesis.dtx
@@ -105,7 +105,7 @@ through XeTeX.
%
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\RequirePackage{expl3}
-%<class>\GetIdInfo $Id: njuthesis.dtx 0.12.0 2021-11-30 11:30:00 +0800 NJU LUG <nju.lug@yaoge123.cn> $
+%<class>\GetIdInfo $Id: njuthesis.dtx 0.13.0 2021-12-13 16:30:00 +0800 NJU LUG <nju.lug@yaoge123.cn> $
%<class> { Thesis template for Nanjing University }
%<class>\ProvidesExplClass{njuthesis}
%<class>{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
@@ -113,14 +113,56 @@ through XeTeX.
%<*driver>
\ProvidesFile{njuthesis.dtx}
\documentclass{ctxdoc}
-\usepackage{floatrow,tabularray,njuvisual}
+\usepackage{listings,njuvisual,tabularray}
\usepackage[firstpage=true]{background}
\backgroundsetup{contents={\njuemblem[white!85!gray]{22cm}{!}},scale=1,angle=0,hshift=-4cm}
+\newcommand*\scite[1]{\textsuperscript{\cite{#1}}}
\setlist[1]{labelindent=0.5em}
+\hypersetup{pdftitle={The njuthesis class – LaTeX thesis template for Nanjing University}}
\UseTblrLibrary{booktabs,siunitx,diagbox}
\DefTblrTemplate{caption-tag}{default}{表\hspace{0.25em}\thetable}
\SetTblrStyle{caption-tag}{font=\bfseries}
\DefTblrTemplate{caption-sep}{default}{\quad}
+\lstdefinestyle{style@base}
+ {
+ basewidth = 0.5 em,
+ gobble = 3,
+ lineskip = 3 pt,
+ frame = l,
+ framerule = 1 pt,
+ framesep = 0 pt,
+ xleftmargin = 2 em,
+ xrightmargin = 3 em,
+ escapeinside = {(*}{*)},
+ breaklines = true,
+ basicstyle = \small\ttfamily,
+ keywordstyle = \bfseries\color{njuviolet},
+ commentstyle = \itshape\color{white!50!gray},
+ stringstyle = \color{nju-chem-red},
+ backgroundcolor = \color{white!95!gray}
+ }
+\lstdefinestyle{style@shell}
+ {
+ style = style@base,
+ rulecolor = \color{njumagenta},
+ language = bash,
+ alsoletter = {-},
+ emphstyle = \color{green}
+ }
+\lstdefinestyle{style@latex}
+ {
+ style = style@base,
+ rulecolor = \color{njublue},
+ language = [LaTeX]TeX,
+ alsoletter = {*, -},
+ texcsstyle = *\color{njuviolet},
+ emphstyle = [1]\color{nju-ai-orange},
+ emphstyle = [2]\color{nju-cs-green}
+ }
+\lstnewenvironment{shellexample}[1][]{%
+ \lstset{style=style@shell, #1}}{}
+\lstnewenvironment{latexexample}[1][]{%
+ \lstset{style=style@latex, #1}}{}
\begin{document}
\DocInput{njuthesis.dtx}
\PrintChanges
@@ -135,7 +177,7 @@ through XeTeX.
% Nanjing University Linux User Group
% \thanks{E-mail: \href{mailto:nju.lug@yaoge123.cn}{nju.lug@yaoge123.cn}}}
%
-% \date{v0.12.0 \\ Released 2021-11-30}
+% \date{v0.13.0 \\ Released 2021-12-13}
%
% \changes{v0.1}{2021/09/04}{开始开发。}
% \changes{v0.2}{2021/09/07}{初步搭建了可用的模板。}
@@ -147,12 +189,15 @@ through XeTeX.
% \changes{v0.7}{2021/09/11}{增加对研究生模板的支持}
% \changes{v0.7}{2021/09/12}{将njuthesis发布在CTAN。}
% \changes{v0.8}{2021/09/12}{修复已知问题,进行公开宣传。}
-% \changes{v0.9}{2021/09/15}{使用DocStrip合并模板文件。}
-% \changes{v0.9}{2021/09/15}{大幅度修改宏名称以符合\hologo{LaTeX3}规范。}
+% \changes{v0.9}{2021/09/15}{使用 DocStrip 合并模板文件。}
+% \changes{v0.9}{2021/09/15}{大幅度修改宏名称以符合 \hologo{LaTeX3} 规范。}
% \changes{v0.9}{2021/09/15}{进一步完善文档。}
% \changes{v0.10}{2021/09/24}{删除了生成自述文件的代码。}
% \changes{v0.12}{2021/11/28}{删除内置的 \pkg{njuvisual} 代码。}
% \changes{v0.12}{2021/11/29}{更新了说明文档封面设计。}
+% \changes{v0.12}{2021/11/30}{区分测试文件和空白模板。}
+% \changes{v0.12}{2021/12/06}{修改了说明文档的代码呈现样式。}
+% \changes{v0.13}{2021/12/12}{优化了编译速度。}
%
% \maketitle
%
@@ -189,14 +234,14 @@ through XeTeX.
%
% \clearpage
%
-% \EnableDocumentation
%
% \begin{documentation}
%
-%
% \section{模板介绍}
+%
% \cls{njuthesis},即南京大学学位论文模板,是一个由南京大学 LUG 组织维护的,用于处理本校学生毕业论文排版需求的 \hologo{LaTeX} 模板。
%
+%
% \subsection{历史沿革}
%
% 十几年来,多位热心校友发布过自己编写的模板,在GitHub上可考的包括
@@ -214,27 +259,55 @@ through XeTeX.
% \end{enumerate}
% 至于不幸而未进行代码版本管理的,甚至于说以压缩包形式流传于各人硬盘中的,就更不可计数了。
%
-% 与其让一千个学生做一千种不同的模板,不如有人牵起头来,集中力量办大事。因此,南京大学 Linux User Group 的有志之士在2021年暑期联合起来,参考以上的现成模板,兼顾友校\href{https://ctan.org/pkg/thuthesis}{thuthesis}、\href{https://ctan.org/pkg/fduthesis}{fduthesis}等优秀项目,构建了这一全新模板,力求通过\hologo{LaTeX3}语法和清晰的接口实现良好的易用性和可维护性。
+% 与其让一千个学生做一千种不同的模板,不如有人牵起头来,集中力量办大事。因此,南
+% 京大学 Linux User Group 的有志之士在2021年暑期联合起来,参考以上的现成模板,兼
+% 顾友校\href{https://ctan.org/pkg/thuthesis}{\textsc{THuThesis}}、
+% \href{https://ctan.org/pkg/fduthesis}{\pkg{fduthesis}}等优秀项目,构建了这一全
+% 新模板,力求通过 \hologo{LaTeX3} 语法和清晰的接口实现良好的易用性和可维护性。
%
% 目前,本模板的主要维护者包括:
-%
% \begin{itemize}
% \item 赵懿晨
% \item 熊煜
% \item 马畅
% \end{itemize}
%
+%
% \subsection{君\hologo{LaTeX}本当上手}
-% \hologo{LaTeX}并不是一种零门槛的语言,亦不是南京大学学生的必备技能。有同学听到“\emph{给毕业论文交差也得写代码}”这种事情就头疼,实在是我们不愿意见到而必须要面对的情况。目前,中文互联网上的 \hologo{LaTeX} 写作教程不能说屈指可数,起码也是汗牛充栋,比较著名的包括刘海洋的《\hologo{LaTeX}入门》等等都是不错的参考资料。然而如何快速准确找到所需要的用法,尤其是 \hologo{LaTeX3} 的新接口,需要一定的时间或者良好的英文阅读能力。在本文档的写作中,我们无力从盘古开天辟地开始从头构建您的相关知识体系,只能\emph{尽力做到有求必应},在需要的地方顺带提一嘴,保证您少走点弯路。
+%
+% \hologo{LaTeX} 并不是一种零门槛的语言,亦不是南京大学学生的必备技能。有同学听
+% 到“\emph{给毕业论文交差也得写代码}”这种事情就头疼,实在是我们不愿意见到而必须
+% 要面对的情况。目前,中文互联网上的 \hologo{LaTeX} 写作教程可谓汗牛充栋,然而
+% 如何快速准确找到所需要的用法,尤其是 \hologo{LaTeX3} 的新接口,需要一定的时间
+% 或者良好的英文阅读能力。在本文档的写作中,我们无力从盘古开天辟地开始从头构建您
+% 的相关知识体系,只能\emph{尽力做到有求必应},在需要的地方顺带提一嘴,以期使您
+% 少走点弯路。
+%
+% 如果您希望在使用本模板前了解一些关于这个排版软件的基础知识,在此尝试列举一些有所帮助的资料:
+% \begin{description}
+% \item[《\hologo{LaTeX} 入门》] 刘海洋著。
+% \item[\textit{lshort}] 著名的介绍文档,已被译为多种语言,可以参考英文版\scite{lshort}及其中文翻译版\scite{lshort-zh-cn}。
+% \end{description}
+%
%
% \subsection{关于本说明手册}
%
-% 本模板通过\textsc{DocStrip}进行维护,实际上是一种\emph{文学编程}。文学编程的本体是那些用来说明的文字,按写书写文章的方式组织。
-% \file{njuthesis.dtx}包含njuthesis模板的所有信息。前半部分为模板说明,即各种常用命令与必要的使用方法;后半部分为代码实现,为带有详细注释的\hologo{TeX}源代码。后者配合附录,为有意了解本模板细节的同学提供简明的指引。
+% 本模板通过 \textsc{DocStrip} 进行维护,实际上是一种\emph{文学编程}。文学编程的
+% 本体是那些用来说明的文字,按写书写文章的方式组织。\file{njuthesis.dtx} 包含
+% \cls{njuthesis} 文档类的所有信息。前半部分为模板说明,即各种常用命令与必要的使
+% 用方法;后半部分为代码实现,为带有详细注释的 \hologo{TeX} 源代码。后者配合附
+% 录,为有意了解本模板实现细节的同学提供必要指引。
+%
+% 下文中将出现若干特殊格式,用来指示代码组件。譬如,无衬线字体的
+% \pkg{pkg-example} 为宏包名,等宽字体的 \file{file-example.xxx} 为文件名,等宽
+% 字体的 \opt{opt-example}为选项名,等宽字体的 \env{env-example}为需要
+% |\begin{}|和|\end{}|的环境名,等。本手册提供的代码示例中,左侧边线呈现南大标
+% 准洋红色 {\color{njumagenta}$\blacksquare$} 的属于终端命令,呈南大标准蓝色
+% {\color{njublue}$\blacksquare$} 的属于 \hologo{LaTeX} 源代码。
%
-% 下文中将出现若干特殊格式,用来指示代码组件。譬如,\file{file-example.xxx}为文件名,\pkg{pkg-example}为宏包名,\opt{opt-example}为选项名,\env{env-example}为需要|\begin{}|和|\end{}|的环境名,等。
+% 如果您在使用最新版模板时发现了任何问题,抑或有意向参与本模板的维护,请通过
+% GitHub issue 或者 QQ 群聊联系 NJU LUG。
%
-% 如果您在使用最新版模板时发现了任何问题,抑或有意向参与本模板的维护,请通过GitHub issue或者QQ群聊联系LUG。
%
% \section{安装}
% \label{sec:setup}
@@ -242,41 +315,64 @@ through XeTeX.
%
% \subsection{获取模板}
%
-% \subsubsection{自动安装}
-%
-% \href{https://ctan.org/pkg/njuthesis}{\cls{njuthesis}} 已经于2021年9月12日发布在CTAN(Comprehensive \hologo{TeX} Archive Network),将在明年进入\hologo{TeX}\,Live 2022。
-% \href{https://ctan.org/pkg/njuvisual}{\pkg{njuvisual}} 也已于同年11月28日发布。
-% 目前,南大\hologo{TeX}已预置本模板,详见\ref{subsec:onlinecompile}。
-% 您可以通过 \hologo{TeX}\,Live Manager 或者 \hologo{MiKTeX} Console 等
-% 图形化包管理器直接安装并使用以上两个宏包最新的稳定版,也可以使用 \pkg{tlmgr}
-% \begin{ctexexam}
-% tlmgr install njuthesis
-% tlmgr install njuvisual
-% \end{ctexexam}
-%
-% 我们强烈建议使用这一类安装方式。
+% \cls{njuthesis} 目前处于积极的维护中,其文件主要可通过以下途径获取:
+%
+% \subparagraph{CTAN} \href{https://ctan.org/}{CTAN}\footnote{The Comprehensive \hologo{TeX} Archive Network} 是所有 \hologo{TeX} 相关材料的中枢。\href{https://ctan.org/pkg/njuthesis}{本模板的 CTAN 页面}\footnote{\cls{njuthesis} 已经于2021年9月12日发布在 CTAN,用于绘制南大图标的 \href{https://ctan.org/pkg/njuvisual}{\pkg{njuvisual}} 也已于同年11月28日发布,两者将进入\hologo{TeX}\,Live 2022。}上提供基本的介绍信息,可以下载说明文档(本文档)和宏包源代码。当然,使用这一来源时并不需要接触后者,请参考 \ref{subsubsec:standard-installation} 的标准安装方法。
+%
+% \subparagraph{GitHub 仓库} 最新开发进度会提交在本项目的 \href{https://github.com/nju-lug/NJUThesis}{Github仓库}。仓库内仅包含源代码、空白模板及测试文件,不可直接用于写作。这些文件对应的使用方法请参考 \ref{subsubsec:on-the-fly-installation}。如果由于网络原因不便访问主仓库,也可以从\href{https://git.nju.edu.cn/nju-lug/nju-latex-templates/njuthesis}{NJU Git 同步镜像} 获取项目工程文件。
+%
+% \subparagraph{GitHub Releases} 本模板不定期将已有的新功能和问题修复打包为新的正式发行版,赋以更改后的版本号,发布在 \href{https://github.com/nju-lug/NJUThesis/releases/latest}{Github Releases 页面}。可供下载的文件包括下列三种:
+% \begin{description}
+% \item[\file{njuthesis-v*.pdf}] 模板说明文档(本文档)。
+% \item[\file{njuthesis-v*.zip}] 完整模板包,包括格式文件、范本以及编辑器配置文件。可以解压后用于本地编译或直接上传用于在线编译。
+% \item[\file{njuthesis-ctan-v*.zip}] 用于上传 CTAN 的源码包,普通用户请忽略。
+% \end{description}
+%
%
-% 另一方面,CTAN版需要开发者手动上传,版本更新具有滞后性。如果使用时遇到了问题,推荐使用以下方式获取最新正式版。
+% \subsection{本地安装}
+%
+% \subsubsection{标准安装}
+% \label{subsubsec:standard-installation}
+%
+% 我们\emph{始终建议}使用宏包管理器将 \cls{njuthesis} 安装到您的 \hologo{TeX} 系
+% 统。您可以通过 \hologo{TeX}\,Live Manager 或者 \hologo{MiKTeX} Console 等图形
+% 化包管理器直接搜索并安装 \cls{njuthesis} (及其依赖的 \pkg{njuvisual})最新的
+% 稳定版。同时,您也可以使用终端命令。例如,假设您使用的是 \hologo{TeX}\,Live,
+% 键入下述 \pkg{tlmgr} 的命令(很可能需要管理员权限):
+% \begin{shellexample}[morekeywords={tlmgr,install}]
+% tlmgr install njuthesis njuvisual
+% \end{shellexample}
+% 即可完成安装,无需额外准备 \file{.cls} 文件。
%
-% \subsubsection{下载正式版}
-% \label{subsubsec:downloadrtm}
+% 另一方面,CTAN 依赖开发者手动上传更新,版本更新具有滞后性。如果使用时遇到了问
+% 题,不妨使用下一小节的\emph{即时安装方法}优先载入较新的格式文件。
%
-% 本模板不定期将已有的新功能和问题修复打包为新的正式发行版,下载方式包括:
-% \begin{itemize}
-% \item \href{https://github.com/nju-lug/NJUThesis/releases/latest}{Github Releases页面}
-% \item \href{https://mirror.nju.edu.cn/download/app/NJUThesis%20%E8%AE%BA%E6%96%87%E6%A8%A1%E6%9D%BF}{南大镜像下载页}
-%\end{itemize}
-% 在国内使用时,后者具有显著更快的速度。
+% {\color{red}|[!]|} 如果您使用的是 Linux 系统而且具备相关经验,可以在下载仓库内全部文件后,于该目录下运行
+% \begin{shellexample}[morekeywords={l3build,install}]
+% l3build install
+% \end{shellexample}
+% 来安装本模板的最新版。
%
-% \subsubsection{下载源代码}
+% \subsubsection{即时安装}
+% \label{subsubsec:on-the-fly-installation}
%
-% 最新开发进度会提交在位于Github仓库的源代码。
-% 请注意,如果仅仅是希望使用这个模板写论文,请无论如何都不要从编译源代码开始,这样做只会浪费生命中宝贵的数分钟时间。
-% 我们只推荐希望参与开发的同学下载\file{dtx}文件。
-% \begin{itemize}
-% \item \href{https://github.com/nju-lug/NJUThesis/}{Github 仓库}
-% \item \href{https://git.nju.edu.cn/nju-lug/nju-latex-templates/njuthesis}{NJU Git 同步镜像}
-%\end{itemize}
+% 在某些情况下(例如需要上传至在线编译平台、新版本提供了急需的错误修复),您可能
+% 需要独立的 \file{.cls} 格式文件。此时请前往前述的 Releases 页面下载
+% \emph{完整模板包}。
+%
+% 对于希望使用主仓库中版本的用户,本模板也提供了扁平化安装脚本,用于释放供编译的
+% 空白模板和格式文件。Windows 用户请直接双击打开 \file{install-win.bat};其他平
+% 台(包括 macOS 和 Linux)用户请在此目录下运行
+% \begin{shellexample}[morekeywords={bash}]
+% bash install-unix.sh
+% \end{shellexample}
+% 该脚本会生成一个 \file{mythesis/} 目录以便从头写作,仓库内除此文件夹以外的内容
+% 都可以尽情删除。
+%
+% {\color{red}|[!]|} 请注意,如果仅仅是希望使用这个模板撰写论文,请无论如何都不
+% 要从手动编译 \file{source/} 文件夹下的源代码开始,这样做只会浪费生命中宝贵的数
+% 分钟时间。如果遇到了问题,请前往 GitHub 仓库提出 issue。我们只推荐希望参与开发
+% 的同学接触 \file{.dtx} 文件。
%
% \subsection{文件构成}
%
@@ -289,18 +385,18 @@ through XeTeX.
% \centering
% \begin{tabular}{lp{18em}}
% \toprule
-% 名称 & 说明 \\
+% 名称 & 说明 \\
% \midrule
-% \file{.vscode} & Visual Studio Code 配置文件 \\
-% \file{latexmkrc} & latexmk 配置文件 \\
-% \file{LICENSE} & 许可证 \\
-% \file{njuthesis.bib} & 示例参考文献列表 \\
-% \file{njuthesis.cls} & 模板文档类 \\
-% \color{njuyellow}\file{njuthesis.dtx} & 文档类源代码 \\
-% \color{njuyellow}\file{njuthesis.ins} & 文档类安装脚本 \\
-% \file{njuthesis.pdf} & 用户手册(本文档) \\
+% \file{.vscode} & Visual Studio Code 配置文件 \\
+% \file{latexmkrc} & latexmk 配置文件 \\
+% \file{LICENSE} & 许可证 \\
+% \file{njuthesis.cls} & 模板文档类 \\
+% \color{njuyellow}\file{njuthesis.dtx} & 文档类源代码 \\
+% \color{njuyellow}\file{njuthesis.ins} & 文档类安装脚本 \\
+% \file{njuthesis.pdf} & 用户手册(本文档) \\
+% \file{njuthesis-sample.bib} & 示例参考文献列表 \\
% \file{njuthesis-sample.tex} & 示例文档,不妨以此为基础撰写论文 \\
-% \file{README.md} & 自述文件 \\
+% \file{README.md} & 自述文件 \\
% \bottomrule
% \end{tabular}
% \end{table}
@@ -308,13 +404,14 @@ through XeTeX.
% \subsection{本地编译}
% \label{subsec:localcompile}
%
-% 本地编译的安装过程分为两个阶段:安装 \hologo{TeX} 发行版以及配置编辑器。前者提供了可以被命令行终端调用的编译程序,后者则提供了语法高亮、自动编译等人性化功能。
+% 本地编译的安装过程分为两个阶段:安装 \hologo{TeX} 发行版以及配置编辑器。前者提供了可以被命
+% 令行终端调用的编译程序,后者则提供了语法高亮、自动编译等人性化功能。
%
% \subsubsection{安装\hologo{TeX}发行版}
%
-% 首先需要下载并安装 \hologo{TeX} 软件发行版,各操作系统适用情况请参考表\ref {tab:texdistribution}。第一次编译前请务必通过 MiKTeX Console、TeX Live Manager 等图形化程序或 \pkg{tlmgr}\emph{手动更新全部宏包}以避免潜在的兼容性问题。
-%
-% \begin{table}[H]
+% 首先需要下载并安装 \hologo{TeX} 软件发行版,其中包括引擎、宏包、字体、文档等。各操作系统适用情况请参考表~\ref {tab:texdistribution}。第一次编译前请务必通过 MiKTeX Console、TeX Live
+% Manager 等图形化程序或 \pkg{tlmgr} \emph{手动更新全部宏包}以避免潜在的兼容性问题。
+% \begin{table}[ht]
% \centering
% \caption{\hologo{TeX} 软件发行版一览}
% \label{tab:texdistribution}
@@ -322,20 +419,21 @@ through XeTeX.
% \toprule
% \hologo{TeX} & Windows & macOS & Linux \\
% \midrule
-% \hologo{TeX}\,Live & $\bullet$ & $\bullet$ & $\bullet$ \\
+% \hologo{TeX}\,Live & $\bullet$ & & $\bullet$ \\
% mac\hologo{TeX} & & $\bullet$ & \\
-% \hologo{MiKTeX} & $\bullet$ & $\bullet$ & \\
+% \hologo{MiKTeX} & $\bullet$ & $\bullet$ & $\bullet$ \\
% \bottomrule
% \end{tabular}
% \end{table}
%
% 以下是一些值得注意的要点:
% \begin{itemize}
-% \item 校园网环境中访问\href{https://mirror.nju.edu.cn/download/app/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F}{南大镜像站}可以获得最佳的下载体验。
+% \item 可以参照这份\href{https://ctan.org/pkg/install-latex-guide-zh-cn}{手把手的教程}。
+% \item 校园网环境中访问\href{https://mirror.nju.edu.cn/download/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F}{南京大学开源软件镜像站}可以获得最佳的下载体验。
% \item 使用最新的发行版,即版本号为2021或者21。
% \item 对于 Windows 和 macOS 用户,更推荐轻量化的 \hologo{MiKTeX} 套件。
-% \item Linux用户请尽可能下载 full 版本,如 |texlive-full|。换言之,下载最大的软件包。
-% \item 对于一部分用到新版本特性的宏包,\cls{njuthesis}内置了版本检查,请确认各宏包已升级至最新版。
+% \item Linux 用户请尽可能下载 full 版本,如 |texlive-full|。换言之,下载最大的软件包。
+% \item 对于一部分用到新版本特性的宏包,\cls{njuthesis} 内置了版本检查\footnote{譬如遇到 l3 过时问题请运行 |tlmgr update l3packages|。},请确认各宏包已升级至最新版。
% \end{itemize}
%
% \subsubsection{配置编辑器}
@@ -343,7 +441,9 @@ through XeTeX.
%
% 配置完编译器后,还需要一个\emph{文本编辑器}来完成\file{.tex}文件内容的写作。
%
-% 关于具体使用哪一种,至今仍有相当一部分人认为Windows自带的\emph{记事本}是最好的文本编辑器,但对于本项目而言,在此诚心诚意地推荐你使用\emph{更现代更美观更多功能}的编辑器,譬如\emph{安装了 LaTeX Workshop 插件 的 \href{https://code.visualstudio.com/}{Visual Studio Code}}。你也可以根据个人的喜好随意使用 TeXworks、TeXstudio 等编辑器,顺手就行。
+% 关于具体使用哪一种,至今仍有相当一部分人认为Windows自带的\emph{记事本}是最好的
+% 文本编辑器。但对于本项目而言,在此诚心诚意地推荐您使用\emph{更现代更美观更多功
+% 能}的编辑器,譬如\emph{安装了 LaTeX Workshop 插件的 \href{https://code.visualstudio.com/}{Visual Studio Code}}。您也可以根据个人的喜好随意使用 TeXworks、TeXstudio 等编辑器,顺手就行。
%
% \cls{njuthesis} 为一些常见编辑器提供了配置文件,如
% \begin{description}
@@ -353,64 +453,73 @@ through XeTeX.
%
% \subsubsection{编译顺序}
% \label{subsubsec:compileseq}
-% \hologo{TeX} 本身是命令行程序,通过不同的命令调用所需的编译引擎。
-% 尽管上述的文本编辑器已经提供了自动化编译的方法,为了便于排查运行错误,以下通过具体终端命令简要描述编译过程。
-%
-% 编译本模板概括为如下步骤:生成初始文档,编译参考文献,生成页码、编号、目录,需要编译4次。
-% \emph{假设即将使用的文件名为 \file{mynjuthesis.tex}},
-% 应采用以下命令顺序进行编译,以生成内容正确的 \file{mynjuthesis.pdf}。输出的 PDF 文档位于同一目录下。
-%
-% 编译命令具体为引擎名称加文件名,在编译\file{.tex}文件时,文件扩展名可以省略不写。现阶段 \cls{njuthesis} 仅支持 \hologo{XeLaTeX} 与 \hologo{LuaLaTeX}。请注意,几种命令的输出文件基本相同,可以任取一种;但如果你不清楚这两种编译引擎的区别,我们建议优先使用|latexmk -xelatex|。
-%
-% \subparagraph{使用 \hologo{XeLaTeX}}
-%
-% \begin{ctexexam}
-% xelatex mynjuthesis
-% biber mynjuthesis
-% xelatex mynjuthesis
-% xelatex mynjuthesis
-% \end{ctexexam}
+% \hologo{TeX} 本身是命令行程序,通过不同的命令调用所需的编译引擎,编辑器提供的
+% 快捷按钮实际只是做了包装。为了便于排查运行错误,以下通过具体终端命令简要描述编
+% 译过程。
+%
+% 编译本模板概括为如下步骤:生成初始文档,编译参考文献,生成页码、编号、目录,需
+% 要编译4次。\emph{假设即将使用的文件名为 \file{njuthesis-sample.tex}},应采用以
+% 下命令顺序进行编译,以生成内容正确的 \file{njuthesis-sample.pdf}。输出的 PDF
+% 文档位于同一目录下。该目录下同时会生成若干中间文件。
+%
+% 编译命令具体为引擎名称加文件名,在编译 \file{.tex} 文件时,文件扩展名可以省略
+% 不写。现阶段 \cls{njuthesis} 仅支持 \hologo{XeLaTeX} 与 \hologo{LuaLaTeX}。请
+% 注意,几种命令的输出文件基本相同,可以任取一种;但如果您不清楚这两种编译引擎的
+% 区别,或者对多步编译感到困惑,我们建议优先使用 |latexmk -xelatex|。
+%
+% \subparagraph{使用 \hologo{XeLaTeX}}
+% 标准的 \hologo{XeLaTeX} 引擎编译方法。
+%
+% \begin{shellexample}[morekeywords={xelatex,biber}]
+% xelatex njuthesis-sample
+% biber njuthesis-sample
+% xelatex njuthesis-sample
+% xelatex njuthesis-sample
+% \end{shellexample}
%
% \subparagraph{使用 \hologo{LuaLaTeX}}
-% \begin{ctexexam}
-% lualatex mynjuthesis
-% biber mynjuthesis
-% lualatex mynjuthesis
-% lualatex mynjuthesis
-% \end{ctexexam}
+% 标准的 \hologo{LuaLaTeX} 引擎编译方法。
+%
+% \begin{shellexample}[morekeywords={lualatex,biber}]
+% lualatex njuthesis-sample
+% biber njuthesis-sample
+% lualatex njuthesis-sample
+% lualatex njuthesis-sample
+% \end{shellexample}
%
% \subparagraph{使用 \pkg{latexmk}}
-% \href{https://mg.readthedocs.io/latexmk.html}{\pkg{latexmk}} 是一个基于 Perl 脚本的自动编译工具,宗旨是通过单一命令简化上述的多次编译流程。在使用该命令前,请确保安装了以下软件:
+% \pkg{latexmk}\scite{latexmk} 是一个基于 Perl 脚本的自动编译工具,宗旨是通过单一命令简化上述的多次编译流程。在使用该命令前,请确保安装了以下软件:
% \begin{description}
% \item[Perl] 一般预装于 macOS 和 Linux,而 Windows 用户需要单独安装 \href{https://strawberryperl.com/}{Strawberry Perl}。
% \item[\pkg{latexmk}] \hologo{MiKTeX}已预装;如果终端找不到|latexmk|命令,\hologo{TeX}\,Live 用户需使用 \pkg{tlmgr} 单独安装。
% \end{description}
%
% 该命令的使用方法为
-% \begin{ctexexam}
-% latexmk mynjuthesis
-% \end{ctexexam}
+% \begin{shellexample}[morekeywords={latexmk}]
+% latexmk njuthesis-sample
+% \end{shellexample}
%
-% 如需指定编译器,可以加入|-xelatex|或|-lualatex|参数,例如指定 \hologo{XeLaTeX} 的命令为
-% \begin{ctexexam}
-% latexmk -xelatex mynjuthesis
-% \end{ctexexam}
+% 如需指定编译器,可以加入 |-xelatex| 或 |-lualatex| 参数,例如指定 \hologo{XeLaTeX} 的命令为
+% \begin{shellexample}[morekeywords={latexmk,xelatex}]
+% latexmk -xelatex njuthesis-sample
+% \end{shellexample}
%
% 此外可以选择使用以下命令清理编译生成的临时文件。
-% \begin{ctexexam}
+% \begin{shellexample}[morekeywords={latexmk}]
% latexmk -c
-% \end{ctexexam}
+% \end{shellexample}
%
% \subsection{在线编译}
% \label{subsec:onlinecompile}
%
-% 相信你在接触了本地编译以后,很快就会意识到一些十分显然的事实,譬如\hologo{TeX}编译器安装过程较为漫长\footnote{因此对于 Windows 推荐 \hologo{MiKTeX}。},占用空间过大,而且在一部分处理器性能不佳的电脑上需要较长编译时间\footnote{同一个模板在 Linux 编译可以相对 Windows 节省一半耗时。}。拒绝接受这些麻烦的同学不妨尝试本节介绍的在线编译方法。
+% 相信您在接触了本地编译以后,很快就会意识到一些十分显然的事实,譬如\hologo{TeX}编译器安装过程较为漫长\footnote{因此对于 Windows 推荐 \hologo{MiKTeX}。},占用空间过大,而且在一部分处理器性能不佳的电脑上需要较长编译时间\footnote{同一个模板在 Linux 编译可以相对 Windows 节省一半耗时。}。拒绝接受这些麻烦的同学不妨尝试本节介绍的在线编译方法。
%
% \subsubsection{南大\hologo{TeX}平台简介}
% \changes{v0.2}{2021/09/07}{添加对南大\hologo{TeX}的支持。}
%
% \href{https://tex.nju.edu.cn}{南大\hologo{TeX}}基于开源的 ShareLaTeX 平台\footnote{理论上在\href{https://doc.nju.edu.cn/books/latex}{这个网站}能找到一段平台简介,实际上大家都有意无意地鸽了,下次一定补上。},于2021年3月4日正式上线,是 \href{https://sci.nju.edu.cn/}{eScience 中心}为南大在校师生提供的 \hologo{LaTeX} 在线编译平台,首次使用需凭学校邮箱自助注册账号。
%
+%
% \subsubsection{操作步骤}
%
% \begin{enumerate}
@@ -420,76 +529,69 @@ through XeTeX.
% \item 点击Compile按钮进行编译和预览
% \end{enumerate}
%
-% 注意,由于南大\hologo{TeX}已预装\cls{njuthesis},可以直接编写正文,无需\file{.cls}等格式文件。如果需要使用新版模板,也可以点击New Project -> Upload Project上传 \ref{subsubsec:downloadrtm} 得到的压缩文件。
+% 注意,由于南大 \hologo{TeX} 已预装 \cls{njuthesis},可以直接编写正文,无需 \file{.cls} 等格式文件。如果需要使用新版模板,也可以点击New Project -> Upload Project上传 \ref{subsubsec:on-the-fly-installation} 得到的压缩文件。
%
-% \subsubsection{关于Overleaf}
%
-% 由于\href{https://www.overleaf.com/}{Overleaf} 平台的\hologo{TeX}\,Live版本停留在2020,\texttt{cleveref}包在引用章节时会生成错误的标签,引发格式错误;而南大\hologo{TeX}通过及时更新规避了若干问题。因此\emph{请务必不要使用Overleaf官网进行编译}。
+% \subsubsection{其他平台}
%
-% \subsubsection{关于TeXPage}
+% \subparagraph{Overleaf}
+% \changes{v0.12}{2021/12/07}{更新了对 Overleaf 的支持情况。}
+% \pkg{njuthesis} 现已支持 \href{https://www.overleaf.com/}{Overleaf} 平台。
+%
+% \subparagraph{TeXPage}
+% \href{https://www.texpage.com/}{TeXPage} 是国人研发的\hologo{LaTeX}在线编辑器,当前版本已具备较为完善的编辑编译功能,而且免费版相对 Overleaf 增加了公式识别、编辑历史等实用工具,也可以作为一个备选项。
%
-% \href{https://www.texpage.com/}{TeXPage} 是国人研发的\hologo{LaTeX}在线编辑器,当前版本已具备较为完善的编辑编译功能,而且免费版相对 Overleaf 增加了公式识别、编辑历史等实用工具,也可以作为一个备选项。目前的缺憾是对于 \cls{njuthesis} 的编译速度较慢。
%
% \section{使用方法}
%
% \subsection{标准结构}
%
-% 典型的\cls{njuthesis}主文件结构应该如下所示:
+% 典型的 \cls{njuthesis} 主文件结构应该如下所示:
%
-% \begin{ctexexam}
-% \documentclass[<options>]{njuthesis}
-% \njusetup { info = {<info>} }
-% \graphicspath{{figure/}}
-% \addbibresource{njuthesis.bib}
+% \begin{latexexample}[moretexcs={\njusetup,\graphicspath,\addbibresource,\maketitle,\tableofcontents,\listoffigures,\listoftables,\mainmatter,\chapter,\printbibliography,\appendix},emph={[1]document}]
+% \documentclass{njuthesis}
+% \njusetup{}
% \begin{document}
% \maketitle
-% <abstract>
-% <preface>
% \tableofcontents
-% \listoffigures
-% \listoftables
% \mainmatter
-% <text>
-% \printbibliography[heading=bibintoc,title=参考文献]
-% <acknowledgement>
-% \appendix
-% <appendix>
+% \chapter{欢迎}
+% 使用 \hologo{LaTeX}
+% \printbibliography
% \end{document}
-% \end{ctexexam}
+% \end{latexexample}
+%
+% 如果您尝试编译上面的代码,会发现自己得到了一个5页的 PDF 文档,是一份空白的本科生论文。
+% 当然,这个文档实际上没有任何内容,接下来将会介绍具体填写内容的方法。
+%
%
% \subsection{模板选项}
%
-% 模板选项位于\tn{documentclass}后的方括号内,用于指定模板的行为。
+% 模板选项位于 \tn{documentclass} 后的方括号内,用于指定模板的行为。
% 下文中尖括号内列出了若干个允许的选项,其中加粗的为默认选项。
-%
-%
%
% \subsubsection{学位信息}
% \begin{function}[added=2021-09-07]{degree}
% \begin{syntax}
% degree = <(ug)|mg|mf|phd>
% \end{syntax}
-%
% 选择学位,分别为学士、学术型硕士、专业硕士、博士。
% \end{function}
-%
+%
% \begin{function}[added=2021-09-07]{nlcover}
% \begin{syntax}
% nlcover = <\TTF>
% \end{syntax}
-%
-% 通过此项可选择是否添加国家图书馆封面。由于本科生院文件中并未提及相关规定,故本选项仅对于研究生有效。
+% 通过此项可选择是否用国家图书馆封面替换普通封面。
+% 由于本科生院文件中并未提及相关规定,故本选项仅对于研究生有效。
% \end{function}
%
% \begin{function}[added=2021-09-07]{type}
% \begin{syntax}
% type = <(thesis)|design>
% \end{syntax}
-%
% 用于选择文档类型并将相关字段输出在封面和摘要页,可选值分别为毕业论文和毕业设计。
-%
% \end{function}
-%
%
%
% \subsubsection{指定字体}
@@ -498,12 +600,11 @@ through XeTeX.
%
% 如果希望更改本模板使用的字体,请填写以下两个选项以覆盖操作系统检测得到的设置。
%
-% \begin{function}[added=2021-09-07]{customchinesefont,customlatinfont}
+% \begin{function}[added=2021-09-07,updated=2021-12-12]{cjk-font,latin-font}
% \begin{syntax}
-% customchinesefont = <(windows)|macos|fandol|founder|noto|none>
-% customlatinfont = <(windows)|macos|gyre|none>
+% cjk-font = <(win)|mac|fandol|founder|noto|none>
+% latin-font = <(win)|mac|gyre|none>
% \end{syntax}
-%
% 手动指定字体。
% \end{function}
%
@@ -584,211 +685,220 @@ through XeTeX.
% 最后,出于统一格式的需要,本模板还选取了与正文字体相似度最高的数学字体(\href{https://github.com/aliftype/xits}{XITS 字体})用于公式排版。
%
% 本节提及的字库中,中文字库只有方正书宋、方正黑体、方正楷体、方正仿宋、两种思源字体和四种Fandol字体能够\emph{免费商用};
-% 英文字库中只有 Times New Roman、XITS 和三种\Hologo{TeX} Gyre字体能够\emph{免费商用}。
+% 英文字库中只有 Times New Roman、XITS 和三种 \Hologo{TeX} Gyre字体能够\emph{免费商用}。
% 因此,若需要将本模板用于商业相关的活动,请咨询专业人士。
%
+%
% \subsection{个人信息}
%
-% \begin{function}[updated=2021-10-01]{\njusetup}
+% \begin{function}[added=2021-09-10]{\njusetup}
% \begin{syntax}
-% \tn{njusetup}\Arg{键值列表}
-% \end{syntax}
-%
-%
-% 以下为各项个人信息,其中带星号的为对应的英文名称。
-% 有空格的内容需要将空格替换为波浪线或者两端加上大括号,不需要的项目不填即可。
-%
+% \tn{njusetup} \Arg{键值列表}
+% \end{syntax}
+% 是 \cls{njuthesis} 文档类的通用设置命令,用来设置各项功能。\tn{njusetup} 的参数是一个使用英文半角逗号分隔的键值列表,通常形如 \meta{key}|=|\meta{value}。
% \end{function}
%
-% \begin{function}{info/titlea,info/titleb,info/titlec,info/title*}
+% 目前,\tn{njusetup} 仅包含用于设置个人信息的 |info| 类。以下为全部的个人信息参数,其中带有星号的为对应的英文字段。请注意,部分参数已被弃置,列于后方。
+%
+% \begin{function}[updated=2021-12-12]{info/title,info/title*}
% \begin{syntax}
-% titlea = \Arg{第一行标题}
-% titleb = \Arg{第二行标题}
-% titlec = \Arg{第三行标题}
+% title = \Arg{标题}
% title* = \Arg{英文标题}
% \end{syntax}
-% 题目。由于封面上提供给中文题目的横线长度有限(单行最长为15个汉字),这里将中文题目进行手动拆分,请自行选择合适的断行处。如果题目较短不需要二三行,留空即可。
+% 题目。由于封面上提供给中文题目的横线长度有限(单行最长为15个汉字),默认会自动对标题进行换行。如果需要手动制定换行位点,请使用英文半角感叹号 |!|,最多两处。
% \end{function}
%
-% \begin{function}{info/keywords,info/keywords*}
+% \begin{function}[updated=2021-10-01]{info/keywords,info/keywords*}
% \begin{syntax}
-% keywords = \Arg{关键词}
+% keywords = \Arg{关键词}
% keywords* = \Arg{英文关键词}
% \end{syntax}
% 关键词列表。关键词之间需要使用英文半角逗号隔开,含有空格的关键字需要使用花括号包裹以避免歧义。可以参照示例模板中的填写方式。
% \end{function}
%
-% \begin{function}{info/grade}
+% \begin{function}[updated=2021-10-01]{info/grade}
% \begin{syntax}
% grade = \Arg{20XX}
% \end{syntax}
% 年级,推荐格式为“20XX”。
% \end{function}
%
-% \begin{function}{info/student-id}
+% \begin{function}[updated=2021-10-01]{info/student-id}
% \begin{syntax}
% student-id = \Arg{学号}
% \end{syntax}
% 学号。南京大学本科生为9位数字学号,研究生为两位大写字母标识加上八位数字组成的学号。
% \end{function}
%
-% \begin{function}{info/author,info/author*}
+% \begin{function}[updated=2021-10-01]{info/author,info/author*}
% \begin{syntax}
-% author = \Arg{你的名字}
+% author = \Arg{你的名字}
% author* = \Arg{姓名拼音}
% \end{syntax}
% 姓名。
% \end{function}
%
-% \begin{function}{info/department,info/department*}
+% \begin{function}[updated=2021-10-01]{info/department,info/department*}
% \begin{syntax}
-% department = \Arg{院系}
+% department = \Arg{院系}
% department* = \Arg{院系}
% \end{syntax}
% 院系。
% \end{function}
%
-% \begin{function}{info/major,info/major*}
+% \begin{function}[updated=2021-10-01]{info/major,info/major*}
% \begin{syntax}
-% major = \Arg{专业}
+% major = \Arg{专业}
% major* = \Arg{专业}
% \end{syntax}
% 专业。
% \end{function}
%
-% \begin{function}{info/field,info/field*}
+% \begin{function}[updated=2021-10-01]{info/field,info/field*}
% \begin{syntax}
% field = \Arg{方向}
% field* = \Arg{方向}
% \end{syntax}
% 研究领域。只有研究生有研究领域的说法。
% \end{function}
-%
-% \begin{function}{info/supervisora,info/supervisora*,info/supervisora-title,info/supervisora-title*}
+%
+% \begin{function}[updated=2021-12-12]{info/supervisor,info/supervisor*,info/supervisor-title,info/supervisor-title*}
% \begin{syntax}
-% supervisora = \Arg{导师}
-% supervisora* = \Arg{导师}
-% supervisora-title = \Arg{导师职称}
-% supervisora-title* = \Arg{导师职称}
+% supervisor = \Arg{导师}
+% supervisor* = \Arg{导师}
+% supervisor-title = \Arg{导师职称}
+% supervisor-title* = \Arg{导师职称}
% \end{syntax}
-% 导师,如果有第二导师,填写第二导师时将A替换为B即可。
+% 导师。
% \end{function}
%
+% \begin{function}[updated=2021-12-12]{info/supervisor-ii,info/supervisor-ii*,info/supervisor-ii-title,info/supervisor-ii-title*}
+% \begin{syntax}
+% supervisor-ii = \Arg{第二导师}
+% supervisor-ii* = \Arg{第二导师}
+% supervisor-ii-title = \Arg{第二导师职称}
+% supervisor-ii-title* = \Arg{第二导师职称}
+% \end{syntax}
+% 第二导师。
+% \end{function}
%
-% \begin{function}{info/submit-date,info/submit-date*}
+% \begin{function}[updated=2021-10-01]{info/submit-date,info/submit-date*}
% \begin{syntax}
-% submit-date = \Arg{提交日期}
+% submit-date = \Arg{提交日期}
% submit-date* = \Arg{提交日期}
% \end{syntax}
% 提交日期。
% \end{function}
%
-% \begin{function}{info/defend-date,info/chairman,info/reviewer}
+% \begin{function}[updated=2021-10-01]{info/defend-date,info/chairman,info/reviewer}
% \begin{syntax}
% defend-date = \Arg{答辩日期}
% chairman = \Arg{答辩主席}
% reviewer = \Arg{评委姓名职称}
% \end{syntax}
-% 答辩相关的内容,只对研究生有效,包括答辩日期,评审委员会主席及四位成员的姓名加职称。其中,四位评审成员是以列表的形式存储的,填写方法同关键词。
+% 答辩相关的内容,只对研究生有效,包括答辩日期,评审委员会主席及四位成员的姓名加职称。其中,四位评审成员是以列表的形式存储的,填写方法同关键词。如果是盲审,填入“盲审”二字即可。
% \end{function}
%
-% \begin{function}{info/clc,info/secret-level,info/udc,info/supervisor-contact}
+% \begin{function}[updated=2021-10-01]{info/clc,info/secret-level,info/udc,info/supervisor-contact}
% \begin{syntax}
% clc = \Arg{中图分类号}
% secret-level = <不涉密|秘密|机密|绝密>
% udc = \Arg{udc}
% supervisor-contact = \Arg{导师联系方式}
% \end{syntax}
-% 国家图书馆封面相关,包括中图分类号、密级、udc和导师联系方式。
+% 国家图书馆封面相关,包括中图分类号、密级、UDC 分类号和导师联系方式。
+% \end{function}
+%
+% \begin{function}{info/titlea,info/titleb,info/titlec,info/supervisora,info/supervisora*,info/supervisora-title,info/supervisora-title*,info/supervisorb,info/supervisorb*,info/supervisorb-title,info/supervisorb-title*}
+% 这些选项已在 v0.13 弃置,请不要使用。
% \end{function}
%
+%
% \subsubsection{输入示范}
%
-% 本科生可以参考如下列表输入个人信息。注意不能有空行。
+% 本科生可以参考如下范例输入个人信息。注意不能有空行。
%
-% \begin{ctexexam}
+% \begin{latexexample}[moretexcs={\njusetup},emph={[2]info}]
% \njusetup {
% info = {
-% titlea = 第一行标题,
-% titleb = 第二行标题,
+% title = {第一行标题!第二行标题},
% title* = {My title in English},
% keywords = {我,就是,充数的,关键词},
% keywords* = {Dummy,Keywords,Here,{it is}},
-% grade = 2018,
-% student-id = 189114514,
-% author = 周煜华,
-% author* = Zhou~Yuhua,
-% department = 拉太赫科学与技术学院,
-% department* = School~of~\hologo{LaTeX},
-% major = 拉太赫语言学,
-% major* = \hologo{LaTeX}~Linguistics,
-% supervisora = 李成殿,
-% supervisora*= Li~Chengdian,
-% supervisora-title = 教授,
-% supervisora-title* = Professor,
-% supervisorb = 孙赫弥,
-% supervisorb* = Sun~Hemi,
-% supervisorb-title = 副教授,
-% supervisorb-title* = Associate professor,
-% submit-date = 2021年8月10日,
+% grade = {2018},
+% student-id = {189114514},
+% author = {周煜华},
+% author* = {Zhou Yuhua},
+% department = {拉太赫科学与技术学院},
+% department* = {School of \hologo{LaTeX}},
+% major = {拉太赫语言学},
+% major* = {\hologo{LaTeX} Linguistics},
+% supervisor = {李成殿},
+% supervisor*= {Li Chengdian},
+% supervisor-title = {教授},
+% supervisor-title* = {Professor},
+% submit-date = {2021年8月10日},
% }
% }
-% \end{ctexexam}
+% \end{latexexample}
%
% 研究生可以参考如下列表输入个人信息
%
-% \begin{ctexexam}
+% \begin{latexexample}[moretexcs={\njusetup},emph={[2]info}]
% \njusetup {
% info = {
-% titlea = 第一行标题,
-% titleb = 第二行标题,
-% titlec = 第三行标题,
+% title = {第一行标题!第二行标题!第三行标题},
% title* = {My title in English},
% keywords = {我,就是,充数的,关键词},
% keywords* = {Dummy,Keywords,Here,{it is}},
-% grade = 2018,
-% student-id = dz18114514,
-% author = 周煜华,
-% author* = Zhou~Yuhua,
-% department = 拉太赫科学与技术学院,
-% department* = School~of~\hologo{LaTeX},
-% major = 拉太赫语言学,
-% major* = \hologo{LaTeX}~Linguistics,
-% field = 拉太赫语言在现当代的使用,
-% field* = Contemporary~Usage~of~the~\hologo{LaTeX}~Language,
-% supervisora = 李成殿,
-% supervisora*= Li~Chengdian,
-% supervisora-title = 教授,
-% supervisora-title* = Professor,
-% submit-date = 2021年8月10日,
+% grade = {2018},
+% student-id = {dz18114514},
+% author = {周煜华},
+% author* = {Zhou Yuhua},
+% department = {拉太赫科学与技术学院},
+% department* = {School of \hologo{LaTeX}},
+% major = {拉太赫语言学},
+% major* = {\hologo{LaTeX} Linguistics},
+% field = {拉太赫语言在现当代的使用},
+% field* = {Contemporary Usage of the \hologo{LaTeX}~Language},
+% supervisor = {李成殿},
+% supervisor*= {Li Chengdian},
+% supervisor-title = {教授},
+% supervisor-title* = {Professor},
+% submit-date = {2021年8月10日},
% submit-date* = {Aug 10, 2021},
-% defend-date = 2021年9月19日,
-% chairman = 张晓山~教授,
+% defend-date = {2021年9月19日},
+% chairman = {张晓山~教授},
% reviewer = {王瑞希~教授,郭德纲~副教授,华芈库~教授,戴菲菲~教授},
-% clc = 0175.2,
-% secret-level = 限制,
-% udc = 004.72,
+% clc = {0175.2},
+% secret-level = {限制},
+% udc = {004.72},
% supervisor-contact = {拉太赫科学与技术学院 枝江市结丘路 19 号 114514},
% }
% }
-% \end{ctexexam}
-%
+% \end{latexexample}
%
%
% \subsection{编写正文}
%
% 与导言区相对的是正文,位于\env{document}环境内。
%
-% \begin{ctexexam}
-% \begin{document}
-% text
-% \end{document}
-% \end{ctexexam}
+% \begin{function}{\mainmatter}
+% \cs{mainmatter} 标志着正文的开始,重新开始字号计数并设置页眉。
+% \end{function}
%
-% 加上空行就可以另起一段。
+% 在页面布局方面,页面编号居中位于页脚,本科生无页眉,研究生页眉包括章名(奇数页)和节名(偶数页)。
%
+% \begin{function}{\chapter,\section,\subsection,\subsubsection}
+% \begin{syntax}
+% \tn{chapter}\oarg{短描述}\marg{完整的章标题}
+% \tn{section}\oarg{短描述}\marg{完整的节标题}
+% \tn{subsection}\oarg{短描述}\marg{完整的节标题}
+% \tn{subsection}\oarg{短描述}\marg{完整的节标题}
+% \end{syntax}
+% \pkg{ctex} 宏集提供了其中用于处理长标题的可选参数。对于过长的标题,目录中会使用其短描述。
+% \end{function}
%
-% 在页面布局方面,本科生无页眉,页面编号居中位于页脚;研究生无页脚,页眉包括章节名和页面编号(尚未确定)。
%
% \subsubsection{文字}
%
@@ -804,7 +914,6 @@ through XeTeX.
% \begin{syntax}
% \tn{footnote}\Arg{脚注}
% \end{syntax}
-%
% 添加脚注
% \end{function}
%
@@ -821,29 +930,30 @@ through XeTeX.
%
% 下面这个例子展示了如何插入一张名称为\file{myfig.jpg},宽度占页面文字宽度一半的图片。注意标签命令\tn{label}必须放在图注命令\tn{caption}之后。
%
-% \begin{ctexexam}
+% \begin{latexexample}[moretexcs={\includegraphics},emph={[1]figure}]
% \begin{figure}[h]
+% \centering
% \includegraphics[width=0.5\textwidth]{myfig}
% \caption{我的图}
% \label{fig:myfig}
% \end{figure}
-% \end{ctexexam}
+% \end{latexexample}
%
-%
% 对于较为瘦长,或者仅起到辅助作用的图像,可以使用\env{wrapfigure}实现文字环绕效果。注意这个环境后紧跟的一行不能为空。
%
-% \begin{ctexexam}
+% \begin{latexexample}[moretexcs={\includegraphics},emph={[1]wrapfigure}]
% \begin{wrapfigure}{r}{0cm}
+% \centering
% \includegraphics[width=0.15\textwidth]{myfig}
% \caption{我的图}
% \label{fig:myfig}
% \end{wrapfigure}
% <text>
-% \end{ctexexam}
+% \end{latexexample}
%
-% TODO:使用\pkg{subcaption}的\env{subfigure}实现多张图片并排的效果。较为老旧的\pkg{subfigure}并不在此受到支持。
+% 使用 \pkg{caption} 内置的 \pkg{subcaption} 提供 \env{subfigure} 环境,实现多张图片并排的效果。较为老旧的 \pkg{subfigure} 并不在此受到支持。
%
-% \begin{ctexexam}
+% \begin{latexexample}[moretexcs={\includegraphics},emph={[1]figure,subfigure}]
% \begin{figure}
% \begin{subfigure}{.32\textwidth}
% \centering
@@ -862,13 +972,15 @@ through XeTeX.
% \end{subfigure}
% \caption{subfigures}
% \end{figure}
-% \end{ctexexam}
+% \end{latexexample}
+%
%
% \subsubsection{表格}
%
% 下面这个例子展示了如何插入一张表格。通过 \pkg{booktabs} 提供的 \tn{toprule}、\tn{midrule} 和 \tn{bottomrule},我们可以很轻松地绘制出一张漂亮规范的三线表。
-% \begin{ctexexam}
+% \begin{latexexample}[moretexcs={\toprule,\midrule,\bottomrule},emph={[1]table,tabular}]
% \begin{table}[htbp]
+% \centering
% \caption{我的表}
% \label{tab:testtab}
% \begin{tabular}{ccc}
@@ -879,7 +991,7 @@ through XeTeX.
% \bottomrule
% \end{tabular}
% \end{table}
-% \end{ctexexam}
+% \end{latexexample}
%
% \begin{function}{\multirow,\multicolumn}
% \begin{syntax}
@@ -892,16 +1004,23 @@ through XeTeX.
%
% \end{function}
%
+%
% \subsubsection{代码}
%
-% 由\pkg{listings}提供代码排版。代码块\env{lstlisting},注意这个环境中的缩进空格会如实输出
-% \begin{ctexexam}
-% \begin{lstlisting}
+% 由 \pkg{listings} 提供代码排版。代码块 \env{lstlisting},注意这个环境中的缩进空格会如实输出。
+% 如需指定语言,可以使用 |language| 选项。如需自定义关键字,可以使用 |morekeywords| 选项
+% \begin{latexexample}[emph={[1]lstlisting},emph={[2]language}]
+% \begin{lstlisting}[language=python]
% <code>
% \end{lstlisting}
-% \end{ctexexam}
+% \end{latexexample}
%
-% 行间代码|\lstinline!<code>!|,其中包裹代码的两个感叹号并不是绝对的,可以替换成任何两个相同的没有在这段代码中出现过的符号。
+% 行间代码可以使用抄录环境 \tn{verb} ,
+% 格式如 |\verb!<code>!|。其中包裹代码的两个感叹号并不是绝对的,可以替换成任何两个相同的没有在这段代码中出现过的符号。
+% 同时,也可以使用简写的行内代码环境,使用两条竖线包裹代码即可。请注意,\pkg{listings} 提供的 \tn{lstinline} 会被全局的字号设置污染。如果需要在行内代码指定语言,请参考如下设置:
+% \begin{latexexample}[moretexcs={\lstinline,\tt},deletetexcs={\usepackage},emph={[2]language,basicstyle}]
+% \lstinline[language=[LaTeX]TeX, basicstyle=\tt]!\usepackage{njuvisual}!
+% \end{latexexample}
%
%
% \subsubsection{数学}
@@ -911,27 +1030,45 @@ through XeTeX.
% 行内公式形如|$\mathrm{e}^{(a+2b)x}$|
%
% 带有编号的行间公式\env{equation}
-% \begin{ctexexam}
+% \begin{latexexample}[emph={[1]equation}]
% \begin{equation}\label{eq:myeqlabel}
% \pi
% \end{equation}
-% \end{ctexexam}
+% \end{latexexample}
%
-% 如不需要编号,可以用\env{equation*}或者 |\[<eq>\]|
+% 如不需要编号,可以用 \env{equation*} 或者 |\[|\meta{公式}|\]|,请不要使用可能引发问题的 |$$|\meta{公式}|$$|\footnote{\url{https://tex.stackexchange.com/questions/503/why-is-preferable-to}}。
+%
+% 本模板也提供了一系列的数学环境。
+% 全部预定义的数学环境如表~\ref{tab:mathenv} 所示。其中证明环境较为特殊,会在结尾添加证毕符号(\mdwhtsquare)。
+%
+% \begin{table}[htbp]
+% \centering
+% \caption{数学环境}
+% \label{tab:mathenv}
+% \begin{tabular}{cc|cc}
+% \toprule
+% 标签 & 名称 & 标签 & 名称 \\
+% \midrule
+% axiom & 公理 & lemma & 引理 \\
+% corollary & 推论 & proof & 证明 \\
+% definition & 定义 & theorem & 定理 \\
+% example & 例 & & \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
%
-% 本模板也提供了一系列的数学环境。证明环境会在结尾添加证毕符号
-% \begin{ctexexam}
+% 使用示例如下。
+% \begin{latexexample}
% \begin{proof}
% 证明我是我
% \end{proof}
-% \end{ctexexam}
-%
-% 普通环境
-% \begin{ctexexam}
+% \end{latexexample}
+% 普通环境。
+% \begin{latexexample}
% \begin{definition}[他人]
% 定义他人即地狱
% \end{definition}
-% \end{ctexexam}
+% \end{latexexample}
%
%
% \subsubsection{引用}
@@ -940,9 +1077,7 @@ through XeTeX.
% \begin{syntax}
% \tn{cref}\Arg{标签}
% \end{syntax}
-%
-% 使用\pkg{cleveref}宏包实现了带图、表等项目名称的智能引用。
-%
+% 使用 \pkg{cleveref} 宏包实现了带图、表等项目名称的智能引用。
% \end{function}
%
% \begin{function}{\href,\url}
@@ -950,49 +1085,48 @@ through XeTeX.
% \tn{href}\Arg{链接}\Arg{名称}
% \tn{url}\Arg{链接}
% \end{syntax}
-%
-% 超链接。\tn{href}会将特定字符显示为可点击的超链接,\tn{url}会输出可点击的链接原文。
-%
+% 超链接。\tn{href} 会将特定字符显示为可点击的超链接,\tn{url} 会输出可点击的链接原文。
% \end{function}
%
%
% \subsection{特殊页面}
%
-% 本模板还提供一系列环境用于生成所需的特殊页面
+% 本模板还提供一系列命令与环境用于生成所需的特殊页面。
%
% \subsubsection{封面}
%
% \begin{function}{\maketitle}
-%
% 用于生成封面。
% 本科生仅会生成中文封面;研究生会生成中英文封面。
-% 如果选择了\opt{nlcover},也会生成研究生的国家图书馆封面。
-%
+% 如果选择了 \opt{nlcover},仅会生成研究生的国家图书馆封面和原创性声明页。
% \end{function}
%
%
% \subsubsection{摘要页}
% \changes{v0.11}{2021/10/01}{简化了摘要的编写方式。}
-%
%
-% \begin{ctexexam}
+% \begin{function}{abstract,abstract*}
+% 摘要。带星号的会生成英文摘要。
+% \end{function}
+%
+% \begin{latexexample}[emph={[1]abstract,abstract*}]
% \begin{abstract}
% 我的中文摘要
% \end{abstract}
%
% \begin{abstract*}
-% My abstract in English
+% Abstract in English
% \end{abstract*}
-% \end{ctexexam}
+% \end{latexexample}
%
%
% \subsubsection{前言页}
%
-% \begin{function}{preface}
-% 使用\env{preface}环境定义
+% \begin{function}{preface}
+% 使用 \env{preface} 环境定义。
% \end{function}
%
-% \begin{ctexexam}
+% \begin{latexexample}[emph={[1]preface,flushright}]
% \begin{preface}
% 我的前言
% \vspace{1cm}
@@ -1001,45 +1135,34 @@ through XeTeX.
% 时间地点
% \end{flushright}
% \end{preface}
-% \end{ctexexam}
+% \end{latexexample}
+%
%
% \subsubsection{目录页}
%
% \begin{function}{\tableofcontents,\listoffigures,\listoftables}
-%
% 分别生成目录、图片清单和表格清单。
-%
% \end{function}
%
%
% \subsubsection{致谢页}
%
% \begin{function}{acknowledgement}
-% 同前言,使用\env{acknowledgement}环境
+% 同前言,使用 \env{acknowledgement} 环境。
% \end{function}
%
-% \begin{ctexexam}
+% \begin{latexexample}[emph={[1]acknowledgement}]
% \begin{acknowledgement}
% 感谢NJU LUG
% \end{acknowledgement}
-% \end{ctexexam}
+% \end{latexexample}
%
-% \subsubsection{参考文献页}
%
-% 使用以下命令,\opt{bibintoc}可以将参考文献页插入目录
-%
-% \begin{ctexexam}
-% \printbibliography[heading=bibintoc,title=参考文献]
-% \end{ctexexam}
-%
% \subsubsection{附录页}
%
% \begin{function}{\appendix}
-%
% 附录放在本命令后,以英文字母进行编号,编写方式同正文
% \end{function}
-%
-% 是否需要索引?
%
%
% \subsubsection{成果列表}
@@ -1048,32 +1171,26 @@ through XeTeX.
% \begin{syntax}
% \tn{njupaperlist}\Arg{文献}
% \end{syntax}
-% 成果列表,分别为发表文章目录与合作文章目录。\Arg{文献}的填写方式同\tn{cite},多个文献需要使用英文半角逗号隔开。
+% 成果列表,分别为发表文章目录与合作文章目录。\Arg{文献} 的填写方式同 \tn{cite},多个文献需要使用英文半角逗号隔开。
% \end{function}
%
% \subsection{参考文献}
%
-% 符合GB7714-2015规范。使用\hologo{biber}作为\hologo{BibTeX}后端。需要使用|biber|命令手动编译才会显示
+% 符合GB7714-2015规范。使用\hologo{biber}作为后端。需要使用 |biber| 命令手动编译才会显示
%
% \begin{function}{\addbibresource}
% \begin{syntax}
% \tn{addbibresource}\Arg{文件}
% \end{syntax}
-%
-% 默认参考文献存储于主目录下的\file{njuthesis.bib},直接向其中粘贴新的参考文献即可。如果希望额外添加参考文献列表,可以在导言区中多次调用\tn{addbibresource}命令。注意本命令与|\bibliography{bibfile1,bibfile2}|不同,不可以用逗号分隔多个输入文件,且必须使用带扩展名的完整文件名。
+% 添加参考文献源文件。
% \end{function}
%
-%
-% \subsubsection{使用EndNote}
-%
-% 南京大学信息化建设管理服务中心已购买\href{https://itsc.nju.edu.cn/EndNote/list.htm}{EndNote}供全校师生免费试用,最新版为EndNote 20。
+% 示例参考文献存储于 \file{njuthesis-sample.bib},直接向其中粘贴新的参考文献即可。如果希望额外添加参考文献列表,可以在导言区中多次调用 \tn{addbibresource} 命令。注意本命令与 |\bibliography{bibfile1,bibfile2}| 不同,不可以用逗号分隔多个输入文件,且必须使用带扩展名的完整文件名。
%
+% \begin{function}{\printbibliography}
+% 生成参考文献列表页面。
+% \end{function}
%
-% \subsubsection{使用Zotero}
-%
-% \href{https://www.zotero.org/}{Zotero}是一款免费的文献管理软件,支持所有桌面平台。
-%
-% 在保持Zotero程序运行的情况下,点击浏览器工具栏的Zotero Connector插件即可自动从网页抓取参考文件信息。Zotero可以通过\href{https://github.com/l0o0/jasminum}{jasminum插件}支持中文参考文献的识别。在选中希望使用的文献后右键导出文献条目即可生成\file{.bib}文件。
%
% \subsubsection{文段内引用}
%
@@ -1085,23 +1202,81 @@ through XeTeX.
% \end{syntax}
% 引用文献
% \end{function}
+%
+%
+% \subsubsection{文献管理}
+%
+% \subparagraph{使用EndNote}
+%
+% 南京大学信息化建设管理服务中心已购买\href{https://itsc.nju.edu.cn/EndNote/list.htm}{EndNote}供全校师生免费试用,最新版为EndNote 20。
+%
+%
+% \subparagraph{使用Zotero}
+%
+% \href{https://www.zotero.org/}{Zotero}是一款免费的文献管理软件,支持所有桌面平台。
+%
+% 在保持Zotero程序运行的情况下,点击浏览器工具栏的Zotero Connector插件即可自动从网页抓取参考文件信息。Zotero可以通过\href{https://github.com/l0o0/jasminum}{jasminum插件}支持中文参考文献的识别。在选中希望使用的文献后右键导出文献条目即可生成\file{.bib}文件。
+%
%
% \subsection{视觉识别系统}
%
% 视觉识别系统 \pkg{njuvisual} 现已被分离为独立宏包,基本使用方法举例如下:
-% \begin{ctexexam}
-% \njuemblem{!}{3cm} % 默认生成指定大小的紫色南大校徽
-% \njuname{4cm}{!} % 默认生成指定大小的紫色南大中文校名
-% \njuname*{4cm}{!} % 默认生成指定大小的紫色南大英文校名
+% \begin{latexexample}[moretexcs={\njuemblem,\njuname}]
+% \njuemblem{!}{3cm} % 生成指定大小的紫色南大校徽
+% \njuname{4cm}{!} % 生成指定大小的紫色南大中文校名
+% \njuname*{4cm}{!} % 生成指定大小的紫色南大英文校名
% \njuemblem[black]{!}{3cm} % 黑色的南大校徽
% \njuemblem[department=dii]{!}{4cm} % 紫色匡院徽标
% \njuemblem[department=cs,color=blue]{!}{3cm} % 纯蓝色计科徽标
-% \end{ctexexam}
+% \end{latexexample}
%
% 本宏包的详细使用方法请参考其\href{http://mirrors.ctan.org/macros/latex/contrib/njuvisual/njuvisual.pdf}{说明文档}。
%
+%
+% \begin{thebibliography}{99}
+%
+% \newcommand\urlprefix{\newline\hspace*{\fill}}
+% \let\OldUrl=\url
+% \renewcommand\url[2][]{{\small\textit{#1}~\OldUrl{#2}}}
+% \newcommand\CTANurl[2][]{{^^A
+% \small\textit{#1}~\href{http://mirror.ctan.org/#2}{\texttt{CTAN://#2}}}}
+%
+% \subsubsection{书籍}
+%
+% \bibitem{lshort}
+% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al.
+% \newblock \textit{The Not So Short Introduction to \hologo{LaTeXe}: Or \hologo{LaTeXe} in 139 minutes} [EB/OL].
+% \newblock version 6.4,
+% \newblock (2021-03-09)
+% \urlprefix\url{https://ctan.org/pkg/lshort-english}
+% \urlprefix\CTANurl[文档:]{info/lshort/english/lshort.pdf}
+%
+% \bibitem{lshort-zh-cn}
+% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al.
+% \newblock \textit{一份(不太)简短的 \hologo{LaTeXe} 介绍: 或 111 分钟了解 \hologo{LaTeXe}} [EB/OL].
+% \newblock \CTeX{} 开发小组, 译.
+% \newblock 原版版本 version 6.4, 中文版本 version 6.03,
+% \newblock (2021-11-21)
+% \urlprefix\url{https://ctan.org/pkg/lshort-zh-cn}
+% \urlprefix\CTANurl[文档:]{info/lshort/chinese/lshort-zh-cn.pdf}
+%
+%
+% \subsubsection{宏包、模版}
+%
+% \bibitem{latexmk}
+% \textsc{Collins J}.
+% \newblock \textit{Fully automated \hologo{LaTeX} document generation} [EB/OL].
+% \newblock version 4.76,
+% \newblock (2021-11-20)
+% \urlprefix\url{https://www.ctan.org/pkg/latexmk}
+% \urlprefix\CTANurl[文档:]{support/latexmk/latexmk.pdf}
+%
+% \end{thebibliography}
+%
+%
% \end{documentation}
%
+%
% \begin{implementation}
%
% \section{代码实现}
@@ -1116,9 +1291,10 @@ through XeTeX.
% “|*|”和“|/|”的 guard 出现在行号右侧,它们用来确定
% 单独一行代码的归属。这些 guard 的颜色深浅不一,用以明确嵌套关系。
%
-% 另有若干包含|@@|的guard,在 \pkg{l3docstrip} 中表示名空间(模块)。
-% 在删除注释生成格式文件时,变量名称中的|@@|会被等号后的字段替换,
-% 譬如在本模板\cls{njuthesis}中 |@@=nju|。
+% 另有若干包含 |@@| 的guard,用以表示名空间(模块)。
+% 在删除注释生成格式文件时,变量名称中的 |@@| 会被等号后的字段替换,
+% 譬如在本模板 \cls{njuthesis} 中 |@@=nju|。
+%
%
% \subsection{准备}
%
@@ -1128,20 +1304,21 @@ through XeTeX.
% \end{macrocode}
%
% \changes{v0.11}{2021/10/23}{添加了若干环境检查与警告信息。}
+% \changes{v0.12}{2021/12/03}{放宽对于 \pkg{l3packages} 的版本要求。}
% 检查 \hologo{LaTeX3} 编程环境。
% \begin{macrocode}
\RequirePackage { xtemplate, l3keys2e }
\msg_new:nnn { njuthesis } { l3-too-old }
{
- Package~ "#1"~ is~ too~ old. \\\\
- Please~ update~ an~ up-to-date~ version~ of~ \\
- the~ bundles "l3kernel"~ and~ "l3packages"~ \\
- using~ your~ TeX~ package manager~ or~ from~ \\
+ Package~ "#1"~ is~ too~ old. \\
+ Please~ update~ an~ up-to-date~ version~ of~
+ the~ bundles "l3kernel"~ and~ "l3packages"~
+ using~ your~ TeX~ package~ manager~ or~ from~ \\
CTAN.
}
\clist_map_inline:nn { xtemplate, l3keys2e }
{
- \@ifpackagelater {#1} { 2021/08/27 }
+ \@ifpackagelater {#1} { 2020/10/01 }
{ } { \msg_error:nnn { njuthesis } { l3-too-old } {#1} }
}
@@ -1151,10 +1328,10 @@ through XeTeX.
% \begin{macrocode}
\msg_new:nnn { njuthesis } { unsupported-engine }
{
- The~ njuthesis~ class~ requires~ either~ \\
- XeTeX~ or~ LuaTeX. \\\\
- "#1"~ is~ not~ supported~ at~ present.~ \\
- You~ must~ change your~ typesetting~ engine~ \\
+ The~ njuthesis~ class~ requires~ either~
+ XeTeX~ or~ LuaTeX. \\
+ "#1"~ is~ not~ supported~ at~ present.~
+ You~ must~ change your~ typesetting~ engine~
to~ "xelatex"~ or~ "lualatex".
}
\sys_if_engine_xetex:F
@@ -1167,14 +1344,32 @@ through XeTeX.
}
% \end{macrocode}
%
-% \subsection{定义常量}
%
-% \begin{variable}{\c_@@_name_type_clist,
+% \subsection{定义变量}
+%
+% l代表局部变量,g代表全局变量。
+%
+% \begin{variable}{\l_@@_tmp_box,\l_@@_tmp_clist,\l_@@_tmp_dim,
+% \l_@@_tmp_int,\l_@@_tmp_seq,\l_@@_tmp_tl}
+% 临时变量。
+% \begin{macrocode}
+\box_new:N \l_@@_tmp_box
+\clist_new:N \l_@@_tmp_clist
+\dim_new:N \l_@@_tmp_dim
+\int_new:N \l_@@_tmp_int
+\seq_new:N \l_@@_tmp_seq
+\tl_new:N \l_@@_tmp_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_name_type_clist,\c_@@_name_type_en_clist,
% \c_@@_name_degree_clist,\c_@@_name_degree_en_clist}
% 论文类型与学位类型。
% \begin{macrocode}
\clist_const:Nn \c_@@_name_type_clist
{ 毕业论文, 毕业设计 }
+\clist_const:Nn \c_@@_name_type_en_clist
+ { THESIS, DESIGN }
\clist_const:Nn \c_@@_name_degree_clist
{ 学士, 硕士, 硕士专业, 博士 }
\clist_const:Nn \c_@@_name_degree_en_clist
@@ -1182,11 +1377,74 @@ through XeTeX.
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\l_@@_info_degree_int,\l_@@_info_degree_tl,
+% \l_@@_info_diploma_int,\l_@@_info_diploma_tl,
+% \l_@@_info_type_int,\l_@@_info_type_tl}
+% 用于存储学位名称的变量。
+% \begin{macrocode}
+\int_new:N \l_@@_info_degree_int
+\tl_new:N \l_@@_info_degree_tl
+\int_new:N \l_@@_info_diploma_int
+\tl_new:N \l_@@_info_diploma_tl
+\int_new:N \l_@@_info_type_int
+\tl_new:N \l_@@_info_type_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_second_supv_bool}
+% 定义用于判断是否有第二导师的变量。
+% \begin{macrocode}
+\bool_new:N \l_@@_second_supv_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_info_supv_full_tl,\l_@@_info_supv_full_en_tl}
+% 用于存储导师姓名加职称的变量。
+% \begin{macrocode}
+\tl_new:N \l_@@_info_supv_full_tl
+\tl_new:N \l_@@_info_supv_full_en_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_load_sys_font_bool}
+% 定义用于判断是否需要载入系统预装字体的变量。
+% \begin{macrocode}
+\bool_new:N \g_@@_load_sys_font_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_latin_font_tl,\g_@@_cjk_font_tl}
+% 用于存储所使用字体名称的全局变量
+% \begin{macrocode}
+\tl_new:N \g_@@_latin_font_tl
+\tl_new:N \g_@@_cjk_font_tl
+% \end{macrocode}
+% \end{variable}
+%
+%
+% \subsection{内部函数}
+%
+% \begin{macro}{\@@_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 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_vskip:,\@@_hskip:}
+% 生成一个较小的 skip。
+% \begin{macrocode}
+\cs_new:Nn \@@_vskip: { \skip_vertical:n { 1 ex } }
+\cs_new:Nn \@@_hskip: { \skip_horizontal:n { 0.3 em } }
+% \end{macrocode}
+% \end{macro}
+%
% \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} }
+ { \tl_const:cn { c_@@_name_ #1 _tl } {#2} }
\cs_new_protected:Npn \@@_define_name:nnn #1#2#3
{
\tl_const:cn { c_@@_name_ #1 _tl } {#2}
@@ -1195,125 +1453,424 @@ through XeTeX.
% \end{macrocode}
% \end{macro}
%
-% 默认名称。注意空格是忽略掉的。
+% \begin{macro}{\@@_name:n,\@@_info:n}
+% 根据变量名调用名称和内容信息。
% \begin{macrocode}
-\clist_map_inline:nn
+\cs_new:Npn \@@_name:n #1 { \tl_use:c { c_@@_name_ #1 _tl } }
+\cs_new:Npn \@@_info:n #1 { \tl_use:c { l_@@_info_ #1 _tl } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_ulined_center_box:nn}
+% 带有下划线的水平盒子。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \item 内容,可带有格式
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_ulined_center_box:nn #1#2
{
- { pdf_creator } { LaTeX~ with~ njuthesis~ class },
+ \mode_leave_vertical:
+ \rule [ -0.5 ex ] { #1 } { 0.4 pt }
+ \skip_horizontal:n { -#1 }
+ \hbox_to_wd:nn {#1} { \hfil #2 \hfil }
}
- { \@@_define_name:nn #1 }
-\clist_map_inline:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_spread_box:nnn}
+% 分散对齐的水平盒子。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \item 格式
+% \item 内容,不可带有格式
+% \end{arguments}
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_map_inline:nn { xn }
+\cs_new_protected:Npn \@@_spread_box:nnn #1#2#3
{
- { keywords } { 关键词: } { Keywords: },
+ \mode_leave_vertical:
+ \hbox_to_wd:nn {#1}
+ { #2 \tl_map_inline:xn {#3} { ##1 \hfil } \unskip }
}
- { \@@_define_name:nnn #1 }
% \end{macrocode}
+% \end{macro}
%
-% \subsection{模板选项}
-% \changes{v0.11}{2021/11/15}{进行了效率优化。}
+% \begin{macro}{\@@_multiline_box:nnnn}
+% 多行固定长度的下划线内容。
+% \begin{arguments}
+% \item 用于循环的 |int| 型变量
+% \item 内容,|clist| 型变量
+% \item 行数
+% \item 宽度,|dim| 型变量
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_multiline_box:nnnn #1#2#3#4
+ {
+ \int_set:Nn #1 { 1 }
+ \int_do_until:nn { #1 > #3 }
+ {
+ \@@_ulined_center_box:nn { #4 }
+ { \clist_item:Nn #2 { #1 } } \\
+ \int_incr:N #1
+ }
+ }
+% \end{macrocode}
+% \end{macro}
%
-% \begin{variable}{\g_@@_info_degree_int,\g_@@_info_type_int,
-% \g_@@_info_diploma_tl}
-% 用于存储学位名称的变量,注意宏的命名,l代表局部变量,g代表全局变量
+% \begin{macro}{\@@_put_inempty_seg:nnn}
+% 将固定长度的非空字符串插入 |clist|。
+% \begin{arguments}
+% \item 原始字符串
+% \item 起始位置
+% \item 长度
+% \end{arguments}
% \begin{macrocode}
-\int_new:N \g_@@_info_degree_int
-\int_new:N \g_@@_info_type_int
-\tl_new:N \g_@@_info_diploma_tl
+\cs_new_protected:Npn \@@_put_inempty_seg:nnn #1#2#3
+ {
+ \tl_set:Nx \l_@@_tmp_tl { \tl_range:Nnn { #1 } { #2 } { #2 + #3 - 1 } }
+ \tl_if_empty:NF \l_@@_tmp_tl { \clist_put_right:NV \l_@@_tmp_clist { \l_@@_tmp_tl } }
+ }
% \end{macrocode}
-% \end{variable}
+% \end{macro}
%
-% \begin{variable}{\g_@@_latin_fontset_tl,\g_@@_cjk_fontset_tl}
-% 用于存储所使用字体名称的全局变量
+% \begin{macro}{\@@_uline:n}
+% 指定宽度的下划线。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \end{arguments}
% \begin{macrocode}
-\tl_new:N \g_@@_latin_fontset_tl
-\tl_new:N \g_@@_cjk_fontset_tl
+\cs_new_protected:Npn \@@_uline:n #1
+ {
+ \mode_leave_vertical:
+ \rule [ -0.5 ex ] { #1 } { 0.4 pt }
+ \skip_horizontal:n { -#1 }
+ }
% \end{macrocode}
-% \end{variable}
+% \end{macro}
+%
+% \begin{macro}{\@@_uuline:n}
+% 指定宽度的双层下划线。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_uuline:n #1
+ {
+ \mode_leave_vertical:
+ \rule [ -0.5 ex ] { #1 } { 0.4 pt }
+ \skip_horizontal:n { -#1 }
+ \rule [ -0.6 ex ] { #1 } { 0.4 pt }
+ \skip_horizontal:n { -#1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_get_text_width:Nn,\@@_get_text_width:NV}
+% 获取文本宽度。
+% \begin{arguments}
+% \item 存储宽度的 |dim| 型变量
+% \item 文本
+% \end{arguments}
+% 将内容放入 \tn{hbox} 后读取其宽度,存入 |dim| 型变量。
+% \begin{macrocode}
+\cs_new:Npn \@@_get_text_width:Nn #1#2
+ {
+ \hbox_set:Nn \l_@@_tmp_box {#2}
+ \dim_set:Nn #1 { \box_wd:N \l_@@_tmp_box }
+ }
+\cs_generate_variant:Nn \@@_get_text_width:Nn { NV }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_full_uline:Nn,\@@_full_uline:NV}
+% 横跨整页的下划线。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \item 文本
+% \end{arguments}
+% 先使用 \cs{@@_get_text_width:Nn} 获取文本内容宽度,该宽度存储在调用的 |dim| 型变量中。随后输出文本内容。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_full_uline:Nn #1#2
+ {
+ \@@_get_text_width:Nn #1 { #2 }
+ \dim_set:Nn #1 { \textwidth - #1 } #2
+ }
+\cs_generate_variant:Nn \@@_full_uline:Nn { NV }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_uline_entry:nnnn}
+% 生成占整页宽度的下划线条目。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \item 文本
+% \item 文本
+% \item 分隔符
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_uline_entry:nnnn #1#2#3#4
+ {
+ \@@_full_uline:NV #1 { \@@_name:n { #2 } #4 }
+ \@@_ulined_center_box:nn { #1 } { \@@_info:n { #3 } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_uline_bientry:nnnn}
+% 生成占半页宽度的下划线条目。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \item 文本
+% \item 文本
+% \item 分隔符
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_uline_bientry:nnnn #1#2#3#4
+ {
+ \@@_full_uline:NV #1 { \@@_name:n { #2 } #4 }
+ \dim_sub:Nn #1 { \textwidth / 2 }
+ \@@_ulined_center_box:nn { #1 } { \@@_info:n { #3 } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{模板选项}
+% \changes{v0.11}{2021/11/15}{进行了效率优化。}
%
% 学位信息的设置
% \begin{macrocode}
\keys_define:nn { nju }
-{
+ {
% \end{macrocode}
%
% \begin{macro}{degree}
% 学位类型。
% \begin{macrocode}
- degree .choices:nn =
- { ug, mg, mf, phd }
- { \int_set_eq:NN \g_@@_info_degree_int \l_keys_choice_int },
- degree .initial:n = ug,
+ degree .choices:nn = { ug, mg, mf, phd }
+ { \int_set_eq:NN \l_@@_info_degree_int \l_keys_choice_int
+ \tl_set:Nn \l_@@_info_degree_tl
+ { \clist_item:Nn \c_@@_name_degree_clist { \l_@@_info_degree_int } }
+% \end{macrocode}
+% 进行学位的判断。
+% \begin{macrocode}
+ \int_compare:nTF { \l_@@_info_degree_int == 1 }
+ { \tl_set:Nn \l_@@_info_diploma_tl { ug } }
+ { \tl_set:Nn \l_@@_info_diploma_tl { g } } },
+ degree .initial:n = ug,
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{type}
-% 论文类型。
+% 论文类型。\cs{l_keys_choice_int} 需要被展开以获取正确的序号。
% \begin{macrocode}
- type .choices:nn =
- { thesis, design }
- { \int_set_eq:NN \g_@@_info_type_int \l_keys_choice_int },
- type .initial:n = thesis,
+ type .choices:nn = { thesis, design }
+ { \int_set_eq:NN \l_@@_info_type_int \l_keys_choice_int
+ \tl_set:Nn \l_@@_info_type_tl
+ { \clist_item:Nn \c_@@_name_type_clist { \l_@@_info_type_int } }
+ \tl_put_left:Nn \l_@@_info_type_tl
+ { \tl_use:c { c_@@_name_ \l_@@_info_diploma_tl _tl } } },
+ type .initial:n = thesis,
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{nlcover}
% 是否需要国家图书馆封面的设置。
% \begin{macrocode}
- nlcover .bool_set:N = \g_@@_nlcover_bool,
- nlcover .initial:n = false,
+ nlcover .bool_set:N = \g_@@_nlcover_bool,
+ nlcover .initial:n = false,
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{customlatinfont,customchinesefont}
+% \begin{macro}{latin-font,cjk-font}
+% \changes{v0.13}{2021/12/12}{简化字体选项名称。}
% 定义字体选项
% \begin{macrocode}
- customlatinfont .choices:nn =
- { gyre, macos, windows, none }
- { \tl_set_eq:NN \g_@@_latin_fontset_tl \l_keys_choice_tl },
- customchinesefont .choices:nn =
- { fandol, founder, macos, noto, windows, none }
- { \tl_set_eq:NN \g_@@_cjk_fontset_tl \l_keys_choice_tl },
-}
+ latin-font .choices:nn =
+ { gyre, mac, win, none }
+ { \tl_set_eq:NN \g_@@_latin_font_tl \l_keys_choice_tl },
+ cjk-font .choices:nn =
+ { fandol, founder, mac, noto, win, none }
+ { \tl_set_eq:NN \g_@@_cjk_font_tl \l_keys_choice_tl },
+ }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\ProcessKeysOptions}
-% 在定义完全部设置以后从tex文件导言区输入参数。
+% 在定义完全部设置以后从导言区输入参数。
% \begin{macrocode}
\ProcessKeysOptions { nju }
% \end{macrocode}
-% \end{macro}
%
-% 进行学位的判断。
+%
+% \subsection{配置常量}
+% TODO: 分离为单独文件
+% 通用默认名称。注意空格是忽略掉的。
% \begin{macrocode}
-\int_compare:nTF { \g_@@_info_degree_int == 1 }
- { \tl_set:Nn \g_@@_info_diploma_tl { ug } }
- { \tl_set:Nn \g_@@_info_diploma_tl { g } }
+\clist_map_inline:nn
+ {
+ { id } { 学号 },
+ { orig_decl } { 学位论文原创性声明 },
+ { pdf_creator } { LaTeX~ with~ njuthesis~ class },
+ { supv_ii } { 第二导师 },
+ { supv_ttl } { 职称 }
+ }
+ { \@@_define_name:nn #1 }
% \end{macrocode}
-%
%
+% 定义同时使用到中英文名称的常量。
+% \begin{macrocode}
+\clist_map_inline:nn
+ {
+ { abstract } { 摘要 } { ABSTRACT },
+ { appendix } { 附录 } { appendix },
+ { dept } { 院系 } { DEPARTMENT },
+ { figure } { 图 } { figure },
+ { keywords } { 关键词: } { Keywords:~ },
+ { lang } { 中文 } { 英文 },
+ { nju } { 南京大学 } { Nanjing~ University },
+ { table } { 表 } { table }
+ }
+ { \@@_define_name:nnn #1 }
+% \end{macrocode}
+%
+% 针对学位的特定名称。需要放在 \cs{ProcessKeysOptions} 导入设置选项后,以使用学位信息。
+% \begin{macrocode}
+\int_compare:nTF { \l_@@_info_degree_int == 1 }
+ {
+% \end{macrocode}
+% 本科默认名称。
+% \begin{macrocode}
+ \clist_map_inline:nn
+ {
+ { author_full } { 本科生姓名 },
+ { grade } { 年级 },
+ { sm_date } { 提交日期 },
+ { supv } { 导师 },
+ { title } { 题目 },
+ { type } { 本科生毕业论文(设计、作品)},
+ { ug } { 本科 }
+ }
+ { \@@_define_name:nn #1 }
+ \clist_map_inline:nn
+ {
+ { author } { 学生姓名 } { UNDERGRADUATE },
+ { major } { 专业 } { SPECIALIZATION },
+ { supv_full } { 指导教师(姓名、职称) } { MENTOR }
+ }
+ { \@@_define_name:nnn #1 }
+ }
+% \end{macrocode}
+% 研究生默认名称。
+% \begin{macrocode}
+ {
+ \clist_map_inline:nn
+ {
+ { abstract_r } { 摘要首页用纸 },
+ { author_r } { 生姓名 },
+ { chairman } { 答辩委员会主席: },
+ { clc } { 分类号 },
+ { confer } { 学位授予单位和日期 },
+ { df_date } { 论文答辩日期 },
+ { degree } { 申请学位级别 },
+ { degree_l } { (申请 },
+ { degree_r } { 学位) },
+ { field } { 研究方向 },
+ { g } { 研究生 },
+ { grade } { 级 },
+ { major_s } { 专业 },
+ { major_nl } { 专业名称 },
+ { orig_sign } { 研究生签名: },
+ { orig_date } { 日期: },
+ { reviewer } { 评阅人: },
+ { seclv } { 密级 },
+ { sign } { (签字) },
+ { sm_date } { 论文提交日期 },
+ { supv } { 导师 },
+ { supv_r } { (姓名、职称) },
+ { supv_info } { 指导教师姓名、职务、
+ 职称、学位、单位名称及地址 },
+ { title } { 论文题目 },
+ { title_nl } { (题名和副题名) },
+ { title_s } { 题目 },
+ { udc } { U D C }
+ }
+ { \@@_define_name:nn #1 }
+ \clist_map_inline:nn
+ {
+ { author } { 作者姓名 } { POSTGRADUATE },
+ { major } { 专业方向 } { SPECIALIZATION },
+ { supv_full } { 指导教师 } { MENTOR }
+ }
+ { \@@_define_name:nnn #1 }
+% \end{macrocode}
+% \begin{variable}{\c_@@_cover_en_text_tl}
+% 英文封面字样。
+% \begin{macrocode}
+ \tl_const:Nn \c_@@_cover_en_text_tl
+ {
+ A~ dissertation~ submitted~ to \\
+ the~ graduate~ school~ of~ Nanjing~ University \\
+ in~ partial~ fulfilment~ of~ the~ requirements~ for~ the~ degree~ of
+ }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_orig_decl_text_tl}
+% 学位论文原创性声明。
+% \begin{macrocode}
+\tl_const:Nn \c_@@_orig_decl_text_tl
+ {
+ 本人郑重声明,所提交的学位论文是本人在导师指导下独立进行科学研究工作
+ 所取得的成果。除本论文中已经注明引用的内容外,本论文不包含其他个人或
+ 集体已经发表或撰写过的研究成果,也不包含为获得南京大学或其他教育机构
+ 的学位证书而使用过的材料。对本文的研究做出重要贡献的个人和集体,均已
+ 在论文的致谢部分明确标明。本人郑重申明愿承担本声明的法律责任。
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_theorem_type_clist}
+% 默认定理类型。
+% \begin{macrocode}
+\clist_const:Nn \c_@@_theorem_type_clist
+ { axiom, corollary, definition, example, lemma, theorem }
+% \end{macrocode}
+% \end{variable}
+%
+% 默认定理头名称。
+% \begin{macrocode}
+\clist_map_inline:nn
+ {
+ { axiom } { 公理 } { Axiom },
+ { corollary } { 推论 } { Corollary },
+ { definition } { 定义 } { Definition },
+ { example } { 例 } { Example },
+ { lemma } { 引理 } { Lemma },
+ { proof } { 证明 } { Proof },
+ { theorem } { 定理 } { Theorem }
+ }
+ { \@@_define_name:nnn #1 }
+% \end{macrocode}
%
% \subsection{个人信息}
% 输入个人信息的区域。
% \begin{macrocode}
-\keys_define:nn { nju }
-{
- info.meta:nn = { nju / info } { #1 }
-}
+\keys_define:nn { nju } { info.meta:nn = { nju / info } { #1 } }
% \end{macrocode}
%
% \begin{macrocode}
\keys_define:nn { nju / info }
-{
+ {
% \end{macrocode}
%
-% \begin{macro}{info/titlea,info/titleb,info/titlec,info/title*}
+% \begin{macro}{info/title,info/title*}
% 题目。以下标注星号(*)的为对应的英文字段。
% \begin{macrocode}
- titlea .tl_set:N = \l_@@_info_title_a_tl,
- titleb .tl_set:N = \l_@@_info_title_b_tl,
- titlec .tl_set:N = \l_@@_info_title_c_tl,
- title* .tl_set:N = \l_@@_info_title_en_tl,
+ title .tl_set:N = \l_@@_info_title_tl,
+ title .initial:n = { 空 },
+ title* .tl_set:N = \l_@@_info_title_en_tl,
% \end{macrocode}
% \end{macro}
%
@@ -1321,78 +1878,79 @@ through XeTeX.
% \changes{v0.11}{2021/10/01}{修改了添加关键词的方式。}
% 关键词列表。
% \begin{macrocode}
-keywords .clist_set:N = \l_@@_info_keywords_clist,
-keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
+ keywords .clist_set:N = \l_@@_info_keywords_clist,
+ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/grade,info/student-id,info/author,info/author*}
% 年级、学号、姓名。
% \begin{macrocode}
- grade .tl_set:N = \l_@@_info_grade_tl,
- student-id .tl_set:N = \l_@@_info_id_tl,
- author .tl_set:N = \l_@@_info_author_tl,
- author* .tl_set:N = \l_@@_info_author_en_tl,
+ grade .tl_set:N = \l_@@_info_grade_tl,
+ student-id .tl_set:N = \l_@@_info_id_tl,
+ author .tl_set:N = \l_@@_info_author_tl,
+ author* .tl_set:N = \l_@@_info_author_en_tl,
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/department,info/department*,info/major,info/major*,info/field,info/field*}
% 院系、专业、方向。
% \begin{macrocode}
- department .tl_set:N = \l_@@_info_dept_tl,
- department* .tl_set:N = \l_@@_info_dept_en_tl,
- major .tl_set:N = \l_@@_major_tl,
- major* .tl_set:N = \l_@@_major_en_tl,
- field .tl_set:N = \l_@@_field_tl,
- field* .tl_set:N = \l_@@_field_en_tl,
+ department .tl_set:N = \l_@@_info_dept_tl,
+ department* .tl_set:N = \l_@@_info_dept_en_tl,
+ major .tl_set:N = \l_@@_info_major_tl,
+ major* .tl_set:N = \l_@@_info_major_en_tl,
+ field .tl_set:N = \l_@@_info_field_tl,
+ field* .tl_set:N = \l_@@_info_field_en_tl,
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{info/supervisora,info/supervisora*,info/supervisora-title,info/supervisora-title*}
+% \begin{macro}{info/supervisor,info/supervisor*,info/supervisor-title,info/supervisor-title*}
+% \changes{v0.13}{2021/12/11}{修改了导师键值对的变量名称。}
% 导师
% \begin{macrocode}
- supervisora .tl_set:N = \l_@@_info_supv_a_tl,
- supervisora* .tl_set:N = \l_@@_info_supv_a_en_tl,
- supervisora-title .tl_set:N = \l_@@_info_supv_a_title_tl,
- supervisora-title*.tl_set:N = \l_@@_info_supv_a_title_en_tl,
+ supervisor .tl_set:N = \l_@@_info_supv_tl,
+ supervisor* .tl_set:N = \l_@@_info_supv_en_tl,
+ supervisor-title .tl_set:N = \l_@@_info_supv_ttl_tl,
+ supervisor-title* .tl_set:N = \l_@@_info_supv_ttl_en_tl,
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{info/supervisorb,info/supervisorb*,info/supervisorb-title,info/supervisorb-title*}
+% \begin{macro}{info/supervisor-ii,info/supervisor-ii*,info/supervisor-ii-title,info/supervisor-ii-title*}
% 第二导师
% \begin{macrocode}
- supervisorb .tl_set:N = \l_@@_info_supv_b_tl,
- supervisorb* .tl_set:N = \l_@@_info_supv_b_en_tl,
- supervisorb-title .tl_set:N = \l_@@_info_supv_b_title_tl,
- supervisorb-title*.tl_set:N = \l_@@_info_supv_b_title_en_tl,
+ supervisor-ii .tl_set:N = \l_@@_info_supv_ii_tl,
+ supervisor-ii* .tl_set:N = \l_@@_info_supv_ii_en_tl,
+ supervisor-ii-title .tl_set:N = \l_@@_info_supv_ii_ttl_tl,
+ supervisor-ii-title*.tl_set:N = \l_@@_info_supv_ii_ttl_en_tl,
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/submit-date,info/submit-date*}
% 提交日期
% \begin{macrocode}
- submit-date .tl_set:N = \l_@@_submit_date_tl,
- submit-date* .tl_set:N = \l_@@_submit_date_en_tl,
+ submit-date .tl_set:N = \l_@@_info_sm_date_tl,
+ submit-date* .tl_set:N = \l_@@_info_sm_date_en_tl,
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/defend-date,info/chairman,info/reviewer}
% 答辩信息。
% \begin{macrocode}
- defend-date .tl_set:N = \l_@@_defend_date_tl,
- chairman .tl_set:N = \l_@@_info_chairman_tl,
- reviewer .clist_set:N = \l_@@_info_reviewer_clist,
+ defend-date .tl_set:N = \l_@@_info_df_date_tl,
+ chairman .tl_set:N = \l_@@_info_chairman_tl,
+ reviewer .clist_set:N = \l_@@_info_reviewer_clist,
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/clc,info/secret-level,info/udc,info/supervisor-contact}
% 国家图书馆封面相关信息。
% \begin{macrocode}
- clc .tl_set:N = \l_@@_info_clc_tl,
- secret-level .tl_set:N = \l_@@_info_seclv_tl,
- udc .tl_set:N = \l_@@_info_udc_tl,
- supervisor-contact.tl_set:N = \l_@@_info_supv_cont_tl,
-}
+ clc .tl_set:N = \l_@@_info_clc_tl,
+ secret-level .tl_set:N = \l_@@_info_seclv_tl,
+ udc .tl_set:N = \l_@@_info_udc_tl,
+ supervisor-contact .tl_set:N = \l_@@_info_supv_cont_tl,
+ }
% \end{macrocode}
% \end{macro}
%
@@ -1401,119 +1959,158 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
% \changes{v0.11}{2021/10/01}{将个人信息变量名改为小写字母加连字符的形式。}
% 定义用于设置个人信息的命令
% \begin{macrocode}
-\NewDocumentCommand \njusetup { m }
-{ \keys_set:nn { nju } { #1 } }
+\NewDocumentCommand \njusetup { m } { \keys_set:nn { nju } { #1 } }
% \end{macrocode}
% \end{macro}
%
+% 拼合双导师的姓名和职称。
+% \begin{macrocode}
+\bool_set:Nn \l_@@_second_supv_bool
+ { ! \tl_if_empty_p:N \l_@@_info_supv_ii_tl }
+\tl_set:Nn \l_@@_info_supv_full_tl
+ {
+ \l_@@_info_supv_tl \@@_hskip:
+ \l_@@_info_supv_ttl_tl
+ \bool_if:NT \l_@@_second_supv_bool
+ {
+ \@@_quad: \l_@@_info_supv_ii_tl
+ \@@_hskip: \l_@@_info_supv_ii_ttl_tl
+ }
+ }
+\tl_set:Nn \l_@@_info_supv_full_en_tl
+ {
+ \l_@@_info_supv_ttl_en_tl \@@_hskip:
+ \l_@@_info_supv_en_tl
+ \bool_if:NT \l_@@_second_supv_bool
+ {
+ \@@_quad: \l_@@_info_supv_ii_ttl_en_tl
+ \@@_hskip: \l_@@_info_supv_ii_en_tl
+ }
+ }
+% \end{macrocode}
+%
%
% \subsection{载入宏包}
-%
-% 使用\pkg{ctexbook}作为基础文档类。
+%
+% \changes{v0.12}{2021/12/07}{重新组织宏包载入顺序。}
+% 将选项传入 \cls{ctexbook} 文档类。
% \begin{macrocode}
-\LoadClass[
- a4paper,
- twoside,
- UTF8,
- scheme=chinese,
+\PassOptionsToClass
+ {
+ a4paper,
+ twoside,
+ UTF8,
+ scheme=chinese,
% \end{macrocode}
-% 关于行距,\hologo{LaTeX}默认1.2行距,word默认行距是1.3,要求1.5倍word行距,故
+% 关于行距,\hologo{LaTeX} 默认1.2行距,word 默认行距是1.3,要求1.5倍 word 行距,故
% $1.5\times\frac{1.3}{1.2} = 1.625$
% \begin{macrocode}
- linespread=1.625,
+ linespread=1.625,
% \end{macrocode}
-% 默认不载入任何字体,供模板自行设置
+% 默认不载入任何字体,供本模板自行设置。
% \begin{macrocode}
- fontset=none,
- zihao=-4
- ]{ctexbook}[2018/04/01]
+ fontset=none,
% \end{macrocode}
-%
-% 载入各种宏包。
-% \pkg{emptypage}用于清除空白页的页码。
+% 正文字体设置为小四号。
% \begin{macrocode}
-\RequirePackage
-{
- geometry,
- caption,
- floatrow,
- setspace,
- lastpage,
- emptypage,
- fancyhdr,
-}
-\RequirePackage[titles]{tocloft}
-\RequirePackage[hyphens]{url} % generate better linebreaks in the url
+ zihao=-4
+ }
+ { ctexbook }
% \end{macrocode}
%
-%
-% 用于特定学科的包。
+% 传入各宏包选项。
% \begin{macrocode}
-\RequirePackage{siunitx} % 用于书写单位符号
-\RequirePackage[version=4]{mhchem} % 用于绘制分子式
+\clist_map_inline:nn
+ {
+ { no-math } { fontspec },
+ { perpage } { footmisc },
+ { amsmath, thmmarks } { ntheorem },
+ { hyphens } { url },
+ { warnings-off={ mathtools-colon, mathtools-overbracket } }
+ { unicode-math },
+ { capitalise, nameinlink, noabbrev }
+ { cleveref }
+ }
+ { \PassOptionsToPackage #1 }
% \end{macrocode}
%
-% 用于生成可以被插入书签的LaTeX logo,TODO: 使用hologo创建|latex{}|命令
+% 使用\pkg{ctexbook}作为基础文档类。
% \begin{macrocode}
-\RequirePackage{hologo}
+\LoadClass { ctexbook } [ 2018/04/01 ]
% \end{macrocode}
%
+% 载入各种宏包。
% \begin{macrocode}
-% Required to prevent page break right after a sectioning command
-% \RequirePackage{needspace}
-% \RequirePackage{xspace} % Better print trailing whitespace
+\RequirePackage
+ {
+ geometry,
+ caption,
+ setspace,
+ fancyhdr,
+ hologo,
% \end{macrocode}
-%
-% \begin{macro}{\njuline}
-% 针对编译引擎,使用不同的宏包构建可以对中文正常换行的下划线命令。\pkg{lua-ul}中需要在结尾使用\tn{null}保护尾部空白。
+% \pkg{url} 用于生成链接文本。
% \begin{macrocode}
-\sys_if_engine_xetex:T
-{
- \RequirePackage{xeCJKfntef,microtype}
- \newcommand{\njuline}[1]{\CJKunderline{#1}}
-}
-\sys_if_engine_luatex:T
-{
- \RequirePackage{lua-ul,dashundergaps}
- \newcommand{\njuline}[1]{\underLine{#1}\null}
-}
+ url,
% \end{macrocode}
-% \end{macro}
-%
-% 数学,\pkg{amsmath}必须在\pkg{unicode-math}前加载。
-% \pkg{unicode-math}指定了\hologo{XeTeX}和\hologo{LuaTeX}下所使用的数学字体。
-% 用于配置数学环境的\pkg{mathtools}会与\pkg{unicode-math}发生冲突,此处手动消除其警告。
+% \pkg{emptypage} 用于清除空白页的页码。
% \begin{macrocode}
-\RequirePackage{amsmath,amsthm,mathtools,thmtools}
-\RequirePackage[
- warnings-off={
- mathtools-colon,
- mathtools-overbracket}
- ]{unicode-math}
+ emptypage,
% \end{macrocode}
-%
-% 配置图片、表格、代码、列表环境
+% 南京大学视觉形象化标准宏包 \pkg{njuvisual} 用于绘制学校 logo。
% \begin{macrocode}
-\RequirePackage{graphicx,subcaption,wrapfig,tikz}
-\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
-\RequirePackage{booktabs,multirow,multicol,listings,enumitem}
+ njuvisual,
% \end{macrocode}
-%
-% 必须以该顺序加载以下两个关于引用的包。
+% \changes{v0.13}{2021/12/13}{使用 \pkg{ntheorem} 创建定理环境,删除 \pkg{amsthm} 和 \pkg{thmtools}。}
+% 数学,\pkg{amsmath} 必须在 \pkg{unicode-math} 前加载。
+% \pkg{unicode-math} 指定了 \hologo{XeTeX} 和 \hologo{LuaTeX} 下所使用的数学字体。
+% 用于配置数学环境的 \pkg{mathtools} 会与 \pkg{unicode-math} 发生冲突,此处手动消除其警告。
+% \begin{macrocode}
+ amsmath,
+ mathtools,
+ unicode-math,
+ ntheorem,
+% \end{macrocode}
+% 图片与表格。
+% \begin{macrocode}
+ graphicx,
+ wrapfig,
+ booktabs,
+ multirow,
+% \end{macrocode}
+% 列表环境
% \begin{macrocode}
-\RequirePackage[hidelinks,bookmarksnumbered=true]{hyperref}
-\RequirePackage[capitalise,nameinlink,noabbrev]{cleveref}
+ listings,
+ enumitem,
+% \end{macrocode}
+% 按以下顺序加载两个关于引用的包。
+% \pkg{hyperref} 覆写了大量命令,因此需要在其他包最后载入。
+% 仅有 \pkg{cleveref} 需要在 \pkg{hyperref} 后载入,否则会报错。
+% \begin{macrocode}
+ hyperref,
+ cleveref
+ }
% \end{macrocode}
%
-% 载入南京大学识别视觉系统。
+% \changes{v0.13}{2021/12/13}{删除会与 \pkg{ntheorem} 冲突的 \pkg{microtype}。}
+% \begin{macro}{\njuline}
+% 针对编译引擎,使用不同的宏包构建可以对中文正常换行的下划线命令。
% \begin{macrocode}
-\RequirePackage{njuvisual}
+\sys_if_engine_xetex:T
+ {
+ \RequirePackage{xeCJKfntef}
+ \NewDocumentCommand \njuline { m } { \CJKunderline{#1} }
+ }
% \end{macrocode}
-%
-% 生成用于测试的大段填充文字。
+% \pkg{lua-ul} 中需要在结尾使用 \tn{null} 保护尾部空白。
% \begin{macrocode}
-\RequirePackage{blindtext,zhlipsum}
+\sys_if_engine_luatex:T
+ {
+ \RequirePackage{lua-ul}
+ \NewDocumentCommand \njuline { m } { \underLine{#1} \null }
+ }
% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\@@_check_package:nnn}
% 检查过时宏包。
@@ -1521,9 +2118,9 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
\msg_new:nnn { njuthesis } { package-too-old }
{
Package~ "#1"~ is~ too~ old. \\
- The~ njuthesis~ class~ only~ supports~ "#1"~ with~ \\
- a~ version higher~ than~ v#2. \\\\
- Please~ update~ an~ up-to-date~ version~ of~ it~ \\
+ The~ njuthesis~ class~ only~ supports~ "#1"~ with~
+ a~ version higher~ than~ v#2.\\
+ Please~ update~ an~ up-to-date~ version~ of~ it~
using~ your TeX~ package~ manager~ or~ from~ CTAN.
}
\cs_new_protected:Npn \@@_check_package:nnn #1#2#3
@@ -1534,33 +2131,28 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
% \end{macrocode}
% \end{macro}
%
-% 检查绘制下划线所需的 \pkg{luatexja} 包版本。该宏包在2021-09-18的解决了下划线中断问题,然而在2021-10-24的更新才提供了正确的内嵌日期。
+% 检查绘制下划线所需的 \pkg{luatexja} 包版本。该宏包在2021-09-18的更新解决了下划线中断问题,然而在2021-10-24的更新才提供了正确的内嵌日期。
% \begin{macrocode}
\sys_if_engine_luatex:T
{ \@@_check_package:nnn { luatexja } { 2021/10/24 } { 20211024.0 } }
% \end{macrocode}
%
+%
% \subsection{字体设置}
%
-% \pkg{fontspec}已在C\hologo{TeX}套件中包含,无需另外载入。
+% \pkg{fontspec} 已在 C\hologo{TeX} 套件中包含,无需另外载入。
%
% \subsubsection{操作系统检测}
%
-% \begin{variable}{\g_@@_load_system_fontset_bool}
-% 定义用于判断是否需要载入系统预装字体的变量。
-% \begin{macrocode}
-\bool_new:N \g_@@_load_system_fontset_bool
-% \end{macrocode}
-% \end{variable}
% 判断用户是否自定义了中英文字体。如果其中任意一种未被定义,
% 则使用系统预装字体覆盖字体选项。
% \begin{macrocode}
-\tl_if_empty:NTF \g_@@_latin_fontset_tl
- { \bool_gset_true:N \g_@@_load_system_fontset_bool }
-{
- \tl_if_empty:NT \g_@@_cjk_fontset_tl
- { \bool_gset_true:N \g_@@_load_system_fontset_bool }
-}
+\tl_if_empty:NTF \g_@@_latin_font_tl
+ { \bool_gset_true:N \g_@@_load_sys_font_bool }
+ {
+ \tl_if_empty:NT \g_@@_cjk_font_tl
+ { \bool_gset_true:N \g_@@_load_sys_font_bool }
+ }
% \end{macrocode}
%
% 进行系统检测。
@@ -1568,202 +2160,186 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
% 检测 macOS 的命令由\pkg{ctex}提供,
% 这两种情况外的系统被判断为 Linux,一律使用自由字体。
% \begin{macrocode}
-\bool_if:NT \g_@@_load_system_fontset_bool
-{
- \sys_if_platform_windows:TF
- {
- \tl_set:Nn \g_@@_latin_fontset_tl { windows }
- \tl_set:Nn \g_@@_cjk_fontset_tl { windows }
- }
- {
- \ctex_if_platform_macos:TF
- {
- \tl_set:Nn \g_@@_latin_fontset_tl { macos }
- \tl_set:Nn \g_@@_cjk_fontset_tl { macos }
- }
- {
- \tl_set:Nn \g_@@_latin_fontset_tl { gyre }
- \tl_set:Nn \g_@@_cjk_fontset_tl { fandol }
- }
+\bool_if:NT \g_@@_load_sys_font_bool
+ {
+ \sys_if_platform_windows:TF
+ { \tl_set:Nn \g_@@_latin_font_tl { win }
+ \tl_set:Nn \g_@@_cjk_font_tl { win } }
+ { \ctex_if_platform_macos:TF
+ { \tl_set:Nn \g_@@_latin_font_tl { mac }
+ \tl_set:Nn \g_@@_cjk_font_tl { mac } }
+ { \tl_set:Nn \g_@@_latin_font_tl { gyre }
+ \tl_set:Nn \g_@@_cjk_font_tl { fandol } } }
}
-}
% \end{macrocode}
%
+%
% \subsubsection{定义英文字库}
%
% 接下来逐个定义所需要使用的字库。
%
-% \begin{macro}{\@@_load_latin_font_windows:}
+% \begin{macro}{\@@_load_latin_font_win:}
% Windows 西文字体
% \begin{macrocode}
-\cs_new_protected:Npn \@@_load_latin_font_windows:
-{
- \setmainfont{Times~New~Roman}
- \setsansfont{Arial}
- \setmonofont{Courier~New}[Scale=MatchLowercase]
-}
+\cs_new_protected:Npn \@@_load_latin_font_win:
+ {
+ \setmainfont{Times~New~Roman}
+ \setsansfont{Arial}
+ \setmonofont{Courier~New}[Scale=MatchLowercase]
+ }
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\@@_load_latin_font_macos:}
+% \begin{macro}{\@@_load_latin_font_mac:}
% macOS 西文字体。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_load_latin_font_macos:
-{
- \setmainfont{Times~New~Roman}
- \setsansfont{Arial}
- \setmonofont{Menlo}[Scale=MatchLowercase]
-}
+\cs_new_protected:Npn \@@_load_latin_font_mac:
+ {
+ \setmainfont{Times~New~Roman}
+ \setsansfont{Arial}
+ \setmonofont{Menlo}[Scale=MatchLowercase]
+ }
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\@@_load_latin_font_gyre:}
% 开源的 gyre 西文字体。
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_latin_font_gyre:
-{
- \setmainfont{texgyretermes}[
- Extension=.otf,
- UprightFont=*-regular,
- BoldFont=*-bold,
- ItalicFont=*-italic,
- BoldItalicFont=*-bolditalic]
- \setsansfont{texgyreheros}[
- Extension=.otf,
- UprightFont=*-regular,
- BoldFont=*-bold,
- ItalicFont=*-italic,
- BoldItalicFont=*-bolditalic]
- \setmonofont{texgyrecursor}[
- Extension=.otf,
- UprightFont=*-regular,
- BoldFont=*-bold,
- ItalicFont=*-italic,
- BoldItalicFont=*-bolditalic,
- Scale=MatchLowercase,
- Ligatures=CommonOff]
-}
+ {
+ \setmainfont{texgyretermes}[
+ Extension=.otf,
+ UprightFont=*-regular,
+ BoldFont=*-bold,
+ ItalicFont=*-italic,
+ BoldItalicFont=*-bolditalic]
+ \setsansfont{texgyreheros}[
+ Extension=.otf,
+ UprightFont=*-regular,
+ BoldFont=*-bold,
+ ItalicFont=*-italic,
+ BoldItalicFont=*-bolditalic]
+ \setmonofont{texgyrecursor}[
+ Extension=.otf,
+ UprightFont=*-regular,
+ BoldFont=*-bold,
+ ItalicFont=*-italic,
+ BoldItalicFont=*-bolditalic,
+ Scale=MatchLowercase,
+ Ligatures=CommonOff]
+ }
% \end{macrocode}
% \end{macro}
%
% \subsubsection{定义中文字库}
%
-% \begin{macro}{\@@_load_cjk_font_windows:}
+% \begin{macro}{\@@_load_cjk_font_win:}
% Windows 中文字体。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_load_cjk_font_windows:
-{
- \setCJKmainfont{SimSun}[
- AutoFakeBold=2.17,
- ItalicFont=KaiTi]
- \setCJKsansfont{SimHei}
- \setCJKmonofont{FangSong}
- \setCJKfamilyfont{zhsong}{SimSun}[AutoFakeBold=2.17]
- \setCJKfamilyfont{zhhei}{SimHei}
- \setCJKfamilyfont{zhfs}{FangSong}
- \setCJKfamilyfont{zhkai}{KaiTi}[AutoFakeBold=2.17]
- % \setCJKfamilyfont{zhnewhei}{Microsoft~YaHei}[
- % BoldFont=Microsoft~YaHei~Bold]
-}
+\cs_new_protected:Npn \@@_load_cjk_font_win:
+ {
+ \setCJKmainfont{SimSun}[
+ AutoFakeBold=2.17,
+ ItalicFont=KaiTi]
+ \setCJKsansfont{SimHei}
+ \setCJKmonofont{FangSong}
+ \setCJKfamilyfont{zhsong}{SimSun}[AutoFakeBold=2.17]
+ \setCJKfamilyfont{zhhei}{SimHei}
+ \setCJKfamilyfont{zhfs}{FangSong}
+ \setCJKfamilyfont{zhkai}{KaiTi}[AutoFakeBold=2.17]
+ }
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\@@_load_cjk_font_macos:}
+% \begin{macro}{\@@_load_cjk_font_mac:}
% macOS 字体。
-% TODO: 参考CTeX手册第9节 LuaLATEX 下的中文支持方式解决 issue \#5 问题。
+% TODO: 修复 macOS 字体支持,实现开箱即用。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_load_cjk_font_macos:
-{
- % 移除 does not contain script "CJK" 警告
- \msg_redirect_name:nnn {fontspec} {no-script} {info}
- \setCJKmainfont{Songti~SC~Light}[
- BoldFont=Songti~SC~Bold,
- ItalicFont=Kaiti~SC,
- BoldItalicFont=Kaiti~SC~Bold]
- \setCJKsansfont{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
- \setCJKmonofont{STFangsong}
- \setCJKfamilyfont{zhsong}{Songti~SC~Light}[BoldFont=Songti~SC~Bold]
- \setCJKfamilyfont{zhhei}{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
- \setCJKfamilyfont{zhfs}{STFangsong}
- \setCJKfamilyfont{zhkai}{Kaiti~SC}[BoldFont=Kaiti~SC~Bold]
- \setCJKfamilyfont{zhnewhei}{PingFang~SC}
-}
+\cs_new_protected:Npn \@@_load_cjk_font_mac:
+ {
+ % 移除 does not contain script "CJK" 警告
+ \msg_redirect_name:nnn {fontspec} {no-script} {info}
+ \setCJKmainfont{Songti~SC~Light}[
+ BoldFont=Songti~SC~Bold,
+ ItalicFont=Kaiti~SC,
+ BoldItalicFont=Kaiti~SC~Bold]
+ \setCJKsansfont{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
+ \setCJKmonofont{STFangsong}
+ \setCJKfamilyfont{zhsong}{Songti~SC~Light}[BoldFont=Songti~SC~Bold]
+ \setCJKfamilyfont{zhhei}{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
+ \setCJKfamilyfont{zhfs}{STFangsong}
+ \setCJKfamilyfont{zhkai}{Kaiti~SC}[BoldFont=Kaiti~SC~Bold]
+ \setCJKfamilyfont{zhnewhei}{PingFang~SC}
+ }
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\@@_load_cjk_font_fandol:}
% Fandol 字体
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_fandol:
-{
- % 移除 does not contain script "CJK" 警告
- \msg_redirect_name:nnn {fontspec} {no-script} {info}
- \setCJKmainfont{FandolSong-Regular}[
- Extension=.otf,
- BoldFont=FandolSong-Bold,
- ItalicFont=FandolKai-Regular]
- \setCJKsansfont{FandolHei-Regular}[
- Extension=.otf,
- BoldFont=FandolHei-Bold]
- \setCJKmonofont{FandolFang-Regular}[Extension=.otf]
- \setCJKfamilyfont{zhsong}{FandolSong-Regular}[
- Extension=.otf,
- BoldFont=FandolSong-Bold]
- \setCJKfamilyfont{zhhei}{FandolHei-Regular}[
- Extension=.otf,
- BoldFont=FandolHei-Bold]
- \setCJKfamilyfont{zhfs}{FandolFang-Regular}[Extension=.otf]
- \setCJKfamilyfont{zhkai}{FandolKai-Regular}[
- Extension=.otf,
- AutoFakeBold=2.17]
-}
+ {
+ % 移除 does not contain script "CJK" 警告
+ \msg_redirect_name:nnn {fontspec} {no-script} {info}
+ \setCJKmainfont{FandolSong-Regular}[
+ Extension=.otf,
+ BoldFont=FandolSong-Bold,
+ ItalicFont=FandolKai-Regular]
+ \setCJKsansfont{FandolHei-Regular}[
+ Extension=.otf,
+ BoldFont=FandolHei-Bold]
+ \setCJKmonofont{FandolFang-Regular}[Extension=.otf]
+ \setCJKfamilyfont{zhsong}{FandolSong-Regular}[
+ Extension=.otf,
+ BoldFont=FandolSong-Bold]
+ \setCJKfamilyfont{zhhei}{FandolHei-Regular}[
+ Extension=.otf,
+ BoldFont=FandolHei-Bold]
+ \setCJKfamilyfont{zhfs}{FandolFang-Regular}[Extension=.otf]
+ \setCJKfamilyfont{zhkai}{FandolKai-Regular}[
+ Extension=.otf,
+ AutoFakeBold=2.17]
+ }
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_load_cjk_font_founder:}
% 方正字库(简繁扩展)
-% FZYouHK_508R \href{http://www.foundertype.com/index.php/FontInfo/index/id/244}{方正悠黑508R} 设计师非商免费,
-% FZYouHK_511M \href{http://www.foundertype.com/index.php/FontInfo/index/id/244}{方正悠黑511M} 设计师非商免费
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_founder:
-{
- \sys_if_engine_luatex:T
- {
- % 在 LuaTeX 中调整方正字体括号位置
- % XeTeX 暂无好的解决方法
- \defaultCJKfontfeatures{JFM={zh_CN/{quanjiao,fzpr}}}
- }
- \setCJKmainfont{FZSSK}[% 方正书宋
- Extension=.ttf,
- BoldFont=FZXBSK,% 方正小标宋
- ItalicFont=FZKTK]% 方正楷体
- \setCJKsansfont{FZXH1K}[% 方正细黑一
- Extension=.ttf,
- BoldFont=FZHTK]% FZHTK 方正黑体
- \setCJKmonofont{FZFSK}[Extension=.ttf]% 方正仿宋
- \setCJKfamilyfont{zhsong}
- {FZSSK}[
+ {
+ \sys_if_engine_luatex:T
+ {
+% \end{macrocode}
+% 在 LuaTeX 中调整方正字体括号位置
+% XeTeX 暂无好的解决方法
+% \begin{macrocode}
+ \defaultCJKfontfeatures{JFM={zh_CN/{quanjiao,fzpr}}}
+ }
+ \setCJKmainfont{FZSSK}[% 方正书宋
Extension=.ttf,
- BoldFont=FZXBSK]
- \setCJKfamilyfont{zhhei}
- {FZHTK}[
+ BoldFont=FZXBSK,% 方正小标宋
+ ItalicFont=FZKTK]% 方正楷体
+ \setCJKsansfont{FZXH1K}[% 方正细黑一
Extension=.ttf,
- AutoFakeBold=2.17]
- \setCJKfamilyfont{zhfs}
- {FZFSK}[Extension=.ttf]
- \setCJKfamilyfont{zhkai}
- {FZKTK}[Extension=.ttf]
- % \setCJKfamilyfont{zhnewhei}
- % {FZYouHK_508R}[% 方正悠黑508R
- % Extension=.ttf,
- % BoldFont=FZYouHK_511M]% 方正悠黑511M
- \defaultCJKfontfeatures{}
-}
+ BoldFont=FZHTK]% FZHTK 方正黑体
+ \setCJKmonofont{FZFSK}[Extension=.ttf]% 方正仿宋
+ \setCJKfamilyfont{zhsong}
+ {FZSSK}[
+ Extension=.ttf,
+ BoldFont=FZXBSK]
+ \setCJKfamilyfont{zhhei}
+ {FZHTK}[
+ Extension=.ttf,
+ AutoFakeBold=2.17]
+ \setCJKfamilyfont{zhfs}
+ {FZFSK}[Extension=.ttf]
+ \setCJKfamilyfont{zhkai}
+ {FZKTK}[Extension=.ttf]
+ \defaultCJKfontfeatures{}
+ }
% \end{macrocode}
% \end{macro}
%
@@ -1772,34 +2348,32 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
% 思源字体。
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_noto:
-{
- % 思源宋体
- \setCJKmainfont[
- UprightFont=NotoSerifSC-Regular,
- BoldFont=NotoSerifSC-Bold,
- ItalicFont=NotoSerifSC-Regular,
- BoldItalicFont=NotoSerifSC-Bold,
- ItalicFeatures=FakeSlant,
- BoldItalicFeatures=FakeSlant]{Noto~Serif~SC}
+ {
+ % 思源宋体
+ \setCJKmainfont[
+ UprightFont=NotoSerifSC-Regular,
+ BoldFont=NotoSerifSC-Bold,
+ ItalicFont=NotoSerifSC-Regular,
+ BoldItalicFont=NotoSerifSC-Bold,
+ ItalicFeatures=FakeSlant,
+ BoldItalicFeatures=FakeSlant]{Noto~Serif~SC}
- % 思源黑体
- \setCJKsansfont[
- UprightFont=NotoSansSC-Regular,
- BoldFont=NotoSansSC-Bold,
- ItalicFont=NotoSansSC-Regular,
- BoldItalicFont=NotoSansSC-Bold,
- ItalicFeatures=FakeSlant,
- BoldItalicFeatures=FakeSlant]{Noto~Sans~SC}
+ % 思源黑体
+ \setCJKsansfont[
+ UprightFont=NotoSansSC-Regular,
+ BoldFont=NotoSansSC-Bold,
+ ItalicFont=NotoSansSC-Regular,
+ BoldItalicFont=NotoSansSC-Bold,
+ ItalicFeatures=FakeSlant,
+ BoldItalicFeatures=FakeSlant]{Noto~Sans~SC}
- \setCJKmonofont{FZFSK}[Extension=.ttf]% 方正仿宋
+ \setCJKmonofont{FZFSK}[Extension=.ttf]% 方正仿宋
- \setCJKfamilyfont{zhsong}{Noto~Serif~SC}
- \setCJKfamilyfont{zhhei}{Noto~Sans~SC}
- \setCJKfamilyfont{zhfs}
- {FZFSK}[Extension=.ttf]
- \setCJKfamilyfont{zhkai}
- {FZKTK}[Extension=.ttf]
-}
+ \setCJKfamilyfont{zhsong}{Noto~Serif~SC}
+ \setCJKfamilyfont{zhhei}{Noto~Sans~SC}
+ \setCJKfamilyfont{zhfs}{FZFSK}[Extension=.ttf]
+ \setCJKfamilyfont{zhkai}{FZKTK}[Extension=.ttf]
+ }
% \end{macrocode}
% \end{macro}
%
@@ -1808,17 +2382,18 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
% 载入字体命令。
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_font:
-{
- \use:c { @@_load_latin_font_ \g_@@_latin_fontset_tl : }
- \use:c { @@_load_cjk_font_ \g_@@_cjk_fontset_tl : }
+ {
+ \use:c { @@_load_latin_font_ \g_@@_latin_font_tl : }
+ \use:c { @@_load_cjk_font_ \g_@@_cjk_font_tl : }
% \end{macrocode}
-% 自行定义C\hologo{TeX}中的四类字体命令。
+% 自行定义 C\hologo{TeX} 中的四类字体命令。
% \begin{macrocode}
- \NewDocumentCommand\songti{}{\CJKfamily{zhsong}}
- \NewDocumentCommand\heiti{}{\CJKfamily{zhhei}}
- \NewDocumentCommand\fangsong{}{\CJKfamily{zhfs}}
- \NewDocumentCommand\kaishu{}{\CJKfamily{zhkai}}
-}
+ \NewDocumentCommand \songti { } { \CJKfamily{zhsong} }
+ \NewDocumentCommand \heiti { } { \CJKfamily{zhhei} }
+ \NewDocumentCommand \fangsong { } { \CJKfamily{zhfs} }
+ \NewDocumentCommand \kaishu { } { \CJKfamily{zhkai} }
+ \RenewDocumentCommand \large { } { \zihao{4} }
+ }
% \end{macrocode}
%
% 载入设置的字体。
@@ -1834,7 +2409,8 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
\setmathfont{XITSMath-Regular}[
BoldFont = XITSMath-Bold,
Extension = .otf]
-\setmathfont{latinmodern-math.otf}[range={cal,bb,frak}]
+\setmathfont{NewCMMath-Regular.otf}[range={cal,bb,frak}]
+\setmathfont{NewCMMath-Regular.otf}[version=bold,range={bfcal}]
% \end{macrocode}
%
%
@@ -1844,185 +2420,167 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
%
% 使用\pkg{geometry}设置页边距。
% \begin{macrocode}
-\geometry{
- vmargin = 2.5 cm,
- hmargin = 3.2 cm,
- headheight = 15 pt
-}
+\geometry
+ {
+ vmargin = 2.5 cm,
+ hmargin = 3.2 cm,
+ headheight = 15 pt
+ }
% \end{macrocode}
%
% \subsubsection{页眉页脚}
%
-%
% 本科生页眉页脚。要求无页眉,页脚居中,页码使用五号新罗马体数字。
% \begin{macrocode}
-\fancypagestyle{njuplain}{
- \fancyhead{}
- \fancyfoot[C]{\zihao{5}\thepage}
-}
+\fancypagestyle { plain }
+ {
+ \fancyhf { }
+ \fancyfoot [ C ] { \zihao{5} \thepage }
+ \RenewDocumentCommand \headrulewidth { } { 0 pt }
+ \RenewDocumentCommand \footrulewidth { } { 0 pt }
+ }
% \end{macrocode}
%
-%
-% TODO: 研究生页眉页脚
+% 研究生页眉页脚。页眉为横线,奇数页显示章名,偶数页显示节名;页脚为页码。
% \begin{macrocode}
-\fancypagestyle{njuheadings}{%
- \fancyhead{}
- \fancyfoot[C]{\zihao{5}\thepage}
-}
+\fancypagestyle{headings}
+ {
+ \fancyhf { }
+ \fancyhead [ CO ] { \leftmark }
+ \fancyhead [ CE ] { \rightmark }
+ \fancyfoot [ C ] { \zihao{5} \thepage }
+ \RenewDocumentCommand \headrulewidth { } { 0.4 pt }
+ \RenewDocumentCommand \footrulewidth { } { 0 pt }
+ \setlength { \headheight } { 20 pt }
+ }
% \end{macrocode}
%
-% 载入页眉页脚设置。此处\tn{flushbottom}是为了防止目录页出现underfull \tn{vbox}信息。
+% \begin{macro}{\frontmatter}
+% 重定义 \cs{frontmatter},清空页眉页脚以及页码设置。
+% 此命令仅为解决原 \cls{book} 类中使用小写罗马字母序号的冲突,并不建议使用。
% \begin{macrocode}
-\int_compare:nTF { \g_@@_info_degree_int == 1 }
-{
- % the header line
- \tl_set:Nn \headrulewidth {0pt}
- % the footer line
- \tl_set:Nn \footrulewidth {0pt}
- \AtBeginDocument{\pagestyle{njuplain}\flushbottom} % 本科无页眉页脚
-}
-{
- % the header line
- \tl_set:Nn \headrulewidth {1pt}
- % the footer line
- \tl_set:Nn \footrulewidth {0pt}
- \AtBeginDocument{\pagestyle{fancy}\flushbottom} % 研究生有页眉页脚
-}
+\RenewDocumentCommand \frontmatter { }
+ {
+ \cleardoublepage
+ \pagestyle{empty}
+ \pagenumbering{Roman}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mainmatter}
+% \changes{v0.12}{2021/12/03}{修复了摘要页字体格式泄漏到正文的问题。}
+% \changes{v0.12}{2021/12/03}{修复了页眉上长标题重叠的问题。}
+% 重定义 \cs{mainmatter},在论文主体部分载入页眉页脚设置,并重新进行数字编号。
+% \begin{macrocode}
+\RenewDocumentCommand \mainmatter { }
+ {
+ \cleardoublepage
+ \int_compare:nTF { \l_@@_info_degree_int == 1 }
+ { \pagestyle{plain} } { \pagestyle{headings} }
+ \pagenumbering{arabic}
+ \normalfont\normalsize
+ }
% \end{macrocode}
+% \end{macro}
%
% \subsection{章节标题格式}
%
+% \begin{macro}{\c_@@_sec_format_tl}
+% 各部分章节以及目录中章标题的格式。设置为四号、不加粗、黑体。
% \begin{macrocode}
-\ctexset{
- chapter/format = \zihao{4}\heiti\centering\selectfont,
- chapter/beforeskip = 10pt,
- chapter/afterskip = 60pt,
- section/format = \zihao{4}\heiti\raggedright\selectfont,
- subsection/format = \zihao{4}\heiti\raggedright\selectfont,
- subsubsection/format = \zihao{4}\heiti\raggedright\selectfont,
-}
+\tl_const:Nn \c_@@_sec_format_tl { \large \normalfont \sffamily }
% \end{macrocode}
+% \end{macro}
%
-% \subsection{目录格式}
-% 设定目录标题名称。
% \begin{macrocode}
-\ctexset{
- contentsname = 目录,
- listfigurename = 插图清单,
- listtablename = 表格清单,
-}
+\ctexset
+ {
+ chapter/beforeskip = 10 pt,
+ chapter/afterskip = 60 pt,
+ chapter/format = \centering \c_@@_sec_format_tl,
+ section/format = \c_@@_sec_format_tl,
+ subsection/format = \c_@@_sec_format_tl,
+ subsubsection/format = \c_@@_sec_format_tl
+ }
% \end{macrocode}
%
-% 使用\pkg{tocloft}定制目录文字格式。
-% \begin{macrocode}
-\cftsetpnumwidth{2em}
-\renewcommand{\cftchapleader}{\cftdotfill{\cftchapdotsep}}
-\renewcommand{\cftchapdotsep}{\cftdotsep}
-\renewcommand{\cftchapfont}{\heiti\zihao{4}}
-\setlength{\cftsecindent}{2em}
-\setlength{\cftsubsecindent}{52pt}
-\setlength{\cftsubsecnumwidth}{2em}
-% \end{macrocode}
-%
-% \begin{macro}{\tableofcontents}
- % 重定义目录命令,修改标题格式并插入书签。
-% \begin{macrocode}
-\renewcommand\tableofcontents{%
- \cleardoublepage
- \raggedbottom
- \begingroup
- \ctexset{
- contentsname = {目\hspace{2em}录},
- chapter/format = {\centering\songti\bf\zihao{3}\selectfont},
- }%
- \chapter*{\contentsname}%
- \endgroup
- \addcontentsline{toc}{chapter}{\contentsname}
- \vskip 20pt
- \@starttoc{toc}%
-}
-% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\listoffigures}
-% 重定义插图目录命令,修改标题格式并插入书签。
+% \subsection{目录格式}
+% \changes{v0.13}{2021/12/09}{删除 \pkg{tocloft},改用 \pkg{ctex} 内置的目录设置。}
+%
+% \begin{macro}{\@@_chapter_in_toc:n}
+% 将无编号章插入目录。
% \begin{macrocode}
-\renewcommand\listoffigures{%
- \cleardoublepage
- \begingroup
- \ctexset{
- chapter/format = {\centering\songti\bf\zihao{3}\selectfont},
- }%
- \chapter*{\listfigurename}%
- \endgroup
- \addcontentsline{toc}{chapter}{\listfigurename}
- \vskip 20pt
- \@starttoc{lof}%
-}
+\cs_new_protected:Npn \@@_chapter_in_toc:n #1
+ { \addcontentsline { toc } { chapter } { \c_@@_sec_format_tl #1 } }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\listoftables}
-% 重定义表格目录命令,修改标题格式并插入书签。
+% \begin{macro}{\njuchapter}
+% 含有目录和 PDF 标签的无编号章。
% \begin{macrocode}
-\renewcommand\listoftables{%
- \cleardoublepage
- \begingroup
- \ctexset{
- chapter/format = {\centering\songti\bf\zihao{3}\selectfont},
- }%
- \chapter*{\listtablename}%
- \endgroup
- \addcontentsline{toc}{chapter}{\listtablename}
- \vskip 20pt
- \@starttoc{lot}%
-}
+\NewDocumentCommand \njuchapter { m }
+ {
+ \chapter*{#1}
+ \addcontentsline { toc } { chapter } { \c_@@_sec_format_tl #1}
+ \@mkboth{#1}{#1}
+ }
% \end{macrocode}
% \end{macro}
%
-% \subsection{前言致谢}
-%
-% \begin{environment}{preface}
-% 单独制作的前言页。
% \begin{macrocode}
-\NewDocumentEnvironment{preface}{}
-{%
- \chapter*{前言}
- \addcontentsline{toc}{chapter}{前言}
-}{\cleardoublepage}
+\ctexset
+ {
% \end{macrocode}
-% \end{environment}
-%
-% \begin{environment}{acknowledgement}
-% 单独制作的致谢页。
+% 设置目录标题名称。
% \begin{macrocode}
-\NewDocumentEnvironment{acknowledgement}{}
-{%
- \chapter*{致谢}
- \addcontentsline{toc}{chapter}{致谢}
-}{\cleardoublepage}
+ contentsname = {目\hspace{2em}录},
+ listfigurename = {插图清单},
+ listtablename = {表格清单},
+% \end{macrocode}
+% 设置目录中章标题的样式。
+% \begin{macrocode}
+ chapter / tocline = \c_@@_sec_format_tl \CTEXnumberline {#1} #2
+ }
% \end{macrocode}
-% \end{environment}
%
+% \begin{macro}{\c_@@_toc_title_tl}
+% 目录页标题格式,单独设置为三号粗宋体。
+% \begin{macrocode}
+\tl_const:Nn \c_@@_toc_title_tl { \centering \zihao{3} \bf }
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\njupaperlist}
-% \changes{v0.10}{2021/09/29}{新增了成果列表页面。}
-% 发表文章目录与合作文章目录。
+% \begin{macro}{\@@_modify_toc_title:nn}
+% 通过 group 内修改标题设置,改变标题页字体。
% \begin{macrocode}
-\NewDocumentCommand\njupaperlist { t* m }
-{
- \begin{refsection}
- \nocite{#2}
- \IfBooleanTF {#1}
- { \printbibliography[heading=subbibliography,title=合作文章目录] }
- { \printbibliography[heading=subbibliography,title=发表文章目录] }
- \end{refsection}
+\cs_new_protected:Npn \@@_modify_toc_title:nn #1#2
+{
+ \group_begin:
+ \ctexset { chapter/format = \c_@@_toc_title_tl }
+ \njuchapter { #1 }
+ \group_end:
+ \@starttoc{#2}
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\tableofcontents,\listoffigures,\listoftables}
+% 重定义目录命令,修改标题格式并插入书签。
+% \begin{macrocode}
+\RenewDocumentCommand \tableofcontents { }
+ { \@@_modify_toc_title:nn { \contentsname } { toc } }
+\RenewDocumentCommand \listoffigures { }
+ { \@@_modify_toc_title:nn { \listfigurename } { lof } }
+\RenewDocumentCommand \listoftables { }
+ { \@@_modify_toc_title:nn { \listtablename } { lot } }
+% \end{macrocode}
+% \end{macro}
+%
+%
% \subsection{参考文献}
-%
+%
% biblatex设置
% \begin{macrocode}
\RequirePackage[
@@ -2052,154 +2610,161 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
]{biblatex}
% \end{macrocode}
%
+% \changes{v0.12}{2021/12/06}{设置输出参考文献的默认选项。}
+% 设置参考文献名称
+% \begin{macrocode}
+\ctexset{ bibname = {参考文献} }
+% \end{macrocode}
+% 修改参考文献的头部样式并插入目录。
+% \begin{macrocode}
+\defbibheading { njubib } [ \bibname ] { \njuchapter { #1 } }
+\DeclarePrintbibliographyDefaults { heading = njubib }
+% \end{macrocode}
+%
% 忽略不需要的文献信息。
% \begin{macrocode}
-\AtEveryBibitem{
- \clearfield{abstract}
- \clearfield{issn}
- \clearfield{isbn}
- \clearfield{archivePrefix}
- \clearfield{arxivId}
- \clearfield{pmid}
- \clearfield{eprint}
- \ifentrytype{online}{}{\ifentrytype{misc}{}{\clearfield{url}}}
- % \ifentrytype{book}{\clearfield{doi}}{}
-}
+\AtEveryBibitem
+ {
+ \clist_map_inline:nn
+ { abstract, issn, isbn, archivePrefix, arxivId, pmid, eprint }
+ { \clearfield { #1 } }
+ \ifentrytype{online}{}{\ifentrytype{misc}{}{\clearfield{url}}}
+ }
% \end{macrocode}
%
+%
% \subsection{引用}
-%
-% 修改标签名称。默认在名称后面添加空格,删除公式编号的括号
-% \begin{macrocode}
-\crefdefaultlabelformat{#2#1#3\,}
-
-\crefname{figure}{图}{图}
-\crefname{table}{表}{表}
-% \crefname{equation}{公式}{公式}
-\crefformat{equation}{公式~#2#1#3~}
-
-\crefformat{chapter}{第#2#1#3章}
-\crefformat{section}{第~#2#1#3~节}
-\crefformat{subsection}{第~#2#1#3~小节}
-\crefformat{subsubsection}{第~#2#1#3~小节}
-\crefname{appendix}{附录}{附录}
-
-% \crefname{definition}{定义}{定义}
-% \crefname{axiom}{公理}{公理}
-% \crefname{property}{性质}{性质}
-% \crefname{proposition}{命题}{命题}
-% \crefname{lemma}{引理}{引理}
-% \crefname{corollary}{推论}{推论}
-% \crefname{remark}{注解}{注解}
-% \crefname{condition}{条件}{条件}
-% \crefname{conclusion}{结论}{结论}
-% \crefname{assumption}{假设}{假设}
-% \end{macrocode}
-%
-% \pkg{hyperref}
+%
+% \pkg{hyperref} 设置。
% \changes{v0.11}{2021/10/01}{写入PDF元数据。}
% \begin{macrocode}
\ctex_at_end_preamble:n
-{
- \hypersetup
- {
- bookmarksnumbered = true,
- psdextra = true,
- unicode = true,
+ {
+% \end{macrocode}
+% 清除标题中用于手动换行的 |!| 控制符。
+% \begin{macrocode}
+ \tl_set_eq:NN \l_@@_tmp_tl \l_@@_info_title_tl
+ \tl_remove_all:Nn \l_@@_tmp_tl { ! }
+ \hypersetup
+ {
+ bookmarksnumbered = true,
+ psdextra = true,
+ unicode = true,
+ hidelinks,
% \end{macrocode}
% 填写 PDF 元信息。
% \begin{macrocode}
- pdftitle = \l_@@_info_title_tl,
- pdfauthor = \l_@@_info_author_tl,
- pdfkeywords = \l_@@_info_keywords_clist,
- pdfcreator = \c_@@_name_pdf_creator_tl
- }
-}
+ pdftitle = \l_@@_tmp_tl,
+ pdfauthor = \l_@@_info_author_tl,
+ pdfkeywords = \l_@@_info_keywords_clist,
+ pdfcreator = \c_@@_name_pdf_creator_tl
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_cref_name:n,\@@_cref_name:N }
+% 用于修改 \pkg{cleverref} 的标签名称的辅助函数。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cref_name:n #1
+ {
+ \clist_map_inline:nn { #1 }
+ { \crefname { ##1 } { \@@_name:n { ##1 } } { \@@_name:n { ##1 _en } } }
+ }
+\cs_new_protected:Npn \@@_cref_name:N #1
+ {
+ \clist_map_inline:Nn #1
+ { \crefname { ##1 } { \@@_name:n { ##1 } } { \@@_name:n { ##1 _en } } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% 修改 \pkg{cleverref} 的标签格式。
+% 默认在名称后面添加空格,删除公式编号的括号。
+% \begin{macrocode}
+\crefdefaultlabelformat{#2#1#3\,}
+\crefformat { equation } { 公式~#2#1#3~ }
+\crefformat { chapter } { 第#2#1#3章 }
+\crefformat { section } { 第~#2#1#3~节 }
+\crefformat { subsection } { 第~#2#1#3~小节 }
+\crefformat { subsubsection } { 第~#2#1#3~小节 }
+% \end{macrocode}
+%
+% 修改 \pkg{cleverref} 的标签名称。
+% \begin{macrocode}
+\@@_cref_name:n { figure, table, appendix, proof }
+\@@_cref_name:N \c_@@_theorem_type_clist
% \end{macrocode}
%
+%
% \subsection{图表浮动体}
%
% \subsubsection{图片表格}
-%
-% 图表位置调整
+%
+% 设置默认图片扩展名,允许在不键入扩展名时自动进行补全。
% \begin{macrocode}
-\floatsetup[figure]{ % Captions for figures
- capposition=bottom,%
- margins=centering,%
- floatwidth=\textwidth%
-}
-\floatsetup[table]{ % Captions for tables
- capposition=above,%
- margins=centering,%
- floatwidth=\textwidth%
-}
+\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
% \end{macrocode}
%
-% 图表标题样式
-% \begin{macrocode}
-\DeclareCaptionFont{songticap}{\zihao{5}\bf\songti}
-\captionsetup{
- font=small,%
- labelfont=songticap,
- textfont=songticap,
- strut=no,%
- hypcap=true, % Links point to the top of the figure
- % indention=0pt, % Suppress indentation
- % % parindent=0pt, % Suppress space between paragraphs
- aboveskip=6pt, % Increase the space between the figure and the caption
- belowskip=6pt, % Increase the space between the caption and the table
-}
+% \changes{v0.12}{2021/12/06}{删除了可能导致冲突的 \pkg{floatrow}。}
+% 图表标题样式。文字设置为五号宋体,标签设置为粗体,间隔一个全角空格。
+% \begin{macrocode}
+\DeclareCaptionStyle{njucap}
+ {
+ font = small,
+ labelfont = bf,
+ labelsep = quad,
+ justification = centering
+ }
+\captionsetup [ figure ] { style = njucap }
+\captionsetup [ table ] { style = njucap }
% \end{macrocode}
%
%
-% \subsubsection{代码}
+% \subsubsection{代码环境}
%
-% 代码样式
+% 使用 \pkg{listings} 设置代码环境基本样式。
% \begin{macrocode}
-\floatsetup[lstlisting]{ % Captions for lstlistings
- capposition=above,%
- margins=centering,%
- floatwidth=\textwidth%
-}
-\lstset{
- basicstyle=\ttfamily\linespread{1}\small\selectfont,
- keywordstyle=\bfseries,% use bold style for keywords
- commentstyle=\rmfamily\itshape,% use italic style for comments
- stringstyle=\ttfamily,% 字符串风格
- flexiblecolumns,% ?
- numbers=left,% left-aligned numbering
- showspaces=false,% hide markers for spaces
- showstringspaces=false,
- captionpos=t,% place the caption at the top
- % frame=lrtb,% show all four sides of the frame
- % linewidth=.8\textwidth,
- % breakatwhitespace=true,
- breaklines=true,
- xleftmargin=2em,xrightmargin=2em,% set the width of the code environment
-}
+\lstdefinestyle { njulisting }
+ {
+ basewidth = 0.5 em,
+ lineskip = 3 pt,
+ basicstyle = \tiny\tt,
+ keywordstyle = \bf,
+ commentstyle = \it\color{gray},
+ numbers = left,
+ captionpos = t,
+ breaklines = true,
+ xleftmargin = 2 em,
+ xrightmargin = 2 em
+ }
% \end{macrocode}
%
-%
+% 设置代码环境通用样式。
% \begin{macrocode}
-\lstdefinestyle{LaTeX}{
- language=TeX,
- morekeywords={
- begin, caption, label, mathrm, frac,
- toprule, midrule, bottomrule, includegraphics}
-}
+\lstset
+ {
+ style = njulisting,
+ flexiblecolumns
+ }
% \end{macrocode}
%
-%
-% \subsubsection{列表}
-%
-% 列表环境
+% \changes{v0.13}{2021/12/13}{提供简化的行内代码环境。}
+% 上述调整会污染 \tn{lstinline} 的字体大小,因此单独设置用于生成行内代码的简略抄录环境。
+% 此处由于使用到了单独的字符,需要暂时关闭 \hologo{LaTeX3} 语法。
% \begin{macrocode}
-\renewcommand{\labelitemi}{\tiny$\blacktriangleright$}
-\renewcommand{\labelitemii}{\textbullet}
-
-\setlist[itemize]{noitemsep}
-\setlist[enumerate]{noitemsep}
-\setlist[description]{noitemsep}
+\ExplSyntaxOff
+\lstMakeShortInline[
+ style=njulisting,
+ basicstyle=\normalsize\tt,
+ columns=fixed]|
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \subsubsection{列表环境}
+% \changes{v0.12}{2021/12/07}{删除了 \pkg{enumitem} 的部分列表环境设置。}
+% \begin{macrocode}
+\setlist { noitemsep }
% \end{macrocode}
%
%
@@ -2212,724 +2777,799 @@ keywords* .clist_set:N = \l_@@_info_keywords_en_clist,
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_new_theorem:N}
+% 用于定义普通定理环境的辅助函数。
+% \begin{arguments}
+% \item 定理名称列表,|clist| 型变量
+% \end{arguments}
+% 除证明以外的环境都不需要证毕符号,在此清空其设置。
% \begin{macrocode}
-\declaretheoremstyle[
- %spaceabove=.5\thm@preskip,
- %spacebelow=.5\thm@postskip,
- headfont=\bf\songti,%\scshape,
- notefont=\songti,% notebraces={ (}{)},
- bodyfont=\songti,
- %headformat={\NAME\space\NUMBER\space\NOTE},
- headpunct={},
- %postheadspace={.5em plus .1em minus .1em},
- %prefoothook={\hfill\qedsymbol}
- ]{njuthm}
-
-\theoremstyle{njuthm}
-% \end{macrocode}
-%
-% 修改证明环境标题
-% \begin{macrocode}
-\let\oldproofname=\proofname
-\renewcommand*{\proofname}{\rm\bf\songti{\oldproofname}}
-% \end{macrocode}
-%
-% TODO: 简化数学环境的定义方法
-% \begin{macrocode}
-\declaretheorem[
- name=算法,
- style=njuthm,
- refname={算法,算法},
- Refname={算法,算法},
- % numberwithin=section,
-]{algorithm}
-\declaretheorem[
- name=假设,
- style=njuthm,
- refname={假设,假设},
- Refname={假设,假设},
- % numberwithin=section,
-]{assumption}
-\declaretheorem[
- name=公理,
- style=njuthm,
- refname={公理,公理},
- Refname={公理,公理},
- % numberwithin=section,
-]{axiom}
-\declaretheorem[
- name=结论,
- style=njuthm,
- refname={结论,结论},
- Refname={结论,结论},
- % numberwithin=section,
-]{conclusion}
-\declaretheorem[
- name=条件,
- style=njuthm,
- refname={条件,条件},
- Refname={条件,条件},
- % numberwithin=section,
-]{condition}
-\declaretheorem[
- name=推论,
- style=njuthm,
- refname={推论,推论},
- Refname={推论,推论},
- % numberwithin=section,
-]{corollary}
-\declaretheorem[
- name=定义,
- style=njuthm,
- refname={定义,定义},
- Refname={定义,定义},
- % numberwithin=section,
-]{definition}
-\declaretheorem[
- name=例,
- style=njuthm,
- refname={例,例},
- Refname={例,例},
- % numberwithin=section,
-]{example}
-\declaretheorem[
- name=引理,
- style=njuthm,
- refname={引理,引理},
- Refname={引理,引理},
- % numberwithin=section,
-]{lemma}
-\declaretheorem[
- name=性质,
- style=njuthm,
- refname={性质,性质},
- Refname={性质,性质},
- % numberwithin=section,
-]{property}
-\declaretheorem[
- name=命题,
- style=njuthm,
- refname={命题,命题},
- Refname={命题,命题},
- % numberwithin=section,
-]{proposition}
-\declaretheorem[
- name=注解,
- style=njuthm,
- refname={注解,注解},
- Refname={注解,注解},
- % numberwithin=section,
-]{remark}
-\declaretheorem[
- name=定理,
- style=njuthm,
- refname={定理,定理},
- Refname={定理,定理},
- numberwithin=section,
-]{theorem}
+\cs_new_protected:Npn \@@_new_theorem:N #1
+ {
+ \theoremsymbol { }
+ \clist_map_inline:Nn #1
+ { \newtheorem { ##1 } { \@@_name:n { ##1 } } }
+ }
% \end{macrocode}
+% \end{macro}
+%
+% 定义证明环境。证毕符号使用 \tn{mdlgwhtsquare}绘制,对应于 |U+25A1| 字符\footnote{\url{https://tex.stackexchange.com/questions/567135/how-get-box-like-symbol-with-xelatex}}。
+% \begin{macrocode}
+\theoremsymbol { \ensuremath { \mdwhtsquare } }
+\newtheorem* { proof } { \c_@@_name_proof_tl }
+% \end{macrocode}
+%
+% 定义普通定理环境。
+% \begin{macrocode}
+\@@_new_theorem:N \c_@@_theorem_type_clist
+% \end{macrocode}
+%
%
% \subsection{封面}
%
% \subsubsection{内部命令}
-% 拼合标题
+%
+% \begin{macro}{\@@_split_title:n}
+% 分割标题。
% \begin{macrocode}
-\tl_const:Nn \l_@@_info_title_tl
-{
- \l_@@_info_title_a_tl
- \l_@@_info_title_b_tl
- \l_@@_info_title_c_tl
-}
+\cs_new_protected:Npn \@@_split_title:n #1
+ {
+ \tl_if_in:VnTF { #1 } { ! }
+ {
+% \end{macrocode}
+% 从英文感叹号进行分割,存入 |clist|。
+% \begin{macrocode}
+ \seq_set_split:NnV \l_@@_tmp_seq { ! } { #1 }
+ \clist_set_from_seq:NN \l_@@_tmp_clist \l_@@_tmp_seq
+ }
+ {
% \end{macrocode}
+% 如果没找到感叹号,则手动进行分割固定宽度的字符。
+% \begin{macrocode}
+ \@@_put_inempty_seg:nnn { #1 } { 1 } { 15 }
+ \@@_put_inempty_seg:nnn { #1 } { 16 } { 15 }
+ \@@_put_inempty_seg:nnn { #1 } { 31 } { 15 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
%
-% \begin{variable}{\l_@@_info_supv_full_tl,\l_@@_info_supv_full_en_tl}
-% 用于存储导师姓名加职称的变量,旧版编译器不支持字符串中含有|\hspace{.5em}|这样的空白空间命令
+% \begin{macro}{\@@_multiline_title:nnn}
+% 生成多行标题。
+% \begin{arguments}
+% \item 内容格式
+% \item 名称盒子宽度,|dim| 型变量
+% \item 内容盒子宽度,|dim| 型变量
+% \end{arguments}
% \begin{macrocode}
-\tl_new:N \l_@@_info_supv_full_tl
-\tl_new:N \l_@@_info_supv_full_en_tl
+\cs_new_protected:Npn \@@_multiline_title:nnn #1#2#3
+ {
+ \@@_split_title:n { \l_@@_info_title_tl }
+ \@@_spread_box:nnn { #2 } { \kaishu } { \c_@@_name_title_tl }
+ \@@_hskip:
+ \clist_map_inline:Nn \l_@@_tmp_clist
+ { \@@_ulined_center_box:nn { #3 } { #1 ##1 } \@@_vskip: }
+ }
% \end{macrocode}
-% \end{variable}
+% \end{macro}
%
-% 拼合双导师的姓名和职称。
+% \begin{macro}{\@@_cover_entry:nnn}
+% 生成单项信息条目。
+% \begin{arguments}
+% \item 条目
+% \item 名称盒子宽度,|dim| 型变量
+% \item 内容盒子宽度,|dim| 型变量
+% \end{arguments}
% \begin{macrocode}
-\tl_set:Nn \l_@@_info_supv_full_tl
-{
- \l_@@_info_supv_a_tl\
- \l_@@_info_supv_a_title_tl\ \
- \l_@@_info_supv_b_tl\
- \l_@@_info_supv_b_title_tl
-}
-\tl_set:Nn \l_@@_info_supv_full_en_tl
-{
- \l_@@_info_supv_a_title_en_tl\
- \l_@@_info_supv_a_en_tl\ \
- \l_@@_info_supv_b_title_en_tl\
- \l_@@_info_supv_b_en_tl
-}
+\cs_new_protected:Npn \@@_cover_entry:nnn #1#2#3
+ {
+ \@@_spread_box:nnn { #2 } { \kaishu } { \@@_name:n { #1 } }
+ \@@_hskip:
+ \@@_ulined_center_box:nn { #3 } { \@@_info:n { #1 } }
+ \@@_vskip:
+ }
% \end{macrocode}
+% \end{macro}
%
-% \begin{variable}{\l_@@_name_degree_tl,\l_@@_name_degree_en_tl}
-% 用于存储学位名称的变量
+% \begin{macro}{\@@_cover_bientry:nnnn}
+% 生成两项信息条目,仅用于本科生封面。
+% \begin{arguments}
+% \item 左侧条目
+% \item 右侧条目
+% \item 名称盒子宽度,|dim| 型变量
+% \item 内容盒子宽度,|dim| 型变量
+% \end{arguments}
% \begin{macrocode}
-\tl_new:N \l_@@_name_degree_tl
-\tl_new:N \l_@@_name_degree_en_tl
+\cs_new_protected:Npn \@@_cover_bientry:nnnn #1#2#3#4
+ {
+ \@@_spread_box:nnn { #3 } { \kaishu } { \@@_name:n { #1 } }
+ \@@_hskip:
+ \@@_ulined_center_box:nn { #4 } { \@@_info:n { #1 } }
+ \skip_horizontal:n { 0.5 em }
+ \@@_spread_box:nnn { #3 } { \kaishu } { \@@_name:n { #2 } }
+ \@@_hskip:
+ \@@_ulined_center_box:nn { #4 } { \@@_info:n { #2 } }
+ \@@_vskip:
+ }
% \end{macrocode}
-% \end{variable}
+% \end{macro}
+%
+%
+% \subsubsection{绘制部件}
%
-% 判断学位进行命令定义
+% \begin{macro}{\@@_cover_title_ug:}
+% 本科生封面标题。
% \begin{macrocode}
-\int_compare:nTF { \g_@@_info_degree_int == 1 }
-{
- % 本科
- \tl_const:Nn \c_@@_name_title_tl { 题\hfill 目 }
-
- \tl_const:Nn \c_@@_cover_uline_len_a_tl { 250pt }
- \tl_const:Nn \c_@@_cover_uline_len_b_tl { 90pt }
- \tl_const:Nn \c_@@_cover_uline_font_tl { \songti }
- \tl_const:Nn \c_@@_cover_uline_style_tl { \bf }
- \tl_const:Nn \c_@@_cover_uline_bskip_tl {}
-
- \tl_const:Nn \c_@@_cover_box_len_tl { 4.2em }
-
- % 本科强制不打印国家图书馆封面
- \bool_set_false:N \g_@@_nlcover_bool
-}
-{
- % 本科以外都是研究生
- \tl_const:Nn \c_@@_name_title_tl { 论\hfill 文\hfill 题\hfill 目 }
-
- \tl_const:Nn \c_@@_cover_uline_len_a_tl { 250pt }
- \tl_const:Nn \c_@@_cover_uline_len_b_tl { 14em }
- \tl_const:Nn \c_@@_cover_uline_font_tl { \kaishu }
- \tl_const:Nn \c_@@_cover_uline_style_tl {}
- \tl_const:Nn \c_@@_cover_uline_bskip_tl { \hspace{1em} }
-
- \tl_const:Nn \c_@@_cover_box_len_tl { 6em }
-}
+\cs_new_protected:Npn \@@_cover_title_ug:
+ { \@@_spread_box:nnn { 9em } { \bf } { \l_@@_info_type_tl } }
% \end{macrocode}
-% \begin{macro}{\@@_spread_box:nn}
-% 来自\cls{fduthesis}:分散对齐的水平盒子。
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_info_ug:nnn}
+% 本科生封面信息栏。
% \begin{arguments}
-% \item 宽度
-% \item 内容
+% \item 名称盒子宽度,|dim| 型变量
+% \item 长内容盒子宽度,|dim| 型变量
+% \item 短内容盒子宽度,|dim| 型变量
% \end{arguments}
-% 利用 \cs{tl_map_inline:nn} 在字符间插入 \tn{hfil};紧随其后的 \tn{unskip}
-% 将会去掉最后一个 \tn{hfil}。见 \url{https://tex.stackexchange.com/q/169689}。
-% |#2| 需要完全展开以避免 underfull 警告。
% \begin{macrocode}
-\cs_generate_variant:Nn \tl_map_inline:nn { xn }
-\cs_new_protected:Npn \@@_spread_box:nn #1#2
+\cs_new_protected:Npn \@@_cover_info_ug:nnn #1#2#3
{
- \mode_leave_vertical:
- \hbox_to_wd:nn {#1}
- { \tl_map_inline:xn {#2} { ##1 \hfil } \unskip }
+ \begin{minipage} [ c ] { #1 + #2 + 0.3 em }
+ \raggedleft
+ \@@_cover_entry:nnn { dept } { #1 } { #2 }
+ \@@_cover_entry:nnn { major } { #1 } { #2 }
+ \@@_multiline_title:nnn { \bf } { #1 } { #2 }
+ \@@_cover_bientry:nnnn { grade } { id } { #1 } { #3 }
+ \@@_cover_entry:nnn { author } { #1 } { #2 }
+ \@@_cover_bientry:nnnn { supv } { supv_ttl } { #1 } { #3 }
+ \tl_if_blank:VF { \l_@@_info_supv_ii_tl }
+ { \@@_cover_bientry:nnnn { supv_ii } { supv_ttl } { #1 } { #3 } }
+ \@@_cover_entry:nnn { sm_date } { #1 } { #2 }
+ \end{minipage}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_cover_uline_a:n}
-% 在封面绘制下划线
+% \begin{macro}{\@@_cover_title_g:}
+% 研究生封面标题。
% \begin{macrocode}
-\cs_new:Npn \@@_cover_uline_a:n #1
-{
- \uline{\makebox[\c_@@_cover_uline_len_a_tl]
- {\rm\c_@@_cover_uline_font_tl #1 }}
-}
-\cs_new:Npn \@@_cover_uline_b:n #1
-{
- \uline{\makebox[\c_@@_cover_uline_len_b_tl]
- {\rm\c_@@_cover_uline_font_tl #1 }}
-}
-\cs_new:Npn \@@_cover_uline_nl:nn #1 #2
-{
- \uline{\makebox[#1]
- {\rm\c_@@_cover_uline_font_tl #2 }}
-}
+\cs_new_protected:Npn \@@_cover_title_g:
+ {
+ \@@_spread_box:nnn { 9em } { } { \l_@@_info_type_tl } \@@_vskip:
+ \c_@@_name_degree_l_tl \l_@@_info_degree_tl \c_@@_name_degree_r_tl
+ }
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\@@_cover_box:n}
-% 封面表格边框
+% \begin{macro}{\@@_cover_info_g:nn}
+% 研究生封面信息栏。
+% \begin{arguments}
+% \item 名称盒子宽度,|dim| 型变量
+% \item 内容盒子宽度,|dim| 型变量
+% \end{arguments}
% \begin{macrocode}
-\cs_new:Npn \@@_cover_box:n #1
-{
- \makebox[\c_@@_cover_box_len_tl][s]{
- #1\c_@@_cover_uline_bskip_tl}
-}
+\cs_new_protected:Npn \@@_cover_info_g:nn #1#2
+ {
+ \begin{minipage} [ c ] { #1 + #2 + 0.3 em }
+ \raggedleft
+ \@@_multiline_title:nnn { } { #1 } { #2 }
+ \clist_map_inline:nn { author, major, field, supv_full }
+ { \@@_cover_entry:nnn { ##1 } { #1 } { #2 } }
+ \end{minipage}
+ }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_cover_degree:}
-% 学位类型。
+% \begin{macro}{\@@_cover_back_g:}
+% 研究生封面背面信息。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_cover_degree:
-{
- { (申请 }
- \clist_item:Nn \c_@@_name_degree_clist { \g_@@_info_degree_int }
- { 学位) }
-}
+\cs_new_protected:Npn \@@_cover_back_g:
+ {
+ \@@_spread_box:nnn { 6.2 em } { \kaishu } { \c_@@_name_id_tl }
+ { : \@@_quad: } \l_@@_info_id_tl
+ \@@_vskip:
+ \@@_spread_box:nnn { 6.2 em } { \kaishu } { \c_@@_name_df_date_tl }
+ { : \@@_quad: } \l_@@_info_df_date_tl
+ \@@_vskip:
+ \@@_spread_box:nnn { 6.2 em } { \kaishu } { \c_@@_name_supv_full_tl }
+ { : \@@_quad: } \skip_horizontal:n { 8 em } \c_@@_name_sign_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_en_g:}
+% 研究生英文封面。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_en_g:
+ {
+% \end{macrocode}
+% 标题。
+% \begin{macrocode}
+ \parbox { \textwidth }
+ { \centering \bf \sffamily \zihao { 2 } \l_@@_info_title_en_tl }
+ \skip_vertical:n { 1 cm }
+% \end{macrocode}
+% 作者。
+% \begin{macrocode}
+ \group_begin: \zihao { 4 } { by } \group_end: \@@_vskip:
+ \group_begin:
+ \bf \sffamily \zihao { 4 } \l_@@_info_author_en_tl
+ \group_end: \skip_vertical:n { 1 cm }
+% \end{macrocode}
+% 导师。
+% \begin{macrocode}
+ \group_begin: \zihao { 4 } { Supervised~ by } \group_end: \@@_vskip:
+ \group_begin:
+ \sffamily \zihao { 4 } \l_@@_info_supv_full_en_tl
+ \group_end: \vfill
+% \end{macrocode}
+% 学位信息。
+% \begin{macrocode}
+ \c_@@_cover_en_text_tl \@@_vskip:
+ \textsc { \clist_item:Nn \c_@@_name_degree_en_clist
+ { \l_@@_info_degree_int } }
+ \@@_vskip: { in } \@@_vskip:
+ \l_@@_info_major_en_tl \skip_vertical:n { 1 cm }
+% \end{macrocode}
+% 校徽。
+% \begin{macrocode}
+ \njuemblem [ black ] { ! } { 2.5 cm } \@@_vskip:
+ \l_@@_info_dept_en_tl \\ \c_@@_name_nju_en_tl
+ \skip_vertical:n { 1 cm }
+% \end{macrocode}
+% 提交日期。
+% \begin{macrocode}
+ \l_@@_info_sm_date_en_tl
+ }
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{封面组件}
+% \begin{macro}{\@@_cover_top_nl:}
+% 国家图书馆封面顶部信息。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_top_nl:
+ {
+ \@@_spread_box:nnn { 3.2 em } { } { \c_@@_name_clc_tl } \@@_hskip:
+ \@@_ulined_center_box:nn { 9 em } { \l_@@_info_clc_tl } \hfill
+ \@@_spread_box:nnn { 3.2 em } { } { \c_@@_name_seclv_tl } \@@_hskip:
+ \@@_ulined_center_box:nn { 9 em } { \l_@@_info_seclv_tl } \\
+ \@@_spread_box:nnn { 3.2 em } { } { \c_@@_name_udc_tl } \@@_hskip:
+ \@@_ulined_center_box:nn { 9 em } { \l_@@_info_udc_tl } \hfill \null
+ }
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\@@_cover_title_breakline:}
-% 对标题进行自动判断,如果某行标题空则不输出接下来的若干行,得到多行标题。
+% \begin{macro}{\@@_cover_title_nl:}
+% 国家图书馆封面标题。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_cover_title_breakline:
-{
- \@@_cover_box:n {\c_@@_name_title_tl}
- & \@@_cover_uline_a:n
- { \c_@@_cover_uline_style_tl \l_@@_info_title_a_tl } \\
- \tl_if_empty:NF \l_@@_info_title_b_tl
+\cs_new_protected:Npn \@@_cover_title_nl:
{
- \tl_if_empty:NTF \l_@@_info_title_c_tl
- {
- & \@@_cover_uline_a:n
- {\c_@@_cover_uline_style_tl \l_@@_info_title_b_tl } \\
- }
- {
- & \@@_cover_uline_a:n
- { \c_@@_cover_uline_style_tl \l_@@_info_title_b_tl } \\
- & \@@_cover_uline_a:n
- { \c_@@_cover_uline_style_tl \l_@@_info_title_c_tl } \\
- }
+ \noindent \kaishu \zihao { -0 } \skip_vertical:n { -1 cm }
+ \@@_spread_box:nnn { 6 em } { } { \c_@@_name_title_tl }
+ \@@_vskip: \zihao { 1 }
+ \@@_split_title:n { \l_@@_info_title_tl }
+ \@@_multiline_box:nnnn { \l_@@_tmp_int } \l_@@_tmp_clist { 3 } { 15 em }
+ \@@_vskip: \zihao{4} \c_@@_name_title_nl_tl
+ \@@_vskip: \zihao{1}
+ \@@_ulined_center_box:nn { 4.5 em } { \l__nju_info_author_tl }
+ \@@_vskip: \zihao{4} { ( } \c_@@_name_author_tl { ) }
}
-}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_print_covertab:}
-% 封面信息栏
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_covertab:
-{%
-\int_compare:nTF { \g_@@_info_degree_int == 1 }
- {
- \begin{tabular}{p{4.2em}c}
- \@@_cover_box:n {院\hfill 系}
- & \@@_cover_uline_a:n {\l_@@_info_dept_tl} \\
- \@@_cover_box:n {专\hfill 业}
- & \@@_cover_uline_a:n {\l_@@_major_tl} \\
- \@@_cover_title_breakline:
- \end{tabular}\\
-
- \begin{tabular}{p{4.2em}cp{4.2em}c}
- \@@_cover_box:n {年\hfill 级}
- & \@@_cover_uline_b:n {\l_@@_info_grade_tl}
- & \@@_cover_box:n {学\hfill 号}
- & \@@_cover_uline_b:n {\l_@@_info_id_tl}\\
- \end{tabular}\\
-
- \begin{tabular}{p{4.2em}c}
- \@@_cover_box:n {学\hfill 生\hfill 姓\hfill 名}
- & \@@_cover_uline_a:n {\l_@@_info_author_tl}
- \end{tabular}\\
- \begin{tabular}{p{4.2em}cp{4.2em}c}
- \@@_cover_box:n {导\hfill 师}
- & \@@_cover_uline_b:n {\l_@@_info_supv_a_tl}
- & \@@_cover_box:n {职\hfill 称}
- & \@@_cover_uline_b:n {\l_@@_info_supv_a_title_tl}\\
-
- % 第二导师
- \tl_if_empty:NF \l_@@_info_supv_b_tl
- {
- \@@_cover_box:n {第\hfill 二\hfill 导\hfill 师}
- & \@@_cover_uline_b:n {\l_@@_info_supv_b_tl}
- & \@@_cover_box:n {职\hfill 称}
- & \@@_cover_uline_b:n {\l_@@_info_supv_b_title_tl}\\
- }
- \end{tabular}\\
-
- \begin{tabular}{p{4.2em}c}
- \@@_cover_box:n {提\hfill 交\hfill 日\hfill 期}
- & \@@_cover_uline_a:n {\l_@@_submit_date_tl}\\
- \end{tabular}
- }
- {
- \begin{tabular}{p{6em}c}
- \@@_cover_title_breakline:
- \@@_cover_box:n {作\hfill 者\hfill 姓\hfill 名}
- & \@@_cover_uline_a:n {\@@_spread_box:nn {4em}{\l_@@_info_author_tl}}\\
- \@@_cover_box:n {专\hfill 业\hfill 名\hfill 称}
- & \@@_cover_uline_a:n {\l_@@_major_tl}\\
- \@@_cover_box:n {研\hfill 究\hfill 方\hfill 向}
- & \@@_cover_uline_a:n {\l_@@_field_tl}\\
- \@@_cover_box:n {指\hfill 导\hfill 教\hfill 师}
- & \@@_cover_uline_a:n {\l_@@_info_supv_full_tl}\\
- \end{tabular}
- }
-}
+% \begin{macro}{\@@_cover_info_nl:}
+% 国家图书馆封面信息栏。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_info_nl:
+ {
+ \@@_uline_entry:nnnn \l_@@_tmp_dim { supv_info } { supv } { } \\
+ \@@_ulined_center_box:nn { \textwidth } { \@@_info:n { supv_ttl }
+ \@@_quad: \@@_info:n { supv_cont } } \\
+ \@@_uline_bientry:nnnn \l_@@_tmp_dim { degree } { degree } { }
+ \@@_uline_bientry:nnnn \l_@@_tmp_dim { major_nl } { major } { } \\
+ \@@_uline_bientry:nnnn \l_@@_tmp_dim { sm_date } { sm_date } { }
+ \@@_uline_bientry:nnnn \l_@@_tmp_dim { df_date } { df_date } { } \\
+ \@@_full_uline:Nn \l_@@_tmp_dim { \c_@@_name_confer_tl }
+ \@@_uline:n { \l_@@_tmp_dim }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_cover_bottom_nl:}
+% 国家图书馆封面底部信息。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_bottom_nl:
+ {
+ \@@_name:n { chairman } \@@_hskip:
+ \@@_ulined_center_box:nn { 9 em } { \@@_info:n { chairman } } \\
+ \@@_name:n { reviewer } \@@_hskip:
+ \@@_multiline_box:nnnn { \l_@@_tmp_int }
+ { \l_@@_info_reviewer_clist } { 4 } { 9 em }
+ }
% \end{macrocode}
% \end{macro}
%
-%
%
% \subsubsection{绘制封面}
%
-%
-% \begin{macro}{\@@_print_cover_nl:}
-% 按需绘制国家图书馆封面,修改自胡海星模板
+% \begin{macro}{\@@_make_cover_ug:}
+% \changes{v0.13}{2021/12/10}{使用 \hologo{LaTeX3} 语法重构本科生封面。}
+% 生成本科生封面。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_cover_nl:
-{
- \thispagestyle{empty}
- \pdfbookmark[0]{国家图书馆封面}{nl}
- {
- % 顶端
- \noindent\null\vskip -20mm \hskip -15mm
- \songti\zihao{-4}
- \makebox[40pt][l]{分类号}
- \@@_cover_uline_b:n {\l_@@_info_clc_tl}
- \hfill
- \makebox[40pt][l]{密级}
- \@@_cover_uline_b:n {\l_@@_info_seclv_tl}
- \vskip 10pt \hskip -15mm
- \makebox[40pt][l]{udc}
- \@@_cover_uline_b:n {\l_@@_info_udc_tl}
+\cs_new_protected:Npn \@@_make_cover_ug:
+ {
+ \newpage
+% \end{macrocode}
+% 校徽、校名。
+% \begin{macrocode}
+ \null \skip_horizontal:n { -1 cm }
+ \njuemblem [ black] { ! } { 3.35 cm }
+ \begin{center}
+ \njuname[black]{!}{3cm} \@@_vskip:
+% \end{macrocode}
+% 学位信息。
+% \begin{macrocode}
+ \group_begin: \zihao { -1 } \@@_cover_title_ug: \group_end:
+ \skip_vertical:n { 1.5 cm } \vfil
+% \end{macrocode}
+% 信息栏。
+% \begin{macrocode}
+ \zihao{3} \@@_cover_info_ug:nnn { 4.2 em } { 16 em } { 5.5 em } \vfil
+ \end{center}
}
-
- % 中部
- \vskip\stretch{2}
- \begin{center}
- \def\ULthickness{1pt}
- {\kaishu\zihao{-0} 学\hspace{0.5em}位\hspace{0.5em}论\hspace{0.5em}文}
- {
- \kaishu\zihao{1}
- \vskip \stretch{1}
- \@@_cover_uline_b:n {\l_@@_info_title_a_tl}\\
- \@@_cover_uline_b:n {\l_@@_info_title_b_tl}\\
- \@@_cover_uline_b:n {\l_@@_info_title_c_tl}\\
- }
- \vskip \stretch{1}
- {\kaishu\zihao{4}(题名和副题名)}
- \vskip \stretch{1} \vskip 5mm
- {\kaishu\zihao{1}\uline{\makebox{\l_@@_info_author_tl}}}
- \vskip \stretch{1}
- {\kaishu\zihao{4}(作者姓名)}
- \end{center}
-
- % 底部
- \vskip\stretch{1}\kaishu\zihao{4}
- \noindent 指导教师姓名、职务、职称、学位、单位名称及地址%
- \@@_cover_uline_nl:nn {94pt}{\l_@@_info_supv_a_tl}\par
- \noindent \@@_cover_uline_nl:nn {\textwidth}{%
- \l_@@_info_supv_cont_tl}\par
- \noindent 申请学位级别%
- \@@_cover_uline_nl:nn {9em}{\l_@@_name_degree_tl}%
- \noindent 专业名称%
- \uline{\hfill\l_@@_major_tl\hfill}\par
- \noindent 论文提交日期%
- \@@_cover_uline_nl:nn {9em}{\l_@@_submit_date_tl}%
- \noindent 论文答辩日期%
- \uline{\hfill\l_@@_defend_date_tl\hfill}\par
- \noindent 学位授予单位和日期\uline{\hfill}\par
- \begin{flushright}
- 答辩委员会主席:
- \@@_cover_uline_nl:nn {9em}{ \l_@@_info_chairman_tl }\par
- 评阅人:
- \@@_cover_uline_nl:nn {9em}
- { \clist_item:Nn \l_@@_info_reviewer_clist {1} }\par
- \@@_cover_uline_nl:nn {9em}
- { \clist_item:Nn \l_@@_info_reviewer_clist {2} }\par
- \@@_cover_uline_nl:nn {9em}
- { \clist_item:Nn \l_@@_info_reviewer_clist {3} }\par
- \@@_cover_uline_nl:nn {9em}
- { \clist_item:Nn \l_@@_info_reviewer_clist {4} }\par
- \end{flushright}
- \begin{center}
- \kaishu\zihao{3}\hspace{2em} 年\hspace{1em} 月\hspace{1em} 日
- \end{center}
- \vskip -10mm
- \cleardoublepage
-}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_print_cover_ug:}
-% 本科封面
+% \begin{macro}{\@@_make_cover_g:}
+% \changes{v0.13}{2021/12/11}{使用 \hologo{LaTeX3} 语法重构研究生封面。}
+% 生成研究生封面。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_cover_ug:
-{
- \thispagestyle{empty}
- \pagenumbering{Roman}
- % Start
- \pdfbookmark{封面}{cover} % 将封面插入pdf书签
- \begin{spacing}{1.25}
- \noindent\null\hspace{-10mm}
- \njuemblem{!}{3cm}\smallskip
- \begin{center}
- \njuname{!}{3.35cm}
- \vskip 10mm
- {\zihao{1}\bf\songti\@@_spread_box:nn {9em}{本科毕业论文}}
- \vfill
- \vskip\stretch{0}
- {\bgroup
- \kaishu\zihao{3}
- \def\tabcolsep{1pt}
- \def\arraystretch{1.5}
- % 绘制信息框
- \@@_print_covertab:
- \egroup}
- \vfill
- \end{center}
- \end{spacing}
- \cleardoublepage
-}
+\cs_new_protected:Npn \@@_make_cover_g:
+ {
+ \newpage
+ \begin{center}
+% \end{macrocode}
+% 校徽、校名。
+% \begin{macrocode}
+ \null \skip_vertical:n { 1 cm }
+ \njuemblem [ black ] { ! } { 1.9 cm } \skip_vertical:n { 0.5 cm }
+ \njuname [ black ] { 4.4 cm } { ! } \@@_vskip:
+% \end{macrocode}
+% 学位信息。
+% \begin{macrocode}
+ \group_begin:
+ \zihao { -1 } \bf \kaishu \@@_cover_title_g:
+ \group_end:
+ \skip_vertical:n { 3 cm } \vfil
+% \end{macrocode}
+% 信息栏。
+% \begin{macrocode}
+ \group_begin:
+ \zihao { 3 } \kaishu
+ \@@_cover_info_g:nn { 6.2 em } { 18 em } \vfil
+ \skip_vertical:n { 2 cm } \l_@@_info_sm_date_tl
+ \group_end:
+ \end{center}
+% \end{macrocode}
+% 背面。格式存在变化,没有使用循环来简化。
+% \begin{macrocode}
+ \newpage
+ \noindent \null \skip_vertical:n { 18 cm }
+ \group_begin:
+ \zihao { 3 } \kaishu \@@_cover_back_g:
+ \group_end:
+% \end{macrocode}
+% 英文封面。
+% \begin{macrocode}
+ \newpage
+ \noindent \null \skip_vertical:n { 2 cm }
+ \begin{center}
+ \@@_cover_en_g:
+ \end{center}
+ }
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\@@_print_cover_g:}
-% 研究生封面
+% \begin{macro}{\@@_make_cover_nl:}
+% \changes{v0.13}{2021/12/12}{使用 \hologo{LaTeX3} 语法重构国家图书馆封面。}
+% 生成研究生的国家图书馆封面。
% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_cover_g:
-{
- \thispagestyle{empty}
- \pagenumbering{Roman}
- % Start
- \pdfbookmark{封面}{cover} % 将封面插入pdf书签
- \begin{spacing}{1.25}
- \begin{center}
- \noindent\null\vskip 5mm
- \njuemblem{!}{1.9cm}
- \vskip 10mm
- \njuname{4.4cm}{!}
- \par\vskip -2mm
- \njuname*{4.4cm}{!}
- \vskip 15mm
- \bgroup
- \zihao{1}\bf\kaishu
- \@@_spread_box:nn {10em}{研究生毕业论文}
- \vskip 5mm
- \@@_cover_degree:
- \egroup
- \par\vfill\vskip\stretch{0}
- \bgroup
- \bf\kaishu\zihao{3}
- \def\tabcolsep{1pt}
- \def\arraystretch{1.5}
- \vskip 10mm
- \@@_print_covertab:
- \egroup
- \vfill
- \vskip 10mm
- \bf\kaishu\zihao{4}\l_@@_submit_date_tl
- \vskip 15mm
- \end{center}
- \end{spacing}
-
- \newpage % 封面背面
- \thispagestyle{empty}
- \begin{spacing}{1.625}
- % TODO: 等待调整格式
- \null\vfill
- {\bgroup
- \kaishu\zihao{3}
- \makebox[6em][s]{\bf\kaishu 学\hfill 号}:\MakeUppercase{\l_@@_info_id_tl}
- \par
- \makebox[6em][s]{\bf\kaishu 论文答辩日期}:\l_@@_defend_date_tl
- \par
- \makebox[6em][s]{\bf\kaishu 指\hfill 导\hfill 教\hfill 师}:\hspace{50mm}(签字)
- \par
- \egroup}
- \vskip 15mm
- \end{spacing}
- \cleardoublepage
-
-% 研究生英文封面
- \thispagestyle{empty}
- \pdfbookmark{英文封面}{cover-en} % 将封面插入pdf书签
- \begin{center}
- \noindent\vspace*{20pt}
- \bf\sffamily\zihao{2}\l_@@_info_title_en_tl
- \vskip \stretch{1}
- \normalfont\rmfamily\zihao{4}{by}
- \vskip 3pt
- \bf\sffamily\zihao{4}\l_@@_info_author_en_tl
- \vskip\stretch{1}
- \normalfont\rmfamily\zihao{4}{Supervised~by}
- \vskip 3pt
- \normalfont\sffamily\zihao{4}
- \l_@@_info_supv_a_title_en_tl
- \hspace{.5em}\l_@@_info_supv_a_en_tl\\
- \l_@@_info_supv_b_title_en_tl
- \hspace{.5em}\l_@@_info_supv_b_en_tl
- \vskip\stretch{1}
- \normalsize\rmfamily{
- A~dissertation~submitted~to\\
- the~graduate~school~of~Nanjing~University\\
- in~partial~fulfilment~of~the~requirements~for~the~degree~of\\
- \textsc{
- \clist_item:Nn \c_@@_name_degree_en_clist { \g_@@_info_degree_int }
- }\\
- in\\
- {\l_@@_major_en_tl}
- }
- \vskip\stretch{2}
- \njuemblem{2.5cm}{!}\par
- \vskip 3mm
- \normalfont\l_@@_info_dept_en_tl\\
- {Nanjing~University}
- \vskip 30pt
- \normalfont\normalsize\l_@@_submit_date_en_tl
- \end{center}
- \normalfont
- \cleardoublepage
-}
+\cs_new_protected:Npn \@@_make_cover_nl:
+ {
+ \pdfbookmark [ 0 ] { 国家图书馆封面 } { nlcover }
+ \noindent \null
+% \end{macrocode}
+% 顶部,包括密级、分类号、UDC。
+% \begin{macrocode}
+ \begin{center}
+ \zihao{ -4 } \skip_vertical:n { -2 cm }
+ \@@_cover_top_nl:
+ \end{center}
+% \end{macrocode}
+% 标题。
+% \begin{macrocode}
+ \begin{center}
+ \skip_vertical:n { -2 cm }
+ \@@_cover_title_nl:
+ \end{center}
+% \end{macrocode}
+% 中部信息栏。
+% \begin{macrocode}
+ \group_begin:
+ \kaishu \zihao { 4 } \noindent \@@_cover_info_nl:
+ \group_end:
+% \end{macrocode}
+% 底部答辩信息。
+% \begin{macrocode}
+ \begin{flushright}
+ \@@_cover_bottom_nl:
+ \end{flushright}
+ \begin{center}
+ \kaishu \zihao{3} \@@_qquad: 年 \@@_quad: 月 \@@_quad: 日
+ \end{center}
+ \skip_vertical:n { -1 cm }
+ }
% \end{macrocode}
% \end{macro}
%
-%
+% \begin{macro}{\@@_make_orig_decl: }
+% 生成学位论文原创性声明。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_make_orig_decl:
+ {
+ \normalfont \normalsize
+ \chapter* { \c_@@_name_nju_tl \c_@@_name_orig_decl_tl }
+ \thispagestyle { empty }
+ \c_@@_orig_decl_text_tl
+ \vfil
+ \begin{flushright}
+ \@@_name:n { orig_sign } \@@_uline:n { 7 em } \@@_vskip:
+ \@@_name:n { orig_date } \@@_uline:n { 7 em }
+ \end{flushright}
+ \vfil
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{用户接口}
+%
% \begin{macro}{\maketitle}
-% 重定义maketitle生成封面
+% \changes{v0.12}{2021/12/01}{仅会生成国家图书馆封面或者普通封面之一。}
+% \changes{v0.13}{2021/12/12}{重新绘制封面。}
+% 重定义 \cs{maketitle} 以生成封面。
+% 如果选择了 |nlcover|,就生成用于申请学位的国家图书馆封面和原创性声明,反之生成普通封面。
% \begin{macrocode}
-\tl_set:Nn \maketitle
-{
- \bool_if:NT \g_@@_nlcover_bool { \@@_print_cover_nl: } % 国家图书馆封面
- \use:c { @@_print_cover_ \g_@@_info_diploma_tl : }
-}
+\RenewDocumentCommand \maketitle { }
+ {
+ \pagestyle{empty}
+ \bool_if:NTF \g_@@_nlcover_bool
+ { \@@_make_cover_nl: \@@_make_orig_decl: }
+ { \use:c { @@_make_cover_ \l_@@_info_diploma_tl : } }
+% \end{macrocode}
+% 生成封面后清除标题中的换行控制符。
+% \begin{macrocode}
+ \tl_remove_all:Nn \l_@@_info_title_tl { ! }
+% \end{macrocode}
+% 在标题页后使用大写罗马字母页码,恢复正常字体设置。
+% \begin{macrocode}
+ \cleardoublepage
+ \pagestyle{plain}
+ \pagenumbering{Roman}
+ \normalfont \normalsize
+ }
% \end{macrocode}
% \end{macro}
%
-% \subsection{摘要绘制}
%
-% \begin{macro}{\@@_print_keywords:,\@@_print_keywords_en:}
-% 中英文关键词
+% \subsection{摘要页}
+%
+% \subsubsection{内部命令}
+%
+% \begin{macro}{\@@_abs_title_uuline:n}
+% 摘要标题双层下划线格式。
+% \begin{arguments}
+% \item 宽度,|dim| 型变量
+% \end{arguments}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_keywords:
-{
- \par\vspace{2ex}
- \bgroup
- \noindent
- \c_@@_name_keywords_tl
- \clist_use:Nn \l_@@_info_keywords_clist {;}
- \par
- \egroup
-}
-\cs_new_protected:Npn \@@_print_keywords_en:
-{
- \par\vspace{2ex}
- \bgroup
- \noindent
- \c_@@_name_keywords_en_tl\hspace{0.5em}
- \clist_use:Nn \l_@@_info_keywords_en_clist {;}
- \par
- \egroup
-}
+\cs_new_protected:Npn \@@_abs_title_uuline:n #1
+ { \bf \kaishu \zihao { -2 } \@@_uuline:n { #1 } }
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\@@_print_abstract_ug:,\@@_print_abstract_en_ug:}
-% 输出本科摘要格式。
+% \begin{macro}{\@@_abs_info_style:n,\@@_abs_info_style_en:n}
+% 摘要信息栏通用格式,设置为无缩进、四号或者小四号、楷书。
+% \begin{arguments}
+% \item 字号
+% \end{arguments}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_abstract_ug:
-{
- \thispagestyle{plain}
- \pdfbookmark[0]{中文摘要}{abstract-zh}
- \begin{center}
- \kaishu\zihao{-2}{\textbf{
- \uuline{南京大学本科生毕业论文(设计、作品)中文摘要}}}
- \end{center}
- \bgroup
- \noindent\kaishu\zihao{-4}
- 题目: \l_@@_info_title_tl \\
- 院系: \l_@@_info_dept_tl \\
- 专业: \l_@@_major_tl \\
- 本科生姓名: \l_@@_info_author_tl \\
- 指导教师(姓名、职称):\l_@@_info_supv_full_tl \\
- 摘要:
- \egroup
- \kaishu\zihao{-4}\par%
-}
-\cs_new_protected:Npn \@@_print_abstract_en_ug:
-{
- \thispagestyle{plain}
- \pdfbookmark[0]{英文摘要}{abstract-en}
- \begin{center}
- \kaishu\zihao{-2}{\textbf{\uuline{
- 南京大学本科生毕业论文(设计、作品)英文摘要}}}
- \end{center}
- {
- \bgroup
- THESIS: ~~\l_@@_info_title_en_tl \\
- DEPARTMENT: ~~\l_@@_info_dept_en_tl \\
- SPECIALIZATION: ~~\l_@@_major_en_tl \\
- UNDERGRADUATE:~~\l_@@_info_author_en_tl \\
- MENTOR:~~\l_@@_info_supv_full_en_tl \\
- ABSTRACT:
- \egroup
- }
- \zihao{-4}\par%
-}
+\cs_new_protected:Npn \@@_abs_info_style:n #1
+ { \noindent \zihao{ #1 } \kaishu }
+\cs_new_protected:Npn \@@_abs_info_style_en: #1 { \zihao{ #1 } }
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\@@_print_abstract_g:,\@@_print_abstract_en_g:}
-% 输出研究生摘要格式。
+% \begin{macro}{\@@_abs_bookmark:n}
+% 生成摘要的 PDF 书签。
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \item 关键词分隔符
+% \end{arguments}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_abstract_g:
-{
- \thispagestyle{plain}
- \pdfbookmark[0]{中文摘要}{abstract-zh}
- \begin{center}
- \kaishu\zihao{-2}{\textbf{\uuline{
- 南京大学研究生毕业论文中文摘要首页用纸}}}
- \end{center}
- \bgroup
- \noindent\kaishu\zihao{4}
- 毕业论文题目:\hspace{0.5em}\njuline{\l_@@_info_title_tl\hfill}\\
- \njuline{\makebox[11em]{\l_@@_major_tl}}专业
- \njuline{\makebox[4em]{\l_@@_info_grade_tl}}级
- \int_compare:nTF { \g_@@_info_degree_int == 4} { 博 } { 硕 }
- 士生姓名:\njuline{\hfill\l_@@_info_author_tl\hfill}\\
- 指导教师(姓名、职称):\njuline{\hfill\l_@@_info_supv_full_tl\hfill}\par
- \egroup
- \kaishu\zihao{4}\par%
-}
-\cs_new_protected:Npn \@@_print_abstract_en_g:
-{
- \thispagestyle{plain}
- \pdfbookmark[0]{英文摘要}{abstract-en}
- \begin{center}
- \kaishu\zihao{-2}{\textbf{\uuline{
- 南京大学研究生毕业论文英文摘要首页用纸}}}
- \end{center}
- {
- \bgroup
- \zihao{4}
- THESIS: ~~\l_@@_info_title_en_tl \\
- SPECIALIZATION: ~~\l_@@_major_en_tl \\
- POSTGRADUATE:~~\l_@@_info_author_en_tl \\
- MENTOR:~~\l_@@_info_supv_full_en_tl\par
- \egroup
- }
- \zihao{4}\par%
-}
+\cs_new_protected:Npn \@@_abs_bookmark:n #1
+ {
+ \pdfbookmark [ 0 ]
+ { \@@_name:n { abstract #1 } } { abstract #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{绘制部件}
+%
+% \begin{macro}{\@@_abs_title_ug:n}
+% 绘制本科生摘要标题。
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \end{arguments}
+% \begin{macrocode}
+\cs_generate_variant:Nn \clist_map_inline:nn { Vn }
+\cs_new_protected:Npn \@@_abs_title_ug:n #1
+ {
+ \@@_name:n { nju } \@@_name:n { type }
+ \@@_name:n { lang #1 } \@@_name:n { abstract }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_abs_info_ug:nn}
+% 绘制本科生摘要信息栏。
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \item 分隔符
+% \end{arguments}
+% 本科生摘要页面不含下划线,因而不用确定文本宽度,绘制命令较为简单。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_abs_info_ug:nn #1#2
+ {
+% \end{macrocode}
+% 确定标题类型。
+% \begin{macrocode}
+ \tl_if_blank:eTF { #1 }
+ { \c_@@_name_title_tl }
+ { \clist_item:Nn \c_@@_name_type_en_clist { \l_@@_info_type_int } }
+ #2 \tl_use:c { l_@@_info_title #1 _tl } \\
+% \end{macrocode}
+% 由于作者姓名使用的字样发生了变动,这里进行替换以便嵌入循环。
+% \begin{macrocode}
+ \tl_set_eq:NN \c_@@_name_author_tl \c_@@_name_author_full_tl
+% \end{macrocode}
+% 使用循环输出院系、专业、作者、导师信息。
+% \begin{macrocode}
+ \clist_map_inline:nn { dept, major, author, supv_full }
+ { \@@_name:n { ##1 #1 } #2 \@@_info:n { ##1 #1 } \\ }
+ \@@_name:n { abstract #1 } #2
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_abs_title_g:n}
+% 绘制研究生摘要标题。
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_abs_title_g:n #1
+ {
+ \@@_name:n { nju } \@@_info:n { type }
+ \@@_name:n { lang #1 } \@@_name:n { abstract_r }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_abs_info_g:nn}
+% 绘制研究生摘要信息栏。
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \item 分隔符
+% 研究生摘要页包括下划线以及若干特殊的对齐方式,实现方式较为繁琐。
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_abs_info_g:nn #1#2
+ {
+ \tl_if_blank:eTF { #1 }
+ {
+% \end{macrocode}
+% 中文摘要环境,使用 \cs{@@_full_uline:NV} 确定内容宽度后,调用 \cs{@@_uline:n} 或 \cs{@@_ulined_center_box:nn} 命令以绘制横穿页面的下划线。前两行为标题。
+% \begin{macrocode}
+ \@@_full_uline:NV \l_@@_tmp_dim
+ {
+ \clist_item:Nn \c_@@_name_type_clist { \l_@@_info_type_int }
+ \c_@@_name_title_s_tl #2
+ }
+ \@@_ulined_center_box:nn { \l_@@_tmp_dim }
+ { \tl_range:Nnn \l_@@_info_title_tl { 1 } { 20 } } \\
+ \@@_uline:n { \textwidth } \@@_qquad:
+ \tl_range:Nnn \l_@@_info_title_tl { 21 } { -1 } \\
+% \end{macrocode}
+% 专业、年级、姓名。
+% \begin{macrocode}
+ \@@_full_uline:NV \l_@@_tmp_dim
+ {
+ \@@_ulined_center_box:nn { 11 em } { \l_@@_info_major_tl }
+ \c_@@_name_major_s_tl
+ \@@_ulined_center_box:nn { 4 em } { \l_@@_info_grade_tl }
+ \c_@@_name_grade_tl
+ \tl_item:nn { \l_@@_info_degree_tl } { 1 }
+ \c_@@_name_author_r_tl #2
+ }
+ \@@_ulined_center_box:nn { \l_@@_tmp_dim }
+ { \l_@@_info_author_tl } \\
+% \end{macrocode}
+% 导师姓名、职称。
+% \begin{macrocode}
+ \@@_full_uline:NV \l_@@_tmp_dim
+ { \c_@@_name_supv_full_tl \c_@@_name_supv_r_tl #2 }
+ \@@_ulined_center_box:nn { \l_@@_tmp_dim }
+ { \l_@@_info_supv_full_tl }
+ }
+% \end{macrocode}
+% 英文摘要环境。前两行为标题。
+% \begin{macrocode}
+ {
+ \@@_full_uline:NV \l_@@_tmp_dim
+ { \clist_item:cn { c_@@_name_type #1 _clist }
+ { \l_@@_info_type_int } # 2 }
+ \@@_ulined_center_box:nn { \l_@@_tmp_dim }
+ { \tl_range:Nnn \l_@@_info_title_en_tl { 1 } { 40 } } \\
+ \@@_uline:n { \textwidth } \@@_qquad:
+ \tl_range:Nnn \l_@@_info_title_en_tl { 41 } { -1 }
+% \end{macrocode}
+% 使用循环输出专业、姓名、导师。注意这里将 |\\| 放置在前部,以避免末尾生成多余的换行符产生 |Underfull \vbox| 信息。
+% \begin{macrocode}
+ \clist_map_inline:nn { major, author, supv_full }
+ { \\
+ \@@_uline_entry:nnnn \l_@@_tmp_dim { ##1 _en } { ##1 _en } { #2 }
+ }
+ }
+ }
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\@@_print_keywords:nn}
+% 生成中英文关键词列表。
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \item 关键词分隔符
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_keywords:nn #1#2
+ {
+ \skip_vertical:n { 2 ex }
+ \group_begin:
+% \end{macrocode}
+% “关键词”字样使用加粗黑体。
+% \begin{macrocode}
+ \noindent \bf \heiti
+ \use:c { c_@@_name_keywords #1 _tl }
+ \group_end:
+ \clist_use:cn { l_@@_info_keywords #1 _clist } { #2 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{绘制摘要}
+%
+% \begin{macro}{\@@_make_abs_ug:nn}
+% \changes{v0.13}{2021/12/12}{使用 \hologo{LaTeX3} 语法重构本科生摘要。}
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \item 关键词分隔符
+% \end{arguments}
+% 生成本科生摘要。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_make_abs_ug:nn #1#2
+ {
+ \begin{center}
+ \@@_abs_title_uuline:n { 22 em }
+ \@@_abs_title_ug:n { #1 }
+ \end{center}
+ \group_begin:
+ \@@_abs_info_style:n { -4 }
+ \@@_abs_info_ug:nn { #1 } { #2 }
+ \group_end: \@@_vskip:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_make_abs_g:nn}
+% \changes{v0.13}{2021/12/12}{使用 \hologo{LaTeX3} 语法重构研究生摘要。}
+% \begin{arguments}
+% \item 语言,空置为中文,|_en| 为英文
+% \item 关键词分隔符
+% \end{arguments}
+% 生成研究生摘要。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_make_abs_g:nn #1#2
+ {
+ \begin{center}
+ \@@_abs_title_uuline:n { 19 em }
+ \@@_abs_title_g:n { #1 }
+ \end{center}
+ \group_begin:
+ \@@_abs_info_style:n { 4 }
+ \@@_abs_info_g:nn { #1 } { #2 }
+ \group_end: \@@_vskip:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{用户接口}
%
-% \begin{macro}{abstract}
+% \begin{environment}{abstract}
+% \changes{v0.13}{2021/12/12}{重新绘制摘要。}
% 中文摘要环境。
% \begin{macrocode}
\NewDocumentEnvironment{abstract} { +b }
- { \use:c { @@_print_abstract_ \g_@@_info_diploma_tl : } #1 }
- { \@@_print_keywords: \newpage }
+ {
+ \newpage
+ \@@_abs_bookmark:n { }
+ \use:c { @@_make_abs_ \l_@@_info_diploma_tl :nn } { } { : }
+ \group_begin: \normalfont \zihao { -4 } #1
+ }
+ { \@@_print_keywords:nn { } { ; } \group_end: }
% \end{macrocode}
-% \end{macro}
+% \end{environment}
%
-% \begin{macro}{abstract*}
+% \begin{environment}{abstract*}
% 英文摘要环境。\pkg{xparse} 目前不支持合并带有星号的环境,因此需要单独定义。
% \begin{macrocode}
\NewDocumentEnvironment{abstract*} { +b }
- { \use:c { @@_print_abstract_en_ \g_@@_info_diploma_tl : } #1 }
- { \@@_print_keywords_en: \cleardoublepage }
+ {
+ \newpage
+ \@@_abs_bookmark:n { _en }
+ \use:c { @@_make_abs_ \l_@@_info_diploma_tl :nn } { _en } { :~ }
+ \group_begin: \normalfont \zihao{ -4 } #1
+ }
+ { \@@_print_keywords:nn { _en } { ;~ } \group_end: }
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{前言致谢}
+%
+% \begin{environment}{preface}
+% \begin{environment}{acknowledgement}
+% 单独制作的前言致谢页。
+% \begin{macrocode}
+\NewDocumentEnvironment{preface} { +b }
+ { \njuchapter { 前\hspace{2em}言 } #1 } { }
+\NewDocumentEnvironment{acknowledgement} { +b }
+ { \njuchapter { 致\hspace{2em}谢 } #1 } { }
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\njupaperlist}
+% \changes{v0.10}{2021/09/29}{新增了成果列表页面。}
+% 发表文章目录与合作文章目录。
+% \begin{macrocode}
+\NewDocumentCommand\njupaperlist { t* m }
+ {
+ \begin{refsection}
+ \nocite{#2}
+ \bool_if:NTF { #1 }
+ { \printbibliography[heading=subbibliography,title=合作文章目录] }
+ { \printbibliography[heading=subbibliography,title=发表文章目录] }
+ \end{refsection}
+ }
%</class>
% \end{macrocode}
% \end{macro}
%
+%
% \end{implementation}
%
diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.ins b/macros/unicodetex/latex/njuthesis/njuthesis.ins
deleted file mode 100644
index bb465a1532..0000000000
--- a/macros/unicodetex/latex/njuthesis/njuthesis.ins
+++ /dev/null
@@ -1,75 +0,0 @@
-%%
-%% This is file `njuthesis.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% njuthesis.dtx (with options: `install')
-%%
-%% Copyright (C) 2021
-%% by Nanjing University Linux User Group <nju.lug@yaoge123.cn>
-%%
-%% This file may be distributed and/or modified under the conditions of
-%% the LaTeX Project Public License, either version 1.3c of this license
-%% or (at your option) any later version. The latest version of this
-%% license is in:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% and version 1.3 or later is part of all distributions of LaTeX version
-%% 2005/12/01 or later.
-%%
-%% To produce the documentation run the original source files ending with `.dtx'
-%% through XeTeX.
-%%
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-
-\preamble
-
-Copyright (C) 2021
-by Nanjing University Linux User Group <nju.lug@yaoge123.cn>
-
-This file may be distributed and/or modified under the conditions of
-the LaTeX Project Public License, either version 1.3c of this license
-or (at your option) any later version. The latest version of this
-license is in:
-
- http://www.latex-project.org/lppl.txt
-
-and version 1.3 or later is part of all distributions of LaTeX version
-2005/12/01 or later.
-
-To produce the documentation run the original source files ending with `.dtx'
-through XeTeX.
-
-\endpreamble
-
-\generate{
- \usedir{tex/latex/njuthesis}
- \file{\jobname.cls} {\from{\jobname.dtx}{class}}
-}
-
-\obeyspaces
-\Msg{*************************************************************}
-\Msg{* *}
-\Msg{* To finish the installation you have to move the following *}
-\Msg{* files into a directory searched by TeX: *}
-\Msg{* *}
-\Msg{* The recommended directory is TDS:tex/latex/njuthesis *}
-\Msg{* *}
-\Msg{* njuthesis.cls *}
-\Msg{* njuthesis.ins *}
-\Msg{* *}
-\Msg{* To produce the documentation, run the file njuthesis.dtx *}
-\Msg{* through XeLaTeX. *}
-\Msg{* *}
-\Msg{* Happy TeXing! *}
-\Msg{* *}
-\Msg{*************************************************************}
-
-\endbatchfile
-\endinput
-%%
-%% End of file `njuthesis.ins'.
diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.pdf b/macros/unicodetex/latex/njuthesis/njuthesis.pdf
index ee8354e6f7..f679febe8b 100644
--- a/macros/unicodetex/latex/njuthesis/njuthesis.pdf
+++ b/macros/unicodetex/latex/njuthesis/njuthesis.pdf
Binary files differ