moloch-dragon/src/beamerinnerthememoloch.dtx

576 lines
16 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.1 Moloch inner 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{Memoization and Tikz Externalization}
%
% See the documentation for the correspondign section under the outer theme for
% more information on the following lines.
%
% \begin{macrocode}
\providecommand{\tikzexternalenable}{}
\providecommand{\tikzexternaldisable}{}
\providecommand{\mmzUnmemoizable}{}
% \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}[circle]
\setbeamertemplate{itemize subitem}{%
\usebeamerfont*{itemize subitem}\raise1pt\hbox{\donotcoloroutermaths$\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