%This style file allows to easily switch between many fonts.
%It is particularly useful when working with 16bits TeX
%but it can be used with normal TeX too (with less
%font choices).
%
%This style uses options to determine the fonts to use.
%                lmodern (or nothing) to choose the default font "lmmodern".
%                cmunicode              to use the "cmunicode" fonts. This fonts
%                                       has been created with all the CM fonts for 8bits TeX
%                                       and it is quite nice. THe characters are similar to lmmodern
%                                       with more glyphs (greek, cyrillic IPA) and no math font.
%                                       L'aspect des caractères est similaire à latin Modern.
%                                       Some of the characters are based on the good fonts from BlueSky.
%                didot                  to use GFS Didot with Asana Math for mathematic.
%                                       When 8bits TeX is used, the package "gfsdidot" is loaded.
%                lucida                 to use lucida (mathematic and standard)
%                stix                   to use STIX2 fonts (Mathematic and Standard)
%                cambria                to use Cambria with Cambria Math
%                                       Calibri is used for the sans serif font.
%                dejavu                 to use DejaVu (serif) and the math fonts from GUST foundry.
%                dejavusans             to use DejaVu Sans for text and Math. To complement
%                                       the LucidaBrightOT is used. When 8bits TeX is used,
%                                       the package "arev" is loaded.
%                neohellenic            to use GFS Neo Hellenic with GFSNeoHellenicMath.
%
%
%
%
% — Normally, other sahpe (tt or sans) are Latin Modern or DejaVu. 
%
% — Fonts "Latin Modern", "GFS Didot" and "Asana" are provided
%   (in usul directories) with all TeX distributions.
% — The fonts «STIX» version 2 (similar to Times Roman)
%   should be installed, after being downloaded from site
%   «http://www.stixfonts.org/», in the usual directories of TeX.
% — The fonts family "Lucida" should be bought at TUG
%   (https://www.tug.org) and installed in usual TeX directories.
% — The fonts "Cambria", "Cambria Math" and "Calibri" should be installed
%   as system fonts. This is generally the case when Excel is installed.
%
% — For the TeX 8bits, the fonts lmmodern is used except when gfsdidot or arev is loaded.
%   To use an other fonts, one can load the correct package after this style.
%   Par exemple, \usepackage[charter]{mathdesign}
%
% — This code has been tested with XeLateX (TeX 16bits) and pdflatex (TeX 8bits).
\chardef\PoliceLatinModern=0
\chardef\PoliceDidot=1
\chardef\PoliceLucida=2
\chardef\PoliceStixII=3
\chardef\PoliceCambria=4
\chardef\PoliceDejaVu=5
\chardef\PoliceCmUnicode=6
\chardef\PoliceDejavuSans=7
\chardef\PoliceNeoHellenic=8
%Useful to have an invalid value for a font. A such value can be used
%as an initializer or a delimiter of list
\chardef\PoliceInvalide=254 

%The default font used to typeset the document if the wanted font
%is not found. If one change this font, he should change
%the macros '\PoliceParDefaut' and '\MainFontDocText' accordingly.
\chardef\PoliceDocumentParDefaut=\PoliceLatinModern
%The real font of the document
\chardef\PoliceDocument\PoliceDocumentParDefaut
%The wanted font of the document. This macro and the previous one
%have the same value if the font is found but might differ
%if the default font is used when the wanted font cannot be found.
\chardef\PoliceDesiree\PoliceLatinModern
\DeclareOption{lmodern}{\chardef\PoliceDocument\PoliceLatinModern
                        \chardef\PoliceDesiree\PoliceLatinModern}
\DeclareOption{didot}{\chardef\PoliceDocument\PoliceDidot
                      \chardef\PoliceDesiree\PoliceDidot}
\DeclareOption{lucida}{\chardef\PoliceDocument\PoliceLucida
                       \chardef\PoliceDesiree\PoliceLucida}
\DeclareOption{stix}{\chardef\PoliceDocument\PoliceStixII
                     \chardef\PoliceDesiree\PoliceStixII}
\DeclareOption{cambria}{\chardef\PoliceDocument\PoliceCambria
                        \chardef\PoliceDesiree\PoliceCambria}
\DeclareOption{dejavu}{\chardef\PoliceDocument\PoliceDejaVu
                       \chardef\PoliceDesiree\PoliceDejaVu}
\DeclareOption{cmunicode}{\chardef\PoliceDocument\PoliceCmUnicode
                          \chardef\PoliceDesiree\PoliceCmUnicode}
\DeclareOption{dejavusans}{\chardef\PoliceDocument\PoliceDejavuSans
                           \chardef\PoliceDesiree\PoliceDejavuSans}
\DeclareOption{neohellenic}{\chardef\PoliceDocument\PoliceNeoHellenic
                            \chardef\PoliceDesiree\PoliceNeoHellenic}
\ProcessOptions

\usepackage{iftex}

%
%-------------------------------------Macros provided by the style--------------------------
%

%This macro provides the default settings when no font is specified (for TeX Unicode only).
%The default is to use the font Latin Modern and generally since it is
%the current default from pdfTeX, XeTeX and LuaTeX, almost nothing
%should be done.
%
%Since this fonts does not provide the greek character, these one are taken
%from the very similar CM Unicode font.
%
%This Macro has no parameter.
%
%This macro modify the global variable/macro "\PoliceDocument"
\newcommand\PoliceParDefaut{%
   \iftutex %16 bits TeX
           %The default font is Latin Modern, always defined with 16 bits TeX.
           %However, Greek is missing from Latin Modern. It will be taken from
           %the almost identical font CM Unicode.
	         %The command «\greekfont» is used with "polyglossia" and
	         %probably "babel".
	   \newfontfamily\greekfont[Script=Greek]{cmunrm.otf}[%
           Extension=.otf,%
           UprightFont=*,%
           BoldFont=cmunbx,%
           ItalicFont=cmunti,%
           BoldItalicFont=cmunbi]%
      \else %8bits TeX
	     \RequirePackage{lmodern}%
      \fi
      \chardef\PoliceDocument\PoliceDocumentParDefaut
}

%This macros contain the text to describe
%the default main font of the document.
%
%The macro has no parameter
\newcommand\MainFontDocText{%
   \iftutex{Latin Modern (Unicode)}\else{Latin Modern (\TeX)}\fi
}
    
%This macro typeset the name of the current set of fonts used to format
%the document.
%The name is similar to the option choosen but generally more suitable to be
%typeset in a document.
%
%To know, programmatically, the current font of the document, it's much
%better to use the macro "\PoliceDocument".
%
%The macro has no parameter.
\newcommand\MainDocFontName[1][\PoliceDocument]{
   \iftutex
      \ifcase#1%
       %Latin Modern
          \MainFontDocText
      \or
      %Didot
          GFS Didot, Asana Math%
      \or
      %Lucida
          Lucida%
      \or
      %Stix version 2 
          Stix 2%
      \or
      %Cambria
          Cambria, Cambria Math%
      \or
      %DejaVu
          DejaVu, TeX Gyre DejaVu Math%
      \or
      %CMUnicode
          CMUnicode, Latin Modern Math%
      \or
      %DejaVuSans
      \IfFontExistsTF{LucidaBrightMathOT.otf}{%
          DejaVu Sans,  Lucida Bright Math%
      }{%
          DejaVu Sans,  DejaVu Sans Math%
      }%
      \or
      %NeoHellenic
          GFS NeoHellenic%
      \else
          \MainFontDocText
      \fi
     \else
        %TeX standard
        \ifx\PoliceDocument\PoliceDejavuSans
        %Arev
            Arev (\TeX)%
        \else
          \ifx\PoliceDocument\PoliceDidot
          %Didot
              GFS Didot (\TeX)%
          \else
   	   %The default, lmmodern
              \MainFontDocText
          \fi
        \fi
     \fi
}

%This macro setup the definition to setup a font (in almost
%all the possible modes: Text, Math, Greek etc) in a 16 Bits LaTeX (lualatex,xelatex)
%and to setup the default font in 8bit TeX.
%
%The macro has 3 parameters:
%     1) the name of the font in a form usable by the command
%        "\IfFontExistsTF" of the package "fontspec"
%     2) the set of command to define the fonts to be used
%     3) a set of commands used as a fallback in the case of the font
%        is unavailable on a system
%
%Only the second parameter is used with 8 bits TeX.
\newcommand\ChoixPolice[3]{%
   \iftutex %TeX 16 bits
      \IfFontExistsTF{#1}{#2}{%Font wanted not found
          \wlog{The font #1 is not found. The font '\MainFontDocText' will be used instead.}%
          #3}%
   \else %TeX 8bits
    #2%
   \fi
}

%The following macros define the commands to be able to use the different
%available fonts in a document. Since they are so many fonts available, only
%the fonts with mathemathecal counterpart are defined.
\newcommand\ChoixDidot{%
   \ChoixPolice{GFSDidot.otf}{%
      \setmathfont{Asana-Math.otf}%
      \setmainfont{GFSDidot}[%
           Extension=.otf,%
           UprightFont=*,%
           BoldFont=*Bold,%
   	   ItalicFont=*Italic,%
   	   BoldItalicFont=*BoldItalic%
      ]%
   	 \setsansfont{DejaVuSans}[%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
   	   Scale = MatchLowercase%
        ]%
      \setmonofont{DejaVuSansMono}[% main typewriter%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
        ]%
   }{\PoliceParDefaut}%
}
\newcommand\ChoixLucida{%
  \ChoixPolice{LucidaBrightOT.otf}{%
      % Slightly reduce the size.
      %\defaultfontfeatures{Scale=.92}
      \setmathfont{LucidaBrightMathOT.otf}%
      \setmathfont[version=bold]{LucidaBrightMathOT-Demi.otf}%
      %
      % The explicit .otf extension tells the engines to find the font via%
      % filenames in the TeX trees, rather than as system-installed fonts.%
      %
      \setmainfont{LucidaBrightOT}[% main rm%
           Extension=.otf,%
           UprightFont=*,%
           ItalicFont=*-Italic,%
           BoldFont=*-Demi,%
           BoldItalicFont=*-DemiItalic,%
        ]%
      %
      \setsansfont{LucidaSansOT}[% main sans%
           Extension=.otf,%
           UprightFont=*,%
           ItalicFont=*-Italic,%
           BoldFont=*-Demi,%
           BoldItalicFont=*-DemiItalic,%
        ]%
      %
      \setmonofont{LucidaSansTypewriterOT.otf}[% main typewriter%
           Extension=.otf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
        ]%
      %
      %
      % The specialized one-off fonts:%
      \newfontface\LucidaBlackletter{LucidaBlackletterOT.otf}%
      \newfontface\LucidaCalligraphy{LucidaCalligraphyOT.otf}%
      \newfontface\LucidaHandwriting{LucidaHandwritingOT.otf}%
   }{\PoliceParDefaut}%
}
\newcommand\ChoixStix{%
  \ChoixPolice{STIX2Text-Regular.otf}{% 
      %Stix version 2 (the first version working with TeX)
      \setmathfont{STIX2Math.otf}%
      \setmainfont{STIX2Text}[%
           Extension=.otf,%
           UprightFont=*-Regular,%
           ItalicFont=*-Italic,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldItalic,%
        ]%
	 \setsansfont{DejaVuSans}[%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
        ]%
      \setmonofont{DejaVuSansMono}[% main typewriter%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
        ]%
	 %The macro "\greekfont" is used with "polyglossia" and "babel"%
	 \newfontfamily\greekfont[Script=Greek]{LinLibertine_R.otf}[%
	      Extension=.otf,%
          UprightFont=*,%
          BoldFont=LinLibertine_RB,%
	      ItalicFont=LinLibertine_RI,%
	      BoldItalicFont=LinLibertine_RBI]%
     }{\PoliceParDefaut}%
}
\newcommand\ChoixCambria{%
    \ChoixPolice{Cambria}{%
          \setmathfont{Cambria Math}%
	      \setmainfont{Cambria}%
	      \setsansfont{Calibri}%
          \setmonofont{DejaVuSansMono}[% main typewriter%
              Extension=.ttf,%
              UprightFont=*,%
              ItalicFont=*-Oblique,%
              BoldFont=*-Bold,%
              BoldItalicFont=*-BoldOblique,%
           ]%
    }{\PoliceParDefaut}%
}
\newcommand\ChoixDejaVu{%
    \ChoixPolice{DejaVuSerif.ttf}{%
     \setmathfont{texgyredejavu-math.otf}%
	 \setmainfont{DejaVuSerif}[%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Italic,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldItalic,%
        ]%
	 \setsansfont{DejaVuSans}[%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
        ]%
      \setmonofont{DejaVuSansMono}[% main typewriter%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
        ]%
   }{\PoliceParDefaut}%
}
\newcommand\ChoixCMUnicode{%
     \ChoixPolice{cmunrm.otf}{%
	%Latin Modern is used for math. For the rest, the CM Unicode (very similar to Latin
    %Modern is used). CM Unicode has more characters than Latin Modern
      \setmainfont{cmunrm}[%
           Extension=.otf,%
           UprightFont=*,%
           BoldFont=cmunbx,%
	   ItalicFont=cmunti,%
	   BoldItalicFont=cmunbi]%
      \setsansfont{cmunss}[%
           Extension=.otf,%
           UprightFont=*,%
           BoldFont=cmunsx,%
	   ItalicFont=cmunsi,%
	   BoldItalicFont=cmunso]%
      \setmonofont{cmuntt}[%
           Extension=.otf,%
           UprightFont=*,%
           BoldFont=cmuntb,%
	   ItalicFont=cmunst,%
	   BoldItalicFont=cmuntx]%
    }{\PoliceParDefaut}%
}
\newcommand\ChoixDejaVuSans{%
     \ChoixPolice{DejaVuSans.ttf}{%
      \IfFontExistsTF{LucidaBrightMathOT.otf}{%
         \setmathfont{LucidaBrightMathOT.otf}%Font color match better with dejaVuSans
      }{%
         \setmathfont{DejaVuSans.ttf}%
      }%
      \setmathfont{DejaVuSans.ttf}[range=up]%
      \setmathfont{DejaVuSans.ttf}[range=bb->bfsfup]%
      \setmathfont{DejaVuSans-Oblique.ttf}[range=it]%
      \setmathfont{DejaVuSansMono.ttf}[range=tt]%
      \setmathfont{DejaVuSans-Bold.ttf}[range=bfup]%
      \setmathfont{DejaVuSans-BoldOblique.ttf}[range=bfit]%
      \setmainfont{DejaVuSerif}[%
         Extension=.ttf,%
         UprightFont=*,%
         ItalicFont=*-Italic,%
         BoldFont=*-Bold,%
         BoldItalicFont=*-BoldItalic,%
         ]%
      \setsansfont{DejaVuSans}[%
         Extension=.ttf,%
         UprightFont=*,%
         ItalicFont=*-Oblique,%
         BoldFont=*-Bold,%
         BoldItalicFont=*-BoldOblique,%
      ]%
      \setmonofont{DejaVuSansMono}[% main typewriter%
         Extension=.ttf,%
         UprightFont=*,%
         ItalicFont=*-Oblique,%
         BoldFont=*-Bold,%
         BoldItalicFont=*-BoldOblique,%
      ]%
      \renewcommand\familydefault{\sfdefault}%
     }{\PoliceParDefaut}%
}
\newcommand\ChoixNeohellenic{%
      \ChoixPolice{GFSNeohellenic.otf}{%
      %Load GFS Neo Hellenic as the sans font and use the GFS Neo Hellenic
      %for math. Do some specific adaptation for the GFS Neo Hellenic at 12pt.
      \RequirePackage{gfsneohellenicot}%
      \setmonofont{DejaVuSansMono}[% main typewriter%
           Extension=.ttf,%
           UprightFont=*,%
           ItalicFont=*-Oblique,%
           BoldFont=*-Bold,%
           BoldItalicFont=*-BoldOblique,%
        ]%
      \renewcommand\familydefault{\sfdefault}%
      }{\PoliceParDefaut}%
}
%
%--------------------------------------Code executed when loading style----------------------
%
\iftutex
   \usepackage{unicode-math}
   \usepackage{fontspec}
   \defaultfontfeatures{Ligatures=TeX}
   \ifcase\PoliceDocument
       %Latin Modern is the default font
       \PoliceParDefaut
    \or
       \ChoixDidot
    \or
       \ChoixLucida
    \or
       \ChoixStix
    \or
       \ChoixCambria
    \or
	   \ChoixDejaVu
    \or
       \ChoixCMUnicode
    \or
       \ChoixDejaVuSans
    \or
       \ChoixNeohellenic
    \else
       \PoliceParDefaut
    \fi
  \else
     %TeX standard
     \RequirePackage{amssymb}
     \ifx\PoliceDocument\PoliceDejavuSans
         \RequirePackage{arev}
     \else
       \ifx\PoliceDocument\PoliceDidot
          \RequirePackage{gfsdidot}
       \else
	      \PoliceParDefaut
       \fi
     \fi
  \fi
