diff options
author | Karl Berry <karl@freefriends.org> | 2018-04-09 21:17:26 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-04-09 21:17:26 +0000 |
commit | c2963777bab7935e5a01b69f45bd913766ac922a (patch) | |
tree | 152c47e9e84e5c33e49ad7235c752db0ab5abea7 /Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx | |
parent | 6c211336f233c6fa76374d84bdec20e12ab498c9 (diff) |
fduthesis (9apr18)
git-svn-id: svn://tug.org/texlive/trunk@47408 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx | 6205 |
1 files changed, 6205 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx b/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx new file mode 100644 index 00000000000..15e14f125fb --- /dev/null +++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx @@ -0,0 +1,6205 @@ +% \iffalse meta-comment +% !TeX program = XeLaTeX +% !TeX encoding = UTF-8 +% +% Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com> +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3c of this license or (at your option) any later +% version. The latest version of this license is in: +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of +% LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Xiangdong Zeng. +% +% This work consists of the files fduthesis.dtx, +% fduthesis-doc.dtx, +% fduthesis-logo.dtx, +% fduthesis-template.tex, +% and the derived files fduthesis.ins, +% fduthesis.cls, +% fduthesis-en.cls, +% fduthesis.def, +% fdudoc.cls, +% fdulogo.sty, +% fdulogo-example.tex, +% fduthesis-cover.tex, +% fduthesis-en.tex, +% fduthesis.pdf, +% fduthesis-en.pdf, +% fduthesis-code.pdf, +% latexmkrc, +% latexmkrc-en, +% and README.md. +% +%<*internal> +\iffalse +%</internal> +% +%<*readme> +The `fduthesis` Class +===================== + +*LaTeX thesis template for Fudan University, v0.7a* + +Overview +-------- + +`fduthesis` is a thesis template for Fudan University. This template +is mostly written in LaTeX3, with a simple interface for users. + +At present, only XeTeX, LuaTeX and [ApTeX](https://github.com/clerkma/ptex-ng) +(experimental) are supported. + +The documentation can be found in +[fduthesis.pdf](https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis.pdf) +(in Chinese) or +[fduthesis-en.pdf](https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis-en.pdf) +(in English). + +Installation +------------ + +To install `fduthesis`, you can use one of the following methods: + +- Download + [fduthesis.tds.zip](https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis.tds.zip) + from GitHub, extract it in the root of one of your TDS trees, and + update the filename database. + +- Get the source (`fduthesis.zip`) from GitHub: + + git clone https://github.com/Stone-Zeng/fduthesis.git + + Run + + xetex fduthesis.dtx + + to generate the templates and configuration files. Then move the + following files into a directory where LaTeX will find them (e.g. + `TEXMF/tex/latex/fduthesis/`): + + - `fduthesis.cls` + - `fduthesis-en.cls` + - `fduthesis.def` + - `fdudoc.cls` + - `fdulogo.sty` + + Do not forget to update the filename database afterwards. + +Contributing +------------ + +[Issues](https://github.com/Stone-Zeng/fduthesis/issues) and +[pull requests](https://github.com/Stone-Zeng/fduthesis/pulls) +are always welcome. + +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.3c of this license or (at your option) any later +version. + +----- + +Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>. +%</readme> +% +%<*internal> +\fi +\begingroup + \def\NameOfLaTeXe{LaTeX2e} +\expandafter\endgroup\ifx\NameOfLaTeXe\fmtname\else +\csname fi\endcsname +%</internal> +% +%<*install> +\input l3docstrip.tex +\keepsilent +\askforoverwritefalse + +\preamble + + Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com> + + This work may be distributed and/or modified under the + conditions of the LaTeX Project Public License, either + version 1.3c of this license or (at your option) any later + version. The latest version of this license is in: + + http://www.latex-project.org/lppl.txt + + and version 1.3 or later is part of all distributions of + LaTeX version 2005/12/01 or later. + + This work has the LPPL maintenance status `maintained'. + + The Current Maintainer of this work is Xiangdong Zeng. + + This work consists of the files fduthesis.dtx, + fduthesis-doc.dtx, + fduthesis-logo.dtx, + fduthesis-template.tex, + and the derived files fduthesis.ins, + fduthesis.cls, + fduthesis-en.cls, + fduthesis.def, + fdudoc.cls, + fdulogo.sty, + fdulogo-example.tex, + fduthesis-cover.tex, + fduthesis-en.tex, + fduthesis.pdf, + fduthesis-en.pdf, + fduthesis-code.pdf, + latexmkrc, + latexmkrc-en, + and README.md. + +\endpreamble + +\generate{ + \usedir{tex/latex/fduthesis} + \file{\jobname.cls} {\from{\jobname.dtx}{class}} + \file{\jobname-en.cls} {\from{\jobname.dtx}{class-en}} + \file{\jobname.def} {\from{\jobname.dtx}{definition}} + \file{fdudoc.cls} {\from{\jobname.dtx}{doc} + \from{\jobname-doc.dtx}{doc}} + \file{fdulogo.sty} {\from{\jobname.dtx}{logo} + \from{\jobname-logo.dtx}{logo}} + \file{fdulogo-example.tex} {\from{\jobname.dtx}{ex-logo} + \from{\jobname-logo.dtx}{ex-logo}} + \file{\jobname-cover.tex} {\from{\jobname.dtx}{cover} + \from{\jobname-logo.dtx}{cover}} +%</install> +%<*internal> + \usedir{source/latex/fduthesis} + \file{\jobname.ins} {\from{\jobname.dtx}{install}} +%</internal> +%<*install> + \usedir{doc/latex/fduthesis} + \nopreamble\nopostamble + \file{README.md} {\from{\jobname.dtx}{readme}} + % ``.cfg'' is only for internal/temporal use. + % They will be renamed by external scripts. + \file{latexmkrc.cfg} {\from{\jobname-doc.dtx}{latexmk}} + \file{latexmkrc-en.cfg} {\from{\jobname-doc.dtx}{latexmk-en}} +} + +\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/fduthesis *} +\Msg{* *} +\Msg{* fduthesis.cls *} +\Msg{* fduthesis-en.cls *} +\Msg{* fduthesis.def *} +\Msg{* fdudoc.cls *} +\Msg{* fdulogo.sty *} +\Msg{* *} +\Msg{* To produce the documentation, run the file fduthesis.dtx *} +\Msg{* through XeLaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile +%</install> +% +%<*internal> +\fi +%</internal> +% +%<class|class-en|doc|logo>\NeedsTeXFormat{LaTeX2e} +%<class|class-en|doc|logo>\RequirePackage{expl3} +%<*!(driver|install|ex-logo|cover)> +%<!readme>\GetIdInfo $Id: fduthesis.dtx 0.7a 2018-04-09 12:00:00Z Xiangdong Zeng <xdzeng96@gmail.com> $ +%<class> {Thesis template for Fudan University} +%<class>\ProvidesExplClass{\ExplFileName} +%<class-en> {Thesis template for Fudan University (English version)} +%<class-en>\ProvidesExplClass{\ExplFileName-en} +%<definition> {Definition file for fduthesis} +%<definition>\ProvidesExplFile{\ExplFileName.def} +%<doc> {Documentation class for fduthesis} +%<doc>\ProvidesExplClass{fdudoc} +%<logo> {Fudan University's Visual Identity} +%<logo>\ProvidesExplPackage{fdulogo} +%<!readme> {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} +%</!(driver|install|ex-logo|cover)> +%<*driver> +%\PassOptionsToPackage{showframe}{geometry} +\documentclass{fdudoc} +\usepackage{xpinyin} +\hypersetup + { + pdftitle = {fduthesis: 复旦大学论文模板}, + pdfauthor = {曾祥东} + } +\renewcommand*\expstar{\hyperlink{expstar}{$\mfrake$}} +\renewcommand*\rexpstar{\hyperlink{rexpstar}{$\mfrakc$}} +% 全角标点放在引号中,需要改成半角式,否则间距过大,不好看 +\newcommand\FSID{“{\xeCJKsetup{PunctStyle=banjiao}。}”} ^^A U+3002 +\newcommand\FSFW{“{\xeCJKsetup{PunctStyle=banjiao}.}”} ^^A U+FF0E +\newcommand\COFW{“{\xeCJKsetup{PunctStyle=banjiao}:}”} ^^A U+FF1A +\newcommand\SCFW{“{\xeCJKsetup{PunctStyle=banjiao};}”} ^^A U+FF1B +\begin{document} + \DisableImplementation +%<!--CODEDOC--> \EnableImplementation +%<!--CODEDOC--> \def\FDUCODEDOC{} + \DocInput{fduthesis.dtx} +%<!--CODEDOC--> \DocInput{fduthesis-doc.dtx,fduthesis-logo.dtx} + \IndexLayout + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi +% +% \changes{v0.1}{2017/02/15}{开始编写模板。} +% \changes{v0.2}{2017/02/19}{使用 Git 进行版本控制,并发布至 GitHub。} +% \changes{v0.3}{2017/02/21}{使用 \cls{doc} 和 \pkg{DocStrip}。} +% \changes{v0.3}{2017/03/04}{支持 \LuaLaTeX{}。} +% \changes{v0.3}{2017/03/20}{添加测试文件。} +% \changes{v0.3}{2017/05/26}{使用 Travis CI 进行持续集成。} +% \changes{v0.3}{2017/06/23}{添加复旦大学视觉识别系统。} +% \changes{v0.3}{2017/07/05}{新增声明页。} +% \changes{v0.3}{2017/07/10}{添加英文模板。} +% \changes{v0.3}{2017/07/19}{使用 \pkg{l3docstrip} 管理名字空间。} +% \changes{v0.3}{2017/07/28}{整理代码,编写用户文档。} +% \changes{v0.4}{2017/08/03}{拆分 \file{dtx} 文件。} +% \changes{v0.4}{2017/08/11}{添加错误信息提示。} +% \changes{v0.6}{2017/11/23}{同步 \pkg{ctex} v2.4.11。} +% \changes{v0.6}{2017/11/29}{添加英文版用户文档。} +% \changes{v0.7}{2018/01/26}{使用 \pkg{l3build} 进行回归测试。} +% \changes{v0.7}{2018/01/31}{不再需要 \file{fduthesis-user.def}。} +% \changes{v0.7}{2018/03/04}{所有选项更改为用连字符隔开的形式。} +% \changes{v0.7a}{2018/04/09}{更新文档,发布至 CTAN。} +% +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +%^^A! \PassOptionsToPackage{scheme=plain, linespread=1.1}{ctex} +%^^A! \documentclass{fdudoc} +%^^A! \hypersetup +%^^A! { +%^^A! pdftitle = {fduthesis: LaTeX Thesis Template for Fudan University}, +%^^A! pdfauthor = {Xiangdong Zeng} +%^^A! } +%^^A! \ctexset +%^^A! { +%^^A! section = {name = {}, format+ = \raggedright}, +%^^A! subsubsection/tocline = {\CTEXnumberline{#1}#2} +%^^A! } +%^^A! \pagestyle{headings} +%^^A! \renewcommand*\expstar{\hyperlink{expstar}{$\mfrake$}} +%^^A! \renewcommand*\rexpstar{\hyperlink{rexpstar}{$\mfrakc$}} +%^^A! \newcommand\FSID{{\xeCJKsetup{PunctStyle=banjiao}。}} +%^^A! \newcommand\FSFW{{\xeCJKsetup{PunctStyle=banjiao}.}} +%^^A! \IndexPrologue{\section{Index}} +%^^A! \def\IndexLayout{% +%^^A! \setlength\IndexMin{0.5\textheight}% +%^^A! \ctexset{section/numbering=false}% +%^^A! \StopSpecialIndexModule} +%^^A! \def\indexname{Index} +%^^A! \let\usage\relax +%^^A! +% +% \title{\textcolor{MaterialIndigo800}{^^A +% \textbf{fduthesis: 复旦大学论文^^A +% \xpinyin[font=\sffamily]{模}{mu2}板}}} +% \author{曾祥东} +% \date{\today \quad v0.7a^^A +% \thanks{\url{https://github.com/Stone-Zeng/fduthesis}.}} +%^^A! \title{\textcolor{MaterialIndigo800}{% +%^^A! \textbf{The \textsf{fduthesis} Class \\ +%^^A! \LaTeX{} Thesis Template for Fudan University}}} +%^^A! \author{Xiangdong Zeng} +%^^A! \date{\today \quad v0.7a% +%^^A! \thanks{\url{https://github.com/Stone-Zeng/fduthesis}.}} +%^^A! +%^^A! \begin{document} +%^^A! +% +%^^A 禁止使用 " 符号作为抄录文本缩略符 +% \DeleteShortVerb\" +%^^A! \DeleteShortVerb\" +%^^A! +% +%^^A 封面与目录的页边距 +%^^A+ +% \newgeometry{ +% left = 1.25 in, +% right = 1.25 in, +% top = 1.25 in, +% bottom = 1.00 in +% } +% +% \maketitle +% \vfill +% \begin{center} +% \includegraphics[width=8cm]{../logo/fduthesis-cover.pdf} +% \end{center} +% \vfill +% \thispagestyle{plain} +% \clearpage +% +% \tableofcontents +% +%^^A- +% +% \EnableDocumentation +%^^A \DisableDocumentation +% +% \begin{documentation} +% +%^^A 用户手册的页边距 +%^^A+ +% \newgeometry{ +% left = 1.75 in, +% right = 1.00 in, +% top = 1.25 in, +% bottom = 1.00 in +% } +% +%^^A- +% +% \section{介绍} +%^^A! \section{Introduction} +%^^A! +% +% 目前,在网上可以找到的复旦大学 \LaTeX{} 论文模板主要有以下这些: +% \begin{itemize} +% \item 数学科学学院 2001 级的何力同学和李湛同学在 2005 年根据 +% 学校要求所设计的 \cls{毕业论文格式 tex04 版},以及 2008 年 +% 张越同学修改之后的 \cls{毕业论文格式 tex08 版},这是专为 +% 数院本科生撰写毕业论文而设计的 +% \scite{数院毕业论文格式,数院毕业论文格式更新}; +% \item Pandoxie 编写的 \cls{FDU-Thesis-Latex} +% \scite{pandoxie2014fduthesislatex},基本满足了博士(硕士) +% 毕业论文格式要求,使用人数较多; +% \item richarddzh 编写的硕士论文模板 \cls{fudan-thesis} +% \scite{richard2016fudanthesis}; +% \item hmshan 编写的博士论文模板 \cls{FDU_PhD_Thesis_Template} +% \scite{hmshan2017fduphdthesistemplate}。 +% \end{itemize} +% 以上这些模板大都没有经过系统的设计,也鲜有后续维护。相比之下, +% 清华大学 \scite{thuthesis}、重庆大学 \scite{cquthesis}、 +% 中国科学技术大学 \scite{zepinglee2017ustcthesis} 以及友校 +% 上海交通大学 \scite{weijianwen2017sjtuthesis}等,都有成熟、 +% 稳定的解决方案,值得参考。 +% +% 本模板将借鉴前辈经验,重新设计,并使用 \LaTeX3 +% \scite{interfaces3,source3} 编写,以适应 \TeX{} 技术发展潮流; +% 同时还将构建一套简洁的接口,方便用户使用。 +%^^A! \cls{fduthesis} is a thesis template for Fudan University. +%^^A! This template is mostly written in \LaTeX3 syntax, and +%^^A! provides a simple interface for users. +%^^A! +% +% \subsection*{\LaTeX{} 入门} +%^^A! \subsection*{Getting started with \LaTeX{}} +%^^A! +% +% 本文档并非是一份 \LaTeX{} 零基础教程。如果您是完完全全的新手, +% 建议先阅读相关入门文档,如刘海洋编著的《\LaTeX{} 入门》 +% \scite{刘海洋2013latex入门} 第一章,或大名鼎鼎的“\pkg{lshort}” +% \scite{lshort} 及其中文翻译版 \scite{lshort-zh-cn}。当然, +% 网络上的入门教程多如牛毛,您可以自行选取。 +%^^A! This documentation is \emph{not} a \LaTeX{} tutorial at +%^^A! starter's level. If you are totally a newbie, please read some +%^^A! introductions like the famous \pkg{lshort}. Of course, there +%^^A! are countless \LaTeX{} tutorials on the Internet. You can +%^^A! choose whatever you like. +%^^A! +% +% \subsection*{关于本文档} +%^^A! \subsection*{About this documentation} +%^^A! +% +% 本文采用不同字体表示不同内容。无衬线字体表示宏包名称,如 +% \pkg{xeCJK} 宏包、\cls{fduthesis} 文档类等;等宽字体表示代码或 +% 文件名,如 \cs{fdusetup} 命令、\env{abstract} 环境、\TeX{} 文档 +% \file{thesis.tex} 等;带有尖括号的楷体(或西文斜体)表示命令参数, +% 如 \meta{模板选项}、\meta{English title} 等。在使用时,参数两侧 +% 的尖括号不必输入。示例代码进行了语法高亮处理,以方便阅读。 +%^^A! In this documentation, different typefaces are used to +%^^A! represent different contents. Packages and classes are shown +%^^A! in sans-serif font, e.g.\ \pkg{xeCJK} package and +%^^A! \cls{fduthesis} class. Commands and file names are shown in +%^^A! monospaced font, e.g.\ command \cs{fdusetup}, environment +%^^A! \env{abstract} and \TeX{} document \file{thesis.tex}. +%^^A! Italic-shaped font with angle brackets outside means arguments, +%^^A! e.g.\ \meta{English title}. However, you do not need to type +%^^A! the brackets when using these commands. The example code has +%^^A! proper syntax highlighting so it will be much easier to read. +%^^A! +% +% 在用户手册中,带有蓝色侧边线的为 \LaTeX{} 代码,而带有粉色侧边线 +% 的则为命令行代码,请注意区分。模板提供的选项、命令、环境等, +% 均用横线框起,同时给出使用语法和相关说明。 +%^^A! \LaTeX{} code lines will have a blue line on their left, while +%^^A! for command lines there will be a pink line. The options, +%^^A! commands and environments in \cls{fduthesis} will be surrounded +%^^A! by two horizontal lines. Their usages and descriptions are +%^^A! provided at the same time. +%^^A! +% +% 本模板中的选项、命令或环境可以分为以下三类: +% \begin{itemize} +% \item 名字后面带有 \rexptarget\rexpstar{} 的,表示只能在^^A +% \emph{中文模板}中使用; +% \item 名字后面带有 \exptarget\expstar{} 的,表示只能在^^A +% \emph{英文模板}中使用; +% \item 名字后面不带有特殊符号的,表示既可以在中文模板中使用, +% 也可以在英文模板中使用。 +% \end{itemize} +%^^A! The options, commands and environments in \cls{fduthesis} can be +%^^A! divided into the following three types: +%^^A! \begin{itemize} +%^^A! \item Those can be only used in \emph{Chinese templates} are +%^^A! indicated by \rexptarget\rexpstar{}. +%^^A! \item Those can be only used in \emph{English templates} are +%^^A! indicated by \rexptarget\expstar{}. +%^^A! \item If they do not have special characters afterwards, then +%^^A! you can use them in both Chinese and English templates. +%^^A! \end{itemize} +%^^A! +% +% 代码实现主要面向对 \LaTeX{} 宏包开发感兴趣的用户。如果您有任何改进 +% 意见或者功能需求,欢迎前往 GitHub 仓库 +% \href{https://github.com/Stone-Zeng/fduthesis/issues}{提交 issue}。 +%^^A! If you want to read the implementation part, please turn to the +%^^A! Chinese version. Any issues or feature requests can be submitted +%^^A! in the \href{https://github.com/Stone-Zeng/fduthesis/issues}% +%^^A! {GitHub repository}. +%^^A! +% +% 文档的最后还提供了版本历史和代码索引,以供查阅。 +% +% \section{安装} +%^^A! \section{Installation} +%^^A! +% +% \subsection{获取 \cls{fduthesis}} +%^^A! \subsection{Obtaining \cls{fduthesis}} +%^^A! +% +% \subsubsection{标准安装} +%^^A! \subsubsection{Standard installation} +%^^A! +% +% 如果没有特殊理由,始终建议您使用宏包管理器安装 \cls{fduthesis}。 +% 例如在 \TeXLive{} 中,执行(可能需要管理员权限) +% \begin{shellexample}[morekeywords={tlmgr,install}] +% tlmgr install fduthesis +% \end{shellexample} +% 即可完成安装。 +%^^A! If there are no special reasons, it is always recommended to +%^^A! install \cls{fduthesis} with a package manager. For example, +%^^A! the following command will install the package in \TeXLive{} +%^^A! (administrator permission may be required): +%^^A! \begin{shellexample}[morekeywords={tlmgr,install}] +%^^A! tlmgr install fduthesis +%^^A! \end{shellexample} +%^^A! +% +% 在 \TeXLive{} 和 \MiKTeX{} 中,您还可以通过图形界面进行安装, +% 此处不再赘述。 +%^^A! In \TeXLive{} and \MiKTeX{}, you can also install \cls{fduthesis} +%^^A! through a graphical interface. It's rather simple and will not be +%^^A! described here. +%^^A! +% +% \subsubsection{手动安装} +%^^A! \subsubsection{Install manually} +%^^A! +% +% 如果您需要从 GitHub 上自行下载并手动安装,较好的方法是使用 TDS +% 安装包: +% \begin{itemize} +% \item 从 GitHub 上下载 \cls{fduthesis} 的 +% \href{https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis.tds.zip}{TDS 安装包}; +% \item 按目录结构将 \file{fduthesis.tds.zip} 中的文件复制到 \TeX{} +% 发行版的本地 TDS 根目录; +% \item 执行 \bashcmd{mktexlsr} 刷新文件名数据库以完成安装。 +% \end{itemize} +%^^A! If you want to download the template from GitHub and install it +%^^A! manually, the recommended way is to use the TDS ZIP file: +%^^A! \begin{itemize} +%^^A! \item Download the \href{https://github.com/Stone-Zeng/fduthesis/releases/download/v0.7a/fduthesis.tds.zip}% +%^^A! {TDS ZIP file} for \cls{fduthesis}; +%^^A! \item Copy all the files in \file{fduthesis.tds.zip} into the +%^^A! local TDS directory of \TeX{} distribution. +%^^A! \item Run \bashcmd{mktexlsr} to update the ls-R database. +%^^A! \end{itemize} +%^^A +% 您也可以从源代码直接生成模板(不推荐): +% \begin{itemize} +% \item 打开 \href{https://github.com/Stone-Zeng/fduthesis}^^A +% {项目主页},点击“Clone or download”,并选择“Download ZIP”, +% 下载 \file{fduthesis-master.zip};如果您的电脑中安装有 git +% 程序,也可通过以下命令直接克隆代码仓库: +% \begin{shellexample}[gobble=7,alsoletter={.},^^A +% morekeywords={git,clone}] +% git clone https://github.com/Stone-Zeng/fduthesis.git +% \end{shellexample} +% \item 解压并进入到 \file{source} 文件夹,执行以下命令以生成 +% 模板的各组件: +% \begin{shellexample}[gobble=7,morekeywords={xetex}] +% xetex fduthesis.dtx +% \end{shellexample} +% \item 将生成的文档类(\file{.cls})、宏包(\file{.sty})以及 +% 参数配置文件(\file{.def})复制到 \TeX{} 发行版本地 TDS 树 +% 的 \path{texmf-local/tex/latex/fduthesis/} 目录下,并执行 +% \bashcmd{mktexlsr} 刷新文件名数据库,方可完成安装。 +% \end{itemize} +%^^A! Although not recommended, you may generate the whole template +%^^A! from source code as well: +%^^A! \begin{itemize} +%^^A! \item Open the project's \href{https://github.com/Stone-Zeng/fduthesis}% +%^^A! {homepage}, click ``Clone or download'' and choose +%^^A! ``Download ZIP'' to download \file{fduthesis-master.zip}. +%^^A! If you have git program on your computer, you can also +%^^A! clone the repository directly: +%^^A! \begin{shellexample}[gobble=5,alsoletter={.},% +%^^A! morekeywords={git,clone}] +%^^A! git clone https://github.com/Stone-Zeng/fduthesis.git +%^^A! \end{shellexample} +%^^A! \item Extract files, and get into the \file{source} directory. +%^^A! Run the following command to generate all the components: +%^^A! \begin{shellexample}[gobble=5,morekeywords={xetex}] +%^^A! xetex fduthesis.dtx +%^^A! \end{shellexample} +%^^A! \item Copy the generated document classes (\file{.cls}), +%^^A! packages (\file{.sty}) and configuration files (\file{.def}) +%^^A! into \path{texmf-local/tex/latex/fduthesis/} under the local +%^^A! TDS tree of \TeX{} distribution. Then run \bashcmd{mktexlsr} +%^^A! to update the ls-R database. +%^^A! \end{itemize} +%^^A! +% +% \subsubsection{扁平化安装} +%^^A! \subsubsection{\cls{fduthesis} on the fly} +%^^A! +% +% 如果您不希望安装本模板,但需要立刻使用,也可以使用模板提供的安装脚本。 +% 从 GitHub 上获取代码仓库后,执行 \file{install-win.bat}(Windows 系统) +% 或 \file{install-linux.sh}(Linux 系统),所有需要的文件便会在 +% \file{thesis} 文件夹中生成。 +%^^A! If you don't want to install \cls{fduthesis} but need to use it +%^^A! at once, you can try the installation scripts. Download the +%^^A! repository from GitHub, run \file{install-win.bat} (on Windows) +%^^A! or \file{install-linux.sh} (on Linux), then all the necessary +%^^A! files will be found in the \file{thesis} folder. +%^^A! +% +% \subsection{模板组成} +%^^A! \subsection{Composition of the template} +%^^A! +% +% 本模板主要包含核心文档类、配置文件、附属宏包以及用户文档等几个 +% 部分,其具体组成见表~\ref{tab:fduthesis-components}。 +%^^A! There are several parts in \cls{fduthesis}, including kernel +%^^A! template classes, configuration files, affiliated packages and +%^^A! user's guides. More details are listed in table~% +%^^A! \ref{tab:fduthesis-components}. +%^^A! +% +% \begin{table}[ht] +% \caption{\cls{fduthesis} 的主要组成部分} +% \label{tab:fduthesis-components} +% \centering +% \begin{tabular}{lp{24em}} +% \toprule +% \textbf{文件} & \textbf{功能说明} \\ +% \midrule +% \file{fduthesis.cls} & 中文模板文档类 \\ +% \file{fduthesis-en.cls} & 英文模板文档类 \\ +% \file{fduthesis.def} & 参数配置文件,用于设定 +% \cls{fduthesis} 的初始参数,不建议您自行改动 \\ +% \file{fdudoc.cls} & 用户手册文档类 \\ +% \file{fdulogo.sty} & 复旦大学视觉识别系统 \\ +% \file{README.md} & 简要自述 \\ +% \ifdefined\FDUCODEDOC +% \file{fduthesis.pdf} & 中文用户手册 \\ +% \file{fduthesis-en.pdf} & 英文用户手册 \\ +% \file{fduthesis-code.pdf} & 模板实现代码(本文档) \\ +% \else +% \file{fduthesis.pdf} & 中文用户手册(本文档) \\ +% \file{fduthesis-en.pdf} & 英文用户手册 \\ +% \file{fduthesis-code.pdf} & 模板实现代码 \\ +% \fi +% \file{fduthesis-template.tex} & 空白模板,可据此为基础完成论文 +% 撰写 \\ +% \bottomrule +% \end{tabular} +% \end{table} +%^^A! \begin{table}[ht] +%^^A! \caption{The main components of \cls{fduthesis}} +%^^A! \label{tab:fduthesis-components} +%^^A! \centering +%^^A! \begin{tabular}{lp{24em}} +%^^A! \toprule +%^^A! \textbf{Files} & \textbf{Descriptions} \\ +%^^A! \midrule +%^^A! \file{fduthesis.cls} & Document class for Chinese thesis. \\ +%^^A! \file{fduthesis-en.cls} & Document class for English thesis.\\ +%^^A! \file{fduthesis.def} & Configuration parameters file +%^^A! for \cls{fduthesis}. Please do \emph{not} modify it. \\ +%^^A! \file{fdudoc.cls} & Document class for user guides. \\ +%^^A! \file{fdulogo.sty} & Fudan University's visual identity. \\ +%^^A! \file{README.md} & The brief introduction. \\ +%^^A! \file{fduthesis.pdf} & User's guide in Chinese. \\ +%^^A! \file{fduthesis-en.pdf} & User's guide in English (this +%^^A! document). \\ +%^^A! \file{fduthesis-code.pdf} & Code implementation. \\ +%^^A! \file{fduthesis-template.tex} & An empty thesis template, and you can +%^^A! write your thesis based on it. \\ +%^^A! \bottomrule +%^^A! \end{tabular} +%^^A! \end{table} +%^^A! +% +% 如需生成用户手册 \file{fduthesis.pdf},可在命令行中执行 +% \begin{shellexample}[morekeywords={xelatex,makeindex},emph={-o,-s,-t}] +% xelatex fduthesis.dtx +% makeindex -s gind.ist -o fduthesis.ind fduthesis.idx +% makeindex -s gglo.ist -o fduthesis.gls -t fduthesis.glg fduthesis.glo +% xelatex fduthesis.dtx +% xelatex fduthesis.dtx +% \end{shellexample} +% 也可使用 \pkg{latexmk}: +% \begin{shellexample}[morekeywords={latexmk}] +% latexmk fduthesis.dtx +% \end{shellexample} +% 本模板已经为编译用户手册提供了 \pkg{latexmk} 配置文件 +% \file{latexmkrc}。 +% +% \section{使用说明} +%^^A! \section{User's guide} +%^^A! +% +% \subsection{基本用法} +%^^A! \subsection{Getting started} +%^^A! +% +% 以下是一份简单的 \TeX{} 文档,它演示了 \cls{fduthesis} +% 的最基本用法: +%^^A! Here is a minimal \TeX{} file for \cls{fduthesis}: +%^^A+ +% \begin{latexexample}[deletetexcs={\documentclass},% +% moretexcs={\chapter},morekeywords={\documentclass},% +% emph={[2]document}] +% % thesis.tex +% \documentclass{fduthesis} +% \begin{document} +% \chapter{欢迎} +% \section{Welcome to fduthesis!} +% 你好,\LaTeX{}! +% \end{document} +% \end{latexexample} +%^^A- +%^^A! +% +% 按照 \ref{subsec:编译方式}~小节中的方式编译该文档,您应当得到 +% 一篇 5 页的文章。当然,这篇文章的绝大部分都是空白的。 +%^^A! Compile this file under the instructions in subsection~% +%^^A! \ref{subsec:compilation}, you will get a 5-page article. +%^^A! Of course, most of it will be blank, as you may predicate. +%^^A! +% +% 英文模板可以用类似的方式使用: +%^^A! The English version can be used in the same way: +%^^A+ +% \begin{latexexample}[deletetexcs={\documentclass},% +% moretexcs={\chapter},morekeywords={\documentclass},% +% emph={[2]document}] +% % thesis-en.tex +% \documentclass{fduthesis-en} +% \begin{document} +% \chapter{Welcome} +% \section{Welcome to fduthesis!} +% Hello, \LaTeX{}! +% \end{document} +% \end{latexexample} +%^^A- +% 英文模板只对正文部分进行了改动,封面、指导小组成员以及声明页仍将 +% 显示为中文。 +%^^A! The differences between English and Chinese version only +%^^A! live in the main body. Thesis cover, instructors list and +%^^A! declaration page are still printed in Chinese. +%^^A! +% +% \subsection{编译方式} \label{subsec:编译方式} +%^^A! \subsection{Compilation} \label{subsec:compilation} +%^^A! +% +% 本模板不支持 \pdfTeX{} 引擎,请使用 \XeLaTeX{} 或 \LuaLaTeX{} +% 编译。推荐使用 \XeLaTeX{}。为了生成正确的目录、脚注以及交叉引用, +% 您至少需要连续编译两次。 +%^^A! \cls{fduthesis} does NOT support \pdfTeX{}. Please use +%^^A! \XeLaTeX{} or \LuaLaTeX{} to compile, and \XeLaTeX{} is +%^^A! recommended. To get the correct table of contents, footnotes +%^^A! and cross-references, you need to compile the source file at +%^^A! least twice. +%^^A! +% +% 以下代码中,假设您的 \TeX{} 源文件名为 \file{thesis.tex}。 +% 使用 \XeLaTeX{} 编译论文,请在命令行中执行 +% \begin{shellexample}[morekeywords={xelatex}] +% xelatex thesis +% xelatex thesis +% \end{shellexample} +% 或使用 \pkg{latexmk}: +% \begin{shellexample}[morekeywords={latexmk},emph={-xelatex}] +% latexmk -xelatex thesis +% \end{shellexample} +%^^A! In the following example, suppose your \TeX{} source file is +%^^A! \file{thesis.tex}. Please execute the following commands if +%^^A! you want to use \XeLaTeX{}: +%^^A! \begin{shellexample}[morekeywords={xelatex}] +%^^A! xelatex thesis +%^^A! xelatex thesis +%^^A! \end{shellexample} +%^^A! You can use \pkg{latexmk} as well: +%^^A! \begin{shellexample}[morekeywords={latexmk},emph={-xelatex}] +%^^A! latexmk -xelatex thesis +%^^A! \end{shellexample} +%^^A! +% +% 使用 \LuaLaTeX{} 编译论文,请在命令行中执行 +% \begin{shellexample}[morekeywords={lualatex}] +% lualatex thesis +% lualatex thesis +% \end{shellexample} +% 或者 +% \begin{shellexample}[morekeywords={latexmk},emph={-lualatex}] +% latexmk -lualatex thesis +% \end{shellexample} +%^^A! \LuaLaTeX{} can be used in a similar way: +%^^A! \begin{shellexample}[morekeywords={lualatex}] +%^^A! lualatex thesis +%^^A! lualatex thesis +%^^A! \end{shellexample} +%^^A! or +%^^A! \begin{shellexample}[morekeywords={latexmk},emph={-lualatex}] +%^^A! latexmk -lualatex thesis +%^^A! \end{shellexample} +%^^A! +% +% 需要注意,请不要把模板中的配置文件 \file{latexmkrc} 放置在工作 +% 文件夹下。该配置文件仅适用于生成模板用户手册。 +%^^A! Note that you should not put the profile \file{latexmkrc} in +%^^A! your working directory. This file is meant to generate the +%^^A! user's guide. +%^^A! +% +% \subsection{模板选项} +%^^A! \subsection{Options of the template} +%^^A! +% +% 所谓“模板选项”,指需要在引入文档类的时候指定的选项: +% \begin{latexexample}[deletetexcs={\documentclass},% +% morekeywords={\documentclass}] +% \documentclass(*\oarg{模板选项}*){fduthesis} +% \documentclass(*\oarg{模板选项}*){fduthesis-en} +% \end{latexexample} +%^^A! You can specify some \emph{template options} when loading +%^^A! \cls{fduthesis}: +%^^A! \begin{latexexample}[deletetexcs={\documentclass},% +%^^A! morekeywords={\documentclass}] +%^^A! \documentclass(*\oarg{options}*){fduthesis} +%^^A! \documentclass(*\oarg{options}*){fduthesis-en} +%^^A! \end{latexexample} +%^^A! +% +% 有些模板选项为布尔型,它们只能在 \opt{true} 和 \opt{false} +% 中取值。对于这些选项,\kvopt{\meta{选项}}{true} 中的“|= true|” +% 可以省略。 +%^^A! Some options are \emph{boolean} --- they only take the value +%^^A! \opt{true} or \opt{false}. For these options, you can +%^^A! abbreviate ``\kvopt{\meta{option}}{true}'' simply to +%^^A! ``\opt{\meta{option}}''. +%^^A! +% +%^^A+ +% \begin{function}[added=2018-02-01]{type} +% \begin{fdusyntax}[emph={[1]type}] +% type = (*<doctor|master|(bachelor)>*) +% \end{fdusyntax} +%^^A- +% 选择论文类型。三种选项分别代表博士学位论文、硕士学位论文和本科 +% 毕业论文。 +% \end{function} +%^^A! Choose the type of your thesis. The three options represent +%^^A! doctoral dissertation, master degree thesis and undergraduate +%^^A! thesis, respectively. +%^^A! \end{function} +%^^A! +% +% \begin{function}{oneside,twoside} +% 指明论文的单双面模式,默认为 \opt{twoside}。该选项会影响每章 +% 的开始位置,还会影响页眉样式。 +% \end{function} +%^^A! \begin{function}{oneside,twoside} +%^^A! Specify whether single or double sided output should be +%^^A! generated. \opt{twoside} will be chosen by default. These +%^^A! option will determine where the new chapters begin and how +%^^A! the headers display. The option \opt{twoside} does +%^^A! \emph{not} tell the printer to actually make a two-sided +%^^A! printout. +%^^A! \end{function} +%^^A! +% +% 在双面模式(\opt{twoside})下,按照通常的排版惯例,每章应只从 +% 奇数页(在右)开始;而在单页模式(\opt{oneside})下,则可以从 +% 任意页面开始。本模板中,目录、摘要、符号表等均视作章,也按相同 +% 方式排版。 +%^^A! If choosing \opt{twoside}, chapters will begin at the odd pages +%^^A! (right hand). However, they will begin at arbitrary pages +%^^A! available when choosing \opt{oneside}. Table of contents, +%^^A! abstract and the list of symbols are considered as chapters and +%^^A! processed in the same way. +%^^A! +% +% 双面模式下,正文部分偶数页(在左)的左页眉显示章标题,奇数页 +% (在右)的右页眉显示节标题;前置部分的页眉按同样格式显示,但文字 +% 均为对应标题(如“{\kaishu 目\textvisiblespace{}录}”、 +% “{\kaishu 摘\textvisiblespace{}要}”等)。 +% 而在单面模式下,正文部分则页面不分奇偶,均同时显示左、右页眉, +% 文字分别为章标题和节标题;前置部分只有中间页眉,显示对应标题。 +%^^A! At two-sided mode, left headers on the even pages (left hand) +%^^A! in \emph{main body} will show the title of chapters, while the +%^^A! right headers on the odd pages (right hand) will show the +%^^A! title of sections. Headers in \emph{front matter} have the +%^^A! same style, but they will only show the title as +%^^A! ``\textit{Contents}'', ``\textit{Abstract}'', etc. +%^^A! +%^^A! At one-sided mode, both left and right headers on \emph{all} +%^^A! pages in main body will be shown. The text is the title of +%^^A! chapters and sections, respectively. In front matter, there +%^^A! are only middle headers, which show the corresponding titles. +%^^A! +% +% \begin{function}{draft} +% \begin{fdusyntax}[emph={[1]draft}] +% draft = (*<\TFF>*) +% \end{fdusyntax} +% 选择是否开启草稿模式,默认关闭。 +% \end{function} +%^^A! \begin{function}{draft} +%^^A! \begin{fdusyntax}[emph={[1]draft}] +%^^A! draft = (*<\TFF>*) +%^^A! \end{fdusyntax} +%^^A! Enable draft mode. Default off. +%^^A! \end{function} +%^^A! +% +% 草稿模式为全局选项,会影响到很多宏包的工作方式。 +% 开启之后,主要的变化有: +% \begin{itemize} +% \item 把行溢出的盒子显示为黑色方块; +% \item 不实际插入图片,只输出一个占位方框; +% \item 关闭超链接渲染,也不再生成 PDF 书签; +% \item 显示页面边框。 +% \end{itemize} +%^^A! \opt{draft} is a global option and will affect many packages. +%^^A! You may notice the following changes when using \opt{draft}: +%^^A! \begin{itemize} +%^^A! \item Lines with overfull \tn{hbox}'s will be marked with +%^^A! a thick black square on the right margin. +%^^A! \item Will not include graphics files actually, but instead +%^^A! print a box of the size the graphic would take up, as well +%^^A! as the file name. +%^^A! \item Will not make hyperlinks and PDF bookmarks. +%^^A! \item Show the page frames. +%^^A! \end{itemize} +%^^A! +% +% \begin{function}[added=2018-01-31]{config} +% \begin{fdusyntax}[emph={[1]config}] +% config = (*\marg{文件}*) +% \end{fdusyntax} +% 用户配置文件的文件名。默认为空,即不载入用户配置文件。 +% \end{function} +%^^A! \begin{function}[added=2018-01-31]{config} +%^^A! \begin{fdusyntax}[emph={[1]config}] +%^^A! config = (*\marg{file}*) +%^^A! \end{fdusyntax} +%^^A! File name of user profile. Default value is empty, so no +%^^A! profile is loaded automatically. +%^^A! \end{function} +%^^A! +% +% \subsection{参数设置} +%^^A! \subsection{More options} +%^^A! +% +% \begin{function}{\fdusetup} +% \begin{fdusyntax}[morekeywords={\fdusetup}] +% \fdusetup(*\marg{键值列表}*) +% \end{fdusyntax} +% 本模板提供了一系列选项,可由您自行配置。载入文档类之后,以下 +% 所有选项均可通过统一的命令 \cs{fdusetup} 来设置。 +% \end{function} +%^^A! \begin{function}{\fdusetup} +%^^A! \begin{fdusyntax}[morekeywords={\fdusetup}] +%^^A! \fdusetup(*\marg{key-value list}*) +%^^A! \end{fdusyntax} +%^^A! \cls{fduthesis} has provided a number of options, which +%^^A! can be given via the general command \cs{fdusetup}. +%^^A! \end{function} +%^^A! +% +% \cs{fdusetup} 的参数是一组由(英文)逗号隔开的选项列表,列表中的 +% 选项通常是 \kvopt{\meta{key}}{\meta{value}} 的形式。部分选项的 +% \meta{value} 可以省略。对于同一项,后面的设置将会覆盖前面的设置。 +% 在下文的说明中,将用\textbf{粗体}表示默认值。 +%^^A! The argument of \cs{fdusetup} is a set of comma-separated option +%^^A! list. The options usually have the form of \kvopt{\meta{key}}% +%^^A! {\meta{value}} and in some cases \meta{value} can be omitted. +%^^A! For the same option, the values given later will override the +%^^A! the previous ones. Default values are indicated in +%^^A! \textbf{boldface} in the following descriptions. +%^^A! +% +% \cs{fdusetup} 采用 \LaTeX3 风格的键值设置,支持不同类型以及多种 +% 层次的选项设定。键值列表中,“|=|”左右的空格不影响设置;但需注意, +% 参数列表中不可以出现空行。 +%^^A! \cs{fdusetup} follows \LaTeX3 key-value style, and different +%^^A! types as well as various levels options are supported. In the +%^^A! key-value list, spaces around ``|=|'' will be trimmed; however, +%^^A! blank lines should never appear in the argument. +%^^A! +% +% 与模板选项相同,布尔型的参数可以省略 \kvopt{\meta{选项}}{true} +% 中的“|= true|”。 +%^^A! Similar with template options, ``\kvopt{\meta{option}}{true}'' +%^^A! can be abbreviated to \opt{\meta{option}} for boolean type. +%^^A! +% +% 另有一些选项包含子选项,如 \opt{style} 和 \opt{info} 等。它们可以 +% 按如下两种等价方式来设定: +%^^A! Some options, such as \opt{style} and \opt{info}, may have +%^^A! sub-options. They can be set by the following two equivalent +%^^A! methods: +%^^A+ +% \begin{latexexample}[morekeywords={\fdusetup},% +% emph={[1]style,cjk-font,font-size,info,title,title*,author,author*,department}] +% \fdusetup{ +% style = {cjk-font = adobe, font-size = -4}, +% info = { +% title = {关于光产生和转变的一个启发性观点}, +% title* = {On a Heuristic Viewpoint Concerning the Production +% and Transformation of Light}, +% author = {阿尔伯特·爱因斯坦}, +% author* = {Albert Einstein}, +% department = {物理学系} +% } +% } +% \end{latexexample} +%^^A- +% 或者 +%^^A! or +%^^A+ +% \begin{latexexample}[morekeywords={\fdusetup},% +% emph={[1]style,cjk-font,font-size,info,title,title*,author,author*,department}] +% \fdusetup{ +% style/cjk-font = adobe, +% style/font-size = -4, +% info/title = {关于光产生和转变的一个启发性观点}, +% info/title* = {On a Heuristic Viewpoint Concerning the Production +% and Transformation of Light}, +% info/author = {阿尔伯特·爱因斯坦}, +% info/author* = {Albert Einstein}, +% info/department = {物理学系} +% } +% \end{latexexample} +%^^A- +%^^A! +% +% 注意 “|/|” 的前后均不可以出现空白字符。 +%^^A! Note that you may \emph{not} put spaces around ``|/|''. +%^^A! +% +% \subsubsection{论文格式} \label{subsubsec:论文格式} +%^^A! \subsubsection{Style and format} \label{subsubsec:style-and-format} +%^^A! +% +% \begin{function}{style} +% \begin{fdusyntax}[emph={[1]style}] +% style = (*\marg{键值列表}*) +% style/(*\meta{key}*) = (*\meta{value}*) +% \end{fdusyntax} +% 该选项包含许多子项目,用于设置论文格式。具体内容见下。 +% \end{function} +%^^A! \begin{function}{style} +%^^A! \begin{fdusyntax}[emph={[1]style}] +%^^A! style = (*\marg{key-value list}*) +%^^A! style/(*\meta{key}*) = (*\meta{value}*) +%^^A! \end{fdusyntax} +%^^A! This general option is for setting the thesis style and format. +%^^A! See the following details. +%^^A! \end{function} +%^^A! +% +%^^A+ +% \begin{function}[updated=2017-09-23]{style/font} +% \begin{fdusyntax}[emph={[1]font}] +% font = (*<libertinus|lm|palatino|(times)|none>*) +% \end{fdusyntax} +%^^A- +% 设置西文字体(包括数学字体)。 +% \end{function} +%^^A! Set the western fonts (including math fonts). +%^^A! \end{function} +%^^A! +% +%^^A+ +% \begin{function}[rEXP,updated=2017-09-23]{style/cjk-font} +% \begin{fdusyntax}[emph={[1]cjk-font}] +% cjk-font = (*<adobe|(fandol)|founder|mac|windows|none>*) +% \end{fdusyntax} +%^^A- +% 设置中文字体。 +% \end{function} +%^^A! Set CJK (Chinese, Japanese and Korean) fonts. +%^^A! \end{function} +%^^A! +% +% 启用 \kvopt{font}{none} 或 \kvopt{cjk-font}{none} 之后,模板将关闭 +% 默认西文 / 中文字体设置。此时,您需要自行使用 \cs{setmainfont}、 +% \cs{setCJKmainfont}、\cs{setmathfont} 等命令来配置字体。 +%^^A! When you choose \kvopt{font}{none} or \kvopt{cjk-font}{none}, +%^^A! \cls{fduthesis} will disable the default western/CJK font +%^^A! settings. You may use \cs{setmainfont}, \cs{setCJKmainfont} +%^^A! and \cs{set\-math\-font}, etc.\ to configure the fonts manually. +%^^A! +% +%^^A+ +% \begin{function}{style/font-size} +% \begin{fdusyntax}[emph={[1]font-size}] +% font-size = (*<(-4)|5>*) +% \end{fdusyntax} +%^^A- +% 设置论文的基础字号。 +% \end{function} +%^^A! Specify the basic font size in your thesis. +%^^A! \end{function} +%^^A! +% +%^^A+ +% \begin{function}[rEXP,updated=2017-10-14]{style/fullwidth-stop} +% \begin{fdusyntax}[emph={[1]fullwidth-stop}] +% fullwidth-stop = (*<catcode|mapping|(false)>*) +% \end{fdusyntax} +%^^A- +% 选择是否把全角实心句点\FSFW 作为默认的句号形状。 +% 这种句号一般用于科技类文章,以避免与下标“$_o$”或“$_0$”混淆。 +% \end{function} +%^^A! Let full-width full stop ``\FSFW'' as the default full stop. +%^^A! Generally, this punctuation is used for scientific articles, +%^^A! where ``\FSID'' is easily to be confused with subscript +%^^A! ``$_o$'' or ``$_0$''. +%^^A! \end{function} +%^^A! +% +% 选择 \kvopt{fullwidth-stop}{catcode} 或 \opt{mapping} 后,都会实现 +% 上述效果。有所不同的是,在选择 \opt{catcode} 后,只有^^A +% \emph{显式的}\FSID 会被替换为\FSFW,但在选择 \opt{mapping} 后, +% \emph{所有的}\FSID 都会被替换。例如,如果您用宏保存了一些含有^^A +% \FSID 的文字,那么在选择 \opt{catcode} 时,其中的\FSID 不会被 +% 替换为\FSFW。 +%^^A! If you choose \kvopt{fullwidth-stop}{catcode}, only +%^^A! \emph{explicit} ``\FSID'' will be replaced by ``\FSFW''; when +%^^A! choosing \kvopt{fullwidth-stop}{mapping}, however, \emph{all} +%^^A! the ``\FSID'' will be replaced. +%^^A! +% +% 选项 \kvopt{fullwidth-stop}{mapping} 只在 \XeTeX{} 下有效。使用 +% \LuaTeX{} 编译时,该选项相当于 \kvopt{fullwidth-stop}{catcode}。 +%^^A! \opt{mapping} is valid only under \XeTeX{}. When compiling +%^^A! with \LuaTeX{}, it is equivalent to \opt{catcode}. +%^^A! +% +% 如果您在选择 \kvopt{fullwidth-stop}{mapping} 后仍需要临时显示^^A +% \FSID,可以按如下方法操作: +% \begin{latexexample}[moretexcs={\CJKfontspec},emph={[1]Mapping}] +% % 请使用 XeTeX 编译 +% % 外侧的花括号表示分组 +% 这是一个句号{\CJKfontspec{(*\meta{字体名}*)}[Mapping=full-stop]。} +% \end{latexexample} +%^^A! If you want to display ``\FSID'' temporarily after setting +%^^A! \kvopt{fullwidth-stop}{mapping}, the following code snippet +%^^A! will be helpful: +%^^A! \begin{latexexample}[moretexcs={\CJKfontspec},emph={[1]Mapping}] +%^^A! % Compiled with XeTeX +%^^A! % The outside braces is used for group +%^^A! 这是一个句号{\CJKfontspec{(*\meta{font name}*)}[Mapping=full-stop]。} +%^^A! \end{latexexample} +%^^A! +% +% \begin{function}{style/footnote-style} +%^^A 这里奇怪的东西是用来控制对齐的。fdusyntax 会吃掉开头的几个 +%^^A 空格,因此这里用 X 来占位。 +% \begin{fdusyntax}[emph={[1]footnote-style}] +% footnote-style = (*<plain|\\ +% XXXXXX\mbox{}~~~~~~~~~~~~~~~~~libertinus|libertinus*|libertinus-sans|\\ +% XXXXXX\mbox{}~~~~~~~~~~~~~~~~~pifont|pifont*|pifont-sans|pifont-sans*|\\ +% XXXXXX\mbox{}~~~~~~~~~~~~~~~~~xits|xits-sans|xits-sans*>*) +% \end{fdusyntax} +% 设置脚注编号样式。西文字体设置会影响其默认取值(见 +% 表~\ref{tab:footnote-font})。因此,要使得该选项生效,需将其 +% 放置在 \opt{font} 选项之后。带有 |sans| 的为相应的无衬线字体 +% 版本;带有 |*| 的为阴文样式(即黑底白字)。 +% \end{function} +%^^A! \begin{function}{style/footnote-style} +%^^A! \begin{fdusyntax}[emph={[1]footnote-style}] +%^^A! footnote-style = (*<plain|\\ +%^^A! XXXX\mbox{}~~~~~~~~~~~~~~~~~libertinus|libertinus*|libertinus-sans|\\ +%^^A! XXXX\mbox{}~~~~~~~~~~~~~~~~~pifont|pifont*|pifont-sans|pifont-sans*|\\ +%^^A! XXXX\mbox{}~~~~~~~~~~~~~~~~~xits|xits-sans|xits-sans*>*) +%^^A! \end{fdusyntax} +%^^A! Set the style of footnote numbers. Note that western fonts +%^^A! will affect its default value (see table~\ref{tab:footnote-font}), +%^^A! so you may put it after |font| option. The one with |sans| +%^^A! is for the corresponding sans-serif version, while |*| +%^^A! for white on black version. +%^^A! \end{function} +%^^A! +% +% \begin{table}[ht] +% \caption{西文字体与脚注编号样式默认值的对应关系} +% \label{tab:footnote-font} +% \centering +% \begin{tabular}{ccccc} +% \toprule +% \textbf{西文字体设置} & +% |libertinus| & |lm| & |palatino| & |times| \\ +% \midrule +% \textbf{脚注编号样式默认值} & +% |libertinus| & |pifont| & |pifont| & |xits| \\ +% \bottomrule +% \end{tabular} +% \end{table} +%^^A! \begin{table}[ht] +%^^A! \caption{Relationship between option \opt{font} and the +%^^A! default value of \opt{footnote-style}} +%^^A! \label{tab:footnote-font} +%^^A! \centering +%^^A! \begin{tabular}{ccccc} +%^^A! \toprule +%^^A! \textbf{Western fonts settings} & +%^^A! |libertinus| & |lm| & |palatino| & |times| \\ +%^^A! \midrule +%^^A! \textbf{Default value of footnote number style} & +%^^A! |libertinus| & |pifont| & |pifont| & |xits| \\ +%^^A! \bottomrule +%^^A! \end{tabular} +%^^A! \end{table} +%^^A! +% +%^^A+ +% \begin{function}[added=2017-08-13]{style/hyperlink} +% \begin{fdusyntax}[emph={[1]hyperlink}] +% hyperlink = (*<border|(color)|none>*) +% \end{fdusyntax} +%^^A- +% 设置超链接样式。\opt{border} 表示在超链接四周绘制方框; +% \opt{color} 表示用彩色显示超链接;\opt{none} 表示没有特殊装饰, +% 可用于生成最终的打印版文稿。 +% \end{function} +%^^A! Set the style of hyperlinks. \opt{border} draws borders around +%^^A! hyperlinks; \opt{color} displays hyperlinks in colorful text; +%^^A! \opt{none} leads to plain text, which is useful when printing +%^^A! the final document. +%^^A! \end{function} +%^^A! +% +% \begin{function}[added=2017-08-13,updated=2017-12-08]{style/hyperlink-color} +% \begin{fdusyntax}[emph={[1]hyperlink-color}] +% hyperlink-color = (*<(default)|classic|elegant|fantasy|material|\\ +% XXXXXX\mbox{}~~~~~~~~~~~~~~~~~~business|science|summer|autumn|graylevel|prl>*) +% \end{fdusyntax} +% 设置超链接颜色。该选项在 \kvopt{hyperlink}{none} 时无效。 +% 各选项所代表的颜色见表~\ref{tab:hyperlink-color}。 +% \end{function} +%^^A! \begin{function}[added=2017-08-13,updated=2017-12-08]{style/hyperlink-color} +%^^A! \begin{fdusyntax}[emph={[1]hyperlink-color}] +%^^A! hyperlink-color = (*<(default)|classic|elegant|fantasy|material|\\ +%^^A! XXXX\mbox{}~~~~~~~~~~~~~~~~~~business|science|summer|autumn|graylevel|prl>*) +%^^A! \end{fdusyntax} +%^^A! Set the color of hyperlinks. It is invalid if +%^^A! \kvopt{hyperlink}{none}. The related colors can be found +%^^A! in table~\ref{tab:hyperlink-color}. +%^^A! \end{function} +%^^A! +% +%^^A+ +% \begin{table}[ht] +% \centering +%^^A- +% \newcommand\linkcolorexam[3]{^^A +% {\small 图~\textcolor[HTML]{#1}{1-2}, +% (\textcolor[HTML]{#1}{3.4})~式} & +% {\small \textcolor[HTML]{#2}{\texttt{http://g.cn}}} & +% {\small 文献~[\textcolor[HTML]{#3}{1}], +% (\textcolor[HTML]{#3}{Knuth~1986})}} +%^^A! \newcommand\linkcolorexam[3]{% +%^^A! {\small Fig.~\textcolor[HTML]{#1}{1-2}, +%^^A! Eq.~(\textcolor[HTML]{#1}{3.4})} & +%^^A! {\small \textcolor[HTML]{#2}{\texttt{http://g.cn}}} & +%^^A! {\small Ref.~[\textcolor[HTML]{#3}{1}], +%^^A! (\textcolor[HTML]{#3}{Knuth~1986})}} +% \begin{threeparttable} +% \caption{预定义的超链接颜色方案} +% \label{tab:hyperlink-color} +%^^A! \begin{threeparttable} +%^^A! \caption{Pre-defined hyperlink color schemes} +%^^A! \label{tab:hyperlink-color} +% \begin{tabular}{c*{3}{>{\hspace{0.2cm}}c<{\hspace{0.2cm}}}} +% \toprule +% \textsf{选项} & \textsf{链接} & \textsf{URL} & \textsf{引用} \\ +%^^A! \begin{tabular}{c*{3}{>{\hspace{0.2cm}}c<{\hspace{0.2cm}}}} +%^^A! \toprule +%^^A! \textsf{Options} & \textsf{Cross references} & \textsf{URL} & \textsf{Citation} \\ +%^^A+ +% \midrule +% \opt{default} & \linkcolorexam{990000}{0000B2}{007F00} \\ +% \opt{classic} & \linkcolorexam{FF0000}{0000FF}{00FF00} \\ +% \opt{elegant}\tnote{a} & \linkcolorexam{961212}{C31818}{9B764F} \\ +% \opt{fantasy}\tnote{b} & \linkcolorexam{FF4A19}{FF3F94}{934BA1} \\ +% \opt{material}\tnote{c} & \linkcolorexam{E91E63}{009688}{4CAF50} \\ +% \opt{business}\tnote{d} & \linkcolorexam{D14542}{295497}{1F6E43} \\ +% \opt{science}\tnote{e} & \linkcolorexam{CA0619}{389F9D}{FF8920} \\ +% \opt{summer}\tnote{f} & \linkcolorexam{00AFAF}{5F5FAF}{5F8700} \\ +% \opt{autumn}\tnote{f} & \linkcolorexam{D70000}{D75F00}{AF8700} \\ +% \opt{graylevel}\tnote{c} & \linkcolorexam{616161}{616161}{616161} \\ +% \opt{prl}\tnote{g} & \linkcolorexam{2D3092}{2D3092}{2D3092} \\ +% \bottomrule +% \end{tabular} +% \begin{tablenotes} +%^^A- +% \item[a] 来自 \href{https://tex.stackexchange.com/}^^A +% {\TeX{} - \LaTeX{} Stack Exchange 网站}。 +% \item[b] Adobe CC 产品配色。 +% \item[c] 取自 Material 色彩方案 +% (见 \url{https://material.io/guidelines/style/color.html})。 +% \item[d] Microsoft Office 2016 产品配色。 +% \item[e] 来自 \href{https://www.wolfram.com/}{Wolfram Research 网站}。 +% \item[f] 均取自 Solarized 色彩方案 +% (见 \url{http://ethanschoonover.com/solarized})。 +% \item[g] \textit{Physical Review Letter} 杂志配色。 +%^^A! \item[a] From \href{https://tex.stackexchange.com/}% +%^^A! {\TeX{} - \LaTeX{} Stack Exchange}. +%^^A! \item[b] Adobe CC. +%^^A! \item[c] Material Design color palette +%^^A! (See \url{https://material.io/guidelines/style/color.html}). +%^^A! \item[d] Microsoft Office 2016. +%^^A! \item[e] From \href{https://www.wolfram.com/}{Wolfram Research website}. +%^^A! \item[f] Solarized color palette +%^^A! (See \url{http://ethanschoonover.com/solarized}). +%^^A! \item[g] \textit{Physical Review Letter} magazine. +%^^A+ +% \end{tablenotes} +% \end{threeparttable} +% \end{table} +%^^A- +%^^A! +% +%^^A+ +% \begin{function}[added=2018-01-25]{style/bib-backend} +% \begin{fdusyntax}[emph={[1]bib-backend}] +% bib-backend = (*<bibtex|biblatex>*) +% \end{fdusyntax} +%^^A- +% 选择参考文献的支持方式。选择 \opt{bibtex} 后,将使用 \BibTeX{} +% 处理文献,样式由 \pkg{natbib} 宏包负责;选择 \opt{biblatex} 后, +% 将使用 \biber{} 处理文献,样式则由 \pkg{biblatex} 宏包负责。 +% \end{function} +%^^A! Specify the backend or driver of bibliography processing. +%^^A! \BibTeX{} and \pkg{natbib} package will be used if you choose +%^^A! \opt{bibtex}, while \biber{} and \pkg{biblatex} will be used +%^^A! if you choose \opt{biblatex}. +%^^A! \end{function} +%^^A! +% +% \begin{function}[added=2017-10-28,updated=2018-01-25]^^A +% {style/bib-style} +% \begin{fdusyntax}[emph={[1]bib-style}] +% bib-style = (*<author-year|(numerical)|\meta{其他样式}>*) +% \end{fdusyntax} +% 设置参考文献样式。\opt{author-year} 和 \opt{numerical} 分别对应 +% 国家标准 GB/T 7714--2015 \scite{gb-t-7714-2015} 中的著者—出版年制 +% 和顺序编码制。选择 \meta{其他样式} 时,如果 \kvopt{bib-backend}^^A +% {bibtex},需保证相应的 \file{.bst} 格式文件能被调用;而如果 +% \kvopt{bib-backend}{biblatex},则需保证相应的 \file{.bbx} 格式文件 +% 能被调用。 +% \end{function} +%^^A! \begin{function}[added=2017-10-28,updated=2018-01-25]% +%^^A! {style/bib-style} +%^^A! \begin{fdusyntax}[emph={[1]bib-style}] +%^^A! bib-style = (*<author-year|(numerical)|\meta{other style}>*) +%^^A! \end{fdusyntax} +%^^A! Set the style of bibliography. \opt{author-year} and +%^^A! \opt{numerical} will follow the standard GB/T 7714--2015. +%^^A! By setting \kvopt{bib-style}{\meta{other style}}, you can use +%^^A! other bibliography style (\file{.bst} file for +%^^A! \kvopt{bib-backend}{bibtex} and \file{.bbx} file for +%^^A! \kvopt{bib-backend}{biblatex}). Suffix is not needed. +%^^A! \end{function} +%^^A! +% +% \begin{function}[added=2018-01-25]{style/cite-style} +% \begin{fdusyntax}[emph={[1]cite-style}] +% cite-style = (*\marg{引用样式}*) +% \end{fdusyntax} +% 选择引用格式。默认为空,即与参考文献样式(著者—出版年制或顺序 +% 编码制)保持一致。如果手动填写,需保证相应的 \file{.cbx} 格式文件 +% 能被调用。该选项在 \kvopt{bib-backend}{bibtex} 时无效。 +% \end{function} +%^^A! \begin{function}[added=2018-01-25]{style/cite-style} +%^^A! \begin{fdusyntax}[emph={[1]cite-style}] +%^^A! cite-style = (*\marg{style}*) +%^^A! \end{fdusyntax} +%^^A! Select citation style. Default value is empty, which means +%^^A! the citation style will follow your bibliography style +%^^A! (author-year or numeric). If you want change the citation +%^^A! style, the corresponding \file{.cbx} file must be available. +%^^A! This option is invalid when \kvopt{bib-backend}{bibtex}. +%^^A! \end{function} +%^^A! +% +% \begin{function}[added=2018-01-25]{style/bib-resource} +% \begin{fdusyntax}[emph={[1]bib-resource}] +% bib-resource = (*\marg{文件}*) +% \end{fdusyntax} +% 参考文献数据源。可以是单个文件,也可以是用英文逗号隔开的一组文件。 +% 如果 \kvopt{bib-backend}{biblatex},则必须明确给出 \file{.bib} +% 后缀名。 +% \end{function} +%^^A! \begin{function}[added=2018-01-25]{style/bib-resource} +%^^A! \begin{fdusyntax}[emph={[1]bib-resource}] +%^^A! bib-resource = (*\marg{bib file(s)}*) +%^^A! \end{fdusyntax} +%^^A! Specify the bibliography database (usually in \file{.bib} +%^^A! format). If using more than one files, the file names should +%^^A! be separated with comma. When \kvopt{bib-backend}{biblatex}, +%^^A! you must type in the ``\file{.bib}'' suffix. +%^^A! \end{function} +%^^A! +% +% \begin{function}[added=2017-08-10]{style/logo} +% \begin{fdusyntax}[emph={[1]logo}] +% logo = (*\marg{文件}*) +% \end{fdusyntax} +% 封面中校名图片的文件名。默认值为 \file{fudan-name.pdf}。 +% \end{function} +%^^A! \begin{function}[added=2017-08-10]{style/logo} +%^^A! \begin{fdusyntax}[emph={[1]logo}] +%^^A! logo = (*\marg{file}*) +%^^A! \end{fdusyntax} +%^^A! File name of the logo in thesis cover. Default value is +%^^A! \file{fudan-name.pdf}. +%^^A! \end{function} +%^^A! +% +% \begin{function}[added=2017-08-10]{style/logo-size} +% \begin{fdusyntax}[emph={[1]logo-size}] +% logo-size = (*\marg{宽度}*) +% logo-size = {(*\meta{宽度}*), (*\meta{高度}*)} +% \end{fdusyntax} +% 校名图片的大小。默认仅指定了宽度,为 |0.5\textwidth|\/。 +% 如果仅需指定高度,可在 \meta{宽度} 处填入一个空的分组 |{}|。 +% \end{function} +%^^A! \begin{function}[added=2017-08-10]{style/logo-size} +%^^A! \begin{fdusyntax}[emph={[1]logo-size}] +%^^A! logo-size = (*\marg{width}*) +%^^A! logo-size = {(*\meta{width}*), (*\meta{height}*)} +%^^A! \end{fdusyntax} +%^^A! Size of the logo. By default, only width is set to +%^^A! |0.5\textwidth|. To set height only, you can put an +%^^A! empty group ``|{}|'' at \meta{width}. +%^^A! \end{function} +%^^A! +% +%^^A+ +% \begin{function}[added=2017-07-06]{style/auto-make-cover} +% \begin{fdusyntax}[emph={[1]auto-make-cover}] +% auto-make-cover = (*<\TTF>*) +% \end{fdusyntax} +%^^A- +% 是否自动生成论文封面(封一)、指导小组成员名单(封二)和 +% 声明页(封三)。封面中的各项信息,可通过 \cs{fdusetup} 录入, +% 具体请参阅 \ref{subsubsec:信息录入}~节。 +% \end{function} +%^^A! Whether generate thesis cover, list of instructors (inside +%^^A! front cover) and declaration page (inside back cover) +%^^A! automatically. Entries in the cover can be specified also +%^^A! via \cs{fdusetup}, and you can find more details in +%^^A! subsubsection~\ref{subsubsec:information}. +%^^A! \end{function} +%^^A! +% +% \begin{function}{\makecoveri,\makecoverii,\makecoveriii} +% 用于手动生成论文封面、指导小组成员名单和声明页。这几个命令不能 +% 确保页码的正确编排,因此除非必要,您应当始终使用自动生成的封面。 +% \end{function} +%^^A! \begin{function}{\makecoveri,\makecoverii,\makecoveriii} +%^^A! For generating thesis cover, list of instructors and +%^^A! declaration page manually. These commands cannot ensure +%^^A! the correct page numbers, hence you should always use the +%^^A! auto-generated thesis cover unless necessary. +%^^A! \end{function} +%^^A! +% +% \subsubsection{信息录入} \label{subsubsec:信息录入} +%^^A! \subsubsection{Personal information} \label{subsubsec:information} +%^^A! +% +% \begin{function}{info} +% \begin{fdusyntax}[emph={[1]info}] +% info = (*\marg{键值列表}*) +% info/(*\meta{key}*) = (*\meta{value}*) +% \end{fdusyntax} +% 该选项包含许多子项目,用于录入论文信息。具体内容见下。以下带“|*|” +% 的项目表示对应的英文字段。 +% \end{function} +%^^A! \begin{function}{info} +%^^A! \begin{fdusyntax}[emph={[1]info}] +%^^A! info = (*\marg{key-value list}*) +%^^A! info/(*\meta{key}*) = (*\meta{value}*) +%^^A! \end{fdusyntax} +%^^A! This general option is for entering your personal information. +%^^A! See the following details. Note that options with ``|*|'' are +%^^A! the corresponding English items. +%^^A! \end{function} +%^^A! +% +%^^A+ +% \begin{function}[added=2018-02-01]{info/degree} +% \begin{fdusyntax}[emph={[1]degree}] +% degree = (*<(academic)|professional>*) +% \end{fdusyntax} +%^^A- +% 学位类型。本选项仅用于硕士学位论文,\opt{academic} 和 +% \opt{professional} 分表表示学术学位和专业学位。 +% \end{function} +%^^A! Degree type. This option can only be used in master degree +%^^A! thesis. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/title,info/title*} +% \begin{fdusyntax}[emph={[1]title,title*}] +% title = (*\marg{中文标题}*) +% title* = (*\marg{英文标题}*) +% \end{fdusyntax} +% 论文标题。默认会在约 20 个汉字字宽处强制断行,但为了语义的 +% 连贯以及排版的美观,如果您的标题长于一行,建议使用“|\\|” +% 手动断行。 +% \end{function} +%^^A! \begin{function}{info/title,info/title*} +%^^A! \begin{fdusyntax}[emph={[1]title,title*}] +%^^A! title = (*\marg{title in Chinese}*) +%^^A! title* = (*\marg{title in English}*) +%^^A! \end{fdusyntax} +%^^A! Title of your thesis. The line width is about \SI{30}{em} by +%^^A! default, but you may break it with |\\| manually. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/author,info/author*} +% \begin{fdusyntax}[emph={[1]author,author*}] +% author = (*\marg{姓名}*) +% author* = (*\marg{英文姓名(或拼音)}*) +% \end{fdusyntax} +% 作者姓名。 +% \end{function} +%^^A! \begin{function}{info/author,info/author*} +%^^A! \begin{fdusyntax}[emph={[1]author,author*}] +%^^A! author = (*\marg{name in Chinese}*) +%^^A! author* = (*\marg{name in English \lparen or Pinyin\rparen}*) +%^^A! \end{fdusyntax} +%^^A! Author's name. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/supervisor} +% \begin{fdusyntax}[emph={[1]supervisor}] +% supervisor = (*\marg{姓名}*) +% \end{fdusyntax} +% 导师姓名。 +% \end{function} +%^^A! \begin{function}{info/supervisor} +%^^A! \begin{fdusyntax}[emph={[1]supervisor}] +%^^A! supervisor = (*\marg{name}*) +%^^A! \end{fdusyntax} +%^^A! Supervisor's name. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/department} +% \begin{fdusyntax}[emph={[1]department}] +% department = (*\marg{名称}*) +% \end{fdusyntax} +% 院系名称。 +% \end{function} +%^^A! \begin{function}{info/department} +%^^A! \begin{fdusyntax}[emph={[1]department}] +%^^A! department = (*\marg{name}*) +%^^A! \end{fdusyntax} +%^^A! Name of the department. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/major} +% \begin{fdusyntax}[emph={[1]major}] +% major = (*\marg{名称}*) +% \end{fdusyntax} +% 专业名称。 +% \end{function} +%^^A! \begin{function}{info/major} +%^^A! \begin{fdusyntax}[emph={[1]major}] +%^^A! major = (*\marg{name}*) +%^^A! \end{fdusyntax} +%^^A! Name of the major. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/student-id} +% \begin{fdusyntax}[emph={[1]student-id}] +% student-id = (*\marg{数字}*) +% \end{fdusyntax} +% 作者学号。 +% \end{function} +%^^A! \begin{function}{info/student-id} +%^^A! \begin{fdusyntax}[emph={[1]student-id}] +%^^A! student-id = (*\marg{number}*) +%^^A! \end{fdusyntax} +%^^A! Author's student ID. +%^^A! \end{function} +%^^A! +% +% 复旦大学学号共 11 位,前两位为入学年份,之后一位为学生类型 +% 代码(博士生为 1,硕士生为 2,本科生为 3),接下来的五位为 +% 专业代码,最后三位为顺序号。 +%^^A! In Fudan University, student ID has 11 digits. The first two +%^^A! are the year of attendance; next one represents the student's +%^^A! type (1 for doctor, 2 for master and 3 for bachelor); the +%^^A! following five digits are major ID while the last three are +%^^A! serial number. +%^^A! +% +% \begin{function}{info/school-id} +% \begin{fdusyntax}[emph={[1]school-id}] +% school-id = (*\marg{数字}*) +% \end{fdusyntax} +% 学校代码。默认值为 10246(这是复旦大学的学校代码)。 +% \end{function} +%^^A! \begin{function}{info/school-id} +%^^A! \begin{fdusyntax}[emph={[1]school-id}] +%^^A! school-id = (*\marg{number}*) +%^^A! \end{fdusyntax} +%^^A! School ID. Default value is 10246 (school ID of Fudan University). +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/date} +% \begin{fdusyntax}[emph={[1]date}] +% date = (*\marg{日期}*) +% \end{fdusyntax} +% 论文完成日期。默认值为文档编译日期(\tn{today})。 +% \end{function} +%^^A! \begin{function}{info/date} +%^^A! \begin{fdusyntax}[emph={[1]date}] +%^^A! date = (*\marg{date}*) +%^^A! \end{fdusyntax} +%^^A! Finish date of your thesis. Default value is the compilation +%^^A! date (\tn{today}). +%^^A! \end{function} +%^^A! +% +%^^A+ +% \begin{function}[added=2017-07-04]{info/secret-level} +% \begin{fdusyntax}[emph={[1]secret-level}] +% secret-level = (*<(none)|i|ii|iii>*) +% \end{fdusyntax} +%^^A- +% 密级。\opt{i}、\opt{ii}、\opt{iii} 分别表示秘密、机密、绝密; +% \opt{none} 表示论文不涉密,即不显示密级与保密年限。 +% \end{function} +%^^A! Secret level. \opt{i}, \opt{ii} and \opt{iii} means +%^^A! ``秘密'' (secret), ``机密'' (confidential) and ``绝密'' +%^^A! (top secret) respectively. \opt{none} means your thesis is +%^^A! not secret-related and secret level and year will not be +%^^A! shown. +%^^A! \end{function} +%^^A! +% +% \begin{function}[added=2017-07-04]{info/secret-year} +% \begin{fdusyntax}[emph={[1]secret-year}] +% secret-year = (*\marg{年限}*) +% \end{fdusyntax} +% 保密年限。建议您使用中文,如“五年”。该选项在设置 +% \kvopt{secret-level}{none} 时无效。 +% \end{function} +%^^A! \begin{function}[added=2017-07-04]{info/secret-year} +%^^A! \begin{fdusyntax}[emph={[1]secret-year}] +%^^A! secret-year = (*\marg{year}*) +%^^A! \end{fdusyntax} +%^^A! Secret year. It's recommended to use Chinese word as ``五年'' +%^^A! (5 years) here. This option is invalid if you have set +%^^A! \kvopt{secret-level}{none}. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/instructors} +% \begin{fdusyntax}[emph={[1]instructors}] +% instructors = (*\marg{成员 1, 成员 2, ...}*) +% \end{fdusyntax} +% 指导小组成员。各成员之间需使用英文逗号隔开。为防止歧义, +% 可以用分组括号“|{...}|”把各成员字段括起来。 +% \end{function} +%^^A! \begin{function}{info/instructors} +%^^A! \begin{fdusyntax}[emph={[1]instructors}] +%^^A! instructors = (*\marg{member 1, member 2, ...}*) +%^^A! \end{fdusyntax} +%^^A! Instructors' name. Each name should be separated with +%^^A! comma. To disambiguate, you may put text containing comma +%^^A! into a group ``|{...}|''. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/keywords,info/keywords*} +% \begin{fdusyntax}[emph={[1]keywords,keywords*}] +% keywords = (*\marg{中文关键字}*) +% keywords* = (*\marg{英文关键字}*) +% \end{fdusyntax} +% 关键字列表。各关键字之间需使用英文逗号隔开。为防止歧义, +% 可以用分组括号“|{...}|”把各字段括起来。 +% \end{function} +%^^A! \begin{function}{info/keywords,info/keywords*} +%^^A! \begin{fdusyntax}[emph={[1]keywords,keywords*}] +%^^A! keywords = (*\marg{keywords in Chinese}*) +%^^A! keywords* = (*\marg{keywords in English}*) +%^^A! \end{fdusyntax} +%^^A! Keywords list. Each keyword should be separated with comma. +%^^A! To disambiguate, you may put text containing comma into a +%^^A! group ``|{...}|''. +%^^A! \end{function} +%^^A! +% +% \begin{function}{info/clc} +% \begin{fdusyntax}[emph={[1]clc}] +% clc = (*\marg{分类号}*) +% \end{fdusyntax} +% 中图分类号(CLC)。 +% \end{function} +%^^A! \begin{function}{info/clc} +%^^A! \begin{fdusyntax}[emph={[1]clc}] +%^^A! clc = (*\marg{classification codes}*) +%^^A! \end{fdusyntax} +%^^A! Chinese Library Classification (CLC). +%^^A! \end{function} +%^^A! +% +% \subsection{正文编写} +%^^A! \subsection{Writing your thesis} +%^^A! +% +% \begin{quote*}[喬孟符][宋] +% 作樂府亦有法,曰\CJKunderdot{鳳頭豬肚豹尾}六字是也。 +% 大概起要美麗,中要浩蕩,結要響亮。尤貴在首尾貫穿,意思清新。 +% 茍能若是,斯可以言樂府矣。 +% \end{quote*} +% +% \subsubsection{凤头} +%^^A! \subsubsection{Front matter} +%^^A! +% +% \begin{function}{\frontmatter} +% 声明前置部分开始。 +% \end{function} +%^^A! \begin{function}{\frontmatter} +%^^A! Declare the beginning of front matter. +%^^A! \end{function} +%^^A! +% +% 在本模板中,前置部分包含目录、中英文摘要以及符号表等。 +% 前置部分的页码采用小写罗马字母,并且与正文分开计数。 +%^^A! Front matter contains table of contents, abstracts and notation +%^^A! list. The page numbers in front matter will be shown in +%^^A! lowercase Roman numerals, and will be counted separately with +%^^A! main matter. +%^^A! +% +% \begin{function}{\tableofcontents} +% 生成目录。为了生成完整、正确的目录,您至少需要编译\emph{两次}。 +% \end{function} +%^^A! \begin{function}{\tableofcontents} +%^^A! Generate the table of contents (TOC). You need to compile +%^^A! the source file at least \emph{twice} to get the correct TOC. +%^^A! \end{function} +%^^A! +% +%^^A TODO: \DescribeEnv{abstract} +%^^A TODO: \DescribeEnv{abstract*} +% \begin{function}{abstract} +% \begin{fdusyntax}[emph={[2]abstract}] +% % 中文论文模板 (fduthesis) % 英文论文模板 (fduthesis-en) +% \begin{abstract} \begin{abstract} +% (*\meta{中文摘要} \hspace{3.52cm} \meta{英文摘要}*) +% \end{abstract} \end{abstract} +% \end{fdusyntax} +% \end{function} +% \begin{function}[rEXP]{abstract*} +% \begin{fdusyntax}[emph={[2]abstract*}] +% % 中文论文模板 (fduthesis) +% \begin{abstract*} +% (*\meta{英文摘要}*) +% \end{abstract*} +% \end{fdusyntax} +% 摘要。中文模板中,不带星号和带星号的版本分别用来输入中文摘要 +% 和英文摘要;英文模板中没有带星号的版本,您只需输入英文摘要。 +% \end{function} +%^^A! \begin{function}{abstract} +%^^A! \begin{fdusyntax}[emph={[2]abstract}] +%^^A! % fduthesis (Chinese thesis) % fduthesis-en (English thesis) +%^^A! \begin{abstract} \begin{abstract} +%^^A! (*\meta{Chinese abstract} \hspace{3cm} \meta{English abstract}*) +%^^A! \end{abstract} \end{abstract} +%^^A! \end{fdusyntax} +%^^A! \end{function} +%^^A! \begin{function}[rEXP]{abstract*} +%^^A! \begin{fdusyntax}[emph={[2]abstract*}] +%^^A! % Only for fduthesis +%^^A! \begin{abstract*} +%^^A! (*\meta{English abstract}*) +%^^A! \end{abstract*} +%^^A! \end{fdusyntax} +%^^A! Abstract environment. In \cls{fduthesis}, \env{abstract} and +%^^A! \env{abstract*} are used for Chinese and English abstract, +%^^A! respectively; while in \cls{fduthesis-en}, there is no +%^^A! \env{abstract*} environment and you need to write the English +%^^A! abstract merely. +%^^A! \end{function} +%^^A! +% +% 摘要的最后,会显示关键字列表以及中图分类号(CLC)。 +% 这两项可通过 \cs{fdusetup} 录入,具体 +% 请参阅 \ref{subsubsec:信息录入}~节。 +%^^A! At the end of abstract (both Chinese and English, if available), +%^^A! keywords list and CLC number will be shown. They can be +%^^A! specified via command \cs{fdusetup} and you may refer to +%^^A! subsubsection~\ref{subsubsec:information} for more details. +%^^A! +% +%^^A TODO: \DescribeEnv{notation} +% \begin{function}{notation} +% \begin{fdusyntax}[emph={[2]notation}] +% \begin{notation}(*\oarg{列格式说明}*) +% (*\meta{符号 1}*) & (*\meta{说明}*) \\ +% (*\meta{符号 2}*) & (*\meta{说明}*) \\ +% (*\phantom{\meta{符号 $n$}}*) (*$\vdots$*) +% (*\meta{符号\ \kern-0.1em$n$}*) & (*\meta{说明}*) +% \end{notation} +% \end{fdusyntax} +% 符号表。可选参数\meta{列格式说明}与 \LaTeX{} 中标准表格的列格 +% 式说明语法一致,默认值为“|lp{7.5cm}|”,即第一列宽度自动调整, +% 第二列限宽 \SI{7.5}{cm},两列均为左对齐。 +% \end{function} +%^^A! \begin{function}{notation} +%^^A! \begin{fdusyntax}[emph={[2]notation}] +%^^A! \begin{notation}(*\oarg{column format}*) +%^^A! (*\meta{symbol 1}*) & (*\meta{description}*) \\ +%^^A! (*\meta{symbol 2}*) & (*\meta{description}*) \\ +%^^A! (*\phantom{\meta{symbol $n$}}*) (*$\vdots$*) +%^^A! (*\meta{symbol \kern-0.1em$n$}*) & (*\meta{description}*) +%^^A! \end{notation} +%^^A! \end{fdusyntax} +%^^A! Notation list (or symbol list, nomenclature) environment. +%^^A! The optional argument \meta{column format} is the same as +%^^A! in a standard \LaTeX{} table. The default value is +%^^A! ``|lp{7.5cm}|'', which means auto-width for the first column +%^^A! and fix-width (\SI{7.5}{cm}) for the second; both columns will +%^^A! be left-aligned. +%^^A! \end{function} +%^^A! +% +% \subsubsection{猪肚} +%^^A! \subsubsection{Main matter} +%^^A! +% +% \begin{function}{\mainmatter} +% 声明主体部分开始。 +% \end{function} +%^^A! \begin{function}{\mainmatter} +%^^A! Declare the beginning of main matter. +%^^A! \end{function} +%^^A! +% +% 主体部分是论文的核心,您可以分章节撰写。如有需求,也可以采用 +% 多文件编译的方式。主体部分的页码采用阿拉伯数字。 +%^^A! As the name suggests, ``main matter'' is the main body of your +%^^A! thesis. When working on a big projects, it's usually a good +%^^A! idea to split the source file into several parts. The page +%^^A! numbers in main matter are shown in arabic numerals. +%^^A! +% +% \begin{function}[updated=2018-01-15]{\footnote} +% \begin{fdusyntax}[deletetexcs={\footnote},% +% morekeywords={\footnote}] +% \footnote(*\marg{脚注文字}*) +% \end{fdusyntax} +% 插入脚注。脚注编号样式可利用 \opt{style/footnote-style} 选项控制, +% 具体见 \ref{subsubsec:论文格式}~小节。 +% \end{function} +%^^A! \begin{function}[updated=2018-01-15]{\footnote} +%^^A! \begin{fdusyntax}[deletetexcs={\footnote},% +%^^A! morekeywords={\footnote}] +%^^A! \footnote(*\marg{text}*) +%^^A! \end{fdusyntax} +%^^A! Insert a footnote. The style of footnote numbers can be set +%^^A! with option \opt{style/foot\-note\-style}. See subsubsection~% +%^^A! \ref{subsubsec:style-and-format} for more details. +%^^A! \end{function} +%^^A! +% +%^^A TODO: \DescribeEnv{proof} +% \begin{function}{axiom,corollary,definition,example,lemma, +% proof,theorem} +% \begin{fdusyntax}[emph={[2]proof}] +% \begin{proof}(*\oarg{小标题}*) +% (*\meta{证明过程}*) +% \end{proof} +% \end{fdusyntax} +% 一系列预定义的数学环境。具体含义见表~\ref{tab:theorem}。 +% \end{function} +%^^A! \begin{function}{axiom,corollary,definition,example,lemma, +%^^A! proof,theorem} +%^^A! \begin{fdusyntax}[emph={[2]proof}] +%^^A! \begin{proof}(*\oarg{subheading}*) +%^^A! (*\meta{procedure of proof}*) +%^^A! \end{proof} +%^^A! \end{fdusyntax} +%^^A! A series of pre-defined math environments. +%^^A! \end{function} +%^^A! +% +% \begin{table}[ht] +% \caption{预定义的数学环境} \label{tab:theorem} +% \centering +% \begin{tabular}{cccccccc} +% \toprule +% \textbf{名称} & +% \env{axiom} & \env{corollary} & \env{definition} & +% \env{example} & \env{lemma} & \env{proof} & +% \env{theorem} \\ +% \midrule +% \textbf{含义} & +% 公理 & 推论 & 定义 & 例 & 引理 & 证明 & 定理 \\ +% \bottomrule +% \end{tabular} +% \end{table} +% +% 证明环境(\env{proof})的最后会添加证毕符号“$\QED$”。要确保 +% 该符号在正确的位置显示,您需要按照 \ref{subsec:编译方式}~节 +% 中的有关说明编译\emph{两次}。 +%^^A! A QED\footnote{Abbreviation of Latin phrase \emph{quod erat +%^^A! demonstrandum}, means ``what was to be demonstrated''.} +%^^A! symbol ``$\QED$'' will be added at the end of \env{proof} +%^^A! environment. You need to compile the source file \emph{twice} +%^^A! as in subsection~\ref{subsec:compilation} in order to make +%^^A! the position of QED symbol correct. +%^^A! +% +% \begin{function}[updated=2017-12-12]{\newtheorem} +% \begin{fdusyntax}[deletetexcs={\newtheorem}, +% morekeywords={\newtheorem,\newtheorem*}] +% \newtheorem(*\oarg{选项}\marg{环境名}\marg{标题}*) +% \newtheorem*(*\oarg{选项}\marg{环境名}\marg{标题}*) +% \begin(*\marg{环境名}\oarg{小标题}*) +% (*\meta{内容}*) +% \end(*\marg{环境名}*) +% \end{fdusyntax} +% 声明新的定理类环境(数学环境)。带星号的版本表示不进行编号, +% 并且会默认添加证毕符号“$\QED$”。声明后,即可同预定义的数学环境 +% 一样使用。 +% \end{function} +%^^A! \begin{function}[updated=2017-12-12]{\newtheorem} +%^^A! \begin{fdusyntax}[deletetexcs={\newtheorem}, +%^^A! morekeywords={\newtheorem,\newtheorem*}] +%^^A! \newtheorem(*\oarg{options}\marg{environment}\marg{title}*) +%^^A! \newtheorem*(*\oarg{options}\marg{environment}\marg{title}*) +%^^A! \begin(*\marg{environment}\oarg{subheading}*) +%^^A! (*\meta{contents}*) +%^^A! \end(*\marg{environment}*) +%^^A! \end{fdusyntax} +%^^A! Declare new math environments (theorems). If you use +%^^A! \cs{newtheorem*}, then the theorem will not be numbered, and +%^^A! a QED symbol ``$\QED$'' will be added at the end of the +%^^A! environment. All the theorem environments defined by yourself +%^^A! can be used as the pre-defined ones. +%^^A! \end{function} +%^^A! +% +% 事实上,表~\ref{tab:theorem} 中预定义的环境正是通过以下方式定义的: +% \begin{latexexample}[deletetexcs={\newtheorem}, +% morekeywords={\newtheorem,\newtheorem*}] +% \newtheorem*{proof}{证明} +% \newtheorem{axiom}{公理} +% \newtheorem{corollary}{定理} +% ... +% \end{latexexample} +%^^A! Actually, the pre-defined math environments are just defined +%^^A! with \cs{newtheorem} and \cs{newtheorem*}: +%^^A! \begin{latexexample}[deletetexcs={\newtheorem}, +%^^A! morekeywords={\newtheorem,\newtheorem*}] +%^^A! \newtheorem*{proof}{proof} +%^^A! \newtheorem{axiom}{axiom} +%^^A! \newtheorem{corollary}{corollary} +%^^A! ... +%^^A! \end{latexexample} +%^^A! +% +% 与 \cs{fdusetup} 相同,\cs{newtheorem} 的可选参数 \meta{选项} +% 也为一组键值列表。可用的选项见下。注意您无需输入“|theorem/|”。 +%^^A! Similar with \cs{fdusetup}, the optional argument \meta{options} +%^^A! of \cs{newtheorem} is a key-value list as well. The available +%^^A! are described below. Note that you don't need to type in the +%^^A! ``|theorem/|'' prefix. +%^^A! +% +% \begin{function}{theorem/style} +% \begin{fdusyntax}[emph={[1]style}] +% style = (*<(plain)|margin|change|\\ +% XXXXXX\mbox{}~~~~~~~~break|marginbreak|changebreak>*) +% \end{fdusyntax} +% 定理类环境的总体样式。 +% \end{function} +%^^A! \begin{function}{theorem/style} +%^^A! \begin{fdusyntax}[emph={[1]style}] +%^^A! style = (*<(plain)|margin|change|\\ +%^^A! XXXX\mbox{}~~~~~~~~break|marginbreak|changebreak>*) +%^^A! \end{fdusyntax} +%^^A! The overall style of the theorem environment. +%^^A! \end{function} +%^^A! +% +% \begin{function}{theorem/header-font} +% \begin{fdusyntax}[emph={[1]header-font}] +% header-font = (*\marg{字体}*) +% \end{fdusyntax} +% 定理头(即标题)的字体。中文模板默认为 \tn{sffamily},即无衬线体 +% (黑体);英文模板默认为 |\bfseries\upshape|,即加粗直立体。 +% \end{function} +%^^A! \begin{function}{theorem/header-font} +%^^A! \begin{fdusyntax}[emph={[1]header-font}] +%^^A! header-font = (*\marg{font}*) +%^^A! \end{fdusyntax} +%^^A! Font of the theorem header. Default value is \tn{sffamily} +%^^A! and |\bfseries\upshape| for Chinese and English template, +%^^A! respectively. +%^^A! \end{function} +%^^A! +% +% \begin{function}{theorem/body-font} +% \begin{fdusyntax}[emph={[1]body-font}] +% body-font = (*\marg{字体}*) +% \end{fdusyntax} +% 定理内容的字体。中文模板默认为 \tn{fdu@kai},即楷体;英文模板 +% 默认为 \tn{itshape},即斜体。 +% \end{function} +%^^A! \begin{function}{theorem/body-font} +%^^A! \begin{fdusyntax}[emph={[1]body-font}] +%^^A! body-font = (*\marg{font}*) +%^^A! \end{fdusyntax} +%^^A! Font of the theorem body. Default value is \tn{fdu@kai} +%^^A! (\textit{楷体}) and \tn{itshape} for Chinese and English +%^^A! template, respectively. +%^^A! \end{function} +%^^A! +% +% \begin{function}{theorem/qed} +% \begin{fdusyntax}[emph={[1]qed}] +% qed = (*\marg{符号}*) +% \end{fdusyntax} +% 定理结束标记(即证毕符号)。如果用 \cs{newtheorem} 声明定理, +% 则默认为空;用 \cs{newtheorem*} 声明,则默认为 +% |\ensuremath{\QED}|,即“$\QED$”。 +% \end{function} +%^^A! \begin{function}{theorem/qed} +%^^A! \begin{fdusyntax}[emph={[1]qed}] +%^^A! qed = (*\marg{symbol}*) +%^^A! \end{fdusyntax} +%^^A! Theorem end mark. For \cs{newtheorem}, default value is +%^^A! empty; for \cs{newtheorem*}, default value is +%^^A! |\ensuremath{\QED}| (i.e.\ ``$\QED$''). +%^^A! \end{function} +%^^A! +% +% \begin{function}{theorem/counter} +% \begin{fdusyntax}[emph={[1]counter}] +% counter = (*\marg{计数器}*) +% \end{fdusyntax} +% 定理计数器,表示定理编号在 \meta{计数器} 的下一级,并会随 +% \meta{计数器} 的变化而清零。\scite{刘海洋2013latex入门} +% 默认为 |chapter|,表示按章编号。使用 \cs{newtheorem*} 时, +% 该选项无效。 +% \end{function} +%^^A! \begin{function}{theorem/counter} +%^^A! \begin{fdusyntax}[emph={[1]counter}] +%^^A! counter = (*\marg{counter}*) +%^^A! \end{fdusyntax} +%^^A! The theorem will be enumerated within \meta{counter}. For +%^^A! example, the default value is |chapter|, which means with +%^^A! each new \tn{chapter}, the enumeration begins again with 1. +%^^A! This option is invalid for \cs{newtheorem*}. +%^^A! \end{function} +%^^A! +% +% \begin{function}{\caption} +% \begin{fdusyntax}[deletetexcs={\caption},morekeywords={\caption}] +% \caption(*\marg{图表标题}*) +% \caption(*\oarg{短标题}\marg{长标题}*) +% \end{fdusyntax} +% 插入图表标题。可选参数 \meta{短标题} 用于图表目录。在 +% \meta{长标题} 中,您可以进行长达多段的叙述;但 \meta{短标题} +% 和单独的 \meta{图表标题} 中则不允许分段。 +% \scite{刘海洋2013latex入门} +% \end{function} +%^^A! \begin{function}{\caption} +%^^A! \begin{fdusyntax}[deletetexcs={\caption},morekeywords={\caption}] +%^^A! \caption(*\marg{caption}*) +%^^A! \caption(*\oarg{short caption}\marg{long caption}*) +%^^A! \end{fdusyntax} +%^^A! Insert the caption of figure or table. The optional argument +%^^A! \meta{short caption} will be shown in the list of figures/tables. +%^^A! In \meta{long caption}, you can write descriptions for several +%^^A! paragraphs, but \meta{short caption} and the single +%^^A! \meta{caption} will not allow multi-paragraph text (i.e.\ +%^^A! text containing \tn{par}) inside. +%^^A! \end{function} +%^^A! +% +% 按照排版惯例,建议您将表格的标题放置在绘制表格的命令之前, +% 而将图片的标题放置在绘图或插图的命令之后。另需注意, +% \tn{caption} 命令必须放置在浮动体环境(如 \env{table} 和 +% \env{figure})中。 +%^^A! By convention, caption of a table is usually put \emph{before} +%^^A! the table itself, while for figure it's the opposite. +%^^A! In addition, command \tn{caption} must be put inside float +%^^A! environments (e.g.\ \env{table} and \env{figure}). +%^^A! +% +% \subsubsection{豹尾} +%^^A! \subsubsection{Back matter} +%^^A! +% +% \begin{function}{\backmatter} +% 声明后置部分开始。 +% \end{function} +%^^A! \begin{function}{\backmatter} +%^^A! Declare the beginning of back matter. +%^^A! \end{function} +%^^A! +% +% 后置部分包含参考文献、声明页等。 +%^^A! Back matter contains bibliography, declaration page, etc. +%^^A! +% +% \begin{function}[updated=2018-01-25]{\printbibliography} +% \begin{fdusyntax}[morekeywords={\printbibliography}] +% \printbibliography(*\oarg{选项}*) +% \end{fdusyntax} +% 打印参考文献列表。如果 \kvopt{bib-backend}{bibtex},则 \meta{选项} +% 无效,相当于 \tn{bibliography} \texttt{\marg{文献数据库}},其中的 +% \meta{文献数据库} 可利用 \opt{style/bib-resource} 选项指定,具体见 +% \ref{subsubsec:论文格式}~小节;而如果 \kvopt{bib-backend}^^A +% {biblatex},则该命令由 \pkg{biblatex} 宏包直接提供,可用选项请 +% 参阅其文档 \cite{biblatex}。 +% \end{function} +%^^A! \begin{function}[updated=2018-01-25]{\printbibliography} +%^^A! \begin{fdusyntax}[morekeywords={\printbibliography}] +%^^A! \printbibliography(*\oarg{options}*) +%^^A! \end{fdusyntax} +%^^A! Print the bibliography. When \kvopt{bib-backend}{bibtex}, then +%^^A! \meta{options} is invalid and this command is equivalent to +%^^A! \tn{bibliography} \texttt{\marg{bib files}}, where +%^^A! \meta{bib files} should be specified with option +%^^A! \opt{style/bib-resource} (see subsubsection~% +%^^A! \ref{subsubsec:style-and-format}). When \kvopt{bib-backend}% +%^^A! {bibtex}, then \tn{printbibliography} is provided by +%^^A! \pkg{biblatex} and the available options can be found in its +%^^A! documentation. +%^^A! \end{function} +%^^A! +% +% \section{宏包依赖情况} +%^^A! \section{Packages dependencies} +%^^A! +% +% 使用不同编译方式、指定不同选项,会导致宏包依赖情况有所不同。 +% 具体如下: +% \begin{itemize} +% \item 在任何情况下,本模板都会\emph{显式}调用以下宏包 +% (或文档类): +% \begin{itemize} +% \item \pkg{expl3}、\pkg{xparse}、\pkg{xtemplate} 和 +% \pkg{l3keys2e},用于构建 \LaTeX3 编程环境 +% \scite{interfaces3,source3}。它们分属 \pkg{l3kernel} 和 +% \pkg{l3packages} 宏集。 +% \item \cls{ctexbook},提供中文排版的通用框架。属于 \CTeX{} +% 宏集 \scite{CTeX}。 +% \item \pkg{amsmath},对 \LaTeX{} 的数学排版功能进行了 +% 全面扩展。属于 \AmSLaTeX{} 套件。 +% \item \pkg{unicode-math},负责处理 Unicode 编码的 +% OpenType 数学字体。 +% \item \pkg{geometry},用于调整页面尺寸。 +% \item \pkg{fancyhdr},处理页眉页脚。 +% \item \pkg{footmisc},处理脚注。 +% \item \pkg{ntheorem},提供增强版的定理类环境。 +% \item \pkg{graphicx},提供图形插入的接口。 +% \item \pkg{longtable},长表格(允许跨页)支持。 +% \item \pkg{caption},用于设置题注。 +% \item \pkg{natbib},提供增强的参考文献著录及引用支持。 +% \item \pkg{xcolor},提供彩色支持。 +% \item \pkg{hyperref},提供交叉引用、超链接、电子书签等功能。 +% \end{itemize} +% \item 开启 \kvopt{style/footnote-style}{pifont} 后,会调用 +% \pkg{pifont} 宏包。它属于 \pkg{psnfss} 套件。 +% \item 开启 \kvopt{style/bib-backend}{bibtex} 后,会调用 +% \pkg{natbib} 宏包,并依赖 \BibTeX{} 程序。参考文献样式由 +% \pkg{gbt7714} 宏包提供 \scite{natbib,gbt7714}。 +% \item 开启 \kvopt{style/bib-backend}{biblatex} 后,会调用 +% \pkg{biblatex} 宏包,并依赖 \biber{} 程序。参考文献样式由 +% \pkg{biblatex-gb7714-2015} 宏包提供 +% \scite{biblatex,biblatex-gb7714-2015}。 +% \end{itemize} +%^^A! Different compilation methods and options will result in a +%^^A! different packages dependency. Details are as follows: +%^^A! \begin{itemize} +%^^A! \item In any case, \cls{fduthesis} will load the following +%^^A! packages \emph{explicitly}: +%^^A! \begin{itemize} +%^^A! \item \pkg{expl3}, \pkg{xparse}, \pkg{xtemplate} and +%^^A! \pkg{l3keys2e}, belong to \pkg{l3kernel} and +%^^A! \pkg{l3packages} bundles +%^^A! \item \cls{ctexbook}, belongs to \CTeX{} bundle +%^^A! \item \pkg{amsmath}, belongs to \AmSLaTeX{} bundle +%^^A! \item \pkg{unicode-math} +%^^A! \item \pkg{geometry} +%^^A! \item \pkg{fancyhdr} +%^^A! \item \pkg{footmisc} +%^^A! \item \pkg{ntheorem} +%^^A! \item \pkg{graphicx} +%^^A! \item \pkg{longtable} +%^^A! \item \pkg{caption} +%^^A! \item \pkg{natbib} +%^^A! \item \pkg{xcolor} +%^^A! \item \pkg{hyperref} +%^^A! \end{itemize} +%^^A! \item When chosen \kvopt{style/footnote-style}{pifont}, +%^^A! package \pkg{pifont} will be loaded. It belongs to +%^^A! \pkg{psnfss} bundle. +%^^A! \item When chosen \kvopt{style/bib-backend}{bibtex}, +%^^A! package \pkg{natbib} will be loaded. Meanwhile, program +%^^A! \BibTeX{} will be required for compilation. The +%^^A! bibliography style is provided by \pkg{gbt7714}. +%^^A! \item When chosen \kvopt{style/bib-backend}{biblatex}, +%^^A! package \pkg{biblatex} will be loaded. Program \biber{} +%^^A! will be required then. The bibliography style is provided +%^^A! by \pkg{biblatex-gb7714-2015}. +%^^A! \end{itemize} +%^^A! +% +% 这里只列出了本模板直接调用的宏包。这些宏包自身的调用情况, +% 此处不再具体展开。如有需要,请参阅相关文档。 +%^^A! Only the packages loaded directly by \cls{fduthesis} are listed +%^^A! here. If you need to know the dependencies of the packages +%^^A! themselves, please refer to the corresponding manuals. +%^^A! +% +% \begin{thebibliography}{99} +% +% \newcommand\urlprefix{\newline\hspace*{\fill}} +% \let\OldUrl=\url +% \renewcommand\url[1]{{\small\OldUrl{#1}}} +% \newcommand\CTANurl[1]{{\small\href{http://mirror.ctan.org/#1}^^A +% {\ttfamily CTAN://#1}}} +% +% \bibitem{source2e} +% \textsc{Braams J}, \textsc{Carlisle D}, \textsc{Jeffrey A}, et al. +% \newblock \textit{The \LaTeXe{} Sources} [CP/OL]. +% \newblock (2018-04-01) \urlprefix +% \CTANurl{macros/latex/base/source2e.pdf} +% +% \bibitem{CTeX} +% \textsc{CTEX.ORG}. +% \newblock \textit{\CTeX{} 宏集手册} [EB/OL]. +% \newblock version 2.4.12, +% \newblock (2018-01-28) \urlprefix +% \CTANurl{language/chinese/ctex/ctex.pdf} +% +% \bibitem{xeCJK} +% \textsc{CTEX.ORG}. +% \newblock \textit{\pkg{xeCJK} 宏包} [EB/OL]. +% \newblock version 3.7.0, +% \newblock (2018-04-07) \urlprefix +% \CTANurl{macros/xetex/latex/xecjk/xeCJK.pdf} +% +% \bibitem{natbib} +% \textsc{Daly P W}. +% \newblock \textit{Natural Sciences Citations and References} [EB/OL]. +% \newblock version 8.31b, +% \newblock (2010-09-13) \urlprefix +% \CTANurl{macros/latex/contrib/natbib/natbib.pdf} +% +% \bibitem{hmshan2017fduphdthesistemplate} +% \textsc{hmshan}. +% \newblock \textit{复旦博士论文模板} [EB/OL]. +% \newblock (2017-04-04) \urlprefix +% \url{https://github.com/hmshan/FDU_PhD_Thesis_Template} +% +% \bibitem{knuth1986texbook} +% \textsc{Knuth D E}. +% \newblock \textit{The \TeX book: Computers \& Typesetting, volumn A} [M]. +% \newblock Boston: Addison--Wesley Publishing Company, 1986 +% \urlprefix {\small {\kaishu 源代码 +% \footnote{此代码只可作为学习之用。未经 Knuth 本人同意,您不应当编译此文档。}:} +% \CTANurl{systems/knuth/dist/tex/texbook.tex}} +% +% \bibitem{interfaces3} +% \textsc{The \LaTeX3 Project}. +% \newblock \textit{The \LaTeX3 Interfaces} [EB/OL]. +% \newblock (2018-03-05) \urlprefix +% \CTANurl{macros/latex/contrib/l3kernel/interface3.pdf} +% +% \bibitem{source3} +% \textsc{The \LaTeX3 Project}. +% \newblock \textit{The \LaTeX3 Sources} [CP/OL]. +% \newblock (2018-03-05) \urlprefix +% \CTANurl{macros/latex/contrib/l3kernel/source3.pdf} +% +% \bibitem{biblatex} +% \textsc{Lehman P}, \textsc{Kime P}, \textsc{Boruvka A}, et al. +% \newblock \textit{The \pkg{biblatex} Package} [EB/OL]. +% \newblock version 3.11, +% \newblock (2018-03-01) \urlprefix +% \CTANurl{macros/latex/contrib/biblatex/doc/biblatex.pdf} +% +% \bibitem{mittelbach2004latexcompanion} +% \textsc{Mittelbach F} and \textsc{Goossens M}. +% \newblock \textit{The \LaTeX{} Companion} [M]. +% \newblock 2nd ed. +% \newblock Boston: Addison--Wesley Publishing Company, 2004 +% +% \bibitem{lshort} +% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al. +% \newblock \textit{The Not So Short Introduction to \LaTeXe{}: Or \LaTeXe{} in 139 minutes} [EB/OL]. +% \newblock version 6.2, +% \newblock (2018-02-28) \urlprefix +% \CTANurl{info/lshort/english/lshort.pdf} +% +% \bibitem{lshort-zh-cn} +% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al. +% \newblock \textit{一份不太简短的 \LaTeXe{} 介绍: 或 102 分钟了解 \LaTeXe{}} [EB/OL]. +% \newblock China\TeX{} 论坛, 译. +% \newblock 原版版本 version 5.05, 中文版本 version 5.10, +% \newblock (2017-03-26) \urlprefix +% \CTANurl{info/lshort/chinese/lshort-zh-cn.pdf} +% +% \bibitem{pandoxie2014fduthesislatex} +% \textsc{Pandoxie}. +% \newblock \textit{Fudan University-Latex Template} [EB/OL]. +% \newblock (2014-06-07) \urlprefix +% \url{https://github.com/Pandoxie/FDU-Thesis-Latex} +% +% \bibitem{richard2016fudanthesis} +% \textsc{richard}. +% \newblock \textit{复旦大学硕士学位论文模板} [EB/OL]. +% \newblock (2016-01-31) \urlprefix +% \url{https://github.com/richarddzh/fudan-thesis} +% +% \bibitem{weijianwen2017sjtuthesis} +% \textsc{weijianwen}. +% \newblock \textit{A \XeLaTeX{} template for Shanghai Jiao Tong University (SJTU) thesis} [EB/OL]. +% \newblock version 0.10, +% \newblock (2018-02-11) \urlprefix +% \url{https://github.com/weijianwen/SJTUThesis} +% +% \bibitem{wright2009dtxfile} +% \textsc{Wright J}. +% \newblock \textit{A model dtx file} [EB/OL]. +% \newblock (2009-10-06) \urlprefix +% \url{http://www.texdev.net/2009/10/06/a-model-dtx-file} +% +% \bibitem{gbt7714} +% \textsc{Zeping Lee}. +% \newblock \textit{GB/T 7714-2015 \BibTeX{} Style} [EB/OL]. +% \newblock version 1.0.3, +% \newblock (2018-03-16) \urlprefix +% \CTANurl{biblio/bibtex/contrib/gbt7714/gbt7714.pdf} +% +% \bibitem{zepinglee2017ustcthesis} +% \textsc{Zeping Lee} and \textsc{seisman}. +% \newblock \textit{\LaTeX{} template for USTC thesis v3.0} [EB/OL]. +% \newblock version 3.0.4, +% \newblock (2018-04-03) \urlprefix +% \url{https://github.com/ustctug/ustcthesis} +% +% \bibitem{数院毕业论文格式} +% 复旦大学数学科学学院. +% \newblock \textit{毕业论文格式 tex 版和 word 版} [EB/OL]. \urlprefix +% \url{http://math.fudan.edu.cn/show.aspx?info_lb=664&flag=101&info_id=1816} +% +% \bibitem{数院毕业论文格式更新} +% 复旦大学数学科学学院. +% \newblock \textit{毕业论文格式: Word、\TeX{} 模板更新} [EB/OL]. \urlprefix +% \url{http://math.fudan.edu.cn/Show.aspx?info_lb=664&info_id=1855&flag=101} +% +% \bibitem{复旦大学论文规范} +% 复旦大学图书馆, 复旦大学研究生院. +% \newblock \textit{复旦大学博士、硕士学位论文规范} [EB/OL]. +% \newblock 2017 年 3 月修订版. +% \newblock (2017-03-27) \urlprefix +% \url{http://www.gs.fudan.edu.cn/_upload/article/4c/a8/a82545ef443b9c057c14ba13782c/c883c6f3-6d7f-410c-8f30-d8bde6fcb990.doc} +% +% \bibitem{gb-t-7713.1-2006} +% 国务院学位委员会办公室, 全国信息与文献标准化技术委员会. +% \newblock \textit{学位论文编写规则: GB/T 7713.1--2006} [S]. +% \newblock 北京: 中国标准出版社, 2007 +% +% \bibitem{胡伟2017latex2e} +% 胡伟. +% \newblock \textit{\LaTeXe{} 文类和宏包学习手册} [M]. +% \newblock 北京: 清华大学出版社, 2017 +% +% \bibitem{biblatex-gb7714-2015} +% 胡振震. +% \newblock \textit{符合 GB/T 7714-2015 标准的 biblatex 参考文献样式} [EB/OL]. +% \newblock version 1.0i, +% \newblock (2018-01-14) \urlprefix +% {\small\href{http://mirror.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-gb7714-2015.pdf}^^A +% {\ttfamily CTAN://macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-gb77 14-2015.pdf}} +% +% \bibitem{gb-t-15834-2011} +% 教育部语言文字信息管理司. +% \newblock \textit{标点符号用法: GB/T 15834--2011} [S]. +% \newblock 北京: 中国标准出版社, 2012 +% +% \bibitem{cquthesis} +% 李振楠. +% \newblock \textit{\textsc{CquThesis}:重庆大学毕业论文 \LaTeX{} 模板} [EB/OL]. +% \newblock version 1.30, +% \newblock (2018-02-23) \urlprefix +% \CTANurl{macros/latex/contrib/cquthesis/cquthesis.pdf} +% +% \bibitem{刘海洋2013latex入门} +% 刘海洋. +% \newblock \textit{\LaTeX{} 入门} [M]. +% \newblock 北京: 电子工业出版社, 2013 +% +% \bibitem{gb-t-7714-2015} +% 全国信息与文献标准化技术委员会. +% \newblock \textit{信息与文献 参考文献著录规则: GB/T 7714--2015} [S]. +% \newblock 北京: 中国标准出版社, 2015 +% +% \bibitem{thuthesis} +% 薛瑞尼. +% \newblock \textit{\textsc{ThuThesis}:清华大学学位论文模板} [EB/OL]. +% \newblock version 5.4.3, +% \newblock (2017-12-24) \urlprefix +% \CTANurl{macros/latex/contrib/thuthesis/thuthesis.pdf} +% +% \end{thebibliography} +% +% \clearpage +% +%^^A! \end{document} +% +% \end{documentation} +% +%^^A \EnableImplementation +%^^A \DisableImplementation +% +% \begin{implementation} +% +%^^A 代码部分的页边距 +% \newgeometry{ +% left = 2.25 in, +% right = 1.00 in, +% top = 1.25 in, +% bottom = 1.00 in, +% marginpar = 2.25 in +% } +% +% \section{实现细节} +% +% 本模板使用 \LaTeX3 语法编写,依赖 \pkg{expl3} 环境, +% 并需调用 \pkg{l3packages} 中的相关宏包。 +% +% 按照 \LaTeX3 语法,代码中的空格、换行、回车与制表符完全忽略, +% 而下划线“|_|”和冒号“|:|”则可作为一般字母使用。 +% 正常的空格可以使用“|~|”代替;至于 |~| 原来所表示的“带子”, +% 则要用 \LaTeXe{} 的原始命令 \tn{nobreakspace} 代替。 +% +% 以下代码中有一些形如 \textcolor[HTML]{2E3191}^^A +% {\textsf{\textlangle *class\textrangle}} 的标记,这是 +% \pkg{DocStrip} 中的“guard”,用来选择性地提取文件。 +% “\textsf{*}”和“\textsf{/}”分别表示该部分的开始和结束。不含 +% “\textsf{*}”和“\textsf{/}”的 guard 出现在行号右侧,它们用来确定 +% 单独一行代码的归属。这些 guard 的颜色深浅不一,用以明确嵌套关系。 +% +% 另有若干形如 \textcolor{MaterialPink}^^A +% {\textsf{\textlangle @@=fdu\textrangle}} 的 guard ,它们由 +% \pkg{l3docstrip} 定义,用来指示名字空间(模块)。 +% +% \subsection{准备} +% +% \begin{macrocode} +%<@@=fdu> +%<*class|class-en> +% \end{macrocode} +% +% 检查 \LaTeX3 编程环境。 +% \begin{macrocode} +\RequirePackage { xparse, xtemplate, l3keys2e } +\clist_map_inline:nn { expl3, xparse, xtemplate, l3keys2e } + { + \@ifpackagelater {#1} { 2017/12/16 } + { } { \msg_error:nnn { fduthesis } { l3-too-old } {#1} } + } +\msg_new:nnn { fduthesis } { l3-too-old } + { + Package~ "#1"~ is~ too~ old. \\\\ + Please~ update~ an~ up-to-date~ version~ of~ the~ bundles \\ + "l3kernel"~ and~ "l3packages"~ using~ your~ TeX~ package \\ + manager~ or~ from~ CTAN. + } +% \end{macrocode} +% +% 目前 \cls{fduthesis} 仅支持 \XeTeX{} 和 \LuaTeX{}。 +% \begin{macrocode} +\sys_if_engine_xetex:F + { + \sys_if_engine_luatex:F + { + \msg_fatal:nnx { fduthesis } { unsupported-engine } + { \c_sys_engine_str } + } + } +\msg_new:nnn { fduthesis } { unsupported-engine } + { + The~ fduthesis~ class~ requires~ either~ XeTeX~ or~ LuaTeX. \\\\ + "#1"~ is~ not~ supported~ at~ present.~ You~ must~ change \\ + your~ typesetting~ engine~ to~ "xelatex"~ or~ "lualatex". + } +% \end{macrocode} +% +% \subsubsection{内部变量声明} +% +% \begin{variable}{\l_@@_tmpa_box, +% \l_@@_tmpa_clist,\l_@@_tmpb_clist, +% \l_@@_tmpa_dim,\l_@@_tmpb_dim, +% \l_@@_tmpa_skip, +% \l_@@_tmpa_tl,\l_@@_tmpb_tl} +% 临时变量。 +% \begin{macrocode} +\box_new:N \l_@@_tmpa_box +\clist_new:N \l_@@_tmpa_clist +\clist_new:N \l_@@_tmpb_clist +\dim_new:N \l_@@_tmpa_dim +\dim_new:N \l_@@_tmpb_dim +\skip_new:N \l_@@_tmpa_skip +\tl_new:N \l_@@_tmpa_tl +\tl_new:N \l_@@_tmpb_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_thesis_type_int} +% 论文类型。取值 1、2、3 分别对应博士、硕士、本科(学士),这与学号 +% 第三位是一致的。 +% \begin{macrocode} +\int_new:N \g_@@_thesis_type_int +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_to_ctexbook_clist,\g_@@_to_hyperref_clist} +% 分别保存由 \cls{fduthesis} 传入 \cls{ctexbook} 文档类和 +% \pkg{hyperref} 宏包的选项列表。 +% \begin{macrocode} +\clist_new:N \g_@@_to_ctexbook_clist +\clist_new:N \g_@@_to_hyperref_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 +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_draft_bool} +% 是否开启草稿模式。 +% \begin{macrocode} +\bool_new:N \g_@@_draft_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_config_tl} +% 保存配置文件名称。默认为空。 +% \begin{macrocode} +\tl_new:N \g_@@_config_tl +% \end{macrocode} +% \end{variable} +% +% \subsubsection{内部函数} +% +% \begin{macro}{\cs_generate_variant:cn, +% \file_input:V, +% \int_to_arabic:v, +% \keys_define:nx, +% \tl_map_inline:xn} +% \begin{macro}[TF]{\tl_if_eq:Vn} +% \LaTeX3{} 函数变体。 +% \begin{macrocode} +\cs_generate_variant:Nn \cs_generate_variant:Nn { cn } +\cs_generate_variant:Nn \file_input:n { V } +\cs_generate_variant:Nn \int_to_arabic:n { v } +\cs_generate_variant:Nn \keys_define:nn { nx } +\cs_generate_variant:Nn \tl_map_inline:nn { xn } +\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { Vn } { T, TF } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_quad:,\@@_qquad:} +% 等价于 \LaTeXe{} 中的 \tn{quad} 和 \tn{qquad}。 +% \begin{macrocode} +\cs_new:Npn \@@_quad: { \skip_horizontal:n { 1 em } } +\cs_new:Npn \@@_qquad: { \skip_horizontal:n { 2 em } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_vspace:N,\@@_vspace:n,\@@_vspace:c} +% 类似 \LaTeXe{} 中的 \tn{vspace*}。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_vspace:N #1 + { + \dim_set_eq:NN \l_@@_tmpa_dim \prevdepth + \hrule height \c_zero_dim + \nobreak + \skip_vertical:N #1 + \skip_vertical:N \c_zero_skip + \dim_set_eq:NN \prevdepth \l_@@_tmpa_dim + } +\cs_new_protected:Npn \@@_vspace:n #1 + { + \skip_set:Nn \l_@@_tmpa_skip {#1} + \@@_vspace:N \l_@@_tmpa_skip + } +\cs_generate_variant:Nn \@@_vspace:N { c } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_symbol:n} +% 等价于 \LaTeXe{} 中的 \tn{symbol}。 +% \begin{macrocode} +\cs_new:Npn \@@_symbol:n #1 { \tex_char:D #1 \scan_stop: } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_arabic:n} +% 等价于 \LaTeXe{} 中的 \tn{arabic}。 +% \begin{macrocode} +\cs_new:Npn \@@_arabic:n #1 + { \int_to_arabic:v { c@ #1 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_patch_cmd:Nnn,\@@_appto_cmd:Nn} +% 补丁工具,来自 \pkg{ctexpatch} 宏包。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_cmd:Nnn #1#2#3 + { + \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3} + { } { \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} +% +% \begin{macro}{\@@_define_fn_style:nn, +% \@@_define_punct:nn, +% \@@_define_sep:nn, +% \@@_define_format:nn, +% \@@_define_name:nn, +% \@@_define_name:nnn} +% 用来定义脚注样式、标点、默认名称的辅助函数。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_define_fn_style:nn #1#2 + { \tl_const:cn { c_@@_fn_style_ #1 _tl } {#2} } +\cs_new_protected:Npn \@@_define_punct:nn #1#2 + { \tl_const:cn { c_@@_ #1 _tl } { \@@_symbol:n {#2} } } +% \cs_new_protected:Npn \@@_define_sep:nn #1#2 +% { \tl_const:cn { c_@@_ #1 _sep_tl } {#2} } +% \cs_new_protected:Npn \@@_define_format:nn #1#2 +% { \tl_const:cn { c_@@_ #1 _format_tl } {#2} } +\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_ #1 _tl } {#2} + \tl_const:cn { c_@@_name_ #1 _en_tl } {#3} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_msg_new:nn, +% \@@_error:n,\@@_error:nn,\@@_error:nx,\@@_error:nnn, +% \@@_warning:n,\@@_warning:nn,\@@_warning:nxx, +% \@@_info:nx} +% 各种信息函数的缩略形式。 +% \begin{macrocode} +\cs_new:Npn \@@_msg_new:nn { \msg_new:nnn { fduthesis } } +\cs_new:Npn \@@_error:n { \msg_error:nn { fduthesis } } +\cs_new:Npn \@@_error:nn { \msg_error:nnn { fduthesis } } +\cs_new:Npn \@@_error:nx { \msg_error:nnx { fduthesis } } +\cs_new:Npn \@@_error:nnn { \msg_error:nnnn { fduthesis } } +\cs_new:Npn \@@_warning:n { \msg_warning:nn { fduthesis } } +\cs_new:Npn \@@_warning:nn { \msg_warning:nnn { fduthesis } } +\cs_new:Npn \@@_warning:nxx { \msg_warning:nnxx { fduthesis } } +\cs_new:Npn \@@_info:nx { \msg_info:nnx { fduthesis } } +% \end{macrocode} +% \end{macro} +% +% \subsection{选项处理} +% +% 定义 |fdu/option| 键值类。 +% \begin{macrocode} +\keys_define:nn { fdu / option } + { +% \end{macrocode} +% +% \changes{v0.7}{2018/02/01}{新增 \opt{type} 选项。} +% +% \begin{macro}{type} +% 设置论文类型。设为模板选项主要是为了以后的兼容性。论文类型可能会 +% 影响很多设置,只是暂时还不考虑。默认为本科毕业论文。 +% \begin{macrocode} + type .choice:, + type .value_required:n = true, + type .choices:nn = + { doctor, master, bachelor } + { \int_set_eq:NN \g_@@_thesis_type_int \l_keys_choice_int }, + type .initial:n = bachelor, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{oneside,twoside} +% 设置页面类型为单面或双面。 +% \begin{macrocode} + oneside .value_forbidden:n = true, + twoside .value_forbidden:n = true, + oneside .code:n = + { + \clist_gput_right:Nn \g_@@_to_ctexbook_clist { oneside } + \bool_set_false:N \g_@@_twoside_bool + }, + twoside .code:n = + { + \clist_gput_right:Nn \g_@@_to_ctexbook_clist { twoside } + \bool_set_true:N \g_@@_twoside_bool + }, +% \end{macrocode} +% \end{macro} +% +% \changes{v0.5}{2017/09/23}{移除 \opt{nofonts} 选项。} +% +% \begin{macro}{draft} +% 是否开启草稿模式(默认关闭)。 +% \begin{macrocode} + draft .choice:, + draft / true .code:n = + { + \bool_set_true:N \g_@@_draft_bool + \clist_gput_right:Nn \g_@@_to_ctexbook_clist { draft } + }, + draft / false .code:n = + { \bool_set_false:N \g_@@_draft_bool }, + draft .default:n = true, + draft .initial:n = false, +% \end{macrocode} +% \end{macro} +% +% \changes{v0.7}{2018/01/31}{新增 \opt{config} 选项。} +% +% \begin{macro}{config} +% 配置文件名。 +% \begin{macrocode} + config .tl_set:N = \g_@@_config_tl, +% \end{macrocode} +% \end{macro} +% +% 处理未知选项。 +% \begin{macrocode} + unknown .code:n = { \@@_error:n { unknown-option } } + } +\@@_msg_new:nn { unknown-option } + { Class~ option~ "\l_keys_key_tl"~ is~ unknown. } +% \end{macrocode} +% +% 将文档类选项传给 |fdu/option|。 +% \begin{macrocode} +\ProcessKeysOptions { fdu / option } +% \end{macrocode} +% +% 载入参数配置文件。 +% \begin{macrocode} +\file_input:n { fduthesis.def } +\tl_if_empty:NF \g_@@_config_tl + { + \file_input:V \g_@@_config_tl + \@@_info:nx { load-config-file } { \g_@@_config_tl } + } +\@@_msg_new:nn { load-config-file } + { You~ are~ loading~ config~ file~ '#1'. } +% \end{macrocode} +% +% \subsection{载入宏包、文档类} +% +% \changes{v0.7}{2018/01/19}{使用 \cls{ctexbook} 文档类,而非直接使用 +% 标准文档类 \cls{book}。} +% +% 将选项传入 \cls{ctexbook} 文档类。\\ +% \begin{macrocode} +% TODO: (2017/07/22) Chinese fonts in fduthesis-en +\PassOptionsToClass + { + UTF8, +%<class-en> scheme = plain, + heading = true, +%<class> fontset = none, +%<class-en> fontset = fandol, + zihao = -4, +%<class> linespread = \c_@@_line_spread_fp, + \g_@@_to_ctexbook_clist + } + { ctexbook } +% \end{macrocode} +% +% 传入各宏包选项。 +% \begin{macrocode} +\clist_map_inline:nn + { + { no-math } { fontspec }, + { perpage } { footmisc }, + { amsmath, thmmarks } { ntheorem } + } + { \PassOptionsToPackage #1 } +% \end{macrocode} +% +% 本模板会在 \pkg{ctexhook} 提供的钩子 \cs{ctex_at_end_preamble:n} +% 中调用 \pkg{biblatex},而 \pkg{biblatex} 自身又会使用 \pkg{etoolbox} +% 的钩子 \tn{AtEndPreamble},因此需要在载入 \cls{ctexbook} 之前调用 +% \pkg{etoolbox}。 +% +% 钩子的顺序为:$\text{\tn{CTEX@document@left@hook}} \prec +% \text{\tn{@endpreamblehook}} \prec +% \text{\texttt{\textbackslash begin\{document\}}}$。 +% \begin{macrocode} +\RequirePackage { etoolbox } +% \end{macrocode} +% +% 载入 \cls{ctexbook} 文档类。 +% 在使用 \XeLaTeX{} 编译时,\cls{ctexbook} 的底层将调用 \pkg{xeCJK} +% 宏包;而在使用 \LuaLaTeX{} 编译时,则将调用 \pkg{LuaTeX-ja} 宏包。 +% 两种情况下 \cls{ctexbook} 均会调用 \pkg{fontspec} 宏包。 +% \begin{macrocode} +\LoadClass { ctexbook } +% \end{macrocode} +% +% \changes{v0.4}{2017/08/13}{提供彩色支持。} +% +% 载入各宏包。其中,\pkg{amsmath} 必须在 \pkg{unicode-math} 之前引入。 +% \begin{macrocode} +\RequirePackage + { + amsmath, + unicode-math, + geometry, + fancyhdr, + footmisc, + ntheorem, + graphicx, + longtable, + caption, + xcolor + } +% \end{macrocode} +% +% \begin{macro}{\@@_check_package:nnn} +% 检查过时宏包。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_check_package:nnn #1#2#3 + { + \@ifpackagelater {#1} {#2} + { } { \@@_error:nnn { package-too-old } {#1} {#3} } + } +\@@_msg_new:nn { package-too-old } + { + Package~ "#1"~ is~ too~ old. \\ + The~ fduthesis~ class~ only~ supports~ "#1"~ with~ a~ version \\ + higher~ than~ v#2. \\\\ + Please~ update~ an~ up-to-date~ version~ of~ it~ using~ your \\ + TeX~ package~ manager~ or~ from~ CTAN. + } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\@@_check_package:nnn { ctex } { 2017/08/07 } { 2.4.10 } +\@@_check_package:nnn { fontspec } { 2017/09/22 } { 2.6e } +\@@_check_package:nnn { unicode-math } { 2017/11/18 } { 0.8i } +\sys_if_engine_xetex:T + { \@@_check_package:nnn { xeCJK } { 2017/08/07 } { 3.5.0 } } +% \end{macrocode} +% +% \subsection{页面布局} +% +% 利用 \pkg{geometry} 宏包设置纸张大小、页面边距以及页眉高度。这里, +% $\SI{2.54}{\centi\meter}=\SI{1}{in}$, +% $\SI{3.18}{\centi\meter}=\SI{1.25}{in}$。 +% \begin{macrocode} +\geometry + { + paper = a4paper, + vmargin = 2.54 cm, + hmargin = 3.18 cm, + headheight = 15 pt + } +% \end{macrocode} +% +% 草稿模式下显示页面边框及页眉、页脚线 。 +% \begin{macrocode} +\bool_if:NT \g_@@_draft_bool { \geometry { showframe } } +% \end{macrocode} +% +% \subsection{字体} +% +% \changes{v0.5}{2017/09/09}{重新实现字体调用。核心内容是分离 +% 字体的声明与设定,并按照宋、黑、仿、楷划分中文字体。} +% +% 为了避免不必要的字体调用开销 +% \footnote{事实上,此处的修正对性能的提升并不大。}, +% 本模板把字体的\emph{声明}与\emph{设定}分离了开来。使用 +% \cs{fdusetup} 设置的字体选项,以及导言区中通过 \cs{setmainfont}、 +% \cs{setCJKmainfont} 等命令设置的字体,均按照字体\emph{声明}处理。 +% 此时,字体名及其选项被存入相关变量中,但不进行实际调用。导言区 +% 末尾,再进行统一调用。本模板将重新定义 \cs{setmainfont}、 +% \cs{setCJKmainfont} 等命令。 +% +% 对于中文字体,\pkg{ctex} 宏包及其底层 \pkg{xeCJK} 和 +% \pkg{LuaTeX-ja},均与 \pkg{fontspec} 保持一致,以 +% |main|、|sans|、|mono| 三类进行划分;而本模板则按照 +% 宋、黑、仿、楷等进行划分。为此,需要额外建立二者之间的对应关系。 +% +% \begin{variable}{\g_@@_font_name_prop,\g_@@_font_options_prop} +% 存放西文字体名称及选项。 +% \begin{macrocode} +\prop_new:N \g_@@_font_name_prop +\prop_new:N \g_@@_font_options_prop +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_cjk_font_name_prop, +% \g_@@_cjk_font_options_prop} +% 存放中文字体及选项。 +% \begin{macrocode} +\prop_new:N \g_@@_cjk_font_name_prop +\prop_new:N \g_@@_cjk_font_options_prop +% \end{macrocode} +% \end{variable} +% +% \subsubsection{选项处理} +% +% 定义 |fdu/style| 键值类。 +% \begin{macrocode} +\keys_define:nn { fdu / style } + { +% \end{macrocode} +% +% \begin{macro}{style/font} +% 预定义西文字体。部分等宽字体(TeX Gyre Cursor)使用 +% \kvopt{Ligatures}{Common\-Off} 选项以禁用连字。 +% \begin{macrocode} + font .choice:, + font .value_required:n = true, +% \end{macrocode} +% Libertinus 系列。 +% \begin{macrocode} + font / libertinus .code:n = + { + \fdu_choose_font:nn { main } { Libertinus~ Serif } + \fdu_choose_font:nn { sans } { Libertinus~ Sans } + \fdu_choose_font_with_option:nnn { mono } + { TeX~ Gyre~ Cursor } { Ligatures = Common Off } + \fdu_choose_font:nn { math } { Libertinus~ Math } + \keys_set:nn { fdu / style } { footnote-style = libertinus } + }, +% \end{macrocode} +% Latin Modern 系列。 +% \begin{macrocode} + font / lm .code:n = + { + \fdu_choose_font:nn { main } { Latin~ Modern~ Roman } + \fdu_choose_font:nn { sans } { Latin~ Modern~ Sans } + \fdu_choose_font:nn { mono } { Latin~ Modern~ Mono } + \fdu_choose_font:nn { math } { Latin~ Modern~ Math } + \keys_set:nn { fdu / style } { footnote-style = pifont } + }, +% \end{macrocode} +% Palatino 系列。 +% \begin{macrocode} + font / palatino .code:n = + { + \fdu_choose_font:nn { main } { TeX~ Gyre~ Pagella } + \fdu_choose_font:nn { sans } { TeX~ Gyre~ Heros } + \fdu_choose_font_with_option:nnn { mono } + { TeX~ Gyre~ Cursor } { Ligatures = Common Off } + \fdu_choose_font:nn { math } { TeX~ Gyre~ Pagella~ Math } + \keys_set:nn { fdu / style } { footnote-style = pifont } + }, +% \end{macrocode} +% \changes{v0.6}{2017/11/11}{额外处理 XITS 字体的小型大写字母。} +% Times Roman 系列。XITS 字体没有小型大写字母,因此使用普通字体代替。 +% \begin{macrocode} + font / times .code:n = + { + \fdu_choose_font_with_option:nnn { main } { XITS } + { + UprightFeatures = { SmallCapsFont = * }, + BoldFeatures = { SmallCapsFont = *~ Bold }, + ItalicFeatures = { SmallCapsFont = *~ Italic }, + BoldItalicFeatures = { SmallCapsFont = *~ Bold~ Italic }, + } + \fdu_choose_font:nn { sans } { TeX~ Gyre~ Heros } + \fdu_choose_font_with_option:nnn { mono } + { TeX~ Gyre~ Cursor } { Ligatures = Common Off } + \fdu_choose_font:nn { math } { XITS~ Math } + \keys_set:nn { fdu / style } { footnote-style = xits } + }, +% \end{macrocode} +% \changes{v0.5}{2017/09/23}{新增 \kvopt{font}{none} 选项。} +% 不设置西文字体。 +% \begin{macrocode} + font / none .code:n = + { + \@@_initialize_prop:Nn \g_@@_font_name_prop + { main, sans, mono, math } + \@@_initialize_prop:Nn \g_@@_font_options_prop + { main, sans, mono, math } + \keys_set:nn { fdu / style } { footnote-style = plain } +%<*class> + }, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{style/cjk-font} +% 预定义中文(CJK)字体。Adobe 和中易系列没有粗宋体。 +% \begin{macrocode} + cjk-font .choice:, + cjk-font .value_required:n = true, +% \end{macrocode} +% Adobe 系列。 +% \begin{macrocode} + cjk-font / adobe .code:n = + { + \fdu_choose_cjk_font:nn { song } { Adobe~ Song~ Std } + \fdu_choose_cjk_font:nn { hei } { Adobe~ Heiti~ Std } + \fdu_choose_cjk_font:nn { fang } { Adobe~ Fangsong~ Std } + \fdu_choose_cjk_font:nn { kai } { Adobe~ Kaiti~ Std } + }, +% \end{macrocode} +% Fandol 系列。 +% \begin{macrocode} + cjk-font / fandol .code:n = + { + \fdu_choose_cjk_font_with_option:nnn { song } + { FandolSong } { BoldFont = FandolSong~ Bold } + \fdu_choose_cjk_font:nn { hei } { FandolHei } + \fdu_choose_cjk_font:nn { fang } { FandolFang } + \fdu_choose_cjk_font:nn { kai } { FandolKai } + }, +% \end{macrocode} +% 方正系列。 +% \begin{macrocode} + cjk-font / founder .code:n = + { + \fdu_choose_cjk_font_with_option:nnn { song } + { FZShuSong-Z01 } { BoldFont = FZXiaoBiaoSong-B05 } + \fdu_choose_cjk_font:nn { hei } { FZHei-B01 } + \fdu_choose_cjk_font:nn { fang } { FZFangSong-Z02 } + \fdu_choose_cjk_font:nn { kai } { FZKai-Z03 } + }, +% \end{macrocode} +% Mac (华文)系列。 +% \begin{macrocode} + cjk-font / mac .code:n = + { + \fdu_choose_cjk_font_with_option:nnn { song } + { STSong } { BoldFont = STZhongsong } + \fdu_choose_cjk_font:nn { hei } { STHeiti } + \fdu_choose_cjk_font:nn { fang } { STFangsong } + \fdu_choose_cjk_font:nn { kai } { STKaiti } + }, +% \end{macrocode} +% Windows (中易)系列。 +% \begin{macrocode} + cjk-font / windows .code:n = + { + \fdu_choose_cjk_font:nn { song } { SimSun } + \fdu_choose_cjk_font:nn { hei } { SimHei } + \fdu_choose_cjk_font:nn { fang } { FangSong } + \fdu_choose_cjk_font:nn { kai } { KaiTi } + }, +% \end{macrocode} +% \changes{v0.5}{2017/09/23}{新增 \kvopt{cjk-font}{none} 选项。} +% 不设置中文字体。 +% \begin{macrocode} + cjk-font / none .code:n = + { + \@@_initialize_prop:Nn \g_@@_cjk_font_name_prop + { rm, sf, tt, kai } + \@@_initialize_prop:Nn \g_@@_cjk_font_options_prop + { rm, sf, tt, kai } +%</class> + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_initialize_prop:Nn} +% 把 |prop-list| 清空,将其并设置为 |main={},| |sans={}| 等。 +% \begin{arguments} +% \item |prop-list| +% \item {\meta{family 1}, \meta{family 2}, \ldots},如 +% |{main,| |sans,| |mono,| |math}| +% \end{arguments} +% \begin{macrocode} +\cs_new_protected:Npn \@@_initialize_prop:Nn #1#2 + { + \prop_gclear:N #1 + \clist_map_inline:nn {#2} { \prop_gput:Nnn #1 {##1} { } } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{字体声明} +% +% 重定义文档命令,使其只声明字体,而不进行实际调用。 +% +% \begin{macro}{\setmainfont,\setsansfont,\setmonofont,\setmathfont} +% 声明西文字体。参数按照 \pkg{fontspec} 的风格,字体选项 +% 在前在后均可。 +% \begin{macrocode} +\clist_map_inline:nn + { main, sans, mono, math } + { + \exp_args:Nc \RenewDocumentCommand { set #1 font } { O { } m O { } } + { \fdu_choose_font_with_option:nnn { #1 } {##2} { ##1, ##3 } } + } +% \RenewDocumentCommand \setmainfont { O { } m O { } } +% { \fdu_choose_font_with_option:nnn { main } {#2} { #1, #3 } } +% \RenewDocumentCommand \setsansfont { O { } m O { } } +% { \fdu_choose_font_with_option:nnn { sans } {#2} { #1, #3 } } +% \RenewDocumentCommand \setmonofont { O { } m O { } } +% { \fdu_choose_font_with_option:nnn { mono } {#2} { #1, #3 } } +% \RenewDocumentCommand \setmathfont { O { } m O { } } +% { \fdu_choose_font_with_option:nnn { math } {#2} { #1, #3 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setCJKmainfont,\setCJKsansfont,\setCJKmonofont, +% \setCJKfamilyfont} +% 声明中文字体。参数同样按照 \pkg{fontspec} 的风格 +% \footnote{\pkg{xeCJK} 和 \pkg{ctex} 与之稍有区别,它们要求字体 +% 选项只能位于字体名的\emph{前或后},而不能同时出现(即不允许形如 +% \cs{setCJKmainfont}\texttt{\oarg{选项 1}\marg{字体}\oarg{选项 2}} +% 这样的语句)。}。 +% \begin{macrocode} +%<*class> +\RenewDocumentCommand \setCJKmainfont { O { } m O { } } + { \fdu_choose_cjk_font_with_option:nnn { rm } {#2} { #1, #3 } } +\RenewDocumentCommand \setCJKsansfont { O { } m O { } } + { \fdu_choose_cjk_font_with_option:nnn { sf } {#2} { #1, #3 } } +\RenewDocumentCommand \setCJKmonofont { O { } m O { } } + { \fdu_choose_cjk_font_with_option:nnn { tt } {#2} { #1, #3 } } +\RenewDocumentCommand \setCJKfamilyfont { m O { } m O { } } + { \fdu_choose_cjk_font_with_option:nnn {#1} {#3} { #2, #4 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setCJKsongfont,\setCJKheifont, +% \setCJKfangfont,\setCJKkaifont} +% 声明中文宋、黑、仿、楷字体,暂时不用。 +% \begin{macrocode} +% \DeclareDocumentCommand \setCJKsongfont { O { } m O { } } +% { \fdu_choose_cjk_font_with_option:nnn { song } {#2} { #1, #3 } } +% \DeclareDocumentCommand \setCJKheifont { O { } m O { } } +% { \fdu_choose_cjk_font_with_option:nnn { hei } {#2} { #1, #3 } } +% \DeclareDocumentCommand \setCJKfangfont { O { } m O { } } +% { \fdu_choose_cjk_font_with_option:nnn { fang } {#2} { #1, #3 } } +% \DeclareDocumentCommand \setCJKkaifont { O { } m O { } } +% { \fdu_choose_cjk_font_with_option:nnn { kai } {#2} { #1, #3 } } +%</class> +% \end{macrocode} +% \end{macro} +% +% 字体选择只需将字体名及选项存入相应变量即可。 +% +% \begin{macro}{\fdu_choose_font_with_option:nnn,\fdu_choose_font:nn} +% 选择西文字体。 +% \begin{arguments} +% \item |main| / |sans| / |mono| / |math| +% \item 字体名 +% \item 选项 +% \end{arguments} +% \begin{macrocode} +\cs_new_protected:Npn \fdu_choose_font_with_option:nnn #1#2#3 + { + \prop_gput:Nnn \g_@@_font_name_prop {#1} {#2} + \prop_gput:Nnn \g_@@_font_options_prop {#1} {#3} + } +\cs_new_protected:Npn \fdu_choose_font:nn #1#2 + { + \prop_gput:Nnn \g_@@_font_name_prop {#1} {#2} + \prop_gput:Nnn \g_@@_font_options_prop {#1} { } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fdu_choose_cjk_font_with_option:nnn, +% \fdu_choose_cjk_font:nn} +% 选择中文字体。 +% \begin{arguments} +% \item |rm| / |sf| / |tt| 或 |song| / |hei| / |fang| / |kai| +% \item 字体名 +% \item 选项 +% \end{arguments} +% \begin{macrocode} +\cs_new_protected:Npn \fdu_choose_cjk_font_with_option:nnn #1#2#3 + { + \prop_gput:Nnn \g_@@_cjk_font_name_prop {#1} {#2} + \prop_gput:Nnn \g_@@_cjk_font_options_prop {#1} {#3} + } +\cs_new_protected:Npn \fdu_choose_cjk_font:nn #1#2 + { + \prop_gput:Nnn \g_@@_cjk_font_name_prop {#1} {#2} + \prop_gput:Nnn \g_@@_cjk_font_options_prop {#1} { } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{字体设定} +% +% 此时需要利用 \pkg{fontspec}、\pkg{unicode-math}、\pkg{xeCJK}、 +% \pkg{ctex} 等宏包完成实际的字体调用。会在导言区末尾统一进行。 +% +% \begin{macro}{\@@_set_font:} +% 设定西文字体。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_set_font: + { + \clist_map_inline:nn { main, sans, mono, math } + { + \prop_get:NnN \g_@@_font_name_prop {##1} \l_@@_tmpa_tl + \prop_get:NnN \g_@@_font_options_prop {##1} \l_@@_tmpb_tl + \tl_if_empty:NT \l_@@_tmpa_tl + { \@@_error:nn { font-not-defined } {##1} } + \use:c { @@_set_ ##1 _font:VV } \l_@@_tmpa_tl \l_@@_tmpb_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \changes{v0.5}{2017/09/23}{同步 \pkg{fontspec} v2.6e。} +% +% \begin{macro}{\@@_set_main_font:nn, +% \@@_set_sans_font:nn, +% \@@_set_mono_font:nn} +% 拷贝 \cs{__fontspec_main_setmainfont:nn} 等命令。注意参数顺序 +% 是相反的。 +% \begin{arguments} +% \item 字体名 +% \item 选项 +% \end{arguments} +% \begin{macrocode} +\clist_map_inline:nn { main, sans, mono } + { + \cs_new_protected:cpx { @@_set_ #1 _font:nn } ##1 ##2 + { \exp_not:c { __fontspec_main_set #1 font:nn } {##2} {##1} } + } +% \end{macrocode} +% \end{macro} +% +% \changes{v0.6}{2017/10/11}{同步 \pkg{unicode-math} v0.8h。} +% +% \begin{macro}{\@@_set_math_font:nn} +% 拷贝 \pkg{unicode-math} 中的 \cs{setmathfont} 命令。参数同上。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_set_math_font:nn #1#2 + { \__um_setmathfont:nn {#2} {#1} } +% \end{macrocode} +% \end{macro} +% +% 生成字体设定函数的变体。 +% \begin{macrocode} +\clist_map_inline:nn { main, sans, mono, math } + { \cs_generate_variant:cn { @@_set_ #1 _font:nn } { VV } } +% \end{macrocode} +% +% \begin{macro}{\@@_set_cjk_font:} +% 设定中文字体。复杂之处在于需要建立宋、黑、仿、楷到 +% |rm| / |sf| / |tt| 的映照,如表~\ref{tab:cjk-font} 所示。 +% \begin{table}[ht] +% \caption{宋、黑、仿、楷到 \texttt{rm} / \texttt{sf} / +% \texttt{tt} 的映照} +% \label{tab:cjk-font} +% \centering +% \begin{tabular}{ccccc} +% \toprule +% & Normal & Bold & Italic & Bold-italic \\ +% \midrule +% |rm| & 宋体 & [粗宋] / \textsf{黑体} & \textit{楷体} & (\textit{粗楷}) \\ +% |sf| & \textsf{黑体} & (\textsf{粗黑}) & \textsf{黑体} & \textsf{黑体} \\ +% |tt| & \texttt{仿体} & (\texttt{粗仿}) & \textit{楷体} & (\textit{粗楷}) \\ +% \bottomrule +% \end{tabular} +% \end{table} +% \begin{macrocode} +%<*class> +\cs_new_protected:Npn \@@_set_cjk_font: + { + \clist_map_inline:nn { rm, sf, tt, kai } + { + \use:c { @@_parse_cjk_ ##1 _font: } + \@@_check_cjk_font:n {##1} + \@@_set_cjk_font_aux:n {##1} + } +% \end{macrocode} +% 清除冗余键值对。 +% \begin{macrocode} + \clist_map_inline:nn { song, hei, fang } + { + \prop_gremove:Nn \g_@@_cjk_font_name_prop {##1} + \prop_gremove:Nn \g_@@_cjk_font_options_prop {##1} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{variable}{\l_@@_font_name_tl,\l_@@_font_options_clist} +% 临时存放字体名称和选项。 +% \begin{macrocode} +\tl_new:N \l_@@_font_name_tl +\clist_new:N \l_@@_font_options_clist +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_parse_cjk_rm_font:} +% 解析 |rm| 字体族。未设置 |rm| 字体族(即未调用 \cs{setmainfont}) +% 时,传入 |song| 对应的字体名和选项。|sf| 和 |tt| 字体族的解析 +% 基本类似。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_cjk_rm_font: + { + \prop_get:NnNF \g_@@_cjk_font_name_prop + { rm } \l_@@_font_name_tl + { + \@@_get_cjk_font_name_options:nn { rm } { song } +% \end{macrocode} +% 根据 \opt{粗宋/黑} 选项来进行操作。目前暂未定义该选项,利用 +% \cs{use_ii:nn} 充当条件判断。使用黑体。 +% \begin{macrocode} + \use_ii:nn + { +% \end{macrocode} +% 粗宋。判断是否定义 \opt{BoldFont},若未定义,则设置 \opt{BoldFont} +% 为普通宋体。 +% \begin{macrocode} + \tl_if_in:NnF \l_@@_font_options_clist { BoldFont = } + { + \clist_put_right:Nx \l_@@_font_options_clist + { BoldFont = \l_@@_font_name_tl } + } + } + { +% \end{macrocode} +% 黑体。注意右侧选项会覆盖左侧选项。\\ +% \begin{macrocode} +% TODO: (2017/09/18) `hei` or `sans`? + \prop_get:NnN \g_@@_cjk_font_name_prop { hei } + \l_@@_tmpa_tl + \clist_put_right:Nx \l_@@_font_options_clist + { BoldFont = \l_@@_tmpa_tl } + } + \@@_get_cjk_kai_font: + \@@_set_cjk_font_options:n { rm } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_cjk_sf_font:} +% 解析 |sf| 字体族。未设置 |sf| 字体族(即未调用 \cs{setsansfont}) +% 时,传入 |hei| 对应的字体名和选项。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_cjk_sf_font: + { + \prop_get:NnNF \g_@@_cjk_font_name_prop + { sf } \l_@@_font_name_tl + { + \@@_get_cjk_font_name_options:nn { sf } { hei } +% \end{macrocode} +% 黑体的 \opt{BoldFont}、\opt{ItalicFont}、\opt{BoldItalicFont} +% 都使用普通字体。不需要载入楷体。 +% \begin{macrocode} + \clist_put_right:Nx \l_@@_font_options_clist + { + BoldFont = \l_@@_font_name_tl, + ItalicFont = \l_@@_font_name_tl, + BoldItalicFont = \l_@@_font_name_tl + } + \@@_set_cjk_font_options:n { sf } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_cjk_tt_font:} +% 解析 |tt| 字体族。未设置 |tt| 字体族(即未调用 \cs{setmonofont}) +% 时,传入 |fang| 对应的字体名和选项。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_cjk_tt_font: + { + \prop_get:NnNF \g_@@_cjk_font_name_prop + { tt } \l_@@_font_name_tl + { + \@@_get_cjk_font_name_options:nn { tt } { fang } + \clist_put_right:Nx \l_@@_font_options_clist + { BoldFont = \l_@@_font_name_tl } + \@@_get_cjk_kai_font: + \@@_set_cjk_font_options:n { tt } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_cjk_kai_font:} +% 解析 |kai| 字体族。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_cjk_kai_font: + { + \prop_get:NnN \g_@@_cjk_font_name_prop { kai } + \l_@@_font_name_tl +% \end{macrocode} +% 与黑体类似,楷体的 \opt{BoldFont}、\opt{ItalicFont}、 +% \opt{BoldItalicFont} 也都使用普通字体。 +% \begin{macrocode} + \clist_set:Nx \l_@@_font_options_clist + { + BoldFont = \l_@@_font_name_tl, + ItalicFont = \l_@@_font_name_tl, + BoldItalicFont = \l_@@_font_name_tl + } + \@@_set_cjk_font_options:n { kai } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_get_cjk_font_name_options:nn} +% 处理字体名称和选项。字体名存入 \cs{l_@@_font_name_tl},字体 +% 选项存入 \cs{l_@@_font_options_clist}。注意字体名还被存入了 +% |prop-list| 中(对应的 \meta{key} = |#1|),但选项则在 +% |\__fdu_parse_cjk_..._font:| 的最后才会被存入 |prop-list| 中。 +% 因此还需要有 \cs{@@_set_cjk_font_options:n} 来设置选项。 +% \begin{arguments} +% \item |rm| / |sf| / |tt| +% \item |song| / |hei| / |fang| +% \end{arguments} +% \begin{macrocode} +\cs_new_protected:Npn \@@_get_cjk_font_name_options:nn #1#2 + { + \prop_get:NnN \g_@@_cjk_font_name_prop {#2} \l_@@_font_name_tl + \prop_gput:NnV \g_@@_cjk_font_name_prop {#1} \l_@@_font_name_tl + \prop_get:NnN \g_@@_cjk_font_options_prop {#2} \l_@@_tmpa_tl + \clist_set:NV \l_@@_font_options_clist \l_@@_tmpa_tl + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_get_cjk_kai_font:} +% 补齐斜体、粗斜体(都设置为楷体)。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_get_cjk_kai_font: + { + \prop_get:NnN \g_@@_cjk_font_name_prop { kai } + \l_@@_tmpa_tl + \clist_put_right:Nx \l_@@_font_options_clist + { + ItalicFont = \l_@@_tmpa_tl, + BoldItalicFont = \l_@@_tmpa_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_set_cjk_font_options:n} +% \begin{macrocode} +% 设置选项,即把选项存入 |prop-list|,对应 \meta{key} = |#1|。 +% |#1| = |rm| / |sf| / |tt|。 +\cs_new_protected:Npn \@@_set_cjk_font_options:n #1 + { + \prop_put:NnV \g_@@_cjk_font_options_prop {#1} + \l_@@_font_options_clist + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_check_cjk_font:n} +% 检查 CJK 字体族是否已定义。 +% |#1| = |rm| / |sf| / |tt|。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_check_cjk_font:n #1 + { + \prop_get:NnN \g_@@_cjk_font_name_prop {#1} + \l_@@_font_name_tl + \tl_if_empty:NT \l_@@_font_name_tl + { \@@_error:nn { cjk-font-not-defined } {#1} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xeCJK_set_family:nVV,\ctex_ltj_set_family:nVV} +% 生成 \pkg{xeCJK} 和 \pkg{ctex} 中字体族设定函数的变体。 +% 由于 \cs{@@_set_cjk_font_aux:nnnn} 使用了 +% \cs{cs_new_protected:Npx} 定义,因此必须在它之前给出变体形式。 +% \begin{macrocode} +\cs_generate_variant:Nn \xeCJK_set_family:nnn { nVV } +\cs_generate_variant:Nn \ctex_ltj_set_family:nnn { nVV } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_set_cjk_font_aux:n} +% 利用 \pkg{xeCJK} 或 \pkg{ctex-ltj} 调用字体,需按照引擎的不同 +% 分别处理。使用 |Npx| 型来定义是为了在定义时直接确定引擎,以避开 +% 调用时的判断。 +% |#1| = |rm| / |sf| / |tt|。 +% \begin{macrocode} +\cs_new_protected:Npx \@@_set_cjk_font_aux:n #1 + { + \prop_get:NnN \exp_not:N \g_@@_cjk_font_name_prop {#1} + \exp_not:N \l_@@_tmpa_tl + \prop_get:NnN \exp_not:N \g_@@_cjk_font_options_prop {#1} + \exp_not:N \l_@@_tmpb_tl + \sys_if_engine_xetex:TF + { \xeCJK_set_family:nVV } + { \sys_if_engine_luatex:T { \ctex_ltj_set_family:nVV } } + {#1} \exp_not:n { \l_@@_tmpb_tl \l_@@_tmpa_tl } + } +%</class> +% \end{macrocode} +% \end{macro} +% +% 字体族未定义信息。 +% \begin{macrocode} +\@@_msg_new:nn { font-not-defined } + { + \str_upper_case:f { \tl_head:n {#1} } \tl_tail:n {#1} ~ + font~ is~ not~ defined. \\\\ + You~ can~ set~ option~ "font"~ via~ "\string\fdusetup",~ + or~ use~ command~ \\ + "\string\set #1 font"~ to~ define~ new~ font~ families. + } +%<*class> +\@@_msg_new:nn { cjk-font-not-defined } + { + CJK~ font~ family~ "#1"~ is~ not~ defined. \\\\ + You~ can~ set~ option~ "cjk-font"~ via~ "\string\fdusetup",~ + or~ use~ commands~ \\ + "\string\setCJKmainfont",~ "\string\setCJKsansfont"~ or~ + "\string\setCJKmonofont",~ etc~ \\ + to~ define~ new~ CJK~ font~ families. + } +% \end{macrocode} +% +% \begin{macrocode} +\sys_if_engine_xetex:T + { +% \end{macrocode} +% 这里给这两个 |prop-list| 变量赋一个空值,使得 \pkg{xeCJK} 认为 +% |rm| 字体族已定义,从而避免警告。\LuaTeX{} 引擎下, +% \pkg{ctex-ltj} 不会给出警告,暂且不管。 +% \begin{macrocode} + \prop_gput:Nnn \g__xeCJK_family_font_name_prop { rm } { } + \prop_gput:Nnn \g__xeCJK_family_name_prop { rm } { } +% \end{macrocode} +% 关闭 \pkg{xeCJK} 中重定义字体族的警告。 +% \begin{macrocode} + \msg_redirect_name:nnn { xeCJK } { CJKfamily-redef } { none } + } +%</class> +% \end{macrocode} +% +% 在导言区末尾载入字体。 +% \begin{macrocode} +\ctex_at_end_preamble:n + { + \@@_set_font: +%<class> \@@_set_cjk_font: + } +% \end{macrocode} +% +% \subsubsection{字体切换(楷体)} +% +% 一般情况下,楷体被用作中文斜体。但有时需要保持西文部分不被倾斜, +% 因此需要额外定义楷体切换命令。 +% +% \begin{macro}[TF]{\fdu_family_if_exist:n} +% \changes{v0.4}{2017/08/10}{修复 \LuaTeX{} 下的展开错误。} +% 判断字体族是否存在。 +% \XeTeX{} 引擎下直接利用 \pkg{xeCJK} 宏包提供的函数。 +% \begin{macrocode} +%<*class> +\sys_if_engine_xetex:TF + { + \prg_new_protected_conditional:Npnn + \fdu_family_if_exist:n #1 { TF } + { + \xeCJK_family_if_exist:nTF {#1} + { \prg_return_true: } { \prg_return_false: } + } + } + { +% \end{macrocode} +% \LuaTeX{} 引擎下需要利用 \pkg{ctex} 宏包提供的函数。这两个函数 +% 的参数略有不同。 +% \begin{macrocode} + \sys_if_engine_luatex:T + { + \prg_new_protected_conditional:Npnn + \fdu_family_if_exist:n #1 { TF } + { + \ctex_ltj_family_if_exist:nNTF {#1} \l_@@_tmpa_tl + { \prg_return_true: } { \prg_return_false: } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fdu_cjk_font_kai:} +% 楷体切换命令。 +% \begin{macrocode} +\cs_new_protected:Npx \fdu_cjk_font_kai: + { + \fdu_family_if_exist:nTF { kai } + { + \sys_if_engine_xetex:TF + { \xeCJK_switch_family:n { kai } } + { + \sys_if_engine_luatex:T + { \ctex_ltj_switch_family:n { kai } } + } + } + { \exp_not:n { \rmfamily \itshape } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\fdu@kai} +% 命令 \cs{fdu_cjk_font_kai:} 采用 \LaTeX3 风格,在 \file{.toc} +% 文件里无法正常使用,因此重新定义为 \LaTeXe{} 风格的命令。 +% \begin{macrocode} +\cs_new_eq:NN \fdu@kai \fdu_cjk_font_kai: +%</class> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{数学字体设置} +% +% 根据 GB 3102.11--93 以及 ISO 80000-2:2009 的规定,数学表达式中 +% 表示变量的拉丁字母和希腊字母均应当使用斜体。 +% 这里的 |\keys_set:nn{unicode-math}| 实际相当于 \cs{unimathsetup}。\\ +% \begin{macrocode} +% TODO: (2018/01/19) do we need `mathrm=sym`? +\keys_set:nn { unicode-math } + { + math-style = ISO, + bold-style = ISO, +% mathrm = sym + } +% \end{macrocode} +% +% \subsubsection{字号} +% +% \begin{macrocode} +\keys_define:nn { fdu / style } + { +% \end{macrocode} +% +% \begin{macro}{style/font-size} +% |font-size| 不是文档类选项,不能传给 \cls{ctexbook} 文档类,因此 +% 只能手动重定义字号命令。 +% \begin{macrocode} + font-size .choice:, + font-size .value_required:n = true, + font-size / -4 .code:n = { }, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tiny,\scriptsize,\footnotesize,\small, +% \normalsize,\large,\Large,\LARGE,\huge,\Huge} +% 默认使用小四号字,所以只有五号字需要重新设置。 +% \begin{macrocode} + font-size / 5 .code:n = + { + \RenewDocumentCommand \tiny { } { \zihao { 7 } } + \RenewDocumentCommand \scriptsize { } { \zihao { -6 } } + \RenewDocumentCommand \footnotesize { } { \zihao { 6 } } + \RenewDocumentCommand \small { } { \zihao { -5 } } + \RenewDocumentCommand \normalsize { } { \zihao { 5 } } + \RenewDocumentCommand \large { } { \zihao { -4 } } + \RenewDocumentCommand \Large { } { \zihao { -3 } } + \RenewDocumentCommand \LARGE { } { \zihao { -2 } } + \RenewDocumentCommand \huge { } { \zihao { 2 } } + \RenewDocumentCommand \Huge { } { \zihao { 1 } } +%<class-en> } +%<class-en> } +%<*class> + }, +% \end{macrocode} +% \end{macro} +% +% \subsubsection{句号} +% +% \begin{macro}{style/fullwidth-stop} +% \changes{v0.6}{2017/10/14}{支持类别码和 TECKit 映射两种机制。} +% 设置句号形状(圆圈或是圆点)。 +% \begin{macrocode} + fullwidth-stop .choice:, + fullwidth-stop .value_required:n = true, +% \end{macrocode} +% 利用类别码机制切换,只有显式的\FSID 会被替换。 +% \begin{macrocode} + fullwidth-stop / catcode .code:n = + { \@@_set_fullwidth_stop_catcode: }, +% \end{macrocode} +% 利用 TECKit 映射机制切换,相当于设置了 \tn{defaultCJKfontfeatures} +% |{|\kvopt{Map\-ping}{fullwidth-stop}|}|。这种手段会 +% 替换所有出现的\FSID,并且将影响所有字体。只在 \XeTeX{} +% 下可用。 +% \begin{macrocode} + fullwidth-stop / mapping .code:n = + { + \sys_if_engine_xetex:TF + { + \clist_gset:Nn \g__xeCJK_default_features_clist + { Mapping = fullwidth-stop } + } + { +% \end{macrocode} +% \LuaTeX{} 下改用类别码机制代替,并给出警告。 +% \begin{macrocode} + \sys_if_engine_luatex:T + { + \@@_warning:n { mapping-not-available } + \@@_set_fullwidth_stop_catcode: + } + } + }, + fullwidth-stop / false .code:n = { } + } +% \end{macrocode} +% \end{macro} +% +% 提示信息。 +% \begin{macrocode} +\@@_msg_new:nn { mapping-not-available } + { + Option~ "fullwidth-stop = mapping"~ is~ not~ available~ in~ LuaTeX. \\ + "fullwidth-stop = catcode"~ will~ be~ set~ instead. + } +% \end{macrocode} +% +% \begin{macro}{\@@_set_fullwidth_stop_catcode:} +% 将\FSID 设置为活动符,并定义为句点\FSFW。 +% \begin{macrocode} +\cs_new:Npn \@@_set_fullwidth_stop_catcode: + { + \char_set_active_eq:nN { "3002 } \c_@@_fullwidth_full_stop_tl + \char_set_catcode_active:n { "3002 } + } +%</class> +% \end{macrocode} +% \end{macro} +% +% \changes{v0.6}{2017/10/28}{优化 \LuaTeX{} 下希腊字母、西里尔字母 +% 和带圈数字的显示(\pkg{ctex} v2.4.11 已默认进行处理)。} +% +% \subsection{章节标题结构} +% +% |\keys_set:nn{ctex}| 实际相当于 \cs{ctexset}。 +% \begin{macrocode} +\keys_set:nn { ctex } + { +% \end{macrocode} +% +% 设置章(chapter)、节(section)与小节(sub-section)标题样式。 +% 此处使用 \kvopt{fixskip}{true} 选项来抑制前后的多余间距。 +% \begin{macrocode} + chapter = + { +%<class> format = \huge \normalfont \sffamily \centering, +%<*class-en> + format = \centering, + nameformat = \LARGE \bfseries, + titleformat = \huge \bfseries, + aftername = \par \nobreak \vskip 10 pt, +%</class-en> + beforeskip = 50 pt, + afterskip = 40 pt, + number = \@@_arabic:n { chapter }, + fixskip = true + }, + section = + { +%<class> format = \Large \normalfont \sffamily \raggedright, +%<class-en> format = \Large \bfseries \raggedright, + beforeskip = 3.5 ex plus 1.0 ex minus 0.2 ex, + afterskip = 2.7 ex plus 0.5 ex, + fixskip = true + }, + subsection = + { +%<class> format = \large \normalfont \sffamily \raggedright, +%<class-en> format = \large \bfseries \raggedright, + beforeskip = 3.25 ex plus 1.0 ex minus 0.2 ex, + afterskip = 2.5 ex plus 0.3 ex, + fixskip = true + } + } +% \end{macrocode} +% +% \subsection{页眉页脚} +% +% 清除默认页眉页脚格式。 +% \begin{macrocode} +\fancyhf { } +% \end{macrocode} +% +% \begin{variable}{\l_@@_header_center_mark_tl} +% 保存中间页眉的文字。正文中设置为空,目录、摘要、符号表等设置为 +% 相应标题。 +% \begin{macrocode} +\tl_new:N \l_@@_header_center_mark_tl +% \end{macrocode} +% \end{variable} +% +% 构建页眉,要在单面或双面下分别设置。 +% +% \cs{fancyhead} 的选项中,\opt{E} 和 \opt{O} 分别表示偶数(even) +% 和奇数(odd), 而 \opt{L}、\opt{R} 和 \opt{C} 则分别表示左 +% (left)、右(right)和中间(center)。按照通常的排版规则, +% 在双面模式下,偶数页的中间页眉文字在左,奇数页则在右。单面模式下, +% 左右页眉都要显示。 +% \begin{macrocode} +\bool_if:NTF \g_@@_twoside_bool +%<*class> + { + \fancyhead [ EL ] { \small \nouppercase { \fdu@kai \leftmark } } + \fancyhead [ OR ] { \small \nouppercase { \fdu@kai \rightmark } } + } + { + \fancyhead [ L ] { \small \nouppercase { \fdu@kai \leftmark } } + \fancyhead [ R ] { \small \nouppercase { \fdu@kai \rightmark } } + \fancyhead [ C ] + { + \small \nouppercase + { \fdu@kai \l_@@_header_center_mark_tl } + } + } +%</class> +%<*class-en> + { + \fancyhead [ EL ] { \small \nouppercase { \itshape \leftmark } } + \fancyhead [ OR ] { \small \nouppercase { \itshape \rightmark } } + } + { + \fancyhead [ L ] { \small \nouppercase { \itshape \leftmark } } + \fancyhead [ R ] { \small \nouppercase { \itshape \rightmark } } + \fancyhead [ C ] + { + \small \nouppercase + { \itshape \l_@@_header_center_mark_tl } + } + } +%</class-en> +% \end{macrocode} +% +% 构建页脚,用来显示页码。选项 \opt{C} 表示居中(center)。 +% \begin{macrocode} +\fancyfoot [ C ] { \small \thepage } +% \end{macrocode} +% +% 关闭横线显示(未启用)。 +% \begin{macrocode} +% \RenewDocumentCommand \headrulewidth { } { 0 pt } +% \end{macrocode} +% +% \begin{macro}{\fdu_front_matter_header:n} +% 在单页模式下,设置前导部分(包括目录、摘要、符号表等)的页眉中间 +% 为相应标题,左右为空。 +% \begin{macrocode} +\cs_new:Npn \fdu_front_matter_header:n #1 + { + \bool_if:NTF \g_@@_twoside_bool + { \markboth {#1} {#1} } + { + \markboth { } { } + \tl_gset:Nn \l_@@_header_center_mark_tl {#1} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cleardoublepage} +% 重定义 \tn{cleardoublepage},使得偶数页面在没有内容时也不显示 +% 页眉页脚。\\ +% 见 http://tex.stackexchange.com/q/1681 \\ +% 最后清空中间页眉,确保正文部分页眉显示正确。 +% \begin{macrocode} +\RenewDocumentCommand \cleardoublepage { } + { + \clearpage + \bool_if:NT \g_@@_twoside_bool + { + \int_if_odd:nF \c@page + { \hbox:n { } \thispagestyle { empty } \newpage } + } + \tl_gset:Nn \l_@@_header_center_mark_tl { } + } +% \end{macrocode} +% \end{macro} +% +% \pkg{ctex} 宏包使用 \opt{heading} 选项后,会把页面格式设置为 +% |headings|。因此必须在 \pkg{ctex} 调用之后重新设置 \cs{pagestyle} +% 为 |fancy|。 +% \begin{macrocode} +\pagestyle { fancy } +% \end{macrocode} +% +% \subsection{脚注} +% +% \changes{v0.3}{2017/02/21}{支持脚注。} +% +% \subsubsection{编号样式} +% +% 各种脚注编号样式的名称。 +% \begin{macrocode} +\clist_map_inline:nn + { + { plain } { plain }, + { libertinus } { libertinus }, + { libertinus_neg } { libertinus* }, + { libertinus_sans } { libertinus-sans }, + { pifont } { pifont }, + { pifont_neg } { pifont* }, + { pifont_sans } { pifont-sans }, + { pifont_sans_neg } { pifont-sans* }, + { xits } { xits }, + { xits_sans } { xits-sans }, + { xits_sans_neg } { xits-sans* } + } + { \@@_define_fn_style:nn #1 } +% \end{macrocode} +% +% \begin{variable}{\l_@@_fn_style_tl} +% 保存当前使用的脚注编号样式。 +% \begin{macrocode} +\tl_new:N \l_@@_fn_style_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macrocode} +\keys_define:nn { fdu / style } + { +% \end{macrocode} +% +% \begin{macro}{style/footnote-style} +% 脚注类型共分四大类: +% \begin{itemize} +% \item \opt{plain}:使用当前字体; +% \item \opt{libertinus}:取自 Libertinus Serif 和 Libertinus Sans +% 字体; +% \item \opt{pifont}:使用 \pkg{pifont} 宏包; +% \item \opt{xits}:取自 XITS 字体。 +% \end{itemize} +% 不带任何修饰的为衬线阳文符号,带“|sans|”的为无衬线符号,带“|*|”的 +% 为阴文版本。 +% \begin{macrocode} + footnote-style .choices:nn = + { + plain, + libertinus, libertinus*, libertinus-sans, + pifont, pifont*, pifont-sans, pifont-sans*, + xits, xits-sans, xits-sans* + } +% \end{macrocode} +% \changes{v0.6}{2017/11/12}{不再依赖 XITS-Math 字体。} +% 若使用 \opt{pifont} 类型,则需引入 \pkg{pifont} 宏包。 +% \begin{macrocode} + { + \tl_gset_eq:NN \l_@@_fn_style_tl \l_keys_choice_tl + \int_compare:nT { 5 <= \l_keys_choice_int <= 8 } + { \RequirePackage { pifont } } + }, + footnote-style .value_required:n = true + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_libertinus:n} +% \opt{libertinus} 普通版。\numrange{1}{20} 为数字,\numrange{21}{46} +% 为小写英文字母,\numrange{47}{72} 为大写英文字母。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_libertinus:n #1 + { + \int_compare:nTF { #1 >= 21 } + { + \int_compare:nTF { #1 >= 47 } + { \@@_symbol:n { \int_eval:n { "24B6 - 47 + #1 } } } + { \@@_symbol:n { \int_eval:n { "24D0 - 21 + #1 } } } + } + { \@@_symbol:n { \int_eval:n { "2460 - 1 + #1 } } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_libertinus_neg:n} +% \opt{libertinus} 阴文衬线版。只含 \numrange{1}{20}。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_libertinus_neg:n #1 + { + \int_compare:nTF { #1 >= 11 } + { \@@_symbol:n { \int_eval:n { "24EB - 11 + #1 } } } + { \@@_symbol:n { \int_eval:n { "2776 - 1 + #1 } } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_libertinus_sans:n} +% \opt{libertinus} 阳文无衬线版。符号排列与普通版相同。 +% \begin{macrocode} +\cs_new_eq:NN \@@_fn_symbol_libertinus_sans:n + \@@_fn_symbol_libertinus:n +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_pifont:n} +% \opt{pifont} 普通版。以下四种都只包含 \numrange{1}{10}。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_pifont:n #1 + { \ding { \int_eval:n { 171 + #1 } } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_pifont_neg:n} +% \opt{pifont} 阴文衬线版。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_pifont_neg:n #1 + { \ding { \int_eval:n { 181 + #1 } } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_pifont_sans:n} +% \opt{pifont} 阳文无衬线版。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_pifont_sans:n #1 + { \ding { \int_eval:n { 191 + #1 } } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_pifont_sans_neg:n} +% \opt{pifont} 阴文无衬线版。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_pifont_sans_neg:n #1 + { \ding { \int_eval:n { 201 + #1 } } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_xits:n} +% \opt{xits} 普通版。\numrange{1}{9} 为数字,\numrange{10}{35} +% 为小写英文字母,\numrange{36}{61} 为大写英文字母。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_xits:n #1 + { + \int_compare:nTF { #1 >= 10 } + { + \int_compare:nTF { #1 >= 36 } + { \@@_symbol:n { \int_eval:n { "24B6 - 36 + #1 } } } + { \@@_symbol:n { \int_eval:n { "24D0 - 10 + #1 } } } + } + { \@@_symbol:n { \int_eval:n { "2460 - 1 + #1 } } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_xits_sans:n} +% \opt{xits} 阳文无衬线版。只包含 \numrange{1}{10}。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_xits_sans:n #1 + { \@@_symbol:n { \int_eval:n { "2780 - 1 + #1 } } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fn_symbol_xits_sans_neg:n} +% \opt{xits} 阴文无衬线版。也只包含 \numrange{1}{10}。 +% \begin{macrocode} +\cs_new:Npn \@@_fn_symbol_xits_sans_neg:n #1 + { \@@_symbol:n { \int_eval:n { "278A - 1 + #1 } } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thefootnote} +% \changes{v0.7}{2018/01/17}{改为可完全展开的命令。} +% 重定义脚注编号。 +% \begin{macrocode} +\cs_set:Npn \thefootnote { \fdu_footnote_number:N \c@footnote } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fdu_footnote_number:N} +% 脚注编号样式。 +% \begin{macrocode} +\cs_new:Npn \fdu_footnote_number:N #1 + { + \tl_case:NnF \l_@@_fn_style_tl + { +% \end{macrocode} +% \opt{plain} 类型直接使用计数器 |footnote| 的值。 +% \begin{macrocode} + \c_@@_fn_style_plain_tl + { \int_use:N #1 } +% \end{macrocode} +% \opt{libertinus} 类型需要使用 Libertinus Serif 或 +% Libertinus Sans 字体。 +% \begin{macrocode} + \c_@@_fn_style_libertinus_tl + { + \fontspec { Libertinus~ Serif } + \@@_fn_symbol_libertinus:n {#1} + } + \c_@@_fn_style_libertinus_neg_tl + { + \fontspec { Libertinus~ Serif } + \@@_fn_symbol_libertinus_neg:n {#1} + } + \c_@@_fn_style_libertinus_sans_tl + { + \fontspec { Libertinus~ Sans } + \@@_fn_symbol_libertinus_sans:n {#1} + } +% \end{macrocode} +% \opt{pifont} 类型无需进行额外的操作。 +% \begin{macrocode} + \c_@@_fn_style_pifont_tl + { \@@_fn_symbol_pifont:n {#1} } + \c_@@_fn_style_pifont_neg_tl + { \@@_fn_symbol_pifont_neg:n {#1} } + \c_@@_fn_style_pifont_sans_tl + { \@@_fn_symbol_pifont_sans:n {#1} } + \c_@@_fn_style_pifont_sans_neg_tl + { \@@_fn_symbol_pifont_sans_neg:n {#1} } +% \end{macrocode} +% \opt{xits} 类型需要临时切换数学字体。 +% \begin{macrocode} + \c_@@_fn_style_xits_tl + { + \fontspec { XITS } + \@@_fn_symbol_xits:n {#1} + } + \c_@@_fn_style_xits_sans_tl + { + \fontspec { XITS } + \@@_fn_symbol_xits_sans:n {#1} + } + \c_@@_fn_style_xits_sans_neg_tl + { + \fontspec { XITS } + \@@_fn_symbol_xits_sans_neg:n {#1} + } + } +% \end{macrocode} +% 变量 \cs{l_@@_fn_style_tl} 保存的类型未知时,默认使用 \opt{plain} +% 类型。 +% \begin{macrocode} + { \int_use:N #1 } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{整体样式} +% +% \begin{macro}[int]{\@makefntext} +% \changes{v0.7}{2018/01/18}{简化实现,兼容 \pkg{fancyvrb} 宏包。 +% 不再使用悬挂缩进。} +% 重定义内部脚注文字命令,使脚注编号不使用上标,宽度为 \SI{1.5}{em}。 +% 见 \url{http://tex.stackexchange.com/q/19844} 和 +% \url{https://www.zhihu.com/question/53030087}。 +% \begin{macrocode} +\cs_set:Npn \@makefntext #1 + { + \mode_leave_vertical: + \hbox_to_wd:nn { 1.5 em } { \@thefnmark \hfil } + #1 + } +% \end{macrocode} +% \end{macro} +% +% \subsection{定理环境} +% +% \changes{v0.3}{2017/05/07}{新增定理环境。} +% +% \begin{variable}{\c_@@_thm_style_plain_clist, +% \c_@@_thm_style_break_clist} +% 保存 \opt{plain}、\opt{break} 两种类型的定理样式名称。 +% \begin{macrocode} +\clist_const:Nn \c_@@_thm_style_plain_clist + { plain, margin, change } +\clist_const:Nn \c_@@_thm_style_break_clist + { break, marginbreak, changebreak } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_thm_style_tl, +% \l_@@_thm_header_font_tl, +% \l_@@_thm_body_font_tl, +% \l_@@_thm_qed_tl, +% \l_@@_thm_counter_tl} +% 定理所需的一些字段。 +% \begin{macrocode} +\tl_new:N \l_@@_thm_style_tl +\tl_new:N \l_@@_thm_header_font_tl +\tl_new:N \l_@@_thm_body_font_tl +\tl_new:N \l_@@_thm_qed_tl +\tl_new:N \l_@@_thm_counter_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{theorem/style, +% theorem/header-font, +% theorem/body-font, +% theorem/qed, +% theorem/counter} +% 定义 |fdu/theorem| 键值类。 +% \begin{macrocode} +\keys_define:nn { fdu / theorem } + { + style .tl_set:N = \l_@@_thm_style_tl, + header-font .tl_set:N = \l_@@_thm_header_font_tl, + body-font .tl_set:N = \l_@@_thm_body_font_tl, + qed .tl_set:N = \l_@@_thm_qed_tl, + counter .tl_set:N = \l_@@_thm_counter_tl + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_thm_ntheorem_style:n,\@@_thm_ntheorem_new:w} +% 拷贝 \pkg{ntheorem} 命令。 +% \begin{macrocode} +\cs_new_eq:NN \@@_thm_ntheorem_style:n \theoremstyle +\cs_new_eq:NN \@@_thm_ntheorem_new:w \newtheorem +% \end{macrocode} +% \end{macro} +% +% \changes{v0.7}{2017/12/12}{原 \cs{fdunewtheorem} 命令更名为 +% \cs{new\-the\-orem}。} +% +% \begin{macro}{\newtheorem} +% 定义新的定理环境。 +% \begin{macrocode} +\RenewDocumentCommand \newtheorem { s o m m } + { +% \end{macrocode} +% 默认情况下,由 \cs{newtheorem*} 创建的定理其证毕符号为 \cs{QED}, +% 而由 \cs{new\-the\-orem} 创建的则不带证毕符号。符号 \cs{QED} 由 +% \pkg{unicode-math} 宏包提供。 +% \begin{macrocode} + \IfBooleanTF {#1} + { \tl_set:Nn \l_@@_thm_qed_tl { \ensuremath { \QED } } } + { \tl_set:Nn \l_@@_thm_qed_tl { } } +% \end{macrocode} +% 设置默认样式为 \opt{plain}。 +% \begin{macrocode} +% TODO: (2017/12/07) move to interface + \tl_set:Nn \l_@@_thm_style_tl { plain } +% \end{macrocode} +% 处理可选参数。利用 |fdu/theorem| 键值对设置,并按此修改证毕符号、 +% 定理头字体和定理正文字体。 +% \begin{macrocode} + \IfValueT {#2} { \keys_set:nn { fdu / theorem } {#2} } + \fdu_thm_set_header_font:V \l_@@_thm_header_font_tl + \fdu_thm_set_body_font:V \l_@@_thm_body_font_tl + \fdu_thm_set_qed:V \l_@@_thm_qed_tl +% \end{macrocode} +% \cs{newtheorem} 负责创建编号定理,而 \cs{newtheorem*} +% 则负责创建无编号定理。以下分这两种情况处理。 +% \begin{macrocode} + \IfBooleanTF {#1} + { +% \end{macrocode} +% 带 |*| 的版本原则上只接受 \opt{plain} 和 \opt{break} 两种样式, +% 其余样式将被转换成这两者其中之一。 +% \begin{macrocode} + \clist_if_in:nVF { plain, break } \l_@@_thm_style_tl + { + \clist_if_in:NVTF + \c_@@_thm_style_plain_clist \l_@@_thm_style_tl + { \@@_thm_redefine_style:n { plain } } + { + \clist_if_in:NVTF + \c_@@_thm_style_break_clist \l_@@_thm_style_tl + { \@@_thm_redefine_style:n { break } } + { + \@@_error:nx { unknown-theorem-style } + { \l_@@_thm_style_tl } + } + } + } +% \end{macrocode} +% \pkg{ntheorem} 宏包提供的无编号定理带有 |nonumber| 前缀, +% 这里将其加上。 +% \begin{macrocode} + \tl_put_left:Nn \l_@@_thm_style_tl { nonumber } + \fdu_thm_new_no_number:Vxx \l_@@_thm_style_tl {#3} {#4} + } + { +% \end{macrocode} +% 不带 |*| 的版本支持不含“|nonumber|”的所有定理样式。 +% \begin{macrocode} + \clist_clear:N \l_@@_tmpa_clist + \clist_concat:NNN \l_@@_tmpa_clist + \c_@@_thm_style_plain_clist \c_@@_thm_style_break_clist + \clist_if_in:NVF \l_@@_tmpa_clist \l_@@_thm_style_tl + { + \@@_error:nx { unknown-theorem-style } + { \l_@@_thm_style_tl } + } + \fdu_thm_new:VVxx \l_@@_thm_style_tl \l_@@_thm_counter_tl + {#3} {#4} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_thm_redefine_style:n} +% 重定义定理样式,并给出警告。 +% \begin{macrocode} +\cs_new:Npn \@@_thm_redefine_style:n #1 + { + \@@_warning:nxx { redefine-theorem-style } + {#1} { \l_@@_thm_style_tl } + \tl_set:Nn \l_@@_thm_style_tl {#1} + } +% \end{macrocode} +% \end{macro} +% +% 提示信息。 +% \begin{macrocode} +\@@_msg_new:nn { redefine-theorem-style } + { Theorem~ style~ "#2"~ will~ be~ redefined~ as~ "#1". } +\@@_msg_new:nn { unknown-theorem-style } + { Theorem~ style~ "#1"~ is~ unknown. } +% \end{macrocode} +% +% \begin{macro}{\fdu_thm_new:nnnn,\fdu_thm_new:VVxx} +% 带编号的定理环境。 +% \begin{arguments} +% \item 样式 +% \item 计数器 +% \item 定理环境名称 +% \item 定理头文字 +% \end{arguments} +% \begin{macrocode} +\cs_new:Npn \fdu_thm_new:nnnn #1#2#3#4 + { + \@@_thm_ntheorem_style:n {#1} + \@@_thm_ntheorem_new:w {#3} {#4} [#2] + } +\cs_generate_variant:Nn \fdu_thm_new:nnnn { VVxx } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fdu_thm_new_no_number:nnn, +% \fdu_thm_new_no_number:Vxx} +% 不带编号的定理环境。 +% \begin{arguments} +% \item 样式 +% \item 定理环境名称 +% \item 定理头文字 +% \end{arguments} +% \begin{macrocode} +\cs_new:Npn \fdu_thm_new_no_number:nnn #1#2#3 + { + \@@_thm_ntheorem_style:n {#1} + \@@_thm_ntheorem_new:w {#2} {#3} + } +\cs_generate_variant:Nn \fdu_thm_new_no_number:nnn { Vxx } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fdu_thm_set_qed:n, +% \fdu_thm_set_header_font:n, +% \fdu_thm_set_body_font:n, +% \fdu_thm_set_qed:V, +% \fdu_thm_set_header_font:V, +% \fdu_thm_set_body_font:V} +% 封装 \pkg{ntheorem} 宏包提供的若干命令,分别用以设置证毕符号、 +% 定理头字体和定理正文字体。 +% \begin{macrocode} +\cs_new:Npn \fdu_thm_set_qed:n #1 { \theoremsymbol {#1} } +\cs_new:Npn \fdu_thm_set_header_font:n #1 { \theoremheaderfont {#1} } +\cs_new:Npn \fdu_thm_set_body_font:n #1 { \theorembodyfont {#1} } +\cs_generate_variant:Nn \fdu_thm_set_qed:n { V } +\cs_generate_variant:Nn \fdu_thm_set_header_font:n { V } +\cs_generate_variant:Nn \fdu_thm_set_body_font:n { V } +% \end{macrocode} +% \end{macro} +% +% \subsection{图表绘制;浮动体} +% +% \changes{v0.3}{2017/07/09}{支持浮动体。} +% +% 分别设置浮动体 \env{figure} 和 \env{table} 的标题样式。 +% \begin{macrocode} +\captionsetup [ figure ] + { + font = small, + labelsep = quad + } +\captionsetup [ table ] + { + font = { small, sf }, + labelsep = quad + } +% \end{macrocode} +% +% \begin{macro}{\thefigure,\thetable} +% \changes{v0.7}{2018/01/17}{改为可完全展开的命令。} +% 重定义图表编号。 +% \begin{macrocode} +\cs_set:Npn \thefigure + { \@@_arabic:n { chapter } - \@@_arabic:n { figure } } +\cs_set:Npn \thetable + { \@@_arabic:n { chapter } - \@@_arabic:n { table } } +% \end{macrocode} +% \end{macro} +% +% \subsection{封面} +% +% \subsubsection{信息录入} +% +% \begin{variable}{\l_@@_info_title_tl, +% \l_@@_info_date_tl, +% \l_@@_info_author_tl, +% \l_@@_info_supervisor_tl, +% \l_@@_info_department_tl, +% \l_@@_info_major_tl, +% \l_@@_info_student_id_tl, +% \l_@@_info_school_id_tl, +% \l_@@_info_clc_tl, +% \l_@@_info_instructors_clist, +% \l_@@_info_keywords_clist} +% 封面所需的一些字段。 +% \begin{macrocode} +\clist_map_inline:nn + { + title, date, author, supervisor, department, major, student_id, + school_id, clc + } + { \tl_new:c { l_@@_info_ #1 _tl } } +\clist_new:N \l_@@_info_instructors_clist +\clist_new:N \l_@@_info_keywords_clist +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_info_title_en_tl, +% \l_@@_info_author_en_tl, +% \l_@@_info_supervisor_en_tl, +% \l_@@_info_department_en_tl, +% \l_@@_info_major_en_tl, +% \l_@@_info_keywords_en_clist} +% 对应的英文字段。 +% \begin{macrocode} +\clist_map_inline:nn + { title, author, supervisor, department, major } + { \tl_new:c { l_@@_info_ #1 _en_tl } } +\clist_new:N \l_@@_info_keywords_en_clist +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_info_degree_type_int} +% 学位类型。1 为学术学位,2 为专业学位。 +% \begin{macrocode} +\int_new:N \l_@@_info_degree_type_int +% \end{macrocode} +% \end{variable} +% +% 定义 |fdu/info| 键值类。 +% \begin{macrocode} +\keys_define:nn { fdu / info } + { +% \end{macrocode} +% +% \changes{v0.7}{2018/02/01}{新增 \opt{info/degree} 选项。} +% +% \begin{macro}{info/degree} +% 学位类型。只对硕士论文有效。 +% \begin{macrocode} + degree .choices:nn = + { academic, professional } + { \int_set_eq:NN \l_@@_info_degree_type_int \l_keys_choice_int }, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/title,info/title*} +% 论文题目。以下带星号的项目均表示相应的英文字段。 +% \begin{macrocode} + title .tl_set:N = \l_@@_info_title_tl, + title* .tl_set:N = \l_@@_info_title_en_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/date} +% 论文完成日期。 +% \begin{macrocode} + date .tl_set:N = \l_@@_info_date_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/author,info/author*} +% 作者姓名。 +% \begin{macrocode} + author .tl_set:N = \l_@@_info_author_tl, + author* .tl_set:N = \l_@@_info_author_en_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/supervisor,info/supervisor*} +% 导师姓名。 +% \begin{macrocode} + supervisor .tl_set:N = \l_@@_info_supervisor_tl, +% supervisor* .tl_set:N = \l_@@_info_supervisor_en_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/instructors} +% 指导小组成员。 +% \begin{macrocode} + instructors .clist_set:N = \l_@@_info_instructors_clist, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/department,info/department*} +% 院系。 +% \begin{macrocode} + department .tl_set:N = \l_@@_info_department_tl, +% department* .tl_set:N = \l_@@_info_department_en_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/major,info/major*} +% 专业。 +% \begin{macrocode} + major .tl_set:N = \l_@@_info_major_tl, +% major* .tl_set:N = \l_@@_info_major_en_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/student-id} +% 学号。 +% \begin{macrocode} + student-id .tl_set:N = \l_@@_info_student_id_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/school-id} +% 学校代码。 +% \begin{macrocode} + school-id .tl_set:N = \l_@@_info_school_id_tl, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/keywords,info/keywords*} +% 论文关键字。 +% \begin{macrocode} + keywords .clist_set:N = \l_@@_info_keywords_clist, + keywords* .clist_set:N = \l_@@_info_keywords_en_clist, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/clc} +% 中图分类号。 +% \begin{macrocode} + clc .tl_set:N = \l_@@_info_clc_tl + } +% \end{macrocode} +% \end{macro} +% +% \changes{v0.4}{2017/08/10}{新增 \opt{style/logo} 与 +% \opt{style/logo-size} 选项。} +% +% \begin{variable}{\l_@@_cover_logo_tl,\l_@@_cover_logo_size_clist} +% \begin{macrocode} +\tl_new:N \l_@@_cover_logo_tl +\clist_new:N \l_@@_cover_logo_size_clist +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{style/logo,style/logo-size} +% 校名图片的文件名和尺寸。 +% \begin{macrocode} +\keys_define:nn { fdu / style } + { + logo .tl_set:N = \l_@@_cover_logo_tl, + logo-size .clist_set:N = \l_@@_cover_logo_size_clist + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{密级} +% +% \changes{v0.3}{2017/07/04}{新增 \opt{info/secret-level} 与 +% \opt{info/secret-year} 选项。} +% +% \begin{variable}{\l_@@_secret_bool} +% 是否显示密级。 +% \begin{macrocode} +\bool_new:N \l_@@_secret_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_info_secret_level_tl} +% 保存当前的密级。 +% \begin{macrocode} +\tl_new:N \l_@@_info_secret_level_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macrocode} +\keys_define:nn { fdu / info } + { +% \end{macrocode} +% +% \begin{macro}{info/secret-level} +% \changes{v0.6}{2017/11/11}{不再依赖 XITS-Math 字体。} +% 密级。\opt{none} 表示不涉密,\opt{i}、\opt{ii}、\opt{iii} 分别为 +% 秘密、机密、绝密。 +% \begin{macrocode} + secret-level .choices:nn = + { none, i, ii, iii } + { + \int_compare:nTF + { \l_keys_choice_int >= 2 } + { + \bool_set_true:N \l_@@_secret_bool + \tl_set:Nn \l_@@_info_secret_level_tl + { + \clist_item:Nn \c_@@_secret_clist + { \l_keys_choice_int - 1 } + } + } + { \bool_set_false:N \l_@@_secret_bool } + }, + secret-level .value_required:n = true, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{info/secret-year} +% 保密年限。 +% \begin{macrocode} + secret-year .tl_set:N = \l_@@_info_secret_year_tl + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{定义内部函数} +% +% \begin{macro}{\@@_spread_box:nn} +% 分散对齐的水平盒子。 +% \begin{arguments} +% \item 宽度 +% \item 内容 +% \end{arguments} +% 利用 \cs{tl_map_inline:nn} 在字符间插入 \tn{hfil};紧随其后的 +% \tn{unskip} 将会去掉最后一个 \tn{hfil}。见 +% \url{http://tex.stackexchange.com/q/169689}。|#2| 需要完全展开以 +% 避免 underfull 警告。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_spread_box:nn #1#2 + { + \mode_leave_vertical: + \hbox_to_wd:nn {#1} + { \tl_map_inline:xn {#2} { ##1 \hfil } \unskip } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_center_box:nn,\@@_center_box:Vn} +% 居中对齐的水平盒子。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_center_box:nn #1#2 + { + \mode_leave_vertical: + \hbox_to_wd:nn {#1} { \hfil #2 \hfil } + } +\cs_generate_variant:Nn \@@_center_box:nn { Vn } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fixed_width_box:nn} +% 限宽盒子(允许换行)。 +% \begin{macrocode} +\cs_new:Npn \@@_fixed_width_box:nn #1#2 + { \parbox {#1} {#2} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fixed_width_center_box:nn} +% 居中对齐的限宽盒子(允许换行)。 +% \begin{macrocode} +\cs_new:Npn \@@_fixed_width_center_box:nn #1#2 + { \parbox {#1} { \centering #2 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_get_text_width:Nn,\@@_get_text_width:NV} +% 获取文本宽度,并存入 |dim| 型变量。 +% \begin{arguments} +% \item |dim| 型变量 +% \item 内容 +% \end{arguments} +% \begin{macrocode} +\cs_new:Npn \@@_get_text_width:Nn #1#2 + { + \hbox_set:Nn \l_@@_tmpa_box {#2} + \dim_set:Nn #1 { \box_wd:N \l_@@_tmpa_box } + } +\cs_generate_variant:Nn \@@_get_text_width:Nn { NV } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_get_max_text_width:NN} +% \changes{v0.6}{2017/11/24}{移除不必要的字号设置。} +% 获取多个文本中的最大宽度,并存入 |dim| 型变量。 +% \begin{arguments} +% \item |dim| 型变量 +% \item 文本 |clist| +% \end{arguments} +% 当 \cs{l_@@_tmpa_clist} 非空时,弹出最后一个元素 +% 赋给 \cs{l_@@_tmpa_tl},获取其长度后与 |#1| 进行比较, +% 二者中较大的那一个将成为 |#1| 的新值。 +% 不断循环,直至 \cs{l_@@_tmpa_clist} 为空。 +% \begin{macrocode} +\cs_new:Npn \@@_get_max_text_width:NN #1#2 + { +% \end{macrocode} +% 这里用 |group| 确保局部变量不会被污染。 +% \begin{macrocode} + \group_begin: + \clist_set_eq:NN \l_@@_tmpa_clist #2 + \bool_until_do:nn { \clist_if_empty_p:N \l_@@_tmpa_clist } + { + \clist_pop:NN \l_@@_tmpa_clist \l_@@_tmpa_tl + \@@_get_text_width:NV \l_@@_tmpa_dim \l_@@_tmpa_tl + \dim_gset:Nn #1 { \dim_max:nn {#1} { \l_@@_tmpa_dim } } + } + \group_end: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_blank_underline:n} +% \changes{v0.4}{2017/08/14}{改用 \tn{rule} 绘制下划线,不再依赖 +% \pkg{ulem} 宏包。} +% 下划线占位符。|#1|: 长度。 +% \begin{macrocode} +\cs_new:Npn \@@_blank_underline:n #1 + { \rule [ -0.5 ex ] {#1} { 0.4 pt } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_line_spread:N,\@@_line_spread:n} +% 设置行距。|#1|: 行距倍数 |fp| 变量。 +% \begin{macrocode} +\cs_new:Npn \@@_line_spread:N #1 + { \linespread { \fp_use:N #1 } \selectfont } +\cs_new:Npn \@@_line_spread:n #1 + { \linespread {#1} \selectfont } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{封面各部件} +% +% \changes{v0.5}{2017/09/19}{使用 \pkg{expl3} 以及内部函数改写 +% 封面,减少对 \LaTeXe{} 的依赖。} +% +% \begin{macro}{\@@_cover_id:,\@@_cover_id_aux:n} +% 右上角的学校代码和学号。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_cover_id: + { + \@@_fixed_width_box:nn { 120 pt } + { + \bool_if:NT \l_@@_secret_bool + { + \group_begin: + \sffamily + \@@_cover_id_aux:n { secret_level } + \c_@@_name_secret_star_tl + \l_@@_info_secret_year_tl + \group_end: + \par + } + \@@_cover_id_aux:n { school_id } \par + \@@_cover_id_aux:n { student_id } + } +% \end{macrocode} +% 插入一个宽度为负的水平盒子以减少右侧边距。 +% \begin{macrocode} + \hbox_to_wd:nn { -24 pt } { } + } +\cs_new:Npn \@@_cover_id_aux:n #1 + { + \tl_use:c { c_@@_name_ #1 _tl } + \c_@@_fullwidth_colon_tl + \tl_use:c { l_@@_info_ #1 _tl } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_cover_logo:} +% 插入校名图片。根据参数 \opt{width} 和 \opt{height} 是否为空依次 +% 判断。\cs{l_@@_cover_logo_size_clist} 中超过两个的参数将被忽略。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_cover_logo: + { + \clist_pop:NN \l_@@_cover_logo_size_clist \l_@@_tmpa_tl + \clist_pop:NNTF \l_@@_cover_logo_size_clist \l_@@_tmpb_tl + { + \tl_if_empty:NTF \l_@@_tmpa_tl + { \includegraphics [ height = \l_@@_tmpb_tl ] } + { + \includegraphics + [ width = \l_@@_tmpa_tl, height = \l_@@_tmpb_tl ] + } + } + { \includegraphics [ width = \l_@@_tmpa_tl ] } + { \l_@@_cover_logo_tl } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_cover_type:} +% 论文类型。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_cover_type: + { + \tl_set:Nx \l_@@_tmpa_tl + { + \clist_item:Nn \c_@@_thesis_type_clist + { \g_@@_thesis_type_int } + } + \@@_spread_box:nn { 0.45 \textwidth } { \l_@@_tmpa_tl } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_cover_degree:} +% 学位类型。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_cover_degree: + { + \int_compare:nNnT \g_@@_thesis_type_int = \c_two + { + \tl_set:Nx \l_@@_tmpa_tl + { + \clist_item:Nn \c_@@_degree_type_clist + { \l_@@_info_degree_type_int } + } + \c_@@_fullwidth_left_paren_tl + \l_@@_tmpa_tl + \c_@@_fullwidth_right_paren_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_cover_info:} +% 信息栏。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_cover_info: + { + \begin{minipage} [ c ] { \textwidth } + \centering \zihao { 4 } +% \end{macrocode} +% 读取左侧名称字段。 +% \begin{macrocode} + \clist_set:Nx \l_@@_tmpa_clist + { + \c_@@_name_department_tl, + \c_@@_name_major_tl, + \c_@@_name_author_tl, + \c_@@_name_supervisor_tl, + \c_@@_name_date_tl, + } +% \end{macrocode} +% 设置信息栏右侧宽度。读取各字段,并将最宽者的宽度赋给 +% \cs{l_@@_tmpb_dim}。 +% \begin{macrocode} + \clist_set:Nx \l_@@_tmpb_clist + { + { \l_@@_info_department_tl }, + { \l_@@_info_major_tl }, + { \l_@@_info_author_tl }, + { \l_@@_info_supervisor_tl }, + { \l_@@_info_date_tl } + } + \@@_get_max_text_width:NN \l_@@_tmpb_dim \l_@@_tmpb_clist +% \end{macrocode} +% 用循环输出各字段。 +% \begin{macrocode} + \bool_until_do:nn + { \clist_if_empty_p:N \l_@@_tmpa_clist } + { + \clist_pop:NN \l_@@_tmpa_clist \l_@@_tmpa_tl + \clist_pop:NN \l_@@_tmpb_clist \l_@@_tmpb_tl + \@@_spread_box:nn { 6 em } { \l_@@_tmpa_tl } + \c_@@_fullwidth_colon_tl + \@@_center_box:Vn \l_@@_tmpb_dim { \l_@@_tmpb_tl } + \skip_vertical:n { 1 ex } + } + \end{minipage} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_cover_signature:N} +% 签名行。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_cover_signature:N #1 + { + \clist_map_inline:Nn #1 + { + ##1 \c_@@_fullwidth_colon_tl + \@@_blank_underline:n { 6 em } + \@@_quad: + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{封面模板} +% +% \changes{v0.7}{2018/02/27}{使用 \pkg{xtemplate} 重构封面布局。} +% +% 声明封面对象。不需要带参数。 +% \begin{macrocode} +%<@@=fdu_cover> +\DeclareObjectType { fdu / cover } { \c_zero } +% \end{macrocode} +% +% \begin{macro}{\DeclareCoverTemplate,\fdu_cover_declare_template:nn} +% 声明封面模板。 +% \begin{arguments} +% \item 模板名称 +% \item 封面部件列表,以逗号分隔 +% \end{arguments} +% \begin{macrocode} +\NewDocumentCommand \DeclareCoverTemplate { m m } + { \fdu_cover_declare_template:nn {#1} {#2} } +\cs_new_protected:Npn \fdu_cover_declare_template:nn #1#2 + { + \tl_set:Nn \l_@@_template_tl {#1} +% \end{macrocode} +% 构建模板接口。 +% \begin{macrocode} + \@@_declare_template_interface:nx {#1} + { + format : tokenlist, + top-skip : skip, + bottom-skip : skip, + \clist_map_function:nN {#2} \@@_key_type:n + } +% \end{macrocode} +% 声明所用变量。 +% \begin{macrocode} + \tl_new:c { l_@@ / #1 / format_tl } + \skip_new:c { l_@@ / #1 / top_skip } + \skip_new:c { l_@@ / #1 / bottom_skip } + \clist_map_inline:nn {#2} + { + \tl_new:c { l_@@ / #1 / ##1 / content_tl } + \tl_new:c { l_@@ / #1 / ##1 / format_tl } + \skip_new:c { l_@@ / #1 / ##1 / bottom_skip } + } +% \end{macrocode} +% 声明模板代码。 +% \begin{macrocode} + \@@_declare_template_code:nxn {#1} + { + format = \exp_not:c { l_@@ / #1 / format_tl }, + top-skip = \use:c { l_@@ / #1 / top_skip }, + bottom-skip = \use:c { l_@@ / #1 / bottom_skip }, + \clist_map_function:nN {#2} \@@_key_binding:n + } + { + \AssignTemplateKeys + \tl_use:c { l_@@ / #1 / format_tl } + \__fdu_vspace:c { l_@@ / #1 / top_skip } + \clist_map_inline:nn {#2} + { + \use:c { @@ / #1 / ####1 / align:n } + { + \tl_use:c { l_@@ / #1 / ####1 / format_tl } + \tl_use:c { l_@@ / #1 / ####1 / content_tl } + \par + } + \__fdu_vspace:c { l_@@ / #1 / ####1 / bottom_skip } + } + \__fdu_vspace:c { l_@@ / #1 / bottom_skip } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{variable}{\l_@@_template_tl} +% 保存模板名称。 +% \begin{macrocode} +\tl_new:N \l_@@_template_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_declare_template_interface:nn, +% \@@_declare_template_code:nnn, +% \@@_declare_template_interface:nx, +% \@@_declare_template_code:nxn} +% 为了展开的方便,这里需要封装 \pkg{xtemplate} 的一些函数。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_template_interface:nn #1#2 + { \DeclareTemplateInterface { fdu / cover } {#1} { \c_zero } {#2} } +\cs_new_protected:Npn \@@_declare_template_code:nnn #1#2#3 + { \DeclareTemplateCode { fdu / cover } {#1} { \c_zero } {#2} {#3} } +\cs_generate_variant:Nn \@@_declare_template_interface:nn { nx } +\cs_generate_variant:Nn \@@_declare_template_code:nnn { nxn } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_key_type:n} +% \begin{macrocode} +\cs_new:Npn \@@_key_type:n #1 + { + #1 / content : tokenlist, + #1 / format : tokenlist, + #1 / bottom-skip : skip, + #1 / align : choice { left, right, center, normal } = normal, + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_key_binding:n} +% \begin{macrocode} +\cs_new:Npn \@@_key_binding:n #1 + { + #1 / content = + \exp_not:c + { l_@@ / \l_@@_template_tl / #1 / content_tl }, + #1 / format = + \exp_not:c + { l_@@ / \l_@@_template_tl / #1 / format_tl }, + #1 / bottom-skip = + \exp_not:c + { l_@@ / \l_@@_template_tl / #1 / bottom_skip }, + #1 / align = + { + left = + \exp_not:N \cs_set_protected:cpn + { @@ / \l_@@_template_tl / #1 / align:n } + \exp_not:n {##1} + { + \exp_not:n + { + \group_begin: + \flushleft ##1 \endflushleft + \group_end: + } + }, + right = + \exp_not:N \cs_set_protected:cpn + { @@ / \l_@@_template_tl / #1 / align:n } + \exp_not:n {##1} + { + \exp_not:n + { + \group_begin: + \flushright ##1 \endflushright + \group_end: + } + }, + center = + \exp_not:N \cs_set_protected:cpn + { @@ / \l_@@_template_tl / #1 / align:n } + \exp_not:n {##1} + { + \exp_not:n + { + \group_begin: + \center ##1 \endcenter + \group_end: + } + }, + normal = + \exp_not:N \cs_set_protected:cpn + { @@ / \l_@@_template_tl / #1 / align:n } + \exp_not:n {##1} + { \exp_not:n { \group_begin: ##1 \group_end: } } + }, + } +%<@@=fdu> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{绘制封面} +% +% \begin{macro}{\makecoveri,\makecoverii,\makecoveriii} +% 使用实例(instance)构建封一、封二、封三。 +% \begin{macrocode} +\NewDocumentCommand \makecoveri { } + { + \thispagestyle { empty } + \UseInstance { fdu / cover } { cover-i-default } + } +\NewDocumentCommand \makecoverii { } + { + \thispagestyle { empty } + \UseInstance { fdu / cover } { cover-ii-default } + } +\NewDocumentCommand \makecoveriii { } + { + \cleardoublepage + \thispagestyle { empty } + \UseInstance { fdu / cover } { cover-iii-default } + } +% \end{macrocode} +% \end{macro} +% +% 声明各封面模板组成部分。 +% \begin{macrocode} +\DeclareCoverTemplate { cover-i } + { id, logo, type, degree, title, title-en, info } +\DeclareCoverTemplate { cover-ii } { title, name-list } +\DeclareCoverTemplate { cover-iii } + { + originality-decl-name, + originality-decl-text, + originality-decl-sig, + authorization-decl-name, + authorization-decl-text, + authorization-decl-sig + } +% \end{macrocode} +% +% 定义封面的具体配置参数。 +% \begin{macrocode} +\DeclareInstance { fdu / cover } { cover-i-default } { cover-i } + { +%<class-en> format = +%<class-en> \@@_line_spread:N \c_@@_line_spread_fp, + bottom-skip = 0 pt plus 1.5 fill, + id / content = \@@_cover_id:, + logo / content = \@@_cover_logo:, + type / content = \@@_cover_type:, + degree / content = \@@_cover_degree:, + title / content = + \@@_fixed_width_center_box:nn + { 0.9 \textwidth } { \l_@@_info_title_tl }, + title-en / content = + \@@_fixed_width_center_box:nn + { 0.9 \textwidth } { \l_@@_info_title_en_tl }, + info / content = \@@_cover_info:, + id / format = \zihao { -5 }, + type / format = \zihao { 2 }, + degree / format = \zihao { 4 }, + title / format = \zihao { -2 } \sffamily, + title-en / format = + \@@_line_spread:n { 1.2 } \zihao { 4 } \bfseries, + id / bottom-skip = 0 pt plus 1.6 fill, + logo / bottom-skip = 0 pt plus 0.3 fill, + type / bottom-skip = -18 pt, + degree / bottom-skip = 0 pt plus 0.8 fill, + title-en / bottom-skip = 0 pt plus 2.5 fill, + id / align = right, + logo / align = center, + type / align = center, + degree / align = center, + title / align = center, + title-en / align = center, + info / align = center, + } +\DeclareInstance { fdu / cover } { cover-ii-default } { cover-ii } + { +%<class-en> format = +%<class-en> \@@_line_spread:N \c_@@_line_spread_fp, + title / content = + \@@_spread_box:nn { 7 em } { \c_@@_name_instructors_tl }, + name-list / content = + \clist_use:Nn \l_@@_info_instructors_clist { \par }, + title / format = \zihao { 2 } \sffamily, + name-list / format = \large, + title / align = center, + name-list / align = center, + } +\DeclareInstance { fdu / cover } { cover-iii-default } { cover-iii } + { + format = +%<class> \@@_line_spread:n { 1.8 }, +%<class-en> \@@_line_spread:n { 1.8 } \dim_set:Nn \parindent { 2 \ccwd }, + top-skip = 0 pt plus 0.2 fill, + bottom-skip = 0 pt plus 2.5 fill, + originality-decl-name / content = \c_@@_name_orig_decl_tl, + originality-decl-text / content = \c_@@_orig_decl_text_tl, + originality-decl-sig / content = + \@@_cover_signature:N \c_@@_orig_decl_sign_clist, + authorization-decl-name / content = \c_@@_name_auth_decl_tl, + authorization-decl-text / content = \c_@@_auth_decl_text_tl, + authorization-decl-sig / content = + \@@_cover_signature:N \c_@@_auth_decl_sign_clist, + originality-decl-name / format = + \@@_line_spread:n { 1.2 } \zihao { -2 } \sffamily, + authorization-decl-name / format = + \@@_line_spread:n { 1.2 } \zihao { -2 } \sffamily, + originality-decl-name / bottom-skip = 0.4 cm, + originality-decl-text / bottom-skip = 0.4 cm, + originality-decl-sig / bottom-skip = 0 pt plus 2.5 fill, + authorization-decl-name / bottom-skip = 0.4 cm, + authorization-decl-text / bottom-skip = 0.4 cm, + originality-decl-name / align = center, + originality-decl-sig / align = right, + authorization-decl-name / align = center, + authorization-decl-sig / align = right, + } +% \end{macrocode} +% +% \begin{macro}{style/auto-make-cover} +% \begin{variable}{\l_@@_auto_make_cover_bool} +% 是否自动生成封面。 +% \begin{macrocode} +\bool_new:N \l_@@_auto_make_cover_bool +\keys_define:nn { fdu / style } + { + auto-make-cover .bool_set:N = \l_@@_auto_make_cover_bool, + auto-make-cover .default:n = true + } +% \end{macrocode} +% \end{variable} +% \end{macro} +% +% 在 \env{document} 开始位置添加封面以及指导小组成员名单。 +% \begin{macrocode} +\AtBeginDocument + { + \bool_if:NT \l_@@_auto_make_cover_bool + { + \begin{titlepage} + \makecoveri \newpage \makecoverii + \end{titlepage} + } + } +% \end{macrocode} +% +% 在 \env{document} 结束位置添加声明页。 +% \begin{macrocode} +\AtEndDocument + { \bool_if:NT \l_@@_auto_make_cover_bool { \makecoveriii } } +% \end{macrocode} +% +% \subsection{目录} +% +% \begin{variable}{\@@_chapter_toc_format:,\@@_chapter_toc_en_format:} +% 目录中章标题的样式还要用在摘要、符号表中。因为摘要分中英文,所以这里 +% 需要分别定义其样式。 +% \begin{macrocode} +\tl_const:Nn \@@_chapter_toc_format: { \normalfont \sffamily } +\tl_const:Nn \@@_chapter_toc_en_format: { \bfseries } +% \end{macrocode} +% \end{variable} +% +% 设置目录标题。 +% \begin{macrocode} +\keys_set:nn { ctex } + { +%<class> contentsname = \c_@@_name_toc_tl, +%<class-en> contentsname = \c_@@_name_toc_en_tl, +% \end{macrocode} +% +% 设置目录中章节标题的样式。 +% \begin{macrocode} + chapter / tocline = + { +%<class> \@@_chapter_toc_format: +%<class-en> \@@_chapter_toc_en_format: + \CTEXnumberline {#1} #2 + }, + section / tocline = + { +%<class-en> \bfseries + \CTEXnumberline {#1} #2 + }, + subsection / tocline = + { +%<class> \fdu@kai + \CTEXnumberline {#1} #2 + } + } +% \end{macrocode} +% +% \begin{macro}{\tableofcontents} +% 修改 \tn{tableofcontents} 的定义,使得页眉正确显示。第二个参数中的 +% 代码来源于 \LaTeXe{} 标准文档类 \file{book.cls}。 +% \begin{macrocode} +\@@_patch_cmd:Nnn \tableofcontents + { + \chapter*{\contentsname + \@mkboth{% + \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}% + } + { + \chapter* { \contentsname } +%<class> \fdu_front_matter_header:n { \c_@@_name_toc_tl } +%<class-en> \fdu_front_matter_header:n { \c_@@_name_toc_en_tl } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@starttoc} +% 修改 \tn{@starttoc} 的定义以调整英文模板中的目录行距。 +% \begin{macrocode} +%<*class-en> +\@@_patch_cmd:Nnn \@starttoc + { \begingroup } + { + \begingroup + \@@_line_spread:N \c_@@_line_spread_fp + } +%</class-en> +% \end{macrocode} +% \end{macro} +% +% \subsection{摘要} +% +% \begin{environment}{abstract} +% \begin{environment}{abstract*} +% \changes{v0.7}{2018/03/05}{整理代码。} +% 摘要环境。在中文模板定义了中英文双语摘要,但在英文模板中则没有 +% 定义中文摘要。 +% \begin{macrocode} +\NewDocumentEnvironment { abstract } { } +%<class> { \@@_abstract_begin: } { \@@_abstract_end: } +%<class-en> { \@@_abstract_en_begin: } { \@@_abstract_en_end: } +%<*class> +\NewDocumentEnvironment { abstract* } { } + { \@@_abstract_en_begin: } { \@@_abstract_en_end: } +%</class> +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \begin{macro}{\@@_abstract_begin:,\@@_abstract_en_begin:} +% 摘要页需要修改页眉,并添加到目录。 +% \begin{macrocode} +%<*class> +\cs_new_protected:Npn \@@_abstract_begin: + { + \chapter* { \c_@@_name_abstract_tl } + \fdu_front_matter_header:n { \c_@@_name_abstract_tl } + \addcontentsline { toc } { chapter } + { + \@@_chapter_toc_format: + \c_@@_name_abstract_tl + } + } +%</class> +\cs_new_protected:Npn \@@_abstract_en_begin: + { + \chapter* { \c_@@_name_abstract_en_tl } + \fdu_front_matter_header:n { \c_@@_name_abstract_en_tl } + \addcontentsline { toc } { chapter } + { +%<class> \@@_chapter_toc_format: +%<class-en> \@@_chapter_toc_en_format: + \c_@@_name_abstract_en_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_abstract_end:,\@@_abstract_en_end:} +% 摘要正文完成后,输出关键字列表和中图分类号(CLC)。 +% \begin{macrocode} +%<*class> +\cs_new_protected:Npn \@@_abstract_end: + { + \@@_keywords_par: + \textsf { \c_@@_name_keywords_tl \c_@@_fullwidth_colon_tl } + \clist_use:Nn \l_@@_info_keywords_clist + { \c_@@_fullwidth_semicolon_tl } + \@@_clc_par: + \textsf { \c_@@_name_clc_tl \c_@@_fullwidth_colon_tl } + \l_@@_info_clc_tl + } +%</class> +\cs_new_protected:Npn \@@_abstract_en_end: + { + \@@_keywords_par: + \textbf { \c_@@_name_keywords_en_tl } \@@_quad: + \clist_use:Nn \l_@@_info_keywords_en_clist { \@@_quad: } + \@@_clc_par: + \textbf { \c_@@_name_clc_en_tl } \@@_quad: + \l_@@_info_clc_tl + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keywords_par:,\@@_clc_par:} +% 关键字列表前要空一行,使用悬挂缩进;中图分类号不缩进。 +% \begin{macrocode} +\cs_new:Npn \@@_keywords_par: + { + \par \mode_leave_vertical: \par + \noindent \hangindent = 4 em \hangafter = 1 + } +\cs_new:Npn \@@_clc_par: + { \par \noindent } +% \end{macrocode} +% \end{macro} +% +% \subsection{符号表} +% +% \begin{environment}{notation} +% \changes{v0.7}{2018/03/05}{整理代码。} +% 符号表环境,利用 \env{longtable} 封装。可选参数为表格列格式说明符。 +% \begin{macrocode} +\NewDocumentEnvironment { notation } { O { l p { 7.5 cm } } } + { + \@@_notation_begin: + \group_begin: + \@@_notation_long_table_setup: + \longtable {#1} + } + { + \endlongtable + \group_end: + } +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@@_notation_begin:} +% 与摘要类似,符号表页需要修改页眉,并添加到目录。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_notation_begin: + { +%<*class> + \chapter* { \c_@@_name_notation_tl } + \fdu_front_matter_header:n { \c_@@_name_notation_tl } + \addcontentsline { toc } { chapter } + { + \@@_chapter_toc_format: + \c_@@_name_notation_tl + } +%</class> +%<*class-en> + \chapter* { \c_@@_name_notation_en_tl } + \fdu_front_matter_header:n { \c_@@_name_notation_en_tl } + \addcontentsline { toc } { chapter } + { + \@@_chapter_toc_en_format: + \c_@@_name_notation_en_tl + } +%</class-en> + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_notation_long_table_setup:} +% 调整 \cs{LTpre} 和 \cs{LTpost},以删去 \env{longtable} 前后的空白。 +% 英文模板中还需要调整表格的行距。注意 \tn{arraystretch} 只是一个简单 +% 宏,不能使用 \cs{fp_set:Nn}。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_notation_long_table_setup: + { +%<class-en> \tl_set:Nn \arraystretch { 1.3 } + \dim_set_eq:NN \LTpre \c_zero_dim + \dim_set_eq:NN \LTpost \c_zero_dim + } +% \end{macrocode} +% \end{macro} +% +% \subsection{参考文献著录与引用} +% +% \changes{v0.6}{2017/10/27}{支持 \BibTeX{},以实现参考文献的著录 +% 与引用。} +% \changes{v0.7}{2018/01/25}{支持 \biber{} 与 \pkg{biblatex}。} +% +% \begin{variable}{\l_@@_bibtex_bool} +% 是否使用 \BibTeX{} 作为参考文献处理程序。若为否,则使用 +% \pkg{biblatex}/\biber{}。 +% \begin{macrocode} +\bool_new:N \l_@@_bibtex_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_bib_style_tl,\l_@@_bib_gb_style_tl, +% \l_@@_cite_style_tl} +% 保存参考文献及引用样式。 +% \begin{macrocode} +\tl_new:N \l_@@_bib_style_tl +\tl_new:N \l_@@_bib_gb_style_tl +\tl_new:N \l_@@_cite_style_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_bib_resource_tl} +% 保存参考文献数据库列表。 +% \begin{macrocode} +\tl_new:N \l_@@_bib_resource_tl +% \end{macrocode} +% \end{variable} +% +% \changes{v0.6}{2017/10/28}{新增 \opt{style/bib-style} 选项。} +% \changes{v0.7}{2018/01/25}{新增 \opt{style/bib-backend}、 +% \opt{style/cite-style} 和 \opt{style/bib-resource} 选项。} +% +% \begin{macrocode} +\keys_define:nn { fdu / style } + { +% \end{macrocode} +% +% \begin{macro}{style/bib-backend} +% 参考文献后端。 +% \begin{macrocode} + bib-backend .choice:, + bib-backend .value_required:n = true, + bib-backend / bibtex .code:n = + { \bool_set_true:N \l_@@_bibtex_bool }, + bib-backend / biblatex .code:n = + { \bool_set_false:N \l_@@_bibtex_bool }, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{style/bib-style} +% 参考文献样式。 +% \begin{macrocode} + bib-style .choice:, + bib-style .value_required:n = true, + bib-style / numerical .code:n = + { + \tl_set:Nn \l_@@_bib_gb_style_tl { numerical } + \tl_clear:N \l_@@_bib_style_tl + }, + bib-style / author-year .code:n = + { + \tl_set:Nn \l_@@_bib_gb_style_tl { author-year } + \tl_clear:N \l_@@_bib_style_tl + }, + bib-style / unknown .code:n = + { \tl_set_eq:NN \l_@@_bib_style_tl \l_keys_value_tl }, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{style/cite-style} +% 引用样式。 +% \begin{macrocode} + cite-style .code:n = + { + \bool_if:NTF \l_@@_bibtex_bool + { \@@_warning:n { cite-style-not-available } } + { \tl_set:Nn \l_@@_cite_style_tl {#1} } + }, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{style/bib-resource} +% 参考文献数据源。 +% \begin{macrocode} + bib-resource .tl_set:N = \l_@@_bib_resource_tl + } +\@@_msg_new:nn { cite-style-not-available } + { Option~ "cite-style"~ is~ not~ available~ in~ BibTeX. } +% \end{macrocode} +% \end{macro} +% +% 为了保证导言区中的设置能起作用,\pkg{natbib} 或 \pkg{biblatex} 宏包 +% 均需要在导言区末尾载入(仍在 \pkg{hyperref} 之前)。 +% \begin{macrocode} +\ctex_at_end_preamble:n + { +% \end{macrocode} +% +% 调用 \pkg{natbib} 宏包并进行配置。 +% \begin{macrocode} + \bool_if:NTF \l_@@_bibtex_bool + { + \RequirePackage [ sort & compress ] { natbib } + \@@_bibtex_setup: +% \end{macrocode} +% +% \changes{v0.7}{2018/01/25}{统一使用 \cs{printbibliography} 命令 +% 生成参考文献列表。} +% +% \begin{macro}{\printbibliography} +% \BibTeX{} 下接口与 \pkg{biblatex} 统一。 +% \begin{macrocode} + \NewDocumentCommand \printbibliography { o } + { + \exp_args:NV \bibliography \l_@@_bib_resource_tl + \IfValueT {#1} + { \@@_warning:nn { invalid-option-in-bibtex } {#1} } + } + } +% \end{macrocode} +% \end{macro} +% +% 调用 \pkg{biblatex} 宏包,并载入参考文献数据库。 +% \cs{@@_biblatex_setup:} 依靠传入宏包选项,因此要放在 +% \tn{RequirePackage} 之前。 +% \begin{macrocode} + { + \@@_biblatex_setup: + \RequirePackage [ backend = biber, hyperref = manual, natbib ] + { biblatex } + \exp_args:NV \addbibresource \l_@@_bib_resource_tl + \@@_biblatex_allow_url_break: +% \end{macrocode} +% 英文模板需要重定义参考文献标题。 +% \begin{macrocode} +%<*class-en> + \exp_args:Nnx \DefineBibliographyStrings { english } + { bibliography = { \c_@@_name_bib_en_tl } } +%</class-en> + } + } +\@@_msg_new:nn { invalid-option-in-bibtex } + { Option(s)~ "#1"~ are~ invalid~ in~ BibTeX. } +% \end{macrocode} +% +% \begin{macro}{\@@_bibtex_setup:} +% \BibTeX{} 设置。 +% \begin{macrocode} +\cs_new:Npn \@@_bibtex_setup: + { + \tl_if_empty:NTF \l_@@_bib_style_tl + { + \tl_if_eq:VnTF \l_@@_bib_gb_style_tl { numerical } + { + \bibliographystyle { gbt7714-unsrt } + \@@_set_cite_style_numerical: + } + { + \tl_if_eq:VnT \l_@@_bib_gb_style_tl { author-year } + { + \bibliographystyle { gbt7714-plain } + \@@_set_cite_style_author_year: + \cs_set_eq:NN \cite \citep + } + } + } + { \exp_args:NV \bibliographystyle \l_@@_bib_style_tl } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_biblatex_setup:} +% \pkg{biblatex} 设置。 +% \begin{macrocode} +\cs_new:Npn \@@_biblatex_setup: + { +% \end{macrocode} +% 参考文献样式。 +% \begin{macrocode} + \tl_if_empty:NTF \l_@@_bib_style_tl + { + \tl_if_eq:VnTF \l_@@_bib_gb_style_tl { numerical } + { \PassOptionsToPackage { style = gb7714-2015 } } + { + \tl_if_eq:VnT \l_@@_bib_gb_style_tl { author-year } + { \PassOptionsToPackage { style = gb7714-2015ay } } + } + } + { \PassOptionsToPackage { style = \l_@@_bib_style_tl } } + { biblatex } +% \end{macrocode} +% 引用样式。 +% \begin{macrocode} + \tl_if_empty:NF \l_@@_cite_style_tl + { + \PassOptionsToPackage { citestyle = \l_@@_bib_style_tl } + { biblatex } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_biblatex_allow_url_break:} +% \pkg{biblatex} 下允许 URL 在字母、数字和一些特殊符号处断行。 +% \begin{macrocode} +\cs_new:Npn \@@_biblatex_allow_url_break: + { + \int_set_eq:NN \c@biburlucpenalty \c_one + \int_set_eq:NN \c@biburlnumpenalty \c_one + \int_set_eq:NN \c@biburllcpenalty \c_one + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_set_cite_style_numerical:} +% 顺序编码制下的引用样式。 +% \begin{macrocode} +\cs_new:Npn \@@_set_cite_style_numerical: + { + \NAT@numberstrue \NAT@supertrue + \cs_set:Npn \NAT@open { [ } + \cs_set:Npn \NAT@close { ] } + \cs_set:Npn \NAT@sep { ,~ } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_set_cite_style_author_year:} +% 著者—出版年制下的引用样式。 +% \begin{macrocode} +\cs_new:Npn \@@_set_cite_style_author_year: + { + \NAT@numbersfalse +%<*class> + \cs_set_eq:NN \NAT@open \c_@@_fullwidth_left_paren_tl + \cs_set_eq:NN \NAT@close \c_@@_fullwidth_right_paren_tl + \cs_set_eq:NN \NAT@sep \c_@@_fullwidth_semicolon_tl + \cs_set_eq:NN \NAT@aysep \c_@@_fullwidth_comma_tl + \cs_set_eq:NN \NAT@yrsep \c_@@_ideographic_comma_tl +%</class> + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibsection} +% 修改参考文献部分的页眉,并将其添加到目录。 +% \begin{macrocode} +\cs_set:Npn \bibsection + { + \chapter* { \bibname } + \fdu_front_matter_header:n { \bibname } + \addcontentsline { toc } { chapter } + { \@@_chapter_toc_format: \bibname } + } +% \end{macrocode} +% \end{macro} +% +% \changes{v0.7}{2018/01/25}{同步 \pkg{gbt7714} v1.0,移除有关超链接 +% 的额外设置。} +% +% \subsection{\pkg{hyperref} 相关配置} +% +% \changes{v0.4}{2017/08/13}{新增 \pkg{hyperref} 相关配置,包括超链接 +% 样式(\opt{style/hyperlink} 与 \opt{style/hyperlink-color} 选项) +% 及 PDF 元信息等。} +% \changes{v0.7}{2018/01/23}{将 \pkg{hyperref} 相关配置移至模板末尾, +% 以减少冲突。} +% +% \begin{macro}{\hypersetup,\fdu_hyperref_setup:n} +% \pkg{hyperref} 宏包是在导言区之后才引入的。若要在导言区中使用 +% \tn{hypersetup} 命令,必须另行定义。 +% \begin{macrocode} +\NewDocumentCommand \hypersetup { m } + { \fdu_hyperref_setup:n {#1} } +\cs_new_protected:Npn \fdu_hyperref_setup:n #1 + { \clist_gput_right:Nn \g_@@_to_hyperref_clist {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_set_hyperlink_color_key:n} +% 设置超链接颜色选项。最后的逗号用于确保 \pkg{l3keys} 可以正确解析,不能省去。 +% \begin{macrocode} +\cs_new:Npn \@@_set_hyperlink_color_key:n #1 + { + hyperlink-color / \clist_item:nn {#1} {1} .code:n = + { + \@@_define_hyperlink_color:nnn + { \clist_item:nn {#1} {2} } + { \clist_item:nn {#1} {3} } + { \clist_item:nn {#1} {4} } + \fdu_hyperref_setup:n + { + linkcolor = fdu@link, linkbordercolor = fdu@link, + urlcolor = fdu@url, urlbordercolor = fdu@url, + citecolor = fdu@cite, citebordercolor = fdu@cite + } + }, + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_define_hyperlink_color:nnn} +% 定义超链接颜色。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_define_hyperlink_color:nnn #1#2#3 + { + \definecolorset { HTML } { fdu@ } { } + { link, #1; url, #2; cite, #3 } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\keys_define:nx { fdu / style } + { +% \end{macrocode} +% +% \begin{macro}{style/hyperlink} +% 超链接样式。 +% \begin{macrocode} + hyperlink .choice:, + hyperlink .value_required:n = true, + hyperlink / border .code:n = { }, + hyperlink / color .code:n = + { \fdu_hyperref_setup:n { colorlinks = true } }, + hyperlink / none .code:n = + { \fdu_hyperref_setup:n { hidelinks = true } }, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{style/hyperlink-color} +% 超链接颜色。 +% \begin{macrocode} + hyperlink-color .choice:, + hyperlink-color .value_required:n = true, + \clist_map_function:nN + { + { autumn, D70000, D75F00, AF8700 }, + { business, D14542, 295497, 1F6E43 }, + { classic, FF0000, 0000FF, 00FF00 }, + { default, 990000, 0000B2, 007F00 }, + { elegant, 961212, C31818, 9B764F }, + { fantasy, FF4A19, FF3F94, 934BA1 }, + { material, E91E63, 009688, 4CAF50 }, + { science, CA0619, 389F9D, FF8920 }, + { summer, 00AFAF, 5F5FAF, 5F8700 }, + { graylevel, 616161, 616161, 616161 }, + { prl, 2D3092, 2D3092, 2D3092 } + } + \@@_set_hyperlink_color_key:n + } +% \end{macrocode} +% \end{macro} +% +% \changes{v0.6}{2017/10/29}{优化 URL 断行设置。} +% +% \begin{macro}{\fdu_allow_url_break:,\@@_add_url_break_points:} +% 允许 URL 在字母、数字和一些特殊符号处断行。见 +% \url{https://bit.ly/2hhIjLW}。 +% \begin{macrocode} +\cs_new:Npn \fdu_allow_url_break: + { + \cs_new:Npn \@@_add_url_break_points: + { \tl_map_function:NN \c_@@_url_break_points_tl \do } + \@@_appto_cmd:Nn \UrlBreaks + { \UrlOrds \@@_add_url_break_points: } + } +% \end{macrocode} +% \end{macro} +% +% \begin{variable}{\c_@@_url_break_points_tl} +% 额外的断行位置是 26 个英文字母(大小写)以及 10 个阿拉伯数字。 +% \pkg{url} 提供的宏 \tn{UrlBreaks} 还包含了特殊符号 |*|、|-|、 +% |~|、|'|、|"|、|-|,也被设置为允许断行。 +% \begin{macrocode} +\tl_const:Nn \c_@@_url_break_points_tl + { + abcdefghijklmnopqrstuvwxyz + ABCDEFGHIJKLMNOPQRSTUVWXYZ + 0123456789 + } +% \end{macrocode} +% \end{variable} +% +% 在导言区末尾引入 \pkg{hyperref} 宏包。 +% \begin{macrocode} +\ctex_at_end_preamble:n + { + \RequirePackage { hyperref } +% \end{macrocode} +% 此后 \tn{hypersetup} 命令由 \pkg{hyperref} 宏包接管。 +% \begin{macrocode} + \hypersetup + { + bookmarksnumbered = true, +% \end{macrocode} +% 填写 PDF 元信息。 +% \begin{macrocode} +%<*class> + pdftitle = \l_@@_info_title_tl, + pdfauthor = \l_@@_info_author_tl, + pdfkeywords = \l_@@_info_keywords_clist, +%</class> +%<*class-en> + pdftitle = \l_@@_info_title_en_tl, + pdfauthor = \l_@@_info_author_en_tl, + pdfkeywords = \l_@@_info_keywords_en_clist, +%</class-en> +% pdfsubject = , + pdfcreator = \c_@@_name_pdf_creator_tl + } +% \end{macrocode} +% 将导言区中通过 \cs{fdu_hyperref_setup:n} 进行的设置传入 +% \tn{hypersetup}。 +% \begin{macrocode} + \exp_args:NV \hypersetup \g_@@_to_hyperref_clist +% \end{macrocode} +% URL 断行处理。 +% \begin{macrocode} + \fdu_allow_url_break: +% \end{macrocode} +% 手动开启 \pkg{biblatex} 的 \pkg{hyperref} 支持。 +% \begin{macrocode} + \bool_if:NF \l_@@_bibtex_bool { \BiblatexManualHyperrefOn } + } +% \end{macrocode} +% +% 在 PDF 字符串中设置 \tn{fdu@kai} 命令为空,以抑制 \pkg{hyperref} +% 的警告信息。 +% \begin{macrocode} +\ctex_at_end_package:nn { hyperref } + { + \pdfstringdefDisableCommands + { + \cs_set_eq:NN \fdu@kai \prg_do_nothing: + \cs_set_eq:NN \quad \c_space_tl + \cs_set_eq:NN \qquad \c_space_tl + } + } +% \end{macrocode} +% +% \subsection{用户接口} +% +% \begin{macro}{info,style} +% 定义元(meta)键值对。 +% \begin{macrocode} +\keys_define:nn { fdu } + { + info .meta:nn = { fdu / info } {#1}, + style .meta:nn = { fdu / style } {#1} + } +% \end{macrocode} +% \end{macro} +% +% 文档类初始设置。 +% \begin{macrocode} +\keys_set:nn { fdu } + { + style / font = times, +%<class> style / cjk-font = fandol, + style / font-size = -4, +%<class> style / fullwidth-stop = false, + style / auto-make-cover = true, + style / logo = { fudan-name.pdf }, + style / logo-size = { 0.5 \textwidth }, + style / hyperlink = color, + style / hyperlink-color = default, + style / bib-style = numerical, + info / degree = academic, + info / secret-level = none, + info / school-id = { 10246 }, + info / date = { \zhtoday }, +%<class> theorem / header-font = { \sffamily }, +%<class-en> theorem / header-font = { \bfseries \upshape }, +%<class> theorem / body-font = { \fdu@kai }, +%<class-en> theorem / body-font = { \itshape }, + theorem / counter = { chapter } + } +% \end{macrocode} +% +% \begin{macro}{\fdusetup} +% 用户设置接口。 +% \begin{macrocode} +\NewDocumentCommand \fdusetup { m } + { \keys_set:nn { fdu } {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{proof} +% \begin{environment}{axiom} +% \begin{environment}{corollary} +% \begin{environment}{definition} +% \begin{environment}{example} +% \begin{environment}{lemma} +% \begin{environment}{theorem} +% 模板预定义的常用数学环境。 +% 其中的“证明”比较特殊,它不编号,但会添加证毕符号。 +% \begin{macrocode} +%<*class> +\newtheorem* { proof } { \c_@@_name_proof_tl } +\newtheorem { axiom } { \c_@@_name_axiom_tl } +\newtheorem { corollary } { \c_@@_name_corollary_tl } +\newtheorem { definition } { \c_@@_name_definition_tl } +\newtheorem { example } { \c_@@_name_example_tl } +\newtheorem { lemma } { \c_@@_name_lemma_tl } +\newtheorem { theorem } { \c_@@_name_theorem_tl } +%</class> +%<*class-en> +\newtheorem* { proof } { \c_@@_name_proof_en_tl } +\newtheorem { axiom } { \c_@@_name_axiom_en_tl } +\newtheorem { corollary } { \c_@@_name_corollary_en_tl } +\newtheorem { definition } { \c_@@_name_definition_en_tl } +\newtheorem { example } { \c_@@_name_example_en_tl } +\newtheorem { lemma } { \c_@@_name_lemma_en_tl } +\newtheorem { theorem } { \c_@@_name_theorem_en_tl } +%</class-en> +%</class|class-en> +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% +% \subsection{模板参数配置文件} +% +% \changes{v0.3}{2017/06/27}{分离文档类与参数配置文件。} +% +% \begin{macrocode} +%<*definition> +% \end{macrocode} +% +% \subsubsection{通用配置} +% +% \begin{variable}{\c_@@_name_simp_tl,\c_@@_name_trad_tl, +% \c_@@_name_en_tl} +% 学校名称。 +% \begin{macrocode} +\tl_const:Nn \c_@@_name_simp_tl { 复旦大学 } +\tl_const:Nn \c_@@_name_trad_tl { 復旦大學 } +\tl_const:Nn \c_@@_name_en_tl { Fudan~ University } +% \end{macrocode} +% \end{variable} +% +% 常用标点符号,见表~\ref{tab:punctuations}。 +% \begin{macrocode} +\clist_map_inline:nn + { + { ideographic_comma } { "3001 }, + { ideographic_full_stop } { "3002 }, + { fullwidth_comma } { "FF0C }, + { fullwidth_full_stop } { "FF0E }, + { fullwidth_colon } { "FF1A }, + { fullwidth_semicolon } { "FF1B }, + { fullwidth_left_paren } { "FF08 }, + { fullwidth_right_paren } { "FF09 } + } + { \@@_define_punct:nn #1 } +% \end{macrocode} +% +% \begin{table}[ht] +% \caption{常用标点符号} +% \label{tab:punctuations} +% \centering +% \begin{tabular}{cccc} +% \toprule +% \textbf{中文名称} & \textbf{英文名称} & \textbf{符号} & \textbf{Unicode} \\ +% \midrule +% 中文顿号 & Ideographic comma & \symbol{"3001} & U+3001 \\ +% 中文句号 & Ideographic full stop & \symbol{"3002} & U+3002 \\ +% 中文逗号 & Fullwidth comma & \symbol{"FF0C} & U+FF0C \\ +% 全角西文句点 & Fullwidth full stop & \symbol{"FF0E} & U+FF0E \\ +% 中文冒号 & Fullwidth colon & \symbol{"FF1A} & U+FF1A \\ +% 中文分号 & Fullwidth semicolon & \symbol{"FF1B} & U+FF1B \\ +% 中文左圆括号 & Fullwidth left parenthesis & \symbol{"FF08} & U+FF08 \\ +% 中文右圆括号 & Fullwidth right parenthesis & \symbol{"FF09} & U+FF09 \\ +% \bottomrule +% \end{tabular} +% \end{table} +% +% \begin{variable}{\c_@@_line_spread_fp} +% 行距倍数。行距倍数 $k$ 由下式确定: +% \begin{equation*} +% \num{1.2} \times k \times \SI{12}{bp} = \SI{20}{pt}. +% \end{equation*} +% 式中,\num{1.2} 是基本行距与文字大小之比,\SI{12}{bp} 是小四号字 +% 的大小,\SI{20}{pt} 是行距固定值。 +% \begin{macrocode} +\fp_const:Nn \c_@@_line_spread_fp + { \dim_ratio:nn { 20 pt } { 12 bp } / 1.2 } +% \end{macrocode} +% \end{variable} +% +% \subsubsection{声明页} +% +% \begin{variable}{\c_@@_orig_decl_text_tl} +% 论文独创性声明。 +% \begin{macrocode} +\tl_const:Nn \c_@@_orig_decl_text_tl + { + 本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独立进行研究 + 工作所取得的成果。论文中除特别标注的内容外,不包含任何其他个人或机 + 构已经发表或撰写过的研究成果。对本研究做出重要贡献的个人和集体,均 + 已在论文中作了明确的声明并表示了谢意。本声明的法律结果由本人承担。 + } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\c_@@_auth_decl_text_tl} +% 论文使用授权声明。 +% \begin{macrocode} +\tl_const:Nn \c_@@_auth_decl_text_tl + { + 本人完全了解复旦大学有关收藏和利用博士、硕士学位论文的规定,即:学 + 校有权收藏、使用并向国家有关部门或机构送交论文的印刷本和电子版本; + 允许论文被查阅和借阅;学校可以公布论文的全部或部分内容,可以采用影 + 印、缩印或其它复制手段保存论文。涉密学位论文在解密后遵守此规定。 + } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\c_@@_orig_decl_sign_clist, +% \c_@@_auth_decl_sign_clist} +% 声明页签名项目。 +% \begin{macrocode} +\clist_const:Nn \c_@@_orig_decl_sign_clist + { 作者签名, 日期 } +\clist_const:Nn \c_@@_auth_decl_sign_clist + { 作者签名, 导师签名, 日期 } +% \end{macrocode} +% \end{variable} +% +% \subsubsection{杂项} +% +% \begin{variable}{\c_@@_thesis_type_clist, +% \c_@@_degree_type_clist} +% 论文类型与学位类型。 +% \begin{macrocode} +\clist_const:Nn \c_@@_thesis_type_clist + { 博士学位论文, 硕士学位论文, 本科毕业论文 } +\clist_const:Nn \c_@@_degree_type_clist + { 学术学位, 专业学位 } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\c_@@_secret_clist} +% 三种密级。 +% \begin{macrocode} +\clist_const:Nn \c_@@_secret_clist { 秘密, 机密, 绝密 } +% \end{macrocode} +% \end{variable} +% +% 默认名称。注意空格是忽略掉的。 +% \begin{macrocode} +\clist_map_inline:nn + { + { secret_level } { 密 \qquad 级 }, + { secret_star } { \textrm { \bigstar } }, + { school_id } { 学校代码 }, + { student_id } { 学 \qquad 号 }, + { department } { 院系 }, + { major } { 专业 }, + { author } { 姓名 }, + { supervisor } { 指导教师 }, + { date } { 完成日期 }, + { instructors } { 指导小组成员 }, + { author_sign } { 作者签名 }, + { supervisor_sign } { 导师签名 }, + { sign_date } { 日期 }, + { bib_en } { Bibliography }, + { pdf_creator } { LaTeX~ with~ fduthesis~ class }, + { orig_decl } { \c_@@_name_simp_tl \\ 学位论文独创性声明 }, + { auth_decl } { \c_@@_name_simp_tl \\ 学位论文使用授权声明 } + } + { \@@_define_name:nn #1 } +\clist_map_inline:nn + { + { abstract } { 摘 \quad 要 } { Abstract }, + { keywords } { 关键字 } { Keywords: }, + { clc } { 中图分类号 } { CLC~ number: }, + { toc } { 目 \quad 录 } { Contents }, + { notation } { 符号表 } { List~ of~ Symbols } + } + { \@@_define_name:nnn #1 } +% \end{macrocode} +% +% 默认定理头名称。 +% \begin{macrocode} +\clist_map_inline:nn + { + { proof } { 证明 } { Proof }, + { axiom } { 公理 } { Axiom }, + { corollary } { 推论 } { Corollary }, + { definition } { 定义 } { Definition }, + { example } { 例 } { Example }, + { lemma } { 引理 } { Lemma }, + { theorem } { 定理 } { Theorem } + } + { \@@_define_name:nnn #1 } +%</definition> +%<@@=> +% \end{macrocode} +% +% \clearpage +% +% \end{implementation} +% |