% \iffalse meta-comment -------------------------------------------------------
% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
% contributors can be found at
%
%     https://github.com/matze/mtheme/graphs/contributors
%
% and the original template was based on the HSRM theme by Benjamin Weiss.
%
% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
% International License (https://creativecommons.org/licenses/by-sa/4.0/).
% ------------------------------------------------------------------------- \fi
% \iffalse
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{beamerfontthememetropolis}[2017/01/23 Metropolis font theme]
%</package>
% \fi
% \CheckSum{0}
% \StopEventually{}
% \iffalse
%<*package>
% ------------------------------------------------------------------------- \fi
%
% \subsection{\themename font theme}
%
% A |beamer| font theme sets the style of the font used in the document.
%
%
%
% \subsubsection{Package dependencies}
%
%    \begin{macrocode}
\RequirePackage{etoolbox}
\RequirePackage{ifxetex}
\RequirePackage{ifluatex}
\RequirePackage{pgfopts}
%    \end{macrocode}
%
%
%
% \subsubsection{Load Fira fonts}
%
% If the presentation is compiled with Xe\LaTeX{} or Lua\LaTeX{}, the fontspec
% package is loaded and we search for the |Fira| fonts.
%
%    \begin{macrocode}
\ifboolexpr{bool {xetex} or bool {luatex}}{
  \@ifpackageloaded{fontspec}{
    \PassOptionsToPackage{no-math}{fontspec}
  }{
    \RequirePackage[no-math]{fontspec}
  }
%    \end{macrocode}
%
% \begin{macro}{\checkfont}
%    Checks if a font is installed; if not, |fontsnotfound| is increased.
%    \begin{macrocode}
  \newcounter{fontsnotfound}
  \newcommand{\checkfont}[1]{%
    \suppressfontnotfounderror=1%
    \font\x = "#1" at 10pt
    \selectfont
    \ifx\x\nullfont%
      \stepcounter{fontsnotfound}%
    \fi%
    \suppressfontnotfounderror=0%
  }

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\iffontsavailable}
%    Resets the |fontsnotfound| counter and calls |\checkfont| for each font in
%    the comma separated list in the first argument.
%    \begin{macrocode}
  \newcommand{\iffontsavailable}[3]{%
    \setcounter{fontsnotfound}{0}%
    \expandafter\forcsvlist\expandafter%
    \checkfont\expandafter{#1}%
    \ifnum\value{fontsnotfound}=0%
      #2%
    \else%
      #3%
    \fi%
  }
%    \end{macrocode}
% \end{macro}
%
% We search for regular, italic, light, light italic, mono, and mono bold
% fonts under the default |Fira Sans| and |Fira Mono| names. If this fails,
% the suffix OT --- used by some Linux distributions --- will be tried. If this
% also fails, a warning will be displayed and the standard fonts will be used.
%
%    \begin{macrocode}
  \iffontsavailable{Fira Sans Light,%
                    Fira Sans Light Italic,%
                    Fira Sans,%
                    Fira Sans Italic}%
  {%
    \setsansfont[ItalicFont={Fira Sans Light Italic},%
                 BoldFont={Fira Sans},%
                 BoldItalicFont={Fira Sans Italic}]%
                {Fira Sans Light}%
  }{%
    \iffontsavailable{Fira Sans Light OT,%
                      Fira Sans Light Italic OT,%
                      Fira Sans OT,%
                      Fira Sans Italic OT}%
    {%
      \setsansfont[ItalicFont={Fira Sans Light Italic OT},%
                   BoldFont={Fira Sans OT},%
                   BoldItalicFont={Fira Sans Italic OT}]%
                  {Fira Sans Light OT}%
    }{%
      \PackageWarning{beamerthememetropolis}{%
        Could not find Fira Sans fonts%
      }
    }
  }
  \iffontsavailable{Fira Mono, Fira Mono Bold}{%
    \setmonofont[BoldFont={Fira Mono Medium}]{Fira Mono}%
  }{%
    \iffontsavailable{Fira Mono OT, Fira Mono Bold OT}{%
      \setmonofont[BoldFont={Fira Mono Medium OT}]{Fira Mono OT}%
    }{%
      \PackageWarning{beamerthememetropolis}{%
        Could not find Fira Mono fonts%
      }
    }
  }
  \AtBeginEnvironment{tabular}{%
    \addfontfeature{Numbers={Monospaced}}%
  }
}{%
  \PackageWarning{beamerthememetropolis}{%
    You need to compile with XeLaTeX or LuaLaTeX to use the Fira fonts%
  }
}
%    \end{macrocode}
%
% This concludes the portion of the code which is only run when compiled with
% Xe\LaTeX{} or Lua\LaTeX{}. The remainder of this package applies regardless
% of the compiling engine.
%
%
%
% \subsubsection{General font definitions}
%
%    \begin{macrocode}
\setbeamerfont{title}{size=\Large,%
                      series=\bfseries}
\setbeamerfont{author}{size=\small}
\setbeamerfont{date}{size=\small}
\setbeamerfont{section title}{size=\Large,%
                              series=\bfseries}
\setbeamerfont{block title}{size=\normalsize,%
                            series=\bfseries}
\setbeamerfont{block title alerted}{size=\normalsize,%
                                    series=\bfseries}
\setbeamerfont*{subtitle}{size=\large}
\setbeamerfont{frametitle}{size=\large,%
                           series=\bfseries}
\setbeamerfont{caption}{size=\small}
\setbeamerfont{caption name}{series=\bfseries}
\setbeamerfont{description item}{series=\bfseries}
\setbeamerfont{page number in head/foot}{size=\scriptsize}
\setbeamerfont{bibliography entry author}{size=\normalsize,%
                                          series=\normalfont}
\setbeamerfont{bibliography entry title}{size=\normalsize,%
                                         series=\bfseries}
\setbeamerfont{bibliography entry location}{size=\normalsize,%
                                            series=\normalfont}
\setbeamerfont{bibliography entry note}{size=\small,%
                                        series=\normalfont}
\setbeamerfont{standout}{size=\Large,%
                         series=\bfseries}
%    \end{macrocode}
%
%
%
% \subsubsection{Title format options}
%
% \begin{macro}{titleformat title}
%    Controls the format of the title.
%    \begin{macrocode}
\pgfkeys{
  /metropolis/font/titleformat title/.cd,
    .is choice,
    regular/.code={%
      \let\metropolis@titleformat\@empty%
      \setbeamerfont{title}{shape=\normalfont}%
    },
    smallcaps/.code={%
      \let\metropolis@titleformat\@empty%
      \setbeamerfont{title}{shape=\scshape}%
    },
    allsmallcaps/.code={%
      \let\metropolis@titleformat\lowercase%
      \setbeamerfont{title}{shape=\scshape}%
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat title=allsmallcaps can lead to problems%
      }
    },
    allcaps/.code={%
      \let\metropolis@titleformat\uppercase%
      \setbeamerfont{title}{shape=\normalfont}
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat title=allcaps can lead to problems%
      }
    },
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{titleformat subtitle}
%    Control the format of the subtitle.
%    \begin{macrocode}
\pgfkeys{
  /metropolis/font/titleformat subtitle/.cd,
    .is choice,
    regular/.code={%
      \let\metropolis@subtitleformat\@empty%
      \setbeamerfont{subtitle}{shape=\normalfont}%
    },
    smallcaps/.code={%
      \let\metropolis@subtitleformat\@empty%
      \setbeamerfont{subtitle}{shape=\scshape}%
    },
    allsmallcaps/.code={%
      \let\metropolis@subtitleformat\lowercase%
      \setbeamerfont{subtitle}{shape=\scshape}%
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat subtitle=allsmallcaps can lead to problems%
      }
    },
    allcaps/.code={%
      \let\metropolis@subtitleformat\uppercase%
      \setbeamerfont{subtitle}{shape=\normalfont}%
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat subtitle=allcaps can lead to problems%
      }
    },
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{titleformat section}
%    Controls the format of the section title.
%    \begin{macrocode}
\pgfkeys{
  /metropolis/font/titleformat section/.cd,
    .is choice,
    regular/.code={%
      \let\metropolis@sectiontitleformat\@empty%
      \setbeamerfont{section title}{shape=\normalfont}%
    },
    smallcaps/.code={%
      \let\metropolis@sectiontitleformat\@empty%
      \setbeamerfont{section title}{shape=\scshape}%
    },
    allsmallcaps/.code={%
      \let\metropolis@sectiontitleformat\MakeLowercase%
      \setbeamerfont{section title}{shape=\scshape}%
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat section=allsmallcaps can lead to problems%
      }
    },
    allcaps/.code={%
      \let\metropolis@sectiontitleformat\MakeUppercase%
      \setbeamerfont{section title}{shape=\normalfont}%
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat section=allcaps can lead to problems%
      }
    },
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{frametitleformat}
%    Control the format of the frame title.
%    \begin{macrocode}
\pgfkeys{
  /metropolis/font/titleformat frame/.cd,
    .is choice,
    regular/.code={%
      \let\metropolis@frametitleformat\@empty%
      \setbeamerfont{frametitle}{shape=\normalfont}%
    },
    smallcaps/.code={%
      \let\metropolis@frametitleformat\@empty%
      \setbeamerfont{frametitle}{shape=\scshape}%
    },
    allsmallcaps/.code={%
      \let\metropolis@frametitleformat\MakeLowercase%
      \setbeamerfont{frametitle}{shape=\scshape}%
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat frame=allsmallcaps can lead to problems%
      }
    },
    allcaps/.code={%
      \let\metropolis@frametitleformat\MakeUppercase%
      \setbeamerfont{frametitle}{shape=\normalfont}
      \PackageWarning{beamerthememetropolis}{%
        Be aware that titleformat frame=allcaps can lead to problems%
      }
    },
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{titleformat aliases}
%    Allows |titleformat title| et al. to be used in the |\usetheme|
%    declaration, where \LaTeX{} automatically removes all spaces.
%    \begin{macrocode}
\pgfkeys{
  /metropolis/font/.cd,
  titleformattitle/.code=\pgfkeysalso{titleformat title=#1},
  titleformatsubtitle/.code=\pgfkeysalso{titleformat subtitle=#1},
  titleformatsection/.code=\pgfkeysalso{titleformat section=#1},
  titleformatframe/.code=\pgfkeysalso{titleformat frame=#1},
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\metropolis@font@setdefaults}
%    Sets default values for font theme options.
%    \begin{macrocode}
\newcommand{\metropolis@font@setdefaults}{
  \pgfkeys{/metropolis/font/.cd,
    titleformat title=regular,
    titleformat subtitle=regular,
    titleformat section=regular,
    titleformat frame=regular,
  }
}
%    \end{macrocode}
% \end{macro}
%
% We first define hooks to change the case format of the titles.
%
%    \begin{macrocode}
\def\metropolis@titleformat#1{#1}
\def\metropolis@subtitleformat#1{#1}
\def\metropolis@sectiontitleformat#1{#1}
\def\metropolis@frametitleformat#1{#1}
%    \end{macrocode}
%
% To make the uppercase and lowercase macros work in the title, subtitle, etc.,
% we have to patch the appropriate |beamer| commands that set their values.
% This solution was suggested by Enrico Gregorio in an answer to
% \href{http://tex.stackexchange.com/questions/112526/}{this StackExchange
% question}.
%
%    \begin{macrocode}
\patchcmd{\beamer@title}%
  {\def\inserttitle{#2}}%
  {\def\inserttitle{\metropolis@titleformat{#2}}}%
  {}%
  {\PackageError{beamerfontthememetropolis}{Patching title failed}\@ehc}
\patchcmd{\beamer@subtitle}%
  {\def\insertsubtitle{#2}}%
  {\def\insertsubtitle{\metropolis@subtitleformat{#2}}}%
  {}%
  {\PackageError{beamerfontthememetropolis}{Patching subtitle failed}\@ehc}
\patchcmd{\sectionentry}
  {\def\insertsectionhead{#2}}
  {\def\insertsectionhead{\metropolis@sectiontitleformat{#2}}}
  {}
  {\PackageError{beamerfontthememetropolis}{Patching section title failed}\@ehc}
\@tempswafalse
\patchcmd{\beamer@section}
  {\def\insertsectionhead{\hyperlink{Navigation\the\c@page}{#1}}}
  {\def\insertsectionhead{\hyperlink{Navigation\the\c@page}{%
    \metropolis@sectiontitleformat{#1}}}}
  {\@tempswatrue}
  {}
\patchcmd{\beamer@section}
  {\protected@edef\insertsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{#1}}}
  {\protected@edef\insertsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{%
    \noexpand\metropolis@sectiontitleformat{#1}}}}
  {\@tempswatrue}
  {}
\if@tempswa\else
  \PackageError{beamerfontthememetropolis}{Patching section title failed}\@ehc
\fi
\@tempswafalse
\patchcmd{\beamer@subsection}
  {\def\insertsubsectionhead{\hyperlink{Navigation\the\c@page}{#1}}}
  {\def\insertsubsectionhead{\hyperlink{Navigation\the\c@page}{%
    \metropolis@sectiontitleformat{#1}}}}
  {\@tempswatrue}
  {}
\patchcmd{\beamer@subsection}
  {\protected@edef\insertsubsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{#1}}}
  {\protected@edef\insertsubsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{%
    \noexpand\metropolis@sectiontitleformat{#1}}}}
  {\@tempswatrue}
  {}
\if@tempswa\else
  \PackageError{beamerfontthememetropolis}{Patching section title failed}\@ehc
\fi
%    \end{macrocode}
%
% Similarly, to make the |\MakeLowercase| and |\MakeUppercase| macros work in
% the frame title we have to patch |\beamer@@frametitle|.
%
%    \begin{macrocode}
\patchcmd{\beamer@@frametitle}
  {{%
      \gdef\insertframetitle{{#2\ifnum\beamer@autobreakcount>0\relax{}\space%
      \usebeamertemplate*{frametitle continuation}\fi}}%
    \gdef\beamer@frametitle{#2}%
    \gdef\beamer@shortframetitle{#1}%
    }}
  {{%
      \gdef\insertframetitle{{\metropolis@frametitleformat{#2}\ifnum%
      \beamer@autobreakcount>0\relax{}\space%
      \usebeamertemplate*{frametitle continuation}\fi}}%
    \gdef\beamer@frametitle{#2}%
    \gdef\beamer@shortframetitle{#1}%
    }}
  {}
  {\PackageError{beamerfontthememetropolis}{Patching frame title failed}\@ehc}
%    \end{macrocode}
%
%
%
% \subsubsection{Process package options}
%
%    \begin{macrocode}
\metropolis@font@setdefaults
\ProcessPgfPackageOptions{/metropolis/font}
%    \end{macrocode}
% \iffalse
%</package>
% \fi
% \Finale
\endinput
