
%  ▄▄▄     ▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄   ▄▄    ▄▄   ▄▄ ▄▄▄▄▄▄▄ ▄▄▄     ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄   ▄▄▄▄▄▄▄ 
% █   █   █      █       █       █  █▄█  █  █  █ █  █       █   █   █       █       █   ▄  █ █       █
% █   █   █  ▄   █▄     ▄█    ▄▄▄█       █  █  █▄█  █    ▄▄▄█   █   █    ▄  █    ▄▄▄█  █ █ █ █  ▄▄▄▄▄█
% █   █   █ █▄█  █ █   █ █   █▄▄▄█       █  █       █   █▄▄▄█   █   █   █▄█ █   █▄▄▄█   █▄▄█▄█ █▄▄▄▄▄ 
% █   █▄▄▄█      █ █   █ █    ▄▄▄██     █   █   ▄   █    ▄▄▄█   █▄▄▄█    ▄▄▄█    ▄▄▄█    ▄▄  █▄▄▄▄▄  █
% █       █  ▄   █ █   █ █   █▄▄▄█   ▄   █  █  █ █  █   █▄▄▄█       █   █   █   █▄▄▄█   █  █ █▄▄▄▄▄█ █
% █▄▄▄▄▄▄▄█▄█ █▄▄█ █▄▄▄█ █▄▄▄▄▄▄▄█▄▄█ █▄▄█  █▄▄█ █▄▄█▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█▄▄▄█   █▄▄▄▄▄▄▄█▄▄▄█  █▄█▄▄▄▄▄▄▄█

%
%   ▄▄█▀▀▀█▄█                         
% ▄██▀     ▀█                         
% ██▀       ▀ ▄██▀██▄▀███▄███  ▄▄█▀██ 
% ██         ██▀   ▀██ ██▀ ▀▀ ▄█▀   ██
% ██▄        ██     ██ ██     ██▀▀▀▀▀▀
% ▀██▄     ▄▀██▄   ▄██ ██     ██▄    ▄
%   ▀▀█████▀  ▀█████▀▄████▄    ▀█████▀

% This file contains all necessary dependencies for the document to compile (at all) and some core macros
% Load this before the config file


% ── Imports ─────────────────────────────────────────────────────────
\typeout{[Core] Importing!}

\usepackage[table, dvipsnames]{xcolor}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage[export]{adjustbox}
\usepackage[most]{tcolorbox}
\usepackage{cancel}
\usepackage{dsfont}
\usepackage{amssymb}
\usepackage{mathrsfs}
\usepackage{ulem}
\usepackage{soul}
\usepackage{parskip}
\usepackage{fancyhdr}
\usepackage{lastpage}
\usepackage{tocloft}
\usepackage{wasysym}
\usepackage{wrapfig}
\usepackage{multicol}
\usepackage{ifthen}
\usepackage[hidelinks]{hyperref}
\usepackage{enumitem}
\usepackage{gensymb}
\usepackage{pifont}


% ── Language Switching. ─────────────────────────────────────────────
% Currently only English and German are supported
% See docs for how to use
\newcounter{lang}

\newcommand{\setLang}[1]{
	\edef\lang{#1}
	\edef\en{en}
	\edef\de{de}
	\ifx\lang\en
		\typeout{[Lang Switcher] Loading English}
		\setcounter{lang}{1}
	\else
		\ifx\lang\de
			\typeout{[Lang Switcher] Loading German}
			\setcounter{lang}{2}
			\usepackage[ngerman]{babel}
		\else
			\typeout{[Lang Switcher] No such language!}
		\fi
	\fi
}

% Deprecated, as not useful
\newcommand{\loadLang}{
	\ifnum\value{lang}<2{
		\typeout{[Lang Loader] Loaded English}
		}\else {
			\typeout{[Lang Loader] Loaded German}
			\setcounter{lang}{2}
		}
	\fi
}


% ────────────────────────────────────────────────────────────────────
% Create config counters / variables. See the config file for changing them
\newcounter{numberingConfig}
\newcounter{numberSubsections}
\newcounter{descriptorShadeStrength}
\newcounter{shadeStrength}

% ── Setup ───────────────────────────────────────────────────────────
% Set up the latex document, configure author, title (as first argument), as well as headers and footers
\newcommand{\setup}[1]{
	\typeout{[Setup] Setting up...}
	\loadLang
	\usepackage[a4paper,textwidth=17.5cm,textheight=25cm,includehead]{geometry}
	\title{\Huge \textbf{#1}}
	\author{\authorTitle}
	\fancyhead{}
	\fancyhead[L]{#1}
	\fancyhead[R]{\authorHeaders}
	\fancyfoot{}
	\fancyfoot[L]{\today}
	\fancyfoot[R]{\thepage\ /\ \pageref{LastPage}}
	\fancypagestyle{plain}{%
		\fancyhead{}
		\fancyhead[L]{#1}
		\fancyhead[R]{\authorHeaders}
		\fancyfoot{}
		\fancyfoot[L]{\today}
		\fancyfoot[R]{\thepage\ /\ \pageref{LastPage}}
	}
	\typeout{[Setup] Complete}
}

% Start document command (required)
\newcommand{\startDocument}{
	\maketitle
	\startDocumentNoTitle
}

% Or this one, if you don't want a title
\newcommand{\startDocumentNoTitle}{
	\pagestyle{fancy}
	\thispagestyle{fancy}
}

% Set up the latex document, only configuring the author, title and page size
\newcommand{\setupBarebones}[1]{
	\typeout{[Setup] Using barebones setup}
	\loadLang
	\usepackage[a4paper,textwidth=17.5cm,textheight=25cm,includehead]{geometry}
	\title{\Huge \textbf{#1}}
	\author{\authorTitle}
}

% Set up the latex document for exam summaries (Extra wide body, small margins, no header)
\newcommand{\setupCheatSheet}[1]{
	\typeout{[Setup] Using CheatSheet setup}
	\loadLang
	\usepackage[a4paper,textwidth=20cm,textheight=28.5cm]{geometry}
	\title{\Huge \textbf{#1}}
	\author{\authorTitle}
}


% ────────────────────────────────────────────────────────────────────
%          ╭────────────────────────────────────────────────╮
%          │                 Translatation                  │
%          ╰────────────────────────────────────────────────╯
\newcommand{\translate}[2]{\ifnum\value{lang}<2{#1}\else{#2}\fi}
\newcommand{\tr}[2]{\translate{#1}{#2}}

% ┌                                                ┐
% │        Translation aids (commonly used)        │
% └                                                ┘
\newcommand{\trif}{\translate{if }{falls }}
\newcommand{\trIf}{\translate{If }{Falls }}
\newcommand{\trLet}{\translate{Let }{Sei }}
\newcommand{\trLets}{\translate{Let }{Seien }}
\newcommand{\trFor}{\translate{For }{Für }}
\newcommand{\trfor}{\translate{for }{für }}
\newcommand{\trand}{\translate{and }{und }}
\newcommand{\tror}{\translate{or }{oder }}
\newcommand{\trst}{\translate{s.t. }{s.d. }}
\newcommand{\trsuchthat}{\translate{such that }{so dass }}
\newcommand{\trwith}{\translate{with }{mit }}

%  ___                 ___         
% (  _ \             / ___)_       
% | ( (_)  _    ___ | (__ (_)  __  
% | |  _ / _ \/  _  \  __)| |/ _  \
% | (_( ) (_) ) ( ) | |   | | (_) |
% (____/ \___/(_) (_)_)   (_)\__  |
%                           ( )_) |
%                            \___/ 

% To be loaded *after* main/core.tex

% Configure your author name here
\newcommand{\authorTitle}{Janis Hutz\\\url{https://janishutz.com}}
\newcommand{\authorHeaders}{Janis Hutz}

% Configure your address here
\newcommand{\name}{Janis Hutz}
\newcommand{\street}{Street}
\newcommand{\city}{City}
\newcommand{\countrycode}{CH}


% Configure definition, lemma, theorem, etc numbering behaviour. 1 = Individual, 2 = Combined (apart from Definition), 3 = Combined
\setcounter{numberingConfig}{1}

% Configure if for definitions, lemmas, etc, numbering should be (0) = <section>.<number> or (1) = <section>.<subsection>.<number> or (2) = <section>.<subsection>.<subsubsection>.<number>
\setcounter{numberSubsections}{0}

% Set the default language. 
\setLang{en}

% Set the default command for theorem translation
\newcommand{\theoremde}{Satz}


% ----- %
% STYLE %
% ----- %

% The colour-saturation of the short / inline descriptors (default = 40)
\setcounter{descriptorShadeStrength}{40}

% The colour-saturation of the shade command (default = 20)
\setcounter{shadeStrength}{20}

%░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
%░░░      ░░░░░   ░░░░░░░░░░░░░   ░░░░░░░░░░░
%▒   ▒▒▒▒   ▒▒▒   ▒▒▒▒▒▒▒▒▒▒▒▒▒   ▒▒▒▒▒▒▒▒▒▒▒
%▒▒   ▒▒▒▒▒▒▒    ▒  ▒   ▒▒▒   ▒   ▒▒▒▒   ▒▒▒▒
%▓▓▓▓   ▓▓▓▓▓▓▓   ▓▓▓▓   ▓   ▓▓   ▓▓  ▓▓▓   ▓
%▓▓▓▓▓▓▓   ▓▓▓▓   ▓▓▓▓▓▓    ▓▓▓   ▓         ▓
%▓   ▓▓▓▓   ▓▓▓   ▓ ▓▓▓▓▓   ▓▓▓   ▓  ▓▓▓▓▓▓▓▓
%███      ██████   █████   ████   ███     ███
%██████████████████████   ███████████████████

% Global style configs for tcolorbox (to reduce bloat)
\newcommand{\usetcolorboxes}{
	\tcbset{
		mainboxstyle/.style={
				arc=3mm,
				colback=red!5!white,
				colframe=red!75!black,
				colbacktitle=red!75!black,
				fonttitle=\bfseries,
				enhanced,
				attach boxed title to top left={yshift=-2mm,xshift=5mm},
				breakable,
				top=0.4cm,
			}
	}
	\tikzset{
		overlaystyle/.style={
				draw=red!75!black,
				thick,
				fill=red!75!black,
				left,
				anchor=east,
				text=white,
				rounded corners=1mm,
				font=\bfseries,
				xshift=-5mm,
				yshift=1mm,
				inner xsep=3mm,
				inner ysep=1.5mm
			}
	}
}

% -------------------- %
% Small style elements %
% -------------------- %
\newcommand{\setFont}[1]{\fontfamily{#1}\selectfont}
\newcommand{\setFontType}[1]{
	\ifthenelse{\equal{#1}{mono}}{
		\renewcommand{\familydefault}{\ttdefault}
	}{
		\ifthenelse{\equal{#1}{serif}}{
			\renewcommand{\familydefault}{\rmdefault}
		}{
			\renewcommand{\familydefault}{\sfdefault}
		}
	}
}

\newcommand{\hrmvspace}{\vspace{-0.25pc}}
\newcommand{\rmvspace}{\vspace{-0.5pc}}
\newcommand{\mrmvspace}{\vspace{-0.75pc}}
\newcommand{\drmvspace}{\vspace{-1pc}}
\newcommand{\dhrmvspace}{\vspace{-1.25pc}}
\newcommand{\dnrmvspace}{\vspace{-1.5pc}}
\newcommand{\dmrmvspace}{\vspace{-1.75pc}}
\newcommand{\ddrmvspace}{\vspace{-2pc}}
\renewcommand{\footrulewidth}{0.4pt}
\newcommand{\TODO}{\color{red} \hl{TODO:} \color{black}}
\newcommand{\bi}[1]{\textbf{\textit{#1}}}
\renewcommand{\quote}[1]{``\textit{#1}''}

% Add a color shade (similar to \fhlc, but nicer boxes)
\newcommand{\background}[3]{\tcbox[on line,
		boxsep=2pt,
		left=0pt,
		right=0pt,
		top=0pt,
		bottom=0pt,
		colframe=white,
		frame empty,
		colback=#1!#2!white,
		highlight math style={enhanced}
	] {\textbf{#3}}}

% Abstraction of background, where the brightness is set to 20%
\newcommand{\shade}[2]{\background{#1}{\arabic{shadeStrength}}{#2}}

% This command is used for the short and inline descriptors
\newcommand{\bg}[2]{\background{#1}{\arabic{descriptorShadeStrength}}{#2}}

% Add a gray backdrop
\newcommand{\backdrop}[1]{\shade{black}{#1}}


% Fancy highlighting (Bold, underlined, colorbox behind it. Shorthand for \fhlc{white}{#1}
\newcommand{\fhl}[1]{\fhlc{white}{#1}}

% Add a colorbox around your text with the color specified. Text is bold and underlined
\newcommand{\fhlc}[2]{\textbf{\underline{\colorbox{#1}{#2}}}}

% Draw box around links. First arg link, second arg display
\newcommand{\hlhref}[2]{\color{MidnightBlue}\fbox{\href{#1}{#2}}\color{black}}

% Same for urls (just one arg tho)
\newcommand{\hlurl}[1]{\color{MidnightBlue}\fbox{\url{#1}}\color{black}}

% Spacing (horizontal)
\newcommand{\smallhspace}{\hspace{2mm}}
\newcommand{\mediumhspace}{\hspace{5mm}}
\newcommand{\largehspace}{\hspace{1cm}}

% ----------------- %
% Table of contents %
% ----------------- %

% Print a table of contents as a tcolorbox
\newcommand{\printtoc}[1]{
	\renewcommand{\cfttoctitlefont}{}
	\renewcommand{\cftaftertoctitle}{\vspace{-0.75cm}}
	\renewcommand{\contentsname}{}
	\begin{tcolorbox}[colback=black!5!white,colbacktitle=#1!75!black,coltitle=black,enhanced,attach boxed title to top center={yshift=-2mm},
		title={\Large \ifnum\value{lang}<2{Contents}\else {Inhaltsverzeichnis}\fi},fonttitle=\bfseries,breakable]
		\hspace{1cm}
		\tableofcontents
	\end{tcolorbox}
}

%▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
%██░▄▄▀█▀▄▄▀█░▄▀▄░█░▄▀▄░█▀▄▄▀█░▄▄▀
%██░████░██░█░█▄█░█░█▄█░█░██░█░██░
%██░▀▀▄██▄▄██▄███▄█▄███▄██▄▄██▄██▄
%▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

\newtcolorbox{recall}[2][]{mainboxstyle,colback=yellow!5!white,colframe=yellow!75!black,colbacktitle=yellow!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=yellow!75!black,,fill=yellow!75!black] at (frame.north east) {\large \translate{Recall }{Repetition }};},#1}

\newtcolorbox{remarks}[2][]{mainboxstyle,colback=green!5!white,colframe=green!75!black,colbacktitle=green!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=green!75!black,,fill=green!75!black] at (frame.north east) {\large \translate{Remarks }{Bemerkungen }};},#1}

\newtcolorbox{guides}[3][]{mainboxstyle,colback=red!5!white,colframe=red!75!black,colbacktitle=red!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=red!75!black,,fill=red!75!black] at (frame.north east) {\large #3};},#1}


\newtcolorbox{properties}[2][]{mainboxstyle,colback=purple!5!white,colframe=purple!75!black,colbacktitle=purple!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=purple!75!black,,fill=purple!75!black] at (frame.north east) {\large \translate{Properties }{Eigenschaften }};},#1}

\newtcolorbox{restrictions}[2][]{mainboxstyle,colback=purple!5!white,colframe=purple!75!black,colbacktitle=purple!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=purple!75!black,,fill=purple!75!black] at (frame.north east) {\large \translate{Restrictions }{Einschränkungen }};},#1}

\newtcolorbox{limitations}[2][]{mainboxstyle,colback=purple!5!white,colframe=purple!75!black,colbacktitle=purple!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=purple!75!black,,fill=purple!75!black] at (frame.north east) {\large \translate{Limitations }{Limitierungen }};},#1}

\newtcolorbox{intuition}[2][]{mainboxstyle,colback=Emerald!5!white,colframe=Emerald!75!black,colbacktitle=Emerald!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=Emerald!75!black,,fill=Emerald!75!black] at (frame.north east) {\large Intuition};},#1}

\newcommand{\inlineintuition}{\bg{Emerald}{Intuition:}}


% Terms and notation
\newtcolorbox{terms}[2][]{mainboxstyle,colback=orange!5!white,colframe=orange!75!black,colbacktitle=orange!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=orange!75!black,,fill=orange!75!black] at (frame.north east) {\large \translate{Terms }{Begriffe }};},#1}

\newtcolorbox{notation}[2][]{mainboxstyle,colback=Peach!5!white,colframe=Peach!75!black,colbacktitle=Peach!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=Peach!75!black,,fill=Peach!75!black] at (frame.north east) {\large Notation};},#1}


\newtcolorbox{usage}[2][]{mainboxstyle,colback=green!5!white,colframe=green!75!black,colbacktitle=green!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=green!75!black,,fill=green!75!black] at (frame.north east) {\large \translate{Usage }{Nutzung }};},#1}


% Task
\newtcolorbox{task}[2][]{mainboxstyle,colback=gray!5!white,colframe=gray!75!black,colbacktitle=gray!75!black,title={\large #2},overlay={\node[overlaystyle,draw=gray!75!black,fill=gray!75!black] at (frame.north east) {\large \translate{Task}{Aufgabe}};},#1}


% Proof
\newtcolorbox{proof}[2][]{mainboxstyle,colback=magenta!5!white,colframe=magenta!75!black,colbacktitle=magenta!75!black,title={\large #2},overlay={\node[overlaystyle,draw=magenta!75!black,fill=magenta!75!black] at (frame.north east) {\large \translate{Proof}{Beweis}};},#1}


% General
\newtcolorbox{general}[4][]{mainboxstyle,colback=#4!5!white,colframe=#4!75!black,colbacktitle=#4!75!black,title={\large #2},
	overlay={\node[overlaystyle,draw=#4!75!black,,fill=#4!75!black] at (frame.north east) {\large #3};},#1}

% Simple
\newtcolorbox{simplebox}[2][]{colback=#2!5!white,colframe=#2!75!black,#1}
