% -*- coding: utf-8 -*-
%
% Some font hacks for my Sphinx PDF documents
%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{my-doc-fonts}[%
  2026/05/16 v0.3 (Franz Glasner) Fonts for Sphinx generated PDFs]
\RequirePackage{xkeyval}
\RequirePackage{fontspec}
\IfFileExists{xcolor.sty}{%
% Should Sphinx load xcolor with its dvipsnames and svgnames options?
    \RequirePackage{xcolor}
}{%
    \RequirePackage{color}
}

\newif\if@mdf@mono@dejavusansmono\@mdf@mono@dejavusansmonofalse
\newif\if@mdf@mono@cmmono\@mdf@mono@cmmonofalse
\newif\if@mdf@mono@robotomono\@mdf@mono@robotomonofalse
\newif\if@mdf@mono@sscode\@mdf@mono@sscodefalse
\newif\if@mdf@mono@inconsolata\@mdf@mono@inconsolatafalse
\newif\if@mdf@mono@libertinusmono\@mdf@mono@libertinusmonofalse
\newif\if@mdf@augment@libertinusmono\@mdf@augment@libertinusmonofalse

\newif\if@mdf@WithDejaVuSansMono
\newif\if@mdf@WithCM
\newif\if@mdf@WithRobotoMono
\newif\if@mdf@WithIBMPlex
\newif\if@mdf@WithIBMPlexDejaVuSansMono
\newif\if@mdf@WithAdobeSourcePro
\newif\if@mdf@WithSpectral
\newif\if@mdf@WithCharter
\newif\if@mdf@WithLibertinus
\newif\if@mdf@WithGaramond
\newif\if@mdf@WithTufte
\newif\if@mdf@WithPalatino
\newif\if@mdf@WithCrimson

% A key compatible with options processing as option "fonts" but choices.
\define@choicekey*{my-doc-fonts.sty}{fonts}[\val\nr]{%
  % do not change anything: just deactivate the default "dejavusansmono"
  default,
  % no augmentation needed: all characters available
  dejavusansmono,  % use DejaVu Sans Mono as monospaced font
  % the fonts below are augmented for missing characters
  cm,              % assume CM fonts and just fix missing characters
  robotomono,      % use Roboto Mono as mono font
  ibmplex, plex,   % use the IBM Plex family (incl. Math)
  plex-dejavusansmono,  % use IBM Plex Serif/Sans and DejaVu Sans Mono
  adobesourcepro, adobesource,  % Use Adobe Source Serif/Sans/Mono
  spectral,        % use Spectral, Source Sans Pro and Source Code Pro
  charter,         % use XCharter (with XCharter Math), Lato and Inconsolata
  libertinus,      % use Libertinus family (incl. Math)
  garamond,        % EB Garamond (with Math), Libre Franklin and Inconsolata
  tufte,      % Tufte fonts: ETbb (with Math), GilliusADFNo2, DejaVu Sans Mono
  palatino,        % Palatino, Inter and Source Code Pro
  crimson,         % Crimson Pro, Cabin and Source Code Pro (incl. Erewhon Math)
  }{%
  % Not used for now : store the normalized option value (global and expanded)
  \xdef\@mdf@fonts{\val}%
  % Reset all option related font selection flags
  \@mdf@WithDejaVuSansMonofalse
  \@mdf@WithCMfalse
  \@mdf@WithRobotoMonofalse
  \@mdf@WithIBMPlexfalse
  \@mdf@WithIBMPlexDejaVuSansMonofalse
  \@mdf@WithAdobeSourceProfalse
  \@mdf@WithSpectralfalse
  \@mdf@WithCharterfalse
  \@mdf@WithLibertinusfalse
  \@mdf@WithGaramondfalse
  \@mdf@WithTuftefalse
  \@mdf@WithPalatinofalse
  \@mdf@WithCrimsonfalse
  % Now set the needed font selection flag
  \ifcase\nr\relax
    \relax
  \or
    \@mdf@WithDejaVuSansMonotrue
  \or
    \@mdf@WithCMtrue
  \or
    \@mdf@WithRobotoMonotrue
  \or
    \@mdf@WithIBMPlextrue
  \or
    \@mdf@WithIBMPlextrue
    % Normalize the stored string
    \gdef\@mdf@fonts{ibmplex}
  \or
    \@mdf@WithIBMPlexDejaVuSansMonotrue
  \or
    \@mdf@WithAdobeSourceProtrue
  \or
    \@mdf@WithAdobeSourceProtrue
    % Normalize the stored string
    \gdef\@mdf@fonts{adobesourcepro}
  \or
   \@mdf@WithSpectraltrue
  \or
    \@mdf@WithChartertrue
  \or
    \@mdf@WithLibertinustrue
  \or
    \@mdf@WithGaramondtrue
  \or
    \@mdf@WithTuftetrue
  \or
    \@mdf@WithPalatinotrue
  \or
    \@mdf@WithCrimsontrue
  \fi
}

%
% By default use the safe option dejavusansmono because is contains
% all characters without any hacks.
%
\ExecuteOptionsX{fonts=dejavusansmono}
\ProcessOptionsX\relax

\if@mdf@WithDejaVuSansMono
  % default but with DejaVu Sans Mono as monospaced font
  %\RequirePackage[DefaultFeatures={Scale=0.92},mono=false]{plex-otf}
  %\RequirePackage[mono=true,serif=false,sans=false,math=false]{dejavu-otf}  % all symbols are available
  \@mdf@mono@dejavusansmonotrue
\fi
\if@mdf@WithCM
  \@mdf@mono@cmmonotrue
\fi
\if@mdf@WithRobotoMono
  \@mdf@mono@robotomonotrue
\fi
%
%
\if@mdf@WithIBMPlex
  \RequirePackage{newunicodechar}
  \RequirePackage[DefaultFeatures={Scale=0.92}]{plex-otf}
  % Dont keep all default font features from plex-otf
  \defaultfontfeatures{}
  \newfontfamily\DejaVuSansMono{DejaVu Sans Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Oblique,
    BoldItalicFont = * Bold Oblique,
    Scale=MatchLowercase,
    Ligatures=TeX,
  ]
  \newunicodechar{▷}{{\DejaVuSansMono ▷}}% U+25B7
  \newunicodechar{∶}{{\DejaVuSansMono ∶}}% U+2236
  \newunicodechar{◆}{{\DejaVuSansMono ◆}}% U+25C6
  \newunicodechar{▪}{{\DejaVuSansMono ▪}}% U+25AA
  \newunicodechar{⟵}{{\DejaVuSansMono ⟵}}% U+27F5
  \newunicodechar{⟶}{{\DejaVuSansMono ⟶}}% U+27F6
  \newunicodechar{⟷}{{\DejaVuSansMono ⟷}}% U+27F7
  \newunicodechar{⇒}{{\DejaVuSansMono ⇒}}% U+21D2
  \newunicodechar{⇔}{{\DejaVuSansMono ⇔}}% U+21D4
  \newunicodechar{≟}{{\DejaVuSansMono ≟}}% U+225F
  \newunicodechar{∈}{{\DejaVuSansMono ∈}}% U+2208
  \newunicodechar{∌}{{\DejaVuSansMono ∌}}% U+220C
  %\newunicodechar{␣}{{\DejaVuSansMono ␣}}% U+2423  Missing!
  %\newunicodechar{^^^^2423}{{\DejaVuSansMono^^^^2423}}% U+2423
  %\newunicodechar{␣}{\textvisiblespace}% U+2423
  %\catcode`^^^^2423\active\protected\def^^^^2423{\textvisiblespace}

  \PassOptionsToPackage{%
    verbatimvisiblespace={\textcolor{red}{{\DejaVuSansMono^^^^2423}}},%
    verbatimcontinued={\textcolor{red}{{\DejaVuSansMono^^^^21aa}}}}%
    {sphinx}
\fi
\if@mdf@WithIBMPlexDejaVuSansMono
  \RequirePackage[DefaultFeatures={Scale=0.92},mono=false]{plex-otf}
  \@mdf@mono@dejavusansmonotrue
\fi
\if@mdf@WithAdobeSourcePro
  \defaultfontfeatures{Ligatures=TeX,Numbers={Lining,Tabular}}
  \setmainfont{Source Serif Pro}[
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
  ]
  \setsansfont{Source Sans Pro}[
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
  ]
  \@mdf@mono@sscodetrue
\fi
\if@mdf@WithSpectral
  \RequirePackage{unicode-math}
  \defaultfontfeatures{Ligatures=TeX,Numbers={Lining,Tabular}}
  \setmainfont{Spectral}[
    UprightFont = * Regular,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
  ]
  \setsansfont{Source Sans Pro}[
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
  ]
  \setmathfont{STIX Two Math}[Scale=MatchLowercase]
  \@mdf@mono@sscodetrue
\fi
\if@mdf@WithCharter
  \defaultfontfeatures{Ligatures=TeX,Numbers={Lining,Tabular}}
  \RequirePackage{xcharter-otf}% loads also XCharter Math
  \setsansfont{Lato}[
    UprightFont = * Regular,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
    Scale = MatchLowercase,
  ]
  \@mdf@mono@inconsolatatrue
\fi
\if@mdf@WithLibertinus
  \RequirePackage{newunicodechar}
  \RequirePackage[lining,tabular]{libertinus-otf}
  \@mdf@augment@libertinusmonotrue
\fi

\if@mdf@WithGaramond
  \RequirePackage[lining,tabular]{ebgaramond}
  \RequirePackage{unicode-math}
  \setmathfont{Garamond-Math}[Scale=MatchLowercase]
  \setsansfont{Libre Franklin}[Scale=MatchLowercase,Ligatures=TeX]
  \@mdf@mono@inconsolatatrue
\fi

\if@mdf@WithTufte
  \RequirePackage{unicode-math}
  \defaultfontfeatures{Numbers={Lining,Tabular},Ligatures=TeX}
  \setmainfont{ETbb}
  \setsansfont{GilliusADFNo2}[Scale=MatchLowercase]
  \setmathfont{Libertinus Math}[Scale=MatchLowercase]
  \@mdf@mono@dejavusansmonotrue
\fi

\if@mdf@WithPalatino
  \RequirePackage{unicode-math}
  \linespread{1.06}
  \defaultfontfeatures{Numbers={Lining,Tabular},Ligatures=TeX}
  \setmainfont{TeXGyrePagellaX}
  \setsansfont{Inter}[Scale=MatchLowercase]
  %\setsansfont{Rosario}[Scale=MatchLowercase,ScaleAgain=1.013]
  %\setmathfont{Asana Math}[Scale=MatchLowercase]
  \setmathfont{TeX Gyre Pagella Math}[Scale=MatchLowercase]
  %\@mdf@mono@sscodetrue
  \@mdf@mono@libertinusmonotrue
\fi

\if@mdf@WithCrimson
  \RequirePackage{unicode-math}
  \defaultfontfeatures{Ligatures=TeX, Numbers={Lining,Tabular}}
  \setmainfont{Crimson Pro}
  \setsansfont{Cabin}[Scale=MatchLowercase]
  \defaultfontfeatures{}% Erewhon Math needs this here!
  \setmathfont{Erewhon Math}[Scale=MatchLowercase]
  \@mdf@mono@sscodetrue
\fi

\defaultfontfeatures{}

\if@mdf@mono@dejavusansmono
  % automatically applied with Scale=MatchLowercase,...
  \RequirePackage[mono=true,serif=false,sans=false,math=false]{dejavu-otf}  % all symbols are available
  \fi

\if@mdf@mono@cmmono
  \RequirePackage{newunicodechar}
  \defaultfontfeatures{Ligatures=TeX,Numbers={Lining,Tabular},Scale=MatchLowercase}
  \newfontfamily\DejaVuSansMono{DejaVu Sans Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Oblique,
    BoldItalicFont = * Bold Oblique,
  ]
  \newunicodechar{▷}{{\DejaVuSansMono ▷}}% U+25B7
  \newunicodechar{∶}{{\DejaVuSansMono ∶}}% U+2236
  \newunicodechar{◆}{{\DejaVuSansMono ◆}}% U+25C6
  \newunicodechar{⟵}{{\DejaVuSansMono ⟵}}% U+27F5
  \newunicodechar{⟶}{{\DejaVuSansMono ⟶}}% U+27F6
  \newunicodechar{⟷}{{\DejaVuSansMono ⟷}}% U+27F7
  \newunicodechar{⇒}{{\DejaVuSansMono ⇒}}% U+21D2
  \newunicodechar{⇔}{{\DejaVuSansMono ⇔}}% U+21D4
  \newunicodechar{▪}{{\DejaVuSansMono ▪}}% U+25AA
  \newunicodechar{≟}{{\DejaVuSansMono ≟}}% U+225F
  \newunicodechar{∈}{{\DejaVuSansMono ∈}}% U+2208
  \newunicodechar{∌}{{\DejaVuSansMono ∌}}% U+220C
  \newunicodechar{≠}{{\DejaVuSansMono ≠}}% U+2260
  \newunicodechar{≤}{{\DejaVuSansMono ≤}}% U+2264
  \newunicodechar{≥}{{\DejaVuSansMono ≥}}% U+2265
  \PassOptionsToPackage{%
    verbatimvisiblespace={\textcolor{red}{{\DejaVuSansMono^^^^2423}}},%
    verbatimcontinued={\textcolor{red}{{\DejaVuSansMono^^^^21aa}}}}%
    {sphinx}
\fi

\if@mdf@mono@sscode
  \RequirePackage{newunicodechar}
  \defaultfontfeatures{Ligatures=TeX,Numbers={Lining,Tabular},Scale=MatchLowercase}
  \setmonofont{Source Code Pro}[
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
  ]
  \newfontfamily\DejaVuSansMono{DejaVu Sans Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Oblique,
    BoldItalicFont = * Bold Oblique,
  ]
  \newunicodechar{∶}{{\DejaVuSansMono ∶}}% U+2236
  \newunicodechar{⟵}{{\DejaVuSansMono ⟵}}% U+27F5
  \newunicodechar{⟶}{{\DejaVuSansMono ⟶}}% U+27F6
  \newunicodechar{⟷}{{\DejaVuSansMono ⟷}}% U+27F7
  \newunicodechar{⇒}{{\DejaVuSansMono ⇒}}% U+21D2
  \newunicodechar{⇔}{{\DejaVuSansMono ⇔}}% U+21D4
  \newunicodechar{≟}{{\DejaVuSansMono ≟}}% U+225F
  \newunicodechar{∈}{{\DejaVuSansMono ∈}}% U+2208
  \newunicodechar{∌}{{\DejaVuSansMono ∌}}% U+220C
  \PassOptionsToPackage{%
    verbatimvisiblespace={\textcolor{red}{{\DejaVuSansMono^^^^2423}}},%
    verbatimcontinued={\textcolor{red}{{\DejaVuSansMono^^^^21aa}}}}%
    {sphinx}
\fi

\if@mdf@mono@inconsolata
  \RequirePackage{newunicodechar}
  \defaultfontfeatures{Ligatures=TeX,Numbers={Lining,Tabular},Scale=MatchLowercase}
  \setmonofont{Inconsolata LGC Nerd Font Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
  ]
  \newfontfamily\DejaVuSansMono{DejaVu Sans Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Oblique,
    BoldItalicFont = * Bold Oblique,
  ]
  \newunicodechar{∶}{{\DejaVuSansMono ∶}}% U+2236
  \newunicodechar{⟵}{{\DejaVuSansMono ⟵}}% U+27F5
  \newunicodechar{⟶}{{\DejaVuSansMono ⟶}}% U+27F6
  \newunicodechar{⟷}{{\DejaVuSansMono ⟷}}% U+27F7
  \newunicodechar{≟}{{\DejaVuSansMono ≟}}% U+225F
  \newunicodechar{∈}{{\DejaVuSansMono ∈}}% U+2208
  \newunicodechar{∌}{{\DejaVuSansMono ∌}}% U+220C
\fi

\if@mdf@mono@robotomono
  \RequirePackage{newunicodechar}
  \defaultfontfeatures{Ligatures=TeX,Numbers={Lining,Tabular},Scale=MatchLowercase}
  \setmonofont{Roboto Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Italic,
    BoldItalicFont = * Bold Italic,
  ]
  \newfontfamily\DejaVuSansMono{DejaVu Sans Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Oblique,
    BoldItalicFont = * Bold Oblique,
  ]
  \newunicodechar{▷}{{\DejaVuSansMono ▷}}% U+25B7
  \newunicodechar{∶}{{\DejaVuSansMono ∶}}% U+2236
  \newunicodechar{◆}{{\DejaVuSansMono ◆}}% U+25C6
  \newunicodechar{⟵}{{\DejaVuSansMono ⟵}}% U+27F5
  \newunicodechar{⟶}{{\DejaVuSansMono ⟶}}% U+27F6
  \newunicodechar{⟷}{{\DejaVuSansMono ⟷}}% U+27F7
  \newunicodechar{⇒}{{\DejaVuSansMono ⇒}}% U+21D2
  \newunicodechar{⇔}{{\DejaVuSansMono ⇔}}% U+21D4
  \newunicodechar{▪}{{\DejaVuSansMono ▪}}% U+25AA
  \newunicodechar{≟}{{\DejaVuSansMono ≟}}% U+225F
  \newunicodechar{∈}{{\DejaVuSansMono ∈}}% U+2208
  \newunicodechar{∌}{{\DejaVuSansMono ∌}}% U+220C

  \PassOptionsToPackage{%
    verbatimvisiblespace={\textcolor{red}{{\DejaVuSansMono^^^^2423}}},%
    verbatimcontinued={\textcolor{red}{{\DejaVuSansMono^^^^21aa}}}}%
    {sphinx}
\fi

\if@mdf@mono@libertinusmono
  % This is stolen from libertinus-otf.sty!
  \setmonofont{LibertinusMono}[%
    Ligatures = TeX,
    Numbers = {Lining, Tabular},
    Scale = MatchLowercase,
    FakeStretch = 0.94,
    UprightFont = *-Regular,
    ItalicFont = *-Regular,
    ItalicFeatures = {FakeSlant=0.2},
    SlantedFont = *-Regular,
    SlantedFeatures= {FakeSlant=0.2},
    BoldFont = *-Regular,
    BoldFeatures = {RawFeature={embolden=3}},
    BoldItalicFont = *-Regular,
    BoldItalicFeatures={FakeSlant=0.2,RawFeature={embolden=3}},
    Extension      = .otf,
  ]
  \@mdf@augment@libertinusmonotrue
\fi

\if@mdf@augment@libertinusmono
  \RequirePackage{newunicodechar}
  \newfontfamily\DejaVuSansMono{DejaVu Sans Mono}[%
    UprightFont = *,
    BoldFont = * Bold,
    ItalicFont = * Oblique,
    BoldItalicFont = * Bold Oblique,
    Scale=MatchLowercase,
    Ligatures=TeX,
  ]
  \newunicodechar{▷}{{\DejaVuSansMono ▷}}% U+25B7
  \newunicodechar{∶}{{\DejaVuSansMono ∶}}% U+2236
  \newunicodechar{◆}{{\DejaVuSansMono ◆}}% U+25C6
  \newunicodechar{▪}{{\DejaVuSansMono ▪}}% U+25AA
  \newunicodechar{⟵}{{\DejaVuSansMono ⟵}}% U+27F5
  \newunicodechar{⟶}{{\DejaVuSansMono ⟶}}% U+27F6
  \newunicodechar{⟷}{{\DejaVuSansMono ⟷}}% U+27F7
  \newunicodechar{⇒}{{\DejaVuSansMono ⇒}}% U+21D2
  \newunicodechar{⇔}{{\DejaVuSansMono ⇔}}% U+21D4
  \newunicodechar{≟}{{\DejaVuSansMono ≟}}% U+225F
  \newunicodechar{∈}{{\DejaVuSansMono ∈}}% U+2208
  \newunicodechar{∌}{{\DejaVuSansMono ∌}}% U+220C
  \newunicodechar{≠}{{\DejaVuSansMono ≠}}% U+2260
  \newunicodechar{≤}{{\DejaVuSansMono ≤}}% U+2264
  \newunicodechar{≥}{{\DejaVuSansMono ≥}}% U+2265
  %\newunicodechar{␣}{{\DejaVuSansMono ␣}}% U+2423  Missing!
  %\newunicodechar{^^^^2423}{{\DejaVuSansMono^^^^2423}}% U+2423
  %\newunicodechar{␣}{\textvisiblespace}% U+2423
  %\catcode`^^^^2423\active\protected\def^^^^2423{\textvisiblespace}

  \PassOptionsToPackage{%
    verbatimvisiblespace={\textcolor{red}{{\DejaVuSansMono^^^^2423}}},%
    verbatimcontinued={\textcolor{red}{{\DejaVuSansMono^^^^21aa}}}}%
    {sphinx}
\fi

\defaultfontfeatures{}

\def\testmdf{
  Normalized: \@mdf@fonts\newline
}

\endinput
