Skip to content
Snippets Groups Projects
njuthesis.dtx 126 KiB
Newer Older
% 下面这个例子展示了如何插入一张表格。通过 \pkg{booktabs} 提供的 \tn{toprule}、\tn{midrule} 和 \tn{bottomrule},我们可以很轻松地绘制出一张漂亮规范的三线表。
% \begin{latexexample}[moretexcs={\toprule,\midrule,\bottomrule},emph={[1]table,tabular}]
Yu Xiong's avatar
Yu Xiong committed
%   \begin{table}[htbp]
Yu Xiong's avatar
Yu Xiong committed
%       \caption{我的表}
%       \label{tab:testtab}
%       \begin{tabular}{ccc}
%           \toprule
%           OS & TeX & 测试情况 \\
%           \midrule
%           南大TeX & Overleaf & √ \\
%           \bottomrule
%       \end{tabular}
%   \end{table}
% \end{latexexample}
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{\multirow,\multicolumn}
%   \begin{syntax}
%     \tn{multirow}\Arg{nrows}\oarg{bigstructs}\Arg{width}[\oarg{fixup}\Arg{text}
%     \tn{multicolumn}\Arg{nrows}\Arg{width}\Arg{text}
%   \end{syntax}
%
% TODO:\pkg{multirow}\pkg{multicol}合并单元格
Yu Xiong's avatar
Yu Xiong committed
% \url{http://www.ctex.org/documents/packages/table/multirow.htm}
%
% \end{function}
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{代码}
%
% 由 \pkg{listings} 提供代码排版。代码块 \env{lstlisting},注意这个环境中的缩进空格会如实输出。
% 如需指定语言,可以使用 |language| 选项。如需自定义关键字,可以使用 |morekeywords| 选项
Yu Xiong's avatar
Yu Xiong committed
% \begin{latexexample}[emph={[1]lstlisting},emph={[2]language}]
%   \begin{lstlisting}[language=python]
Yu Xiong's avatar
Yu Xiong committed
%   <code>
%   \end{lstlisting}
% \end{latexexample}
% 行间代码可以使用抄录环境 \tn{verb} ,
Yu Xiong's avatar
Yu Xiong committed
% 格式如 |\verb!<code>!|。其中包裹代码的两个感叹号并不是绝对的,可以替换成任何两个相同的没有在这段代码中出现过的符号。
% 同时,也可以使用简写的行内代码环境,使用两条竖线包裹代码即可。请注意,\pkg{listings} 提供的 \tn{lstinline} 会被全局的字号设置污染。如果需要在行内代码指定语言,请参考如下设置:
Yu Xiong's avatar
Yu Xiong committed
% \begin{latexexample}[moretexcs={\lstinline,\tt},deletetexcs={\usepackage},emph={[2]language,basicstyle}]
%   \lstinline[language=[LaTeX]TeX, basicstyle=\tt]!\usepackage{njuvisual}!
% \end{latexexample}
Yu Xiong's avatar
Yu Xiong committed
%
%
% \subsubsection{数学}
%
Yu Xiong's avatar
Yu Xiong committed
% 符号表可以参考\url{https://www.caam.rice.edu/~heinken/latex/symbols.pdf}。单位请参考\pkg{siunitx}。\pkg{siunitx}是一个更新频繁的包,可能会引发兼容性问题。
Yu Xiong's avatar
Yu Xiong committed
% 行内公式形如|$\mathrm{e}^{(a+2b)x}$|
%
% 带有编号的行间公式\env{equation}
% \begin{latexexample}[emph={[1]equation}]
Yu Xiong's avatar
Yu Xiong committed
%   \begin{equation}\label{eq:myeqlabel}
%       \pi
%   \end{equation}
% \end{latexexample}
% 如不需要编号,可以用 \env{equation*} 或者 |\[|\meta{公式}|\]|,请不要使用可能引发问题的 |$$|\meta{公式}|$$|\footnote{\url{https://tex.stackexchange.com/questions/503/why-is-preferable-to}}。
Yu Xiong's avatar
Yu Xiong committed
% 本模板也提供了一系列的数学环境。
% 全部预定义的数学环境如表~\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{latexexample}
Yu Xiong's avatar
Yu Xiong committed
%   \begin{proof}
%       证明我是我
%   \end{proof}
% \end{latexexample}
Yu Xiong's avatar
Yu Xiong committed
% 普通环境。
% \begin{latexexample}
Yu Xiong's avatar
Yu Xiong committed
%   \begin{definition}[他人]
%       定义他人即地狱
%   \end{definition}
% \end{latexexample}
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{引用}
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{\cref}
%   \begin{syntax}
%     \tn{cref}\Arg{标签}
%   \end{syntax}
Yu Xiong's avatar
Yu Xiong committed
% 使用 \pkg{cleveref} 宏包实现了带图、表等项目名称的智能引用。
Yu Xiong's avatar
Yu Xiong committed
% \end{function}
%
% \begin{function}{\href,\url}
Yu Xiong's avatar
Yu Xiong committed
%   \begin{syntax}
%     \tn{href}\Arg{链接}\Arg{名称}
%     \tn{url}\Arg{链接}
Yu Xiong's avatar
Yu Xiong committed
%   \end{syntax}
Yu Xiong's avatar
Yu Xiong committed
% 超链接。\tn{href} 会将特定字符显示为可点击的超链接,\tn{url} 会输出可点击的链接原文。
Yu Xiong's avatar
Yu Xiong committed
% \end{function}
Yu Xiong's avatar
Yu Xiong committed
% 
% \subsection{特殊页面}
% 本模板还提供一系列命令与环境用于生成所需的特殊页面。
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{封面}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{\maketitle}
% 用于生成封面。
Yu Xiong's avatar
Yu Xiong committed
% 本科生仅会生成中文封面;研究生会生成中英文封面。
Yu Xiong's avatar
Yu Xiong committed
% 如果选择了 \opt{nlcover},仅会生成研究生的国家图书馆封面和原创性声明页。
Yu Xiong's avatar
Yu Xiong committed
% \end{function}
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{摘要页}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.11}{2021/10/01}{简化了摘要的编写方式。}
% \begin{function}{abstract,abstract*}
% 摘要。带星号的会生成英文摘要。
% \end{function}
%
% \begin{latexexample}[emph={[1]abstract,abstract*}]
Yu Xiong's avatar
Yu Xiong committed
%   \begin{abstract}
%       我的中文摘要
%   \end{abstract}
%
%       Abstract in English
% \end{latexexample}
Yu Xiong's avatar
Yu Xiong committed
%
%
% \subsubsection{前言页}
% \begin{function}{preface}
% 使用 \env{preface} 环境定义。
Yu Xiong's avatar
Yu Xiong committed
% \end{function}
% \begin{latexexample}[emph={[1]preface,flushright}]
Yu Xiong's avatar
Yu Xiong committed
%   \begin{preface}
%       我的前言
%       \vspace{1cm}
%       \begin{flushright}
%       我的名字\\
%       时间地点
%       \end{flushright}
Yu Xiong's avatar
Yu Xiong committed
%   \end{preface}
% \end{latexexample}
% \subsubsection{目录页}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{\tableofcontents,\listoffigures,\listoftables}
% 分别生成目录\footnote{一说应该使用“目次”这一称呼。}、图片清单和表格清单。
Yu Xiong's avatar
Yu Xiong committed
% \end{function}
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{致谢页}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{acknowledgement}
% 同前言,使用 \env{acknowledgement} 环境。
Yu Xiong's avatar
Yu Xiong committed
% \end{function}
% \begin{latexexample}[emph={[1]acknowledgement}]
Yu Xiong's avatar
Yu Xiong committed
%   \begin{acknowledgement}
%       感谢NJU LUG
%   \end{acknowledgement}
% \end{latexexample}
Yu Xiong's avatar
Yu Xiong committed
%
%
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{附录页}
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{\appendix}
% 附录放在本命令后,以英文字母进行编号,编写方式同正文
% \end{function}
% 
% \subsubsection{成果列表}
%
% \begin{function}{\njupaperlist,\njupaperlist*}
%   \begin{syntax}
%     \tn{njupaperlist}\Arg{文献}
%   \end{syntax}
Yu Xiong's avatar
Yu Xiong committed
% 成果列表,分别为发表文章目录与合作文章目录。\Arg{文献} 的填写方式同 \tn{cite},多个文献需要使用英文半角逗号隔开。
Yu Xiong's avatar
Yu Xiong committed
%
% \subsection{参考文献}
%
% 符合GB7714-2015规范。使用\hologo{biber}作为后端。需要使用 |biber| 命令手动编译才会显示
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{\addbibresource}
%   \begin{syntax}
%     \tn{addbibresource}\Arg{文件}
%   \end{syntax}
% 添加参考文献源文件。
Yu Xiong's avatar
Yu Xiong committed
% \end{function}
% 示例参考文献存储于 \file{njuthesis-sample.bib},直接向其中粘贴新的参考文献即可。如果希望额外添加参考文献列表,可以在导言区中多次调用 \tn{addbibresource} 命令。注意本命令与 |\bibliography{bibfile1,bibfile2}| 不同,不可以用逗号分隔多个输入文件,且必须使用带扩展名的完整文件名。
% \begin{function}{\printbibliography}
% 生成参考文献列表页面。
% \end{function}
Yu Xiong's avatar
Yu Xiong committed
%
%
% \subsubsection{文段内引用}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{function}{\cite,\citeauthor,\citeyear}
%   \begin{syntax}
%     \tn{cite}\Arg{文献}
%     \tn{citeauthor}\Arg{文献}
%     \tn{citeyear}\Arg{文献}
%   \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}文件。
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{视觉识别系统}
%
% 视觉识别系统 \pkg{njuvisual} 现已被分离为独立宏包,基本使用方法举例如下:
% \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{latexexample}
% 本宏包的详细使用方法请参考其\href{http://mirrors.ctan.org/macros/latex/contrib/njuvisual/njuvisual.pdf}{说明文档}。
Yu Xiong's avatar
Yu Xiong committed
%
% \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}}}}
%
% \subsection*{书籍}
Yu Xiong's avatar
Yu Xiong committed
%
% \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}
%
Yu Xiong's avatar
Yu Xiong committed
%
% \subsection*{宏包、模版}
Yu Xiong's avatar
Yu Xiong committed
%
% \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}
%
Yu Xiong's avatar
Yu Xiong committed
% \end{thebibliography}
%
%
Yu Xiong's avatar
Yu Xiong committed
% \section{代码实现}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.10}{2021/09/26}{对代码实现部分进行了整理。}
%
% 本模板使用 \hologo{LaTeX3} 语法编写,依赖 \pkg{expl3} 环境,
% 并需调用 \pkg{l3packages} 中的相关宏包。
%
% 以下代码中有一些形如 |<*class>|
% 的标记,这是 \pkg{DocStrip} 中的“guard”,用来选择性地提取文件。
% “|*|”和“|/|”分别表示该部分的开始和结束。不含
% “|*|”和“|/|”的 guard 出现在行号右侧,它们用来确定
% 单独一行代码的归属。这些 guard 的颜色深浅不一,用以明确嵌套关系。
%
% 另有若干包含 |@@| 的guard,用以表示名空间(模块)。
% 在删除注释生成格式文件时,变量名称中的 |@@| 会被等号后的字段替换,
% 譬如在本模板 \cls{njuthesis} 中 |@@=nju|。
% \subsection{准备}
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%<*class>
Yu Xiong's avatar
Yu Xiong committed
%<@@=nju>
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% \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 }
  {
Yu Xiong's avatar
Yu Xiong committed
    Package~ "#1"~ is~ too~ old. \\
    Please~ update~ an~ up-to-date~ version~ of~
    the~ bundles "l3kernel"~ and~ "l3packages"~
Yu Xiong's avatar
Yu Xiong committed
    using~ your~ TeX~ package~ manager~ or~ from~ \\
Yu Xiong's avatar
Yu Xiong committed
    CTAN.
\clist_map_inline:nn { xtemplate, l3keys2e }
    \@ifpackagelater {#1} { 2020/10/01 }
      { } { \msg_error:nnn { njuthesis } { l3-too-old } {#1} }
  }

%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% 目前 \cls{njuthesis} 仅支持 \hologo{XeTeX} 和 \hologo{LuaTeX}。
%    \begin{macrocode}
\msg_new:nnn { njuthesis } { unsupported-engine }
  {
Yu Xiong's avatar
Yu Xiong committed
    The~ njuthesis~ class~ requires~ either~ 
    XeTeX~ or~ LuaTeX. \\
    "#1"~ is~ not~ supported~ at~ present.~ 
    You~ must~ change your~ typesetting~ engine~
Yu Xiong's avatar
Yu Xiong committed
    to~ "xelatex"~ or~ "lualatex".
  }
\sys_if_engine_xetex:F
  {
    \sys_if_engine_luatex:F
      {
        \msg_fatal:nnx { njuthesis } { unsupported-engine }
          { \c_sys_engine_str }
      }
  }
%    \end{macrocode}
%
% \subsection{定义变量}
%
% l代表局部变量,g代表全局变量。
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{variable}{\l_@@_tmp_box,\l_@@_tmp_clist,\l_@@_tmp_dim,
%   \l_@@_tmp_int,\l_@@_tmp_seq,\l_@@_tmp_tl}
% 临时变量。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\box_new:N   \l_@@_tmp_box
\clist_new:N \l_@@_tmp_clist
\dim_new:N   \l_@@_tmp_dim
Yu Xiong's avatar
Yu Xiong committed
\int_new:N   \l_@@_tmp_int
\seq_new:N   \l_@@_tmp_seq
\tl_new:N    \l_@@_tmp_tl
% \end{variable}
Yu Xiong's avatar
Yu Xiong committed
% \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}
% 用于存储学位名称的变量。
Yu Xiong's avatar
Yu Xiong committed
\int_new:N \l_@@_info_degree_int
\tl_new:N  \l_@@_info_degree_tl
\int_new:N \l_@@_info_diploma_int
Yu Xiong's avatar
Yu Xiong committed
\tl_new:N  \l_@@_info_diploma_tl
\int_new:N \l_@@_info_type_int
\tl_new:N  \l_@@_info_type_tl
% \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}
% 用于存储导师姓名加职称的变量。
\tl_new:N \l_@@_info_supv_full_tl
\tl_new:N \l_@@_info_supv_full_en_tl
% \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}
%
Yu Xiong's avatar
Yu Xiong committed
% \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
  { Bachelor, Master, Master, Doctor~of~Philosophy }
%    \end{macrocode}
% \end{variable}
%
% \subsection{内部函数}
% \begin{macro}{\@@_quad:,\@@_qquad:}
% 等价于 \LaTeXe{} 中的 \tn{quad} 和 \tn{qquad}。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new:Nn \@@_quad:  { \skip_horizontal:n { 1 em } }
\cs_new:Nn \@@_qquad: { \skip_horizontal:n { 2 em } }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_vskip:,\@@_hskip:}
% 生成一个较小的 skip。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new:Nn \@@_vskip: { \skip_vertical:n   { 1   ex } }
\cs_new:Nn \@@_hskip: { \skip_horizontal:n { 0.3 em } }
Yu Xiong's avatar
Yu Xiong committed
%    \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} }
\cs_new_protected:Npn \@@_define_name:nnn #1#2#3
  {
    \tl_const:cn { c_@@_name_ #1    _tl } {#2}
    \tl_const:cn { c_@@_name_ #1 _en_tl } {#3}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_name:n,\@@_info:n}
Yu Xiong's avatar
Yu Xiong committed
% 根据变量名调用名称和内容信息。
\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
    \mode_leave_vertical:
    \rule [ -0.5 ex ] { #1 } { 0.4 pt }
    \skip_horizontal:n { -#1 }
    \hbox_to_wd:nn {#1} { \hfil #2 \hfil }
%    \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
    \mode_leave_vertical:
    \hbox_to_wd:nn {#1}
      { #2 \tl_map_inline:xn {#3} { ##1 \hfil } \unskip }
% \end{macro}
% \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{macro}{\@@_put_inempty_seg:nnn}
% 将固定长度的非空字符串插入 |clist|。
% \begin{arguments}
%   \item 原始字符串
%   \item 起始位置
%   \item 长度
% \end{arguments}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_put_inempty_seg:nnn #1#2#3
  {
Yu Xiong's avatar
Yu Xiong committed
    \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{macro}
% \begin{macro}{\@@_uline:n}
% 指定宽度的下划线。
% \begin{arguments}
%   \item 宽度,|dim| 型变量
% \end{arguments}
%    \begin{macrocode}
\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{macro}
% \begin{macro}{\@@_uuline:n}
% 指定宽度的双层下划线。
% \begin{arguments}
%   \item 宽度,|dim| 型变量
% \end{arguments}
Yu Xiong's avatar
Yu Xiong committed
%    \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 }
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_get_text_width:Nn,\@@_get_text_width:NV}
% 获取文本宽度。
% \begin{arguments}
%   \item 存储宽度的 |dim| 型变量
%   \item 文本
% \end{arguments}
% 将内容放入 \tn{hbox} 后读取其宽度,存入 |dim| 型变量。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new:Npn \@@_get_text_width:Nn #1#2
  {
Yu Xiong's avatar
Yu Xiong committed
    \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 }
Yu Xiong's avatar
Yu Xiong committed
%    \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}{进行了效率优化。}
% 学位信息的设置
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\keys_define:nn { nju }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% \begin{macro}{degree}
% 学位类型。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
    degree     .choices:nn = { ug, mg, mf, phd }
Yu Xiong's avatar
Yu Xiong committed
      { \int_set_eq:NN \l_@@_info_degree_int \l_keys_choice_int  
        \tl_set:Nn \l_@@_info_degree_tl
Yu Xiong's avatar
Yu Xiong committed
          { \clist_item:Nn \c_@@_name_degree_clist { \l_@@_info_degree_int } }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% 进行学位的判断。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
        \int_compare:nTF { \l_@@_info_degree_int == 1 }
          { \tl_set:Nn \l_@@_info_diploma_tl { ug } }
          { \tl_set:Nn \l_@@_info_diploma_tl { g  } } },
Yu Xiong's avatar
Yu Xiong committed
    degree     .initial:n  = ug,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{type}
% 论文类型。\cs{l_keys_choice_int} 需要被展开以获取正确的序号。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
    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 
Yu Xiong's avatar
Yu Xiong committed
          { \tl_use:c { c_@@_name_ \l_@@_info_diploma_tl _tl } } },
    type       .initial:n    = thesis,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{nlcover}
Yu Xiong's avatar
Yu Xiong committed
% 是否需要国家图书馆封面(仅对研究生有效,默认关闭)。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
    nlcover   .bool_set:N  = \g_@@_nlcover_bool,
    nlcover    .initial:n  = false,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed

% \begin{macro}{draft}
% \changes{v0.13}{2021/12/15}{新增草稿模式选项。}
% 是否开启草稿模式(默认关闭)。
%    \begin{macrocode}
    draft     .bool_set:N  = \g_@@_draft_bool,
    draft      .initial:n  = false,
%    \end{macrocode}
% \begin{macro}{latin-font,cjk-font}
% \changes{v0.13}{2021/12/12}{简化字体选项名称。}
Yu Xiong's avatar
Yu Xiong committed
% 定义字体选项
%    \begin{macrocode}
    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 },
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
% 在定义完全部设置以后从导言区输入参数。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\ProcessKeysOptions { nju }
%    \end{macrocode}
%
%
% \subsection{配置常量}
% TODO: 分离为单独文件
% 通用默认名称。注意空格是忽略掉的。
%    \begin{macrocode}
\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}
Yu Xiong's avatar
Yu Xiong committed
\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  } { 摘要首页用纸       },
Yu Xiong's avatar
Yu Xiong committed
        { 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{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{个人信息}
Yu Xiong's avatar
Yu Xiong committed
% 输入个人信息的区域。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\keys_define:nn { nju } { info.meta:nn = { nju / info } { #1 } }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
%    \begin{macrocode}
\keys_define:nn { nju / info }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% \begin{macro}{info/title,info/title*}
Yu Xiong's avatar
Yu Xiong committed
% 题目。以下标注星号(*)的为对应的英文字段。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    title               .tl_set:N = \l_@@_info_title_tl,
    title              .initial:n = { 空 },
    title*              .tl_set:N = \l_@@_info_title_en_tl,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{info/keywords,info/keywords*}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.11}{2021/10/01}{修改了添加关键词的方式。}
Yu Xiong's avatar
Yu Xiong committed
% 关键词列表。
    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*}
Yu Xiong's avatar
Yu Xiong committed
% 年级、学号、姓名。
Yu Xiong's avatar
Yu Xiong committed
%    \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,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
% \begin{macro}{info/department,info/department*,info/major,info/major*,info/field,info/field*}
Yu Xiong's avatar
Yu Xiong committed
% 院系、专业、方向。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    department          .tl_set:N = \l_@@_info_dept_tl,
    department*         .tl_set:N = \l_@@_info_dept_en_tl,
    major               .tl_set:N = \l_@@_info_major_tl,
    major*              .tl_set:N = \l_@@_info_major_en_tl,
    field               .tl_set:N = \l_@@_info_field_tl,
    field*              .tl_set:N = \l_@@_info_field_en_tl,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
% \begin{macro}{info/supervisor,info/supervisor*,info/supervisor-title,info/supervisor-title*}
% \changes{v0.13}{2021/12/11}{修改了导师键值对的变量名称。}
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    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,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{info/supervisor-ii,info/supervisor-ii*,info/supervisor-ii-title,info/supervisor-ii-title*}
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    supervisor-ii       .tl_set:N = \l_@@_info_supv_ii_tl,
    supervisor-ii*      .tl_set:N = \l_@@_info_supv_ii_en_tl,
Yu Xiong's avatar
Yu Xiong committed
    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,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{info/submit-date,info/submit-date*}
Yu Xiong's avatar
Yu Xiong committed
% 提交日期
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    submit-date         .tl_set:N = \l_@@_info_sm_date_tl,
    submit-date*        .tl_set:N = \l_@@_info_sm_date_en_tl,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{info/defend-date,info/chairman,info/reviewer}
Yu Xiong's avatar
Yu Xiong committed
% 答辩信息。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    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,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{info/clc,info/secret-level,info/udc,info/supervisor-contact}
Yu Xiong's avatar
Yu Xiong committed
% 国家图书馆封面相关信息。
Yu Xiong's avatar
Yu Xiong committed
%    \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,
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\njusetup}
% \changes{v0.6}{2021/09/10}{改用键值对输入信息。}
% \changes{v0.11}{2021/10/01}{将个人信息变量名改为小写字母加连字符的形式。}
% 定义用于设置个人信息的命令
%    \begin{macrocode}
\NewDocumentCommand \njusetup { m } { \keys_set:nn { nju } { #1 } }
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \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
  {