% \iffalse meta-comment
%
% Copyright (C) 2021-2024 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}[2022-06-01]
%
%<*ProjLib>
\ProvidesExplPackage
  {ProjLib}
  {2024/03/01} {}
  {Collective interface of the ProjLib toolkit}
%</ProjLib>
%
%<*projlib-author>
\ProvidesExplPackage
  {projlib-author}
  {2024/03/01} {}
  {Enhanced author information block}
%</projlib-author>
%
%<*projlib-datetime>
\ProvidesExplPackage
  {projlib-datetime}
  {2024/03/01} {}
  {Convert numeric date-time string to natural language}
%</projlib-datetime>
%
%<*projlib-draft>
\ProvidesExplPackage
  {projlib-draft}
  {2024/03/01} {}
  {Useful commands during draft stage}
%</projlib-draft>
%
%<*projlib-font>
\ProvidesExplPackage
  {projlib-font}
  {2024/03/01} {}
  {Font selection and configuration}
%</projlib-font>
%
%<*projlib-language>
\ProvidesExplPackage
  {projlib-language}
  {2024/03/01} {}
  {Multi-language configuration}
%</projlib-language>
%
%<*projlib-logo>
\ProvidesExplPackage
  {projlib-logo}
  {2024/03/01} {}
  {The ProjLib logo}
%</projlib-logo>
%
%<*projlib-math>
\ProvidesExplPackage
  {projlib-math}
  {2024/03/01} {}
  {Efficient math setup}
%</projlib-math>
%
%<*projlib-paper>
\ProvidesExplPackage
  {projlib-paper}
  {2024/03/01} {}
  {Configuration of the paper style}
%</projlib-paper>
%
%<*projlib-text>
\ProvidesExplPackage
  {projlib-text}
  {2024/03/01} {}
  {Text-related commands}
%</projlib-text>
%
%<*projlib-theorem>
\ProvidesExplPackage
  {projlib-theorem}
  {2024/03/01} {}
  {Configuration of theorem-like environments}
%</projlib-theorem>
%
%<*projlib-titlepage>
\ProvidesExplPackage
  {projlib-titlepage}
  {2024/03/01} {}
  {Interface for title page rendering}
%</projlib-titlepage>

%<*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
    , AMS-fashion     .bool_set:N         = \l__projlib_main_amsfashion_bool
    , AMS~fashion     .bool_set:N         = \l__projlib_main_amsfashion_bool
    , AMS fashion     .bool_set:N         = \l__projlib_main_amsfashion_bool

    , title-page      .bool_set:N         = \l__projlib_main_titlepage_bool
    , title-page      .initial:n          = { false }
    , title~page      .bool_set:N         = \l__projlib_main_titlepage_bool
    , title page      .bool_set:N         = \l__projlib_main_titlepage_bool

    , unknown         .code:n             = {
                                              \PassOptionsToPackage { \CurrentOption } { projlib-author }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-datetime }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-draft }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-font }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-language }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-logo }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-math }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-paper }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-text }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-theorem }
                                              \PassOptionsToPackage { \CurrentOption } { projlib-titlepage }
                                            }
  }
\ProcessKeyOptions [ 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-text }

\bool_if:NT \l__projlib_main_titlepage_bool
  {
    \RequirePackage { projlib-titlepage }
  }

\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
    , AMS-fashion .bool_set:N = \l__projlib_author_amsfashion_bool
    , AMS~fashion .bool_set:N = \l__projlib_author_amsfashion_bool
    , AMS fashion .bool_set:N = \l__projlib_author_amsfashion_bool

    , unknown     .code:n     = {}
  }
\ProcessKeyOptions [ projlib-author ]

\cs_if_exist:NT \subjclass { \endinput }

\prg_new_conditional:Nnn \projlib_author_if_content_empty:n { T, F, TF }
  {
    \hbox_set:Nn \l_tmpa_box { #1 }
    \dim_compare:nNnTF { \box_wd:N \l_tmpa_box } > \c_zero_dim
      { \prg_return_false: }
      { \prg_return_true: }
  }

\tl_new:N   \g__projlib_author_font_author_tl
\tl_new:N   \g__projlib_author_font_date_tl
\tl_new:N   \g__projlib_author_font_institute_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_date_tl      { \normalsize \normalfont }
\tl_gset:Nn \g__projlib_author_font_institute_tl   { \small \normalfont }
\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_groupsep_dim
\dim_new:N  \g__projlib_author_innersep_dim
\dim_new:N  \g__projlib_author_affilsep_dim
\dim_new:N  \g__projlib_author_aftersep_dim
\dim_new:N  \g__projlib_author_emptysep_dim

\dim_set:Nn \g__projlib_author_groupsep_dim { 0.5 \baselineskip }
\dim_set:Nn \g__projlib_author_innersep_dim { .25 \baselineskip }
\dim_set:Nn \g__projlib_author_affilsep_dim {   0 \baselineskip }
\dim_set:Nn \g__projlib_author_aftersep_dim { .15 \baselineskip }
\dim_set:Nn \g__projlib_author_emptysep_dim { .15 \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 }
      {
        \bool_set_false:N \g__projlib_author_affil_already_exist_bool
        % If there is nothing before, the following line does nothing
        % If there is an affil before, this will backward one line
        \phantom {A} \\[-\baselineskip]
        \projlib_author_if_content_empty:nTF { #1 }
          {
            \skip_vertical:n { \g__projlib_author_emptysep_dim }
            \phantom {}
          }
          {
            \skip_vertical:n { \g__projlib_author_groupsep_dim }
            { \g__projlib_author_font_author_tl #1 }
            \\ \phantom {}
          }
      }
  }

\cs_new_protected:Nn \projlib_author_affil_generic:nn
  % #1 = the item
  % #2 = the text
  {
    \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
      {
        \phantom {A} \\[-\baselineskip]
        \bool_if:NTF \g__projlib_author_affil_already_exist_bool
          {
            \skip_vertical:n { \g__projlib_author_affilsep_dim }
          }
          {
            \skip_vertical:n { \g__projlib_author_innersep_dim }
          }
        { \use:c { g__projlib_author_font_ #1 _tl } #2 }
        \bool_set_true:N \g__projlib_author_affil_already_exist_bool
        \\ \phantom {}
      }
  }

\ProvideDocumentCommand \institute { m }
  {
    \projlib_author_affil_generic:nn { institute } { #1 }
  }

\ProvideDocumentCommand \address { m }
  {
    \projlib_author_affil_generic:nn { address } { #1 }
  }

\ProvideDocumentCommand \curraddr { m }
  {
    \projlib_author_affil_generic:nn { curraddr } { #1 }
  }

\ProvideDocumentCommand \email { m }
  {
    \projlib_author_affil_generic:nn { email } { #1 }
  }

\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_groupsep_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_aftersep_dim }
          }
      }
  }

\bool_if:NT \l__projlib_author_amsfashion_bool
  {
    \RequirePackage { projlib-language }

    \tl_const:Nn \c_projlib_author_dot_tl { . }

    \tl_new:N   \g_projlib_author_keywordsname_style_tl
    \tl_gset:Nn \g_projlib_author_keywordsname_style_tl { \itshape }

    \projlib_langauge_define_multilingual_text:Nn \keywordsname
      {
        EN = Key~words~and~phrases                  ,
        FR = Mots~et~phrases~cl��s                   ,
        DE = Schl��sselw��rter~und~Phrasen            ,
        IT = Parole~e~frasi~chiave                  ,
        PT = Palavras~e~frases~chave                ,
        BR = Palavras~e~frases~chave                ,
        ES = 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 }
      }


    \NewCommandCopy \projlib_author_backup_footnotemark: \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_width_of_asterisk_dim { \box_wd:N \l_tmpa_box }

    \cs_new_nopar:Nn \projlib_author_pre_thanks:n
      {
        \tl_set:Nn \footnotemark {}
        \projlib_author_backup_thanks:w
          {
            \skip_horizontal:n { - \c__projlib_author_width_of_asterisk_dim }
            #1
          }
        \RenewCommandCopy \footnotemark \projlib_author_backup_footnotemark:
      }

    \NewDocumentCommand \thanks { m }
      {
        \tl_if_blank:nF { #1 }
          {
            \hook_gput_code:nnn { cmd/@title/after } { projlib-author }
              {
                \projlib_author_pre_thanks:n { #1 }
              }
          }
      }

    \hook_gput_code:nnn { begindocument/before } { projlib-author }
      {
        \NewCommandCopy \projlib_author_backup_my_author:w \author
        \RenewDocumentCommand \author { m }
          {
            \projlib_author_backup_my_author:w
              {
                \RenewCommandCopy \thanks \projlib_author_backup_thanks:w
                #1
              }
          }
      }

    \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

    \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
          {
            \group_begin:
            \projlib_author_backup_abstract:
              \getstored{projlib-author-abstract}
            \projlib_author_backup_endabstract:
            \group_end:
          }
          {
            \bool_gset_true:N \g__projlib_author_abstract_before_maketitle_bool
          }
      }

    \hook_gput_code:nnn { begindocument/before } { projlib-author }
      {
        \makeatletter
        \xpatchcmd { \@maketitle } { \@date }
          {
            \projlib_author_if_content_empty:nTF { \@date } { \skip_vertical:n { -2 \baselineskip } } { \g__projlib_author_font_date_tl \@date }
            \projlib_author_if_content_empty:nF { \g__projlib_author_dedicatory_tl }
              {
                \projlib_author_if_content_empty:nT { \@date } { \skip_vertical:n { 2 \baselineskip } }
                \par
                \skip_vertical:n { -\parskip }
                \skip_vertical:n { \baselineskip }
                \textit{ \g__projlib_author_dedicatory_tl }
                \projlib_author_if_content_empty:nT { \@date }
                  {
                    \skip_vertical:n { -\parskip }
                    \skip_vertical:n { \dim_eval:n { -1.7 \baselineskip } }
                  }
              }
          } {} {}
        \makeatother

        \hook_gput_code:nnn { cmd/maketitle/before } { projlib-author }
          {
            \projlib_author_if_content_empty:nF { \g__projlib_author_keywords_tl }
              {
                \projlib_author_pre_thanks:n
                  {
                    \group_begin:
                      \g_projlib_author_keywordsname_style_tl
                      \keywordsname \c_projlib_author_dot_tl
                    \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
              {
                \group_begin:
                \projlib_author_backup_abstract:
                  \getstored{projlib-author-abstract}
                \projlib_author_backup_endabstract:
                \group_end:
              }
            \cs_undefine:N \institute
            \cs_undefine:N \address
            \cs_undefine:N \curraddr
            \cs_undefine:N \email
            \cs_undefine:N \dedicatory
            \cs_undefine:N \keywords
            % \cs_undefine:N \footnotemark
            % \NewCommandCopy \footnotemark \projlib_author_backup_footnotemark:
            \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 \c_projlib_author_dot_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       = {}
  }
\ProcessKeyOptions [ projlib-datetime ]

\RequirePackage { relsize }

\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~year~month .meta:n       = { only-year-month }
    , only year month .meta:n       = { only-year-month }
    , only-month-day  .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-month-day } }
    , only~month~day  .meta:n       = { only-month-day }
    , only month day  .meta:n       = { only-month-day }
    , only-year       .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-year } }
    , only~year       .meta:n       = { only-year }
    , only year       .meta:n       = { only-year }
    , only-month      .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-month } }
    , only~month      .meta:n       = { only-month }
    , only month      .meta:n       = { only-month }
    , only-day        .code:n       = { \tl_set:Nn \l__projlib_datetime_output_format_tl { only-day } }
    , only~day        .meta:n       = { only-day }
    , only day        .meta:n       = { 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 }
  {
    \tl_set:Nn \l_tmpa_tl { \exp_args:Ne \tl_trim_spaces:n { #1 } }
    \exp_args:Ne \projlib_datetime_set_input_format:n { \l_tmpa_tl }
  }
\ProvideDocumentCommand \SetDatetimeInputFormat {} { \ProjLibSetDatetimeInputFormat }


\seq_new:N \l__projlib_datetime_date_seq

\cs_new_protected:Nn \projlib_datetime_text_superscript:n
  {
    \group_begin:
      \smaller
      \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_year_month_day #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_year_month_day #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_generate_variant:Nn \__projlib_datetime_date_parse_year_month_day:n { e }

\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_generate_variant:Nn \__projlib_datetime_date_parse_month_day_year:n { e }

\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_generate_variant:Nn \__projlib_datetime_date_parse_day_month_year:n { e }

\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
  {
    \tl_set:Nx \l_tmpa_tl { #1 }
    \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
    \cs_if_exist_use:c { __projlib_datetime_date_parse_ \__projlib_datetime_input_format_to_str: :e } { \l_tmpa_tl }
    \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:oF { #1 } { \keys_set:nn { projlib-datetime-command } { #1 } }
      \tl_if_blank:oF { #3 } { \keys_set:nn { projlib-datetime-command } { #3 } }
      \tl_set:Nx \l_tmpa_tl { \exp_args:Ne \tl_trim_spaces:n { #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:oF { #1 } { \keys_set:nn { projlib-datetime-command } { #1 } }
      \tl_if_blank:oF { #3 } { \keys_set:nn { projlib-datetime-command } { #3 } }
      \tl_set:Nx \l_tmpa_tl { \exp_args:Ne \tl_trim_spaces:n { #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
  {
    \tl_set:Nx \l_tmpa_tl { #1 }
    \regex_replace_all:nnN { \D } { - } \l_tmpa_tl
    \cs_if_exist_use:c { __projlib_datetime_date_parse_ \__projlib_datetime_input_format_to_str: :e } { \l_tmpa_tl }
    \__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
    , no-report-page    .bool_set:N   = \l__projlib_draft_no_report_page_bool
    , no-report-page    .initial:n    = { false }
    , no~report~page    .bool_set:N   = \l__projlib_draft_no_report_page_bool
    , no report page    .bool_set:N   = \l__projlib_draft_no_report_page_bool
    , unknown           .code:n       = {}
  }
\ProcessKeyOptions [ projlib-draft ]

\RequirePackage { projlib-language }
\RequirePackage { xcolor }
\PassOptionsToPackage { normalem } { ulem }
\RequirePackage { ulem }

\cs_new_protected:Nn \projlib_draft_plain_box_lines:n
  {
    \bgroup\markoverwith{
      \rule[-0.6ex]{1pt}{1.25pt}
      \skip_horizontal:n { -1pt }
      \rule[1.8ex]{1pt}{1.25pt}
      \skip_horizontal:n { -.1pt }
    }\ULon { #1 }
  }

\bool_if:NTF \l__projlib_draft_fast_bool
  {
    \tl_const:Nn \l_projlib_draft_plain_box_begin_tl { [ }
    \tl_const:Nn \l_projlib_draft_plain_box_after_tl { ] }
  }
  {
    \RequirePackage { tikz }
    \tl_const:Nn \l_projlib_draft_plain_box_begin_tl
      {
        \tikz[line~width=1.25pt,baseline=-.625pt]
          \draw (1ex,-.6ex) -- (.5ex,-.6ex)
                (0,-.1ex) arc [start~angle=180, end~angle=270, radius=.5ex]
                (0,-.1ex) -- (0,1.3ex)
                (0,1.3ex) arc [start~angle=180, end~angle=90, radius=.5ex]
                (0.5ex,1.8ex) -- (1ex,1.8ex);
      }
    \tl_const:Nn \l_projlib_draft_plain_box_after_tl
      {
        \tikz[line~width=1.25pt,baseline=-.625pt]
          \draw (-1ex,-.6ex) -- (-.5ex,-.6ex)
                (0,-.1ex) arc [start~angle=0, end~angle=-90, radius=.5ex]
                (0,-.1ex) -- (0,1.3ex)
                (0,1.3ex) arc [start~angle=0, end~angle=90, radius=.5ex]
                (-0.5ex,1.8ex) -- (-1ex,1.8ex);
      }
  }

\cs_new_protected:Nn \projlib_draft_plain_box:nn
  {
    \group_begin:
      \color{ #1 }
      \l_projlib_draft_plain_box_begin_tl
      \nobreak
      \hspace{-.5ex}
      \nobreak
      \projlib_draft_plain_box_lines:n { #2 }
      \nobreak
      \hspace{-.5ex}
      \nobreak
      \l_projlib_draft_plain_box_after_tl
    \group_end:
  }


\projlib_langauge_define_multilingual_text:Nn \projlib_draft_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 = A��n ~ por ~ completar  ,
    CN = ������������������           ,
    TC = ������������������           ,
    JP = ������������������           ,
    RU = ���� ~ ����������������          ,
  }

\projlib_langauge_define_multilingual_text:Nn \projlib_draft_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    { projlib_draft_DNF_font }
\tl_gset:cn  { projlib_draft_DNF_font }        { \small \normalfont \bfseries }

\definecolor { projlib_draft_DNF_color }       { RGB } {  21, 122,  20 }

\newcounter  { projlib_draft_DNF_counter }

\tl_new:N \g__projlib_draft_DNF_report_tl

\NewDocumentCommand \DNF { s D<>{} }
  {
    \noindent
    \group_begin: \projlib_draft_DNF_font
      \stepcounter { projlib_draft_DNF_counter }
      \raisebox{\baselineskip}{
        \cs_if_exist:cT { hypertarget }
          {
            \hypertarget { DNF. \jobname. \arabic { projlib_draft_DNF_counter } } {}
          }
        \label { DNF. \jobname. \arabic { projlib_draft_DNF_counter } }
      }
      \nobreak
      \projlib_draft_plain_box:nn { projlib_draft_DNF_color }
        {
          \IfBooleanF { #1 } { \projlib_draft_DNF_text \nobreakspace }
          \texttt { \# \theprojlib_draft_DNF_counter }
          \tl_if_blank:nF { #2 } { : \nobreakspace }
          \tl_trim_spaces:n { #2 }
        }
    \group_end:
    \tl_gput_right:Nn \g__projlib_draft_DNF_report_tl
      {
        \setlength { \parfillskip } { 0pt plus 1fil }
        \noindent
        \group_begin: \ttfamily
        \# \,
      }
    \tl_gput_right:Nx \g__projlib_draft_DNF_report_tl
      {
        \int_value:w \theprojlib_draft_DNF_counter
      }
    \tl_gput_right:Nn \g__projlib_draft_DNF_report_tl
      {
        \group_end:
        \c_space_tl \c_space_tl
        $\langle$
        \skip_horizontal:n { 0.1em }
      }
    \tl_gput_right:Nx \g__projlib_draft_DNF_report_tl
      {
        \group_begin:
        \exp_not:N \normalfont
        \cs_if_exist:cTF { hyperlink }
          {
            \exp_not:N \hyperlink { DNF. \jobname. \int_value:w \theprojlib_draft_DNF_counter } { \exp_not:N \pageref* { DNF. \jobname. \int_value:w \theprojlib_draft_DNF_counter } }
          }
          {
            \exp_not:N \pageref* { DNF. \jobname. \int_value:w \theprojlib_draft_DNF_counter }
          }
        \group_end:
      }
    \tl_gput_right:Nn \g__projlib_draft_DNF_report_tl
      {
        \skip_horizontal:n { 0.1em }
        $\rangle$
        \nobreakspace
        \tl_if_blank:nF { #2 } { : ~ }
        \tl_trim_spaces:n { #2 }
        \par \skip_vertical:n { -\parskip }
        \skip_vertical:n { .15\baselineskip }
      }
  }

\bool_if:NF \l__projlib_draft_no_report_page_bool
  {
    \hook_gput_code:nnn { begindocument/before } { projlib-draft }
      {
        \hook_gput_code:nnn { enddocument } { projlib-draft }
          {
            \tl_if_blank:VF \g__projlib_draft_DNF_report_tl
              {
                \clearpage
                \addtocounter{page}{-1}
                \pagestyle { empty }
                \color { projlib_draft_DNF_color }
                \noindent
                \projlib_draft_DNF_font
                \projlib_draft_DNF_report_text
                \par \bigskip
                \g__projlib_draft_DNF_report_tl
              }
          }
      }
  }


\projlib_langauge_define_multilingual_text:Nn \projlib_draft_blind_text_tl
  {
    , EN = {
              Hello,~here~is~some~text~without~a~meaning.~This~text~should~show~what~a~printed~text~will~look~like~at~this~place.~If~you~read~this~text,~you~will~get~no~information.~Really?~Is~there~no~information?~Is~there~a~difference~between~this~text~and~some~nonsense~like~\textquote{Huardest~gefburn}?~Not~at~all!~A~blind~text~like~this~gives~you~information~about~the~selected~font,~how~the~letters~are~written~and~an~impression~of~the~look.~This~text~should~contain~all~letters~of~the~alphabet~and~it~should~be~written~in~of~the~original~language.~There~is~no~need~for~special~content,~but~the~length~of~words~should~match~the~language.
           }
    , FR = {
              Bonjour,~voici~un~texte~sans~signification.~Ce~texte~doit~montrer~��~quoi~ressemble~un~texte~imprim��~��~cet~endroit.~Si~vous~lisez~ce~texte,~vous~n'obtiendrez~aucune~information.~Vraiment~?~Il~n'y~a~aucune~information~?~Y~a-t-il~une~diff��rence~entre~ce~texte~et~une~absurdit��~comme~\textquote{Huardest~gefburn}~?~Pas~du~tout~!~Un~texte~aveugle~comme~celui-ci~vous~donne~des~informations~sur~la~police~choisie,~la~fa��on~dont~les~lettres~sont~��crites~et~une~impression~de~l'apparence.~Ce~texte~doit~contenir~toutes~les~lettres~de~l'alphabet~et~��tre~��crit~dans~la~langue~d'origine.~Il~n'est~pas~n��cessaire~de~pr��voir~un~contenu~sp��cial,~mais~la~longueur~des~mots~doit~correspondre~��~la~langue.
           }
    , DE = {
              Hallo,~hier~ist~ein~Text~ohne~Bedeutung.~Dieser~Text~soll~zeigen,~wie~ein~gedruckter~Text~an~dieser~Stelle~aussehen~wird.~Wenn~Sie~diesen~Text~lesen,~werden~Sie~keine~Informationen~erhalten.~Wirklich?~Gibt~es~keine~Informationen?~Gibt~es~einen~Unterschied~zwischen~diesem~Text~und~irgendeinem~Bl��dsinn~wie~\textquote{Huardest~gefburn}?~Ganz~und~gar~nicht!~Ein~solcher~Blindtext~gibt~Ihnen~Informationen~��ber~die~gew��hlte~Schriftart,~wie~die~Buchstaben~geschrieben~sind~und~einen~Eindruck~vom~Aussehen.~Dieser~Text~sollte~alle~Buchstaben~des~Alphabets~enthalten~und~in~der~Originalsprache~geschrieben~sein.~Es~ist~kein~besonderer~Inhalt~erforderlich,~aber~die~L��nge~der~W��rter~sollte~der~Sprache~entsprechen.
           }
    , IT = {
              Ciao,~qui~c'��~un~drafto~senza~significato.~Questo~drafto~dovrebbe~mostrare~come~sar��~un~drafto~stampato~in~questo~posto.~Se~leggete~questo~drafto,~non~otterrete~alcuna~informazione.~Davvero?~Non~c'��~nessuna~informazione?~C'��~una~differenza~tra~questo~drafto~e~qualche~sciocchezza~come~\textquote{Huardest~gefburn}?~Niente~affatto!~Un~drafto~cieco~come~questo~ti~d��~informazioni~sul~font~selezionato,~su~come~sono~scritte~le~lettere~e~un'impressione~dell'aspetto.~Questo~drafto~dovrebbe~contenere~tutte~le~lettere~dell'alfabeto~e~dovrebbe~essere~scritto~nella~lingua~originale.~Non~c'��~bisogno~di~contenuti~speciali,~ma~la~lunghezza~delle~parole~dovrebbe~corrispondere~alla~lingua.
           }
    , PT = {
              Ol��,~aqui~est��~um~texto~sem~significado.~Este~texto~deve~mostrar~como~ser��~um~texto~impresso~neste~local.~Se~ler~este~texto,~n��o~obter��~qualquer~informa����o.~A~s��rio?~N��o~h��~informa����o?~H��~alguma~diferen��a~entre~este~texto~e~alguns~disparates~como~\textquote{Huardest~gefburn}?~De~modo~algum!~Um~texto~cego~como~este~d��-lhe~informa����es~sobre~a~fonte~seleccionada,~como~as~letras~s��o~escritas~e~uma~impress��o~do~aspecto.~Este~texto~deve~conter~todas~as~letras~do~alfabeto~e~deve~ser~escrito~na~l��ngua~original.~N��o~h��~necessidade~de~conte��do~especial,~mas~o~tamanho~das~palavras~deve~corresponder~��~l��ngua.
           }
    , BR = {
              Ol��,~aqui~est��~um~texto~sem~sentido.~Este~texto~deve~mostrar~como~ser��~um~texto~impresso~neste~lugar.~Se~voc��~ler~este~texto,~voc��~n��o~obter��~nenhuma~informa����o.~��~mesmo?~N��o~h��~nenhuma~informa����o?~H��~alguma~diferen��a~entre~este~texto~e~alguns~disparates~como~\textquote{Huardest~gefburn}?~De~jeito~nenhum!~Um~texto~cego~como~este~lhe~d��~informa����es~sobre~a~fonte~selecionada,~como~as~letras~s��o~escritas~e~uma~impress��o~da~apar��ncia.~Este~texto~deve~conter~todas~as~letras~do~alfabeto~e~deve~ser~escrito~no~idioma~original.~N��o~h��~necessidade~de~conte��do~especial,~mas~o~tamanho~das~palavras~deve~corresponder~ao~idioma.
           }
    , ES = {
              Hola,~aqu��~hay~un~texto~sin~significado.~Este~texto~debe~mostrar~c��mo~se~ver��~un~texto~impreso~en~este~lugar.~Si~lees~este~texto,~no~obtendr��s~ninguna~informaci��n.~��En~serio?~��No~hay~informaci��n?~��Hay~alguna~diferencia~entre~este~texto~y~alguna~tonter��a~como~\textquote{Huardest~gefburn}?~��Para~nada!~Un~texto~oculto~como~este~le~brinda~informaci��n~sobre~la~fuente~seleccionada,~c��mo~se~escriben~las~letras~y~una~impresi��n~de~la~apariencia.~Este~texto~debe~contener~todas~las~letras~del~alfabeto~y~debe~estar~escrito~en~el~idioma~original.~No~hay~necesidad~de~contenido~especial,~pero~la~longitud~de~las~palabras~debe~coincidir~con~el~idioma.
           }
    , CN = {
              ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\textquote{���������������������������������������������������������}������\textquote{���������������������������������������������������������������������������������������������������}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
           }
    , TC = {
              ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\textquote{���������������������������������������������������������}������\textquote{���������������������������������������������������������������������������������������������������}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
           }
    , JP = {
              ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\textquote{���������������������}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
           }
    , RU = {
              ������������������������,~������~����������-����~����������~������~������������.~��������~����������~������������~��������������������,~������~����������~������������������~����������������~����������~��~��������~����������.~��������~����~��������������������~��������~����������,~����~����~����������������~��������������~��������������������.~��������������������������?~������~��������������������?~��������~����~��������������~����������~��������~��������������~��~����������-����~��������������~����������~\textquote{������������������~��������������}?~������������������!~������������~����������,~����������������~����������,~��������~������~��������������������~��~������������������~������������,~��~������,~������~����������������~����������,~��~��~����������������������~����~����������������~��������.~��������~����������~������������~������������������~������~����������~����������������~��~������������~��������~��������������~����~����������~������������������.~��~����������������������~��������������������~������~��������������������������,~����~����������~��������~������������~������������������������������~����������.
           }
  }

\cs_new:Nn \projlib_draft_blind_text:n
  {
    \int_set:Nn \l_tmpa_int { #1 }
    \int_do_until:nNnn { \l_tmpa_int } = { 0 }
      {
        \projlib_draft_blind_text_tl
        \c_space_tl
        \int_add:Nn \l_tmpa_int { -1 }
      }
  }

\hook_gput_code:nnn { begindocument/before } { projlib-draft }
  {
    \ProvideDocumentCommand \blindtext { O{} }
      {
        \tl_if_blank:nTF { #1 }
          {
            \projlib_draft_blind_text_tl
          }
          {
            \projlib_draft_blind_text:n { #1 }
          }
      }
  }
%</projlib-draft>
%
%<*projlib-font>
\keys_define:nn { projlib-font }
  {
    , use-osf              .bool_set:N   = \l__projlib_font_useosf_bool
    , useosf              .initial:n    = { false }
    , use~osf              .bool_set:N   = \l__projlib_font_useosf_bool
    , use osf              .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
    , 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
    , old-style-figure    .bool_set:N   = \l__projlib_font_useosf_bool
    , old~style~figure    .bool_set:N   = \l__projlib_font_useosf_bool
    , old-style~figure    .bool_set:N   = \l__projlib_font_useosf_bool
    , old style~figure    .bool_set:N   = \l__projlib_font_useosf_bool
    , old style figure    .bool_set:N   = \l__projlib_font_useosf_bool
    , new-computer-modern .bool_set:N   = \l__projlib_font_newcomputermodern_bool
    , new-computer-modern .initial:n    = { false }
    , new~computer~modern .bool_set:N   = \l__projlib_font_newcomputermodern_bool
    , new computer modern .bool_set:N   = \l__projlib_font_newcomputermodern_bool
    , newcm               .bool_set:N   = \l__projlib_font_computermodern_bool
    , computer-modern     .bool_set:N   = \l__projlib_font_computermodern_bool
    , computer-modern     .initial:n    = { false }
    , computer~modern     .bool_set:N   = \l__projlib_font_computermodern_bool
    , computer modern     .bool_set:N   = \l__projlib_font_computermodern_bool
    , latin-modern        .initial:n    = { false }
    , latin-modern        .bool_set:N   = \l__projlib_font_latinmodern_bool
    , latin~modern        .bool_set:N   = \l__projlib_font_latinmodern_bool
    , latin modern        .bool_set:N   = \l__projlib_font_latinmodern_bool
    , lmodern             .bool_set:N   = \l__projlib_font_latinmodern_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 }
    , bembo               .bool_set:N   = \l__projlib_font_bembo_bool
    , bembo               .initial:n    = { false }
    , biolinum            .bool_set:N   = \l__projlib_font_biolinum_bool
    , biolinum            .initial:n    = { false }
    , noto                .bool_set:N   = \l__projlib_font_noto_bool
    , noto                .initial:n    = { false }
    , use-font            .meta:n       = { #1 }
    , use~font            .meta:n       = { #1 }
    , use font            .meta:n       = { #1 }
    , unknown             .code:n       = {}
  }
\ProcessKeyOptions [ projlib-font ]

\bool_new:N \g_projlib_font_already_set_bool
\bool_gset_false:N \g_projlib_font_already_set_bool

\RequirePackage { anyfontsize }
\RequirePackage { setspaceenhanced }

\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_newcomputermodern_bool
  {
    \RequirePackage [default] { fontsetup }
    \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_computermodern_bool
  {
    \RequirePackage [olddefault] { fontsetup }
    \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_latinmodern_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
  {
    \RequirePackage { mathpazo }
    \PassOptionsToPackage { defaultsups } { newpxtext }
    \PassOptionsToPackage { no-math } { fontspec }
    \hook_gput_code:nnn { begindocument/before } { projlib-font }
      {
        \bool_if:NT \l__projlib_font_useosf_bool
          {
            \PassOptionsToPackage { osf } { newpxtext }
          }
        \RequirePackage { newpxtext }
        \sys_if_engine_pdftex:F
          {
            \setsansfont { texgyreheros }
              [
                Scale          = MatchUppercase ,
                UprightFont    = *-regular ,
                BoldFont       = *-bold ,
                ItalicFont     = *-italic ,
                BoldItalicFont = *-bolditalic ,
              ]
          }
      }
    \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
  {
    \PassOptionsToPackage { no-math } { fontspec }
    \hook_gput_code:nnn { begindocument/before } { projlib-font }
      {
        \sys_if_engine_pdftex:TF
          {
            \bool_if:NT \l__projlib_font_useosf_bool
              {
                \PassOptionsToPackage { osf } { newtxtext }
              }
            \PassOptionsToPackage { defaultsups } { newtxtext }
            \RequirePackage { newtxtext }
            \RequirePackage { newtxmath }
          }
          {
            \RequirePackage { fontspec }
            \setmainfont { texgyretermes }
              [
                Scale          = MatchUppercase ,
                UprightFont    = *-regular ,
                BoldFont       = *-bold ,
                ItalicFont     = *-italic ,
                BoldItalicFont = *-bolditalic ,
              ]
            \setsansfont { texgyreheros }
              [
                Scale          = MatchUppercase ,
                UprightFont    = *-regular ,
                BoldFont       = *-bold ,
                ItalicFont     = *-italic ,
                BoldItalicFont = *-bolditalic ,
              ]
            \setmonofont { texgyrecursor }
              [
                Scale          = MatchUppercase ,
                UprightFont    = *-regular ,
                BoldFont       = *-bold ,
                ItalicFont     = *-italic ,
                BoldItalicFont = *-bolditalic ,
              ]
            \setmonofont{inconsolata}[Scale=MatchLowercase]
            \RequirePackage { unicode-math }
            \setmathfont { texgyretermes-math }
          }
      }
    \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 }
    \cs_undefine:c { Top }
    % https://tex.stackexchange.com/a/215272
    \DeclareSymbolFont{ntxletters}{OML}{ntxmi}{m}{it}
    \SetSymbolFont{ntxletters}{bold}{OML}{ntxmi}{b}{it}
    \re@DeclareMathSymbol{\leftharpoonup}{\mathrel}{ntxletters}{"28}
    \re@DeclareMathSymbol{\leftharpoondown}{\mathrel}{ntxletters}{"29}
    \re@DeclareMathSymbol{\rightharpoonup}{\mathrel}{ntxletters}{"2A}
    \re@DeclareMathSymbol{\rightharpoondown}{\mathrel}{ntxletters}{"2B}
    \re@DeclareMathSymbol{\triangleleft}{\mathbin}{ntxletters}{"2F}
    \re@DeclareMathSymbol{\triangleright}{\mathbin}{ntxletters}{"2E}
    \re@DeclareMathSymbol{\partial}{\mathord}{ntxletters}{"40}
    \re@DeclareMathSymbol{\flat}{\mathord}{ntxletters}{"5B}
    \re@DeclareMathSymbol{\natural}{\mathord}{ntxletters}{"5C}
    \re@DeclareMathSymbol{\star}{\mathbin}{ntxletters}{"3F}
    \re@DeclareMathSymbol{\smile}{\mathrel}{ntxletters}{"5E}
    \re@DeclareMathSymbol{\frown}{\mathrel}{ntxletters}{"5F}
    \re@DeclareMathSymbol{\sharp}{\mathord}{ntxletters}{"5D}
    \re@DeclareMathAccent{\vec}{\mathord}{ntxletters}{"7E}
    \sys_if_engine_pdftex:F
      {
        \setsansfont { texgyreheros }
          [
            Scale          = MatchUppercase ,
            UprightFont    = *-regular ,
            BoldFont       = *-bold ,
            ItalicFont     = *-italic ,
            BoldItalicFont = *-bolditalic ,
          ]
      }
    \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_bembo_bool
  {
    \bool_if:NT \l__projlib_font_useosf_bool
      {
        \PassOptionsToPackage { osf } { fbb }
      }
    \sys_if_engine_pdftex:F
      {
        \RequirePackage { fontspec }
      }
    \RequirePackage [full] { textcomp } % to get the right copyright, etc.
    \RequirePackage [p] { fbb }
    \RequirePackage [scaled=.95,type1] { cabin } % sans serif in style of Gill Sans
    \RequirePackage [varqu,varl] { zi4 }% inconsolata typewriter
    \RequirePackage [T1] { fontenc }
    \RequirePackage [libertine] { newtxmath }
    \RequirePackage [cal=boondoxo,bb=boondox,frak=boondox] { mathalfa }
    \cs_undefine:c { openbox }
    \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
  }

\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 { openbox }
    \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:NF \l__projlib_font_lmodern_bool
%   {
%     \hook_gput_code:nnn { package/tikz-cd/after } { projlib-font }
%       {
%         \tikzcdset{arrow~style={math~font}}
%       }
%   }

\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 }
    , SC                  .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       = {}
  }
\ProcessKeyOptions [ 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 { \exp_args:Ne \str_foldcase:n { \tl_trim_spaces:n { #1 } } }
      {
        { all                }    { common     }
        { common             }    { common     }
        { cn                 }    { schinese   }
        { sc                 }    { schinese   }
        { chinese            }    { schinese   }
        { schinese           }    { schinese   }
        { simplified chinese }    { schinese   }
        { simplified-chinese }    { schinese   }
        { simplified~chinese }    { schinese   }
        { tc                 }    { tchinese   }
        { tchinese           }    { tchinese   }
        { traditional chinese}    { tchinese   }
        { traditional-chinese}    { 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:nnF { \exp_args:Ne \str_foldcase:n { \tl_trim_spaces:n { #1 } } }
      {
        { cn                 }    {  cjk  }
        { sc                 }    {  cjk  }
        { chinese            }    {  cjk  }
        { schinese           }    {  cjk  }
        { simplified chinese }    {  cjk  }
        { simplified-chinese }    {  cjk  }
        { simplified~chinese }    {  cjk  }
        { tc                 }    {  cjk  }
        { tchinese           }    {  cjk  }
        { traditional chinese}    {  cjk  }
        { traditional-chinese}    {  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 }
      }
      { 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 }

\RequirePackage { silence }
\WarningFilter { biblatex } { Language }

\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
  {
    \tl_set:Nn  \languagename         { schinese }
    \tl_set:cn { abstractname   }     { ������     }
    \tl_set:cn { proofname      }     { ������     }
    \tl_set:cn { contentsname   }     { ������     }
    \tl_set:cn { listfigurename }     { ������     }
    \tl_set:cn { listtablename  }     { ������     }
    \tl_set:cn { figurename     }     { ���       }
    \tl_set:cn { tablename      }     { ���       }
    \tl_set:cn { indexname      }     { ������     }
    \tl_set:cn { appendixname   }     { ������     }
    \tl_set:cn { refname        }     { ������������ }
    \tl_set:cn { bibname        }     { ������������ }
  }
\cs_new_protected:Nn \projlib_language_apply_settings_globally_schinese:
  {
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_schinese_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_schinese:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_schinese_tl
    #1
    \group_end:
  }

\tl_gput_right:Nn \g_projlib_language_settings_tchinese_tl
  {
    \tl_set:Nn  \languagename         { tchinese }
    \tl_set:cn { abstractname   }     { ������     }
    \tl_set:cn { proofname      }     { ������     }
    \tl_set:cn { contentsname   }     { ������     }
    \tl_set:cn { listfigurename }     { ������     }
    \tl_set:cn { listtablename  }     { ������     }
    \tl_set:cn { figurename     }     { ���       }
    \tl_set:cn { tablename      }     { ���       }
    \tl_set:cn { indexname      }     { ������     }
    \tl_set:cn { appendixname   }     { ������     }
    \tl_set:cn { refname        }     { ������������ }
    \tl_set:cn { bibname        }     { ������������ }
  }
\cs_new_protected:Nn \projlib_language_apply_settings_globally_tchinese:
  {
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_tchinese_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_tchinese:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_tchinese_tl
    #1
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_japanese:
  {
    \selectlanguage { japanese }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_japanese_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_japanese:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_japanese_tl
    \foreignlanguage { japanese } { #1 }
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_english:
  {
    \selectlanguage { english }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_english_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_english:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_english_tl
    \foreignlanguage { english } { #1 }
    \group_end:
  }

\tl_gput_right:Nn \g_projlib_language_settings_french_tl
  {
    \tl_gset:cn { frenchpartname } { Partie }
  }
\cs_new_protected:Nn \projlib_language_apply_settings_globally_french:
  {
    \selectlanguage { french }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_french_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_french:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_french_tl
    \foreignlanguage { french } { #1 }
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_ngerman:
  {
    \selectlanguage { ngerman }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_ngerman_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_ngerman:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_ngerman_tl
    \foreignlanguage { ngerman } { #1 }
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_italian:
  {
    \selectlanguage { italian }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_italian_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_italian:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_italian_tl
    \foreignlanguage { italian } { #1 }
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_portuguese:
  {
    \selectlanguage { portuguese }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_portuguese_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_portuguese:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_portuguese_tl
    \foreignlanguage { portuguese } { #1 }
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_brazilian:
  {
    \selectlanguage { brazilian }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_brazilian_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_brazilian:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_brazilian_tl
    \foreignlanguage { brazilian } { #1 }
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_spanish:
  {
    \selectlanguage { spanish }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_spanish_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_spanish:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_spanish_tl
    \foreignlanguage { spanish } { #1 }
    \group_end:
  }

\cs_new_protected:Nn \projlib_language_apply_settings_globally_russian:
  {
    \selectlanguage { russian }
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_russian_tl
  }
\cs_new_protected:Nn \projlib_language_apply_settings_locally_russian:n
  {
    \group_begin:
    \g_projlib_language_settings_common_tl
    \g_projlib_language_settings_russian_tl
    \foreignlanguage { russian } { #1 }
    \group_end:
  }

\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 { setspaceenhanced }

\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 }
  {
    \IfPackageLoadedTF { 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 }
  }

\msg_new:nnn { projlib-language }
  { language-not-supported }
  { The~language~"#1"~is~not~supported. }
\msg_new:nnn { projlib-language }
  { language-not-enabled }
  { The~language~"#1"~is~not~enabled. }

\tl_new:N \l_projlib_language_current_languagetype_tl

\cs_new:Nn \projlib_language_use_language_locally:nn
  {
    \cs_if_exist:cTF { projlib_language_apply_settings_locally_ \projlib_language_str_to_languagename:n { #1 } :n }
      {
        \bool_if:cTF { g__projlib_language_enabled_ \projlib_language_str_to_languagename:n { #1 } _bool }
          {
            \use:c { projlib_language_apply_settings_locally_ \projlib_language_str_to_languagename:n { #1 } :n } { #2 }
            \tl_set:Ne \l_projlib_language_current_languagetype_tl { \projlib_language_str_to_languagetype:n { #1 } }
          }
          {
            \msg_warning:nnn { projlib-language } { language-not-enabled } { #1 }
            #2
          }
      }
      {
        \msg_warning:nnn { projlib-language } { language-not-supported } { #1 }
        #2
      }
  }
\cs_generate_variant:Nn \projlib_language_use_language_locally:nn { e }

\cs_new:Nn \projlib_language_use_language:n
  {
    \cs_if_exist:cTF { projlib_language_apply_settings_globally_ \projlib_language_str_to_languagename:n { #1 } : }
      {
        \bool_if:cTF { g__projlib_language_enabled_ \projlib_language_str_to_languagename:n { #1 } _bool }
          {
            \use:c { projlib_language_apply_settings_globally_ \projlib_language_str_to_languagename:n { #1 } : }
            \cs_if_exist_use:c { g_projlib_language_linespacing_ \projlib_language_str_to_languagetype:n { #1 } _tl }
            \cs_if_exist_use:c { g_projlib_language_parindent_ \projlib_language_str_to_languagetype:n { #1 } _tl }
            \tl_set:Ne \l_projlib_language_current_languagetype_tl { \projlib_language_str_to_languagetype:n { #1 } }
          }
          {
            \msg_warning:nnn { projlib-language } { language-not-enabled } { #1 }
          }
      }
      {
        \msg_warning:nnn { projlib-language } { language-not-supported } { #1 }
      }
  }
\cs_generate_variant:Nn \projlib_language_use_language:n { e }

\NewDocumentCommand \UseLanguage { m }
  {
    % Set the configuration twice at different stages of begindocument
    \hook_gput_code:nnn { begindocument } { projlib-language }
      {
        \projlib_language_use_language:e { #1 }
      }
    \hook_gput_code:nnn { begindocument/end } { projlib-language }
      {
        \projlib_language_use_language:e { #1 }
      }
  }
\NewDocumentCommand \UseOtherLanguage { m m }
  {
    \group_begin:
      \projlib_language_use_language_locally:en { #1 } { #2 }
    \group_end:
  }
\NewDocumentEnvironment { OtherLanguage } { m +b }
  {
    \projlib_language_use_language_locally:en { #1 } { #2 }
  }
  { }

\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
      { \use_none:n }
      { \__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 }
  }


\PassOptionsToPackage { autostyle } { csquotes }
\RequirePackage { csquotes }

\DeclareQuoteStyle { schinese } {���} {���} {���} {���}
\DeclareQuoteStyle { tchinese } {���} {���} {���} {���}
\DeclareQuoteStyle { japanese } {���} {���} {���} {���}
%</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       = {}
  }
\ProcessKeyOptions [ projlib-logo ]

\bool_if:NT \l__projlib_logo_fast_bool
  {
    \DeclareRobustCommand * \ProjLib
      {
        \group_begin:
          \normalfont\sffamily ProjLib
        \group_end:
      }
    \DeclareRobustCommand * \ProjLibText
      {
        \group_begin:
          \normalfont\sffamily ProjLib
        \group_end:
      }
    \endinput
  }

\RequirePackage { tikz }

\cs_new_protected:Nn \projlib_logo_generic:nn
  {
    \colorlet{projlib-logo-saved-color}{.}
    \skip_horizontal:n { .2em }
    \begin{tikzpicture}[line~width=.1em, baseline=0]
      \begin{scope}[color=#1!30!projlib-logo-saved-color]
        \draw (0.22em,.5em) circle (.22em);
        \draw (0em,0em) -- (0em,.5em);
      \end{scope}
      \begin{scope}[color=#1!40!projlib-logo-saved-color, xshift=.65em]
        \draw (0em,0em) -- (0em,.25em) arc [start~angle=180, end~angle=90, radius=.2em];
      \end{scope}
      \begin{scope}[color=#1!45!projlib-logo-saved-color, xshift=1.0em]
        \draw (0.2em,.24em) circle (.2em);
      \end{scope}
      \begin{scope}[color=#1!50!projlib-logo-saved-color, xshift=1.65em]
        \draw (0em,-.25em) -- (0em,.5em);
        \begin{scope}[yshift=.75em]
          % \draw[line~width=.032em, color=#2, xshift=.01em, yshift=-.003em] (0,0) circle (.13em);
          % \node[rotate=-15,scale=0.45, xshift=.033em] { \usefont{U}{zeur}{b}{n} \symbol{"02} };
          \draw[line~width=.06em, color=#2] (0,0) circle (.13em);
        \end{scope}
      \end{scope}
      \begin{scope}[color=#1!67!projlib-logo-saved-color, xshift=2.0em]
        \draw (0em,0em) -- (0em,.75em);
      \end{scope}
      \begin{scope}[color=#1!75!projlib-logo-saved-color, xshift=2.35em]
        \draw (0em,0em) -- (0em,.5em);
      \end{scope}
      \begin{scope}[color=#1!90!projlib-logo-saved-color, xshift=2.63em]
        \draw (0.2em,.24em) circle (.2em);
        \draw (0em,0.24em) -- (0em,.75em);
      \end{scope}
    \end{tikzpicture}
    \skip_horizontal:n { .1em }
  }

\DeclareRobustCommand * \ProjLib
  {
    \projlib_logo_generic:nn { blue!50!cyan } { orange!60!yellow }
  }


\DeclareRobustCommand * \ProjLibText
  {
    \projlib_logo_generic:nn { projlib-logo-saved-color } { projlib-logo-saved-color }
  }
%</projlib-logo>
%
%<*projlib-math>
\keys_define:nn { projlib-math }
  {
    , unknown     .code:n     = {}
  }
\ProcessKeyOptions [ projlib-math ]


% https://tex.stackexchange.com/a/643233
\providecommand* \ProvideCommandCopy
  {
    \declare@commandcopy{\@firstofone}{\@firstoftwo{}}
  }


\RequirePackage { mathtools }
\RequirePackage { mathrsfs }
\PassOptionsToPackage { warnings-off = { mathtools-colon, mathtools-overbracket } } { unicode-math }
\IfPackageLoadedTF { 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 \ProjLibDefineMathOperator { 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 }
      }
  }

\ProvideCommandCopy \DefineMathOperator \ProjLibDefineMathOperator
\ProvideCommandCopy \DefineOperator \ProjLibDefineMathOperator


\msg_new:nnn { projlib-math }
  { symbol-not-define }
  { The~symbol~/~shortcut~"\iow_char:N \\#1"~cannot~be~defined,~a~command~with~the~same~name~has~already~existed. }

\msg_new:nnn { projlib-math }
  { symbol-type-not-define }
  { The~symbol~/~shortcut~type~"#1"~is~not~available,~a~command~with~the~same~name~has~already~existed. }

\keys_define:nn { projlib-math-symbol }
  {
    , prefix       .clist_set:N  = \l__projlib_math_symbol_prefix_clist
    , type         .tl_set:N     = \l__projlib_math_symbol_type_tl
    , style        .tl_set:N     = \l__projlib_math_symbol_style_tl
    , unknown      .code:n       = {}
  }

\cs_new_protected:Nn \projlib_math_define_symbol:nnn
  % #1 = bool for star or empty
  % (currently the starred version is the same as normal version)
  % #2 = list of symbols
  % #3 = the option
  {
    \clist_clear:N \l__projlib_math_symbol_prefix_clist
    \tl_clear:N \l__projlib_math_symbol_type_tl
    \tl_set:Nn \l__projlib_math_symbol_style_tl { \mathrm }
    \keys_set:nn { projlib-math-symbol } { #3 }
    \tl_if_empty:NF \l__projlib_math_symbol_type_tl
      {
        \cs_if_exist:cTF { \l__projlib_math_symbol_type_tl }
          {
            \exp_args:Nne \use:n
              { \msg_warning:nnn  { projlib-math } { symbol-type-not-define } }
              { \l__projlib_math_symbol_type_tl }
          }
          {
            \exp_args:Nno \use:n
              {
                \exp_args:Nc \NewDocumentCommand { \l__projlib_math_symbol_type_tl } { m }
              }
              {
                \l__projlib_math_symbol_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_symbol_prefix_clist
              {
                \__projlib_math_define_symbol:ee { \seq_item:Nn \l_tmpa_seq { 1 } } { \seq_item:Nn \l_tmpa_seq { 2 } }
              }
              {
                \clist_map_inline:Nn \l__projlib_math_symbol_prefix_clist
                  {
                    \__projlib_math_define_symbol:ee { ####1 \seq_item:Nn \l_tmpa_seq { 1 } } { \seq_item:Nn \l_tmpa_seq { 2 } }
                  }
              }
          }
          {
            \clist_if_empty:NTF \l__projlib_math_symbol_prefix_clist
              {
                \__projlib_math_define_symbol:ee { ##1 } { ##1 }
              }
              {
                \clist_map_inline:Nn \l__projlib_math_symbol_prefix_clist
                  {
                    \__projlib_math_define_symbol:ee { ####1 ##1 } { ##1 }
                  }
              }
          }
      }
  }

\cs_new_protected:Nn \__projlib_math_define_symbol:nn
  % #1 = command name
  % #2 = the content
  {
    \cs_if_exist:cTF { #1 }
      {
        \msg_warning:nnn { projlib-math } { symbol-not-define } { #1 }
      }
      {
        \exp_args:Nno \use:n
          { \exp_args:Nc \NewDocumentCommand { #1 } {} }
          { \l__projlib_math_symbol_style_tl { #2 } }
      }
  }
\cs_generate_variant:Nn \__projlib_math_define_symbol:nn { ee }

\NewDocumentCommand \ProjLibDefineMathSymbol { s O{} m O{} }
  {
    \tl_if_blank:nTF { #2 }
      {
        \projlib_math_define_symbol:nnn { #1 } { #3 } { #4 }
      }
      {
        \projlib_math_define_symbol:nnn { #1 } { #3 } { #2 }
      }
  }
\ProvideCommandCopy \DefineMathSymbol \ProjLibDefineMathSymbol
\ProvideCommandCopy \DefineShortcut \ProjLibDefineMathSymbol


\cs_new:Nn \projlib_math_redefine_in_math_mode:Nn
  {
    \exp_args:Nc \NewCommandCopy { projlib_math_original_ \cs_to_str:N #1 : } #1
    \RenewDocumentCommand #1 { }
      {
        \mode_if_math:TF
          { #2 }
          { \use:c { projlib_math_original_ \cs_to_str:N #1 : } }
      }
  }

\NewDocumentCommand \ProjLibRedefineInMathMode { m m }
  {
    \projlib_math_redefine_in_math_mode:Nn #1 { #2 }
  }

\ProvideCommandCopy \RedefineInMathMode \ProjLibRedefineInMathMode


\cs_new:Nn \__projlib_math_list_of_symbols_entry:nnnn
  % #1 = column one width
  % #2 = column two width
  % #3 = symbol
  % #4 = description
  {
    \noindent
    \begin { tabular } { p{#1} p{#2} }
      \parbox [t] { #1 } { #3 } & \parbox [t] { #2 } { #4 }
    \end { tabular }
    \par
    \skip_vertical:n { -\parskip }
  }

\cs_new:Nn \projlib_math_list_of_symbols:nnn
  % #1 = column one width
  % #2 = column two width
  % #3 = key-val list
  {
    \keyval_parse:nnn
      { \use_none:n }
      { \__projlib_math_list_of_symbols_entry:nnnn { #1 } { #2 } }
      { #3 }
  }

\NewDocumentCommand \ProjLibListOfSymbols { O{0.17\textwidth} O{0.75\textwidth} m }
  {
    \projlib_math_list_of_symbols:nnn { #1 } { #2 } { #3 }
  }

\ProvideCommandCopy \ListOfSymbols \ProjLibListOfSymbols
%</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
    , light-yellow-paper .meta:n             = { paperstyle = lightyellow }
    , light~yellow~paper .meta:n             = { paperstyle = lightyellow }
    , light yellow-paper .meta:n             = { paperstyle = lightyellow }
    , light yellow~paper .meta:n             = { paperstyle = lightyellow }
    , light yellow paper .meta:n             = { paperstyle = lightyellow }
    , 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             = {}
  }
\ProcessKeyOptions [ 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 }
  {
    { light yellow } { \definecolor { paper }     { RGB } { 255, 254, 245 }
                       \definecolor { main-text } { RGB } {  37,  41,  46 } }
    { light-yellow } { \definecolor { paper }     { RGB } { 255, 254, 245 }
                       \definecolor { main-text } { RGB } {  37,  41,  46 } }
    { light~yellow } { \definecolor { paper }     { RGB } { 255, 254, 245 }
                       \definecolor { main-text } { RGB } {  37,  41,  46 } }
    { yellow       } { \definecolor { paper }     { RGB } { 247, 246, 233 } }
    { parchment    } { \definecolor { paper }     { RGB } { 232, 225, 204 }
                       \definecolor { main-text } { RGB } {  94,  78,  62 } }
    { green        } { \definecolor { paper }     { RGB } { 207, 231, 207 } }
    { light gray   } { \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 } }
    { 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 { package/tcolorbox/after } { projlib-paper }
  {
    \tcbset { colupper = main-text, collower = main-text }
  }
\hook_gput_code:nnn { package/tikz-cd/after } { projlib-paper }
  {
    \tikzset { /tikz/commutative~diagrams/background~color = paper }
  }
%</projlib-paper>
%
%<*projlib-text>
\keys_define:nn { projlib-text }
  {
    , unknown .code:n       = {}
  }
\ProcessKeyOptions [ projlib-text ]

\RequirePackage { projlib-paper }

\ProvideDocumentCommand \ItemDescription { m }
  {
    \textcolor { main-text!50!paper } { $($ #1 $)$  }
    \nobreakspace
    \ignorespaces
  }

\cs_new_protected:Nn \projlib_text_abbreviation_generic:nn
  % #1 is the text
  % #2 is usually some spacing adjustment
  {
    #1
    % if followed by a dot, then remove that dot and adjust the spacing
    \peek_meaning_ignore_spaces:NTF .
      { #2 \use_none:n }
      {
        % if followed by a comma, then act like nothing happens
        % otherwise adjust the spacing
        \peek_meaning_ignore_spaces:NTF ,
          { \prg_do_nothing: }
          { #2 }
      }
  }

\hook_gput_code:nnn { begindocument/before } { projlib-text }
  {
    % i.e.
    \ProvideDocumentCommand { \ie } { }
      {
        \projlib_text_abbreviation_generic:nn { \textit{i. \nobreak \hskip.2ex \nobreak e.} } { \skip_horizontal:n { -.15ex ~plus -.15\tex_fontdimen:D 3 \tex_font:D~minus -.15\tex_fontdimen:D 4 \tex_font:D } }
      }

    % e.g.
    \ProvideDocumentCommand { \eg } { }
      {
        \projlib_text_abbreviation_generic:nn { \textit{e. \nobreak \hskip.2ex \nobreak g.} } { \skip_horizontal:n { -.15ex ~plus -.15\tex_fontdimen:D 3 \tex_font:D~minus -.15\tex_fontdimen:D 4 \tex_font:D } }
      }

    % cf.
    \ProvideDocumentCommand { \cf } { }
      {
        \projlib_text_abbreviation_generic:nn { \textit{cf.} } { }
      }

    % etc.
    \ProvideDocumentCommand { \etc } { }
      {
        \projlib_text_abbreviation_generic:nn { etc. } { }
      }
  }
%</projlib-text>
%
%<*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          = { * }
    , separate-theorem-numbering  .bool_set:N         = \l__projlib_theorem_separate_theorem_numbering_bool
    , separate-theorem-numbering  .initial:n          = { false }
    , separate~theorem~numbering  .bool_set:N         = \l__projlib_theorem_separate_theorem_numbering_bool
    , separate theorem numbering  .bool_set:N         = \l__projlib_theorem_separate_theorem_numbering_bool
    , number-theorems-separately  .bool_set:N         = \l__projlib_theorem_separate_theorem_numbering_bool
    , number~theorems~separately  .bool_set:N         = \l__projlib_theorem_separate_theorem_numbering_bool
    , number theorems separately  .bool_set:N         = \l__projlib_theorem_separate_theorem_numbering_bool
    , theorem-style               .tl_set:N           = \l__projlib_theorem_theorem_style_tl
    , theorem-style               .initial:n          = { }
    , theorem-style               .value_required:n   = true
    , theorem~style               .tl_set:N           = \l__projlib_theorem_theorem_style_tl
    , theorem~style               .value_required:n   = true
    , theorem style               .tl_set:N           = \l__projlib_theorem_theorem_style_tl
    , theorem style               .value_required:n   = true
    , 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
    , complex-names               .bool_set:N         = \l__projlib_theorem_complexname_bool
    , complex~names               .bool_set:N         = \l__projlib_theorem_complexname_bool
    , complex names               .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
    , simple-names                .bool_set_inverse:N = \l__projlib_theorem_complexname_bool
    , simple~names                .bool_set_inverse:N = \l__projlib_theorem_complexname_bool
    , simple names                .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 } }
  }
\ProcessKeyOptions [ projlib-theorem ]

\clist_const:Nn \c_projlib_theorem_supported_clist
  {
    application               ,
    assertion                 ,
    assumption                ,
    axiom                     ,
    claim                     ,
    commentary                ,
    conclusion                ,
    conjecture                ,
    construction              ,
    convention                ,
    corollary                 ,
    definition                ,
    example                   ,
    exercise                  ,
    fact                      ,
    hypothesis                ,
    lemma                     ,
    motivation                ,
    notation                  ,
    observation               ,
    postulate                 ,
    problem                   ,
    property                  ,
    proposition               ,
    question                  ,
    recall                    ,
    remark                    ,
    theorem                   ,
    definition-corollary      ,
    definition-proposition    ,
    definition-theorem        ,
    corollary-definition      ,
    proposition-definition    ,
    theorem-definition        ,
    applications              ,
    assertions                ,
    assumptions               ,
    axioms                    ,
    claims                    ,
    commentaries              ,
    conclusions               ,
    conjectures               ,
    constructions             ,
    conventions               ,
    corollaries               ,
    definitions               ,
    examples                  ,
    exercises                 ,
    facts                     ,
    hypotheses                ,
    lemmas                    ,
    motivations               ,
    notations                 ,
    observations              ,
    postulates                ,
    problems                  ,
    properties                ,
    propositions              ,
    questions                 ,
    recalls                   ,
    remarks                   ,
    theorems                  ,
  }

\@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 { endtheorem    }
        \cs_undefine:c { lemma      } \cs_undefine:c { endlemma      }
        \cs_undefine:c { corollary  } \cs_undefine:c { endcorollary  }
        \cs_undefine:c { definition } \cs_undefine:c { enddefinition }
        \cs_undefine:c { fact       } \cs_undefine:c { endfact       }
        \cs_undefine:c { example    } \cs_undefine:c { endexample    }
        \cs_undefine:c { problem    } \cs_undefine:c { endproblem    }
      }
  } {}

\RequirePackage { projlib-language }

% \bool_if:NF \l__projlib_theorem_complexname_bool
%   {
%     \PassOptionsToPackage { no preset names } { create-theorem }
%   }

\cs_new_protected:Nn \projlib_theorem_preset_theorem_style:nn
  {
    \str_case:nnTF { #1 }
      {
        { theorem-with-name } { }
        { proof } { }
      }
      {
        \tl_const:cn { c_crthm_theorem_style_preset_ #1 _inner _tl } { #2 }
      }
      {
        \tl_const:cn { c_crthm_theorem_style_preset_ #1 _tl } { #2 }
      }
  }

\cs_generate_variant:Nn \keyval_parse:nnn { nno }
\keyval_parse:nno
  { \use_none:n }
  { \projlib_theorem_preset_theorem_style:nn }
  { \l__projlib_theorem_theorem_style_tl }

% If the style of proof is not given, use "remark" as default.
\cs_if_exist:cF { c_crthm_theorem_style_preset_ proof_inner _tl }
  {
    \tl_const:cn { c_crthm_theorem_style_preset_ proof_inner _tl } { remark }
  }

\RequirePackage { mathtools }
\RequirePackage { amsthm }
\RequirePackage { create-theorem }

\RenewCommandCopy \cref      \crefthe
\RenewCommandCopy \Cref      \Crefthe
\RenewCommandCopy \namecref  \namecrefthe
\RenewCommandCopy \nameCref  \nameCrefthe
\RenewCommandCopy \namecrefs \namecrefsthe
\RenewCommandCopy \nameCrefs \nameCrefsthe
\RenewCommandCopy \cpageref  \cpagerefthe
\RenewCommandCopy \Cpageref  \Cpagerefthe
\RenewCommandCopy \crefname  \crefthename
\RenewCommandCopy \Crefname  \Crefthename

\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, create starred version }
      }
      {
        \tl_if_blank:oTF \l__projlib_theorem_theorem_numbering_tl
          {
            \cs_if_exist:cTF { c@chapter }
              { % with \chapter
                \CreateTheorem { theorem } { parent counter = chapter, create starred version }
                \bool_if:NT \l__projlib_theorem_separate_theorem_numbering_bool
                  {
                    \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { parent counter = chapter, create starred version, quiet }
                  }
              }
              { % without \chapter
                \CreateTheorem { theorem } { parent counter = section, create starred version }
                \bool_if:NT \l__projlib_theorem_separate_theorem_numbering_bool
                  {
                    \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { parent counter = section, create starred version, quiet }
                  }
              }
          }
          {
            \tl_if_eq:NnTF \l__projlib_theorem_theorem_numbering_tl { * }
              {
                \CreateTheorem { theorem } { create starred version }
                \bool_if:NT \l__projlib_theorem_separate_theorem_numbering_bool
                  {
                    \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { create starred version, quiet }
                  }
              }
              {
                \CreateTheorem { theorem } { parent counter = \l__projlib_theorem_theorem_numbering_tl, create starred version }
                \bool_if:NT \l__projlib_theorem_separate_theorem_numbering_bool
                  {
                    \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { parent counter = \l__projlib_theorem_theorem_numbering_tl, create starred version, quiet }
                  }
              }
          }

        \bool_if:NF \l__projlib_theorem_separate_theorem_numbering_bool
          {
            \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { shared counter = theorem, create starred version, quiet }
          }
      }
  }

\newcounter { theorem-with-name }
\newcounter { proof }
\crthm_counter_alias:nn { theorem-with-name } { theorem }
% \crthm_counter_alias:nn { proof } { theorem }

\tl_new:N \l__projlib_theorem_name_of_theorem_with_name_tl
\CreateTheorem { theorem-with-name_inner }
  {
    , name = {
               , heading = { \l__projlib_theorem_name_of_theorem_with_name_tl }
               , crefname = {}{}
               , Crefname = {}{}
             }
    , create-starred-version
    , shared-counter = theorem-with-name
  }

\NewDocumentEnvironment { theorem-with-name } { m O{} }
  {
    \tl_set:Nn \l__projlib_theorem_name_of_theorem_with_name_tl { #1 }
    \begin { theorem-with-name_inner } [ #2 ]
  }
  {
    \end { theorem-with-name_inner }
  }
\NewDocumentEnvironment { theorem-with-name* } { m O{} }
  {
    \tl_set:Nn \l__projlib_theorem_name_of_theorem_with_name_tl { #1 }
    \begin { theorem-with-name_inner* } [ #2 ]
  }
  {
    \end { theorem-with-name_inner* }
  }

\SetTheoremBinding { theorem-with-name } { theorem-with-name_inner }
\SetTheoremBinding { theorem-with-name* } { theorem-with-name_inner* }

\tl_new:N \l__projlib_theorem_name_of_proof_tl
\CreateTheorem { proof_inner } { name = { heading = { \l__projlib_theorem_name_of_proof_tl } }, create-starred-version, qed, shared-counter = proof }

\cs_undefine:c { proof }
\cs_undefine:c { endproof }

\NewDocumentEnvironment { proof } { O{\proofname} }
  {
    \tl_set:Nn \l__projlib_theorem_name_of_proof_tl { #1 }
    \begin { proof_inner }
  }
  {
    \end { proof_inner }
  }
\NewDocumentEnvironment { proof* } { O{\proofname} }
  {
    \tl_set:Nn \l__projlib_theorem_name_of_proof_tl { #1 }
    \begin { proof_inner* }
  }
  {
    \end { proof_inner* }
  }

\SetTheoremBinding { proof } { proof_inner }
\SetTheoremBinding { proof* } { proof_inner* }

\cs_new_protected:Nn \projlib_theorem_disable_theorem_numbering:n
  {
    \clist_map_inline:nn { #1 }
      {
        \__projlib_theorem_disable_theorem_numbering_do:n { ##1 }
      }
  }
\cs_new_protected:Nn \__projlib_theorem_disable_theorem_numbering_do:n
  {
    \CreateTheorem { #1 } { copy-existed = #1* }
  }

\NewDocumentCommand \DisableTheoremNumbering { m }
  {
    \projlib_theorem_disable_theorem_numbering:n { #1 }
  }


\cs_new_protected:Nn \projlib_theorem_switch_theorem_numbering:n
  {
    \clist_map_inline:nn { #1 }
      {
        \__projlib_theorem_switch_theorem_numbering_do:n { ##1 }
      }
  }
\cs_new_protected:Nn \__projlib_theorem_switch_theorem_numbering_do:n
  {
    \CreateTheorem { #1_projlib_theorem_temp } { copy-existed = #1* }
    \CreateTheorem { #1* } { copy-existed = #1 }
    \CreateTheorem { #1 } { copy-existed = #1_projlib_theorem_temp }
  }

\NewDocumentCommand \SwitchTheoremNumbering { m }
  {
    \projlib_theorem_switch_theorem_numbering:n { #1 }
  }

\SwitchTheoremNumbering { theorem-with-name, proof }


\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 } { , ~ }
    \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 } { \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 } { , ~ }
    \tl_gset:Nn { \creflastconjunction } { \nobreakspace e \nobreakspace }
    \tl_gset:Nn { \crefpairgroupconjunction } { \nobreakspace e \nobreakspace }
    \tl_gset:Nn { \crefmiddlegroupconjunction } { , ~ }
    \tl_gset:Nn { \creflastgroupconjunction } { \nobreakspace e \nobreakspace }
    \tl_gset:Nn { \crefrangeconjunction } { \nobreakspace a \nobreakspace }
  }

\crefformat{equation}{#2\cref@equation@name\nobreakspace\textup{\tagform@{#1}}#3}
\Crefformat{equation}{#2\Cref@equation@name\nobreakspace\textup{\tagform@{#1}}#3}
\crefrangeformat{equation}{\cref@equation@name@plural\nobreakspace#3\textup{\tagform@{#1}}#4\crefrangeconjunction#5\textup{\tagform@{#2}}#6}
\Crefrangeformat{equation}{\Cref@equation@name@plural\nobreakspace#3\textup{\tagform@{#1}}#4\crefrangeconjunction#5\textup{\tagform@{#2}}#6}
\crefmultiformat{equation}{\cref@equation@name@plural\nobreakspace#2\textup{\tagform@{#1}}#3}{\crefpairconjunction#2\textup{\tagform@{#1}}#3}{\crefmiddleconjunction#2\textup{\tagform@{#1}}#3}{\creflastconjunction#2\textup{\tagform@{#1}}#3}
\Crefmultiformat{equation}{\Cref@equation@name@plural\nobreakspace#2\textup{\tagform@{#1}}#3}{\crefpairconjunction#2\textup{\tagform@{#1}}#3}{\crefmiddleconjunction#2\textup{\tagform@{#1}}#3}{\creflastconjunction#2\textup{\tagform@{#1}}#3}
\crefrangemultiformat{equation}{\cref@equation@name@plural\nobreakspace#2\textup{\tagform@{#1}}#3}{\crefpairgroupconjunction#2\textup{\tagform@{#1}}#3}{\crefmiddlegroupconjunction#2\textup{\tagform@{#1}}#3}{\creflastgroupconjunction#2\textup{\tagform@{#1}}#3}
\Crefrangemultiformat{equation}{\Cref@equation@name@plural\nobreakspace#2\textup{\tagform@{#1}}#3}{\crefpairgroupconjunction#2\textup{\tagform@{#1}}#3}{\crefmiddlegroupconjunction#2\textup{\tagform@{#1}}#3}{\creflastgroupconjunction#2\textup{\tagform@{#1}}#3}
\labelcrefformat{equation}{#2\textup{\tagform@{#1}}#3}
\labelcrefrangeformat{equation}{#3\textup{\tagform@{#1}}#4\crefrangeconjunction#5\textup{\tagform@{#2}}#6}
\labelcrefmultiformat{equation}{#2\textup{\tagform@{#1}}#3}{\crefpairconjunction#2\textup{\tagform@{#1}}#3}{\crefmiddleconjunction#2\textup{\tagform@{#1}}#3}{\creflastconjunction#2\textup{\tagform@{#1}}#3}
\labelcrefrangemultiformat{equation}{#2\textup{\tagform@{#1}}#3}{\crefpairgroupconjunction#2\textup{\tagform@{#1}}#3}{\crefmiddlegroupconjunction#2\textup{\tagform@{#1}}#3}{\creflastgroupconjunction#2\textup{\tagform@{#1}}#3}

\bool_if:NF \l__projlib_theorem_presetname_bool { \endinput }
\bool_if:NT \l__projlib_theorem_complexname_bool { \endinput }

\NameTheorem { application }
  {
    , heading =   {
                    , english     = Application
                    , french      = Application
                    , ngerman     = Anwendung
                    , italian     = Applicazione
                    , portuguese  = Aplica����o
                    , brazilian   = Aplica����o
                    , spanish     = Aplicaci��n
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������������
                  }
    , crefname =  {
                    , english     = {Application}{Application}
                    , french      = [l']{Application}[les]{Application}
                    , ngerman     = {Anwendung}{Anwendung}
                    , italian     = [l']{Applicazione}[le]{Applicazione}
                    , portuguese  = [a]{Aplica����o}[as]{Aplica����o}
                    , brazilian   = [a]{Aplica����o}[as]{Aplica����o}
                    , spanish     = [la]{Aplicaci��n}[las]{Aplicaci��n}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
    , Crefname =  {
                    , english     = {Application}{Application}
                    , french      = [L']{Application}[Les]{Application}
                    , ngerman     = {Anwendung}{Anwendung}
                    , italian     = [L']{Applicazione}[Le]{Applicazione}
                    , portuguese  = [A]{Aplica����o}[As]{Aplica����o}
                    , brazilian   = [A]{Aplica����o}[As]{Aplica����o}
                    , spanish     = [La]{Aplicaci��n}[Las]{Aplicaci��n}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
  }

\NameTheorem { assertion }
  {
    , heading =   {
                    , english     = Assertion
                    , french      = Assertion
                    , ngerman     = Assertion
                    , 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     = {Assertion}{Assertionen}
                    , 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     = {Assertion}{Assertionen}
                    , 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 { claim }
  {
    , heading =   {
                    , english     = Claim
                    , french      = Affirmation
                    , ngerman     = Behauptung
                    , italian     = Affermazione
                    , portuguese  = Afirma����o
                    , brazilian   = Afirma����o
                    , spanish     = Afirmaci��n
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Claim}{Claim}
                    , french      = [l']{Affirmation}[les]{Affirmation}
                    , ngerman     = {Behauptung}{Behauptungen}
                    , italian     = [l']{Affermazione}[le]{Affermazione}
                    , portuguese  = [a]{Afirma����o}[as]{Afirma����o}
                    , brazilian   = [a]{Afirma����o}[as]{Afirma����o}
                    , spanish     = [la]{Afirmaci��n}[las]{Afirmaci��n}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Claim}{Claim}
                    , french      = [L']{Affirmation}[Les]{Affirmation}
                    , ngerman     = {Behauptung}{Behauptungen}
                    , italian     = [L']{Affermazione}[Le]{Affermazione}
                    , portuguese  = [A]{Afirma����o}[As]{Afirma����o}
                    , brazilian   = [A]{Afirma����o}[As]{Afirma����o}
                    , spanish     = [La]{Afirmaci��n}[Las]{Afirmaci��n}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { commentary }
  {
    , heading =   {
                    , english     = Commentary
                    , french      = Commentaire
                    , ngerman     = Kommentar
                    , italian     = Commento
                    , portuguese  = Coment��rio
                    , brazilian   = Coment��rio
                    , spanish     = Comentario
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������ % ������������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Commentary}{Commentary}
                    , french      = [la]{Commentaire}[les]{Commentaire}
                    , ngerman     = {Kommentar}{Kommentar}
                    , 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     = {Commentary}{Commentary}
                    , french      = [La]{Commentaire}[Les]{Commentaire}
                    , ngerman     = {Kommentar}{Kommentar}
                    , 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 { 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 { construction }
  {
    , heading =   {
                    , english     = Construction
                    , french      = Construction
                    , ngerman     = Konstruktion
                    , italian     = Costruzione
                    , portuguese  = Constru����o
                    , brazilian   = Constru����o
                    , spanish     = Construcci��n
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Construction}{Construction}
                    , french      = [la]{Construction}[les]{Construction}
                    , ngerman     = {Konstruktion}{Konstruktion}
                    , italian     = [la]{Costruzione}[le]{Costruzione}
                    , portuguese  = [a]{Constru����o}[as]{Constru����o}
                    , brazilian   = [a]{Constru����o}[as]{Constru����o}
                    , spanish     = [la]{Construcci��n}[las]{Construcci��n}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Construction}{Construction}
                    , french      = [La]{Construction}[Les]{Construction}
                    , ngerman     = {Konstruktion}{Konstruktion}
                    , italian     = [La]{Costruzione}[Le]{Costruzione}
                    , portuguese  = [A]{Constru����o}[As]{Constru����o}
                    , brazilian   = [A]{Constru����o}[As]{Constru����o}
                    , spanish     = [La]{Construcci��n}[Las]{Construcci��n}
                    , 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']{Exemple}[les]{Exemple}
                    , 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']{Exemple}[Les]{Exemple}
                    , 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     = Tatsache
                    , italian     = Fatto
                    , portuguese  = Facto
                    , brazilian   = Fato
                    , spanish     = Hecho
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������
                  }
    , crefname =  {
                    , english     = {Fact}{Fact}
                    , french      = [le]{Fait}[les]{Fait}
                    , ngerman     = {Tatsache}{Tatsachen}
                    , 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     = {Tatsache}{Tatsachen}
                    , 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 { motivation }
  {
    , heading =   {
                    , english     = Motivation
                    , french      = Motivation
                    , ngerman     = Motivation
                    , italian     = Motivazione
                    , portuguese  = Motiva����o
                    , brazilian   = Motiva����o
                    , spanish     = Motivacion
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������ % ���������������������
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Motivation}{Motivation}
                    , french      = [la]{Motivation}[les]{Motivation}
                    , ngerman     = {Motivation}{Motivation}
                    , italian     = [la]{Motivazione}[le]{Motivazione}
                    , portuguese  = [a]{Motiva����o}[as]{Motiva����o}
                    , brazilian   = [a]{Motiva����o}[as]{Motiva����o}
                    , spanish     = [la]{Motivacion}[las]{Motivacion}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
    , Crefname =  {
                    , english     = {Motivation}{Motivation}
                    , french      = [La]{Motivation}[Les]{Motivation}
                    , ngerman     = {Motivation}{Motivation}
                    , italian     = [La]{Motivazione}[Le]{Motivazione}
                    , portuguese  = [A]{Motiva����o}[As]{Motiva����o}
                    , brazilian   = [A]{Motiva����o}[As]{Motiva����o}
                    , spanish     = [La]{Motivacion}[Las]{Motivacion}
                    , 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 { recall }
  {
    , heading =   {
                    , english     = Recall
                    , french      = Rappel
                    , ngerman     = R��ckruf
                    , italian     = Richiamo
                    , portuguese  = Recorda����o
                    , brazilian   = Recorda����o
                    , spanish     = Recuerdo
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Recall}{Recall}
                    , french      = [le]{Rappel}[les]{Rappel}
                    , ngerman     = {R��ckruf}{R��ckruf}
                    , italian     = [il]{Richiamo}[i]{Richiamo}
                    , portuguese  = [a]{Recorda����o}[as]{Recorda����o}
                    , brazilian   = [a]{Recorda����o}[as]{Recorda����o}
                    , spanish     = [el]{Recuerdo}[los]{Recuerdo}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Recall}{Recall}
                    , french      = [Le]{Rappel}[Les]{Rappel}
                    , ngerman     = {R��ckruf}{R��ckruf}
                    , italian     = [Il]{Richiamo}[I]{Richiamo}
                    , portuguese  = [A]{Recorda����o}[As]{Recorda����o}
                    , brazilian   = [A]{Recorda����o}[As]{Recorda����o}
                    , spanish     = [El]{Recuerdo}[Los]{Recuerdo}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { remark }
  {
    , heading =   {
                    , english     = Remark
                    , french      = Remarque
                    , ngerman     = Erinnerung
                    , italian     = Commento
                    , portuguese  = Coment��rio
                    , brazilian   = Coment��rio
                    , spanish     = Comentario
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Remark}{Remark}
                    , french      = [la]{Remarque}[les]{Remarque}
                    , ngerman     = {Erinnerung}{Erinnerungen}
                    , 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     = {Erinnerung}{Erinnerungen}
                    , 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-corollary } { combined = { definition ; corollary } }
\NameTheorem { definition-proposition } { combined = { definition ; proposition } }
\NameTheorem { definition-theorem } { combined = { definition ; theorem } }

\NameTheorem { corollary-definition } { combined = { corollary ; definition } }
\NameTheorem { proposition-definition } { combined = { proposition ; definition } }
\NameTheorem { theorem-definition } { combined = { theorem ; definition } }

\NameTheorem { applications }
  {
    , heading =   {
                    , english     = Applications
                    , french      = Applications
                    , ngerman     = Anwendungen
                    , italian     = Applicazioni
                    , portuguese  = Aplica����es
                    , brazilian   = Aplica����es
                    , spanish     = Aplicaciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������������
                  }
    , crefname =  {
                    , english     = {Applications}{Applications}
                    , french      = [les]{Applications}[les]{Applications}
                    , ngerman     = { {Anwendungen}{Anwendungen}
                                      , Nominativ = [die]{Anwendungen}[die]{Anwendungen}
                                      , Genitiv   = [der]{Anwendungen}[der]{Anwendungen}
                                      , Dativ     = [den]{Anwendungen}[den]{Anwendungen}
                                      , Akkusativ = [die]{Anwendungen}[die]{Anwendungen}
                                    }
                    , italian     = [le]{Applicazioni}[le]{Applicazioni}
                    , portuguese  = [as]{Aplica����es}[as]{Aplica����es}
                    , brazilian   = [as]{Aplica����es}[as]{Aplica����es}
                    , spanish     = [las]{Aplicaciones}[las]{Aplicaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
    , Crefname =  {
                    , english     = {Applications}{Applications}
                    , french      = [Les]{Applications}[Les]{Applications}
                    , ngerman     = { {Anwendungen}{Anwendungen}
                                      , Nominativ = [Die]{Anwendungen}[Die]{Anwendungen}
                                      , Genitiv   = [Der]{Anwendungen}[Der]{Anwendungen}
                                      , Dativ     = [Den]{Anwendungen}[Den]{Anwendungen}
                                      , Akkusativ = [Die]{Anwendungen}[Die]{Anwendungen}
                                    }
                    , italian     = [Le]{Applicazioni}[Le]{Applicazioni}
                    , portuguese  = [As]{Aplica����es}[As]{Aplica����es}
                    , brazilian   = [As]{Aplica����es}[As]{Aplica����es}
                    , spanish     = [Las]{Aplicaciones}[Las]{Aplicaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
  }

\NameTheorem { assertions }
  {
    , heading =   {
                    , english     = Assertions
                    , french      = Assertions
                    , ngerman     = Assertionen
                    , italian     = Asserzioni
                    , portuguese  = Asser����es
                    , brazilian   = Asser����es
                    , spanish     = Aserciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Assertions}{Assertions}
                    , french      = [les]{Assertions}[les]{Assertions}
                    , ngerman     = { {Assertionen}{Assertionen}
                                      , Nominativ = [die]{Assertionen}[die]{Assertionen}
                                      , Genitiv   = [der]{Assertionen}[der]{Assertionen}
                                      , Dativ     = [den]{Assertionen}[den]{Assertionen}
                                      , Akkusativ = [die]{Assertionen}[die]{Assertionen}
                                    }
                    , italian     = [le]{Asserzioni}[le]{Asserzioni}
                    , portuguese  = [as]{Asser����es}[as]{Asser����es}
                    , brazilian   = [as]{Asser����es}[as]{Asser����es}
                    , spanish     = [las]{Aserciones}[las]{Aserciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Assertions}{Assertions}
                    , french      = [Les]{Assertions}[Les]{Assertions}
                    , ngerman     = { {Assertionen}{Assertionen}
                                      , Nominativ = [Die]{Assertionen}[Die]{Assertionen}
                                      , Genitiv   = [Der]{Assertionen}[Der]{Assertionen}
                                      , Dativ     = [Den]{Assertionen}[Den]{Assertionen}
                                      , Akkusativ = [Die]{Assertionen}[Die]{Assertionen}
                                    }
                    , italian     = [Le]{Asserzioni}[Le]{Asserzioni}
                    , portuguese  = [As]{Asser����es}[As]{Asser����es}
                    , brazilian   = [As]{Asser����es}[As]{Asser����es}
                    , spanish     = [Las]{Aserciones}[Las]{Aserciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { assumptions }
  {
    , heading =   {
                    , english     = Assumptions
                    , french      = Suppositions
                    , ngerman     = Annahmen
                    , italian     = Supposizioni
                    , portuguese  = Suposi����es
                    , brazilian   = Suposi����es
                    , spanish     = Suposiciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������������������
                  }
    , crefname =  {
                    , english     = {Assumptions}{Assumptions}
                    , french      = [les]{Suppositions}[les]{Suppositions}
                    , ngerman     = { {Annahmen}{Annahmen}
                                      , Nominativ = [die]{Annahmen}[die]{Annahmen}
                                      , Genitiv   = [der]{Annahmen}[der]{Annahmen}
                                      , Dativ     = [den]{Annahmen}[den]{Annahmen}
                                      , Akkusativ = [die]{Annahmen}[die]{Annahmen}
                                    }
                    , italian     = [le]{Supposizioni}[le]{Supposizioni}
                    , portuguese  = [as]{Suposi����es}[as]{Suposi����es}
                    , brazilian   = [as]{Suposi����es}[as]{Suposi����es}
                    , spanish     = [las]{Suposiciones}[las]{Suposiciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������������}{��������������������������}
                  }
    , Crefname =  {
                    , english     = {Assumptions}{Assumptions}
                    , french      = [Les]{Suppositions}[Les]{Suppositions}
                    , ngerman     = { {Annahmen}{Annahmen}
                                      , Nominativ = [Die]{Annahmen}[Die]{Annahmen}
                                      , Genitiv   = [Der]{Annahmen}[Der]{Annahmen}
                                      , Dativ     = [Den]{Annahmen}[Den]{Annahmen}
                                      , Akkusativ = [Die]{Annahmen}[Die]{Annahmen}
                                    }
                    , italian     = [le]{Supposizioni}[le]{Supposizioni}
                    , portuguese  = [As]{Suposi����es}[As]{Suposi����es}
                    , brazilian   = [As]{Suposi����es}[As]{Suposi����es}
                    , spanish     = [Las]{Suposiciones}[Las]{Suposiciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������������}{��������������������������}
                  }
  }

\NameTheorem { axioms }
  {
    , heading =   {
                    , english     = Axioms
                    , french      = Axiomes
                    , ngerman     = Axiome
                    , italian     = Assiomi
                    , portuguese  = Axiomas
                    , brazilian   = Axiomas
                    , spanish     = Axiomas
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������
                  }
    , crefname =  {
                    , english     = {Axioms}{Axioms}
                    , french      = [les]{Axiomes}[les]{Axiomes}
                    , ngerman     = { {Axiome}{Axiome}
                                      , Nominativ = [die]{Axiome}[die]{Axiome}
                                      , Genitiv   = [der]{Axiome}[der]{Axiome}
                                      , Dativ     = [den]{Axiomen}[den]{Axiomen}
                                      , Akkusativ = [die]{Axiome}[die]{Axiome}
                                    }
                    , italian     = [gli]{Assiomi}[gli]{Assiomi}
                    , portuguese  = [os]{Axiomas}[os]{Axiomas}
                    , brazilian   = [os]{Axiomas}[os]{Axiomas}
                    , spanish     = [los]{Axiomas}[los]{Axiomas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
    , Crefname =  {
                    , english     = {Axioms}{Axioms}
                    , french      = [Les]{Axiomes}[Les]{Axiomes}
                    , ngerman     = { {Axiome}{Axiome}
                                      , Nominativ = [Die]{Axiome}[Die]{Axiome}
                                      , Genitiv   = [Der]{Axiome}[Der]{Axiome}
                                      , Dativ     = [Den]{Axiomen}[Den]{Axiomen}
                                      , Akkusativ = [Die]{Axiome}[Die]{Axiome}
                                    }
                    , italian     = [Gli]{Assiomi}[Gli]{Assiomi}
                    , portuguese  = [Os]{Axiomas}[Os]{Axiomas}
                    , brazilian   = [Os]{Axiomas}[Os]{Axiomas}
                    , spanish     = [Los]{Axiomas}[Los]{Axiomas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
  }

\NameTheorem { claims }
  {
    , heading =   {
                    , english     = Claims
                    , french      = Affirmations
                    , ngerman     = Behauptungen
                    , italian     = Affermazioni
                    , portuguese  = Afirma����es
                    , brazilian   = Afirma����es
                    , spanish     = Afirmaciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Claims}{Claims}
                    , french      = [les]{Affirmations}[les]{Affirmations}
                    , ngerman     = { {Behauptungen}{Behauptungen}
                                      , Nominativ = [die]{Behauptungen}[die]{Behauptungen}
                                      , Genitiv   = [der]{Behauptungen}[der]{Behauptungen}
                                      , Dativ     = [den]{Behauptungen}[den]{Behauptungen}
                                      , Akkusativ = [die]{Behauptungen}[die]{Behauptungen}
                                    }
                    , italian     = [le]{Affermazioni}[le]{Affermazioni}
                    , portuguese  = [as]{Afirma����es}[as]{Afirma����es}
                    , brazilian   = [as]{Afirma����es}[as]{Afirma����es}
                    , spanish     = [las]{Afirmaciones}[las]{Afirmaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Claims}{Claims}
                    , french      = [Les]{Affirmations}[Les]{Affirmations}
                    , ngerman     = { {Behauptungen}{Behauptungen}
                                      , Nominativ = [Die]{Behauptungen}[Die]{Behauptungen}
                                      , Genitiv   = [Der]{Behauptungen}[Der]{Behauptungen}
                                      , Dativ     = [Den]{Behauptungen}[Den]{Behauptungen}
                                      , Akkusativ = [Die]{Behauptungen}[Die]{Behauptungen}
                                    }
                    , italian     = [Le]{Affermazioni}[Le]{Affermazioni}
                    , portuguese  = [As]{Afirma����es}[As]{Afirma����es}
                    , brazilian   = [As]{Afirma����es}[As]{Afirma����es}
                    , spanish     = [Las]{Afirmaciones}[Las]{Afirmaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { commentaries }
  {
    , heading =   {
                    , english     = Commentaries
                    , french      = Commentaires
                    , ngerman     = Kommentare
                    , italian     = Commenti
                    , portuguese  = Coment��rios
                    , brazilian   = Coment��rios
                    , spanish     = Comentarios
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Commentaries}{Commentaries}
                    , french      = [les]{Commentaires}[les]{Commentaires}
                    , ngerman     = { {Kommentare}{Kommentare}
                                      , Nominativ = [die]{Kommentare}[die]{Kommentare}
                                      , Genitiv   = [der]{Kommentare}[der]{Kommentare}
                                      , Dativ     = [den]{Kommentaren}[den]{Kommentaren}
                                      , Akkusativ = [die]{Kommentare}[die]{Kommentare}
                                    }
                    , italian     = [i]{Commenti}[i]{Commenti}
                    , portuguese  = [os]{Coment��rios}[os]{Coment��rios}
                    , brazilian   = [os]{Coment��rios}[os]{Coment��rios}
                    , spanish     = [los]{Comentarios}[los]{Comentarios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Commentaries}{Commentaries}
                    , french      = [Les]{Commentaires}[Les]{Commentaires}
                    , ngerman     = { {Kommentare}{Kommentare}
                                      , Nominativ = [Die]{Kommentare}[Die]{Kommentare}
                                      , Genitiv   = [Der]{Kommentare}[Der]{Kommentare}
                                      , Dativ     = [Den]{Kommentaren}[Den]{Kommentaren}
                                      , Akkusativ = [Die]{Kommentare}[Die]{Kommentare}
                                    }
                    , italian     = [I]{Commenti}[I]{Commenti}
                    , portuguese  = [Os]{Coment��rios}[Os]{Coment��rios}
                    , brazilian   = [Os]{Coment��rios}[Os]{Coment��rios}
                    , spanish     = [Los]{Comentarios}[Los]{Comentarios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { conclusions }
  {
    , heading =   {
                    , english     = Conclusions
                    , french      = Conclusions
                    , ngerman     = Schlussfolgerungen
                    , italian     = Conclusioni
                    , portuguese  = Conclus��es
                    , brazilian   = Conclus��es
                    , spanish     = Conclusiones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ������������
                  }
    , crefname =  {
                    , english     = {Conclusions}{Conclusions}
                    , french      = [Les]{Conclusions}[Les]{Conclusions}
                    , ngerman     = { {Schlussfolgerungen}{Schlussfolgerungen}
                                      , Nominativ = [die]{Schlussfolgerungen}[die]{Schlussfolgerungen}
                                      , Genitiv   = [der]{Schlussfolgerungen}[der]{Schlussfolgerungen}
                                      , Dativ     = [den]{Schlussfolgerungen}[den]{Schlussfolgerungen}
                                      , Akkusativ = [die]{Schlussfolgerungen}[die]{Schlussfolgerungen}
                                    }
                    , italian     = [le]{Conclusioni}[le]{Conclusioni}
                    , portuguese  = [as]{Conclus��es}[as]{Conclus��es}
                    , brazilian   = [as]{Conclus��es}[as]{Conclus��es}
                    , spanish     = [las]{Conclusiones}[las]{Conclusiones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������}{������������}
                  }
    , Crefname =  {
                    , english     = {Conclusions}{Conclusions}
                    , french      = [Les]{Conclusions}[Les]{Conclusions}
                    , ngerman     = { {Schlussfolgerungen}{Schlussfolgerungen}
                                      , Nominativ = [Die]{Schlussfolgerungen}[Die]{Schlussfolgerungen}
                                      , Genitiv   = [Der]{Schlussfolgerungen}[Der]{Schlussfolgerungen}
                                      , Dativ     = [Den]{Schlussfolgerungen}[Den]{Schlussfolgerungen}
                                      , Akkusativ = [Die]{Schlussfolgerungen}[Die]{Schlussfolgerungen}
                                    }
                    , italian     = [Le]{Conclusioni}[Le]{Conclusioni}
                    , portuguese  = [As]{Conclus��es}[As]{Conclus��es}
                    , brazilian   = [As]{Conclus��es}[As]{Conclus��es}
                    , spanish     = [Las]{Conclusiones}[Las]{Conclusiones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������}{������������}
                  }
  }

\NameTheorem { conjectures }
  {
    , heading =   {
                    , english     = Conjectures
                    , french      = Conjectures
                    , ngerman     = Vermutungen
                    , italian     = Congetture
                    , portuguese  = Conjeturas
                    , brazilian   = Conjecturas
                    , spanish     = Conjeturas
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������
                  }
    , crefname =  {
                    , english     = {Conjectures}{Conjectures}
                    , french      = [les]{Conjectures}[les]{Conjectures}
                    , ngerman     = { {Vermutungen}{Vermutungen}
                                      , Nominativ = [die]{Vermutungen}[die]{Vermutungen}
                                      , Genitiv   = [der]{Vermutungen}[der]{Vermutungen}
                                      , Dativ     = [den]{Vermutungen}[den]{Vermutungen}
                                      , Akkusativ = [die]{Vermutungen}[die]{Vermutungen}
                                    }
                    , italian     = [le]{Congetture}[le]{Congetture}
                    , portuguese  = [as]{Conjeturas}[as]{Conjeturas}
                    , brazilian   = [as]{Conjecturas}[as]{Conjecturas}
                    , spanish     = [las]{Conjeturas}[las]{Conjeturas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������}{����������������}
                  }
    , Crefname =  {
                    , english     = {Conjectures}{Conjectures}
                    , french      = [Les]{Conjectures}[Les]{Conjectures}
                    , ngerman     = { {Vermutungen}{Vermutungen}
                                      , Nominativ = [Die]{Vermutungen}[Die]{Vermutungen}
                                      , Genitiv   = [Der]{Vermutungen}[Der]{Vermutungen}
                                      , Dativ     = [Den]{Vermutungen}[Den]{Vermutungen}
                                      , Akkusativ = [Die]{Vermutungen}[Die]{Vermutungen}
                                    }
                    , italian     = [Le]{Congetture}[Le]{Congetture}
                    , portuguese  = [As]{Conjeturas}[As]{Conjeturas}
                    , brazilian   = [As]{Conjecturas}[As]{Conjecturas}
                    , spanish     = [Las]{Conjeturas}[Las]{Conjeturas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������}{����������������}
                  }
  }

\NameTheorem { constructions }
  {
    , heading =   {
                    , english     = Constructions
                    , french      = Constructions
                    , ngerman     = Konstruktionen
                    , italian     = Costruzioni
                    , portuguese  = Constru����es
                    , brazilian   = Constru����es
                    , spanish     = Construcciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Constructions}{Constructions}
                    , french      = [les]{Constructions}[les]{Constructions}
                    , ngerman     = { {Konstruktionen}{Konstruktionen}
                                      , Nominativ = [die]{Konstruktionen}[die]{Konstruktionen}
                                      , Genitiv   = [der]{Konstruktionen}[der]{Konstruktionen}
                                      , Dativ     = [den]{Konstruktionen}[den]{Konstruktionen}
                                      , Akkusativ = [die]{Konstruktionen}[die]{Konstruktionen}
                                    }
                    , italian     = [le]{Costruzioni}[le]{Costruzioni}
                    , portuguese  = [as]{Constru����es}[as]{Constru����es}
                    , brazilian   = [as]{Constru����es}[as]{Constru����es}
                    , spanish     = [las]{Construcciones}[las]{Construcciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Constructions}{Constructions}
                    , french      = [Les]{Constructions}[Les]{Constructions}
                    , ngerman     = { {Konstruktionen}{Konstruktionen}
                                      , Nominativ = [Die]{Konstruktionen}[Die]{Konstruktionen}
                                      , Genitiv   = [Der]{Konstruktionen}[Der]{Konstruktionen}
                                      , Dativ     = [Den]{Konstruktionen}[Den]{Konstruktionen}
                                      , Akkusativ = [Die]{Konstruktionen}[Die]{Konstruktionen}
                                    }
                    , italian     = [Le]{Costruzioni}[Le]{Costruzioni}
                    , portuguese  = [As]{Constru����es}[As]{Constru����es}
                    , brazilian   = [As]{Constru����es}[As]{Constru����es}
                    , spanish     = [Las]{Construcciones}[Las]{Construcciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { conventions }
  {
    , heading =   {
                    , english     = Conventions
                    , french      = Conventions
                    , ngerman     = Konventionen
                    , italian     = Convenzioni
                    , portuguese  = Conven����es
                    , brazilian   = Conven����es
                    , spanish     = Convenciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Conventions}{Conventions}
                    , french      = [les]{Conventions}[les]{Conventions}
                    , ngerman     = { {Konventionen}{Konventionen}
                                      , Nominativ = [die]{Konventionen}[die]{Konventionen}
                                      , Genitiv   = [der]{Konventionen}[der]{Konventionen}
                                      , Dativ     = [den]{Konventionen}[den]{Konventionen}
                                      , Akkusativ = [die]{Konventionen}[die]{Konventionen}
                                    }
                    , italian     = [le]{Convenzioni}[le]{Convenzioni}
                    , portuguese  = [as]{Conven����es}[as]{Conven����es}
                    , brazilian   = [as]{Conven����es}[as]{Conven����es}
                    , spanish     = [las]{Convenciones}[las]{Convenciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
    , Crefname =  {
                    , english     = {Conventions}{Conventions}
                    , french      = [Les]{Conventions}[Les]{Conventions}
                    , ngerman     = { {Konventionen}{Konventionen}
                                      , Nominativ = [Die]{Konventionen}[Die]{Konventionen}
                                      , Genitiv   = [Der]{Konventionen}[Der]{Konventionen}
                                      , Dativ     = [Den]{Konventionen}[Den]{Konventionen}
                                      , Akkusativ = [Die]{Konventionen}[Die]{Konventionen}
                                    }
                    , italian     = [Le]{Convenzioni}[Le]{Convenzioni}
                    , portuguese  = [As]{Conven����es}[As]{Conven����es}
                    , brazilian   = [As]{Conven����es}[As]{Conven����es}
                    , spanish     = [Las]{Convenciones}[Las]{Convenciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
  }

\NameTheorem { corollaries }
  {
    , heading =   {
                    , english     = Corollaries
                    , french      = Corollaires
                    , ngerman     = Korollare
                    , italian     = Corollari
                    , portuguese  = Corol��rios
                    , brazilian   = Corol��rios
                    , spanish     = Corolarios
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ���
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Corollaries}{Corollaries}
                    , french      = [les]{Corollaires}[les]{Corollaires}
                    , ngerman     = { {Korollare}{Korollare}
                                      , Nominativ = [die]{Korollare}[die]{Korollare}
                                      , Genitiv   = [der]{Korollare}[der]{Korollare}
                                      , Dativ     = [den]{Korollaren}[den]{Korollaren}
                                      , Akkusativ = [die]{Korollare}[die]{Korollare}
                                    }
                    , italian     = [i]{Corollari}[i]{Corollari}
                    , portuguese  = [os]{Corol��rios}[os]{Corol��rios}
                    , brazilian   = [os]{Corol��rios}[os]{Corol��rios}
                    , spanish     = [los]{Corolarios}[los]{Corolarios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {���}{���}
                    , russian     = {������������������}{������������������}
                  }
    , Crefname =  {
                    , english     = {Corollaries}{Corollaries}
                    , french      = [Les]{Corollaires}[Les]{Corollaires}
                    , ngerman     = { {Korollare}{Korollare}
                                      , Nominativ = [Die]{Korollare}[Die]{Korollare}
                                      , Genitiv   = [Der]{Korollare}[Der]{Korollare}
                                      , Dativ     = [Den]{Korollaren}[Den]{Korollaren}
                                      , Akkusativ = [Die]{Korollare}[Die]{Korollare}
                                    }
                    , italian     = [I]{Corollari}[I]{Corollari}
                    , portuguese  = [Os]{Corol��rios}[Os]{Corol��rios}
                    , brazilian   = [Os]{Corol��rios}[Os]{Corol��rios}
                    , spanish     = [Los]{Corolarios}[Los]{Corolarios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {���}{���}
                    , russian     = {������������������}{������������������}
                  }
  }

\NameTheorem { definitions }
  {
    , heading =   {
                    , english     = Definitions
                    , french      = D��finitions
                    , ngerman     = Definitionen
                    , italian     = Definizioni
                    , portuguese  = Defini����es
                    , brazilian   = Defini����es
                    , spanish     = Definiciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Definitions}{Definitions}
                    , french      = [les]{D��finitions}[les]{D��finitions}
                    , ngerman     = { {Definitionen}{Definitionen}
                                      , Nominativ = [die]{Definitionen}[die]{Definitionen}
                                      , Genitiv   = [der]{Definitionen}[der]{Definitionen}
                                      , Dativ     = [den]{Definitionen}[den]{Definitionen}
                                      , Akkusativ = [die]{Definitionen}[die]{Definitionen}
                                    }
                    , italian     = [le]{Definizioni}[le]{Definizioni}
                    , portuguese  = [as]{Defini����es}[as]{Defini����es}
                    , brazilian   = [as]{Defini����es}[as]{Defini����es}
                    , spanish     = [las]{Definiciones}[las]{Definiciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Definitions}{Definitions}
                    , french      = [Les]{D��finitions}[Les]{D��finitions}
                    , ngerman     = { {Definitionen}{Definitionen}
                                      , Nominativ = [Die]{Definitionen}[Die]{Definitionen}
                                      , Genitiv   = [Der]{Definitionen}[Der]{Definitionen}
                                      , Dativ     = [Den]{Definitionen}[Den]{Definitionen}
                                      , Akkusativ = [Die]{Definitionen}[Die]{Definitionen}
                                    }
                    , italian     = [Le]{Definizioni}[Le]{Definizioni}
                    , portuguese  = [As]{Defini����es}[As]{Defini����es}
                    , brazilian   = [As]{Defini����es}[As]{Defini����es}
                    , spanish     = [Las]{Definiciones}[Las]{Definiciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { examples }
  {
    , heading =   {
                    , english     = Examples
                    , french      = Exemples
                    , ngerman     = Beispiele
                    , italian     = Esempi
                    , portuguese  = Exemplos
                    , brazilian   = Exemplos
                    , spanish     = Ejemplos
                    , schinese    = ���
                    , tchinese    = ���
                    , japanese    = ���
                    , russian     = ��������������
                  }
    , crefname =  {
                    , english     = {Examples}{Examples}
                    , french      = [les]{Exemples}[les]{Exemples}
                    , ngerman     = { {Beispiele}{Beispiele}
                                      , Nominativ = [die]{Beispiele}[die]{Beispiele}
                                      , Genitiv   = [der]{Beispiele}[der]{Beispiele}
                                      , Dativ     = [den]{Beispielen}[den]{Beispielen}
                                      , Akkusativ = [die]{Beispiele}[die]{Beispiele}
                                    }
                    , italian     = [gli]{Esempi}[gli]{Esempi}
                    , portuguese  = [os]{Exemplos}[os]{Exemplos}
                    , brazilian   = [os]{Exemplos}[os]{Exemplos}
                    , spanish     = [los]{Ejemplos}[los]{Ejemplos}
                    , schinese    = {���}{���}
                    , tchinese    = {���}{���}
                    , japanese    = {���}{���}
                    , russian     = {��������������}{��������������}
                  }
    , Crefname =  {
                    , english     = {Examples}{Examples}
                    , french      = [Les]{Exemples}[Les]{Exemples}
                    , ngerman     = { {Beispiele}{Beispiele}
                                      , Nominativ = [Die]{Beispiele}[Die]{Beispiele}
                                      , Genitiv   = [Der]{Beispiele}[Der]{Beispiele}
                                      , Dativ     = [Den]{Beispielen}[Den]{Beispielen}
                                      , Akkusativ = [Die]{Beispiele}[Die]{Beispiele}
                                    }
                    , italian     = [Gli]{Esempi}[Gli]{Esempi}
                    , portuguese  = [Os]{Exemplos}[Os]{Exemplos}
                    , brazilian   = [Os]{Exemplos}[Os]{Exemplos}
                    , spanish     = [Los]{Ejemplos}[Los]{Ejemplos}
                    , schinese    = {���}{���}
                    , tchinese    = {���}{���}
                    , japanese    = {���}{���}
                    , russian     = {��������������}{��������������}
                  }
  }

\NameTheorem { exercises }
  {
    , heading =   {
                    , english     = Exercises
                    , french      = Exercices
                    , ngerman     = ��Bungen
                    , italian     = Esercizi
                    , portuguese  = Exerc��cios
                    , brazilian   = Exerc��cios
                    , spanish     = Ejercicios
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������������
                  }
    , crefname =  {
                    , english     = {Exercises}{Exercises}
                    , french      = [les]{Exercices}[les]{Exercices}
                    , ngerman     = { {��bungen}{��bungen}
                                      , Nominativ = [die]{��bungen}[die]{��bungen}
                                      , Genitiv   = [der]{��bungen}[der]{��bungen}
                                      , Dativ     = [den]{��bungen}[den]{��bungen}
                                      , Akkusativ = [die]{��bungen}[die]{��bungen}
                                    }
                    , italian     = [gli]{Esercizi}[gli]{Esercizi}
                    , portuguese  = [os]{Exerc��cios}[os]{Exerc��cios}
                    , brazilian   = [os]{Exerc��cios}[os]{Exerc��cios}
                    , spanish     = [los]{Ejercicios}[los]{Ejercicios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
    , Crefname =  {
                    , english     = {Exercises}{Exercises}
                    , french      = [Les]{Exercices}[Les]{Exercices}
                    , ngerman     = { {��bungen}{��bungen}
                                      , Nominativ = [Die]{��bungen}[Die]{��bungen}
                                      , Genitiv   = [Der]{��bungen}[Der]{��bungen}
                                      , Dativ     = [Den]{��bungen}[Den]{��bungen}
                                      , Akkusativ = [Die]{��bungen}[Die]{��bungen}
                                    }
                    , italian     = [Gli]{Esercizi}[Gli]{Esercizi}
                    , portuguese  = [Os]{Exerc��cios}[Os]{Exerc��cios}
                    , brazilian   = [Os]{Exerc��cios}[Os]{Exerc��cios}
                    , spanish     = [Los]{Ejercicios}[Los]{Ejercicios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
  }

\NameTheorem { facts }
  {
    , heading =   {
                    , english     = Facts
                    , french      = Faits
                    , ngerman     = Tatsachen
                    , italian     = Fatti
                    , portuguese  = Factos
                    , brazilian   = Fatos
                    , spanish     = Hechos
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������
                  }
    , crefname =  {
                    , english     = {Facts}{Facts}
                    , french      = [les]{Faits}[les]{Faits}
                    , ngerman     = { {Tatsachen}{Tatsachen}
                                      , Nominativ = [die]{Tatsachen}[die]{Tatsachen}
                                      , Genitiv   = [der]{Tatsachen}[der]{Tatsachen}
                                      , Dativ     = [den]{Tatsachen}[den]{Tatsachen}
                                      , Akkusativ = [die]{Tatsachen}[die]{Tatsachen}
                                    }
                    , italian     = [i]{Fatti}[i]{Fatti}
                    , portuguese  = [os]{Factos}[os]{Factos}
                    , brazilian   = [os]{Fatos}[os]{Fatos}
                    , spanish     = [los]{Hechos}[los]{Hechos}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������}{����������}
                  }
    , Crefname =  {
                    , english     = {Facts}{Facts}
                    , french      = [Les]{Faits}[Les]{Faits}
                    , ngerman     = { {Tatsachen}{Tatsachen}
                                      , Nominativ = [Die]{Tatsachen}[Die]{Tatsachen}
                                      , Genitiv   = [Der]{Tatsachen}[Der]{Tatsachen}
                                      , Dativ     = [Den]{Tatsachen}[Den]{Tatsachen}
                                      , Akkusativ = [Die]{Tatsachen}[Die]{Tatsachen}
                                    }
                    , italian     = [I]{Fatti}[I]{Fatti}
                    , portuguese  = [Os]{Factos}[Os]{Factos}
                    , brazilian   = [Os]{Fatos}[Os]{Fatos}
                    , spanish     = [Los]{Hechos}[Los]{Hechos}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������}{����������}
                  }
  }

\NameTheorem { hypotheses }
  {
    , heading =   {
                    , english     = Hypotheses
                    , french      = Hypoth��ses
                    , ngerman     = Hypothesen
                    , italian     = Ipotesi
                    , portuguese  = Hip��teses
                    , brazilian   = Hip��teses
                    , spanish     = Hip��tesis
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������
                  }
    , crefname =  {
                    , english     = {Hypotheses}{Hypotheses}
                    , french      = [les]{Hypoth��ses}[les]{Hypoth��ses}
                    , ngerman     = { {Hypothesen}{Hypothesen}
                                      , Nominativ = [die]{Hypothesen}[die]{Hypothesen}
                                      , Genitiv   = [der]{Hypothesen}[der]{Hypothesen}
                                      , Dativ     = [den]{Hypothesen}[den]{Hypothesen}
                                      , Akkusativ = [die]{Hypothesen}[die]{Hypothesen}
                                    }
                    , italian     = [le]{Ipotesi}[le]{Ipotesi}
                    , portuguese  = [as]{Hip��teses}[as]{Hip��teses}
                    , brazilian   = [as]{Hip��teses}[as]{Hip��teses}
                    , spanish     = [las]{Hip��tesis}[las]{Hip��tesis}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������}{����������������}
                  }
    , Crefname =  {
                    , english     = {Hypotheses}{Hypotheses}
                    , french      = [Les]{Hypoth��ses}[Les]{Hypoth��ses}
                    , ngerman     = { {Hypothesen}{Hypothesen}
                                      , Nominativ = [Die]{Hypothesen}[Die]{Hypothesen}
                                      , Genitiv   = [Der]{Hypothesen}[Der]{Hypothesen}
                                      , Dativ     = [Den]{Hypothesen}[Den]{Hypothesen}
                                      , Akkusativ = [Die]{Hypothesen}[Die]{Hypothesen}
                                    }
                    , italian     = [Le]{Ipotesi}[Le]{Ipotesi}
                    , portuguese  = [As]{Hip��teses}[As]{Hip��teses}
                    , brazilian   = [As]{Hip��teses}[As]{Hip��teses}
                    , spanish     = [Las]{Hip��tesis}[Las]{Hip��tesis}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������}{����������������}
                  }
  }

\NameTheorem { lemmas }
  {
    , heading   = {
                    , english     = Lemmas
                    , french      = Lemmes
                    , ngerman     = Lemmata
                    , italian     = Lemmi
                    , portuguese  = Lemas
                    , brazilian   = Lemas
                    , spanish     = Lemas
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������
                  }
    , crefname  = {
                    , english     = {Lemmas}{Lemmas}
                    , french      = [les]{Lemmes}[les]{Lemmes}
                    , ngerman     = { {Lemmata}{Lemmata}
                                      , Nominativ = [die]{Lemmata}[die]{Lemmata}
                                      , Genitiv   = [der]{Lemmata}[der]{Lemmata}
                                      , Dativ     = [den]{Lemmata}[den]{Lemmata}
                                      , Akkusativ = [die]{Lemmata}[die]{Lemmata}
                                    }
                    , italian     = [i]{Lemmi}[i]{Lemmi}
                    , portuguese  = [os]{Lemas}[os]{Lemas}
                    , brazilian   = [os]{Lemas}[os]{Lemas}
                    , spanish     = [las]{Lemas}[las]{Lemas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������}{����������}
                  }
    , Crefname  = {
                    , english     = {Lemmas}{Lemmas}
                    , french      = [Les]{Lemmes}[Les]{Lemmes}
                    , ngerman     = { {Lemmata}{Lemmata}
                                      , Nominativ = [Die]{Lemmata}[Die]{Lemmata}
                                      , Genitiv   = [Der]{Lemmata}[Der]{Lemmata}
                                      , Dativ     = [Den]{Lemmata}[Den]{Lemmata}
                                      , Akkusativ = [Die]{Lemmata}[Die]{Lemmata}
                                    }
                    , italian     = [I]{Lemmi}[I]{Lemmi}
                    , portuguese  = [Os]{Lemas}[Os]{Lemas}
                    , brazilian   = [Os]{Lemas}[Os]{Lemas}
                    , spanish     = [las]{Lemas}[las]{Lemas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������}{����������}
                  }
  }

\NameTheorem { motivations }
  {
    , heading =   {
                    , english     = Motivations
                    , french      = Motivations
                    , ngerman     = Motivationen
                    , italian     = Motivazioni
                    , portuguese  = Motiva����es
                    , brazilian   = Motiva����es
                    , spanish     = Motivaciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Motivations}{Motivations}
                    , french      = [les]{Motivations}[les]{Motivations}
                    , ngerman     = { {Motivationen}{Motivationen}
                                      , Nominativ = [die]{Motivationen}[die]{Motivationen}
                                      , Genitiv   = [der]{Motivationen}[der]{Motivationen}
                                      , Dativ     = [den]{Motivationen}[den]{Motivationen}
                                      , Akkusativ = [die]{Motivationen}[die]{Motivationen}
                                    }
                    , italian     = [le]{Motivazioni}[le]{Motivazioni}
                    , portuguese  = [as]{Motiva����es}[as]{Motiva����es}
                    , brazilian   = [as]{Motiva����es}[as]{Motiva����es}
                    , spanish     = [las]{Motivaciones}[las]{Motivaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
    , Crefname =  {
                    , english     = {Motivations}{Motivations}
                    , french      = [Les]{Motivations}[Les]{Motivations}
                    , ngerman     = { {Motivationen}{Motivationen}
                                      , Nominativ = [Die]{Motivationen}[Die]{Motivationen}
                                      , Genitiv   = [Der]{Motivationen}[Der]{Motivationen}
                                      , Dativ     = [Den]{Motivationen}[Den]{Motivationen}
                                      , Akkusativ = [Die]{Motivationen}[Die]{Motivationen}
                                    }
                    , italian     = [Le]{Motivazioni}[Le]{Motivazioni}
                    , portuguese  = [As]{Motiva����es}[As]{Motiva����es}
                    , brazilian   = [As]{Motiva����es}[As]{Motiva����es}
                    , spanish     = [Las]{Motivaciones}[Las]{Motivaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
  }

\NameTheorem { notations }
  {
    , heading =   {
                    , english     = Notations
                    , french      = Notations
                    , ngerman     = Notationen
                    , italian     = Notazioni
                    , portuguese  = Nota����es
                    , brazilian   = Nota����es
                    , spanish     = Notaciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������
                  }
    , crefname =  {
                    , english     = {Notations}{Notations}
                    , french      = [les]{Notations}[les]{Notations}
                    , ngerman     = { {Notationen}{Notationen}
                                      , Nominativ = [die]{Notationen}[die]{Notationen}
                                      , Genitiv   = [der]{Notationen}[der]{Notationen}
                                      , Dativ     = [den]{Notationen}[den]{Notationen}
                                      , Akkusativ = [die]{Notationen}[die]{Notationen}
                                    }
                    , italian     = [le]{Notazioni}[le]{Notazioni}
                    , portuguese  = [as]{Nota����es}[as]{Nota����es}
                    , brazilian   = [as]{Nota����es}[as]{Nota����es}
                    , spanish     = [las]{Notaciones}[las]{Notaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
    , Crefname =  {
                    , english     = {Notations}{Notations}
                    , french      = [Les]{Notations}[Les]{Notations}
                    , ngerman     = { {Notationen}{Notationen}
                                      , Nominativ = [Die]{Notationen}[Die]{Notationen}
                                      , Genitiv   = [Der]{Notationen}[Der]{Notationen}
                                      , Dativ     = [Den]{Notationen}[Den]{Notationen}
                                      , Akkusativ = [Die]{Notationen}[Die]{Notationen}
                                    }
                    , italian     = [Le]{Notazioni}[Le]{Notazioni}
                    , portuguese  = [As]{Nota����es}[As]{Nota����es}
                    , brazilian   = [As]{Nota����es}[As]{Nota����es}
                    , spanish     = [Las]{Notaciones}[Las]{Notaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
  }

\NameTheorem { observations }
  {
    , heading =   {
                    , english     = Observations
                    , french      = Observations
                    , ngerman     = Beobachtungen
                    , italian     = Osservazioni
                    , portuguese  = Observa����es
                    , brazilian   = Observa����es
                    , spanish     = Observaciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������������
                  }
    , crefname =  {
                    , english     = {Observations}{Observations}
                    , french      = [les]{Observations}[les]{Observations}
                    , ngerman     = { {Beobachtungen}{Beobachtungen}
                                      , Nominativ = [die]{Beobachtungen}[die]{Beobachtungen}
                                      , Genitiv   = [der]{Beobachtungen}[der]{Beobachtungen}
                                      , Dativ     = [den]{Beobachtungen}[den]{Beobachtungen}
                                      , Akkusativ = [die]{Beobachtungen}[die]{Beobachtungen}
                                    }
                    , italian     = [le]{Osservazioni}[le]{Osservazioni}
                    , portuguese  = [as]{Observa����es}[as]{Observa����es}
                    , brazilian   = [as]{Observa����es}[as]{Observa����es}
                    , spanish     = [las]{Observaciones}[las]{Observaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
    , Crefname =  {
                    , english     = {Observations}{Observations}
                    , french      = [Les]{Observations}[Les]{Observations}
                    , ngerman     = { {Beobachtungen}{Beobachtungen}
                                      , Nominativ = [Die]{Beobachtungen}[Die]{Beobachtungen}
                                      , Genitiv   = [Der]{Beobachtungen}[Der]{Beobachtungen}
                                      , Dativ     = [Den]{Beobachtungen}[Den]{Beobachtungen}
                                      , Akkusativ = [Die]{Beobachtungen}[Die]{Beobachtungen}
                                    }
                    , italian     = [Le]{Osservazioni}[Le]{Osservazioni}
                    , portuguese  = [As]{Observa����es}[As]{Observa����es}
                    , brazilian   = [As]{Observa����es}[As]{Observa����es}
                    , spanish     = [Las]{Observaciones}[Las]{Observaciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������������}{��������������������}
                  }
  }

\NameTheorem { postulates }
  {
    , heading =   {
                    , english     = Postulates
                    , french      = Postulats
                    , ngerman     = Postulate
                    , italian     = Postulati
                    , portuguese  = Postulados
                    , brazilian   = Postulados
                    , spanish     = Postulados
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Postulates}{Postulates}
                    , french      = [les]{Postulats}[les]{Postulats}
                    , ngerman     = { {Postulate}{Postulate}
                                      , Nominativ = [die]{Postulate}[die]{Postulate}
                                      , Genitiv   = [der]{Postulate}[der]{Postulate}
                                      , Dativ     = [den]{Postulaten}[den]{Postulaten}
                                      , Akkusativ = [die]{Postulate}[die]{Postulate}
                                    }
                    , italian     = [i]{Postulati}[i]{Postulati}
                    , portuguese  = [os]{Postulados}[os]{Postulados}
                    , brazilian   = [os]{Postulados}[os]{Postulados}
                    , spanish     = [los]{Postulados}[los]{Postulados}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
    , Crefname =  {
                    , english     = {Postulates}{Postulates}
                    , french      = [Les]{Postulats}[Les]{Postulats}
                    , ngerman     = { {Postulate}{Postulate}
                                      , Nominativ = [Die]{Postulate}[Die]{Postulate}
                                      , Genitiv   = [Der]{Postulate}[Der]{Postulate}
                                      , Dativ     = [Den]{Postulaten}[Den]{Postulaten}
                                      , Akkusativ = [Die]{Postulate}[Die]{Postulate}
                                    }
                    , italian     = [I]{Postulati}[I]{Postulati}
                    , portuguese  = [Os]{Postulados}[Os]{Postulados}
                    , brazilian   = [Os]{Postulados}[Os]{Postulados}
                    , spanish     = [Los]{Postulados}[Los]{Postulados}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
  }

\NameTheorem { problems }
  {
    , heading =   {
                    , english     = Problems
                    , french      = Probl��mes
                    , ngerman     = Probleme
                    , italian     = Problemi
                    , portuguese  = Problemas
                    , brazilian   = Problemas
                    , spanish     = Problemas
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������
                  }
    , crefname =  {
                    , english     = {Problems}{Problems}
                    , french      = [les]{Probl��mes}[les]{Probl��mes}
                    , ngerman     = { {Probleme}{Probleme}
                                      , Nominativ = [die]{Probleme}[die]{Probleme}
                                      , Genitiv   = [der]{Probleme}[der]{Probleme}
                                      , Dativ     = [den]{Problemen}[den]{Problemen}
                                      , Akkusativ = [die]{Probleme}[die]{Probleme}
                                    }
                    , italian     = [i]{Problemi}[i]{Problemi}
                    , portuguese  = [os]{Problemas}[os]{Problemas}
                    , brazilian   = [os]{Problemas}[os]{Problemas}
                    , spanish     = [los]{Problemas}[los]{Problemas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������}{����������������}
                  }
    , Crefname =  {
                    , english     = {Problems}{Problems}
                    , french      = [Les]{Probl��mes}[Les]{Probl��mes}
                    , ngerman     = { {Probleme}{Probleme}
                                      , Nominativ = [Die]{Probleme}[Die]{Probleme}
                                      , Genitiv   = [Der]{Probleme}[Der]{Probleme}
                                      , Dativ     = [Den]{Problemen}[Den]{Problemen}
                                      , Akkusativ = [Die]{Probleme}[Die]{Probleme}
                                    }
                    , italian     = [I]{Problemi}[I]{Problemi}
                    , portuguese  = [Os]{Problemas}[Os]{Problemas}
                    , brazilian   = [Os]{Problemas}[Os]{Problemas}
                    , spanish     = [Los]{Problemas}[Los]{Problemas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������}{����������������}
                  }
  }

\NameTheorem { properties }
  {
    , heading =   {
                    , english     = Properties
                    , french      = Propri��t��s
                    , ngerman     = Eigenschaften
                    , italian     = Propriet��
                    , portuguese  = Propriedades
                    , brazilian   = Propriedades
                    , spanish     = Propiedades
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Properties}{Properties}
                    , french      = [les]{Propri��t��s}[les]{Propri��t��s}
                    , ngerman     = { {Eigenschaften}{Eigenschaften}
                                      , Nominativ = [die]{Eigenschaften}[die]{Eigenschaften}
                                      , Genitiv   = [der]{Eigenschaften}[der]{Eigenschaften}
                                      , Dativ     = [den]{Eigenschaften}[den]{Eigenschaften}
                                      , Akkusativ = [die]{Eigenschaften}[die]{Eigenschaften}
                                    }
                    , italian     = [le]{Propriet��}[le]{Propriet��}
                    , portuguese  = [as]{Propriedades}[as]{Propriedades}
                    , brazilian   = [as]{Propriedades}[as]{Propriedades}
                    , spanish     = [las]{Propiedades}[las]{Propiedades}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
    , Crefname =  {
                    , english     = {Properties}{Properties}
                    , french      = [Les]{Propri��t��s}[Les]{Propri��t��s}
                    , ngerman     = { {Eigenschaften}{Eigenschaften}
                                      , Nominativ = [Die]{Eigenschaften}[Die]{Eigenschaften}
                                      , Genitiv   = [Der]{Eigenschaften}[Der]{Eigenschaften}
                                      , Dativ     = [Den]{Eigenschaften}[Den]{Eigenschaften}
                                      , Akkusativ = [Die]{Eigenschaften}[Die]{Eigenschaften}
                                    }
                    , italian     = [Le]{Propriet��}[Le]{Propriet��}
                    , portuguese  = [As]{Propriedades}[As]{Propriedades}
                    , brazilian   = [As]{Propriedades}[As]{Propriedades}
                    , spanish     = [Las]{Propiedades}[Las]{Propiedades}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
  }

\NameTheorem { propositions }
  {
    , heading =   {
                    , english     = Propositions
                    , french      = Propositions
                    , ngerman     = Propositionen
                    , italian     = Proposte
                    , portuguese  = Proposi����es
                    , brazilian   = Proposi����es
                    , spanish     = Proposiciones
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Propositions}{Propositions}
                    , french      = [les]{Propositions}[les]{Propositions}
                    , ngerman     = { {Propositionen}{Propositionen}
                                      , Nominativ = [die]{Propositionen}[die]{Propositionen}
                                      , Genitiv   = [der]{Propositionen}[der]{Propositionen}
                                      , Dativ     = [den]{Propositionen}[den]{Propositionen}
                                      , Akkusativ = [die]{Propositionen}[die]{Propositionen}
                                    }
                    , italian     = [le]{Proposte}[le]{Proposte}
                    , portuguese  = [as]{Proposi����es}[as]{Proposi����es}
                    , brazilian   = [as]{Proposi����es}[as]{Proposi����es}
                    , spanish     = [las]{Proposiciones}[las]{Proposiciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Propositions}{Propositions}
                    , french      = [Les]{Propositions}[Les]{Propositions}
                    , ngerman     = { {Propositionen}{Propositionen}
                                      , Nominativ = [Die]{Propositionen}[Die]{Propositionen}
                                      , Genitiv   = [Der]{Propositionen}[Der]{Propositionen}
                                      , Dativ     = [Den]{Propositionen}[Den]{Propositionen}
                                      , Akkusativ = [Die]{Propositionen}[Die]{Propositionen}
                                    }
                    , italian     = [Le]{Proposte}[Le]{Proposte}
                    , portuguese  = [As]{Proposi����es}[As]{Proposi����es}
                    , brazilian   = [As]{Proposi����es}[As]{Proposi����es}
                    , spanish     = [Las]{Proposiciones}[Las]{Proposiciones}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { questions }
  {
    , heading =   {
                    , english     = Questions
                    , french      = Questions
                    , ngerman     = Fragen
                    , italian     = Domande
                    , portuguese  = Perguntas
                    , brazilian   = Perguntas
                    , spanish     = Preguntas
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������
                  }
    , crefname =  {
                    , english     = {Questions}{Questions}
                    , french      = [les]{Questions}[les]{Questions}
                    , ngerman     = { {Fragen}{Fragen}
                                      , Nominativ = [die]{Fragen}[die]{Fragen}
                                      , Genitiv   = [der]{Fragen}[der]{Fragen}
                                      , Dativ     = [den]{Fragen}[den]{Fragen}
                                      , Akkusativ = [die]{Fragen}[die]{Fragen}
                                    }
                    , italian     = [le]{Domande}[le]{Domande}
                    , portuguese  = [as]{Perguntas}[as]{Perguntas}
                    , brazilian   = [as]{Perguntas}[as]{Perguntas}
                    , spanish     = [las]{Preguntas}[las]{Preguntas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
    , Crefname =  {
                    , english     = {Questions}{Questions}
                    , french      = [Les]{Questions}[Les]{Questions}
                    , ngerman     = { {Fragen}{Fragen}
                                      , Nominativ = [Die]{Fragen}[Die]{Fragen}
                                      , Genitiv   = [Der]{Fragen}[Der]{Fragen}
                                      , Dativ     = [Den]{Fragen}[Den]{Fragen}
                                      , Akkusativ = [Die]{Fragen}[Die]{Fragen}
                                    }
                    , italian     = [Le]{Domande}[Le]{Domande}
                    , portuguese  = [As]{Perguntas}[As]{Perguntas}
                    , brazilian   = [As]{Perguntas}[As]{Perguntas}
                    , spanish     = [Las]{Preguntas}[Las]{Preguntas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
  }

\NameTheorem { recalls }
  {
    , heading =   {
                    , english     = Recalls
                    , french      = Rappels
                    , ngerman     = Erinnerungen
                    , italian     = Richiami
                    , portuguese  = Recorda����es
                    , brazilian   = Recorda����es
                    , spanish     = Recuerdos
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ����������������������
                  }
    , crefname =  {
                    , english     = {Recalls}{Recalls}
                    , french      = [les]{Rappels}[les]{Rappels}
                    , ngerman     = { {Erinnerungen}{Erinnerungen}
                                      , Nominativ = [die]{Erinnerungen}[die]{Erinnerungen}
                                      , Genitiv   = [der]{Erinnerungen}[der]{Erinnerungen}
                                      , Dativ     = [den]{Erinnerungen}[den]{Erinnerungen}
                                      , Akkusativ = [die]{Erinnerungen}[die]{Erinnerungen}
                                    }
                    , italian     = [i]{Richiami}[i]{Richiami}
                    , portuguese  = [as]{Recorda����es}[as]{Recorda����es}
                    , brazilian   = [as]{Recorda����es}[as]{Recorda����es}
                    , spanish     = [los]{Recuerdos}[los]{Recuerdos}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
    , Crefname =  {
                    , english     = {Recalls}{Recalls}
                    , french      = [Les]{Rappels}[Les]{Rappels}
                    , ngerman     = { {Erinnerungen}{Erinnerungen}
                                      , Nominativ = [Die]{Erinnerungen}[Die]{Erinnerungen}
                                      , Genitiv   = [Der]{Erinnerungen}[Der]{Erinnerungen}
                                      , Dativ     = [Den]{Erinnerungen}[Den]{Erinnerungen}
                                      , Akkusativ = [Die]{Erinnerungen}[Die]{Erinnerungen}
                                    }
                    , italian     = [I]{Richiami}[I]{Richiami}
                    , portuguese  = [As]{Recorda����es}[As]{Recorda����es}
                    , brazilian   = [As]{Recorda����es}[As]{Recorda����es}
                    , spanish     = [Los]{Recuerdos}[Los]{Recuerdos}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {����������������������}{����������������������}
                  }
  }

\NameTheorem { remarks }
  {
    , heading =   {
                    , english     = Remarks
                    , french      = Remarques
                    , ngerman     = Bemerkungen
                    , italian     = Commenti
                    , portuguese  = Coment��rios
                    , brazilian   = Coment��rios
                    , spanish     = Comentarios
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ������������������
                  }
    , crefname =  {
                    , english     = {Remarks}{Remarks}
                    , french      = [les]{Remarques}[les]{Remarques}
                    , ngerman     = { {Bemerkungen}{Bemerkungen}
                                      , Nominativ = [die]{Bemerkungen}[die]{Bemerkungen}
                                      , Genitiv   = [der]{Bemerkungen}[der]{Bemerkungen}
                                      , Dativ     = [den]{Bemerkungen}[den]{Bemerkungen}
                                      , Akkusativ = [die]{Bemerkungen}[die]{Bemerkungen}
                                    }
                    , italian     = [i]{Commenti}[i]{Commenti}
                    , portuguese  = [os]{Coment��rios}[os]{Coment��rios}
                    , brazilian   = [os]{Coment��rios}[os]{Coment��rios}
                    , spanish     = [los]{Comentarios}[los]{Comentarios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
    , Crefname =  {
                    , english     = {Remarks}{Remarks}
                    , french      = [Les]{Remarques}[Les]{Remarques}
                    , ngerman     = { {Bemerkungen}{Bemerkungen}
                                      , Nominativ = [Die]{Bemerkungen}[Die]{Bemerkungen}
                                      , Genitiv   = [Der]{Bemerkungen}[Der]{Bemerkungen}
                                      , Dativ     = [Den]{Bemerkungen}[Den]{Bemerkungen}
                                      , Akkusativ = [Die]{Bemerkungen}[Die]{Bemerkungen}
                                    }
                    , italian     = [I]{Commenti}[I]{Commenti}
                    , portuguese  = [Os]{Coment��rios}[Os]{Coment��rios}
                    , brazilian   = [Os]{Coment��rios}[Os]{Coment��rios}
                    , spanish     = [Los]{Comentarios}[Los]{Comentarios}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {������������������}{������������������}
                  }
  }

\NameTheorem { theorems }
  {
    , heading =   {
                    , english     = Theorems
                    , french      = Th��or��mes
                    , ngerman     = S��tze
                    , italian     = Teoremi
                    , portuguese  = Teoremas
                    , brazilian   = Teoremas
                    , spanish     = Teoremas
                    , schinese    = ������
                    , tchinese    = ������
                    , japanese    = ������
                    , russian     = ��������������
                  }
    , crefname =  {
                    , english     = {Theorems}{Theorems}
                    , french      = [les]{Th��or��mes}[les]{Th��or��mes}
                    , ngerman     = { {S��tze}{S��tze}
                                      , Nominativ = [die]{S��tze}[die]{S��tze}
                                      , Genitiv   = [der]{S��tze}[der]{S��tze}
                                      , Dativ     = [den]{S��tzen}[den]{S��tzen}
                                      , Akkusativ = [die]{S��tze}[die]{S��tze}
                                    }
                    , italian     = [i]{Teoremi}[i]{Teoremi}
                    , portuguese  = [os]{Teoremas}[os]{Teoremas}
                    , brazilian   = [os]{Teoremas}[os]{Teoremas}
                    , spanish     = [los]{Teoremas}[los]{Teoremas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
    , Crefname =  {
                    , english     = {Theorems}{Theorems}
                    , french      = [Les]{Th��or��mes}[Les]{Th��or��mes}
                    , ngerman     = { {S��tze}{S��tze}
                                      , Nominativ = [Die]{S��tze}[Die]{S��tze}
                                      , Genitiv   = [Der]{S��tze}[Der]{S��tze}
                                      , Dativ     = [Den]{S��tzen}[Den]{S��tzen}
                                      , Akkusativ = [Die]{S��tze}[Die]{S��tze}
                                    }
                    , italian     = [I]{Teoremi}[I]{Teoremi}
                    , portuguese  = [Os]{Teoremas}[Os]{Teoremas}
                    , brazilian   = [Os]{Teoremas}[Os]{Teoremas}
                    , spanish     = [Los]{Teoremas}[Los]{Teoremas}
                    , schinese    = {������}{������}
                    , tchinese    = {������}{������}
                    , japanese    = {������}{������}
                    , russian     = {��������������}{��������������}
                  }
  }
%</projlib-theorem>
%
%<*projlib-titlepage>
\keys_define:nn { projlib-titlepage }
  {
    , unknown           .code:n             = {}
  }
\ProcessKeyOptions [ projlib-titlepage ]

\RequirePackage { projlib-logo }
\RequirePackage { projlib-paper }

\RequirePackage { tikz }
\ExplSyntaxOff
\usetikzlibrary { calc }
\ExplSyntaxOn

\tl_new:N \l__projlib_titlepage_title_page_name_tl
\tl_new:N \l__projlib_titlepage_license_page_name_tl
\tl_set:Nn \l__projlib_titlepage_title_page_name_tl   { Cover   }
\tl_set:Nn \l__projlib_titlepage_license_page_name_tl { License }

\tl_new:N \l__projlib_titlepage_logo_tl
\tl_new:N \l__projlib_titlepage_title_tl
\tl_new:N \l__projlib_titlepage_subtitle_tl
\tl_new:N \l__projlib_titlepage_author_tl
\tl_new:N \l__projlib_titlepage_info_tl
\tl_new:N \l__projlib_titlepage_license_tl
\tl_new:N \l__projlib_titlepage_date_tl
\tl_new:N \l__projlib_titlepage_style_tl

\NewDocumentCommand \ProjLibTitlePage { O{} m }
  {
    \keys_set:nn { projlib-titlepage-config } { #1 }
    \projlib_titlepage_render:n { #2 }
  }
\ProvideDocumentCommand \TitlePage { O{} m }
  {
    \ProjLibTitlePage [ #1 ] { #2 }
  }

\cs_new_protected:Nn \projlib_titlepage_set_color:nn
  {
    \colorlet { titlepage- #1 } { #2 }
  }

\keys_define:nn { projlib-titlepage-config }
  {
    , logo              .code:n             = { \tl_set:Nn \l__projlib_titlepage_logo_tl { \tl_trim_spaces:n { #1 } } }
    , logo              .initial:n          = { * }
    , title             .code:n             = { \tl_set:Nn \l__projlib_titlepage_title_tl { \tl_trim_spaces:n { #1 } } }
    , subtitle          .code:n             = { \tl_set:Nn \l__projlib_titlepage_subtitle_tl { \tl_trim_spaces:n { #1 } } }
    , author            .code:n             = { \tl_set:Nn \l__projlib_titlepage_author_tl { \tl_trim_spaces:n { #1 } } }
    , date              .code:n             = { \tl_set:Nn \l__projlib_titlepage_date_tl { \tl_trim_spaces:n { #1 } } }
    , title-page-name   .code:n             = { \tl_set:Nn \l__projlib_titlepage_title_page_name_tl { \tl_trim_spaces:n { #1 } } }
    , title~page~name   .code:n             = { \tl_set:Nn \l__projlib_titlepage_title_page_name_tl { \tl_trim_spaces:n { #1 } } }
    , title page name   .code:n             = { \tl_set:Nn \l__projlib_titlepage_title_page_name_tl { \tl_trim_spaces:n { #1 } } }
    , license-page-name .code:n             = { \tl_set:Nn \l__projlib_titlepage_license_page_name_tl { \tl_trim_spaces:n { #1 } } }
    , license~page~name .code:n             = { \tl_set:Nn \l__projlib_titlepage_license_page_name_tl { \tl_trim_spaces:n { #1 } } }
    , license page name .code:n             = { \tl_set:Nn \l__projlib_titlepage_license_page_name_tl { \tl_trim_spaces:n { #1 } } }
    , info              .code:n             = { \tl_set:Nn \l__projlib_titlepage_info_tl { \tl_trim_spaces:n { #1 } } }
    , info              .initial:n          = { }
    , license           .code:n             = { \tl_set:Nn \l__projlib_titlepage_license_tl { \tl_trim_spaces:n { #1 } } }
    , license           .initial:n          = { }
    , style             .tl_set:N           = \l__projlib_titlepage_style_tl
    , style             .initial:n          = { default }
    , color             .code:n             = {
                                                \keyval_parse:nnn
                                                  { \use_none:n }
                                                  { \projlib_titlepage_set_color:nn }
                                                  { #1 }
                                              }
    , author-info-on-the-right .bool_set:N  = \l__projlib_titlepage_show_author_info_on_the_right_bool
    , author-info-on-the-right .initial:n   = { false }
    , author~info~on~the~right .bool_set:N  = \l__projlib_titlepage_show_author_info_on_the_right_bool
    , author info on the right .bool_set:N  = \l__projlib_titlepage_show_author_info_on_the_right_bool
    , unknown           .code:n             = {}
  }

\colorlet { titlepage-main } { blue!50!cyan!50!black }
\colorlet { titlepage-back } { blue!50!cyan!15!yellow!25 }

\cs_new_protected:Nn \projlib_titlepage_show_logo:n
  {
    \tl_if_eq:NnTF \l__projlib_titlepage_logo_tl { \tl_trim_spaces:n { * } }
      {
        #1
      }
      {
        \tl_use:N \l__projlib_titlepage_logo_tl
      }
  }

\cs_new_protected:Nn \projlib_titlepage_render:n
  {
    \keys_set:nn { projlib-titlepage-config } { #1 }
    \tl_set_eq:NN \thepage \l__projlib_titlepage_title_page_name_tl
    \begin { titlepage }
      \cs_if_exist_use:c { projlib_titlepage_render_with_style_ \l__projlib_titlepage_style_tl : }
    \end   { titlepage }
    \tl_set_eq:NN \thepage \l__projlib_titlepage_license_page_name_tl
    \thispagestyle{empty}
    \null\vfill
    % \begin{flushleft}
    \group_begin:
      \noindent
      \tl_use:N \l__projlib_titlepage_info_tl
    \group_end:
    % \end{flushleft}
    \group_begin:
      \tl_use:N \l__projlib_titlepage_license_tl
    \group_end:
    \cleardoublepage
    \setcounter{page}{0}
    \pagenumbering{roman}
  }


\cs_new_protected:Nn \projlib_titlepage_render_with_style_default:
  {
    \begin{tikzpicture}[overlay,remember~picture]
      % \fill[color=white] ($(current~page.south~west)$) rectangle ($(current~page.north~east)$);
      \node[text~width=.3\paperwidth, text~height=.2\paperheight, align=flush~left]
        at ($(current~page.north~west)+(.32\paperwidth,-.1\paperheight)$)
          {
            \projlib_titlepage_show_logo:n { \scalebox { 2 } { \ProjLib } }
          };
      \node[text~width=.8\paperwidth, text~height=.5\paperheight, align=flush~left]
        at ($(current~page.north~west)+(.57\paperwidth,-.15\paperheight)$)
          {
            \sffamily
            \fontsize{28pt}{42pt}\selectfont
            \textsc{ \textbf{ \l__projlib_titlepage_title_tl } }\\[1.5em]
            \fontsize{20pt}{30pt}\selectfont
            \l__projlib_titlepage_subtitle_tl
          };
      % \node[text~width=.5\paperwidth, text~height=.4\paperheight, align=flush~left]
        % at ($(current~page.south)+(.135\paperwidth,.35\paperheight)$)
      \node[text~width=.8\paperwidth, text~height=.4\paperheight, align=flush~left]
        at ($(current~page.south~west)+(.57\paperwidth,.45\paperheight)$)
          {
            % \color{.!50}
            % \begin{flushright}
              \fontsize{16pt}{24pt}\selectfont
              \textsc{ \l__projlib_titlepage_author_tl }\\[1em]
              \fontsize{12pt}{18pt}\selectfont
              \l__projlib_titlepage_date_tl
            % \end{flushright}
          };
    \end{tikzpicture}
  }

\cs_new_protected:Nn \projlib_titlepage_render_with_style_simple:
  {
    \begin{tikzpicture}[overlay,remember~picture]
      \fill[color=white] ($(current~page.south~west)$) rectangle ($(current~page.north~east)$);
      \fill[color=titlepage-main] ($(current~page.south~west)$) rectangle ($(current~page.north~east)+(0,-.3\paperheight)$);
      \node[text~width=.3\paperwidth, text~height=.2\paperheight, align=flush~left]
        at ($(current~page.north~west)+(.28\paperwidth,-.15\paperheight)$)
          {
            \projlib_titlepage_show_logo:n { \scalebox { 2 } { \ProjLib } }
          };
      \node[text~width=.8\paperwidth, text~height=.5\paperheight, align=flush~left]
        at ($(current~page.north~west)+(.53\paperwidth,-.28\paperheight)$)
          {
            \color{white}
            \sffamily
            \fontsize{28pt}{42pt}\selectfont
            \textsc{ \l__projlib_titlepage_title_tl }\\[1.5em]
            \fontsize{20pt}{30pt}\selectfont
            \l__projlib_titlepage_subtitle_tl
          };
      \bool_if:NTF \l__projlib_titlepage_show_author_info_on_the_right_bool
        {
          \node[text~width=.5\paperwidth, text~height=.4\paperheight, align=flush~left]
            at ($(current~page.south)+(.135\paperwidth,.4\paperheight)$)
              {
                \color{white}
                \begin{flushright}
                  \fontsize{16pt}{24pt}\selectfont
                  \textsc{ \l__projlib_titlepage_author_tl }\\[1em]
                  \fontsize{12pt}{18pt}\selectfont
                  \l__projlib_titlepage_date_tl
                \end{flushright}
              };
        }
        {
          \node[text~width=.5\paperwidth, text~height=.4\paperheight, align=flush~left]
          at ($(current~page.south~west)+(.38\paperwidth,.4\paperheight)$)
            {
              \color{white}
              \fontsize{16pt}{24pt}\selectfont
              \textsc{ \l__projlib_titlepage_author_tl }\\[1em]
              \fontsize{12pt}{18pt}\selectfont
              \l__projlib_titlepage_date_tl
            };
        }
    \end{tikzpicture}
  }

\cs_new_protected:Nn \projlib_titlepage_render_with_style_academic:
  {
    \begin{tikzpicture}[overlay,remember~picture]
      \fill[color=titlepage-main] ($(current~page.south~west)$) rectangle ($(current~page.north~east)$);
      \fill[color=white] ($(current~page.south~west)+(0,.3\paperheight)$) rectangle ($(current~page.north~east)+(0,-.3\paperheight)$);
      \node[text~width=.3\paperwidth, text~height=.2\paperheight, align=flush~center]
        at ($(current~page.north)+(0pt,-.15\paperheight)$)
          {
            \projlib_titlepage_show_logo:n { \color{white} \scalebox { 2 } { \ProjLibText } }
          };
      \node[text~width=.8\paperwidth, text~height=.5\paperheight, align=flush~center]
        at ($(current~page.north)+(0pt,-.25\paperheight)$)
          {
            \color{titlepage-main}
            \sffamily
            \fontsize{28pt}{42pt}\selectfont
            \textsc{ \l__projlib_titlepage_title_tl }\\[1.5em]
            \fontsize{20pt}{30pt}\selectfont
            \l__projlib_titlepage_subtitle_tl
          };
      \node[text~width=.5\paperwidth, text~height=.4\paperheight, align=flush~center]
        at ($(current~page.south)+(0pt,.36\paperheight)$)
          {
            \color{white}
            \fontsize{16pt}{24pt}\selectfont
            \textsc{ \l__projlib_titlepage_author_tl }\\[1em]
            \fontsize{12pt}{18pt}\selectfont
            \l__projlib_titlepage_date_tl
          };
    \end{tikzpicture}
  }

\cs_new_protected:Nn \projlib_titlepage_render_with_style_fancy:
  {
    \begin{tikzpicture}[overlay,remember~picture]
      \fill [color=titlepage-main] ($(current~page.south~west)$) rectangle ($(current~page.north~east)+(0,-.3\paperheight)$);
      \fill [color=titlepage-back] ($(current~page.south~west)$) rectangle ($(current~page.north~west)+(.125\paperwidth,-.3\paperheight)$);
      \fill [color=titlepage-main] ($(current~page.north~west)$) rectangle ($(current~page.north~west)+(.125\paperwidth,-.3\paperheight)$);
      \fill [color=titlepage-back] ($(current~page.north~east)$) rectangle ($(current~page.north~west)+(.125\paperwidth,-.3\paperheight)$);
      \node[text~width=.3\paperwidth, text~height=.2\paperheight, align=flush~left]
        at ($(current~page.north~west)+(.333\paperwidth,-.17\paperheight)$)
          {
            \projlib_titlepage_show_logo:n { \scalebox { 2 } { \ProjLib } }
          };
      \node[text~width=.8\paperwidth, text~height=.5\paperheight, align=flush~left]
        at ($(current~page.north~west)+(.583\paperwidth,-.28\paperheight)$)
          {
            \color{titlepage-back}
            \sffamily
            \fontsize{28pt}{42pt}\selectfont
            \textsc{ \l__projlib_titlepage_title_tl }\\[1.5em]
            \fontsize{20pt}{30pt}\selectfont
            \l__projlib_titlepage_subtitle_tl
          };
      \bool_if:NTF \l__projlib_titlepage_show_author_info_on_the_right_bool
        {
          \node[text~width=.5\paperwidth, text~height=.4\paperheight, align=flush~left]
            at ($(current~page.south)+(.135\paperwidth,.4\paperheight)$)
              {
                \color{titlepage-back}
                \begin{flushright}
                  \fontsize{16pt}{24pt}\selectfont
                  \textsc{ \l__projlib_titlepage_author_tl }\\[1em]
                  \fontsize{12pt}{18pt}\selectfont
                  \l__projlib_titlepage_date_tl
                \end{flushright}
              };
        }
        {
          \node[text~width=.5\paperwidth, text~height=.4\paperheight, align=flush~left]
          at ($(current~page.south~west)+(.433\paperwidth,.4\paperheight)$)
            {
              \color{titlepage-back}
              \fontsize{16pt}{24pt}\selectfont
              \textsc{ \l__projlib_titlepage_author_tl }\\[1em]
              \fontsize{12pt}{18pt}\selectfont
              \l__projlib_titlepage_date_tl
            };
        }
    \end{tikzpicture}
  }
%</projlib-titlepage>

\endinput