init project running
a scraper for jobs in the region with connected telegram bot to send my new jobs every day
This commit is contained in:
commit
fa4623b586
50 files changed
+1613
No files matched your search
@@ -0,0 +1,44 @@
|
||||
.DEFAULT_GOAL := help
|
||||
|
||||
.PHONY: help all coverletter cv watch watch-coverletter watch-cv clean
|
||||
|
||||
TYPST := typst
|
||||
TYPST_FLAGS := --font-path fonts
|
||||
BUILD_DIR := build
|
||||
|
||||
help:
|
||||
@echo "Verfügbare Befehle:"
|
||||
@echo " make all Anschreiben und Lebenslauf erzeugen"
|
||||
@echo " make coverletter Nur das Anschreiben erzeugen"
|
||||
@echo " make cv Nur den Lebenslauf erzeugen"
|
||||
@echo " make watch Beide Dokumente bei Änderungen neu bauen"
|
||||
@echo " make watch-coverletter Nur das Anschreiben überwachen"
|
||||
@echo " make watch-cv Nur den Lebenslauf überwachen"
|
||||
@echo " make clean Erzeugte PDFs entfernen"
|
||||
|
||||
all: coverletter cv
|
||||
|
||||
coverletter: $(BUILD_DIR)/coverletter.pdf
|
||||
|
||||
cv: $(BUILD_DIR)/cv.pdf
|
||||
|
||||
watch:
|
||||
@$(MAKE) --no-print-directory -j2 watch-coverletter watch-cv
|
||||
|
||||
watch-coverletter: | $(BUILD_DIR)
|
||||
$(TYPST) watch $(TYPST_FLAGS) coverletter.typ $(BUILD_DIR)/coverletter.pdf
|
||||
|
||||
watch-cv: | $(BUILD_DIR)
|
||||
$(TYPST) watch $(TYPST_FLAGS) cv.typ $(BUILD_DIR)/cv.pdf
|
||||
|
||||
$(BUILD_DIR):
|
||||
mkdir -p $@
|
||||
|
||||
$(BUILD_DIR)/coverletter.pdf: coverletter.typ personal.typ template.typ assets/signature.png | $(BUILD_DIR)
|
||||
$(TYPST) compile $(TYPST_FLAGS) coverletter.typ $@
|
||||
|
||||
$(BUILD_DIR)/cv.pdf: cv.typ personal.typ template.typ | $(BUILD_DIR)
|
||||
$(TYPST) compile $(TYPST_FLAGS) cv.typ $@
|
||||
|
||||
clean:
|
||||
rm -f $(BUILD_DIR)/coverletter.pdf $(BUILD_DIR)/cv.pdf
|
||||
@@ -0,0 +1,44 @@
|
||||
# Bewerbungsunterlagen in Typst
|
||||
|
||||
Dieser Ordner ist unabhängig von den LaTeX-Quellen im übergeordneten Projekt.
|
||||
Er enthält die Typst-Dokumente, die gemeinsame Vorlage, alle benötigten Schriften
|
||||
und die Unterschrift.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Typst 0.15 oder neuer
|
||||
- `make` (optional; die Typst-Befehle können auch direkt ausgeführt werden)
|
||||
|
||||
## PDFs bauen
|
||||
|
||||
Im Ordner `typst`:
|
||||
|
||||
```sh
|
||||
make all
|
||||
```
|
||||
|
||||
Die Ergebnisse liegen anschließend unter `build/coverletter.pdf` und
|
||||
`build/cv.pdf`.
|
||||
|
||||
Einzeln lassen sich die Dokumente mit `make coverletter` und `make cv` bauen.
|
||||
Ohne Make funktionieren auch diese Befehle:
|
||||
|
||||
```sh
|
||||
typst compile --font-path fonts coverletter.typ build/coverletter.pdf
|
||||
typst compile --font-path fonts cv.typ build/cv.pdf
|
||||
```
|
||||
|
||||
## Automatisch bei Änderungen bauen
|
||||
|
||||
Der Watch-Modus überwacht beide Dokumente einschließlich ihrer importierten
|
||||
Vorlagen und erzeugt die PDFs nach jeder gespeicherten Änderung neu:
|
||||
|
||||
```sh
|
||||
make watch
|
||||
```
|
||||
|
||||
Die Überwachung läuft, bis sie mit `Ctrl+C` beendet wird. Einzelne Dokumente
|
||||
lassen sich mit `make watch-coverletter` oder `make watch-cv` überwachen.
|
||||
|
||||
Gemeinsame Kontaktdaten werden in `personal.typ` gepflegt. Farben, Kopf- und
|
||||
Fußzeilen sowie wiederverwendbare CV-Komponenten stehen in `template.typ`.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 145 KiB |
@@ -0,0 +1,76 @@
|
||||
#import "personal.typ": person
|
||||
#import "template.typ": *
|
||||
|
||||
#set page(
|
||||
paper: "a4",
|
||||
margin: (left: 20mm, right: 20mm, top: 8mm, bottom: 16mm),
|
||||
footer: cover-footer(person),
|
||||
)
|
||||
|
||||
#show: document-base
|
||||
|
||||
#show link: set text(fill: accent)
|
||||
|
||||
#cover-header(person)
|
||||
|
||||
#v(11mm)
|
||||
|
||||
#grid(
|
||||
columns: (1fr, auto),
|
||||
align: (left, right),
|
||||
[
|
||||
#text(font: "Source Sans Pro", size: 11pt, weight: 700, fill: dark-ink)[
|
||||
TRICERA energy GmbH
|
||||
]
|
||||
#v(2pt)
|
||||
#text(font: "Source Sans Pro", size: 9pt, weight: 400, fill: gray-ink)[
|
||||
#smallcaps([Industriestraße 65\
|
||||
01129 Dresden])
|
||||
]
|
||||
],
|
||||
text(
|
||||
font: "Source Sans Pro",
|
||||
size: 9pt,
|
||||
weight: 300,
|
||||
style: "italic",
|
||||
fill: gray-ink,
|
||||
)[#today-de],
|
||||
)
|
||||
|
||||
#v(13mm)
|
||||
|
||||
#underline(
|
||||
offset: 5pt,
|
||||
text(font: "Source Sans Pro", size: 10pt, weight: 600, fill: dark-ink)[
|
||||
Bewerbung als Netzwerk-Ingenieur / -Techniker (m/w/d)
|
||||
],
|
||||
)
|
||||
|
||||
#v(6mm)
|
||||
|
||||
#set text(font: "Source Sans Pro", size: 10pt, weight: 300, fill: gray-ink)
|
||||
#set par(justify: false, leading: 0.7em)
|
||||
|
||||
Sehr geehrte Damen und Herren,
|
||||
|
||||
#v(2.5mm)
|
||||
|
||||
Batteriespeicher wie die von TRICERA machen erneuerbare Energie planbar – und brauchen dafür Netzwerkinfrastruktur, die sicher, redundant und sauber dokumentiert ist. An genau dieser Schnittstelle möchte ich arbeiten: technisch anspruchsvoll und zugleich unmittelbar wirksam für die Energiewende. Die ausgeschriebene Stelle verbindet beides mit meinem Werdegang.
|
||||
|
||||
Als Fachinformatiker für Systemintegration mit über 20 Jahren Berufserfahrung habe ich Systeme über alle Ebenen hinweg aufgebaut, betrieben und analysiert. In meiner aktuellen Rolle als Softwareentwickler betreue ich die Netzwerkanbindung und das Hosting unserer Anwendungen, den Betrieb von CI-Runnern und die Fehleranalyse über Anwendungs- und Systemgrenzen hinweg. Linux und die Shell sind dabei meine tägliche Arbeitsumgebung; privat betreibe ich Infrastruktur auf NixOS, FreeBSD und TrueNAS – mit Tailscale, Firewalls und automatisierten Backups.
|
||||
|
||||
Fachlich bin ich Ihrer Welt bereits begegnet: Ich habe die Anwendung #link("https://www.transnetbw.de/de/netzbooster-anwendung/")[„Netzbooster 360"] für TransnetBW entwickelt – die Visualisierung der Netzbooster-Pilotanlage in Kupferzell – sowie die virtuelle Führung durch das Umspannwerk Conneforde (TenneT). In #link("https://www.vrbits.de/#portfolio")[unserem Portfolio] finden sich zudem VR-Trainings für manuelle Schalthandlungen in Umspannwerken und Begehungen von Offshore-Trafostationen. Netzbetreiber, Umspannwerke und Batteriespeicher als Netzbooster sind mir dadurch konzeptionell vertraut – wenn auch bisher aus der Software- und nicht aus der Netzwerkperspektive.
|
||||
|
||||
Transparenz ist mir wichtig: Enterprise-Netzwerke dieser Größenordnung – große Routing- und Switching-Landschaften oder KRITIS-Umgebungen – habe ich bislang nicht verantwortet. Meine Netzwerkerfahrung stammt aus privater Infrastruktur und netzwerknahen Aufgaben im Beruf. Was ich mitbringe, sind solide TCP/IP-Grundlagen, IP-Adressierung, Firewalls und Zugriffsschutz sowie die Fähigkeit, mich selbstständig, gründlich und schnell in neue Systeme einzuarbeiten. VLAN-Segmentierung, Redundanzkonzepte und technische Dokumentation sind Themen, in die ich mich gezielt vertiefen möchte.
|
||||
|
||||
Für die ausgeschriebene Rolle bringe ich eine vergleichbare Qualifikation (Fachinformatiker für Systemintegration), fundierte Linux- und Shell-Kenntnisse sowie eine strukturierte, eigenständige Arbeitsweise mit. Deutsch ist meine Muttersprache, Englisch nutze ich täglich in Entwicklung und Dokumentation. Die Mischung aus etwa 90 % Büro- und 10 % Anlagentätigkeit entspricht genau meiner Vorstellung.
|
||||
|
||||
Mein frühestmöglicher Eintrittstermin ist der 1. Oktober 2026. Ich freue mich auf ein persönliches Gespräch, um mehr über Ihre Netzwerkinfrastruktur und die anstehenden Projekte zu erfahren.
|
||||
|
||||
#v(1mm)
|
||||
|
||||
Mit freundlichen Grüßen,
|
||||
|
||||
#v(1mm)
|
||||
|
||||
#image("assets/signature.png", width: 25mm)
|
||||
@@ -0,0 +1,191 @@
|
||||
#import "personal.typ": person
|
||||
#import "template.typ": *
|
||||
|
||||
#set page(
|
||||
paper: "a4",
|
||||
margin: (left: 14mm, right: 14mm, top: 8mm, bottom: 16mm),
|
||||
footer: cv-footer(person),
|
||||
)
|
||||
|
||||
#show: document-base
|
||||
#set par(leading: 0.56em)
|
||||
|
||||
#cv-header(person)
|
||||
|
||||
#section("Ber", "ufserfahrung")
|
||||
|
||||
#entry(
|
||||
"C# Developer & Software Engineer for Unity AR/VR",
|
||||
"vr-bits GmbH",
|
||||
"Leipzig",
|
||||
"seit 2019",
|
||||
(
|
||||
[Entwicklung und technische Betreuung von 20+ komplexen C\# Anwendungen mit Unity],
|
||||
[Integration und Kapselung von SDKs, Schnittstellen, Datenformaten, Paketen und externen Services],
|
||||
[Versions- und Paketpflege, technische Fehleranalyse, Performance-Optimierung und automatisierte Tests],
|
||||
[CI-Pipelines mit GitHub Actions und GameCI auf lokalen und Remote-Runnern für mehrere Zielplattformen],
|
||||
[Netzwerkanbindung und Hosting der Anwendungen inklusive Analyse von Problemen über Anwendungs- und Systemgrenzen hinweg],
|
||||
[XR-Anwendungen für Energiewirtschaft und Netzbetreiber, u. a. „Netzbooster 360" für TransnetBW und virtuelle Führung Umspannwerk Conneforde (TenneT)],
|
||||
[Client-Server-Kommunikation und plattformübergreifender Betrieb für Web-, Mobile-, Desktop- und XR-Systeme],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Freelance Full-Stack Developer",
|
||||
"Selbständig",
|
||||
"Dresden",
|
||||
"2017–2019",
|
||||
(
|
||||
[Shopware und andere E-Commerce und Warenwirtschaftssysteme auf Basis von PHP, JavaScript, MySQL],
|
||||
[Migration komplexer Systeme und Datenbanken],
|
||||
[Frontend-Entwicklung mit modernen JavaScript Frameworks],
|
||||
[IT-Beratung und Systemadministration],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Software-Qualitätssicherung – Webentwicklung",
|
||||
"MAGIX Development AG",
|
||||
"Dresden",
|
||||
"2006–2016",
|
||||
(
|
||||
[IT-Support und Systemadministration in heterogenen Arbeitsplatz- und Systemumgebungen],
|
||||
[Softwaretest, Qualitätssicherung und automatisierte Testentwicklung],
|
||||
[Strukturierte Fehleranalyse und serviceorientierte Unterstützung interner Anwender],
|
||||
[Inhouse Webentwicklungsprojekte],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Web Entwickler",
|
||||
"Nebenberuflich",
|
||||
"Dresden",
|
||||
"2012–2017",
|
||||
(
|
||||
[Entwicklung von E-Commerce- und Warenwirtschaftssystemen mit PHP, JavaScript und MySQL],
|
||||
[Responsive Design und Mobile-First Ansätze],
|
||||
[Datenbankdesign und -optimierung],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Server Support",
|
||||
"Compaq Computer Corporation",
|
||||
"München",
|
||||
"2001–2001",
|
||||
(
|
||||
[1st Level Server Support],
|
||||
[Technischer Support für Serverprodukte],
|
||||
),
|
||||
)
|
||||
|
||||
#section("Aus", "bildung")
|
||||
|
||||
#entry(
|
||||
"Fachinformatiker für Systemintegration",
|
||||
"BSZET Dresden / MAGIX GmbH",
|
||||
"Dresden",
|
||||
"2003–2006",
|
||||
(
|
||||
[Systemintegration und Anwendungsentwicklung],
|
||||
[Geschäftsprozesse],
|
||||
[Virtualisierung],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Technischer Assistent für Automatisierungs- und Computertechnik",
|
||||
"Berufliches Schulzentrum Weißwasser",
|
||||
"Weißwasser",
|
||||
"1997–2000",
|
||||
(
|
||||
[Grundlagen der Rechentechnik, Mess- und Regelungstechnik],
|
||||
[Programmierung und Automatisierungstechnik],
|
||||
[Hardware- und Softwareentwicklung],
|
||||
[CAD],
|
||||
),
|
||||
)
|
||||
|
||||
#pagebreak()
|
||||
#cv-header(person)
|
||||
|
||||
#section("Tec", "hnische Kenntnisse")
|
||||
|
||||
#skills[
|
||||
#skill("Serveradministration", [Linux, NixOS/Nix, systemd, Docker/Compose, nginx, Nextcloud, Cockpit, POSIX Shell, Bash, PowerShell])
|
||||
#skill("Speicher & Backup", [ZFS, Samba/SMB, Restic, rsync/SSH, SFTP, VeraCrypt, Robocopy, PostgreSQL-/MySQL-Dumps])
|
||||
#skill("Netzwerk & Sicherheit", [TCP/IP, IP-Adressierung, Firewalls, OpenSSH, Tailscale/VPN, HTTPS/ACME, SMB-Signierung, Schlüsselverwaltung])
|
||||
#skill("Betriebssysteme", [Debian, Fedora, NixOS, FreeBSD, CentOS, Windows, macOS])
|
||||
#skill("Automation & Betrieb", [Updates, Wartung, Logging, Fehlerbehandlung, Backup/Restore, CI/CD, GitHub Actions, GameCI])
|
||||
#skill("Programmierung", [C\#, Python, JavaScript/TypeScript, PHP, SQL, Shell, HTML/CSS, REST APIs, JSON, XML])
|
||||
#skill("Qualität & Methoden", [Git, TDD, NUnit, Moq, Pytest, automatisierte Tests, Jira, Scrum, technische Dokumentation])
|
||||
#skill("Anwendungsentwicklung", [Unity/C\#, Django, Webanwendungen, Datenbanken, Schnittstellenintegration, plattformübergreifende Systeme])
|
||||
]
|
||||
|
||||
#section("Eng", "agement & Mentoring")
|
||||
|
||||
#entry(
|
||||
"Mentor & Jury-Mitglied",
|
||||
"Jugend hackt Dresden",
|
||||
"Dresden",
|
||||
"seit 2015",
|
||||
(
|
||||
[Betreuung von Jugendlichen bei Coding-Projekten],
|
||||
[Jury-Tätigkeit bei Hackathons],
|
||||
[Förderung von IT-Nachwuchs],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Dozent & Workshop-Leiter",
|
||||
"Chaos macht Schule",
|
||||
"Sachsen",
|
||||
"2014–2018",
|
||||
(
|
||||
[IT-Workshops an Schulen durchgeführt],
|
||||
[Aufklärung über Datenschutz und IT-Sicherheit],
|
||||
[Praktische Programmier-Workshops für Schüler],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Open Source Förderung",
|
||||
"VISOR – Prototype Fund Project",
|
||||
"Berlin",
|
||||
"2017–2018",
|
||||
(
|
||||
[Hauptentwicklung und Projektkoordination eines BMBF-geförderten Civic-Tech-Projekts],
|
||||
[Webtool und offener Datenstandard für digitale Partizipation in Stadtentwicklungsprozessen],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Lead",
|
||||
"Open Data Dresden",
|
||||
"Dresden",
|
||||
"2014–2021",
|
||||
(
|
||||
[Treffen, Aktionen, Veranstaltungen, Software pro Open Data in Dresden],
|
||||
[Gründung eines Open-Data-Labs mit der Open Knowledge Foundation],
|
||||
),
|
||||
)
|
||||
|
||||
#entry(
|
||||
"Speaker",
|
||||
"Web Montag Dresden, CCC Veranstaltungen",
|
||||
"Dresden",
|
||||
"2012–2019",
|
||||
(
|
||||
[Vorträge zu Webentwicklung und IT-Trends],
|
||||
[Wissensaustausch in der Developer-Community],
|
||||
),
|
||||
)
|
||||
|
||||
#section("Per", "sönliches")
|
||||
|
||||
#set text(font: "Source Sans Pro", size: 9pt, weight: 300, fill: ink)
|
||||
Als begeisterter Autodidakt erschließe ich mir kontinuierlich neue Technologien. Ich arbeite gewissenhaft, selbstständig und eigenverantwortlich und behalte dabei Wartbarkeit, Sicherheit und einen zuverlässigen Betrieb im Blick.
|
||||
|
||||
Im Team kommuniziere ich offen, respektvoll und verständlich. Den fachlichen Austausch und unterschiedliche Perspektiven nutze ich gern, um tragfähige Lösungen für komplexe technische Fragestellungen zu entwickeln.
|
||||
|
||||
Mein Ziel ist es, diese Erfahrung dort einzusetzen, wo sie zur Energiewende beiträgt – etwa in der Netzwerk- und IT-Infrastruktur von Batteriespeichersystemen.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,12 @@
|
||||
// Gemeinsame Stammdaten für Anschreiben und Lebenslauf.
|
||||
#let person = (
|
||||
first: "Robert",
|
||||
last: "Wartenberg",
|
||||
position: "Software Engineering · Systemintegration · Automatisierung",
|
||||
street: "Robert-Matzke-Straße 43",
|
||||
city: "01127 Dresden",
|
||||
mobile: "(+49) 152 085 166 33",
|
||||
email: "rw@boogiedev.net",
|
||||
github: "RobTranquillo",
|
||||
xing: "Robert_Wartenberg",
|
||||
)
|
||||
@@ -0,0 +1,175 @@
|
||||
// Gemeinsames, eigenständiges Layout für beide Bewerbungsdokumente.
|
||||
#let accent = rgb("#0395de")
|
||||
#let ink = rgb("#333333")
|
||||
#let dark-ink = rgb("#414141")
|
||||
#let gray-ink = rgb("#3a3a5d")
|
||||
#let rule-ink = rgb("#5d5d5d")
|
||||
#let pale = rgb("#999999")
|
||||
|
||||
#let today = datetime.today()
|
||||
#let month-names = (
|
||||
"Januar", "Februar", "März", "April", "Mai", "Juni",
|
||||
"Juli", "August", "September", "Oktober", "November", "Dezember",
|
||||
)
|
||||
#let today-de = (
|
||||
str(today.day()) + ". " + month-names.at(today.month() - 1) +
|
||||
" " + str(today.year())
|
||||
)
|
||||
|
||||
#let document-base(body) = {
|
||||
set text(font: "Source Sans Pro", lang: "de", size: 9pt, weight: 300, fill: ink)
|
||||
set par(leading: 0.48em)
|
||||
body
|
||||
}
|
||||
|
||||
#let name-mark(
|
||||
person,
|
||||
size: 22pt,
|
||||
family: "Roboto",
|
||||
first-weight: 100,
|
||||
first-smallcaps: false,
|
||||
) = [
|
||||
#text(font: family, size: size, weight: first-weight, fill: gray-ink)[
|
||||
#if first-smallcaps { smallcaps(person.first) } else { person.first }
|
||||
]#h(3pt)#text(font: family, size: size, weight: 700, fill: ink)[#person.last]
|
||||
]
|
||||
|
||||
#let fa(glyph) = text(font: "FontAwesome", size: 0.95em)[#glyph]
|
||||
|
||||
#let cover-header(person) = block(width: 100%)[
|
||||
#align(center)[
|
||||
#name-mark(person, size: 32pt)
|
||||
#v(1pt)
|
||||
#text(font: "Source Sans Pro", size: 7.6pt, weight: 400, fill: accent)[
|
||||
#smallcaps(person.position)
|
||||
]
|
||||
#v(2pt)
|
||||
#text(font: "Roboto", size: 8pt, weight: 400, style: "italic", fill: pale)[
|
||||
#person.street, #person.city
|
||||
]
|
||||
#v(3pt)
|
||||
#text(font: "Roboto", size: 6.8pt, weight: 400, fill: ink)[
|
||||
#fa("\u{f10b}") #person.mobile #h(7pt)|#h(7pt)
|
||||
#fa("\u{f0e0}") #person.email #h(7pt)|#h(7pt)
|
||||
#fa("\u{f092}") #person.github #h(7pt)|#h(7pt)
|
||||
#fa("\u{f169}") #person.xing
|
||||
]
|
||||
]
|
||||
]
|
||||
|
||||
#let cv-header(person) = block(width: 100%, below: 33pt)[
|
||||
#grid(
|
||||
columns: (1fr, 1.8fr, 1fr),
|
||||
column-gutter: 6pt,
|
||||
align: (left, center, right),
|
||||
[
|
||||
#text(font: "Roboto", size: 8pt, weight: 400, style: "italic", fill: pale)[
|
||||
#person.street\
|
||||
#person.city
|
||||
]
|
||||
],
|
||||
align(center)[
|
||||
#name-mark(
|
||||
person,
|
||||
family: "Source Sans Pro",
|
||||
first-weight: 400,
|
||||
first-smallcaps: true,
|
||||
)
|
||||
#v(2pt)
|
||||
#text(font: "Source Sans Pro", size: 7.6pt, weight: 400, fill: accent)[
|
||||
#smallcaps("Lebenslauf")
|
||||
]
|
||||
],
|
||||
[
|
||||
#text(font: "Roboto", size: 6.8pt, weight: 400, fill: ink)[
|
||||
#fa("\u{f10b}") #person.mobile\
|
||||
#fa("\u{f0e0}") #person.email\
|
||||
#fa("\u{f169}") #person.xing\
|
||||
#fa("\u{f092}") #person.github
|
||||
]
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
#let cv-footer(person) = context grid(
|
||||
columns: (1fr, 1fr, 1fr),
|
||||
align: (left, center, right),
|
||||
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: pale)[#smallcaps(today-de)],
|
||||
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: pale)[
|
||||
#smallcaps(person.first + " " + person.last + " · Lebenslauf")
|
||||
],
|
||||
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: pale)[#counter(page).display()],
|
||||
)
|
||||
|
||||
#let cover-footer(person) = align(center)[
|
||||
#text(font: "Source Sans Pro", size: 8pt, fill: pale, weight: 400)[
|
||||
#smallcaps(person.first + " " + person.last)
|
||||
]
|
||||
]
|
||||
|
||||
#let section(accent-part, rest) = block(
|
||||
width: 100%,
|
||||
above: 8pt,
|
||||
below: 5pt,
|
||||
breakable: false,
|
||||
)[
|
||||
#grid(
|
||||
columns: (auto, 1fr),
|
||||
column-gutter: 2pt,
|
||||
align: horizon,
|
||||
text(font: "Source Sans Pro", size: 16pt, weight: 700)[
|
||||
#text(fill: accent)[#accent-part]#text(fill: ink)[#rest]
|
||||
],
|
||||
line(length: 100%, stroke: 0.9pt + rule-ink),
|
||||
)
|
||||
]
|
||||
|
||||
#let bullet-list(items) = {
|
||||
for item in items {
|
||||
block(width: 100%)[
|
||||
#grid(
|
||||
columns: (7pt, 1fr),
|
||||
column-gutter: 1pt,
|
||||
[•],
|
||||
item,
|
||||
)
|
||||
]
|
||||
v(-5pt)
|
||||
}
|
||||
}
|
||||
|
||||
#let entry(role, organization, location, period, items) = block(
|
||||
width: 100%,
|
||||
above: 15pt,
|
||||
below: 18pt,
|
||||
breakable: false,
|
||||
)[
|
||||
#grid(
|
||||
columns: (1fr, auto),
|
||||
column-gutter: 8pt,
|
||||
row-gutter: 9pt,
|
||||
text(font: "Source Sans Pro", size: 10pt, weight: 700, fill: dark-ink)[#organization],
|
||||
text(font: "Source Sans Pro", size: 9pt, weight: 300, style: "italic", fill: accent)[#location],
|
||||
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: gray-ink)[#smallcaps(role)],
|
||||
text(font: "Source Sans Pro", size: 8pt, weight: 300, style: "italic", fill: gray-ink)[#period],
|
||||
)
|
||||
#parbreak()
|
||||
#v(1pt)
|
||||
#block(width: 100%)[
|
||||
#text(font: "Source Sans Pro", size: 9pt, weight: 300, fill: ink)[#bullet-list(items)]
|
||||
]
|
||||
]
|
||||
|
||||
#let skills(body, above: 16pt, below: 12pt) = block(
|
||||
width: 100%,
|
||||
inset: (top: above, bottom: below),
|
||||
body,
|
||||
)
|
||||
|
||||
#let skill(label, value) = grid(
|
||||
columns: (45mm, 1fr),
|
||||
column-gutter: 5mm,
|
||||
align: (right, left),
|
||||
text(font: "Source Sans Pro", size: 10pt, weight: 700, fill: dark-ink)[#label],
|
||||
text(font: "Source Sans Pro", size: 9pt, weight: 300, fill: ink)[#value],
|
||||
)
|
||||
Reference in new issue
Block a user