% $Id: typeface.sty 904 2012-06-16 13:32:38Z Geoffrey $
%
% typeface.sty Copyright (C) 2012 Geoffrey Jones
%
% This package (typeface.sty and optional configuration file, typeface.cfg)
% simplifies setting up rmdefault, sfdefault, ttdefault, symbols and math type1
% format (postscript) fonts. It is designed to allow users the widest latitude
% in mixing and matching whatever combination they might desire from these.
%
% Recommendations:
%  1. Compile with pdflatex or variants like lualatex for best results
%     (although since fontspec is a mainstay in lua, you might prefer to
%     stick with that package -- see lualatex-doc in your installation or
%     from internet download). Some type1 fonts do not render properly in
%     pdfxelatex compiled documents. Compiling to dvi rather
%     than directly to pdf can prove an `interesting' idea.
%
% Requires:
%  1. Requires e-TeX.
%  2. Ensure that microtype is already loaded if (and only if) text figures
%     substitute font letter spacing is desired (advanced usage). However,
%     note that microtype generally doesn't partner well with bitmap fonts,
%     especially if any scaling is involved. Should you select bitmap fonts
%     (concrete, cmbright, etc.), microtype will very likely throw "auto
%     expansion is only possible with scalable fonts" errors. Bottom line:
%     either avoid bitmap fonts (for example, install hfbright to configure
%     a type1 variant of cmbright), or avoid microtype.
%
% Restrictions:
%  1. This package is most suited to pdfLaTeX, and not particularly to
%     other TeX formats where, in any event, it would be swimming against
%     their particular tides. However, it has been demonstrated to work
%     (depending on your definition of `work') in LuaTeX and in more
%     restricted circumstances under XeTeX. If using XeTeX, the
%     fontspec package would make far and away the better choice.
%
% Programming conventions:
%  1. All commands in this package begin with `\tf@', `\TF@', usw. As far
%     as I know, of all the usual packages, classes, etc., only LaTeX's
%     math text size macro (\tf@size) and table files (`\tf@EXT' where EXT
%     is toc, lof, lot, etc) co-claim this namespace.
%  2. \TF@XXX is a constant (of sorts, since users can redefine many of these).
%  3. \TF@Xxx overrides standard mixed-case commands, e.g., \TF@PackageInfo
%     wrappers \PackageInfo.
%  4. Many internal commands can be overridden by pre-defining them in the
%     package configuration file (\TF@CONFIGFILE, usually `typeface.cfg').
%  5. \tf@@xxx commands are, if not strictly local to a command, volatile
%     across the scope of this package.
%
% This work may be distributed and/or modified under the conditions of the
% LaTeX Project Public License, either version 1.3 of this license or (at
% your option) any later version. The latest version of this license is in
% http://www.latex-project.org/lppl.txt and version 1.3 or later is part of
% all distributions of LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Original Author of this work is Geoffrey Jones.
% The Current Maintainer of this work is Geoffrey Jones.
% =============================================================================
\NeedsTeXFormat{LaTeX2e}[2009/09/24]

\newcommand*\TF@PACKAGENAME{typeface}
\newcommand*\TF@CONFIGFILE{\TF@PACKAGENAME.cfg}
\xdef\TF@CONFIGFILE{\TF@CONFIGFILE}

\ProvidesPackage{\TF@PACKAGENAME}
  [2012/06/11 (prerelease) Type1 font load management pkg (GJ)]

\RequirePackage{ifetex}
\NeedsETeX

\RequirePackage{etexcmds}  % renames e-tex \unexpanded to \etex@unexpanded
\RequirePackage{etoolbox}  % used extensively throughout this package
\RequirePackage{ifthenx}   % ifthen package plus extensions

\RequirePackage{iftex}                                                         % TODO: have we properly incorporated this?
\RequirePackage{ifpdf}

% Package-wide constants
%-----------------------
% User-reconfigurable constants
\providecommand*\TF@AUXFILENAME{\jobname.tf}

% Defaults used whenever the user either 1) does not explicitly define a
% typeface option or 2) explicitly specifies `default' (or whatever
% \TF@DEFAULT happens to be). Users can specify site specific defaults
% by including statements like:
%   \renewcommand*\TF@DEFAULTRMFONT{kpfonts:veryoldstyle:light}, or
%   \renewcommand*\TF@DEFAULTFONTENCODING{T5}
% in their configuration file \TF@CONFIGFILE. See the bundled configuration
% file for further examples.
\newcommand*\TF@DEFAULT{default}          % this pair should almost
\newcommand*\TF@DEFAULTPRINTNAME{Default} % certainly never be redefined!

\newcommand*\TF@DONTLOAD{dontload}        % generally synonyms
\newcommand*\TF@IGNORE{ignore}

\newcommand*\TF@DEFAULTRMFONT{\TF@DEFAULT}
\newcommand*\TF@DEFAULTSFFONT{\TF@DEFAULT}
\newcommand*\TF@DEFAULTTTFONT{\TF@DEFAULT}
\newcommand*\TF@DEFAULTMATHFONT{\TF@DEFAULT}
\newcommand*\TF@DEFAULTSYMBOLSFONT{\TF@DEFAULT}
\newcommand*\TF@DEFAULTTEXTFIGURESFONT{\TF@DEFAULT}

\newcommand*\TF@DEFAULTFONTENCODING{T1}
\newcommand*\TF@DEFAULTINPUTENCODING{utf8}
\newcommand*\TF@DEFAULTTEXTCOMP{full}
\newcommand*\TF@DEFAULTCMAP{resetfonts}

\newcommand*\TF@DEBUG@COLOUR@TS{purple}
\newcommand*\TF@DEBUG@COLOUR@SC{magenta}
\newcommand*\TF@DEBUG@COLOUR@JF{green}
\newcommand*\TF@DEBUG@COLOUR@XF{red}
\newcommand*\TF@DEBUG@COLOUR@LININGNUMS{olive}
\newcommand*\TF@DEBUG@COLOUR@RM{Indigo}
\newcommand*\TF@DEBUG@COLOUR@SF{Maroon}
\newcommand*\TF@DEBUG@COLOUR@TT{Green}
\newcommand*\TF@DEBUG@COLOUR@MATH{ProcessBlue}
\newcommand*\TF@DEBUG@COLOUR@XFNAME{\TF@DEBUG@COLOUR@XF}

% Non-reconfigurable constants -- see after aux file load,
% below, for especially constant constants.

% Package-wide variables and pre-initialised commands
%----------------------------------------------------
% Global macros -- stubs created here, code populated further below
\newcommand*\tf@fontencodingchoices{}    % package option choice lists are
\newcommand*\tf@inputencodingchoices{}   % initially empty; they are configured
\newcommand*\tf@textcompchoices{}        % below, or via configuration file
\newcommand*\tf@cmapchoices{}            % \TF@CONFIGFILE
\newcommand*\tf@rmtypefacechoices{}
\newcommand*\tf@sftypefacechoices{}
\newcommand*\tf@tttypefacechoices{}
\newcommand*\tf@mathtypefacechoices{}
\newcommand*\tf@symbolstypefacechoices{}
\newcommand*\tf@textfigurestypefacechoices{}

\newcommand*\tf@loadrmtypeface{}         % created here, populated by
\newcommand*\tf@loadsftypeface{}         % expansions of \newtypeface font
\newcommand*\tf@loadtttypeface{}         % definitions below and in user
\newcommand*\tf@loadmathtypeface{}       % customisation file \TF@CONFIGFILE
\newcommand*\tf@loadsymbolstypeface{}
\newcommand*\tf@loadtextfigurestypeface{}

\newcommand*\tf@rmdefault{\rmdefault}
\newcommand*\tf@sfdefault{\sfdefault}
\newcommand*\tf@ttdefault{\ttdefault}

\newcommand*\tf@rationalisefontnames{}   % typeface aliases management command
\newcommand*\tf@empty@sfcnt@hook{}       % empty font size function hook

% Volatiles
\newcommand*\tf@@listseparator{}         % for lists constructed on the fly

% Helper commands (heaps of them)
% ===============================

% Info messaging commands
%------------------------
\newcommand*\TF@PackageInfo[2][\TF@PACKAGENAME]{%
  \PackageInfo{#1}{#2}%
}

\newcommand*\TF@PackageInfoNoLine[2][\TF@PACKAGENAME]{%
  \PackageInfo{#1}{#2\@gobble}%
}

\newcommand*\TF@PackageDebugInfo[2][\TF@PACKAGENAME]{%
  \ifbool{tf@debug}{\TF@PackageInfo[#1]{#2}}{}%
}

\newcommand*\TF@PackageDebugInfoNoLine[2][\TF@PACKAGENAME]{%
  \ifbool{tf@debug}{\TF@PackageInfoNoLine[#1]{#2}}{}%
}

\newcommand*\TF@PackageWarning[2][\TF@PACKAGENAME]{%
  \PackageWarning{#1}{#2}%
}

\newcommand*\TF@PackageWarningNoLine[2][\TF@PACKAGENAME]{%
  \PackageWarningNoLine{#1}{#2}%
}

\newcommand*\TF@PackageError[3][\TF@PACKAGENAME]{%
  \PackageError{#1}{#2}{#3}%
}

\newcommand*\TF@ChoiceOptionError[2]{%
  \PackageError{\TF@PACKAGENAME}{Unexpected option `#1=#2' ignored}{}%
}

% etoolbox command wrappers
%--------------------------
\newcommand\tf@patchcmd[3]{
  \patchcmd{#1}{#2}{#3}
    {\TF@PackageInfo{Patched \string #1}}
    {\TF@PackageError{Failed to patch \string #1}{}}
}

\newcommand*\tf@newbool[2]{\newbool{#1}\setbool{#1}{#2}}

% globally undefine each command in a list of commands
\newcommand*\tf@undefinecommands[1]{\forcsvlist{\tf@undefinecommand}{#1}}
\newcommand*\tf@undefinecommand[1]{\global\undef{#1}}

% \usepackage wrapper command for (and only for) loading font packages
% in \newtypeface commands (below and in extension file \TF@CONFIGFILE)
%----------------------------------------------------------------------
\newcommand*\tf@usefontpackage[2][]{%
  \@ifpackageloaded{#2}{
    % Note that we often pre-pass options to packages using
    % \PassOptionsToPackage. Thus, we can't just test for
    % empty options ([#1]==[]) and proceed if so. Given that,
    % we stop in all cases of the target package already being
    % loaded.
    \TF@PackageWarningNoLine{%
      Package `#2' is already loaded. You should\MessageBreak
      probably sort this out before  proceeding. Did\MessageBreak
      you load `#2' before this package? Do you\MessageBreak
      need to revise your `fontloadorder' suboptions?\MessageBreak
      What would you like to do?}
  }{
    \TF@PackageDebugInfo{\string\usepackage[#1]{#2}}
    \usepackage[#1]{#2}
  }
}

% A few little throwaway helpers
%-------------------------------
% Discard all but the six leftmost characters of a string
\def\tf@strleftvi#1{%
  \expandafter\tf@@strleftvi#1\@empty\@empty\@empty\@empty\@empty\@empty\@nil%
}
\def\tf@@strleftvi#1#2#3#4#5#6#7\@nil{#1#2#3#4#5#6}

% Round up the provided floating point number and truncate to, at most,
% six characters (including minus sign and/or decimal point)
\def\tf@roundvi#1{%
  \edef\tf@@temp{\strip@pt\dimexpr#1pt+0.00005pt\relax}%
  \expandafter\tf@strleftvi\expandafter{\tf@@temp000000}%
}

\def\tf@roundvi@pt#1{%
  \edef\tf@@temp{\strip@pt\dimexpr#1+0.00005pt\relax}%
  \expandafter\tf@strleftvi\expandafter{\tf@@temp000000}pt%
}

% Colon-separated value list commands
%------------------------------------
% Helper test: \tf@ifsuboption tests whether item #1 is a member of
% colon-separated list #2. #2 will generally be \tf@XXfontoptions, where
% XX is one of rm, sf, tt, math, symbols or textfigures. Example usage:
%   \tf@ifsuboption{light}{\tf@sffontoptions}{<true part>}{<false part>}
% The list item immediately following #1 is saved in \tf@nextsuboption.
\tf@newbool{tf@suboptionfound}{false}
\newcommand*\tf@nextsuboption{}
\DeclareListParser{\tf@doColonSeparatedList}{:}  % refer etoolbox package

\newcommand*\tf@ifsuboption[2]{%
  % #1 item name, #2 item list
  % side effects: 1) sets boolean tf@suboptionfound,
  %               2) sets \tf@nextsuboption to next suboption in #2
  \edef\tf@suboption{#1}%
  \xdef\tf@nextsuboption{}%
  \boolfalse{tf@suboptionfound}%
  \renewcommand*\do[1]{%
    \ifbool{tf@suboptionfound}%
      {\xdef\tf@nextsuboption{##1}\listbreak}{}%
    \ifthenelse{\equal{\tf@suboption}{##1}}%
      {\booltrue{tf@suboptionfound}}{}%
  }%
  \expandafter\tf@doColonSeparatedList\expandafter{#2}%
  \ifbool{tf@suboptionfound}%
    {\expandafter\@firstoftwo}%
    {\expandafter\@secondoftwo}%
}

% Replace first #1 (to-be-replaced item) with #2 (new item) in #3 (item list)
% (Note, no parm safety checking or messaging on failure.)
\newcommand*\tf@replacesuboption[3]{%
  \edef\tf@originallist{#3}
  \patchcmd{#3}{#1}{#2}{%
    \TF@PackageDebugInfo{Replaced item `\string#1' with item `\string#2'
                         in list [\tf@originallist]}%
  }{}%
}

% Count the number of times item appears in the colon-separated item list
\newcounter{tf@suboptioncount}
\newcommand*\tf@suboptioncount[2]{%
  % #1 item name
  % #2 item list
  % side effect: sets counter tf@suboptioncount
  \setcounter{tf@suboptioncount}{0}%
  \renewcommand*\do[1]{%
    \ifthenelse{\equal{#1}{##1}}{\stepcounter{tf@suboptioncount}}{}%
  }%
  \expandafter\tf@doColonSeparatedList\expandafter{#2}%
}

% Count the number of non-empty items in the colon-separated item list
\newcommand*\tf@suboptionitemscount[1]{%
  % #1 item list
  % side effect: sets counter tf@suboptioncount
  \setcounter{tf@suboptioncount}{0}%
  \renewcommand*\do[1]{\stepcounter{tf@suboptioncount}}%
  \expandafter\tf@doColonSeparatedList\expandafter{#1}%
}

% Auxiliary file management
% =========================
\newcommand*\tf@initialise@auxfile{%
  \@ifundefined{tf@@auxfilehandle}{%
    \newwrite\tf@@auxfilehandle%
    \tf@newbool{tf@auxfileopen}{false}%
    \ifbool{@filesw}{%
      \TF@PackageDebugInfoNoLine{Opening auxiliary file \TF@AUXFILENAME..}%
      \immediate\openout\tf@@auxfilehandle=\TF@AUXFILENAME%
      \booltrue{tf@auxfileopen}%
    }{%
      \TF@PackageWarningNoLine{Auxiliary file output disabled,\MessageBreak
                               `\TF@AUXFILENAME' not written}%
    }%
  }{}%
}

\newcommand*\tf@writeauxfile[1]{
  \AtBeginDocument{%
    \ifbool{@filesw}{%
      \tf@initialise@auxfile%
      \TF@PackageDebugInfoNoLine{%
        Writing `#1' to auxiliary file \TF@AUXFILENAME..}%
      \@bsphack%
      {\let\protect\string\immediate\write\tf@@auxfilehandle{#1}}%
      \@esphack%
    }{}%
  }
}

\tf@newbool{tf@auxfilechanged}{false}
\tf@newbool{tf@sffontdirty}{false}     % set these two if we need second run
\tf@newbool{tf@ttfontdirty}{false}     % to ensure they are accurately scaled
\newcommand*\tf@notifyauxfiledirty[1]{
  \ifthenelse{\equal{#1}{sf}}{\global\booltrue{tf@sffontdirty}}{}
  \ifthenelse{\equal{#1}{tt}}{\global\booltrue{tf@ttfontdirty}}{}
  \notbool{tf@auxfilechanged}{
    \global\booltrue{tf@auxfilechanged}
    \ifbool{@filesw}{
      \TF@PackageWarningNoLine{%
        Auxiliary file `\TF@AUXFILENAME' has changed.\MessageBreak
        You need to recompile `\jobname.tex' again}
    }{}
  }{}
}

\AtEndOfPackage{
  \AtBeginDocument{%
    \ifbool{tf@auxfileopen}{%
      \TF@PackageDebugInfoNoLine{Closing auxiliary file \TF@AUXFILENAME..}%
      \immediate\closeout\tf@@auxfilehandle%
      \boolfalse{tf@auxfileopen}%
    }{}%
  }
}

% \newtypeface typeface definition command. This is this package's central
% customisation command. Users can use this command to a) extend the range of
% typeface package managed fonts or b) override the font definitions set out
% below. User font (re)definitions should be placed in customisation file
% \TF@CONFIGFILE (see example customisation file provided with this package).
% ===========================================================================
\newcommand\newtypeface[5][]{%
  % #1: [<optional comma-separated list of aliases for typeface name>]
  % #2: {<typeface name>}
  % #3: {<typeface human-readable print name>}
  %     NB, #3 can be empty, in which case the user must explicitly define
  %     the font's print name macro (e.g., \tf@rmprintname) in the code in #5
  % #4: {<typeface family: rm, sf, tt, math, symbols or textfigures>}
  % #5: {<typeface initialisation code>}, e.g.,
  %       {\renewcommand*\rmdefault{ppl}} or {\tf@usefontpackage{helv}...}
  % Note that, for better integration and debugging, users should load
  % font packages using \tf@usefontpackage rather than \usepackage (however,
  % continuing to use \usepackage for loading non-font packages outside
  % \newtypeface definitions).
  %
  \ifthenelse{\equal{#4}{rm}
           \OR\equal{#4}{sf}
           \OR\equal{#4}{tt}
           \OR\equal{#4}{math}
           \OR\equal{#4}{symbols}
           \OR\equal{#4}{textfigures}}{

    \def\do{}  % pre-initialised stub
    \ifcsundef{tf@#4font@#2}{

      % Add any (optional #1) fontname aliases to the list of valid typeface
      % package choices. Also, build helper macro \tf@rationalisefontnames
      % (invoked once, further below).
      \renewcommand*\do[1]{
        \expandafter\g@addto@macro\csname tf@#4typefacechoices\endcsname{##1,}
        \g@addto@macro\tf@rationalisefontnames{%
          % fyi, \tf@#4font is created by \tf@parsefontname, defined way below
          % e.g., \tf@rmfont is created by \tf@parsefontname{rm}
          \ifthenelse{\equal{\csname tf@#4font\endcsname}{##1}}{
            \expandafter\def\csname tf@#4font\endcsname{#2}
          }{}
        }
      }
      \docsvlist{#1}  % iterate \do over each typeface alias in #1

      % Add #2 to the \tf@#4typefacechoices comma separated list
      \expandafter\g@addto@macro\csname tf@#4typefacechoices\endcsname{#2,}

      % Add #2 to the \tf@load#4typeface command
      \expandafter\g@addto@macro\csname tf@load#4typeface\endcsname{
        \ifthenelse{\equal{\csname tf@#4font\endcsname}{#2}}
          {\csname tf@#4font@#2\endcsname}
          {}
      }

      % Construct \tf@#4font@#2, the font initialisation command
      % invoked by \tf@load#4typeface, just defined above
      \expandafter\providecommand\csname tf@#4font@#2\endcsname{#5}

      % Prepend some debug code to the macro
      \expandafter\pretocmd\expandafter{\csname tf@#4font@#2\endcsname}
        {\TF@PackageDebugInfo{Loading #4 typeface `#2'...}}{}{}

      % Prepend the font print name to the macro (so long as #3 the print
      % name isn't empty, otherwise whatever code invokes \newtypeface
      % will explicitly need to take care of this itself)
      \ifthenelse{\NOT\equal{#3}{}}{
        \expandafter\pretocmd\expandafter{\csname tf@#4font@#2\endcsname}
          {\expandafter\def\csname tf@#4printname\endcsname{#3}}{}{}
      }{}

      % Restore \DeclareSizeFunction if we redefined it in
      % \tf@initialisetextfiguresfont (defined below)
      \ifthenelse{\equal{#4}{textfigures}}{
        \expandafter\apptocmd\expandafter{\csname tf@#4font@#2\endcsname}{
          \ifthenelse{\NOT\isundefined{\oldDeclareSizeFunction}}
            {\let\DeclareSizeFunction\oldDeclareSizeFunction}{}
        }{}{}
      }{}

      % Record our package-managed \rmdefault, \sfdefault, \ttdefault
      \expandafter\apptocmd\expandafter{\csname tf@#4font@#2\endcsname}{
        \xdef\tf@rmdefault{\rmdefault}
        \xdef\tf@sfdefault{\sfdefault}
        \xdef\tf@ttdefault{\ttdefault}
      }{}{}

      % Have the macro register itself as and whenever it happens to be invoked
      \expandafter\g@addto@macro\csname tf@#4font@#2\endcsname{%
        \expandafter\def\csname tf@#4fontloadcommand\endcsname{tf@#4font@#2}%
      }

      % Finally, ensure our macro is restricted to the document preamble
      \expandafter\@onlypreamble\csname tf@#4font@#2\endcsname
    }{
      % User has included their own definition for standard typeface #2
      % in the #4 family (or they included multiple definitions for one
      % of their own typefaces) in their config file.
        \TF@PackageDebugInfo{%
          Encountered multiple definitions for `#2' in\MessageBreak
          the `#4' family. This is OK, however note that the\MessageBreak
          first definition takes precedence while subsequent\MessageBreak
          definitions are ignored}
    }
  }{
    \TF@PackageError{user configuration error: second\MessageBreak
      mandatory argument to \string\newtypeface\ should\MessageBreak
      be one of [rm,sf,tt,math,symbols,textfigures]}{}
  }
}

% User typeface scale command -- useful in the body of the initialisation
% code passed to the \newtypeface command (see examples below)
\newcommand*\scaletypeface[2]{
  % #1: sf, tt or textfigures
  % #2: any scaling code recognised by the font definition (.fd) file
  \ifthenelse{\equal{\csname tf@#1scalemethod\endcsname}{\TF@FX@SCALE}}{
    #2
    \booltrue{tf@#1scaledatloadtime}
  }{}
}

% Load package configuration file \TF@CONFIGFILE. This file may contain
%   1) user-defined fonts specifications (\newtypeface commands), and
%   2) overrides of constants in the code block immediately above.
%----------------------------------------------------------------------
\IfFileExists{\TF@CONFIGFILE}{
  \TF@PackageInfoNoLine{Loading configuration file `\TF@CONFIGFILE'...}
  \input{\TF@CONFIGFILE}
  \TF@PackageInfoNoLine{...completed loading configuration file
                        `\TF@CONFIGFILE'}
}{
  \TF@PackageInfoNoLine{%
    User typeface definition file `\TF@CONFIGFILE'\MessageBreak
    cannot be found (`\TF@CONFIGFILE' not loaded)}
}

% Non-reconfigurable enums -- (re)defined after config file load
%---------------------------------------------------------------
\newcommand*\TF@IMPLICITDEFAULT {0} % pkg option kv unspecified
\newcommand*\TF@EXPLICITDEFAULT {1} % pkg option kv explicitly = \TF@DEFAULT
\newcommand*\TF@EXPLICITOTHER   {2} % pkg option kv explicitly = something else

\newcommand*\TF@OSF@LF{0}   % lining figures
\newcommand*\TF@OSF@NF{1}   % native font -- do nothing
\newcommand*\TF@OSF@JF{2}   % native OSF 'j' (or equiv) font family
\newcommand*\TF@OSF@XF{3}   % substitute font
\newcommand*\TF@OSF@TS{4}   % TS1 encoding
\newcommand*\TF@OSF@SC{5}   % small caps

\newcommand*\TF@UNSCALED{1} % unitary scaling factor -- must be 1, not 1.0 etc.

\newcommand*\TF@ER@SCALE{0} % user error
\newcommand*\TF@NO@SCALE{1} % don't scale font; equiv, scale to \TF@UNSCALED
\newcommand*\TF@FX@SCALE{2} % scale font to fixed positive real number
\newcommand*\TF@EX@SCALE{3} % scale font to rm font ex height
\newcommand*\TF@LC@SCALE{4} % scale font to rm font lowercase letters height
\newcommand*\TF@UC@SCALE{5} % scale font to rm font uppercase letters height
\newcommand*\TF@FG@SCALE{6} % scale font to rm font figures height

\newcommand*\TF@DEFAULTFONTLOADORDER{textfigures:symbols:math:rm:sf:tt}

% Package options processing
% ==========================
\RequirePackage{xkeyval}

% Roman (default body text) typeface selection.
% Save <string> in \tf@rmfontname, given user options:
%   `typeface=<string>' or `rm=<string>'
%-----------------------------------------------------
\newcommand*\tf@rmfontname{\TF@DEFAULT}
\newcommand*\tf@rmfontdefaultstatus{\TF@IMPLICITDEFAULT}

\newcommand*\tf@define@key@typeface{
  \define@key{TF}{typeface}[]{
    \renewcommand*\tf@rmfontname{##1}
    \renewcommand*\tf@rmfontdefaultstatus{\TF@EXPLICITOTHER}
    % only partially initialised here -- complete initialisation below
  }
}
\tf@define@key@typeface

% As above but using synonym `rm=' instead
\tf@patchcmd{\tf@define@key@typeface}{typeface}{rm}
\tf@define@key@typeface

% Sans serif typeface selection
% Save <string> in \tf@sffontname, given user options:
%   `sanstypeface=<string>' or `sf=<string>'
%-----------------------------------------------------
\newcommand*\tf@sffontname{\TF@DEFAULT}
\newcommand*\tf@sffontdefaultstatus{\TF@IMPLICITDEFAULT}

\newcommand*\tf@define@key@sftypeface{
  \define@key{TF}{sanstypeface}[]{
    \renewcommand*\tf@sffontname{##1}
    \renewcommand*\tf@sffontdefaultstatus{\TF@EXPLICITOTHER}
    % only partially initialised here -- complete initialisation below
  }
}
\tf@define@key@sftypeface

% As above but using synonym `sf=' instead
\tf@patchcmd{\tf@define@key@sftypeface}{sanstypeface}{sf}
\tf@define@key@sftypeface

% Monospaced (typewriter) typeface selection
% Save <string> in \tf@ttfontname, given user options:
%   `monotypeface=<string>' or `tt=<string>'
%-----------------------------------------------------
\newcommand*\tf@ttfontname{\TF@DEFAULT}
\newcommand*\tf@ttfontdefaultstatus{\TF@IMPLICITDEFAULT}

\newcommand*\tf@define@key@tttypeface{
  \define@key{TF}{monotypeface}[]{
    \renewcommand*\tf@ttfontname{##1}
    \renewcommand*\tf@ttfontdefaultstatus{\TF@EXPLICITOTHER}
    % only partially initialised here -- complete initialisation below
  }
}
\tf@define@key@tttypeface

% As above but using synonym `tt=' instead
\tf@patchcmd{\tf@define@key@tttypeface}{monotypeface}{tt}
\tf@define@key@tttypeface

% Math typeface selection
% Save <string> in \tf@mathfontname, given user options:
%   `mathtypeface=<string>' or `math=<string>'
%-------------------------------------------------------
\newcommand*\tf@mathfontname{\TF@DEFAULT}
\newcommand*\tf@mathfontdefaultstatus{\TF@IMPLICITDEFAULT}

\newcommand*\tf@define@key@mathtypeface{
  \define@key{TF}{mathtypeface}[]{
    \renewcommand*\tf@mathfontname{##1}
    \renewcommand*\tf@mathfontdefaultstatus{\TF@EXPLICITOTHER}
    % only partially initialised here -- complete initialisation below
  }
}
\tf@define@key@mathtypeface

% As above but using synonym `math=' instead
\tf@patchcmd{\tf@define@key@mathtypeface}{mathtypeface}{math}
\tf@define@key@mathtypeface

% Symbols typeface selection
% Save <string> in \tf@symbolsfontname, given user options:
%   `symbolstypeface=<string>' or `sym=<string>'
%---------------------------------------------------------
\newcommand*\tf@symbolsfontname{\TF@DEFAULT}
\newcommand*\tf@symbolsfontdefaultstatus{\TF@IMPLICITDEFAULT}

\newcommand*\tf@define@key@symbolstypeface{
  \define@key{TF}{symbolstypeface}[]{
    \renewcommand*\tf@symbolsfontname{##1}
    \renewcommand*\tf@symbolsfontdefaultstatus{\TF@EXPLICITOTHER}
    % only partially initialised here -- complete initialisation below
  }
}
\tf@define@key@symbolstypeface

% As above but using synonym `sym=' instead
\tf@patchcmd{\tf@define@key@symbolstypeface}{symbolstypeface}{sym}
\tf@define@key@symbolstypeface

% Text figures (aka old style figures, aka lowercase roman numerals).
% Depending on your body text typeface, you can choose to source text
% figures from its old style font or from one of a limited number of
% entirely different substitute typefaces.
%--------------------------------------------------------------------
\newcommand*\tf@textfiguresfontname{\TF@DEFAULT}
\newcommand*\tf@textfiguresfontdefaultstatus{\TF@IMPLICITDEFAULT}

\newcommand*\tf@define@key@textfigurestypeface{
  \define@key{TF}{textfigures}[]{
    \renewcommand*\tf@textfiguresfontname{##1}
    \renewcommand*\tf@textfiguresfontdefaultstatus{\TF@EXPLICITOTHER}
    % only partially initialised here -- complete initialisation below
  }
}
\tf@define@key@textfigurestypeface

% Font encodings. Note that fontenc is one of only a rare number of
% packages that can be loaded multiple times.
%
% Typeface package option `fontencoding=<encs>' where <encs> is:
%   1) <empty>, in which case typeface will load the fontenc package
%      with option \TF@DEFAULTFONTENCODING (as defined above or redefined in
%      \TF@CONFIGFILE). This value is implied if the user does not explicitly
%      set the this package's `fontencoding' option.
%   2) `ignore' or `dontload' (or whatever the values of `\TF@IGNORE' or
%      `\TF@DONTLOAD' happen to be). In which case typeface does not load
%      fontenc.
%   3) a colon-separated list of items drawn from comma-separated list
%      \tf@fontencodingchoices (reader, are you listening up? <encs> is, like
%      all all other multi-valued package options that can be passed to this
%      package, colon-separated; \tf@fontencodingchoices is an internally
%      coded list, thus comma-separated). The allowable set of <encs> choices,
%      \tf@fontencodingchoices, is initialised below with possible additions
%      in defined in \TF@CONFIGFILE. Font encoding choice items are passed to
%      fontenc in the order that they appear in <encs>.
%      Special value `default' (or whatever the value of \TF@DEFAULT happens
%      to be), gets translated in the process to \TF@DEFAULTFONTENCODING
%      (defined above or in \TF@CONFIGFILE).
%      Note that the ***last*** (or most recently processed) item passed to
%      fontenc becomes the current default font encoding. So, e.g., T1 is
%      assigned to \encodingdefault when typeface is passed option
%      `fontencoding=LGR:T1'.
%
% NB, the cause of LaTeX compiler error:
%      LaTeX Error: Unknown option `YYY' for package `typeface'
% is forgetting that multi-valued package options (suboptions) are
% colon, NOT comma, separated. Instead of writing package option
%      ...,fontencoding=XXX,YYY,...
% the user should instead have written
%      ...,fontencoding=XXX:YYY,...
%----------------------------------------------------------------------------
\newcommand*\tf@fontencodingstring{}
\newcommand*\tf@fontencodingdefaultstatus{}

\define@key{TF}{fontencoding}[]{
  \renewcommand*\tf@fontencodingstring{#1}
  % only partially initialised here -- complete initialisation below
}

% List of common font encodings drawn from around the place, e.g.,
% from `encguide.pdf'.  You can add your own options to this list
% by including:
%     \renewcommand\tf@fontencodingchoices{<choice,...>}
% in configuration file \TF@CONFIGFILE. It won't hurt if you repeat
% any choices here.
\g@addto@macro\tf@fontencodingchoices{,%
  \TF@DEFAULT,%
  EU1,EU2,L7X,LAE,LFE,LGR,LHE,LM1,LV1,LY1,%
  OML,OMS,OMX,OT1,OT2,OT4,OT6,%
  T1,T2A,T2B,T2C,T3,T4,T5,T6,T7,%
  TS1,TS2,TS3,U,X1,X2,%
}

% Inputenc package options -- see comments with fontencoding
%-----------------------------------------------------------
\newcommand*\tf@inputencodingstring{}
\newcommand*\tf@inputencodingdefaultstatus{}

\define@key{TF}{inputencoding}[]{
  \renewcommand*\tf@inputencodingstring{#1}
  % only partially initialised here -- complete initialisation below
}

\g@addto@macro\tf@inputencodingchoices{,%
    \TF@DEFAULT,%
    ascii,latin1,latin2,latin3,latin4,latin5,latin9,latin10,%
    decmulti,applemac,macce,next,cp850,cp852,cp858,cp437,%
    cp437de,cp865,cp1250,cp1252,cp1257,ansinew,utf8,utf8x,%
}

% Textcomp package options -- see comments with fontencoding
%-----------------------------------------------------------
\newcommand*\tf@textcompstring{}
\newcommand*\tf@textcompdefaultstatus{}

\define@key{TF}{textcomp}[]{
  \renewcommand*\tf@textcompstring{#1}
  % only partially initialised here -- complete initialisation below
}

\g@addto@macro\tf@textcompchoices{,%
  \TF@DEFAULT,safe,euro,full,almostfull,warn,force,%
}

% Cmap package options -- see comments with fontencoding
%-------------------------------------------------------
\newcommand*\tf@cmapstring{}
\newcommand*\tf@cmapdefaultstatus{}

\define@key{TF}{cmap}[]{
  \renewcommand*\tf@cmapstring{#1}
  % only partially initialised here -- complete initialisation below
}

\g@addto@macro\tf@cmapchoices{,%
  \TF@DEFAULT,resetfonts,noresetfonts,%
}

% Font load order. Default font load order is:
%    textfigures -> symbols -> math -> rm -> sf -> tt
% (or as specified in \TF@DEFAULTFONTLOADORDER, above)
%
% 1. package option loadorder allows users to indicate (albeit strongly
%    indicate) their preferred font load order. We do our best to honour
%    the user's preference, but may occasionally choose to disregard it.
% 2. users should do their best to avoid using this option lest doing so
%    lead to brittle code (seemingly innocuous changes to document code
%    leading to unexpected problems). However, this option might prove
%    useful, especially in cases where math/symbols load ordering can
%    strongly affect results.
%-----------------------------------------------------------------------
\newcommand*\tf@fontloadorder{\TF@DEFAULTFONTLOADORDER}
\tf@newbool{tf@fontloadorderimplicit}{true}

\define@key{TF}{fontloadorder}[\TF@DEFAULTFONTLOADORDER]{
  \renewcommand*\tf@fontloadorder{#1}
  \boolfalse{tf@fontloadorderimplicit}
}

% Output extra info in log files and coloured text when debugging
%----------------------------------------------------------------
\tf@newbool{tf@debug}{false}
\tf@newbool{tf@debugimplicit}{true}

\define@choicekey+{TF}{debug}[]{true,false}[true]
  {\setbool{tf@debug}{#1}\boolfalse{tf@debugimplicit}}
  {\TF@ChoiceOptionError{debug}{#1}}

% Enabling print info commands will pull in packages we generally don't use
%--------------------------------------------------------------------------
\tf@newbool{tf@printinfo}{false}
\tf@newbool{tf@printinfoimplicit}{true}

\define@choicekey+{TF}{printinfo}[]{true,false}[true]
  {\setbool{tf@printinfo}{#1}\boolfalse{tf@printinfoimplicit}}
  {\TF@ChoiceOptionError{printinfo}{#1}}

% Finished declaring package options -- process them
%---------------------------------------------------
\TF@PackageDebugInfo{Processing package options...}
\ProcessOptionsX<TF>\relax

% Set default options; reset or complain about those that don't make sense
% ========================================================================
\TF@PackageDebugInfo{Reconfiguring and error-checking user options...}

% Package options validation -- typeface/rm, sanstypeface/sf, monotypeface/tt,
% mathtypeface/math, symbolstypeface/sym, textfigures
\newcommand*\tf@reconfigurefontoption[1]{
  % Set font defaults if a) user did not explicitly specify a desired font
  % or b) explicitly specified `default' (or whatever \TF@DEFAULT is defined
  % to be) instead.
  % #1 is rm, sf, tt, math, symbols or textfigures
  \ifthenelse{\equal{\csname tf@#1fontname\endcsname}{}}{
    \expandafter\xdef\csname tf@#1fontname\endcsname{\TF@DEFAULT}
    \expandafter\xdef\csname tf@#1fontdefaultstatus\endcsname
      {\TF@IMPLICITDEFAULT}
  }{}

  \ifthenelse{\equal{\csname tf@#1fontname\endcsname}{\TF@DEFAULT}
    \AND\equal{\csname tf@#1fontdefaultstatus\endcsname}{\TF@EXPLICITOTHER}}{
    \expandafter\xdef\csname tf@#1fontdefaultstatus\endcsname
      {\TF@EXPLICITDEFAULT}
  }{}

  \ifthenelse{\equal{\csname tf@#1fontname\endcsname}{\TF@DEFAULT}}{
    \MakeUppercase{\xdef\noexpand\tf@@tmp{TF@DEFAULT#1FONT}}
    \expandafter\xdef\csname tf@#1fontname\endcsname
      {\csname\tf@@tmp\endcsname}
  }{}
}
\forcsvlist{\tf@reconfigurefontoption}{rm,sf,tt,math,symbols,textfigures}

% Shared fontencoding, inputencoding, textcomp, cmap options validation
% routine. Apologies for the jabberwocky code -- it was this or repeat
% the entire block several times.
\newcommand*\tf@@pkgoptionsvalidation[1]{
  % #1: fontencoding, inputencoding, textcomp or cmap
  \expandafter\def\csname tf@#1\endcsname{}
  \edef\tf@@optionstring{\csname tf@#1string\endcsname}
  \MakeUppercase{\xdef\noexpand\tf@@tmp{TF@DEFAULT#1}}
  \xdef\TF@@DEFAULTOPTION{\csname\tf@@tmp\endcsname}

  % Set (preliminary) defaultstatus depending on what the user specified
  \ifthenelse{\equal{\tf@@optionstring}{}}{
    \expandafter\def\csname tf@#1defaultstatus\endcsname{\TF@IMPLICITDEFAULT}
  }{
    \ifthenelse{\equal{\tf@@optionstring}{\TF@DEFAULT}}
     {\expandafter\def\csname tf@#1defaultstatus\endcsname{\TF@EXPLICITDEFAULT}}
     {\expandafter\def\csname tf@#1defaultstatus\endcsname{\TF@EXPLICITOTHER}}
  }

  % Ensure each suboption in option string matches an item
  % in the relevant options choices list
  \tf@newbool{tf@#1match}{false}
  \tf@newbool{tf@#1dontload}{false}
  \newcounter{tf@#1suboptionscount}
  \setcounter{tf@#1suboptionscount}{0}
  \renewcommand*\tf@@listseparator{}

  \def\tf@@innerdo##1{
    \boolfalse{tf@#1match}
    \ifthenelse{\equal{##1}{\tf@@option}}
      {\booltrue{tf@#1match}\listbreak}{}
  }

  \def\do##1{
    \ifthenelse{\equal{##1}{\TF@DONTLOAD}\OR\equal{##1}{\TF@IGNORE}}{
      \booltrue{tf@#1dontload}
      \expandafter\def\csname tf@#1\endcsname{\TF@DONTLOAD}
    }{
      \xdef\tf@@option{##1}
      \xdef\tf@@options{\csname tf@#1choices\endcsname}
      \expandafter\forcsvlist\expandafter\tf@@innerdo\expandafter{\tf@@options}
      \ifbool{tf@#1match}{
        \ifthenelse{\equal{##1}{\TF@DEFAULT}}{
          % translate user suboption \TF@DEFAULT (usually `default')
          % to appropriate value, setting default status accordingly
          \expandafter\xdef\csname tf@#1\endcsname{%
            \csname tf@#1\endcsname\tf@@listseparator\TF@@DEFAULTOPTION}
          \expandafter\xdef\csname tf@#1primary\endcsname
            {\TF@@DEFAULTOPTION}% fontenc only
          \expandafter\xdef\csname tf@#1defaultstatus\endcsname
            {\TF@EXPLICITDEFAULT}
        }{
          \expandafter\xdef\csname tf@#1\endcsname{%
            \csname tf@#1\endcsname\tf@@listseparator##1}
          \expandafter\xdef\csname tf@#1primary\endcsname{##1}% fontenc only
          \expandafter\xdef\csname tf@#1defaultstatus\endcsname
            {\TF@EXPLICITOTHER}
        }
        \renewcommand*\tf@@listseparator{,}
      }{
        \TF@PackageError{%
          Suboption `##1' in `#1=\tf@@optionstring'\MessageBreak
          is not valid. Setting `#1=\TF@@DEFAULTOPTION'}{}
        \expandafter\xdef\csname tf@#1string\endcsname{}
        \listbreak
      }
    }
    \stepcounter{tf@#1suboptionscount}
  }
  \expandafter\tf@doColonSeparatedList\expandafter{\tf@@optionstring}

  \ifthenelse{\value{tf@#1suboptionscount} > 1}{
    \expandafter\xdef\csname tf@#1defaultstatus\endcsname{\TF@EXPLICITOTHER}
  }{}

  % Option-specific error handling
  \ifthenelse{\equal{#1}{fontencoding}}{
    \ifthenelse{\boolean{tf@fontencodingdontload}
            \AND\value{tf@fontencodingsuboptionscount} > 1}{
      \TF@PackageError{%
        #1 suboptions `\TF@DONTLOAD' and `\TF@IGNORE'\MessageBreak
        do not mix with other suboptions. Package option\MessageBreak
        `#1=\tf@@optionstring' is not valid.\MessageBreak
        Setting `#1=\TF@@DEFAULTOPTION'}{}
      \expandafter\xdef\csname tf@#1string\endcsname{}
    }{}
  }{% inputencoding, textcomp and cmap options
    \ifthenelse{\value{tf@#1suboptionscount} > 1}{
      \TF@PackageError{%
        Package option `#1=\tf@@optionstring' is\MessageBreak
        not valid. `#1' does not accept multiple\MessageBreak
        suboptions. Setting `#1=\TF@@DEFAULTOPTION'}{}
      \expandafter\xdef\csname tf@#1string\endcsname{}
    }{}
  }

  \edef\tf@@optionstring{\csname tf@#1string\endcsname}
  \ifthenelse{\equal{\tf@@optionstring}{}}{
    \expandafter\xdef\csname tf@#1\endcsname{\TF@@DEFAULTOPTION}
    \expandafter\xdef\csname tf@#1primary\endcsname{\TF@@DEFAULTOPTION}
  }{}
}
\forcsvlist{\tf@@pkgoptionsvalidation}{fontencoding,inputencoding,textcomp,cmap}

% Package options validation -- fontloadorder
\xdef\tf@fontloadorder{\tf@fontloadorder:} % <-- insert guard
  \tf@ifsuboption{textfigures}{\tf@fontloadorder}{\relax}
    {\tf@replacesuboption{textfigure}{textfigures}{\tf@fontloadorder}}
  \tf@ifsuboption{symbols}{\tf@fontloadorder}{\relax}
    {\tf@replacesuboption{symbol}{symbols}{\tf@fontloadorder}}
  \tf@replacesuboption{maths}{math}{\tf@fontloadorder}
  \tf@replacesuboption{roman}{rm}{\tf@fontloadorder}
  \tf@replacesuboption{sans}{sf}{\tf@fontloadorder}
  \tf@replacesuboption{mono}{tt}{\tf@fontloadorder}
  \tf@replacesuboption{teletype}{tt}{\tf@fontloadorder}
\def\tf@stripguard#1:\@empty#2\relax{#1}    % <-- strip guard
\xdef\tf@fontloadorder{\expandafter%
  \tf@stripguard\tf@fontloadorder\@empty\relax}

\ifthenelse{\equal{\tf@fontloadorder}{\TF@DEFAULT}}
  {\xdef\tf@fontloadorder{\TF@DEFAULTFONTLOADORDER}}{} % NB, not \newcommand

% Check whether the font load order list is under or over complete
\newcommand*\tf@fontloadordercomplete[1]{
  \tf@ifsuboption{#1}{\tf@fontloadorder}{
    \tf@suboptioncount{#1}{\tf@fontloadorder}
    \ifthenelse{\thetf@suboptioncount > 1}{
      \TF@PackageError{Suboption `#1' appears more than once in\MessageBreak
                       `fontloadorder=\tf@fontloadorder'.\MessageBreak
                       Setting `fontloadorder=\TF@DEFAULT'}{}
      \xdef\tf@fontloadorder{\TF@DEFAULTFONTLOADORDER} % NB, not \newcommand!
    }{}
  }{
    \TF@PackageError{Suboption `#1' missing in package option\MessageBreak
                     `fontloadorder=\tf@fontloadorder'.\MessageBreak
                     Setting `fontloadorder=\TF@DEFAULT'}{}
    \xdef\tf@fontloadorder{\TF@DEFAULTFONTLOADORDER} % NB, not \newcommand!
  }
}
\forcsvlist{\tf@fontloadordercomplete}{rm,sf,tt,math,symbols,textfigures}

% check for typos, weird entries in the font order list
\renewcommand*\do[1]{  % see etoolbox package docs
  \ifthenelse{\NOT\equal{#1}{textfigures}
          \AND\NOT\equal{#1}{symbols}
          \AND\NOT\equal{#1}{math}
          \AND\NOT\equal{#1}{rm}
          \AND\NOT\equal{#1}{sf}
          \AND\NOT\equal{#1}{tt}}{
    \TF@PackageError{Unexpected suboption `#1' in package option\MessageBreak
                   `fontloadorder=\tf@fontloadorder'.\MessageBreak
                   Setting `fontloadorder=\TF@DEFAULT'}{}
  }{}
}
\expandafter\tf@doColonSeparatedList\expandafter{\tf@fontloadorder}

% Package options validation -- cmap
% -- cmap accepts a faux option which, after validation, we can now remove
\tf@replacesuboption{noresetfonts}{}{\tf@cmap}

% Load and process auxiliary file
% ===============================

% Ensure our auxiliary parameters have not been pre-defined...
\tf@undefinecommands{
  \tf@aux@fontencoding,
  \tf@aux@inputencoding,
  \tf@aux@textcomp,
  \tf@aux@cmap,
  \tf@aux@rmfontname,
  \tf@aux@sffontname,
  \tf@aux@ttfontname,
  \tf@aux@mathfontname,
  \tf@aux@symbolsfontname,
  \tf@aux@textfiguresfontname,
  \tf@aux@sfscalefactor,
  \tf@aux@ttscalefactor,
  \tf@aux@mathscalefactor,
  \tf@aux@textfiguresscalefactor,
  \tf@aux@textfiguresspacing,
}

% ... read them from our aux file if defined there ...
\InputIfFileExists{\TF@AUXFILENAME}
  {\TF@PackageDebugInfo{Loading auxiliary file `\TF@AUXFILENAME'...}}
  {\TF@PackageDebugInfo{Could not locate auxiliary file `\TF@AUXFILENAME'}}

% ... or define them safely if they are not
\providecommand*\tf@aux@fontencoding{}
\providecommand*\tf@aux@inputencoding{}
\providecommand*\tf@aux@textcomp{}
\providecommand*\tf@aux@cmap{}

\providecommand*\tf@aux@rmfontname{}
\providecommand*\tf@aux@sffontname{}
\providecommand*\tf@aux@ttfontname{}
\providecommand*\tf@aux@mathfontname{}
\providecommand*\tf@aux@symbolsfontname{}
\providecommand*\tf@aux@textfiguresfontname{}

\providecommand*\tf@aux@sfscalefactor{}
\providecommand*\tf@aux@ttscalefactor{}
\providecommand*\tf@aux@mathscalefactor{}
\providecommand*\tf@aux@textfiguresscalefactor{}
\providecommand*\tf@aux@textfiguresspacing{}

%--- Begin rebuilding the aux file anew ---------------------------------------
\tf@writeauxfile{\string\relax} % reset aux file contents
\tf@writeauxfile{\string\ProvidesFile{\TF@AUXFILENAME}[<\TF@PACKAGENAME package auxiliary file>]}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@fontencoding{\tf@fontencoding}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@inputencoding{\tf@inputencoding}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@textcomp{\tf@textcomp}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@cmap{\tf@cmap}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@rmfontname{\tf@rmfontname}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@sffontname{\tf@sffontname}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@ttfontname{\tf@ttfontname}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@mathfontname{\tf@mathfontname}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@symbolsfontname{\tf@symbolsfontname}}
\tf@writeauxfile{\string\newcommand*\string\tf@aux@textfiguresfontname{\tf@textfiguresfontname}}
%------------------------------------------------------------------------------

% Shared typeface loading commands
% ================================
\TF@PackageDebugInfo{Configuring shared typeface load commands...}

% Some fonts may be called on by multiple typeface loading commands. In
% these cases, common code is factored out to assist font load management
% and to reduce code duplication.

%------------------------------------------------------------------------------
% NB, because they contain shared/refactored code, many (if not most) of
% these commands ignore user-specified changes in fontloadorder.
%------------------------------------------------------------------------------

% Adobe Minion Pro -- shared code
%--------------------------------
\newcommand*\tf@mp@printname{Adobe Minion Pro}
\tf@newbool{tf@mp@implicitmathnums}{true}

% Minion Pro load helper command
\newcommand*\tf@mp@processoptions[1]{
  % #1 is either \tf@rmfontoptions or \tf@mathfontoptions
  \tf@ifsuboption{smallfamily}{#1}
    {\PassOptionsToPackage{smallfamily}{MinionPro}}{}
  \tf@ifsuboption{medfamily}{#1}
    {\PassOptionsToPackage{medfamily}{MinionPro}}{}
  \tf@ifsuboption{fullfamily}{#1}
    {\PassOptionsToPackage{fullfamily}{MinionPro}}{}
  \tf@ifsuboption{noopticals}{#1}
    {\PassOptionsToPackage{noopticals}{MinionPro}}{}
  \tf@ifsuboption{opticals}{#1}
    {\PassOptionsToPackage{opticals}{MinionPro}}{}
  \tf@ifsuboption{slides}{#1}
    {\PassOptionsToPackage{slides}{MinionPro}}{}
  \tf@ifsuboption{normalsize}{#1}
    {\PassOptionsToPackage{normalsize}{MinionPro}}{}
  \tf@ifsuboption{nonormalsize}{#1}
    {\PassOptionsToPackage{nonormalsize}{MinionPro}}{}

  \ifthenelse{\equal{\tf@mathfont}{adobeminionpro}}{
    \def\tf@@configurempoptions##1{
      \tf@ifsuboption{##1}{\tf@mathfontoptions}{
        \PassOptionsToPackage{mathlf}{MinionPro}
        \boolfalse{tf@mp@implicitmathnums}
      }{}
    }
    \forcsvlist{\tf@@configurempoptions}
      {lf,lsf,lining,liningstyle,liningstylefigures,mathlf}

    \def\tf@@configurempoptions##1{
      \tf@ifsuboption{##1}{\tf@mathfontoptions}{
        \PassOptionsToPackage{mathosf}{MinionPro}
        \boolfalse{tf@mp@implicitmathnums}
      }{}
    }
    \forcsvlist{\tf@@configurempoptions}
      {osf,oldstyle,oldfigures,oldstylefigures,mathosf}
  }{}
  % unlike math where we allow many lf/osf aliases for configuring
  % math figures, we only allow `mathlf' or `mathosf' in rm
  % options to configure math figures
  \ifthenelse{\equal{\tf@rmfont}{adobeminionpro}}{
    \tf@ifsuboption{mathlf}{\tf@rmfontoptions}{
      \PassOptionsToPackage{mathlf}{MinionPro}
      \boolfalse{tf@mp@implicitmathnums}}{}
    \tf@ifsuboption{mathosf}{\tf@rmfontoptions}{
      \PassOptionsToPackage{mathosf}{MinionPro}
      \boolfalse{tf@mp@implicitmathnums}}{}
  }{}
  \ifbool{tf@mp@implicitmathnums}{
    \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@LF}}
      {\PassOptionsToPackage{mathlf}{MinionPro}}
      {\PassOptionsToPackage{mathosf}{MinionPro}}
  }{}

  \tf@ifsuboption{mathtabular}{#1}
    {\PassOptionsToPackage{mathtabular}{MinionPro}}{}
  \tf@ifsuboption{mnsy}{#1}
    {\PassOptionsToPackage{mnsy}{MinionPro}}{}
  \tf@ifsuboption{cmsy}{#1}
    {\PassOptionsToPackage{cmsy}{MinionPro}}{}
  \tf@ifsuboption{swash}{#1}
    {\PassOptionsToPackage{swash}{MinionPro}}{}
  \tf@ifsuboption{abx}{#1}
    {\PassOptionsToPackage{abx}{MinionPro}}{}
  \tf@ifsuboption{amsbb}{#1}
    {\PassOptionsToPackage{amsbb}{MinionPro}}{}
  \tf@ifsuboption{fourierbb}{#1}
    {\PassOptionsToPackage{fourierbb}{MinionPro}}{}
  \tf@ifsuboption{lucidabb}{#1}
    {\PassOptionsToPackage{lucidabb}{MinionPro}}{}
  \tf@ifsuboption{mixedgreek}{#1}
    {\PassOptionsToPackage{mixedgreek}{MinionPro}}{}
  \tf@ifsuboption{italicgreek}{#1}
    {\PassOptionsToPackage{italicgreek}{MinionPro}}{}
  \tf@ifsuboption{frenchmath}{#1}
    {\PassOptionsToPackage{frenchmath}{MinionPro}}{}
  \tf@ifsuboption{minionint}{#1}
    {\PassOptionsToPackage{minionint}{MinionPro}}{}
  \tf@ifsuboption{openg}{#1}
    {\PassOptionsToPackage{openg}{MinionPro}}{}
  \tf@ifsuboption{loosequotes}{#1}
    {\PassOptionsToPackage{loosequotes}{MinionPro}}{}
  \tf@ifsuboption{footnotefigures}{#1}
    {\PassOptionsToPackage{footnotefigures}{MinionPro}}{}
}

\newcommand*\tf@loadadobeminionpro{
  \providebool{tf@adobeminionproloaded}
  \ifbool{tf@adobeminionproloaded}{\relax}{
    \booltrue{tf@adobeminionproloaded}
    \ifthenelse{\equal{\tf@rmfont}{adobeminionpro}}{
      \tf@mp@processoptions{\tf@rmfontoptions}
      \ifthenelse{\equal{\tf@mathfont}{adobeminionpro}
               \OR\equal{\tf@mathfont}{\TF@DEFAULT}}{
        \renewcommand*\tf@mathprintname{\tf@mp@printname}
      }{
        \PassOptionsToPackage{onlytext}{MinionPro}
      }
      \renewcommand*\tf@rmprintname{\tf@mp@printname}
    }{}

    \ifthenelse{\equal{\tf@mathfont}{adobeminionpro}}{
      \tf@mp@processoptions{\tf@mathfontoptions}
      \ifthenelse{\equal{\tf@rmfont}{adobeminionpro}
               \OR\equal{\tf@rmfont}{\TF@DEFAULT}}{
        \renewcommand*\tf@rmprintname{\tf@mp@printname}
      }{
        \PassOptionsToPackage{onlymath}{MinionPro}
      }
      \renewcommand*\tf@mathprintname{\tf@mp@printname}
      \renewcommand*\tf@symbolsprintname{MnSymbol}
    }{}

    \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@LF}}{
      \PassOptionsToPackage{textlf}{MinionPro}
    }{
      \PassOptionsToPackage{textosf}{MinionPro}
      \renewenvironment{liningnums}{%
        \ifbool{tf@debug}{%
          \color{\TF@DEBUG@COLOUR@LININGNUMS}%
        }{}%
        \booltrue{tf@liningnums}%
        \figureversion{lining}%  % Adobe Minion Pro specific command
      }{%
        \boolfalse{tf@liningnums}% these lines are unnecessary,
        \figureversion{text}%    % but let's be explicit anyway
      }
    }

    \let\oldoldstylenums\oldstylenums  % before MinionPro hijacks this
    \tf@usefontpackage{MinionPro}
    \ifthenelse{\NOT\equal{\tf@rmprintname}{\tf@mp@printname}}{
      % restore the hijacking if rm font is neither adobeminionpro nor default
      \let\oldstylenums\oldoldstylenums
    }{}
    % Sidestep a pesky message from fontaxes, a package loaded by MinionPro.
    % This message is generated whenever fontaxes tries to manage fonts that
    % don't provide all the features that it requires -- in general, almost
    % any font. In these cases, fontaxes will complain (a lot) that "I don't
    % know how to decode family `X' on input line...", where (in our case) X
    % is either \rmdefault (resp. \sfdefault, \ttdefault) or \tf@substosffont,
    % our text figures substitute font.  Note that the name of the fontaxes
    % warning command depends on whether fontaxes has been installed via
    % MinionPro package installation (\fa@warn@undecodable) or via a more
    % recent fontaxes package update (\fontaxes@warn@undecodable).
    \@ifpackageloaded{fontaxes}{
      \ifdef{\fa@warn@undecodable}{
        \renewcommand*\fa@warn@undecodable[1]{}
        \TF@PackageInfoNoLine{Silenced fontaxes command %
                              \string\fa@warn@undecodable}
      }{}
      \ifdef{\fontaxes@warn@undecodable}{
        \renewcommand*\fontaxes@warn@undecodable[1]{}
        \TF@PackageInfoNoLine{Silenced fontaxes command %
                              \string\fontaxes@warn@undecodable}
      }{}
    }{}
  }
}

% Antykwa Torunska -- shared code
%--------------------------------
\newcommand*\tf@at@processoptions[1]{
  % #1 is either \tf@rmfontoptions or \tf@mathfontoptions
  \tf@ifsuboption{mathnoalias}{#1}{
    \PassOptionsToPackage{mathnoalias}{anttor}}{}
  \tf@ifsuboption{light}{#1}{
    \PassOptionsToPackage{light}{anttor}
    \booltrue{tf@at@light}}{}
  \tf@ifsuboption{condensed}{#1}{
    \PassOptionsToPackage{condensed}{anttor}
    \booltrue{tf@at@condensed}}{}
}

\newcommand*\tf@loadantykwatorunska{
  \providebool{tf@antykwatorunskaloaded}
  \ifbool{tf@antykwatorunskaloaded}{\relax}{
    \booltrue{tf@antykwatorunskaloaded}
    \newcommand*\tf@at@printname{Antykwa Toru\'nska}
    \tf@newbool{tf@at@light}{false}
    \tf@newbool{tf@at@condensed}{false}

    \ifthenelse{\equal{\tf@rmfont}{antykwatorunska}
             \OR\equal{\tf@rmfont}{\TF@DEFAULT}}{
      \tf@at@processoptions{\tf@rmfontoptions}
      \renewcommand*\tf@rmprintname{\tf@at@printname}
      \renewcommand\oldstylenums[1]{{\scshape ##1}}
      \tf@SCencodedosf
    }{}
    \ifthenelse{\equal{\tf@mathfont}{antykwatorunska}
             \OR\equal{\tf@mathfont}{\TF@DEFAULT}}{
      \tf@at@processoptions{\tf@mathfontoptions}
      \PassOptionsToPackage{math}{anttor}
      \renewcommand*\tf@mathprintname{\tf@at@printname}
    }{}

    \tf@usefontpackage{anttor}

    \newcommand*\tf@at@subprintname{}
    \ifbool{tf@at@light}
      {\edef\tf@at@subprintname{\tf@at@subprintname\space Light}}{}
    \ifbool{tf@at@condensed}
      {\edef\tf@at@subprintname{\tf@at@subprintname\space Condensed}}{}
    \ifthenelse{\equal{\tf@rmprintname}{\tf@at@printname}}
      {\xdef\tf@rmprintname{\tf@rmprintname\tf@at@subprintname}}{}
    \ifthenelse{\equal{\tf@mathprintname}{\tf@at@printname}}
      {\xdef\tf@mathprintname{\tf@mathprintname\tf@at@subprintname}}{}
  }
}

% CM Bright -- shared code
%-------------------------
% CM Bright is a raster rather than an outline (scalable) font unless the
% hfbright remappings of cmbright have been installed at the user's site.
\newcommand*\tf@loadcmbright{
  % Load math/rm/sf/tt CM Bright as applicable, additionally loading
  % rm/sf/tt (but not math) if any of these happen to be default
  \providebool{tf@cmbrightloaded}
  \ifbool{tf@cmbrightloaded}{\relax}{
    \booltrue{tf@cmbrightloaded}
    \ifthenelse{\equal{\tf@mathfont}{cmbright}}{
      \tf@ifsuboption{slantedGreek}{\tf@mathfontoptions}{
        \PassOptionsToPackage{slantedGreek}{cmbright}}{}
      \tf@ifsuboption{standard-baselineskips}{\tf@mathfontoptions}{
        \PassOptionsToPackage{standard-baselineskips}{cmbright}}{}
      \tf@usefontpackage{cmbright}
      \tf@mathfont@cmbright  % housekeeping, e.g., sets math print name
    }{}
    \ifthenelse{\equal{\tf@rmfont}{cmbright}\OR\equal{\tf@rmfont}{\TF@DEFAULT}}{
      \renewcommand*\rmdefault{cmbr}
      \tf@TSencodedosf
      \tf@rmfont@cmbright    % housekeeping, e.g., sets rm print name
    }{}
    \ifthenelse{\equal{\tf@sffont}{cmbright}\OR\equal{\tf@sffont}{\TF@DEFAULT}}{
      \renewcommand*\sfdefault{cmbr}
      \tf@sffont@cmbright    % housekeeping, e.g., sets sf print name
    }{}
    \ifthenelse{\equal{\tf@ttfont}{cmbright}\OR\equal{\tf@ttfont}{\TF@DEFAULT}}{
      \renewcommand*\ttdefault{cmtl}
      \tf@ttfont@cmbright    % housekeeping, e.g., sets tt print name
    }{}
  }
}

% Concrete -- shared code
%------------------------
% Math - Concrete.  NB, concrete math is a bitmap font. Likewise
% concrete roman with OT1 fontencoding; T1 fontencoding loads
% cm-super outline fonts instead.
\newcommand*\tf@loadconcrete{
  % Load math/rm concrete as applicable, additionally loading
  % rm if user option typeface (rm) is set to \TF@DEFAULT
  \providebool{tf@concreteloaded}
  \ifbool{tf@concreteloaded}{\relax}{
    \booltrue{tf@concreteloaded}
    \ifthenelse{\equal{\tf@mathfont}{concrete}}{
      \tf@ifsuboption{exscale}{\tf@mathfontoptions}
        {\PassOptionsToPackage{exscale}{concmath}}{}
      \tf@ifsuboption{amsfonts}{\tf@mathfontoptions}
        {\PassOptionsToPackage{amsfonts}{concmath}}{}
      \tf@ifsuboption{amssymb}{\tf@mathfontoptions}
        {\PassOptionsToPackage{amssymb}{concmath}}{}
      % The documentation discusses `sansbold' option; the style file only
      % accepts `boldsans'. Might as well make things easy for end users.
      \tf@ifsuboption{sansbold}{\tf@mathfontoptions}
        {\PassOptionsToPackage{boldsans}{concmath}}{}
      \tf@ifsuboption{boldsans}{\tf@mathfontoptions}
        {\PassOptionsToPackage{boldsans}{concmath}}{}
      \tf@usefontpackage{concmath}  % preferable to ccfonts
      \tf@mathfont@concrete  % housekeeping, e.g., sets math print name
    }{}
    \ifthenelse{\equal{\tf@rmfont}{concrete}\OR\equal{\tf@rmfont}{\TF@DEFAULT}}{
      \renewcommand*\rmdefault{ccr}
      \tf@TSencodedosf
      \tf@rmfont@concrete    % housekeeping, e.g., sets rm print name
    }{}
  }
}

% Kepler Project fonts -- shared code
%------------------------------------
\newcommand*\tf@loadkpfonts{
  \providebool{tf@kpfontsloaded}
  \ifbool{tf@kpfontsloaded}{\relax}{
    \booltrue{tf@kpfontsloaded}
    \edef\tf@@lfn{jkp}  % lining figures fontname: jkp[l,x][k][f]

    \tf@newbool{tf@@kprm}{false}
    \tf@newbool{tf@@kpmath}{false}
    \ifthenelse{\equal{\tf@rmfont}{kpfonts}}{\booltrue{tf@@kprm}}{}
    \ifthenelse{\equal{\tf@mathfont}{kpfonts}}{\booltrue{tf@@kpmath}}{}
    \ifthenelse{\boolean{tf@@kprm}\AND\equal{\tf@mathfont}{\TF@DEFAULT}}
      {\booltrue{tf@@kpmath}}{}
    \ifthenelse{\boolean{tf@@kpmath}\AND\equal{\tf@rmfont}{\TF@DEFAULT}}
      {\booltrue{tf@@kprm}}{}

    \ifthenelse{\boolean{tf@@kprm}}
      {\renewcommand*\tf@rmprintname{KP Fonts}}{}
    \ifthenelse{\boolean{tf@@kpmath}}
      {\renewcommand*\tf@mathprintname{KP Fonts}}{}

    \ifthenelse{\boolean{tf@@kprm}\AND\NOT\boolean{tf@@kpmath}}
      {\PassOptionsToPackage{nomath}{kpfonts}}{}
    \ifthenelse{\boolean{tf@@kpmath}\AND\NOT\boolean{tf@@kprm}}
      {\PassOptionsToPackage{notext}{kpfonts}}{}

    \ifbool{tf@@kprm}{
      \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
        \PassOptionsToPackage{oldstylenums}{kpfonts}
        \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{
          \PassOptionsToPackage{oldstylenumsmath}{kpfonts}
        }{}
      }{}
      \tf@ifsuboption{oldstyle}{\tf@rmfontoptions}{
        \PassOptionsToPackage{oldstyle}{kpfonts}
      }{
        \tf@ifsuboption{veryoldstyle}{\tf@rmfontoptions}{
          \PassOptionsToPackage{veryoldstyle}{kpfonts}
        }{}
      }
      % NB, rmx trumps light in the kpfonts package. Also note
      % that rmx might not be available under all installs.
      \tf@ifsuboption{rmx}{\tf@rmfontoptions}{
        \PassOptionsToPackage{rmx}{kpfonts}
        \edef\tf@@lfn{\tf@@lfn x}
      }{}
      \tf@ifsuboption{light}{\tf@rmfontoptions}{
        \PassOptionsToPackage{lighttext}{kpfonts}
        \edef\tf@@lfn{\tf@@lfn l}
        \xdef\tf@rmprintname{\tf@rmprintname\ Light}
      }{
        \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{
          \tf@ifsuboption{light}{\tf@mathfontoptions}{
            \PassOptionsToPackage{lighttext}{kpfonts}
            \edef\tf@@lfn{\tf@@lfn l}
            \xdef\tf@rmprintname{\tf@rmprintname\ Light}
          }{}
        }{}
      }
      \tf@ifsuboption{largesmallcaps}{\tf@rmfontoptions}{
        \PassOptionsToPackage{largesmallcaps}{kpfonts}
        \edef\tf@@lfn{\tf@@lfn k}
      }{}
      \tf@ifsuboption{nofligatures}{\tf@rmfontoptions}{
        \PassOptionsToPackage{nofligatures}{kpfonts}
        \edef\tf@@lfn{\tf@@lfn f}
      }{}
      \tf@ifsuboption{easyscsl}{\tf@rmfontoptions}{
        \PassOptionsToPackage{easyscsl}{kpfonts}
      }{}
    }{}

    \ifbool{tf@@kpmath}{
      \tf@ifsuboption{light}{\tf@mathfontoptions}{
        \PassOptionsToPackage{lightmath}{kpfonts}
        \xdef\tf@mathprintname{\tf@mathprintname\ Light}
      }{
        \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{
          \tf@ifsuboption{light}{\tf@rmfontoptions}{
            \PassOptionsToPackage{lightmath}{kpfonts}
            \xdef\tf@mathprintname{\tf@mathprintname\ Light}
          }{}
        }{}
      }
      \def\tf@@configurekpoptions##1{
        \tf@ifsuboption{##1}{\tf@mathfontoptions}{
          \PassOptionsToPackage{oldstylenumsmath}{kpfonts}
        }{}
      }
      \forcsvlist{\tf@@configurekpoptions}
        {osf,oldstyle,oldfigures,oldstylefigures,oldstylenums,oldstylenumsmath}
      \@ifpackageloaded{amsmath}{
        \PassOptionsToPackage{noamsmath}{kpfonts}}{}
      \tf@ifsuboption{noamsmath}{\tf@mathfontoptions}{
        \PassOptionsToPackage{noamsmath}{kpfonts}}{}
      \tf@ifsuboption{sfmath}{\tf@mathfontoptions}{
        \PassOptionsToPackage{sfmath}{kpfonts}}{}
      \tf@ifsuboption{sfmathbb}{\tf@mathfontoptions}{
        \PassOptionsToPackage{sfmathbb}{kpfonts}}{}
      \tf@ifsuboption{rmmathbb}{\tf@mathfontoptions}{
        \PassOptionsToPackage{rmmathbb}{kpfonts}}{}
      \tf@ifsuboption{nomathscript}{\tf@mathfontoptions}{
        \PassOptionsToPackage{nomathscript}{kpfonts}}{}
      \tf@ifsuboption{mathcalasscript}{\tf@mathfontoptions}{
        \PassOptionsToPackage{mathcalasscript}{kpfonts}}{}
      \tf@ifsuboption{classicReIm}{\tf@mathfontoptions}{
        \PassOptionsToPackage{classicReIm}{kpfonts}}{}
      \tf@ifsuboption{uprightRoman}{\tf@mathfontoptions}{
        \PassOptionsToPackage{uprightRoman}{kpfonts}}{}
      \tf@ifsuboption{frenchstyle}{\tf@mathfontoptions}{
        \PassOptionsToPackage{frenchstyle}{kpfonts}}{}
      \tf@ifsuboption{upright}{\tf@mathfontoptions}{
        \PassOptionsToPackage{upright}{kpfonts}}{}
      \tf@ifsuboption{oldstylenumsmath}{\tf@mathfontoptions}{
        \PassOptionsToPackage{oldstylenumsmath}{kpfonts}}{}
      \tf@ifsuboption{oldstylemath}{\tf@mathfontoptions}{
        \PassOptionsToPackage{oldstylemath}{kpfonts}}{}
      \tf@ifsuboption{veryoldstylemath}{\tf@mathfontoptions}{
        \PassOptionsToPackage{veryoldstylemath}{kpfonts}}{}
      \tf@ifsuboption{narrowiints}{\tf@mathfontoptions}{
        \PassOptionsToPackage{narrowiints}{kpfonts}}{}
      \tf@ifsuboption{partialup}{\tf@mathfontoptions}{
        \PassOptionsToPackage{partialup}{kpfonts}}{}
      \tf@ifsuboption{widermath}{\tf@mathfontoptions}{
        \PassOptionsToPackage{widermath}{kpfonts}}{}
      \tf@ifsuboption{noDcommand}{\tf@mathfontoptions}{
        \PassOptionsToPackage{noDcommand}{kpfonts}}{}
      \tf@ifsuboption{intlimits}{\tf@mathfontoptions}{
        \PassOptionsToPackage{intlimits}{kpfonts}}{}
      \tf@ifsuboption{nointlimits}{\tf@mathfontoptions}{
        \PassOptionsToPackage{nointlimits}{kpfonts}}{}
      \tf@ifsuboption{fullintlimits}{\tf@mathfontoptions}{
        \PassOptionsToPackage{fullintlimits}{kpfonts}}{}
      \tf@ifsuboption{sumlimits}{\tf@mathfontoptions}{
        \PassOptionsToPackage{sumlimits}{kpfonts}}{}
      \tf@ifsuboption{nosumlimits}{\tf@mathfontoptions}{
        \PassOptionsToPackage{nosumlimits}{kpfonts}}{}
      \tf@ifsuboption{fullsumlimits}{\tf@mathfontoptions}{
        \PassOptionsToPackage{fullsumlimits}{kpfonts}}{}
      \tf@ifsuboption{uprightgreeks}{\tf@mathfontoptions}{
        \PassOptionsToPackage{uprightgreeks}{kpfonts}}{}
      \tf@ifsuboption{slantedGreeks}{\tf@mathfontoptions}{
        \PassOptionsToPackage{slantedGreeks}{kpfonts}}{}
    }{}

    \ifthenelse{\boolean{tf@@kprm}\AND\equal{\tf@sffont}{\TF@DEFAULT}}
      {\renewcommand*\tf@sfprintname{KP Fonts}}
      {\PassOptionsToPackage{nosf}{kpfonts}}

    \ifthenelse{\boolean{tf@@kprm}\AND\equal{\tf@ttfont}{\TF@DEFAULT}}
      {\renewcommand*\tf@ttprintname{KP Fonts}}
      {\PassOptionsToPackage{nott}{kpfonts}}

    \tf@usefontpackage[notextcomp]{kpfonts}
    \tf@define@liningfigures{\tf@@lfn}
  }
}

% Lucida Bright fonts -- shared code
% (TODO: switch for lucimatx package if some kind soul could give me a copy)   % <-- TODO
%---------------------------------------------------------------------------
\tf@newbool{tf@@lbrm}{false}
\tf@newbool{tf@@lbmath}{false}
\tf@newbool{tf@@lbseriftt}{false}

\newcommand*\tf@@loadlucidabrtextwithoutmath{
  % Note: no attempt is made to check for incompatible user options here
  \renewcommand*\rmdefault{hlh}
  \tf@ifsuboption{casual}{\tf@rmfontoptions}{\renewcommand*\rmdefault{hlcn}}{}
  \tf@ifsuboption{fax}{\tf@rmfontoptions}{\renewcommand*\rmdefault{hlx}}{}
  \tf@ifsuboption{seriftt}{\tf@rmfontoptions}{\booltrue{tf@@lbseriftt}}{}

  \def\tf@@lbscale{lucidascale}
  \tf@ifsuboption{nolucidascale}{\tf@rmfontoptions}
    {\def\tf@@lbscale{nolucidascale}}{}
  \tf@ifsuboption{lucidasmallscale}{\tf@rmfontoptions}
    {\def\tf@@lbscale{lucidasmallscale}}{}

  \ifthenelse{\equal{\tf@@lbscale}{nolucidascale}}{% strictly redundant
    \def\DeclareLucidaFontShape##1##2##3##4##5##6{%
      \DeclareFontShape{##1}{##2}{##3}{##4}{<->##5}{##6}%
    }
  }{}

  \ifthenelse{\equal{\tf@@lbscale}{lucidascale}}{
    \def\DeclareLucidaFontShape##1##2##3##4##5##6{%
      \DeclareFontShape{##1}{##2}{##3}{##4}{%
        <-5.5>s*[1.04]##5%
        <5.5-6.5>s*[1.02]##5%
        <6.5-7.5>s*[.99]##5%
        <7.5-8.5>s*[.97]##5%
        <8.5-9.5>s*[.96]##5%
        <9.5-10.5>s*[.95]##5%
        <10.5-11.5>s*[.94]##5%
        <11.5-13>s*[.93]##5%
        <13-15.5>s*[.92]##5%
        <15.5-18.5>s*[.91]##5%
        <18.5-22.5>s*[.9]##5%
        <22.5->s*[.89]##5%
      }{##6}%
    }
  }{}

  \ifthenelse{\equal{\tf@@lbscale}{lucidasmallscale}}{
    \def\DeclareLucidaFontShape##1##2##3##4##5##6{%
      \DeclareFontShape{##1}{##2}{##3}{##4}{%
        <-5.5>s*[.98]##5%
        <5.5-6.5>s*[.96]##5%
        <6.5-7.5>s*[.94]##5%
        <7.5-8.5>s*[.92]##5%
        <8.5-9.5>s*[.91]##5%
        <9.5-10.5>s*[.9]##5%
        <10.5-11.5>s*[.89]##5%
        <11.5-13>s*[.88]##5%
        <13-15.5>s*[.87]##5%
        <15.5-18.5>s*[.86]##5%
        <18.5-22.5>s*[.85]##5%
        <22.5->s*[.84]##5%
      }{##6}%
    }
  }{}

  \normalfont
  \tf@ifsuboption{calligraphic}{\tf@rmfontoptions}{
    \DeclareFontShape\encodingdefault\rmdefault{m}{it}%
      {<->ssub*hlce/m/it}{}
  }{}

  \tf@ifsuboption{handwriting}{\tf@rmfontoptions}{
    \DeclareFontShape\encodingdefault\rmdefault{m}{it}%
      {<->ssub*hlcw/m/it}{}%
    \DeclareFontShape\encodingdefault\rmdefault{b}{it}%
      {<->ssub*hlcw/m/it}{}
  }{}

  \tf@ifsuboption{altbullet}{\tf@rmfontoptions}{
    \DeclareTextCommand\textbullet\encodingdefault%
      {\UseTextSymbol{OMS}\textbullet}
  }{}
}

\newcommand*\tf@@loadlucidabrtextwithmath{
  \@ifpackageloaded{\tf@@lbpkg}{\relax}{
    % Process options. Note that we don't care whether the user requests these
    % through rm or math suboptions -- it's all the same to us. E.g., the user
    % can request mathitalic1 in rm suboptions. Equally, no attempt is made to
    % check for incompatible user options, e.g., whether the user has
    % simultaneously specified expert and noexpert. It's up to users to do the
    % right thing (otherwise lucidabr.sty would already be coded against this
    % sort of problem).
    \def\tf@@lbprocessopt##1{
      \tf@ifsuboption{##1}{\tf@rmfontoptions}{
        \PassOptionsToPackage{##1}{\tf@@lbpkg}
      }{
        \tf@ifsuboption{##1}{\tf@mathfontoptions}{
          \PassOptionsToPackage{##1}{\tf@@lbpkg}
        }{}
      }
    }
    \ifthenelse{\boolean{tf@@lbrm}}{
      \forcsvlist{\tf@@lbprocessopt}
        {expert,noexpert,lucidascale,nolucidascale,lucidasmallscale,%
         mathitalic1,mathitalic2,mathitalic3,slantedgreek,%
         uprightgreek,vargreek,% these might, or might not, cause trouble
         noamssymbols,OT1,T1,LY1,seriftt,%
         fax,casual,calligraphic,handwriting,altbullet,%
         errorshow,warningshow,nofontinfo}
    }{
      \forcsvlist{\tf@@lbprocessopt}
        {expert,noexpert,nolucidascale,lucidascale,lucidasmallscale,%
         mathitalic1,mathitalic2,mathitalic3,slantedgreek,%
         uprightgreek,vargreek,% these might, or might not, cause trouble
         noamssymbols,OT1,T1,LY1,errorshow,warningshow,nofontinfo}
    }

    \tf@ifsuboption{seriftt}{\tf@rmfontoptions}{\booltrue{tf@@lbseriftt}}{}
    \tf@ifsuboption{seriftt}{\tf@mathfontoptions}{\booltrue{tf@@lbseriftt}}{}

    % Allow preloading amsmath (new -- not one of lucida's native package
    % options). For examples, see lucida-amsmath.pdf in lucidabr package.
    \tf@ifsuboption{amsmath}{\tf@mathfontoptions}
      {\tf@usefontpackage{amsmath}}{}

    \tf@usefontpackage{\tf@@lbpkg}
  }
}

\newcommand*\tf@loadlucidabr{
  \ifthenelse{\equal{\tf@rmfont}{lucidabright}}{\booltrue{tf@@lbrm}}{}
  \ifthenelse{\equal{\tf@mathfont}{lucidabright}}{\booltrue{tf@@lbmath}}{}
  \ifthenelse{\boolean{tf@@lbrm}\AND\equal{\tf@mathfont}{\TF@DEFAULT}}
    {\booltrue{tf@@lbmath}}{}
  \ifthenelse{\boolean{tf@@lbmath}\AND\equal{\tf@rmfont}{\TF@DEFAULT}}
    {\booltrue{tf@@lbrm}}{}

  \ifbool{tf@@lbrm}{\renewcommand*\tf@rmprintname{Lucida Bright}}{}
  \ifbool{tf@@lbmath}{\renewcommand*\tf@mathprintname{Lucida Bright}}{}

  \ifbool{tf@@lbmath}{
    \ifbool{tf@@lbrm}
      {\def\tf@@lbpkg{lucidabr}}
      {\def\tf@@lbpkg{lucbmath}}
    \tf@@loadlucidabrtextwithmath
  }{
    \tf@@loadlucidabrtextwithoutmath
  }

  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@lucidabright}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@lucidabright}{}

  \ifbool{tf@@lbrm}{\tf@TSencodedosf}{}
}

% Mathpazo (aka palatino with pazo math fonts) -- shared code
%------------------------------------------------------------
\newcommand*\tf@loadmathpazo{
  \providebool{tf@mathpazoloaded}
  \ifbool{tf@mathpazoloaded}{\relax}{
    \booltrue{tf@mathpazoloaded}

    % ward off possible clash of glyphs
    \tf@undefinecommands{\mathdollar}

    \tf@ifsuboption{slantedGreek}{\tf@mathfontoptions}
      {\PassOptionsToPackage{slantedGreek}{mathpazo}}{}
    \tf@ifsuboption{noBBpl}{\tf@mathfontoptions}
      {\PassOptionsToPackage{noBBpl}{mathpazo}}{}
    \let\oldoldstylenums\oldstylenums  % before mathpazo hijacks this
    \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@LF}}{
      \tf@usefontpackage[sc]{mathpazo}
    }{
      \tf@usefontpackage[sc,osf]{mathpazo}
      \tf@define@liningfigures{pplx}
    }
    \ifthenelse{\NOT\equal{\tf@rmfont}{palatino}
            \AND\NOT\equal{\tf@rmfont}{\TF@DEFAULT}}{
      \let\oldstylenums\oldoldstylenums
    }{}
    \tf@ifsuboption{osf}{\tf@mathfontoptions}{
      % Experimental mathpazo old style figures. Covers
      % normal and italic but not bold or bold italic.
      % Probably best to avoid.
      \DeclareSymbolFont{operators}     {OT1}{pplj}{m}{n}
      \SetSymbolFont{operators}{bold}   {OT1}{pplj}{b}{n}
      \DeclareMathAlphabet{\mathit}     {OT1}{pplj}{m}{it}
      \SetMathAlphabet{\mathit}{bold}   {OT1}{pplj}{b}{it}
    }{}
  }
}

% TX Fonts (including New TX) -- shared code
%-------------------------------------------
\newcommand*\tf@loadtxfonts{
  % Precondition: at least one of \tf@mathfont and \tf@rmfont equals `txfonts'
  \providebool{tf@txfontsloaded}
  \ifbool{tf@txfontsloaded}{\relax}{
    \booltrue{tf@txfontsloaded}

    % determine whether we should  load (standard) tx or new tx fonts
    \tf@newbool{newtxmath}{false}
    \tf@newbool{newtxtext}{false}
    \ifthenelse{\equal{\tf@mathfont}{txfonts}}{
      \tf@ifsuboption{new}{\tf@mathfontoptions}{\booltrue{newtxmath}}{}
    }{
      \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{
        \tf@ifsuboption{new}{\tf@rmfontoptions}{\booltrue{newtxmath}}{}
      }{}
    }
    \ifthenelse{\equal{\tf@rmfont}{txfonts}}{
      \tf@ifsuboption{new}{\tf@rmfontoptions}{\booltrue{newtxtext}}{}
    }{
      \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{
        \tf@ifsuboption{new}{\tf@mathfontoptions}{\booltrue{newtxtext}}{}
      }{}
    }

    \ifthenelse{\equal{\tf@mathfont}{txfonts}\OR\equal{\tf@mathfont}{\TF@DEFAULT}}{
      \ifbool{newtxmath}{
        \def\tf@@configuretxoptions##1{
          \tf@ifsuboption{##1}{\tf@mathfontoptions}{
            \PassOptionsToPackage{##1}{newtxmath}
          }{}
        }
        \forcsvlist{\tf@@configuretxoptions}{varg,libertine,cmintegrals,%
          uprightGreek,cmbraces,varbb,nosymbolsc,amssymbols,noamssymbols}
        \tf@usefontpackage{newtxmath}
      }{
        \tf@usefontpackage{txfonts}
      }
      \tf@ifsuboption{ptmxitalics}{\tf@mathfontoptions}{
        % Use ptmx font's quite differently kerned italic/slant math letters.
        % See van Bevern's discussion at:
        % http://rvb.mytanet.de/times-with-normal-mathcal-and-summation-sign.shtml
        \DeclareSymbolFont{letters}{OML}{ztmcm}{m}{it}
      }{}
    }{}

    \ifthenelse{\equal{\tf@rmfont}{txfonts}\OR\equal{\tf@rmfont}{\TF@DEFAULT}}{
      \ifbool{newtxtext}{
        \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
          \tf@usefontpackage[osf]{newtxtext}
          \tf@define@liningfigures{ntxr}
        }{\tf@usefontpackage{newtxtext}}
      }{
        \renewcommand*\rmdefault{txr}
        \tf@TSencodedosf
      }
    }{}

    \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@txfonts}{}
    \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@txfonts}{}
  }{}
}

% Text figures typeface -- unlike other typeface families, text
% figures configuration is not sensitive to font load ordering
% =============================================================
\TF@PackageDebugInfo{Configuring text figures load commands...}

% Configure textfigures method and associated values
%---------------------------------------------------
% `\tf@osf@method' resolves to one of the following values:
%   TF@OSF@LF: normal typesetting, \textstylenums command and textnums
%              environment => lining figures
%   TF@OSF@JF: normal typesetting, \textstylenums and textnums => old style
%              figures sourced from `j' family
%   TF@OSF@XF: normal typesetting => lining figures
%              \textstylenums and textnums => old style figures sourced from
%              substitute font (\tf@textfiguresfont contains the name of the
%              substitute font)
%   TF@OSF@TS: normal typesetting => lining figures
%              \textstylenums and textnums => old style figures sourced from
%              TS1 font mappings
%   TF@OSF@SC: normal typesetting => lining figures
%              \textstylenums and textnums => old style figures sourced from
%              SmallCap family
%   TF@OSF@NF: use native font -- do nothing

\newcommand*\tf@osf@method{TF@OSF@NF}

% Default -- no-op
\newtypeface{\TF@DEFAULT}{\TF@DEFAULTPRINTNAME}{textfigures}{
  \renewcommand*\tf@osf@method{\TF@OSF@NF}
}

% Lining style text figures
\newtypeface[lf,lsf,lining,liningstyle,liningstylefigures,false]
            {liningfigures}
            {Lining Style Figures}
            {textfigures}{
  \renewcommand*\tf@osf@method{\TF@OSF@LF}
}

% Old style text figures
\newtypeface[osf,oldstyle,oldfigures,oldstylefigures,true]
            {textfigures}
            {Old Style Figures}
            {textfigures}{
  \renewcommand*\tf@osf@method{\TF@OSF@JF} % \tf@osf@method is often set to
                                           % \TF@OSF@TS or \TF@OSF@SC later on
}

% Substitute OSF font name (literal) used in text figures font declarations
\newcommand*\tf@substosffont{tf@substosffont}

% \newtypeface textfigures preamble (see examples, below)
\newcommand*\tf@initialisetextfiguresfont[1]{
  % #1 is the substitute osf font encoding to use (T1 in all likelihood)
  \renewcommand*\tf@osf@method{\TF@OSF@XF}
  \newcommand*\tf@substosffontencoding{#1}
  \let\oldencodingdefault\encodingdefault
  \usepackage[\tf@substosffontencoding]{fontenc}
  \let\encodingdefault\oldencodingdefault
  \newcommand*\tf@s{}
  \scaletypeface{textfigures}{\edef\tf@s{[\tf@textfiguresscalefactor]}}
  \DeclareFontFamily{\tf@substosffontencoding}{\tf@substosffont}{}
  % Redefine \DeclareSizeFunction (restored in \newtypeface, defined
  % above). And, no, we can't apply  `s*' in \tf@s in this case.
  \let\oldDeclareSizeFunction\DeclareSizeFunction
  \DeclareSizeFunction{}{\empty@sfcnt\@font@info}
}

% Substitute OSF \DeclareFontShape helper
\newcommand*\tf@DeclareOsfFontShape[3]{
  \DeclareFontShape{\tf@substosffontencoding}{\tf@substosffont}
    {#1}{#2}{ <-> \tf@s #3}{}
}

% Adobe Minion Pro text figures
\newtypeface{adobeminionpro}{Adobe Minion Pro}{textfigures}{
  \tf@initialisetextfiguresfont{T1}

  % proportional vs tabular OSF (don't do tabular -- it would be bad!)
  \edef\tf@@mpsuffix{osf-\tf@substosffontencoding}
  \tf@ifsuboption{tabular}{\tf@textfiguresfontoptions}{
    \edef\tf@@mpsuffix{tosf-\tf@substosffontencoding}
  }{
    \tf@ifsuboption{tab}{\tf@textfiguresfontoptions}{
      \edef\tf@@mpsuffix{tosf-\tf@substosffontencoding}
    }{}
  }
  \tf@DeclareOsfFontShape{m} {n} {MinionPro-Regular-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{m} {it}{MinionPro-It-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{m} {sl}{MinionPro-It-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{m} {sc}{MinionPro-Regular-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{mb}{n} {MinionPro-Medium-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{mb}{it}{MinionPro-MediumI-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{mb}{sl}{MinionPro-MediumIt-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{b} {n} {MinionPro-Bold-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{b} {it}{MinionPro-BoldIt-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{b} {sl}{MinionPro-BoldIt-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{bx}{n} {MinionPro-Bold-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{bx}{it}{MinionPro-BoldIt-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{bx}{sl}{MinionPro-BoldIt-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{sb}{n} {MinionPro-Semibold-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{sb}{it}{MinionPro-SemiboldIt-\tf@@mpsuffix}
  \tf@DeclareOsfFontShape{sb}{sl}{MinionPro-SemiboldIt-\tf@@mpsuffix}
}

% Day Roman text figures -- here for completeness only
\newtypeface[dayrom]{dayroman}{Day Roman}{textfigures}{
  \tf@initialisetextfiguresfont{T1}
  \tf@DeclareOsfFontShape{m}{n}{dayromr8t}
}

% KP Fonts text figures
\newtypeface[kp,kepler]{kpfonts}{KP Fonts}{textfigures}{                       % TODO: condensed
  \tf@initialisetextfiguresfont{T1}
  \tf@ifsuboption{light}{\tf@textfiguresfontoptions}{
    \tf@DeclareOsfFontShape{m} {n}    {jkplosnmn8t}
    \tf@DeclareOsfFontShape{m} {it}   {jkplosnmit8t}
    \tf@DeclareOsfFontShape{m} {sl}   {jkplosnmsl8t}
    \tf@DeclareOsfFontShape{m} {sc}   {jkplosnmsc8t}
    \tf@DeclareOsfFontShape{m} {scsl} {jkplosnmscsl8t}
    \tf@DeclareOsfFontShape{b} {n}    {jkplosnbn8t}
    \tf@DeclareOsfFontShape{b} {it}   {jkplosnbit8t}
    \tf@DeclareOsfFontShape{b} {sl}   {jkplosnbsl8t}
    \tf@DeclareOsfFontShape{b} {sc}   {jkplosnbsc8t}
    \tf@DeclareOsfFontShape{b} {scsl} {jkplosnbscsl8t}
    \tf@DeclareOsfFontShape{bx}{n}    {jkplosnbxn8t}
    \tf@DeclareOsfFontShape{bx}{it}   {jkplosnbxit8t}
    \tf@DeclareOsfFontShape{bx}{sl}   {jkplosnbxsl8t}
    \tf@DeclareOsfFontShape{bx}{sc}   {jkplosnbxsc8t}
    \tf@DeclareOsfFontShape{bx}{scsl} {jkplosnbxscsl8t}
  }{
    \tf@DeclareOsfFontShape{m} {n}    {jkposnmn8t}
    \tf@DeclareOsfFontShape{m} {it}   {jkposnmit8t}
    \tf@DeclareOsfFontShape{m} {sl}   {jkposnmsl8t}
    \tf@DeclareOsfFontShape{m} {sc}   {jkposnmsc8t}
    \tf@DeclareOsfFontShape{m} {scsl} {jkposnmscsl8t}
    \tf@DeclareOsfFontShape{b} {n}    {jkposnbn8t}
    \tf@DeclareOsfFontShape{b} {it}   {jkposnbit8t}
    \tf@DeclareOsfFontShape{b} {sl}   {jkposnbsl8t}
    \tf@DeclareOsfFontShape{b} {sc}   {jkposnbsc8t}
    \tf@DeclareOsfFontShape{b} {scsl} {jkposnbscsl8t}
    \tf@DeclareOsfFontShape{bx}{n}    {jkposnbxn8t}
    \tf@DeclareOsfFontShape{bx}{it}   {jkposnbxit8t}
    \tf@DeclareOsfFontShape{bx}{sl}   {jkposnbxsl8t}
    \tf@DeclareOsfFontShape{bx}{sc}   {jkposnbxsc8t}
    \tf@DeclareOsfFontShape{bx}{scsl} {jkposnbxscsl8t}
    \tf@DeclareOsfFontShape{l} {n}    {jkplosnmn8t}
    \tf@DeclareOsfFontShape{l} {it}   {jkplosnmit8t}
    \tf@DeclareOsfFontShape{l} {sl}   {jkplosnmsl8t}
    \tf@DeclareOsfFontShape{l} {sc}   {jkplosnmsc8t}
    \tf@DeclareOsfFontShape{l} {scsl} {jkplosnmscsl8t}
    \tf@DeclareOsfFontShape{sb}{n}    {jkplosnbn8t}
    \tf@DeclareOsfFontShape{sb}{it}   {jkplosnbit8t}
    \tf@DeclareOsfFontShape{sb}{sl}   {jkplosnbsl8t}
    \tf@DeclareOsfFontShape{sb}{sc}   {jkplosnbsc8t}
    \tf@DeclareOsfFontShape{sb}{scsl} {jkplosnbscsl8t}
    \tf@DeclareOsfFontShape{sbx}{n}   {jkplosnbxn8t}
    \tf@DeclareOsfFontShape{sbx}{it}  {jkplosnbxit8t}
    \tf@DeclareOsfFontShape{sbx}{sl}  {jkplosnbxsl8t}
    \tf@DeclareOsfFontShape{sbx}{sc}  {jkplosnbxsc8t}
    \tf@DeclareOsfFontShape{sbx}{scsl}{jkplosnbxscsl8t}
  }
}

% Latin Modern text figures
\newtypeface[lm,lmodern]{latinmodern}{Latin Modern}{textfigures}{
  % This is a bit dodgy since we're referring to TS1 tables regardless of
  % our font encoding. Nevertheless, for numerals (and only numerals)
  % substitution it should work out well enough.
  \tf@initialisetextfiguresfont{T1}
  \DeclareFontShape{\tf@substosffontencoding}{\tf@substosffont}{m}{n}{
    <-5.5>    \tf@s ts1-lmr5   <5.5-6.5> \tf@s ts1-lmr6
    <6.5-7.5> \tf@s ts1-lmr7   <7.5-8.5> \tf@s ts1-lmr8
    <8.5-9.5> \tf@s ts1-lmr9   <9.5-11>  \tf@s ts1-lmr10
    <11-15>   \tf@s ts1-lmr12  <15->     \tf@s ts1-lmr17 }{}
  \DeclareFontShape{\tf@substosffontencoding}{\tf@substosffont}{m}{it}{
    <-7.5>    \tf@s ts1-lmri7  <7.5-8.5> \tf@s ts1-lmri8
    <8.5-9.5> \tf@s ts1-lmri9  <9.5-11>  \tf@s ts1-lmri10
    <11->     \tf@s ts1-lmri12 }{}
  \DeclareFontShape{\tf@substosffontencoding}{\tf@substosffont}{m}{sl}{
    <-8.5>    \tf@s ts1-lmro8  <8.5-9.5> \tf@s ts1-lmro9
    <9.5-11>  \tf@s ts1-lmro10 <11-15>   \tf@s ts1-lmro12
    <15->     \tf@s ts1-lmro17 }{}
  \tf@DeclareOsfFontShape{m}{sc}  {ts1-lmcsc10}
  \tf@DeclareOsfFontShape{m}{ui}  {ts1-lmu10}
  \tf@DeclareOsfFontShape{m}{scsl}{ts1-lmcsco10}
  \tf@DeclareOsfFontShape{b}{n}   {ts1-lmb10}
  \tf@DeclareOsfFontShape{b}{it}  {ts1-lmbo10}
  \tf@DeclareOsfFontShape{b}{sl}  {ts1-lmbo10}
  \DeclareFontShape{\tf@substosffontencoding}{\tf@substosffont}{bx}{n}{
    <-5.5>    \tf@s ts1-lmbx5  <5.5-6.5> \tf@s ts1-lmbx6
    <6.5-7.5> \tf@s ts1-lmbx7  <7.5-8.5> \tf@s ts1-lmbx8
    <8.5-9.5> \tf@s ts1-lmbx9  <9.5-11>  \tf@s ts1-lmbx10
    <11->     \tf@s ts1-lmbx12}{}
  \tf@DeclareOsfFontShape{bx}{it} {ts1-lmbxi10}
  \tf@DeclareOsfFontShape{bx}{sl} {ts1-lmbxo10}
}

% Libertine text figures -- NB, see comments with libertine (legacy) rm
\newtypeface{libertine}{Libertine}{textfigures}{
  \tf@initialisetextfiguresfont{T1}
  %---------------------------------------------------------------------
  % NOTE! read the comments next to libertine in the Roman fonts section
  %---------------------------------------------------------------------
  % ***proportional*** (not tabular) old style figures
  \tf@DeclareOsfFontShape{m}{ic}  {fxlric-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{m}{it}  {fxlri-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{m}{n}   {fxlr-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{m}{sc}  {fxlrc-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{m}{sl}  {fxlro-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{b}{ic}  {fxlbic-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{b}{it}  {fxlbi-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{b}{n}   {fxlz-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{b}{sc}  {fxlbc-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{b}{sl}  {fxlbo-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{bx}{ic} {fxlbic-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{bx}{it} {fxlbi-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{bx}{n}  {fxlz-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{bx}{sc} {fxlbc-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{bx}{sl} {fxlbo-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{d}{it}  {fxldro-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{d}{n}   {fxldr-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{d}{sc}  {fxldrc-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{d}{sl}  {fxldro-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{z}{ic}  {fxlzic-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{z}{it}  {fxlzi-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{z}{n}   {fxlz-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{z}{sc}  {fxlzc-\tf@substosffontencoding os}
  \tf@DeclareOsfFontShape{z}{sl}  {fxlzo-\tf@substosffontencoding os}
}

% Lucida Bright text figures
\newtypeface[lucidabr,lucida]{lucidabright}{Lucida Bright}{textfigures}{
  \tf@initialisetextfiguresfont{T1}
  \tf@DeclareOsfFontShape{m}{n}   {hlhr8c}
  \tf@DeclareOsfFontShape{m}{it}  {hlhri8c}
  \tf@DeclareOsfFontShape{m}{sl}  {hlhro8c}
  \tf@DeclareOsfFontShape{m}{sc}  {hlhr8c}
  \tf@DeclareOsfFontShape{b}{n}   {hlhb8c}
  \tf@DeclareOsfFontShape{b}{it}  {hlhbi8c}
  \tf@DeclareOsfFontShape{b}{sl}  {hlhbi8c}
  \tf@DeclareOsfFontShape{b}{sc}  {hlhb8c}
  \tf@DeclareOsfFontShape{bx}{n}  {hlhb8c}
  \tf@DeclareOsfFontShape{bx}{it} {hlhbi8c}
  \tf@DeclareOsfFontShape{bx}{sl} {hlhbi8c}
  \tf@DeclareOsfFontShape{bx}{sc} {hlhb8c}
}

% Palatino text figures
\newtypeface{palatino}{Palatino}{textfigures}{
  \tf@initialisetextfiguresfont{T1}
  \tf@DeclareOsfFontShape{m} {it} {pplri9d}
  \tf@DeclareOsfFontShape{m} {n}  {pplr9d}
  \tf@DeclareOsfFontShape{m} {sc} {pplrc9d}
  \tf@DeclareOsfFontShape{m} {sl} {pplri9d}
  \tf@DeclareOsfFontShape{b} {it} {pplbi9d}
  \tf@DeclareOsfFontShape{b} {n}  {pplb9d}
  \tf@DeclareOsfFontShape{b} {sl} {pplbi9d}
  \tf@DeclareOsfFontShape{bx}{it} {pplbi9d}
  \tf@DeclareOsfFontShape{bx}{n}  {pplb9d}
  \tf@DeclareOsfFontShape{bx}{sl} {pplbi9d}
}

% Times Roman text figures (txfonts)
\newtypeface{times}{Times Roman}{textfigures}{
  \tf@initialisetextfiguresfont{T1}
  \tf@DeclareOsfFontShape{m}{n}   {tcxr}
  \tf@DeclareOsfFontShape{m}{sc}  {tcxr}
  \tf@DeclareOsfFontShape{m}{sl}  {tcxsl}
  \tf@DeclareOsfFontShape{m}{it}  {tcxi}
  \tf@DeclareOsfFontShape{m}{ui}  {tcxi}
  \tf@DeclareOsfFontShape{b}{n}   {tcxb}
  \tf@DeclareOsfFontShape{b}{sc}  {tcxb}
  \tf@DeclareOsfFontShape{b}{sl}  {tcxbsl}
  \tf@DeclareOsfFontShape{b}{it}  {tcxbi}
  \tf@DeclareOsfFontShape{b}{ui}  {tcxbi}
  \tf@DeclareOsfFontShape{bx}{n}  {tcxb}
  \tf@DeclareOsfFontShape{bx}{sc} {tcxb}
  \tf@DeclareOsfFontShape{bx}{sl} {tcxbsl}
  \tf@DeclareOsfFontShape{bx}{it} {tcxbi}
  \tf@DeclareOsfFontShape{bx}{ui} {tcxbi}
}

% Symbols typeface -- highly sensitive to font load ordering, particularly
% to math -> symbols / symbols -> math font load order
% =======================================================================
\TF@PackageDebugInfo{Configuring symbols load commands...}

% Default -- no-op
\newtypeface{\TF@DEFAULT}{}{symbols}{
  \ifthenelse{\equal{\tf@symbolsprintname}{undefined}}{
    \renewcommand*\tf@symbolsprintname{\TF@DEFAULTPRINTNAME}
  }{}
}

% AMS symbols
\newtypeface[ams]{amssymb}{}{symbols}{
  \ifthenelse{\equal{\tf@rmfont}{adobeminionpro}
          \AND\equal{\tf@mathfont}{\TF@DEFAULT}}{
    \TF@PackageWarningNoLine{%
       Package option `symbolstypeface=\tf@symbolsfontname' conflicts
       \MessageBreak with option combination:\MessageBreak
       \space\space`typeface=\tf@rmfontname', and\MessageBreak
       \space\space`mathtypeface=\tf@mathfontname'.\MessageBreak
       Option `symbolstypeface=\tf@symbolsfontname' ignored}
      \renewcommand*\tf@symbolsprintname{\TF@DEFAULTPRINTNAME}
  }{
    \ifthenelse{\equal{\tf@mathfont}{adobeminionpro}
             \OR\equal{\tf@mathfont}{mathdesign}}{
      \TF@PackageWarningNoLine{%
         Package option `mathtypeface=\tf@mathfontname'\MessageBreak
         conflicts with `symbolstypeface=\tf@symbolsfontname'.\MessageBreak
         Option `symbolstypeface=\tf@symbolsfontname' ignored}
      \renewcommand*\tf@symbolsprintname{\TF@DEFAULTPRINTNAME}
    }{
      \tf@usefontpackage{amssymb}
      \renewcommand*\tf@symbolsprintname{AMS Symbols}
      \tf@ifsuboption{nofixmath}{\tf@symbolsfontoptions}{
      }{
        \usepackage{fixmath}  % Italic uppercase Greek. May be overridden by
                              % some maths packages later in the load stream
      }
    }
  }
}

% FD Symbol
\newtypeface[fd]{fdsymbol}{FD Symbol}{symbols}{
  % bypass a few commonly troublesome namespace collisions
  \tf@undefinecommands{\mid,\surd}

  \newcommand*\tf@fdopt@normalweight{Book}
  \newcommand*\tf@fdopt@boldweight{Medium}
  \newcommand*\tf@fdopt@largedelims{false}

  \tf@ifsuboption{normalweightRegular}{\tf@symbolsfontoptions}{
    \renewcommand*\tf@fdopt@normalweight{Regular}
  }{
    \tf@ifsuboption{normalweightAuto}{\tf@symbolsfontoptions}{
      \renewcommand*\tf@fdopt@normalweight{auto}
    }{}
  }

  \tf@ifsuboption{boldweightMedium}{\tf@symbolsfontoptions}{
    \renewcommand*\tf@fdopt@boldweight{Regular}
  }{
    \tf@ifsuboption{boldweightAuto}{\tf@symbolsfontoptions}{
      \renewcommand*\tf@fdopt@boldweight{auto}
    }{}
  }

  \tf@ifsuboption{largedelims}{\tf@symbolsfontoptions}{
    \renewcommand*\tf@fdopt@largedelims{true}
  }{}

  % FD Symbol loads AMS Math. Preload amsmath here to ensure
  % we can load it without package options clashes. This
  % reverses the usual symbols/math loading order.
  \ifthenelse{\equal{\tf@mathfont}{amsfonts}}{
    \tf@mathfont@amsfonts
  }{}

  \tf@usefontpackage[normalweight=\tf@fdopt@normalweight,
                     boldweight=\tf@fdopt@boldweight,
                     scale=1,
                     largedelims=\tf@fdopt@largedelims]{fdsymbol}
}

% Mathabx. Standard mathabx (ported from mf) is a bitmap/raster font, and
% therefore is not scalable out-of-the-box. Accordingly, you might see
% several font size rescaling warnings. Additionally, mathabx does not
% always play peacefully with other packages, potentially leading to
% symbol already defined issues. Still, it offers a good number of math
% symbols not easily found elsewhere.
\newtypeface[abx]{mathabx}{Math abx}{symbols}{
  \tf@usefontpackage{mathabx}
}

% Adobe Minion Pro compatible symbols
\newtypeface[mn]{mnsymbol}{MnSymbol}{symbols}{
  \tf@undefinecommands{\mathcal}

  % MnSymbol loads AMS Math and textcomp. Preload amsmath here
  % to ensure we load it without options clashes. This reverses the
  % usual symbols/math loading order.
  \ifthenelse{\equal{\tf@mathfont}{amsfonts}}{
    \tf@mathfont@amsfonts
  }{}
  % We don't provide MnSymbol cmsy and abx package calligraphic font
  % options here since they tend to be too fine grained, too unlikely
  % to produce noticeable typographic differences and too problematic
  % for ordinary users. Advanced users will almost certainly not want
  % to select these options for those same reasons.
  \tf@usefontpackage{MnSymbol}
}

% Adobe Myriad Pro compatible symbols
\newtypeface[md]{mdsymbol}{MdSymbol}{symbols}{
  \tf@ifsuboption{Regular}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{normalweight=Regular}{mdsymbol}}{}
  \tf@ifsuboption{regular}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{normalweight=Regular}{mdsymbol}}{}
  \tf@ifsuboption{Light}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{normalweight=Light}{mdsymbol}}{}
  \tf@ifsuboption{light}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{normalweight=Light}{mdsymbol}}{}
  \tf@ifsuboption{autolight}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{normalweight=autolight}{mdsymbol}}{}
  \tf@ifsuboption{autoregular}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{normalweight=autoregular}{mdsymbol}}{}

  \tf@ifsuboption{Semibold}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{boldweight=Semibold}{mdsymbol}}{}
  \tf@ifsuboption{semibold}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{boldweight=Semibold}{mdsymbol}}{}
  \tf@ifsuboption{Bold}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{boldweight=Bold}{mdsymbol}}{}
  \tf@ifsuboption{bold}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{boldweight=Bold}{mdsymbol}}{}
  \tf@ifsuboption{autosemibold}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{boldweight=autosemibold}{mdsymbol}}{}

  \tf@ifsuboption{onlysansmath}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{onlysansmath=true}{mdsymbol}}{}
  \tf@ifsuboption{retainmissing}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{retainmissing=true}{mdsymbol}}{}
  \tf@ifsuboption{largedelims}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{largedelims=true}{mdsymbol}}{}

  \tf@ifsuboption{scale}{\tf@symbolsfontoptions}
    {\PassOptionsToPackage{scale=\tf@nextsuboption}{mdsymbol}}{}

  % MdSymbol loads AMS Math. Preload amsmath here to ensure
  % we can load it without package options clashes. This
  % reverses the usual symbols/math loading order.
  \ifthenelse{\equal{\tf@mathfont}{amsfonts}}{
    \tf@mathfont@amsfonts
  }{}

  \tf@usefontpackage{mdsymbol}
}

% Math typeface -- highly sensitive to font load ordering, particularly
% to math -> symbols / symbols -> math font load order
% =====================================================================
\TF@PackageDebugInfo{Configuring math load commands...}

% Default -- no-op
\newtypeface{\TF@DEFAULT}{}{math}{
  \ifthenelse{\equal{\tf@mathprintname}{undefined}}{
    \renewcommand*\tf@mathprintname{\TF@DEFAULTPRINTNAME}
  }{}
}

% Math -- AMS Math
\newtypeface[ams,amsmath]{amsfonts}{AMS Math}{math}{
  \@ifpackageloaded{amsmath}{\relax}{
    % avoid a bunch of possible symbols namespace collisions
    \tf@undefinecommands{
      \iint,\iiint,\dddot,\ddddot,
      \overleftrightarrow,\underleftrightarrow,
      \underrightarrow,\underleftarrow,
    }
    \tf@ifsuboption{tbtags}{\tf@mathfontoptions}
      {\PassOptionsToPackage{tbtags}{amsmath}}{}
    \tf@ifsuboption{nosumlimits}{\tf@mathfontoptions}
      {\PassOptionsToPackage{nosumlimits}{amsmath}}{}
    \tf@ifsuboption{intlimits}{\tf@mathfontoptions}
      {\PassOptionsToPackage{intlimits}{amsmath}}{}
    \tf@ifsuboption{nonamelimits}{\tf@mathfontoptions}
      {\PassOptionsToPackage{nonamelimits}{amsmath}}{}
    \tf@usefontpackage{amsmath}
    }
  \tf@ifsuboption{donotfixamsmathbugs}{\tf@mathfontoptions}
    {}{\usepackage{mathtools}}
}

% Math -- Antykwa Torunska
\newtypeface[anttor,torunska]{antykwatorunska}{}{math}{
  \tf@loadantykwatorunska
}

% Math -- Arev Sans (Bitsream Vera Sans tuned for maths)
\newtypeface[arev]{arevmath}{Arev Math}{math}{
  \tf@ifsuboption{origletters}{\tf@mathfontoptions}
    {\PassOptionsToPackage{origletters}{arevmath}}{}
  \tf@ifsuboption{vara}{\tf@mathfontoptions}
    {\PassOptionsToPackage{vara}{arevmath}}{}
  \tf@ifsuboption{vari}{\tf@mathfontoptions}
    {\PassOptionsToPackage{vari}{arevmath}}{}
  \tf@ifsuboption{varI}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varI}{arevmath}}{}
  \tf@ifsuboption{varf}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varf}{arevmath}}{}
  \tf@ifsuboption{oldf}{\tf@mathfontoptions}
    {\PassOptionsToPackage{oldf}{arevmath}}{}
  \tf@ifsuboption{varl}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varl}{arevmath}}{}
  \tf@ifsuboption{varu}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varu}{arevmath}}{}
  \tf@ifsuboption{varv}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varv}{arevmath}}{}
  \tf@ifsuboption{varw}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varw}{arevmath}}{}
  \tf@ifsuboption{varGamma}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varGamma}{arevmath}}{}
  \tf@ifsuboption{varXi}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varXi}{arevmath}}{}
  \tf@ifsuboption{varPi}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varPi}{arevmath}}{}
  \tf@ifsuboption{varSigma}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varSigma}{arevmath}}{}
  \tf@ifsuboption{varPhi}{\tf@mathfontoptions}
    {\PassOptionsToPackage{varPhi}{arevmath}}{}
  \tf@usefontpackage{arevmath}
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@arevsans}{}
}

% Math -- CM Bright
\newtypeface{cmbright}{CM Bright}{math}{
  \tf@loadcmbright
}

% Math -- Concrete
\newtypeface{concrete}{Concrete Math}{math}{
  \tf@loadconcrete
}

% Math -- Euler
\newtypeface{euler}{Euler}{math}{
  \tf@ifsuboption{small}{\tf@mathfontoptions}
    {\PassOptionsToPackage{small}{eulervm}}{}
  \tf@ifsuboption{euler-digits}{\tf@mathfontoptions}
    {\PassOptionsToPackage{euler-digits}{eulervm}}{}
  \tf@ifsuboption{euler-hat-accent}{\tf@mathfontoptions}
    {\PassOptionsToPackage{euler-hat-accent}{eulervm}}{}
  \tf@ifsuboption{T1}{\tf@mathfontoptions}
    {\PassOptionsToPackage{T1}{eulervm}}{}
  \tf@ifsuboption{OT1}{\tf@mathfontoptions}
    {\PassOptionsToPackage{OT1}{eulervm}}{}
  \tf@ifsuboption{LY1}{\tf@mathfontoptions}
    {\PassOptionsToPackage{LY1}{eulervm}}{}
  \tf@ifsuboption{icomma}{\tf@mathfontoptions}
    {\PassOptionsToPackage{icomma}{eulervm}}{}
  \tf@usefontpackage{eulervm}
}

% Math -- European Modern
%------------------------
% To obtain: svn checkout files from:
%   `http://yytex.googlecode.com/svn/trunk/fonts/em'
% From there, you're on your own!  Hint: compile the .ins file.
% FYI, European Modern is a CM clone/extension. Blurb from the readme.txt:
%     "The European Modern (EM) font set consists of 57 text fonts that are
%     vastly extended versions of Computer Modern (CM) text fonts.  Each EM
%     text font contains 310 glyphs compared to the 128 in CM text fonts (of
%     which eleven are upright Greek letters).  Each EM text font has over 90
%     accented characters, including the 58 `standard' ones found in most
%     fonts in Type 1 format."
% For what it's worth, European Modern tt was used for typesetting keywords
% in The Latex Companion 2nd ed. Look there for that.
\newtypeface[em]{europeanmodern}{European Modern}{math}{
  \tf@ifsuboption{T1}{\tf@mathfontoptions}{
    \PassOptionsToPackage{T1}{em}}{}
  \tf@ifsuboption{LY1}{\tf@mathfontoptions}{
    \PassOptionsToPackage{LY1}{em}}{}
  \tf@ifsuboption{LM1}{\tf@mathfontoptions}{
    \PassOptionsToPackage{LM1}{em}}{}
  \tf@usefontpackage{em}
  \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{
    \renewcommand*\rmdefault{cmr} % remapped by em.sty
    \tf@rmfont@europeanmodern     % housekeeping, e.g., sets rm print name
  }{}
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{
    \renewcommand*\sfdefault{cmss}% remapped by em.sty
    \tf@sffont@europeanmodern     % housekeeping, e.g., sets sf print name
  }{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{
    \renewcommand*\ttdefault{cmtt}% remapped by em.sty
    \tf@ttfont@europeanmodern     % housekeeping, e.g., sets tt print name
  }{}
}

% Math -- Fourier
\newcommand*\tf@fouriermathfont{}
\newtypeface{fourier}{Fourier}{math}{
  % undefine a few problem symbols that might have
  % sneaked in via a previously loaded symbols font
  \tf@undefinecommands{\hslash,\complement,\hbar}

  \def\tf@fouriermathfont{adobeutopia}
  \ifthenelse{\equal{\tf@rmfont}{newcenturyschoolbook}}
    {\def\tf@fouriermathfont{newcenturyschoolbook}}{}
  \def\tf@@configurefourieroptions##1{
    \tf@ifsuboption{##1}{\tf@mathfontoptions}
      {\def\tf@fouriermathfont{newcenturyschoolbook}}{}
  }
  \forcsvlist{\tf@@configurefourieroptions}{nc,newcentury,newcenturyschoolbook}

  \def\tf@@configurefourieroptions##1{
    \tf@ifsuboption{##1}{\tf@mathfontoptions}
      {\def\tf@fouriermathfont{adobeutopia}}{}% not redundant if \rmdefault==nc
  }
  \forcsvlist{\tf@@configurefourieroptions}{utopia,adobeutopia}

  \def\tf@@configurefourieroptions##1{
    \tf@ifsuboption{##1}{\tf@mathfontoptions}{
      \ifthenelse{\equal{\tf@fouriermathfont}{adobeutopia}}{
        % NB, user must ensure utopia expert fonts are properly installed.
        % Otherwise LaTeX will compile but fail to construct the output file,
        % e.g., complaining about missing `put..x.pfb' font file.
        \PassOptionsToPackage{##1}{fourier}
      }{
        \TF@PackageWarningNoLine{%
          Suboption `##1' in package option\MessageBreak
          `mathtypeface=\tf@mathfontname'\MessageBreak
          will be ignored while `newcenturyschoolbook'\MessageBreak
          is in effect}
      }
    }{}
  }
  \forcsvlist{\tf@@configurefourieroptions}
    {upright,widespace,expert,oldstyle,fulloldstyle}

  \ifthenelse{\equal{\tf@fouriermathfont}{newcenturyschoolbook}}{
    \tf@usefontpackage{fouriernc}
  }{
    \tf@usefontpackage{fourier}  % loads [T1]{fontenc} and textcomp
    \renewcommand*\rmdefault{fut\textfamilyextension}
    \ifthenelse{\NOT\equal{\textfamilyextension}{s}}{
      \tf@define@liningfigures{futs} % see comment about expert fonts, above
    }{}
  }
}

% Math -- GFS Artemisia
\tf@newbool{tf@@gfsmatheuler}{false}
\newtypeface[artemisia]{gfsartemisia}{GFS Artemisia}{math}{
  % Unlike GFS Didot, GFS Artemisia does not set up math to any
  % worthwhile extent. It's only included here for completeness's sake.
  \ifthenelse{\equal{\tf@rmfont}{gfsartemisia}}{
    \tf@ifsuboption{euler}{\tf@rmfontoptions}{\booltrue{tf@@gfsmatheuler}}{}
  }{}
  \tf@ifsuboption{euler}{\tf@mathfontoptions}{\booltrue{tf@@gfsmatheuler}}{}
  \ifbool{tf@@gfsmatheuler}{
    \tf@usefontpackage{gfsartemisia-euler}
    \xdef\tf@rmprintname{\tf@mathprintname\  (Euler)}
  }{
    \tf@usefontpackage{gfsartemisia}  % math symbols from txfonts
  }
  \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{\tf@rmfont@gfsartemisia}{}
}

% Math -- GFS Bodoni
%............................................................................
% NB, if you run into problems when using T1 font encoding, replace the line:
%     \DeclareFontFamily{T1}{bodoni}     % <-- missing {}
% with:
%    \DeclareFontFamily{T1}{bodoni}{}    % <-- reinstated {}
% in file t1bodoni.fd
%............................................................................
\newtypeface[bodoni]{gfsbodoni}{GFS Bodoni}{math}{
  % Unlike GFS Didot, GFS Bodoni does not set up math to any
  % worthwhile extent. It's only included here for completeness's sake.
  \tf@usefontpackage{gfsbodoni}
  \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{\tf@rmfont@gfsbodoni}{}
}

% Math -- GFS Didot
\newtypeface[didot]{gfsdidot}{GFS Didot}{math}{
  \tf@usefontpackage{gfsdidot}
  \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{\tf@rmfont@gfsdidot}{}
}

% Math -- GFS Neohellenic
\newtypeface[neohellenic]{gfsneohellenic}{GFS Neohellenic}{math}{
  % Unlike GFS Didot, except for its oddly shaped digits, GFS
  % Neohellenic does not set up math to any worthwhile extent. It's
  % only included here for completeness's sake.
  \tf@usefontpackage{gfsneohellenic}
  \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{\tf@rmfont@gfsneohellenic}{}
}

% Math -- Iwona. NB, the Iwona package sets \rmdefault to Iwona. Specify
% another font in your typeface option if this behaviour is not desired.
\newtypeface{iwona}{Iwona}{math}{
  \newcommand*\tf@iwopt@light{}
  \newcommand*\tf@iwopt@condensed{}
  \tf@ifsuboption{light}{\tf@mathfontoptions}{
    \renewcommand*\tf@iwopt@light{light}
    \xdef\tf@mathprintname{\tf@mathprintname\ Light}
  }{}
  \tf@ifsuboption{condensed}{\tf@mathfontoptions}{
    \renewcommand*\tf@iwopt@condensed{condensed}
    \xdef\tf@mathprintname{\tf@mathprintname\ Condensed}
  }{}
  \tf@usefontpackage[math,\tf@iwopt@light,\tf@iwopt@condensed]{iwona}
}

% Math -- Kerkis
\newtypeface{kerkis}{Kerkis}{math}{
  \tf@usefontpackage{kmath}  % kmath on its own loads txfonts
  \tf@usefontpackage{kerkis} % loads kerkis serif and sans, plus courier mono
  \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{\tf@rmfont@kerkis}{}
}

% Math -- Kurier. NB, the Kurier package sets \rmdefault to Kurier. Specify
% another font in your typeface option if this behaviour is not desired.
\newtypeface{kurier}{Kurier}{math}{
  \newcommand*\tf@kropt@light{}
  \newcommand*\tf@kropt@condensed{}
  \tf@ifsuboption{light}{\tf@mathfontoptions}{
    \renewcommand*\tf@kropt@light{light}
    \xdef\tf@mathprintname{\tf@mathprintname\ Light}
  }{}
  \tf@ifsuboption{condensed}{\tf@mathfontoptions}{
    \renewcommand*\tf@kropt@condensed{condensed}
    \xdef\tf@mathprintname{\tf@mathprintname\ Condensed}
  }{}
  \tf@usefontpackage[math,\tf@kropt@light,\tf@kropt@condensed]{kurier}
}

% Math -- Kp-Fonts
\newtypeface[kp,kepler]{kpfonts}{}{math}{
  \tf@loadkpfonts
}

% Math -- Latin Modern
\newtypeface[lm,lmodern]{latinmodern}{Latin Modern}{math}{
  \tf@usefontpackage{lmodern}
}

% Bigelow and Holmes Lucida Bright (purchase from CTAN)
\newtypeface[lucidabr,lucida]{lucidabright}{Lucida Bright}{math}{
  \tf@loadlucidabr
}

% Math -- LX Fonts. Extension of Computer Modern Sans Serif Quotation mainly
% as a math enhancement for overhead slides, e.g., with beamer package.
\newtypeface[lx]{lxfonts}{LX Fonts}{math}{
  \tf@usefontpackage{lxfonts}
  \ifthenelse{\equal{\tf@symbolsfont}{\TF@DEFAULT}}{ % LX Fonts overrides some
    \renewcommand*\tf@symbolsprintname{LX Fonts}     % but not all symbols
  }{}
  \renewcommand*\tf@sfprintname{\tf@rmprintname}
  \renewcommand*\tf@ttprintname{\tf@rmprintname}% depends on font encoding T1/OT1
}

% Math Design
\newcommand*\tf@mdrmfont{}
\newtypeface{mathdesign}{Math Design}{math}{
  \tf@ifsuboption{expert}{\tf@mathfontoptions}
    {\PassOptionsToPackage{expert}{mathdesign}}{}
  \tf@ifsuboption{uppercase}{\tf@mathfontoptions}{
    \ifthenelse{\equal{\tf@nextsuboption}{upright}}
      {\PassOptionsToPackage{uppercase=upright}{mathdesign}}{}
    \ifthenelse{\equal{\tf@nextsuboption}{italicized}}
      {\PassOptionsToPackage{uppercase=italicized}{mathdesign}}{}
  }{}
  \tf@ifsuboption{greekuppercase}{\tf@mathfontoptions}{
    \ifthenelse{\equal{\tf@nextsuboption}{upright}}
      {\PassOptionsToPackage{greekuppercase=upright}{mathdesign}}{}
    \ifthenelse{\equal{\tf@nextsuboption}{italicized}}
      {\PassOptionsToPackage{greekuppercase=italicized}{mathdesign}}{}
  }{}
  \tf@ifsuboption{greeklowercase}{\tf@mathfontoptions}{
    \ifthenelse{\equal{\tf@nextsuboption}{upright}}
      {\PassOptionsToPackage{greeklowercase=upright}{mathdesign}}{}
    \ifthenelse{\equal{\tf@nextsuboption}{italicized}}
      {\PassOptionsToPackage{greeklowercase=italicized}{mathdesign}}{}
  }{}

  \def\tf@mdrmfont{charter}% default; available on all PSNFSS-compliant systems
  \ifthenelse{\equal{\tf@rmfont}{urwgaramond}}{\def\tf@mdrmfont{garamond}}{}
  \ifthenelse{\equal{\tf@rmfont}{adobeutopia}}{\def\tf@mdrmfont{utopia}}{}
  \ifthenelse{\equal{\tf@rmfont}{bitstreamcharter}}{\def\tf@mdrmfont{charter}}{}
  \tf@ifsuboption{urwgaramond}{\tf@mathfontoptions}{\def\tf@mdrmfont{garamond}}{}
  \tf@ifsuboption{garamond}{\tf@mathfontoptions}{\def\tf@mdrmfont{garamond}}{}
  \tf@ifsuboption{adobeutopia}{\tf@mathfontoptions}{\def\tf@mdrmfont{utopia}}{}
  \tf@ifsuboption{utopia}{\tf@mathfontoptions}{\def\tf@mdrmfont{utopia}}{}
  \tf@ifsuboption{bitstreamcharter}{\tf@mathfontoptions}{\def\tf@mdrmfont{charter}}{}
  \tf@ifsuboption{charter}{\tf@mathfontoptions}{\def\tf@mdrmfont{charter}}{}

  \let\oldscdefault\scdefault
  \tf@usefontpackage[\tf@mdrmfont,sfscaled=false,ttscaled=false]{mathdesign}

  % Of the three rm fonts accepted by mathdesign (charter, garamond and
  % utopia), utopia alone provides old style figures, and this only through
  % utopia's smallcaps collection (see below). However, mathdesign hijacks
  % smallcaps for its own ends. Rather than 'unhijacking' smallcaps back
  % from mathdesign, potentially upsetting anyone who relies on mathdesign's
  % smallcaps behaviour, as a design decision, we turn textnums off instead.
  %
  % NOTE: mathdesign redefines \scdefault in order to provide faked smallcaps
  %       whenever expert is not in force. This creates problems should the
  %       user load a non-mathdesign rm font. In which case, we try to
  %       recover smallcaps as best we can, noting that users should access
  %       mathdesign (maths mode) smallcaps through its \fscshape command.
  %
  % Also please note: Native URW Garamond does not provide smallcaps.
  \ifthenelse{
    \(\equal{\tf@rmfont}{urwgaramond}\AND\equal{\tf@mdrmfont}{garamond}\)\OR
    \(\equal{\tf@rmfont}{adobeutopia}\AND\equal{\tf@mdrmfont}{utopia}\)\OR
    \(\equal{\tf@rmfont}{bitstreamcharter}\AND\equal{\tf@mdrmfont}{charter}\)}
    {\TF@NativeOSFMathError}
    {\let\scdefault\oldscdefault}
}

% Math -- Mathpazo (aka palatino with pazo math fonts)
\newtypeface[pazo]{mathpazo}{Pazo}{math}{
  \tf@loadmathpazo
}

% Math -- Math Time Pro 2
% Michael Spivak's MathTime Pro2 fonts are essential should you plan on using
% Times (or Gyre Termes) body text fonts. Do not for one instant dream of
% using AMS fonts (although you may still need a symbols font, depending on
% your work, for which amssymb or mnsymbol might do). A free (Lite) subset of
% MathTime Pro2 can be downloaded from www.pctex.com (useful for those with
% limited or occasional math requirements for their work). The cost for the
% full set is not especially great compared to the benefits received.
% Trust me.
\newcommand\tf@premtpro{
  % prevent the clash of glyphs (hmm, nice name for a band)
  \tf@undefinecommands{
      \barwedge,\centerdot,\circledS,\coloneq,\complement,
      \dagger,\ddagger,\divideontimes,\dotplus,\doublebarwedge,
      \hbar,\hslash,\mathparagraph,\mathsection,\mathsterling,
      \ulcorner,\urcorner,\llcorner,\lrcorner,
      \thickapprox,\thicksim,\veebar,
  }
}

\newtypeface[mtpro]{mathtimepro}{MathTime 2 Professional}{math}{
  \tf@ifsuboption{amssymbols}{\tf@mathfontoptions}
    {\PassOptionsToPackage{amssymbols}{mtpro2}}{}
  \tf@ifsuboption{noamssymbols}{\tf@mathfontoptions}
    {\PassOptionsToPackage{noamssymbols}{mtpro2}}{}
  \tf@ifsuboption{slantedGreek}{\tf@mathfontoptions}
    {\PassOptionsToPackage{slantedGreek}{mtpro2}}{}
  \tf@ifsuboption{uprightGreek}{\tf@mathfontoptions}
    {\PassOptionsToPackage{uprightGreek}{mtpro2}}{}
  \tf@ifsuboption{slantedoperators}{\tf@mathfontoptions}
    {\PassOptionsToPackage{slantedoperators}{mtpro2}}{}
  \tf@ifsuboption{uprightoperators}{\tf@mathfontoptions}
    {\PassOptionsToPackage{uprightoperators}{mtpro2}}{}
  % Option subscriptcorrection makes the underscore character '_' active
  % which can break other packages. E.g., url typesets \url{a-b} as 'a-_b'.
  \tf@ifsuboption{subscriptcorrection}{\tf@mathfontoptions}
    {\PassOptionsToPackage{subscriptcorrection}{mtpro2}}{}
  \tf@ifsuboption{nosubscriptcorrection}{\tf@mathfontoptions}
    {\PassOptionsToPackage{nosubscriptcorrection}{mtpro2}}{}
  \tf@ifsuboption{zswash}{\tf@mathfontoptions}
    {\PassOptionsToPackage{zswash}{mtpro2}}{}
  \tf@ifsuboption{nozswash}{\tf@mathfontoptions}
    {\PassOptionsToPackage{nozswash}{mtpro2}}{}
  \tf@ifsuboption{curlybraces}{\tf@mathfontoptions}
    {\PassOptionsToPackage{curlybraces}{mtpro2}}{}
  \tf@ifsuboption{straightbraces}{\tf@mathfontoptions}
    {\PassOptionsToPackage{straightbraces}{mtpro2}}{}
  \tf@ifsuboption{morphedbraces}{\tf@mathfontoptions}
    {\PassOptionsToPackage{morphedbraces}{mtpro2}}{}
  \tf@ifsuboption{cmcal}{\tf@mathfontoptions}
    {\PassOptionsToPackage{cmcal}{mtpro2}}{}
  \tf@ifsuboption{lucidacal}{\tf@mathfontoptions}
    {\PassOptionsToPackage{lucidacal}{mtpro2}}{}
  \tf@ifsuboption{eucal}{\tf@mathfontoptions}
    {\PassOptionsToPackage{eucal}{mtpro2}}{}
  \tf@ifsuboption{mtpluscal}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpluscal}{mtpro2}}{}
  \tf@ifsuboption{mtpcal}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpcal}{mtpro2}}{}
  \tf@ifsuboption{mtpccal}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpccal}{mtpro2}}{}
  \tf@ifsuboption{lucidascr}{\tf@mathfontoptions}
    {\PassOptionsToPackage{lucidascr}{mtpro2}}{}
  \tf@ifsuboption{mtplusscr}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtplusscr}{mtpro2}}{}
  \tf@ifsuboption{mtpscr}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpscr}{mtpro2}}{}
  \tf@ifsuboption{eufrak}{\tf@mathfontoptions}
    {\PassOptionsToPackage{eufrak}{mtpro2}}{}
  \tf@ifsuboption{mtpfrak}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpfrak}{mtpro2}}{}
  \tf@ifsuboption{compatiblegreek}{\tf@mathfontoptions}
    {\PassOptionsToPackage{compatiblegreek}{mtpro2}}{}
  \tf@ifsuboption{amsbb}{\tf@mathfontoptions}
    {\PassOptionsToPackage{amsbb}{mtpro2}}{}
  \tf@ifsuboption{mtpbb}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpbb}{mtpro2}}{}
  \tf@ifsuboption{mtpbbd}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpbbd}{mtpro2}}{}
  \tf@ifsuboption{mtphrb}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtphrb}{mtpro2}}{}
  \tf@ifsuboption{mtphrd}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtphrd}{mtpro2}}{}
  \tf@ifsuboption{mtpbbi}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtpbbi}{mtpro2}}{}
  \tf@ifsuboption{mtphbi}{\tf@mathfontoptions}
    {\PassOptionsToPackage{mtphbi}{mtpro2}}{}
  \tf@ifsuboption{errorshow}{\tf@mathfontoptions}
    {\PassOptionsToPackage{errorshow}{mtpro2}}{}
  \tf@ifsuboption{warningshow}{\tf@mathfontoptions}
    {\PassOptionsToPackage{warningshow}{mtpro2}}{}
  \tf@ifsuboption{nofontinfo}{\tf@mathfontoptions}
    {\PassOptionsToPackage{nofontinfo}{mtpro2}}{}
  \tf@ifsuboption{lite}{\tf@mathfontoptions}{  % NB, 'lite', not 'light'
    \tf@premtpro
    \tf@usefontpackage[lite]{mtpro2}
    \xdef\tf@rmprintname{\tf@mathprintname\  Lite}
  }{
    \tf@undefinecommands{\Bbbk} % prevent the clash of glyphs
    \tf@premtpro
    \tf@usefontpackage[complete]{mtpro2}
  }
}

% Math -- Adobe Minion Pro
\newtypeface{adobeminionpro}{Adobe Minion Pro}{math}{
  \tf@loadadobeminionpro
}

% Math -- MathPTMX
\newtypeface[ptmx]{mathptmx}{Math PTMX}{math}{
  \tf@usefontpackage{mathptmx}
  \ifthenelse{\equal{\tf@rmfont}{\TF@DEFAULT}}{
    \tf@rmfont@times
  }{}
}

% Math -- PXFonts
\newtypeface[px]{pxfonts}{PX Fonts}{math}{
  \tf@usefontpackage{pxfonts}
}

% Math -- TXFonts
\newtypeface[tx]{txfonts}{TX Fonts}{math}{
  \tf@loadtxfonts
}

% Roman family typeface -- somewhat sensitive to font load
% ordering, particularly if loaded via font packages rather
% than by directly setting \rmdefault
% =========================================================
\TF@PackageDebugInfo{Configuring rm load commands...}

% Default -- no-op
\newtypeface{\TF@DEFAULT}{}{rm}{
  \ifthenelse{\equal{\tf@rmprintname}{undefined}}{
    \renewcommand*\tf@rmprintname{\TF@DEFAULTPRINTNAME}
    \TF@NativeOSFError
  }{}
}

% ADF Baskervald
\newtypeface[baskervald]{adfbaskervald}{ADF Baskervald}{rm}{
  \tf@ifsuboption{lig}{\tf@rmfontoptions}
    {\renewcommand*\rmdefault{ybvw}}
    {\renewcommand*\rmdefault{ybv}}
  \DeclareTextSymbol{\zeroslash}{TS1}{225}
  \DeclareTextSymbolDefault{\zeroslash}{TS1}
  \TF@NativeOSFError
  \tf@pdfglyphcorrection{Baskervald}
}

% ADF Berenis -- sets font encoding to LY1 -- might have
%                consequences for sf/tt/math typeface choices
\newtypeface[berenis]{adfberenis}{ADF Berenis}{rm}{
  \tf@ifsuboption{tab}{\tf@rmfontoptions}    % default is proportional figures
    {\PassOptionsToPackage{tab}{berenis}}{}  % otherwise, use tabular numbers
  \tf@ifsuboption{lig}{\tf@rmfontoptions}
    {\PassOptionsToPackage{lig}{berenis}}{}  % oldstyle extra ligatures
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
    \PassOptionsToPackage{osf}{berenis}
    \tf@ifsuboption{tab}{\tf@rmfontoptions}
      {\tf@define@liningfigures{ybd}}
      {\tf@define@liningfigures{ybd2}}
  }{
    \PassOptionsToPackage{lf}{berenis}
  }
  \tf@usefontpackage[lm]{berenis}
  % ADF Berenis (without lm above) loads latin modern
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@latinmodern}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@latinmodern}{}
}

% ADF Electrum
\newtypeface[electrum]{adfelectrum}{ADF Electrum}{rm}{
  \tf@ifsuboption{lig}{\tf@rmfontoptions}
    {\PassOptionsToPackage{lig}{electrum}}{} % oldstyle extra ligatures
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
    \PassOptionsToPackage{osf}{electrum}
    \tf@define@liningfigures{yes}
  }{
    \PassOptionsToPackage{lf}{electrum}
  }
  \tf@usefontpackage{electrum}
}

% ADF Romande
\newtypeface[romande]{adfromande}{ADF Romande}{rm}{
  \tf@ifsuboption{alt}{\tf@rmfontoptions}
    {\PassOptionsToPackage{alt}{romande}}{}
  \tf@usefontpackage{romande}
  \TF@NativeOSFError   % Romande's figures are a sort of hybrid LF/OSF
}

% ADF Venturis -- including ADF Venturis 2 and ADF Venturis Old
\newtypeface[venturis]{adfventuris}{ADF Venturis}{rm}{
  \tf@newbool{tf@rm@venturisii}{false}
  \tf@newbool{tf@rm@venturisold}{false}

  \tf@ifsuboption{2}{\tf@rmfontoptions}{\booltrue{tf@rm@venturisii}}{}
  \tf@ifsuboption{old}{\tf@rmfontoptions}{\booltrue{tf@rm@venturisold}}{}

  \ifthenelse{\boolean{tf@rm@venturisii}\AND\boolean{tf@rm@venturisold}}{
    \TF@PackageError{Incompatible typeface suboptions:\MessageBreak
                     \space\space`typeface=\tf@rmfontname'\MessageBreak
                     Removed `old' suboption}{}
    \renewcommand*\tf@rmfontname{\tf@rmfont:2}
    \renewcommand*\tf@rmfontoptions{2}
    \boolfalse{tf@rm@venturisold}
  }{}
  \ifthenelse{\boolean{tf@rm@venturisii}}{
    \tf@usefontpackage{venturis2}
    \renewcommand*\tf@rmprintname{ADF Venturis 2}
    \TF@NativeOSFError
    % ADF Venturis loads venturis sans
    \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@adfventuris}{}
  }{
    \ifthenelse{\boolean{tf@rm@venturisold}}{
      \tf@usefontpackage{venturisold}
      \renewcommand*\tf@rmprintname{ADF Venturis Old}
      \TF@NativeOSFError
    }{
      \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
        \tf@usefontpackage[osf]{venturis}
        \tf@define@liningfigures{yvt}
      }{
        \tf@usefontpackage[lf]{venturis}
      }
      % ADF Venturis loads venturis sans
      \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@adfventuris}{}
    }
  }
}

% Adobe Minion Pro
\newtypeface[minionpro]{adobeminionpro}{Adobe Minion Pro}{rm}{
  \tf@loadadobeminionpro
}

% Adobe Utopia
\newtypeface[utopia]{adobeutopia}{Adobe Utopia}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{mathdesign}
          \AND\equal{\tf@mdrmfont}{utopia}}{
    % \rmdefault was configured in \tf@mathfont@mathdesign
    \renewcommand*\tf@rmprintname{Math Design Utopia}
  }{
    \ifthenelse{\equal{\tf@mathfont}{fourier}
            \AND\equal{\tf@fouriermathfont}{adobeutopia}}{
      % \rmdefault was configured in \tf@mathfont@fourier
    }{
      \renewcommand*\rmdefault{put}
      \tf@SCencodedosf
    }
  }
}

% AE -- "Almost European" Computer Modern
\newtypeface{ae}{AE}{rm}{
  \tf@ifsuboption{slides}{\tf@rmfontoptions}{
    \renewcommand*\rmdefault{laess} % ``sans roman'' with slides
    \renewcommand*\tf@rmprintname{AE Sans}
  }{
    \renewcommand*\rmdefault{aer}
  }
  \tf@TSencodedosf
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@ae}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@ae}{}
}

% Antykwa Poltawskiego
\newtypeface[antpol,poltawski]{antykwapoltawski}{Antykwa P\'o\l tawskiego}{rm}{
  \tf@ifsuboption{light}{\tf@rmfontoptions}{
    \renewcommand*\rmdefault{antpl}
    \xdef\tf@rmprintname{\tf@rmprintname\ Light}
  }{
    \renewcommand*\rmdefault{antp}
  }
  \tf@SCencodedosf
}

% Antykwa Torunska
\newtypeface[anttor,torunska]{antykwatorunska}{}{rm}{
  \tf@loadantykwatorunska
}

% Augie
\newtypeface{augie}{Augie}{rm}{
  \renewcommand*\rmdefault{augie}
  \TF@NativeOSFError
}

% Auriocus Kalligraphicus -- decorative script
% Provides the fonts: Auriocus Kalligraphicus, Lukas Svatba (plus
% Amici variant) and Jana Skrivana, accessed via the \Fontauri,
% \Fontlukas, \Fontskrivan and \Fontamici commands
\newtypeface[auriocus,kalligraphicus]{auriocuskalligraphicus}
                                     {Auriocus Kalligraphicus}{rm}{
  \tf@ifsuboption{backslant}{\tf@rmfontoptions}
    {\tf@usefontpackage[backslant]{aurical}}
    {\tf@usefontpackage{aurical}}
  \TF@NativeLFError   % rare!
  \renewcommand*\rmdefault{AuriocusKalligraphicus}
}

% Bera Serif
\newtypeface[bera]{beraserif}{Bera Serif}{rm}{
  \tf@usefontpackage{beraserif}
  \TF@NativeOSFError
}

% Bitstream Charter
\newtypeface[charter]{bitstreamcharter}{Bitstream Charter}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{mathdesign}
          \AND\equal{\tf@mdrmfont}{charter}}{
    % \rmdefault was configured in \tf@mathfont@mathdesign
    \renewcommand*\tf@rmprintname{Math Design Charter}
  }{
    \renewcommand*\rmdefault{bch}
  }
  \TF@NativeOSFError
}

% Computer Modern (the `fix-cm' proxies -- font encoding dependent)
\newtypeface[cm,cmr]{computermodern}{Computer Modern}{rm}{
  \@ifpackageloaded{fix-cm}{\relax}{
  %-- NB, from `fixltx2e' documentation (which we ignore) -----------------
  % The package should be loaded before \documentclass, using the command
  % \RequirePackage{fix-cm}, rather than the normal \usepackage. Rationale:
  % If the package is loaded in the preamble, a preceding package or even
  % the code of the document class may have used any of the CM fonts
  % already. However, the definitions of those fonts, that are already in
  % use, cannot be changed any more.
  %
  % Rationale for our not observing this guideline: we don't have
  % programmatic control over the user's code writing. The best we can
  % do is load `fix-cm' here then issue some advice about the matter.
  %------------------------------------------------------------------------
    \usepackage{fix-cm}
    \TF@PackageWarningNoLine{%
      If you must set typeface to Computer Modern, please\MessageBreak
      include \string\RequirePackage{fix-cm}\space before the\MessageBreak
      \string\documentclass\space line in your code. See `fixltx2e'\MessageBreak
      package documentation for an explanation. Doing so\MessageBreak
      will make this warning go away. (Note that it is\MessageBreak
      \string\RequirePackage{fix-cm}, not \string\usepackage{fix-cm}.)%
    }
  }
  \renewcommand*\rmdefault{cmr}
  \tf@TSencodedosf
}

% CM Bright (sans serif as a Roman font)
\newtypeface{cmbright}{CM Bright}{rm}{
  \tf@loadcmbright
}

% CM Dunhill
\newtypeface{cmdunhill}{CM Dunhill}{rm}{
  \renewcommand*\rmdefault{cmdh}
  \tf@TSencodedosf
}

% CM Fibonacci
\newtypeface{cmfibonacci}{CM Fibonacci}{rm}{
  \renewcommand*\rmdefault{cmfib}
  \tf@TSencodedosf
}

% Concrete
\newtypeface{concrete}{Concrete}{rm}{
  \tf@loadconcrete
}

% Day Roman
\newtypeface[dayroman]{dayrom}{Day Roman}{rm}{
  \tf@ifsuboption{s}{\tf@rmfontoptions}{
    % with `long s' and additional c-t ligature
    \renewcommand*\rmdefault{dayroms}
    \xdef\tf@rmprintname{\tf@rmprintname\ S}
  }{
    \renewcommand*\rmdefault{dayrom}
  }
  \TF@NativeLFError   % rare!
}

% DejaVu
\newtypeface{dejavu}{DejaVu}{rm}{
  % NB, scaling DejaVu does not affect baselineskip
  \tf@newbool{tf@dejavu@scaled}{false}
  \tf@ifsuboption{scaled}{\tf@rmfontoptions}
    {\booltrue{tf@dejavu@scaled}}
    {\tf@ifsuboption{scale}{\tf@rmfontoptions}{\booltrue{tf@dejavu@scaled}}{}}
  \ifbool{tf@dejavu@scaled}{
    \ifthenelse{\ispositiverealnumber{\tf@nextsuboption}}
      {\xdef\tf@rmscale{\tf@nextsuboption}}
      {\renewcommand*\tf@rmscale{0.95}}  % DejaVu package default
  }{}

  \newcommand*\tf@dejavu@package{DejaVuSerif}
  \tf@ifsuboption{condensed}{\tf@rmfontoptions}{
    \renewcommand*\tf@dejavu@package{DejaVuSerifCondensed}
    \xdef\tf@rmprintname{\tf@rmprintname\ Condensed}
  }{}
  \ifbool{tf@dejavu@scaled}
    {\PassOptionsToPackage{scaled=\tf@rmscale}{\tf@dejavu@package}}{}
  \tf@usefontpackage{\tf@dejavu@package}
  \TF@NativeOSFError
}

% Droid
\newtypeface{droid}{Droid}{rm}{
  \renewcommand*\rmdefault{fdr}
  \TF@NativeOSFError
}

% % Epigrafica -- not yet ready for prime time
% \newtypeface{epigrafica}{Epigrafica}{rm}{
%   \tf@usefontpackage{epigrafica}
%   \tf@TSencodedosf
% }

% European Modern
% European Modern presents a problem by encapsulating its font declarations
% alongside math declarations within the style file rather than in separate
% fd files. Given our default math -> rm -> sf -> tt font loading order, we'd
% be in trouble if the user wanted, say, sf European Modern together with some
% arbitrary non European Modern math. To sidestep this, we extract and
% execute only the font declarations from the European Modern package.
\newtypeface[em]{europeanmodern}{European Modern}{rm}{
  % TODO: errmsg non-T1 encoding
  \ifthenelse{\equal{\tf@mathfont}{europeanmodern}}{
    % our europeanmodern math font handler has already done the required work
  }{
    \expandafter\let\csname T1/cmr/m/n/10\endcsname\@undefined
    \global\defaulthyphenchar=127
    \DeclareFontFamily{T1}{cmr}{}
    \DeclareFontShape{T1}{cmr}{m}{n}{
      <-6>   emr5   <6-7>   emr6     <7-8>   emr7     <8-9> emr8
      <9-10> emr9   <10-12> emr10    <12-17> emr12    <17-> emr17    }{}
    \DeclareFontShape{T1}{cmr}{m}{sl}{
      <-9>   emsl8  <9-10>  emsl9    <10-12> emsl10   <12-> emsl12 }{}
    \DeclareFontShape{T1}{cmr}{m}{it}{
      <-8>   emti7  <8-9>   emti8    <9-10>  emti9  <10-12> emti10 <12-> emti12}{}
    \DeclareFontShape{T1}{cmr}{m}{sc}{
      <-9>   emcsc8 <9-10>  emcsc9   <10->   emcsc10}{}
    \DeclareFontShape{T1}{cmr}{m}{ui}{<->    emu10}{}
    \DeclareFontShape{T1}{cmr}{b}{n} {<->    emb10}{}
    \DeclareFontShape{T1}{cmr}{bx}{n}{
      <-6>   embx5  <6-7>   embx6    <7-8>   embx7    <8-9> embx8
      <9-10> embx9  <10-12> embx10   <12->   embx12}{}
    \DeclareFontShape{T1}{cmr}{bx}{sl}{<->   embxsl10}{}
    \DeclareFontShape{T1}{cmr}{bx}{it}{<->   embxti10}{}
    \DeclareFontShape{T1}{cmr}{bx}{ui}{<->   emu10}{}
    \renewcommand*\rmdefault{cmr}
  }
  \tf@TSencodedosf
}


% GFS Artemisia
\newtypeface[artemisia]{gfsartemisia}{GFS Artemisia}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{\tf@mathfont@gfsartemisia}{}
  \ifthenelse{\equal{\tf@mathfont}{gfsartemisia}}{
    \tf@ifsuboption{euler}{\tf@mathfontoptions}{\booltrue{tf@@gfsmatheuler}}{}
  }{}
  \tf@ifsuboption{euler}{\tf@rmfontoptions}{\booltrue{tf@@gfsmatheuler}}{}
  \ifbool{tf@@gfsmatheuler}{
    \renewcommand*\rmdefault{artemisiaeuler}
    \xdef\tf@rmprintname{\tf@rmprintname\  (Euler)}
  }{
    \renewcommand*\rmdefault{artemisia}
  }
  \tf@SCencodedosf
  % GFS Artemisia loads txfonts, which sets \sfdefault and \ttdefault
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@txfonts}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@txfonts}{}
}

% GFS Bodoni
% ----------------------------------------------------
% See the comment with math gfsbodoni, if you run into
% problems when using T1 font encoding
% ----------------------------------------------------
\newtypeface[bodoni]{gfsbodoni}{GFS Bodoni}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{\tf@mathfont@gfsbodoni}{}
  \renewcommand*\rmdefault{bodoni}
  \tf@SCencodedosf
}

% GFS Didot
\newtypeface[didot]{gfsdidot}{GFS Didot}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{\tf@mathfont@gfsdidot}{}
  \renewcommand*\rmdefault{udidot}
  \tf@SCencodedosf
  % GFS Didot loads pxfonts, which sets \sfdefault and \ttdefault
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@pxfonts}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@pxfonts}{}
}

% GFS Neohellenic
\newtypeface[neohellenic]{gfsneohellenic}{GFS Neohellenic}{rm}{
  \renewcommand*\rmdefault{neohellenic}
  \tf@ifsuboption{symbols}{\tf@rmfontoptions}{
    \DeclareSymbolFont{letters}{OML}{neohellenic}{m}{it}
    \ifthenelse{\equal{\tf@symbolsfont}{\TF@DEFAULT}}{
      \renewcommand*\tf@symbolsprintname{GFS Neohellenic}
    }{}
  }{}
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{\tf@mathfont@gfsneohellenic}{}
  \tf@SCencodedosf
  % GFS Neohellenic loads sets \sfdefault
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@gfsneohellenic}{}
}

% Gyre Bonum
\newtypeface[bonum,tgbonum]{gyrebonum}{Gyre Bonum}{rm}{
  \tf@usefontpackage{tgbonum}
  \tf@TSencodedosf
}

% Gyre Pagella
\newtypeface[pagella,tgpagella]{gyrepagella}{Gyre Pagella}{rm}{
  \tf@usefontpackage{tgpagella}
  \tf@TSencodedosf
}

% Gyre Schola
\newtypeface[schola,tgschola]{gyreschola}{Gyre Schola}{rm}{
  \tf@usefontpackage{tgschola}
  \tf@TSencodedosf
}

% Gyre Termes
\newtypeface[termes,tgtermes]{gyretermes}{Gyre Termes}{rm}{
  \tf@usefontpackage{tgtermes}
  \tf@TSencodedosf
}

% Iwona
\newtypeface{iwona}{Iwona}{rm}{
  \renewcommand*\rmdefault{iwona}
  \tf@ifsuboption{light}{\tf@rmfontoptions}{
    \xdef\rmdefault{\rmdefault l}
    \xdef\tf@rmprintname{\tf@rmprintname\ Light}
  }{}
  \tf@ifsuboption{condensed}{\tf@rmfontoptions}{
    \xdef\rmdefault{\rmdefault c}
    \xdef\tf@rmprintname{\tf@rmprintname\ Condensed}
  }{}
  \tf@TSencodedosf
}

% Journal d'Analyse Mathematique expanded Times Roman font.
% NB, while JAM Times generates a more spacious and consequently rather
% attractive rendition of Times Roman, it cooperates poorly with (non-Belleek)
% maths and symbols fonts, leading to many compile time warnings, especially
% the innocuous but annoying 'LaTeX Font Warning: Font shape `xxx' will be
% scaled' (even when compiling jamtimes' own mathsample.tex file).
\newtypeface[jam]{jamtimes}{JAM Times}{rm}{
  \tf@usefontpackage[scaled=1,sfscaled=1,amsfontsscaled=1]{jamtimes}
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@helvetica}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@courier}{}
  \TF@NativeOSFError
}

% Kurier
\newtypeface{kurier}{Kurier}{rm}{
  \renewcommand*\rmdefault{kurier}
  \tf@ifsuboption{light}{\tf@rmfontoptions}{
    \xdef\rmdefault{\rmdefault l}
    \xdef\tf@rmprintname{\tf@rmprintname\ Light}
  }{}
  \tf@ifsuboption{condensed}{\tf@rmfontoptions}{
    \xdef\rmdefault{\rmdefault c}
    \xdef\tf@rmprintname{\tf@rmprintname\ Condensed}
  }{}
  \tf@TSencodedosf
}

% Kerkis (the latin parts are essentially URW Bookman,
% of which, also consider Gyre Bonum)
\newtypeface{kerkis}{Kerkis}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{\tf@mathfont@kerkis}{}
  \renewcommand*\rmdefault{mak}
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@kerkis}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@courier}{}
  \tf@TSencodedosf
}

% Kp-Fonts
\newtypeface[kp,kepler]{kpfonts}{}{rm}{
  \tf@loadkpfonts
}

% Latin Modern
\newtypeface[lm,lmodern]{latinmodern}{Latin Modern}{rm}{
  \renewcommand*\rmdefault{lmr}
  % lm doesn't supply bold smallcaps, provide an
  % option to source them from cm instead
  \tf@ifsuboption{boldsc}{\tf@rmfontoptions}{
    \normalfont
    \DeclareFontShape{T1}{lmr}{bx}{sc}  % NB, T1 only                          % TODO: other lm encodings
        {<->ssub*cmr/bx/sc}{}           % Note, no scaling (should be v. close)
  }{}
  \tf@TSencodedosf
}

% Libertine
%------------------------------------------------------------------------------
% NOTE! Around December 2011, the package author deprecated type1 libertine
% fonts in favour of otf format. To use type1 libertine (this might be wrong
% -- be sure to read the the latest libertine documentation if in any doubt):
%  i.  if you also want to access libertine otf,
%        a. install the latest version of the libertine package,
%        b. rename (or delete) the new libertine.sty (dummy) file,
%        c. then re-texhash your system.
%  ii. uninstall the libertine package, install the libertine-legacy package
%      (containing the type1 font files as well as the version of the
%      libertine.sty file that we want to use).
%------------------------------------------------------------------------------
% NB, loads in biolinum (sf) font with matching OsF configuration. This will
% only be noticeable if (a) the `sanstypeface' option is implicitly or
% explicitly set to default, or (b), in the rare event of configuring option
% `fontloadorder=...sf...rm...'
% If case (a), you can override the matching OsF behaviour by explicitly
% setting option `sanstypeface=biolinum' --> lining figures, or
% setting option `sanstypeface=biolinum:osf' --> OsF.  The joy.
\newtypeface{libertine}{Libertine}{rm}{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
    \PassOptionsToPackage{osf}{libertine}
    \tf@define@liningfigures{fxl}
  }{}
  \tf@usefontpackage{libertine}
  \tf@pdfglyphcorrection{Libertine}
  \renewcommand*\tf@sfprintname{Biolinum} % included in libertine package
}

% Bigelow and Holmes Lucida Bright (purchase from CTAN)
\newtypeface[lucidabr,lucida]{lucidabright}{Lucida Bright}{rm}{
  \tf@loadlucidabr
}

% New Century Schoolbook
\newtypeface[nc,newcentury]{newcenturyschoolbook}{New Century Schoolbook}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{fourier}
          \AND\equal{\tf@fouriermathfont}{newcenturyschoolbook}}{
    % \rmdefault was configured in \tf@mathfont@fourier
  }{
    \tf@usefontpackage{newcent}  % loads pnc, pag, pcr
  }
  \TF@NativeOSFError
}

% Palatino
\newtypeface{palatino}{Palatino}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{
    \tf@loadmathpazo
  }{
    \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
      \renewcommand*\rmdefault{pplj}
      \tf@define@liningfigures{pplx}
     }{
       \renewcommand*\rmdefault{pplx}
     }
    \tf@define@oldstylenums@cmd{pplj}
  }
}

% Paratype PT Serif
\newtypeface[pt,paratype]{ptserif}{PT Serif}{rm}{
  \tf@usefontpackage{PTSerif}
  \TF@NativeOSFError
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@ptsans}{}
  % don't take this approach if tt is not specified since PTMono
  % is unlikely to be installed. If it is and that's what's
  % wanted for tt, then users can explicitly say so by including
  % monotypeface=ptmono among their package options.
}

% PXFonts
\newtypeface[px]{pxfonts}{PX Fonts}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}
    {\tf@usefontpackage{pxfonts}}
    {\renewcommand*\rmdefault{pxr}}
  \tf@TSencodedosf
  % PX Fonts sets \sfdefault and \ttdefault
  \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{\tf@sffont@pxfonts}{}
  \ifthenelse{\equal{\tf@ttfont}{\TF@DEFAULT}}{\tf@ttfont@pxfonts}{}
}

% Times Roman (faked smallcaps & oldstyle figures only if txfonts gets loaded)
\newtypeface{times}{Times Roman}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}
           \OR\equal{\tf@mathfont}{amsfonts}}{
    \tf@usefontpackage[varg]{txfonts}
    \tf@TSencodedosf
  }{
    \renewcommand*\rmdefault{ptm}
    \TF@NativeOSFMathError
  }
}

% TXFonts
\newtypeface[tx]{txfonts}{TX Fonts}{rm}{
  \tf@loadtxfonts
}

% Uncial -- for 6th to the 10th century manuscripts
% NB, requires B1 font encoding (i.e., you also need to have
% installed: b1enc.def, b1cmr.fd, and maybe TeXB1.enc)
\newtypeface{uncial}{Artificial Uncial}{rm}{
  \tf@usefontpackage{allauncl}
  \TF@NativeOSFError
}

% URW Antiqua
\newtypeface[antiqua]{urwantiqua}{URW Antiqua}{rm}{
  \renewcommand*\rmdefault{uaq}
  \TF@NativeOSFError
}

% URW Bookman
\newtypeface[bookman]{urwbookman}{URW Bookman}{rm}{
  \tf@usefontpackage{bookman}
  \TF@NativeOSFError
}

% URW Garamond -- NB, does not natively provide smallcaps
\newtypeface[garamond]{urwgaramond}{URW Garamond}{rm}{
  \ifthenelse{\equal{\tf@mathfont}{mathdesign}
          \AND\equal{\tf@mdrmfont}{garamond}}{
    % \rmdefault was configured in \tf@mathfont@mathdesign
    \renewcommand*\tf@rmprintname{Math Design Garamond}
  }{
    \renewcommand*\rmdefault{ugm}
  }
  \TF@NativeOSFError
}

% URW Nimbus
\newtypeface[nimbus]{urwnimbus}{URW Nimbus}{rm}{
  \renewcommand*\rmdefault{unm}
  \tf@TSencodedosf
}

% Zapf Chancery
\newtypeface[chancery,zapf]{zapfchancery}{Zapf Chancery}{rm}{
  \renewcommand*\rmdefault{pzc}
  \TF@NativeOSFError
}

% Sans serif fonts -- somewhat sensitive to font load ordering,
% particularly if loaded via a font package in the code below
% =============================================================
\TF@PackageDebugInfo{Configuring sf load commands...}

% Default -- no-op
\newtypeface{\TF@DEFAULT}{}{sf}{
  \ifthenelse{\equal{\tf@sfprintname}{undefined}}{
    \renewcommand*\tf@sfprintname{\TF@DEFAULTPRINTNAME}
  }{}
}

\newtypeface[libris]{adflibris}{ADF Libris}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \RequirePackage{nfssext-cfr}% see libris doc for \swashstyle & \textswash
  \renewcommand*\sfdefault{yly}
  \renewcommand*\tf@sfprintname{ADF Libris}
}

\newtypeface[venturis]{adfventuris}{ADF Venturis Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \tf@newbool{tf@@venturisii}{false}
  \ifthenelse{\equal{\tf@rmfont}{adfventuris}}{
    \tf@ifsuboption{2}{\tf@rmfontoptions}{\booltrue{tf@@venturisii}}{}
  }{}
  \tf@ifsuboption{2}{\tf@sffontoptions}{\booltrue{tf@@venturisii}}{}
  \ifbool{tf@@venturisii}{
    \renewcommand*\sfdefault{yv3}
    \renewcommand*\tf@sfprintname{ADF Venturis 2 Sans}
  }{
    \renewcommand*\sfdefault{yv1}
  }
}

\newtypeface{ae}{AE Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{aess}
  \ifthenelse{\equal{\tf@rmfont}{ae}}{
    \tf@ifsuboption{slides}{\tf@rmfontoptions}
      {\renewcommand*\sfdefault{laess}}{}
  }{}
  \ifthenelse{\equal{\tf@ttfont}{ae}}{
    \tf@ifsuboption{slides}{\tf@ttfontoptions}
      {\renewcommand*\sfdefault{laess}}{}
  }{}
  \tf@ifsuboption{slides}{\tf@sffontoptions}
    {\renewcommand*\sfdefault{laess}}{}
}

\newtypeface[arev]{arevsans}{Arev Sans}{sf}{
  \ifthenelse{\equal{\tf@mathfont}{\TF@DEFAULT}}{\tf@mathfont@arevmath}{}
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{fav}
}

\newtypeface{augie}{Augie}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{augie}
}

\newtypeface{avantgarde}{Avant Garde}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \tf@usefontpackage{avant}
}

\newtypeface[bera]{berasans}{Bitstream Vera Sans}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scaled=\tf@sfscalefactor}{berasans}}
  \tf@usefontpackage{berasans}
}

\newtypeface{cantarell}{Cantarell}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scale=\tf@sfscalefactor}{cantarell}}
  \tf@usefontpackage[defaultsans]{cantarell}
}

% Biolinum aka Libertine sans
%------------------------------------------------------------------------------
% NOTE: read the comments with libertine in the roman fonts section
%------------------------------------------------------------------------------
% NB1, the biolinum ex font metrics in all tested versions of libertine (as of
% writing, from v5.1.2 2011/06/06) is faulty. The bug report, again, as of
% writing is still open (see http://sourceforge.net/tracker/?func=detail&
% aid=3397220&group_id=89513&atid=590374). Consequently, ex based scaling
% produces incorrect results. The easiest way out is to avoid setting typeface
% option sanstypeface=ex. Try sanstypeface=xxx, where xxx is uppercase,
% lowercase, figures or a floating point number instead. Alternatively, until
% the bug is fixed, advanced users can hack their biolinum font description
% (*fxb*.fd) files.  Add this code:
%    \fontdimen5\font=\fontcharht\font`\x
% to the last parameter in each \DeclareFontShape command in all *fxb*.fd
% files.  E.g.,
%    \DeclareFontShape{T1}{fxb}{m}{n}{ <-> \fxl@@scale fxbr-t1}
%      {\fontdimen5\font=\fontcharht\font`\x}
%
% NB2, biolinum and libertine SHARE the same loadtime scaling command (the
% horror!). Consequently, there's a good risk that scaling one will
% inadvertently scale the other, the risk depending on the order in which (i.e.,
% when) LaTeX reads the respective rm/libertine and sf/biolinum .fd files.
\newtypeface[libertine]{biolinum}{Biolinum}{sf}{
  \tf@ifsuboption{osf}{\tf@sffontoptions}{
    % Oddly enough for sans, biolinum has an OSF variant (and its quite nice!)
    \renewcommand*\sfdefault{fxbj}
    \xdef\tf@sfprintname{\tf@sfprintname\ OSF}
  }{
    \renewcommand*\sfdefault{fxb}
  }
  \scaletypeface{sf}{\xdef\fxl@scale{\tf@sfscalefactor}}
  % TODO: pdfglyphcorrection is probably unnecessary here
  \tf@pdfglyphcorrection{Biolinum}
}

\newtypeface{cmbright}{CM Bright Sans}{sf}{
  \tf@loadcmbright
}

\newtypeface{comfortaa}{Comfortaa}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scale=\tf@sfscalefactor}{comfortaa}}
  \tf@usefontpackage{comfortaa}
  \renewcommand*\sfdefault{fco}
}

\newtypeface[cm,cms]{computermodern}{Computer Modern Sans}{sf}{
  % Warning: CM Sans Quotation is a rather dubious font. Bold, italic, slant
  % fontsizes do not match normal fontsize. No smallcaps. Best avoid.
  %
  % requires reworked .fd file to accommodate load time scaling
  \tf@ifsuboption{quotation}{\tf@sffontoptions}{
    \renewcommand*\sfdefault{lcmss}
  }{
    \renewcommand*\sfdefault{cmss}
  }
}

\newtypeface{cyklop}{Cyklop}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{cyklop}
}

\newtypeface{dejavu}{DejaVu Sans}{sf}{
  \tf@ifsuboption{condensed}{\tf@sffontoptions}{
    \scaletypeface{sf}
      {\PassOptionsToPackage{scaled=\tf@sfscalefactor}{DejaVuSansCondensed}}
    \tf@usefontpackage{DejaVuSansCondensed}
    \xdef\tf@sfprintname{\tf@sfprintname\ Condensed}
  }{
    \scaletypeface{sf}
      {\PassOptionsToPackage{scaled=\tf@sfscalefactor}{DejaVuSans}}
    \tf@usefontpackage{DejaVuSans}
  }
}

\newtypeface{droid}{Droid Sans}{sf}{
  \scaletypeface{sf}{\def\droid@fds@scale{s*[\tf@sfscalefactor]}}
  \renewcommand*\sfdefault{fds}
}

\newtypeface[em]{europeanmodern}{European Modern Sans}{sf}{
  % TODO: errmsg non-T1 encoding
  % TODO: we can source sf osf from TS1
  % See comments with rm \newtypeface declaration
  \ifthenelse{\equal{\tf@mathfont}{europeanmodern}}{
    % our europeanmodern math font handler has already done the needed work
  }{
    \DeclareFontFamily{T1}{emss}{}
    \DeclareFontShape{T1}{emss}{m}{n}  {
      <-9> emss8  <9-10> emss9  <10-12> emss10  <12-17> emss12  <17-> emss17}{}
    \DeclareFontShape{T1}{emss}{m}{sl} {
      <-9> emssi8 <9-10> emssi9 <10-12> emssi10 <12-17> emssi12 <17-> emssi17}{}
    \DeclareFontShape{T1}{emss}{sbc}{n}{<-> emssdc10}{}
    \DeclareFontShape{T1}{emss}{bx}{n} {<-> emssbx10}{}
    \DeclareFontShape{T1}{emss}{m}{it} {
      <-9> emssi8 <9-10> emssi9 <10-12> emssi10 <12-17> emssi12 <17-> emssi17}{}
    \DeclareFontShape{T1}{emss}{m}{sc} {
      <-9> emcsc8 <9-10> emcsc9 <10-> emcsc10}{}
    \DeclareFontShape{T1}{emss}{m}{ui} {<-> emu10}{}
    \DeclareFontShape{T1}{emss}{bx}{ui}{<-> emu10}{}
    \renewcommand*\sfdefault{emss}
  }
}

\newtypeface[neohellenic]{gfsneohellenic}{GFS Neohellenic}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  % NB, .fd file contains scaling paraphernalia, however fixes scale to 1.225!
  \renewcommand*\sfdefault{neohellenic}
  \tf@ifsuboption{symbols}{\tf@sffontoptions}{
    \DeclareSymbolFont{letters}{OML}{neohellenic}{m}{it}
    \ifthenelse{\equal{\tf@symbolsfont}{\TF@DEFAULT}}{
      \renewcommand*\tf@symbolsprintname{GFS Neohellenic}
    }{}
  }{}
}

\newtypeface[adventor,tgadventor]{gyreadventor}{Gyre Adventor}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scale=\tf@sfscalefactor}{tgadventor}}
  \tf@usefontpackage{tgadventor}
}

\newtypeface[heros,tgheros]{gyreheros}{Gyre Heros}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scale=\tf@sfscalefactor}{tgheros}}
  \tf@usefontpackage{tgheros}
}

\newtypeface[helv,helvet]{helvetica}{Helvetica}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scaled=\tf@sfscalefactor}{helvet}}
  \tf@usefontpackage{helvet}
}

\newtypeface{iwona}{Iwona}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{iwona}

  \tf@ifsuboption{light}{\tf@sffontoptions}{
    \xdef\sfdefault{\sfdefault l}
    \xdef\tf@sfprintname{\tf@sfprintname\ Light}
  }{}
  \tf@ifsuboption{condensed}{\tf@sffontoptions}{
    \xdef\sfdefault{\sfdefault c}
    \xdef\tf@sfprintname{\tf@sfprintname\ Condensed}
  }{}
}

\newtypeface[kp,kepler]{kpfonts}{KP Fonts Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \tf@ifsuboption{osf}{\tf@sffontoptions}{
    % Oddly enough for a sans font, KP has an OSF variant
    \renewcommand*\sfdefault{jkpssosn}
    \xdef\tf@sfprintname{\tf@sfprintname\ OSF}
  }{
    \renewcommand*\sfdefault{jkpss}
  }
}

\newtypeface{kerkis}{Kerkis Sans}{sf}{
  \renewcommand*\sfdefault{maksf}
  % <enc>maksf.fd hard codes its scale factor. This code rolls that back.
  \providecommand*\tf@kerkismagicnumber{0.90} % change if <enc>maksf.fd changes
  \g@addto@macro\tf@empty@sfcnt@hook{%
    % Rewind 0.90 fixed scale factor in .fd file
    \ifthenelse{\boolean{tf@@sffamily}
        \AND\NOT\equal{\tf@sfscalemethod}{\TF@NO@SCALE}}{%
      \@tempdima=\tf@sfscalefactor\p@%
      \@tempdima=\tf@kerkismagicnumber\@tempdima%
      \edef\optional@arg{\strip@pt\@tempdima}%
      \global\booltrue{tf@sfscaledatloadtime}%
    }{}%
  }
}

\newtypeface{kurier}{Kurier Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{kurier}
  \tf@ifsuboption{light}{\tf@sffontoptions}{
    \xdef\sfdefault{\sfdefault l}
    \xdef\tf@sfprintname{\tf@sfprintname\ Light}
  }{}
  \tf@ifsuboption{condensed}{\tf@sffontoptions}{
    \xdef\sfdefault{\sfdefault c}
    \xdef\tf@sfprintname{\tf@sfprintname\ Condensed}
  }{}
}

\newtypeface[lm,lmodern]{latinmodern}{Latin Modern Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \tf@ifsuboption{extended}{\tf@sffontoptions}{
    \renewcommand*\sfdefault{lmssq}
    \xdef\tf@sfprintname{\tf@sfprintname\ Extended}
  }{
    \renewcommand*\sfdefault{lmss}
  }
}

\newtypeface{lato}{Lato}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scale=\tf@sfscalefactor}{lato}}
  \tf@usefontpackage[defaultsans]{lato}
}

\newtypeface[lucidabr,lucida]{lucidabright}{Lucida Bright Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  % (unfortunately, redefining \DeclareLucidaFontShape won't work
  % effortlessly since it is shared between rm, sf and tt fonts)
  \renewcommand*\sfdefault{hls}
}

\newtypeface{opensans}{Open Sans}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scale=\tf@sfscalefactor}{opensans}}
  \tf@ifsuboption{osf}{\tf@sffontoptions}{
    \PassOptionsToPackage{osfigures}{opensans}
  }{}
  \tf@usefontpackage[defaultsans]{opensans}[2011/11/11]
}

\newtypeface[pt,paratype]{ptsans}{PT Sans}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scaled=\tf@sfscalefactor}{PTSans}}
  \tf@usefontpackage{PTSans}
}

\newtypeface[px]{pxfonts}{PX Fonts Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{pxss}
}

\newtypeface[tx]{txfonts}{TX Fonts Sans}{sf}{
%% NOTE: for users that want to use newtx's sf fonts definitions,
%% copy this macro to typeface.cfg, uncommenting the commented text
%% below. However, please check that it functions as intended before
%% relying it in earnest. Particularly check italic and bold shape
%% scaling to roman-relative size (sf scale options ex, uppercase,
%% lowercase, figures and implicit/default).
%
%   \tf@newbool{newtx}{false}
%   \ifthenelse{\equal{\tf@sffont}{\TF@DEFAULT}}{
%     \ifthenelse{\equal{\tf@rmfont}{txfonts}}{
%       \tf@ifsuboption{new}{\tf@rmfontoptions}{\booltrue{newtx}}{}
%     }{}
%     \ifthenelse{\equal{\tf@mathfont}{txfonts}}{
%       \tf@ifsuboption{new}{\tf@mathfontoptions}{\booltrue{newtx}}{}
%     }{}
%   }{
%     \tf@ifsuboption{new}{\tf@sffontoptions}{\booltrue{newtx}}{}
%   }
%
%   \ifbool{newtx}{
%     % Michael Sharpe's newtx
%     \scaletypeface{sf}{\xdef\ntx@helvscaled{s*[\tf@sfscalefactor]}}
%     \renewcommand*\sfdefault{ntxss}
%   }{
    \renewcommand*\sfdefault{txss}
    % <enc>txss.fd hard codes its scale factor. This code rolls that back.
    \providecommand*\tf@txfontsmagicnumber{0.95}% change if <enc>txss.fd changes
    \g@addto@macro\tf@empty@sfcnt@hook{%
      % Rewind 0.95 fixed scale factor in .fd file
      \ifthenelse{\boolean{tf@@sffamily}
          \AND\NOT\equal{\tf@sfscalemethod}{\TF@NO@SCALE}}{%
        \@tempdima=\tf@sfscalefactor\p@%
        \@tempdima=\tf@txfontsmagicnumber\@tempdima%
        \edef\optional@arg{\strip@pt\@tempdima}%
        \global\booltrue{tf@sfscaledatloadtime}%
      }{}%
    }
%   }
}

\newtypeface[arial]{urwarial}{URW Arial}{sf}{
  \scaletypeface{sf}{\PassOptionsToPackage{scaled=\tf@sfscalefactor}{uarial}}
  \tf@usefontpackage{uarial}
}

\newtypeface[classico,optima]{urwclassico}{URW Classico}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{uop}
}

\newtypeface[grotesq]{urwgrotesq}{URW Grotesq}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{ugq}
}

\newtypeface[nimbus]{urwnimbus}{URW Nimbus Sans}{sf}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\sfdefault{unms}
}

% Typewriter fonts -- somewhat sensitive to font load ordering,
% particularly if loaded via a font package in the code below
% ============================================================
\TF@PackageDebugInfo{Configuring tt load commands...}

% Default -- no-op
\newtypeface{\TF@DEFAULT}{}{tt}{
  \ifthenelse{\equal{\tf@ttprintname}{undefined}}{
    \renewcommand*\tf@ttprintname{\TF@DEFAULTPRINTNAME}
  }{}
}

\newtypeface{ae}{AE Mono}{tt}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\ttdefault{aett}
  \ifthenelse{\equal{\tf@rmfont}{ae}}{
    \tf@ifsuboption{slides}{\tf@rmfontoptions}
      {\renewcommand*\ttdefault{laett}}{}
  }{}
  \ifthenelse{\equal{\tf@sffont}{ae}}{
    \tf@ifsuboption{slides}{\tf@sffontoptions}
      {\renewcommand*\ttdefault{laett}}{}
  }{}
  \tf@ifsuboption{slides}{\tf@ttfontoptions}
    {\renewcommand*\ttdefault{laett}}{}
}

\newtypeface[bera]{beramono}{Bitstream Vera Mono}{tt}{
  \scaletypeface{tt}{\PassOptionsToPackage{scaled=\tf@ttscalefactor}{beramono}}
  \tf@usefontpackage{beramono} % contains no font load order side effects
}

\newtypeface{cmbright}{Computer Modern Mono Light}{tt}{
  \tf@loadcmbright % contains math/symbols font load order side effects
}

\newtypeface[cm,cmt]{computermodern}{}{tt}{
  % requires reworked .fd files to accommodate load time scaling
  \tf@ifsuboption{light}{\tf@ttfontoptions}{
    \renewcommand*\ttdefault{cmtl}
    \renewcommand*\tf@ttprintname{Computer Modern Mono Light}
  }{
    \tf@ifsuboption{proportional}{\tf@ttfontoptions}{
      \renewcommand*\ttdefault{cmvtt}
      \renewcommand*\tf@ttprintname{Computer Modern Mono Proportional}
    }{
      \tf@ifsuboption{L}{\tf@ttfontoptions}{
        \ifthenelse{\equal{\tf@fontencoding}{T1}}{
          \DeclareFontFamily{T1}{lcmtt}{\hyphenchar\font\m@ne}
          \DeclareFontShape{T1}{lcmtt}{m}{n}{<->ecltt8}{}
          \DeclareFontShape{T1}{lcmtt}{m}{In}{<->iecltt8}{}
          \DeclareFontShape{T1}{lcmtt}{m}{it}{<->ecit1000}{}
        }{
          \ifthenelse{\equal{\tf@fontencoding}{OT1}}{
            \DeclareFontFamily{OT1}{lcmtt}{\hyphenchar\font\m@ne}
            \DeclareFontShape{OT1}{lcmtt}{m}{n}{<-> cmtt8}{}
            \DeclareFontShape{OT1}{lcmtt}{m}{In}{<->icmtt8}{}
            \DeclareFontShape{OT1}{lcmtt}{m}{it}{<->cmitt10}{}
          }
        }{
          %\TF@PackageWarningNoLine{...}
        }
        \renewcommand*\ttdefault{lcmtt}
        \renewcommand*\tf@ttprintname{Computer Modern Mono L}
      }{
        \renewcommand*\ttdefault{cmtt}
        \renewcommand*\tf@ttprintname{Computer Modern Mono}
      }
    }
  }
}

\newtypeface{courier}{Courier}{tt}{
  \scaletypeface{tt}{\PassOptionsToPackage{scaled=\tf@ttscalefactor}{couriers}}
  \tf@usefontpackage{couriers}
}

\newtypeface{dejavu}{DejaVu Mono}{tt}{
  \scaletypeface{tt}
    {\PassOptionsToPackage{scaled=\tf@ttscalefactor}{DejaVuSansMono}}
  \tf@usefontpackage{DejaVuSansMono}
}

\newtypeface{droid}{Droid Mono}{tt}{
  \scaletypeface{tt}{\def\droid@fdm@scale{s*[\tf@ttscalefactor]}}
  \renewcommand*\ttdefault{fdm}
}

\newtypeface[cursor,tgcursor]{gyrecursor}{Gyre Cursor}{tt}{
  \scaletypeface{tt}{\PassOptionsToPackage{scale=\tf@ttscalefactor}{tgcursor}}
  \tf@usefontpackage{tgcursor}
}

\newtypeface[em]{europeanmodern}{European Modern Mono}{tt}{
  % TODO: errmsg non-T1 encoding
  % TODO: we can source tt osf from TS1
  % See comments with rm \newtypeface declaration
  \ifthenelse{\equal{\tf@mathfont}{europeanmodern}}{
    % our europeanmodern math font handler has already done the required work
  }{
    \DeclareFontFamily{T1}{cmtt}{\hyphenchar \font\m@ne}
    \DeclareFontShape{T1}{cmtt}{m}{n}{
      <-9> emtt8  <9-10> emtt9  <10-12> emtt10 <12-> emtt12}{}
    \DeclareFontShape{T1}{cmtt}{m}{it} {<-> emitt10}{}
    \DeclareFontShape{T1}{cmtt}{m}{sl} {<-> emsltt10}{}
    \DeclareFontShape{T1}{cmtt}{m}{ui} {<-> emitt10}{}
    \DeclareFontShape{T1}{cmtt}{bx}{n} {
      <-9> emtt8  <9-10> emtt9  <10-12> emtt10 <12-> emtt12}{}
    \DeclareFontShape{T1}{cmtt}{bx}{it}{<-> emitt10}{}
    \DeclareFontShape{T1}{cmtt}{bx}{ui}{<-> emitt10}{}
    \renewcommand*\ttdefault{cmtt}
  }
}

\newtypeface{inconsolata}{Inconsolata}{tt}{
  \scaletypeface{tt}{\def\fifour@scaled{s*[\tf@ttscalefactor]}}
  \renewcommand*\ttdefault{fi4}
}

\newtypeface[kp,kepler]{kpfonts}{KP Fonts Mono}{tt}{
  % requires reworked .fd file to accommodate load time scaling
  \tf@ifsuboption{osf}{\tf@ttfontoptions}
    {\renewcommand*\ttdefault{jkpttosn}} % KP mono has an OSF variant
    {\renewcommand*\ttdefault{jkptt}}
}

\newtypeface[lm,lmodern]{latinmodern}{Latin Modern Mono}{tt}{
  % requires reworked .fd file to accommodate load time scaling
  \tf@ifsuboption{proportional}{\tf@ttfontoptions}{
    \renewcommand*\ttdefault{lmvtt}
    \xdef\tf@ttprintname{\tf@ttprintname\  Proportional}
    \renewcommand*\tf@ttprintname{Latin Modern Mono Proportional}
  }{
    \renewcommand*\ttdefault{lmtt}
  }
}

\newtypeface[lucidabr,lucida]{lucidabright}{Lucida Bright Mono}{tt}{
  % We follow lucidabr (see \tf@loadlucidabr, above) by defaulting
  % to sans tt unless serif tt is specified. This breaks with the
  % sans vs serif tt pattern established with other tt fonts throughout
  % this package (which default to serif tt unless `sans' option is provided).
  % Note also that we require reworked .fd file to accommodate load time
  % scaling (unfortunately, redefining \DeclareLucidaFontShape won't work
  % without knottiness since it is common to rm, sf and tt fonts).
  \tf@ifsuboption{serif}{\tf@ttfontoptions}{\booltrue{tf@@lbseriftt}}{}
  \tf@ifsuboption{seriftt}{\tf@ttfontoptions}{\booltrue{tf@@lbseriftt}}{}
  \tf@ifsuboption{sans}{\tf@ttfontoptions}{
    \ifbool{tf@@lbseriftt}{
      \TF@PackageWarningNoLine{%
        Incompatible suboptions `sans' and `seriftt' (or\MessageBreak
        `serif'). Check for conflicts in your `typeface',\MessageBreak
        `mathtypeface' and `monotypeface' package options}
    }{}
  }{}
  \ifbool{tf@@lbseriftt}{
    \renewcommand*\ttdefault{hlct}
  }{
    \renewcommand*\ttdefault{hlst}
    \renewcommand*\tf@ttprintname{Lucida Bright Sans Mono}
  }
}

\newtypeface[luxi]{luximono}{Luxi Mono}{tt}{
  \scaletypeface{tt}{\PassOptionsToPackage{scaled=\tf@ttscalefactor}{luximono}}
  % While the luximono package is available via MiKTeX package manager, it is
  % not through TeXLive package manager where instead you'll need to download
  % and install by hand
  \tf@usefontpackage{luximono}
}

\newtypeface[pt,paratype]{ptmono}{PT Mono}{tt}{
  % PT Mono is not installed with the paratype package and must
  % consequently be manually installed using the truetype variant
  % (instructions in paratype's docs)
  \scaletypeface{tt}{\PassOptionsToPackage{scaled=\tf@ttscalefactor}{PTSans}}
  \tf@usefontpackage{PTMono}
}

\newtypeface[px]{pxfonts}{PX Fonts Mono}{tt}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\ttdefault{pxtt}
}

\newtypeface[tx]{txfonts}{TX Fonts Mono}{tt}{
  % requires reworked .fd file to accommodate load time scaling
  \renewcommand*\ttdefault{txtt}
}

%== End \newtypeface font definitions =========================================

% Unpack and validate typeface font options
%------------------------------------------
% Typeface name options (typeface/rm, sanstypeface/sf, monotypeface/tt,
% mathtypeface/math, symbolstypeface/sym and textfigures) can include
% colon-separated lists of suboptions, e.g.,
%    typeface=iwona:light,
%    sanstypeface=kepler:light:osf,
%    monotypeface=latinmodern:proportional
%    textfigures=kepler:light:scale:ex:spacing:-20:lkern:-20:rkern:-10
% At this stage, each user supplied <fontname[:option]*> string has already
% been set up in \tf@XXfontname, where XX is rm, sf, tt, math, symbols or
% textfigures. We store the <fontname> part in \tf@XXfont and the <[:option]*>
% part in \tf@XXfontoptions (discarding the first colon), then validate
% that \tf@XXfont is a legitimate font name, complaining otherwise.
%......................................................................
\tf@newbool{tf@valid@fontname}{false}

\newcommand*\tf@unpackfontname[2]{%
  % split & save the string in #1 into \tf@#2font and \tf@#2fontoptions, where
  %   #1 is the <fontname(:option)*> user-supplied option string, and
  %   #2 is one of textfigures, symbols, math, rm, sf, or tt
  \expandafter\tf@@unpackfontname\expandafter{#1}{#2}%
}

\newcommand*\tf@@unpackfontname[2]{%
  \tf@split@fontname #2:#1\@empty:\@empty\relax%
}

\def\tf@split@fontname#1:#2:#3\@empty#4\relax{%         % split and save to:
  \expandafter\def\csname tf@#1font\endcsname{#2}%      % eg, \tf@rmfont
  \expandafter\def\csname tf@#1fontoptions\endcsname{#3}% eg, \tf@rmfontoptions
}

\newcommand*\tf@parsefontname[1]{
  % #1 is one of textfigures, symbols, math, rm, sf, or tt
  \edef\tf@@fontname{\csname tf@#1fontname\endcsname}
  \tf@unpackfontname{\tf@@fontname}{#1}

  % check that the fontname part we saved in \tf@#1font matches one
  % of the entries in the \tf@#1typefacechoices comma separated list
  \boolfalse{tf@valid@fontname}
  \edef\tf@@font{\csname tf@#1font\endcsname}
  \renewcommand*\do[1]{      % refer etoolbox package
    \ifthenelse{\equal{\tf@@font}{##1}}
      {\booltrue{tf@valid@fontname}\listbreak}
      {}
  }
  \edef\tf@@typefacechoices{\csname tf@#1typefacechoices\endcsname}
  \expandafter\docsvlist\expandafter{\tf@@typefacechoices}

  \ifthenelse{\NOT\boolean{tf@valid@fontname}}{
    \ifthenelse{\equal{rm}{#1}}{
      \edef\tf@@XXtypeface{typeface}
      \edef\tf@@XXdefaultfont{\TF@DEFAULTRMFONT}}{}
    \ifthenelse{\equal{sf}{#1}}{
      \edef\tf@@XXtypeface{sanstypeface}
      \edef\tf@@XXdefaultfont{\TF@DEFAULTSFFONT}}{}
    \ifthenelse{\equal{tt}{#1}}{
      \edef\tf@@XXtypeface{monotypeface}
      \edef\tf@@XXdefaultfont{\TF@DEFAULTTTFONT}}{}
    \ifthenelse{\equal{math}{#1}}{
      \edef\tf@@XXtypeface{mathtypeface}
      \edef\tf@@XXdefaultfont{\TF@DEFAULTMATHFONT}}{}
    \ifthenelse{\equal{symbols}{#1}}{
      \edef\tf@@XXtypeface{symbolstypeface}
      \edef\tf@@XXdefaultfont{\TF@DEFAULTSYMBOLSFONT}}{}
    \ifthenelse{\equal{textfigures}{#1}}{
      \edef\tf@@XXtypeface{textfigures}
      \edef\tf@@XXdefaultfont{\TF@DEFAULTTEXTFIGURESFONT}}{}
    % NB, no allowance is made in the following error message that the user
    % might have used one of the options aliases, e.g., instead of
    % typeface=..., s/he wrote rm=...  Hopefully if the user is smart enough
    % to use options aliases, s/he's smart enough to interpret the error.
    \TF@PackageError{%
      Package option `\tf@@XXtypeface=\tf@@fontname' is\MessageBreak
      invalid. Setting `\tf@@XXtypeface=\tf@@XXdefaultfont'}{}
    \expandafter\xdef\csname tf@#1fontname\endcsname{\tf@@XXdefaultfont}
    \expandafter\xdef\csname tf@#1font\endcsname{\tf@@XXdefaultfont}
    \expandafter\xdef\csname tf@rmfontdefaultstatus\endcsname{\TF@IMPLICITDEFAULT}
  }{}
}
\forcsvlist{\tf@parsefontname}{rm,sf,tt,math,symbols,textfigures}

% Configure sf, tt, math and textfigures font scaling
% ===================================================
% Options include: ex, lowercase, uppercase, figures, true (synonym for ex),
% false, or a literal constant (e.g., 0.82), allowing authors to match the
% ex-height, the baseline ascender height of lowercase letters, the ascender
% height of uppercase letters, or the ascender height of figures for the
% target fonts with respect to the \rmdefault (reference) font size. Special
% values 0, false, 1, 1.0, etc. all produce unity, that is, no scaling.
%---------------------------------------------------------------------------

% Typeface family scale command names, e.g., ex, 0.98, false, uppercase,...
\newcommand*\tf@rmscale{\TF@UNSCALED}
\newcommand*\tf@sfscale{\TF@UNSCALED}
\newcommand*\tf@ttscale{\TF@UNSCALED}
\newcommand*\tf@mathscale{\TF@UNSCALED}
\newcommand*\tf@textfiguresscale{\TF@UNSCALED}

% Typeface family scale factors (+ve real numbers only)
\newcommand*\tf@sfscalefactor{\TF@UNSCALED}
\newcommand*\tf@ttscalefactor{\TF@UNSCALED}
\newcommand*\tf@mathscalefactor{\TF@UNSCALED}
\newcommand*\tf@textfiguresscalefactor{\TF@UNSCALED}

% Track whether user explicitly defines scale or whether we implicitly set it
\tf@newbool{tf@sfscaleimplicit}{true}
\tf@newbool{tf@ttscaleimplicit}{true}
\tf@newbool{tf@mathscaleimplicit}{true}
\tf@newbool{tf@textfiguresscaleimplicit}{true}

% Determine target font scaling methods
%--------------------------------------
\newcommand*\tf@sfscalemethod{\TF@ER@SCALE}
\newcommand*\tf@ttscalemethod{\TF@ER@SCALE}
\newcommand*\tf@mathscalemethod{\TF@ER@SCALE}
\newcommand*\tf@textfiguresscalemethod{\TF@ER@SCALE}

\tf@newbool{tf@sfscaledatloadtime}{false}
\tf@newbool{tf@ttscaledatloadtime}{false}
\tf@newbool{tf@mathscaledatloadtime}{false}
\tf@newbool{tf@textfiguresscaledatloadtime}{false}

% Validate and set the math font family (0..15) for use with rm-relative
% font scaling (used in \tf@initialise@fontscaling and in printinfo)
\newcommand*\tf@mathfontfamily{0} % default

\tf@ifsuboption{fam}{\tf@mathfontoptions}{
  \xdef\tf@mathfontfamily{\tf@nextsuboption}
  \def\tf@@temp{fam}
}{}

\tf@ifsuboption{family}{\tf@mathfontoptions}{
  \xdef\tf@mathfontfamily{\tf@nextsuboption}
  \def\tf@@temp{family}
}{}

\ifthenelse{\NOT\ispositiveinteger{\tf@mathfontfamily}
            \OR\(\tf@mathfontfamily > 15\)}{
  \ifthenelse{\equal{\tf@mathfontfamily}{}}{\def\tf@mathfontfamily{<nil>}}{}
  \TF@PackageError{%
      Invalid `\tf@@temp:nn' suboption argument in package\MessageBreak
      option `mathtypeface=\tf@mathfontname'.\MessageBreak
      Integer `nn' must be between 0 and 15\MessageBreak
      (not `\tf@mathfontfamily'). Setting math font family = 0%
  }{}
  \renewcommand*\tf@mathfontfamily{0}
}{}

% Determine sf, tt, math and textfigures font scaling methods
\newcommand*\tf@configure@fontscalingmethod[1]{
  \ifthenelse{\NOT\equal{#1}{sf}
          \AND\NOT\equal{#1}{tt}
          \AND\NOT\equal{#1}{math}
          \AND\NOT\equal{#1}{textfigures}}{
    \TF@PackageError{Internal error in \TF@PACKAGENAME.sty\MessageBreak
      Illegal parameter [#1]\MessageBreak
      in \string\tf@configure@fontscalingmethod}{}
  }{
    \begingroup
      \edef\tf@@scalemethod{\TF@ER@SCALE}
      \edef\tf@@scalefactor{\TF@UNSCALED}
      \edef\tf@@fontoptions{\csname tf@#1fontoptions\endcsname}

      \tf@ifsuboption{scale}{\tf@@fontoptions}{
        \ifthenelse{\equal{\tf@nextsuboption}{false}}
          {\edef\tf@@scalemethod{\TF@NO@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{true}}
          {\edef\tf@@scalemethod{\TF@EX@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{ex}}
          {\edef\tf@@scalemethod{\TF@EX@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{lowercase}}
          {\edef\tf@@scalemethod{\TF@LC@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{lc}}
          {\edef\tf@@scalemethod{\TF@LC@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{uppercase}}
          {\edef\tf@@scalemethod{\TF@UC@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{uc}}
          {\edef\tf@@scalemethod{\TF@UC@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{figures}}
          {\edef\tf@@scalemethod{\TF@FG@SCALE}}{}
        \ifthenelse{\equal{\tf@nextsuboption}{fig}}
          {\edef\tf@@scalemethod{\TF@FG@SCALE}}{}
        \ifthenelse{\ispositiverealnumber{\tf@nextsuboption}}{
          % Test "normalised" numbers, i.e., test 0 instead of 0.00,
          % 1 instead of 001, ...
          \edef\tf@@scalefactor{\strip@pt\dimexpr\tf@nextsuboption pt\relax}
          \ifthenelse{\equal{\tf@@scalefactor}{0}
                   \OR\equal{\tf@@scalefactor}{1}}{
            \edef\tf@@scalemethod{\TF@NO@SCALE}
          }{
            \edef\tf@@scalemethod{\TF@FX@SCALE}
            \expandafter\xdef\csname tf@#1scalefactor\endcsname{\tf@@scalefactor}
          }
        }{}
      }{
        \edef\tf@@scalemethod{\TF@EX@SCALE}  % default: scale to rm ex height
      }

      % Error handling
      \ifthenelse{\equal{\tf@@scalemethod}{\TF@ER@SCALE}}{
        \TF@PackageError{%
          Invalid `scale:nnn' suboption argument in\MessageBreak
          #1 parameters `\csname tf@#1fontname\endcsname'}{}
      }{
        \ifthenelse{\equal{#1}{textfigures}}{
          \ifthenelse{\equal{\tf@nextsuboption}{lowercase}}
            {\edef\tf@@scalemethod{\TF@ER@SCALE}}{}
          \ifthenelse{\equal{\tf@nextsuboption}{lc}}
            {\edef\tf@@scalemethod{\TF@ER@SCALE}}{}
          \ifthenelse{\equal{\tf@nextsuboption}{uppercase}}
            {\edef\tf@@scalemethod{\TF@ER@SCALE}}{}
          \ifthenelse{\equal{\tf@nextsuboption}{uc}}
            {\edef\tf@@scalemethod{\TF@ER@SCALE}}{}
          \ifthenelse{\equal{\tf@nextsuboption}{figures}}
            {\edef\tf@@scalemethod{\TF@ER@SCALE}}{}
          \ifthenelse{\equal{\tf@nextsuboption}{fig}}
            {\edef\tf@@scalemethod{\TF@ER@SCALE}}{}
          \ifthenelse{\equal{\tf@@scalemethod}{\TF@ER@SCALE}}{
            \TF@PackageError{%
              Invalid `scale:\tf@nextsuboption' suboption argument in\MessageBreak
              option `textfigures=\tf@textfiguresfontname'}{}
          }{}
        }{}
      }

      % Initialise \tf@#1scalefactor if we can at this stage (generally not yet
      % possible if \tf@@scalemethod == \TF@EX@SCALE, \TF@LC@SCALE, etc.)
      \ifthenelse{\equal{\tf@@scalemethod}{\TF@NO@SCALE}}{
        \expandafter\xdef\csname tf@#1scalefactor\endcsname{\TF@UNSCALED}
      }{
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@FX@SCALE}}{
          \expandafter\xdef\csname tf@#1scalefactor\endcsname
            {\strip@pt\dimexpr\tf@nextsuboption pt\relax}
        }{}
      }

      % We can apply fixed (constant literal) value scaling with rm-relative
      % scaling if we managed to save the computed scale factor in the aux file
      % during the previous run and user options haven't changed significantly
      % since then.
      \ifthenelse{\equal{\tf@fontencoding}{\tf@aux@fontencoding}
              \AND\equal{\tf@rmfontname}{\tf@aux@rmfontname}
              \AND\equal{\csname tf@#1fontname\endcsname}
                        {\csname tf@aux@#1fontname\endcsname}
          \AND\NOT\equal{\csname tf@aux@#1scalefactor\endcsname}{}}{
        \expandafter\xdef\csname tf@#1scalefactor\endcsname
          {\csname tf@aux@#1scalefactor\endcsname}
        \edef\tf@@scalefactor{\csname tf@#1scalefactor\endcsname}
        \edef\tf@@scalefactor{\strip@pt\dimexpr\tf@@scalefactor pt\relax}
        \ifthenelse{\equal{\tf@@scalefactor}{1}}
          {\edef\tf@@scalemethod{\TF@NO@SCALE}}
          {\edef\tf@@scalemethod{\TF@FX@SCALE}}
      }{}
      \expandafter\xdef\csname tf@#1scalemethod\endcsname{\tf@@scalemethod}
      \TF@PackageInfo{#1 scale method = \csname tf@#1scalemethod\endcsname}
    \endgroup
  }
}
\forcsvlist{\tf@configure@fontscalingmethod}{sf,tt,math,textfigures}

% Initialise sf, tt, math and textfigures font scale factors
%-----------------------------------------------------------
\newcommand*\tf@initialise@fontscaling[1]{
  % This macro assumes that \tf@configure@fontscalingmethod{#1} has already
  % been executed, i.e., that \tf@#1scalemethod is properly configured
  \ifthenelse{\NOT\equal{#1}{sf}
          \AND\NOT\equal{#1}{tt}
          \AND\NOT\equal{#1}{math}
          \AND\NOT\equal{#1}{textfigures}}{
    \TF@PackageError{Internal error in \TF@PACKAGENAME.sty\MessageBreak
      Illegal parameter [#1]\MessageBreak
      in \string\tf@initialise@fontscaling}{}
  }{
    \edef\tf@@scalemethod{\csname tf@#1scalemethod\endcsname}

    \ifthenelse{\equal{\tf@@scalemethod}{\TF@ER@SCALE}}{
      % User error. Error message was raised when detected. Do nothing here.
    }{
    \ifthenelse{\equal{\tf@@scalemethod}{\TF@NO@SCALE}}{
      % By this stage, \tf@#1scalefactor has already been set to \TF@UNSCALED
      %--- Aux file -----------------------------------------------------------
      \tf@writeauxfile{\string\newcommand*%
                       \string\tf@aux@#1scalefactor{\TF@UNSCALED}}
      %------------------------------------------------------------------------
    }{
    \ifthenelse{\equal{\tf@@scalemethod}{\TF@FX@SCALE}}{
      % By this stage, \tf@#1scalefactor has already been set to
      % the correct fixed value
      %--- Aux file -----------------------------------------------------------
      \tf@writeauxfile{\string\newcommand*\string\tf@aux@#1scalefactor{%
                       \csname tf@#1scalefactor\endcsname}}
      %------------------------------------------------------------------------
    }{
      \begingroup
      \expandafter\xdef\csname tf@#1scalefactor\endcsname{\TF@UNSCALED}

      \edef\tf@@lc{bdfhklt}
      \edef\tf@@uc{WXY}
      \edef\tf@@fig{08}

      % For reference font (rm) relative scaling purposes, select (and
      % therefore load) an exceedingly unlikely user fontsize close to
      % \normalsize font size
      \normalsize
      \edef\tf@@temp{\strip@pt\dimexpr\f@size pt + 0.027182pt\relax}%
      \fontsize{\tf@@temp}{\f@baselineskip}

      \usefont{\encodingdefault}{\rmdefault}{m}{n}
      \ifthenelse{\equal{\tf@@scalemethod}{\TF@EX@SCALE}}
        {\@tempdima=\fontdimen5\font}{}
       % note that with many fonts, lc, uc & fig scaling methods
       % are not particularly reliable
      \ifthenelse{\equal{\tf@@scalemethod}{\TF@LC@SCALE}}
        {\setbox0=\hbox{\tf@@lc}\@tempdima=\ht0}{}
      \ifthenelse{\equal{\tf@@scalemethod}{\TF@UC@SCALE}}
        {\setbox0=\hbox{\tf@@uc}\@tempdima=\ht0}{}
      % note that we scale to rm font figures size, even if a
      % substitute osf is in force
      \ifthenelse{\equal{\tf@@scalemethod}{\TF@FG@SCALE}}
        {\setbox0=\hbox{\tf@@fig}\@tempdima=\ht0}{}

      \ifthenelse{\equal{#1}{textfigures}}{
        \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@XF}}
          {\usefont{\tf@substosffontencoding}{\tf@substosffont}{m}{n}}
          {\usefont{\encodingdefault}{\rmdefault}{m}{n}}  % redundant
      }{
        \ifthenelse{\equal{#1}{math}}{
          % handled below
        }{
          % sf and tt
          \usefont{\encodingdefault}{\csname #1default\endcsname}{m}{n}
        }
      }

      \ifthenelse{\equal{#1}{math}}{
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@EX@SCALE}}{
          \setbox0=\hbox{$x$} % to ensure font is selected
          \@tempdimb=\fontdimen5\textfont\tf@mathfontfamily
          \tf@ifsuboption{ex}{\tf@mathfontoptions}{
            \ifthenelse{\equal{\tf@nextsuboption}{alt}}{
              \@tempdimb=\ht0
            }{}
          }{}
        }{}
         % lc, uc and fig math scaling are ridiculously unreliable
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@LC@SCALE}}
          {\setbox0=\hbox{$\tf@@lc$}\@tempdimb=\ht0}{}
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@UC@SCALE}}
          {\setbox0=\hbox{$\tf@@uc$}\@tempdimb=\ht0}{}
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@FG@SCALE}}
          {\setbox0=\hbox{$\tf@@fig$}\@tempdimb=\ht0}{}
      }{
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@EX@SCALE}}
          {\@tempdimb=\fontdimen5\font}{}
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@LC@SCALE}}
          {\setbox0=\hbox{\tf@@lc}\@tempdimb=\ht0}{}
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@UC@SCALE}}
          {\setbox0=\hbox{\tf@@uc}\@tempdimb=\ht0}{}
        \ifthenelse{\equal{\tf@@scalemethod}{\TF@FG@SCALE}}
          {\setbox0=\hbox{\tf@@fig}\@tempdimb=\ht0}{}
      }

      \edef\tf@@scalefactor
        {\strip@pt\dimexpr \p@ * \@tempdima / \@tempdimb\relax}

      \ifbool{tf@#1scaledatloadtime}{
        \TF@PackageError{%
          INTERNAL PACKAGE ERROR: flag `tf@#1scaledatloadtime'\MessageBreak
          tested true in command `\tf@initialise@fontscaling',\MessageBreak
          Please report this error to the package maintainer}{}
      }{
        % Font wasn't scaled at load time, most likely because we haven't
        % configured the font for load time scaling and/or we haven't
        % saved the scale factor and reloaded it from the aux file yet.
        \expandafter\xdef\csname tf@#1scalefactor\endcsname{\tf@@scalefactor}
        %--- Aux file ---------------------------------------------------------
        \tf@writeauxfile{\string\newcommand*\string\tf@aux@#1scalefactor{%
          \csname tf@#1scalefactor\endcsname}}
        %----------------------------------------------------------------------
        \ifthenelse{\NOT\equal{\csname tf@#1scalemethod\endcsname}{\TF@FX@SCALE}}{
          \ifthenelse{\equal{#1}{sf}\OR\equal{#1}{tt}}{
            % math and (generally) text figures do not require
            % two pass font scaling
            \tf@notifyauxfiledirty{#1}
          }{}
        }{}
      }
      \endgroup
    }}}
  }
  \TF@PackageInfo{#1 scale factor = \csname tf@#1scalefactor\endcsname}
}

% Initialise math size declarations
%----------------------------------
\newcommand*\tf@initialise@mathsizes{
  \newcommand*\tf@@scalemathfont[1]{
    \begingroup
      \csname ##1\endcsname
      \let\oldf@size\f@size
      \dimen@\f@size\p@
      \@tempdima\tf@mathscalefactor\dimen@
      \edef\f@size{\strip@pt\@tempdima}
      \calculate@math@sizes
      \csname S@\f@size\endcsname
      \let\f@size\oldf@size

      \expandafter\xdef\csname S@@tf\f@size\endcsname{\tf@size}
      \expandafter\xdef\csname S@@sf\f@size\endcsname{\sf@size}
      \expandafter\xdef\csname S@@ssf\f@size\endcsname{\ssf@size}

      \expandafter\gdef\csname S@\f@size\endcsname{%
        \xdef\tf@size{\csname S@@tf\f@size\endcsname}%
        \xdef\sf@size{\csname S@@sf\f@size\endcsname}%
        \xdef\ssf@size{\csname S@@ssf\f@size\endcsname}%
        \TF@PackageDebugInfoNoLine{Math size \string\S@\f@size: %
            [\f@size][\tf@size][\sf@size][\ssf@size]}%
      }
    \endgroup
  }
  \forcsvlist{\tf@@scalemathfont}
    {tiny,scriptsize,footnotesize,small,normalsize,large,Large,LARGE,huge,Huge}
  \ifthenelse{\classloaded{memoir}}{
    \forcsvlist{\tf@@scalemathfont}{miniscule,HUGE}
  }{}
  \booltrue{tf@mathscaledatloadtime}
}

% Text figures spacing (tracking). User configurable by setting `spacing:nnn'
% suboption in `textfigures' package option.  E.g.,
%   textfigures=kpfonts:light:spacing:-20
% nnn may be any integer from -1000 to 1000. Given value n, the substitute
% text figures font will be kerned nnn/1000em. Requires the microtype package
% -- complains if not already loaded.
%----------------------------------------------------------------------------
\newcommand*\tf@textfiguresspacing{0}
\tf@newbool{tf@textfiguresspacingimplicit}{true}

\newcommand*\tf@initialise@textfiguresfontspacing{
  \tf@ifsuboption{spacing}{\tf@textfiguresfontoptions}{
    \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@XF}}{
      \ifthenelse{\isinteger{\tf@nextsuboption}
            \AND\(\tf@nextsuboption > -1001\)
            \AND\(\tf@nextsuboption <  1001\)}{
          \xdef\tf@textfiguresspacing{\tf@nextsuboption}
          \boolfalse{tf@textfiguresspacingimplicit}
      }{
        \TF@PackageError{%
          Invalid `spacing:nnn' suboption argument in your\MessageBreak
          package option `textfigures=\tf@textfiguresfontname'.\MessageBreak
          Integer `nnn' must be between -1000 and 1000}{}
      }
    }{
      \TF@PackageError{%
        Ignoring package suboption `spacing:nnn' in\MessageBreak
        `textfigures=\tf@textfiguresfontname'}{}
    }
  }{}

  % set textfigures=...:spacing:1... suboption to take the <true> branch
  % (microtype won't apply outer kerning if spacing == 0, we just follow
  % along with that)
  \ifthenelse{\NOT\equal{\tf@textfiguresspacing}{0}}{
    \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@XF}}{
      \@ifpackageloaded{microtype}{
        \tf@ifsuboption{lkern}{\tf@textfiguresfontoptions}{
          \ifthenelse{\isinteger{\tf@nextsuboption}}{
            \edef\tf@MTtrackingL{\tf@nextsuboption}
          }{
            \TF@PackageError{%
              Invalid `lkern:\tf@nextsuboption' suboption value\MessageBreak
              (`\tf@nextsuboption' should be an integer)}{}
          }
        }{
          \numdef\tf@MTtrackingL{\tf@textfiguresspacing}
        }
        \tf@ifsuboption{rkern}{\tf@textfiguresfontoptions}{
          \ifthenelse{\isinteger{\tf@nextsuboption}}{
            \edef\tf@MTtrackingR{\tf@nextsuboption}
          }{
            \TF@PackageError{%
              Invalid `rkern:\tf@nextsuboption' suboption value\MessageBreak
              (`\tf@nextsuboption' should be an integer)}{}
          }
        }{
          \numdef\tf@MTtrackingR{\tf@textfiguresspacing}
        }
        \SetTracking[outer kerning={\tf@MTtrackingL,\tf@MTtrackingR}]
          {encoding=*, family=\tf@substosffont}
          {\tf@textfiguresspacing}
      }{
        \TF@PackageError{%
          The microtype package must be loaded before\MessageBreak
          loading the typeface package if suboption\MessageBreak
          `spacing:nnn' in `textfigures=\tf@textfiguresfontname'\MessageBreak
          is to have any effect. Ignoring suboption `spacing'}{}
        \renewcommand*\tf@textfiguresspacing{0}
      }
    }{}
  }{}
  %--- Aux file ---------------------------------------------------------------
  \tf@writeauxfile{\string\newcommand*\string\tf@aux@textfiguresspacing{%
    \tf@textfiguresspacing}}
  %----------------------------------------------------------------------------
}

% Load remaining Required Packages
% ================================
\TF@PackageDebugInfo{Loading remaining required packages...}

\RequirePackage{scalefnt}
\usepackage{anyfontsize}

\ifbool{tf@debug}{
  \@ifpackageloaded{xcolor}{\relax}  % colour font substitutions when debugging
    {\RequirePackage[dvipsnames,svgnames,x11names]{xcolor}}
}

% More housekeeping: additional configuration if debugging
%---------------------------------------------------------
\ifbool{tf@debug}{
  \TF@PackageDebugInfo{Configuring extra debug routines...}
  \listfiles % list the names of files read during this job run
}{}

% Encodings management
%---------------------
\TF@PackageDebugInfo{Configuring encodings...}

\newcommand*\tf@@loadencpackage[2]{
  % #1 package name (e.g., inputenc)
  % #2 typeface option name (e.g., \tf@inputencoding)
  \edef\tf@@packagename{#1}
  \edef\tf@@optionname{\csname tf@#2\endcsname}
  \edef\tf@@optionstring{\csname tf@#2string\endcsname}
  \ifthenelse{\equal{\tf@@optionname}{\TF@DONTLOAD}
           \OR\equal{\tf@@optionname}{\TF@IGNORE}}{
    \relax
  }{
    \ifthenelse{\NOT\packageloaded{\tf@@packagename}}{
      \TF@PackageDebugInfo{Loading `#1' with parameters [\tf@@optionname]}
      \usepackage[\tf@@optionname]{\tf@@packagename}
    }{
      \TF@PackageWarningNoLine{%
        The `#1' package is already loaded. Please\MessageBreak
        check that its load-time options correspond with\MessageBreak
        your needs. Package option `#2=\tf@@optionstring'\MessageBreak
        ignored. (Set `#2=\TF@DONTLOAD' to make\MessageBreak
        this warning go away)}
    }
  }
}
\tf@@loadencpackage{inputenc}{inputencoding}
\tf@@loadencpackage{textcomp}{textcomp}
\ifbool{pdf}{
  \tf@@loadencpackage{cmap}{cmap}
}{}

% Even with cmap loaded, some pdf readers (notably including Adobe Acrobat)
% are unable to search for or copy ligatures and oldstyle nums from
% certain fonts. This macro provides a fix that often works. It depends
% on the availability of `glyphtounicode.tex' in your TEXMF tree.
% It is not guaranteed to work always since other factors might intervene,
% e.g., an odd fontencoding (try T1 instead), the actual pdf reader being
% used to view the document, which way the wind is blowing, etc.
\newcommand*\tf@pdfglyphcorrection[1]{
  \ifbool{pdf}{
    \IfFileExists{glyphtounicode}{
      \TF@PackageInfoNoLine{%
        Correction applied to fix #1 font\MessageBreak
        ligatures and old style figures search\MessageBreak
        and copy problems. It might or might\MessageBreak
        not work, depending on your pdf reader}
      \input{glyphtounicode}
      \pdfglyphtounicode{f_f}{FB00}
      \pdfglyphtounicode{f_i}{FB01}
      \pdfglyphtounicode{f_l}{FB02}
      \pdfglyphtounicode{f_f_i}{FB03}
      \pdfglyphtounicode{f_f_l}{FB04}
      \pdfgentounicode=1
    }{
      \TF@PackageInfoNoLine{%
        `glyphtounicode.tex' not found. Correction to\MessageBreak
        #1 font ligatures and old style figures search\MessageBreak
        and copy problem has not been applied}
    }
  }{}
}

\ifthenelse{\equal{\tf@fontencoding}{\TF@DONTLOAD}
         \OR\equal{\tf@fontencoding}{\TF@IGNORE}}{
  % Sneaky fontenc disappears itself from LaTeX's loaded packages
  % record. Check for the existence of \@ifl@ter@@ rather than trying
  % \@ifpackageloaded{fontenc}
  \ifthenelse{\isundefined{\@ifl@ter@@}}{
    \TF@PackageInfoNoLine{%
      The `fontenc' package does not appear to be loaded,\MessageBreak
      yet you have elected not to load it at this time.\MessageBreak
      Are you certain that this is a good idea?}
  }{}
}{
  \TF@PackageDebugInfo{Loading `fontenc' with parameters [\tf@fontencoding]}
  \usepackage[\tf@fontencoding]{fontenc}
  \TF@PackageDebugInfo{\string\encodingdefault=\encodingdefault}
}

% Namespace initialisation
% ========================
\TF@PackageDebugInfo{Initialising namespaces...}

% Rationalise typeface options namespace (typeface aliases)
\tf@rationalisefontnames   % constructed by \newtypeface commands

% Zero out the font name strings
\newcommand*\tf@rmprintname{undefined}
\newcommand*\tf@sfprintname{undefined}
\newcommand*\tf@ttprintname{undefined}
\newcommand*\tf@mathprintname{undefined}
\newcommand*\tf@symbolsprintname{undefined}
\newcommand*\tf@textfiguresprintname{undefined}

% Zero out the self-registered macro names saved whenever a font is loaded
% (see the \newtypeface command, above, to see how these are constructed)
\newcommand*\tf@rmfontloadcommand{undefined}
\newcommand*\tf@sffontloadcommand{undefined}
\newcommand*\tf@ttfontloadcommand{undefined}
\newcommand*\tf@mathfontloadcommand{undefined}
\newcommand*\tf@symbolsfontloadcommand{undefined}
\newcommand*\tf@textfiguresfontloadcommand{undefined}

% Discard any previously defined math symbols fonts, more or less
\let\glb@currsize\relax

% Text figures management
% =======================
% Lowercase (text) numerals -- you almost certainly won't use these unless
% your font natively provides old style figures. If it does, then all you need
% do is to include `textfigures' in your package options. If your selected
% font includes old style figures, to turn them on throughout your document
% (except if set in the `liningnums' environment). If your font does not
% natively provide old style figures, specifying `textfigures=xxx' (where xxx
% is `palatino`, `adobeminionpro' or any other font configured for this) will
% attempt to use the old style figures from the xxx font instead. The catch is
% that to use the (non-native) substitute text figures font, you have to place
% your numbers in a `textstylenums` environment, e.g.,
%   \begin{textstylenums}1234\end{textstylenums}
% or pass them to the `\textstylenums' command. Unlike LaTeX's standard
% `\oldstylenums' command, you can include some punctuation characters
% alongside figures, e.g., you can include `$', hyphen, en dash, em dash,
% full stop, comma, etc., depending on the font. However, since the success of
% this is font-dependant, you probably should avoid this writing style.
%
% WARNING: DO NOT ATTEMPT TO USE \begin{textstylenums}....\end{textstylenums}
% OR \textstylenums IN MATHS ENVIRONMENTS! IT WILL END IN TEARS!
%
% Note that if a substitute font is specified, `textnums' substitutes one font
% family for another, whereas `oldstylenums' does not (it uses the old style
% figures from the currently selected font if they are available, or typesets
% little black rectangles otherwise). Converting your document to use the
% `textnums' environment or `\textstylenums' command needn't require much
% effort if you write a wildcard based search and replace routine in your
% document editor to automate this for you (making sure to avoid numbers in
% TeX command parameters, etc).
%------------------------------------------------------------------------------
\TF@PackageDebugInfo{Initialising textfigures commands...}

% Useful author-level boolean expressions that can be used in
% \ifthenelse tests. E.g., \ifthenelse{\NOT\isliningnums}{...}{...}
\def\isliningnums{\equal{\tf@osf@method}{\TF@OSF@LF}}

% Provide the default (stub) version of liningnums environment that (when
% fleshed out on a per font basis in the font commands below) switches to
% lining (uppercase) figures whenever the environment is in effect.
\tf@newbool{tf@liningnums}{false}                                              % TODO: should we make this nestable?
\newenvironment{liningnums}
  {\booltrue{tf@liningnums}}
  {\boolfalse{tf@liningnums}}
\newcommand*\tf@resetliningnumsenvironment{
  \renewenvironment{liningnums}
    {\booltrue{tf@liningnums}}
    {\boolfalse{tf@liningnums}}
}

% Helper routine to redefine liningnums environment when using native osf
\newcommand*\tf@define@liningfigures[1]{
  % #1 is the font family name for lining figures, e.g., pplx (vs pplj)
  \renewenvironment{liningnums}{%
    \notbool{tf@suppressfiguressubstitution}{%
      \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@LININGNUMS}}{}%
      \fontfamily{#1}\selectfont%
    }{}%
  }{%
    \boolfalse{tf@liningnums}%
  }
}

% Helper routine to define the \oldstylenums command for selected font families
\newcommand*\tf@define@oldstylenums@cmd[1]{
  % #1 is the font family name for old style figures, e.g., pplj (vs pplx)
  \renewcommand\oldstylenums[1]{{\fontfamily{#1}\selectfont ##1}}
}

% Access old style figures via TS1 font encoding
\newcommand*\tf@TSencodedosf{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}
           \OR\equal{\tf@osf@method}{\TF@OSF@SC}}{
    \renewcommand*\tf@osf@method{\TF@OSF@TS}
    \tf@resetliningnumsenvironment
  }{}
}

% Access old style figures by switching to small caps
\newcommand*\tf@SCencodedosf{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}
           \OR\equal{\tf@osf@method}{\TF@OSF@TS}}{
    \renewcommand*\tf@osf@method{\TF@OSF@SC}
    \tf@resetliningnumsenvironment
  }{}
}

% Advise users that their selected font does not support old style figures
\newcommand\TF@NativeOSFError{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
    \TF@PackageError{Option `typeface=\tf@rmfontname' does not\MessageBreak
       support `textfigures=\tf@textfiguresfontname'.\MessageBreak
       Setting `textfigures=false'}{}
    \renewcommand*\tf@osf@method{\TF@OSF@LF}
    \tf@resetliningnumsenvironment
    \renewcommand*\tf@textfiguresfontname{false}
  }{}
}

% Advise users that the selected font ONLY supports old style figures (rare!)
\newcommand\TF@NativeLFError{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@LF}}{
    \TF@PackageError{Option `typeface=\tf@rmfont' does not\MessageBreak
       support `textfigures=\tf@textfiguresfontname' (default).\MessageBreak
       Setting `textfigures=oldstylefigures'}{}
    \renewcommand*\tf@osf@method{\TF@OSF@JF}
    \tf@resetliningnumsenvironment
    \renewcommand*\tf@textfiguresfontname{oldstylefigures}
  }{}
}

% Advise users that their selected math font kills support for old style figures
\newcommand\TF@NativeOSFMathError{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@JF}}{
    \TF@PackageError{Option `typeface=\tf@rmfontname' does not\MessageBreak
       support combining `mathtypeface=\tf@mathfontname'\MessageBreak
       and `textfigures=\tf@textfiguresfontname'.\MessageBreak
       Setting `textfigures=false'}{}
    \renewcommand*\tf@osf@method{\TF@OSF@LF}
    \tf@resetliningnumsenvironment
    \renewcommand*\tf@textfiguresfontname{false}
  }{}
}

% Set up our INTERNAL \tf@textstylenums declaration and the
% AUTHOR textnums environment and \textstylenums command
%----------------------------------------------------------
\newcommand*\tf@initialise@textfiguresfontcommands{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@TS}}{
  % Access old style figures via TS1 font encoding
    \newcommand*\tf@textstylenums{%
      \ifthenelse{\NOT\boolean{tf@liningnums}
              \AND\NOT\boolean{tf@suppressfiguressubstitution}}{%
        \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@TS}}{}%
        \fontencoding{TS1}\selectfont%
      }{}%
    }
  }{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@SC}}{
    % Access old style figures via small caps
    \newcommand*\tf@textstylenums{%
      \ifthenelse{\NOT\boolean{tf@liningnums}
              \AND\NOT\boolean{tf@suppressfiguressubstitution}}{%
        \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@SC}}{}%
        \scshape%
      }{}%
    }
  }{
  \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@XF}}{
    % Access old style figures via substitute font
    \providecommand*\lsstyle{}  % create no-op if microtype isn't loaded
    \newcommand*\tf@textstylenums{%
      \ifthenelse{\NOT\boolean{tf@liningnums}
              \AND\NOT\boolean{tf@suppressfiguressubstitution}}{%
        \ifthenelse{\NOT\equal{\tf@textfiguresspacing}{0}
                    \AND\value{tf@enable@textnumspacing} = 0}%
          {\lsstyle}{}%  % microtype-based text figures spacing
        \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@XF}}{}%
        \notbool{tf@textfiguresscaledatloadtime}
          {\scalefont{\tf@textfiguresscalefactor}}{}%
        \fontencoding{\tf@substosffontencoding}%
        \fontfamily{\tf@substosffont}%
        \selectfont%
      }{}%
    }
  }{
    % Otherwise, access old style figures natively (i.e., deliver
    % whatever the loaded font provides, which is either text
    % figures or not)
    \newcommand*\tf@textstylenums{%
      \ifthenelse{\NOT\boolean{tf@liningnums}
              \AND\NOT\boolean{tf@suppressfiguressubstitution}}{%
        \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@JF}}{}%
      }{}%
    }
  }}}
  \robustify{\tf@textstylenums}

  % Define AUTHOR-LEVEL textnums environment
  %-----------------------------------------
  \newenvironment{textnums}{%
    \tf@textstylenums%
  }{}

  % ... and AUTHOR-LEVEL \textstylenums (syn: \tsf) command
  %--------------------------------------------------------
  \newcommand\textstylenums[1]{%
    \begingroup%
    \begin{textnums}##1\end{textnums}%
    \endgroup%
  }

  \newcommand\tsf[1]{%
    \begingroup%
    \begin{textnums}##1\end{textnums}%
    \endgroup%
  }

  % ... and AUTHOR-LEVEL \liningstylenums (syn: \lsf) command
  %----------------------------------------------------------
  \newcommand\liningstylenums[1]{%
    \begingroup%
    \begin{liningnums}##1\end{liningnums}%
    \endgroup%
  }

  \newcommand\lsf[1]{%
    \begingroup%
    \begin{liningnums}##1\end{liningnums}%
    \endgroup%
  }

  % AUTHOR-LEVEL commands to enable/disable textnums letterspacing
  % (uses a counter for reentrancy)
  \newcounter{tf@enable@textnumspacing}
  \newcommand*\enabletextnumspacing{\addtocounter{tf@enable@textnumspacing}{1}}
  \newcommand*\disabletextnumspacing{\addtocounter{tf@enable@textnumspacing}{-1}}
  \newcommand*\reenabletextnumspacing{\setcounter{tf@enable@textnumspacing}{0}}
  \reenabletextnumspacing
}

% Typeface selection
% ==================
\TF@PackageDebugInfo{Loading typefaces in load order [\tf@fontloadorder] ...}

% Font loading commands are (generally) processed in this order:
%   textfigures, symbols, math, roman, sans serif, teletype
%
% Where possible, fonts are loaded using std packages (\tf@usefontpackage{...}),
% otherwise they are loaded via direct commands (\renewcommand\rmdefault{...}).
% Many packages load "matching" fonts, e.g., one might load courier tt
% alongside the rm font that it specifies. The typeface package attempts to
% reverse this when it can in order to ensure that when users specify
% particular fonts, that is in fact what they get, rather than, for example,
% getting the "matching" font decided by a font package author some long time ago.
%
% Note that when loading multiple font packages one after the other, glyph
% definitions can potentially collide. When this happens, later loaded
% glyphs can (often silently) override earlier definitions or in other case
% simply trigger errors. You should (must) always thoroughly check your output
% pdf document to ensure that the body text, math, symbols and (potential) text
% figures substitution fonts work together to produce desired results. Not all
% combinations will produce satisfactory output.
%
% The "textfigures, symbols, math, roman, sans serif, teletype" font
% load order should not be wholly relied upon. To obviate the "clash of
% glyphs" problem as best we can, this package will, for example, load the
% roman font family before loading math where a particular math package
% requires the standard load ordering to change. We might even, in extreme
% cases, load the roman font, then math, then to counteract a certain side
% effect, reload roman to re-establish its original configuration. Specific
% behavioural rules for individual situations are set out in the code above.
% Bottom line, however: we try to achieve the combination of typefaces as the
% end-user most likely intended.
%------------------------------------------------------------------------------
% Construct and execute font load commands macro in specified font load order
\newcommand*\tf@loadfonts{}
\renewcommand*\do[1]{
  \ifcsdef{beforeloading#1}
    {\g@addto@macro{\tf@loadfonts}{\csname beforeloading#1\endcsname}}{}
  \g@addto@macro{\tf@loadfonts}{\csname tf@load#1typeface\endcsname}
  \ifcsdef{afterloading#1}
    {\g@addto@macro{\tf@loadfonts}{\csname afterloading#1\endcsname}}{}
}
\expandafter\tf@doColonSeparatedList\expandafter{\tf@fontloadorder}
\tf@loadfonts

% After loading fonts, set up font scaling ...
\forcsvlist{\tf@initialise@fontscaling}{sf,tt,math,textfigures}

% ... and math size declarations ...
\tf@initialise@mathsizes

% ... and textfigures font spacing ...
\tf@initialise@textfiguresfontspacing

% ... and text figures author-level commands
\tf@initialise@textfiguresfontcommands

% Finally, hook our work into LaTeX's font selection machinery
% ============================================================

\TF@PackageDebugInfo{Hooking font scaling into LaTeX commands ...}

% Guard against the (presumably exceedingly unlikely) event where sf and
% tt are 1) the same font, yet 2) are being scaled by different amounts
\tf@newbool{tf@@sfttscaleconflict}{false}
\ifthenelse{\equal{\tf@sfdefault}{\tf@ttdefault}}{
  \@tempdima=\tf@sfscalefactor\p@
  \@tempdimb=\tf@ttscalefactor\p@
  \ifthenelse{\NOT\lengthtest{\@tempdima = \@tempdimb}}{
    \booltrue{tf@@sfttscaleconflict}
    \TF@PackageError{%
      Requested sans serif and teletypewriter fonts are\MessageBreak
      identical except for differing scale factors\MessageBreak
      [sf=\tf@sfscalefactor, tt=\tf@ttscalefactor].\MessageBreak
      **** This isn't going to work. Please help\MessageBreak
      **** me out. I don't know what to do}{}
    \global\boolfalse{tf@sfscaledatloadtime}
    \global\boolfalse{tf@ttscaledatloadtime}
  }{}
}{}

\def\empty@sfcnt#1{%
  % Subclass LaTeX's default font size function, inserting sf/tt               % TODO: confirm this works with lua, xetex
  % scale factors into \optional@arg if it is empty at the time
  \def\tf@@sizeinfofunction{#1}%
  \tf@newbool{tf@@sffamily}{false}%
  \tf@newbool{tf@@ttfamily}{false}%
  \ifdefstrequal{\tf@sfdefault}{\f@family}{\booltrue{tf@@sffamily}}{}%
  \ifdefstrequal{\tf@ttdefault}{\f@family}{\booltrue{tf@@ttfamily}}{}%
  %
  % Last chance for font load functions to affect load-time scaling
  \tf@empty@sfcnt@hook%
  %
  % So long as it's empty, set \optional@arg to appropriate scale factor
  \ifthenelse{\equal{\optional@arg}{}\AND\NOT\boolean{tf@@sfttscaleconflict}}{%
    \ifthenelse{\boolean{tf@@sffamily}
        \AND\NOT\equal{\tf@sfscalemethod}{\TF@NO@SCALE}}{%
      \edef\optional@arg{\tf@sfscalefactor}%
      \def\tf@@sizeinfofunction{\@font@info}%
      \xdef\tf@sfscalemethod{\TF@FX@SCALE}%
      \global\booltrue{tf@sfscaledatloadtime}%
      \TF@PackageInfo{%
        Scaling sf font `\curr@fontshape' (\tf@sfscalefactor*\f@size pt)}%
    }{}%
    \ifthenelse{\boolean{tf@@ttfamily}
        \AND\NOT\equal{\tf@ttscalemethod}{\TF@NO@SCALE}}{%
      \edef\optional@arg{\tf@ttscalefactor}%
      \def\tf@@sizeinfofunction{\@font@info}%
      \xdef\tf@ttscalemethod{\TF@FX@SCALE}%
      \global\booltrue{tf@ttscaledatloadtime}%
      \TF@PackageInfo{%
        Scaling tt font `\curr@fontshape' (\tf@ttscalefactor*\f@size pt)}%
    }{}%
  }{}%
  %
  \@tempdimb \f@size\p@%
  \ifx\optional@arg\@empty%
  \else%
    \@tempdimb \optional@arg\@tempdimb%
    \tf@@sizeinfofunction{Font\space shape\space `\curr@fontshape'\space
    will\space be\MessageBreak
    scaled\space to\space size\space \the\@tempdimb}%
  \fi%
  \edef\external@font{\mandatory@arg\space at\the\@tempdimb}%
}

\tf@newbool{tf@suppressfiguressubstitution}{false}
\newcommand*\enablefiguressubstitution{%
  \boolfalse{tf@suppressfiguressubstitution}%
}
\newcommand*\disablefiguressubstitution{%
  \booltrue{tf@suppressfiguressubstitution}%
}

\let\tf@oldrmfamily\rmfamily
\renewrobustcmd\rmfamily{%
  \enablefiguressubstitution%      % we enable text figures substitution
  \tf@oldrmfamily%                 % even if user has changed \rmdefault
  \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@RM}}{}%
}

\let\tf@oldsffamily\sffamily
\renewrobustcmd\sffamily{%
  \disablefiguressubstitution%
  \tf@oldsffamily%
  \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@SF}}{}%
}

\let\tf@oldttfamily\ttfamily
\renewrobustcmd\ttfamily{%
  \disablefiguressubstitution%
  \tf@oldttfamily%
  \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@TT}}{}%
}

% Provide AUTHOR level read-only access to several internal values
%-----------------------------------------------------------------
\xdef\rmprintname{\tf@rmprintname}
\xdef\sfprintname{\tf@sfprintname}
\xdef\ttprintname{\tf@ttprintname}
\xdef\mathprintname{\tf@mathprintname}
\xdef\symbolsprintname{\tf@symbolsprintname}
\xdef\textfiguresprintname{\tf@textfiguresprintname}

% Package info and typeface testing commands
% ==========================================

\ifbool{tf@printinfo}{
  \TF@PackageDebugInfo{Configuring print info commands...}

  \@ifpackageloaded{array}{\relax}{\usepackage{array}}
  \everymath=\expandafter{%
    \the\everymath%
    \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@MATH}}{}%
  }

  \providecommand*\tfabc{abcdefghijklmnopqrstuvwxyz}
  \providecommand*\tfABC{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
  \providecommand*\tfdigits{0123456789}
  \providecommand*\tftext{abcdefghijklmnopqrstuvwxyz %
    ct st th ff fi fj fl ffi ffl ft ij \ae\ \oe\ \"o\ \~e\ wavaw %
    {\large large} {\footnotesize footnotesize}}
  \providecommand*\tfTEXT{ABCDEFGHIJKLMNOPQRSTUVWXYZ %
    Ct St Th Ff Fi Fj Fl Ffi Ffl IJ \AE\ \OE\ \"O\ \~E\ WAVAW}
  \providecommand*\tfpunctuation{\$ \% . , : ; ? \& ! \# = ( \_ ) + - -- ---}

  \newcommand\tfprintinfopage{%
    \pagestyle{empty}%
    \raggedbottom%
    \tfprintpackageoptions%
    \tfprintinfo%
    \tfprinttext{rm}%
    \tfprinttext{sf}%
    \tfprinttext{tt}%
    \tfprintfigures{rm}%
    \tfprinttextalphabets%
  }

  \newcommand*\tf@@printfontname[1]{%            % helper command
    \ifthenelse{
      \equal{\csname tf@#1fontdefaultstatus\endcsname}{\TF@IMPLICITDEFAULT}}{%
        <\TF@DEFAULT> \tf@@printfontname@@helper{#1}%
    }{%
    \ifthenelse{
      \equal{\csname tf@#1fontdefaultstatus\endcsname}{\TF@EXPLICITDEFAULT}}{%
        \TF@DEFAULT\space\tf@@printfontname@@helper{#1}%
    }{%
    \ifthenelse{
      \equal{\csname tf@#1fontdefaultstatus\endcsname}{\TF@EXPLICITOTHER}}{%
        \csname tf@#1fontname\endcsname%
    }{}}}
  }

  \newcommand*\tf@@printfontname@@helper[1]{%    % helper of helper command
      \ifthenelse{\NOT\equal{\csname tf@#1fontname\endcsname}{\TF@DEFAULT}}
        {(\csname tf@#1fontname\endcsname\space-- see `\TF@CONFIGFILE')}
        {}%
  }

  \newcommand\tfprintpackageoptions{{%
    \rmfamily\selectfont\noindent%
    \texttt{typeface}\ package options:\par\noindent%
    \begin{tabular}{@{}
                    >{\ttfamily}l
                    >{\ttfamily}l@{\hspace{2.5em}}
                    >{\ttfamily}l
                    >{\ttfamily}l@{}}
%------------------------------------------------------------------------------
      typeface          & \tf@@printfontname{rm}                              &
      fontencoding      &
      \ifthenelse{\equal{\tf@fontencodingdefaultstatus}{\TF@IMPLICITDEFAULT}}{%
        <\TF@DEFAULT> (\TF@DEFAULTFONTENCODING)%
      }{%
        \tf@fontencodingstring\space%
        \ifthenelse{\equal{\tf@fontencodingdefaultstatus}{\TF@EXPLICITDEFAULT}
                 \OR\value{tf@fontencodingsuboptionscount} > 1}{%
          (\tf@fontencodingprimary)%
        }{}%
      }                                                                      \\
%------------------------------------------------------------------------------
      textfigures       & \tf@@printfontname{textfigures}%
                          \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@TS}}
                            {(TS1)}
                            {\ifthenelse{\equal{\tf@osf@method}{\TF@OSF@SC}}
                              {(smallcaps)}
                              {}%
                            }                                                 &
      inputencoding      &
      \ifthenelse{\equal{\tf@inputencodingdefaultstatus}{\TF@IMPLICITDEFAULT}}{%
        <\TF@DEFAULT> (\TF@DEFAULTINPUTENCODING)%
      }{%
        \tf@inputencodingstring\space%
        \ifthenelse{\equal{\tf@inputencodingdefaultstatus}{\TF@EXPLICITDEFAULT}}{%
          (\tf@inputencoding)%
        }{}%
      }                                                                      \\
%------------------------------------------------------------------------------
      sanstypeface      & \tf@@printfontname{sf}                              &
      textcomp      &
      \ifthenelse{\equal{\tf@textcompdefaultstatus}{\TF@IMPLICITDEFAULT}}{%
        <\TF@DEFAULT> (\TF@DEFAULTTEXTCOMP)%
      }{%
        \tf@textcompstring\space%
        \ifthenelse{\equal{\tf@textcompdefaultstatus}{\TF@EXPLICITDEFAULT}}{%
          (\tf@textcomp)%
        }{}%
      }                                                                      \\
%------------------------------------------------------------------------------
      monotypeface      & \tf@@printfontname{tt}                              &
      fontloadorder     & \ifbool{tf@fontloadorderimplicit}{<}{}%
                          \ifthenelse{\equal{\tf@fontloadorder}{\TF@DEFAULTFONTLOADORDER}}
                            {\TF@DEFAULT}
                            {\tf@fontloadorder}%
                          \ifbool{tf@fontloadorderimplicit}{>}{}             \\
%------------------------------------------------------------------------------
      mathtypeface      & \tf@@printfontname{math}                            &
      printinfo         & \ifbool{tf@printinfoimplicit}{<}{}%
                          \ifbool{tf@printinfo}{true}{false}%
                          \ifbool{tf@printinfoimplicit}{>}{}                 \\
%------------------------------------------------------------------------------
      symbolstypeface   & \tf@@printfontname{symbols}                         &
      debug             & \ifbool{tf@debugimplicit}{<}{}%
                          \ifbool{tf@debug}{true}{false}%
                          \ifbool{tf@debugimplicit}{>}{}                     \\
%------------------------------------------------------------------------------
    \end{tabular}%
    \par\medskip%
  }}

  \newcommand\tfprintinfo{{%
    \noindent%
    \begin{tabular}{@{}lllrrrl@{}}
      \ttfamily Family   & \ttfamily Typeface & \ttfamily \TeX\ Name &
                           \ttfamily em size  & \ttfamily ex size    &
                           \ttfamily scale    & \ttfamily scale time \\
      \rmfamily Roman &
      \rmfamily \tf@rmprintname &
      \rmfamily \fontname\the\font &
      \rmfamily \tf@roundvi@pt{\the\fontdimen6\font} &
      \rmfamily \tf@roundvi@pt{\the\fontdimen5\font} &
      \rmfamily \tf@roundvi{1}%
                  \ifthenelse{\NOT\equal{\tf@rmscale}{\TF@UNSCALED}}
                    { [$\times$\tf@roundvi{\tf@rmscale}]}{} &
      \rmfamily not scaled
      \\
      \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@XF}}{%
        \rmfamily Text figures &
        \rmfamily \tf@textfiguresprintname &
        % NB, the following group will print gobbledegook if the
        % \tf@substosffont typeface doesn't properly map non-numeral chars to
        % standard print glyphs (e.g., see using textfigures=latinmodern)
        \begingroup%
          \ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@XFNAME}}{}%
          \notbool{tf@textfiguresscaledatloadtime}{%
            \scalefont{\tf@textfiguresscalefactor}%
          }{}%
          \fontencoding{\tf@substosffontencoding}%
          \fontfamily{\tf@substosffont}\selectfont\fontname\the\font%
        \endgroup &
        \rmfamily \begin{textnums}\tf@roundvi{\strip@pt\fontdimen6\font}\end{textnums}pt &
        \rmfamily \begin{textnums}\tf@roundvi{\strip@pt\fontdimen5\font}\end{textnums}pt &
        \rmfamily \begin{textnums}\tf@roundvi{\tf@textfiguresscalefactor}\end{textnums}&
        \rmfamily \ifthenelse{\equal{\tf@textfiguresscalemethod}{\TF@NO@SCALE}
                           \OR\equal{\tf@textfiguresscalefactor}{\TF@UNSCALED}}
                  {not scaled}
                  {\ifbool{tf@textfiguresscaledatloadtime}{load time}{run time}}
        \\
      }{}%
      \sffamily Sans Serif &
      \sffamily \tf@sfprintname &
      \sffamily \fontname\the\font &
      \sffamily \tf@roundvi@pt{\the\fontdimen6\font} &
      \sffamily \tf@roundvi@pt{\the\fontdimen5\font} &
      \sffamily \tf@roundvi{\tf@sfscalefactor} &
      \sffamily \ifthenelse{\equal{\tf@sfscalemethod}{\TF@NO@SCALE}
                         \OR\equal{\tf@sfscalefactor}{\TF@UNSCALED}}
                  {not scaled}
                  {\ifbool{tf@sffontdirty}{run time}{load time}}
      \\
      \ttfamily Typewriter &
      \ttfamily \tf@ttprintname &
      \ttfamily \fontname\the\font &
      \ttfamily \tf@roundvi@pt{\the\fontdimen6\font} &
      \ttfamily \tf@roundvi@pt{\the\fontdimen5\font} &
      \ttfamily \tf@roundvi{\tf@ttscalefactor} &
      \ttfamily \ifthenelse{\equal{\tf@ttscalemethod}{\TF@NO@SCALE}
                         \OR\equal{\tf@ttscalefactor}{\TF@UNSCALED}}
                  {not scaled}
                  {\ifbool{tf@ttfontdirty}{run time}{load time}}
      \\
      \rmfamily Math &
      \rmfamily $\tf@mathprintname$ &
      \rmfamily $\fontname\textfont\tf@mathfontfamily$ &
      \rmfamily $\tf@roundvi@pt{\the\fontdimen6\textfont\tf@mathfontfamily}$ &
      \rmfamily $\tf@roundvi@pt{\the\fontdimen5\textfont\tf@mathfontfamily}$ &
      \rmfamily $\tf@roundvi{\tf@mathscalefactor}$ &
      \rmfamily \ifthenelse{\equal{\tf@mathscalemethod}{\TF@NO@SCALE}
                         \OR\equal{\tf@mathscalefactor}{\TF@UNSCALED}}
                  {not scaled}
                  {\ifbool{tf@mathscaledatloadtime}{load time}{run time}}
      \\
      \rmfamily Symbols &
      \multicolumn{4}{l}{\rmfamily $\tf@symbolsprintname$} & &
      \rmfamily \ifthenelse{\equal{\tf@mathscalemethod}{\TF@NO@SCALE}
                         \OR\equal{\tf@mathscalefactor}{\TF@UNSCALED}}
                  {not scaled}
                  {\ifbool{tf@mathscaledatloadtime}{load time}{run time}}
      \\
    \end{tabular}%
    \par\medskip%
  }}

  \newcommand\tfprinttext[1]{{%
    \ifthenelse{\equal{#1}{rm}}{
      \newcommand\tf@nums{\begin{textnums}0123456789\end{textnums}}
      \newcommand\tf@NUMS{\begin{liningnums}0123456789\end{liningnums}}
    }{
      \newcommand\tf@nums{0123456789}
      \newcommand\tf@NUMS{}
    }%
    \csname #1family\endcsname\selectfont\noindent%
    \begin{tabular}{@{}>{\csname #1family\endcsname\selectfont}l
                       >{\csname #1family\endcsname\selectfont}l@{}}%
    `#1' family: & \ifthenelse{\equal{#1}{rm}}{\tf@rmprintname}{}%
                   \ifthenelse{\equal{#1}{sf}}{\tf@sfprintname}{}%
                   \ifthenelse{\equal{#1}{tt}}{\tf@ttprintname}{}\\
      Normal:             &         \tftext\ \tf@nums \\
                          &         \tfTEXT\ \tf@NUMS \\
      \textbf{Bold:}      & \textbf{\tftext\ \tf@nums}\\
                          & \textbf{\tfTEXT\ \tf@NUMS}\\
      \textit{Italic:}    & \textit{\tftext\ \tf@nums}\\
                          & \textit{\tfTEXT\ \tf@NUMS}\\
      \textsl{Slant:}     & \textsl{\tftext\ \tf@nums}\\
                          & \textsl{\tfTEXT\ \tf@NUMS}\\
      \textsc{Smallcaps:} & \textsc{\tftext\ \tf@nums}\\
                          & \textsc{\tfTEXT\ \tf@NUMS}\\
      Variants:           & {\fontseries{l}\selectfont Light}
                            {\fontseries{c}\selectfont Condensed}
                            {\fontseries{m}\selectfont Medium}
                            {\fontseries{sb}\selectfont Semi-bold}
                            {\fontseries{b}\selectfont Bold}
                            {\fontseries{bx}\selectfont Bold-extended}
                            {\scshape\bfseries Bold-Smallcaps}
                            {\fontseries{eb}\selectfont Extra-bold}\\
    \end{tabular}%
    \par\medskip%
  }}

  \newcommand\tfprintfigures[1]{{%
    \csname #1family\endcsname\selectfont\noindent%
    \begin{tabular}{@{}>{\rmfamily}l>{\rmfamily}l>{\rmfamily}l
                       >{\rmfamily}l>{\rmfamily}l>{\rmfamily}l
                       >{\rmfamily}l>{\rmfamily}l@{}}
      & Normal & Italics & Bold & Bold Italics & Punctuation           \\
      Plain numerals:                                                  &
        0123456789                                                     &
        \textit{0123456789}                                            &
        \textbf{0123456789}                                            &
        \textbf{\textit{0123456789}}                                   &
        \tfpunctuation                                                 \\
      $Math$:                                                          &
        $0123456789$                                                   &
        $\mathit{0123456789}$                                          &
        $\mathbf{0123456789}$                                          &
        $\mathbf{\mathit{0123456789}}$                                 &
        $\tfpunctuation$                                               \\
      \texttt{\textbraceleft liningnums\textbraceright}:               &
        \begin{liningnums}0123456789\end{liningnums}                   &
        \textit{\begin{liningnums}0123456789\end{liningnums}}          &
        \textbf{\begin{liningnums}0123456789\end{liningnums}}          &
        \textbf{\textit{\begin{liningnums}0123456789\end{liningnums}}} &
        \begin{liningnums}\tfpunctuation\end{liningnums}               \\
      \texttt{\textbraceleft textnums\textbraceright}%
        \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@TS}\AND\equal{#1}{rm}}
          { (TS1)}
          {\ifthenelse{\equal{\tf@osf@method}{\TF@OSF@SC}\AND\equal{#1}{rm}}
            { (smallcaps)}{}}:                                         &
        \begin{textnums}0123456789\end{textnums}                       &
        \textit{\begin{textnums}0123456789\end{textnums}}              &
        \textbf{\begin{textnums}0123456789\end{textnums}}              &
        \textbf{\textit{\begin{textnums}0123456789\end{textnums}}}     &
        \begin{textnums}\tfpunctuation\end{textnums}                   \\
      \texttt{\textbackslash textstylenums}%
        \ifthenelse{\equal{\tf@osf@method}{\TF@OSF@TS}\AND\equal{#1}{rm}}
          { (TS1)}
          {\ifthenelse{\equal{\tf@osf@method}{\TF@OSF@SC}\AND\equal{#1}{rm}}
            { (smallcaps)}{}}:                                         &
        \textstylenums{0123456789}                                     &
        \textit{\textstylenums{0123456789}}                            &
        \textbf{\textstylenums{0123456789}}                            &
        \textbf{\textit{\textstylenums{0123456789}}}                   &
        \textstylenums{\tfpunctuation}                                 \\
      \texttt{\textbackslash oldstylenums}:                            &
        \oldstylenums{0123456789}                                      &
        \textit{\oldstylenums{0123456789}}                             &
        \textbf{\oldstylenums{0123456789}}                             &
        \textbf{\textit{\oldstylenums{0123456789}}}                    &
        \oldstylenums{\tfpunctuation}                                  \\
      \texttt{\textbackslash oldstylenums} (TS1):                      &
        {\fontencoding{TS1}\selectfont0123456789}                      &
        {\fontencoding{TS1}\selectfont\textit{0123456789}}             &
        {\fontencoding{TS1}\selectfont\textbf{0123456789}}             &
        {\fontencoding{TS1}\selectfont\textbf{\textit{0123456789}}}    &
        {\fontencoding{TS1}\selectfont\tfpunctuation}                  \\
    \end{tabular}%
    \par\medskip%
  }}

  \newcommand\tfprinttextalphabets{{%
    \setlength{\parindent}{0pt}
    $acegmnopqrsuvwxyz$%
    \textrm{acegmnopqrsuvwxyz}%
    \textsf{acegmnopqrsuvwxyz}%
    \texttt{acegmnopqrsuvwxyz}\ %
    $bdfhijklt$%
    \textrm{bdfhijklt}%
    \textsf{bdfhijklt}%
    \texttt{bdfhijklt}\\%
    $\tfABC$\textrm{\tfABC}\textsf{\tfABC}\texttt{\tfABC}\\%
    $\tfdigits$\textrm{\tfdigits}\textsf{\tfdigits}\texttt{\tfdigits}%
    }\par\medskip%
  }

  \newcommand\tfprinttextsample[1]{{%
    \csname #1family\endcsname\selectfont\noindent%
    Rank-dependent utility theories, introduced for objective probabilities
    by Quiggin (\begin{textnums}1981\end{textnums};
    \begin{textnums}1982\end{textnums}) and for subjective distributions by
    Schmeidler (\begin{textnums}1989\end{textnums}), reconfigure $p$ to
    accommodate findings that actual choice behaviours often differ
    systematically from that predicted by classical expected utility
    theories (for example, see Allais, \begin{textnums}1953\end{textnums};
    Ellsberg, \begin{textnums}1961\end{textnums}; Lichtenstein \& Slovic,
    \begin{textnums}1971\end{textnums}; H\"{u}fflefjord,
    \begin{textnums}2004\end{textnums}). These theories accomplish their
    task in two interrelated ways:\ first by discarding the ``linearity of
    the probabilities'' restriction imposed by the standard rationality
    assumptions, second by employing more of the information available to
    individuals at decision-making time.\par\medskip%
  }}

  \newcommand\tfprintmathalphabets[1]{{%
    \csname #1family\endcsname\selectfont\noindent%
    \edef\longestword{calligraphic:\ \ }%
    \ifundef{\mathbb}{}
      {\rlap{blackboard:}\phantom{\longestword}$\mathbb\tfABC$\\}%
    \ifundef{\mathcal}{}
      {\rlap{calligraphic:}\phantom{\longestword}$\mathcal\tfABC$\\}%
    \ifundef{\mathfrak}{}
      {\rlap{fraktur:}\phantom{\longestword}$\mathfrak\tfABC%
       \quad\mathfrak\tfabc$\\}%
    \rlap{greek:}\phantom{\longestword}$%
     \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega%
     \quad%
     \alpha\beta\gamma%
     \ifundef{\digamma}{.}{\digamma}%
     \delta\epsilon%
     \ifundef{\varepsilon}{.}{\varepsilon}%
     \zeta\eta\theta%
     \ifundef{\vartheta}{.}{\vartheta}%
     \iota\kappa%
     \ifundef{\varkappa}{.}{\varkappa}%
     \lambda\mu\nu\xi\pi%
     \ifundef{\varpi}{.}{\varpi}%
     \rho%
     \ifundef{\varrho}{.}{\varrho}%
     \sigma%
     \ifundef{\varsigma}{.}{\varsigma}%
     \tau%
     \ifundef{\varphi}{.}{\varphi}%
     \upsilon\phi\chi\psi\omega%
     $\\%
     \ifthenelse{\NOT\isundefined{\alphaup}}{%
       \phantom{\longestword$%
       \Gamma\Delta\Theta\Lambda\Xi\Pi\Sigma\Upsilon\Phi\Psi\Omega%
       \quad$}$%
       \ifundef{\alphaup}{.}{\alphaup}%
       \ifundef{\betaup}{.}{\betaup}%
       \ifundef{\gammaup}{.}{\gammaup}%
       \ifundef{\digammaup}{.}{\digammaup}%
       \ifundef{\deltaup}{.}{\deltaup}%
       \ifundef{\epsilonup}{.}{\epsilonup}%
       \ifundef{\varepsilonup}{.}{\varepsilonup}%
       \ifundef{\zetaup}{.}{\zetaup}%
       \ifundef{\etaup}{.}{\etaup}%
       \ifundef{\thetaup}{.}{\thetaup}%
       \ifundef{\varthetaup}{.}{\varthetaup}%
       \ifundef{\iotaup}{.}{\iotaup}%
       \ifundef{\kappaup}{.}{\kappaup}%
       \ifundef{\varkappaup}{.}{\varkappaup}%
       \ifundef{\lambdaup}{.}{\lambdaup}%
       \ifundef{\muup}{.}{\muup}%
       \ifundef{\nuup}{.}{\nuup}%
       \ifundef{\xiup}{.}{\xiup}%
       \ifundef{\piup}{.}{\piup}%
       \ifundef{\varpiup}{.}{\varpiup}%
       \ifundef{\rhoup}{.}{\rhoup}%
       \ifundef{\varrhoup}{.}{\varrhoup}%
       \ifundef{\sigmaup}{.}{\sigmaup}%
       \ifundef{\varsigmaup}{.}{\varsigmaup}%
       \ifundef{\tauup}{.}{\tauup}%
       \ifundef{\varphiup}{.}{\varphiup}%
       \ifundef{\upsilonup}{.}{\upsilonup}%
       \ifundef{\phiup}{.}{\phiup}%
       \ifundef{\chiup}{.}{\chiup}%
       \ifundef{\psiup}{.}{\psiup}%
       \ifundef{\omegaup}{.}{\omegaup}%
       $\\%
     }{}%
    \par\vspace{-0.5\baselineskip}%
  }}

  \newcommand\tfprintmathfonts{{%
    \noindent%
    \parbox{\linewidth}{\ttfamily\selectfont%
      \count255=0
      \textbf{Math fonts:}
      \loop\ifnum\count255<15
        \the\count255.~\fontname\textfont\count255;
        \advance\count255 by 1
     \repeat
     \the\count255.~\fontname\textfont\count255.
   }\par%
  }}

  \newcommand\tfprintmathsample[1]{{%
    \ifundef{\Res}{%
      \edef\Res{\mathop{\operator@font Res}\nolimits}%
    }{}%
    \csname #1family\endcsname\selectfont\noindent%
    \textbf{Theorem 1 (Residue Theorem)} % Credit: Hartke
    Let $f$ be analytic in the region $G$ except for the isolated
    singularities $a_1,a_2,\ldots,a_m$. If $\gamma$ is a closed rectifiable
    curve in $G$ which does not pass through any of the points $a_k$ and if
    $\gamma\approx 0$ in $G$ then
    \begin{equation}\ifbool{tf@debug}{\color{\TF@DEBUG@COLOUR@MATH}}{}%
    \frac{1}{2\pi i}\int_\gamma f = \sum_{k=1}^m n(\gamma;a_k)
    \Res(f;a_k)\qquad\pi=3.1415926\dots
    \end{equation}%
  }}
}{
  % Stub print info definitions for whenever package option printinfo=false
  %------------------------------------------------------------------------
  \newcommand\tfprintinfopage{}
  \newcommand\tfprintpackageoptions{}
  \newcommand\tfprintinfo{}
  \newcommand\tfprinttext[1]{}
  \newcommand\tfprintfigures[1]{}
  \newcommand\tfprinttextalphabets{}
  \newcommand\tfprinttextsample[1]{}
  \newcommand\tfprintmathalphabets[1]{}
  \newcommand\tfprintmathsample[1]{}
}

\renewcommand*\familydefault{\rmdefault} % override any package-induced change
\rmfamily

\TF@PackageDebugInfo{... package loaded}
%
%============================== end typeface.sty ==============================