\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{pcprotokoll}[2026-04-27, Eine Vorlage f\"ur das PC-Praktikum der Goethe-Universit\"at Frankfurt]

\newif\ifenglish
\DeclareOption{english}{\englishtrue} % Fuer Englische Protokolle
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} % Gibt alle anderen Optionen weiter
\ProcessOptions\relax
\LoadClass[11pt, a4paper, oneside]{article}

% Setzt Dokumenten Metadaten automatisch
\AtBeginDocument{
	\hypersetup{
		pdfinfo={
			Author={\@autora},
			Title={Protokoll~Versuch~Nr.~\@versuchsnr},
		}
	}
}

% Standard LuaLaTeX-Pakete 
\RequirePackage{fontspec, lmodern, fix-cm}
\defaultfontfeatures{Ligatures=TeX}
\RequirePackage{iftex}
\ifLuaTeX
\RequirePackage{luacode}
\else 
\ClassWarning{pcprotokoll}{Es wird nicht LuaLaTeX verwendet, wodurch das automatische Vervollst\"andigen des Deckblatts ausgestellt ist.}
\fi


% Diverse Sprachpakete, damit alles automatisch auf Deutsch ist
\PassOptionsToPackage{autostyle=true}{csquotes}
\RequirePackage{polyglossia, csquotes, translations}
\setdefaultlanguage{german} \selectlanguage{german}
\ifenglish
\setdefaultlanguage{english} \selectlanguage{english}
\fi
\PassOptionsToPackage{style=ddmmyyyy, datesep=.}{datetime2} % Um das Datum richtig zu setzen
\RequirePackage{datetime2}

% Grafikpakete
\RequirePackage{graphicx, caption, hyperref, xurl}
\hypersetup{hidelinks, colorlinks=false, bookmarksopen=true, breaklinks}

% Chemiepakete
\RequirePackage{upgreek, chemmacros, chemformula} 
\chemsetup{greek=upgreek} % Ist wahrscheinlich egal, aber stellt sicher, dass in Phasen die griechischen Buchstaben aufrecht stehen
\chemsetup[reactions]{
	before-tag =  R,
	tag-open = [,
	tag-close = ]
}

% Diverse Formateinstellungen
\PassOptionsToPackage{section}{placeins} % Stellt sicher, dass Abbildungen nicht zwischen Abschnitten rutschen
\PassOptionsToPackage{noabbrev,nameinlink}{cleveref} % Wird zwar nicht geladen, aber falls es geladen wird Einstellungen fuer cleverref
\PassOptionsToPackage{pass}{geometry} % wird spaeter benoetigt, pass vermeidet Einstellungen zu Raendern
\RequirePackage{placeins, fancyhdr, geometry}

% Einstellungen fuer die Kopfzeile
\renewcommand{\headrulewidth}{0.5pt}
\setlength{\headheight}{14pt}
\fancyheadoffset{0em}
\fancyhead{}
\fancyhead[C]{Versuch~\@versuchsnr}
\pagestyle{fancy}

% Vermeiden von Widows und Orphans
\widowpenalty1000
\clubpenalty1000


% Mathepakete
\RequirePackage{siunitx, amsmath, IEEEtrantools, commath}
\sisetup{
	locale=DE, % Setzt die Standardeinstellungen fuer den Deutschen Sprachraum (wie das Komma statt dem Punkt)
	uncertainty-mode            = separate, % Zeigt den Fehler mit +- an, statt 
	% Diese Einstellungen sind fuer Tabellen
	table-alignment-mode        = marker, 
	table-number-alignment      = center,
	% Diese Einstellungen sind dafuer, dass alle qty auch in fett gedruckt werden koennen
	text-family-to-math         = true,
	text-series-to-math         = true,
	propagate-math-font         = true,
	detect-weight               = true,
	detect-all                  = true,
	% scheint einfach gute Idee zu sein
	uncertainty-round-direction = up,
	mode=math,
}
\ifenglish
\sisetup{locale=US}
\fi

% Einige Mathe definitionen, fuer Einheitlichkeit
\NewDocumentCommand{\diff}{O{}mm}{\ensuremath{\frac{\dif{^{#1}}#2}{\dif#3^{#1}}}} % Ableitung
\NewDocumentCommand{\pdiff}{O{}mm}{\ensuremath{\frac{\partial^{#1}#2}{\partial#3^{#1}}}} % Partielle Ableitung
\DeclareMathSizes{10.95}{10.95}{6}{3} % verkleinert Indexe, weil die manchmal ein wenig groß sind (vor allem bei a_J zum Beispiel)
\NewDocumentCommand{\ped}{m}{\ensuremath{_\mathrm{#1}}} % Um Indexe aufrecht zu setzen (was normalerweise richtig ist)
\NewDocumentCommand{\cped}{m}{\ped{\ch{#1}}}

% Hier sind noch ein paar Hilfreiche Einheiten fuer Protokolle, die nicht standardmaeßig in siunitx enthalten sind
\DeclareSIUnit{\bar}{bar}
\DeclareSIUnit{\mbar}{mbar}
\DeclareSIUnit{\hPa}{\hecto\Pa}
\DeclareSIUnit{\M}{\mol\per\liter}
\DeclareSIUnit{\cP}{cP}

% Literaturangaben leicht veraendern
\NewCommandCopy{\@oldcite}{\cite}
\RenewDocumentCommand{\cite}{m}{$^\text{\@oldcite{#1}}$}

% Neue Environment, um auch chemfig Reaktionen als "reaction" setzen zu koennen (zentriert und mit der richtigen Nummerierung)
\NewDocumentEnvironment{drawreaction}{}{\vspace{0.25cm}\begin{center}\hfill}{\hfill\stepcounter{reaction}[R\thereaction]\end{center}}

% Befehle fuer das Einheitliche Aussehen von Tabellen (vor allem Tabellenueberschriften)
\NewDocumentCommand{\header}{m}{\bfseries \boldmath #1}
\NewDocumentCommand{\mheader}{mo}{\IfNoValueTF{#2}{\header{$#1$}}{\header{$#1~[\unit{#2}]$}}}

% Vorbereitungen fuer die Titelseite
\ifLuaTeX
% Dieser Teil enthaelt alle Informationen, die fuer das automatische Ausfuellen vom Deckblatt benoetigt werden. Hier muessen Aenderungen eingetragen werden.
\begin{luacode*}
	versuchsnamen = {
		[1]="Molekulargewichtsbestimmung nach Viktor Meyer", 
		[2]="Gefrierpunktserniedrigung",
		[4]="Temperaturabh\\\"angigkeit des Dampfdrucks von Fl\\\"ussigkeiten",
		[5]="Kalorimetrie: Reaktionsenthalpie der Neutralisationsreaktion",
		[6]="Oberfl\\\"achenspannung",
		[7]="Zersetzung eines Ammoniakates",
		[8]="Massenwirkungsgesetz",
		[9]="Schmelzdiagramm",
		[11]="\\ce{CO2}-Adsorption an Aktivkohle",
		[12]="Adsorptionsgleichgewicht in L\\\"osung",
		[21]="Hittorf'sche \\\"Uberf\\\"uhrungszahlen",
		[22]="Potentiometrische Titration",
		[23]="Coulometrische Titration",
		[24]="Konduktometrie",
		[25]="Leitf\\\"ahigkeitstitration",
		[26]="EMK galvanischer Zellen",
		[27]="Cyclovoltammetrie",
		
		[31]="Saccharose Inversion",
		[32]="Acetonjodierung",
		[33]="Blitzlichtphotolyse",
		[34]="Esterhydrolyse",
		[36]="Diffusion",
		[37]="Zeitaufgel\\\"oste Fluoreszenzmessung mit der TCSPC-Methode",
		[40]="Kinetik einer autokatalytischen Reaktion",
		[41]="Statistischer Modellversuch",
		[42]="Brown'sche Molekularbewegung",
		[43]="Innere Reibung von Gasen",
		[44]="Viskosit\\\"at von Fl\\\"ussigkeiten",
		[45]="Bestimmung des Dipolmomentes",
		[46]="Geiger-M\\\"uller-Z\\\"ahler",
		[51]="Franck-Hertz Experiment",
		[53]="Magnetisches Verhalten von Komplexionen",
		[55]="Rotationsschwingungsspektrum von \\ce{HCl}",
		[56]="Schwingungsfeinstruktur des Permanganatspektrums",
		[57]="EPR Spektroskopie",
		[58]="Quantenmechanische Rechnungen",
		[59]="Exzimerbildung von Pyren",
	}
	blocknr = {
		[1]=1,
		[2]=3,
		[4]=1,
		[5]=1,
		[6]=1,
		[7]=3,
		[8]=3,
		[9]=3,
		[11]=3,
		[12]=1,
		[21]=2,
		[22]=2,
		[23]=2,
		[24]=2,
		[25]=2,
		[26]=2,
		[27]=2,
		
		[31]=4,
		[32]=4,
		[33]=4,
		[34]=4,
		[36]=4,
		[37]=4,
		[40]=4,
		[41]=5,
		[42]=5,
		[43]=5,
		[44]=5,
		[45]=5,
		[46]=5,
		[51]=6,
		[53]=6,
		[55]=6,
		[56]=6,
		[57]=6,
		[58]=6,
		[59]=6,
	}
	blocknamen = {
		[1]="Thermodynamik der Einstoffsysteme",
		[2]="Elektrochemie",
		[3]="Thermodynamik der Mehrstoffsysteme",
		[4]="Kinetik",
		[5]="Statistik",
		[6]="Spektroskopie",
	}
	
	function make_num (str)
	local i = 0
	local output = ""
	while i<#str do
	i = i+1
	local char = string.sub(str,i,i)
	if string.find("0123456789", char) then output = output..char end
	end
	return tonumber(output)
	end
	
	function get_name (str)
	return versuchsnamen[make_num(str)]
	end
	
	function get_block (str)
	return blocknamen[blocknr[make_num(str)]]
	end
	
	function get_praktikum (str)
	if blocknr[make_num(str)] <= 3 then return "Praktikum physikalische Chemie Teil I (PC1)"
	elseif blocknr[make_num(str)] <= 6 then return "Praktikum physikalische Chemie Teil II (PC2)"
	else return "???" end
	end
	
	function get_version (str)
	if str == "1" then return "Erstabgabe"
	elseif str == "2" then return "1. Korrektur"
	elseif str == "3" then return "2. Korrektur"
	else return str end
	end
	
	function get_month (int)
	local monthy_table = {"Januar", "Februar", "M\\\"arz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}
	return monthy_table[int]
	end
	
	function get_bibentry (str)
	return "Institut f\\\"ur Physikalische und Theoretische Chemie, Universit\\\"at Frankfurt: ".. get_name(str) .." [Online], 2024, [".. get_month(tonumber(os.date("%m"))) .." ".. os.date("%Y") .."], \\url{https://www.ptc.uni-frankfurt.de/pc-praktikum/onlineskripte/Versuch_".. make_num(str) ..".pdf}"
	end
\end{luacode*}
\fi
\ExplSyntaxOn
\ifLuaTeX
\newcommand*{\@autoversuchsname}[1]{
	\luaexec{tex.sprint(get_name("\luatexluaescapestring{#1}"))}}
\newcommand*{\@autoversuchsblock}[1]{
	\luaexec{tex.sprint(get_block("\luatexluaescapestring{#1}"))}}
\newcommand*{\@autopraktikum}[1]{
	\luaexec{tex.sprint(get_praktikum("\luatexluaescapestring{#1}"))}}
\newcommand*{\bibanleitung}{
	\luaexec{tex.sprint(get_bibentry("\@versuchsnr"))}
}
\else
\newcommand*{\bibanleitung}{\ClassError{pcprotokoll}{Der~Befehl~\protect\bibanleitung\space ist~nur~unter~LuaLaTeX~unterst\"utzt.}{Verwende~den~Befehl~nicht~oder~probiere~es~mit~LuaLaTeX}}
\fi

\newcommand*{\versuchsname}[1]{
	\gdef\@versuchsname{#1}
}
\newcommand*{\@versuchsname}{???}
\newcommand*{\block}[1]{\gdef\@block{#1}}
\newcommand*{\@block}{???}
\newcommand*{\autora}[1]{\gdef\@autora{#1}}
\newcommand*{\@autora}{Max~Mustermann}
\newcommand*{\autorb}[1]{\gdef\@autorb{#1}}
\newcommand*{\@autorb}{Maria~Musterfrau}
\newcommand*{\datum}[1]{\gdef\@datum{#1}}
\newcommand*{\@datum}{\today}
\newcommand*{\praktikum}[1]{	\gdef\@praktikum{#1}}
\newcommand*{\@praktikum}{???}
\newcommand*{\version}[1]{\gdef\@version{#1}}
\newcommand*{\@version}{???}
\newcommand*{\versuchsnr}[1]{
	% set versuchsnummer
	\gdef\@versuchsnr{#1}
	
	% set other stuff
	\ifLuaTeX
	\versuchsname{\@autoversuchsname{#1}}
	\block{\@autoversuchsblock{#1}}
	\praktikum{\@autopraktikum{#1}}
	\fi
}
\newcommand*{\@versuchsnr}{???}
\newcommand*{\autoren}[1]{
	\clist_set:Nn \l_authorlist_clist {#1}
	\autora{\clist_item:Nn \l_authorlist_clist {1}}
	\autorb{\clist_item:Nn \l_authorlist_clist {2}}
}

\newcommand*{\abgabe}[1]{
	\ifLuaTeX
	\version{\luaexec{tex.sprint(get_version("\luatexluaescapestring{#1}"))}}
	\else
	\version{#1}
	\fi
}
\ExplSyntaxOff


% Definieren des Deckblatts
% Um das Deckblatt zu benutzen, koennen folgende Sachen angegeben werden: die Versuchsnummer (\versuchsnr), der Versuchsname (\versuchsname), der Themenblock des Versuchs (z.B TD1) (\block), die Autorennamen (mit Komma trennen) (\autoren), das Abgabedatum (\datum), das Praktikum (z.B. PCI) (\praktikum) und die Version der Abgabe (Erstabgabe, 1. Korrektur, etc., hier nur die Zahl der Abgaben angeben, die Erstabgabe ist also 1) (\abgabe)
% Viele diese Informationen koennen aus der Versuchsnummer automatisch abgeleitet werden, weshalb im Idealfall eine Definition so aussieht:
%\versuchsnr{1a}
%\autoren{Max Mustermann, Maria Musterfrau}
%\version{1}
% Wenn die automatischen Sachen falschliegen, einfach explizit definieren, muss aber nach \versuchsnr sein. Bei der Version einfach ausschreiben, was ihr haben wollt, wenn es euch nicht passt. Fuer die automatische Vervollstaendigung wird LuaLaTeX benoetigt, sonst muessen die Daten haendisch eingetragen werden.
% Im Deckblatt steckt das Inhaltsverzeichnis schon drin, ihr muesst es also nicht nochmal machen
\NewCommandCopy{\@oldmaketitle}{\maketitle}
\renewcommand*{\maketitle}{
	\pagenumbering{roman}
	\pagestyle{plain}
	\begin{titlepage}
		\newgeometry{textwidth=390pt}
		{\centering
			{\fontsize{42}{45}\selectfont {Versuch Nr.~\@versuchsnr}}\par
			\vspace{1cm}
			{\Huge \@versuchsname}\par
			\vspace{0.5cm}
			{\Large\textit{\@block}}\par
		}
		{\raggedright
			\vspace{1cm}
			\noindent
			\begin{tabular}{@{}ll}
				\textbf{ProtokollantInnen:} & \textbf{\underline{\@autora}} \vspace{1ex}\\
				& \textbf{\@autorb}\vspace{2ex}\\
				\textbf{Abgabedatum:} & \textbf{\@datum} \vspace{0.25cm}\\
				\textbf{Praktikum:} & {\textbf{\@praktikum} \vspace{0.25cm}}\\
				\textbf{Version:} & {\Huge \@version}
			\end{tabular}
		}\par
		\vspace{0.25cm}
		\noindent
		\rule{\textwidth}{1pt}\par
		\noindent
		{\small F\"ur Anmerkungen des Assistenten:}
		\vfill
		\restoregeometry
	\end{titlepage}
	\tableofcontents
	\newpage
	\pagenumbering{arabic}
	\pagestyle{fancy}
}