% \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{beamerinnerthememetropolis}[2017/01/23 Metropolis inner theme] % % \fi % \CheckSum{0} % \StopEventually{} % \iffalse %<*package> % ------------------------------------------------------------------------- \fi % % \subsection{\themename inner theme} % % A |beamer| inner theme dictates the style of the frame elements traditionally % set in the ``body'' of each slide. These include: % % \begin{itemize} % \item title, part, and section pages; % \item itemize, enumerate, and description environments; % \item block environments including theorems and proofs; % \item figures and tables; and % \item footnotes and plain text. % \end{itemize} % % % % \subsubsection{Package dependencies} % % \begin{macrocode} \RequirePackage{etoolbox} \RequirePackage{keyval} \RequirePackage{calc} \RequirePackage{pgfopts} \RequirePackage{tikz} % \end{macrocode} % % % % \subsubsection{Options} % % \begin{macro}{sectionpage} % Optionally add a slide marking the beginning of each section. % \begin{macrocode} \pgfkeys{ /metropolis/inner/sectionpage/.cd, .is choice, none/.code=\metropolis@disablesectionpage, simple/.code={\metropolis@enablesectionpage \setbeamertemplate{section page}[simple]}, progressbar/.code={\metropolis@enablesectionpage \setbeamertemplate{section page}[progressbar]}, } % \end{macrocode} % \end{macro} % % \begin{macro}{subsectionpage} % Optionally add a slide marking the beginning of each subsection. % \begin{macrocode} \pgfkeys{ /metropolis/inner/subsectionpage/.cd, .is choice, none/.code=\metropolis@disablesubsectionpage, simple/.code={\metropolis@enablesubsectionpage \setbeamertemplate{section page}[simple]}, progressbar/.code={\metropolis@enablesubsectionpage \setbeamertemplate{section page}[progressbar]}, } % \end{macrocode} % \end{macro} % % \begin{macro}{\metropolis@inner@setdefaults} % Set default values for inner theme options. % \begin{macrocode} \newcommand{\metropolis@inner@setdefaults}{ \pgfkeys{/metropolis/inner/.cd, sectionpage=progressbar, subsectionpage=none } } % \end{macrocode} % \end{macro} % % % % \subsubsection{Title page} % % \begin{macro}{title page} % Template for the title page. Each element is only typset if it is defined % by the user. If |\subtitle| is empty, for example, it won't leave a blank % space on the title slide. % \begin{macrocode} \setbeamertemplate{title page}{ \begin{minipage}[b][\paperheight]{\textwidth} \ifx\inserttitlegraphic\@empty\else\usebeamertemplate*{title graphic}\fi \vfill% \ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi \ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi \usebeamertemplate*{title separator} % \end{macrocode} % % Beamer's definition of |\insertauthor| is always nonempty, so we have % to test another macro initialized by |\author{...}| to see if the user has % defined an author. This solution was suggested by Enrico Gregorio in an % answer to \href{https://tex.stackexchange.com/questions/241306/}{this % Stack Exchange question}. % % \begin{macrocode} \ifx\beamer@shortauthor\@empty\else\usebeamertemplate*{author}\fi \ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi \ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi \vfill \vspace*{1mm} \end{minipage} } % \end{macrocode} % \end{macro}% % % Normal people should use |\maketitle| or |\titlepage| instead of using the % |title page| beamer template directly. Beamer already defines these macros, % but we patch them here to make the title page |[plain]| by default, remove % |\@thanks|, and ensure the title frame number doesn't count. % % \begin{macro}{\maketitle} % \begin{macro}{\titlepage} % % Inserts the title frame, or causes the current frame to use the % |title page| template. % % \begin{macrocode} \def\maketitle{% \ifbeamer@inframe \titlepage \else \frame[plain,noframenumbering]{\titlepage} \fi } \def\titlepage{% \usebeamertemplate{title page} } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{title graphic} % Set the title graphic in a zero-height box, so it doesn't change the % position of other elements. % \begin{macrocode} \setbeamertemplate{title graphic}{ \vbox to 0pt { \vspace*{2em} \inserttitlegraphic% }% \nointerlineskip% } % \end{macrocode} % \end{macro} % % \begin{macro}{title} % Set the title on the title page. % \begin{macrocode} \setbeamertemplate{title}{ \raggedright% \linespread{1.0}% \inserttitle% \par% \vspace*{0.5em} } % \end{macrocode} % \end{macro} % % \begin{macro}{subtitle} % Set the subtitle on the title page. % \begin{macrocode} \setbeamertemplate{subtitle}{ \raggedright% \insertsubtitle% \par% \vspace*{0.5em} } % \end{macrocode} % \end{macro} % % \begin{macro}{title separator} % Template to set the title graphic in a zero-height box. (It won't % change the position of other elements.) % \begin{macrocode} \newlength{\metropolis@titleseparator@linewidth} \setlength{\metropolis@titleseparator@linewidth}{0.4pt} \setbeamertemplate{title separator}{ \begin{tikzpicture} \fill[fg] (0,0) rectangle (\textwidth, \metropolis@titleseparator@linewidth); \end{tikzpicture}% \par% } % \end{macrocode} % \end{macro} % % \begin{macro}{author} % Set the author on the title page. % \begin{macrocode} \setbeamertemplate{author}{ \vspace*{2em} \insertauthor% \par% \vspace*{0.25em} } % \end{macrocode} % \end{macro} % % \begin{macro}{date} % Set the date on the title page. % \begin{macrocode} \setbeamertemplate{date}{ \insertdate% \par% } % \end{macrocode} % \end{macro} % % \begin{macro}{institute} % Set the institute on the title page. % \begin{macrocode} \setbeamertemplate{institute}{ \vspace*{3mm} \insertinstitute% \par% } % \end{macrocode} % \end{macro} % % % % \subsubsection{Section page} % % \begin{macro}{section page} % % Template for the section title slide at the beginning of each section. % % \begin{macrocode} \defbeamertemplate{section page}{simple}{ \begin{center} \usebeamercolor[fg]{section title} \usebeamerfont{section title} \insertsectionhead\par \ifx\insertsubsectionhead\@empty\else \usebeamercolor[fg]{subsection title} \usebeamerfont{subsection title} \insertsubsectionhead \fi \end{center} } \defbeamertemplate{section page}{progressbar}{ \centering \begin{minipage}{22em} \raggedright \usebeamercolor[fg]{section title} \usebeamerfont{section title} \insertsectionhead\\[-1ex] \usebeamertemplate*{progress bar in section page} \par \ifx\insertsubsectionhead\@empty\else% \usebeamercolor[fg]{subsection title}% \usebeamerfont{subsection title}% \insertsubsectionhead \fi \end{minipage} \par \vspace{\baselineskip} } \newcommand{\metropolis@disablesectionpage}{ \AtBeginSection{ % intentionally empty } } \newcommand{\metropolis@enablesectionpage}{ \AtBeginSection{ \ifbeamer@inframe \sectionpage \else \frame[plain,c,noframenumbering]{\sectionpage} \fi } } % \end{macrocode} % \end{macro} % % \begin{macro}{subsection page} % % Template for the subsection title slide that can optionally be added to % at the beginning of each subsection. % % \begin{macrocode} \setbeamertemplate{subsection page}{% \usebeamertemplate*{section page} } \newcommand{\metropolis@disablesubsectionpage}{ \AtBeginSubsection{ % intentionally empty } } \newcommand{\metropolis@enablesubsectionpage}{ \AtBeginSubsection{ \ifbeamer@inframe \subsectionpage \else \frame[plain,c,noframenumbering]{\subsectionpage} \fi } } % \end{macrocode} % \end{macro} % % \begin{macro}{progress bar in section page} % % Template for the progress bar displayed by default on the section page. % This code is duplicated in large part in the outer theme's template % |progress bar in head/foot|. % % \begin{macrocode} \newlength{\metropolis@progressonsectionpage} \newlength{\metropolis@progressonsectionpage@linewidth} \setlength{\metropolis@progressonsectionpage@linewidth}{0.4pt} \setbeamertemplate{progress bar in section page}{ \setlength{\metropolis@progressonsectionpage}{% \textwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}% }% \begin{tikzpicture} \fill[bg] (0,0) rectangle (\textwidth, \metropolis@progressonsectionpage@linewidth); \fill[fg] (0,0) rectangle (\metropolis@progressonsectionpage, \metropolis@progressonsectionpage@linewidth); \end{tikzpicture}% } % \end{macrocode} % % The above code assumes that |\insertframenumber| is less than or equal to % |\inserttotalframenumber|. However, this is not true on the first compile; % in the absence of an |.aux| file, |\inserttotalframenumber| defaults to 1. % This behaviour could cause fatal errors for long presentations, as % |\metropolis@progressonsectionpage| would exceed \TeX's maximum length % (16383.99999pt, roughly 5.75 metres or 18.9 feet). % To avoid this, we increase the default value for |\inserttotalframenumber|; % presentations with over 4000 slides will still break on first compile, but % users in that situation likely have deeper problems to solve. % % \begin{macrocode} \def\inserttotalframenumber{100} % \end{macrocode} % \end{macro} % % % % \subsubsection{Block environments} % % % \begin{macro}{block} % \begin{macro}{block alerted} % \begin{macro}{block example} % % The three different block environments differ only in their colours. % Rather than repeat the essentially the same template three times, we use % the auxiliary macro |\metropolis@block| to define all three templates. % % \begin{macrocode} \newlength{\metropolis@blocksep} \newlength{\metropolis@blockadjust} \setlength{\metropolis@blocksep}{0.75ex} \setlength{\metropolis@blockadjust}{0.25ex} \providecommand{\metropolis@strut}{% \vphantom{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz()}% } \newcommand{\metropolis@block}[1]{ \par\vskip\medskipamount% \setlength{\parskip}{0pt} % \end{macrocode} % % If a background color is defined for the block title or body, we need to % add a little bit of padding to the corresponding box. Ideally, this would % be accomplished by setting |colsep=0.75ex|, which is intended to add % ``color separation space'' only when the box has a colored background. % Unfortunately, |colsep| also adds this separation if the background color % is inherited, even if the inherited color is actually empty. % (The technical reason for this boils down to the fact that the |\ifx| % directive does not expand macros.) % % To achieve the correct spacing for |alertblock|s and |exampleblock|s % as well as for normal blocks, we have to begin the |beamercolorbox| % differently based on whether |block title| has an empty background. % % If the |block title| background is empty, or the user has explicitly % removed the background from (e.g.) |block title alerted|, we just need to % set a rightskip for a nice ragged-right block title. % % \begin{macrocode} \ifbeamercolorempty[bg]{block title#1}{% \begin{beamercolorbox}[rightskip=0pt plus 4em]{block title#1}}{% \ifbeamercolorempty[bg]{block title}{% \begin{beamercolorbox}[rightskip=0pt plus 4em]{block title#1}% }% % \end{macrocode} % % Otherwise, if the |block title| has a background, we set the padding based % on |\metropolis@blockskip|. However, we have to visually compensate for % the |\metropolis@strut| added to the block title (see below) by % subtracting |\metropolis@blockadjust| from the top and bottom padding. % % \begin{macrocode} {% \begin{beamercolorbox}[ sep=\dimexpr\metropolis@blocksep-\metropolis@blockadjust\relax, leftskip=\metropolis@blockadjust, rightskip=\dimexpr\metropolis@blockadjust plus 4em\relax ]{block title#1}% }}% % \end{macrocode} % % We can now set the contents of the |block title|. The zero-width but % positive-height box |\metropolis@strut| ensures that the block title box % has a consistent height, even if it lacks punctuation, ascenders, or % descenders. % % \begin{macrocode} \usebeamerfont*{block title#1}% \metropolis@strut% \insertblocktitle% \metropolis@strut% \end{beamercolorbox}% % \end{macrocode} % % Next, we typeset the |block body|. This the code is similar to, but simpler % than, the |block title| code since we don't need to adjust for any struts. % % \begin{macrocode} \nointerlineskip% \ifbeamercolorempty[bg]{block body#1}{% \begin{beamercolorbox}[vmode]{block body#1}}{ \ifbeamercolorempty[bg]{block body}{% \begin{beamercolorbox}[vmode]{block body#1}% }{% \begin{beamercolorbox}[sep=\metropolis@blocksep, vmode]{block body#1}% \vspace{-\metropolis@parskip} }}% \usebeamerfont{block body#1}% \setlength{\parskip}{\metropolis@parskip}% } % \end{macrocode} % % This concludes the auxiliary macro |\metropolis@block|. Finally, % we define the block beamer templates using this macro. % % \begin{macrocode} \setbeamertemplate{block begin}{\metropolis@block{}} \setbeamertemplate{block alerted begin}{\metropolis@block{ alerted}} \setbeamertemplate{block example begin}{\metropolis@block{ example}} \setbeamertemplate{block end}{\end{beamercolorbox}\vspace*{0.2ex}} \setbeamertemplate{block alerted end}{\end{beamercolorbox}\vspace*{0.2ex}} \setbeamertemplate{block example end}{\end{beamercolorbox}\vspace*{0.2ex}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % % \subsubsection{Lists and floats} % % \begin{macrocode} \setbeamertemplate{itemize items}{\textbullet} \setbeamertemplate{caption label separator}{: } \setbeamertemplate{caption}[numbered] % \end{macrocode} % % % % \subsubsection{Footnotes} % \begin{macrocode} \setbeamertemplate{footnote}{% \parindent 0em\noindent% \raggedright \usebeamercolor{footnote}\hbox to 0.8em{\hfil\insertfootnotemark}\insertfootnotetext\par% } % \end{macrocode} % % % % \subsubsection{Text and spacing settings} % % \begin{macrocode} \newlength{\metropolis@parskip} \setlength{\metropolis@parskip}{0.5em} \setlength{\parskip}{\metropolis@parskip} \linespread{1.15} % \end{macrocode} % % By default, Beamer frames offer the |c| option to \textit{almost} vertically % center the text, but the placement is a little too high. To fix this, we % redefine the |c| option to equalize |\beamer@frametopskip| and % |\beamer@framebottomskip|. This solution was suggested by Enrico Gregorio in % an answer to \href{http://tex.stackexchange.com/questions/247826/}{this % Stack Exchange question}. % % \begin{macrocode} \define@key{beamerframe}{c}[true]{% centered \beamer@frametopskip=0pt plus 1fill\relax% \beamer@framebottomskip=0pt plus 1fill\relax% \beamer@frametopskipautobreak=0pt plus .4\paperheight\relax% \beamer@framebottomskipautobreak=0pt plus .6\paperheight\relax% \def\beamer@initfirstlineunskip{}% } % \end{macrocode} % % % % \subsubsection{Standout frames} % % \themename offers a custom frame format with large, centered text and an % inverted background. To use it, add the key |standout| to the frame: % |\begin{frame}[standout] ... \end{frame}|. % % \begin{macro}{standout} % % Optional arguments to Beamer's frames are implemented using % |\define@key| from the |keyval| package, which will execute code when the % defined option is called. For the |standout| option, we begin a group, % change the colors and fonts, and set a \centering alignment. % % \begin{macrocode} \providebool{metropolis@standout} \define@key{beamerframe}{standout}[true]{% \booltrue{metropolis@standout} \begingroup \setkeys{beamerframe}{c} \setkeys{beamerframe}{noframenumbering} \ifbeamercolorempty[bg]{palette primary}{ \setbeamercolor{background canvas}{ use=palette primary, bg=-palette primary.fg } }{ \setbeamercolor{background canvas}{ use=palette primary, bg=palette primary.bg } } \centering \usebeamercolor[fg]{palette primary} \usebeamerfont{standout} } % \end{macrocode} % % Then we just have to close the group after the standout slide is finished % in order to restore the colours and fonts for the rest of the % presentation. Unfortunately, we cannot use \AfterEndEnvironment{frame} for % this (see \url{http://tex.stackexchange.com/questions/226319/}). % Instead, we add the |\endgroup| to |\beamer@reseteecodes|, which is run % exactly once at the end of each slide. % % \begin{macrocode} \apptocmd{\beamer@reseteecodes}{% \ifbool{metropolis@standout}{ \endgroup \boolfalse{metropolis@standout} }{} }{}{} % \end{macrocode} % \end{macro} % % \subsubsection{Process package options} % % \begin{macrocode} \metropolis@inner@setdefaults \ProcessPgfPackageOptions{/metropolis/inner} % \end{macrocode} % % \iffalse % % \fi % \Finale \endinput