Newer
Older
LaTeX / lectures / otagofonts.sty
\def\filedate{23 February 2021}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Set up official Otago fonts based on what’s available. Fall back to close
% facsimiles where possible.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Version History
% v1.0   Initial version, rebuilt from deprecated lecturecommon package.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\NeedsTeXFormat{LaTeX2e}[2001/06/01]
\ProvidesPackage{otagofonts}[2021/02/23 Otago standard fonts v1.0]


\RequirePackage{etoolbox}
\RequirePackage{ifxetex}
\RequirePackage{amsmath} % needs to be loaded before mathspec


\ifxetex


\RequirePackage[no-math]{fontspec}
\RequirePackage{mathspec}
\RequirePackage{xunicode}
\RequirePackage{xltxtra}


% Try a few different fonts that are either the official Otago font, or a reasonable
% facsimile thereof. Effectively done via a bunch of nested ifs. I did try using
% etoolbox's list looping macros, but the tricky part was making it generic for all
% three categories of font (primary, sans, mono), and I could only successfully make
% work for the first one encountered. The set of fonts is limited, so this is OK.
%
% Note: Explicitly specify Mapping=tex-text only for the primary and sans fonts,
% otherwise curly quotes will automatically appear in the mono font. Since
% this is pretty much exclusively used for code listings, this is a bad thing.

% Primary font (body text, maths).
\newbool{foundprimaryfont}
\PackageInfo{otagofonts}{Looking for suitable primary font}
\IfFontExistsTF{Minion Pro}{%
    % The following line is equivalent to:
    %   \setmainfont{Minion Pro}
    %   \setmathsfont(Latin,Digits){Minion Pro}
    %   \setmathrm{Minion Pro}
    \setprimaryfont[Mapping=tex-text]{Minion Pro}%
    \PackageInfo{otagofonts}{Using Minion Pro for primary font}%
    \booltrue{foundprimaryfont}%
}{%
    \IfFontExistsTF{Crimson Text}{%
        \setprimaryfont[Mapping=tex-text]{Crimson Text}%
        \PackageInfo{otagofonts}{Using Crimson Text for primary font}%
        \booltrue{foundprimaryfont}%
    }{%
        \IfFontExistsTF{Times New Roman}{%
            \setprimaryfont[Mapping=tex-text]{Times New Roman}%
            \PackageInfo{otagofonts}{Using Times New Roman for primary font}%
            \booltrue{foundprimaryfont}%
        }{%
            \PackageWarning{otagofonts}{%
                Could not find any suitable primary font.\MessageBreak%
                Falling back to LaTeX default.\MessageBreak%
                Recommended fonts:\MessageBreak%
                \space\space Minion Pro (official, commercial)\MessageBreak%
                \space\space Crimson Text (https://fonts.google.com/specimen/Crimson+Text)%
            }%
            \boolfalse{foundprimaryfont}%
        }%
    }%
}

\ifbool{foundprimaryfont}{%
    % Hack to prevent digits in hyperlinks from being set in the main font instead of the mono font.
    % Note: doesn't matter if this is executed multiple times. Only works if you use \setprimaryfont
    % or \setmathsfont first. From https://tex.stackexchange.com/a/99774.
    \makeatletter%
        \DeclareMathSymbol{0}{\mathalpha}{\eu@DigitsArabic@symfont}{`0}%
        \DeclareMathSymbol{1}{\mathalpha}{\eu@DigitsArabic@symfont}{`1}%
        \DeclareMathSymbol{2}{\mathalpha}{\eu@DigitsArabic@symfont}{`2}%
        \DeclareMathSymbol{3}{\mathalpha}{\eu@DigitsArabic@symfont}{`3}%
        \DeclareMathSymbol{4}{\mathalpha}{\eu@DigitsArabic@symfont}{`4}%
        \DeclareMathSymbol{5}{\mathalpha}{\eu@DigitsArabic@symfont}{`5}%
        \DeclareMathSymbol{6}{\mathalpha}{\eu@DigitsArabic@symfont}{`6}%
        \DeclareMathSymbol{7}{\mathalpha}{\eu@DigitsArabic@symfont}{`7}%
        \DeclareMathSymbol{8}{\mathalpha}{\eu@DigitsArabic@symfont}{`8}%
        \DeclareMathSymbol{9}{\mathalpha}{\eu@DigitsArabic@symfont}{`9}%
    \makeatother%
}

% Sans-serif font.
\newbool{foundsansfont}
\PackageInfo{otagofonts}{Looking for suitable sans-serif font}
\IfFontExistsTF{Open Sans Light}{%
    % Note scaling hack to fix the weird upscaling of Open Sans in Texlive 2020.
    % It doesn't affect the serif or monospace fonts (?!?!).
    \setsansfont[Mapping=tex-text, Scale=0.912, BoldFont={Open Sans}]{Open Sans Light}%
    % \setsansfont[Mapping=tex-text, Scale=MatchUppercase, BoldFont={Open Sans}]{Open Sans Light}%
    \PackageInfo{otagofonts}{Using Open Sans Light for sans-serif font}%
    \booltrue{foundsansfont}%
}{%
    \IfFontExistsTF{Roboto Light}{%
        \setsansfont[Mapping=tex-text, Scale=MatchUppercase, BoldFont={Roboto}]{Roboto Light}%
        \PackageInfo{otagofonts}{Using Roboto Light for sans-serif font}%
        \booltrue{foundsansfont}%
    }{%
        \IfFontExistsTF{Arial}{%
            \setsansfont[Mapping=tex-text, Scale=MatchUppercase]{Arial}%
            \PackageInfo{otagofonts}{Using Arial for sans-serif font}%
            \booltrue{foundsansfont}%
        }{%
            \PackageWarning{otagofonts}{Could not find any suitable sans-serif font.\MessageBreak%
                Falling back to LaTeX default.\MessageBreak%
                Recommended fonts:\MessageBreak%
                \space\space Open Sans (https://fonts.google.com/specimen/Open+Sans)\MessageBreak%
                \space\space Roboto (https://fonts.google.com/specimen/Roboto)%
            }%
            \boolfalse{foundsansfont}%
        }%
    }%
}

% Monospaced font, mainly for code listings.
\newbool{foundmonofont}
\PackageInfo{otagofonts}{Looking for suitable monospaced font}
\IfFontExistsTF{Iosevka Light}{%
    \setmonofont[Scale=MatchUppercase, Mapping=]{Iosevka Light}%
    \PackageInfo{otagofonts}{Using Iosevka Light for monospaced font}%
    \booltrue{foundmonofont}%
}{%
    \IfFontExistsTF{Letter Gothic 12 Pitch}{%
        \setmonofont[Scale=MatchUppercase, Mapping=]{Letter Gothic 12 Pitch}%
        \PackageInfo{otagofonts}{Using Letter Gothic 12 Pitch for monospaced font}%
        \booltrue{foundmonofont}%
    }{%
        \IfFontExistsTF{Inconsolata}{%
            \setmonofont[Scale=MatchUppercase, Mapping=]{Inconsolata}%
            \PackageInfo{otagofonts}{Using Inconsolata for monospaced font}%
            \booltrue{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)%
            }%
            \boolfalse{foundmonofont}%
        }%
    }%
}

\else % assume PDFLaTeX otherwise


\RequirePackage[T1]{fontenc}
\RequirePackage{textcomp}
\RequirePackage{lmodern}
\RequirePackage{mathpazo}

\PackageWarning{otagofonts}{%
    Otago-compatible fonts are not yet supported for LaTeX\MessageBreak%
    or PDFLaTeX. XeLaTeX is preferred%
}

% Gill Sans to come...
% \renewcommand{\sfdefault}{}
% \renewcommand{\ttdefault}{blg}


\fi


\endinput