Newer
Older
LaTeX / otagofonts.sty
\def\filedate{27 October 2022}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 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.
% v1.1   Refactored font checking mechanism.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\NeedsTeXFormat{LaTeX2e}[2001/06/01]
\ProvidesPackage{otagofonts}[2022/10/27 Otago standard fonts v1.1]


\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}

\renewcommand*{\do}[1]{%
    \PackageInfo{otagofonts}{Trying #1...}
    \IfFontExistsTF{#1}{%
        % The following line is equivalent to:
        %   \setmainfont{fontname}[options]
        %   \setmathsfont(Latin,Digits){fontname}
        %   \setmathrm{fontname}
        \setprimaryfont[Mapping=tex-text]{#1}%
        \PackageInfo{otagofonts}{Using #1 for primary font}%
        \booltrue{foundprimaryfont}%
        \listbreak%
    }{}%
}

\docsvlist{Minion Pro,Crimson Pro,Crimson Text,Times New Roman}

\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%
}{%
    \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 Pro (https://fonts.google.com/specimen/Crimson+Pro)%
        \space\space Crimson Text (https://fonts.google.com/specimen/Crimson+Text)%
    }%
}


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

% font-specific defaults
\defaultfontfeatures[Open Sans Light]{BoldFont={Open Sans}}
\defaultfontfeatures[Roboto Light]{BoldFont={Roboto}}

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

\docsvlist{Open 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 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}
\PackageInfo{otagofonts}{Looking for suitable monospaced font}

% font-specific defaults
\defaultfontfeatures[Iosevka Light]{RawFeature={+ss03;-calt}}

\renewcommand*{\do}[1]{%
    \PackageInfo{otagofonts}{Trying #1...}
    \IfFontExistsTF{#1}{%
        \setmonofont{#1}[Scale=MatchUppercase]%
        \PackageInfo{otagofonts}{Using #1 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)%
    }%
}


\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