mirror of https://github.com/matze/mtheme.git
594 lines
18 KiB
TeX
594 lines
18 KiB
TeX
% \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]
|
|
%</package>
|
|
% \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}{
|
|
\tikzexternaldisable%
|
|
\begin{tikzpicture}
|
|
\fill[fg] (0,0) rectangle (\textwidth, \metropolis@titleseparator@linewidth);
|
|
\end{tikzpicture}%
|
|
\tikzexternalenable%
|
|
\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}%
|
|
}%
|
|
\tikzexternaldisable%
|
|
\begin{tikzpicture}
|
|
\fill[bg] (0,0) rectangle (\textwidth, \metropolis@progressonsectionpage@linewidth);
|
|
\fill[fg] (0,0) rectangle (\metropolis@progressonsectionpage, \metropolis@progressonsectionpage@linewidth);
|
|
\end{tikzpicture}%
|
|
\tikzexternalenable%
|
|
}
|
|
% \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
|
|
%</package>
|
|
% \fi
|
|
% \Finale
|
|
\endinput
|