%%
%% This is file xduugthesis.cls', %% generated with the docstrip utility. %% %% The original source files were: %% %% xduts.dtx (with options: class,thesis,xduugthesis')
%%
%% Copyright 2022--2025 by @note286 in GitHub and CTAN
%%
%% 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.
%% The latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `author-maintained'.
%%
%% The Current Maintainer of this work is @note286 in GitHub and CTAN.
%%
%% This work consists of the files README.md, xduts.dtx, and xduts.ins
%% and the derived files xduts.pdf, xdufont.sty,
%% xduugtp.cls, xduugthesis.cls, and xdupgthesis.cls.
%%
%% The copyright of xdulogo.pdf is Xidian University.
%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\ProvidesExplClass{xduugthesis}
{2025/03/18}{6.2.6.2}
{Xidian University Undergraduate Thesis document class}
\RequirePackage { xparse, l3keys2e }
\PassOptionsToPackage { no-math } { fontspec }
\PassOptionsToPackage { quiet } { xeCJK }
\PassOptionsToClass
{
a4paper,
zihao=-4,
sub4section,
linespread = 1.625,
fontset = none
}
{ ctexbook }
\LoadClass { ctexbook }
\RequirePackage { geometry }
\geometry { paper = a4paper }
\RequirePackage { fancyhdr }
\RequirePackage { xeCJKfntef }
\RequirePackage { graphicx }
\tl_new:N \l__xdu_cjk_font_tl
\tl_new:N \l__xdu_fake_bold_tl
\tl_new:N \l__xdu_fake_slant_tl
\tl_new:N \l__xdu_latin_font_tl
\tl_new:N \l__xdu_latin_sans_scale_tl
\tl_new:N \l__xdu_latin_mono_scale_tl
\tl_new:N \l__xdu_math_font_tl
\tl_new:N \l__xdu_unicode_math_tl
\tl_new:N \l__xdu_font_type_tl
\tl_new:N \l__xdu_font_path_tl
\keys_define:nn { xdu / style }
{
cjk-font .choices:nn =
{ win, adobe, founder, hanyi, sinotype, fandol, none }
{ \tl_set_eq:NN \l__xdu_cjk_font_tl \l_keys_choice_tl },
cjk-fake-bold .tl_set:N = \l__xdu_fake_bold_tl,
cjk-fake-slant .tl_set:N = \l__xdu_fake_slant_tl,
latin-sans-scale .choices:nn = { upper, lower, off }
{ \tl_set_eq:NN \l__xdu_latin_sans_scale_tl \l_keys_choice_tl },
latin-mono-scale .choices:nn = { upper, lower, off }
{ \tl_set_eq:NN \l__xdu_latin_mono_scale_tl \l_keys_choice_tl },
latin-font .choices:nn = { gyre, tac, tacn, tcc, thcs, tll, none }
{ \tl_set_eq:NN \l__xdu_latin_font_tl \l_keys_choice_tl },
math-font .choices:nn =
{
asana, bonum, cambria, 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__xdu_math_font_tl \l_keys_choice_tl },
unicode-math .tl_set:N = \l__xdu_unicode_math_tl,
font-type .choices:nn = { font, file }
{ \tl_set_eq:NN \l__xdu_font_type_tl \l_keys_choice_tl },
font-path .tl_set:N = \l__xdu_font_path_tl
}
\keys_set:nn { xdu }
{
style / cjk-font = fandol,
style / cjk-fake-bold = 3,
style / cjk-fake-slant = 0.2,
style / latin-font = tacn,
style / latin-sans-scale = off,
style / latin-mono-scale = off,
style / math-font = cm,
style / unicode-math = { },
style / font-type = font,
style / font-path = fonts
}
\cs_new:Npn __xdu_select_font:nn #1#2
{
\str_if_eq:NNTF { \l__xdu_font_type_tl } { font }
{ #1 }
{ #2 }
}
\cs_new:Npn __xdu_font_path:
{
\str_if_eq:NNTF { \l__xdu_font_type_tl } { font }
{ }
{ Path = \l__xdu_font_path_tl / , }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_b:n #1
{
BoldFont = { #1 }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_fb:n #1
{
BoldFont = { #1 },
BoldFeatures = { FakeBold = \l__xdu_fake_bold_tl }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_fs:n #1
{
SlantedFont = { #1 },
SlantedFeatures = { FakeSlant = \l__xdu_fake_slant_tl }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_fbfs:n #1
{
BoldSlantedFont = { #1 },
BoldSlantedFeatures =
{
FakeBold = \l__xdu_fake_bold_tl,
FakeSlant = \l__xdu_fake_slant_tl
}
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_bfs:n #1
{
BoldSlantedFont = { #1 },
BoldSlantedFeatures = { FakeSlant = \l__xdu_fake_slant_tl }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_i:n #1
{
ItalicFont = { #1 }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_fi:n #1
{
ItalicFont = { #1 },
ItalicFeatures = { FakeSlant = \l__xdu_fake_slant_tl }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_ifb:n #1
{
BoldItalicFont = { #1 },
BoldItalicFeatures = { FakeBold = \l__xdu_fake_bold_tl }
}
\cs_new:Npn __xdu_cfg_cjk_font_sub_fifb:n #1
{
BoldItalicFont = { #1 },
BoldItalicFeatures =
{
FakeBold = \l__xdu_fake_bold_tl,
FakeSlant = \l__xdu_fake_slant_tl
}
}
\cs_new:Npn __xdu_cfg_cjk_font_r:n #1
{
__xdu_cfg_cjk_font_sub_fb:n { #1 },
__xdu_cfg_cjk_font_sub_fs:n { #1 },
__xdu_cfg_cjk_font_sub_fbfs:n { #1 },
__xdu_cfg_cjk_font_sub_fi:n { #1 },
__xdu_cfg_cjk_font_sub_fifb:n { #1 }
}
\cs_new:Npn __xdu_cfg_cjk_font_rb:nn #1#2
{
__xdu_cfg_cjk_font_sub_b:n { #2 },
__xdu_cfg_cjk_font_sub_fs:n { #1 },
__xdu_cfg_cjk_font_sub_bfs:n { #2 },
__xdu_cfg_cjk_font_sub_fi:n { #1 },
__xdu_cfg_cjk_font_sub_fifb:n { #1 }
}
\cs_new:Npn __xdu_cfg_cjk_font_ri:nn #1#2
{
__xdu_cfg_cjk_font_sub_fb:n { #1 },
__xdu_cfg_cjk_font_sub_fs:n { #1 },
__xdu_cfg_cjk_font_sub_fbfs:n { #1 },
__xdu_cfg_cjk_font_sub_i:n { #2 },
__xdu_cfg_cjk_font_sub_ifb:n { #2 }
}
\cs_new:Npn __xdu_cfg_cjk_font_rbi:nnn #1#2#3
{
__xdu_cfg_cjk_font_sub_b:n { #2 },
__xdu_cfg_cjk_font_sub_fs:n { #1 },
__xdu_cfg_cjk_font_sub_bfs:n { #2 },
__xdu_cfg_cjk_font_sub_i:n { #3 },
__xdu_cfg_cjk_font_sub_ifb:n { #3 }
}
\cs_new:Npn __xdu_set_cjk_main_font:nn #1#2
{
\setCJKmainfont { #1 }
[ __xdu_font_path: __xdu_cfg_cjk_font_ri:nn { #1 } { #2 } ]
}
\cs_new:Npn __xdu_set_cjk_main_font:nnn #1#2#3
{
\setCJKmainfont { #1 }
[ __xdu_font_path: __xdu_cfg_cjk_font_rbi:nnn { #1 } { #2 } { #3 } ]
}
\cs_new:Npn __xdu_set_cjk_sans_font:n #1
{
\setCJKsansfont { #1 }
[ __xdu_font_path: __xdu_cfg_cjk_font_r:n { #1 } ]
}
\cs_new:Npn __xdu_set_cjk_sans_font:nn #1#2
{
\setCJKsansfont { #1 }
[ __xdu_font_path: __xdu_cfg_cjk_font_rb:nn { #1 } { #2 } ]
}
\cs_new:Npn __xdu_set_cjk_mono_font:n #1
{
\setCJKmonofont { #1 }
[ __xdu_font_path: __xdu_cfg_cjk_font_r:n { #1 } ]
}
\cs_new:Npn __xdu_load_cjk_font_win:
{
__xdu_set_cjk_main_font:nn
{ __xdu_select_font:nn { SimSun } { simsun.ttc } }
{ __xdu_select_font:nn { KaiTi } { simkai.ttf } }
__xdu_set_cjk_sans_font:n
{ __xdu_select_font:nn { SimHei } { simhei.ttf } }
__xdu_set_cjk_mono_font:n
{ __xdu_select_font:nn { FangSong } { simfang.ttf } }
}
\cs_new:Npn __xdu_load_cjk_font_adobe:
{
__xdu_set_cjk_main_font:nn
{ __xdu_select_font:nn { AdobeSongStd } { adobesongstd-light.otf } }
{ __xdu_select_font:nn { AdobeKaitiStd } { adobekaitistd-regular.otf } }
__xdu_set_cjk_sans_font:n
{ __xdu_select_font:nn { AdobeHeitiStd } { adobeheitistd-regular.otf } }
__xdu_set_cjk_mono_font:n
{ __xdu_select_font:nn { AdobeFangsongStd } { Adobe-Fangsong-Std-R-Font.otf } }
}
\cs_new:Npn __xdu_load_cjk_font_founder:
{
__xdu_set_cjk_main_font:nn
{ __xdu_select_font:nn { FZShuSong-Z01 } { FZShuSong-Z01.ttf } }
{ __xdu_select_font:nn { FZKai-Z03 } { FZKai-Z03.ttf } }
__xdu_set_cjk_sans_font:n
{ __xdu_select_font:nn { FZHei-B01 } { FZHei-B01.ttf } }
__xdu_set_cjk_mono_font:n
{ __xdu_select_font:nn { FZFangSong-Z02 } { FZFSK.TTF } }
}
\cs_new:Npn __xdu_load_cjk_font_hanyi:
{
__xdu_set_cjk_main_font:nn
{ __xdu_select_font:nn { HYShuSongErS } { HYShuSongErS.ttf } }
{ __xdu_select_font:nn { HYKaiTiS } { HYKaiTiS.ttf } }
__xdu_set_cjk_sans_font:n
{ __xdu_select_font:nn { HYZhongHei } { HYZhongHeiTiS.ttf } }
__xdu_set_cjk_mono_font:n
{ __xdu_select_font:nn { HYFangSongS } { HYFangSongS.ttf } }
}
\cs_new:Npn __xdu_load_cjk_font_sinotype:
{
__xdu_set_cjk_main_font:nn
{ __xdu_select_font:nn { STSong } { STSONG.TTF } }
{ __xdu_select_font:nn { STKaiti } { STKAITI.TTF } }
__xdu_set_cjk_sans_font:nn
{ __xdu_select_font:nn { STXihei } { STXIHEI.TTF } }
{ __xdu_select_font:nn { STHeiti } { STHeiti.ttf } }
__xdu_set_cjk_mono_font:n
{ __xdu_select_font:nn { STFangsong } { STFANGSO.TTF } }
}
\cs_new:Npn __xdu_load_cjk_font_fandol:
{
__xdu_set_cjk_main_font:nnn
{ FandolSong-Regular.otf }
{ FandolSong-Bold.otf }
{ FandolKai-Regular.otf }
__xdu_set_cjk_sans_font:nn
{ FandolHei-Regular.otf }
{ FandolHei-Bold.otf }
__xdu_set_cjk_mono_font:n
{ FandolFang-Regular.otf }
}
\cs_new:Npn __xdu_load_cjk_font_none: { }
\cs_new:Npn __xdu_set_latin_font:nnn #1#2#3
{
BoldFont = { #1 },
SlantedFont = { #2 },
BoldSlantedFont = { #3 },
ItalicFont = { #2 },
BoldItalicFont = { #3 }
}
\cs_new:Npn __xdu_set_latin_sans_scale: { }
\cs_new:Npn __xdu_set_latin_mono_scale: { }
\ctex_at_end_preamble:n
{
\tl_if_eq:NnTF \l__xdu_latin_sans_scale_tl { upper }
{ \cs_set:Npn __xdu_set_latin_sans_scale: { Scale = MatchUppercase , } }
{
\tl_if_eq:NnT \l__xdu_latin_sans_scale_tl { lower }
{ \cs_set:Npn __xdu_set_latin_sans_scale: { Scale = MatchLowercase , } }
}
\tl_if_eq:NnTF \l__xdu_latin_mono_scale_tl { upper }
{ \cs_set:Npn __xdu_set_latin_mono_scale: { Scale = MatchUppercase , } }
{
\tl_if_eq:NnT \l__xdu_latin_mono_scale_tl { lower }
{ \cs_set:Npn __xdu_set_latin_mono_scale: { Scale = MatchLowercase , } }
}
}
\cs_new:Npn __xdu_off_latin_ligatures:
{ Ligatures = CommonOff , }
\cs_new:Npn __xdu_set_latin_main_font:nnnnn #1#2#3#4#5
{
\str_if_eq:NNTF { \l__xdu_font_type_tl } { font }
{ \setmainfont { #1 } }
{
\setmainfont { #2 }
[
__xdu_font_path:
__xdu_set_latin_font:nnn { #3 } { #4 } { #5 }
]
}
}
\cs_new:Npn __xdu_set_latin_sans_font:nnnnn #1#2#3#4#5
{
\str_if_eq:NNTF { \l__xdu_font_type_tl } { font }
{ \setsansfont { #1 } [ __xdu_set_latin_sans_scale: ] }
{
\setsansfont { #2 }
[
__xdu_font_path:
__xdu_set_latin_sans_scale:
__xdu_set_latin_font:nnn { #3 } { #4 } { #5 }
]
}
}
\cs_new:Npn __xdu_set_latin_mono_font:nnnnn #1#2#3#4#5
{
\str_if_eq:NNTF { \l__xdu_font_type_tl } { font }
{ \setmonofont { #1 } [ __xdu_set_latin_mono_scale: __xdu_off_latin_ligatures: ] }
{
\setmonofont { #2 }
[
__xdu_font_path:
__xdu_set_latin_mono_scale:
__xdu_off_latin_ligatures:
__xdu_set_latin_font:nnn { #3 } { #4 } { #5 }
]
}
}
\cs_new:Npn __xdu_set_latin_main_font:nnnn #1#2#3#4
{
\setmainfont { #1 }
[
__xdu_set_latin_font:nnn { #2 } { #3 } { #4 }
]
}
\cs_new:Npn __xdu_set_latin_sans_font:nnnn #1#2#3#4
{
\setsansfont { #1 }
[
__xdu_set_latin_sans_scale:
__xdu_set_latin_font:nnn { #2 } { #3 } { #4 }
]
}
\cs_new:Npn __xdu_set_latin_mono_font:nnnn #1#2#3#4
{
\setmonofont { #1 }
[
__xdu_set_latin_mono_scale:
__xdu_off_latin_ligatures:
__xdu_set_latin_font:nnn { #2 } { #3 } { #4 }
]
}
\cs_new:Npn __xdu_load_latin_font_tac:
{
__xdu_set_latin_main_font:nnnnn
{ TimesNewRoman } { times.ttf } { timesbd.ttf } { timesi.ttf } { timesbi.ttf }
__xdu_set_latin_sans_font:nnnnn
{ Arial } { arial.ttf } { arialbd.ttf } { ariali.ttf } { arialbi.ttf }
__xdu_set_latin_mono_font:nnnnn
{ Consolas } { consola.ttf } { consolab.ttf } { consolai.ttf } { consolaz.ttf }
}
\cs_new:Npn __xdu_load_latin_font_tacn:
{
__xdu_set_latin_main_font:nnnnn
{ TimesNewRoman } { times.ttf } { timesbd.ttf } { timesi.ttf } { timesbi.ttf }
__xdu_set_latin_sans_font:nnnnn
{ Arial } { arial.ttf } { arialbd.ttf } { ariali.ttf } { arialbi.ttf }
__xdu_set_latin_mono_font:nnnnn
{ CourierNew } { cour.ttf } { courbd.ttf } { couri.ttf } { courbi.ttf }
}
\cs_new:Npn __xdu_load_latin_font_tcc:
{
__xdu_set_latin_main_font:nnnnn
{ TimesNewRoman }
{ times.ttf }
{ timesbd.ttf }
{ timesi.ttf }
{ timesbi.ttf }
__xdu_set_latin_sans_font:nnnn
{ cmunss.otf }
{ cmunsx.otf }
{ cmunsi.otf }
{ cmunso.otf }
__xdu_set_latin_mono_font:nnnn
{ cmuntt.otf }
{ cmuntb.otf }
{ cmunit.otf }
{ cmuntx.otf }
}
\cs_new:Npn __xdu_load_latin_font_thcs:
{
__xdu_set_latin_main_font:nnnnn
{ TimesNewRoman }
{ times.ttf }
{ timesbd.ttf }
{ timesi.ttf }
{ timesbi.ttf }
__xdu_set_latin_sans_font:nnnnn
{ Helvetica }
{ Helvetica.ttf }
{ HelveticaBold.ttf }
{ HelveticaOblique.ttf }
{ HelveticaBoldOblique.ttf }
__xdu_set_latin_mono_font:nnnnn
{ CourierStd }
{ CourierStd.otf }
{ CourierStd-Bold.otf }
{ CourierStd-Oblique.otf }
{ CourierStd-BoldOblique.otf }
}
\cs_new:Npn __xdu_load_latin_font_tll:
{
__xdu_set_latin_main_font:nnnnn
{ TimesNewRoman }
{ times.ttf }
{ timesbd.ttf }
{ timesi.ttf }
{ timesbi.ttf }
__xdu_set_latin_sans_font:nnnn
{ LinBiolinum_R.otf }
{ LinBiolinum_RB.otf }
{ LinBiolinum_RI.otf }
{ LinBiolinum_RBO.otf }
__xdu_set_latin_mono_font:nnnn
{ LinLibertine_M.otf }
{ LinLibertine_MB.otf }
{ LinLibertine_MO.otf }
{ LinLibertine_MBO.otf }
}
\cs_new:Npn __xdu_load_latin_font_gyre:
{
__xdu_set_latin_main_font:nnnn
{ texgyretermes-regular.otf }
{ texgyretermes-bold.otf }
{ texgyretermes-italic.otf }
{ texgyretermes-bolditalic.otf }
__xdu_set_latin_sans_font:nnnn
{ texgyreheros-regular.otf }
{ texgyreheros-bold.otf }
{ texgyreheros-italic.otf }
{ texgyreheros-bolditalic.otf }
__xdu_set_latin_mono_font:nnnn
{ texgyrecursor-regular.otf }
{ texgyrecursor-bold.otf }
{ texgyrecursor-italic.otf }
{ texgyrecursor-bolditalic.otf }
}
\cs_new:Npn __xdu_load_latin_font_none: { }
\cs_new:Npn __xdu_load_unicode_math_pkg:
{
\PassOptionsToPackage { \l__xdu_unicode_math_tl } { unicode-math }
\RequirePackage { unicode-math }
\setoperatorfont { \symup }
\hypersetup { psdextra }
}
\cs_new:Npn __xdu_load_math_font_cambria:
{
__xdu_load_unicode_math_pkg:
\str_if_eq:NNTF { \l__xdu_font_type_tl } { font }
{ \setmathfont { CambriaMath } }
{ \setmathfont { cambria.ttc } [ Path = \l__xdu_font_path_tl/, FontIndex = 1 ] }
}
\cs_new:Npn __xdu_define_math_font:nn #1#2
{
\cs_new:cpn { _xdu_load_math_font #1 : }
{
__xdu_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 }
}
{ __xdu_define_math_font:nn #1 }
\cs_new:Npn __xdu_load_math_font_cm: { }
\cs_new:Npn __xdu_load_math_font_none: { }
\cs_new:Npn __xdu_load_font:
{
\use:c { _xdu_load_cjk_font \l__xdu_cjk_font_tl : }
\use:c { _xdu_load_latin_font \l__xdu_latin_font_tl : }
\use:c { _xdu_load_math_font \l__xdu_math_font_tl : }
}
\ctex_at_end_preamble:n { __xdu_load_font: }
\tl_new:N \l__xdu_title_tl
\tl_new:N \l__xdu_title_i_tl
\tl_new:N \l__xdu_title_ii_tl
\str_new:N \l__xdu_dept_str
\str_new:N \l__xdu_major_str
\str_new:N \l__xdu_author_str
\clist_new:N \l__xdu_supv_clist
\str_new:N \l__xdu_supv_ent_str
\str_new:N \l__xdu_student_id_str
\tl_new:N \l__xdu_abstract_zh_tl
\tl_new:N \l__xdu_abstract_en_tl
\clist_new:N \l__xdu_keywords_zh_clist
\clist_new:N \l__xdu_keywords_en_clist
\clist_new:N \l__xdu_bib_file_clist
\clist_new:N \l__xdu_appendix_clist
\tl_new:N \l__xdu_ack_tl
\keys_define:nn { xdu / info }
{
title .tl_set:N = \l__xdu_title_tl,
department .tl_set:N = \l__xdu_dept_str,
major .tl_set:N = \l__xdu_major_str,
author .tl_set:N = \l__xdu_author_str,
supervisor .clist_set:N = \l__xdu_supv_clist,
supv-ent .tl_set:N = \l__xdu_supv_ent_str,
supervisor-enterprise .tl_set:N = \l__xdu_supv_ent_str,
student-id .tl_set:N = \l__xdu_student_id_str,
abstract .tl_set:N = \l__xdu_abstract_zh_tl,
abstract* .tl_set:N = \l__xdu_abstract_en_tl,
keywords .clist_set:N = \l__xdu_keywords_zh_clist,
keywords* .clist_set:N = \l__xdu_keywords_en_clist,
bib-resource .clist_set:N = \l__xdu_bib_file_clist,
appendix .clist_set:N = \l__xdu_appendix_clist,
acknowledgements .tl_set:N = \l__xdu_ack_tl
}
\keys_set:nn { xdu }
{
info / title = { },
info / department = { },
info / major = { },
info / author = { },
info / supervisor = { },
info / supv-ent = { },
info / supervisor-enterprise = { },
info / student-id = { },
info / abstract = { },
info / abstract* = { },
info / keywords = { },
info / keywords* = { },
info / bib-resource = { },
info / appendix = { },
info / acknowledgements = { }
}
\str_new:N \l__xdu_supv_str
\str_new:N \l__xdu_supv_ii_str
\ctex_at_end_preamble:n
{
\str_set:Nx \l__xdu_supv_str { \clist_item:Nn \l__xdu_supv_clist { 1 } }
\str_set:Nx \l__xdu_supv_ii_str { \clist_item:Nn \l__xdu_supv_clist { 2 } }
}
\str_new:N \l__xdu_supv_dept_str
\str_new:N \l__xdu_supv_sch_str
\str_new:N \l__xdu_class_id_str
\keys_define:nn { xdu / info }
{
supv-dept .tl_set:N = \l__xdu_supv_dept_str,
supervisor-department .tl_set:N = \l__xdu_supv_dept_str,
supv-school .tl_set:N = \l__xdu_supv_sch_str,
supervisor-school .tl_set:N = \l__xdu_supv_sch_str,
class-id .tl_set:N = \l__xdu_class_id_str
}
\keys_set:nn { xdu }
{
info / supv-dept = { },
info / supervisor-department = { },
info / supv-school = { },
info / supervisor-school = { },
info / class-id = { }
}
\cs_set:Npn \figurename { __xdu_lang_switch:nn { 图 } { Figure } }
\cs_new_eq:NN \figname \figurename
\cs_set:Npn \tablename { __xdu_lang_switch:nn { 表 } { Table } }
\cs_new_eq:NN \tabname \tablename
\bool_new:N \l__xdu_title_bold_math_bool
\bool_new:N \l__xdu_en_cjk_font_bool
\tl_new:N \l__xdu_lang_tl
\tl_new:N \l__xdu_bib_tool_tl
\tl_new:N \l__xdu_biblatex_option_tl
\clist_new:N \l__xdu_search_path_clist
\bool_new:N \l__xdu_fix_input_bool
\bool_new:N \l__xdu_fix_include_bool
\bool_new:N \l__xdu_fix_graphics_bool
\tl_new:N \l__xdu_ref_add_space_bool
\tl_new:N \l__xdu_cap_label_sep_tl
\tl_new:N \l__xdu_ft_cap_format_tl
\tl_new:N \l__xdu_alg_cap_format_tl
\tl_new:N \l__xdu_ft_cap_align_tl
\tl_new:N \l__xdu_alg_cap_align_tl
\bool_new:N \l__xdu_add_alg_rule_vspace_bool
\bool_new:N \l__xdu_tab_small_bool
\tl_new:N \l__xdu_figure_align_tl
\tl_new:N \l__xdu_table_align_tl
\bool_new:N \l__xdu_alg_small_cap_bool
\bool_new:N \l__xdu_alg_small_bool
\clist_new:N \l__xdu_before_skip_clist
\clist_new:N \l__xdu_after_skip_clist
\tl_new:N \l__xdu_chap_tl
\tl_new:N \l__xdu_sec_tl
\tl_new:N \l__xdu_subsec_tl
\tl_new:N \l__xdu_subsubsec_tl
\tl_new:N \l__xdu_para_tl
\tl_new:N \l__xdu_subpara_tl
\bool_new:N \l__xdu_sym_mgn_bool
\tl_new:N \l__xdu_page_v_align_tl
\keys_define:nn { xdu / style }
{
title-bold-math .bool_set:N = \l__xdu_title_bold_math_bool,
en-cjk-font .bool_set:N = \l__xdu_en_cjk_font_bool,
language .choices:nn = { zh, en }
{ \tl_set_eq:NN \l__xdu_lang_tl \l_keys_choice_tl },
bib-backend .choices:nn = { bibtex, biblatex }
{ \tl_set_eq:NN \l__xdu_bib_tool_tl \l_keys_choice_tl },
biblatex-option .tl_set:N = \l__xdu_biblatex_option_tl,
file-search-path .clist_set:N = \l__xdu_search_path_clist,
fix-input .bool_set:N = \l__xdu_fix_input_bool,
fix-include .bool_set:N = \l__xdu_fix_include_bool,
fix-includegraphics .bool_set:N = \l__xdu_fix_graphics_bool,
ref-add-space .bool_set:N = \l__xdu_ref_add_space_bool,
caption-label-sep .tl_set:N = \l__xdu_cap_label_sep_tl,
ft-caption-format .choices:nn = { plain, hang }
{ \tl_set_eq:NN \l__xdu_ft_cap_format_tl \l_keys_choice_tl },
alg-caption-format .choices:nn = { plain, hang }
{ \tl_set_eq:NN \l__xdu_alg_cap_format_tl \l_keys_choice_tl },
ft-caption-align .choices:nn = { left, centering, centering-left }
{ \tl_set_eq:NN \l__xdu_ft_cap_align_tl \l_keys_choice_tl },
alg-caption-align .choices:nn = { left, centering, centering-left }
{ \tl_set_eq:NN \l__xdu_alg_cap_align_tl \l_keys_choice_tl },
add-alg-rule-vspace .bool_set:N = \l__xdu_add_alg_rule_vspace_bool,
table-small-font .bool_set:N = \l__xdu_tab_small_bool,
figure-align .choices:nn = { left, centering, right }
{ \tl_set_eq:NN \l__xdu_figure_align_tl \l_keys_choice_tl },
table-align .choices:nn = { left, centering, right }
{ \tl_set_eq:NN \l__xdu_table_align_tl \l_keys_choice_tl },
alg-small-caption .bool_set:N = \l__xdu_alg_small_cap_bool,
algorithm-small-caption .bool_set:N = \l__xdu_alg_small_cap_bool,
alg-small-font .bool_set:N = \l__xdu_alg_small_bool,
algorithm-small-font .bool_set:N = \l__xdu_alg_small_bool,
before-skip .clist_set:N = \l__xdu_before_skip_clist,
after-skip .clist_set:N = \l__xdu_after_skip_clist,
chap-zihao .tl_set:N = \l__xdu_chap_tl,
sec-zihao .tl_set:N = \l__xdu_sec_tl,
subsec-zihao .tl_set:N = \l__xdu_subsec_tl,
subsubsec-zihao .tl_set:N = \l__xdu_subsubsec_tl,
para-zihao .tl_set:N = \l__xdu_para_tl,
subpara-zihao .tl_set:N = \l__xdu_subpara_tl,
symmetric-margin .bool_set:N = \l__xdu_sym_mgn_bool,
page-vertical-align .tl_set:N = \l__xdu_page_v_align_tl
}
\keys_set:nn { xdu }
{
style / title-bold-math = false,
style / en-cjk-font = false,
style / language = zh,
style / bib-backend = biblatex,
style / biblatex-option = { },
style / file-search-path = { },
style / fix-input = false,
style / fix-include = false,
style / fix-includegraphics = false,
style / ref-add-space = false,
style / caption-label-sep = 0.75em,
style / ft-caption-format = hang,
style / alg-caption-format = hang,
style / ft-caption-align = centering-left,
style / alg-caption-align = left,
style / add-alg-rule-vspace = false,
style / table-small-font = true,
style / figure-align = centering,
style / table-align = centering,
style / alg-small-caption = true,
style / algorithm-small-caption = true,
style / alg-small-font = true,
style / algorithm-small-font = true,
style / before-skip = { 24pt, 18pt, 12pt, 12pt, 12pt, 12pt },
style / after-skip = { 18pt, 12pt, 6pt, 6pt, 6pt, 6pt },
style / symmetric-margin = false,
style / page-vertical-align = 顶部对齐
}
\cs_new:Npn __xdu_bold_math: { }
\ctex_at_end_preamble:n
{
\bool_if:NT \l__xdu_title_bold_math_bool
{
\tl_if_eq:NnT \l__xdu_math_font_tl { cm }
{ \cs_set_eq:NN __xdu_bold_math: \boldmath }
}
}
\NewDocumentCommand \xdusetup { m }
{ \keys_set:nn { xdu } { #1 } }
\keys_define:nn { xdu }
{
style .meta:nn = { xdu / style } { #1 },
info .meta:nn = { xdu / info } { #1 }
}
\ProcessKeysOptions { xdu / style }
\cs_new:Npn __xdu_lang_switch:nn #1#2
{
\str_if_eq:NNTF { \l__xdu_lang_tl } { zh }
{ #1 }
{ #2 }
}
\cs_new:Npn __xdu_rm_family:
{ \bool_if:NTF \l__xdu_en_cjk_font_bool { \CJKfamily+ { rm } } { \rmfamily } }
\cs_new:Npn __xdu_sf_family:
{ \bool_if:NTF \l__xdu_en_cjk_font_bool { \CJKfamily+ { sf } } { \sffamily } }
\cs_new:Npn __xdu_tt_family:
{ \bool_if:NTF \l__xdu_en_cjk_font_bool { \CJKfamily+ { tt } } { \ttfamily } }
\ctex_at_end_preamble:n
{
\tl_new:N \l__xdu_pure_title_tl
\tl_set_eq:NN \l__xdu_pure_title_tl \l__xdu_title_tl
\tl_remove_all:Nn \l__xdu_pure_title_tl { \ }
}
\cs_new_protected:Npn __xdu_split_title:Nn #1#2
{
\seq_new:N \l__xdu_title_seq
\tl_if_in:nnTF { #2 } { \ }
{
\seq_set_split:Nnn \l__xdu_title_seq { \ } { #2 }
\clist_set_from_seq:NN #1 \l__xdu_title_seq
}
{ \clist_set:Nx #1 { #2 } }
}
\cs_generate_variant:Nn __xdu_split_title:Nn { NV }
\cs_new:Npn __xdu_uline:n #1
{ \CJKunderline [ thickness = 0.5pt ] { #1 } }
\cs_new:Npn __xdu_tl_set_if_empty:Nn #1#2
{ \tl_if_empty:NT #1 { \tl_set:Nn #1 { #2 } } }
\cs_new:Npn __xdu_get_text_width:Nn #1#2
{
\box_clear_new:N \l__xdu_tmp_box
\hbox_set:Nn \l__xdu_tmp_box { #2 }
\dim_set:Nn #1 { \box_wd:N \l__xdu_tmp_box }
}
\cs_generate_variant:Nn __xdu_get_text_width:Nn { NV }
\cs_new:Npn __xdu_add_bookmark:n #1
{
\cleardoublepage
\currentpdfbookmark { #1 } { #1 }
}
\cs_new:Npn __xdu_add_toc:n #1
{
\cleardoublepage
\phantomsection
\addcontentsline { toc } { chapter } { #1 }
}
\cs_new:Npn __xdu_n_chapter_head:n #1
{
__xdu_add_bookmark:n { #1 }
\chapter* { #1 }
\markboth { #1 } { }
}
\cs_new:Npn __xdu_n_chapter_head_ii:nn #1#2
{
\group_begin:
\ctexset { chapter / format = { #2 } }
__xdu_n_chapter_head:n { #1 }
\group_end:
}
\cs_new:Npn __xdu_n_chapter_head:nn #1#2
{
__xdu_add_bookmark:n { #1 }
\chapter* { #2 }
\markboth { #1 } { #1 }
}
\cs_new:Npn __xdu_n_chapter_head_ii:nnn #1#2#3
{
\group_begin:
\ctexset { chapter / format = { #3 } }
__xdu_n_chapter_head:nn { #1 } { #2 }
\group_end:
}
\cs_new:Npn __xdu_n_chapter_head_toc:n #1
{
__xdu_add_toc:n { #1 }
\chapter* { #1 }
\markboth { #1 } { }
}
\cs_new:Npn __xdu_n_chapter_head_toc:nn #1#2
{
__xdu_add_toc:n { #1 }
\chapter* { #2 }
\markboth { #1 } { }
}
\cs_new:Npn __xdu_n_chapter_head_toc_ii:nn #1#2
{
\group_begin:
\ctexset { chapter / format = { #2 } }
__xdu_n_chapter_head_toc:n { #1 }
\group_end:
}
\cs_new:Npn __xdu_typeout_keywords:nNn #1#2#3
{
\tl_clear_new:N \l__xdu_keywords_label_str
\tl_set:Nn \l__xdu_keywords_label_tl { #1 }
\dim_zero_new:N \l__xdu_keywords_label_dim
__xdu_get_text_width:NV \l__xdu_keywords_label_dim \l__xdu_keywords_label_tl
\begin { list } { \l__xdu_keywords_label_tl }
{
\labelwidth \l__xdu_keywords_label_dim
\labelsep \c_zero_dim
\rightmargin \c_zero_dim
\leftmargin \l__xdu_keywords_label_dim
}
\item \clist_use:Nnnn #2 { #3 } { #3 } { #3 }
\end { list }
}
\dim_new:N \l__xdu_str_dim
\box_new:N \l__xdu_str_box
\cs_new:Npn __xdu_str_max_dim:Nn #1#2
{
\hbox_set:Nn \l__xdu_str_box { #2 }
\dim_set:Nn \l__xdu_str_dim { \box_wd:N \l__xdu_str_box }
\dim_set:Nn #1 { \dim_max:nn { \l__xdu_str_dim } { #1 } }
}
\NewDocumentCommand \noauxwrite { m }
{
\if@filesw
@fileswfalse
#1
@fileswtrue
\else
#1
\fi
}
\newgeometry
{
top = 3cm,
bottom = 2cm,
inner = 3cm,
outer = 2cm,
bindingoffset = 1cm,
head = 2cm,
foot = 1cm
}
\savegeometry { main }
\newgeometry
{
top = 3cm,
bottom = 2cm,
inner = 3cm,
outer = 3cm,
head = 2cm,
foot = 1cm
}
\savegeometry { main-sym }
\newgeometry
{
top = 2.5cm,
bottom = 2cm,
inner = 3cm,
outer = 2cm
}
\savegeometry { cover }
\cs_new:Npn __xdu_load_main_geometry:
{
\bool_if:NTF \l__xdu_sym_mgn_bool
{ \loadgeometry { main-sym } }
{ \loadgeometry { main } }
}
\clist_map_inline:nn
{
{ chinese },
{ arabic },
{ roman },
{ Roman },
{ alph },
{ Alph },
{ fnsymbol }
}
{ \cs_new_eq:cc { __xdu _ #1 : } { #1 } }
\tl_set:Nn \chaptername { Chapter }
\tl_new:N \l__xdu_chaptername
\tl_set_eq:NN \l__xdu_chaptername \chaptername
\renewcommand { \chaptermark } [ 1 ]
{
\markboth
{
__xdu_lang_switch:nn
{ \CTEXthechapter }
{ \l__xdu_chaptername \space __xdu_Roman: { chapter } }
\quad #1
}
{ }
}
\fancypagestyle { plain }
{
\pagestyle { fancy }
\fancyhf { }
\fancyhead [ CE ] { __xdu_rm_family: \zihao { 5 } \l__xdu_pure_title_tl }
\fancyhead [ CO ] { __xdu_rm_family: \zihao { 5 } \leftmark }
\fancyhead [ LE ] { __xdu_rm_family: \zihao { -5 } \thepage }
\fancyhead [ RO ] { __xdu_rm_family: \zihao { -5 } \thepage }
\renewcommand { \headrulewidth } { 0.75pt }
}
\ctex_at_end_preamble:n
{
\tl_if_eq:NnTF \l__xdu_page_v_align_tl { 顶部对齐 }
{ \raggedbottom }
{ \flushbottom }
}
\ctexset { secnumdepth=5 }
\ctexset
{
chapter / name =
{
__xdu_lang_switch:nn { 第 } { \l__xdu_chaptername \space },
__xdu_lang_switch:nn { 章 } { }
},
section / name = { },
subsection / name = { },
subsubsection / name = { },
paragraph / name = { },
subparagraph / name = { }
}
\ctex_at_end_preamble:n
{
__xdu_lang_switch:nn
{
\ctexset
{
chapter / number = { \chinese { chapter } },
section / number = { \thesection },
subsection / number = { \thesubsection },
subsubsection / number = { \thesubsubsection },
paragraph / number = { \theparagraph },
subparagraph / number = { \thesubparagraph }
}
}
{
\ctexset
{
chapter / number = { \Roman { chapter } },
section / number = { \thesection },
subsection / number = { \thesubsection },
subsubsection / number = { ( \roman { subsubsection } ) },
paragraph / number = { ( \alph { paragraph } ) },
subparagraph / number = { ( \arabic { subparagraph } ) }
}
}
}
\cs_new:Npn __xdu_zh_t:nnn #1#2#3
{
\use:c { _xdu #1 family : }
\zihao { \use:c { l__xdu #2 _tl } }
\str_if_eq:ccTF { #3 } { c }
{ \centering }
{ \raggedright }
}
\cs_new:Npn _xdu_en_t:nn #1#2
{
\rmfamily
\zihao { \use:c { l__xdu #1 _tl } }
\bfseries __xdu_bold_math:
\str_if_eq:ccTF { #2 } { c }
{ \centering }
{ \raggedright }
}
\ctex_at_end_preamble:n
{
__xdu_lang_switch:nn
{
__xdu_tl_set_if_empty:Nn \l__xdu_chap_tl { 3 }
__xdu_tl_set_if_empty:Nn \l__xdu_sec_tl { 4 }
__xdu_tl_set_if_empty:Nn \l__xdu_subsec_tl { -4 }
__xdu_tl_set_if_empty:Nn \l__xdu_subsubsec_tl { -4 }
__xdu_tl_set_if_empty:Nn \l__xdu_para_tl { -4 }
__xdu_tl_set_if_empty:Nn \l__xdu_subpara_tl { -4 }
\ctexset
{
chapter / format = { __xdu_zh_t:nnn { sf } { chap } { c } __xdu_bold_math: },
section / format = { __xdu_zh_t:nnn { rm } { sec } { c } },
subsection / format = { __xdu_zh_t:nnn { rm } { subsec } { l } },
subsubsection / format = { __xdu_zh_t:nnn { rm } { subsubsec } { l } },
paragraph / format = { __xdu_zh_t:nnn { rm } { para } { l } },
subparagraph / format = { __xdu_zh_t:nnn { rm } { subpara } { l } }
}
}
{
__xdu_tl_set_if_empty:Nn \l__xdu_chap_tl { 3 }
__xdu_tl_set_if_empty:Nn \l__xdu_sec_tl { 4 }
__xdu_tl_set_if_empty:Nn \l__xdu_subsec_tl { -4 }
__xdu_tl_set_if_empty:Nn \l__xdu_subsubsec_tl { -4 }
__xdu_tl_set_if_empty:Nn \l__xdu_para_tl { -4 }
__xdu_tl_set_if_empty:Nn \l__xdu_subpara_tl { -4 }
\ctexset
{
chapter / format = { __xdu_en_t:nn { chap } { c } },
section / format = { __xdu_en_t:nn { sec } { l } },
subsection / format = { __xdu_en_t:nn { subsec } { l } },
subsubsection / format = { __xdu_en_t:nn { subsubsec } { l } },
paragraph / format = { __xdu_en_t:nn { para } { l } },
subparagraph / format = { __xdu_en_t:nn { subpara } { l } }
}
}
}
\ctexset
{
chapter / fixskip = true,
section / fixskip = true,
subsection / fixskip = true,
subsubsection / fixskip = true,
paragraph / fixskip = true,
subparagraph / fixskip = true,
chapter / beforeskip = { \clist_item:Nn \l__xdu_before_skip_clist { 1 } },
section / beforeskip = { \clist_item:Nn \l__xdu_before_skip_clist { 2 } },
subsection / beforeskip = { \clist_item:Nn \l__xdu_before_skip_clist { 3 } },
subsubsection / beforeskip = { \clist_item:Nn \l__xdu_before_skip_clist { 4 } },
paragraph / beforeskip = { \clist_item:Nn \l__xdu_before_skip_clist { 5 } },
subparagraph / beforeskip = { \clist_item:Nn \l__xdu_before_skip_clist { 6 } },
chapter / afterskip = { \clist_item:Nn \l__xdu_after_skip_clist { 1 } },
section / afterskip = { \clist_item:Nn \l__xdu_after_skip_clist { 2 } },
subsection / afterskip = { \clist_item:Nn \l__xdu_after_skip_clist { 3 } },
subsubsection / afterskip = { \clist_item:Nn \l__xdu_after_skip_clist { 4 } },
paragraph / afterskip = { \clist_item:Nn \l__xdu_after_skip_clist { 5 } },
subparagraph / afterskip = { \clist_item:Nn \l__xdu_after_skip_clist { 6 } }
}
\PassOptionsToPackage { titles } { tocloft }
\RequirePackage { tocloft }
\cs_set:Npn \cftchapleader { \bfseries \cftdotfill { \cftdotsep } }
\dim_set_eq:NN \cftbeforechapskip \cftbeforesecskip
\clist_map_inline:nn
{
\cftchapfont,
\cftchappagefont
}
{ \renewcommand { #1 } { __xdu_rm_family: \zihao { -4 } \bfseries __xdu_bold_math: } }
\clist_map_inline:nn
{
\cftsecfont,
\cftsubsecfont,
\cftsubsubsecfont,
\cftparafont,
\cftsubparafont,
\cftsecpagefont,
\cftsubsecpagefont,
\cftsubsubsecpagefont,
\cftparapagefont,
\cftsubparapagefont
}
{ \renewcommand { #1 } { __xdu_rm_family: \zihao { -4 } } }
\ctex_at_end_preamble:n
{
\seq_if_empty:NF \l__xdu_search_path_clist
{
\clist_map_inline:Nn \l__xdu_search_path_clist
{ \seq_put_right:Nn \l_file_search_path_seq { #1 } }
}
\bool_if:NT \l__xdu_fix_input_bool
{
\cs_new_eq:NN __xdu_org_input:n \input
\RenewDocumentCommand { \input } { m }
{ __xdu_org_input:n { ./ #1 } }
}
\bool_if:NT \l__xdu_fix_include_bool
{
\cs_new_eq:NN __xdu_org_include:n \include
\RenewDocumentCommand { \include } { m }
{ __xdu_org_include:n { ./ #1 } }
}
\bool_if:NT \l__xdu_fix_graphics_bool
{
\cs_new_eq:NN __xdu_org_includegraphics:n \includegraphics
\RenewDocumentCommand { \includegraphics } { o m }
{
\IfNoValueTF { #1 }
{ __xdu_org_includegraphics:n { ./ #2 } }
{ __xdu_org_includegraphics:n [ #1 ] { ./ #2 } }
}
}
}
\renewcommand { \theequation } { \thechapter - \arabic { equation } }
\cs_set:Npn \topfraction { .8 }
\cs_set:Npn \floatpagefraction { .8 }
\ctex_at_end_preamble:n
{
\clist_map_inline:nn
{
{ \algorithmname },
{ \ALG@name },
{ \algorithmcfname }
}
{ \cs_set:Npn #1 { __xdu_lang_switch:nn { 算法 } { Algorithm } } }
}
\PassOptionsToPackage { chapter } { algorithm }
\ctex_at_end_preamble:n
{
@ifpackageloaded { algorithm }
{
\cs_if_exist:NT \thealgorithm
{
\floatplacement { algorithm } { tbp }
\cs_set:Npn \thealgorithm { \thechapter . \arabic { algorithm } }
\bool_if:NT \l__xdu_alg_small_bool
{
\renewenvironment { algorithm }
{
@nameuse { fst@algorithm }
@float@setevery { algorithm }
\ctex_gadd_ltxhook:nn
{ cmd/@floatboxreset/after }
{ \zihao { 5 } }
@float { algorithm }
}
{ \float@end }
}
}
}
{ }
}
\PassOptionsToPackage { algochapter } { algorithm2e }
\ctex_at_end_preamble:n
{
@ifpackageloaded { algorithm2e }
{
\cs_if_exist:NT \thealgocf
{
\cs_set:Npn \thealgocf { \thechapter . \arabic { algocf } }
\renewenvironment { \algocf@envname } [ 1 ] [ tbp ]
{
\setboolean { algocf@algostar } { false }
\setboolean { algocf@procenvironment } { false }
\gdef \algocfautorefname { \algorithmautorefname }
\begin { algocf@algorithm } [ #1 ] \ignorespaces
}
{ \end { algocf@algorithm } \ignorespacesafterend }
\bool_if:NT \l__xdu_alg_small_bool
{ \SetAlFnt { \zihao { 5 } } }
}
}
{ }
}
\PassOptionsToPackage { ruled } { caption }
\RequirePackage { caption }
\DeclareCaptionLabelSeparator { customskip } { \hskip \l__xdu_cap_label_sep_tl }
\DeclareCaptionFont { customfont } { __xdu_rm_family: \zihao { 5 } }
\captionsetup
{
strut = off,
labelsep = customskip,
font = customfont
}
\captionsetup [ subfigure ] { strut = on, skip = 0pt }
\captionsetup [ subtable ] { strut = on, skip = 0pt }
\dim_set_eq:NN \intextsep \abovecaptionskip
\ctex_at_end_preamble:n
{
\tl_if_eq:NnTF \l__xdu_ft_cap_format_tl { hang }
{ \captionsetup { format = hang } }
{ \captionsetup { format = plain } }
\tl_if_eq:NnTF \l__xdu_ft_cap_align_tl { left }
{ \captionsetup { singlelinecheck = false, justification = justified } }
{
\tl_if_eq:NnTF \l__xdu_ft_cap_align_tl { centering }
{ \captionsetup { singlelinecheck = false, justification = centerlast } }
{ \captionsetup { singlelinecheck = true, justification = justified } }
}
}
\DeclareCaptionFont { algcustomfont }
{
__xdu_rm_family:
\bool_if:NTF \l__xdu_alg_small_cap_bool
{ \zihao { 5 } }
{ \zihao { -4 } }
}
\captionsetup* [ algorithm ]
{
labelsep = customskip,
labelfont = algcustomfont,
font = algcustomfont
}
\ctex_at_end_preamble:n
{
\tl_if_eq:NnTF \l__xdu_alg_cap_format_tl { hang }
{ \captionsetup* [ algorithm ] { format = hang } }
{ \captionsetup* [ algorithm ] { format = plain } }
\captionsetup* [ ruled ] { strut = off }
\tl_if_eq:NnTF \l__xdu_alg_cap_align_tl { left }
{
\captionsetup* [ algorithm ]
{ singlelinecheck = false, justification = justified }
}
{
\tl_if_eq:NnTF \l__xdu_alg_cap_align_tl { centering }
{
\captionsetup* [ algorithm ]
{ singlelinecheck = false, justification = centerlast }
}
{
\captionsetup* [ ruled ] { singlelinecheck = true }
\captionsetup* [ algorithm ] { justification = justified }
}
}
}
\ctex_at_end_preamble:n
{
\bool_if:NT \l__xdu_add_alg_rule_vspace_bool
{
@ifpackageloaded { algorithm }
{
\cs_set:Npn \fs@ruled
{
\cs_set_eq:NN @fs@capt \floatc@plain
\cs_set:Npn @fs@pre { \hrule height .8pt depth 0pt \kern 5pt }
\cs_set:Npn @fs@post { \kern 5pt \hrule \relax }
\cs_set:Npn @fs@mid { \kern 5pt \hrule \kern 5pt }
\cs_set_eq:NN @fs@iftopcapt \iftrue
}
}
{ }
}
}
\ctex_at_end_preamble:n
{
@ifpackageloaded { algorithm2e }
{
\SetAlgoCaptionSeparator { \hbox_to_wd:nn { \l__xdu_cap_label_sep_tl } { } }
\bool_if:NTF \l__xdu_alg_small_cap_bool
{
\SetAlCapNameFnt { __xdu_rm_family: \zihao { 5 } }
\SetAlCapFnt { __xdu_rm_family: \zihao { 5 } }
}
{
\SetAlCapNameFnt { __xdu_rm_family: \zihao { -4 } }
\SetAlCapFnt { __xdu_rm_family: \zihao { -4 } }
}
\SetAlCapSty { }
\RenewDocumentCommand { \algocf@makecaption } { mm }
{
\box_clear_new:N \l__xdu_algiie_capt_box
\hbox_set:Nn \l__xdu_algiie_capt_box
{ \AlCapFnt #1 \algocf@capseparator \AlCapNameFnt #2 }
\dim_compare:nNnTF { \box_wd:N \l__xdu_algiie_capt_box } > { \hsize }
{
\tl_if_eq:NnTF \l__xdu_alg_cap_format_tl { hang }
{
\tl_if_eq:NnTF \l__xdu_alg_cap_align_tl { centering }
{
\makebox { \AlCapFnt #1 \algocf@capseparator }
\makebox
{
\parbox [ t ] { \hsize }
{ \centering \AlCapNameFnt #2 }
}
}
{
\makebox { \AlCapFnt #1 \algocf@capseparator }
\makebox { \parbox [ t ] { \hsize } { \AlCapNameFnt #2 } }
}
}
{
\tl_if_eq:NnTF \l__xdu_alg_cap_align_tl { centering }
{
\parbox { \columnwidth }
{ \centering \AlCapFnt #1 \algocf@capseparator \AlCapNameFnt #2 }
}
{
\parbox { \columnwidth }
{ \AlCapFnt #1 \algocf@capseparator \AlCapNameFnt #2 }
}
}
}
{
\tl_if_eq:NnTF \l__xdu_alg_cap_align_tl { left }
{
\parbox { \columnwidth }
{ \AlCapFnt #1 \algocf@capseparator \AlCapNameFnt #2 }
}
{
\parbox { \columnwidth }
{ \centering \AlCapFnt #1 \algocf@capseparator \AlCapNameFnt #2 }
}
}
}
\RenewDocumentCommand { \algocf@makecaption@ruled } { mm }
{ \global \sbox \algocf@capbox { \algocf@makecaption { #1 } { #2 } } }
\RenewDocumentCommand { \algocf@makecaption@boxed } { mm }
{ \global \sbox \algocf@capbox { \algocf@makecaption { #1 } { #2 } } }
}
{ }
}
\ctex_at_end_preamble:n
{
\bool_if:NT \l__xdu_add_alg_rule_vspace_bool
{
@ifpackageloaded { algorithm2e }
{
\dim_set:Nn \interspacetitleruled { 5pt }
\dim_set:Nn \interspacealgoruled { 5pt }
}
{ }
}
}
\cs_new:Npn __xdu_tblr_caption_box:n #1
{ \makebox [ \tablewidth ] { \parbox { \columnwidth } { #1 } } }
\ctex_at_end_preamble:n
{
@ifpackageloaded { tabularray }
{
\SetTblrOuter [ tblr, longtblr, talltblr ]
{ presep = \belowcaptionskip + \intextsep, headsep = \abovecaptionskip }
\SetTblrStyle { head } { font = __xdu_rm_family: \zihao { 5 } }
\DefTblrTemplate { caption-sep } { default }
{ \hskip \l__xdu_cap_label_sep_tl }
\tl_if_eq:NnTF \l__xdu_cap_format_tl { hang }
{
\DefTblrTemplate { firsthead } { default }
{ __xdu_tblr_caption_box:n { \UseTblrTemplate { caption } { default } } }
\DefTblrTemplate { middlehead, lasthead } { default }
{ __xdu_tblr_caption_box:n { \UseTblrTemplate { capcont } { default } } }
}
{
\DefTblrTemplate { firsthead } { default }
{ __xdu_tblr_caption_box:n { \UseTblrTemplate { caption } { plain } } }
\DefTblrTemplate { middlehead, lasthead } { default }
{ __xdu_tblr_caption_box:n { \UseTblrTemplate { capcont } { plain } } }
}
\DefTblrTemplate { firstfoot, middlefoot } { default }
{ __xdu_tblr_caption_box:n { \UseTblrTemplate { contfoot } { default } } }
\DefTblrTemplate { lastfoot } { default }
{
__xdu_tblr_caption_box:n
{
\UseTblrTemplate { note } { default }
\UseTblrTemplate { remark } { default }
}
}
\DefTblrTemplate { conthead-text } { default }
{ __xdu_lang_switch:nn { (续表) } { (Continued) } }
\DefTblrTemplate { contfoot-text } { default }
{ __xdu_lang_switch:nn { 接下页 } { Continuedonnextpage } }
}
{ }
}
\ctex_at_end_preamble:n
{
\tl_if_eq:NnTF \l__xdu_figure_align_tl { left }
{
\AtBeginEnvironment { figure }
{ \g@addto@macro { @floatboxreset } { \raggedright } }
}
{
\tl_if_eq:NnTF \l__xdu_figure_align_tl { centering }
{
\AtBeginEnvironment { figure }
{ \g@addto@macro { @floatboxreset } { \centering } }
}
{
\AtBeginEnvironment { figure }
{ \g@addto@macro { @floatboxreset } { \raggedleft } }
}
}
}
\PassOptionsToPackage { font = small } { subfig }
\captionsetup* [ sub ] { font = customfont }
\ctex_at_end_preamble:n
{
@ifpackageloaded { subfig }
{ \captionsetup [ subfloat ] { subrefformat = parens } }
{ }
}
\PassOptionsToPackage { labelformat = simple } { subcaption }
\ctex_at_end_preamble:n
{
@ifpackageloaded { subcaption }
{
\cs_set:Npn \thesubfigure { ( \alph { subfigure } ) }
\cs_set:Npn \thesubtable { ( \alph { subtable } ) }
}
{ }
}
\ctex_at_end_preamble:n
{
\tl_if_eq:NnTF \l__xdu_table_align_tl { left }
{
\AtBeginEnvironment { table }
{ \g@addto@macro { @floatboxreset } { \raggedright } }
}
{
\tl_if_eq:NnTF \l__xdu_table_align_tl { centering }
{
\AtBeginEnvironment { table }
{ \g@addto@macro { @floatboxreset } { \centering } }
}
{
\AtBeginEnvironment { table }
{ \g@addto@macro { @floatboxreset } { \raggedleft } }
}
}
}
\ctex_at_end_preamble:n
{
\bool_if:NT \l__xdu_tab_small_bool
{
\AtBeginEnvironment { table }
{ \g@addto@macro { @floatboxreset } { \small } }
}
}
\ctex_at_end_preamble:n
{
@ifpackageloaded { longtable }
{
\bool_if:NT \l__xdu_tab_small_bool
{
\ctex_gadd_ltxhook:nn
{ env/longtable/begin }
{ \small }
}
}
{ }
}
\ctex_at_end_preamble:n
{
@ifpackageloaded { tabularray }
{
\bool_if:NT \l__xdu_tab_small_bool
{
\ctex_gadd_ltxhook:nn
{ env/tblr/begin }
{ \small }
\ctex_gadd_ltxhook:nn
{ env/longtblr/begin }
{ \small }
}
}
{ }
}
\RequirePackage { hyperref }
\hypersetup
{
bookmarksnumbered,
hidelinks
}
\ctex_at_end_preamble:n
{
\hypersetup
{
pdftitle = \l__xdu_pure_title_tl,
pdfsubject = { 西安电子科技大学本科毕业设计论文 },
pdfcreator = { XeLaTeXwithxduugthesisclassin~XDUTS },
pdfauthor = \l__xdu_author_str
}
}
\ctex_at_end_preamble:n
{
\bool_if:NT \l__xdu_ref_add_space_bool
{
\str_if_eq:NNT { \l__xdu_lang_tl } { zh }
{
\RequirePackage { xspace }
\xspaceaddexceptions { 。?!,、;:“”‘’—….--~·《》<>_ }
\cs_generate_variant:Nn \str_if_in:nnTF { xnTF }
\ctex_after_end_preamble:n
{
\cs_set_eq:NN __xdu_trad_ref:n \ref
\cs_set:Npn \ref #1
{
\str_if_in:xnTF { __hyp_get_anchor:n { #1 } } { chapter }
{ __xdu_trad_ref:n { #1 } }
{ \xspace __xdu_trad_ref:n { #1 } \xspace }
}
\cs_set_eq:NN __xdu_trad_page_ref:n \pageref
\cs_set:Npn \pageref #1
{ \xspace __xdu_trad_page_ref:n { #1 } \xspace }
}
}
}
}
\cs_new_protected:Npn __xdu_begin_document:n #1
{ \ctex_gadd_ltxhook:nn { env/document/begin } { #1 } }
\PassOptionsToPackage { sort&compress } { gbt7714 }
\PassOptionsToPackage { style = gb7714-2015 } { biblatex }
__xdu_begin_document:n
{
\tl_if_eq:NnTF \l__xdu_bib_tool_tl { bibtex }
{
\RequirePackage { gbt7714 }
\bibliographystyle { gbt7714-numerical }
\cs_set:Npn @biblabel #1 { \hfill [ #1 ] }
\cs_set:Npn \bibsection { }
\dim_set:Nn \bibsep { 0pt }
\NewDocumentCommand \parencite { m }
{ \group_begin: \citestyle { numbers } \cite { #1 } \group_end: }
}
{
\PassOptionsToPackage { \l__xdu_biblatex_option_tl } { biblatex }
\RequirePackage { biblatex }
\clist_map_inline:Nn \l__xdu_bib_file_clist { \addbibresource { #1 } }
\defbibheading { bibliography } [ ] { }
\dim_set:Nn \biblabelsep { 1ex }
\dim_set:Nn \bibitemsep { 0pt }
\cs_set_eq:NN \SlashFont \rmfamily
}
\cs_set:Npn \bibfont
{
__xdu_rm_family:
\zihao { 5 }
}
}
\cs_new:Npn __xdu_appendix:
{
\cs_set:Npn \appendixname { __xdu_lang_switch:nn { 附录 } { Appendix } }
\tl_set_eq:NN \l__xdu_chaptername \appendixname
\cs_set_eq:NN __xdu_Roman: __xdu_Alph:
\appendix
\renewcommand { \thefigure } { \thechapter \arabic { figure } }
\renewcommand { \thetable } { \thechapter \arabic { table } }
\cs_if_exist:NT \thealgorithm
{ \cs_set:Npn \thealgorithm { \thechapter \arabic { algorithm } } }
\cs_if_exist:NT \thealgocf
{ \cs_set:Npn \thealgocf { \thechapter \arabic { algocf } } }
\bool_if_exist:NTF \l__xdu_rm_appendix_bool
{
\bool_if:NF \l__xdu_rm_appendix_bool
{
\clist_map_inline:Nn \l__xdu_appendix_clist
{ \file_if_exist_input:n { ##1 } }
}
}
{
\clist_map_inline:Nn \l__xdu_appendix_clist
{ \file_if_exist_input:n { ##1 } }
}
}
\cs_new:Npn __xdu_cover_i:nn #1#2
{
\vbox_to_ht:nn { 12pt }
{
\mode_leave_vertical:
\hfill
\hbox:n
{
__xdu_rm_family: \zihao { -4 } \bfseries
\hbox_to_wd:nn { 3em } { #1 }
\skip_horizontal:n { 1em }
__xdu_uline:n { \hbox_to_wd:nn { 15ex } { \hfil #2 \hfil } }
\skip_horizontal:n { 1.5cm }
}
}
}
\cs_new:Npn __xdu_cover_ii:nnn #1#2#3
{
\vbox_to_ht:nn { #1 }
{
\mode_leave_vertical:
\hfil
\file_if_exist:nT { xdulogo.pdf }
{
\str_if_eq:nnTF { #3 } { text }
{ \includegraphics [ page = 1, height = #2 ] { xdulogo.pdf } }
{ \includegraphics [ page = 2, height = #2 ] { xdulogo.pdf } }
}
\hfil
}
}
\cs_new:Npn __xdu_cover_iii:nnnnn #1#2#3#4#5
{
\vbox_to_ht:nn { 42.5pt }
{
\vfill
\mode_leave_vertical:
\hfil
\hbox:n
{
__xdu_rm_family:
\zihao { 3 }
\hbox_to_wd:nn { #1 } { \bfseries #2 }
\skip_horizontal:n { 1em }
\zihao { -3 }
__xdu_uline:n
{
\hbox_to_wd:nn { 16em }
{ \hfil \use:c { _xdu #3 _family : } \zihao { #4 } #5 \hfil }
}
}
\hfil
}
}
\bool_new:N \l__xdu_is_ent_bool
\bool_new:N \l__xdu_is_wide_bool
\ctex_at_end_preamble:n
{
\tl_if_blank:VF \l__xdu_supv_dept_str
{ \bool_set_true:N \l__xdu_is_wide_bool }
\tl_if_blank:VF \l__xdu_supv_ent_str
{ \bool_set_true:N \l__xdu_is_wide_bool }
\tl_if_blank:VF \l__xdu_supv_sch_str
{ \bool_set_true:N \l__xdu_is_wide_bool }
\cs_new:Npn __xdu_cover_iii:nnnn #1#2#3#4
{
\bool_if:NTF \l__xdu_is_wide_bool
{ __xdu_cover_iii:nnnnn { 6em } { #1 } { #2 } { #3 } { #4 } }
{ __xdu_cover_iii:nnnnn { 4em } { #1 } { #2 } { #3 } { #4 } }
}
}
\RenewDocumentCommand { \frontmatter } { } { }
\cs_new:Npn __xdu_frontmatter:
{
\loadgeometry { cover }
\pagestyle { empty }
\dim_set:Nn \parindent { 0pt }
__xdu_cover_i:nn { 班级 } { \l__xdu_class_id_str }
__xdu_cover_i:nn { 学号 } { \l__xdu_student_id_str }
\skip_vertical:n { 30pt }
__xdu_cover_ii:nnn { 65pt } { 35pt } { text }
\vbox_to_ht:nn { 90pt }
{
\mode_leave_vertical:
\hfil
\hbox_to_wd:nn { 375pt } { \sffamily \zihao { 0 } 本科毕业设计论文 }
\hfil
}
__xdu_cover_ii:nnn { 140pt } { 120pt } { icon }
\clist_new:N \l__xdu_title_clist
__xdu_split_title:NV \l__xdu_title_clist \l__xdu_title_tl
\tl_set:Nx \l__xdu_title_i_tl { \clist_item:Nn \l__xdu_title_clist { 1 } }
\tl_set:Nx \l__xdu_title_ii_tl { \clist_item:Nn \l__xdu_title_clist { 2 } }
__xdu_cover_iii:nnnn { 题目 } { sf } { 3 } { __xdu_bold_math: \l__xdu_title_i_tl }
\tl_if_blank:VF \l__xdu_title_ii_tl
{ __xdu_cover_iii:nnnn { } { sf } { 3 } { __xdu_bold_math: \l__xdu_title_ii_tl } }
__xdu_cover_iii:nnnn { 学院 } { rm } { -3 } { \l__xdu_dept_str }
__xdu_cover_iii:nnnn { 专业 } { rm } { -3 } { \l__xdu_major_str }
__xdu_cover_iii:nnnn { 学生姓名 } { rm } { -3 } { \l__xdu_author_str }
\tl_if_blank:VF \l__xdu_supv_ent_str
{ \bool_set_true:N \l__xdu_is_ent_bool }
\tl_if_blank:VF \l__xdu_supv_sch_str
{ \bool_set_true:N \l__xdu_is_ent_bool }
\bool_if:NTF \l__xdu_is_ent_bool
{
__xdu_cover_iii:nnnn { 校外导师姓名 } { rm } { -3 } { \l__xdu_supv_ent_str }
__xdu_cover_iii:nnnn { 校内导师姓名 } { rm } { -3 } { \l__xdu_supv_sch_str }
}
{
__xdu_cover_iii:nnnn { 导师姓名 } { rm } { -3 } { \l__xdu_supv_str }
\tl_if_blank:VF \l__xdu_supv_dept_str
{
__xdu_cover_iii:nnnn
{ 院内导师姓名 }
{ rm }
{ -3 }
{ \l__xdu_supv_dept_str }
}
}
\cleardoublepage
\fancypagestyle{abstractzh}{
\fancyhf{}
\fancyhead[CE,CO]{__xdu_rm_family:\zihao{5}摘要}
\fancyhead[LE,RO]{__xdu_rm_family:\zihao{-5}\thepage}
\renewcommand{\headrulewidth}{0.75pt}
}
\fancypagestyle{abstracten}{
\fancyhf{}
\fancyhead[CE,CO]{__xdu_rm_family:\zihao{5}ABSTRACT}
\fancyhead[LE,RO]{__xdu_rm_family:\zihao{-5}\thepage}
\renewcommand{\headrulewidth}{0.75pt}
}
\fancypagestyle{tocstyle}{
\fancyhf{}
\fancyhead[CE,CO]{__xdu_lang_switch:nn { 目录 } { Contents }}%
\fancyhead[LE,RO]{__xdu_rm_family:\zihao{-5}\thepage} \renewcommand{\headrulewidth}{0.75pt} } __xdu_load_main_geometry:
\pagenumbering { roman }
\__xdu_lang_switch:nn
{ \__xdu_n_chapter_head:nn { 摘要 } { 摘 { \quad } 要 } }
{
\__xdu_n_chapter_head_ii:nnn
{ 摘要 }
{ 摘 { \quad } 要 }
{ \__xdu_sf_family: \zihao { 3 } \centering }
}
\group_begin:
\dim_set:Nn \parindent { 2 \ccwd }
\rmfamily \zihao { -4 }
\file_if_exist_input:n { \l__xdu_abstract_zh_tl }
\group_end:
\cs_new:Npn \__xdu_keywords_space: { \hspace { 2em plus 1em minus 1em } }
\group_begin:
\sffamily \__xdu_bold_math: \zihao { -4 } \par
\__xdu_typeout_keywords:nNn
{ 关键词:} { \l__xdu_keywords_zh_clist } { \__xdu_keywords_space: }
\clearpage
\thispagestyle{abstractzh}
\group_end:
\__xdu_n_chapter_head_ii:nn
{ ABSTRACT } { \rmfamily \zihao { 3 } \bfseries \centering }
\thispagestyle{abstracten}
\pagestyle{abstracten}
\group_begin:
\dim_set:Nn \parindent { 2 \ccwd }
\rmfamily \zihao { -4 }
\file_if_exist_input:n { \l__xdu_abstract_en_tl }
\group_end:
\group_begin:
\rmfamily \zihao { -4 } \bfseries \__xdu_bold_math: \par
\__xdu_typeout_keywords:nNn
{ Keywords:\enspace} { \l__xdu_keywords_en_clist } { \__xdu_keywords_space: }
\group_end:
\cleardoublepage
\pagestyle{plain}
\setcounter { tocdepth } { 5 }
\__xdu_n_chapter_head:nn
{ \__xdu_lang_switch:nn { 目录 } { Contents } }
{ \__xdu_lang_switch:nn { 目 { \quad } 录 } { Contents } }
\pagestyle{tocstyle}
\@starttoc { toc }
\cleardoublepage
\pagestyle{plain}
} \RenewDocumentCommand { \mainmatter } { } { } \cs_new:Npn __xdu_mainmatter: { __xdu_load_main_geometry: \pagestyle { plain } \pagenumbering { arabic } \dim_set:Nn \parindent { 2 \ccwd } \rmfamily \zihao { -4 } } \RenewDocumentCommand { \backmatter } { } { } \cs_new:Npn __xdu_backmatter: { __xdu_n_chapter_head_toc:nn { __xdu_lang_switch:nn { 致谢 } { Acknowledgements } } { __xdu_lang_switch:nn { 致 { \quad } 谢 } { Acknowledgements } } \group_begin: \dim_set:Nn \parindent { 2 \ccwd } \rmfamily \zihao { -4 } \file_if_exist_input:n { \l__xdu_ack_tl } \group_end: \cs_set:Npn \bibname { __xdu_lang_switch:nn { 参考文献 } { Bibliography } } __xdu_n_chapter_head_toc:n { \bibname } \group_begin: \tl_if_eq:NnTF \l__xdu_bib_tool_tl { bibtex } { \dim_set:Nn \labelsep { 1ex } \bibliography { \l__xdu_bib_file_clist } } { \printbibliography } \group_end: __xdu_appendix: } \ctex_after_end_preamble:n { __xdu_frontmatter: __xdu_mainmatter: } \AtEndDocument { __xdu_backmatter: } %% %% %% End of file `xduugthesis.cls'.