diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f08278d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.pdf
\ No newline at end of file
diff --git a/res/svg/ABB.svg b/res/svg/ABB.svg
new file mode 100644
index 0000000..4f75516
--- /dev/null
+++ b/res/svg/ABB.svg
@@ -0,0 +1,66 @@
+
+
+
+
diff --git a/res/svg/DHBW.svg b/res/svg/DHBW.svg
new file mode 100644
index 0000000..66a81b8
--- /dev/null
+++ b/res/svg/DHBW.svg
@@ -0,0 +1,186 @@
+
+
+
+
diff --git a/src/info.yaml b/src/info.yaml
new file mode 100644
index 0000000..5da1db0
--- /dev/null
+++ b/src/info.yaml
@@ -0,0 +1,30 @@
+
+autor: Sven Vogel
+titel: Konfiguration & Integration von PROFINET
+untertitel: für die AC500 SPS
+typ: T2000
+semester: 3
+fakultät: Technik
+studiengang: Informationstechnik
+universität: DHBW Mannheim
+matrikelnummer: 1191225
+betrieb: ABB AG
+betreuer: Florian Miedniak
+abgabe: 20. März 2024
+bearbeitungszeitraum: 1. Januar 2024 - 20. März 2024
+stichwörter:
+ - informatik
+ - profinet
+
+# Berechent automatisch die Wochen Anzahl
+# Start- und Endzeit müssen im Format dd-mm-yyyy sein.
+arbeits-pakete:
+ - thema: Konfiguration des Stacks
+ start: 08.01.2024
+ ende: 31.01.2024
+ - thema: Integration in die Laufzeit
+ start: 01.02.2024
+ ende: 01.03.2024
+ - thema: Testen und Evaluation
+ start: 04.03.2024
+ ende: 20.03.2024
\ No newline at end of file
diff --git a/src/main.typ b/src/main.typ
new file mode 100644
index 0000000..be8378c
--- /dev/null
+++ b/src/main.typ
@@ -0,0 +1,73 @@
+
+// style text
+#set text(
+ ligatures: true,
+ size: 12pt // global font size
+)
+
+// page geometry
+#set page(
+ margin: (left: 3cm, right: 2cm, top: 2cm + 2em + 2em, bottom: 2cm),
+ paper: "a4",
+)
+
+#let info = yaml("info.yaml")
+
+// set PDF meta information
+#set document(
+ author: info.autor,
+ date: datetime.today(),
+ keywords: info.stichwörter
+)
+
+#include "pages/titel.typ"
+#include "pages/selbständigkeitserklärung.typ"
+#include "pages/sperrvermerk.typ"
+#include "pages/gender-hinweis.typ"
+#include "pages/übersicht-arbeitspakete.typ"
+
+#set page(
+ binding: left,
+ header-ascent: 2em,
+ header: locate(loc => {
+ align(right, counter(page).display("I."))
+ v(-0.75em)
+ line(length: 100%)
+ }),
+ footer: ""
+)
+
+// vorwort
+
+#outline(title: "Inhaltsverzeichnis")
+
+#pagebreak()
+
+#outline(
+ title: [Abbildungsverzeichnis],
+ target: figure.where(kind: image),
+)
+
+#pagebreak()
+
+#outline(
+ title: [Tabellensverzeichnis],
+ target: figure.where(kind: table),
+)
+
+#pagebreak()
+
+#outline(
+ title: [Quelltextverzeichnis],
+ target: figure.where(kind: raw),
+)
+
+#pagebreak()
+
+#set page(
+ header: locate(loc => {
+ align(right, counter(page).display("1."))
+ line(length: 100%)
+ }),
+ footer: ""
+)
diff --git a/src/pages/gender-hinweis.typ b/src/pages/gender-hinweis.typ
new file mode 100644
index 0000000..8592683
--- /dev/null
+++ b/src/pages/gender-hinweis.typ
@@ -0,0 +1,21 @@
+
+// load general information from YAML
+#let info = yaml("../info.yaml")
+
+#v(8em)
+
+// title
+#text(size: 2em, weight: "semibold", align(center, "Gender-Hinweis"))
+
+#v(3em)
+
+#set par(justify: true)
+
+#text(size: 1.25em)[
+ Zur besseren Lesbarkeit wird in dieser Hausarbeit das gene-
+ rische Maskulinum verwendet. Die in dieser Arbeit verwendeten
+ Personenbezeichnungen beziehen sich - sofern nicht anders kennt-
+ lich gemacht - auf alle Geschlechter.
+]
+
+#pagebreak()
diff --git a/src/pages/selbständigkeitserklärung.typ b/src/pages/selbständigkeitserklärung.typ
new file mode 100644
index 0000000..fac60d0
--- /dev/null
+++ b/src/pages/selbständigkeitserklärung.typ
@@ -0,0 +1,46 @@
+
+// load general information from YAML
+#let info = yaml("../info.yaml")
+
+#set align(center)
+
+// title
+#pad(top: 7em, text(size: 2em, weight: "semibold", "Selbständigkeitserklärung"))
+
+#pad(top: 7em, text(size: 1.25em)[
+ Ich versichere hiermit, dass ich meine #linebreak() Prüfung mit dem Thema
+])
+
+#pad(
+ top: 4em,
+ {
+ text(size: 1.5em, weight: "semibold", info.titel)
+ linebreak()
+ text(size: 1.5em, info.untertitel)
+ }
+)
+
+#pad(top: 6em, text(size: 1.5em)[
+ selbständig verfasst und keine anderen als die angegebenen
+ Quellen und Hilfsmittel benutzt habe. Ich versichere zudem, dass die
+ eingereichte elektronische Fassung mit der gedruckten Fassung
+ übereinstimmt.
+])
+
+#set align(bottom)
+
+#pad(
+ top: 3em,
+ grid(
+ // set width of columns
+ // we need two, so make both half the page width
+ columns: (50%, 50%),
+ row-gutter: 0.75em,
+ align(left, {line(length: 16em)}),
+ align(left, {line(length: 16em)}),
+ align(left, "Ort, Datum"),
+ align(left, "Unterschrift")
+ )
+)
+
+#pagebreak()
\ No newline at end of file
diff --git a/src/pages/sperrvermerk.typ b/src/pages/sperrvermerk.typ
new file mode 100644
index 0000000..2d80509
--- /dev/null
+++ b/src/pages/sperrvermerk.typ
@@ -0,0 +1,34 @@
+
+// load general information from YAML
+#let info = yaml("../info.yaml")
+
+#box(height: 7em)
+
+// title
+#text(size: 2em, weight: "semibold", align(center, "Sperrvermerk"))
+
+#box(height: 2em)
+
+#set par(justify: true)
+
+#text(size: 1.25em)[
+ Der Inhalt dieser Arbeit darf weder als Ganzes noch in
+ Auszügen Personen außerhalb des Prüfungsprozesses
+ und des Evaluationsverfahrens zugänglich gemacht werden,
+ sofern keine anders lautende Genehmigung der Ausbildungsstätte vorliegt.
+]
+
+#box(height: 7em)
+
+#grid(
+ // set width of columns
+ // we need two, so make both half the page width
+ columns: (50%, 50%),
+ row-gutter: 0.75em,
+ align(left, {line(length: 16em)}),
+ align(left, {line(length: 16em)}),
+ align(left, "Ort, Datum"),
+ align(left, "Unterschrift")
+)
+
+#pagebreak()
diff --git a/src/pages/titel.typ b/src/pages/titel.typ
new file mode 100644
index 0000000..bc2bd03
--- /dev/null
+++ b/src/pages/titel.typ
@@ -0,0 +1,88 @@
+
+// load general information from YAML
+#let info = yaml("../info.yaml")
+
+#set align(center)
+
+// logo of ABB and DHBW
+#pad(
+ top: 3em,
+ grid(
+ // set width of columns
+ // we need two, so make both half the page width
+ columns: (50%, 50%),
+ // left align logo of ABB
+ align(left, image("../../res/svg/ABB.svg", height: 35pt)),
+ // right align logo of DHBW
+ align(right, image("../../res/svg/DHBW.svg", height: 40pt))
+ )
+)
+
+// title
+#pad(top: 4em, text(size: 2em, weight: "semibold", info.titel))
+
+// subtitle
+#pad(top: 1em, text(size: 1.5em, info.untertitel))
+
+// subtitle
+#pad(top: 4em, text(size: 1.5em, weight: "bold", info.typ))
+
+// number of semester
+#pad(top: 2em)[
+ Praxisphase des #info.semester Studienjahrs
+]
+
+// fakulty
+#pad(top: 0.5em)[
+ an der Fakultät für #info.fakultät
+ #linebreak()
+ im Studiengang #info.studiengang
+]
+
+// university
+#pad(top: 1.5em)[
+ an der
+ #linebreak()
+ #info.universität
+]
+
+#set align(bottom + left)
+
+#table(
+ columns: 2,
+ align: left,
+ stroke: none,
+
+ "Verfasser:",
+ info.autor,
+
+ "Bearbeitungszeitraum:",
+ info.bearbeitungszeitraum,
+
+ "Matrikelnummer, Kurs:",
+ str(info.matrikelnummer) + ", " + info.studiengang,
+
+ "Ausbildungsbetrieb:",
+ info.betrieb,
+
+ "Betr. Betreuer:",
+ info.betreuer,
+
+ "Abgabedatum:",
+ info.abgabe
+)
+
+#pad(
+ top: 3em,
+ grid(
+ // set width of columns
+ // we need two, so make both half the page width
+ columns: (50%, 50%),
+ align(left, "Unterschrift des betrieblichen Betreuers"),
+ align(right, {line(length: 16em)})
+ )
+)
+
+#pagebreak()
+
+#counter(page).update(1)
diff --git a/src/pages/übersicht-arbeitspakete.typ b/src/pages/übersicht-arbeitspakete.typ
new file mode 100644
index 0000000..b6aab43
--- /dev/null
+++ b/src/pages/übersicht-arbeitspakete.typ
@@ -0,0 +1,34 @@
+
+#box(height: 7em)
+
+// title
+#text(size: 2em, weight: "semibold", align(center, "Übersicht Arbeitspakete"))
+
+#box(height: 5em)
+
+#let info = yaml("../info.yaml")
+
+#figure(
+ kind: table,
+ caption: "Übersicht Arbeitspakete",
+ table(
+ columns: 3,
+ align: right,
+ inset: 1em,
+ [*Thema*], [*Zeitraum*], [*Dauer (Wochen)*],
+ ..for packet in info.arbeits-pakete {
+
+ let start_split = packet.start.split(".")
+ let start = datetime(day: int(start_split.at(0)), month: int(start_split.at(1)), year: int(start_split.at(2)))
+
+ let end_split = packet.ende.split(".")
+ let end = datetime(day: int(end_split.at(0)), month: int(end_split.at(1)), year: int(end_split.at(2)))
+
+ let dur = end - start
+
+ (packet.thema, packet.start + " - " + packet.ende, str(calc.round(dur.weeks())))
+ }
+ )
+)
+
+#pagebreak()
\ No newline at end of file