\subsection{\file{hduthesis-layout-module.code} 的实现}

提供模块 \file{layout} 文件
\begin{minted} [ linenos, bgcolor = bg, breaklines ] {tex}
  \hduthesis_provide_module:n {layout}
\end{minted}

调用 \pkg{geometry}、\pkg{array}、\pkg{setspace}、\pkg{fancyhdr}、\pkg{enumitem}、\pkg{cleveref} 宏包
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \RequirePackage{geometry, array, setspace, fancyhdr, enumitem, cleveref}
\end{minted}

调用并配置 \pkg{caption} 宏包
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \RequirePackage[skip = 1.75ex, labelsep = quad, font = small]{caption}
\end{minted}

清空页眉页脚，设置页面样式为 \cmd{fancy}
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \fancyhf{}
  \pagestyle{fancy}
\end{minted}

设置页眉线宽为 \cmd{.8pt}
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \renewcommand*\headrulewidth{.8pt}
\end{minted}

设置图表编号格式为 \texttt{\meta{chapter}-\meta{figure/table}}
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \renewcommand*\thefigure {\arabic{chapter}-\arabic{figure}}
  \renewcommand*\thetable {\arabic{chapter}-\arabic{table}}
\end{minted}

设置公式编号格式为 \texttt{\meta{chapter}-\meta{equation}}
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \renewcommand*\theequation {\arabic{chapter}-\arabic{equation}}
\end{minted}

减小图表后方与正文的间距
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \AddToHook{env/figure/after}{\vspace*{-2.3ex}}
  \AddToHook{env/table/after}{\vskip-1.9ex}
\end{minted}

设置 \cmd{enumerate} 环境的编号格式和缩进
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \setlist[enumerate,1]
    {
      label = (\,\arabic*\,), itemindent = 4em, leftmargin = 0em,
      labelsep = 1ex, topsep = 0pt, itemsep = 0pt, partopsep = 0pt,
      parsep = 0em, listparindent = 2\ccwd
    }
\end{minted}

设置引用格式
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \crefformat{figure}{图#2#1#3}
  \crefformat{table}{表#2#1#3}
\end{minted}

定义命令 \cs{__hduthesis_cover_spread_box:nn} 和 \cs{__hduthesis_cover_center_box:nn}，用于生成封面中的分散与下划线居中对齐盒子.
\footnote
  { \color{black!10}
    下划线居中对齐盒子的实现参考自 \href{https://tex.stackexchange.com/users/4427/egreg}{@egreg} 在
    \href{https://tex.stackexchange.com/questions/727960/how-to-center-a-series-of-text-width-a-fixed-width-that-can-automatically-linebr}{tex.stackexchange.com} 的解答.
  }

\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \cs_new_protected:Npn \__hduthesis_cover_spread_box:nn #1#2
    {
      \mode_leave_vertical:
      \hbox_to_wd:nn {#1}
        { \exp_args:Nee \tl_map_inline:nn {#2} { ##1 \hfil } \unskip }
    }
  \cs_new_protected:Npn \__hduthesis_cover_center_box:nn #1#2
    { % by @egreg on tex.stackexchange.com
      \mode_leave_vertical:
      \dim_set:Nn \l_tmpa_dim {#1}
      \global\setbox1 = \box\voidb@x
      \group_begin:
      \setbox0 = \vbox
        {
          \dim_set:Nn \hsize {#1}\relax
          \dim_set:Nn \parindent {0pt}
          \skip_set:Nn \leftskip {0pt plus 1fil}
          \skip_set:Nn \rightskip {0pt plus -1fil}
          \skip_set:Nn \parfillskip {0pt plus 2fil}
          #2 \par
          \loop
          \setbox2 = \lastbox
          \unless\ifvoid2
            \global\setbox1 = \vtop
              { \hbox to\hsize{\strut\unhbox2}
                \vskip-4pt \hrule height .5pt
                \vskip9.6pt \unvbox1
              }
            \unskip\unpenalty
          \repeat
        }
      \group_end:
      \box1
    }
\end{minted}

定义命令 \cs{__hduthesis_process_array:NnnN}，用于处理一维或二维数组. 其中一级分隔符为 \texttt{:}，二级分隔符为 \texttt{/}.
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \cs_new_protected_nopar:Npn \__hduthesis_process_array:NnnN #1#2#3#4
    {
      \seq_set_split:Nee \l__hduthesis_process_array_seq { / } {#1}
      \seq_set_split:Nee \l__hduthesis_process_array_row_seq { \c_colon_str }
        { \seq_item:Nn \l__hduthesis_process_array_seq {#2} }
      \tl_if_eq:nnTF {#3} {:}
        { \tl_gset:Ne #4 { \seq_use:Nn \l__hduthesis_process_array_row_seq {} } }
        {
          \tl_gset:Ne #4 { \seq_item:Nn \l__hduthesis_process_array_row_seq {#3} }
        }
      \seq_clear:N \l__hduthesis_process_array_seq
      \seq_clear:N \l__hduthesis_process_array_row_seq
    }
\end{minted}

将十二个 \meta{month} 的英文名称存入 \cs{g_system_month_clist} 中
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \clist_set:Nn \g_system_month_clist
    {
      January, February, March, April, May, June, July,
      August, September, October, November, December
    }
\end{minted}

定义文档信息的键
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \keys_define:nn { hduthesis / docinfo }
    {
      title .clist_set:N   = \l__docinfo_title_tl,
      department .tl_set:N = \l__docinfo_department_tl,
      major .tl_set:N      = \l__docinfo_major_tl,
      class .tl_set:N      = \l__docinfo_class_tl,
      stdntid .tl_set:N    = \l__docinfo_stdntid_tl,
      author .clist_set:N  = \l__docinfo_author_tl,
      supervisor .tl_set:N = \l__docinfo_supervisor_tl,
      bibsource .tl_set:N  = \l__docinfo_bibsource_tl,
    }
\end{minted}

定义用户端文档信息的输入命令
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \NewDocumentCommand \DocInfo { m }
    {
      \keys_set:nn { hduthesis / docinfo } {#1}
      \__hduthesis_docinfo_process_aux:
      \__hduthesis_docinfo_degree_if_aux:
    }
\end{minted}

定义处理文档信息的辅助命令. 其中论文标题与作者信息为一维数组，指导教师信息为二维数组. 如果用户未同意用户协议，则清空参考文献来源，以避免加载 \pkg{biblatex} 宏包. 如果参考文献来源为空，则定义 \cs{printbibliography} 命令为输出参考文献空章节，并定义 \cs{cite} 命令为输出参考文献引用标记. 否则加载 \pkg{gbt7714} 宏包，设置参考文献样式为 \texttt{gbt7714-numerical}，定义 \cs{printbibliography} 命令为输出参考文献并将其加入目录.
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \cs_set_protected_nopar:Nn \__hduthesis_docinfo_process_aux:
    {
      \__hduthesis_process_array:NnnN \l__docinfo_title_tl {1} {:} \@title
      \__hduthesis_process_array:NnnN \l__docinfo_title_tl {2} {:}
        \l__docinfo_entitle_tl
      \__hduthesis_process_array:NnnN \l__docinfo_author_tl {1} {:} \@author
      \__hduthesis_process_array:NnnN \l__docinfo_author_tl {2} {:}
        \l__docinfo_enauthor_tl
      \__hduthesis_process_array:NnnN \l__docinfo_supervisor_tl {1} {1}
        \l__docinfo_cnrole_tl
      \__hduthesis_process_array:NnnN \l__docinfo_supervisor_tl {1} {2}
        \l__docinfo_cnsupervisor_tl
      \__hduthesis_process_array:NnnN \l__docinfo_supervisor_tl {2} {1}
        \l__docinfo_enrole_tl
      \__hduthesis_process_array:NnnN \l__docinfo_supervisor_tl {2} {2}
        \l__docinfo_ensupervisor_tl
      \bool_if:NF \g__hduthesis_agreement_bool
        { \tl_clear:N \l__docinfo_bibsource_tl }
      \tl_if_empty:NTF \l__docinfo_bibsource_tl
      {
        \newcommand*\printbibliography{\chapter*{参考文献}}
        \newcounter {citecount}
        \renewcommand*\cite[1]
          {
            \refstepcounter{citecount}
            \textsuperscript{[\thecitecount]}
          }
      }
      {
        \RequirePackage[sort&compress]{gbt7714}
        \bibliographystyle{gbt7714-numerical}
        \dim_set:Nn \bibsep {.35ex}
        \newcommand*\printbibliography
          {
            \bibliography { \l__docinfo_bibsource_tl }
            \addcontentsline{toc}{chapter}{参考文献}
          }
      }
    }
\end{minted}

定义处理承诺书签名数组的辅助命令. 其中签名文件名需要展开后存入 \cs{g__hduthesis_signature_file_tl} 中.
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \cs_new_protected_nopar:Npn \__hduthesis_signature_process_aux:nnn #1#2#3
    {
      \clist_set:Nn \l__hduthesis_signature_process_clist {#1}
      \seq_set_split:Nne \l__hduthesis_signature_figure_seq {/}
        { \clist_item:Nn \l__hduthesis_signature_process_clist {#2} }
      \int_compare:nNnTF {#3} = {0}
        {
          \tl_set:Ne \l__hduthesis_signature_figure_tl
            { \seq_item:Nn \l__hduthesis_signature_figure_seq { #3 + 1 } }
          \seq_clear:N \l__hduthesis_signature_figure_seq
        }
        {
          \seq_set_split:Nne \l__hduthesis_signature_date_seq {-}
            { \seq_item:Nn \l__hduthesis_signature_figure_seq {2} }
          \seq_item:Nn \l__hduthesis_signature_date_seq {#3}
          \seq_clear:N \l__hduthesis_signature_date_seq
        }
      \clist_clear:N \l__hduthesis_signature_process_clist
    }
\end{minted}

定义插入签名图片的命令
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \NewDocumentCommand \signature { m }
    {
      \leavevmode@ifvmode
      \lower \dimexpr \f@size\p@ * 9/16
      \hbox { \includegraphics [ height = { \fp_eval:n {2*\f@size}\p@ } ] {#1} }
    }
\end{minted}

结束模块 \file{hduthesis-layout-module.code} 文件
\begin{minted} [ linenos, firstnumber = last, bgcolor = bg, breaklines ] {tex}
  \endinput
\end{minted}
