texlive[69966] Master: sjtutex (18feb24)

commits+karl at tug.org commits+karl at tug.org
Sun Feb 18 22:11:54 CET 2024


Revision: 69966
          https://tug.org/svn/texlive?view=revision&revision=69966
Author:   karl
Date:     2024-02-18 22:11:54 +0100 (Sun, 18 Feb 2024)
Log Message:
-----------
sjtutex (18feb24)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/sjtutex/
    trunk/Master/texmf-dist/doc/latex/sjtutex/README.md
    trunk/Master/texmf-dist/doc/latex/sjtutex/sjtutex.pdf
    trunk/Master/texmf-dist/source/latex/sjtutex/
    trunk/Master/texmf-dist/source/latex/sjtutex/sjtutex.dtx
    trunk/Master/texmf-dist/tex/latex/sjtutex/
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-cambria.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-libertinus.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-lm.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newcm.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newpx.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newtx.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-stixtwo.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-times.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-xits.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-cambria.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-libertinus.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-lm.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newcm.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newpx.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newtx.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-stixtwo.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-times.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-xits.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-de.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-en.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-de.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-en.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-de.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-en.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-de.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-en.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/
    trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-de.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-en.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-ja.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-zh.def
    trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuarticle.cls
    trunk/Master/texmf-dist/tex/latex/sjtutex/sjtureport.cls
    trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuthesis.cls
    trunk/Master/texmf-dist/tex/latex/sjtutex/vi/
    trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-red.pdf
    trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-small-red.pdf
    trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-red.pdf
    trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-small-red.pdf
    trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-name-red.pdf
    trunk/Master/tlpkg/tlpsrc/sjtutex.tlpsrc

Added: trunk/Master/texmf-dist/doc/latex/sjtutex/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/sjtutex/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/sjtutex/README.md	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,31 @@
+# SJTUTeX
+
+## 简介
+
+SJTUTeX 旨在建立一个简单易用的上海交通大学文档类集,包括学位论文文档类 `sjtuthesis`,以及普通文档类 `sjtuarticle` 和 `sjtureport`。
+
+在使用该文档类集之前,请仔细阅读文档 `sjtutex.pdf`。
+
+本项目也是 [SJTUThesis](https://github.com/sjtug/SJTUThesis) 项目使用的文档类集,如果遇到使用问题,请前往 [Discussions](https://github.com/sjtug/SJTUThesis/discussions) 提问或提交 [Issues](https://github.com/sjtug/SJTUThesis/issues);如果对文档类有改进建议,也欢迎提交 [Pull Requests](https://github.com/sjtug/SJTUTeX/pulls)。
+
+## 软件许可证
+
+[交大视觉形象系统](https://vi.sjtu.edu.cn)的相关图像资源版权归上海交通大学所有。其他部分使用 [LaTeX Project Public License](http://www.latex-project.org/lppl.txt) 授权。
+
+---
+
+# SJTUTeX
+
+## Description
+
+SJTUTeX aims to establish a simple and easy-to-use collection of document classes for Shanghai Jiao Tong University, including the thesis document class `sjtuthesis`, as well as the regular document classes `sjtuarticle` and `sjtureport`.
+
+Before using this collection of document classes, please read the document `sjtutex.pdf` carefully.
+
+This project is also used by the [SJTUThesis](https://github.com/sjtug/SJTUThesis) project. If you encounter any usage problems, please go to [Discussions](https://github.com/sjtug/SJTUThesis/discussions) to ask questions or open [Issues](https://github.com/sjtug/SJTUThesis/issues); if you have any suggestions for improving the document class, you could also submit [Pull Requests](https://github.com/sjtug/SJTUTeX/pulls).
+
+## License
+
+This work may be distributed and/or modified under the
+conditions of the [LaTeX Project Public License](http://www.latex-project.org/lppl.txt), either version 1.3
+of this license or (at your option) any later version.


Property changes on: trunk/Master/texmf-dist/doc/latex/sjtutex/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/sjtutex/sjtutex.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/sjtutex/sjtutex.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/sjtutex/sjtutex.pdf	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/texmf-dist/doc/latex/sjtutex/sjtutex.pdf	2024-02-18 21:11:54 UTC (rev 69966)

Property changes on: trunk/Master/texmf-dist/doc/latex/sjtutex/sjtutex.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/sjtutex/sjtutex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/sjtutex/sjtutex.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/sjtutex/sjtutex.dtx	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,6137 @@
+% \iffalse meta-comment
+%
+% Copyright (C) SJTUG
+%   2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%   2022--2024 Zilong Li    <logcreative at outlook.com>
+%
+% 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.
+%
+%<*internal>
+\iffalse
+%</internal>
+%
+%<*internal>
+\fi
+\begingroup
+  \def\NameOfLaTeXe{LaTeX2e}
+\expandafter\endgroup\ifx\NameOfLaTeXe\fmtname\else
+\csname fi\endcsname
+%</internal>
+%
+%<*install>
+\input ctxdocstrip.tex
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+    Copyright (C) SJTUG
+      2018--2024 Weijian Wu   <alexarawu at outlook.com>
+      2022--2024 Zilong Li    <logcreative at outlook.com>
+
+    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-thesis-zh.def}      {\from{\jobname.dtx}{lang,thesis,zh}}
+    \file{sjtu-lang-thesis-en.def}      {\from{\jobname.dtx}{lang,thesis,en}}
+    \file{sjtu-lang-thesis-de.def}      {\from{\jobname.dtx}{lang,thesis,de}}
+    \file{sjtu-lang-thesis-ja.def}      {\from{\jobname.dtx}{lang,thesis,ja}}
+    \file{sjtu-lang-generic-zh.def}     {\from{\jobname.dtx}{lang,generic,zh}}
+    \file{sjtu-lang-generic-en.def}     {\from{\jobname.dtx}{lang,generic,en}}
+    \file{sjtu-lang-generic-de.def}     {\from{\jobname.dtx}{lang,generic,de}}
+    \file{sjtu-lang-generic-ja.def}     {\from{\jobname.dtx}{lang,generic,ja}}
+    \file{sjtu-name-thesis-zh.def}      {\from{\jobname.dtx}{name,thesis,zh}}
+    \file{sjtu-name-thesis-en.def}      {\from{\jobname.dtx}{name,thesis,en}}
+    \file{sjtu-name-thesis-de.def}      {\from{\jobname.dtx}{name,thesis,de}}
+    \file{sjtu-name-thesis-ja.def}      {\from{\jobname.dtx}{name,thesis,ja}}
+    \file{sjtu-name-generic-zh.def}     {\from{\jobname.dtx}{name,generic,zh}}
+    \file{sjtu-name-generic-en.def}     {\from{\jobname.dtx}{name,generic,en}}
+    \file{sjtu-name-generic-de.def}     {\from{\jobname.dtx}{name,generic,de}}
+    \file{sjtu-name-generic-ja.def}     {\from{\jobname.dtx}{name,generic,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-text-font-newtx.def}     {\from{\jobname.dtx}{font,text,newtx}}
+    \file{sjtu-text-font-newpx.def}     {\from{\jobname.dtx}{font,text,newpx}}
+    \file{sjtu-text-font-lm.def}        {\from{\jobname.dtx}{font,text,lm}}
+    \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-xits.def}      {\from{\jobname.dtx}{font,text,xits}}
+    \file{sjtu-text-font-newcm.def}     {\from{\jobname.dtx}{font,text,newcm}}
+    \file{sjtu-text-font-cambria.def}   {\from{\jobname.dtx}{font,text,cambria}}
+    \file{sjtu-text-font-times.def}     {\from{\jobname.dtx}{font,text,times}}
+    \file{sjtu-math-font-newtx.def}     {\from{\jobname.dtx}{font,math,newtx}}
+    \file{sjtu-math-font-newpx.def}     {\from{\jobname.dtx}{font,math,newpx}}
+    \file{sjtu-math-font-lm.def}        {\from{\jobname.dtx}{font,math,lm}}
+    \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-xits.def}      {\from{\jobname.dtx}{font,math,xits}}
+    \file{sjtu-math-font-newcm.def}     {\from{\jobname.dtx}{font,math,newcm}}
+    \file{sjtu-math-font-cambria.def}   {\from{\jobname.dtx}{font,math,cambria}}
+    \file{sjtu-math-font-times.def}     {\from{\jobname.dtx}{font,math,times}}
+    \file{sjtu-cjk-font-windows.def}    {\from{\jobname.dtx}{font,cjk,windows,und}}
+    \file{sjtu-cjk-font-windows-zh.def} {\from{\jobname.dtx}{font,cjk,windows,zh}}
+    \file{sjtu-cjk-font-windows-ja.def} {\from{\jobname.dtx}{font,cjk,windows,ja}}
+    \file{sjtu-cjk-font-mac.def}        {\from{\jobname.dtx}{font,cjk,mac,und}}
+    \file{sjtu-cjk-font-mac-zh.def}     {\from{\jobname.dtx}{font,cjk,mac,zh}}
+    \file{sjtu-cjk-font-mac-ja.def}     {\from{\jobname.dtx}{font,cjk,mac,ja}}
+    \file{sjtu-cjk-font-ubuntu.def}     {\from{\jobname.dtx}{font,cjk,ubuntu,und}}
+    \file{sjtu-cjk-font-ubuntu-zh.def}  {\from{\jobname.dtx}{font,cjk,ubuntu,zh}}
+    \file{sjtu-cjk-font-ubuntu-ja.def}  {\from{\jobname.dtx}{font,cjk,ubuntu,ja}}
+    \file{sjtu-cjk-font-adobe.def}      {\from{\jobname.dtx}{font,cjk,adobe,und}}
+    \file{sjtu-cjk-font-adobe-zh.def}   {\from{\jobname.dtx}{font,cjk,adobe,zh}}
+    \file{sjtu-cjk-font-adobe-ja.def}   {\from{\jobname.dtx}{font,cjk,adobe,ja}}
+    \file{sjtu-cjk-font-fandol.def}     {\from{\jobname.dtx}{font,cjk,fandol,und}}
+    \file{sjtu-cjk-font-fandol-zh.def}  {\from{\jobname.dtx}{font,cjk,fandol,zh}}
+    \file{sjtu-cjk-font-fandol-ja.def}  {\from{\jobname.dtx}{font,cjk,fandol,ja}}
+    \file{sjtu-cjk-font-founder.def}    {\from{\jobname.dtx}{font,cjk,founder,und}}
+    \file{sjtu-cjk-font-founder-zh.def} {\from{\jobname.dtx}{font,cjk,founder,zh}}
+    \file{sjtu-cjk-font-founder-ja.def} {\from{\jobname.dtx}{font,cjk,founder,ja}}
+%</install>
+%<*internal>
+  \usedir{source/latex/sjtutex}
+    \file{\jobname.ins}                 {\from{\jobname.dtx}{install}}
+%</internal>
+%<*install>
+}
+
+\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-generic-de.def                              *}
+\Msg{*     sjtu-lang-generic-en.def                              *}
+\Msg{*     sjtu-lang-generic-ja.def                              *}
+\Msg{*     sjtu-lang-generic-zh.def                              *}
+\Msg{*     sjtu-lang-thesis-de.def                               *}
+\Msg{*     sjtu-lang-thesis-en.def                               *}
+\Msg{*     sjtu-lang-thesis-ja.def                               *}
+\Msg{*     sjtu-lang-thesis-zh.def                               *}
+\Msg{*     sjtu-name-generic-de.def                              *}
+\Msg{*     sjtu-name-generic-en.def                              *}
+\Msg{*     sjtu-name-generic-ja.def                              *}
+\Msg{*     sjtu-name-generic-zh.def                              *}
+\Msg{*     sjtu-name-thesis-de.def                               *}
+\Msg{*     sjtu-name-thesis-en.def                               *}
+\Msg{*     sjtu-name-thesis-ja.def                               *}
+\Msg{*     sjtu-name-thesis-zh.def                               *}
+\Msg{*     sjtu-scheme-de.def                                    *}
+\Msg{*     sjtu-scheme-en.def                                    *}
+\Msg{*     sjtu-scheme-ja.def                                    *}
+\Msg{*     sjtu-scheme-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-ja.def                            *}
+\Msg{*     sjtu-cjk-font-adobe-zh.def                            *}
+\Msg{*     sjtu-cjk-font-adobe.def                               *}
+\Msg{*     sjtu-cjk-font-fandol-ja.def                           *}
+\Msg{*     sjtu-cjk-font-fandol-zh.def                           *}
+\Msg{*     sjtu-cjk-font-fandol.def                              *}
+\Msg{*     sjtu-cjk-font-founder-ja.def                          *}
+\Msg{*     sjtu-cjk-font-founder-zh.def                          *}
+\Msg{*     sjtu-cjk-font-founder.def                             *}
+\Msg{*     sjtu-cjk-font-mac-ja.def                              *}
+\Msg{*     sjtu-cjk-font-mac-zh.def                              *}
+\Msg{*     sjtu-cjk-font-mac.def                                 *}
+\Msg{*     sjtu-cjk-font-ubuntu-ja.def                           *}
+\Msg{*     sjtu-cjk-font-ubuntu-zh.def                           *}
+\Msg{*     sjtu-cjk-font-ubuntu.def                              *}
+\Msg{*     sjtu-cjk-font-windows-ja.def                          *}
+\Msg{*     sjtu-cjk-font-windows-zh.def                          *}
+\Msg{*     sjtu-cjk-font-windows.def                             *}
+\Msg{*     sjtu-vi-badge-red.pdf                                 *}
+\Msg{*     sjtu-vi-badge-small-red.pdf                           *}
+\Msg{*     sjtu-vi-logo-red.pdf                                  *}
+\Msg{*     sjtu-vi-logo-small-red.pdf                            *}
+\Msg{*     sjtu-vi-name-red.pdf                                  *}
+\Msg{*                                                           *}
+\Msg{* To produce the documentation, run the file sjtutex.dtx    *}
+\Msg{* through XeLaTeX.                                          *}
+\Msg{*                                                           *}
+\Msg{* Happy TeXing!                                             *}
+\Msg{*                                                           *}
+\Msg{*************************************************************}
+
+\endbatchfile
+%</install>
+%
+%<*internal>
+\fi
+%</internal>
+%
+%<*class>
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\providecommand\IfFormatAtLeastTF{\@ifl at t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}
+ {\PackageError{sjtutex}
+   {Your LaTeX format is outdated!\MessageBreak\MessageBreak
+    Release `2020/10/01' or newer is required to\MessageBreak
+    compile this document.\MessageBreak\MessageBreak
+    Please update your TeX distribution}{}}
+%</class>
+%<*!(driver|install)>
+%<+!driver>\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+%<class&thesis>  {Thesis document class for Shanghai Jiao Tong University (SJTUTeX)}
+%<class&thesis>\ProvidesExplClass{sjtuthesis}
+%<class&report>  {Report document class for Shanghai Jiao Tong University (SJTUTeX)}
+%<class&report>\ProvidesExplClass{sjtureport}
+%<class&article>  {Article document class for Shanghai Jiao Tong University (SJTUTeX)}
+%<class&article>\ProvidesExplClass{sjtuarticle}
+%<lang&thesis&zh>  {Chinese specific definition for thesis (SJTUTeX)}
+%<lang&thesis&zh>\ProvidesExplFile{sjtu-lang-thesis-zh.def}
+%<lang&thesis&en>  {English specific definition for thesis (SJTUTeX)}
+%<lang&thesis&en>\ProvidesExplFile{sjtu-lang-thesis-en.def}
+%<lang&thesis&de>  {German specific definition for thesis (SJTUTeX)}
+%<lang&thesis&de>\ProvidesExplFile{sjtu-lang-thesis-de.def}
+%<lang&thesis&ja>  {Japanese specific definition for thesis (SJTUTeX)}
+%<lang&thesis&ja>\ProvidesExplFile{sjtu-lang-thesis-ja.def}
+%<lang&generic&zh>  {Chinese specific definition for generic (SJTUTeX)}
+%<lang&generic&zh>\ProvidesExplFile{sjtu-lang-generic-zh.def}
+%<lang&generic&en>  {English specific definition for generic (SJTUTeX)}
+%<lang&generic&en>\ProvidesExplFile{sjtu-lang-generic-en.def}
+%<lang&generic&de>  {German specific definition for generic (SJTUTeX)}
+%<lang&generic&de>\ProvidesExplFile{sjtu-lang-generic-de.def}
+%<lang&generic&ja>  {Japanese specific definition for generic (SJTUTeX)}
+%<lang&generic&ja>\ProvidesExplFile{sjtu-lang-generic-ja.def}
+%<name&thesis&zh>  {Chinese name config for thesis (SJTUTeX)}
+%<name&thesis&zh>\ProvidesExplFile{sjtu-name-thesis-zh.def}
+%<name&thesis&en>  {English name config for thesis (SJTUTeX)}
+%<name&thesis&en>\ProvidesExplFile{sjtu-name-thesis-en.def}
+%<name&thesis&de>  {German name config for thesis (SJTUTeX)}
+%<name&thesis&de>\ProvidesExplFile{sjtu-name-thesis-de.def}
+%<name&thesis&ja>  {Japanese name config for thesis (SJTUTeX)}
+%<name&thesis&ja>\ProvidesExplFile{sjtu-name-thesis-ja.def}
+%<name&generic&zh>  {Chinese name config for generic (SJTUTeX)}
+%<name&generic&zh>\ProvidesExplFile{sjtu-name-generic-zh.def}
+%<name&generic&en>  {English name config for generic (SJTUTeX)}
+%<name&generic&en>\ProvidesExplFile{sjtu-name-generic-en.def}
+%<name&generic&de>  {German name config for generic (SJTUTeX)}
+%<name&generic&de>\ProvidesExplFile{sjtu-name-generic-de.def}
+%<name&generic&ja>  {Japanese name config for generic (SJTUTeX)}
+%<name&generic&ja>\ProvidesExplFile{sjtu-name-generic-ja.def}
+%<scheme&zh>  {Chinese scheme (SJTUTeX)}
+%<scheme&zh>\ProvidesExplFile{sjtu-scheme-zh.def}
+%<scheme&en>  {English scheme (SJTUTeX)}
+%<scheme&en>\ProvidesExplFile{sjtu-scheme-en.def}
+%<scheme&de>  {German scheme (SJTUTeX)}
+%<scheme&de>\ProvidesExplFile{sjtu-scheme-de.def}
+%<scheme&ja>  {Japanese scheme (SJTUTeX)}
+%<scheme&ja>\ProvidesExplFile{sjtu-scheme-ja.def}
+%<font&text&newtx>  {New TX text fonts definition (SJTUTeX)}
+%<font&text&newtx>\ProvidesExplFile{sjtu-text-font-newtx.def}
+%<font&text&newpx>  {New PX text fonts definition (SJTUTeX)}
+%<font&text&newpx>\ProvidesExplFile{sjtu-text-font-newpx.def}
+%<font&text&stixtwo>  {STIX Two text fonts definition (SJTUTeX)}
+%<font&text&stixtwo>\ProvidesExplFile{sjtu-text-font-stixtwo.def}
+%<font&text&xits>  {XITS text fonts definition (SJTUTeX)}
+%<font&text&xits>\ProvidesExplFile{sjtu-text-font-xits.def}
+%<font&text&lm>  {Latin Modern text fonts definition (SJTUTeX)}
+%<font&text&lm>\ProvidesExplFile{sjtu-text-font-lm.def}
+%<font&text&libertinus>  {Libertinus text fonts definition (SJTUTeX)}
+%<font&text&libertinus>\ProvidesExplFile{sjtu-text-font-libertinus.def}
+%<font&text&newcm>  {New Computer Modern text fonts definition (SJTUTeX)}
+%<font&text&newcm>\ProvidesExplFile{sjtu-text-font-newcm.def}
+%<font&text&cambria>  {Cambria text fonts definition (SJTUTeX)}
+%<font&text&cambria>\ProvidesExplFile{sjtu-text-font-cambria.def}
+%<font&text&times>  {Times text fonts definition (SJTUTeX)}
+%<font&text&times>\ProvidesExplFile{sjtu-text-font-times.def}
+%<font&math&newtx>  {New TX math fonts definition (SJTUTeX)}
+%<font&math&newtx>\ProvidesExplFile{sjtu-math-font-newtx.def}
+%<font&math&newpx>  {New PX math fonts definition (SJTUTeX)}
+%<font&math&newpx>\ProvidesExplFile{sjtu-math-font-newpx.def}
+%<font&math&stixtwo>  {STIX Two math fonts definition (SJTUTeX)}
+%<font&math&stixtwo>\ProvidesExplFile{sjtu-math-font-stixtwo.def}
+%<font&math&xits>  {XITS math fonts definition (SJTUTeX)}
+%<font&math&xits>\ProvidesExplFile{sjtu-math-font-xits.def}
+%<font&math&lm>  {Latin Modern math fonts definition (SJTUTeX)}
+%<font&math&lm>\ProvidesExplFile{sjtu-math-font-lm.def}
+%<font&math&libertinus>  {Libertinus math fonts definition (SJTUTeX)}
+%<font&math&libertinus>\ProvidesExplFile{sjtu-math-font-libertinus.def}
+%<font&math&newcm>  {New Computer Modern math fonts definition (SJTUTeX)}
+%<font&math&newcm>\ProvidesExplFile{sjtu-math-font-newcm.def}
+%<font&math&cambria>  {Cambria math fonts definition (SJTUTeX)}
+%<font&math&cambria>\ProvidesExplFile{sjtu-math-font-cambria.def}
+%<font&math&times>  {Times math fonts definition (SJTUTeX)}
+%<font&math&times>\ProvidesExplFile{sjtu-math-font-times.def}
+%<font&cjk&windows&und>  {Windows CJK fonts definition (SJTUTeX)}
+%<font&cjk&windows&und>\ProvidesExplFile{sjtu-cjk-font-windows.def}
+%<font&cjk&windows&zh>  {Windows CJK fonts definition for Chinese (SJTUTeX)}
+%<font&cjk&windows&zh>\ProvidesExplFile{sjtu-cjk-font-windows-zh.def}
+%<font&cjk&windows&ja>  {Windows CJK fonts definition for Japanese (SJTUTeX)}
+%<font&cjk&windows&ja>\ProvidesExplFile{sjtu-cjk-font-windows-ja.def}
+%<font&cjk&mac&und>  {macOS CJK fonts definition (SJTUTeX)}
+%<font&cjk&mac&und>\ProvidesExplFile{sjtu-cjk-font-mac.def}
+%<font&cjk&mac&zh>  {macOS CJK fonts definition for Chinese (SJTUTeX)}
+%<font&cjk&mac&zh>\ProvidesExplFile{sjtu-cjk-font-mac-zh.def}
+%<font&cjk&mac&ja>  {macOS CJK fonts definition for Japanese (SJTUTeX)}
+%<font&cjk&mac&ja>\ProvidesExplFile{sjtu-cjk-font-mac-ja.def}
+%<font&cjk&ubuntu&und>  {Ubuntu CJK fonts definition (SJTUTeX)}
+%<font&cjk&ubuntu&und>\ProvidesExplFile{sjtu-cjk-font-ubuntu.def}
+%<font&cjk&ubuntu&zh>  {Ubuntu CJK fonts definition for Chinese (SJTUTeX)}
+%<font&cjk&ubuntu&zh>\ProvidesExplFile{sjtu-cjk-font-ubuntu-zh.def}
+%<font&cjk&ubuntu&ja>  {Ubuntu CJK fonts definition for Japanese (SJTUTeX)}
+%<font&cjk&ubuntu&ja>\ProvidesExplFile{sjtu-cjk-font-ubuntu-ja.def}
+%<font&cjk&adobe&und>  {Adobe CJK fonts definition (SJTUTeX)}
+%<font&cjk&adobe&und>\ProvidesExplFile{sjtu-cjk-font-adobe.def}
+%<font&cjk&adobe&zh>  {Adobe CJK fonts definition for Chinese (SJTUTeX)}
+%<font&cjk&adobe&zh>\ProvidesExplFile{sjtu-cjk-font-adobe-zh.def}
+%<font&cjk&adobe&ja>  {Adobe CJK fonts definition for Japanese (SJTUTeX)}
+%<font&cjk&adobe&ja>\ProvidesExplFile{sjtu-cjk-font-adobe-ja.def}
+%<font&cjk&fandol&und>  {Fandol CJK fonts definition (SJTUTeX)}
+%<font&cjk&fandol&und>\ProvidesExplFile{sjtu-cjk-font-fandol.def}
+%<font&cjk&fandol&zh>  {Fandol CJK fonts definition for Chinese (SJTUTeX)}
+%<font&cjk&fandol&zh>\ProvidesExplFile{sjtu-cjk-font-fandol-zh.def}
+%<font&cjk&fandol&ja>  {Fandol CJK fonts definition for Japanese (SJTUTeX)}
+%<font&cjk&fandol&ja>\ProvidesExplFile{sjtu-cjk-font-fandol-ja.def}
+%<font&cjk&founder&und>  {Founder CJK fonts definition (SJTUTeX)}
+%<font&cjk&founder&und>\ProvidesExplFile{sjtu-cjk-font-founder.def}
+%<font&cjk&founder&zh>  {Founder CJK fonts definition for Chinese (SJTUTeX)}
+%<font&cjk&founder&zh>\ProvidesExplFile{sjtu-cjk-font-founder-zh.def}
+%<font&cjk&founder&ja>  {Founder CJK fonts definition for Japanese (SJTUTeX)}
+%<font&cjk&founder&ja>\ProvidesExplFile{sjtu-cjk-font-founder-ja.def}
+%<!driver>  {\ExplFileDate}{2.1}{\ExplFileDescription}
+%</!(driver|install)>
+%
+%<*driver>
+\PassOptionsToPackage{fontset=ubuntu}{ctex}
+\documentclass{ctxdoc}
+\newcommand{\sjtutex}{SJTU\TeX}
+\expandafter\def\csname ver@\jobname.dtx\endcsname
+  {2024/02/18 v2.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 at 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 at shell}{^^A
+  style             = style at 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 at latex}{^^A
+  style             = style at 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 at shell, #1}}{}
+\lstnewenvironment{latex}[1][]{^^A
+  \lstset{style=style at 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}
+%</driver>
+% \fi
+%
+% \changes{v2.0}{2021/09/10}{应用 \LaTeXiii{} 重构代码。}
+% \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 学位论文模板根据 \href{https://www.gs.sjtu.edu.cn/post/detail/Z3MxNDc=}
+%   {《上海交通大学博士、硕士学位论文撰写指南》} ,并参考
+%   \href{https://bysj.jwc.sjtu.edu.cn/ShowNews.aspx?newsno=Yr2wg3ibJJhIZh0A52amXw....}
+%   {《上海交通大学本科生毕业设计(论文)撰写规范》}
+%   编写而成。旨在供上海交通大学准毕业生撰
+%   写学位论文使用。
+% \item 学位论文模板仅为撰写指南的参考实现,不保证审查老师不提意见。任何由于使用本模板
+%   而引起的论文格式审查问题均与本模板作者无关。
+% \item 任何个人或组织以本模板为基础进行修改、扩展而生成的新的专用模板,请严格遵
+%   守 \LaTeX{} Project Public License 协议。由于违犯协议而引起的任何纠纷
+%   争端均与本模板作者无关。
+% \end{enumerate}
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \begin{documentation}
+%
+% \section{介绍}
+%
+% 最早的一版 \LaTeX{} 学位论文模板由一位热心的物理系同学制作,中文字符处理采用了当时最为流行的
+% CJK--\LaTeX{} 方案。在此基础上,weijianwen 根据交大研究生院对学位论文的要求,完成
+% 了一份基本可用的交大 \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 重构了整个宏包的代码,并使用 Doc\TeX{} 文档和
+% \textsc{DocStrip} 工具进行代码的管理,升级版本号为 1.0。2022 年 11 月,论文模板
+% 改版后,使用 \LaTeXiii{} 重构了代码,添加 \cls{sjtureport} 和 \cls{sjtuarticle}
+% 文档类,升级版本号为 2.0。
+%
+% 现在,\sjtutex{} 代码在 GitHub^^A
+% \footnote{\url{https://github.com/sjtug/SJTUTeX}}^^A
+% 上维护。
+% 原 \href{https://github.com/sjtug/SJTUThesis}{SJTUThesis} 仓库则作为学位论文示例文档,提供开箱即用的模板。
+% 学位论文模板用户可以在 \href{https://github.com/sjtug/SJTUThesis/discussions}{Discussions}
+% 上提问使用问题,也可以在 \href{https://github.com/sjtug/SJTUThesis/issues}{Issues}
+% 中进行 Bug 反馈与新功能提案。如果需要对文档类代码进行修改,欢迎前往
+% \href{https://github.com/sjtug/SJTUTeX}{\sjtutex} 仓库进行 Pull Request。
+% \sjtutex{} 模板的许多实现细节离不开
+% \href{https://github.com/sjtug/SJTUThesis/graphs/contributors}
+% {热心同学们} 的贡献,在此感谢所有为模板贡献过代码的同学们,以及所有测试和使用
+% 模板的各位同学!
+%
+% \note{模板的作用在于减少论文写作过程中格式调整的时间,前提是遵守模板的用法,否
+%   则即便用了 \sjtutex{} 也难以保证输出的论文符合学校规范。}
+%
+% \section{简明教程}
+%
+% \subsection{安装 \TeX{} 发行版}
+%
+% 因为 \LaTeXiii{} 和相关宏包在不断更新,所以推荐使用最新的 \TeX{} 发行版。
+% \sjtutex{} 支持主流的 \TeX{} 发行版,包括 \TeX{} Live、\hologo{MiKTeX}、
+% Mac\TeX{},但不支持 \CTeX{} 套装。安装方法具体可以参考
+% \href{https://github.com/sjtug/SJTUThesis/wiki/TeX-发行版及其安装}
+% {Wiki 页面《\TeX{} 发行版及其安装》}。
+%
+% \sjtutex{} 最低支持至 2021 年发行的 \TeX{} 发行版,\pkg{ctex} 宏包版本应当在
+% v2.5 及以上。版本过低将无法正常编译。
+%
+% \subsection{文件组成}
+%
+% 表~\ref{tab:files} 列出了 \sjtutex{} 的主要文件及其功能介绍。
+%
+% \begin{table}[!hbt]
+% \centering
+% \begin{threeparttable}
+%   \caption{模板的文件组成}
+%   \label{tab:files}
+%   \begin{tabular}{l|l|p{4cm}}
+%     \toprule
+%     \strong{类别}         & \strong{文件}               & \strong{说明}  \\
+%     \midrule
+%     文档类                & \file{sjtuthesis.cls}       & 学位论文文档类 \\
+%                           & \file{sjtureport.cls}       & 报告文档类     \\
+%                           & \file{sjtuarticle.cls}      & 文稿文档类     \\
+%                           & \file{sjtu-name-*.def}      & 文档类名称配置 \\
+%                           & \file{sjtu-lang-*.def}      & 文档类语言配置 \\
+%                           & \file{sjtu-scheme-*.def}    & 文档类语言方案 \\
+%     \midrule
+%     字体配置文件          & \file{sjtu-text-font-*.def} & 西文字体配置   \\
+%                           & \file{sjtu-math-font-*.def} & 数学字体配置   \\
+%                           & \file{sjtu-cjk-font-*.def}  & CJK 字体配置   \\
+%     \midrule
+%     视觉形象系统\tnote{a} & \file{sjtu-vi-logo-*.pdf}   & 校标图片       \\
+%                           & \file{sjtu-vi-badge-*.pdf}  & 校徽图片       \\
+%                           & \file{sjtu-vi-name-*.pdf}   & 校名图片       \\
+%
+%     \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{} 模板根目录下,文件以 \texttt{.tex} 后缀结尾。
+% 注意在使用文档类时,需要将涉及到的所有源文件使用 UTF-8 编码保存。对于不同的文档类,使用方法
+% 略有不同,这里给出这三种文档类的最小使用示例。
+%
+% 下面这份 \TeX{} 文档展示了 \cls{sjtuthesis} 文档类的基本用法,一般需要指定中英文名称。
+% 该文档将包含中英文封面,页眉为文档主题及章节名称。
+% \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}
+%   你好,\LaTeX{}!
+% \end{document}
+% \end{latex}
+%
+% 下面这份 \TeX{} 文档展示了 \cls{sjtureport} 文档类的基本用法,建议使用标准命令定义中文名称。
+% 该文档将包含标题页,页眉为校标图片、文档主题及章节名称。
+% \begin{latex}[moretexcs={\subject,\keywords,\maketitle,\chapter},
+%   emph={[1]sjtureport,document}]
+% \documentclass{sjtureport}
+% \title{上海交通大学报告模板示例文档}
+% \author{某某}
+% \subject{XX期末课程论文}
+% \keywords{上海交大, 饮水思源, 爱国荣校}
+% \begin{document}
+%   \maketitle
+%   \chapter{欢迎}
+%   \section{欢迎使用 SJTUReport}
+%   你好,\LaTeX{}!
+% \end{document}
+% \end{latex}
+%
+% 下面这份 \TeX{} 文档展示了 \cls{sjtuarticle} 文档类的基本用法,建议使用标准命令定义中文名称,
+% 不能够使用 \tn{chapter} 这一级。该文档包含标题栏,页眉为校标图片、文档主题及章节名称。
+% \begin{latex}[moretexcs={\maketitle}, emph={[1]sjtuarticle,document}]
+% \documentclass{sjtuarticle}
+% \title{示例文档}
+% \author{某某}
+% \begin{document}
+%   \maketitle
+%   \section{欢迎使用 SJTUArticle}
+%   你好,\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} = <bachelor|(master)|doctor>
+%   \end{syntax}
+%   论文类型。三种选项分别代表学士学位论文、硕士学位论文、博士学位论文。
+% \end{function}
+%
+% \begin{function}[updated=2023-03-23]{lang}
+%   \begin{syntax}
+%     \OPT{lang} = <(zh)|en|de|ja>
+%   \end{syntax}
+%   论文主要语言。可选中文、英文、德文或日文,该选项会改变文档中的一些标题的名字。
+%   下文中 \meta{lang} 可以指定为这些选项中的其中之一。
+% \end{function}
+%
+% \begin{function}{draft, final}
+%   是否开启草稿模式。
+%   \opt{draft} 开启草稿模式,所有的图片将不会被加载,超过边界的区域将会被涂上黑色色块。
+%   \opt{final} 关闭草稿模式。
+%   默认为 \opt{final}。
+% \end{function}
+%
+% \begin{function}[rEXP]{review}
+%   盲审模式。开启盲审模式将隐去作者姓名、导师姓名、班级、学号等个人信息,
+%   删去版权使用授权书、原创性声明和致谢页。默认关闭。
+% \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}
+%   指明论文是否奇数页开章。
+%   \opt{openright} 为从奇数页开始新章,
+%   \opt{openany} 为从任意页开始新章。
+%   \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}
+%   指明论文的标题形式。
+%   \opt{titlepage} 为使用标题页。
+%   \opt{notitlepage} 为使用标题块。
+%   \begin{itemize}
+%     \item 在 \cls{sjtuthesis} 文档类中,该选项不可用,只能使用标题页。
+%     \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} = <(-4)|5>
+%   \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} = <数值>
+%   \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} = <长度|false>
+%   \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} = <(auto)|(fandol)|windows|mac|ubuntu|adobe|founder|none>
+%   \end{syntax}
+%   指定 CJK 字体集。\sjtutex{} 预定义了一些 CJK 字体组合,
+%   具体配置见表 \ref{tab:cjkfonts}。
+%   默认情况下会根据操作系统自动配置:
+%   Windows 系统默认使用 \opt{windows},
+%   macOS 系统默认使用 \opt{mac},
+%   Linux 系统默认使用 \opt{fandol}。
+%   找不到对应定义的 CJK 字体集时的回退选项为 \opt{fandol}。
+%
+%   \textbf{仅} \opt{windows} 和 \opt{founder} 字体集支持 \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
+%     	                   & \strong{宋体}     & \strong{黑体}    & \strong{仿宋} & \strong{楷体}   & \strong{明朝体}\tnote{c} & \strong{哥特体}\tnote{c}  \\
+%     \midrule
+%       |fandol|\tnote{a}  & Fandol 宋体       & Fandol 黑体      & Fandol 仿宋   & Fandol 楷体     & HaranoAjiMincho          & HaranoAjiGothic           \\
+%       |windows|          & (中易)宋体      & (中易)黑体     & (中易)仿宋  & (中易)楷体    & MS Mincho                & MS Gothic                 \\
+%       |mac|              & (华文)宋体-简   & (华文)黑体-简  & 华文仿宋      & (华文)楷体-简 & Hiragino Mincho ProN     & Hiragino Kaku Gothic ProN \\
+%       |ubuntu|           & Noto Serif CJK SC & Noto Sans CJK SC & ---           & 文鼎 PL 简中楷  & Noto Serif CJK JP        & Noto Sans CJK JP          \\
+%       |adobe|            & Adobe 宋体        & Adobe  黑体      & Adobe  仿宋   & Adobe 楷体      & Kozuka Mincho Pr6N       & Kozuka Gothic Pr6N        \\
+%       |founder|\tnote{b} & 方正书宋          & 方正黑体         & 方正仿宋      & 方正楷体        & IPAMincho                & IPAGothic                 \\
+%     \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} = <(newtx)|times|stixtwo|xits|newpx|cambria|newcm|lm|libertinus|none>
+%   \end{syntax}
+%   指定西文字体集。\sjtutex{} 预定义了一些西文字体组合,
+%   具体配置见表 \ref{tab:latinfonts}。
+%   找不到定义的西文字体集时的回退选项为 \opt{newtx}。
+% \end{function}
+%
+% \begin{function}{math-font}
+%   \begin{syntax}
+%     \OPT{math-font} = <(auto)|(newtx)|times|stixtwo|xits|newpx|cambria|newcm|lm|libertinus|none>
+%   \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
+%       & \strong{正文字体} & \strong{无衬线字体} & \strong{等宽字体} & \strong{数学字体} \\
+%     \midrule
+%       |newtx|                  & TG Termes X\tnote{a}     & TG Heros        & TG Cursor   & newtx           \\
+%       \multirow{2}{*}{|times|} & Times New Roman\tnote{b} & Arial           & Courier New & \multirow{2}{*}{mathptmx} \\
+%                                & Times\tnote{c}           & Helvetica       & Courier     &                 \\
+%       |stixtwo|                & STIX Two Text            & TG Heros        & TG Cursor   & STIX Two Math   \\
+%       |xits|                   & XITS                     & TG Heros        & TG Cursor   & XITS Math       \\
+%       |newpx|                  & TG Pagella X             & TG Heros        & TG Cursor   & newpx           \\
+%       |cambria|                & Cambria                  & Calibri         & Consolas    & Cambria Math    \\
+%       |newcm|                  & New CM\tnote{d}          & New CM Sans     & New CM Mono & New CM Math     \\
+%       |lm|                     & LM Roman\tnote{e}        & LM Sans         & LM Mono     & LM Math         \\
+%       |libertinus|             & Libertinus Serif         & Libertinus Sans & LM Mono     & 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} = <(ISO)|TeX>
+%   \end{syntax}
+%   数学符号样式。该选项将影响 \opt{uppercase-greek}、\opt{integral}、
+%   \opt{integral-limits} 选项。
+%   默认遵循 ISO 80000-2 标准设置,即斜体的大写希腊字母、直立的积分号
+%   以及积分号上下限置于上下方。
+%   用户也可以逐项修改数学样式。
+% \end{function}
+%
+% \begin{function}[added=2023-01-05]{uppercase-greek}
+%   \begin{syntax}
+%     \OPT{uppercase-greek} = <slanted|upright>
+%   \end{syntax}
+%   大写希腊字母的正/斜体。
+% \end{function}
+%
+% \begin{function}[added=2023-01-05]{integral}
+%   \begin{syntax}
+%     \OPT{integral} = <slanted|upright>
+%   \end{syntax}
+%   积分号的正/斜体。
+% \end{function}
+%
+% \begin{function}[added=2023-01-05]{integral-limits}
+%   \begin{syntax}
+%     \OPT{integral-limits} = <true|false>
+%   \end{syntax}
+%   行间公式中积分号上下限的位置,
+%   \opt{true} 使得上下限在积分号上下方,
+%   \opt{false} 使得上下限在积分号右侧。
+%   该选项只影响行间公式,行内公式统一居右侧,不受影响。
+% \end{function}
+%
+% \subsection{论文信息设置}
+%
+% \begin{function}{\sjtusetup}
+%   \begin{syntax}
+%     \TNA{sjtusetup}\marg{键值列表}
+%   \end{syntax}
+%   本模板提供了一系列选项,可由您自行配置。载入文档类之后,以下
+%   所有选项均可通过统一的命令 \tn{sjtusetup} 来设置。
+% \end{function}
+%
+% \tn{sjtusetup} 的参数是一组由(英文)逗号隔开的选项列表,列表中的选项通常是
+% \meta{key}|=|\meta{value} 的形式。对于同一项,后面的设置将会覆盖前面的设置。在
+% 下文的说明中,将用\textbf{粗体}表示默认值。\tn{sjtusetup} 支持不同类型以及多种
+% 层次的选项设定。键值列表中,“|=|”左右的空格不影响设置;但需注意,参数列表中不
+% 可以出现空行。
+%
+% \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=2023-03-14]{info}
+%   \begin{syntax}
+%     \OPS{info} = \marg{键值列表}
+%   \end{syntax}
+%   该选项包含许多子项目,用于录入论文信息。具体内容见下。
+%   \begin{itemize}
+%     \item 在 \cls{sjtuthesis} 文档类中,推荐使用带语言代码前缀 \meta{lang}
+%           (比如 \opt{zh} 或 \opt{en})的键来设定对应语言的论文信息,见第
+%           \ref{sec:sjtuthesiskey} 节;省略语言前缀不带“*”的项目表示对应的中文
+%           字段、带“*”的项目表示对应的英文字段属于老用法,仍然兼容但请及时更新
+%           至新用法。
+%     \item 在 \cls{sjtureport} 和 \cls{sjtuarticle} 文档类中,不需要使用语言代
+%           码前缀。此时推荐直接使用标准接口来设定这些信息,这些标准接口不属于键
+%           值列表,应当直接写在导言区内,见第 \ref{sec:sjtureportcmd} 节。
+%   \end{itemize}
+% \end{function}
+%
+% \paragraph{适用于 \cls{sjtuthesis} 文档类的键}
+% \label{sec:sjtuthesiskey}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/title}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{title} = \marg{标题}
+%   \end{syntax}
+%   标题。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/display-title}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{display-title} = \marg{标题页标题}
+%   \end{syntax}
+%   标题页中的题目。默认为跟随对应语言的标题。
+%   如果标题过长,可以尝试使用“|\\|”手动断行。
+% \end{function}
+%
+% \begin{function}[rEXP,added=2022-12-17,updated=2023-03-14]{info/<lang>/subject}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{subject} = \marg{主题}
+%   \end{syntax}
+%   文档主题。一般显示在中文标题页校徽下方。
+%   默认值类似于 “上海交通大学学士学位论文” 或 “A Dissertation Submitted to
+%   Shanghai Jiao Tong University for the Degree of Bachelor”。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/keywords}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{keywords} = \marg{中文关键字}
+%   \end{syntax}
+%   关键字列表。各关键字之间需使用英文逗号隔开。
+%   为防止歧义,可以用分组括号“|{...}|”把各字段括起来。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/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/<lang>/supervisor,
+%   info/<lang>/assoc-supervisor,info/<lang>/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/<lang>/degree}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{degree} = \marg{学位名称}
+%   \end{syntax}
+%   申请学位中英文名称。
+%   包括申请的学位类别和级别,如“工学硕士”、“理学博士”等。
+%   学士论文无需标注。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/department}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{department} = \marg{院系名称}
+%   \end{syntax}
+%   院系名称。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/major}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{major} = \marg{专业名称}
+%   \end{syntax}
+%   专业名称。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/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 格式,
+%   即 |yyyy-mm-dd| 或 |yyyy-mm|,否则设定无效。该键语言前缀不是必须的。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-03-14]{info/<lang>/display-date}
+%   \begin{syntax}
+%     \OPT{\meta{lang}}/\OPT{display-date} = \marg{日期文字}
+%   \end{syntax}
+%   显示日期,可以显示不同于标准日期格式的日期,日期文字将会被原样输出。
+%   设定该键时,将会覆盖 \opt{info/date} 键在对应语言下的设定。
+% \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{标题}
+%   \end{syntax}
+%   设置标题,覆盖 \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} 键的值。
+%   日期会被原样显示。
+% \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{样式域}
+%
+% \begin{function}{style}
+%   \begin{syntax}
+%     \OPS{style} = \marg{键值列表}
+%   \end{syntax}
+%   该选项包含许多子项目,用于设置论文样式。具体内容见下。
+% \end{function}
+%
+% \begin{function}[added=2024-01-10]{style/indent-first}
+%   \begin{syntax}
+%     \OPT{indent-first} = <(true)|false>
+%   \end{syntax}
+%   章节标题后首段是否缩进。
+% \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=2023-03-28]{style/fnmark-style}
+%   \begin{syntax}
+%     \OPT{fnmark-style} = <plain|circled>
+%   \end{syntax}
+%   脚注数字编号样式。
+%   \opt{plain} 表示使用普通数字编号;
+%   \opt{circled} 表示使用带圈数字编号。
+%   在 \opt{zh} 和 \opt{ja} 语言设置中,默认为 \opt{circled};
+%   在 \opt{en} 和 \opt{de} 语言设置中,默认为 \opt{plain}。
+%
+%   使用带圈数字编号时,由于超过 50 的带圈数字没有对应的 Unicode 码位,
+%   所以每页脚注最好不要超过 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} = <haranoaji|\marg{字体设置}>
+%   \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} = <true|(false)>
+%   \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]{style/page-number}
+%   \begin{syntax}
+%     \OPT{page-number} = \marg{页码设置}
+%   \end{syntax}
+%   设置页码的显示样式,其中 |#1| 代表当前页码。
+%   默认为 |{#1}|,即仅显示页码本身。
+% \end{function}
+%
+% \begin{function}[added=2023-11-30]{style/keywords-format}
+%   \begin{syntax}
+%     \OPT{keywords-format} = <(plain)|hang>
+%   \end{syntax}
+%   设置关键词格式。默认为 \opt{plain} 无缩进的普通段落,另可选 \opt{hang} 悬挂格式。
+% \end{function}
+%
+% \subsubsection{名称域}
+%
+% \begin{function}{name}
+%   \begin{syntax}
+%     \OPS{name} = \marg{键值列表}
+%   \end{syntax}
+%   选项包含许多子项目,用于设置论文中一些标题的名称。部分选项只能在 \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}|>{\raggedright\arraybackslash}p{9em}|p{11em}|p{8em}}
+%   \caption{\opt{name} 选项的默认设置} \label{tab:names} \\
+%   \toprule
+%     \strong{选项}        & \strong{|lang = zh|}   & \strong{|lang = en|}          & \strong{|lang = de|}   & \strong{|lang = ja|} \\
+%   \midrule
+%   \endfirsthead
+%     \multicolumn{5}{r}{续表~\thetable} \\
+%   \toprule
+%     \strong{选项}        & \strong{|lang = zh|}   & \strong{|lang = en|}          & \strong{|lang = de|}   & \strong{|lang = ja|} \\
+%   \midrule
+%   \endhead
+%     \bottomrule
+%     \multicolumn{5}{r}{续下页}
+%   \endfoot
+%     \bottomrule
+%   \endlastfoot
+%     |contents|           & 目录                   & Contents                      & Inhaltsverzeichnis     & 目次                 \\
+%     |listfigure|         & 插图                   & List of Figures               & Abbildungsverzeichnis  & 図目次               \\
+%     |listtable|          & 表格                   & List of Tables                & Tabellenverzeichnis    & 表目次               \\
+%     |figure|             & 图                     & Figure                        & Abbildung              & 図                   \\
+%     |table|              & 表                     & Table                         & Tabelle                & 表                   \\
+%     |abstract| \rexpstar & 摘要                   & Abstract                      & Zusammenfassung        & 概要                 \\
+%     |index|              & 索引                   & Index                         & Index                  & 索引                 \\
+%     |appendix|           & 附录                   & Appendix                      & Anhang                 & 付録                 \\
+%     |proof|              & 证明                   & Proof                         & Beweis                 & 证明                 \\
+%     |bib|                & 参考文献               & Bibliography                  & Literaturverzeichnis   & 参考文献             \\
+%   \midrule
+%     |figure*|            & Figure                 & 图                            & Figure                 & Figure               \\
+%     |table*|             & Table                  & 表                            & Table                  & Table                \\
+%     |algorithm|          & 算法                   & Algorithm                     & Algorithmus            & アルゴリズム         \\
+%     |listalgorithm|      & 算法                   & List of Algorithms            & Algorithmenverzeichnis & アルゴリズム目次     \\
+%     |abbr| \rexpstar     & 缩略语对照表           & Abbreviation                  & Abkürzungsverzeichnis  & 略語表               \\
+%     |nom| \rexpstar      & 主要符号对照表         & Nomenclature                  & Symbolverzeichnis      & 記号表               \\
+%     |ack| \rexpstar      & 致谢                   & Acknowledgements              & Danksagungen           & 謝辞                 \\
+%     |resume| \rexpstar   & 个人简历               & Resume                        & Lebenslauf             & 履歴書               \\
+%     |digest| \rexpstar   & 大摘要                 & Digest                        & Kurzfassung            & 要約                 \\
+%     |achv| \rexpstar     & 学术论文和科研成果目录 & List of Research Achievements & Forschungsleistungen   & 研究業績書           \\
+% \end{longtable}
+% \endgroup
+%
+% \section{内容编写}
+%
+% \begin{function}{document}
+%   \begin{syntax}
+%     \BEV{document}
+%     \  \meta{文档内容}
+%     \EEV{document}
+%   \end{syntax}
+% 在文档开始后进行内容编写,文档内容由 |document| 环境包裹。
+% \end{function}
+%
+% \subsection{标题页和声明页}
+%
+% \begin{function}[updated=2022-12-03]{\maketitle}
+%   \begin{syntax}
+%     \TNA{maketitle}
+%   \end{syntax}
+%   生成标题。
+%   \begin{itemize}
+%     \item 在 \cls{sjtuthesis} 文档类中,生成标题页。
+%     \item 在 \cls{sjtureport} 和 \cls{sjtuarticle} 文档类中,
+%           \begin{itemize}
+%             \item 若处于 \opt{titlepage} 文档类选项中,生成标题页。\cls{sjtureport} 文档类默认。
+%             \item 若处于 \opt{notitlepage} 文档类选项中,生成标题块。\cls{sjtuarticle} 文档类默认。
+%           \end{itemize}
+%   \end{itemize}
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2022-12-20]{\copyrightpage}
+%   \begin{syntax}
+%     \TNA{copyrightpage}
+%     \TNA{copyrightpage}\oarg{授权书扫描件}
+%   \end{syntax}
+%   生成空白版权使用授权书。
+%   接受一个可选参数用于插入版权使用授权书扫描件,使用可选参数时需要手动加载 \pkg{pdfpages} 宏包。
+% \end{function}
+%
+% \subsection{前文部分}
+%
+% \begin{function}[rEXP]{\frontmatter}
+%   \begin{syntax}
+%     \TNB{frontmatter}
+%   \end{syntax}
+%   声明前文部分开始。
+% \end{function}
+%
+% \begin{function}[updated=2023-11-29]{abstract}
+%   \begin{syntax}
+%     \BEV{abstract}\oarg{lang}
+%     \  \meta{摘要}
+%     \EEV{abstract}
+%     \BEV{abstract}
+%     \  \meta{摘要}
+%     \EEV{abstract}
+%   \end{syntax}
+%   摘要环境。会在结尾添加关键词。
+%   \begin{itemize}
+%     \item \cls{sjtuthesis} 文档类中,可以设置可选参数指定摘要的语言,
+%           默认为 \opt{zh}。
+%     \item \cls{sjtuarticle} 和 \cls{sjtureport} 文档类中,不需要可选参数。
+%   \end{itemize}
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2023-11-29]{abstract*}
+%   \cls{sjtuthesis} 文档类中使用带星号的 \env{abstract*} 环境不会出现在目录中。
+% \end{function}
+%
+% \begin{function}{\tableofcontents,\tableofcontents*,\listoffigures,\listoffigures*,
+%   \listoftables,\listoftables*,\listofalgorithms,\listofalgorithms*}
+%   目录、插图、表格和算法等索引命令如表 \ref{tab:list} 所示,将其插入到期望的
+%   位置即可。带*的命令表示对应的索引表不会出现在目录中。
+%   \begin{table}[H]
+%     \centering\small
+%     \begin{threeparttable}
+%       \caption{目录和索引表}
+%       \label{tab:list}
+%       \begin{tabular}{lp{4cm}lp{4cm}}
+%         \toprule
+%         \strong{用途}     & \strong{命令}         & \strong{用途}     & \strong{命令}          \\
+%         \midrule
+%         目录              & \tn{tableofcontents}  & 插图索引          & \tn{listoffigures}     \\
+%                           & \tn{tableofcontents*} &                   & \tn{listoffigures*}    \\
+%         \midrule
+%         表格索引          & \tn{listoftables}     & 算法索引\tnote{a} & \tn{listofalgorithms}  \\
+%                           & \tn{listoftables*}    &                   & \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}
+%   声明正文部分开始。正文部分是论文的核心,您可以分章节撰写。
+%   如有需求,也可以采用多文件编译的方式。
+% \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{} 预定义了一系列数学环境。在启用 \pkg{ntheorem} 或 \pkg{amsthm}
+%   宏包后有效,环境如表 \ref{tab:theorems} 所示。
+%   \begin{table}[H]
+%     \centering
+%     \small
+%     \caption{预定义的数学环境}
+%     \label{tab:theorems}
+%     \begin{tabular}{*{7}{l}}
+%       \toprule
+%       \env{assumption}  & \env{axiom}   & \env{conjecture} & \env{corollary}    & \env{definition}  & \env{example}   & \env{exercise}  \\
+%       假设        & 公理    & 猜想       & 推论         & 定义        & 例        & 练习      \\
+%       \midrule
+%       \env{lemma}       & \env{problem} & \env{proof}      & \env{proposition}  & \env{remark}      & \env{solution}  & \env{theorem}   \\
+%       引理        & 问题    & 证明       & 命题         & 注          & 解        & 定理      \\
+%       \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} 命令开启,然后像正文一样书写。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2022-03-02]{nomenclature,nomenclature*}
+%   \begin{syntax}
+%     \BEV{nomenclature}\oarg{标题}
+%     \  \meta{符号对照表}
+%     \EEV{nomenclature}
+%   \end{syntax}
+%   符号对照表环境。带星号的版本不会出现在目录中。可以使用可选参数手动设置标题。
+%   符号对照表环境仅设置标题,内部实现可由用户自行决定。
+%   可以使用 \pkg{longtable},也可以使用 \pkg{nomencl} 宏包。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2022-03-02]{abbreviation,abbreviation*}
+%   \begin{syntax}
+%     \BEV{abbreviation}\oarg{标题}
+%     \  \meta{缩略语对照表}
+%     \EEV{abbreviation}
+%   \end{syntax}
+%   缩略语对照表环境。带星号的版本不会出现在目录中。可以使用可选参数手动设置标题。
+%   缩略语对照表环境仅设置标题,内部实现可由用户自行决定。
+% \end{function}
+%
+% \subsection{后文部分}
+%
+% \begin{function}[rEXP]{\backmatter}
+%   \begin{syntax}
+%     \TNB{backmatter}
+%   \end{syntax}
+%   声明后文部分开始。 后文部分包含致谢等。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2022-02-24]{acknowledgements}
+%   \begin{syntax}
+%     \BEV{acknowledgements}\oarg{标题}
+%     \  \meta{致谢内容}
+%     \EEV{acknowledgements}
+%   \end{syntax}
+%   致谢环境。盲审模式下致谢将被隐去。可以使用可选参数手动设置标题。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2022-02-24]{achievements}
+%   \begin{syntax}
+%     \BEV{achievements}\oarg{标题}
+%     \  \meta{获得的科研成果}
+%     \EEV{achievements}
+%   \end{syntax}
+%   科研成果环境,可以使用可选参数手动设置标题。内部请配合使用下面的附录用文献列表环境
+%   \env{bibliolist} 和 \env{bibliolist*}。你可以在该环境中使用带星号的节次命令
+%   以分隔不同的类型的成果(比如学术论文、专利等);你也可以使用多个 \env{achievements}
+%   环境,配合不同的可选参数作为标题,展示不同类型的成果。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2022-03-23]{bibliolist,bibliolist*}
+%   \begin{syntax}
+%     \BEV{bibliolist}\marg{最长条目编号}
+%     \  \TNA{item} \meta{文献条目}
+%     \EEV{bibliolist}
+%     \BEV{bibliolist*}\marg{最长条目编号}
+%     \  \TNA{item} \meta{文献条目(隐去姓名)}
+%     \EEV{bibliolist*}
+%   \end{syntax}
+%   附录用文献环境,只允许在 \env{achievements} 环境中使用。
+%   需要指定最长条目的编号作为参数,比如 \opt{99};
+%   如果将该强制参数被指定为空,将不显示编号,每条以悬挂缩进做区分。
+%   环境内部使用 \tn{item} 来分隔各条目,在同一个 \env{achievements} 环境内、不同的
+%   \env{bibliolist} 或 \env{bibliolist*} 环境中编号连续递增、不会间断。
+%   普通模式下显示 \env{bibliolist} 中的内容,盲审模式下显示 \env{bibliolist*} 中的内容。
+% \end{function}
+%
+% \begin{function}[rEXP,updated=2022-02-24]{resume}
+%   \begin{syntax}
+%     \BEV{resume}\oarg{标题}
+%     \  \meta{简历内容}
+%     \EEV{resume}
+%   \end{syntax}
+%   简历环境。盲审模式下简历将被隐去。可以使用可选参数手动设置标题。
+% \end{function}
+%
+% \begin{function}[rEXP]{digest}
+%   \begin{syntax}
+%     \BEV{digest}\oarg{lang}
+%     \  \meta{大摘要}
+%     \EEV{digest}
+%   \end{syntax}
+%   学士论文大摘要,使用可选参数设定语言,默认为 \opt{en}。
+% \end{function}
+%
+% \section{宏包依赖情况}
+%
+% 使用不同编译方式、指定不同选项,会导致宏包依赖情况有所不同。
+% 具体如下:
+% \begin{itemize}
+%   \item 在任何情况下,文档类都会\emph{显式}调用以下宏包
+%     (或文档类):
+%     \begin{itemize}
+%       \item \cls{ctexbook}、\cls{ctexrep} 和 \cls{ctexart},
+%         提供中文排版的通用框架。属于 \CTeX{} 宏集 \cite{CTeX}。
+%       \item \pkg{mathtools},对 \LaTeX{} 的数学排版功能进行了全面扩展。
+%         是 \pkg{amsmath} 的扩充。
+%       \item \pkg{geometry},用于调整页面尺寸。
+%       \item \pkg{fancyhdr},处理页眉页脚。
+%       \item \pkg{tocloft},设置目录格式。
+%       \item \pkg{caption}、\cls{bicaption} 和 \cls{subcaption},用于设置题注。
+%       \item \pkg{xcolor},提供彩色支持。
+%       \item \pkg{graphicx},提供图形插入的接口。
+%       \item \pkg{enumitem},设置列表环境格式。
+%     \end{itemize}
+%   \item \cls{sjtuthesis} 会调用 \pkg{xtemplate} 和 \pkg{array},用于辅助
+%     标题页等特殊页面的排版。
+%   \item 部分西文与数学字体预设会调用相关的字体宏包,具体调用情况请参见对应的
+%     字体预设文件。
+%   \item 部分数字字体预设会调用 \pkg{unicode-math} 处理 Unicode 编码的
+%     OpenType 数学字体。在未启用 \pkg{unicode-math} 的情况下,会调用 \pkg{bm}
+%     来选择粗体数学符号。
+% \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 \& Typesetting, volume A}\allowbreak[M].
+% \newblock Boston: Addison--Wesley Publishing Company, 1986.
+% \urlprefix \CTANurl[源代码^^A
+%   \footnote{此代码只可作为学习之用。未经 Knuth 本人同意,您不应当编译此文档。}:]^^A
+%   {systems/knuth/dist/tex/texbook.tex}
+%
+% \bibitem{LiuHY2013}
+% 刘海洋.
+% \newblock \textit{\LaTeX{} 入门} [M].
+% \newblock 北京: 电子工业出版社, 2013
+%
+% \subsection*{标准、规范}
+%
+% \bibitem{gb-t-7713.1-2006}
+% 国务院学位委员会办公室, 全国信息与文献标准化技术委员会.
+% \newblock \textit{学位论文编写规则: GB/T 7713.1--2006}\allowbreak[S].
+% \newblock 北京: 中国标准出版社, 2007
+%
+% \bibitem{cy-t-35-2001}
+% 全国信息与文献标准化技术委员会第七分委员会, 中华人民共和国新闻出版总署.
+% \newblock \textit{科技文献的章节编号方法: CY/T 35--2001}\allowbreak[S].
+% \newblock [S.l. : s.n.], 2001.
+%
+% \bibitem{SJTUGS2023}
+% 上海交通大学研究生院.
+% \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 (2023-11-01).
+% \urlprefix\url{https://ctan.org/pkg/latex}
+% \urlprefix\CTANurl[源代码:]{macros/latex/base/source2e.pdf}
+%
+% \bibitem{interface3}
+% \textsc{The \LaTeX{} Project}.
+% \newblock \textit{The \LaTeXiii{} Interfaces}\allowbreak[EB/OL].
+% \newblock (2023-11-09).
+% \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[文档及源代码:]{language/chinese/ctex/ctex.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[文档及源代码:]{macros/latex/contrib/fduthesis/fduthesis-code.pdf}
+%
+% \bibitem{thuthesis}
+% 清华大学 TUNA 协会.
+% \newblock \textit{\textsc{ThuThesis}:清华大学学位论文模板}\allowbreak[EB/OL].
+% \newblock version 7.4.0,
+% \newblock (2023-05-15).
+% \urlprefix\url{https://ctan.org/pkg/thuthesis}
+% \urlprefix\CTANurl[文档及源代码:]{macros/latex/contrib/thuthesis/thuthesis.pdf}
+%
+% \end{thebibliography}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \clearpage
+% \section{代码实现}
+%
+% \changes{v2.1}{2023/12/05}{同步 \LaTeX{} 2020/10/01,无需显式调用
+% \pkg{expl3} 和 \pkg{xparse} 宏包。}
+% 本模板使用 \LaTeXiii{} 语法编写,依赖 \pkg{expl3} 环境,
+% 并需调用 \pkg{l3packages} 中的相关宏包。
+%
+%    \begin{macrocode}
+%<@@=sjtu>
+%    \end{macrocode}
+%
+% \subsection{内部变量}
+%
+% \begin{variable}{\l_@@_tmp_bool,\l_@@_tmp_clist,\l_@@_tmp_dim,
+% \l_@@_tmp_skip,\l_@@_tmp_box}
+% 临时变量。
+%    \begin{macrocode}
+%<*class>
+%<thesis>\bool_new:N \l_@@_tmp_bool
+%<thesis>\clist_new:N \l_@@_tmp_clist
+\dim_new:N \l_@@_tmp_dim
+\skip_new:N \l_@@_tmp_skip
+\box_new:N \l_@@_tmp_box
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_thesis_type_int}
+% 论文类型。
+%    \begin{macrocode}
+%<thesis>\int_new:N \g_@@_thesis_type_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_lang_tl,\g_@@_lang_clist,
+% \c_@@_lang_de_tl,\c_@@_lang_ja_tl }
+% 论文语言。
+%    \begin{macrocode}
+\tl_new:N \g_@@_lang_tl
+%<thesis>\clist_set:Nn \g_@@_lang_clist { zh, en }
+\tl_const:Nn \c_@@_lang_de_tl { de }
+\tl_const:Nn \c_@@_lang_ja_tl { ja }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+%   {\g_@@_zihao_tl,\g_@@_font_size_int,\g_@@_font_size_dim,
+%    \g_@@_baseline_skip_dim,\g_@@_fixed_baselineskip_bool,\g_@@_line_spread_fp}
+% 字号大小与行距。
+%    \begin{macrocode}
+\tl_new:N \g_@@_zihao_tl
+\int_new:N \g_@@_font_size_int
+\dim_new:N \g_@@_font_size_dim
+\dim_new:N \g_@@_baseline_skip_dim
+\bool_new:N \g_@@_fixed_baselineskip_bool
+\fp_new:N \g_@@_line_spread_fp
+%    \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}
+% 传入数学字体宏包的选项列表。
+%    \begin{macrocode}
+\clist_new:N \g_@@_math_font_options_clist
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_review_bool}
+% 盲审模式。
+%    \begin{macrocode}
+%<thesis>\bool_new:N \g_@@_review_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_options_to_ctex_class_clist}
+% 保存由 \pkg{sjtutex} 传入 \pkg{ctex} 文档类的选项列表。
+% 默认 \pkg{ctex} 文档类的选项:
+% 使用 UTF8 编码,不调整基础类的版式以及不载入 \pkg{ctex} 字体预设配置。
+%    \begin{macrocode}
+\clist_set:Nn \g_@@_options_to_ctex_class_clist
+  { a4paper, UTF8, scheme = plain, fontset = none }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_options_to_packages_clist}
+% 保存由传入其他宏包的选项列表。
+%    \begin{macrocode}
+\clist_new:N \g_@@_options_to_packages_clist
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_twoside_bool}
+% 是否开启双页模式。
+%    \begin{macrocode}
+\bool_new:N \g_@@_twoside_bool
+%<thesis>\bool_set_true:N \g_@@_twoside_bool
+%<!thesis>\bool_set_false:N \g_@@_twoside_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_openright_bool}
+% 是否在奇数页开始新章。
+%    \begin{macrocode}
+%<!article>\bool_new:N \g_@@_openright_bool
+%<thesis>\bool_set_true:N \g_@@_openright_bool
+%<report>\bool_set_false:N \g_@@_openright_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_titlepage_bool}
+% 是否生成标题页。
+%    \begin{macrocode}
+%<!thesis>\bool_new:N \g_@@_titlepage_bool
+%<report>\bool_set_true:N \g_@@_titlepage_bool
+%<article>\bool_set_false:N \g_@@_titlepage_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_draft_bool}
+% 是否开启草稿模式。
+%    \begin{macrocode}
+\bool_new:N \g_@@_draft_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[int]{\@@_deprecated_option:n,\@@_set_deprecated_option:n}
+% 对过时选项给出警告。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_deprecated_option:n
+  { \msg_warning:nnn { sjtutex } { deprecated-option } }
+\cs_new_protected:Npn \@@_set_deprecated_option:n #1
+  {
+    \@@_deprecated_option:n { Option~ `#1'~ is~ set. }
+    \keys_set:nn { sjtu / option } {#1}
+  }
+\msg_new:nnn { sjtutex } { deprecated-option }
+  { Option~ `\l_keys_key_tl'~ is~ deprecated. \\ #1 }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{选项处理}
+%
+% 定义 |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}
+%<*thesis>
+    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 } ,
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0}{2023/03/19}{语言选项新增 \opt{ja},添加日文模板。}
+% \changes{v2.0}{2023/03/23}{语言选项新增 \opt{de},添加德文模板。}
+% \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
+%<*thesis>
+        \clist_if_in:NnF \g_@@_lang_clist {#1}
+          { \clist_gput_right:Nn \g_@@_lang_clist {#1} }
+%</thesis>
+      } ,
+    lang .initial:n = { zh } ,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{zihao}
+% 字号大小。
+%    \begin{macrocode}
+    zihao .choice: ,
+    zihao .value_required:n = true ,
+    zihao /  5 .code:n =
+      {
+        \tl_gset:Nn  \g_@@_zihao_tl {#1}
+        \int_gset:Nn \g_@@_font_size_int { 1 }
+        \dim_gset:Nn \g_@@_font_size_dim { 10.5 bp }
+      } ,
+    zihao / -4 .code:n =
+      {
+        \tl_gset:Nn  \g_@@_zihao_tl {#1}
+        \int_gset:Nn \g_@@_font_size_int { 2 }
+        \dim_gset:Nn \g_@@_font_size_dim { 12   bp }
+      } ,
+%<!article>    zihao .initial:n = { -4 } ,
+%<article>    zihao .initial:n = {  5 } ,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{linespread}
+% 行距倍数。
+%    \begin{macrocode}
+    linespread .fp_gset:N = \g_@@_line_spread_fp ,
+    linespread .initial:n = { \c_nan_fp } ,
+    linespread .value_required:n = true ,
+%    \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0}{2022/12/03}{添加 \opt{lineskip} 文档类选项。}
+% \changes{v2.1}{2023/10/24}{添加 \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}
+      } ,
+%<thesis>    baselineskip .initial:n = { 20 bp } ,
+%<!thesis>    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 } } ,
+%    \end{macrocode}
+%
+% \changes{v2.0}{2023/01/05}{添加 \opt{math-style} 文档类选项,默认值为 \opt{ISO}。}
+% \begin{macro}{math-style}
+% 数学符号样式。
+%    \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}{oneside,twoside}
+% 单面或双面模式。
+%    \begin{macrocode}
+    oneside .value_forbidden:n = true,
+    twoside .value_forbidden:n = true,
+    oneside .code:n =
+      { \bool_gset_false:N \g_@@_twoside_bool } ,
+    twoside .code:n =
+      { \bool_gset_true:N  \g_@@_twoside_bool } ,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{openany,openright}
+% 是否奇数页开章。
+%    \begin{macrocode}
+%<*!article>
+    openany   .value_forbidden:n = true,
+    openright .value_forbidden:n = true,
+    openany   .code:n =
+      { \bool_gset_false:N \g_@@_openright_bool } ,
+    openright .code:n =
+      { \bool_gset_true:N  \g_@@_openright_bool } ,
+%</!article>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{titlepage,notitlepage}
+% 是否生成标题页。
+%    \begin{macrocode}
+%<*!thesis>
+    titlepage   .value_forbidden:n = true,
+    notitlepage .value_forbidden:n = true,
+    titlepage   .code:n =
+      { \bool_gset_true:N  \g_@@_titlepage_bool } ,
+    notitlepage .code:n =
+      { \bool_gset_false:N \g_@@_titlepage_bool } ,
+%</!thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{draft,final}
+% 是否开启草稿模式。
+%    \begin{macrocode}
+    draft .value_forbidden:n = true,
+    final .value_forbidden:n = true,
+    draft .code:n =
+      { \bool_gset_true:N  \g_@@_draft_bool } ,
+    final .code:n =
+      { \bool_gset_false:N \g_@@_draft_bool } ,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{review}
+% 盲审模式。
+%    \begin{macrocode}
+%<thesis>    review .bool_gset:N = \g_@@_review_bool ,
+%<thesis>    review .initial:n = false ,
+%    \end{macrocode}
+% \end{macro}
+%
+% 处理未知选项。
+%    \begin{macrocode}
+    unknown .code:n = { \msg_error:nn { sjtutex } { unknown-option } }
+  }
+\msg_new:nnn { sjtutex } { unknown-option }
+  { Class~ option~ "\l_keys_key_tl"~ is~ unknown. }
+%    \end{macrocode}
+%
+% 将文档类选项传给 |sjtu/option|。
+%    \begin{macrocode}
+\cs_if_exist:NTF \ProcessKeyOptions
+  { \ProcessKeyOptions [ sjtu / option ] }
+  {
+    \RequirePackage { l3keys2e }
+    \ProcessKeysOptions { sjtu / option }
+  }
+%    \end{macrocode}
+% \cls{sjtureport} 和 \cls{sjtuarticle} 文档类默认使用 1.3 行距倍数。
+%    \begin{macrocode}
+%<*!thesis>
+\bool_if:NF \g_@@_fixed_baselineskip_bool
+  {
+    \fp_if_nan:nT { \g_@@_line_spread_fp }
+      { \fp_set:Nn \g_@@_line_spread_fp { 1.3 } }
+  }
+%</!thesis>
+%    \end{macrocode}
+%
+% 数字字体宏包选项。
+%    \begin{macrocode}
+\clist_set:Nx \g_@@_math_font_options_clist
+  {
+    \bool_if:NT \g_@@_slanted_uppercase_greek_bool
+      { slantedGreek } ,
+    \bool_if:NT \g_@@_upright_integral_bool
+      { upint }
+  }
+%    \end{macrocode}
+%
+% 追加全局选项。
+%    \begin{macrocode}
+\clist_put_right:Nx \@classoptionslist
+  {
+    a4paper ,
+    \tl_if_eq:NNT \g_@@_lang_tl \c_@@_lang_de_tl
+      { german, ngerman } ,
+    \bool_if:NT \g_@@_integral_limits_bool
+      { intlimits } ,
+    \g_@@_math_font_options_clist
+  }
+%    \end{macrocode}
+%
+% 设置传入 \pkg{ctex} 文档类的选项。
+%    \begin{macrocode}
+\clist_put_right:Nx \g_@@_options_to_ctex_class_clist
+  {
+    zihao      = \g_@@_zihao_tl ,
+    \fp_if_nan:nF { \g_@@_line_spread_fp }
+      { linespread = \fp_use:N \g_@@_line_spread_fp } ,
+    \bool_if:NTF \g_@@_twoside_bool
+      { twoside   } { oneside     } ,
+%<!article>    \bool_if:NTF \g_@@_openright_bool
+%<!article>      { openright } { openany     } ,
+%<!thesis>    \bool_if:NTF \g_@@_titlepage_bool
+%<!thesis>      { titlepage } { notitlepage } ,
+    \bool_if:NTF \g_@@_draft_bool
+      { draft     } { final       }
+  }
+%    \end{macrocode}
+%
+% \subsection{载入宏包、文档类}
+%
+% 将选项传入 \pkg{ctex} 文档类。
+%    \begin{macrocode}
+\exp_args:No \PassOptionsToClass
+  { \g_@@_options_to_ctex_class_clist }
+%<thesis>  { ctexbook }
+%<report>  { ctexrep }
+%<article>  { ctexart }
+%    \end{macrocode}
+%
+% 传入各宏包选项。
+%    \begin{macrocode}
+\clist_set:Nx \g_@@_options_to_packages_clist
+  {
+    { no-math           } { fontspec     } ,
+    { titles            } { tocloft      } ,
+    { list = off        } { bicaption    } ,
+    { warnings-off =
+      {
+        mathtools-overbracket,
+        mathtools-colon
+      }
+    }                     { unicode-math } ,
+    { amsmath, thmmarks } { ntheorem     } ,
+%<!article>    { chapter           } { algorithm    } ,
+%<!article>    { algochapter       } { algorithm2e  } ,
+    {
+      \bool_if:NTF \g_@@_integral_limits_bool
+        { displaylimits } { nolimits }
+    }                     { cmupint      }
+  }
+\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}
+%<thesis>\LoadClass { ctexbook }
+%<report>\LoadClass { ctexrep }
+%<article>\LoadClass { ctexart }
+%    \end{macrocode}
+%
+% 载入各宏包。
+%    \begin{macrocode}
+\RequirePackage
+  {
+%<thesis>    xtemplate,
+%<thesis>    array,
+    mathtools,
+    geometry,
+    fancyhdr,
+    tocloft,
+    caption,
+    bicaption,
+    subcaption,
+    xcolor,
+    graphicx,
+    enumitem
+  }
+%    \end{macrocode}
+%
+% \subsection{内部定义}
+%
+% \subsubsection{内部函数}
+%
+% \begin{macro}[int]{\cs_gset:cpo,\tl_const:Nv,
+% \clist_use:NV,\clist_use:cv,
+% \exp_args:NNnv,\exp_last_unbraced:ce,
+% \regex_match:neTF}
+% \LaTeX3{} 函数变体。
+%    \begin{macrocode}
+\cs_generate_variant:Nn \cs_gset:Npn { cpo }
+\cs_generate_variant:Nn \tl_const:Nn { Nv }
+\cs_generate_variant:Nn \clist_use:Nn { NV, cv }
+\exp_args_generate:n { Nnv }
+\cs_generate_variant:Nn \exp_last_unbraced:Ne { ce }
+\prg_generate_conditional_variant:Nnn \regex_match:nn { ne } { T, TF }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_engine_case:nn}
+% 2 个参数依次为 \pdfTeX 和 \XeTeX/\LuaTeX。
+%    \begin{macrocode}
+\cs_new:Npx \@@_engine_case:nn #1#2
+  {
+    \bool_lazy_or:nnTF
+      { \sys_if_engine_xetex_p:  }
+      { \sys_if_engine_luatex_p: }
+      {#2}
+      { \sys_if_engine_pdftex:T {#1} }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_engine_case:nnn}
+% 3 个参数依次为 \pdfTeX、 \XeTeX 和 \LuaTeX。
+%    \begin{macrocode}
+\cs_new:Npx \@@_engine_case:nnn #1#2#3
+  {
+    \sys_if_engine_xetex:TF
+      {#2}
+      {
+        \sys_if_engine_luatex:TF
+          {#3}
+          { \sys_if_engine_pdftex:T {#1} }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_unicode_engine_case:nn}
+% 2 个参数依次为 \XeTeX 和 \LuaTeX。
+%    \begin{macrocode}
+\cs_new:Npx \@@_unicode_engine_case:nn #1#2
+  {
+    \sys_if_engine_xetex:TF
+      {#1}
+      { \sys_if_engine_luatex:T {#2} }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_unicode_char:n}
+%    \begin{macrocode}
+\@@_engine_case:nn
+  {
+    \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]{\@@_preto_cmd:Nn,\@@_appto_cmd:Nn}
+% 补丁工具,来自 \pkg{ctexpatch} 宏包,在宏的原本定义前后增加钩子。
+%    \begin{macrocode}
+%<*!thesis>
+\cs_new_protected:Npn \@@_preto_cmd:Nn #1#2
+  {
+    \ctex_preto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \@@_appto_cmd:Nn #1#2
+  {
+    \ctex_appto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+%</!thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0.2}{2023/03/31}{区分 \texttt{dim} 与 \texttt{skip} 类型变量。}
+% \begin{macro}[int]{\@@_dim_set_to_wd:Nn,\@@_skip_add_to_wd:Nn}
+% 操作长度变量的辅助函数。
+%    \begin{macrocode}
+%<*thesis>
+\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 }
+  }
+%</thesis>
+\cs_new:Npn \@@_skip_add_to_wd:Nn #1#2
+  {
+    \hbox_set:Nn \l_@@_tmp_box {#2}
+    \skip_add:Nn #1 { \box_wd:N \l_@@_tmp_box }
+  }
+%<thesis>\cs_generate_variant:Nn \@@_dim_set_to_wd:Nn { Nv }
+\cs_generate_variant:Nn \@@_skip_add_to_wd:Nn { cv }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_cs_provide_eq:NN}
+%    \begin{macrocode}
+\cs_new: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]{\@@_vspace:N,\@@_vspace:n,
+% \@@_vspace_r:N,\@@_vspace_r:n}
+% 类似 \LaTeXe{} 中的 \tn{vspace} 和 \tn{vspace*}。
+%    \begin{macrocode}
+%<*thesis>
+\cs_new_protected:Npn \@@_vspace:N #1
+  {
+    \skip_vertical:N #1
+    \skip_vertical:N \c_zero_skip
+  }
+\cs_new_protected:Npn \@@_vspace:n #1
+  {
+    \skip_set:Nn \l_@@_tmp_skip {#1}
+    \@@_vspace:N \l_@@_tmp_skip
+  }
+\cs_new_protected:Npn \@@_vspace_r:N #1
+  {
+    \dim_set_eq:NN \l_@@_tmp_dim \prevdepth
+    \hrule height \c_zero_dim
+    \nobreak
+    \skip_vertical:N #1
+    \skip_vertical:N \c_zero_skip
+    \dim_set_eq:NN \prevdepth \l_@@_tmp_dim
+  }
+\cs_new_protected:Npn \@@_vspace_r:n #1
+  {
+    \skip_set:Nn   \l_@@_tmp_skip {#1}
+    \@@_vspace_r:N \l_@@_tmp_skip
+  }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_define_name:nn,\@@_define_name:nv,\@@_define_name:nnn,
+% \@@_define_name_from_clist:nnnn}
+% 定义默认名称的辅助函数。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_define_name:nn #1#2
+  { \tl_const:cn { c_@@_name_ #1 _tl } {#2} }
+\cs_new_protected:Npn \@@_define_name:nnn #1#2#3
+  { \tl_const:cn { c_@@_name_ #2 _ #1 _tl } {#3} }
+%<*thesis>
+\cs_new_protected:Npn \@@_define_name_from_clist:nnnn #1#2#3#4
+  { \tl_const:cx { c_@@_name_ #2 _ #1 _tl } { \clist_item:nn {#4} {#3} } }
+\cs_generate_variant:Nn \@@_define_name:nn { nv }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_define_symbol:nn}
+% 定义符号的辅助函数。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_define_symbol:nn #1#2
+  { \tl_const:cx { c_@@_symbol_ #1 _tl } { \@@_unicode_char:n {#2} } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_if_lang_valid:nTF}
+% 验证语言选项的函数。
+%    \begin{macrocode}
+%<*thesis>
+\cs_new_protected:Npn \@@_if_lang_valid:nTF #1
+  { \clist_if_in:NnTF \g_@@_lang_clist {#1} }
+\msg_new:nnn { sjtutex } { lang-validation }
+  { Invalid~ language~ argument~ `#1'! }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{页面模板}
+%
+% 使用 \pkg{xtemplate} 构建页面模板,用于绘制标题页与版权页。
+%
+% 页面部件模板。
+%    \begin{macrocode}
+\DeclareObjectType { sjtu } { 0 }
+\DeclareTemplateInterface { sjtu } { component } { 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 } { component } { 0 }
+  {
+    format      = \l_@@_component_format_tl ,
+    content     = \l_@@_component_content_tl ,
+    bottom-skip = \l_@@_component_bottom_skip ,
+    align       =
+      {
+        left    =
+          \cs_set_eq:NN \l_@@_component_align: \raggedright ,
+        right   =
+          \cs_set_eq:NN \l_@@_component_align: \raggedleft ,
+        center  =
+          \cs_set_eq:NN \l_@@_component_align: \centering ,
+        normal  =
+          \cs_set_eq:NN \l_@@_component_align: \prg_do_nothing:
+      }
+  }
+  {
+    \AssignTemplateKeys
+    \group_begin:
+      \l_@@_component_align:
+      \l_@@_component_format_tl
+      \l_@@_component_content_tl
+      \par
+    \group_end:
+    \@@_vspace:N \l_@@_component_bottom_skip
+  }
+%    \end{macrocode}
+%
+% 页面模板。
+%    \begin{macrocode}
+\DeclareTemplateInterface { sjtu } { page } { 0 }
+  {
+    bookmark      : boolean   = false ,
+    bookmark-text : tokenlist = \c_empty_tl ,
+    style         : tokenlist = empty ,
+    format        : tokenlist = \c_empty_tl ,
+    prefix        : tokenlist ,
+    components    : commalist ,
+    top-skip      : skip      = \c_zero_skip ,
+    bottom-skip   : skip      = \c_zero_skip
+  }
+\DeclareTemplateCode { sjtu } { page } { 0 }
+  {
+    bookmark      = \l_@@_page_bookmark_bool ,
+    bookmark-text = \l_@@_page_bookmark_text_tl ,
+    style         = \l_@@_page_style_tl ,
+    format        = \l_@@_page_format_tl ,
+    prefix        = \l_@@_page_prefix_tl ,
+    components    = \l_@@_page_components_clist ,
+    top-skip      = \l_@@_page_top_skip ,
+    bottom-skip   = \l_@@_page_bottom_skip
+  }
+  {
+    \AssignTemplateKeys
+    \bool_if:NTF \g_@@_openright_bool
+      { \cleardoublepage } { \clearpage }
+    \bool_if:NT \l_@@_page_bookmark_bool
+      { \@@_pdf_bookmark:nn { 0 } { \l_@@_page_bookmark_text_tl } }
+    \exp_args:No \thispagestyle { \l_@@_page_style_tl }
+%    \end{macrocode}
+% 移除页面顶部 \tn{vspace*} 的多余空白。
+% 见 \url{https://tex.stackexchange.com/questions/247513}。
+%    \begin{macrocode}
+    \@@_vspace_r:N \l_@@_page_top_skip
+    \@@_vspace:n { - \tex_parskip:D      }
+    \@@_vspace:n { - \tex_baselineskip:D }
+    \group_begin:
+      \l_@@_page_format_tl
+      \clist_map_inline:Nn \l_@@_page_components_clist
+        { \UseInstance { sjtu } { \l_@@_page_prefix_tl / ##1 } }
+    \group_end:
+    \@@_vspace:N \l_@@_page_bottom_skip
+    \clearpage
+  }
+%    \end{macrocode}
+%
+% 辅助函数。
+%    \begin{macrocode}
+\cs_new:Npn \@@_declare_component:nnn #1#2#3
+  { \DeclareInstance { sjtu } {#1/#2} { component } {#3} }
+\cs_new:Npn \@@_declare_page:nn #1#2
+  { \DeclareInstance { sjtu } {#1} { page } {#2} }
+%</thesis>
+%    \end{macrocode}
+%
+% \subsection{字号行距}
+%
+% \begin{macro}[int]{\@@_set_font_size:nnNn}
+% \begin{macro}{\normalsize}
+% 重定义 \tn{normalsize},设置正文的基线间距。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_set_font_size:nnNn #1#2#3#4
+  { \cs_set_protected:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
+\tl_set:Nx \l_@@_font_size_tl
+  {
+    { \dim_to_decimal:n { \g_@@_font_size_dim     } }
+    { \dim_to_decimal:n { \g_@@_baseline_skip_dim } }
+  }
+\bool_if:NT \g_@@_fixed_baselineskip_bool
+  {
+    \int_case:nn { \g_@@_font_size_int }
+      {
+        { 1 } {
+                \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
+                  }
+              }
+        { 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 at size } {#1} \selectfont }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{字体配置}
+%
+% \begin{macro}[int]{\@@_fontset_error:nn}
+% 字库不可用时给出紧急错误信息,停止读取定义文件。
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_fontset_error:nn #1#2
+  { \msg_error:nnnn { sjtutex } { font-unavailable } {#1} {#2} }
+\msg_new:nnn { sjtutex } { font-unavailable }
+  { `#1-font~ =~ #2'~ is~ unavailable~ in~ current~ mode. }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_fontset_case:nn}
+% 2 个参数依次为 \pdfTeX 和 \XeTeX/\LuaTeX。
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_fontset_case:nn \@@_engine_case:nn
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_fontset_case:nnn}
+% 3 个参数依次为 \pdfTeX(生成 PDF)、\pdfTeX(生成 DVI) 和
+% \XeTeX/\LuaTeX。
+%    \begin{macrocode}
+\cs_new:Npx \@@_fontset_case:nnn #1#2#3
+  {
+    \@@_engine_case:nn
+      { \sys_if_output_pdf:TF {#1} {#2} }
+      {#3}
+  }
+%    \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}
+%
+% 如果没有指定数学字体,则根据西文字体设置匹配的数字字体。
+%    \begin{macrocode}
+\tl_if_empty:NT \g_@@_math_font_tl
+  { \tl_gset_eq:NN \g_@@_math_font_tl \g_@@_text_font_tl }
+%    \end{macrocode}
+%
+% 根据操作系统判断默认 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}
+\cs_new_protected:Npn \@@_load_font:nn #1#2
+  {
+    \str_if_eq:eeF { \tl_use:c { 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 }
+      }
+  }
+\msg_new:nnn { sjtutex } { invalid-font }
+  {
+    Invalid~ value~ `#1-font~ =~ \tl_use:c { g_@@_ #1 _font_tl }~ '! \\\\
+    Using~ `#2'~ instead.
+  }
+\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:
+%</class>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{西文与数学字体}
+%
+% \changes{v2.0.3}{2023/09/25}{新增 \opt{libertinus} 字体配置。}
+%    \begin{macrocode}
+%<*font&(math|text)>
+%<*stixtwo>
+\@@_fontset_case:nn
+  {
+%<*math>
+    \DeclareSizeFunction { sub } { \sub at sfcnt \@font at 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 at lcgc } { operators } #1 }
+    \@@_set_slanted_greek:
+%</math>
+%<*text>
+    \tl_set:Nn \encodingdefault { T1 }
+    \DeclareEncodingSubset { TS1 } { ? } { 0 }
+    \UndeclareTextCommand { \textpertenthousand } { T1 }
+    \DeclareTextSymbolDefault { \textpertenthousand } { TS1 }
+    \tl_set:Nn \rmdefault { stix2 }
+    \tl_set:Nn \qhv at scale { 0.94 }
+    \tl_set:Nn \sfdefault { qhv }
+    \tl_set:Nn \ttdefault { qcr }
+%</text>
+  }
+  {
+%<*math>
+    \RequirePackage { unicode-math }
+    \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
+      ]
+%</math>
+%<math>    \setmathrm
+%<text>    \setmainfont
+      { STIXTwoText }
+      [
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      ]
+%</stixtwo>
+%<*xits>
+\@@_fontset_case:nn
+%<math>  { \@@_fontset_error:nn { math } { xits } }
+%<text>  { \@@_fontset_error:nn { text } { xits } }
+  {
+%<*math>
+    \RequirePackage { unicode-math }
+    \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
+      ]
+%</math>
+%<math>    \setmathrm
+%<text>    \setmainfont
+      { XITS }
+      [
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      ]
+%</xits>
+%<*newtx|newpx>
+%<*math>
+\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 }
+%<newtx>\tl_set:Nn \rmdefault { ntxtlf }
+%<newpx>\tl_set:Nn \rmdefault { zplTLF }
+\tl_set:Nn \qhv at scale { 0.94 }
+\tl_set:Nn \sfdefault { qhv }
+\tl_set:Nn \ttdefault { qcr }
+%<newtx>\RequirePackage { newtxmath }
+%<newpx>\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
+\@@_set_unimath_symbol:
+%</math>
+%<*text>
+\@@_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+%<newtx>    \RequirePackage { newtxtext }
+%<newpx>    \RequirePackage { newpxtext }
+    \tl_set:Nn \ttdefault { qcr }
+  }
+  {
+    \setmainfont
+%<newtx>      { TeXGyreTermesX }
+%<newpx>      { TeXGyrePagellaX }
+      [
+        Extension       = .otf,
+        UprightFont     = *-Regular,
+        BoldFont        = *-Bold,
+        ItalicFont      = *-Italic,
+        BoldItalicFont  = *-BoldItalic
+      ]
+%</text>
+%</newtx|newpx>
+%<*text&(newtx|newpx)|stixtwo|xits>
+%<math>    \setmathsf
+%<text>    \setsansfont
+      { texgyreheros }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Scale          = 0.94,
+      ]
+%<math>    \setmathtt
+%<text>    \setmonofont
+      { texgyrecursor }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      ]
+  }
+%</text&(newtx|newpx)|stixtwo|xits>
+%<*lm>
+%<*text>
+\@@_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \tl_set:Nn \rmdefault { lmr  }
+    \tl_set:Nn \sfdefault { lmss }
+    \tl_set:Nn \ttdefault { lmtt }
+  } { }
+%</text>
+%<*math>
+\RequirePackage { amssymb, upgreek }
+\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  }
+\bool_if:NT \g_@@_upright_integral_bool
+  { \RequirePackage { cmupint } }
+\@@_set_slanted_greek:
+\@@_set_unimath_symbol:
+%</math>
+%</lm>
+%<*libertinus>
+\@@_fontset_case:nn
+  {
+%<*text>
+    \tl_set:Nn \encodingdefault { T1 }
+    \tl_set:Nn \rmdefault { LibertinusSerif-TLF }
+    \tl_set:Nn \sfdefault { LibertinusSans-TLF  }
+    \tl_set:Nn \ttdefault { lmtt                }
+%</text>
+%<*math>
+    \exp_args:No \PassOptionsToPackage
+      { \g_@@_math_font_options_clist } { libertinust1math }
+    \RequirePackage { libertinust1math }
+%</math>
+  }
+  {
+%<*math>
+    \RequirePackage { unicode-math }
+    \bool_if:NTF \g_@@_upright_integral_bool
+      { \setmathfont { LibertinusMath-Regular.otf } }
+      {
+        \setmathfont { LibertinusMath-Regular.otf }
+          [ StylisticSet = 8 ]
+      }
+    \setmathfont { latinmodern-math.otf } [ range = \checkmark ]
+%</math>
+%<math>    \setmathrm
+%<text>    \setmainfont
+      { LibertinusSerif }
+      [
+        Extension           = .otf,
+        UprightFont         = *-Regular,
+        BoldFont            = *-Bold,
+        ItalicFont          = *-Italic,
+        BoldItalicFont      = *-BoldItalic,
+        SlantedFont         = *-Regular,
+        BoldSlantedFont     = *-Bold,
+        SlantedFeatures     = { FakeSlant = 0.2 },
+        BoldSlantedFeatures = { FakeSlant = 0.2 }
+      ]
+%<math>    \setmathsf
+%<text>    \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 }
+      ]
+  }
+%</libertinus>
+%<*times>
+%<*math>
+\PassOptionsToPackage { Symbol } { upgreek }
+\RequirePackage { amssymb, upgreek }
+\tl_set_eq:NN \l_@@_save_rmdefault_tl \rmdefault
+  \RequirePackage { mathptmx }
+\tl_set_eq:NN \rmdefault \l_@@_save_rmdefault_tl
+\tl_set:Nn \Hv at 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 at ptm } { OML } { ptmcm } { m } { it }
+\@@_declare_math_symbol:nnNn { \mathord } { SJTU at ptm } \upvarsigma { "26 }
+\bool_if:NT \g_@@_upright_integral_bool
+  { \RequirePackage { cmupint } }
+\@@_set_unimath_symbol:
+%</math>
+%<*text>
+\@@_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \tl_set:Nn \rmdefault { ptm }
+    \tl_set:Nn \Hv at scale { 0.94 }
+    \tl_set:Nn \sfdefault { phv }
+    \tl_set:Nn \ttdefault { pcr }
+  }
+  {
+    \setmainfont { Times~New~Roman } [ Ligatures = Rare ]
+    \setsansfont { Arial } [ Scale = 0.94 ]
+    \setmonofont { Courier~New }
+  }
+%</text>
+%</times>
+%<*newcm>
+\@@_fontset_case:nn
+%<math>  { \@@_fontset_error:nn { math } { newcm } }
+%<text>  { \@@_fontset_error:nn { text } { newcm } }
+  {
+%<*math>
+    \RequirePackage { unicode-math }
+    \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
+      ]
+%</math>
+%<math>    \setmathrm
+%<text>    \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,
+        BoldSlantedFont     = *-Bold,
+        SlantedFeatures     = { FakeSlant = 0.25 },
+        BoldSlantedFeatures = { FakeSlant = 0.25 }
+      ]
+%<math>    \setmathsf
+%<text>    \setsansfont
+      { NewCMSans10 }
+      [
+        Extension    = .otf,
+        SizeFeatures =
+          {
+            {
+              Size       = -9,
+              Font       = NewCMSans08-Book,
+              ItalicFont = NewCMSans08-BookOblique,
+            },
+            { Size       = 9- }
+          },
+        UprightFont    = *-Book,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-BookOblique,
+        BoldItalicFont = *-BoldOblique
+      ]
+%<math>    \setmathtt
+%<text>    \setmonofont
+      { NewCMMono10 }
+      [
+        Extension           = .otf,
+        UprightFont         = *-Book,
+        BoldFont            = *-Bold,
+        ItalicFont          = *-BookItalic,
+        BoldItalicFont      = *-BoldOblique,
+        SlantedFont         = *-Book,
+        SlantedFeatures     = { FakeSlant = 0.25 },
+        BoldSlantedFont     = *-Bold,
+        BoldSlantedFeatures = { FakeSlant = 0.25 }
+      ]
+  }
+%</newcm>
+%<*cambria>
+\@@_fontset_case:nn
+%<math>  { \@@_fontset_error:nn { math } { cambria } }
+%<text>  { \@@_fontset_error:nn { text } { cambria } }
+  {
+%<*math>
+    \RequirePackage { unicode-math }
+    \setmathfont { Cambria~Math }
+    \setmathrm { Cambria }
+    \setmathsf { Calibri }
+    \setmathtt { Consolas } [ Scale = 0.95 ]
+%</math>
+%<*text>
+    \setmainfont { Cambria }
+    \setsansfont { Calibri }
+    \setmonofont { Consolas } [ Scale = 0.95 ]
+%</text>
+  }
+%</cambria>
+%</font&(math|text)>
+%    \end{macrocode}
+%
+% \pkg{unicode-math} 宏包设置。
+%    \begin{macrocode}
+%<*class>
+\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
+      }
+  }
+%    \end{macrocode}
+%
+% 若未使用 \pkg{unicode-math} 配置数学字体,则自动调用 \pkg{bm}。
+%    \begin{macrocode}
+\ctex_at_end_preamble:n
+  {
+    \@ifpackageloaded { unicode-math }
+      { } { \RequirePackage { bm } }
+  }
+%</class>
+%    \end{macrocode}
+%
+% \subsubsection{CJK 字体}
+%
+% 在字体未提供对应粗体的情况下,允许使用伪粗。
+%    \begin{macrocode}
+%<*font&cjk>
+%<*windows>
+%<*und>
+\tl_if_eq:NNTF \g_@@_lang_tl \c_@@_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-windows-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-windows-zh.def } }
+%</und>
+%<*zh|ja>
+\@@_fontset_case:nn
+%<*zh>
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { windows }
+    \ctex_punct_set:n { windows }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+%</zh>
+%<ja>  { \@@_fontset_error:nn { cjk } { windows } }
+  {
+%<*zh>
+    \setCJKmainfont { SimSun   }
+      [ AutoFakeBold = 3 , ItalicFont = KaiTi ]
+    \setCJKsansfont { SimHei   } [ AutoFakeBold = 3 ]
+    \setCJKmonofont { FangSong }
+%</zh>
+%<*ja>
+    \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 ]
+%</ja>
+    \setCJKfamilyfont { zhsong } { SimSun   }
+      [ AutoFakeBold = 3 , ItalicFont = KaiTi ]
+    \setCJKfamilyfont { zhhei  } { SimHei   } [ AutoFakeBold = 3 ]
+    \setCJKfamilyfont { zhkai  } { KaiTi    }
+    \setCJKfamilyfont { zhfs   } { FangSong }
+  }
+%</zh|ja>
+%</windows>
+%<*mac>
+%<*und>
+\tl_if_eq:NNTF \g_@@_lang_tl \c_@@_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-mac-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-mac-zh.def } }
+%</und>
+%<*zh|ja>
+%<zh>\@@_fontset_case:nnn
+%<ja>\@@_fontset_case:nn
+  { \@@_fontset_error:nn { cjk } { mac } }
+%<*zh>
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { mac }
+    \ctex_punct_set:n { mac }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_family:nn   { \CJKsfdefault } { zhpf   }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhpf   }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+%</zh>
+  {
+%<*zh>
+    \setCJKmainfont { Songti~SC  }
+      [
+        UprightFont    = *~Light ,
+        BoldFont       = *~Bold ,
+        ItalicFont     = Kaiti~SC~Regular ,
+        BoldItalicFont = Kaiti~SC~Bold
+      ]
+    \setCJKsansfont { Heiti~SC   }
+      [
+        UprightFont    = *~Medium ,
+        AutoFakeBold   = 3
+      ]
+    \setCJKmonofont { STFangsong }
+%</zh>
+%<*ja>
+    \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
+      ]
+%</ja>
+    \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
+      ]
+  }
+%</zh|ja>
+%</mac>
+%<*ubuntu>
+%<*und>
+\tl_if_eq:NNTF \g_@@_lang_tl \c_@@_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-ubuntu-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-ubuntu-zh.def } }
+%</und>
+%<*zh|ja>
+%<zh>\@@_fontset_case:nnn
+%<ja>\@@_fontset_case:nn
+  { \@@_fontset_error:nn { cjk } { ubuntu } }
+%<*zh>
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhsong } { ubuntu }
+    \ctex_punct_set:n { ubuntu }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+%</zh>
+  {
+%<*zh>
+    \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
+      ]
+%</zh>
+%<*ja>
+    \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
+      ]
+%</ja>
+    \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 { zhfs   } { Noto~Sans~Mono~CJK~JP }
+    \setCJKfamilyfont { zhkai  } { AR~PL~KaitiM~GB       }
+  }
+%</zh|ja>
+%</ubuntu>
+%<*adobe>
+%<*und>
+\tl_if_eq:NNTF \g_@@_lang_tl \c_@@_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-adobe-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-adobe-zh.def } }
+%</und>
+%<*zh|ja>
+%<zh>\@@_fontset_case:nnn
+%<ja>\@@_fontset_case:nn
+  { \@@_fontset_error:nn { cjk } { adobe } }
+%<*zh>
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { adobe }
+    \ctex_punct_set:n { adobe }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+%</zh>
+  {
+%<*zh>
+    \setCJKmainfont { AdobeSongStd-Light       }
+      [ AutoFakeBold = 3 , ItalicFont = AdobeKaitiStd-Regular ]
+    \setCJKsansfont { AdobeHeitiStd-Regular    } [ AutoFakeBold = 3 ]
+    \setCJKmonofont { AdobeFangsongStd-Regular }
+%</zh>
+%<*ja>
+    \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
+      ]
+%</ja>
+    \setCJKfamilyfont { zhsong } { AdobeSongStd-Light       }
+      [ AutoFakeBold = 3 , ItalicFont = AdobeKaitiStd-Regular ]
+    \setCJKfamilyfont { zhhei  } { AdobeHeitiStd-Regular    } [ AutoFakeBold = 3 ]
+    \setCJKfamilyfont { zhfs   } { AdobeFangsongStd-Regular }
+    \setCJKfamilyfont { zhkai  } { AdobeKaitiStd-Regular    }
+  }
+%</zh|ja>
+%</adobe>
+%<*fandol>
+%<*und>
+\tl_if_eq:NNTF \g_@@_lang_tl \c_@@_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-fandol-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-fandol-zh.def } }
+%</und>
+%<*zh|ja>
+%<zh>\@@_fontset_case:nnn
+%<ja>\@@_fontset_case:nn
+  { \@@_fontset_error:nn { cjk } { fandol } }
+%<*zh>
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { fandol }
+    \ctex_punct_set:n { fandol }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+%</zh>
+  {
+%<*zh>
+    \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
+      ]
+%</zh>
+%<*ja>
+    \setCJKmainfont { HaranoAjiMincho }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Regular ,
+        BoldFont    = *-Bold
+      ]
+    \setCJKsansfont { HaranoAjiGothic }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Medium ,
+        BoldFont    = *-Bold
+      ]
+    \setCJKmonofont { HaranoAjiGothic }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Regular
+      ]
+    \setCJKfamilyfont { jamin  } { HaranoAjiMincho }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Regular ,
+        BoldFont    = *-Bold
+      ]
+    \setCJKfamilyfont { jagoth } { HaranoAjiGothic }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Medium ,
+        BoldFont    = *-Bold
+      ]
+%</ja>
+    \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
+      ]
+  }
+%</zh|ja>
+%</fandol>
+%<*founder>
+%<*und>
+\tl_if_eq:NNTF \g_@@_lang_tl \c_@@_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-founder-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-founder-zh.def } }
+%</und>
+%<*zh|ja>
+\@@_fontset_case:nn
+%<*zh>
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { founder }
+    \ctex_punct_set:n { founder }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+%</zh>
+%<ja>  { \@@_fontset_error:nn { cjk } { founder } }
+  {
+%<*zh>
+    \setCJKmainfont { FZShuSong-Z01  }
+      [ AutoFakeBold = 3 , ItalicFont = FZKai-Z03 ]
+    \setCJKsansfont { FZHei-B01      } [ AutoFakeBold = 3 ]
+    \setCJKmonofont { FZFangSong-Z02 }
+%</zh>
+%<*ja>
+    \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 ]
+%</ja>
+    \setCJKfamilyfont { zhsong } { FZShuSong-Z01  }
+      [ AutoFakeBold = 3 , ItalicFont = FZKai-Z03 ]
+    \setCJKfamilyfont { zhhei  } { FZHei-B01      } [ AutoFakeBold = 3 ]
+    \setCJKfamilyfont { zhkai  } { FZKai-Z03      }
+    \setCJKfamilyfont { zhfs   } { FZFangSong-Z02 }
+  }
+%</zh|ja>
+%</founder>
+%<*!und>
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+%<!ubuntu>\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+%<ja>\NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
+%<ja>\NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
+%</!und>
+%</font&cjk>
+%    \end{macrocode}
+%
+% \begin{macro}{\CJKrmfamily,\CJKsffamily,\CJKttfamily}
+% 只改变 CJK 字体族的命令。
+%    \begin{macrocode}
+%<*class>
+\NewDocumentCommand \CJKrmfamily { } { \CJKfamily { \CJKrmdefault } }
+\NewDocumentCommand \CJKsffamily { } { \CJKfamily { \CJKsfdefault } }
+\NewDocumentCommand \CJKttfamily { } { \CJKfamily { \CJKttdefault } }
+%    \end{macrocode}
+% \end{macro}
+%
+% 带圈数字使用 CJK 字体。
+%    \begin{macrocode}
+\@@_unicode_engine_case:nn
+  {
+    \xeCJK_declare_char_class:nn { CJK }
+      { "24EA, "2460->"2473, "3251->"32BF, "25A1 }
+  }
+  {
+    \ltjdefcharrange { 99 }
+      { "24EA, "2460-"2473, "3251-"32BF, "25A1 }
+    \ltjsetparameter { jacharrange = { +99 } }
+  }
+%    \end{macrocode}
+%
+% \changes{v2.0.2}{2023/04/01}{延迟载入字体配置,修复 \pkg{unicode-math}
+% 设置不生效的问题。}
+% 载入字体配置。
+%    \begin{macrocode}
+\@@_load_fontset:
+%    \end{macrocode}
+%
+% \subsection{名称设置}
+%
+% 定义 |sjtu/name| 键值类。
+%
+% 设置标准文档类中已定义的名称。
+%    \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} } ,
+%<!thesis>    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 ,
+%<!article>    chapter        .tl_set:N = \chaptername ,
+%    \end{macrocode}
+%
+% \changes{v2.0}{2022/12/28}{简化 \opt{sjtu/name} 中键的名称:\opt{abbr},
+% \opt{nom}, \opt{ack}, \opt{achv}。}
+% 标准文档类中未定义的名称。
+%    \begin{macrocode}
+    figure*        .tl_set:N = \SJTU at figurename@bi at second ,
+    figure*       .initial:n = { 图 } ,
+    table*         .tl_set:N = \SJTU at tablename@bi at second ,
+    table*        .initial:n = { 表 } ,
+    algorithm      .tl_set:N = \SJTU at algorithmname ,
+    algorithm     .initial:n = { Algorithm } ,
+    listalgorithm  .tl_set:N = \SJTU at listalgorithmname ,
+    listalgorithm .initial:n = { List~of~Algorithms } ,
+%<*thesis>
+    abbr           .tl_set:N = \SJTU at abbrname ,
+    abbr          .initial:n = { Abbreviations } ,
+    nom            .tl_set:N = \SJTU at nomname ,
+    nom           .initial:n = { Nomenclature } ,
+    ack            .tl_set:N = \SJTU at ackname ,
+    ack           .initial:n = { Acknowledgements } ,
+    resume         .tl_set:N = \SJTU at resumename ,
+    resume        .initial:n = { Resume } ,
+    digest         .tl_set:N = \SJTU at digestname ,
+    digest        .initial:n = { Digest } ,
+    achv           .tl_set:N = \SJTU at achvname ,
+    achv          .initial:n = { List~of~Research~Achievements },
+%</thesis>
+  }
+%</class>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*scheme>
+%<*zh>
+\keys_set_known:nn { sjtu / name }
+  {
+    contents      = { 目 \protect \quad 录   } ,
+    listfigure    = { 插 \protect \quad 图   } ,
+    listtable     = { 表 \protect \quad 格   } ,
+    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          = { 学术论文和科研成果目录 }
+  }
+%</zh>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*de>
+\keys_set_known:nn { sjtu / name }
+  {
+    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   }
+  }
+%</de>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*ja>
+\keys_set_known:nn { sjtu / name }
+  {
+    contents      = { 目 \protect \quad 次 } ,
+    listfigure    = { 図目次               } ,
+    listtable     = { 表目次               } ,
+    figure        = { 図                   } ,
+    table         = { 表                   } ,
+    abstract      = { 概 \protect \quad 要 } ,
+    index         = { 索 \protect \quad 引 } ,
+    appendix      = { 付録                 } ,
+    proof         = { 证明                 } ,
+    bib           = { 参考文献             } ,
+    figure*       = { Figure               } ,
+    table*        = { Table                } ,
+    algorithm     = { アルゴリズム         } ,
+    listalgorithm = { アルゴリズム目次     } ,
+    abbr          = { 略語表               } ,
+    nom           = { 記号表               } ,
+    ack           = { 謝 \protect \quad 辞 } ,
+    resume        = { 履歴書               } ,
+    digest        = { 要 \protect \quad 約 } ,
+    achv          = { 研究業績書           }
+  }
+%</ja>
+%</scheme>
+%    \end{macrocode}
+%
+% 载入名称配置。
+%    \begin{macrocode}
+%<*class>
+%<*thesis>
+\clist_map_inline:Nn \g_@@_lang_clist
+  { \file_input:n { sjtu-name-thesis- #1 .def } }
+\clist_map_inline:nn
+  { title_page, declaration, abstract }
+  { \@@_define_name:nv {#1} { c_@@_name_ #1 _ \g_@@_lang_tl _tl } }
+%</thesis>
+%<!thesis>\file_input:n { sjtu-name-generic- \g_@@_lang_tl .def }
+%    \end{macrocode}
+%
+% \subsection{页面设置}
+%
+% 利用 \pkg{geometry} 宏包设置页面边距以及页眉高度。
+%    \begin{macrocode}
+\geometry
+  {
+    top           = 3.5 cm,
+    bottom        = 4.0 cm,
+    left          = 2.5 cm,
+    right         = 2.5 cm,
+%<thesis>    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}
+%<*thesis>
+\AtEndOfClass { \raggedbottom }
+%</thesis>
+%    \end{macrocode}
+%
+% \subsection{页眉页脚}
+%
+% \pkg{ctex} 宏包使用 \opt{heading} 选项后,会把页面格式设置为 |headings|。
+% 因此必须在 \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 ,
+%<thesis>    header-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp } ,
+%<!thesis>    header-font .initial:n = \zihao { -5 } \sffamily ,
+    footer-font  .tl_set:N = \l_@@_style_footer_font_tl ,
+%<thesis>    footer-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp }
+%<!thesis>    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:n}
+% 页脚页码格式。
+%    \begin{macrocode}
+\cs_new:Nn \@@_thepage: { \thepage }
+\keys_define:nn { sjtu / style }
+  {
+    page-number .cs_set:Np = \@@_page:n #1 ,
+    page-number .initial:n = { {#1} }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% 设置页眉内容。
+%    \begin{macrocode}
+\tl_set:Nn \l_@@_header_tl
+  {
+%<*thesis>
+    {
+      \@@_set_cjk_default_zh: \normalfont
+      \l_@@_info_subject_zh_tl
+    }
+%</thesis>
+%<*!thesis>
+    \includegraphics [ height = 1.2 cm ]
+      { sjtu-vi-logo-small-red.pdf }
+%</!thesis>
+  }
+%<thesis>\tl_set:Nn \l_@@_leftmark_tl  { \leftmark }
+%<!thesis>\tl_set:Nn \l_@@_leftmark_tl  { \l_@@_info_subject_tl }
+\tl_set:Nn \l_@@_rightmark_tl { \leftmark }
+%    \end{macrocode}
+%
+% 设置页眉页脚。
+%    \begin{macrocode}
+\bool_if:NTF \g_@@_twoside_bool
+  {
+    \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:n { \@@_thepage: } }
+%    \end{macrocode}
+%
+% \begin{macro}{\headrule}
+% \cls{sjtuthesis} 的页眉线。
+%    \begin{macrocode}
+%<*thesis>
+\cs_set:Npn \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 }
+  }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% 重定义 |plain| 样式。
+%    \begin{macrocode}
+%<*!thesis>
+\bool_if:NTF \g_@@_twoside_bool
+  {
+    \fancypagestyle { plain }
+      {
+        \fancyhead [ LE, RO ] { }
+        \tl_set:Nn \headrulewidth { 0 pt }
+      }
+  }
+  {
+    \fancypagestyle { plain }
+      {
+        \fancyhead [ R ] { }
+        \tl_set:Nn \headrulewidth { 0 pt }
+      }
+  }
+%</!thesis>
+%    \end{macrocode}
+%
+% |SJTU at null| 样式,不对当前页面样式做任何修改。
+%    \begin{macrocode}
+\cs_new_eq:NN \ps at SJTU@null \prg_do_nothing:
+%    \end{macrocode}
+%
+% \begin{macro}{\cleardoublepage}
+% 空白页清空页眉页脚。
+%    \begin{macrocode}
+\RenewDocumentCommand \cleardoublepage { }
+  {
+    \clearpage
+    \bool_if:NT \g_@@_twoside_bool
+      {
+        \int_if_odd:nF \c at page
+          { \hbox:n { } \thispagestyle { empty } \newpage }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{页码设置}
+%
+% 文档初始页码编码设置。
+%    \begin{macrocode}
+%<thesis>\pagenumbering { Alph }
+%    \end{macrocode}
+%
+% \begin{macro}{\frontmatter}
+% 前置部分使用大写罗马数字编码。
+%    \begin{macrocode}
+%<*thesis>
+\RenewDocumentCommand \frontmatter { }
+  {
+    \cleardoublepage
+    \@mainmatterfalse
+    \pagenumbering { Roman }
+  }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{章节标题结构}
+%
+% 设置章节标题样式。
+%    \begin{macrocode}
+%<*!article>
+\ctex_set:nn { chapter }
+  {
+    pagestyle   = SJTU at null ,
+    fixskip     = true ,
+%<*thesis>
+    beforeskip  = 27 bp ,
+    afterskip   = 27 bp ,
+    format      = \zihao { 3 } \setbaselineskip{ 20 bp } \bfseries
+                  \CJKsffamily \centering ,
+%</thesis>
+%<*report>
+    beforeskip  = 30 pt ,
+    afterskip   = 24 pt ,
+    format      = \Large \bfseries \CJKsffamily \centering ,
+%</report>
+    nameformat  = ,
+    titleformat = ,
+    lofskip     = \c_zero_skip ,
+    lotskip     = \c_zero_skip ,
+    aftername   = \quad
+  }
+%</!article>
+%</class>
+%<*scheme&(zh|ja)>
+\keys_set_known:nn { ctex / chapter }
+  { name = { 第 \space , \space 章 } }
+%</scheme&(zh|ja)>
+%<*class>
+\ctex_set:nn { section }
+%<*thesis>
+  {
+    beforeskip  = 24 bp ,
+    afterskip   =  6 bp ,
+    format      = \zihao { 4 } \setbaselineskip { 18 bp } \bfseries
+                  \CJKsffamily
+  }
+%</thesis>
+%<!thesis>  { format = \large \bfseries \CJKsffamily }
+\ctex_set:nn { subsection }
+%<*thesis>
+  {
+    beforeskip  = 12 bp ,
+    afterskip   =  6 bp ,
+    format      = \zihao { -4 } \setbaselineskip { 16 bp } \bfseries
+                  \CJKsffamily
+  }
+%</thesis>
+%<!thesis>  { format = \normalsize \bfseries \CJKsffamily }
+\ctex_set:nn { subsubsection }
+%<*thesis>
+  {
+    beforeskip  =  6 bp ,
+    afterskip   =  6 bp ,
+    format      = \zihao { -4 } \setbaselineskip { 16 bp } \normalfont
+  }
+%</thesis>
+%<!thesis>  { format = \normalsize \normalfont }
+\ctex_set:n { secnumdepth = 3 }
+%    \end{macrocode}
+%
+% \changes{v2.1}{2024/01/10}{新增 \opt{style/indent-first} 选项。}
+% \begin{macro}{style/indent-first}
+% 章节标题后首段是否缩进。
+%    \begin{macrocode}
+\keys_define:nn { sjtu / style }
+  {
+    indent-first    .choice: ,
+    indent-first   .choices:nn =
+      { true, false }
+      {
+        \clist_map_inline:nn
+          {
+%<article>            part,
+%<!article>            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]{\SJTU at head,\@@_head_aux_s:nn,\@@_head_aux_s:nx,
+% \@@_pdf_bookmark:nn,\@@_phantom_section:}
+% 定义一个灵活的章节标题命令专门处理不同的需求。
+%    \begin{macrocode}
+\NewDocumentCommand \SJTU at head { s O{#3} m O{#2} }
+  {
+%<!article>    \CTEX at chapter@break
+    \IfBooleanTF {#1}
+      { \tl_if_empty:nF {#4} { \@@_pdf_bookmark:nn { 0 } {#4} } }
+      {
+        \@@_phantom_section:
+%<!article>        \addcontentsline { toc } { chapter } {#4}
+%<article>        \addcontentsline { toc } { section } {#4}
+      }
+    \cs_set_eq:NN \@@_orig_ctex_gettitle:n \CTEX at gettitle
+    \cs_set:Npn \CTEX at gettitle ##1 { \@@_orig_ctex_gettitle:n {#2} }
+%<!article>    \chapter* {#3}
+%<article>    \section* {#3}
+    \cs_set_eq:NN \CTEX at gettitle \@@_orig_ctex_gettitle:n
+    \@mkboth { \MakeUppercase {#2} } { \MakeUppercase {#2} }
+  }
+%<*thesis>
+\cs_new:Npn \@@_head_aux_s:nn #1#2
+  { \SJTU at head* [#1] {#2} }
+\cs_generate_variant:Nn \@@_head_aux_s:nn { nx }
+%</thesis>
+\cs_new_eq:NN \@@_pdf_bookmark:nn \use_none:nn
+\cs_new_eq:NN \@@_phantom_section: \prg_do_nothing:
+%</class>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{段落}
+%
+% 设置全文首行缩进。
+%    \begin{macrocode}
+%<*scheme>
+\ctex_if_autoindent_touched:F
+%<zh>  { \ctex_set:n { autoindent = true } }
+%<en|de>  { \ctex_set:n { autoindent = 1.5 em } }
+%<ja>  { \ctex_set:n { autoindent = 1 } }
+%    \end{macrocode}
+%
+% \begin{macro}{\verse,\quotation}
+% 修改诗歌和引用环境的缩进。
+%    \begin{macrocode}
+%<zh|ja>\ctex_patch_cmd:Nnn \verse { -1.5em } { -2 \ccwd }
+%<zh|ja>\ctex_patch_cmd:Nnn \verse {  1.5em } {  2 \ccwd }
+\ctex_patch_cmd:Nnn \quotation { 1.5em } { \parindent }
+%</scheme>
+%    \end{macrocode}
+% \end{macro}
+%
+% 使用 \pkg{enumitem} 调整默认列表环境的间距。
+%    \begin{macrocode}
+%<*class>
+\setlist { nosep }
+%    \end{macrocode}
+%
+% \subsection{数学公式}
+%
+% \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 at style@equation at font ,
+%<thesis>    equation-font .initial:x = \exp_not:N \linespread { }
+%<thesis>                               \exp_not:N \zihao { \g_@@_zihao_tl }
+%<!thesis>    equation-font .initial:V = \c_empty_tl
+  }
+\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 at style@equation at font } }
+\clist_map_inline:nn
+  { \start at gather, \start at align, \start at multline }
+  {
+    \ctex_patch_cmd:Nnn #1
+      { \collect at body }
+      {
+        \SJTU at style@equation at font
+        \collect at body
+      }
+  }
+\ctex_patch_cmd:Nnn \gather at split
+  { \spread at equation }
+  {
+    \SJTU at style@equation at font
+    \spread at equation
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{浮动体}
+%
+% 下面这组命令使浮动对象的缺省值稍微宽松一点,从而防止幅度对象占据过多的
+% 文本页面,也可以防止在很大空白的浮动页上放置很小的图形。
+%    \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 at style@float at font ,
+%<thesis>    float-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
+%<!thesis>    float-font .initial:n = \zihao { 5 }
+  }
+\ctex_patch_cmd:Nnn \@floatboxreset
+  { \normalsize } { \SJTU at style@float at font }
+%    \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.1}{2023/11/29}{更新题注格式。}
+% \begin{macro}{style/caption-font,style/subcaption-font}
+% 题注格式。
+%    \begin{macrocode}
+\keys_define:nn { sjtu / style }
+  {
+%    \end{macrocode}
+%
+% \pkg{bicaption} 中双语标题之间的间距受 \pkg{caption} 字体定义 \opt{normalsize}
+% 的影响,这里我们直接重定义 \opt{normalsize}。
+%    \begin{macrocode}
+    caption-font       .code:n =
+      { \DeclareCaptionFont { normalsize    } {#1} } ,
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<thesis>    caption-font    .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
+%<thesis>                                 \bfseries ,
+%<!thesis>    caption-font    .initial:n = \zihao { 5 } \bfseries ,
+    subcaption-font    .code:n =
+      { \DeclareCaptionFont { SJTU at sub@font } {#1} } ,
+%<thesis>    subcaption-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
+%<thesis>                                 \normalfont
+%<!thesis>    subcaption-font .initial:n = \zihao { 5 } \normalfont
+  }
+\captionsetup
+  {
+    bi-slc   = off ,
+    labelsep = quad ,
+%<thesis>    skip     = 6 bp
+  }
+\captionsetup [ sub ]
+  {
+    bi-slc   = on ,
+    font     = SJTU at sub@font ,
+    format   = hang
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% 双语题注。
+%    \begin{macrocode}
+\DeclareCaptionOption { bi-second-names } [ ]
+  {
+    \tl_set:Nn \figurename { \SJTU at figurename@bi at second }
+    \tl_set:Nn \tablename  { \SJTU at tablename@bi at 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 at style@fl at num@sep {#1}
+        \tl_set:Nn \SJTU at style@eq at num@sep {#1}
+        \tl_set:Nn \@thmcountersep        {#1}
+      } ,
+    num-sep         .initial:n = { . } ,
+    float-num-sep    .tl_set:N = \SJTU at style@fl at num@sep ,
+    equation-num-sep .tl_set:N = \SJTU at style@eq at num@sep ,
+    theorem-num-sep  .tl_set:N = \@thmcountersep
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\SJTU at counterwithin}
+%    \begin{macrocode}
+\NewDocumentCommand \SJTU at counterwithin
+  { s O{ \SJTU at style@fl at num@sep } O{ \arabic } m m }
+  {
+    \@ifbothcounters {#4} {#5}
+      {
+        \@addtoreset {#4} {#5}
+        \IfBooleanF {#1}
+          {
+            \cs_gset:cpo { the #4 }
+              { \cs:w the #5 \cs_end: #2 #3 {#4} }
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% 定义图、表、公式的编号格式。
+%    \begin{macrocode}
+%<*!article>
+\SJTU at counterwithin { figure } { chapter }
+\SJTU at counterwithin { table  } { chapter }
+\SJTU at counterwithin [ \SJTU at style@eq at num@sep ] { equation } { chapter }
+%</!article>
+%    \end{macrocode}
+%
+% \begin{macro}[int]{\l_@@_counter_without_chapter_clist}
+% 大摘要中不需要随章编号的各计数器。
+%    \begin{macrocode}
+%<*thesis>
+\clist_set:Nn \l_@@_counter_without_chapter_clist
+  { section, figure, table, equation }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{脚注}
+%
+% \begin{macro}[int]{\@@_makefnmark_plain:,\@@_thefootnote_plain:,
+% \@@_thempfootnote_plain:}
+% 储存原始的脚注相关命令。
+%    \begin{macrocode}
+\cs_set_eq:NN \@@_makefnmark_plain: \@makefnmark
+\cs_set_eq:NN \@@_thefootnote_plain: \thefootnote
+\cs_set_eq:NN \@@_thempfootnote_plain: \thempfootnote
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_footnote_number:N}
+% 通过 Unicode 码位调用带圈数字。
+%    \begin{macrocode}
+\cs_new:Npn \@@_footnote_number:N #1
+  {
+    \int_compare:nNnTF {#1} < { 21 }
+      { \@@_unicode_char:n { \int_eval:n { "2460 - 1 + #1 } } }
+      {
+        \int_compare:nNnTF {#1} < { 36 }
+          { \@@_unicode_char:n { \int_eval:n { "3251 - 21 + #1 } } }
+          {
+            \int_compare:nNnTF {#1} < { 51 }
+              { \@@_unicode_char:n { \int_eval:n { "32B1 - 36 + #1 } } }
+              { \msg_warning:nn { sjtutex } { too-many-footnotes } }
+          }
+      }
+  }
+\msg_new:nnn { sjtutex } { too-many-footnotes }
+  { Too~ many~ footnotes. }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_makefnmark_circled:}
+% 重定义内部脚注文字命令,使用带圈数字编号时,脚注不使用上标。
+% 见 \url{https://www.zhihu.com/question/53030087}。
+%    \begin{macrocode}
+\cs_new:Nn \@@_makefnmark_circled: { \hbox:n { \@thefnmark } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{style/fnmark-font}
+% 脚注编号字体。
+%    \begin{macrocode}
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-font           .choice: ,
+    fnmark-font / haranoaji .code:n =
+      {
+        \@@_engine_case:nn
+          { \tl_set_eq:NN \l_@@_style_fnmark_font_tl \c_empty_tl }
+          {
+            \tl_set:Nn \l_@@_style_fnmark_font_tl
+              {
+                \CJKfontspec { HaranoAjiMincho }
+                  [
+                    Extension   = .otf ,
+                    UprightFont = *-Regular ,
+                    BoldFont    = *-Bold
+                  ]
+              }
+          }
+      } ,
+    fnmark-font / unknown .tl_set:N = \l_@@_style_fnmark_font_tl ,
+    fnmark-font          .initial:V = \c_empty_tl
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_thefootnote_circled:,\@@_thempfootnote_circled:}
+% 使用带圈数字编号脚注。
+%    \begin{macrocode}
+\cs_new:Nn \@@_thefootnote_circled:
+  { { \l_@@_style_fnmark_font_tl \@@_footnote_number:N \c at footnote } }
+\cs_new:Nn \@@_thempfootnote_circled:
+  { { \l_@@_style_fnmark_font_tl \@@_footnote_number:N \c at mpfootnote } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{style/fnmark-style}
+% 脚注编号样式。
+%    \begin{macrocode}
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-style           .choice: ,
+    fnmark-style / plain   .code:n =
+      {
+        \cs_set_eq:NN \@@_makefnmark: \@@_makefnmark_plain:
+        \cs_set_eq:NN \thefootnote \@@_thefootnote_plain:
+        \cs_set_eq:NN \thempfootnote \@@_thempfootnote_plain:
+      } ,
+    fnmark-style / circled .code:n =
+      {
+        \cs_set_eq:NN \@@_makefnmark: \@@_makefnmark_circled:
+        \cs_set_eq:NN \thefootnote \@@_thefootnote_circled:
+        \cs_set_eq:NN \thempfootnote \@@_thempfootnote_circled:
+      }
+  }
+%</class>
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+%<*scheme>
+\keys_set:nn { sjtu / style }
+%<zh|ja>  { fnmark-style = circled }
+%<en|de>  { fnmark-style = plain   }
+%</scheme>
+%    \end{macrocode}
+%
+% 在导言末尾修改 \tn{@makefntext},支持使用 \pkg{footmisc} 修改脚注格式。
+%    \begin{macrocode}
+%<*class>
+\ctex_at_end_preamble:n {
+  \cs_set_eq:NN \@@_orig_make_fntext:n \@makefntext
+  \cs_set:Npn \@makefntext #1
+    {
+      \group_begin:
+        \cs_set_eq:NN \@makefnmark \@@_makefnmark:
+        \@@_orig_make_fntext:n {#1}
+      \group_end:
+    }
+}
+%    \end{macrocode}
+%
+% \subsection{信息录入}
+%
+% \changes{v2.0}{2022/12/17}{添加 \opt{display-date} 键。}
+% \changes{v2.0}{2022/12/23}{使用 \opt{assoc-supervisor} 键表示副导师,
+%                            使用 \opt{co-supervisor} 键表示联合导师。}
+% \changes{v2.0}{2022/12/23}{添加 \opt{subject} 键。}
+% \changes{v2.0}{2023/03/17}{使用语言代码前缀区别不同语种的 \opt{sjtu/info} 键。}
+% \begin{macro}[int]{\@@_info_keys_define:n}
+% 定义 \cls{sjtuthesis} 不同语种 |sjtu/info| 键值类的辅助函数。
+%    \begin{macrocode}
+%<*thesis>
+\cs_new:Npn \@@_info_keys_define:n #1
+  {
+    \clist_map_inline:nn
+      {
+        title, display_title, subject, author, date,
+        supervisor, assoc_supervisor, department,
+        co_supervisor, major, degree
+      }
+      { \tl_new:c { l_@@_info_ ##1 _ #1 _tl } }
+    \clist_map_inline:nn
+      { keywords, fund }
+      { \clist_new:c { l_@@_info_ ##1 _ #1 _clist } }
+    \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 }
+      {
+        title               .code:n =
+          {
+            \tl_set:cn { l_@@_info_title_ #1 _tl } {##1}
+            \tl_if_empty:cT { l_@@_info_display_title_ #1 _tl }
+              { \tl_set:cn { l_@@_info_display_title_ #1 _tl } {##1} }
+          } ,
+        display-title     .tl_set:c = l_@@_info_display_title_ #1 _tl ,
+        subject           .tl_set:c = l_@@_info_subject_ #1 _tl ,
+        keywords       .clist_set:c = l_@@_info_keywords_ #1 _clist ,
+        author            .tl_set:c = l_@@_info_author_ #1 _tl ,
+        id                 .meta:nn = { sjtu / info } { id = {##1} } ,
+        supervisor        .tl_set:c = l_@@_info_supervisor_ #1 _tl ,
+        assoc-supervisor  .tl_set:c = l_@@_info_assoc_supervisor_ #1 _tl ,
+        co-supervisor     .tl_set:c = l_@@_info_co_supervisor_ #1 _tl ,
+        degree            .tl_set:c = l_@@_info_degree_ #1 _tl ,
+        department        .tl_set:c = l_@@_info_department_ #1 _tl ,
+        major             .tl_set:c = l_@@_info_major_ #1 _tl ,
+        fund           .clist_set:c = l_@@_info_fund_ #1 _clist ,
+        date               .meta:nn = { sjtu / info } { date = {##1} } ,
+        display-date      .tl_set:c = l_@@_info_date_ #1 _tl ,
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_info_id_zh_tl}
+% 单独处理学号。
+%    \begin{macrocode}
+\tl_new:N \l_@@_info_id_zh_tl
+\keys_define:nn { sjtu / info }
+  { id   .tl_set:N = \l_@@_info_id_zh_tl }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_info_supervisors_clist}
+% 标题中需要显示的导师列表。
+%    \begin{macrocode}
+\clist_set:Nn \l_@@_info_supervisors_clist { supervisor }
+%    \end{macrocode}
+% \end{variable}
+%
+% 盲审模式下隐藏作者、导师姓名等信息。
+%    \begin{macrocode}
+\ctex_at_end_preamble:n
+  {
+    \bool_if:NT \g_@@_review_bool
+      {
+        \clist_map_inline:Nn \g_@@_lang_clist
+          {
+            \clist_map_inline:nn
+              { author, supervisor, assoc_supervisor, co_supervisor }
+              { \tl_clear:c { l_@@_info_ ##1 _ #1 _tl } }
+            \clist_clear:c { l_@@_info_fund_ #1 _clist }
+          }
+        \tl_clear:N \l_@@_info_id_zh_tl
+      }
+  }
+%</thesis>
+%</class>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<lang&thesis&zh>\@@_info_keys_define:n { zh }
+%<lang&thesis&en>\@@_info_keys_define:n { en }
+%<lang&thesis&de>\@@_info_keys_define:n { de }
+%<lang&thesis&ja>\@@_info_keys_define:n { ja }
+%    \end{macrocode}
+%
+% \begin{variable}{\l_@@_info_subject_tl,\l_@@_info_keywords_clist}
+%    \begin{macrocode}
+%<*class&!thesis>
+\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 ,
+  }
+%</class&!thesis>
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsection{多语言支持}
+%
+% \changes{v2.0.3}{2023/04/08}{更新学位论文初始英文主题。}
+% 初始化主题。
+%    \begin{macrocode}
+%<*lang>
+%<*thesis>
+%<zh>\keys_define:nn { sjtu / info / zh }
+%<en>\keys_define:nn { sjtu / info / en }
+%<de>\keys_define:nn { sjtu / info / de }
+%<ja>\keys_define:nn { sjtu / info / ja }
+  {
+    subject          .initial:x =
+      {
+%<*zh>
+        \exp_not:V \c_@@_name_univ_zh_tl
+        \exp_not:V \c_@@_name_degree_level_zh_tl
+        \exp_not:V \c_@@_name_thesis_zh_tl
+%</zh>
+%<*en>
+        A~ Dissertation~ Submitted~ to \exp_not:N \\
+        { \exp_not:V \c_@@_name_univ_en_tl }~ for~
+        the~ Degree~ of~ { \exp_not:V \c_@@_name_degree_level_en_tl }
+%</en>
+%<*de>
+        Eine~ Dissertation~ Eingereicht~ an \exp_not:N \\
+        der~ { \exp_not:V \c_@@_name_univ_de_tl }~ für~
+        { \exp_not:V \c_@@_name_degree_level_de_tl } titel
+%</de>
+%<*ja>
+        \exp_not:V \c_@@_name_univ_ja_tl
+        \exp_not:V \c_@@_name_degree_level_ja_tl
+        \exp_not:V \c_@@_name_thesis_ja_tl
+%</ja>
+      }
+  }
+%</thesis>
+%    \end{macrocode}
+%
+% 将形如 |yyyy-mm-dd| 或 |yyyy-mm| 的 ISO 日期格式字符串转化为日期表示。
+%
+% \begin{macro}[int]{\@@_date_aux_zh:nnn,\@@_date_aux_zh:w,
+% \@@_date_aux_short_zh:nn,\@@_date_aux_short_zh:w}
+% 中文日期。
+%    \begin{macrocode}
+%<*zh>
+\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} }
+%</zh>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_ordinal_en:n}
+% 上标形式的序数词。
+%    \begin{macrocode}
+%<*en>
+\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} }
+%</en>
+%    \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}
+%<*de>
+\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} }
+%</de>
+%    \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}
+%<*ja>
+\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} }
+%</ja>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_set_language_zh:,\@@_set_language_en:,
+% \@@_set_language_de:,\@@_set_language_ja:,
+% \@@_set_cjk_default_zh:,\@@_set_cjk_default_ja:}
+% 设置语言格式辅助命令
+%    \begin{macrocode}
+%<*zh>
+\cs_new:Nn \@@_set_cjk_default_zh:
+  {
+    \tl_set:Nn \CJKrmdefault { zhsong }
+    \tl_set:Nn \CJKsfdefault { zhhei  }
+    \tl_set:Nn \CJKttdefault { zhfs   }
+  }
+\cs_new_protected:Nn \@@_set_language_zh:
+  {
+    \tl_set:Nn \languagename { chinese }
+    \ctex_set:n { autoindent = true }
+    \@@_set_cjk_default_zh:
+    \normalfont
+  }
+%</zh>
+%<*en|de>
+%<en>\cs_new_protected:Nn \@@_set_language_en:
+%<de>\cs_new_protected:Nn \@@_set_language_de:
+  {
+%<en>    \tl_set:Nn \languagename { english }
+%<de>    \tl_set:Nn \languagename { ngerman }
+    \ctex_set:n { autoindent = 1.5 em }
+    \normalfont
+  }
+%</en|de>
+%<*ja>
+\cs_new:Nn \@@_set_cjk_default_ja:
+  {
+    \tl_set:Nn \CJKrmdefault { jamin  }
+    \tl_set:Nn \CJKsfdefault { jagoth }
+    \tl_set:Nn \CJKttdefault { jagoth }
+  }
+\cs_new_protected:Nn \@@_set_language_ja:
+  {
+    \tl_set:Nn \languagename { japanese }
+    \ctex_set:n { autoindent = 1 }
+    \@@_set_cjk_default_ja:
+    \normalfont
+  }
+%</ja>
+%    \end{macrocode}
+% \end{macro}
+%
+% 标题页页面样式,页脚添加资助基金信息。
+%    \begin{macrocode}
+%<*thesis>
+%<zh>\cs_new:Npn \ps at SJTU@fund at zh
+%<en>\cs_new:Npn \ps at SJTU@fund at en
+%<de>\cs_new:Npn \ps at SJTU@fund at de
+%<ja>\cs_new:Npn \ps at SJTU@fund at ja
+  {
+    \ps at empty
+    \cs_set:Npn \@oddfoot
+      {
+        \minipage [ t ] { \textwidth }
+          \centering \zihao { - 5 }
+%<zh>          \clist_use:Nn \l_@@_info_fund_zh_clist { \par }
+%<en>          \clist_use:Nn \l_@@_info_fund_en_clist { \par }
+%<de>          \clist_use:Nn \l_@@_info_fund_de_clist { \par }
+%<ja>          \clist_use:Nn \l_@@_info_fund_ja_clist { \par }
+        \endminipage
+      }
+    \cs_set_eq:NN \@evenfoot \@oddfoot
+  }
+%</thesis>
+%</lang>
+%    \end{macrocode}
+%
+% 初始化语言名称。
+%    \begin{macrocode}
+%<*scheme>
+%<zh>\tl_set:Nn \languagename { chinese  }
+%<en>\tl_set:Nn \languagename { english  }
+%<de>\tl_set:Nn \languagename { ngerman  }
+%<ja>\tl_set:Nn \languagename { japanese }
+%</scheme>
+%    \end{macrocode}
+%
+% 载入语言配置。
+%    \begin{macrocode}
+%<*class>
+%<thesis>\clist_map_inline:Nn \g_@@_lang_clist
+%<thesis>  { \file_input:n { sjtu-lang-thesis- #1 .def } }
+%<!thesis>\file_input:n { sjtu-lang-generic- \g_@@_lang_tl .def }
+\file_input:n { sjtu-scheme- \g_@@_lang_tl .def }
+%    \end{macrocode}
+%
+% \begin{macro}{info/date}
+% 初始化日期。
+%    \begin{macrocode}
+\keys_define:nn { sjtu / info }
+  {
+    date    .code:n =
+      {
+        \regex_match:neTF { \d+-\d+-\d+ } {#1}
+          {
+%<*thesis>
+            \clist_map_inline:Nn \g_@@_lang_clist
+              {
+                \tl_set:cx { l_@@_info_date_ ##1 _tl }
+                  { \exp_last_unbraced:ce { @@_date_aux_ ##1 :w } #1 \q_stop }
+              }
+%</thesis>
+%<*!thesis>
+            \tl_set:Nx \@date
+              {
+                \exp_last_unbraced:ce
+                  { @@_date_aux_ \g_@@_lang_tl :w } #1 \q_stop
+              }
+%</!thesis>
+          }
+          {
+            \regex_match:neT { \d+-\d+ } {#1}
+              {
+%<*thesis>
+                \clist_map_inline:Nn \g_@@_lang_clist
+                  {
+                    \tl_set:cx { l_@@_info_date_ ##1 _tl }
+                      { \exp_last_unbraced:ce { @@_date_aux_short_ ##1 :w } #1 \q_stop }
+                  }
+%</thesis>
+%<*!thesis>
+                \tl_set:Nx \@date
+                  {
+                    \exp_last_unbraced:ce
+                      { @@_date_aux_short_ \g_@@_lang_tl :w } #1 \q_stop
+                  }
+%</!thesis>
+              }
+          }
+      } ,
+    date .initial:x =
+      {
+        \int_to_arabic:n { \c_sys_year_int  } -
+        \int_to_arabic:n { \c_sys_month_int } -
+        \int_to_arabic:n { \c_sys_day_int   }
+      }
+  }
+%<thesis>\tl_set:Nv \today { l_@@_info_date_ \g_@@_lang_tl _tl }
+%<!thesis>\tl_set:NV \today \@date
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{标题页}
+%
+% \subsubsection{定义内部函数}
+%
+% 汉字分散对齐的环境。
+%    \begin{macrocode}
+%<*thesis>
+\@@_engine_case:nnn
+  {
+    \NewDocumentEnvironment { SJTU at CJK@FTS } { m b }
+      {
+        \mode_leave_vertical:
+        \bool_set_false:N \l_@@_tmp_bool
+        \cs_set_eq:NN \SJTU at CJK@FTS at Symbol \CJKsymbol
+        \cs_set:Npn \CJKsymbol ##1
+          {
+            \bool_if:NTF \l_@@_tmp_bool
+              { \hfil \SJTU at CJK@FTS at Symbol { ##1 } }
+              {
+                \SJTU at CJK@FTS at Symbol { ##1 }
+                \bool_set_true:N \l_@@_tmp_bool
+              }
+          }
+        \hbox_to_wd:nn {#1} {#2}
+      } { }
+  }
+  {
+    \NewDocumentEnvironment { SJTU at CJK@FTS } { m b }
+      {
+        \mode_leave_vertical:
+        \cs_set:Npn \CJKglue
+          { \skip_horizontal:n { \c_zero_dim plus 1 filll } }
+        \hbox_to_wd:nn {#1} {#2}
+      } { }
+  }
+  {
+    \NewDocumentEnvironment { SJTU at CJK@FTS } { m b }
+      {
+        \mode_leave_vertical:
+        \ltjsetparameter { kanjiskip = { \c_zero_dim plus 1 filll } }
+        \hbox_to_wd:nn {#1} {#2}
+      } { }
+  }
+%    \end{macrocode}
+%
+% 汉字分散对齐的表格列说明符。
+%    \begin{macrocode}
+\newcolumntype { \SJTU at CT@D } [ 1 ]
+  { >{ \begin { SJTU at CJK@FTS } {#1} } c <{ \end { SJTU at CJK@FTS } } }
+%    \end{macrocode}
+%
+% \changes{v2.1}{2023/11/30}{标题页信息栏改用表格实现。}
+% \begin{macro}[int]{\@@_title_page_info_i:nnn,\@@_title_page_info_i:nxx,
+% \@@_title_page_info_ii:n}
+% 信息输出。
+%    \begin{macrocode}
+\cs_new:Npn \@@_title_page_info_i:nnn #1#2#3
+  {
+    \clist_clear:N \l_@@_tmp_clist
+    \clist_map_inline:nn {#3}
+      {
+        \clist_put_right:Nx \l_@@_tmp_clist
+          {
+            \exp_not:o { \cs:w c_@@_name_ ##1 _ #1 _tl \cs_end: }
+            &
+            \exp_not:o { \cs:w l_@@_info_ ##1 _ #1 _tl \cs_end: }
+          }
+      }
+    \group_begin:
+      \tl_set:Nn \arraystretch { 1 }
+      \tabular {#2}
+        \clist_use:Nn \l_@@_tmp_clist { \\ }
+      \endtabular
+    \group_end:
+  }
+\cs_new:Npn \@@_title_page_info_ii:n #1
+  {
+    \tl_use:c { l_@@_info_department_ #1 _tl }
+    \skip_vertical:N \c_zero_skip
+    \tl_use:c { c_@@_name_univ_ #1 _tl }
+    \skip_vertical:N \c_zero_skip
+    \tl_use:c { c_@@_name_address_ #1 _tl }
+    \skip_vertical:N \c_zero_skip
+    \tl_use:c { l_@@_info_date_ #1 _tl }
+  }
+\cs_generate_variant:Nn \@@_title_page_info_i:nnn { nxx }
+%</thesis>
+%</class>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{构建标题页}
+%
+% \changes{v2.0}{2022/12/13}{启用新版封面。}
+% \changes{v2.0.2}{2023/04/01}{标题页日期底部增加空白。}
+%    \begin{macrocode}
+%<*lang>
+%<*thesis>
+%<*zh>
+\clist_map_inline:nn
+  {
+    { logo    }
+      {
+        content     =
+          {
+            \includegraphics [ width = 3 cm ]
+              { sjtu-vi-badge-red.pdf }
+          }
+      },
+    { subject }
+      {
+        format      = \zihao { -2 } \setbaselineskip { 30 bp } ,
+        content     = \l_@@_info_subject_zh_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { title   }
+      {
+        format      = \zihao { 2 } \setbaselineskip { 36 bp } \bfseries ,
+        content     = \l_@@_info_display_title_zh_tl ,
+        bottom-skip = 30 bp plus 1 fill
+      },
+    { info    }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 30 bp } \heiti ,
+        content     =
+          {
+            \@@_title_page_info_i:nxx { zh }
+              {
+                \exp_not:N \SJTU at CT@D { 5 em }
+                @ { \exp_not:V \c_@@_name_info_sep_zh_tl }
+                >{ \exp_not:N \normalfont } l
+              }
+              {
+                author,
+                id,
+                \l_@@_info_supervisors_clist ,
+                department,
+                major,
+                \int_compare:nNnF { \g_@@_thesis_type_int } = { 1 }
+                  { degree }
+              }
+          } ,
+        bottom-skip = 30 bp
+      },
+    { date    }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 30 bp } \bfseries ,
+        content     = \l_@@_info_date_zh_tl ,
+      }
+  }
+  {
+    \@@_declare_component:nnn { title / zh } #1
+  }
+\@@_declare_page:nn { title / zh }
+  {
+    bookmark      = true ,
+    bookmark-text = \c_@@_name_title_page_tl ,
+    style         = SJTU at fund@zh ,
+    format        = \linespread { } \@@_set_language_zh: ,
+    prefix        = title / zh ,
+    components    = { logo, subject, title, info, date }
+  }
+%</zh>
+%<*en|de|ja>
+\clist_map_inline:nn
+  {
+    { subject }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 24 bp } \bfseries ,
+%<en>        content     = \l_@@_info_subject_en_tl ,
+%<de>        content     = \l_@@_info_subject_de_tl ,
+%<ja>        content     = \l_@@_info_subject_ja_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { title   }
+      {
+        format      = \zihao { -2 } \setbaselineskip { 30 bp } \bfseries ,
+%<en>        content     = \MakeUppercase \l_@@_info_display_title_en_tl ,
+%<de>        content     = \MakeUppercase \l_@@_info_display_title_de_tl ,
+%<ja>        content     = \l_@@_info_display_title_ja_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { info    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } \bfseries ,
+        content     =
+          {
+%<en>            \@@_title_page_info_i:nxx { en }
+%<de>            \@@_title_page_info_i:nxx { de }
+%<ja>            \@@_title_page_info_i:nxx { ja }
+              {
+%<en>                r @ { \exp_not:V \c_@@_name_info_sep_en_tl }
+%<de>                r @ { \exp_not:V \c_@@_name_info_sep_de_tl }
+%<ja>                r @ { \exp_not:V \c_@@_name_info_sep_ja_tl }
+                >{ \exp_not:N \normalfont } l
+              }
+              { author, \l_@@_info_supervisors_clist }
+          } ,
+        bottom-skip = 30 bp plus 1 fill
+      },
+    { date    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } ,
+        content     =
+%<en>          { \@@_title_page_info_ii:n { en } } ,
+%<de>          { \@@_title_page_info_ii:n { de } } ,
+%<ja>          { \@@_title_page_info_ii:n { ja } } ,
+      },
+  }
+  {
+%<en>    \@@_declare_component:nnn { title / en } #1
+%<de>    \@@_declare_component:nnn { title / de } #1
+%<ja>    \@@_declare_component:nnn { title / ja } #1
+  }
+%<*en>
+\@@_declare_page:nn { title / en }
+  {
+    style       = SJTU at fund@en ,
+    format      = \linespread { } \@@_set_language_en: ,
+    prefix      = title / en ,
+    components  = { subject, title, info, date }
+  }
+%</en>
+%<*de>
+\@@_declare_page:nn { title / de }
+  {
+    style       = SJTU at fund@de ,
+    format      = \linespread { } \@@_set_language_de: ,
+    prefix      = title / de ,
+    components  = { subject, title, info, date }
+  }
+%</de>
+%<*ja>
+\@@_declare_page:nn { title / ja }
+  {
+    style       = SJTU at fund@ja ,
+    format      = \linespread { } \@@_set_language_ja: ,
+    prefix      = title / ja ,
+    components  = { subject, title, info, date }
+  }
+%</ja>
+%</en|de|ja>
+%</thesis>
+%</lang>
+%    \end{macrocode}
+%
+% \begin{macro}{\maketitle}
+% 生成标题页,输出前先确定需要显示的导师列表。
+%    \begin{macrocode}
+%<*class>
+%<*thesis>
+\RenewDocumentCommand \maketitle { }
+  {
+    \clist_map_inline:nn
+      { assoc_supervisor, co_supervisor }
+      {
+        \tl_if_empty:cF { l_@@_info_ ##1 _zh_tl }
+          { \clist_put_right:Nn \l_@@_info_supervisors_clist {##1} }
+      }
+    \clist_map_inline:Nn \g_@@_lang_clist
+      { \UseInstance { sjtu } { title / ##1 } }
+  }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{原创性声明及使用授权书}
+%
+%    \begin{macrocode}
+%<*thesis>
+\cs_new_protected:Npn \@@_signature:N #1
+  {
+    \parbox [ t ] { 12 em }
+      { #1 \c_@@_signature_text_zh_tl }
+  }
+\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 } ,
+        content     = \c_@@_orig_decl_text_zh_tl ,
+        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 { 4 em } \hbox:n { }
+          } ,
+        bottom-skip = \c_zero_dim plus 2 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
+            \skip_horizontal:n { 2 em } \hbox:n { }
+          } ,
+        bottom-skip = \c_zero_dim plus 1 fill ,
+        align       = normal
+      }
+  }
+  {
+    \@@_declare_component:nnn { copyright } #1
+  }
+\@@_declare_page:nn { copyright }
+  {
+    bookmark      = true ,
+    bookmark-text = \c_@@_name_declaration_tl ,
+    format        = \linespread { } \@@_set_language_zh: ,
+    prefix        = copyright ,
+    components    =
+      {
+        orig / title, orig / text, orig / sign,
+        auth / title, auth / text, auth / sign
+      }
+  }
+\msg_new:nnn { sjtutex } { require-pdfpages }
+  {
+    Add~"\token_to_str:N \usepackage{pdfpages}"~ in~ your~ preamble \\
+    before~ inserting~ pages~ of~ external~ PDF.
+  }
+%    \end{macrocode}
+%
+% \changes{v2.0}{2022/12/20}{不再自动载入 \pkg{pdfpages} 宏包。}
+% \begin{macro}{\copyrightpage}
+%    \begin{macrocode}
+\NewDocumentCommand \copyrightpage { O{ } }
+  {
+    \bool_if:NF \g_@@_review_bool
+      {
+        \tl_if_blank:nTF {#1}
+          { \UseInstance { sjtu } { copyright } }
+          {
+            \cs_if_exist:NTF \includepdf
+              {
+                \bool_if:NTF \g_@@_openright_bool
+                  { \cleardoublepage } { \clearpage }
+                \@@_pdf_bookmark:nn { 0 } { \c_@@_name_declaration_tl }
+                \includepdf {#1}
+              }
+              {
+                \msg_warning:nn { sjtutex } { require-pdfpages }
+                \UseInstance { sjtu } { copyright }
+              }
+          }
+      }
+  }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{摘要}
+%
+% \changes{v2.1}{2023/11/30}{新增 \opt{style/keywords-format} 选项。}
+% \begin{macro}{style/keywords-format}
+% 关键词排版样式。
+%    \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} 环境添加目录条目,
+% \env{abstract*} 环境对应修改为不添加目录条目。}
+% \begin{macro}{abstract,abstract*}
+% 学位论文摘要环境。
+%    \begin{macrocode}
+%<*thesis>
+\DeclareDocumentEnvironment { abstract  } { O{ zh } +b }
+  {
+    \@@_if_lang_valid:nTF {#1}
+      {
+        \use:c { @@_set_language_ #1 : }
+        \exp_args:Nv \SJTU at head { c_@@_name_abstract_ #1 _tl }
+        #2
+        \clist_if_empty:cF { l_@@_info_keywords_ #1 _clist }
+          {
+            \par \mode_leave_vertical: \par
+            \@@_keywords_format:n
+              {
+                \tl_use:c { c_@@_name_keywords_ #1 _tl }
+                \tl_use:c { c_@@_name_info_sep_ #1 _tl }
+              }
+            \clist_use:cv { l_@@_info_keywords_ #1 _clist }
+              { c_@@_name_item_sep_ #1 _tl }
+            \par
+          }
+      }
+      { \msg_error:nnn { sjtutex } { lang-validation } {#1} }
+  } { }
+\DeclareDocumentEnvironment { abstract* } { O{ zh } +b }
+  {
+    \@@_if_lang_valid:nTF {#1}
+      {
+        \use:c { @@_set_language_ #1 : }
+        \exp_args:NNv \SJTU at head* { c_@@_name_abstract_ #1 _tl }
+        #2
+        \clist_if_empty:cF { l_@@_info_keywords_ #1 _clist }
+          {
+            \par \mode_leave_vertical: \par
+            \@@_keywords_format:n
+              {
+                \tl_use:c { c_@@_name_keywords_ #1 _tl }
+                \tl_use:c { c_@@_name_info_sep_ #1 _tl }
+              }
+            \clist_use:cv { l_@@_info_keywords_ #1 _clist }
+              { c_@@_name_item_sep_ #1 _tl }
+            \par
+          }
+      }
+      { \msg_error:nnn { sjtutex } { lang-validation } {#1} }
+  } { }
+%</thesis>
+%    \end{macrocode}
+%
+% 修复通用模板摘要段首缩进。
+%    \begin{macrocode}
+%<*!thesis>
+\bool_if:NT \g_@@_titlepage_bool
+  { \@@_appto_cmd:Nn \abstract { \par } }
+%    \end{macrocode}
+%
+% 通用模板摘要后添加关键词。
+%    \begin{macrocode}
+\@@_preto_cmd:Nn \endabstract
+  {
+    \clist_if_empty:NF \l_@@_info_keywords_clist
+      {
+        \par \mode_leave_vertical: \par
+        \@@_keywords_format:n
+          {
+            \c_@@_name_keywords_tl
+            \c_@@_name_info_sep_tl
+          }
+        \clist_use:NV \l_@@_info_keywords_clist \c_@@_name_item_sep_tl
+        \par
+      }
+  }
+%</!thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{目录}
+%
+% \changes{v2.1}{2023/11/29}{\tn{tableofcontents} 添加目录条目,
+% \tn{tableofcontents*} 对应修改为不添加目录条目。}
+% \begin{macro}{\tableofcontents,\tableofcontents*}
+% 目录。
+%    \begin{macrocode}
+\DeclareDocumentCommand \tableofcontents { s }
+  {
+    \IfBooleanTF {#1}
+      { \SJTU at head* { \contentsname } }
+      { \SJTU at head  { \contentsname } }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \@starttoc { toc }
+    \group_end:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\SJTU at listof}
+% \begin{macro}{\listoffigures,\listoffigures*,\listoftables,\listoftables*}
+% 图表索引。
+%    \begin{macrocode}
+\NewDocumentCommand \SJTU at listof { m m s }
+  {
+    \IfBooleanTF {#3}
+      { \SJTU at head* {#1} }
+      { \SJTU at head  {#1} }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \exp_args:Nv \@starttoc { ext@ #2 }
+    \group_end:
+  }
+\DeclareDocumentCommand \listoffigures { }
+  { \SJTU at listof { \listfigurename } { figure } }
+\DeclareDocumentCommand \listoftables  { }
+  { \SJTU at listof { \listtablename  } { table  } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+\tl_set:Nn \cftdotsep { 0.5 }
+%<!article>\tl_set:Nn \cftchapleader { \bfseries \cftdotfill { \cftdotsep } }
+%<*thesis>
+\clist_map_inline:nn
+  {
+    { cft before chap skip } { 10 bp plus 1 pt } ,
+    { cft chap   numwidth  } { 3.5 em } ,
+    { cft sec    indent    } { 2   em } ,
+    { cft sec    numwidth  } { 1.5 em } ,
+    { cft subsec indent    } { 4   em } ,
+    { cft subsec numwidth  } { 2.3 em }
+  }
+  { \skip_set:cn #1 }
+%</thesis>
+%    \end{macrocode}
+%
+% \changes{v2.0.1}{2023/03/31}{插图、表格和算法等索引不缩进。}
+% \changes{v2.0.1}{2023/03/31}{调整插图、表格和算法等索引编号宽度。}
+% \begin{macro}[int]{\@@_update_cft_presnum:nn}
+% \begin{variable}{\l_@@_cft_presnum_clist}
+% 图表清单标题前添加名称。
+%    \begin{macrocode}
+\clist_set:Nn \l_@@_cft_presnum_clist
+  {
+    { fig } { \figurename } ,
+    { tab } { \tablename  }
+  }
+\cs_new:Npn \@@_update_cft_presnum:nn #1#2
+  {
+    \tl_set:cn { cft #1 presnum } { #2 \c_space_tl }
+    \skip_zero:c { cft #1 indent }
+%<article>    \skip_set:cn { cft #1 numwidth } { 1.8 em }
+%<!article>    \skip_set:cn { cft #1 numwidth } { 2.8 em }
+    \@@_skip_add_to_wd:cv { cft #1 numwidth } { cft #1 presnum }
+  }
+\ctex_at_end_preamble:n
+  {
+    \clist_map_inline:Nn \l_@@_cft_presnum_clist
+      { \@@_update_cft_presnum:nn #1 }
+  }
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
+% \subsection{预定义环境}
+%
+% \begin{macro}{abbreviation,abbreviation*}
+% 缩略语对照表。
+%    \begin{macrocode}
+%<*thesis>
+\NewDocumentEnvironment { abbreviation  } { O{ \SJTU at abbrname } }
+  {
+    \chapter    {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+\NewDocumentEnvironment { abbreviation* } { O{ \SJTU at abbrname } }
+  {
+    \SJTU at head* {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{nomenclature,nomenclature*}
+% 符号对照表。
+%    \begin{macrocode}
+\NewDocumentEnvironment { nomenclature  } { O{ \SJTU at nomname } }
+  {
+    \chapter    {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+\NewDocumentEnvironment { nomenclature* } { O{ \SJTU at nomname } }
+  {
+    \SJTU at head* {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+%    \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0}{2023/03/17}{移除 \env{summary} 环境。}
+%
+% \begin{macro}{acknowledgements}
+% 致谢,盲审模式下隐藏致谢。
+%    \begin{macrocode}
+\NewDocumentEnvironment { acknowledgements } { O{ \SJTU at ackname } +b }
+  {
+    \bool_if:NF \g_@@_review_bool
+      {
+        \SJTU at head {#1}
+        #2
+      }
+  } { }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{achievements,bibliolist,bibliolist*}
+% 发表论文与学术成果。
+%    \begin{macrocode}
+\newcounter { SJTU at bib }
+\NewDocumentEnvironment { @bibliolist } { m }
+  {
+    \cs_if_exist_use:N \bibfont
+    \list
+      {
+        \tl_if_blank:nTF {#1}
+          { \hfill }
+          { \@biblabel { \arabic{ SJTU at bib } } }
+      }
+      {
+        \tl_if_blank:nTF {#1}
+          {
+            \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 {#1} }
+            \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 at bib }
+        \cs_set:Npn \p at SJTU@bib  { }
+        \cs_set:Npn \theSJTU at bib { \arabic { SJTU at bib } }
+      }
+      \sloppy
+      \int_set:Nn \clubpenalty  { 4000 }
+      \int_set_eq:NN \@clubpenalty \clubpenalty
+      \int_set:Nn \widowpenalty { 4000 }
+      \char_set_sfcode:nn { `\. } { 1000 }
+  }
+  {
+    \cs_set:Npn \@noitemerr
+      { \msg_warning:nnn { sjtutex } { empty-environment } { bibliolist } }
+    \endlist
+  }
+\msg_new:nnn { sjtutex } { empty-environment }
+  { Empty~ `#1'~ environment. }
+\bool_new:N \l_@@_achievements_bool
+\NewDocumentEnvironment { achievements } { O{ \SJTU at achvname } }
+  {
+    \SJTU at head {#1}
+    \setcounter { SJTU at bib } { 0 }
+    \bool_set_true:N \l_@@_achievements_bool
+  } { }
+\NewDocumentEnvironment { bibliolist  } { m +b }
+  {
+    \bool_if:NF \l_@@_achievements_bool
+      {
+        \msg_error:nnnn { sjtutex } { environment-validation }
+          { bibliolist  } { achievements }
+      }
+    \bool_if:NF \g_@@_review_bool
+      {
+        \cs_set:Npn \@noitemerr { }
+        \begin { @bibliolist } {#1}
+        #2
+        \end { @bibliolist }
+      }
+  } { }
+\NewDocumentEnvironment { bibliolist* } { m +b }
+  {
+    \bool_if:NF \l_@@_achievements_bool
+      {
+        \msg_error:nnnn { sjtutex } { environment-validation }
+          { bibliolist* } { achievements }
+      }
+    \bool_if:NT \g_@@_review_bool
+      {
+        \cs_set:Npn \@noitemerr { }
+        \begin { @bibliolist } {#1}
+        #2
+        \end { @bibliolist }
+      }
+  } { }
+\msg_new:nnn { sjtutex } { environment-validation }
+  { `#1'~ is~ only~ valid~ in~ `#2'~ environment. }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{resume}
+% 简历。
+%    \begin{macrocode}
+\NewDocumentEnvironment { resume } { O{ \SJTU at resumename } +b }
+  {
+    \bool_if:NF \g_@@_review_bool
+      {
+        \SJTU at head {#1}
+        #2
+      }
+  } { }
+%    \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0}{2023/03/17}{\env{digest} 环境新增指定语言的可选参数。}
+% \begin{macro}{digest}
+% 大摘要。
+%    \begin{macrocode}
+\NewDocumentEnvironment { digest } { O{ en } +b }
+  {
+    \@@_if_lang_valid:nTF {#1}
+      {
+        \AtEndDocument
+          {
+            \use:c { @@_set_language_ #1 : }
+            \bool_if:NTF \g_@@_openright_bool
+              { \cleardoublepage } { \clearpage }
+            \pagenumbering { roman }
+            \cs_gset:Nn \@@_thepage: { \arabic { page } }
+            \cs_gset_eq:NN \addcontentsline \use_none:nnn
+            \clist_map_inline:Nn \l_@@_counter_without_chapter_clist
+              {
+                \counterwithout {##1} { chapter }
+                \setcounter     {##1} { 0 }
+              }
+            \@@_head_aux_s:nx { \SJTU at digestname }
+              {
+                \exp_not:N \MakeUppercase
+                  { \exp_not:v { l_@@_info_title_ #1 _tl } }
+              }
+            #2
+          }
+      }
+      { \msg_error:nnn { sjtutex } { lang-validation } {#1} }
+  } { }
+%</thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{设置接口}
+%
+% \begin{macro}{\sjtusetup}
+% 用户设置接口。
+%    \begin{macrocode}
+\NewDocumentCommand \sjtusetup { } { \keys_set:nn { sjtu } }
+%    \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}
+%<*thesis>
+\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} }
+  }
+%</thesis>
+%    \end{macrocode}
+%
+% \begin{macro}{\subject,\keywords}
+% 通用模板新接口。
+%    \begin{macrocode}
+%<*!thesis>
+\NewDocumentCommand \subject  { m }
+  { \keys_set:nn { sjtu / info } { subject  = {#1} } }
+\NewDocumentCommand \keywords { m }
+  { \keys_set:nn { sjtu / info } { keywords = {#1} } }
+%</!thesis>
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{其他宏包的设置}
+%
+% \changes{v2.0.3}{2023/09/23}{移除 \pkg{listings} 宏包预设。}
+% 这些宏包并非格式要求,但是为了方便同学们使用,在这里进行简单设置。
+%
+% \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_gset_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_gset_eq:NN \@@_phantom_section: \phantomsection
+    \pdfstringdefDisableCommands
+      {
+        \cs_set_eq:NN \\       \prg_do_nothing:
+        \cs_set_eq:NN \quad    \c_empty_tl
+        \cs_set_eq:NN \qquad   \c_empty_tl
+        \cs_set_eq:NN \hspace  \use_none:n
+      }
+    \ctex_after_end_preamble:n
+      {
+        \hypersetup
+          {
+%<*thesis>
+            pdftitle    = \l_@@_info_title_zh_tl ,
+            pdfauthor   = \l_@@_info_author_zh_tl ,
+            pdfsubject  = \l_@@_info_subject_zh_tl ,
+            pdfkeywords = \l_@@_info_keywords_zh_clist
+%</thesis>
+%<*!thesis>
+            pdftitle    = \@title ,
+            pdfauthor   = \@author ,
+            pdfsubject  = \l_@@_info_subject_tl ,
+            pdfkeywords = \l_@@_info_keywords_clist
+%</!thesis>
+          }
+      }
+  }
+%    \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 at style@float at font } }
+%    \end{macrocode}
+%
+% \subsubsection{\pkg{amsthm} 宏包和 \pkg{ntheorem} 宏包}
+%
+%    \begin{macrocode}
+\cs_new_protected:Nn \@@_new_theorems:
+  {
+    \clist_map_inline:nn
+      {
+        assumption, axiom, conjecture, corollary, definition, example,
+        exercise, lemma, problem, proposition, theorem
+      }
+%<!article>      { \exp_args:Nnv  \newtheorem  {##1} { c_@@_name_ ##1 _tl } [ chapter ] }
+%<article>      { \exp_args:Nnv  \newtheorem  {##1} { c_@@_name_ ##1 _tl } }
+    \clist_map_inline:nn
+      { remark, solution }
+      { \exp_args:NNnv \newtheorem* {##1} { c_@@_name_ ##1 _tl } }
+  }
+%    \end{macrocode}
+%
+% \pkg{amsthm} 宏包。
+%    \begin{macrocode}
+\ctex_at_begin_package:nn { amsthm }
+  {
+    \cs_if_exist:NT \openbox
+      {
+        \cs_new_eq:NN \@@_save_openbox: \openbox
+        \cs_undefine:N \openbox
+      }
+  }
+\ctex_at_end_package:nn { amsthm }
+  {
+    \@@_cs_provide_eq:NN \QED \openbox
+    \cs_if_exist:NT \@@_save_openbox:
+      { \cs_set_eq:NN \openbox \@@_save_openbox: }
+    \tl_set:Nn \qedsymbol { \ensuremath { \QED } }
+    \RenewDocumentEnvironment { proof } { O{ \proofname } }
+      {
+        \par \pushQED { \qed }
+        \normalfont \dim_zero:N \topsep
+        \trivlist
+        \item
+          [
+            \skip_horizontal:N \labelsep
+            \bfseries \CJKsffamily #1 \@addpunct { \enskip }
+          ]
+        \ignorespaces
+      }
+      { \popQED \endtrivlist \@endpefalse }
+    \newtheoremstyle { sjtu }
+      { } { } { \normalfont } { } { \bfseries \CJKsffamily } { } { \ccwd } { }
+    \theoremstyle { sjtu }
+    \@@_new_theorems:
+  }
+%    \end{macrocode}
+%
+% \pkg{ntheorem} 宏包。
+%    \begin{macrocode}
+\ctex_at_end_package:nn { ntheorem }
+  {
+    \@@_cs_provide_eq:NN \QED \c_empty_tl
+    \theoremheaderfont { \bfseries \CJKsffamily }
+    \theorembodyfont   { \normalfont }
+    \theoremseparator  { \enskip     }
+    \theoremsymbol { \ensuremath { \QED } }
+    \qedsymbol     { \ensuremath { \QED } }
+    \newtheorem* { proof } { \proofname }
+    \theoremsymbol { }
+    \@@_new_theorems:
+  }
+%    \end{macrocode}
+%
+% \subsubsection{\pkg{algorithm} 宏包和 \pkg{algorithm2e} 宏包}
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_newlistof:nnnnn #1#2#3#4#5
+  {
+    \exp_args:Nnv \newlistentry {#2} { ext@ #3 } { 0 }
+    \exp_args:Ne \newcounter { \tl_use:c { ext@ #3 } depth }
+    \exp_args:Ne \setcounter { \tl_use:c { ext@ #3 } depth } { 1 }
+    \clist_put_right:Nn \l_@@_cft_presnum_clist { {#2} {#4} }
+    \cs_set_eq:cc { l@ #3 } { l@ #2 }
+    \exp_args:Nc \DeclareDocumentCommand { listof #1 s } { }
+      { \SJTU at listof {#5} {#3} }
+%<!article>    \SJTU at counterwithin { #3 } { chapter }
+%<thesis>    \clist_put_right:Nn \l_@@_counter_without_chapter_clist {#3}
+  }
+%    \end{macrocode}
+%
+% \pkg{algorithm} 宏包。
+%    \begin{macrocode}
+\ctex_at_end_package:nn { algorithm }
+  {
+    \tl_set:Nn \fname at algorithm   { \SJTU at algorithmname     }
+    \tl_set:Nn \listalgorithmname { \SJTU at listalgorithmname }
+    \@@_newlistof:nnnnn { algorithm } { alg } { algorithm }
+      { \fname at algorithm } { \listalgorithmname }
+  }
+%    \end{macrocode}
+%
+% \pkg{algorithm2e} 宏包。
+%    \begin{macrocode}
+%<!article>\ctex_at_begin_package:nn { algorithm2e }
+%<!article>  { \cs_set_eq:NN \@@_save_chapter:w \@chapter }
+\ctex_at_end_package:nn { algorithm2e }
+  {
+%<!article>    \cs_set_eq:NN \@chapter \@@_save_chapter:w
+    \SetAlgorithmName { \SJTU at algorithmname     }
+                      { \SJTU at algorithmname     }
+                      { \SJTU at listalgorithmname }
+    \SetAlgoCaptionSeparator { \enskip }
+    \@@_newlistof:nnnnn { algorithm } { alg } { algocf }
+      { \algorithmcfname } { \listalgorithmcfname }
+    \ctex_patch_cmd:Nnn \algocf at latexcaption
+      { \addcontentsline }
+      { \caption at iflist { \addcontentsline } { \@gobblethree } }
+  }
+%    \end{macrocode}
+%
+% \subsubsection{\pkg{nomencl} 宏包}
+%    \begin{macrocode}
+\ctex_at_end_package:nn { nomencl }
+  { \tl_set:Nn \nomname { \SJTU at nomname } }
+%    \end{macrocode}
+%
+% \changes{v2.0.3}{2023/09/25}{添加 \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
+              }
+          }
+      }
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%</class>
+%    \end{macrocode}
+%
+% \subsection{名称配置}
+%    \begin{macrocode}
+%<*name>
+%<*zh|ja>
+\clist_map_inline:nn
+  {
+    { year  } { 年 } ,
+    { month } { 月 } ,
+    { day   } { 日 }
+  }
+%<zh>  { \@@_define_name:nnn { zh } #1 }
+%<ja>  { \@@_define_name:nnn { ja } #1 }
+%</zh|ja>
+%<*en>
+\clist_const:Nn \c_@@_name_month_en_clist
+  {
+    January, February, March, April, May, June,
+    July, August, September, October, November, December
+  }
+%</en>
+%<*de>
+\clist_const:Nn \c_@@_name_month_de_clist
+  {
+    Januar, Februar, März, April, Mai, Juni,
+    Juli, August, September, Oktober, November, Dezember
+  }
+%</de>
+%<*thesis>
+%<*zh>
+\@@_define_symbol:nn { white_square } { "25A1 }
+\@@_define_name_from_clist:nnnn { zh }
+  { degree_level } { \g_@@_thesis_type_int }
+  { 学士, 硕士, 博士 }
+%</zh>
+%<*en>
+\@@_define_name_from_clist:nnnn { en }
+  { degree_level } { \g_@@_thesis_type_int }
+  { Bachelor, Master, Doctor }
+%</en>
+%<*de>
+\@@_define_name_from_clist:nnnn { de }
+  { degree_level } { \g_@@_thesis_type_int }
+  { Bachelor, Master, Doktor }
+%</de>
+%<*ja>
+\@@_define_name_from_clist:nnnn { ja }
+  { degree_level } { \g_@@_thesis_type_int }
+  { 学士, 修士, 博士 }
+%</ja>
+%</thesis>
+%<*zh>
+\clist_map_inline:nn
+  {
+%<*thesis>
+    { univ             } { 上海交通大学           } ,
+    { author           } { 姓名                   } ,
+    { id               } { 学号                   } ,
+    { supervisor       } { 导师                   } ,
+    { assoc_supervisor } { 副导师                 } ,
+    { department       } { 院系                   } ,
+    { co_supervisor    } { 联合导师               } ,
+    { major            } { 学科 / 专业            } ,
+    { degree           } { 申请学位               } ,
+    { thesis           } { 学位论文               } ,
+    { title_page       } { 题名页                 } ,
+    { declaration      } { 原创性声明及使用授权书 } ,
+    { orig_decl        } { 原创性声明             } ,
+    { auth_decl        } { 使用授权书             } ,
+    { decl_author      } { 学位论文作者           } ,
+    { decl_supervisor  } { 指导教师               } ,
+    { abstract         } { 摘 \protect \quad 要   } ,
+%</thesis>
+    { keywords         } { 关键词                 } ,
+    { info_sep         } { : \null               } ,
+    { item_sep         } { ,                     }
+  }
+%<thesis>  { \@@_define_name:nnn { zh } #1 }
+%<!thesis>  { \@@_define_name:nn #1 }
+%</zh>
+%<*en>
+\clist_map_inline:nn
+  {
+%<*thesis>
+    { univ             } { Shanghai~ Jiao~ Tong~ University } ,
+    { address          } { Shanghai,~ P.R.~ China           } ,
+    { author           } { Author                           } ,
+    { supervisor       } { Supervisor                       } ,
+    { assoc_supervisor } { Assoc.~ Supervisor               } ,
+    { co_supervisor    } { Co-supervisor                    } ,
+    { title_page       } { Title~ Page                      } ,
+    { declaration      } { Statutory~ Declaration           } ,
+    { abstract         } { Abstract                         } ,
+%</thesis>
+    { keywords         } { Key~words                        } ,
+    { info_sep         } { :~                               } ,
+    { item_sep         } { ,~                               }
+  }
+%<thesis>  { \@@_define_name:nnn { en } #1 }
+%<!thesis>  { \@@_define_name:nn #1 }
+%</en>
+%<*de>
+\clist_map_inline:nn
+  {
+%<*thesis>
+    { univ             } { Shanghai~ Jiao~ Tong~ Universität } ,
+    { address          } { Shanghai,~ VR~ China              } ,
+    { author           } { Autor/in                          } ,
+    { supervisor       } { Betreuer/in                       } ,
+    { assoc_supervisor } { Zweitbetreuer/in                  } ,
+    { co_supervisor    } { Co-Betreuer/in                    } ,
+    { title_page       } { Titelblatt                        } ,
+    { declaration      } { Eidesstattliche~ Erklärung        } ,
+    { abstract         } { Abstrakt                          } ,
+%</thesis>
+    { keywords         } { Schlüsselwörter                   } ,
+    { info_sep         } { :~                                } ,
+    { item_sep         } { ,~                                }
+  }
+%<thesis>  { \@@_define_name:nnn { de } #1 }
+%<!thesis>  { \@@_define_name:nn #1 }
+%</de>
+%<*ja>
+\clist_map_inline:nn
+  {
+%<*thesis>
+    { univ             } { 上海交通大学         } ,
+    { address          } { 中国・上海           } ,
+    { author           } { 氏名                 } ,
+    { supervisor       } { 指導教員             } ,
+    { assoc_supervisor } { 副指導教員           } ,
+    { co_supervisor    } { 共同指導             } ,
+    { thesis           } { 学位請求論文         } ,
+    { title_page       } { 標題紙               } ,
+    { declaration      } { 誓約書・公表許諾書   } ,
+    { abstract         } { 要 \protect \quad 旨 } ,
+%</thesis>
+    { keywords         } { キーワード           } ,
+    { info_sep         } { : \null             } ,
+    { item_sep         } { \quad                }
+  }
+%<thesis>  { \@@_define_name:nnn { ja } #1 }
+%<!thesis>  { \@@_define_name:nn #1 }
+%</ja>
+%<*thesis>
+%<*zh>
+\tl_const:Nn \c_@@_orig_decl_text_zh_tl
+  {
+    本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独立进行研究工
+    作所取得的成果。除文中已经注明引用的内容外,本论文不包含任何其他个人
+    或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集
+    体,均已在文中以明确方式标明。本人完全知晓本声明的法律后果由本人承
+    担。
+  }
+\tl_const:Nn \c_@@_auth_decl_text_zh_tl
+  {
+    本人同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许
+    论文被查阅和借阅。 \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 } ”)
+  }
+\tl_const:Nn \c_@@_signature_text_zh_tl
+  {
+    签名: \\
+    日期: \hspace { \stretch { 3 } } 年
+           \hspace { \stretch { 2 } } 月
+           \hspace { \stretch { 2 } } 日
+  }
+%</zh>
+%</thesis>
+%</name>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*scheme>
+\clist_map_inline:nn
+  {
+%<*zh>
+    { assumption  } { 假设        } ,
+    { axiom       } { 公理        } ,
+    { conjecture  } { 猜想        } ,
+    { corollary   } { 推论        } ,
+    { definition  } { 定义        } ,
+    { example     } { 例          } ,
+    { exercise    } { 练习        } ,
+    { lemma       } { 引理        } ,
+    { problem     } { 问题        } ,
+    { proposition } { 命题        } ,
+    { remark      } { 注          } ,
+    { solution    } { 解          } ,
+    { theorem     } { 定理        }
+%</zh>
+%<*en>
+    { 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     }
+%</en>
+%<*de>
+    { 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     }
+%</de>
+%<*ja>
+    { assumption  } { 仮定        } ,
+    { axiom       } { 公理        } ,
+    { conjecture  } { 予想        } ,
+    { corollary   } { 系          } ,
+    { definition  } { 定義        } ,
+    { example     } { 例          } ,
+    { exercise    } { 練習        } ,
+    { lemma       } { 補題        } ,
+    { problem     } { 問題        } ,
+    { proposition } { 命題        } ,
+    { remark      } { 注意        } ,
+    { solution    } { 解法        } ,
+    { theorem     } { 定理        }
+%</ja>
+  }
+  { \@@_define_name:nn #1 }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%</scheme>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \Finale
+%
+\endinput


Property changes on: trunk/Master/texmf-dist/source/latex/sjtutex/sjtutex.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,65 @@
+%%
+%% This is file `sjtu-cjk-font-adobe-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,adobe,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Adobe CJK fonts definition for Japanese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-adobe-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { cjk } { adobe } }
+  {
+    \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
+      ]
+    \setCJKfamilyfont { zhsong } { AdobeSongStd-Light       }
+      [ AutoFakeBold = 3 , ItalicFont = AdobeKaitiStd-Regular ]
+    \setCJKfamilyfont { zhhei  } { AdobeHeitiStd-Regular    } [ AutoFakeBold = 3 ]
+    \setCJKfamilyfont { zhfs   } { AdobeFangsongStd-Regular }
+    \setCJKfamilyfont { zhkai  } { AdobeKaitiStd-Regular    }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
+\NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-adobe-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,53 @@
+%%
+%% This is file `sjtu-cjk-font-adobe-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,adobe,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Adobe CJK fonts definition for Chinese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-adobe-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nnn
+  { \__sjtu_fontset_error:nn { cjk } { adobe } }
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { adobe }
+    \ctex_punct_set:n { adobe }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+  {
+    \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    }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-adobe-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,32 @@
+%%
+%% This is file `sjtu-cjk-font-adobe.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,adobe,und')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Adobe CJK fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-adobe.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_if_eq:NNTF \g__sjtu_lang_tl \c__sjtu_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-adobe-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-adobe-zh.def } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-adobe.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-adobe.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,91 @@
+%%
+%% This is file `sjtu-cjk-font-fandol-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,fandol,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Fandol CJK fonts definition for Japanese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-fandol-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { cjk } { fandol } }
+  {
+    \setCJKmainfont { HaranoAjiMincho }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Regular ,
+        BoldFont    = *-Bold
+      ]
+    \setCJKsansfont { HaranoAjiGothic }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Medium ,
+        BoldFont    = *-Bold
+      ]
+    \setCJKmonofont { HaranoAjiGothic }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Regular
+      ]
+    \setCJKfamilyfont { jamin  } { HaranoAjiMincho }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Regular ,
+        BoldFont    = *-Bold
+      ]
+    \setCJKfamilyfont { jagoth } { HaranoAjiGothic }
+      [
+        Extension   = .otf ,
+        UprightFont = *-Medium ,
+        BoldFont    = *-Bold
+      ]
+    \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
+      ]
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
+\NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-fandol-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,85 @@
+%%
+%% This is file `sjtu-cjk-font-fandol-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,fandol,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Fandol CJK fonts definition for Chinese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-fandol-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nnn
+  { \__sjtu_fontset_error:nn { cjk } { fandol } }
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { fandol }
+    \ctex_punct_set:n { fandol }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+  {
+    \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
+      ]
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-fandol-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,32 @@
+%%
+%% This is file `sjtu-cjk-font-fandol.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,fandol,und')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Fandol CJK fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-fandol.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_if_eq:NNTF \g__sjtu_lang_tl \c__sjtu_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-fandol-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-fandol-zh.def } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-fandol.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-fandol.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,49 @@
+%%
+%% This is file `sjtu-cjk-font-founder-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,founder,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Founder CJK fonts definition for Japanese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-founder-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { cjk } { founder } }
+  {
+    \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 ]
+    \setCJKfamilyfont { zhsong } { FZShuSong-Z01  }
+      [ AutoFakeBold = 3 , ItalicFont = FZKai-Z03 ]
+    \setCJKfamilyfont { zhhei  } { FZHei-B01      } [ AutoFakeBold = 3 ]
+    \setCJKfamilyfont { zhkai  } { FZKai-Z03      }
+    \setCJKfamilyfont { zhfs   } { FZFangSong-Z02 }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
+\NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-founder-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,52 @@
+%%
+%% This is file `sjtu-cjk-font-founder-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,founder,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Founder CJK fonts definition for Chinese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-founder-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { founder }
+    \ctex_punct_set:n { founder }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+  {
+    \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 }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-founder-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,32 @@
+%%
+%% This is file `sjtu-cjk-font-founder.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,founder,und')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Founder CJK fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-founder.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_if_eq:NNTF \g__sjtu_lang_tl \c__sjtu_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-founder-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-founder-zh.def } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-founder.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-founder.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,78 @@
+%%
+%% This is file `sjtu-cjk-font-mac-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,mac,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {macOS CJK fonts definition for Japanese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-mac-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { cjk } { mac } }
+  {
+    \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
+      ]
+    \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
+      ]
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
+\NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-mac-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,76 @@
+%%
+%% This is file `sjtu-cjk-font-mac-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,mac,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {macOS CJK fonts definition for Chinese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-mac-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nnn
+  { \__sjtu_fontset_error:nn { cjk } { mac } }
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { mac }
+    \ctex_punct_set:n { mac }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_family:nn   { \CJKsfdefault } { zhpf   }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhpf   }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+  {
+    \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
+      ]
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-mac-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,32 @@
+%%
+%% This is file `sjtu-cjk-font-mac.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,mac,und')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {macOS CJK fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-mac.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_if_eq:NNTF \g__sjtu_lang_tl \c__sjtu_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-mac-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-mac-zh.def } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-mac.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-mac.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,76 @@
+%%
+%% This is file `sjtu-cjk-font-ubuntu-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,ubuntu,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Ubuntu CJK fonts definition for Japanese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-ubuntu-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { cjk } { ubuntu } }
+  {
+    \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
+      ]
+    \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 { zhfs   } { Noto~Sans~Mono~CJK~JP }
+    \setCJKfamilyfont { zhkai  } { AR~PL~KaitiM~GB       }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
+\NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-ubuntu-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,72 @@
+%%
+%% This is file `sjtu-cjk-font-ubuntu-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,ubuntu,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Ubuntu CJK fonts definition for Chinese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-ubuntu-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nnn
+  { \__sjtu_fontset_error:nn { cjk } { ubuntu } }
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhsong } { ubuntu }
+    \ctex_punct_set:n { ubuntu }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+  {
+    \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 { zhfs   } { Noto~Sans~Mono~CJK~JP }
+    \setCJKfamilyfont { zhkai  } { AR~PL~KaitiM~GB       }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-ubuntu-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,32 @@
+%%
+%% This is file `sjtu-cjk-font-ubuntu.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,ubuntu,und')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Ubuntu CJK fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-ubuntu.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_if_eq:NNTF \g__sjtu_lang_tl \c__sjtu_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-ubuntu-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-ubuntu-zh.def } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-ubuntu.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-ubuntu.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,49 @@
+%%
+%% This is file `sjtu-cjk-font-windows-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,windows,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Windows CJK fonts definition for Japanese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-windows-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { cjk } { windows } }
+  {
+    \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 ]
+    \setCJKfamilyfont { zhsong } { SimSun   }
+      [ AutoFakeBold = 3 , ItalicFont = KaiTi ]
+    \setCJKfamilyfont { zhhei  } { SimHei   } [ AutoFakeBold = 3 ]
+    \setCJKfamilyfont { zhkai  } { KaiTi    }
+    \setCJKfamilyfont { zhfs   } { FangSong }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\NewDocumentCommand \mincho   { } { \CJKfamily { jamin   } }
+\NewDocumentCommand \gothic   { } { \CJKfamily { jagoth  } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-windows-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,52 @@
+%%
+%% This is file `sjtu-cjk-font-windows-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,windows,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Windows CJK fonts definition for Chinese (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-windows-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \ctex_load_zhmap:nnnn { zhsong } { zhhei } { zhfs } { windows }
+    \ctex_punct_set:n { windows }
+    \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
+    \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
+    \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
+  }
+  {
+    \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 }
+  }
+\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
+\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
+\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
+\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-windows-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,32 @@
+%%
+%% This is file `sjtu-cjk-font-windows.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,cjk,windows,und')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Windows CJK fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-cjk-font-windows.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_if_eq:NNTF \g__sjtu_lang_tl \c__sjtu_lang_ja_tl
+  { \ctex_file_input:n { sjtu-cjk-font-windows-ja.def } }
+  { \ctex_file_input:n { sjtu-cjk-font-windows-zh.def } }
+\endinput
+%%
+%% End of file `sjtu-cjk-font-windows.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-cjk-font-windows.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-cambria.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-cambria.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-cambria.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,38 @@
+%%
+%% This is file `sjtu-math-font-cambria.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,cambria')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Cambria math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-cambria.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { math } { cambria } }
+  {
+    \RequirePackage { unicode-math }
+    \setmathfont { Cambria~Math }
+    \setmathrm { Cambria }
+    \setmathsf { Calibri }
+    \setmathtt { Consolas } [ Scale = 0.95 ]
+  }
+\endinput
+%%
+%% End of file `sjtu-math-font-cambria.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-cambria.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-libertinus.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-libertinus.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-libertinus.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,72 @@
+%%
+%% This is file `sjtu-math-font-libertinus.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,libertinus')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Libertinus math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-libertinus.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \exp_args:No \PassOptionsToPackage
+      { \g__sjtu_math_font_options_clist } { libertinust1math }
+    \RequirePackage { libertinust1math }
+  }
+  {
+    \RequirePackage { unicode-math }
+    \bool_if:NTF \g__sjtu_upright_integral_bool
+      { \setmathfont { LibertinusMath-Regular.otf } }
+      {
+        \setmathfont { LibertinusMath-Regular.otf }
+          [ StylisticSet = 8 ]
+      }
+    \setmathfont { latinmodern-math.otf } [ range = \checkmark ]
+    \setmathrm
+      { LibertinusSerif }
+      [
+        Extension           = .otf,
+        UprightFont         = *-Regular,
+        BoldFont            = *-Bold,
+        ItalicFont          = *-Italic,
+        BoldItalicFont      = *-BoldItalic,
+        SlantedFont         = *-Regular,
+        BoldSlantedFont     = *-Bold,
+        SlantedFeatures     = { FakeSlant = 0.2 },
+        BoldSlantedFeatures = { FakeSlant = 0.2 }
+      ]
+    \setmathsf
+      { 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 }
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-math-font-libertinus.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-libertinus.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-lm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-lm.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-lm.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,50 @@
+%%
+%% This is file `sjtu-math-font-lm.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,lm')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Latin Modern math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-lm.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\RequirePackage { amssymb, upgreek }
+\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  }
+\bool_if:NT \g__sjtu_upright_integral_bool
+  { \RequirePackage { cmupint } }
+\__sjtu_set_slanted_greek:
+\__sjtu_set_unimath_symbol:
+\endinput
+%%
+%% End of file `sjtu-math-font-lm.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-lm.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newcm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newcm.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newcm.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,99 @@
+%%
+%% This is file `sjtu-math-font-newcm.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,newcm')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {New Computer Modern math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-newcm.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { math } { newcm } }
+  {
+    \RequirePackage { unicode-math }
+    \bool_if:NTF \g__sjtu_upright_integral_bool
+      {
+        \setmathfont { NewCMMath-Book.otf }
+          [ StylisticSet = 2 ]
+      }
+      { \setmathfont { NewCMMath-Book.otf } }
+    \setmathfont { NewCMMath-Book.otf }
+      [
+        range        = { scr, bfscr },
+        StylisticSet = 1
+      ]
+    \setmathrm
+      { 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,
+        BoldSlantedFont     = *-Bold,
+        SlantedFeatures     = { FakeSlant = 0.25 },
+        BoldSlantedFeatures = { FakeSlant = 0.25 }
+      ]
+    \setmathsf
+      { NewCMSans10 }
+      [
+        Extension    = .otf,
+        SizeFeatures =
+          {
+            {
+              Size       = -9,
+              Font       = NewCMSans08-Book,
+              ItalicFont = NewCMSans08-BookOblique,
+            },
+            { Size       = 9- }
+          },
+        UprightFont    = *-Book,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-BookOblique,
+        BoldItalicFont = *-BoldOblique
+      ]
+    \setmathtt
+      { NewCMMono10 }
+      [
+        Extension           = .otf,
+        UprightFont         = *-Book,
+        BoldFont            = *-Bold,
+        ItalicFont          = *-BookItalic,
+        BoldItalicFont      = *-BoldOblique,
+        SlantedFont         = *-Book,
+        SlantedFeatures     = { FakeSlant = 0.25 },
+        BoldSlantedFont     = *-Bold,
+        BoldSlantedFeatures = { FakeSlant = 0.25 }
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-math-font-newcm.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newcm.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newpx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newpx.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newpx.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,44 @@
+%%
+%% This is file `sjtu-math-font-newpx.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,newpx')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {New PX math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-newpx.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_set_eq:NN \l__sjtu_save_encodingdefault_tl \encodingdefault
+\tl_set_eq:NN \l__sjtu_save_rmdefault_tl \rmdefault
+\tl_set_eq:NN \l__sjtu_save_sfdefault_tl \sfdefault
+\tl_set_eq:NN \l__sjtu_save_ttdefault_tl \ttdefault
+\tl_set:Nn \encodingdefault { OT1 }
+\tl_set:Nn \rmdefault { zplTLF }
+\tl_set:Nn \qhv at scale { 0.94 }
+\tl_set:Nn \sfdefault { qhv }
+\tl_set:Nn \ttdefault { qcr }
+\RequirePackage { newpxmath }
+\tl_set_eq:NN \encodingdefault \l__sjtu_save_encodingdefault_tl
+\tl_set_eq:NN \rmdefault \l__sjtu_save_rmdefault_tl
+\tl_set_eq:NN \sfdefault \l__sjtu_save_sfdefault_tl
+\tl_set_eq:NN \ttdefault \l__sjtu_save_ttdefault_tl
+\__sjtu_set_unimath_symbol:
+\endinput
+%%
+%% End of file `sjtu-math-font-newpx.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newpx.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newtx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newtx.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newtx.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,44 @@
+%%
+%% This is file `sjtu-math-font-newtx.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,newtx')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {New TX math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-newtx.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\tl_set_eq:NN \l__sjtu_save_encodingdefault_tl \encodingdefault
+\tl_set_eq:NN \l__sjtu_save_rmdefault_tl \rmdefault
+\tl_set_eq:NN \l__sjtu_save_sfdefault_tl \sfdefault
+\tl_set_eq:NN \l__sjtu_save_ttdefault_tl \ttdefault
+\tl_set:Nn \encodingdefault { OT1 }
+\tl_set:Nn \rmdefault { ntxtlf }
+\tl_set:Nn \qhv at scale { 0.94 }
+\tl_set:Nn \sfdefault { qhv }
+\tl_set:Nn \ttdefault { qcr }
+\RequirePackage { newtxmath }
+\tl_set_eq:NN \encodingdefault \l__sjtu_save_encodingdefault_tl
+\tl_set_eq:NN \rmdefault \l__sjtu_save_rmdefault_tl
+\tl_set_eq:NN \sfdefault \l__sjtu_save_sfdefault_tl
+\tl_set_eq:NN \ttdefault \l__sjtu_save_ttdefault_tl
+\__sjtu_set_unimath_symbol:
+\endinput
+%%
+%% End of file `sjtu-math-font-newtx.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-newtx.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-stixtwo.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-stixtwo.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-stixtwo.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,112 @@
+%%
+%% This is file `sjtu-math-font-stixtwo.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,stixtwo')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {STIX Two math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-stixtwo.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \DeclareSizeFunction { sub } { \sub at sfcnt \@font at 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 }
+      }
+      { \__sjtu_declare_math_symbol:nnNn { \stix at lcgc } { operators } #1 }
+    \__sjtu_set_slanted_greek:
+  }
+  {
+    \RequirePackage { unicode-math }
+    \bool_if:NTF \g__sjtu_upright_integral_bool
+      {
+        \setmathfont { STIXTwoMath-Regular.otf }
+          [ StylisticSet = 8 ]
+      }
+      { \setmathfont { STIXTwoMath-Regular.otf } }
+    \setmathfont { STIXTwoMath-Regular.otf }
+      [
+        range        = { scr, bfscr },
+        StylisticSet = 1
+      ]
+    \setmathrm
+      { STIXTwoText }
+      [
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      ]
+    \setmathsf
+      { texgyreheros }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Scale          = 0.94,
+      ]
+    \setmathtt
+      { texgyrecursor }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-math-font-stixtwo.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-stixtwo.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-times.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-times.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-times.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,44 @@
+%%
+%% This is file `sjtu-math-font-times.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,times')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Times math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-times.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\PassOptionsToPackage { Symbol } { upgreek }
+\RequirePackage { amssymb, upgreek }
+\tl_set_eq:NN \l__sjtu_save_rmdefault_tl \rmdefault
+  \RequirePackage { mathptmx }
+\tl_set_eq:NN \rmdefault \l__sjtu_save_rmdefault_tl
+\tl_set:Nn \Hv at 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 at ptm } { OML } { ptmcm } { m } { it }
+\__sjtu_declare_math_symbol:nnNn { \mathord } { SJTU at ptm } \upvarsigma { "26 }
+\bool_if:NT \g__sjtu_upright_integral_bool
+  { \RequirePackage { cmupint } }
+\__sjtu_set_unimath_symbol:
+\endinput
+%%
+%% End of file `sjtu-math-font-times.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-times.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-xits.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-xits.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-xits.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,84 @@
+%%
+%% This is file `sjtu-math-font-xits.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,math,xits')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {XITS math fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-math-font-xits.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { math } { xits } }
+  {
+    \RequirePackage { unicode-math }
+    \bool_if:NTF \g__sjtu_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
+      ]
+    \setmathrm
+      { XITS }
+      [
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      ]
+    \setmathsf
+      { texgyreheros }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Scale          = 0.94,
+      ]
+    \setmathtt
+      { texgyrecursor }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-math-font-xits.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-math-font-xits.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-cambria.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-cambria.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-cambria.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,36 @@
+%%
+%% This is file `sjtu-text-font-cambria.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,cambria')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Cambria text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-cambria.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { text } { cambria } }
+  {
+    \setmainfont { Cambria }
+    \setsansfont { Calibri }
+    \setmonofont { Consolas } [ Scale = 0.95 ]
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-cambria.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-cambria.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-libertinus.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-libertinus.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-libertinus.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,65 @@
+%%
+%% This is file `sjtu-text-font-libertinus.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,libertinus')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Libertinus text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-libertinus.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \tl_set:Nn \rmdefault { LibertinusSerif-TLF }
+    \tl_set:Nn \sfdefault { LibertinusSans-TLF  }
+    \tl_set:Nn \ttdefault { lmtt                }
+  }
+  {
+    \setmainfont
+      { LibertinusSerif }
+      [
+        Extension           = .otf,
+        UprightFont         = *-Regular,
+        BoldFont            = *-Bold,
+        ItalicFont          = *-Italic,
+        BoldItalicFont      = *-BoldItalic,
+        SlantedFont         = *-Regular,
+        BoldSlantedFont     = *-Bold,
+        SlantedFeatures     = { FakeSlant = 0.2 },
+        BoldSlantedFeatures = { FakeSlant = 0.2 }
+      ]
+    \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 }
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-libertinus.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-libertinus.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-lm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-lm.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-lm.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,36 @@
+%%
+%% This is file `sjtu-text-font-lm.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,lm')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Latin Modern text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-lm.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \tl_set:Nn \rmdefault { lmr  }
+    \tl_set:Nn \sfdefault { lmss }
+    \tl_set:Nn \ttdefault { lmtt }
+  } { }
+\endinput
+%%
+%% End of file `sjtu-text-font-lm.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-lm.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newcm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newcm.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newcm.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,87 @@
+%%
+%% This is file `sjtu-text-font-newcm.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,newcm')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {New Computer Modern text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-newcm.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { text } { newcm } }
+  {
+    \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,
+        BoldSlantedFont     = *-Bold,
+        SlantedFeatures     = { FakeSlant = 0.25 },
+        BoldSlantedFeatures = { FakeSlant = 0.25 }
+      ]
+    \setsansfont
+      { NewCMSans10 }
+      [
+        Extension    = .otf,
+        SizeFeatures =
+          {
+            {
+              Size       = -9,
+              Font       = NewCMSans08-Book,
+              ItalicFont = NewCMSans08-BookOblique,
+            },
+            { Size       = 9- }
+          },
+        UprightFont    = *-Book,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-BookOblique,
+        BoldItalicFont = *-BoldOblique
+      ]
+    \setmonofont
+      { NewCMMono10 }
+      [
+        Extension           = .otf,
+        UprightFont         = *-Book,
+        BoldFont            = *-Bold,
+        ItalicFont          = *-BookItalic,
+        BoldItalicFont      = *-BoldOblique,
+        SlantedFont         = *-Book,
+        SlantedFeatures     = { FakeSlant = 0.25 },
+        BoldSlantedFont     = *-Bold,
+        BoldSlantedFeatures = { FakeSlant = 0.25 }
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-newcm.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newcm.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newpx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newpx.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newpx.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,66 @@
+%%
+%% This is file `sjtu-text-font-newpx.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,newpx')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {New PX text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-newpx.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \RequirePackage { newpxtext }
+    \tl_set:Nn \ttdefault { qcr }
+  }
+  {
+    \setmainfont
+      { TeXGyrePagellaX }
+      [
+        Extension       = .otf,
+        UprightFont     = *-Regular,
+        BoldFont        = *-Bold,
+        ItalicFont      = *-Italic,
+        BoldItalicFont  = *-BoldItalic
+      ]
+    \setsansfont
+      { texgyreheros }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Scale          = 0.94,
+      ]
+    \setmonofont
+      { texgyrecursor }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-newpx.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newpx.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newtx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newtx.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newtx.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,66 @@
+%%
+%% This is file `sjtu-text-font-newtx.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,newtx')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {New TX text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-newtx.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \RequirePackage { newtxtext }
+    \tl_set:Nn \ttdefault { qcr }
+  }
+  {
+    \setmainfont
+      { TeXGyreTermesX }
+      [
+        Extension       = .otf,
+        UprightFont     = *-Regular,
+        BoldFont        = *-Bold,
+        ItalicFont      = *-Italic,
+        BoldItalicFont  = *-BoldItalic
+      ]
+    \setsansfont
+      { texgyreheros }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Scale          = 0.94,
+      ]
+    \setmonofont
+      { texgyrecursor }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-newtx.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-newtx.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-stixtwo.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-stixtwo.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-stixtwo.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,71 @@
+%%
+%% This is file `sjtu-text-font-stixtwo.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,stixtwo')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {STIX Two text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-stixtwo.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \DeclareEncodingSubset { TS1 } { ? } { 0 }
+    \UndeclareTextCommand { \textpertenthousand } { T1 }
+    \DeclareTextSymbolDefault { \textpertenthousand } { TS1 }
+    \tl_set:Nn \rmdefault { stix2 }
+    \tl_set:Nn \qhv at scale { 0.94 }
+    \tl_set:Nn \sfdefault { qhv }
+    \tl_set:Nn \ttdefault { qcr }
+  }
+  {
+    \setmainfont
+      { STIXTwoText }
+      [
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      ]
+    \setsansfont
+      { texgyreheros }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Scale          = 0.94,
+      ]
+    \setmonofont
+      { texgyrecursor }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-stixtwo.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-stixtwo.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-times.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-times.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-times.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,42 @@
+%%
+%% This is file `sjtu-text-font-times.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,times')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Times text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-times.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  {
+    \tl_set:Nn \encodingdefault { T1 }
+    \tl_set:Nn \rmdefault { ptm }
+    \tl_set:Nn \Hv at scale { 0.94 }
+    \tl_set:Nn \sfdefault { phv }
+    \tl_set:Nn \ttdefault { pcr }
+  }
+  {
+    \setmainfont { Times~New~Roman } [ Ligatures = Rare ]
+    \setsansfont { Arial } [ Scale = 0.94 ]
+    \setmonofont { Courier~New }
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-times.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-times.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-xits.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-xits.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-xits.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,62 @@
+%%
+%% This is file `sjtu-text-font-xits.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `font,text,xits')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {XITS text fonts definition (SJTUTeX)}
+\ProvidesExplFile{sjtu-text-font-xits.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_fontset_case:nn
+  { \__sjtu_fontset_error:nn { text } { xits } }
+  {
+    \setmainfont
+      { XITS }
+      [
+        Extension      = .otf,
+        UprightFont    = *-Regular,
+        BoldFont       = *-Bold,
+        ItalicFont     = *-Italic,
+        BoldItalicFont = *-BoldItalic
+      ]
+    \setsansfont
+      { texgyreheros }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Scale          = 0.94,
+      ]
+    \setmonofont
+      { texgyrecursor }
+      [
+        Extension      = .otf,
+        UprightFont    = *-regular,
+        BoldFont       = *-bold,
+        ItalicFont     = *-italic,
+        BoldItalicFont = *-bolditalic,
+        Ligatures      = CommonOff
+      ]
+  }
+\endinput
+%%
+%% End of file `sjtu-text-font-xits.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/font/sjtu-text-font-xits.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-de.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-de.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-de.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,49 @@
+%%
+%% This is file `sjtu-lang-generic-de.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,generic,de')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {German specific definition for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-generic-de.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\cs_new:Npn \__sjtu_date_aux_de:nnn #1#2#3
+  {
+    \clist_item:Nn \c__sjtu_name_month_de_clist {#2} ~
+    {#3} ,~ \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_de:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_de:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_de:nn #1#2
+  {
+    \clist_item:Nn \c__sjtu_name_month_de_clist {#2} ,~
+    \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_short_de:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_de:nn {#1} {#2} }
+\cs_new_protected:Nn \__sjtu_set_language_de:
+  {
+    \tl_set:Nn \languagename { ngerman }
+    \ctex_set:n { autoindent = 1.5 em }
+    \normalfont
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-generic-de.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-de.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-en.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-en.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-en.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,72 @@
+%%
+%% This is file `sjtu-lang-generic-en.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,generic,en')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {English specific definition for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-generic-en.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\cs_new:Npn \__sjtu_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 }
+          }
+      }
+  }
+\cs_new:Npn \__sjtu_date_aux_en:nnn #1#2#3
+  {
+    \clist_item:Nn \c__sjtu_name_month_en_clist {#2} ~
+    \__sjtu_ordinal_en:n {#3} ,~
+    \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_en:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_en:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_en:nn #1#2
+  {
+    \clist_item:Nn \c__sjtu_name_month_en_clist {#2} ,~
+    \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_short_en:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_en:nn {#1} {#2} }
+\cs_new_protected:Nn \__sjtu_set_language_en:
+  {
+    \tl_set:Nn \languagename { english }
+    \ctex_set:n { autoindent = 1.5 em }
+    \normalfont
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-generic-en.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-en.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,57 @@
+%%
+%% This is file `sjtu-lang-generic-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,generic,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Japanese specific definition for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-generic-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\cs_new:Npn \__sjtu_date_aux_ja:nnn #1#2#3
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_ja_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_ja_tl } ~
+    \int_to_arabic:n {#3} ~ { \exp_not:V \c__sjtu_name_day_ja_tl   }
+  }
+\cs_new:Npn \__sjtu_date_aux_ja:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_ja:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_ja:nn #1#2
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_ja_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_ja_tl }
+  }
+\cs_new:Npn \__sjtu_date_aux_short_ja:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_ja:nn {#1} {#2} }
+\cs_new:Nn \__sjtu_set_cjk_default_ja:
+  {
+    \tl_set:Nn \CJKrmdefault { jamin  }
+    \tl_set:Nn \CJKsfdefault { jagoth }
+    \tl_set:Nn \CJKttdefault { jagoth }
+  }
+\cs_new_protected:Nn \__sjtu_set_language_ja:
+  {
+    \tl_set:Nn \languagename { japanese }
+    \ctex_set:n { autoindent = 1 }
+    \__sjtu_set_cjk_default_ja:
+    \normalfont
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-generic-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,57 @@
+%%
+%% This is file `sjtu-lang-generic-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,generic,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Chinese specific definition for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-generic-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\cs_new:Npn \__sjtu_date_aux_zh:nnn #1#2#3
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_zh_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_zh_tl } ~
+    \int_to_arabic:n {#3} ~ { \exp_not:V \c__sjtu_name_day_zh_tl   }
+  }
+\cs_new:Npn \__sjtu_date_aux_zh:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_zh:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_zh:nn #1#2
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_zh_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_zh_tl }
+  }
+\cs_new:Npn \__sjtu_date_aux_short_zh:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_zh:nn {#1} {#2} }
+\cs_new:Nn \__sjtu_set_cjk_default_zh:
+  {
+    \tl_set:Nn \CJKrmdefault { zhsong }
+    \tl_set:Nn \CJKsfdefault { zhhei  }
+    \tl_set:Nn \CJKttdefault { zhfs   }
+  }
+\cs_new_protected:Nn \__sjtu_set_language_zh:
+  {
+    \tl_set:Nn \languagename { chinese }
+    \ctex_set:n { autoindent = true }
+    \__sjtu_set_cjk_default_zh:
+    \normalfont
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-generic-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-generic-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-de.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-de.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-de.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,116 @@
+%%
+%% This is file `sjtu-lang-thesis-de.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,thesis,de')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {German specific definition for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-thesis-de.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_info_keys_define:n { de }
+\keys_define:nn { sjtu / info / de }
+  {
+    subject          .initial:x =
+      {
+        Eine~ Dissertation~ Eingereicht~ an \exp_not:N \\
+        der~ { \exp_not:V \c__sjtu_name_univ_de_tl }~ für~
+        { \exp_not:V \c__sjtu_name_degree_level_de_tl } titel
+      }
+  }
+\cs_new:Npn \__sjtu_date_aux_de:nnn #1#2#3
+  {
+    \clist_item:Nn \c__sjtu_name_month_de_clist {#2} ~
+    {#3} ,~ \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_de:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_de:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_de:nn #1#2
+  {
+    \clist_item:Nn \c__sjtu_name_month_de_clist {#2} ,~
+    \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_short_de:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_de:nn {#1} {#2} }
+\cs_new_protected:Nn \__sjtu_set_language_de:
+  {
+    \tl_set:Nn \languagename { ngerman }
+    \ctex_set:n { autoindent = 1.5 em }
+    \normalfont
+  }
+\cs_new:Npn \ps at SJTU@fund at de
+  {
+    \ps at empty
+    \cs_set:Npn \@oddfoot
+      {
+        \minipage [ t ] { \textwidth }
+          \centering \zihao { - 5 }
+          \clist_use:Nn \l__sjtu_info_fund_de_clist { \par }
+        \endminipage
+      }
+    \cs_set_eq:NN \@evenfoot \@oddfoot
+  }
+\clist_map_inline:nn
+  {
+    { subject }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 24 bp } \bfseries ,
+        content     = \l__sjtu_info_subject_de_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { title   }
+      {
+        format      = \zihao { -2 } \setbaselineskip { 30 bp } \bfseries ,
+        content     = \MakeUppercase \l__sjtu_info_display_title_de_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { info    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } \bfseries ,
+        content     =
+          {
+            \__sjtu_title_page_info_i:nxx { de }
+              {
+                r @ { \exp_not:V \c__sjtu_name_info_sep_de_tl }
+                >{ \exp_not:N \normalfont } l
+              }
+              { author, \l__sjtu_info_supervisors_clist }
+          } ,
+        bottom-skip = 30 bp plus 1 fill
+      },
+    { date    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } ,
+        content     =
+          { \__sjtu_title_page_info_ii:n { de } } ,
+      },
+  }
+  {
+    \__sjtu_declare_component:nnn { title / de } #1
+  }
+\__sjtu_declare_page:nn { title / de }
+  {
+    style       = SJTU at fund@de ,
+    format      = \linespread { } \__sjtu_set_language_de: ,
+    prefix      = title / de ,
+    components  = { subject, title, info, date }
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-thesis-de.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-de.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-en.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-en.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-en.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,139 @@
+%%
+%% This is file `sjtu-lang-thesis-en.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,thesis,en')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {English specific definition for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-thesis-en.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_info_keys_define:n { en }
+\keys_define:nn { sjtu / info / en }
+  {
+    subject          .initial:x =
+      {
+        A~ Dissertation~ Submitted~ to \exp_not:N \\
+        { \exp_not:V \c__sjtu_name_univ_en_tl }~ for~
+        the~ Degree~ of~ { \exp_not:V \c__sjtu_name_degree_level_en_tl }
+      }
+  }
+\cs_new:Npn \__sjtu_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 }
+          }
+      }
+  }
+\cs_new:Npn \__sjtu_date_aux_en:nnn #1#2#3
+  {
+    \clist_item:Nn \c__sjtu_name_month_en_clist {#2} ~
+    \__sjtu_ordinal_en:n {#3} ,~
+    \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_en:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_en:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_en:nn #1#2
+  {
+    \clist_item:Nn \c__sjtu_name_month_en_clist {#2} ,~
+    \int_to_arabic:n {#1}
+  }
+\cs_new:Npn \__sjtu_date_aux_short_en:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_en:nn {#1} {#2} }
+\cs_new_protected:Nn \__sjtu_set_language_en:
+  {
+    \tl_set:Nn \languagename { english }
+    \ctex_set:n { autoindent = 1.5 em }
+    \normalfont
+  }
+\cs_new:Npn \ps at SJTU@fund at en
+  {
+    \ps at empty
+    \cs_set:Npn \@oddfoot
+      {
+        \minipage [ t ] { \textwidth }
+          \centering \zihao { - 5 }
+          \clist_use:Nn \l__sjtu_info_fund_en_clist { \par }
+        \endminipage
+      }
+    \cs_set_eq:NN \@evenfoot \@oddfoot
+  }
+\clist_map_inline:nn
+  {
+    { subject }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 24 bp } \bfseries ,
+        content     = \l__sjtu_info_subject_en_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { title   }
+      {
+        format      = \zihao { -2 } \setbaselineskip { 30 bp } \bfseries ,
+        content     = \MakeUppercase \l__sjtu_info_display_title_en_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { info    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } \bfseries ,
+        content     =
+          {
+            \__sjtu_title_page_info_i:nxx { en }
+              {
+                r @ { \exp_not:V \c__sjtu_name_info_sep_en_tl }
+                >{ \exp_not:N \normalfont } l
+              }
+              { author, \l__sjtu_info_supervisors_clist }
+          } ,
+        bottom-skip = 30 bp plus 1 fill
+      },
+    { date    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } ,
+        content     =
+          { \__sjtu_title_page_info_ii:n { en } } ,
+      },
+  }
+  {
+    \__sjtu_declare_component:nnn { title / en } #1
+  }
+\__sjtu_declare_page:nn { title / en }
+  {
+    style       = SJTU at fund@en ,
+    format      = \linespread { } \__sjtu_set_language_en: ,
+    prefix      = title / en ,
+    components  = { subject, title, info, date }
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-thesis-en.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-en.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,124 @@
+%%
+%% This is file `sjtu-lang-thesis-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,thesis,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Japanese specific definition for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-thesis-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_info_keys_define:n { ja }
+\keys_define:nn { sjtu / info / ja }
+  {
+    subject          .initial:x =
+      {
+        \exp_not:V \c__sjtu_name_univ_ja_tl
+        \exp_not:V \c__sjtu_name_degree_level_ja_tl
+        \exp_not:V \c__sjtu_name_thesis_ja_tl
+      }
+  }
+\cs_new:Npn \__sjtu_date_aux_ja:nnn #1#2#3
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_ja_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_ja_tl } ~
+    \int_to_arabic:n {#3} ~ { \exp_not:V \c__sjtu_name_day_ja_tl   }
+  }
+\cs_new:Npn \__sjtu_date_aux_ja:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_ja:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_ja:nn #1#2
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_ja_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_ja_tl }
+  }
+\cs_new:Npn \__sjtu_date_aux_short_ja:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_ja:nn {#1} {#2} }
+\cs_new:Nn \__sjtu_set_cjk_default_ja:
+  {
+    \tl_set:Nn \CJKrmdefault { jamin  }
+    \tl_set:Nn \CJKsfdefault { jagoth }
+    \tl_set:Nn \CJKttdefault { jagoth }
+  }
+\cs_new_protected:Nn \__sjtu_set_language_ja:
+  {
+    \tl_set:Nn \languagename { japanese }
+    \ctex_set:n { autoindent = 1 }
+    \__sjtu_set_cjk_default_ja:
+    \normalfont
+  }
+\cs_new:Npn \ps at SJTU@fund at ja
+  {
+    \ps at empty
+    \cs_set:Npn \@oddfoot
+      {
+        \minipage [ t ] { \textwidth }
+          \centering \zihao { - 5 }
+          \clist_use:Nn \l__sjtu_info_fund_ja_clist { \par }
+        \endminipage
+      }
+    \cs_set_eq:NN \@evenfoot \@oddfoot
+  }
+\clist_map_inline:nn
+  {
+    { subject }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 24 bp } \bfseries ,
+        content     = \l__sjtu_info_subject_ja_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { title   }
+      {
+        format      = \zihao { -2 } \setbaselineskip { 30 bp } \bfseries ,
+        content     = \l__sjtu_info_display_title_ja_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { info    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } \bfseries ,
+        content     =
+          {
+            \__sjtu_title_page_info_i:nxx { ja }
+              {
+                r @ { \exp_not:V \c__sjtu_name_info_sep_ja_tl }
+                >{ \exp_not:N \normalfont } l
+              }
+              { author, \l__sjtu_info_supervisors_clist }
+          } ,
+        bottom-skip = 30 bp plus 1 fill
+      },
+    { date    }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp } ,
+        content     =
+          { \__sjtu_title_page_info_ii:n { ja } } ,
+      },
+  }
+  {
+    \__sjtu_declare_component:nnn { title / ja } #1
+  }
+\__sjtu_declare_page:nn { title / ja }
+  {
+    style       = SJTU at fund@ja ,
+    format      = \linespread { } \__sjtu_set_language_ja: ,
+    prefix      = title / ja ,
+    components  = { subject, title, info, date }
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-thesis-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,142 @@
+%%
+%% This is file `sjtu-lang-thesis-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `lang,thesis,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Chinese specific definition for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-lang-thesis-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\__sjtu_info_keys_define:n { zh }
+\keys_define:nn { sjtu / info / zh }
+  {
+    subject          .initial:x =
+      {
+        \exp_not:V \c__sjtu_name_univ_zh_tl
+        \exp_not:V \c__sjtu_name_degree_level_zh_tl
+        \exp_not:V \c__sjtu_name_thesis_zh_tl
+      }
+  }
+\cs_new:Npn \__sjtu_date_aux_zh:nnn #1#2#3
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_zh_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_zh_tl } ~
+    \int_to_arabic:n {#3} ~ { \exp_not:V \c__sjtu_name_day_zh_tl   }
+  }
+\cs_new:Npn \__sjtu_date_aux_zh:w #1-#2-#3 \q_stop
+  { \__sjtu_date_aux_zh:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__sjtu_date_aux_short_zh:nn #1#2
+  {
+    \int_to_arabic:n {#1} ~ { \exp_not:V \c__sjtu_name_year_zh_tl  } ~
+    \int_to_arabic:n {#2} ~ { \exp_not:V \c__sjtu_name_month_zh_tl }
+  }
+\cs_new:Npn \__sjtu_date_aux_short_zh:w #1-#2 \q_stop
+  { \__sjtu_date_aux_short_zh:nn {#1} {#2} }
+\cs_new:Nn \__sjtu_set_cjk_default_zh:
+  {
+    \tl_set:Nn \CJKrmdefault { zhsong }
+    \tl_set:Nn \CJKsfdefault { zhhei  }
+    \tl_set:Nn \CJKttdefault { zhfs   }
+  }
+\cs_new_protected:Nn \__sjtu_set_language_zh:
+  {
+    \tl_set:Nn \languagename { chinese }
+    \ctex_set:n { autoindent = true }
+    \__sjtu_set_cjk_default_zh:
+    \normalfont
+  }
+\cs_new:Npn \ps at SJTU@fund at zh
+  {
+    \ps at empty
+    \cs_set:Npn \@oddfoot
+      {
+        \minipage [ t ] { \textwidth }
+          \centering \zihao { - 5 }
+          \clist_use:Nn \l__sjtu_info_fund_zh_clist { \par }
+        \endminipage
+      }
+    \cs_set_eq:NN \@evenfoot \@oddfoot
+  }
+\clist_map_inline:nn
+  {
+    { logo    }
+      {
+        content     =
+          {
+            \includegraphics [ width = 3 cm ]
+              { sjtu-vi-badge-red.pdf }
+          }
+      },
+    { subject }
+      {
+        format      = \zihao { -2 } \setbaselineskip { 30 bp } ,
+        content     = \l__sjtu_info_subject_zh_tl ,
+        bottom-skip = \c_zero_dim plus 1 fill
+      },
+    { title   }
+      {
+        format      = \zihao { 2 } \setbaselineskip { 36 bp } \bfseries ,
+        content     = \l__sjtu_info_display_title_zh_tl ,
+        bottom-skip = 30 bp plus 1 fill
+      },
+    { info    }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 30 bp } \heiti ,
+        content     =
+          {
+            \__sjtu_title_page_info_i:nxx { zh }
+              {
+                \exp_not:N \SJTU at CT@D { 5 em }
+                @ { \exp_not:V \c__sjtu_name_info_sep_zh_tl }
+                >{ \exp_not:N \normalfont } l
+              }
+              {
+                author,
+                id,
+                \l__sjtu_info_supervisors_clist ,
+                department,
+                major,
+                \int_compare:nNnF { \g__sjtu_thesis_type_int } = { 1 }
+                  { degree }
+              }
+          } ,
+        bottom-skip = 30 bp
+      },
+    { date    }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 30 bp } \bfseries ,
+        content     = \l__sjtu_info_date_zh_tl ,
+      }
+  }
+  {
+    \__sjtu_declare_component:nnn { title / zh } #1
+  }
+\__sjtu_declare_page:nn { title / zh }
+  {
+    bookmark      = true ,
+    bookmark-text = \c__sjtu_name_title_page_tl ,
+    style         = SJTU at fund@zh ,
+    format        = \linespread { } \__sjtu_set_language_zh: ,
+    prefix        = title / zh ,
+    components    = { logo, subject, title, info, date }
+  }
+\endinput
+%%
+%% End of file `sjtu-lang-thesis-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/lang/sjtu-lang-thesis-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-de.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-de.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-de.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,41 @@
+%%
+%% This is file `sjtu-name-generic-de.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,generic,de')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {German name config for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-generic-de.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_const:Nn \c__sjtu_name_month_de_clist
+  {
+    Januar, Februar, März, April, Mai, Juni,
+    Juli, August, September, Oktober, November, Dezember
+  }
+\clist_map_inline:nn
+  {
+    { keywords         } { Schlüsselwörter                   } ,
+    { info_sep         } { :~                                } ,
+    { item_sep         } { ,~                                }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-name-generic-de.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-de.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-en.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-en.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-en.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,41 @@
+%%
+%% This is file `sjtu-name-generic-en.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,generic,en')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {English name config for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-generic-en.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_const:Nn \c__sjtu_name_month_en_clist
+  {
+    January, February, March, April, May, June,
+    July, August, September, October, November, December
+  }
+\clist_map_inline:nn
+  {
+    { keywords         } { Key~words                        } ,
+    { info_sep         } { :~                               } ,
+    { item_sep         } { ,~                               }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-name-generic-en.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-en.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,43 @@
+%%
+%% This is file `sjtu-name-generic-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,generic,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Japanese name config for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-generic-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_map_inline:nn
+  {
+    { year  } { 年 } ,
+    { month } { 月 } ,
+    { day   } { 日 }
+  }
+  { \__sjtu_define_name:nnn { ja } #1 }
+\clist_map_inline:nn
+  {
+    { keywords         } { キーワード           } ,
+    { info_sep         } { : \null             } ,
+    { item_sep         } { \quad                }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-name-generic-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,43 @@
+%%
+%% This is file `sjtu-name-generic-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,generic,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Chinese name config for generic (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-generic-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_map_inline:nn
+  {
+    { year  } { 年 } ,
+    { month } { 月 } ,
+    { day   } { 日 }
+  }
+  { \__sjtu_define_name:nnn { zh } #1 }
+\clist_map_inline:nn
+  {
+    { keywords         } { 关键词                 } ,
+    { info_sep         } { : \null               } ,
+    { item_sep         } { ,                     }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-name-generic-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-generic-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-de.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-de.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-de.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,53 @@
+%%
+%% This is file `sjtu-name-thesis-de.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,thesis,de')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {German name config for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-thesis-de.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_const:Nn \c__sjtu_name_month_de_clist
+  {
+    Januar, Februar, März, April, Mai, Juni,
+    Juli, August, September, Oktober, November, Dezember
+  }
+\__sjtu_define_name_from_clist:nnnn { de }
+  { degree_level } { \g__sjtu_thesis_type_int }
+  { Bachelor, Master, Doktor }
+\clist_map_inline:nn
+  {
+    { univ             } { Shanghai~ Jiao~ Tong~ Universität } ,
+    { address          } { Shanghai,~ VR~ China              } ,
+    { author           } { Autor/in                          } ,
+    { supervisor       } { Betreuer/in                       } ,
+    { assoc_supervisor } { Zweitbetreuer/in                  } ,
+    { co_supervisor    } { Co-Betreuer/in                    } ,
+    { title_page       } { Titelblatt                        } ,
+    { declaration      } { Eidesstattliche~ Erklärung        } ,
+    { abstract         } { Abstrakt                          } ,
+    { keywords         } { Schlüsselwörter                   } ,
+    { info_sep         } { :~                                } ,
+    { item_sep         } { ,~                                }
+  }
+  { \__sjtu_define_name:nnn { de } #1 }
+\endinput
+%%
+%% End of file `sjtu-name-thesis-de.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-de.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-en.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-en.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-en.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,53 @@
+%%
+%% This is file `sjtu-name-thesis-en.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,thesis,en')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {English name config for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-thesis-en.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_const:Nn \c__sjtu_name_month_en_clist
+  {
+    January, February, March, April, May, June,
+    July, August, September, October, November, December
+  }
+\__sjtu_define_name_from_clist:nnnn { en }
+  { degree_level } { \g__sjtu_thesis_type_int }
+  { Bachelor, Master, Doctor }
+\clist_map_inline:nn
+  {
+    { univ             } { Shanghai~ Jiao~ Tong~ University } ,
+    { address          } { Shanghai,~ P.R.~ China           } ,
+    { author           } { Author                           } ,
+    { supervisor       } { Supervisor                       } ,
+    { assoc_supervisor } { Assoc.~ Supervisor               } ,
+    { co_supervisor    } { Co-supervisor                    } ,
+    { title_page       } { Title~ Page                      } ,
+    { declaration      } { Statutory~ Declaration           } ,
+    { abstract         } { Abstract                         } ,
+    { keywords         } { Key~words                        } ,
+    { info_sep         } { :~                               } ,
+    { item_sep         } { ,~                               }
+  }
+  { \__sjtu_define_name:nnn { en } #1 }
+\endinput
+%%
+%% End of file `sjtu-name-thesis-en.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-en.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,56 @@
+%%
+%% This is file `sjtu-name-thesis-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,thesis,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Japanese name config for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-thesis-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_map_inline:nn
+  {
+    { year  } { 年 } ,
+    { month } { 月 } ,
+    { day   } { 日 }
+  }
+  { \__sjtu_define_name:nnn { ja } #1 }
+\__sjtu_define_name_from_clist:nnnn { ja }
+  { degree_level } { \g__sjtu_thesis_type_int }
+  { 学士, 修士, 博士 }
+\clist_map_inline:nn
+  {
+    { univ             } { 上海交通大学         } ,
+    { address          } { 中国・上海           } ,
+    { author           } { 氏名                 } ,
+    { supervisor       } { 指導教員             } ,
+    { assoc_supervisor } { 副指導教員           } ,
+    { co_supervisor    } { 共同指導             } ,
+    { thesis           } { 学位請求論文         } ,
+    { title_page       } { 標題紙               } ,
+    { declaration      } { 誓約書・公表許諾書   } ,
+    { abstract         } { 要 \protect \quad 旨 } ,
+    { keywords         } { キーワード           } ,
+    { info_sep         } { : \null             } ,
+    { item_sep         } { \quad                }
+  }
+  { \__sjtu_define_name:nnn { ja } #1 }
+\endinput
+%%
+%% End of file `sjtu-name-thesis-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,100 @@
+%%
+%% This is file `sjtu-name-thesis-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `name,thesis,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Chinese name config for thesis (SJTUTeX)}
+\ProvidesExplFile{sjtu-name-thesis-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\clist_map_inline:nn
+  {
+    { year  } { 年 } ,
+    { month } { 月 } ,
+    { day   } { 日 }
+  }
+  { \__sjtu_define_name:nnn { zh } #1 }
+\__sjtu_define_symbol:nn { white_square } { "25A1 }
+\__sjtu_define_name_from_clist:nnnn { zh }
+  { degree_level } { \g__sjtu_thesis_type_int }
+  { 学士, 硕士, 博士 }
+\clist_map_inline:nn
+  {
+    { univ             } { 上海交通大学           } ,
+    { author           } { 姓名                   } ,
+    { id               } { 学号                   } ,
+    { supervisor       } { 导师                   } ,
+    { assoc_supervisor } { 副导师                 } ,
+    { department       } { 院系                   } ,
+    { co_supervisor    } { 联合导师               } ,
+    { major            } { 学科 / 专业            } ,
+    { degree           } { 申请学位               } ,
+    { thesis           } { 学位论文               } ,
+    { title_page       } { 题名页                 } ,
+    { declaration      } { 原创性声明及使用授权书 } ,
+    { orig_decl        } { 原创性声明             } ,
+    { auth_decl        } { 使用授权书             } ,
+    { decl_author      } { 学位论文作者           } ,
+    { decl_supervisor  } { 指导教师               } ,
+    { abstract         } { 摘 \protect \quad 要   } ,
+    { keywords         } { 关键词                 } ,
+    { info_sep         } { : \null               } ,
+    { item_sep         } { ,                     }
+  }
+  { \__sjtu_define_name:nnn { zh } #1 }
+\tl_const:Nn \c__sjtu_orig_decl_text_zh_tl
+  {
+    本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独立进行研究工
+    作所取得的成果。除文中已经注明引用的内容外,本论文不包含任何其他个人
+    或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集
+    体,均已在文中以明确方式标明。本人完全知晓本声明的法律后果由本人承
+    担。
+  }
+\tl_const:Nn \c__sjtu_auth_decl_text_zh_tl
+  {
+    本人同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许
+    论文被查阅和借阅。 \par
+    \vskip 6 bp
+    \noindent
+    本学位论文属于: \par
+    { \c__sjtu_symbol_white_square_tl } \textbf { 公开论文 } \par
+    { \c__sjtu_symbol_white_square_tl } \textbf { 内部论文 },
+      保密 { \c__sjtu_symbol_white_square_tl }~ 1~ 年 /
+           { \c__sjtu_symbol_white_square_tl }~ 2~ 年 /
+           { \c__sjtu_symbol_white_square_tl }~ 3~ 年,
+      过保密期后适用本授权书。 \par
+    { \c__sjtu_symbol_white_square_tl } \textbf { 秘密论文 },
+      保密 \underline { \hspace { 2 em } } 年(不超过~ 10~ 年),
+      过保密期后适用本授权书。 \par
+    { \c__sjtu_symbol_white_square_tl } \textbf { 机密论文 },
+      保密 \underline { \hspace { 2 em } } 年(不超过~ 20~ 年),
+      过保密期后适用本授权书。 \par
+    \hspace { 6 em }(请在以上方框内选择打“ \ensuremath { \checkmark } ”)
+  }
+\tl_const:Nn \c__sjtu_signature_text_zh_tl
+  {
+    签名: \\
+    日期: \hspace { \stretch { 3 } } 年
+           \hspace { \stretch { 2 } } 月
+           \hspace { \stretch { 2 } } 日
+  }
+\endinput
+%%
+%% End of file `sjtu-name-thesis-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/name/sjtu-name-thesis-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-de.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-de.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-de.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,77 @@
+%%
+%% This is file `sjtu-scheme-de.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `scheme,de')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {German scheme (SJTUTeX)}
+\ProvidesExplFile{sjtu-scheme-de.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\keys_set_known:nn { sjtu / name }
+  {
+    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   }
+  }
+\ctex_if_autoindent_touched:F
+  { \ctex_set:n { autoindent = 1.5 em } }
+\ctex_patch_cmd:Nnn \quotation { 1.5em } { \parindent }
+\keys_set:nn { sjtu / style }
+  { fnmark-style = plain   }
+\tl_set:Nn \languagename { ngerman  }
+\clist_map_inline:nn
+  {
+    { 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     }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-scheme-de.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-de.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-en.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-en.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-en.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,52 @@
+%%
+%% This is file `sjtu-scheme-en.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `scheme,en')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {English scheme (SJTUTeX)}
+\ProvidesExplFile{sjtu-scheme-en.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\ctex_if_autoindent_touched:F
+  { \ctex_set:n { autoindent = 1.5 em } }
+\ctex_patch_cmd:Nnn \quotation { 1.5em } { \parindent }
+\keys_set:nn { sjtu / style }
+  { fnmark-style = plain   }
+\tl_set:Nn \languagename { english  }
+\clist_map_inline:nn
+  {
+    { 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     }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-scheme-en.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-en.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-ja.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-ja.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-ja.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,79 @@
+%%
+%% This is file `sjtu-scheme-ja.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `scheme,ja')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Japanese scheme (SJTUTeX)}
+\ProvidesExplFile{sjtu-scheme-ja.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\keys_set_known:nn { sjtu / name }
+  {
+    contents      = { 目 \protect \quad 次 } ,
+    listfigure    = { 図目次               } ,
+    listtable     = { 表目次               } ,
+    figure        = { 図                   } ,
+    table         = { 表                   } ,
+    abstract      = { 概 \protect \quad 要 } ,
+    index         = { 索 \protect \quad 引 } ,
+    appendix      = { 付録                 } ,
+    proof         = { 证明                 } ,
+    bib           = { 参考文献             } ,
+    figure*       = { Figure               } ,
+    table*        = { Table                } ,
+    algorithm     = { アルゴリズム         } ,
+    listalgorithm = { アルゴリズム目次     } ,
+    abbr          = { 略語表               } ,
+    nom           = { 記号表               } ,
+    ack           = { 謝 \protect \quad 辞 } ,
+    resume        = { 履歴書               } ,
+    digest        = { 要 \protect \quad 約 } ,
+    achv          = { 研究業績書           }
+  }
+\keys_set_known:nn { ctex / chapter }
+  { name = { 第 \space , \space 章 } }
+\ctex_if_autoindent_touched:F
+  { \ctex_set:n { autoindent = 1 } }
+\ctex_patch_cmd:Nnn \verse { -1.5em } { -2 \ccwd }
+\ctex_patch_cmd:Nnn \verse {  1.5em } {  2 \ccwd }
+\ctex_patch_cmd:Nnn \quotation { 1.5em } { \parindent }
+\keys_set:nn { sjtu / style }
+  { fnmark-style = circled }
+\tl_set:Nn \languagename { japanese }
+\clist_map_inline:nn
+  {
+    { assumption  } { 仮定        } ,
+    { axiom       } { 公理        } ,
+    { conjecture  } { 予想        } ,
+    { corollary   } { 系          } ,
+    { definition  } { 定義        } ,
+    { example     } { 例          } ,
+    { exercise    } { 練習        } ,
+    { lemma       } { 補題        } ,
+    { problem     } { 問題        } ,
+    { proposition } { 命題        } ,
+    { remark      } { 注意        } ,
+    { solution    } { 解法        } ,
+    { theorem     } { 定理        }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-scheme-ja.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-ja.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-zh.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-zh.def	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-zh.def	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,79 @@
+%%
+%% This is file `sjtu-scheme-zh.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `scheme,zh')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Chinese scheme (SJTUTeX)}
+\ProvidesExplFile{sjtu-scheme-zh.def}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\keys_set_known:nn { sjtu / name }
+  {
+    contents      = { 目 \protect \quad 录   } ,
+    listfigure    = { 插 \protect \quad 图   } ,
+    listtable     = { 表 \protect \quad 格   } ,
+    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          = { 学术论文和科研成果目录 }
+  }
+\keys_set_known:nn { ctex / chapter }
+  { name = { 第 \space , \space 章 } }
+\ctex_if_autoindent_touched:F
+  { \ctex_set:n { autoindent = true } }
+\ctex_patch_cmd:Nnn \verse { -1.5em } { -2 \ccwd }
+\ctex_patch_cmd:Nnn \verse {  1.5em } {  2 \ccwd }
+\ctex_patch_cmd:Nnn \quotation { 1.5em } { \parindent }
+\keys_set:nn { sjtu / style }
+  { fnmark-style = circled }
+\tl_set:Nn \languagename { chinese  }
+\clist_map_inline:nn
+  {
+    { assumption  } { 假设        } ,
+    { axiom       } { 公理        } ,
+    { conjecture  } { 猜想        } ,
+    { corollary   } { 推论        } ,
+    { definition  } { 定义        } ,
+    { example     } { 例          } ,
+    { exercise    } { 练习        } ,
+    { lemma       } { 引理        } ,
+    { problem     } { 问题        } ,
+    { proposition } { 命题        } ,
+    { remark      } { 注          } ,
+    { solution    } { 解          } ,
+    { theorem     } { 定理        }
+  }
+  { \__sjtu_define_name:nn #1 }
+\endinput
+%%
+%% End of file `sjtu-scheme-zh.def'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/scheme/sjtu-scheme-zh.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuarticle.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuarticle.cls	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuarticle.cls	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,1073 @@
+%%
+%% This is file `sjtuarticle.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `class,article')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\providecommand\IfFormatAtLeastTF{\@ifl at t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}
+ {\PackageError{sjtutex}
+   {Your LaTeX format is outdated!\MessageBreak\MessageBreak
+    Release `2020/10/01' or newer is required to\MessageBreak
+    compile this document.\MessageBreak\MessageBreak
+    Please update your TeX distribution}{}}
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Article document class for Shanghai Jiao Tong University (SJTUTeX)}
+\ProvidesExplClass{sjtuarticle}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\dim_new:N \l__sjtu_tmp_dim
+\skip_new:N \l__sjtu_tmp_skip
+\box_new:N \l__sjtu_tmp_box
+\tl_new:N \g__sjtu_lang_tl
+\tl_const:Nn \c__sjtu_lang_de_tl { de }
+\tl_const:Nn \c__sjtu_lang_ja_tl { ja }
+\tl_new:N \g__sjtu_zihao_tl
+\int_new:N \g__sjtu_font_size_int
+\dim_new:N \g__sjtu_font_size_dim
+\dim_new:N \g__sjtu_baseline_skip_dim
+\bool_new:N \g__sjtu_fixed_baselineskip_bool
+\fp_new:N \g__sjtu_line_spread_fp
+\tl_new:N \g__sjtu_text_font_tl
+\tl_new:N \g__sjtu_math_font_tl
+\tl_new:N \g__sjtu_cjk_font_tl
+\bool_new:N \g__sjtu_slanted_uppercase_greek_bool
+\bool_new:N \g__sjtu_upright_integral_bool
+\bool_new:N \g__sjtu_integral_limits_bool
+\clist_new:N \g__sjtu_math_font_options_clist
+\clist_set:Nn \g__sjtu_options_to_ctex_class_clist
+  { a4paper, UTF8, scheme = plain, fontset = none }
+\clist_new:N \g__sjtu_options_to_packages_clist
+\bool_new:N \g__sjtu_twoside_bool
+\bool_set_false:N \g__sjtu_twoside_bool
+\bool_new:N \g__sjtu_titlepage_bool
+\bool_set_false:N \g__sjtu_titlepage_bool
+\bool_new:N \g__sjtu_draft_bool
+\cs_new_protected:Npn \__sjtu_deprecated_option:n
+  { \msg_warning:nnn { sjtutex } { deprecated-option } }
+\cs_new_protected:Npn \__sjtu_set_deprecated_option:n #1
+  {
+    \__sjtu_deprecated_option:n { Option~ `#1'~ is~ set. }
+    \keys_set:nn { sjtu / option } {#1}
+  }
+\msg_new:nnn { sjtutex } { deprecated-option }
+  { Option~ `\l_keys_key_tl'~ is~ deprecated. \\ #1 }
+\keys_define:nn { sjtu / option }
+  {
+    lang .choice: ,
+    lang .value_required:n = true ,
+    lang .choices:nn =
+      { zh, en, de, ja }
+      {
+        \tl_gset_eq:NN \g__sjtu_lang_tl \l_keys_choice_tl
+      } ,
+    lang .initial:n = { zh } ,
+    zihao .choice: ,
+    zihao .value_required:n = true ,
+    zihao /  5 .code:n =
+      {
+        \tl_gset:Nn  \g__sjtu_zihao_tl {#1}
+        \int_gset:Nn \g__sjtu_font_size_int { 1 }
+        \dim_gset:Nn \g__sjtu_font_size_dim { 10.5 bp }
+      } ,
+    zihao / -4 .code:n =
+      {
+        \tl_gset:Nn  \g__sjtu_zihao_tl {#1}
+        \int_gset:Nn \g__sjtu_font_size_int { 2 }
+        \dim_gset:Nn \g__sjtu_font_size_dim { 12   bp }
+      } ,
+    zihao .initial:n = {  5 } ,
+    linespread .fp_gset:N = \g__sjtu_line_spread_fp ,
+    linespread .initial:n = { \c_nan_fp } ,
+    linespread .value_required:n = true ,
+    baselineskip .choice: ,
+    baselineskip .value_required:n = true ,
+    baselineskip / false   .code:n =
+      { \bool_gset_false:N \g__sjtu_fixed_baselineskip_bool } ,
+    baselineskip / unknown .code:n =
+      {
+        \bool_gset_true:N  \g__sjtu_fixed_baselineskip_bool
+        \dim_gset:Nn \g__sjtu_baseline_skip_dim {#1}
+      } ,
+    baselineskip .initial:n = { false } ,
+    text-font .tl_gset:N = \g__sjtu_text_font_tl ,
+    text-font .initial:n = { newtx } ,
+    math-font .tl_gset:N = \g__sjtu_math_font_tl ,
+    cjk-font  .tl_gset:N = \g__sjtu_cjk_font_tl ,
+    fontset .code:n = { \__sjtu_set_deprecated_option:n { cjk-font = #1 } } ,
+    math-style .choice: ,
+    math-style .value_required:n = true,
+    math-style / TeX .code:n =
+      {
+        \bool_gset_false:N \g__sjtu_slanted_uppercase_greek_bool
+        \bool_gset_false:N \g__sjtu_upright_integral_bool
+        \bool_gset_false:N \g__sjtu_integral_limits_bool
+      } ,
+    math-style / ISO .code:n =
+      {
+        \bool_gset_true:N \g__sjtu_slanted_uppercase_greek_bool
+        \bool_gset_true:N \g__sjtu_upright_integral_bool
+        \bool_gset_true:N \g__sjtu_integral_limits_bool
+      } ,
+    math-style .initial:n = { ISO } ,
+    uppercase-greek .choice: ,
+    uppercase-greek .value_required:n = true ,
+    uppercase-greek / slanted .code:n =
+      { \bool_gset_true:N  \g__sjtu_slanted_uppercase_greek_bool } ,
+    uppercase-greek / upright .code:n =
+      { \bool_gset_false:N \g__sjtu_slanted_uppercase_greek_bool } ,
+    integral .choice: ,
+    integral .value_required:n = true ,
+    integral / slanted .code:n =
+      { \bool_gset_false:N \g__sjtu_upright_integral_bool } ,
+    integral / upright .code:n =
+      { \bool_gset_true:N  \g__sjtu_upright_integral_bool } ,
+    integral-limits .choice: ,
+    integral-limits .value_required:n = true ,
+    integral-limits / false .code:n =
+      { \bool_gset_false:N \g__sjtu_integral_limits_bool } ,
+    integral-limits / true  .code:n =
+      { \bool_gset_true:N  \g__sjtu_integral_limits_bool } ,
+    oneside .value_forbidden:n = true,
+    twoside .value_forbidden:n = true,
+    oneside .code:n =
+      { \bool_gset_false:N \g__sjtu_twoside_bool } ,
+    twoside .code:n =
+      { \bool_gset_true:N  \g__sjtu_twoside_bool } ,
+    titlepage   .value_forbidden:n = true,
+    notitlepage .value_forbidden:n = true,
+    titlepage   .code:n =
+      { \bool_gset_true:N  \g__sjtu_titlepage_bool } ,
+    notitlepage .code:n =
+      { \bool_gset_false:N \g__sjtu_titlepage_bool } ,
+    draft .value_forbidden:n = true,
+    final .value_forbidden:n = true,
+    draft .code:n =
+      { \bool_gset_true:N  \g__sjtu_draft_bool } ,
+    final .code:n =
+      { \bool_gset_false:N \g__sjtu_draft_bool } ,
+    unknown .code:n = { \msg_error:nn { sjtutex } { unknown-option } }
+  }
+\msg_new:nnn { sjtutex } { unknown-option }
+  { Class~ option~ "\l_keys_key_tl"~ is~ unknown. }
+\cs_if_exist:NTF \ProcessKeyOptions
+  { \ProcessKeyOptions [ sjtu / option ] }
+  {
+    \RequirePackage { l3keys2e }
+    \ProcessKeysOptions { sjtu / option }
+  }
+\bool_if:NF \g__sjtu_fixed_baselineskip_bool
+  {
+    \fp_if_nan:nT { \g__sjtu_line_spread_fp }
+      { \fp_set:Nn \g__sjtu_line_spread_fp { 1.3 } }
+  }
+\clist_set:Nx \g__sjtu_math_font_options_clist
+  {
+    \bool_if:NT \g__sjtu_slanted_uppercase_greek_bool
+      { slantedGreek } ,
+    \bool_if:NT \g__sjtu_upright_integral_bool
+      { upint }
+  }
+\clist_put_right:Nx \@classoptionslist
+  {
+    a4paper ,
+    \tl_if_eq:NNT \g__sjtu_lang_tl \c__sjtu_lang_de_tl
+      { german, ngerman } ,
+    \bool_if:NT \g__sjtu_integral_limits_bool
+      { intlimits } ,
+    \g__sjtu_math_font_options_clist
+  }
+\clist_put_right:Nx \g__sjtu_options_to_ctex_class_clist
+  {
+    zihao      = \g__sjtu_zihao_tl ,
+    \fp_if_nan:nF { \g__sjtu_line_spread_fp }
+      { linespread = \fp_use:N \g__sjtu_line_spread_fp } ,
+    \bool_if:NTF \g__sjtu_twoside_bool
+      { twoside   } { oneside     } ,
+    \bool_if:NTF \g__sjtu_titlepage_bool
+      { titlepage } { notitlepage } ,
+    \bool_if:NTF \g__sjtu_draft_bool
+      { draft     } { final       }
+  }
+\exp_args:No \PassOptionsToClass
+  { \g__sjtu_options_to_ctex_class_clist }
+  { ctexart }
+\clist_set:Nx \g__sjtu_options_to_packages_clist
+  {
+    { no-math           } { fontspec     } ,
+    { titles            } { tocloft      } ,
+    { list = off        } { bicaption    } ,
+    { warnings-off =
+      {
+        mathtools-overbracket,
+        mathtools-colon
+      }
+    }                     { unicode-math } ,
+    { amsmath, thmmarks } { ntheorem     } ,
+    {
+      \bool_if:NTF \g__sjtu_integral_limits_bool
+        { displaylimits } { nolimits }
+    }                     { cmupint      }
+  }
+\clist_map_inline:Nn \g__sjtu_options_to_packages_clist
+  { \PassOptionsToPackage #1 }
+\LoadClass { ctexart }
+\RequirePackage
+  {
+    mathtools,
+    geometry,
+    fancyhdr,
+    tocloft,
+    caption,
+    bicaption,
+    subcaption,
+    xcolor,
+    graphicx,
+    enumitem
+  }
+\cs_generate_variant:Nn \cs_gset:Npn { cpo }
+\cs_generate_variant:Nn \tl_const:Nn { Nv }
+\cs_generate_variant:Nn \clist_use:Nn { NV, cv }
+\exp_args_generate:n { Nnv }
+\cs_generate_variant:Nn \exp_last_unbraced:Ne { ce }
+\prg_generate_conditional_variant:Nnn \regex_match:nn { ne } { T, TF }
+\cs_new:Npx \__sjtu_engine_case:nn #1#2
+  {
+    \bool_lazy_or:nnTF
+      { \sys_if_engine_xetex_p:  }
+      { \sys_if_engine_luatex_p: }
+      {#2}
+      { \sys_if_engine_pdftex:T {#1} }
+  }
+\cs_new:Npx \__sjtu_engine_case:nnn #1#2#3
+  {
+    \sys_if_engine_xetex:TF
+      {#2}
+      {
+        \sys_if_engine_luatex:TF
+          {#3}
+          { \sys_if_engine_pdftex:T {#1} }
+      }
+  }
+\cs_new:Npx \__sjtu_unicode_engine_case:nn #1#2
+  {
+    \sys_if_engine_xetex:TF
+      {#1}
+      { \sys_if_engine_luatex:T {#2} }
+  }
+\__sjtu_engine_case:nn
+  {
+    \cs_new:Npn \__sjtu_unicode_char:n #1
+      {
+        \exp_not:N \Unicode
+          { \int_div_truncate:nn {#1} { 256 } }
+          { \int_mod:nn          {#1} { 256 } }
+      }
+  }
+  { \cs_new:Npn \__sjtu_unicode_char:n #1 { \tex_Uchar:D #1 \scan_stop: } }
+\cs_new_protected:Npn \__sjtu_preto_cmd:Nn #1#2
+  {
+    \ctex_preto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \__sjtu_appto_cmd:Nn #1#2
+  {
+    \ctex_appto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new:Npn \__sjtu_skip_add_to_wd:Nn #1#2
+  {
+    \hbox_set:Nn \l__sjtu_tmp_box {#2}
+    \skip_add:Nn #1 { \box_wd:N \l__sjtu_tmp_box }
+  }
+\cs_generate_variant:Nn \__sjtu_skip_add_to_wd:Nn { cv }
+\cs_new:Npn \__sjtu_cs_provide_eq:NN #1#2
+  { \cs_if_exist:NF #1 { \cs_set_eq:NN #1 #2 } }
+\cs_generate_variant:Nn \__sjtu_cs_provide_eq:NN { cc }
+\cs_new_protected:Npn \__sjtu_define_name:nn #1#2
+  { \tl_const:cn { c__sjtu_name_ #1 _tl } {#2} }
+\cs_new_protected:Npn \__sjtu_define_name:nnn #1#2#3
+  { \tl_const:cn { c__sjtu_name_ #2 _ #1 _tl } {#3} }
+\cs_new_protected:Npn \__sjtu_define_symbol:nn #1#2
+  { \tl_const:cx { c__sjtu_symbol_ #1 _tl } { \__sjtu_unicode_char:n {#2} } }
+\cs_new_protected:Npn \__sjtu_set_font_size:nnNn #1#2#3#4
+  { \cs_set_protected:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
+\tl_set:Nx \l__sjtu_font_size_tl
+  {
+    { \dim_to_decimal:n { \g__sjtu_font_size_dim     } }
+    { \dim_to_decimal:n { \g__sjtu_baseline_skip_dim } }
+  }
+\bool_if:NT \g__sjtu_fixed_baselineskip_bool
+  {
+    \int_case:nn { \g__sjtu_font_size_int }
+      {
+        { 1 } {
+                \exp_after:wN \__sjtu_set_font_size:nnNn \l__sjtu_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
+                  }
+              }
+        { 2 } {
+                \exp_after:wN \__sjtu_set_font_size:nnNn \l__sjtu_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
+  }
+\NewDocumentCommand \setbaselineskip { m }
+  { \fontsize { \f at size } {#1} \selectfont }
+\cs_new_protected:Npn \__sjtu_fontset_error:nn #1#2
+  { \msg_error:nnnn { sjtutex } { font-unavailable } {#1} {#2} }
+\msg_new:nnn { sjtutex } { font-unavailable }
+  { `#1-font~ =~ #2'~ is~ unavailable~ in~ current~ mode. }
+\cs_new_eq:NN \__sjtu_fontset_case:nn \__sjtu_engine_case:nn
+\cs_new:Npx \__sjtu_fontset_case:nnn #1#2#3
+  {
+    \__sjtu_engine_case:nn
+      { \sys_if_output_pdf:TF {#1} {#2} }
+      {#3}
+  }
+\cs_new_protected:Nn \__sjtu_declare_math_symbol:nnNn
+  {
+    \cs_undefine:N #3
+    \DeclareMathSymbol {#3} {#1} {#2} {#4}
+  }
+\cs_new_protected:Nn \__sjtu_set_slanted_greek:
+  {
+    \clist_const:Nn \c__sjtu_uppercase_greek_clist
+      { Gamma, Delta, Theta, Lambda, Xi, Pi, Sigma, Upsilon, Phi, Psi, Omega }
+    \clist_map_inline:Nn \c__sjtu_uppercase_greek_clist
+      {
+        \cs_set_eq:cc { up ##1 } {     ##1 }
+        \cs_set_eq:cc { it ##1 } { var ##1 }
+      }
+    \bool_if:NT \g__sjtu_slanted_uppercase_greek_bool
+      {
+        \clist_map_inline:Nn \c__sjtu_uppercase_greek_clist
+          { \cs_set_eq:cc { ##1 } { it ##1 } }
+      }
+  }
+\cs_new_protected:Nn \__sjtu_set_unimath_symbol:
+  {
+    \clist_map_inline:nn
+      {
+        { increment } { upDelta     } ,
+        { QED       } { blacksquare }
+      }
+      { \__sjtu_cs_provide_eq:cc ##1 }
+  }
+\tl_if_empty:NT \g__sjtu_math_font_tl
+  { \tl_gset_eq:NN \g__sjtu_math_font_tl \g__sjtu_text_font_tl }
+\tl_if_empty:NT \g__sjtu_cjk_font_tl
+  {
+    \sys_if_platform_windows:TF
+      { \tl_gset:Nn \g__sjtu_cjk_font_tl { windows } }
+      {
+        \ctex_if_platform_macos:TF
+          { \tl_gset:Nn \g__sjtu_cjk_font_tl { mac    } }
+          { \tl_gset:Nn \g__sjtu_cjk_font_tl { fandol } }
+      }
+  }
+\cs_new_protected:Npn \__sjtu_load_font:nn #1#2
+  {
+    \str_if_eq:eeF { \tl_use:c { g__sjtu_ #1 _font_tl } } { none }
+      {
+        \file_if_exist:nF
+          { sjtu- #1 -font- \tl_use:c { g__sjtu_ #1 _font_tl } .def }
+          {
+            \msg_warning:nnnn { sjtutex } { invalid-font } {#1} {#2}
+            \tl_gset:cn { g__sjtu_ #1 _font_tl } {#2}
+          }
+        \ctex_file_input:n
+          { sjtu- #1 -font- \tl_use:c { g__sjtu_ #1 _font_tl } .def }
+      }
+  }
+\msg_new:nnn { sjtutex } { invalid-font }
+  {
+    Invalid~ value~ `#1-font~ =~ \tl_use:c { g__sjtu_ #1 _font_tl }~ '! \\\\
+    Using~ `#2'~ instead.
+  }
+\cs_new_protected:Nn \__sjtu_load_fontset:
+  {
+    \clist_map_inline:nn
+      {
+        { math } { newtx  },
+        { text } { newtx  },
+        { cjk  } { fandol }
+      }
+      { \__sjtu_load_font:nn ##1 }
+  }
+\@onlypreamble \__sjtu_load_font:nn
+\@onlypreamble \__sjtu_load_fontset:
+\ctex_at_end_package:nn { unicode-math }
+  {
+    \DeclareDocumentCommand \bm { m }
+      { { \symbf {#1} } }
+    \DeclareDocumentCommand \boldsymbol { m }
+      { { \symbf {#1} } }
+    \bool_if:NTF \g__sjtu_slanted_uppercase_greek_bool
+      { \keys_set:nn { unicode-math } { math-style = ISO } }
+      { \keys_set:nn { unicode-math } { math-style = TeX } }
+    \bool_if:NTF \g__sjtu_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
+      }
+  }
+\ctex_at_end_preamble:n
+  {
+    \@ifpackageloaded { unicode-math }
+      { } { \RequirePackage { bm } }
+  }
+\NewDocumentCommand \CJKrmfamily { } { \CJKfamily { \CJKrmdefault } }
+\NewDocumentCommand \CJKsffamily { } { \CJKfamily { \CJKsfdefault } }
+\NewDocumentCommand \CJKttfamily { } { \CJKfamily { \CJKttdefault } }
+\__sjtu_unicode_engine_case:nn
+  {
+    \xeCJK_declare_char_class:nn { CJK }
+      { "24EA, "2460->"2473, "3251->"32BF, "25A1 }
+  }
+  {
+    \ltjdefcharrange { 99 }
+      { "24EA, "2460-"2473, "3251-"32BF, "25A1 }
+    \ltjsetparameter { jacharrange = { +99 } }
+  }
+\__sjtu_load_fontset:
+\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} } ,
+    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 ,
+    figure*        .tl_set:N = \SJTU at figurename@bi at second ,
+    figure*       .initial:n = { 图 } ,
+    table*         .tl_set:N = \SJTU at tablename@bi at second ,
+    table*        .initial:n = { 表 } ,
+    algorithm      .tl_set:N = \SJTU at algorithmname ,
+    algorithm     .initial:n = { Algorithm } ,
+    listalgorithm  .tl_set:N = \SJTU at listalgorithmname ,
+    listalgorithm .initial:n = { List~of~Algorithms } ,
+  }
+\file_input:n { sjtu-name-generic- \g__sjtu_lang_tl .def }
+\geometry
+  {
+    top           = 3.5 cm,
+    bottom        = 4.0 cm,
+    left          = 2.5 cm,
+    right         = 2.5 cm,
+    headheight    = 1.5 cm,
+    headsep       = 0.5 cm,
+    footskip      = 1.0 cm
+  }
+\pagestyle { fancy }
+\fancyhf { }
+\keys_define:nn { sjtu / style }
+  {
+    header-font  .tl_set:N = \l__sjtu_style_header_font_tl ,
+    header-font .initial:n = \zihao { -5 } \sffamily ,
+    footer-font  .tl_set:N = \l__sjtu_style_footer_font_tl ,
+    footer-font .initial:n = \zihao { -5 }
+  }
+\fancyheadinit { \l__sjtu_style_header_font_tl }
+\fancyfootinit { \l__sjtu_style_footer_font_tl }
+\keys_define:nn { sjtu / style }
+  {
+    header-uppercase       .choice: ,
+    header-uppercase / true  .code:n =
+      { \cs_set_eq:NN \__sjtu_nouppercase:n \use:n                 } ,
+    header-uppercase / false .code:n =
+      { \cs_set:Nn    \__sjtu_nouppercase:n { \nouppercase {##1} } } ,
+    header-uppercase      .default:n = { true  } ,
+    header-uppercase      .initial:n = { false }
+  }
+\cs_generate_variant:Nn \__sjtu_nouppercase:n { V }
+\cs_new:Nn \__sjtu_thepage: { \thepage }
+\keys_define:nn { sjtu / style }
+  {
+    page-number .cs_set:Np = \__sjtu_page:n #1 ,
+    page-number .initial:n = { {#1} }
+  }
+\tl_set:Nn \l__sjtu_header_tl
+  {
+    \includegraphics [ height = 1.2 cm ]
+      { sjtu-vi-logo-small-red.pdf }
+  }
+\tl_set:Nn \l__sjtu_leftmark_tl  { \l__sjtu_info_subject_tl }
+\tl_set:Nn \l__sjtu_rightmark_tl { \leftmark }
+\bool_if:NTF \g__sjtu_twoside_bool
+  {
+    \fancyhead [ LO, RE ] { \l__sjtu_header_tl }
+    \fancyhead [ LE ]     { \__sjtu_nouppercase:V \l__sjtu_leftmark_tl  }
+    \fancyhead [ RO ]     { \__sjtu_nouppercase:V \l__sjtu_rightmark_tl }
+  }
+  {
+    \fancyhead [ L ] { \l__sjtu_header_tl }
+    \fancyhead [ R ] { \__sjtu_nouppercase:V \l__sjtu_rightmark_tl }
+  }
+\fancyfoot [ C ] { \__sjtu_page:n { \__sjtu_thepage: } }
+\bool_if:NTF \g__sjtu_twoside_bool
+  {
+    \fancypagestyle { plain }
+      {
+        \fancyhead [ LE, RO ] { }
+        \tl_set:Nn \headrulewidth { 0 pt }
+      }
+  }
+  {
+    \fancypagestyle { plain }
+      {
+        \fancyhead [ R ] { }
+        \tl_set:Nn \headrulewidth { 0 pt }
+      }
+  }
+\cs_new_eq:NN \ps at SJTU@null \prg_do_nothing:
+\RenewDocumentCommand \cleardoublepage { }
+  {
+    \clearpage
+    \bool_if:NT \g__sjtu_twoside_bool
+      {
+        \int_if_odd:nF \c at page
+          { \hbox:n { } \thispagestyle { empty } \newpage }
+      }
+  }
+\ctex_set:nn { section }
+  { format = \large \bfseries \CJKsffamily }
+\ctex_set:nn { subsection }
+  { format = \normalsize \bfseries \CJKsffamily }
+\ctex_set:nn { subsubsection }
+  { format = \normalsize \normalfont }
+\ctex_set:n { secnumdepth = 3 }
+\keys_define:nn { sjtu / style }
+  {
+    indent-first    .choice: ,
+    indent-first   .choices:nn =
+      { true, false }
+      {
+        \clist_map_inline:nn
+          {
+            part,
+            section, subsection, subsubsection,
+            paragraph, subparagraph
+          }
+          { \ctex_set:nn {####1} { afterindent = #1 } }
+      } ,
+    indent-first   .default:n = { true } ,
+    indent-first   .initial:n = { true }
+  }
+\NewDocumentCommand \SJTU at head { s O{#3} m O{#2} }
+  {
+    \IfBooleanTF {#1}
+      { \tl_if_empty:nF {#4} { \__sjtu_pdf_bookmark:nn { 0 } {#4} } }
+      {
+        \__sjtu_phantom_section:
+        \addcontentsline { toc } { section } {#4}
+      }
+    \cs_set_eq:NN \__sjtu_orig_ctex_gettitle:n \CTEX at gettitle
+    \cs_set:Npn \CTEX at gettitle ##1 { \__sjtu_orig_ctex_gettitle:n {#2} }
+    \section* {#3}
+    \cs_set_eq:NN \CTEX at gettitle \__sjtu_orig_ctex_gettitle:n
+    \@mkboth { \MakeUppercase {#2} } { \MakeUppercase {#2} }
+  }
+\cs_new_eq:NN \__sjtu_pdf_bookmark:nn \use_none:nn
+\cs_new_eq:NN \__sjtu_phantom_section: \prg_do_nothing:
+\setlist { nosep }
+\keys_define:nn { sjtu / style }
+  {
+    equation-font  .tl_set:N = \SJTU at style@equation at font ,
+    equation-font .initial:V = \c_empty_tl
+  }
+\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 at style@equation at font } }
+\clist_map_inline:nn
+  { \start at gather, \start at align, \start at multline }
+  {
+    \ctex_patch_cmd:Nnn #1
+      { \collect at body }
+      {
+        \SJTU at style@equation at font
+        \collect at body
+      }
+  }
+\ctex_patch_cmd:Nnn \gather at split
+  { \spread at equation }
+  {
+    \SJTU at style@equation at font
+    \spread at equation
+  }
+\tl_set:Nn \textfraction      { 0.15 }
+\tl_set:Nn \topfraction       { 0.85 }
+\tl_set:Nn \bottomfraction    { 0.65 }
+\tl_set:Nn \floatpagefraction { 0.60 }
+\keys_define:nn { sjtu / style }
+  {
+    float-font  .tl_set:N = \SJTU at style@float at font ,
+    float-font .initial:n = \zihao { 5 }
+  }
+\ctex_patch_cmd:Nnn \@floatboxreset
+  { \normalsize } { \SJTU at style@float at font }
+\keys_define:nn { sjtu / style }
+  {
+    caption-font       .code:n =
+      { \DeclareCaptionFont { normalsize    } {#1} } ,
+    caption-font    .initial:n = \zihao { 5 } \bfseries ,
+    subcaption-font    .code:n =
+      { \DeclareCaptionFont { SJTU at sub@font } {#1} } ,
+    subcaption-font .initial:n = \zihao { 5 } \normalfont
+  }
+\captionsetup
+  {
+    bi-slc   = off ,
+    labelsep = quad ,
+  }
+\captionsetup [ sub ]
+  {
+    bi-slc   = on ,
+    font     = SJTU at sub@font ,
+    format   = hang
+  }
+\DeclareCaptionOption { bi-second-names } [ ]
+  {
+    \tl_set:Nn \figurename { \SJTU at figurename@bi at second }
+    \tl_set:Nn \tablename  { \SJTU at tablename@bi at second  }
+  }
+\captionsetup [ bi-second ] { bi-second-names }
+\keys_define:nn { sjtu / style }
+  {
+    num-sep            .code:n =
+      {
+        \tl_set:Nn \SJTU at style@fl at num@sep {#1}
+        \tl_set:Nn \SJTU at style@eq at num@sep {#1}
+        \tl_set:Nn \@thmcountersep        {#1}
+      } ,
+    num-sep         .initial:n = { . } ,
+    float-num-sep    .tl_set:N = \SJTU at style@fl at num@sep ,
+    equation-num-sep .tl_set:N = \SJTU at style@eq at num@sep ,
+    theorem-num-sep  .tl_set:N = \@thmcountersep
+  }
+\NewDocumentCommand \SJTU at counterwithin
+  { s O{ \SJTU at style@fl at num@sep } O{ \arabic } m m }
+  {
+    \@ifbothcounters {#4} {#5}
+      {
+        \@addtoreset {#4} {#5}
+        \IfBooleanF {#1}
+          {
+            \cs_gset:cpo { the #4 }
+              { \cs:w the #5 \cs_end: #2 #3 {#4} }
+          }
+      }
+  }
+\cs_set_eq:NN \__sjtu_makefnmark_plain: \@makefnmark
+\cs_set_eq:NN \__sjtu_thefootnote_plain: \thefootnote
+\cs_set_eq:NN \__sjtu_thempfootnote_plain: \thempfootnote
+\cs_new:Npn \__sjtu_footnote_number:N #1
+  {
+    \int_compare:nNnTF {#1} < { 21 }
+      { \__sjtu_unicode_char:n { \int_eval:n { "2460 - 1 + #1 } } }
+      {
+        \int_compare:nNnTF {#1} < { 36 }
+          { \__sjtu_unicode_char:n { \int_eval:n { "3251 - 21 + #1 } } }
+          {
+            \int_compare:nNnTF {#1} < { 51 }
+              { \__sjtu_unicode_char:n { \int_eval:n { "32B1 - 36 + #1 } } }
+              { \msg_warning:nn { sjtutex } { too-many-footnotes } }
+          }
+      }
+  }
+\msg_new:nnn { sjtutex } { too-many-footnotes }
+  { Too~ many~ footnotes. }
+\cs_new:Nn \__sjtu_makefnmark_circled: { \hbox:n { \@thefnmark } }
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-font           .choice: ,
+    fnmark-font / haranoaji .code:n =
+      {
+        \__sjtu_engine_case:nn
+          { \tl_set_eq:NN \l__sjtu_style_fnmark_font_tl \c_empty_tl }
+          {
+            \tl_set:Nn \l__sjtu_style_fnmark_font_tl
+              {
+                \CJKfontspec { HaranoAjiMincho }
+                  [
+                    Extension   = .otf ,
+                    UprightFont = *-Regular ,
+                    BoldFont    = *-Bold
+                  ]
+              }
+          }
+      } ,
+    fnmark-font / unknown .tl_set:N = \l__sjtu_style_fnmark_font_tl ,
+    fnmark-font          .initial:V = \c_empty_tl
+  }
+\cs_new:Nn \__sjtu_thefootnote_circled:
+  { { \l__sjtu_style_fnmark_font_tl \__sjtu_footnote_number:N \c at footnote } }
+\cs_new:Nn \__sjtu_thempfootnote_circled:
+  { { \l__sjtu_style_fnmark_font_tl \__sjtu_footnote_number:N \c at mpfootnote } }
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-style           .choice: ,
+    fnmark-style / plain   .code:n =
+      {
+        \cs_set_eq:NN \__sjtu_makefnmark: \__sjtu_makefnmark_plain:
+        \cs_set_eq:NN \thefootnote \__sjtu_thefootnote_plain:
+        \cs_set_eq:NN \thempfootnote \__sjtu_thempfootnote_plain:
+      } ,
+    fnmark-style / circled .code:n =
+      {
+        \cs_set_eq:NN \__sjtu_makefnmark: \__sjtu_makefnmark_circled:
+        \cs_set_eq:NN \thefootnote \__sjtu_thefootnote_circled:
+        \cs_set_eq:NN \thempfootnote \__sjtu_thempfootnote_circled:
+      }
+  }
+\ctex_at_end_preamble:n {
+  \cs_set_eq:NN \__sjtu_orig_make_fntext:n \@makefntext
+  \cs_set:Npn \@makefntext #1
+    {
+      \group_begin:
+        \cs_set_eq:NN \@makefnmark \__sjtu_makefnmark:
+        \__sjtu_orig_make_fntext:n {#1}
+      \group_end:
+    }
+}
+\tl_new:N \l__sjtu_info_subject_tl
+\clist_new:N \l__sjtu_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__sjtu_info_subject_tl ,
+    keywords       .clist_set:N = \l__sjtu_info_keywords_clist ,
+  }
+\file_input:n { sjtu-lang-generic- \g__sjtu_lang_tl .def }
+\file_input:n { sjtu-scheme- \g__sjtu_lang_tl .def }
+\keys_define:nn { sjtu / info }
+  {
+    date    .code:n =
+      {
+        \regex_match:neTF { \d+-\d+-\d+ } {#1}
+          {
+            \tl_set:Nx \@date
+              {
+                \exp_last_unbraced:ce
+                  { __sjtu_date_aux_ \g__sjtu_lang_tl :w } #1 \q_stop
+              }
+          }
+          {
+            \regex_match:neT { \d+-\d+ } {#1}
+              {
+                \tl_set:Nx \@date
+                  {
+                    \exp_last_unbraced:ce
+                      { __sjtu_date_aux_short_ \g__sjtu_lang_tl :w } #1 \q_stop
+                  }
+              }
+          }
+      } ,
+    date .initial:x =
+      {
+        \int_to_arabic:n { \c_sys_year_int  } -
+        \int_to_arabic:n { \c_sys_month_int } -
+        \int_to_arabic:n { \c_sys_day_int   }
+      }
+  }
+\tl_set:NV \today \@date
+\keys_define:nn { sjtu / style }
+  {
+    keywords-format       .choice: ,
+    keywords-format / plain .code:n =
+      { \cs_set:Nn \__sjtu_keywords_format:n { \noindent  { \bfseries ##1 } } } ,
+    keywords-format / hang  .code:n =
+      { \cs_set:Nn \__sjtu_keywords_format:n { \@hangfrom { \bfseries ##1 } } } ,
+    keywords-format      .initial:n = { plain }
+  }
+\bool_if:NT \g__sjtu_titlepage_bool
+  { \__sjtu_appto_cmd:Nn \abstract { \par } }
+\__sjtu_preto_cmd:Nn \endabstract
+  {
+    \clist_if_empty:NF \l__sjtu_info_keywords_clist
+      {
+        \par \mode_leave_vertical: \par
+        \__sjtu_keywords_format:n
+          {
+            \c__sjtu_name_keywords_tl
+            \c__sjtu_name_info_sep_tl
+          }
+        \clist_use:NV \l__sjtu_info_keywords_clist \c__sjtu_name_item_sep_tl
+        \par
+      }
+  }
+\DeclareDocumentCommand \tableofcontents { s }
+  {
+    \IfBooleanTF {#1}
+      { \SJTU at head* { \contentsname } }
+      { \SJTU at head  { \contentsname } }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \@starttoc { toc }
+    \group_end:
+  }
+\NewDocumentCommand \SJTU at listof { m m s }
+  {
+    \IfBooleanTF {#3}
+      { \SJTU at head* {#1} }
+      { \SJTU at head  {#1} }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \exp_args:Nv \@starttoc { ext@ #2 }
+    \group_end:
+  }
+\DeclareDocumentCommand \listoffigures { }
+  { \SJTU at listof { \listfigurename } { figure } }
+\DeclareDocumentCommand \listoftables  { }
+  { \SJTU at listof { \listtablename  } { table  } }
+\tl_set:Nn \cftdotsep { 0.5 }
+\clist_set:Nn \l__sjtu_cft_presnum_clist
+  {
+    { fig } { \figurename } ,
+    { tab } { \tablename  }
+  }
+\cs_new:Npn \__sjtu_update_cft_presnum:nn #1#2
+  {
+    \tl_set:cn { cft #1 presnum } { #2 \c_space_tl }
+    \skip_zero:c { cft #1 indent }
+    \skip_set:cn { cft #1 numwidth } { 1.8 em }
+    \__sjtu_skip_add_to_wd:cv { cft #1 numwidth } { cft #1 presnum }
+  }
+\ctex_at_end_preamble:n
+  {
+    \clist_map_inline:Nn \l__sjtu_cft_presnum_clist
+      { \__sjtu_update_cft_presnum:nn #1 }
+  }
+\NewDocumentCommand \sjtusetup { } { \keys_set:nn { sjtu } }
+\keys_define:nn { sjtu }
+  {
+    style .meta:nn = { sjtu / style } {#1} ,
+    info  .meta:nn = { sjtu / info  } {#1} ,
+    name  .meta:nn = { sjtu / name  } {#1}
+  }
+\NewDocumentCommand \subject  { m }
+  { \keys_set:nn { sjtu / info } { subject  = {#1} } }
+\NewDocumentCommand \keywords { m }
+  { \keys_set:nn { sjtu / info } { keywords = {#1} } }
+\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__sjtu_bookmark_int
+    \cs_gset_protected:Npn \__sjtu_pdf_bookmark:nn #1#2
+      {
+        \phantomsection
+        \int_gincr:N \g__sjtu_bookmark_int
+        \pdfbookmark [#1] {#2}
+          { sjtubookmark. \int_use:N \g__sjtu_bookmark_int }
+      }
+    \cs_gset_eq:NN \__sjtu_phantom_section: \phantomsection
+    \pdfstringdefDisableCommands
+      {
+        \cs_set_eq:NN \\       \prg_do_nothing:
+        \cs_set_eq:NN \quad    \c_empty_tl
+        \cs_set_eq:NN \qquad   \c_empty_tl
+        \cs_set_eq:NN \hspace  \use_none:n
+      }
+    \ctex_after_end_preamble:n
+      {
+        \hypersetup
+          {
+            pdftitle    = \@title ,
+            pdfauthor   = \@author ,
+            pdfsubject  = \l__sjtu_info_subject_tl ,
+            pdfkeywords = \l__sjtu_info_keywords_clist
+          }
+      }
+  }
+\ctex_at_end_package:nn { threeparttable }
+  { \tl_put_right:Nn \TPTnoteSettings { \footnotesize } }
+\ctex_at_end_package:nn { longtable }
+  { \AtBeginEnvironment { longtable } { \SJTU at style@float at font } }
+\cs_new_protected:Nn \__sjtu_new_theorems:
+  {
+    \clist_map_inline:nn
+      {
+        assumption, axiom, conjecture, corollary, definition, example,
+        exercise, lemma, problem, proposition, theorem
+      }
+      { \exp_args:Nnv  \newtheorem  {##1} { c__sjtu_name_ ##1 _tl } }
+    \clist_map_inline:nn
+      { remark, solution }
+      { \exp_args:NNnv \newtheorem* {##1} { c__sjtu_name_ ##1 _tl } }
+  }
+\ctex_at_begin_package:nn { amsthm }
+  {
+    \cs_if_exist:NT \openbox
+      {
+        \cs_new_eq:NN \__sjtu_save_openbox: \openbox
+        \cs_undefine:N \openbox
+      }
+  }
+\ctex_at_end_package:nn { amsthm }
+  {
+    \__sjtu_cs_provide_eq:NN \QED \openbox
+    \cs_if_exist:NT \__sjtu_save_openbox:
+      { \cs_set_eq:NN \openbox \__sjtu_save_openbox: }
+    \tl_set:Nn \qedsymbol { \ensuremath { \QED } }
+    \RenewDocumentEnvironment { proof } { O{ \proofname } }
+      {
+        \par \pushQED { \qed }
+        \normalfont \dim_zero:N \topsep
+        \trivlist
+        \item
+          [
+            \skip_horizontal:N \labelsep
+            \bfseries \CJKsffamily #1 \@addpunct { \enskip }
+          ]
+        \ignorespaces
+      }
+      { \popQED \endtrivlist \@endpefalse }
+    \newtheoremstyle { sjtu }
+      { } { } { \normalfont } { } { \bfseries \CJKsffamily } { } { \ccwd } { }
+    \theoremstyle { sjtu }
+    \__sjtu_new_theorems:
+  }
+\ctex_at_end_package:nn { ntheorem }
+  {
+    \__sjtu_cs_provide_eq:NN \QED \c_empty_tl
+    \theoremheaderfont { \bfseries \CJKsffamily }
+    \theorembodyfont   { \normalfont }
+    \theoremseparator  { \enskip     }
+    \theoremsymbol { \ensuremath { \QED } }
+    \qedsymbol     { \ensuremath { \QED } }
+    \newtheorem* { proof } { \proofname }
+    \theoremsymbol { }
+    \__sjtu_new_theorems:
+  }
+\cs_new_protected:Npn \__sjtu_newlistof:nnnnn #1#2#3#4#5
+  {
+    \exp_args:Nnv \newlistentry {#2} { ext@ #3 } { 0 }
+    \exp_args:Ne \newcounter { \tl_use:c { ext@ #3 } depth }
+    \exp_args:Ne \setcounter { \tl_use:c { ext@ #3 } depth } { 1 }
+    \clist_put_right:Nn \l__sjtu_cft_presnum_clist { {#2} {#4} }
+    \cs_set_eq:cc { l@ #3 } { l@ #2 }
+    \exp_args:Nc \DeclareDocumentCommand { listof #1 s } { }
+      { \SJTU at listof {#5} {#3} }
+  }
+\ctex_at_end_package:nn { algorithm }
+  {
+    \tl_set:Nn \fname at algorithm   { \SJTU at algorithmname     }
+    \tl_set:Nn \listalgorithmname { \SJTU at listalgorithmname }
+    \__sjtu_newlistof:nnnnn { algorithm } { alg } { algorithm }
+      { \fname at algorithm } { \listalgorithmname }
+  }
+\ctex_at_end_package:nn { algorithm2e }
+  {
+    \SetAlgorithmName { \SJTU at algorithmname     }
+                      { \SJTU at algorithmname     }
+                      { \SJTU at listalgorithmname }
+    \SetAlgoCaptionSeparator { \enskip }
+    \__sjtu_newlistof:nnnnn { algorithm } { alg } { algocf }
+      { \algorithmcfname } { \listalgorithmcfname }
+    \ctex_patch_cmd:Nnn \algocf at latexcaption
+      { \addcontentsline }
+      { \caption at iflist { \addcontentsline } { \@gobblethree } }
+  }
+\ctex_at_end_package:nn { nomencl }
+  { \tl_set:Nn \nomname { \SJTU at nomname } }
+\ctex_at_end_package:nn { translations }
+  {
+    \DeclareLanguage { chinese }
+    \DeclareLanguageAlias { Chinese } { chinese }
+  }
+\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
+              }
+          }
+      }
+  }
+\endinput
+%%
+%% End of file `sjtuarticle.cls'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuarticle.cls
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/sjtureport.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/sjtureport.cls	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/sjtureport.cls	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,1108 @@
+%%
+%% This is file `sjtureport.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `class,report')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\providecommand\IfFormatAtLeastTF{\@ifl at t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}
+ {\PackageError{sjtutex}
+   {Your LaTeX format is outdated!\MessageBreak\MessageBreak
+    Release `2020/10/01' or newer is required to\MessageBreak
+    compile this document.\MessageBreak\MessageBreak
+    Please update your TeX distribution}{}}
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Report document class for Shanghai Jiao Tong University (SJTUTeX)}
+\ProvidesExplClass{sjtureport}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\dim_new:N \l__sjtu_tmp_dim
+\skip_new:N \l__sjtu_tmp_skip
+\box_new:N \l__sjtu_tmp_box
+\tl_new:N \g__sjtu_lang_tl
+\tl_const:Nn \c__sjtu_lang_de_tl { de }
+\tl_const:Nn \c__sjtu_lang_ja_tl { ja }
+\tl_new:N \g__sjtu_zihao_tl
+\int_new:N \g__sjtu_font_size_int
+\dim_new:N \g__sjtu_font_size_dim
+\dim_new:N \g__sjtu_baseline_skip_dim
+\bool_new:N \g__sjtu_fixed_baselineskip_bool
+\fp_new:N \g__sjtu_line_spread_fp
+\tl_new:N \g__sjtu_text_font_tl
+\tl_new:N \g__sjtu_math_font_tl
+\tl_new:N \g__sjtu_cjk_font_tl
+\bool_new:N \g__sjtu_slanted_uppercase_greek_bool
+\bool_new:N \g__sjtu_upright_integral_bool
+\bool_new:N \g__sjtu_integral_limits_bool
+\clist_new:N \g__sjtu_math_font_options_clist
+\clist_set:Nn \g__sjtu_options_to_ctex_class_clist
+  { a4paper, UTF8, scheme = plain, fontset = none }
+\clist_new:N \g__sjtu_options_to_packages_clist
+\bool_new:N \g__sjtu_twoside_bool
+\bool_set_false:N \g__sjtu_twoside_bool
+\bool_new:N \g__sjtu_openright_bool
+\bool_set_false:N \g__sjtu_openright_bool
+\bool_new:N \g__sjtu_titlepage_bool
+\bool_set_true:N \g__sjtu_titlepage_bool
+\bool_new:N \g__sjtu_draft_bool
+\cs_new_protected:Npn \__sjtu_deprecated_option:n
+  { \msg_warning:nnn { sjtutex } { deprecated-option } }
+\cs_new_protected:Npn \__sjtu_set_deprecated_option:n #1
+  {
+    \__sjtu_deprecated_option:n { Option~ `#1'~ is~ set. }
+    \keys_set:nn { sjtu / option } {#1}
+  }
+\msg_new:nnn { sjtutex } { deprecated-option }
+  { Option~ `\l_keys_key_tl'~ is~ deprecated. \\ #1 }
+\keys_define:nn { sjtu / option }
+  {
+    lang .choice: ,
+    lang .value_required:n = true ,
+    lang .choices:nn =
+      { zh, en, de, ja }
+      {
+        \tl_gset_eq:NN \g__sjtu_lang_tl \l_keys_choice_tl
+      } ,
+    lang .initial:n = { zh } ,
+    zihao .choice: ,
+    zihao .value_required:n = true ,
+    zihao /  5 .code:n =
+      {
+        \tl_gset:Nn  \g__sjtu_zihao_tl {#1}
+        \int_gset:Nn \g__sjtu_font_size_int { 1 }
+        \dim_gset:Nn \g__sjtu_font_size_dim { 10.5 bp }
+      } ,
+    zihao / -4 .code:n =
+      {
+        \tl_gset:Nn  \g__sjtu_zihao_tl {#1}
+        \int_gset:Nn \g__sjtu_font_size_int { 2 }
+        \dim_gset:Nn \g__sjtu_font_size_dim { 12   bp }
+      } ,
+    zihao .initial:n = { -4 } ,
+    linespread .fp_gset:N = \g__sjtu_line_spread_fp ,
+    linespread .initial:n = { \c_nan_fp } ,
+    linespread .value_required:n = true ,
+    baselineskip .choice: ,
+    baselineskip .value_required:n = true ,
+    baselineskip / false   .code:n =
+      { \bool_gset_false:N \g__sjtu_fixed_baselineskip_bool } ,
+    baselineskip / unknown .code:n =
+      {
+        \bool_gset_true:N  \g__sjtu_fixed_baselineskip_bool
+        \dim_gset:Nn \g__sjtu_baseline_skip_dim {#1}
+      } ,
+    baselineskip .initial:n = { false } ,
+    text-font .tl_gset:N = \g__sjtu_text_font_tl ,
+    text-font .initial:n = { newtx } ,
+    math-font .tl_gset:N = \g__sjtu_math_font_tl ,
+    cjk-font  .tl_gset:N = \g__sjtu_cjk_font_tl ,
+    fontset .code:n = { \__sjtu_set_deprecated_option:n { cjk-font = #1 } } ,
+    math-style .choice: ,
+    math-style .value_required:n = true,
+    math-style / TeX .code:n =
+      {
+        \bool_gset_false:N \g__sjtu_slanted_uppercase_greek_bool
+        \bool_gset_false:N \g__sjtu_upright_integral_bool
+        \bool_gset_false:N \g__sjtu_integral_limits_bool
+      } ,
+    math-style / ISO .code:n =
+      {
+        \bool_gset_true:N \g__sjtu_slanted_uppercase_greek_bool
+        \bool_gset_true:N \g__sjtu_upright_integral_bool
+        \bool_gset_true:N \g__sjtu_integral_limits_bool
+      } ,
+    math-style .initial:n = { ISO } ,
+    uppercase-greek .choice: ,
+    uppercase-greek .value_required:n = true ,
+    uppercase-greek / slanted .code:n =
+      { \bool_gset_true:N  \g__sjtu_slanted_uppercase_greek_bool } ,
+    uppercase-greek / upright .code:n =
+      { \bool_gset_false:N \g__sjtu_slanted_uppercase_greek_bool } ,
+    integral .choice: ,
+    integral .value_required:n = true ,
+    integral / slanted .code:n =
+      { \bool_gset_false:N \g__sjtu_upright_integral_bool } ,
+    integral / upright .code:n =
+      { \bool_gset_true:N  \g__sjtu_upright_integral_bool } ,
+    integral-limits .choice: ,
+    integral-limits .value_required:n = true ,
+    integral-limits / false .code:n =
+      { \bool_gset_false:N \g__sjtu_integral_limits_bool } ,
+    integral-limits / true  .code:n =
+      { \bool_gset_true:N  \g__sjtu_integral_limits_bool } ,
+    oneside .value_forbidden:n = true,
+    twoside .value_forbidden:n = true,
+    oneside .code:n =
+      { \bool_gset_false:N \g__sjtu_twoside_bool } ,
+    twoside .code:n =
+      { \bool_gset_true:N  \g__sjtu_twoside_bool } ,
+    openany   .value_forbidden:n = true,
+    openright .value_forbidden:n = true,
+    openany   .code:n =
+      { \bool_gset_false:N \g__sjtu_openright_bool } ,
+    openright .code:n =
+      { \bool_gset_true:N  \g__sjtu_openright_bool } ,
+    titlepage   .value_forbidden:n = true,
+    notitlepage .value_forbidden:n = true,
+    titlepage   .code:n =
+      { \bool_gset_true:N  \g__sjtu_titlepage_bool } ,
+    notitlepage .code:n =
+      { \bool_gset_false:N \g__sjtu_titlepage_bool } ,
+    draft .value_forbidden:n = true,
+    final .value_forbidden:n = true,
+    draft .code:n =
+      { \bool_gset_true:N  \g__sjtu_draft_bool } ,
+    final .code:n =
+      { \bool_gset_false:N \g__sjtu_draft_bool } ,
+    unknown .code:n = { \msg_error:nn { sjtutex } { unknown-option } }
+  }
+\msg_new:nnn { sjtutex } { unknown-option }
+  { Class~ option~ "\l_keys_key_tl"~ is~ unknown. }
+\cs_if_exist:NTF \ProcessKeyOptions
+  { \ProcessKeyOptions [ sjtu / option ] }
+  {
+    \RequirePackage { l3keys2e }
+    \ProcessKeysOptions { sjtu / option }
+  }
+\bool_if:NF \g__sjtu_fixed_baselineskip_bool
+  {
+    \fp_if_nan:nT { \g__sjtu_line_spread_fp }
+      { \fp_set:Nn \g__sjtu_line_spread_fp { 1.3 } }
+  }
+\clist_set:Nx \g__sjtu_math_font_options_clist
+  {
+    \bool_if:NT \g__sjtu_slanted_uppercase_greek_bool
+      { slantedGreek } ,
+    \bool_if:NT \g__sjtu_upright_integral_bool
+      { upint }
+  }
+\clist_put_right:Nx \@classoptionslist
+  {
+    a4paper ,
+    \tl_if_eq:NNT \g__sjtu_lang_tl \c__sjtu_lang_de_tl
+      { german, ngerman } ,
+    \bool_if:NT \g__sjtu_integral_limits_bool
+      { intlimits } ,
+    \g__sjtu_math_font_options_clist
+  }
+\clist_put_right:Nx \g__sjtu_options_to_ctex_class_clist
+  {
+    zihao      = \g__sjtu_zihao_tl ,
+    \fp_if_nan:nF { \g__sjtu_line_spread_fp }
+      { linespread = \fp_use:N \g__sjtu_line_spread_fp } ,
+    \bool_if:NTF \g__sjtu_twoside_bool
+      { twoside   } { oneside     } ,
+    \bool_if:NTF \g__sjtu_openright_bool
+      { openright } { openany     } ,
+    \bool_if:NTF \g__sjtu_titlepage_bool
+      { titlepage } { notitlepage } ,
+    \bool_if:NTF \g__sjtu_draft_bool
+      { draft     } { final       }
+  }
+\exp_args:No \PassOptionsToClass
+  { \g__sjtu_options_to_ctex_class_clist }
+  { ctexrep }
+\clist_set:Nx \g__sjtu_options_to_packages_clist
+  {
+    { no-math           } { fontspec     } ,
+    { titles            } { tocloft      } ,
+    { list = off        } { bicaption    } ,
+    { warnings-off =
+      {
+        mathtools-overbracket,
+        mathtools-colon
+      }
+    }                     { unicode-math } ,
+    { amsmath, thmmarks } { ntheorem     } ,
+    { chapter           } { algorithm    } ,
+    { algochapter       } { algorithm2e  } ,
+    {
+      \bool_if:NTF \g__sjtu_integral_limits_bool
+        { displaylimits } { nolimits }
+    }                     { cmupint      }
+  }
+\clist_map_inline:Nn \g__sjtu_options_to_packages_clist
+  { \PassOptionsToPackage #1 }
+\LoadClass { ctexrep }
+\RequirePackage
+  {
+    mathtools,
+    geometry,
+    fancyhdr,
+    tocloft,
+    caption,
+    bicaption,
+    subcaption,
+    xcolor,
+    graphicx,
+    enumitem
+  }
+\cs_generate_variant:Nn \cs_gset:Npn { cpo }
+\cs_generate_variant:Nn \tl_const:Nn { Nv }
+\cs_generate_variant:Nn \clist_use:Nn { NV, cv }
+\exp_args_generate:n { Nnv }
+\cs_generate_variant:Nn \exp_last_unbraced:Ne { ce }
+\prg_generate_conditional_variant:Nnn \regex_match:nn { ne } { T, TF }
+\cs_new:Npx \__sjtu_engine_case:nn #1#2
+  {
+    \bool_lazy_or:nnTF
+      { \sys_if_engine_xetex_p:  }
+      { \sys_if_engine_luatex_p: }
+      {#2}
+      { \sys_if_engine_pdftex:T {#1} }
+  }
+\cs_new:Npx \__sjtu_engine_case:nnn #1#2#3
+  {
+    \sys_if_engine_xetex:TF
+      {#2}
+      {
+        \sys_if_engine_luatex:TF
+          {#3}
+          { \sys_if_engine_pdftex:T {#1} }
+      }
+  }
+\cs_new:Npx \__sjtu_unicode_engine_case:nn #1#2
+  {
+    \sys_if_engine_xetex:TF
+      {#1}
+      { \sys_if_engine_luatex:T {#2} }
+  }
+\__sjtu_engine_case:nn
+  {
+    \cs_new:Npn \__sjtu_unicode_char:n #1
+      {
+        \exp_not:N \Unicode
+          { \int_div_truncate:nn {#1} { 256 } }
+          { \int_mod:nn          {#1} { 256 } }
+      }
+  }
+  { \cs_new:Npn \__sjtu_unicode_char:n #1 { \tex_Uchar:D #1 \scan_stop: } }
+\cs_new_protected:Npn \__sjtu_preto_cmd:Nn #1#2
+  {
+    \ctex_preto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \__sjtu_appto_cmd:Nn #1#2
+  {
+    \ctex_appto_cmd:NnnTF #1 { } {#2}
+      { } { \ctex_patch_failure:N #1 }
+  }
+\cs_new:Npn \__sjtu_skip_add_to_wd:Nn #1#2
+  {
+    \hbox_set:Nn \l__sjtu_tmp_box {#2}
+    \skip_add:Nn #1 { \box_wd:N \l__sjtu_tmp_box }
+  }
+\cs_generate_variant:Nn \__sjtu_skip_add_to_wd:Nn { cv }
+\cs_new:Npn \__sjtu_cs_provide_eq:NN #1#2
+  { \cs_if_exist:NF #1 { \cs_set_eq:NN #1 #2 } }
+\cs_generate_variant:Nn \__sjtu_cs_provide_eq:NN { cc }
+\cs_new_protected:Npn \__sjtu_define_name:nn #1#2
+  { \tl_const:cn { c__sjtu_name_ #1 _tl } {#2} }
+\cs_new_protected:Npn \__sjtu_define_name:nnn #1#2#3
+  { \tl_const:cn { c__sjtu_name_ #2 _ #1 _tl } {#3} }
+\cs_new_protected:Npn \__sjtu_define_symbol:nn #1#2
+  { \tl_const:cx { c__sjtu_symbol_ #1 _tl } { \__sjtu_unicode_char:n {#2} } }
+\cs_new_protected:Npn \__sjtu_set_font_size:nnNn #1#2#3#4
+  { \cs_set_protected:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
+\tl_set:Nx \l__sjtu_font_size_tl
+  {
+    { \dim_to_decimal:n { \g__sjtu_font_size_dim     } }
+    { \dim_to_decimal:n { \g__sjtu_baseline_skip_dim } }
+  }
+\bool_if:NT \g__sjtu_fixed_baselineskip_bool
+  {
+    \int_case:nn { \g__sjtu_font_size_int }
+      {
+        { 1 } {
+                \exp_after:wN \__sjtu_set_font_size:nnNn \l__sjtu_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
+                  }
+              }
+        { 2 } {
+                \exp_after:wN \__sjtu_set_font_size:nnNn \l__sjtu_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
+  }
+\NewDocumentCommand \setbaselineskip { m }
+  { \fontsize { \f at size } {#1} \selectfont }
+\cs_new_protected:Npn \__sjtu_fontset_error:nn #1#2
+  { \msg_error:nnnn { sjtutex } { font-unavailable } {#1} {#2} }
+\msg_new:nnn { sjtutex } { font-unavailable }
+  { `#1-font~ =~ #2'~ is~ unavailable~ in~ current~ mode. }
+\cs_new_eq:NN \__sjtu_fontset_case:nn \__sjtu_engine_case:nn
+\cs_new:Npx \__sjtu_fontset_case:nnn #1#2#3
+  {
+    \__sjtu_engine_case:nn
+      { \sys_if_output_pdf:TF {#1} {#2} }
+      {#3}
+  }
+\cs_new_protected:Nn \__sjtu_declare_math_symbol:nnNn
+  {
+    \cs_undefine:N #3
+    \DeclareMathSymbol {#3} {#1} {#2} {#4}
+  }
+\cs_new_protected:Nn \__sjtu_set_slanted_greek:
+  {
+    \clist_const:Nn \c__sjtu_uppercase_greek_clist
+      { Gamma, Delta, Theta, Lambda, Xi, Pi, Sigma, Upsilon, Phi, Psi, Omega }
+    \clist_map_inline:Nn \c__sjtu_uppercase_greek_clist
+      {
+        \cs_set_eq:cc { up ##1 } {     ##1 }
+        \cs_set_eq:cc { it ##1 } { var ##1 }
+      }
+    \bool_if:NT \g__sjtu_slanted_uppercase_greek_bool
+      {
+        \clist_map_inline:Nn \c__sjtu_uppercase_greek_clist
+          { \cs_set_eq:cc { ##1 } { it ##1 } }
+      }
+  }
+\cs_new_protected:Nn \__sjtu_set_unimath_symbol:
+  {
+    \clist_map_inline:nn
+      {
+        { increment } { upDelta     } ,
+        { QED       } { blacksquare }
+      }
+      { \__sjtu_cs_provide_eq:cc ##1 }
+  }
+\tl_if_empty:NT \g__sjtu_math_font_tl
+  { \tl_gset_eq:NN \g__sjtu_math_font_tl \g__sjtu_text_font_tl }
+\tl_if_empty:NT \g__sjtu_cjk_font_tl
+  {
+    \sys_if_platform_windows:TF
+      { \tl_gset:Nn \g__sjtu_cjk_font_tl { windows } }
+      {
+        \ctex_if_platform_macos:TF
+          { \tl_gset:Nn \g__sjtu_cjk_font_tl { mac    } }
+          { \tl_gset:Nn \g__sjtu_cjk_font_tl { fandol } }
+      }
+  }
+\cs_new_protected:Npn \__sjtu_load_font:nn #1#2
+  {
+    \str_if_eq:eeF { \tl_use:c { g__sjtu_ #1 _font_tl } } { none }
+      {
+        \file_if_exist:nF
+          { sjtu- #1 -font- \tl_use:c { g__sjtu_ #1 _font_tl } .def }
+          {
+            \msg_warning:nnnn { sjtutex } { invalid-font } {#1} {#2}
+            \tl_gset:cn { g__sjtu_ #1 _font_tl } {#2}
+          }
+        \ctex_file_input:n
+          { sjtu- #1 -font- \tl_use:c { g__sjtu_ #1 _font_tl } .def }
+      }
+  }
+\msg_new:nnn { sjtutex } { invalid-font }
+  {
+    Invalid~ value~ `#1-font~ =~ \tl_use:c { g__sjtu_ #1 _font_tl }~ '! \\\\
+    Using~ `#2'~ instead.
+  }
+\cs_new_protected:Nn \__sjtu_load_fontset:
+  {
+    \clist_map_inline:nn
+      {
+        { math } { newtx  },
+        { text } { newtx  },
+        { cjk  } { fandol }
+      }
+      { \__sjtu_load_font:nn ##1 }
+  }
+\@onlypreamble \__sjtu_load_font:nn
+\@onlypreamble \__sjtu_load_fontset:
+\ctex_at_end_package:nn { unicode-math }
+  {
+    \DeclareDocumentCommand \bm { m }
+      { { \symbf {#1} } }
+    \DeclareDocumentCommand \boldsymbol { m }
+      { { \symbf {#1} } }
+    \bool_if:NTF \g__sjtu_slanted_uppercase_greek_bool
+      { \keys_set:nn { unicode-math } { math-style = ISO } }
+      { \keys_set:nn { unicode-math } { math-style = TeX } }
+    \bool_if:NTF \g__sjtu_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
+      }
+  }
+\ctex_at_end_preamble:n
+  {
+    \@ifpackageloaded { unicode-math }
+      { } { \RequirePackage { bm } }
+  }
+\NewDocumentCommand \CJKrmfamily { } { \CJKfamily { \CJKrmdefault } }
+\NewDocumentCommand \CJKsffamily { } { \CJKfamily { \CJKsfdefault } }
+\NewDocumentCommand \CJKttfamily { } { \CJKfamily { \CJKttdefault } }
+\__sjtu_unicode_engine_case:nn
+  {
+    \xeCJK_declare_char_class:nn { CJK }
+      { "24EA, "2460->"2473, "3251->"32BF, "25A1 }
+  }
+  {
+    \ltjdefcharrange { 99 }
+      { "24EA, "2460-"2473, "3251-"32BF, "25A1 }
+    \ltjsetparameter { jacharrange = { +99 } }
+  }
+\__sjtu_load_fontset:
+\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} } ,
+    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 ,
+    chapter        .tl_set:N = \chaptername ,
+    figure*        .tl_set:N = \SJTU at figurename@bi at second ,
+    figure*       .initial:n = { 图 } ,
+    table*         .tl_set:N = \SJTU at tablename@bi at second ,
+    table*        .initial:n = { 表 } ,
+    algorithm      .tl_set:N = \SJTU at algorithmname ,
+    algorithm     .initial:n = { Algorithm } ,
+    listalgorithm  .tl_set:N = \SJTU at listalgorithmname ,
+    listalgorithm .initial:n = { List~of~Algorithms } ,
+  }
+\file_input:n { sjtu-name-generic- \g__sjtu_lang_tl .def }
+\geometry
+  {
+    top           = 3.5 cm,
+    bottom        = 4.0 cm,
+    left          = 2.5 cm,
+    right         = 2.5 cm,
+    headheight    = 1.5 cm,
+    headsep       = 0.5 cm,
+    footskip      = 1.0 cm
+  }
+\pagestyle { fancy }
+\fancyhf { }
+\keys_define:nn { sjtu / style }
+  {
+    header-font  .tl_set:N = \l__sjtu_style_header_font_tl ,
+    header-font .initial:n = \zihao { -5 } \sffamily ,
+    footer-font  .tl_set:N = \l__sjtu_style_footer_font_tl ,
+    footer-font .initial:n = \zihao { -5 }
+  }
+\fancyheadinit { \l__sjtu_style_header_font_tl }
+\fancyfootinit { \l__sjtu_style_footer_font_tl }
+\keys_define:nn { sjtu / style }
+  {
+    header-uppercase       .choice: ,
+    header-uppercase / true  .code:n =
+      { \cs_set_eq:NN \__sjtu_nouppercase:n \use:n                 } ,
+    header-uppercase / false .code:n =
+      { \cs_set:Nn    \__sjtu_nouppercase:n { \nouppercase {##1} } } ,
+    header-uppercase      .default:n = { true  } ,
+    header-uppercase      .initial:n = { false }
+  }
+\cs_generate_variant:Nn \__sjtu_nouppercase:n { V }
+\cs_new:Nn \__sjtu_thepage: { \thepage }
+\keys_define:nn { sjtu / style }
+  {
+    page-number .cs_set:Np = \__sjtu_page:n #1 ,
+    page-number .initial:n = { {#1} }
+  }
+\tl_set:Nn \l__sjtu_header_tl
+  {
+    \includegraphics [ height = 1.2 cm ]
+      { sjtu-vi-logo-small-red.pdf }
+  }
+\tl_set:Nn \l__sjtu_leftmark_tl  { \l__sjtu_info_subject_tl }
+\tl_set:Nn \l__sjtu_rightmark_tl { \leftmark }
+\bool_if:NTF \g__sjtu_twoside_bool
+  {
+    \fancyhead [ LO, RE ] { \l__sjtu_header_tl }
+    \fancyhead [ LE ]     { \__sjtu_nouppercase:V \l__sjtu_leftmark_tl  }
+    \fancyhead [ RO ]     { \__sjtu_nouppercase:V \l__sjtu_rightmark_tl }
+  }
+  {
+    \fancyhead [ L ] { \l__sjtu_header_tl }
+    \fancyhead [ R ] { \__sjtu_nouppercase:V \l__sjtu_rightmark_tl }
+  }
+\fancyfoot [ C ] { \__sjtu_page:n { \__sjtu_thepage: } }
+\bool_if:NTF \g__sjtu_twoside_bool
+  {
+    \fancypagestyle { plain }
+      {
+        \fancyhead [ LE, RO ] { }
+        \tl_set:Nn \headrulewidth { 0 pt }
+      }
+  }
+  {
+    \fancypagestyle { plain }
+      {
+        \fancyhead [ R ] { }
+        \tl_set:Nn \headrulewidth { 0 pt }
+      }
+  }
+\cs_new_eq:NN \ps at SJTU@null \prg_do_nothing:
+\RenewDocumentCommand \cleardoublepage { }
+  {
+    \clearpage
+    \bool_if:NT \g__sjtu_twoside_bool
+      {
+        \int_if_odd:nF \c at page
+          { \hbox:n { } \thispagestyle { empty } \newpage }
+      }
+  }
+\ctex_set:nn { chapter }
+  {
+    pagestyle   = SJTU at null ,
+    fixskip     = true ,
+    beforeskip  = 30 pt ,
+    afterskip   = 24 pt ,
+    format      = \Large \bfseries \CJKsffamily \centering ,
+    nameformat  = ,
+    titleformat = ,
+    lofskip     = \c_zero_skip ,
+    lotskip     = \c_zero_skip ,
+    aftername   = \quad
+  }
+\ctex_set:nn { section }
+  { format = \large \bfseries \CJKsffamily }
+\ctex_set:nn { subsection }
+  { format = \normalsize \bfseries \CJKsffamily }
+\ctex_set:nn { subsubsection }
+  { format = \normalsize \normalfont }
+\ctex_set:n { secnumdepth = 3 }
+\keys_define:nn { sjtu / style }
+  {
+    indent-first    .choice: ,
+    indent-first   .choices:nn =
+      { true, false }
+      {
+        \clist_map_inline:nn
+          {
+            chapter,
+            section, subsection, subsubsection,
+            paragraph, subparagraph
+          }
+          { \ctex_set:nn {####1} { afterindent = #1 } }
+      } ,
+    indent-first   .default:n = { true } ,
+    indent-first   .initial:n = { true }
+  }
+\NewDocumentCommand \SJTU at head { s O{#3} m O{#2} }
+  {
+    \CTEX at chapter@break
+    \IfBooleanTF {#1}
+      { \tl_if_empty:nF {#4} { \__sjtu_pdf_bookmark:nn { 0 } {#4} } }
+      {
+        \__sjtu_phantom_section:
+        \addcontentsline { toc } { chapter } {#4}
+      }
+    \cs_set_eq:NN \__sjtu_orig_ctex_gettitle:n \CTEX at gettitle
+    \cs_set:Npn \CTEX at gettitle ##1 { \__sjtu_orig_ctex_gettitle:n {#2} }
+    \chapter* {#3}
+    \cs_set_eq:NN \CTEX at gettitle \__sjtu_orig_ctex_gettitle:n
+    \@mkboth { \MakeUppercase {#2} } { \MakeUppercase {#2} }
+  }
+\cs_new_eq:NN \__sjtu_pdf_bookmark:nn \use_none:nn
+\cs_new_eq:NN \__sjtu_phantom_section: \prg_do_nothing:
+\setlist { nosep }
+\keys_define:nn { sjtu / style }
+  {
+    equation-font  .tl_set:N = \SJTU at style@equation at font ,
+    equation-font .initial:V = \c_empty_tl
+  }
+\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 at style@equation at font } }
+\clist_map_inline:nn
+  { \start at gather, \start at align, \start at multline }
+  {
+    \ctex_patch_cmd:Nnn #1
+      { \collect at body }
+      {
+        \SJTU at style@equation at font
+        \collect at body
+      }
+  }
+\ctex_patch_cmd:Nnn \gather at split
+  { \spread at equation }
+  {
+    \SJTU at style@equation at font
+    \spread at equation
+  }
+\tl_set:Nn \textfraction      { 0.15 }
+\tl_set:Nn \topfraction       { 0.85 }
+\tl_set:Nn \bottomfraction    { 0.65 }
+\tl_set:Nn \floatpagefraction { 0.60 }
+\keys_define:nn { sjtu / style }
+  {
+    float-font  .tl_set:N = \SJTU at style@float at font ,
+    float-font .initial:n = \zihao { 5 }
+  }
+\ctex_patch_cmd:Nnn \@floatboxreset
+  { \normalsize } { \SJTU at style@float at font }
+\keys_define:nn { sjtu / style }
+  {
+    caption-font       .code:n =
+      { \DeclareCaptionFont { normalsize    } {#1} } ,
+    caption-font    .initial:n = \zihao { 5 } \bfseries ,
+    subcaption-font    .code:n =
+      { \DeclareCaptionFont { SJTU at sub@font } {#1} } ,
+    subcaption-font .initial:n = \zihao { 5 } \normalfont
+  }
+\captionsetup
+  {
+    bi-slc   = off ,
+    labelsep = quad ,
+  }
+\captionsetup [ sub ]
+  {
+    bi-slc   = on ,
+    font     = SJTU at sub@font ,
+    format   = hang
+  }
+\DeclareCaptionOption { bi-second-names } [ ]
+  {
+    \tl_set:Nn \figurename { \SJTU at figurename@bi at second }
+    \tl_set:Nn \tablename  { \SJTU at tablename@bi at second  }
+  }
+\captionsetup [ bi-second ] { bi-second-names }
+\keys_define:nn { sjtu / style }
+  {
+    num-sep            .code:n =
+      {
+        \tl_set:Nn \SJTU at style@fl at num@sep {#1}
+        \tl_set:Nn \SJTU at style@eq at num@sep {#1}
+        \tl_set:Nn \@thmcountersep        {#1}
+      } ,
+    num-sep         .initial:n = { . } ,
+    float-num-sep    .tl_set:N = \SJTU at style@fl at num@sep ,
+    equation-num-sep .tl_set:N = \SJTU at style@eq at num@sep ,
+    theorem-num-sep  .tl_set:N = \@thmcountersep
+  }
+\NewDocumentCommand \SJTU at counterwithin
+  { s O{ \SJTU at style@fl at num@sep } O{ \arabic } m m }
+  {
+    \@ifbothcounters {#4} {#5}
+      {
+        \@addtoreset {#4} {#5}
+        \IfBooleanF {#1}
+          {
+            \cs_gset:cpo { the #4 }
+              { \cs:w the #5 \cs_end: #2 #3 {#4} }
+          }
+      }
+  }
+\SJTU at counterwithin { figure } { chapter }
+\SJTU at counterwithin { table  } { chapter }
+\SJTU at counterwithin [ \SJTU at style@eq at num@sep ] { equation } { chapter }
+\cs_set_eq:NN \__sjtu_makefnmark_plain: \@makefnmark
+\cs_set_eq:NN \__sjtu_thefootnote_plain: \thefootnote
+\cs_set_eq:NN \__sjtu_thempfootnote_plain: \thempfootnote
+\cs_new:Npn \__sjtu_footnote_number:N #1
+  {
+    \int_compare:nNnTF {#1} < { 21 }
+      { \__sjtu_unicode_char:n { \int_eval:n { "2460 - 1 + #1 } } }
+      {
+        \int_compare:nNnTF {#1} < { 36 }
+          { \__sjtu_unicode_char:n { \int_eval:n { "3251 - 21 + #1 } } }
+          {
+            \int_compare:nNnTF {#1} < { 51 }
+              { \__sjtu_unicode_char:n { \int_eval:n { "32B1 - 36 + #1 } } }
+              { \msg_warning:nn { sjtutex } { too-many-footnotes } }
+          }
+      }
+  }
+\msg_new:nnn { sjtutex } { too-many-footnotes }
+  { Too~ many~ footnotes. }
+\cs_new:Nn \__sjtu_makefnmark_circled: { \hbox:n { \@thefnmark } }
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-font           .choice: ,
+    fnmark-font / haranoaji .code:n =
+      {
+        \__sjtu_engine_case:nn
+          { \tl_set_eq:NN \l__sjtu_style_fnmark_font_tl \c_empty_tl }
+          {
+            \tl_set:Nn \l__sjtu_style_fnmark_font_tl
+              {
+                \CJKfontspec { HaranoAjiMincho }
+                  [
+                    Extension   = .otf ,
+                    UprightFont = *-Regular ,
+                    BoldFont    = *-Bold
+                  ]
+              }
+          }
+      } ,
+    fnmark-font / unknown .tl_set:N = \l__sjtu_style_fnmark_font_tl ,
+    fnmark-font          .initial:V = \c_empty_tl
+  }
+\cs_new:Nn \__sjtu_thefootnote_circled:
+  { { \l__sjtu_style_fnmark_font_tl \__sjtu_footnote_number:N \c at footnote } }
+\cs_new:Nn \__sjtu_thempfootnote_circled:
+  { { \l__sjtu_style_fnmark_font_tl \__sjtu_footnote_number:N \c at mpfootnote } }
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-style           .choice: ,
+    fnmark-style / plain   .code:n =
+      {
+        \cs_set_eq:NN \__sjtu_makefnmark: \__sjtu_makefnmark_plain:
+        \cs_set_eq:NN \thefootnote \__sjtu_thefootnote_plain:
+        \cs_set_eq:NN \thempfootnote \__sjtu_thempfootnote_plain:
+      } ,
+    fnmark-style / circled .code:n =
+      {
+        \cs_set_eq:NN \__sjtu_makefnmark: \__sjtu_makefnmark_circled:
+        \cs_set_eq:NN \thefootnote \__sjtu_thefootnote_circled:
+        \cs_set_eq:NN \thempfootnote \__sjtu_thempfootnote_circled:
+      }
+  }
+\ctex_at_end_preamble:n {
+  \cs_set_eq:NN \__sjtu_orig_make_fntext:n \@makefntext
+  \cs_set:Npn \@makefntext #1
+    {
+      \group_begin:
+        \cs_set_eq:NN \@makefnmark \__sjtu_makefnmark:
+        \__sjtu_orig_make_fntext:n {#1}
+      \group_end:
+    }
+}
+\tl_new:N \l__sjtu_info_subject_tl
+\clist_new:N \l__sjtu_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__sjtu_info_subject_tl ,
+    keywords       .clist_set:N = \l__sjtu_info_keywords_clist ,
+  }
+\file_input:n { sjtu-lang-generic- \g__sjtu_lang_tl .def }
+\file_input:n { sjtu-scheme- \g__sjtu_lang_tl .def }
+\keys_define:nn { sjtu / info }
+  {
+    date    .code:n =
+      {
+        \regex_match:neTF { \d+-\d+-\d+ } {#1}
+          {
+            \tl_set:Nx \@date
+              {
+                \exp_last_unbraced:ce
+                  { __sjtu_date_aux_ \g__sjtu_lang_tl :w } #1 \q_stop
+              }
+          }
+          {
+            \regex_match:neT { \d+-\d+ } {#1}
+              {
+                \tl_set:Nx \@date
+                  {
+                    \exp_last_unbraced:ce
+                      { __sjtu_date_aux_short_ \g__sjtu_lang_tl :w } #1 \q_stop
+                  }
+              }
+          }
+      } ,
+    date .initial:x =
+      {
+        \int_to_arabic:n { \c_sys_year_int  } -
+        \int_to_arabic:n { \c_sys_month_int } -
+        \int_to_arabic:n { \c_sys_day_int   }
+      }
+  }
+\tl_set:NV \today \@date
+\keys_define:nn { sjtu / style }
+  {
+    keywords-format       .choice: ,
+    keywords-format / plain .code:n =
+      { \cs_set:Nn \__sjtu_keywords_format:n { \noindent  { \bfseries ##1 } } } ,
+    keywords-format / hang  .code:n =
+      { \cs_set:Nn \__sjtu_keywords_format:n { \@hangfrom { \bfseries ##1 } } } ,
+    keywords-format      .initial:n = { plain }
+  }
+\bool_if:NT \g__sjtu_titlepage_bool
+  { \__sjtu_appto_cmd:Nn \abstract { \par } }
+\__sjtu_preto_cmd:Nn \endabstract
+  {
+    \clist_if_empty:NF \l__sjtu_info_keywords_clist
+      {
+        \par \mode_leave_vertical: \par
+        \__sjtu_keywords_format:n
+          {
+            \c__sjtu_name_keywords_tl
+            \c__sjtu_name_info_sep_tl
+          }
+        \clist_use:NV \l__sjtu_info_keywords_clist \c__sjtu_name_item_sep_tl
+        \par
+      }
+  }
+\DeclareDocumentCommand \tableofcontents { s }
+  {
+    \IfBooleanTF {#1}
+      { \SJTU at head* { \contentsname } }
+      { \SJTU at head  { \contentsname } }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \@starttoc { toc }
+    \group_end:
+  }
+\NewDocumentCommand \SJTU at listof { m m s }
+  {
+    \IfBooleanTF {#3}
+      { \SJTU at head* {#1} }
+      { \SJTU at head  {#1} }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \exp_args:Nv \@starttoc { ext@ #2 }
+    \group_end:
+  }
+\DeclareDocumentCommand \listoffigures { }
+  { \SJTU at listof { \listfigurename } { figure } }
+\DeclareDocumentCommand \listoftables  { }
+  { \SJTU at listof { \listtablename  } { table  } }
+\tl_set:Nn \cftdotsep { 0.5 }
+\tl_set:Nn \cftchapleader { \bfseries \cftdotfill { \cftdotsep } }
+\clist_set:Nn \l__sjtu_cft_presnum_clist
+  {
+    { fig } { \figurename } ,
+    { tab } { \tablename  }
+  }
+\cs_new:Npn \__sjtu_update_cft_presnum:nn #1#2
+  {
+    \tl_set:cn { cft #1 presnum } { #2 \c_space_tl }
+    \skip_zero:c { cft #1 indent }
+    \skip_set:cn { cft #1 numwidth } { 2.8 em }
+    \__sjtu_skip_add_to_wd:cv { cft #1 numwidth } { cft #1 presnum }
+  }
+\ctex_at_end_preamble:n
+  {
+    \clist_map_inline:Nn \l__sjtu_cft_presnum_clist
+      { \__sjtu_update_cft_presnum:nn #1 }
+  }
+\NewDocumentCommand \sjtusetup { } { \keys_set:nn { sjtu } }
+\keys_define:nn { sjtu }
+  {
+    style .meta:nn = { sjtu / style } {#1} ,
+    info  .meta:nn = { sjtu / info  } {#1} ,
+    name  .meta:nn = { sjtu / name  } {#1}
+  }
+\NewDocumentCommand \subject  { m }
+  { \keys_set:nn { sjtu / info } { subject  = {#1} } }
+\NewDocumentCommand \keywords { m }
+  { \keys_set:nn { sjtu / info } { keywords = {#1} } }
+\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__sjtu_bookmark_int
+    \cs_gset_protected:Npn \__sjtu_pdf_bookmark:nn #1#2
+      {
+        \phantomsection
+        \int_gincr:N \g__sjtu_bookmark_int
+        \pdfbookmark [#1] {#2}
+          { sjtubookmark. \int_use:N \g__sjtu_bookmark_int }
+      }
+    \cs_gset_eq:NN \__sjtu_phantom_section: \phantomsection
+    \pdfstringdefDisableCommands
+      {
+        \cs_set_eq:NN \\       \prg_do_nothing:
+        \cs_set_eq:NN \quad    \c_empty_tl
+        \cs_set_eq:NN \qquad   \c_empty_tl
+        \cs_set_eq:NN \hspace  \use_none:n
+      }
+    \ctex_after_end_preamble:n
+      {
+        \hypersetup
+          {
+            pdftitle    = \@title ,
+            pdfauthor   = \@author ,
+            pdfsubject  = \l__sjtu_info_subject_tl ,
+            pdfkeywords = \l__sjtu_info_keywords_clist
+          }
+      }
+  }
+\ctex_at_end_package:nn { threeparttable }
+  { \tl_put_right:Nn \TPTnoteSettings { \footnotesize } }
+\ctex_at_end_package:nn { longtable }
+  { \AtBeginEnvironment { longtable } { \SJTU at style@float at font } }
+\cs_new_protected:Nn \__sjtu_new_theorems:
+  {
+    \clist_map_inline:nn
+      {
+        assumption, axiom, conjecture, corollary, definition, example,
+        exercise, lemma, problem, proposition, theorem
+      }
+      { \exp_args:Nnv  \newtheorem  {##1} { c__sjtu_name_ ##1 _tl } [ chapter ] }
+    \clist_map_inline:nn
+      { remark, solution }
+      { \exp_args:NNnv \newtheorem* {##1} { c__sjtu_name_ ##1 _tl } }
+  }
+\ctex_at_begin_package:nn { amsthm }
+  {
+    \cs_if_exist:NT \openbox
+      {
+        \cs_new_eq:NN \__sjtu_save_openbox: \openbox
+        \cs_undefine:N \openbox
+      }
+  }
+\ctex_at_end_package:nn { amsthm }
+  {
+    \__sjtu_cs_provide_eq:NN \QED \openbox
+    \cs_if_exist:NT \__sjtu_save_openbox:
+      { \cs_set_eq:NN \openbox \__sjtu_save_openbox: }
+    \tl_set:Nn \qedsymbol { \ensuremath { \QED } }
+    \RenewDocumentEnvironment { proof } { O{ \proofname } }
+      {
+        \par \pushQED { \qed }
+        \normalfont \dim_zero:N \topsep
+        \trivlist
+        \item
+          [
+            \skip_horizontal:N \labelsep
+            \bfseries \CJKsffamily #1 \@addpunct { \enskip }
+          ]
+        \ignorespaces
+      }
+      { \popQED \endtrivlist \@endpefalse }
+    \newtheoremstyle { sjtu }
+      { } { } { \normalfont } { } { \bfseries \CJKsffamily } { } { \ccwd } { }
+    \theoremstyle { sjtu }
+    \__sjtu_new_theorems:
+  }
+\ctex_at_end_package:nn { ntheorem }
+  {
+    \__sjtu_cs_provide_eq:NN \QED \c_empty_tl
+    \theoremheaderfont { \bfseries \CJKsffamily }
+    \theorembodyfont   { \normalfont }
+    \theoremseparator  { \enskip     }
+    \theoremsymbol { \ensuremath { \QED } }
+    \qedsymbol     { \ensuremath { \QED } }
+    \newtheorem* { proof } { \proofname }
+    \theoremsymbol { }
+    \__sjtu_new_theorems:
+  }
+\cs_new_protected:Npn \__sjtu_newlistof:nnnnn #1#2#3#4#5
+  {
+    \exp_args:Nnv \newlistentry {#2} { ext@ #3 } { 0 }
+    \exp_args:Ne \newcounter { \tl_use:c { ext@ #3 } depth }
+    \exp_args:Ne \setcounter { \tl_use:c { ext@ #3 } depth } { 1 }
+    \clist_put_right:Nn \l__sjtu_cft_presnum_clist { {#2} {#4} }
+    \cs_set_eq:cc { l@ #3 } { l@ #2 }
+    \exp_args:Nc \DeclareDocumentCommand { listof #1 s } { }
+      { \SJTU at listof {#5} {#3} }
+    \SJTU at counterwithin { #3 } { chapter }
+  }
+\ctex_at_end_package:nn { algorithm }
+  {
+    \tl_set:Nn \fname at algorithm   { \SJTU at algorithmname     }
+    \tl_set:Nn \listalgorithmname { \SJTU at listalgorithmname }
+    \__sjtu_newlistof:nnnnn { algorithm } { alg } { algorithm }
+      { \fname at algorithm } { \listalgorithmname }
+  }
+\ctex_at_begin_package:nn { algorithm2e }
+  { \cs_set_eq:NN \__sjtu_save_chapter:w \@chapter }
+\ctex_at_end_package:nn { algorithm2e }
+  {
+    \cs_set_eq:NN \@chapter \__sjtu_save_chapter:w
+    \SetAlgorithmName { \SJTU at algorithmname     }
+                      { \SJTU at algorithmname     }
+                      { \SJTU at listalgorithmname }
+    \SetAlgoCaptionSeparator { \enskip }
+    \__sjtu_newlistof:nnnnn { algorithm } { alg } { algocf }
+      { \algorithmcfname } { \listalgorithmcfname }
+    \ctex_patch_cmd:Nnn \algocf at latexcaption
+      { \addcontentsline }
+      { \caption at iflist { \addcontentsline } { \@gobblethree } }
+  }
+\ctex_at_end_package:nn { nomencl }
+  { \tl_set:Nn \nomname { \SJTU at nomname } }
+\ctex_at_end_package:nn { translations }
+  {
+    \DeclareLanguage { chinese }
+    \DeclareLanguageAlias { Chinese } { chinese }
+  }
+\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
+              }
+          }
+      }
+  }
+\endinput
+%%
+%% End of file `sjtureport.cls'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/sjtureport.cls
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuthesis.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuthesis.cls	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuthesis.cls	2024-02-18 21:11:54 UTC (rev 69966)
@@ -0,0 +1,1727 @@
+%%
+%% This is file `sjtuthesis.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% sjtutex.dtx  (with options: `class,thesis')
+%% 
+%%     Copyright (C) SJTUG
+%%       2018--2024 Weijian Wu   <alexarawu at outlook.com>
+%%       2022--2024 Zilong Li    <logcreative at outlook.com>
+%% 
+%%     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.
+%% 
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\providecommand\IfFormatAtLeastTF{\@ifl at t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}
+ {\PackageError{sjtutex}
+   {Your LaTeX format is outdated!\MessageBreak\MessageBreak
+    Release `2020/10/01' or newer is required to\MessageBreak
+    compile this document.\MessageBreak\MessageBreak
+    Please update your TeX distribution}{}}
+\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu <alexarawu at outlook.com> $
+  {Thesis document class for Shanghai Jiao Tong University (SJTUTeX)}
+\ProvidesExplClass{sjtuthesis}
+  {\ExplFileDate}{2.1}{\ExplFileDescription}
+\bool_new:N \l__sjtu_tmp_bool
+\clist_new:N \l__sjtu_tmp_clist
+\dim_new:N \l__sjtu_tmp_dim
+\skip_new:N \l__sjtu_tmp_skip
+\box_new:N \l__sjtu_tmp_box
+\int_new:N \g__sjtu_thesis_type_int
+\tl_new:N \g__sjtu_lang_tl
+\clist_set:Nn \g__sjtu_lang_clist { zh, en }
+\tl_const:Nn \c__sjtu_lang_de_tl { de }
+\tl_const:Nn \c__sjtu_lang_ja_tl { ja }
+\tl_new:N \g__sjtu_zihao_tl
+\int_new:N \g__sjtu_font_size_int
+\dim_new:N \g__sjtu_font_size_dim
+\dim_new:N \g__sjtu_baseline_skip_dim
+\bool_new:N \g__sjtu_fixed_baselineskip_bool
+\fp_new:N \g__sjtu_line_spread_fp
+\tl_new:N \g__sjtu_text_font_tl
+\tl_new:N \g__sjtu_math_font_tl
+\tl_new:N \g__sjtu_cjk_font_tl
+\bool_new:N \g__sjtu_slanted_uppercase_greek_bool
+\bool_new:N \g__sjtu_upright_integral_bool
+\bool_new:N \g__sjtu_integral_limits_bool
+\clist_new:N \g__sjtu_math_font_options_clist
+\bool_new:N \g__sjtu_review_bool
+\clist_set:Nn \g__sjtu_options_to_ctex_class_clist
+  { a4paper, UTF8, scheme = plain, fontset = none }
+\clist_new:N \g__sjtu_options_to_packages_clist
+\bool_new:N \g__sjtu_twoside_bool
+\bool_set_true:N \g__sjtu_twoside_bool
+\bool_new:N \g__sjtu_openright_bool
+\bool_set_true:N \g__sjtu_openright_bool
+\bool_new:N \g__sjtu_draft_bool
+\cs_new_protected:Npn \__sjtu_deprecated_option:n
+  { \msg_warning:nnn { sjtutex } { deprecated-option } }
+\cs_new_protected:Npn \__sjtu_set_deprecated_option:n #1
+  {
+    \__sjtu_deprecated_option:n { Option~ `#1'~ is~ set. }
+    \keys_set:nn { sjtu / option } {#1}
+  }
+\msg_new:nnn { sjtutex } { deprecated-option }
+  { Option~ `\l_keys_key_tl'~ is~ deprecated. \\ #1 }
+\keys_define:nn { sjtu / option }
+  {
+    type .choice: ,
+    type .value_required:n = true ,
+    type .choices:nn =
+      { bachelor, master, doctor }
+      { \int_gset_eq:NN \g__sjtu_thesis_type_int \l_keys_choice_int } ,
+    type .initial:n = { master } ,
+    lang .choice: ,
+    lang .value_required:n = true ,
+    lang .choices:nn =
+      { zh, en, de, ja }
+      {
+        \tl_gset_eq:NN \g__sjtu_lang_tl \l_keys_choice_tl
+        \clist_if_in:NnF \g__sjtu_lang_clist {#1}
+          { \clist_gput_right:Nn \g__sjtu_lang_clist {#1} }
+      } ,
+    lang .initial:n = { zh } ,
+    zihao .choice: ,
+    zihao .value_required:n = true ,
+    zihao /  5 .code:n =
+      {
+        \tl_gset:Nn  \g__sjtu_zihao_tl {#1}
+        \int_gset:Nn \g__sjtu_font_size_int { 1 }
+        \dim_gset:Nn \g__sjtu_font_size_dim { 10.5 bp }
+      } ,
+    zihao / -4 .code:n =
+      {
+        \tl_gset:Nn  \g__sjtu_zihao_tl {#1}
+        \int_gset:Nn \g__sjtu_font_size_int { 2 }
+        \dim_gset:Nn \g__sjtu_font_size_dim { 12   bp }
+      } ,
+    zihao .initial:n = { -4 } ,
+    linespread .fp_gset:N = \g__sjtu_line_spread_fp ,
+    linespread .initial:n = { \c_nan_fp } ,
+    linespread .value_required:n = true ,
+    baselineskip .choice: ,
+    baselineskip .value_required:n = true ,
+    baselineskip / false   .code:n =
+      { \bool_gset_false:N \g__sjtu_fixed_baselineskip_bool } ,
+    baselineskip / unknown .code:n =
+      {
+        \bool_gset_true:N  \g__sjtu_fixed_baselineskip_bool
+        \dim_gset:Nn \g__sjtu_baseline_skip_dim {#1}
+      } ,
+    baselineskip .initial:n = { 20 bp } ,
+    text-font .tl_gset:N = \g__sjtu_text_font_tl ,
+    text-font .initial:n = { newtx } ,
+    math-font .tl_gset:N = \g__sjtu_math_font_tl ,
+    cjk-font  .tl_gset:N = \g__sjtu_cjk_font_tl ,
+    fontset .code:n = { \__sjtu_set_deprecated_option:n { cjk-font = #1 } } ,
+    math-style .choice: ,
+    math-style .value_required:n = true,
+    math-style / TeX .code:n =
+      {
+        \bool_gset_false:N \g__sjtu_slanted_uppercase_greek_bool
+        \bool_gset_false:N \g__sjtu_upright_integral_bool
+        \bool_gset_false:N \g__sjtu_integral_limits_bool
+      } ,
+    math-style / ISO .code:n =
+      {
+        \bool_gset_true:N \g__sjtu_slanted_uppercase_greek_bool
+        \bool_gset_true:N \g__sjtu_upright_integral_bool
+        \bool_gset_true:N \g__sjtu_integral_limits_bool
+      } ,
+    math-style .initial:n = { ISO } ,
+    uppercase-greek .choice: ,
+    uppercase-greek .value_required:n = true ,
+    uppercase-greek / slanted .code:n =
+      { \bool_gset_true:N  \g__sjtu_slanted_uppercase_greek_bool } ,
+    uppercase-greek / upright .code:n =
+      { \bool_gset_false:N \g__sjtu_slanted_uppercase_greek_bool } ,
+    integral .choice: ,
+    integral .value_required:n = true ,
+    integral / slanted .code:n =
+      { \bool_gset_false:N \g__sjtu_upright_integral_bool } ,
+    integral / upright .code:n =
+      { \bool_gset_true:N  \g__sjtu_upright_integral_bool } ,
+    integral-limits .choice: ,
+    integral-limits .value_required:n = true ,
+    integral-limits / false .code:n =
+      { \bool_gset_false:N \g__sjtu_integral_limits_bool } ,
+    integral-limits / true  .code:n =
+      { \bool_gset_true:N  \g__sjtu_integral_limits_bool } ,
+    oneside .value_forbidden:n = true,
+    twoside .value_forbidden:n = true,
+    oneside .code:n =
+      { \bool_gset_false:N \g__sjtu_twoside_bool } ,
+    twoside .code:n =
+      { \bool_gset_true:N  \g__sjtu_twoside_bool } ,
+    openany   .value_forbidden:n = true,
+    openright .value_forbidden:n = true,
+    openany   .code:n =
+      { \bool_gset_false:N \g__sjtu_openright_bool } ,
+    openright .code:n =
+      { \bool_gset_true:N  \g__sjtu_openright_bool } ,
+    draft .value_forbidden:n = true,
+    final .value_forbidden:n = true,
+    draft .code:n =
+      { \bool_gset_true:N  \g__sjtu_draft_bool } ,
+    final .code:n =
+      { \bool_gset_false:N \g__sjtu_draft_bool } ,
+    review .bool_gset:N = \g__sjtu_review_bool ,
+    review .initial:n = false ,
+    unknown .code:n = { \msg_error:nn { sjtutex } { unknown-option } }
+  }
+\msg_new:nnn { sjtutex } { unknown-option }
+  { Class~ option~ "\l_keys_key_tl"~ is~ unknown. }
+\cs_if_exist:NTF \ProcessKeyOptions
+  { \ProcessKeyOptions [ sjtu / option ] }
+  {
+    \RequirePackage { l3keys2e }
+    \ProcessKeysOptions { sjtu / option }
+  }
+\clist_set:Nx \g__sjtu_math_font_options_clist
+  {
+    \bool_if:NT \g__sjtu_slanted_uppercase_greek_bool
+      { slantedGreek } ,
+    \bool_if:NT \g__sjtu_upright_integral_bool
+      { upint }
+  }
+\clist_put_right:Nx \@classoptionslist
+  {
+    a4paper ,
+    \tl_if_eq:NNT \g__sjtu_lang_tl \c__sjtu_lang_de_tl
+      { german, ngerman } ,
+    \bool_if:NT \g__sjtu_integral_limits_bool
+      { intlimits } ,
+    \g__sjtu_math_font_options_clist
+  }
+\clist_put_right:Nx \g__sjtu_options_to_ctex_class_clist
+  {
+    zihao      = \g__sjtu_zihao_tl ,
+    \fp_if_nan:nF { \g__sjtu_line_spread_fp }
+      { linespread = \fp_use:N \g__sjtu_line_spread_fp } ,
+    \bool_if:NTF \g__sjtu_twoside_bool
+      { twoside   } { oneside     } ,
+    \bool_if:NTF \g__sjtu_openright_bool
+      { openright } { openany     } ,
+    \bool_if:NTF \g__sjtu_draft_bool
+      { draft     } { final       }
+  }
+\exp_args:No \PassOptionsToClass
+  { \g__sjtu_options_to_ctex_class_clist }
+  { ctexbook }
+\clist_set:Nx \g__sjtu_options_to_packages_clist
+  {
+    { no-math           } { fontspec     } ,
+    { titles            } { tocloft      } ,
+    { list = off        } { bicaption    } ,
+    { warnings-off =
+      {
+        mathtools-overbracket,
+        mathtools-colon
+      }
+    }                     { unicode-math } ,
+    { amsmath, thmmarks } { ntheorem     } ,
+    { chapter           } { algorithm    } ,
+    { algochapter       } { algorithm2e  } ,
+    {
+      \bool_if:NTF \g__sjtu_integral_limits_bool
+        { displaylimits } { nolimits }
+    }                     { cmupint      }
+  }
+\clist_map_inline:Nn \g__sjtu_options_to_packages_clist
+  { \PassOptionsToPackage #1 }
+\LoadClass { ctexbook }
+\RequirePackage
+  {
+    xtemplate,
+    array,
+    mathtools,
+    geometry,
+    fancyhdr,
+    tocloft,
+    caption,
+    bicaption,
+    subcaption,
+    xcolor,
+    graphicx,
+    enumitem
+  }
+\cs_generate_variant:Nn \cs_gset:Npn { cpo }
+\cs_generate_variant:Nn \tl_const:Nn { Nv }
+\cs_generate_variant:Nn \clist_use:Nn { NV, cv }
+\exp_args_generate:n { Nnv }
+\cs_generate_variant:Nn \exp_last_unbraced:Ne { ce }
+\prg_generate_conditional_variant:Nnn \regex_match:nn { ne } { T, TF }
+\cs_new:Npx \__sjtu_engine_case:nn #1#2
+  {
+    \bool_lazy_or:nnTF
+      { \sys_if_engine_xetex_p:  }
+      { \sys_if_engine_luatex_p: }
+      {#2}
+      { \sys_if_engine_pdftex:T {#1} }
+  }
+\cs_new:Npx \__sjtu_engine_case:nnn #1#2#3
+  {
+    \sys_if_engine_xetex:TF
+      {#2}
+      {
+        \sys_if_engine_luatex:TF
+          {#3}
+          { \sys_if_engine_pdftex:T {#1} }
+      }
+  }
+\cs_new:Npx \__sjtu_unicode_engine_case:nn #1#2
+  {
+    \sys_if_engine_xetex:TF
+      {#1}
+      { \sys_if_engine_luatex:T {#2} }
+  }
+\__sjtu_engine_case:nn
+  {
+    \cs_new:Npn \__sjtu_unicode_char:n #1
+      {
+        \exp_not:N \Unicode
+          { \int_div_truncate:nn {#1} { 256 } }
+          { \int_mod:nn          {#1} { 256 } }
+      }
+  }
+  { \cs_new:Npn \__sjtu_unicode_char:n #1 { \tex_Uchar:D #1 \scan_stop: } }
+\cs_new:Npn \__sjtu_dim_set_to_wd:Nn #1#2
+  {
+    \hbox_set:Nn \l__sjtu_tmp_box {#2}
+    \dim_set:Nn #1 { \box_wd:N \l__sjtu_tmp_box }
+  }
+\cs_new:Npn \__sjtu_skip_add_to_wd:Nn #1#2
+  {
+    \hbox_set:Nn \l__sjtu_tmp_box {#2}
+    \skip_add:Nn #1 { \box_wd:N \l__sjtu_tmp_box }
+  }
+\cs_generate_variant:Nn \__sjtu_dim_set_to_wd:Nn { Nv }
+\cs_generate_variant:Nn \__sjtu_skip_add_to_wd:Nn { cv }
+\cs_new:Npn \__sjtu_cs_provide_eq:NN #1#2
+  { \cs_if_exist:NF #1 { \cs_set_eq:NN #1 #2 } }
+\cs_generate_variant:Nn \__sjtu_cs_provide_eq:NN { cc }
+\cs_new_protected:Npn \__sjtu_vspace:N #1
+  {
+    \skip_vertical:N #1
+    \skip_vertical:N \c_zero_skip
+  }
+\cs_new_protected:Npn \__sjtu_vspace:n #1
+  {
+    \skip_set:Nn \l__sjtu_tmp_skip {#1}
+    \__sjtu_vspace:N \l__sjtu_tmp_skip
+  }
+\cs_new_protected:Npn \__sjtu_vspace_r:N #1
+  {
+    \dim_set_eq:NN \l__sjtu_tmp_dim \prevdepth
+    \hrule height \c_zero_dim
+    \nobreak
+    \skip_vertical:N #1
+    \skip_vertical:N \c_zero_skip
+    \dim_set_eq:NN \prevdepth \l__sjtu_tmp_dim
+  }
+\cs_new_protected:Npn \__sjtu_vspace_r:n #1
+  {
+    \skip_set:Nn   \l__sjtu_tmp_skip {#1}
+    \__sjtu_vspace_r:N \l__sjtu_tmp_skip
+  }
+\cs_new_protected:Npn \__sjtu_define_name:nn #1#2
+  { \tl_const:cn { c__sjtu_name_ #1 _tl } {#2} }
+\cs_new_protected:Npn \__sjtu_define_name:nnn #1#2#3
+  { \tl_const:cn { c__sjtu_name_ #2 _ #1 _tl } {#3} }
+\cs_new_protected:Npn \__sjtu_define_name_from_clist:nnnn #1#2#3#4
+  { \tl_const:cx { c__sjtu_name_ #2 _ #1 _tl } { \clist_item:nn {#4} {#3} } }
+\cs_generate_variant:Nn \__sjtu_define_name:nn { nv }
+\cs_new_protected:Npn \__sjtu_define_symbol:nn #1#2
+  { \tl_const:cx { c__sjtu_symbol_ #1 _tl } { \__sjtu_unicode_char:n {#2} } }
+\cs_new_protected:Npn \__sjtu_if_lang_valid:nTF #1
+  { \clist_if_in:NnTF \g__sjtu_lang_clist {#1} }
+\msg_new:nnn { sjtutex } { lang-validation }
+  { Invalid~ language~ argument~ `#1'! }
+\DeclareObjectType { sjtu } { 0 }
+\DeclareTemplateInterface { sjtu } { component } { 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 } { component } { 0 }
+  {
+    format      = \l__sjtu_component_format_tl ,
+    content     = \l__sjtu_component_content_tl ,
+    bottom-skip = \l__sjtu_component_bottom_skip ,
+    align       =
+      {
+        left    =
+          \cs_set_eq:NN \l__sjtu_component_align: \raggedright ,
+        right   =
+          \cs_set_eq:NN \l__sjtu_component_align: \raggedleft ,
+        center  =
+          \cs_set_eq:NN \l__sjtu_component_align: \centering ,
+        normal  =
+          \cs_set_eq:NN \l__sjtu_component_align: \prg_do_nothing:
+      }
+  }
+  {
+    \AssignTemplateKeys
+    \group_begin:
+      \l__sjtu_component_align:
+      \l__sjtu_component_format_tl
+      \l__sjtu_component_content_tl
+      \par
+    \group_end:
+    \__sjtu_vspace:N \l__sjtu_component_bottom_skip
+  }
+\DeclareTemplateInterface { sjtu } { page } { 0 }
+  {
+    bookmark      : boolean   = false ,
+    bookmark-text : tokenlist = \c_empty_tl ,
+    style         : tokenlist = empty ,
+    format        : tokenlist = \c_empty_tl ,
+    prefix        : tokenlist ,
+    components    : commalist ,
+    top-skip      : skip      = \c_zero_skip ,
+    bottom-skip   : skip      = \c_zero_skip
+  }
+\DeclareTemplateCode { sjtu } { page } { 0 }
+  {
+    bookmark      = \l__sjtu_page_bookmark_bool ,
+    bookmark-text = \l__sjtu_page_bookmark_text_tl ,
+    style         = \l__sjtu_page_style_tl ,
+    format        = \l__sjtu_page_format_tl ,
+    prefix        = \l__sjtu_page_prefix_tl ,
+    components    = \l__sjtu_page_components_clist ,
+    top-skip      = \l__sjtu_page_top_skip ,
+    bottom-skip   = \l__sjtu_page_bottom_skip
+  }
+  {
+    \AssignTemplateKeys
+    \bool_if:NTF \g__sjtu_openright_bool
+      { \cleardoublepage } { \clearpage }
+    \bool_if:NT \l__sjtu_page_bookmark_bool
+      { \__sjtu_pdf_bookmark:nn { 0 } { \l__sjtu_page_bookmark_text_tl } }
+    \exp_args:No \thispagestyle { \l__sjtu_page_style_tl }
+    \__sjtu_vspace_r:N \l__sjtu_page_top_skip
+    \__sjtu_vspace:n { - \tex_parskip:D      }
+    \__sjtu_vspace:n { - \tex_baselineskip:D }
+    \group_begin:
+      \l__sjtu_page_format_tl
+      \clist_map_inline:Nn \l__sjtu_page_components_clist
+        { \UseInstance { sjtu } { \l__sjtu_page_prefix_tl / ##1 } }
+    \group_end:
+    \__sjtu_vspace:N \l__sjtu_page_bottom_skip
+    \clearpage
+  }
+\cs_new:Npn \__sjtu_declare_component:nnn #1#2#3
+  { \DeclareInstance { sjtu } {#1/#2} { component } {#3} }
+\cs_new:Npn \__sjtu_declare_page:nn #1#2
+  { \DeclareInstance { sjtu } {#1} { page } {#2} }
+\cs_new_protected:Npn \__sjtu_set_font_size:nnNn #1#2#3#4
+  { \cs_set_protected:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
+\tl_set:Nx \l__sjtu_font_size_tl
+  {
+    { \dim_to_decimal:n { \g__sjtu_font_size_dim     } }
+    { \dim_to_decimal:n { \g__sjtu_baseline_skip_dim } }
+  }
+\bool_if:NT \g__sjtu_fixed_baselineskip_bool
+  {
+    \int_case:nn { \g__sjtu_font_size_int }
+      {
+        { 1 } {
+                \exp_after:wN \__sjtu_set_font_size:nnNn \l__sjtu_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
+                  }
+              }
+        { 2 } {
+                \exp_after:wN \__sjtu_set_font_size:nnNn \l__sjtu_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
+  }
+\NewDocumentCommand \setbaselineskip { m }
+  { \fontsize { \f at size } {#1} \selectfont }
+\cs_new_protected:Npn \__sjtu_fontset_error:nn #1#2
+  { \msg_error:nnnn { sjtutex } { font-unavailable } {#1} {#2} }
+\msg_new:nnn { sjtutex } { font-unavailable }
+  { `#1-font~ =~ #2'~ is~ unavailable~ in~ current~ mode. }
+\cs_new_eq:NN \__sjtu_fontset_case:nn \__sjtu_engine_case:nn
+\cs_new:Npx \__sjtu_fontset_case:nnn #1#2#3
+  {
+    \__sjtu_engine_case:nn
+      { \sys_if_output_pdf:TF {#1} {#2} }
+      {#3}
+  }
+\cs_new_protected:Nn \__sjtu_declare_math_symbol:nnNn
+  {
+    \cs_undefine:N #3
+    \DeclareMathSymbol {#3} {#1} {#2} {#4}
+  }
+\cs_new_protected:Nn \__sjtu_set_slanted_greek:
+  {
+    \clist_const:Nn \c__sjtu_uppercase_greek_clist
+      { Gamma, Delta, Theta, Lambda, Xi, Pi, Sigma, Upsilon, Phi, Psi, Omega }
+    \clist_map_inline:Nn \c__sjtu_uppercase_greek_clist
+      {
+        \cs_set_eq:cc { up ##1 } {     ##1 }
+        \cs_set_eq:cc { it ##1 } { var ##1 }
+      }
+    \bool_if:NT \g__sjtu_slanted_uppercase_greek_bool
+      {
+        \clist_map_inline:Nn \c__sjtu_uppercase_greek_clist
+          { \cs_set_eq:cc { ##1 } { it ##1 } }
+      }
+  }
+\cs_new_protected:Nn \__sjtu_set_unimath_symbol:
+  {
+    \clist_map_inline:nn
+      {
+        { increment } { upDelta     } ,
+        { QED       } { blacksquare }
+      }
+      { \__sjtu_cs_provide_eq:cc ##1 }
+  }
+\tl_if_empty:NT \g__sjtu_math_font_tl
+  { \tl_gset_eq:NN \g__sjtu_math_font_tl \g__sjtu_text_font_tl }
+\tl_if_empty:NT \g__sjtu_cjk_font_tl
+  {
+    \sys_if_platform_windows:TF
+      { \tl_gset:Nn \g__sjtu_cjk_font_tl { windows } }
+      {
+        \ctex_if_platform_macos:TF
+          { \tl_gset:Nn \g__sjtu_cjk_font_tl { mac    } }
+          { \tl_gset:Nn \g__sjtu_cjk_font_tl { fandol } }
+      }
+  }
+\cs_new_protected:Npn \__sjtu_load_font:nn #1#2
+  {
+    \str_if_eq:eeF { \tl_use:c { g__sjtu_ #1 _font_tl } } { none }
+      {
+        \file_if_exist:nF
+          { sjtu- #1 -font- \tl_use:c { g__sjtu_ #1 _font_tl } .def }
+          {
+            \msg_warning:nnnn { sjtutex } { invalid-font } {#1} {#2}
+            \tl_gset:cn { g__sjtu_ #1 _font_tl } {#2}
+          }
+        \ctex_file_input:n
+          { sjtu- #1 -font- \tl_use:c { g__sjtu_ #1 _font_tl } .def }
+      }
+  }
+\msg_new:nnn { sjtutex } { invalid-font }
+  {
+    Invalid~ value~ `#1-font~ =~ \tl_use:c { g__sjtu_ #1 _font_tl }~ '! \\\\
+    Using~ `#2'~ instead.
+  }
+\cs_new_protected:Nn \__sjtu_load_fontset:
+  {
+    \clist_map_inline:nn
+      {
+        { math } { newtx  },
+        { text } { newtx  },
+        { cjk  } { fandol }
+      }
+      { \__sjtu_load_font:nn ##1 }
+  }
+\@onlypreamble \__sjtu_load_font:nn
+\@onlypreamble \__sjtu_load_fontset:
+\ctex_at_end_package:nn { unicode-math }
+  {
+    \DeclareDocumentCommand \bm { m }
+      { { \symbf {#1} } }
+    \DeclareDocumentCommand \boldsymbol { m }
+      { { \symbf {#1} } }
+    \bool_if:NTF \g__sjtu_slanted_uppercase_greek_bool
+      { \keys_set:nn { unicode-math } { math-style = ISO } }
+      { \keys_set:nn { unicode-math } { math-style = TeX } }
+    \bool_if:NTF \g__sjtu_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
+      }
+  }
+\ctex_at_end_preamble:n
+  {
+    \@ifpackageloaded { unicode-math }
+      { } { \RequirePackage { bm } }
+  }
+\NewDocumentCommand \CJKrmfamily { } { \CJKfamily { \CJKrmdefault } }
+\NewDocumentCommand \CJKsffamily { } { \CJKfamily { \CJKsfdefault } }
+\NewDocumentCommand \CJKttfamily { } { \CJKfamily { \CJKttdefault } }
+\__sjtu_unicode_engine_case:nn
+  {
+    \xeCJK_declare_char_class:nn { CJK }
+      { "24EA, "2460->"2473, "3251->"32BF, "25A1 }
+  }
+  {
+    \ltjdefcharrange { 99 }
+      { "24EA, "2460-"2473, "3251-"32BF, "25A1 }
+    \ltjsetparameter { jacharrange = { +99 } }
+  }
+\__sjtu_load_fontset:
+\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} } ,
+    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 ,
+    chapter        .tl_set:N = \chaptername ,
+    figure*        .tl_set:N = \SJTU at figurename@bi at second ,
+    figure*       .initial:n = { 图 } ,
+    table*         .tl_set:N = \SJTU at tablename@bi at second ,
+    table*        .initial:n = { 表 } ,
+    algorithm      .tl_set:N = \SJTU at algorithmname ,
+    algorithm     .initial:n = { Algorithm } ,
+    listalgorithm  .tl_set:N = \SJTU at listalgorithmname ,
+    listalgorithm .initial:n = { List~of~Algorithms } ,
+    abbr           .tl_set:N = \SJTU at abbrname ,
+    abbr          .initial:n = { Abbreviations } ,
+    nom            .tl_set:N = \SJTU at nomname ,
+    nom           .initial:n = { Nomenclature } ,
+    ack            .tl_set:N = \SJTU at ackname ,
+    ack           .initial:n = { Acknowledgements } ,
+    resume         .tl_set:N = \SJTU at resumename ,
+    resume        .initial:n = { Resume } ,
+    digest         .tl_set:N = \SJTU at digestname ,
+    digest        .initial:n = { Digest } ,
+    achv           .tl_set:N = \SJTU at achvname ,
+    achv          .initial:n = { List~of~Research~Achievements },
+  }
+\clist_map_inline:Nn \g__sjtu_lang_clist
+  { \file_input:n { sjtu-name-thesis- #1 .def } }
+\clist_map_inline:nn
+  { title_page, declaration, abstract }
+  { \__sjtu_define_name:nv {#1} { c__sjtu_name_ #1 _ \g__sjtu_lang_tl _tl } }
+\geometry
+  {
+    top           = 3.5 cm,
+    bottom        = 4.0 cm,
+    left          = 2.5 cm,
+    right         = 2.5 cm,
+    bindingoffset = 0.5 cm,
+    headheight    = 1.5 cm,
+    headsep       = 0.5 cm,
+    footskip      = 1.0 cm
+  }
+\AtEndOfClass { \raggedbottom }
+\pagestyle { fancy }
+\fancyhf { }
+\keys_define:nn { sjtu / style }
+  {
+    header-font  .tl_set:N = \l__sjtu_style_header_font_tl ,
+    header-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp } ,
+    footer-font  .tl_set:N = \l__sjtu_style_footer_font_tl ,
+    footer-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp }
+  }
+\fancyheadinit { \l__sjtu_style_header_font_tl }
+\fancyfootinit { \l__sjtu_style_footer_font_tl }
+\keys_define:nn { sjtu / style }
+  {
+    header-uppercase       .choice: ,
+    header-uppercase / true  .code:n =
+      { \cs_set_eq:NN \__sjtu_nouppercase:n \use:n                 } ,
+    header-uppercase / false .code:n =
+      { \cs_set:Nn    \__sjtu_nouppercase:n { \nouppercase {##1} } } ,
+    header-uppercase      .default:n = { true  } ,
+    header-uppercase      .initial:n = { false }
+  }
+\cs_generate_variant:Nn \__sjtu_nouppercase:n { V }
+\cs_new:Nn \__sjtu_thepage: { \thepage }
+\keys_define:nn { sjtu / style }
+  {
+    page-number .cs_set:Np = \__sjtu_page:n #1 ,
+    page-number .initial:n = { {#1} }
+  }
+\tl_set:Nn \l__sjtu_header_tl
+  {
+    {
+      \__sjtu_set_cjk_default_zh: \normalfont
+      \l__sjtu_info_subject_zh_tl
+    }
+  }
+\tl_set:Nn \l__sjtu_leftmark_tl  { \leftmark }
+\tl_set:Nn \l__sjtu_rightmark_tl { \leftmark }
+\bool_if:NTF \g__sjtu_twoside_bool
+  {
+    \fancyhead [ LO, RE ] { \l__sjtu_header_tl }
+    \fancyhead [ LE ]     { \__sjtu_nouppercase:V \l__sjtu_leftmark_tl  }
+    \fancyhead [ RO ]     { \__sjtu_nouppercase:V \l__sjtu_rightmark_tl }
+  }
+  {
+    \fancyhead [ L ] { \l__sjtu_header_tl }
+    \fancyhead [ R ] { \__sjtu_nouppercase:V \l__sjtu_rightmark_tl }
+  }
+\fancyfoot [ C ] { \__sjtu_page:n { \__sjtu_thepage: } }
+\cs_set:Npn \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 }
+  }
+\cs_new_eq:NN \ps at SJTU@null \prg_do_nothing:
+\RenewDocumentCommand \cleardoublepage { }
+  {
+    \clearpage
+    \bool_if:NT \g__sjtu_twoside_bool
+      {
+        \int_if_odd:nF \c at page
+          { \hbox:n { } \thispagestyle { empty } \newpage }
+      }
+  }
+\pagenumbering { Alph }
+\RenewDocumentCommand \frontmatter { }
+  {
+    \cleardoublepage
+    \@mainmatterfalse
+    \pagenumbering { Roman }
+  }
+\ctex_set:nn { chapter }
+  {
+    pagestyle   = SJTU at null ,
+    fixskip     = true ,
+    beforeskip  = 27 bp ,
+    afterskip   = 27 bp ,
+    format      = \zihao { 3 } \setbaselineskip{ 20 bp } \bfseries
+                  \CJKsffamily \centering ,
+    nameformat  = ,
+    titleformat = ,
+    lofskip     = \c_zero_skip ,
+    lotskip     = \c_zero_skip ,
+    aftername   = \quad
+  }
+\ctex_set:nn { section }
+  {
+    beforeskip  = 24 bp ,
+    afterskip   =  6 bp ,
+    format      = \zihao { 4 } \setbaselineskip { 18 bp } \bfseries
+                  \CJKsffamily
+  }
+\ctex_set:nn { subsection }
+  {
+    beforeskip  = 12 bp ,
+    afterskip   =  6 bp ,
+    format      = \zihao { -4 } \setbaselineskip { 16 bp } \bfseries
+                  \CJKsffamily
+  }
+\ctex_set:nn { subsubsection }
+  {
+    beforeskip  =  6 bp ,
+    afterskip   =  6 bp ,
+    format      = \zihao { -4 } \setbaselineskip { 16 bp } \normalfont
+  }
+\ctex_set:n { secnumdepth = 3 }
+\keys_define:nn { sjtu / style }
+  {
+    indent-first    .choice: ,
+    indent-first   .choices:nn =
+      { true, false }
+      {
+        \clist_map_inline:nn
+          {
+            chapter,
+            section, subsection, subsubsection,
+            paragraph, subparagraph
+          }
+          { \ctex_set:nn {####1} { afterindent = #1 } }
+      } ,
+    indent-first   .default:n = { true } ,
+    indent-first   .initial:n = { true }
+  }
+\NewDocumentCommand \SJTU at head { s O{#3} m O{#2} }
+  {
+    \CTEX at chapter@break
+    \IfBooleanTF {#1}
+      { \tl_if_empty:nF {#4} { \__sjtu_pdf_bookmark:nn { 0 } {#4} } }
+      {
+        \__sjtu_phantom_section:
+        \addcontentsline { toc } { chapter } {#4}
+      }
+    \cs_set_eq:NN \__sjtu_orig_ctex_gettitle:n \CTEX at gettitle
+    \cs_set:Npn \CTEX at gettitle ##1 { \__sjtu_orig_ctex_gettitle:n {#2} }
+    \chapter* {#3}
+    \cs_set_eq:NN \CTEX at gettitle \__sjtu_orig_ctex_gettitle:n
+    \@mkboth { \MakeUppercase {#2} } { \MakeUppercase {#2} }
+  }
+\cs_new:Npn \__sjtu_head_aux_s:nn #1#2
+  { \SJTU at head* [#1] {#2} }
+\cs_generate_variant:Nn \__sjtu_head_aux_s:nn { nx }
+\cs_new_eq:NN \__sjtu_pdf_bookmark:nn \use_none:nn
+\cs_new_eq:NN \__sjtu_phantom_section: \prg_do_nothing:
+\setlist { nosep }
+\keys_define:nn { sjtu / style }
+  {
+    equation-font  .tl_set:N = \SJTU at style@equation at font ,
+    equation-font .initial:x = \exp_not:N \linespread { }
+                               \exp_not:N \zihao { \g__sjtu_zihao_tl }
+  }
+\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 at style@equation at font } }
+\clist_map_inline:nn
+  { \start at gather, \start at align, \start at multline }
+  {
+    \ctex_patch_cmd:Nnn #1
+      { \collect at body }
+      {
+        \SJTU at style@equation at font
+        \collect at body
+      }
+  }
+\ctex_patch_cmd:Nnn \gather at split
+  { \spread at equation }
+  {
+    \SJTU at style@equation at font
+    \spread at equation
+  }
+\tl_set:Nn \textfraction      { 0.15 }
+\tl_set:Nn \topfraction       { 0.85 }
+\tl_set:Nn \bottomfraction    { 0.65 }
+\tl_set:Nn \floatpagefraction { 0.60 }
+\keys_define:nn { sjtu / style }
+  {
+    float-font  .tl_set:N = \SJTU at style@float at font ,
+    float-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
+  }
+\ctex_patch_cmd:Nnn \@floatboxreset
+  { \normalsize } { \SJTU at style@float at font }
+\keys_define:nn { sjtu / style }
+  {
+    caption-font       .code:n =
+      { \DeclareCaptionFont { normalsize    } {#1} } ,
+    caption-font    .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
+                                 \bfseries ,
+    subcaption-font    .code:n =
+      { \DeclareCaptionFont { SJTU at sub@font } {#1} } ,
+    subcaption-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp }
+                                 \normalfont
+  }
+\captionsetup
+  {
+    bi-slc   = off ,
+    labelsep = quad ,
+    skip     = 6 bp
+  }
+\captionsetup [ sub ]
+  {
+    bi-slc   = on ,
+    font     = SJTU at sub@font ,
+    format   = hang
+  }
+\DeclareCaptionOption { bi-second-names } [ ]
+  {
+    \tl_set:Nn \figurename { \SJTU at figurename@bi at second }
+    \tl_set:Nn \tablename  { \SJTU at tablename@bi at second  }
+  }
+\captionsetup [ bi-second ] { bi-second-names }
+\keys_define:nn { sjtu / style }
+  {
+    num-sep            .code:n =
+      {
+        \tl_set:Nn \SJTU at style@fl at num@sep {#1}
+        \tl_set:Nn \SJTU at style@eq at num@sep {#1}
+        \tl_set:Nn \@thmcountersep        {#1}
+      } ,
+    num-sep         .initial:n = { . } ,
+    float-num-sep    .tl_set:N = \SJTU at style@fl at num@sep ,
+    equation-num-sep .tl_set:N = \SJTU at style@eq at num@sep ,
+    theorem-num-sep  .tl_set:N = \@thmcountersep
+  }
+\NewDocumentCommand \SJTU at counterwithin
+  { s O{ \SJTU at style@fl at num@sep } O{ \arabic } m m }
+  {
+    \@ifbothcounters {#4} {#5}
+      {
+        \@addtoreset {#4} {#5}
+        \IfBooleanF {#1}
+          {
+            \cs_gset:cpo { the #4 }
+              { \cs:w the #5 \cs_end: #2 #3 {#4} }
+          }
+      }
+  }
+\SJTU at counterwithin { figure } { chapter }
+\SJTU at counterwithin { table  } { chapter }
+\SJTU at counterwithin [ \SJTU at style@eq at num@sep ] { equation } { chapter }
+\clist_set:Nn \l__sjtu_counter_without_chapter_clist
+  { section, figure, table, equation }
+\cs_set_eq:NN \__sjtu_makefnmark_plain: \@makefnmark
+\cs_set_eq:NN \__sjtu_thefootnote_plain: \thefootnote
+\cs_set_eq:NN \__sjtu_thempfootnote_plain: \thempfootnote
+\cs_new:Npn \__sjtu_footnote_number:N #1
+  {
+    \int_compare:nNnTF {#1} < { 21 }
+      { \__sjtu_unicode_char:n { \int_eval:n { "2460 - 1 + #1 } } }
+      {
+        \int_compare:nNnTF {#1} < { 36 }
+          { \__sjtu_unicode_char:n { \int_eval:n { "3251 - 21 + #1 } } }
+          {
+            \int_compare:nNnTF {#1} < { 51 }
+              { \__sjtu_unicode_char:n { \int_eval:n { "32B1 - 36 + #1 } } }
+              { \msg_warning:nn { sjtutex } { too-many-footnotes } }
+          }
+      }
+  }
+\msg_new:nnn { sjtutex } { too-many-footnotes }
+  { Too~ many~ footnotes. }
+\cs_new:Nn \__sjtu_makefnmark_circled: { \hbox:n { \@thefnmark } }
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-font           .choice: ,
+    fnmark-font / haranoaji .code:n =
+      {
+        \__sjtu_engine_case:nn
+          { \tl_set_eq:NN \l__sjtu_style_fnmark_font_tl \c_empty_tl }
+          {
+            \tl_set:Nn \l__sjtu_style_fnmark_font_tl
+              {
+                \CJKfontspec { HaranoAjiMincho }
+                  [
+                    Extension   = .otf ,
+                    UprightFont = *-Regular ,
+                    BoldFont    = *-Bold
+                  ]
+              }
+          }
+      } ,
+    fnmark-font / unknown .tl_set:N = \l__sjtu_style_fnmark_font_tl ,
+    fnmark-font          .initial:V = \c_empty_tl
+  }
+\cs_new:Nn \__sjtu_thefootnote_circled:
+  { { \l__sjtu_style_fnmark_font_tl \__sjtu_footnote_number:N \c at footnote } }
+\cs_new:Nn \__sjtu_thempfootnote_circled:
+  { { \l__sjtu_style_fnmark_font_tl \__sjtu_footnote_number:N \c at mpfootnote } }
+\keys_define:nn { sjtu / style }
+  {
+    fnmark-style           .choice: ,
+    fnmark-style / plain   .code:n =
+      {
+        \cs_set_eq:NN \__sjtu_makefnmark: \__sjtu_makefnmark_plain:
+        \cs_set_eq:NN \thefootnote \__sjtu_thefootnote_plain:
+        \cs_set_eq:NN \thempfootnote \__sjtu_thempfootnote_plain:
+      } ,
+    fnmark-style / circled .code:n =
+      {
+        \cs_set_eq:NN \__sjtu_makefnmark: \__sjtu_makefnmark_circled:
+        \cs_set_eq:NN \thefootnote \__sjtu_thefootnote_circled:
+        \cs_set_eq:NN \thempfootnote \__sjtu_thempfootnote_circled:
+      }
+  }
+\ctex_at_end_preamble:n {
+  \cs_set_eq:NN \__sjtu_orig_make_fntext:n \@makefntext
+  \cs_set:Npn \@makefntext #1
+    {
+      \group_begin:
+        \cs_set_eq:NN \@makefnmark \__sjtu_makefnmark:
+        \__sjtu_orig_make_fntext:n {#1}
+      \group_end:
+    }
+}
+\cs_new:Npn \__sjtu_info_keys_define:n #1
+  {
+    \clist_map_inline:nn
+      {
+        title, display_title, subject, author, date,
+        supervisor, assoc_supervisor, department,
+        co_supervisor, major, degree
+      }
+      { \tl_new:c { l__sjtu_info_ ##1 _ #1 _tl } }
+    \clist_map_inline:nn
+      { keywords, fund }
+      { \clist_new:c { l__sjtu_info_ ##1 _ #1 _clist } }
+    \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 }
+      {
+        title               .code:n =
+          {
+            \tl_set:cn { l__sjtu_info_title_ #1 _tl } {##1}
+            \tl_if_empty:cT { l__sjtu_info_display_title_ #1 _tl }
+              { \tl_set:cn { l__sjtu_info_display_title_ #1 _tl } {##1} }
+          } ,
+        display-title     .tl_set:c = l__sjtu_info_display_title_ #1 _tl ,
+        subject           .tl_set:c = l__sjtu_info_subject_ #1 _tl ,
+        keywords       .clist_set:c = l__sjtu_info_keywords_ #1 _clist ,
+        author            .tl_set:c = l__sjtu_info_author_ #1 _tl ,
+        id                 .meta:nn = { sjtu / info } { id = {##1} } ,
+        supervisor        .tl_set:c = l__sjtu_info_supervisor_ #1 _tl ,
+        assoc-supervisor  .tl_set:c = l__sjtu_info_assoc_supervisor_ #1 _tl ,
+        co-supervisor     .tl_set:c = l__sjtu_info_co_supervisor_ #1 _tl ,
+        degree            .tl_set:c = l__sjtu_info_degree_ #1 _tl ,
+        department        .tl_set:c = l__sjtu_info_department_ #1 _tl ,
+        major             .tl_set:c = l__sjtu_info_major_ #1 _tl ,
+        fund           .clist_set:c = l__sjtu_info_fund_ #1 _clist ,
+        date               .meta:nn = { sjtu / info } { date = {##1} } ,
+        display-date      .tl_set:c = l__sjtu_info_date_ #1 _tl ,
+      }
+  }
+\tl_new:N \l__sjtu_info_id_zh_tl
+\keys_define:nn { sjtu / info }
+  { id   .tl_set:N = \l__sjtu_info_id_zh_tl }
+\clist_set:Nn \l__sjtu_info_supervisors_clist { supervisor }
+\ctex_at_end_preamble:n
+  {
+    \bool_if:NT \g__sjtu_review_bool
+      {
+        \clist_map_inline:Nn \g__sjtu_lang_clist
+          {
+            \clist_map_inline:nn
+              { author, supervisor, assoc_supervisor, co_supervisor }
+              { \tl_clear:c { l__sjtu_info_ ##1 _ #1 _tl } }
+            \clist_clear:c { l__sjtu_info_fund_ #1 _clist }
+          }
+        \tl_clear:N \l__sjtu_info_id_zh_tl
+      }
+  }
+\clist_map_inline:Nn \g__sjtu_lang_clist
+  { \file_input:n { sjtu-lang-thesis- #1 .def } }
+\file_input:n { sjtu-scheme- \g__sjtu_lang_tl .def }
+\keys_define:nn { sjtu / info }
+  {
+    date    .code:n =
+      {
+        \regex_match:neTF { \d+-\d+-\d+ } {#1}
+          {
+            \clist_map_inline:Nn \g__sjtu_lang_clist
+              {
+                \tl_set:cx { l__sjtu_info_date_ ##1 _tl }
+                  { \exp_last_unbraced:ce { __sjtu_date_aux_ ##1 :w } #1 \q_stop }
+              }
+          }
+          {
+            \regex_match:neT { \d+-\d+ } {#1}
+              {
+                \clist_map_inline:Nn \g__sjtu_lang_clist
+                  {
+                    \tl_set:cx { l__sjtu_info_date_ ##1 _tl }
+                      { \exp_last_unbraced:ce { __sjtu_date_aux_short_ ##1 :w } #1 \q_stop }
+                  }
+              }
+          }
+      } ,
+    date .initial:x =
+      {
+        \int_to_arabic:n { \c_sys_year_int  } -
+        \int_to_arabic:n { \c_sys_month_int } -
+        \int_to_arabic:n { \c_sys_day_int   }
+      }
+  }
+\tl_set:Nv \today { l__sjtu_info_date_ \g__sjtu_lang_tl _tl }
+\__sjtu_engine_case:nnn
+  {
+    \NewDocumentEnvironment { SJTU at CJK@FTS } { m b }
+      {
+        \mode_leave_vertical:
+        \bool_set_false:N \l__sjtu_tmp_bool
+        \cs_set_eq:NN \SJTU at CJK@FTS at Symbol \CJKsymbol
+        \cs_set:Npn \CJKsymbol ##1
+          {
+            \bool_if:NTF \l__sjtu_tmp_bool
+              { \hfil \SJTU at CJK@FTS at Symbol { ##1 } }
+              {
+                \SJTU at CJK@FTS at Symbol { ##1 }
+                \bool_set_true:N \l__sjtu_tmp_bool
+              }
+          }
+        \hbox_to_wd:nn {#1} {#2}
+      } { }
+  }
+  {
+    \NewDocumentEnvironment { SJTU at CJK@FTS } { m b }
+      {
+        \mode_leave_vertical:
+        \cs_set:Npn \CJKglue
+          { \skip_horizontal:n { \c_zero_dim plus 1 filll } }
+        \hbox_to_wd:nn {#1} {#2}
+      } { }
+  }
+  {
+    \NewDocumentEnvironment { SJTU at CJK@FTS } { m b }
+      {
+        \mode_leave_vertical:
+        \ltjsetparameter { kanjiskip = { \c_zero_dim plus 1 filll } }
+        \hbox_to_wd:nn {#1} {#2}
+      } { }
+  }
+\newcolumntype { \SJTU at CT@D } [ 1 ]
+  { >{ \begin { SJTU at CJK@FTS } {#1} } c <{ \end { SJTU at CJK@FTS } } }
+\cs_new:Npn \__sjtu_title_page_info_i:nnn #1#2#3
+  {
+    \clist_clear:N \l__sjtu_tmp_clist
+    \clist_map_inline:nn {#3}
+      {
+        \clist_put_right:Nx \l__sjtu_tmp_clist
+          {
+            \exp_not:o { \cs:w c__sjtu_name_ ##1 _ #1 _tl \cs_end: }
+            &
+            \exp_not:o { \cs:w l__sjtu_info_ ##1 _ #1 _tl \cs_end: }
+          }
+      }
+    \group_begin:
+      \tl_set:Nn \arraystretch { 1 }
+      \tabular {#2}
+        \clist_use:Nn \l__sjtu_tmp_clist { \\ }
+      \endtabular
+    \group_end:
+  }
+\cs_new:Npn \__sjtu_title_page_info_ii:n #1
+  {
+    \tl_use:c { l__sjtu_info_department_ #1 _tl }
+    \skip_vertical:N \c_zero_skip
+    \tl_use:c { c__sjtu_name_univ_ #1 _tl }
+    \skip_vertical:N \c_zero_skip
+    \tl_use:c { c__sjtu_name_address_ #1 _tl }
+    \skip_vertical:N \c_zero_skip
+    \tl_use:c { l__sjtu_info_date_ #1 _tl }
+  }
+\cs_generate_variant:Nn \__sjtu_title_page_info_i:nnn { nxx }
+\RenewDocumentCommand \maketitle { }
+  {
+    \clist_map_inline:nn
+      { assoc_supervisor, co_supervisor }
+      {
+        \tl_if_empty:cF { l__sjtu_info_ ##1 _zh_tl }
+          { \clist_put_right:Nn \l__sjtu_info_supervisors_clist {##1} }
+      }
+    \clist_map_inline:Nn \g__sjtu_lang_clist
+      { \UseInstance { sjtu } { title / ##1 } }
+  }
+\cs_new_protected:Npn \__sjtu_signature:N #1
+  {
+    \parbox [ t ] { 12 em }
+      { #1 \c__sjtu_signature_text_zh_tl }
+  }
+\clist_map_inline:nn
+  {
+    { orig / title }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp }
+                      \bfseries \heiti ,
+        content     =
+          {
+            \c__sjtu_name_univ_zh_tl
+            \skip_vertical:N \c_zero_skip
+            \c__sjtu_name_thesis_zh_tl
+            \c__sjtu_name_orig_decl_zh_tl
+          } ,
+        bottom-skip = 12 bp
+      },
+    { orig / text  }
+      {
+        format      = \zihao { -4 } \setbaselineskip { 24 bp } ,
+        content     = \c__sjtu_orig_decl_text_zh_tl ,
+        bottom-skip = 24 bp ,
+        align       = normal
+      },
+    { orig / sign  }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 30 bp } ,
+        content     =
+          {
+            \__sjtu_signature:N \c__sjtu_name_decl_author_zh_tl
+            \skip_horizontal:n { 4 em } \hbox:n { }
+          } ,
+        bottom-skip = \c_zero_dim plus 2 fill ,
+        align       = right
+      },
+    { auth / title }
+      {
+        format      = \zihao { 3 } \setbaselineskip { 30 bp }
+                      \bfseries \heiti ,
+        content     =
+          {
+            \c__sjtu_name_univ_zh_tl
+            \skip_vertical:N \c_zero_skip
+            \c__sjtu_name_thesis_zh_tl
+            \c__sjtu_name_auth_decl_zh_tl
+          } ,
+        bottom-skip = 12 bp
+      },
+    { auth / text  }
+      {
+        format      = \zihao { -4 } \setbaselineskip { 24 bp } ,
+        content     = \c__sjtu_auth_decl_text_zh_tl ,
+        bottom-skip = 24 bp ,
+        align       = normal
+      },
+    { auth / sign  }
+      {
+        format      = \zihao { 4 } \setbaselineskip { 30 bp } ,
+        content     =
+          {
+            \__sjtu_signature:N \c__sjtu_name_decl_author_zh_tl
+            \hfill
+            \__sjtu_signature:N \c__sjtu_name_decl_supervisor_zh_tl
+            \skip_horizontal:n { 2 em } \hbox:n { }
+          } ,
+        bottom-skip = \c_zero_dim plus 1 fill ,
+        align       = normal
+      }
+  }
+  {
+    \__sjtu_declare_component:nnn { copyright } #1
+  }
+\__sjtu_declare_page:nn { copyright }
+  {
+    bookmark      = true ,
+    bookmark-text = \c__sjtu_name_declaration_tl ,
+    format        = \linespread { } \__sjtu_set_language_zh: ,
+    prefix        = copyright ,
+    components    =
+      {
+        orig / title, orig / text, orig / sign,
+        auth / title, auth / text, auth / sign
+      }
+  }
+\msg_new:nnn { sjtutex } { require-pdfpages }
+  {
+    Add~"\token_to_str:N \usepackage{pdfpages}"~ in~ your~ preamble \\
+    before~ inserting~ pages~ of~ external~ PDF.
+  }
+\NewDocumentCommand \copyrightpage { O{ } }
+  {
+    \bool_if:NF \g__sjtu_review_bool
+      {
+        \tl_if_blank:nTF {#1}
+          { \UseInstance { sjtu } { copyright } }
+          {
+            \cs_if_exist:NTF \includepdf
+              {
+                \bool_if:NTF \g__sjtu_openright_bool
+                  { \cleardoublepage } { \clearpage }
+                \__sjtu_pdf_bookmark:nn { 0 } { \c__sjtu_name_declaration_tl }
+                \includepdf {#1}
+              }
+              {
+                \msg_warning:nn { sjtutex } { require-pdfpages }
+                \UseInstance { sjtu } { copyright }
+              }
+          }
+      }
+  }
+\keys_define:nn { sjtu / style }
+  {
+    keywords-format       .choice: ,
+    keywords-format / plain .code:n =
+      { \cs_set:Nn \__sjtu_keywords_format:n { \noindent  { \bfseries ##1 } } } ,
+    keywords-format / hang  .code:n =
+      { \cs_set:Nn \__sjtu_keywords_format:n { \@hangfrom { \bfseries ##1 } } } ,
+    keywords-format      .initial:n = { plain }
+  }
+\DeclareDocumentEnvironment { abstract  } { O{ zh } +b }
+  {
+    \__sjtu_if_lang_valid:nTF {#1}
+      {
+        \use:c { __sjtu_set_language_ #1 : }
+        \exp_args:Nv \SJTU at head { c__sjtu_name_abstract_ #1 _tl }
+        #2
+        \clist_if_empty:cF { l__sjtu_info_keywords_ #1 _clist }
+          {
+            \par \mode_leave_vertical: \par
+            \__sjtu_keywords_format:n
+              {
+                \tl_use:c { c__sjtu_name_keywords_ #1 _tl }
+                \tl_use:c { c__sjtu_name_info_sep_ #1 _tl }
+              }
+            \clist_use:cv { l__sjtu_info_keywords_ #1 _clist }
+              { c__sjtu_name_item_sep_ #1 _tl }
+            \par
+          }
+      }
+      { \msg_error:nnn { sjtutex } { lang-validation } {#1} }
+  } { }
+\DeclareDocumentEnvironment { abstract* } { O{ zh } +b }
+  {
+    \__sjtu_if_lang_valid:nTF {#1}
+      {
+        \use:c { __sjtu_set_language_ #1 : }
+        \exp_args:NNv \SJTU at head* { c__sjtu_name_abstract_ #1 _tl }
+        #2
+        \clist_if_empty:cF { l__sjtu_info_keywords_ #1 _clist }
+          {
+            \par \mode_leave_vertical: \par
+            \__sjtu_keywords_format:n
+              {
+                \tl_use:c { c__sjtu_name_keywords_ #1 _tl }
+                \tl_use:c { c__sjtu_name_info_sep_ #1 _tl }
+              }
+            \clist_use:cv { l__sjtu_info_keywords_ #1 _clist }
+              { c__sjtu_name_item_sep_ #1 _tl }
+            \par
+          }
+      }
+      { \msg_error:nnn { sjtutex } { lang-validation } {#1} }
+  } { }
+\DeclareDocumentCommand \tableofcontents { s }
+  {
+    \IfBooleanTF {#1}
+      { \SJTU at head* { \contentsname } }
+      { \SJTU at head  { \contentsname } }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \@starttoc { toc }
+    \group_end:
+  }
+\NewDocumentCommand \SJTU at listof { m m s }
+  {
+    \IfBooleanTF {#3}
+      { \SJTU at head* {#1} }
+      { \SJTU at head  {#1} }
+    \group_begin:
+      \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 }
+      \exp_args:Nv \@starttoc { ext@ #2 }
+    \group_end:
+  }
+\DeclareDocumentCommand \listoffigures { }
+  { \SJTU at listof { \listfigurename } { figure } }
+\DeclareDocumentCommand \listoftables  { }
+  { \SJTU at listof { \listtablename  } { table  } }
+\tl_set:Nn \cftdotsep { 0.5 }
+\tl_set:Nn \cftchapleader { \bfseries \cftdotfill { \cftdotsep } }
+\clist_map_inline:nn
+  {
+    { cft before chap skip } { 10 bp plus 1 pt } ,
+    { cft chap   numwidth  } { 3.5 em } ,
+    { cft sec    indent    } { 2   em } ,
+    { cft sec    numwidth  } { 1.5 em } ,
+    { cft subsec indent    } { 4   em } ,
+    { cft subsec numwidth  } { 2.3 em }
+  }
+  { \skip_set:cn #1 }
+\clist_set:Nn \l__sjtu_cft_presnum_clist
+  {
+    { fig } { \figurename } ,
+    { tab } { \tablename  }
+  }
+\cs_new:Npn \__sjtu_update_cft_presnum:nn #1#2
+  {
+    \tl_set:cn { cft #1 presnum } { #2 \c_space_tl }
+    \skip_zero:c { cft #1 indent }
+    \skip_set:cn { cft #1 numwidth } { 2.8 em }
+    \__sjtu_skip_add_to_wd:cv { cft #1 numwidth } { cft #1 presnum }
+  }
+\ctex_at_end_preamble:n
+  {
+    \clist_map_inline:Nn \l__sjtu_cft_presnum_clist
+      { \__sjtu_update_cft_presnum:nn #1 }
+  }
+\NewDocumentEnvironment { abbreviation  } { O{ \SJTU at abbrname } }
+  {
+    \chapter    {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+\NewDocumentEnvironment { abbreviation* } { O{ \SJTU at abbrname } }
+  {
+    \SJTU at head* {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+\NewDocumentEnvironment { nomenclature  } { O{ \SJTU at nomname } }
+  {
+    \chapter    {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+\NewDocumentEnvironment { nomenclature* } { O{ \SJTU at nomname } }
+  {
+    \SJTU at head* {#1}
+    \tl_clear:N \SJTU at style@float at font
+  } { }
+\NewDocumentEnvironment { acknowledgements } { O{ \SJTU at ackname } +b }
+  {
+    \bool_if:NF \g__sjtu_review_bool
+      {
+        \SJTU at head {#1}
+        #2
+      }
+  } { }
+\newcounter { SJTU at bib }
+\NewDocumentEnvironment { @bibliolist } { m }
+  {
+    \cs_if_exist_use:N \bibfont
+    \list
+      {
+        \tl_if_blank:nTF {#1}
+          { \hfill }
+          { \@biblabel { \arabic{ SJTU at bib } } }
+      }
+      {
+        \tl_if_blank:nTF {#1}
+          {
+            \skip_if_exist:NTF \bibhang
+              { \dim_set_eq:NN \leftmargin \bibhang }
+              { \dim_set:Nn    \leftmargin { 1 em } }
+            \dim_set:Nn \itemindent { - \leftmargin }
+          }
+          {
+            \__sjtu_dim_set_to_wd:Nn \labelwidth { \@biblabel {#1} }
+            \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 at bib }
+        \cs_set:Npn \p at SJTU@bib  { }
+        \cs_set:Npn \theSJTU at bib { \arabic { SJTU at bib } }
+      }
+      \sloppy
+      \int_set:Nn \clubpenalty  { 4000 }
+      \int_set_eq:NN \@clubpenalty \clubpenalty
+      \int_set:Nn \widowpenalty { 4000 }
+      \char_set_sfcode:nn { `\. } { 1000 }
+  }
+  {
+    \cs_set:Npn \@noitemerr
+      { \msg_warning:nnn { sjtutex } { empty-environment } { bibliolist } }
+    \endlist
+  }
+\msg_new:nnn { sjtutex } { empty-environment }
+  { Empty~ `#1'~ environment. }
+\bool_new:N \l__sjtu_achievements_bool
+\NewDocumentEnvironment { achievements } { O{ \SJTU at achvname } }
+  {
+    \SJTU at head {#1}
+    \setcounter { SJTU at bib } { 0 }
+    \bool_set_true:N \l__sjtu_achievements_bool
+  } { }
+\NewDocumentEnvironment { bibliolist  } { m +b }
+  {
+    \bool_if:NF \l__sjtu_achievements_bool
+      {
+        \msg_error:nnnn { sjtutex } { environment-validation }
+          { bibliolist  } { achievements }
+      }
+    \bool_if:NF \g__sjtu_review_bool
+      {
+        \cs_set:Npn \@noitemerr { }
+        \begin { @bibliolist } {#1}
+        #2
+        \end { @bibliolist }
+      }
+  } { }
+\NewDocumentEnvironment { bibliolist* } { m +b }
+  {
+    \bool_if:NF \l__sjtu_achievements_bool
+      {
+        \msg_error:nnnn { sjtutex } { environment-validation }
+          { bibliolist* } { achievements }
+      }
+    \bool_if:NT \g__sjtu_review_bool
+      {
+        \cs_set:Npn \@noitemerr { }
+        \begin { @bibliolist } {#1}
+        #2
+        \end { @bibliolist }
+      }
+  } { }
+\msg_new:nnn { sjtutex } { environment-validation }
+  { `#1'~ is~ only~ valid~ in~ `#2'~ environment. }
+\NewDocumentEnvironment { resume } { O{ \SJTU at resumename } +b }
+  {
+    \bool_if:NF \g__sjtu_review_bool
+      {
+        \SJTU at head {#1}
+        #2
+      }
+  } { }
+\NewDocumentEnvironment { digest } { O{ en } +b }
+  {
+    \__sjtu_if_lang_valid:nTF {#1}
+      {
+        \AtEndDocument
+          {
+            \use:c { __sjtu_set_language_ #1 : }
+            \bool_if:NTF \g__sjtu_openright_bool
+              { \cleardoublepage } { \clearpage }
+            \pagenumbering { roman }
+            \cs_gset:Nn \__sjtu_thepage: { \arabic { page } }
+            \cs_gset_eq:NN \addcontentsline \use_none:nnn
+            \clist_map_inline:Nn \l__sjtu_counter_without_chapter_clist
+              {
+                \counterwithout {##1} { chapter }
+                \setcounter     {##1} { 0 }
+              }
+            \__sjtu_head_aux_s:nx { \SJTU at digestname }
+              {
+                \exp_not:N \MakeUppercase
+                  { \exp_not:v { l__sjtu_info_title_ #1 _tl } }
+              }
+            #2
+          }
+      }
+      { \msg_error:nnn { sjtutex } { lang-validation } {#1} }
+  } { }
+\NewDocumentCommand \sjtusetup { } { \keys_set:nn { sjtu } }
+\keys_define:nn { sjtu }
+  {
+    style .meta:nn = { sjtu / style } {#1} ,
+    info  .meta:nn = { sjtu / info  } {#1} ,
+    name  .meta:nn = { sjtu / name  } {#1}
+  }
+\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} }
+  }
+\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__sjtu_bookmark_int
+    \cs_gset_protected:Npn \__sjtu_pdf_bookmark:nn #1#2
+      {
+        \phantomsection
+        \int_gincr:N \g__sjtu_bookmark_int
+        \pdfbookmark [#1] {#2}
+          { sjtubookmark. \int_use:N \g__sjtu_bookmark_int }
+      }
+    \cs_gset_eq:NN \__sjtu_phantom_section: \phantomsection
+    \pdfstringdefDisableCommands
+      {
+        \cs_set_eq:NN \\       \prg_do_nothing:
+        \cs_set_eq:NN \quad    \c_empty_tl
+        \cs_set_eq:NN \qquad   \c_empty_tl
+        \cs_set_eq:NN \hspace  \use_none:n
+      }
+    \ctex_after_end_preamble:n
+      {
+        \hypersetup
+          {
+            pdftitle    = \l__sjtu_info_title_zh_tl ,
+            pdfauthor   = \l__sjtu_info_author_zh_tl ,
+            pdfsubject  = \l__sjtu_info_subject_zh_tl ,
+            pdfkeywords = \l__sjtu_info_keywords_zh_clist
+          }
+      }
+  }
+\ctex_at_end_package:nn { threeparttable }
+  { \tl_put_right:Nn \TPTnoteSettings { \footnotesize } }
+\ctex_at_end_package:nn { longtable }
+  { \AtBeginEnvironment { longtable } { \SJTU at style@float at font } }
+\cs_new_protected:Nn \__sjtu_new_theorems:
+  {
+    \clist_map_inline:nn
+      {
+        assumption, axiom, conjecture, corollary, definition, example,
+        exercise, lemma, problem, proposition, theorem
+      }
+      { \exp_args:Nnv  \newtheorem  {##1} { c__sjtu_name_ ##1 _tl } [ chapter ] }
+    \clist_map_inline:nn
+      { remark, solution }
+      { \exp_args:NNnv \newtheorem* {##1} { c__sjtu_name_ ##1 _tl } }
+  }
+\ctex_at_begin_package:nn { amsthm }
+  {
+    \cs_if_exist:NT \openbox
+      {
+        \cs_new_eq:NN \__sjtu_save_openbox: \openbox
+        \cs_undefine:N \openbox
+      }
+  }
+\ctex_at_end_package:nn { amsthm }
+  {
+    \__sjtu_cs_provide_eq:NN \QED \openbox
+    \cs_if_exist:NT \__sjtu_save_openbox:
+      { \cs_set_eq:NN \openbox \__sjtu_save_openbox: }
+    \tl_set:Nn \qedsymbol { \ensuremath { \QED } }
+    \RenewDocumentEnvironment { proof } { O{ \proofname } }
+      {
+        \par \pushQED { \qed }
+        \normalfont \dim_zero:N \topsep
+        \trivlist
+        \item
+          [
+            \skip_horizontal:N \labelsep
+            \bfseries \CJKsffamily #1 \@addpunct { \enskip }
+          ]
+        \ignorespaces
+      }
+      { \popQED \endtrivlist \@endpefalse }
+    \newtheoremstyle { sjtu }
+      { } { } { \normalfont } { } { \bfseries \CJKsffamily } { } { \ccwd } { }
+    \theoremstyle { sjtu }
+    \__sjtu_new_theorems:
+  }
+\ctex_at_end_package:nn { ntheorem }
+  {
+    \__sjtu_cs_provide_eq:NN \QED \c_empty_tl
+    \theoremheaderfont { \bfseries \CJKsffamily }
+    \theorembodyfont   { \normalfont }
+    \theoremseparator  { \enskip     }
+    \theoremsymbol { \ensuremath { \QED } }
+    \qedsymbol     { \ensuremath { \QED } }
+    \newtheorem* { proof } { \proofname }
+    \theoremsymbol { }
+    \__sjtu_new_theorems:
+  }
+\cs_new_protected:Npn \__sjtu_newlistof:nnnnn #1#2#3#4#5
+  {
+    \exp_args:Nnv \newlistentry {#2} { ext@ #3 } { 0 }
+    \exp_args:Ne \newcounter { \tl_use:c { ext@ #3 } depth }
+    \exp_args:Ne \setcounter { \tl_use:c { ext@ #3 } depth } { 1 }
+    \clist_put_right:Nn \l__sjtu_cft_presnum_clist { {#2} {#4} }
+    \cs_set_eq:cc { l@ #3 } { l@ #2 }
+    \exp_args:Nc \DeclareDocumentCommand { listof #1 s } { }
+      { \SJTU at listof {#5} {#3} }
+    \SJTU at counterwithin { #3 } { chapter }
+    \clist_put_right:Nn \l__sjtu_counter_without_chapter_clist {#3}
+  }
+\ctex_at_end_package:nn { algorithm }
+  {
+    \tl_set:Nn \fname at algorithm   { \SJTU at algorithmname     }
+    \tl_set:Nn \listalgorithmname { \SJTU at listalgorithmname }
+    \__sjtu_newlistof:nnnnn { algorithm } { alg } { algorithm }
+      { \fname at algorithm } { \listalgorithmname }
+  }
+\ctex_at_begin_package:nn { algorithm2e }
+  { \cs_set_eq:NN \__sjtu_save_chapter:w \@chapter }
+\ctex_at_end_package:nn { algorithm2e }
+  {
+    \cs_set_eq:NN \@chapter \__sjtu_save_chapter:w
+    \SetAlgorithmName { \SJTU at algorithmname     }
+                      { \SJTU at algorithmname     }
+                      { \SJTU at listalgorithmname }
+    \SetAlgoCaptionSeparator { \enskip }
+    \__sjtu_newlistof:nnnnn { algorithm } { alg } { algocf }
+      { \algorithmcfname } { \listalgorithmcfname }
+    \ctex_patch_cmd:Nnn \algocf at latexcaption
+      { \addcontentsline }
+      { \caption at iflist { \addcontentsline } { \@gobblethree } }
+  }
+\ctex_at_end_package:nn { nomencl }
+  { \tl_set:Nn \nomname { \SJTU at nomname } }
+\ctex_at_end_package:nn { translations }
+  {
+    \DeclareLanguage { chinese }
+    \DeclareLanguageAlias { Chinese } { chinese }
+  }
+\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
+              }
+          }
+      }
+  }
+\endinput
+%%
+%% End of file `sjtuthesis.cls'.


Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/sjtuthesis.cls
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-red.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-red.pdf
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-red.pdf	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-red.pdf	2024-02-18 21:11:54 UTC (rev 69966)

Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-red.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-small-red.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-small-red.pdf
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-small-red.pdf	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-small-red.pdf	2024-02-18 21:11:54 UTC (rev 69966)

Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-badge-small-red.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-red.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-red.pdf
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-red.pdf	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-red.pdf	2024-02-18 21:11:54 UTC (rev 69966)

Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-red.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-small-red.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-small-red.pdf
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-small-red.pdf	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-small-red.pdf	2024-02-18 21:11:54 UTC (rev 69966)

Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-logo-small-red.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-name-red.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-name-red.pdf
===================================================================
--- trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-name-red.pdf	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-name-red.pdf	2024-02-18 21:11:54 UTC (rev 69966)

Property changes on: trunk/Master/texmf-dist/tex/latex/sjtutex/vi/sjtu-vi-name-red.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2024-02-18 21:11:54 UTC (rev 69966)
@@ -768,7 +768,7 @@
     simpleicons simpleinvoice simplekv simplenodes
     simpleoptics simpler-wick simples-matrices simplewick
     simplified-latex simplivre simurgh
-    sistyle sitem siunits siunitx
+    sistyle sitem siunits siunitx sjtutex
     skak skaknew skb skdoc skeldoc skeycommand skeyval
     skills skmath skrapport skull
     slantsc slideshow

Modified: trunk/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc	2024-02-18 21:06:42 UTC (rev 69965)
+++ trunk/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc	2024-02-18 21:11:54 UTC (rev 69966)
@@ -59,6 +59,7 @@
 depend pxjodel
 depend pxrubrica
 depend pxufont
+depend sjtutex
 depend texlive-ja
 depend uplatex
 depend uptex

Added: trunk/Master/tlpkg/tlpsrc/sjtutex.tlpsrc
===================================================================


More information about the tex-live-commits mailing list.