%%
%% This is file `PJLthm.sty',
%% generated with the docstrip utility.

%% Copyright (C) 2021 by Jinwen XU
%% 
%% This is part of the ProjLib Toolkit.
%% 
%% This work may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License, either version 1.3c of this license or (at
%% your option) any later version. The latest version of this license is in
%% 
%%     http://www.latex-project.org/lppl.txt
%% 
%% and version 1.3c or later is part of all distributions of LaTeX version
%% 2005/12/01 or later.
%% 
\NeedsTeXFormat{LaTeX2e}[2020-10-01]
\ProvidesPackage{PJLthm}
    [2021/05/20 Theorem setup and configuration]
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
\SetupKeyvalOptions{%
    family = @PJLthm,
    prefix = @PJLthm@
}
\DeclareBoolOption[false]{nothms}
\DeclareBoolOption[false]{fast}
\DeclareBoolOption[false]{regionalref}
\ProcessKeyvalOptions*\relax
\if@PJLthm@fast
    \@PJLthm@regionalreftrue
\fi

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

\RequirePackage{xstring}
\newcommand\PassFirstToSecond[2]{#2{#1}}%
\NewDocumentCommand{\CreateTheorem}{sm}{%
    \begingroup
    \protected@edef\temp{#2}%
    \expandafter\IfEndWith\expandafter{\temp}{*}{%
        \expandafter\StrGobbleRight\expandafter{\temp}{1}[\temp]%
        \PassFirstToSecond{*}%
    }{%
        \PassFirstToSecond{}%
    }%
    {\expandafter\PassFirstToSecond%
        \expandafter{\temp}{\endgroup\InnerCreateTheorem{#1}}}%
}%
\if@PJLthm@regionalref
\NewDocumentCommand{\InnerCreateTheorem}{mmmod<>d()}{%
    \IfBooleanTF{#1}{%
        \IfValueTF{#4}
            {\@firstoftwo}
            {\IfValueTF{#5}{\@firstoftwo}{\@secondoftwo}}%
    }{%
        \IfValueTF{#4}
            {\IfValueTF{#5}{\@firstoftwo}{\@secondoftwo}}{
            \@secondoftwo}
    }%
    {%
        \GenericError{}%
        {\string\CreateTheorem\space syntax error\on@line}{%
        You cannot call the starred variant with optional argument,\MessageBreak
        nor call the unstarred variant with several optional arguments.}%
        {}%
    }{%
        \IfValueTF{#6}{%
            \IfBooleanTF{#1}{%
                \ifcsmacro{#2#3}%
                {\renewenvironment{#2#3}{\begin{#6*}}{\end{#6*}}}%
                {\newenvironment{#2#3}{\begin{#6*}}{\end{#6*}}}%
            }{%
                \ifcsmacro{#2#3}%
                {\renewenvironment{#2#3}{\begin{#6}}{\end{#6}}}%
                {\newenvironment{#2#3}{\begin{#6}}{\end{#6}}}%
            }
        }{%
            \IfBooleanTF{#1}{%
                \newtheorem*{#2#3}{\csname#2name\csname\languagename ABBR\endcsname\endcsname}
            }{%
                \IfValueTF{#5}{%
                    \newtheorem{PJL#2#3}{\csname#2name\csname\languagename ABBR\endcsname\endcsname}[#5]%
                    \newaliascnt{#2#3}{PJL#2#3}%
                }{%
                    \IfValueTF{#4}{%
                            \newtheorem{PJL#2#3}[#4]{\csname#2name\csname\languagename ABBR\endcsname\endcsname}
                        }{%
                            \newtheorem{PJL#2#3}{\csname#2name\csname\languagename ABBR\endcsname\endcsname}
                            \newaliascnt{#2#3}{PJL#2#3}%
                        }%
                }%
                \crefname{PJL#2#3}%
                    {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                    {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                \Crefname{PJL#2#3}%
                    {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                    {\csname#2name\csname\languagename ABBR\endcsname\endcsname}%
                \NewDocumentEnvironment{#2#3}{}
                    {\begin{PJL#2#3}}
                    {\end{PJL#2#3}}
            }%
        }%
    }%
}%
\else
\NewDocumentCommand{\InnerCreateTheorem}{mmmod<>d()}{%
    \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*{#2EN#3}{\csname#2nameEN\endcsname}
                \newtheorem*{#2FR#3}{\csname#2nameFR\endcsname}
                \newtheorem*{#2DE#3}{\csname#2nameDE\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}
            }{%
                \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}}%
                }%
                %---------------------------------------------------------------
                \CreateTheoremNumberedLikeAliasCounter{#2}{EN}{#3}%
                \CreateTheoremNumberedLikeAliasCounter{#2}{FR}{#3}%
                \CreateTheoremNumberedLikeAliasCounter{#2}{DE}{#3}%
                \CreateTheoremNumberedLikeAliasCounter{#2}{CN}{#3}%
                \CreateTheoremNumberedLikeAliasCounter{#2}{TC}{#3}%
                \CreateTheoremNumberedLikeAliasCounter{#2}{JP}{#3}%
                \CreateTheoremNumberedLikeAliasCounter{#2}{RU}{#3}%
                %---------------------------------------------------------------
            }%
            \NewDocumentEnvironment{#2#3}{}
                {\csname#2\csname\languagename ABBR\endcsname#3\endcsname}%
                {\csname end#2\csname\languagename ABBR\endcsname#3\endcsname}%
        }%
    }%
}%
\NewDocumentCommand{\CreateTheoremNumberedLikeAliasCounter}{mmm}{%
    \newaliascnt{#1#2#3}{#1#3}%
    \newtheorem{#1#2#3}[{#1#2#3}]{\csname#1name#2\endcsname}%
    \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}%
}%
\fi

%% English theorems names
\def\theoremnameEN{Theorem}
\def\lemmanameEN{Lemma}
\def\propositionnameEN{Proposition}
\def\corollarynameEN{Corollary}
\def\propertynameEN{Property}
\def\factnameEN{Fact}
\def\conjecturenameEN{Conjecture}
\def\definitionnameEN{Definition}
\def\axiomnameEN{Axiom}
\def\assumptionnameEN{Assumption}
\def\conventionnameEN{Convention}
\def\hypothesisnameEN{Hypothesis}
\def\notationnameEN{Notation}
\def\examplenameEN{Example}
\def\problemnameEN{Problem}
\def\questionnameEN{Question}
\def\exercisenameEN{Exercise}
\def\remarknameEN{Remark}
\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}
\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}
\expandafter\def\csname definition-propositionnameDE\endcsname{\definitionnameDE-\propositionnameDE}
\expandafter\def\csname definition-theoremnameDE\endcsname{\definitionnameDE-\theoremnameDE}

%% 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{备注}
\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{備註}
\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{注釈}
\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{Замечание} % Замеча́ние
\expandafter\def\csname definition-propositionnameRU\endcsname{\definitionnameRU-\propositionnameRU}
\expandafter\def\csname definition-theoremnameRU\endcsname{\definitionnameRU-\theoremnameRU}

\newif\ifPJLthm@IsBook
\ifdefined\chapter\PJLthm@IsBooktrue\else\PJLthm@IsBookfalse\fi
\if@PJLthm@nothms\else
%% Theorem environments
\ifbool{PJLthm@IsBook}{
    \newaliascnt{highest}{chapter}
}{
    \newaliascnt{highest}{section}
}
\CreateTheorem{theorem}<highest>
\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]
\CreateTheorem*{theorem*}
\CreateTheorem*{lemma*}
\CreateTheorem*{proposition*}
\CreateTheorem*{corollary*}
\CreateTheorem*{definition-proposition*}
\CreateTheorem*{definition-theorem*}
\CreateTheorem*{property*}
\CreateTheorem*{fact*}
\CreateTheorem*{conjecture*}

\theoremstyle{definition}
\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]
\CreateTheorem*{definition*}
\CreateTheorem*{axiom*}
\CreateTheorem*{assumption*}
\CreateTheorem*{convention*}
\CreateTheorem*{hypothesis*}
\CreateTheorem*{notation*}
\CreateTheorem*{example*}
\CreateTheorem*{problem*}
\CreateTheorem*{question*}
\CreateTheorem*{exercise*}

\theoremstyle{remark}
\CreateTheorem{remark}<highest>
\CreateTheorem*{remark*}
\numberwithin{equation}{highest}
\fi

\gappto{\PJLlang@langconfig@chinese}{%
    \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@tchinese}{%
    \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@japanese}{%
    \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@russian}{%
    \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~}%
}

\endinput
%%
%% End of file `PJLthm.sty'.
