565 lines
15 KiB
TeX
565 lines
15 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/).
|
|
%% ---------------------------------------------------------------------------
|
|
%% Copyright 2024 Johan Larsson and contributors
|
|
% ------------------------------------------------------------------------- \fi
|
|
% \iffalse
|
|
%<*package>
|
|
\NeedsTeXFormat{LaTeX2e}
|
|
\ProvidesPackage{beamerinnerthememoloch}[2025-04-01 v1.0.0 Moloch color theme] % x-release-please-version
|
|
%</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{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{
|
|
/moloch/inner/sectionpage/.cd,
|
|
.is choice,
|
|
none/.code=\moloch@disablesectionpage,
|
|
simple/.code={%
|
|
\moloch@enablesectionpage%
|
|
\setbeamertemplate{section page}[simple]%
|
|
},
|
|
progressbar/.code={%
|
|
\moloch@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{
|
|
/moloch/inner/subsectionpage/.cd,
|
|
.is choice,
|
|
none/.code=\moloch@disablesubsectionpage,
|
|
simple/.code={%
|
|
\moloch@enablesubsectionpage%
|
|
\setbeamertemplate{section page}[simple]%
|
|
},
|
|
progressbar/.code={%
|
|
\moloch@enablesubsectionpage%
|
|
\setbeamertemplate{section page}[progressbar]%
|
|
},
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{standoutnumbering}
|
|
% Whether or not to number standout pages. Option |none| means that
|
|
% standout pages are not numbered (do not count as frames). |hide| means
|
|
% that they do count as frames, but that the footer with the number is
|
|
% not shown. Option |show| means that they both count as frames and
|
|
% that the footer with a frame count is shown.
|
|
% \begin{macrocode}
|
|
\providebool{moloch@enableStandoutFooter}
|
|
\providebool{moloch@enableStandoutNumbering}
|
|
\pgfkeys{
|
|
/moloch/inner/standoutnumbering/.cd,
|
|
.is choice,
|
|
none/.code={
|
|
\boolfalse{moloch@enableStandoutNumbering}
|
|
\boolfalse{moloch@enableStandoutFooter}
|
|
},
|
|
show/.code={
|
|
\booltrue{moloch@enableStandoutNumbering}
|
|
\booltrue{moloch@enableStandoutFooter}
|
|
},
|
|
hide/.code={
|
|
\booltrue{moloch@enableStandoutNumbering}
|
|
\boolfalse{moloch@enableStandoutFooter}
|
|
}
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{titleseparator linewidth}
|
|
% Set the width of the line separating the title from the author.
|
|
% \begin{macrocode}
|
|
\newlength{\moloch@titleseparator@linewidth}
|
|
\pgfkeys{
|
|
/moloch/inner/.cd,
|
|
titleseparatorlinewidth/.code={\setlength{\moloch@titleseparator@linewidth}{#1}},
|
|
titleseparatorlinewidth/.default=0.4pt,
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \begin{macro}{titleseparator aliases}
|
|
% Allows |titleseparator linewidth| to be used in |\usetheme|.
|
|
% \begin{macrocode}
|
|
\pgfkeys{
|
|
/moloch/inner/.cd,
|
|
titleseparator linewidth/.code=\pgfkeysalso{titleseparatorlinewidth=#1},
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\moloch@inner@setdefaults}
|
|
% Set default values for inner theme options.
|
|
% \begin{macrocode}
|
|
\newcommand{\moloch@inner@setdefaults}{
|
|
\pgfkeys{/moloch/inner/.cd,
|
|
sectionpage=progressbar,
|
|
subsectionpage=none,
|
|
standoutnumbering=none,
|
|
titleseparator linewidth=0.4pt,
|
|
}
|
|
}
|
|
% \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}{
|
|
\null%
|
|
\vspace{0pt plus 1.618fil}%
|
|
\vfil%
|
|
\ifx\inserttitlegraphic\@empty\else\usebeamertemplate*{title graphic}\fi
|
|
\ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi
|
|
\ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi
|
|
\usebeamertemplate*{title separator}
|
|
\expandafter\ifblank\expandafter{\beamer@andstripped}{}{%
|
|
\usebeamertemplate*{author}%
|
|
}
|
|
\ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi
|
|
\ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi
|
|
\vspace{0pt plus 1fil}%
|
|
\null
|
|
}
|
|
% \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
|
|
% 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
|
|
\begingroup
|
|
\renewcommand\footnoterule{}%
|
|
\frame[plain,noframenumbering]{\titlepage}
|
|
\endgroup
|
|
\fi
|
|
}
|
|
\def\titlepage{%
|
|
% Apply title-page specific footnote settings
|
|
\renewcommand{\@makefntext}[1]{%
|
|
{\par\usebeamercolor[fg]{thanks}\usebeamerfont{thanks}$^{\@thefnmark}$##1\medskip}%
|
|
}
|
|
|
|
% Process the title page
|
|
\usebeamertemplate{title page}\@thanks
|
|
}
|
|
% \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}{
|
|
\inserttitlegraphic%
|
|
\par%
|
|
\vspace*{1em}
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{title}
|
|
% Set the title on the title page.
|
|
% \begin{macrocode}
|
|
\setbeamertemplate{title}{
|
|
\raggedright%
|
|
\moloch@titleformat{\inserttitle}%
|
|
\par%
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{subtitle}
|
|
% Set the subtitle on the title page.
|
|
% \begin{macrocode}
|
|
\setbeamertemplate{subtitle}{
|
|
\vspace*{0.3em}
|
|
\raggedright%
|
|
\moloch@subtitleformat{\insertsubtitle}%
|
|
\par%
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{title separator}
|
|
% Template to set the title separator.
|
|
% \begin{macrocode}
|
|
\setbeamertemplate{title separator}{
|
|
\tikzexternaldisable%
|
|
\begin{tikzpicture}[baseline=(current bounding box.north)]
|
|
\mmzUnmemoizable%
|
|
\fill[fg] (0,0) rectangle (\textwidth, \moloch@titleseparator@linewidth);
|
|
\useasboundingbox (0,0) rectangle (\textwidth,-\moloch@titleseparator@linewidth);
|
|
\end{tikzpicture}%
|
|
\tikzexternalenable%
|
|
\par%
|
|
\vspace*{0.8em}
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{author}
|
|
% Set the author on the title page.
|
|
% \begin{macrocode}
|
|
\setbeamertemplate{author}{
|
|
\raggedright%
|
|
\insertauthor%
|
|
\par%
|
|
\vspace*{0.5em}
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{institute}
|
|
% Set the institute on the title page.
|
|
% \begin{macrocode}
|
|
\setbeamertemplate{institute}{
|
|
\insertinstitute%
|
|
\par%
|
|
\vspace*{1em}
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \begin{macro}{date}
|
|
% Set the date on the title page.
|
|
% \begin{macrocode}
|
|
\setbeamertemplate{date}{
|
|
\insertdate%
|
|
\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}
|
|
\moloch@sectiontitleformat{\insertsectionhead}\par
|
|
\usebeamercolor[fg]{subsection title}%
|
|
\usebeamerfont{subsection title}%
|
|
\strut%
|
|
\ifx\insertsubsectionhead\@empty\else%
|
|
\insertsubsectionhead%
|
|
\fi
|
|
\end{center}
|
|
\vspace{\baselineskip - 1ex + \moloch@titleseparator@linewidth}
|
|
}
|
|
\defbeamertemplate{section page}{progressbar}{
|
|
\centering
|
|
\begin{minipage}{0.7875\linewidth}
|
|
\raggedright
|
|
\usebeamercolor[fg]{section title}
|
|
\usebeamerfont{section title}
|
|
\moloch@sectiontitleformat{\insertsectionhead}\\[-0.5\baselineskip]
|
|
\usebeamertemplate*{progress bar in section page}
|
|
\par
|
|
\usebeamercolor[fg]{subsection title}%
|
|
\usebeamerfont{subsection title}%
|
|
\strut%
|
|
\ifx\insertsubsectionhead\@empty\else%
|
|
\insertsubsectionhead%
|
|
\fi
|
|
\end{minipage}
|
|
\par
|
|
}
|
|
\newcommand{\moloch@disablesectionpage}{
|
|
\AtBeginSection{
|
|
% intentionally empty
|
|
}
|
|
}
|
|
\newcommand{\moloch@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{\moloch@disablesubsectionpage}{
|
|
\AtBeginSubsection{
|
|
% intentionally empty
|
|
}
|
|
}
|
|
\newcommand{\moloch@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}
|
|
\setbeamertemplate{progress bar in section page}{
|
|
\pgfmathsetlength{\moloch@progressonsectionpage}{
|
|
\textwidth * min(1,\insertframenumber/\inserttotalframenumber)
|
|
}%
|
|
\tikzexternaldisable%
|
|
\begin{tikzpicture}[baseline=(current bounding box.north)]
|
|
\mmzUnmemoizable%
|
|
\fill[bg]
|
|
(0,0)
|
|
rectangle
|
|
(\textwidth, \moloch@progressonsectionpage@linewidth);
|
|
\fill[fg]
|
|
(0,0)
|
|
rectangle
|
|
(\moloch@progressonsectionpage,
|
|
\moloch@progressonsectionpage@linewidth);
|
|
\useasboundingbox (0,0) rectangle (\textwidth,-\moloch@progressonsectionpage@linewidth);
|
|
\end{tikzpicture}%
|
|
\tikzexternalenable%
|
|
}
|
|
% \end{macrocode}
|
|
%
|
|
% The code above 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
|
|
% |\moloch@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{Lists and Floats}
|
|
%
|
|
% \begin{macrocode}
|
|
\setbeamertemplate{itemize item}{\(\bullet\)}
|
|
\setbeamertemplate{itemize subitem}{\(\circ\)}
|
|
\setbeamertemplate{itemize subsubitem}{\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}
|
|
%
|
|
%
|
|
% 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 1fil\relax%
|
|
\beamer@framebottomskip=0pt plus 1fil\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 set frame options.
|
|
%
|
|
% \begin{macrocode}
|
|
\providebool{moloch@standout}
|
|
\define@key{beamerframe}{standout}[true]{%
|
|
\booltrue{moloch@standout}
|
|
\begingroup
|
|
\setkeys{beamerframe}{c}
|
|
\ifbool{moloch@enableStandoutNumbering}{}{%
|
|
\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
|
|
}
|
|
}
|
|
\setbeamercolor{local structure}{
|
|
fg=palette primary.fg
|
|
}
|
|
\usebeamercolor[fg]{palette primary}
|
|
\setbeamercolor{page number in head/foot}{
|
|
use=palette primary,
|
|
fg=palette primary.fg
|
|
}
|
|
\ifbool{moloch@enableStandoutFooter}{}{\setbeamertemplate{footline}{}}
|
|
}
|
|
% \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 prepend the |\endgroup| to |\beamer@reseteecodes|, which is run
|
|
% exactly once at the end of each slide.
|
|
%
|
|
% \begin{macrocode}
|
|
\pretocmd{\beamer@reseteecodes}{%
|
|
\ifbool{moloch@standout}{
|
|
\endgroup
|
|
\boolfalse{moloch@standout}
|
|
}{}
|
|
}{}{}
|
|
% \end{macrocode}
|
|
%
|
|
% We set the fonts and the \centering alignment on the inner content,
|
|
% in such a way that the speaker's note layout isn't affected by the custom
|
|
% formatting.
|
|
%
|
|
% \begin{macrocode}
|
|
\AtBeginEnvironment{beamer@frameslide}{
|
|
\ifbool{moloch@standout}{
|
|
\centering
|
|
\usebeamerfont{standout}
|
|
}{}
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \subsubsection{Process Package Options}
|
|
%
|
|
% \begin{macrocode}
|
|
\moloch@inner@setdefaults
|
|
\ProcessPgfPackageOptions{/moloch/inner}
|
|
% \end{macrocode}
|
|
%
|
|
% \iffalse
|
|
%</package>
|
|
% \fi
|
|
% \Finale
|
|
\endinput
|