% \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}
%</driver>
\NeedsTeXFormat{LaTeX2e}[2020-10-01]
%
%<*ProjLib>
\ProvidesPackage{ProjLib}
    [2021/12/16 The collective interface of ProjLib toolkit]
%</ProjLib>
%
%<*PJLauthor>
\ProvidesPackage{PJLauthor}
    [2021/12/16 Enhanced author information block]
%</PJLauthor>
%
%<*PJLdate>
\ProvidesPackage{PJLdate}
    [2021/12/16 Convert yyyy-mm-dd to normal datetime format]
%</PJLdate>
%
%<*PJLdraft>
\ProvidesPackage{PJLdraft}
    [2021/12/16 Some useful macros for the draft stage]
%</PJLdraft>
%
%<*PJLlang>
\ProvidesPackage{PJLlang}
    [2021/12/16 Multi-language configuration]
%</PJLlang>
%
%<*PJLlogo>
\ProvidesPackage{PJLlogo}
    [2021/12/16 The ProjLib logo]
%</PJLlogo>
%
%<*PJLmath>
\ProvidesPackage{PJLmath}
    [2021/12/16 Useful math macros and shortcuts]
%</PJLmath>
%
%<*PJLpaper>
\ProvidesPackage{PJLpaper}
    [2021/12/16 Paper style configuration]
%</PJLpaper>
%
%<*PJLthm>
\ProvidesPackage{PJLthm}
    [2021/12/16 Theorem setup and configuration]
%</PJLthm>
%
%# 下面两行引入宏包的代码是所有文件共用的。
%# The following two lines are common to all files.
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
%
%<*PJLauthor>
%# 这段代码定义了宏包中的选项。
%# This code defines the options in the package.
\SetupKeyvalOptions{
    family = @PJLauthor,
    prefix = @PJLauthor@,
}
%# 支持 AMS 风格
%# Support AMS fashion
\DeclareBoolOption[false]{amsfashion}
%# 处理选项
%# Process options
\ProcessKeyvalOptions*\relax

%# 在 AMS 文档类中不执行任何操作
%# Do nothing if AMS class detected
\ifdefined\subjclass\endinput\fi

%%================================
%% 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}

}
%</PJLauthor>
%
%<*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 的同义指令
%# Define synonym macros of \PJLdate
\DeclareDocumentCommand{\TheDate}{}{\PJLdate}
\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}}
%</PJLdate>
%
%<*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}%
}
%</PJLdraft>
%
%<*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
    \if@PJLlang@enable@PT
        \let\PJL@babelord\ord
        \let\ord\relax
        \AtBeginDocument{
            \@ifundefined{ord}{}
            {
                \let\PJL@userord\ord
                \let\ord\relax
                \newcommand{\ord}{%
                    \ifmmode\expandafter\PJL@userord\else\expandafter\PJL@babelord\fi%
                }
            }
        }
    \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
\@ifclassloaded{beamer}{
    \def\PJL@config@parindent{\ltx@ifpackageloaded{parskip}{}{\setlength{\parindent}{0em}}}
    \def\PJL@config@CJKparindent{\ltx@ifpackageloaded{parskip}{}{\setlength{\parindent}{0em}}}
}{
    \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}
%</PJLlang>
%
%<*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}}
%</PJLlogo>
%
%<*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}}
%</PJLmath>
%
%<*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
}
%</PJLpaper>
%
%<*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}
%# 名称采用详尽设置或简易设置
%# Detailed or simple settings for the name of theorem-like environments
\DeclareBoolOption[true]{complexname}
\DeclareBoolOption[false]{simplename}
%# 处理选项
%# Process options
\ProcessKeyvalOptions*\relax
%# 下面的代码设定了选项之间的关系
%# The following code sets the relationship between options
\if@PJLthm@originalref
    \@PJLthm@regionalreffalse
\fi
\if@PJLthm@simplename
    \@PJLthm@complexnamefalse
\fi
\if@PJLthm@draft
    \@PJLthm@fasttrue
\fi
\if@PJLthm@fast
    \@PJLthm@regionalreftrue
\fi

\@ifclassloaded{beamer}{%
    \RequirePackage{silence}
    \WarningFilter{cleveref}{hyperref package loaded with implicit=false option}
    \@PJLthm@nothmnumtrue%
    \if@PJLthm@nothms\else%
        \let\theorem\relax
        \let\lemma\relax
        \let\corollary\relax
        \let\definition\relax
        \let\fact\relax
        \let\example\relax
        \let\problem\relax
    \fi
}{}

\RequirePackage{PJLlang}
\RequirePackage{amsmath,amsthm}
\RequirePackage{aliascnt}
\PassOptionsToPackage{nameinlink}{cleveref}
\RequirePackage{crefthe}

%# 用于命名定理类环境的用户命令
%# Macro for naming theorems
\RequirePackage{xparse}
\RequirePackage{xstring}
\NewDocumentCommand{\NameTheorem}{omm}{%
    \protected@edef\PJLthm@temp{#2}%
    \expandafter\IfEndWith\expandafter{\PJLthm@temp}{*}{%
        \expandafter\StrGobbleRight\expandafter{\PJLthm@temp}{1}[\PJLthm@temp]%
    }{}%
    \IfSubStr{\detokenize{#3}}{=}{% key-value mode
        \IfValueTF{#1}{%
            \CreateTheoremSetKeys{\PJLthm@temp}{#1={#3}}%
        }{%
            \CreateTheoremSetKeys{\PJLthm@temp}{#3}%
        }%
    }{% simple mode
        \IfValueTF{#1}{%
            \expandafter\def\csname\PJLthm@temp name\StrToABBR{#1}\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
\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()g}{%
% #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
% #7 = key-value configuration of names
    \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}%
                        }%
                }%
                \ifcsname cref@PJL#2#3@name\endcsname\else%
                    \crefname{PJL#2#3}%
                        {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                        {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                \fi%
                \ifcsname Cref@PJL#2#3@name\endcsname\else%
                    \Crefname{PJL#2#3}%
                        {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                        {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                \fi%
                \NewDocumentEnvironment{#2#3}{}
                    {\begin{PJL#2#3}}
                    {\end{PJL#2#3}}
            }%
        }%
    }%
    \IfValueTF{#7}{%
        \NameTheorem{#2}{#7}%
    }{}%
}%
\else
\NewDocumentCommand{\InnerCreateTheorem}{mmmod<>d()g}{%
% #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)
% #7 = key-value configuration of names
    \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}%
        }%
    }%
    \IfValueTF{#7}{%
        \NameTheorem{#2}{#7}%
    }{}%
}%
\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}%
    \ifcsname cref@#1#2#3@name\endcsname\else%
        \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}%
        {%
            \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}%
            {\crefname{#1#2#3}}%
        }%
    \fi%
    \ifcsname Cref@#1#2#3@name\endcsname\else%
        \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}%
        {%
            \expandafter\PassFirstToSecond\expandafter{\csname#1name#2\endcsname}%
            {\Crefname{#1#2#3}}%
        }%
    \fi%
}%
\fi

% See https://tex.stackexchange.com/a/610604
\ExplSyntaxOn

% Helper-macros/scratch-macros
%-----------------------------
\cs_new:Nn  \PJLthm_exchange_i_iii_ii:nnn  { #1 {#3} {#2} }
\cs_new:Nn  \__PJLthm_languageprefix:  {}
\cs_new:Nn  \__PJLthm_countername:  {}

% Message-management:
%--------------------
\msg_new:nnnn {PJLthm}
              {Undefined Language Dependent Specification Class}
              {\token_to_str:N \CreateTheorem :\ Value\ `\tl_to_str:n{#2}'\ for\ invalid\ key\ `#1'.} 
              {Providing\ Language-dependent\ specifications\ for\ element\ `#1'\ is\ currently\ not\ implemented.}

% Nested key=value-interface by means of package l3keys:
%-------------------------------------------------------
% (l3keys is similar to pgfkeys.)
% The outer level of key=value-specifications, i.e.,   <language-ID>={...},
% is processed via  \keyval_parse:nnn  which was added tpo expl3 in 2020/12/19.
% The inner level of key=value-specifications,
%   i.e., the single keys whose values are to be specified dependant on the language,
%   i.e., the "..."-content of the outer lever's {...},
% is processed via  \keys_set:nn  .
% The keys for the inner level are defined via  \keys_define:nn .

\NewDocumentCommand \CreateTheoremSetKeys { mm } {
% #1 = name of counter
% #2 = keyval-list of language-specifications
  \cs_set:Nn \__PJLthm_countername: {#1}
  \keyval_parse:nnn { \PJLthm_exchange_i_iii_ii:nnn { \PJLthm_setlanguagespecificparameters:nn } {} } 
                    { \PJLthm_setlanguagespecificparameters:nn }
                    { #2 }
}

\cs_new_protected:Nn \PJLthm_setlanguagespecificparameters:nn {
% #1 = language-prefix
% #2 = key-val-list for language whose prefix is language-prefix
  \cs_set:Nx \__PJLthm_languageprefix: {\StrToABBR{#1}}
  \exp_args:No \tl_if_empty:nTF {\__PJLthm_languageprefix:} 
    { \msg_error:nn { PJLthm }
                    { No~language~"\exp_not:n{#1}"~defined }
    }%
    {%
        \keys_set:nn { PJLthm } { #2 } 
    }%
}%

\keys_define:nn { PJLthm } {
  crefname.code:n  = \cs_if_exist:NTF \crefname  {
                        \ifbool{@PJLthm@regionalref}{
                            \exp_args:Nx \PJLthm@setcrefinnername{PJL\__PJLthm_countername: \__PJLthm_languageprefix: }#1
                            \exp_args:Nx \PJLthm@setcrefname{PJL\__PJLthm_countername: }
                        }{
                            \exp_args:Nx \crefname {\__PJLthm_countername: \__PJLthm_languageprefix: }#1
                        }
                     }{},
  crefname.value_required:n = true,
  Crefname.code:n  = \cs_if_exist:NTF \Crefname  {
                        \ifbool{@PJLthm@regionalref}{
                            \exp_args:Nx \PJLthm@setCrefinnername{PJL\__PJLthm_countername: \__PJLthm_languageprefix: }#1
                            \exp_args:Nx \PJLthm@setCrefname{PJL\__PJLthm_countername: }
                        }{
                            \exp_args:Nx \Crefname {\__PJLthm_countername: \__PJLthm_languageprefix: }#1
                        }
                     }{},
  Crefname.value_required:n = true,
  name.code:n  = \exp_args:Nx \cs_set:cpn {\__PJLthm_countername: name \__PJLthm_languageprefix:} {#1},
  name.value_required:n = true,
  autorefname.code:n  = \exp_args:Nx \cs_set:cpn  {\__PJLthm_countername: \__PJLthm_languageprefix: autorefname} {#1},
  autorefname.value_required:n = true,
  theoremheading.code:n= \exp_args:Nx \cs_set:cpn  {\__PJLthm_countername: \__PJLthm_languageprefix: heading} {#1},
  theoremheading.value_required:n = true,
  the.code:n= \exp_args:Nx \cs_set:cpn  {the \__PJLthm_countername: \__PJLthm_languageprefix: } {#1},
  the.value_required:n = true,
  %
  % Define keys for more Language Dependent Specification Classes.
  %
  unknown.code:n = \msg_error:nnxx {PJLthm} 
                                   {Undefined Language Dependent Specification Class}
                                   {\exp_args:No \exp_not:n \l_keys_key_str}
                                   {\exp_not:n{#1}},
}

\ExplSyntaxOff

% Some command for regionalref mode
\newcommand{\PJLthm@setcrefinnername}[3]{%
    \expandafter\def\csname PJLthm@cref@#1@name\endcsname{#2}%
    \expandafter\def\csname PJLthm@cref@#1@name@plural\endcsname{#3}%
}
\newcommand{\PJLthm@setCrefinnername}[3]{%
    \expandafter\def\csname PJLthm@Cref@#1@name\endcsname{#2}%
    \expandafter\def\csname PJLthm@Cref@#1@name@plural\endcsname{#3}%
}

\newcommand{\PJLthm@setcrefname}[1]{%
    \crefname{#1}%
        {\csname PJLthm@cref@#1\csname\languagename ABBR\endcsname @name\endcsname}%
        {\csname PJLthm@cref@#1\csname\languagename ABBR\endcsname @name@plural\endcsname}%
}
\newcommand{\PJLthm@setCrefname}[1]{%
    \Crefname{#1}%
        {\csname PJLthm@Cref@#1\csname\languagename ABBR\endcsname @name\endcsname}%
        {\csname PJLthm@Cref@#1\csname\languagename ABBR\endcsname @name@plural\endcsname}%
}

%# 设置定理类环境名称
%# Set the names of theorem-like environments
\ifbool{@PJLthm@complexname}{
    \NameTheorem{theorem}{
        EN = {
            name = {Theorem},
            crefname = {theorem}{theorems},
            Crefname = {Theorem}{Theorems},
        },
        FR = {
            name = {Théorème},
            crefname = {\crefthemark{le} théorème}{\crefthemark{les} théorèmes},
            Crefname = {Le théorème}{Les théorèmes},
        },
        DE = {
            name = {Satz},
            crefname = {Satz}{Sätze},
            Crefname = {Satz}{Sätze},
        },
        IT = {
            name = {Teorema},
            crefname = {\crefthemark{il} teorema}{\crefthemark{i} teoremi},
            Crefname = {Il teorema}{I teoremi},
        },
        PT = {
            name = {Teorema},
            crefname = {\crefthemark{o} teorema}{\crefthemark{os} teoremas},
            Crefname = {O teorema}{Os teoremas},
        },
        BR = {
            name = {Teorema},
            crefname = {\crefthemark{o} teorema}{\crefthemark{os} teoremas},
            Crefname = {O teorema}{Os teoremas},
        },
        ES = {
            name = {Teorema},
            crefname = {\crefthemark{el} teorema}{los teoremas},
            Crefname = {El teorema}{Los teoremas},
        },
        CN = {
            name = {定理},
            crefname = {定理}{定理},
            Crefname = {定理}{定理},
        },
        TC = {
            name = {定理},
            crefname = {定理}{定理},
            Crefname = {定理}{定理},
        },
        JP = {
            name = {定理},
            crefname = {定理}{定理},
            Crefname = {定理}{定理},
        },
        RU = {
            name = {Теорема},
            crefname = {теорема}{теоремы},
            Crefname = {Теорема}{Теоремы},
        },
    }
    \NameTheorem{lemma}{
        EN = {
            name = {Lemma},
            crefname = {lemma}{Lemmas},
            Crefname = {Lemma}{Lemmas},
        },
        FR = {
            name = {Lemme},
            crefname = {\crefthemark{le} lemme}{\crefthemark{les} lemmes},
            Crefname = {Le lemme}{Les lemmes},
        },
        DE = {
            name = {Lemma},
            crefname = {Lemma}{Lemmata},
            Crefname = {Lemma}{Lemmata},
        },
        IT = {
            name = {Lemma},
            crefname = {\crefthemark{il} lemma}{\crefthemark{i} lemmi},
            Crefname = {Il lemma}{I lemmi},
        },
        PT = {
            name = {Lema},
            crefname = {\crefthemark{o} lema}{\crefthemark{os} lemas},
            Crefname = {O lema}{Os lemas},
        },
        BR = {
            name = {Lema},
            crefname = {\crefthemark{o} lema}{\crefthemark{os} lemas},
            Crefname = {O lema}{Os lemas},
        },
        ES = {
            name = {Lema},
            crefname = {\crefthemark{el} lema}{las lemas},
            Crefname = {El lema}{Las lemas},
        },
        CN = {
            name = {引理},
            crefname = {引理}{引理},
            Crefname = {引理}{引理},
        },
        TC = {
            name = {引理},
            crefname = {引理}{引理},
            Crefname = {引理}{引理},
        },
        JP = {
            name = {補題},
            crefname = {補題}{補題},
            Crefname = {補題}{補題},
        },
        RU = {
            name = {Лемма},
            crefname = {лемма}{леммы},
            Crefname = {Лемма}{Леммы},
        },
    }
    \NameTheorem{proposition}{
        EN = {
            name = {Proposition},
            crefname = {proposition}{propositions},
            Crefname = {Proposition}{Propositions},
        },
        FR = {
            name = {Proposition},
            crefname = {\crefthemark{la} proposition}{\crefthemark{les} propositions},
            Crefname = {La proposition}{Les propositions},
        },
        DE = {
            name = {Proposition},
            crefname = {Proposition}{Propositionen},
            Crefname = {Proposition}{Propositionen},
        },
        IT = {
            name = {Proposizione},
            crefname = {\crefthemark{la} proposizione}{\crefthemark{le} proposte},
            Crefname = {La proposizione}{Le proposte},
        },
        PT = {
            name = {Proposição},
            crefname = {\crefthemark{a} proposição}{\crefthemark{as} proposições},
            Crefname = {A proposição}{As proposições},
        },
        BR = {
            name = {Proposição},
            crefname = {\crefthemark{a} proposição}{\crefthemark{as} proposições},
            Crefname = {A proposição}{As proposições},
        },
        ES = {
            name = {Proposición},
            crefname = {la proposición}{las proposiciones},
            Crefname = {La proposición}{Las proposiciones},
        },
        CN = {
            name = {命题},
            crefname = {命题}{命题},
            Crefname = {命题}{命题},
        },
        TC = {
            name = {命題},
            crefname = {命題}{命題},
            Crefname = {命題}{命題},
        },
        JP = {
            name = {命題},
            crefname = {命題}{命題},
            Crefname = {命題}{命題},
        },
        RU = {
            name = {Предложение},
            crefname = {предложение}{предложения},
            Crefname = {Предложение}{Предложения},
        },
    }
    \NameTheorem{corollary}{
        EN = {
            name = {Corollary},
            crefname = {corollary}{corollaries},
            Crefname = {Corollary}{Corollaries},
        },
        FR = {
            name = {Corollaire},
            crefname = {\crefthemark{le} corollaire}{\crefthemark{les} corollaires},
            Crefname = {Le corollaire}{Les corollaires},
        },
        DE = {
            name = {Korollar},
            crefname = {Korollar}{Korollare},
            Crefname = {Korollar}{Korollare},
        },
        IT = {
            name = {Corollario},
            crefname = {\crefthemark{il} corollario}{\crefthemark{i} corollari},
            Crefname = {Il corollario}{I corollari},
        },
        PT = {
            name = {Corolário},
            crefname = {\crefthemark{o} corolário}{\crefthemark{os} corolários},
            Crefname = {O corolário}{Os corolários},
        },
        BR = {
            name = {Corolário},
            crefname = {\crefthemark{o} corolário}{\crefthemark{os} corolários},
            Crefname = {O corolário}{Os corolários},
        },
        ES = {
            name = {Corolario},
            crefname = {\crefthemark{el} corolario}{los corolarios},
            Crefname = {El corolario}{Los corolarios},
        },
        CN = {
            name = {推论},
            crefname = {推论}{推论},
            Crefname = {推论}{推论},
        },
        TC = {
            name = {推論},
            crefname = {推論}{推論},
            Crefname = {推論}{推論},
        },
        JP = {
            name = {系},
            crefname = {系}{系},
            Crefname = {系}{系},
        },
        RU = {
            name = {Следствие},
            crefname = {следствие}{следствия},
            Crefname = {Следствие}{Следствия},
        },
    }
    \NameTheorem{property}{
        EN = {
            name = {Property},
            crefname = {property}{properties},
            Crefname = {Property}{Properties},
        },
        FR = {
            name = {Propriété},
            crefname = {\crefthemark{la} propriété}{\crefthemark{les} propriétés},
            Crefname = {La propriété}{Les propriétés},
        },
        DE = {
            name = {Eigenschaft},
            crefname = {Eigenschaft}{Eigenschaften},
            Crefname = {Eigenschaft}{Eigenschaften},
        },
        IT = {
            name = {Proprietà},
            crefname = {\crefthemark{la} proprietà}{\crefthemark{le} proprietà},
            Crefname = {La proprietà}{Le proprietà},
        },
        PT = {
            name = {Propriedade},
            crefname = {\crefthemark{a} propriedade}{\crefthemark{as} propriedades},
            Crefname = {A propriedade}{As propriedades},
        },
        BR = {
            name = {Propriedade},
            crefname = {\crefthemark{a} propriedade}{\crefthemark{as} propriedades},
            Crefname = {A propriedade}{As propriedades},
        },
        ES = {
            name = {Propiedad},
            crefname = {la propiedad}{las propiedades},
            Crefname = {La propiedad}{Las propiedades},
        },
        CN = {
            name = {性质},
            crefname = {性质}{性质},
            Crefname = {性质}{性质},
        },
        TC = {
            name = {性質},
            crefname = {性質}{性質},
            Crefname = {性質}{性質},
        },
        JP = {
            name = {性質},
            crefname = {性質}{性質},
            Crefname = {性質}{性質},
        },
        RU = {
            name = {Имущество},
            crefname = {имущество}{имущества},
            Crefname = {Имущество}{Имущества},
        },
    }
    \NameTheorem{fact}{
        EN = {
            name = {Fact},
            crefname = {fact}{facts},
            Crefname = {Fact}{Facts},
        },
        FR = {
            name = {Fait},
            crefname = {\crefthemark{le} fait}{\crefthemark{les} faits},
            Crefname = {Le fait}{Les faits},
        },
        DE = {
            name = {Fakt},
            crefname = {Fakt}{Fakten},
            Crefname = {Fakt}{Fakten},
        },
        IT = {
            name = {Fatto},
            crefname = {\crefthemark{il} fatto}{\crefthemark{i} fatti},
            Crefname = {Il fatto}{I fatti},
        },
        PT = {
            name = {Facto},
            crefname = {\crefthemark{o} facto}{\crefthemark{os} factos},
            Crefname = {O facto}{Os factos},
        },
        BR = {
            name = {Fato},
            crefname = {\crefthemark{o} fato}{\crefthemark{os} fatos},
            Crefname = {O fato}{Os fatos},
        },
        ES = {
            name = {Hecho},
            crefname = {\crefthemark{el} hecho}{los hechos},
            Crefname = {El hecho}{Los hechos},
        },
        CN = {
            name = {事实},
            crefname = {事实}{事实},
            Crefname = {事实}{事实},
        },
        TC = {
            name = {事實},
            crefname = {事實}{事實},
            Crefname = {事實}{事實},
        },
        JP = {
            name = {事実},
            crefname = {事実}{事実},
            Crefname = {事実}{事実},
        },
        RU = {
            name = {Факт},
            crefname = {факт}{факты},
            Crefname = {Факт}{Факты},
        },
    }
    \NameTheorem{conjecture}{
        EN = {
            name = {Conjecture},
            crefname = {conjecture}{conjectures},
            Crefname = {Conjecture}{Conjectures},
        },
        FR = {
            name = {Conjecture},
            crefname = {\crefthemark{la} conjecture}{\crefthemark{les} conjectures},
            Crefname = {La conjecture}{Les conjectures},
        },
        DE = {
            name = {Vermutung},
            crefname = {Vermutung}{Vermutungen},
            Crefname = {Vermutung}{Vermutungen},
        },
        IT = {
            name = {Congettura},
            crefname = {\crefthemark{la} congettura}{\crefthemark{le} congetture},
            Crefname = {La congettura}{Le congetture},
        },
        PT = {
            name = {Conjetura},
            crefname = {\crefthemark{a} conjetura}{\crefthemark{as} conjeturas},
            Crefname = {A conjetura}{As conjeturas},
        },
        BR = {
            name = {Conjectura},
            crefname = {\crefthemark{a} conjectura}{\crefthemark{as} conjecturas},
            Crefname = {A conjectura}{As conjecturas},
        },
        ES = {
            name = {Conjetura},
            crefname = {la conjetura}{las conjeturas},
            Crefname = {La conjetura}{Las conjeturas},
        },
        CN = {
            name = {猜想},
            crefname = {猜想}{猜想},
            Crefname = {猜想}{猜想},
        },
        TC = {
            name = {猜想},
            crefname = {猜想}{猜想},
            Crefname = {猜想}{猜想},
        },
        JP = {
            name = {予想},
            crefname = {予想}{予想},
            Crefname = {予想}{予想},
        },
        RU = {
            name = {Гипотеза},
            crefname = {гипотеза}{гипотезы},
            Crefname = {Гипотеза}{Гипотезы},
        },
    }
    \NameTheorem{definition}{
        EN = {
            name = {Definition},
            crefname = {definition}{definitions},
            Crefname = {Definition}{Definitions},
        },
        FR = {
            name = {Définition},
            crefname = {\crefthemark{la} définition}{\crefthemark{les} définitions},
            Crefname = {La définition}{Les définitions},
        },
        DE = {
            name = {Definition},
            crefname = {Definition}{Definitionen},
            Crefname = {Definition}{Definitionen},
        },
        IT = {
            name = {Definizione},
            crefname = {\crefthemark{la} definizione}{\crefthemark{le} definizioni},
            Crefname = {La definizione}{Le definizioni},
        },
        PT = {
            name = {Definição},
            crefname = {\crefthemark{a} definição}{\crefthemark{as} definições},
            Crefname = {A definição}{As definições},
        },
        BR = {
            name = {Definição},
            crefname = {\crefthemark{a} definição}{\crefthemark{as} definições},
            Crefname = {A definição}{As definições},
        },
        ES = {
            name = {Definición},
            crefname = {la definición}{las definiciones},
            Crefname = {La definición}{Las definiciones},
        },
        CN = {
            name = {定义},
            crefname = {定义}{定义},
            Crefname = {定义}{定义},
        },
        TC = {
            name = {定義},
            crefname = {定義}{定義},
            Crefname = {定義}{定義},
        },
        JP = {
            name = {定義},
            crefname = {定義}{定義},
            Crefname = {定義}{定義},
        },
        RU = {
            name = {Определение},
            crefname = {определение}{определения},
            Crefname = {Определение}{Определения},
        },
    }
    \NameTheorem{axiom}{
        EN = {
            name = {Axiom},
            crefname = {axiom}{axioms},
            Crefname = {Axiom}{Axioms},
        },
        FR = {
            name = {Axiome},
            crefname = {\crefthemark{l'}axiome}{\crefthemark{les} axiomes},
            Crefname = {L'axiome}{Les axiomes},
        },
        DE = {
            name = {Axiom},
            crefname = {Axiom}{Axiome},
            Crefname = {Axiom}{Axiome},
        },
        IT = {
            name = {Assioma},
            crefname = {\crefthemark{l'}assioma}{\crefthemark{gli} assiomi},
            Crefname = {L'assioma}{Gli assiomi},
        },
        PT = {
            name = {Axioma},
            crefname = {\crefthemark{o} axioma}{\crefthemark{os} axiomas},
            Crefname = {O axioma}{Os axiomas},
        },
        BR = {
            name = {Axioma},
            crefname = {\crefthemark{o} axioma}{\crefthemark{os} axiomas},
            Crefname = {O axioma}{Os axiomas},
        },
        ES = {
            name = {Axioma},
            crefname = {\crefthemark{el} axioma}{los axiomas},
            Crefname = {El axioma}{Los axiomas},
        },
        CN = {
            name = {公理},
            crefname = {公理}{公理},
            Crefname = {公理}{公理},
        },
        TC = {
            name = {公理},
            crefname = {公理}{公理},
            Crefname = {公理}{公理},
        },
        JP = {
            name = {公理},
            crefname = {公理}{公理},
            Crefname = {公理}{公理},
        },
        RU = {
            name = {Аксиома},
            crefname = {аксиома}{аксиомы},
            Crefname = {Аксиома}{Аксиомы},
        },
    }
    \NameTheorem{assumption}{
        EN = {
            name = {Assumption},
            crefname = {assumption}{assumptions},
            Crefname = {Assumption}{Assumptions},
        },
        FR = {
            name = {Supposition},
            crefname = {\crefthemark{la} supposition}{\crefthemark{les} suppositions},
            Crefname = {La supposition}{Les suppositions},
        },
        DE = {
            name = {Annahme},
            crefname = {Annahme}{Annahmen},
            Crefname = {Annahme}{Annahmen},
        },
        IT = {
            name = {Supposizione},
            crefname = {\crefthemark{la} supposizione}{\crefthemark{le} supposizioni},
            Crefname = {La supposizione}{Le supposizioni},
        },
        PT = {
            name = {Suposição},
            crefname = {\crefthemark{a} suposição}{\crefthemark{as} suposições},
            Crefname = {A suposição}{As suposições},
        },
        BR = {
            name = {Suposição},
            crefname = {\crefthemark{a} suposição}{\crefthemark{as} suposições},
            Crefname = {A suposição}{As suposições},
        },
        ES = {
            name = {Suposición},
            crefname = {la suposición}{las suposiciones},
            Crefname = {La suposición}{Las suposiciones},
        },
        CN = {
            name = {假定},
            crefname = {假定}{假定},
            Crefname = {假定}{假定},
        },
        TC = {
            name = {假定},
            crefname = {假定}{假定},
            Crefname = {假定}{假定},
        },
        JP = {
            name = {仮定},
            crefname = {仮定}{仮定},
            Crefname = {仮定}{仮定},
        },
        RU = {
            name = {Предположение},
            crefname = {предположение}{предположения},
            Crefname = {Предположение}{Предположения},
        },
    }
    \NameTheorem{convention}{
        EN = {
            name = {Convention},
            crefname = {convention}{conventions},
            Crefname = {Convention}{Conventions},
        },
        FR = {
            name = {Convention},
            crefname = {\crefthemark{la} convention}{\crefthemark{les} conventions},
            Crefname = {La convention}{Les conventions},
        },
        DE = {
            name = {Konvention},
            crefname = {Konvention}{Konventionen},
            Crefname = {Konvention}{Konventionen},
        },
        IT = {
            name = {Convenzione},
            crefname = {\crefthemark{la} convenzione}{\crefthemark{le} convenzioni},
            Crefname = {La convenzione}{Le convenzioni},
        },
        PT = {
            name = {Convenção},
            crefname = {\crefthemark{a} convenção}{\crefthemark{as} convenções},
            Crefname = {A convenção}{As convenções},
        },
        BR = {
            name = {Convenção},
            crefname = {\crefthemark{a} convenção}{\crefthemark{as} convenções},
            Crefname = {A convenção}{As convenções},
        },
        ES = {
            name = {Convención},
            crefname = {la convención}{las convenciones},
            Crefname = {La convención}{Las convenciones},
        },
        CN = {
            name = {约定},
            crefname = {约定}{约定},
            Crefname = {约定}{约定},
        },
        TC = {
            name = {約定},
            crefname = {約定}{約定},
            Crefname = {約定}{約定},
        },
        JP = {
            name = {慣例},
            crefname = {慣例}{慣例},
            Crefname = {慣例}{慣例},
        },
        RU = {
            name = {Конвенция},
            crefname = {конвенция}{конвенции},
            Crefname = {Конвенция}{Конвенции},
        },
    }
    \NameTheorem{hypothesis}{
        EN = {
            name = {Hypothesis},
            crefname = {hypothesis}{hypotheses},
            Crefname = {Hypothesis}{Hypotheses},
        },
        FR = {
            name = {Hypothèse},
            crefname = {\crefthemark{l'}hypothèse}{\crefthemark{les} hypothèses},
            Crefname = {L'hypothèse}{Les hypothèses},
        },
        DE = {
            name = {Hypothese},
            crefname = {Hypothese}{Hypothesen},
            Crefname = {Hypothese}{Hypothesen},
        },
        IT = {
            name = {Ipotesi},
            crefname = {\crefthemark{l'}ipotesi}{\crefthemark{le} ipotesi},
            Crefname = {L'ipotesi}{Le ipotesi},
        },
        PT = {
            name = {Hipótese},
            crefname = {\crefthemark{a} hipótese}{\crefthemark{as} hipóteses},
            Crefname = {A hipótese}{As hipóteses},
        },
        BR = {
            name = {Hipótese},
            crefname = {\crefthemark{a} hipótese}{\crefthemark{as} hipóteses},
            Crefname = {A hipótese}{As hipóteses},
        },
        ES = {
            name = {Hipótesis},
            crefname = {la hipótesis}{las hipótesis},
            Crefname = {La hipótesis}{Las hipótesis},
        },
        CN = {
            name = {假设},
            crefname = {假设}{假设},
            Crefname = {假设}{假设},
        },
        TC = {
            name = {假設},
            crefname = {假設}{假設},
            Crefname = {假設}{假設},
        },
        JP = {
            name = {仮設},
            crefname = {仮設}{仮設},
            Crefname = {仮設}{仮設},
        },
        RU = {
            name = {Гипотеза},
            crefname = {гипотеза}{гипотезы},
            Crefname = {Гипотеза}{Гипотезы},
        },
    }
    \NameTheorem{notation}{
        EN = {
            name = {Notation},
            crefname = {notation}{notations},
            Crefname = {Notation}{Notations},
        },
        FR = {
            name = {Notation},
            crefname = {\crefthemark{la} notation}{\crefthemark{les} notations},
            Crefname = {La notation}{Les notations},
        },
        DE = {
            name = {Notation},
            crefname = {Notation}{Notationen},
            Crefname = {Notation}{Notationen},
        },
        IT = {
            name = {Notazione},
            crefname = {\crefthemark{la} notazione}{\crefthemark{le} notazioni},
            Crefname = {La notazione}{Le notazioni},
        },
        PT = {
            name = {Notação},
            crefname = {\crefthemark{a} notação}{\crefthemark{as} notações},
            Crefname = {A notação}{As notações},
        },
        BR = {
            name = {Notação},
            crefname = {\crefthemark{a} notação}{\crefthemark{as} notações},
            Crefname = {A notação}{As notações},
        },
        ES = {
            name = {Notación},
            crefname = {la notación}{las notaciones},
            Crefname = {La notación}{Las notaciones},
        },
        CN = {
            name = {记号},
            crefname = {记号}{记号},
            Crefname = {记号}{记号},
        },
        TC = {
            name = {記號},
            crefname = {記號}{記號},
            Crefname = {記號}{記號},
        },
        JP = {
            name = {記法},
            crefname = {記法}{記法},
            Crefname = {記法}{記法},
        },
        RU = {
            name = {Нотация},
            crefname = {нотация}{нотации},
            Crefname = {Нотация}{Нотации},
        },
    }
    \NameTheorem{example}{
        EN = {
            name = {Example},
            crefname = {example}{examples},
            Crefname = {Example}{Examples},
        },
        FR = {
            name = {Exemple},
            crefname = {\crefthemark{l'}example}{\crefthemark{les} examples},
            Crefname = {L'example}{Les examples},
        },
        DE = {
            name = {Beispiel},
            crefname = {Beispiel}{Beispiele},
            Crefname = {Beispiel}{Beispiele},
        },
        IT = {
            name = {Esempio},
            crefname = {\crefthemark{l'}esempio}{\crefthemark{gli} esempi},
            Crefname = {L'esempio}{Gli esempi},
        },
        PT = {
            name = {Exemplo},
            crefname = {\crefthemark{o} exemplo}{\crefthemark{os} exemplos},
            Crefname = {O exemplo}{Os exemplos},
        },
        BR = {
            name = {Exemplo},
            crefname = {\crefthemark{o} exemplo}{\crefthemark{os} exemplos},
            Crefname = {O exemplo}{Os exemplos},
        },
        ES = {
            name = {Ejemplo},
            crefname = {\crefthemark{el} ejemplo}{los ejemplos},
            Crefname = {El ejemplo}{Los ejemplos},
        },
        CN = {
            name = {例},
            crefname = {例}{例},
            Crefname = {例}{例},
        },
        TC = {
            name = {例},
            crefname = {例}{例},
            Crefname = {例}{例},
        },
        JP = {
            name = {例},
            crefname = {例}{例},
            Crefname = {例}{例},
        },
        RU = {
            name = {Пример},
            crefname = {пример}{примеры},
            Crefname = {Пример}{Примеры},
        },
    }
    \NameTheorem{problem}{
        EN = {
            name = {Problem},
            crefname = {problem}{problems},
            Crefname = {Problem}{Problems},
        },
        FR = {
            name = {Problème},
            crefname = {\crefthemark{le} problème}{\crefthemark{les} problèmes},
            Crefname = {Le problème}{Les problèmes},
        },
        DE = {
            name = {Problem},
            crefname = {Problem}{Probleme},
            Crefname = {Problem}{Probleme},
        },
        IT = {
            name = {Problema},
            crefname = {\crefthemark{il} problema}{\crefthemark{i} problemi},
            Crefname = {Il problema}{I problemi},
        },
        PT = {
            name = {Problema},
            crefname = {\crefthemark{o} problema}{\crefthemark{os} problemas},
            Crefname = {O problema}{Os problemas},
        },
        BR = {
            name = {Problema},
            crefname = {\crefthemark{o} problema}{\crefthemark{os} problemas},
            Crefname = {O problema}{Os problemas},
        },
        ES = {
            name = {Problema},
            crefname = {\crefthemark{el} problema}{los problemas},
            Crefname = {El problema}{Los problemas},
        },
        CN = {
            name = {问题},
            crefname = {问题}{问题},
            Crefname = {问题}{问题},
        },
        TC = {
            name = {問題},
            crefname = {問題}{問題},
            Crefname = {問題}{問題},
        },
        JP = {
            name = {問題},
            crefname = {問題}{問題},
            Crefname = {問題}{問題},
        },
        RU = {
            name = {Проблема},
            crefname = {проблема}{проблемы},
            Crefname = {Проблема}{Проблемы},
        },
    }
    \NameTheorem{question}{
        EN = {
            name = {Question},
            crefname = {question}{questions},
            Crefname = {Question}{Questions},
        },
        FR = {
            name = {Question},
            crefname = {\crefthemark{la} question}{\crefthemark{les} questions},
            Crefname = {La question}{Les questions},
        },
        DE = {
            name = {Frage},
            crefname = {Frage}{Fragen},
            Crefname = {Frage}{Fragen},
        },
        IT = {
            name = {Domanda},
            crefname = {\crefthemark{la} domanda}{\crefthemark{le} domande},
            Crefname = {La domanda}{Le domande},
        },
        PT = {
            name = {Pergunta},
            crefname = {\crefthemark{a} pergunta}{\crefthemark{as} perguntas},
            Crefname = {A pergunta}{As perguntas},
        },
        BR = {
            name = {Pergunta},
            crefname = {\crefthemark{a} pergunta}{\crefthemark{as} perguntas},
            Crefname = {A pergunta}{As perguntas},
        },
        ES = {
            name = {Pregunta},
            crefname = {la pregunta}{las preguntas},
            Crefname = {La pregunta}{Las preguntas},
        },
        CN = {
            name = {问题},
            crefname = {问题}{问题},
            Crefname = {问题}{问题},
        },
        TC = {
            name = {問題},
            crefname = {問題}{問題},
            Crefname = {問題}{問題},
        },
        JP = {
            name = {問題},
            crefname = {問題}{問題},
            Crefname = {問題}{問題},
        },
        RU = {
            name = {Вопрос},
            crefname = {вопрос}{вопросы},
            Crefname = {Вопрос}{Вопросы},
        },
    }
    \NameTheorem{exercise}{
        EN = {
            name = {Exercise},
            crefname = {exercise}{exercises},
            Crefname = {Exercise}{Exercises},
        },
        FR = {
            name = {Exercice},
            crefname = {\crefthemark{l'}exercice}{\crefthemark{les} exercices},
            Crefname = {L'exercice}{Les exercices},
        },
        DE = {
            name = {Übung},
            crefname = {Übung}{Übungen},
            Crefname = {Übung}{Übungen},
        },
        IT = {
            name = {Esercizio},
            crefname = {\crefthemark{l'}esercizio}{\crefthemark{gli} esercizi},
            Crefname = {L'esercizio}{Gli esercizi},
        },
        PT = {
            name = {Exercício},
            crefname = {\crefthemark{o} exercício}{\crefthemark{os} exercícios},
            Crefname = {O exercício}{Os exercícios},
        },
        BR = {
            name = {Exercício},
            crefname = {\crefthemark{o} exercício}{\crefthemark{os} exercícios},
            Crefname = {O exercício}{Os exercícios},
        },
        ES = {
            name = {Ejercicio},
            crefname = {\crefthemark{el} ejercicio}{los ejercicios},
            Crefname = {El ejercicio}{Los ejercicios},
        },
        CN = {
            name = {练习},
            crefname = {练习}{练习},
            Crefname = {练习}{练习},
        },
        TC = {
            name = {練習},
            crefname = {練習}{練習},
            Crefname = {練習}{練習},
        },
        JP = {
            name = {練習},
            crefname = {練習}{練習},
            Crefname = {練習}{練習},
        },
        RU = {
            name = {Упражнение},
            crefname = {упражнение}{упражнения},
            Crefname = {Упражнение}{Упражнения},
        },
    }
    \NameTheorem{remark}{
        EN = {
            name = {Remark},
            crefname = {remark}{remarks},
            Crefname = {Remark}{Remarks},
        },
        FR = {
            name = {Remarque},
            crefname = {\crefthemark{la} remarque}{\crefthemark{les} remarques},
            Crefname = {La remarque}{Les remarques},
        },
        DE = {
            name = {Bemerkung},
            crefname = {Bemerkung}{Bemerkungen},
            Crefname = {Bemerkung}{Bemerkungen},
        },
        IT = {
            name = {Commento},
            crefname = {\crefthemark{il} commento}{\crefthemark{i} commenti},
            Crefname = {Il commento}{I commenti},
        },
        PT = {
            name = {Comentário},
            crefname = {\crefthemark{o} comentário}{\crefthemark{os} comentários},
            Crefname = {O comentário}{Os comentários},
        },
        BR = {
            name = {Comentário},
            crefname = {\crefthemark{o} comentário}{\crefthemark{os} comentários},
            Crefname = {O comentário}{Os comentários},
        },
        ES = {
            name = {Comentario},
            crefname = {\crefthemark{el} comentario}{los comentarios},
            Crefname = {El comentario}{Los comentarios},
        },
        CN = {
            name = {备注},
            crefname = {备注}{备注},
            Crefname = {备注}{备注},
        },
        TC = {
            name = {備註},
            crefname = {備註}{備註},
            Crefname = {備註}{備註},
        },
        JP = {
            name = {注釈},
            crefname = {注釈}{注釈},
            Crefname = {注釈}{注釈},
        },
        RU = {
            name = {Замечание},
            crefname = {замечание}{замечания},
            Crefname = {Замечание}{Замечания},
        },
    }
    \NameTheorem{observation}{
        EN = {
            name = {Observation},
            crefname = {observation}{observations},
            Crefname = {Observation}{Observations},
        },
        FR = {
            name = {Observation},
            crefname = {\crefthemark{la} observation}{\crefthemark{les} observations},
            Crefname = {La observation}{Les observations},
        },
        DE = {
            name = {Beobachtung},
            crefname = {Beobachtung}{Beobachtungen},
            Crefname = {Beobachtung}{Beobachtungen},
        },
        IT = {
            name = {Osservazione},
            crefname = {\crefthemark{l'}osservazione}{\crefthemark{le} osservazioni},
            Crefname = {L'osservazione}{Le osservazioni},
        },
        PT = {
            name = {Observação},
            crefname = {\crefthemark{a} observação}{\crefthemark{as} observações},
            Crefname = {A observação}{As observações},
        },
        BR = {
            name = {Observação},
            crefname = {\crefthemark{a} observação}{\crefthemark{as} observações},
            Crefname = {A observação}{As observações},
        },
        ES = {
            name = {Observación},
            crefname = {la observación}{las observaciones},
            Crefname = {La observación}{Las observaciones},
        },
        CN = {
            name = {观察},
            crefname = {观察}{观察},
            Crefname = {观察}{观察},
        },
        TC = {
            name = {觀察},
            crefname = {觀察}{觀察},
            Crefname = {觀察}{觀察},
        },
        JP = {
            name = {観察},
            crefname = {観察}{観察},
            Crefname = {観察}{観察},
        },
        RU = {
            name = {Наблюдение},
            crefname = {наблюдение}{наблюдения},
            Crefname = {Наблюдение}{Наблюдения},
        },
    }
    \NameTheorem{definition-proposition}{
        EN = {
            name = {\definitionnameEN-\propositionnameEN},
            crefname = {definition-proposition}{definitions-propositions},
            Crefname = {Definition-proposition}{Definitions-propositions},
        },
        FR = {
            name = {\definitionnameFR-\propositionnameFR},
            crefname = {\crefthemark{la} définition-proposition}{\crefthemark{les} définitions-propositions},
            Crefname = {La définition-proposition}{Les définitions-propositions},
        },
        DE = {
            name = {\definitionnameDE-\propositionnameDE},
            crefname = {Definition-Proposition}{Definitionen-Propositionen},
            Crefname = {Definition-Proposition}{Definitionen-Propositionen},
        },
        IT = {
            name = {\definitionnameIT-\propositionnameIT},
            crefname = {\crefthemark{la} definizione-proposizione}{\crefthemark{le} definizioni-proposte},
            Crefname = {La definizione-proposizione}{Le definizioni-proposte},
        },
        PT = {
            name = {\definitionnamePT-\propositionnamePT},
            crefname = {\crefthemark{a} definição-proposição}{\crefthemark{as} definições-proposições},
            Crefname = {A definição-proposição}{As definições-proposições},
        },
        BR = {
            name = {\definitionnameBR-\propositionnameBR},
            crefname = {\crefthemark{a} definição-proposição}{\crefthemark{as} definições-proposições},
            Crefname = {A definição-proposição}{As definições-proposições},
        },
        ES = {
            name = {\definitionnameES-\propositionnameES},
            crefname = {la definición-proposición}{las definiciones-proposiciones},
            Crefname = {La definición-proposición}{Las definiciones-proposiciones},
        },
        CN = {
            name = {\definitionnameCN-\propositionnameCN},
            crefname = {\definitionnameCN-\propositionnameCN}{\definitionnameCN-\propositionnameCN},
            Crefname = {\definitionnameCN-\propositionnameCN}{\definitionnameCN-\propositionnameCN},
        },
        TC = {
            name = {\definitionnameTC-\propositionnameTC},
            crefname = {\definitionnameTC-\propositionnameTC}{\definitionnameTC-\propositionnameTC},
            Crefname = {\definitionnameTC-\propositionnameTC}{\definitionnameTC-\propositionnameTC},
        },
        JP = {
            name = {\definitionnameJP-\propositionnameJP},
            crefname = {\definitionnameJP-\propositionnameJP}{\definitionnameJP-\propositionnameJP},
            Crefname = {\definitionnameJP-\propositionnameJP}{\definitionnameJP-\propositionnameJP},
        },
        RU = {
            name = {\definitionnameRU-\propositionnameRU},
            crefname = {определение-предложение}{определения-предложения},
            Crefname = {Определение-предложение}{Определения-предложение},
        },
    }
    \NameTheorem{definition-theorem}{
        EN = {
            name = {\definitionnameEN-\theoremnameEN},
            crefname = {definition-theorem}{definitions-theorems},
            Crefname = {Definition-theorem}{Definitions-theorems},
        },
        FR = {
            name = {\definitionnameFR-\theoremnameFR},
            crefname = {\crefthemark{la} définition-théorème}{\crefthemark{les} définitions-théorèmes},
            Crefname = {La définition-théorème}{Les définitions-théorèmes},
        },
        DE = {
            name = {\definitionnameDE-\theoremnameDE},
            crefname = {Definition-Satz}{Definitionen-Sätze},
            Crefname = {Definition-Satz}{Definitionen-Sätze},
        },
        IT = {
            name = {\definitionnameIT-\theoremnameIT},
            crefname = {\crefthemark{la} definizione-teorema}{\crefthemark{le} definizioni-teoremi},
            Crefname = {La definizione-teorema}{Le definizioni-teoremi},
        },
        PT = {
            name = {\definitionnamePT-\theoremnamePT},
            crefname = {\crefthemark{a} definição-teorema}{\crefthemark{as} definições-teoremas},
            Crefname = {A definição-teorema}{As definições-teoremas},
        },
        BR = {
            name = {\definitionnameBR-\theoremnameBR},
            crefname = {\crefthemark{a} definição-teorema}{\crefthemark{as} definições-teoremas},
            Crefname = {A definição-teorema}{As definições-teoremas},
        },
        ES = {
            name = {\definitionnameES-\theoremnameES},
            crefname = {la definición-teorema}{las definiciones-teoremas},
            Crefname = {La definición-teorema}{Las definiciones-teoremas},
        },
        CN = {
            name = {\definitionnameCN-\theoremnameCN},
            crefname = {\definitionnameCN-\theoremnameCN}{\definitionnameCN-\theoremnameCN},
            Crefname = {\definitionnameCN-\theoremnameCN}{\definitionnameCN-\theoremnameCN},
        },
        TC = {
            name = {\definitionnameTC-\theoremnameTC},
            crefname = {\definitionnameTC-\theoremnameTC}{\definitionnameTC-\theoremnameTC},
            Crefname = {\definitionnameTC-\theoremnameTC}{\definitionnameTC-\theoremnameTC},
        },
        JP = {
            name = {\definitionnameJP-\theoremnameJP},
            crefname = {\definitionnameJP-\theoremnameJP}{\definitionnameJP-\theoremnameJP},
            Crefname = {\definitionnameJP-\theoremnameJP}{\definitionnameJP-\theoremnameJP},
        },
        RU = {
            name = {\definitionnameRU-\theoremnameRU},
            crefname = {определение-теорема}{определения-теоремы},
            Crefname = {Определение-теорема}{Определения-теорема},
        },
    }
}{
%# 英文定理名称
%# 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{{Commento}}
    \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{{Fato}}
    \def\conjecturenameBR{{Conjectura}}
    \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}<PJLthm@highest>
    }{
        \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*}

\theoremstyle{definition}
\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}%
}
%</PJLthm>
%
%<*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[true]{complexname}
\DeclareBoolOption[false]{simplename}
\DeclareBoolOption[false]{useosf}
\DeclareBoolOption[false]{lmodern}
\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@simplename
    \@ProjLib@complexnamefalse
\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
\if@ProjLib@complexname\else
    \PassOptionsToPackage{simplename}{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@lmodern
    \RequirePackage{amssymb}
    \if@ProjLib@useosf
        \RequirePackage{cfr-lm}
    \else
        \RequirePackage{lmodern}
    \fi
    \PJLsetlinespacing{\setstretch{1.00}}
\fi

\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}
%</ProjLib>

\endinput