Skip to content
Snippets Groups Projects
njuthesis.dtx 220 KiB
Newer Older
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_cover_bottom_nl:}
% 国家图书馆封面底部信息。
\cs_new_protected:Npn \@@_cover_bottom_nl:
    \@@_name:n { chairman } \@@_hskip:
    \@@_ulined_center_box:nn { 9 em } { \@@_info:n { chairman } } \\
    \@@_name:n { reviewer } \@@_hskip:
Yu Xiong's avatar
Yu Xiong committed
    \@@_multiline_box:nnnn { \l_@@_tmp_int }
      { \g_@@_info_reviewer_clist } { 4 } { 9 em }
%    \end{macrocode}
% \end{macro}
%
% \subparagraph{出版授权书}
%
% \begin{macro}{authdecl/g/title}
% 出版授权书标题实例。
%    \begin{macrocode}
\@@_declare_element:nn { authdecl / g / title }
  {
    content     = \g_@@_name_authdecl_tl,
    format      = \g_@@_fmt_chapter_tl,
    bottom-skip = 3 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{authdecl/g/text}
% 出版授权书文本实例。
%    \begin{macrocode}
\@@_declare_element:nn { authdecl / g / text }
  {
    content     = \g_@@_text_authdecl_tl,
    align       = n,
    bottom-skip = 2 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{authdecl/g/sign}
% 出版授权书签名区实例。
%    \begin{macrocode}
\@@_declare_element:nn { authdecl / g / sign }
  {
    content     = \@@_authdecl_sign_g:,
    align       = r,
    bottom-skip = 0pt plus 1 fill
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{authdecl/g/info}
% 出版授权书信息表格实例。
%    \begin{macrocode}
\@@_declare_element:nn { authdecl / g / info }
  {
    content     = \@@_authdecl_info_g:,
    format      = \zihao { 5 } ,
    align       = l,
    bottom-skip = 2 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{authdecl/g/date}
% 出版授权书保密信息实例。
%    \begin{macrocode}
\@@_declare_element:nn { authdecl / g / date }
  {
    content     = \@@_authdecl_secretlv_g:,
    format      = \zihao { 5 } ,
    align       = l
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_degree_checkbox:n}
% 信息栏的学位复选框。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_degree_checkbox:n #1
  {
    \int_compare:nNnTF { #1 } { = } { \g_@@_info_degree_int }
      {
        \makebox [ 0   pt ] [l] { \ensuremath { \mdwhtsquare } }
        \hspace  { 0.1 em }       \ensuremath { \checkmark   }
      }
      { \ensuremath { \mdwhtsquare } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_authdecl_info_g:}
% 信息栏内容。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_authdecl_info_g:
  {
    \begin{tblr}
      {
        hlines, vlines, hspan=minimal,
        colspec = {cX[c]cX[c]cX[c]},
        cell{1}{2} = {c=5}{m}, cell{3}{2} = {c=5}{m},
        cell{4}{2} = {c=5}{m}, cell{5}{2} = {c=5}{m}
      }
      \g_@@_name_title_c_tl  & \g_@@_info_title_tl \\
      \g_@@_name_id_a_tl     & \g_@@_info_id_tl    &
      \g_@@_name_dept_a_tl   & \g_@@_info_dept_tl  &
      \g_@@_name_year_tl     &
        \tl_range:Nnn \g_@@_info_submitdate_raw_tl {1} {4} \\
      \g_@@_name_degree_a_tl &
        {
          \@@_degree_checkbox:n { 2 } 学术学位硕士 \qquad{}
          \@@_degree_checkbox:n { 3 } 专业学位硕士 \\
          \@@_degree_checkbox:n { 4 } 学术学位博士 \qquad{}
          \@@_degree_checkbox:n { 5 } 专业学位博士
        } \\
      \g_@@_name_email_tl    & \g_@@_info_email_tl \\
      \g_@@_name_supv_b_tl   &
        \clist_item:Nn \g_@@_info_supv_clist    {1}
        \clist_item:Nn \g_@@_info_supv_ii_clist {1} \\
    \end{tblr}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_authdecl_sign_g:}
% 签名区内容。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_authdecl_sign_g:
  {
    \g_@@_name_authsign_tl \par
    \g_@@_name_blankdate_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_authdecl_secretlv_g:}
% 保密信息内容。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_authdecl_secretlv_g:
  {
    \g_@@_name_secretstatus_tl \par
    \ensuremath { \mdwhtsquare } \g_@@_name_secretfree_tl \par
    \ensuremath { \mdwhtsquare } \g_@@_name_secretdate_tl
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{绘制封面}
% \changes{v0.13}{2021/12/10}{使用 \hologo{LaTeX3} 语法重构本科生封面。}
% \changes{v0.13}{2021/12/11}{使用 \hologo{LaTeX3} 语法重构研究生封面。}
% \changes{v0.13}{2021/12/12}{使用 \hologo{LaTeX3} 语法重构国家图书馆封面。}
% \changes{v0.15}{2022/01/25}{将封面页面封装为对象。}
% 定义封面页面的具体配置参数。
%
% \begin{macro}{cover-ug-default}
% 默认本科生封面实例。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\@@_declare_page:nn { cover-ug-default }
    element     = { emblem-img, name-img, title, info },
    prefix      = cover / ug /,
    bottom-skip = 0.5 cm plus 1.5 fill
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{cover-g-front-default}
% 默认研究生普通封面正面实例。
%    \begin{macrocode}
\@@_declare_page:nn { cover-g-front-default }
    element  = { emblem-img, name-img, type, degree, info, date },
    prefix   = cover / g /,
    format   = \zihao { 3 } \kaishu,
    top-skip = 1.5 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{cover-g-back-default}
% 默认研究生普通封面背面实例。
%    \begin{macrocode}
\@@_declare_page:nn { cover-g-back-default }
  {
    element  = { back },
    prefix   = cover / g /,
    format   = \zihao { 3 } \kaishu,
    top-skip = 20 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{cover-g-en-default}
% 默认研究生英文封面实例。
%    \begin{macrocode}
\@@_declare_page:nn { cover-g-en-default }
    element  = { title, top, middle, emblem-img, bottom },
    prefix   = cover / g / en /,
    top-skip = 0 pt plus 1.2 fil
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{cover-nl-default}
% 默认国家图书馆封面实例。
%    \begin{macrocode}
\@@_declare_page:nn { cover-nl-default }
    element = { top, name, title, middle, bottom, date },
    prefix  = cover / nl /,
    format  = \kaishu
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{authdecl-g-default}
% 默认出版授权书实例。
%    \begin{macrocode}
\@@_declare_page:nn { authdecl-g-default }
  {
    element     = { title, text, sign, info, date },
    prefix      = authdecl / g /,
    top-skip    = 1 cm,
    bottom-skip = 0.5 cm plus 1.5 fill
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_make_cover:}
% 生成本科生或研究生的普通封面。
%    \begin{macrocode}
%<*(definition-ug|definition-g)>
\cs_new_protected:Npn \@@_make_cover:
%<definition-ug>    \UseInstance { nju } { cover-ug-default }
%<definition-g>    \clist_map_inline:nn { front, back, en }
%<definition-g>      { \UseInstance { nju } { cover-g- ##1 -default } }
  }
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_make_cover_nl:}
% 生成研究生的国家图书馆封面。
%    \begin{macrocode}
%<definition-g>\cs_new_protected:Npn \@@_make_cover_nl:
%<definition-g>  { \UseInstance { nju } { cover-nl-default } }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_make_origdecl: }
% \changes{v0.13}{2021/12/15}{加入本科生的诚信承诺书。}
% 生成本科生的诚信承诺书或研究生的学位论文原创性声明。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_make_origdecl:
    \chapter* { \g_@@_name_origdecl_tl }
    \thispagestyle { empty }
    \g_@@_text_origdecl_tl
    \vfil
    \begin{flushright}
%<definition-ug>      \clist_map_inline:nn { origsign, id, origdate }
%<definition-g>      \clist_map_inline:nn { origsign,     origdate }
        { \@@_vskip: \@@_name:n { ##1 } : \@@_uline:n { 7 em } }
    \end{flushright}
    \vfil
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_make_authdecl: }
% \changes{v0.17}{2022/04/04}{加入研究生的学位论文出版授权书。}
% 生成研究生的学位论文出版授权书。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_make_authdecl:
  {
%<definition-ug>      \prg_do_nothing:
%<*definition-g>
    \thispagestyle{empty}
    \UseInstance { nju } { authdecl-g-default }
    \cleardoublepage
%</definition-g>
  }
%</(definition-ug|definition-g)>
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
%
% \subsubsection{用户接口}
%
% \begin{macro}{\@@_new_img_cmd:nn,\@@_new_img_cmd:nV}
% 用于定义插入图片命令的辅助函数。
%    \begin{macrocode}
%<*class>
\cs_new_protected:Npn \@@_new_img_cmd:nn #1#2
  {
    \exp_args:Nc \NewDocumentCommand { #1 } { o m m }
      { \includegraphics [ width = ##2, height = ##3 ] { #2 } }
  }
\cs_generate_variant:Nn \@@_new_img_cmd:nn { nV }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\keys_define:nn { nju / style }
  {
%    \end{macrocode}
% \begin{macro}{style/emblem-img,\njuemblem}
% \changes{v0.14}{2021/12/23}{提供选择外置校徽图片的接口。}
% 校徽图片路径。
%    \begin{macrocode}
    emblem-img .code:n =
      { \@@_new_img_cmd:nV { njuemblem } \l_keys_value_tl },
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{style/name-img,\njuname}
% \changes{v0.14}{2021/12/23}{提供选择外置校名图片的接口。}
% 校名图片路径。
%    \begin{macrocode}
    name-img   .code:n =
      { \@@_new_img_cmd:nV { njuname   } \l_keys_value_tl }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.16}{2022/02/22}{不再默认载入 \pkg{njuvisual}。}
% 检查 \cs{njuemblem} 和 \cs{njuname} 命令是否有定义。
%    \begin{macrocode}
\msg_new:nnn { njuthesis } { missing-image }
  {
    Local~ images~ not~ designated.\\
    It~ seems~ that~ you~ haven't~ fill~ in~ both~
    "style/emblem-img"~ and~ "style/name-img",~
    therefore~ I~ am~ using~ package~ "njuvisual"~
    instead,~ which~ may~ slow~ down~ the~ compilation.
  }
\ctex_at_end_preamble:n
  {
%    \end{macrocode}
% 如果校名、校徽图片其中之一的路径未被定义,
% 则全盘使用 \pkg{njuvisual} 提供的绘制命令。
%    \begin{macrocode}
    \bool_lazy_and:nnF
      { \cs_if_exist_p:N \njuemblem }
      { \cs_if_exist_p:N \njuname   }
      {
        \cs_undefine:N \njuemblem
        \cs_undefine:N \njuname
        \msg_warning:nn { njuthesis } { missing-image }
        \RequirePackage { njuvisual }
      }
  }
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\maketitle}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.12}{2021/12/01}{仅会生成国家图书馆封面或者普通封面之一。}
% \changes{v0.13}{2021/12/12}{重新绘制封面。}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.13}{2021/12/15}{草稿模式下不绘制封面。}
% 重定义 \cs{maketitle} 以生成封面。
Yu Xiong's avatar
Yu Xiong committed
% 在草稿模式下,封面绘制将被禁用,有助于提升编译速度。
%    \begin{macrocode}
\RenewDocumentCommand \maketitle { }
  {
Yu Xiong's avatar
Yu Xiong committed
    \bool_if:NF \g_@@_draft_bool
      {
        \pagenumbering { gobble }
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% 如果在研究生模板中选择了 \opt{nlcover},就生成用于申请学位的国家图书馆封面,
% 反之生成普通封面。
%    \begin{macrocode}
        \bool_if:NTF \g_@@_nlcover_bool
          { \@@_make_cover_nl: }
          { \@@_make_cover:    }
Yu Xiong's avatar
Yu Xiong committed
      }
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% 生成封面后清除标题中的换行控制符,便于在摘要中输出。
%    \begin{macrocode}
    \tl_remove_all:Nn \g_@@_info_title_tl { \\ }
%    \end{macrocode}
% 如果在选择了 \opt{decl-page},就生成本科生的诚信承诺书,
% 或研究生的原创性声明和出版授权书。
%    \begin{macrocode}
\bool_if:NF \g_@@_draft_bool
  {
    \bool_if:NT \g_@@_decl_bool
      {
        \@@_make_origdecl:
        \AtEndEnvironment { document }
          { \@@_make_authdecl: }
      }
%    \end{macrocode}
% 在标题页后使用大写罗马字母页码,恢复正常字体设置。
%    \begin{macrocode}
    \cleardoublepage
    \exp_args:NV \pagestyle \c_@@_pagestyle_tl
Yu Xiong's avatar
Yu Xiong committed
    \pagenumbering { Roman }
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
%
% \subsection{摘要页}
Yu Xiong's avatar
Yu Xiong committed
%
% \subsubsection{绘制部件}
% \changes{v0.16}{2022/03/02}{将摘要部件分离到 \file{.def} 文件。}
% \changes{v0.16}{2022/03/02}{使用 \pkg{xtemplate} 重构摘要。}
%
% \begin{macro}{abstract/title}
% 中文摘要标题实例。
%    \begin{macrocode}
%<*(definition-ug|definition-g)>
\@@_declare_element:nn { abstract / title }
  {
    content     = \@@_abs_title:V \g_@@_name_abstracttitle_tl,
    format      = \bfseries \kaishu \zihao { -2 },
    bottom-skip = 1.2 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{abstract/info}
% 中文摘要信息栏实例。
%    \begin{macrocode}
\@@_declare_element:nn { abstract / info }
  {
%<definition-ug>    content     = \@@_abs_info_ug:nn { } { : },
%<definition-g>    content     = \@@_abs_info_g:n       { : },
%<definition-ug>    format      = \zihao { -4 } \kaishu,
%<definition-g>    format      = \zihao {  4 } \kaishu,
%<definition-ug>    bottom-skip = 1 cm,
%<definition-g>    bottom-skip = 2 cm,
    align       = l
  }
%    \end{macrocode}
% \end{macro}
% \begin{macro}{abstract/en/title}
% 英文摘要标题实例。
%    \begin{macrocode}
\@@_declare_element:nn { abstract / en / title }
  {
    content     = \@@_abs_title:V \g_@@_name_abstracttitle_en_tl,
    format      = \bfseries \kaishu \zihao { -2 },
    bottom-skip = 1.2 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{abstract/en/info}
% 英文摘要信息栏实例。
%    \begin{macrocode}
\@@_declare_element:nn { abstract / en / info }
  {
%<definition-ug>    content     = \@@_abs_info_ug:nn { _en } { :~ },
%<definition-g>    content     = \@@_abs_info_en_g:n        { :~ },
%<definition-ug>    format      = \zihao { -4 },
%<definition-g>    format      = \zihao {  4 },
%<definition-ug>    bottom-skip = 1 cm,
%<definition-g>    bottom-skip = 2 cm,
    align       = l
  }
%</(definition-ug|definition-g)>
%    \end{macrocode}
% \end{macro}
% \paragraph{本科生}
% \changes{v0.13}{2021/12/12}{使用 \hologo{LaTeX3} 语法重构本科生摘要。}
% \begin{macro}{\@@_abs_info_ug:nn}
% 绘制本科生摘要信息栏。
% \begin{arguments}
%   \item 语言,空置为中文,|_en| 为英文
%   \item 分隔符
% \end{arguments}
% 本科生摘要页面不含下划线,因而不用确定文本宽度,绘制命令较为简单。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_abs_info_ug:nn #1#2
%    \end{macrocode}
% 确定标题类型。
%    \begin{macrocode}
    \tl_if_blank:eTF { #1 }
      { \g_@@_name_title_tl }
      { \clist_item:Nn \g_@@_name_type_en_clist { \g_@@_info_type_int } }
    #2 \tl_use:c { g_@@_info_title #1 _tl } \\
%    \end{macrocode}
% 由于作者姓名使用的字样发生了变动,这里进行替换以便嵌入循环。
%    \begin{macrocode}
    \tl_set_eq:NN \g_@@_name_author_tl \g_@@_name_author_a_tl
%    \end{macrocode}
% 使用循环输出院系、专业、作者、导师信息。
%    \begin{macrocode}
    \clist_map_inline:nn { dept, major, author, supvfull }
      { \@@_name:n { ##1 #1 } #2 \@@_info:n { ##1 #1 } \\ }
    \@@_name:n { abstract #1 } #2
  }
%    \end{macrocode}
% \end{macro}
%
% \paragraph{研究生}
% \changes{v0.13}{2021/12/12}{使用 \hologo{LaTeX3} 语法重构研究生摘要。}
% \begin{macro}{abstract/mark}
% 英文摘要标题实例。
%    \begin{macrocode}
\@@_declare_element:nn { abstract / mark }
  {
    content     = \g_@@_name_abstract_b_tl,
    format      = \sffamily \zihao { -3 },
    bottom-skip = 1 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{abstract/en/mark}
% 英文摘要标题实例。
%    \begin{macrocode}
\@@_declare_element:nn { abstract / en / mark }
  {
    content     = \g_@@_name_abstract_b_en_tl,
    format      = \sffamily \zihao { -3 },
    bottom-skip = 1 cm
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_abs_info_g:n}
% 绘制研究生中文摘要信息栏。
% \begin{arguments}
%   \item 分隔符
% \end{arguments}
% 研究生中文摘要页包括下划线以及若干特殊的对齐方式,实现方式较为繁琐。使用 \cs{@@_full_uline:NV} 确定内容宽度后,调用 \cs{@@_uline:n} 或 \cs{@@_ulined_center_box:nn} 命令以绘制横穿页面的下划线。前两行为标题。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_abs_info_g:n #1
    \@@_uline_list:xnn
        \clist_item:Nn \g_@@_name_type_clist { \g_@@_info_type_int }
        \g_@@_name_title_a_tl #1
      { \g_@@_info_title_tl } { \g_@@_abs_title_left_skip }
%    \end{macrocode}
% 专业、年级、姓名。
%    \begin{macrocode}
    \@@_full_uline:NV \l_@@_tmpa_dim
        \@@_ulined_center_box:nn { 11 em } { \g_@@_info_major_tl }
        \g_@@_name_major_a_tl
        \@@_ulined_center_box:nn { 4  em } { \g_@@_info_grade_tl }
        \g_@@_name_grade_tl \g_@@_name_author_a_tl #1
    \@@_ulined_center_box:nn { \l_@@_tmpa_dim }
      { \g_@@_info_author_tl } \\
%    \end{macrocode}
% 导师姓名、职称。
%    \begin{macrocode}
    \@@_full_uline:NV \l_@@_tmpa_dim
      { \g_@@_name_supv_a_tl #1 }
    \@@_ulined_center_box:nn { \l_@@_tmpa_dim }
      { \g_@@_info_supvfull_tl }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_abs_info_en_g:n}
% 绘制研究生英文摘要信息栏。
% \begin{arguments}
%   \item 分隔符
% \end{arguments}
% 前两行为标题。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_abs_info_en_g:n #1
  {
    \@@_uline_list:xnn { \g_@@_info_type_en_tl #1 }
        { \g_@@_info_title_en_tl } { \g_@@_abs_title_left_skip }
%    \end{macrocode}
% 使用循环输出专业、姓名、导师。注意这里将 |\\| 放置在前部,
% 以避免末尾生成多余的换行符产生 |Underfull \vbox| 信息。
%    \begin{macrocode}
    \clist_map_inline:nn { major, author, supvfull }
        \@@_uline_entry:Nnnn \l_@@_tmpa_dim
          { ##1 _en } { ##1 _en } { #1 } \par
%    \end{macrocode}
% \end{macro}
% \paragraph{关键词列表}
%
% \begin{macro}{\@@_print_keywords:nn}
% \changes{v0.15}{2022/01/26}{为关键词列表添加悬挂缩进。}
% 生成中英文关键词列表。
% \begin{arguments}
%   \item 语言,空置为中文,|_en| 为英文
%   \item 关键词分隔符
% \end{arguments}
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_print_keywords:nn #1#2
  {
    \tl_set:Nv \l_@@_tmpa_tl { g_@@_name_keywords #1 _tl }
    \@@_get_text_width:NV \l_@@_tmpa_dim \l_@@_tmpa_tl
%    \end{macrocode}
% 关键词列表的悬挂缩进样式由 \tn{list} 环境产生。
%    \begin{macrocode}
    \list { \l_@@_tmpa_tl }
        \labelwidth  \l_@@_tmpa_dim
        \labelsep    \c_zero_dim
        \leftmargin  \c_zero_dim
        \rightmargin \c_zero_dim
        \advance \leftmargin \l_@@_tmpa_dim
%    \end{macrocode}
% 使用粗体作为标签样式。
%    \begin{macrocode}
        \cs_set_eq:NN \makelabel \textbf
      }
    \item \clist_use:cn { g_@@_info_keywords #1 _clist } { #2 }
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
% \subsubsection{绘制摘要}
% \changes{v0.16}{2022/03/26}{补上研究生摘要页面的小标题。}
% \begin{macro}{\@@_make_abstract:,\@@_make_abstract_en:}
% 绘制摘要页面。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
%<*(definition-ug|definition-g)>
\cs_new_protected:Npn \@@_make_abstract:
    \UseInstance { nju } { abstract / title }
    \UseInstance { nju } { abstract / info  }
%<definition-g>    \UseInstance { nju } { abstract / mark  }
\cs_new_protected:Npn \@@_make_abstract_en:
  {
    \UseInstance { nju } { abstract / en / title }
    \UseInstance { nju } { abstract / en / info  }
%<definition-g>    \UseInstance { nju } { abstract / en / mark  }
  }
%</(definition-ug|definition-g)>
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
%
%
% \subsubsection{用户接口}
%
% \begin{macro}{\g_@@_abs_title_left_skip}
% 研究生摘要标题左边距。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\skip_new:N \g_@@_abs_title_left_skip
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\keys_define:nn { nju / style }
%    \end{macrocode}
% \begin{macro}{style/abstract-in-toc}
% \changes{v0.15}{2022/02/04}{可选择摘要是否出现在目录中。}
% 是否将摘要添加到目录。
%    \begin{macrocode}
    abstract-in-toc      .bool_gset:N = \g_@@_abs_in_toc_bool,
    abstract-in-toc        .initial:n = true,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{style/abstract-title}
% \changes{v0.16}{2022/03/26}{可选择研究生摘要标题样式。}
% 选择摘要样式,默认为 \opt{strict}。
%    \begin{macrocode}
    abstract-title          .choice:,
    abstract-title / strict   .code:n =
      {
        \bool_gset_true:N  \g_@@_strict_abs_title_bool
        \skip_gset:Nn \g_@@_abs_title_left_skip { 1 em }
      },
    abstract-title / centered .code:n =
      {
        \bool_gset_true:N \g_@@_strict_abs_title_bool
        \skip_gset:Nn \g_@@_abs_title_left_skip { 0 pt plus 1 fill }
      },
    abstract-title / natural  .code:n =
      {
        \bool_gset_false:N \g_@@_strict_abs_title_bool
        \skip_gset:Nn \g_@@_abs_title_left_skip { 0 pt plus 1 fill }
      },
    abstract-title        .initial:n = strict
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
% \begin{environment}{abstract}
% \changes{v0.13}{2021/12/12}{重新绘制摘要。}
Yu Xiong's avatar
Yu Xiong committed
% 中文摘要环境。
%    \begin{macrocode}
\NewDocumentEnvironment { abstract } { +b }
Yu Xiong's avatar
Yu Xiong committed
  {
    \cleardoublepage
    \thispagestyle { plain }
    \@@_abs_bookmark:Vn \g_@@_name_abstract_a_tl { abstract }
    \@@_make_abstract:
Yu Xiong's avatar
Yu Xiong committed
    \group_begin: \kaishu \zihao { -4 } #1
  { \@@_print_keywords:nn { } { ; } \group_end: }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \end{environment}
% \begin{environment}{abstract*}
Yu Xiong's avatar
Yu Xiong committed
% 英文摘要环境。\pkg{xparse} 目前不支持合并带有星号的环境,因此需要单独定义。
%    \begin{macrocode}
\NewDocumentEnvironment { abstract* } { +b }
Yu Xiong's avatar
Yu Xiong committed
  {
    \cleardoublepage
    \thispagestyle { plain }
    \@@_abs_bookmark:Vn \g_@@_name_abstract_a_en_tl { abstract-en }
    \@@_make_abstract_en:
    \group_begin: \zihao { -4 } #1
  { \@@_print_keywords:nn { _en } { ;~ } \group_end: }
%    \end{macrocode}
% \end{environment}
Yu Xiong's avatar
Yu Xiong committed
%
% \subsection{前言致谢}
% \begin{environment}{preface}
% \begin{environment}{acknowledgement}
% 单独制作的前言致谢页。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\NewDocumentEnvironment { preface         } { +b }
  { \@@_chapter:V \g_@@_name_preface_tl         #1 } { }
\NewDocumentEnvironment { acknowledgement } { +b }
  { \@@_chapter:V \g_@@_name_acknowledgement_tl #1 } { }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \end{environment}
% \end{environment}
Yu Xiong's avatar
Yu Xiong committed
%
% \subsection{成果列表}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\njupaperlist}
% \changes{v0.10}{2021/09/29}{新增了成果列表页面。}
% \changes{v0.14}{2021/12/20}{成果列表中可突出指定作者姓名及年份。}
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\NewDocumentCommand \njupaperlist
  { O { \g_@@_name_paperlist_tl } m }
    \group_begin:
%    \end{macrocode}
% 修改姓名的显示方式,使被注解的姓名可被加粗下划线表示。
%    \begin{macrocode}
    \RenewDocumentCommand \mkbibnamegiven  { m }
      { \ifitemannotation { thesisauthor }
          { \njuline { \bf ##1 } } { ##1 } }
    \RenewDocumentCommand \mkbibnamefamily { m }
      { \ifitemannotation { thesisauthor }
          { \njuline { \bf ##1 } } { ##1 } }
%    \end{macrocode}
% 修改年份的显示方式,默认进行加粗。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
    \RenewDocumentCommand \mkbibdateshort { m m m }
      { \textbf { \thefield { ##1 } } }
Yu Xiong's avatar
Yu Xiong committed
      \nocite { #2 }
      \printbibliography [ heading = subbibliography, title = #1 ]
Yu Xiong's avatar
Yu Xiong committed
    \end{refsection}
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
% \subsection{符号表}
%
% \begin{macro}{\@@_notation_label:n}
% 左对齐的标签格式,用于符号表。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_notation_label:n #1 { #1 \hfil }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_make_notation:nn}
Yu Xiong's avatar
Yu Xiong committed
% 生成符号表。由于符号表只有符号和说明两列,相比于 \env{longtable} 环境,
% \env{description} 环境的语法更为简洁直观,且说明文字可以换行,因而此处使用
% \hologo{LaTeX2e} 的列表环境进行封装,定义和语法参见 \file{source2e.pdf} 中的
% File I \quad ltlists.dtx 一章。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_make_notation:nn #1#2
  {
    \dim_set:Nn \l_@@_tmpa_dim { \textwidth - #1 - #2 }
Yu Xiong's avatar
Yu Xiong committed
    \list { }
      {
%    \end{macrocode}
% \tn{list} 环境使用宽度固定的盒子制作标签,通过指定这个盒子的宽度
% \tn{labelwidth} 即可确定左侧标签区域的宽度。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
        \labelwidth #2
        \labelsep   \c_zero_dim
        \itemsep    \c_zero_dim
        \parsep     \c_zero_dim
%    \end{macrocode}
% 右侧说明文字区域的宽度无法直接指定,而是靠计算左右边距 \tn{leftmargin} 和
% \tn{rightmargin} 得到的。
%    \begin{macrocode}
        \leftmargin  .5\l_@@_tmpa_dim
Yu Xiong's avatar
Yu Xiong committed
        \rightmargin \leftmargin
        \advance \leftmargin #2
        \cs_set_eq:NN \makelabel \@@_notation_label:n
Yu Xiong's avatar
Yu Xiong committed
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{notation}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.15}{2022/01/17}{提供符号表环境。}
Yu Xiong's avatar
Yu Xiong committed
% 符号表环境。
% \begin{arguments}
%   \item 说明区域宽度,初始值为 10 em。说明宽度的调整更为常见,所以放在前面。
%   \item 符号区域宽度,初始值为 5 em
% \end{arguments}
%    \begin{macrocode}
\NewDocumentEnvironment { notation } { O { 10 em } O { 5 em } }
    \@@_chapter:V \g_@@_name_notation_tl
Yu Xiong's avatar
Yu Xiong committed
    \@@_make_notation:nn { #1 } { #2 }
  }
  { \endlist }
%    \end{macrocode}
% \end{environment}
%
% \begin{environment}{notation*}
% 带有星号的符号表不会插入目录。
%    \begin{macrocode}
\NewDocumentEnvironment { notation* } { O { 10 em } O { 5 em } }
  {
    \chapter * { \g_@@_name_notation_tl }
Yu Xiong's avatar
Yu Xiong committed
    \@@_make_notation:nn { #1 } { #2 }
  }
  { \endlist }
%</class>
%    \end{macrocode}
% \end{environment}
%
%
% \subsection{配置常量}
% \label{subsec:constant-config}
% \changes{v0.16}{2022/02/23}{将名称常量分离到 \file{.def} 文件。}
% 本节内容用于生成常量的默认定义,分为本科生和研究生模板两种。
%
% \subsubsection{名称}
% \label{subsubsec:constant-name}
%
% 由于同一名称在不同位置具有不同变体,本模板使用字母后缀名进行了区分,
% 并在易混淆处添加了注释。
%
% 通用默认名称。注意空格是忽略掉的。
%    \begin{macrocode}
%<*(definition-ug|definition-g)>
\clist_map_inline:nn
  {
    { acknowledgement } { 致 \qquad{} 谢                },
    { tableofcontents } { 目 \qquad{} 录                },
    { id              } { 学号                          },
    { listoffigures   } { 插图目录                      },
    { listoftables    } { 表格目录                      },
    { notation        } { 符号表                        },
    { origdate        } { 日期                          },
    { paperlist       } { 发表文章目录                  },
    { pdfcreator      } { LaTeX~ with~ njuthesis~ class },
    { preface         } { 前 \qquad{} 言                },
    { supv_ii         } { 第二导师                      },
    { supv_ttl        } { 职称                          }
  }
  { \@@_define_name:nn #1 }
%    \end{macrocode}
%
% 定义同时使用到中英文名称的常量。
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { abstract   } { 摘要       } { ABSTRACT            },
    % 用于书签的摘要名称字样
    { abstract_a } { 中文摘要   } { ABSTRACT            },
    % 用于小标题的摘要名称字样
    { abstract_b } { 摘\qquad{}要 } { ABSTRACT          },
    { appendix   } { 附录       } { appendix            },
    { dept       } { 院系       } { DEPARTMENT          },
    { figure     } { 图         } { figure              },
    { keywords   } { 关键词:   } { Keywords:~          },
    { lang       } { 中文       } { 英文                },
    { nju        } { 南京大学   } { Nanjing~ University },
    { table      } { 表         } { table               }
  }
  { \@@_define_name:nnn #1 }
%    \end{macrocode}
%
% 本科生模板默认名称。
%    \begin{macrocode}
%<*definition-ug>
\clist_map_inline:nn
  {
    % 用于摘要的作者名称字样
    { author_a    } { 本科生姓名                         },
    { grade       } { 年级                               },
    { origdecl    }
      { \g_@@_name_nju_tl 本科毕业论文(设计)诚信承诺书 },
    { origsign    } { 作者签名                           },
    { submitdate  } { 提交日期                           },
    { supv        } { 导师                               },
    { title       } { 题目                               },
    { type        } { 本科生毕业论文(设计、作品)       },
    { ug          } { 本科生                             }
  }
  { \@@_define_name:nn #1 }
\clist_map_inline:nn
  {
    { abstracttitle }
        \g_@@_name_nju_tl  \g_@@_name_type_tl
        \g_@@_name_lang_tl \g_@@_name_abstract_tl
        \g_@@_name_nju_tl     \g_@@_name_type_tl
        \g_@@_name_lang_en_tl \g_@@_name_abstract_tl
      },
    { author    } { 学生姓名               } { UNDERGRADUATE  },
    { major     } { 专业                   } { SPECIALIZATION },
    { supvfull  } { 指导教师(姓名、职称) } { MENTOR         }
  }
  { \@@_define_name:nnn #1 }
%</definition-ug>
%    \end{macrocode}
%
% 研究生模板默认名称。
%    \begin{macrocode}
%<*definition-g>
\clist_map_inline:nn
  {
    { apply        } {(申请 \g_@@_info_degree_tl 学位)},
    { authdecl     } { 学位论文出版授权书               },
      { \tl_item:Nn \g_@@_info_degree_tl { 1 } 士生姓名 },
    { authsign     } { 作者签名:\njuline{\hspace{6em}} },
    { blankdate    } { \njuline{\qquad\qquad} 年
                \njuline{\qquad} 月 \njuline{\qquad} 日 },
    % 用于摘要的作者名称字样
    { chairman     } { 答辩委员会主席:                 },
    { clc          } { 分类号                           },
    { confer       } { 学位授予单位和日期               },
    { defenddate   } { 论文答辩日期                     },
    { degree       } { 申请学位级别                     },
    % 用于出版授权书的学位名称字样
    { degree_a     } { 论文级别                         },
    % 用于出版授权书的院系名称字样
    { dept_a       } { 所在院系                         },
    { email        } { 作者 Email                       },
    { field        } { 研究方向                         },
    { g            } { 研究生                           },
    { grade        } { 级                               },
    % 用于出版授权书的学号名称字样
    { id_a         } { 研究生学号                       },
    % 用于摘要的专业名称字样
    { major_a      } { 专业                             },
    % 用于国家图书馆封面的专业名称字样
    { major_b      } { 专业名称                         },
    { origdecl     } { 南京大学学位论文原创性声明       },
    { origsign     } { 研究生签名                       },
    { reviewer     } { 评阅人:                         },
    { secretlv     } { 密级                             },
    { secretstatus } { 论文涉密情况:                   },
    { secretfree   } { 不保密                           },
    { secretdate   }