%%
%% This is file `bitreport.cls',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% bithesis.dtx  (with options: `cls,report')
%% 
%%     Copyright (C) 2023
%%     Association of Bit Network Pioneer and any individual authors listed in the documentation.
%% ------------------------------------------------------------------------------
%% 
%%     This work may be distributed and/or modified under the
%%     conditions of the LaTeX Project Public License, either
%%     version 1.3c of this license or (at your option) any later
%%     version. This version of this license is in
%%        http://www.latex-project.org/lppl/lppl-1-3c.txt
%%     and the latest version of this license is in
%%        http://www.latex-project.org/lppl.txt
%%     and version 1.3 or later is part of all distributions of
%%     LaTeX version 2020/11/27 or later.
%% 
%%     This work has the LPPL maintenance status `maintained'.
%% 
%%     The Current Maintainer of this work is Feng Kaiyu.
%% ------------------------------------------------------------------------------
%% 
\RequirePackage{expl3,l3keys2e}
\ProvidesExplClass{bitreport}
{2025-01-03}{3.8.1}{BIT Thesis Templates}
\int_new:N \g__bithesis_report_type_int
\clist_const:Nn \c__bithesis_report_type_clist
    { common, undergraduate_proposal}
\seq_new:N \l__bithesis_right_seq
\seq_new:N \l__bithesis_left_seq
\PassOptionsToPackage{AutoFakeBold,AutoFakeSlant}{xeCJK}
\keys_define:nn { bitreport }
  {
    option .meta:nn = {bitreport / option } {#1},
    cover .meta:nn = { bitreport / cover  } {#1},
    info .meta:nn = { bitreport / info } {#1},
    misc .meta:nn = { bitreport / misc } {#1}
  }
\keys_define:nn { bitreport / option }
  {
    type .choice:,
    type .value_required:n = true,
    type .choices:Vn =
      \c__bithesis_report_type_clist
      {
        \int_set_eq:NN \g__bithesis_report_type_int \l_keys_choice_int
      },
    type .initial:n = common,
    ctex .tl_set:N = \l__bithesis_options_to_ctex_tl,
  }
\keys_define:nn { bitreport / cover }
  {
    imagePath .tl_set:N = \l_bit_coverimagepath_tl,
    date .tl_set:N = \l__bithesis_cover_date_tl,
    %% cover entry
    delimiter .tl_set:N = \l__bithesis_cover_delimiter_tl,
    labelAlign .tl_set:N = \l__bithesis_cover_label_align_tl,
    labelAlign .initial:n = {r},
    valueAlign .tl_set:N = \l__bithesis_cover_value_align_tl,
    valueAlign .initial:n = {c},
    labelMaxWidth .dim_set:N = \l__bithesis_cover_label_max_width_dim,
    valueMaxWidth .dim_set:N = \l__bithesis_cover_value_max_width_dim,
    autoWidthPadding .dim_set:N = \l__bithesis_cover_auto_width_padding_dim,
    autoWidthPadding .initial:n = {0.25em},
    autoWidth .bool_set:N = \l__bithesis_cover_auto_width_bool,
    autoWidth .initial:n = {true},
    underlineThickness .dim_set:N = \l__bithesis_cover_underline_thickness_dim,
    underlineThickness .initial:n = {1pt},
    underlineOffset .dim_set:N = \l__bithesis_cover_underline_offset_dim,
    underlineOffset .initial:n = { -10pt },
  }
\keys_define:nn { bitreport / info }
  {
    title .tl_set:N = \l__bithesis_value_title_tl,
    school .tl_set:N = \l__bithesis_value_school_tl,
    major .tl_set:N = \l__bithesis_value_major_tl,
    class .tl_set:N = \l__bithesis_value_class_tl,
    author .tl_set:N = \l__bithesis_value_author_tl,
    supervisor .tl_set:N = \l__bithesis_value_supervisor_tl,
    externalSupervisor .tl_set:N = \l__bithesis_value_external_supervisor_tl,
    studentId .tl_set:N = \l__bithesis_value_student_id_tl,
  }
\keys_define:nn { bitreport / misc }
  {
    reviewTable .tl_set:N = \l_bit_reviewtable_tl,
  }
\DeclareOption*{
  \PassOptionsToClass{\l__bithesis_options_to_ctex_tl}{ctexart}
}
\ProcessOptions\relax
\LoadClass[zihao=-4]{ctexart}
\RequirePackage[a4paper,left=3cm,right=2.4cm,top=2.6cm,bottom=2.38cm,includeheadfoot]{geometry}
\RequirePackage{fancyhdr}
\RequirePackage{setspace}
\RequirePackage{caption}
\RequirePackage{booktabs}
\RequirePackage{pdfpages}
\ProcessKeysOptions { bitreport / option }
\cs_generate_variant:Nn \tl_if_empty:nTF {x}
\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx}
\cs_new:Npn \__bithesis_dunderline:nnn #1#2#3 {
  {\setbox0=\hbox{#3}\ooalign{\copy0\cr\rule[\dimexpr#1-#2\relax]{\wd0}{#2}}}
}
\cs_new:Npn \__bithesis_render_cover_entry:nn #1#2 {
  \makebox[\l__bithesis_cover_label_max_width_dim][\l__bithesis_cover_label_align_tl]{
    \tl_if_blank:VTF #1 {} {#1\l__bithesis_cover_delimiter_tl}
  }
  \hspace{1ex}
  \__bithesis_dunderline:nnn{\l__bithesis_cover_underline_offset_dim}{\l__bithesis_cover_underline_thickness_dim}{
    \makebox[\l__bithesis_cover_value_max_width_dim][\l__bithesis_cover_value_align_tl]{#2}
  }\par
}
\cs_new:Npn \__bithesis_get_text_width:Nn #1#2
  {
    \hbox_set:Nn \l_tmpa_box {#2}
    \dim_set:Nn #1 { \box_wd:N \l_tmpa_box }
  }
\cs_generate_variant:Nn \__bithesis_get_text_width:Nn { NV }
\cs_new:Npn \__bithesis_get_max_text_width:NN #1#2
  {
    \group_begin:
      \seq_set_eq:NN \l__bithesis_tmpa_seq #2
      \dim_zero_new:N \l__bithesis_tmpa_dim
      \bool_until_do:nn { \seq_if_empty_p:N \l__bithesis_tmpa_seq }
        {
          \seq_pop_left:NN \l__bithesis_tmpa_seq \l__bithesis_tmpa_tl
          \__bithesis_get_text_width:NV \l__bithesis_tmpa_dim \l__bithesis_tmpa_tl
          % 在两边加上空白，避免文本太靠边。
          \dim_gset:Nn #1 { \dim_max:nn {#1} { \l__bithesis_tmpa_dim + \l__bithesis_cover_auto_width_padding_dim * 2} }
        }
    \group_end:
  }
\cs_new:Npn \__bithesis_parse_entry #1 #2 {
  \seq_set_split:Nnx \l__bithesis_tmp_right_seq {\\} {#2}
  \seq_clear:N \l__bithesis_tmp_left_seq
  \seq_map_inline:Nn \l__bithesis_tmp_right_seq {
    \seq_put_right:Nn \l__bithesis_tmp_left_seq {}
  }
  \seq_put_left:Nn \l__bithesis_tmp_left_seq {#1}
  \seq_pop_right:NN \l__bithesis_tmp_left_seq \g__bithesis_trashcan_tl
}
\cs_new:Npn \__bithesis_render_cover_entry:n #1 {
  % 左边是标签，右边是值。
  % 形如：
  % { {label_1} {value_1}, {label_2} {value 2} }
  % 首先转换成 seq 类型。
  \seq_set_from_clist:NN \l__bithesis_input_seq #1
  \seq_map_inline:Nn \l__bithesis_input_seq {
    % 然后对于每一对 label 和 value，首先查找
    % value 中是否含有 \\ 字符，如果有，则将其分割成多个
    % label - value 对。
    % 比如 {label_1} {value \\ 1} 会被转换成
    % { {label_1} {value}, {} {1} }
    \__bithesis_parse_entry ##1
    % 然后将这些 label - value 对添加到 \l__bithesis_right_seq
    % 或者 \l__bithesis_left_sql 中。
    % left 就是 label，right 就是 value。
    \seq_concat:NNN \l__bithesis_right_seq \l__bithesis_right_seq \l__bithesis_tmp_right_seq
    \seq_concat:NNN \l__bithesis_left_seq \l__bithesis_left_seq \l__bithesis_tmp_left_seq
  }

  % 如果用户选择自动计算最大宽度，则计算最大宽度。
  \bool_if:NT \l__bithesis_cover_auto_width_bool {
    \__bithesis_get_max_text_width:NN \l__bithesis_cover_label_max_width_dim \l__bithesis_left_seq
    \__bithesis_get_max_text_width:NN \l__bithesis_cover_value_max_width_dim \l__bithesis_right_seq
  }

  % 最后，根据宽度渲染 label 和 value 对。
  \group_begin:
    \bool_until_do:nn { \seq_if_empty_p:N \l__bithesis_left_seq }
      {
        \seq_pop_left:NN \l__bithesis_left_seq \l__bithesis_tmpa_tl
        \seq_pop_left:NN \l__bithesis_right_seq \l__bithesis_tmpb_tl
        \tl_if_empty:xTF \l__bithesis_tmpb_tl {} {
          \__bithesis_render_cover_entry:nn {\l__bithesis_tmpa_tl} {\l__bithesis_tmpb_tl}
        }
      }
  \group_end:
}
\DeclareDocumentCommand \BITSetup { m }
  { \keys_set:nn { bitreport } { #1 }}
\DeclareDocumentCommand \MakeCover {}
  {
    \group_begin:
    \int_case:nn {\g__bithesis_report_type_int} {
      {1} {
        \begin{titlepage}
          \centering

          \vspace{23mm}

          \tl_if_empty:NF \l_bit_coverimagepath_tl {
            \includegraphics[width=.5\textwidth]{\l_bit_coverimagepath_tl}\\
          }

          \vspace{10mm}

          \heiti\fontsize{24pt}{24pt}\selectfont{\l__bithesis_value_title_tl}\\

          \vspace{67mm}

          \begin{spacing}{2.2}
            \songti\zihao{3}

            \clist_set:Nn \l__bithesis_input_clist {
                {\textbf{学\qquad 院：}} {\l__bithesis_value_school_tl},
                {\textbf{专\qquad 业：}} {\l__bithesis_value_major_tl},
                {\textbf{班\qquad 级：}} {\l__bithesis_value_class_tl},
                {\textbf{学\qquad 号：}} {\l__bithesis_value_student_id_tl},
                {\textbf{姓\qquad 名：}} {\l__bithesis_value_author_tl},
                {\textbf{任课教师：}} {\l__bithesis_value_supervisor_tl},
            }

            \__bithesis_render_cover_entry:n \l__bithesis_input_clist

          \end{spacing}

          \vspace*{\fill}

          \centering

          \songti\fontsize{12pt}{12pt}\selectfont{
            \tl_if_empty:NTF \l__bithesis_cover_date_tl {
              \today
            } {
              \l__bithesis_cover_date_tl
            }
          }
        \end{titlepage}
      }
      {2} {
        % Main code for \MakeCover
        \begin{titlepage}
          \topskip=0pt
          \vspace*{-16mm}
          \centering
          \hspace{-6mm}
          \songti\fontsize{22pt}{22pt}
          \selectfont{北京理工大学}\par

          \vspace{13mm}

          \hspace{-6mm}
          \heiti\fontsize{24pt}{24pt}
          \selectfont{本科生毕业设计（论文）开题报告}\par

          \vspace{53mm}

          \begin{spacing}{2.2}
            \songti\zihao{3}
            \clist_set:Nn \l__bithesis_input_clist {
                {\textbf{学\qquad 院：}} {\l__bithesis_value_school_tl},
                {\textbf{专\qquad 业：}} {\l__bithesis_value_major_tl},
                {\textbf{班\qquad 级：}} {\l__bithesis_value_class_tl},
                {\textbf{姓\qquad 名：}} {\l__bithesis_value_author_tl},
                {\textbf{指导教师：}} {\l__bithesis_value_supervisor_tl},
                {\textbf{校外指导教师：}} {\l__bithesis_value_external_supervisor_tl},
            }

          \__bithesis_render_cover_entry:n \l__bithesis_input_clist

          \end{spacing}

          \vspace*{\fill}

          \centering
          \hspace{-6mm}\songti\fontsize{12pt}{12pt}\selectfont{\today}

        \end{titlepage}
      }
    }
    \group_end:
  }
\DeclareDocumentCommand \MakeReviewTable {}
  {
    \group_begin:
      \begin{titlepage}
        \includepdf[pages=-]{\l_bit_reviewtable_tl}
      \end{titlepage}
    \group_end:
  }
\DeclareCaptionFont{kaiticaption}{\kaishu \normalsize}
\renewcommand{\thefigure}{\thesection-\arabic{figure}}
\captionsetup[figure]{font=small,labelsep=space,skip=10bp,labelfont=bf,font=kaiticaption}
\renewcommand{\thetable}{\thesection-\arabic{table}}
\captionsetup[table]{font=small,labelsep=space,skip=10bp,labelfont=bf,font=kaiticaption}
\ctexset{today=big}
\setromanfont{Times~New~Roman}
\setcounter{tocdepth}{3}
\setcounter{secnumdepth}{3}
\ctexset{section={
  format={
    \raggedright \bfseries \songti \zihao{-3}
  },
  beforeskip = 24bp plus 1ex minus .2ex,
  afterskip = 24bp plus .2ex,
  fixskip = true,
  name = {,.\quad}
  }
}
\ctexset{subsection={
  format = {
    \bfseries \songti \raggedright \zihao{4}
  },
  beforeskip = 24bp plus 1ex minus .2ex,
  afterskip = 24bp plus .2ex,
  fixskip = true,
  }
}
\fancyhf{}
\int_case:nn {\g__bithesis_report_type_int} {
  {1} {
    \fancyhead[R]{
      \fontsize{10.5pt}{10.5pt}
      \selectfont{\l__bithesis_value_title_tl}
    }
  }
  {2} {
    \fancyhead[R]{
      \fontsize{10.5pt}{10.5pt}
      \selectfont{北京理工大学本科生毕业设计（论文）开题报告}
    }
  }
}
\fancyfoot[R]{\fontsize{9pt}{9pt}\selectfont{\thepage}}
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{0pt}
\pagestyle{fancy}
\setcounter{page}{1}
\cs_set:Npn \baselinestretch {1.53}
\endinput
%%
%% End of file `bitreport.cls'.
