forked from upb/FancyBeamerUPB
721 lines
31 KiB
TeX
721 lines
31 KiB
TeX
\AtEndPreamble{\usepackage{\FancyBeamerUPBdir/fancyupb}} % use the UPB look and feel
|
|
|
|
% =============================================
|
|
% FANCY BEAMER
|
|
% =============================================
|
|
|
|
% ---------------------------------------------
|
|
% import packages
|
|
% ---------------------------------------------
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage{xargs} % used to define/renew commands with multiple optional parameters
|
|
\usepackage{color}
|
|
\usepackage{fitbox} % used to auto-scale long frame titles
|
|
\usepackage{tcolorbox} % used for color boxes (definition, example, note)
|
|
\usepackage{ifthen}
|
|
\usepackage{multicol} % for auto multi-column in content overview
|
|
\usepackage{catchfile} % for automatic link on pictures
|
|
|
|
% ---------------------------------------------
|
|
% general settings
|
|
% ---------------------------------------------
|
|
\beamertemplatenavigationsymbolsempty % remove the default navigation symbols
|
|
|
|
\newif\ifuniqueslidenumbersuffix
|
|
\newif\ifsectiontitleslide % for enabling the automatic section title slide at the begin of each section
|
|
\newif\ifsectionoverview % for enabling the automatic section overview on the section title slide
|
|
\newif\ifdarkmode
|
|
|
|
\DeclareOption{nosectionframes}{\sectiontitleslidefalse \sectionoverviewfalse}
|
|
\DeclareOption{sectiontitleslides}{\sectiontitleslidetrue \sectionoverviewfalse}
|
|
\DeclareOption{sectionoverviews}{\sectiontitleslidetrue \sectionoverviewtrue}
|
|
\DeclareOption{uniqueslidenumber}{\uniqueslidenumbersuffixtrue}
|
|
\DeclareOption{darkmode}{\darkmodetrue}
|
|
|
|
\ExecuteOptions{sectiontitleslides} % use sectiontitleslides as default
|
|
\mode<handout>{\ExecuteOptions{sectionoverviews}} % use sectionoverviews as default in handout mode
|
|
|
|
\ProcessOptions
|
|
|
|
\setlength{\parskip}{1.5ex} % set the parskip
|
|
\newcommand{\@minipagerestore}{\setlength{\parskip}{1.5ex}} % use parskip also in minipages (also used for tcolorbox)
|
|
|
|
% ---------------------------------------------
|
|
% colors
|
|
% ---------------------------------------------
|
|
|
|
% colors that will not be adjusted in darkmode
|
|
\definecolor{black}{HTML}{000000}
|
|
\definecolor{white}{HTML}{FFFFFF}
|
|
|
|
% colors that will be adjusted in darkmode
|
|
\definecolor{red}{HTML}{BB3333}
|
|
\definecolor{green}{HTML}{33BB33}
|
|
\definecolor{blue}{HTML}{3333BB}
|
|
\definecolor{orange}{HTML}{BB6600}
|
|
\definecolor{accent}{HTML}{999999}
|
|
\colorlet{accenttwo}{red}
|
|
\colorlet{foreground}{black}
|
|
\colorlet{background}{white}
|
|
\colorlet{boxmix}{white}
|
|
|
|
% beamer colors in darkmode
|
|
\ifdarkmode
|
|
\colorlet{red}{red!50!white}
|
|
\colorlet{green}{green!50!white}
|
|
\colorlet{blue}{blue!50!white}
|
|
\colorlet{orange}{orange!50!white}
|
|
\colorlet{foreground}{white!90!darkgray}
|
|
\colorlet{background}{darkgray}
|
|
\colorlet{boxmix}{darkgray}
|
|
\colorlet{accent}{accent!25!darkgray}
|
|
\colorlet{accenttwo}{accenttwo!25!darkgray}
|
|
\fi
|
|
|
|
% set beamer colors
|
|
\setbeamercolor{background canvas}{bg=background}
|
|
\setbeamercolor{frametitle}{fg=foreground}
|
|
\setbeamercolor{structure}{fg=foreground}
|
|
\setbeamercolor{normal text}{fg=foreground}
|
|
\setbeamercolor*{palette primary}{use=structure,fg=structure.fg}
|
|
\setbeamercolor*{palette secondary}{use=structure,fg=structure.fg!95!black}
|
|
\setbeamercolor*{palette tertiary}{use=structure,fg=structure.fg!90!black}
|
|
\setbeamercolor*{palette quaternary}{use=structure,fg=structure.fg!95!black,bg=black!80}
|
|
\setbeamercolor{item}{fg=foreground}
|
|
\setbeamercolor{itemize/enumerate body}{use=normal text,fg=normal text.fg}
|
|
\setbeamercolor{itemize/enumerate subbody}{use=itemize/enumerate body,fg=itemize/enumerate body.fg}
|
|
\setbeamercolor{itemize/enumerate subsubbody}{use=itemize/enumerate subbody,fg=itemize/enumerate subbody.fg}
|
|
\setbeamercolor{logobox}{bg=white}
|
|
\setbeamercolor{section in toc}{fg=foreground}
|
|
\setbeamercolor{subsection in toc}{fg=foreground}
|
|
|
|
\setbeamercolor{myfooter}{fg=white,bg=accent}
|
|
\setbeamercolor{mypagenumber}{fg=white,bg=accenttwo}
|
|
\setbeamercolor{titlebox}{fg=white,bg=accenttwo}
|
|
\setbeamercolor{subtitlebox}{fg=white,bg=accent}
|
|
|
|
% ---------------------------------------------
|
|
% fonts
|
|
% ---------------------------------------------
|
|
\setbeamerfont{frametitle}{size=\LARGE, series=\bfseries}
|
|
\setbeamerfont{section title}{size=\Huge, series=\bfseries}
|
|
\setbeamerfont{section in toc}{size=\large, series=\bfseries}
|
|
|
|
\setbeamerfont{itemize/enumerate subbody}{size=\normalsize}
|
|
\setbeamerfont{itemize/enumerate subsubbody}{size=\normalsize}
|
|
|
|
% ---------------------------------------------
|
|
% list environments
|
|
% ---------------------------------------------
|
|
\setbeamertemplate{itemize items}[circle]
|
|
\setbeamertemplate{enumerate item}{\arabic{enumi}.}
|
|
\setbeamertemplate{enumerate subitem}{\arabic{enumii}.}
|
|
\setbeamertemplate{enumerate subsubitem}{\arabic{enumiii}.}
|
|
\setbeamertemplate{section in toc}[sections numbered]
|
|
|
|
% ---------------------------------------------
|
|
% frame layout
|
|
% ---------------------------------------------
|
|
|
|
% we use this flag as a helper to toggle extra behavior when constructing the logos
|
|
\newif\iffancy@logos@first@
|
|
|
|
% [options for includegraphics, shared for all figures]{logonameA, logonameB, ...}
|
|
\def\fancy@logoline{}
|
|
\newcommand*\fancylogos[2][]{\def\fancy@logoline{%
|
|
\fancy@logos@first@true
|
|
% we iterate over all images given in the comma-separated list
|
|
\@for\@image:={#2}\do{%
|
|
\iffancy@logos@first@\fancy@logos@first@false\else\hskip0pt plus 1filll\fi
|
|
\ifthenelse{\equal{\@image}{}}{}{%
|
|
\pic[height=4.5ex,#1]{\@image}%
|
|
}%
|
|
}%
|
|
}}
|
|
|
|
\def\fancy@titlepage@margin{20pt}
|
|
\newcommand{\@createtitleslide}{
|
|
{
|
|
\ifx \fancytitlepicture \empty \else \usebackgroundtemplate{\pic[trim=-1000 0 500 -235,width=.8\paperwidth]{\fancytitlepicture}} \fi
|
|
\begin{frame}[plain]
|
|
\vskip0pt plus 1filll
|
|
\begin{beamercolorbox}[wd=\paperwidth,ht=4.5ex,dp=2ex,right]{titlebox}
|
|
\LARGE\textbf{\inserttitle}\hspace*{20pt}
|
|
\end{beamercolorbox}%
|
|
\nointerlineskip%
|
|
\begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex,right,rightskip=\fancy@titlepage@margin]{subtitlebox}
|
|
\small
|
|
\ifx \insertsubtitle \empty \else \insertsubtitle\ $\vert$ \fi
|
|
\makeatletter
|
|
\ifx \beamer@shortauthor \empty \else \insertauthor\ $\vert$ \fi
|
|
\makeatother
|
|
\ifx \insertdate \empty \else \insertdate \fi
|
|
\end{beamercolorbox}%
|
|
\nointerlineskip
|
|
\begin{beamercolorbox}[wd=\paperwidth,ht=4.5ex,dp=2ex,leftskip=\fancy@titlepage@margin,rightskip=\fancy@titlepage@margin]{logobox}
|
|
\vspace{-1ex}%
|
|
\fancy@logoline
|
|
\end{beamercolorbox}%
|
|
\end{frame}
|
|
}
|
|
}
|
|
|
|
\renewcommandx{\maketitle}[2][1=apr21-o25a,2=0]{
|
|
\gdef\fancytitlepicture{#1}
|
|
\gdef\fancytitlepictureoffset{#2}
|
|
\@createtitleslide
|
|
}
|
|
|
|
\newcommand{\againtitle}{
|
|
\ifcsname fancytitlepicture\endcsname
|
|
\@createtitleslide
|
|
\else
|
|
\PackageError{fancybeamer}{To use \string\againtitle\space you must first use \string\maketitle!}{Either comment out this line or check if you forgot to issue the \string\maketitle-macro.}%
|
|
\fi
|
|
}
|
|
|
|
\setbeamertemplate{frametitle}{
|
|
\vspace{20pt}%
|
|
\vphantom{/}\setbox0=\hbox{\insertframetitle}%
|
|
\ifdim\wd0<\textwidth
|
|
\insertframetitle
|
|
\else\let\hfill\space\resizebox\linewidth!{\insertframetitle}\fi
|
|
}
|
|
\ifuniqueslidenumbersuffix
|
|
\def\fancy@page{\insertframenumber\ifnum\insertframestartpage=\insertframeendpage\else\rlap{\color{fg!50!bg}.\insertslidenumber}\fi}
|
|
\else
|
|
\def\fancy@page{\insertframenumber}
|
|
\fi
|
|
\setbeamertemplate{footline}{
|
|
\hypersetup{linkcolor = white}
|
|
\hbox{%
|
|
\begin{beamercolorbox}[wd=0.93\textwidth,ht=3mm,dp=1.5mm,left]{myfooter}
|
|
\hspace{0.03\textwidth}
|
|
\insertshortauthor
|
|
\hfill
|
|
\insertshorttitle\
|
|
\ifx \insertsubtitle \empty \else {-- \insertshortsubtitle} \fi
|
|
\ifx \insertsectionhead \empty \else {-- \thesection.~\insertsectionhead} \fi
|
|
\hspace{0.03\textwidth}
|
|
\end{beamercolorbox}%
|
|
\begin{beamercolorbox}[wd=0.07\textwidth,ht=3mm,dp=1.5mm,center]{mypagenumber}
|
|
\usebeamerfont{page number in head/foot}%
|
|
\fancy@page
|
|
\end{beamercolorbox}%
|
|
}%
|
|
}
|
|
|
|
% ---------------------------------------------
|
|
% table of contents
|
|
% ---------------------------------------------
|
|
\ifsectiontitleslide
|
|
\AtBeginSection{
|
|
\ifsectionoverview
|
|
\begin{frame}{\thesection.~\insertsection}
|
|
\linespread{.5}
|
|
\vfill
|
|
\tableofcontents[currentsection,hideothersubsections]
|
|
\end{frame}
|
|
\else
|
|
\begin{frame}
|
|
\usebeamerfont{section title}\textbf{\thesection.~\insertsection}
|
|
\end{frame}
|
|
\fi
|
|
}
|
|
\fi
|
|
|
|
\newcommand{\contentoverview}[1][1]{
|
|
\begin{frame}{\inserttitle}
|
|
\linespread{.5}
|
|
\vfill
|
|
\ifthenelse{#1>1}{ % use multiple columns if more than one column is specified
|
|
\begin{multicols}{#1}
|
|
\tableofcontents
|
|
\end{multicols}
|
|
}{
|
|
\tableofcontents
|
|
}
|
|
|
|
\end{frame}
|
|
}
|
|
|
|
% ---------------------------------------------
|
|
% handling lectures
|
|
% ---------------------------------------------
|
|
\AtBeginLecture{
|
|
\part{}
|
|
\subtitle{\thelecture.~\insertlecture}
|
|
\beamer@tocsectionnumber=0\relax
|
|
\setcounter{section}{0}
|
|
\setcounter{framenumber}{0}
|
|
}
|
|
|
|
% ---------------------------------------------
|
|
% content layout
|
|
% ---------------------------------------------
|
|
\newcommand{\halfpage}[1]{\partofpage{48}{#1}}
|
|
|
|
\newcommand{\thirdpage}[1]{\partofpage{31}{#1}}
|
|
|
|
\usepackage{adjustbox}
|
|
\newcommand{\partofpage}[2]{
|
|
\begin{minipage}{0.#1\textwidth}
|
|
\begin{flushleft}
|
|
#2
|
|
\end{flushleft}
|
|
\end{minipage}
|
|
}
|
|
|
|
% corresponds to '\halfpage', however, with the new columns we could use larger values
|
|
% (same for thirdnext)
|
|
\def\halfnext{.489\textwidth}
|
|
% corresponds to '\thirdpage'
|
|
\def\thirdnext{.31\textwidth}
|
|
|
|
\newcommand\leftandright[2]{%
|
|
\halfpage{#1}%
|
|
\hfill
|
|
\halfpage{#2}%
|
|
}
|
|
|
|
\newcommand\leftmiddleandright[3]{%
|
|
\thirdpage{#1}%
|
|
\hfill
|
|
\thirdpage{#2}%
|
|
\hfill
|
|
\thirdpage{#3}%
|
|
}
|
|
|
|
\newcommand\leftthenright[2]{%
|
|
\halfpage{#1}%
|
|
\hfill
|
|
\onslide<2->{\halfpage{#2}}%
|
|
}
|
|
|
|
\newcommand\rightthenleft[2]{
|
|
\onslide<2->{\halfpage{#1}}
|
|
\hfill
|
|
\halfpage{#2}
|
|
}
|
|
|
|
\newcommand\leftmiddlethenright[3]{%
|
|
\thirdpage{#1}%
|
|
\hfill
|
|
\onslide<2->{\thirdpage{#2}}%
|
|
\hfill
|
|
\onslide<3->{\thirdpage{#3}}%
|
|
}
|
|
|
|
\newcommand\rightmiddlethenleft[3]{%
|
|
\onslide<3->{\thirdpage{#1}}%
|
|
\hfill
|
|
\onslide<2->{\thirdpage{#2}}%
|
|
\hfill
|
|
\thirdpage{#3}%
|
|
}
|
|
|
|
\newif\ifrecording % for enabling or disabling recording mode
|
|
|
|
\newcommand\leftorright[2]{% only works in recording mode
|
|
\ifrecording
|
|
\onslide<1>{\halfpage{#1}}%
|
|
\onslide<2>{\hfill}%
|
|
\onslide<3>{\halfpage{#2}}%
|
|
\else
|
|
\leftthenright{#1}{#2}%
|
|
\fi
|
|
}
|
|
|
|
\newcommand\rightorleft[2]{% only works in recording mode
|
|
\ifrecording
|
|
\onslide<3>{\halfpage{#1}}%
|
|
\onslide<2>{\hfill}%
|
|
\onslide<1>{\halfpage{#2}}%
|
|
\else
|
|
\rightthenleft{#1}{#2}%
|
|
\fi
|
|
}
|
|
|
|
\newcommand\leftmiddleorright[3]{% only works in recording mode
|
|
\ifrecording
|
|
\onslide<1>{\thirdpage{#1}}%
|
|
\onslide<2>{\hfill}%
|
|
\onslide<3>{\thirdpage{#2}}%
|
|
\onslide<4>{\hfill}%
|
|
\onslide<5>{\thirdpage{#3}}%
|
|
\else
|
|
\leftmiddlethenright{#1}{#2}{#3}%
|
|
\fi
|
|
}
|
|
|
|
\newcommand\rightmiddleorleft[3]{% only works in recording mode
|
|
\ifrecording
|
|
\onslide<5>{\thirdpage{#1}}%
|
|
\onslide<4>{\hfill}%
|
|
\onslide<3>{\thirdpage{#2}}%
|
|
\onslide<2>{\hfill}%
|
|
\onslide<1>{\thirdpage{#3}}%
|
|
\else
|
|
\rightmiddlethenleft{#1}{#2}{#3}%
|
|
\fi
|
|
}
|
|
|
|
% here, we configure the defaults
|
|
\def\fancy@cols@extra{} % no extra options for the columns environment
|
|
% init | step
|
|
\def\fancy@cols@animation#1#2{%
|
|
% defines the increment for each step (always positive)
|
|
% you can supply a step greater than 0, allowing for 'empty-animations' between the columns
|
|
\def\fancy@cols@anim@step{#1}%
|
|
% '-' for keep, '' (empty) for forget
|
|
\def\fancy@cols@anim@suff{#2}%
|
|
}
|
|
\def\fancy@cols@anim@init{1} % start on the first column
|
|
\def\fancy@cols@anim@step@sign{+}% count up (if there is anything to count)
|
|
\newdimen\fancy@cols@total@width % holds the column width
|
|
\newdimen\fancy@cols@height % holds the target height of the columns environment (negative for auto)
|
|
|
|
\def\fancy@cols@widths@max{100} % the maximum number to be used for widths
|
|
% with this, we define the keys that are usable within the optional argument of '\fancycolumns'
|
|
|
|
\def\@fancy@animation@none{\fancy@cols@animation{0}{-}}
|
|
\def\@fancy@animation@keep{\fancy@cols@animation{1}{-}}
|
|
\def\@fancy@animation@forget{\fancy@cols@animation{1}{}}
|
|
|
|
|
|
\pgfqkeys{/fancy columns}{
|
|
% search also allows to write 'c' instead of 'align/c' etc.
|
|
/fancy columns/.search also = {/fancy columns/align},
|
|
align/c/.code = \def\fancy@cols@valign{c}, % centered
|
|
align/t/.code = \def\fancy@cols@valign{t}, % top (baseline)
|
|
align/b/.code = \def\fancy@cols@valign{b}, % bottom (baseline)
|
|
align/T/.code = \def\fancy@cols@valign{T}, % top (with height, that is, aligns to the "very-top")
|
|
% with 'width' the user can set the total width to be occupied by the columns
|
|
width/.code = \def\fancy@cols@target@width{#1},
|
|
% allows to define a preset height (in case of overflowing/changing heights on animations etc.)
|
|
height/.code = \setlength\fancy@cols@height{#1},
|
|
no height/.style = { height = -1pt },
|
|
% define the margin between columns
|
|
margin/.code = \def\fancy@cols@margin{#1},
|
|
% widths={30,20} will give the first column 30%, the next 20%, and the rest (if any) an even share of the remaining 50%
|
|
widths/.code = \def\fancy@cols@widths{#1},
|
|
% this key is only for users who need to change anything for the underlying columns mechanism
|
|
extra/columns/.code = \def\fancy@cols@extra{#1},
|
|
% control the number of columns
|
|
columns/.code = \def\fancy@cols@count{#1},
|
|
% allow for 'animation=...'
|
|
animation/.code = {%
|
|
\expandafter\ifcsname @fancy@animation@#1\endcsname
|
|
\csname @fancy@animation@#1\endcsname
|
|
\else
|
|
\PackageError{fancybeamer}{The animation '#1' does not exist! Choose either 'keep', 'forget', or 'none'.}%
|
|
\fi
|
|
},
|
|
% comfort variants, just so the user does not have to write 'animation='
|
|
keep/.style = {animation=keep},
|
|
forget/.style = {animation=forget},
|
|
% deliberately not offer a comfort-variant for the default (none)
|
|
% reverse animation order by setting the initial animation to the amount of columns and making the step (animation delta
|
|
% per column) negative (\fancy@cols@anim@step@sign controls if the animation goes up (+) or down (-))
|
|
reverse/.code = \def\fancy@cols@anim@init{\fancy@cols@count}\def\fancy@cols@anim@step@sign{-},
|
|
% by overwriting the style '/fancy columns/@defaults',
|
|
% the user can change these defaults
|
|
@defaults/.style = {%
|
|
c, % center align
|
|
no height,
|
|
columns = 2, animation=none, % one column, no animation
|
|
widths = {}, % use default widths (evenly distribute)
|
|
width = \linewidth, %
|
|
% this number was merely chosen to look visually pleasing
|
|
% we could also use the default columnsep of latx,
|
|
margin = 0.035\linewidth
|
|
}
|
|
}
|
|
|
|
% allows to user to overwrite the defaults
|
|
\newcommand\setfancycolumnsdefault[1]{\pgfqkeys{/fancy columns}{@defaults/.append style={#1}}}
|
|
|
|
% we need two counters
|
|
% 'fancy@cols@current' holds the column we are currently in (starts with 0)
|
|
\newcounter{fancy@cols@current}
|
|
% 'fancy@cols@currentanim' holds the slide the current column should appear on
|
|
\newcounter{fancy@cols@currentanim}
|
|
% 'fancy@cols@current' will increment by 1 for each column
|
|
% 'fancy@cols@currentanim' may increment similarly (animation without reverse)
|
|
% ... may decrement by 1 (animation with reverse)
|
|
% ... may remain constant (without animation)
|
|
|
|
% code to be executed at the start of the columns
|
|
\newcommand\fancy@cols@init{%
|
|
% reset the counter for the current column
|
|
\setcounter{fancy@cols@current}{0}%
|
|
% initialize the current animation counter with the start animation
|
|
% this is 1 without reverse, and the number of columns if reverse is active
|
|
\setcounter{fancy@cols@currentanim}{\fancy@cols@anim@init}%
|
|
% due to the way beamer calculates the columns, we remove the margin from the width
|
|
% see etoolbox for an explanation of '\dimdef' (basically allows for calculations with dimensions)
|
|
\dimdef{\fancy@cols@total@width}{\linewidth-\fancy@cols@margin*\fancy@cols@count+\fancy@cols@margin}%
|
|
% activate(/overwrite) the '\nextcolumn' macro within the environment
|
|
\let\nextcolumn\fancy@nextcolumn
|
|
% a rather complicated macro, which sets/calculates the widths for all columns
|
|
\fancy@cols@initialize@widths
|
|
% issue the first column
|
|
% NOTE: we don't guard if 'columns' is below 1 (e.g. we always assume, there is 1 column)
|
|
\nextcolumn
|
|
}
|
|
|
|
% a temporary counter so we do not need to use low-level tex counters (like @tempcnta)
|
|
% with '\value{fancy@cols@temp}' we get the numerical value of the counter
|
|
% with '\arabic{fancy@cols@temp}' we get the (textual) "number"-value of the counter
|
|
\newcounter{fancy@cols@temp}
|
|
|
|
% the only thing important by this macro are other commands sequences:
|
|
% \fancy@cols@col@0, \fancy@cols@col@1, \fancy@cols@col@2, ...
|
|
% which hold the total width, column with number 0, 1, 2, ... should occupy
|
|
% it uses the total number of columns, the supplied total width of all columns
|
|
% and the desired 'widths={...}'. If there are more columns (e.g. widths={30}, columns=3)
|
|
% it will automatically distributed the remaining space evenly.
|
|
% note, that while we assume the units of 'widths' to be percentages, it is really the
|
|
% macro '\fancy@cols@widths@max' which holds the number they should sum up to (i.e. 100)
|
|
\newcommand\fancy@cols@initialize@widths{%
|
|
% first of all, we iterate over the given 'widths={...}' (stored within \fancy@cols@widths)
|
|
% we use 'fancy@cols@temp' to count the number of widths supplied
|
|
\setcounter{fancy@cols@temp}{0}%
|
|
% The macro '\fancy@cols@widths@max' holds the desired target which all the supplied widths should sum up to it is
|
|
% probably 100 (therefore, supplying widths={20,10}, would reduce '\fancy@cols@remaining@width' from 100 to 70)
|
|
\let\fancy@cols@remaining@width\fancy@cols@widths@max
|
|
% now we use '@for' which iterates over all widths (comma-separated) stored in '\fancy@cols@widths'
|
|
% the loop variable '\@fancy@cols@width' will hold the current width in each loop
|
|
\@for\@fancy@cols@width:=\fancy@cols@widths\do{%
|
|
% with 'protected@csedef' we (in short) define a new macro but supply its name in terms of another macro
|
|
% this macro name can contain numbers etc.
|
|
% essential, we define '\fancy@cols@col@<current column>' that is, 'widths={20,30}' would create:
|
|
% \fancy@cols@col@0, which holds the calculated value for 20
|
|
% \fancy@cols@col@1, which holds the calculated value for 20
|
|
% See the etoolbox package for an explanation of '\csdimdef'
|
|
\csdimdef{fancy@cols@col@\arabic{fancy@cols@temp}}{%
|
|
% We make math on dimensions. Essentially, we calculate the total width to be occupied
|
|
% by those column (i.e. translating from the percentages of 'widths' to the real dimension)
|
|
\fancy@cols@total@width*\@fancy@cols@width/\fancy@cols@widths@max
|
|
% Example:
|
|
% with '\fancy@cols@total@width' being probably something like '\linewidth' and '\fancy@cols@widths@max' being 100
|
|
% this can be read as: '\linewidth * \@fancy@cols@width/100'
|
|
% Suppose, the current '\@fancy@cols@width' is 20, this would result in '\linewidth * 0.2' or "20% of the width of the line"
|
|
}%
|
|
% now we update the amount of widths left (e.g., when we have '\fancy@cols@remaining@width' as 100 and a '\@fancy@cols@width' of 20,
|
|
% this will reduce the remaining number to 80). See etoolbox for an explanation of numdef
|
|
\numdef\fancy@cols@remaining@width{\fancy@cols@remaining@width-\@fancy@cols@width}%
|
|
% step the counter to move to the width for the next column
|
|
\stepcounter{fancy@cols@temp}%
|
|
% check, if we have too many columns
|
|
\ifnum\value{fancy@cols@temp}>\fancy@cols@count\relax
|
|
\PackageWarning{fancybeamer}{You specified '\fancy@cols@count' columns, but supplied more lengths to widths (\fancy@cols@widths) (page: \thepage, frame: \insertframenumber,\on@line). Reduce the amount of widths supplied or increase the number of columns}%
|
|
\fi
|
|
}%
|
|
% after processing all 'widths={...}' we check, if the user supplied (in sum) more than we have 'e.g., when having percentages (with 100)
|
|
% supplying 'widths={90,20}' would issue this error as we now have a '110%' column
|
|
\ifnum\fancy@cols@remaining@width<0\relax
|
|
\PackageWarning{fancybeamer}{Widths (\fancy@cols@widths) sum up to more than the allowed max '\fancy@cols@widths@max' (page: \thepage, frame: \insertframenumber,\on@line). Please update the supplied widths.}%
|
|
\fi
|
|
% for the remaining columns, distribute remaining width evenly
|
|
% if the user supplied 'columns=5' (stored in \fancy@cols@count) and 'widths={15,30}',
|
|
% this will set '\@fancy@cols@remaining@cols' to 3.
|
|
\edef\@fancy@cols@remaining@cols{\the\numexpr\fancy@cols@count-\value{fancy@cols@temp}}%
|
|
% NOTE: maybe we should notify the user of the even distribution?
|
|
% we only do something, if there is at least one column that the user supplied no width
|
|
\ifnum\@fancy@cols@remaining@cols>0
|
|
% we distribute the width evenly. therefore we calculate the width that remains for each column
|
|
% if there are 60%, and 3 columns remaining, we give each '\fancy@cols@total@width * 0.2' or 20%
|
|
% of the total column width.
|
|
\dimdef\@fancy@cols@remaining@colwidth{%
|
|
\fancy@cols@total@width*%
|
|
% this part of the expression basically calculates the percentage (20%...)
|
|
\fancy@cols@remaining@width/\fancy@cols@widths@max/\@fancy@cols@remaining@cols%
|
|
}%
|
|
% now, we use a while loop to iterate over the remaining columns
|
|
\@whilenum\value{fancy@cols@temp}<\fancy@cols@count\do{% 'while(i < #columns) { ... }
|
|
% we define the '\fancy@cols@col@<current column>'
|
|
% macros holding the width. With 60%, a total width of '\linewidth'
|
|
% and three out of 5 columns remaining, this would define:
|
|
% \fancy@cols@col@2, which holds \linewidth*0.2
|
|
% \fancy@cols@col@3, which holds \linewidth*0.2
|
|
% \fancy@cols@col@4, which holds \linewidth*0.2
|
|
\csedef{fancy@cols@col@\arabic{fancy@cols@temp}}{\@fancy@cols@remaining@colwidth}%
|
|
% increment the counter
|
|
\stepcounter{fancy@cols@temp}% i += 1
|
|
}%
|
|
\fi
|
|
}
|
|
|
|
% this is the macro, that will become '\nextcolumn' within the 'fancycolumns' environment
|
|
\newcommand\fancy@nextcolumn{%
|
|
% issue a warning if too many columns
|
|
\ifnum\value{fancy@cols@current}<\fancy@cols@count\else
|
|
% this mus be an error, we calculate widths etc. only for the given columns
|
|
\PackageError{fancybeamer}{You configured 'columns=\fancy@cols@count', but supplied more (at least \arabic{fancy@cols@current}, page: \thepage, frame: \insertframenumber,\on@line)}{Either remove the command, or choose another Layout}%
|
|
\fi
|
|
% this is a debug statement, that can be used to se the current state within the animation
|
|
% \typeout{Creating col: \the\c@fancy@cols@current\space on slide: \the\c@fancy@cols@currentanim\fancy@cols@anim@suff, page: \thepage\space (width: \csuse{fancy@cols@col@\number\c@fancy@cols@current})}%
|
|
% now we issue the beamer '\column' command. In order to expand all arguments we first
|
|
% regarding the width, we use the macro 'fancy@cols@col@\number\c@fancy@cols@current'
|
|
% do a 'edef' (expanded definition, with LaTeX protection mechanism):
|
|
\protected@edef\@fancy@cols@tmp{\noexpand%
|
|
% with '<...>' we define the animation of this column
|
|
% counter 'fancy@cols@currentanim' holds the slide, this column should appear on
|
|
% '\fancy@cols@anim@suff' is either '-' (with animation=keep)
|
|
% or empty (with animation=forget)
|
|
% with 'animation=keep' (without reverse) this would be
|
|
% '\column<1->' for the first, '\column<2->' for the second, ...
|
|
\column<\arabic{fancy@cols@currentanim}\fancy@cols@anim@suff>{%
|
|
% the width of the column. For this, we use the 'fancy@cols@col@0', 'fancy@cols@col@1', ... macros
|
|
% defined by '\fancy@cols@initialize@widths'
|
|
\csuse{fancy@cols@col@\arabic{fancy@cols@current}}%
|
|
}%
|
|
}%
|
|
% basically execute the expanded macro (e.g. insert the column)
|
|
\@fancy@cols@tmp
|
|
% update the current animation accordingly (with reverse '\fancy@cols@anim@step@sign' will be '-',
|
|
% without it will be '+') the step '\fancy@cols@anim@step' is 0 for animation=none and probably 1 otherwise.
|
|
% therefore, using 'animation=keep' without reverse, would increment the counter by '+1' (a positive 1)
|
|
\addtocounter{fancy@cols@currentanim}{\fancy@cols@anim@step@sign\fancy@cols@anim@step}%
|
|
% increase the current column counter (e.g. for error checking, and for getting the correct width)
|
|
\stepcounter{fancy@cols@current}%
|
|
\ignorespaces
|
|
}
|
|
|
|
% #1: arguments like 'columns=3, keep, reverse'
|
|
\newenvironment{fancycolumns}[1][]{\begingroup
|
|
\pgfqkeys{/fancy columns}{@defaults, #1}%
|
|
\edef\fancy@previous@fancy@cols{\thefancy@cols@current}% store the current column counter
|
|
\ifdim\fancy@cols@height<0pt\begin{minipage}{\fancy@cols@target@width}\else\begin{minipage}[\fancy@cols@valign][\fancy@cols@height]{\fancy@cols@target@width}\fi%
|
|
\begin{columns}[onlytextwidth,\fancy@cols@valign, \fancy@cols@extra]
|
|
\fancy@cols@init
|
|
}{\end{columns}\end{minipage}\setcounter{fancy@cols@current}{\fancy@previous@fancy@cols}\endgroup}
|
|
|
|
% ---------------------------------------------
|
|
% color boxes
|
|
% ---------------------------------------------
|
|
\tcbset{%
|
|
% by definig styles, we avoid their replication
|
|
% #1: extra arguments, #2: title, #3: color of the frame, #4: padding, #5 boxname
|
|
fancy@basic-boxstyle/.style n args=5{
|
|
title={#2},
|
|
colframe=#3!30!boxmix,
|
|
coltitle=foreground,coltext=foreground,
|
|
before title={\setlength{\parskip}{0ex}\vphantom{/}\let\boxnumber\thetcbcounter\csname fancy@box@#5@titleprefix\endcsname},
|
|
after title={\let\boxnumber\thetcbcounter\csname fancy@box@#5@titlesuffix\endcsname},
|
|
before upper={\parskip\z@\relax},
|
|
fonttitle=\bfseries,
|
|
left=#4, right=#4, top=#4, bottom=#4, bottomtitle=-.5mm,
|
|
#1
|
|
},
|
|
% style definition for the normal boxes
|
|
% #1: extra arguments, #2: title, #3: color of the frame and background, #4: boxname
|
|
fancy@boxstyle/.style n args=4{fancy@basic-boxstyle={colback=#3!10!background,#1}{#2}{#3}{1mm}{#4}},
|
|
% style definition for their tight variant
|
|
% #1: extra arguments, #2: title, #3: color of the frame, #4: boxname
|
|
fancy@tightboxstyle/.style n args=4{fancy@basic-boxstyle={colback=background,#1}{#2}{#3}{0mm}{#4}}
|
|
}
|
|
|
|
% [optional prefix] | name | color | [optional suffix]
|
|
\newcommandx\fancy@MakeNewBox[4][1={},4={}]{%
|
|
% in the definition #2 and #3 refer to the arguments of \fancy@MakeNewBox
|
|
% while ##1 and ##2 to refer to the arguments passed on to the new tcolorbox.
|
|
% therefore, with '\fancy@MakeNewBox{definition}{orange}', we create a new tcolorbox
|
|
% named 'definition' which wenn called with '\begin{definition}[top=10mm]{My title}...'
|
|
% will result in the option list 'fancy@boxstyle={top=10mm}{My title}{orange}'
|
|
% first we assure, that we can build this box
|
|
\newtcolorbox[auto counter,reset counter on overlays]{#2}[2][]{fancy@boxstyle={##1}{##2}{fancy@box@#2}{#2}}
|
|
% here, we re-create the old macros (e.g. '\mydefinition')
|
|
% 'capture=minipage' ensures their behavior is similar to the previous one (the default for
|
|
% tcbox would be hbox and no longer fill the width)
|
|
\expandafter\newtcbox\csname my#2\endcsname[2][]{capture=minipage,fancy@boxstyle={##1}{##2}{fancy@box@#2}{#2}}%
|
|
% now, we do the same for the tight-version of the boxes
|
|
\newtcolorbox[use counter from=#2]{#2tight}[2][]{fancy@tightboxstyle={##1}{##2}{fancy@box@#2}{#2}}%
|
|
\expandafter\newtcbox\csname my#2tight\endcsname[2][]{capture=minipage,fancy@tightboxstyle={##1}{##2}{fancy@box@#2}{#2}}%
|
|
% now, get the macros in effect:
|
|
\fancy@UpdateBoxSurround{#2}{#1}{#4}%
|
|
\fancy@UpdateBoxColor{#2}{#3}%
|
|
}
|
|
% like newBox but does not care if the box does already exist
|
|
% [optional prefix] | name | color | [optional suffix]
|
|
\newcommandx\fancy@DeclareBox[4][1={},4={}]{\csundef{#2}\csundef{end#2}\csundef{my#2}\csundef{#2tight}\csundef{end#2tight}\csundef{my#2tight}%
|
|
\fancy@MakeNewBox[#1]{#2}{#3}[#4]}
|
|
|
|
|
|
% name | prefix | suffix
|
|
\def\fancy@UpdateBoxSurround#1#2#3{%
|
|
\ifcsname #1\endcsname
|
|
\expandafter\def\csname fancy@box@#1@titleprefix\endcsname{#2}%
|
|
\expandafter\def\csname fancy@box@#1@titlesuffix\endcsname{#3}%
|
|
\else
|
|
\PackageError{fancybeamer}{You can not set a box-prefix/-suffix for '#1' because there is no such box!}%
|
|
\fi}
|
|
|
|
\def\fancy@UpdateBoxPrefix#1#2{%
|
|
\ifcsname #1\endcsname
|
|
\expandafter\def\csname fancy@box@#1@titleprefix\endcsname{#2}%
|
|
\else
|
|
\PackageError{fancybeamer}{You can not set a box-prefix for '#1' because there is no such box!}%
|
|
\fi}
|
|
|
|
\def\fancy@UpdateBoxSuffix#1#2{%
|
|
\ifcsname #1\endcsname
|
|
\expandafter\def\csname fancy@box@#1@titlesuffix\endcsname{#2}%
|
|
\else
|
|
\PackageError{fancybeamer}{You can not set a box-suffix for '#1' because there is no such box!}%
|
|
\fi}
|
|
|
|
|
|
\def\fancy@UpdateBoxColor#1#2{%
|
|
\ifcsname #1\endcsname
|
|
\colorlet{fancy@box@#1}{#2}%
|
|
\else
|
|
\PackageError{fancybeamer}{You can not change the color for '#1' to '#2' because there is no such box!}
|
|
\fi}
|
|
|
|
\let\MakeNewBox\fancy@MakeNewBox
|
|
\let\DeclareBox\fancy@DeclareBox
|
|
\let\UpdateBoxColor\fancy@UpdateBoxColor
|
|
\let\UpdateBoxPrefix\fancy@UpdateBoxPrefix
|
|
\let\UpdateBoxSuffix\fancy@UpdateBoxSuffix
|
|
\let\UpdateBoxSurround\fancy@UpdateBoxSurround
|
|
|
|
% now we simply define the boxes by name and color
|
|
% => \mydefinition and \mydefinitiontight
|
|
% furthermore defines the environment \begin{definition}{<title>} ... \end{definition}
|
|
\fancy@DeclareBox{definition}{orange}
|
|
% => \myexample and \myexampletight
|
|
% furthermore defines the environment \begin{example}{<title>} ... \end{example}
|
|
\fancy@DeclareBox{example}{blue}
|
|
% => \mynote and \mynotetight
|
|
% furthermore defines the environment \begin{note}{<title>} ... \end{note}
|
|
\fancy@DeclareBox{note}{red}
|
|
|
|
% ---------------------------------------------
|
|
% Pictures
|
|
% ---------------------------------------------
|
|
% GRAPHICSPATH
|
|
\makeatletter
|
|
\newcommand{\setpaths}[1]{
|
|
\appto\Ginput@path{#1} % for loading pictures
|
|
\def\input@path{#1} % for loading picture sources
|
|
}
|
|
\makeatother
|
|
|
|
% adding links from text file to pictures automatically
|
|
\newcommand\hreffile[1]{%
|
|
\CatchFileDef\myurl{#1}{\catcode`\#=12\catcode`\%=12\endlinechar=-1}%
|
|
\expandafter\href\expandafter{\myurl}}
|
|
\newcommand{\pic}[2][]{%
|
|
\IfFileExists{#2.txt}{\hreffile{#2.txt}}{}{\adjincludegraphics[#1]{#2}}
|
|
}
|
|
\newcommand{\picDark}[2][]{\pic[#1]{#2}}
|
|
\ifdarkmode
|
|
\renewcommand{\picDark}[2][]{%
|
|
\IfFileExists{#2-dark.png}{\pic[#1]{#2-dark.png}}{%
|
|
\IfFileExists{#2-dark.pdf}{\pic[#1]{#2-dark.pdf}}{%
|
|
\pic[#1,decodearray={1 .25 1 .25 1 .25}]{#2}}}%
|
|
}
|
|
\fi
|