% \iffalse meta-comment % % Copyright (C) 2023 % Association of Bit Network Pioneer and any individual authors listed elsewhere in this file. % ----------------------------------- % % 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. % % \fi % % \iffalse %\RequirePackage{expl3,l3keys2e} %\ProvidesExplClass{bithesis} %\ProvidesExplClass{bitreport} %\ProvidesExplClass{bitbeamer} %{2024-04-16}{3.7.4}{BIT Thesis Templates} % %<*driver> \ProvidesFile{bithesis.dtx}[2024/04/16 3.7.4 BIT Thesis Templates] \documentclass[letterpaper]{l3doc} \usepackage{dtx-style} \DisableCrossrefs \RecordChanges \begin{document} \DocInput{\jobname-doc.tex} \PrintChanges \def\indexname{代码索引} %%%%% \PrintIndex \end{document} % % \fi % % \begin{macro} % \section{实现细节} % % \begin{macrocode} %<*package> % \end{macrocode} % % Identify the internal prefix (\LaTeX3 \pkg{DocStrip} convention). % \begin{macrocode} %<@@=bithesis> % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \subsection{bithesis.cls 文档类} % % \begin{macrocode} %<*thesis> % \end{macrocode} % % \subsubsection{全局变量与临时变量} % % 定义全局变量。 % \begin{variable}{\g_@@_thesis_type_int} % 论文类型,取值从 1 开始,分别对应: % \begin{enumerate} % \item 本科生毕业设计(论文) % \item 本科生毕业设计(论文)外文翻译 % \item 本科生全英文专业毕业设计(论文) % \item 硕士学位论文 % \item 博士学位论文 % \end{enumerate} % \begin{macrocode} \int_new:N \g_@@_thesis_type_int % \end{macrocode} % \end{variable} % % \begin{variable}{\g_@@_head_zihao_int} % 页眉字号。研究生论文使用 5 号字,本科生论文使用 4 号字。 % \begin{macrocode} \int_new:N \g_@@_head_zihao_int % \end{macrocode} % \end{variable} % % \begin{variable}{\g_@@_twoside_bool} % 是否双面打印。默认单面打印。 % \begin{macrocode} \bool_new:N \g_@@_twoside_bool % \end{macrocode} % \end{variable} % % \begin{variable}{\g_@@_thesis_type_english_bool} % 是否为英文模板。目前只有本科生全英文专业的模板会将此变量设置为 true。 % \begin{macrocode} \bool_new:N \g_@@_thesis_type_english_bool % \end{macrocode} % \end{variable} % % \begin{variable}{\g_@@_blind_mode_bool} % 是否为盲审模式。默认为 false。 % \begin{macrocode} \bool_new:N \g_@@_blind_mode_bool % \end{macrocode} % \end{variable} % % \begin{variable}{\g_@@_quirks_mode_bool} % 是否兼容更符合北理工官方模板或规范,但不太符合一般排版要求的模式。默认为 false。 % 目前此选项包括: % \begin{itemize} % \item \pkg{biblatex} 的专利格式不再使用国标格式,而采用北理工自定义格式。 % \end{itemize} % \begin{macrocode} \bool_new:N \g_@@_quirks_mode_bool % \end{macrocode} % \end{variable} % % \begin{variable}{\g_@@_label_divide_char_tl} % 用于分隔标签的字符。默认为「-」或者「.」。 % \begin{macrocode} \tl_new:N \g_@@_label_divide_char_tl % \end{macrocode} % \end{variable} % % \begin{variable}{\l_@@_right_seq, \l_@@_left_seq} % 定义临时变量。 % \begin{macrocode} \seq_new:N \l_@@_right_seq \seq_new:N \l_@@_left_seq % \end{macrocode} % \end{variable} % % \subsubsection{辅助函数与常量} % % \begin{macro}[added=2023-05-06,updated=2023-07-04]{\@@_secret_info:nn,\@@_secret_info:N,\@@_secret_info:n} % 普通模式下显示参数一,盲审模式下显示参数二。 % \begin{macrocode} \cs_new:Npn \@@_hide:n #1 { \g_@@_const_substitute_symbol_tl } \cs_new:Npn \@@_secret_info:nn #1 #2 { \bool_if:nTF \g_@@_blind_mode_bool { #2 } { #1 } } \cs_new:Npn \@@_secret_info:N #1 { \@@_secret_info:nn {#1} {\tl_map_function:NN #1 \@@_hide:n } } \cs_new:Npn \@@_secret_info:n #1 { \@@_secret_info:nn {#1} {\tl_map_function:NN {#1} \@@_hide:n } } % \end{macrocode} % % \end{macro} % % \begin{macro}[added=2023-03-16]{\@@_get_const:} % 获取标题、章节、表格、图形等的常量名称。 % 会区别英文模式和中文模式。 % \begin{macrocode} \cs_new:Npn \@@_get_const:N #1 { \@@_if_thesis_english:TF { \use:c {c_@@_label_ #1 _en_tl} } { \use:c {c_@@_label_ #1 _tl} } } % \end{macrocode} % \end{macro} % % \begin{macro}[added=2023-03-16]{\@@_set_english_mode:} % 设置为英文模式。 % \begin{macrocode} \cs_new:Npn \@@_set_english_mode: { \bool_gset_true:N \g_@@_thesis_type_english_bool } % \end{macrocode} % \end{macro} % % \begin{macro}{\tl_if_empty:xTF,\seq_set_split:Nnx} % 生成变体。 % \begin{macrocode} \cs_generate_variant:Nn \tl_if_empty:nTF {x} \cs_generate_variant:Nn \seq_set_split:Nnn {Nnx} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_same_page:} % 取消换页。 % \begin{macrocode} \cs_new:Npn \@@_same_page: { \let\clearpage\relax \let\cleardoublepage\relax } % \end{macrocode} % \end{macro} % \begin{macro}{\@@_if_graduate:TF} % 是否为研究生学位论文。 % \begin{macrocode} \cs_new:Npn \@@_if_graduate:TF #1#2 { \int_compare:nNnTF {3} < {\g_@@_thesis_type_int} {#1} {#2} } % \end{macrocode} % \end{macro} % \begin{macro}{\@@_if_thesis_int_type:nT,\@@_if_thesis_int_type:nTF} % 是否某一特定模板。 % \begin{macrocode} \cs_new:Npn \@@_if_thesis_int_type:nTF #1#2#3 {\int_compare:nNnTF {\g_@@_thesis_type_int} = {#1} {#2} {#3}} \cs_new:Npn \@@_if_thesis_int_type:nT #1#2 {\@@_if_thesis_int_type:nTF {#1} {#2} {}} % \end{macrocode} % \end{macro} % \begin{macro}{\@@_if_thesis_english:T,\@@_if_thesis_english:TF} % 是否为英文模板,这里包括全英文专业和研究生模板的英文模式。 % \begin{macrocode} \cs_new:Npn \@@_if_thesis_english:TF #1#2 {\bool_if:nTF {\g_@@_thesis_type_english_bool} {#1} {#2}} \cs_new:Npn \@@_if_thesis_english:T #1 {\@@_if_thesis_english:TF {#1}{}} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_if_bachelor_thesis:TF,\@@_if_bachelor_thesis:T,\@@_if_master_thesis:TF,\@@_if_doctor_thesis:TF} % 是否为本科、硕士、博士学位论文。 % \begin{macrocode} \cs_new:Npn \@@_if_bachelor_thesis:TF #1#2 {\int_compare:nNnTF {\g_@@_thesis_type_int} < {4} {#1} {#2}} \cs_new:Npn \@@_if_bachelor_thesis:T #1 {\@@_if_bachelor_thesis:TF {#1} {}} \cs_new:Npn \@@_if_master_thesis:TF #1#2 {\int_compare:nNnTF {\g_@@_thesis_type_int} = {4} {#1} {#2}} \cs_new:Npn \@@_if_doctor_thesis:TF #1#2 {\int_compare:nNnTF {\g_@@_thesis_type_int} = {5} {#1} {#2}} % \end{macrocode} % \end{macro} % % \begin{variable}{\c_@@_thesis_type_clist} % 定义论文类型的列表。 % \begin{macrocode} \clist_const:Nn \c_@@_thesis_type_clist { bachelor, bachelor_translation, bachelor_english, master, doctor} % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_publication_modes_clist} % 定义「攻读学位期间发表论文与研究成果清单」管理方式。 % \begin{macrocode} \clist_const:Nn \c_@@_publication_modes_clist { biblatex, custom } % \end{macrocode} % \end{variable} % % \begin{macro}{\@@_define_label:nn,\@@_define_label_by_thesis_type:nnn,\@@_define_label:nnn,\@@_define_label_by_thesis_type:nnnn} % 定义常量(标签)的辅助函数。 % \begin{macrocode} \cs_new_protected:Npn \@@_define_label:nn #1#2 { \tl_const:cn { c_@@_label_ #1 _tl } {#2} } \cs_new_protected:Npn \@@_define_label_by_thesis_type:nnn #1#2#3 { \tl_const:cn { c_@@_ #1 _label_ #2 _tl } {#3} } \cs_new_protected:Npn \@@_define_label:nnn #1#2#3 { \tl_const:cn { c_@@_label_ #1 _tl } {#2} \tl_const:cn { c_@@_label_ #1 _en_tl } {#3} } \cs_new_protected:Npn \@@_define_label_by_thesis_type:nnnn #1#2#3#4 { \tl_const:cn { c_@@_ #1 _label_ #2 _tl } {#3} \tl_const:cn { c_@@_ #1 _label_ #2 _en_tl } {#4} } % \end{macrocode} % \end{macro} % % \begin{macro}{\smallgap:} % 标签文字之间的间距。 % \begin{macrocode} \cs_new:Npn \smallgap: { \hspace{0.45ex} } % \end{macrocode} % \end{macro} % % \begin{macro}{\boxempty:} % 空的选框。 % \begin{macrocode} \cs_new:Npn \boxempty: { \makebox[1em][l] { % 为保证与打了勾的一致,也需套盒子 \makebox[0pt][l] { % 默认比基线略高,向下降降 \raisebox{-1pt}{$\square$} } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\boxcheck:} % 打了勾的选框。 % \begin{macrocode} \cs_new:Npn \boxcheck: { \makebox[1em][l] { \makebox[0pt][l] { % 默认比基线略高,向下降降 \raisebox{-1pt}{$\square$} } $\checkmark$ } } % \end{macrocode} % \end{macro} % % \begin{macro}{\label_space:} % 标签与内容之间的空白间距。 % \begin{macrocode} \cs_new:Npn \label_space: { \@@_if_bachelor_thesis:T { \quad } } % \end{macrocode} % \end{macro} % % \begin{variable}{\c_@@_label_code_tl,\c_@@_label_udc_tl, % \c_@@_label_classification_tl,\c_@@_label_classified_level_tl,\c_@@_label_type_tl} % 没有对应英文的常量。 % \begin{macrocode} \clist_map_inline:nn { {code} {代码}, {udc} {UDC分类号:}, {classification} {中图分类号:}, {classified_level} {密级}, {type} {种类}, {special_type} {特别类型}, {cross_research} {交叉研究方向}, {international_student_ugp} {政府项目留学生}, } {\@@_define_label:nn #1} % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_bachelor_label_xxx_tl} % 本科毕设的常量。 % \begin{macrocode} \clist_map_inline:nn { {originality} {原创性声明}, {originality_clause} {本人郑重声明:所呈交的毕业设计(论文), 是本人在指导老师的指导下独立进行研究所取得的成果。除文中已经注明引用的内容外, 本文不包含任何其他个人或集体已经发表或撰写过的研究成果。 对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。\par~特此申明。}, {authorization} {关于使用授权的声明}, {authorization_clause} {本人完全了解北京理工大学有关保管、使用毕业设计(论文)的规定, 其中包括:\circled{1}~学校有权保管、并向有关部门送交本毕业设计(论文)的原件与复印件; \circled{2}~学校可以采用影印、缩印或其它复制手段复制并保存本毕业设计(论文); \circled{3}~学校可允许本毕业设计(论文)被查阅或借阅;\circled{4}~学校可以学术交流为目的, 复制赠送和交换本毕业设计(论文);\circled{5}~学校可以公布本毕业设计(论文)的全部或部分内容。}, {originality_author_signature} {本人签名:\hspace{40mm}日\hspace{2.5mm}期:\hspace{13mm}年\hspace{8mm}月\hspace{8mm}日}, {originality_supervisor_signature} {指导老师签名:\hspace{40mm}日\hspace{2.5mm}期:\hspace{13mm}年\hspace{8mm}月\hspace{8mm}日}, } {\@@_define_label_by_thesis_type:nnn {bachelor} #1} % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_bachelor_english_label_xxx_tl} % 全英文专业的常量。 % \begin{macrocode} \clist_map_inline:nn { {originality} {原创性声明~Statement~of~Originality}, {originality_clause} { 本人郑重声明:所呈交的毕业设计(论文), 是本人在指导老师的指导下独立进行研究所取得的成果。除文中已经注明引用的内容外, 本文不包含任何其他个人或集体已经发表或撰写过的研究成果。 对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。特此申明。\par \arialfamily I,\dunderline[-1pt]{1pt}{\makebox[18mm]{}},~solemnly~ declare:~the~submitted~graduation~design~(thesis),~ is~the~research~achievement~completed~independently~by~myself~ under~the~guidance~of~the~supervisor.~This~article~does~not~contain~ any~research~published~or~written~by~any~other~individual~or~group,~ except~as~already~referenced~in~this~paper.~Individuals~and~groups~ that~have~made~important~contributions~to~the~study~of~this~paper~ are~clearly~indicated~and~cited~in~the~paper.\par }, {authorization} {关于使用授权的声明~State~of~Use~Authorization}, {authorization_clause} { 本人完全了解北京理工大学有关保管、使用毕业设计(论文)的规定, 其中包括:\circled{1}学校有权保管、并向有关部门送交本毕业设计(论文)的原件与复印件; \circled{2}学校可以采用影印、缩印或其它复制手段复制并保存本毕业设计(论文); \circled{3}学校可允许本毕业设计(论文)被查阅或借阅; \circled{4}学校可以学术交流为目的,复制赠送和交换本毕业设计(论文); \circled{5}学校可以公布本毕业设计(论文)的全部或部分内容。\par I~fully~understand~the~regulations~on~the~storage,~ use~of~graduation~design~(thesis)~in~Beijing~Institute~of~Technology.~ Beijing~Institute~of~Technology~has~the~right~to~(1)~keep,~ and~to~the~relevant~departments~to~send~the~original~or~copy~ of~this~graduation~design~(thesis);~(2)~copy~and~preserve~this~ graduation~design~(thesis)~by~photocopying,~miniature~or~other~ means~of~reproduction;~(3)~allow~this~graduation~design~(thesis)~ to~be~read~or~borrowed;~(4)~for~the~purpose~of~academic~exchange,~ copy,~give~and~exchange~this~graduation~design~(thesis);~(5)~ publish~all~or~part~of~the~contents~of~this~graduation~design~(thesis).~ }, } {\@@_define_label_by_thesis_type:nnn {bachelor_english} #1} % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_graduate_label_xxx_tl} % 研究生模板的常量。 % \begin{macrocode} \clist_map_inline:nn { {originality} {研究成果声明}, {originality_clause} {本人郑重声明:所提交的学位论文是我本人在指导教师的指导下独立完成的研究成果。文中所撰写内容符合以下学术规范(请勾选): \par \boxcheck:\hspace{0.5em} 论文综述遵循“适当引用”的规范,全部引用的内容不超过50\%。 \par \boxcheck:\hspace{0.5em} 论文中的研究数据及结果不存在篡改、剽窃、抄袭、伪造等学术不端行为,并愿意承担因学术不端行为所带来的一切后果和法律责任。 \par \boxcheck:\hspace{0.5em} 文中依法引用他人的成果,均已做出明确标注或得到许可。 \par \boxcheck:\hspace{0.5em} 论文内容未包含法律意义上已属于他人的任何形式的研究成果,也不包含本人已用于其他学位申请的论文或成果。 \par \boxcheck:\hspace{0.5em} 与本人一同工作的合作者对此研究工作所做的任何贡献均已在学位论文中作了明确的说明并表示了谢意。 \par~特此声明。}, {authorization} {关于学位论文使用权的说明}, {authorization_clause} {本人完全了解北京理工大学有关保管、使用学位论文的规定,其中包括: \par~\circled{1}~学校有权保管、并向有关部门送交学位论文的原件与复印件; \par~\circled{2}~学校可以采用影印、缩印或其它复制手段复制并保存学位论文; \par~\circled{3}~学校可允许学位论文被查阅或借阅; \par~\circled{4}~学校可以学术交流为目的,复制赠送和交换学位论文; \par~\circled{5}~学校可以公布学位论文的全部或部分内容(保密学位论文在解密后遵守此规定)。}, {originality_author_signature} {签\qquad 名:\hspace{40mm}日\hspace{2.5mm}期:\hspace{30mm}\quad}, {originality_supervisor_signature} {导师签名:\hspace{40mm}日\hspace{2.5mm}期:\hspace{30mm}\quad}, } {\@@_define_label_by_thesis_type:nnn {graduate} #1} % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_graduate_label_xxx_tl,\c_@@_graduate_label_xxx_en_tl} % 研究生模板的中英常量。 % \begin{macrocode} \clist_map_inline:nn { {author} {作\quad 者\quad 姓\quad 名} {Candidate~Name}, {school} {学\quad 院\quad 名\quad 称} {School~or~Department}, {supervisor} {指\quad 导\quad 教\quad 师} {Faculty~Mentor}, {chairman} {答辩委员会主席} {Chair,~Thesis~Committee}, {degree} {申\quad 请\quad 学\quad 位} {Degree~Applied}, {major} {学\quad 科\hspace{0.8ex} / \hspace{0.8ex} 类\quad 别} {Major}, {institute} {学\smallgap: 位\smallgap: 授\smallgap: 予\smallgap: 单\smallgap: 位} {Degree~by}, {defense_date} {论\smallgap: 文\smallgap: 答\smallgap: 辩\smallgap: 日\smallgap: 期} {The~Date~of~Defence}, } {\@@_define_label_by_thesis_type:nnnn {graduate} #1} % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_label_xxx_tl,\c_@@_label_xxx_en_tl} % 常用的中英常量。 % \begin{macrocode} \clist_map_inline:nn { {school} {学\qquad 院} {School}, {major} {专\qquad 业} {Degree}, {course} {课程名称} {Course}, {class} {班\qquad{}级} {Class}, {author} {学生姓名} {Author}, {student_id} {学\qquad 号} {Student~ID}, {supervisor} {指导教师} {Supervisor}, {co_supervisor} {校外指导教师} {Co-Supervisor}, {teacher} {任课教师} {Teacher}, {semester} {上课学期} {Semester}, {keywords} {关键词:} {Key~Words:~}, {toc} {目\label_space: 录} {Table~of~Contents}, {abstract} {摘\label_space: 要} {Abstract}, {conclusion} {结\label_space: 论} {Conclusions}, {appendix} {附\label_space: 录} {Appendices}, {ack} {致\label_space: 谢} {Acknowledgement}, {figure} {插\label_space: 图} {Illustrations}, {table} {表\label_space: 格} {Tables}, {appendix_prefix} {附录} {Appendix}, {reference} {参考文献} {References}, {university} {北京理工大学} {Beijing~Institute~of~Technology}, {publications} {攻读学位期间发表论文与研究成果清单} {Publications~During~Studies}, % TODO: Not so sure about the translation. {resume} {作者简介} {Author~Biography}, {symbols} {主要符号对照表} {Nomenclature}, {algo} {算法} {Algorithm}, {them} {定理} {Theorem}, {lem} {引理} {Lemma}, {prop} {命题} {Proposition}, {cor} {推论} {Corollary}, {axi} {公理} {Axiom}, {defn} {定义} {Definition}, {conj} {猜想} {Conjecture}, {exmp} {例} {Example}, {case} {情形} {Case}, {rem} {注} {Remark}, {fig} {图} {Figure}, {tab} {表} {Table}, {equ} {式} {Equation}, } {\@@_define_label:nnn #1} % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_bachelor_thesis_header_clist,\c_@@_bachelor_thesis_headline_clist} % 本科生模板的页眉标题与封面大标题常量列表,其中封面大标题不适用于硕士、博士学位论文,只适用于本科生毕业设计(论文)及其衍生物。 % \begin{macrocode} \clist_const:Nn \c_@@_bachelor_thesis_header_clist { 北京理工大学本科生毕业设计(论文), 北京理工大学本科生毕业设计(论文)外文翻译, Beijing~Institute~of~Technology~Bachelor's~Thesis, 北京理工大学硕士学位论文, 北京理工大学博士学位论文, } \clist_const:Nn \c_@@_bachelor_thesis_headline_clist { 本科生毕业设计(论文), 本科生毕业设计(论文)外文翻译, Beijing\nobreak{~}Institute\nobreak{~}of\nobreak{~}Technology~Bachelor's~Thesis, } % \end{macrocode} % \end{variable} % % \subsubsection{l3keys 接口键值对定义} % % 定义 |bithesis| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis } { info .meta:nn = { bithesis / info } {#1}, misc .meta:nn = { bithesis / misc } {#1}, cover .meta:nn = { bithesis / cover } {#1}, style .meta:nn = { bithesis / style } {#1}, option .meta:nn = { bithesis / option } {#1}, TOC .meta:nn = { bithesis / TOC } {#1}, appendices .meta:nn = { bithesis / appendices } {#1}, publications .meta:nn = { bithesis / publications } {#1}, const .meta:nn = { bithesis / const } {#1}, } % \end{macrocode} % % 定义 |bithesis/option| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / option } { type .choice:, type .value_required:n = true, type .choices:Vn = \c_@@_thesis_type_clist { \int_set_eq:NN \g_@@_thesis_type_int \l_keys_choice_int \int_case:nn {\l_keys_choice_int} { % 本科全英文也是英文模板。 {3} {\@@_set_english_mode:} } }, type .initial:n = bachelor, twoside .bool_gset:N = \g_@@_twoside_bool, blindPeerReview .bool_gset:N = \g_@@_blind_mode_bool, ctex .tl_set:N = \l_@@_options_to_ctex_tl, quirks .bool_gset:N = \g_@@_quirks_mode_bool, % xeCJK autoFakeBold .tl_set:N = \g_@@_auto_fake_bold_tl, autoFakeBold .initial:n = {3}, % 是否开启英文模式。目前在设计上,这个选项仅对研究生模板生效。 % 本科生模板的英文模式是根据 |type| 选项自动判断的。 english .code:n = { \@@_set_english_mode: } , } % \end{macrocode} % % 定义 |bithesis/cover| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / cover } { date .tl_set:N = \l_@@_cover_date_tl, headerImage .tl_set:N = \l_bit_coverheaderimage_tl, xiheiFont .tl_set:N = \l_@@_cover_xihei_font_path_tl, xiheiFont .default:n = {STXihei}, %% cover entry dilimiter .tl_set:N = \l_@@_cover_dilimiter_tl, labelAlign .tl_set:N = \l_@@_cover_label_align_tl, labelAlign .initial:n = {r}, valueAlign .tl_set:N = \l_@@_cover_value_align_tl, valueAlign .initial:n = {c}, labelMaxWidth .dim_set:N = \l_@@_cover_label_max_width_dim, valueMaxWidth .dim_set:N = \l_@@_cover_value_max_width_dim, autoWidthPadding .dim_set:N = \l_@@_cover_auto_width_padding_dim, autoWidthPadding .initial:n = {0.25em}, autoWidth .bool_set:N = \l_@@_cover_auto_width_bool, autoWidth .initial:n = {true}, underlineThickness .dim_set:N = \l_@@_cover_underline_thickness_dim, underlineThickness .initial:n = {1pt}, underlineOffset .dim_set:N = \l_@@_cover_underline_offset_dim, underlineOffset .initial:n = { -10pt }, hideCoverInPeerReview .bool_set:N = \l_@@_cover_hide_cover_in_peer_review_bool, hideCoverInPeerReview .initial:n = {false}, % 研究生的「特殊类型」 showSpecialTypeBox .bool_set:N = \l_@@_cover_show_special_type_box_bool, showSpecialTypeBox .initial:n = {false} } % \end{macrocode} % % 定义 |bithesis/info| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / info } { title .tl_set:N = \l_@@_value_title_tl, title .initial:n = {形状记忆聚氨酯的合成及其在织物中的应用(示例)}, titleEn .tl_set:N = \l_@@_value_title_en_tl, titleEn .initial:n = {Synthesis~and~Application~on~Texttiles~of~the~Shape~Memory~Polyurethane~(example)}, % 因为是覆盖选项,所以不需要设置初始值。 verticalTitle .tl_set:N = \l_@@_value_vertical_title_tl, school .tl_set:N = \l_@@_value_school_tl, major .tl_set:N = \l_@@_value_major_tl, class .tl_set:N = \l_@@_value_class_tl, % 课程名称,读书报告使用 course .tl_set:N = \l_@@_value_course_tl, author .tl_set:N = \l_@@_value_author_tl, studentId .tl_set:N = \l_@@_value_student_id_tl, % 指导教师 supervisor .tl_set:N = \l_@@_value_supervisor_tl, % 因为默认不显示,所以不需要设置初始值。 externalSupervisor .tl_set:N = \l_@@_value_external_supervisor_tl, % 任课教师,读书报告使用 teacher .tl_set:N = \l_@@_value_teacher_tl, % 上课学期,读书报告使用 semester .tl_set:N = \l_@@_value_semester_tl, keywords .tl_set:N = \l_@@_value_keywords_tl, keywords .initial:n = {聚氨酯,形状记忆,织物(示例)}, keywordsEn .tl_set:N = \l_@@_value_keywords_en_tl, keywordsEn .initial:n = {Polyurethane,Shape Memory,Textiles (example)}, translationTitle .tl_set:N = \l_@@_value_trans_title_tl, translationOriginTitle .tl_set:N = \l_@@_value_trans_origin_title_tl, % 中图分类号,研究生学位论文使用 classification .tl_set:N = \l_@@_value_classification_tl, classification .initial:n = {TQ~028.1(示例)}, % UDC 分类号,研究生学位论文使用 UDC .tl_set:N = \l_@@_value_udc_tl, UDC .initial:n = {540(示例)}, chairman .tl_set:N = \l_@@_value_chairman_tl, degree .tl_set:N = \l_@@_value_degree_tl, degreeEn .tl_set:N = \l_@@_value_degree_en_tl, institute .tl_set:N = \l_@@_value_institute_tl, institute .initial:n = {\tl_use:N \c_@@_label_university_tl}, defenseDate .tl_set:N = \l_@@_value_defense_date_tl, authorEn .tl_set:N = \l_@@_value_author_en_tl, schoolEn .tl_set:N = \l_@@_value_school_en_tl, supervisorEn .tl_set:N = \l_@@_value_supervisor_en_tl, chairmanEn .tl_set:N = \l_@@_value_chairman_en_tl, majorEn .tl_set:N = \l_@@_value_major_en_tl, instituteEn .tl_set:N = \l_@@_value_institute_en_tl, instituteEn .initial:n = {\c_@@_label_university_en_tl}, defenseDateEn .tl_set:N = \l_@@_value_defense_date_en_tl, defenseDateEn .initial:n = {June,~2019~(example)}, % 因为默认不显示,所以不需要设置初始值。 classifiedLevel .tl_set:N = \l_@@_value_classified_level_tl, % 特别类型-交叉研究方向 crossResearch .bool_set:N = \l_@@_value_cross_research_bool, crossResearch .initial:n = {false}, % 特别类型-政府项目留学生 internationalStudentUGP .bool_set:N = \l_@@_value_international_student_ugp_bool, internationalStudentUGP .initial:n = {false}, } % \end{macrocode} % % 定义 |bithesis/misc| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / misc } { % 表格字体大小,默认为 5 号字体。 tabularFontSize .tl_set:N = \l_@@_misc_tabular_font_size_tl, tabularFontSize .initial:n = {5}, arialFont .tl_set:N = \l_@@_misc_arial_font_path_tl, autoref / algo .code:n = { \AtBeginDocument{ % 定义算法标题 % 针对 algorithm 宏包 \tl_set:Nn \ALG@name {#1} % 针对 algorithm2e 宏包 \tl_set:Nn \algorithmcfname {#1} % 定义算法的 autoref % algorithm2e 宏包会覆写它,所以我们必须AtBeginDocument时再修改 \tl_set:Nn \algorithmautorefname {#1} } }, autoref / algo .initial:n = {\g_@@_const_autoref_algo_tl}, autoref / them .tl_set:N = \themautorefname, autoref / them .initial:n = {\g_@@_const_autoref_them_tl}, autoref / lem .tl_set:N = \lemautorefname, autoref / lem .initial:n = {\g_@@_const_autoref_lem_tl}, autoref / prop .tl_set:N = \propautorefname, autoref / prop .initial:n = {\g_@@_const_autoref_prop_tl}, autoref / cor .tl_set:N = \corautorefname, autoref / cor .initial:n = {\g_@@_const_autoref_cor_tl}, autoref / axi .tl_set:N = \axiautorefname, autoref / axi .initial:n = {\g_@@_const_autoref_axi_tl}, autoref / defn .tl_set:N = \defnautorefname, autoref / defn .initial:n = {\g_@@_const_autoref_defn_tl}, autoref / conj .tl_set:N = \conjautorefname, autoref / conj .initial:n = {\g_@@_const_autoref_conj_tl}, autoref / exmp .tl_set:N = \exmpautorefname, autoref / exmp .initial:n = {\g_@@_const_autoref_exmp_tl}, autoref / case .tl_set:N = \caseautorefname, autoref / case .initial:n = {\g_@@_const_autoref_case_tl}, autoref / rem .tl_set:N = \remautorefname, autoref / rem .initial:n = {\g_@@_const_autoref_rem_tl}, hideLinks .bool_set:N = \l_@@_misc_hide_links_bool, hideLinks .initial:n = {true}, autoref / figure .tl_set:N = \figureautorefname, autoref / figure .initial:n = {\g_@@_const_autoref_fig_tl}, autoref / table .tl_set:N = \tableautorefname, autoref / table .initial:n = {\g_@@_const_autoref_tab_tl}, autoref / equ .tl_set:N = \equationautorefname, autoref / equ .initial:n = {\g_@@_const_autoref_equ_tl}, % 浮动体与正文之间的距离 floatSeparation .tl_set:N = \l_@@_misc_float_separation_tl, floatSeparation .initial:n = {0}, } % \end{macrocode} % % 定义 |bithesis/const| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / const } { autoref .meta:nn = { bithesis / const / autoref } { #1 }, style .meta:nn = { bithesis / const / style } { #1 }, info .meta:nn = { bithesis / const / info } { #1 }, } \keys_define:nn { bithesis / const / autoref } { algo .tl_set:N = \g_@@_const_autoref_algo_tl, algo .initial:n = {\@@_get_const:N {algo}}, them .tl_set:N = \g_@@_const_autoref_them_tl, them .initial:n = {\@@_get_const:N {them}}, lem .tl_set:N = \g_@@_const_autoref_lem_tl, lem .initial:n = {\@@_get_const:N {lem}}, prop .tl_set:N = \g_@@_const_autoref_prop_tl, prop .initial:n = {\@@_get_const:N {prop}}, cor .tl_set:N = \g_@@_const_autoref_cor_tl, cor .initial:n = {\@@_get_const:N {cor}}, axi .tl_set:N = \g_@@_const_autoref_axi_tl, axi .initial:n = {\@@_get_const:N {axi}}, defn .tl_set:N = \g_@@_const_autoref_defn_tl, defn .initial:n = {\@@_get_const:N {defn}}, conj .tl_set:N = \g_@@_const_autoref_conj_tl, conj .initial:n = {\@@_get_const:N {conj}}, exmp .tl_set:N = \g_@@_const_autoref_exmp_tl, exmp .initial:n = {\@@_get_const:N {exmp}}, case .tl_set:N = \g_@@_const_autoref_case_tl, case .initial:n = {\@@_get_const:N {case}}, rem .tl_set:N = \g_@@_const_autoref_rem_tl, rem .initial:n = {\@@_get_const:N {rem}}, figure .tl_set:N = \g_@@_const_autoref_fig_tl, figure .initial:n = {\@@_get_const:N {fig}}, table .tl_set:N = \g_@@_const_autoref_tab_tl, table .initial:n = {\@@_get_const:N {tab}}, equ .tl_set:N = \g_@@_const_autoref_equ_tl, equ .initial:n = {\@@_get_const:N {equ}}, } \keys_define:nn { bithesis / const / style } { substituteSymbol .tl_set:N = \g_@@_const_substitute_symbol_tl, substituteSymbol .initial:n = {*}, } \keys_define:nn { bithesis / const / info } { degree .tl_set:N = \g_@@_const_info_degree_tl, degree .initial:n = { \c_@@_graduate_label_degree_tl }, major .tl_set:N = \g_@@_const_info_major_tl, major .initial:n = { \@@_if_graduate:TF { \c_@@_graduate_label_major_tl } { \@@_get_const:N {major} } }, } % \end{macrocode} % % 定义 |bithesis/style| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / style } { head .tl_set:N = \l_@@_style_head_tl, head .initial:n = { \clist_item:Nn \c_@@_bachelor_thesis_header_clist \g_@@_thesis_type_int }, headline .tl_set:N = \l_@@_style_headline_tl, headline .initial:n = { \clist_item:Nn \c_@@_bachelor_thesis_headline_clist \g_@@_thesis_type_int }, bibliographyIndent .bool_set:N = \l_@@_style_bibliography_indent_bool, bibliographyIndent .initial:n = {true}, pageVerticalAlign .choices:nn = {top, scattered} { \tl_if_eq:NnTF \l_keys_choice_tl {top} { \raggedbottom } { \flushbottom } }, pageVerticalAlign .initial:n = {top}, % 数学字体配置 mathFont .choices:nn = { asana, bonum, cm, concrete, dejavu, erewhon, euler, fira, garamond, gfsneohellenic, kp, libertinus, lm, newcm, pagella, schola, stix, stix2, termes, xcharter, xits, none, } { \tl_set_eq:NN \l_@@_style_math_font_tl \l_keys_choice_tl }, mathFont .initial:n = {cm}, % Options that will be pass to `unicode-math` pkgs. unicodeMathOptions .tl_set:N = \l_@@_unicode_math_options_tl, % Windows 平台开启宋体伪粗体。 windowsSimSunFakeBold .bool_set:N = \l_@@_style_windows_simsum_fake_bold, windowsSimSunFakeBold .initial:n = {false}, % 控制英文是否使用 hyphen 进行换行 hyphen .bool_set:N = \l_@@_style_hyphen_bool, hyphen .initial:n = {true}, % 控制公式和上下文的距离 mathAboveDisplaySkip .dim_set:N = \l_@@_style_math_above_display_skip_dim, mathAboveDisplaySkip .initial:n = {3pt}, mathBelowDisplaySkip .dim_set:N = \l_@@_style_math_below_display_skip_dim, mathBelowDisplaySkip .initial:n = {3pt}, betterTimesNewRoman .bool_set:N = \l_@@_style_better_new_roman_bool, betterTimesNewRoman .initial:n = {false}, } % \end{macrocode} % % 定义 |bithesis/TOC| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / TOC } { abstract .bool_set:N = \l_@@_add_abstract_to_toc_bool, abstract .initial:n = {true}, abstractEn .bool_set:N = \l_@@_add_abstract_en_to_toc_bool, abstractEn .initial:n = {true}, symbols .bool_set:N = \l_@@_add_symbols_to_toc_bool, symbols .initial:n = {true}, } % \end{macrocode} % % 定义 |bithesis/appendices| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / appendices } { chapterLevel .bool_set:N = \l_@@_appendices_chapter_level_bool, title .tl_set:N = \l_@@_appendices_title_tl, TOCTitle .tl_set:N = \l_@@_appendix_toc_title_tl, } % \end{macrocode} % % 定义 |bithesis/appendices| 键值对类。 % \begin{macrocode} \keys_define:nn { bithesis / publications } { % mode .choice:, % mode .value_required:n = true, % mode .choices:Vn = % \c_@@_publication_modes_clist % { % \int_new:N \l_@@_publication_mode_int % \int_set:Nn \l_@@_publication_mode_int \l_keys_choice_int % }, % mode .initial:n = biblatex, sorting .bool_set:N = \l_@@_publications_sorting_bool, sorting .initial:n = {true}, omit .bool_set:N = \l_@@_publications_omit_bool, omit .initial:n = {false}, maxbibnames .int_set:N = \l_@@_publications_maxbibnames_int, maxbibnames .initial:n = {3}, minbibnames .int_set:N = \l_@@_publications_minbibnames_int, minbibnames .initial:n = {1}, } % \end{macrocode} % 在宏加载时,处理 |bithesis/option| 中的值。使得 |bithesis| % 宏包的模板选项可以在宏加载时生效。 % \begin{macrocode} \ProcessKeysOptions { bithesis / option } % \end{macrocode} % % \subsubsection{处理模板选项} % % 英文模板需要开启 ctexbook 宏包的英文选项。 % \begin{macrocode} \@@_if_thesis_english:T { \PassOptionsToClass{scheme=plain}{ctexbook} } % \end{macrocode} % 如果设置 blindPeerReview 选项,则抑制 twoside 选项。 % \begin{macrocode} \bool_if:NT \g_@@_blind_mode_bool { \bool_set_false:N \g_@@_twoside_bool } % \end{macrocode} % % 如果没有开启双面打印选项,则在 ctexbook 中开启单面打印选项。 % 允许 chapter 直接另起一页(即使是偶数(左手)页)。 % \begin{macrocode} \bool_if:NTF \g_@@_twoside_bool {} { \PassOptionsToClass{oneside}{ctexbook} } \PassOptionsToClass{openany}{ctexbook} % \end{macrocode} % % 将 |bithesis/option/ctex| 中的值传递给 ctexbook 模板类。 % \begin{macrocode} % Any extra option passed by user will be passed to ctexbook. \DeclareOption*{ \PassOptionsToClass{\l_@@_options_to_ctex_tl}{ctexbook} } % \end{macrocode} % % 抑制 fontspec 宏包关于字体的警告信息。 % 手动开启伪粗体、伪斜体。 % \begin{macrocode} \PassOptionsToPackage{quiet,AutoFakeBold=\g_@@_auto_fake_bold_tl,AutoFakeSlant}{xeCJK} % \end{macrocode} % 加载 ctexbook 模板类。 % \begin{macrocode} \ProcessOptions\relax \LoadClass[zihao=-4,]{ctexbook} % \end{macrocode} % % \subsubsection{定义模板类样式} % % 加载所需的宏包。 % \begin{macrocode} \RequirePackage{geometry} \RequirePackage[table,xcdraw]{xcolor} \RequirePackage{xeCJK} \RequirePackage{titletoc} \RequirePackage{graphicx} \RequirePackage{fancyhdr} \RequirePackage{pdfpages} \RequirePackage[nodisplayskipstretch]{setspace} \RequirePackage{booktabs} \RequirePackage{multirow} \RequirePackage{tikz} \RequirePackage{etoolbox} % Hide color and border in hyperref. \RequirePackage[bookmarksnumbered]{hyperref} % 详见 `caption` 宏包手册和 % https://github.com/CTeX-org/forum/issues/86 \RequirePackage[strut=off]{caption} \RequirePackage{array} \RequirePackage{amsmath} \RequirePackage{amssymb} \RequirePackage{pifont} \RequirePackage{amsthm} \RequirePackage{pdfpages} \RequirePackage{listings} \RequirePackage{enumitem} \RequirePackage{fmtcount} % \end{macrocode} % % 抑制 \pkg{hyperref} 中对 |\hskip| 的 warning 信息。 % \begin{macrocode} \pdfstringdefDisableCommands{% \let\quad\empty } % \end{macrocode} % % 设置页眉字号,页边距。 % % 需要注意的是,根据 \pkg{geometry} 的规则, % |headsep| 和 |footskip| 分别受到 |top| 与 |bottom| 的影响。 % 所以你能看到在计算 |headsep| 与 |footskip| 时,我们 % 首先计算了相应的偏移量。 % \begin{macrocode} \@@_if_graduate:TF { \int_set:Nn \g_@@_head_zihao_int {5} \geometry{ a4paper, left=2.7cm, bottom=2.5cm + 7bp, top=3.5cm + 7bp, right=2.7cm, % `headsep' is affected by `top' option. headsep = 3.5cm + 7bp - 2.5cm - 15bp, headheight = 15 bp, % `footskip' is affected by `bottom' option. footskip = 2.5cm + 7bp - 1.8cm, } } { \int_set:Nn \g_@@_head_zihao_int {4} \geometry{ a4paper, left=3cm, bottom=2.6cm + 7bp, top=3.5cm + 7bp, right=2.6cm, % `headsep' is affected by `top' option. headsep = 3.5cm + 7bp - 2.4cm - 20bp, headheight = 20 bp, % `footskip' is affected by `bottom' option. footskip = 2.6cm + 7bp - 2cm, } } % \end{macrocode} % % 根据学校的要求,在本科生模板图片前后加上一行空白。 % \begin{macrocode} \@@_if_bachelor_thesis:T { % 浮动体位于正文中间时,调整浮动体与上下正文之间的距离,即"前后加上一行空白" \setlength{\intextsep}{1.80\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip} % 浮动体位于页面顶部或底部时,调整浮动体与正文之间的距离,后或前加上一行空白 \setlength{\textfloatsep}{1.80\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip} } % \end{macrocode} % % \subsubsection{定义字体相关选项} % % 设置 Times New Roman 字体。 % 根据学校规范要求,默认情况下也使用 Times New Roman 字体。 % \begin{macrocode} \ctex_at_end_preamble:n { \bool_if:NTF \l_@@_style_better_new_roman_bool { \defaultfontfeatures[TeX~Gyre~Termes] { Extension = .otf , UprightFont = texgyretermes-regular, BoldFont = texgyretermes-bold, ItalicFont = texgyretermes-italic, BoldItalicFont = texgyretermes-bolditalic, } \setmainfont{TeX~Gyre~Termes} }{ \setmainfont{Times~New~Roman} \setromanfont{Times~New~Roman} } } % \end{macrocode} % % \begin{macro}{\@@_font_path:} % 当选择使用字体文件配置字体时,设置字体文件路径。 % \begin{macrocode} \cs_new:Npn \@@_font_path: { \str_if_eq:NNTF { \l_@@_font_type_tl } { font } { } { Path = \l_@@_font_path_tl / , } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_load_unicode_math_pkg:} % 加载\pkg{unicode-math}宏包。 % \begin{macrocode} \cs_new:Npn \@@_load_unicode_math_pkg: { \PassOptionsToPackage { \l_@@_unicode_math_options_tl } { unicode-math } \RequirePackage { unicode-math } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_define_math_font:nn} % 批量定义数学字体配置。 % \begin{arguments} % \item 配置名称。 % \item 字体名称。 % \end{arguments} % \begin{macrocode} \cs_new:Npn \@@_define_math_font:nn #1#2 { \cs_new:cpn { @@_load_math_font_ #1 : } { \@@_load_unicode_math_pkg: \setmathfont { #2 } } } \clist_map_inline:nn { { asana } { Asana-Math.otf }, { concrete } { Concrete-Math.otf }, { erewhon } { Erewhon-Math.otf }, { euler } { Euler-Math.otf }, { fira } { FiraMath-Regular.otf }, { garamond } { Garamond-Math.otf }, { gfsneohellenic } { GFSNeohellenicMath.otf }, { kp } { KpMath-Regular.otf }, { libertinus } { LibertinusMath-Regular.otf }, { lm } { latinmodern-math.otf }, { newcm } { NewCMMath-Regular.otf }, { stix } { STIXMath-Regular.otf }, { stix2 } { STIXTwoMath-Regular.otf }, { xcharter } { XCharter-Math.otf }, { xits } { XITSMath-Regular.otf }, { bonum } { texgyrebonum-math.otf }, { dejavu } { texgyredejavu-math.otf }, { pagella } { texgyrepagella-math.otf }, { schola } { texgyreschola-math.otf }, { termes } { texgyretermes-math.otf } } { \@@_define_math_font:nn #1 } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_load_math_font_cm:} % 数学字体配置 |cm|。 % \begin{macrocode} \cs_new:Npn \@@_load_math_font_cm: { } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_load_math_font_none:} % 数学字体配置 |none|。 % \begin{macrocode} \cs_new:Npn \@@_load_math_font_none: { } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_load_font:} % 加载数学字体 % \begin{macrocode} \cs_new:Npn \@@_load_font: { \use:c { @@_load_math_font_ \l_@@_style_math_font_tl : } } % \end{macrocode} % \end{macro} % % \paragraph{定义导言区末尾加载内容} % % 在 |preamble| 中,加载各个模板需要的字体。 % \begin{macrocode} \ctex_at_end_preamble:n { % 针对 Windows 字体采用 Fake Bold 宋体 \bool_if:NT \l_@@_style_windows_simsum_fake_bold { \RequirePackage{ifplatform} \ifwindows \setCJKmainfont{SimSun}[AutoFakeBold,AutoFakeSlant] \fi } % 在导言区末尾加载数学字体。 \@@_load_font: % misc / hideLinks 选项 \bool_if:NTF \l_@@_misc_hide_links_bool { \hypersetup { hidelinks } } { \definecolor{blue}{RGB}{10,10,110} \hypersetup{ colorlinks=true, } } \@@_if_thesis_english:TF { \@@_if_thesis_int_type:nT {3} { % 对于本科全英文专业模板 % Font Arial is needed. \newfontfamily\arialfamily{Arial} } } { % 对于其他的中文模板, % 需要加载细黑体。 \tl_if_blank:VTF \l_@@_cover_xihei_font_path_tl {} { \setCJKfamilyfont{xihei}[AutoFakeBold,AutoFakeSlant] {\l_@@_cover_xihei_font_path_tl} } } % 对于本科全英文专业模板,需要自定义日期格式。 \@@_if_thesis_int_type:nT {3} { \RequirePackage[en-US]{datetime2} \RequirePackage{indentfirst} \DTMlangsetup[en-US]{dayyearsep={\space}} } % Define biblatex category if it was imported. % 这部分是给研究生模板中的 % 「攻读学位期间发表论文与研究成果清单」使用的。 \cs_if_exist:NT \DeclareBibliographyCategory { \DeclareBibliographyCategory{mypub} } % Define biblatex strings if it was imported. % 这部分是给研究生模板中的 % gbpunctin = false 时使用的。 \cs_if_exist:NT \DefineBibliographyStrings { \DefineBibliographyStrings{english}{in={}} \DefineBibliographyStrings{english}{incn={}} } % 修改 biblatex 中「专利」(patent)部分的著录格式。 % 主要根据北理工自定义的规范,参考 biblatex 和 % biblatex-gb7714-2015 的实现修改而成。 % % 默认不开启,因为此修改可能会产生其他边界问题。 \bool_if:NT \g_@@_quirks_mode_bool { \cs_if_exist:NT \DeclareBibliographyDriver { % % 重设专利title的输出,将文献类型标识符输出出去 % \newbibmacro*{patenttitle}{%原输出来自biblatex.def文件 \ifboolexpr{% test{\iffieldundef{title}}% and% test{\iffieldundef{subtitle}}% }% {}% {\printtext[title]{\bibtitlefont% \printfield[titlecase]{title}% \ifboolexpr{test {\iffieldundef{subtitle}}}%这里增加了对子标题的判断,解决不判断多一个点的问题 {}{\setunit{\subtitlepunct}% \printfield[titlecase]{subtitle}}% \iftoggle{bbx:gbtype}{\printfield[gbtypeflag]{usera}}{}% \iffieldundef{titleaddon}{}%判断一下titleaddon,否则直接加可能多一个空格 {\setunit{\subtitlepunct}\printfield{titleaddon}}% % :地区 \setunit{\subtitlepunct}\iflistundef{location} {} {\setunit*{\subtitlepunct}% \printtext{%[parens] \printlist[][-\value{listtotal}]{location}}}% % ,专利号 \setunit{\addcomma\addspace}\printfield{number}%写专利号 \setunit{\addcomma\addspace} \usebibmacro{newsdate}% }% }% } % % 重定义专利文献驱动 % \DeclareBibliographyDriver{patent}{%源来自standard.BBX \usebibmacro{bibindex}% \usebibmacro{begentry}% \usebibmacro{author}% \ifnameundef{author}{}{\setunit{\labelnamepunct}\newblock}%这一段用于去除作者不存在时多出的标点 \usebibmacro{patenttitle}%给出专利专用的标题输出 \iftoggle{bbx:gbstrict}{}{% \newunit% \printlist{language}% \newunit\newblock \usebibmacro{byauthor} }% \newunit\newblock \printfield{type}% \setunit*{\addspace}% \newunit\newblock \usebibmacro{byholder}% \newunit\newblock \printfield{note}% \newunit\newblock \usebibmacro{doi+eprint+url}% \newunit\newblock \usebibmacro{addendum+pubstate}% \setunit{\bibpagerefpunct}\newblock \usebibmacro{pageref}% \newunit\newblock \iftoggle{bbx:related} {\usebibmacro{related:init}% \usebibmacro{related}} {}% \usebibmacro{annotation}\usebibmacro{finentry}} } } } % \end{macrocode} % % \begin{macro}{\xihei:n} % 定义细黑字体。 % \begin{macrocode} \cs_new:Npn \xihei:n #1 { \xeCJK_family_if_exist:nTF {xihei} { \CJKfamily{xihei} #1 }{ \heiti #1 } } % \end{macrocode} % \end{macro} % % \begin{macro}{\l_@@_title_font_cs:n} % 定义标题字体。 % \begin{macrocode} \cs_new:Npn \l_@@_title_font_cs:n #1 { \int_compare:nNnTF {\g_@@_thesis_type_int} = {3} { \arialfamily #1 } { \heiti #1 } } % \end{macrocode} % \end{macro} % % \begin{macro}{\l_@@_unnumchapter_style_cs:n} % 定义无序章节的样式。 % \begin{macrocode} \cs_new:Npn \l_@@_unnumchapter_style_cs:n #1 { % 本科全英文、研究生学位论文需要加粗 \int_compare:nNnTF {\g_@@_thesis_type_int} > {2} { \bfseries #1 } { \mdseries #1 } } % \end{macrocode} % \end{macro} % % \begin{macro}{\arabicHeiti} % 遗留下来的黑体字体定义。 % \begin{macrocode} \cs_set:Npn \arabicHeiti #1 {#1} % \end{macrocode} % \end{macro} % % 定义 \pkg{fancyhdr} 的页眉页脚。 % \begin{macrocode} \fancypagestyle{BIThesis}{ \fancyhf{} % 定义页眉、页码 \fancyhead[C]{ \zihao{\int_use:N \g_@@_head_zihao_int} \ziju{0.08} \songti{\tl_use:N \l_@@_style_head_tl} } \fancyfoot[C]{\songti\zihao{5} \thepage} % 页眉分割线稍微粗一些 \RenewDocumentCommand \headrulewidth {} {0.6pt} } % \end{macrocode} % % 定义 \pkg{ctex} 的章节标题形式。 % \begin{macrocode} \ctexset{chapter={ number = {\arabicHeiti{ \arabic{chapter} }}, format = { \l_@@_title_font_cs:n \bfseries \centering \zihao{3}}, nameformat = {}, titleformat = {}, aftername = \hspace{9bp}, pagestyle = BIThesis, beforeskip = 8bp, afterskip = 32bp, fixskip = true, lofskip = 0cm, lotskip = 0cm, } } \ctexset{section={ number = {\arabicHeiti{\thechapter.\hspace{1bp}\arabic{section}}}, format = {\l_@@_title_font_cs:n \raggedright \bfseries \zihao{4}}, nameformat = {}, titleformat = {}, aftername = \hspace{8bp}, beforeskip = 20bp, afterskip = 17bp, fixskip = true, } } \ctexset{subsection={ number = { \arabicHeiti{ \thechapter.\hspace{1bp} \arabic{section}.\hspace{1bp} \arabic{subsection} } }, format = {\l_@@_title_font_cs:n \bfseries \raggedright \zihao{-4}}, nameformat = {}, titleformat = {}, aftername = \hspace{7bp}, beforeskip = 17bp, afterskip = 17bp, fixskip = true, } } \ctexset{ secnumdepth = 3, subsubsection={ numbering = true, number = { \arabicHeiti{ \arabic{chapter}.\hspace{1bp} \arabic{section}.\hspace{1bp} \arabic{subsection}.\hspace{1bp} \arabic{subsubsection} } }, format={\l_@@_title_font_cs:n \raggedright \zihao{-4}}, nameformat = {}, titleformat = {}, beforeskip=14bp, afterskip=14bp, fixskip=true, } } % \end{macrocode} % % 定义 TOC 样式。 % \begin{macrocode} \addtocontents{toc}{\protect\hypersetup{hidelinks}} \@@_if_graduate:TF { % 对于研究生模板,定义各章标题为宋体四号。 \titlecontents{chapter}[0pt]{\songti \zihao{4}} {\thecontentslabel\hspace{\ccwd}}{} {\hspace{.5em}\titlerule*{.}\contentspage} % section 标题为宋体小四号。缩进为两个字符宽度。 \titlecontents{section}[2\ccwd]{\songti \zihao{-4}} {\thecontentslabel\hspace{\ccwd}}{} {\hspace{.5em}\titlerule*{.}\contentspage} % subsection 标题为宋体小四号。缩进为四个字符宽度。 \titlecontents{subsection}[4\ccwd]{\songti \zihao{-4}} {\thecontentslabel\hspace{\ccwd}}{} {\hspace{.5em}\titlerule*{.}\contentspage} } { % 对于其他,定义各章标题为宋体小四号。 \titlecontents{chapter}[0pt]{\songti \zihao{-4}} {\thecontentslabel\hspace{\ccwd}}{} {\hspace{.5em}\titlerule*{.}\contentspage} % section 标题为宋体小四号。 \titlecontents{section}[1\ccwd]{\songti \zihao{-4}} {\thecontentslabel\hspace{\ccwd}}{} {\hspace{.5em}\titlerule*{.}\contentspage} % subsection 标题为宋体小四号。 \titlecontents{subsection}[2\ccwd]{\songti \zihao{-4}} {\thecontentslabel\hspace{\ccwd}}{} {\hspace{.5em}\titlerule*{.}\contentspage} } % listoffigure 样式优化 \titlecontents{figure}[0pt]{\songti\zihao{-4}} {\figurename~\thecontentslabel\quad}{\hspace*{-1.5cm}} {\hspace{.5em}\titlerule*{.}\contentspage} % listoftable 样式优化 \titlecontents{table}[0pt]{\songti\zihao{-4}} {\tablename~\thecontentslabel\quad}{\hspace*{-1.5cm}} {\hspace{.5em}\titlerule*{.}\contentspage} % \end{macrocode} % % \begin{macro}{\frontmatter} % 定义前置内容的页面样式。 % \begin{macrocode} \RenewDocumentCommand \frontmatter {} { \int_compare:nNnTF {\g_@@_thesis_type_int} = {3} { % 本科全英文专业论文,页码使用小罗马数字。 \pagenumbering{roman} } { \pagenumbering{Roman} } % 这部分的章节标题不进行编号。 \ctexset{ chapter = { numbering = false, } } \linespread{1.53}\selectfont \pagestyle{BIThesis} % 表格内容默认使用五号字。 % % 由于这种方式会影响所有的表格, % 所以我们尽可能延迟这种影响。 % % 不过,在目前的代码实现中没有在封面 % 之类的地方使用表格,所以目前即使放在 % preamble 中也不会有影响。 \AtBeginEnvironment{tabular}{\zihao{\l_@@_misc_tabular_font_size_tl}} \AtBeginEnvironment{tabular*}{\zihao{\l_@@_misc_tabular_font_size_tl}} } % \end{macrocode} % \end{macro} % % \begin{macro}{\mainmatter} % 主体内容的页面样式。 % \begin{macrocode} \RenewDocumentCommand \mainmatter {} { % 另起一个空页,以便于后续的章节标题编号。 % \clearpage \cleardoublepage % 这部分的章节标题进行编号。 \ctexset{ chapter = { numbering = true, } } % 页码使用阿拉伯数字。 \pagenumbering{arabic} \pagestyle{BIThesis} % 正文 22 磅的行距 \setlength{\parskip}{0em} \linespread{1.53}\selectfont % 修复脚注出现跨页的问题 \interfootnotelinepenalty=10000 } % \end{macrocode} % \end{macro} % % \begin{macro}{\backmatter} % 后置内容的页面样式。 % \begin{macrocode} \RenewDocumentCommand \backmatter {} { % 同样,所有的章节标题不进行编号。 \setcounter{section}{0} \setcounter{subsection}{0} \setcounter{subsubsection}{0} \ctexset{ chapter = { numbering = false, beforeskip = 18bp, format = { \l_@@_title_font_cs:n \l_@@_unnumchapter_style_cs:n \centering \zihao{3} }, afterskip = 26bp, } } } % \end{macrocode} % \end{macro} % % 定义标题的前后间距。 % \begin{macrocode} \setlength{\abovecaptionskip}{11pt} \@@_if_bachelor_thesis:TF { \@@_if_thesis_english:TF { \setlength{\belowcaptionskip}{9pt} } { % 为了满足 “前后一行空白的问题”,需要删除 Caption 下方的间距。 % 详见 `caption` 宏包手册和 % https://github.com/CTeX-org/forum/issues/86 % % 这里实际的 skip 在 15pt 左右,但是全部移除会导致当图片置于页面顶部时, % 图片与上方的间距过小,因此这里只移除 5pt。 % 当然,这样会导致文本间的图片的 Caption 下方的间距微微大于一行。 \captionsetup{belowskip=-5pt} } } { % 而研究生模板不存在这个问题。 \setlength{\belowcaptionskip}{9pt} } % \end{macrocode} % % 定义分隔字符。 % \begin{macrocode} \@@_if_graduate:TF { \tl_set:Nn \g_@@_label_divide_char_tl {.} % 研究生模板要求 "图序和图题间空1个中文字距" \captionsetup[figure]{font=small,labelsep=quad} % 研究生模板要求 "表序和题目间空1个中文字距" \captionsetup[table]{font=small,labelsep=quad} % 其它 caption 也参照上述格式 \captionsetup[lstlisting]{font=small,labelsep=quad} \captionsetup[algorithm]{font=small,labelsep=quad} } { \tl_set:Nn \g_@@_label_divide_char_tl {-} % 本科生模板无 caption 字距要求 \captionsetup[figure]{font=small,labelsep=space} \captionsetup[table]{font=small,labelsep=space} \captionsetup[lstlisting]{font=small,labelsep=space} \captionsetup[algorithm]{font=small,labelsep=space} } % \end{macrocode} % % \begin{macro}{\thefigure,\thetable,\theequation,\thelstlisting,\lstlistingname} % 定义各种计数器的格式。 % \begin{macrocode} % 图片:五号字。 \cs_set:Npn \thefigure {\thechapter\g_@@_label_divide_char_tl\arabic{figure}} % 表格:五号字。 \cs_set:Npn \thetable {\thechapter\g_@@_label_divide_char_tl\arabic{table}} % equation \cs_set:Npn \theequation {\thechapter\g_@@_label_divide_char_tl\arabic{equation}} % code snippet \AtBeginDocument{ \cs_gset:Npn \thelstlisting {\thechapter\g_@@_label_divide_char_tl\arabic{lstlisting}} \cs_gset:Npn \lstlistingname {\c_@@_label_code_tl} % 算法变成「章节号-序号」 % 针对 algorithm 宏包 \cs_gset:Npn \thealgorithm {\thechapter\g__bithesis_label_divide_char_tl\arabic{algorithm}} % 针对 algorithm2e 宏包 % 为了减少修改,我们只适配按章编号(algochapter)的情况。 \@ifpackagewith{algorithm2e}{algochapter}{ % 名字中的“cf”是指其作者 Christophe Fiorio。 \cs_gset:Npn \thealgocf {\thechapter\g__bithesis_label_divide_char_tl\arabic{algocf}} }{} % 默认的情况下,保留公式和上下文的一定间距。(会比 Word 稍宽一些) \setlength{\abovedisplayskip}{\l_@@_style_math_above_display_skip_dim} \setlength{\abovedisplayshortskip}{\l_@@_style_math_above_display_skip_dim} \setlength{\belowdisplayskip}{\l_@@_style_math_below_display_skip_dim} \setlength{\belowdisplayshortskip}{\l_@@_style_math_below_display_skip_dim} % 调整浮动体与文字之间的距离 \addtolength{\intextsep}{\l_@@_misc_float_separation_tl\baselineskip} \addtolength{\textfloatsep}{\l_@@_misc_float_separation_tl\baselineskip} } % \end{macrocode} % \end{macro} % % 调整底层 TeX 排版引擎参数以保证所有段落能够很好地以两端对齐的方式呈现。 % 是的,这是祖传代码。 % 在英文模式下禁用,因为这段代码会禁用 hyphenation. % \begin{macrocode} \bool_if:NF \l_@@_style_hyphen_bool { \hbadness=10000 \tolerance=1 \emergencystretch=\maxdimen \hyphenpenalty=10000 } % \end{macrocode} % % 自定义一个默认的 lstlisting 样式。 % \begin{macrocode} \definecolor{codegreen}{rgb}{0,0.6,0} \definecolor{codegray}{rgb}{0.5,0.5,0.5} \definecolor{codepurple}{rgb}{0.58,0,0.82} \definecolor{backcolour}{rgb}{0.95,0.95,0.92} \lstdefinestyle{examplestyle}{ backgroundcolor=\color{backcolour}, commentstyle=\color{codegreen}, keywordstyle=\color{magenta}, numberstyle=\tiny\color{codegray}, stringstyle=\color{codepurple}, basicstyle=\ttfamily\footnotesize, breakatwhitespace=false, breaklines=true, captionpos=b, keepspaces=true, numbers=left, numbersep=5pt, showspaces=false, showstringspaces=false, showtabs=false, tabsize=2 } \lstset{style=examplestyle} % \end{macrocode} % % 调整插图目录与表格目录的标题。 % \begin{macrocode} \cs_set:Npn \listfigurename {\@@_get_const:N {figure}} \cs_set:Npn \listtablename {\@@_get_const:N {table}} % \end{macrocode} % % 预定义用户常用的证明环境。 % \begin{macrocode} \theoremstyle{plain} \newtheorem{algo}{\@@_get_const:N {algo}}[chapter] \newtheorem{them}{\@@_get_const:N {them}}[chapter] \newtheorem{lem}{\@@_get_const:N {lem}}[chapter] \newtheorem{prop}{\@@_get_const:N {prop}}[chapter] \newtheorem{cor}{\@@_get_const:N {cor}}[chapter] \newtheorem{axi}{\@@_get_const:N {axi}}[chapter] \theoremstyle{definition} \newtheorem{defn}{\@@_get_const:N {defn}}[chapter] \newtheorem{conj}{\@@_get_const:N {conj}}[chapter] \newtheorem{exmp}{\@@_get_const:N {exmp}}[chapter] \newtheorem{case}{\@@_get_const:N {case}} \theoremstyle{remark} \newtheorem{rem}{\@@_get_const:N {rem}} \renewcommand{\qedsymbol}{\ensuremath{\blacksquare}} % \end{macrocode} % % \begin{macro}{\@@_dunderline:nnn,\@@_dunderline:nn,\@@_dunderline:n} % 用于渲染下划线。 % % 参数如下: % \begin{itemize} % \item \#1 位置,可选值为 \texttt{c}enter、\texttt{l}eft、\texttt{r}ight。 % \item \#2 |dim| 长度。 % \item \#3 |tl| 文字内容。 % \end{itemize} % \begin{macrocode} \cs_new:Npn \@@_dunderline:nnn #1#2#3 { {\setbox0=\hbox{#3}\ooalign{\copy0\cr\rule[\dimexpr#1-#2\relax]{\wd0}{#2}}} } \cs_new:Npn \@@_dunderline:nn #1#2 { \@@_dunderline:nnn {#1} {1pt} {#2} } \cs_new:Npn \@@_dunderline:n #1 { \@@_dunderline:nnn {-10pt} {1pt} {#1} } % 遗留代码,等待重构。 \newcommand\dunderline[3][-1pt]{{% \setbox0=\hbox{#3} \ooalign{\copy0\cr\rule[\dimexpr#1-#2\relax]{\wd0}{#2}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{|@@_render_cover_entry:nn} % 用于渲染封面的辅助函数。 % % 参数如下: % \begin{itemize} % \item \#1 |{token_list}| 为封面信息条目的名称。 % \item \#2 |{token_list}| 为封面信息条目的内容。 % \end{itemize} % % 需要在 |\l_@@_cover_label_max_width_dim| 和 |\l_@@_cover_value_max_width_dim| % 存储已经计算出来的最大宽度。 % \begin{macrocode} \cs_new:Npn \@@_render_cover_entry:nn #1#2 { \makebox[\l_@@_cover_label_max_width_dim][\l_@@_cover_label_align_tl]{ \tl_if_blank:VTF #1 {} {#1\l_@@_cover_dilimiter_tl} } \hspace{1ex} \@@_dunderline:nnn{\l_@@_cover_underline_offset_dim} {\l_@@_cover_underline_thickness_dim}{ \makebox[\l_@@_cover_value_max_width_dim][\l_@@_cover_value_align_tl]{#2} }\par } % \end{macrocode} % \end{macro} % % \begin{macro}{|@@_get_text_width:Nn,\@@_get_text_width:NV} % 计算 \#2 所占用的宽度,将结果存储在 \#1 中。 % % 参数如下: % \begin{itemize} % \item \#1 |dim| 存储宽度的变量。 % \item \#2 |tl| 要计算宽度的文本。 % \end{itemize} % \begin{macrocode} \cs_new:Npn \@@_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 \@@_get_text_width:Nn { NV } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_get_max_text_width:NN} % 从 \#2 中获取最大的文本宽度,然后设置到 \#1 中。 % % 参数如下: % \begin{itemize} % \item \#1: |dim| 用于存储最大宽度。 % \item \#2: |seq| 用于存储文本。 % \end{itemize} % \begin{macrocode} \cs_new:Npn \@@_get_max_text_width:NN #1#2 { % 这里用 |group| 确保局部变量不会被污染。 \group_begin: \seq_set_eq:NN \l_@@_tmpa_seq #2 \dim_zero_new:N \l_@@_tmpa_dim \bool_until_do:nn { \seq_if_empty_p:N \l_@@_tmpa_seq } { \seq_pop_left:NN \l_@@_tmpa_seq \l_@@_tmpa_tl \@@_get_text_width:NV \l_@@_tmpa_dim \l_@@_tmpa_tl % 在两边加上空白,避免文本太靠边。 \dim_gset:Nn #1 { \dim_max:nn {#1} { \l_@@_tmpa_dim + \l_@@_cover_auto_width_padding_dim * 2} } } \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_parse_entry} % 解析封面信息条目。 % % 参数如下: % \begin{itemize} % \item \#1: |tl| 为封面信息条目的名称。 % \item \#2: |tl| 为封面信息条目的内容。 % \end{itemize} % |\\| 会被视为换行符,从而实现信息条目换行的效果。 % % \begin{macrocode} \cs_new:Npn \@@_parse_entry #1 #2 { \seq_set_split:Nnx \l_@@_tmp_right_seq {\\} {#2} \seq_clear:N \l_@@_tmp_left_seq \seq_map_inline:Nn \l_@@_tmp_right_seq { \seq_put_right:Nn \l_@@_tmp_left_seq {} } \seq_put_left:Nn \l_@@_tmp_left_seq {#1} \seq_pop_right:NN \l_@@_tmp_left_seq \g_@@_trashcan_tl } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_render_cover_entry} % 渲染封面信息项。此函数为主函数。 % \begin{macrocode} \cs_new:Npn \@@_render_cover_entry:n #1 { % 左边是标签,右边是值。 % 形如: % { {label_1} {value_1}, {label_2} {value 2} } % 首先转换成 seq 类型。 \seq_set_from_clist:NN \l_@@_input_seq #1 \seq_map_inline:Nn \l_@@_input_seq { % 然后对于每一对 label 和 value,首先查找 % value 中是否含有 \\ 字符,如果有,则将其分割成多个 % label - value 对。 % 比如 {label_1} {value \\ 1} 会被转换成 % { {label_1} {value}, {} {1} } \@@_parse_entry ##1 % 然后将这些 label - value 对添加到 \l_@@_right_seq % 或者 \l_@@_left_sql 中。 % left 就是 label,right 就是 value。 \seq_concat:NNN \l_@@_right_seq \l_@@_right_seq \l_@@_tmp_right_seq \seq_concat:NNN \l_@@_left_seq \l_@@_left_seq \l_@@_tmp_left_seq } % 如果用户选择自动计算最大宽度,则计算最大宽度。 \bool_if:NT \l_@@_cover_auto_width_bool { \@@_get_max_text_width:NN \l_@@_cover_label_max_width_dim \l_@@_left_seq \@@_get_max_text_width:NN \l_@@_cover_value_max_width_dim \l_@@_right_seq } % 最后,根据宽度渲染 label 和 value 对。 \group_begin: \bool_until_do:nn { \seq_if_empty_p:N \l_@@_left_seq } { \seq_pop_left:NN \l_@@_left_seq \l_@@_tmpa_tl \seq_pop_left:NN \l_@@_right_seq \l_@@_tmpb_tl \tl_if_empty:xTF \l_@@_tmpb_tl {} { \@@_render_cover_entry:nn {\l_@@_tmpa_tl} {\l_@@_tmpb_tl} } } \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\make_graduate_cover:} % 制作研究生论文模板封面。 % \begin{macrocode} \cs_new:Npn \make_graduate_cover: { \cleardoublepage \begin{titlepage} { \heiti\zihao{5} \tl_if_blank:VTF \l_@@_value_classified_level_tl {} { \flushright \c_@@_label_classified_level_tl:~ \l_@@_value_classified_level_tl \par } } \centering \vspace*{65mm} {\heiti\zihao{-2} \l_@@_value_title_tl} \vskip 60mm % 黑体 小三 {\heiti \zihao{-3} \@@_secret_info:nn{\l_@@_value_author_tl}{\g_@@_const_substitute_symbol_tl~\g_@@_const_substitute_symbol_tl~\g_@@_const_substitute_symbol_tl}} \vskip 10mm % 黑体 小三 {\heiti \zihao{-3} \l_@@_cover_date_tl} \end{titlepage} } % \end{macrocode} % \end{macro} % % \begin{macro}{\make_paper_back:} % 制作书脊。 % \begin{macrocode} \cs_new:Npn \make_paper_back: { \cleardoublepage \begin{titlepage} \vskip 5cm \begin{center} \linespread{1.1}\selectfont \begin{minipage}[t][19.7cm]{2em} \begin{center} { \heiti\zihao{3} \tl_if_blank:VTF \l_@@_value_vertical_title_tl {\l_@@_value_title_tl}{\l_@@_value_vertical_title_tl} } \vfill {\heiti\zihao{3}\@@_secret_info:nn{\l_@@_value_author_tl}{\g_@@_const_substitute_symbol_tl\quad\g_@@_const_substitute_symbol_tl\quad\g_@@_const_substitute_symbol_tl}} \vfill {\heiti\zihao{3}\c_@@_label_university_tl} \end{center} \end{minipage} \end{center} % \vskip 5cm \end{titlepage} } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_make_chinese_title_page:} % 制作中文封面页。 % \begin{macrocode} \cs_new:Npn \@@_make_chinese_title_page: { \cleardoublepage \begin{titlepage} \begin{minipage}[t]{0.48\textwidth} % 密级、分类号 {\heiti \zihao{5} \noindent \c_@@_label_classification_tl} \l_@@_value_classification_tl\\ {\heiti \zihao{5} \c_@@_label_udc_tl} \l_@@_value_udc_tl \end{minipage} \hfill % 以下内容是「特别类型」的内容, % 在没有勾选的时候隐藏。 \bool_if:nT {\l_@@_cover_show_special_type_box_bool || \l_@@_value_international_student_ugp_bool || \l_@@_value_cross_research_bool} { \begin{minipage}[t]{0.48\textwidth} \vspace{-12pt} \begin{flushright} \setlength\fboxrule{1pt}\setlength\fboxsep{3mm} \fbox{ \noindent\begin{minipage}{0.48\linewidth} \heiti \zihao{-4} \scalebox{1.1}\BigStar{}\hspace{4pt} \c_@@_label_special_type_tl\\ { \zihao{4} \bool_if:NTF \l_@@_value_cross_research_bool {\boxcheck:} {\boxempty:} } \hspace{1pt}\c_@@_label_cross_research_tl\\ { \zihao{4} \bool_if:NTF \l_@@_value_international_student_ugp_bool {\boxcheck:} {\boxempty:} } \hspace{1pt}\c_@@_label_international_student_ugp_tl \end{minipage} } \end{flushright} \end{minipage} % 保证下面的内容空间不会受到挤占。 \vspace{-35pt} } \begin{center} \vskip \stretch{1} {\heiti\zihao{-2} \l_@@_value_title_tl} \vskip \stretch{1} \def\tabcolsep{1pt} \def\arraystretch{1.5} { \renewcommand{\baselinestretch}{2} \tl_if_empty:NT \l_@@_cover_dilimiter_tl { \tl_set:Nn \l_@@_cover_dilimiter_tl {\qquad} } \tl_set:Nn \l_@@_cover_underline_offset_dim {-5pt} % 如果不是自动计算宽度,且用户没有自定义宽度, % 则尝试提供一个默认宽度。 \bool_if:NF \l_@@_cover_auto_width_bool { \dim_compare:nNnT {\l_@@_cover_label_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_label_max_width_dim {45mm} } \dim_compare:nNnT {\l_@@_cover_value_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_value_max_width_dim {60mm} } } % 渲染信息。 \clist_set:Nn \l_@@_input_clist { {\c_@@_graduate_label_author_tl} {\@@_secret_info:nn{\l_@@_value_author_tl}{\g_@@_const_substitute_symbol_tl\g_@@_const_substitute_symbol_tl\g_@@_const_substitute_symbol_tl}}, {\c_@@_graduate_label_school_tl} {\l_@@_value_school_tl}, {\c_@@_graduate_label_supervisor_tl} {\@@_secret_info:N{\l_@@_value_supervisor_tl}}, {\c_@@_graduate_label_chairman_tl} {\@@_secret_info:N{\l_@@_value_chairman_tl}}, {\g_@@_const_info_degree_tl} {\l_@@_value_degree_tl}, {\g_@@_const_info_major_tl} {\l_@@_value_major_tl}, {\c_@@_graduate_label_institute_tl} {\l_@@_value_institute_tl}, {\c_@@_graduate_label_defense_date_tl} {\l_@@_value_defense_date_tl}, } \heiti\zihao{-3} \@@_render_cover_entry:n \l_@@_input_clist } \end{center} \vskip \stretch{0.5} \end{titlepage} } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_make_english_title_page:} % 制作英文封面页。 % \begin{macrocode} \cs_new:Npn \@@_make_english_title_page: { \begin{titlepage} \begin{center} \vspace*{10em} { \zihao{-2} \textbf{\l_@@_value_title_en_tl} } \vskip \stretch{1} { \tl_if_empty:NT \l_@@_cover_dilimiter_tl { \tl_set:Nn \l_@@_cover_dilimiter_tl {:~} } \tl_set:Nn \l_@@_cover_label_align_tl {l} \tl_set:Nn \l_@@_cover_underline_offset_dim {-5pt} % 如果不是自动计算宽度,且用户没有自定义宽度, % 则尝试提供一个默认宽度。 \bool_if:NF \l_@@_cover_auto_width_bool { \dim_compare:nNnT {\l_@@_cover_label_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_label_max_width_dim {55mm} } \dim_compare:nNnT {\l_@@_cover_value_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_value_max_width_dim {85mm} } } % 渲染信息。 \clist_set:Nn \l_@@_input_clist { {\c_@@_graduate_label_author_en_tl} {\@@_secret_info:N{\l_@@_value_author_en_tl}}, {\c_@@_graduate_label_school_en_tl} {\l_@@_value_school_en_tl}, {\c_@@_graduate_label_supervisor_en_tl} {\@@_secret_info:N{\l_@@_value_supervisor_en_tl}}, {\c_@@_graduate_label_chairman_en_tl} {\@@_secret_info:N{\l_@@_value_chairman_en_tl}}, {\c_@@_graduate_label_degree_en_tl} {\l_@@_value_degree_en_tl}, {\c_@@_graduate_label_major_en_tl} {\l_@@_value_major_en_tl}, {\c_@@_graduate_label_institute_en_tl} {\l_@@_value_institute_en_tl}, {\c_@@_graduate_label_defense_date_en_tl} {\l_@@_value_defense_date_en_tl}, } \zihao{-3} \@@_render_cover_entry:n \l_@@_input_clist } \end{center} \vskip \stretch{0.5} \end{titlepage} } % \end{macrocode} % \end{macro} % % \begin{macro}{\circled} % 圆形数字编号定义。 % \begin{macrocode} \newcommand{\circled}[2][]{\tikz[baseline=(char.base)] {\node[shape = circle, draw, inner~sep = 1pt] (char) {\phantom{\ifblank{#1}{#2}{#1}}}; \node at (char.center) {\makebox[0pt][c]{#2}};}} \robustify{\circled} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_graduate_originality:} % 研究生原创性声明。 % \begin{macrocode} \cs_new:Npn \@@_graduate_originality: { % 取消页眉页脚。 \ctexset { chapter / pagestyle = plain, } \begin{titlepage} % 不计算页码。 \pagenumbering{gobble} % 原创性声明部分 \begin{center} \@@_same_page: \chapter*{ \heiti\zihao{-2} \c_@@_graduate_label_originality_tl } \end{center} % 本部分字号为三号。 \zihao{3} \qquad\c_@@_graduate_label_originality_clause_tl \vspace{3\baselineskip} \begin{flushright} \c_@@_graduate_label_originality_author_signature_tl\par \end{flushright} \vspace{3\baselineskip} % 使用授权声明部分。 \begin{center} \@@_same_page: \chapter*{ \heiti\zihao{-2} \c_@@_graduate_label_authorization_tl } \end{center} \qquad\c_@@_graduate_label_authorization_clause_tl \vspace*{15mm} \begin{flushright} \begin{spacing}{1.65} \zihao{3} % \hspace{5mm}\raisebox{-2ex}{\includegraphics[width=30mm]{example-image}}\hspace{5mm} \c_@@_graduate_label_originality_author_signature_tl\par \vspace{1\baselineskip} \c_@@_graduate_label_originality_supervisor_signature_tl\par \end{spacing} \end{flushright} \end{titlepage} \cleardoublepage } % \end{macrocode} % \end{macro} % % \subsubsection{定义用户接口} % % \begin{macro}{\BITSetup} % 提供用户配置的接口。 % \begin{macrocode} \DeclareDocumentCommand \BITSetup { m } { \keys_set:nn { bithesis } { #1 }} % \end{macrocode} % \end{macro} % % \begin{macro}{\BigStar} % 提供密级选项中需要的五角星,在普通环境中使用。 % \begin{macrocode} \DeclareDocumentCommand \BigStar { } { \ding{72} } % \end{macrocode} % \end{macro} % % \begin{environment}{blindPeerReview} % 用于包裹涉及个人信息的内容。 % % 在启用盲审模式时,其中的内容会被隐藏。 % % 本环境提供了一个可选参数,可以传入一个 bool 值,用于在盲审模式下关闭 % 隐藏行为。 % \begin{macrocode} \NewDocumentEnvironment {blindPeerReview} {O{\c_true_bool} +b} { \bool_if:nTF {\g_@@_blind_mode_bool && #1} {} { #2 } } {} % \end{macrocode} % \end{environment} % % \begin{macro}{\cleardoublepage} % 重定义 \tn{cleardoublepage}, % 使得偶数页面在没有内容时也不显示页眉页脚。见: % \url{https://tex.stackexchange.com/a/1683}。 % \begin{macrocode} \RenewDocumentCommand \cleardoublepage { } { \clearpage \bool_if:NT \g_@@_twoside_bool { \int_if_odd:nF \c@page { \hbox:n { } \thispagestyle { empty } \newpage } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\SecretInfo} % 用于包裹涉及个人信息的内容。 % \begin{macrocode} \DeclareDocumentCommand \SecretInfo { m o } { \IfValueTF {#2} { \@@_secret_info:nn {#1} {#2} } { \@@_secret_info:n {#1} } } % \end{macrocode} % \end{macro} % % \begin{macro}{\MakeCover} % 制作封面。 % \begin{macrocode} \DeclareDocumentCommand \MakeCover {} { \begin{blindPeerReview}[\l_@@_cover_hide_cover_in_peer_review_bool] \group_begin: \int_case:nn {\g_@@_thesis_type_int} { {1} { \begin{titlepage} \vspace*{16mm} \centering \tl_if_blank:VTF \l_bit_coverheaderimage_tl {} { \includegraphics[width=9.87cm]{\l_bit_coverheaderimage_tl}\\ } \vspace*{-3mm} \zihao{-0}\textbf{\ziju{0.12}\songti{\l_@@_style_headline_tl}}\par \vspace{16mm} \zihao{2}\textbf{\xihei:n \l_@@_value_title_tl}\par \vspace{3mm} \begin{spacing}{1.2} \zihao{3}\selectfont{\textbf{\l_@@_value_title_en_tl}}\par \end{spacing} \vspace{15mm} \begin{spacing}{1.8} \begin{center} \tl_if_empty:NT \l_@@_cover_dilimiter_tl { \tl_set:Nn \l_@@_cover_dilimiter_tl {:} } % if not auto width, try override width \bool_if:NF \l_@@_cover_auto_width_bool { \dim_compare:nNnT {\l_@@_cover_label_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_label_max_width_dim {35mm} } \dim_compare:nNnT {\l_@@_cover_value_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_value_max_width_dim {78mm} } } \clist_set:Nn \l_@@_input_clist { {\c_@@_label_semester_tl} {\l_@@_value_semester_tl}, {\c_@@_label_school_tl} {\l_@@_value_school_tl}, {\g_@@_const_info_major_tl} {\l_@@_value_major_tl}, {\c_@@_label_class_tl} {\@@_secret_info:N \l_@@_value_class_tl}, {\c_@@_label_author_tl} {\@@_secret_info:N \l_@@_value_author_tl}, {\c_@@_label_student_id_tl} {\@@_secret_info:N \l_@@_value_student_id_tl}, {\c_@@_label_course_tl} {\l_@@_value_course_tl}, {\c_@@_label_supervisor_tl} {\@@_secret_info:N \l_@@_value_supervisor_tl}, {\c_@@_label_co_supervisor_tl} {\@@_secret_info:N \l_@@_value_external_supervisor_tl}, {\c_@@_label_teacher_tl} {\l_@@_value_teacher_tl}, } \zihao{3} \@@_render_cover_entry:n \l_@@_input_clist \end{center} \end{spacing} \vspace*{\fill} \centering \zihao{3}\ziju{0.5}\songti{ \tl_if_empty:NTF \l_@@_cover_date_tl { \today } { \l_@@_cover_date_tl } } \end{titlepage} } {2} { \begin{titlepage} \centering \tl_if_blank:VTF \l_bit_coverheaderimage_tl {} { \includegraphics[width=6.87cm]{\l_bit_coverheaderimage_tl}\\ } \vspace{1.2mm} \zihao{2}\textbf{\songti{\l_@@_style_headline_tl}} % 外文翻译封面有两组中英文标题,行数变化范围大,因此采用 fill 比例布局 \vspace{\stretch{1}} { \begin{spacing}{1.8} \tl_set:Nn \l_@@_cover_dilimiter_tl {\textbf{:}} \bool_set_false:N \l_@@_cover_auto_width_bool \dim_set:Nn \l_@@_cover_label_max_width_dim {35mm} \dim_set:Nn \l_@@_cover_value_max_width_dim {115mm} \clist_set:Nn \l_@@_input_clist { {\songti\zihao{4}\textbf{外文原文题目}} {\l_@@_value_trans_origin_title_tl}, {\songti\zihao{4}\textbf{中文翻译题目}} {\l_@@_value_trans_title_tl}, } \zihao{-3} \centering \@@_render_cover_entry:n \l_@@_input_clist \end{spacing} } \vspace{\stretch{1}} \zihao{2}\textbf{\xihei:n \l_@@_value_title_tl}\par \vspace{3mm} \begin{spacing}{1.2} \zihao{3}\selectfont{\textbf{\l_@@_value_title_en_tl}}\par \end{spacing} \vspace{\stretch{0.67}} \begin{spacing}{1.8} \tl_if_empty:NT \l_@@_cover_dilimiter_tl { \tl_set:Nn \l_@@_cover_dilimiter_tl {:} } % 如果不是自动计算宽度,且用户没有自定义宽度, % 则尝试提供一个默认宽度。 \bool_if:NF \l_@@_cover_auto_width_bool { \dim_compare:nNnT {\l_@@_cover_label_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_label_max_width_dim {35mm} } \dim_compare:nNnT {\l_@@_cover_value_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_value_max_width_dim {78mm} } } \zihao{3} % 渲染信息。 \clist_set:Nn \l_@@_input_clist { {\c_@@_label_school_tl} {\l_@@_value_school_tl}, {\c_@@_label_major_tl} {\l_@@_value_major_tl}, {\c_@@_label_class_tl} {\@@_secret_info:N \l_@@_value_class_tl}, {\c_@@_label_author_tl} {\@@_secret_info:N \l_@@_value_author_tl}, {\c_@@_label_student_id_tl} {\@@_secret_info:N \l_@@_value_student_id_tl}, {\c_@@_label_supervisor_tl} {\@@_secret_info:N \l_@@_value_supervisor_tl}, {\c_@@_label_co_supervisor_tl} {\@@_secret_info:N \l_@@_value_external_supervisor_tl}, } \@@_render_cover_entry:n \l_@@_input_clist \end{spacing} \vspace{\stretch{0.67}} \end{titlepage} } {3} { \begin{titlepage} \vspace*{16mm} \centering \tl_if_blank:VTF \l_bit_coverheaderimage_tl {} { \includegraphics[width=9.87cm]{\l_bit_coverheaderimage_tl}\\ } \vspace*{-3mm} \zihao{1}\textbf{\ziju{0.12}\l_@@_style_headline_tl}\par \vspace{18mm} \zihao{2}\textbf{\xihei:n \l_@@_value_title_en_tl}\par \vspace{10mm} \begin{spacing}{1.8} \begin{center} \tl_if_empty:NT \l_@@_cover_dilimiter_tl { \tl_set:Nn \l_@@_cover_dilimiter_tl {:} } % if not auto width, try override width \bool_if:NF \l_@@_cover_auto_width_bool { \dim_compare:nNnT {\l_@@_cover_label_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_label_max_width_dim {20mm} } \dim_compare:nNnT {\l_@@_cover_value_max_width_dim} = {0pt} { \dim_set:Nn \l_@@_cover_value_max_width_dim {105mm} } } \zihao{4} \clist_set:Nn \l_@@_input_clist { {\c_@@_label_school_en_tl} {\l_@@_value_school_tl}, {\c_@@_label_major_en_tl} {\l_@@_value_major_tl}, {\c_@@_label_author_en_tl} {\l_@@_value_author_tl}, {\c_@@_label_student_id_en_tl} {\l_@@_value_student_id_tl}, {\c_@@_label_supervisor_en_tl} {\l_@@_value_supervisor_tl}, {\c_@@_label_co_supervisor_en_tl} {\l_@@_value_external_supervisor_tl}, } \@@_render_cover_entry:n \l_@@_input_clist \end{center} \end{spacing} \vspace*{\fill} \centering \zihao{3}\ziju{0.5}\songti{ \tl_if_empty:NTF \l_@@_cover_date_tl { \today } { \l_@@_cover_date_tl } } \end{titlepage} } {4} { \make_graduate_cover: } {5} { \make_graduate_cover: } } \group_end: \end{blindPeerReview} } % \end{macrocode} % \end{macro} % % % \begin{macro}{\MakeOriginality} % 原创性声明。 % \begin{macrocode} \NewDocumentCommand \MakeOriginality {} { \group_begin: \begin{blindPeerReview}[\l_@@_cover_hide_cover_in_peer_review_bool] \int_case:nn {\g_@@_thesis_type_int} { {1} { \pagestyle{BIThesis} \pagenumbering{gobble} % 原创性声明部分 \begin{center} \vspace*{-2bp} \@@_same_page: \chapter*{\heiti\zihao{2}\c_@@_bachelor_label_originality_tl} \end{center}~\par % 本部分字号为小三。 \zihao{-3} \c_@@_bachelor_label_originality_clause_tl \vspace{17mm} \begin{flushright} \c_@@_bachelor_label_originality_author_signature_tl\par \end{flushright} \vspace{16mm} % 使用授权声明部分 \begin{center} \@@_same_page: \chapter*{ \heiti\zihao{2} \c_@@_bachelor_label_authorization_tl } \end{center}~\par \c_@@_bachelor_label_authorization_clause_tl \vspace*{3mm} \begin{flushright} \begin{spacing}{1.65} \zihao{-3} % \hspace{5mm}\raisebox{-2ex}{\includegraphics[width=30mm]{example-image}}\hspace{5mm} \c_@@_bachelor_label_originality_author_signature_tl\par \c_@@_bachelor_label_originality_supervisor_signature_tl\par \end{spacing} \end{flushright} \newpage } {3} { \linespread{1.26}\selectfont % 原创性声明部分 \begin{center} \vspace*{-2bp} \@@_same_page: \chapter*{ \heiti\zihao{-2} \c_@@_bachelor_english_label_originality_tl } \end{center}~\par % 本部分字号为小三 \zihao{-4} \c_@@_bachelor_english_label_originality_clause_tl \bigbreak Student~(Signature):~\dunderline[-1pt]{1pt}{\makebox[18mm]{}}~Date:\par \vspace{6mm} % 使用授权声明部分 \begin{center} \@@_same_page: \chapter*{ \heiti\zihao{-2} \c_@@_bachelor_english_label_authorization_tl } \end{center}~\par \c_@@_bachelor_english_label_authorization_clause_tl \bigbreak Student~(Signature):~ \dunderline[-1pt]{1pt}{\makebox[18mm + 16bp]{}}~ \hspace{2mm}Date:\par Supervisor~(Signature):~ \dunderline[-1pt]{1pt}{\makebox[18mm]{}}~ \hspace{2mm}Date:\par } {4} {\@@_graduate_originality:} {5} {\@@_graduate_originality:} } % 单独成页 \clearpage \end{blindPeerReview} \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\MakePaperBack} % 生成书脊。 % \begin{macrocode} \NewDocumentCommand \MakePaperBack {} { \begin{blindPeerReview}[\l_@@_cover_hide_cover_in_peer_review_bool] \make_paper_back: \end{blindPeerReview} } % \end{macrocode} % \end{macro} % % \begin{macro}{\MakeTitle} % 生成标题页。(研究生) % \begin{macrocode} \NewDocumentCommand \MakeTitle {} { \begin{blindPeerReview}[\l_@@_cover_hide_cover_in_peer_review_bool] \@@_make_chinese_title_page: \@@_make_english_title_page: \end{blindPeerReview} } % \end{macrocode} % \end{macro} % % \begin{macro}{\MakeTOC} % 生成目录。 % \begin{macrocode} \DeclareDocumentCommand \MakeTOC {} { { \@@_if_bachelor_thesis:TF { \renewcommand{\baselinestretch}{1.35} } { \renewcommand{\baselinestretch}{1.56} } \@@_if_thesis_english:TF { \tl_set:Nn \l_@@_toc_title_tl {\c_@@_label_toc_en_tl} } { \tl_set:Nn \l_@@_toc_title_tl {\c_@@_label_toc_tl} } % 自定义目录样式 \cs_set:Npn \contentsname { \fontsize{16pt}{\baselineskip} \l_@@_unnumchapter_style_cs:n \l_@@_title_font_cs:n {\l_@@_toc_title_tl} \vspace{-8pt} } % 制作目录 \tableofcontents % 在本科生全英文模板中,添加「目录」本身到目录中。 \@@_if_thesis_int_type:nT {3} { \addcontentsline{toc}{chapter}{\c_@@_label_toc_en_tl} } % 单独成页 \clearpage } } % \end{macrocode} % \end{macro} % % \begin{environment}{abstract} % 生成摘要。 % \begin{macrocode} \NewDocumentEnvironment {abstract} {} { \cleardoublepage \linespread{1.53}\selectfont \@@_if_bachelor_thesis:T { \begin{center} \vspace*{-17bp} \heiti\zihao{-2}\textbf{ \int_case:nn {\g_@@_thesis_type_int} { {1} {\l_@@_value_title_tl} {2} {\l_@@_value_trans_title_tl} {3} {\l_@@_value_title_tl} } } \end{center} \vspace*{2mm} } \ctexset{ chapter/numbering = false, } \@@_if_bachelor_thesis:T { \int_compare:nNnTF {\g_@@_thesis_type_int} = {3} { \ctexset{ chapter/titleformat = {\heiti} } } { \ctexset{ chapter/titleformat = {\textmd} } } } { \@@_same_page: \bool_if:NTF \l_@@_add_abstract_to_toc_bool { \chapter{\c_@@_label_abstract_tl} } { \chapter*{\c_@@_label_abstract_tl} \currentpdfbookmark{\c_@@_label_abstract_tl}{ch:abstract} } } \vspace*{1mm} \par } { \par \vspace{4ex} \noindent \@@_if_graduate:TF { % 研究生模板中,“关键词”宋体小四加粗 % 关键词为宋体小四号字。 \textbf{\c_@@_label_keywords_tl}\l_@@_value_keywords_tl\par } { % 本科生模板中,关键词为黑体加粗 \textbf{\heiti \c_@@_label_keywords_tl \l_@@_value_keywords_tl}\par } \newpage } % \end{macrocode} % \end{environment} % % \begin{environment}{abstractEn} % 生成英文摘要。 % \begin{macrocode} \NewDocumentEnvironment {abstractEn} {} { \linespread{1.53}\selectfont \@@_if_bachelor_thesis:T { \begin{spacing}{0.95} \centering \vspace*{-2bp} \@@_if_thesis_int_type:nTF {3} { \arialfamily\zihao{-2}\textbf \l_@@_value_title_en_tl\\ } { \heiti\zihao{3}\textbf \l_@@_value_title_en_tl\\ } \end{spacing} \vspace*{10mm} } \ctexset{ chapter/numbering = false, } \@@_if_bachelor_thesis:TF { \int_compare:nNnTF {\g_@@_thesis_type_int} = {3} { \ctexset{ chapter = { titleformat = {\heiti\zihao{3}\centering\textbf}, } } } { \ctexset{ chapter = { titleformat = {\heiti\zihao{-3}\centering\textmd}, } } } } { \ctexset { chapter/titleformat = {\heiti\zihao{3}\centering\textbf} } } { \@@_same_page: \bool_if:nTF {\l_@@_add_abstract_en_to_toc_bool} { \chapter{\c_@@_label_abstract_en_tl} } { \chapter*{\c_@@_label_abstract_en_tl} \currentpdfbookmark{\c_@@_label_abstract_en_tl}{ch:abstract:en} } } } { \par\vspace{3ex}\noindent \@@_if_graduate:TF { % Times New Roman小四号字,行距22磅 % “Key Words” % Times New Roman小四号字加粗 \textbf{\c_@@_label_keywords_en_tl} \l_@@_value_keywords_en_tl } { \textbf{\c_@@_label_keywords_en_tl \l_@@_value_keywords_en_tl} } \newpage } % \end{macrocode} % \end{environment} % % \begin{environment}{conclusion} % 生成结论。需要放在 \cs{macrocode} 之后。 % \begin{macrocode} \NewDocumentEnvironment {conclusion} {} { \ctexset{ section/number = \arabic{section} } \@@_if_thesis_english:TF { \chapter{\c_@@_label_conclusion_en_tl} } { \chapter{\c_@@_label_conclusion_tl} } } {} % \end{macrocode} % \end{environment} % % \begin{environment}{bibprint} % 生成参考文献。需要放在 \cs{backmatter} 之后。 % \begin{macrocode} \NewDocumentEnvironment {bibprint} {} { % 设置参考文献字号为 5 号 \renewcommand*{\bibfont}{\zihao{5}} % 设置参考文献各个项目之间的垂直距离为 0 \setlength{\bibitemsep}{0ex} \setlength{\bibnamesep}{0ex} \setlength{\bibinitsep}{0ex} \@@_if_graduate:TF { } { % 「本科生」设置单倍行距 \renewcommand{\baselinestretch}{1.2} } % 设置参考文献顺序标签 `[1]` 与文献内容 `作者. 文献标题...` 的间距 \setlength{\biblabelsep}{1.7mm} \bool_if:NF \l_@@_style_bibliography_indent_bool { % 设置参考文献后文缩进为 0(与 Word 模板保持一致) % See: https://github.com/hushidong/biblatex-gb7714-2015 % 如何修参考文献表的缩进? \cs_set:Npn \itemcmd { \settowidth{\lengthid}{\mkgbnumlabel{\printfield{labelnumber}}} %%这里是所做的调整,以下两句通过调整\lengthid来调整缩进 \setlength{\lengthid}{0pt} \addtolength{\lengthid}{-\biblabelsep} \setlength{\lengthlw}{\textwidth} \addtolength{\lengthlw}{-\lengthid} \addvspace{\bibitemsep}%恢复\bibitemsep的作用 \hangindent\lengthid \leavevmode\mkgbnumlabel{\printfield{labelnumber}}% \hspace{\biblabelsep} } } \@@_if_thesis_english:TF { \chapter{\c_@@_label_reference_en_tl} } { \chapter{\c_@@_label_reference_tl} } } {} % \end{macrocode} % \end{environment} % % \begin{environment}{appendices} % 生成附录。 % \begin{macrocode} \NewDocumentEnvironment {appendices} {} { % Used in chapter, ToC. \tl_new:N \l_@@_appendix_plain_label_tl % Used before reference label. \tl_new:N \l_@@_appendix_default_title_tl \@@_if_thesis_english:TF { \tl_set:Nn \l_@@_appendix_plain_label_tl {\c_@@_label_appendix_prefix_en_tl} \tl_set:Nn \l_@@_appendix_default_title_tl {\c_@@_label_appendix_en_tl} } { \tl_set:Nn \l_@@_appendix_plain_label_tl {\c_@@_label_appendix_prefix_tl} \tl_set:Nn \l_@@_appendix_default_title_tl {\c_@@_label_appendix_tl} } \bool_if:NTF \l_@@_appendices_chapter_level_bool { % 附录章节级别 % 仅设置 \setcounter{chapter}{0} 时,pdf 目录会索引到正文章节。 % 因此,需要使用 \appendix 重置计数器,并将附录后面的 % 几个章节视为特殊的附录页。 \appendix \ctexset{ chapter/numbering = true, chapter/name = {}, chapter/number = \l_@@_appendix_plain_label_tl\hspace{1ex}\Alph{chapter}, section/number = \Alph{chapter}. \arabic{section}, subsection/number = \Alph{chapter}. \arabic{section}. \arabic{subsection}, } \cs_set:Npn \thechapter { \Alph{chapter} } } { % 附录节(section)级别 % 因为不需要用到 chapter counter, 所以直接加一即可。 \stepcounter{chapter} \setcounter{section}{0} % (与上面方法至少用一个) % 需要让 section 在 pdf bookmark 中输出字母而不是数字。 % 详见 hyperref 代码。 \gdef\theHsection{\Alph{section}} % 定义 \thefigure 采用节而不是章 \cs_set:Npn \thefigure {\theHsection \g_@@_label_divide_char_tl\arabic{figure}} \ctexset{ section/number = \l_@@_appendix_plain_label_tl\hspace{1ex}\Alph{section}, subsection/number = \Alph{section}. \arabic{subsection}, } \cs_gset:Npn \thechapter { \Alph{section} } % \gdef \thechapter{\Alph{section}} \tl_if_blank:VTF \l_@@_appendices_title_tl { \chapter{\l_@@_appendix_default_title_tl} } { \chapter*{\l_@@_appendices_title_tl} \stepcounter{chapter} \tl_if_blank:VTF \l_@@_appendix_toc_title_tl { \addcontentsline{toc}{chapter}{\l_@@_appendix_default_title_tl} } { \addcontentsline{toc}{chapter}{\l_@@_appendix_toc_title_tl} } } } } { } % \end{macrocode} % \end{environment} % % \begin{environment}{acknowledgements} % 生成致谢。 % \begin{macrocode} \NewDocumentEnvironment {acknowledgements} {+b} { \begin{blindPeerReview} % 将此章节视为特殊的附录页,关闭附录编号,重定义 section 编号。 % 不知为何,需要手动重置 section 计数器。 \setcounter{section}{0} \ctexset{ appendix/numbering = false, section/number = \arabic{section}, subsection/number = \arabic{section}. \arabic{subsection}, subsubsection/number = \arabic{section}. \arabic{subsection}. \arabic{subsubsection}, } \@@_if_thesis_english:TF { \chapter{\c_@@_label_ack_en_tl} } { \chapter{\c_@@_label_ack_tl} } \@@_if_graduate:TF {\fangsong}{} #1 \end{blindPeerReview} } {} % \end{macrocode} % \end{environment} % % \begin{macro}{\Author,\AuthorEn} % 在普通模式下,输出作者姓名。 % 在盲审模式下,输出「第 n 作者」。 % \begin{macrocode} \NewDocumentCommand \Author {O{1} o o} { \bool_if:NTF \g_@@_blind_mode_bool { % 盲审模式 \IfValueTF {#3} { #3 } { 第\zhnumber{#1}作者 } } { % 普通模式 \IfValueTF {#2} { % 覆盖默认的 \author 命令 #2 } { % 默认采用作者姓名 \l_@@_value_author_tl } } } % 英文姓名 \NewDocumentCommand \AuthorEn {O{1} o o} { \bool_if:NTF \g_@@_blind_mode_bool { % 盲审模式 \IfValueTF {#3} { #3 } { \Ordinalstringnum{#1}~Author } } { % 普通模式 \IfValueTF {#2} { % 覆盖默认的 \author 命令 #2 } { % 默认采用作者姓名 \l_@@_value_author_en_tl } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\addpub,\addpubs} % 添加一个或多个参考文献。 % \begin{macrocode} \NewDocumentCommand \addpub {m} { \nocite{#1} \addtocategory{mypub}{#1} } \NewDocumentCommand \addpubs {m} { % apply a clist \clist_map_function:nN {#1} \addpub } % \end{macrocode} % \end{macro} % % \begin{macro}{\pubsection} % 设置小标题。 % \begin{macrocode} \NewDocumentCommand \pubsection {m} { { % 自增计数器 \par\stepcounter{pub} % 设置小标题,暂时没有考虑英文模式 \noindent \textbf{ \heiti{ \zhnumber{\thepub}、#1 } }\par } } % \end{macrocode} % \end{macro} % % \begin{environment}{publications} % 生成攻读学位期间发表论文与研究成果清单。 % \begin{macrocode} \NewDocumentEnvironment {publications} {+b} { % 同时设置 omit 以及 blindPeerReview 才能跳过此章节生成。 \begin{blindPeerReview}[\l_@@_publications_omit_bool] % 将此章节视为特殊的附录页,关闭附录编号,重定义 section 编号。 % 不知为何,需要手动重置 section 计数器。 \setcounter{section}{0} \ctexset{ appendix/numbering = false, section/number = \arabic{section}, subsection/number = \arabic{section}. \arabic{subsection}, subsubsection/number = \arabic{section}. \arabic{subsection}. \arabic{subsubsection}, } % 设置参考文献字号为 5 号 \renewcommand*{\bibfont}{\zihao{5}} % 设置参考文献各个项目之间的垂直距离为 0 \setlength{\bibitemsep}{0ex} \setlength{\bibnamesep}{0ex} \setlength{\bibinitsep}{0ex} % 设置参考文献顺序标签 `[1]` 与文献内容 `作者. 文献标题...` 的间距 \setlength{\biblabelsep}{1.7mm} \bool_if:NF \l_@@_style_bibliography_indent_bool { % 设置参考文献后文缩进为 0(与 Word 模板保持一致) % See: https://github.com/hushidong/biblatex-gb7714-2015 % 如何修参考文献表的缩进? \cs_set:Npn \itemcmd { \settowidth{\lengthid}{\mkgbnumlabel{\printfield{labelnumber}}} %%这里是所做的调整,以下两句通过调整\lengthid来调整缩进 \setlength{\lengthid}{0pt} \addtolength{\lengthid}{-\biblabelsep} \setlength{\lengthlw}{\textwidth} \addtolength{\lengthlw}{-\lengthid} \addvspace{\bibitemsep}%恢复\bibitemsep的作用 \hangindent\lengthid \leavevmode\mkgbnumlabel{\printfield{labelnumber}}% \hspace{\biblabelsep} } } % If in blindPeerReview mode, omit delimiters in author field. \bool_if:NT \g_@@_blind_mode_bool { % 如果有多个作者,不修改此项的话,作者与标题之间会有逗号。 \DeclareDelimFormat[bib,biblist]{finalnamedelim}{} % 如果自己不是第一个作者,不修改此项的话,会在最开始有逗号。 \DeclareDelimFormat{multinamedelim}{} % 如果覆盖的是英文作者,不修改此项的话,会在最开始有空格。 \DeclareDelimFormat{bibnamedelimd}{} % 如果作者太多而被截断,不修改的话,会多余逗号、“等”云云。 % 被截断的充要条件:作者数量大于通过`\BITSetup`设置的`publications/maxbibnames`。 % 故设置标点来去掉逗号, \DeclareDelimFormat[bib,biblist]{andothersdelim}{} % 并设置本地化字符串来去掉“等”。 \setlocalbibstring{andothers}{} \setlocalbibstring{andotherscn}{} % 另外注意,我们仍尊重`maxbibnames`和`minbibnames`,保证若开盲审时显示作者,则关盲审时也正常。 } % ===== 上方定义与「参考文献」部分相同 % 中文姓名下,此部分不参与输出。 \cs_set:Npn \mkbibnamegiven ##1 { \haspartannotation{myself}{ \bool_if:NTF \g_@@_blind_mode_bool { % 盲审模式,不输出内容 } { % 普通模式 \textbf{##1} } }{ \bool_if:NTF \g_@@_blind_mode_bool { % 盲审模式,不输出内容 } { % 普通模式 ##1 } } } \cs_set:Npn \mkbibnamefamily ##1 { \haspartannotation{myself}{ % 作者为自己 \bool_if:NTF \g_@@_blind_mode_bool { % 盲审模式 \getpartannotation{myself} } { % 普通模式 \textbf{##1} } }{ % 作者不是自己 \bool_if:NTF \g_@@_blind_mode_bool { % 盲审模式,不输出 } { % 普通模式 ##1 } } } \if_cs_exist:N \c@pub { % 重置计数器 \setcounter{pub}{0} } \else: { % 设置计数器 \newcounter{pub} } \fi: % 设置参考文献的排序 \bool_if:NTF \l_@@_publications_sorting_bool { % Sorting by year, name, type. \newrefcontext[sorting=ynt] } { % Do not sort. \newrefcontext } % 根据 maxbibnames 的设置,覆盖 \blx@maxbibnames 选项,保证所有作者都能显示。 \cs_set:Npn \blx@maxbibnames { \l_@@_publications_maxbibnames_int } % 根据 minbibnames 的设置,覆盖 \blx@minbibnames 选项,保证所有作者都能显示。 \cs_set:Npn \blx@minbibnames { \l_@@_publications_minbibnames_int } \chapter{\@@_get_const:N {publications}} #1 \end{blindPeerReview} } {} % \end{macrocode} % \end{environment} % % \begin{environment}{resume} % 生成个人简历。 % \begin{macrocode} \NewDocumentEnvironment {resume} {+b} { \begin{blindPeerReview} % 将此章节视为特殊的附录页,关闭附录编号,重定义 section 编号。 % 不知为何,需要手动重置 section 计数器。 \setcounter{section}{0} \ctexset{ appendix/numbering = false, section/number = \arabic{section}, subsection/number = \arabic{section}. \arabic{subsection}, subsubsection/number = \arabic{section}. \arabic{subsection}. \arabic{subsubsection}, } \chapter{\@@_get_const:N{resume}} #1 \end{blindPeerReview} } { } % \end{macrocode} % \end{environment} % \begin{environment}{symbols} % 生成主要术语对照表。 % \begin{macrocode} \NewDocumentEnvironment {symbols} {} { \bool_if:NTF \l_@@_add_symbols_to_toc_bool { \chapter{\@@_get_const:N {symbols}} } { \chapter*{\@@_get_const:N {symbols}} \currentpdfbookmark{\c_@@_label_symbols_tl}{ch:symbols} } \zihao{-4} \begin{itemize}[ labelwidth=2.5cm, labelsep=0.5cm, leftmargin=3cm, itemindent=0cm, % 不再在两项之间增加额外的间距(1.5 倍的行间距已经够宽了)(未来可以提供一个接口以供用户手动设置间距) itemsep=-0.5ex, ] \cs_set:Npn \makelabel ##1 {##1\hfil} } { \end{itemize} % 单独一页 \clearpage } % \end{macrocode} % \end{environment} % % \begin{macrocode} % % \end{macrocode} % % \subsection{bitreport.cls 模板类} % % \begin{macrocode} %<*report> % \end{macrocode} % % \subsubsection{全局变量与临时变量} % % \begin{variable}{\g_@@_thesis_type_int} % 论文类型,取值从 1 开始,分别对应: % \begin{enumerate} % \item 课程实验报告 % \item (计算机学院)本科生毕业(设计)开题报告(已废弃) % \end{enumerate} % \begin{macrocode} \int_new:N \g_@@_report_type_int % \end{macrocode} % \end{variable} % % \begin{variable}{\c_@@_report_type_clist} % 定义报告类型的列表。 % \begin{macrocode} \clist_const:Nn \c_@@_report_type_clist { common, undergraduate_proposal} % \end{macrocode} % \end{variable} % % \begin{variable}{\l_@@_right_seq,\l_@@_left_seq} % 临时变量。 % \begin{macrocode} \seq_new:N \l_@@_right_seq \seq_new:N \l_@@_left_seq % \end{macrocode} % \end{variable} % % 手动开启伪粗体、伪斜体。 % \begin{macrocode} \PassOptionsToPackage{AutoFakeBold,AutoFakeSlant}{xeCJK} % \end{macrocode} % % \subsubsection{l3keys 接口键值对定义} % % 定义 |bitreport| 模板类的键值对。 % \begin{macrocode} \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} } % \end{macrocode} % % 定义 |bitreport/option| 模板类的键值对。 % \begin{macrocode} \keys_define:nn { bitreport / option } { type .choice:, type .value_required:n = true, type .choices:Vn = \c_@@_report_type_clist { \int_set_eq:NN \g_@@_report_type_int \l_keys_choice_int }, type .initial:n = common, ctex .tl_set:N = \l_@@_options_to_ctex_tl, } % \end{macrocode} % % 定义 |bitreport/cover| 模板类的键值对。 % \begin{macrocode} \keys_define:nn { bitreport / cover } { imagePath .tl_set:N = \l_bit_coverimagepath_tl, date .tl_set:N = \l_@@_cover_date_tl, %% cover entry dilimiter .tl_set:N = \l_@@_cover_dilimiter_tl, labelAlign .tl_set:N = \l_@@_cover_label_align_tl, labelAlign .initial:n = {r}, valueAlign .tl_set:N = \l_@@_cover_value_align_tl, valueAlign .initial:n = {c}, labelMaxWidth .dim_set:N = \l_@@_cover_label_max_width_dim, valueMaxWidth .dim_set:N = \l_@@_cover_value_max_width_dim, autoWidthPadding .dim_set:N = \l_@@_cover_auto_width_padding_dim, autoWidthPadding .initial:n = {0.25em}, autoWidth .bool_set:N = \l_@@_cover_auto_width_bool, autoWidth .initial:n = {true}, underlineThickness .dim_set:N = \l_@@_cover_underline_thickness_dim, underlineThickness .initial:n = {1pt}, underlineOffset .dim_set:N = \l_@@_cover_underline_offset_dim, underlineOffset .initial:n = { -10pt }, } % \end{macrocode} % % 定义 |bitreport/info| 模板类的键值对。 % \begin{macrocode} \keys_define:nn { bitreport / info } { title .tl_set:N = \l_@@_value_title_tl, school .tl_set:N = \l_@@_value_school_tl, major .tl_set:N = \l_@@_value_major_tl, class .tl_set:N = \l_@@_value_class_tl, author .tl_set:N = \l_@@_value_author_tl, supervisor .tl_set:N = \l_@@_value_supervisor_tl, externalSupervisor .tl_set:N = \l_@@_value_external_supervisor_tl, studentId .tl_set:N = \l_@@_value_student_id_tl, } % \end{macrocode} % % 定义 |bitreport/misc| 模板类的键值对。 % \begin{macrocode} \keys_define:nn { bitreport / misc } { reviewTable .tl_set:N = \l_bit_reviewtable_tl, } % \end{macrocode} % % 将 |bithesis/option/ctex| 中的值传递给 ctexbook 模板类。 % \begin{macrocode} \DeclareOption*{ \PassOptionsToClass{\l_@@_options_to_ctex_tl}{ctexart} } % \end{macrocode} % % 加载 ctexbook 模板类。 % \begin{macrocode} \ProcessOptions\relax \LoadClass[zihao=-4]{ctexart} % \end{macrocode} % % \subsubsection{定义模板类样式} % 加载所需的宏包。 % \begin{macrocode} \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} % \end{macrocode} % % 在宏加载时,处理 |bitreport/option| 中的值。使得 |bitreport| % 宏包的模板选项可以在宏加载时生效。 % \begin{macrocode} \ProcessKeysOptions { bitreport / option } % \end{macrocode} % % \subsubsection{辅助函数与常量} % % \begin{macro}{\tl_if_empty:xTF,\seq_set_split:Nnx} % 生成变体。 % \begin{macrocode} \cs_generate_variant:Nn \tl_if_empty:nTF {x} \cs_generate_variant:Nn \seq_set_split:Nnn {Nnx} % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_dunderline:nnn} % 用于渲染下划线。 % % 参数如下: % \begin{itemize} % \item \#1 位置,可选值为 \texttt{c}enter、\texttt{l}eft、\texttt{r}ight。 % \item \#2 |dim| 长度。 % \item \#3 |tl| 文字内容。 % \end{itemize} % \begin{macrocode} \cs_new:Npn \@@_dunderline:nnn #1#2#3 { {\setbox0=\hbox{#3}\ooalign{\copy0\cr\rule[\dimexpr#1-#2\relax]{\wd0}{#2}}} } % \end{macrocode} % \end{macro} % % \begin{macro}{|@@_render_cover_entry:nn} % 用于渲染封面的辅助函数。 % % 参数如下: % \begin{itemize} % \item \#1 |{token_list}| 为封面信息条目的名称。 % \item \#2 |{token_list}| 为封面信息条目的内容。 % \end{itemize} % % 需要在 |\l_@@_cover_label_max_width_dim| 和 |\l_@@_cover_value_max_width_dim| % 存储已经计算出来的最大宽度。 % \begin{macrocode} \cs_new:Npn \@@_render_cover_entry:nn #1#2 { \makebox[\l_@@_cover_label_max_width_dim][\l_@@_cover_label_align_tl]{ \tl_if_blank:VTF #1 {} {#1\l_@@_cover_dilimiter_tl} } \hspace{1ex} \@@_dunderline:nnn{\l_@@_cover_underline_offset_dim}{\l_@@_cover_underline_thickness_dim}{ \makebox[\l_@@_cover_value_max_width_dim][\l_@@_cover_value_align_tl]{#2} }\par } % \end{macrocode} % \end{macro} % % \begin{macro}{|@@_get_text_width:Nn,\@@_get_text_width:NV} % 计算 \#2 所占用的宽度,将结果存储在 \#1 中。 % % 参数如下: % \begin{itemize} % \item \#1 |dim| 存储宽度的变量。 % \item \#2 |tl| 要计算宽度的文本。 % \end{itemize} % \begin{macrocode} % Get text with from #2, then set to #1. \cs_new:Npn \@@_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 \@@_get_text_width:Nn { NV } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_get_max_text_width:NN} % 从 \#2 中获取最大的文本宽度,然后设置到 \#1 中。 % % 参数如下: % \begin{itemize} % \item \#1: |dim| 用于存储最大宽度。 % \item \#2: |seq| 用于存储文本。 % \end{itemize} % \begin{macrocode} \cs_new:Npn \@@_get_max_text_width:NN #1#2 { % 这里用 |group| 确保局部变量不会被污染。 \group_begin: \seq_set_eq:NN \l_@@_tmpa_seq #2 \dim_zero_new:N \l_@@_tmpa_dim \bool_until_do:nn { \seq_if_empty_p:N \l_@@_tmpa_seq } { \seq_pop_left:NN \l_@@_tmpa_seq \l_@@_tmpa_tl \@@_get_text_width:NV \l_@@_tmpa_dim \l_@@_tmpa_tl % 在两边加上空白,避免文本太靠边。 \dim_gset:Nn #1 { \dim_max:nn {#1} { \l_@@_tmpa_dim + \l_@@_cover_auto_width_padding_dim * 2} } } \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_parse_entry} % 解析封面信息条目。 % % 参数如下: % \begin{itemize} % \item \#1: |tl| 为封面信息条目的名称。 % \item \#2: |tl| 为封面信息条目的内容。 % \end{itemize} % |\\| 会被视为换行符,从而实现信息条目换行的效果。 % % \begin{macrocode} \cs_new:Npn \@@_parse_entry #1 #2 { \seq_set_split:Nnx \l_@@_tmp_right_seq {\\} {#2} \seq_clear:N \l_@@_tmp_left_seq \seq_map_inline:Nn \l_@@_tmp_right_seq { \seq_put_right:Nn \l_@@_tmp_left_seq {} } \seq_put_left:Nn \l_@@_tmp_left_seq {#1} \seq_pop_right:NN \l_@@_tmp_left_seq \g_@@_trashcan_tl } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_render_cover_entry} % 渲染封面信息项。此函数为主函数。 % \begin{macrocode} \cs_new:Npn \@@_render_cover_entry:n #1 { % 左边是标签,右边是值。 % 形如: % { {label_1} {value_1}, {label_2} {value 2} } % 首先转换成 seq 类型。 \seq_set_from_clist:NN \l_@@_input_seq #1 \seq_map_inline:Nn \l_@@_input_seq { % 然后对于每一对 label 和 value,首先查找 % value 中是否含有 \\ 字符,如果有,则将其分割成多个 % label - value 对。 % 比如 {label_1} {value \\ 1} 会被转换成 % { {label_1} {value}, {} {1} } \@@_parse_entry ##1 % 然后将这些 label - value 对添加到 \l_@@_right_seq % 或者 \l_@@_left_sql 中。 % left 就是 label,right 就是 value。 \seq_concat:NNN \l_@@_right_seq \l_@@_right_seq \l_@@_tmp_right_seq \seq_concat:NNN \l_@@_left_seq \l_@@_left_seq \l_@@_tmp_left_seq } % 如果用户选择自动计算最大宽度,则计算最大宽度。 \bool_if:NT \l_@@_cover_auto_width_bool { \@@_get_max_text_width:NN \l_@@_cover_label_max_width_dim \l_@@_left_seq \@@_get_max_text_width:NN \l_@@_cover_value_max_width_dim \l_@@_right_seq } % 最后,根据宽度渲染 label 和 value 对。 \group_begin: \bool_until_do:nn { \seq_if_empty_p:N \l_@@_left_seq } { \seq_pop_left:NN \l_@@_left_seq \l_@@_tmpa_tl \seq_pop_left:NN \l_@@_right_seq \l_@@_tmpb_tl \tl_if_empty:xTF \l_@@_tmpb_tl {} { \@@_render_cover_entry:nn {\l_@@_tmpa_tl} {\l_@@_tmpb_tl} } } \group_end: } % \end{macrocode} % \end{macro} % % \subsubsection{定义用户接口} % % \begin{macro}{\BITSetup} % 提供用户配置的接口。 % \begin{macrocode} \DeclareDocumentCommand \BITSetup { m } { \keys_set:nn { bitreport } { #1 }} % \end{macrocode} % \end{macro} % % \begin{macro}{\MakeCover} % 渲染封面。 % \begin{macrocode} \DeclareDocumentCommand \MakeCover {} { \group_begin: \int_case:nn {\g_@@_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_@@_value_title_tl}\\ \vspace{67mm} \begin{spacing}{2.2} \songti\zihao{3} \clist_set:Nn \l_@@_input_clist { {\textbf{学\qquad 院:}} {\l_@@_value_school_tl}, {\textbf{专\qquad 业:}} {\l_@@_value_major_tl}, {\textbf{班\qquad 级:}} {\l_@@_value_class_tl}, {\textbf{学\qquad 号:}} {\l_@@_value_student_id_tl}, {\textbf{姓\qquad 名:}} {\l_@@_value_author_tl}, {\textbf{任课教师:}} {\l_@@_value_supervisor_tl}, } \@@_render_cover_entry:n \l_@@_input_clist \end{spacing} \vspace*{\fill} \centering \songti\fontsize{12pt}{12pt}\selectfont{ \tl_if_empty:NTF \l_@@_cover_date_tl { \today } { \l_@@_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_@@_input_clist { {\textbf{学\qquad 院:}} {\l_@@_value_school_tl}, {\textbf{专\qquad 业:}} {\l_@@_value_major_tl}, {\textbf{班\qquad 级:}} {\l_@@_value_class_tl}, {\textbf{姓\qquad 名:}} {\l_@@_value_author_tl}, {\textbf{指导教师:}} {\l_@@_value_supervisor_tl}, {\textbf{校外指导教师:}} {\l_@@_value_external_supervisor_tl}, } \@@_render_cover_entry:n \l_@@_input_clist \end{spacing} \vspace*{\fill} \centering \hspace{-6mm}\songti\fontsize{12pt}{12pt}\selectfont{\today} \end{titlepage} } } \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\MakeReviewTable} % 渲染评阅表。 % \begin{macrocode} \DeclareDocumentCommand \MakeReviewTable {} { \group_begin: \begin{titlepage} \includepdf[pages=-]{\l_bit_reviewtable_tl} \end{titlepage} \group_end: } % \end{macrocode} % \end{macro} % % 定义 caption 字体为楷体 % \begin{macrocode} \DeclareCaptionFont{kaiticaption}{\kaishu \normalsize} % \end{macrocode} % % 设置图片的 caption 格式 % \begin{macrocode} \renewcommand{\thefigure}{\thesection-\arabic{figure}} \captionsetup[figure]{font=small,labelsep=space,skip=10bp,labelfont=bf,font=kaiticaption} % \end{macrocode} % % 设置表格的 caption 格式 % \begin{macrocode} \renewcommand{\thetable}{\thesection-\arabic{table}} \captionsetup[table]{font=small,labelsep=space,skip=10bp,labelfont=bf,font=kaiticaption} % \end{macrocode} % % 输出大写数字日期 % \begin{macrocode} \ctexset{today=big} % \end{macrocode} % % 将西文字体设置为 Times New Roman % \begin{macrocode} \setromanfont{Times~New~Roman} % \end{macrocode} % % 设置文档标题深度 % \begin{macrocode} \setcounter{tocdepth}{3} \setcounter{secnumdepth}{3} % \end{macrocode} % % 设置一级标题、二级标题格式。 % \begin{macrocode} % 一级标题:小三,宋体,加粗,段前段后各半行。 \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, } } % \end{macrocode} % % 页眉和页脚(页码)的格式设定。 % \begin{macrocode} \fancyhf{} \int_case:nn {\g_@@_report_type_int} { {1} { \fancyhead[R]{ \fontsize{10.5pt}{10.5pt} \selectfont{\l_@@_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} % \end{macrocode} % % 正文开始 % \begin{macrocode} \pagestyle{fancy} \setcounter{page}{1} % \end{macrocode} % % \begin{macrocode} % 正文 22 磅的行距,段前段后间距为 0 % \setlength{\parskip}{0em} \cs_set:Npn \baselinestretch {1.53} % 正文首行悬挂 1.02cm % \setlength{\parindent}{1.02cm} % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \subsection{bitbeamer.cls 文档类} % % \begin{macrocode} %<*beamer> % \end{macrocode} % % \subsubsection{l3keys 接口键值对定义} % % 定义 |bitbeamer| 文档类的接口键值对。 % \begin{macrocode} \keys_define:nn { bitbeamer } { titlegraphic .tl_set:N = \l_bit_titlegraphic_tl, framelogo .tl_set:N = \l_bit_framelogo_tl, } % \end{macrocode} % % 在宏加载时,处理 |bitbeamer| 中的值。使得 |bitbeamer| % 宏包的模板选项可以在宏加载时生效。 % \begin{macrocode} \ProcessKeysOptions { bitbeamer } % \end{macrocode} % % Pass every option not explicitly defined to `ctexbeamer`. % \begin{macrocode} \DeclareOption*{ \PassOptionsToClass{\CurrentOption}{ctexbeamer} } % \end{macrocode} % % Executes the code for each option. % Load. % \begin{macrocode} \ProcessOptions\relax \LoadClass{ctexbeamer} % \end{macrocode} % % \subsubsection{定义模板类样式} % % 加载所需的宏包。 % \begin{macrocode} \RequirePackage{xeCJKfntef} \RequirePackage{tikz} % \end{macrocode} % % 设置主题与主题色。 % \begin{macrocode} \usetheme{Madrid} \definecolor{bitred}{HTML}{A13E0B} \definecolor{bitgreen}{HTML}{0A8F30} \definecolor{bitdarkgreen}{HTML}{005B30} \colorlet{beamer@blendedblue}{bitdarkgreen} % \end{macrocode} % % % \begin{macro}{\CJKhl:nn} % 高亮中文字符。 % \begin{macrocode} \cs_new:Npn \CJKhl:nn #1 #2 { \CJKsout*[thickness=2.5ex, format=\color{#1}]{#2} } % \end{macrocode} % \end{macro} % % Set header if logo path is provided. % \begin{macrocode} \tl_if_empty:NF \l_bit_titlegraphic_tl { % BIT Logo \titlegraphic{ \includegraphics[width=2cm]{\l_bit_titlegraphic_tl} } } % \end{macrocode} % % Set title logo if logo path is provided. % \begin{macrocode} \tl_if_empty:NF \l_bit_framelogo_tl { \addtobeamertemplate{frametitle}{}{% \begin{tikzpicture}[remember~picture,overlay] \node[anchor=north~east,yshift=2pt] at (current~page.north~east) {\includegraphics[height=0.8cm]{\tl_use:N \l_bit_framelogo_tl}}; \end{tikzpicture} } } % \end{macrocode} % % \subsubsection{定义用户接口} % % \begin{macrocode} \cs_new_eq:NN \CJKhl \CJKhl:nn % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \iffalse % %<*dtx-style> \ProvidesPackage{dtx-style} \RequirePackage{hypdoc} \RequirePackage{ifthen} \RequirePackage[quiet]{fontspec} \RequirePackage{amsmath} \RequirePackage{unicode-math} \RequirePackage[UTF8,scheme=chinese,heading,sub3section]{ctex} \RequirePackage[ top=2.5cm, bottom=2.5cm, left=5cm, right=2cm, headsep=3mm]{geometry} \RequirePackage{graphicx} \RequirePackage{multirow} \RequirePackage{wrapfig} \RequirePackage{hologo} \RequirePackage{array,longtable,booktabs} \RequirePackage{listings} \RequirePackage{fancyhdr} \RequirePackage[dvipsnames,table,xcdraw]{xcolor} \RequirePackage{awesomebox} % \RequirePackage{etoolbox} \RequirePackage{dirtree} \RequirePackage{metalogo} \RequirePackage[tightLists=false]{markdown} \RequirePackage{caption} \RequirePackage{tikz} \usetikzlibrary{positioning} \RequirePackage{framed} \RequirePackage{menukeys} \RequirePackage{float} \RequirePackage{subfig} % 设置列表无间隔 \usepackage{enumitem} \setlist{nosep} \markdownSetup{ renderers = { link = {\href{#2}{#1}}, } } \hypersetup{ pdflang = zh-CN, pdftitle = {BIThesis:北京理工大学学位论文及报告模板}, pdfauthor = {冯开宇}, pdfsubject = {北京理工大学学位论文及报告模板使用说明}, pdfkeywords = {论文模板; 北京理工大学; 使用说明}, pdfdisplaydoctitle = true }% \renewcommand{\subsectionautorefname}{小节} \renewcommand{\subsubsectionautorefname}{小节} \renewcommand{\sectionautorefname}{节} \renewcommand{\chapterautorefname}{章} \newcommand{\BIThesisLaTeX}{{\BIThesis}北京理工大学学位论文及报告{\LaTeX}模板} \newcommand{\BIThesisMacroPackage}{{\BIThesis}宏包} \newcommand{\BIThesisWiki}{{\BIThesis}在线文档} \newcommand{\BIThesisScaffold}{{\BIThesis}模板} \newcommand{\BIThesisRelease}{{\BIThesis}模板} \newcommand{\LPPL}{{\href{https://www.latex-project.org/lppl/lppl-1-3c.txt}{\LaTeX{} Project Public License (1.3.c)}}} \newcommand{\versionold}{v2.0 BirthdayCake} \newcommand{\version}{v3 Summer Time} \ExplSyntaxOn \AtBeginEnvironment { bitsyntax } { \cs_set:Npn \lparen { \textup { ( } } \cs_set:Npn \rparen { \textup { ) } } \char_set_catcode_active:N | \char_set_catcode_active:N < \char_set_catcode_active:N ( \char_set_active_eq:NN | \orbar \char_set_active_eq:NN < \syntaxopt@aux \char_set_active_eq:NN ( \defaultval@aux } \NewDocumentCommand \BIThesisTemplates {m} { \str_case:nn {#1} { {UT}{本科生毕业论文模板(undergraduate-thesis)} {UTE}{本科生全英文专业毕业论文模板(undergraduate-thesis-en)} {GT}{研究生学位论文模板(graduate-thesis)} {LR}{简易实验报告模板(lab-report)} {PT}{本科生毕业设计外文翻译模板(paper-translation)} {PS}{北理工主题的 Beamer 模板(presentation-slide)} {UP}{本科生毕业设计开题报告(undergraduate-proposal)} } } % 允许换行的细间距。 \def\breakablethinspace{\hskip 0.16667em\relax} \DeclareDocumentCommand\kvopt{mm} {\texttt{#1\breakablethinspace=\breakablethinspace#2}} \ExplSyntaxOff \ctexset{ today=big, abstractname=简介, } \pagestyle{fancy} \ctexset{section={ format={\raggedright \bfseries \zihao{-3}}, name = {第,章} } } \ctexset{subsection={ format = {\bfseries \raggedright \zihao{4}} } } \ifthenelse{\equal{\@nameuse{g__ctex_fontset_tl}}{mac}}{ \setmainfont{Palatino} \setsansfont[Scale=MatchLowercase]{Helvetica} \setmonofont[Scale=MatchLowercase]{Menlo} \xeCJKsetwidth{‘’“”}{1em} }{ \setmainfont[ Extension = .otf, UprightFont = *-regular, BoldFont = *-bold, ItalicFont = *-italic, BoldItalicFont = *-bolditalic, ]{texgyrepagella} \setsansfont[ Extension = .otf, UprightFont = *-regular, BoldFont = *-bold, ItalicFont = *-italic, BoldItalicFont = *-bolditalic, ]{texgyreheros} \setmonofont[ Extension = .otf, UprightFont = *-regular, BoldFont = *-bold, ItalicFont = *-italic, BoldItalicFont = *-bolditalic, Scale = MatchLowercase, Ligatures = CommonOff, ]{texgyrecursor} } \unimathsetup{ math-style=ISO, bold-style=ISO, } \IfFontExistsTF{XITSMath-Regular.otf}{ \setmathfont[ Extension = .otf, BoldFont = XITSMath-Bold, StylisticSet = 8, ]{XITSMath-Regular} \setmathfont[range={cal,bfcal},StylisticSet=1]{XITSMath-Regular.otf} }{ \setmathfont[ Extension = .otf, BoldFont = *bold, StylisticSet = 8, ]{xits-math} \setmathfont[range={cal,bfcal},StylisticSet=1]{xits-math.otf} } \colorlet{bit@macro}{blue!60!black} \colorlet{bit@env}{blue!70!black} \colorlet{bit@option}{purple} \patchcmd{\PrintMacroName}{\MacroFont}{\MacroFont\bfseries\color{bit@macro}}{}{} \patchcmd{\PrintDescribeMacro}{\MacroFont}{\MacroFont\bfseries\color{bit@macro}}{}{} \patchcmd{\PrintDescribeEnv}{\MacroFont}{\MacroFont\bfseries\color{bit@env}}{}{} \patchcmd{\PrintEnvName}{\MacroFont}{\MacroFont\bfseries\color{bit@env}}{}{} \def\DescribeOption{% \leavevmode\@bsphack\begingroup\MakePrivateLetters% \Describe@Option} \def\Describe@Option#1{\endgroup \marginpar{\raggedleft\PrintDescribeOption{#1}}% \bit@special@index{option}{#1}\@esphack\ignorespaces} \def\PrintDescribeOption#1{\strut \MacroFont\bfseries\sffamily\color{bit@option} #1\ } \def\bit@special@index#1#2{\@bsphack \begingroup \HD@target \let\HDorg@encapchar\encapchar \edef\encapchar usage{% \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage}% }% \index{#2\actualchar{\string\ttfamily\space#2} (#1)\encapchar usage}% \index{#1:\levelchar#2\actualchar {\string\ttfamily\space#2}\encapchar usage}% \endgroup \@esphack} \lstdefinestyle{lstStyleBase}{% basicstyle=\small\ttfamily, aboveskip=\medskipamount, belowskip=\medskipamount, lineskip=0pt, boxpos=c, showlines=false, extendedchars=true, escapeinside = {(*}{*)}, upquote=true, tabsize=2, showtabs=false, showspaces=false, showstringspaces=false, numbers=none, linewidth=\linewidth, xleftmargin=4pt, xrightmargin=0pt, resetmargins=false, breaklines=true, breakatwhitespace=false, breakindent=0pt, breakautoindent=true, columns=flexible, keepspaces=true, gobble=0, framesep=3pt, rulesep=1pt, framerule=1pt, backgroundcolor=\color{gray!5}, stringstyle=\color{green!40!black!100}, keywordstyle=\bfseries\color{blue!50!black}, commentstyle=\slshape\color{black!60}} \lstdefinestyle{lstStyleShell}{% style=lstStyleBase, frame=l, rulecolor=\color{purple}, language=bash, } \lstdefinestyle{lstStyleLaTeX}{% style=lstStyleBase, frame=l, rulecolor=\color{violet}, language=[LaTeX]TeX, emphstyle=[1]\color{teal}, } \lstdefinestyle{lstStyleSyntax}{% style=lstStyleBase, frame=l, rulecolor=\color{violet}, language=[LaTeX]TeX, emphstyle=[1]\color{teal}, } \lstnewenvironment{latex}[1][]{\lstset{style=lstStyleLaTeX, #1}}{} \lstnewenvironment{shell}{\lstset{style=lstStyleShell}}{} \lstnewenvironment{bitsyntax}[1][]{\lstset{style=lstStyleSyntax, #1}}{} \def\orbar{\textup{\textbar}} \def\syntaxopt#1{\textit{#1}} \def\defaultval#1{\textbf{\textup{#1}}} \def\syntaxopt@aux#1>{\syntaxopt{#1}} \def\defaultval@aux#1){\defaultval{#1}} \setlist{nosep} \DeclareDocumentCommand{\option}{m}{\textsf{#1}} \DeclareDocumentCommand{\env}{m}{\texttt{#1}} \newcommand{\myentry}[1]{% \marginpar{\raggedleft\color{purple}\bfseries\strut #1}} \newenvironment{note}[1][Note] {{\color{magenta} \bfseries #1} \itshape} {} \DeclareDocumentCommand{\githubuser}{m}{\href{https://github.com/#1}{@#1}} % 设置 caption 与 figure 之间的距离 \setlength{\abovecaptionskip}{11pt} \setlength{\belowcaptionskip}{9pt} % 设置图片的 caption 格式 \renewcommand{\thefigure}{\thesection-\arabic{figure}} \captionsetup[figure]{font=small,labelsep=space} % 设置表格的 caption 与 table 之间的垂直距离 \captionsetup[table]{skip=2pt} % 设置表格的 caption 格式 \renewcommand{\thetable}{\thesection-\arabic{table}} \captionsetup[table]{font=small,labelsep=space} % 定义 BIThesis \LaTeX 风格的 Logo \usepackage{relsize} \makeatletter \def\matex@ssize{\smaller\scshape} \DeclareRobustCommand{\BIThesis}{ \texorpdfstring{\mbox{ \kern-0.5em{B}\kern-0.05em {I}\kern-0.05em {T}\kern-0.1em \raisebox{-0.38ex}{\matex@ssize {H}}\kern-0.1em {\matex@ssize {E}}\kern-0.05em \raisebox{-0.38ex}{\matex@ssize {S}}\kern-0.05em {\matex@ssize {I}}\kern-0.05em \raisebox{-0.35ex}{\matex@ssize {S}}\kern-0.5em \kern 1ex }}{BIThesis} } %% from \pkg{ctxdoc} \newlist{optdesc}{description}{3} %% 设置间距为 \marginparsep,与 l3doc 一致 \setlist[optdesc]{% font=\mdseries\small\ttfamily,align=right,listparindent=\parindent, labelsep=\marginparsep,labelindent=-\marginparsep,leftmargin=0pt} \makeatother % % \fi % % % \Finale \endinput % \iffalse % Local Variables: % mode: doctex % TeX-master: t % End: % \fi