% \iffalse meta-comment % % Copyright (C) 2021 by Jinwen XU % ------------------------------- % % This file 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 % % \fi % %<*driver> \ProvidesFile{ProjLib.dtx} % \NeedsTeXFormat{LaTeX2e}[2020-10-01] % %<*ProjLib> \ProvidesPackage{ProjLib} [2021/08/11 The collective interface of ProjLib toolkit] % % %<*PJLauthor> \ProvidesPackage{PJLauthor} [2021/08/11 Enhanced author information block] % % %<*PJLdate> \ProvidesPackage{PJLdate} [2021/08/11 Convert yyyy-mm-dd to normal datetime format] % % %<*PJLdraft> \ProvidesPackage{PJLdraft} [2021/08/11 Some useful macros for the draft stage] % % %<*PJLlang> \ProvidesPackage{PJLlang} [2021/08/11 Multi-language configuration] % % %<*PJLlogo> \ProvidesPackage{PJLlogo} [2021/08/11 The ProjLib logo] % % %<*PJLmath> \ProvidesPackage{PJLmath} [2021/08/11 Useful math macros and shortcuts] % % %<*PJLpaper> \ProvidesPackage{PJLpaper} [2021/08/11 Paper style configuration] % % %<*PJLthm> \ProvidesPackage{PJLthm} [2021/08/11 Theorem setup and configuration] % % %# 下面两行引入宏包的代码是所有文件共用的。 %# The following two lines are common to all files. \RequirePackage{kvoptions} \RequirePackage{etoolbox} % %<*PJLauthor> %# 在 AMS 文档类中不执行任何操作 %# Do nothing if AMS class detected \ifdefined\subjclass\endinput\fi %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{ family = @PJLauthor, prefix = @PJLauthor@, } %# 支持 AMS 风格 %# Support AMS fashion \DeclareBoolOption[false]{amsfashion} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %%================================ %% Font and style %%================================ %# 各个作者信息元素的字体 %# Font of the elements in the author block \def\PJLauthor@font@author{\normalsize\normalfont\scshape} \def\PJLauthor@font@address{\small\normalfont\itshape} \def\PJLauthor@font@curraddr{\small\normalfont\itshape} \def\PJLauthor@font@email{\small\normalfont\ttfamily} %%================================ %% Lengths %%================================ %# author 和 address 之间的距离 %# Space between author and address \newlength{\PJLauthor@length@innersep} \setlength{\PJLauthor@length@innersep}{.3\baselineskip} %# 两个作者块之间的距离 %# Space between different author blocks \newlength{\PJLauthor@length@sep} \setlength{\PJLauthor@length@sep}{.5\baselineskip} %# 作者块和日期之间的距离 %# Space between affiliation and date \newlength{\PJLauthor@length@aftersep} \setlength{\PJLauthor@length@aftersep}{.3\baselineskip} %%================================ %% The macros %%================================ %# 用来记录当前是否有附加作者信息,以便调整距离 %# To record whether there's affiliation so as to adjust the vertical space \newif\if@PJLauthor@affilon %# 作者 %# author \renewcommand*{\author}[1]{% \gappto\@author{\phantom{A}\\[-\baselineskip]% \vspace{\PJLauthor@length@sep}% \PJLauthor@font@author{#1}\\\phantom{} \@PJLauthor@affilonfalse}} %# 地址 %# address \providecommand*{\address}[1]{% \gappto\@author{\phantom{A}\\[-\baselineskip]% \if@PJLauthor@affilon\else% \vspace{\PJLauthor@length@innersep}% \fi% \@PJLauthor@affilontrue% \PJLauthor@font@address{#1}\\\phantom{}}% } %# 当前地址 %# curraddr \providecommand*{\curraddr}[1]{% \gappto\@author{\phantom{A}\\[-\baselineskip]% \if@PJLauthor@affilon\else% \vspace{\PJLauthor@length@innersep}% \fi% \@PJLauthor@affilontrue% \PJLauthor@font@curraddr{#1}\\\phantom{}}% } %# 电子邮箱 %# email \providecommand*{\email}[1]{% \gappto\@author{\phantom{A}\\[-\baselineskip]% \if@PJLauthor@affilon\else% \vspace{\PJLauthor@length@innersep}% \fi% \@PJLauthor@affilontrue% \PJLauthor@font@email{#1}\\\phantom{}}% } %%================================ %% Adjustment %%================================ %# 去除 maketitle 中默认对 author 的处理 %# Remove the tabular around \@author in maketitle \patchcmd{\@maketitle}{\begin{tabular}[t]{c}}{}{}{} \patchcmd{\@maketitle}{\end{tabular}}{}{}{} %# 下面这一行是为了避免错误 "No \author given." %# The follwing line is for avoiding the error "No \author given." \def\@author{} %# 修正作者块的前后等距离 %# Adjust the spacing before and after the author block \pretocmd{\@maketitle}{% \pretocmd{\@author}{\vspace{-\PJLauthor@length@sep}}{}{\FAIL}% \apptocmd{\@author}{% % Fix the space caused by `\\\phantom{}` \vspace{-\baselineskip}% \if@PJLauthor@affilon% \vspace{\PJLauthor@length@aftersep}% \fi% }{}{\FAIL}% }{}{\FAIL} %# 若使用 AMS 风格 %# If AMS fashion enabled \ifbool{@PJLauthor@amsfashion}{ %# 使用 PJLlang 以支持自动语言转换 %# Use `PJLlang` to support automatic language conversion \RequirePackage{PJLlang} \RequirePackage{calc} %# 设定带条件的加粗 %# Set the conditional bold face \providecommand{\conditionalbfseries}{\bfseries} %# 关键词的标签 %# keywords' label \def\keywordsnameEN{\textsc{Key words and phrases}} \def\keywordsnameFR{\textsc{Mots et phrases clés}} \def\keywordsnameDE{\textsc{Schlüsselwörter und Phrasen}} \def\keywordsnameIT{\textsc{Parole e frasi chiave}} \def\keywordsnamePT{\textsc{Palavras e frases chave}} \def\keywordsnameBR{\textsc{Palavras e frases chave}} \def\keywordsnameES{\textsc{Palabras y frases clave}} \def\keywordsnameCN{关键词} \def\keywordsnameTC{關鍵詞} \def\keywordsnameJP{キーワード} \def\keywordsnameRU{Ключевые слова и фразы} %# 关键词 %# keywords \def\PJL@keywords{} \providecommand*{\keywords}[1]{\def\PJL@keywords{#1}} %# 献给 %# dedicatory \def\PJL@dedicatory{} \providecommand*{\dedicatory}[1]{\def\PJL@dedicatory{#1}} %# 致谢,在 \author 中使用时呈现为 article 风格,在外面单独用是则呈现为 AMS 风格 %# \thanks: behave like article-style when in \author, and ams-style (no marker) when outside \AtEndPreamble{ % In case that \@author changes again \let\footnotemark@PJLoriginal\footnotemark% \let\footnotemark\relax% \let\thanks@PJLoriginal\thanks% \newlength\PJL@starlength \setlength{\PJL@starlength}{\widthof{*}} \newcommand*{\PJL@prethanks}[1]{\thanks@PJLoriginal{\hspace*{-\PJL@starlength}#1}} % \renewcommand*{\thanks}[1]{% % \ifx#1\@empty\else% % \thanks@PJLoriginal{\hspace*{-\PJL@starlength}#1}% % \fi} \renewcommand*{\thanks}[1]{% \ifx#1\@empty\else% \apptocmd{\@title}{% \thanks@PJLoriginal{\hspace*{-\PJL@starlength}#1}% }{}{\FAIL}% \fi} \let\author@PJLoriginal\author \renewcommand{\author}[1]{% \author@PJLoriginal{% \let\footnotemark\footnotemark@PJLoriginal% \let\thanks\thanks@PJLoriginal% #1% \let\footnotemark\relax% }% } % \pretocmd{\@author}{\let\footnotemark\footnotemark@PJLoriginal\let\thanks\thanks@PJLoriginal}{}{\FAIL} % \apptocmd{\@author}{\let\footnotemark\relax}{}{\FAIL} } %# 重定义 abstract 环境以允许其出现在 maketitle 的前面 %# Modify abstract to allow it before maketitle \let\abstract@PJLoriginal\abstract% \let\endabstract@PJLoriginal\endabstract% \newif\if@PJLauthor@maketitle\@PJLauthor@maketitlefalse \newif\if@PJLauthor@absbefore\@PJLauthor@absbeforefalse \RequirePackage{fancyvrb} % Taken from https://tex.stackexchange.com/a/596328 % define the same as \protected@write, but with \immediate \providecommand*\protected@iwrite[3]{% \begingroup \let\thepage\relax #2% \let\protect\@unexpandable@protect \edef\reserved@a{\immediate\write#1{#3}}\reserved@a \endgroup \if@nobreak\ifvmode\nobreak\fi\fi } \patchcmd{\FVB@VerbatimOut} {\immediate\write\FV@OutFile} {\protected@iwrite\FV@OutFile{}} {}{} % \renewenvironment{abstract}{% \VerbatimOut{\jobname.pjlabs}% }{ \endVerbatimOut% \if@PJLauthor@maketitle% \begin{abstract@PJLoriginal}% \input{\jobname.pjlabs}% \end{abstract@PJLoriginal}% % \ifx\PJL@keywords\@empty\else% % \par\smallskip\noindent{\conditionalbfseries\csname keywordsname\csname\languagename ABBR\endcsname\endcsname.}~\PJL@keywords% % \fi% \else% \global\@PJLauthor@absbeforetrue% \fi% } %# 修改 maketitle 以包含上面的诸多改动 %# Modify maketitle to reflect the modifications above \AtEndPreamble{% %## 将 dedicatory 添加进 \@maketitle %## Add dedicatory to \@maketitle \patchcmd{\@maketitle}{\@date}{% \ifx\@date\@empty\vspace{-2\baselineskip}% \else\@date\fi% \ifx\PJL@dedicatory\@empty\else% \ifx\@date\@empty\vspace{2\baselineskip}\fi% \par\vspace{-\parskip}\bigskip% {\itshape\PJL@dedicatory}% \ifx\@date\@empty% \vspace{-1.7\baselineskip}% \vspace{-\parskip}% \fi% \fi% }{}{\FAIL} %## 将 keywords 添加进 \maketitle %## Add keywords to \maketitle \pretocmd{\maketitle}{% \ifx\PJL@keywords\@empty\else% \PJL@prethanks{{\protect\conditionalbfseries% \csname keywordsname\csname\languagename ABBR\endcsname\endcsname.}% ~\PJL@keywords}% \fi}{}{\FAIL} %## 将 abstract 添加进 \maketitle %## Add abstract to \maketitle \apptocmd{\maketitle}{% \if@PJLauthor@absbefore% \begin{abstract@PJLoriginal}% \input{\jobname.pjlabs}% % \ifx\PJL@keywords\@empty\else% % \par\smallskip\noindent{\conditionalbfseries\csname keywordsname\csname\languagename ABBR\endcsname\endcsname.}~\PJL@keywords% % \fi% \end{abstract@PJLoriginal}% \fi% \global\let\address\relax \global\let\curraddr\relax \global\let\email\relax \global\let\dedicatory\relax \global\let\keywords\relax \global\@PJLauthor@maketitletrue }{}{\FAIL} %##- 这段未被采用的代码将使 maketitle 中的 \newpage 失效 %##- Disbale the \newpage in maketitle % \let\maketitle@PJLoriginal=\maketitle % \renewcommand*{\maketitle}{{\let\newpage\relax\maketitle@PJLoriginal}} } %# 定义 \subjclass,这段代码改编自 AMS 文档类 %# Define \subjclass, the code is adopted from AMS classes \newcommand*\subjclass[2][2020]{% \def\@subjclass{#2}% \@ifundefined{subjclassname@#1}{% \ClassWarning{\@currname}{Unknown edition (#1) of Mathematics Subject Classification; using '2020'}% \expandafter\let\expandafter\subjclassname\csname subjclassname@2020\endcsname }{% \expandafter\let\expandafter\subjclassname\csname subjclassname@#1\endcsname }% \PJL@prethanks{{\itshape\subjclassname.}\enspace\@subjclass{}.} } \@namedef{subjclassname@1991}{% \textup{1991} Mathematics Subject Classification} \@namedef{subjclassname@2000}{% \textup{2000} Mathematics Subject Classification} \@namedef{subjclassname@2010}{% \textup{2010} Mathematics Subject Classification} \@namedef{subjclassname@2020}{% \textup{2020} Mathematics Subject Classification} } % % %<*PJLdate> %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{ family = @PJLdate, prefix = @PJLdate@, } %# 草稿模式或快速模式 %# Draft mode or fast mode \DeclareBoolOption[false]{draft} \DeclareBoolOption[false]{fast} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %# 下面的代码设定了选项之间的关系 %# The following code sets the relationship between options \if@PJLdate@draft \@PJLdate@fasttrue \fi %# 将 PJLdate 与 PLdate 等同 %# To make PLdate and PJLdate equivalent \DeclareDocumentCommand{\PLdate}{}{\PJLdate} %# 快速模式下直接输出原日期字符串 %# Directly output the original date string in fast mode \if@PJLdate@fast\let\PJLdate\relax\endinput\fi %# 载入多语言支持 %# Load multi-language support \RequirePackage{PJLlang} %# 下面一行是为了避免使用 authblk 时产生的错误 %# The following line is for "authblk" \robustify\@latex@warning@no@line %# 消除一些警告 %# Eliminate some warnings \RequirePackage{silence} \WarningFilter*{datetime2}{Date-Time Language Module} %# 分别引入负责西文日期和 CJK 日期的宏包 %# Use packages resp. for western date and CJK date \PassOptionsToPackage{fr-FR,en-US}{datetime2} \RequirePackage{datetime2} \RequirePackage{zhnumber} %# 在 CJK 模式下将 DTMdate 定义为 zhdate %# Maps DTMdate to zhdate in CJK context \let\@DTMdate@PJLoriginal\@DTMdate \gappto{\PJLlang@langconfig@common}{% \let\@DTMdate\@DTMdate@PJLoriginal% } \gappto{\PJLlang@langconfig@CN}{% \renewcommand*{\@DTMdate}[1]{% \expandafter\@dtm@parsedate#1\@dtm@endparsedate% \zhdate{\@dtm@year/\@dtm@month/\@dtm@day}% }% } \gappto{\PJLlang@langconfig@TC}{% \renewcommand*{\@DTMdate}[1]{% \expandafter\@dtm@parsedate#1\@dtm@endparsedate% \zhdate{\@dtm@year/\@dtm@month/\@dtm@day}% }% } \gappto{\PJLlang@langconfig@JP}{% \renewcommand*{\@DTMdate}[1]{% \expandafter\@dtm@parsedate#1\@dtm@endparsedate% \zhdate{\@dtm@year/\@dtm@month/\@dtm@day}% }% } %# 提供命令 PJLdate %# Provide the macro PJLdate \providecommand*{\PJLdate}[1]{\DTMdate{#1}} % % %<*PJLdraft> %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{ family = @PJLdraft, prefix = @PJLdraft@, } %# 草稿模式或快速模式 %# Draft mode or fast mode \DeclareBoolOption[false]{draft} \DeclareBoolOption[false]{fast} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %# 下面的代码设定了选项之间的关系 %# The following code sets the relationship between options \if@PJLdraft@draft \@PJLdraft@fasttrue \fi %# 载入多语言支持 %# Load multi-language support \RequirePackage{PJLlang} %# 载入颜色支持 %# Load support for colors \RequirePackage{xcolor} %# 命令中的默认字体 %# Default font in the macro \def\dnfFont{\ttfamily} \def\needgraphFont{\ttfamily} %# 命令中的文字 %# Text in the macro \def\dnfTextEN{To be finished} \def\needgraphTextEN{A graph is needed here} \def\dnfTextFR{Pas encore fini} \def\needgraphTextFR{Il manque une image ici} \def\dnfTextDE{Nicht beendet} \def\needgraphTextDE{Benötigen Sie ein Bild} \def\dnfTextIT{Per essere finito} \def\needgraphTextIT{Manca un'immagine qui} \def\dnfTextPT{Não terminou} \def\needgraphTextPT{Precisa de uma foto aqui} \def\dnfTextBR{Não terminou} \def\needgraphTextBR{Precisa de uma foto aqui} \def\dnfTextES{Estar terminado} \def\needgraphTextES{Falta una imagen aquí} \def\dnfTextCN{这里尚未完成} \def\needgraphTextCN{这里需要一张图片} \def\dnfTextTC{這裡尚未完成} \def\needgraphTextTC{這裡需要一張圖片} \def\dnfTextJP{終わってない} \def\needgraphTextJP{まだ画像が必要です} \def\dnfTextRU{Не закончен} \def\needgraphTextRU{Еще нужна картинка} %# 命令中的颜色 %# Default color in the macro \definecolor{dnfColor}{RGB}{21,122,20} \definecolor{needgraphColor}{RGB}{70,130,180} \if@PJLdraft@fast %# 快速模式用 fbox 定义 %# Use fbox in fast mode \newcommand{\plainBox}[2][-paper]{\textcolor{#1}{% \setlength{\fboxsep}{1.5pt}% \setlength{\fboxrule}{1.2pt}% \fbox{#2}}} \else %# 正常模式用 tcolorbox 定义 %# Use tcolorbox in normal mode \PassOptionsToPackage{many}{tcolorbox} \RequirePackage{tcolorbox} \newtcbox{\plainBox}[1][-paper]{enhanced jigsaw,% on line, arc = 1.2pt, outer arc = 1pt,breakable,% colframe = #1,colupper=#1,opacityback=0,% boxsep = 1pt,boxrule = 1.2pt,% left = 1pt, right = 1pt, top = 0pt, bottom = 0pt,% } \fi %# 命令中的计数器 %# Counters for the macro \newcounter{dnfcnt} \newcounter{needgraphcnt} %# 尚未完成的标记 %# Mark for ``did not finish'' \NewDocumentCommand{\dnf}{d<>}{% \noindent\plainBox[dnfColor]% {\normalfont\dnfFont\bfseries\small% \csname dnfText\csname\languagename ABBR\endcsname\endcsname% \stepcounter{dnfcnt}~\#\thednfcnt% \IfNoValueF{#1}{\,: #1}}% } %# 需要图片的标记 %# Mark for ``Graph needed'' \NewDocumentCommand{\needgraph}{d<>}{% \begin{center}% \plainBox[needgraphColor]% {\normalfont\needgraphFont\bfseries\small% \csname needgraphText\csname\languagename ABBR\endcsname\endcsname% \stepcounter{needgraphcnt}~\#\theneedgraphcnt% \IfNoValueF{#1}{\,: #1}}% \end{center}% } % % %<*PJLlang> %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{% family = @PJLlang, prefix = @PJLlang@ } %# 使用 polyglossia 而不是 babel 进行设置,目前还不完善 %# Use polyglossia instead of babel \DeclareBoolOption[false]{polyglossia} %# 用于记录该语言是否被启用 %# To record whether the language is enabled in the document \newif\if@PJLlang@enable@all\@PJLlang@enable@alltrue \newif\if@PJLlang@enable@EN\@PJLlang@enable@ENfalse \newif\if@PJLlang@enable@FR\@PJLlang@enable@FRfalse \newif\if@PJLlang@enable@DE\@PJLlang@enable@DEfalse \newif\if@PJLlang@enable@IT\@PJLlang@enable@ITfalse \newif\if@PJLlang@enable@PT\@PJLlang@enable@PTfalse \newif\if@PJLlang@enable@BR\@PJLlang@enable@BRfalse \newif\if@PJLlang@enable@ES\@PJLlang@enable@ESfalse \newif\if@PJLlang@enable@CN\@PJLlang@enable@CNfalse \newif\if@PJLlang@enable@TC\@PJLlang@enable@TCfalse \newif\if@PJLlang@enable@JP\@PJLlang@enable@JPfalse \newif\if@PJLlang@enable@RU\@PJLlang@enable@RUfalse %# 用来存储要传递给babel的选项 %# To store the option list to pass to babel \def\PJLlang@babeloptions{} %# 语言选项:启用该语言并添加相应的 babel 参数 %# The language options: enable the corresponding language and add the corresponding options to babel \DeclareVoidOption{EN}{\@PJLlang@enable@allfalse\@PJLlang@enable@ENtrue\providecommand{\PJLlang@mainlang}{EN}\gpreto{\PJLlang@babeloptions}{,english}} \DeclareVoidOption{english}{\@PJLlang@enable@allfalse\@PJLlang@enable@ENtrue\providecommand{\PJLlang@mainlang}{EN}\gpreto{\PJLlang@babeloptions}{,english}} \DeclareVoidOption{English}{\@PJLlang@enable@allfalse\@PJLlang@enable@ENtrue\providecommand{\PJLlang@mainlang}{EN}\gpreto{\PJLlang@babeloptions}{,english}} \DeclareVoidOption{FR}{\@PJLlang@enable@allfalse\@PJLlang@enable@FRtrue\providecommand{\PJLlang@mainlang}{FR}\gpreto{\PJLlang@babeloptions}{,french}} \DeclareVoidOption{french}{\@PJLlang@enable@allfalse\@PJLlang@enable@FRtrue\providecommand{\PJLlang@mainlang}{FR}\gpreto{\PJLlang@babeloptions}{,french}} \DeclareVoidOption{French}{\@PJLlang@enable@allfalse\@PJLlang@enable@FRtrue\providecommand{\PJLlang@mainlang}{FR}\gpreto{\PJLlang@babeloptions}{,french}} \DeclareVoidOption{DE}{\@PJLlang@enable@allfalse\@PJLlang@enable@DEtrue\providecommand{\PJLlang@mainlang}{DE}\gpreto{\PJLlang@babeloptions}{,ngerman}} \DeclareVoidOption{german}{\@PJLlang@enable@allfalse\@PJLlang@enable@DEtrue\providecommand{\PJLlang@mainlang}{DE}\gpreto{\PJLlang@babeloptions}{,ngerman}} \DeclareVoidOption{ngerman}{\@PJLlang@enable@allfalse\@PJLlang@enable@DEtrue\providecommand{\PJLlang@mainlang}{DE}\gpreto{\PJLlang@babeloptions}{,ngerman}} \DeclareVoidOption{German}{\@PJLlang@enable@allfalse\@PJLlang@enable@DEtrue\providecommand{\PJLlang@mainlang}{DE}\gpreto{\PJLlang@babeloptions}{,ngerman}} \DeclareVoidOption{IT}{\@PJLlang@enable@allfalse\@PJLlang@enable@ITtrue\providecommand{\PJLlang@mainlang}{IT}\gpreto{\PJLlang@babeloptions}{,italian}} \DeclareVoidOption{italian}{\@PJLlang@enable@allfalse\@PJLlang@enable@ITtrue\providecommand{\PJLlang@mainlang}{IT}\gpreto{\PJLlang@babeloptions}{,italian}} \DeclareVoidOption{Italian}{\@PJLlang@enable@allfalse\@PJLlang@enable@ITtrue\providecommand{\PJLlang@mainlang}{IT}\gpreto{\PJLlang@babeloptions}{,italian}} \DeclareVoidOption{PT}{\@PJLlang@enable@allfalse\@PJLlang@enable@PTtrue\providecommand{\PJLlang@mainlang}{PT}\gpreto{\PJLlang@babeloptions}{,portuguese}} \DeclareVoidOption{portuguese}{\@PJLlang@enable@allfalse\@PJLlang@enable@PTtrue\providecommand{\PJLlang@mainlang}{PT}\gpreto{\PJLlang@babeloptions}{,portuguese}} \DeclareVoidOption{Portuguese}{\@PJLlang@enable@allfalse\@PJLlang@enable@PTtrue\providecommand{\PJLlang@mainlang}{PT}\gpreto{\PJLlang@babeloptions}{,portuguese}} \DeclareVoidOption{BR}{\@PJLlang@enable@allfalse\@PJLlang@enable@BRtrue\providecommand{\PJLlang@mainlang}{BR}\gpreto{\PJLlang@babeloptions}{,brazilian}} \DeclareVoidOption{brazilian}{\@PJLlang@enable@allfalse\@PJLlang@enable@BRtrue\providecommand{\PJLlang@mainlang}{BR}\gpreto{\PJLlang@babeloptions}{,brazilian}} \DeclareVoidOption{Brazilian}{\@PJLlang@enable@allfalse\@PJLlang@enable@BRtrue\providecommand{\PJLlang@mainlang}{BR}\gpreto{\PJLlang@babeloptions}{,brazilian}} \DeclareVoidOption{ES}{\@PJLlang@enable@allfalse\@PJLlang@enable@EStrue\providecommand{\PJLlang@mainlang}{ES}\gpreto{\PJLlang@babeloptions}{,spanish}} \DeclareVoidOption{spanish}{\@PJLlang@enable@allfalse\@PJLlang@enable@EStrue\providecommand{\PJLlang@mainlang}{ES}\gpreto{\PJLlang@babeloptions}{,spanish}} \DeclareVoidOption{Spanish}{\@PJLlang@enable@allfalse\@PJLlang@enable@EStrue\providecommand{\PJLlang@mainlang}{ES}\gpreto{\PJLlang@babeloptions}{,spanish}} \DeclareVoidOption{CN}{\@PJLlang@enable@allfalse\@PJLlang@enable@CNtrue\providecommand{\PJLlang@mainlang}{CN}} \DeclareVoidOption{chinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@CNtrue\providecommand{\PJLlang@mainlang}{CN}} \DeclareVoidOption{Chinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@CNtrue\providecommand{\PJLlang@mainlang}{CN}} \DeclareVoidOption{schinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@CNtrue\providecommand{\PJLlang@mainlang}{CN}} \DeclareVoidOption{SChinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@CNtrue\providecommand{\PJLlang@mainlang}{CN}} \DeclareVoidOption{simplifiedchinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@CNtrue\providecommand{\PJLlang@mainlang}{CN}} \DeclareVoidOption{SimplifiedChinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@CNtrue\providecommand{\PJLlang@mainlang}{CN}} \DeclareVoidOption{TC}{\@PJLlang@enable@allfalse\@PJLlang@enable@TCtrue\providecommand{\PJLlang@mainlang}{TC}} \DeclareVoidOption{tchinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@TCtrue\providecommand{\PJLlang@mainlang}{TC}} \DeclareVoidOption{TChinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@TCtrue\providecommand{\PJLlang@mainlang}{TC}} \DeclareVoidOption{traditionalchinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@TCtrue\providecommand{\PJLlang@mainlang}{TC}} \DeclareVoidOption{TraditionalChinese}{\@PJLlang@enable@allfalse\@PJLlang@enable@TCtrue\providecommand{\PJLlang@mainlang}{TC}} \DeclareVoidOption{JP}{\@PJLlang@enable@allfalse\@PJLlang@enable@JPtrue\providecommand{\PJLlang@mainlang}{JP}\gpreto{\PJLlang@babeloptions}{,japanese}} \DeclareVoidOption{japanese}{\@PJLlang@enable@allfalse\@PJLlang@enable@JPtrue\providecommand{\PJLlang@mainlang}{JP}\gpreto{\PJLlang@babeloptions}{,japanese}} \DeclareVoidOption{Japanese}{\@PJLlang@enable@allfalse\@PJLlang@enable@JPtrue\providecommand{\PJLlang@mainlang}{JP}\gpreto{\PJLlang@babeloptions}{,japanese}} \DeclareVoidOption{RU}{\@PJLlang@enable@allfalse\@PJLlang@enable@RUtrue\providecommand{\PJLlang@mainlang}{RU}\gpreto{\PJLlang@babeloptions}{,russian}} \DeclareVoidOption{russian}{\@PJLlang@enable@allfalse\@PJLlang@enable@RUtrue\providecommand{\PJLlang@mainlang}{RU}\gpreto{\PJLlang@babeloptions}{,russian}} \DeclareVoidOption{Russian}{\@PJLlang@enable@allfalse\@PJLlang@enable@RUtrue\providecommand{\PJLlang@mainlang}{RU}\gpreto{\PJLlang@babeloptions}{,russian}} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %# 从全局参数中去除 chinese 和 Chinese %# Remove chinese and Chinese from global options \ExplSyntaxOn \cs_new_protected:cpn { @clearglobaloption } #1 { \clist_remove_all:cn { @classoptionslist } { #1 } } \ExplSyntaxOff \@clearglobaloption{chinese} \@clearglobaloption{Chinese} %# 默认语言:英语 %# Default main language: English \providecommand{\PJLlang@mainlang}{EN} %# 启用全部支持的语言 %# Enable all supported language \if@PJLlang@enable@all \@PJLlang@enable@ENtrue \@PJLlang@enable@FRtrue \@PJLlang@enable@DEtrue \@PJLlang@enable@ITtrue \@PJLlang@enable@PTtrue \@PJLlang@enable@BRtrue \@PJLlang@enable@EStrue \@PJLlang@enable@CNtrue \@PJLlang@enable@TCtrue \@PJLlang@enable@JPtrue \@PJLlang@enable@RUtrue \fi %# 语言名称的缩写 %# Abbreviation of language name \newcommand\englishABBR{EN} \newcommand\frenchABBR{FR} \newcommand\ngermanABBR{DE} \newcommand\italianABBR{IT} \newcommand\portugueseABBR{PT} \newcommand\brazilianABBR{BR} \newcommand\spanishABBR{ES} \newcommand\schineseABBR{CN} \newcommand\tchineseABBR{TC} \newcommand\japaneseABBR{JP} \newcommand\russianABBR{RU} %# 将字符串转换为相应的缩写 %# Convert a string to the corresponding abbreviation \ExplSyntaxOn % See https://tex.stackexchange.com/a/610146 \NewExpandableDocumentCommand{\StrToABBR}{m} { \str_case_e:nn { \str_foldcase:n { #1 } } { {cn} {CN} {chinese} {CN} {schinese} {CN} {simplifiedchinese} {CN} {tc} {TC} {tchinese} {TC} {traditionalchinese} {TC} {jp} {JP} {japanese} {JP} {en} {EN} {english} {EN} {fr} {FR} {french} {FR} {de} {DE} {ngerman} {DE} {it} {IT} {italian} {IT} {pt} {PT} {portuguese} {PT} {br} {BR} {brazilian} {BR} {es} {ES} {spanish} {ES} {german} {DE} {ru} {RU} {russian} {RU} } } \NewExpandableDocumentCommand{\StrToTYPE}{m} { \str_case_e:nn { \str_foldcase:n { #1 } } { {cn} {CJK} {chinese} {CJK} {schinese} {CJK} {simplifiedchinese} {CJK} {tc} {CJK} {tchinese} {CJK} {traditionalchinese} {CJK} {jp} {CJK} {japanese} {CJK} {en} {Latin} {english} {Latin} {fr} {Latin} {french} {Latin} {de} {Latin} {ngerman} {Latin} {it} {Latin} {italian} {Latin} {pt} {Latin} {portuguese} {Latin} {br} {Latin} {brazilian} {Latin} {es} {Latin} {spanish} {Latin} {german} {Latin} {ru} {Latin} {russian} {Latin} } } \ExplSyntaxOff %# 在 pdfLaTeX 编译时载入编码设置 %# Load the encoding settings when pdfLaTeX is used \RequirePackage{iftex} \ifPDFTeX \RequirePackage[T1]{fontenc} \RequirePackage{inputenc} \fi \if@PJLlang@polyglossia %# polyglossia 对应的设置 %# Configure with `polyglossia` \RequirePackage{polyglossia} \setdefaultlanguage{english} \setotherlanguage[frenchpart=false]{french} \setotherlanguage{ngerman} \setotherlanguage{spanish} \setotherlanguage{portuguese} \setotherlanguage[variant=brazilian]{portuguese} \setotherlanguage{italian} \ifPDFTeX\else \setotherlanguage{russian} \setotherlanguage{japanese} \RequirePackage{silence} \WarningFilter{polyglossia}{Asking to add empty feature to latin font(Script="CJK" to scripttag "")} \fi \else %# babel 对应的设置 %# Configure with `babel` \if@PJLlang@enable@all \ifPDFTeX\else \PassOptionsToPackage{japanese,russian}{babel} \fi \PassOptionsToPackage{italian,portuguese,brazilian,spanish,es-notilde,es-noquoting,ngerman,french,english,shorthands=off}{babel} \else \PassOptionsToPackage{\PJLlang@babeloptions}{babel} \fi \PassOptionsToPackage{italian,brazilian,spanish,ngerman,french,english}{cleveref} \RequirePackage{babel} \if@PJLlang@enable@FR \frenchsetup{PartNameFull=false} \fi \babelprovide{schinese} \babelprovide{tchinese} \fi %# 本地化 \today %# Localize \today \let\today@PJLoriginal\today \newcommand{\PJLlang@langconfig@common}{% \ifdefined\DTMtoday% \let\today\DTMtoday% \else% \let\today\today@PJLoriginal% \fi% } %# 各个语言的设置 %# The configuration for each language \newcommand{\PJLlang@langconfig@CN}{% \def\abstractname{摘要}% \def\proofname{证明}% \def\contentsname{目录}% \def\listfigurename{插图}% \def\listtablename{表格}% \def\figurename{图}% \def\tablename{表}% \def\indexname{索引}% \def\appendixname{附录}% \def\refname{参考文献}% \def\bibname{参考文献}% \let\today\zhtoday% \renewcommand{\languagename}{schinese}% } \newcommand{\PJLlang@langconfig@TC}{% \def\abstractname{摘要}% \def\proofname{證明}% \def\contentsname{目錄}% \def\listfigurename{插圖}% \def\listtablename{表格}% \def\figurename{圖}% \def\tablename{表}% \def\indexname{索引}% \def\appendixname{附錄}% \def\refname{參考文獻}% \def\bibname{參考文獻}% \let\today\zhtoday% \renewcommand{\languagename}{tchinese}% } \newcommand{\PJLlang@langconfig@JP}{% \selectlanguage{japanese}% } \newcommand{\PJLlang@langconfig@EN}{% \selectlanguage{english}% } \newcommand{\PJLlang@langconfig@FR}{% \selectlanguage{french}% % The line below is currently only needed for 'babel', but also works with 'polyglossia' \def\frenchpartname{Partie}% } \newcommand{\PJLlang@langconfig@DE}{% \selectlanguage{ngerman}% } \newcommand{\PJLlang@langconfig@IT}{% \selectlanguage{italian}% } \newcommand{\PJLlang@langconfig@PT}{% \selectlanguage{portuguese}% } \newcommand{\PJLlang@langconfig@BR}{% \selectlanguage{brazilian}% } \newcommand{\PJLlang@langconfig@ES}{% \selectlanguage{spanish}% } \newcommand{\PJLlang@langconfig@RU}{% \selectlanguage{russian}% } %# 用于增加语言设置的用户指令 AddLanguageSetting %# User command for adding language settings \NewDocumentCommand\AddLanguageSetting{d()m}{% \IfNoValueTF{#1}% {\gappto{\PJLlang@langconfig@common}{#2}}% {\expandafter\gappto\expandafter{\csname PJLlang@langconfig@\StrToABBR{#1}\endcsname}{#2}}% } \RequirePackage{setspace} %# 行距的设置 %# Line spacing configuration \def\PJL@config@linespacing{\setstretch{1.00}} \def\PJL@config@CJKlinespacing{\onehalfspacing} \newcommand{\PJLsetlinespacing}[1]{\renewcommand{\PJL@config@linespacing}{#1}} \newcommand{\PJLsetCJKlinespacing}[1]{\renewcommand{\PJL@config@CJKlinespacing}{#1}} %# 缩进的设置 %# Parindent configuration \def\PJL@config@parindent{\ltx@ifpackageloaded{parskip}{}{\setlength{\parindent}{1.5em}}} \def\PJL@config@CJKparindent{\ltx@ifpackageloaded{parskip}{}{\setlength{\parindent}{2em}}} \newcommand{\PJLsetparindent}[1]{\renewcommand{\PJL@config@parindent}{\ltx@ifpackageloaded{parskip}{}{\setlength{\parindent}{#1}}}} \newcommand{\PJLsetCJKparindent}[1]{\renewcommand{\PJL@config@CJKparindent}{\ltx@ifpackageloaded{parskip}{}{\setlength{\parindent}{#1}}}} %# 合并设置 %# All-in-all configuration \def\PJL@config@CJK{\PJL@config@CJKlinespacing\PJL@config@CJKparindent} \def\PJL@config@Latin{\PJL@config@linespacing\PJL@config@parindent} % %# UseLanguage 的核心部分,只能在正文中使用 %# The core part of UseLanguage, can be used only in the main text, not preamble \NewDocumentCommand{\UseLanguageCORE}{m}{% \PJLlang@langconfig@common% \csname PJL@config@\StrToTYPE{#1}\endcsname% \csname PJLlang@langconfig@\StrToABBR{#1}\endcsname% } %# 用于选定语言的 UseLanguage %# Macro for selecting language \NewDocumentCommand{\UseLanguage}{m}{% \ifx\@onlypreamble\@notprerr% \UseLanguageCORE{#1}% \else% \AfterEndPreamble{\UseLanguageCORE{#1}}% \fi% } %# 用于局部选定语言的 UseOtherLanguage %# Macro for selecting language locally \NewDocumentCommand{\UseOtherLanguage}{mm}{% \begingroup\begingroup% \PJLlang@langconfig@common% \csname PJLlang@langconfig@\StrToABBR{#1}\endcsname% #2% \endgroup\endgroup% } %# 运行默认语言的设置 %# Execute the configuration of the main language \expandafter\UseLanguage\expandafter{\PJLlang@mainlang} % % %<*PJLlogo> %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{ family = @PJLlogo, prefix = @PJLlogo@, } %# 草稿模式或快速模式 %# Draft mode or fast mode \DeclareBoolOption[false]{draft} \DeclareBoolOption[false]{fast} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %# 下面的代码设定了选项之间的关系 %# The following code sets the relationship between options \if@PJLlogo@draft \@PJLlogo@fasttrue \fi %# 快速模式下直接输出字符串 ProjLib %# Directly output the string ``ProjLib'' in fast mode \if@PJLlogo@fast\def\ProjLib{{\normalfont ProjLib}}\endinput\fi %# 以下选取字体并定义 Logo %# Below select the font and define the logo \RequirePackage{xcolor} \RequirePackage{graphicx} \ifdefined\fontspec \newfontface{\PJLlogo@font}{LinBiolinum_R.otf} \else \RequirePackage[T1]{fontenc} \newcommand{\PJLlogo@font}{\fontfamily{LinuxBiolinumT-TLF}\selectfont} \fi \newcommand{\PJLSigmaJ}{% \vbox{\offinterlineskip \ialign{% \hfil##\hfil\cr \hidewidth\hskip0.15ex\scalebox{0.4}{\rotatebox{-10}{\usefont{U}{zeur}{b}{n}\symbol{"06}}}\hidewidth\cr \noalign{\kern0.15ex} \j\cr }% }% } \newcommand{\ProjLib@generic}[1]{% \begingroup \normalfont\PJLlogo@font \textcolor{blue!60!cyan}{P}% \textcolor{blue!45!cyan}{r}% \textcolor{blue!30!cyan}{o}% \textcolor{green!70!black}{#1}% \textcolor{red!20!yellow}{L}% \textcolor{red!40!yellow}{i}% \textcolor{red!60!yellow}{b}% \endgroup } \DeclareRobustCommand*{\ProjLib}{\ProjLib@generic{\PJLSigmaJ}} \DeclareRobustCommand*{\ProjLibText}{\ProjLib@generic{j}} % % %<*PJLmath> %# 载入常用数学宏包 %# Load commonly used math packages \RequirePackage{mathtools} \RequirePackage{mathrsfs} \@ifpackageloaded{unicode-math}{}{\RequirePackage{amssymb}} %%================================ %% Shorthands %%================================ %# 常见代数结构的捷径 %# Shortcuts for commonly used algebraic structures \providecommand{\N}{\ensuremath{\mathbb{N}}} \providecommand{\Z}{\ensuremath{\mathbb{Z}}} \providecommand{\Q}{\ensuremath{\mathbb{Q}}} \providecommand{\R}{\ensuremath{\mathbb{R}}} \providecommand{\C}{\ensuremath{\mathbb{C}}} \providecommand{\F}{\ensuremath{\mathbb{F}}} \providecommand{\A}{\ensuremath{\mathbb{A}}} %# mathbb 的捷径 %# Shortcuts for blackboard bold face \providecommand{\bb}[1]{\ensuremath{\mathbb{#1}}} \providecommand{\bbA}{\ensuremath{\mathbb{A}}} \providecommand{\bbB}{\ensuremath{\mathbb{B}}} \providecommand{\bbC}{\ensuremath{\mathbb{C}}} \providecommand{\bbD}{\ensuremath{\mathbb{D}}} \providecommand{\bbE}{\ensuremath{\mathbb{E}}} \providecommand{\bbF}{\ensuremath{\mathbb{F}}} \providecommand{\bbG}{\ensuremath{\mathbb{G}}} \providecommand{\bbH}{\ensuremath{\mathbb{H}}} \providecommand{\bbI}{\ensuremath{\mathbb{I}}} \providecommand{\bbJ}{\ensuremath{\mathbb{J}}} \providecommand{\bbK}{\ensuremath{\mathbb{K}}} \providecommand{\bbL}{\ensuremath{\mathbb{L}}} \providecommand{\bbM}{\ensuremath{\mathbb{M}}} \providecommand{\bbN}{\ensuremath{\mathbb{N}}} \providecommand{\bbO}{\ensuremath{\mathbb{O}}} \providecommand{\bbP}{\ensuremath{\mathbb{P}}} \providecommand{\bbQ}{\ensuremath{\mathbb{Q}}} \providecommand{\bbR}{\ensuremath{\mathbb{R}}} \providecommand{\bbS}{\ensuremath{\mathbb{S}}} \providecommand{\bbT}{\ensuremath{\mathbb{T}}} \providecommand{\bbU}{\ensuremath{\mathbb{U}}} \providecommand{\bbV}{\ensuremath{\mathbb{V}}} \providecommand{\bbW}{\ensuremath{\mathbb{W}}} \providecommand{\bbX}{\ensuremath{\mathbb{X}}} \providecommand{\bbY}{\ensuremath{\mathbb{Y}}} \providecommand{\bbZ}{\ensuremath{\mathbb{Z}}} %# mathcal 的捷径 %# Shortcuts for calligraphic shape \providecommand{\mc}[1]{\ensuremath{\mathcal{#1}}} \providecommand{\mcA}{\ensuremath{\mathcal{A}}} \providecommand{\mcB}{\ensuremath{\mathcal{B}}} \providecommand{\mcC}{\ensuremath{\mathcal{C}}} \providecommand{\mcD}{\ensuremath{\mathcal{D}}} \providecommand{\mcE}{\ensuremath{\mathcal{E}}} \providecommand{\mcF}{\ensuremath{\mathcal{F}}} \providecommand{\mcG}{\ensuremath{\mathcal{G}}} \providecommand{\mcH}{\ensuremath{\mathcal{H}}} \providecommand{\mcI}{\ensuremath{\mathcal{I}}} \providecommand{\mcJ}{\ensuremath{\mathcal{J}}} \providecommand{\mcK}{\ensuremath{\mathcal{K}}} \providecommand{\mcL}{\ensuremath{\mathcal{L}}} \providecommand{\mcM}{\ensuremath{\mathcal{M}}} \providecommand{\mcN}{\ensuremath{\mathcal{N}}} \providecommand{\mcO}{\ensuremath{\mathcal{O}}} \providecommand{\mcP}{\ensuremath{\mathcal{P}}} \providecommand{\mcQ}{\ensuremath{\mathcal{Q}}} \providecommand{\mcR}{\ensuremath{\mathcal{R}}} \providecommand{\mcS}{\ensuremath{\mathcal{S}}} \providecommand{\mcT}{\ensuremath{\mathcal{T}}} \providecommand{\mcU}{\ensuremath{\mathcal{U}}} \providecommand{\mcV}{\ensuremath{\mathcal{V}}} \providecommand{\mcW}{\ensuremath{\mathcal{W}}} \providecommand{\mcX}{\ensuremath{\mathcal{X}}} \providecommand{\mcY}{\ensuremath{\mathcal{Y}}} \providecommand{\mcZ}{\ensuremath{\mathcal{Z}}} \providecommand{\cal}[1]{\ensuremath{\mathcal{#1}}} \providecommand{\calA}{\ensuremath{\mathcal{A}}} \providecommand{\calB}{\ensuremath{\mathcal{B}}} \providecommand{\calC}{\ensuremath{\mathcal{C}}} \providecommand{\calD}{\ensuremath{\mathcal{D}}} \providecommand{\calE}{\ensuremath{\mathcal{E}}} \providecommand{\calF}{\ensuremath{\mathcal{F}}} \providecommand{\calG}{\ensuremath{\mathcal{G}}} \providecommand{\calH}{\ensuremath{\mathcal{H}}} \providecommand{\calI}{\ensuremath{\mathcal{I}}} \providecommand{\calJ}{\ensuremath{\mathcal{J}}} \providecommand{\calK}{\ensuremath{\mathcal{K}}} \providecommand{\calL}{\ensuremath{\mathcal{L}}} \providecommand{\calM}{\ensuremath{\mathcal{M}}} \providecommand{\calN}{\ensuremath{\mathcal{N}}} \providecommand{\calO}{\ensuremath{\mathcal{O}}} \providecommand{\calP}{\ensuremath{\mathcal{P}}} \providecommand{\calQ}{\ensuremath{\mathcal{Q}}} \providecommand{\calR}{\ensuremath{\mathcal{R}}} \providecommand{\calS}{\ensuremath{\mathcal{S}}} \providecommand{\calT}{\ensuremath{\mathcal{T}}} \providecommand{\calU}{\ensuremath{\mathcal{U}}} \providecommand{\calV}{\ensuremath{\mathcal{V}}} \providecommand{\calW}{\ensuremath{\mathcal{W}}} \providecommand{\calX}{\ensuremath{\mathcal{X}}} \providecommand{\calY}{\ensuremath{\mathcal{Y}}} \providecommand{\calZ}{\ensuremath{\mathcal{Z}}} %# mathfrak 的捷径 %# Shortcuts for Fraktur shape \providecommand{\mf}[1]{\ensuremath{\mathfrak{#1}}} \providecommand{\mfa}{\ensuremath{\mathfrak{a}}} \providecommand{\mfb}{\ensuremath{\mathfrak{b}}} \providecommand{\mfc}{\ensuremath{\mathfrak{c}}} \providecommand{\mfd}{\ensuremath{\mathfrak{d}}} \providecommand{\mfe}{\ensuremath{\mathfrak{e}}} \providecommand{\mff}{\ensuremath{\mathfrak{f}}} \providecommand{\mfg}{\ensuremath{\mathfrak{g}}} \providecommand{\mfh}{\ensuremath{\mathfrak{h}}} \providecommand{\mfi}{\ensuremath{\mathfrak{i}}} \providecommand{\mfj}{\ensuremath{\mathfrak{j}}} \providecommand{\mfk}{\ensuremath{\mathfrak{k}}} \providecommand{\mfl}{\ensuremath{\mathfrak{l}}} \providecommand{\mfm}{\ensuremath{\mathfrak{m}}} \providecommand{\mfn}{\ensuremath{\mathfrak{n}}} \providecommand{\mfo}{\ensuremath{\mathfrak{o}}} \providecommand{\mfp}{\ensuremath{\mathfrak{p}}} \providecommand{\mfq}{\ensuremath{\mathfrak{q}}} \providecommand{\mfr}{\ensuremath{\mathfrak{r}}} \providecommand{\mfs}{\ensuremath{\mathfrak{s}}} \providecommand{\mft}{\ensuremath{\mathfrak{t}}} \providecommand{\mfu}{\ensuremath{\mathfrak{u}}} \providecommand{\mfv}{\ensuremath{\mathfrak{v}}} \providecommand{\mfw}{\ensuremath{\mathfrak{w}}} \providecommand{\mfx}{\ensuremath{\mathfrak{x}}} \providecommand{\mfy}{\ensuremath{\mathfrak{y}}} \providecommand{\mfz}{\ensuremath{\mathfrak{z}}} \providecommand{\mfA}{\ensuremath{\mathfrak{A}}} \providecommand{\mfB}{\ensuremath{\mathfrak{B}}} \providecommand{\mfC}{\ensuremath{\mathfrak{C}}} \providecommand{\mfD}{\ensuremath{\mathfrak{D}}} \providecommand{\mfE}{\ensuremath{\mathfrak{E}}} \providecommand{\mfF}{\ensuremath{\mathfrak{F}}} \providecommand{\mfG}{\ensuremath{\mathfrak{G}}} \providecommand{\mfH}{\ensuremath{\mathfrak{H}}} \providecommand{\mfI}{\ensuremath{\mathfrak{I}}} \providecommand{\mfJ}{\ensuremath{\mathfrak{J}}} \providecommand{\mfK}{\ensuremath{\mathfrak{K}}} \providecommand{\mfL}{\ensuremath{\mathfrak{L}}} \providecommand{\mfM}{\ensuremath{\mathfrak{M}}} \providecommand{\mfN}{\ensuremath{\mathfrak{N}}} \providecommand{\mfO}{\ensuremath{\mathfrak{O}}} \providecommand{\mfP}{\ensuremath{\mathfrak{P}}} \providecommand{\mfQ}{\ensuremath{\mathfrak{Q}}} \providecommand{\mfR}{\ensuremath{\mathfrak{R}}} \providecommand{\mfS}{\ensuremath{\mathfrak{S}}} \providecommand{\mfT}{\ensuremath{\mathfrak{T}}} \providecommand{\mfU}{\ensuremath{\mathfrak{U}}} \providecommand{\mfV}{\ensuremath{\mathfrak{V}}} \providecommand{\mfW}{\ensuremath{\mathfrak{W}}} \providecommand{\mfX}{\ensuremath{\mathfrak{X}}} \providecommand{\mfY}{\ensuremath{\mathfrak{Y}}} \providecommand{\mfZ}{\ensuremath{\mathfrak{Z}}} \providecommand{\frak}[1]{\ensuremath{\mathfrak{#1}}} \providecommand{\fraka}{\ensuremath{\mathfrak{a}}} \providecommand{\frakb}{\ensuremath{\mathfrak{b}}} \providecommand{\frakc}{\ensuremath{\mathfrak{c}}} \providecommand{\frakd}{\ensuremath{\mathfrak{d}}} \providecommand{\frake}{\ensuremath{\mathfrak{e}}} \providecommand{\frakf}{\ensuremath{\mathfrak{f}}} \providecommand{\frakg}{\ensuremath{\mathfrak{g}}} \providecommand{\frakh}{\ensuremath{\mathfrak{h}}} \providecommand{\fraki}{\ensuremath{\mathfrak{i}}} \providecommand{\frakj}{\ensuremath{\mathfrak{j}}} \providecommand{\frakk}{\ensuremath{\mathfrak{k}}} \providecommand{\frakl}{\ensuremath{\mathfrak{l}}} \providecommand{\frakm}{\ensuremath{\mathfrak{m}}} \providecommand{\frakn}{\ensuremath{\mathfrak{n}}} \providecommand{\frako}{\ensuremath{\mathfrak{o}}} \providecommand{\frakp}{\ensuremath{\mathfrak{p}}} \providecommand{\frakq}{\ensuremath{\mathfrak{q}}} \providecommand{\frakr}{\ensuremath{\mathfrak{r}}} \providecommand{\fraks}{\ensuremath{\mathfrak{s}}} \providecommand{\frakt}{\ensuremath{\mathfrak{t}}} \providecommand{\fraku}{\ensuremath{\mathfrak{u}}} \providecommand{\frakv}{\ensuremath{\mathfrak{v}}} \providecommand{\frakw}{\ensuremath{\mathfrak{w}}} \providecommand{\frakx}{\ensuremath{\mathfrak{x}}} \providecommand{\fraky}{\ensuremath{\mathfrak{y}}} \providecommand{\frakz}{\ensuremath{\mathfrak{z}}} \providecommand{\frakA}{\ensuremath{\mathfrak{A}}} \providecommand{\frakB}{\ensuremath{\mathfrak{B}}} \providecommand{\frakC}{\ensuremath{\mathfrak{C}}} \providecommand{\frakD}{\ensuremath{\mathfrak{D}}} \providecommand{\frakE}{\ensuremath{\mathfrak{E}}} \providecommand{\frakF}{\ensuremath{\mathfrak{F}}} \providecommand{\frakG}{\ensuremath{\mathfrak{G}}} \providecommand{\frakH}{\ensuremath{\mathfrak{H}}} \providecommand{\frakI}{\ensuremath{\mathfrak{I}}} \providecommand{\frakJ}{\ensuremath{\mathfrak{J}}} \providecommand{\frakK}{\ensuremath{\mathfrak{K}}} \providecommand{\frakL}{\ensuremath{\mathfrak{L}}} \providecommand{\frakM}{\ensuremath{\mathfrak{M}}} \providecommand{\frakN}{\ensuremath{\mathfrak{N}}} \providecommand{\frakO}{\ensuremath{\mathfrak{O}}} \providecommand{\frakP}{\ensuremath{\mathfrak{P}}} \providecommand{\frakQ}{\ensuremath{\mathfrak{Q}}} \providecommand{\frakR}{\ensuremath{\mathfrak{R}}} \providecommand{\frakS}{\ensuremath{\mathfrak{S}}} \providecommand{\frakT}{\ensuremath{\mathfrak{T}}} \providecommand{\frakU}{\ensuremath{\mathfrak{U}}} \providecommand{\frakV}{\ensuremath{\mathfrak{V}}} \providecommand{\frakW}{\ensuremath{\mathfrak{W}}} \providecommand{\frakX}{\ensuremath{\mathfrak{X}}} \providecommand{\frakY}{\ensuremath{\mathfrak{Y}}} \providecommand{\frakZ}{\ensuremath{\mathfrak{Z}}} %# mathscr 的捷径 %# Shortcuts for script shape \providecommand{\ms}[1]{\ensuremath{\mathscr{#1}}} \providecommand{\msA}{\ensuremath{\mathscr{A}}} \providecommand{\msB}{\ensuremath{\mathscr{B}}} \providecommand{\msC}{\ensuremath{\mathscr{C}}} \providecommand{\msD}{\ensuremath{\mathscr{D}}} \providecommand{\msE}{\ensuremath{\mathscr{E}}} \providecommand{\msF}{\ensuremath{\mathscr{F}}} \providecommand{\msG}{\ensuremath{\mathscr{G}}} \providecommand{\msH}{\ensuremath{\mathscr{H}}} \providecommand{\msI}{\ensuremath{\mathscr{I}}} \providecommand{\msJ}{\ensuremath{\mathscr{J}}} \providecommand{\msK}{\ensuremath{\mathscr{K}}} \providecommand{\msL}{\ensuremath{\mathscr{L}}} \providecommand{\msM}{\ensuremath{\mathscr{M}}} \providecommand{\msN}{\ensuremath{\mathscr{N}}} \providecommand{\msO}{\ensuremath{\mathscr{O}}} \providecommand{\msP}{\ensuremath{\mathscr{P}}} \providecommand{\msQ}{\ensuremath{\mathscr{Q}}} \providecommand{\msR}{\ensuremath{\mathscr{R}}} \providecommand{\msS}{\ensuremath{\mathscr{S}}} \providecommand{\msT}{\ensuremath{\mathscr{T}}} \providecommand{\msU}{\ensuremath{\mathscr{U}}} \providecommand{\msV}{\ensuremath{\mathscr{V}}} \providecommand{\msW}{\ensuremath{\mathscr{W}}} \providecommand{\msX}{\ensuremath{\mathscr{X}}} \providecommand{\msY}{\ensuremath{\mathscr{Y}}} \providecommand{\msZ}{\ensuremath{\mathscr{Z}}} \providecommand{\scr}[1]{\ensuremath{\mathscr{#1}}} \providecommand{\scrA}{\ensuremath{\mathscr{A}}} \providecommand{\scrB}{\ensuremath{\mathscr{B}}} \providecommand{\scrC}{\ensuremath{\mathscr{C}}} \providecommand{\scrD}{\ensuremath{\mathscr{D}}} \providecommand{\scrE}{\ensuremath{\mathscr{E}}} \providecommand{\scrF}{\ensuremath{\mathscr{F}}} \providecommand{\scrG}{\ensuremath{\mathscr{G}}} \providecommand{\scrH}{\ensuremath{\mathscr{H}}} \providecommand{\scrI}{\ensuremath{\mathscr{I}}} \providecommand{\scrJ}{\ensuremath{\mathscr{J}}} \providecommand{\scrK}{\ensuremath{\mathscr{K}}} \providecommand{\scrL}{\ensuremath{\mathscr{L}}} \providecommand{\scrM}{\ensuremath{\mathscr{M}}} \providecommand{\scrN}{\ensuremath{\mathscr{N}}} \providecommand{\scrO}{\ensuremath{\mathscr{O}}} \providecommand{\scrP}{\ensuremath{\mathscr{P}}} \providecommand{\scrQ}{\ensuremath{\mathscr{Q}}} \providecommand{\scrR}{\ensuremath{\mathscr{R}}} \providecommand{\scrS}{\ensuremath{\mathscr{S}}} \providecommand{\scrT}{\ensuremath{\mathscr{T}}} \providecommand{\scrU}{\ensuremath{\mathscr{U}}} \providecommand{\scrV}{\ensuremath{\mathscr{V}}} \providecommand{\scrW}{\ensuremath{\mathscr{W}}} \providecommand{\scrX}{\ensuremath{\mathscr{X}}} \providecommand{\scrY}{\ensuremath{\mathscr{Y}}} \providecommand{\scrZ}{\ensuremath{\mathscr{Z}}} %%================================ %% General symbols %%================================ \providecommand{\abs}[1]{\lvert#1\rvert} \providecommand{\norm}[1]{\lVert#1\rVert} \providecommand*{\injection}{\ensuremath{\hookrightarrow}} \providecommand*{\surjection}{\ensuremath{\twoheadrightarrow}} \providecommand*{\bijection}{\ensuremath{\xrightarrow{\sim}}} %%================================ %% Symbols for number theory %%================================ \ifdefined\@@pmod\else \let\@@pmod\pmod \DeclareRobustCommand{\pmod}{\@ifstar\@pmods\@@pmod} \def\@pmods#1{\mkern4mu({\operator@font mod}\mkern 6mu#1)} \fi \providecommand{\genlegendre}[4]{% \genfrac{(}{)}{}{#1}{#3}{#4}% \if\relax\detokenize{#2}\relax\else_{\!#2}\fi% } \providecommand{\legendre}[3][]{\genlegendre{}{#1}{#2}{#3}} \providecommand{\dlegendre}[3][]{\genlegendre{0}{#1}{#2}{#3}} \providecommand{\tlegendre}[3][]{\genlegendre{1}{#1}{#2}{#3}} % % %<*PJLpaper> \RequirePackage{ifthen} %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{% family = @PJLpaper, prefix = @PJLpaper@, setkeys=\kvsetkeys } \DeclareStringOption[normal]{paperstyle} %# 几种纸张颜色的选项 %# Several options of different paper color style \DeclareVoidOption{yellowpaper}{\kvsetkeys{@PJLpaper}{paperstyle=yellow}} \DeclareVoidOption{darkpaper}{\kvsetkeys{@PJLpaper}{paperstyle=dark}} \DeclareVoidOption{nordpaper}{\kvsetkeys{@PJLpaper}{paperstyle=nord}} %# 预览模式:减去边框 %# Preview mode: crop the edge \DeclareBoolOption[false]{preview} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %%================================ %% Preview mode %%================================ \ifdefined\PJLnoPreview\else% \if@PJLpaper@preview% \RequirePackage{calc} \AtEndPreamble{% \setlength{\paperwidth}{\textwidth*\real{1.05}}% \setlength{\paperheight}{% (\textheight+\headheight+\headsep+\footskip)*\real{1.05}}% \setlength{\oddsidemargin}{(\paperwidth-\textwidth)/2-1in}% \setlength{\evensidemargin}{(\paperwidth-\textwidth)/2-1in}% \setlength{\topmargin}{(\paperheight-\textheight-\headheight-\headsep-\footskip)/2- 1in}% } \fi \fi %%================================ %% Paper color %%================================ \RequirePackage{xcolor} \definecolor{paper}{RGB}{255,255,255} \definecolor{maintext}{RGB}{0,0,0} \ifthenelse{\equal{\@PJLpaper@paperstyle}{yellow}} { \definecolor{paper}{RGB}{247,246,233} } {\relax} \ifthenelse{\equal{\@PJLpaper@paperstyle}{dark}} { \definecolor{paper}{RGB}{30,30,30} \definecolor{maintext}{RGB}{207,207,207} } {\relax} \ifthenelse{\equal{\@PJLpaper@paperstyle}{nord}} { \definecolor{paper}{RGB}{46,52,64} \definecolor{maintext}{RGB}{214,220,230} } {\relax} \newcommand{\PJLglobalcolor}[1]{% \color{#1}\global\let\default@color\current@color } %# 设置纸张颜色、文字颜色 %# Set the paper and text color \pagecolor{paper} \PJLglobalcolor{maintext} \AtEndPreamble{ \ifdefined\tcbset% \tcbset{colupper=maintext,collower=maintext} \fi } % % %<*PJLthm> %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{% family = @PJLthm, prefix = @PJLthm@ } %# 不建立定理类环境 %# Do not setup theorem-like environments \DeclareBoolOption[false]{nothms} %# 推迟建立定理类环境 %# Delay the setup of theorem-like environments to the end of the preamble \DeclareBoolOption[false]{delaythms} %# 不编号定理类环境 %# Do not number theorem-like environments \DeclareBoolOption[false]{nothmnum} %# 指定如何编号定理类环境 %# Number theorem-like environments With ... \DeclareStringOption{thmnum}[PJL@thmnum@default] %# 草稿模式或快速模式 %# Draft mode or fast mode \DeclareBoolOption[false]{draft} \DeclareBoolOption[false]{fast} %# 引用的名称将随当前语言的不同而改变 %# Reference name will change with the current language \DeclareBoolOption[true]{regionalref} \DeclareBoolOption[false]{originalref} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %# 下面的代码设定了选项之间的关系 %# The following code sets the relationship between options \if@PJLthm@originalref \@PJLthm@regionalreffalse \fi \if@PJLthm@draft \@PJLthm@fasttrue \fi \if@PJLthm@fast \@PJLthm@regionalreftrue \fi \RequirePackage{PJLlang} \RequirePackage{amsmath,amsthm} \RequirePackage{aliascnt} \PassOptionsToPackage{nameinlink}{cleveref} \RequirePackage{cleveref} %# 用于命名定理类环境的用户命令 %# Macro for naming theorems \NewDocumentCommand{\NameTheorem}{omm}{% \protected@edef\PJLthm@temp{#2}% \expandafter\IfEndWith\expandafter{\PJLthm@temp}{*}{% \expandafter\StrGobbleRight\expandafter{\PJLthm@temp}{1}[\PJLthm@temp]% }{}% \IfValueTF{#1}{% \expandafter\def\expandafter\PJL@temp@abbr\expandafter% {\expandafter\StrToABBR\expandafter{#1}}% \expandafter\def\csname\PJLthm@temp name\PJL@temp@abbr\endcsname{#3}% }{% \expandafter\def\csname\PJLthm@temp nameEN\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameFR\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameDE\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameIT\endcsname{#3}% \expandafter\def\csname\PJLthm@temp namePT\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameBR\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameES\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameCN\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameTC\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameJP\endcsname{#3}% \expandafter\def\csname\PJLthm@temp nameRU\endcsname{#3}% }% } %# 用于创建定理类环境的用户命令 %# Macro for creating theorems \RequirePackage{xstring} \newcommand\PassFirstToSecond[2]{#2{#1}}% \NewDocumentCommand{\CreateTheorem}{sm}{% \begingroup \protected@edef\PJLthm@temp{#2}% \expandafter\IfEndWith\expandafter{\PJLthm@temp}{*}{% \expandafter\StrGobbleRight\expandafter{\PJLthm@temp}{1}[\PJLthm@temp]% \PassFirstToSecond{*}% }{% \PassFirstToSecond{}% }% {\expandafter\PassFirstToSecond% \expandafter{\PJLthm@temp}{\endgroup\InnerCreateTheorem{#1}}}% }% \if@PJLthm@regionalref \NewDocumentCommand{\InnerCreateTheorem}{mmmod<>d()}{% % #1 = star or no star % #2 = name of environment % #3 = emptiness or star to append to name of environment % #4 = numbered like % #5 = numbered within % #6 = existed environment \IfBooleanTF{#1}{% \IfValueTF{#4} {\@firstoftwo} {\IfValueTF{#5}{\@firstoftwo}{\@secondoftwo}}% }{% \IfValueTF{#4} {\IfValueTF{#5}{\@firstoftwo}{\@secondoftwo}}{ \@secondoftwo} }% {% \GenericError{}% {\string\CreateTheorem\space syntax error\on@line}{% You cannot call the starred variant with optional argument,\MessageBreak nor call the unstarred variant with several optional arguments.}% {}% }{% \IfValueTF{#6}{% \IfBooleanTF{#1}{% \ifcsmacro{#2#3}% {\renewenvironment{#2#3}{\begin{#6*}}{\end{#6*}}}% {\newenvironment{#2#3}{\begin{#6*}}{\end{#6*}}}% }{% \ifcsmacro{#2#3}% {\renewenvironment{#2#3}{\begin{#6}}{\end{#6}}}% {\newenvironment{#2#3}{\begin{#6}}{\end{#6}}}% } }{% \IfBooleanTF{#1}{% \newtheorem*{#2#3}{\csname#2name\csname\languagename ABBR\endcsname\endcsname} }{% \IfValueTF{#5}{% \newtheorem{PJL#2#3}{\csname#2name\csname\languagename ABBR\endcsname\endcsname}[#5]% \newaliascnt{#2#3}{PJL#2#3}% }{% \IfValueTF{#4}{% \newtheorem{PJL#2#3}[#4]{\csname#2name\csname\languagename ABBR\endcsname\endcsname} }{% \newtheorem{PJL#2#3}{\csname#2name\csname\languagename ABBR\endcsname\endcsname} \newaliascnt{#2#3}{PJL#2#3}% }% }% \crefname{PJL#2#3}% {\csname#2name\csname\languagename ABBR\endcsname\endcsname}% {\csname#2name\csname\languagename ABBR\endcsname\endcsname}% \Crefname{PJL#2#3}% {\csname#2name\csname\languagename ABBR\endcsname\endcsname}% {\csname#2name\csname\languagename ABBR\endcsname\endcsname}% \NewDocumentEnvironment{#2#3}{} {\begin{PJL#2#3}} {\end{PJL#2#3}} }% }% }% }% \else \NewDocumentCommand{\InnerCreateTheorem}{mmmod<>d()}{% % #1 = Tokens denoting an xparse-boolean value; % value "true" -> the call was \CreateTheorem*{...}... % value "false" -> the call was \CreateTheorem{...}... % This indicates whether the "starred" variant or the % "unstarred" variant of \CreateTheorem was called. % #2 = Name of environment to define. One trailing % star is removed from the environment-name provided % to \CreateTheorem if that environment-name has % trailing stars. % #3 = If the environment-name provided to \CreateTheorem has % trailing stars: A star (*). % If the environment-name provided to \CreateTheorem has % no trailing stars: Empty/no tokens at all. % #4 = numbered like=name of counter like which the environment % shall be numbered. % #5 = numbered within=name of counter which is superordinate % to the environment's counter and whose stepping resets % the environment's counter. % #6 = existed environment name (the environment to copy) \IfBooleanTF{#1}{% \IfValueTF{#4} {\@firstoftwo} {\IfValueTF{#5}{\@firstoftwo}{\@secondoftwo}}% }{% \IfValueTF{#4} {\IfValueTF{#5}{\@firstoftwo}{\@secondoftwo}}{ \@secondoftwo} }% {% \GenericError{}% {\string\CreateTheorem\space syntax error\on@line}{% You cannot call the starred variant with optional argument,\MessageBreak nor call the unstarred variant with several optional arguments.}% {% Allowed usage:\MessageBreak\MessageBreak \CreateTheorem*{(name of environment)}\MessageBreak \CreateTheorem{(name of environment)}\MessageBreak \CreateTheorem{(name of environment)}[(numbered like)]\MessageBreak \CreateTheorem{(name of environment)}<(numbered within)>\MessageBreak \CreateTheorem{(name of environment)}((existed environment))\MessageBreak }% }{% \IfValueTF{#6}{% \IfBooleanTF{#1}{% \ifcsmacro{#2#3}% {\renewenvironment{#2#3}{\begin{#6*}}{\end{#6*}}}% {\newenvironment{#2#3}{\begin{#6*}}{\end{#6*}}}% }{% \ifcsmacro{#2#3}% {\renewenvironment{#2#3}{\begin{#6}}{\end{#6}}}% {\newenvironment{#2#3}{\begin{#6}}{\end{#6}}}% } }{% \IfBooleanTF{#1}{% % \newtheorem*{#2EN#3}{\csname#2nameEN\endcsname}% % \newtheorem*{#2FR#3}{\csname#2nameFR\endcsname}% % \newtheorem*{#2DE#3}{\csname#2nameDE\endcsname}% % \newtheorem*{#2IT#3}{\csname#2nameIT\endcsname}% % \newtheorem*{#2PT#3}{\csname#2namePT\endcsname}% % \newtheorem*{#2BR#3}{\csname#2nameBR\endcsname}% % \newtheorem*{#2ES#3}{\csname#2nameES\endcsname}% % \newtheorem*{#2CN#3}{\csname#2nameCN\endcsname}% % \newtheorem*{#2TC#3}{\csname#2nameTC\endcsname}% % \newtheorem*{#2JP#3}{\csname#2nameJP\endcsname}% % \newtheorem*{#2RU#3}{\csname#2nameRU\endcsname}% \if@PJLlang@enable@EN\expandafter\PassFirstToSecond\expandafter{\csname#2nameEN\endcsname}{\newtheorem*{#2EN#3}}\fi% \if@PJLlang@enable@FR\expandafter\PassFirstToSecond\expandafter{\csname#2nameFR\endcsname}{\newtheorem*{#2FR#3}}\fi% \if@PJLlang@enable@DE\expandafter\PassFirstToSecond\expandafter{\csname#2nameDE\endcsname}{\newtheorem*{#2DE#3}}\fi% \if@PJLlang@enable@IT\expandafter\PassFirstToSecond\expandafter{\csname#2nameIT\endcsname}{\newtheorem*{#2IT#3}}\fi% \if@PJLlang@enable@PT\expandafter\PassFirstToSecond\expandafter{\csname#2namePT\endcsname}{\newtheorem*{#2PT#3}}\fi% \if@PJLlang@enable@BR\expandafter\PassFirstToSecond\expandafter{\csname#2nameBR\endcsname}{\newtheorem*{#2BR#3}}\fi% \if@PJLlang@enable@ES\expandafter\PassFirstToSecond\expandafter{\csname#2nameES\endcsname}{\newtheorem*{#2ES#3}}\fi% \if@PJLlang@enable@CN\expandafter\PassFirstToSecond\expandafter{\csname#2nameCN\endcsname}{\newtheorem*{#2CN#3}}\fi% \if@PJLlang@enable@TC\expandafter\PassFirstToSecond\expandafter{\csname#2nameTC\endcsname}{\newtheorem*{#2TC#3}}\fi% \if@PJLlang@enable@JP\expandafter\PassFirstToSecond\expandafter{\csname#2nameJP\endcsname}{\newtheorem*{#2JP#3}}\fi% \if@PJLlang@enable@RU\expandafter\PassFirstToSecond\expandafter{\csname#2nameRU\endcsname}{\newtheorem*{#2RU#3}}\fi% }{% \IfValueTF{#5}{% \newcounter{#2#3}[{#5}]% \expandafter\renewcommand\expandafter*% \csname the#2#3\expandafter\endcsname% \expandafter{\csname the#5\endcsname.\arabic{#2#3}}% }{% \IfValueTF{#4} {\newaliascnt{#2#3}{#4}} {\newcounter{#2#3}}% }% %--------------------------------------------------------------- \if@PJLlang@enable@EN\CreateTheoremNumberedLikeAliasCounter{#2}{EN}{#3}\fi% \if@PJLlang@enable@FR\CreateTheoremNumberedLikeAliasCounter{#2}{FR}{#3}\fi% \if@PJLlang@enable@DE\CreateTheoremNumberedLikeAliasCounter{#2}{DE}{#3}\fi% \if@PJLlang@enable@IT\CreateTheoremNumberedLikeAliasCounter{#2}{IT}{#3}\fi% \if@PJLlang@enable@PT\CreateTheoremNumberedLikeAliasCounter{#2}{PT}{#3}\fi% \if@PJLlang@enable@BR\CreateTheoremNumberedLikeAliasCounter{#2}{BR}{#3}\fi% \if@PJLlang@enable@ES\CreateTheoremNumberedLikeAliasCounter{#2}{ES}{#3}\fi% \if@PJLlang@enable@CN\CreateTheoremNumberedLikeAliasCounter{#2}{CN}{#3}\fi% \if@PJLlang@enable@TC\CreateTheoremNumberedLikeAliasCounter{#2}{TC}{#3}\fi% \if@PJLlang@enable@JP\CreateTheoremNumberedLikeAliasCounter{#2}{JP}{#3}\fi% \if@PJLlang@enable@RU\CreateTheoremNumberedLikeAliasCounter{#2}{RU}{#3}\fi% %--------------------------------------------------------------- }% \NewDocumentEnvironment{#2#3}{} {\csname#2\csname\languagename ABBR\endcsname#3\endcsname}% {\csname end#2\csname\languagename ABBR\endcsname#3\endcsname}% }% }% }% \NewDocumentCommand{\CreateTheoremNumberedLikeAliasCounter}{mmm}{% \newaliascnt{#1#2#3}{#1#3}% % \newtheorem{#1#2#3}[{#1#2#3}]{\csname#1name#2\endcsname}% \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}{\newtheorem{#1#2#3}[{#1#2#3}]}% \aliascntresetthe{#1#2#3}% % \crefname{#1#2#3}% % {\csname#1name#2\endcsname}% % {\csname#1name#2\endcsname}% % \Crefname{#1#2#3}% % {\csname#1name#2\endcsname}% % {\csname#1name#2\endcsname}% \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}% {% \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}% {\crefname{#1#2#3}}% }% \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}% {% \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}% {\Crefname{#1#2#3}}% }% }% \fi %# 英文定理名称 %# English theorems names \def\theoremnameEN{{Theorem}} \def\lemmanameEN{{Lemma}} \def\propositionnameEN{{Proposition}} \def\corollarynameEN{{Corollary}} \def\propertynameEN{{Property}} \def\factnameEN{{Fact}} \def\conjecturenameEN{{Conjecture}} \def\definitionnameEN{{Definition}} \def\axiomnameEN{{Axiom}} \def\assumptionnameEN{{Assumption}} \def\conventionnameEN{{Convention}} \def\hypothesisnameEN{{Hypothesis}} \def\notationnameEN{{Notation}} \def\examplenameEN{{Example}} \def\problemnameEN{{Problem}} \def\questionnameEN{{Question}} \def\exercisenameEN{{Exercise}} \def\remarknameEN{{Remark}} \def\observationnameEN{{Observation}} \expandafter\def\csname definition-propositionnameEN\endcsname{\definitionnameEN-\propositionnameEN} \expandafter\def\csname definition-theoremnameEN\endcsname{\definitionnameEN-\theoremnameEN} %# 法语定理名称 %# French theorems names \def\theoremnameFR{{Théorème}} \def\lemmanameFR{{Lemme}} \def\propositionnameFR{{Proposition}} \def\corollarynameFR{{Corollaire}} \def\propertynameFR{{Propriété}} \def\factnameFR{{Fait}} \def\conjecturenameFR{{Conjecture}} \def\definitionnameFR{{Définition}} \def\axiomnameFR{{Axiome}} \def\assumptionnameFR{{Supposition}} \def\conventionnameFR{{Convention}} \def\hypothesisnameFR{{Hypothèse}} \def\notationnameFR{{Notation}} \def\examplenameFR{{Exemple}} \def\problemnameFR{{Problème}} \def\questionnameFR{{Question}} \def\exercisenameFR{{Exercice}} \def\remarknameFR{{Remarque}} \def\observationnameFR{{Observation}} \expandafter\def\csname definition-propositionnameFR\endcsname{\definitionnameFR-\propositionnameFR} \expandafter\def\csname definition-theoremnameFR\endcsname{\definitionnameFR-\theoremnameFR} %# 德语定理名称 %# German theorems names \def\theoremnameDE{{Satz}} \def\lemmanameDE{{Lemma}} \def\propositionnameDE{{Proposition}} \def\corollarynameDE{{Korollar}} \def\propertynameDE{{Eigenschaft}} \def\factnameDE{{Fakt}} \def\conjecturenameDE{{Vermutung}} \def\definitionnameDE{{Definition}} \def\axiomnameDE{{Axiom}} \def\assumptionnameDE{{Annahme}} \def\conventionnameDE{{Konvention}} \def\hypothesisnameDE{{Hypothese}} \def\notationnameDE{{Notation}} \def\examplenameDE{{Beispiel}} \def\problemnameDE{{Problem}} \def\questionnameDE{{Frage}} \def\exercisenameDE{{Übung}} \def\remarknameDE{{Bemerkung}} \def\observationnameDE{{Beobachtung}} \expandafter\def\csname definition-propositionnameDE\endcsname{\definitionnameDE-\propositionnameDE} \expandafter\def\csname definition-theoremnameDE\endcsname{\definitionnameDE-\theoremnameDE} %# 意大利语定理名称 %# Italian theorems names \def\theoremnameIT{{Teorema}} \def\lemmanameIT{{Lemma}} \def\propositionnameIT{{Proposizione}} \def\corollarynameIT{{Corollario}} \def\propertynameIT{{Proprietà}} \def\factnameIT{{Fatto}} \def\conjecturenameIT{{Congettura}} \def\definitionnameIT{{Definizione}} \def\axiomnameIT{{Assioma}} \def\assumptionnameIT{{Supposizione}} \def\conventionnameIT{{Convenzione}} \def\hypothesisnameIT{{Ipotesi}} \def\notationnameIT{{Notazione}} \def\examplenameIT{{Esempio}} \def\problemnameIT{{Problema}} \def\questionnameIT{{Domanda}} \def\exercisenameIT{{Esercizio}} \def\remarknameIT{{Nota}} \def\observationnameIT{{Osservazione}} \expandafter\def\csname definition-propositionnameIT\endcsname{\definitionnameIT-\propositionnameIT} \expandafter\def\csname definition-theoremnameIT\endcsname{\definitionnameIT-\theoremnameIT} %# 葡萄牙语定理名称 %# Portuguese theorems names \def\theoremnamePT{{Teorema}} \def\lemmanamePT{{Lema}} \def\propositionnamePT{{Proposição}} \def\corollarynamePT{{Corolário}} \def\propertynamePT{{Propriedade}} \def\factnamePT{{Facto}} \def\conjecturenamePT{{Conjetura}} \def\definitionnamePT{{Definição}} \def\axiomnamePT{{Axioma}} \def\assumptionnamePT{{Suposição}} \def\conventionnamePT{{Convenção}} \def\hypothesisnamePT{{Hipótese}} \def\notationnamePT{{Notação}} \def\examplenamePT{{Exemplo}} \def\problemnamePT{{Problema}} \def\questionnamePT{{Pergunta}} \def\exercisenamePT{{Exercício}} \def\remarknamePT{{Comentário}} \def\observationnamePT{{Observação}} \expandafter\def\csname definition-propositionnamePT\endcsname{\definitionnamePT-\propositionnamePT} \expandafter\def\csname definition-theoremnamePT\endcsname{\definitionnamePT-\theoremnamePT} %# 巴西葡萄牙语定理名称 %# Brazilian theorems names \def\theoremnameBR{{Teorema}} \def\lemmanameBR{{Lema}} \def\propositionnameBR{{Proposição}} \def\corollarynameBR{{Corolário}} \def\propertynameBR{{Propriedade}} \def\factnameBR{{Facto}} \def\conjecturenameBR{{Conjetura}} \def\definitionnameBR{{Definição}} \def\axiomnameBR{{Axioma}} \def\assumptionnameBR{{Suposição}} \def\conventionnameBR{{Convenção}} \def\hypothesisnameBR{{Hipótese}} \def\notationnameBR{{Notação}} \def\examplenameBR{{Exemplo}} \def\problemnameBR{{Problema}} \def\questionnameBR{{Pergunta}} \def\exercisenameBR{{Exercício}} \def\remarknameBR{{Comentário}} \def\observationnameBR{{Observação}} \expandafter\def\csname definition-propositionnameBR\endcsname{\definitionnameBR-\propositionnameBR} \expandafter\def\csname definition-theoremnameBR\endcsname{\definitionnameBR-\theoremnameBR} %# 西班牙语定理名称 %# Spanish theorems names \def\theoremnameES{{Teorema}} \def\lemmanameES{{Lema}} \def\propositionnameES{{Proposición}} \def\corollarynameES{{Corolario}} \def\propertynameES{{Propiedad}} \def\factnameES{{Hecho}} \def\conjecturenameES{{Conjetura}} \def\definitionnameES{{Definición}} \def\axiomnameES{{Axioma}} \def\assumptionnameES{{Suposición}} \def\conventionnameES{{Convención}} \def\hypothesisnameES{{Hipótesis}} \def\notationnameES{{Notación}} \def\examplenameES{{Ejemplo}} \def\problemnameES{{Problema}} \def\questionnameES{{Pregunta}} \def\exercisenameES{{Ejercicio}} \def\remarknameES{{Comentario}} \def\observationnameES{{Observación}} \expandafter\def\csname definition-propositionnameES\endcsname{\definitionnameES-\propositionnameES} \expandafter\def\csname definition-theoremnameES\endcsname{\definitionnameES-\theoremnameES} %# 中文定理名称 %# Chinese theorems names \def\theoremnameCN{{定理}} \def\lemmanameCN{{引理}} \def\propositionnameCN{{命题}} \def\corollarynameCN{{推论}} \def\propertynameCN{{性质}} \def\factnameCN{{事实}} \def\conjecturenameCN{{猜想}} \def\definitionnameCN{{定义}} \def\axiomnameCN{{公理}} \def\assumptionnameCN{{假设}} \def\conventionnameCN{{约定}} \def\hypothesisnameCN{{假设}} \def\notationnameCN{{记号}} \def\examplenameCN{{例}} \def\problemnameCN{{问题}} \def\questionnameCN{{问题}} \def\exercisenameCN{{练习}} \def\remarknameCN{{备注}} \def\observationnameCN{{观察}} \expandafter\def\csname definition-propositionnameCN\endcsname{\definitionnameCN-\propositionnameCN} \expandafter\def\csname definition-theoremnameCN\endcsname{\definitionnameCN-\theoremnameCN} \def\theoremnameTC{{定理}} \def\lemmanameTC{{引理}} \def\propositionnameTC{{命題}} \def\corollarynameTC{{推論}} \def\propertynameTC{{性質}} \def\factnameTC{{事實}} \def\conjecturenameTC{{猜想}} \def\definitionnameTC{{定義}} \def\axiomnameTC{{公理}} \def\assumptionnameTC{{假設}} \def\conventionnameTC{{約定}} \def\hypothesisnameTC{{假設}} \def\notationnameTC{{記號}} \def\examplenameTC{{例}} \def\problemnameTC{{問題}} \def\questionnameTC{{問題}} \def\exercisenameTC{{練習}} \def\remarknameTC{{備註}} \def\observationnameTC{{觀察}} \expandafter\def\csname definition-propositionnameTC\endcsname{\definitionnameTC-\propositionnameTC} \expandafter\def\csname definition-theoremnameTC\endcsname{\definitionnameTC-\theoremnameTC} %# 日文定理名称 %# Japanese theorems names \def\theoremnameJP{{定理}} \def\lemmanameJP{{補題}} \def\propositionnameJP{{命題}} \def\corollarynameJP{{系}} \def\propertynameJP{{性質}} \def\factnameJP{{事実}} \def\conjecturenameJP{{予想}} \def\definitionnameJP{{定義}} \def\axiomnameJP{{公理}} \def\assumptionnameJP{{仮定}} \def\conventionnameJP{{慣例}} \def\hypothesisnameJP{{仮設}} \def\notationnameJP{{記法}} \def\examplenameJP{{例}} \def\problemnameJP{{問題}} \def\questionnameJP{{問題}} \def\exercisenameJP{{練習}} \def\remarknameJP{{注釈}} \def\observationnameJP{{観察}} \expandafter\def\csname definition-propositionnameJP\endcsname{\definitionnameJP-\propositionnameJP} \expandafter\def\csname definition-theoremnameJP\endcsname{\definitionnameJP-\theoremnameJP} %# 俄文定理名称 %# Russian theorems names \def\theoremnameRU{{Теорема}} % Теоре́ма \def\lemmanameRU{{Лемма}} % Ле́мма \def\propositionnameRU{{Предложение}} % Предложе́ние \def\corollarynameRU{{Следствие}} % Сле́дствие \def\propertynameRU{{Имущество}} % Иму́щество \def\factnameRU{{Факт}} \def\conjecturenameRU{{Гипотеза}} % Гипо́теза \def\definitionnameRU{{Определение}} % Определе́ние \def\axiomnameRU{{Аксиома}} % Аксио́ма \def\assumptionnameRU{{Предположение}} % Предположе́ние \def\conventionnameRU{{Конвенция}} % Конве́нция \def\hypothesisnameRU{{Гипотеза}} % Гипо́теза \def\notationnameRU{{Нотация}} % Нота́ция \def\examplenameRU{{Пример}} % Приме́р \def\problemnameRU{{Проблема}} % Пробле́ма \def\questionnameRU{{Вопрос}} % Вопро́с \def\exercisenameRU{{Упражнение}} % Упражне́ние \def\remarknameRU{{Замечание}} % Замеча́ние \def\observationnameRU{{Наблюдение}} % Наблюде́ние \expandafter\def\csname definition-propositionnameRU\endcsname{\definitionnameRU-\propositionnameRU} \expandafter\def\csname definition-theoremnameRU\endcsname{\definitionnameRU-\theoremnameRU} %# 判断最高级别的标题是 section 还是 chapter %# Detect the highest level of title: section or chapter? \newif\ifPJLthm@IsBook \ifdefined\c@chapter\PJLthm@IsBooktrue\else\PJLthm@IsBookfalse\fi \ifbool{PJLthm@IsBook}{ \newaliascnt{PJLthm@highest}{chapter} }{ \newaliascnt{PJLthm@highest}{section} } %# 按照 thmnum 决定定理类环境如何编号 %# Number the theorem-like environment with respect to thmnum \NewDocumentCommand{\CreateTheorem@thmnum}{m}{ \expandafter\ifstrempty\expandafter{\@PJLthm@thmnum}{ \CreateTheorem{#1} }{ \expandafter\ifstrequal\expandafter{\@PJLthm@thmnum}{PJL@thmnum@default}{ \CreateTheorem{#1} }{ \CreateTheorem{#1}<\@PJLthm@thmnum> } } } %# 建立定理类环境 %# Setup theorem-like environments \def\PJLthm@definethms{ \if@PJLthm@nothms\else \if@PJLthm@nothmnum \CreateTheorem*{theorem} \CreateTheorem*{lemma} \CreateTheorem*{proposition} \CreateTheorem*{corollary} \CreateTheorem*{definition-proposition} \CreateTheorem*{definition-theorem} \CreateTheorem*{property} \CreateTheorem*{fact} \CreateTheorem*{conjecture} \else \CreateTheorem@thmnum{theorem} \CreateTheorem{lemma}[theorem] \CreateTheorem{proposition}[theorem] \CreateTheorem{corollary}[theorem] \CreateTheorem{definition-proposition}[theorem] \CreateTheorem{definition-theorem}[theorem] \CreateTheorem{property}[theorem] \CreateTheorem{fact}[theorem] \CreateTheorem{conjecture}[theorem] \fi \CreateTheorem*{theorem*} \CreateTheorem*{lemma*} \CreateTheorem*{proposition*} \CreateTheorem*{corollary*} \CreateTheorem*{definition-proposition*} \CreateTheorem*{definition-theorem*} \CreateTheorem*{property*} \CreateTheorem*{fact*} \CreateTheorem*{conjecture*} \theoremstyle{definition} \if@PJLthm@nothmnum \CreateTheorem*{definition} \CreateTheorem*{axiom} \CreateTheorem*{assumption} \CreateTheorem*{convention} \CreateTheorem*{hypothesis} \CreateTheorem*{notation} \CreateTheorem*{example} \CreateTheorem*{problem} \CreateTheorem*{question} \CreateTheorem*{exercise} \else \CreateTheorem{definition}[theorem] \CreateTheorem{axiom}[theorem] \CreateTheorem{assumption}[theorem] \CreateTheorem{convention}[theorem] \CreateTheorem{hypothesis}[theorem] \CreateTheorem{notation}[theorem] \CreateTheorem{example}[theorem] \CreateTheorem{problem}[theorem] \CreateTheorem{question}[theorem] \CreateTheorem{exercise}[theorem] \fi \CreateTheorem*{definition*} \CreateTheorem*{axiom*} \CreateTheorem*{assumption*} \CreateTheorem*{convention*} \CreateTheorem*{hypothesis*} \CreateTheorem*{notation*} \CreateTheorem*{example*} \CreateTheorem*{problem*} \CreateTheorem*{question*} \CreateTheorem*{exercise*} \theoremstyle{remark} \if@PJLthm@nothmnum \CreateTheorem*{remark} \CreateTheorem*{observation} \else \CreateTheorem@thmnum{remark} \CreateTheorem@thmnum{observation} \fi \CreateTheorem*{remark*} \CreateTheorem*{observation*} \fi %# 按照 thmnum 决定公式如何编号 %# Number the equations with respect to thmnum \expandafter\ifstrempty\expandafter{\@PJLthm@thmnum}{ % thmnum is not used. \numberwithin{equation}{PJLthm@highest} }{ \expandafter\ifstrequal\expandafter{\@PJLthm@thmnum}{PJL@thmnum@default}{ % thmnum is used, with no value. }{ % thmnum is used, with value \@PJLthm@thmnum. \numberwithin{equation}{\@PJLthm@thmnum} } } } % End of \PJLthm@definethms \if@PJLthm@delaythms \AtEndPreamble{\PJLthm@definethms} \else \PJLthm@definethms \fi %# 一些 cref 的本地化 %# Some localization of cref \gappto{\PJLlang@langconfig@CN}{% \crefname{equation}{式}{式}% \crefname{figure}{图}{图}% \crefname{table}{表}{表}% \crefname{appendix}{附录}{附录}% \Crefname{equation}{式}{式}% \Crefname{figure}{图}{图}% \Crefname{table}{表}{表}% \Crefname{appendix}{附录}{附录}% \def\crefpairconjunction{、}% \def\crefmiddleconjunction{、}% \def\creflastconjunction{~和~}% \def\crefpairgroupconjunction{~和~}% \def\crefmiddlegroupconjunction{、}% \def\creflastgroupconjunction{~和~}% \def\crefrangeconjunction{~}% } \gappto{\PJLlang@langconfig@TC}{% \crefname{equation}{式}{式}% \crefname{figure}{圖}{圖}% \crefname{table}{表}{表}% \crefname{appendix}{附錄}{附錄}% \Crefname{equation}{式}{式}% \Crefname{figure}{圖}{圖}% \Crefname{table}{表}{表}% \Crefname{appendix}{附錄}{附錄}% \def\crefpairconjunction{、}% \def\crefmiddleconjunction{、}% \def\creflastconjunction{~與~}% \def\crefpairgroupconjunction{~與~}% \def\crefmiddlegroupconjunction{、}% \def\creflastgroupconjunction{~與~}% \def\crefrangeconjunction{~}% } \gappto{\PJLlang@langconfig@JP}{% \crefname{equation}{式}{式}% \crefname{figure}{図}{図}% \crefname{table}{表}{表}% \Crefname{appendix}{付録}{付録}% \Crefname{equation}{式}{式}% \Crefname{figure}{図}{図}% \Crefname{table}{表}{表}% \Crefname{appendix}{付録}{付録}% \def\crefpairconjunction{~と~}% \def\crefmiddleconjunction{~と~}% \def\creflastconjunction{~と~}% \def\crefpairgroupconjunction{~と~}% \def\crefmiddlegroupconjunction{~と~}% \def\creflastgroupconjunction{~と~}% \def\crefrangeconjunction{〜}% } \gappto{\PJLlang@langconfig@RU}{% \crefname{equation}{уравнение}{уравнения}% \crefname{figure}{рис.}{рис.}% \crefname{table}{таблица}{таблицы}% \crefname{appendix}{приложение}{приложения}% \Crefname{equation}{Уравнение}{Уравнения}% \Crefname{figure}{Рис.}{Рис.}% \Crefname{table}{Таблица}{Таблицы}% \Crefname{appendix}{Приложение}{Приложения}% \def\crefpairconjunction{~и~}% \def\crefmiddleconjunction{,~}% \def\creflastconjunction{~и~}% \def\crefpairgroupconjunction{~и~}% \def\crefmiddlegroupconjunction{,~}% \def\creflastgroupconjunction{~и~}% \def\crefrangeconjunction{~\textasciitilde~}% } \gappto{\PJLlang@langconfig@PT}{% \crefname{equation}{eq.}{eqs.}% \crefname{figure}{fig.}{figs.}% \crefname{table}{tabela}{tabelas}% \crefname{appendix}{apêndice}{apêndices}% \Crefname{equation}{Eq.}{Eqs.}% \Crefname{figure}{Fig.}{Figs.}% \Crefname{table}{Tabela}{Tabelas}% \Crefname{appendix}{Apêndice}{Apêndices}% \def\crefpairconjunction{ e\nobreakspace}% \def\crefmiddleconjunction{, }% \def\creflastconjunction{ e\nobreakspace}% \def\crefpairgroupconjunction{ e\nobreakspace}% \def\crefmiddlegroupconjunction{, }% \def\creflastgroupconjunction{ e\nobreakspace}% \def\crefrangeconjunction{ a\nobreakspace}% } % % %<*ProjLib> %# 这段代码定义了宏包中的选项。 %# This code defines the options in the package. \SetupKeyvalOptions{ family = @ProjLib, prefix = @ProjLib@, } \DeclareBoolOption[false]{draft} \DeclareBoolOption[false]{fast} \DeclareBoolOption[false]{author} \DeclareBoolOption[false]{amsfashion} \DeclareBoolOption[false]{nothms} \DeclareBoolOption[false]{delaythms} \DeclareBoolOption[false]{nothmnum} \DeclareStringOption{thmnum}[PJL@thmnum@default] \DeclareBoolOption[true]{regionalref} \DeclareBoolOption[false]{originalref} \DeclareBoolOption[false]{useosf} \DeclareBoolOption[false]{palatino} \DeclareBoolOption[false]{times} \DeclareBoolOption[false]{garamond} \DeclareBoolOption[false]{noto} \DeclareBoolOption[false]{biolinum} %# 处理选项 %# Process options \ProcessKeyvalOptions*\relax %# 下面的代码设定了选项之间的关系 %# The following code sets the relationship between options \if@ProjLib@originalref \@ProjLib@regionalreffalse \fi \if@ProjLib@draft \@ProjLib@fasttrue \fi %# 向组件传递一些参数 %# Pass some options to the components \if@ProjLib@fast \PassOptionsToPackage{fast}{PJLdate} \PassOptionsToPackage{fast}{PJLdraft} \PassOptionsToPackage{fast}{PJLlogo} \PassOptionsToPackage{fast}{PJLthm} \fi \if@ProjLib@nothms \PassOptionsToPackage{nothms}{PJLthm} \fi \if@ProjLib@delaythms \PassOptionsToPackage{delaythms}{PJLthm} \fi \if@ProjLib@nothmnum \PassOptionsToPackage{nothmnum}{PJLthm} \fi \expandafter\ifstrempty\expandafter{\@ProjLib@thmnum}{}{ \expandafter\ifstrequal\expandafter{\@ProjLib@thmnum}{PJL@thmnum@default}{ \PassOptionsToPackage{thmnum}{PJLthm} }{ \PassOptionsToPackage{thmnum=\@ProjLib@thmnum}{PJLthm} } } \if@ProjLib@regionalref\else \PassOptionsToPackage{originalref}{PJLthm} \fi %# 加载不默认载入的组件 %# Load those components not by default loaded \if@ProjLib@amsfashion \PassOptionsToPackage{amsfashion}{PJLauthor} \RequirePackage{PJLauthor} \fi \if@ProjLib@author \RequirePackage{PJLauthor} \fi %# 加载组件 %# Load the components \RequirePackage{PJLdate} \RequirePackage{PJLdraft} \RequirePackage{PJLlogo} \RequirePackage{PJLmath} \RequirePackage{PJLpaper} \RequirePackage{PJLthm} %# 配置字体选项 %# Configure the font options below % % \PJL@font@alreadyset should contain the current font name % A message can then be shown as: Font "(font name)" has been set \ifdefined\PJL@font@alreadyset\else \if@ProjLib@palatino % \RequirePackage{amssymb} \RequirePackage{mathpazo} \PassOptionsToPackage{defaultsups}{newpxtext} \RequirePackage{newpxtext} % \RequirePackage{newpxmath} \let\openbox\relax \PJLsetlinespacing{\setstretch{1.07}} \if@ProjLib@useosf\useosf\fi \fi \if@ProjLib@times % \RequirePackage{amssymb} \PassOptionsToPackage{defaultsups}{newtxtext} \RequirePackage{newtxtext} \RequirePackage{newtxmath} \let\openbox\relax \PJLsetlinespacing{\setstretch{1.00}} \if@ProjLib@useosf\useosf\fi \fi \if@ProjLib@garamond % \RequirePackage{amssymb} \if@ProjLib@useosf\else \PassOptionsToPackage{lining}{ebgaramond} \fi \RequirePackage{ebgaramond-maths} \RequirePackage{ebgaramond} % \RequirePackage{garamondlibre} \PJLsetlinespacing{\setstretch{1.00}} \fi \if@ProjLib@noto \if@ProjLib@useosf \PassOptionsToPackage{oldstyle}{notomath} \fi \RequirePackage{anyfontsize} \RequirePackage{notomath} \PJLsetlinespacing{\setstretch{1.00}} \fi \if@ProjLib@biolinum % \RequirePackage{amssymb} % \RequirePackage{mathpazo} % \RequirePackage[sansmath]{libertinust1math} \ifPDFTeX \if@ProjLib@useosf \PassOptionsToPackage{osf}{biolinum} \fi \RequirePackage{biolinum} \renewcommand*\familydefault{\biolinum@family} \else \PassOptionsToPackage{no-math}{fontspec} \RequirePackage{fontspec} \setmainfont{LinBiolinum_R.otf}[ BoldFont = LinBiolinum_RB.otf , ItalicFont = LinBiolinum_RI.otf , BoldItalicFont = LinBiolinum_RBO.otf, \if@ProjLib@useosf Numbers = OldStyle\fi ] \fi \PJLsetlinespacing{\setstretch{1.05}} \RequirePackage[italic,defaultmathsizes]{mathastext} \fi %# 结束字体选项的配置 %# End of the configuration of font options \fi %# 使用 microtype 优化排版细节 %# Use `microtype` to get details better \RequirePackage{microtype} % \endinput