From e11a34ebeb96a1e568cc937df3b614062ddb0adf Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 19 Feb 2024 03:01:14 +0000 Subject: CTAN sync 202402190301 --- macros/latex/contrib/sjtutex/README.md | 31 + macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf | Bin 0 -> 20101 bytes .../contrib/sjtutex/sjtu-vi-badge-small-red.pdf | Bin 0 -> 20011 bytes macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf | Bin 0 -> 39157 bytes .../contrib/sjtutex/sjtu-vi-logo-small-red.pdf | Bin 0 -> 39066 bytes macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf | Bin 0 -> 20802 bytes macros/latex/contrib/sjtutex/sjtutex.dtx | 6137 ++++++++++++++++++++ macros/latex/contrib/sjtutex/sjtutex.pdf | Bin 0 -> 713536 bytes 8 files changed, 6168 insertions(+) create mode 100644 macros/latex/contrib/sjtutex/README.md create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-badge-small-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-logo-small-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtutex.dtx create mode 100644 macros/latex/contrib/sjtutex/sjtutex.pdf (limited to 'macros/latex/contrib/sjtutex') diff --git a/macros/latex/contrib/sjtutex/README.md b/macros/latex/contrib/sjtutex/README.md new file mode 100644 index 0000000000..7935863283 --- /dev/null +++ b/macros/latex/contrib/sjtutex/README.md @@ -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. diff --git a/macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf b/macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf new file mode 100644 index 0000000000..7b34ecf219 Binary files /dev/null and b/macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf differ diff --git a/macros/latex/contrib/sjtutex/sjtu-vi-badge-small-red.pdf b/macros/latex/contrib/sjtutex/sjtu-vi-badge-small-red.pdf new file mode 100644 index 0000000000..53901f695b Binary files /dev/null and b/macros/latex/contrib/sjtutex/sjtu-vi-badge-small-red.pdf differ diff --git a/macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf b/macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf new file mode 100644 index 0000000000..08a405be04 Binary files /dev/null and b/macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf differ diff --git a/macros/latex/contrib/sjtutex/sjtu-vi-logo-small-red.pdf b/macros/latex/contrib/sjtutex/sjtu-vi-logo-small-red.pdf new file mode 100644 index 0000000000..a1ec93ed9c Binary files /dev/null and b/macros/latex/contrib/sjtutex/sjtu-vi-logo-small-red.pdf differ diff --git a/macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf b/macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf new file mode 100644 index 0000000000..26a249e41b Binary files /dev/null and b/macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf differ diff --git a/macros/latex/contrib/sjtutex/sjtutex.dtx b/macros/latex/contrib/sjtutex/sjtutex.dtx new file mode 100644 index 0000000000..4e340a821f --- /dev/null +++ b/macros/latex/contrib/sjtutex/sjtutex.dtx @@ -0,0 +1,6137 @@ +% \iffalse meta-comment +% +% Copyright (C) SJTUG +% 2018--2024 Weijian Wu +% 2022--2024 Zilong Li +% +% 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> +\fi +\begingroup + \def\NameOfLaTeXe{LaTeX2e} +\expandafter\endgroup\ifx\NameOfLaTeXe\fmtname\else +\csname fi\endcsname +% +% +%<*install> +\input ctxdocstrip.tex +\keepsilent +\askforoverwritefalse + +\preamble + + Copyright (C) SJTUG + 2018--2024 Weijian Wu + 2022--2024 Zilong Li + + 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}} +% +%<*internal> + \usedir{source/latex/sjtutex} + \file{\jobname.ins} {\from{\jobname.dtx}{install}} +% +%<*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 +% +% +%<*internal> +\fi +% +% +%<*class> +\NeedsTeXFormat{LaTeX2e}[2020/10/01] +\providecommand\IfFormatAtLeastTF{\@ifl@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}{}} +% +%<*!(driver|install)> +%<+!driver>\GetIdInfo$Id: sjtutex.dtx b468d42 2024-02-18 19:15:02 +0800 Alexara Wu $ +% {Thesis document class for Shanghai Jiao Tong University (SJTUTeX)} +%\ProvidesExplClass{sjtuthesis} +% {Report document class for Shanghai Jiao Tong University (SJTUTeX)} +%\ProvidesExplClass{sjtureport} +% {Article document class for Shanghai Jiao Tong University (SJTUTeX)} +%\ProvidesExplClass{sjtuarticle} +% {Chinese specific definition for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-thesis-zh.def} +% {English specific definition for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-thesis-en.def} +% {German specific definition for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-thesis-de.def} +% {Japanese specific definition for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-thesis-ja.def} +% {Chinese specific definition for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-generic-zh.def} +% {English specific definition for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-generic-en.def} +% {German specific definition for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-generic-de.def} +% {Japanese specific definition for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-lang-generic-ja.def} +% {Chinese name config for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-thesis-zh.def} +% {English name config for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-thesis-en.def} +% {German name config for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-thesis-de.def} +% {Japanese name config for thesis (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-thesis-ja.def} +% {Chinese name config for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-generic-zh.def} +% {English name config for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-generic-en.def} +% {German name config for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-generic-de.def} +% {Japanese name config for generic (SJTUTeX)} +%\ProvidesExplFile{sjtu-name-generic-ja.def} +% {Chinese scheme (SJTUTeX)} +%\ProvidesExplFile{sjtu-scheme-zh.def} +% {English scheme (SJTUTeX)} +%\ProvidesExplFile{sjtu-scheme-en.def} +% {German scheme (SJTUTeX)} +%\ProvidesExplFile{sjtu-scheme-de.def} +% {Japanese scheme (SJTUTeX)} +%\ProvidesExplFile{sjtu-scheme-ja.def} +% {New TX text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-newtx.def} +% {New PX text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-newpx.def} +% {STIX Two text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-stixtwo.def} +% {XITS text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-xits.def} +% {Latin Modern text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-lm.def} +% {Libertinus text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-libertinus.def} +% {New Computer Modern text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-newcm.def} +% {Cambria text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-cambria.def} +% {Times text fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-text-font-times.def} +% {New TX math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-newtx.def} +% {New PX math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-newpx.def} +% {STIX Two math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-stixtwo.def} +% {XITS math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-xits.def} +% {Latin Modern math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-lm.def} +% {Libertinus math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-libertinus.def} +% {New Computer Modern math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-newcm.def} +% {Cambria math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-cambria.def} +% {Times math fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-math-font-times.def} +% {Windows CJK fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-windows.def} +% {Windows CJK fonts definition for Chinese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-windows-zh.def} +% {Windows CJK fonts definition for Japanese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-windows-ja.def} +% {macOS CJK fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-mac.def} +% {macOS CJK fonts definition for Chinese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-mac-zh.def} +% {macOS CJK fonts definition for Japanese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-mac-ja.def} +% {Ubuntu CJK fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-ubuntu.def} +% {Ubuntu CJK fonts definition for Chinese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-ubuntu-zh.def} +% {Ubuntu CJK fonts definition for Japanese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-ubuntu-ja.def} +% {Adobe CJK fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-adobe.def} +% {Adobe CJK fonts definition for Chinese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-adobe-zh.def} +% {Adobe CJK fonts definition for Japanese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-adobe-ja.def} +% {Fandol CJK fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-fandol.def} +% {Fandol CJK fonts definition for Chinese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-fandol-zh.def} +% {Fandol CJK fonts definition for Japanese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-fandol-ja.def} +% {Founder CJK fonts definition (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-founder.def} +% {Founder CJK fonts definition for Chinese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-founder-zh.def} +% {Founder CJK fonts definition for Japanese (SJTUTeX)} +%\ProvidesExplFile{sjtu-cjk-font-founder-ja.def} +% {\ExplFileDate}{2.1}{\ExplFileDescription} +% +% +%<*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@base}{^^A + basewidth = 0.5 em, + gobble = 2, + lineskip = 2 pt, + frame = l, + framerule = 1.2 pt, + framesep = 0 pt, + escapeinside = {(*}{*)}, + basicstyle = \small\ttfamily, + xleftmargin = 0.5 em, + xrightmargin = 0.5 em, + framexleftmargin = 0.5 em, + framexrightmargin = 0.5 em} +\lstdefinestyle{style@shell}{^^A + style = style@base, + rulecolor = \color{sjtu-dark-green}, + backgroundcolor = \color{sjtu-dark-green!2}, + language = bash, + alsoletter = {-}, + keywordstyle = \color{sjtu-green}, + emphstyle = \color{sjtu-amber}} +\lstdefinestyle{style@latex}{^^A + style = style@base, + rulecolor = \color{sjtu-dark-blue}, + backgroundcolor = \color{sjtu-dark-blue!2}, + language = [LaTeX]TeX, + alsoletter = {*, -}, + keywordstyle = \color{sjtu-dark-red!80}, + texcsstyle = *\color{sjtu-blue}, + emphstyle = [1]\color{sjtu-orange}, + emphstyle = [2]\color{sjtu-green}, + emphstyle = [3]\color{sjtu-dark-blue!80}} +\lstnewenvironment{shell}[1][]{^^A + \lstset{style=style@shell, #1}}{} +\lstnewenvironment{latex}[1][]{^^A + \lstset{style=style@latex, #1}}{} +\newcommand\TNA[1]{\textcolor{sjtu-blue}{\tn{#1}}} +\newcommand\TNB[1]{\textcolor{sjtu-dark-red!80}{\tn{#1}}} +\newcommand\OPT[1]{\textcolor{sjtu-dark-blue!80}{#1}} +\newcommand\OPS[1]{\textcolor{sjtu-green}{#1}} +\newcommand\ENV[1]{\textcolor{sjtu-orange}{#1}} +\newcommand\BEV[1]{\TNA{begin}\{\ENV{#1}\}} +\newcommand\EEV[1]{\TNA{end}\{\ENV{#1}\}} +\newcommand\note[1]{{^^A + \color{sjtu-dark-green}{\noindent\bfseries 说明:}~\emph{#1}}} +\newcommand\sjtutexrev[1]{^^A + \href{https://github.com/sjtug/SJTUTeX/commit/#1}{\texttt{sjtutex} rev. #1}} +\hypersetup{^^A + bookmarksnumbered = true, + bookmarksopen = true} +\makeatletter +\pdfstringdefDisableCommands{^^A + \let\color\@gobble} +\makeatother +\begin{document} + \DocInput{\jobname.dtx} + \IndexLayout + \PrintChanges + \PrintIndex +\end{document} +% +% \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} = +% \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} = +% \end{syntax} +% 大写希腊字母的正/斜体。 +% \end{function} +% +% \begin{function}[added=2023-01-05]{integral} +% \begin{syntax} +% \OPT{integral} = +% \end{syntax} +% 积分号的正/斜体。 +% \end{function} +% +% \begin{function}[added=2023-01-05]{integral-limits} +% \begin{syntax} +% \OPT{integral-limits} = +% \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//title} +% \begin{syntax} +% \OPT{\meta{lang}}/\OPT{title} = \marg{标题} +% \end{syntax} +% 标题。 +% \end{function} +% +% \begin{function}[rEXP,updated=2023-03-14]{info//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//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//keywords} +% \begin{syntax} +% \OPT{\meta{lang}}/\OPT{keywords} = \marg{中文关键字} +% \end{syntax} +% 关键字列表。各关键字之间需使用英文逗号隔开。 +% 为防止歧义,可以用分组括号“|{...}|”把各字段括起来。 +% \end{function} +% +% \begin{function}[rEXP,updated=2023-03-14]{info//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//supervisor, +% info//assoc-supervisor,info//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//degree} +% \begin{syntax} +% \OPT{\meta{lang}}/\OPT{degree} = \marg{学位名称} +% \end{syntax} +% 申请学位中英文名称。 +% 包括申请的学位类别和级别,如“工学硕士”、“理学博士”等。 +% 学士论文无需标注。 +% \end{function} +% +% \begin{function}[rEXP,updated=2023-03-14]{info//department} +% \begin{syntax} +% \OPT{\meta{lang}}/\OPT{department} = \marg{院系名称} +% \end{syntax} +% 院系名称。 +% \end{function} +% +% \begin{function}[rEXP,updated=2023-03-14]{info//major} +% \begin{syntax} +% \OPT{\meta{lang}}/\OPT{major} = \marg{专业名称} +% \end{syntax} +% 专业名称。 +% \end{function} +% +% \begin{function}[rEXP,updated=2023-03-14]{info//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//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} = +% \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} = +% \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} = +% \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> +%\bool_new:N \l_@@_tmp_bool +%\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} +%\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 +%\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} +%\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 +%\bool_set_true:N \g_@@_twoside_bool +%\bool_set_false:N \g_@@_twoside_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_openright_bool} +% 是否在奇数页开始新章。 +% \begin{macrocode} +%\bool_new:N \g_@@_openright_bool +%\bool_set_true:N \g_@@_openright_bool +%\bool_set_false:N \g_@@_openright_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_titlepage_bool} +% 是否生成标题页。 +% \begin{macrocode} +%\bool_new:N \g_@@_titlepage_bool +%\bool_set_true:N \g_@@_titlepage_bool +%
\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 } , +% +% \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} } +% + } , + 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 } + } , +% zihao .initial:n = { -4 } , +%
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} + } , +% baselineskip .initial:n = { 20 bp } , +% 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 } , +% +% \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 } , +% +% \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} +% review .bool_gset:N = \g_@@_review_bool , +% 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 } } + } +% +% \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 } , +% \bool_if:NTF \g_@@_openright_bool +% { openright } { openany } , +% \bool_if:NTF \g_@@_titlepage_bool +% { 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 } +% { ctexbook } +% { ctexrep } +%
{ 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 } , +% { chapter } { algorithm } , +% { 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} +%\LoadClass { ctexbook } +%\LoadClass { ctexrep } +%
\LoadClass { ctexart } +% \end{macrocode} +% +% 载入各宏包。 +% \begin{macrocode} +\RequirePackage + { +% xtemplate, +% 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 } + } +% +% \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 } + } +% +\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 } + } +%\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 + } +% +% \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 } +% +% \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} } +% +% \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@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: +% +% \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@sfcnt \@font@info } + \PassOptionsToPackage { notext } { stix2 } + \RequirePackage { stix2 } + \clist_map_inline:nn + { + \upalpha { "0B } , + \upbeta { "0C } , + \upgamma { "0D } , + \updelta { "0E } , + \upepsilon { "0F } , + \upzeta { "10 } , + \upeta { "11 } , + \uptheta { "12 } , + \upiota { "13 } , + \upkappa { "14 } , + \uplambda { "15 } , + \upmu { "16 } , + \upnu { "17 } , + \upxi { "18 } , + \uppi { "19 } , + \uprho { "1A } , + \upsigma { "1B } , + \uptau { "1C } , + \upupsilon { "1D } , + \upphi { "1E } , + \upchi { "1F } , + \uppsi { "20 } , + \upomega { "21 } , + \upvarepsilon { "22 } , + \upvartheta { "23 } , + \upvarpi { "24 } , + \upvarrho { "25 } , + \upvarsigma { "26 } , + \upvarphi { "27 } + } + { \@@_declare_math_symbol:nnNn { \stix@lcgc } { operators } #1 } + \@@_set_slanted_greek: +% +%<*text> + \tl_set:Nn \encodingdefault { T1 } + \DeclareEncodingSubset { TS1 } { ? } { 0 } + \UndeclareTextCommand { \textpertenthousand } { T1 } + \DeclareTextSymbolDefault { \textpertenthousand } { TS1 } + \tl_set:Nn \rmdefault { stix2 } + \tl_set:Nn \qhv@scale { 0.94 } + \tl_set:Nn \sfdefault { qhv } + \tl_set:Nn \ttdefault { qcr } +% + } + { +%<*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 + ] +% +% \setmathrm +% \setmainfont + { STIXTwoText } + [ + Extension = .otf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic, + BoldItalicFont = *-BoldItalic + ] +% +%<*xits> +\@@_fontset_case:nn +% { \@@_fontset_error:nn { math } { xits } } +% { \@@_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 + ] +% +% \setmathrm +% \setmainfont + { XITS } + [ + Extension = .otf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic, + BoldItalicFont = *-BoldItalic + ] +% +%<*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 } +%\tl_set:Nn \rmdefault { ntxtlf } +%\tl_set:Nn \rmdefault { zplTLF } +\tl_set:Nn \qhv@scale { 0.94 } +\tl_set:Nn \sfdefault { qhv } +\tl_set:Nn \ttdefault { qcr } +%\RequirePackage { newtxmath } +%\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: +% +%<*text> +\@@_fontset_case:nn + { + \tl_set:Nn \encodingdefault { T1 } +% \RequirePackage { newtxtext } +% \RequirePackage { newpxtext } + \tl_set:Nn \ttdefault { qcr } + } + { + \setmainfont +% { TeXGyreTermesX } +% { TeXGyrePagellaX } + [ + Extension = .otf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic, + BoldItalicFont = *-BoldItalic + ] +% +% +%<*text&(newtx|newpx)|stixtwo|xits> +% \setmathsf +% \setsansfont + { texgyreheros } + [ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, + Scale = 0.94, + ] +% \setmathtt +% \setmonofont + { texgyrecursor } + [ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, + Ligatures = CommonOff + ] + } +% +%<*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 } + } { } +% +%<*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: +% +% +%<*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 } +% +%<*math> + \exp_args:No \PassOptionsToPackage + { \g_@@_math_font_options_clist } { libertinust1math } + \RequirePackage { libertinust1math } +% + } + { +%<*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 ] +% +% \setmathrm +% \setmainfont + { LibertinusSerif } + [ + Extension = .otf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic, + BoldItalicFont = *-BoldItalic, + SlantedFont = *-Regular, + BoldSlantedFont = *-Bold, + SlantedFeatures = { FakeSlant = 0.2 }, + BoldSlantedFeatures = { FakeSlant = 0.2 } + ] +% \setmathsf +% \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 } + ] + } +% +%<*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@scale { 0.94 } +\DeclareMathAlphabet { \mathsf } { OT1 } { phv } { m } { n } +\DeclareMathAlphabet { \mathtt } { OT1 } { pcr } { m } { n } +\SetMathAlphabet { \mathsf } { bold } { OT1 } { phv } { b } { n } +\SetMathAlphabet { \mathtt } { bold } { OT1 } { pcr } { b } { n } +\DeclareSymbolFont { SJTU@ptm } { OML } { ptmcm } { m } { it } +\@@_declare_math_symbol:nnNn { \mathord } { SJTU@ptm } \upvarsigma { "26 } +\bool_if:NT \g_@@_upright_integral_bool + { \RequirePackage { cmupint } } +\@@_set_unimath_symbol: +% +%<*text> +\@@_fontset_case:nn + { + \tl_set:Nn \encodingdefault { T1 } + \tl_set:Nn \rmdefault { ptm } + \tl_set:Nn \Hv@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 } + } +% +% +%<*newcm> +\@@_fontset_case:nn +% { \@@_fontset_error:nn { math } { newcm } } +% { \@@_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 + ] +% +% \setmathrm +% \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 } + ] +% \setmathsf +% \setsansfont + { NewCMSans10 } + [ + Extension = .otf, + SizeFeatures = + { + { + Size = -9, + Font = NewCMSans08-Book, + ItalicFont = NewCMSans08-BookOblique, + }, + { Size = 9- } + }, + UprightFont = *-Book, + BoldFont = *-Bold, + ItalicFont = *-BookOblique, + BoldItalicFont = *-BoldOblique + ] +% \setmathtt +% \setmonofont + { NewCMMono10 } + [ + Extension = .otf, + UprightFont = *-Book, + BoldFont = *-Bold, + ItalicFont = *-BookItalic, + BoldItalicFont = *-BoldOblique, + SlantedFont = *-Book, + SlantedFeatures = { FakeSlant = 0.25 }, + BoldSlantedFont = *-Bold, + BoldSlantedFeatures = { FakeSlant = 0.25 } + ] + } +% +%<*cambria> +\@@_fontset_case:nn +% { \@@_fontset_error:nn { math } { cambria } } +% { \@@_fontset_error:nn { text } { cambria } } + { +%<*math> + \RequirePackage { unicode-math } + \setmathfont { Cambria~Math } + \setmathrm { Cambria } + \setmathsf { Calibri } + \setmathtt { Consolas } [ Scale = 0.95 ] +% +%<*text> + \setmainfont { Cambria } + \setsansfont { Calibri } + \setmonofont { Consolas } [ Scale = 0.95 ] +% + } +% +% +% \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 } } + } +% +% \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 } } +% +%<*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 } + } +% +% { \@@_fontset_error:nn { cjk } { windows } } + { +%<*zh> + \setCJKmainfont { SimSun } + [ AutoFakeBold = 3 , ItalicFont = KaiTi ] + \setCJKsansfont { SimHei } [ AutoFakeBold = 3 ] + \setCJKmonofont { FangSong } +% +%<*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 ] +% + \setCJKfamilyfont { zhsong } { SimSun } + [ AutoFakeBold = 3 , ItalicFont = KaiTi ] + \setCJKfamilyfont { zhhei } { SimHei } [ AutoFakeBold = 3 ] + \setCJKfamilyfont { zhkai } { KaiTi } + \setCJKfamilyfont { zhfs } { FangSong } + } +% +% +%<*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 } } +% +%<*zh|ja> +%\@@_fontset_case:nnn +%\@@_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> + \setCJKmainfont { Songti~SC } + [ + UprightFont = *~Light , + BoldFont = *~Bold , + ItalicFont = Kaiti~SC~Regular , + BoldItalicFont = Kaiti~SC~Bold + ] + \setCJKsansfont { Heiti~SC } + [ + UprightFont = *~Medium , + AutoFakeBold = 3 + ] + \setCJKmonofont { STFangsong } +% +%<*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 + ] +% + \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 + ] + } +% +% +%<*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 } } +% +%<*zh|ja> +%\@@_fontset_case:nnn +%\@@_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> + \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 + ] +% +%<*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 + ] +% + \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 } + } +% +% +%<*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 } } +% +%<*zh|ja> +%\@@_fontset_case:nnn +%\@@_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> + \setCJKmainfont { AdobeSongStd-Light } + [ AutoFakeBold = 3 , ItalicFont = AdobeKaitiStd-Regular ] + \setCJKsansfont { AdobeHeitiStd-Regular } [ AutoFakeBold = 3 ] + \setCJKmonofont { AdobeFangsongStd-Regular } +% +%<*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 + ] +% + \setCJKfamilyfont { zhsong } { AdobeSongStd-Light } + [ AutoFakeBold = 3 , ItalicFont = AdobeKaitiStd-Regular ] + \setCJKfamilyfont { zhhei } { AdobeHeitiStd-Regular } [ AutoFakeBold = 3 ] + \setCJKfamilyfont { zhfs } { AdobeFangsongStd-Regular } + \setCJKfamilyfont { zhkai } { AdobeKaitiStd-Regular } + } +% +% +%<*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 } } +% +%<*zh|ja> +%\@@_fontset_case:nnn +%\@@_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> + \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 + ] +% +%<*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 + ] +% + \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 + ] + } +% +% +%<*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 } } +% +%<*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 } + } +% +% { \@@_fontset_error:nn { cjk } { founder } } + { +%<*zh> + \setCJKmainfont { FZShuSong-Z01 } + [ AutoFakeBold = 3 , ItalicFont = FZKai-Z03 ] + \setCJKsansfont { FZHei-B01 } [ AutoFakeBold = 3 ] + \setCJKmonofont { FZFangSong-Z02 } +% +%<*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 ] +% + \setCJKfamilyfont { zhsong } { FZShuSong-Z01 } + [ AutoFakeBold = 3 , ItalicFont = FZKai-Z03 ] + \setCJKfamilyfont { zhhei } { FZHei-B01 } [ AutoFakeBold = 3 ] + \setCJKfamilyfont { zhkai } { FZKai-Z03 } + \setCJKfamilyfont { zhfs } { FZFangSong-Z02 } + } +% +% +%<*!und> +\NewDocumentCommand \songti { } { \CJKfamily { zhsong } } +\NewDocumentCommand \heiti { } { \CJKfamily { zhhei } } +%\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs } } +\NewDocumentCommand \kaishu { } { \CJKfamily { zhkai } } +%\NewDocumentCommand \mincho { } { \CJKfamily { jamin } } +%\NewDocumentCommand \gothic { } { \CJKfamily { jagoth } } +% +% +% \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} } , +% 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 , +% \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@figurename@bi@second , + figure* .initial:n = { 图 } , + table* .tl_set:N = \SJTU@tablename@bi@second , + table* .initial:n = { 表 } , + algorithm .tl_set:N = \SJTU@algorithmname , + algorithm .initial:n = { Algorithm } , + listalgorithm .tl_set:N = \SJTU@listalgorithmname , + listalgorithm .initial:n = { List~of~Algorithms } , +%<*thesis> + abbr .tl_set:N = \SJTU@abbrname , + abbr .initial:n = { Abbreviations } , + nom .tl_set:N = \SJTU@nomname , + nom .initial:n = { Nomenclature } , + ack .tl_set:N = \SJTU@ackname , + ack .initial:n = { Acknowledgements } , + resume .tl_set:N = \SJTU@resumename , + resume .initial:n = { Resume } , + digest .tl_set:N = \SJTU@digestname , + digest .initial:n = { Digest } , + achv .tl_set:N = \SJTU@achvname , + achv .initial:n = { List~of~Research~Achievements }, +% + } +% +% \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 = { 学术论文和科研成果目录 } + } +% +% \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 } + } +% +% \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 = { 研究業績書 } + } +% +% +% \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 } } +% +%\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, +% 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 } +% +% \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 , +% header-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp } , +% header-font .initial:n = \zihao { -5 } \sffamily , + footer-font .tl_set:N = \l_@@_style_footer_font_tl , +% footer-font .initial:n = \zihao { -5 } \setbaselineskip { 12 bp } +% 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> + \includegraphics [ height = 1.2 cm ] + { sjtu-vi-logo-small-red.pdf } +% + } +%\tl_set:Nn \l_@@_leftmark_tl { \leftmark } +%\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 } + } +% +% \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 } + } + } +% +% \end{macrocode} +% +% |SJTU@null| 样式,不对当前页面样式做任何修改。 +% \begin{macrocode} +\cs_new_eq:NN \ps@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@page + { \hbox:n { } \thispagestyle { empty } \newpage } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{页码设置} +% +% 文档初始页码编码设置。 +% \begin{macrocode} +%\pagenumbering { Alph } +% \end{macrocode} +% +% \begin{macro}{\frontmatter} +% 前置部分使用大写罗马数字编码。 +% \begin{macrocode} +%<*thesis> +\RenewDocumentCommand \frontmatter { } + { + \cleardoublepage + \@mainmatterfalse + \pagenumbering { Roman } + } +% +% \end{macrocode} +% \end{macro} +% +% \subsection{章节标题结构} +% +% 设置章节标题样式。 +% \begin{macrocode} +%<*!article> +\ctex_set:nn { chapter } + { + pagestyle = SJTU@null , + fixskip = true , +%<*thesis> + beforeskip = 27 bp , + afterskip = 27 bp , + format = \zihao { 3 } \setbaselineskip{ 20 bp } \bfseries + \CJKsffamily \centering , +% +%<*report> + beforeskip = 30 pt , + afterskip = 24 pt , + format = \Large \bfseries \CJKsffamily \centering , +% + nameformat = , + titleformat = , + lofskip = \c_zero_skip , + lotskip = \c_zero_skip , + aftername = \quad + } +% +% +%<*scheme&(zh|ja)> +\keys_set_known:nn { ctex / chapter } + { name = { 第 \space , \space 章 } } +% +%<*class> +\ctex_set:nn { section } +%<*thesis> + { + beforeskip = 24 bp , + afterskip = 6 bp , + format = \zihao { 4 } \setbaselineskip { 18 bp } \bfseries + \CJKsffamily + } +% +% { format = \large \bfseries \CJKsffamily } +\ctex_set:nn { subsection } +%<*thesis> + { + beforeskip = 12 bp , + afterskip = 6 bp , + format = \zihao { -4 } \setbaselineskip { 16 bp } \bfseries + \CJKsffamily + } +% +% { format = \normalsize \bfseries \CJKsffamily } +\ctex_set:nn { subsubsection } +%<*thesis> + { + beforeskip = 6 bp , + afterskip = 6 bp , + format = \zihao { -4 } \setbaselineskip { 16 bp } \normalfont + } +% +% { 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 + { +%
part, +% 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@head,\@@_head_aux_s:nn,\@@_head_aux_s:nx, +% \@@_pdf_bookmark:nn,\@@_phantom_section:} +% 定义一个灵活的章节标题命令专门处理不同的需求。 +% \begin{macrocode} +\NewDocumentCommand \SJTU@head { s O{#3} m O{#2} } + { +% \CTEX@chapter@break + \IfBooleanTF {#1} + { \tl_if_empty:nF {#4} { \@@_pdf_bookmark:nn { 0 } {#4} } } + { + \@@_phantom_section: +% \addcontentsline { toc } { chapter } {#4} +%
\addcontentsline { toc } { section } {#4} + } + \cs_set_eq:NN \@@_orig_ctex_gettitle:n \CTEX@gettitle + \cs_set:Npn \CTEX@gettitle ##1 { \@@_orig_ctex_gettitle:n {#2} } +% \chapter* {#3} +%
\section* {#3} + \cs_set_eq:NN \CTEX@gettitle \@@_orig_ctex_gettitle:n + \@mkboth { \MakeUppercase {#2} } { \MakeUppercase {#2} } + } +%<*thesis> +\cs_new:Npn \@@_head_aux_s:nn #1#2 + { \SJTU@head* [#1] {#2} } +\cs_generate_variant:Nn \@@_head_aux_s:nn { nx } +% +\cs_new_eq:NN \@@_pdf_bookmark:nn \use_none:nn +\cs_new_eq:NN \@@_phantom_section: \prg_do_nothing: +% +% \end{macrocode} +% \end{macro} +% +% \subsection{段落} +% +% 设置全文首行缩进。 +% \begin{macrocode} +%<*scheme> +\ctex_if_autoindent_touched:F +% { \ctex_set:n { autoindent = true } } +% { \ctex_set:n { autoindent = 1.5 em } } +% { \ctex_set:n { autoindent = 1 } } +% \end{macrocode} +% +% \begin{macro}{\verse,\quotation} +% 修改诗歌和引用环境的缩进。 +% \begin{macrocode} +%\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 } +% +% \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@style@equation@font , +% equation-font .initial:x = \exp_not:N \linespread { } +% \exp_not:N \zihao { \g_@@_zihao_tl } +% 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@style@equation@font } } +\clist_map_inline:nn + { \start@gather, \start@align, \start@multline } + { + \ctex_patch_cmd:Nnn #1 + { \collect@body } + { + \SJTU@style@equation@font + \collect@body + } + } +\ctex_patch_cmd:Nnn \gather@split + { \spread@equation } + { + \SJTU@style@equation@font + \spread@equation + } +% \end{macrocode} +% \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@style@float@font , +% float-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp } +% float-font .initial:n = \zihao { 5 } + } +\ctex_patch_cmd:Nnn \@floatboxreset + { \normalsize } { \SJTU@style@float@font } +% \end{macrocode} +% \end{macro} +% +% \changes{v2.1}{2023/11/29}{更新题注格式。} +% \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} +% caption-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp } +% \bfseries , +% caption-font .initial:n = \zihao { 5 } \bfseries , + subcaption-font .code:n = + { \DeclareCaptionFont { SJTU@sub@font } {#1} } , +% subcaption-font .initial:n = \zihao { 5 } \setbaselineskip { 14 bp } +% \normalfont +% subcaption-font .initial:n = \zihao { 5 } \normalfont + } +\captionsetup + { + bi-slc = off , + labelsep = quad , +% skip = 6 bp + } +\captionsetup [ sub ] + { + bi-slc = on , + font = SJTU@sub@font , + format = hang + } +% \end{macrocode} +% \end{macro} +% +% 双语题注。 +% \begin{macrocode} +\DeclareCaptionOption { bi-second-names } [ ] + { + \tl_set:Nn \figurename { \SJTU@figurename@bi@second } + \tl_set:Nn \tablename { \SJTU@tablename@bi@second } + } +\captionsetup [ bi-second ] { bi-second-names } +% \end{macrocode} +% +% \changes{v2.1}{2023/12/02}{新增 \opt{style/num-sep}、 +% \opt{style/theorem-num-sep} 选项。} +% \begin{macro}{style/num-sep,style/float-num-sep, +% style/equation-num-sep,style/theorem-num-sep} +% 图、表、公式以及定理编号中的分隔符。 +% \begin{macrocode} +\keys_define:nn { sjtu / style } + { + num-sep .code:n = + { + \tl_set:Nn \SJTU@style@fl@num@sep {#1} + \tl_set:Nn \SJTU@style@eq@num@sep {#1} + \tl_set:Nn \@thmcountersep {#1} + } , + num-sep .initial:n = { . } , + float-num-sep .tl_set:N = \SJTU@style@fl@num@sep , + equation-num-sep .tl_set:N = \SJTU@style@eq@num@sep , + theorem-num-sep .tl_set:N = \@thmcountersep + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\SJTU@counterwithin} +% \begin{macrocode} +\NewDocumentCommand \SJTU@counterwithin + { s O{ \SJTU@style@fl@num@sep } O{ \arabic } m m } + { + \@ifbothcounters {#4} {#5} + { + \@addtoreset {#4} {#5} + \IfBooleanF {#1} + { + \cs_gset:cpo { the #4 } + { \cs:w the #5 \cs_end: #2 #3 {#4} } + } + } + } +% \end{macrocode} +% \end{macro} +% +% 定义图、表、公式的编号格式。 +% \begin{macrocode} +%<*!article> +\SJTU@counterwithin { figure } { chapter } +\SJTU@counterwithin { table } { chapter } +\SJTU@counterwithin [ \SJTU@style@eq@num@sep ] { equation } { chapter } +% +% \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 } +% +% \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@footnote } } +\cs_new:Nn \@@_thempfootnote_circled: + { { \l_@@_style_fnmark_font_tl \@@_footnote_number:N \c@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: + } + } +% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%<*scheme> +\keys_set:nn { sjtu / style } +% { fnmark-style = circled } +% { fnmark-style = plain } +% +% \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 + } + } +% +% +% \end{macrocode} +% +% \begin{macrocode} +%\@@_info_keys_define:n { zh } +%\@@_info_keys_define:n { en } +%\@@_info_keys_define:n { de } +%\@@_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 , + } +% +% \end{macrocode} +% \end{variable} +% +% \subsection{多语言支持} +% +% \changes{v2.0.3}{2023/04/08}{更新学位论文初始英文主题。} +% 初始化主题。 +% \begin{macrocode} +%<*lang> +%<*thesis> +%\keys_define:nn { sjtu / info / zh } +%\keys_define:nn { sjtu / info / en } +%\keys_define:nn { sjtu / info / de } +%\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 +% +%<*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 } +% +%<*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 +% +%<*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 +% + } + } +% +% \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} } +% +% \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} } +% +% \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} } +% +% \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} } +%
+% \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 + } +% +%<*en|de> +%\cs_new_protected:Nn \@@_set_language_en: +%\cs_new_protected:Nn \@@_set_language_de: + { +% \tl_set:Nn \languagename { english } +% \tl_set:Nn \languagename { ngerman } + \ctex_set:n { autoindent = 1.5 em } + \normalfont + } +% +%<*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 + } +% +% \end{macrocode} +% \end{macro} +% +% 标题页页面样式,页脚添加资助基金信息。 +% \begin{macrocode} +%<*thesis> +%\cs_new:Npn \ps@SJTU@fund@zh +%\cs_new:Npn \ps@SJTU@fund@en +%\cs_new:Npn \ps@SJTU@fund@de +%\cs_new:Npn \ps@SJTU@fund@ja + { + \ps@empty + \cs_set:Npn \@oddfoot + { + \minipage [ t ] { \textwidth } + \centering \zihao { - 5 } +% \clist_use:Nn \l_@@_info_fund_zh_clist { \par } +% \clist_use:Nn \l_@@_info_fund_en_clist { \par } +% \clist_use:Nn \l_@@_info_fund_de_clist { \par } +% \clist_use:Nn \l_@@_info_fund_ja_clist { \par } + \endminipage + } + \cs_set_eq:NN \@evenfoot \@oddfoot + } +% +% +% \end{macrocode} +% +% 初始化语言名称。 +% \begin{macrocode} +%<*scheme> +%\tl_set:Nn \languagename { chinese } +%\tl_set:Nn \languagename { english } +%\tl_set:Nn \languagename { ngerman } +%\tl_set:Nn \languagename { japanese } +% +% \end{macrocode} +% +% 载入语言配置。 +% \begin{macrocode} +%<*class> +%\clist_map_inline:Nn \g_@@_lang_clist +% { \file_input:n { sjtu-lang-thesis- #1 .def } } +%\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> + \tl_set:Nx \@date + { + \exp_last_unbraced:ce + { @@_date_aux_ \g_@@_lang_tl :w } #1 \q_stop + } +% + } + { + \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> + \tl_set:Nx \@date + { + \exp_last_unbraced:ce + { @@_date_aux_short_ \g_@@_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 { l_@@_info_date_ \g_@@_lang_tl _tl } +%\tl_set:NV \today \@date +% \end{macrocode} +% \end{macro} +% +% \subsection{标题页} +% +% \subsubsection{定义内部函数} +% +% 汉字分散对齐的环境。 +% \begin{macrocode} +%<*thesis> +\@@_engine_case:nnn + { + \NewDocumentEnvironment { SJTU@CJK@FTS } { m b } + { + \mode_leave_vertical: + \bool_set_false:N \l_@@_tmp_bool + \cs_set_eq:NN \SJTU@CJK@FTS@Symbol \CJKsymbol + \cs_set:Npn \CJKsymbol ##1 + { + \bool_if:NTF \l_@@_tmp_bool + { \hfil \SJTU@CJK@FTS@Symbol { ##1 } } + { + \SJTU@CJK@FTS@Symbol { ##1 } + \bool_set_true:N \l_@@_tmp_bool + } + } + \hbox_to_wd:nn {#1} {#2} + } { } + } + { + \NewDocumentEnvironment { SJTU@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@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@CT@D } [ 1 ] + { >{ \begin { SJTU@CJK@FTS } {#1} } c <{ \end { SJTU@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 } +% +% +% \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@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@fund@zh , + format = \linespread { } \@@_set_language_zh: , + prefix = title / zh , + components = { logo, subject, title, info, date } + } +% +%<*en|de|ja> +\clist_map_inline:nn + { + { subject } + { + format = \zihao { 4 } \setbaselineskip { 24 bp } \bfseries , +% content = \l_@@_info_subject_en_tl , +% content = \l_@@_info_subject_de_tl , +% content = \l_@@_info_subject_ja_tl , + bottom-skip = \c_zero_dim plus 1 fill + }, + { title } + { + format = \zihao { -2 } \setbaselineskip { 30 bp } \bfseries , +% content = \MakeUppercase \l_@@_info_display_title_en_tl , +% content = \MakeUppercase \l_@@_info_display_title_de_tl , +% content = \l_@@_info_display_title_ja_tl , + bottom-skip = \c_zero_dim plus 1 fill + }, + { info } + { + format = \zihao { 3 } \setbaselineskip { 30 bp } \bfseries , + content = + { +% \@@_title_page_info_i:nxx { en } +% \@@_title_page_info_i:nxx { de } +% \@@_title_page_info_i:nxx { ja } + { +% r @ { \exp_not:V \c_@@_name_info_sep_en_tl } +% r @ { \exp_not:V \c_@@_name_info_sep_de_tl } +% 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 = +% { \@@_title_page_info_ii:n { en } } , +% { \@@_title_page_info_ii:n { de } } , +% { \@@_title_page_info_ii:n { ja } } , + }, + } + { +% \@@_declare_component:nnn { title / en } #1 +% \@@_declare_component:nnn { title / de } #1 +% \@@_declare_component:nnn { title / ja } #1 + } +%<*en> +\@@_declare_page:nn { title / en } + { + style = SJTU@fund@en , + format = \linespread { } \@@_set_language_en: , + prefix = title / en , + components = { subject, title, info, date } + } +% +%<*de> +\@@_declare_page:nn { title / de } + { + style = SJTU@fund@de , + format = \linespread { } \@@_set_language_de: , + prefix = title / de , + components = { subject, title, info, date } + } +% +%<*ja> +\@@_declare_page:nn { title / ja } + { + style = SJTU@fund@ja , + format = \linespread { } \@@_set_language_ja: , + prefix = title / ja , + components = { subject, title, info, date } + } +% +% +% +% +% \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 } } + } +% +% \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 } + } + } + } + } +% +% \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@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@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} } + } { } +% +% \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 + } + } +% +% \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@head* { \contentsname } } + { \SJTU@head { \contentsname } } + \group_begin: + \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 } + \@starttoc { toc } + \group_end: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\SJTU@listof} +% \begin{macro}{\listoffigures,\listoffigures*,\listoftables,\listoftables*} +% 图表索引。 +% \begin{macrocode} +\NewDocumentCommand \SJTU@listof { m m s } + { + \IfBooleanTF {#3} + { \SJTU@head* {#1} } + { \SJTU@head {#1} } + \group_begin: + \cs_set:Npn \makebox [##1][##2]##3 { \, ##3 } + \exp_args:Nv \@starttoc { ext@ #2 } + \group_end: + } +\DeclareDocumentCommand \listoffigures { } + { \SJTU@listof { \listfigurename } { figure } } +\DeclareDocumentCommand \listoftables { } + { \SJTU@listof { \listtablename } { table } } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\tl_set:Nn \cftdotsep { 0.5 } +%\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 } +% +% \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 } +%
\skip_set:cn { cft #1 numwidth } { 1.8 em } +% \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@abbrname } } + { + \chapter {#1} + \tl_clear:N \SJTU@style@float@font + } { } +\NewDocumentEnvironment { abbreviation* } { O{ \SJTU@abbrname } } + { + \SJTU@head* {#1} + \tl_clear:N \SJTU@style@float@font + } { } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{nomenclature,nomenclature*} +% 符号对照表。 +% \begin{macrocode} +\NewDocumentEnvironment { nomenclature } { O{ \SJTU@nomname } } + { + \chapter {#1} + \tl_clear:N \SJTU@style@float@font + } { } +\NewDocumentEnvironment { nomenclature* } { O{ \SJTU@nomname } } + { + \SJTU@head* {#1} + \tl_clear:N \SJTU@style@float@font + } { } +% \end{macrocode} +% \end{macro} +% +% \changes{v2.0}{2023/03/17}{移除 \env{summary} 环境。} +% +% \begin{macro}{acknowledgements} +% 致谢,盲审模式下隐藏致谢。 +% \begin{macrocode} +\NewDocumentEnvironment { acknowledgements } { O{ \SJTU@ackname } +b } + { + \bool_if:NF \g_@@_review_bool + { + \SJTU@head {#1} + #2 + } + } { } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{achievements,bibliolist,bibliolist*} +% 发表论文与学术成果。 +% \begin{macrocode} +\newcounter { SJTU@bib } +\NewDocumentEnvironment { @bibliolist } { m } + { + \cs_if_exist_use:N \bibfont + \list + { + \tl_if_blank:nTF {#1} + { \hfill } + { \@biblabel { \arabic{ SJTU@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@bib } + \cs_set:Npn \p@SJTU@bib { } + \cs_set:Npn \theSJTU@bib { \arabic { SJTU@bib } } + } + \sloppy + \int_set:Nn \clubpenalty { 4000 } + \int_set_eq:NN \@clubpenalty \clubpenalty + \int_set:Nn \widowpenalty { 4000 } + \char_set_sfcode:nn { `\. } { 1000 } + } + { + \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@achvname } } + { + \SJTU@head {#1} + \setcounter { SJTU@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@resumename } +b } + { + \bool_if:NF \g_@@_review_bool + { + \SJTU@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@digestname } + { + \exp_not:N \MakeUppercase + { \exp_not:v { l_@@_info_title_ #1 _tl } } + } + #2 + } + } + { \msg_error:nnn { sjtutex } { lang-validation } {#1} } + } { } +% +% \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} } + } +% +% \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} } } +% +% \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> + pdftitle = \@title , + pdfauthor = \@author , + pdfsubject = \l_@@_info_subject_tl , + pdfkeywords = \l_@@_info_keywords_clist +% + } + } + } +% \end{macrocode} +% +% \subsubsection{\pkg{threeparttable} 宏包} +% +% \begin{macrocode} +\ctex_at_end_package:nn { threeparttable } + { \tl_put_right:Nn \TPTnoteSettings { \footnotesize } } +% \end{macrocode} +% +% \subsubsection{\pkg{longtable} 宏包} +% +% \begin{macrocode} +\ctex_at_end_package:nn { longtable } + { \AtBeginEnvironment { longtable } { \SJTU@style@float@font } } +% \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 + } +% { \exp_args:Nnv \newtheorem {##1} { c_@@_name_ ##1 _tl } [ chapter ] } +%
{ \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@listof {#5} {#3} } +% \SJTU@counterwithin { #3 } { chapter } +% \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@algorithm { \SJTU@algorithmname } + \tl_set:Nn \listalgorithmname { \SJTU@listalgorithmname } + \@@_newlistof:nnnnn { algorithm } { alg } { algorithm } + { \fname@algorithm } { \listalgorithmname } + } +% \end{macrocode} +% +% \pkg{algorithm2e} 宏包。 +% \begin{macrocode} +%\ctex_at_begin_package:nn { algorithm2e } +% { \cs_set_eq:NN \@@_save_chapter:w \@chapter } +\ctex_at_end_package:nn { algorithm2e } + { +% \cs_set_eq:NN \@chapter \@@_save_chapter:w + \SetAlgorithmName { \SJTU@algorithmname } + { \SJTU@algorithmname } + { \SJTU@listalgorithmname } + \SetAlgoCaptionSeparator { \enskip } + \@@_newlistof:nnnnn { algorithm } { alg } { algocf } + { \algorithmcfname } { \listalgorithmcfname } + \ctex_patch_cmd:Nnn \algocf@latexcaption + { \addcontentsline } + { \caption@iflist { \addcontentsline } { \@gobblethree } } + } +% \end{macrocode} +% +% \subsubsection{\pkg{nomencl} 宏包} +% \begin{macrocode} +\ctex_at_end_package:nn { nomencl } + { \tl_set:Nn \nomname { \SJTU@nomname } } +% \end{macrocode} +% +% \changes{v2.0.3}{2023/09/25}{添加 \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} +% +% \end{macrocode} +% +% \subsection{名称配置} +% \begin{macrocode} +%<*name> +%<*zh|ja> +\clist_map_inline:nn + { + { year } { 年 } , + { month } { 月 } , + { day } { 日 } + } +% { \@@_define_name:nnn { zh } #1 } +% { \@@_define_name:nnn { ja } #1 } +% +%<*en> +\clist_const:Nn \c_@@_name_month_en_clist + { + January, February, March, April, May, June, + July, August, September, October, November, December + } +%
+%<*de> +\clist_const:Nn \c_@@_name_month_de_clist + { + Januar, Februar, März, April, Mai, Juni, + Juli, August, September, Oktober, November, Dezember + } +%
+%<*thesis> +%<*zh> +\@@_define_symbol:nn { white_square } { "25A1 } +\@@_define_name_from_clist:nnnn { zh } + { degree_level } { \g_@@_thesis_type_int } + { 学士, 硕士, 博士 } +%
+%<*en> +\@@_define_name_from_clist:nnnn { en } + { degree_level } { \g_@@_thesis_type_int } + { Bachelor, Master, Doctor } +%
+%<*de> +\@@_define_name_from_clist:nnnn { de } + { degree_level } { \g_@@_thesis_type_int } + { Bachelor, Master, Doktor } +%
+%<*ja> +\@@_define_name_from_clist:nnnn { ja } + { degree_level } { \g_@@_thesis_type_int } + { 学士, 修士, 博士 } +% +% +%<*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 要 } , +% + { keywords } { 关键词 } , + { info_sep } { : \null } , + { item_sep } { , } + } +% { \@@_define_name:nnn { zh } #1 } +% { \@@_define_name:nn #1 } +% +%<*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 } , +% + { keywords } { Key~words } , + { info_sep } { :~ } , + { item_sep } { ,~ } + } +% { \@@_define_name:nnn { en } #1 } +% { \@@_define_name:nn #1 } +%
+%<*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 } , +% + { keywords } { Schlüsselwörter } , + { info_sep } { :~ } , + { item_sep } { ,~ } + } +% { \@@_define_name:nnn { de } #1 } +% { \@@_define_name:nn #1 } +%
+%<*ja> +\clist_map_inline:nn + { +%<*thesis> + { univ } { 上海交通大学 } , + { address } { 中国・上海 } , + { author } { 氏名 } , + { supervisor } { 指導教員 } , + { assoc_supervisor } { 副指導教員 } , + { co_supervisor } { 共同指導 } , + { thesis } { 学位請求論文 } , + { title_page } { 標題紙 } , + { declaration } { 誓約書・公表許諾書 } , + { abstract } { 要 \protect \quad 旨 } , +% + { keywords } { キーワード } , + { info_sep } { : \null } , + { item_sep } { \quad } + } +% { \@@_define_name:nnn { ja } #1 } +% { \@@_define_name:nn #1 } +% +%<*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 } } 日 + } +% +% +% +% \end{macrocode} +% +% \begin{macrocode} +%<*scheme> +\clist_map_inline:nn + { +%<*zh> + { assumption } { 假设 } , + { axiom } { 公理 } , + { conjecture } { 猜想 } , + { corollary } { 推论 } , + { definition } { 定义 } , + { example } { 例 } , + { exercise } { 练习 } , + { lemma } { 引理 } , + { problem } { 问题 } , + { proposition } { 命题 } , + { remark } { 注 } , + { solution } { 解 } , + { theorem } { 定理 } +% +%<*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 } +%
+%<*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 } +% +%<*ja> + { assumption } { 仮定 } , + { axiom } { 公理 } , + { conjecture } { 予想 } , + { corollary } { 系 } , + { definition } { 定義 } , + { example } { 例 } , + { exercise } { 練習 } , + { lemma } { 補題 } , + { problem } { 問題 } , + { proposition } { 命題 } , + { remark } { 注意 } , + { solution } { 解法 } , + { theorem } { 定理 } +% + } + { \@@_define_name:nn #1 } +% \end{macrocode} +% +% \begin{macrocode} +% +% \end{macrocode} +% +% \end{implementation} +% +% \Finale +% +\endinput diff --git a/macros/latex/contrib/sjtutex/sjtutex.pdf b/macros/latex/contrib/sjtutex/sjtutex.pdf new file mode 100644 index 0000000000..c14c72d1d6 Binary files /dev/null and b/macros/latex/contrib/sjtutex/sjtutex.pdf differ -- cgit v1.2.3