Newer
Older
LaTeX / otagofonts.sty
\def\packagedate{13 December 2024}
\def\packageversion{2.0.1}
\def\packageshortdate{2024/12/13}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Set up official Otago fonts based on what’s available. Fall back to reasonable
% alternatives where possible.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Version History
% v1.0    Initial version, rebuilt from deprecated lecturecommon package.
% v1.1    Refactored font checking mechanism.
% v1.2    Fixed sans-serif scaling, added Noto Sans.
% v1.3    Added new Wickliffe fonts and fallbacks.
% v1.3.1  Switched serif font to Wickliffe Light.
% v1.3.2  Switched bold fonts to Wickliffe (Sans) Medium.
% v1.4    Switched from mathspec to unicode-math, further font tweaks.
% v1.4.1  Replaced deprecated ifxetex with iftex.
% v2.0    Rewritten for LuaTeX exclusively.
% v2.0.1  Ensured LuaTeX detection occurs first and moved join operator
%         substitution to relalg.sty.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\NeedsTeXFormat{LaTeX2e}[2001/06/01]
\ProvidesPackage{otagofonts}[\packageshortdate\space v\packageversion\space Otago standard fonts]


% This package requires LuaTeX, because XeTeX (a) doesn't really support
% OpenType variable fonts and (b) is no longer recommended by the LaTeX
% core team due to issues with PDF tagging.
% (see <https://www.latex-project.org/news/latex2e-news/ltnews40.pdf>)
% There were never really any good solutions for doing this in anything
% other than XeTeX/LuaTeX anyway, so the fallback for other engines has
% also been removed.
\RequirePackage{iftex}
\RequireLuaTeX


\RequirePackage{amsmath}
\RequirePackage{etoolbox}
\RequirePackage[no-math]{fontspec}
\RequirePackage{xstring}
\RequirePackage{unicode-math} % needs to go last


% Try a few different fonts that are either the official Otago font or a
% reasonable alternative, using etoolbox's list looping macros. The tricky
% part is making it generic for all three font categories (main, sans, mono),
% and I can only successfully make it work for the first one encountered.
% The set of fonts is limited, so this is OK.
%
% Note: Explicitly specify Ligatures=TeX only for the main and sans fonts,
% otherwise curly quotes will automatically appear in the mono font. Since
% the mono font is pretty much exclusively used for code listings, TeX
% ligatures are a bad thing.


% Main font (body text).
\newbool{foundmainfont}
\def\mainfontname{none}
\PackageInfo{otagofonts}{Looking for suitable main font}

% font-specific defaults
\defaultfontfeatures[Wickliffe Light]{
    BoldFont={Wickliffe Medium},
    ItalicFont={Wickliffe Light Italic},
    BoldItalicFont={Wickliffe Medium Italic}
}
\defaultfontfeatures[Crimson Pro Light]{
    BoldFont={Crimson Pro Medium},
    ItalicFont={Crimson Pro Light Italic},
    BoldItalicFont={Crimson Pro Medium Italic}
}

\renewcommand*{\do}[1]{%
    \PackageInfo{otagofonts}{Trying #1...}
    \IfFontExistsTF{#1}{%
        \setmainfont{#1}[Ligatures=TeX]%
        \def\mainfontname{#1}%
        \PackageInfo{otagofonts}{Using \mainfontname\space for main font}%
        \booltrue{foundmainfont}%
        \listbreak%
    }{}%
}

\docsvlist{Wickliffe Light,Crimson Pro Light,Crimson Text,Georgia,TeX Gyre Pagella,Times New Roman}


% Maths font.
% In principle we can do the same thing for the maths font, but we’re
% only going to use fonts built into TeXlive anyway, and we ideally
% want to choose a maths font that complements the main font. If we
% can't find a suitable maths font, default to Latin Modern Math,
% which looks reasonably OK alongside many fonts (especially for
% light weights). The maths font can always be manually overidden
% using \setmathfont in the document if a better alternative is available.
\setmathfont{latinmodern-math.otf}

\ifbool{foundmainfont}{%
    % The following conditions are naturally mutually exclusive, so no need
    % for complex if/then/else nesting.
    \IfSubStr{\mainfontname}{Light}{%
        % KpMath comes in several weights.
        \setmathfont{KpMath-Light.otf}[Scale=MatchLowercase]%
        \setmathfont{KpMath-Semibold.otf}[version=bold]%
        \setmathrm{KpRoman-Light.otf}%
        \setmathfontface\mathit{KpRoman-LightItalic.otf}%
        \setmathfontface\mathbf{KpRoman-Semibold.otf}%
    }{}%
    \IfEq{\mainfontname}{TeX Gyre Pagella}{%
        \setmathfont{TeX Gyre Pagella Math}%
    }{}%
}{%
    \PackageWarning{otagofonts}{%
        Could not find any suitable main font.\MessageBreak%
        Falling back to LaTeX default.\MessageBreak%
        Recommended fonts:\MessageBreak%
        \space\space Wickliffe (official, proprietary)\MessageBreak%
        \space\space Crimson Pro (https://fonts.google.com/specimen/Crimson+Pro)%
        \space\space Crimson Text (https://fonts.google.com/specimen/Crimson+Text)%
    }%
}


% Sans-serif font.
\newbool{foundsansfont}
\def\sansfontname{none}
\PackageInfo{otagofonts}{Looking for suitable sans-serif font}

% font-specific defaults
\defaultfontfeatures[Wickliffe Sans Light]{
    BoldFont={Wickliffe Sans Medium},
    ItalicFont={Wickliffe Sans Light Italic},
    BoldItalicFont={Wickliffe Sans Medium Italic}
}
\defaultfontfeatures[Open Sans Light]{
    BoldFont={Open Sans Semibold},
    ItalicFont={Open Sans Light Italic},
    BoldItalicFont={Open Sans Semibold Italic}
}
\defaultfontfeatures[Noto Sans Light]{
    BoldFont={Noto Sans Medium},
    ItalicFont={Noto Sans Light Italic},
    BoldItalicFont={Noto Sans Medium Italic}
}
\defaultfontfeatures[Roboto Light]{
    BoldFont={Roboto Medium},
    ItalicFont={Roboto Light Italic},
    BoldItalicFont={Roboto Medium Italic}
}

\renewcommand*{\do}[1]{%
    \PackageInfo{otagofonts}{Trying #1...}
    \IfFontExistsTF{#1}{%
        \setsansfont{#1}[Scale=MatchLowercase, Ligatures=TeX]%
        \def\sansfontname{#1}%
        \PackageInfo{otagofonts}{Using \sansfontname\space for sans-serif font}%
        \booltrue{foundsansfont}%
        \listbreak%
    }{}%
}

\docsvlist{Wickliffe Sans Light,Open Sans Light,Noto Sans Light,Roboto Light,Arial}

\ifbool{foundsansfont}{}{%
    \PackageWarning{otagofonts}{Could not find any suitable sans-serif font.\MessageBreak%
        Falling back to LaTeX default.\MessageBreak%
        Recommended fonts:\MessageBreak%
        \space\space Wickliffe Sans (official, proprietary)\MessageBreak%
        \space\space Open Sans (https://fonts.google.com/specimen/Open+Sans)\MessageBreak%
        \space\space Roboto (https://fonts.google.com/specimen/Roboto)%
    }%
}


% Monospaced font, mainly for code listings.
\newbool{foundmonofont}
\def\monofontname{none}
\PackageInfo{otagofonts}{Looking for suitable monospaced font}

% font-specific defaults
\defaultfontfeatures[Iosevka Light]{
    RawFeature={+ss03;-calt},
    BoldFont={Iosevka Medium},
    ItalicFont={Iosevka Light Italic},
    BoldItalicFont={Iosevka Medium Italic}
}
\defaultfontfeatures[Inconsolata Light]{
    BoldFont={Inconsolata Medium},
    ItalicFont={Inconsolata Light Italic},
    BoldItalicFont={Inconsolata Medium Italic}
}

\renewcommand*{\do}[1]{%
    \PackageInfo{otagofonts}{Trying #1...}
    \IfFontExistsTF{#1}{%
        \setmonofont{#1}[Scale=MatchLowercase]%
        \def\monofontname{#1}%
        \PackageInfo{otagofonts}{Using \monofontname\space for monospaced font}%
        \booltrue{foundmonofont}%
        \listbreak%
    }{}%
}

\docsvlist{Iosevka Light,Letter Gothic 12 Pitch,Inconsolata}

\ifbool{foundmonofont}{}{%
    \PackageWarning{otagofonts}{Could not find any suitable monospaced font.\MessageBreak%
        Falling back to LaTeX default.\MessageBreak%
        Recommended fonts:\MessageBreak%
        \space\space Iosevka (https://github.com/be5invis/Iosevka/releases, but complex!)\MessageBreak%
        \space\space Inconsolata (https://fonts.google.com/specimen/Inconsolata)%
    }%
}


\endinput