\AtEndPreamble{\usepackage{../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{\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=0 0 0 \fancytitlepictureoffset,clip,width=\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@' 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@' % 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}{} ... \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