texlive[62770] branches/branch2021.final/Master/texmf-dist: jxu

commits+karl at tug.org commits+karl at tug.org
Thu Mar 17 21:33:17 CET 2022


Revision: 62770
          http://tug.org/svn/texlive?view=revision&revision=62770
Author:   karl
Date:     2022-03-17 21:33:16 +0100 (Thu, 17 Mar 2022)
Log Message:
-----------
jxu (17mar22) (branch)

Modified Paths:
--------------
    branches/branch2021.final/Master/texmf-dist/doc/latex/einfart/README.md
    branches/branch2021.final/Master/texmf-dist/doc/latex/minimalist/README.md
    branches/branch2021.final/Master/texmf-dist/doc/latex/projlib/README.md
    branches/branch2021.final/Master/texmf-dist/doc/latex/simplivre/README.md
    branches/branch2021.final/Master/texmf-dist/source/latex/projlib/ProjLib.dtx
    branches/branch2021.final/Master/texmf-dist/tex/latex/einfart/einfart.cls
    branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimart.cls
    branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimbook.cls
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/ProjLib.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-author.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-datetime.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-draft.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-font.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-language.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-logo.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-math.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-paper.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-theorem.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/simplivre/simplivre.cls

Added Paths:
-----------
    branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-classical.sty
    branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-plain.sty

Modified: branches/branch2021.final/Master/texmf-dist/doc/latex/einfart/README.md
===================================================================
--- branches/branch2021.final/Master/texmf-dist/doc/latex/einfart/README.md	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/doc/latex/einfart/README.md	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,6 +2,8 @@
 
 # `einfart` : write you articles in a simple and clear way
 
+**The current document class have been rewritten with `expl3`. Please note that the documentations are not yet up-to-date. The syntax of some commands have been changed since the last version, especially the declaration of theorem-like environments by `\CreateTheorem`. For the moment, you can refer to the documentation of the package `create-theorem`.**
+
 `einfart` is a LaTeX class for typesetting articles, which has a simple and
 clear design.
 

Modified: branches/branch2021.final/Master/texmf-dist/doc/latex/minimalist/README.md
===================================================================
--- branches/branch2021.final/Master/texmf-dist/doc/latex/minimalist/README.md	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/doc/latex/minimalist/README.md	2022-03-17 20:33:16 UTC (rev 62770)
@@ -1,7 +1,9 @@
-<!-- Copyright (C) 2021 by Jinwen XU -->
+<!-- Copyright (C) 2021-2022 by Jinwen XU -->
 
 # `minimalist` bundle: write you documents in a simple and clear way
 
+**The whole series have been rewritten with `expl3`. Please note that the documentations are not yet up-to-date. The syntax of some commands have been changed since the last version, especially the declaration of theorem-like environments by `\CreateTheorem`. For the moment, you can refer to the documentation of the package `create-theorem`.**
+
 ## Introduction
 
 `minimalist` is a collection of styles and classes that helps you typesetting articles and books
@@ -8,7 +10,9 @@
 with a simple and clear design. It mainly consists of two parts.
 
 - Main part:
-    - `minimalist.sty` : the main style
+    - `minimalist.sty` : interface of the main style
+        - `minimalist-plain.sty` : the plain style
+        - `minimalist-classical.sty` : the classical style
     - `minimart.cls` : class for typesetting articles
     - `minimbook.cls` : class for typesetting books
 

Modified: branches/branch2021.final/Master/texmf-dist/doc/latex/projlib/README.md
===================================================================
--- branches/branch2021.final/Master/texmf-dist/doc/latex/projlib/README.md	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/doc/latex/projlib/README.md	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,16 +2,12 @@
 
 # ProjLib Toolkit
 
-The bundle is dated 2022/03/11.
+The bundle is dated 2022/03/17
 
-Old modules are still dated 2021/12/16 and will *not* be modified. **When all the new modules and the corresponding documentations are finished, old files shall be removed from this bundle.**
-
 ## **Important note**
 
-The whole project is being rewritten with `expl3`. The new modules are basically finished but are not yet documented. They have the names with prefix "projlib-", and they are in many ways better and more powerful than their predecessors. Most importantly, they are not compatible with the old modules, so they cannot appear at the same time in the same document, which, unfortunately, means that (for now) they cannot be used in classes like `einfart` or `lebhart`, etc.
+The whole project is being rewritten with `expl3`. The new modules are basically finished but are not yet documented. They have the names with prefix "projlib-", and they are in many ways better and more powerful than their predecessors. The most important thing to be noticed is that these new modules are not compatible with the old ones, and thus they cannot appear simultaneously in the same document, which, unfortunately, means that (for now) they cannot be used in classes like `lebhart`, `beaulivre` (these are the classes with which the author produced the old documentations), etc.
 
-The current `ProjLib.sty` is the new `expl3` version, the old one has been renamed to `PJLtoolkit.sty`.
-
 The new modules are:
 - projlib-author
 - projlib-datetime
@@ -23,14 +19,11 @@
 - projlib-paper
 - projlib-theorem
 
-When all these modules are finished, the documentation will be updated accordingly.
+Below are the old README.
 
-Below is the content of the old README.
-
 ---
 
 > **ProjLib** can be interpreted as "***Proj**ect **Lib**rary*" (in English), or as "***Proj**et **Lib**re*" (in French).
-> Personally, I prefer the later one.
 
 ## Introduction
 
@@ -69,9 +62,9 @@
     - Theorem setup and configuration
     - Offers a macro `\CreateTheorem` for creating theorem-like environments with multi-language support
     - Preset environments include: `assumption`, `axiom`, `conjecture`, `convention`, `corollary`, `definition`, `definition-proposition`, `definition-theorem`, `example`, `exercise`, `fact`, `hypothesis`, `lemma`, `notation`, `observation`, `problem`, `property`, `proposition`, `question`, `remark`, `theorem`, and the corresponding unnumbered version with an asterisk `*` in the name.
-<!-- 1. `PJLtoolkit.sty` (this is the internal name of the `ProjLib` package)
+1. `PJLtoolkit.sty` (this is the internal name of the `ProjLib` package)
     - A collective interface of ProjLib Toolkit, loading all the packages above
-    - Provide some pre-defined font configuration -->
+    - Provide some pre-defined font configuration
 
 > Since `PJLthm.sty` (and thus `ProjLib.sty`) uses `cleveref`, it should be loaded after `varioref` and `hyperref`.
 

Modified: branches/branch2021.final/Master/texmf-dist/doc/latex/simplivre/README.md
===================================================================
--- branches/branch2021.final/Master/texmf-dist/doc/latex/simplivre/README.md	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/doc/latex/simplivre/README.md	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,6 +2,8 @@
 
 # `simplivre` : write you books in a simple and clear way
 
+**The current document class have been rewritten with `expl3`. Please note that the documentations are not yet up-to-date. The syntax of some commands have been changed since the last version, especially the declaration of theorem-like environments by `\CreateTheorem`. For the moment, you can refer to the documentation of the package `create-theorem`.**
+
 `simplivre` is a LaTeX class for typesetting books, which has a simple and clear
 design.
 

Modified: branches/branch2021.final/Master/texmf-dist/source/latex/projlib/ProjLib.dtx
===================================================================
--- branches/branch2021.final/Master/texmf-dist/source/latex/projlib/ProjLib.dtx	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/source/latex/projlib/ProjLib.dtx	2022-03-17 20:33:16 UTC (rev 62770)
@@ -20,7 +20,7 @@
 %<*ProjLib>
 \ProvidesExplPackage
   {ProjLib}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Collective interface of the ProjLib toolkit}
 %</ProjLib>
 %
@@ -27,7 +27,7 @@
 %<*projlib-author>
 \ProvidesExplPackage
   {projlib-author}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Enhanced author information block}
 %</projlib-author>
 %
@@ -34,7 +34,7 @@
 %<*projlib-datetime>
 \ProvidesExplPackage
   {projlib-datetime}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Convert numeric date-time string to natural language}
 %</projlib-datetime>
 %
@@ -41,7 +41,7 @@
 %<*projlib-draft>
 \ProvidesExplPackage
   {projlib-draft}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Useful commands during draft stage}
 %</projlib-draft>
 %
@@ -48,7 +48,7 @@
 %<*projlib-font>
 \ProvidesExplPackage
   {projlib-font}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Font selection and configuration}
 %</projlib-font>
 %
@@ -55,7 +55,7 @@
 %<*projlib-language>
 \ProvidesExplPackage
   {projlib-language}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Multi-language configuration}
 %</projlib-language>
 %
@@ -62,7 +62,7 @@
 %<*projlib-logo>
 \ProvidesExplPackage
   {projlib-logo}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {The ProjLib logo}
 %</projlib-logo>
 %
@@ -69,7 +69,7 @@
 %<*projlib-math>
 \ProvidesExplPackage
   {projlib-math}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Efficient math setup}
 %</projlib-math>
 %
@@ -76,7 +76,7 @@
 %<*projlib-paper>
 \ProvidesExplPackage
   {projlib-paper}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Configuration of the paper style}
 %</projlib-paper>
 %
@@ -83,7 +83,7 @@
 %<*projlib-theorem>
 \ProvidesExplPackage
   {projlib-theorem}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Configuration of theorem-like environments}
 %</projlib-theorem>
 
@@ -149,11 +149,13 @@
 \cs_if_exist:NT \subjclass { \endinput }
 
 \tl_new:N   \g__projlib_author_font_author_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_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 }
@@ -182,56 +184,49 @@
       }
   }
 
-\ProvideDocumentCommand \address { m }
+\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]
+        \phantom {A} \\[-.85\baselineskip]
         \bool_if:NF \g__projlib_author_affil_already_exist_bool
           {
             \skip_vertical:n { \g__projlib_author_length_innersep_dim }
           }
         \bool_set_true:N \g__projlib_author_affil_already_exist_bool
-        { \g__projlib_author_font_address_tl #1 }
+        { \use:c { g__projlib_author_font_ #1 _tl } #2 }
         \\ \phantom {}
       }
   }
 
+\ProvideDocumentCommand \institute { m }
+  {
+    \projlib_author_affil_generic:nn { institute } { #1 }
+  }
+
+\ProvideDocumentCommand \address { m }
+  {
+    \projlib_author_affil_generic:nn { address } { #1 }
+  }
+
 \ProvideDocumentCommand \curraddr { m }
   {
-    \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
-      {
-        \phantom {A} \\[-\baselineskip]
-        \bool_if:NF \g__projlib_author_affil_already_exist_bool
-          {
-            \skip_vertical:n { \g__projlib_author_length_innersep_dim }
-          }
-        \bool_set_true:N \g__projlib_author_affil_already_exist_bool
-        { \g__projlib_author_font_curraddr_tl #1 }
-        \\ \phantom {}
-      }
+    \projlib_author_affil_generic:nn { curraddr } { #1 }
   }
 
 \ProvideDocumentCommand \email { m }
   {
-    \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
-      {
-        \phantom {A} \\[-\baselineskip]
-        \bool_if:NF \g__projlib_author_affil_already_exist_bool
-          {
-            \skip_vertical:n { \g__projlib_author_length_innersep_dim }
-          }
-        \bool_set_true:N \g__projlib_author_affil_already_exist_bool
-        { \g__projlib_author_font_email_tl #1 }
-        \\ \phantom {}
-      }
+    \projlib_author_affil_generic:nn { email } { #1 }
   }
 
 \RequirePackage { regexpatch }
 
-\xpatchcmd { \@maketitle } { \begin{tabular}[t]{c} } {} {
-  \xpatchcmd { \@maketitle } { \end{tabular} } {} {} {}
-} {}
+\xpatchcmd { \@maketitle } { \begin{tabular}[t]{c} } {}
+  {
+    \xpatchcmd { \@maketitle } { \end{tabular} } {} {} {}
+  } {}
 
 \tl_set:cn {@author} {}
 
@@ -256,17 +251,17 @@
     \RequirePackage{ projlib-language }
 
     \tl_new:N   \g_projlib_author_keywordsname_style_tl
-    \tl_gset:Nn \g_projlib_author_keywordsname_style_tl {}
+    \tl_gset:Nn \g_projlib_author_keywordsname_style_tl { \itshape }
 
     \projlib_langauge_define_multilingual_text:Nn \keywordsname
       {
-        EN = \textsc{Key~words~and~phrases}         ,
-        FR = \textsc{Mots~et~phrases~clés}          ,
-        DE = \textsc{Schlüsselwörter~und~Phrasen}   ,
-        IT = \textsc{Parole~e~frasi~chiave}         ,
-        PT = \textsc{Palavras~e~frases~chave}       ,
-        BR = \textsc{Palavras~e~frases~chave}       ,
-        ES = \textsc{Palabras~y~frases~clave}       ,
+        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 = キーワード                             ,
@@ -348,9 +343,11 @@
       {
         \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
@@ -399,10 +396,13 @@
           {
             \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
@@ -2123,7 +2123,7 @@
       }
   }
 
-\projlib_langauge_define_multilingual_text:Nn \__dnf_text
+\projlib_langauge_define_multilingual_text:Nn \__projlib_draft_dnf_text
   {
     EN = To\ be\ finished     ,
     FR = Pas\ encore\ fini    ,
@@ -2138,7 +2138,7 @@
     RU = Не\ закончен         ,
   }
 
-\projlib_langauge_define_multilingual_text:Nn \__dnf_report_text
+\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.         }     ,
@@ -2161,12 +2161,12 @@
            \ с\ соответствующими\ номерами\ страниц\ в\ скобках.      }     ,
   }
 
-\tl_new:c    { __dnf_font }
-\tl_gset:cn  { __dnf_font }        { \normalfont \ttfamily \bfseries \small }
+\tl_new:c    { __projlib_draft_dnf_font }
+\tl_gset:cn  { __projlib_draft_dnf_font }        { \normalfont \ttfamily \bfseries \small }
 
-\definecolor { __dnf_color }       { RGB } {  21, 122,  20 }
+\definecolor { __projlib_draft_dnf_color }       { RGB } {  21, 122,  20 }
 
-\newcounter  { __dnf_counter }
+\newcounter  { __projlib_draft_dnf_counter }
 
 \tl_new:N \g__projlib_draft_dnf_report_tl
 
@@ -2173,18 +2173,18 @@
 \NewDocumentCommand \dnf { d<> }
   {
     \noindent
-    \projlib_draft_plain_box [ __dnf_color ]
+    \projlib_draft_plain_box [ __projlib_draft_dnf_color ]
       {
-        \stepcounter { __dnf_counter }
-        \__dnf_font
-        \__dnf_text
+        \stepcounter { __projlib_draft_dnf_counter }
+        \__projlib_draft_dnf_font
+        \__projlib_draft_dnf_text
         \c_space_tl
-        \# \the__dnf_counter
+        \# \the__projlib_draft_dnf_counter
         \IfNoValueF { #1 } { \, : ~ #1 }
         \tl_gput_right:Nx \g__projlib_draft_dnf_report_tl
           {
             \# \,
-            \int_value:w \the__dnf_counter
+            \int_value:w \the__projlib_draft_dnf_counter
             \c_space_tl \c_space_tl
             $\langle$
             \skip_horizontal:n { 0.1em }
@@ -2208,13 +2208,78 @@
   {
     \tl_if_blank:VF \g__projlib_draft_dnf_report_tl
       {
-        \clearpage \noindent
-        \color { __dnf_color }
-        \__dnf_font
-        \__dnf_report_text \\[0.75\baselineskip]
+        \clearpage
+        \pagestyle{empty}
+        \noindent
+        \color { __projlib_draft_dnf_color }
+        \__projlib_draft_dnf_font
+        \__projlib_draft_dnf_report_text \\[0.75\baselineskip]
         \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~``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~«~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~``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~``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~"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~"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~``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 = {
+              你好,这里有一些没有意义的文字。 此文本应显示打印文本在此位置的外观。 如果你阅读这段文字,你将不会得到任何信息。 真的没有信息吗? 这段文字和诸如 “劳仑衣普桑,认至将指点效则机,最你更枝” 或者 “想极整月正进好志次回总般,段然取向使张规军证回,世市总李率英茄持伴” 之类的废话有区别吗? 一点都没有! 这样的一段文本会给你提供关于所选字体的信息、字母的书写方式以及对外观的印象。 该文本应包含字母表中的所有字母,并且应使用原始语言编写。 不需要特别的内容,但字长要与语言相匹配。
+           }
+    , TC = {
+              你好,這裡有一些沒有意義的文字。此文本應顯示打印文本在此位置的外觀。如果你閱讀這段文字,你將不會得到任何信息。真的沒有信息嗎?這段文字和諸如 “勞崙衣普桑,認至將指點效則機,最你更枝” 或者 “想極整月正進好志次回總般,段然取向使張規軍證回,世市總李率英茄持伴” 之類的廢話有區別嗎?一點都沒有!這樣的一段文本會給你提供關於所選字體的信息、字母的書寫方式以及對外觀的印象。該文本應包含字母表中的所有字母,並且應使用原始語言編寫。不需要特別的內容,但字長要與語言相匹配。
+           }
+    , JP = {
+              こんにちは、ここに意味のないテキストがあります。 このテキストは、この場所で印刷されたテキストがどのように見えるかを示す必要があります。 このテキストを読んでも、情報は得られません。 本当に? 情報はありませんか? このテキストと「アでニンはすミ」のようなナンセンスとの間に違いはありますか? 全くない! このようなブラインドテキストは、選択したフォント、文字の書き方、外観の印象に関する情報を提供します。 このテキストにはアルファベットのすべての文字が含まれている必要があり、元の言語で書かれている必要があります。 特別なコンテンツは必要ありませんが、単語の長さは言語と一致している必要があります。
+           }
+    , RU = {
+              Здравствуйте,~вот~какой-то~текст~без~смысла.~Этот~текст~должен~показывать,~как~будет~выглядеть~печатный~текст~в~этом~месте.~Если~вы~прочитаете~этот~текст,~вы~не~получите~никакой~информации.~Действительно?~Нет~информации?~Есть~ли~разница~между~этим~текстом~и~какой-то~чепухой~вроде~``Бзостачщв~дрероих''?~Нисколько!~Слепой~текст,~подобный~этому,~дает~вам~информацию~о~выбранном~шрифте,~о~том,~как~написаны~буквы,~и~о~впечатлении~от~внешнего~вида.~Этот~текст~должен~содержать~все~буквы~алфавита~и~должен~быть~написан~на~языке~оригинала.~В~специальном~содержании~нет~необходимости,~но~длина~слов~должна~соответствовать~языку.
+           }
+  }
+
+\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>
@@ -2803,7 +2868,7 @@
 \tl_new:N  \g_projlib_language_parindent_latin_tl
 \tl_new:N  \g_projlib_language_parindent_cjk_tl
 
-\@ifclassloaded{beamer}
+\@ifclassloaded { beamer }
   {
     \tl_gset:Nn \g_projlib_language_parindent_latin_tl
       {
@@ -2827,7 +2892,7 @@
 
 \hook_gput_code:nnn { begindocument } { projlib-language }
   {
-    \@ifpackageloaded{parskip}
+    \@ifpackageloaded { parskip }
       {
         \tl_gset:Nn \g_projlib_language_parindent_latin_tl
           {
@@ -3319,7 +3384,7 @@
     , 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
     , 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
@@ -3341,7 +3406,7 @@
     , 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 } }
+    , unknown               .code:n             = { \PassOptionsToPackage { \CurrentOption } { create-theorem } }
   }
 \ProcessKeysOptions { projlib-theorem }
 
@@ -3405,7 +3470,7 @@
   {
     \bool_if:NTF \l__projlib_theorem_no_theorem_numbering_bool
       {
-        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { numberless }
+        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { numberless, create starred version }
       }
       {
         \tl_if_blank:eTF \l__projlib_theorem_theorem_numbering_tl
@@ -3412,23 +3477,23 @@
           {
             \cs_if_exist:cTF { c at chapter }
               { % with \chapter
-                \CreateTheorem {theorem} { parent counter = chapter }
+                \CreateTheorem {theorem} { parent counter = chapter, create starred version }
               }
               { % without \chapter
-                \CreateTheorem {theorem} { parent counter = section }
+                \CreateTheorem {theorem} { parent counter = section, create starred version }
               }
           }
           {
             \tl_if_eq:NnTF \l__projlib_theorem_theorem_numbering_tl { * }
               {
-                \CreateTheorem {theorem} { }
+                \CreateTheorem {theorem} { create starred version }
               }
               {
-                \CreateTheorem {theorem} { parent counter = \l__projlib_theorem_theorem_numbering_tl }
+                \CreateTheorem {theorem} { parent counter = \l__projlib_theorem_theorem_numbering_tl, create starred version }
               }
           }
 
-        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { shared counter = theorem, quiet }
+        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { shared counter = theorem, create starred version, quiet }
       }
   }
 

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/einfart/einfart.cls
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/einfart/einfart.cls	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/einfart/einfart.cls	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,7 +2,7 @@
 %% This is file `einfart/einfart.cls',
 %% generated with the docstrip utility.
 
-%% Copyright (C) 2021 by Jinwen XU
+%% Copyright (C) 2021-2022 by Jinwen XU
 %% 
 %% This is part of the minimalist class series.
 %% 
@@ -16,564 +16,685 @@
 %% 2005/12/01 or later.
 %% 
 \NeedsTeXFormat{LaTeX2e}[2020-10-01]
-\ProvidesClass{einfart}
-    [2021/12/16 A simple and clear article style]
-\def\minimclass at baseclass{article}
-\RequirePackage{kvoptions}
-\RequirePackage{etoolbox}
-\SetupKeyvalOptions{
-    family = @minimclass,
-    prefix = @minimclass@,
-}
-\DeclareBoolOption[false]{draft}
-\DeclareBoolOption[false]{fast}
-\DeclareBoolOption[false]{classical}
-\DeclareBoolOption[false]{useindent}
-\DeclareBoolOption[false]{useosf}
-\DeclareBoolOption[false]{lmodern}
-\DeclareBoolOption[false]{palatino}
-\DeclareBoolOption[false]{times}
-\DeclareBoolOption[false]{garamond}
-\DeclareBoolOption[false]{noto}
-\DeclareBoolOption[false]{biolinum}
-\DeclareBoolOption[false]{customfont}
-\DeclareStringOption{thmnum}[PJL at thmnum@default]
+\RequirePackage{l3keys2e}
+\ProvidesExplClass
+  {einfart}
+  {2022/03/17} {}
+  {A simple and clear article style}
 
-\newif\if at minimclass@bfivepaper\@minimclass at bfivepaperfalse
-\DeclareVoidOption{b5paper}{\@minimclass at bfivepapertrue}
-\newif\if at minimclass@afourpaper\@minimclass at afourpaperfalse
-\DeclareVoidOption{a4paper}{\@minimclass at afourpapertrue}
+\tl_const:Nn \l__minimclass_base_class_tl { article }
 
-\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{\minimclass at baseclass}}
-\ProcessKeyvalOptions*\relax
-\LoadClass{\minimclass at baseclass}
 
-\if at minimclass@draft
-    \@minimclass at fasttrue
-\fi
-\if at minimclass@classical\else
-    \@minimclass at useindenttrue
-\fi
-\if at minimclass@lmodern
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@palatino
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@times
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@garamond
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@noto
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@biolinum
-    \@minimclass at customfonttrue
-\fi
+\bool_new:N \l__minimclass_load_custom_font_file_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_bool
 
-%%================================
-%% Page layout
-%%================================
-\RequirePackage{silence}
-\WarningFilter{geometry}{Over-specification in}
-\RequirePackage[heightrounded]{geometry}
-\geometry{
-    papersize={7in,10in},
-    % total={40em,60em},
-    total={5.535in,8.300in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\if at minimclass@bfivepaper
-\geometry{
-    b5paper,
-    % total={40em,59em},
-    total={5.535in,8.160in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
-\if at minimclass@afourpaper
-\geometry{
-    a4paper,
-    % total={47em,70em},
-    total={6.500in,9.685in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
+\bool_new:N \l__minimclass_load_custom_font_file_latin_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_latin_bool
 
-\if at minimclass@fast
-    \PassOptionsToPackage{fast}{minimalist}
-    \RequirePackage{draftwatermark}
-    \DraftwatermarkOptions{text={\normalfont DRAFT},color=paper!95!-paper}
-\fi
-\if at minimclass@useindent
-    \RequirePackage{indentfirst}
-\else
-    \AtEndPreamble{\RequirePackage{parskip}}
-\fi
-\RequirePackage{minimalist}
+\bool_new:N \l__minimclass_load_custom_font_file_cjk_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_cjk_bool
 
+\bool_new:N \l__minimclass_load_custom_font_file_math_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_math_bool
+
+\keys_define:nn { minimclass }
+  {
+    , draft                   .bool_set:N         = \l__minimclass_fast_bool
+    , draft                   .initial:n          = { false }
+    , fast                    .bool_set:N         = \l__minimclass_fast_bool
+
+    , classical               .bool_set:N         = \l__minimclass_classical_bool
+    , classical               .initial:n          = { false }
+
+    , use indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use indent              .initial:n          = { true }
+    , use~indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use-indent              .bool_set:N         = \l__minimclass_useindent_bool
+
+    , load custom font file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { minimalist.font.latin }
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str   { minimalist.font.cjk }
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str  { minimalist.font.math }
+                                                    }
+    , load custom font file   .default:n          = { minimalist.font }
+    , load~custom~font~file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load~custom~font~file   .default:n          = { minimalist.font }
+    , load-custom-font-file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load-custom-font-file   .default:n          = { minimalist.font }
+
+    , load custom latin font file   .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { #1 }
+                                                    }
+    , load custom latin font file   .default:n    = { minimalist.font.latin }
+    , load~custom~latin~font~file   .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { #1 }
+                                                    }
+    , load~custom~latin~font~file   .default:n    = { minimalist.font.latin }
+    , load-custom-latin-font-file   .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { #1 }
+                                                    }
+    , load-custom-latin-font-file   .default:n    = { minimalist.font.latin }
+
+    , load custom cjk font file     .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str { #1 }
+                                                    }
+    , load custom cjk font file     .default:n    = { minimalist.font.cjk }
+    , load~custom~cjk~font~file     .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str { #1 }
+                                                    }
+    , load~custom~cjk~font~file     .default:n    = { minimalist.font.cjk }
+    , load-custom-cjk-font-file     .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str { #1 }
+                                                    }
+    , load-custom-cjk-font-file     .default:n    = { minimalist.font.cjk }
+
+    , load custom math font file    .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str { #1 }
+                                                    }
+    , load custom math font file    .default:n    = { minimalist.font.math }
+    , load~custom~math~font~file    .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str { #1 }
+                                                    }
+    , load~custom~math~font~file    .default:n    = { minimalist.font.math }
+    , load-custom-math-font-file    .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str { #1 }
+                                                    }
+    , load-custom-math-font-file    .default:n    = { minimalist.font.math }
+
+    , a4paper                 .bool_set:N         = \l__minimclass_a_four_paper_bool
+    , a4paper                 .initial:n          = { false }
+    , b5paper                 .bool_set:N         = \l__minimclass_b_five_paper_bool
+    , b5paper                 .initial:n          = { false }
+
+    , 11pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+    , 12pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+
+    , unknown                 .code:n             = {
+                                                      \PassOptionsToPackage { \CurrentOption } { minimalist }
+                                                    }
+  }
+\ProcessKeysOptions { minimclass }
+
+\LoadClass{\l__minimclass_base_class_tl}
+
+\bool_if:NT \l__minimclass_classical_bool
+  {
+    \bool_set_false:N \l__minimclass_useindent_bool
+  }
+
 %%================================
-%% Fonts
+%%  Page layout
 %%================================
-\if at minimclass@customfont\else
-    \if at minimclass@fast
-        \RequirePackage{mathpazo}
-    \fi
-\fi
+\RequirePackage { silence }
+\WarningFilter { geometry } { Over-specification }
 
-\PassOptionsToPackage{no-math,quiet}{fontspec}
-\RequirePackage{fontspec}
+\PassOptionsToPackage { heightrounded } { geometry }
+\RequirePackage { geometry }
 
-\IfFileExists{minimalist-font.tex}{
-    \input{minimalist-font.tex}
-}{
-\IfFontExistsTF{Palatino Linotype}{%
-    \setmainfont{Palatino Linotype}
-        [\if at minimclass@useosf Numbers = OldStyle\fi]
-}{
-    \setmainfont{TeXGyrePagellaX-Regular.otf}[
-        BoldFont       = TeXGyrePagellaX-Bold.otf ,
-        ItalicFont     = TeXGyrePagellaX-Italic.otf ,
-        BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf,
-        \if at minimclass@useosf Numbers = OldStyle\fi ]
-}
-    \setsansfont{SourceSansPro-Regular.otf}[
-        Scale          = MatchLowercase ,
-        BoldFont       = SourceSansPro-Bold.otf ,
-        ItalicFont     = SourceSansPro-RegularIt.otf ,
-        BoldItalicFont = SourceSansPro-BoldIt.otf ]
-    \setmonofont{NewCMMono10-Regular.otf}[
-        Scale          = 1.05 ,
-        BoldFont       = NewCMMono10-Bold.otf ,
-        ItalicFont     = NewCMMono10-Italic.otf ,
-        BoldItalicFont = NewCMMono10-BoldOblique.otf ]
-}
+\geometry
+  {
+    papersize = { 7in, 10in },
+    total = { 5.535in, 8.300in },
+    centering,
+    footnotesep = 2em plus 2pt minus 2pt,
+  }
 
-\PassOptionsToPackage{fontset=none,scheme=plain}{ctex}
-\RequirePackage{ctex}
+\bool_if:NT \l__minimclass_b_five_paper_bool
+  {
+    \geometry
+      {
+        b5paper,
+        total = { 5.535in, 8.160in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\IfFileExists{minimalist-font.cjk.tex}{
-    \input{minimalist-font.cjk.tex}
-}{
-\IfFontExistsTF{SourceHanSerifSC-Regular}{%
-    \setCJKmainfont{SourceHanSerifSC-Regular}[
-        BoldFont       = SourceHanSerifSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerifSC-Bold ]
-}{
-    \setCJKmainfont{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
+\bool_if:NT \l__minimclass_a_four_paper_bool
+  {
+    \geometry
+      {
+        a4paper,
+        total = { 6.500in, 9.685in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\IfFontExistsTF{SourceHanSansSC-Regular}{%
-    \setCJKsansfont{SourceHanSansSC-Regular}[
-        BoldFont       = SourceHanSansSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSansSC-Bold ]
-}{
-    \setCJKsansfont{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
+\bool_if:NT \l__minimclass_fast_bool
+  {
+    \PassOptionsToPackage { fast } { minimalist }
+    \RequirePackage { draftwatermark }
+    \DraftwatermarkOptions { text = { \normalfont DRAFT }, color = paper!97!-paper }
+  }
 
-\IfFontExistsTF{SourceHanMonoSC-Regular}{%
-    \setCJKmonofont{SourceHanMonoSC-Regular}[
-        BoldFont       = SourceHanMonoSC-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMonoSC-Medium ]
-}{
-    \setCJKmonofont{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
+\bool_if:NTF \l__minimclass_useindent_bool
+  {
+    \RequirePackage { indentfirst }
+  }
+  {
+    \hook_gput_code:nnn { begindocument/before } { minimclass }
+      {
+        \RequirePackage { parskip }
+      }
+  }
 
-\if at PJLlang@enable at CN
-\IfFontExistsTF{SourceHanSerifSC-Regular}{%
-    \setCJKfamilyfont{SCmain}{SourceHanSerifSC-Regular}[
-        BoldFont       = SourceHanSerifSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerifSC-Bold ]
-}{
-    \setCJKfamilyfont{SCmain}{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\IfFontExistsTF{SourceHanSansSC-Regular}{%
-    \setCJKfamilyfont{SCsans}{SourceHanSansSC-Regular}[
-        BoldFont       = SourceHanSansSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSansSC-Bold ]
-}{
-    \setCJKfamilyfont{SCsans}{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
-\IfFontExistsTF{SourceHanMonoSC-Regular}{%
-    \setCJKfamilyfont{SCmono}{SourceHanMonoSC-Regular}[
-        BoldFont       = SourceHanMonoSC-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMonoSC-Medium ]
-}{
-    \setCJKfamilyfont{SCmono}{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\fi
+\RequirePackage { minimalist }
 
-\if at PJLlang@enable at TC
-\IfFontExistsTF{SourceHanSerifTC-Regular}{%
-    \setCJKfamilyfont{TCmain}{SourceHanSerifTC-Regular}[
-        BoldFont       = SourceHanSerifTC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerifTC-Bold ]
-}{
-    \setCJKfamilyfont{TCmain}{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\IfFontExistsTF{SourceHanSansTC-Regular}{%
-    \setCJKfamilyfont{TCsans}{SourceHanSansTC-Regular}[
-        BoldFont       = SourceHanSansTC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSansTC-Bold ]
-}{
-    \setCJKfamilyfont{TCsans}{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
-\IfFontExistsTF{SourceHanMonoTC-Regular}{%
-    \setCJKfamilyfont{TCmono}{SourceHanMonoTC-Regular}[
-        BoldFont       = SourceHanMonoTC-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMonoTC-Medium ]
-}{
-    \setCJKfamilyfont{TCmono}{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\fi
+%%================================
+%%  Fonts
+%%================================
+\WarningFilter { latexfont } { Font~shape }
+\WarningFilter { latexfont } { Some~font  }
 
-\if at PJLlang@enable at JP
-\IfFontExistsTF{SourceHanSerif-Regular}{%
-    \setCJKfamilyfont{JPmain}{SourceHanSerif-Regular}[
-        BoldFont       = SourceHanSerif-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerif-Bold ]
-}{
-    \setCJKfamilyfont{JPmain}{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\IfFontExistsTF{SourceHanSans-Regular}{%
-    \setCJKfamilyfont{JPsans}{SourceHanSans-Regular}[
-        BoldFont       = SourceHanSans-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSans-Bold ]
-}{
-    \setCJKfamilyfont{JPsans}{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
-\IfFontExistsTF{SourceHanMono-Regular}{%
-    \setCJKfamilyfont{JPmono}{SourceHanMono-Regular}[
-        BoldFont       = SourceHanMono-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMono-Medium ]
-}{
-    \setCJKfamilyfont{JPmono}{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\fi
+\cs_new_protected:Nn \__minimclass_load_file_or_config:Nnn
+  {
+    \bool_if:NT #1
+      {
+        \exp_args:Nx \file_if_exist:nT { #2 }
+          {
+            \exp_args:Nx \file_input:n { #2 }
+            \use_none:nn
+          }
+      }
+    \use:n { #3 }
+  }
 
-\WarningFilter{latexfont}{Font shape}
-\WarningFilter{latexfont}{Some font}
+\cs_new_protected:Nn \__minimclass_if_font_exist:nnn
+  {
+    \bool_if:NTF \l__minimclass_fast_bool
+      { #3 }
+      { \fontspec_font_if_exist:nTF { #1 } { #2 } { #3 } }
+  }
 
-\def\CJKsffamily{}
-\def\CJKttfamily{}
+\__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_bool { \l__minimclass_custom_font_file_str }
+  {
+    \RequirePackage { projlib-font }
 
-\apptocmd{\sffamily}{\CJKsffamily}{}{\FAIL}
-\apptocmd{\ttfamily}{\CJKttfamily}{}{\FAIL}
+    \bool_if:NF \g_projlib_font_already_set_bool
+      {
+        \bool_if:NT \l__minimclass_fast_bool
+          {
+            \RequirePackage { mathpazo }
+          }
 
-\if at PJLlang@enable at CN
-\gappto{\PJLlang at langconfig@CN}{%
-    \def\CJKsffamily{\CJKfamily{SCsans}}%
-    \def\CJKttfamily{\CJKfamily{SCmono}}%
-    \CJKfamily{SCmain}%
-}
-\fi
+        \PassOptionsToPackage { no-math,quiet } { fontspec }
+        \RequirePackage { fontspec }
 
-\if at PJLlang@enable at TC
-\gappto{\PJLlang at langconfig@TC}{%
-    \def\CJKsffamily{\CJKfamily{TCsans}}%
-    \def\CJKttfamily{\CJKfamily{TCmono}}%
-    \CJKfamily{TCmain}%
-}
-\fi
+        \__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_latin_bool { \l__minimclass_custom_font_file_latin_str }
+          {
+            \__minimclass_if_font_exist:nnn { Palatino~Linotype }
+              {
+                \bool_if:NTF \l__projlib_font_useosf_bool
+                  {
+                    \setmainfont { Palatino~Linotype } [ Numbers = OldStyle ]
+                  }
+                  {
+                    \setmainfont { Palatino~Linotype }
+                  }
+              }
+              {
+                \bool_if:NTF \l__projlib_font_useosf_bool
+                  {
+                    \setmainfont { TeXGyrePagellaX-Regular.otf }
+                      [
+                        BoldFont       = TeXGyrePagellaX-Bold.otf ,
+                        ItalicFont     = TeXGyrePagellaX-Italic.otf ,
+                        BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf ,
+                        Numbers        = OldStyle ,
+                      ]
+                  }
+                  {
+                    \setmainfont { TeXGyrePagellaX-Regular.otf }
+                      [
+                        BoldFont       = TeXGyrePagellaX-Bold.otf ,
+                        ItalicFont     = TeXGyrePagellaX-Italic.otf ,
+                        BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf ,
+                      ]
+                  }
+              }
+            \setsansfont { SourceSansPro-Regular.otf }
+              [
+                Scale          = MatchLowercase ,
+                BoldFont       = SourceSansPro-Bold.otf ,
+                ItalicFont     = SourceSansPro-RegularIt.otf ,
+                BoldItalicFont = SourceSansPro-BoldIt.otf ,
+              ]
+            \setmonofont { NewCMMono10-Regular.otf }
+              [
+                Scale          = 1.05 ,
+                BoldFont       = NewCMMono10-Bold.otf ,
+                ItalicFont     = NewCMMono10-Italic.otf ,
+                BoldItalicFont = NewCMMono10-BoldOblique.otf ,
+              ]
 
-\if at PJLlang@enable at JP
-\gappto{\PJLlang at langconfig@JP}{%
-    \def\CJKsffamily{\CJKfamily{JPsans}}%
-    \def\CJKttfamily{\CJKfamily{JPmono}}%
-    \CJKfamily{JPmain}%
-}
-\fi
+            \projlib_language_set_linespacing_latin:n { \setstretch { 1.07 } }
+          }
+      }
 
-\def\minimalist at titlefontshape{\CJKsffamily}
-}
+    \PassOptionsToPackage { fontset = none, scheme = plain } { ctex }
+    \RequirePackage { ctex }
 
-\if at minimclass@customfont\else
-\if at minimclass@fast
-\RequirePackage{amssymb}
-\else
-\PassOptionsToPackage
-    {warnings-off={mathtools-colon,mathtools-overbracket}}{unicode-math}
-\RequirePackage{unicode-math}
-\unimathsetup{math-style=ISO, partial=upright, nabla=upright}
-\setmathfont{Asana-Math.otf}
-\IfFontExistsTF{Neo Euler}{%
-\setmathfont[range={up/{Latin,latin,Greek,greek},
-                    bfup/{Latin,latin,Greek,greek},
-                    cal, bfcal, frak, bffrak,
-                    `(,`),`[,`],`\{,`\},`:,`=,\ne,\equiv,`/,\backslash,
-                    \in,\notin,\ni,\subset,\supset,\subseteq,\supseteq,
-                    \rightarrow,\leftarrow,\mapsto,\hookrightarrow,\hookleftarrow,
-                    \sum,\prod,\coprod,
-                    \sqrt,\int,\iint,\iiint,\oint},
-              script-features={},
-              sscript-features={},
-              Scale = 1.05,
-            ]{Neo Euler}
-}{}
-\setmathfont[range={\leq,\geq,\ll,\gg,\lll,\ggg,\leqslant,\geqslant},
-              Scale = 0.95,
-            ]{latinmodern-math.otf}
-\setmathfont[range={up/num, bfup/num}
-            ]{texgyrepagella-math.otf}
+    \__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_cjk_bool { \l__minimclass_custom_font_file_cjk_str }
+      {
+        \__minimclass_if_font_exist:nnn { SourceHanSerifSC-Regular }
+          {
+            \setCJKmainfont { SourceHanSerifSC-Regular }
+              [
+                BoldFont       = SourceHanSerifSC-Bold ,
+                ItalicFont     = * ,
+                BoldItalicFont = SourceHanSerifSC-Bold ,
+              ]
+          }
+          {
+            \setCJKmainfont { FandolSong-Regular.otf }
+              [
+                BoldFont       = FandolSong-Bold.otf ,
+                ItalicFont     = FandolKai-Regular.otf ,
+                BoldItalicFont = FandolKai-Regular.otf ,
+                BoldItalicFeatures = { FakeBold = 4 } ,
+              ]
+          }
 
-\AtBeginDocument{
-\let\mid at original\mid
-\renewcommand{\mid}{\hspace{-.2em}\mid at original\hspace{-.2em}}
-\let\nmid at original\nmid
-\renewcommand{\nmid}{\hspace{-.2em}\nmid at original\hspace{-.2em}}
-\renewcommand{\frac}[2]{\genfrac{}{}{}{}{
-    \mathchoice
-        {\raisebox{-.15em}{$\displaystyle #1$}}
-        {\raisebox{-.15em}{$\textstyle #1$}}
-        {\raisebox{-.08em}{$\scriptstyle #1$}}
-        {\scriptscriptstyle #1}
-}{
-    \mathchoice
-        {\raisebox{.08em}{$\displaystyle #2$}}
-        {\raisebox{.08em}{$\textstyle #2$}}
-        {\raisebox{.05em}{$\scriptstyle #2$}}
-        {\scriptscriptstyle #2}
-}}
-}
+        \__minimclass_if_font_exist:nnn { SourceHanSansSC-Regular }
+          {
+            \setCJKsansfont{SourceHanSansSC-Regular}
+              [
+                BoldFont       = SourceHanSansSC-Bold ,
+                ItalicFont     = * ,
+                BoldItalicFont = SourceHanSansSC-Bold ,
+              ]
+          }
+          {
+            \setCJKsansfont { FandolHei-Regular.otf }
+              [
+                BoldFont       = FandolHei-Bold.otf ,
+                ItalicFont     = * ,
+                BoldItalicFont = FandolHei-Bold.otf ,
+              ]
+          }
 
-\RequirePackage{tikz-cd}
-\newbox\xratbelow
-\newbox\xratabove
-\renewcommand{\xrightarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [->, baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) -- node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xleftarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [<-, baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) -- node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xleftrightarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [<->, baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) -- node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xhookrightarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/hookrightarrow] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xhookleftarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/hookleftarrow] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xmapsto}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/mapsto] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\newcommand{\xlongequal}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/equal] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\AtBeginDocument{
-\renewcommand{\twoheadrightarrow}{%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/twoheadrightarrow] (.8em,0) ;}}
-\renewcommand{\twoheadleftarrow}{%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/twoheadleftarrow] (.8em,0) ;}}
-}
-\fi
-\fi
+        \__minimclass_if_font_exist:nnn { SourceHanMonoSC-Regular }
+          {
+            \setCJKmonofont { SourceHanMonoSC-Regular }
+              [
+                BoldFont       = SourceHanMonoSC-Medium ,
+                ItalicFont     = * ,
+                BoldItalicFont = SourceHanMonoSC-Medium ,
+              ]
+          }
+          {
+            \setCJKmonofont { FandolFang-Regular.otf }
+              [
+                BoldFont       = * ,
+                BoldFeatures   = { FakeBold = 4 } ,
+                ItalicFont     = * ,
+                BoldItalicFont = * ,
+                BoldItalicFeatures = { FakeBold = 4 } ,
+              ]
+          }
 
-\if at minimclass@lmodern
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \RequirePackage{cfr-lm}
-    \else
-        \RequirePackage{lmodern}
-    \fi
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+        \bool_if:NT \g__projlib_language_enabled_schinese_bool
+          {
+            \__minimclass_if_font_exist:nnn { SourceHanSerifSC-Regular }
+              {
+                \setCJKfamilyfont { SCmain } { SourceHanSerifSC-Regular }
+                  [
+                    BoldFont       = SourceHanSerifSC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSerifSC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { SCmain } { FandolSong-Regular.otf }
+                  [
+                    BoldFont       = FandolSong-Bold.otf ,
+                    ItalicFont     = FandolKai-Regular.otf ,
+                    BoldItalicFont = FandolKai-Regular.otf ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanSansSC-Regular }
+              {
+                \setCJKfamilyfont { SCsans } { SourceHanSansSC-Regular }
+                  [
+                    BoldFont       = SourceHanSansSC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSansSC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { SCsans } { FandolHei-Regular.otf }
+                  [
+                    BoldFont       = FandolHei-Bold.otf ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = FandolHei-Bold.otf ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanMonoSC-Regular }
+              {
+                \setCJKfamilyfont { SCmono } { SourceHanMonoSC-Regular }
+                  [
+                    BoldFont       = SourceHanMonoSC-Medium ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanMonoSC-Medium ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { SCmono } { FandolFang-Regular.otf }
+                  [
+                    BoldFont       = * ,
+                    BoldFeatures   = { FakeBold = 4 } ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = * ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+          }
 
-\if at minimclass@palatino
-    \RequirePackage{amssymb}
-    \RequirePackage{mathpazo}
-    \PassOptionsToPackage{defaultsups}{newpxtext}
-    \RequirePackage{newpxtext}
-    % \RequirePackage{newpxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.07}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+        \bool_if:NT \g__projlib_language_enabled_tchinese_bool
+          {
+            \__minimclass_if_font_exist:nnn { SourceHanSerifTC-Regular }
+              {
+                \setCJKfamilyfont { TCmain } { SourceHanSerifTC-Regular }
+                  [
+                    BoldFont       = SourceHanSerifTC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSerifTC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { TCmain } { FandolSong-Regular.otf }
+                  [
+                    BoldFont       = FandolSong-Bold.otf ,
+                    ItalicFont     = FandolKai-Regular.otf ,
+                    BoldItalicFont = FandolKai-Regular.otf ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanSansTC-Regular }
+              {
+                \setCJKfamilyfont { TCsans } { SourceHanSansTC-Regular }
+                  [
+                    BoldFont       = SourceHanSansTC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSansTC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { TCsans } { FandolHei-Regular.otf }
+                  [
+                    BoldFont       = FandolHei-Bold.otf ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = FandolHei-Bold.otf ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanMonoTC-Regular }
+              {
+                \setCJKfamilyfont { TCmono } { SourceHanMonoTC-Regular }
+                  [
+                    BoldFont       = SourceHanMonoTC-Medium ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanMonoTC-Medium ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { TCmono } { FandolFang-Regular.otf }
+                  [
+                    BoldFont       = * ,
+                    BoldFeatures   = { FakeBold = 4 } ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = * ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+          }
 
-\if at minimclass@times
-    \RequirePackage{amssymb}
-    \PassOptionsToPackage{defaultsups}{newtxtext}
-    \RequirePackage{newtxtext}
-    \RequirePackage{newtxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.00}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+        \bool_if:NT \g__projlib_language_enabled_japanese_bool
+          {
+            \__minimclass_if_font_exist:nnn { SourceHanSerif-Regular }
+              {
+                \setCJKfamilyfont { JPmain } { SourceHanSerif-Regular }
+                  [
+                    BoldFont       = SourceHanSerif-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSerif-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { JPmain } { FandolSong-Regular.otf }
+                  [
+                    BoldFont       = FandolSong-Bold.otf ,
+                    ItalicFont     = FandolKai-Regular.otf ,
+                    BoldItalicFont = FandolKai-Regular.otf ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanSans-Regular }
+              {
+                \setCJKfamilyfont { JPsans } { SourceHanSans-Regular }
+                  [
+                    BoldFont       = SourceHanSans-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSans-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { JPsans } { FandolHei-Regular.otf }
+                  [
+                    BoldFont       = FandolHei-Bold.otf ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = FandolHei-Bold.otf ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanMono-Regular }
+              {
+                \setCJKfamilyfont { JPmono } { SourceHanMono-Regular }
+                  [
+                    BoldFont       = SourceHanMono-Medium ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanMono-Medium ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { JPmono } { FandolFang-Regular.otf }
+                  [
+                    BoldFont       = * ,
+                    BoldFeatures   = { FakeBold = 4 } ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = * ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+          }
 
-\if at minimclass@garamond
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf\else
-        \PassOptionsToPackage{lining}{ebgaramond}
-    \fi
-    \RequirePackage{ebgaramond-maths}
-    \RequirePackage{ebgaramond}
-    % \RequirePackage{garamondlibre}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+        \cs_new:Nn \minimclass_cjk_sffamily: {}
+        \cs_new:Nn \minimclass_cjk_ttfamily: {}
 
-\if at minimclass@noto
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \PassOptionsToPackage{oldstyle}{notomath}
-    \fi
-    \RequirePackage{anyfontsize}
-    \RequirePackage{notomath}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+        \hook_gput_code:nnn { cmd/sffamily/after } { minimclass } { \minimclass_cjk_sffamily: }
+        \hook_gput_code:nnn { cmd/ttfamily/after } { minimclass } { \minimclass_cjk_ttfamily: }
 
-\if at minimclass@biolinum
-    \RequirePackage{amssymb}
-    % \RequirePackage{mathpazo}
-    % \RequirePackage[sansmath]{libertinust1math}
-    \ifPDFTeX
-        \if at minimclass@useosf
-            \PassOptionsToPackage{osf}{biolinum}
-        \fi
-        \RequirePackage{biolinum}
-        \renewcommand*\familydefault{\biolinum at family}
-    \else
-        \PassOptionsToPackage{no-math}{fontspec}
-        \RequirePackage{fontspec}
-        \setmainfont{LinBiolinum_R.otf}[
-            BoldFont       = LinBiolinum_RB.otf ,
-            ItalicFont     = LinBiolinum_RI.otf ,
-            BoldItalicFont = LinBiolinum_RBO.otf,
-            \if at minimclass@useosf Numbers = OldStyle\fi ]
-    \fi
-    \PJLsetlinespacing{\setstretch{1.05}}
-    \RequirePackage[italic,defaultmathsizes]{mathastext}
-\fi
+        \AddLanguageSetting [schinese]
+          {
+            \cs_set:Nn \minimclass_cjk_sffamily: { \CJKfamily { SCsans } }
+            \cs_set:Nn \minimclass_cjk_ttfamily: { \CJKfamily { SCmono } }
+            \CJKfamily { SCmain }
+          }
+        \AddLanguageSetting [tchinese]
+          {
+            \cs_set:Nn \minimclass_cjk_sffamily: { \CJKfamily { TCsans } }
+            \cs_set:Nn \minimclass_cjk_ttfamily: { \CJKfamily { TCmono } }
+            \CJKfamily { TCmain }
+          }
+        \AddLanguageSetting [japanese]
+          {
+            \cs_set:Nn \minimclass_cjk_sffamily: { \CJKfamily { JPsans } }
+            \cs_set:Nn \minimclass_cjk_ttfamily: { \CJKfamily { JPmono } }
+            \CJKfamily { JPmain }
+          }
 
-\def\PJL at font@alreadyset{}
+        \tl_gset:Nn \g_minimalist_title_font_common_tl { \minimclass_cjk_sffamily: }
+      }
 
-\PassOptionsToPackage{verbose=silent}{microtype}
-\RequirePackage{microtype}
-\PassOptionsToPackage{all}{nowidow}
-\RequirePackage{nowidow}
-\RequirePackage{embrac}
+    \__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_math_bool { \l__minimclass_custom_font_file_math_str }
+      {
+        \bool_if:NF \g_projlib_font_already_set_bool
+          {
+            \bool_if:NTF \l__minimclass_fast_bool
+              {
+                \RequirePackage { amssymb }
+              }
+              {
+                \PassOptionsToPackage { warnings-off = { mathtools-colon, mathtools-overbracket } } { unicode-math }
+                \RequirePackage { unicode-math }
+                \unimathsetup { math-style = ISO, partial = upright, nabla = upright }
+                \setmathfont { Asana-Math.otf }
+                \__minimclass_if_font_exist:nnn { Neo~Euler }
+                  {
+                    \setmathfont { Neo~Euler }
+                      [
+                        range             = { up / { Latin, latin, Greek, greek },
+                                              bfup / { Latin, latin, Greek, greek },
+                                              cal, bfcal, frak, bffrak,
+                                              `(, `), `[, `], `\{, `\}, `:, `=, \ne, \equiv, `/, \backslash,
+                                              \in, \notin, \ni, \subset, \supset, \subseteq, \supseteq,
+                                              \rightarrow, \leftarrow, \leftrightarrow,
+                                              \longleftarrow, \longrightarrow, \longleftrightarrow,
+                                              \Leftarrow, \Rightarrow, \Leftrightarrow,
+                                              \Longleftarrow, \Longrightarrow, \Longleftrightarrow,
+                                              \nrightarrow, \nleftarrow, \nleftrightarrow,
+                                              \nLeftarrow, \nRightarrow, \nLeftrightarrow,
+                                              \mapsto, \hookrightarrow, \hookleftarrow,
+                                              \leftharpoonup, \rightharpoonup, \leftharpoondown, \rightharpoondown,
+                                              \rightleftharpoons, \leftrightharpoons,
+                                              \sum, \prod, \coprod,
+                                              \sqrt, \int, \iint, \iiint, \oint
+                                            },
+                        script-features   = {},
+                        sscript-features  = {},
+                        Scale             = 1.05,
+                      ]
+                  }{}
+                \setmathfont { latinmodern-math.otf }
+                  [
+                    range = { \leq, \geq, \ll, \gg, \lll, \ggg, \leqslant, \geqslant },
+                    Scale = 0.95,
+                  ]
+                \setmathfont { texgyrepagella-math.otf }
+                  [
+                    range = { up / num, bfup / num }
+                  ]
 
-%%================================
-%% Graphics
-%%================================
-\RequirePackage{graphicx}
-\graphicspath{{images/}}
-\RequirePackage{wrapfig}
-\RequirePackage{float}
-\RequirePackage{caption}
-\captionsetup{font=small}
+                \hook_gput_code:nnn { begindocument } { minimclass }
+                  {
+                    \NewCommandCopy \minimclass_backup_mid: \mid
+                    \RenewDocumentCommand \mid {}
+                      { \skip_horizontal:n {-.15em} \minimclass_backup_mid: \skip_horizontal:n {-.15em} }
+                    \NewCommandCopy \minimclass_backup_nmid: \nmid
+                    \RenewDocumentCommand \nmid {}
+                      { \skip_horizontal:n {-.15em} \minimclass_backup_nmid: \skip_horizontal:n {-.15em} }
+                  }
 
+                \RequirePackage { tikz-cd }
+
+                \box_new:N \l__minimclass_xarrows_above_box
+                \box_new:N \l__minimclass_xarrows_below_box
+                \dim_new:N \l__minimclass_xarrows_length_dim
+                \cs_new_protected:Nn \minimclass_xarrows_generic:nnnn
+                  % #3 = option of \tikz
+                  % #4 = edge of \draw
+                  {
+                    \hbox_set:Nn \l__minimclass_xarrows_below_box { \ensuremath { \scriptstyle #1 } }
+                    \hbox_set:Nn \l__minimclass_xarrows_above_box { \ensuremath { \scriptstyle #2 } }
+                    \dim_set:Nn \l__minimclass_xarrows_length_dim
+                      { \dim_eval:n { \dim_max:nn { \box_wd:N \l__minimclass_xarrows_below_box } { \box_wd:N \l__minimclass_xarrows_above_box } + .8em } }
+                    \mathrel
+                      {
+                        \tikz [ #3, baseline = -.55ex, every~node/.style = { inner~sep = 0pt } ]
+                          \draw (0,0) #4
+                            node [ below = 3pt ] { \box_use:N \l__minimclass_xarrows_below_box }
+                            node [ above = 2pt ] { \box_use:N \l__minimclass_xarrows_above_box }
+                            ( \l__minimclass_xarrows_length_dim ,0) ;
+                      }
+                  }
+
+                \RenewDocumentCommand \xrightarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } { -> } { -- }
+                  }
+                \RenewDocumentCommand \xleftarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } { <- } { -- }
+                  }
+                \RenewDocumentCommand \xleftrightarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } { <-> } { -- }
+                  }
+                \RenewDocumentCommand \xhookrightarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/hookrightarrow ] }
+                  }
+                \RenewDocumentCommand \xhookleftarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/hookleftarrow ] }
+                  }
+                \RenewDocumentCommand \xmapsto { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/mapsto ] }
+                  }
+                \NewDocumentCommand \xlongequal { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/equal ] }
+                  }
+                \hook_gput_code:nnn { begindocument/end } { minimclass }
+                  {
+                    \RenewDocumentCommand \twoheadrightarrow {}
+                      {
+                        \minimclass_xarrows_generic:nnnn { \,\, } {} {} { edge [ commutative~diagrams/twoheadrightarrow ] }
+                      }
+                    \RenewDocumentCommand \twoheadleftarrow {}
+                      {
+                        \minimclass_xarrows_generic:nnnn { \,\, } {} {} { edge [ commutative~diagrams/twoheadleftarrow ] }
+                      }
+                  }
+              }
+          }
+      }
+  }
+
+\PassOptionsToPackage { all } { nowidow }
+\RequirePackage { nowidow }
+\RequirePackage { embrac }
+
 %%================================
-%% Index
+%%  Graphics
 %%================================
-\AtEndPreamble{
-\pretocmd{\printindex}{\LocallyStopLineNumbers}{}{}
-\apptocmd{\printindex}{\ResumeLineNumbers}{}{}
-}
+\RequirePackage { graphicx }
+\graphicspath { { images/ } }
+\RequirePackage { wrapfig }
+\RequirePackage { float }
+\RequirePackage { caption }
+\captionsetup { font = small }
 
 \endinput
 %%

Added: branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-classical.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-classical.sty	                        (rev 0)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-classical.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -0,0 +1,841 @@
+%%
+%% This is file `minimalist/minimalist-classical.sty',
+%% generated with the docstrip utility.
+
+%% Copyright (C) 2021-2022 by Jinwen XU
+%% 
+%% This is part of the minimalist class series.
+%% 
+%% This work may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License, either version 1.3c of this license or (at
+%% your option) any later version. The latest version of this license is in
+%% 
+%%     http://www.latex-project.org/lppl.txt
+%% 
+%% and version 1.3c or later is part of all distributions of LaTeX version
+%% 2005/12/01 or later.
+%% 
+\NeedsTeXFormat{LaTeX2e}[2020-10-01]
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+  {minimalist-classical}
+  {2022/03/17} {}
+  {The classical style of minimalist}
+
+\@ifpackageloaded { minimalist } {}
+  {
+    \msg_new:nnn { \@currname }
+      { minimalist-not-loaded }
+      { "#1"~is~an~internal~style~of~"minimalist".~To~use~it,~you~must~load~the~package~"minimalist"~first. }
+    \msg_warning:nnx { \@currname } { minimalist-not-loaded } { \@currname }
+    \endinput
+  }
+
+%%================================
+%%  Title fonts
+%%================================
+\RequirePackage { anyfontsize }
+
+\bool_if:NTF \l__minimalist_use_boldface_bool
+  {
+    \cs_new:Nn \minimalist_bfseries: { \bfseries \colorlet{minimalist-temp-color}{.} \color{minimalist-temp-color!70!paper} }
+  }
+  {
+    \cs_new:Nn \minimalist_bfseries: {}
+  }
+
+\tl_new:N \g_minimalist_title_font_common_tl
+
+\tl_new:N \g_minimalist_title_font_part_tl
+\tl_new:N \g_minimalist_title_font_chapter_tl
+\tl_new:N \g_minimalist_title_font_section_tl
+\tl_new:N \g_minimalist_title_font_subsection_tl
+\tl_new:N \g_minimalist_title_font_subsubsection_tl
+\tl_new:N \g_minimalist_title_font_paragraph_tl
+
+\tl_gset:Nn \g_minimalist_title_font_part_tl          { \minimalist_bfseries: \g_minimalist_title_font_common_tl }
+\tl_gset:Nn \g_minimalist_title_font_chapter_tl       { \minimalist_bfseries: \g_minimalist_title_font_common_tl }
+\tl_gset:Nn \g_minimalist_title_font_section_tl       { \minimalist_bfseries: }
+\tl_gset:Nn \g_minimalist_title_font_subsection_tl    { \minimalist_bfseries: }
+\tl_gset:Nn \g_minimalist_title_font_subsubsection_tl { \minimalist_bfseries: \itshape }
+\tl_gset:Nn \g_minimalist_title_font_paragraph_tl     { \minimalist_bfseries: \scshape }
+
+\bool_if:NF \l__minimalist_fast_bool
+  {
+    \RequirePackage { tikz }
+    \ExplSyntaxOff
+    \usetikzlibrary{calc,shadings}
+    \ExplSyntaxOn
+    \RequirePackage { tikzpagenodes } % For `current page text area`
+  }
+
+\bool_if:NTF \l__minimalist_fast_bool
+  {
+    \tl_const:Nn \l_minimalist_sep_bar { $|$ }
+  }
+  {
+    \tl_const:Nn \l_minimalist_sep_bar
+      {
+        \skip_horizontal:n { .1em }
+        \tikz[baseline=.125em] \draw[line~width=.9pt] (0,0) -- (0,.9em);
+        \skip_horizontal:n { .1em }
+      }
+  }
+
+%%================================
+%%  Footer
+%%================================
+\RequirePackage { geometry }
+\RequirePackage { fancyhdr }
+\RequirePackage { extramarks }
+
+\hook_gput_code:nnn { begindocument/before } { minimalist }
+  {
+    \fancyhfoffset { 0pt }
+  }
+
+\tl_new:N \l_minimalist_leftmark_tl
+\tl_new:N \l_minimalist_rightmark_tl
+
+\tl_set:Nn \l_minimalist_leftmark_tl
+  {
+    \begin{minipage}[t]{.833\textwidth}
+      \lastleftmark
+    \end{minipage}
+  }
+\tl_set:Nn \l_minimalist_rightmark_tl
+  {
+    \begin{minipage}[t]{.833\textwidth}
+      \filleft
+      \lastrightmark
+    \end{minipage}
+  }
+
+\fancypagestyle { fancy }
+  {
+    \fancyhf{}
+    \if at twoside
+      \fancyfoot[RO]{\small\textcolor{main-text!30!paper}{ \l_minimalist_rightmark_tl }
+        \nobreakspace\nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+      \fancyfoot[LE]{\small\leavevmode\llap{\thepage
+        \nobreakspace\nobreakspace\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }}
+        \nobreakspace\nobreakspace\textcolor{main-text!30!paper}{ \l_minimalist_leftmark_tl }}
+    \else
+      \fancyfoot[R]{\small\textcolor{main-text!30!paper}{ \l_minimalist_rightmark_tl }
+        \nobreakspace\nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+    \fi
+    \renewcommand{\headrulewidth}{0pt}
+  }
+\pagestyle{fancy}
+
+\fancypagestyle { plain }
+  {
+    \fancyhf{}
+    \if at twoside
+      \fancyfoot[RO]{\small
+        \nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+      \fancyfoot[LE]{\small\leavevmode\llap{\thepage
+        \nobreakspace\nobreakspace\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }}}
+    \else
+      \fancyfoot[R]{\small
+        \nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+    \fi
+    \renewcommand{\headrulewidth}{0pt}
+  }
+
+\bool_if:NTF \l__minimalist_is_book_bool
+  {
+    \bool_if:NTF \l__minimalist_fast_bool
+      {
+        \newcommand{ \minimalist_draw_help_line: }{}
+      }
+      {
+        \newcommand{ \minimalist_draw_help_line: }{
+            \begin{tikzpicture}[remember~picture,overlay]
+                \foreach\i in {0,1,...,5}{
+                    \fill[opacity=0.12-0.02*\i]
+                        ($(current~page~text~area.north~east)
+                            +(-\i*0.5em-.025em,-10pt+\i*1.1pt)$)
+                        rectangle ($(current~page~text~area.south~east)
+                            +(-\i*0.5em+.025em,10pt-\i*1.1pt)$);
+                    \shade[top~color=paper,bottom~color=main-text,opacity=0.12-0.02*\i]
+                        ($(current~page~text~area.north~east)
+                            +(-\i*0.5em-.025em,2pt)$)
+                        rectangle ($(current~page~text~area.north~east)
+                            +(-\i*0.5em+.025em,-10pt+\i*1.1pt)$);
+                    \shade[top~color=main-text,bottom~color=paper,opacity=0.12-0.02*\i]
+                        ($(current~page~text~area.south~east)
+                            +(-\i*0.5em-.025em,-2pt)$)
+                        rectangle ($(current~page~text~area.south~east)
+                            +(-\i*0.5em+.025em,10pt-\i*1.1pt)$);
+                }
+            \end{tikzpicture}
+        }
+      }
+    \fancypagestyle{part}{
+        \fancyhf{}
+        \renewcommand{\headrulewidth}{0pt}
+        \fancyhead[C]{ \minimalist_draw_help_line: }
+    }
+    \addtolength{\headheight}{20pt}
+    \addtolength{\topmargin}{-20pt}
+    \if at twoside
+        \renewcommand{\chaptermark}[1]{\markboth{\textsc{#1}}{}}
+    \else
+        \renewcommand{\chaptermark}[1]{\markboth{\textsc{#1}}{\textsc{#1}}}
+    \fi
+    \renewcommand*{\sectionmark}[1]{
+      \markright{\g_minimalist_section_decoration_char_tl\nobreakspace\arabic{section}\nobreakspace\g_minimalist_section_decoration_char_tl\nobreakspace\nobreakspace\nobreakspace#1}}
+  }
+  {
+    \if at twoside
+        \renewcommand*{\sectionmark}[1]{\markboth{\textsc{#1}}{}}
+    \else
+        \renewcommand*{\sectionmark}[1]{\markboth{\textsc{#1}}{\textsc{#1}}}
+    \fi
+  }
+
+%%================================
+%%  Line numbers
+%%================================
+\PassOptionsToPackage { pagewise,mathlines } { lineno }
+\RequirePackage { linenoamsmath }
+\renewcommand{\linenumberfont}{\ttfamily\color{main-text!7!paper}\footnotesize}
+\setlength{\linenumbersep}{1em}
+
+\newif\ifLNturnsON
+\def\LocallyStopLineNumbers{\LNturnsONfalse
+    \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers}
+\def\ResumeLineNumbers{\ifLNturnsON\linenumbers\fi}
+
+\hook_gput_code:nnn { cmd/tableofcontents/before } { minimalist } { \LocallyStopLineNumbers }
+\hook_gput_code:nnn { cmd/tableofcontents/after } { minimalist } { \ResumeLineNumbers }
+\hook_gput_code:nnn { env/bibliography/before } { minimalist } { \LocallyStopLineNumbers }
+\hook_gput_code:nnn { env/bibliography/after } { minimalist } { \ResumeLineNumbers }
+
+%%================================
+%%  Title format
+%%================================
+\RequirePackage [ explicit, newparttoc ] { titlesec }
+\PassOptionsToPackage { normalem } { ulem }
+\RequirePackage { ulem }
+
+\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }
+\cs_new:Nn \minimalist_apply_title_numbering_style:N
+  {
+    #1
+  }
+
+\newcommand{\partstring}{\MakeUppercase{{\partname\nobreakspace\protect\thepart}}}
+
+\AddLanguageSetting
+  {
+    \renewcommand{\partstring}{\MakeUppercase{{\partname\nobreakspace\protect\thepart}}}
+  }
+\AddLanguageSetting [ schinese ]
+  {
+    \renewcommand{\partstring}{第 \nobreakspace\thepart\nobreakspace 部分}
+  }
+\AddLanguageSetting [ tchinese ]
+  {
+    \renewcommand{\partstring}{第 \nobreakspace\thepart\nobreakspace 部分}
+  }
+\AddLanguageSetting [ japanese ]
+  {
+    \renewcommand{\partstring}{第 \nobreakspace\thepart\nobreakspace 部}
+  }
+
+\bool_if:NTF \l__minimalist_is_book_bool
+  {
+    \setcounter{secnumdepth}{3}
+
+    %% Part
+    \titleclass{\part}{top} % make part like a chapter
+    \titleformat{\part}[display]
+      {\thispagestyle{part}
+      \LocallyStopLineNumbers
+      \g_minimalist_title_font_part_tl\filleft}
+      {\partstring}
+      {1em}
+      {\fontsize{20}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    \titleformat{name=\part,numberless}[display]
+      {\thispagestyle{part}
+      \LocallyStopLineNumbers
+        % \phantomsection\addcontentsline{toc}{part}{#1}
+      \g_minimalist_title_font_part_tl\filleft}
+      {\phantom{\MakeUppercase{\partname}}}
+      {1em}
+      {\fontsize{20}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    \titlespacing*{\part}{0pt}{5em}{6em}
+    %% Text after part
+    \newcommand{\parttext}[1]{
+      \vfill
+      \LocallyStopLineNumbers
+      \begin{flushright}
+        \begin{minipage}{0.833\textwidth}
+          \color{main-text!80!paper}\raggedleft#1
+        \end{minipage}
+      \end{flushright}
+      \ResumeLineNumbers
+      \vfill\vfill
+      \cleardoublepage
+    }
+
+    %% Chapter
+    \titleformat{\chapter}
+      {\thispagestyle{fancy}
+      \LocallyStopLineNumbers
+      \color{main-text!80!paper}\g_minimalist_title_font_chapter_tl\fontsize{16}{0}\selectfont}{}{0em}
+      {\rlap{\hspace*{-.5em}{\color{main-text!12!paper}
+        \fontsize{80}{0}\selectfont\raisebox{-7pt}{\thechapter}}}#1}
+      [\ResumeLineNumbers]
+    \titleformat{name=\chapter,numberless}
+      {\thispagestyle{fancy}
+      \LocallyStopLineNumbers
+        % \phantomsection\addcontentsline{toc}{chapter}{#1}
+      \color{main-text!80!paper}\g_minimalist_title_font_chapter_tl\fontsize{16}{0}\selectfont}{}{0em}
+      {\rlap{\hspace*{-.5em}{\color{main-text!12!paper}
+        \fontsize{80}{0}\selectfont\normalfont\raisebox{-7pt}{*}}}#1}
+      [\ResumeLineNumbers]
+  }
+  {
+    %% Part
+    \titleformat{\part}[display]
+      {\LocallyStopLineNumbers
+      \g_minimalist_title_font_part_tl\filleft}
+      {\partstring}
+      {.3em}
+      {\fontsize{16}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    \titleformat{name=\part,numberless}[display]
+      {\LocallyStopLineNumbers
+        % \phantomsection\addcontentsline{toc}{part}{#1}
+      \g_minimalist_title_font_part_tl\filleft}
+      {\phantom{\MakeUppercase{\partname}}}
+      {.3em}
+      {\fontsize{16}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    %% Text after part
+    \newcommand{\parttext}[1]{
+      \LocallyStopLineNumbers
+      \begin{flushright}
+        \begin{minipage}{0.833\textwidth}
+          \color{main-text!80!paper}\raggedleft#1
+        \end{minipage}
+      \end{flushright}
+      \ResumeLineNumbers
+    }
+  }
+
+%% Section
+\renewcommand\thesection{\arabic{section}}
+\newcommand\seculine{\bgroup\markoverwith{\color{main-text!27!paper}
+    \rule[-0.9ex]{2pt}{.6pt}\hspace{-2pt}\rule[-1.2ex]{2pt}{.6pt}}\ULon}
+\bool_if:NTF \l__minimalist_fast_bool
+  {
+    \tl_gset:Nn \g_minimalist_section_decoration_char_tl { \raisebox{.03em}{\normalfont/} }
+  }
+  {
+    \tl_gset:Nn \g_minimalist_section_decoration_char_tl
+      {
+        \tikz[baseline=.125em] \draw[line~width=.9pt] (-.12em,0) -- (.12em,.9em);
+      }
+  }
+\titleformat{\section}
+  {\LocallyStopLineNumbers
+  \g_minimalist_title_font_section_tl\centering}{}{0em}
+  {{\small\textcolor{main-text!27!paper}{\footnotesize \g_minimalist_section_decoration_char_tl }
+    \,\,\textcolor{main-text!90!paper}{\minimalist_bfseries:\arabic{section}}
+    \,\,\textcolor{main-text!27!paper}{\footnotesize \g_minimalist_section_decoration_char_tl }}\\
+    \seculine{#1}}
+  [\ResumeLineNumbers]
+\titleformat{name=\section,numberless}
+  {\LocallyStopLineNumbers
+    % \phantomsection\addcontentsline{toc}{section}{#1}
+  \g_minimalist_title_font_section_tl\centering}{}{0em}
+  {\seculine{#1}}
+  [\ResumeLineNumbers]
+
+%% Subsection
+\renewcommand\thesubsection{
+  \ifnum\c at section=0\else\arabic{section}.\fi\arabic{subsection}}
+\newcommand\subseculine{\bgroup\markoverwith{\color{main-text!27!paper}
+  \rule[-1ex]{2pt}{.75pt}}\ULon}
+\titleformat{\subsection}
+  {\LocallyStopLineNumbers
+  \g_minimalist_title_font_subsection_tl}{}{0em}
+  {\subseculine{\thesubsection\nobreakspace\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace #1}}
+  [\ResumeLineNumbers]
+\titleformat{name=\subsection,numberless}
+  {\LocallyStopLineNumbers
+  \g_minimalist_title_font_subsection_tl}{}{0em}
+  {\subseculine{#1}}
+  [\ResumeLineNumbers]
+
+%% Subsubsection
+\bool_if:NTF \l__minimalist_runin_bool
+  {
+    \titleformat{\subsubsection}[runin]
+      {\color{main-text!70!paper}\g_minimalist_title_font_subsubsection_tl}
+      {\scalebox{0.9}{\thesubsubsection}}{.33em}
+      {#1.}[\hspace*{.3em}]
+  }
+  {
+    \titleformat{\subsubsection}
+      {\LocallyStopLineNumbers
+      \color{main-text!70!paper}\g_minimalist_title_font_subsubsection_tl}
+      {\scalebox{0.9}{\thesubsubsection}}{.33em}
+      {#1}
+      [\ResumeLineNumbers]
+  }
+
+%% Paragraph
+\titleformat{\paragraph}[runin]
+  { \g_minimalist_title_font_paragraph_tl }{\theparagraph}{1em}{#1}
+
+\titlespacing{\section}{0pt}{\baselineskip}{.6\baselineskip}
+\titlespacing{\subsection}{0pt}{.75\baselineskip}{.4\baselineskip}
+\titlespacing{\subsubsection}{0pt}{.5\baselineskip}{.3\baselineskip}
+
+%%================================
+%%  ToC format
+%%================================
+\RequirePackage { titletoc }
+\titlecontents{part}
+  [0em]
+  {\addvspace{1.5pc}\filcenter\normalfont}
+  {\thecontentslabel\nopagebreak\\\nopagebreak\uppercase}
+  {}
+  {} % without page number
+  [\addvspace{.5pc}]
+
+\bool_if:NTF \l__minimalist_is_book_bool
+  {
+    \titlecontents{chapter}
+      [2em] % i.e., 0em (part) + 2em
+      {\addvspace{.5pc}\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2em}}
+      {\hspace*{-2em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{section}
+      [4em] % i.e., 2em (chapter) + 2em
+      {\normalfont}
+      {\contentslabel[\textcolor{main-text!27!paper}{\small\g_minimalist_section_decoration_char_tl}\,\textcolor{main-text!90!paper}{ \minimalist_apply_title_numbering_style:N { \thecontentslabel } }\,\textcolor{main-text!27!paper}{\small\g_minimalist_section_decoration_char_tl}]{2em}}
+      {\hspace*{-2em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsection}
+      [7em] % i.e., 4em (section) + 3em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2.75em}}
+      {\hspace*{-2.75em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsubsection}
+      [9.5em] % i.e., 7em (subsection) + 3.5em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{3.25em}}
+      {\hspace*{-3.25em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+  }
+  {
+    \titlecontents{section}
+      [2em] % i.e., 0em (part) + 2em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{1.75em}}
+      {\hspace*{-1.75em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsection}
+      [4.5em] % i.e., 2em (section) + 2.5em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2.25em}}
+      {\hspace*{-2.25em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsubsection}
+      [7.5em] % i.e., 4.5em (subsection) + 3em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2.75em}}
+      {\hspace*{-2.75em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+  }
+
+%%================================
+%%  Lists
+%%================================
+\RequirePackage { enumitem }
+\setlist{noitemsep}
+\setlist[enumerate]{labelsep=*, leftmargin=*}
+\setlist[enumerate,1]{label=\arabic*$)$,
+    ref = \arabic*$)$}
+\setlist[enumerate,2]{label=\emph{\roman*}$)$,
+    ref = \arabic{enumi}.\emph{\roman*}$)$}
+\setlist[enumerate,3]{label=\emph{\alph*}$)$,
+    ref = \arabic{enumi}.\emph{\roman{enumii}}.\emph{\alph*}$)$}
+\setlist[description]{font=\normalfont\minimalist_bfseries:}
+\newcommand\desculine{\colorlet{currentcolor}{.}\bgroup\markoverwith{\color{currentcolor!55!paper}
+  \rule[-.45ex]{2pt}{.75pt}}\ULon}
+\renewcommand{\descriptionlabel}[1]{
+  \hspace{\labelsep}\normalfont\desculine{#1}
+}
+
+\setlist[itemize]{leftmargin=*}
+\AddLanguageSetting { \setlist[itemize,1]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{$\bullet$}} }
+\AddLanguageSetting [french] { \setlist[itemize,1]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!55!paper}{---}} }
+\setlist[itemize,2]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{--}}
+\setlist[itemize,3]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{\texttt{*}}}
+
+%%================================
+%%  Blank page
+%%================================
+\newcommand{\blinkpagetext}{This~page~is~intentionally~left~blank}
+\renewcommand{\cleardoublepage}{
+  \relax
+  \clearpage
+  \if at twoside\ifodd\c at page\relax\else
+  \thispagestyle{empty}
+  \hook_gput_next_code:nn { shipout/background }
+    {
+      \put(0.5\paperwidth,-0.5\paperheight){
+      \makebox[0pt]{\large\color{main-text!10!paper}\blinkpagetext}}
+    }
+  \null\newpage\fi\fi
+}
+
+%%================================
+%%  Draft mark
+%%================================
+\RequirePackage { projlib-draft }
+
+%%================================
+%%  Theorems
+%%================================
+\RequirePackage { mathtools }
+\RequirePackage { amsthm }
+
+\def\simpleqedsymbol{
+  \makebox[1em]{\rlap{\textcolor{main-text!12!paper}{\rule[-0.1em]{.95em}{.95em}}}{\kern.07em\raisebox{.07em}{\textcolor{paper}{\rule[-0.1em]{.81em}{.81em}}}\kern.07em}}}
+\bool_if:NTF \l__minimalist_theorem_in_new_line_bool
+  {
+    \newtheoremstyle{simple}
+      {.5\baselineskip}{.5\baselineskip}
+      {\normalfont}{}
+      {\normalfont}{}
+      {\newline}
+      { \global\let\qedsymbol\simpleqedsymbol
+        {\thmname{#1}\nobreakspace\thmnumber{#2}}
+        \thmnote{\hspace{.4em}\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\hspace{.4em}\color{main-text!50!paper}\ensuremath{(\text{#3})}}
+        \smallskip
+        \pushQED{\qed}
+      }
+  }
+  {
+    \newtheoremstyle{simple}
+      {.5\baselineskip}{.5\baselineskip}
+      {\normalfont}{}
+      {\normalfont}{}
+      {0pt}
+      { \global\let\qedsymbol\simpleqedsymbol
+        {\thmname{#1}\nobreakspace\thmnumber{#2}}\hspace{.4em}
+        \textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\hspace{.4em}
+        \color{main-text!50!paper}\thmnote{\ensuremath{(\text{#3})}\nobreakspace\nobreakspace}
+        \pushQED{\qed}
+      }
+  }
+\def\@endtheorem{\global\let\qedsymbol\simpleqedsymbol
+  \popQED\endtrivlist\@endpefalse
+  \global\let\qedsymbol\qedsymbolOriginal}
+
+\theoremstyle{simple}
+
+\renewcommand{\qedsymbol}{
+  \makebox[1em]{\color{main-text!27!paper}\rule[-0.1em]{.95em}{.95em}}}
+\let\qedsymbolOriginal\qedsymbol
+
+\bool_if:NTF \l__minimalist_fast_bool
+  {
+    \providecommand{\phantomsection}{}
+    \RequirePackage { url }
+    \newcommand{\href}[2]{#2}
+  }
+  {
+    \PassOptionsToPackage { hidelinks,linktoc=all } { hyperref }
+    \RequirePackage { bookmark }
+    \RequirePackage { hyperref }
+  }
+
+\RequirePackage { projlib-theorem }
+
+\bool_if:NF \l__projlib_theorem_complexname_bool
+  {
+    \exp_args:No \SetTheorem { \c_projlib_theorem_supported_clist }
+      {
+        name style = {
+          , heading style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , Crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , numbering style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+        }
+      }
+
+    \SetTheorem { remark }
+      {
+        name style = {
+          , heading style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , numbering style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+        }
+      }
+  }
+
+\bool_if:NF \l__minimalist_fast_bool
+  {
+    \bool_if:NT \l__minimalist_theorem_in_new_line_bool
+      {
+        \PassOptionsToPackage { many } { tcolorbox }
+        \RequirePackage { tcolorbox }
+        \cs_new_protected:Nn \minimclass_box_environment:n
+          {
+            \hook_gput_code:nnn { env/#1/before } { minimalist }
+              {
+                \LocallyStopLineNumbers
+                \begin { tcolorbox }
+                  [
+                    enhanced~jigsaw,
+                    frame~hidden,
+                    interior~hidden,
+                    top = 0pt, bottom = 0pt,
+                    left = 0pt, right = 0pt,
+                    boxrule = 0pt, boxsep = 0pt,
+                    before~skip = 1em+\parskip,
+                    after~skip = 1.2em+\parskip,
+                    breakable, lines~before~break=3,
+                  ]
+              }
+            \hook_gput_code:nnn { env/#1/after } { minimalist }
+              {
+                \end { tcolorbox }
+                \ResumeLineNumbers
+              }
+          }
+        \exp_args:No \clist_map_inline:nn { \c_projlib_theorem_supported_clist }
+          {
+            \minimclass_box_environment:n { #1 }
+            \minimclass_box_environment:n { #1 * }
+          }
+      }
+  }
+
+%%================================
+%%  Index
+%%================================
+\hook_gput_code:nnn { begindocument/before } { minimalist }
+{
+  \hook_gput_code:nnn { cmd/printindex/before } { minimalist } { \LocallyStopLineNumbers }
+  \hook_gput_code:nnn { cmd/printindex/after } { minimalist } { \ResumeLineNumbers }
+}
+
+\bool_if:NF \l__minimalist_is_book_bool {
+
+%%================================
+%%  Title block style
+%%================================
+\renewcommand{\@maketitle}{
+  \LocallyStopLineNumbers
+  \noindent
+  {\textcolor{main-text!27!paper}{\rule{\textwidth}{0.75pt}}}
+  % \vspace{-\parskip}
+  \vspace{-.5\baselineskip}
+  \begin{flushright}
+    \let\footnote\thanks
+    {\minimalist_bfseries:\@title}\\\medskip
+    \color{main-text!80!paper}
+    {\small\scshape\@author}
+    \par\vspace{-\parskip}\vspace{2pt}
+    {\small\@date}
+  \end{flushright}
+  % \vspace{-\parskip}
+  \vspace{-.5\baselineskip}
+  \ifx\@date\@empty
+      \vspace{\baselineskip}
+      \vspace{1.2\parskip}
+  \else
+      \vspace{-.5\baselineskip}
+  \fi
+  {\textcolor{main-text!27!paper}{\rule{\textwidth}{0.75pt}}\par}
+  \ResumeLineNumbers
+}
+
+\hook_gput_code:nnn { cmd/maketitle/after } { minimalist } { \thispagestyle{fancy} }
+
+%%================================
+%%  Abstract style
+%%================================
+\renewenvironment{abstract}
+  {
+    \LocallyStopLineNumbers
+    \begin{flushright}
+      { \g_minimalist_title_font_section_tl \scshape \small\abstractname}\par
+      \vspace{-\parskip}
+      \vspace{-.25\baselineskip}
+      \begin{minipage}[t]{.833\textwidth}
+        \vspace{0pt}
+        \color{main-text!80!paper}
+        \footnotesize
+        \parindent=2em
+  }
+  {
+      \end{minipage}
+    \end{flushright}
+    \bigskip
+    \ResumeLineNumbers
+  }
+
+%%================================
+%%  Keyword environment
+%%================================
+\DefineMultilingualText { \keywordname }
+  {
+    EN = Keywords                               ,
+    FR = Mots~clés                              ,
+    DE = Schlüsselwörter                        ,
+    IT = Parole~chiave                          ,
+    PT = Palavras~chave                         ,
+    BR = Palavras~chave                         ,
+    ES = Palabras~clave                         ,
+    CN = 关键词                                 ,
+    TC = 關鍵詞                                 ,
+    JP = キーワード                             ,
+    RU = Ключевые~слова                         ,
+  }
+
+\newenvironment{keyword}{
+  \LocallyStopLineNumbers
+  \vspace{-.5\baselineskip}
+  \begin{flushright}
+    {\minimalist_bfseries:\scshape\small\keywordname}\par
+    \vspace{-\parskip}
+    \vspace{-.30\baselineskip}
+    \begin{minipage}[t]{.833\textwidth}
+      \vspace{0pt}
+      \color{main-text!80!paper}
+      \footnotesize
+      \parindent=2em
+      \raggedleft
+}{
+    \end{minipage}
+  \end{flushright}
+  \bigskip
+  \ResumeLineNumbers
+}
+
+%%================================
+%%  Simulate features of amsart
+%%================================
+\PassOptionsToPackage { amsfashion } { projlib-author }
+\RequirePackage { projlib-author }
+
+}
+
+\endinput
+%%
+%% End of file `minimalist/minimalist-classical.sty'.


Property changes on: branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-classical.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-plain.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-plain.sty	                        (rev 0)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-plain.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -0,0 +1,786 @@
+%%
+%% This is file `minimalist/minimalist-plain.sty',
+%% generated with the docstrip utility.
+
+%% Copyright (C) 2021-2022 by Jinwen XU
+%% 
+%% This is part of the minimalist class series.
+%% 
+%% This work may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License, either version 1.3c of this license or (at
+%% your option) any later version. The latest version of this license is in
+%% 
+%%     http://www.latex-project.org/lppl.txt
+%% 
+%% and version 1.3c or later is part of all distributions of LaTeX version
+%% 2005/12/01 or later.
+%% 
+\NeedsTeXFormat{LaTeX2e}[2020-10-01]
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+  {minimalist-plain}
+  {2022/03/17} {}
+  {The plain style of minimalist}
+
+\@ifpackageloaded { minimalist } {}
+  {
+    \msg_new:nnn { \@currname }
+      { minimalist-not-loaded }
+      { "#1"~is~an~internal~style~of~"minimalist".~To~use~it,~you~must~load~the~package~"minimalist"~first. }
+    \msg_warning:nnx { \@currname } { minimalist-not-loaded } { \@currname }
+    \endinput
+  }
+
+%%================================
+%%  Title fonts
+%%================================
+\RequirePackage { anyfontsize }
+
+\bool_if:NTF \l__minimalist_use_boldface_bool
+  {
+    \cs_new:Nn \minimalist_bfseries: { \bfseries \colorlet{minimalist-temp-color}{.} \color{minimalist-temp-color!70!paper} }
+  }
+  {
+    \cs_new:Nn \minimalist_bfseries: {}
+  }
+
+\tl_new:N \g_minimalist_title_font_common_tl
+
+\tl_new:N \g_minimalist_title_font_part_tl
+\tl_new:N \g_minimalist_title_font_chapter_tl
+\tl_new:N \g_minimalist_title_font_section_tl
+\tl_new:N \g_minimalist_title_font_subsection_tl
+\tl_new:N \g_minimalist_title_font_subsubsection_tl
+\tl_new:N \g_minimalist_title_font_paragraph_tl
+
+\tl_gset:Nn \g_minimalist_title_font_part_tl          { \minimalist_bfseries: \g_minimalist_title_font_common_tl }
+\tl_gset:Nn \g_minimalist_title_font_chapter_tl       { \minimalist_bfseries: \g_minimalist_title_font_common_tl }
+\tl_gset:Nn \g_minimalist_title_font_section_tl       { \minimalist_bfseries: \g_minimalist_title_font_common_tl \scshape }
+\tl_gset:Nn \g_minimalist_title_font_subsection_tl    { \minimalist_bfseries: \g_minimalist_title_font_common_tl \scshape }
+\tl_gset:Nn \g_minimalist_title_font_subsubsection_tl { \minimalist_bfseries: \g_minimalist_title_font_common_tl }
+\tl_gset:Nn \g_minimalist_title_font_paragraph_tl     { \minimalist_bfseries: \g_minimalist_title_font_common_tl \scshape }
+
+\bool_if:NF \l__minimalist_fast_bool
+  {
+    \RequirePackage { tikz }
+    \ExplSyntaxOff
+    \usetikzlibrary{calc,shadings}
+    \ExplSyntaxOn
+    \RequirePackage { tikzpagenodes } % For `current page text area`
+  }
+
+\bool_if:NTF \l__minimalist_fast_bool
+  {
+    \tl_const:Nn \l_minimalist_sep_bar { $|$ }
+  }
+  {
+    \tl_const:Nn \l_minimalist_sep_bar
+      {
+        \skip_horizontal:n { .1em }
+        \tikz[baseline=.125em] \draw[line~width=.9pt] (0,0) -- (0,.9em);
+        \skip_horizontal:n { .1em }
+      }
+  }
+
+%%================================
+%%  Footer
+%%================================
+\RequirePackage { geometry }
+\RequirePackage { fancyhdr }
+\RequirePackage { extramarks }
+
+\hook_gput_code:nnn { begindocument/before } { minimalist }
+  {
+    \fancyhfoffset { 0pt }
+  }
+
+\tl_new:N \l_minimalist_leftmark_tl
+\tl_new:N \l_minimalist_rightmark_tl
+
+\tl_set:Nn \l_minimalist_leftmark_tl
+  {
+    \begin{minipage}[t]{.833\textwidth}
+      \lastleftmark
+    \end{minipage}
+  }
+\tl_set:Nn \l_minimalist_rightmark_tl
+  {
+    \begin{minipage}[t]{.833\textwidth}
+      \filleft
+      \lastrightmark
+    \end{minipage}
+  }
+
+\fancypagestyle { fancy }
+  {
+    \fancyhf{}
+    \if at twoside
+      \fancyfoot[RO]{\small\textcolor{main-text!30!paper}{ \l_minimalist_rightmark_tl }
+        \nobreakspace\nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+      \fancyfoot[LE]{\small\leavevmode\llap{\thepage
+        \nobreakspace\nobreakspace\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }}
+        \nobreakspace\nobreakspace\textcolor{main-text!30!paper}{ \l_minimalist_leftmark_tl }}
+    \else
+      \fancyfoot[R]{\small\textcolor{main-text!30!paper}{ \l_minimalist_rightmark_tl }
+        \nobreakspace\nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+    \fi
+    \renewcommand{\headrulewidth}{0pt}
+  }
+\pagestyle{fancy}
+
+\fancypagestyle { plain }
+  {
+    \fancyhf{}
+    \if at twoside
+      \fancyfoot[RO]{\small
+        \nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+      \fancyfoot[LE]{\small\leavevmode\llap{\thepage
+        \nobreakspace\nobreakspace\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }}}
+    \else
+      \fancyfoot[R]{\small
+        \nobreakspace\rlap{\textcolor{main-text!27!paper}{ \l_minimalist_sep_bar }\nobreakspace\nobreakspace\thepage}}
+    \fi
+    \renewcommand{\headrulewidth}{0pt}
+  }
+
+\bool_if:NTF \l__minimalist_is_book_bool
+  {
+    \bool_if:NTF \l__minimalist_fast_bool
+      {
+        \newcommand{ \minimalist_draw_help_line: }{}
+      }
+      {
+        \newcommand{ \minimalist_draw_help_line: }{
+            \begin{tikzpicture}[remember~picture,overlay]
+                \foreach\i in {0,1,...,5}{
+                    \fill[opacity=0.12-0.02*\i]
+                        ($(current~page~text~area.north~east)
+                            +(-\i*0.5em-.025em,-10pt+\i*1.1pt)$)
+                        rectangle ($(current~page~text~area.south~east)
+                            +(-\i*0.5em+.025em,10pt-\i*1.1pt)$);
+                    \shade[top~color=paper,bottom~color=main-text,opacity=0.12-0.02*\i]
+                        ($(current~page~text~area.north~east)
+                            +(-\i*0.5em-.025em,2pt)$)
+                        rectangle ($(current~page~text~area.north~east)
+                            +(-\i*0.5em+.025em,-10pt+\i*1.1pt)$);
+                    \shade[top~color=main-text,bottom~color=paper,opacity=0.12-0.02*\i]
+                        ($(current~page~text~area.south~east)
+                            +(-\i*0.5em-.025em,-2pt)$)
+                        rectangle ($(current~page~text~area.south~east)
+                            +(-\i*0.5em+.025em,10pt-\i*1.1pt)$);
+                }
+            \end{tikzpicture}
+        }
+      }
+    \fancypagestyle{part}{
+        \fancyhf{}
+        \renewcommand{\headrulewidth}{0pt}
+        \fancyhead[C]{ \minimalist_draw_help_line: }
+    }
+    \addtolength{\headheight}{20pt}
+    \addtolength{\topmargin}{-20pt}
+    \if at twoside
+        \renewcommand{\chaptermark}[1]{\markboth{\textsc{#1}}{}}
+    \else
+        \renewcommand{\chaptermark}[1]{\markboth{\textsc{#1}}{\textsc{#1}}}
+    \fi
+    \renewcommand*{\sectionmark}[1]{
+      \markright{\g_minimalist_section_decoration_char_tl\nobreakspace\arabic{section}\nobreakspace\g_minimalist_section_decoration_char_tl\nobreakspace\nobreakspace\nobreakspace#1}}
+  }
+  {
+    \if at twoside
+        \renewcommand*{\sectionmark}[1]{\markboth{\textsc{#1}}{}}
+    \else
+        \renewcommand*{\sectionmark}[1]{\markboth{\textsc{#1}}{\textsc{#1}}}
+    \fi
+  }
+
+%%================================
+%%  Line numbers
+%%================================
+\PassOptionsToPackage { pagewise,mathlines } { lineno }
+\RequirePackage { linenoamsmath }
+\renewcommand{\linenumberfont}{\ttfamily\color{main-text!7!paper}\footnotesize}
+\setlength{\linenumbersep}{1em}
+
+\newif\ifLNturnsON
+\def\LocallyStopLineNumbers{\LNturnsONfalse
+    \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers}
+\def\ResumeLineNumbers{\ifLNturnsON\linenumbers\fi}
+
+\hook_gput_code:nnn { cmd/tableofcontents/before } { minimalist } { \LocallyStopLineNumbers }
+\hook_gput_code:nnn { cmd/tableofcontents/after } { minimalist } { \ResumeLineNumbers }
+\hook_gput_code:nnn { env/bibliography/before } { minimalist } { \LocallyStopLineNumbers }
+\hook_gput_code:nnn { env/bibliography/after } { minimalist } { \ResumeLineNumbers }
+
+%%================================
+%%  Title format
+%%================================
+\RequirePackage [ explicit, newparttoc ] { titlesec }
+\PassOptionsToPackage { normalem } { ulem }
+\RequirePackage { ulem }
+
+\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }
+\cs_new:Nn \minimalist_apply_title_numbering_style:N
+  {
+    \seq_set_split:Nnx \l_tmpa_seq { . } { #1 }
+    \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \usefont{U}{zeur}{b}{n} ##1 }
+    \textcolor{main-text!39!paper}{ \seq_use:Nn \l_tmpb_seq { $.$ } }
+  }
+
+\newcommand{\partstring}{\MakeUppercase{{\partname\nobreakspace\protect\thepart}}}
+
+\AddLanguageSetting
+  {
+    \renewcommand{\partstring}{\MakeUppercase{{\partname\nobreakspace\protect\thepart}}}
+  }
+\AddLanguageSetting [ schinese ]
+  {
+    \renewcommand{\partstring}{第 \nobreakspace\thepart\nobreakspace 部分}
+  }
+\AddLanguageSetting [ tchinese ]
+  {
+    \renewcommand{\partstring}{第 \nobreakspace\thepart\nobreakspace 部分}
+  }
+\AddLanguageSetting [ japanese ]
+  {
+    \renewcommand{\partstring}{第 \nobreakspace\thepart\nobreakspace 部}
+  }
+
+\bool_if:NTF \l__minimalist_is_book_bool
+  {
+    \setcounter{secnumdepth}{3}
+
+    %% Part
+    \titleclass{\part}{top} % make part like a chapter
+    \titleformat{\part}[display]
+      {\thispagestyle{part}
+      \LocallyStopLineNumbers
+      \g_minimalist_title_font_part_tl\filleft}
+      {\partstring}
+      {1em}
+      {\fontsize{20}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    \titleformat{name=\part,numberless}[display]
+      {\thispagestyle{part}
+      \LocallyStopLineNumbers
+        % \phantomsection\addcontentsline{toc}{part}{#1}
+      \g_minimalist_title_font_part_tl\filleft}
+      {\phantom{\MakeUppercase{\partname}}}
+      {1em}
+      {\fontsize{20}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    \titlespacing*{\part}{0pt}{5em}{6em}
+    %% Text after part
+    \newcommand{\parttext}[1]{
+      \vfill
+      \LocallyStopLineNumbers
+      \begin{flushright}
+        \begin{minipage}{0.833\textwidth}
+          \color{main-text!80!paper}\raggedleft#1
+        \end{minipage}
+      \end{flushright}
+      \ResumeLineNumbers
+      \vfill\vfill
+      \cleardoublepage
+    }
+
+    %% Chapter
+    \titleformat{\chapter}
+      {\thispagestyle{fancy}
+      \LocallyStopLineNumbers
+      \color{main-text!80!paper}\g_minimalist_title_font_chapter_tl\fontsize{16}{0}\selectfont}{}{0em}
+      {\rlap{\hspace*{-.5em}{\color{main-text!12!paper}
+        \fontsize{80}{0}\selectfont\raisebox{-7pt}{\thechapter}}}#1}
+      [\ResumeLineNumbers]
+    \titleformat{name=\chapter,numberless}
+      {\thispagestyle{fancy}
+      \LocallyStopLineNumbers
+        % \phantomsection\addcontentsline{toc}{chapter}{#1}
+      \color{main-text!80!paper}\g_minimalist_title_font_chapter_tl\fontsize{16}{0}\selectfont}{}{0em}
+      {\rlap{\hspace*{-.5em}{\color{main-text!12!paper}
+        \fontsize{80}{0}\selectfont\normalfont\raisebox{-7pt}{*}}}#1}
+      [\ResumeLineNumbers]
+  }
+  {
+    %% Part
+    \titleformat{\part}[display]
+      {\LocallyStopLineNumbers
+      \g_minimalist_title_font_part_tl\filleft}
+      {\partstring}
+      {.3em}
+      {\fontsize{16}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    \titleformat{name=\part,numberless}[display]
+      {\LocallyStopLineNumbers
+        % \phantomsection\addcontentsline{toc}{part}{#1}
+      \g_minimalist_title_font_part_tl\filleft}
+      {\phantom{\MakeUppercase{\partname}}}
+      {.3em}
+      {\fontsize{16}{0}\selectfont\MakeUppercase{#1}}
+      [\ResumeLineNumbers]
+    %% Text after part
+    \newcommand{\parttext}[1]{
+      \LocallyStopLineNumbers
+      \begin{flushright}
+        \begin{minipage}{0.833\textwidth}
+          \color{main-text!80!paper}\raggedleft#1
+        \end{minipage}
+      \end{flushright}
+      \ResumeLineNumbers
+    }
+  }
+
+%% Section
+\tl_gset:Nn \g_minimalist_section_decoration_char_tl {}
+\titleformat{\section}
+  {\LocallyStopLineNumbers
+  \g_minimalist_title_font_section_tl\centering}
+  {\raisebox{-.02\baselineskip}{\large \minimalist_apply_title_numbering_style:N { \thesection } }}{1em}
+  {#1}
+  [\ResumeLineNumbers]
+
+%% Subsection
+\titleformat{\subsection}
+  {\LocallyStopLineNumbers
+  \g_minimalist_title_font_subsection_tl}
+  { \minimalist_apply_title_numbering_style:N { \thesubsection } }{.75em}
+  {#1}
+  [\ResumeLineNumbers]
+
+%% Subsubsection
+\bool_if:NTF \l__minimalist_runin_bool
+  {
+    \titleformat{\subsubsection}[runin]
+      {\g_minimalist_title_font_subsubsection_tl}
+      { \minimalist_apply_title_numbering_style:N { \thesection } }{.5em}
+      {#1.}[\hspace*{.3em}]
+  }
+  {
+    \titleformat{\subsubsection}
+      {\LocallyStopLineNumbers
+      \g_minimalist_title_font_subsubsection_tl}
+      { \minimalist_apply_title_numbering_style:N { \thesubsubsection } }{.5em}
+      {#1}
+      [\ResumeLineNumbers]
+  }
+
+%% Paragraph
+\titleformat{\paragraph}[runin]
+  { \g_minimalist_title_font_paragraph_tl }{\theparagraph}{1em}{#1}
+
+\titlespacing{\section}{0pt}{\baselineskip}{.6\baselineskip}
+\titlespacing{\subsection}{0pt}{.75\baselineskip}{.4\baselineskip}
+\titlespacing{\subsubsection}{0pt}{.5\baselineskip}{.3\baselineskip}
+
+%%================================
+%%  ToC format
+%%================================
+\RequirePackage { titletoc }
+\titlecontents{part}
+  [0em]
+  {\addvspace{1.5pc}\filcenter\normalfont}
+  {\thecontentslabel\nopagebreak\\\nopagebreak\uppercase}
+  {}
+  {} % without page number
+  [\addvspace{.5pc}]
+
+\bool_if:NTF \l__minimalist_is_book_bool
+  {
+    \titlecontents{chapter}
+      [2em] % i.e., 0em (part) + 2em
+      {\addvspace{.5pc}\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2em}}
+      {\hspace*{-2em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{section}
+      [4em] % i.e., 2em (chapter) + 2em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2em}}
+      {\hspace*{-2em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsection}
+      [7em] % i.e., 4em (section) + 3em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2.75em}}
+      {\hspace*{-2.75em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsubsection}
+      [9.5em] % i.e., 7em (subsection) + 3.5em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{3.25em}}
+      {\hspace*{-3.25em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+  }
+  {
+    \titlecontents{section}
+      [2em] % i.e., 0em (part) + 2em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{1.75em}}
+      {\hspace*{-1.75em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsection}
+      [4.5em] % i.e., 2em (section) + 2.5em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2.25em}}
+      {\hspace*{-2.25em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+    \titlecontents{subsubsection}
+      [7.5em] % i.e., 4.5em (subsection) + 3em
+      {\normalfont}
+      {\contentslabel[ \minimalist_apply_title_numbering_style:N { \thecontentslabel } ]{2.75em}}
+      {\hspace*{-2.75em}}
+      {\titlerule*[1em]{\textcolor{main-text!15!paper}{.}}\contentspage}
+  }
+
+%%================================
+%%  Lists
+%%================================
+\RequirePackage { enumitem }
+\setlist{noitemsep}
+\setlist[enumerate]{labelsep=*, leftmargin=*}
+\setlist[enumerate,1]{label=\arabic*$)$,
+    ref = \arabic*$)$}
+\setlist[enumerate,2]{label=\emph{\roman*}$)$,
+    ref = \arabic{enumi}.\emph{\roman*}$)$}
+\setlist[enumerate,3]{label=\emph{\alph*}$)$,
+    ref = \arabic{enumi}.\emph{\roman{enumii}}.\emph{\alph*}$)$}
+\setlist[description]{font=\normalfont\minimalist_bfseries:}
+
+\setlist[itemize]{leftmargin=*}
+\AddLanguageSetting { \setlist[itemize,1]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{$\bullet$}} }
+\AddLanguageSetting [french] { \setlist[itemize,1]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!55!paper}{---}} }
+\setlist[itemize,2]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{--}}
+\setlist[itemize,3]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{\texttt{*}}}
+
+%%================================
+%%  Blank page
+%%================================
+\newcommand{\blinkpagetext}{This~page~is~intentionally~left~blank}
+\renewcommand{\cleardoublepage}{
+  \relax
+  \clearpage
+  \if at twoside\ifodd\c at page\relax\else
+  \thispagestyle{empty}
+  \hook_gput_next_code:nn { shipout/background }
+    {
+      \put(0.5\paperwidth,-0.5\paperheight){
+      \makebox[0pt]{\large\color{main-text!10!paper}\blinkpagetext}}
+    }
+  \null\newpage\fi\fi
+}
+
+%%================================
+%%  Draft mark
+%%================================
+\RequirePackage { projlib-draft }
+
+%%================================
+%%  Theorems
+%%================================
+\RequirePackage { mathtools }
+\RequirePackage { amsthm }
+
+\bool_if:NTF \l__minimalist_theorem_in_new_line_bool
+  {
+    \newtheoremstyle{simple}
+      {}{}
+      {\normalfont}{}
+      {\normalfont}{}
+      {\newline}
+      {{\thmname{#1}\nobreakspace\thmnumber{#2}}
+        {\color{main-text!50!paper}\thmnote{\hspace{.4em}\ensuremath{(\text{#3})}}}\smallskip}
+  }
+  {
+    \newtheoremstyle{simple}
+      {}{}
+      {\normalfont}{}
+      {\normalfont}{}
+      {0pt}
+      {{\thmname{#1}\nobreakspace\thmnumber{#2}}
+        {\color{main-text!50!paper}\thmnote{\hspace{.4em}\ensuremath{(\text{#3})}}}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace}
+  }
+
+\theoremstyle{simple}
+
+\renewcommand{\qedsymbol}{
+  \makebox[1em]{\color{main-text!27!paper}\rule[-0.1em]{.95em}{.95em}}}
+\let\qedsymbolOriginal\qedsymbol
+
+\bool_if:NTF \l__minimalist_fast_bool
+  {
+    \providecommand{\phantomsection}{}
+    \RequirePackage { url }
+    \newcommand{\href}[2]{#2}
+  }
+  {
+    \PassOptionsToPackage { hidelinks,linktoc=all } { hyperref }
+    \RequirePackage { bookmark }
+    \RequirePackage { hyperref }
+  }
+
+\RequirePackage { projlib-theorem }
+
+\bool_if:NF \l__projlib_theorem_complexname_bool
+  {
+    \exp_args:No \SetTheorem { \c_projlib_theorem_supported_clist }
+      {
+        name style = {
+          , heading style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , Crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textsc
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , numbering style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+        }
+      }
+
+    \SetTheorem { remark }
+      {
+        name style = {
+          , heading style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , crefname style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl\textit
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+          , numbering style = {
+              , english = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , french = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , ngerman = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , italian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , portuguese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , brazilian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , spanish = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , schinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , tchinese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , japanese = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+              , russian = \minimalist_bfseries:\g_minimalist_title_font_common_tl
+            }
+        }
+      }
+  }
+
+\bool_if:NF \l__minimalist_fast_bool
+  {
+    \bool_if:NT \l__minimalist_theorem_in_new_line_bool
+      {
+        \PassOptionsToPackage { many } { tcolorbox }
+        \RequirePackage { tcolorbox }
+        \cs_new_protected:Nn \minimclass_box_environment:n
+          {
+            \hook_gput_code:nnn { env/#1/before } { minimalist }
+              {
+                \LocallyStopLineNumbers
+                \begin { tcolorbox }
+                  [
+                    enhanced~jigsaw,
+                    frame~hidden,
+                    interior~hidden,
+                    top = 0pt, bottom = 0pt,
+                    left = 0pt, right = 0pt,
+                    boxrule = 0pt, boxsep = 0pt,
+                    before~skip = 1em+\parskip,
+                    after~skip = 1.2em+\parskip,
+                    breakable, lines~before~break=3,
+                  ]
+              }
+            \hook_gput_code:nnn { env/#1/after } { minimalist }
+              {
+                \end { tcolorbox }
+                \ResumeLineNumbers
+              }
+          }
+        \exp_args:No \clist_map_inline:nn { \c_projlib_theorem_supported_clist }
+          {
+            \minimclass_box_environment:n { #1 }
+            \minimclass_box_environment:n { #1 * }
+          }
+      }
+  }
+
+%%================================
+%%  Index
+%%================================
+\hook_gput_code:nnn { begindocument/before } { minimalist }
+{
+  \hook_gput_code:nnn { cmd/printindex/before } { minimalist } { \LocallyStopLineNumbers }
+  \hook_gput_code:nnn { cmd/printindex/after } { minimalist } { \ResumeLineNumbers }
+}
+
+\bool_if:NF \l__minimalist_is_book_bool {
+
+%%================================
+%%  Title block style
+%%================================
+\renewcommand{\@maketitle}{
+  \LocallyStopLineNumbers
+  \begin{center}
+    \let\footnote\thanks
+    {\minimalist_bfseries:\sffamily\scshape\Large\@title}\\\bigskip
+    \color{main-text!80!paper}
+    {\small\scshape\@author}
+    \par\smallskip\vspace{-\parskip}
+    {\small\@date}
+  \end{center}
+  \ifx\@date\@empty\medskip\fi
+  \medskip\par
+  \ResumeLineNumbers
+}
+
+\hook_gput_code:nnn { cmd/maketitle/after } { minimalist } { \thispagestyle{fancy} }
+
+%%================================
+%%  Abstract style
+%%================================
+\renewenvironment{abstract}
+  {
+    \LocallyStopLineNumbers
+    \vspace{-.5\baselineskip}
+    \begin{center}
+      { \g_minimalist_title_font_section_tl \scshape \small\abstractname}\\
+      \vspace{-.3\baselineskip}
+      \begin{minipage}[t]{.833\textwidth}
+        \vspace{0pt}
+        \color{main-text!80!paper}
+        \footnotesize
+        \parindent=2em
+  }
+  {
+      \end{minipage}
+    \end{center}
+    \medskip
+    \ResumeLineNumbers
+  }
+
+%%================================
+%%  Keyword environment
+%%================================
+\DefineMultilingualText { \keywordname }
+  {
+    EN = Keywords                               ,
+    FR = Mots~clés                              ,
+    DE = Schlüsselwörter                        ,
+    IT = Parole~chiave                          ,
+    PT = Palavras~chave                         ,
+    BR = Palavras~chave                         ,
+    ES = Palabras~clave                         ,
+    CN = 关键词                                 ,
+    TC = 關鍵詞                                 ,
+    JP = キーワード                             ,
+    RU = Ключевые~слова                         ,
+  }
+
+\newenvironment{keyword}{
+  \LocallyStopLineNumbers
+  \vspace{-.75\baselineskip}
+  \begin{center}
+    {\minimalist_bfseries:\scshape\small\keywordname}\\
+    \vspace{-.3\baselineskip}
+    \begin{minipage}[t]{.833\textwidth}
+      \vspace{0pt}
+      \color{main-text!80!paper}
+      \footnotesize
+      \parindent=2em
+      \begin{center}
+}{
+      \end{center}
+    \end{minipage}
+  \end{center}
+  \medskip
+  \ResumeLineNumbers
+}
+
+%%================================
+%%  Simulate features of amsart
+%%================================
+\PassOptionsToPackage { amsfashion } { projlib-author }
+\RequirePackage { projlib-author }
+
+}
+
+\endinput
+%%
+%% End of file `minimalist/minimalist-plain.sty'.


Property changes on: branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist-plain.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimalist.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,7 +2,7 @@
 %% This is file `minimalist/minimalist.sty',
 %% generated with the docstrip utility.
 
-%% Copyright (C) 2021 by Jinwen XU
+%% Copyright (C) 2021-2022 by Jinwen XU
 %% 
 %% This is part of the minimalist class series.
 %% 
@@ -16,907 +16,77 @@
 %% 2005/12/01 or later.
 %% 
 \NeedsTeXFormat{LaTeX2e}[2020-10-01]
-\ProvidesPackage{minimalist}
-    [2021/12/16 A simple and clear style for articles and books]
-\RequirePackage{kvoptions}
-\RequirePackage{etoolbox}
-\SetupKeyvalOptions{%
-    family = @minimalist,
-    prefix = @minimalist@
-}
-\DeclareBoolOption[false]{draft}
-\DeclareBoolOption[false]{fast}
-\DeclareBoolOption[false]{puretext}
-\DeclareBoolOption[false]{nothms}
-\DeclareBoolOption[false]{delaythms}
-\DeclareBoolOption[false]{nothmnum}
-\DeclareStringOption{thmnum}[minimalist at thmnum@default]
-\DeclareBoolOption[true]{regionalref}
-\DeclareBoolOption[false]{originalref}
-\DeclareBoolOption[false]{allowbf}
-\DeclareBoolOption[false]{classical}
-\DeclareBoolOption[false]{runin}
-\ProcessKeyvalOptions*\relax
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+  {minimalist}
+  {2022/03/17} {}
+  {A simple and clear style for articles and books}
 
-\if at minimalist@originalref
-    \@minimalist at regionalreffalse
-\fi
-\if at minimalist@draft
-  \@minimalist at fasttrue
-\fi
-\if at minimalist@puretext
-  \@minimalist at nothmstrue
-\fi
+\keys_define:nn { minimalist }
+  {
+    , draft             .bool_set:N         = \l__minimalist_fast_bool
+    , draft             .initial:n          = { false }
+    , fast              .bool_set:N         = \l__minimalist_fast_bool
 
-\if at minimalist@fast
-    \PassOptionsToPackage{fast}{PJLdraft}
-    \PassOptionsToPackage{fast}{PJLthm}
-\fi
-\expandafter\ifstrempty\expandafter{\@minimalist at thmnum}{}{
-    \expandafter\ifstrequal\expandafter{\@minimalist at thmnum}{minimalist at thmnum@default}{
-        \PassOptionsToPackage{thmnum}{PJLthm}
-    }{
-        \PassOptionsToPackage{thmnum=\@minimalist at thmnum}{PJLthm}
-    }
-}
-\if at minimalist@regionalref\else
-    \PassOptionsToPackage{originalref}{PJLthm}
-\fi
+    , style             .str_set:N          = \l__minimalist_style_str
+    , style             .initial:n          = { plain }
+    , classical         .meta:n             = { style = classical }
 
-\if at minimalist@allowbf
-    \newcommand{\conditionalbfseries}{\bfseries\colorlet{PJLtempcolor}{.}\color{PJLtempcolor!83!paper}}
-\else
-    \newcommand{\conditionalbfseries}{}
-\fi
+    , use-boldface      .bool_set:N         = \l__minimalist_use_boldface_bool
+    , use-boldface      .initial:n          = { false }
+    , use~boldface      .bool_set:N         = \l__minimalist_use_boldface_bool
+    , use boldface      .bool_set:N         = \l__minimalist_use_boldface_bool
+    , usebf             .bool_set:N         = \l__minimalist_use_boldface_bool
+    , allow-boldface    .bool_set:N         = \l__minimalist_use_boldface_bool
+    , allow~boldface    .bool_set:N         = \l__minimalist_use_boldface_bool
+    , allow boldface    .bool_set:N         = \l__minimalist_use_boldface_bool
+    , allowbf           .bool_set:N         = \l__minimalist_use_boldface_bool
+    , runin             .bool_set:N         = \l__minimalist_runin_bool
+    , runin             .initial:n          = { false }
 
-\newif\ifIsBook
-\ifdefined\c at chapter\IsBooktrue\else\IsBookfalse\fi
+    , theorem-in-new-line .bool_set:N       = \l__minimalist_theorem_in_new_line_bool
+    , theorem-in-new-line .initial:n        = { false }
+    , theorem~in~new~line .bool_set:N       = \l__minimalist_theorem_in_new_line_bool
+    , theorem in new line .bool_set:N       = \l__minimalist_theorem_in_new_line_bool
 
-%%================================
-%% Title fonts
-%%================================
-\RequirePackage{anyfontsize}
+    , unknown           .code:n             = {
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-language }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-author }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-datetime }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-draft }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-font }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-logo }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-math }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-paper }
+                                                \PassOptionsToPackage { \CurrentOption } { projlib-theorem }
+                                              }
+  }
+\ProcessKeysOptions { minimalist }
 
-\def\minimalist at titlefontshape{}
+\bool_new:N \l__minimalist_is_book_bool
+\cs_if_exist:cTF { c at chapter }
+  {
+    \bool_set_true:N \l__minimalist_is_book_bool
+  }
+  {
+    \bool_set_false:N \l__minimalist_is_book_bool
+  }
 
-\if at minimalist@classical
-\newcommand{\partfont}{\conditionalbfseries\minimalist at titlefontshape}
-\newcommand{\chapfont}{\conditionalbfseries\minimalist at titlefontshape}
-\newcommand{\secfont}{\conditionalbfseries}
-\newcommand{\subsecfont}{\conditionalbfseries}
-\newcommand{\subsubsecfont}{\conditionalbfseries\itshape}
-\else
-\newcommand{\partfont}{\conditionalbfseries\minimalist at titlefontshape}
-\newcommand{\chapfont}{\conditionalbfseries\minimalist at titlefontshape}
-\newcommand{\secfont}{\conditionalbfseries\minimalist at titlefontshape}
-\newcommand{\subsecfont}{\conditionalbfseries\minimalist at titlefontshape}
-\newcommand{\subsubsecfont}{\conditionalbfseries\minimalist at titlefontshape}
-\fi
-
 %%================================
-%% Paper configuration
+%%  Paper configuration
 %%================================
-\RequirePackage{PJLpaper}
+\RequirePackage { projlib-paper }
 
 %%================================
-%% Footer
+%%  Multi-language support
 %%================================
-\RequirePackage{geometry}
-\RequirePackage{fancyhdr}
-\RequirePackage{extramarks}
+\RequirePackage { projlib-language }
 
-\AtEndPreamble{\fancyhfoffset{0pt}}
-
-\fancypagestyle{fancy}{
-    \fancyhf{}
-    \if at twoside
-        \fancyfoot[RO]{\small\textcolor{maintext!30!paper}{\lastrightmark}%
-            ~~\rlap{\textcolor{maintext!27!paper}{$|$}~~\thepage}}
-        \fancyfoot[LE]{\small\leavevmode\llap{\thepage%
-            ~~\textcolor{maintext!27!paper}{$|$}}%
-            ~~\textcolor{maintext!30!paper}{\lastleftmark}}
-    \else
-        \fancyfoot[R]{\small\textcolor{maintext!30!paper}{\lastrightmark}%
-            ~~\rlap{\textcolor{maintext!27!paper}{$|$}~~\thepage}}
-    \fi
-    \renewcommand{\headrulewidth}{0pt}
-}
-\pagestyle{fancy}
-
-\fancypagestyle{plain}{
-    \fancyhf{}
-    \if at twoside
-        \fancyfoot[RO]{\small%
-            ~\rlap{\textcolor{maintext!27!paper}{$|$}~~\thepage}}
-        \fancyfoot[LE]{\small\leavevmode\llap{\thepage%
-            ~~\textcolor{maintext!27!paper}{$|$}}}
-    \else
-        \fancyfoot[R]{\small%
-            ~\rlap{\textcolor{maintext!27!paper}{$|$}~~\thepage}}
-    \fi
-    \renewcommand{\headrulewidth}{0pt}
-}
-\ifbool{IsBook}{
-    \if at minimalist@fast
-    \newcommand{\drawHelpLine}{}
-    \else
-    \RequirePackage{tikz}
-    \usetikzlibrary{calc,shadings}
-    \RequirePackage{tikzpagenodes}% For `current page text area`
-    \newcommand{\drawHelpLine}{%
-        \begin{tikzpicture}[remember picture,overlay]
-            \foreach\i in {0,1,...,5}{%
-                \fill[opacity=0.12-0.02*\i]
-                    ($(current page text area.north east)
-                        +(-\i*0.5em-.025em,-10pt+\i*1.1pt)$)
-                    rectangle ($(current page text area.south east)
-                        +(-\i*0.5em+.025em,10pt-\i*1.1pt)$);
-                \shade[top color=paper,bottom color=maintext,opacity=0.12-0.02*\i]
-                    ($(current page text area.north east)
-                        +(-\i*0.5em-.025em,2pt)$)
-                    rectangle ($(current page text area.north east)
-                        +(-\i*0.5em+.025em,-10pt+\i*1.1pt)$);
-                \shade[top color=maintext,bottom color=paper,opacity=0.12-0.02*\i]
-                    ($(current page text area.south east)
-                        +(-\i*0.5em-.025em,-2pt)$)
-                    rectangle ($(current page text area.south east)
-                        +(-\i*0.5em+.025em,10pt-\i*1.1pt)$);
-            }
-        \end{tikzpicture}%
-    }
-    \fi
-    \fancypagestyle{part}{
-        \fancyhf{}
-        \renewcommand{\headrulewidth}{0pt}
-        \fancyhead[C]{\drawHelpLine}
-    }
-    \addtolength{\headheight}{20pt}
-    \addtolength{\topmargin}{-20pt}
-    \if at twoside
-        \renewcommand{\chaptermark}[1]{\markboth{\textsc{#1}}{}}
-    \else
-        \renewcommand{\chaptermark}[1]{\markboth{\textsc{#1}}{\textsc{#1}}}
-    \fi
-    \renewcommand*{\sectionmark}[1]{%
-        \markright{\sec at decochar~\arabic{section}~\sec at decochar~~~#1}}
-}{
-    \if at twoside
-        \renewcommand*{\sectionmark}[1]{\markboth{\textsc{#1}}{}}
-    \else
-        \renewcommand*{\sectionmark}[1]{\markboth{\textsc{#1}}{\textsc{#1}}}
-    \fi
-}
 %%================================
-%% Languages and line spacing
+%%  Loading the style
 %%================================
-\RequirePackage{PJLlang}
-\PJLsetlinespacing{\setstretch{1.07}}
-\PJLsetCJKlinespacing{\onehalfspacing}
-\raggedbottom
+\exp_args:No \RequirePackage { minimalist- \l__minimalist_style_str }
 
-%%================================
-%% Line numbers
-%%================================
-\PassOptionsToPackage{pagewise,mathlines}{lineno}
-\RequirePackage{linenoamsmath}
-\renewcommand\linenumberfont{\ttfamily\color{maintext!7!paper}\footnotesize}
-\setlength\linenumbersep{1em}
-
-\newif\ifLNturnsON
-\def\LocallyStopLineNumbers{\LNturnsONfalse%
-    \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers}
-\def\ResumeLineNumbers{\ifLNturnsON\linenumbers\fi}
-
-\pretocmd{\tableofcontents}{\LocallyStopLineNumbers}{}{\FAIL}
-\apptocmd{\tableofcontents}{\ResumeLineNumbers}{}{\FAIL}
-\pretocmd{\thebibliography}{\LocallyStopLineNumbers}{}{\FAIL}
-\apptocmd{\endthebibliography}{\ResumeLineNumbers}{}{\FAIL}
-
-%%================================
-%% Title format
-%%================================
-\RequirePackage[explicit,newparttoc]{titlesec}
-\PassOptionsToPackage{normalem}{ulem}
-\RequirePackage{ulem}
-
-\newcommand{\partstring}{\MakeUppercase{{\partname~\protect\thepart}}}
-\gappto{\PJLlang at langconfig@common}{%
-\renewcommand{\partstring}{\MakeUppercase{{\partname~\protect\thepart}}}%
-}
-\gappto{\PJLlang at langconfig@CN}{%
-\renewcommand{\partstring}{第~\thepart~部分}%
-}
-\gappto{\PJLlang at langconfig@TC}{%
-\renewcommand{\partstring}{第~\thepart~部分}%
-}
-\gappto{\PJLlang at langconfig@JP}{%
-\renewcommand{\partstring}{第~\thepart~部}%
-}
-
-\ifbool{IsBook}{
-    %% Part
-    \titleclass{\part}{top} % make part like a chapter
-    \titleformat{\part}[display]
-        {\thispagestyle{part}%
-        \LocallyStopLineNumbers%
-        \partfont\filleft}
-        {\partstring}
-        {1em}
-        {\fontsize{20}{0}\selectfont\MakeUppercase{#1}}
-        [\ResumeLineNumbers]
-    \titleformat{name=\part,numberless}[display]
-        {\thispagestyle{part}%
-        \LocallyStopLineNumbers%
-        % \phantomsection\addcontentsline{toc}{part}{#1}%
-        \partfont\filleft}
-        {\phantom{\MakeUppercase{\partname}}}
-        {1em}
-        {\fontsize{20}{0}\selectfont\MakeUppercase{#1}}
-        [\ResumeLineNumbers]
-    \titlespacing*{\part}{0pt}{5em}{6em}
-    %% Text after part
-    \newcommand{\parttext}[1]{%
-    \vfill%
-    \LocallyStopLineNumbers%
-    \begin{flushright}%
-        \begin{minipage}{0.833\textwidth}%
-            \color{maintext!80!paper}\raggedleft#1%
-        \end{minipage}%
-    \end{flushright}%
-    \ResumeLineNumbers%
-    \vfill\vfill%
-    \cleardoublepage%
-    }
-
-    %% Chapter
-    \titleformat{\chapter}
-        {\thispagestyle{fancy}%
-        \LocallyStopLineNumbers%
-        \color{maintext!80!paper}\chapfont\fontsize{16}{0}\selectfont}{}{0em}
-        {\rlap{\hspace*{-.5em}{\color{maintext!12!paper}%
-            \fontsize{80}{0}\selectfont\raisebox{-7pt}{\thechapter}}}#1}
-        [\ResumeLineNumbers]
-    \titleformat{name=\chapter,numberless}
-        {\thispagestyle{fancy}%
-        \LocallyStopLineNumbers%
-        % \phantomsection\addcontentsline{toc}{chapter}{#1}%
-        \color{maintext!80!paper}\chapfont\fontsize{16}{0}\selectfont}{}{0em}
-        {\rlap{\hspace*{-.5em}{\color{maintext!12!paper}%
-            \fontsize{80}{0}\selectfont\normalfont\raisebox{-7pt}{*}}}#1}
-        [\ResumeLineNumbers]
-}{
-    %% Part
-    \titleformat{\part}[display]
-        {\LocallyStopLineNumbers%
-        \partfont\filleft}
-        {\partstring}
-        {.3em}
-        {\fontsize{16}{0}\selectfont\MakeUppercase{#1}}
-        [\ResumeLineNumbers]
-    \titleformat{name=\part,numberless}[display]
-        {\LocallyStopLineNumbers%
-        % \phantomsection\addcontentsline{toc}{part}{#1}%
-        \partfont\filleft}
-        {\phantom{\MakeUppercase{\partname}}}
-        {.3em}
-        {\fontsize{16}{0}\selectfont\MakeUppercase{#1}}
-        [\ResumeLineNumbers]
-    %% Text after part
-    \newcommand{\parttext}[1]{%
-        \LocallyStopLineNumbers%
-        \begin{flushright}%
-            \begin{minipage}{0.833\textwidth}%
-                \color{maintext!80!paper}\raggedleft#1%
-            \end{minipage}%
-        \end{flushright}%
-        \ResumeLineNumbers%
-    }
-}
-
-%% Section
-\if at minimalist@classical
-\renewcommand\thesection{\arabic{section}}
-\newcommand\seculine{\bgroup\markoverwith{\color{maintext!27!paper}%
-    \rule[-0.9ex]{2pt}{.6pt}\hspace{-2pt}\rule[-1.2ex]{2pt}{.6pt}}\ULon}
-\newcommand\sec at decochar{\raisebox{.03em}{\normalfont/}}
-\titleformat{\section}
-    {\LocallyStopLineNumbers%
-    \secfont\centering}{}{0em}
-    {{\small\textcolor{maintext!27!paper}{\footnotesize\sec at decochar}%
-        \,\,\textcolor{maintext!90!paper}{\conditionalbfseries\arabic{section}}%
-        \,\,\textcolor{maintext!27!paper}{\footnotesize\sec at decochar}}\\
-        \seculine{#1}}
-    [\ResumeLineNumbers]
-\titleformat{name=\section,numberless}
-    {\LocallyStopLineNumbers%
-    % \phantomsection\addcontentsline{toc}{section}{#1}%
-    \secfont\centering}{}{0em}
-    {\seculine{#1}}
-    [\ResumeLineNumbers]
-\else
-\newcommand\sec at decochar{}
-\titleformat{\section}
-    {\LocallyStopLineNumbers%
-    \secfont\centering}
-    {\thesection}{.75em}
-    {#1}
-    [\ResumeLineNumbers]
-\fi
-
-%% Subsection
-\if at minimalist@classical
-\renewcommand\thesubsection{%
-    \ifnum\c at section=0\else\arabic{section}.\fi\arabic{subsection}}
-\newcommand\subseculine{\bgroup\markoverwith{\color{maintext!27!paper}%
-    \rule[-1ex]{2pt}{.75pt}}\ULon}
-\titleformat{\subsection}
-    {\LocallyStopLineNumbers%
-    \subsecfont}{}{0em}
-    {\subseculine{\thesubsection~\textcolor{maintext!27!paper}{$|$}~#1}}
-    [\ResumeLineNumbers]
-\titleformat{name=\subsection,numberless}
-    {\LocallyStopLineNumbers%
-    \subsecfont}{}{0em}
-    {\subseculine{#1}}
-    [\ResumeLineNumbers]
-\else
-\titleformat{\subsection}
-    {\LocallyStopLineNumbers%
-    \subsecfont}
-    {\thesubsection}{.75em}
-    {#1}
-    [\ResumeLineNumbers]
-\fi
-
-%% Subsubsection
-\if at minimalist@runin
-\titleformat{\subsubsection}[runin]
-    {\color{maintext!70!paper}\subsubsecfont}{\thesubsubsection}{.5em}
-    {#1.}[\hspace*{.3em}]
-\else
-\titleformat{\subsubsection}
-    {\LocallyStopLineNumbers%
-    \color{maintext!70!paper}\subsubsecfont}{\thesubsubsection}{.5em}
-    {#1}
-    [\ResumeLineNumbers]
-\fi
-
-%% Paragraph
-\titleformat{\paragraph}[runin]
-    {\scshape}{\theparagraph}{1em}{#1}
-
-\titlespacing{\section}{0pt}{\baselineskip}{.6\baselineskip}
-\titlespacing{\subsection}{0pt}{.75\baselineskip}{.4\baselineskip}
-\titlespacing{\subsubsection}{0pt}{.5\baselineskip}{.2\baselineskip}
-
-%%================================
-%% ToC format
-%%================================
-\RequirePackage{titletoc}
-\titlecontents{part}
-    [0em]
-    {\addvspace{1.5pc}\filcenter\normalfont}
-    {\thecontentslabel\nopagebreak\\\nopagebreak\uppercase}
-    {}
-    {} % without page number
-    [\addvspace{.5pc}]
-\ifbool{IsBook}{
-    \titlecontents{chapter}
-        [2em] % i.e., 0em (part) + 2em
-        {\addvspace{.5pc}\normalfont}
-        {\contentslabel{2em}}
-        {\hspace*{-2em}}
-        {\titlerule*[1em]{\textcolor{maintext!15!paper}{.}}\contentspage}
-    \titlecontents{section}
-        [4em] % i.e., 2em (chapter) + 2em
-        {\normalfont}
-        {\contentslabel[\textcolor{maintext!27!paper}{\small\sec at decochar}\,\textcolor{maintext!90!paper}{\thecontentslabel}\,\textcolor{maintext!27!paper}{\small\sec at decochar}]{2em}}
-        {\hspace*{-2em}}
-        {\titlerule*[1em]{\textcolor{maintext!15!paper}{.}}\contentspage}
-    \titlecontents{subsection}
-        [6.5em] % i.e., 4em (section) + 2.5em
-        {\normalfont}
-        {\contentslabel{2.25em}}
-        {\hspace*{-2.25em}}
-        {\titlerule*[1em]{\textcolor{maintext!15!paper}{.}}\contentspage}
-    \titlecontents{subsubsection}
-        [8.5em] % i.e., 6.5em (subsection) + 3em
-        {\normalfont}
-        {\contentslabel{2.75em}}
-        {\hspace*{-2.75em}}
-        {\titlerule*[1em]{\textcolor{maintext!15!paper}{.}}\contentspage}
-}{
-    \titlecontents{section}
-        [2em] % i.e., 0em (part) + 2em
-        {\normalfont}
-        {\contentslabel{1.75em}}
-        {\hspace*{-1.75em}}
-        {\titlerule*[1em]{\textcolor{maintext!15!paper}{.}}\contentspage}
-    \titlecontents{subsection}
-        [4.5em] % i.e., 2em (section) + 2.5em
-        {\normalfont}
-        {\contentslabel{2.25em}}
-        {\hspace*{-2.25em}}
-        {\titlerule*[1em]{\textcolor{maintext!15!paper}{.}}\contentspage}
-    \titlecontents{subsubsection}
-        [7.5em] % i.e., 4.5em (subsection) + 3em
-        {\normalfont}
-        {\contentslabel{2.75em}}
-        {\hspace*{-2.75em}}
-        {\titlerule*[1em]{\textcolor{maintext!15!paper}{.}}\contentspage}
-}
-
-%%================================
-%% Lists
-%%================================
-\RequirePackage{enumitem}
-\setlist{noitemsep}
-\setlist[enumerate]{labelsep=*, leftmargin=*}
-\setlist[enumerate,1]{label=\arabic*$)$,
-    ref = \arabic*$)$}
-\setlist[enumerate,2]{label=\emph{\roman*}$)$,
-    ref = \arabic{enumi}.\emph{\roman*}$)$}
-\setlist[enumerate,3]{label=\emph{\alph*}$)$,
-    ref = \arabic{enumi}.\emph{\roman{enumii}}.\emph{\alph*}$)$}
-\setlist[description]{font=\normalfont\conditionalbfseries}
-\if at minimalist@classical
-\newcommand\desculine{\colorlet{currentcolor}{.}\bgroup\markoverwith{\color{currentcolor!50!paper}%
-    \rule[-.45ex]{2pt}{.75pt}}\ULon}
-\renewcommand{\descriptionlabel}[1]{%
-  \hspace{\labelsep}\normalfont\desculine{#1}%
-}
-\fi
-
-\setlist[itemize]{leftmargin=*}
-\gappto{\PJLlang at langconfig@common}{\setlist[itemize,1]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{$\bullet$}}}
-\gappto{\PJLlang at langconfig@FR}{\setlist[itemize,1]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!50!paper}{---}}}
-\setlist[itemize,2]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{--}}
-\setlist[itemize,3]{label=\colorlet{currentcolor}{.}\textcolor{currentcolor!27!paper}{\texttt{*}}}
-
-%%================================
-%% Blank page
-%%================================
-\newcommand{\blinkpagetext}{This page is intentionally left blank}
-\renewcommand{\cleardoublepage}{\relax
-    \clearpage
-    \if at twoside\ifodd\c at page\relax\else
-    \thispagestyle{empty}
-    \AddToHookNext{shipout/background}
-      {%
-       \put(0.5\paperwidth,-0.5\paperheight){%
-       \makebox[0pt]{\large\color{maintext!10!paper}\blinkpagetext}}}
-    \null\newpage\fi\fi}
-
-%%================================
-%% Draft mark
-%%================================
-\RequirePackage{PJLdraft}
-
-%%================================
-%% Theorems
-%%================================
-\RequirePackage{mathtools}
-\RequirePackage{amsthm}
-\if at minimalist@classical
-\def\simpleqedsymbol{%
-    \makebox[1em]{\rlap{\textcolor{maintext!12!paper}{\rule[-0.1em]{.95em}{.95em}}}{\kern.07em\raisebox{.07em}{\textcolor{paper}{\rule[-0.1em]{.81em}{.81em}}}\kern.07em}}}
-\newtheoremstyle{simple}%
-    {}{}%
-    {\normalfont}{}%
-    {\normalfont}{}%
-    {0pt}%
-    {\global\let\qedsymbol\simpleqedsymbol%
-        {\conditionalbfseries\thmname{#1}\thmnumber{ #2}}\hspace{.4em}%
-        \textcolor{maintext!27!paper}{$|$}\hspace{.4em}%
-        \color{maintext!50!paper}\thmnote{\ensuremath{(\text{#3})}~~}%
-        \pushQED{\qed}%
-    }
-\def\@endtheorem{\global\let\qedsymbol\simpleqedsymbol%
-    \popQED\endtrivlist\@endpefalse
-    \global\let\qedsymbol\qedsymbolOriginal}
-\else
-    \newtheoremstyle{simple}%
-        {}{}%
-        {\normalfont}{}%
-        {\normalfont}{}%
-        {0pt}%
-        {{\conditionalbfseries\minimalist at titlefontshape\thmname{#1}\thmnumber{ #2}}%
-            {\color{maintext!50!paper}\thmnote{\hspace{.4em}\ensuremath{(\text{#3})}}}~~{\normalfont---}~~}
-\fi
-
-\renewcommand{\qedsymbol}{%
-    \makebox[1em]{\color{maintext!27!paper}\rule[-0.1em]{.95em}{.95em}}}
-\let\qedsymbolOriginal\qedsymbol
-
-\if at minimalist@fast
-    \providecommand{\phantomsection}{}
-    \RequirePackage{url}
-    \newcommand{\href}[2]{#2}
-\else
-    \PassOptionsToPackage{hidelinks,linktoc=all}{hyperref}
-    \RequirePackage{bookmark}
-    \RequirePackage{hyperref}
-\fi
-
-\PassOptionsToPackage{nothms,simplename}{PJLthm}
-\RequirePackage{PJLthm}
-
-\pretocmd{\theoremnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\lemmanameEN}{\textsc}{}{\FAIL}
-\pretocmd{\propositionnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\corollarynameEN}{\textsc}{}{\FAIL}
-\pretocmd{\propertynameEN}{\textsc}{}{\FAIL}
-\pretocmd{\factnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\conjecturenameEN}{\textsc}{}{\FAIL}
-\pretocmd{\definitionnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\axiomnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\assumptionnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\conventionnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\hypothesisnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\notationnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\examplenameEN}{\textsc}{}{\FAIL}
-\pretocmd{\problemnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\questionnameEN}{\textsc}{}{\FAIL}
-\pretocmd{\exercisenameEN}{\textsc}{}{\FAIL}
-\pretocmd{\remarknameEN}{\itshape}{}{\FAIL}
-\pretocmd{\observationnameEN}{\itshape}{}{\FAIL}
-
-\pretocmd{\theoremnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\lemmanameFR}{\textsc}{}{\FAIL}
-\pretocmd{\propositionnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\corollarynameFR}{\textsc}{}{\FAIL}
-\pretocmd{\propertynameFR}{\textsc}{}{\FAIL}
-\pretocmd{\factnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\conjecturenameFR}{\textsc}{}{\FAIL}
-\pretocmd{\definitionnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\axiomnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\assumptionnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\conventionnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\hypothesisnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\notationnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\examplenameFR}{\textsc}{}{\FAIL}
-\pretocmd{\problemnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\questionnameFR}{\textsc}{}{\FAIL}
-\pretocmd{\exercisenameFR}{\textsc}{}{\FAIL}
-\pretocmd{\remarknameFR}{\itshape}{}{\FAIL}
-\pretocmd{\observationnameFR}{\itshape}{}{\FAIL}
-
-\pretocmd{\theoremnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\lemmanameDE}{\textsc}{}{\FAIL}
-\pretocmd{\propositionnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\corollarynameDE}{\textsc}{}{\FAIL}
-\pretocmd{\propertynameDE}{\textsc}{}{\FAIL}
-\pretocmd{\factnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\conjecturenameDE}{\textsc}{}{\FAIL}
-\pretocmd{\definitionnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\axiomnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\assumptionnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\conventionnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\hypothesisnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\notationnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\examplenameDE}{\textsc}{}{\FAIL}
-\pretocmd{\problemnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\questionnameDE}{\textsc}{}{\FAIL}
-\pretocmd{\exercisenameDE}{\textsc}{}{\FAIL}
-\pretocmd{\remarknameDE}{\itshape}{}{\FAIL}
-\pretocmd{\observationnameDE}{\itshape}{}{\FAIL}
-
-\pretocmd{\theoremnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\lemmanameIT}{\textsc}{}{\FAIL}
-\pretocmd{\propositionnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\corollarynameIT}{\textsc}{}{\FAIL}
-\pretocmd{\propertynameIT}{\textsc}{}{\FAIL}
-\pretocmd{\factnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\conjecturenameIT}{\textsc}{}{\FAIL}
-\pretocmd{\definitionnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\axiomnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\assumptionnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\conventionnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\hypothesisnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\notationnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\examplenameIT}{\textsc}{}{\FAIL}
-\pretocmd{\problemnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\questionnameIT}{\textsc}{}{\FAIL}
-\pretocmd{\exercisenameIT}{\textsc}{}{\FAIL}
-\pretocmd{\remarknameIT}{\itshape}{}{\FAIL}
-\pretocmd{\observationnameIT}{\itshape}{}{\FAIL}
-
-\pretocmd{\theoremnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\lemmanamePT}{\textsc}{}{\FAIL}
-\pretocmd{\propositionnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\corollarynamePT}{\textsc}{}{\FAIL}
-\pretocmd{\propertynamePT}{\textsc}{}{\FAIL}
-\pretocmd{\factnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\conjecturenamePT}{\textsc}{}{\FAIL}
-\pretocmd{\definitionnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\axiomnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\assumptionnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\conventionnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\hypothesisnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\notationnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\examplenamePT}{\textsc}{}{\FAIL}
-\pretocmd{\problemnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\questionnamePT}{\textsc}{}{\FAIL}
-\pretocmd{\exercisenamePT}{\textsc}{}{\FAIL}
-\pretocmd{\remarknamePT}{\itshape}{}{\FAIL}
-\pretocmd{\observationnamePT}{\itshape}{}{\FAIL}
-
-\pretocmd{\theoremnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\lemmanameBR}{\textsc}{}{\FAIL}
-\pretocmd{\propositionnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\corollarynameBR}{\textsc}{}{\FAIL}
-\pretocmd{\propertynameBR}{\textsc}{}{\FAIL}
-\pretocmd{\factnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\conjecturenameBR}{\textsc}{}{\FAIL}
-\pretocmd{\definitionnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\axiomnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\assumptionnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\conventionnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\hypothesisnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\notationnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\examplenameBR}{\textsc}{}{\FAIL}
-\pretocmd{\problemnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\questionnameBR}{\textsc}{}{\FAIL}
-\pretocmd{\exercisenameBR}{\textsc}{}{\FAIL}
-\pretocmd{\remarknameBR}{\itshape}{}{\FAIL}
-\pretocmd{\observationnameBR}{\itshape}{}{\FAIL}
-
-\pretocmd{\theoremnameES}{\textsc}{}{\FAIL}
-\pretocmd{\lemmanameES}{\textsc}{}{\FAIL}
-\pretocmd{\propositionnameES}{\textsc}{}{\FAIL}
-\pretocmd{\corollarynameES}{\textsc}{}{\FAIL}
-\pretocmd{\propertynameES}{\textsc}{}{\FAIL}
-\pretocmd{\factnameES}{\textsc}{}{\FAIL}
-\pretocmd{\conjecturenameES}{\textsc}{}{\FAIL}
-\pretocmd{\definitionnameES}{\textsc}{}{\FAIL}
-\pretocmd{\axiomnameES}{\textsc}{}{\FAIL}
-\pretocmd{\assumptionnameES}{\textsc}{}{\FAIL}
-\pretocmd{\conventionnameES}{\textsc}{}{\FAIL}
-\pretocmd{\hypothesisnameES}{\textsc}{}{\FAIL}
-\pretocmd{\notationnameES}{\textsc}{}{\FAIL}
-\pretocmd{\examplenameES}{\textsc}{}{\FAIL}
-\pretocmd{\problemnameES}{\textsc}{}{\FAIL}
-\pretocmd{\questionnameES}{\textsc}{}{\FAIL}
-\pretocmd{\exercisenameES}{\textsc}{}{\FAIL}
-\pretocmd{\remarknameES}{\itshape}{}{\FAIL}
-\pretocmd{\observationnameES}{\itshape}{}{\FAIL}
-
-
-\theoremstyle{simple}
-
-\def\minimalist at definethms{
-\if at minimalist@nothms\else
-\if at minimalist@nothmnum
-\CreateTheorem*{theorem}
-\CreateTheorem*{lemma}
-\CreateTheorem*{proposition}
-\CreateTheorem*{corollary}
-\CreateTheorem*{definition-proposition}
-\CreateTheorem*{definition-theorem}
-\CreateTheorem*{property}
-\CreateTheorem*{fact}
-\CreateTheorem*{conjecture}
-\else
-\CreateTheorem at thmnum{theorem}
-\CreateTheorem{lemma}[theorem]
-\CreateTheorem{proposition}[theorem]
-\CreateTheorem{corollary}[theorem]
-\CreateTheorem{definition-proposition}[theorem]
-\CreateTheorem{definition-theorem}[theorem]
-\CreateTheorem{property}[theorem]
-\CreateTheorem{fact}[theorem]
-\CreateTheorem{conjecture}[theorem]
-\fi
-\CreateTheorem*{theorem*}
-\CreateTheorem*{lemma*}
-\CreateTheorem*{proposition*}
-\CreateTheorem*{corollary*}
-\CreateTheorem*{definition-proposition*}
-\CreateTheorem*{definition-theorem*}
-\CreateTheorem*{property*}
-\CreateTheorem*{fact*}
-\CreateTheorem*{conjecture*}
-\if at minimalist@nothmnum
-\CreateTheorem*{definition}
-\CreateTheorem*{axiom}
-\CreateTheorem*{assumption}
-\CreateTheorem*{convention}
-\CreateTheorem*{hypothesis}
-\CreateTheorem*{notation}
-\CreateTheorem*{example}
-\CreateTheorem*{problem}
-\CreateTheorem*{question}
-\CreateTheorem*{exercise}
-\else
-\CreateTheorem{definition}[theorem]
-\CreateTheorem{axiom}[theorem]
-\CreateTheorem{assumption}[theorem]
-\CreateTheorem{convention}[theorem]
-\CreateTheorem{hypothesis}[theorem]
-\CreateTheorem{notation}[theorem]
-\CreateTheorem{example}[theorem]
-\CreateTheorem{problem}[theorem]
-\CreateTheorem{question}[theorem]
-\CreateTheorem{exercise}[theorem]
-\fi
-\CreateTheorem*{definition*}
-\CreateTheorem*{axiom*}
-\CreateTheorem*{assumption*}
-\CreateTheorem*{convention*}
-\CreateTheorem*{hypothesis*}
-\CreateTheorem*{notation*}
-\CreateTheorem*{example*}
-\CreateTheorem*{problem*}
-\CreateTheorem*{question*}
-\CreateTheorem*{exercise*}
-\if at minimalist@nothmnum
-\CreateTheorem*{remark}
-\CreateTheorem*{observation}
-\else
-\CreateTheorem at thmnum{remark}
-\CreateTheorem at thmnum{observation}
-\fi
-\CreateTheorem*{remark*}
-\CreateTheorem*{observation*}
-\fi
-}
-
-\if at minimalist@delaythms
-    \AtEndPreamble{\minimalist at definethms}
-\else
-    \minimalist at definethms
-\fi
-
-\ifbool{IsBook}{}{%
-
-%%================================
-%% Title block style
-%%================================
-\if at minimalist@classical
-\renewcommand{\@maketitle}{%
-    \LocallyStopLineNumbers%
-    \noindent%
-    {\textcolor{maintext!27!paper}{\rule{\textwidth}{0.75pt}}}%
-    % \vspace{-\parskip}%
-    \vspace{-.5\baselineskip}%
-    \begin{flushright}%
-        \let\footnote\thanks%
-        {\conditionalbfseries\@title}\\\medskip%
-        \color{maintext!80!paper}%
-        {\small\scshape\@author}%
-        \par\vspace{-\parskip}\vspace{2pt}%
-        {\small\@date}%
-    \end{flushright}%
-    % \vspace{-\parskip}%
-    \vspace{-.5\baselineskip}%
-    \ifx\@date\@empty%
-        \vspace{\baselineskip}%
-        \vspace{1.2\parskip}%
-    \else%
-        \vspace{-.5\baselineskip}%
-    \fi%
-    {\textcolor{maintext!27!paper}{\rule{\textwidth}{0.75pt}}\par}%
-    \ResumeLineNumbers%
-}
-\else
-\renewcommand{\@maketitle}{%
-    \LocallyStopLineNumbers%
-    \begin{center}%
-        \let\footnote\thanks%
-        {\conditionalbfseries\minimalist at titlefontshape\large\@title}\\\bigskip%
-        \color{maintext!80!paper}%
-        {\small\scshape\@author}\\[2pt]%
-        {\small\@date}%
-    \end{center}%
-    \ifx\@date\@empty\bigskip\fi%
-    \bigskip\par%
-    \ResumeLineNumbers%
-}
-\fi
-\apptocmd{\maketitle}{\thispagestyle{fancy}}{}{\FAIL}
-
-%%================================
-%% Abstract style
-%%================================
-\if at minimalist@classical
-\renewenvironment{abstract}{%
-    \LocallyStopLineNumbers%
-    \begin{flushright}%
-        \textsc{\conditionalbfseries\small\abstractname}\par%
-        \vspace{-\parskip}%
-        \vspace{-.25\baselineskip}%
-        \begin{minipage}[t]{.833\textwidth}%
-            \vspace{0pt}%
-            \color{maintext!80!paper}%
-            \footnotesize%
-            \parindent=2em
-}{%
-        \end{minipage}%
-    \end{flushright}%
-    \bigskip%
-    \ResumeLineNumbers%
-}
-\else
-\renewenvironment{abstract}{%
-    \LocallyStopLineNumbers%
-    \vspace{-\baselineskip}%
-    \begin{center}%
-        \textsc{\conditionalbfseries\minimalist at titlefontshape\small\abstractname}\\%
-        \vspace{-.3\baselineskip}%
-        \begin{minipage}[t]{.833\textwidth}%
-            \vspace{0pt}%
-            \color{maintext!80!paper}%
-            \footnotesize%
-            \parindent=2em
-}{%
-        \end{minipage}%
-    \end{center}%
-    \medskip%
-    \ResumeLineNumbers%
-}
-\fi
-
-%%================================
-%% Keyword environment
-%%================================
-\def\keywordnameEN{\textsc{Keywords}}
-\def\keywordnameFR{\textsc{Mots clés}}
-\def\keywordnameDE{\textsc{Schlüsselwörter}}
-\def\keywordnameCN{关键词}
-\def\keywordnameTC{關鍵詞}
-\def\keywordnameJP{キーワード}
-\def\keywordnameRU{Ключевые слова}
-
-\if at minimalist@classical
-\newenvironment{keyword}{%
-    \LocallyStopLineNumbers%
-    \vspace{-.5\baselineskip}%
-    \begin{flushright}%
-        {\conditionalbfseries\small\csname keywordname\csname\languagename ABBR\endcsname\endcsname}\par%
-        \vspace{-\parskip}%
-        \vspace{-.30\baselineskip}%
-        \begin{minipage}[t]{.833\textwidth}%
-            \vspace{0pt}%
-            \color{maintext!80!paper}%
-            \footnotesize%
-            \parindent=2em
-            \raggedleft%
-}{%
-        \end{minipage}%
-    \end{flushright}%
-    \bigskip%
-    \ResumeLineNumbers%
-}
-\else
-\newenvironment{keyword}{%
-    \LocallyStopLineNumbers%
-    \vspace{-.75\baselineskip}%
-    \begin{center}%
-        {\conditionalbfseries\small\csname keywordname\csname\languagename ABBR\endcsname\endcsname}\\%
-        \vspace{-.3\baselineskip}%
-        \begin{minipage}[t]{.833\textwidth}%
-            \vspace{0pt}%
-            \color{maintext!80!paper}%
-            \footnotesize%
-            \parindent=2em
-            \begin{center}%
-}{%
-            \end{center}%
-        \end{minipage}%
-    \end{center}%
-    \medskip%
-    \ResumeLineNumbers%
-}
-\fi
-
-%%================================
-%% Simulate features of amsart
-%%================================
-\PassOptionsToPackage{amsfashion}{PJLauthor}
-\RequirePackage{PJLauthor}
-
-}
-
 \endinput
 %%
 %% End of file `minimalist/minimalist.sty'.

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimart.cls
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimart.cls	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimart.cls	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,7 +2,7 @@
 %% This is file `minimalist/minimart.cls',
 %% generated with the docstrip utility.
 
-%% Copyright (C) 2021 by Jinwen XU
+%% Copyright (C) 2021-2022 by Jinwen XU
 %% 
 %% This is part of the minimalist class series.
 %% 
@@ -16,224 +16,175 @@
 %% 2005/12/01 or later.
 %% 
 \NeedsTeXFormat{LaTeX2e}[2020-10-01]
-\ProvidesClass{minimart}
-    [2021/12/16 A simple and clear article style]
-\def\minimclass at baseclass{article}
-\RequirePackage{kvoptions}
-\RequirePackage{etoolbox}
-\SetupKeyvalOptions{
-    family = @minimclass,
-    prefix = @minimclass@,
-}
-\DeclareBoolOption[false]{draft}
-\DeclareBoolOption[false]{fast}
-\DeclareBoolOption[false]{classical}
-\DeclareBoolOption[false]{useindent}
-\DeclareBoolOption[false]{useosf}
-\DeclareBoolOption[false]{lmodern}
-\DeclareBoolOption[false]{palatino}
-\DeclareBoolOption[false]{times}
-\DeclareBoolOption[false]{garamond}
-\DeclareBoolOption[false]{noto}
-\DeclareBoolOption[false]{biolinum}
-\DeclareBoolOption[false]{customfont}
-\DeclareStringOption{thmnum}[PJL at thmnum@default]
+\RequirePackage{l3keys2e}
+\ProvidesExplClass
+  {minimart}
+  {2022/03/17} {}
+  {A simple and clear article style}
 
-\newif\if at minimclass@bfivepaper\@minimclass at bfivepaperfalse
-\DeclareVoidOption{b5paper}{\@minimclass at bfivepapertrue}
-\newif\if at minimclass@afourpaper\@minimclass at afourpaperfalse
-\DeclareVoidOption{a4paper}{\@minimclass at afourpapertrue}
+\tl_const:Nn \l__minimclass_base_class_tl { article }
 
-\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{\minimclass at baseclass}}
-\ProcessKeyvalOptions*\relax
-\LoadClass{\minimclass at baseclass}
 
-\if at minimclass@draft
-    \@minimclass at fasttrue
-\fi
-\if at minimclass@classical\else
-    \@minimclass at useindenttrue
-\fi
-\if at minimclass@lmodern
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@palatino
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@times
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@garamond
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@noto
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@biolinum
-    \@minimclass at customfonttrue
-\fi
+\bool_new:N \l__minimclass_load_custom_font_file_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_bool
 
-%%================================
-%% Page layout
-%%================================
-\RequirePackage{silence}
-\WarningFilter{geometry}{Over-specification in}
-\RequirePackage[heightrounded]{geometry}
-\geometry{
-    papersize={7in,10in},
-    % total={40em,60em},
-    total={5.535in,8.300in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\if at minimclass@bfivepaper
-\geometry{
-    b5paper,
-    % total={40em,59em},
-    total={5.535in,8.160in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
-\if at minimclass@afourpaper
-\geometry{
-    a4paper,
-    % total={47em,70em},
-    total={6.500in,9.685in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
 
-\if at minimclass@fast
-    \PassOptionsToPackage{fast}{minimalist}
-    \RequirePackage{draftwatermark}
-    \DraftwatermarkOptions{text={\normalfont DRAFT},color=paper!95!-paper}
-\fi
-\if at minimclass@useindent
-    \RequirePackage{indentfirst}
-\else
-    \AtEndPreamble{\RequirePackage{parskip}}
-\fi
-\RequirePackage{minimalist}
+\keys_define:nn { minimclass }
+  {
+    , draft                   .bool_set:N         = \l__minimclass_fast_bool
+    , draft                   .initial:n          = { false }
+    , fast                    .bool_set:N         = \l__minimclass_fast_bool
 
+    , classical               .bool_set:N         = \l__minimclass_classical_bool
+    , classical               .initial:n          = { false }
+
+    , use indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use indent              .initial:n          = { true }
+    , use~indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use-indent              .bool_set:N         = \l__minimclass_useindent_bool
+
+    , load custom font file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load custom font file   .default:n          = { minimalist.font }
+    , load~custom~font~file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load~custom~font~file   .default:n          = { minimalist.font }
+    , load-custom-font-file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load-custom-font-file   .default:n          = { minimalist.font }
+
+
+    , a4paper                 .bool_set:N         = \l__minimclass_a_four_paper_bool
+    , a4paper                 .initial:n          = { false }
+    , b5paper                 .bool_set:N         = \l__minimclass_b_five_paper_bool
+    , b5paper                 .initial:n          = { false }
+
+    , 11pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+    , 12pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+
+    , unknown                 .code:n             = {
+                                                      \PassOptionsToPackage { \CurrentOption } { minimalist }
+                                                    }
+  }
+\ProcessKeysOptions { minimclass }
+
+\LoadClass{\l__minimclass_base_class_tl}
+
+\bool_if:NT \l__minimclass_classical_bool
+  {
+    \bool_set_false:N \l__minimclass_useindent_bool
+  }
+
 %%================================
-%% Fonts
+%%  Page layout
 %%================================
-\RequirePackage{iftex}
-\ifPDFTeX
-\RequirePackage[T1]{fontenc}
-\RequirePackage{inputenc}
-\fi
-\if at minimclass@customfont\else
-\RequirePackage{mathpazo}
-\RequirePackage{newpxtext}
-\fi
-\RequirePackage{amssymb}
+\RequirePackage { silence }
+\WarningFilter { geometry } { Over-specification }
 
-\if at minimclass@lmodern
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \RequirePackage{cfr-lm}
-    \else
-        \RequirePackage{lmodern}
-    \fi
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+\PassOptionsToPackage { heightrounded } { geometry }
+\RequirePackage { geometry }
 
-\if at minimclass@palatino
-    \RequirePackage{amssymb}
-    \RequirePackage{mathpazo}
-    \PassOptionsToPackage{defaultsups}{newpxtext}
-    \RequirePackage{newpxtext}
-    % \RequirePackage{newpxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.07}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+\geometry
+  {
+    papersize = { 7in, 10in },
+    total = { 5.535in, 8.300in },
+    centering,
+    footnotesep = 2em plus 2pt minus 2pt,
+  }
 
-\if at minimclass@times
-    \RequirePackage{amssymb}
-    \PassOptionsToPackage{defaultsups}{newtxtext}
-    \RequirePackage{newtxtext}
-    \RequirePackage{newtxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.00}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+\bool_if:NT \l__minimclass_b_five_paper_bool
+  {
+    \geometry
+      {
+        b5paper,
+        total = { 5.535in, 8.160in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\if at minimclass@garamond
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf\else
-        \PassOptionsToPackage{lining}{ebgaramond}
-    \fi
-    \RequirePackage{ebgaramond-maths}
-    \RequirePackage{ebgaramond}
-    % \RequirePackage{garamondlibre}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+\bool_if:NT \l__minimclass_a_four_paper_bool
+  {
+    \geometry
+      {
+        a4paper,
+        total = { 6.500in, 9.685in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\if at minimclass@noto
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \PassOptionsToPackage{oldstyle}{notomath}
-    \fi
-    \RequirePackage{anyfontsize}
-    \RequirePackage{notomath}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+\bool_if:NT \l__minimclass_fast_bool
+  {
+    \PassOptionsToPackage { fast } { minimalist }
+    \RequirePackage { draftwatermark }
+    \DraftwatermarkOptions { text = { \normalfont DRAFT }, color = paper!97!-paper }
+  }
 
-\if at minimclass@biolinum
-    \RequirePackage{amssymb}
-    % \RequirePackage{mathpazo}
-    % \RequirePackage[sansmath]{libertinust1math}
-    \ifPDFTeX
-        \if at minimclass@useosf
-            \PassOptionsToPackage{osf}{biolinum}
-        \fi
-        \RequirePackage{biolinum}
-        \renewcommand*\familydefault{\biolinum at family}
-    \else
-        \PassOptionsToPackage{no-math}{fontspec}
-        \RequirePackage{fontspec}
-        \setmainfont{LinBiolinum_R.otf}[
-            BoldFont       = LinBiolinum_RB.otf ,
-            ItalicFont     = LinBiolinum_RI.otf ,
-            BoldItalicFont = LinBiolinum_RBO.otf,
-            \if at minimclass@useosf Numbers = OldStyle\fi ]
-    \fi
-    \PJLsetlinespacing{\setstretch{1.05}}
-    \RequirePackage[italic,defaultmathsizes]{mathastext}
-\fi
+\bool_if:NTF \l__minimclass_useindent_bool
+  {
+    \RequirePackage { indentfirst }
+  }
+  {
+    \hook_gput_code:nnn { begindocument/before } { minimclass }
+      {
+        \RequirePackage { parskip }
+      }
+  }
 
-\def\PJL at font@alreadyset{}
+\RequirePackage { minimalist }
 
-\PassOptionsToPackage{verbose=silent}{microtype}
-\RequirePackage{microtype}
-\PassOptionsToPackage{all}{nowidow}
-\RequirePackage{nowidow}
-\RequirePackage{embrac}
-
 %%================================
-%% Graphics
+%%  Fonts
 %%================================
-\RequirePackage{graphicx}
-\graphicspath{{images/}}
-\RequirePackage{wrapfig}
-\RequirePackage{float}
-\RequirePackage{caption}
-\captionsetup{font=small}
+\WarningFilter { latexfont } { Font~shape }
+\WarningFilter { latexfont } { Some~font  }
 
+\cs_new_protected:Nn \__minimclass_load_file_or_config:Nnn
+  {
+    \bool_if:NT #1
+      {
+        \exp_args:Nx \file_if_exist:nT { #2 }
+          {
+            \exp_args:Nx \file_input:n { #2 }
+            \use_none:nn
+          }
+      }
+    \use:n { #3 }
+  }
+
+
+\__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_bool { \l__minimclass_custom_font_file_str }
+  {
+    \RequirePackage { projlib-font }
+
+    \bool_if:NF \g_projlib_font_already_set_bool
+      {
+        \RequirePackage { mathpazo }
+        \RequirePackage { newpxtext }
+        \RequirePackage { amssymb }
+      }
+  }
+
+\PassOptionsToPackage { all } { nowidow }
+\RequirePackage { nowidow }
+\RequirePackage { embrac }
+
 %%================================
-%% Index
+%%  Graphics
 %%================================
-\AtEndPreamble{
-\pretocmd{\printindex}{\LocallyStopLineNumbers}{}{}
-\apptocmd{\printindex}{\ResumeLineNumbers}{}{}
-}
+\RequirePackage { graphicx }
+\graphicspath { { images/ } }
+\RequirePackage { wrapfig }
+\RequirePackage { float }
+\RequirePackage { caption }
+\captionsetup { font = small }
 
 \endinput
 %%

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimbook.cls
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimbook.cls	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/minimalist/minimbook.cls	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,7 +2,7 @@
 %% This is file `minimalist/minimbook.cls',
 %% generated with the docstrip utility.
 
-%% Copyright (C) 2021 by Jinwen XU
+%% Copyright (C) 2021-2022 by Jinwen XU
 %% 
 %% This is part of the minimalist class series.
 %% 
@@ -16,224 +16,175 @@
 %% 2005/12/01 or later.
 %% 
 \NeedsTeXFormat{LaTeX2e}[2020-10-01]
-\ProvidesClass{minimbook}
-    [2021/12/16 A simple and clear book style]
-\def\minimclass at baseclass{book}
-\RequirePackage{kvoptions}
-\RequirePackage{etoolbox}
-\SetupKeyvalOptions{
-    family = @minimclass,
-    prefix = @minimclass@,
-}
-\DeclareBoolOption[false]{draft}
-\DeclareBoolOption[false]{fast}
-\DeclareBoolOption[false]{classical}
-\DeclareBoolOption[false]{useindent}
-\DeclareBoolOption[false]{useosf}
-\DeclareBoolOption[false]{lmodern}
-\DeclareBoolOption[false]{palatino}
-\DeclareBoolOption[false]{times}
-\DeclareBoolOption[false]{garamond}
-\DeclareBoolOption[false]{noto}
-\DeclareBoolOption[false]{biolinum}
-\DeclareBoolOption[false]{customfont}
-\DeclareStringOption{thmnum}[PJL at thmnum@default]
+\RequirePackage{l3keys2e}
+\ProvidesExplClass
+  {minimbook}
+  {2022/03/17} {}
+  {A simple and clear book style}
 
-\newif\if at minimclass@bfivepaper\@minimclass at bfivepaperfalse
-\DeclareVoidOption{b5paper}{\@minimclass at bfivepapertrue}
-\newif\if at minimclass@afourpaper\@minimclass at afourpaperfalse
-\DeclareVoidOption{a4paper}{\@minimclass at afourpapertrue}
+\tl_const:Nn \l__minimclass_base_class_tl { book }
 
-\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{\minimclass at baseclass}}
-\ProcessKeyvalOptions*\relax
-\LoadClass{\minimclass at baseclass}
 
-\if at minimclass@draft
-    \@minimclass at fasttrue
-\fi
-\if at minimclass@classical\else
-    \@minimclass at useindenttrue
-\fi
-\if at minimclass@lmodern
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@palatino
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@times
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@garamond
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@noto
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@biolinum
-    \@minimclass at customfonttrue
-\fi
+\bool_new:N \l__minimclass_load_custom_font_file_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_bool
 
-%%================================
-%% Page layout
-%%================================
-\RequirePackage{silence}
-\WarningFilter{geometry}{Over-specification in}
-\RequirePackage[heightrounded]{geometry}
-\geometry{
-    papersize={7in,10in},
-    % total={40em,60em},
-    total={5.535in,8.300in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\if at minimclass@bfivepaper
-\geometry{
-    b5paper,
-    % total={40em,59em},
-    total={5.535in,8.160in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
-\if at minimclass@afourpaper
-\geometry{
-    a4paper,
-    % total={47em,70em},
-    total={6.500in,9.685in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
 
-\if at minimclass@fast
-    \PassOptionsToPackage{fast}{minimalist}
-    \RequirePackage{draftwatermark}
-    \DraftwatermarkOptions{text={\normalfont DRAFT},color=paper!95!-paper}
-\fi
-\if at minimclass@useindent
-    \RequirePackage{indentfirst}
-\else
-    \AtEndPreamble{\RequirePackage{parskip}}
-\fi
-\RequirePackage{minimalist}
+\keys_define:nn { minimclass }
+  {
+    , draft                   .bool_set:N         = \l__minimclass_fast_bool
+    , draft                   .initial:n          = { false }
+    , fast                    .bool_set:N         = \l__minimclass_fast_bool
 
+    , classical               .bool_set:N         = \l__minimclass_classical_bool
+    , classical               .initial:n          = { false }
+
+    , use indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use indent              .initial:n          = { true }
+    , use~indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use-indent              .bool_set:N         = \l__minimclass_useindent_bool
+
+    , load custom font file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load custom font file   .default:n          = { minimalist.font }
+    , load~custom~font~file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load~custom~font~file   .default:n          = { minimalist.font }
+    , load-custom-font-file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load-custom-font-file   .default:n          = { minimalist.font }
+
+
+    , a4paper                 .bool_set:N         = \l__minimclass_a_four_paper_bool
+    , a4paper                 .initial:n          = { false }
+    , b5paper                 .bool_set:N         = \l__minimclass_b_five_paper_bool
+    , b5paper                 .initial:n          = { false }
+
+    , 11pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+    , 12pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+
+    , unknown                 .code:n             = {
+                                                      \PassOptionsToPackage { \CurrentOption } { minimalist }
+                                                    }
+  }
+\ProcessKeysOptions { minimclass }
+
+\LoadClass{\l__minimclass_base_class_tl}
+
+\bool_if:NT \l__minimclass_classical_bool
+  {
+    \bool_set_false:N \l__minimclass_useindent_bool
+  }
+
 %%================================
-%% Fonts
+%%  Page layout
 %%================================
-\RequirePackage{iftex}
-\ifPDFTeX
-\RequirePackage[T1]{fontenc}
-\RequirePackage{inputenc}
-\fi
-\if at minimclass@customfont\else
-\RequirePackage{mathpazo}
-\RequirePackage{newpxtext}
-\fi
-\RequirePackage{amssymb}
+\RequirePackage { silence }
+\WarningFilter { geometry } { Over-specification }
 
-\if at minimclass@lmodern
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \RequirePackage{cfr-lm}
-    \else
-        \RequirePackage{lmodern}
-    \fi
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+\PassOptionsToPackage { heightrounded } { geometry }
+\RequirePackage { geometry }
 
-\if at minimclass@palatino
-    \RequirePackage{amssymb}
-    \RequirePackage{mathpazo}
-    \PassOptionsToPackage{defaultsups}{newpxtext}
-    \RequirePackage{newpxtext}
-    % \RequirePackage{newpxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.07}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+\geometry
+  {
+    papersize = { 7in, 10in },
+    total = { 5.535in, 8.300in },
+    centering,
+    footnotesep = 2em plus 2pt minus 2pt,
+  }
 
-\if at minimclass@times
-    \RequirePackage{amssymb}
-    \PassOptionsToPackage{defaultsups}{newtxtext}
-    \RequirePackage{newtxtext}
-    \RequirePackage{newtxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.00}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+\bool_if:NT \l__minimclass_b_five_paper_bool
+  {
+    \geometry
+      {
+        b5paper,
+        total = { 5.535in, 8.160in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\if at minimclass@garamond
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf\else
-        \PassOptionsToPackage{lining}{ebgaramond}
-    \fi
-    \RequirePackage{ebgaramond-maths}
-    \RequirePackage{ebgaramond}
-    % \RequirePackage{garamondlibre}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+\bool_if:NT \l__minimclass_a_four_paper_bool
+  {
+    \geometry
+      {
+        a4paper,
+        total = { 6.500in, 9.685in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\if at minimclass@noto
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \PassOptionsToPackage{oldstyle}{notomath}
-    \fi
-    \RequirePackage{anyfontsize}
-    \RequirePackage{notomath}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+\bool_if:NT \l__minimclass_fast_bool
+  {
+    \PassOptionsToPackage { fast } { minimalist }
+    \RequirePackage { draftwatermark }
+    \DraftwatermarkOptions { text = { \normalfont DRAFT }, color = paper!97!-paper }
+  }
 
-\if at minimclass@biolinum
-    \RequirePackage{amssymb}
-    % \RequirePackage{mathpazo}
-    % \RequirePackage[sansmath]{libertinust1math}
-    \ifPDFTeX
-        \if at minimclass@useosf
-            \PassOptionsToPackage{osf}{biolinum}
-        \fi
-        \RequirePackage{biolinum}
-        \renewcommand*\familydefault{\biolinum at family}
-    \else
-        \PassOptionsToPackage{no-math}{fontspec}
-        \RequirePackage{fontspec}
-        \setmainfont{LinBiolinum_R.otf}[
-            BoldFont       = LinBiolinum_RB.otf ,
-            ItalicFont     = LinBiolinum_RI.otf ,
-            BoldItalicFont = LinBiolinum_RBO.otf,
-            \if at minimclass@useosf Numbers = OldStyle\fi ]
-    \fi
-    \PJLsetlinespacing{\setstretch{1.05}}
-    \RequirePackage[italic,defaultmathsizes]{mathastext}
-\fi
+\bool_if:NTF \l__minimclass_useindent_bool
+  {
+    \RequirePackage { indentfirst }
+  }
+  {
+    \hook_gput_code:nnn { begindocument/before } { minimclass }
+      {
+        \RequirePackage { parskip }
+      }
+  }
 
-\def\PJL at font@alreadyset{}
+\RequirePackage { minimalist }
 
-\PassOptionsToPackage{verbose=silent}{microtype}
-\RequirePackage{microtype}
-\PassOptionsToPackage{all}{nowidow}
-\RequirePackage{nowidow}
-\RequirePackage{embrac}
-
 %%================================
-%% Graphics
+%%  Fonts
 %%================================
-\RequirePackage{graphicx}
-\graphicspath{{images/}}
-\RequirePackage{wrapfig}
-\RequirePackage{float}
-\RequirePackage{caption}
-\captionsetup{font=small}
+\WarningFilter { latexfont } { Font~shape }
+\WarningFilter { latexfont } { Some~font  }
 
+\cs_new_protected:Nn \__minimclass_load_file_or_config:Nnn
+  {
+    \bool_if:NT #1
+      {
+        \exp_args:Nx \file_if_exist:nT { #2 }
+          {
+            \exp_args:Nx \file_input:n { #2 }
+            \use_none:nn
+          }
+      }
+    \use:n { #3 }
+  }
+
+
+\__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_bool { \l__minimclass_custom_font_file_str }
+  {
+    \RequirePackage { projlib-font }
+
+    \bool_if:NF \g_projlib_font_already_set_bool
+      {
+        \RequirePackage { mathpazo }
+        \RequirePackage { newpxtext }
+        \RequirePackage { amssymb }
+      }
+  }
+
+\PassOptionsToPackage { all } { nowidow }
+\RequirePackage { nowidow }
+\RequirePackage { embrac }
+
 %%================================
-%% Index
+%%  Graphics
 %%================================
-\AtEndPreamble{
-\pretocmd{\printindex}{\LocallyStopLineNumbers}{}{}
-\apptocmd{\printindex}{\ResumeLineNumbers}{}{}
-}
+\RequirePackage { graphicx }
+\graphicspath { { images/ } }
+\RequirePackage { wrapfig }
+\RequirePackage { float }
+\RequirePackage { caption }
+\captionsetup { font = small }
 
 \endinput
 %%

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/ProjLib.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/ProjLib.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/ProjLib.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {ProjLib}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Collective interface of the ProjLib toolkit}
 
 \keys_define:nn { ProjLib }

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-author.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-author.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-author.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-author}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Enhanced author information block}
 
 \keys_define:nn { projlib-author }
@@ -35,11 +35,13 @@
 \cs_if_exist:NT \subjclass { \endinput }
 
 \tl_new:N   \g__projlib_author_font_author_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_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 }
@@ -67,56 +69,49 @@
       }
   }
 
-\ProvideDocumentCommand \address { m }
+\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]
+        \phantom {A} \\[-.85\baselineskip]
         \bool_if:NF \g__projlib_author_affil_already_exist_bool
           {
             \skip_vertical:n { \g__projlib_author_length_innersep_dim }
           }
         \bool_set_true:N \g__projlib_author_affil_already_exist_bool
-        { \g__projlib_author_font_address_tl #1 }
+        { \use:c { g__projlib_author_font_ #1 _tl } #2 }
         \\ \phantom {}
       }
   }
 
+\ProvideDocumentCommand \institute { m }
+  {
+    \projlib_author_affil_generic:nn { institute } { #1 }
+  }
+
+\ProvideDocumentCommand \address { m }
+  {
+    \projlib_author_affil_generic:nn { address } { #1 }
+  }
+
 \ProvideDocumentCommand \curraddr { m }
   {
-    \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
-      {
-        \phantom {A} \\[-\baselineskip]
-        \bool_if:NF \g__projlib_author_affil_already_exist_bool
-          {
-            \skip_vertical:n { \g__projlib_author_length_innersep_dim }
-          }
-        \bool_set_true:N \g__projlib_author_affil_already_exist_bool
-        { \g__projlib_author_font_curraddr_tl #1 }
-        \\ \phantom {}
-      }
+    \projlib_author_affil_generic:nn { curraddr } { #1 }
   }
 
 \ProvideDocumentCommand \email { m }
   {
-    \hook_gput_code:nnn { cmd/@author/after } { projlib-author }
-      {
-        \phantom {A} \\[-\baselineskip]
-        \bool_if:NF \g__projlib_author_affil_already_exist_bool
-          {
-            \skip_vertical:n { \g__projlib_author_length_innersep_dim }
-          }
-        \bool_set_true:N \g__projlib_author_affil_already_exist_bool
-        { \g__projlib_author_font_email_tl #1 }
-        \\ \phantom {}
-      }
+    \projlib_author_affil_generic:nn { email } { #1 }
   }
 
 \RequirePackage { regexpatch }
 
-\xpatchcmd { \@maketitle } { \begin{tabular}[t]{c} } {} {
-  \xpatchcmd { \@maketitle } { \end{tabular} } {} {} {}
-} {}
+\xpatchcmd { \@maketitle } { \begin{tabular}[t]{c} } {}
+  {
+    \xpatchcmd { \@maketitle } { \end{tabular} } {} {} {}
+  } {}
 
 \tl_set:cn {@author} {}
 
@@ -141,17 +136,17 @@
     \RequirePackage{ projlib-language }
 
     \tl_new:N   \g_projlib_author_keywordsname_style_tl
-    \tl_gset:Nn \g_projlib_author_keywordsname_style_tl {}
+    \tl_gset:Nn \g_projlib_author_keywordsname_style_tl { \itshape }
 
     \projlib_langauge_define_multilingual_text:Nn \keywordsname
       {
-        EN = \textsc{Key~words~and~phrases}         ,
-        FR = \textsc{Mots~et~phrases~clés}          ,
-        DE = \textsc{Schlüsselwörter~und~Phrasen}   ,
-        IT = \textsc{Parole~e~frasi~chiave}         ,
-        PT = \textsc{Palavras~e~frases~chave}       ,
-        BR = \textsc{Palavras~e~frases~chave}       ,
-        ES = \textsc{Palabras~y~frases~clave}       ,
+        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 = キーワード                             ,
@@ -233,9 +228,11 @@
       {
         \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
@@ -284,10 +281,13 @@
           {
             \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

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-datetime.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-datetime.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-datetime.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-datetime}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Convert numeric date-time string to natural language}
 
 \tl_new:N   \g__projlib_datetime_input_format_tl

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-draft.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-draft.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-draft.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-draft}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Useful commands during draft stage}
 
 \keys_define:nn { projlib-draft }
@@ -59,7 +59,7 @@
       }
   }
 
-\projlib_langauge_define_multilingual_text:Nn \__dnf_text
+\projlib_langauge_define_multilingual_text:Nn \__projlib_draft_dnf_text
   {
     EN = To\ be\ finished     ,
     FR = Pas\ encore\ fini    ,
@@ -74,7 +74,7 @@
     RU = Не\ закончен         ,
   }
 
-\projlib_langauge_define_multilingual_text:Nn \__dnf_report_text
+\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.         }     ,
@@ -97,12 +97,12 @@
            \ с\ соответствующими\ номерами\ страниц\ в\ скобках.      }     ,
   }
 
-\tl_new:c    { __dnf_font }
-\tl_gset:cn  { __dnf_font }        { \normalfont \ttfamily \bfseries \small }
+\tl_new:c    { __projlib_draft_dnf_font }
+\tl_gset:cn  { __projlib_draft_dnf_font }        { \normalfont \ttfamily \bfseries \small }
 
-\definecolor { __dnf_color }       { RGB } {  21, 122,  20 }
+\definecolor { __projlib_draft_dnf_color }       { RGB } {  21, 122,  20 }
 
-\newcounter  { __dnf_counter }
+\newcounter  { __projlib_draft_dnf_counter }
 
 \tl_new:N \g__projlib_draft_dnf_report_tl
 
@@ -109,18 +109,18 @@
 \NewDocumentCommand \dnf { d<> }
   {
     \noindent
-    \projlib_draft_plain_box [ __dnf_color ]
+    \projlib_draft_plain_box [ __projlib_draft_dnf_color ]
       {
-        \stepcounter { __dnf_counter }
-        \__dnf_font
-        \__dnf_text
+        \stepcounter { __projlib_draft_dnf_counter }
+        \__projlib_draft_dnf_font
+        \__projlib_draft_dnf_text
         \c_space_tl
-        \# \the__dnf_counter
+        \# \the__projlib_draft_dnf_counter
         \IfNoValueF { #1 } { \, : ~ #1 }
         \tl_gput_right:Nx \g__projlib_draft_dnf_report_tl
           {
             \# \,
-            \int_value:w \the__dnf_counter
+            \int_value:w \the__projlib_draft_dnf_counter
             \c_space_tl \c_space_tl
             $\langle$
             \skip_horizontal:n { 0.1em }
@@ -144,14 +144,78 @@
   {
     \tl_if_blank:VF \g__projlib_draft_dnf_report_tl
       {
-        \clearpage \noindent
-        \color { __dnf_color }
-        \__dnf_font
-        \__dnf_report_text \\[0.75\baselineskip]
+        \clearpage
+        \pagestyle{empty}
+        \noindent
+        \color { __projlib_draft_dnf_color }
+        \__projlib_draft_dnf_font
+        \__projlib_draft_dnf_report_text \\[0.75\baselineskip]
         \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~``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~«~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~``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~``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~"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~"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~``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 = {
+              你好,这里有一些没有意义的文字。 此文本应显示打印文本在此位置的外观。 如果你阅读这段文字,你将不会得到任何信息。 真的没有信息吗? 这段文字和诸如 “劳仑衣普桑,认至将指点效则机,最你更枝” 或者 “想极整月正进好志次回总般,段然取向使张规军证回,世市总李率英茄持伴” 之类的废话有区别吗? 一点都没有! 这样的一段文本会给你提供关于所选字体的信息、字母的书写方式以及对外观的印象。 该文本应包含字母表中的所有字母,并且应使用原始语言编写。 不需要特别的内容,但字长要与语言相匹配。
+           }
+    , TC = {
+              你好,這裡有一些沒有意義的文字。此文本應顯示打印文本在此位置的外觀。如果你閱讀這段文字,你將不會得到任何信息。真的沒有信息嗎?這段文字和諸如 “勞崙衣普桑,認至將指點效則機,最你更枝” 或者 “想極整月正進好志次回總般,段然取向使張規軍證回,世市總李率英茄持伴” 之類的廢話有區別嗎?一點都沒有!這樣的一段文本會給你提供關於所選字體的信息、字母的書寫方式以及對外觀的印象。該文本應包含字母表中的所有字母,並且應使用原始語言編寫。不需要特別的內容,但字長要與語言相匹配。
+           }
+    , JP = {
+              こんにちは、ここに意味のないテキストがあります。 このテキストは、この場所で印刷されたテキストがどのように見えるかを示す必要があります。 このテキストを読んでも、情報は得られません。 本当に? 情報はありませんか? このテキストと「アでニンはすミ」のようなナンセンスとの間に違いはありますか? 全くない! このようなブラインドテキストは、選択したフォント、文字の書き方、外観の印象に関する情報を提供します。 このテキストにはアルファベットのすべての文字が含まれている必要があり、元の言語で書かれている必要があります。 特別なコンテンツは必要ありませんが、単語の長さは言語と一致している必要があります。
+           }
+    , RU = {
+              Здравствуйте,~вот~какой-то~текст~без~смысла.~Этот~текст~должен~показывать,~как~будет~выглядеть~печатный~текст~в~этом~месте.~Если~вы~прочитаете~этот~текст,~вы~не~получите~никакой~информации.~Действительно?~Нет~информации?~Есть~ли~разница~между~этим~текстом~и~какой-то~чепухой~вроде~``Бзостачщв~дрероих''?~Нисколько!~Слепой~текст,~подобный~этому,~дает~вам~информацию~о~выбранном~шрифте,~о~том,~как~написаны~буквы,~и~о~впечатлении~от~внешнего~вида.~Этот~текст~должен~содержать~все~буквы~алфавита~и~должен~быть~написан~на~языке~оригинала.~В~специальном~содержании~нет~необходимости,~но~длина~слов~должна~соответствовать~языку.
+           }
+  }
+
+\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 }
+          }
+      }
+  }
+
 \endinput
 %%
 %% End of file `projlib-draft.sty'.

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-font.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-font.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-font.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-font}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Font selection and configuration}
 
 \keys_define:nn { projlib-font }

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-language.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-language.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-language.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-language}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Multi-language configuration}
 
 \clist_const:Nn \c__projlib_language_supported_clist
@@ -405,7 +405,7 @@
 \tl_new:N  \g_projlib_language_parindent_latin_tl
 \tl_new:N  \g_projlib_language_parindent_cjk_tl
 
-\@ifclassloaded{beamer}
+\@ifclassloaded { beamer }
   {
     \tl_gset:Nn \g_projlib_language_parindent_latin_tl
       {
@@ -429,7 +429,7 @@
 
 \hook_gput_code:nnn { begindocument } { projlib-language }
   {
-    \@ifpackageloaded{parskip}
+    \@ifpackageloaded { parskip }
       {
         \tl_gset:Nn \g_projlib_language_parindent_latin_tl
           {

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-logo.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-logo.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-logo.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-logo}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {The ProjLib logo}
 
 \keys_define:nn { projlib-logo }

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-math.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-math.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-math.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-math}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Efficient math setup}
 
 \keys_define:nn { projlib-math }

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-paper.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-paper.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-paper.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-paper}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Configuration of the paper style}
 
 \keys_define:nn { projlib-paper }

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-theorem.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-theorem.sty	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/projlib/projlib-theorem.sty	2022-03-17 20:33:16 UTC (rev 62770)
@@ -19,7 +19,7 @@
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {projlib-theorem}
-  {2022/03/11} {}
+  {2022/03/17} {}
   {Configuration of theorem-like environments}
 
 \keys_define:nn { projlib-theorem }
@@ -31,7 +31,7 @@
     , 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
     , 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
@@ -53,7 +53,7 @@
     , 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 } }
+    , unknown               .code:n             = { \PassOptionsToPackage { \CurrentOption } { create-theorem } }
   }
 \ProcessKeysOptions { projlib-theorem }
 
@@ -112,7 +112,7 @@
   {
     \bool_if:NTF \l__projlib_theorem_no_theorem_numbering_bool
       {
-        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { numberless }
+        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { numberless, create starred version }
       }
       {
         \tl_if_blank:eTF \l__projlib_theorem_theorem_numbering_tl
@@ -119,23 +119,23 @@
           {
             \cs_if_exist:cTF { c at chapter }
               { % with \chapter
-                \CreateTheorem {theorem} { parent counter = chapter }
+                \CreateTheorem {theorem} { parent counter = chapter, create starred version }
               }
               { % without \chapter
-                \CreateTheorem {theorem} { parent counter = section }
+                \CreateTheorem {theorem} { parent counter = section, create starred version }
               }
           }
           {
             \tl_if_eq:NnTF \l__projlib_theorem_theorem_numbering_tl { * }
               {
-                \CreateTheorem {theorem} { }
+                \CreateTheorem {theorem} { create starred version }
               }
               {
-                \CreateTheorem {theorem} { parent counter = \l__projlib_theorem_theorem_numbering_tl }
+                \CreateTheorem {theorem} { parent counter = \l__projlib_theorem_theorem_numbering_tl, create starred version }
               }
           }
 
-        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { shared counter = theorem, quiet }
+        \exp_args:Nv \CreateTheorem { c_projlib_theorem_supported_clist } { shared counter = theorem, create starred version, quiet }
       }
   }
 

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/simplivre/simplivre.cls
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/simplivre/simplivre.cls	2022-03-17 20:32:09 UTC (rev 62769)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/simplivre/simplivre.cls	2022-03-17 20:33:16 UTC (rev 62770)
@@ -2,7 +2,7 @@
 %% This is file `simplivre/simplivre.cls',
 %% generated with the docstrip utility.
 
-%% Copyright (C) 2021 by Jinwen XU
+%% Copyright (C) 2021-2022 by Jinwen XU
 %% 
 %% This is part of the minimalist class series.
 %% 
@@ -16,564 +16,685 @@
 %% 2005/12/01 or later.
 %% 
 \NeedsTeXFormat{LaTeX2e}[2020-10-01]
-\ProvidesClass{simplivre}
-    [2021/12/16 A simple and clear book style]
-\def\minimclass at baseclass{book}
-\RequirePackage{kvoptions}
-\RequirePackage{etoolbox}
-\SetupKeyvalOptions{
-    family = @minimclass,
-    prefix = @minimclass@,
-}
-\DeclareBoolOption[false]{draft}
-\DeclareBoolOption[false]{fast}
-\DeclareBoolOption[false]{classical}
-\DeclareBoolOption[false]{useindent}
-\DeclareBoolOption[false]{useosf}
-\DeclareBoolOption[false]{lmodern}
-\DeclareBoolOption[false]{palatino}
-\DeclareBoolOption[false]{times}
-\DeclareBoolOption[false]{garamond}
-\DeclareBoolOption[false]{noto}
-\DeclareBoolOption[false]{biolinum}
-\DeclareBoolOption[false]{customfont}
-\DeclareStringOption{thmnum}[PJL at thmnum@default]
+\RequirePackage{l3keys2e}
+\ProvidesExplClass
+  {simplivre}
+  {2022/03/17} {}
+  {A simple and clear book style}
 
-\newif\if at minimclass@bfivepaper\@minimclass at bfivepaperfalse
-\DeclareVoidOption{b5paper}{\@minimclass at bfivepapertrue}
-\newif\if at minimclass@afourpaper\@minimclass at afourpaperfalse
-\DeclareVoidOption{a4paper}{\@minimclass at afourpapertrue}
+\tl_const:Nn \l__minimclass_base_class_tl { book }
 
-\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{\minimclass at baseclass}}
-\ProcessKeyvalOptions*\relax
-\LoadClass{\minimclass at baseclass}
 
-\if at minimclass@draft
-    \@minimclass at fasttrue
-\fi
-\if at minimclass@classical\else
-    \@minimclass at useindenttrue
-\fi
-\if at minimclass@lmodern
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@palatino
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@times
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@garamond
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@noto
-    \@minimclass at customfonttrue
-\fi
-\if at minimclass@biolinum
-    \@minimclass at customfonttrue
-\fi
+\bool_new:N \l__minimclass_load_custom_font_file_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_bool
 
-%%================================
-%% Page layout
-%%================================
-\RequirePackage{silence}
-\WarningFilter{geometry}{Over-specification in}
-\RequirePackage[heightrounded]{geometry}
-\geometry{
-    papersize={7in,10in},
-    % total={40em,60em},
-    total={5.535in,8.300in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\if at minimclass@bfivepaper
-\geometry{
-    b5paper,
-    % total={40em,59em},
-    total={5.535in,8.160in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
-\if at minimclass@afourpaper
-\geometry{
-    a4paper,
-    % total={47em,70em},
-    total={6.500in,9.685in},
-    hmarginratio=1:1,
-    vmarginratio=1:1,
-    footnotesep=2em plus 2pt minus 2pt,
-}
-\fi
+\bool_new:N \l__minimclass_load_custom_font_file_latin_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_latin_bool
 
-\if at minimclass@fast
-    \PassOptionsToPackage{fast}{minimalist}
-    \RequirePackage{draftwatermark}
-    \DraftwatermarkOptions{text={\normalfont DRAFT},color=paper!95!-paper}
-\fi
-\if at minimclass@useindent
-    \RequirePackage{indentfirst}
-\else
-    \AtEndPreamble{\RequirePackage{parskip}}
-\fi
-\RequirePackage{minimalist}
+\bool_new:N \l__minimclass_load_custom_font_file_cjk_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_cjk_bool
 
+\bool_new:N \l__minimclass_load_custom_font_file_math_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_math_bool
+
+\keys_define:nn { minimclass }
+  {
+    , draft                   .bool_set:N         = \l__minimclass_fast_bool
+    , draft                   .initial:n          = { false }
+    , fast                    .bool_set:N         = \l__minimclass_fast_bool
+
+    , classical               .bool_set:N         = \l__minimclass_classical_bool
+    , classical               .initial:n          = { false }
+
+    , use indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use indent              .initial:n          = { true }
+    , use~indent              .bool_set:N         = \l__minimclass_useindent_bool
+    , use-indent              .bool_set:N         = \l__minimclass_useindent_bool
+
+    , load custom font file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { minimalist.font.latin }
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str   { minimalist.font.cjk }
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str  { minimalist.font.math }
+                                                    }
+    , load custom font file   .default:n          = { minimalist.font }
+    , load~custom~font~file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load~custom~font~file   .default:n          = { minimalist.font }
+    , load-custom-font-file   .code:n             = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_str { #1 }
+                                                    }
+    , load-custom-font-file   .default:n          = { minimalist.font }
+
+    , load custom latin font file   .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { #1 }
+                                                    }
+    , load custom latin font file   .default:n    = { minimalist.font.latin }
+    , load~custom~latin~font~file   .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { #1 }
+                                                    }
+    , load~custom~latin~font~file   .default:n    = { minimalist.font.latin }
+    , load-custom-latin-font-file   .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_latin_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_latin_str { #1 }
+                                                    }
+    , load-custom-latin-font-file   .default:n    = { minimalist.font.latin }
+
+    , load custom cjk font file     .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str { #1 }
+                                                    }
+    , load custom cjk font file     .default:n    = { minimalist.font.cjk }
+    , load~custom~cjk~font~file     .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str { #1 }
+                                                    }
+    , load~custom~cjk~font~file     .default:n    = { minimalist.font.cjk }
+    , load-custom-cjk-font-file     .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_cjk_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_cjk_str { #1 }
+                                                    }
+    , load-custom-cjk-font-file     .default:n    = { minimalist.font.cjk }
+
+    , load custom math font file    .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str { #1 }
+                                                    }
+    , load custom math font file    .default:n    = { minimalist.font.math }
+    , load~custom~math~font~file    .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str { #1 }
+                                                    }
+    , load~custom~math~font~file    .default:n    = { minimalist.font.math }
+    , load-custom-math-font-file    .code:n       = {
+                                                      \bool_set_true:N \l__minimclass_load_custom_font_file_math_bool
+                                                      \str_set:Nn \l__minimclass_custom_font_file_math_str { #1 }
+                                                    }
+    , load-custom-math-font-file    .default:n    = { minimalist.font.math }
+
+    , a4paper                 .bool_set:N         = \l__minimclass_a_four_paper_bool
+    , a4paper                 .initial:n          = { false }
+    , b5paper                 .bool_set:N         = \l__minimclass_b_five_paper_bool
+    , b5paper                 .initial:n          = { false }
+
+    , 11pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+    , 12pt                    .code:n             = { \PassOptionsToClass { \CurrentOption } { \l__minimclass_base_class_tl } }
+
+    , unknown                 .code:n             = {
+                                                      \PassOptionsToPackage { \CurrentOption } { minimalist }
+                                                    }
+  }
+\ProcessKeysOptions { minimclass }
+
+\LoadClass{\l__minimclass_base_class_tl}
+
+\bool_if:NT \l__minimclass_classical_bool
+  {
+    \bool_set_false:N \l__minimclass_useindent_bool
+  }
+
 %%================================
-%% Fonts
+%%  Page layout
 %%================================
-\if at minimclass@customfont\else
-    \if at minimclass@fast
-        \RequirePackage{mathpazo}
-    \fi
-\fi
+\RequirePackage { silence }
+\WarningFilter { geometry } { Over-specification }
 
-\PassOptionsToPackage{no-math,quiet}{fontspec}
-\RequirePackage{fontspec}
+\PassOptionsToPackage { heightrounded } { geometry }
+\RequirePackage { geometry }
 
-\IfFileExists{minimalist-font.tex}{
-    \input{minimalist-font.tex}
-}{
-\IfFontExistsTF{Palatino Linotype}{%
-    \setmainfont{Palatino Linotype}
-        [\if at minimclass@useosf Numbers = OldStyle\fi]
-}{
-    \setmainfont{TeXGyrePagellaX-Regular.otf}[
-        BoldFont       = TeXGyrePagellaX-Bold.otf ,
-        ItalicFont     = TeXGyrePagellaX-Italic.otf ,
-        BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf,
-        \if at minimclass@useosf Numbers = OldStyle\fi ]
-}
-    \setsansfont{SourceSansPro-Regular.otf}[
-        Scale          = MatchLowercase ,
-        BoldFont       = SourceSansPro-Bold.otf ,
-        ItalicFont     = SourceSansPro-RegularIt.otf ,
-        BoldItalicFont = SourceSansPro-BoldIt.otf ]
-    \setmonofont{NewCMMono10-Regular.otf}[
-        Scale          = 1.05 ,
-        BoldFont       = NewCMMono10-Bold.otf ,
-        ItalicFont     = NewCMMono10-Italic.otf ,
-        BoldItalicFont = NewCMMono10-BoldOblique.otf ]
-}
+\geometry
+  {
+    papersize = { 7in, 10in },
+    total = { 5.535in, 8.300in },
+    centering,
+    footnotesep = 2em plus 2pt minus 2pt,
+  }
 
-\PassOptionsToPackage{fontset=none,scheme=plain}{ctex}
-\RequirePackage{ctex}
+\bool_if:NT \l__minimclass_b_five_paper_bool
+  {
+    \geometry
+      {
+        b5paper,
+        total = { 5.535in, 8.160in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\IfFileExists{minimalist-font.cjk.tex}{
-    \input{minimalist-font.cjk.tex}
-}{
-\IfFontExistsTF{SourceHanSerifSC-Regular}{%
-    \setCJKmainfont{SourceHanSerifSC-Regular}[
-        BoldFont       = SourceHanSerifSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerifSC-Bold ]
-}{
-    \setCJKmainfont{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
+\bool_if:NT \l__minimclass_a_four_paper_bool
+  {
+    \geometry
+      {
+        a4paper,
+        total = { 6.500in, 9.685in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
 
-\IfFontExistsTF{SourceHanSansSC-Regular}{%
-    \setCJKsansfont{SourceHanSansSC-Regular}[
-        BoldFont       = SourceHanSansSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSansSC-Bold ]
-}{
-    \setCJKsansfont{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
+\bool_if:NT \l__minimclass_fast_bool
+  {
+    \PassOptionsToPackage { fast } { minimalist }
+    \RequirePackage { draftwatermark }
+    \DraftwatermarkOptions { text = { \normalfont DRAFT }, color = paper!97!-paper }
+  }
 
-\IfFontExistsTF{SourceHanMonoSC-Regular}{%
-    \setCJKmonofont{SourceHanMonoSC-Regular}[
-        BoldFont       = SourceHanMonoSC-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMonoSC-Medium ]
-}{
-    \setCJKmonofont{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
+\bool_if:NTF \l__minimclass_useindent_bool
+  {
+    \RequirePackage { indentfirst }
+  }
+  {
+    \hook_gput_code:nnn { begindocument/before } { minimclass }
+      {
+        \RequirePackage { parskip }
+      }
+  }
 
-\if at PJLlang@enable at CN
-\IfFontExistsTF{SourceHanSerifSC-Regular}{%
-    \setCJKfamilyfont{SCmain}{SourceHanSerifSC-Regular}[
-        BoldFont       = SourceHanSerifSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerifSC-Bold ]
-}{
-    \setCJKfamilyfont{SCmain}{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\IfFontExistsTF{SourceHanSansSC-Regular}{%
-    \setCJKfamilyfont{SCsans}{SourceHanSansSC-Regular}[
-        BoldFont       = SourceHanSansSC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSansSC-Bold ]
-}{
-    \setCJKfamilyfont{SCsans}{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
-\IfFontExistsTF{SourceHanMonoSC-Regular}{%
-    \setCJKfamilyfont{SCmono}{SourceHanMonoSC-Regular}[
-        BoldFont       = SourceHanMonoSC-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMonoSC-Medium ]
-}{
-    \setCJKfamilyfont{SCmono}{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\fi
+\RequirePackage { minimalist }
 
-\if at PJLlang@enable at TC
-\IfFontExistsTF{SourceHanSerifTC-Regular}{%
-    \setCJKfamilyfont{TCmain}{SourceHanSerifTC-Regular}[
-        BoldFont       = SourceHanSerifTC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerifTC-Bold ]
-}{
-    \setCJKfamilyfont{TCmain}{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\IfFontExistsTF{SourceHanSansTC-Regular}{%
-    \setCJKfamilyfont{TCsans}{SourceHanSansTC-Regular}[
-        BoldFont       = SourceHanSansTC-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSansTC-Bold ]
-}{
-    \setCJKfamilyfont{TCsans}{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
-\IfFontExistsTF{SourceHanMonoTC-Regular}{%
-    \setCJKfamilyfont{TCmono}{SourceHanMonoTC-Regular}[
-        BoldFont       = SourceHanMonoTC-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMonoTC-Medium ]
-}{
-    \setCJKfamilyfont{TCmono}{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\fi
+%%================================
+%%  Fonts
+%%================================
+\WarningFilter { latexfont } { Font~shape }
+\WarningFilter { latexfont } { Some~font  }
 
-\if at PJLlang@enable at JP
-\IfFontExistsTF{SourceHanSerif-Regular}{%
-    \setCJKfamilyfont{JPmain}{SourceHanSerif-Regular}[
-        BoldFont       = SourceHanSerif-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSerif-Bold ]
-}{
-    \setCJKfamilyfont{JPmain}{FandolSong-Regular.otf}[
-        BoldFont       = FandolSong-Bold.otf ,
-        ItalicFont     = FandolKai-Regular.otf ,
-        BoldItalicFont = FandolKai-Regular.otf ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\IfFontExistsTF{SourceHanSans-Regular}{%
-    \setCJKfamilyfont{JPsans}{SourceHanSans-Regular}[
-        BoldFont       = SourceHanSans-Bold ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanSans-Bold ]
-}{
-    \setCJKfamilyfont{JPsans}{FandolHei-Regular.otf}[
-        BoldFont       = FandolHei-Bold.otf ,
-        ItalicFont     = * ,
-        BoldItalicFont = FandolHei-Bold.otf ]
-}
-\IfFontExistsTF{SourceHanMono-Regular}{%
-    \setCJKfamilyfont{JPmono}{SourceHanMono-Regular}[
-        BoldFont       = SourceHanMono-Medium ,
-        ItalicFont     = * ,
-        BoldItalicFont = SourceHanMono-Medium ]
-}{
-    \setCJKfamilyfont{JPmono}{FandolFang-Regular.otf}[
-        BoldFont       = * ,
-        BoldFeatures   = {FakeBold=4} ,
-        ItalicFont     = * ,
-        BoldItalicFont = * ,
-        BoldItalicFeatures = {FakeBold=4} ]
-}
-\fi
+\cs_new_protected:Nn \__minimclass_load_file_or_config:Nnn
+  {
+    \bool_if:NT #1
+      {
+        \exp_args:Nx \file_if_exist:nT { #2 }
+          {
+            \exp_args:Nx \file_input:n { #2 }
+            \use_none:nn
+          }
+      }
+    \use:n { #3 }
+  }
 
-\WarningFilter{latexfont}{Font shape}
-\WarningFilter{latexfont}{Some font}
+\cs_new_protected:Nn \__minimclass_if_font_exist:nnn
+  {
+    \bool_if:NTF \l__minimclass_fast_bool
+      { #3 }
+      { \fontspec_font_if_exist:nTF { #1 } { #2 } { #3 } }
+  }
 
-\def\CJKsffamily{}
-\def\CJKttfamily{}
+\__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_bool { \l__minimclass_custom_font_file_str }
+  {
+    \RequirePackage { projlib-font }
 
-\apptocmd{\sffamily}{\CJKsffamily}{}{\FAIL}
-\apptocmd{\ttfamily}{\CJKttfamily}{}{\FAIL}
+    \bool_if:NF \g_projlib_font_already_set_bool
+      {
+        \bool_if:NT \l__minimclass_fast_bool
+          {
+            \RequirePackage { mathpazo }
+          }
 
-\if at PJLlang@enable at CN
-\gappto{\PJLlang at langconfig@CN}{%
-    \def\CJKsffamily{\CJKfamily{SCsans}}%
-    \def\CJKttfamily{\CJKfamily{SCmono}}%
-    \CJKfamily{SCmain}%
-}
-\fi
+        \PassOptionsToPackage { no-math,quiet } { fontspec }
+        \RequirePackage { fontspec }
 
-\if at PJLlang@enable at TC
-\gappto{\PJLlang at langconfig@TC}{%
-    \def\CJKsffamily{\CJKfamily{TCsans}}%
-    \def\CJKttfamily{\CJKfamily{TCmono}}%
-    \CJKfamily{TCmain}%
-}
-\fi
+        \__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_latin_bool { \l__minimclass_custom_font_file_latin_str }
+          {
+            \__minimclass_if_font_exist:nnn { Palatino~Linotype }
+              {
+                \bool_if:NTF \l__projlib_font_useosf_bool
+                  {
+                    \setmainfont { Palatino~Linotype } [ Numbers = OldStyle ]
+                  }
+                  {
+                    \setmainfont { Palatino~Linotype }
+                  }
+              }
+              {
+                \bool_if:NTF \l__projlib_font_useosf_bool
+                  {
+                    \setmainfont { TeXGyrePagellaX-Regular.otf }
+                      [
+                        BoldFont       = TeXGyrePagellaX-Bold.otf ,
+                        ItalicFont     = TeXGyrePagellaX-Italic.otf ,
+                        BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf ,
+                        Numbers        = OldStyle ,
+                      ]
+                  }
+                  {
+                    \setmainfont { TeXGyrePagellaX-Regular.otf }
+                      [
+                        BoldFont       = TeXGyrePagellaX-Bold.otf ,
+                        ItalicFont     = TeXGyrePagellaX-Italic.otf ,
+                        BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf ,
+                      ]
+                  }
+              }
+            \setsansfont { SourceSansPro-Regular.otf }
+              [
+                Scale          = MatchLowercase ,
+                BoldFont       = SourceSansPro-Bold.otf ,
+                ItalicFont     = SourceSansPro-RegularIt.otf ,
+                BoldItalicFont = SourceSansPro-BoldIt.otf ,
+              ]
+            \setmonofont { NewCMMono10-Regular.otf }
+              [
+                Scale          = 1.05 ,
+                BoldFont       = NewCMMono10-Bold.otf ,
+                ItalicFont     = NewCMMono10-Italic.otf ,
+                BoldItalicFont = NewCMMono10-BoldOblique.otf ,
+              ]
 
-\if at PJLlang@enable at JP
-\gappto{\PJLlang at langconfig@JP}{%
-    \def\CJKsffamily{\CJKfamily{JPsans}}%
-    \def\CJKttfamily{\CJKfamily{JPmono}}%
-    \CJKfamily{JPmain}%
-}
-\fi
+            \projlib_language_set_linespacing_latin:n { \setstretch { 1.07 } }
+          }
+      }
 
-\def\minimalist at titlefontshape{\CJKsffamily}
-}
+    \PassOptionsToPackage { fontset = none, scheme = plain } { ctex }
+    \RequirePackage { ctex }
 
-\if at minimclass@customfont\else
-\if at minimclass@fast
-\RequirePackage{amssymb}
-\else
-\PassOptionsToPackage
-    {warnings-off={mathtools-colon,mathtools-overbracket}}{unicode-math}
-\RequirePackage{unicode-math}
-\unimathsetup{math-style=ISO, partial=upright, nabla=upright}
-\setmathfont{Asana-Math.otf}
-\IfFontExistsTF{Neo Euler}{%
-\setmathfont[range={up/{Latin,latin,Greek,greek},
-                    bfup/{Latin,latin,Greek,greek},
-                    cal, bfcal, frak, bffrak,
-                    `(,`),`[,`],`\{,`\},`:,`=,\ne,\equiv,`/,\backslash,
-                    \in,\notin,\ni,\subset,\supset,\subseteq,\supseteq,
-                    \rightarrow,\leftarrow,\mapsto,\hookrightarrow,\hookleftarrow,
-                    \sum,\prod,\coprod,
-                    \sqrt,\int,\iint,\iiint,\oint},
-              script-features={},
-              sscript-features={},
-              Scale = 1.05,
-            ]{Neo Euler}
-}{}
-\setmathfont[range={\leq,\geq,\ll,\gg,\lll,\ggg,\leqslant,\geqslant},
-              Scale = 0.95,
-            ]{latinmodern-math.otf}
-\setmathfont[range={up/num, bfup/num}
-            ]{texgyrepagella-math.otf}
+    \__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_cjk_bool { \l__minimclass_custom_font_file_cjk_str }
+      {
+        \__minimclass_if_font_exist:nnn { SourceHanSerifSC-Regular }
+          {
+            \setCJKmainfont { SourceHanSerifSC-Regular }
+              [
+                BoldFont       = SourceHanSerifSC-Bold ,
+                ItalicFont     = * ,
+                BoldItalicFont = SourceHanSerifSC-Bold ,
+              ]
+          }
+          {
+            \setCJKmainfont { FandolSong-Regular.otf }
+              [
+                BoldFont       = FandolSong-Bold.otf ,
+                ItalicFont     = FandolKai-Regular.otf ,
+                BoldItalicFont = FandolKai-Regular.otf ,
+                BoldItalicFeatures = { FakeBold = 4 } ,
+              ]
+          }
 
-\AtBeginDocument{
-\let\mid at original\mid
-\renewcommand{\mid}{\hspace{-.2em}\mid at original\hspace{-.2em}}
-\let\nmid at original\nmid
-\renewcommand{\nmid}{\hspace{-.2em}\nmid at original\hspace{-.2em}}
-\renewcommand{\frac}[2]{\genfrac{}{}{}{}{
-    \mathchoice
-        {\raisebox{-.15em}{$\displaystyle #1$}}
-        {\raisebox{-.15em}{$\textstyle #1$}}
-        {\raisebox{-.08em}{$\scriptstyle #1$}}
-        {\scriptscriptstyle #1}
-}{
-    \mathchoice
-        {\raisebox{.08em}{$\displaystyle #2$}}
-        {\raisebox{.08em}{$\textstyle #2$}}
-        {\raisebox{.05em}{$\scriptstyle #2$}}
-        {\scriptscriptstyle #2}
-}}
-}
+        \__minimclass_if_font_exist:nnn { SourceHanSansSC-Regular }
+          {
+            \setCJKsansfont{SourceHanSansSC-Regular}
+              [
+                BoldFont       = SourceHanSansSC-Bold ,
+                ItalicFont     = * ,
+                BoldItalicFont = SourceHanSansSC-Bold ,
+              ]
+          }
+          {
+            \setCJKsansfont { FandolHei-Regular.otf }
+              [
+                BoldFont       = FandolHei-Bold.otf ,
+                ItalicFont     = * ,
+                BoldItalicFont = FandolHei-Bold.otf ,
+              ]
+          }
 
-\RequirePackage{tikz-cd}
-\newbox\xratbelow
-\newbox\xratabove
-\renewcommand{\xrightarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [->, baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) -- node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xleftarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [<-, baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) -- node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xleftrightarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [<->, baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) -- node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xhookrightarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/hookrightarrow] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xhookleftarrow}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/hookleftarrow] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\renewcommand{\xmapsto}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/mapsto] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\newcommand{\xlongequal}[2][]{%
-    \setbox\xratbelow=\hbox{\ensuremath{\scriptstyle #1}}%
-    \setbox\xratabove=\hbox{\ensuremath{\scriptstyle #2}}%
-    \pgfmathsetlengthmacro{\xratlen}{max(\wd\xratbelow, \wd\xratabove) + .8em}%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/equal] node[below=3pt] {\box\xratbelow}
-        node[above=2pt] {\box\xratabove}
-        (\xratlen,0) ;}}
-\AtBeginDocument{
-\renewcommand{\twoheadrightarrow}{%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/twoheadrightarrow] (.8em,0) ;}}
-\renewcommand{\twoheadleftarrow}{%
-    \mathrel{\tikz [baseline=-.55ex, every node/.style={inner sep=0pt}]
-        \draw (0,0) edge[commutative diagrams/twoheadleftarrow] (.8em,0) ;}}
-}
-\fi
-\fi
+        \__minimclass_if_font_exist:nnn { SourceHanMonoSC-Regular }
+          {
+            \setCJKmonofont { SourceHanMonoSC-Regular }
+              [
+                BoldFont       = SourceHanMonoSC-Medium ,
+                ItalicFont     = * ,
+                BoldItalicFont = SourceHanMonoSC-Medium ,
+              ]
+          }
+          {
+            \setCJKmonofont { FandolFang-Regular.otf }
+              [
+                BoldFont       = * ,
+                BoldFeatures   = { FakeBold = 4 } ,
+                ItalicFont     = * ,
+                BoldItalicFont = * ,
+                BoldItalicFeatures = { FakeBold = 4 } ,
+              ]
+          }
 
-\if at minimclass@lmodern
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \RequirePackage{cfr-lm}
-    \else
-        \RequirePackage{lmodern}
-    \fi
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+        \bool_if:NT \g__projlib_language_enabled_schinese_bool
+          {
+            \__minimclass_if_font_exist:nnn { SourceHanSerifSC-Regular }
+              {
+                \setCJKfamilyfont { SCmain } { SourceHanSerifSC-Regular }
+                  [
+                    BoldFont       = SourceHanSerifSC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSerifSC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { SCmain } { FandolSong-Regular.otf }
+                  [
+                    BoldFont       = FandolSong-Bold.otf ,
+                    ItalicFont     = FandolKai-Regular.otf ,
+                    BoldItalicFont = FandolKai-Regular.otf ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanSansSC-Regular }
+              {
+                \setCJKfamilyfont { SCsans } { SourceHanSansSC-Regular }
+                  [
+                    BoldFont       = SourceHanSansSC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSansSC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { SCsans } { FandolHei-Regular.otf }
+                  [
+                    BoldFont       = FandolHei-Bold.otf ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = FandolHei-Bold.otf ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanMonoSC-Regular }
+              {
+                \setCJKfamilyfont { SCmono } { SourceHanMonoSC-Regular }
+                  [
+                    BoldFont       = SourceHanMonoSC-Medium ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanMonoSC-Medium ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { SCmono } { FandolFang-Regular.otf }
+                  [
+                    BoldFont       = * ,
+                    BoldFeatures   = { FakeBold = 4 } ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = * ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+          }
 
-\if at minimclass@palatino
-    \RequirePackage{amssymb}
-    \RequirePackage{mathpazo}
-    \PassOptionsToPackage{defaultsups}{newpxtext}
-    \RequirePackage{newpxtext}
-    % \RequirePackage{newpxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.07}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+        \bool_if:NT \g__projlib_language_enabled_tchinese_bool
+          {
+            \__minimclass_if_font_exist:nnn { SourceHanSerifTC-Regular }
+              {
+                \setCJKfamilyfont { TCmain } { SourceHanSerifTC-Regular }
+                  [
+                    BoldFont       = SourceHanSerifTC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSerifTC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { TCmain } { FandolSong-Regular.otf }
+                  [
+                    BoldFont       = FandolSong-Bold.otf ,
+                    ItalicFont     = FandolKai-Regular.otf ,
+                    BoldItalicFont = FandolKai-Regular.otf ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanSansTC-Regular }
+              {
+                \setCJKfamilyfont { TCsans } { SourceHanSansTC-Regular }
+                  [
+                    BoldFont       = SourceHanSansTC-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSansTC-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { TCsans } { FandolHei-Regular.otf }
+                  [
+                    BoldFont       = FandolHei-Bold.otf ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = FandolHei-Bold.otf ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanMonoTC-Regular }
+              {
+                \setCJKfamilyfont { TCmono } { SourceHanMonoTC-Regular }
+                  [
+                    BoldFont       = SourceHanMonoTC-Medium ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanMonoTC-Medium ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { TCmono } { FandolFang-Regular.otf }
+                  [
+                    BoldFont       = * ,
+                    BoldFeatures   = { FakeBold = 4 } ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = * ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+          }
 
-\if at minimclass@times
-    \RequirePackage{amssymb}
-    \PassOptionsToPackage{defaultsups}{newtxtext}
-    \RequirePackage{newtxtext}
-    \RequirePackage{newtxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.00}}
-    \if at minimclass@useosf\useosf\fi
-\fi
+        \bool_if:NT \g__projlib_language_enabled_japanese_bool
+          {
+            \__minimclass_if_font_exist:nnn { SourceHanSerif-Regular }
+              {
+                \setCJKfamilyfont { JPmain } { SourceHanSerif-Regular }
+                  [
+                    BoldFont       = SourceHanSerif-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSerif-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { JPmain } { FandolSong-Regular.otf }
+                  [
+                    BoldFont       = FandolSong-Bold.otf ,
+                    ItalicFont     = FandolKai-Regular.otf ,
+                    BoldItalicFont = FandolKai-Regular.otf ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanSans-Regular }
+              {
+                \setCJKfamilyfont { JPsans } { SourceHanSans-Regular }
+                  [
+                    BoldFont       = SourceHanSans-Bold ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanSans-Bold ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { JPsans } { FandolHei-Regular.otf }
+                  [
+                    BoldFont       = FandolHei-Bold.otf ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = FandolHei-Bold.otf ,
+                  ]
+              }
+            \__minimclass_if_font_exist:nnn { SourceHanMono-Regular }
+              {
+                \setCJKfamilyfont { JPmono } { SourceHanMono-Regular }
+                  [
+                    BoldFont       = SourceHanMono-Medium ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = SourceHanMono-Medium ,
+                  ]
+              }
+              {
+                \setCJKfamilyfont { JPmono } { FandolFang-Regular.otf }
+                  [
+                    BoldFont       = * ,
+                    BoldFeatures   = { FakeBold = 4 } ,
+                    ItalicFont     = * ,
+                    BoldItalicFont = * ,
+                    BoldItalicFeatures = { FakeBold = 4 } ,
+                  ]
+              }
+          }
 
-\if at minimclass@garamond
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf\else
-        \PassOptionsToPackage{lining}{ebgaramond}
-    \fi
-    \RequirePackage{ebgaramond-maths}
-    \RequirePackage{ebgaramond}
-    % \RequirePackage{garamondlibre}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+        \cs_new:Nn \minimclass_cjk_sffamily: {}
+        \cs_new:Nn \minimclass_cjk_ttfamily: {}
 
-\if at minimclass@noto
-    \RequirePackage{amssymb}
-    \if at minimclass@useosf
-        \PassOptionsToPackage{oldstyle}{notomath}
-    \fi
-    \RequirePackage{anyfontsize}
-    \RequirePackage{notomath}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
+        \hook_gput_code:nnn { cmd/sffamily/after } { minimclass } { \minimclass_cjk_sffamily: }
+        \hook_gput_code:nnn { cmd/ttfamily/after } { minimclass } { \minimclass_cjk_ttfamily: }
 
-\if at minimclass@biolinum
-    \RequirePackage{amssymb}
-    % \RequirePackage{mathpazo}
-    % \RequirePackage[sansmath]{libertinust1math}
-    \ifPDFTeX
-        \if at minimclass@useosf
-            \PassOptionsToPackage{osf}{biolinum}
-        \fi
-        \RequirePackage{biolinum}
-        \renewcommand*\familydefault{\biolinum at family}
-    \else
-        \PassOptionsToPackage{no-math}{fontspec}
-        \RequirePackage{fontspec}
-        \setmainfont{LinBiolinum_R.otf}[
-            BoldFont       = LinBiolinum_RB.otf ,
-            ItalicFont     = LinBiolinum_RI.otf ,
-            BoldItalicFont = LinBiolinum_RBO.otf,
-            \if at minimclass@useosf Numbers = OldStyle\fi ]
-    \fi
-    \PJLsetlinespacing{\setstretch{1.05}}
-    \RequirePackage[italic,defaultmathsizes]{mathastext}
-\fi
+        \AddLanguageSetting [schinese]
+          {
+            \cs_set:Nn \minimclass_cjk_sffamily: { \CJKfamily { SCsans } }
+            \cs_set:Nn \minimclass_cjk_ttfamily: { \CJKfamily { SCmono } }
+            \CJKfamily { SCmain }
+          }
+        \AddLanguageSetting [tchinese]
+          {
+            \cs_set:Nn \minimclass_cjk_sffamily: { \CJKfamily { TCsans } }
+            \cs_set:Nn \minimclass_cjk_ttfamily: { \CJKfamily { TCmono } }
+            \CJKfamily { TCmain }
+          }
+        \AddLanguageSetting [japanese]
+          {
+            \cs_set:Nn \minimclass_cjk_sffamily: { \CJKfamily { JPsans } }
+            \cs_set:Nn \minimclass_cjk_ttfamily: { \CJKfamily { JPmono } }
+            \CJKfamily { JPmain }
+          }
 
-\def\PJL at font@alreadyset{}
+        \tl_gset:Nn \g_minimalist_title_font_common_tl { \minimclass_cjk_sffamily: }
+      }
 
-\PassOptionsToPackage{verbose=silent}{microtype}
-\RequirePackage{microtype}
-\PassOptionsToPackage{all}{nowidow}
-\RequirePackage{nowidow}
-\RequirePackage{embrac}
+    \__minimclass_load_file_or_config:Nnn \l__minimclass_load_custom_font_file_math_bool { \l__minimclass_custom_font_file_math_str }
+      {
+        \bool_if:NF \g_projlib_font_already_set_bool
+          {
+            \bool_if:NTF \l__minimclass_fast_bool
+              {
+                \RequirePackage { amssymb }
+              }
+              {
+                \PassOptionsToPackage { warnings-off = { mathtools-colon, mathtools-overbracket } } { unicode-math }
+                \RequirePackage { unicode-math }
+                \unimathsetup { math-style = ISO, partial = upright, nabla = upright }
+                \setmathfont { Asana-Math.otf }
+                \__minimclass_if_font_exist:nnn { Neo~Euler }
+                  {
+                    \setmathfont { Neo~Euler }
+                      [
+                        range             = { up / { Latin, latin, Greek, greek },
+                                              bfup / { Latin, latin, Greek, greek },
+                                              cal, bfcal, frak, bffrak,
+                                              `(, `), `[, `], `\{, `\}, `:, `=, \ne, \equiv, `/, \backslash,
+                                              \in, \notin, \ni, \subset, \supset, \subseteq, \supseteq,
+                                              \rightarrow, \leftarrow, \leftrightarrow,
+                                              \longleftarrow, \longrightarrow, \longleftrightarrow,
+                                              \Leftarrow, \Rightarrow, \Leftrightarrow,
+                                              \Longleftarrow, \Longrightarrow, \Longleftrightarrow,
+                                              \nrightarrow, \nleftarrow, \nleftrightarrow,
+                                              \nLeftarrow, \nRightarrow, \nLeftrightarrow,
+                                              \mapsto, \hookrightarrow, \hookleftarrow,
+                                              \leftharpoonup, \rightharpoonup, \leftharpoondown, \rightharpoondown,
+                                              \rightleftharpoons, \leftrightharpoons,
+                                              \sum, \prod, \coprod,
+                                              \sqrt, \int, \iint, \iiint, \oint
+                                            },
+                        script-features   = {},
+                        sscript-features  = {},
+                        Scale             = 1.05,
+                      ]
+                  }{}
+                \setmathfont { latinmodern-math.otf }
+                  [
+                    range = { \leq, \geq, \ll, \gg, \lll, \ggg, \leqslant, \geqslant },
+                    Scale = 0.95,
+                  ]
+                \setmathfont { texgyrepagella-math.otf }
+                  [
+                    range = { up / num, bfup / num }
+                  ]
 
-%%================================
-%% Graphics
-%%================================
-\RequirePackage{graphicx}
-\graphicspath{{images/}}
-\RequirePackage{wrapfig}
-\RequirePackage{float}
-\RequirePackage{caption}
-\captionsetup{font=small}
+                \hook_gput_code:nnn { begindocument } { minimclass }
+                  {
+                    \NewCommandCopy \minimclass_backup_mid: \mid
+                    \RenewDocumentCommand \mid {}
+                      { \skip_horizontal:n {-.15em} \minimclass_backup_mid: \skip_horizontal:n {-.15em} }
+                    \NewCommandCopy \minimclass_backup_nmid: \nmid
+                    \RenewDocumentCommand \nmid {}
+                      { \skip_horizontal:n {-.15em} \minimclass_backup_nmid: \skip_horizontal:n {-.15em} }
+                  }
 
+                \RequirePackage { tikz-cd }
+
+                \box_new:N \l__minimclass_xarrows_above_box
+                \box_new:N \l__minimclass_xarrows_below_box
+                \dim_new:N \l__minimclass_xarrows_length_dim
+                \cs_new_protected:Nn \minimclass_xarrows_generic:nnnn
+                  % #3 = option of \tikz
+                  % #4 = edge of \draw
+                  {
+                    \hbox_set:Nn \l__minimclass_xarrows_below_box { \ensuremath { \scriptstyle #1 } }
+                    \hbox_set:Nn \l__minimclass_xarrows_above_box { \ensuremath { \scriptstyle #2 } }
+                    \dim_set:Nn \l__minimclass_xarrows_length_dim
+                      { \dim_eval:n { \dim_max:nn { \box_wd:N \l__minimclass_xarrows_below_box } { \box_wd:N \l__minimclass_xarrows_above_box } + .8em } }
+                    \mathrel
+                      {
+                        \tikz [ #3, baseline = -.55ex, every~node/.style = { inner~sep = 0pt } ]
+                          \draw (0,0) #4
+                            node [ below = 3pt ] { \box_use:N \l__minimclass_xarrows_below_box }
+                            node [ above = 2pt ] { \box_use:N \l__minimclass_xarrows_above_box }
+                            ( \l__minimclass_xarrows_length_dim ,0) ;
+                      }
+                  }
+
+                \RenewDocumentCommand \xrightarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } { -> } { -- }
+                  }
+                \RenewDocumentCommand \xleftarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } { <- } { -- }
+                  }
+                \RenewDocumentCommand \xleftrightarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } { <-> } { -- }
+                  }
+                \RenewDocumentCommand \xhookrightarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/hookrightarrow ] }
+                  }
+                \RenewDocumentCommand \xhookleftarrow { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/hookleftarrow ] }
+                  }
+                \RenewDocumentCommand \xmapsto { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/mapsto ] }
+                  }
+                \NewDocumentCommand \xlongequal { O{} m }
+                  {
+                    \minimclass_xarrows_generic:nnnn { #1 } { #2 } {} { edge [ commutative~diagrams/equal ] }
+                  }
+                \hook_gput_code:nnn { begindocument/end } { minimclass }
+                  {
+                    \RenewDocumentCommand \twoheadrightarrow {}
+                      {
+                        \minimclass_xarrows_generic:nnnn { \,\, } {} {} { edge [ commutative~diagrams/twoheadrightarrow ] }
+                      }
+                    \RenewDocumentCommand \twoheadleftarrow {}
+                      {
+                        \minimclass_xarrows_generic:nnnn { \,\, } {} {} { edge [ commutative~diagrams/twoheadleftarrow ] }
+                      }
+                  }
+              }
+          }
+      }
+  }
+
+\PassOptionsToPackage { all } { nowidow }
+\RequirePackage { nowidow }
+\RequirePackage { embrac }
+
 %%================================
-%% Index
+%%  Graphics
 %%================================
-\AtEndPreamble{
-\pretocmd{\printindex}{\LocallyStopLineNumbers}{}{}
-\apptocmd{\printindex}{\ResumeLineNumbers}{}{}
-}
+\RequirePackage { graphicx }
+\graphicspath { { images/ } }
+\RequirePackage { wrapfig }
+\RequirePackage { float }
+\RequirePackage { caption }
+\captionsetup { font = small }
 
 \endinput
 %%



More information about the tex-live-commits mailing list.