\section{Modularität} \label{sec:devmodule} \subsection{Erläuterungen zum Modulsystem} Ein zentrales Problem des alten Schule-Pakets bis Version 0.6 war, dass es sehr monolithisch aufgebaut und alles integrierte, was im Schulalltag und in der Lehrerausbildung nützlich sein könnte. So wurden die Weiterentwicklung und Übergabe an neue Maintainer schwierig, da stets eine Einarbeitung in alle Bereiche erforderlich war. Die grundlegende Entscheidung für das neue Schule-Paket ist es also, eine Modularisierung zu etablieren, die, zusätzlich zu einem stabilen Kern, verschiedene Funktionen und Fachspezifika entsprechend kapselt und von diesem Kern trennt. Ein eindeutiger Aufbau dieser Module soll dafür sorgen, dass es leichter wird, neue Funktionen zu ergänzen, ohne den gesamten Quelltext des Pakets kennen und verstehen zu müssen. Grundsätzlich gibt es drei verschiedene Arten von Modulen im Schule-Paket: \textbf{Module}, \textbf{Fachmodule} und \textbf{Zusatzpakete}, \vgl\space \prettyref{sec:begriffe}. Erweiterungen ohne direkten Bezug (also alles, das auch ohne das Schule-Paket sinnvoll genutzt werden kann) zum Paket sollten in Form unabhängiger Zusatzmodule implementiert werden. \subsection{Aufbau eines Moduls} \label{sec:devmoduleModul} Ein Modul für das Schule-Paket besteht aus einem Unterverzeichnis mit dem Namen des Moduls, das im Unterverzeichnis \enquote{Module} des Pakets liegt. Ist ein solches Verzeichnis vorhanden, kann das Modul direkt über seinen Namen eingebunden werden, \vgl\space\prettyref{sec:module}. Der Modulmechanismus sorgt dafür, dass die entsprechenden Abschnitte des Moduls an den richtigen Stellen des Quelltextes eingebunden werden. Es sind die folgenden drei Abschnitte definiert: \begin{description} \item[\texttt{optionen.tex}] $\rightarrow$ Paketoptionen des Moduls, \vgl\space Paket \pkg{pgfopts} \item[\texttt{pakete.tex}] $\rightarrow$ Paketabhängigkeiten des Moduls \item[\texttt{code.tex}] $\rightarrow$ Implementierung des Moduls \end{description} All diese Abschnitte sind optional und werden geladen, wenn sie vorhanden sind. Ein Modul kann also beispielsweise nur aus einer \texttt{code.tex}-Datei bestehen, wenn es nur einige Makros definiert. \subsubsection{Beispiel} \label{sec:devmoduleModulBeispiel} \paragraph{HalloWelt/optionen.tex} \begin{sourcecode}[gobble=0] % ******************************************************************** % * Paketoptionen * % ******************************************************************** % Boolesche Optionen % ******************************************************************** \newboolean{schule@nutzeGoodbye} % Standardwerte % ******************************************************************** \newcommand{\schule@weltname}{Welt} % Definition der Paketoptionen % ******************************************************************** \pgfkeys{ /schule/.cd, weltname/.store in=\schule@weltname, nutzeGoodbye/.value forbidden, nutzeGoodbye/.code=\setboolean{schule@datumAnzeigen}{true}, } \end{sourcecode} \paragraph{HalloWelt/pakete.tex} \begin{sourcecode}[gobble=0] % ******************************************************************** % * Paketabhängigkeiten * % ******************************************************************** \RequirePackage{ifthenelse} \end{sourcecode} \paragraph{HalloWelt/code.tex} \begin{sourcecode}[gobble=0] % ******************************************************************** % * Hallo Welt! * % ******************************************************************** \newcommand{\halloWelt}{ \ifthenelse{\boolean{schule@nutzeGoodbye}}{ Goodbye \schule@weltname! }{ Hallo \schule@weltname! } } \end{sourcecode} \subsection{Aufbau eines Fachmoduls} \label{sec:devmoduleFachmodul} Ein Fachmodul für das Schule-Paket besteht aus einem Unterverzeichnis mit dem Namen des Fachmoduls, das im Unterverzeichnis \enquote{Faecher} des Pakets liegt. Ist ein solches Verzeichnis vorhanden, kann das Fachmodul direkt über seinen Namen eingebunden werden, \vgl\space\prettyref{sec:faecher}. Der Modulmechanismus sorgt dafür, dass die entsprechenden Abschnitte des Fachmoduls an den richtigen Stellen des Quelltextes eingebunden werden. Es sind die folgenden vier Abschnitte definiert: \begin{description} \item[\texttt{optionen.tex}] $\rightarrow$ Paketoptionen des Moduls, \vgl\space Paket \pkg{pgfopts} \item[\texttt{pakete.tex}] $\rightarrow$ Paketabhängigkeiten des Moduls \item[\texttt{code.tex}] $\rightarrow$ Implementierung des Moduls, die unabhängig von der Art der Einbindung des Faches geladen wird. \item[\texttt{standalone.tex}] $\rightarrow$ Implementierung, die nur geladen wird, wenn das Fach als Hauptfach angegeben wird, \dsh\space wenn das Fach mit der Paketoption \keyis{fach}{Fach} geladen wurde, jedoch nicht, wenn das Fach mit \keyis{weitereFaecher}{\dots Fach,\dots} geladen wurde. \end{description} All diese Abschnitte sind optional und werden geladen, wenn sie vorhanden sind. Ein Modul kann also beispielsweise nur aus einer \texttt{code.tex}-Datei bestehen, wenn es nur einige Makros definiert. Siehe auch das Beispiel für die Implementierung eines Moduls in \prettyref{sec:devmoduleModulBeispiel}. \subsection{Aufbau eines Dokumenttyps} \label{sec:devDokumenttyp} Ein Dokumenttyp für das Schule-Paket besteht aus einem Unterverzeichnis mit dem Namen des Dokumenttyps, das im Unterverzeichnis \enquote{Dokumenttypen} des Pakets liegt. Ist ein solches Verzeichnis vorhanden, kann der Dokumenttyp direkt über seinen Namen eingebunden werden, \vgl\space\prettyref{sec:typen}. Der Modulmechanismus sorgt dafür, dass die entsprechenden Abschnitte des Dokumenttyps an den richtigen Stellen des Quelltextes eingebunden werden. Es sind die folgenden drei Abschnitte definiert: \begin{description} \item[\texttt{optionen.tex}] $\rightarrow$ Paketoptionen des Dokumenttyps, \vgl\space Paket \pkg{pgfopts} \item[\texttt{pakete.tex}] $\rightarrow$ Paketabhängigkeiten des Dokumenttyps \item[\texttt{code.tex}] $\rightarrow$ Implementierung des Dokumenttyps. \end{description} All diese Abschnitte sind optional und werden geladen, wenn sie vorhanden sind. Ein Modul kann also beispielsweise nur aus einer \texttt{code.tex}-Datei bestehen, wenn es nur einige Makros definiert. Sind die Abschnitte nicht vorhanden, so wird in jedem Fall der entsprechende Abschnitt des Dokumenttyps \enquote{Arbeitsblatt} (ab) geladen. Soll dies unterbleiben, muss der Abschnitt also auf jeden Fall angelegt werden. Siehe auch das Beispiel für die Implementierung eines Moduls in \prettyref{sec:devmoduleModulBeispiel}.