%%	This is file 'hackthefootline.sty', Version 2017-08-04
%%	Copyright 2017 Sebastian Friedl <sfr682k@t-online.de>
%% 
%%	This work may be distributed and/or modified under the conditions of the LaTeX Project
%%	Public License, either version 1.3c of this license or (at your option) any later version.
%%	The latest version of this license is available at
%%		http://www.latex-project.org/lppl.txt
%%	and version 1.3c or later is part of all distributions of LaTeX version 2008-05-04 or later
%%
%%	This work has the LPPL maintenace status 'maintained'.
%%	The current maintainer of this work is Sebastian Friedl.
%%
%%	This work consists of the files hackthefootline.sty and hackthefootline-doc.tex
%%
%%	-------------------------------------------------------------------------------------------
%%
%%	The hackthefootline package is a tool providing arbitrary footline selection for
%%	LaTeX beamer's standard themes (it may work with other themes as well)
%%
%%	-------------------------------------------------------------------------------------------
%%
%%	Please report bugs and other problems as well as suggestions for improvements
%%	to my email address (sfr682k@t-online.de).
%%
%%	-------------------------------------------------------------------------------------------
%%
%%	Acknowledgement:
%%	The basic layout of the two- and three-column footline is based on the original LaTeX
%%	beamer split and infolines outer themes written by Till Tantau.
%%
%%	-------------------------------------------------------------------------------------------


\ProvidesPackage{hackthefootline}[2017/08/04 hackthefootline: arbitrary footline selection for LaTeX beamer's standard themes]
\mode<presentation>



\newcommand{\htfprintmessage}{%
	\typeout{}
	\typeout{========================================}
	\typeout{FOOTLINE HACK PERFORMED}
	\typeout{}
	\typeout{hackthefootline package}
	\typeout{Version 2017/08/04}
	\typeout{}
	\typeout{(c) 2017 Sebastian Friedl}
	\typeout{Licensed under LPPL 1.3c or later}
	\typeout{========================================}
	\typeout{}}



% OPTION AND VARIABLES DECLARATION --------------------------------------------------------------------------------------------------------------

\newif\ifbeamer@htfonecolfootline
\beamer@htfonecolfootlinefalse
\DeclareOptionBeamer{onecol}{\beamer@htfonecolfootlinetrue}

\newif\ifbeamer@htftwocolsfootline
\beamer@htftwocolsfootlinefalse
\DeclareOptionBeamer{twocols}{\beamer@htftwocolsfootlinetrue}

\newif\ifbeamer@htfthreecolsfootline
\beamer@htfthreecolsfootlinefalse
\DeclareOptionBeamer{threecols}{\beamer@htfthreecolsfootlinetrue}

\newif\ifbeamer@htfcountappendixframes
\beamer@htfcountappendixframesfalse
\DeclareOptionBeamer{countappendixframes}{\beamer@htfcountappendixframestrue}

\newif\ifbeamer@htffunnystuff
\beamer@htffunnystufftrue
\DeclareOptionBeamer{nofun}{\beamer@htffunnystufffalse}


\ProcessOptionsBeamer


% Show frame numbers?
\newif\ifbeamer@htfshowframenrs
\beamer@htfshowframenrstrue

% Check for author and/or institute when inserting the separation symbol?
\newif\ifbeamer@htfcheckauth
\newif\ifbeamer@htfcheckinst
\newif\ifbeamer@htfinsertsep
\newcommand{\htfcheckauthor}{\beamer@htfcheckauthtrue	\beamer@htfcheckinstfalse}
\newcommand{\htfcheckinstit}{\beamer@htfcheckauthfalse	\beamer@htfcheckinsttrue}
\newcommand{\htfcheckboth}{	 \beamer@htfcheckauthtrue	\beamer@htfcheckinsttrue}
\newcommand{\htfchecknone}{  \beamer@htfcheckauthfalse	\beamer@htfcheckinstfalse}

% Has the navigation bar been removed by the package?
\newif\ifbeamer@navigationremoved
\beamer@navigationremovedfalse

% Variables
\newif\ifbeamer@htfnotitle			\newif\ifbeamer@htfshorttitle		\newif\ifbeamer@htflongtitle
\newif\ifbeamer@htfnoauthinst		\newif\ifbeamer@htfonlyauthor		\newif\ifbeamer@htfonlyinstitute
\newif\ifbeamer@htfinstitutepths	\newif\ifbeamer@htfauthorpths		\newif\ifbeamer@htfauthinst
\newif\ifbeamer@htfnodate			\newif\ifbeamer@htfshortdate		\newif\ifbeamer@htflongdate
\newif\ifbeamer@htfnoframenrs		\newif\ifbeamer@htfcounterframenrs	\newif\ifbeamer@htffractionframenrs
\newif\ifbeamer@htfpercentframenrs
\newif\ifbeamer@htfcolonsep			\newif\ifbeamer@htfcommasep			\newif\ifbeamer@htfsepspace
\newif\ifbeamer@htfnofootline



% DEFAULT VALUES --------------------------------------------------------------------------------------------------------------------------------

\beamer@htfnofootlinefalse
\ifbeamer@htfonecolfootline\else
	\ifbeamer@htftwocolsfootline\else
		\ifbeamer@htfthreecolsfootline\else
			\beamer@htfnofootlinetrue
\fi	\fi	\fi

\newcommand{\htfnofootlinedefault}{%
	\beamer@htfnoframenrstrue			\beamer@htfcounterframenrsfalse		\beamer@htffractionframenrsfalse
	\beamer@htfpercentframenrsfalse		\beamer@htfshowframenrsfalse
}

\newcommand{\htfonecolfootlinedefault}{%
	\beamer@htfnotitlefalse				\beamer@htfshorttitletrue			\beamer@htflongtitlefalse
	\beamer@htfnoauthinstfalse			\beamer@htfonlyauthorfalse			\beamer@htfonlyinstitutefalse
	\beamer@htfinstitutepthsfalse		\beamer@htfauthorpthsfalse			\beamer@htfauthinsttrue
	\beamer@htfnodatetrue				\beamer@htfshortdatefalse			\beamer@htflongdatefalse
	\beamer@htfnoframenrsfalse			\beamer@htfcounterframenrsfalse		\beamer@htffractionframenrstrue
	\beamer@htfpercentframenrsfalse
	\beamer@htfcolonseptrue				\beamer@htfcommasepfalse			\beamer@htfsepspacefalse
}

\newcommand{\htftwocolsfootlinedefault}{%
	\beamer@htfnotitlefalse				\beamer@htfshorttitletrue			\beamer@htflongtitlefalse
	\beamer@htfnoauthinstfalse			\beamer@htfonlyauthortrue			\beamer@htfonlyinstitutefalse
	\beamer@htfinstitutepthsfalse		\beamer@htfauthorpthsfalse			\beamer@htfauthinstfalse
	\beamer@htfnodatetrue				\beamer@htfshortdatefalse			\beamer@htflongdatefalse
	\beamer@htfnoframenrstrue			\beamer@htfcounterframenrsfalse		\beamer@htffractionframenrsfalse
	\beamer@htfpercentframenrsfalse
}

\newcommand{\htfthreecolsfootlinedefault}{%
	\beamer@htfnotitlefalse				\beamer@htfshorttitletrue			\beamer@htflongtitlefalse
	\beamer@htfnoauthinstfalse			\beamer@htfonlyauthorfalse			\beamer@htfonlyinstitutefalse
	\beamer@htfinstitutepthstrue		\beamer@htfauthorpthsfalse			\beamer@htfauthinstfalse
	\beamer@htfnodatefalse				\beamer@htfshortdatetrue			\beamer@htflongdatefalse
	\beamer@htfnoframenrsfalse			\beamer@htfcounterframenrsfalse		\beamer@htffractionframenrstrue
	\beamer@htfpercentframenrsfalse
}



% ACTIONS FOR NOT COUNTING APPENDIX FRAMES ------------------------------------------------------------------------------------------------------

\ifbeamer@htfcountappendixframes\else
	% Required packages
	\RequirePackage{appendixnumberbeamer}
	\RequirePackage{etoolbox}
	
	% Removes frame numbers for appendix slides
	\apptocmd{\appendix}{%
		\beamer@htfshowframenrsfalse
	}{}{}
\fi



% REQUIREMENTS FOR SOME "FUNNY STUFF" -----------------------------------------------------------------------------------------------------------

\ifbeamer@htffunnystuff
	% Frame numbering in %: requirements, package settings, variables, commands
	\RequirePackage{calc}
	\RequirePackage[addmissingzero,autolanguage,nosepfour]{numprint}
	\npdefunit{percent}{\%}{1}
	\newlength{\progress}
	\newcommand{\updateprogress}{\setlength{\progress}{100pt*\ratio{\insertframenumber pt}{\inserttotalframenumber pt}}}
\fi



% TEMPLATES: TITLE ------------------------------------------------------------------------------------------------------------------------------

\defbeamertemplate*{htf-title}{none}{}
\defbeamertemplate*{htf-title}{short}{\insertshorttitle}
\defbeamertemplate*{htf-title}{long}{\inserttitle}



% TEMPLATES: AUTHOR / INSTITUTE -----------------------------------------------------------------------------------------------------------------

\defbeamertemplate*{htf-authinst}{none}{}
\defbeamertemplate*{htf-authinst}{onlyauth}{\insertshortauthor}
\defbeamertemplate*{htf-authinst}{onlyinst}{\insertshortinstitute}
\defbeamertemplate*{htf-authinst}{instpths}{\insertshortauthor\ifx\beamer@shortinstitute\@empty\else~~(\insertshortinstitute)\fi}
\defbeamertemplate*{htf-authinst}{authpths}{\insertshortinstitute\ifx\beamer@shortauthor\@empty\else~~(\insertshortauthor)\fi}
\defbeamertemplate*{htf-authinst}{bothcmma}{\insertshortauthor\ifx\beamer@shortinstitute\@empty\else,~\insertshortinstitute\fi}



% TEMPLATES: DATE -------------------------------------------------------------------------------------------------------------------------------

\defbeamertemplate*{htf-date}{none}{}
\defbeamertemplate*{htf-date}{short}{\insertshortdate}
\defbeamertemplate*{htf-date}{long}{\insertdate}



% TEMPLATES: FRAME NUMBERS ----------------------------------------------------------------------------------------------------------------------

\defbeamertemplate*{htf-framenrs}{none}{}
\defbeamertemplate*{htf-framenrs}{counter}{\insertframenumber}
\defbeamertemplate*{htf-framenrs}{fraction}{\insertframenumber~/~\inserttotalframenumber}
\ifbeamer@htffunnystuff
	\defbeamertemplate*{htf-framenrs}{percent}{\updateprogress\nprounddigits{0}\lenprint[percent]{\progress}}
\fi



% TEMPLATES: AUTHOR-TITLE-SEPERATOR -------------------------------------------------------------------------------------------------------------

\defbeamertemplate*{htf-atsep}{colon}{:~~~~}
\defbeamertemplate*{htf-atsep}{comma}{,~}
\defbeamertemplate*{htf-atsep}{space}{~~~~~~~~~~}



% FOOTLINE DEFINITIONS --------------------------------------------------------------------------------------------------------------------------

% No footline
\defbeamertemplate*{footline}{htf-none}{}

% One column
\defbeamertemplate*{footline}{htf-onecol}{%
	\begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex,leftskip=.3cm,rightskip=.3cm]{palette primary}%
		\usebeamerfont{author in head/foot}
		\usebeamertemplate{htf-authinst}%
		%
		\beamer@htfinsertsepfalse
		\ifbeamer@htfcheckauth\ifx\beamer@shortauthor\@empty\else\beamer@htfinsertseptrue\fi\fi
		\ifbeamer@htfcheckinst\ifx\beamer@shortinstitute\@empty\else\beamer@htfinsertseptrue\fi\fi
		%
		\ifx\beamer@shorttitle\@empty \beamer@htfinsertsepfalse \fi
		\ifbeamer@htfnotitle \beamer@htfinsertsepfalse \fi
		%
		\ifbeamer@htfinsertsep\usebeamertemplate{htf-atsep}\fi
		%
		\usebeamerfont{title in head/foot}
		\usebeamertemplate{htf-title}
		\hfill
		\usebeamercolor{date in head/foot}
		\usebeamertemplate{htf-date}
		% Dummy space for frame numbers
		\ifbeamer@htfshowframenrs \hspace{5.75em} \fi
	\end{beamercolorbox}%
	\ifbeamer@htfshowframenrs
		\vspace{-3.25ex}
		\hfill%
		\begin{beamercolorbox}[wd=6.25em,ht=2.25ex,dp=1ex,right,rightskip=.3cm]{palette primary}
			\usebeamertemplate{htf-framenrs}
		\end{beamercolorbox}
	\fi}

% Two columns
\defbeamertemplate*{footline}{htf-twocols}{%
	\leavevmode%
	\hbox{\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.5ex,dp=1.125ex,leftskip=.3cm,rightskip=.3cm]{author in head/foot}%
			\usebeamerfont{author in head/foot}\usebeamertemplate{htf-date}\hfill\usebeamertemplate{htf-authinst}
		\end{beamercolorbox}%
		\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.5ex,dp=1.125ex,leftskip=.3cm,rightskip=.3cm]{title in head/foot}%
			\usebeamerfont{title in head/foot}\usebeamertemplate{htf-title}\hfill
			\ifbeamer@htfshowframenrs \usebeamertemplate{htf-framenrs} \fi
	\end{beamercolorbox}}%
	\vskip0pt}

% Three columns
\defbeamertemplate*{footline}{htf-threecols}{
	\leavevmode%
	\hbox{%
		\begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,left,leftskip=.3cm]{author in head/foot}%
			\usebeamerfont{author in head/foot}\usebeamertemplate{htf-authinst}
		\end{beamercolorbox}%
		\begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,center]{title in head/foot}%
			\usebeamerfont{title in head/foot}\usebeamertemplate{htf-title}
		\end{beamercolorbox}%
		\begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,right,rightskip=.3cm]{date in head/foot}%
			\usebeamerfont{date in head/foot}\usebeamertemplate{htf-date}%
			% Dummy space for frame numbers
			\ifbeamer@htfshowframenrs \hspace{5.75em} \fi
		\end{beamercolorbox}%
		\ifbeamer@htfshowframenrs%
			\hspace{-6.25em}%
			\begin{beamercolorbox}[wd=6.25em,ht=2.25ex,dp=1ex,right,rightskip=.3cm]{date in head/foot}%
				\usebeamertemplate{htf-framenrs}
			\end{beamercolorbox}%
		\fi}%
	\vskip0pt}



% CONFIGURATION COMMANDS ------------------------------------------------------------------------------------------------------------------------

% Internal commands setting all variables of a certain template to "false"
\newcommand{\htfcleartitle}{%
	\beamer@htfnotitlefalse				\beamer@htfshorttitlefalse			\beamer@htflongtitlefalse}
\newcommand{\htfclearauthinst}{%
	\beamer@htfnoauthinstfalse			\beamer@htfonlyauthorfalse			\beamer@htfonlyinstitutefalse
	\beamer@htfinstitutepthsfalse		\beamer@htfauthorpthsfalse			\beamer@htfauthinstfalse}
\newcommand{\htfcleardate}{%
	\beamer@htfnodatefalse				\beamer@htfshortdatefalse			\beamer@htflongdatefalse}
\newcommand{\htfclearframenrs}{%
	\beamer@htfnoframenrsfalse			\beamer@htfcounterframenrsfalse		\beamer@htffractionframenrsfalse
	\beamer@htfpercentframenrsfalse		\beamer@htfshowframenrsfalse}
\newcommand{\htfclearsep}{%
	\beamer@htfcolonsepfalse			\beamer@htfcommasepfalse			\beamer@htfsepspacefalse}
\newcommand{\htfclearfootline}{%
	\beamer@htfonecolfootlinefalse		\beamer@htftwocolsfootlinefalse		\beamer@htfthreecolsfootlinefalse
	\beamer@htfnofootlinefalse}

% Commands switching the title template
\newcommand{\htfnotitle}{			\htfcleartitle		\beamer@htfnotitletrue}
\newcommand{\htfshorttitle}{		\htfcleartitle		\beamer@htfshorttitletrue}
\newcommand{\htflongtitle}{			\htfcleartitle		\beamer@htflongtitletrue}

% Commands switching the author/institute template
\newcommand{\htfnoauthinst}{		\htfclearauthinst	\beamer@htfnoauthinsttrue}
\newcommand{\htfonlyauthor}{		\htfclearauthinst	\beamer@htfonlyauthortrue}
\newcommand{\htfonlyinstitute}{		\htfclearauthinst	\beamer@htfonlyinstitutetrue}
\newcommand{\htfinstitutepths}{		\htfclearauthinst	\beamer@htfinstitutepthstrue}
\newcommand{\htfauthorpths}{		\htfclearauthinst	\beamer@htfauthorpthstrue}
\newcommand{\htfauthinst}{			\htfclearauthinst	\beamer@htfauthinsttrue}

% Commands switching the date template
\newcommand{\htfnodate}{			\htfcleardate		\beamer@htfnodatetrue}
\newcommand{\htfshortdate}{			\htfcleardate		\beamer@htfshortdatetrue}
\newcommand{\htflongdate}{			\htfcleardate		\beamer@htflongdatetrue}

% Commands switching the frame numbering template
\newcommand{\htfnoframenrs}{		\htfclearframenrs	\beamer@htfnoframenrstrue}
\newcommand{\htfcounterframenrs}{	\htfclearframenrs	\beamer@htfcounterframenrstrue		\beamer@htfshowframenrstrue}
\newcommand{\htffractionframenrs}{	\htfclearframenrs	\beamer@htffractionframenrstrue		\beamer@htfshowframenrstrue}
\newcommand{\htfpercentframenrs}{	\htfclearframenrs	\beamer@htfpercentframenrstrue		\beamer@htfshowframenrstrue}

% Commands switching the author/title separator template
\newcommand{\htfcolonsep}{			\htfclearsep		\beamer@htfcolonseptrue}
\newcommand{\htfcommasep}{			\htfclearsep		\beamer@htfcommaseptrue}
\newcommand{\htfsepspace}{			\htfclearsep		\beamer@htfsepspacetrue}



% HACKING COMMAND -------------------------------------------------------------------------------------------------------------------------------

\newcommand{\hackthefootline}{%
	\htfprintmessage
	
	% Selects footline layout
	\ifbeamer@htfonecolfootline		\setbeamertemplate{footline}[htf-onecol]
	\else	\ifbeamer@htftwocolsfootline	\setbeamertemplate{footline}[htf-twocols]
			\else	\ifbeamer@htfthreecolsfootline	\setbeamertemplate{footline}[htf-threecols]
					\else	\setbeamertemplate{footline}[htf-none]
	\fi		\fi		\fi
	
	% Title
	\ifbeamer@htfnotitle			\setbeamertemplate{htf-title}[none] \fi
	\ifbeamer@htfshorttitle 		\setbeamertemplate{htf-title}[short] \fi
	\ifbeamer@htflongtitle			\setbeamertemplate{htf-title}[long] \fi
	
	% Author/Institute
	\ifbeamer@htfnoauthinst			\setbeamertemplate{htf-authinst}[none] \htfchecknone \fi
	\ifbeamer@htfonlyauthor			\setbeamertemplate{htf-authinst}[onlyauth] \htfcheckauthor \fi
	\ifbeamer@htfonlyinstitute		\setbeamertemplate{htf-authinst}[onlyinst] \htfcheckinstit \fi
	\ifbeamer@htfinstitutepths		\setbeamertemplate{htf-authinst}[instpths] \htfcheckboth \fi
	\ifbeamer@htfauthorpths			\setbeamertemplate{htf-authinst}[authpths] \htfcheckboth \fi
	\ifbeamer@htfauthinst			\setbeamertemplate{htf-authinst}[bothcmma] \htfcheckboth \fi
	
	% Date
	\ifbeamer@htfnodate				\setbeamertemplate{htf-date}[none] \fi
	\ifbeamer@htfshortdate			\setbeamertemplate{htf-date}[short] \fi
	\ifbeamer@htflongdate			\setbeamertemplate{htf-date}[long] \fi
	
	% Frame numbers
	\ifbeamer@htfnoframenrs			\setbeamertemplate{htf-framenrs}[none] \fi
	\ifbeamer@htfcounterframenrs	\setbeamertemplate{htf-framenrs}[counter] \fi
	\ifbeamer@htffractionframenrs	\setbeamertemplate{htf-framenrs}[fraction] \fi
	\ifbeamer@htfpercentframenrs	\ifbeamer@htffunnystuff \setbeamertemplate{htf-framenrs}[percent]
									\else	\PackageError{hackthefootline}{For using percent frame numbers don't pass the nofun option}{}
									\fi \fi
	
	% Author--Title--separators
	\ifbeamer@htfcolonsep			\setbeamertemplate{htf-atsep}[colon] \fi
	\ifbeamer@htfcommasep 			\setbeamertemplate{htf-atsep}[comma] \fi
	\ifbeamer@htfsepspace 			\setbeamertemplate{htf-atsep}[space] \fi
}



% PERFORMS THE "INITIAL HACK" AT BEGINNING A DOCUMENT -------------------------------------------------------------------------------------------

\AtBeginDocument{
	% Load default settings ...
	\ifbeamer@htfonecolfootline \htfonecolfootlinedefault
	\else	\ifbeamer@htftwocolsfootline \htftwocolsfootlinedefault
	\else	\ifbeamer@htfthreecolsfootline \htfthreecolsfootlinedefault
	\else	\htfnofootlinedefault
	\fi		\fi		\fi
	
	% ... and perform the hack
	\hackthefootline}



% END OF FILE -----------------------------------------------------------------------------------------------------------------------------------

\mode<all>
\endinput
