summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-03-12 20:34:57 +0000
committerKarl Berry <karl@freefriends.org>2022-03-12 20:34:57 +0000
commit59ff8f4e94052fa74de0630c02c6f72099e9f60b (patch)
treeab4cf2aea3187d5b6007d6d30380efdd025bf586 /Master/texmf-dist/source/latex
parent3b77cea124ec726fae82ebc0edaffbc909bae368 (diff)
projlib (12mar22) (branch)
git-svn-id: svn://tug.org/texlive/branches/branch2021.final@62662 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex')
-rw-r--r--Master/texmf-dist/source/latex/projlib/ProjLib.dtx4569
-rw-r--r--Master/texmf-dist/source/latex/projlib/ProjLib.ins74
2 files changed, 4643 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/projlib/ProjLib.dtx b/Master/texmf-dist/source/latex/projlib/ProjLib.dtx
new file mode 100644
index 00000000000..39ba3ccd037
--- /dev/null
+++ b/Master/texmf-dist/source/latex/projlib/ProjLib.dtx
@@ -0,0 +1,4569 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2021-2022 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]
+\RequirePackage{l3keys2e}
+%
+%<*ProjLib>
+\ProvidesExplPackage
+ {ProjLib}
+ {2022/03/11} {}
+ {Collective interface of the ProjLib toolkit}
+%</ProjLib>
+%
+%<*projlib-author>
+\ProvidesExplPackage
+ {projlib-author}
+ {2022/03/11} {}
+ {Enhanced author information block}
+%</projlib-author>
+%
+%<*projlib-datetime>
+\ProvidesExplPackage
+ {projlib-datetime}
+ {2022/03/11} {}
+ {Convert numeric date-time string to natural language}
+%</projlib-datetime>
+%
+%<*projlib-draft>
+\ProvidesExplPackage
+ {projlib-draft}
+ {2022/03/11} {}
+ {Useful commands during draft stage}
+%</projlib-draft>
+%
+%<*projlib-font>
+\ProvidesExplPackage
+ {projlib-font}
+ {2022/03/11} {}
+ {Font selection and configuration}
+%</projlib-font>
+%
+%<*projlib-language>
+\ProvidesExplPackage
+ {projlib-language}
+ {2022/03/11} {}
+ {Multi-language configuration}
+%</projlib-language>
+%
+%<*projlib-logo>
+\ProvidesExplPackage
+ {projlib-logo}
+ {2022/03/11} {}
+ {The ProjLib logo}
+%</projlib-logo>
+%
+%<*projlib-math>
+\ProvidesExplPackage
+ {projlib-math}
+ {2022/03/11} {}
+ {Efficient math setup}
+%</projlib-math>
+%
+%<*projlib-paper>
+\ProvidesExplPackage
+ {projlib-paper}
+ {2022/03/11} {}
+ {Configuration of the paper style}
+%</projlib-paper>
+%
+%<*projlib-theorem>
+\ProvidesExplPackage
+ {projlib-theorem}
+ {2022/03/11} {}
+ {Configuration of theorem-like environments}
+%</projlib-theorem>
+
+%<*ProjLib>
+\keys_define:nn { ProjLib }
+ {
+ , author .bool_set:N = \l__projlib_main_author_bool
+ , author .initial:n = { false }
+ , author-block .bool_set:N = \l__projlib_main_author_bool
+ , author~block .bool_set:N = \l__projlib_main_author_bool
+ , author block .bool_set:N = \l__projlib_main_author_bool
+ , ams-fashion .bool_set:N = \l__projlib_main_amsfashion_bool
+ , ams-fashion .initial:n = { false }
+ , ams~fashion .bool_set:N = \l__projlib_main_amsfashion_bool
+ , ams fashion .bool_set:N = \l__projlib_main_amsfashion_bool
+ , unknown .code:n = {
+ \PassOptionsToPackage { \CurrentOption } { projlib-language }
+ \PassOptionsToPackage { \CurrentOption } { projlib-author }
+ \PassOptionsToPackage { \CurrentOption } { projlib-datetime }
+ \PassOptionsToPackage { \CurrentOption } { projlib-draft }
+ \PassOptionsToPackage { \CurrentOption } { projlib-font }
+ \PassOptionsToPackage { \CurrentOption } { projlib-logo }
+ \PassOptionsToPackage { \CurrentOption } { projlib-math }
+ \PassOptionsToPackage { \CurrentOption } { projlib-paper }
+ \PassOptionsToPackage { \CurrentOption } { projlib-theorem }
+ }
+ }
+\ProcessKeysOptions { ProjLib }
+
+\bool_if:NT \l__projlib_main_amsfashion_bool
+ {
+ \bool_set_true:N \l__projlib_main_author_bool
+ \PassOptionsToPackage { amsfashion } { projlib-author }
+ }
+
+\RequirePackage { projlib-language }
+
+\bool_if:NT \l__projlib_main_author_bool
+ {
+ \RequirePackage { projlib-author }
+ }
+\RequirePackage { projlib-datetime }
+\RequirePackage { projlib-draft }
+\RequirePackage { projlib-font }
+\RequirePackage { projlib-logo }
+\RequirePackage { projlib-math }
+\RequirePackage { projlib-paper }
+
+\RequirePackage { projlib-theorem }
+%</ProjLib>
+%
+%<*projlib-author>
+\keys_define:nn { projlib-author }
+ {
+ , ams-fashion .bool_set:N = \l__projlib_author_amsfashion_bool
+ , ams-fashion .initial:n = { false }
+ , ams~fashion .bool_set:N = \l__projlib_author_amsfashion_bool
+ , ams fashion .bool_set:N = \l__projlib_author_amsfashion_bool
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-author }
+
+\cs_if_exist:NT \subjclass { \endinput }
+
+\tl_new:N \g__projlib_author_font_author_tl
+\tl_new:N \g__projlib_author_font_address_tl
+\tl_new:N \g__projlib_author_font_curraddr_tl
+\tl_new:N \g__projlib_author_font_email_tl
+
+\tl_gset:Nn \g__projlib_author_font_author_tl { \normalsize \normalfont \scshape }
+\tl_gset:Nn \g__projlib_author_font_address_tl { \small \normalfont \itshape }
+\tl_gset:Nn \g__projlib_author_font_curraddr_tl { \small \normalfont \itshape }
+\tl_gset:Nn \g__projlib_author_font_email_tl { \small \normalfont \ttfamily }
+
+\dim_new:N \g__projlib_author_length_innersep_dim
+\dim_new:N \g__projlib_author_length_sep_dim
+\dim_new:N \g__projlib_author_length_aftersep_dim
+
+\dim_set:Nn \g__projlib_author_length_innersep_dim { 0.3 \baselineskip }
+\dim_set:Nn \g__projlib_author_length_sep_dim { 0.5 \baselineskip }
+\dim_set:Nn \g__projlib_author_length_aftersep_dim { 0.3 \baselineskip }
+
+
+\bool_new:N \g__projlib_author_affil_already_exist_bool
+
+\NewCommandCopy \projlib_author_backup_author:w \author
+\RenewDocumentCommand \author { m }
+ {
+ \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
+ {
+ \phantom {A} \\[-\baselineskip]
+ \skip_vertical:n { \g__projlib_author_length_sep_dim }
+ { \g__projlib_author_font_author_tl #1 }
+ \bool_set_false:N \g__projlib_author_affil_already_exist_bool
+ \\ \phantom {}
+ }
+ }
+
+\ProvideDocumentCommand \address { m }
+ {
+ \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
+ {
+ \phantom {A} \\[-\baselineskip]
+ \bool_if:NF \g__projlib_author_affil_already_exist_bool
+ {
+ \skip_vertical:n { \g__projlib_author_length_innersep_dim }
+ }
+ \bool_set_true:N \g__projlib_author_affil_already_exist_bool
+ { \g__projlib_author_font_address_tl #1 }
+ \\ \phantom {}
+ }
+ }
+
+\ProvideDocumentCommand \curraddr { m }
+ {
+ \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
+ {
+ \phantom {A} \\[-\baselineskip]
+ \bool_if:NF \g__projlib_author_affil_already_exist_bool
+ {
+ \skip_vertical:n { \g__projlib_author_length_innersep_dim }
+ }
+ \bool_set_true:N \g__projlib_author_affil_already_exist_bool
+ { \g__projlib_author_font_curraddr_tl #1 }
+ \\ \phantom {}
+ }
+ }
+
+\ProvideDocumentCommand \email { m }
+ {
+ \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
+ {
+ \phantom {A} \\[-\baselineskip]
+ \bool_if:NF \g__projlib_author_affil_already_exist_bool
+ {
+ \skip_vertical:n { \g__projlib_author_length_innersep_dim }
+ }
+ \bool_set_true:N \g__projlib_author_affil_already_exist_bool
+ { \g__projlib_author_font_email_tl #1 }
+ \\ \phantom {}
+ }
+ }
+
+\RequirePackage { regexpatch }
+
+\xpatchcmd { \@maketitle } { \begin{tabular}[t]{c} } {} {
+ \xpatchcmd { \@maketitle } { \end{tabular} } {} {} {}
+} {}
+
+\tl_set:cn {@author} {}
+
+\hook_gput_code:nnn { cmd/@maketitle/before } { projlib-author }
+ {
+ \hook_gput_code:nnn { cmd/@author/before } { projlib-author }
+ {
+ \skip_vertical:n { - \g__projlib_author_length_sep_dim }
+ }
+ \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
+ {
+ \skip_vertical:n { - \baselineskip }
+ \bool_if:NT \g__projlib_author_affil_already_exist_bool
+ {
+ \skip_vertical:n { \g__projlib_author_length_aftersep_dim }
+ }
+ }
+ }
+
+\bool_if:NT \l__projlib_author_amsfashion_bool
+ {
+ \RequirePackage{ projlib-language }
+
+ \tl_new:N \g_projlib_author_keywordsname_style_tl
+ \tl_gset:Nn \g_projlib_author_keywordsname_style_tl {}
+
+ \projlib_langauge_define_multilingual_text:Nn \keywordsname
+ {
+ EN = \textsc{Key~words~and~phrases} ,
+ FR = \textsc{Mots~et~phrases~clés} ,
+ DE = \textsc{Schlüsselwörter~und~Phrasen} ,
+ IT = \textsc{Parole~e~frasi~chiave} ,
+ PT = \textsc{Palavras~e~frases~chave} ,
+ BR = \textsc{Palavras~e~frases~chave} ,
+ ES = \textsc{Palabras~y~frases~clave} ,
+ CN = 关键词 ,
+ TC = 關鍵詞 ,
+ JP = キーワード ,
+ RU = Ключевые~слова~и~фразы ,
+ }
+
+ \tl_new:N \g__projlib_author_keywords_tl
+ \NewDocumentCommand \keywords { m }
+ {
+ \tl_gset:Nn \g__projlib_author_keywords_tl { #1 }
+ }
+
+ \tl_new:N \g__projlib_author_dedicatory_tl
+ \NewDocumentCommand \dedicatory { m }
+ {
+ \tl_gset:Nn \g__projlib_author_dedicatory_tl { #1 }
+ }
+
+ \hook_gput_code:nnn { begindocument/before } { projlib-author }
+ {
+ \NewCommandCopy \projlib_author_backup_footnotemark: \footnotemark
+ \tl_gset:Nn \footnotemark {}
+
+ \NewCommandCopy \projlib_author_backup_thanks:w \thanks
+ \cs_undefine:N \thanks
+
+ % measure the width of "*"
+ \hbox_set:Nn \l_tmpa_box { * }
+ \dim_const:Nn \c__projlib_author_length_width_of_asterisk_dim { \box_wd:N \l_tmpa_box }
+
+ \cs_new_nopar:Nn \projlib_author_pre_thanks:n
+ {
+ \projlib_author_backup_thanks:w
+ {
+ \skip_horizontal:n { - \c__projlib_author_length_width_of_asterisk_dim }
+ #1
+ }
+ }
+
+ \NewDocumentCommand \thanks { m }
+ {
+ \tl_if_blank:nF { #1 }
+ {
+ \hook_gput_code:nnn { cmd/@title/after } { projlib-author }
+ {
+ \projlib_author_pre_thanks:n { #1 }
+ }
+ }
+ }
+
+ \NewCommandCopy \projlib_author_backup_my_author:w \author
+ \RenewDocumentCommand \author { m }
+ {
+ \projlib_author_backup_my_author:w
+ {
+ \RenewCommandCopy \footnotemark \projlib_author_backup_footnotemark:
+ \RenewCommandCopy \thanks \projlib_author_backup_thanks:w
+ #1
+ \cs_undefine:N \footnotemark
+ }
+ }
+ }
+
+ \NewCommandCopy \projlib_author_backup_abstract: \abstract
+ \NewCommandCopy \projlib_author_backup_endabstract: \endabstract
+ \cs_undefine:N \abstract
+ \cs_undefine:N \endabstract
+
+ \bool_new:N \g__projlib_author_already_maketitle_bool
+ \bool_gset_false:N \g__projlib_author_already_maketitle_bool
+ \bool_new:N \g__projlib_author_abstract_before_maketitle_bool
+ \bool_gset_false:N \g__projlib_author_abstract_before_maketitle_bool
+
+ \msg_redirect_name:nnn { scontents } { unsupported-verbatim } { info }
+ \RequirePackage{ scontents }
+ \newenvsc{abstract}[store-env=projlib-author-abstract,print-env=false]
+
+ \hook_gput_code:nnn { env/abstract/after } { projlib-author }
+ {
+ \bool_if:NTF \g__projlib_author_already_maketitle_bool
+ {
+ \projlib_author_backup_abstract:
+ \getstored{projlib-author-abstract}
+ \projlib_author_backup_endabstract:
+ }
+ {
+ \bool_gset_true:N \g__projlib_author_abstract_before_maketitle_bool
+ }
+ }
+
+ \hook_gput_code:nnn { begindocument/before } { projlib-author }
+ {
+ \makeatletter
+ \xpatchcmd { \@maketitle } { \@date }
+ {
+ \tl_if_blank:eTF { \@date } { \skip_vertical:n { -2 \baselineskip } } { \@date }
+ \tl_if_blank:eF { \g__projlib_author_dedicatory_tl }
+ {
+ \tl_if_blank:eT { \@date } { \skip_vertical:n { 2 \baselineskip } }
+ \par
+ \skip_vertical:n { -\parskip }
+ \skip_vertical:n { \baselineskip }
+ \textit{ \g__projlib_author_dedicatory_tl }
+ \tl_if_blank:eT { \@date }
+ {
+ \skip_vertical:n { -\parskip }
+ \skip_vertical:n { \dim_eval:n { -1.7 \baselineskip } }
+ }
+ }
+ } {} {}
+ \makeatother
+
+ \hook_gput_code:nnn { cmd/maketitle/before } { projlib-author }
+ {
+ \tl_if_blank:eF { \g__projlib_author_keywords_tl }
+ {
+ \projlib_author_pre_thanks:n
+ {
+ \group_begin:
+ \g_projlib_author_keywordsname_style_tl
+ \keywordsname .
+ \group_end:
+ \c_space_tl
+ \g__projlib_author_keywords_tl
+ }
+ }
+ }
+
+ \hook_gput_code:nnn { cmd/maketitle/after } { projlib-author }
+ {
+ \bool_if:NT \g__projlib_author_abstract_before_maketitle_bool
+ {
+ \projlib_author_backup_abstract:
+ \getstored{projlib-author-abstract}
+ \projlib_author_backup_endabstract:
+ }
+ \cs_undefine:N \address
+ \cs_undefine:N \curraddr
+ \cs_undefine:N \email
+ \cs_undefine:N \dedicatory
+ \cs_undefine:N \keywords
+ \bool_gset_true:N \g__projlib_author_already_maketitle_bool
+ }
+ }
+
+ \tl_new:N \l_projlib_author_subjclassname_tl
+ \tl_new:N \l_projlib_author_subjclass_tl
+ \msg_new:nnn { projlib-author }
+ { unknown-msc-edition }
+ { Unknown~edition~(#1)~of~Mathematics~Subject~Classification;~using~'2020' }
+ \NewDocumentCommand \subjclass { O{2020} m }
+ {
+ \tl_set:Nn \l_projlib_author_subjclass_tl { #2 }
+ \tl_if_exist:cTF { subjclassname_#1 }
+ {
+ \tl_set:Nn \l_projlib_author_subjclassname_tl { \tl_use:c { subjclassname_#1 } }
+ }
+ {
+ \msg_warning:nnn { projlib-author } { unknown-msc-edition } { #1 }
+ \tl_set:Nn \l_projlib_author_subjclassname_tl { \tl_use:c { subjclassname_2020 } }
+ }
+ \projlib_author_pre_thanks:n
+ {
+ \textit{ \l_projlib_author_subjclassname_tl . }
+ \enspace
+ \l_projlib_author_subjclass_tl .
+ }
+ }
+ \tl_const:cn { subjclassname_1991 } { \textup{1991}~Mathematics~Subject~Classification }
+ \tl_const:cn { subjclassname_2000 } { \textup{2000}~Mathematics~Subject~Classification }
+ \tl_const:cn { subjclassname_2010 } { \textup{2010}~Mathematics~Subject~Classification }
+ \tl_const:cn { subjclassname_2020 } { \textup{2020}~Mathematics~Subject~Classification }
+ }
+%</projlib-author>
+%
+%<*projlib-datetime>
+\tl_new:N \g__projlib_datetime_input_format_tl
+\tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day }
+
+\keys_define:nn { projlib-datetime }
+ {
+ , plain .bool_set:N = \l__projlib_datetime_plain_bool
+ , plain .initial:n = { false }
+ , year-month-day .code:n = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
+ , month-day-year .code:n = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { month-day-year } }
+ , day-month-year .code:n = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
+ , year-month .code:n = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
+ , month-day .code:n = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
+ , month-year .code:n = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
+ , day-month .code:n = { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-datetime }
+
+\bool_if:NT \l__projlib_datetime_plain_bool
+ {
+ \hook_gput_code:nnn { begindocument/before } { projlib-datetime }
+ {
+ \cs_set:Nn \projlib_datetime_text_superscript:n { #1 }
+ }
+ }
+
+\tl_new:N \l__projlib_datetime_output_format_tl
+\keys_define:nn { projlib-datetime-command }
+ {
+ , year-month-day .code:n = { \tl_set:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
+ , month-day-year .code:n = { \tl_set:Nn \g__projlib_datetime_input_format_tl { month-day-year } }
+ , day-month-year .code:n = { \tl_set:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
+ , year-month .code:n = { \tl_set:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
+ , month-day .code:n = { \tl_set:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
+ , month-year .code:n = { \tl_set:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
+ , day-month .code:n = { \tl_set:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
+ , only-year-month .code:n = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-year-month } }
+ , only-month-day .code:n = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-month-day } }
+ , only-year .code:n = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-year } }
+ , only-month .code:n = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-month } }
+ , only-day .code:n = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-day } }
+ , unknown .code:n = {}
+ }
+
+\msg_new:nnnn { projlib-datetime }
+ { non-supported-date-format }
+ { The~date~format~"#1"~is~not~supported. }
+ { The~only~formats~available~are~"year-month-day",~ "month-day-year"~and~"day-month-year". }
+
+\cs_new:Nn \projlib_datetime_set_input_format:n
+ {
+ \str_case:nnF { #1 }
+ {
+ { year-month-day } { \tl_gset:Nn \g__projlib_datetime_input_format_tl { year-month-day } }
+ { month-day-year } { \tl_gset:Nn \g__projlib_datetime_input_format_tl { month-day-year } }
+ { day-month-year } { \tl_gset:Nn \g__projlib_datetime_input_format_tl { day-month-year } }
+ }
+ {
+ \msg_error:nnn { projlib-datetime } { non-supported-date-format } { #1 }
+ }
+ }
+
+\NewDocumentCommand \ProjLibSetDatetimeInputFormat { m }
+ {
+ \projlib_datetime_set_input_format:n { #1 }
+ }
+
+
+\seq_new:N \l__projlib_datetime_date_seq
+
+\cs_new_protected:Nn \projlib_datetime_text_superscript:n
+ {
+ \group_begin:
+ \small
+ \textsuperscript { #1 }
+ \group_end:
+ }
+
+
+\cs_new:Nn \__projlib_datetime_today:n
+ {
+ \str_case_e:nnF { \l__projlib_datetime_output_format_tl }
+ {
+ { only-year-month }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_year_month #1 _ \languagename :nn }
+ { \int_use:N \c_sys_year_int }
+ { \int_use:N \c_sys_month_int }
+ }
+ { only-month-day }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_month_day #1 _ \languagename :nn }
+ { \int_use:N \c_sys_month_int }
+ { \int_use:N \c_sys_day_int }
+ }
+ { only-year }
+ {
+ \cs_if_exist_use:cT { projlib_datetime_display_year #1 _ \languagename :n }
+ {
+ { \int_use:N \c_sys_year_int }
+ }
+ }
+ { only-month }
+ {
+ \cs_if_exist_use:cT { projlib_datetime_display_month #1 _ \languagename :n }
+ {
+ { \int_use:N \c_sys_month_int }
+ }
+ }
+ { only-day }
+ {
+ \cs_if_exist_use:cT { projlib_datetime_display_day #1 _ \languagename :n }
+ {
+ { \int_use:N \c_sys_day_int }
+ }
+ }
+ }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_year_month_day #1 _ \languagename :nnn }
+ { \int_use:N \c_sys_year_int }
+ { \int_use:N \c_sys_month_int }
+ { \int_use:N \c_sys_day_int }
+ }
+ }
+
+\NewDocumentCommand \ProjLibtoday { O{} }
+ {
+ \group_begin:
+ \keys_set:nn { projlib-datetime-command } { #1 }
+ \__projlib_datetime_today:n {}
+ \group_end:
+ }
+
+\NewDocumentCommand \ProjLibToday { O{} }
+ {
+ \group_begin:
+ \keys_set:nn { projlib-datetime-command } { #1 }
+ \__projlib_datetime_today:n { _uppercase }
+ \group_end:
+ }
+
+
+\cs_new_protected:Nn \projlib_datetime_display_year_month_day:n
+ {
+ \__projlib_datetime_display_year_month_day:en { #1 } {}
+ }
+
+\cs_new_protected:Nn \projlib_datetime_display_year_month_day_uppercase:n
+ {
+ \__projlib_datetime_display_year_month_day:en { #1 } { _uppercase }
+ }
+
+\cs_new_protected:Nn \__projlib_datetime_display_year_month_day:nn
+ {
+ \regex_match:nnTF { \A \d{4}-\d{1,2}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_year_month_day #2 _ \languagename :nnn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % year
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } } % day
+ }
+ {
+ \regex_match:nnTF { \A \d{4}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % year
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
+ }
+ {
+ \regex_match:nnTF { \A \d{1,2}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % day
+ }
+ {
+ #1
+ }
+ }
+ }
+ }
+\cs_generate_variant:Nn \__projlib_datetime_display_year_month_day:nn { en }
+
+
+\cs_new_protected:Nn \projlib_datetime_display_month_day_year:n
+{
+ \__projlib_datetime_display_month_day_year:en { #1 } {}
+}
+
+\cs_new_protected:Nn \projlib_datetime_display_month_day_year_uppercase:n
+{
+ \__projlib_datetime_display_month_day_year:en { #1 } { _uppercase }
+}
+
+\cs_new_protected:Nn \__projlib_datetime_display_month_day_year:nn
+{
+ \regex_match:nnTF { \A \d{1,2}-\d{1,2}-\d{4} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_month_day_year #2 _ \languagename :nnn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } } % year
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % day
+ }
+ {
+ \regex_match:nnTF { \A \d{1,2}-\d{4} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % year
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
+ }
+ {
+ \regex_match:nnTF { \A \d{1,2}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % day
+ }
+ {
+ #1
+ }
+ }
+ }
+}
+\cs_generate_variant:Nn \__projlib_datetime_display_month_day_year:nn { en }
+
+
+\cs_new_protected:Nn \projlib_datetime_display_day_month_year:n
+{
+ \__projlib_datetime_display_day_month_year:en { #1 } {}
+}
+
+\cs_new_protected:Nn \projlib_datetime_display_day_month_year_uppercase:n
+{
+ \__projlib_datetime_display_day_month_year:en { #1 } { _uppercase }
+}
+
+\cs_new_protected:Nn \__projlib_datetime_display_day_month_year:nn
+{
+ \regex_match:nnTF { \A \d{1,2}-\d{1,2}-\d{4} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_day_month_year #2 _ \languagename :nnn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } } % year
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % day
+ }
+ {
+ \regex_match:nnTF { \A \d{1,2}-\d{4} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % year
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % month
+ }
+ {
+ \regex_match:nnTF { \A \d{1,2}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } } % month
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } } % day
+ }
+ {
+ #1
+ }
+ }
+ }
+}
+\cs_generate_variant:Nn \__projlib_datetime_display_day_month_year:nn { en }
+
+
+\cs_new_protected:Nn \__projlib_datetime_date_parse_year_month_day:n
+ {
+ \regex_match:nnTF { \A \d{4}-\d{1,2}(|-\d{1,2}) \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ }
+ {
+ \regex_match:nnT { \A \d{1,2}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \seq_put_left:Nn \l__projlib_datetime_date_seq {}
+ }
+ }
+ }
+
+\cs_new_protected:Nn \__projlib_datetime_date_parse_month_day_year:n
+ {
+ \regex_match:nnTF { \A \d{1,2}(|-\d{1,2})-\d{4} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \seq_pop_right:NN \l__projlib_datetime_date_seq \l_tmpa_tl
+ \seq_put_left:NV \l__projlib_datetime_date_seq \l_tmpa_tl
+ }
+ {
+ \regex_match:nnT { \A \d{1,2}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \seq_put_left:Nn \l__projlib_datetime_date_seq {}
+ }
+ }
+ }
+
+\cs_new_protected:Nn \__projlib_datetime_date_parse_day_month_year:n
+ {
+ \regex_match:nnTF { \A \d{1,2}(|-\d{1,2})-\d{4} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \seq_reverse:N \l__projlib_datetime_date_seq
+ }
+ {
+ \regex_match:nnT { \A \d{1,2}-\d{1,2} \Z } { #1 }
+ {
+ \seq_set_split:Nnn \l__projlib_datetime_date_seq { - } { #1 }
+ \seq_reverse:N \l__projlib_datetime_date_seq
+ \seq_put_left:Nn \l__projlib_datetime_date_seq {}
+ }
+ }
+ }
+
+\cs_new:Nn \__projlib_datetime_input_format_to_str:
+ {
+ \str_case_e:nn { \g__projlib_datetime_input_format_tl }
+ {
+ { year-month-day } { year_month_day }
+ { month-day-year } { month_day_year }
+ { day-month-year } { day_month_year }
+ }
+ }
+
+\cs_new_protected:Nn \__projlib_datetime_display_date_according_to_format:nn
+ {
+ \cs_if_exist_use:c { __projlib_datetime_date_parse_ \__projlib_datetime_input_format_to_str: :n } { #1 }
+ \str_case_e:nnF { \l__projlib_datetime_output_format_tl }
+ {
+ { only-year-month }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_year_month #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
+ }
+ { only-month-day }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_month_day #2 _ \languagename :nn }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } }
+ }
+ { only-year }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_year #2 _ \languagename :n }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } }
+ }
+ { only-month }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_month #2 _ \languagename :n }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
+ }
+ { only-day }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_day #2 _ \languagename :n }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } }
+ }
+ }
+ {
+ \cs_if_exist_use:c { projlib_datetime_display_ \__projlib_datetime_input_format_to_str: #2 :n } { #1 }
+ }
+ }
+
+\NewDocumentCommand \ProjLibdate { O{} m O{} }
+ {
+ \group_begin:
+ \tl_if_blank:eF { #1 } { \keys_set:nn { projlib-datetime-command } { #1 } }
+ \tl_if_blank:eF { #3 } { \keys_set:nn { projlib-datetime-command } { #3 } }
+ \tl_set:Nx \l_tmpa_tl { #2 }
+ \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
+ \exp_args:Ne \__projlib_datetime_display_date_according_to_format:nn { \l_tmpa_tl } {}
+ \group_end:
+ }
+
+ \NewDocumentCommand \ProjLibDate { O{} m O{} }
+ {
+ \group_begin:
+ \tl_if_blank:eF { #1 } { \keys_set:nn { projlib-datetime-command } { #1 } }
+ \tl_if_blank:eF { #3 } { \keys_set:nn { projlib-datetime-command } { #3 } }
+ \tl_set:Nx \l_tmpa_tl { #2 }
+ \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
+ \exp_args:Ne \__projlib_datetime_display_date_according_to_format:nn { \l_tmpa_tl } { _uppercase }
+ \group_end:
+ }
+
+\ProvideDocumentCommand \Thedate {} { \ProjLibdate }
+\ProvideDocumentCommand \TheDate {} { \ProjLibDate }
+
+
+\int_new:N \l__projlib_datetime_day_of_week_day_int
+\int_new:N \l__projlib_datetime_day_of_week_month_int
+\int_new:N \l__projlib_datetime_day_of_week_year_int
+\int_new:N \l__projlib_datetime_day_of_week_century_int
+\int_new:N \l__projlib_datetime_day_of_week_result_int
+\cs_new:Nn \__projlib_datetime_calculate_day_of_week_with_year_month_day:nnn
+ {
+ \int_set:Nn \l__projlib_datetime_day_of_week_day_int { #3 }
+ \int_compare:nNnTF { #2 } < { 3 }
+ {
+ \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_eval:n { #1 - 1 } }
+ }
+ {
+ \int_set:Nn \l__projlib_datetime_day_of_week_year_int { #1 }
+ }
+ \int_set:Nn \l__projlib_datetime_day_of_week_century_int { \int_eval:n { \l__projlib_datetime_day_of_week_year_int / 100 } }
+ \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_mod:nn { \l__projlib_datetime_day_of_week_year_int } { 100 } }
+ \int_set:Nn \l__projlib_datetime_day_of_week_month_int
+ {
+ \int_case:nnF { #2 }
+ {
+ { 1 } { 0 }
+ { 2 } { 3 }
+ { 3 } { 2 }
+ { 4 } { 5 }
+ { 5 } { 0 }
+ { 6 } { 3 }
+ { 7 } { 5 }
+ { 8 } { 1 }
+ { 9 } { 4 }
+ { 10 } { 6 }
+ { 11 } { 2 }
+ { 12 } { 4 }
+ } { 0 }
+ }
+ \int_set:Nn \l__projlib_datetime_day_of_week_result_int
+ {
+ \int_eval:n
+ {
+ \l__projlib_datetime_day_of_week_day_int
+ + \l__projlib_datetime_day_of_week_month_int
+ +\l__projlib_datetime_day_of_week_year_int
+ + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_year_int } { 4 }
+ + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_century_int } { 4 }
+ - 2 * \l__projlib_datetime_day_of_week_century_int
+ }
+ }
+ \int_set:Nn \l__projlib_datetime_day_of_week_result_int
+ {
+ \int_mod:nn { \l__projlib_datetime_day_of_week_result_int } { 7 }
+ }
+ \int_compare:nNnT { \l__projlib_datetime_day_of_week_result_int } < { 1 }
+ {
+ \int_set:Nn \l__projlib_datetime_day_of_week_result_int
+ {
+ \int_eval:n { \l__projlib_datetime_day_of_week_result_int + 7 }
+ }
+ }
+ }
+
+
+\cs_new_protected:Nn \projlib_datetime_display_week:n
+ {
+ \__projlib_datetime_display_week_according_to_format:en { #1 } {}
+ }
+
+\cs_new_protected:Nn \projlib_datetime_display_week_uppercase:n
+ {
+ \__projlib_datetime_display_week_according_to_format:en { #1 } { _uppercase }
+ }
+
+\cs_new_protected:Nn \__projlib_datetime_display_week_according_to_format:nn
+ {
+ \projlib_datetime_calculate_week_according_to_format:n { #1 }
+ \cs_if_exist_use:c { projlib_datetime_display_week #2 _ \languagename :n } { \l__projlib_datetime_day_of_week_result_int }
+ }
+\cs_generate_variant:Nn \__projlib_datetime_display_week_according_to_format:nn { en }
+
+
+\cs_new_protected:Nn \projlib_datetime_calculate_week_according_to_format:n
+ {
+ \cs_if_exist_use:c { __projlib_datetime_date_parse_ \__projlib_datetime_input_format_to_str: :n } { #1 }
+ \__projlib_datetime_calculate_day_of_week_with_year_month_day:nnn
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 1 } } }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 2 } } }
+ { \int_eval:n { \seq_item:Nn \l__projlib_datetime_date_seq { 3 } } }
+ }
+
+
+% For each language, there are 7 groups of functions:
+% 1) \projlib_datetime_display_year_month_day_<languagename>:nnn
+% \projlib_datetime_display_year_month_day_uppercase_<languagename>:nnn
+% 2) \projlib_datetime_display_year_month_<languagename>:nn
+% \projlib_datetime_display_year_month_uppercase_<languagename>:nn
+% 3) \projlib_datetime_display_month_day_<languagename>:nn
+% \projlib_datetime_display_month_day_uppercase_<languagename>:nn
+% 4) \projlib_datetime_display_year_<languagename>:n
+% \projlib_datetime_display_year_uppercase_<languagename>:n
+% 5) \projlib_datetime_display_month_<languagename>:n
+% \projlib_datetime_display_month_uppercase_<languagename>:n
+% 6) \projlib_datetime_display_day_<languagename>:n
+% \projlib_datetime_display_day_uppercase_<languagename>:n
+% 7) \projlib_datetime_display_week_<languagename>:n
+% \projlib_datetime_display_week_uppercase_<languagename>:n
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_english:nnn
+ {
+ \projlib_datetime_display_month_day_english:nn { #2 } { #3 }
+ ,\nobreakspace
+ \projlib_datetime_display_year_english:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_english:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_english:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_english:nn { #2 } { #3 }
+ ,\nobreakspace
+ \projlib_datetime_display_year_english:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_english:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_english:nn
+ {
+ \projlib_datetime_display_month_english:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_english:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_english:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_english:nn
+ {
+ \projlib_datetime_display_month_uppercase_english:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_english:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_english:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_english:nn
+ {
+ \projlib_datetime_display_month_english:n { #1 }
+ \nobreakspace
+ \projlib_datetime_display_day_english:n { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_english:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_english:nn
+ {
+ \projlib_datetime_display_month_uppercase_english:n { #1 }
+ \nobreakspace
+ \projlib_datetime_display_day_english:n { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_english:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_english:n { #1 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_english:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_month_english:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { January }
+ { 2 } { February }
+ { 3 } { March }
+ { 4 } { April }
+ { 5 } { May }
+ { 6 } { June }
+ { 7 } { July }
+ { 8 } { August }
+ { 9 } { September }
+ { 10 } { October }
+ { 11 } { November }
+ { 12 } { December }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_english:n
+ {
+ \projlib_datetime_display_month_english:n { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_english:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_english:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_english:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Monday }
+ { 2 } { Tuesday }
+ { 3 } { Wednesday }
+ { 4 } { Thursday }
+ { 5 } { Friday }
+ { 6 } { Saturday }
+ { 7 } { Sunday }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_english:n
+ {
+ \projlib_datetime_display_week_english:n { #1 }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_french:nnn
+ {
+ \projlib_datetime_display_month_day_french:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_french:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_french:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_french:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_french:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_french:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_french:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_french:nn
+ {
+ \projlib_datetime_display_month_french:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_french:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_french:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_french:nn
+ {
+ \projlib_datetime_display_month_uppercase_french:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_french:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_french:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_french:nn
+ {
+ \projlib_datetime_display_day_french:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_month_french:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_french:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_french:nn
+ {
+ \projlib_datetime_display_month_day_french:nn { #1 } { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_french:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_french:n { #1 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_french:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_month_french:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { janvier }
+ { 2 } { février }
+ { 3 } { mars }
+ { 4 } { avril }
+ { 5 } { mai }
+ { 6 } { juin }
+ { 7 } { juillet }
+ { 8 } { août }
+ { 9 } { septembre }
+ { 10 } { octobre }
+ { 11 } { novembre }
+ { 12 } { décembre }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_french:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Janvier }
+ { 2 } { Février }
+ { 3 } { Mars }
+ { 4 } { Avril }
+ { 5 } { Mai }
+ { 6 } { Juin }
+ { 7 } { Juillet }
+ { 8 } { Août }
+ { 9 } { Septembre }
+ { 10 } { Octobre }
+ { 11 } { Novembre }
+ { 12 } { Décembre }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_french:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { 1 \projlib_datetime_text_superscript:n { er } }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_uppercase_french:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { 1 \projlib_datetime_text_superscript:n { er } }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_french:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { lundi }
+ { 2 } { mardi }
+ { 3 } { mercredi }
+ { 4 } { jeudi }
+ { 5 } { vendredi }
+ { 6 } { samedi }
+ { 7 } { dimanche }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_french:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Lundi }
+ { 2 } { Mardi }
+ { 3 } { Mercredi }
+ { 4 } { Jeudi }
+ { 5 } { Vendredi }
+ { 6 } { Samedi }
+ { 7 } { Dimanche }
+ } { ??? }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_ngerman:nnn
+ {
+ \projlib_datetime_display_month_day_ngerman:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_ngerman:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_ngerman:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_ngerman:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_ngerman:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_ngerman:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_ngerman:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_ngerman:nn
+ {
+ \projlib_datetime_display_month_ngerman:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_ngerman:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_ngerman:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_ngerman:nn
+ {
+ \projlib_datetime_display_month_uppercase_ngerman:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_ngerman:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_ngerman:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_ngerman:nn
+ {
+ \projlib_datetime_display_day_ngerman:n { #2 }
+ .\nobreakspace
+ \projlib_datetime_display_month_ngerman:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_ngerman:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_ngerman:nn
+ {
+ \projlib_datetime_display_month_day_ngerman:nn { #1 } { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_ngerman:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_ngerman:n { #1 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_ngerman:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_month_ngerman:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Januar }
+ { 2 } { Februar }
+ { 3 } { März }
+ { 4 } { April }
+ { 5 } { Mai }
+ { 6 } { Juni }
+ { 7 } { Juli }
+ { 8 } { August }
+ { 9 } { September }
+ { 10 } { Oktober }
+ { 11 } { November }
+ { 12 } { Dezember }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_ngerman:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Januar }
+ { 2 } { Februar }
+ { 3 } { März }
+ { 4 } { April }
+ { 5 } { Mai }
+ { 6 } { Juni }
+ { 7 } { Juli }
+ { 8 } { August }
+ { 9 } { September }
+ { 10 } { Oktober }
+ { 11 } { November }
+ { 12 } { Dezember }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_ngerman:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_ngerman:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_ngerman:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Montag }
+ { 2 } { Dienstag }
+ { 3 } { Mittwoch }
+ { 4 } { Donnerstag }
+ { 5 } { Freitag }
+ { 6 } { Samstag }
+ { 7 } { Sonntag }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_ngerman:n
+ {
+ \projlib_datetime_display_week_ngerman:n { #1 }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_italian:nnn
+ {
+ \projlib_datetime_display_month_day_italian:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_italian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_italian:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_italian:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_italian:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_italian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_italian:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_italian:nn
+ {
+ \projlib_datetime_display_month_italian:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_italian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_italian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_italian:nn
+ {
+ \projlib_datetime_display_month_uppercase_italian:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_italian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_italian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_italian:nn
+ {
+ \projlib_datetime_display_day_italian:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_month_italian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_italian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_italian:nn
+ {
+ \projlib_datetime_display_month_day_italian:nn { #1 } { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_italian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_italian:n { #1 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_italian:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_month_italian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { gennaio }
+ { 2 } { febbraio }
+ { 3 } { marzo }
+ { 4 } { aprile }
+ { 5 } { maggio }
+ { 6 } { giugno }
+ { 7 } { luglio }
+ { 8 } { agosto }
+ { 9 } { settembre }
+ { 10 } { ottobre }
+ { 11 } { novembre }
+ { 12 } { dicembre }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_italian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Gennaio }
+ { 2 } { Febbraio }
+ { 3 } { Marzo }
+ { 4 } { Aprile }
+ { 5 } { Maggio }
+ { 6 } { Giugno }
+ { 7 } { Luglio }
+ { 8 } { Agosto }
+ { 9 } { Settembre }
+ { 10 } { Ottobre }
+ { 11 } { Novembre }
+ { 12 } { Dicembre }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_italian:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_italian:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_italian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { lunedì }
+ { 2 } { martedì }
+ { 3 } { mercoledì }
+ { 4 } { giovedì }
+ { 5 } { venerdì }
+ { 6 } { sabato }
+ { 7 } { domenica }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_italian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Lunedì }
+ { 2 } { Martedì }
+ { 3 } { Mercoledì }
+ { 4 } { Giovedì }
+ { 5 } { Venerdì }
+ { 6 } { Sabato }
+ { 7 } { Domenica }
+ } { ??? }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_portuguese:nnn
+ {
+ \projlib_datetime_display_month_day_portuguese:nn { #2 } { #3 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_portuguese:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_portuguese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_portuguese:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_portuguese:nn { #2 } { #3 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_portuguese:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_portuguese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_portuguese:nn
+ {
+ \projlib_datetime_display_month_portuguese:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_portuguese:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_portuguese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_portuguese:nn
+ {
+ \projlib_datetime_display_month_uppercase_portuguese:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_portuguese:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_portuguese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_portuguese:nn
+ {
+ \projlib_datetime_display_day_portuguese:n { #2 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_month_uppercase_portuguese:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_portuguese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_portuguese:nn
+ {
+ \projlib_datetime_display_month_day_portuguese:nn { #1 } { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_portuguese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_portuguese:n { #1 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_portuguese:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_month_portuguese:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { janeiro }
+ { 2 } { fevereiro }
+ { 3 } { março }
+ { 4 } { abril }
+ { 5 } { maio }
+ { 6 } { junho }
+ { 7 } { julho }
+ { 8 } { agosto }
+ { 9 } { setembro }
+ { 10 } { outubro }
+ { 11 } { novembro }
+ { 12 } { dezembro }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_portuguese:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Janeiro }
+ { 2 } { Fevereiro }
+ { 3 } { Março }
+ { 4 } { Abril }
+ { 5 } { Maio }
+ { 6 } { Junho }
+ { 7 } { Julho }
+ { 8 } { Agosto }
+ { 9 } { Setembro }
+ { 10 } { Outubro }
+ { 11 } { Novembro }
+ { 12 } { Dezembro }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_portuguese:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_portuguese:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_portuguese:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { segunda-feira }
+ { 2 } { terça-feira }
+ { 3 } { quarta-feira }
+ { 4 } { quinta-feira }
+ { 5 } { sexta-feira }
+ { 6 } { sábado }
+ { 7 } { domingo }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_portuguese:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Segunda-feira }
+ { 2 } { Terça-feira }
+ { 3 } { Quarta-feira }
+ { 4 } { Quinta-feira }
+ { 5 } { Sexta-feira }
+ { 6 } { Sábado }
+ { 7 } { Domingo }
+ } { ??? }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_brazilian:nnn
+ {
+ \projlib_datetime_display_month_day_brazilian:nn { #2 } { #3 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_brazilian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_brazilian:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_brazilian:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_brazilian:nn { #2 } { #3 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_brazilian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_brazilian:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_brazilian:nn
+ {
+ \projlib_datetime_display_month_brazilian:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_brazilian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_brazilian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_brazilian:nn
+ {
+ \projlib_datetime_display_month_uppercase_brazilian:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_brazilian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_brazilian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_brazilian:nn
+ {
+ \projlib_datetime_display_day_brazilian:n { #2 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_month_uppercase_brazilian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_brazilian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_brazilian:nn
+ {
+ \projlib_datetime_display_month_day_brazilian:nn { #1 } { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_brazilian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_brazilian:n { #1 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_brazilian:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_month_brazilian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { janeiro }
+ { 2 } { fevereiro }
+ { 3 } { março }
+ { 4 } { abril }
+ { 5 } { maio }
+ { 6 } { junho }
+ { 7 } { julho }
+ { 8 } { agosto }
+ { 9 } { setembro }
+ { 10 } { outubro }
+ { 11 } { novembro }
+ { 12 } { dezembro }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_brazilian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Janeiro }
+ { 2 } { Fevereiro }
+ { 3 } { Março }
+ { 4 } { Abril }
+ { 5 } { Maio }
+ { 6 } { Junho }
+ { 7 } { Julho }
+ { 8 } { Agosto }
+ { 9 } { Setembro }
+ { 10 } { Outubro }
+ { 11 } { Novembro }
+ { 12 } { Dezembro }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_brazilian:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_brazilian:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_brazilian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { segunda-feira }
+ { 2 } { terça-feira }
+ { 3 } { quarta-feira }
+ { 4 } { quinta-feira }
+ { 5 } { sexta-feira }
+ { 6 } { sábado }
+ { 7 } { domingo }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_brazilian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Segunda-feira }
+ { 2 } { Terça-feira }
+ { 3 } { Quarta-feira }
+ { 4 } { Quinta-feira }
+ { 5 } { Sexta-feira }
+ { 6 } { Sábado }
+ { 7 } { Domingo }
+ } { ??? }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_spanish:nnn
+ {
+ \projlib_datetime_display_month_day_spanish:nn { #2 } { #3 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_spanish:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_spanish:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_spanish:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_spanish:nn { #2 } { #3 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_spanish:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_spanish:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_spanish:nn
+ {
+ \projlib_datetime_display_month_spanish:n { #2 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_spanish:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_spanish:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_spanish:nn
+ {
+ \projlib_datetime_display_month_uppercase_spanish:n { #2 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_year_spanish:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_spanish:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_spanish:nn
+ {
+ \projlib_datetime_display_day_spanish:n { #2 }
+ \nobreakspace de \nobreakspace
+ \projlib_datetime_display_month_spanish:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_spanish:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_spanish:nn
+ {
+ \projlib_datetime_display_month_day_spanish:nn { #1 } { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_spanish:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_spanish:n { #1 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_spanish:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_month_spanish:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { enero }
+ { 2 } { febrero }
+ { 3 } { marzo }
+ { 4 } { abril }
+ { 5 } { mayo }
+ { 6 } { junio }
+ { 7 } { julio }
+ { 8 } { agosto }
+ { 9 } { septiembre }
+ { 10 } { octubre }
+ { 11 } { noviembre }
+ { 12 } { diciembre }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_spanish:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Enero }
+ { 2 } { Febrero }
+ { 3 } { Marzo }
+ { 4 } { Abril }
+ { 5 } { Mayo }
+ { 6 } { Junio }
+ { 7 } { Julio }
+ { 8 } { Agosto }
+ { 9 } { Septiembre }
+ { 10 } { Octubre }
+ { 11 } { Noviembre }
+ { 12 } { Diciembre }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_spanish:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_spanish:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_spanish:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { lunes }
+ { 2 } { martes }
+ { 3 } { miércoles }
+ { 4 } { jueves }
+ { 5 } { viernes }
+ { 6 } { sábado }
+ { 7 } { domingo }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_spanish:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Lunes }
+ { 2 } { Martes }
+ { 3 } { Miércoles }
+ { 4 } { Jueves }
+ { 5 } { Viernes }
+ { 6 } { Sábado }
+ { 7 } { Domingo }
+ } { ??? }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_schinese:nnn
+ {
+ #1 年 #2 月 #3 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_schinese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_schinese:nnn
+ {
+ #1 年 #2 月 #3 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_schinese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_schinese:nn
+ {
+ #1 年 #2 月
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_schinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_schinese:nn
+ {
+ #1 年 #2 月
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_schinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_schinese:nn
+ {
+ #1 月 #2 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_schinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_schinese:nn
+ {
+ #1 月 #2 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_schinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_schinese:n { #1 年 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_schinese:n { #1 年 }
+\cs_new:Nn \projlib_datetime_display_month_schinese:n { #1 月 }
+\cs_new:Nn \projlib_datetime_display_month_uppercase_schinese:n { #1 月 }
+\cs_new:Nn \projlib_datetime_display_day_schinese:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_schinese:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_schinese:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { 星期一 }
+ { 2 } { 星期二 }
+ { 3 } { 星期三 }
+ { 4 } { 星期四 }
+ { 5 } { 星期五 }
+ { 6 } { 星期六 }
+ { 7 } { 星期日 }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_schinese:n
+ {
+ \projlib_datetime_display_week_schinese:n { #1 }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_tchinese:nnn
+ {
+ #1 年 #2 月 #3 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_tchinese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_tchinese:nnn
+ {
+ #1 年 #2 月 #3 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_tchinese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_tchinese:nn
+ {
+ #1 年 #2 月
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_tchinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_tchinese:nn
+ {
+ #1 年 #2 月
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_tchinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_tchinese:nn
+ {
+ #1 月 #2 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_tchinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_tchinese:nn
+ {
+ #1 月 #2 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_tchinese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_tchinese:n { #1 年 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_tchinese:n { #1 年 }
+\cs_new:Nn \projlib_datetime_display_month_tchinese:n { #1 月 }
+\cs_new:Nn \projlib_datetime_display_month_uppercase_tchinese:n { #1 月 }
+\cs_new:Nn \projlib_datetime_display_day_tchinese:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_tchinese:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_tchinese:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { 星期一 }
+ { 2 } { 星期二 }
+ { 3 } { 星期三 }
+ { 4 } { 星期四 }
+ { 5 } { 星期五 }
+ { 6 } { 星期六 }
+ { 7 } { 星期日 }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_tchinese:n
+ {
+ \projlib_datetime_display_week_tchinese:n { #1 }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_japanese:nnn
+ {
+ #1 年 #2 月 #3 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_japanese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_japanese:nnn
+ {
+ #1 年 #2 月 #3 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_japanese:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_japanese:nn
+ {
+ #1 年 #2 月
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_japanese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_japanese:nn
+ {
+ #1 年 #2 月
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_japanese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_japanese:nn
+ {
+ #1 月 #2 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_japanese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_japanese:nn
+ {
+ #1 月 #2 日
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_japanese:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_japanese:n { #1 年 }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_japanese:n { #1 年 }
+\cs_new:Nn \projlib_datetime_display_month_japanese:n { #1 月 }
+\cs_new:Nn \projlib_datetime_display_month_uppercase_japanese:n { #1 月 }
+\cs_new:Nn \projlib_datetime_display_day_japanese:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_japanese:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_japanese:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { 月曜日 }
+ { 2 } { 火曜日 }
+ { 3 } { 水曜日 }
+ { 4 } { 木曜日 }
+ { 5 } { 金曜日 }
+ { 6 } { 土曜日 }
+ { 7 } { 日曜日 }
+ } { ??? }
+ }
+
+\cs_new:Nn \projlib_datetime_display_week_uppercase_japanese:n
+ {
+ \projlib_datetime_display_week_japanese:n { #1 }
+ }
+
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_russian:nnn
+ {
+ \projlib_datetime_display_month_day_russian:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_russian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_russian:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_day_uppercase_russian:nnn
+ {
+ \projlib_datetime_display_month_day_uppercase_russian:nn { #2 } { #3 }
+ \nobreakspace
+ \projlib_datetime_display_year_russian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_day_uppercase_russian:nnn { VVV, eee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_russian:nn
+ {
+ \projlib_datetime_display_month_russian:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_russian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_russian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_month_uppercase_russian:nn
+ {
+ \projlib_datetime_display_month_uppercase_russian:n { #2 }
+ \nobreakspace
+ \projlib_datetime_display_year_russian:n { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_year_month_uppercase_russian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_russian:nn
+ {
+ \projlib_datetime_display_day_russian:n { #2 }
+ \nobreakspace
+ \int_case:nnF { #1 }
+ {
+ { 1 } { января }
+ { 2 } { февраля }
+ { 3 } { марта }
+ { 4 } { апреля }
+ { 5 } { мая }
+ { 6 } { июня }
+ { 7 } { июля }
+ { 8 } { августа }
+ { 9 } { сентября }
+ { 10 } { октября }
+ { 11 } { ноября }
+ { 12 } { декабря }
+ } { #1 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_russian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_month_day_uppercase_russian:nn
+ {
+ \projlib_datetime_display_month_day_russian:nn { #1 } { #2 }
+ }
+\cs_generate_variant:Nn \projlib_datetime_display_month_day_uppercase_russian:nn { VV, ee }
+
+\cs_new:Nn \projlib_datetime_display_year_russian:n { #1 ~ г. }
+\cs_new:Nn \projlib_datetime_display_year_uppercase_russian:n { #1 ~ г. }
+
+\cs_new:Nn \projlib_datetime_display_month_russian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { январь }
+ { 2 } { февраль }
+ { 3 } { март }
+ { 4 } { апрель }
+ { 5 } { май }
+ { 6 } { июнь }
+ { 7 } { июль }
+ { 8 } { август }
+ { 9 } { сентябрь }
+ { 10 } { октябрь }
+ { 11 } { ноябрь }
+ { 12 } { декабрь }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_month_uppercase_russian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Январь }
+ { 2 } { Февраль }
+ { 3 } { Март }
+ { 4 } { Апрель }
+ { 5 } { Май }
+ { 6 } { Июнь }
+ { 7 } { Июль }
+ { 8 } { Август }
+ { 9 } { Сентябрь }
+ { 10 } { Октябрь }
+ { 11 } { Ноябрь }
+ { 12 } { Декабрь }
+ } { #1 }
+ }
+
+\cs_new:Nn \projlib_datetime_display_day_russian:n { #1 }
+\cs_new:Nn \projlib_datetime_display_day_uppercase_russian:n { #1 }
+
+\cs_new:Nn \projlib_datetime_display_week_russian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { понедельник }
+ { 2 } { вторник }
+ { 3 } { среда }
+ { 4 } { четверг }
+ { 5 } { пятница }
+ { 6 } { суббота }
+ { 7 } { воскресенье }
+ } { ??? }
+ }
+\cs_new:Nn \projlib_datetime_display_week_uppercase_russian:n
+ {
+ \int_case:nnF { #1 }
+ {
+ { 1 } { Понедельник }
+ { 2 } { Вторник }
+ { 3 } { Среда }
+ { 4 } { Четверг }
+ { 5 } { Пятница }
+ { 6 } { Суббота }
+ { 7 } { Воскресенье }
+ } { ??? }
+ }
+%</projlib-datetime>
+%
+%<*projlib-draft>
+\keys_define:nn { projlib-draft }
+ {
+ , draft .bool_set:N = \l__projlib_draft_fast_bool
+ , draft .initial:n = { false }
+ , fast .bool_set:N = \l__projlib_draft_fast_bool
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-draft }
+
+\RequirePackage { projlib-language }
+\RequirePackage { xcolor }
+
+\bool_if:NTF \l__projlib_draft_fast_bool
+ {
+ \NewDocumentCommand \projlib_draft_plain_box { O{-paper} m }
+ {
+ \group_begin:
+ \color { #1 }
+ \dim_set:Nn \fboxsep { 1.5pt }
+ \dim_set:Nn \fboxrule { 1.5pt }
+ \fbox { #2 }
+ \group_end:
+ }
+ }
+ {
+ \PassOptionsToPackage { many } { tcolorbox }
+ \RequirePackage { tcolorbox }
+ \NewTCBox \projlib_draft_plain_box { O{-paper} }
+ {
+ enhanced~jigsaw, breakable,
+ on~line, arc = 1.2pt, outer~arc = 1pt,
+ colframe = #1, colupper = #1, opacityback = 0,
+ boxsep = 1pt, boxrule = 1.2pt,
+ left = 1pt, right = 1pt, top = 0pt, bottom = 0pt,
+ }
+ }
+
+\projlib_langauge_define_multilingual_text:Nn \__dnf_text
+ {
+ EN = To\ be\ finished ,
+ FR = Pas\ encore\ fini ,
+ DE = Nicht\ beendet ,
+ IT = Per\ essere\ finito ,
+ PT = Não\ terminou ,
+ BR = Não\ terminou ,
+ ES = Estar\ terminado ,
+ CN = 这里尚未完成 ,
+ TC = 這裡尚未完成 ,
+ JP = 終わってない ,
+ RU = Не\ закончен ,
+ }
+
+\projlib_langauge_define_multilingual_text:Nn \__dnf_report_text
+ {
+ EN = { Below\ is\ a\ list\ of\ outstanding\ items,
+ \ followed\ by\ the\ corresponding\ page\ numbers. } ,
+ FR = { Voici\ la\ liste\ des\ éléments\ en\ suspens,
+ \ suivie\ des\ numéros\ de\ page\ correspondants. } ,
+ DE = { Unten\ ist\ eine\ Liste\ der\ ausstehenden\ Posten,
+ \ gefolgt\ von\ den\ entsprechenden\ Seitenzahlen. } ,
+ IT = { Qui\ sotto\ c'è\ una\ lista\ di\ voci\ in\ sospeso,
+ \ seguita\ dai\ numeri\ di\ pagina\ corrispondenti. } ,
+ PT = { Abaixo\ está\ uma\ lista\ de\ itens\ pendentes,
+ \ seguida\ dos\ números\ de\ página\ correspondentes. } ,
+ BR = { Abaixo\ está\ uma\ lista\ de\ itens\ pendentes,
+ \ seguida\ dos\ números\ de\ página\ correspondentes. } ,
+ ES = { Aquí está\ la\ lista\ de\ elementos\ pendientes,
+ \ seguida\ de\ los\ números\ de\ página\ correspondientes. } ,
+ CN = { 以下是未完成事项列表,括号内注明了对应的页码。 } ,
+ TC = { 以下是未完成事項的列表,括號內註明了對應頁碼。 } ,
+ JP = { 以下は、未解決の項目とそれに対応するページ番号の一覧です。 } ,
+ RU = { Ниже\ приведен\ список\ невыполненных\ пунктов
+ \ с\ соответствующими\ номерами\ страниц\ в\ скобках. } ,
+ }
+
+\tl_new:c { __dnf_font }
+\tl_gset:cn { __dnf_font } { \normalfont \ttfamily \bfseries \small }
+
+\definecolor { __dnf_color } { RGB } { 21, 122, 20 }
+
+\newcounter { __dnf_counter }
+
+\tl_new:N \g__projlib_draft_dnf_report_tl
+
+\NewDocumentCommand \dnf { d<> }
+ {
+ \noindent
+ \projlib_draft_plain_box [ __dnf_color ]
+ {
+ \stepcounter { __dnf_counter }
+ \__dnf_font
+ \__dnf_text
+ \c_space_tl
+ \# \the__dnf_counter
+ \IfNoValueF { #1 } { \, : ~ #1 }
+ \tl_gput_right:Nx \g__projlib_draft_dnf_report_tl
+ {
+ \# \,
+ \int_value:w \the__dnf_counter
+ \c_space_tl \c_space_tl
+ $\langle$
+ \skip_horizontal:n { 0.1em }
+ \cs_if_exist:cTF { hyperlink }
+ {
+ \exp_not:N \hyperlink { page.\thepage } { \thepage }
+ }
+ {
+ \thepage
+ }
+ \skip_horizontal:n { 0.1em }
+ $\rangle$
+ \c_space_tl
+ \IfNoValueF { #1 } { : ~ #1 }
+ \\
+ }
+ }
+ }
+
+\hook_gput_code:nnn { enddocument } { projlib-draft }
+ {
+ \tl_if_blank:VF \g__projlib_draft_dnf_report_tl
+ {
+ \clearpage \noindent
+ \color { __dnf_color }
+ \__dnf_font
+ \__dnf_report_text \\[0.75\baselineskip]
+ \g__projlib_draft_dnf_report_tl
+ }
+ }
+%</projlib-draft>
+%
+%<*projlib-font>
+\keys_define:nn { projlib-font }
+ {
+ , useosf .bool_set:N = \l__projlib_font_useosf_bool
+ , useosf .initial:n = { false }
+ , old-style-figures.bool_set:N = \l__projlib_font_useosf_bool
+ , old~style~figures.bool_set:N = \l__projlib_font_useosf_bool
+ , old style figures.bool_set:N = \l__projlib_font_useosf_bool
+ , lmodern .bool_set:N = \l__projlib_font_lmodern_bool
+ , lmodern .initial:n = { false }
+ , latin-modern .bool_set:N = \l__projlib_font_lmodern_bool
+ , latin~modern .bool_set:N = \l__projlib_font_lmodern_bool
+ , latin modern .bool_set:N = \l__projlib_font_lmodern_bool
+ , palatino .bool_set:N = \l__projlib_font_palatino_bool
+ , palatino .initial:n = { false }
+ , times .bool_set:N = \l__projlib_font_times_bool
+ , times .initial:n = { false }
+ , garamond .bool_set:N = \l__projlib_font_garamond_bool
+ , garamond .initial:n = { false }
+ , noto .bool_set:N = \l__projlib_font_noto_bool
+ , noto .initial:n = { false }
+ , biolinum .bool_set:N = \l__projlib_font_biolinum_bool
+ , biolinum .initial:n = { false }
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-font }
+
+\bool_new:N \g_projlib_font_already_set_bool
+\bool_gset_false:N \g_projlib_font_already_set_bool
+
+\RequirePackage { setspace }
+
+\cs_new:Nn \projlib_font_set_linespacing_latin:n
+ {
+ \cs_if_exist:NTF \projlib_language_set_linespacing_latin:n
+ {
+ \projlib_language_set_linespacing_latin:n { #1 }
+ }
+ {
+ #1
+ }
+ }
+
+\bool_if:NT \l__projlib_font_lmodern_bool
+ {
+ \RequirePackage { amssymb }
+ \bool_if:NTF \l__projlib_font_useosf_bool
+ {
+ \RequirePackage { cfr-lm }
+ }
+ {
+ \RequirePackage { lmodern }
+ }
+ \projlib_font_set_linespacing_latin:n { \setstretch { 1.00 } }
+ \bool_gset_true:N \g_projlib_font_already_set_bool
+ }
+
+\bool_if:NT \l__projlib_font_palatino_bool
+ {
+ \sys_if_engine_pdftex:TF
+ {
+ \RequirePackage { mathpazo }
+ \PassOptionsToPackage { defaultsups } { newpxtext }
+ \RequirePackage { newpxtext }
+ \cs_undefine:c { openbox }
+ \bool_if:NT \l__projlib_font_useosf_bool { \useosf }
+ }
+ {
+ \PassOptionsToPackage { warnings-off = { mathtools-colon, mathtools-overbracket } } { unicode-math }
+ \RequirePackage { unicode-math }
+ \defaultfontfeatures{ Scale=MatchLowercase, Ligatures=TeX }
+ \bool_if:NTF \l__projlib_font_useosf_bool
+ {
+ \setmainfont { TeXGyrePagellaX-Regular.otf }
+ [
+ BoldFont = TeXGyrePagellaX-Bold.otf ,
+ ItalicFont = TeXGyrePagellaX-Italic.otf ,
+ BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf,
+ Numbers = OldStyle ]
+ }
+ {
+ \setmainfont { TeXGyrePagellaX-Regular.otf }
+ [
+ BoldFont = TeXGyrePagellaX-Bold.otf ,
+ ItalicFont = TeXGyrePagellaX-Italic.otf ,
+ BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf,
+ ]
+ }
+ \setmathfont { texgyrepagella-math.otf }
+ }
+ \projlib_font_set_linespacing_latin:n { \setstretch { 1.07 } }
+ \bool_gset_true:N \g_projlib_font_already_set_bool
+ }
+
+\bool_if:NT \l__projlib_font_times_bool
+ {
+ \sys_if_engine_pdftex:TF
+ {
+ \PassOptionsToPackage { defaultsups } { newtxtext }
+ \RequirePackage { newtxtext }
+ \RequirePackage { newtxmath }
+ \cs_undefine:c { openbox }
+ \bool_if:NT \l__projlib_font_useosf_bool { \useosf }
+ }
+ {
+ \PassOptionsToPackage { warnings-off = { mathtools-colon, mathtools-overbracket } } { unicode-math }
+ \RequirePackage { unicode-math }
+ \defaultfontfeatures{ Scale=MatchLowercase, Ligatures=TeX }
+ \bool_if:NTF \l__projlib_font_useosf_bool
+ {
+ \setmainfont { TeXGyreTermesX-Regular.otf }
+ [
+ BoldFont = TeXGyreTermesX-Bold.otf ,
+ ItalicFont = TeXGyreTermesX-Italic.otf ,
+ BoldItalicFont = TeXGyreTermesX-BoldItalic.otf,
+ Numbers = OldStyle ]
+ }
+ {
+ \setmainfont { TeXGyreTermesX-Regular.otf }
+ [
+ BoldFont = TeXGyreTermesX-Bold.otf ,
+ ItalicFont = TeXGyreTermesX-Italic.otf ,
+ BoldItalicFont = TeXGyreTermesX-BoldItalic.otf,
+ ]
+ }
+ \setmathfont { texgyretermes-math.otf }
+ }
+ \projlib_font_set_linespacing_latin:n { \setstretch { 1.00 } }
+ \bool_gset_true:N \g_projlib_font_already_set_bool
+ }
+
+\bool_if:NT \l__projlib_font_garamond_bool
+ {
+ \bool_if:NF \l__projlib_font_useosf_bool
+ {
+ \PassOptionsToPackage { lining } { ebgaramond }
+ }
+ \RequirePackage [ cmintegrals, cmbraces ] { newtxmath }
+ \cs_undefine:c { openbox }
+ \RequirePackage { ebgaramond-maths }
+ \RequirePackage { ebgaramond }
+ \cs_undefine:c { Bbbk }
+ \projlib_font_set_linespacing_latin:n { \setstretch { 1.00 } }
+ \bool_gset_true:N \g_projlib_font_already_set_bool
+ }
+
+\bool_if:NT \l__projlib_font_noto_bool
+ {
+ \bool_if:NT \l__projlib_font_useosf_bool
+ {
+ \PassOptionsToPackage { oldstyle } { notomath }
+ }
+ \RequirePackage { anyfontsize }
+ \RequirePackage { notomath }
+ \cs_undefine:c { Bbbk }
+ \projlib_font_set_linespacing_latin:n { \setstretch { 1.00 } }
+ \bool_gset_true:N \g_projlib_font_already_set_bool
+ }
+
+\bool_if:NT \l__projlib_font_biolinum_bool
+ {
+ \RequirePackage [ OT1 ] { eulervm }
+ \sys_if_engine_pdftex:TF
+ {
+ \bool_if:NT \l__projlib_font_useosf_bool
+ {
+ \PassOptionsToPackage { osf } { biolinum }
+ }
+ \RequirePackage { biolinum }
+ \tl_gset:Nn \familydefault { \biolinum@family }
+ }
+ {
+ \PassOptionsToPackage { no-math } { fontspec }
+ \RequirePackage { fontspec }
+ \bool_if:NTF \l__projlib_font_useosf_bool
+ {
+ \setmainfont { LinBiolinum_R.otf } [
+ BoldFont = LinBiolinum_RB.otf ,
+ ItalicFont = LinBiolinum_RI.otf ,
+ BoldItalicFont = LinBiolinum_RBO.otf ,
+ Numbers = OldStyle , ]
+ }
+ {
+ \setmainfont { LinBiolinum_R.otf } [
+ BoldFont = LinBiolinum_RB.otf ,
+ ItalicFont = LinBiolinum_RI.otf ,
+ BoldItalicFont = LinBiolinum_RBO.otf , ]
+ }
+ }
+ \projlib_font_set_linespacing_latin:n { \setstretch { 1.05 } }
+ \RequirePackage [ italic, defaultmathsizes ] { mathastext }
+ \bool_gset_true:N \g_projlib_font_already_set_bool
+ }
+
+\PassOptionsToPackage { verbose = silent } { microtype }
+\RequirePackage { microtype }
+%</projlib-font>
+%
+%<*projlib-language>
+\clist_const:Nn \c__projlib_language_supported_clist
+ {
+ english ,
+ french ,
+ ngerman ,
+ italian ,
+ portuguese ,
+ brazilian ,
+ spanish ,
+ schinese ,
+ tchinese ,
+ japanese ,
+ russian ,
+ }
+
+\clist_new:N \g__projlib_language_babel_option_clist
+
+\str_new:N \g__projlib_language_main_str
+
+\bool_new:N \g__projlib_language_enabled_all_bool
+\bool_gset_true:N \g__projlib_language_enabled_all_bool
+
+\clist_map_inline:Nn \c__projlib_language_supported_clist
+ {
+ \bool_new:c { g__projlib_language_enabled_ #1 _bool }
+ \bool_gset_false:c { g__projlib_language_enabled_ #1 _bool }
+ }
+
+\cs_new:Nn \projlib_language_set_option_no_babel:n
+ {
+ \bool_gset_false:N \g__projlib_language_enabled_all_bool
+ \bool_gset_true:c { g__projlib_language_enabled_ #1 _bool }
+ \str_if_empty:NT \g__projlib_language_main_str
+ {
+ \str_gset:Nn \g__projlib_language_main_str { #1 }
+ }
+ }
+\cs_new:Nn \projlib_language_set_option:n
+ {
+ \projlib_language_set_option_no_babel:n { #1 }
+ \clist_gput_left:Nn \g__projlib_language_babel_option_clist { #1 }
+ }
+
+\keys_define:nn { projlib-language }
+ {
+ , EN .meta:n = { english }
+ , english .code:n = { \projlib_language_set_option:n { english } }
+ , English .meta:n = { english }
+ , FR .meta:n = { french }
+ , french .code:n = { \projlib_language_set_option:n { french } }
+ , French .meta:n = { french }
+ , DE .meta:n = { ngerman }
+ , german .meta:n = { ngerman }
+ , ngerman .code:n = { \projlib_language_set_option:n { ngerman } }
+ , German .meta:n = { ngerman }
+ , IT .meta:n = { italian }
+ , italian .code:n = { \projlib_language_set_option:n { italian } }
+ , Italian .meta:n = { italian }
+ , PT .meta:n = { portuguese }
+ , portuguese .code:n = { \projlib_language_set_option:n { portuguese } }
+ , Portuguese .meta:n = { portuguese }
+ , BR .meta:n = { brazilian }
+ , brazilian .code:n = { \projlib_language_set_option:n { brazilian } }
+ , Brazilian .meta:n = { brazilian }
+ , ES .meta:n = { spanish }
+ , spanish .code:n = { \clist_gput_left:Nn \g__projlib_language_babel_option_clist { es-notilde, es-noquoting }
+ \projlib_language_set_option:n { spanish } }
+ , Spanish .meta:n = { spanish }
+ , CN .meta:n = { schinese }
+ , chinese .meta:n = { schinese }
+ , schinese .code:n = { \projlib_language_set_option_no_babel:n { schinese } }
+ , simplified-chinese .meta:n = { schinese }
+ , simplified~chinese .meta:n = { schinese }
+ , simplified chinese .meta:n = { schinese }
+ , Chinese .meta:n = { schinese }
+ , SChinese .meta:n = { schinese }
+ , Simplified-Chinese .meta:n = { schinese }
+ , Simplified~Chinese .meta:n = { schinese }
+ , Simplified Chinese .meta:n = { schinese }
+ , TC .meta:n = { tchinese }
+ , tchinese .code:n = { \projlib_language_set_option_no_babel:n { tchinese } }
+ , traditional-chinese .meta:n = { tchinese }
+ , traditional~chinese .meta:n = { tchinese }
+ , traditional chinese .meta:n = { tchinese }
+ , TChinese .meta:n = { tchinese }
+ , Traditional-Chinese .meta:n = { tchinese }
+ , Traditional~Chinese .meta:n = { tchinese }
+ , Traditional Chinese .meta:n = { tchinese }
+ , JP .meta:n = { japanese }
+ , japanese .code:n = { \projlib_language_set_option:n { japanese } }
+ , Japanese .meta:n = { japanese }
+ , RU .meta:n = { russian }
+ , russian .code:n = { \projlib_language_set_option:n { russian } }
+ , Russian .meta:n = { russian }
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-language }
+
+\cs_new_protected:Nn \projlib_language_clear_global_option:n
+ {
+ \clist_remove_all:cn { @classoptionslist } { #1 }
+ }
+
+\projlib_language_clear_global_option:n { chinese }
+\projlib_language_clear_global_option:n { Chinese }
+
+\clist_gput_right:Nn \g__projlib_language_babel_option_clist { shorthands = off }
+
+\str_if_empty:NT \g__projlib_language_main_str
+ {
+ \str_gset:Nn \g__projlib_language_main_str { english }
+ }
+
+\bool_if:NT \g__projlib_language_enabled_all_bool
+ {
+ \clist_map_inline:Nn \c__projlib_language_supported_clist
+ {
+ \bool_gset_true:c { g__projlib_language_enabled_ #1 _bool }
+ }
+ }
+
+
+\cs_new:Nn \projlib_language_str_to_languagename:n
+ {
+ \str_case_e:nnF { \str_foldcase:n { #1 } }
+ {
+ { all } { common }
+ { common } { common }
+ { cn } { schinese }
+ { chinese } { schinese }
+ { schinese } { schinese }
+ { simplifiedchinese } { schinese }
+ { simplified-chinese } { schinese }
+ { tc } { tchinese }
+ { tchinese } { tchinese }
+ { traditionalchinese } { tchinese }
+ { traditional-chinese} { tchinese }
+ { jp } { japanese }
+ { japanese } { japanese }
+ { en } { english }
+ { english } { english }
+ { fr } { french }
+ { french } { french }
+ { de } { ngerman }
+ { german } { ngerman }
+ { ngerman } { ngerman }
+ { it } { italian }
+ { italian } { italian }
+ { pt } { portuguese }
+ { portuguese } { portuguese }
+ { br } { brazilian }
+ { brazilian } { brazilian }
+ { es } { spanish }
+ { spanish } { spanish }
+ { ru } { russian }
+ { russian } { russian }
+ }
+ { #1 }
+ }
+
+\cs_new:Nn \projlib_language_str_to_languagetype:n
+ {
+ \str_case_e:nn { \str_foldcase:n { #1 } }
+ {
+ { cn } { cjk }
+ { chinese } { cjk }
+ { schinese } { cjk }
+ { simplifiedchinese } { cjk }
+ { simplified-chinese } { cjk }
+ { tc } { cjk }
+ { tchinese } { cjk }
+ { traditionalchinese } { cjk }
+ { traditional-chinese} { cjk }
+ { jp } { cjk }
+ { japanese } { cjk }
+ { en } { latin }
+ { english } { latin }
+ { fr } { latin }
+ { french } { latin }
+ { de } { latin }
+ { german } { latin }
+ { ngerman } { latin }
+ { it } { latin }
+ { italian } { latin }
+ { pt } { latin }
+ { portuguese } { latin }
+ { br } { latin }
+ { brazilian } { latin }
+ { es } { latin }
+ { spanish } { latin }
+ { ru } { latin }
+ { russian } { latin }
+ }
+ }
+
+\sys_if_engine_pdftex:T
+ {
+ \RequirePackage [T1] { fontenc }
+ }
+
+\bool_if:NTF \g__projlib_language_enabled_all_bool
+ {
+ \sys_if_engine_pdftex:F
+ {
+ \PassOptionsToPackage { japanese, russian } { babel }
+ }
+ \PassOptionsToPackage { italian, portuguese, brazilian, spanish, es-notilde, es-noquoting, ngerman, french, english, shorthands = off } { babel }
+ }
+ {
+ \PassOptionsToPackage { \g__projlib_language_babel_option_clist } { babel }
+ }
+
+\PassOptionsToPackage { italian, brazilian, spanish, ngerman, french, english } { cleveref }
+\RequirePackage { babel }
+
+
+\bool_if:NT \g__projlib_language_enabled_french_bool
+ {
+ \frenchsetup { PartNameFull = false }
+ }
+
+\bool_if:NT \g__projlib_language_enabled_portuguese_bool
+ {
+ \NewCommandCopy \__projlib_language_babel_ord: \ord
+ \cs_undefine:N \ord
+ \hook_gput_code:nnn { begindocument } { projlib-language }
+ {
+ \cs_if_exist:NT \ord
+ {
+ \NewCommandCopy \__projlib_language_user_ord: \ord
+ \cs_set_protected:Npn \ord
+ {
+ \mode_if_math:TF
+ { \__projlib_language_user_ord: }
+ { \__projlib_language_babel_ord: }
+ }
+ }
+ }
+ }
+
+\babelprovide { schinese }
+\babelprovide { tchinese }
+
+
+\NewCommandCopy \projlib_language_backup_today:n \today
+
+\tl_new:N \g_projlib_language_settings_common_tl
+\clist_map_inline:Nn \c__projlib_language_supported_clist
+ {
+ \tl_new:c { g_projlib_language_settings_ #1 _tl }
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_common_tl
+ {
+ \cs_if_exist:NT \ProjLibToday
+ {
+ \RenewCommandCopy \today \ProjLibToday
+ }
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_schinese_tl
+ {
+ \g_projlib_language_settings_common_tl
+ \tl_gset:Nn \languagename { schinese }
+ \tl_gset:cn { abstractname } { 摘要 }
+ \tl_gset:cn { proofname } { 证明 }
+ \tl_gset:cn { contentsname } { 目录 }
+ \tl_gset:cn { listfigurename } { 插图 }
+ \tl_gset:cn { listtablename } { 表格 }
+ \tl_gset:cn { figurename } { 图 }
+ \tl_gset:cn { tablename } { 表 }
+ \tl_gset:cn { indexname } { 索引 }
+ \tl_gset:cn { appendixname } { 附录 }
+ \tl_gset:cn { refname } { 参考文献 }
+ \tl_gset:cn { bibname } { 参考文献 }
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_tchinese_tl
+ {
+ \g_projlib_language_settings_common_tl
+ \tl_gset:Nn \languagename { tchinese }
+ \tl_gset:cn { abstractname } { 摘要 }
+ \tl_gset:cn { proofname } { 證明 }
+ \tl_gset:cn { contentsname } { 目錄 }
+ \tl_gset:cn { listfigurename } { 插圖 }
+ \tl_gset:cn { listtablename } { 表格 }
+ \tl_gset:cn { figurename } { 圖 }
+ \tl_gset:cn { tablename } { 表 }
+ \tl_gset:cn { indexname } { 索引 }
+ \tl_gset:cn { appendixname } { 附錄 }
+ \tl_gset:cn { refname } { 參考文獻 }
+ \tl_gset:cn { bibname } { 參考文獻 }
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_japanese_tl
+ {
+ \selectlanguage { japanese }
+ \g_projlib_language_settings_common_tl
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_english_tl
+ {
+ \selectlanguage { english }
+ \g_projlib_language_settings_common_tl
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_french_tl
+ {
+ \selectlanguage { french }
+ \g_projlib_language_settings_common_tl
+ \tl_gset:cn { frenchpartname } { Partie }
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_ngerman_tl
+ {
+ \selectlanguage { ngerman }
+ \g_projlib_language_settings_common_tl
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_italian_tl
+ {
+ \selectlanguage { italian }
+ \g_projlib_language_settings_common_tl
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_portuguese_tl
+ {
+ \selectlanguage { portuguese }
+ \g_projlib_language_settings_common_tl
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_brazilian_tl
+ {
+ \selectlanguage { brazilian }
+ \g_projlib_language_settings_common_tl
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_spanish_tl
+ {
+ \selectlanguage { spanish }
+ \g_projlib_language_settings_common_tl
+ }
+
+\tl_gput_right:Nn \g_projlib_language_settings_russian_tl
+ {
+ \selectlanguage { russian }
+ \g_projlib_language_settings_common_tl
+ }
+
+\NewDocumentCommand \AddLanguageSetting { O{} m }
+ {
+ \tl_if_empty:nTF { #1 }
+ {
+ \tl_gput_right:Nn \g_projlib_language_settings_common_tl { #2 }
+ }
+ {
+ \tl_gput_right:cn { g_projlib_language_settings_ \projlib_language_str_to_languagename:n { #1 } _tl } { #2 }
+ }
+ }
+
+
+\RequirePackage { setspace }
+
+\tl_new:N \g_projlib_language_linespacing_latin_tl
+\tl_new:N \g_projlib_language_linespacing_cjk_tl
+
+\tl_gset:Nn \g_projlib_language_linespacing_latin_tl
+ {
+ \setstretch { 1.00 }
+ }
+\tl_gset:Nn \g_projlib_language_linespacing_cjk_tl
+ {
+ \onehalfspacing
+ }
+
+\cs_new:Nn \projlib_language_set_linespacing_latin:n
+ {
+ \tl_gset:Nn \g_projlib_language_linespacing_latin_tl { #1 }
+ }
+\cs_new:Nn \projlib_language_set_linespacing_cjk:n
+ {
+ \tl_gset:Nn \g_projlib_language_linespacing_cjk_tl { #1 }
+ }
+
+\tl_new:N \g_projlib_language_parindent_latin_tl
+\tl_new:N \g_projlib_language_parindent_cjk_tl
+
+\@ifclassloaded{beamer}
+ {
+ \tl_gset:Nn \g_projlib_language_parindent_latin_tl
+ {
+ \dim_set:Nn \parindent { 0em }
+ }
+ \tl_gset:Nn \g_projlib_language_parindent_cjk_tl
+ {
+ \dim_set:Nn \parindent { 0em }
+ }
+ }
+ {
+ \tl_gset:Nn \g_projlib_language_parindent_latin_tl
+ {
+ \dim_set:Nn \parindent { 1.5em }
+ }
+ \tl_gset:Nn \g_projlib_language_parindent_cjk_tl
+ {
+ \dim_set:Nn \parindent { 2em }
+ }
+ }
+
+\hook_gput_code:nnn { begindocument } { projlib-language }
+ {
+ \@ifpackageloaded{parskip}
+ {
+ \tl_gset:Nn \g_projlib_language_parindent_latin_tl
+ {
+ \dim_set:Nn \parindent { 0em }
+ }
+ \tl_gset:Nn \g_projlib_language_parindent_cjk_tl
+ {
+ \dim_set:Nn \parindent { 0em }
+ }
+ } {}
+ }
+
+\cs_new:Nn \projlib_language_set_parindent_latin:n
+ {
+ \tl_gset:Nn \g_projlib_language_parindent_latin_tl { #1 }
+ }
+\cs_new:Nn \projlib_language_set_parindent_cjk:n
+ {
+ \tl_gset:Nn \g_projlib_language_parindent_cjk_tl { #1 }
+ }
+
+\NewDocumentCommand \ProjLibLanguageSet { m m m }
+ % #1 = the thing to set
+ % #2 = language or type
+ % #3 = the setting
+ {
+ \use:c { projlib_language_set_ #1 _ #2 :n } { #3 }
+ }
+
+
+\cs_new:Nn \projlib_language_use_language_pure:n
+ {
+ \tl_use:c { g_projlib_language_settings_ \projlib_language_str_to_languagename:n { #1 } _tl }
+ }
+\cs_generate_variant:Nn \projlib_language_use_language_pure:n { e }
+
+\cs_new:Nn \projlib_language_use_language:n
+ {
+ \projlib_language_use_language_pure:n { #1 }
+ \tl_use:c { g_projlib_language_linespacing_ \projlib_language_str_to_languagetype:n { #1 } _tl }
+ \tl_use:c { g_projlib_language_parindent_ \projlib_language_str_to_languagetype:n { #1 } _tl }
+ }
+\cs_generate_variant:Nn \projlib_language_use_language:n { e }
+
+\NewDocumentCommand \UseLanguage { m }
+ {
+ \hook_gput_code:nnn { begindocument } { projlib-language }
+ {
+ \projlib_language_use_language:e { #1 }
+ }
+ }
+\NewDocumentCommand \UseOtherLanguage { m m }
+ {
+ \group_begin:
+ \projlib_language_use_language_pure:e { #1 }
+ #2
+ \group_end:
+ }
+
+\UseLanguage { \g__projlib_language_main_str }
+
+
+\cs_new:Nn \projlib_langauge_define_multilingual_text:Nn
+ { % #1 = command name (with backslash)
+ % #2 = key-value name configuration
+ \keyval_parse:nnn
+ {}
+ { \__projlib_langauge_define_multilingual_text_do:nnn { \cs_to_str:N #1 } }
+ { #2 }
+ \tl_gset:Nn #1
+ {
+ \tl_use:c { \cs_to_str:N #1 _projlib_language_text_ \languagename }
+ }
+ }
+\cs_generate_variant:Nn \projlib_langauge_define_multilingual_text:Nn { cn }
+
+\cs_new:Nn \__projlib_langauge_define_multilingual_text_do:nnn
+ { % #1 = command name
+ % #2 = language name
+ % #3 = the text
+ \exp_args:Ne \tl_gset:cn { #1 _projlib_language_text_ \projlib_language_str_to_languagename:n { #2 } } { #3 }
+ }
+
+\NewDocumentCommand \DefineMultilingualText { m m }
+ % #1 = command name
+ % #2 = key-value name configuration
+ {
+ \projlib_langauge_define_multilingual_text:Nn #1 { #2 }
+ }
+%</projlib-language>
+%
+%<*projlib-logo>
+\keys_define:nn { projlib-logo }
+ {
+ , draft .bool_set:N = \l__projlib_logo_fast_bool
+ , draft .initial:n = { false }
+ , fast .bool_set:N = \l__projlib_logo_fast_bool
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-logo }
+
+\bool_if:NT \l__projlib_logo_fast_bool
+ {
+ \DeclareRobustCommand * \ProjLib
+ {
+ \group_begin:
+ \normalfont ProjLib
+ \group_end:
+ }
+ \endinput
+ }
+
+\cs_if_exist:cTF { fontspec }
+ {
+ \newfontface \__projlib_logo_font: { LinBiolinum_R.otf }
+ }
+ {
+ \RequirePackage [T1] { fontenc }
+ \cs_gset:Nn \__projlib_logo_font:
+ { \fontfamily { LinuxBiolinumT-TLF } \selectfont }
+ }
+
+\tl_new:N \g__projlib_logo_sigma_j_tl
+\tl_gset:Nn \g__projlib_logo_sigma_j_tl
+ {
+ \vbox:n
+ {
+ \offinterlineskip
+ \hbox_overlap_center:n
+ {
+ \skip_horizontal:n { 0.75ex }
+ \hbox_set:Nn \l_tmpa_box { \usefont{U}{zeur}{b}{n} \symbol{"06} }
+ \box_rotate:Nn \l_tmpa_box { -10 }
+ \box_scale:Nnn \l_tmpa_box {.4} {.4}
+ \box_use:N \l_tmpa_box
+ }
+ \skip_vertical:n { 0.15ex }
+ \hbox:n { \j }
+ }
+ }
+
+% \RequirePackage { xcolor }
+% \cs_new_protected:Nn \projlib_logo_generic:n
+% {
+% \group_begin:
+% \normalfont
+% \__projlib_logo_font:
+% \textcolor { blue!55!cyan } { P }
+% \textcolor { blue!45!cyan } { r }
+% \textcolor { blue!30!cyan } { o }
+% \textcolor { green!70!black!70 } { #1 }
+% \textcolor { red!20!yellow } { L }
+% \textcolor { red!40!yellow } { i }
+% \textcolor { red!55!yellow } { b }
+% \group_end:
+% }
+\cs_new_protected:Nn \projlib_logo_generic:n
+ {
+ \group_begin:
+ \normalfont
+ \__projlib_logo_font:
+ \color_group_begin:
+ \color_select:n { blue!60!cyan } { P }
+ \color_select:n { blue!45!cyan } { r }
+ \color_select:n { blue!30!cyan } { o }
+ \color_select:n { green!70!black!70 } { #1 }
+ \color_select:n { red!20!yellow } { L }
+ \color_select:n { red!40!yellow } { i }
+ \color_select:n { red!60!yellow } { b }
+ \color_group_end:
+ \group_end:
+ }
+
+\DeclareRobustCommand * \ProjLib
+ {
+ \projlib_logo_generic:n { \g__projlib_logo_sigma_j_tl }
+ }
+\DeclareRobustCommand * \ProjLibText
+ {
+ \projlib_logo_generic:n { j }
+ }
+%</projlib-logo>
+%
+%<*projlib-math>
+\keys_define:nn { projlib-math }
+ {
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-math }
+
+\RequirePackage { mathtools }
+\RequirePackage { mathrsfs }
+\PassOptionsToPackage { warnings-off = { mathtools-colon, mathtools-overbracket } } { unicode-math }
+\@ifpackageloaded { unicode-math } {} { \RequirePackage { amssymb } }
+
+
+\msg_new:nnn { projlib-math }
+ { operator-not-define }
+ { The~math~operator~"\iow_char:N \\#1"~cannot~be~defined,~a~command~with~the~same~name~has~already~existed. }
+
+\keys_define:nn { projlib-math-operator }
+ {
+ , style .tl_set:N = \l__projlib_math_operator_style_tl
+ , unknown .code:n = {}
+ }
+
+\cs_new_protected:Nn \projlib_math_define_operator:nnn
+ % #1 = bool for star or empty
+ % #2 = list of operators
+ % #3 = the option
+ {
+ \tl_clear:N \l__projlib_math_operator_style_tl
+ \keys_set:nn { projlib-math-operator } { #3 }
+ \clist_map_inline:nn { #2 }
+ {
+ \str_if_in:nnTF { ##1 } { = }
+ {
+ \seq_set_split:Nnn \l_tmpa_seq { = } { ##1 }
+ \__projlib_math_define_operator:nee { #1 } { \seq_item:Nn \l_tmpa_seq { 1 } } { \seq_item:Nn \l_tmpa_seq { 2 } }
+ }
+ {
+ \__projlib_math_define_operator:nee { #1 } { ##1 } { ##1 }
+ }
+ }
+ }
+
+\cs_new_protected:Nn \__projlib_math_define_operator:nnn
+ % #1 = bool for star or empty
+ % #2 = the operator
+ % #3 = the content
+ {
+ \cs_if_exist:cTF { #2 }
+ {
+ \msg_warning:nnn { projlib-math } { operator-not-define } { #2 }
+ }
+ {
+ \bool_if:NTF #1
+ {
+ \exp_args:Nnf \use:n
+ { \exp_args:Nnc \use:n { \DeclareMathOperator* } { #2 } }
+ }
+ {
+ \exp_args:Nnf \use:n
+ { \exp_args:Nc \DeclareMathOperator { #2 } }
+ }
+ % This is the f-argument of \exp_args:Nnf :
+ {
+ \exp_args:NnV \use:nn
+ { \exp_stop_f: }
+ { \l__projlib_math_operator_style_tl } { #3 }
+ }
+ }
+ }
+\cs_generate_variant:Nn \__projlib_math_define_operator:nnn { nee }
+
+\NewDocumentCommand \DefineOperator { s O{} m O{} }
+ {
+ \tl_if_blank:nTF { #2 }
+ {
+ \projlib_math_define_operator:nnn { #1 } { #3 } { #4 }
+ }
+ {
+ \projlib_math_define_operator:nnn { #1 } { #3 } { #2 }
+ }
+ }
+
+
+\msg_new:nnn { projlib-math }
+ { shortcut-not-define }
+ { The~shortcut~"\iow_char:N \\#1"~cannot~be~defined,~a~command~with~the~same~name~has~already~existed. }
+
+\msg_new:nnn { projlib-math }
+ { shortcut-type-not-define }
+ { The~shortcut~type~"#1"~is~not~available,~a~command~with~the~same~name~has~already~existed. }
+
+\keys_define:nn { projlib-math-shortcut }
+ {
+ , prefix .clist_set:N = \l__projlib_math_shortcut_prefix_clist
+ , type .tl_set:N = \l__projlib_math_shortcut_type_tl
+ , style .tl_set:N = \l__projlib_math_shortcut_style_tl
+ , unknown .code:n = {}
+ }
+
+\cs_new_protected:Nn \projlib_math_define_shortcut:nnn
+ % #1 = bool for star or empty
+ % (currently the starred version is the same as normal version)
+ % #2 = list of shortcuts
+ % #3 = the option
+ {
+ \clist_clear:N \l__projlib_math_shortcut_prefix_clist
+ \tl_clear:N \l__projlib_math_shortcut_type_tl
+ \tl_clear:N \l__projlib_math_shortcut_style_tl
+ \keys_set:nn { projlib-math-shortcut } { #3 }
+ \tl_if_empty:NF \l__projlib_math_shortcut_type_tl
+ {
+ \cs_if_exist:cTF { \l__projlib_math_shortcut_type_tl }
+ {
+ \exp_args:Nne \use:n
+ { \msg_warning:nnn { projlib-math } { shortcut-type-not-define } }
+ { \l__projlib_math_shortcut_type_tl }
+ }
+ {
+ \exp_args:Nno \use:n
+ {
+ \exp_args:Nc \NewDocumentCommand { \l__projlib_math_shortcut_type_tl } { m }
+ }
+ {
+ \l__projlib_math_shortcut_style_tl { ##1 }
+ }
+ }
+ }
+ \clist_map_inline:nn { #2 }
+ {
+ \str_if_in:nnTF { ##1 } { = }
+ {
+ \seq_set_split:Nnn \l_tmpa_seq { = } { ##1 }
+ \clist_if_empty:NTF \l__projlib_math_shortcut_prefix_clist
+ {
+ \__projlib_math_define_shortcut:ee { \seq_item:Nn \l_tmpa_seq { 1 } } { \seq_item:Nn \l_tmpa_seq { 2 } }
+ }
+ {
+ \clist_map_inline:Nn \l__projlib_math_shortcut_prefix_clist
+ {
+ \__projlib_math_define_shortcut:ee { ####1 \seq_item:Nn \l_tmpa_seq { 1 } } { \seq_item:Nn \l_tmpa_seq { 2 } }
+ }
+ }
+ }
+ {
+ \clist_if_empty:NTF \l__projlib_math_shortcut_prefix_clist
+ {
+ \__projlib_math_define_shortcut:ee { ##1 } { ##1 }
+ }
+ {
+ \clist_map_inline:Nn \l__projlib_math_shortcut_prefix_clist
+ {
+ \__projlib_math_define_shortcut:ee { ####1 ##1 } { ##1 }
+ }
+ }
+ }
+ }
+ }
+
+\cs_new_protected:Nn \__projlib_math_define_shortcut:nn
+ % #1 = command name
+ % #2 = the content
+ {
+ \cs_if_exist:cTF { #1 }
+ {
+ \msg_warning:nnn { projlib-math } { shortcut-type-not-define } { #1 }
+ }
+ {
+ \exp_args:Nno \use:n
+ { \exp_args:Nc \NewDocumentCommand { #1 } {} }
+ { \l__projlib_math_shortcut_style_tl { #2 } }
+ }
+ }
+\cs_generate_variant:Nn \__projlib_math_define_shortcut:nn { ee }
+
+\NewDocumentCommand \DefineShortcut { s O{} m O{} }
+ {
+ \tl_if_blank:nTF { #2 }
+ {
+ \projlib_math_define_shortcut:nnn { #1 } { #3 } { #4 }
+ }
+ {
+ \projlib_math_define_shortcut:nnn { #1 } { #3 } { #2 }
+ }
+ }
+%</projlib-math>
+%
+%<*projlib-paper>
+\keys_define:nn { projlib-paper }
+ {
+ , preview-mode .bool_set:N = \l__projlib_paper_preview_bool
+ , preview-mode .initial:n = { false }
+ , paper-style .tl_set:N = \l__projlib_paper_paperstyle_tl
+ , paper-style .initial:n = { normal }
+ , paper-style .value_required:n = true
+ , paper~style .tl_set:N = \l__projlib_paper_paperstyle_tl
+ , paper style .tl_set:N = \l__projlib_paper_paperstyle_tl
+ , yellow-paper .meta:n = { paperstyle = yellow }
+ , yellow~paper .meta:n = { paperstyle = yellow }
+ , yellow paper .meta:n = { paperstyle = yellow }
+ , parchment-paper .meta:n = { paperstyle = parchment }
+ , parchment~paper .meta:n = { paperstyle = parchment }
+ , parchment paper .meta:n = { paperstyle = parchment }
+ , green-paper .meta:n = { paperstyle = green }
+ , green~paper .meta:n = { paperstyle = green }
+ , green paper .meta:n = { paperstyle = green }
+ , light-gray-paper .meta:n = { paperstyle = lightgray }
+ , light~gray~paper .meta:n = { paperstyle = lightgray }
+ , light gray-paper .meta:n = { paperstyle = lightgray }
+ , light gray~paper .meta:n = { paperstyle = lightgray }
+ , light gray paper .meta:n = { paperstyle = lightgray }
+ , gray-paper .meta:n = { paperstyle = gray }
+ , gray~paper .meta:n = { paperstyle = gray }
+ , gray paper .meta:n = { paperstyle = gray }
+ , nord-paper .meta:n = { paperstyle = nord }
+ , nord~paper .meta:n = { paperstyle = nord }
+ , nord paper .meta:n = { paperstyle = nord }
+ , dark-paper .meta:n = { paperstyle = dark }
+ , dark~paper .meta:n = { paperstyle = dark }
+ , dark paper .meta:n = { paperstyle = dark }
+ , unknown .code:n = {}
+ }
+\ProcessKeysOptions { projlib-paper }
+
+\cs_new:Nn \projlib_paper_preview_disable:
+ {
+ \bool_set_false:c { l__projlib_paper_preview_bool }
+ }
+
+\hook_gput_code:nnn { begindocument/before } { projlib-paper }
+ {
+ \bool_if:NT \l__projlib_paper_preview_bool
+ {
+ \dim_set:Nn \paperwidth
+ {
+ \dim_eval:n { \textwidth * 21 / 20 }
+ }
+ \dim_set:Nn \paperheight
+ {
+ \dim_eval:n { ( \textheight + \headheight + \headsep + \footskip ) * 21 / 20 }
+ }
+ \dim_set:Nn \oddsidemargin
+ {
+ \dim_eval:n { ( \paperwidth - \textwidth ) / 2 - 1in }
+ }
+ \dim_set:Nn \evensidemargin
+ {
+ \dim_eval:n { ( \paperwidth - \textwidth ) / 2 - 1in }
+ }
+ \dim_set:Nn \topmargin
+ {
+ \dim_eval:n { ( \paperheight - \textheight - \headheight - \headsep - \footskip ) / 2 - 1in }
+ }
+ }
+ }
+
+\RequirePackage { xcolor }
+
+\definecolor { paper } { RGB } { 255, 255, 255 }
+\definecolor { main-text } { RGB } { 0, 0, 0 }
+
+\str_case_e:nn { \l__projlib_paper_paperstyle_tl }
+ {
+ { yellow } { \definecolor { paper } { RGB } { 247, 246, 233 } }
+ { parchment } { \definecolor { paper } { RGB } { 224, 204, 160 } }
+ { green } { \definecolor { paper } { RGB } { 207, 231, 207 } }
+ { lightgray } { \definecolor { paper } { RGB } { 236, 239, 244 }
+ \definecolor { main-text } { RGB } { 37, 41, 46 } }
+ { light-gray } { \definecolor { paper } { RGB } { 236, 239, 244 }
+ \definecolor { main-text } { RGB } { 37, 41, 46 } }
+ { gray } { \definecolor { paper } { RGB } { 127, 130, 136 }
+ \definecolor { main-text } { RGB } { 236, 239, 244 } }
+ { nord } { \definecolor { paper } { RGB } { 46, 52, 64 }
+ \definecolor { main-text } { RGB } { 214, 220, 230 } }
+ { dark } { \definecolor { paper } { RGB } { 28, 29, 33 }
+ \definecolor { main-text } { RGB } { 210, 213, 217 } }
+ }
+
+\cs_new:Nn \projlib_paper_set_page_color:n
+ {
+ \pagecolor { #1 }
+ }
+\cs_new:Nn \projlib_paper_set_text_color:n
+ {
+ \color { #1 }
+ \cs_gset_eq:cc { default@color } { current@color }
+ }
+
+\projlib_paper_set_page_color:n { paper }
+\projlib_paper_set_text_color:n { main-text }
+
+\hook_gput_code:nnn { begindocument/before } { projlib-paper }
+ {
+ \cs_if_exist:NT \tcbset
+ { \tcbset { colupper = main-text, collower = main-text } }
+ }
+%</projlib-paper>
+%
+%<*projlib-theorem>
+\keys_define:nn { projlib-theorem }
+ {
+ , no-theorems .bool_set:N = \l__projlib_theorem_no_theorems_bool
+ , no-theorems .initial:n = { false }
+ , no~theorems .bool_set:N = \l__projlib_theorem_no_theorems_bool
+ , no theorems .bool_set:N = \l__projlib_theorem_no_theorems_bool
+ , nothms .bool_set:N = \l__projlib_theorem_no_theorems_bool
+ , no-theorem-numbering .bool_set:N = \l__projlib_theorem_no_theorem_numbering_bool
+ , no-theorem-numbering .initial:n = { false }
+ , no~theorem~numbering .bool_set:N = \l__projlib_theorem_no_theorem_numbering_bool
+ , no theorem numbering .bool_set:N = \l__projlib_theorem_no_theorem_numbering_bool
+ , nothmnum .bool_set:N = \l__projlib_theorem_no_theorem_numbering_bool
+ , theorem-numbering .tl_set:N = \l__projlib_theorem_theorem_numbering_tl
+ , theorem-numbering .default:n = { * }
+ , theorem~numbering .tl_set:N = \l__projlib_theorem_theorem_numbering_tl
+ , theorem~numbering .default:n = { * }
+ , theorem numbering .tl_set:N = \l__projlib_theorem_theorem_numbering_tl
+ , theorem numbering .default:n = { * }
+ , thmnum .tl_set:N = \l__projlib_theorem_theorem_numbering_tl
+ , thmnum .default:n = { * }
+ , complex-name .bool_set:N = \l__projlib_theorem_complexname_bool
+ , complex-name .initial:n = { true }
+ , complex~name .bool_set:N = \l__projlib_theorem_complexname_bool
+ , complex name .bool_set:N = \l__projlib_theorem_complexname_bool
+ , simple-name .bool_set_inverse:N = \l__projlib_theorem_complexname_bool
+ , simple~name .bool_set_inverse:N = \l__projlib_theorem_complexname_bool
+ , simple name .bool_set_inverse:N = \l__projlib_theorem_complexname_bool
+ , no-preset-names .bool_set_inverse:N = \l__projlib_theorem_presetname_bool
+ , no-preset-names .initial:n = { false }
+ , no~preset~names .bool_set_inverse:N = \l__projlib_theorem_presetname_bool
+ , no preset names .bool_set_inverse:N = \l__projlib_theorem_presetname_bool
+ , unknown .code:n = { \PassOptionsToPackage { \CurrentOption } { create-theorem } }
+ }
+\ProcessKeysOptions { projlib-theorem }
+
+\clist_const:Nn \c_projlib_theorem_supported_clist
+ {
+ assertion ,
+ assumption ,
+ axiom ,
+ conclusion ,
+ conjecture ,
+ convention ,
+ corollary ,
+ definition ,
+ example ,
+ exercise ,
+ fact ,
+ hypothesis ,
+ lemma ,
+ notation ,
+ observation ,
+ postulate ,
+ problem ,
+ property ,
+ proposition ,
+ question ,
+ remark ,
+ theorem ,
+ definition-proposition ,
+ definition-theorem ,
+ }
+
+\@ifclassloaded { beamer }
+ {
+ \RequirePackage { silence }
+ \WarningFilter { cleveref } { hyperref~package~loaded~with~implicit=false~option }
+ \bool_set_true:N \l__projlib_theorem_no_theorem_numbering_bool
+ \bool_if:NF \l__projlib_theorem_no_theorems_bool
+ {
+ \cs_undefine:c { theorem }
+ \cs_undefine:c { lemma }
+ \cs_undefine:c { corollary }
+ \cs_undefine:c { definition }
+ \cs_undefine:c { fact }
+ \cs_undefine:c { example }
+ \cs_undefine:c { problem }
+ }
+ } {}
+
+\RequirePackage { projlib-language }
+
+% \bool_if:NF \l__projlib_theorem_complexname_bool
+% {
+% \PassOptionsToPackage { no preset names } { create-theorem }
+% }
+
+\RequirePackage { amsthm }
+\RequirePackage { create-theorem }
+
+
+\bool_if:NF \l__projlib_theorem_no_theorems_bool
+ {
+ \bool_if:NTF \l__projlib_theorem_no_theorem_numbering_bool
+ {
+ \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { numberless }
+ }
+ {
+ \tl_if_blank:eTF \l__projlib_theorem_theorem_numbering_tl
+ {
+ \cs_if_exist:cTF { c@chapter }
+ { % with \chapter
+ \CreateTheorem {theorem} { parent counter = chapter }
+ }
+ { % without \chapter
+ \CreateTheorem {theorem} { parent counter = section }
+ }
+ }
+ {
+ \tl_if_eq:NnTF \l__projlib_theorem_theorem_numbering_tl { * }
+ {
+ \CreateTheorem {theorem} { }
+ }
+ {
+ \CreateTheorem {theorem} { parent counter = \l__projlib_theorem_theorem_numbering_tl }
+ }
+ }
+
+ \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { shared counter = theorem, quiet }
+ }
+ }
+
+
+\AddLanguageSetting [ schinese ]
+ {
+ \crefname { equation } { 式 } { 式 }
+ \crefname { figure } { 图 } { 图 }
+ \crefname { table } { 表 } { 表 }
+ \crefname { appendix } { 附录 } { 附录 }
+ \Crefname { equation } { 式 } { 式 }
+ \Crefname { figure } { 图 } { 图 }
+ \Crefname { table } { 表 } { 表 }
+ \Crefname { appendix } { 附录 } { 附录 }
+ \tl_gset:Nn { \crefpairconjunction } { 、 }
+ \tl_gset:Nn { \crefmiddleconjunction } { 、 }
+ \tl_gset:Nn { \creflastconjunction } { \nobreakspace 和 \nobreakspace }
+ \tl_gset:Nn { \crefpairgroupconjunction } { \nobreakspace 和 \nobreakspace }
+ \tl_gset:Nn { \crefmiddlegroupconjunction } { 、 }
+ \tl_gset:Nn { \creflastgroupconjunction } { \nobreakspace 以及 \nobreakspace }
+ \tl_gset:Nn { \crefrangeconjunction } { ~ }
+ }
+
+\AddLanguageSetting [ tchinese ]
+ {
+ \crefname { equation } { 式 } { 式 }
+ \crefname { figure } { 圖 } { 圖 }
+ \crefname { table } { 表 } { 表 }
+ \crefname { appendix } { 附錄 } { 附錄 }
+ \Crefname { equation } { 式 } { 式 }
+ \Crefname { figure } { 圖 } { 圖 }
+ \Crefname { table } { 表 } { 表 }
+ \Crefname { appendix } { 附錄 } { 附錄 }
+ \tl_gset:Nn { \crefpairconjunction } { 、 }
+ \tl_gset:Nn { \crefmiddleconjunction } { 、 }
+ \tl_gset:Nn { \creflastconjunction } { \nobreakspace 與 \nobreakspace }
+ \tl_gset:Nn { \crefpairgroupconjunction } { \nobreakspace 與 \nobreakspace }
+ \tl_gset:Nn { \crefmiddlegroupconjunction } { 、 }
+ \tl_gset:Nn { \creflastgroupconjunction } { \nobreakspace 以及 \nobreakspace }
+ \tl_gset:Nn { \crefrangeconjunction } { ~ }
+ }
+
+\AddLanguageSetting [ japanese ]
+ {
+ \crefname { equation } { 式 } { 式 }
+ \crefname { figure } { 図 } { 図 }
+ \crefname { table } { 表 } { 表 }
+ \Crefname { appendix } { 付録 } { 付録 }
+ \Crefname { equation } { 式 } { 式 }
+ \Crefname { figure } { 図 } { 図 }
+ \Crefname { table } { 表 } { 表 }
+ \Crefname { appendix } { 付録 } { 付録 }
+ \tl_gset:Nn { \crefpairconjunction } { \nobreakspace と \nobreakspace }
+ \tl_gset:Nn { \crefmiddleconjunction } { \nobreakspace と \nobreakspace }
+ \tl_gset:Nn { \creflastconjunction } { \nobreakspace と \nobreakspace }
+ \tl_gset:Nn { \crefpairgroupconjunction } { \nobreakspace と \nobreakspace }
+ \tl_gset:Nn { \crefmiddlegroupconjunction } { \nobreakspace と \nobreakspace }
+ \tl_gset:Nn { \creflastgroupconjunction } { \nobreakspace 及び \nobreakspace }
+ \tl_gset:Nn { \crefrangeconjunction } { ~ }
+ }
+
+\AddLanguageSetting [ russian ]
+ {
+ \crefname { equation } { уравнение } { уравнения }
+ \crefname { figure } { рис. } { рис. }
+ \crefname { table } { таблица } { таблицы }
+ \crefname { appendix } { приложение } { приложения }
+ \Crefname { equation } { Уравнение } { Уравнения }
+ \Crefname { figure } { Рис. } { Рис. }
+ \Crefname { table } { Таблица } { Таблицы }
+ \Crefname { appendix } { Приложение } { Приложения }
+ \tl_gset:Nn { \crefpairconjunction } { \nobreakspace и \nobreakspace }
+ \tl_gset:Nn { \crefmiddleconjunction } { , \nobreakspace }
+ \tl_gset:Nn { \creflastconjunction } { \nobreakspace и \nobreakspace }
+ \tl_gset:Nn { \crefpairgroupconjunction } { \nobreakspace и \nobreakspace }
+ \tl_gset:Nn { \crefmiddlegroupconjunction } { , \nobreakspace }
+ \tl_gset:Nn { \creflastgroupconjunction } { \nobreakspace и \nobreakspace }
+ \tl_gset:Nn { \crefrangeconjunction } { \nobreakspace \textasciitilde \nobreakspace }
+ }
+
+\AddLanguageSetting [ portuguese ]
+ {
+ \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 }
+ \tl_gset:Nn { \crefpairconjunction } { \nobreakspace e \nobreakspace }
+ \tl_gset:Nn { \crefmiddleconjunction } { , \nobreakspace }
+ \tl_gset:Nn { \creflastconjunction } { \nobreakspace e \nobreakspace }
+ \tl_gset:Nn { \crefpairgroupconjunction } { \nobreakspace e \nobreakspace }
+ \tl_gset:Nn { \crefmiddlegroupconjunction } { , \nobreakspace }
+ \tl_gset:Nn { \creflastgroupconjunction } { \nobreakspace e \nobreakspace }
+ \tl_gset:Nn { \crefrangeconjunction } { \nobreakspace a \nobreakspace }
+ }
+
+
+\bool_if:NF \l__projlib_theorem_presetname_bool { \endinput }
+\bool_if:NT \l__projlib_theorem_complexname_bool { \endinput }
+
+
+\NameTheorem { assertion }
+ {
+ , heading = {
+ , english = Assertion
+ , french = Assertion
+ , ngerman = Behauptung
+ , italian = Asserzione
+ , portuguese = Asserção
+ , brazilian = Asserção
+ , spanish = Aserción
+ , schinese = 断言
+ , tchinese = 斷言
+ , japanese = アサーション
+ , russian = Утверждение
+ }
+ , crefname = {
+ , english = {Assertion}{Assertion}
+ , french = [l']{Assertion}[les]{Assertion}
+ , ngerman = {Behauptung}{Behauptung}
+ , italian = [l']{Asserzione}[le]{Asserzione}
+ , portuguese = [a]{Asserção}[as]{Asserção}
+ , brazilian = [a]{Asserção}[as]{Asserção}
+ , spanish = [la]{Aserción}[las]{Aserción}
+ , schinese = {断言}{断言}
+ , tchinese = {斷言}{斷言}
+ , japanese = {アサーション}{アサーション}
+ , russian = {Утверждение}{Утверждение}
+ }
+ , Crefname = {
+ , english = {Assertion}{Assertion}
+ , french = [L']{Assertion}[Les]{Assertion}
+ , ngerman = {Behauptung}{Behauptung}
+ , italian = [L']{Asserzione}[Le]{Asserzione}
+ , portuguese = [A]{Asserção}[As]{Asserção}
+ , brazilian = [A]{Asserção}[As]{Asserção}
+ , spanish = [La]{Aserción}[Las]{Aserción}
+ , schinese = {断言}{断言}
+ , tchinese = {斷言}{斷言}
+ , japanese = {アサーション}{アサーション}
+ , russian = {Утверждение}{Утверждение}
+ }
+ }
+
+\NameTheorem { assumption }
+ {
+ , heading = {
+ , english = Assumption
+ , french = Supposition
+ , ngerman = Annahme
+ , italian = Supposizione
+ , portuguese = Suposição
+ , brazilian = Suposição
+ , spanish = Suposición
+ , schinese = 假定
+ , tchinese = 假定
+ , japanese = 仮定
+ , russian = Предположение
+ }
+ , crefname = {
+ , english = {Assumption}{Assumption}
+ , french = [la]{Supposition}[les]{Supposition}
+ , ngerman = {Annahme}{Annahme}
+ , italian = [la]{Supposizione}[le]{Supposizione}
+ , portuguese = [a]{Suposição}[as]{Suposição}
+ , brazilian = [a]{Suposição}[as]{Suposição}
+ , spanish = [la]{Suposición}[las]{Suposición}
+ , schinese = {假定}{假定}
+ , tchinese = {假定}{假定}
+ , japanese = {仮定}{仮定}
+ , russian = {Предположение}{Предположение}
+ }
+ , Crefname = {
+ , english = {Assumption}{Assumption}
+ , french = [La]{Supposition}[Les]{Supposition}
+ , ngerman = {Annahme}{Annahme}
+ , italian = [la]{Supposizione}[le]{Supposizione}
+ , portuguese = [A]{Suposição}[As]{Suposição}
+ , brazilian = [A]{Suposição}[As]{Suposição}
+ , spanish = [La]{Suposición}[Las]{Suposición}
+ , schinese = {假定}{假定}
+ , tchinese = {假定}{假定}
+ , japanese = {仮定}{仮定}
+ , russian = {Предположение}{Предположение}
+ }
+ }
+
+\NameTheorem { axiom }
+ {
+ , heading = {
+ , english = Axiom
+ , french = Axiome
+ , ngerman = Axiom
+ , italian = Assioma
+ , portuguese = Axioma
+ , brazilian = Axioma
+ , spanish = Axioma
+ , schinese = 公理
+ , tchinese = 公理
+ , japanese = 公理
+ , russian = Аксиома
+ }
+ , crefname = {
+ , english = {Axiom}{Axiom}
+ , french = [l']{Axiome}[les]{Axiome}
+ , ngerman = {Axiom}{Axiom}
+ , italian = [l']{Assioma}[gli]{Assioma}
+ , portuguese = [o]{Axioma}[os]{Axioma}
+ , brazilian = [o]{Axioma}[os]{Axioma}
+ , spanish = [el]{Axioma}[los]{Axioma}
+ , schinese = {公理}{公理}
+ , tchinese = {公理}{公理}
+ , japanese = {公理}{公理}
+ , russian = {Аксиома}{Аксиома}
+ }
+ , Crefname = {
+ , english = {Axiom}{Axiom}
+ , french = [L']{Axiome}[Les]{Axiome}
+ , ngerman = {Axiom}{Axiom}
+ , italian = [L']{Assioma}[Gli]{Assioma}
+ , portuguese = [O]{Axioma}[Os]{Axioma}
+ , brazilian = [O]{Axioma}[Os]{Axioma}
+ , spanish = [El]{Axioma}[Los]{Axioma}
+ , schinese = {公理}{公理}
+ , tchinese = {公理}{公理}
+ , japanese = {公理}{公理}
+ , russian = {Аксиома}{Аксиома}
+ }
+ }
+
+\NameTheorem { conclusion }
+ {
+ , heading = {
+ , english = Conclusion
+ , french = Conclusion
+ , ngerman = Schlussfolgerung
+ , italian = Conclusione
+ , portuguese = Conclusão
+ , brazilian = Conclusão
+ , spanish = Conclusión
+ , schinese = 结论
+ , tchinese = 結論
+ , japanese = 結論
+ , russian = Вывод
+ }
+ , crefname = {
+ , english = {Conclusion}{Conclusion}
+ , french = [la]{Conclusion}[Les]{Conclusion}
+ , ngerman = {Schlussfolgerung}{Schlussfolgerung}
+ , italian = [la]{Conclusione}[le]{Conclusione}
+ , portuguese = [a]{Conclusão}[as]{Conclusão}
+ , brazilian = [a]{Conclusão}[as]{Conclusão}
+ , spanish = [la]{Conclusión}[las]{Conclusión}
+ , schinese = {结论}{结论}
+ , tchinese = {結論}{結論}
+ , japanese = {結論}{結論}
+ , russian = {Вывод}{Вывод}
+ }
+ , Crefname = {
+ , english = {Conclusion}{Conclusion}
+ , french = [La]{Conclusion}[Les]{Conclusion}
+ , ngerman = {Schlussfolgerung}{Schlussfolgerung}
+ , italian = [La]{Conclusione}[Le]{Conclusione}
+ , portuguese = [A]{Conclusão}[As]{Conclusão}
+ , brazilian = [A]{Conclusão}[As]{Conclusão}
+ , spanish = [La]{Conclusión}[Las]{Conclusión}
+ , schinese = {结论}{结论}
+ , tchinese = {結論}{結論}
+ , japanese = {結論}{結論}
+ , russian = {Вывод}{Вывод}
+ }
+ }
+
+\NameTheorem { conjecture }
+ {
+ , heading = {
+ , english = Conjecture
+ , french = Conjecture
+ , ngerman = Vermutung
+ , italian = Congettura
+ , portuguese = Conjetura
+ , brazilian = Conjectura
+ , spanish = Conjetura
+ , schinese = 猜想
+ , tchinese = 猜想
+ , japanese = 予想
+ , russian = Гипотеза
+ }
+ , crefname = {
+ , english = {Conjecture}{Conjecture}
+ , french = [la]{Conjecture}[les]{Conjecture}
+ , ngerman = {Vermutung}{Vermutung}
+ , italian = [la]{Congettura}[le]{Congettura}
+ , portuguese = [a]{Conjetura}[as]{Conjetura}
+ , brazilian = [a]{Conjectura}[as]{Conjectura}
+ , spanish = [la]{Conjetura}[las]{Conjetura}
+ , schinese = {猜想}{猜想}
+ , tchinese = {猜想}{猜想}
+ , japanese = {予想}{予想}
+ , russian = {Гипотеза}{Гипотеза}
+ }
+ , Crefname = {
+ , english = {Conjecture}{Conjecture}
+ , french = [La]{Conjecture}[Les]{Conjecture}
+ , ngerman = {Vermutung}{Vermutung}
+ , italian = [La]{Congettura}[Le]{Congettura}
+ , portuguese = [A]{Conjetura}[As]{Conjetura}
+ , brazilian = [A]{Conjectura}[As]{Conjectura}
+ , spanish = [La]{Conjetura}[Las]{Conjetura}
+ , schinese = {猜想}{猜想}
+ , tchinese = {猜想}{猜想}
+ , japanese = {予想}{予想}
+ , russian = {Гипотеза}{Гипотеза}
+ }
+ }
+
+\NameTheorem { convention }
+ {
+ , heading = {
+ , english = Convention
+ , french = Convention
+ , ngerman = Konvention
+ , italian = Convenzione
+ , portuguese = Convenção
+ , brazilian = Convenção
+ , spanish = Convención
+ , schinese = 约定
+ , tchinese = 約定
+ , japanese = 慣例
+ , russian = Конвенция
+ }
+ , crefname = {
+ , english = {Convention}{Convention}
+ , french = [la]{Convention}[les]{Convention}
+ , ngerman = {Konvention}{Konvention}
+ , italian = [la]{Convenzione}[le]{Convenzione}
+ , portuguese = [a]{Convenção}[as]{Convenção}
+ , brazilian = [a]{Convenção}[as]{Convenção}
+ , spanish = [la]{Convención}[las]{Convención}
+ , schinese = {约定}{约定}
+ , tchinese = {約定}{約定}
+ , japanese = {慣例}{慣例}
+ , russian = {Конвенция}{Конвенция}
+ }
+ , Crefname = {
+ , english = {Convention}{Convention}
+ , french = [La]{Convention}[Les]{Convention}
+ , ngerman = {Konvention}{Konvention}
+ , italian = [La]{Convenzione}[Le]{Convenzione}
+ , portuguese = [A]{Convenção}[As]{Convenção}
+ , brazilian = [A]{Convenção}[As]{Convenção}
+ , spanish = [La]{Convención}[Las]{Convención}
+ , schinese = {约定}{约定}
+ , tchinese = {約定}{約定}
+ , japanese = {慣例}{慣例}
+ , russian = {Конвенция}{Конвенция}
+ }
+ }
+
+\NameTheorem { corollary }
+ {
+ , heading = {
+ , english = Corollary
+ , french = Corollaire
+ , ngerman = Korollar
+ , italian = Corollario
+ , portuguese = Corolário
+ , brazilian = Corolário
+ , spanish = Corolario
+ , schinese = 推论
+ , tchinese = 推論
+ , japanese = 系
+ , russian = Следствие
+ }
+ , crefname = {
+ , english = {Corollary}{Corollary}
+ , french = [le]{Corollaire}[les]{Corollaire}
+ , ngerman = {Korollar}{Korollar}
+ , italian = [il]{Corollario}[i]{Corollario}
+ , portuguese = [o]{Corolário}[os]{Corolário}
+ , brazilian = [o]{Corolário}[os]{Corolário}
+ , spanish = [el]{Corolario}[los]{Corolario}
+ , schinese = {推论}{推论}
+ , tchinese = {推論}{推論}
+ , japanese = {系}{系}
+ , russian = {Следствие}{Следствие}
+ }
+ , Crefname = {
+ , english = {Corollary}{Corollary}
+ , french = [Le]{Corollaire}[Les]{Corollaire}
+ , ngerman = {Korollar}{Korollar}
+ , italian = [Il]{Corollario}[I]{Corollario}
+ , portuguese = [O]{Corolário}[Os]{Corolário}
+ , brazilian = [O]{Corolário}[Os]{Corolário}
+ , spanish = [El]{Corolario}[Los]{Corolario}
+ , schinese = {推论}{推论}
+ , tchinese = {推論}{推論}
+ , japanese = {系}{系}
+ , russian = {Следствие}{Следствие}
+ }
+ }
+
+\NameTheorem { definition }
+ {
+ , heading = {
+ , english = Definition
+ , french = Définition
+ , ngerman = Definition
+ , italian = Definizione
+ , portuguese = Definição
+ , brazilian = Definição
+ , spanish = Definición
+ , schinese = 定义
+ , tchinese = 定義
+ , japanese = 定義
+ , russian = Определение
+ }
+ , crefname = {
+ , english = {Definition}{Definition}
+ , french = [la]{Définition}[les]{Définition}
+ , ngerman = {Definition}{Definition}
+ , italian = [la]{Definizione}[le]{Definizione}
+ , portuguese = [a]{Definição}[as]{Definição}
+ , brazilian = [a]{Definição}[as]{Definição}
+ , spanish = [la]{Definición}[las]{Definición}
+ , schinese = {定义}{定义}
+ , tchinese = {定義}{定義}
+ , japanese = {定義}{定義}
+ , russian = {Определение}{Определение}
+ }
+ , Crefname = {
+ , english = {Definition}{Definition}
+ , french = [La]{Définition}[Les]{Définition}
+ , ngerman = {Definition}{Definition}
+ , italian = [La]{Definizione}[Le]{Definizione}
+ , portuguese = [A]{Definição}[As]{Definição}
+ , brazilian = [A]{Definição}[As]{Definição}
+ , spanish = [La]{Definición}[Las]{Definición}
+ , schinese = {定义}{定义}
+ , tchinese = {定義}{定義}
+ , japanese = {定義}{定義}
+ , russian = {Определение}{Определение}
+ }
+ }
+
+\NameTheorem { example }
+ {
+ , heading = {
+ , english = Example
+ , french = Exemple
+ , ngerman = Beispiel
+ , italian = Esempio
+ , portuguese = Exemplo
+ , brazilian = Exemplo
+ , spanish = Ejemplo
+ , schinese = 例
+ , tchinese = 例
+ , japanese = 例
+ , russian = Пример
+ }
+ , crefname = {
+ , english = {Example}{Example}
+ , french = [l']{Example}[les]{Example}
+ , ngerman = {Beispiel}{Beispiel}
+ , italian = [l']{Esempio}[gli]{Esempio}
+ , portuguese = [o]{Exemplo}[os]{Exemplo}
+ , brazilian = [o]{Exemplo}[os]{Exemplo}
+ , spanish = [el]{Ejemplo}[los]{Ejemplo}
+ , schinese = {例}{例}
+ , tchinese = {例}{例}
+ , japanese = {例}{例}
+ , russian = {Пример}{Пример}
+ }
+ , Crefname = {
+ , english = {Example}{Example}
+ , french = [L']{Example}[Les]{Example}
+ , ngerman = {Beispiel}{Beispiel}
+ , italian = [L']{Esempio}[Gli]{Esempio}
+ , portuguese = [O]{Exemplo}[Os]{Exemplo}
+ , brazilian = [O]{Exemplo}[Os]{Exemplo}
+ , spanish = [El]{Ejemplo}[Los]{Ejemplo}
+ , schinese = {例}{例}
+ , tchinese = {例}{例}
+ , japanese = {例}{例}
+ , russian = {Пример}{Пример}
+ }
+ }
+
+\NameTheorem { exercise }
+ {
+ , heading = {
+ , english = Exercise
+ , french = Exercice
+ , ngerman = Übung
+ , italian = Esercizio
+ , portuguese = Exercício
+ , brazilian = Exercício
+ , spanish = Ejercicio
+ , schinese = 练习
+ , tchinese = 練習
+ , japanese = 練習
+ , russian = Упражнение
+ }
+ , crefname = {
+ , english = {Exercise}{Exercise}
+ , french = [l']{Exercice}[les]{Exercice}
+ , ngerman = {Übung}{Übung}
+ , italian = [l']{Esercizio}[gli]{Esercizio}
+ , portuguese = [o]{Exercício}[os]{Exercício}
+ , brazilian = [o]{Exercício}[os]{Exercício}
+ , spanish = [el]{Ejercicio}[los]{Ejercicio}
+ , schinese = {练习}{练习}
+ , tchinese = {練習}{練習}
+ , japanese = {練習}{練習}
+ , russian = {Упражнение}{Упражнение}
+ }
+ , Crefname = {
+ , english = {Exercise}{Exercise}
+ , french = [L']{Exercice}[Les]{Exercice}
+ , ngerman = {Übung}{Übung}
+ , italian = [L']{Esercizio}[Gli]{Esercizio}
+ , portuguese = [O]{Exercício}[Os]{Exercício}
+ , brazilian = [O]{Exercício}[Os]{Exercício}
+ , spanish = [El]{Ejercicio}[Los]{Ejercicio}
+ , schinese = {练习}{练习}
+ , tchinese = {練習}{練習}
+ , japanese = {練習}{練習}
+ , russian = {Упражнение}{Упражнение}
+ }
+ }
+
+\NameTheorem { fact }
+ {
+ , heading = {
+ , english = Fact
+ , french = Fait
+ , ngerman = Fakt
+ , italian = Fatto
+ , portuguese = Facto
+ , brazilian = Fato
+ , spanish = Hecho
+ , schinese = 事实
+ , tchinese = 事實
+ , japanese = 事実
+ , russian = Факт
+ }
+ , crefname = {
+ , english = {Fact}{Fact}
+ , french = [le]{Fait}[les]{Fait}
+ , ngerman = {Fakt}{Fakt}
+ , italian = [il]{Fatto}[i]{Fatto}
+ , portuguese = [o]{Facto}[os]{Facto}
+ , brazilian = [o]{Fato}[os]{Fato}
+ , spanish = [el]{Hecho}[los]{Hecho}
+ , schinese = {事实}{事实}
+ , tchinese = {事實}{事實}
+ , japanese = {事実}{事実}
+ , russian = {Факт}{Факт}
+ }
+ , Crefname = {
+ , english = {Fact}{Fact}
+ , french = [Le]{Fait}[Les]{Fait}
+ , ngerman = {Fakt}{Fakt}
+ , italian = [Il]{Fatto}[I]{Fatto}
+ , portuguese = [O]{Facto}[Os]{Facto}
+ , brazilian = [O]{Fato}[Os]{Fato}
+ , spanish = [El]{Hecho}[Los]{Hecho}
+ , schinese = {事实}{事实}
+ , tchinese = {事實}{事實}
+ , japanese = {事実}{事実}
+ , russian = {Факт}{Факт}
+ }
+ }
+
+\NameTheorem { hypothesis }
+ {
+ , heading = {
+ , english = Hypothesis
+ , french = Hypothèse
+ , ngerman = Hypothese
+ , italian = Ipotesi
+ , portuguese = Hipótese
+ , brazilian = Hipótese
+ , spanish = Hipótesis
+ , schinese = 假设
+ , tchinese = 假設
+ , japanese = 仮設
+ , russian = Гипотеза
+ }
+ , crefname = {
+ , english = {Hypothesis}{Hypothesis}
+ , french = [l']{Hypothèse}[les]{Hypothèse}
+ , ngerman = {Hypothese}{Hypothese}
+ , italian = [l']{Ipotesi}[le]{Ipotesi}
+ , portuguese = [a]{Hipótese}[as]{Hipótese}
+ , brazilian = [a]{Hipótese}[as]{Hipótese}
+ , spanish = [la]{Hipótesis}[las]{Hipótesis}
+ , schinese = {假设}{假设}
+ , tchinese = {假設}{假設}
+ , japanese = {仮設}{仮設}
+ , russian = {Гипотеза}{Гипотеза}
+ }
+ , Crefname = {
+ , english = {Hypothesis}{Hypothesis}
+ , french = [L']{Hypothèse}[Les]{Hypothèse}
+ , ngerman = {Hypothese}{Hypothese}
+ , italian = [L']{Ipotesi}[Le]{Ipotesi}
+ , portuguese = [A]{Hipótese}[As]{Hipótese}
+ , brazilian = [A]{Hipótese}[As]{Hipótese}
+ , spanish = [La]{Hipótesis}[Las]{Hipótesis}
+ , schinese = {假设}{假设}
+ , tchinese = {假設}{假設}
+ , japanese = {仮設}{仮設}
+ , russian = {Гипотеза}{Гипотеза}
+ }
+ }
+
+\NameTheorem { lemma }
+ {
+ , heading = {
+ , english = Lemma
+ , french = Lemme
+ , ngerman = Lemma
+ , italian = Lemma
+ , portuguese = Lema
+ , brazilian = Lema
+ , spanish = Lema
+ , schinese = 引理
+ , tchinese = 引理
+ , japanese = 補題
+ , russian = Лемма
+ }
+ , crefname = {
+ , english = {Lemma}{Lemma}
+ , french = [le]{Lemme}[les]{Lemme}
+ , ngerman = {Lemma}{Lemma}
+ , italian = [il]{Lemma}[i]{Lemma}
+ , portuguese = [o]{Lema}[os]{Lema}
+ , brazilian = [o]{Lema}[os]{Lema}
+ , spanish = [el]{Lema}[las]{Lema}
+ , schinese = {引理}{引理}
+ , tchinese = {引理}{引理}
+ , japanese = {補題}{補題}
+ , russian = {Лемма}{Лемма}
+ }
+ , Crefname = {
+ , english = {Lemma}{Lemma}
+ , french = [Le]{Lemme}[Les]{Lemme}
+ , ngerman = {Lemma}{Lemma}
+ , italian = [Il]{Lemma}[I]{Lemma}
+ , portuguese = [O]{Lema}[Os]{Lema}
+ , brazilian = [O]{Lema}[Os]{Lema}
+ , spanish = [el]{Lema}[las]{Lema}
+ , schinese = {引理}{引理}
+ , tchinese = {引理}{引理}
+ , japanese = {補題}{補題}
+ , russian = {Лемма}{Лемма}
+ }
+ }
+
+\NameTheorem { notation }
+ {
+ , heading = {
+ , english = Notation
+ , french = Notation
+ , ngerman = Notation
+ , italian = Notazione
+ , portuguese = Notação
+ , brazilian = Notação
+ , spanish = Notación
+ , schinese = 记号
+ , tchinese = 記號
+ , japanese = 記法
+ , russian = Нотация
+ }
+ , crefname = {
+ , english = {Notation}{Notation}
+ , french = [la]{Notation}[les]{Notation}
+ , ngerman = {Notation}{Notation}
+ , italian = [la]{Notazione}[le]{Notazione}
+ , portuguese = [a]{Notação}[as]{Notação}
+ , brazilian = [a]{Notação}[as]{Notação}
+ , spanish = [la]{Notación}[las]{Notación}
+ , schinese = {记号}{记号}
+ , tchinese = {記號}{記號}
+ , japanese = {記法}{記法}
+ , russian = {Нотация}{Нотация}
+ }
+ , Crefname = {
+ , english = {Notation}{Notation}
+ , french = [La]{Notation}[Les]{Notation}
+ , ngerman = {Notation}{Notation}
+ , italian = [La]{Notazione}[Le]{Notazione}
+ , portuguese = [A]{Notação}[As]{Notação}
+ , brazilian = [A]{Notação}[As]{Notação}
+ , spanish = [La]{Notación}[Las]{Notación}
+ , schinese = {记号}{记号}
+ , tchinese = {記號}{記號}
+ , japanese = {記法}{記法}
+ , russian = {Нотация}{Нотация}
+ }
+ }
+
+\NameTheorem { observation }
+ {
+ , heading = {
+ , english = Observation
+ , french = Observation
+ , ngerman = Beobachtung
+ , italian = Osservazione
+ , portuguese = Observação
+ , brazilian = Observação
+ , spanish = Observación
+ , schinese = 观察
+ , tchinese = 觀察
+ , japanese = 観察
+ , russian = Наблюдение
+ }
+ , crefname = {
+ , english = {Observation}{Observation}
+ , french = [la]{Observation}[les]{Observation}
+ , ngerman = {Beobachtung}{Beobachtung}
+ , italian = [l']{Osservazione}[le]{Osservazione}
+ , portuguese = [a]{Observação}[as]{Observação}
+ , brazilian = [a]{Observação}[as]{Observação}
+ , spanish = [la]{Observación}[las]{Observación}
+ , schinese = {观察}{观察}
+ , tchinese = {觀察}{觀察}
+ , japanese = {観察}{観察}
+ , russian = {Наблюдение}{Наблюдение}
+ }
+ , Crefname = {
+ , english = {Observation}{Observation}
+ , french = [La]{Observation}[Les]{Observation}
+ , ngerman = {Beobachtung}{Beobachtung}
+ , italian = [L']{Osservazione}[Le]{Osservazione}
+ , portuguese = [A]{Observação}[As]{Observação}
+ , brazilian = [A]{Observação}[As]{Observação}
+ , spanish = [La]{Observación}[Las]{Observación}
+ , schinese = {观察}{观察}
+ , tchinese = {觀察}{觀察}
+ , japanese = {観察}{観察}
+ , russian = {Наблюдение}{Наблюдение}
+ }
+ }
+
+\NameTheorem { postulate }
+ {
+ , heading = {
+ , english = Postulate
+ , french = Postulat
+ , ngerman = Postulat
+ , italian = Postulato
+ , portuguese = Postulado
+ , brazilian = Postulado
+ , spanish = Postulado
+ , schinese = 公设
+ , tchinese = 公設
+ , japanese = 公準
+ , russian = Постулат
+ }
+ , crefname = {
+ , english = {Postulate}{Postulate}
+ , french = [le]{Postulat}[les]{Postulat}
+ , ngerman = {Postulat}{Postulat}
+ , italian = [il]{Postulato}[i]{Postulato}
+ , portuguese = [o]{Postulado}[os]{Postulado}
+ , brazilian = [o]{Postulado}[os]{Postulado}
+ , spanish = [el]{Postulado}[los]{Postulado}
+ , schinese = {公设}{公设}
+ , tchinese = {公設}{公設}
+ , japanese = {公準}{公準}
+ , russian = {Постулат}{Постулат}
+ }
+ , Crefname = {
+ , english = {Postulate}{Postulate}
+ , french = [Le]{Postulat}[Les]{Postulat}
+ , ngerman = {Postulat}{Postulat}
+ , italian = [Il]{Postulato}[I]{Postulato}
+ , portuguese = [O]{Postulado}[Os]{Postulado}
+ , brazilian = [O]{Postulado}[Os]{Postulado}
+ , spanish = [El]{Postulado}[Los]{Postulado}
+ , schinese = {公设}{公设}
+ , tchinese = {公設}{公設}
+ , japanese = {公準}{公準}
+ , russian = {Постулат}{Постулат}
+ }
+ }
+
+\NameTheorem { problem }
+ {
+ , heading = {
+ , english = Problem
+ , french = Problème
+ , ngerman = Problem
+ , italian = Problema
+ , portuguese = Problema
+ , brazilian = Problema
+ , spanish = Problema
+ , schinese = 问题
+ , tchinese = 問題
+ , japanese = 問題
+ , russian = Проблема
+ }
+ , crefname = {
+ , english = {Problem}{Problem}
+ , french = [le]{Problème}[les]{Problème}
+ , ngerman = {Problem}{Problem}
+ , italian = [il]{Problema}[i]{Problema}
+ , portuguese = [o]{Problema}[os]{Problema}
+ , brazilian = [o]{Problema}[os]{Problema}
+ , spanish = [el]{Problema}[los]{Problema}
+ , schinese = {问题}{问题}
+ , tchinese = {問題}{問題}
+ , japanese = {問題}{問題}
+ , russian = {Проблема}{Проблема}
+ }
+ , Crefname = {
+ , english = {Problem}{Problem}
+ , french = [Le]{Problème}[Les]{Problème}
+ , ngerman = {Problem}{Problem}
+ , italian = [Il]{Problema}[I]{Problema}
+ , portuguese = [O]{Problema}[Os]{Problema}
+ , brazilian = [O]{Problema}[Os]{Problema}
+ , spanish = [El]{Problema}[Los]{Problema}
+ , schinese = {问题}{问题}
+ , tchinese = {問題}{問題}
+ , japanese = {問題}{問題}
+ , russian = {Проблема}{Проблема}
+ }
+ }
+
+\NameTheorem { property }
+ {
+ , heading = {
+ , english = Property
+ , french = Propriété
+ , ngerman = Eigenschaft
+ , italian = Proprietà
+ , portuguese = Propriedade
+ , brazilian = Propriedade
+ , spanish = Propiedad
+ , schinese = 性质
+ , tchinese = 性質
+ , japanese = 性質
+ , russian = Имущество
+ }
+ , crefname = {
+ , english = {Property}{Property}
+ , french = [la]{Propriété}[les]{Propriété}
+ , ngerman = {Eigenschaft}{Eigenschaft}
+ , italian = [la]{Proprietà}[le]{Proprietà}
+ , portuguese = [a]{Propriedade}[as]{Propriedade}
+ , brazilian = [a]{Propriedade}[as]{Propriedade}
+ , spanish = [la]{Propiedad}[las]{Propiedad}
+ , schinese = {性质}{性质}
+ , tchinese = {性質}{性質}
+ , japanese = {性質}{性質}
+ , russian = {Имущество}{Имущество}
+ }
+ , Crefname = {
+ , english = {Property}{Property}
+ , french = [La]{Propriété}[Les]{Propriété}
+ , ngerman = {Eigenschaft}{Eigenschaft}
+ , italian = [La]{Proprietà}[Le]{Proprietà}
+ , portuguese = [A]{Propriedade}[As]{Propriedade}
+ , brazilian = [A]{Propriedade}[As]{Propriedade}
+ , spanish = [La]{Propiedad}[Las]{Propiedad}
+ , schinese = {性质}{性质}
+ , tchinese = {性質}{性質}
+ , japanese = {性質}{性質}
+ , russian = {Имущество}{Имущество}
+ }
+ }
+
+\NameTheorem { proposition }
+ {
+ , heading = {
+ , english = Proposition
+ , french = Proposition
+ , ngerman = Proposition
+ , italian = Proposizione
+ , portuguese = Proposição
+ , brazilian = Proposição
+ , spanish = Proposición
+ , schinese = 命题
+ , tchinese = 命題
+ , japanese = 命題
+ , russian = Предложение
+ }
+ , crefname = {
+ , english = {Proposition}{Proposition}
+ , french = [la]{Proposition}[les]{Proposition}
+ , ngerman = {Proposition}{Proposition}
+ , italian = [la]{Proposizione}[le]{Proposizione}
+ , portuguese = [a]{Proposição}[as]{Proposição}
+ , brazilian = [a]{Proposição}[as]{Proposição}
+ , spanish = [la]{Proposición}[las]{Proposición}
+ , schinese = {命题}{命题}
+ , tchinese = {命題}{命題}
+ , japanese = {命題}{命題}
+ , russian = {Предложение}{Предложение}
+ }
+ , Crefname = {
+ , english = {Proposition}{Proposition}
+ , french = [La]{Proposition}[Les]{Proposition}
+ , ngerman = {Proposition}{Proposition}
+ , italian = [La]{Proposizione}[Le]{Proposizione}
+ , portuguese = [A]{Proposição}[As]{Proposição}
+ , brazilian = [A]{Proposição}[As]{Proposição}
+ , spanish = [La]{Proposición}[Las]{Proposición}
+ , schinese = {命题}{命题}
+ , tchinese = {命題}{命題}
+ , japanese = {命題}{命題}
+ , russian = {Предложение}{Предложение}
+ }
+ }
+
+\NameTheorem { question }
+ {
+ , heading = {
+ , english = Question
+ , french = Question
+ , ngerman = Frage
+ , italian = Domanda
+ , portuguese = Pergunta
+ , brazilian = Pergunta
+ , spanish = Pregunta
+ , schinese = 问题
+ , tchinese = 問題
+ , japanese = 問題
+ , russian = Вопрос
+ }
+ , crefname = {
+ , english = {Question}{Question}
+ , french = [la]{Question}[les]{Question}
+ , ngerman = {Frage}{Frage}
+ , italian = [la]{Domanda}[le]{Domanda}
+ , portuguese = [a]{Pergunta}[as]{Pergunta}
+ , brazilian = [a]{Pergunta}[as]{Pergunta}
+ , spanish = [la]{Pregunta}[las]{Pregunta}
+ , schinese = {问题}{问题}
+ , tchinese = {問題}{問題}
+ , japanese = {問題}{問題}
+ , russian = {Вопрос}{Вопрос}
+ }
+ , Crefname = {
+ , english = {Question}{Question}
+ , french = [La]{Question}[Les]{Question}
+ , ngerman = {Frage}{Frage}
+ , italian = [La]{Domanda}[Le]{Domanda}
+ , portuguese = [A]{Pergunta}[As]{Pergunta}
+ , brazilian = [A]{Pergunta}[As]{Pergunta}
+ , spanish = [La]{Pregunta}[Las]{Pregunta}
+ , schinese = {问题}{问题}
+ , tchinese = {問題}{問題}
+ , japanese = {問題}{問題}
+ , russian = {Вопрос}{Вопрос}
+ }
+ }
+
+\NameTheorem { remark }
+ {
+ , heading = {
+ , english = Remark
+ , french = Remarque
+ , ngerman = Bemerkung
+ , italian = Commento
+ , portuguese = Comentário
+ , brazilian = Comentário
+ , spanish = Comentario
+ , schinese = 备注
+ , tchinese = 備註
+ , japanese = 注釈
+ , russian = Замечание
+ }
+ , crefname = {
+ , english = {Remark}{Remark}
+ , french = [la]{Remarque}[les]{Remarque}
+ , ngerman = {Bemerkung}{Bemerkung}
+ , italian = [il]{Commento}[i]{Commento}
+ , portuguese = [o]{Comentário}[os]{Comentário}
+ , brazilian = [o]{Comentário}[os]{Comentário}
+ , spanish = [el]{Comentario}[los]{Comentario}
+ , schinese = {备注}{备注}
+ , tchinese = {備註}{備註}
+ , japanese = {注釈}{注釈}
+ , russian = {Замечание}{Замечание}
+ }
+ , Crefname = {
+ , english = {Remark}{Remark}
+ , french = [La]{Remarque}[Les]{Remarque}
+ , ngerman = {Bemerkung}{Bemerkung}
+ , italian = [Il]{Commento}[I]{Commento}
+ , portuguese = [O]{Comentário}[Os]{Comentário}
+ , brazilian = [O]{Comentário}[Os]{Comentário}
+ , spanish = [El]{Comentario}[Los]{Comentario}
+ , schinese = {备注}{备注}
+ , tchinese = {備註}{備註}
+ , japanese = {注釈}{注釈}
+ , russian = {Замечание}{Замечание}
+ }
+ }
+
+\NameTheorem { theorem }
+ {
+ , heading = {
+ , english = Theorem
+ , french = Théorème
+ , ngerman = Satz
+ , italian = Teorema
+ , portuguese = Teorema
+ , brazilian = Teorema
+ , spanish = Teorema
+ , schinese = 定理
+ , tchinese = 定理
+ , japanese = 定理
+ , russian = Теорема
+ }
+ , crefname = {
+ , english = {Theorem}{Theorem}
+ , french = [le]{Théorème}[les]{Théorème}
+ , ngerman = {Satz}{Satz}
+ , italian = [il]{Teorema}[i]{Teorema}
+ , portuguese = [o]{Teorema}[os]{Teorema}
+ , brazilian = [o]{Teorema}[os]{Teorema}
+ , spanish = [el]{Teorema}[los]{Teorema}
+ , schinese = {定理}{定理}
+ , tchinese = {定理}{定理}
+ , japanese = {定理}{定理}
+ , russian = {Теорема}{Теорема}
+ }
+ , Crefname = {
+ , english = {Theorem}{Theorem}
+ , french = [Le]{Théorème}[Les]{Théorème}
+ , ngerman = {Satz}{Satz}
+ , italian = [Il]{Teorema}[I]{Teorema}
+ , portuguese = [O]{Teorema}[Os]{Teorema}
+ , brazilian = [O]{Teorema}[Os]{Teorema}
+ , spanish = [El]{Teorema}[Los]{Teorema}
+ , schinese = {定理}{定理}
+ , tchinese = {定理}{定理}
+ , japanese = {定理}{定理}
+ , russian = {Теорема}{Теорема}
+ }
+ }
+
+\NameTheorem { definition-proposition }
+ {
+ , heading = {
+ , english = Definition-Proposition
+ , french = Définition-Proposition
+ , ngerman = Definition-Proposition
+ , italian = Definizione-Proposizione
+ , portuguese = Definição-Proposição
+ , brazilian = Definição-Proposição
+ , spanish = Definición-Proposición
+ , schinese = 定义-命题
+ , tchinese = 定義-命題
+ , japanese = 定義-命題
+ , russian = Определение-Предложение
+ }
+ , crefname = {
+ , english = {Definition-Proposition}{Definition-Proposition}
+ , french = [la]{Définition-Proposition}[les]{Définition-Proposition}
+ , ngerman = {Definition-Proposition}{Definition-Proposition}
+ , italian = [la]{Definizione-Proposizione}[le]{Definizione-Proposizione}
+ , portuguese = [a]{Definição-Proposição}[as]{Definição-Proposição}
+ , brazilian = [a]{Definição-Proposição}[as]{Definição-Proposição}
+ , spanish = [la]{Definición-Proposición}[las]{Definición-Proposición}
+ , schinese = {定义-命题}{定义-命题}
+ , tchinese = {定義-命題}{定義-命題}
+ , japanese = {定義-命題}{定義-命題}
+ , russian = {Определение-Предложение}{Определение-Предложение}
+ }
+ , Crefname = {
+ , english = {Definition-Proposition}{Definition-Proposition}
+ , french = [La]{Définition-Proposition}[Les]{Définition-Proposition}
+ , ngerman = {Definition-Proposition}{Definition-Proposition}
+ , italian = [La]{Definizione-Proposizione}[Le]{Definizione-Proposizione}
+ , portuguese = [A]{Definição-Proposição}[As]{Definição-Proposição}
+ , brazilian = [A]{Definição-Proposição}[As]{Definição-Proposição}
+ , spanish = [La]{Definición-Proposición}[Las]{Definición-Proposición}
+ , schinese = {定义-命题}{定义-命题}
+ , tchinese = {定義-命題}{定義-命題}
+ , japanese = {定義-命題}{定義-命題}
+ , russian = {Определение-Предложение}{Определение-Предложение}
+ }
+ }
+
+\NameTheorem { definition-theorem }
+ {
+ , heading = {
+ , english = Definition-Theorem
+ , french = Définition-Théorème
+ , ngerman = Definition-Satz
+ , italian = Definizione-Teorema
+ , portuguese = Definição-Teorema
+ , brazilian = Definição-Teorema
+ , spanish = Definición-Teorema
+ , schinese = 定义-定理
+ , tchinese = 定義-定理
+ , japanese = 定義-定理
+ , russian = Определение-Теорема
+ }
+ , crefname = {
+ , english = {Definition-Theorem}{Definition-Theorem}
+ , french = [la]{Définition-Théorème}[les]{Définition-Théorème}
+ , ngerman = {Definition-Satz}{Definition-Satz}
+ , italian = [la]{Definizione-Teorema}[le]{Definizione-Teorema}
+ , portuguese = [a]{Definição-Teorema}[as]{Definição-Teorema}
+ , brazilian = [a]{Definição-Teorema}[as]{Definição-Teorema}
+ , spanish = [la]{Definición-Teorema}[las]{Definición-Teorema}
+ , schinese = {定义-定理}{定义-定理}
+ , tchinese = {定義-定理}{定義-定理}
+ , japanese = {定義-定理}{定義-定理}
+ , russian = {Определение-Теорема}{Определение-Теорема}
+ }
+ , Crefname = {
+ , english = {Definition-Theorem}{Definition-Theorem}
+ , french = [La]{Définition-Théorème}[Les]{Définition-Théorème}
+ , ngerman = {Definition-Satz}{Definition-Satz}
+ , italian = [La]{Definizione-Teorema}[Le]{Definizione-Teorema}
+ , portuguese = [A]{Definição-Teorema}[As]{Definição-Teorema}
+ , brazilian = [A]{Definição-Teorema}[As]{Definição-Teorema}
+ , spanish = [La]{Definición-Teorema}[Las]{Definición-Teorema}
+ , schinese = {定义-定理}{定义-定理}
+ , tchinese = {定義-定理}{定義-定理}
+ , japanese = {定義-定理}{定義-定理}
+ , russian = {Определение-Теорема}{Определение-Теорема}
+ }
+ }
+%</projlib-theorem>
+
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/projlib/ProjLib.ins b/Master/texmf-dist/source/latex/projlib/ProjLib.ins
new file mode 100644
index 00000000000..ca73cff4465
--- /dev/null
+++ b/Master/texmf-dist/source/latex/projlib/ProjLib.ins
@@ -0,0 +1,74 @@
+%%
+%% Copyright (C) 2021-2022 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
+%%
+
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+
+\begingroup
+\catcode`\^^M=\active%
+\obeyspaces%
+\gdef\copyright{%
+\ds@heading% This is file... generated with the docstrip utility.
+
+Copyright (C) 2021-2022 by Jinwen XU
+
+This is part of the ProjLib Toolkit.
+}%
+\gdef\lppllicense{%
+
+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.
+}%
+\endgroup
+
+\def\mypreamble{\copyright\lppllicense}
+\usepreamble\mypreamble
+
+\generate{\file{ProjLib.sty}{\from{ProjLib.dtx}{ProjLib}}}
+\generate{\file{projlib-author.sty}{\from{ProjLib.dtx}{projlib-author}}}
+\generate{\file{projlib-datetime.sty}{\from{ProjLib.dtx}{projlib-datetime}}}
+\generate{\file{projlib-draft.sty}{\from{ProjLib.dtx}{projlib-draft}}}
+\generate{\file{projlib-font.sty}{\from{ProjLib.dtx}{projlib-font}}}
+\generate{\file{projlib-language.sty}{\from{ProjLib.dtx}{projlib-language}}}
+\generate{\file{projlib-logo.sty}{\from{ProjLib.dtx}{projlib-logo}}}
+\generate{\file{projlib-math.sty}{\from{ProjLib.dtx}{projlib-math}}}
+\generate{\file{projlib-paper.sty}{\from{ProjLib.dtx}{projlib-paper}}}
+\generate{\file{projlib-theorem.sty}{\from{ProjLib.dtx}{projlib-theorem}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* files into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* ProjLib.sty *}
+\Msg{* projlib-author.sty *}
+\Msg{* projlib-datetime.sty *}
+\Msg{* projlib-draft.sty *}
+\Msg{* projlib-font.sty *}
+\Msg{* projlib-language.sty *}
+\Msg{* projlib-logo.sty *}
+\Msg{* projlib-math.sty *}
+\Msg{* projlib-paper.sty *}
+\Msg{* projlib-theorem.sty *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile