metropolis_theme/source/beamerinnerthememetropolis.dtx

458 lines
13 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
%<driver> \ProvidesFile{beamerinnerthememetropolis.dtx}
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{beamerinnerthememetropolis}[2016/02/21 Metropolis inner theme]
%</package>
%<driver> \documentclass{ltxdoc}
%<driver> \usepackage{beamerinnerthememetropolis}
%<driver> \begin{document}
%<driver> \DocInput{beamerinnerthememetropolis.dtx}
%<driver> \end{document}
% \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{calc}
\RequirePackage{pgfopts}
\RequirePackage{tikz}
% \end{macrocode}
%
%
%
% \subsubsection{Options}
%
% \begin{macro}{sectionpage}
% The |sectionpage| option defines the behaviour of the sectionpage.
% \begin{macrocode}
\pgfkeys{
/metropolis/inner/sectionpage/.cd,
.is choice,
none/.code=\metropolis@sectionpage@none,
simple/.code=\metropolis@sectionpage@simple,
progressbar/.code=\metropolis@sectionpage@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,
}
}
% \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}{
\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}
\setbeamertemplate{title separator}{
\begin{tikzpicture}
\draw[fg, fill=fg] (0,0) rectangle (\textwidth, 0.4pt);
\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}
\newcommand{\metropolis@sectionpage@none}{
\AtBeginSection{
% intenionally empty
}
}
\defbeamertemplate{section page}{simple}{
\centering
\usebeamercolor[fg]{section title}
\usebeamerfont{section title}
\insertsectionhead\\
}
\newcommand{\metropolis@sectionpage@simple}{
\setbeamertemplate{section page}[simple]
\AtBeginSection{
\ifbeamer@inframe
\sectionpage
\else
\frame[plain,c,noframenumbering]{\sectionpage}
\fi
}
}
\defbeamertemplate{section page}{progressbar}{
\centering
\begin{minipage}{22em}
\usebeamercolor[fg]{section title}
\usebeamerfont{section title}
\insertsectionhead\\[-1ex]
\usebeamertemplate*{progress bar in section page}
\end{minipage}
\par
}
\newcommand{\metropolis@sectionpage@progressbar}{
\setbeamertemplate{section page}[progressbar]
\AtBeginSection{
\ifbeamer@inframe
\sectionpage
\else
\frame[plain,c,noframenumbering]{\sectionpage}
\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}
\setbeamertemplate{progress bar in section page}{
\setlength{\metropolis@progressonsectionpage}{%
\textwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}%
}%
\begin{tikzpicture}
\draw[bg, fill=bg] (0,0) rectangle (\textwidth, 0.4pt);
\draw[fg, fill=fg] (0,0) rectangle (\metropolis@progressonsectionpage, 0.4pt);
\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@blocktitlesep}
\newlength{\metropolis@blockbodysep}
\providecommand{\metropolis@strut}{%
\vphantom{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz()}%
}
\newcommand{\metropolis@block}[1]{
\par\vskip\medskipamount
% \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 explicitly set the amount of
% padding in a conditional based on whether the |block title| and
% |block body| have an empty background.
% This solution assumes that either all or none of |block title|,
% |block title alerted|, and |block title example| have an empty
% background, and likewise for |block body|, |block body alerted|,
% and |block body example|.
%
% \begin{macrocode}
\ifbeamercolorempty[bg]{block title}
{\setlength{\metropolis@blocktitlesep}{0pt}}
{\setlength{\metropolis@blocktitlesep}{0.5ex}}
\ifbeamercolorempty[bg]{block body}
{\setlength{\metropolis@blockbodysep}{0pt}}
{\setlength{\metropolis@blockbodysep}{0.75ex}}
\setlength{\parskip}{0pt}
\begin{beamercolorbox}[%
sep=\metropolis@blocktitlesep,
leftskip=0.5\metropolis@blocktitlesep,
rightskip=0.5\metropolis@blocktitlesep plus 4em]{block title#1}%
\usebeamerfont*{block title#1}%
\metropolis@strut%
\insertblocktitle%
\metropolis@strut%
\end{beamercolorbox}%
\nointerlineskip%
\usebeamerfont{block body#1}%
\begin{beamercolorbox}[sep=\metropolis@blockbodysep, vmode]{block body#1}%
\ifbeamercolorempty[bg]{block body}{}{\vspace{-\metropolis@parskip}}
\setlength{\parskip}{\metropolis@parskip}
}
% \end{macrocode}
%
% This concludes the auxiliary macro |\metropolis@block|. Next,
% 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{Process package options}
%
% \begin{macrocode}
\metropolis@inner@setdefaults
\ProcessPgfPackageOptions{/metropolis/inner}
% \end{macrocode}
%
% \iffalse
%</package>
% \fi
% \Finale
\endinput