Compare commits

...

5 Commits

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
5c09e20dc6 Add supplement for addendum 2025-09-11 16:53:41 +02:00
5cd21dd2cf Fix Outline Styles when using Figure sources 2025-09-10 08:35:21 +02:00

470
dhsn.typ
View File

@@ -1,228 +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(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 heading: none show regex("[\n,;.]? *Quelle:.*"): none
heading(numbering: none)[Anhangverzeichnis] show ref: none
} {
outline(title: "Anhangverzeichnis", target: selector(figure).after(here())) show heading: none
pagebreak() heading(numbering: none)[Anhangverzeichnis]
} }
outline(title: "Anhangverzeichnis", target: selector(figure).after(here()))
set figure(kind: raw, supplement: "Anhang") pagebreak()
counter(figure.where(kind: raw)).update(0) }
set figure(kind: raw, supplement: "Anhang")
[= Anhang <dhsn.addendum>] counter(figure.where(kind: raw)).update(0)
body
pagebreak() [= #supplement <dhsn.addendum>]
} body
#let dhsn( pagebreak()
topic: "Thema der Arbeit", } else {
subtitle: [Art der Arbeit], body
group: "0XY99-0", }
company-data: [Praxispartner GmbH \ 01234 Stadt], }
author: "Maxi Musterfrau", #let dhsn(
author_gender: none, topic: "Thema der Arbeit",
location: "Dresden", subtitle: [Art der Arbeit],
consultants: ( group: "0XY99-0",
( company-data: [Praxispartner GmbH \ 01234 Stadt],
gender: "M", author: "Maxi Musterfrau",
name: "Person Eins", author_gender: none,
), location: "Dresden",
( consultants: (
gender: "F", (
name: "Person Zwei", gender: "M",
), name: "Person Eins",
), ),
assignment-date: datetime.today(), (
submission-date: datetime.today(), gender: "F",
bib: none, name: "Person Zwei",
body, ),
) = { ),
// show figure.where(kind: table): set figure(kind: raw, supplement: "Anhang") assignment-date: datetime.today(),
set heading(numbering: (..nums) => nums.pos().map(str).join(".")) submission-date: datetime.today(),
bib: none,
set bibliography(style: "harvard-cite-them-right", title: "Literaturverzeichnis") body,
set cite(form: "prose") ) = {
show cite: c => { // show figure.where(kind: table): set figure(kind: raw, supplement: "Anhang")
show "ohne Datum": "o.D." set heading(numbering: (..nums) => nums.pos().map(str).join("."))
show regex("ohne Datum \D\)"): it => {
show ")": "])" set bibliography(style: "harvard-cite-them-right", title: "Literaturverzeichnis")
show "ohne Datum ": "o.D.[" set document(
it title: topic,
} author: author,
c description: [#subtitle],
} date: submission-date,
set text(size: 12pt, lang: "de", region: "de") )
set par(justify: true, leading: 1.2em) set cite(form: "prose")
show heading: set block(below: 1.2em) show cite: c => {
show figure: set par(leading: 0.8em) show "ohne Datum": "o.D."
show table: set par(leading: 0.8em) show regex("ohne Datum \D\)"): it => {
show raw: it => { show ")": "])"
if (it.lines.first().count > 1) { show "ohne Datum ": "o.D.["
set par(leading: 1em) it
it }
} else { c
it }
} set text(size: 12pt, lang: "de", region: "de")
} set par(justify: true, leading: 1.2em)
set page( show heading: set block(below: 1.2em)
margin: ( show figure: set par(leading: 0.8em)
top: 2cm, show figure.caption: set text(size: 10pt)
bottom: 2cm, show table: set par(leading: 0.8em)
left: 3cm, show raw: it => {
right: 2cm, if (it.lines.first().count > 1) {
), set par(leading: 1em)
footer: context [ it
#align(right)[#counter(page).display()] } else {
], it
) }
}
context [ set page(
#set page(footer: none, margin: (left: 2cm)) margin: (
#set text(size: 14pt) top: 2cm,
#set par(leading: (1 / 1.2) * 1em) bottom: 2cm,
#show heading.where(level: 1): it => { left: 3cm,
set text(size: 24pt) right: 2cm,
block(it.body) ),
} footer: context [
#grid( #align(right)[#counter(page).display()]
columns: (50%, 50%), ],
gutter: 5pt, )
align(left + bottom)[Duale Hochschule Sachsen\
Staatliche Studienakademie Dresden\ context [
#group], #set page(footer: none, margin: (left: 2cm))
align(right + bottom)[_Praxispartner:_\ #company-data], #set text(size: 14pt)
) #set par(leading: (1 / 1.2) * 1em)
#show heading.where(level: 1): it => {
set text(size: 24pt)
#align(center + horizon)[ block(it.body)
#block(width: 15cm, [#heading(level: 1, outlined: false, numbering: none)[#topic] }
#v(1.5cm) #grid(
#subtitle columns: (50%, 50%),
#v(1.5cm) gutter: 5pt,
eingereicht von:\ align(left + bottom)[Duale Hochschule Sachsen\
#author]) Staatliche Studienakademie Dresden\
] #group],
#align(bottom)[ align(right + bottom)[_Praxispartner:_\ #company-data],
#for c in consultants { )
if (c.keys().contains("gender") == false) {
[Gutachter/in: ]
} else if (c.gender == "M") { #align(center + horizon)[
[Gutachter: ] #block(width: 15cm, [#heading(level: 1, outlined: false, numbering: none)[#topic]
} else if (c.gender == "F") { #v(1.5cm)
[Gutachterin: ] #subtitle
} #v(1.5cm)
c.name eingereicht von:\
linebreak() #author])
} ]
#v(1cm) #align(bottom)[
Tag der Themenübergabe: #assignment-date.display("[day].[month].[year]") #for c in consultants {
if (c.keys().contains("gender") == false) {
Tag der Einreichung: #submission-date.display("[day].[month].[year]") [Gutachter/in: ]
#v(3cm) } else if (c.gender == "M") {
] [Gutachter: ]
#pagebreak() } else if (c.gender == "F") {
] [Gutachterin: ]
set page(numbering: (..nums) => numbering("I", counter(page).get().at(0))) }
c.name
{ linebreak()
show heading: none }
heading(numbering: none)[Inhaltsverzeichnis] #v(1cm)
} Tag der Themenübergabe: #assignment-date.display("[day].[month].[year]")
outline(indent: 0%)
Tag der Einreichung: #submission-date.display("[day].[month].[year]")
pagebreak() #v(3cm)
]
context { #pagebreak()
if query(selector(figure.where(kind: image).before(<dhsn.addendum>))).len() > 0 { ]
{ set page(numbering: (..nums) => numbering("I", counter(page).get().at(0)))
show heading: none
heading(numbering: none)[Abbildungsverzeichnis] {
} show heading: none
outline(title: "Abbildungsverzeichnis", target: selector(figure.where(kind: image)).before(<dhsn.addendum>)) heading(numbering: none)[Inhaltsverzeichnis]
} }
} outline(indent: 0%)
context {
if query(selector(figure.where(kind: table)).before(<dhsn.addendum>)).len() > 0 { pagebreak()
{
show heading: none context {
heading(numbering: none)[Tabellenverzeichnis] show regex("[\n,;.]? *Quelle:.*"): none
} show ref: none
outline(title: "Tabellenverzeichnis", target: selector(figure.where(kind: table)).before(<dhsn.addendum>)) if query(selector(figure.where(kind: image).before(<dhsn.addendum>))).len() > 0 {
} {
} show heading: none
context if ( heading(numbering: none)[Abbildungsverzeichnis]
query(selector(figure.where(kind: table).or(figure.where(kind: table))).before(<dhsn.addendum>)).len() > 0 }
) {
pagebreak() outline(title: "Abbildungsverzeichnis", target: selector(figure.where(kind: image)).before(<dhsn.addendum>))
} }
if query(selector(figure.where(kind: table)).before(<dhsn.addendum>)).len() > 0 {
context { {
if (acros.get() != none and acros.get().len() > 0) { show heading: none
{ heading(numbering: none)[Tabellenverzeichnis]
show heading: none }
heading(numbering: none)[Abkürzungsverzeichnis] outline(title: "Tabellenverzeichnis", target: selector(figure.where(kind: table)).before(<dhsn.addendum>))
} }
print-index(title: "Abkürzungsverzeichnis", row-gutter: 1.2em) if (
pagebreak() query(selector(figure.where(kind: table).or(figure.where(kind: table))).before(<dhsn.addendum>)).len() > 0
} ) {
} pagebreak()
counter(page).update(1) counter(footnote).update(0)
set page(numbering: (..nums) => numbering("1", counter(page).get().at(0))) }
}
body
{ context {
show "ohne Datum": "o.D." if (_acronyms.final() != none and _acronyms.final().len() > 0) {
show regex("ohne Datum \D\)"): it => { {
show ")": "])" show heading: none
show "ohne Datum ": "o.D.[" heading(numbering: none)[Abkürzungsverzeichnis]
it }
} print-index(title: "Abkürzungsverzeichnis", row-gutter: 1.2em)
show regex(`Zugegriffen\: \d+`.text): it => { pagebreak()
let day = str.replace(it.text, "Zugegriffen: ", "") }
"Abgerufen am " + day + "." }
} counter(page).update(1)
bib set page(numbering: (..nums) => numbering("1", counter(page).get().at(0)))
}
statement(location, submission-date, author_gender) body
} {
show "ohne Datum": "o.D."
show regex("ohne Datum \D\)"): it => {
show ")": "])"
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)
}