summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/schule/devModule.tex
blob: 981950a01becde82fb5d7587aef2dce89e60f58d (plain)
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}.