Compare commits

3 Commits
ieee ... main

Author SHA1 Message Date
16ab666f74 Bump acrostiche to v0.7.0 2026-03-04 21:29:18 +01:00
7bc2ba0c33 backport addendum-index fix 2026-02-24 08:06:21 +01:00
78966cecde backport/update dependencies 2026-02-12 08:01:12 +01:00

475
dhsn.typ
View File

@@ -1,233 +1,242 @@
#import "@preview/acrostiche:0.6.0": * #import "@preview/acrostiche:0.7.0": *
#let statement(location, submission-date, gender) = context [ #let statement(location, submission-date, gender) = context [
#pagebreak() #pagebreak()
#set heading(numbering: none) #set heading(numbering: none)
#set page(footer: none, numbering: none) #set page(footer: none, numbering: none)
= Eidesstattliche Erklärung = Eidesstattliche Erklärung
Ich erkläre an Eides statt, dass ich die vorliegende Arbeit Ich erkläre an Eides statt, dass ich die vorliegende Arbeit
selbständig und ohne unerlaubte fremde Hilfe angefertigt, andere als selbständig und ohne unerlaubte fremde Hilfe angefertigt, andere als
die angegebenen Quellen und Hilfsmittel nicht benutzt habe. Die aus die angegebenen Quellen und Hilfsmittel nicht benutzt habe. Die aus
fremden Quellen direkt oder indirekt übernommenen Stellen sind als fremden Quellen direkt oder indirekt übernommenen Stellen sind als
solche kenntlich gemacht.\ solche kenntlich gemacht.\
Die Zustimmung des Partnerunternehmens in der Praxis zur Verwendung betrieblicher Unterlagen habe ich eingeholt.\ Die Zustimmung des Partnerunternehmens in der Praxis zur Verwendung betrieblicher Unterlagen habe ich eingeholt.\
Die Arbeit wurde bisher in gleicher oder ähnlicher Form keiner anderen Die Arbeit wurde bisher in gleicher oder ähnlicher Form keiner anderen
Prüfungsbehörde vorgelegt und auch nicht veröffentlicht. Prüfungsbehörde vorgelegt und auch nicht veröffentlicht.
#v(1.5cm) #v(1.5cm)
#grid( #grid(
column-gutter: 1cm, column-gutter: 1cm,
columns: (50%, 50%), columns: (50%, 50%),
row-gutter: 10pt, row-gutter: 10pt,
[#location, #submission-date.display("[day].[month].[year]")], align(bottom, line(length: 6cm, stroke: 0.75pt)), [#location, #submission-date.display("[day].[month].[year]")], align(bottom, line(length: 6cm, stroke: 0.75pt)),
[], [],
( (
if gender == none { if gender == none {
[Unterschrift des Verfassers] [Unterschrift des Verfassers]
} else if (gender == "M") { } else if (gender == "M") {
[Unterschrift des Verfassers] [Unterschrift des Verfassers]
} else if (gender == "F") { } else if (gender == "F") {
[Unterschrift der Verfasserin] [Unterschrift der Verfasserin]
} }
), ),
) )
] ]
#let addendum(supplement: "Anhang", body) = { #let addendum(supplement: "Anhang", body) = {
pagebreak() pagebreak()
counter(heading).update(0) counter(heading).update(0)
set heading(numbering: none) set heading(numbering: none)
context if query(selector(figure).after(here())).len() > 0 { context if query(selector(figure).after(here())).len() > 0 {
show regex("[\n,;.]? *Quelle:.*"): none {
show ref: none show regex("[\n,;.]? *Quelle:.*"): none
{ show ref: none
show heading: none {
heading(numbering: none)[Anhangverzeichnis] show heading: none
} heading(numbering: none)[Anhangverzeichnis]
outline(title: "Anhangverzeichnis", target: selector(figure).after(here())) }
pagebreak() outline(title: "Anhangverzeichnis", target: selector(figure).after(here()))
} pagebreak()
}
set figure(kind: raw, supplement: "Anhang") set figure(kind: raw, supplement: "Anhang")
counter(figure.where(kind: raw)).update(0) counter(figure.where(kind: raw)).update(0)
[= #supplement <dhsn.addendum>] [= #supplement <dhsn.addendum>]
body body
pagebreak() pagebreak()
} } else {
#let dhsn( body
topic: "Thema der Arbeit", }
subtitle: [Art der Arbeit], }
group: "0XY99-0", #let dhsn(
company-data: [Praxispartner GmbH \ 01234 Stadt], topic: "Thema der Arbeit",
author: "Maxi Musterfrau", subtitle: [Art der Arbeit],
author_gender: none, group: "0XY99-0",
location: "Dresden", company-data: [Praxispartner GmbH \ 01234 Stadt],
consultants: ( author: "Maxi Musterfrau",
( author_gender: none,
gender: "M", location: "Dresden",
name: "Person Eins", consultants: (
), (
( gender: "M",
gender: "F", name: "Person Eins",
name: "Person Zwei", ),
), (
), gender: "F",
assignment-date: datetime.today(), name: "Person Zwei",
submission-date: datetime.today(), ),
bib: none, ),
body, assignment-date: datetime.today(),
) = { submission-date: datetime.today(),
// show figure.where(kind: table): set figure(kind: raw, supplement: "Anhang") bib: none,
set heading(numbering: (..nums) => nums.pos().map(str).join(".")) body,
) = {
set bibliography(style: "harvard-cite-them-right", title: "Literaturverzeichnis") // show figure.where(kind: table): set figure(kind: raw, supplement: "Anhang")
set cite(form: "prose") set heading(numbering: (..nums) => nums.pos().map(str).join("."))
show cite: c => {
show "ohne Datum": "o.D." set bibliography(style: "harvard-cite-them-right", title: "Literaturverzeichnis")
show regex("ohne Datum \D\)"): it => { set document(
show ")": "])" title: topic,
show "ohne Datum ": "o.D.[" author: author,
it description: [#subtitle],
} date: submission-date,
c )
} set cite(form: "prose")
set text(size: 12pt, lang: "de", region: "de") show cite: c => {
set par(justify: true, leading: 1.2em) show "ohne Datum": "o.D."
show heading: set block(below: 1.2em) show regex("ohne Datum \D\)"): it => {
show figure: set par(leading: 0.8em) show ")": "])"
show figure.caption: set text(size: 10pt) show "ohne Datum ": "o.D.["
show table: set par(leading: 0.8em) it
show raw: it => { }
if (it.lines.first().count > 1) { c
set par(leading: 1em) }
it set text(size: 12pt, lang: "de", region: "de")
} else { set par(justify: true, leading: 1.2em)
it show heading: set block(below: 1.2em)
} show figure: set par(leading: 0.8em)
} show figure.caption: set text(size: 10pt)
set page( show table: set par(leading: 0.8em)
margin: ( show raw: it => {
top: 2cm, if (it.lines.first().count > 1) {
bottom: 2cm, set par(leading: 1em)
left: 3cm, it
right: 2cm, } else {
), it
footer: context [ }
#align(right)[#counter(page).display()] }
], set page(
) margin: (
top: 2cm,
context [ bottom: 2cm,
#set page(footer: none, margin: (left: 2cm)) left: 3cm,
#set text(size: 14pt) right: 2cm,
#set par(leading: (1 / 1.2) * 1em) ),
#show heading.where(level: 1): it => { footer: context [
set text(size: 24pt) #align(right)[#counter(page).display()]
block(it.body) ],
} )
#grid(
columns: (50%, 50%), context [
gutter: 5pt, #set page(footer: none, margin: (left: 2cm))
align(left + bottom)[Duale Hochschule Sachsen\ #set text(size: 14pt)
Staatliche Studienakademie Dresden\ #set par(leading: (1 / 1.2) * 1em)
#group], #show heading.where(level: 1): it => {
align(right + bottom)[_Praxispartner:_\ #company-data], set text(size: 24pt)
) block(it.body)
}
#grid(
#align(center + horizon)[ columns: (50%, 50%),
#block(width: 15cm, [#heading(level: 1, outlined: false, numbering: none)[#topic] gutter: 5pt,
#v(1.5cm) align(left + bottom)[Duale Hochschule Sachsen\
#subtitle Staatliche Studienakademie Dresden\
#v(1.5cm) #group],
eingereicht von:\ align(right + bottom)[_Praxispartner:_\ #company-data],
#author]) )
]
#align(bottom)[
#for c in consultants { #align(center + horizon)[
if (c.keys().contains("gender") == false) { #block(width: 15cm, [#heading(level: 1, outlined: false, numbering: none)[#topic]
[Gutachter/in: ] #v(1.5cm)
} else if (c.gender == "M") { #subtitle
[Gutachter: ] #v(1.5cm)
} else if (c.gender == "F") { eingereicht von:\
[Gutachterin: ] #author])
} ]
c.name #align(bottom)[
linebreak() #for c in consultants {
} if (c.keys().contains("gender") == false) {
#v(1cm) [Gutachter/in: ]
Tag der Themenübergabe: #assignment-date.display("[day].[month].[year]") } else if (c.gender == "M") {
[Gutachter: ]
Tag der Einreichung: #submission-date.display("[day].[month].[year]") } else if (c.gender == "F") {
#v(3cm) [Gutachterin: ]
] }
#pagebreak() c.name
] linebreak()
set page(numbering: (..nums) => numbering("I", counter(page).get().at(0))) }
#v(1cm)
{ Tag der Themenübergabe: #assignment-date.display("[day].[month].[year]")
show heading: none
heading(numbering: none)[Inhaltsverzeichnis] Tag der Einreichung: #submission-date.display("[day].[month].[year]")
} #v(3cm)
outline(indent: 0%) ]
#pagebreak()
pagebreak() ]
set page(numbering: (..nums) => numbering("I", counter(page).get().at(0)))
context {
show regex("[\n,;.]? *Quelle:.*"): none {
show ref: none show heading: none
if query(selector(figure.where(kind: image).before(<dhsn.addendum>))).len() > 0 { heading(numbering: none)[Inhaltsverzeichnis]
{ }
show heading: none outline(indent: 0%)
heading(numbering: none)[Abbildungsverzeichnis]
} pagebreak()
outline(title: "Abbildungsverzeichnis", target: selector(figure.where(kind: image)).before(<dhsn.addendum>)) context {
} show regex("[\n,;.]? *Quelle:.*"): none
if query(selector(figure.where(kind: table)).before(<dhsn.addendum>)).len() > 0 { show ref: none
{ if query(selector(figure.where(kind: image).before(<dhsn.addendum>))).len() > 0 {
show heading: none {
heading(numbering: none)[Tabellenverzeichnis] show heading: none
} heading(numbering: none)[Abbildungsverzeichnis]
outline(title: "Tabellenverzeichnis", target: selector(figure.where(kind: table)).before(<dhsn.addendum>)) }
}
if ( outline(title: "Abbildungsverzeichnis", target: selector(figure.where(kind: image)).before(<dhsn.addendum>))
query(selector(figure.where(kind: table).or(figure.where(kind: table))).before(<dhsn.addendum>)).len() > 0 }
) { if query(selector(figure.where(kind: table)).before(<dhsn.addendum>)).len() > 0 {
pagebreak() {
counter(footnote).update(0) show heading: none
} heading(numbering: none)[Tabellenverzeichnis]
} }
outline(title: "Tabellenverzeichnis", target: selector(figure.where(kind: table)).before(<dhsn.addendum>))
context { }
if (acros.get() != none and acros.get().len() > 0) { if (
{ query(selector(figure.where(kind: table).or(figure.where(kind: table))).before(<dhsn.addendum>)).len() > 0
show heading: none ) {
heading(numbering: none)[Abkürzungsverzeichnis] pagebreak()
} counter(footnote).update(0)
print-index(title: "Abkürzungsverzeichnis", row-gutter: 1.2em) }
pagebreak() }
}
} context {
counter(page).update(1) if (_acronyms.final() != none and _acronyms.final().len() > 0) {
set page(numbering: (..nums) => numbering("1", counter(page).get().at(0))) {
show heading: none
body heading(numbering: none)[Abkürzungsverzeichnis]
{ }
show "ohne Datum": "o.D." print-index(title: "Abkürzungsverzeichnis", row-gutter: 1.2em)
show regex("ohne Datum \D\)"): it => { pagebreak()
show ")": "])" }
show "ohne Datum ": "o.D.[" }
it counter(page).update(1)
} set page(numbering: (..nums) => numbering("1", counter(page).get().at(0)))
show regex(`Zugegriffen\: \d+`.text): it => {
let day = str.replace(it.text, "Zugegriffen: ", "") body
"Abgerufen am " + day + "." {
} show "ohne Datum": "o.D."
bib show regex("ohne Datum \D\)"): it => {
} show ")": "])"
statement(location, submission-date, author_gender) show "ohne Datum ": "o.D.["
} it
}
show regex(`Zugegriffen\: \d+`.text): it => {
let day = str.replace(it.text, "Zugegriffen: ", "")
"Abgerufen am " + day + "."
}
bib
}
statement(location, submission-date, author_gender)
}