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