From c47535c840f22e8dc3cacd587723aaa9338193b3 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Thu, 17 Mar 2022 20:33:16 +0000
Subject: jxu (17mar22) (branch)

git-svn-id: svn://tug.org/texlive/branches/branch2021.final@62770 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/einfart/einfart.cls | 1221 +++++++++++++----------
 1 file changed, 671 insertions(+), 550 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/einfart/einfart.cls')

diff --git a/Master/texmf-dist/tex/latex/einfart/einfart.cls b/Master/texmf-dist/tex/latex/einfart/einfart.cls
index 1be1a1d20ea..38fe5550d16 100644
--- a/Master/texmf-dist/tex/latex/einfart/einfart.cls
+++ b/Master/texmf-dist/tex/latex/einfart/einfart.cls
@@ -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@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@thmnum@default]
-
-\newif\if@minimclass@bfivepaper\@minimclass@bfivepaperfalse
-\DeclareVoidOption{b5paper}{\@minimclass@bfivepapertrue}
-\newif\if@minimclass@afourpaper\@minimclass@afourpaperfalse
-\DeclareVoidOption{a4paper}{\@minimclass@afourpapertrue}
-
-\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{\minimclass@baseclass}}
-\ProcessKeyvalOptions*\relax
-\LoadClass{\minimclass@baseclass}
-
-\if@minimclass@draft
-    \@minimclass@fasttrue
-\fi
-\if@minimclass@classical\else
-    \@minimclass@useindenttrue
-\fi
-\if@minimclass@lmodern
-    \@minimclass@customfonttrue
-\fi
-\if@minimclass@palatino
-    \@minimclass@customfonttrue
-\fi
-\if@minimclass@times
-    \@minimclass@customfonttrue
-\fi
-\if@minimclass@garamond
-    \@minimclass@customfonttrue
-\fi
-\if@minimclass@noto
-    \@minimclass@customfonttrue
-\fi
-\if@minimclass@biolinum
-    \@minimclass@customfonttrue
-\fi
+\RequirePackage{l3keys2e}
+\ProvidesExplClass
+  {einfart}
+  {2022/03/17} {}
+  {A simple and clear article style}
+
+\tl_const:Nn \l__minimclass_base_class_tl { article }
+
+
+\bool_new:N \l__minimclass_load_custom_font_file_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_bool
+
+\bool_new:N \l__minimclass_load_custom_font_file_latin_bool
+\bool_set_false:N \l__minimclass_load_custom_font_file_latin_bool
+
+\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
+  }
 
 %%================================
-%% Page layout
+%%  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@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@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@minimclass@fast
-    \PassOptionsToPackage{fast}{minimalist}
-    \RequirePackage{draftwatermark}
-    \DraftwatermarkOptions{text={\normalfont DRAFT},color=paper!95!-paper}
-\fi
-\if@minimclass@useindent
-    \RequirePackage{indentfirst}
-\else
-    \AtEndPreamble{\RequirePackage{parskip}}
-\fi
-\RequirePackage{minimalist}
+\RequirePackage { silence }
+\WarningFilter { geometry } { Over-specification }
+
+\PassOptionsToPackage { heightrounded } { geometry }
+\RequirePackage { geometry }
+
+\geometry
+  {
+    papersize = { 7in, 10in },
+    total = { 5.535in, 8.300in },
+    centering,
+    footnotesep = 2em plus 2pt minus 2pt,
+  }
+
+\bool_if:NT \l__minimclass_b_five_paper_bool
+  {
+    \geometry
+      {
+        b5paper,
+        total = { 5.535in, 8.160in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
+
+\bool_if:NT \l__minimclass_a_four_paper_bool
+  {
+    \geometry
+      {
+        a4paper,
+        total = { 6.500in, 9.685in },
+        centering,
+        footnotesep = 2em plus 2pt minus 2pt,
+      }
+  }
+
+\bool_if:NT \l__minimclass_fast_bool
+  {
+    \PassOptionsToPackage { fast } { minimalist }
+    \RequirePackage { draftwatermark }
+    \DraftwatermarkOptions { text = { \normalfont DRAFT }, color = paper!97!-paper }
+  }
+
+\bool_if:NTF \l__minimclass_useindent_bool
+  {
+    \RequirePackage { indentfirst }
+  }
+  {
+    \hook_gput_code:nnn { begindocument/before } { minimclass }
+      {
+        \RequirePackage { parskip }
+      }
+  }
+
+\RequirePackage { minimalist }
 
 %%================================
-%% Fonts
+%%  Fonts
 %%================================
-\if@minimclass@customfont\else
-    \if@minimclass@fast
-        \RequirePackage{mathpazo}
-    \fi
-\fi
-
-\PassOptionsToPackage{no-math,quiet}{fontspec}
-\RequirePackage{fontspec}
-
-\IfFileExists{minimalist-font.tex}{
-    \input{minimalist-font.tex}
-}{
-\IfFontExistsTF{Palatino Linotype}{%
-    \setmainfont{Palatino Linotype}
-        [\if@minimclass@useosf Numbers = OldStyle\fi]
-}{
-    \setmainfont{TeXGyrePagellaX-Regular.otf}[
-        BoldFont       = TeXGyrePagellaX-Bold.otf ,
-        ItalicFont     = TeXGyrePagellaX-Italic.otf ,
-        BoldItalicFont = TeXGyrePagellaX-BoldItalic.otf,
-        \if@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 ]
-}
-
-\PassOptionsToPackage{fontset=none,scheme=plain}{ctex}
-\RequirePackage{ctex}
-
-\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} ]
-}
-
-\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 ]
-}
-
-\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} ]
-}
-
-\if@PJLlang@enable@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
-
-\if@PJLlang@enable@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
-
-\if@PJLlang@enable@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
-
-\WarningFilter{latexfont}{Font shape}
-\WarningFilter{latexfont}{Some font}
-
-\def\CJKsffamily{}
-\def\CJKttfamily{}
-
-\apptocmd{\sffamily}{\CJKsffamily}{}{\FAIL}
-\apptocmd{\ttfamily}{\CJKttfamily}{}{\FAIL}
-
-\if@PJLlang@enable@CN
-\gappto{\PJLlang@langconfig@CN}{%
-    \def\CJKsffamily{\CJKfamily{SCsans}}%
-    \def\CJKttfamily{\CJKfamily{SCmono}}%
-    \CJKfamily{SCmain}%
-}
-\fi
-
-\if@PJLlang@enable@TC
-\gappto{\PJLlang@langconfig@TC}{%
-    \def\CJKsffamily{\CJKfamily{TCsans}}%
-    \def\CJKttfamily{\CJKfamily{TCmono}}%
-    \CJKfamily{TCmain}%
-}
-\fi
-
-\if@PJLlang@enable@JP
-\gappto{\PJLlang@langconfig@JP}{%
-    \def\CJKsffamily{\CJKfamily{JPsans}}%
-    \def\CJKttfamily{\CJKfamily{JPmono}}%
-    \CJKfamily{JPmain}%
-}
-\fi
-
-\def\minimalist@titlefontshape{\CJKsffamily}
-}
-
-\if@minimclass@customfont\else
-\if@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}
-
-\AtBeginDocument{
-\let\mid@original\mid
-\renewcommand{\mid}{\hspace{-.2em}\mid@original\hspace{-.2em}}
-\let\nmid@original\nmid
-\renewcommand{\nmid}{\hspace{-.2em}\nmid@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}
-}}
-}
-
-\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
-
-\if@minimclass@lmodern
-    \RequirePackage{amssymb}
-    \if@minimclass@useosf
-        \RequirePackage{cfr-lm}
-    \else
-        \RequirePackage{lmodern}
-    \fi
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
-
-\if@minimclass@palatino
-    \RequirePackage{amssymb}
-    \RequirePackage{mathpazo}
-    \PassOptionsToPackage{defaultsups}{newpxtext}
-    \RequirePackage{newpxtext}
-    % \RequirePackage{newpxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.07}}
-    \if@minimclass@useosf\useosf\fi
-\fi
-
-\if@minimclass@times
-    \RequirePackage{amssymb}
-    \PassOptionsToPackage{defaultsups}{newtxtext}
-    \RequirePackage{newtxtext}
-    \RequirePackage{newtxmath}
-    \let\openbox\relax
-    \PJLsetlinespacing{\setstretch{1.00}}
-    \if@minimclass@useosf\useosf\fi
-\fi
-
-\if@minimclass@garamond
-    \RequirePackage{amssymb}
-    \if@minimclass@useosf\else
-        \PassOptionsToPackage{lining}{ebgaramond}
-    \fi
-    \RequirePackage{ebgaramond-maths}
-    \RequirePackage{ebgaramond}
-    % \RequirePackage{garamondlibre}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
-
-\if@minimclass@noto
-    \RequirePackage{amssymb}
-    \if@minimclass@useosf
-        \PassOptionsToPackage{oldstyle}{notomath}
-    \fi
-    \RequirePackage{anyfontsize}
-    \RequirePackage{notomath}
-    \PJLsetlinespacing{\setstretch{1.00}}
-\fi
-
-\if@minimclass@biolinum
-    \RequirePackage{amssymb}
-    % \RequirePackage{mathpazo}
-    % \RequirePackage[sansmath]{libertinust1math}
-    \ifPDFTeX
-        \if@minimclass@useosf
-            \PassOptionsToPackage{osf}{biolinum}
-        \fi
-        \RequirePackage{biolinum}
-        \renewcommand*\familydefault{\biolinum@family}
-    \else
-        \PassOptionsToPackage{no-math}{fontspec}
-        \RequirePackage{fontspec}
-        \setmainfont{LinBiolinum_R.otf}[
-            BoldFont       = LinBiolinum_RB.otf ,
-            ItalicFont     = LinBiolinum_RI.otf ,
-            BoldItalicFont = LinBiolinum_RBO.otf,
-            \if@minimclass@useosf Numbers = OldStyle\fi ]
-    \fi
-    \PJLsetlinespacing{\setstretch{1.05}}
-    \RequirePackage[italic,defaultmathsizes]{mathastext}
-\fi
-
-\def\PJL@font@alreadyset{}
-
-\PassOptionsToPackage{verbose=silent}{microtype}
-\RequirePackage{microtype}
-\PassOptionsToPackage{all}{nowidow}
-\RequirePackage{nowidow}
-\RequirePackage{embrac}
+\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 }
+  }
+
+\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 } }
+  }
+
+\__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
+      {
+        \bool_if:NT \l__minimclass_fast_bool
+          {
+            \RequirePackage { mathpazo }
+          }
+
+        \PassOptionsToPackage { no-math,quiet } { fontspec }
+        \RequirePackage { fontspec }
+
+        \__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 ,
+              ]
+
+            \projlib_language_set_linespacing_latin:n { \setstretch { 1.07 } }
+          }
+      }
+
+    \PassOptionsToPackage { fontset = none, scheme = plain } { ctex }
+    \RequirePackage { ctex }
+
+    \__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 } ,
+              ]
+          }
+
+        \__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 ,
+              ]
+          }
+
+        \__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 } ,
+              ]
+          }
+
+        \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 } ,
+                  ]
+              }
+          }
+
+        \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 } ,
+                  ]
+              }
+          }
+
+        \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 } ,
+                  ]
+              }
+          }
+
+        \cs_new:Nn \minimclass_cjk_sffamily: {}
+        \cs_new:Nn \minimclass_cjk_ttfamily: {}
+
+        \hook_gput_code:nnn { cmd/sffamily/after } { minimclass } { \minimclass_cjk_sffamily: }
+        \hook_gput_code:nnn { cmd/ttfamily/after } { minimclass } { \minimclass_cjk_ttfamily: }
+
+        \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 }
+          }
+
+        \tl_gset:Nn \g_minimalist_title_font_common_tl { \minimclass_cjk_sffamily: }
+      }
+
+    \__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 }
+                  ]
+
+                \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 }
 
 %%================================
-%% Graphics
+%%  Graphics
 %%================================
-\RequirePackage{graphicx}
-\graphicspath{{images/}}
-\RequirePackage{wrapfig}
-\RequirePackage{float}
-\RequirePackage{caption}
-\captionsetup{font=small}
-
-%%================================
-%% Index
-%%================================
-\AtEndPreamble{
-\pretocmd{\printindex}{\LocallyStopLineNumbers}{}{}
-\apptocmd{\printindex}{\ResumeLineNumbers}{}{}
-}
+\RequirePackage { graphicx }
+\graphicspath { { images/ } }
+\RequirePackage { wrapfig }
+\RequirePackage { float }
+\RequirePackage { caption }
+\captionsetup { font = small }
 
 \endinput
 %%
-- 
cgit v1.2.3

