% ----------------------------------------------------------
% iodhbwm-templates package
%
%   inofficial package for DHBW Mannheim to simplify writing
%   theses with the given requirements
% ----------------------------------------------------------
% Felix Faltin
% E-Mail: ffaltin91@gmail.com
% ----------------------------------------------------------
% Copyright 2017-2019 Felix Faltin
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Felix Faltin.
%
% ----------------------------------------------------------

\newcommand*{\iodhbwm@pkg@version}{v1.1.1}
\newcommand*{\iodhbwm@pkg@date}{2019-09-08}
\newcommand*{\iodhbwm@pkg@info}{Inoffical DHBW Mannheim thesis package}
\newcommand*{\iodhbwm@pkg@name}{iodhbwm-templates}

\ProvidesPackage{\iodhbwm@pkg@name}[%
\iodhbwm@pkg@date\space
\iodhbwm@pkg@version\space
\iodhbwm@pkg@info]
\RequirePackage{etoolbox, pgfopts}

%---------------------------------------------------
% KOMA-Script settings
%---------------------------------------------------
\@ifundefined{KOMAClassName}{%
    \PackageWarningNoLine{iodhbwm}{This package is designed to work with KOMA-Script. Please use either `scrartcl`, `scrreprt` or `scrbook`}
}{}
\RequirePackage[figure,table]{totalcount}
\RequirePackage{xpatch}

%\PassOptionsToPackage{table}{xcolor}
%\RequirePackage{graphicx, tikz}         % Required inside titlepage templates
%\RequirePackage{tabularx, booktabs}     % Required inside titlepage templates

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                           %
%                    OPTIONS AND FLAGS                      %
%                                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% ----------------------------------------------------------
% Define booleans
% ----------------------------------------------------------
\newbool{iodhbwm@if@hasSecondTopic}
\newbool{iodhbwm@if@customtitlepage}
\newbool{iodhbwm@if@customdeclaration}
\newbool{iodhbwm@if@print@titlepage}
\newbool{iodhbwm@if@print@declaration}
\newbool{iodhbwm@if@print@abstract}
\newbool{iodhbwm@if@print@toc}
\newbool{iodhbwm@if@print@lot}
\newbool{iodhbwm@if@print@lof}
\newbool{iodhbwm@if@print@location}
\newbool{iodhbwm@if@oldpagestyle}

% ----------------------------------------------------------
% Define internal commands
% ----------------------------------------------------------
\newcommand*{\iodhbwm@file@prefix}{dhbw}
\newcommand*{\iodhbwm@file@ending}{.def}
\edef\iodhbwm@file@titlepage@default{\iodhbwm@file@prefix-titlepage\iodhbwm@file@ending}
\edef\iodhbwm@file@titlepage@ba{\iodhbwm@file@prefix-titlepage-ba\iodhbwm@file@ending}
\edef\iodhbwm@file@titlepage@sa{\iodhbwm@file@prefix-titlepage-sa\iodhbwm@file@ending}
\edef\iodhbwm@file@titlepage@pa{\iodhbwm@file@prefix-titlepage-pa\iodhbwm@file@ending}
\edef\iodhbwm@file@declaration@default{\iodhbwm@file@prefix-declaration\iodhbwm@file@ending}
\edef\iodhbwm@file@abstract@default{\iodhbwm@file@prefix-abstract.inc}

\def\iodhbwm@bachelor@type@boe{Bachelor of Engineering}
\def\iodhbwm@bachelor@type@bos{Bachelor of Science}
\def\iodhbwm@bachelor@type@boa{Bachelor of Arts}

\def\iodhbwm@thesis@type@ba{Bachelorarbeit}
\def\iodhbwm@thesis@type@pa{Projektarbeit}
\def\iodhbwm@thesis@type@sa{Studienarbeit}

\def\iodhbwm@dhbw@location@default{Mannheim}
\def\iodhbwm@dhbw@logo@default{dhbw-logo}

%---------------------------------------------------
% Defining package options
%---------------------------------------------------
\pgfkeys{
    /dhbw/.cd,
    titlepage/.store in             = \@iodhbwm@file@titlepage,
    titlepage/.default              = \iodhbwm@file@titlepage@default,
    titlepage                       = \iodhbwm@file@titlepage@default,
    declaration/.store in           = \@iodhbwm@file@declaration,
    declaration/.default            = \iodhbwm@file@declaration@default,
    declaration                     = \iodhbwm@file@declaration@default,
    abstract/.store in              = \@iodhbwm@file@abstract,
    abstract/.default               = \iodhbwm@file@abstract@default,
    abstract =                      = \iodhbwm@file@abstract@default,
    bachelor degree type/.store in  = \iodhbwm@bachelor@degree,
    bachelor degree type/.default   = \iodhbwm@bachelor@type@boe,
    bachelor degree type            = \iodhbwm@bachelor@type@boe,
    bachelor degree/.is choice,
    bachelor degree/BoE/.estyle = {/dhbw/bachelor degree type = \iodhbwm@bachelor@type@boe},
    bachelor degree/BoS/.estyle = {/dhbw/bachelor degree type = \iodhbwm@bachelor@type@bos},
    bachelor degree/BoA/.estyle = {/dhbw/bachelor degree type = \iodhbwm@bachelor@type@boa},
    thesis type name/.store in  = \iodhbwm@thesis@type,
    thesis type name/.default   = \iodhbwm@thesis@type@ba,
    thesis type name            = \iodhbwm@thesis@type@ba,
    thesis type/.is choice,
    thesis type/BA/.estyle = {%
        /dhbw/titlepage = \iodhbwm@file@titlepage@ba,%
        /dhbw/thesis type name = \iodhbwm@thesis@type@ba%
    },
    thesis type/SA/.estyle = {%
        /dhbw/titlepage = \iodhbwm@file@titlepage@sa,%
        /dhbw/thesis type name = \iodhbwm@thesis@type@sa%
    },
    thesis type/PA/.estyle = {%
        /dhbw/titlepage = \iodhbwm@file@titlepage@pa,%
        /dhbw/thesis type name = \iodhbwm@thesis@type@pa%
    },
    thesis title/.store in = \iodhbwm@thesis@title,
    thesis title                    = {},
    thesis second title/.store in   = \iodhbwm@thesis@second@title,
    thesis second title             = {},
    author/.store in                = \iodhbwm@author,
    author                          = {},
    date/.code                      = {%
        \def\iodhbwm@date{#1}%
        \def\iodhbwm@date@submission{#1}%
    },
    date                            = \today,
    submission date/.store in       = \iodhbwm@date@submission,
    location/.store in              = \iodhbwm@location,
    location                        = {},
    dhbw location/.store in         = \iodhbwm@dhbw@location,
    dhbw location/.default          = \iodhbwm@dhbw@location@default,
    dhbw location                   = \iodhbwm@dhbw@location@default,
    dhbw logo/.store in             = \iodhbwm@dhbw@logo,
    dhbw logo/.default              = \iodhbwm@dhbw@logo@default,
    dhbw logo                       = \iodhbwm@dhbw@logo@default,
    institute/.store in             = \iodhbwm@institute,
    institute section/.store in     = \iodhbwm@institute@section,
    institute section               = {},
    institute logo/.store in        = \iodhbwm@institute@logo,
    institute logo                  = {},
    student id/.store in            = \iodhbwm@student@id,
    student id                      = {},
    course/name/.store in           = \iodhbwm@course@name,
    course/name                     = {Informationstechnik},
    course/id/.store in             = \iodhbwm@course@id,
    course/id                       = {},
    supervisor/.store in            = \iodhbwm@supervisor,
    supervisor                      = {},
    processing period/.store in     = \iodhbwm@processing@period,
    processing period               = {},
    reviewer/.store in              = \iodhbwm@reviewer,
    reviewer                        = {},
    titlepage/print location/.is if  = iodhbwm@if@print@location,
    intro/print titlepage/.is if     = iodhbwm@if@print@titlepage,
    intro/print abstract/.is if      = iodhbwm@if@print@abstract,
    intro/abstract file/.search also = {/dhbw/abstract},
    intro/print declaration/.is if   = iodhbwm@if@print@declaration,
    intro/print toc/.is if           = iodhbwm@if@print@toc,
    intro/print lof/.is if           = iodhbwm@if@print@lof,
    intro/print lot/.is if           = iodhbwm@if@print@lot,
    intro/print all lists/.style     = {%
        /dhbw/intro/print toc = true,
        /dhbw/intro/print lot = true,
        /dhbw/intro/print lof = true
    },
    intro/print all/.style = {%
        /dhbw/intro/print all lists     = true,
        /dhbw/intro/print titlepage     = true,
        /dhbw/intro/print declaration   = true,
        /dhbw/intro/print abstract      = true
    },
    intro/append custom content/.store in = \iodhbwm@append@custom@content,
    intro/append custom content           = {},
    intro/roman page numbers/.is if       = iodhbwm@if@oldpagestyle
}

\newrobustcmd\dhbwsetup[1]{\pgfqkeys{/dhbw}{#1}}

\ProcessPgfOptions{/dhbw}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                           %
%                 DEFINE PACKAGE COMMANDS                   %
%                                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Some of these commands are required to print
% predefined titlepages.
% required
%---------------------------------------------------
% GETTER
%---------------------------------------------------
\newcommand{\getAuthor}{%
    \ifdefempty{\iodhbwm@author}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option author required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space author = {Your name}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@author}%
}
% required
\newcommand{\getThesisTitle}{%
    \ifdefempty{\iodhbwm@thesis@title}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option thesis title required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space thesis title = {Your title}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@thesis@title}%
}
% optional
\newcommand{\getThesisSecondTitle}{\iodhbwm@thesis@second@title}

% required
\newcommand{\getLocation}{%
    \ifdefempty{\iodhbwm@location}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option location required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space location = {Your location}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@location}%
}
% required
\newcommand{\getCourseName}{%
    \ifdefempty{\iodhbwm@course@name}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option course/name required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space course/name = {Your course name}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@course@name}%
}
\newcommand{\getCourseId}{%
    \ifdefempty{\iodhbwm@course@id}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option course required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space course/id = {Your course id}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@course@id}%
}
% required
\newcommand{\getStudentId}{%
    \ifdefempty{\iodhbwm@student@id}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option student id required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space student id = {Your student id}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@student@id}%
}
% optional
\newcommand{\getInstituteLogo}{\iodhbwm@institute@logo}
\newcommand{\getInstitute}{%
    \ifdefempty{\iodhbwm@institute}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option institute required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space institute = {Your institute}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@institute}%
}
\newcommand{\getInstituteSection}{%
    \ifdefempty{\iodhbwm@institute@section}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option institute section required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space institute section = {Your institute section}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@institute@section}%
}
\newcommand{\getSupervisor}{%
    \ifdefempty{\iodhbwm@supervisor}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option supervisor required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space supervisor = {Your supervisor}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@supervisor}%
}
\newcommand{\getProcessingPeriod}{%
    \ifdefempty{\iodhbwm@processing@period}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option supervisor required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space processing period = {Your processing period}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@processing@period}%
}
\newcommand{\getDate}{\iodhbwm@date}
\newcommand{\getSubmissionDate}{\iodhbwm@date@submission}
\newcommand{\getReviewer}{%
    \ifdefempty{\iodhbwm@reviewer}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option reviewer required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space reviewer = {Your reviewer}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@reviewer}%
}
\newcommand{\getBachelorDegree}{%
    \ifdefempty{\iodhbwm@bachelorDegree}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option bachelor degree required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space bachelor degree = BoE | BoS | BoA\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@bachelor@degree}%
}
\newcommand{\getThesisType}{%
    \ifdefempty{\iodhbwm@thesis@type}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option thesis type required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space thesis type = BA | SA | PA\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@thesis@type}%
}
\newcommand{\getDHBWLocation}{%
    \ifdefempty{\iodhbwm@dhbw@location}{%
        \PackageError{\iodhbwm@pkg@name}{%
            Option dhbw location required!\MessageBreak
            Please use\MessageBreak\protect\dhbwsetup{\MessageBreak
                \space\space dhbw location = {Your DHBW Location}\MessageBreak
        }}{See documentation for more information}%
    }{\iodhbwm@dhbw@location}%
}
\newcommand{\getDHBWLogo}{\iodhbwm@dhbw@logo}

% ----------------------------------------------------------
% Commands for structuring
% ----------------------------------------------------------

% Makro zum Einfügen einer Titelseite
\newcommand{\dhbwtitlepage}{%
    \InputIfFileExists{\@iodhbwm@file@titlepage}{}{%
        \input{\pgfkeysvalueof{/dhbw/titlepage/.@def}}%
        \PackageWarning{\iodhbwm@pkg@name}{The passed file `\@iodhbwm@file@titlepage` was not found.\MessageBreak Used default titlepage instead.}
    }%
}

% Makro zum Einfügen der Selbsterklärung
\newcommand{\dhbwdeclaration}{%
    \InputIfFileExists{\@iodhbwm@file@declaration}{}{%
        \input{\pgfkeysvalueof{/dhbw/declaration/.@def}}%
        \PackageWarning{\iodhbwm@pkg@name}{The passed declaration `\@iodhbwm@file@declaration` is unknown.\MessageBreak Used default declaration instead.}
    }%
}

% Input abstract
\newcommand{\dhbwabstract}{%
    \InputIfFileExists{\@iodhbwm@file@abstract}{}{%
        \PackageInfo{\iodhbwm@pkg@name}{The passed abstract `\@iodhbwm@file@abstract` could not be found.}
    }%
}

% Remove page number in toc from lof/lot/...loX
%https://tex.stackexchange.com/questions/440188/remove-page-numbers-of-lof-lot-in-toc
\RedeclareSectionCommand[
    tocpagenumberformat=\tocchapterpagenumberformat
]{chapter}
\newbool{iodhbwm@if@toc@unnumbered}
\newcommand*{\tocchapterpagenumberformat}[1]{%
    {\ifbool{iodhbwm@if@toc@unnumbered}{}{\usekomafont{chapterentrypagenumber}#1}}%
}

% Switch pagestyle
% Deactivate page numbers in ToC
\newcommand{\dhbwfrontmatter}{%
    \ifbool{iodhbwm@if@oldpagestyle}{%
        \pagenumbering{Roman}%
    }{%
        \pagestyle{empty}%
        \renewcommand*{\chapterpagestyle}{empty}%
        \hypersetup{pageanchor=false}%
        \addtocontents{toc}{\booltrue{iodhbwm@if@toc@unnumbered}}%
    }%
}

% Switch pagestyle
% Start page numbering
% Set linespacing
% Activate page numbers in ToC
\newcommand{\dhbwmainmatter}{%
    \cleardoubleoddpage
    \pagestyle{scrheadings}
    \renewcommand*{\chapterpagestyle}{plain}
    \hypersetup{pageanchor=true}
    \pagenumbering{arabic}
    \onehalfspacing
    \addtocontents{toc}{\boolfalse{iodhbwm@if@toc@unnumbered}}
}

% Print default structure
\newcommand{\dhbwprintintro}{%
    \dhbwfrontmatter

    \ifbool{iodhbwm@if@print@titlepage}{\dhbwtitlepage}{}
    \ifbool{iodhbwm@if@print@declaration}{\dhbwdeclaration}{}
    \ifbool{iodhbwm@if@print@abstract}{\dhbwabstract}{}
    \ifbool{iodhbwm@if@print@toc}{\tableofcontents}{}
    % Print lof only if at least one figure is available
    \ifbool{iodhbwm@if@print@lof}{%
        \iftotalfigures
        \listoffigures
        \fi
    }{}
    % Print lot only if at least one table is available
    \ifbool{iodhbwm@if@print@lot}{%
        \iftotaltables
            \listoftables
        \fi
    }{}
    \ifcsempty{iodhbwm@custom@list}{}{\iodhbwm@append@custom@content}
%
    \dhbwmainmatter
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                           %
%                          APPENDIX                         %
%                                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pretocmd\appendix{%
    \booltrue{iodhbwm@cls@if@appendix}%
    \singlespacing%
    \ifbool{iodhbwm@cls@if@bib}{\iodhbwm@printbibliography}{}
    % Add all entries from the appendix to the \listofappendices
    \renewcommand*{\ext@toc}{atoc}%
    \scr@ifundefinedorrelax{hypersetup}{}{\hypersetup{bookmarkstype=atoc}}%
}{%
    \typeout{iodhbwm patched \noexpand\appendix successfully}
}{}

% Prepend "Anhang" to chapter name
\KOMAoptions{appendixprefix}

\DeclareNewTOC[%
    listname = {\appendixname},
    type = appendix,
    types = appendices
]{atoc}

% Prepend "Anhang" inside ToC
%https://texwelt.de/wissen/fragen/2123/wie-bekomme-ich-anhang-vor-den-buchstaben-im-inhaltsverzeichnis
\providecommand*\texorpdfstring[2]{#1}% falls hyperref nicht geladen wird
\providecommand*\appendixmore{}% falls appendixprefix=false
\newcommand*{\SavedOriginalchaptertocentry}{}
\appto\appendixmore{%
    \let\SavedOriginaladdchaptertocentry\addchaptertocentry
    \renewcommand*{\addchaptertocentry}[2]{%
        \ifstr{#1}{}{% Eintrag ohne Nummer
            \SavedOriginalchaptertocentry{#1}{#2}%
        }{% Eintrag mit Nummer
            \SavedOriginaladdchaptertocentry{}{%
                \texorpdfstring{
                    \string\expandafter\string\MakeUppercase\string\appendixname
                    ~#1:\string\enskip{}#2
                }{#2}%
            }%
        }%
    }%
}

\endinput
