style(lib, pruefung): reduce redundancy by include bachelor.typ in lib

This commit is contained in:
orangerot 2025-09-08 14:13:40 +02:00
parent a81e16b3e7
commit d7aa0164e3
3 changed files with 228 additions and 153 deletions

View file

@ -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 \
] <kind>
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?]),
[ ],[ ],[ ],[ ],
[ ],[ ],[ ],[ ],
[ ],[ ],[ ],[ ],
[ ],[ ],[ ],[ ],
) <attendance>
#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.

View file

@ -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>: study
#show <lecture>: lecture
#show <date>: if date.year() > 0 {date.display("[day].[month].[year]")}
#show <examiner>: examiner
#show <assistant>: assistant
#show <grade_received>: if grade_received > 0.0 {str(grade_received+0.01).slice(0,3).replace(".",",")}
#show <grade_reasonable>: grade_reasonable
#show <exam_duration>: if exam_duration.minutes() > 0 [#exam_duration.minutes()]
#show <attendance_worth>: attendance_worth
#show <preparation_time>: preparation_time
#show <agreements>: agreements
#show <preparations>: it => [#it #preparations]
#show <examiner_behavior>: examiner_behavior
#show <examinee_behavior>: it => [#it #examinee_behavior]
#show <kind>: {
for exam_kind in KIND.values().filter(it => it != KIND.NONE) [
#radiobox(checked: kind == exam_kind) #exam_kind \
]
}
#show <examiner_recommendations>: [
#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 <attendance>: 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
]

View file

@ -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