schulmathematik/schulma-klausur.cls

690 lines
18 KiB
TeX

% schulmathematik bundle: document class schulma-klausur
% Version 1.5
% 21. Juni 2023
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplClass{schulma-klausur}{2023-06-21}{1.5}{Dokumentenklasse fuer Klausuren}
\RequirePackage {etoolbox}
\str_new:N \g_schulma_klausur_datum_str
\str_new:N \g_schulma_klausur_titel_str
\str_new:N \g_schulma_klausur_teiltitel_str
\str_new:N \g_schulma_klausur_bearbeitungszeit_str
\str_new:N \g_schulma_klausur_formeldokumentseiten_str
\tl_new:N \g_schulma_klausur_kurs_tl
\tl_new:N \g_schulma_klausur_nummer_tl
\tl_new:N \g_schulma_klausur_untertitel_tl
\tl_new:N \g_schulma_klausur_hilfsmittel_tl
\tl_new:N \l_schulma_klausur_aufgabentitel_tl
\bool_new:N \g_schulma_klausur_oesterreich_bool
\bool_new:N \g_schulma_klausur_afuenfquer_bool
\bool_new:N \g_schulma_klausur_schriftliche_lernkontrolle_bool
\bool_new:N \g_schulma_klausur_gruppe_a_bool
\bool_new:N \g_schulma_klausur_gruppe_b_bool
\bool_new:N \g_schulma_klausur_pqformel_bool
\bool_new:N \g_schulma_klausur_differenzenquotient_bool
\bool_new:N \g_schulma_klausur_differentialquotient_bool
\bool_new:N \g_schulma_klausur_musterloesung_bool
\bool_new:N \l_schulma_klausur_loesung_bool
\int_new:N \g_schulma_klausur_anzahl_hilfen_int
\int_new:N \g_schulma_klausur_gesamtzeitbedarf_int
\int_new:N \g_schulma_klausur_gesamtpunktzahl_int
\clist_new:N \l_schulma_klausur_notenliste_clist
\tl_const:Nn \c_schulma_klausur_pqformel_tl
{
$p$-$q$-Formel:
\[ x\sb{1;2} = - \frac{p}{2} \pm \sqrt { \left(\frac{p}{2}\right)^2-q } \]
}
\tl_const:Nn \c_schulma_klausur_differenzenquotient_tl
{
Differenzenquotient:
\[ m = \frac {f(x\sb{2})-f(x\sb{1})} {x\sb{2}-x\sb{1}} \]
}
\tl_const:Nn \c_schulma_klausur_differentialquotient_tl
{
Differentialquotient:
\[ f' ( x\sb{0} ) = \lim \sb { x \rightarrow x\sb{0} }
\frac {f(x)-f(x\sb{0})} {x-x\sb{0}} \]
}
\msg_new:nnn {schulma-klausur} {Gruppe fehlt}
{
In~Zeile~ \msg_line_number: \c_space_tl
wird~der~Befehl~ \Gruppen \c_space_tl
verwendet.~Es~wurde~aber~keine~der~Klassenoptionen~GruppeA~und~GruppeB~
gesetzt.~Ausgegeben~wird~der~Text~für~Gruppe~A.
}
\msg_new:nnn {schulma-klausur} {Aufgabennachricht}
{
Aufgabe~ \arabic {Aufgabe} :~
\str_if_eq:nnTF {#1} {-NoValue-} {[ohne~Titel]} {#1}
\str_if_eq:nnF {#2} {-NoValue-} {,~#2~min}
\str_if_eq:nnF {#3} {-NoValue-} {,~#3~Punkte}
}
\msg_new:nnn {schulma-klausur} {Aufgabensumme}
{
insgesamt~ \arabic {Aufgabe} ~Aufgaben
\int_compare:nNnT { \g_schulma_klausur_gesamtzeitbedarf_int } > {0}
{
,~
\int_to_arabic:n { \g_schulma_klausur_gesamtzeitbedarf_int }
\c_space_tl min
}
\int_compare:nNnT { \g_schulma_klausur_gesamtpunktzahl_int } > {0}
{
,~
\int_to_arabic:n { \g_schulma_klausur_gesamtpunktzahl_int }
\c_space_tl Punkte
}
}
\tl_set:Nn \l_schulma_klausur_aufgabentitel_tl {Aufgabe}
\DeclareOption {SLK}
{
\bool_gset_true:N \g_schulma_klausur_schriftliche_lernkontrolle_bool
}
\DeclareOption {p-q-Formel}
{
\int_incr:N \g_schulma_klausur_anzahl_hilfen_int
\bool_set_true:N \g_schulma_klausur_pqformel_bool
}
\DeclareOption {Differenzenquotient}
{
\int_incr:N \g_schulma_klausur_anzahl_hilfen_int
\bool_set_true:N \g_schulma_klausur_differenzenquotient_bool
}
\DeclareOption {Differentialquotient}
{
\int_incr:N \g_schulma_klausur_anzahl_hilfen_int
\bool_set_true:N \g_schulma_klausur_differentialquotient_bool
}
\DeclareOption {A5quer}
{
\PassOptionsToClass {a5paper} {scrartcl}
\bool_gset_true:N \g_schulma_klausur_afuenfquer_bool
}
\DeclareOption {AT}
{
\bool_gset_true:N \g_schulma_klausur_oesterreich_bool
}
\DeclareOption {GruppeA}
{
\bool_gset_true:N \g_schulma_klausur_gruppe_a_bool
\bool_gset_false:N \g_schulma_klausur_gruppe_b_bool
}
\DeclareOption {GruppeB}
{
\bool_gset_true:N \g_schulma_klausur_gruppe_b_bool
\bool_gset_false:N \g_schulma_klausur_gruppe_a_bool
}
\DeclareOption {Musterloesung}
{
\bool_gset_true:N \g_schulma_klausur_musterloesung_bool
}
\DeclareOption*
{
\PassOptionsToClass {\CurrentOption} {scrartcl}
\PassOptionsToClass {\CurrentOption} {schulma-praes}
}
\ProcessOptions \relax
\bool_if:NTF \g_schulma_klausur_schriftliche_lernkontrolle_bool
{
\str_gset:Nn \g_schulma_klausur_titel_str {Schriftliche~Lernkontrolle}
}
{
\str_gset:Nn \g_schulma_klausur_titel_str {Klausur}
}
\PassOptionsToPackage {override} {xcolor}
\NewDocumentCommand \Nr {m}
{
\tl_gset:Nn \g_schulma_klausur_nummer_tl {#1}
}
\NewDocumentCommand \Formeldokument {m}
{
\str_gset:Nn \g_schulma_klausur_formeldokumentseiten_str {#1}
}
\newcounter {Aufgabe}
\newcounter {Teilaufgabe} [Aufgabe]
\newlength \Aufgabenabstand
\setlength \Aufgabenabstand {24pt plus12pt minus8pt}
\newlength \Teilaufgabenabstand
\setlength \Teilaufgabenabstand {4.5pt plus2pt minus1pt}
\RequirePackage {schulma}
\RequirePackage {schulma-physik}
\bool_if:NTF \g_schulma_klausur_musterloesung_bool
{
\LoadClass [t] {schulma-praes}
\tl_set:Nn \g_schulma_praes_nummer_tl
{
Musterl\"osung~der~
\tl_if_empty:NF \g_schulma_klausur_nummer_tl
{
\g_schulma_klausur_nummer_tl.~
}
\bool_if:NTF \g_schulma_klausur_schriftliche_lernkontrolle_bool
{
schriftlichen~Lernkontrolle
}
{
\g_schulma_klausur_titel_str
}
\DTMifsaveddate {g_schulma_klausur_klausurdatum}
{
\c_space_tl
vom~
\DTMusedate {g_schulma_klausur_klausurdatum}
}
{} % \DTMifsaveddate hat drei Argumente
\str_if_empty:NF \g_schulma_klausur_teiltitel_str
{
\\ [1ex]
\textit { \g_schulma_klausur_teiltitel_str }
}
}
\resetcounteronoverlays {Aufgabe}
\NewDocumentCommand \Aufgabe {s o o d()}
{
\stepcounter {Aufgabe}
\frametitle
{
\l_schulma_klausur_aufgabentitel_tl
\c_space_tl
\arabic {Aufgabe}
\IfValueT {#2} { \c_colon_str \c_space_tl #2 }
}
\FarbeAufgabe
}
\NewDocumentCommand \Gruppen {smm}
{
\bool_if:nTF \g_schulma_klausur_gruppe_a_bool {#2}
{
\bool_if:nTF \g_schulma_klausur_gruppe_b_bool {#3}
{
\IfBooleanTF {#1}
{
\fbox { \textbf{A} } \nobreakspace #2
\c_space_tl
\fbox { \textbf{B} } \nobreakspace #3
}
{
\par
\medskip
\fbox { \textbf {A} } \c_space_tl #2
\par
\medskip
\fbox { \textbf {B} } \c_space_tl #3
}
}
}
}
\resetcounteronoverlays {Teilaufgabe}
\NewDocumentEnvironment {Teilaufgaben} { }
{
\begin {list}
{
\FarbeAufgabe
\stepcounter {Teilaufgabe}
\alph {Teilaufgabe} )
}
{
\setlength \topsep {\Teilaufgabenabstand}
\setlength \itemsep {\Teilaufgabenabstand}
\bool_if:NF \l_schulma_klausur_loesung_bool
{
\FarbeAufgabe
}
}
}
{
\end {list}
}
\NewDocumentEnvironment {Lsg} {s}
% Stern: Lösung beginnt mit einer Gleichung, kein Abstand erforderlich
{
\IfBooleanF {#1} { \par \medskip }
\bool_gset_true:N \l_schulma_klausur_loesung_bool
\FarbeLoesung
}
{
\bool_gset_false:N \l_schulma_klausur_loesung_bool
}
\RenewDocumentCommand \Datum {m}
{
\DTMsavedate {g_schulma_klausur_klausurdatum} {#1}
}
}
{
\LoadClass {scrartcl}
\RequirePackage {scrlayer-scrpage}
\BeforeClosingMainAux
{
\addtocounter{page}{-1}
\label{LastPage}
}
\NewDocumentCommand \Kurs {m}
{
\tl_gset:Nn \g_schulma_klausur_kurs_tl {#1}
}
\NewDocumentCommand \Datum {m}
{
\str_set:Nn \g_schulma_klausur_datum_str {#1}
}
\NewDocumentEnvironment {Teilaufgaben} { }
{
\renewcommand \labelenumi { ( \roman {enumi} ) }
\begin {list} { \stepcounter {Teilaufgabe} \alph {Teilaufgabe} ) }
{
\setlength \topsep {\Teilaufgabenabstand}
\setlength \itemsep {\Teilaufgabenabstand}
}
}
{
\end {list}
}
\AfterEndPreamble
{
\begin {list} { }
{
\setlength \leftmargin {0pt}
\setlength \partopsep {0pt}
\setlength \topsep {0.75\Aufgabenabstand}
\setlength \itemsep {\Aufgabenabstand}
}
% innerhalb der Liste Originalwert verwenden
\setlength \topsep {9pt plus3pt minus5pt}
}
\AtBeginDocument {\schulma_klausur_kopf:}
\RequirePackage {pdfpages}
\pretocmd {\enddocument}
{
\end {list}
\par
\int_compare:nNnT {\g_schulma_klausur_anzahl_hilfen_int} > {1}
{
\vfill
\noindent
\textsl {Hilfen:}
\begin {itemize}
\bool_if:NT \g_schulma_klausur_pqformel_bool
{
\item
\c_schulma_klausur_pqformel_tl
}
\bool_if:NT \g_schulma_klausur_differenzenquotient_bool
{
\item
\c_schulma_klausur_differenzenquotient_tl
}
\bool_if:NT \g_schulma_klausur_differentialquotient_bool
{
\item
\c_schulma_klausur_differentialquotient_tl
}
\end {itemize}
}
\int_compare:nNnT {\g_schulma_klausur_anzahl_hilfen_int} = {1}
{
\vfill
\noindent
\textsl {Hilfe:} ~
\bool_if:NT \g_schulma_klausur_pqformel_bool
{
\c_schulma_klausur_pqformel_tl
}
\bool_if:NT \g_schulma_klausur_differenzenquotient_bool
{
\c_schulma_klausur_differenzenquotient_tl
}
\bool_if:NT \g_schulma_klausur_differentialquotient_bool
{
\c_schulma_klausur_differentialquotient_tl
}
}
\str_if_empty:NF \g_schulma_klausur_formeldokumentseiten_str
{
\includepdf [ pages = \g_schulma_klausur_formeldokumentseiten_str ]
{
M_Dokument_mit_mathematischen_Formeln
}
}
}{}{} % pretocmd hat vier Argumente
\AtEndDocument { \msg_note:nn {schulma-klausur} {Aufgabensumme} }
\NewDocumentCommand \Aufgabe {s o o d()}
{
\item
\stepcounter {Aufgabe}
\msg_note:nnnnn {schulma-klausur} {Aufgabennachricht} {#2} {#3} {#4}
\group_begin:
\sffamily \bfseries
\l_schulma_klausur_aufgabentitel_tl
\c_space_tl
\arabic {Aufgabe}
\IfValueT {#3}
{
\int_gadd:Nn \g_schulma_klausur_gesamtzeitbedarf_int {#3}
}
\IfValueT {#4}
{
\mdseries
\rmfamily
\slshape
\c_space_tl
(#4~Punkte)
\int_gadd:Nn \g_schulma_klausur_gesamtpunktzahl_int {#4}
}
\IfBooleanF {#1} {.}
\group_end:
\peek_catcode:NF \c_space_token {\c_space_tl}
}
\NewDocumentCommand \Gruppen {smm}
{
\bool_if:NTF \g_schulma_klausur_gruppe_a_bool {#2}
{
\bool_if:NTF \g_schulma_klausur_gruppe_b_bool {#3}
{
\msg_warning:nn {schulma-klausur} {Gruppe fehlt}
#2
}
}
}
\bool_if:NTF \g_schulma_klausur_afuenfquer_bool
{
\KOMAoption {paper} {landscape}
\RequirePackage [top=2.7cm, bottom=3cm, hmargin=2.5cm] {geometry}
}
{
\RequirePackage [top=2.7cm, hmargin=2.5cm] {geometry}
}
\addtokomafont {pagefoot} {\slshape}
\addtokomafont {pagenumber} {\slshape}
\rohead { Name:~ \raisebox {-1mm} { \rule {7cm} {0,4pt} } }
\cfoot { Seite~ \pagemark \c_space_tl von~ \pageref {LastPage} }
\RequirePackage {comment}
\excludecomment {Lsg}
\RequirePackage {beamerarticle}
\RequirePackage {tasks}
% tasks: j überspringen
\newcommand*\@schulmaalph[1]{\ifnum #1>9 \@alph{\numexpr #1+1}\else \@alph{#1}\fi}
\newcommand*\schulmaalph[1]{\@schulmaalph{\value{#1}}}
\settasks{label-align=right,
item-indent=2.2em,
label-offset=0.5em,
label-width=1.3em,
label=\schulmaalph*),
after-skip=4.5pt plus2pt minus1pt}
\settasks{before-skip=9pt plus4pt minus2pt,
after-item-skip=9pt plus4pt minus2pt}
}
\RequirePackage {adjustbox}
\cs_new:Npn \schulma_klausur_notentabelle:n #1
{
\clist_set:Nn \l_schulma_klausur_notenliste_clist {#1}
\begin {tabular} { * {5} {c|} c }
1 & 2 & 3 & 4 & 5 & 6
\tabularnewline
\hline
\int_step_inline:nnnn {1} {1} {6}
{
\int_zero:N \l_tmpa_int
\clist_map_inline:Nn \l_schulma_klausur_notenliste_clist
{
\int_compare:nNnT {####1} = {##1}
{
\int_incr:N \l_tmpa_int
}
}
\int_compare:nNnF {\l_tmpa_int} = {0} {\int_use:N \l_tmpa_int}
\int_compare:nNnF {##1} = {6} {&}
}
\end {tabular}
}
\cs_new:Npn \schulma_klausur_notenpunkttabelle:n #1
{
\clist_set:Nn \l_schulma_klausur_notenliste_clist {#1}
\setlength \tabcolsep {0pt}
\begin {tabular}
{
* {5}
{
> {\centering} p{0,06\linewidth}
> {\centering} p{0,06\linewidth}
> {\centering} p{0,06\linewidth} |
}
> {\centering} p{0,06\linewidth}
}
15 & 14 & 13 & 12 & 11 & 10 & 9 & 8 & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0
\tabularnewline
\hline
\int_step_inline:nnnn {15} {-1} {0}
{
\int_zero:N \l_tmpa_int
\clist_map_inline:Nn \l_schulma_klausur_notenliste_clist
{
\int_compare:nNnT {####1} = {##1}
{
\int_incr:N \l_tmpa_int
}
}
\int_compare:nNnF {\l_tmpa_int} = {0} {\int_use:N \l_tmpa_int}
\int_compare:nNnF {##1} = {0} {&}
}
\end {tabular}
}
\bool_if:NTF \g_schulma_klausur_oesterreich_bool
{
\RequirePackage [naustrian] {babel}
}
{
\RequirePackage [ngerman] {babel}
}
\RequirePackage [useregional=text] {datetime2}
\NewDocumentCommand \Klausurtitel {m}
{
\str_gset:Nn \g_schulma_klausur_titel_str {#1}
}
\NewDocumentCommand \Klausuruntertitel {m}
{
\tl_gset:Nn \g_schulma_klausur_untertitel_tl {#1}
}
\NewDocumentCommand \Klausurteiltitel {m}
{
\str_gset:Nn \g_schulma_klausur_teiltitel_str {#1}
}
\NewDocumentCommand \Bearbeitungszeit {m}
{
\str_gset:Nn \g_schulma_klausur_bearbeitungszeit_str {#1}
}
\NewDocumentCommand \Hilfsmittel {m}
{
\tl_gset:Nn \g_schulma_klausur_hilfsmittel_tl {#1}
}
\NewDocumentCommand \Loesungsdatum {m}
{
% \date { \DTMdate {#1} }
\date { \printdate {#1} } % isodate-Befehl
}
\DeclareDocumentCommand \Aufgabentitel {m}
{
\tl_set:Nn \l_schulma_klausur_aufgabentitel_tl {#1}
}
\NewDocumentCommand \Notenspiegel {m}
{
\bool_if:NT \g_schulma_klausur_musterloesung_bool
{
\begin {frame}
\frametitle {Notenspiegel}
\begin {center}
\LARGE
\schulma_klausur_notentabelle:n {#1}
\end {center}
\end {frame}
}
}
\NewDocumentCommand \Notenpunktspiegel {m}
{
\bool_if:NT \g_schulma_klausur_musterloesung_bool
{
\begin {frame}
\begin {center}
\frametitle {Notenspiegel}
\large
\schulma_klausur_notenpunkttabelle:n {#1}
\end {center}
\end {frame}
}
}
\cs_set:Npn \schulma_klausur_kopf:
{
\noindent
\parbox [t] {5cm} {\g_schulma_klausur_kurs_tl}
\hfill
\str_if_empty:NF \g_schulma_klausur_datum_str
{
\DTMdate {\g_schulma_klausur_datum_str}
}
\begin {center}
\sffamily
\bfseries
\Large
\g_schulma_klausur_titel_str
\tl_if_empty:NF \g_schulma_klausur_nummer_tl
{
\c_space_tl
Nr.~
\g_schulma_klausur_nummer_tl
}
\bool_if:NT \g_schulma_klausur_gruppe_a_bool { \c_space_tl (A) }
\bool_if:NT \g_schulma_klausur_gruppe_b_bool { \c_space_tl (B) }
\tl_if_empty:NF \g_schulma_klausur_untertitel_tl
{
\par \smallskip
\normalsize
\g_schulma_klausur_untertitel_tl
}
\str_if_empty:NF \g_schulma_klausur_teiltitel_str
{
\par \vspace {3ex}
\large
\textit {\g_schulma_klausur_teiltitel_str}
}
\str_if_empty:NF \g_schulma_klausur_bearbeitungszeit_str
{
\par \smallskip
\normalsize
\rmfamily
\mdseries
\textsl {Bearbeitungszeit:} ~
\g_schulma_klausur_bearbeitungszeit_str \, min
}
\tl_if_empty:NF \g_schulma_klausur_hilfsmittel_tl
{
\par \smallskip
\normalsize
\rmfamily
\mdseries
\textsl {Hilfsmittel:} ~
\g_schulma_klausur_hilfsmittel_tl
}
\end {center}
}
\NewDocumentCommand \FarbeAufgabe { }
{
\usebeamercolor [fg] {frametitle}
}
\NewDocumentCommand \FarbeLoesung { }
{
\usebeamercolor [fg] {normal~text}
}
\NewDocumentCommand \NurAufgabe {+m}
{
\bool_if:NF \g_schulma_klausur_musterloesung_bool {#1}
}
\NewDocumentCommand \NurLoesung {+m}
{
\bool_if:NT \g_schulma_klausur_musterloesung_bool {#1}
}