1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
\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}.
|