From d7aa0164e38b2a632dbdd187aec4735861386f1b Mon Sep 17 00:00:00 2001 From: orangerot Date: Mon, 8 Sep 2025 14:13:40 +0200 Subject: [PATCH] style(lib, pruefung): reduce redundancy by include bachelor.typ in lib --- muendliche-pruefung/bachelor.typ | 180 ++++++++++++++++++ muendliche-pruefung/lib.typ | 197 +++++--------------- muendliche-pruefung/muendliche-pruefung.typ | 4 +- 3 files changed, 228 insertions(+), 153 deletions(-) create mode 100644 muendliche-pruefung/bachelor.typ diff --git a/muendliche-pruefung/bachelor.typ b/muendliche-pruefung/bachelor.typ new file mode 100644 index 0000000..12d0b92 --- /dev/null +++ b/muendliche-pruefung/bachelor.typ @@ -0,0 +1,180 @@ +#set page("a4", margin: 1.1cm, footer: context if counter(page).get() == (1,) [#h(1fr)$arrow.r.hook$ *Rückseite bitte nicht vergessen!*]) +#set text(lang: "de", size: 10pt) +#set grid(column-gutter: .5cm, inset: (bottom: 10pt)) +#set table(stroke: 0.5pt) +#show emoji.hand.write: box(height: 10pt, clip: true, scale(x:-100%)[🖎]) +#let radiobox(checked: false) = if checked {$circle.filled$} else {$circle$} +#let input(width: 1fr, name: "", body) = box(width: width, height: 1em, inset: (bottom: 2pt), baseline: 2pt, stroke: (bottom: (dash: "loosely-dotted")),align(right, [#body #label(name)])) +#let question(name: "", question, body) = [ + #grid(columns: 2, inset: 0pt, emoji.hand.write, box(inset: (top: 3pt))[*#question*]) + + #body #label(name) +] + +#grid(columns: 2 * (1fr,), + [ + #v(1em) + #grid(columns: 2, + image(width: 1.8cm, "fsmi-logo.svg"), + text(size: 15pt)[ + Fragebogen der Fachschaft zu + *mündlichen Prüfungen* \ + im Informatikstudium + ]) + ], + [], + [], + [ + #align(center)[Barcode:] + ], + par(justify: true)[ + Dieser Fragebogen gibt den Studierenden, die nach dir die Prüfung ablegen + wollen, einen Einblick in Ablauf und Inhalt der Prüfung. Das erleichtert die + Vorbereitung. \ + Bitte verwende zum Ausfüllen einen schwarzen Stift. Das erleichtert das + Einscannen. \ + Vielen Dank für deine Mitarbeit! + ], + [ + #grid( + columns: (.1cm, 1fr, .1cm), + rows: (.1cm, 2.5cm, .1cm), + stroke: (x,y) => (: + top: if x != 1 and y == 0 {.5pt}, + bottom: if x != 1 and y == 2 {.5pt}, + left: if y != 1 and x == 0 {.5pt}, + right: if y != 1 and x == 2 {.5pt}, + )) + #v(2em) + ], + [ + Dein Sudiengang: #input(name: "study")[ + // Hier ist Platz für deinen Kommentar. + ] + + Prüfungsart: \ + #[ + #radiobox(checked: false) Wahlpflicht \ + #radiobox(checked: false) Vertiefungsfach \ + #radiobox(checked: false) Ergänzungsfach \ + ] + + Welches? #input(name: "lecture")[ + // Hier ist Platz für deinen Kommentar. + ] + ], + [ + #grid(columns: (auto, 1fr), + [Prüfungsdatum:], + input(name: "date")[ + // Hier ist Platz für deinen Kommentar. + ], + [Prüfer(in):], + input(name: "examiner")[ + // Hier ist Platz für deinen Kommentar. + ], + [Beisitzer(in):], + input(name: "assistant")[ + // Hier ist Platz für deinen Kommentar. + ], + ) + ], +) + +*Prüfungsfächer und Vorbereitung:* + +#table(columns: 4 * (1fr,), row-gutter: (2pt, ..(3*(0pt,))), rows: 2em, align: horizon, + table.header( + [Veranstaltung],[Dozent(in)],[Jahr],[regelmäßig besucht?]), + [ ],[ ],[ ],[ ], + [ ],[ ],[ ],[ ], + [ ],[ ],[ ],[ ], + [ ],[ ],[ ],[ ], +) + +#v(1em) +#grid(columns: 2 * (1fr,), + [ + Note: + #input(name: "grade_received")[ + // Hier ist Platz für deinen Kommentar. + ] + ], + [ + Prüfungsdauer: + #input(name: "exam_duration")[ + // Hier ist Platz für deinen Kommentar. + ] Minuten + ], +) + +#v(1em) +War diese Note angemessen? +#input(name: "grade_reasonable")[ + // Hier ist Platz für deinen Kommentar. +] + +#v(1em) +#question(name: "examiner_behavior")[ + Wie war der Prüfungsstil des Prüfers / der Prüferin? +][ + Prüfungsatmosphäre, (un)klare Fragestellungen, Frage nach Einzelheiten oder + eher größeren Zusammenhängen, kamen häufiger Zwi- schenfragen oder ließ er/sie + dich erzählen, wurde dir weitergeholfen, wurde in Wissenslücken gebohrt? + + // Hier ist Platz für deinen Kommentar. +] + +#pagebreak() + +#grid(rows: (3 * (22em,)), columns: 2 * (1fr,), + question(name: "attendance_worth")[ + Hat sich der Besuch / Nichtbesuch der Veran- staltung für dich gelohnt? + ][ + // Hier ist Platz für deinen Kommentar. + ], + question(name: "examiner_recommendations")[ + Kannst du ihn / sie weiterempfehlen? Warum? + ][ + #radiobox(checked: false) Ja \ + #radiobox(checked: false) Nein + + // Hier ist Platz für deinen Kommentar. + ], + question(name: "preparation_time")[ + Wie lange und wie hast du dich alleine oder mit anderen auf die Prüfung vorbereitet? + ][ + // Hier ist Platz für deinen Kommentar. + ], + question(name: "agreements")[ + Fanden vor der Prüfung Absprachen zu Form oder Inhalt statt? Wurden sie eingehalten? + ][ + // Hier ist Platz für deinen Kommentar. + ], + question(name: "preparations")[ + Welche Tipps zur Vorbereitung kannst du ge-\ ben? + ][ + Wichtige / unwichtige Teile des Stoffes, gute Bücher / Skrip- ten, Lernstil, ... + + // Hier ist Platz für deinen Kommentar. + ], + question(name: "examinee_behavior")[ + Kannst du Ratschläge für das Verhalten in der Prüfung geben? + ][ + // Hier ist Platz für deinen Kommentar. + ], +) + +*Inhalte der Prüfung (bitte auf weitere Blätter):* +#[ + #set list(spacing: 1.2em, indent: 1.5em) + - Schreibe bitte möglichst viele Fragen und Antworten auf. + - Wo wurde nach Herleitungen oder Beweisen gefragt oder sonstwie nachgehakt? + - Worauf wollte der Prüfer / die Prüferin hinaus? + - Welche Fragen gehörten nicht zum eigentlichen Stoff? +] + +#colbreak() + +// Hier ist Platz für deinen Kommentar. + diff --git a/muendliche-pruefung/lib.typ b/muendliche-pruefung/lib.typ index ea9194c..bc593ae 100644 --- a/muendliche-pruefung/lib.typ +++ b/muendliche-pruefung/lib.typ @@ -2,17 +2,17 @@ // // SPDX-License-Identifier: MIT -#let kind = (: - "wahlpflicht": "Wahlpflicht", - "vertiefungsfach": "Vertiefungsfach", - "ergaenzungsfach": "Ergänzungsfach", - "none": "" +#let KIND = (: + "WAHLPFLICHT": "Wahlpflicht", + "VERTIEFUNGSFACH": "Vertiefungsfach", + "ERGAENZUNGSFACH": "Ergänzungsfach", + "NONE": "" ) #let oral-exam( study: "", // Studiengang lecture: "", // Fach - kind: kind.none, // Prüfungsart (Wahlpflicht, Vertiefungsfach, Ergänzungsfach) + kind: KIND.NONE, // Prüfungsart KIND.{WAHLPFLICHT, VERTIEFUNGSFACH, ERGUENZUNGSFACH} date: datetime(year: 0, month: 1, day: 1), // Prüfungsdatum examiner: "", // PrüferIn (Prof) assistant: "", // BeisitzerIn @@ -41,7 +41,7 @@ examiner_behavior: [ // Wie war der Prüfungsstil des Prüfers / der Prüferin? ], - examiner_recommendation: (none, [ + examiner_recommendation: (none, [ // true, false // Kannst du ihn / sie weiterempfehlen? Warum? ]), examinee_behavior: [ @@ -49,155 +49,50 @@ ], doc ) = [ - #set page("a4", margin: 1.1cm) - #set text(lang: "de", size: 10pt) - #set grid(column-gutter: .5cm, inset: (bottom: 10pt)) - #set table(stroke: 0.5pt) - #show emoji.hand.write: box(height: 10pt, clip: true, scale(x:-100%)[🖎]) - #show table.cell: it => block(inset: (bottom: 4pt, rest: 8pt), box(height: 1em, it.body)) #let radiobox(checked: false) = if checked {$circle.filled$} else {$circle$} - #let input(width: 1fr, body) = box(width: width, height: 1em, inset: (bottom: 2pt), baseline: 2pt, stroke: (bottom: (dash: "loosely-dotted")),align(right, body)) - #let question(q, body) = [ - #grid(columns: 2, inset: 0pt, emoji.hand.write, box(inset: (top: 3pt))[*#q*]) - #body - ] - - #page([ - #grid(columns: 2 * (1fr,), - [ - #v(1em) - #grid(columns: 2, - image(width: 1.8cm, "fsmi-logo.svg"), - text(size: 15pt)[ - Fragebogen der Fachschaft zu - *mündlichen Prüfungen* \ - im Informatikstudium - ]) - ], - [ - ], - [],[ - #align(center)[Barcode:] - ], - par(justify: true)[ - Dieser Fragebogen gibt den Studierenden, die nach dir die Prüfung ablegen - wollen, einen Einblick in Ablauf und Inhalt der Prüfung. Das erleichtert die - Vorbereitung. \ - Bitte verwende zum Ausfüllen einen schwarzen Stift. Das erleichtert das - Einscannen. \ - Vielen Dank für deine Mitarbeit! - ], - [ - #grid( - columns: (.1cm, 1fr, .1cm), - rows: (.1cm, 2.5cm, .1cm), - stroke: (x,y) => (: - top: if x != 1 and y == 0 {.5pt}, - bottom: if x != 1 and y == 2 {.5pt}, - left: if y != 1 and x == 0 {.5pt}, - right: if y != 1 and x == 2 {.5pt}, - )) - #v(2em) - ], - [ - Dein Sudiengang: #input[#study] - - Prüfungsart: - #let module_kinds = ( - "Wahlpflicht", - "Vertiefungsfach", - "Ergänzungsfach", - ) - #for module_kind in module_kinds [ - \ #radiobox(checked: kind == module_kind) #module_kind - ] - - Welches? #input[#lecture] - ], - [ - #grid(columns: (auto, 1fr), - [Prüfungsdatum:], input[#if date.year() > 0 {date.display("[day].[month].[year]")}], - [Prüfer(in): ], input[#examiner], - [Beisitzer(in):], input[#assistant], - ) - ]) - - #let modules = attendance + 4 * ((lecture: "", lecturer: "", year: "", did_attend: ""),) - - *Prüfungsfächer und Vorbereitung:* - - #table(columns: 4 * (1fr,), row-gutter: (2pt, ..(3*(0pt,))), - table.header[Veranstaltung][Dozent(in)][Jahr][regelmäßig besucht?], - ..modules.map(((lecture, lecturer, year, did_attend)) => - (lecture, lecturer, year, did_attend) - ).slice(0,4).flatten() - ) - - #v(1em) - #grid(columns: 2 * (1fr,),[ - Note: #input[#if grade_received > 0.0 {str(grade_received+0.01).slice(0,3).replace(".",",")}] - ],[ - Prüfungsdauer:#input[#if exam_duration.minutes() > 0 {exam_duration.minutes()}] Minuten - ]) - - #v(1em) - War diese Note angemessen? #input[#grade_reasonable] - - #v(1em) - #question[Wie war der Prüfungsstil des Prüfers / der Prüferin?][ - Prüfungsatmosphäre, (un)klare Fragestellungen, Frage nach Einzelheiten oder eher größeren Zusammenhängen, kamen häufiger Zwi- - schenfragen oder ließ er/sie dich erzählen, wurde dir weitergeholfen, wurde in Wissenslücken gebohrt? - - #examiner_behavior + #show : study + #show : lecture + #show : if date.year() > 0 {date.display("[day].[month].[year]")} + #show : examiner + #show : assistant + #show : if grade_received > 0.0 {str(grade_received+0.01).slice(0,3).replace(".",",")} + #show : grade_reasonable + #show : if exam_duration.minutes() > 0 [#exam_duration.minutes()] + #show : attendance_worth + #show : preparation_time + #show : agreements + #show : it => [#it #preparations] + #show : examiner_behavior + #show : it => [#it #examinee_behavior] + #show : { + for exam_kind in KIND.values().filter(it => it != KIND.NONE) [ + #radiobox(checked: kind == exam_kind) #exam_kind \ ] + } + #show : [ + #let can_recommend = examiner_recommendation.at(0) + #radiobox(checked: can_recommend == true) Ja \ + #radiobox(checked: can_recommend == false) Nein - ], footer: [#h(1fr)$arrow.r.hook$ *Rückseite bitte nicht vergessen!*]) - - #page()[ - #grid(rows: (3 * (22em,)), columns: 2 * (1fr,), - question[ - Hat sich der Besuch / Nichtbesuch der Veran- - staltung für dich gelohnt? - ][#attendance_worth], - question[ - Kannst du ihn / sie weiterempfehlen? Warum? \ \ - ][ - #radiobox(checked: examiner_recommendation.at(0) == true) Ja \ - #radiobox(checked: examiner_recommendation.at(0) == false) Nein - - #examiner_recommendation.at(1) - ], - question[ - Wie lange und wie hast du dich alleine oder - mit anderen auf die Prüfung vorbereitet? - ][#preparation_time], - question[ - Fanden vor der Prüfung Absprachen zu Form - oder Inhalt statt? Wurden sie eingehalten? - ][#agreements], - question[ - Welche Tipps zur Vorbereitung kannst du ge-\ ben? - ][ - Wichtige / unwichtige Teile des Stoffes, gute Bücher / Skrip- - ten, Lernstil, ... - - #preparations - ], - question[ - Kannst du Ratschläge für das Verhalten in der - Prüfung geben? - ][#examinee_behavior] - ) - - *Inhalte der Prüfung (bitte auf weitere Blätter):* - - #set list(spacing: 1.2em, indent: 1.5em) - - Schreibe bitte möglichst viele Fragen und Antworten auf. - - Wo wurde nach Herleitungen oder Beweisen gefragt oder sonstwie nachgehakt? - - Worauf wollte der Prüfer / die Prüferin hinaus? - - Welche Fragen gehörten nicht zum eigentlichen Stoff? + #examiner_recommendation.at(1) ] + #show : it => { + let g = it.fields() + let _ = g.remove("children") + let _ = g.remove("label") + let events = attendance.map(((lecture, lecturer, year, did_attend)) => + (lecture, lecturer, year, did_attend) + ).flatten() + + table(..g, + ..it.fields().children.at(0).children, + ..(events + 4*4*([],)).slice(0,4*4) + ) + } + + #include "bachelor.typ" + #doc ] diff --git a/muendliche-pruefung/muendliche-pruefung.typ b/muendliche-pruefung/muendliche-pruefung.typ index ef2ea4d..40e8da0 100644 --- a/muendliche-pruefung/muendliche-pruefung.typ +++ b/muendliche-pruefung/muendliche-pruefung.typ @@ -1,9 +1,9 @@ -#import "lib.typ": oral-exam, kind +#import "lib.typ": oral-exam, KIND #show: oral-exam.with( study: "", // Studiengang lecture: "", // Fach - kind: kind.none, // Prüfungsart (Wahlpflicht, Vertiefungsfach, Ergänzungsfach) + kind: KIND.NONE, // Prüfungsart KIND.{WAHLPFLICHT, VERTIEFUNGSFACH, ERGUENZUNGSFACH} date: datetime(year: 0, month: 1, day: 1), // Prüfungsdatum examiner: "", // PrüferIn (Prof) assistant: "", // BeisitzerIn