<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
%
% Copyright (C) SJTUG
%   2018--2025 Weijian Wu   &lt;alexarawu@outlook.com&gt;
%   2022--2025 Zilong Li    &lt;logcreative@outlook.com&gt;
%   2024--2025 Boshi Yuan   &lt;nemoyuan2008@outlook.com&gt;
%
% 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.3 or later is part of all distributions of
% LaTeX version 2005/12/01 or later.
%
%&lt;*internal&gt;
\iffalse
%&lt;/internal&gt;
%
%&lt;*internal&gt;
\fi
\begingroup
  \def\NameOfLaTeXe{LaTeX2e}
\expandafter\endgroup\ifx\NameOfLaTeXe\fmtname\else
\csname fi\endcsname
%&lt;/internal&gt;
%
%&lt;*install&gt;
\input ctxdocstrip.tex
\keepsilent
\askforoverwritefalse

\preamble

    Copyright (C) SJTUG
      2018--2025 Weijian Wu   &lt;alexarawu@outlook.com&gt;
      2022--2025 Zilong Li    &lt;logcreative@outlook.com&gt;
      2024--2025 Boshi Yuan   &lt;nemoyuan2008@outlook.com&gt;

    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.3 or later is part of all distributions of
    LaTeX version 2005/12/01 or later.

\endpreamble

\generate{
  \usedir{tex/latex/sjtutex}
    \file{sjtuthesis.cls}               {\from{\jobname.dtx}{class,thesis}}
    \file{sjtureport.cls}               {\from{\jobname.dtx}{class,report}}
    \file{sjtuarticle.cls}              {\from{\jobname.dtx}{class,article}}
    \file{sjtu-lang-zh.def}             {\from{\jobname.dtx}{lang,zh}}
    \file{sjtu-lang-en.def}             {\from{\jobname.dtx}{lang,en}}
    \file{sjtu-lang-de.def}             {\from{\jobname.dtx}{lang,de}}
    \file{sjtu-lang-ja.def}             {\from{\jobname.dtx}{lang,ja}}
    \file{sjtu-scheme-zh.def}           {\from{\jobname.dtx}{scheme,zh}}
    \file{sjtu-scheme-en.def}           {\from{\jobname.dtx}{scheme,en}}
    \file{sjtu-scheme-de.def}           {\from{\jobname.dtx}{scheme,de}}
    \file{sjtu-scheme-ja.def}           {\from{\jobname.dtx}{scheme,ja}}
    \file{sjtu-thesis-zh.def}           {\from{\jobname.dtx}{thesis-i18n,zh}}
    \file{sjtu-thesis-en.def}           {\from{\jobname.dtx}{thesis-i18n,en}}
    \file{sjtu-thesis-de.def}           {\from{\jobname.dtx}{thesis-i18n,de}}
    \file{sjtu-thesis-ja.def}           {\from{\jobname.dtx}{thesis-i18n,ja}}
    \file{sjtu-text-font-newtx.def}     {\from{\jobname.dtx}{font,text,type1,newtx}}
    \file{sjtu-text-font-newpx.def}     {\from{\jobname.dtx}{font,text,type1,newpx}}
    \file{sjtu-text-font-lm.def}        {\from{\jobname.dtx}{font,text,type1,lm}}
    \file{sjtu-text-font-times.def}     {\from{\jobname.dtx}{font,text,type1,times}}
    \file{sjtu-text-font-libertinus.def}{\from{\jobname.dtx}{font,text,libertinus}}
    \file{sjtu-text-font-stixtwo.def}   {\from{\jobname.dtx}{font,text,stixtwo}}
    \file{sjtu-text-font-cambria.def}   {\from{\jobname.dtx}{font,text,otf,cambria}}
    \file{sjtu-text-font-newcm.def}     {\from{\jobname.dtx}{font,text,otf,newcm}}
    \file{sjtu-text-font-xits.def}      {\from{\jobname.dtx}{font,text,otf,xits}}
    \file{sjtu-math-font-newtx.def}     {\from{\jobname.dtx}{font,math,type1,newtx}}
    \file{sjtu-math-font-newpx.def}     {\from{\jobname.dtx}{font,math,type1,newpx}}
    \file{sjtu-math-font-lm.def}        {\from{\jobname.dtx}{font,math,type1,lm}}
    \file{sjtu-math-font-times.def}     {\from{\jobname.dtx}{font,math,type1,times}}
    \file{sjtu-math-font-libertinus.def}{\from{\jobname.dtx}{font,math,libertinus}}
    \file{sjtu-math-font-stixtwo.def}   {\from{\jobname.dtx}{font,math,stixtwo}}
    \file{sjtu-math-font-cambria.def}   {\from{\jobname.dtx}{font,math,otf,cambria}}
    \file{sjtu-math-font-newcm.def}     {\from{\jobname.dtx}{font,math,otf,newcm}}
    \file{sjtu-math-font-xits.def}      {\from{\jobname.dtx}{font,math,otf,xits}}
    \file{sjtu-cjk-font-windows.def}    {\from{\jobname.dtx}{font,cjk,windows}}
    \file{sjtu-cjk-font-mac.def}        {\from{\jobname.dtx}{font,cjk,mac}}
    \file{sjtu-cjk-font-ubuntu.def}     {\from{\jobname.dtx}{font,cjk,ubuntu}}
    \file{sjtu-cjk-font-adobe.def}      {\from{\jobname.dtx}{font,cjk,adobe}}
    \file{sjtu-cjk-font-fandol.def}     {\from{\jobname.dtx}{font,cjk,fandol}}
    \file{sjtu-cjk-font-founder.def}    {\from{\jobname.dtx}{font,cjk,founder}}
    \file{sjtu-cjk-font-hanyi.def}      {\from{\jobname.dtx}{font,cjk,hanyi}}
%&lt;/install&gt;
%&lt;*internal&gt;
  \usedir{source/latex/sjtutex}
    \file{\jobname.ins}                 {\from{\jobname.dtx}{install}}
%&lt;/internal&gt;
%&lt;*install&gt;
}

\obeyspaces
\Msg{*************************************************************}
\Msg{*                                                           *}
\Msg{* To finish the installation you have to move the following *}
\Msg{* files into a directory searched by TeX:                   *}
\Msg{*                                                           *}
\Msg{* The recommended directory is TDS:tex/latex/sjtutex        *}
\Msg{*                                                           *}
\Msg{*     sjtuthesis.cls                                        *}
\Msg{*     sjtureport.cls                                        *}
\Msg{*     sjtuarticle.cls                                       *}
\Msg{*     sjtu-lang-de.def                                      *}
\Msg{*     sjtu-lang-en.def                                      *}
\Msg{*     sjtu-lang-ja.def                                      *}
\Msg{*     sjtu-lang-zh.def                                      *}
\Msg{*     sjtu-scheme-de.def                                    *}
\Msg{*     sjtu-scheme-en.def                                    *}
\Msg{*     sjtu-scheme-ja.def                                    *}
\Msg{*     sjtu-scheme-zh.def                                    *}
\Msg{*     sjtu-thesis-de.def                                    *}
\Msg{*     sjtu-thesis-en.def                                    *}
\Msg{*     sjtu-thesis-ja.def                                    *}
\Msg{*     sjtu-thesis-zh.def                                    *}
\Msg{*     sjtu-text-font-cambria.def                            *}
\Msg{*     sjtu-text-font-libertinus.def                         *}
\Msg{*     sjtu-text-font-lm.def                                 *}
\Msg{*     sjtu-text-font-newcm.def                              *}
\Msg{*     sjtu-text-font-newpx.def                              *}
\Msg{*     sjtu-text-font-newtx.def                              *}
\Msg{*     sjtu-text-font-stixtwo.def                            *}
\Msg{*     sjtu-text-font-times.def                              *}
\Msg{*     sjtu-text-font-xits.def                               *}
\Msg{*     sjtu-math-font-cambria.def                            *}
\Msg{*     sjtu-math-font-libertinus.def                         *}
\Msg{*     sjtu-math-font-lm.def                                 *}
\Msg{*     sjtu-math-font-newcm.def                              *}
\Msg{*     sjtu-math-font-newpx.def                              *}
\Msg{*     sjtu-math-font-newtx.def                              *}
\Msg{*     sjtu-math-font-stixtwo.def                            *}
\Msg{*     sjtu-math-font-times.def                              *}
\Msg{*     sjtu-math-font-xits.def                               *}
\Msg{*     sjtu-cjk-font-adobe.def                               *}
\Msg{*     sjtu-cjk-font-fandol.def                              *}
\Msg{*     sjtu-cjk-font-founder.def                             *}
\Msg{*     sjtu-cjk-font-hanyi.def                               *}
\Msg{*     sjtu-cjk-font-mac.def                                 *}
\Msg{*     sjtu-cjk-font-ubuntu.def                              *}
\Msg{*     sjtu-cjk-font-windows.def                             *}
\Msg{*     sjtu-vi-badge-cor-red.pdf                             *}
\Msg{*     sjtu-vi-badge-reg-red.pdf                             *}
\Msg{*     sjtu-vi-logo-eng-h-cor-red.pdf                        *}
\Msg{*     sjtu-vi-logo-eng-h-reg-red.pdf                        *}
\Msg{*     sjtu-vi-logo-std-c-cor-red.pdf                        *}
\Msg{*     sjtu-vi-logo-std-c-reg-red.pdf                        *}
\Msg{*     sjtu-vi-logo-std-h-cor-red.pdf                        *}
\Msg{*     sjtu-vi-logo-std-h-reg-red.pdf                        *}
\Msg{*     sjtu-vi-logo-std-v-cor-red.pdf                        *}
\Msg{*     sjtu-vi-logo-std-v-reg-red.pdf                        *}
\Msg{*                                                           *}
\Msg{* To produce the documentation, run the file sjtutex.dtx    *}
\Msg{* through XeLaTeX.                                          *}
\Msg{*                                                           *}
\Msg{* Happy TeXing!                                             *}
\Msg{*                                                           *}
\Msg{*************************************************************}

\endbatchfile
%&lt;/install&gt;
%
%&lt;*internal&gt;
\fi
%&lt;/internal&gt;
%
%&lt;*class&gt;
\NeedsTeXFormat{LaTeX2e}[2024-06-01]
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\IfFormatAtLeastTF{2024-06-01}{}
 {\PackageError{sjtutex}
   {Your LaTeX format is outdated!\MessageBreak\MessageBreak
    Release '2024-06-01' or newer is required to\MessageBreak
    compile this document.\MessageBreak\MessageBreak
    Please update your TeX distribution}{}}
%&lt;/class&gt;
%&lt;*!(driver|install)&gt;
%&lt;+!driver&gt;\GetIdInfo$Id: sjtutex.dtx 24e1ee7 2025-03-29 01:12:32 +0800 Alexara Wu &lt;alexarawu@outlook.com&gt; $
%&lt;class&amp;thesis&gt;  {Thesis document class for Shanghai Jiao Tong University (SJTUTeX)}
%&lt;class&amp;thesis&gt;\ProvidesExplClass{sjtuthesis}
%&lt;class&amp;report&gt;  {Report document class for Shanghai Jiao Tong University (SJTUTeX)}
%&lt;class&amp;report&gt;\ProvidesExplClass{sjtureport}
%&lt;class&amp;article&gt;  {Article document class for Shanghai Jiao Tong University (SJTUTeX)}
%&lt;class&amp;article&gt;\ProvidesExplClass{sjtuarticle}
%&lt;lang&amp;zh&gt;  {Chinese specific definition (SJTUTeX)}
%&lt;lang&amp;zh&gt;\ProvidesExplFile{sjtu-lang-zh.def}
%&lt;lang&amp;en&gt;  {English specific definition (SJTUTeX)}
%&lt;lang&amp;en&gt;\ProvidesExplFile{sjtu-lang-en.def}
%&lt;lang&amp;de&gt;  {German specific definition (SJTUTeX)}
%&lt;lang&amp;de&gt;\ProvidesExplFile{sjtu-lang-de.def}
%&lt;lang&amp;ja&gt;  {Japanese specific definition (SJTUTeX)}
%&lt;lang&amp;ja&gt;\ProvidesExplFile{sjtu-lang-ja.def}
%&lt;scheme&amp;zh&gt;  {Chinese scheme (SJTUTeX)}
%&lt;scheme&amp;zh&gt;\ProvidesExplFile{sjtu-scheme-zh.def}
%&lt;scheme&amp;en&gt;  {English scheme (SJTUTeX)}
%&lt;scheme&amp;en&gt;\ProvidesExplFile{sjtu-scheme-en.def}
%&lt;scheme&amp;de&gt;  {German scheme (SJTUTeX)}
%&lt;scheme&amp;de&gt;\ProvidesExplFile{sjtu-scheme-de.def}
%&lt;scheme&amp;ja&gt;  {Japanese scheme (SJTUTeX)}
%&lt;scheme&amp;ja&gt;\ProvidesExplFile{sjtu-scheme-ja.def}
%&lt;thesis-i18n&amp;zh&gt;  {Chinese config for thesis (SJTUTeX)}
%&lt;thesis-i18n&amp;zh&gt;\ProvidesExplFile{sjtu-thesis-zh.def}
%&lt;thesis-i18n&amp;en&gt;  {English config for thesis (SJTUTeX)}
%&lt;thesis-i18n&amp;en&gt;\ProvidesExplFile{sjtu-thesis-en.def}
%&lt;thesis-i18n&amp;de&gt;  {German config for thesis (SJTUTeX)}
%&lt;thesis-i18n&amp;de&gt;\ProvidesExplFile{sjtu-thesis-de.def}
%&lt;thesis-i18n&amp;ja&gt;  {Japanese config for thesis (SJTUTeX)}
%&lt;thesis-i18n&amp;ja&gt;\ProvidesExplFile{sjtu-thesis-ja.def}
%&lt;font&amp;text&amp;newtx&gt;  {New TX text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;newtx&gt;\ProvidesExplFile{sjtu-text-font-newtx.def}
%&lt;font&amp;text&amp;newpx&gt;  {New PX text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;newpx&gt;\ProvidesExplFile{sjtu-text-font-newpx.def}
%&lt;font&amp;text&amp;lm&gt;  {Latin Modern text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;lm&gt;\ProvidesExplFile{sjtu-text-font-lm.def}
%&lt;font&amp;text&amp;times&gt;  {Times text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;times&gt;\ProvidesExplFile{sjtu-text-font-times.def}
%&lt;font&amp;text&amp;stixtwo&gt;  {STIX Two text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;stixtwo&gt;\ProvidesExplFile{sjtu-text-font-stixtwo.def}
%&lt;font&amp;text&amp;libertinus&gt;  {Libertinus text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;libertinus&gt;\ProvidesExplFile{sjtu-text-font-libertinus.def}
%&lt;font&amp;text&amp;cambria&gt;  {Cambria text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;cambria&gt;\ProvidesExplFile{sjtu-text-font-cambria.def}
%&lt;font&amp;text&amp;newcm&gt;  {New Computer Modern text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;newcm&gt;\ProvidesExplFile{sjtu-text-font-newcm.def}
%&lt;font&amp;text&amp;xits&gt;  {XITS text fonts definition (SJTUTeX)}
%&lt;font&amp;text&amp;xits&gt;\ProvidesExplFile{sjtu-text-font-xits.def}
%&lt;font&amp;math&amp;newtx&gt;  {New TX math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;newtx&gt;\ProvidesExplFile{sjtu-math-font-newtx.def}
%&lt;font&amp;math&amp;newpx&gt;  {New PX math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;newpx&gt;\ProvidesExplFile{sjtu-math-font-newpx.def}
%&lt;font&amp;math&amp;lm&gt;  {Latin Modern math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;lm&gt;\ProvidesExplFile{sjtu-math-font-lm.def}
%&lt;font&amp;math&amp;times&gt;  {Times math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;times&gt;\ProvidesExplFile{sjtu-math-font-times.def}
%&lt;font&amp;math&amp;stixtwo&gt;  {STIX Two math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;stixtwo&gt;\ProvidesExplFile{sjtu-math-font-stixtwo.def}
%&lt;font&amp;math&amp;libertinus&gt;  {Libertinus math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;libertinus&gt;\ProvidesExplFile{sjtu-math-font-libertinus.def}
%&lt;font&amp;math&amp;cambria&gt;  {Cambria math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;cambria&gt;\ProvidesExplFile{sjtu-math-font-cambria.def}
%&lt;font&amp;math&amp;newcm&gt;  {New Computer Modern math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;newcm&gt;\ProvidesExplFile{sjtu-math-font-newcm.def}
%&lt;font&amp;math&amp;xits&gt;  {XITS math fonts definition (SJTUTeX)}
%&lt;font&amp;math&amp;xits&gt;\ProvidesExplFile{sjtu-math-font-xits.def}
%&lt;font&amp;cjk&amp;windows&gt;  {Windows CJK fonts definition (SJTUTeX)}
%&lt;font&amp;cjk&amp;windows&gt;\ProvidesExplFile{sjtu-cjk-font-windows.def}
%&lt;font&amp;cjk&amp;mac&gt;  {macOS CJK fonts definition (SJTUTeX)}
%&lt;font&amp;cjk&amp;mac&gt;\ProvidesExplFile{sjtu-cjk-font-mac.def}
%&lt;font&amp;cjk&amp;ubuntu&gt;  {Ubuntu CJK fonts definition (SJTUTeX)}
%&lt;font&amp;cjk&amp;ubuntu&gt;\ProvidesExplFile{sjtu-cjk-font-ubuntu.def}
%&lt;font&amp;cjk&amp;adobe&gt;  {Adobe CJK fonts definition (SJTUTeX)}
%&lt;font&amp;cjk&amp;adobe&gt;\ProvidesExplFile{sjtu-cjk-font-adobe.def}
%&lt;font&amp;cjk&amp;fandol&gt;  {Fandol CJK fonts definition (SJTUTeX)}
%&lt;font&amp;cjk&amp;fandol&gt;\ProvidesExplFile{sjtu-cjk-font-fandol.def}
%&lt;font&amp;cjk&amp;founder&gt;  {Founder CJK fonts definition (SJTUTeX)}
%&lt;font&amp;cjk&amp;founder&gt;\ProvidesExplFile{sjtu-cjk-font-founder.def}
%&lt;font&amp;cjk&amp;hanyi&gt;  {Hanyi CJK fonts definition (SJTUTeX)}
%&lt;font&amp;cjk&amp;hanyi&gt;\ProvidesExplFile{sjtu-cjk-font-hanyi.def}
%&lt;!driver&gt;  {\ExplFileDate}{2.2.1}{\ExplFileDescription}
%&lt;/!(driver|install)&gt;
%
%&lt;*driver&gt;
\PassOptionsToPackage{fontset=ubuntu}{ctex}
\documentclass{ctxdoc}
\newcommand{\sjtutex}{SJTU\TeX}
\expandafter\def\csname ver@\jobname.dtx\endcsname
  {2025/03/29 v2.2.1 SJTUTeX}
\usepackage{float}
\usepackage{multirow}
\usepackage{longtable}
\usepackage{listings}
\AtEndOfClass{\sloppy}
\definecolor{sjtu-red}{RGB}{200,22,30}
\definecolor{sjtu-dark-red}{RGB}{167,32,56}
\definecolor{sjtu-amber}{RGB}{253,208,0}
\definecolor{sjtu-orange}{RGB}{240,131,0}
\definecolor{sjtu-blue}{RGB}{0,134,209}
\definecolor{sjtu-dark-blue}{RGB}{0,64,152}
\definecolor{sjtu-green}{RGB}{51,141,39}
\definecolor{sjtu-dark-green}{RGB}{0,81,78}
\lstdefinestyle{style@base}{^^A
  basewidth         = 0.5 em,
  gobble            = 2,
  lineskip          = 2 pt,
  frame             = l,
  framerule         = 1.2 pt,
  framesep          = 0 pt,
  escapeinside      = {(*}{*)},
  basicstyle        = \small\ttfamily,
  xleftmargin       = 0.5 em,
  xrightmargin      = 0.5 em,
  framexleftmargin  = 0.5 em,
  framexrightmargin = 0.5 em}
\lstdefinestyle{style@shell}{^^A
  style             = style@base,
  rulecolor         = \color{sjtu-dark-green},
  backgroundcolor   = \color{sjtu-dark-green!2},
  language          = bash,
  alsoletter        = {-},
  keywordstyle      = \color{sjtu-green},
  emphstyle         = \color{sjtu-amber}}
\lstdefinestyle{style@latex}{^^A
  style             = style@base,
  rulecolor         = \color{sjtu-dark-blue},
  backgroundcolor   = \color{sjtu-dark-blue!2},
  language          = [LaTeX]TeX,
  alsoletter        = {*, -},
  keywordstyle      = \color{sjtu-dark-red!80},
  texcsstyle        = *\color{sjtu-blue},
  emphstyle         = [1]\color{sjtu-orange},
  emphstyle         = [2]\color{sjtu-green},
  emphstyle         = [3]\color{sjtu-dark-blue!80}}
\lstnewenvironment{shell}[1][]{^^A
  \lstset{style=style@shell, #1}}{}
\lstnewenvironment{latex}[1][]{^^A
  \lstset{style=style@latex, #1}}{}
\newcommand\TNA[1]{\textcolor{sjtu-blue}{\tn{#1}}}
\newcommand\TNB[1]{\textcolor{sjtu-dark-red!80}{\tn{#1}}}
\newcommand\OPT[1]{\textcolor{sjtu-dark-blue!80}{#1}}
\newcommand\OPS[1]{\textcolor{sjtu-green}{#1}}
\newcommand\ENV[1]{\textcolor{sjtu-orange}{#1}}
\newcommand\BEV[1]{\TNA{begin}\{\ENV{#1}\}}
\newcommand\EEV[1]{\TNA{end}\{\ENV{#1}\}}
\newcommand\note[1]{{^^A
  \color{sjtu-dark-green}{\noindent\bfseries è¯´æ˜Žï¼š}~\emph{#1}}}
\newcommand\sjtutexrev[1]{^^A
  \href{https://github.com/sjtug/SJTUTeX/commit/#1}{\texttt{sjtutex} rev. #1}}
\hypersetup{^^A
  bookmarksnumbered = true,
  bookmarksopen     = true}
\makeatletter
\pdfstringdefDisableCommands{^^A
  \let\color\@gobble}
\makeatother
\begin{document}
  \DocInput{\jobname.dtx}
  \IndexLayout
  \PrintChanges
  \PrintIndex
\end{document}
%&lt;/driver&gt;
% \fi
%
% \changes{v2.0}{2021/09/10}{åº”ç”¨ \LaTeXiii{} é‡æž„ä»£ç&nbsp;ã€‚}
% \changes{v2.0}{2022/12/27}{æ–°å¢žæ–‡æ¡£ç±» \cls{sjtuarticle} å’Œ \cls{sjtureport}ã€‚}
%
% \GetFileId{\jobname.dtx}
%
% \title{\bfseries\color{sjtu-red}\sjtutex{}: ä¸Šæµ·äº¤é€šå¤§å­¦æ–‡æ¡£ç±»é›†}
% \author{SJTUG}
% \date{\filedate\quad\fileversion\thanks{\sjtutexrev{\ExplFileVersion}.}}
%
% \hypersetup{^^A
%   pdfsubject  = {ä¸Šæµ·äº¤é€šå¤§å­¦æ–‡æ¡£ç±»é›†ä½¿ç”¨è¯´æ˜Ž},
%   pdfkeywords = {æ¨¡æ¿; ä¸Šæµ·äº¤é€šå¤§å­¦; ä½¿ç”¨è¯´æ˜Ž}}
%
% \maketitle
%
% \begin{abstract}
% æ­¤å®åŒ…æ—¨åœ¨å»ºç«‹ä¸€ä¸ªç®€å•æ˜“ç”¨çš„ä¸Šæµ·äº¤é€šå¤§å­¦æ–‡æ¡£ç±»é›†ï¼ŒåŒ…æ‹¬å­¦ä½è®ºæ–‡æ–‡æ¡£ç±»
% \cls{sjtuthesis} ä»¥åŠæ™®é€šæ–‡æ¡£ç±» \cls{sjtuarticle} å’Œ \cls{sjtureport}ã€‚
% \end{abstract}
%
% \def\abstractname{å…è´£å£°æ˜Ž}
% \begin{abstract}
% \noindent
% \begin{enumerate}
% \item æœ¬æ¨¡æ¿çš„å‘å¸ƒéµå®ˆ \href{https://www.latex-project.org/lppl/lppl-1-3c.txt}
%   {\LaTeX{} Project Public License (1.3c)}ï¼Œä½¿ç”¨å‰è¯·è®¤çœŸé˜…è¯»åè®®å†…å®¹ã€‚
% \item å­¦ä½è®ºæ–‡æ¨¡æ¿æ&nbsp;¹æ® \href{https://www.gs.sjtu.edu.cn/post/detail/Z3MxNDc=}
%   {ã€Šä¸Šæµ·äº¤é€šå¤§å­¦åšå£«ã€ç¡•å£«å­¦ä½è®ºæ–‡æ’°å†™æŒ‡å—ã€‹} ï¼Œå¹¶å‚è€ƒ
%   \href{https://www.jwc.sjtu.edu.cn/info/1041/117021.htm}
%   {ã€Šä¸Šæµ·äº¤é€šå¤§å­¦æœ¬ç§‘ç”Ÿæ¯•ä¸šè®¾è®¡ï¼ˆè®ºæ–‡ï¼‰æ’°å†™è§„èŒƒã€‹}
%   ç¼–å†™è€Œæˆã€‚æ—¨åœ¨ä¾›ä¸Šæµ·äº¤é€šå¤§å­¦å‡†æ¯•ä¸šç”Ÿæ’°å†™å­¦ä½è®ºæ–‡ä½¿ç”¨ã€‚
% \item å­¦ä½è®ºæ–‡æ¨¡æ¿ä»…ä¸ºæ’°å†™æŒ‡å—çš„å‚è€ƒå®žçŽ°ï¼Œä¸ä¿è¯å®¡æŸ¥è€å¸ˆä¸ææ„è§ã€‚ä»»ä½•ç”±äºŽä½¿ç”¨
%   æœ¬æ¨¡æ¿è€Œå¼•èµ·çš„è®ºæ–‡æ&nbsp;¼å¼å®¡æŸ¥é—®é¢˜å‡ä¸Žæœ¬æ¨¡æ¿ä½œè€…æ—&nbsp;å…³ã€‚
% \item ä»»ä½•ä¸ªäººæˆ–ç»„ç»‡ä»¥æœ¬æ¨¡æ¿ä¸ºåŸºç¡€è¿›è¡Œä¿®æ”¹ã€æ‰©å±•è€Œç”Ÿæˆçš„æ–°çš„ä¸“ç”¨æ¨¡æ¿ï¼Œè¯·ä¸¥æ&nbsp;¼éµ
%   å®ˆ \LaTeX{} Project Public License åè®®ã€‚ç”±äºŽè¿çŠ¯åè®®è€Œå¼•èµ·çš„ä»»ä½•çº&nbsp;çº·äº‰ç«¯å‡
%   ä¸Žæœ¬æ¨¡æ¿ä½œè€…æ—&nbsp;å…³ã€‚
% \end{enumerate}
% \end{abstract}
%
% \tableofcontents
%
% \begin{documentation}
%
% \section{ä»‹ç»}
%
% æœ€æ—©çš„ä¸€ç‰ˆ \LaTeX{} å­¦ä½è®ºæ–‡æ¨¡æ¿ç”±ä¸€ä½çƒ­å¿ƒçš„ç‰©ç†ç³»åŒå­¦åˆ¶ä½œï¼Œä¸­æ–‡å­—ç¬¦å¤„ç†é‡‡ç”¨äº†
% å½“æ—¶æœ€ä¸ºæµè¡Œçš„ CJK--\LaTeX{} æ–¹æ¡ˆã€‚åœ¨æ­¤åŸºç¡€ä¸Šï¼Œweijianwen æ&nbsp;¹æ®äº¤å¤§ç&nbsp;”ç©¶ç”Ÿé™¢å¯¹å­¦
% ä½è®ºæ–‡çš„è¦æ±‚ï¼Œå®Œæˆäº†ä¸€ä»½åŸºæœ¬å¯ç”¨çš„äº¤å¤§ \LaTeX{} å­¦ä½è®ºæ–‡æ¨¡æ¿ã€‚ç”±äºŽ CJK--\LaTeX{}
% æ–¹æ¡ˆä¸æ˜“ä½¿ç”¨ï¼Œweijianwen ä¸Ž William Wang å¼€å§‹ç€æ‰‹æŠŠæ¨¡æ¿å‘ \XeTeX{} å¼•æ“Žç§»æ¤ã€‚
% ä¹‹åŽ weijianwenåˆæ–­æ–­ç»­ç»­åšäº†ä¸€äº›å®Œå–„æ¨¡æ¿çš„å·¥ä½œï¼Œåœ¨åŽŸæœ‰ç¡•å£«å­¦ä½è®ºæ–‡æ¨¡æ¿çš„åŸºç¡€
% ä¸Šå®Œæˆäº†äº¤å¤§å­¦å£«å’Œåšå£«å­¦ä½è®ºæ–‡æ¨¡æ¿ã€‚
%
% 2012 å¹´ 5 æœˆæ¨¡æ¿å¼€å§‹åœ¨ GitHub^^A
% \footnote{\url{https://github.com/weijianwen/SJTUThesis}ï¼Œé¡¹ç›®è½¬ç§»åŽè¯¥é“¾æŽ¥å·²é‡å®šå‘ã€‚}^^A
% ä¸Šç®¡ç†å’Œæ›´æ–°ï¼Œ2018 å¹´ 1 æœˆé¡¹ç›®è½¬ç§»è‡³ SJTUG åä¸‹ã€‚2019 å¹´ 6 æœˆ Alexara Wu é‡æž„
% äº†æ•´ä¸ªå®åŒ…çš„ä»£ç&nbsp;ï¼Œå¹¶ä½¿ç”¨ Doc\TeX{} æ–‡æ¡£å’Œ\textsc{DocStrip} å·¥å…·è¿›è¡Œä»£ç&nbsp;çš„ç®¡ç†ï¼Œ
% å‡çº§ç‰ˆæœ¬å·ä¸º 1.0ã€‚2022 å¹´ 11 æœˆï¼Œè®ºæ–‡æ¨¡æ¿æ”¹ç‰ˆåŽï¼Œä½¿ç”¨ \LaTeXiii{} é‡æž„äº†ä»£ç&nbsp;ï¼Œ
% æ·»åŠ&nbsp; \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ï¼Œå‡çº§ç‰ˆæœ¬å·ä¸º 2.0ã€‚
% 2024 å¹´ 2 æœˆï¼Œ\pkg{sjtutex} æ–‡æ¡£ç±»é›†åœ¨ CTAN ä¸Šå‘å¸ƒï¼Œè¢« \TeX{} Live 2024 åŠä¹‹åŽ
% çš„ç‰ˆæœ¬æ”¶å½•ã€‚
%
% çŽ°åœ¨ï¼Œ\sjtutex{} ä»£ç&nbsp;åœ¨ GitHub^^A
% \footnote{\url{https://github.com/sjtug/SJTUTeX}}^^A
% ä¸Šç»´æŠ¤ï¼Œå¹¶åŒæ­¥å‘å¸ƒè‡³ CTAN\footnote{\url{https://www.ctan.org/pkg/sjtutex}} ä¸Šã€‚
% åŽŸ \href{https://github.com/sjtug/SJTUThesis}{SJTUThesis} ä»“åº“åˆ™ä½œä¸ºå­¦ä½è®ºæ–‡
% ç¤ºä¾‹æ–‡æ¡£ï¼Œæä¾›å¼€ç®±å³ç”¨çš„æ¨¡æ¿ã€‚å­¦ä½è®ºæ–‡æ¨¡æ¿ç”¨æˆ·å¯ä»¥åœ¨
% \href{https://github.com/sjtug/SJTUThesis/discussions}{Discussions}
% ä¸Šæé—®ä½¿ç”¨é—®é¢˜ï¼Œä¹Ÿå¯ä»¥åœ¨
% \href{https://github.com/sjtug/SJTUThesis/issues}{Issues}
% ä¸­è¿›è¡Œ Bug åé¦ˆä¸Žæ–°åŠŸèƒ½ææ¡ˆã€‚å¦‚æžœéœ€è¦å¯¹æ–‡æ¡£ç±»ä»£ç&nbsp;è¿›è¡Œä¿®æ”¹ï¼Œæ¬¢è¿Žå‰å¾€
% \href{https://github.com/sjtug/SJTUTeX}{\sjtutex} ä»“åº“è¿›è¡Œ Pull Requestã€‚
% \sjtutex{} æ¨¡æ¿çš„è®¸å¤šå®žçŽ°ç»†èŠ‚ç¦»ä¸å¼€
% \href{https://github.com/sjtug/SJTUThesis/graphs/contributors}{çƒ­å¿ƒåŒå­¦ä»¬}
% çš„è´¡çŒ®ï¼Œåœ¨æ­¤æ„Ÿè°¢æ‰€æœ‰ä¸ºæ¨¡æ¿è´¡çŒ®è¿‡ä»£ç&nbsp;çš„åŒå­¦ä»¬ï¼Œä»¥åŠæ‰€æœ‰æµ‹è¯•å’Œä½¿ç”¨æ¨¡æ¿çš„å„ä½åŒå­¦ï¼
%
% \note{æ¨¡æ¿çš„ä½œç”¨åœ¨äºŽå‡å°‘è®ºæ–‡å†™ä½œè¿‡ç¨‹ä¸­æ&nbsp;¼å¼è°ƒæ•´çš„æ—¶é—´ï¼Œå‰ææ˜¯éµå®ˆæ¨¡æ¿çš„ç”¨æ³•ï¼Œå¦
%   åˆ™å³ä¾¿ç”¨äº† \sjtutex{} ä¹Ÿéš¾ä»¥ä¿è¯è¾“å‡ºçš„è®ºæ–‡ç¬¦åˆå­¦æ&nbsp;¡è§„èŒƒã€‚}
%
% \section{ç®€æ˜Žæ•™ç¨‹}
%
% \subsection{å®‰è£… \TeX{} å‘è¡Œç‰ˆ}
%
% å›&nbsp;ä¸º \LaTeXiii{} å’Œç›¸å…³å®åŒ…åœ¨ä¸æ–­æ›´æ–°ï¼Œæ‰€ä»¥æŽ¨èä½¿ç”¨æœ€æ–°çš„ \TeX{} å‘è¡Œç‰ˆã€‚
% \sjtutex{} æ”¯æŒä¸»æµçš„ \TeX{} å‘è¡Œç‰ˆï¼ŒåŒ…æ‹¬ \TeX{} Liveã€\hologo{MiKTeX}ã€
% Mac\TeX{}ï¼Œä½†ä¸æ”¯æŒ \CTeX{} å¥—è£…ã€‚å®‰è£…æ–¹æ³•å…·ä½“å¯ä»¥å‚è€ƒ
% \href{https://github.com/sjtug/SJTUThesis/wiki/TeX-å‘è¡Œç‰ˆåŠå…¶å®‰è£…}
% {Wiki é¡µé¢ã€Š\TeX{} å‘è¡Œç‰ˆåŠå…¶å®‰è£…ã€‹}ã€‚
%
% \sjtutex{} éœ€è¦ \LaTeXe{} å†…æ&nbsp;¸ 2024-06-01 æˆ–ä»¥ä¸Šç‰ˆæœ¬ï¼Œ\pkg{ctex} å®åŒ…ç‰ˆæœ¬åº”å½“
% åœ¨ v2.5 åŠä»¥ä¸Šã€‚ç‰ˆæœ¬è¿‡ä½Žå°†æ—&nbsp;æ³•æ­£å¸¸ç¼–è¯‘ã€‚
%
% \subsection{æ–‡ä»¶ç»„æˆ}
%
% è¡¨~\ref{tab:files} åˆ—å‡ºäº† \sjtutex{} çš„ä¸»è¦æ–‡ä»¶åŠå…¶åŠŸèƒ½ä»‹ç»ã€‚
%
% \begin{table}[!hbt]
% \centering
% \begin{threeparttable}
%   \caption{æ¨¡æ¿çš„æ–‡ä»¶ç»„æˆ}
%   \label{tab:files}
%   \begin{tabular}{l|l|p{4cm}}
%     \toprule
%     \strong{ç±»åˆ«}         &amp; \strong{æ–‡ä»¶}               &amp; \strong{è¯´æ˜Ž}    \\
%     \midrule
%     æ–‡æ¡£ç±»                &amp; \file{sjtuthesis.cls}       &amp; å­¦ä½è®ºæ–‡æ–‡æ¡£ç±»   \\
%                           &amp; \file{sjtureport.cls}       &amp; æŠ¥å‘Šæ–‡æ¡£ç±»       \\
%                           &amp; \file{sjtuarticle.cls}      &amp; æ–‡ç¨¿æ–‡æ¡£ç±»       \\
%                           &amp; \file{sjtu-lang-*.def}      &amp; æ–‡æ¡£ç±»è¯­è¨€é…ç½®   \\
%                           &amp; \file{sjtu-scheme-*.def}    &amp; æ–‡æ¡£ç±»è¯­è¨€æ–¹æ¡ˆ   \\
%                           &amp; \file{sjtu-thesis-*.def}    &amp; å­¦ä½è®ºæ–‡è¯­è¨€é…ç½® \\
%     \midrule
%     å­—ä½“é…ç½®æ–‡ä»¶          &amp; \file{sjtu-text-font-*.def} &amp; è¥¿æ–‡å­—ä½“é…ç½®     \\
%                           &amp; \file{sjtu-math-font-*.def} &amp; æ•°å­¦å­—ä½“é…ç½®     \\
%                           &amp; \file{sjtu-cjk-font-*.def}  &amp; CJK å­—ä½“é…ç½®     \\
%     \midrule
%     è§†è§‰å½¢è±¡ç³»ç»Ÿ\tnote{a} &amp; \file{sjtu-vi-logo-*.pdf}   &amp; æ&nbsp;¡æ&nbsp;‡å›¾ç‰‡         \\
%                           &amp; \file{sjtu-vi-badge-*.pdf}  &amp; æ&nbsp;¡å¾½å›¾ç‰‡         \\
%
%     \bottomrule
%   \end{tabular}
%   \begin{tablenotes}
%     \item[a] \href{https://vi.sjtu.edu.cn}{äº¤å¤§è§†è§‰å½¢è±¡ç³»ç»Ÿ}
%       çš„ç›¸å…³å›¾åƒèµ„æºç‰ˆæƒå½’ä¸Šæµ·äº¤é€šå¤§å­¦æ‰€æœ‰ã€‚
%   \end{tablenotes}
% \end{threeparttable}
% \end{table}
%
% \subsection{ä½¿ç”¨æ–‡æ¡£ç±»}
%
% å…±æœ‰ 3 ç§æ–‡æ¡£ç±»ï¼Œ\cls{sjtuthesis} ç”¨äºŽå­¦ä½è®ºæ–‡çš„æŽ’ç‰ˆï¼Œ\cls{sjtureport}
% ç”¨äºŽè¯¾ç¨‹å¤§æŠ¥å‘Šçš„æŽ’ç‰ˆï¼Œ\cls{sjtuarticle} ç”¨äºŽè¯¾ç¨‹å°è®ºæ–‡çš„æŽ’ç‰ˆã€‚
%
% å°†æ–‡æ¡£ä¿å­˜åœ¨ä¸‹è½½å¥½çš„ \sjtutex{} æ¨¡æ¿æ&nbsp;¹ç›®å½•ä¸‹ï¼Œæˆ–è€…ç›´æŽ¥ä½¿ç”¨ \TeX{} å‘è¡Œç‰ˆ
% ä¸­çš„ \pkg{sjtutex} æ–‡æ¡£ç±»é›†^^A
% \footnote{ä¸ºäº†ä½¿ç”¨æœ€æ–°ç‰ˆæœ¬çš„ \sjtutex{}ï¼Œè¯·åŠæ—¶æ›´æ–°å‘è¡Œç‰ˆè‡³æœ€æ–°çš„ç‰ˆæœ¬ï¼š^^A
% \TeX{} Live ç”¨æˆ·è¯·ä½¿ç”¨å‘½ä»¤ \texttt{tlmgr update --self --all} æ¥æ›´æ–°å…¨éƒ¨å®åŒ…ï¼›^^A
% \hologo{MiKTeX} ç”¨æˆ·è¯·åœ¨ MiKTeX Console æ›´æ–°é€‰é¡¹å¡ä¸­æ›´æ–°æ‰€æœ‰å®åŒ…ã€‚}ï¼Œ
% æ–‡ä»¶ä»¥ \texttt{.tex} åŽç¼€ç»“å°¾ã€‚
% æ³¨æ„åœ¨ä½¿ç”¨æ–‡æ¡£ç±»æ—¶ï¼Œéœ€è¦å°†æ¶‰åŠåˆ°çš„æ‰€æœ‰æºæ–‡ä»¶ä½¿ç”¨ UTF-8 ç¼–ç&nbsp;ä¿å­˜ã€‚
% å¯¹äºŽä¸åŒçš„æ–‡æ¡£ç±»ï¼Œä½¿ç”¨æ–¹æ³•ç•¥æœ‰ä¸åŒï¼Œè¿™é‡Œç»™å‡ºè¿™ä¸‰ç§æ–‡æ¡£ç±»çš„æœ€å°ä½¿ç”¨ç¤ºä¾‹ã€‚
%
% ä¸‹é¢è¿™ä»½ \TeX{} æ–‡æ¡£å±•ç¤ºäº† \cls{sjtuthesis} æ–‡æ¡£ç±»çš„åŸºæœ¬ç”¨æ³•ï¼Œä¸€èˆ¬éœ€è¦æŒ‡å®š
% ä¸­è‹±æ–‡åç§°ã€‚è¯¥æ–‡æ¡£å°†åŒ…å«ä¸­è‹±æ–‡å°é¢ï¼Œé¡µçœ‰ä¸ºæ–‡æ¡£ä¸»é¢˜åŠç«&nbsp;èŠ‚åç§°ã€‚
% \begin{latex}[moretexcs={\sjtusetup,\maketitle,\tableofcontents,\chapter},
%   morekeywords={\frontmatter,\mainmatter}, emph={[1]sjtuthesis,document},
%   emph={[2]info},emph={[3]type,zh,en,title,author}]
% \documentclass[type=master]{sjtuthesis}
% \sjtusetup{
%   info = {
%     zh/title  = {ä¸Šæµ·äº¤é€šå¤§å­¦å­¦ä½è®ºæ–‡æ¨¡æ¿ç¤ºä¾‹æ–‡æ¡£},
%     en/title  = {A Sample Document for SJTU Thesis Template},
%     zh/author = {æŸæŸ},
%     en/author = {Mo Mo},
%   }
% }
% \begin{document}
%   \maketitle
%   \frontmatter
%   \tableofcontents
%   \mainmatter
%   \chapter{æ¬¢è¿Ž}
%   \section{æ¬¢è¿Žä½¿ç”¨ SJTUThesis}
%   ä½&nbsp;å¥½ï¼Œ\LaTeX{}!
% \end{document}
% \end{latex}
%
% ä¸‹é¢è¿™ä»½ \TeX{} æ–‡æ¡£å±•ç¤ºäº† \cls{sjtureport} æ–‡æ¡£ç±»çš„åŸºæœ¬ç”¨æ³•ï¼Œå»ºè®®ä½¿ç”¨æ&nbsp;‡å‡†å‘½ä»¤
% å®šä¹‰ä¸­æ–‡åç§°ã€‚è¯¥æ–‡æ¡£å°†åŒ…å«æ&nbsp;‡é¢˜é¡µï¼Œé¡µçœ‰ä¸ºæ&nbsp;¡æ&nbsp;‡å›¾ç‰‡ã€æ–‡æ¡£ä¸»é¢˜åŠç«&nbsp;èŠ‚åç§°ã€‚
% \begin{latex}[moretexcs={\subject,\keywords,\maketitle,\chapter},
%   emph={[1]sjtureport,document}]
% \documentclass{sjtureport}
% \title{ä¸Šæµ·äº¤é€šå¤§å­¦æŠ¥å‘Šæ¨¡æ¿ç¤ºä¾‹æ–‡æ¡£}
% \author{æŸæŸ}
% \subject{XXæœŸæœ«è¯¾ç¨‹è®ºæ–‡}
% \keywords{ä¸Šæµ·äº¤å¤§, é¥®æ°´æ€æº, çˆ±å›½è£æ&nbsp;¡}
% \begin{document}
%   \maketitle
%   \chapter{æ¬¢è¿Ž}
%   \section{æ¬¢è¿Žä½¿ç”¨ SJTUReport}
%   ä½&nbsp;å¥½ï¼Œ\LaTeX{}!
% \end{document}
% \end{latex}
%
% ä¸‹é¢è¿™ä»½ \TeX{} æ–‡æ¡£å±•ç¤ºäº† \cls{sjtuarticle} æ–‡æ¡£ç±»çš„åŸºæœ¬ç”¨æ³•ï¼Œå»ºè®®ä½¿ç”¨æ&nbsp;‡å‡†
% å‘½ä»¤å®šä¹‰ä¸­æ–‡åç§°ï¼Œä¸èƒ½å¤Ÿä½¿ç”¨ \tn{chapter} è¿™ä¸€çº§ã€‚è¯¥æ–‡æ¡£åŒ…å«æ&nbsp;‡é¢˜æ&nbsp;ï¼Œé¡µçœ‰ä¸º
% æ&nbsp;¡æ&nbsp;‡å›¾ç‰‡ã€æ–‡æ¡£ä¸»é¢˜åŠç«&nbsp;èŠ‚åç§°ã€‚
% \begin{latex}[moretexcs={\maketitle}, emph={[1]sjtuarticle,document}]
% \documentclass{sjtuarticle}
% \title{ç¤ºä¾‹æ–‡æ¡£}
% \author{æŸæŸ}
% \begin{document}
%   \maketitle
%   \section{æ¬¢è¿Žä½¿ç”¨ SJTUArticle}
%   ä½&nbsp;å¥½ï¼Œ\LaTeX{}!
% \end{document}
% \end{latex}
%
% \subsection{ç¼–è¯‘æ–‡æ¡£}
%
% æ–‡æ¡£ç±»æŽ¨èä½¿ç”¨ \XeLaTeX{} æˆ– \LuaLaTeX{} ç¼–è¯‘ï¼ŒåŒæ—¶ä¹Ÿæ”¯æŒ \pdfTeX{} å¼•æ“Žã€‚ä¸ºäº†
% ç”Ÿæˆæ­£ç¡®çš„ç›®å½•ã€è„šæ³¨ä»¥åŠäº¤å‰å¼•ç”¨ï¼Œè‡³å°‘éœ€è¦è¿žç»­ç¼–è¯‘ä¸¤æ¬¡ã€‚
%
% åœ¨å®žé™…ä½¿ç”¨ä¸­ï¼Œä¸€èˆ¬æŽ¨èä½¿ç”¨è‡ªåŠ¨ç”Ÿæˆå·¥å…· \pkg{latexmk} ç¼–è¯‘æ–‡æ¡£ã€‚\pkg{latexmk}
% å‘½ä»¤å¯ä»¥è‡ªåŠ¨è¿›è¡Œå¤šæ­¥ç¼–è¯‘ï¼Œç›´åˆ°äº¤å‰å¼•ç”¨éƒ½è¢«è§£å†³ã€‚
% å‡è®¾æ‚¨çš„ \TeX{} æºæ–‡ä»¶åä¸º \file{main.tex}ï¼Œ
% å¯åœ¨å‘½ä»¤è¡Œä¸­æ‰§è¡Œå¦‚ä¸‹å‘½ä»¤ä½¿ç”¨ \XeLaTeX{} ç¼–è¯‘æ–‡æ¡£ï¼š
% \begin{shell}[morekeywords={latexmk},emph={-xelatex}]
% latexmk -xelatex main
% \end{shell}
% ä¹Ÿå¯é€šè¿‡ä¿®æ”¹ \file{latexmkrc} é…ç½®æ–‡ä»¶æ¥æŽ§åˆ¶ \pkg{latexmk} çš„è¡Œä¸ºï¼Œ
% å…·ä½“å¯ä»¥å‚è€ƒ \pkg{latexmk} æ–‡æ¡£ã€‚
%
% \section{æ–‡æ¡£é…ç½®}
%
% æœ¬æ¨¡æ¿ä¸­çš„é€‰é¡¹ã€å‘½ä»¤æˆ–çŽ¯å¢ƒå¯ä»¥åˆ†ä¸ºä»¥ä¸‹ä¸‰ç±»ï¼š
% \begin{itemize}
%   \item åå­—åŽé¢å¸¦æœ‰ \rexptarget\rexpstar{} çš„ï¼Œè¡¨ç¤ºåªèƒ½åœ¨ \cls{sjtuthesis}
%     æ–‡æ¡£ç±»ä¸­ä½¿ç”¨ï¼›
%   \item åå­—åŽé¢å¸¦æœ‰ \exptarget\expstar{} çš„ï¼Œè¡¨ç¤ºåªèƒ½åœ¨ \cls{sjtureport}
%     å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ä½¿ç”¨ï¼›
%   \item åå­—åŽé¢ä¸å¸¦æœ‰ç‰¹æ®Šç¬¦å·çš„ï¼Œä¸€èˆ¬è¡¨ç¤ºåœ¨ \cls{sjtuthesis}ã€\cls{sjtureport}
%     å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­éƒ½å¯ä»¥ä½¿ç”¨ï¼Œç‰¹æ®Šæƒ…å†µå¦ä½œè¯´æ˜Žã€‚
% \end{itemize}
%
% \subsection{æ–‡æ¡£ç±»é€‰é¡¹}
%
% æœ¬èŠ‚æ‰€æŒ‡â€œæ–‡æ¡£ç±»é€‰é¡¹â€æ˜¯æŒ‡éœ€è¦åœ¨å¼•å…¥æ–‡æ¡£ç±»çš„æ—¶å€™æŒ‡å®šçš„é€‰é¡¹:
%
% \begin{latex}[emph={[1]sjtuthesis}]
% \documentclass(*\oarg{æ–‡æ¡£ç±»é€‰é¡¹}*){sjtuthesis}
% \end{latex}
%
% éƒ¨åˆ†é€‰é¡¹é‡‡ç”¨ \meta{key}|=|\meta{value} çš„å½¢å¼ï¼Œéœ€è¦ä½¿ç”¨é€—å·åˆ†éš”å„é€‰é¡¹ã€‚
% å½“ \meta{value} çœç•¥æ—¶ï¼Œå°†é‡‡ç”¨é»˜è®¤å€¼ã€‚
% åœ¨ä¸‹æ–‡çš„è¯´æ˜Žä¸­ï¼Œå°†ç”¨\textbf{ç²—ä½“}è¡¨ç¤ºé»˜è®¤å€¼ã€‚
%
% \subsubsection{é€šç”¨é€‰é¡¹}
%
% \begin{function}[rEXP,updated=2022-12-03]{type}
%   \begin{syntax}
%     \OPT{type} = &lt;bachelor|(master)|doctor&gt;
%   \end{syntax}
%   è®ºæ–‡ç±»åž‹ã€‚ä¸‰ç§é€‰é¡¹åˆ†åˆ«ä»£è¡¨å­¦å£«å­¦ä½è®ºæ–‡ã€ç¡•å£«å­¦ä½è®ºæ–‡ã€åšå£«å­¦ä½è®ºæ–‡ã€‚
% \end{function}
%
% \begin{function}[updated=2023-03-23]{lang}
%   \begin{syntax}
%     \OPT{lang} = &lt;(zh)|en|de|ja&gt;
%   \end{syntax}
%   è®ºæ–‡ä¸»è¦è¯­è¨€ã€‚å¯é€‰ä¸­æ–‡ã€è‹±æ–‡ã€å¾·æ–‡æˆ–æ—¥æ–‡ï¼Œè¯¥é€‰é¡¹ä¼šæ”¹å˜æ–‡æ¡£ä¸­çš„ä¸€äº›æ&nbsp;‡é¢˜çš„åå­—ã€‚
%   ä¸‹æ–‡ä¸­ \meta{lang} å¯ä»¥æŒ‡å®šä¸ºè¿™äº›é€‰é¡¹ä¸­çš„å…¶ä¸­ä¹‹ä¸€ã€‚
% \end{function}
%
% \begin{function}{draft, final}
%   æ˜¯å¦å¼€å¯è‰ç¨¿æ¨¡å¼ã€‚
%   \opt{draft} å¼€å¯è‰ç¨¿æ¨¡å¼ï¼Œæ‰€æœ‰çš„å›¾ç‰‡å°†ä¸ä¼šè¢«åŠ&nbsp;è½½ï¼Œè¶…è¿‡è¾¹ç•Œçš„åŒºåŸŸå°†ä¼šè¢«æ¶‚ä¸Šé»‘è‰²è‰²å—ã€‚
%   \opt{final} å…³é—­è‰ç¨¿æ¨¡å¼ã€‚
%   é»˜è®¤ä¸º \opt{final}ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2025-01-14]{review}
%   ç›²å®¡æ¨¡å¼ã€‚å¼€å¯ç›²å®¡æ¨¡å¼ä¼šå°†ä½œè€…å§“åã€å¯¼å¸ˆå§“åã€å­¦å·ã€åŸºé‡‘ç­‰ä¸ªäººä¿¡æ¯ç•™ç©ºï¼Œ
%   å¹¶ä½¿å¾—æ&nbsp;‡é¢˜é¡µçš„ä¿¡æ¯è¡¨æ&nbsp;¼å¼ºåˆ¶æ˜¾ç¤ºç›¸å…³å­—æ®µï¼Œ
%   ç›¸å…³è¯´æ˜Žè¯¦è§ç¬¬ \ref{sec:sjtuthesiskey} èŠ‚ï¼›
%   å¼€å¯ç›²å®¡æ¨¡å¼è¿˜ä¼šåˆ&nbsp;åŽ»ç‰ˆæƒä½¿ç”¨æŽˆæƒä¹¦ã€åŽŸåˆ›æ€§å£°æ˜Žå’Œè‡´è°¢é¡µã€‚é»˜è®¤å…³é—­ã€‚
% \end{function}
%
% \subsubsection{é¡µé¢è®¾ç½®}
%
% \begin{function}{oneside, twoside}
%   æŒ‡æ˜Žè®ºæ–‡çš„å•åŒé¢æ¨¡å¼ã€‚
%   \opt{oneside} ä¸ºå•é¢æ¨¡å¼ï¼Œ
%   \opt{twoside} ä¸ºåŒé¢æ¨¡å¼ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º \opt{twoside}ã€‚
%     \item åœ¨ \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º \opt{oneside}ã€‚
%   \end{itemize}
% \end{function}
%
% \begin{function}{openright, openany}
%   æŒ‡æ˜Žè®ºæ–‡æ˜¯å¦å¥‡æ•°é¡µå¼€ç«&nbsp;ã€‚
%   \opt{openright} ä¸ºä»Žå¥‡æ•°é¡µå¼€å§‹æ–°ç«&nbsp;ï¼Œ
%   \opt{openany} ä¸ºä»Žä»»æ„é¡µå¼€å§‹æ–°ç«&nbsp;ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º \opt{openright}ã€‚
%     \item åœ¨ \cls{sjtureport} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º \opt{openany}ã€‚
%     \item åœ¨ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ï¼Œè¯¥é€‰é¡¹ä¸å¯ç”¨ã€‚
%   \end{itemize}
% \end{function}
%
% \begin{function}[EXP,added=2022-12-23]{titlepage, notitlepage}
%   æŒ‡æ˜Žè®ºæ–‡çš„æ&nbsp;‡é¢˜å½¢å¼ã€‚
%   \opt{titlepage} ä¸ºä½¿ç”¨æ&nbsp;‡é¢˜é¡µã€‚
%   \opt{notitlepage} ä¸ºä½¿ç”¨æ&nbsp;‡é¢˜å—ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼Œè¯¥é€‰é¡¹ä¸å¯ç”¨ï¼Œåªèƒ½ä½¿ç”¨æ&nbsp;‡é¢˜é¡µã€‚
%     \item åœ¨ \cls{sjtureport} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º \opt{titlepage}ã€‚
%     \item åœ¨ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º \opt{notitlepage}ã€‚
%   \end{itemize}
% \end{function}
%
% \subsubsection{å­—ä½“é€‰é¡¹}
% \label{sec:fontsetup}
%
% \begin{function}[updated=2022-12-18]{zihao}
%   \begin{syntax}
%     \OPT{zihao} = &lt;(-4)|5&gt;
%   \end{syntax}
%   è®ºæ–‡é»˜è®¤å­—å·ï¼Œå¯ä»¥è®¾å®šä¸ºå°å››å·æˆ–äº”å·ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} å’Œ \cls{sjtureport} æ–‡æ¡£ç±»ä¸­é»˜è®¤ä¸ºå°å››å·;
%     \item åœ¨ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­é»˜è®¤ä¸ºäº”å·ã€‚
%   \end{itemize}
% \end{function}
%
% \begin{function}[added=2023-10-24]{linespread}
%   \begin{syntax}
%     \OPT{linespread} = &lt;æ•°å€¼&gt;
%   \end{syntax}
%   è®¾ç½®è¡Œè·å€æ•°ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­é»˜è®¤ä¸è°ƒæ•´è¡Œè·å€æ•°;
%     \item åœ¨ \cls{sjtuarticle} å’Œ \cls{sjtureport} æ–‡æ¡£ç±»ä¸­é»˜è®¤ä¸º 1.3ã€‚
%   \end{itemize}
% \end{function}
%
% \begin{function}[added=2023-10-24]{baselineskip}
%   \begin{syntax}
%     \OPT{baselineskip} = &lt;é•¿åº¦|false&gt;
%   \end{syntax}
%   æ­£æ–‡åŸºçº¿é—´è·ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º 20 ç£…ã€‚
%     \item åœ¨ \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º \opt{false}ï¼›
%           æ­¤æ—¶æ­£æ–‡åŸºçº¿é—´è·ä¸ºå­—å·çš„ 1.2 å€ã€‚
%   \end{itemize}
% \end{function}
%
% \begin{function}{cjk-font}
%   \begin{syntax}
%     \OPT{cjk-font} = &lt;(auto)|windows|mac|ubuntu|adobe|(fandol)|founder|hanyi|none&gt;
%   \end{syntax}
%   æŒ‡å®š CJK å­—ä½“é›†ã€‚\sjtutex{} é¢„å®šä¹‰äº†ä¸€äº› CJK å­—ä½“ç»„åˆï¼Œ
%   å…·ä½“é…ç½®è§è¡¨ \ref{tab:cjkfonts}ã€‚
%   é»˜è®¤æƒ…å†µä¸‹ä¼šæ&nbsp;¹æ®æ“ä½œç³»ç»Ÿè‡ªåŠ¨é…ç½®ï¼š
%   Windows ç³»ç»Ÿé»˜è®¤ä½¿ç”¨ \opt{windows}ï¼Œ
%   macOS ç³»ç»Ÿé»˜è®¤ä½¿ç”¨ \opt{mac}ï¼Œ
%   Linux ç³»ç»Ÿé»˜è®¤ä½¿ç”¨ \opt{fandol}ã€‚
%   æ‰¾ä¸åˆ°å¯¹åº”å®šä¹‰çš„ CJK å­—ä½“é›†æ—¶çš„å›žé€€é€‰é¡¹ä¸º \opt{fandol}ã€‚
%
%   \textbf{ä»…} \opt{windows}ã€\opt{founder} å’Œ \opt{hanyi} å­—ä½“é›†æ”¯æŒ \pdfLaTeX{} ç›´æŽ¥ç”Ÿæˆ PDFã€‚
%   å…¶ä»– CJK å­—ä½“é›†ä½¿ç”¨ \pdfTeX{} å¼•æ“Žéœ€è¦å…ˆé€šè¿‡ \LaTeX{} ç”Ÿæˆ DVIï¼Œ
%   ç„¶åŽå†ä½¿ç”¨ DVIPDFM\textit{x} è½¬æ¢ä¸º PDFã€‚
% \end{function}
%
% \begin{table}[ht]
% \centering\small
% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
% \begin{threeparttable}
%   \caption{CJK å­—ä½“é…ç½®}
%   \label{tab:cjkfonts}
%   \tabcolsep=3pt
%   \begin{tabular}{ccccccc}
%     \toprule
%     	                   &amp; \strong{å®‹ä½“}     &amp; \strong{é»‘ä½“}    &amp; \strong{ä»¿å®‹} &amp; \strong{æ¥·ä½“}   &amp; \strong{æ˜Žæœä½“}\tnote{c} &amp; \strong{å“¥ç‰¹ä½“}\tnote{c}  \\
%     \midrule
%       |windows|          &amp; ï¼ˆä¸­æ˜“ï¼‰å®‹ä½“      &amp; ï¼ˆä¸­æ˜“ï¼‰é»‘ä½“     &amp; ï¼ˆä¸­æ˜“ï¼‰ä»¿å®‹  &amp; ï¼ˆä¸­æ˜“ï¼‰æ¥·ä½“    &amp; MS Mincho                &amp; MS Gothic                 \\
%       |mac|              &amp; ï¼ˆåŽæ–‡ï¼‰å®‹ä½“-ç®€   &amp; ï¼ˆåŽæ–‡ï¼‰é»‘ä½“-ç®€  &amp; åŽæ–‡ä»¿å®‹      &amp; ï¼ˆåŽæ–‡ï¼‰æ¥·ä½“-ç®€ &amp; Hiragino Mincho ProN     &amp; Hiragino Kaku Gothic ProN \\
%       |ubuntu|           &amp; Noto Serif CJK SC &amp; Noto Sans CJK SC &amp; ---           &amp; æ–‡é¼Ž PL ç®€ä¸­æ¥·  &amp; Noto Serif CJK JP        &amp; Noto Sans CJK JP          \\
%       |adobe|            &amp; Adobe å®‹ä½“        &amp; Adobe é»‘ä½“       &amp; Adobe ä»¿å®‹    &amp; Adobe æ¥·ä½“      &amp; Kozuka Mincho Pr6N       &amp; Kozuka Gothic Pr6N        \\
%       |fandol|\tnote{a}  &amp; Fandol å®‹ä½“       &amp; Fandol é»‘ä½“      &amp; Fandol ä»¿å®‹   &amp; Fandol æ¥·ä½“     &amp; HaranoAjiMincho          &amp; HaranoAjiGothic           \\
%       |founder|\tnote{b} &amp; æ–¹æ­£ä¹¦å®‹          &amp; æ–¹æ­£é»‘ä½“         &amp; æ–¹æ­£ä»¿å®‹      &amp; æ–¹æ­£æ¥·ä½“        &amp; IPAMincho                &amp; IPAGothic                 \\
%       |hanyi|            &amp; æ±‰ä»ªä¹¦å®‹äºŒ S      &amp; æ±‰ä»ªä¸­é»‘ S       &amp; æ±‰ä»ªä»¿å®‹ S    &amp; æ±‰ä»ªæ¥·ä½“ S      &amp; HaranoAjiMincho          &amp; HaranoAjiGothic           \\
%     \bottomrule
%   \end{tabular}
%   \begin{tablenotes}
%     \item[a] å‘è¡Œç‰ˆä¸­è‡ªå¸¦çš„ Fandol ä¸­æ–‡å­—åº“å®¹æ˜“å‡ºçŽ°ç¼ºå­—çš„æƒ…å†µï¼›
%       æˆ‘ä»¬å»ºè®® Linux ç”¨æˆ·ä½¿ç”¨ \opt{ubuntu} é€‰é¡¹æˆ–è‡ªè¡Œé…ç½®åˆé€‚çš„å­—ä½“ï¼›å‚è§
%       \href{https://github.com/sjtug/SJTUThesis/wiki/åœ¨çº¿ä½¿ç”¨è¯´æ˜Ž}
%       {Wiki é¡µé¢ã€Šåœ¨çº¿ä½¿ç”¨è¯´æ˜Žã€‹}ã€‚
%     \item[b] é…ç½® \opt{founder} é€‰é¡¹ä½¿ç”¨æ–¹æ­£ç®€ç¹æ‰©å±•ç‰ˆï¼ˆå³ GBK ç‰ˆï¼‰å­—ä½“ã€‚
%     \item[c] æ—¥æ–‡æ¨¡æ¿æ‰éœ€è¦æ—¥æ–‡æ˜Žæœä½“ä¸Žå“¥ç‰¹ä½“ï¼›æ—¥æ–‡å­—ä½“ä½¿ç”¨ \pkg{fontspec}
%       å®åŒ…è®¾ç½®ï¼Œæ•…æ—¥æ–‡æ¨¡æ¿ä¸æ”¯æŒ \pdfTeX{} å¼•æ“Žï¼Œè¯·ä½¿ç”¨ \XeLaTeX{} æˆ–
%       \LuaLaTeX{} ç¼–è¯‘ã€‚
%   \end{tablenotes}
% \end{threeparttable}
% \end{table}
%
% \begin{function}{text-font}
%   \begin{syntax}
%     \OPT{text-font} = &lt;(newtx)|times|stixtwo|xits|newpx|cambria|newcm|lm|libertinus|none&gt;
%   \end{syntax}
%   æŒ‡å®šè¥¿æ–‡å­—ä½“é›†ã€‚\sjtutex{} é¢„å®šä¹‰äº†ä¸€äº›è¥¿æ–‡å­—ä½“ç»„åˆï¼Œ
%   å…·ä½“é…ç½®è§è¡¨ \ref{tab:latinfonts}ã€‚
%   æ‰¾ä¸åˆ°å®šä¹‰çš„è¥¿æ–‡å­—ä½“é›†æ—¶çš„å›žé€€é€‰é¡¹ä¸º \opt{newtx}ã€‚
% \end{function}
%
% \begin{function}{math-font}
%   \begin{syntax}
%     \OPT{math-font} = &lt;(auto)|(newtx)|times|stixtwo|xits|newpx|cambria|newcm|lm|libertinus|none&gt;
%   \end{syntax}
%   æŒ‡å®šæ•°å­¦å­—ä½“é›†ã€‚\sjtutex{} é¢„å®šä¹‰äº†ä¸€äº›æ•°å­¦å­—ä½“ç»„åˆï¼Œ
%   å…·ä½“é…ç½®è§è¡¨ \ref{tab:latinfonts} æ•°å­¦å­—ä½“åˆ—ã€‚
%   é»˜è®¤è·Ÿéšè¥¿æ–‡å­—ä½“ \opt{text-font} çš„è®¾ç½®ã€‚
%   æ‰¾ä¸åˆ°å®šä¹‰çš„æ•°å­¦å­—ä½“é›†æ—¶çš„å›žé€€é€‰é¡¹ä¸º \opt{newtx}ã€‚
%
%   \opt{xits}ï¼Œ\opt{newcm}ï¼Œ\opt{cambria} é€‰é¡¹ä»…æ”¯æŒ \XeLaTeX/\LuaLaTeX{} ç¼–è¯‘ã€‚
% \end{function}
%
% \begin{table}[ht]
% \centering\small
% \begin{threeparttable}
%   \caption{è¥¿æ–‡å­—ä½“ä¸Žæ•°å­¦å­—ä½“é…ç½®}
%   \label{tab:latinfonts}
%   \begin{tabular}{ccccc}
%     \toprule
%       &amp; \strong{æ­£æ–‡å­—ä½“} &amp; \strong{æ—&nbsp;è¡¬çº¿å­—ä½“} &amp; \strong{ç­‰å®½å­—ä½“} &amp; \strong{æ•°å­¦å­—ä½“} \\
%     \midrule
%       |newtx|                  &amp; TG Termes X\tnote{a}     &amp; TG Heros        &amp; TG Cursor   &amp; newtx           \\
%       \multirow{2}{*}{|times|} &amp; Times New Roman\tnote{b} &amp; Arial           &amp; Courier New &amp; \multirow{2}{*}{mathptmx} \\
%                                &amp; Times\tnote{c}           &amp; Helvetica       &amp; Courier     &amp;                 \\
%       |stixtwo|                &amp; STIX Two Text            &amp; TG Heros        &amp; TG Cursor   &amp; STIX Two Math   \\
%       |xits|                   &amp; XITS                     &amp; TG Heros        &amp; TG Cursor   &amp; XITS Math       \\
%       |newpx|                  &amp; TG Pagella X             &amp; TG Heros        &amp; TG Cursor   &amp; newpx           \\
%       |cambria|                &amp; Cambria                  &amp; Calibri         &amp; Consolas    &amp; Cambria Math    \\
%       |newcm|                  &amp; New CM\tnote{d}          &amp; New CM Sans     &amp; New CM Mono &amp; New CM Math     \\
%       |lm|                     &amp; LM Roman\tnote{e}        &amp; LM Sans         &amp; LM Mono     &amp; LM Math         \\
%       |libertinus|             &amp; Libertinus Serif         &amp; Libertinus Sans &amp; LM Mono     &amp; Libertinus Math \\
%     \bottomrule
%   \end{tabular}
%   \begin{tablenotes}
%     \item[a] â€œTGâ€æ˜¯ TeX Gyre çš„ç¼©å†™ã€‚
%     \item[b] æœ¬è¡Œä¸­ï¼ŒTimes New Romanã€Arial å’Œ Courier New æ˜¯å•†ä¸šå­—ä½“ï¼Œ
%       åœ¨ Windows å’Œ macOS ç³»ç»Ÿä¸Šå‡é»˜è®¤å®‰è£…ã€‚
%     \item[c] ä½¿ç”¨ \pdfTeX{} å¼•æ“Žæ—¶ï¼Œå®žé™…ä½¿ç”¨å¯¹åº”å­—ä½“çš„ Type 1 å¼€æºç‰ˆæœ¬ã€‚
%     \item[d] â€œCMâ€æ˜¯ Computer Modern çš„ç¼©å†™ã€‚
%     \item[e] â€œLMâ€æ˜¯ Latin Modern çš„ç¼©å†™ã€‚
%   \end{tablenotes}
% \end{threeparttable}
% \end{table}
%
% \begin{function}[added=2022-12-03,updated=2023-01-05]{math-style}
%   \begin{syntax}
%     \OPT{math-style} = &lt;(ISO)|TeX&gt;
%   \end{syntax}
%   æ•°å­¦ç¬¦å·æ&nbsp;·å¼ã€‚è¯¥é€‰é¡¹å°†å½±å“ \opt{uppercase-greek}ã€\opt{integral}ã€
%   \opt{integral-limits} é€‰é¡¹ã€‚
%   é»˜è®¤éµå¾ª ISO 80000-2 æ&nbsp;‡å‡†è®¾ç½®ï¼Œå³æ–œä½“çš„å¤§å†™å¸Œè…Šå­—æ¯ã€ç›´ç«‹çš„ç§¯åˆ†å·
%   ä»¥åŠç§¯åˆ†å·ä¸Šä¸‹é™ç½®äºŽä¸Šä¸‹æ–¹ã€‚
%   ç”¨æˆ·ä¹Ÿå¯ä»¥é€é¡¹ä¿®æ”¹æ•°å­¦æ&nbsp;·å¼ã€‚
% \end{function}
%
% \begin{function}[added=2023-01-05]{uppercase-greek}
%   \begin{syntax}
%     \OPT{uppercase-greek} = &lt;slanted|upright&gt;
%   \end{syntax}
%   å¤§å†™å¸Œè…Šå­—æ¯çš„æ­£/æ–œä½“ã€‚
% \end{function}
%
% \begin{function}[added=2023-01-05]{integral}
%   \begin{syntax}
%     \OPT{integral} = &lt;slanted|upright&gt;
%   \end{syntax}
%   ç§¯åˆ†å·çš„æ­£/æ–œä½“ã€‚
% \end{function}
%
% \begin{function}[added=2023-01-05]{integral-limits}
%   \begin{syntax}
%     \OPT{integral-limits} = &lt;true|false&gt;
%   \end{syntax}
%   è¡Œé—´å…¬å¼ä¸­ç§¯åˆ†å·ä¸Šä¸‹é™çš„ä½ç½®ï¼Œ
%   \opt{true} ä½¿å¾—ä¸Šä¸‹é™åœ¨ç§¯åˆ†å·ä¸Šä¸‹æ–¹ï¼Œ
%   \opt{false} ä½¿å¾—ä¸Šä¸‹é™åœ¨ç§¯åˆ†å·å³ä¾§ã€‚
%   è¯¥é€‰é¡¹åªå½±å“è¡Œé—´å…¬å¼ï¼Œè¡Œå†…å…¬å¼ç»Ÿä¸€å±…å³ä¾§ï¼Œä¸å—å½±å“ã€‚
% \end{function}
%
% \subsubsection{å…¶ä»–é€‰é¡¹}
%
% å…¶ä»–çš„æ–‡æ¡£ç±»é€‰é¡¹ä¼šè¢«ä¼&nbsp;é€’ç»™å¯¹åº”çš„ \CTeX{} æ–‡æ¡£ç±»ï¼Œ
% è¯·æ³¨æ„ \opt{GBK}ã€\opt{scheme} ç­‰é€‰é¡¹ä¸å— \sjtutex{} æ”¯æŒã€‚
%
% \subsection{è®ºæ–‡ä¿¡æ¯è®¾ç½®}
%
% \begin{function}{\sjtusetup}
%   \begin{syntax}
%     \TNA{sjtusetup}\marg{é”®å€¼åˆ—è¡¨}
%   \end{syntax}
%   æœ¬æ¨¡æ¿æä¾›äº†ä¸€ç³»åˆ—é€‰é¡¹ï¼Œå¯ç”±æ‚¨è‡ªè¡Œé…ç½®ã€‚è½½å…¥æ–‡æ¡£ç±»ä¹‹åŽï¼Œä»¥ä¸‹
%   æ‰€æœ‰é€‰é¡¹å‡å¯é€šè¿‡ç»Ÿä¸€çš„å‘½ä»¤ \tn{sjtusetup} æ¥è®¾ç½®ã€‚
% \end{function}
%
% \tn{sjtusetup} çš„å‚æ•°æ˜¯ä¸€ç»„ç”±ï¼ˆè‹±æ–‡ï¼‰é€—å·éš”å¼€çš„é€‰é¡¹åˆ—è¡¨ï¼Œåˆ—è¡¨ä¸­çš„é€‰é¡¹é€šå¸¸æ˜¯
% \meta{key}|=|\meta{value} çš„å½¢å¼ã€‚å¯¹äºŽåŒä¸€é¡¹ï¼ŒåŽé¢çš„è®¾ç½®å°†ä¼šè¦†ç›–å‰é¢çš„è®¾ç½®ã€‚åœ¨
% ä¸‹æ–‡çš„è¯´æ˜Žä¸­ï¼Œå°†ç”¨\textbf{ç²—ä½“}è¡¨ç¤ºé»˜è®¤å€¼ã€‚\tn{sjtusetup} æ”¯æŒä¸åŒç±»åž‹ä»¥åŠå¤šç§
% å±‚æ¬¡çš„é€‰é¡¹è®¾å®šã€‚é”®å€¼åˆ—è¡¨ä¸­ï¼Œâ€œ|=|â€å·¦å³çš„ç©ºæ&nbsp;¼ä¸å½±å“è®¾ç½®ï¼›ä½†éœ€æ³¨æ„ï¼Œå‚æ•°åˆ—è¡¨ä¸­ä¸
% å¯ä»¥å‡ºçŽ°ç©ºè¡Œã€‚
%
% \begin{latex}[moretexcs={\sjtusetup}, emph={[2]info,style,name},
%   emph={[3]zh,en,title,author,float-num-sep,achv}]
% \sjtusetup{
%   info = {
%     zh/title      = {ä¸Šæµ·äº¤é€šå¤§å­¦å­¦ä½è®ºæ–‡æ¨¡æ¿ç¤ºä¾‹æ–‡æ¡£},
%     en/title      = {A Sample Document for SJTU Thesis Template},
%     zh/author     = {æŸæŸ},
%     en/author     = {Mo Mo},
%   },
%   style = {
%     float-num-sep = {-},
%   },
%   name = {
%     achv          = {æ”»è¯»å­¦ä½æœŸé—´å®Œæˆçš„è®ºæ–‡},
%   },
% }
% \end{latex}
%
% \subsubsection{ä¿¡æ¯åŸŸ}
%
% \begin{function}[updated=2025-01-14]{info}
%   \begin{syntax}
%     \OPS{info} = \marg{é”®å€¼åˆ—è¡¨}
%   \end{syntax}
%   è¯¥é€‰é¡¹åŒ…å«è®¸å¤šå­é¡¹ç›®ï¼Œç”¨äºŽå½•å…¥è®ºæ–‡ä¿¡æ¯ã€‚å…·ä½“å†…å®¹è§ä¸‹ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼ŒæŽ¨èä½¿ç”¨å¸¦è¯­è¨€ä»£ç&nbsp;å‰ç¼€ \meta{lang}
%           ï¼ˆæ¯”å¦‚ \opt{zh} æˆ– \opt{en}ï¼‰çš„é”®æ¥è®¾å®šå¯¹åº”è¯­è¨€çš„è®ºæ–‡ä¿¡æ¯ï¼Œè§ç¬¬
%           \ref{sec:sjtuthesiskey} èŠ‚ï¼›çœç•¥è¯­è¨€å‰ç¼€ä¸å¸¦â€œ*â€çš„é¡¹ç›®è¡¨ç¤ºå¯¹åº”çš„ä¸­æ–‡
%           å­—æ®µã€å¸¦â€œ*â€çš„é¡¹ç›®è¡¨ç¤ºå¯¹åº”çš„è‹±æ–‡å­—æ®µå±žäºŽè€ç”¨æ³•ï¼Œä»ç„¶å…¼å®¹ä½†è¯·åŠæ—¶æ›´æ–°
%           è‡³æ–°ç”¨æ³•ï¼›å„æ&nbsp;‡é¢˜é¡µä¸­çš„ä¿¡æ¯è¡¨æ&nbsp;¼ä¼šæ&nbsp;¹æ®è®¾å®šä¿¡æ¯çš„é¡ºåºè¿›è¡Œæ˜¾ç¤ºä¸ŽæŽ’åˆ—ï¼Œ
%           æœªè®¾ç½®çš„ä¿¡æ¯å°†ä¸ä¼šæ˜¾ç¤ºï¼Œä½†åœ¨ç›²å®¡æ¨¡å¼å¼€å¯æ—¶ä¼šä¾‹å¤–åœ°å¼ºåˆ¶æ˜¾ç¤ºç›¸å…³å­—æ®µï¼Œ
%           ä¸­æ–‡æ&nbsp;‡é¢˜é¡µä¼šå¼ºåˆ¶æ˜¾ç¤º \texttt{info/zh} ä¸­çš„ \texttt{author, id,
%           supervisor, assoc_supervisor, co_supervisor, department, major, degree}
%           å­—æ®µï¼Œå…¶ä»–è¯­è¨€æ&nbsp;‡é¢˜é¡µä¼šå¼ºåˆ¶æ˜¾ç¤º \texttt{info/&lt;lang&gt;} ä¸­çš„
%           \texttt{author, supervisor, assoc_supervisor, co_supervisor} å­—æ®µï¼Œ
%           è¿™ç§é¡ºåºä¹Ÿæ˜¯è¿™äº›ä¿¡æ¯çš„æŽ¨èè®¾ç½®é¡ºåºã€‚
%     \item åœ¨ \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ï¼Œä¸éœ€è¦ä½¿ç”¨è¯­è¨€ä»£
%           ç&nbsp;å‰ç¼€ã€‚æ­¤æ—¶æŽ¨èç›´æŽ¥ä½¿ç”¨æ&nbsp;‡å‡†æŽ¥å£æ¥è®¾å®šè¿™äº›ä¿¡æ¯ï¼Œè¿™äº›æ&nbsp;‡å‡†æŽ¥å£ä¸å±žäºŽé”®
%           å€¼åˆ—è¡¨ï¼Œåº”å½“ç›´æŽ¥å†™åœ¨å¯¼è¨€åŒºå†…ï¼Œè§ç¬¬ \ref{sec:sjtureportcmd} èŠ‚ã€‚
%   \end{itemize}
% \end{function}
%
% \paragraph{é€‚ç”¨äºŽ \cls{sjtuthesis} æ–‡æ¡£ç±»çš„é”®}
% \label{sec:sjtuthesiskey}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/title}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{title} = \marg{æ&nbsp;‡é¢˜}
%   \end{syntax}
%   æ&nbsp;‡é¢˜ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/display-title}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{display-title} = \marg{æ&nbsp;‡é¢˜é¡µæ&nbsp;‡é¢˜}
%   \end{syntax}
%   æ&nbsp;‡é¢˜é¡µä¸­çš„é¢˜ç›®ã€‚é»˜è®¤ä¸ºè·Ÿéšå¯¹åº”è¯­è¨€çš„æ&nbsp;‡é¢˜ã€‚
%   å¦‚æžœæ&nbsp;‡é¢˜è¿‡é•¿ï¼Œå¯ä»¥å°è¯•ä½¿ç”¨â€œ|\\|â€æ‰‹åŠ¨æ–­è¡Œã€‚
% \end{function}
%
% \begin{function}[rEXP,added=2022-12-17,updated=2023-03-14]{info/&lt;lang&gt;/subject}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{subject} = \marg{ä¸»é¢˜}
%   \end{syntax}
%   æ–‡æ¡£ä¸»é¢˜ã€‚ä¸€èˆ¬æ˜¾ç¤ºåœ¨ä¸­æ–‡æ&nbsp;‡é¢˜é¡µæ&nbsp;¡å¾½ä¸‹æ–¹ã€‚
%   é»˜è®¤å€¼ç±»ä¼¼äºŽ â€œä¸Šæµ·äº¤é€šå¤§å­¦å­¦å£«å­¦ä½è®ºæ–‡â€ æˆ– â€œA Dissertation Submitted to
%   Shanghai Jiao Tong University for the Degree of Bachelorâ€ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/keywords}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{keywords} = \marg{ä¸­æ–‡å…³é”®å­—}
%   \end{syntax}
%   å…³é”®å­—åˆ—è¡¨ã€‚å„å…³é”®å­—ä¹‹é—´éœ€ä½¿ç”¨è‹±æ–‡é€—å·éš”å¼€ã€‚
%   ä¸ºé˜²æ­¢æ­§ä¹‰ï¼Œå¯ä»¥ç”¨åˆ†ç»„æ‹¬å·â€œ|{...}|â€æŠŠå„å­—æ®µæ‹¬èµ·æ¥ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/author}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{author} = \marg{å§“å}
%   \end{syntax}
%   ä½œè€…å§“åã€‚
% \end{function}
%
% \begin{function}[rEXP]{info/id}
%   \begin{syntax}
%     \OPT{id} = \marg{å­¦å·}
%   \end{syntax}
%   å­¦å·ã€‚è¯¥é”®ä¸éœ€è¦è¯­è¨€å‰ç¼€ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/supervisor,
%   info/&lt;lang&gt;/assoc-supervisor,info/&lt;lang&gt;/co-supervisor}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{supervisor}       = \marg{å¯¼å¸ˆå§“å}
%     \OPT{\meta{lang}}/\OPT{assoc-supervisor} = \marg{å‰¯å¯¼å¸ˆå§“å}
%     \OPT{\meta{lang}}/\OPT{co-supervisor}    = \marg{è”åˆå¯¼å¸ˆå§“å}
%   \end{syntax}
%   å¯¼å¸ˆã€å‰¯å¯¼å¸ˆã€è”åˆå¯¼å¸ˆå§“åã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/department}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{department} = \marg{é™¢ç³»åç§°}
%   \end{syntax}
%   é™¢ç³»åç§°ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/major}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{major} = \marg{ä¸“ä¸šåç§°}
%   \end{syntax}
%   ä¸“ä¸šåç§°ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/degree}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{degree} = \marg{å­¦ä½åç§°}
%   \end{syntax}
%   ç”³è¯·å­¦ä½ä¸­è‹±æ–‡åç§°ã€‚
%   åŒ…æ‹¬ç”³è¯·çš„å­¦ä½ç±»åˆ«å’Œçº§åˆ«ï¼Œå¦‚â€œå·¥å­¦ç¡•å£«â€ã€â€œç†å­¦åšå£«â€ç­‰ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/fund}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{fund} = \marg{èµ„åŠ©åŸºé‡‘åç§°}
%   \end{syntax}
%   èµ„åŠ©åŸºé‡‘åˆ—è¡¨ã€‚å„èµ„åŠ©åŸºé‡‘åç§°ä¹‹é—´éœ€ä½¿ç”¨è‹±æ–‡é€—å·éš”å¼€ã€‚
%   ä¸ºé˜²æ­¢æ­§ä¹‰ï¼Œå¯ä»¥ç”¨åˆ†ç»„æ‹¬å·â€œ|{...}|â€æŠŠå„å­—æ®µæ‹¬èµ·æ¥ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-02-25]{info/date}
%   \begin{syntax}
%     \OPT{date} = \marg{ISO æ—¥æœŸ}
%   \end{syntax}
%   æ—¥æœŸã€‚é»˜è®¤å€¼ä¸ºæ–‡æ¡£ç¼–è¯‘æ—¥æœŸã€‚ä¹Ÿå¯ä»¥è‡ªå·±æŒ‡å®šï¼Œè¦æ±‚ä½¿ç”¨ ISO æ&nbsp;¼å¼ï¼Œ
%   å³ |yyyy-mm-dd| æˆ– |yyyy-mm|ï¼Œå¦åˆ™è®¾å®šæ—&nbsp;æ•ˆã€‚è¯¥é”®è¯­è¨€å‰ç¼€ä¸æ˜¯å¿…é¡»çš„ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2023-03-14]{info/&lt;lang&gt;/display-date}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{display-date} = \marg{æ—¥æœŸæ–‡å­—}
%   \end{syntax}
%   æ˜¾ç¤ºæ—¥æœŸï¼Œå¯ä»¥æ˜¾ç¤ºä¸åŒäºŽæ&nbsp;‡å‡†æ—¥æœŸæ&nbsp;¼å¼çš„æ—¥æœŸï¼Œæ—¥æœŸæ–‡å­—å°†ä¼šè¢«åŽŸæ&nbsp;·è¾“å‡ºã€‚
%   è®¾å®šè¯¥é”®æ—¶ï¼Œå°†ä¼šè¦†ç›– \opt{info/date} é”®åœ¨å¯¹åº”è¯­è¨€ä¸‹çš„è®¾å®šã€‚
% \end{function}
%
% \begin{function}[rEXP,added=2025-01-14]{info/&lt;lang&gt;/custom}
%   \begin{syntax}
%     \OPT{\meta{lang}}/\OPT{custom}/\OPT{\meta{å˜é‡å}} = \marg{ç¬¬ä¸€åˆ—å†…å®¹}\marg{ç¬¬äºŒåˆ—å†…å®¹}
%   \end{syntax}
%   å¯¹åº”è¯­è¨€æ&nbsp;‡é¢˜é¡µä¿¡æ¯è¡¨æ&nbsp;¼ä¸­æ˜¾ç¤ºçš„é¢å¤–ä¿¡æ¯ï¼Œå¯ä»¥è®¾ç½®å¤šä¸ªå˜é‡ã€‚
%   éœ€è¦ä½¿ç”¨ä¸€ä¸ªå˜é‡åä½œä¸ºç´¢å¼•é”®ï¼ˆå˜é‡ååº”å½“ç”±è‹±æ–‡å­—æ¯ã€æ•°å­—ã€
%   è¿žå­—ç¬¦ \texttt{-} ç»„æˆï¼Œä¸”ç¬¬ä¸€ä¸ªä½ç½®åªèƒ½ä¸ºè‹±æ–‡å­—æ¯ï¼‰ï¼›
%   å¹¶èµ‹äºˆä¸¤ä¸ªå‚æ•°æ¥è®¾ç½®ä¿¡æ¯è¡¨æ&nbsp;¼ä¸­ä¸¤åˆ—çš„å†…å®¹ï¼š
%   é€šå¸¸ç¬¬ä¸€åˆ—ä½œä¸ºè¯¥ä¿¡æ¯çš„å±žæ€§åç§°ä¼šè¢«åŠ&nbsp;ç²—ï¼Œç¬¬äºŒåˆ—ä½œä¸ºè¯¥ä¿¡æ¯çš„å†…å®¹ã€‚
%   è¯¥ä¿¡æ¯ä¼šæ&nbsp;¹æ®åœ¨ \cmd{\sjtusetup} ä¸­çš„è®¾ç½®ç›¸å¯¹ä½ç½®æ˜¾ç¤ºåœ¨å¯¹åº”çš„ä½ç½®ä¸Šã€‚
%   å½“ \opt{review} é€‰é¡¹å¼€å¯æ—¶ï¼Œè¯¥é€‰é¡¹çš„è®¾ç½®ä¸ä¼šç”Ÿæ•ˆã€‚
% \end{function}
%
% \paragraph{é€‚ç”¨äºŽ \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»çš„å‘½ä»¤}
% \label{sec:sjtureportcmd}
%
% \begin{function}[EXP,added=2022-12-17,updated=2023-03-14]{\title}
%   \begin{syntax}
%     \TNA{title}\marg{æ&nbsp;‡é¢˜}
%   \end{syntax}
%   è®¾ç½®æ&nbsp;‡é¢˜ï¼Œè¦†ç›– \opt{info/title} é”®çš„å€¼ã€‚
% \end{function}
%
% \begin{function}[EXP,added=2022-12-17,updated=2023-03-14]{\author}
%   \begin{syntax}
%     \TNA{author}\marg{å§“å}
%   \end{syntax}
%   è®¾ç½®ä½œè€…å§“åï¼Œè¦†ç›– \opt{info/author} é”®çš„å€¼ã€‚
% \end{function}
%
% \begin{function}[EXP,added=2022-12-17,updated=2023-03-14]{\date}
%   \begin{syntax}
%     \TNA{date}\marg{æ—¥æœŸ}
%   \end{syntax}
%   è®¾ç½®æ—¥æœŸï¼Œè¦†ç›– \opt{info/display-date} é”®çš„å€¼ã€‚
%   æ—¥æœŸä¼šè¢«åŽŸæ&nbsp;·æ˜¾ç¤ºã€‚
% \end{function}
%
% \begin{function}[EXP,added=2023-03-14]{\subject}
%   \begin{syntax}
%     \TNA{subject}\marg{ä¸»é¢˜}
%   \end{syntax}
%   æ–‡æ¡£ä¸»é¢˜ã€‚è¦†ç›– \opt{info/subject} é”®çš„å€¼ã€‚
% \end{function}
%
% \begin{function}[EXP,added=2023-03-14]{\keywords}
%   \begin{syntax}
%     \TNA{keywords}\marg{å…³é”®è¯}
%   \end{syntax}
%   æ–‡æ¡£å…³é”®è¯ï¼Œä½¿ç”¨è‹±æ–‡é€—å·éš”å¼€ä¸åŒçš„å…³é”®è¯ã€‚è¦†ç›– \opt{info/keywords} é”®çš„å€¼ã€‚
% \end{function}
%
% \subsubsection{æ&nbsp;·å¼åŸŸ}
%
% \begin{function}{style}
%   \begin{syntax}
%     \OPS{style} = \marg{é”®å€¼åˆ—è¡¨}
%   \end{syntax}
%   è¯¥é€‰é¡¹åŒ…å«è®¸å¤šå­é¡¹ç›®ï¼Œç”¨äºŽè®¾ç½®è®ºæ–‡æ&nbsp;·å¼ã€‚å…·ä½“å†…å®¹è§ä¸‹ã€‚
% \end{function}
%
% \begin{function}[added=2024-01-10]{style/indent-first}
%   \begin{syntax}
%     \OPT{indent-first} = &lt;(true)|false&gt;
%   \end{syntax}
%   ç«&nbsp;èŠ‚æ&nbsp;‡é¢˜åŽé¦–æ®µæ˜¯å¦ç¼©è¿›ã€‚
% \end{function}
%
% \begin{function}[added=2023-11-30]{style/equation-font}
%   \begin{syntax}
%     \OPT{equation-font} = \marg{å­—ä½“è®¾ç½®}
%   \end{syntax}
%   è¡Œé—´æ•°å­¦å…¬å¼çš„å­—ä½“è®¾ç½®ï¼Œè¯¥é€‰é¡¹ä¸»è¦ç”¨äºŽè°ƒæ•´è¡Œé—´å…¬å¼çš„è¡Œè·ï¼Œ
%   ä¸å»ºè®®ä¿®æ”¹å­—å·å­—å½¢ã€‚
%   \cls{sjtuthesis} ä¸­é»˜è®¤æ•°å­¦å…¬å¼çš„è¡Œè·ä¸ºå­—å·çš„ 1.2 å€ã€‚
% \end{function}
%
% \begin{function}[added=2022-12-03,updated=2022-12-27]{style/float-font}
%   \begin{syntax}
%     \OPT{float-font} = \marg{å­—ä½“è®¾ç½®}
%   \end{syntax}
%   å›¾ã€è¡¨ç­‰æµ®åŠ¨ä½“çš„é¢å¤–å­—ä½“è®¾ç½®ã€‚
%   é»˜è®¤ä¸º |\zihao{5}|ï¼Œäº”å·å­—ã€‚
% \end{function}
%
% \begin{function}[added=2022-12-20]{style/caption-font}
%   \begin{syntax}
%     \OPT{caption-font} = \marg{å­—ä½“è®¾ç½®}
%   \end{syntax}
%   é¢˜æ³¨å­—ä½“ã€‚
%   é»˜è®¤ä¸º |\zihao{5}\bfseries|ï¼Œç²—ä½“äº”å·å­—ã€‚
% \end{function}
%
% \begin{function}[added=2022-12-20]{style/subcaption-font}
%   \begin{syntax}
%     \OPT{subcaption-font} = \marg{å­—ä½“è®¾ç½®}
%   \end{syntax}
%   å­å›¾é¢˜æ³¨å­—ä½“ã€‚
%   é»˜è®¤ä¸º |\zihao{5}\normalfont|ï¼Œæ­£å¸¸å­—é‡äº”å·å­—ã€‚
% \end{function}
%
% \begin{function}[added=2024-03-21]{style/theorem-header-font}
%   \begin{syntax}
%     \OPT{theorem-header-font} = \marg{å­—ä½“è®¾ç½®}
%   \end{syntax}
%   å®šç†å¤´ï¼ˆå³æ&nbsp;‡é¢˜ï¼‰å­—ä½“ã€‚
%   é»˜è®¤ä¸º |\bfseries\CJKsffamily|ï¼Œé»‘ä½“åŠ&nbsp;ç²—ã€‚
% \end{function}
%
% \begin{function}[added=2024-03-21]{style/theorem-body-font}
%   \begin{syntax}
%     \OPT{theorem-body-font} = \marg{å­—ä½“è®¾ç½®}
%   \end{syntax}
%   å®šç†å†…å®¹å­—ä½“ã€‚
%   é»˜è®¤ä¸º |\normalfont|ï¼Œå’Œæ­£æ–‡å­—ä½“ç›¸åŒã€‚
% \end{function}
%
% \begin{function}[added=2023-03-28]{style/fnmark-style}
%   \begin{syntax}
%     \OPT{fnmark-style} = &lt;plain|circled&gt;
%   \end{syntax}
%   è„šæ³¨æ•°å­—ç¼–å·æ&nbsp;·å¼ã€‚
%   \opt{plain} è¡¨ç¤ºä½¿ç”¨æ™®é€šæ•°å­—ç¼–å·ï¼›
%   \opt{circled} è¡¨ç¤ºä½¿ç”¨å¸¦åœˆæ•°å­—ç¼–å·ã€‚
%   åœ¨ \opt{zh} å’Œ \opt{ja} è¯­è¨€è®¾ç½®ä¸­ï¼Œé»˜è®¤ä¸º \opt{circled}ï¼›
%   åœ¨ \opt{en} å’Œ \opt{de} è¯­è¨€è®¾ç½®ä¸­ï¼Œé»˜è®¤ä¸º \opt{plain}ã€‚
%
%   ä½¿ç”¨å¸¦åœˆæ•°å­—ç¼–å·æ—¶ï¼Œç”±äºŽè¶…è¿‡ 50 çš„å¸¦åœˆæ•°å­—æ²¡æœ‰å¯¹åº”çš„ Unicode ç&nbsp;ä½ï¼Œ
%   æ‰€ä»¥æ¯é¡µè„šæ³¨æœ€å¥½ä¸è¦è¶…è¿‡ 50 ä¸ªã€‚
%   å¸¦åœˆæ•°å­—é»˜è®¤ä½¿ç”¨ CJK å­—ä½“ã€‚é€šå¸¸æƒ…å†µä¸‹é»˜è®¤å­—ä½“ä¸ä¸€å®šåŒ…å«æ‰€æœ‰å¸¦åœˆæ•°å­—çš„å­—ç¬¦ï¼Œ
%   æ­¤æ—¶å¯ä»¥è®¾ç½® \opt{fnmark-font} é€‰é¡¹ç»™å¸¦åœˆæ•°å­—è®¾ç½®åˆé€‚çš„å­—ä½“ã€‚
% \end{function}
%
% \begin{function}[added=2022-12-03,updated=2023-03-28]{style/fnmark-font}
%   \begin{syntax}
%     \OPT{fnmark-font} = &lt;haranoaji|\marg{å­—ä½“è®¾ç½®}&gt;
%   \end{syntax}
%   è„šæ³¨ç¼–å·çš„é¢å¤–å­—ä½“è®¾ç½®ã€‚
%   é»˜è®¤ä¸ºç©ºã€‚
%   å¯ä»¥ä½¿ç”¨é¢„è®¾ \opt{haranoaji}ï¼Œæ”¯æŒåœ¨ Unicode å¼•æ“Žä¸­ä½¿ç”¨ HaranoAjiMincho å­—ä½“
%   ä¸­çš„å¸¦åœˆæ•°å­—ã€‚
% \end{function}
%
% \begin{function}[added=2023-12-02]{style/num-sep}
%   \begin{syntax}
%     \OPT{num-sep} = \marg{åˆ†éš”ç¬¦}
%   \end{syntax}
%   å›¾ã€è¡¨ã€å…¬å¼ä»¥åŠå®šç†ç¼–å·ä¸­çš„åˆ†éš”ç¬¦ã€‚è¯¥é€‰é¡¹å°†ç»Ÿä¸€è®¾å®š \opt{float-num-sep}ã€
%   \opt{equation-num-sep}ã€\opt{theorem-num-sep} é€‰é¡¹ã€‚
%   ç”¨æˆ·ä¹Ÿå¯ä»¥é€é¡¹ä¿®æ”¹ç¼–å·åˆ†éš”ç¬¦ã€‚
%   é»˜è®¤ä¸º \opt{.} å¥ç‚¹ã€‚
% \end{function}
%
% \begin{function}[updated=2023-11-29]{style/float-num-sep}
%   \begin{syntax}
%     \OPT{float-num-sep} = \marg{åˆ†éš”ç¬¦}
%   \end{syntax}
%   å›¾ã€è¡¨ç­‰æµ®åŠ¨ä½“ç¼–å·ä¸­çš„åˆ†éš”ç¬¦ã€‚
% \end{function}
%
% \begin{function}[updated=2023-11-29]{style/equation-num-sep}
%   \begin{syntax}
%     \OPT{equation-num-sep} = \marg{åˆ†éš”ç¬¦}
%   \end{syntax}
%   å…¬å¼ç¼–å·ä¸­çš„åˆ†éš”ç¬¦ã€‚
% \end{function}
%
% \begin{function}[added=2023-12-02]{style/theorem-num-sep}
%   \begin{syntax}
%     \OPT{theorem-num-sep} = \marg{åˆ†éš”ç¬¦}
%   \end{syntax}
%   å®šç†ç¼–å·ä¸­çš„åˆ†éš”ç¬¦ã€‚
% \end{function}
%
% \begin{function}[added=2022-12-20,updated=2023-03-14]{style/header-uppercase}
%   \begin{syntax}
%     \OPT{header-uppercase} = &lt;true|(false)&gt;
%   \end{syntax}
%   é¡µçœ‰è‹±æ–‡å­—æ¯æ˜¯å¦å¤§å†™ã€‚é»˜è®¤ä¸º \opt{false}ã€‚
% \end{function}
%
% \begin{function}[added=2022-12-20]{style/header-font}
%   \begin{syntax}
%     \OPT{header-font} = \marg{é¡µçœ‰å­—ä½“}
%   \end{syntax}
%   é¡µçœ‰å­—ä½“ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º |\zihao{-5}|ï¼Œå°äº”å·å­—ã€‚
%     \item åœ¨ \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ï¼Œé»˜è®¤ä¸º |\zihao{-5}\sffamily|ï¼Œå°äº”å·å­—é»‘ä½“ã€‚
%   \end{itemize}
% \end{function}
%
% \begin{function}[added=2022-12-20]{style/footer-font}
%   \begin{syntax}
%     \OPT{footer-font} = \marg{é¡µè„šå­—ä½“}
%   \end{syntax}
%   é¡µè„šå­—ä½“ã€‚é»˜è®¤ä¸º |\zihao{-5}|ï¼Œå°äº”å·å­—ã€‚
% \end{function}
%
% \begin{function}[added=2022-12-03,updated=2024-12-30]{style/page-number}
%   \begin{syntax}
%     \OPT{page-number} = \marg{æ&nbsp;¼å¼å®šä¹‰}
%   \end{syntax}
%   è®¾ç½®é¡µç&nbsp;çš„æ˜¾ç¤ºæ&nbsp;¼å¼ï¼Œ\meta{æ&nbsp;¼å¼å®šä¹‰} æœ‰ä¸¤ä¸ªå‚æ•°ï¼šå‚æ•° |#1| æ˜¯å½“å‰é¡µç&nbsp;ï¼Œå‚æ•° |#2| æ˜¯å½“å‰ç¼–ç&nbsp;çš„æ€»é¡µç&nbsp;æ•°ã€‚
%   èŽ·å–æ€»é¡µç&nbsp;æ•°éœ€è¦ä½¿ç”¨ \pkg{pageslts} å®åŒ…ã€‚
%   é»˜è®¤ä¸º |{#1}|ï¼Œå³ä»…æ˜¾ç¤ºå½“å‰é¡µç&nbsp;ã€‚
% \end{function}
%
% \begin{function}[added=2023-11-30]{style/keywords-format}
%   \begin{syntax}
%     \OPT{keywords-format} = &lt;(plain)|hang&gt;
%   \end{syntax}
%   è®¾ç½®å…³é”®è¯æ&nbsp;¼å¼ã€‚é»˜è®¤ä¸º \opt{plain} æ—&nbsp;ç¼©è¿›çš„æ™®é€šæ®µè½ï¼Œå¦å¯é€‰ \opt{hang} æ‚¬æŒ‚æ&nbsp;¼å¼ã€‚
% \end{function}
%
% \subsubsection{åç§°åŸŸ}
%
% \begin{function}{name}
%   \begin{syntax}
%     \OPS{name} = \marg{é”®å€¼åˆ—è¡¨}
%   \end{syntax}
%   é€‰é¡¹åŒ…å«è®¸å¤šå­é¡¹ç›®ï¼Œç”¨äºŽè®¾ç½®è®ºæ–‡ä¸­ä¸€äº›æ&nbsp;‡é¢˜çš„åç§°ã€‚éƒ¨åˆ†é€‰é¡¹åªèƒ½åœ¨ \cls{sjtuthesis} ä¸­ä½¿ç”¨ã€‚
%   å…·ä½“å†…å®¹è§è¡¨ \ref{tab:names}ã€‚
% \end{function}
%
% \begin{function}[updated=2023-03-18]{name/contents,name/listfigure,name/listtable,
%   name/figure,name/table,name/abstract,name/index,name/appendix,name/proof,name/bib,
%   name/figure*,name/table*,name/algorithm,name/listalgorithm,
%   name/abbr,name/nom,name/ack,name/resume,name/digest,name/achv}
% \end{function}
%
% \begingroup
% \vspace{-48ex}
% \small \tabcolsep=3pt
% \begin{longtable}{l|p{7em}|&gt;{\raggedright\arraybackslash}p{9em}|p{11em}|p{8em}}
%   \caption{\opt{name} é€‰é¡¹çš„é»˜è®¤è®¾ç½®} \label{tab:names} \\
%   \toprule
%     \strong{é€‰é¡¹}        &amp; \strong{|lang = zh|}   &amp; \strong{|lang = en|}          &amp; \strong{|lang = de|}   &amp; \strong{|lang = ja|} \\
%   \midrule
%   \endfirsthead
%     \multicolumn{5}{r}{ç»­è¡¨~\thetable} \\
%   \toprule
%     \strong{é€‰é¡¹}        &amp; \strong{|lang = zh|}   &amp; \strong{|lang = en|}          &amp; \strong{|lang = de|}   &amp; \strong{|lang = ja|} \\
%   \midrule
%   \endhead
%     \bottomrule
%     \multicolumn{5}{r}{ç»­ä¸‹é¡µ}
%   \endfoot
%     \bottomrule
%   \endlastfoot
%     |contents|           &amp; ç›®å½•                   &amp; Contents                      &amp; Inhaltsverzeichnis     &amp; ç›®æ¬¡                 \\
%     |listfigure|         &amp; æ’å›¾                   &amp; List of Figures               &amp; Abbildungsverzeichnis  &amp; å›³ç›®æ¬¡               \\
%     |listtable|          &amp; è¡¨æ&nbsp;¼                   &amp; List of Tables                &amp; Tabellenverzeichnis    &amp; è¡¨ç›®æ¬¡               \\
%     |figure|             &amp; å›¾                     &amp; Figure                        &amp; Abbildung              &amp; å›³                   \\
%     |table|              &amp; è¡¨                     &amp; Table                         &amp; Tabelle                &amp; è¡¨                   \\
%     |abstract| \expstar  &amp; æ‘˜è¦                   &amp; Abstract                      &amp; Zusammenfassung        &amp; æ¦‚è¦                 \\
%     |index|              &amp; ç´¢å¼•                   &amp; Index                         &amp; Index                  &amp; ç´¢å¼•                 \\
%     |appendix|           &amp; é™„å½•                   &amp; Appendix                      &amp; Anhang                 &amp; ä»˜éŒ²                 \\
%     |proof|              &amp; è¯æ˜Ž                   &amp; Proof                         &amp; Beweis                 &amp; è¯æ˜Ž                 \\
%     |bib|                &amp; å‚è€ƒæ–‡çŒ®               &amp; Bibliography                  &amp; Literaturverzeichnis   &amp; å‚è€ƒæ–‡çŒ®             \\
%   \midrule
%     |figure*|            &amp; Figure                 &amp; å›¾                            &amp; Figure                 &amp; Figure               \\
%     |table*|             &amp; Table                  &amp; è¡¨                            &amp; Table                  &amp; Table                \\
%     |algorithm|          &amp; ç®—æ³•                   &amp; Algorithm                     &amp; Algorithmus            &amp; ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ&nbsp;         \\
%     |listalgorithm|      &amp; ç®—æ³•                   &amp; List of Algorithms            &amp; Algorithmenverzeichnis &amp; ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ&nbsp;ç›®æ¬¡     \\
%     |abbr| \rexpstar     &amp; ç¼©ç•¥è¯­å¯¹ç…§è¡¨           &amp; Abbreviation                  &amp; AbkÃ¼rzungsverzeichnis  &amp; ç•¥èªžè¡¨               \\
%     |nom| \rexpstar      &amp; ä¸»è¦ç¬¦å·å¯¹ç…§è¡¨         &amp; Nomenclature                  &amp; Symbolverzeichnis      &amp; è¨˜å·è¡¨               \\
%     |ack| \rexpstar      &amp; è‡´è°¢                   &amp; Acknowledgements              &amp; Danksagungen           &amp; è¬è¾ž                 \\
%     |resume| \rexpstar   &amp; ä¸ªäººç®€åŽ†               &amp; Resume                        &amp; Lebenslauf             &amp; å±¥æ­´æ›¸               \\
%     |digest| \rexpstar   &amp; å¤§æ‘˜è¦                 &amp; Digest                        &amp; Kurzfassung            &amp; è¦ç´„                 \\
%     |achv| \rexpstar     &amp; å­¦æœ¯è®ºæ–‡å’Œç§‘ç&nbsp;”æˆæžœç›®å½• &amp; List of Research Achievements &amp; Forschungsleistungen   &amp; ç&nbsp;”ç©¶æ¥­ç¸¾æ›¸           \\
% \end{longtable}
% \endgroup
%
% \section{å†…å®¹ç¼–å†™}
%
% \begin{function}{document}
%   \begin{syntax}
%     \BEV{document}
%     \  \meta{æ–‡æ¡£å†…å®¹}
%     \EEV{document}
%   \end{syntax}
%   åœ¨æ–‡æ¡£å¼€å§‹åŽè¿›è¡Œå†…å®¹ç¼–å†™ï¼Œæ–‡æ¡£å†…å®¹ç”± |document| çŽ¯å¢ƒåŒ…è£¹ã€‚
% \end{function}
%
% \subsection{ç”¨äºŽæœ¬èŠ‚çŽ¯å¢ƒæˆ–å‘½ä»¤çš„å‚æ•°}
%
% æœ¬èŠ‚æè¿°çš„éƒ¨åˆ†çŽ¯å¢ƒå’Œå‘½ä»¤æä¾› \meta{æ&nbsp;‡é¢˜å‚æ•°}ï¼Œç”¨äºŽè¿›è¡Œå±€éƒ¨çš„æ&nbsp;‡é¢˜ç›¸å…³è®¾ç½®ã€‚
% å¯ä»¥ä½¿ç”¨é€—å·åˆ†éš”çš„é€‰é¡¹åˆ—è¡¨ä½œä¸ºå¯é€‰å‚æ•°ä¼&nbsp;å…¥è¯¥çŽ¯å¢ƒï¼Œä¾‹å¦‚ï¼š
% \begin{latex}
% \begin{acknowledgements}[intoc,title={è‡ªå®šä¹‰æ&nbsp;‡é¢˜}]
% \end{acknowledgements}
% \end{latex}
%
% \begin{function}[added=2025-01-12]{intoc, notintoc}
%   æŒ‡æ˜Žè¯¥çŽ¯å¢ƒçš„å°æ&nbsp;‡é¢˜æ˜¯å¦åœ¨ç›®å½•ä¸­å‡ºçŽ°ã€‚
%   \opt{intoc} è¡¨ç¤ºå‡ºçŽ°åœ¨ç›®å½•ä¸­ï¼Œ
%   \opt{notintoc} è¡¨ç¤ºä¸å‡ºçŽ°åœ¨ç›®å½•ä¸­ã€‚
%   é»˜è®¤ \tn{mainmatter} ä¹‹å‰çš„çŽ¯å¢ƒä¸º \opt{notintoc}ï¼Œ
%   \tn{mainmatter} ä¹‹åŽçš„çŽ¯å¢ƒä¸º \opt{intoc}ã€‚
% \end{function}
%
% \begin{function}[added=2025-01-12]{title}
%   \begin{syntax}
%     \OPT{title} = \marg{å°æ&nbsp;‡é¢˜}
%   \end{syntax}
%   è®¾ç½®è¯¥çŽ¯å¢ƒçš„å°æ&nbsp;‡é¢˜ï¼Œé»˜è®¤æ˜¯å…¨å±€è¯­è¨€ä¸‹çš„å°æ&nbsp;‡é¢˜ã€‚
% \end{function}
%
% \begin{function}[added=2025-01-12]{marking}
%   \begin{syntax}
%     \OPT{marking} = \marg{ç›®å½•ä¸­çš„å°æ&nbsp;‡é¢˜}
%   \end{syntax}
%   è®¾ç½®è¯¥çŽ¯å¢ƒåœ¨ç›®å½•ä¸­çš„å°æ&nbsp;‡é¢˜ï¼Œé»˜è®¤ä¸Žå°æ&nbsp;‡é¢˜ç›¸åŒã€‚
%   åªæœ‰åœ¨è®¾ç½® \opt{intoc} å°æ&nbsp;‡é¢˜å‡ºçŽ°åœ¨ç›®å½•ä¸­æ‰ä¼šæ˜¾ç¤ºã€‚
% \end{function}
%
% éƒ¨åˆ†çŽ¯å¢ƒè¿˜æä¾›äº†å‚æ•° \opt{lang}ï¼Œç”¨äºŽè®¾ç½®çŽ¯å¢ƒçš„è¯­è¨€ã€‚
% \begin{function}[added=2025-01-12,label=]{lang}
%   \begin{syntax}
%     \OPT{lang} = &lt;(zh)|en|de|ja&gt;
%   \end{syntax}
%   è®¾ç½®è¯¥çŽ¯å¢ƒçš„å±€éƒ¨è¯­è¨€é€‰é¡¹ï¼Œé»˜è®¤ä¸Žå…¨å±€è¯­è¨€é€‰é¡¹ç›¸åŒã€‚
%   è¯¥é€‰é¡¹ä¼šè®¾ç½®è¯¥çŽ¯å¢ƒçš„å±€éƒ¨è¯­è¨€æŽ’ç‰ˆè®¾ç½®ã€‚
% \end{function}
%
% å¯¹äºŽåŒæ—¶æä¾›äº† \meta{æ&nbsp;‡é¢˜å‚æ•°} å’Œ \opt{lang} å‚æ•°çš„çŽ¯å¢ƒï¼ŒäºŒè€…å¯ä»¥ä¸€åŒä½¿ç”¨ï¼Œä¾‹å¦‚ï¼š
% \begin{latex}
% \begin{abstract}[lang=en,intoc,title={è‡ªå®šä¹‰æ&nbsp;‡é¢˜},marking={ç›®å½•ä¸­çš„æ&nbsp;‡é¢˜}]
% \end{abstract}
% \end{latex}
%
% \subsection{æ&nbsp;‡é¢˜é¡µå’Œå£°æ˜Žé¡µ}
%
% \begin{function}[updated=2022-12-03]{\maketitle}
%   \begin{syntax}
%     \TNA{maketitle}
%   \end{syntax}
%   ç”Ÿæˆæ&nbsp;‡é¢˜ã€‚
%   \begin{itemize}
%     \item åœ¨ \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼Œç”Ÿæˆæ&nbsp;‡é¢˜é¡µã€‚
%     \item åœ¨ \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»ä¸­ï¼Œ
%           \begin{itemize}
%             \item è‹¥å¤„äºŽ \opt{titlepage} æ–‡æ¡£ç±»é€‰é¡¹ä¸­ï¼Œç”Ÿæˆæ&nbsp;‡é¢˜é¡µã€‚\cls{sjtureport} æ–‡æ¡£ç±»é»˜è®¤ã€‚
%             \item è‹¥å¤„äºŽ \opt{notitlepage} æ–‡æ¡£ç±»é€‰é¡¹ä¸­ï¼Œç”Ÿæˆæ&nbsp;‡é¢˜å—ã€‚\cls{sjtuarticle} æ–‡æ¡£ç±»é»˜è®¤ã€‚
%           \end{itemize}
%   \end{itemize}
% \end{function}
%
% \begin{function}[rEXP,updated=2025-03-22]{\copyrightpage}
%   \begin{syntax}
%     \TNA{copyrightpage}
%     \TNA{copyrightpage}\oarg{file=æŽˆæƒä¹¦æ‰«æä»¶,variant=&lt;a|b&gt;,é¢å¤–é€‰é¡¹}
%   \end{syntax}
%   ç”Ÿæˆç©ºç™½ç‰ˆæƒä½¿ç”¨æŽˆæƒä¹¦ã€‚
%   æŽ¥å—å¯é€‰å‚æ•° \opt{file} ç”¨äºŽæ’å…¥ç‰ˆæƒä½¿ç”¨æŽˆæƒä¹¦æ‰«æä»¶ï¼Œæ’å…¥å¤–ç½® PDF é¡µæ—¶éœ€è¦æ‰‹åŠ¨åŠ&nbsp;è½½ \pkg{pdfpages} å®åŒ…ã€‚
%   æŽ¥å—å¯é€‰å‚æ•° \opt{variant} ç”¨äºŽé€‰æ‹©ç‰ˆæƒä½¿ç”¨æŽˆæƒä¹¦çš„æ–‡æœ¬å˜ç§ï¼Œ\opt{a} ä¸ºç¡•å£«åŠåšå£«å­¦ä½è®ºæ–‡çš„é»˜è®¤å˜ç§ï¼Œ\opt{b} ä¸ºå­¦å£«å­¦ä½è®ºæ–‡çš„é»˜è®¤å˜ç§ã€‚
%   é¢å¤–é€‰é¡¹å°†ä¼&nbsp;é€’ç»™ \tn{includepdf} å‘½ä»¤ã€‚
% \end{function}
%
% \subsection{å‰æ–‡éƒ¨åˆ†}
%
% \begin{function}[rEXP]{\frontmatter}
%   \begin{syntax}
%     \TNB{frontmatter}
%   \end{syntax}
%   å£°æ˜Žå‰æ–‡éƒ¨åˆ†å¼€å§‹ã€‚
% \end{function}
%
% \begin{function}[updated=2024-12-20]{abstract}
%   \begin{syntax}
%     \BEV{abstract}\oarg{lang=&lt;(zh)|en|de|ja&gt;,æ&nbsp;‡é¢˜å‚æ•°}
%     \  \meta{\textup{\cls{sjtuthesis}} ä¸­çš„æ‘˜è¦}
%     \EEV{abstract}
%     \BEV{abstract}
%     \  \meta{\textup{\cls{sjtuarticle}} å’Œ \textup{\cls{sjtureport}} ä¸­çš„æ‘˜è¦}
%     \EEV{abstract}
%   \end{syntax}
%   æ‘˜è¦çŽ¯å¢ƒã€‚ä¼šåœ¨ç»“å°¾æ·»åŠ&nbsp;å…³é”®è¯ã€‚
%   \begin{itemize}
%     \item \cls{sjtuthesis} æ–‡æ¡£ç±»ä¸­ï¼Œå¯ä»¥è®¾ç½®å¯é€‰å‚æ•°ï¼Œ
%           æŒ‡å®šæ‘˜è¦çš„å±€éƒ¨è¯­è¨€ä¼šåŒæ­¥æ›´æ”¹å°æ&nbsp;‡é¢˜ä¸ºå¯¹åº”è¯­è¨€è®¾ç½®ã€‚
%     \item \cls{sjtuarticle} å’Œ \cls{sjtureport} æ–‡æ¡£ç±»ä¸­ï¼Œä¸è®¾ç½®å¯é€‰å‚æ•°ã€‚
%   \end{itemize}
% \end{function}
%
% \begin{function}[updated=2024-12-20]{\tableofcontents,\listoffigures,\listoftables,\listofalgorithms}
%   \begin{syntax}
%     \TNA{tableofcontents}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \TNA{listoffigures}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \TNA{listoftables}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \TNA{listofalgorithms}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%   \end{syntax}
%   ç›®å½•ã€æ’å›¾ã€è¡¨æ&nbsp;¼å’Œç®—æ³•ç­‰ç´¢å¼•å‘½ä»¤å¦‚è¡¨ \ref{tab:list} æ‰€ç¤ºï¼Œå°†å…¶æ’å…¥åˆ°æœŸæœ›çš„
%   ä½ç½®å³å¯ï¼Œè¿™äº›å‘½ä»¤å¯ä»¥ä½¿ç”¨å¯é€‰çš„ \meta{æ&nbsp;‡é¢˜å‚æ•°} æ¥è°ƒæ•´æ&nbsp;‡é¢˜ç›¸å…³è®¾ç½®ã€‚
%   \begin{table}[H]
%     \centering\small
%     \begin{threeparttable}
%       \caption{ç›®å½•å’Œç´¢å¼•è¡¨}
%       \label{tab:list}
%       \begin{tabular}{lp{4cm}lp{4cm}}
%         \toprule
%         \strong{ç”¨é€”}     &amp; \strong{å‘½ä»¤}         &amp; \strong{ç”¨é€”}     &amp; \strong{å‘½ä»¤}          \\
%         \midrule
%         ç›®å½•              &amp; \tn{tableofcontents}  &amp; æ’å›¾ç´¢å¼•          &amp; \tn{listoffigures}     \\
%         \midrule
%         è¡¨æ&nbsp;¼ç´¢å¼•          &amp; \tn{listoftables}     &amp; ç®—æ³•ç´¢å¼•\tnote{a} &amp; \tn{listofalgorithms}  \\
%         \bottomrule
%       \end{tabular}
%       \begin{tablenotes}
%         \item[a] å¯ç”¨ \pkg{algorithm2e} æˆ– \pkg{algorithm} åŽæœ‰æ•ˆã€‚
%       \end{tablenotes}
%     \end{threeparttable}
%   \end{table}
% \end{function}
%
% \subsection{æ­£æ–‡éƒ¨åˆ†}
%
% \begin{function}[rEXP]{\mainmatter}
%   \begin{syntax}
%     \TNB{mainmatter}
%   \end{syntax}
%   å£°æ˜Žæ­£æ–‡éƒ¨åˆ†å¼€å§‹ã€‚æ­£æ–‡éƒ¨åˆ†æ˜¯è®ºæ–‡çš„æ&nbsp;¸å¿ƒï¼Œæ‚¨å¯ä»¥åˆ†ç«&nbsp;èŠ‚æ’°å†™ã€‚
%   å¦‚æœ‰éœ€æ±‚ï¼Œä¹Ÿå¯ä»¥é‡‡ç”¨å¤šæ–‡ä»¶ç¼–è¯‘çš„æ–¹å¼ã€‚
% \end{function}
%
% \begin{function}[updated=2022-12-03]{\footnote}
%   \begin{syntax}
%     \TNA{footnote}\oarg{è„šæ³¨ç¼–å·}\marg{è„šæ³¨æ–‡å­—}
%   \end{syntax}
%   æ’å…¥è„šæ³¨ã€‚å…¶ä¸­è„šæ³¨ç¼–å·å‚æ•°æ˜¯å¯é€‰çš„ï¼Œä¸€èˆ¬ä¸éœ€è¦è¾“å…¥ã€‚
% \end{function}
%
% \begin{function}{assumption,axiom,conjecture,corollary,definition,example,
%   exercise,lemma,problem,proposition,theorem}
%   \sjtutex{} é¢„å®šä¹‰äº†ä¸€ç³»åˆ—æ•°å­¦çŽ¯å¢ƒï¼Œå¦‚è¡¨ \ref{tab:theorems} æ‰€ç¤ºï¼Œ
%   åœ¨å¯ç”¨ \pkg{amsthm} æˆ– \pkg{ntheorem} å®åŒ…åŽæœ‰æ•ˆã€‚
%   \begin{table}[H]
%     \centering\small
%     \caption{é¢„å®šä¹‰çš„æ•°å­¦çŽ¯å¢ƒ}
%     \label{tab:theorems}
%     \begin{tabular}{*{7}{l}}
%       \toprule
%       \env{assumption} &amp; \env{axiom}   &amp; \env{conjecture} &amp; \env{corollary}   &amp; \env{definition} &amp; \env{example}  &amp; \env{exercise} \\
%       å‡è®¾             &amp; å…¬ç†          &amp; çŒœæƒ³             &amp; æŽ¨è®º              &amp; å®šä¹‰             &amp; ä¾‹             &amp; ç»ƒä¹&nbsp;           \\
%       \midrule
%       \env{lemma}      &amp; \env{problem} &amp; \env{proof}      &amp; \env{proposition} &amp; \env{remark}     &amp; \env{solution} &amp; \env{theorem}  \\
%       å¼•ç†             &amp; é—®é¢˜          &amp; è¯æ˜Ž             &amp; å‘½é¢˜              &amp; æ³¨               &amp; è§£             &amp; å®šç†           \\
%       \bottomrule
%     \end{tabular}
%   \end{table}
% \end{function}
%
% \begin{function}[added=2023-10-24]{\setbaselineskip}
%   \begin{syntax}
%     \TNA{setbaselineskip}\marg{é•¿åº¦}
%   \end{syntax}
%   è®¾ç½®å½“å‰çš„åŸºçº¿é—´è·ï¼Œä¸€èˆ¬åœ¨å­—å·å‘½ä»¤ä¹‹åŽä½¿ç”¨ã€‚
% \end{function}
%
% \begin{function}{\appendix}
%   \begin{syntax}
%     \TNA{appendix}
%   \end{syntax}
%   é™„å½•ç”± \tn{appendix} å‘½ä»¤å¼€å¯ï¼Œç„¶åŽåƒæ­£æ–‡ä¸€æ&nbsp;·ä¹¦å†™ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2024-12-20]{nomenclature}
%   \begin{syntax}
%     \BEV{nomenclature}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \  \meta{ç¬¦å·å¯¹ç…§è¡¨}
%     \EEV{nomenclature}
%   \end{syntax}
%   ç¬¦å·å¯¹ç…§è¡¨çŽ¯å¢ƒã€‚å¯ä»¥ä½¿ç”¨ \meta{æ&nbsp;‡é¢˜å‚æ•°} æ‰‹åŠ¨è®¾ç½®æ&nbsp;‡é¢˜ã€‚
%   ç¬¦å·å¯¹ç…§è¡¨çŽ¯å¢ƒä»…è®¾ç½®æ&nbsp;‡é¢˜ï¼Œå†…éƒ¨å®žçŽ°å¯ç”±ç”¨æˆ·è‡ªè¡Œå†³å®šï¼š
%   å¯ä»¥ä½¿ç”¨ \pkg{longtable}ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨ \pkg{nomencl} å®åŒ…ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2024-12-20]{abbreviation}
%   \begin{syntax}
%     \BEV{abbreviation}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \  \meta{ç¼©ç•¥è¯­å¯¹ç…§è¡¨}
%     \EEV{abbreviation}
%   \end{syntax}
%   ç¼©ç•¥è¯­å¯¹ç…§è¡¨çŽ¯å¢ƒã€‚å¯ä»¥ä½¿ç”¨å¯é€‰å‚æ•°æ‰‹åŠ¨è®¾ç½®æ&nbsp;‡é¢˜ã€‚
%   ç¼©ç•¥è¯­å¯¹ç…§è¡¨çŽ¯å¢ƒä»…è®¾ç½®æ&nbsp;‡é¢˜ï¼Œå†…éƒ¨å®žçŽ°å¯ç”±ç”¨æˆ·è‡ªè¡Œå†³å®šã€‚
% \end{function}
%
% \subsection{åŽæ–‡éƒ¨åˆ†}
%
% \begin{function}[rEXP]{\backmatter}
%   \begin{syntax}
%     \TNB{backmatter}
%   \end{syntax}
%   å£°æ˜ŽåŽæ–‡éƒ¨åˆ†å¼€å§‹ã€‚ åŽæ–‡éƒ¨åˆ†åŒ…å«è‡´è°¢ç­‰ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2024-12-20]{acknowledgements}
%   \begin{syntax}
%     \BEV{acknowledgements}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \  \meta{è‡´è°¢å†…å®¹}
%     \EEV{acknowledgements}
%   \end{syntax}
%   è‡´è°¢çŽ¯å¢ƒã€‚ç›²å®¡æ¨¡å¼ä¸‹è‡´è°¢å°†è¢«éšåŽ»ã€‚å¯ä»¥ä½¿ç”¨ \meta{æ&nbsp;‡é¢˜å‚æ•°} æ‰‹åŠ¨è®¾ç½®æ&nbsp;‡é¢˜ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2024-12-20]{achievements}
%   \begin{syntax}
%     \BEV{achievements}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \  \meta{èŽ·å¾—çš„ç§‘ç&nbsp;”æˆæžœ}
%     \EEV{achievements}
%   \end{syntax}
%   ç§‘ç&nbsp;”æˆæžœçŽ¯å¢ƒï¼Œå¯ä»¥ä½¿ç”¨ \meta{æ&nbsp;‡é¢˜å‚æ•°} æ‰‹åŠ¨è®¾ç½®æ&nbsp;‡é¢˜ã€‚å†…éƒ¨è¯·é…åˆä½¿ç”¨ä¸‹é¢çš„é™„å½•ç”¨æ–‡çŒ®åˆ—è¡¨çŽ¯å¢ƒ
%   \env{bibliolist} å’Œ \env{bibliolist*}ã€‚ä½&nbsp;å¯ä»¥åœ¨è¯¥çŽ¯å¢ƒä¸­ä½¿ç”¨å¸¦æ˜Ÿå·çš„èŠ‚æ¬¡å‘½ä»¤
%   ä»¥åˆ†éš”ä¸åŒçš„ç±»åž‹çš„æˆæžœï¼ˆæ¯”å¦‚å­¦æœ¯è®ºæ–‡ã€ä¸“åˆ©ç­‰ï¼‰ï¼›ä½&nbsp;ä¹Ÿå¯ä»¥ä½¿ç”¨å¤šä¸ª \env{achievements}
%   çŽ¯å¢ƒï¼Œé…åˆä¸åŒçš„ \meta{æ&nbsp;‡é¢˜å‚æ•°}ï¼Œå±•ç¤ºä¸åŒç±»åž‹çš„æˆæžœã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2024-12-08]{bibliolist,bibliolist*}
%   \begin{syntax}
%     \BEV{bibliolist}\oarg{å¯é€‰å‚æ•°}\marg{æœ€é•¿æ¡ç›®ç¼–å·}
%     \  \TNA{item} \meta{æ–‡çŒ®æ¡ç›®}
%     \EEV{bibliolist}
%     \BEV{bibliolist*}\oarg{å¯é€‰å‚æ•°}\marg{æœ€é•¿æ¡ç›®ç¼–å·}
%     \  \TNA{item} \meta{æ–‡çŒ®æ¡ç›®ï¼ˆéšåŽ»å§“åï¼‰}
%     \EEV{bibliolist*}
%   \end{syntax}
%   ç”¨äºŽå±•ç¤ºç§‘ç&nbsp;”æˆæžœçš„æ–‡çŒ®åˆ—è¡¨ï¼Œæ¯”å¦‚å­¦æœ¯è®ºæ–‡ã€ä¸“åˆ©ç­‰ã€‚
%   éœ€è¦æŒ‡å®šæœ€é•¿æ¡ç›®çš„ç¼–å·ä½œä¸ºå‚æ•°ï¼Œæ¯”å¦‚ \opt{99}ï¼›
%   å¦‚æžœå°†è¯¥å¼ºåˆ¶å‚æ•°è¢«æŒ‡å®šä¸ºç©ºï¼Œå°†ä¸æ˜¾ç¤ºç¼–å·ï¼Œæ¯æ¡ä»¥æ‚¬æŒ‚ç¼©è¿›åšåŒºåˆ†ã€‚
%   å¯ä»¥ä½¿ç”¨å¯é€‰å‚æ•° \opt{resume} è®¾ç½®è¿žç»­ç¼–å·ã€‚
%   çŽ¯å¢ƒå†…éƒ¨ä½¿ç”¨ \tn{item} æ¥åˆ†éš”å„æ¡ç›®ã€‚
%   æ™®é€šæ¨¡å¼ä¸‹æ˜¾ç¤º \env{bibliolist} ä¸­çš„å†…å®¹ï¼Œç›²å®¡æ¨¡å¼ä¸‹æ˜¾ç¤º \env{bibliolist*} ä¸­çš„å†…å®¹ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2024-12-20]{resume}
%   \begin{syntax}
%     \BEV{resume}\oarg{æ&nbsp;‡é¢˜å‚æ•°}
%     \  \meta{ç®€åŽ†å†…å®¹}
%     \EEV{resume}
%   \end{syntax}
%   ç®€åŽ†çŽ¯å¢ƒã€‚ç›²å®¡æ¨¡å¼ä¸‹ç®€åŽ†å°†è¢«éšåŽ»ã€‚å¯ä»¥ä½¿ç”¨ \meta{æ&nbsp;‡é¢˜å‚æ•°} æ‰‹åŠ¨è®¾ç½®æ&nbsp;‡é¢˜ã€‚
% \end{function}
%
% \begin{function}[rEXP,updated=2024-12-20]{digest}
%   \begin{syntax}
%     \BEV{digest}\oarg{lang=&lt;zh|(en)|de|ja&gt;,æ&nbsp;‡é¢˜å‚æ•°}
%     \  \meta{å¤§æ‘˜è¦}
%     \EEV{digest}
%   \end{syntax}
%   å­¦å£«è®ºæ–‡å¤§æ‘˜è¦ï¼Œå¯ä»¥è®¾ç½®å¯é€‰å‚æ•°ï¼ŒæŒ‡å®šå¤§æ‘˜è¦çš„å±€éƒ¨è¯­è¨€ä¼šåŒæ­¥æ›´æ”¹å°æ&nbsp;‡é¢˜
%   ä¸ºå¯¹åº”è¯­è¨€è®¾ç½®ï¼Œé»˜è®¤ä¸º \opt{lang=en}ã€‚
% \end{function}
%
% \section{å®åŒ…ä¾èµ–æƒ…å†µ}
%
% ä½¿ç”¨ä¸åŒç¼–è¯‘æ–¹å¼ã€æŒ‡å®šä¸åŒé€‰é¡¹ï¼Œä¼šå¯¼è‡´å®åŒ…ä¾èµ–æƒ…å†µæœ‰æ‰€ä¸åŒã€‚
% å…·ä½“å¦‚ä¸‹ï¼š
% \begin{itemize}
%   \item åœ¨ä»»ä½•æƒ…å†µä¸‹ï¼Œæ–‡æ¡£ç±»éƒ½ä¼š\emph{æ˜¾å¼}è°ƒç”¨ä»¥ä¸‹å®åŒ…
%     ï¼ˆæˆ–æ–‡æ¡£ç±»ï¼‰ï¼š
%     \begin{itemize}
%       \item \cls{ctexbook}ã€\cls{ctexrep} å’Œ \cls{ctexart}ï¼Œ
%         æä¾›ä¸­æ–‡æŽ’ç‰ˆçš„é€šç”¨æ¡†æž¶ã€‚å±žäºŽ \CTeX{} å®é›† \cite{CTeX}ã€‚
%       \item \pkg{array}ï¼Œæä¾›è¡¨æ&nbsp;¼çŽ¯å¢ƒçš„å¢žå¼ºåŠŸèƒ½ã€‚
%       \item \pkg{mathtools}ï¼Œå¯¹ \LaTeX{} çš„æ•°å­¦æŽ’ç‰ˆåŠŸèƒ½è¿›è¡Œäº†å…¨é¢æ‰©å±•ã€‚
%         æ˜¯ \pkg{amsmath} çš„æ‰©å……ã€‚
%       \item \pkg{geometry}ï¼Œç”¨äºŽè°ƒæ•´é¡µé¢å°ºå¯¸ã€‚
%       \item \pkg{fancyhdr}ï¼Œå¤„ç†é¡µçœ‰é¡µè„šã€‚
%       \item \pkg{titletoc}ï¼Œè®¾ç½®ç›®å½•æ&nbsp;¼å¼ã€‚
%       \item \pkg{caption}ã€\cls{bicaption} å’Œ \cls{subcaption}ï¼Œç”¨äºŽè®¾ç½®é¢˜æ³¨ã€‚
%       \item \pkg{graphicx}ï¼Œæä¾›å›¾å½¢æ’å…¥çš„æŽ¥å£ã€‚
%       \item \pkg{enumitem}ï¼Œè®¾ç½®åˆ—è¡¨çŽ¯å¢ƒæ&nbsp;¼å¼ã€‚
%     \end{itemize}
%   \item éƒ¨åˆ†è¥¿æ–‡ä¸Žæ•°å­¦å­—ä½“é¢„è®¾ä¼šè°ƒç”¨ç›¸å…³çš„å­—ä½“å®åŒ…ï¼Œå…·ä½“è°ƒç”¨æƒ…å†µè¯·å‚è§å¯¹åº”çš„
%     å­—ä½“é¢„è®¾æ–‡ä»¶ã€‚
%   \item éƒ¨åˆ†æ•°å­—å­—ä½“é¢„è®¾ä¼šè°ƒç”¨ \pkg{unicode-math} å¤„ç† Unicode ç¼–ç&nbsp;çš„
%     OpenType æ•°å­¦å­—ä½“ã€‚åœ¨æœªå¯ç”¨ \pkg{unicode-math} çš„æƒ…å†µä¸‹ï¼Œä¼šè°ƒç”¨ \pkg{bm}
%     æ¥é€‰æ‹©ç²—ä½“æ•°å­¦ç¬¦å·ã€‚
%   \item å½“éœ€è¦æ˜¾ç¤ºæ€»é¡µç&nbsp;æ•°æ—¶ï¼Œä¼šè°ƒç”¨ \pkg{pageslts} å®åŒ…ã€‚
% \end{itemize}
%
% è¿™é‡Œåªåˆ—å‡ºäº†æœ¬æ¨¡æ¿ç›´æŽ¥è°ƒç”¨çš„å®åŒ…ã€‚è¿™äº›å®åŒ…è‡ªèº«çš„è°ƒç”¨æƒ…å†µï¼Œ
% æ­¤å¤„ä¸å†å…·ä½“å±•å¼€ã€‚å¦‚æœ‰éœ€è¦ï¼Œè¯·å‚é˜…ç›¸å…³æ–‡æ¡£ã€‚
%
% \begin{thebibliography}{99}
%
% \addcontentsline{toc}{section}{\refname}
%
% \newcommand\urlprefix{\newline\hspace*{\fill}}
% \let\OldUrl=\url
% \renewcommand\url[2][]{{\small\textit{#1}~\OldUrl{#2}}}
% \newcommand\CTANurl[2][]{{^^A
%   \small\textit{#1}~\href{https://mirror.ctan.org/#2}{\texttt{CTAN://#2}}}}
%
% \subsection*{å›¾ä¹¦}
%
% \bibitem{Knuth1986}
% \textsc{Knuth D E}.
% \newblock \textit{The \TeX book: Computers \&amp; Typesetting, volume A}\allowbreak[M].
% \newblock Boston: Addison--Wesley Publishing Company, 1986.
% \urlprefix \CTANurl[æºä»£ç&nbsp;^^A
%   \footnote{æ­¤ä»£ç&nbsp;åªå¯ä½œä¸ºå­¦ä¹&nbsp;ä¹‹ç”¨ã€‚æœªç» Knuth æœ¬äººåŒæ„ï¼Œæ‚¨ä¸åº”å½“ç¼–è¯‘æ­¤æ–‡æ¡£ã€‚}ï¼š]^^A
%   {systems/knuth/dist/tex/texbook.tex}
%
% \bibitem{MittelbachF2023}
% \textsc{Mittelbach F} and \textsc{Fischer U}.
% \newblock \textit{The \LaTeX{} Companion}\allowbreak[M].
% \newblock 3rd ed.
% \newblock Boston: Addison--Wesley Publishing Company, 2023.
%
% \bibitem{LiuHY2013}
% åˆ˜æµ·æ´‹.
% \newblock \textit{\LaTeX{} å…¥é—¨}\allowbreak[M].
% \newblock åŒ—äº¬: ç”µå­å·¥ä¸šå‡ºç‰ˆç¤¾, 2013.
%
% \subsection*{æ&nbsp;‡å‡†ã€è§„èŒƒ}
%
% \bibitem{gb-t-7713.1-2006}
% å›½åŠ¡é™¢å­¦ä½å§”å‘˜ä¼šåŠžå…¬å®¤, å…¨å›½ä¿¡æ¯ä¸Žæ–‡çŒ®æ&nbsp;‡å‡†åŒ–æŠ€æœ¯å§”å‘˜ä¼š.
% \newblock \textit{å­¦ä½è®ºæ–‡ç¼–å†™è§„åˆ™: GB/T 7713.1--2006}\allowbreak[S].
% \newblock åŒ—äº¬: ä¸­å›½æ&nbsp;‡å‡†å‡ºç‰ˆç¤¾, 2007.
%
% \bibitem{cy-t-35-2001}
% å…¨å›½ä¿¡æ¯ä¸Žæ–‡çŒ®æ&nbsp;‡å‡†åŒ–æŠ€æœ¯å§”å‘˜ä¼šç¬¬ä¸ƒåˆ†å§”å‘˜ä¼š, ä¸­åŽäººæ°‘å…±å’Œå›½æ–°é—»å‡ºç‰ˆæ€»ç½².
% \newblock \textit{ç§‘æŠ€æ–‡çŒ®çš„ç«&nbsp;èŠ‚ç¼–å·æ–¹æ³•: CY/T 35--2001}\allowbreak[S].
% \newblock [S.l. : s.n.], 2001.
%
% \bibitem{SJTUGS2023}
% ä¸Šæµ·äº¤é€šå¤§å­¦ç&nbsp;”ç©¶ç”Ÿé™¢.
% \newblock \textit{ä¸Šæµ·äº¤é€šå¤§å­¦åšå£«ã€ç¡•å£«å­¦ä½è®ºæ–‡æ’°å†™æŒ‡å—}\allowbreak[EB/OL].
% \newblock (2023-11-03)[2023-12-04].
% \urlprefix\url{https://www.gs.sjtu.edu.cn/post/detail/Z3MxNDc=}
%
% \subsection*{å®åŒ…ã€æ¨¡ç‰ˆ}
%
% \bibitem{source2e}
% \textsc{Braams J}, \textsc{Carlisle D}, \textsc{Jeffrey A}, et~al.
% \newblock \textit{The \LaTeXe{} Sources}\allowbreak[CP/OL].
% \newblock (2024-11-01).
% \urlprefix\url{https://ctan.org/pkg/latex}
% \urlprefix\CTANurl[æºä»£ç&nbsp;ï¼š]{macros/latex/base/source2e.pdf}
%
% \bibitem{interface3}
% \textsc{The \LaTeX{} Project}.
% \newblock \textit{The \LaTeXiii{} Interfaces}\allowbreak[EB/OL].
% \newblock (2024-11-02).
% \urlprefix\url{https://ctan.org/pkg/l3kernel}
% \urlprefix\CTANurl[æ–‡æ¡£ï¼š]{macros/latex/l3kernel/interface3.pdf}
%
% \bibitem{CTeX}
% \textsc{CTEX.ORG}.
% \newblock \textit{\CTeX{} å®é›†æ‰‹å†Œ}\allowbreak[EB/OL].
% \newblock version 2.5.10,
% \newblock (2022-07-14).
% \urlprefix\url{https://ctan.org/pkg/ctex}
% \urlprefix\CTANurl[æ–‡æ¡£åŠæºä»£ç&nbsp;ï¼š]{language/chinese/ctex/ctex.pdf}
%
% \bibitem{zhlineskip}
% å¼&nbsp;ç‘žç†¹.
% \newblock \textit{zhlineskip å®åŒ…}\allowbreak[EB/OL].
% \newblock version 1.0e,
% \newblock (2019-05-15).
% \urlprefix\url{https://ctan.org/pkg/zhlineskip}
% \urlprefix\CTANurl[æ–‡æ¡£ï¼š]{language/chinese/zhlineskip/zhlineskip.pdf}
%
% \bibitem{fduthesis}
% æ›¾ç¥¥ä¸œ.
% \newblock \textit{fduthesis: å¤æ—¦å¤§å­¦è®ºæ–‡æ¨¡æ¿}\allowbreak[EB/OL].
% \newblock version 0.9a,
% \newblock (2023-05-27).
% \urlprefix\url{https://ctan.org/pkg/fduthesis}
% \urlprefix\CTANurl[æ–‡æ¡£åŠæºä»£ç&nbsp;ï¼š]{macros/latex/contrib/fduthesis/fduthesis-code.pdf}
%
% \bibitem{thuthesis}
% æ¸…åŽå¤§å­¦ TUNA åä¼š.
% \newblock \textit{\textsc{ThuThesis}ï¼šæ¸…åŽå¤§å­¦å­¦ä½è®ºæ–‡æ¨¡æ¿}\allowbreak[EB/OL].
% \newblock version 7.5.2,
% \newblock (2025-07-01).
% \urlprefix\url{https://ctan.org/pkg/thuthesis}
% \urlprefix\CTANurl[æ–‡æ¡£åŠæºä»£ç&nbsp;ï¼š]{macros/latex/contrib/thuthesis/thuthesis.pdf}
%
% \end{thebibliography}
%
% \end{documentation}
%
% \begin{implementation}
%
% \clearpage
% \section{ä»£ç&nbsp;å®žçŽ°}
%
% \changes{v2.1}{2023/12/05}{åŒæ­¥ \LaTeX{} 2020-10-01ï¼Œæ—&nbsp;éœ€æ˜¾å¼è°ƒç”¨
% \pkg{expl3} å’Œ \pkg{xparse} å®åŒ…ã€‚}
% \changes{v2.2}{2024/11/22}{åŒæ­¥ \LaTeX{} 2024-06-01ï¼Œæ—&nbsp;éœ€æ˜¾å¼è°ƒç”¨
% \pkg{xtemplate} å®åŒ…ã€‚}
% \changes{v2.2}{2025/02/10}{é‡å‘½åè§†è§‰å½¢è±¡ç³»ç»Ÿæ–‡ä»¶åç§°ã€‚}
% æœ¬æ¨¡æ¿ä½¿ç”¨ \LaTeXiii{} è¯­æ³•ç¼–å†™ï¼Œä¾èµ– \pkg{expl3} çŽ¯å¢ƒï¼Œ
% å¹¶éœ€è°ƒç”¨ \pkg{l3packages} ä¸­çš„ç›¸å…³å®åŒ…ã€‚
%
% \subsection{å‰ç½®å‡†å¤‡}
%
% ç›®å‰ \pkg{sjtutex} æ–‡æ¡£ç±»ä»…æ”¯æŒ \XeLaTeX{}ã€\LuaLaTeX{} å’Œ \pdfLaTeX{} ç¼–è¯‘ã€‚
%    \begin{macrocode}
%&lt;@@=sjtu&gt;
%&lt;*class&gt;
\msg_new:nnn { sjtutex } { unsupported-engine }
  {
    The~sjtutex~classes~does~NOT~support~'#1'~engine. \\\\
    Please~set~your~typesetting~program~to~either~
    'xelatex'~or~'lualatex'.
  }
\bool_lazy_any:nF
  {
    { \sys_if_engine_xetex_p:  }
    { \sys_if_engine_luatex_p: }
    { \sys_if_engine_pdftex_p: }
  }
  { \msg_fatal:nnV { sjtutex } { unsupported-engine } \c_sys_engine_str }
%    \end{macrocode}
%
% \subsection{å†…éƒ¨å®šä¹‰}
%
% \begin{variable}{\l_@@_tmp_tl,\l_@@_tmp_clist,\l_@@_tmp_box}
% ä¸´æ—¶å˜é‡ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_tmp_tl
\clist_new:N \l_@@_tmp_clist
%&lt;thesis&gt;\box_new:N \l_@@_tmp_box
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\clist_use:Nv,\clist_use:cv,
% \exp_args:NNnv,\exp_last_unbraced:ce}
% \LaTeX3{} å‡½æ•°å˜ä½“ã€‚
%    \begin{macrocode}
\cs_generate_variant:Nn \clist_use:Nn { Nv, cv }
\exp_args_generate:n { Nnv }
\cs_generate_variant:Nn \exp_last_unbraced:Ne { ce }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_conditional_const:nn}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_conditional_const:nn #1#2
  {
    \bool_if:nTF {#2}
      {
        \cs_new_eq:cN { @@_if_ #1 :T  } \use:n
        \cs_new_eq:cN { @@_if_ #1 :F  } \use_none:n
        \cs_new_eq:cN { @@_if_ #1 :TF } \use_i:nn
        \cs_new_eq:cN { @@_if_ #1 _p: } \c_true_bool
      }
      {
        \cs_new_eq:cN { @@_if_ #1 :T  } \use_none:n
        \cs_new_eq:cN { @@_if_ #1 :F  } \use:n
        \cs_new_eq:cN { @@_if_ #1 :TF } \use_ii:nn
        \cs_new_eq:cN { @@_if_ #1 _p: } \c_false_bool
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int,pTF]{\@@_if_engine_opentype:}
%    \begin{macrocode}
\@@_conditional_const:nn { engine_opentype }
  {
    \bool_lazy_or_p:nn
      { \sys_if_engine_xetex_p:  }
      { \sys_if_engine_luatex_p: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_disable_package_load:n}
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { package-disabled }
  { The~loading~of~package~'#1'~is~disabled. }
\cs_new_protected:Npn \@@_disable_package_load:n #1
  {
    \disable@package@load {#1}
      { \msg_warning:nnn { sjtutex } { package-disabled } {#1} }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0.2}{2023/03/31}{åŒºåˆ† \texttt{dim} ä¸Ž \texttt{skip} ç±»åž‹å˜é‡ã€‚}
% \begin{macro}[int]{\@@_dim_set_to_wd:Nn}
% æ“ä½œé•¿åº¦å˜é‡çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\cs_new:Npn \@@_dim_set_to_wd:Nn #1#2
  {
    \hbox_set:Nn \l_@@_tmp_box {#2}
    \dim_set:Nn #1 { \box_wd:N \l_@@_tmp_box }
  }
\cs_generate_variant:Nn \@@_dim_set_to_wd:Nn { Nv }
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_cs_provide_eq:NN}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_cs_provide_eq:NN #1#2
  { \cs_if_exist:NF #1 { \cs_set_eq:NN #1 #2 } }
\cs_generate_variant:Nn \@@_cs_provide_eq:NN { cc }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_name_set:nnn,\@@_name_const:nnn,
% \@@_name_const_from_clist:nnnn}
% å®šä¹‰é»˜è®¤åç§°çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_name_set:nnn #1#2#3
  { \tl_set:cn   { l_@@_name_ #2 _ #1 _tl } {#3} }
\cs_new_protected:Npn \@@_name_const:nnn #1#2#3
  { \tl_const:cn { c_@@_name_ #2 _ #1 _tl } {#3} }
%&lt;*thesis&gt;
\cs_new_protected:Npn \@@_name_const_from_clist:nnnn #1#2#3#4
  { \tl_const:ce { c_@@_name_ #2 _ #1 _tl } { \clist_item:nn {#4} {#3} } }
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsection{æ–‡æ¡£é€‰é¡¹}
%
% \begin{variable}{\g_@@_thesis_type_int}
% è®ºæ–‡ç±»åž‹ã€‚
%    \begin{macrocode}
%&lt;thesis&gt;\int_new:N \g_@@_thesis_type_int
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_lang_tl,\g_@@_lang_clist}
% è®ºæ–‡ä¸»è¦è¯­è¨€ã€‚
%    \begin{macrocode}
\tl_new:N \g_@@_lang_tl
%&lt;thesis&gt;\clist_set:Nn \g_@@_lang_clist { zh, en }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_baseline_skip_dim,\g_@@_fixed_baselineskip_bool}
% å›ºå®šè¡Œè·ã€‚
%    \begin{macrocode}
\dim_new:N \g_@@_baseline_skip_dim
\bool_new:N \g_@@_fixed_baselineskip_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_text_font_tl,\g_@@_math_font_tl,\g_@@_cjk_font_tl}
% å­—ä½“é…ç½®ã€‚
%    \begin{macrocode}
\tl_new:N \g_@@_text_font_tl
\tl_new:N \g_@@_math_font_tl
\tl_new:N \g_@@_cjk_font_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_slanted_uppercase_greek_bool}
% å¤§å†™å¸Œè…Šå­—æ¯çš„æ­£/æ–œä½“ã€‚
%    \begin{macrocode}
\bool_new:N \g_@@_slanted_uppercase_greek_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_upright_integral_bool}
% ç§¯åˆ†å·çš„æ­£/æ–œä½“ã€‚
%    \begin{macrocode}
\bool_new:N \g_@@_upright_integral_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_integral_limits_bool}
% ç§¯åˆ†å·ä¸Šä¸‹é™çš„ä½ç½®ã€‚
%    \begin{macrocode}
\bool_new:N \g_@@_integral_limits_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_math_font_options_clist}
% ä¼&nbsp;å…¥æ•°å­¦å­—ä½“å®åŒ…çš„é€‰é¡¹åˆ—è¡¨ã€‚
%    \begin{macrocode}
\clist_new:N \g_@@_math_font_options_clist
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_review_bool}
% ç›²å®¡æ¨¡å¼ã€‚
%    \begin{macrocode}
%&lt;thesis&gt;\bool_new:N \g_@@_review_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_options_to_ctex_class_clist}
% ä¿å­˜ç”± \pkg{sjtutex} ä¼&nbsp;å…¥ \pkg{ctex} æ–‡æ¡£ç±»çš„é€‰é¡¹åˆ—è¡¨ã€‚
% é»˜è®¤ \pkg{ctex} æ–‡æ¡£ç±»çš„é€‰é¡¹ï¼š
% ä½¿ç”¨ UTF8 ç¼–ç&nbsp;ï¼Œä¸è°ƒæ•´åŸºç¡€ç±»çš„ç‰ˆå¼ä»¥åŠä¸è½½å…¥ \pkg{ctex} å­—ä½“é¢„è®¾é…ç½®ã€‚
% \cls{sjtuthesis} å’Œ \cls{sjtureport} æ–‡æ¡£ç±»é»˜è®¤å­—å·ä¸ºå°å››å·ã€‚
% \cls{sjtureport} å’Œ \cls{sjtuarticle} æ–‡æ¡£ç±»é»˜è®¤ä½¿ç”¨ 1.3 è¡Œè·å€æ•°ã€‚
%    \begin{macrocode}
\clist_set:Nn \g_@@_options_to_ctex_class_clist
  {
    UTF8,
%&lt;!article&gt;    zihao = -4,
%&lt;!thesis&gt;    linespread = 1.3,
    scheme = plain,
    fontset = none
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_options_to_packages_clist}
% ä¿å­˜ç”±ä¼&nbsp;å…¥å…¶ä»–å®åŒ…çš„é€‰é¡¹åˆ—è¡¨ã€‚
%    \begin{macrocode}
\clist_set:Nn \g_@@_options_to_packages_clist
  {
    { no-math           } { fontspec     } ,
    { list = off        } { bicaption    } ,
    { warnings-off =
      {
        mathtools-overbracket,
        mathtools-colon
      }
    }                     { unicode-math } ,
%&lt;!article&gt;    { chapter           } { algorithm    } ,
%&lt;!article&gt;    { algochapter       } { algorithm2e  } ,
    { amsmath, thmmarks } { ntheorem     }
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\@@_set_deprecated_option:n}
% å¯¹è¿‡æ—¶é€‰é¡¹ç»™å‡ºè­¦å‘Šã€‚
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { deprecated-option }
  { Option~'\l_keys_key_str'~is~deprecated! \\ #1 }
\cs_new_protected:Npn \@@_set_deprecated_option:n #1
  {
    \msg_warning:nnn { sjtutex } { deprecated-option } { Option~'#1'~is~set. }
    \keys_set:nn { sjtu / option } {#1}
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { unsupported-option }
  { Option~'\l_keys_key_str'~is~not~supported! \\ Will~be~ignored. }
%    \end{macrocode}
%
% å®šä¹‰ |sjtu/option| é”®å€¼ç±»ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / option }
  {
%    \end{macrocode}
%
% \changes{v2.0}{2022/10/25}{\cls{sjtuthesis} ç±»åž‹é€‰é¡¹ç§»é™¤ \opt{course}ï¼Œ
% ä¸å†æ”¯æŒè¯¾ç¨‹è®ºæ–‡ã€‚}
% \begin{macro}{type}
% è®ºæ–‡ç±»åž‹ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
    type .choice: ,
    type .value_required:n = true ,
    type .choices:nn =
      { bachelor, master, doctor }
      { \int_gset_eq:NN \g_@@_thesis_type_int \l_keys_choice_int } ,
    type .initial:n = { master } ,
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0}{2023/03/19}{è¯­è¨€é€‰é¡¹æ–°å¢ž \opt{ja}ï¼Œæ·»åŠ&nbsp;æ—¥æ–‡æ¨¡æ¿ã€‚}
% \changes{v2.0}{2023/03/23}{è¯­è¨€é€‰é¡¹æ–°å¢ž \opt{de}ï¼Œæ·»åŠ&nbsp;å¾·æ–‡æ¨¡æ¿ã€‚}
% \begin{macro}{lang}
% è®ºæ–‡ä¸»è¦è¯­è¨€ã€‚
%    \begin{macrocode}
    lang .choice: ,
    lang .value_required:n = true ,
    lang .choices:nn =
      { zh, en, de, ja }
      {
        \tl_gset_eq:NN \g_@@_lang_tl \l_keys_choice_tl
%&lt;*thesis&gt;
        \clist_if_in:NnF \g_@@_lang_clist {#1}
          { \clist_gput_right:Nn \g_@@_lang_clist {#1} }
%&lt;/thesis&gt;
      } ,
    lang .initial:n = { zh } ,
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0}{2022/12/03}{æ·»åŠ&nbsp; \opt{lineskip} æ–‡æ¡£ç±»é€‰é¡¹ã€‚}
% \changes{v2.1}{2023/10/24}{æ·»åŠ&nbsp; \opt{baselineskip} æ–‡æ¡£ç±»é€‰é¡¹ï¼Œ
% æ›¿æ¢åŽŸ \opt{lineskip} é€‰é¡¹ã€‚}
% \begin{macro}{baselineskip}
% æ­£æ–‡åŸºçº¿é—´è·ã€‚
%    \begin{macrocode}
    baselineskip .choice: ,
    baselineskip .value_required:n = true ,
    baselineskip / false   .code:n =
      { \bool_gset_false:N \g_@@_fixed_baselineskip_bool } ,
    baselineskip / unknown .code:n =
      {
        \bool_gset_true:N  \g_@@_fixed_baselineskip_bool
        \dim_gset:Nn \g_@@_baseline_skip_dim {#1}
      } ,
%&lt;thesis&gt;    baselineskip .initial:n = { 20 bp } ,
%&lt;!thesis&gt;    baselineskip .initial:n = { false } ,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{text-font,math-font,cjk-font}
% å­—ä½“é…ç½®ã€‚
%    \begin{macrocode}
    text-font .tl_gset:N = \g_@@_text_font_tl ,
    text-font .initial:n = { newtx } ,
    math-font .tl_gset:N = \g_@@_math_font_tl ,
    cjk-font  .tl_gset:N = \g_@@_cjk_font_tl ,
%    \end{macrocode}
% \end{macro}
%
% \opt{fontset} ç­‰æ˜¯è¿‡æ—¶é€‰é¡¹ã€‚
%    \begin{macrocode}
    fontset    .code:n = { \@@_set_deprecated_option:n { cjk-font = #1 } } ,
    nofonts    .code:n = { \@@_set_deprecated_option:n { cjk-font = none } } ,
    adobefonts .code:n = { \@@_set_deprecated_option:n { cjk-font = adobe } } ,
    winfonts   .code:n = { \@@_set_deprecated_option:n { cjk-font = windows } } ,
%    \end{macrocode}
%
% \changes{v2.0}{2023/01/05}{æ·»åŠ&nbsp; \opt{math-style} æ–‡æ¡£ç±»é€‰é¡¹ï¼Œé»˜è®¤å€¼ä¸º \opt{ISO}ã€‚}
% \begin{macro}{math-style}
% æ•°å­¦ç¬¦å·æ&nbsp;·å¼ã€‚
%    \begin{macrocode}
    math-style .choice: ,
    math-style .value_required:n = true,
    math-style / TeX .code:n =
      {
        \bool_gset_false:N \g_@@_slanted_uppercase_greek_bool
        \bool_gset_false:N \g_@@_upright_integral_bool
        \bool_gset_false:N \g_@@_integral_limits_bool
      } ,
    math-style / ISO .code:n =
      {
        \bool_gset_true:N \g_@@_slanted_uppercase_greek_bool
        \bool_gset_true:N \g_@@_upright_integral_bool
        \bool_gset_true:N \g_@@_integral_limits_bool
      } ,
    math-style .initial:n = { ISO } ,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{uppercase-greek}
% å¤§å†™å¸Œè…Šå­—æ¯çš„æ­£/æ–œä½“ã€‚
%    \begin{macrocode}
    uppercase-greek .choice: ,
    uppercase-greek .value_required:n = true ,
    uppercase-greek / slanted .code:n =
      { \bool_gset_true:N  \g_@@_slanted_uppercase_greek_bool } ,
    uppercase-greek / upright .code:n =
      { \bool_gset_false:N \g_@@_slanted_uppercase_greek_bool } ,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{integral}
% ç§¯åˆ†å·çš„æ­£/æ–œä½“ã€‚
%    \begin{macrocode}
    integral .choice: ,
    integral .value_required:n = true ,
    integral / slanted .code:n =
      { \bool_gset_false:N \g_@@_upright_integral_bool } ,
    integral / upright .code:n =
      { \bool_gset_true:N  \g_@@_upright_integral_bool } ,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{integral-limits}
% ç§¯åˆ†å·ä¸Šä¸‹é™çš„ä½ç½®ã€‚
%    \begin{macrocode}
    integral-limits .choice: ,
    integral-limits .value_required:n = true ,
    integral-limits / false .code:n =
      { \bool_gset_false:N \g_@@_integral_limits_bool } ,
    integral-limits / true  .code:n =
      { \bool_gset_true:N  \g_@@_integral_limits_bool } ,
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{review}
% ç›²å®¡æ¨¡å¼ã€‚
%    \begin{macrocode}
%&lt;thesis&gt;    review .bool_gset:N = \g_@@_review_bool ,
%&lt;thesis&gt;    review .initial:n = false ,
%    \end{macrocode}
% \end{macro}
%
% å°†æœªçŸ¥é€‰é¡¹ä¼&nbsp;ç»™æ&nbsp;‡å‡†æ–‡æ¡£ç±»ã€‚
%    \begin{macrocode}
    unknown .code:n =
      { \clist_gput_right:No \g_@@_options_to_ctex_class_clist { \CurrentOption } }
  }
%    \end{macrocode}
%
% å±è”½ä¸æ”¯æŒçš„ \pkg{ctex} é€‰é¡¹ã€‚
%    \begin{macrocode}
\clist_map_inline:nn
  { GBK, scheme, cap, nocap }
  {
    \keys_define:nn { sjtu / option }
      {
        #1 .code:n =
          { \msg_warning:nn { sjtutex } { unsupported-option } }
      }
  }
%    \end{macrocode}
%
% å°†æ–‡æ¡£ç±»é€‰é¡¹ä¼&nbsp;ç»™ |sjtu/option|ã€‚
%    \begin{macrocode}
\ProcessKeyOptions [ sjtu / option ]
%    \end{macrocode}
%
% \begin{macro}[int,pTF]{\@@_if_main_lang_de:,\@@_if_main_lang_ja:}
% å¿«æ·åˆ¤æ–­ä¸»è¦è¯­è¨€ã€‚
%    \begin{macrocode}
\@@_conditional_const:nn { main_lang_de }
  { \str_if_eq_p:Vn \g_@@_lang_tl { de } }
\@@_conditional_const:nn { main_lang_ja }
  { \str_if_eq_p:Vn \g_@@_lang_tl { ja } }
%    \end{macrocode}
% \end{macro}
%
% æ•°å­—å­—ä½“å®åŒ…é€‰é¡¹ã€‚
%    \begin{macrocode}
\bool_if:NT \g_@@_slanted_uppercase_greek_bool
  { \clist_put_right:Nn \g_@@_math_font_options_clist { slantedGreek } }
\bool_if:NT \g_@@_upright_integral_bool
  { \clist_put_right:Nn \g_@@_math_font_options_clist { upint } }
%    \end{macrocode}
%
% è¿½åŠ&nbsp;é€‰é¡¹ã€‚
%    \begin{macrocode}
\clist_put_left:Nn \@classoptionslist { a4paper }
\@@_if_main_lang_de:T
  { \clist_put_right:Nn \@classoptionslist { german, ngerman } }
\bool_if:NTF \g_@@_integral_limits_bool
  {
    \clist_put_right:Nn \@classoptionslist { intlimits }
    \clist_put_right:Nn \g_@@_options_to_packages_clist
      { { displaylimits } { cmupint } }
  }
  {
    \clist_put_right:Nn \g_@@_options_to_packages_clist
      { { nolimits      } { cmupint } }
  }
\clist_concat:NNN \@classoptionslist
  \@classoptionslist \g_@@_math_font_options_clist
%    \end{macrocode}
%
% å†…éƒ¨è®¾ç½®æŽ¥å£ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\cs_set_protected:Npe \@@_setup:n
  {
    \bool_if:NTF \g_@@_review_bool
      { \exp_not:N \keys_set_exclude_groups:nnn { sjtu } { sensitive } }
      { \exp_not:N \keys_set:nn { sjtu } }
  }
%&lt;/thesis&gt;
%    \end{macrocode}
%
%
% \subsection{è½½å…¥å®åŒ…ã€æ–‡æ¡£ç±»}
%
% å°†é€‰é¡¹ä¼&nbsp;å…¥ \pkg{ctex} æ–‡æ¡£ç±»ã€‚
%    \begin{macrocode}
\exp_args:No \PassOptionsToClass
  { \g_@@_options_to_ctex_class_clist }
%&lt;thesis&gt;  { ctexbook }
%&lt;report&gt;  { ctexrep }
%&lt;article&gt;  { ctexart }
%    \end{macrocode}
%
% ä¼&nbsp;å…¥å„å®åŒ…é€‰é¡¹ã€‚
%    \begin{macrocode}
\clist_map_inline:Nn \g_@@_options_to_packages_clist
  { \PassOptionsToPackage #1 }
%    \end{macrocode}
%
% è½½å…¥ \pkg{ctex} æ–‡æ¡£ç±»ã€‚
% åœ¨ä½¿ç”¨ \XeLaTeX{} ç¼–è¯‘æ—¶ï¼Œ\pkg{ctex} çš„åº•å±‚å°†è°ƒç”¨ \pkg{xeCJK}
% å®åŒ…ï¼›è€Œåœ¨ä½¿ç”¨ \LuaLaTeX{} ç¼–è¯‘æ—¶ï¼Œåˆ™å°†è°ƒç”¨ \pkg{LuaTeX-ja} å®åŒ…ã€‚
% ä¸¤ç§æƒ…å†µä¸‹ \pkg{ctex} å‡ä¼šè°ƒç”¨ \pkg{fontspec} å®åŒ…ã€‚
%    \begin{macrocode}
%&lt;thesis&gt;\LoadClass { ctexbook }
%&lt;report&gt;\LoadClass { ctexrep }
%&lt;article&gt;\LoadClass { ctexart }
%    \end{macrocode}
%
% \changes{v2.2.1}{2025/03/27}{ä¸å†è‡ªåŠ¨è½½å…¥ \pkg{xcolor} å®åŒ…ã€‚}
% è½½å…¥å„å®åŒ…ã€‚
%    \begin{macrocode}
\RequirePackage
  {
    array,
    mathtools,
    geometry,
    fancyhdr,
    titletoc,
    caption,
    bicaption,
    subcaption,
    graphicx,
    enumitem
  }
%    \end{macrocode}
%
% \subsection{æ–‡æ¡£æ&nbsp;¼å¼}
%
% \subsubsection{å­—å·è¡Œè·}
%
% \begin{macro}[int]{\SJTU@orig@normalsize}
% ä¿å­˜åŽŸå§‹ \tn{normalsize} å­—å·å¤§å°ã€‚
%    \begin{macrocode}
\normalsize
\cs_set_protected:Npe \SJTU@orig@normalsize
  { \exp_not:N \fontsize { \f@size } { \f@baselineskip } \exp_not:N \selectfont }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_set_font_size:nnNn}
% \begin{macro}{\normalsize}
% é‡å®šä¹‰ \tn{normalsize}ï¼Œè®¾ç½®æ­£æ–‡çš„åŸºçº¿é—´è·ã€‚
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { baselineskip-invalid }
  { Invalid~baselineskip~value~'#1'! \\ Using~default~value~instead. }
\cs_new_protected:Npn \@@_set_font_size:nnNn #1#2#3#4
  { \cs_set_protected:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
\bool_if:NT \g_@@_fixed_baselineskip_bool
  {
    \dim_compare:nNnTF { \f@size pt } &gt; { \g_@@_baseline_skip_dim }
      {
        \msg_warning:nne { sjtutex } { baselineskip-invalid }
          { \dim_to_decimal:n { \g_@@_baseline_skip_dim } pt }
      }
      {
        \tl_set:Ne \l_@@_font_size_tl
          { { \f@size } { \dim_to_decimal:n { \g_@@_baseline_skip_dim } } }
        \int_case:nn { \@ptsize }
          {
            { 0 }
              {
                \exp_after:wN \@@_set_font_size:nnNn \l_@@_font_size_tl
                  \normalsize
                  {
                    \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
                    \abovedisplayshortskip \z@ \@plus3\p@
                    \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
                    \belowdisplayskip \abovedisplayskip
                    \let\@listi\@listI
                  }
              }
            { 1 }
              {
                \exp_after:wN \@@_set_font_size:nnNn \l_@@_font_size_tl
                  \normalsize
                  {
                    \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
                    \abovedisplayshortskip \z@ \@plus3\p@
                    \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
                    \belowdisplayskip \abovedisplayskip
                    \let\@listi\@listI
                  }
              }
            { 2 }
              {
                \exp_after:wN \@@_set_font_size:nnNn \l_@@_font_size_tl
                  \normalsize
                  {
                    \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
                    \abovedisplayshortskip \z@ \@plus3\p@
                    \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
                    \belowdisplayskip \abovedisplayskip
                    \let\@listi\@listI
                  }
              }
          }
        \normalsize
      }
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\setbaselineskip}
% è®¾ç½®åŸºçº¿é—´è·ï¼Œåœ¨å­—å·å‘½ä»¤ä¹‹åŽä½¿ç”¨ã€‚
%    \begin{macrocode}
\NewDocumentCommand \setbaselineskip { m }
  { \fontsize { \f@size } {#1} \selectfont }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{å­—ä½“é…ç½®}
%
% \begin{macro}[int]{\@@_fontset_error:nn}
% å­—åº“ä¸å¯ç”¨æ—¶ç»™å‡ºç´§æ€¥é”™è¯¯ä¿¡æ¯ï¼Œåœæ­¢è¯»å–å®šä¹‰æ–‡ä»¶ã€‚
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { font-unavailable }
  { '#1-font~=~#2'~is~unavailable~in~current~mode. }
\cs_new_protected:Npn \@@_fontset_error:nn #1#2
  { \msg_critical:nnnn { sjtutex } { font-unavailable } {#1} {#2} }
\cs_set_protected:Npn \ctex_fontset_error:n #1
  { \msg_critical:nnnn { sjtutex } { font-unavailable } { cjk } {#1} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_declare_math_symbol:nnNn}
%    \begin{macrocode}
\cs_new_protected:Nn \@@_declare_math_symbol:nnNn
  {
    \cs_undefine:N #3
    \DeclareMathSymbol {#3} {#1} {#2} {#4}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_set_slanted_greek:}
%    \begin{macrocode}
\cs_new_protected:Nn \@@_set_slanted_greek:
  {
    \clist_const:Nn \c_@@_uppercase_greek_clist
      { Gamma, Delta, Theta, Lambda, Xi, Pi, Sigma, Upsilon, Phi, Psi, Omega }
    \clist_map_inline:Nn \c_@@_uppercase_greek_clist
      {
        \cs_set_eq:cc { up ##1 } {     ##1 }
        \cs_set_eq:cc { it ##1 } { var ##1 }
      }
    \bool_if:NT \g_@@_slanted_uppercase_greek_bool
      {
        \clist_map_inline:Nn \c_@@_uppercase_greek_clist
          { \cs_set_eq:cc { ##1 } { it ##1 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_set_unimath_symbol:}
%    \begin{macrocode}
\cs_new_protected:Nn \@@_set_unimath_symbol:
  {
    \clist_map_inline:nn
      {
        { increment } { upDelta     } ,
        { QED       } { blacksquare }
      }
      { \@@_cs_provide_eq:cc ##1 }
  }
%    \end{macrocode}
% \end{macro}
%
% å¦‚æžœæ²¡æœ‰æŒ‡å®šæ•°å­¦å­—ä½“ï¼Œåˆ™æ&nbsp;¹æ®è¥¿æ–‡å­—ä½“è®¾ç½®åŒ¹é…çš„æ•°å­—å­—ä½“ã€‚
%    \begin{macrocode}
\tl_if_empty:NT \g_@@_math_font_tl
  { \tl_gset_eq:NN \g_@@_math_font_tl \g_@@_text_font_tl }
%    \end{macrocode}
%
% æ&nbsp;¹æ®æ“ä½œç³»ç»Ÿåˆ¤æ–­é»˜è®¤ CJK å­—ä½“é…ç½®ã€‚
%    \begin{macrocode}
\tl_if_empty:NT \g_@@_cjk_font_tl
  {
    \sys_if_platform_windows:TF
      { \tl_gset:Nn \g_@@_cjk_font_tl { windows } }
      {
        \ctex_if_platform_macos:TF
          { \tl_gset:Nn \g_@@_cjk_font_tl { mac    } }
          { \tl_gset:Nn \g_@@_cjk_font_tl { fandol } }
      }
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\@@_load_font:nn,\@@_load_fontset:}
% å¦‚æžœå­—ä½“é…ç½®æ–‡ä»¶ä¸å­˜åœ¨ï¼Œåˆ™è½½å…¥é»˜è®¤å€¼ï¼Œå¹¶ç»™å‡ºè­¦å‘Šã€‚
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { invalid-font }
  {
    Invalid~value~'#1-font~=~\tl_use:c { g_@@_ #1 _font_tl }'! \\
    Using~'#2'~instead.
  }
\cs_new_protected:Npn \@@_load_font:nn #1#2
  {
    \str_if_eq:vnF { g_@@_ #1 _font_tl } { none }
      {
        \file_if_exist:nF
          { sjtu- #1 -font- \tl_use:c { g_@@_ #1 _font_tl } .def }
          {
            \msg_warning:nnnn { sjtutex } { invalid-font } {#1} {#2}
            \tl_gset:cn { g_@@_ #1 _font_tl } {#2}
          }
        \ctex_file_input:n
          { sjtu- #1 -font- \tl_use:c { g_@@_ #1 _font_tl } .def }
      }
  }
\cs_new_protected:Nn \@@_load_fontset:
  {
    \clist_map_inline:nn
      {
        { math } { newtx  },
        { text } { newtx  },
        { cjk  } { fandol }
      }
      { \@@_load_font:nn ##1 }
  }
\@onlypreamble \@@_load_font:nn
\@onlypreamble \@@_load_fontset:
%&lt;/class&gt;
%    \end{macrocode}
% \end{macro}
%
% \paragraph{è¥¿æ–‡ä¸Žæ•°å­¦å­—ä½“}
%
% \changes{v2.0.3}{2023/09/25}{æ–°å¢ž \opt{libertinus} å­—ä½“é…ç½®ã€‚}
%    \begin{macrocode}
%&lt;*font&amp;(math|text)&gt;
%&lt;*math&amp;type1&gt;
%&lt;*newtx|newpx&gt;
\tl_set_eq:NN \l_@@_save_encodingdefault_tl \encodingdefault
\tl_set_eq:NN \l_@@_save_rmdefault_tl \rmdefault
\tl_set_eq:NN \l_@@_save_sfdefault_tl \sfdefault
\tl_set_eq:NN \l_@@_save_ttdefault_tl \ttdefault
\tl_set:Nn \encodingdefault { OT1 }
%&lt;newtx&gt;\tl_set:Nn \rmdefault { ntxtlf }
%&lt;newpx&gt;\tl_set:Nn \rmdefault { zplTLF }
\tl_set:Nn \qhv@scale { 0.94 }
\tl_set:Nn \sfdefault { qhv }
\tl_set:Nn \ttdefault { qcr }
%&lt;newtx&gt;\RequirePackage { newtxmath }
%&lt;newpx&gt;\RequirePackage { newpxmath }
\tl_set_eq:NN \encodingdefault \l_@@_save_encodingdefault_tl
\tl_set_eq:NN \rmdefault \l_@@_save_rmdefault_tl
\tl_set_eq:NN \sfdefault \l_@@_save_sfdefault_tl
\tl_set_eq:NN \ttdefault \l_@@_save_ttdefault_tl
%&lt;/newtx|newpx&gt;
%&lt;times&gt;\PassOptionsToPackage { Symbol } { upgreek }
%&lt;lm|times&gt;\RequirePackage { amssymb, upgreek }
%&lt;*lm&gt;
\SetSymbolFont { operators    } { normal } { OT1 } { lmr  } { m  } { n  }
\SetSymbolFont { letters      } { normal } { OML } { lmm  } { m  } { it }
\SetSymbolFont { symbols      } { normal } { OMS } { lmsy } { m  } { n  }
\SetSymbolFont { largesymbols } { normal } { OMX } { lmex } { m  } { n  }
\SetSymbolFont { operators    } { bold   } { OT1 } { lmr  } { bx } { n  }
\SetSymbolFont { letters      } { bold   } { OML } { lmm  } { b  } { it }
\SetSymbolFont { symbols      } { bold   } { OMS } { lmsy } { b  } { n  }
\SetSymbolFont { largesymbols } { bold   } { OMX } { lmex } { m  } { n  }
\SetMathAlphabet { \mathbf } { normal } { OT1 } { lmr  } { bx } { n  }
\SetMathAlphabet { \mathsf } { normal } { OT1 } { lmss } { m  } { n  }
\SetMathAlphabet { \mathit } { normal } { OT1 } { lmr  } { m  } { it }
\SetMathAlphabet { \mathtt } { normal } { OT1 } { lmtt } { m  } { n  }
\SetMathAlphabet { \mathbf } { bold   } { OT1 } { lmr  } { bx } { n  }
\SetMathAlphabet { \mathsf } { bold   } { OT1 } { lmss } { bx } { n  }
\SetMathAlphabet { \mathit } { bold   } { OT1 } { lmr  } { bx } { it }
\SetMathAlphabet { \mathtt } { bold   } { OT1 } { lmtt } { m  } { n  }
\@@_set_slanted_greek:
%&lt;/lm&gt;
%&lt;*times&gt;
\tl_set_eq:NN \l_@@_save_rmdefault_tl \rmdefault
  \RequirePackage { mathptmx }
\tl_set_eq:NN \rmdefault \l_@@_save_rmdefault_tl
\tl_set:Nn \Hv@scale { 0.94 }
\DeclareMathAlphabet { \mathsf } { OT1 } { phv } { m } { n }
\DeclareMathAlphabet { \mathtt } { OT1 } { pcr } { m } { n }
\SetMathAlphabet { \mathsf } { bold } { OT1 } { phv } { b } { n }
\SetMathAlphabet { \mathtt } { bold } { OT1 } { pcr } { b } { n }
\DeclareSymbolFont { SJTU@ptm } { OML } { ptmcm } { m } { it }
\@@_declare_math_symbol:nnNn { \mathord } { SJTU@ptm } \upvarsigma { "26 }
%&lt;/times&gt;
%&lt;lm|times&gt;\bool_if:NT \g_@@_upright_integral_bool
%&lt;lm|times&gt;  { \RequirePackage { cmupint } }
\@@_set_unimath_symbol:
%&lt;/math&amp;type1&gt;
%&lt;*!(math&amp;type1)&gt;
%&lt;lm&gt;\@@_if_engine_opentype:F
%&lt;*!lm&gt;
\@@_if_engine_opentype:TF
  {
%&lt;*math&gt;
    \RequirePackage { unicode-math }
%&lt;*stixtwo&gt;
    \bool_if:NTF \g_@@_upright_integral_bool
      {
        \setmathfont { STIXTwoMath-Regular.otf }
          [ StylisticSet = 8 ]
      }
      { \setmathfont { STIXTwoMath-Regular.otf } }
    \setmathfont { STIXTwoMath-Regular.otf }
      [
        range        = { scr, bfscr },
        StylisticSet = 1
      ]
%&lt;/stixtwo&gt;
%&lt;*libertinus&gt;
    \bool_if:NTF \g_@@_upright_integral_bool
      { \setmathfont { LibertinusMath-Regular.otf } }
      {
        \setmathfont { LibertinusMath-Regular.otf }
          [ StylisticSet = 8 ]
      }
    \setmathfont { latinmodern-math.otf } [ range = \checkmark ]
%&lt;/libertinus&gt;
%&lt;cambria&gt;    \setmathfont { Cambria~Math }
%&lt;*newcm&gt;
    \bool_if:NTF \g_@@_upright_integral_bool
      {
        \setmathfont { NewCMMath-Book.otf }
          [ StylisticSet = 2 ]
      }
      { \setmathfont { NewCMMath-Book.otf } }
    \setmathfont { NewCMMath-Book.otf }
      [
        range        = { scr, bfscr },
        StylisticSet = 1
      ]
%&lt;/newcm&gt;
%&lt;*xits&gt;
    \bool_if:NTF \g_@@_upright_integral_bool
      {
        \setmathfont { XITSMath-Regular }
          [
            Extension    = .otf,
            BoldFont     = XITSMath-Bold,
            StylisticSet = 8
          ]
      }
      {
        \setmathfont { XITSMath-Regular }
          [
            Extension    = .otf,
            BoldFont     = XITSMath-Bold,
          ]
      }
    \setmathfont { XITSMath-Regular.otf }
      [
        range        = { cal, bfcal },
        StylisticSet = 1
      ]
%&lt;/xits&gt;
%&lt;/math&gt;
%&lt;*newtx|newpx|stixtwo|xits&gt;
%&lt;math&gt;    \setmathrm
%&lt;text&gt;    \setmainfont
%&lt;newtx&gt;      { TeXGyreTermesX }
%&lt;newpx&gt;      { TeXGyrePagellaX }
%&lt;stixtwo&gt;      { STIXTwoText }
%&lt;xits&gt;      { XITS }
      [
        Extension      = .otf,
        UprightFont    = *-Regular,
        BoldFont       = *-Bold,
        ItalicFont     = *-Italic,
        BoldItalicFont = *-BoldItalic
      ]
%&lt;math&gt;    \setmathsf
%&lt;text&gt;    \setsansfont
      { texgyreheros }
      [
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-italic,
        BoldItalicFont = *-bolditalic,
        Scale          = 0.94
      ]
%&lt;math&gt;    \setmathtt
%&lt;text&gt;    \setmonofont
      { texgyrecursor }
      [
        Extension      = .otf,
        UprightFont    = *-regular,
        BoldFont       = *-bold,
        ItalicFont     = *-italic,
        BoldItalicFont = *-bolditalic,
        Ligatures      = CommonOff
      ]
%&lt;/newtx|newpx|stixtwo|xits&gt;
%&lt;*text&amp;times&gt;
    \setmainfont { Times~New~Roman } [ Ligatures = Rare ]
    \setsansfont { Arial } [ Scale = 0.94 ]
    \setmonofont { Courier~New }
%&lt;/text&amp;times&gt;
%&lt;*libertinus&gt;
%&lt;math&gt;    \setmathrm
%&lt;text&gt;    \setmainfont
      { LibertinusSerif }
      [
        Extension           = .otf,
        UprightFont         = *-Regular,
        BoldFont            = *-Bold,
        ItalicFont          = *-Italic,
        BoldItalicFont      = *-BoldItalic,
        SlantedFont         = *-Regular,
        BoldSlantedFont     = *-Bold,
        SlantedFeatures     = { FakeSlant = 0.2 },
        BoldSlantedFeatures = { FakeSlant = 0.2 }
      ]
%&lt;math&gt;    \setmathsf
%&lt;text&gt;    \setsansfont
      { LibertinusSans }
      [
        Extension           = .otf,
        UprightFont         = *-Regular,
        BoldFont            = *-Bold,
        ItalicFont          = *-Italic,
        BoldItalicFont      = *-Italic,
        BoldItalicFeatures  = { FakeBold  = 3   },
        SlantedFont         = *-Regular,
        BoldSlantedFont     = *-Bold,
        SlantedFeatures     = { FakeSlant = 0.2 },
        BoldSlantedFeatures = { FakeSlant = 0.2 }
      ]
%&lt;/libertinus&gt;
%&lt;*cambria&gt;
%&lt;*math&gt;
    \setmathrm { Cambria }
    \setmathsf { Calibri }
    \setmathtt { Consolas } [ Scale = 0.95 ]
%&lt;/math&gt;
%&lt;*text&gt;
    \setmainfont { Cambria }
    \setsansfont { Calibri }
    \setmonofont { Consolas } [ Scale = 0.95 ]
%&lt;/text&gt;
%&lt;/cambria&gt;
%&lt;*newcm&gt;
%&lt;math&gt;    \setmathrm
%&lt;text&gt;    \setmainfont
      { NewCM10 }
      [
        Extension    = .otf,
        SizeFeatures =
          {
            {
              Size        = -9,
              Font        = NewCM08-Book,
              ItalicFont  = NewCM08-BookItalic,
              SlantedFont = NewCM08-Book,
            },
            { Size        = 9- }
          },
        UprightFont         = *-Book,
        BoldFont            = *-Bold,
        ItalicFont          = *-BookItalic,
        BoldItalicFont      = *-BoldItalic,
        SlantedFont         = *-Book,
        SlantedFeatures     = { FakeSlant = 0.25 },
        BoldSlantedFont     = *-Bold,
        BoldSlantedFeatures = { FakeSlant = 0.25 }
      ]
%&lt;math&gt;    \setmathsf
%&lt;text&gt;    \setsansfont
      { NewCMSans10 }
      [
        Extension    = .otf,
        SizeFeatures =
          {
            {
              Size       = -9,
              Font       = NewCMSans08-Book,
              ItalicFont = NewCMSans08-BookOblique,
            },
            { Size       = 9- }
          },
        UprightFont    = *-Book,
        BoldFont       = *-Bold,
        ItalicFont     = *-BookOblique,
        BoldItalicFont = *-BoldOblique
      ]
%&lt;math&gt;    \setmathtt
%&lt;text&gt;    \setmonofont
      { NewCMMono10 }
      [
        Extension           = .otf,
        UprightFont         = *-Book,
        BoldFont            = *-Bold,
        ItalicFont          = *-BookItalic,
        BoldItalicFont      = *-BoldOblique,
        SlantedFont         = *-Book,
        SlantedFeatures     = { FakeSlant = 0.25 },
        BoldSlantedFont     = *-Bold,
        BoldSlantedFeatures = { FakeSlant = 0.25 }
      ]
%&lt;/newcm&gt;
  }
%&lt;/!lm&gt;
%&lt;*text&amp;!otf&gt;
  {
    \tl_set:Nn \encodingdefault { T1 }
%&lt;lm&gt;    \tl_set:Nn \rmdefault { lmr  }
%&lt;lm&gt;    \tl_set:Nn \sfdefault { lmss }
%&lt;libertinus&gt;    \tl_set:Nn \rmdefault { LibertinusSerif-TLF }
%&lt;libertinus&gt;    \tl_set:Nn \sfdefault { LibertinusSans-TLF  }
%&lt;lm|libertinus&gt;    \tl_set:Nn \ttdefault { lmtt }
%&lt;newtx&gt;    \PassOptionsToPackage { nohelv, nott } { newtxtext }
%&lt;newpx&gt;    \PassOptionsToPackage { nohelv, nott } { newpxtext }
%&lt;newtx&gt;    \RequirePackage { newtxtext }
%&lt;newpx&gt;    \RequirePackage { newpxtext }
%&lt;*stixtwo&gt;
    \DeclareEncodingSubset { TS1 } { ? } { 0 }
    \UndeclareTextCommand { \textpertenthousand } { T1 }
    \DeclareTextSymbolDefault { \textpertenthousand } { TS1 }
    \tl_set:Nn \rmdefault { stix2 }
%&lt;/stixtwo&gt;
%&lt;newtx|newpx|stixtwo&gt;    \tl_set:Nn \qhv@scale { 0.94 }
%&lt;newtx|newpx|stixtwo&gt;    \tl_set:Nn \sfdefault { qhv }
%&lt;newtx|newpx|stixtwo&gt;    \tl_set:Nn \ttdefault { qcr }
%&lt;*times&gt;
    \tl_set:Nn \rmdefault { ptm }
    \tl_set:Nn \Hv@scale { 0.94 }
    \tl_set:Nn \sfdefault { phv }
    \tl_set:Nn \ttdefault { pcr }
%&lt;/times&gt;
  }
%&lt;/text&amp;!otf&gt;
%&lt;*text&amp;otf&gt;
%&lt;cambria&gt;  { \@@_fontset_error:nn { text } { cambria } }
%&lt;newcm&gt;  { \@@_fontset_error:nn { text } { newcm } }
%&lt;xits&gt;  { \@@_fontset_error:nn { text } { xits } }
%&lt;/text&amp;otf&gt;
%&lt;*math&amp;!otf&gt;
  {
%&lt;*libertinus&gt;
    \exp_args:No \PassOptionsToPackage
      { \g_@@_math_font_options_clist } { libertinust1math }
    \RequirePackage { libertinust1math }
%&lt;/libertinus&gt;
%&lt;*stixtwo&gt;
    \DeclareSizeFunction { sub } { \sub@sfcnt \@font@info }
    \PassOptionsToPackage { notext } { stix2 }
    \RequirePackage { stix2 }
    \clist_map_inline:nn
      {
        \upalpha      { "0B } ,
        \upbeta       { "0C } ,
        \upgamma      { "0D } ,
        \updelta      { "0E } ,
        \upepsilon    { "0F } ,
        \upzeta       { "10 } ,
        \upeta        { "11 } ,
        \uptheta      { "12 } ,
        \upiota       { "13 } ,
        \upkappa      { "14 } ,
        \uplambda     { "15 } ,
        \upmu         { "16 } ,
        \upnu         { "17 } ,
        \upxi         { "18 } ,
        \uppi         { "19 } ,
        \uprho        { "1A } ,
        \upsigma      { "1B } ,
        \uptau        { "1C } ,
        \upupsilon    { "1D } ,
        \upphi        { "1E } ,
        \upchi        { "1F } ,
        \uppsi        { "20 } ,
        \upomega      { "21 } ,
        \upvarepsilon { "22 } ,
        \upvartheta   { "23 } ,
        \upvarpi      { "24 } ,
        \upvarrho     { "25 } ,
        \upvarsigma   { "26 } ,
        \upvarphi     { "27 }
      }
      { \@@_declare_math_symbol:nnNn { \stix@lcgc } { operators } #1 }
    \@@_set_slanted_greek:
%&lt;/stixtwo&gt;
  }
%&lt;/math&amp;!otf&gt;
%&lt;*math&amp;otf&gt;
%&lt;cambria&gt;  { \@@_fontset_error:nn { math } { cambria } }
%&lt;newcm&gt;  { \@@_fontset_error:nn { math } { newcm } }
%&lt;xits&gt;  { \@@_fontset_error:nn { math } { xits } }
%&lt;/math&amp;otf&gt;
%&lt;/!(math&amp;type1)&gt;
%&lt;/font&amp;(math|text)&gt;
%    \end{macrocode}
%
% \pkg{unicode-math} å®åŒ…è®¾ç½®ã€‚
%    \begin{macrocode}
%&lt;*class&gt;
\ctex_at_end_package:nn { unicode-math }
  {
    \DeclareDocumentCommand \bm { m }
      { { \symbf {#1} } }
    \DeclareDocumentCommand \boldsymbol { m }
      { { \symbf {#1} } }
    \bool_if:NTF \g_@@_slanted_uppercase_greek_bool
      { \keys_set:nn { unicode-math } { math-style = ISO } }
      { \keys_set:nn { unicode-math } { math-style = TeX } }
    \bool_if:NTF \g_@@_integral_limits_bool
      { \removenolimits } { \addnolimits }
      {
        \int\iint\iiint\iiiint\oint\oiint\oiiint
        \intclockwise\varointclockwise\ointctrclockwise\sumint
        \intbar\intBar\fint\cirfnint\awint\rppolint
        \scpolint\npolint\pointint\sqint\intlarhk\intx
        \intcap\intcup\upint\lowint
      }
    \clist_map_inline:nn
      { amsfonts, amssymb, bm, upgreek }
      { \@@_disable_package_load:n {#1} }
  }
%    \end{macrocode}
%
% è‹¥æœªä½¿ç”¨ \pkg{unicode-math} é…ç½®æ•°å­¦å­—ä½“ï¼Œåˆ™è‡ªåŠ¨è°ƒç”¨ \pkg{bm}ï¼Œ
% å¹¶åœ¨æœªå®šä¹‰ \tn{uppi} å’Œ \tn{checkmark} æ—¶åˆ†åˆ«è°ƒç”¨ \pkg{upgreek} å’Œ \pkg{amsfonts}ã€‚
%    \begin{macrocode}
\ctex_at_end_preamble:n
  {
    \IfPackageLoadedF { unicode-math }
      {
        \RequirePackage { bm }
        \cs_if_exist:NF \uppi
          { \RequirePackage { upgreek  } }
        \cs_if_exist:NF \checkmark
          { \RequirePackage { amsfonts } }
      }
  }
%&lt;/class&gt;
%    \end{macrocode}
%
% \paragraph{CJK å­—ä½“}
%
% \changes{v2.2}{2024/11/28}{æ–°å¢ž \opt{hanyi} å­—ä½“é…ç½®ã€‚}
% åœ¨å­—ä½“æœªæä¾›å¯¹åº”ç²—ä½“çš„æƒ…å†µä¸‹ï¼Œå…è®¸ä½¿ç”¨ä¼ªç²—ã€‚
%    \begin{macrocode}
%&lt;*font&amp;cjk&gt;
\@@_if_engine_opentype:TF
  {
    \@@_if_main_lang_ja:TF
      {
%&lt;*windows&gt;
        \setCJKmainfont { MS~Mincho } [ AutoFakeBold = 3 ]
        \setCJKsansfont { MS~Gothic } [ AutoFakeBold = 3 ]
        \setCJKmonofont { MS~Mincho }
        \setCJKfamilyfont { jamin  } { MS~Mincho } [ AutoFakeBold = 3 ]
        \setCJKfamilyfont { jagoth } { MS~Gothic } [ AutoFakeBold = 3 ]
%&lt;/windows&gt;
%&lt;*mac&gt;
        \setCJKmainfont { HiraMinProN  }
          [
            UprightFont    = *-W3 ,
            BoldFont       = *-W6
          ]
        \setCJKsansfont { HiraKakuProN }
          [
            UprightFont    = *-W3 ,
            BoldFont       = *-W6
          ]
        \setCJKmonofont { HiraMinProN-W3 }
        \setCJKfamilyfont { jamin  } { HiraMinProN  }
          [
            UprightFont    = *-W3 ,
            BoldFont       = *-W6
          ]
        \setCJKfamilyfont { jagoth } { HiraKakuProN }
          [
            UprightFont    = *-W3 ,
            BoldFont       = *-W6
          ]
%&lt;/mac&gt;
%&lt;*ubuntu&gt;
        \setCJKmainfont { Noto~Serif~CJK~JP }
          [
            UprightFont = *~Light ,
            BoldFont    = *~Bold
          ]
        \setCJKsansfont { Noto~Sans~CJK~JP  }
          [
            UprightFont = *~Medium ,
            BoldFont    = *~Bold
          ]
        \setCJKmonofont { Noto~Serif~CJK~JP }
          [
            UprightFont = *~Light ,
            BoldFont    = *~Bold
          ]
        \setCJKfamilyfont { jamin  } { Noto~Serif~CJK~JP }
          [
            UprightFont = *~Light ,
            BoldFont    = *~Bold
          ]
        \setCJKfamilyfont { jagoth } { Noto~Sans~CJK~JP  }
          [
            UprightFont = *~Medium ,
            BoldFont    = *~Bold
          ]
%&lt;/ubuntu&gt;
%&lt;*adobe&gt;
        \setCJKmainfont { KozMinPr6N }
          [
            UprightFont = *-Light ,
            BoldFont    = *-Bold
          ]
        \setCJKsansfont { KozGoPr6N  }
          [
            UprightFont = *-Medium ,
            BoldFont    = *-Bold
          ]
        \setCJKmonofont { KozMinPr6N-Light }
        \setCJKfamilyfont { jamin  } { KozMinPr6N }
          [
            UprightFont = *-Light ,
            BoldFont    = *-Bold
          ]
        \setCJKfamilyfont { jagoth } { KozGoPr6N  }
          [
            UprightFont = *-Medium ,
            BoldFont    = *-Bold
          ]
%&lt;/adobe&gt;
%&lt;*fandol|hanyi&gt;
        \setCJKmainfont { HaranoAjiMincho }
          [
            Extension   = .otf ,
            UprightFont = *-Regular ,
%&lt;fandol&gt;            BoldFont    = *-Bold
%&lt;hanyi&gt;            BoldFont    = *-Medium
          ]
        \setCJKsansfont { HaranoAjiGothic }
          [
            Extension   = .otf ,
            UprightFont = *-Medium ,
            BoldFont    = *-Bold
          ]
        \setCJKmonofont { HaranoAjiGothic }
          [
            Extension   = .otf ,
            UprightFont = *-Regular
          ]
        \setCJKfamilyfont { jamin  } { HaranoAjiMincho }
          [
            Extension   = .otf ,
%&lt;fandol&gt;            BoldFont    = *-Bold
%&lt;hanyi&gt;            BoldFont    = *-Medium
          ]
        \setCJKfamilyfont { jagoth } { HaranoAjiGothic }
          [
            Extension   = .otf ,
            UprightFont = *-Medium ,
            BoldFont    = *-Bold
          ]
%&lt;/fandol|hanyi&gt;
%&lt;*founder&gt;
        \setCJKmainfont { ipam.ttf } [ AutoFakeBold = 3 ]
        \setCJKsansfont { ipag.ttf } [ AutoFakeBold = 3 ]
        \setCJKmonofont { ipag.ttf }
        \setCJKfamilyfont { jamin  } { ipam.ttf } [ AutoFakeBold = 3 ]
        \setCJKfamilyfont { jagoth } { ipag.ttf } [ AutoFakeBold = 3 ]
%&lt;/founder&gt;
        \NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
        \NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
      }
%&lt;*windows&gt;
      {
        \setCJKmainfont { SimSun   }
          [ AutoFakeBold = 3 , ItalicFont = KaiTi ]
        \setCJKsansfont { SimHei   } [ AutoFakeBold = 3 ]
        \setCJKmonofont { FangSong }
      }
    \setCJKfamilyfont { zhsong } { SimSun   }
      [ AutoFakeBold = 3 , ItalicFont = KaiTi ]
    \setCJKfamilyfont { zhhei  } { SimHei   } [ AutoFakeBold = 3 ]
    \setCJKfamilyfont { zhkai  } { KaiTi    }
    \setCJKfamilyfont { zhfs   } { FangSong }
%&lt;/windows&gt;
%&lt;*mac&gt;
      {
        \setCJKmainfont { Songti~SC  }
          [
            UprightFont    = *~Light ,
            BoldFont       = *~Bold ,
            ItalicFont     = Kaiti~SC~Regular ,
            BoldItalicFont = Kaiti~SC~Bold
          ]
        \setCJKsansfont { Heiti~SC   }
          [
            UprightFont    = *~Medium ,
            AutoFakeBold   = 3
          ]
        \setCJKmonofont { STFangsong }
      }
    \setCJKfamilyfont { zhsong } { Songti~SC  }
      [
        UprightFont    = *~Light ,
        BoldFont       = *~Bold ,
        ItalicFont     = Kaiti~SC~Regular ,
        BoldItalicFont = Kaiti~SC~Bold
      ]
    \setCJKfamilyfont { zhhei  } { Heiti~SC   }
      [
        UprightFont    = *~Medium ,
        AutoFakeBold   = 3
      ]
    \setCJKfamilyfont { zhfs   } { STFangsong }
    \setCJKfamilyfont { zhkai  } { Kaiti~SC   }
      [
        UprightFont    = *~Regular ,
        BoldFont       = *~Bold
        ]
%&lt;/mac&gt;
%&lt;*ubuntu&gt;
      {
        \setCJKmainfont { Noto~Serif~CJK~SC }
          [
            UprightFont = *~Light ,
            BoldFont    = *~Bold ,
            ItalicFont  = AR~PL~KaitiM~GB
          ]
        \setCJKsansfont { Noto~Sans~CJK~SC  }
          [
            UprightFont = *~Medium ,
            BoldFont    = *~Bold
          ]
        \setCJKmonofont { Noto~Serif~CJK~SC }
          [
            UprightFont = *~Light ,
            BoldFont    = *~Bold
          ]
      }
    \setCJKfamilyfont { zhsong } { Noto~Serif~CJK~SC }
      [
        UprightFont = *~Light ,
        BoldFont    = *~Bold ,
        ItalicFont  = AR~PL~KaitiM~GB
      ]
    \setCJKfamilyfont { zhhei  } { Noto~Sans~CJK~SC  }
      [
        UprightFont = *~Medium ,
        BoldFont    = *~Bold
      ]
    \setCJKfamilyfont { zhkai  } { AR~PL~KaitiM~GB   }
%&lt;/ubuntu&gt;
%&lt;*adobe&gt;
      {
        \setCJKmainfont { AdobeSongStd-Light       }
          [ AutoFakeBold = 3 , ItalicFont = AdobeKaitiStd-Regular ]
        \setCJKsansfont { AdobeHeitiStd-Regular    } [ AutoFakeBold = 3 ]
        \setCJKmonofont { AdobeFangsongStd-Regular }
      }
    \setCJKfamilyfont { zhsong } { AdobeSongStd-Light       }
      [ AutoFakeBold = 3 , ItalicFont = AdobeKaitiStd-Regular ]
    \setCJKfamilyfont { zhhei  } { AdobeHeitiStd-Regular    } [ AutoFakeBold = 3 ]
    \setCJKfamilyfont { zhfs   } { AdobeFangsongStd-Regular }
    \setCJKfamilyfont { zhkai  } { AdobeKaitiStd-Regular    }
%&lt;/adobe&gt;
%&lt;*fandol&gt;
      {
        \setCJKmainfont { FandolSong }
          [
            Extension   = .otf ,
            UprightFont = *-Regular ,
            BoldFont    = *-Bold ,
            ItalicFont  = FandolKai-Regular
          ]
        \setCJKsansfont { FandolHei  }
          [
            Extension   = .otf ,
            UprightFont = *-Regular ,
            BoldFont    = *-Bold
          ]
        \setCJKmonofont { FandolFang }
          [
            Extension   = .otf ,
            UprightFont = *-Regular
          ]
      }
    \setCJKfamilyfont { zhsong } { FandolSong }
      [
        Extension   = .otf ,
        UprightFont = *-Regular ,
        BoldFont    = *-Bold ,
        ItalicFont  = FandolKai-Regular
      ]
    \setCJKfamilyfont { zhhei  } { FandolHei  }
      [
        Extension   = .otf ,
        UprightFont = *-Regular,
        BoldFont    = *-Bold
      ]
    \setCJKfamilyfont { zhfs   } { FandolFang }
      [
        Extension   = .otf ,
        UprightFont = *-Regular
      ]
    \setCJKfamilyfont { zhkai  } { FandolKai  }
      [
        Extension   = .otf ,
        UprightFont = *-Regular
      ]
%&lt;/fandol&gt;
%&lt;*founder&gt;
      {
        \setCJKmainfont { FZShuSong-Z01  }
          [ AutoFakeBold = 3 , ItalicFont = FZKai-Z03 ]
        \setCJKsansfont { FZHei-B01      } [ AutoFakeBold = 3 ]
        \setCJKmonofont { FZFangSong-Z02 }
      }
    \setCJKfamilyfont { zhsong } { FZShuSong-Z01  }
      [ AutoFakeBold = 3 , ItalicFont = FZKai-Z03 ]
    \setCJKfamilyfont { zhhei  } { FZHei-B01      } [ AutoFakeBold = 3 ]
    \setCJKfamilyfont { zhkai  } { FZKai-Z03      }
    \setCJKfamilyfont { zhfs   } { FZFangSong-Z02 }
%&lt;/founder&gt;
%&lt;*hanyi&gt;
      {
        \setCJKmainfont { HYShuSongEr~S }
          [ BoldFont = HYZhongSong~S, ItalicFont = HYKaiTi~S ]
        \setCJKsansfont { HYZhongHei~S  } [ BoldFont = HYDaHei~S ]
        \setCJKmonofont { HYFangSong~S  }
      }
    \setCJKfamilyfont { zhsong } { HYShuSongEr~S }
      [ BoldFont = HYZhongSong~S ]
    \setCJKfamilyfont { zhhei  } { HYZhongHei~S  }
      [ BoldFont = HYDaHei~S     ]
    \setCJKfamilyfont { zhkai  } { HYKaiTi~S     }
    \setCJKfamilyfont { zhfs   } { HYFangSong~S  }
%&lt;/hanyi&gt;
    \NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
    \NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
%&lt;!ubuntu&gt;    \NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
    \NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
  }
  {
    \@@_if_main_lang_ja:TF
%&lt;windows&gt;      { \@@_fontset_error:nn { cjk } { windows } }
%&lt;windows&gt;      { \ctex_file_input:n { ctex-fontset-windows.def } }
%&lt;mac&gt;      { \@@_fontset_error:nn { cjk } { mac } }
%&lt;mac&gt;      { \ctex_file_input:n { ctex-fontset-mac.def } }
%&lt;ubuntu&gt;      { \@@_fontset_error:nn { cjk } { ubuntu } }
%&lt;ubuntu&gt;      { \ctex_file_input:n { ctex-fontset-ubuntu.def } }
%&lt;adobe&gt;      { \@@_fontset_error:nn { cjk } { adobe } }
%&lt;adobe&gt;      { \ctex_file_input:n { ctex-fontset-adobe.def } }
%&lt;fandol&gt;      { \@@_fontset_error:nn { cjk } { fandol } }
%&lt;fandol&gt;      { \ctex_file_input:n { ctex-fontset-fandol.def } }
%&lt;founder&gt;      { \@@_fontset_error:nn { cjk } { founder } }
%&lt;founder&gt;      { \ctex_file_input:n { ctex-fontset-founder.def } }
%&lt;hanyi&gt;      { \@@_fontset_error:nn { cjk } { hanyi } }
%&lt;hanyi&gt;      { \ctex_file_input:n { ctex-fontset-hanyi.def } }
  }
%&lt;/font&amp;cjk&gt;
%    \end{macrocode}
%
% \begin{macro}{\CJKrmfamily,\CJKsffamily,\CJKttfamily}
% åªæ”¹å˜ CJK å­—ä½“æ—çš„å‘½ä»¤ã€‚
%    \begin{macrocode}
%&lt;*class&gt;
\NewDocumentCommand \CJKrmfamily { } { \CJKfamily { \CJKrmdefault } }
\NewDocumentCommand \CJKsffamily { } { \CJKfamily { \CJKsfdefault } }
\NewDocumentCommand \CJKttfamily { } { \CJKfamily { \CJKttdefault } }
%    \end{macrocode}
% \end{macro}
%
% å¸¦åœˆæ•°å­—ä½¿ç”¨ CJK å­—ä½“ã€‚
%    \begin{macrocode}
\sys_if_engine_xetex:T
  {
    \xeCJK_declare_char_class:nn { CJK }
      { "24EA, "2460-&gt;"2473, "3251-&gt;"32BF, "25A1 }
  }
\sys_if_engine_luatex:T
  {
    \ltjdefcharrange { 99 }
      { "24EA, "2460- "2473, "3251- "32BF, "25A1 }
    \ltjsetparameter { jacharrange = { +99 } }
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\@@_unicode_char:n}
% ç”± Unicode ç&nbsp;ä½ç›´æŽ¥è°ƒç”¨å­—ç¬¦çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
\sys_if_engine_pdftex:TF
  {
    \cs_new:Npn \@@_unicode_char:n #1
      {
        \exp_not:N \Unicode
          { \int_div_truncate:nn {#1} { 256 } }
          { \int_mod:nn          {#1} { 256 } }
      }
  }
  { \cs_new:Npn \@@_unicode_char:n #1 { \tex_Uchar:D #1 \scan_stop: } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_symbol_const:nn}
% å®šä¹‰ç¬¦å·çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_symbol_const:nn #1#2
  { \tl_const:ce { c_@@_symbol_ #1 _tl } { \@@_unicode_char:n {#2} } }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0.2}{2023/04/01}{å»¶è¿Ÿè½½å…¥å­—ä½“é…ç½®ï¼Œä¿®å¤ \pkg{unicode-math}
% è®¾ç½®ä¸ç”Ÿæ•ˆçš„é—®é¢˜ã€‚}
% è½½å…¥å­—ä½“é…ç½®ã€‚
%    \begin{macrocode}
\@@_load_fontset:
%    \end{macrocode}
%
% \subsubsection{åç§°é€‰é¡¹}
%
% å®šä¹‰ |sjtu/name| é”®å€¼ç±»ã€‚
%
% è®¾ç½®æ&nbsp;‡å‡†æ–‡æ¡£ç±»ä¸­å·²å®šä¹‰çš„åç§°ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / name }
  {
    contents        .meta:nn = { ctex } { contentsname   = {#1} } ,
    listfigure      .meta:nn = { ctex } { listfigurename = {#1} } ,
    listtable       .meta:nn = { ctex } { listtablename  = {#1} } ,
    figure          .meta:nn = { ctex } { figurename     = {#1} } ,
    table           .meta:nn = { ctex } { tablename      = {#1} } ,
%&lt;!thesis&gt;    abstract        .meta:nn = { ctex } { abstractname   = {#1} } ,
    index           .meta:nn = { ctex } { indexname      = {#1} } ,
    appendix        .meta:nn = { ctex } { appendixname   = {#1} } ,
    proof           .meta:nn = { ctex } { proofname      = {#1} } ,
    bib             .meta:nn = { ctex } { bibname        = {#1} } ,
    part           .tl_set:N = \partname ,
%&lt;!article&gt;    chapter        .tl_set:N = \chaptername ,
%    \end{macrocode}
%
% \changes{v2.0}{2022/12/28}{ç®€åŒ– \opt{sjtu/name} ä¸­é”®çš„åç§°ï¼š\opt{abbr},
% \opt{nom}, \opt{ack}, \opt{achv}ã€‚}
% æ&nbsp;‡å‡†æ–‡æ¡£ç±»ä¸­æœªå®šä¹‰çš„åç§°ã€‚
%    \begin{macrocode}
    figure*        .tl_set:N = \SJTU@figurename@bi@second ,
    figure*       .initial:n = { å›¾ } ,
    table*         .tl_set:N = \SJTU@tablename@bi@second ,
    table*        .initial:n = { è¡¨ } ,
    algorithm      .tl_set:N = \SJTU@algorithmname ,
    algorithm     .initial:n = { Algorithm } ,
    listalgorithm  .tl_set:N = \SJTU@listalgorithmname ,
    listalgorithm .initial:n = { List~of~Algorithms } ,
%&lt;*thesis&gt;
    abbr           .tl_set:N = \SJTU@abbrname ,
    abbr          .initial:n = { Abbreviations } ,
    nom            .tl_set:N = \SJTU@nomname ,
    nom           .initial:n = { Nomenclature } ,
    ack            .tl_set:N = \SJTU@ackname ,
    ack           .initial:n = { Acknowledgements } ,
    resume         .tl_set:N = \SJTU@resumename ,
    resume        .initial:n = { Resume } ,
    digest         .tl_set:N = \SJTU@digestname ,
    digest        .initial:n = { Digest } ,
    achv           .tl_set:N = \SJTU@achvname ,
    achv          .initial:n = { List~of~Research~Achievements },
%&lt;/thesis&gt;
  }
%    \end{macrocode}
%
% \subsubsection{é¡µé¢è®¾ç½®}
%
% åˆ©ç”¨ \pkg{geometry} å®åŒ…è®¾ç½®é¡µé¢è¾¹è·ä»¥åŠé¡µçœ‰é«˜åº¦ã€‚
%    \begin{macrocode}
\geometry
  {
    vmargin       = { 3.5 cm , 4.0 cm } ,
    hmargin       = 2.5 cm ,
%&lt;thesis&gt;    bindingoffset = 0.5 cm ,
    headheight    = 1.5 cm ,
    headsep       = 0.5 cm ,
    footskip      = 1.0 cm
  }
%    \end{macrocode}
%
% \changes{v2.0.3}{2023/09/24}{å­¦ä½è®ºæ–‡é¡µé¢çºµå‘é¡¶éƒ¨å¯¹é½ã€‚}
% å­¦ä½è®ºæ–‡é¡µé¢çºµå‘é¡¶éƒ¨å¯¹é½ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\AtEndOfClass { \raggedbottom }
%&lt;/thesis&gt;
%    \end{macrocode}
%
% \subsubsection{é¡µçœ‰é¡µè„š}
%
% \pkg{ctex} å®åŒ…ä½¿ç”¨ \opt{heading} é€‰é¡¹åŽï¼Œä¼šæŠŠé¡µé¢æ&nbsp;¼å¼è®¾ç½®ä¸º |headings|ã€‚
% å›&nbsp;æ­¤å¿…é¡»åœ¨ \pkg{ctex} è°ƒç”¨ä¹‹åŽé‡æ–°è®¾ç½® \tn{pagestyle} ä¸º |fancy|ã€‚
%    \begin{macrocode}
\pagestyle { fancy }
%    \end{macrocode}
%
% æ¸…é™¤æ‰€æœ‰é¡µçœ‰é¡µè„šã€‚
%    \begin{macrocode}
\fancyhf { }
%    \end{macrocode}
%
% \begin{macro}{style/header-font,style/footer-font}
% è®¾ç½®é¡µçœ‰é¡µè„šå­—ä½“ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    header-font  .tl_set:N = \l_@@_style_header_font_tl ,
%&lt;thesis&gt;    header-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp } ,
%&lt;!thesis&gt;    header-font .initial:n = \zihao { -5 } \sffamily ,
    footer-font  .tl_set:N = \l_@@_style_footer_font_tl ,
%&lt;thesis&gt;    footer-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp }
%&lt;!thesis&gt;    footer-font .initial:n = \zihao { -5 }
  }
\fancyheadinit { \l_@@_style_header_font_tl }
\fancyfootinit { \l_@@_style_footer_font_tl }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{style/header-uppercase}
% \begin{macro}[int]{\@@_nouppercase:n}
% é¡µçœ‰è¥¿æ–‡æ˜¯å¦å¤§å†™ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    header-uppercase       .choice: ,
    header-uppercase / true  .code:n =
      { \cs_set_eq:NN \@@_nouppercase:n \use:n                 } ,
    header-uppercase / false .code:n =
      { \cs_set:Nn    \@@_nouppercase:n { \nouppercase {##1} } } ,
    header-uppercase      .default:n = { true  } ,
    header-uppercase      .initial:n = { false }
  }
\cs_generate_variant:Nn \@@_nouppercase:n { V }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{style/page-number}
% \begin{macro}[int]{\@@_page:nn}
% é¡µè„šé¡µç&nbsp;æ&nbsp;¼å¼ã€‚
%    \begin{macrocode}
\tl_set:Nn \@@_the_page_tl { \thepage }
\tl_new:N \@@_the_last_page_tl
\msg_new:nnn { sjtutex } { require-pageslts }
  {
    Add~'\token_to_str:N \usepackage{pageslts}'~in~your~preamble \\
    to~enable~the~page~number~of~the~last~page.
  }
\keys_define:nn { sjtu / style }
  {
    page-number    .code:n =
      {
        \regex_match:nnT { \#2 } { #1 }
          {
            \ctex_if_preamble:TF
              { \RequirePackage { pageslts } }
              {
                \IfPackageLoadedF { pageslts }
                  { \msg_warning:nn { sjtutex } { require-pageslts } }
              }
          }
        \cs_set:Nn \@@_page:nn { #1 }
      } ,
    page-number .initial:n = { {#1} }
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% è®¾ç½®é¡µçœ‰å†…å®¹ã€‚
%    \begin{macrocode}
\tl_set:Nn \l_@@_header_tl
  {
%&lt;thesis&gt;    { \songti \l_@@_info_subject_zh_tl }
%&lt;*!thesis&gt;
    \includegraphics [ height = 1.2 cm ]
      { sjtu-vi-logo-std-h-cor-red.pdf }
%&lt;/!thesis&gt;
  }
%&lt;thesis&gt;\tl_set:Nn \l_@@_leftmark_tl  { \leftmark }
%&lt;!thesis&gt;\tl_set:Nn \l_@@_leftmark_tl  { \l_@@_info_subject_tl }
\tl_set:Nn \l_@@_rightmark_tl { \leftmark }
%    \end{macrocode}
%
% è®¾ç½®é¡µçœ‰é¡µè„šã€‚
%    \begin{macrocode}
\legacy_if:nTF { @twoside }
  {
    \fancyhead [ LO, RE ] { \l_@@_header_tl }
    \fancyhead [ LE ]     { \@@_nouppercase:V \l_@@_leftmark_tl  }
    \fancyhead [ RO ]     { \@@_nouppercase:V \l_@@_rightmark_tl }
  }
  {
    \fancyhead [ L ] { \l_@@_header_tl }
    \fancyhead [ R ] { \@@_nouppercase:V \l_@@_rightmark_tl }
  }
\fancyfoot [ C ]
  { \@@_page:nn { \@@_the_page_tl } { \@@_the_last_page_tl } }
%    \end{macrocode}
%
% \begin{macro}{\headrule}
% \cls{sjtuthesis} çš„é¡µçœ‰çº¿ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\tl_set:Nn \headrule
  {
    \hrule height 2.25 pt width \headwidth
    \skip_vertical:n {  0.75 pt }
    \hrule height 0.75 pt width \headwidth
    \skip_vertical:n { -3.75 pt }
  }
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.2}{2024/11/08}{æ›´æ–° \cls{sjtureport} å’Œ \cls{sjtuarticle} çš„
% \texttt{plain} é¡µé¢æ&nbsp;·å¼ã€‚}
% é‡å®šä¹‰ |plain| æ&nbsp;·å¼ã€‚
%    \begin{macrocode}
%&lt;*!thesis&gt;
\legacy_if:nTF { @twoside }
  {
    \fancypagestyle { plain }
      {
        \fancyhead { }
        \fancyhead [ LO, RE ] { \l_@@_header_tl }
        \tl_set:Nn \headrulewidth { 0 pt }
      }
  }
  {
    \fancypagestyle { plain }
      {
        \fancyhead { }
        \fancyhead [ L ] { \l_@@_header_tl }
        \tl_set:Nn \headrulewidth { 0 pt }
      }
  }
%&lt;/!thesis&gt;
%    \end{macrocode}
%
% |SJTU@null| æ&nbsp;·å¼ï¼Œä¸å¯¹å½“å‰é¡µé¢æ&nbsp;·å¼åšä»»ä½•ä¿®æ”¹ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \ps@SJTU@null \prg_do_nothing:
%    \end{macrocode}
%
% \begin{macro}{\cleardoublepage}
% ç©ºç™½é¡µæ¸…ç©ºé¡µçœ‰é¡µè„šã€‚
%    \begin{macrocode}
\RenewDocumentCommand \cleardoublepage { }
  {
    \clearpage
    \legacy_if:nT { @twoside }
      {
        \int_if_odd:nF \c@page
          { \hbox:n { } \thispagestyle { empty } \newpage }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{é¡µç&nbsp;è®¾ç½®}
%
% æ–‡æ¡£åˆå§‹é¡µç&nbsp;ç¼–ç&nbsp;è®¾ç½®ã€‚
%    \begin{macrocode}
%&lt;thesis&gt;\pagenumbering { Alph }
%    \end{macrocode}
%
% \begin{macro}{\frontmatter}
% å‰ç½®éƒ¨åˆ†ä½¿ç”¨å¤§å†™ç½—é©¬æ•°å­—ç¼–ç&nbsp;ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\RenewDocumentCommand \frontmatter { }
  {
    \cleardoublepage
    \@mainmatterfalse
    \pagenumbering { Roman }
  }
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{ç«&nbsp;èŠ‚æ&nbsp;‡é¢˜}
%
% è®¾ç½®ç«&nbsp;èŠ‚æ&nbsp;‡é¢˜æ&nbsp;·å¼ã€‚
%    \begin{macrocode}
%&lt;*!article&gt;
\ctex_set:nn { chapter }
  {
    pagestyle   = SJTU@null ,
    fixskip     = true ,
%&lt;*thesis&gt;
    beforeskip  = 27 bp ,
    afterskip   = 27 bp ,
    format      = \zihao { 3 } \setbaselineskip{ 20 bp } \bfseries
                  \CJKsffamily \centering ,
%&lt;/thesis&gt;
%&lt;*report&gt;
    beforeskip  = 30 pt ,
    afterskip   = 24 pt ,
    format      = \Large \bfseries \CJKsffamily \centering ,
%&lt;/report&gt;
    nameformat  = ,
    titleformat = ,
    lofskip     = \c_zero_skip ,
    lotskip     = \c_zero_skip ,
    aftername   = \quad
  }
%&lt;/!article&gt;
%&lt;/class&gt;
%&lt;*scheme&amp;(zh|ja)&gt;
\keys_set_known:nn { ctex / chapter }
  { name = { ç¬¬ \space , \space ç«&nbsp; } }
%&lt;/scheme&amp;(zh|ja)&gt;
%&lt;*class&gt;
\ctex_set:nn { section }
%&lt;*thesis&gt;
  {
    beforeskip  = 24 bp ,
    afterskip   =  6 bp ,
    format      = \zihao { 4 } \setbaselineskip { 18 bp } \bfseries
                  \CJKsffamily
  }
%&lt;/thesis&gt;
%&lt;!thesis&gt;  { format = \large \bfseries \CJKsffamily }
\ctex_set:nn { subsection }
%&lt;*thesis&gt;
  {
    beforeskip  = 12 bp ,
    afterskip   =  6 bp ,
    format      = \zihao { -4 } \setbaselineskip { 16 bp } \bfseries
                  \CJKsffamily
  }
%&lt;/thesis&gt;
%&lt;!thesis&gt;  { format = \SJTU@orig@normalsize \bfseries \CJKsffamily }
\ctex_set:nn { subsubsection }
%&lt;*thesis&gt;
  {
    beforeskip  =  6 bp ,
    afterskip   =  6 bp ,
    format      = \zihao { -4 } \setbaselineskip { 16 bp } \normalfont
  }
%&lt;/thesis&gt;
%&lt;!thesis&gt;  { format = \SJTU@orig@normalsize \normalfont }
\ctex_set:n { secnumdepth = 3 }
%    \end{macrocode}
%
% \changes{v2.1}{2024/01/10}{æ–°å¢ž \opt{style/indent-first} é€‰é¡¹ã€‚}
% \begin{macro}{style/indent-first}
% ç«&nbsp;èŠ‚æ&nbsp;‡é¢˜åŽé¦–æ®µæ˜¯å¦ç¼©è¿›ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    indent-first    .choice: ,
    indent-first   .choices:nn =
      { true, false }
      {
        \clist_map_inline:nn
          {
%&lt;article&gt;            part,
%&lt;!article&gt;            chapter,
            section, subsection, subsubsection,
            paragraph, subparagraph
          }
          { \ctex_set:nn {####1} { afterindent = #1 } }
      } ,
    indent-first   .default:n = { true } ,
    indent-first   .initial:n = { true }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_pdf_bookmark:nn,\@@_phantom_section:}
% åœ¨ \pkg{hyperref} è½½å…¥åŽæ‰æœ‰æ„ä¹‰ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \@@_pdf_bookmark:nn \use_none:nn
\cs_new_eq:NN \@@_phantom_section: \prg_do_nothing:
%&lt;/class&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{æ®µè½}
%
% è®¾ç½®å…¨æ–‡é¦–è¡Œç¼©è¿›ã€‚
%    \begin{macrocode}
%&lt;*scheme&gt;
\ctex_if_autoindent_touched:F
%&lt;zh&gt;  { \ctex_set:n { autoindent = true } }
%&lt;en|de&gt;  { \ctex_set:n { autoindent = 1.5 em } }
%&lt;ja&gt;  { \ctex_set:n { autoindent = 1 } }
%    \end{macrocode}
%
% \begin{macro}{\verse,\quotation}
% ä¿®æ”¹è¯—æ­Œå’Œå¼•ç”¨çŽ¯å¢ƒçš„ç¼©è¿›ã€‚
%    \begin{macrocode}
%&lt;zh|ja&gt;\ctex_patch_cmd:Nnn \verse { -1.5em } { -2 \ccwd }
%&lt;zh|ja&gt;\ctex_patch_cmd:Nnn \verse {  1.5em } {  2 \ccwd }
\ctex_patch_cmd:Nnn \quotation { 1.5em } { \parindent }
%&lt;/scheme&gt;
%    \end{macrocode}
% \end{macro}
%
% ä½¿ç”¨ \pkg{enumitem} è°ƒæ•´é»˜è®¤åˆ—è¡¨çŽ¯å¢ƒçš„é—´è·ã€‚
%    \begin{macrocode}
%&lt;*class&gt;
\setlist { nosep }
%    \end{macrocode}
%
% \subsubsection{æ•°å­¦å…¬å¼}
%
% \changes{v2.1}{2023/11/30}{æ–°å¢ž \opt{style/equation-font} é€‰é¡¹ã€‚}
% \begin{macro}{style/equation-font}
% è®¾ç½®è¡Œé—´æ•°å­¦å…¬å¼çš„å­—ä½“ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    equation-font  .tl_set:N = \SJTU@style@equation@font ,
%&lt;thesis&gt;    equation-font .initial:n = \linespread { } \SJTU@orig@normalsize
%&lt;!thesis&gt;    equation-font .initial:V = \c_empty_tl
  }
%    \end{macrocode}
% \end{macro}
%
% å€Ÿç”¨ \pkg{zhlineskip} å®åŒ…çš„ä»£ç&nbsp;è®¾ç½®è¡Œé—´å…¬å¼å­—ä½“ã€‚
%    \begin{macrocode}
\clist_map_inline:nn
  {
    array, matrix, pmatrix, bmatrix, Bmatrix, vmatrix, Vmatrix,
    matrix*, pmatrix*, bmatrix*, Bmatrix*, vmatrix*, Vmatrix*,
    cases, cases*, dcases, dcases*, rcases, rcases*, drcases, drcases*,
    aligned, alignedat, gathered, multlined, lgathered, rgathered
  }
  { \AtBeginEnvironment {#1} { \SJTU@style@equation@font } }
\clist_map_inline:nn
  { \start@gather, \start@align, \start@multline }
  {
    \ctex_patch_cmd:Nnn #1
      { \collect@body }
      {
        \SJTU@style@equation@font
        \collect@body
      }
  }
\ctex_patch_cmd:Nnn \gather@split
  { \spread@equation }
  {
    \SJTU@style@equation@font
    \spread@equation
  }
%    \end{macrocode}
%
% \subsubsection{æ•°å­¦çŽ¯å¢ƒ}
%
% å¯ä»¥é€‰ç”¨ \pkg{amsthm} æˆ– \pkg{ntheorem} å®åŒ…æŽ§åˆ¶æ•°å­¦çŽ¯å¢ƒæ&nbsp;·å¼ï¼Œ
% å¹¶æä¾›å¯¹è¯æ˜ŽçŽ¯å¢ƒ \env{proof} çš„æ”¯æŒã€‚
%
% \changes{v2.1.1}{2024/03/21}{æ–°å¢ž \opt{style/theorem-header-font}ã€
% \opt{style/theorem-body-font} é€‰é¡¹ã€‚}
% \begin{macro}{style/theorem-header-font,style/theorem-body-font}
% é¢„å®šä¹‰çš„æ•°å­¦çŽ¯å¢ƒçš„å®šç†å¤´ï¼ˆå³æ&nbsp;‡é¢˜ï¼‰ä»¥åŠå®šç†å†…å®¹çš„å­—ä½“ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    theorem-header-font  .tl_set:N = \SJTU@style@thm@header@font ,
    theorem-header-font .initial:n = \bfseries \CJKsffamily ,
    theorem-body-font    .tl_set:N = \SJTU@style@thm@body@font ,
    theorem-body-font   .initial:n = \normalfont ,
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{æµ®åŠ¨ä½“}
%
% ä¸‹é¢è¿™ç»„å‘½ä»¤ä½¿æµ®åŠ¨å¯¹è±¡çš„ç¼ºçœå€¼ç¨å¾®å®½æ¾ä¸€ç‚¹ï¼Œä»Žè€Œé˜²æ­¢å¹…åº¦å¯¹è±¡å&nbsp;æ®è¿‡å¤šçš„
% æ–‡æœ¬é¡µé¢ï¼Œä¹Ÿå¯ä»¥é˜²æ­¢åœ¨å¾ˆå¤§ç©ºç™½çš„æµ®åŠ¨é¡µä¸Šæ”¾ç½®å¾ˆå°çš„å›¾å½¢ã€‚
%    \begin{macrocode}
\tl_set:Nn \textfraction      { 0.15 }
\tl_set:Nn \topfraction       { 0.85 }
\tl_set:Nn \bottomfraction    { 0.65 }
\tl_set:Nn \floatpagefraction { 0.60 }
%    \end{macrocode}
%
% \begin{macro}{style/float-font}
% è®¾ç½®æµ®åŠ¨ä½“å†…çš„å­—ä½“ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    float-font  .tl_set:N = \SJTU@style@float@font ,
%&lt;thesis&gt;    float-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
%&lt;!thesis&gt;    float-font .initial:n = \zihao { 5 }
  }
\ctex_patch_cmd:Nnn \@floatboxreset
  { \normalsize } { \SJTU@style@float@font }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.1}{2023/11/29}{æ›´æ–°é¢˜æ³¨æ&nbsp;¼å¼ã€‚}
% \begin{macro}{style/caption-font,style/subcaption-font}
% é¢˜æ³¨æ&nbsp;¼å¼ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
%    \end{macrocode}
%
% \pkg{bicaption} ä¸­åŒè¯­æ&nbsp;‡é¢˜ä¹‹é—´çš„é—´è·å— \pkg{caption} å­—ä½“å®šä¹‰ \opt{normalsize}
% çš„å½±å“ï¼Œè¿™é‡Œæˆ‘ä»¬ç›´æŽ¥é‡å®šä¹‰ \opt{normalsize}ã€‚
%    \begin{macrocode}
    caption-font       .code:n =
      { \DeclareCaptionFont { normalsize    } {#1} } ,
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;thesis&gt;    caption-font    .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
%&lt;thesis&gt;                                 \bfseries ,
%&lt;!thesis&gt;    caption-font    .initial:n = \zihao { 5 } \bfseries ,
    subcaption-font    .code:n =
      { \DeclareCaptionFont { SJTU@sub@font } {#1} } ,
%&lt;thesis&gt;    subcaption-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
%&lt;thesis&gt;                                 \normalfont
%&lt;!thesis&gt;    subcaption-font .initial:n = \zihao { 5 } \normalfont
  }
\captionsetup
  {
    bi-slc   = off ,
    labelsep = quad ,
%&lt;thesis&gt;    skip     = 6 bp
  }
\captionsetup [ sub ]
  {
    bi-slc   = on ,
    font     = SJTU@sub@font ,
    format   = hang
  }
%    \end{macrocode}
% \end{macro}
%
% åŒè¯­é¢˜æ³¨ã€‚
%    \begin{macrocode}
\DeclareCaptionOption { bi-second-names } [ ]
  {
    \tl_set:Nn \figurename { \SJTU@figurename@bi@second }
    \tl_set:Nn \tablename  { \SJTU@tablename@bi@second  }
  }
\captionsetup [ bi-second ] { bi-second-names }
%    \end{macrocode}
%
% \changes{v2.1}{2023/12/02}{æ–°å¢ž \opt{style/num-sep}ã€
% \opt{style/theorem-num-sep} é€‰é¡¹ã€‚}
% \begin{macro}{style/num-sep,style/float-num-sep,
% style/equation-num-sep,style/theorem-num-sep}
% å›¾ã€è¡¨ã€å…¬å¼ä»¥åŠå®šç†ç¼–å·ä¸­çš„åˆ†éš”ç¬¦ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    num-sep            .code:n =
      {
        \tl_set:Nn \SJTU@style@fl@num@sep {#1}
        \tl_set:Nn \SJTU@style@eq@num@sep {#1}
        \tl_set:Nn \@thmcountersep        {#1}
      } ,
    num-sep         .initial:n = { . } ,
    float-num-sep    .tl_set:N = \SJTU@style@fl@num@sep ,
    equation-num-sep .tl_set:N = \SJTU@style@eq@num@sep ,
    theorem-num-sep  .tl_set:N = \@thmcountersep
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\SJTU@counterwithin}
%    \begin{macrocode}
\NewDocumentCommand \SJTU@counterwithin
  { s O{ \SJTU@style@fl@num@sep } O{ \arabic } m m }
  {
    \@ifbothcounters {#4} {#5}
      {
        \@addtoreset {#4} {#5}
        \IfBooleanF {#1}
          {
            \exp_args:Nco \cs_gset:Npn { the #4 }
              { \cs:w the #5 \cs_end: #2 #3 {#4} }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% å®šä¹‰å›¾ã€è¡¨ã€å…¬å¼çš„ç¼–å·æ&nbsp;¼å¼ã€‚
%    \begin{macrocode}
%&lt;*!article&gt;
\SJTU@counterwithin { figure } { chapter }
\SJTU@counterwithin { table  } { chapter }
\SJTU@counterwithin [ \SJTU@style@eq@num@sep ] { equation } { chapter }
%&lt;/!article&gt;
%    \end{macrocode}
%
% \begin{variable}{\l_@@_counter_without_chapter_clist}
% å¤§æ‘˜è¦ä¸­ä¸éœ€è¦éšç«&nbsp;ç¼–å·çš„å„è®¡æ•°å™¨ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\clist_set:Nn \l_@@_counter_without_chapter_clist
  { section, figure, table, equation }
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{variable}
%
% \subsubsection{è„šæ³¨}
%
% \begin{macro}[int]{\@@_circled_number:N}
% é€šè¿‡ Unicode ç&nbsp;ä½è°ƒç”¨å¸¦åœˆæ•°å­—ã€‚
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { circled-number-exceed }
  { Circled~number~exceed~50! }
\cs_new:Npn \@@_circled_number:N #1
  {
    \int_compare:nNnTF {#1} &lt; { 21 }
      { \@@_unicode_char:n { \int_eval:n { "2460 - 1 + #1 } } }
      {
        \int_compare:nNnTF {#1} &lt; { 36 }
          { \@@_unicode_char:n { \int_eval:n { "3251 - 21 + #1 } } }
          {
            \int_compare:nNnTF {#1} &lt; { 51 }
              { \@@_unicode_char:n { \int_eval:n { "32B1 - 36 + #1 } } }
              {
                \msg_warning:nn { sjtutex } { circled-number-exceed }
                \int_to_arabic:n {#1}
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{style/fnmark-font}
% è„šæ³¨ç¼–å·å­—ä½“ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    fnmark-font           .choice: ,
    fnmark-font / haranoaji .code:n =
      {
        \@@_if_engine_opentype:TF
          {
            \tl_set:Nn \l_@@_style_fnmark_font_tl
              {
                \CJKfontspec { HaranoAjiMincho }
                  [
                    Extension   = .otf ,
                    UprightFont = *-Regular ,
                    BoldFont    = *-Bold
                  ]
              }
          }
          { \tl_set_eq:NN \l_@@_style_fnmark_font_tl \c_empty_tl }
      } ,
    fnmark-font / unknown .tl_set:N = \l_@@_style_fnmark_font_tl ,
    fnmark-font          .initial:V = \c_empty_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{style/fnmark-style}
% è„šæ³¨ç¼–å·æ&nbsp;·å¼ã€‚
% é‡å®šä¹‰å†…éƒ¨è„šæ³¨æ–‡å­—å‘½ä»¤ï¼Œä½¿ç”¨å¸¦åœˆæ•°å­—ç¼–å·æ—¶ï¼Œè„šæ³¨ä¸ä½¿ç”¨ä¸Šæ&nbsp;‡ã€‚
% è§ \url{https://www.zhihu.com/question/53030087}ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    fnmark-style           .choice: ,
    fnmark-style / plain   .code:n =
      {
        \cs_set:Npn \SJTU@makefnmark
          { \hbox:n { \@textsuperscript { \normalfont \@thefnmark } } }
        \tl_set:Nn \thefootnote
          { \arabic { footnote } }
        \tl_set:Nn \thempfootnote
          { { \itshape \alph { mpfootnote } } }
      } ,
    fnmark-style / circled .code:n =
      {
        \cs_set:Npn \SJTU@makefnmark
          { \hbox:n { \@thefnmark } }
        \tl_set:Nn \thefootnote
          { { \l_@@_style_fnmark_font_tl \@@_circled_number:N \c@footnote } }
        \tl_set:Nn \thempfootnote
          { { \l_@@_style_fnmark_font_tl \@@_circled_number:N \c@mpfootnote } }
      }
  }
%&lt;/class&gt;
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%&lt;*scheme&gt;
\keys_set:nn { sjtu / style }
%&lt;zh|ja&gt;  { fnmark-style = circled }
%&lt;en|de&gt;  { fnmark-style = plain   }
%&lt;/scheme&gt;
%    \end{macrocode}
%
% åœ¨å¯¼è¨€æœ«å°¾ä¿®æ”¹ \tn{@makefntext}ï¼Œæ”¯æŒä½¿ç”¨ \pkg{footmisc} ä¿®æ”¹è„šæ³¨æ&nbsp;¼å¼ã€‚
%    \begin{macrocode}
%&lt;*class&gt;
\ctex_at_end_preamble:n
  {
    \cs_set_eq:NN \SJTU@orig@makefntext \@makefntext
    \cs_set:Npn \@makefntext #1
      {
        \group_begin:
          \cs_set_eq:NN \@makefnmark \SJTU@makefnmark
          \SJTU@orig@makefntext {#1}
        \group_end:
      }
  }
%    \end{macrocode}
%
% \subsection{å¤šè¯­è¨€æ”¯æŒ}
%
% \begin{variable}{\l_@@_lang_tl}
%    \begin{macrocode}
\tl_set_eq:NN \l_@@_lang_tl \g_@@_lang_tl
%    \end{macrocode}
% \end{variable}
%
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { lang-validation }
  { Invalid~language~argument~'#1'! }
\keys_define:nn { sjtu / private }
  {
    lang .choice: ,
    lang .value_required:n = true ,
    lang .groups:n = { lang } ,
    lang / unknown .code:n =
      { \msg_warning:nnn { sjtutex } { lang-validation } {#1} }
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\@@_select_language:n}
% é€‰æ‹©å±€éƒ¨è¯­è¨€ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_select_language:n
  { \keys_set_groups:nnn { sjtu / private } { lang } }
%    \end{macrocode}
% \end{macro}
%
% è½½å…¥è¯­è¨€é…ç½®æ–‡ä»¶ã€‚
%    \begin{macrocode}
%&lt;thesis&gt;\clist_map_inline:Nn \g_@@_lang_clist
%&lt;thesis&gt;  { \file_input:n { sjtu-lang- #1 .def } }
%&lt;!thesis&gt;\file_input:n { sjtu-lang- \g_@@_lang_tl .def }
\file_input:n { sjtu-scheme- \g_@@_lang_tl .def }
%&lt;/class&gt;
%    \end{macrocode}
%
% \begin{macro}[int]{\@@_set_cjk_default_zh:,\@@_set_cjk_default_ja:}
% è®¾ç½® CJK é»˜è®¤å­—ä½“æ—çš„è¾…åŠ©å‘½ä»¤ã€‚
%    \begin{macrocode}
%&lt;*lang&gt;
%&lt;*zh&gt;
\cs_new_protected:Nn \@@_set_cjk_default_zh:
  {
    \tl_set:Nn \CJKrmdefault { zhsong }
    \tl_set:Nn \CJKsfdefault { zhhei  }
    \tl_set:Nn \CJKttdefault { zhfs   }
  }
%&lt;/zh&gt;
%&lt;*ja&gt;
\cs_new_protected:Nn \@@_set_cjk_default_ja:
  {
    \tl_set:Nn \CJKrmdefault { jamin  }
    \tl_set:Nn \CJKsfdefault { jagoth }
    \tl_set:Nn \CJKttdefault { jagoth }
  }
%&lt;/ja&gt;
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.2.1}{2025/03/27}{æ–°å¢žè¯­è¨€è®¾ç½®é’©å­ã€‚}
% è¯­è¨€è®¾ç½®é’©å­ã€‚
%    \begin{macrocode}
%&lt;zh&gt;\NewHook { sjtutex / lang / zh }
%&lt;en&gt;\NewHook { sjtutex / lang / en }
%&lt;de&gt;\NewHook { sjtutex / lang / de }
%&lt;ja&gt;\NewHook { sjtutex / lang / ja }
%    \end{macrocode}
%
%    \begin{macrocode}
\keys_define:nn { sjtu / private }
  {
%&lt;zh&gt;    lang / zh .code:n =
%&lt;en&gt;    lang / en .code:n =
%&lt;de&gt;    lang / de .code:n =
%&lt;ja&gt;    lang / ja .code:n =
      {
        \tl_set_eq:NN \l_@@_lang_tl \l_keys_value_tl
%&lt;zh&gt;        \@@_set_cjk_default_zh:
%&lt;ja&gt;        \@@_set_cjk_default_ja:
        \normalfont
%&lt;zh&gt;        \UseHook { sjtutex / lang / zh }
%&lt;en&gt;        \UseHook { sjtutex / lang / en }
%&lt;de&gt;        \UseHook { sjtutex / lang / de }
%&lt;ja&gt;        \UseHook { sjtutex / lang / ja }
      } ,
%&lt;zh&gt;    zh .meta:n = { lang = zh } ,
%&lt;zh&gt;    zh .groups:n = { lang }
%&lt;en&gt;    en .meta:n = { lang = en } ,
%&lt;en&gt;    en .groups:n = { lang }
%&lt;de&gt;    de .meta:n = { lang = de } ,
%&lt;de&gt;    de .groups:n = { lang }
%&lt;ja&gt;    ja .meta:n = { lang = ja } ,
%&lt;ja&gt;    ja .groups:n = { lang }
  }
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;zh&gt;\AddToHook { sjtutex / lang / zh }
%&lt;en&gt;\AddToHook { sjtutex / lang / en }
%&lt;de&gt;\AddToHook { sjtutex / lang / de }
%&lt;ja&gt;\AddToHook { sjtutex / lang / ja }
  {
%&lt;zh&gt;    \tl_set:Nn \languagename { chinese }
%&lt;en&gt;    \tl_set:Nn \languagename { english }
%&lt;de&gt;    \tl_set:Nn \languagename { ngerman }
%&lt;ja&gt;    \tl_set:Nn \languagename { japanese }
%&lt;zh&gt;    \ctex_set:n { autoindent = true }
%&lt;en|de&gt;    \ctex_set:n { autoindent = 1.5 em }
%&lt;ja&gt;    \ctex_set:n { autoindent = 1 }
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\@@_title_case_aux_zh:n,\@@_title_case_aux_en:n,
% \@@_title_case_aux_de:n,\@@_title_case_aux_ja:n}
% è®¾ç½®æ&nbsp;‡é¢˜å¤§å°å†™è½¬æ¢çš„è¾…åŠ©å‘½ä»¤ã€‚
%    \begin{macrocode}
%&lt;zh&gt;\cs_set_eq:NN \@@_title_case_aux_zh:n \use:n
%&lt;en&gt;\cs_set_eq:NN \@@_title_case_aux_en:n \MakeUppercase
%&lt;de&gt;\cs_set_eq:NN \@@_title_case_aux_de:n \MakeUppercase
%&lt;ja&gt;\cs_set_eq:NN \@@_title_case_aux_ja:n \use:n
%    \end{macrocode}
% \end{macro}
%
% é€šç”¨åç§°å¸¸é‡ã€‚
%    \begin{macrocode}
\clist_map_inline:nn
  {
%&lt;zh&gt;    { keywords } { å…³é”®è¯          } ,
%&lt;en&gt;    { keywords } { Key~words       } ,
%&lt;de&gt;    { keywords } { SchlÃ¼sselwÃ¶rter } ,
%&lt;ja&gt;    { keywords } { ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰      } ,
%&lt;zh|ja&gt;    { info_sep } { ï¼š \null        } ,
%&lt;en|de&gt;    { info_sep } { \hbox { :~ }    } ,
%&lt;zh&gt;    { item_sep } { ï¼Œ              }
%&lt;en|de&gt;    { item_sep } { ,~              }
%&lt;ja&gt;    { item_sep } { \quad           }
  }
%&lt;zh&gt;  { \@@_name_const:nnn { zh } #1 }
%&lt;en&gt;  { \@@_name_const:nnn { en } #1 }
%&lt;de&gt;  { \@@_name_const:nnn { de } #1 }
%&lt;ja&gt;  { \@@_name_const:nnn { ja } #1 }
%&lt;/lang&gt;
%    \end{macrocode}
%
% åˆå§‹åŒ–è¯­è¨€åç§°ã€‚
%    \begin{macrocode}
%&lt;*scheme&gt;
%&lt;zh&gt;\tl_set:Nn \languagename { chinese  }
%&lt;en&gt;\tl_set:Nn \languagename { english  }
%&lt;de&gt;\tl_set:Nn \languagename { ngerman  }
%&lt;ja&gt;\tl_set:Nn \languagename { japanese }
%    \end{macrocode}
%
% è®¾ç½®åç§°é€‰é¡¹ã€‚é»˜è®¤å€¼ä¸ºè‹±æ–‡ï¼Œåªéœ€ä¿®æ”¹å…¶ä»–è¯­ç§ã€‚
%    \begin{macrocode}
%&lt;*!en&gt;
\keys_set_known:nn { sjtu / name }
  {
%&lt;*zh&gt;
    contents      = { ç›® \protect \quad å½•   } ,
    listfigure    = { æ’ \protect \quad å›¾   } ,
    listtable     = { è¡¨ \protect \quad æ&nbsp;¼   } ,
    figure        = { å›¾                     } ,
    table         = { è¡¨                     } ,
    abstract      = { æ‘˜ \protect \quad è¦   } ,
    index         = { ç´¢ \protect \quad å¼•   } ,
    appendix      = { é™„å½•                   } ,
    proof         = { è¯æ˜Ž                   } ,
    bib           = { å‚è€ƒæ–‡çŒ®               } ,
    figure*       = { Figure                 } ,
    table*        = { Table                  } ,
    algorithm     = { ç®—æ³•                   } ,
    listalgorithm = { ç®— \protect \quad æ³•   } ,
    abbr          = { ç¼©ç•¥è¯­å¯¹ç…§è¡¨           } ,
    nom           = { ç¬¦å·å¯¹ç…§è¡¨             } ,
    ack           = { è‡´ \protect \quad è°¢   } ,
    resume        = { ä¸ªäººç®€åŽ†               } ,
    digest        = { å¤§æ‘˜è¦                 } ,
    achv          = { å­¦æœ¯è®ºæ–‡å’Œç§‘ç&nbsp;”æˆæžœç›®å½• }
%&lt;/zh&gt;
%&lt;*de&gt;
    contents      = { Inhaltsverzeichnis     } ,
    listfigure    = { Abbildungsverzeichnis  } ,
    listtable     = { Tabellenverzeichnis    } ,
    figure        = { Abbildung              } ,
    table         = { Tabelle                } ,
    abstract      = { Zusammenfassung        } ,
    index         = { Index                  } ,
    appendix      = { Anhang                 } ,
    proof         = { Beweis                 } ,
    bib           = { Literaturverzeichnis   } ,
    part          = { Teil                   } ,
    chapter       = { Kapitel                } ,
    figure*       = { Figure                 } ,
    table*        = { Table                  } ,
    algorithm     = { Algorithmus            } ,
    listalgorithm = { Algorithmenverzeichnis } ,
    abbr          = { AbkÃ¼rzungsverzeichnis  } ,
    nom           = { Symbolverzeichnis      } ,
    ack           = { Danksagungen           } ,
    resume        = { Lebenslauf             } ,
    digest        = { Kurzfassung            } ,
    achv          = { Forschungsleistungen   }
%&lt;/de&gt;
%&lt;*ja&gt;
    contents      = { ç›® \protect \quad æ¬¡ } ,
    listfigure    = { å›³ç›®æ¬¡               } ,
    listtable     = { è¡¨ç›®æ¬¡               } ,
    figure        = { å›³                   } ,
    table         = { è¡¨                   } ,
    abstract      = { æ¦‚ \protect \quad è¦ } ,
    index         = { ç´¢ \protect \quad å¼• } ,
    appendix      = { ä»˜éŒ²                 } ,
    proof         = { è¯æ˜Ž                 } ,
    bib           = { å‚è€ƒæ–‡çŒ®             } ,
    figure*       = { Figure               } ,
    table*        = { Table                } ,
    algorithm     = { ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ&nbsp;         } ,
    listalgorithm = { ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ&nbsp;ç›®æ¬¡     } ,
    abbr          = { ç•¥èªžè¡¨               } ,
    nom           = { è¨˜å·è¡¨               } ,
    ack           = { è¬ \protect \quad è¾ž } ,
    resume        = { å±¥æ­´æ›¸               } ,
    digest        = { è¦ \protect \quad ç´„ } ,
    achv          = { ç&nbsp;”ç©¶æ¥­ç¸¾æ›¸           }
%&lt;/ja&gt;
  }
%&lt;/!en&gt;
%&lt;/scheme&gt;
%    \end{macrocode}
%
% å­¦ä½è®ºæ–‡åç§°å¸¸é‡ã€‚
%    \begin{macrocode}
%&lt;*thesis-i18n&gt;
%&lt;zh&gt;\@@_symbol_const:nn { white_square } { "25A1 }
%&lt;zh&gt;\@@_name_const_from_clist:nnnn { zh }
%&lt;en&gt;\@@_name_const_from_clist:nnnn { en }
%&lt;de&gt;\@@_name_const_from_clist:nnnn { de }
%&lt;ja&gt;\@@_name_const_from_clist:nnnn { ja }
  { degree_level } { \g_@@_thesis_type_int }
%&lt;zh&gt;  { å­¦å£«, ç¡•å£«, åšå£« }
%&lt;en&gt;  { Bachelor, Master, Doctor }
%&lt;de&gt;  { Bachelor, Master, Doktor }
%&lt;ja&gt;  { å­¦å£«, ä¿®å£«, åšå£« }
\clist_map_inline:nn
  {
%&lt;*zh&gt;
    { univ             } { ä¸Šæµ·äº¤é€šå¤§å­¦           } ,
    { address          } { ä¸­å›½ãƒ»ä¸Šæµ·             } ,
    { thesis           } { å­¦ä½è®ºæ–‡               } ,
    { title_page       } { é¢˜åé¡µ                 } ,
    { declaration      } { åŽŸåˆ›æ€§å£°æ˜ŽåŠä½¿ç”¨æŽˆæƒä¹¦ } ,
    { orig_decl        } { åŽŸåˆ›æ€§å£°æ˜Ž             } ,
    { auth_decl        } { ä½¿ç”¨æŽˆæƒä¹¦             } ,
    { decl_author      } { å­¦ä½è®ºæ–‡ä½œè€…           } ,
    { decl_supervisor  } { æŒ‡å¯¼æ•™å¸ˆ               } ,
    { abstract         } { æ‘˜ \protect \quad è¦   }
%&lt;/zh&gt;
%&lt;*en&gt;
    { univ             } { Shanghai~ Jiao~ Tong~ University } ,
    { address          } { Shanghai,~ P.R.~ China           } ,
    { title_page       } { Title~ Page                      } ,
    { declaration      } { Statutory~ Declaration           } ,
    { abstract         } { Abstract                         }
%&lt;/en&gt;
%&lt;*de&gt;
    { univ             } { Shanghai~ Jiao~ Tong~ UniversitÃ¤t } ,
    { address          } { Shanghai,~ VR~ China              } ,
    { title_page       } { Titelblatt                        } ,
    { declaration      } { Eidesstattliche~ ErklÃ¤rung        } ,
    { abstract         } { Abstrakt                          }
%&lt;/de&gt;
%&lt;*ja&gt;
    { univ             } { ä¸Šæµ·äº¤é€šå¤§å­¦         } ,
    { address          } { ä¸­å›½ãƒ»ä¸Šæµ·           } ,
    { thesis           } { å­¦ä½è«‹æ±‚è«–æ–‡         } ,
    { title_page       } { æ¨™é¡Œç´™               } ,
    { declaration      } { èª“ç´„æ›¸ãƒ»å…¬è¡¨è¨±è«¾æ›¸   } ,
    { abstract         } { è¦ \protect \quad æ—¨ }
%&lt;/ja&gt;
  }
%&lt;zh&gt;  { \@@_name_const:nnn { zh } #1 }
%&lt;en&gt;  { \@@_name_const:nnn { en } #1 }
%&lt;de&gt;  { \@@_name_const:nnn { de } #1 }
%&lt;ja&gt;  { \@@_name_const:nnn { ja } #1 }
\clist_map_inline:nn
  {
%&lt;*zh&gt;
    { author           } { å§“å              } ,
    { id               } { å­¦å·              } ,
    { supervisor       } { å¯¼å¸ˆ              } ,
    { assoc_supervisor } { å‰¯å¯¼å¸ˆ            } ,
    { co_supervisor    } { è”åˆå¯¼å¸ˆ          } ,
    { department       } { é™¢ç³»              } ,
    { major            } { å­¦ç§‘ \, / \, ä¸“ä¸š } ,
    { degree           } { ç”³è¯·å­¦ä½          }
%&lt;/zh&gt;
%&lt;*en&gt;
    { author           } { Author             } ,
    { supervisor       } { Supervisor         } ,
    { assoc_supervisor } { Assoc.\ Supervisor } ,
    { co_supervisor    } { Co-supervisor      }
%&lt;/en&gt;
%&lt;*de&gt;
    { author           } { Autor/in         } ,
    { supervisor       } { Betreuer/in      } ,
    { assoc_supervisor } { Zweitbetreuer/in } ,
    { co_supervisor    } { Co-Betreuer/in   }
%&lt;/de&gt;
%&lt;*ja&gt;
    { author           } { æ°å       } ,
    { supervisor       } { æŒ‡å°Žæ•™å“¡   } ,
    { assoc_supervisor } { å‰¯æŒ‡å°Žæ•™å“¡ } ,
    { co_supervisor    } { å…±åŒæŒ‡å°Ž   }
%&lt;/ja&gt;
  }
%&lt;zh&gt;  { \@@_name_set:nnn { zh } #1 }
%&lt;en&gt;  { \@@_name_set:nnn { en } #1 }
%&lt;de&gt;  { \@@_name_set:nnn { de } #1 }
%&lt;ja&gt;  { \@@_name_set:nnn { ja } #1 }
%    \end{macrocode}
%
% \changes{v2.0.3}{2023/04/08}{æ›´æ–°å­¦ä½è®ºæ–‡åˆå§‹è‹±æ–‡ä¸»é¢˜ã€‚}
% åˆå§‹åŒ–ä¸»é¢˜ã€‚
%    \begin{macrocode}
%&lt;zh&gt;\keys_define:nn { sjtu / info / zh }
%&lt;en&gt;\keys_define:nn { sjtu / info / en }
%&lt;de&gt;\keys_define:nn { sjtu / info / de }
%&lt;ja&gt;\keys_define:nn { sjtu / info / ja }
  {
    subject          .initial:n =
      {
%&lt;*zh&gt;
        \c_@@_name_univ_zh_tl
        \c_@@_name_degree_level_zh_tl
        \c_@@_name_thesis_zh_tl
%&lt;/zh&gt;
%&lt;*en&gt;
        A~ Dissertation~ Submitted~ to \\
        { \c_@@_name_univ_en_tl }~ for~
        the~ Degree~ of~ { \c_@@_name_degree_level_en_tl }
%&lt;/en&gt;
%&lt;*de&gt;
        Eine~ Dissertation~ Eingereicht~ an \\
        der~ { \c_@@_name_univ_de_tl }~ fÃ¼r~
        { \c_@@_name_degree_level_de_tl } titel
%&lt;/de&gt;
%&lt;*ja&gt;
        \c_@@_name_univ_ja_tl
        \c_@@_name_degree_level_ja_tl
        \c_@@_name_thesis_ja_tl
%&lt;/ja&gt;
      }
  }
%&lt;/thesis-i18n&gt;
%    \end{macrocode}
%
% å°†å½¢å¦‚ |yyyy-mm-dd| æˆ– |yyyy-mm| çš„ ISO æ—¥æœŸæ&nbsp;¼å¼å­—ç¬¦ä¸²è½¬åŒ–ä¸ºæ—¥æœŸè¡¨ç¤ºã€‚
%
% æ—¥æœŸå¸¸é‡ã€‚
%    \begin{macrocode}
%&lt;*lang&gt;
%&lt;*zh|ja&gt;
\clist_map_inline:nn
  {
    { year  } { å¹´ } ,
    { month } { æœˆ } ,
    { day   } { æ—¥ }
  }
%&lt;zh&gt;  { \@@_name_const:nnn { zh } #1 }
%&lt;ja&gt;  { \@@_name_const:nnn { ja } #1 }
%&lt;/zh|ja&gt;
%&lt;*en&gt;
\clist_const:Nn \c_@@_name_month_en_clist
  {
    January, February, March, April, May, June,
    July, August, September, October, November, December
  }
%&lt;/en&gt;
%&lt;*de&gt;
\clist_const:Nn \c_@@_name_month_de_clist
  {
    Januar, Februar, MÃ¤rz, April, Mai, Juni,
    Juli, August, September, Oktober, November, Dezember
  }
%&lt;/de&gt;
%    \end{macrocode}
%
% \begin{macro}[int]{\@@_date_aux_zh:nnn,\@@_date_aux_zh:w,
% \@@_date_aux_short_zh:nn,\@@_date_aux_short_zh:w}
% ä¸­æ–‡æ—¥æœŸã€‚
%    \begin{macrocode}
%&lt;*zh&gt;
\cs_new:Npn \@@_date_aux_zh:nnn #1#2#3
  {
    \int_to_arabic:n {#1} ~ { \exp_not:V \c_@@_name_year_zh_tl  } ~
    \int_to_arabic:n {#2} ~ { \exp_not:V \c_@@_name_month_zh_tl } ~
    \int_to_arabic:n {#3} ~ { \exp_not:V \c_@@_name_day_zh_tl   }
  }
\cs_new:Npn \@@_date_aux_zh:w #1-#2-#3 \q_stop
  { \@@_date_aux_zh:nnn {#1} {#2} {#3} }
\cs_new:Npn \@@_date_aux_short_zh:nn #1#2
  {
    \int_to_arabic:n {#1} ~ { \exp_not:V \c_@@_name_year_zh_tl  } ~
    \int_to_arabic:n {#2} ~ { \exp_not:V \c_@@_name_month_zh_tl }
  }
\cs_new:Npn \@@_date_aux_short_zh:w #1-#2 \q_stop
  { \@@_date_aux_short_zh:nn {#1} {#2} }
%&lt;/zh&gt;
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_ordinal_en:n}
% ä¸Šæ&nbsp;‡å½¢å¼çš„åºæ•°è¯ã€‚
%    \begin{macrocode}
%&lt;*en&gt;
\cs_new:Npn \@@_ordinal_en:n #1
  {
    \int_to_arabic:n {#1}
    \exp_not:N \textsuperscript
      {
        \int_case:nnF { \int_mod:nn {#1} { 100 } }
          {
            { 11 } { th }
            { 12 } { th }
            { 13 } { th }
          }
          {
            \int_case:nnF { \int_mod:nn {#1} { 10 } }
              {
                { 1 } { st }
                { 2 } { nd }
                { 3 } { rd }
              }
              { th }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_date_aux_en:nnn,\@@_date_aux_en:w,
% \@@_date_aux_short_en:nn,\@@_date_aux_short_en:w}
% è‹±æ–‡æ—¥æœŸã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_date_aux_en:nnn #1#2#3
  {
    \clist_item:Nn \c_@@_name_month_en_clist {#2} ~
    \@@_ordinal_en:n {#3} ,~
    \int_to_arabic:n {#1}
  }
\cs_new:Npn \@@_date_aux_en:w #1-#2-#3 \q_stop
  { \@@_date_aux_en:nnn {#1} {#2} {#3} }
\cs_new:Npn \@@_date_aux_short_en:nn #1#2
  {
    \clist_item:Nn \c_@@_name_month_en_clist {#2} ,~
    \int_to_arabic:n {#1}
  }
\cs_new:Npn \@@_date_aux_short_en:w #1-#2 \q_stop
  { \@@_date_aux_short_en:nn {#1} {#2} }
%&lt;/en&gt;
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_date_aux_de:nnn,\@@_date_aux_de:w,
% \@@_date_aux_short_de:nn,\@@_date_aux_short_de:w}
% å¾·æ–‡æ—¥æœŸã€‚
%    \begin{macrocode}
%&lt;*de&gt;
\cs_new:Npn \@@_date_aux_de:nnn #1#2#3
  {
    \clist_item:Nn \c_@@_name_month_de_clist {#2} ~
    {#3} ,~ \int_to_arabic:n {#1}
  }
\cs_new:Npn \@@_date_aux_de:w #1-#2-#3 \q_stop
  { \@@_date_aux_de:nnn {#1} {#2} {#3} }
\cs_new:Npn \@@_date_aux_short_de:nn #1#2
  {
    \clist_item:Nn \c_@@_name_month_de_clist {#2} ,~
    \int_to_arabic:n {#1}
  }
\cs_new:Npn \@@_date_aux_short_de:w #1-#2 \q_stop
  { \@@_date_aux_short_de:nn {#1} {#2} }
%&lt;/de&gt;
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_date_aux_ja:nnn,\@@_date_aux_ja:w,
% \@@_date_aux_short_ja:nn,\@@_date_aux_short_ja:w}
% æ—¥æ–‡æ—¥æœŸã€‚
%    \begin{macrocode}
%&lt;*ja&gt;
\cs_new:Npn \@@_date_aux_ja:nnn #1#2#3
  {
    \int_to_arabic:n {#1} ~ { \exp_not:V \c_@@_name_year_ja_tl  } ~
    \int_to_arabic:n {#2} ~ { \exp_not:V \c_@@_name_month_ja_tl } ~
    \int_to_arabic:n {#3} ~ { \exp_not:V \c_@@_name_day_ja_tl   }
  }
\cs_new:Npn \@@_date_aux_ja:w #1-#2-#3 \q_stop
  { \@@_date_aux_ja:nnn {#1} {#2} {#3} }
\cs_new:Npn \@@_date_aux_short_ja:nn #1#2
  {
    \int_to_arabic:n {#1} ~ { \exp_not:V \c_@@_name_year_ja_tl  } ~
    \int_to_arabic:n {#2} ~ { \exp_not:V \c_@@_name_month_ja_tl }
  }
\cs_new:Npn \@@_date_aux_short_ja:w #1-#2 \q_stop
  { \@@_date_aux_short_ja:nn {#1} {#2} }
%&lt;/ja&gt;
%&lt;/lang&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsection{ä¿¡æ¯å½•å…¥}
%
% \changes{v2.0}{2022/12/17}{æ·»åŠ&nbsp; \opt{display-date} é”®ã€‚}
% \changes{v2.0}{2022/12/23}{ä½¿ç”¨ \opt{assoc-supervisor} é”®è¡¨ç¤ºå‰¯å¯¼å¸ˆï¼Œ
%                            ä½¿ç”¨ \opt{co-supervisor} é”®è¡¨ç¤ºè”åˆå¯¼å¸ˆã€‚}
% \changes{v2.0}{2022/12/23}{æ·»åŠ&nbsp; \opt{subject} é”®ã€‚}
% \changes{v2.0}{2023/03/17}{ä½¿ç”¨è¯­è¨€ä»£ç&nbsp;å‰ç¼€åŒºåˆ«ä¸åŒè¯­ç§çš„ \opt{sjtu/info} é”®ã€‚}
% \begin{macro}[int]{\@@_info_keys_define:n}
% å®šä¹‰ \cls{sjtuthesis} ä¸åŒè¯­ç§ |sjtu/info| é”®å€¼ç±»çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
%&lt;*class&gt;
%&lt;*thesis&gt;
\msg_new:nnn { sjtutex } { key-already-defined }
  { Key~'#1'~is~already~defined~and~redefination~is~being~ignored. }
\msg_new:nnn { sjtutex } { key-invalid }
  { Key~'#1'~is~invalid~and~ignored. }
\msg_new:nnn { sjtutex } { key-needs-two-arguments }
  { Key~'#1'~needs~two~arguments~otherwise~ignored. }
\cs_new_protected:Npn \@@_info_keys_define:n #1
  {
    \clist_map_inline:nn
      {
        title, display_title, subject, date, department, major,
        author, supervisor, assoc_supervisor, co_supervisor, degree
      }
      { \tl_new:c { l_@@_info_ ##1 _ #1 _tl } }
    \clist_map_inline:nn
      { keywords, fund }
      { \clist_new:c { l_@@_info_ ##1 _ #1 _clist } }
    \bool_if:NTF \g_@@_review_bool
      {
        \seq_set_from_clist:cn { l_@@_info_show_ #1 _seq }
          { author, id, supervisor, department, major, degree }
      }
      { \seq_new:c { l_@@_info_show_ #1 _seq } }
    \keys_define:nn { sjtu }
      { info / #1 .meta:nn = { sjtu / info / #1 } {##1} }
    \keys_define:nn { sjtu / info }
      {        #1 .meta:nn = { sjtu / info / #1 } {##1} }
    \keys_define:nn { sjtu / info / #1 }
      {
        display-title       .code:n =
          {
            \tl_set:co { l_@@_info_display_title_ #1 _tl }
              { \cs:w @@_title_case_aux_ #1 :n \cs_end: {##1} }
          } ,
        title               .code:n =
          {
            \tl_set:cn { l_@@_info_title_ #1 _tl } {##1}
            \tl_if_empty:cT { l_@@_info_display_title_ #1 _tl }
              { \keys_set:nn { sjtu / info / #1 } { display-title = {##1} } }
          } ,
        subject           .tl_set:c = { l_@@_info_subject_ #1 _tl } ,
        keywords       .clist_set:c = { l_@@_info_keywords_ #1 _clist } ,
        fund           .clist_set:c = { l_@@_info_fund_ #1 _clist } ,
        fund              .groups:n = { sensitive } ,
        date               .meta:nn = { sjtu / info } { date = {##1} } ,
        display-date      .tl_set:c = { l_@@_info_date_ #1 _tl } ,
        @show+              .code:n =
          {
            \seq_if_in:cnF { l_@@_info_show_ #1 _seq } {##1}
              { \seq_put_right:cn { l_@@_info_show_ #1 _seq } {##1} }
          } ,
        @show+            .groups:n = { sensitive } ,
        custom             .meta:nn = { sjtu / info / #1 / custom } {##1} ,
        custom / unknown    .code:n =
          {
            \regex_match:nVTF { \A [a-z] [a-z0-9\-]* \Z } \l_keys_key_str
              {
                \keys_if_exist:neTF { sjtu / info / #1 } \l_keys_key_str
                  {
                    \msg_warning:nne { sjtutex } { key-already-defined }
                      \l_keys_path_str
                  }
                  {
                    \int_compare:nNnTF { \tl_count:n {##1} } = { 2 }
                      {
                        \tl_set_eq:NN \l_@@_tmp_tl \l_keys_key_str
                        \tl_replace_all:Nnn \l_@@_tmp_tl { - } { _ }
                        \tl_set:co { l_@@_name_ \l_@@_tmp_tl _ #1 _tl }
                          { \use_i:nn  ##1 }
                        \tl_set:co { l_@@_info_ \l_@@_tmp_tl _ #1 _tl }
                          { \use_ii:nn ##1 }
                        \exp_args:Ne \@@_setup:n
                          { info / #1 / @show+ = \l_@@_tmp_tl }
                      }
                      {
                        \msg_warning:nne { sjtutex } { key-needs-two-arguments }
                          \l_keys_path_str
                      }
                  }
              }
              { \msg_warning:nne { sjtutex } { key-invalid } \l_keys_path_str }
          }
      }
    \clist_map_inline:nn
      {
        author, supervisor, assoc-supervisor, co-supervisor,
        department, major, degree
      }
      {
        \tl_set:Nn \l_@@_tmp_tl {##1}
        \tl_replace_all:Nnn \l_@@_tmp_tl { - } { _ }
        \keys_define:ne { sjtu / info / #1 }
          {
            ##1 .code:n =
              {
                \exp_not:N \tl_set:cn
                  { l_@@_info_ \l_@@_tmp_tl _ #1 _tl } {####1}
                \exp_not:N \@@_setup:n
                  { info / #1 / @show+ = \l_@@_tmp_tl }
              }
          }
      }
    \clist_map_inline:nn
      { author, supervisor, assoc-supervisor, co-supervisor }
      { \keys_define:nn { sjtu / info / #1 } { ##1 .groups:n = { sensitive } } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{info/id}
% \begin{variable}{\l_@@_info_id_zh_tl}
% å•ç‹¬å¤„ç†å­¦å·ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_info_id_zh_tl
\keys_define:nn { sjtu / info }
  {
    id   .code:n =
      {
        \tl_set:Nn \l_@@_info_id_zh_tl {#1}
        \@@_setup:n { info / zh / @show+ = id }
      } ,
    id .groups:n = { sensitive }
  }
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% å®šä¹‰ \cls{sjtuthesis} ä¸­ä¸åŒè¯­ç§çš„ä¿¡æ¯é”®å€¼ç±»ã€‚
%    \begin{macrocode}
\clist_map_inline:Nn \g_@@_lang_clist
  { \@@_info_keys_define:n {#1} }
%&lt;/thesis&gt;
%    \end{macrocode}
%
% å®šä¹‰ \cls{sjtureport} å’Œ \cls{sjtuarticle} ä¸­çš„ä¿¡æ¯é”®å€¼ç±»ã€‚
% \begin{variable}{\l_@@_info_subject_tl,\l_@@_info_keywords_clist}
%    \begin{macrocode}
%&lt;*!thesis&gt;
\tl_new:N \l_@@_info_subject_tl
\clist_new:N \l_@@_info_keywords_clist
\keys_define:nn { sjtu / info }
  {
    title             .tl_set:N = \@title ,
    author            .tl_set:N = \@author ,
    display-date      .tl_set:N = \@date ,
    subject           .tl_set:N = \l_@@_info_subject_tl ,
    keywords       .clist_set:N = \l_@@_info_keywords_clist ,
  }
%&lt;/!thesis&gt;
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{info/date}
% æ—¥æœŸã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / info }
  {
    date    .code:n =
      {
        \regex_match:nnTF { \A \d+ \- \d+ \- \d+ \Z } {#1}
          {
%&lt;*thesis&gt;
            \clist_map_inline:Nn \g_@@_lang_clist
              {
                \tl_set:ce { l_@@_info_date_ ##1 _tl }
                  { \exp_last_unbraced:ce { @@_date_aux_ ##1 :w } #1 \q_stop }
              }
%&lt;/thesis&gt;
%&lt;*!thesis&gt;
            \tl_set:Ne \@date
              {
                \exp_last_unbraced:ce
                  { @@_date_aux_ \g_@@_lang_tl :w } #1 \q_stop
              }
%&lt;/!thesis&gt;
          }
          {
            \regex_match:nnT { \A \d+ \- \d+ \Z } {#1}
              {
%&lt;*thesis&gt;
                \clist_map_inline:Nn \g_@@_lang_clist
                  {
                    \tl_set:ce { l_@@_info_date_ ##1 _tl }
                      { \exp_last_unbraced:ce { @@_date_aux_short_ ##1 :w } #1 \q_stop }
                  }
%&lt;/thesis&gt;
%&lt;*!thesis&gt;
                \tl_set:Ne \@date
                  {
                    \exp_last_unbraced:ce
                      { @@_date_aux_short_ \g_@@_lang_tl :w } #1 \q_stop
                  }
%&lt;/!thesis&gt;
              }
          }
      } ,
    date .initial:e =
      {
        \int_to_arabic:n { \c_sys_year_int  } -
        \int_to_arabic:n { \c_sys_month_int } -
        \int_to_arabic:n { \c_sys_day_int   }
      }
  }
%&lt;thesis&gt;\tl_set_eq:Nc \today { l_@@_info_date_ \g_@@_lang_tl _tl }
%&lt;!thesis&gt;\tl_set_eq:NN \today \@date
%    \end{macrocode}
% \end{macro}
%
% \subsection{ç‰¹æ®Šé¡µé¢}
%
% \subsubsection{é¡µé¢æ¨¡æ¿}
%
% ä½¿ç”¨ \pkg{lttemplates} æž„å»ºé¡µé¢æ¨¡æ¿ï¼Œç”¨äºŽç»˜åˆ¶æ&nbsp;‡é¢˜é¡µä¸Žç‰ˆæƒé¡µã€‚
%
% é¡µé¢å…ƒç´&nbsp;æ¨¡æ¿ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\NewTemplateType { sjtu / element } { 0 }
\DeclareTemplateInterface { sjtu / element } { plain } { 0 }
  {
    format      : tokenlist = \c_empty_tl ,
    content     : tokenlist = \c_empty_tl ,
    bottom-skip : skip      = \c_zero_skip ,
    align       : choice { left, right, center, normal } = center
  }
\DeclareTemplateCode { sjtu / element } { plain } { 0 }
  {
    format      = \l_@@_element_format_tl ,
    content     = \l_@@_element_content_tl ,
    bottom-skip = \l_@@_element_bottom_skip ,
    align       =
      {
        left    =
          \cs_set_eq:NN \l_@@_element_align: \raggedright ,
        right   =
          \cs_set_eq:NN \l_@@_element_align: \raggedleft ,
        center  =
          \cs_set_eq:NN \l_@@_element_align: \centering ,
        normal  =
          \cs_set_eq:NN \l_@@_element_align: \prg_do_nothing:
      }
  }
  {
    \AssignTemplateKeys
    \group_begin:
      \l_@@_element_align:
      \l_@@_element_format_tl
      \l_@@_element_content_tl
      \par
    \group_end:
    \skip_vertical:N \l_@@_element_bottom_skip
    \skip_vertical:N \c_zero_skip
  }
%    \end{macrocode}
%
% é¡µé¢æ¨¡æ¿ã€‚
%    \begin{macrocode}
\NewTemplateType { sjtu / page } { 1 }
\DeclareTemplateInterface { sjtu / page } { title } { 1 }
  {
    bookmark : tokenlist ,
    style    : tokenlist = empty ,
    format   : tokenlist = \linespread { } \selectfont ,
    precode  : tokenlist ,
    prefix   : tokenlist ,
    elements : commalist
  }
\DeclareTemplateCode { sjtu / page } { title } { 1 }
  {
    bookmark = \l_@@_page_bookmark_tl ,
    style    = \l_@@_page_style_tl ,
    format   = \l_@@_page_format_tl ,
    precode  = \l_@@_page_precode_tl ,
    prefix   = \l_@@_page_prefix_tl ,
    elements = \l_@@_page_elements_clist
  }
  {
    \tl_set_eq:NN \l_@@_page_bookmark_tl \c_novalue_tl
    \AssignTemplateKeys
    \legacy_if:nTF { @openright }
      { \cleardoublepage } { \clearpage }
    \l_@@_page_precode_tl
    \exp_args:No \thispagestyle { \l_@@_page_style_tl }
    \group_begin:
      \@@_select_language:n {#1}
      \clist_gset_eq:Nc \l_@@_info_fund_clist
        { l_@@_info_fund_ \l_@@_lang_tl _clist }
      \exp_args:No \tl_if_novalue:nF { \l_@@_page_bookmark_tl }
        { \@@_pdf_bookmark:nn { 0 } { \l_@@_page_bookmark_tl } }
      \l_@@_page_format_tl
      \clist_map_inline:Nn \l_@@_page_elements_clist
        { \UseInstance { sjtu / element } { \l_@@_page_prefix_tl / ##1 } }
      \clearpage
    \group_end:
    \restoregeometry
  }
%    \end{macrocode}
%
% å£°æ˜Žæ¨¡æ¿å®žä¾‹çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_declare_element_instance:nnn #1#2#3
  { \DeclareInstance { sjtu / element } {#1/#2} { plain } {#3} }
\cs_new_protected:Npn \@@_declare_page_instance:nnn #1#2
  { \DeclareInstance { sjtu / page } {#1} { title } {#2} }
%    \end{macrocode}
%
% \subsubsection{æ&nbsp;‡é¢˜é¡µ}
%
% \changes{v2.0}{2022/12/13}{å¯ç”¨æ–°ç‰ˆå°é¢ã€‚}
% \changes{v2.0.2}{2023/04/01}{æ&nbsp;‡é¢˜é¡µæ—¥æœŸåº•éƒ¨å¢žåŠ&nbsp;ç©ºç™½ã€‚}
% \changes{v2.1}{2023/11/30}{æ&nbsp;‡é¢˜é¡µä¿¡æ¯æ&nbsp;æ”¹ç”¨è¡¨æ&nbsp;¼å®žçŽ°ã€‚}
% \changes{v2.1.4}{2024/08/14}{æ&nbsp;‡é¢˜é¡µä¿¡æ¯æ&nbsp;å…è®¸æ‰‹åŠ¨æ¢è¡Œã€‚}
% \changes{v2.1.5}{2024/11/06}{ä¿®å¤äº† \pkg{array} æ›´æ–°é€&nbsp;æˆçš„æ&nbsp;‡é¢˜é¡µç”Ÿæˆå¤±è´¥çš„é—®é¢˜ã€‚}
%
% \begin{variable}{\SJTU@CT@W@width}
%    \begin{macrocode}
\tl_set:Nn \SJTU@CT@W@width { 5 em }
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\SJTU@CT@W,\SJTU@CT@R,\SJTU@CT@L}
%    \begin{macrocode}
\newcolumntype { \SJTU@CT@W } [ 1 ]
  {
    w {#1} { \SJTU@CT@W@width }
    @{ \tl_use:c { c_@@_name_info_sep_ \l_@@_lang_tl _tl } }
  }
\newcolumntype { \SJTU@CT@R }
  { r @{ \tl_use:c { c_@@_name_info_sep_ \l_@@_lang_tl _tl } } }
\newcolumntype { \SJTU@CT@L }
  { &gt;{ \linespread { 0.75 } \normalfont } l }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\@@_info_table_row:nn,\@@_info_table_row:vv,
% \@@_title_page_info_table:n}
% ä¿¡æ¯è¾“å‡ºã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_info_table_row:nn #1#2
  {
    \exp_not:n {#1}
    &amp;
    \exp_not:N \hbox:n
      {
        \exp_not:N \tabular [ t ] { @{} l @{} }
          \exp_not:n {#2}
        \exp_not:N \endtabular
      }
  }
\cs_generate_variant:Nn \@@_info_table_row:nn { vv }
\cs_new_protected:Npn \@@_title_page_info_table:n #1
  {
    \group_begin:
      \clist_clear:N \l_@@_tmp_clist
      \seq_map_inline:cn { l_@@_info_show_ \l_@@_lang_tl _seq }
        {
          \bool_lazy_all:nT
            {
              { \tl_if_exist_p:c { l_@@_name_ ##1 _ \l_@@_lang_tl _tl } }
              { \tl_if_exist_p:c { l_@@_info_ ##1 _ \l_@@_lang_tl _tl } }
            }
            {
              \clist_put_right:Ne \l_@@_tmp_clist
                {
                  \@@_info_table_row:vv
                    { l_@@_name_ ##1 _ \l_@@_lang_tl _tl }
                    { l_@@_info_ ##1 _ \l_@@_lang_tl _tl }
                }
            }
        }
      \tl_set:Nn \arraystretch { 1 }
      \int_set_eq:NN \hbadness \c_max_int
      \tabular {#1}
        \clist_use:Nn \l_@@_tmp_clist { \\ }
      \endtabular
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% æ&nbsp;‡é¢˜é¡µé¡µé¢æ&nbsp;·å¼ï¼Œé¡µè„šæ·»åŠ&nbsp;èµ„åŠ©åŸºé‡‘ä¿¡æ¯ã€‚
%    \begin{macrocode}
\cs_new:Npn \ps@SJTU@fund
  {
    \ps@empty
    \tl_set:Nn \@oddfoot
      {
        \hfil
        \minipage [ t ] { \textwidth }
          \centering \zihao { - 5 }
          \clist_use:Nn \l_@@_info_fund_clist { \par }
        \endminipage
        \hfil
      }
    \tl_set_eq:NN \@evenfoot \@oddfoot
  }
%    \end{macrocode}
%
% æž„å»ºæ&nbsp;‡é¢˜é¡µã€‚
%
% æ&nbsp;·å¼ A æ&nbsp;‡é¢˜é¡µå…ƒç´&nbsp;å®žä¾‹ã€‚
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { logo    }
      {
        content     =
          {
            \includegraphics [ width = 3 cm ]
              { sjtu-vi-badge-reg-red.pdf }
          }
      } ,
    { subject }
      {
        format      = \zihao { -2 } \setbaselineskip { 30 bp } ,
        content     = \tl_use:c { l_@@_info_subject_ \l_@@_lang_tl _tl } ,
        bottom-skip = \c_zero_dim plus 1 fill
      } ,
    { title   }
      {
        format      = \zihao { 2 } \setbaselineskip { 36 bp } \bfseries ,
        content     = \tl_use:c { l_@@_info_display_title_ \l_@@_lang_tl _tl } ,
        bottom-skip = 30 bp plus 1 fill
      } ,
    { info    }
      {
        format      = \zihao { 4 } \setbaselineskip { 30 bp } \heiti ,
        content     = \@@_title_page_info_table:n
                        { \SJTU@CT@W { s } \SJTU@CT@L } ,
        bottom-skip = 30 bp
      } ,
    { date    }
      {
        format      = \zihao { 4 } \setbaselineskip { 30 bp } \bfseries ,
        content     = \tl_use:c { l_@@_info_date_ \l_@@_lang_tl _tl } ,
      }
  }
  { \@@_declare_element_instance:nnn { title a } #1 }
%    \end{macrocode}
%
% æ&nbsp;·å¼ A æ&nbsp;‡é¢˜é¡µå®žä¾‹ã€‚
%    \begin{macrocode}
\@@_declare_page_instance:nnn { title a }
  {
    bookmark = \tl_use:c { c_@@_name_title_page_ \g_@@_lang_tl _tl } ,
    style    = SJTU@fund ,
    prefix   = title a ,
    elements = { logo, subject, title, info, date }
  }
%    \end{macrocode}
%
% æ&nbsp;·å¼ B æ&nbsp;‡é¢˜é¡µå…ƒç´&nbsp;å®žä¾‹ã€‚
%    \begin{macrocode}
\clist_map_inline:nn
  {
    { subject }
      {
        format      = \zihao { 4 } \setbaselineskip { 24 bp } \bfseries ,
        content     = \tl_use:c { l_@@_info_subject_ \l_@@_lang_tl _tl } ,
        bottom-skip = \c_zero_dim plus 1 fill
      } ,
    { title   }
      {
        format      = \zihao { -2 } \setbaselineskip { 30 bp } \bfseries ,
        content     = \tl_use:c { l_@@_info_display_title_ \l_@@_lang_tl _tl } ,
        bottom-skip = \c_zero_dim plus 1 fill
      } ,
    { info    }
      {
        format      = \zihao { 3 } \setbaselineskip { 30 bp } \bfseries ,
        content     = \@@_title_page_info_table:n
                        { \SJTU@CT@R \SJTU@CT@L } ,
        bottom-skip = 30 bp plus 1 fill
      } ,
    { date    }
      {
        format      = \zihao { 3 } \setbaselineskip { 30 bp } ,
        content     =
          {
            \tl_use:c { l_@@_info_department_ \l_@@_lang_tl _tl }
            \skip_vertical:N \c_zero_skip
            \tl_use:c { c_@@_name_univ_ \l_@@_lang_tl _tl }
            \skip_vertical:N \c_zero_skip
            \tl_use:c { c_@@_name_address_ \l_@@_lang_tl _tl }
            \skip_vertical:N \c_zero_skip
            \tl_use:c { l_@@_info_date_ \l_@@_lang_tl _tl }
          }
      }
  }
  { \@@_declare_element_instance:nnn { title b } #1 }
%    \end{macrocode}
%
% æ&nbsp;·å¼ B æ&nbsp;‡é¢˜é¡µå®žä¾‹ã€‚
%    \begin{macrocode}
\@@_declare_page_instance:nnn { title b }
  {
    prefix   = title b ,
    style    = SJTU@fund ,
    elements = { subject, title, info, date }
  }
%    \end{macrocode}
%
% è½½å…¥å­¦ä½è®ºæ–‡è¯­è¨€é…ç½®æ–‡ä»¶ã€‚
%    \begin{macrocode}
\clist_map_inline:Nn \g_@@_lang_clist
  { \file_input:n { sjtu-thesis- #1 .def } }
%&lt;/thesis&gt;
%&lt;/class&gt;
%    \end{macrocode}
%
% ä¸­æ–‡æ&nbsp;‡é¢˜é¡µä½¿ç”¨æ&nbsp;·å¼ Aï¼Œå…¶ä»–è¯­ç§ä½¿ç”¨æ&nbsp;·å¼ Bã€‚
%    \begin{macrocode}
%&lt;*thesis-i18n&gt;
\DeclareInstanceCopy { sjtu / page }
%&lt;zh&gt;  { title / zh } { title a }
%&lt;en&gt;  { title / en } { title b }
%&lt;de&gt;  { title / de } { title b }
%&lt;ja&gt;  { title / ja } { title b }
%&lt;/thesis-i18n&gt;
%    \end{macrocode}
%
% \begin{macro}{\maketitle}
% ç”Ÿæˆæ&nbsp;‡é¢˜é¡µã€‚
%    \begin{macrocode}
%&lt;*class&amp;thesis&gt;
\RenewDocumentCommand \maketitle { }
  {
    \clist_map_inline:Nn \g_@@_lang_clist
      { \UseInstance { sjtu / page } { title / ##1 } { ##1 } }
  }
%&lt;/class&amp;thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{åŽŸåˆ›æ€§å£°æ˜ŽåŠä½¿ç”¨æŽˆæƒä¹¦}
%
% \changes{v2.2.1}{2025/03/22}{æ·»åŠ&nbsp;åŽŸåˆ›æ€§å£°æ˜Žå˜ä½“ã€‚}
%
% å£°æ˜ŽåŠæŽˆæƒä¹¦æ–‡æœ¬ã€‚
%    \begin{macrocode}
%&lt;*thesis-i18n&amp;zh&gt;
\tl_const:Nn \c_@@_orig_decl_text_a_zh_tl
  {
    æœ¬äººéƒ‘é‡å£°æ˜Žï¼šæ‰€å‘ˆäº¤çš„å­¦ä½è®ºæ–‡ï¼Œæ˜¯æœ¬äººåœ¨å¯¼å¸ˆçš„æŒ‡å¯¼ä¸‹ï¼Œç‹¬ç«‹è¿›è¡Œç&nbsp;”ç©¶å·¥
    ä½œæ‰€å–å¾—çš„æˆæžœã€‚
    é™¤æ–‡ä¸­å·²ç»æ³¨æ˜Žå¼•ç”¨çš„å†…å®¹å¤–ï¼Œæœ¬è®ºæ–‡ä¸åŒ…å«ä»»ä½•å…¶ä»–ä¸ªäººæˆ–é›†ä½“å·²ç»å‘è¡¨æˆ–
    æ’°å†™è¿‡çš„ä½œå“æˆæžœã€‚
    å¯¹æœ¬æ–‡çš„ç&nbsp;”ç©¶åšå‡ºé‡è¦è´¡çŒ®çš„ä¸ªäººå’Œé›†ä½“ï¼Œå‡å·²åœ¨æ–‡ä¸­ä»¥æ˜Žç¡®æ–¹å¼æ&nbsp;‡æ˜Žã€‚
    æœ¬äººå®Œå…¨çŸ¥æ™“æœ¬å£°æ˜Žçš„æ³•å¾‹åŽæžœç”±æœ¬äººæ‰¿æ‹…ã€‚
  }
\tl_const:Nn \c_@@_orig_decl_text_b_zh_tl
  {
    æœ¬äººéƒ‘é‡å£°æ˜Žï¼šæ‰€å‘ˆäº¤çš„å­¦ä½è®ºæ–‡ï¼Œæ˜¯æœ¬äººåœ¨å¯¼å¸ˆçš„æŒ‡å¯¼ä¸‹ï¼Œç‹¬ç«‹è¿›è¡Œç&nbsp;”ç©¶å·¥
    ä½œæ‰€å–å¾—çš„æˆæžœã€‚
    é™¤æ–‡ä¸­å·²ç»æ³¨æ˜Žå¼•ç”¨çš„å†…å®¹å¤–ï¼Œæœ¬è®ºæ–‡ä¸åŒ…å«ä»»ä½•å…¶ä»–ä¸ªäººæˆ–é›†ä½“å·²ç»å‘è¡¨æˆ–
    æ’°å†™è¿‡çš„ä½œå“æˆæžœã€‚
    å¯¹æœ¬æ–‡çš„ç&nbsp;”ç©¶åšå‡ºé‡è¦è´¡çŒ®çš„ä¸ªäººå’Œé›†ä½“ï¼Œå·²åœ¨æ–‡ä¸­ä»¥é€‚å½“æ–¹å¼äºˆä»¥è‡´è°¢ã€‚
    è‹¥åœ¨è®ºæ–‡æ’°å†™è¿‡ç¨‹ä¸­ä½¿ç”¨äº†äººå·¥æ™ºèƒ½å·¥å…·ï¼Œæœ¬äººå·²éµå¾ªã€Šä¸Šæµ·äº¤é€šå¤§å­¦å…³äºŽåœ¨
    æ•™è‚²æ•™å­¦ä¸­ä½¿ç”¨~ AI~ çš„è§„èŒƒã€‹ï¼Œç¡®ä¿äººå·¥æ™ºèƒ½ç”Ÿæˆå†…å®¹çš„åº”ç”¨åœºæ™¯ã€å¼•ç”¨èŒƒ
    å›´åŠæ&nbsp;‡æ³¨æ–¹å¼å‡ç¬¦åˆè§„å®šï¼Œå¹¶æœç»å­¦æœ¯ä¸ç«¯è¡Œä¸ºã€‚
    æœ¬äººå®Œå…¨çŸ¥æ™“æœ¬å£°æ˜Žçš„æ³•å¾‹åŽæžœç”±æœ¬äººæ‰¿æ‹…ã€‚
  }
\tl_const:Nn \c_@@_auth_decl_text_zh_tl
  {
    æœ¬äººåŒæ„å­¦æ&nbsp;¡ä¿ç•™å¹¶å‘å›½å®¶æœ‰å…³éƒ¨é—¨æˆ–æœºæž„é€äº¤è®ºæ–‡çš„å¤å°ä»¶å’Œç”µå­ç‰ˆï¼Œå…è®¸
    è®ºæ–‡è¢«æŸ¥é˜…å’Œå€Ÿé˜…ã€‚ \par
    \vskip 6 bp
    \noindent
    æœ¬å­¦ä½è®ºæ–‡å±žäºŽï¼š \par
    { \c_@@_symbol_white_square_tl } \, \textbf { å…¬å¼€è®ºæ–‡ } \par
    { \c_@@_symbol_white_square_tl } \, \textbf { å†…éƒ¨è®ºæ–‡ }ï¼Œ
      ä¿å¯† \, { \c_@@_symbol_white_square_tl } \, 1 \, å¹´ \, /
           \, { \c_@@_symbol_white_square_tl } \, 2 \, å¹´ \, /
           \, { \c_@@_symbol_white_square_tl } \, 3 \, å¹´ï¼Œ
      è¿‡ä¿å¯†æœŸåŽé€‚ç”¨æœ¬æŽˆæƒä¹¦ã€‚ \par
    { \c_@@_symbol_white_square_tl } \, \textbf { ç§˜å¯†è®ºæ–‡ }ï¼Œ
      ä¿å¯† \, \underline { \hspace { 2 em } } \, å¹´ï¼ˆä¸è¶…è¿‡~ 10~ å¹´ï¼‰ï¼Œ
      è¿‡ä¿å¯†æœŸåŽé€‚ç”¨æœ¬æŽˆæƒä¹¦ã€‚ \par
    { \c_@@_symbol_white_square_tl } \, \textbf { æœºå¯†è®ºæ–‡ }ï¼Œ
      ä¿å¯† \, \underline { \hspace { 2 em } } \, å¹´ï¼ˆä¸è¶…è¿‡~ 20~ å¹´ï¼‰ï¼Œ
      è¿‡ä¿å¯†æœŸåŽé€‚ç”¨æœ¬æŽˆæƒä¹¦ã€‚ \par
    \hspace { 6 em }ï¼ˆè¯·åœ¨ä»¥ä¸Šæ–¹æ¡†å†…é€‰æ‹©æ‰“â€œ \ensuremath { \checkmark } â€ï¼‰
  }
%    \end{macrocode}
%
% ç­¾åæ¡†ã€‚
%    \begin{macrocode}
\tl_const:Nn \c_@@_signature_text_zh_tl
  {
    ç­¾åï¼š \\
    æ—¥æœŸï¼š \hspace { \stretch { 3 } } å¹´
           \hspace { \stretch { 2 } } æœˆ
           \hspace { \stretch { 2 } } æ—¥
  }
\cs_new_protected:Npn \@@_signature:N #1
  {
    \parbox [ t ] { 12 em }
      { #1 \c_@@_signature_text_zh_tl }
  }
%&lt;/thesis-i18n&amp;zh&gt;
%    \end{macrocode}
%
% å£°æ˜ŽåŠæŽˆæƒä¹¦å…ƒç´&nbsp;å®žä¾‹ã€‚
%    \begin{macrocode}
%&lt;*class&gt;
%&lt;*thesis&gt;
\clist_map_inline:nn
  {
    { orig / title }
      {
        format      = \zihao { 3 } \setbaselineskip { 30 bp }
                      \bfseries \heiti ,
        content     =
          {
            \c_@@_name_univ_zh_tl
            \skip_vertical:N \c_zero_skip
            \c_@@_name_thesis_zh_tl
            \c_@@_name_orig_decl_zh_tl
          } ,
        bottom-skip = 12 bp
      },
    { orig / text  }
      {
        format      = \zihao { -4 } \setbaselineskip { 24 bp } ,
        bottom-skip = 24 bp ,
        align       = normal
      },
    { orig / sign  }
      {
        format      = \zihao { 4 } \setbaselineskip { 30 bp } ,
        content     =
          {
            \@@_signature:N \c_@@_name_decl_author_zh_tl
            \skip_horizontal:n { 2 em } \hbox:n { }
          } ,
        bottom-skip = 24 bp plus 1 fill ,
        align       = right
      },
    { auth / title }
      {
        format      = \zihao { 3 } \setbaselineskip { 30 bp }
                      \bfseries \heiti ,
        content     =
          {
            \c_@@_name_univ_zh_tl
            \skip_vertical:N \c_zero_skip
            \c_@@_name_thesis_zh_tl
            \c_@@_name_auth_decl_zh_tl
          } ,
        bottom-skip = 12 bp
      },
    { auth / text  }
      {
        format      = \zihao { -4 } \setbaselineskip { 24 bp } ,
        content     = \c_@@_auth_decl_text_zh_tl ,
        bottom-skip = 24 bp ,
        align       = normal
      },
    { auth / sign  }
      {
        format      = \zihao { 4 } \setbaselineskip { 30 bp } ,
        content     =
          {
            \@@_signature:N \c_@@_name_decl_author_zh_tl
            \hfill
            \@@_signature:N \c_@@_name_decl_supervisor_zh_tl
          } ,
        bottom-skip = \c_zero_dim plus 1 fill ,
        align       = normal
      }
  }
  {
    \@@_declare_element_instance:nnn { copyright } #1
  }
%    \end{macrocode}
%
% å£°æ˜ŽåŠæŽˆæƒä¹¦æ¨¡æ¿å®žä¾‹ã€‚
%    \begin{macrocode}
\@@_declare_page_instance:nnn { copyright }
  {
    bookmark  = \tl_use:c { c_@@_name_declaration_ \g_@@_lang_tl _tl } ,
    precode   = \newgeometry
                  {
                    margin        = 3.0 cm ,
                    bindingoffset = 0.5 cm
                  } ,
    prefix    = copyright ,
    elements  =
      {
        orig / title, orig / text, orig / sign,
        auth / title, auth / text, auth / sign
      }
  }
%    \end{macrocode}
%
% \begin{variable}{\l_@@_copyright_page_file_tl}
%    \begin{macrocode}
\tl_new:N \l_@@_copyright_page_file_tl
%    \end{macrocode}
% \end{variable}
%
%    \begin{macrocode}
\keys_define:nn { sjtu / private / copyright }
  {
    file .tl_set:N = \l_@@_copyright_page_file_tl ,
    file .value_required:n = true ,
    filename .meta:n = { file = #1 } ,
    variant .choice: ,
    variant .choices:nn =
      { a, b }
      {
        \EditInstance { sjtu / element } { copyright / orig / text }
          { content = \tl_use:c { c_@@_orig_decl_text_ #1 _zh_tl } }
      } ,
    variant  .initial:e = \int_compare:nNnTF { \g_@@_thesis_type_int } &gt; { 1 }
                            { a } { b }
  }
%    \end{macrocode}
%
% \changes{v2.0}{2022/12/20}{ä¸å†è‡ªåŠ¨è½½å…¥ \pkg{pdfpages} å®åŒ…ã€‚}
%    \begin{macrocode}
\msg_new:nnn { sjtutex } { require-pdfpages }
  {
    Add~'\token_to_str:N \usepackage{pdfpages}'~in~your~preamble \\
    before~inserting~pages~of~external~PDF.
  }
%    \end{macrocode}
%
% \begin{macro}{\copyrightpage}
% ç”Ÿæˆå£°æ˜ŽåŠæŽˆæƒä¹¦ã€‚
%    \begin{macrocode}
\NewDocumentCommand \copyrightpage { O{ } }
  {
    \bool_if:NF \g_@@_review_bool
      {
        \group_begin:
          \keys_set_known:nnN { sjtu / private / copyright }
            {#1} \l_@@_tmp_tl
          \tl_if_empty:NTF \l_@@_copyright_page_file_tl
            { \UseInstance { sjtu / page } { copyright } { zh } }
            {
              \cs_if_exist:NTF \includepdf
                {
                  \legacy_if:nTF { @openright }
                    { \cleardoublepage } { \clearpage }
                  \exp_args:Nnv \@@_pdf_bookmark:nn
                    { 0 } { c_@@_name_declaration_ \g_@@_lang_tl _tl }
                  \tl_set_rescan:NnV \l_@@_tmp_tl { } \l_@@_tmp_tl
                  \exp_args:NNo \includepdf [ \l_@@_tmp_tl ]
                    { \l_@@_copyright_page_file_tl }
                }
                {
                  \msg_warning:nn { sjtutex } { require-pdfpages }
                  \UseInstance { sjtu / page } { copyright } { zh }
                }
            }
        \group_end:
      }
  }
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsection{æ–‡æ¡£ç»„æˆ}
%
% \changes{v2.2}{2024/12/20}{å†…ç½®æ–‡æ¡£å‘½ä»¤ä¸ŽçŽ¯å¢ƒä¿®æ”¹ä¸ºä½¿ç”¨é”®å€¼å¯¹å‚æ•°ï¼ŒåºŸå¼ƒå¯¹åº”çš„å¸¦æ˜Ÿå·ç‰ˆæœ¬ã€‚}
%
% \subsubsection{ç»Ÿä¸€æŽ¥å£}
%
% å®šä¹‰æ–‡æ¡£ç»„æˆéƒ¨åˆ†çš„ç»Ÿä¸€é”®å€¼å¯¹æŽ¥å£ã€‚
%
% \begin{variable}{\l_@@_heading_numbering_bool,\l_@@_heading_in_toc_bool,
% \l_@@_heading_title_tl,\l_@@_heading_marking_tl}
%    \begin{macrocode}
\bool_new:N \l_@@_heading_numbering_bool
\bool_new:N \l_@@_heading_in_toc_bool
\tl_new:N \l_@@_heading_title_tl
\tl_new:N \l_@@_heading_marking_tl
%    \end{macrocode}
% \end{variable}
%
% é»˜è®¤ \tn{mainmatter} ä¹‹åŽçš„ç«&nbsp;èŠ‚æ&nbsp;‡é¢˜åŠ&nbsp;å…¥ç›®å½•ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\AddToHook { cmd / mainmatter / after }
  { \bool_set_true:N \l_@@_heading_in_toc_bool }
%&lt;/thesis&gt;
%    \end{macrocode}
%
% \begin{macro}{intoc,notintoc,title,marking}
%    \begin{macrocode}
\keys_define:nn { sjtu / private }
  {
    intoc    .value_forbidden:n = true,
    intoc    .groups:n = { heading } ,
    intoc    .code:n = { \bool_set_true:N  \l_@@_heading_in_toc_bool } ,
    notintoc .value_forbidden:n = true,
    notintoc .groups:n = { heading } ,
    notintoc .code:n = { \bool_set_false:N \l_@@_heading_in_toc_bool } ,
    title    .tl_set:N = \l_@@_heading_title_tl ,
    title    .groups:n = { heading } ,
    marking  .tl_set:N = \l_@@_heading_marking_tl ,
    marking  .groups:n = { heading }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\SJTU@heading,\@@_heading:nn,\@@_heading:VV,
% \@@_make_heading:n}
% å®šä¹‰ä¸€ä¸ªçµæ´»çš„ç«&nbsp;èŠ‚æ&nbsp;‡é¢˜å‘½ä»¤ä¸“é—¨å¤„ç†ä¸åŒçš„éœ€æ±‚ã€‚
%    \begin{macrocode}
\NewDocumentCommand \SJTU@heading { O{#2} m }
  {
    \bool_if:nTF
      { \l_@@_heading_numbering_bool &amp;&amp; \l_@@_heading_in_toc_bool }
%&lt;!article&gt;      { \chapter [#1] {#2} }
%&lt;article&gt;      { \section [#1] {#2} }
      {
%&lt;!article&gt;        \CTEX@chapter@break
        \bool_if:NTF \l_@@_heading_in_toc_bool
          {
            \@@_phantom_section:
%&lt;!article&gt;            \addcontentsline { toc } { chapter } {#1}
%&lt;article&gt;            \addcontentsline { toc } { section } {#1}
          }
          { \@@_pdf_bookmark:nn { 0 } {#1} }
%&lt;!article&gt;        \chapter* {#2}
%&lt;article&gt;        \section* {#2}
        \CTEX@gettitle {#1}
        \@mkboth { \MakeUppercase {#1} } { \MakeUppercase {#1} }
      }
  }
\cs_new_protected:Npn \@@_heading:nn #1#2
  { \SJTU@heading [#1] {#2} }
\cs_generate_variant:Nn \@@_heading:nn { VV }
\cs_new_protected:Npn \@@_make_heading:n #1
  {
    \tl_set_eq:NN \l_@@_heading_marking_tl \c_novalue_tl
    \keys_set_groups:nnn { sjtu / private } { heading } {#1}
    \@@_heading:VV
      \l_@@_heading_marking_tl \l_@@_heading_title_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{æ‘˜è¦}
%
% \changes{v2.1}{2023/11/30}{æ–°å¢ž \opt{style/keywords-format} é€‰é¡¹ã€‚}
% \begin{macro}{style/keywords-format}
% å…³é”®è¯æŽ’ç‰ˆæ&nbsp;·å¼ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu / style }
  {
    keywords-format       .choice: ,
    keywords-format / plain .code:n =
      { \cs_set:Nn \@@_keywords_format:n { \noindent  { \bfseries ##1 } } } ,
    keywords-format / hang  .code:n =
      { \cs_set:Nn \@@_keywords_format:n { \@hangfrom { \bfseries ##1 } } } ,
    keywords-format      .initial:n = { plain }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0}{2023/03/17}{\env{abstract} çŽ¯å¢ƒæ–°å¢žæŒ‡å®šè¯­è¨€çš„å¯é€‰å‚æ•°ã€‚}
% \changes{v2.1}{2023/11/29}{\env{abstract} çŽ¯å¢ƒæ·»åŠ&nbsp;ç›®å½•æ¡ç›®ï¼Œ
% \env{abstract*} çŽ¯å¢ƒå¯¹åº”ä¿®æ”¹ä¸ºä¸æ·»åŠ&nbsp;ç›®å½•æ¡ç›®ã€‚}
% \begin{macro}{abstract}
% å­¦ä½è®ºæ–‡æ‘˜è¦çŽ¯å¢ƒã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\DeclareDocumentEnvironment { abstract } { O{ } }
  {
    \@@_select_language:n {#1}
    \tl_set_eq:Nc \l_@@_heading_title_tl
      { c_@@_name_abstract_ \l_@@_lang_tl _tl }
    \@@_make_heading:n {#1}
  }
  {
    \clist_if_empty:cF { l_@@_info_keywords_ \l_@@_lang_tl _clist }
      {
        \par \mode_leave_vertical: \par
        \@@_keywords_format:n
          {
            \tl_use:c { c_@@_name_keywords_ \l_@@_lang_tl _tl }
            \tl_use:c { c_@@_name_info_sep_ \l_@@_lang_tl _tl }
          }
        \clist_use:cv { l_@@_info_keywords_ \l_@@_lang_tl _clist }
          { c_@@_name_item_sep_ \l_@@_lang_tl _tl }
        \par
      }
  }
%&lt;/thesis&gt;
%    \end{macrocode}
%
% ä¿®å¤é€šç”¨æ¨¡æ¿æ‘˜è¦æ®µé¦–ç¼©è¿›ã€‚
%    \begin{macrocode}
%&lt;*!thesis&gt;
\legacy_if:nT { @titlepage }
  { \AddToHook { cmd / abstract / after } { \par } }
%    \end{macrocode}
%
% é€šç”¨æ¨¡æ¿æ‘˜è¦åŽæ·»åŠ&nbsp;å…³é”®è¯ã€‚
%    \begin{macrocode}
\AddToHook { env / abstract / end }
  {
    \clist_if_empty:NF \l_@@_info_keywords_clist
      {
        \par \mode_leave_vertical: \par
        \@@_keywords_format:n
          {
            \tl_use:c { c_@@_name_keywords_ \g_@@_lang_tl _tl }
            \tl_use:c { c_@@_name_info_sep_ \g_@@_lang_tl _tl }
          }
        \clist_use:Nv \l_@@_info_keywords_clist
          { c_@@_name_item_sep_ \g_@@_lang_tl _tl }
        \par
      }
  }
%&lt;/!thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{ç›®å½•åˆ—è¡¨}
%
% \changes{v2.1}{2023/11/29}{\tn{tableofcontents} æ·»åŠ&nbsp;ç›®å½•æ¡ç›®ï¼Œ
% \tn{tableofcontents*} å¯¹åº”ä¿®æ”¹ä¸ºä¸æ·»åŠ&nbsp;ç›®å½•æ¡ç›®ã€‚}
% \begin{macro}{\tableofcontents}
% ç›®å½•ã€‚
%    \begin{macrocode}
\DeclareDocumentCommand \tableofcontents { O{ } }
  {
    \group_begin:
      \@@_make_heading:n { title = \contentsname, #1 }
      \@starttoc { toc }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.1.2}{2024/03/31}{æ”¹ç”¨ \pkg{titletoc} è®¾ç½®ç›®å½•æ&nbsp;¼å¼ã€‚}
% \changes{v2.1.3}{2024/06/28}{æ›´æ–°ç›®å½•æ&nbsp;·å¼ã€‚}
%    \begin{macrocode}
\tl_set:Nn \SJTU@leaders { \titlerule* [ 4bp ] { . } }
\contentsmargin [ 2.55 em ] { 0 pt }
%&lt;article&gt;\titlecontents { section }
%&lt;!article&gt;\titlecontents { chapter }
  [ 0 pt ] { \addvspace { 6 bp } \bfseries }
  { \contentspush { \thecontentslabel \enskip } } { }
  { \SJTU@leaders \thecontentspage }
%&lt;article&gt;\titlecontents { subsection }
%&lt;!article&gt;\titlecontents { section }
  [ 2 em ] { }
  { \contentspush { \thecontentslabel \enskip } } { }
  { \SJTU@leaders \thecontentspage }
%&lt;article&gt;\titlecontents { subsubsection }
%&lt;!article&gt;\titlecontents { subsection }
  [ 4 em ] { }
  { \contentspush { \thecontentslabel \enskip } } { }
  { \SJTU@leaders \thecontentspage }
%    \end{macrocode}
%
% \changes{v2.0.1}{2023/03/31}{æ’å›¾ã€è¡¨æ&nbsp;¼å’Œç®—æ³•ç­‰ç´¢å¼•ä¸ç¼©è¿›ã€‚}
% \changes{v2.0.1}{2023/03/31}{è°ƒæ•´æ’å›¾ã€è¡¨æ&nbsp;¼å’Œç®—æ³•ç­‰ç´¢å¼•ç¼–å·å®½åº¦ã€‚}
% \begin{macro}[int]{\SJTU@listof,\@@_new_list_of:Nnnn}
% \begin{macro}{\listoffigures,\listoftables}
% å›¾è¡¨ç´¢å¼•ã€‚
%    \begin{macrocode}
\NewDocumentCommand \SJTU@listof { m m O{ } }
  {
    \group_begin:
      \@@_make_heading:n { title = #1, #3 }
      \exp_args:Nv \@starttoc { ext@ #2 }
    \group_end:
  }
\cs_new_protected:Npn \@@_new_list_of:Nnnn #1#2#3#4
  {
    \DeclareDocumentCommand #1 { }
      { \SJTU@listof {#4} {#2} }
    \titlecontents {#2}
      [ 0 pt ] { }
      { \contentspush { #3 \space \thecontentslabel \enskip } } { }
      { \SJTU@leaders \thecontentspage }
    \exp_args:Nnv \contentsuse {#2} { ext@ #2 }
  }
\@@_new_list_of:Nnnn \listoffigures { figure }
  { \figurename } { \listfigurename }
\@@_new_list_of:Nnnn \listoftables  { table  }
  { \tablename  } { \listtablename  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsubsection{é¢„å®šä¹‰çŽ¯å¢ƒ}
%
% \begin{macro}{abbreviation}
% ç¼©ç•¥è¯­å¯¹ç…§è¡¨ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\NewDocumentEnvironment { abbreviation } { O{ } }
  {
    \bool_set_true:N \l_@@_heading_numbering_bool
    \@@_make_heading:n { title = \SJTU@abbrname, #1 }
    \tl_clear:N \SJTU@style@float@font
  } { }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{nomenclature}
% ç¬¦å·å¯¹ç…§è¡¨ã€‚
%    \begin{macrocode}
\NewDocumentEnvironment { nomenclature } { O{ } }
  {
    \bool_set_true:N \l_@@_heading_numbering_bool
    \@@_make_heading:n { title = \SJTU@nomname, #1 }
    \tl_clear:N \SJTU@style@float@font
  } { }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0}{2023/03/17}{ç§»é™¤ \env{summary} çŽ¯å¢ƒã€‚}
%
% \begin{macro}{acknowledgements}
% è‡´è°¢ï¼Œç›²å®¡æ¨¡å¼ä¸‹éšè—è‡´è°¢ã€‚
%    \begin{macrocode}
\NewDocumentEnvironment { acknowledgements } { O{ } +b }
  {
    \bool_if:NF \g_@@_review_bool
      {
        \@@_select_language:n {#1}
        \@@_make_heading:n { title = \SJTU@ackname, #1 }
        #2
      }
  } { }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.2}{2024/12/08}{ç§»é™¤ \env{bibliolist} çŽ¯å¢ƒçš„ä½¿ç”¨é™åˆ¶ï¼Œ
% é»˜è®¤é‡ç½®è®¡æ•°ï¼Œæ–°å¢ž \opt{resume} é€‰é¡¹ã€‚}
% \begin{macro}{achievements,bibliolist,bibliolist*}
% å‘è¡¨è®ºæ–‡ä¸Žå­¦æœ¯æˆæžœã€‚
%    \begin{macrocode}
\newcounter { SJTU@bib }
\bool_new:N \l_@@_bibliolist_resume_bool
\keys_define:nn { sjtu / private / bibliolist }
  {
    resume .value_forbidden:n = true,
    resume .code:n =
      { \bool_set_true:N \l_@@_bibliolist_resume_bool }
  }
\msg_new:nnn { sjtutex } { empty-environment }
  { Empty~'#1'~environment. }
\NewDocumentEnvironment { @bibliolist } { m m }
  {
    \keys_set:nn { sjtu / private / bibliolist } {#1}
    \cs_if_exist_use:N \bibfont
    \list
      {
        \tl_if_blank:nTF {#2}
          { \hfill }
          { \@biblabel { \arabic{ SJTU@bib } } }
      }
      {
        \tl_if_blank:nTF {#2}
          {
            \skip_if_exist:NTF \bibhang
              { \dim_set_eq:NN \leftmargin \bibhang }
              { \dim_set:Nn    \leftmargin { 1 em } }
            \dim_set:Nn \itemindent { - \leftmargin }
          }
          {
            \@@_dim_set_to_wd:Nn \labelwidth { \@biblabel {#2} }
            \dim_set_eq:NN \leftmargin \labelwidth
            \dim_add:Nn    \leftmargin { \labelsep }
          }
        \skip_if_exist:NTF \bibitemsep
          {
            \skip_set_eq:NN \itemsep \bibitemsep
            \skip_if_exist:NT \bibparsep
              { \skip_set_eq:NN \parsep \bibparsep }
          }
          {
            \skip_if_exist:NT \bibsep
              {
                \skip_set_eq:NN \itemsep \bibsep
                \skip_zero:N    \parsep
              }
          }
        \@nmbrlisttrue
        \tl_set:Nn \@listctr { SJTU@bib }
        \tl_clear:N \p@SJTU@bib
        \bool_if:NF \l_@@_bibliolist_resume_bool
          { \setcounter { SJTU@bib } { 0 } }
        \tl_set:Nn \theSJTU@bib { \arabic { SJTU@bib } }
      }
      \sloppy
      \int_set:Nn \clubpenalty  { 4000 }
      \int_set_eq:NN \@clubpenalty \clubpenalty
      \int_set:Nn \widowpenalty { 4000 }
      \char_set_sfcode:nn { `\. } { 1000 }
  }
  {
    \tl_set:Nn \@noitemerr
      { \msg_warning:nnn { sjtutex } { empty-environment } { bibliolist } }
    \endlist
  }
\NewDocumentEnvironment { achievements } { O{ } }
  {
    \@@_select_language:n {#1}
    \@@_make_heading:n { title = \SJTU@achvname, #1 }
  } { }
\NewDocumentEnvironment { bibliolist  } { O{ } m +b }
  {
    \bool_if:NF \g_@@_review_bool
      {
        \begin { @bibliolist } {#1} {#2}
          #3
        \end { @bibliolist }
      }
  } { }
\NewDocumentEnvironment { bibliolist* } { O{ } m +b }
  {
    \bool_if:NT \g_@@_review_bool
      {
        \begin { @bibliolist } {#1} {#2}
          #3
        \end { @bibliolist }
      }
  } { }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{resume}
% ç®€åŽ†ã€‚
%    \begin{macrocode}
\NewDocumentEnvironment { resume } { O{ } +b }
  {
    \bool_if:NF \g_@@_review_bool
      {
        \@@_select_language:n {#1}
        \@@_make_heading:n { title = \SJTU@resumename, #1 }
        #2
      }
  } { }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0}{2023/03/17}{\env{digest} çŽ¯å¢ƒæ–°å¢žæŒ‡å®šè¯­è¨€çš„å¯é€‰å‚æ•°ã€‚}
% \begin{macro}{digest}
% å¤§æ‘˜è¦ã€‚
%    \begin{macrocode}
\NewHook { sjtutex / digest }
\NewDocumentEnvironment { digest } { O{ } +b }
  {
    \AtEndDocument
      {
        \group_begin:
          \@@_select_language:n { en, #1 }
          \legacy_if:nTF { @openright }
            { \cleardoublepage } { \clearpage }
          \pagenumbering { roman }
          \tl_gset:Nn \@@_the_page_tl { \arabic { page } }
          \UseHook { sjtutex / digest }
          \cs_gset_eq:NN \addcontentsline \use_none:nnn
          \clist_map_inline:Nn \l_@@_counter_without_chapter_clist
            {
              \counterwithout {##1} { chapter }
              \setcounter     {##1} { 0 }
            }
          \tl_set_eq:Nc \l_@@_heading_title_tl
            { l_@@_info_display_title_ \l_@@_lang_tl _tl }
          \@@_make_heading:n { marking = \SJTU@digestname, #1, notintoc }
          #2
        \group_end:
      }
  } { }
%&lt;/thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsection{è®¾ç½®æŽ¥å£}
%
% \begin{macro}{\sjtusetup}
% ç”¨æˆ·è®¾ç½®æŽ¥å£ã€‚
% ç›²å®¡æ¨¡å¼ä¸‹ä¸ä¼šè®¾ç½®æ•æ„Ÿä¿¡æ¯ã€‚
%    \begin{macrocode}
%&lt;!thesis&gt;\NewDocumentCommand \sjtusetup { } { \keys_set:nn { sjtu } }
%&lt;thesis&gt;\NewDocumentCommand \sjtusetup { } { \@@_setup:n }
%    \end{macrocode}
% \end{macro}
%
% \changes{v2.0}{2022/12/28}{é‡æ–°åˆ¶å®š \opt{sjtu/style} åŸŸä¸­çš„æŽ¥å£ã€‚}
% å®šä¹‰å…ƒï¼ˆmetaï¼‰é”®å€¼å¯¹ã€‚
%    \begin{macrocode}
\keys_define:nn { sjtu }
  {
    style .meta:nn = { sjtu / style } {#1} ,
    info  .meta:nn = { sjtu / info  } {#1} ,
    name  .meta:nn = { sjtu / name  } {#1}
  }
%    \end{macrocode}
%
% å…¼å®¹ \cls{sjtuthesis} æ—§æŽ¥å£ã€‚
%    \begin{macrocode}
%&lt;*thesis&gt;
\keys_define:nn { sjtu / info }
  {
    title             .meta:n = { zh / title            = {#1} } ,
    title*            .meta:n = { en / title            = {#1} } ,
    display-title     .meta:n = { zh / display-title    = {#1} } ,
    display-title*    .meta:n = { en / display-title    = {#1} } ,
    subject           .meta:n = { zh / subject          = {#1} } ,
    subject*          .meta:n = { en / subject          = {#1} } ,
    keywords          .meta:n = { zh / keywords         = {#1} } ,
    keywords*         .meta:n = { en / keywords         = {#1} } ,
    author            .meta:n = { zh / author           = {#1} } ,
    author*           .meta:n = { en / author           = {#1} } ,
    supervisor        .meta:n = { zh / supervisor       = {#1} } ,
    supervisor*       .meta:n = { en / supervisor       = {#1} } ,
    assoc-supervisor  .meta:n = { zh / assoc-supervisor = {#1} } ,
    assoc-supervisor* .meta:n = { en / assoc-supervisor = {#1} } ,
    co-supervisor     .meta:n = { zh / co-supervisor    = {#1} } ,
    co-supervisor*    .meta:n = { en / co-supervisor    = {#1} } ,
    degree            .meta:n = { zh / degree           = {#1} } ,
    degree*           .meta:n = { en / degree           = {#1} } ,
    department        .meta:n = { zh / department       = {#1} } ,
    department*       .meta:n = { en / department       = {#1} } ,
    major             .meta:n = { zh / major            = {#1} } ,
    major*            .meta:n = { en / major            = {#1} } ,
    fund              .meta:n = { zh / fund             = {#1} } ,
    fund*             .meta:n = { en / fund             = {#1} } ,
    display-date      .meta:n = { zh / date             = {#1} } ,
    display-date*     .meta:n = { en / date             = {#1} }
  }
\keys_define:nn { sjtu / name }
  {
    abbreviation      .meta:n = { abbr  = {#1} } ,
    nomenclature      .meta:n = { nom   = {#1} } ,
    acknowledgements  .meta:n = { ack   = {#1} } ,
    publications      .meta:n = { achv  = {#1} } ,
    achievements      .meta:n = { achv  = {#1} }
  }
%&lt;/thesis&gt;
%    \end{macrocode}
%
% \begin{macro}{\subject,\keywords}
% é€šç”¨æ¨¡æ¿æ–°æŽ¥å£ã€‚
%    \begin{macrocode}
%&lt;*!thesis&gt;
\NewDocumentCommand \subject  { m }
  { \keys_set:nn { sjtu / info } { subject  = {#1} } }
\NewDocumentCommand \keywords { m }
  { \keys_set:nn { sjtu / info } { keywords = {#1} } }
%&lt;/!thesis&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsection{å…¶ä»–å®åŒ…çš„è®¾ç½®}
%
% \changes{v2.0.3}{2023/09/23}{ç§»é™¤ \pkg{listings} å®åŒ…é¢„è®¾ã€‚}
% è¿™äº›å®åŒ…å¹¶éžæ&nbsp;¼å¼è¦æ±‚ï¼Œä½†æ˜¯ä¸ºäº†æ–¹ä¾¿åŒå­¦ä»¬ä½¿ç”¨ï¼Œåœ¨è¿™é‡Œè¿›è¡Œç®€å•è®¾ç½®ã€‚
%
% \subsubsection{\pkg{hyperref} å®åŒ…}
%
%    \begin{macrocode}
\ctex_at_end_package:nn { hyperref }
  {
    \hypersetup
      {
        linktoc            = all,
        bookmarksdepth     = 2,
        bookmarksnumbered  = true,
        bookmarksopen      = true,
        bookmarksopenlevel = 1,
        unicode            = true,
        psdextra           = true,
        breaklinks         = true,
        pdfdisplaydoctitle = true
      }
    \int_new:N \g_@@_bookmark_int
    \cs_set_protected:Npn \@@_pdf_bookmark:nn #1#2
      {
        \phantomsection
        \int_gincr:N \g_@@_bookmark_int
        \pdfbookmark [#1] {#2}
          { sjtubookmark. \int_use:N \g_@@_bookmark_int }
      }
    \cs_set_eq:NN \@@_phantom_section: \phantomsection
    \DeclareExpandableDocumentCommand
      { \@@_pdfstring_newline:w } { s o m } {#3}
    \pdfstringdefDisableCommands
      {
        \cs_set_eq:NN \\       \@@_pdfstring_newline:w
        \cs_set_eq:NN \hspace  \use_none:n
        \cs_set_eq:NN \zihao   \use_none:n
        \tl_set_eq:NN \quad    \c_empty_tl
        \tl_set_eq:NN \qquad   \c_empty_tl
      }
    \ctex_after_end_preamble:n
      {
        \hypersetup
          {
%&lt;*thesis&gt;
            pdftitle    = \l_@@_info_title_zh_tl ,
            pdfauthor   = \l_@@_info_author_zh_tl ,
            pdfsubject  = \l_@@_info_subject_zh_tl ,
            pdfkeywords = \l_@@_info_keywords_zh_clist
%&lt;/thesis&gt;
%&lt;*!thesis&gt;
            pdftitle    = \@title ,
            pdfauthor   = \@author ,
            pdfsubject  = \l_@@_info_subject_tl ,
            pdfkeywords = \l_@@_info_keywords_clist
%&lt;/!thesis&gt;
          }
      }
  }
%    \end{macrocode}
%
% \changes{v2.2}{2024/12/30}{ä½¿ç”¨ \pkg{pageslts} å®åŒ…èŽ·å–æ€»é¡µç&nbsp;ã€‚}
% \subsubsection{\pkg{pageslts} å®åŒ…}
%
%    \begin{macrocode}
\ctex_at_end_package:nn { pageslts }
  {
%&lt;thesis&gt;    \pagenumbering { Alph }
%&lt;!thesis&gt;    \pagenumbering { arabic }
    \tl_set:Nn \@@_the_last_page_tl
      { \lastpageref { pagesLTS.\pagesLTS@pnc } }
%&lt;*thesis&gt;
    \AddToHook { sjtutex / digest }
      {
        \tl_gset:Nn \@@_the_last_page_tl
          { \lastpageref { pagesLTS.roman.local } }
      }
%&lt;/thesis&gt;
  }
%    \end{macrocode}
%
% \subsubsection{\pkg{threeparttable} å®åŒ…}
%
%    \begin{macrocode}
\ctex_at_end_package:nn { threeparttable }
  { \tl_put_right:Nn \TPTnoteSettings { \footnotesize } }
%    \end{macrocode}
%
% \subsubsection{\pkg{longtable} å®åŒ…}
%
%    \begin{macrocode}
\ctex_at_end_package:nn { longtable }
  { \AtBeginEnvironment { longtable } { \SJTU@style@float@font } }
%&lt;/class&gt;
%    \end{macrocode}
%
% \changes{v2.1.1}{2024/03/21}{é¢„å®šä¹‰çš„æ•°å­¦çŽ¯å¢ƒå£°æ˜Žç§»è‡³å¯¼è¨€åŒºæœ«å°¾ï¼Œ
% ä¸”ä¸ä¼šè¦†ç›–é‡åçš„å·²å®šä¹‰çŽ¯å¢ƒã€‚}
% \subsubsection{\pkg{amsthm} å®åŒ…å’Œ \pkg{ntheorem} å®åŒ…}
%
% é¢„å®šä¹‰çš„æ•°å­¦çŽ¯å¢ƒï¼Œä¸åŒ…æ‹¬è¯æ˜ŽçŽ¯å¢ƒ \env{proof}ã€‚
%    \begin{macrocode}
%&lt;*scheme&gt;
\clist_map_inline:nn
  {
%&lt;*zh&gt;
    { assumption  } { å‡è®¾        } ,
    { axiom       } { å…¬ç†        } ,
    { conjecture  } { çŒœæƒ³        } ,
    { corollary   } { æŽ¨è®º        } ,
    { definition  } { å®šä¹‰        } ,
    { example     } { ä¾‹          } ,
    { exercise    } { ç»ƒä¹&nbsp;        } ,
    { lemma       } { å¼•ç†        } ,
    { problem     } { é—®é¢˜        } ,
    { proposition } { å‘½é¢˜        } ,
    { remark      } { æ³¨          } ,
    { solution    } { è§£          } ,
    { theorem     } { å®šç†        }
%&lt;/zh&gt;
%&lt;*en&gt;
    { assumption  } { Assumption  } ,
    { axiom       } { Axiom       } ,
    { conjecture  } { Conjecture  } ,
    { corollary   } { Corollary   } ,
    { definition  } { Definition  } ,
    { example     } { Example     } ,
    { exercise    } { Exercise    } ,
    { lemma       } { Lemma       } ,
    { problem     } { Problem     } ,
    { proposition } { Proposition } ,
    { remark      } { Remark      } ,
    { solution    } { Solution    } ,
    { theorem     } { Theorem     }
%&lt;/en&gt;
%&lt;*de&gt;
    { assumption  } { Annahme     } ,
    { axiom       } { Axiom       } ,
    { conjecture  } { Hypothese   } ,
    { corollary   } { Korollar    } ,
    { definition  } { Definition  } ,
    { example     } { Beispiel    } ,
    { exercise    } { Ãœbung       } ,
    { lemma       } { Lemma       } ,
    { problem     } { Problem     } ,
    { proposition } { Proposition } ,
    { remark      } { Anmerkung   } ,
    { solution    } { LÃ¶sung      } ,
    { theorem     } { Theorem     }
%&lt;/de&gt;
%&lt;*ja&gt;
    { assumption  } { ä»®å®š        } ,
    { axiom       } { å…¬ç†        } ,
    { conjecture  } { äºˆæƒ³        } ,
    { corollary   } { ç³»          } ,
    { definition  } { å®šç¾©        } ,
    { example     } { ä¾‹          } ,
    { exercise    } { ç·´ç¿’        } ,
    { lemma       } { è£œé¡Œ        } ,
    { problem     } { å•é¡Œ        } ,
    { proposition } { å‘½é¡Œ        } ,
    { remark      } { æ³¨æ„        } ,
    { solution    } { è§£æ³•        } ,
    { theorem     } { å®šç†        }
%&lt;/ja&gt;
  }
%&lt;zh&gt;  { \@@_name_const:nnn { zh } #1 }
%&lt;en&gt;  { \@@_name_const:nnn { en } #1 }
%&lt;de&gt;  { \@@_name_const:nnn { de } #1 }
%&lt;ja&gt;  { \@@_name_const:nnn { ja } #1 }
%&lt;/scheme&gt;
%    \end{macrocode}
%
% å®šä¹‰å‰ä¼šæ£€æµ‹çŽ¯å¢ƒæ˜¯å¦å·²ç»å­˜åœ¨ï¼Œé¿å…è¦†ç›–ç”¨æˆ·çš„å®šä¹‰ã€‚
%    \begin{macrocode}
%&lt;*class&gt;
\cs_new_protected:Nn \@@_new_theorems:
  {
    \clist_map_inline:nn
      {
        assumption, axiom, conjecture, corollary, definition, example,
        exercise, lemma, problem, proposition, theorem
      }
      {
        \cs_if_exist:cF {##1}
          {
            \exp_args:Nnv  \newtheorem  {##1}
%&lt;!article&gt;              { c_@@_name_ ##1 _ \g_@@_lang_tl _tl } [ chapter ]
%&lt;article&gt;              { c_@@_name_ ##1 _ \g_@@_lang_tl _tl }
          }
      }
    \clist_map_inline:nn
      { remark, solution }
      {
        \cs_if_exist:cF {##1}
          {
            \exp_args:NNnv \newtheorem* {##1}
              { c_@@_name_ ##1 _ \g_@@_lang_tl _tl }
          }
      }
  }
%    \end{macrocode}
%
% \pkg{amsthm} ä¼šå®šä¹‰ \tn{openbox}ï¼Œä¸ºé¿å…ä¸Žä¸€äº›å®åŒ…å†²çªï¼Œ
% æˆ‘ä»¬å…ˆä¿å­˜ \tn{openbox}ï¼Œç„¶åŽå–æ¶ˆå®šä¹‰ã€‚
%    \begin{macrocode}
\ctex_at_begin_package:nn { amsthm }
  {
    \cs_if_exist:NT \openbox
      {
        \cs_new_eq:NN \SJTU@orig@openbox \openbox
        \cs_undefine:N \openbox
      }
  }
\ctex_at_end_package:nn { amsthm }
  {
    \@@_cs_provide_eq:NN \QED \openbox
    \cs_if_exist:NT \SJTU@orig@openbox
      { \cs_set_eq:NN \openbox \SJTU@orig@openbox }
    \tl_set:Nn \qedsymbol { \ensuremath { \QED } }
    \RenewDocumentEnvironment { proof } { O{ \proofname } }
      {
        \par \pushQED { \qed }
        \SJTU@style@thm@body@font \dim_zero:N \topsep
        \trivlist
        \item
          [
            \skip_horizontal:N \labelsep
            \SJTU@style@thm@header@font #1 \@addpunct { \enskip }
          ]
        \ignorespaces
      }
      { \popQED \endtrivlist \@endpefalse }
    \newtheoremstyle { sjtu }
      { } { } { \SJTU@style@thm@body@font } { }
      { \SJTU@style@thm@header@font } { } { \ccwd } { }
    \@@_disable_package_load:n { ntheorem }
    \ctex_at_end_preamble:n
      {
        \theoremstyle { sjtu }
        \@@_new_theorems:
      }
  }
%    \end{macrocode}
%
% \pkg{ntheorem} å®åŒ…ã€‚
%    \begin{macrocode}
\ctex_at_end_package:nn { ntheorem }
  {
    \@@_disable_package_load:n { amsthm }
    \ctex_at_end_preamble:n
      {
        \@@_cs_provide_eq:NN \QED \c_empty_tl
        \theoremheaderfont { \SJTU@style@thm@header@font }
        \theorembodyfont   { \SJTU@style@thm@body@font   }
        \theoremseparator  { \enskip }
        \theoremsymbol { \ensuremath { \QED } }
        \qedsymbol     { \ensuremath { \QED } }
        \cs_if_exist:NF \proof
          { \newtheorem* { proof } { \proofname } }
        \theoremsymbol { }
        \@@_new_theorems:
      }
  }
%    \end{macrocode}
%
% \changes{v2.1.1}{2024/03/22}{æ·»åŠ&nbsp; \pkg{thmtools} å®åŒ…æ”¯æŒã€‚}
% \subsubsection{\pkg{thmtools} å®åŒ…}
%
% ä½¿ç”¨ \pkg{titletoc} åŒ…è®¾ç½® \tn{listoftheorems} çš„æ&nbsp;·å¼ã€‚
%    \begin{macrocode}
\ctex_at_end_package:nn { thmtools }
  {
    \cs_set:Npn \thmtlo@newentry
      {
        \exp_args:NV \titlecontents \thmt@envname
          [ \thmt@listnumwidth ] { }
          { \contentslabel { \thmt@listnumwidth } }
          { \hspace* { - \thmt@listnumwidth } }
          { \SJTU@leaders \thecontentspage }
        \exp_args:NV \contentsuse \thmt@envname { loe }
      }
    \cs_set:Npn \thmtlo@chaptervspacehack { }
    \RenewDocumentCommand \listoftheorems { O{ } }
      {
        \group_begin:
          \tl_set_eq:NN \l_@@_heading_marking_tl \c_novalue_tl
          \keys_set_groups:nnnN { sjtu / private } { heading }
            { title = \listtheoremname, #1 } \l_@@_tmp_tl
          \tl_set_rescan:NnV \l_@@_tmp_tl { } \l_@@_tmp_tl
          \@@_heading:VV
            \l_@@_heading_marking_tl \l_@@_heading_title_tl
          \exp_args:No \setlisttheoremstyle { \l_@@_tmp_tl }
          \cs_set:Npn \contentsline ##1
            { \use:c { thmt@contentsline@ ##1 } {##1} }
          \clist_map_inline:Nn \thmt@allenvs
            {
              \tl_set:Nn \thmt@envname {##1}
              \thmtlo@newentry
            }
          \@fileswfalse
          \AddToHook { enddocument / afterlastpage }
            {
              \if@filesw
                \@ifundefined { tf@loe }
                  {
                    \expandafter\newwrite\csname tf@loe\endcsname
                    \immediate\openout \csname tf@loe\endcsname \jobname.loe\relax
                  } { }
              \fi
            }
          \@starttoc { loe }
        \group_end:
      }
  }
%    \end{macrocode}
%
% \subsubsection{\pkg{algorithm} å®åŒ…å’Œ \pkg{algorithm2e} å®åŒ…}
%
% \pkg{algorithm} å®åŒ…ã€‚
%    \begin{macrocode}
\ctex_at_end_package:nn { algorithm }
  {
    \tl_set:Nn \fname@algorithm   { \SJTU@algorithmname     }
    \tl_set:Nn \listalgorithmname { \SJTU@listalgorithmname }
%&lt;!article&gt;    \SJTU@counterwithin { algorithm } { chapter }
%&lt;thesis&gt;    \clist_put_right:Nn \l_@@_counter_without_chapter_clist { algorithm }
    \@@_new_list_of:Nnnn \listofalgorithms { algorithm }
      { \fname@algorithm } { \listalgorithmname }
  }
%    \end{macrocode}
%
% \pkg{algorithm2e} å®åŒ…ã€‚
%    \begin{macrocode}
%&lt;!article&gt;\ctex_at_begin_package:nn { algorithm2e }
%&lt;!article&gt;  { \cs_set_eq:NN \SJTU@orig@at@chapter \@chapter }
\ctex_at_end_package:nn { algorithm2e }
  {
%&lt;!article&gt;    \cs_set_eq:NN \@chapter \SJTU@orig@at@chapter
    \SetAlgorithmName { \SJTU@algorithmname     }
                      { \SJTU@algorithmname     }
                      { \SJTU@listalgorithmname }
    \SetAlgoCaptionSeparator { \enskip }
%&lt;!article&gt;    \SJTU@counterwithin { algocf } { chapter }
%&lt;thesis&gt;    \clist_put_right:Nn \l_@@_counter_without_chapter_clist { algocf }
    \@@_new_list_of:Nnnn \listofalgorithms { algocf }
      { \algorithmcfname } { \listalgorithmcfname }
    \ctex_patch_cmd:Nnn \algocf@latexcaption
      { \addcontentsline }
      { \caption@iflist { \addcontentsline } { \@gobblethree } }
  }
%    \end{macrocode}
%
% \subsubsection{\pkg{nomencl} å®åŒ…}
%    \begin{macrocode}
\ctex_at_end_package:nn { nomencl }
  { \tl_set:Nn \nomname { \SJTU@nomname } }
%    \end{macrocode}
%
% \changes{v2.0.3}{2023/09/25}{æ·»åŠ&nbsp; \pkg{siunitx} æœ¬åœ°åŒ–æ”¯æŒã€‚}
% \subsubsection{\pkg{translations} å®åŒ…}
%    \begin{macrocode}
\ctex_at_end_package:nn { translations }
  {
    \DeclareLanguage { chinese }
    \DeclareLanguageAlias { Chinese } { chinese }
  }
%    \end{macrocode}
%
% \subsubsection{\pkg{siunitx} å®åŒ…}
%    \begin{macrocode}
\ctex_at_end_package:nn { siunitx }
  {
    \RequirePackage { translations }
    \DeclareTranslation { Chinese  } { and } { å’Œ }
    \DeclareTranslation { Japanese } { and } { ã¨ }
    \DeclareTranslation { Chinese  }
      { to~(numerical~range) } { \textasciitilde }
    \DeclareTranslation { Japanese }
      { to~(numerical~range) } { \textasciitilde }
    \IfPackageAtLeastTF { siunitx } { 2021/05/17 } { }
      {
        \DeclareTranslation { English } { to~(numerical~range) } { to  }
        \DeclareTranslation { German }  { to~(numerical~range) } { bis }
        \keys_set:nn { siunitx }
          {
            list-final-separator =
              {
                \ifmmode \  \else \space \fi
                \text { \GetTranslation { and } }
                \ifmmode \  \else \space \fi
              } ,
            list-pair-separator  =
              {
                \ifmmode \  \else \space \fi
                \text { \GetTranslation { and } }
                \ifmmode \  \else \space \fi
              } ,
            range-phrase         =
              {
                \ifmmode \  \else \space \fi
                \text { \GetTranslation { to~(numerical~range) } }
                \ifmmode \  \else \space \fi
              }
          }
      }
  }
%&lt;/class&gt;
%    \end{macrocode}
%
% \end{implementation}
%
% \Finale
%
\endinput
</pre></body></html>