Skip to content
Snippets Groups Projects
njuthesis.dtx 131 KiB
Newer Older
    { 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
  {
    \l_@@_info_supv_tl \@@_hskip:
    \l_@@_info_supv_ttl_tl
    \bool_if:NT \l_@@_second_supv_bool
      { 
        \@@_quad: \l_@@_info_supv_ii_tl 
Yu Xiong's avatar
Yu Xiong committed
        \@@_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
      { 
Yu Xiong's avatar
Yu Xiong committed
        \@@_quad: \l_@@_info_supv_ii_ttl_en_tl
        \@@_hskip: \l_@@_info_supv_ii_en_tl
      }
Yu Xiong's avatar
Yu Xiong committed
% \subsection{载入宏包}
%
% \changes{v0.12}{2021/12/07}{重新组织宏包载入顺序。}
% 将选项传入 \cls{ctexbook} 文档类。
\PassOptionsToClass
  {
    a4paper,
    twoside,
    UTF8,
    scheme=chinese,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% 开启草稿模式后传入 |draft| 选项。
%    \begin{macrocode}
    \bool_if:NT \g_@@_draft_bool { draft, }
%    \end{macrocode}
% 关于行距,\hologo{LaTeX} 默认1.2行距,word 默认行距是1.3,要求1.5倍 word 行距,故
Yu Xiong's avatar
Yu Xiong committed
% $1.5\times\frac{1.3}{1.2} = 1.625$
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    linespread=1.625,
%    \end{macrocode}
% 默认不载入任何字体,供本模板自行设置。
%    \begin{macrocode}
    fontset=none,
%    \end{macrocode}
% 正文字体设置为小四号。
%    \begin{macrocode}
    zihao=-4
  }
  { ctexbook }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% 传入各宏包选项。
%    \begin{macrocode}
\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}
%
% 使用\pkg{ctexbook}作为基础文档类。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\LoadClass { ctexbook } [ 2018/04/01 ]
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% 载入各种宏包。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\RequirePackage
  {
    geometry,
    fancyhdr,
    hologo,
    setspace,
%    \end{macrocode}
% \pkg{emptypage} 用于清除空白页的页码。
%    \begin{macrocode}
    emptypage,
%    \end{macrocode}
% 南京大学视觉形象化标准宏包 \pkg{njuvisual} 用于绘制学校 logo。
%    \begin{macrocode}
    njuvisual,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \changes{v0.13}{2021/12/13}{使用 \pkg{ntheorem} 创建定理环境,删除 \pkg{amsthm} 和 \pkg{thmtools}。}
Yu Xiong's avatar
Yu Xiong committed
% 数学,\pkg{amsmath} 必须在 \pkg{unicode-math} 前加载。
% \pkg{unicode-math} 指定了 \hologo{XeTeX} 和 \hologo{LuaTeX} 下所使用的数学字体。
% 用于配置数学环境的 \pkg{mathtools} 会与 \pkg{unicode-math} 发生冲突,此处手动消除其警告。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    amsmath,
    mathtools,
    unicode-math,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% 图片与表格。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    booktabs,
    caption,
    graphicx,
    multirow,
    subcaption,
    wrapfig,
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% 列表环境
    enumitem,
%    \end{macrocode}
% \pkg{url} 用于生成链接文本。
%    \begin{macrocode}
    url,
%    \end{macrocode}
% 按以下顺序加载两个关于引用的包。
% \pkg{hyperref} 覆写了大量命令,因此需要在其他包最后载入。
% 仅有 \pkg{cleveref} 需要在 \pkg{hyperref} 后载入,否则会报错。
%    \begin{macrocode}
    hyperref,
    cleveref
  }
% \changes{v0.13}{2021/12/13}{删除会与 \pkg{ntheorem} 冲突的 \pkg{microtype}。}
% \begin{macro}{\njuline}
% 针对编译引擎,使用不同的宏包构建可以对中文正常换行的下划线命令。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\sys_if_engine_xetex:T
  {
    \RequirePackage{xeCJKfntef}
    \NewDocumentCommand \njuline { m } { \CJKunderline{#1} }
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \pkg{lua-ul} 中需要在结尾使用 \tn{null} 保护尾部空白。
\sys_if_engine_luatex:T
  {
    \RequirePackage{lua-ul}
    \NewDocumentCommand \njuline { m } { \underLine{#1} \null }
  }
% \end{macro}
% \begin{macro}{\@@_check_package:nnn}
% 检查过时宏包。
%    \begin{macrocode}
\msg_new:nnn { njuthesis } { package-too-old }
  {
    Package~ "#1"~ is~ too~ old. \\
Yu Xiong's avatar
Yu Xiong committed
    The~ njuthesis~ class~ only~ supports~ "#1"~ with~
    a~ version higher~ than~ v#2.\\
    Please~ update~ an~ up-to-date~ version~ of~ it~
Yu Xiong's avatar
Yu Xiong committed
    using~ your TeX~ package~ manager~ or~ from~ CTAN.
  }
\cs_new_protected:Npn \@@_check_package:nnn #1#2#3
  {
    \@ifpackagelater {#1} {#2}
      { } { \msg_error:nnnn { njuthesis } { package-too-old } {#1} {#3} }
  }
%    \end{macrocode}
% \end{macro}
%
% 检查绘制下划线所需的 \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}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{字体设置}
Yu Xiong's avatar
Yu Xiong committed
% \pkg{fontspec} 已在 C\hologo{TeX} 套件中包含,无需另外载入。
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{操作系统检测}
Yu Xiong's avatar
Yu Xiong committed
% 判断用户是否自定义了中英文字体。如果其中任意一种未被定义,
Yu Xiong's avatar
Yu Xiong committed
% 则使用系统预装字体覆盖字体选项。
\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 }  
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% 进行系统检测。
% 检测 Windows 的命令由\pkg{l3kernal}提供,
% 检测 macOS 的命令由\pkg{ctex}提供,
% 这两种情况外的系统被判断为 Linux,一律使用自由字体。
%    \begin{macrocode}
\bool_if:NT \g_@@_load_sys_font_bool
Yu Xiong's avatar
Yu Xiong committed
  { 
    \sys_if_platform_windows:TF
      { \tl_set:Nn \g_@@_latin_font_tl   { win    }
        \tl_set:Nn \g_@@_cjk_font_tl     { win    } }
Yu Xiong's avatar
Yu Xiong committed
      { \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 } } } 
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{定义英文字库}
%
Yu Xiong's avatar
Yu Xiong committed
% 接下来逐个定义所需要使用的字库。
% \begin{macro}{\@@_load_latin_font_win:}
% Windows 西文字体
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_latin_font_win:
Yu Xiong's avatar
Yu Xiong committed
  {
    \setmainfont{Times~New~Roman}
    \setsansfont{Arial}
    \setmonofont{Courier~New}[Scale=MatchLowercase]
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_load_latin_font_mac:}
Yu Xiong's avatar
Yu Xiong committed
% macOS 西文字体。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_latin_font_mac:
Yu Xiong's avatar
Yu Xiong committed
  {
    \setmainfont{Times~New~Roman}
    \setsansfont{Arial}
    \setmonofont{Menlo}[Scale=MatchLowercase]
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_load_latin_font_gyre:}
Yu Xiong's avatar
Yu Xiong committed
% 开源的 gyre 西文字体。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_latin_font_gyre:
Yu Xiong's avatar
Yu Xiong committed
  {
    \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]
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{定义中文字库}
%
% \begin{macro}{\@@_load_cjk_font_win:}
Yu Xiong's avatar
Yu Xiong committed
% Windows 中文字体。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_win:
Yu Xiong's avatar
Yu Xiong committed
  {
    \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]
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_load_cjk_font_mac:}
Yu Xiong's avatar
Yu Xiong committed
% macOS 字体。
Yu Xiong's avatar
Yu Xiong committed
% TODO: 修复 macOS 字体支持,实现开箱即用。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_mac:
Yu Xiong's avatar
Yu Xiong committed
  {
    % 移除 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}
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_load_cjk_font_fandol:}
% Fandol 字体
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_fandol:
Yu Xiong's avatar
Yu Xiong committed
  {
    % 移除 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]
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
%
% \begin{macro}{\@@_load_cjk_font_founder:}
% 方正字库(简繁扩展)
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_founder:
Yu Xiong's avatar
Yu Xiong committed
    \sys_if_engine_luatex:T
    {
%    \end{macrocode}
% 在 LuaTeX 中调整方正字体括号位置
% XeTeX 暂无好的解决方法
%    \begin{macrocode}
      \defaultCJKfontfeatures{JFM={zh_CN/{quanjiao,fzpr}}}
    }
    \setCJKmainfont{FZSSK}[% 方正书宋
Yu Xiong's avatar
Yu Xiong committed
      BoldFont=FZXBSK,% 方正小标宋
      ItalicFont=FZKTK]% 方正楷体
    \setCJKsansfont{FZXH1K}[% 方正细黑一
Yu Xiong's avatar
Yu Xiong committed
      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{}
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
%
% \begin{macro}{\@@_load_cjk_font_noto:}
Yu Xiong's avatar
Yu Xiong committed
% 思源字体。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_cjk_font_noto:
Yu Xiong's avatar
Yu Xiong committed
  {
    % 思源宋体
    \setCJKmainfont[
      UprightFont=NotoSerifSC-Regular,
      BoldFont=NotoSerifSC-Bold,
      ItalicFont=NotoSerifSC-Regular,
      BoldItalicFont=NotoSerifSC-Bold,
      ItalicFeatures=FakeSlant,
      BoldItalicFeatures=FakeSlant]{Noto~Serif~SC}
Yu Xiong's avatar
Yu Xiong committed
    % 思源黑体
    \setCJKsansfont[
      UprightFont=NotoSansSC-Regular,
      BoldFont=NotoSansSC-Bold,
      ItalicFont=NotoSansSC-Regular,
      BoldItalicFont=NotoSansSC-Bold,
      ItalicFeatures=FakeSlant,
      BoldItalicFeatures=FakeSlant]{Noto~Sans~SC}
Yu Xiong's avatar
Yu Xiong committed
    \setCJKmonofont{FZFSK}[Extension=.ttf]% 方正仿宋
Yu Xiong's avatar
Yu Xiong committed
    \setCJKfamilyfont{zhsong}{Noto~Serif~SC}
    \setCJKfamilyfont{zhhei}{Noto~Sans~SC}
    \setCJKfamilyfont{zhfs}{FZFSK}[Extension=.ttf]
    \setCJKfamilyfont{zhkai}{FZKTK}[Extension=.ttf]
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{载入指定字库}
%
Yu Xiong's avatar
Yu Xiong committed
% 载入字体命令。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_load_font:
    \use:c { @@_load_latin_font_ \g_@@_latin_font_tl : }
    \use:c { @@_load_cjk_font_   \g_@@_cjk_font_tl   : }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% 自行定义 C\hologo{TeX} 中的四类字体命令。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
    \NewDocumentCommand \songti   { } { \CJKfamily{zhsong} }
    \NewDocumentCommand \heiti    { } { \CJKfamily{zhhei}  }
    \NewDocumentCommand \fangsong { } { \CJKfamily{zhfs}   }
    \NewDocumentCommand \kaishu   { } { \CJKfamily{zhkai}  }
    \RenewDocumentCommand \large  { } { \zihao{4}          }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% 载入设置的字体。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% \changes{v0.10}{2021/09/28}{修正了数学字体。}
%
Yu Xiong's avatar
Yu Xiong committed
% 设置数学字体 (XITS, 或者 \href{https://www.stixfonts.org}{STIX}, 与 Times New Roman 最为相近)
% \setmathfont{STIXTwoMath-Regular}[Extension = .otf]
\setmathfont{XITSMath-Regular}[
  BoldFont = XITSMath-Bold,
  Extension = .otf]
mc's avatar
mc committed
\setmathfont{NewCMMath-Regular.otf}[range={cal,bb,frak}]
mc's avatar
mc committed
\setmathfont{NewCMMath-Regular.otf}[version=bold,range={bfcal}]
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{页面布局}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{页边距}
Yu Xiong's avatar
Yu Xiong committed
% 使用\pkg{geometry}设置页边距。
%    \begin{macrocode}
\geometry
  {
    vmargin    = 2.5 cm,
    hmargin    = 3.2 cm, 
    headheight = 15 pt
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% 草稿模式下显示页面文字范围边界以及页眉、页脚线。
%    \begin{macrocode}
\bool_if:NT \g_@@_draft_bool { \geometry { showframe } }
%    \end{macrocode}
%
% \subsubsection{页眉页脚}
Yu Xiong's avatar
Yu Xiong committed
%
Yu Xiong's avatar
Yu Xiong committed
% 本科生页眉页脚。要求无页眉,页脚居中,页码使用五号新罗马体数字。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\fancypagestyle { plain }
  {
    \fancyhf { }       
    \fancyfoot [ C ] { \zihao{5} \thepage }
    \RenewDocumentCommand \headrulewidth { } { 0 pt }
    \RenewDocumentCommand \footrulewidth { } { 0 pt }
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% 研究生页眉页脚。页眉为横线,奇数页显示章名,偶数页显示节名;页脚为页码。 
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\fancypagestyle{headings}
  {
    \fancyhf { }
    \fancyhead [ CO ] { \leftmark          }
    \fancyhead [ CE ] { \rightmark         }
    \fancyfoot [ C  ] { \zihao{5} \thepage }
Yu Xiong's avatar
Yu Xiong committed
    \RenewDocumentCommand \headrulewidth { } { 0.4 pt }
    \RenewDocumentCommand \footrulewidth { } { 0   pt }
    \setlength { \headheight } { 20 pt } 
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% \begin{macro}{\frontmatter}
% 重定义 \cs{frontmatter},清空页眉页脚以及页码设置。
% 此命令仅为解决原 \cls{book} 类中使用小写罗马字母序号的冲突,并不建议使用。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\RenewDocumentCommand \frontmatter { }
  { 
    \cleardoublepage
    \pagestyle{empty}
    \pagenumbering{Roman}
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\mainmatter}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.12}{2021/12/03}{修复了摘要页字体格式泄漏到正文的问题。}
% \changes{v0.12}{2021/12/03}{修复了页眉上长标题重叠的问题。}
% 重定义 \cs{mainmatter},在论文主体部分载入页眉页脚设置,并重新进行数字编号。
%    \begin{macrocode}
\RenewDocumentCommand \mainmatter { }
  {
    \cleardoublepage
Yu Xiong's avatar
Yu Xiong committed
    \int_compare:nTF { \l_@@_info_degree_int == 1 } 
Yu Xiong's avatar
Yu Xiong committed
      { \pagestyle{plain} } { \pagestyle{headings} }
    \pagenumbering{arabic}
    \normalfont\normalsize
  }
%    \end{macrocode}
% \end{macro}
Yu Xiong's avatar
Yu Xiong committed
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{章节标题格式}
% \begin{macro}{\c_@@_sec_format_tl}
% 各部分章节以及目录中章标题的格式。设置为四号、不加粗、黑体。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\tl_const:Nn \c_@@_sec_format_tl { \large \normalfont \sffamily }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\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
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{目录格式}
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.13}{2021/12/09}{删除 \pkg{tocloft},改用 \pkg{ctex} 内置的目录设置。}
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\@@_chapter_in_toc:n}
% 将无编号章插入目录。
Yu Xiong's avatar
Yu Xiong committed
\cs_new_protected:Npn \@@_chapter_in_toc:n #1
  { \addcontentsline { toc } { chapter } { \c_@@_sec_format_tl #1 } }
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\njuchapter}
% 含有目录和 PDF 标签的无编号章。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\NewDocumentCommand \njuchapter { m }
Yu Xiong's avatar
Yu Xiong committed
  { 
    \chapter*{#1}
    \addcontentsline { toc } { chapter } { \c_@@_sec_format_tl #1}
Yu Xiong's avatar
Yu Xiong committed
    \@mkboth{#1}{#1}
  }
%    \end{macrocode}
% \end{macro}
%
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% 设置目录标题名称。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
    contentsname   = { 目\hspace{2em}录},
    listfigurename = { 插图清单 }, 
    listtablename  = { 表格清单 },
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% 设置目录中章标题的样式。
    chapter / tocline = \c_@@_sec_format_tl \CTEXnumberline {#1} #2
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\c_@@_toc_title_tl}
% 目录页标题格式,单独设置为三号粗宋体。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\tl_const:Nn \c_@@_toc_title_tl { \centering \zihao{3} \bf }
%    \end{macrocode}
% \end{macro}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\@@_modify_toc_title:nn}
% 通过 group 内修改标题设置,改变标题页字体。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\cs_new_protected:Npn \@@_modify_toc_title:nn #1#2
{
  \group_begin:
    \ctexset { chapter/format = \c_@@_toc_title_tl }
Yu Xiong's avatar
Yu Xiong committed
    \njuchapter { #1 }
Yu Xiong's avatar
Yu Xiong committed
  \group_end:
  \@starttoc{#2}
}
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}{\tableofcontents,\listoffigures,\listoftables}
% 重定义目录命令,修改标题格式并插入书签。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\RenewDocumentCommand \tableofcontents { }
  { \@@_modify_toc_title:nn { \contentsname   } { toc } }
\RenewDocumentCommand \listoffigures   { }
  { \@@_modify_toc_title:nn { \listfigurename } { lof } }
\RenewDocumentCommand \listoftables    { }
  { \@@_modify_toc_title:nn { \listtablename  } { lot } }
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{参考文献}
% biblatex设置
\RequirePackage[
    style=gb7714-2015,
    %style=numeric-comp,
    %citestyle=authortitle-icomp,
    % citestyle=numeric-comp,
    %bibstyle=authoryear,
    % bibstyle=numeric,
    sorting=none,
    %sorting=nyt,
    %sortcites=true,
    %autocite=footnote,
    backend=biber, % Compile the bibliography with biber
    hyperref=true,
    backref=false,
    citecounter=true,
    pagetracker=true,
    citetracker=true,
    ibidtracker=context,
    autopunct=true,
    autocite=plain,
    % gbpub=false,         % Uncomment if you do NOT want '[S.l. : s.n.]' 
                           % in reference entries, GitHub Issue (#47)
    % gbnamefmt=lowercase, % Uncomment if you do NOT want uppercase author 
                           % names in reference entries, GitHub Issue (#23)
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
% \changes{v0.12}{2021/12/06}{设置输出参考文献的默认选项。}
% 设置参考文献名称
%    \begin{macrocode}
\ctexset{ bibname = {参考文献} }
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% 修改参考文献的头部样式并插入目录。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\defbibheading { njubib } [ \bibname ] { \njuchapter { #1 } }
\DeclarePrintbibliographyDefaults { heading = njubib }
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% 忽略不需要的文献信息。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\AtEveryBibitem
  {
    \clist_map_inline:nn
      { abstract, issn, isbn, archivePrefix, arxivId, pmid, eprint }
      { \clearfield { #1 } }
    \ifentrytype{online}{}{\ifentrytype{misc}{}{\clearfield{url}}}
  }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{引用}
Yu Xiong's avatar
Yu Xiong committed
%
% \pkg{hyperref} 设置。
Yu Xiong's avatar
Yu Xiong committed
% \changes{v0.11}{2021/10/01}{写入PDF元数据。}
%    \begin{macrocode}
\ctex_at_end_preamble:n
%    \end{macrocode}
% 清除标题中用于手动换行的 |!| 控制符。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
    \tl_set_eq:NN \l_@@_tmp_tl \l_@@_info_title_tl
    \tl_remove_all:Nn \l_@@_tmp_tl { ! }
Yu Xiong's avatar
Yu Xiong committed
    \hypersetup
      {
        bookmarksnumbered = true,
        psdextra          = true,
        unicode           = true,
        hidelinks,
%    \end{macrocode}
% 填写 PDF 元信息。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
        pdftitle    = \l_@@_tmp_tl,
Yu Xiong's avatar
Yu Xiong committed
        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}
Yu Xiong's avatar
Yu Xiong committed
% \subsection{图表浮动体}
% 
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{图片表格}
%
% 设置默认图片扩展名,允许在不键入扩展名时自动进行补全。
%    \begin{macrocode}
\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
% 
% \changes{v0.12}{2021/12/06}{删除了可能导致冲突的 \pkg{floatrow}。}
% 图表标题样式。文字设置为五号宋体,标签设置为粗体,间隔一个全角空格。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\DeclareCaptionStyle{njucap}
  {
    font          = small,
    labelfont     = bf,
    labelsep      = quad,
    justification = centering
  }
\captionsetup [ figure ] { style = njucap }
\captionsetup [ table  ] { style = njucap }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
%
% \subsubsection{列表环境}
% \changes{v0.12}{2021/12/07}{删除了 \pkg{enumitem} 的部分列表环境设置。}
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\setlist { noitemsep }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{定理环境}
% \begin{macro}{\@@_new_theorem:N}
% 用于定义普通定理环境的辅助函数。
% \begin{arguments}
%   \item 定理名称列表,|clist| 型变量
% \end{arguments}
% 除证明以外的环境都不需要证毕符号,在此清空其设置。
%    \begin{macrocode}
\cs_new_protected:Npn \@@_new_theorem:N #1
  { 
    \theoremsymbol { }
    \clist_map_inline:Nn #1
      { \newtheorem { ##1 } { \@@_name:n { ##1 } } }
  }
%    \end{macrocode}
% \end{macro}
%
Yu Xiong's avatar
Yu Xiong committed
% 定义证明环境。证毕符号使用 \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}
%
% 定义普通定理环境。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\@@_new_theorem:N \c_@@_theorem_type_clist
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsection{封面}
%
Yu Xiong's avatar
Yu Xiong committed
% \subsubsection{内部命令}
% \begin{macro}{\@@_split_title:n}
% 分割标题。
Yu Xiong's avatar
Yu Xiong committed
%    \begin{macrocode}
\cs_new_protected:Npn \@@_split_title:n #1
    \tl_if_in:VnTF { #1 } { ! }
      {
%    \end{macrocode}
% 从英文感叹号进行分割,存入 |clist|。
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
        \seq_set_split:NnV \l_@@_tmp_seq { ! } { #1 }
        \clist_set_from_seq:NN \l_@@_tmp_clist \l_@@_tmp_seq
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
% 如果没找到感叹号,则手动进行分割固定宽度的字符。
Yu Xiong's avatar
Yu Xiong committed
%    \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}
Yu Xiong's avatar
Yu Xiong committed
%
% \begin{macro}{\@@_multiline_title:nnn}
% 生成多行标题。
% \begin{arguments}
%   \item 内容格式
%   \item 名称盒子宽度,|dim| 型变量
%   \item 内容盒子宽度,|dim| 型变量
% \end{arguments}
%    \begin{macrocode}
\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:
Yu Xiong's avatar
Yu Xiong committed
    \clist_map_inline:Nn \l_@@_tmp_clist
      { \@@_ulined_center_box:nn { #3 } { #1 ##1 } \@@_vskip: }
%    \end{macrocode}
% \end{macro}
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\@@_cover_entry:nnn}
% 生成单项信息条目。
% \begin{arguments}
%   \item 条目
%   \item 名称盒子宽度,|dim| 型变量
%   \item 内容盒子宽度,|dim| 型变量
% \end{arguments}
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\cs_new_protected:Npn \@@_cover_entry:nnn #1#2#3
    \@@_spread_box:nnn { #2 } { \kaishu } { \@@_name:n { #1 } }
    \@@_ulined_center_box:nn  { #3 }      { \@@_info:n { #1 } }
Yu Xiong's avatar
Yu Xiong committed
%    \end{macrocode}
Yu Xiong's avatar
Yu Xiong committed
%
Yu Xiong's avatar
Yu Xiong committed
% \begin{macro}{\@@_cover_bientry:nnnn}
% 生成两项信息条目,仅用于本科生封面。
% \begin{arguments}
%   \item 左侧条目
%   \item 右侧条目
%   \item 名称盒子宽度,|dim| 型变量
%   \item 内容盒子宽度,|dim| 型变量
% \end{arguments}
%    \begin{macrocode}
Yu Xiong's avatar
Yu Xiong committed
\cs_new_protected:Npn \@@_cover_bientry:nnnn #1#2#3#4
    \@@_spread_box:nnn { #3 } { \kaishu } { \@@_name:n { #1 } }