Compare commits

...

10 commits

Author SHA1 Message Date
f6730e38ce
Update summary texts 2024-09-19 17:31:55 +02:00
7a503d61fb
Allow setting sidebar or not for cv 2024-09-19 17:21:03 +02:00
f19fd2540c
Add resume with sidebar style 2024-09-19 17:15:45 +02:00
097cd1263d
Decouple languages from skills
Both retain the same yaml structure but are not tightly coupled anymore
(like volunteering before).
2024-09-17 17:52:09 +02:00
5df8458b72
Add sidebar to document 2024-09-17 17:50:30 +02:00
43549c1f53
Fix master thesis german translation 2024-09-17 15:57:08 +02:00
e53d5ca386
Refactor typst cv generation to make use of generalized entries 2024-09-15 17:56:18 +02:00
d518eb9087
Extract volunteering from qualifications
They deserve their own sections, now that I have volunteered for over a
year.
2024-09-15 17:55:55 +02:00
25d9e7ce13
Rename thesis and education to title and place
To fit the generalized entry scheme. The only issue I have is to have
the actual 'title' of the thesis in the 'place' field which feels very
unwieldy.
2024-09-15 17:55:12 +02:00
698ef628b2
Rename client to place in work experience
To start generalizing cv entries, since every 'work' has a place,
whether it is a client or not.
2024-09-15 17:53:40 +02:00
3 changed files with 696 additions and 268 deletions

View file

@ -15,39 +15,31 @@ about:
- text: github.com/marty-oehme
icon:
link: https://github.com/marty-oehme
summary:
de: | # FIXME: Update from English summary below
Ich habe im September 2021 das EU-geförderte European Master of Global Studies Studienprogramm absolviert,
mit dem Schwerpunkt globale Prozesse der Raumaneignung, Nationenbildung und narrativer Ideologien.
de: |
Seit dem Abschluss des EU-geförderten European Master of Global Studies Erasmus Mundus Programms im Jahr 2021 habe ich als selbstständiger Forschungsberater gearbeitet und mich auf Prozesse der Ungleichheit und der Armutsreduktion, sowie deren räumliche Dimensionierung und kollektive Organisation konzentriert, hauptsächlich betrachtet durch das Prisma der Arbeitsmarktpolitik.
Seitdem habe ich die Produktion verschiedener Entwicklungs-Forschungsliteratur unterstützt,
mit einem Fokus auf Arbeitsmarktpolitiken, ihren Auswirkungen auf Armut und kollektive Organisation,
sowie multi-dimensionaler Ungleichheitsreduktion.
Ich besitze ein breites Spektrum an Fähigkeiten in Datenerfassung, -organisation und -analyse,
Manuskriptbearbeitung und Literaturverwaltung,
und konnte erste Einblicke in Veranstaltungsmanagement, Lehrassistenz, Website-verwaltung und -inhaltserstellung gewinnen.
Der Rahmen meiner akademischen Arbeit erstreckt sich über Entwicklungsstudien, sozialen Schutz, Öko-Tourismus, und Arbeitsmarktstudien.
Abseits meiner professionellen Tätigkeiten interessiere ich mich für,
und befürworte aktiv,
die Produktion von freier und offener Software sowie
die Schaffung von Bedingungen für eine offene und barrierefreie Wissensproduktion.
Durch die Erstellung der entwickelnden Forschungsliteratur habe ich ein breites Spektrum an Fähigkeiten im Bereich der Datenerfassung, Organisation und Visualisierung entwickelt, sowie Erfahrungen in Manuskriptbearbeitung und Referenzmanagement erworben. Zusätzlich habe ich Einblicke in Event Management, Lehrassistentenarbeit, Content Creation, Systemadministration und Website-Management gewonnen. Jenseits meines beruflichen Engagements fördere ich den Aufbau freier und offener Software und Offener Wissenschaft ohne Barrieren.
Ich bin offen für Gelegenheiten, die meine Expertise in diesen Bereichen vertiefen, jedoch auch für solche, die meine Kenntnisbereiche erweitern.
en: |
Since graduating from the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant analyzing processes inequality and poverty reduction, spatialization and collective organization, primarily through the lens of labour market policies.
Since completing the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant focused on processes of inequality and poverty reduction, spatialization and collective organization, primarily through the lens of labour market policies.
Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. In addition to research skills, I have gotten insights into event management, teaching assistance, content creation, system administration and website management. Aside from professional work I foster the development of free and open software and barrier-free and open science.
Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. Additionally, I have gained insights into event management, teaching assistance, content creation, system administration and website management. Beyond professional work I foster the development of free and open software and open science without barriers.
I am always happy to receive opportunities to further my in-depth expertise in these topics, in addition to a broad range of applicable skills.
I welcome opportunities to deepen my expertise in these topics, in addition to those expanding my range of applicable skills.
experience:
- date:
de: 2024
en: 2024
title:
de: Co-Autor, Formalisierung und sozialer Schutz, World Development
en: Co-Author, Formalization and social protection, World Development
de: Co-Autor, Formalisierung und sozialer Schutz
en: Co-Author, Formalization and social protection
place:
de: World Development
en: World Development
publication:
de: 'Torm, N., \& Oehme, M. (2024). Social protection and formalization in low-and middle-income countries: A scoping review of the literature. World Development, 181.'
en: 'Torm, N., \& Oehme, M. (2024). Social protection and formalization in low-and middle-income countries: A scoping review of the literature. World Development, 181.'
@ -61,12 +53,12 @@ experience:
- date:
de: 2023--2024
en: 2023--2024
client:
de: ILO
en: ILO
title:
de: Externer Forscher, Ungleichheiten auf dem Arbeitsmarkt
en: External researcher, Inequalities on the Labour market
place:
de: ILO
en: ILO
publication:
de: ILO (angenommen). Addressing Inequalities in the World of Work.
en: ILO (forthcoming). Addressing Inequalities in the World of Work.
@ -81,8 +73,11 @@ experience:
de: 2023
en: 2023
title:
de: Consultant, Forschungsarbeit für nachhaltige Beschaffung in internationaler Logistik, Refinter Consulting
en: Consultant, Research on sustainable procurement in international logistics, Refinter Consulting
de: Consultant, Forschungsarbeit für nachhaltige Beschaffung in internationaler Logistik
en: Consultant, Research on sustainable procurement in international logistics
place:
en: Refinter Consulting
de: Refinter Consulting
bullets:
- de: Qualitative Gegenüberstellung verschiedener Forschungsperspektiven im Lieferkettenmanagement
en: Qualitative comparison of various research strands within supply chain management
@ -93,12 +88,12 @@ experience:
- date:
de: 2022
en: 2022
client:
de: Universität Roskilde
en: Roskilde University
title:
de: Consultant, Datenbankforschung internationale Hilfsgelder
en: Consultant, Database research international aid funds
place:
de: Universität Roskilde
en: Roskilde University
bullets:
- de: Präsentation zu Einblick in digitaler Forschung in Datenbanken und Kodierungssystemen
en: Presentation of introduction to digital research in databases and coding systems
@ -109,12 +104,12 @@ experience:
- date:
de: 2022
en: 2022
client:
de: Universität Roskilde
en: Roskilde University
title:
de: Redaktionsarbeit, Soziale Absicherung und Widerstandsfähigkeit
en: Editorial work, Social Protection and Resilience, Roskilde University
place:
de: Universität Roskilde
en: Roskilde University
publication:
de: 'Torm, N., Gundertofte, C. M., \& Thur, G. E. (2022). Social Protection and Resilience during COVID-19: An Interdisciplinary Analysis of the Role of Informal Worker Associations in Kenya. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 6.'
en: 'Torm, N., Gundertofte, C. M., \& Thur, G. E. (2022). Social Protection and Resilience during COVID-19: An Interdisciplinary Analysis of the Role of Informal Worker Associations in Kenya. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 6.'
@ -128,16 +123,16 @@ experience:
- date:
de: 2022
en: 2022
client:
de: UNU-WIDER
en: UNU-WIDER
title:
de: Forschungsassistenz, Entwicklungsprojekte zur Reduzierung Ungleichheitstrends
en: Research Assistant, Development projects to reduce inequality trends
place:
de: UNU-WIDER
en: UNU-WIDER
publication:
de: Niño-Zarazúa, M., \& Morabito, C. (angenommen). Assessing the potential distributional impacts of development interventions. UNU-WIDER.
en: Niño-Zarazúa, M., \& Morabito, C. (forthcoming). Assessing the potential distributional impacts of development interventions. UNU-WIDER.
bullets:
bullets: # TODO: add numerical description of quantity of data (>2mil. datapoints)
- de: Sammlung, Verarbeitung und Bereinigung von 4 quantitativen Datensätzen, u.a. der UN Ungleichheitstrends
en: Collected, processed, and cleaned 4 datasets, including UN World inequality trends
- de: Durchführen einer beschreibenden Analyse von Ungleichheitstrends und -treibern in 4 Ländern
@ -148,12 +143,12 @@ experience:
- date:
de: 2022
en: 2022
client:
de: ILO
en: ILO
title:
de: Consultant, Review Verknüpfung sozialer Schutz, Produktivität und Formalisierung
en: Consultant, Social Protection, Productivity and Formalization Nexus Review
place:
de: ILO
en: ILO
publication:
de: "Torm, N. (forthcoming). The Social Protection, Productivity and Formalization Nexus among low- and middle- income countries: A Scoping Review of the Literature. International Labour Office."
en: "Torm, N. (forthcoming). The Social Protection, Productivity and Formalization Nexus among low- and middle- income countries: A Scoping Review of the Literature. International Labour Office."
@ -167,12 +162,12 @@ experience:
- date:
de: 2022
en: 2022
client:
de: Universität Roskilde
en: Roskilde University
title:
de: Consultant, Review Arbeitsmarktpolitiken in Asien und dem Pazifik
en: Consultant, Labour Market Policies Review in Asia and the Pacific
place:
de: Universität Roskilde
en: Roskilde University
publication:
de: 'Niño-Zarazúa, M., \& Torm, N. (2022). Active Labour Market Policies in Asia and the Pacific: A review of the literature. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 4.'
en: 'Niño-Zarazúa, M., \& Torm, N. (2022). Active Labour Market Policies in Asia and the Pacific: A review of the literature. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 4.'
@ -184,12 +179,12 @@ experience:
- date:
de: 2021
en: 2021
client:
de: Universität Roskilde
en: Roskilde University
title:
de: Forschungsassistenz, informelle Organisierung und Absicherung
en: Research Assistant, informal organization and social security
place:
de: Universität Roskilde
en: Roskilde University
publication:
de: Riisgaard, L. (2020). Worker Organisation and Social Protection amongst Informal Petty Traders in Tanzania. Roskilde Universitet. CAE Working Paper No. 2020:4
en: Riisgaard, L. (2020). Worker Organisation and Social Protection amongst Informal Petty Traders in Tanzania. Roskilde Universitet. CAE Working Paper No. 2020:4
@ -203,12 +198,12 @@ experience:
- date:
de: 2021
en: 2021
client:
de: Universität Roskilde
en: Roskilde University
title:
de: Redaktionsassistenz, SPIWORK-Projekt
en: Editorial Assistant, SPIWORK Project
place:
de: Universität Roskilde
en: Roskilde University
publication:
de: 'Riisgaard, L., Mitullah, W.V., \& Torm, N. (Eds.). (2021). Social Protection and Informal Workers in Sub-Saharan Africa: Lived Realities and Associational Experiences from Tanzania and Kenya (1st ed.). Routledge.'
en: 'Riisgaard, L., Mitullah, W.V., \& Torm, N. (Ed.). (2021). Social Protection and Informal Workers in Sub-Saharan Africa: Lived Realities and Associational Experiences from Tanzania and Kenya (1st ed.). Routledge.'
@ -223,8 +218,11 @@ experience:
de: 2018--2019
en: 2018--2019
title:
de: Akademische Hilfskraft, Institut für Amerikastudien, Universität Leipzig
en: Academic Assistant, Institute of American Studies, University of Leipzig
de: Akademische Hilfskraft, Institut für Amerikastudien
en: Academic Assistant, Institute of American Studies
place:
de: Universität Leipzig
en: University of Leipzig
bullets:
- de: Digitalisierung und Aufbereitung von Unterrichts- und Forschungsmaterialien
en: Digitized and optimized teaching and research materials
@ -236,8 +234,11 @@ experience:
de: 2017--2019
en: 2017--2019
title:
de: Studentische Hilfskraft, Professor Crister S. Garrett, Universität Leipzig
en: Student Assistant, Professor Crister S. Garrett, University of Leipzig
de: Studentische Hilfskraft, Professor Crister S. Garrett
en: Student Assistant, Professor Crister S. Garrett
place:
de: Universität Leipzig
en: University of Leipzig
bullets:
- de: Digitalisierung und Bearbeitung ausgewählter Arbeitsmaterialien
en: Digitized and prepared selected working material
@ -249,8 +250,11 @@ experience:
de: 2018
en: 2018
title:
de: Lehrassistenz, Transatlantische Sommerschule Cultures of Security, Universität Leipzig
en: Teaching Assistant, Trans Atlantic Summer School Cultures of Security, University of Leipzig
de: Lehrassistenz, Transatlantische Sommerschule Cultures of Security
en: Teaching Assistant, Trans Atlantic Summer School Cultures of Security
place:
de: Universität Leipzig
en: University of Leipzig
bullets:
- de: Vorbereitung, Organisation und Umsetzung von Lehrveranstaltungen und Events
en: Prepared, organized, and implemented schedule for teaching and events
@ -262,8 +266,11 @@ experience:
de: 2017--2018
en: 2017--2018
title:
de: Content-Management, Bachelor Plus/Alumni-System, Universität Leipzig
en: Content Management, Bachelor Plus/Alumni System, University of Leipzig
de: Content-Management, Bachelor Plus/Alumni-System
en: Content Management, Bachelor Plus/Alumni System
place:
de: Universität Leipzig
en: University of Leipzig
bullets:
- de: Gemeinsame Erstellung und Strukturierung von Inhalten im Content-Management-System von Wordpress
en: Co-created and structured content in Wordpress content management system
@ -275,8 +282,11 @@ experience:
de: 2014--2018
en: 2014--2018
title:
de: Verkaufsassistent und Eventhelfer für historische Märkte, Heureka Gastronomie
en: Sales Assistant and Event Support for Historical Markets, Heureka Gastronomy
de: Verkaufsassistent und Eventhelfer für historische Märkte
en: Sales Assistant and Event Support for Historical Markets
place:
de: Heureka Gastronomie
en: Heureka Gastronomy
bullets:
- de: Betreuung mehrerer Verkaufsstände, darunter Glühwein und Getränke, Grillstände und Handbrote
en: Managed multiple sales stands, including mulled wine and beverages, grill, and handbread stands
@ -289,7 +299,7 @@ education:
- place:
de: Universität Leipzig, Deutschland
en: University of Leipzig, Germany
program:
title:
de: European Master of Global Studies, MA
en: European Master of Global Studies, MA
date:
@ -298,7 +308,7 @@ education:
- place:
de: Universität Roskilde, Dänemark
en: Roskilde University, Denmark
program:
title:
de: Global Studies, MSc
en: Global Studies, MSc
date:
@ -307,7 +317,7 @@ education:
- place:
de: Universität Leipzig, Deutschland
en: University of Leipzig, Germany
program:
title:
de: Amerikanistik, BA
en: American Studies, BA
date:
@ -316,7 +326,7 @@ education:
- place:
de: HTWK Leipzig, Deutschland
en: HTWK Leipzig, Deutschland
program:
title:
de: Medieninformatik, BSc (nicht abgeschlossen)
en: Media Computer Science, BSc (not completed)
date:
@ -324,26 +334,99 @@ education:
en: 2015
thesis:
- type:
de: Master Thesis
- title:
de: Masterarbeit
en: Master Thesis
title:
de: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism"
en: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism"
abstract:
place:
de: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism."
en: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism."
abstract: # TODO: Rephrase this complete abstract since it's not worded well
de: Unter Verwendung einer theoretischen Grundlage von Macht wurden die Mechanismen der Konsensbildung bei der Produktion von Räumen im Ökotourismus analysiert. Durch die Anwendung kritischer Diskursanalyse auf die Fallstudie Namibia wurden verschiedene Arten der Wertschöpfung zwischen ökonomischen und erfahrungsbasierten Werten im Tourismus untersucht.
en: Used a theoretical basis of power to analyze the mechanisms of consensus shaping the production of ecotourism space. Utilizing critical discourse analysis on the case study of Namibia, it explored various means of value production between economic and experiential values in tourism.
volunteering:
- title:
de: ZeitRaum
en: ZeitRaum
date:
de: 2023--2024
en: 2023--2024
place:
de: Heizhaus e.V.
en: Heizhaus association
bullets:
- de: Vermittlung digitaler Kompetenzen im Alter
en: Transferring Digital Competence in Aging
- de: Wöchentlicher Workshop zur Entwicklung von Selbstvertrauen und Kompetenz mit Smartphones
en: Weekly workshop on developing confidence and competence with smartphones
- de: Personalisierte technische Hilfsmeetings und technische Support-Beratungen
en: Personalized tech assistance appointments and technical support consultations
- title:
de: Verpixelt
en: Verpixelt
date:
de: 2023
en: 2023
place:
de: Urban Souls e.V.
en: Urban Souls association
bullets:
- de: Technische Assistenz zur Vermittlung digitaler Kompetenzen
en: Technical assistance for conveying digital competencies
- de: IT und Event Organisationsunterstützung
en: IT and event management services
skills:
- de: Digitales Toolset
en: Digital toolset
content:
- name:
de: Autorensoftware
en: Authoring software
items:
- de: LaTeX
en: LaTeX
- de: Typst
en: Typst
- de: Quarto
en: Quarto
- de: Pandoc
en: Pandoc
- name:
de: Datenmanagement
en: Data engineering
items:
- de: SQL
en: SQL
- de: Web-Scraping & Crawling
en: Web-scraping & crawling
- name:
de: Datenanalyse
en: Data analysis
items:
- de: Python Pandas & Polars
en: Python Pandas & Polars
- de: Seaborn
en: Seaborn
- name:
de: Programmieren
en: Programming
items:
- de: Python
en: Python
- de: Go
en: Go
- de: Bash
en: Bash
- de: Lua
en: Lua
- name:
de: Versionskontrollsoftware
en: Version control software
items:
- de: Git
en: git
en: Git
- de: Jujutsu
en: Jujutsu
- de: Fossil
en: Fossil
- name:
de: Office-Suite
en: Office suite
@ -354,16 +437,6 @@ skills:
en: Word
- de: Access
en: Access
- name:
de: Autorensoftware
en: Authoring software
items:
- de: LaTeX
en: LaTeX
- de: Pandoc
en: pandoc
- de: Quarto
en: quarto
- name:
de: Web Content Management
en: Web content management
@ -382,22 +455,6 @@ skills:
en: CSS
- de: JavaScript
en: JavaScript
- name:
de: Datenanalyse
en: Data Analysis
items:
- de: Python Pandas
en: Python pandas
- de: Plotly
en: Plotly
- name:
de: Datenmanagement
en: Data engineering
items:
- de: Web-Scraping/-Crawling
en: Web-scraping/-crawling
- de: SQL
en: SQL
- name:
de: Design Software
en: Design software
@ -406,25 +463,8 @@ skills:
en: GIMP
- de: Adobe Suite
en: Adobe suite
# Add date information for volunteer work
- de: Ehrenamt
en: Volunteering work
content:
- name:
de: Verpixelt, Urban Souls e.V.
en: Verpixelt, Urban Souls association
items:
- de: technische Assistenz zur Vermittlung digitaler Kompetenzen
en: technical assistance for conveying digital competencies
- name:
de: ZeitRaum, Heizhaus e.V.
en: ZeitRaum, Heizhaus association
items:
- de: Vermittlung digitaler Kompetenzen im Alter, Workshop und Fragestunde
en: Transferring Digital Competence in Aging, Workshop and individual sessions
- de: Sprachen
en: Languages
content:
languages:
- name:
de: Deutsch
en: German

251
cv.typ
View file

@ -17,6 +17,13 @@
"en"
}
}
#let sel_word_lang(de: "", en:"") = {
if lang == "de" {
de
} else {
en
}
}
#let _columns_3(left_body, center_body, right_body) = {
block[
@ -32,31 +39,6 @@
]
}
// Feel free to change the margin below to best fit your own CV
#set page(
paper: "a4",
margin: (x: 0.9cm, y: 1.3cm),
footer: [
#set text(
fill: luma(200),
size: 8pt,
)
#_columns_3[
#smallcaps[#datetime.today().display("[month repr:long] [day], [year]")]
][
#smallcaps[
Marty Oehme
// #sym.dot.c
// CV
]
][
#counter(page).display()
]
],
)
#set par(justify: true)
#let header(about, columns: (1.5fr, 1fr, 1fr)) = {
[= #about.fullname];
let contact_fields = (for c in about.contact {
@ -73,69 +55,117 @@
);
}
#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)}
#let subdued(body) = {
block(inset: 5%, width: 85%, text(fill:luma(150), body))
}
#let section_header(title) = {[== #title]; horizon_line()};
#let section(title: "Section", body) = {
section_header(title);
body
};
#let work_item(item: ()) = {
if "client" in item {
[*#item.title.at(lang)*, _#item.client.at(lang)_ #h(1fr)];
} else {
[*#item.title.at(lang)* #h(1fr)];
};
[ _#item.date.at(lang)_ \ ];
#let entry(item: ()) = {
if "title" in item {
[*#item.title.at(lang)*]
}
if "place" in item {
if "title" in item {
[, ]
}
[_#item.place.at(lang)_]
}
[#h(1fr)]
if "date" in item {
[ _#item.date.at(lang)_ \ ]
}
if "bullets" in item {
for bullet in item.bullets {
[- #bullet.at(lang)]
}
}
if "publication" in item {
block(inset: 5%, width: 85%, text(fill:luma(150))[#item.publication.at(lang) \ ])
subdued[#item.publication.at(lang) \ ]
};
if "abstract" in item {
subdued[#item.abstract.at(lang) \ ]
}
}
#let education_item(item: ()) = {
assert("place" in item and "program" in item and "date" in item, message: "Education items require place, program and date.");
[*#item.place.at(lang)*, #item.program.at(lang) #h(1fr)];
#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)}
#let section_header(title) = {[== #title]; horizon_line()};
#let section(title: "Section", entries: (), body) = {
section_header(title);
if body == none or body == [] {
for e in entries {
entry(item:e)
}
} else {
body
}
};
// Slightly re-styled entry with PLACE first and TITLE second
#let education_entry(item: ()) = {
assert("place" in item and "title" in item and "date" in item, message: "Education items require place, program and date.");
[*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)];
[ _#item.date.at(lang)_ \ ];
}
#let thesis_item(item: ()) = {
assert("type" in item and "title" in item, message: "Thesis items require type and title.");
[*#item.type.at(lang)* #item.title.at(lang) #h(1fr)];
// Restyled entry with PLACE not emphasized like usual, and no date but an abstract
#let thesis_entry(item: ()) = {
assert("title" in item and "place" in item, message: "Thesis items require type and title.");
[*#item.title.at(lang)* #item.place.at(lang) #h(1fr)];
[#par(item.abstract.at(lang))]
}
#let sel_word_lang(de: "", en:"") = {
if lang == "de" {
de
} else {
en
}
}
#let skill_item(item: ()) = {
[*#item.at(lang)*: \ ]
for skill in item.content {
[#skill.name.at(lang) (]
// skill-specific entry, changing its style for sidebar
#let skill_item(item: (), is_sidebar: false) = {
let side_list(body) = if is_sidebar {list(body)} else {par(body)}
for skill in item {
side_list({
[*#skill.name.at(lang)*]
if is_sidebar [\ ] else [ (]
for (i,v) in skill.items.enumerate() {
[#v.at(lang)]
if i < skill.items.len() - 1 {
[, ]
}
}
[) \ ]
if not is_sidebar [)]
})
}
}
#let cv(contents, use_sidebar: false) = {
set text(lang: lang)
let date_formatting = {
if lang == "de" {
"[day]. [month repr:long] [year]"
} else {
"[month repr:long] [day], [year]"
}
}
set page(
paper: "a4",
margin: (x: 0.9cm, y: 1.3cm),
footer: [
#set text(
fill: luma(200),
size: 8pt,
)
#_columns_3[
#smallcaps[#datetime.today().display(date_formatting)]
][
#smallcaps[#contents.about.fullname]
][
#counter(page).display()
]
],
)
set par(justify: true)
#let resume(contents) = {
header(contents.about)
let body = {
if "summary" in contents {
section(title:"", {
contents.summary.at(lang)
@ -144,36 +174,103 @@
if "experience" in contents {
let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung")
section(title: title, {
for entry in contents.experience {
work_item(item:entry)
}
})
section(title: title, entries:contents.experience)[]
}
if "education" in contents {
let title = sel_word_lang(en:"Education", de:"Ausbildung")
section(title: "Education", {
for entry in contents.thesis {
thesis_item(item:entry)
section(title: title, entries:contents.thesis + contents.education)[]
}
for entry in contents.education {
education_item(item:entry)
}
})
if not use_sidebar {
if "volunteering" in contents {
let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt")
section(title: title, entries:contents.volunteering)[]
}
if "skills" in contents {
let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen")
section(title: "Qualifications", {
for cat in contents.skills {
skill_item(item:cat)
section(title: title, {
skill_item(item:contents.skills)
})
}
if "languages" in contents {
let title = sel_word_lang(en:"Languages", de:"Sprachen")
section(title: title, {
skill_item(item:contents.languages)
})
}
}
}
#resume(
let sidebar = {
if "volunteering" in contents {
let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt")
[== #title]
for e in contents.volunteering {
[
- *#e.title.at(lang)* (#e.date.at(lang))
#par(e.bullets.at(0).at(lang)) \
]
}
}
if "languages" in contents {
let title = sel_word_lang(en:"Languages", de:"Sprachen")
[== #title]
skill_item(item:contents.languages, is_sidebar: true)
[\ ]
}
if "skills" in contents {
let title = sel_word_lang(en:"Qualifications", de:"Kenntnisse")
[== #title]
skill_item(item:contents.skills, is_sidebar: true)
}
}
if not use_sidebar {
body
return
}
let margin = 1pt
grid(
columns: (2fr, 1fr),
block(outset: 0pt, inset: (top: 0.4 * margin, right: 0pt, rest: margin), stroke: none, width: 100%, {
set block(above: 10pt)
show heading.where(level: 1): it => style(s => {
let h = text(size: 18pt, upper(it))
let dim = measure(h, s)
stack(
dir: ltr,
h,
place(
dy: 7pt,
dx: 10pt,
horizon + left,
line(stroke: accent-color, length: 100% - dim.width - 10pt)
),
)
})
body
}),
{
v(20pt)
set block(inset: (left: 20 * margin, right: 20 * margin))
show heading: it => align(right, upper(it))
set list(marker: "")
show list: it => {
set par(justify: false)
align(right, block(it))
}
sidebar
}
)
}
#cv.with(use_sidebar: false)(
yaml("content.yml")
)

291
resume.typ Normal file
View file

@ -0,0 +1,291 @@
#show heading: set text(font: "New Computer Modern")
#show link: underline
// smartypants and latex compatibility
#show "--": [#sym.dash.en]
#show "---": [#sym.dash.em]
#show "\&": [#sym.amp]
// Choose the compiled language through cli by doing
//
// $ typst compile --input lang=de cv.typ
//
#let lang = {
if "lang" in sys.inputs and sys.inputs.lang == "de" {
"de"
} else {
"en"
}
}
#let sel_word_lang(de: "", en:"") = {
if lang == "de" {
de
} else {
en
}
}
#let _columns_3(left_body, center_body, right_body) = {
block[
#box(width: 1fr)[
#align(left)[#left_body]
]
#box(width: 1fr)[
#align(center)[#center_body]
]
#box(width: 1fr)[
#align(right)[#right_body]
]
]
}
#let header(about, columns: (1.5fr, 1fr, 1fr)) = {
[= #about.fullname];
let contact_fields = (for c in about.contact {
if "link" in c {
([#c.icon ~ #link(c.link)[#c.text]],)
} else {
([#c.icon ~ #c.text],)
}
})
grid(
columns: columns,
gutter: 5pt,
..contact_fields
);
}
#let subdued(body) = {
block(inset: 5%, width: 85%, text(fill:luma(150), body))
}
#let freelance_by_client(experience:()) = {
let by_client = (:)
for item in experience {
let client = item.place.at(lang)
if client not in by_client {
by_client.insert(client, ())
}
by_client.at(client).push((item.title.at(lang), item.date.at(lang) ))
}
for (client, jobs) in by_client {
[*#client*:]
for j in jobs {
[- #j.at(0) #h(1fr) #j.at(1)]
}
}
}
#let entry(item: ()) = {
if "title" in item {
[*#item.title.at(lang)*]
}
if "place" in item {
if "title" in item {
[, ]
}
[_#item.place.at(lang)_]
}
[#h(1fr)]
if "date" in item {
[ _#item.date.at(lang)_ \ ]
}
if "bullets" in item {
for bullet in item.bullets {
[- #bullet.at(lang)]
}
}
if "publication" in item {
subdued[#item.publication.at(lang) \ ]
};
if "abstract" in item {
subdued[#item.abstract.at(lang) \ ]
}
}
#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)}
#let section_header(title) = {[== #title]; horizon_line()};
#let section(title: "Section", entries: (), body) = {
section_header(title);
if body == none or body == [] {
for e in entries {
entry(item:e)
}
} else {
body
}
};
// Slightly re-styled entry with PLACE first and TITLE second
#let education_entry(item: ()) = {
assert("place" in item and "title" in item and "date" in item, message: "Education items require place, program and date.");
[*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)];
[ _#item.date.at(lang)_ \ ];
}
// Restyled entry with PLACE not emphasized like usual, and no date but an abstract
#let thesis_entry(item: ()) = {
assert("title" in item and "place" in item, message: "Thesis items require type and title.");
[*#item.title.at(lang)* #item.place.at(lang) #h(1fr)];
[#par(item.abstract.at(lang))]
}
// skill-specific entry, changing its style for sidebar
#let skill_item(item: (), is_sidebar: false) = {
let side_list(body) = if is_sidebar {list(body)} else {par(body)}
for skill in item {
side_list({
[*#skill.name.at(lang)*]
if is_sidebar [\ ] else [ (]
for (i,v) in skill.items.enumerate() {
[#v.at(lang)]
if i < skill.items.len() - 1 {
[, ]
}
}
if not is_sidebar [)]
})
}
}
#let resume(contents) = {
set text(lang: lang)
let date_formatting = {
if lang == "de" {
"[day]. [month repr:long] [year]"
} else {
"[month repr:long] [day], [year]"
}
}
set page(
paper: "a4",
margin: (x: 0.9cm, y: 1.3cm),
footer: [
#set text(
fill: luma(200),
size: 8pt,
)
#_columns_3[
#smallcaps[#datetime.today().display(date_formatting)]
][
#smallcaps[#contents.about.fullname]
][
#counter(page).display()
]
],
)
set par(justify: true)
header(contents.about)
let body = {
// if "summary" in contents {
// section(title:"", {
// contents.summary.at(lang)
// })
// };
if "experience" in contents {
let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung")
section(title: title)[]
freelance_by_client(experience:contents.experience)
}
if "education" in contents {
let title = sel_word_lang(en:"Education", de:"Ausbildung")
section(title: title, entries:contents.thesis + contents.education)[]
}
// if "volunteering" in contents {
// let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt")
// section(title: title, entries:contents.volunteering)[]
// }
//
// if "skills" in contents {
// let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen")
// section(title: title, {
// skill_item(item:contents.skills)
// })
// }
//
// if "languages" in contents {
// let title = sel_word_lang(en:"Languages", de:"Sprachen")
// section(title: title, {
// skill_item(item:contents.languages)
// })
// }
}
let sidebar = {
if "volunteering" in contents {
let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt")
[== #title]
for e in contents.volunteering {
[
- *#e.title.at(lang)* (#e.date.at(lang))
#par(e.bullets.at(0).at(lang)) \
]
}
}
if "languages" in contents {
let title = sel_word_lang(en:"Languages", de:"Sprachen")
[== #title]
skill_item(item:contents.languages, is_sidebar: true)
[\ ]
}
if "skills" in contents {
let title = sel_word_lang(en:"Qualifications", de:"Kenntnisse")
[== #title]
skill_item(item:contents.skills, is_sidebar: true)
}
}
let margin = 1pt
grid(
columns: (2fr, 1fr),
block(outset: 0pt, inset: (top: 0.4 * margin, right: 0pt, rest: margin), stroke: none, width: 100%, {
set block(above: 10pt)
show heading.where(level: 1): it => style(s => {
let h = text(size: 18pt, upper(it))
let dim = measure(h, s)
stack(
dir: ltr,
h,
place(
dy: 7pt,
dx: 10pt,
horizon + left,
line(stroke: accent-color, length: 100% - dim.width - 10pt)
),
)
})
body
}),
align(right, block(fill: luma(250), width: 90%,
{
v(20pt)
set block(inset: (left: 20 * margin, right: 20 * margin))
show heading: it => align(right, upper(it))
set list(marker: "")
show list: it => {
set par(justify: false)
align(right, block(it))
}
sidebar
}))
)
}
#resume(
yaml("content.yml")
)