vorlagen-muendliche-pruefungen

git clone git://source.orangerot.dev/university/vorlagen-muendliche-pruefungen.git
Log | Files | Refs | README

lib.typ (4679B)


      1 // SPDX-FileCopyrightText: 2025 Gero Beckmann <orangerot@orangerot.dev>
      2 //
      3 // SPDX-License-Identifier: MIT
      4 
      5 #let KIND = (:
      6   "DIPLOM":            "Diplomprüfung",
      7   "STAATSEXAM":        "Staatsexamensprüfung",
      8   "STUDIENBEGLEITEND": "Studienbegleitende Prüfung",
      9   "BACHELOR":          "Bachelorprüfung",
     10   "MASTER":            "Masterprüfung",
     11   "NONE":              ""
     12 )
     13 
     14 #let event(name: "", lecturer: "", semester: "", sws: "", ects: "", lp: "") = (
     15   name, lecturer, semester, sws, ects, lp
     16 )
     17 
     18 #let exam-report(
     19   study: "",                                 // Studiengang
     20   lecture: "",                               // Fach
     21   kind: KIND.NONE,                           // Prüfungsart KIND.{DIPLOM, STAATSEXAM, STUDIENBEGLEITEND, BACHELOR, MASTER}
     22   date: datetime(year: 0, month: 1, day: 1), // Prüfungsdatum
     23   examiner: "",                              // PrüferIn (Prof)
     24   grade_received: 0.0,                       // Note
     25   grade_reasonable: "",                      // War die Note angemessen?
     26   exam_duration: duration(minutes: 0),       // Prüfungsdauer
     27   checked_knowledge_gaps: none,              // Wurde Unwissen abgeprüft?
     28   attendance: (
     29     /* Titel der Vorlesung, Dozent, Wann gehört, SWS, ECTS, LP */
     30     event(name: "", lecturer: "", semester: "", sws: "", ects: "", lp: ""),
     31     event(name: "", lecturer: "", semester: "", sws: "", ects: "", lp: ""),
     32     event(name: "", lecturer: "", semester: "", sws: "", ects: "", lp: ""),
     33     event(name: "", lecturer: "", semester: "", sws: "", ects: "", lp: ""),
     34     event(name: "", lecturer: "", semester: "", sws: "", ects: "", lp: ""),
     35   ),
     36   attendance_worth: [
     37     // Wie regelmäßig hast du die Lehrveranstaltungen besucht? Hat sich der
     38     // Besuch/Nichtbesuch in der Prüfung positiv/negativ ausgewirkt?
     39   ],
     40   literature: [
     41     // Welche Literatur hast du benutzt (Bücher, Skripten, Vorlesungsmitschriften)?
     42   ],
     43   preparation_time: [
     44     // Hast du dich alleine/zu mehreren auf die Prüfung vorbereitet? Wie lange?
     45     // Hat es etwas gebracht?
     46   ],
     47   agreements: [
     48     // Fanden vor der Prüfung Absprachen statt (Form, Inhalt, ...)?
     49     // Wenn ja, welche? Wurden sie eingehalten?
     50   ],
     51   preparations: [
     52     // Welche Tipps zur Vorbereitung kannst du geben?
     53     // (wichtige/unwichtige Teile des Stoffs, gute Literatur, Lernstil)
     54   ],
     55   examiner_behavior: [
     56     // Was kannst du zum Prüfungsstil des/der Prüfenden sagen?
     57     // (Prüfungsatmosphäre, (un)klare Fragestellungen, Fragen nach Einzelheiten
     58     // oder eher größere Zusammenhänge, gezielte Zwischenfragen oder lässt
     59     // er/sie dich erzählen, Weiterhelfen bei Unsicherheiten ...)
     60   ],
     61   examiner_recommendation: (none, [
     62     // Kannst du die Prüfenden weiterempfehlen?
     63   ]),
     64   examinee_behavior: [
     65     // Welche Ratschläge für das Verhalten in der Prüfung kannst du geben?
     66   ],
     67   doc
     68 ) = [
     69   #let checkbox(checked: false) = if (checked) {$times.square$} else {$square$}
     70   #let input(width: 1fr, body) = box(width: width, height: 1em, inset: (bottom: 2pt), baseline: 2pt, stroke: (bottom: 0.5pt),align(right, body))
     71   #let grid_arguments(it) = {
     72     let g = it.fields()
     73     let _ = g.remove("label")
     74     let _ = g.remove("children")
     75     return g
     76   }
     77 
     78   #show <study>: study
     79   #show <lecture>: lecture
     80   #show <date>: if date.year() > 0 {date.display("[day].[month].[year]")}
     81   #show <examiner>: examiner
     82   #show <literature>: literature
     83   #show <preparation_time>: preparation_time
     84   #show <attendance_worth>: attendance_worth
     85   #show <agreements>: agreements
     86   #show <preparations>: preparations
     87   #show <exam_duration>: if exam_duration.minutes() > 0 [#exam_duration.minutes()]
     88   #show <examiner_behavior>: examiner_behavior
     89   #show <examinee_behavior>: examinee_behavior
     90   #show <grade_received>: if grade_received > 0.0 {str(grade_received+0.01).slice(0,3).replace(".",",")}
     91   #show <grade_reasonable>: grade_reasonable
     92   #show <examiner_recommendation>: examiner_recommendation.at(1)
     93   #show <kind>: it => grid(..grid_arguments(it),
     94     ..KIND.values().filter(it => it != KIND.NONE).map(exam_kind => [
     95       #checkbox(checked: kind == exam_kind) #exam_kind
     96     ]),
     97     [#checkbox(checked: kind not in KIND.values() and kind != "")
     98       #input(width: 1fr)[ #if kind not in KIND.values() [#kind] ]
     99     ]
    100   )
    101   #show <attendance>: it => table(..grid_arguments(it),
    102     ..it.fields().children.at(0).children,
    103     ..(attendance + 5*(event(),)).slice(0,5).flatten()
    104   )
    105   #show <checked_knowledge_gaps>: [
    106     #h(1fr)
    107     #checkbox(checked: checked_knowledge_gaps == true) ja
    108     #h(0.8cm)
    109     #checkbox(checked: checked_knowledge_gaps == false) nein
    110   ]
    111 
    112   #include "muendliche-pruefung-mathematik.typ"
    113 
    114   #doc
    115 ]
    116