% schulmathematik bundle: document class schulma-klausur
% Version 1.7.1
% 28. Juni 2025
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplClass{schulma-klausur}{2025-06-28}{1.7.1}{Dokumentenklasse fuer Klausuren}

\RequirePackage {etoolbox}

\str_new:N \g_schulma_klausur_datum_str
\str_new:N \g_schulma_klausur_loesungsdatum_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_musterloesungstitel_tl
\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 \g_schulma_klausur_praesentation_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
    \bool_gset_true:N \g_schulma_klausur_praesentation_bool
  }

\DeclareOption {MusterloesungD}
  {
    \bool_gset_true:N \g_schulma_klausur_musterloesung_bool
    \bool_gset_false:N \g_schulma_klausur_praesentation_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}
  }

\tl_gset:Nn \g_schulma_klausur_musterloesungstitel_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
      }
    \str_if_empty:NF \g_schulma_klausur_datum_str
      {
        \c_space_tl
        \mbox { vom~ \DTMdate { \g_schulma_klausur_datum_str } }
      }
    \bool_if:NT \g_schulma_klausur_praesentation_bool
      {
        \str_if_empty:NF \g_schulma_klausur_teiltitel_str
          {
            \\ [1ex]
            \textit { \g_schulma_klausur_teiltitel_str }
          }
      }
  }

% \PassOptionsToPackage {override} {xcolor} % verursacht seit 17. Nov. 2023 Fehlermeldung

\NewDocumentCommand \Nr {m}
  {
    \tl_gset:Nn \g_schulma_klausur_nummer_tl {#1}
  }

\NewDocumentCommand \Loesungsdatum {m}
  {
    \str_gset:Nn \g_schulma_klausur_loesungsdatum_str {#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_praesentation_bool
  {
    \LoadClass [t] {schulma-praes}

    \date
      {
        \str_if_empty:NTF \g_schulma_klausur_loesungsdatum_str
          {
            \today
          }
          {
            \printdate { \g_schulma_klausur_loesungsdatum_str } % isodate-Befehl
          }
      }

    \tl_set:Nn \g_schulma_praes_nummer_tl
      {
        \g_schulma_klausur_musterloesungstitel_tl
      }

    \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 { s +m +m }
      {
        \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 }
            \settasks { before-skip = 0.3ex }
            \bool_if:NF \l_schulma_klausur_loesung_bool
              {
                \FarbeAufgabe
              }
          }
      }
      {
        \end {list}
      }

    \RenewDocumentCommand \Datum {m}
      {
        \str_gset:Nn \g_schulma_klausur_datum_str {#1}
      }
  }
  {
    \LoadClass {scrartcl}
    \RequirePackage {scrlayer-scrpage}

    \BeforeClosingMainAux { \label {LastPage} }

    \bool_if:NT \g_schulma_klausur_musterloesung_bool
      {
        \bool_if:NTF \g_schulma_klausur_oesterreich_bool
          {
            \RequirePackage [naustrian] {isodate}
          }
          {
            \RequirePackage [ngerman] {isodate}
          }

        % isodate: Monat ggf. einstellig anzeigen:
        \numdate[arabic]
        % isodate: Tag ggf. einstellig anzeigen:
        \isotwodigitdayfalse
        % isodate: Abstand zwischen Monat und Jahr im numerischen Format:
        \monthyearsepgerman{\,}{\,}
      }

    \NewDocumentCommand \Kurs {m}
      {
        \tl_gset:Nn \g_schulma_klausur_kurs_tl {#1}
      }

    \NewDocumentCommand \Datum {m}
      {
        \str_gset: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 }
            \settasks { before-skip = \parsep }
          }
      }
      {
        \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}
    \RequirePackage {comment}

    \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 { s +m +m }
      {
        \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 }

    \bool_if:NF \g_schulma_klausur_musterloesung_bool
      {
        \rohead { Name:~ \raisebox {-1mm} { \rule {7cm} {0,4pt} } }
        \excludecomment {Lsg}
      }

    \cfoot { Seite~ \pagemark \c_space_tl von~ \pageref {LastPage} }
    \ofoot { }

    \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}
  }

\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}
        \frametitle {Notenspiegel}
        \begin {center}
        \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
    \bool_if:NTF \g_schulma_klausur_musterloesung_bool
      {
        \str_if_empty:NF \g_schulma_klausur_loesungsdatum_str
          {
            \printdate { \g_schulma_klausur_loesungsdatum_str } % isodate-Befehl
          }
      }
      {
        \str_if_empty:NF \g_schulma_klausur_datum_str
          {
            \DTMdate { \g_schulma_klausur_datum_str }
          }
      }

    \begin {center}
    \sffamily
    \bfseries
    \Large
    \bool_if:NTF \g_schulma_klausur_musterloesung_bool
      {
        \g_schulma_klausur_musterloesungstitel_tl
      }
      {
        \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 }
      }

    \bool_if:NF \g_schulma_klausur_musterloesung_bool
      {
        \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}
  }

\bool_if:NT \g_schulma_klausur_musterloesung_bool
  {
    \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
      }
  }
