\NeedsTeXFormat{LaTeX2e}[2011/11/11]
\ProvidesPackage{schule}[2021/08/09 v0.8.3 %
                         Kommandos fuer die Schule]

% ********************************************************************
% * Paketoptionen                                                    *
% ********************************************************************

% Abhängigkeiten
% ********************************************************************
\RequirePackage{pgfopts}
\RequirePackage{xifthen}
\RequirePackage{xstring}

% Boolesche Optionen
% ********************************************************************
%\newboolean{schule@boolwert}
\newboolean{schule@debug}

% Standardwerte
% ********************************************************************
%\newcommand{\schule@wert}{Standard}
\newcommand{\schule@typ}{schuleALT} % Für Kompatibilitätsmoduss
\newcommand{\schule@fach}{ohne} % Keine Fachspezifika
\newcommand{\schule@weitereFaecher}{}
\newcommand{\schule@module}{}
\newcommand{\schule@sprache}{}

% Definition der Paketoptionen
% ********************************************************************
\pgfkeys{
	/schule/.cd,
	fach/.store in=\schule@fach,
	weitereFaecher/.store in=\schule@weitereFaecher,
	module/.store in=\schule@module,
	typ/.store in=\schule@typ,
	sprache/.store in=\schule@sprache,
	debug/.value forbidden,
	debug/.code=\setboolean{schule@debug}{true},
	.unknown/.code={}, % Unbekannte Optionen ignorieren.
}

% Frühe Paketoptionen verarbeiten (etwa die zu ladenden Module und den
% Typ des Dokuments)
% ********************************************************************
\ProcessPgfPackageOptions{/schule}


% ********************************************************************
% * Basisfunktionen und deren Abhängigkeiten                         *
% ********************************************************************

% Fehlerbehandlung und -ausgabe
% ********************************************************************
\newcommand{\swarnung}[1]{\PackageWarning{schule}{#1}}
\newcommand{\sfehler}[1]{\PackageError{schule}{#1}}
\newcommand{\sinfo}[1]{\PackageInfo{schule}{#1}}

% Debugvarianten
\newcommand{\sdwarnung}[1]{
	\ifthenelse{\boolean{schule@debug}}{
		\swarnung{#1}
	}{
		% stillschweigend ignorieren
	}
}
\newcommand{\sdinfo}[1]{
	\ifthenelse{\boolean{schule@debug}}{
		\sinfo{#1}
	}{
		% stillschweigend ignorieren
	}
}


% unschädliche Warnungen im Normalbetrieb unterdrücken
\ifthenelse{\boolean{schule@debug}}{}{
    \IfSubStr{\schule@module}{Lizenzen}{}{
	\usepackage{silence}

	% Kompatiblität von ctable zu TikZ
	\WarningFilter{ctable}{Transp}
    }
}

% Laden von Dokumenttypen
% ********************************************************************
% Laden der jeweiligen Dokumenttyp-Definition. Falls keine gefunden
% wurde und das Paket nicht eingebettet verwendet wird, wird die
% Definition für Arbeitsblätter geladen.


% fixes beamer, beamerarticle + xsim issues.
% see https://github.com/cgnieder/xsim/issues/17
% needs to be loaded before xsim!
%
%% beamerbasemodes.sty wird in beiden Fällen: 
%% beamer.cls und beamerarticle.sty
%% geladen
\@ifpackageloaded{beamerbasemodes}
{%
  %%% save beamer's `solution' environment as `beamersolution':
  \let\beamersolution\solution
  \let\endbeamersolution\endsolution
  %%% "delete" the `solution' environment:
  \let\solution\relax
  \let\endsolution\relax
  \@ifpackageloaded{beamerarticle}{}{%
  	\newcounter{paragraph}
  }%
}{%
}%

% \schule@typDateiLaden{Dokumenttyp}{Abschnitt}
\newcommand{\schule@typDateiLaden}[2]{
	\ifthenelse{\equal{\schule@typ}{ohne}}{
		\sdinfo{Eingebetteter Modus. Es wird kein Dokumenttyp geladen!}
	}{
		\IfFileExists{schule.typ.#1.#2.tex}{
			% Wenn die Datei existiert
			\input{schule.typ.#1.#2.tex}
			\sdinfo{Dokumenttyp schule.typ.#1.#2 geladen!}
		}{
			% Wenn die Datei nicht existiert, lade Arbeitsblatt.
			\sdwarnung{Dokumenttyp schule.typ.#1.#2 nicht gefunden, %
				lade Arbeitsblatt!}
			\IfFileExists{schule.typ.ab.#2.tex}{
				% Wenn die Datei existiert
				\input{schule.typ.ab.#2.tex}
				\sdinfo{Dokumenttyp schule.typ.ab.#2 geladen!}
			}{
				% Wenn die Datei nicht existiert, lade Arbeitsblatt.
				\sdwarnung{Dokumenttyp schule.typ.ab.#2 nicht gefunden!}
			}
		}
	}
}

% Modullader
% ********************************************************************
% Um Kollisionen zu vermeiden muss gespeichert werden, ob eine Datei
% bereits geladen wurde. So können Module auch mehrfach angegeben
% und von anderen Modulen verwendet werden.

% \schule@modulDateiLaden{Kategorie}{Modulname}{Abschnitt}
\newcommand{\schule@modulDateiLaden}[3]{
	\IfFileExists{schule.#1.#2.#3.tex}{
		% Wenn die Datei existiert
		\ifcsname schule@geladen#1#2#3\endcsname
			% Wenn die Datei bereits geladen wurde
			\sdwarnung{Moduldatei schule.#1.#2.#3 war bereits geladen!}
		\else
			% Wenn die Datei nicht bereits geladen wurde
			\input{schule.#1.#2.#3.tex}
			\expandafter\def
				\csname schule@geladen#1#2#3\endcsname{true}
			\expandafter\def
				\csname schule@geladen#1#2\endcsname{true}
			\sdinfo{Moduldatei schule.#1.#2.#3 geladen!}
		\fi
	}{
		% Wenn die Datei nicht existiert
		\sdwarnung{Moduldatei schule.#1.#2.#3 nicht gefunden!}
	}
}


% \schule@modulNachladen{Modulname}
% Lädt ein Modul mit allen Abschnitten. Interne Hilfsfunktion für
% Erfüllung von Abhängigkeiten in Modulen. Die Verwendung zu anderen
% Zwecken wird nicht empfohlen.
\newcommand{\schule@modulNachladen}[1]{
	\schule@modulDateiLaden{mod}{#1}{optionen}
	\ProcessPgfPackageOptions{/schule}
	\schule@modulDateiLaden{mod}{#1}{pakete}
	\schule@modulDateiLaden{mod}{#1}{code}
}

% Modulliste
% ********************************************************************
\RequirePackage{forarray}
% Standardmodule laden und um optionale Module ergänzen
\ifthenelse{\equal{\schule@typ}{ohne}}{
	\edef\schule@ladeModule{%
		Metadaten, %
		Format, %
		\schule@module
	}
}{
	\edef\schule@ladeModule{%
		Metadaten, %
		Format, %
		Aufgaben, %
		\schule@module
	}
}

% ********************************************************************
% * Paketoptionen der Module                                         *
% ********************************************************************

% Definitionen der Paketoptionen der Module laden
% ********************************************************************
\ForEachX{,}{
	\schule@modulDateiLaden{mod}{\thislevelitem}{optionen}
}{\schule@ladeModule}

% Definitionen der Paketabhängigkeiten der Fächer laden
% ********************************************************************
\schule@modulDateiLaden{fach}{\schule@fach}{optionen}

% Weitere Fächer
\ForEachX{,}{
	\schule@modulDateiLaden{fach}{\thislevelitem}{optionen}
}{\schule@weitereFaecher}

% Definitionen der Paketabhängigkeiten des Dokumenttyps laden
% ********************************************************************
\schule@typDateiLaden{\schule@typ}{optionen}

% Paketoptionen verarbeiten
% ********************************************************************
% Zurücksetzen der unbekannten Optionen
%\def\schule@unbekannteOptionen{}
% TODO: Evtl. Warnung, falls unbekannte Option gesetzt.
% Erneutes Verarbeiten der Optionen
\ProcessPgfPackageOptions{/schule}

% ********************************************************************
% * Kompatibilitätsmodus BEGINN                                      *
% ********************************************************************

\ifthenelse{\equal{\schule@typ}{schuleALT}}{
	\RequirePackage{schulealt}
}{

% ********************************************************************
% * Paketabhängigkeiten                                              *
% ********************************************************************

% Allgemeine Paketabhängigkeiten
% ********************************************************************

% Eingabe und Sprache
\RequirePackage[\schule@sprache,ngerman]{babel}
\RequirePackage[utf8]{inputenc}
\RequirePackage[TS1,T1]{fontenc}

% Makros
\RequirePackage{xparse}
\RequirePackage{environ}

% Referenzen

% Mathematisches
\RequirePackage{amsmath}

% Grafik
\PassOptionsToPackage{table,dvipsnames}{xcolor}
\RequirePackage{xcolor}
\RequirePackage{tikz}
\RequirePackage{graphicx}


% Paketabhängigkeiten der Module
% ********************************************************************
\ForEachX{,}{
	\schule@modulDateiLaden{mod}{\thislevelitem}{pakete}
}{\schule@ladeModule}

% Paketabhängigkeiten der Fächer
% ********************************************************************
% Fachspezifische Paketabhängigkeiten
\schule@modulDateiLaden{fach}{\schule@fach}{pakete}

% Weitere Fächer
\ForEachX{,}{
	\schule@modulDateiLaden{fach}{\thislevelitem}{pakete}
}{\schule@weitereFaecher}

% Paketabhängigkeiten des Dokumenttyps
% ********************************************************************
\schule@typDateiLaden{\schule@typ}{pakete}

%Hyperref nach allen anderen Paketen laden um möglichen Problemen aus dem Weg zu gehen.
\RequirePackage{hyperref}


% ********************************************************************
% * Module laden                                                     *
% ********************************************************************

\ForEachX{,}{
	\schule@modulDateiLaden{mod}{\thislevelitem}{code}
}{\schule@ladeModule}


% ********************************************************************
% * Fachspezifischen Code einbinden                                  *
% ********************************************************************

% Einbinden der fachspezifischen Module
\schule@modulDateiLaden{fach}{\schule@fach}{code}

\schule@modulDateiLaden{fach}{\schule@fach}{standalone}

% Weitere Fächer
\ForEachX{,}{
	\schule@modulDateiLaden{fach}{\thislevelitem}{code}
}{\schule@weitereFaecher}

% ********************************************************************
% * Code des Dokumenttyps einbinden                                  *
% ********************************************************************
\schule@typDateiLaden{\schule@typ}{code}


% ********************************************************************
% * Kompatibilitätsmodus ENDE                                      *
% ********************************************************************

}
