From 698ef628b25ec728265b4ff03d9480338258c87a Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:53:40 +0200 Subject: [PATCH 01/10] 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. --- content.yml | 99 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 39 deletions(-) diff --git a/content.yml b/content.yml index 486734b..b4d104c 100644 --- a/content.yml +++ b/content.yml @@ -46,8 +46,11 @@ experience: 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 +64,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 +84,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 +99,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 +115,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 +134,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 +154,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 +173,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 +190,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 +209,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 +229,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 +245,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 +261,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 +277,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 +293,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 From 25d9e7ce13d85e66a276a9a089072f3ad87fc0a9 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:55:12 +0200 Subject: [PATCH 02/10] 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. --- content.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/content.yml b/content.yml index b4d104c..4903eee 100644 --- a/content.yml +++ b/content.yml @@ -310,7 +310,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: @@ -319,7 +319,7 @@ education: - place: de: Universität Roskilde, Dänemark en: Roskilde University, Denmark - program: + title: de: Global Studies, MSc en: Global Studies, MSc date: @@ -328,7 +328,7 @@ education: - place: de: Universität Leipzig, Deutschland en: University of Leipzig, Germany - program: + title: de: Amerikanistik, BA en: American Studies, BA date: @@ -337,7 +337,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: @@ -345,13 +345,13 @@ education: en: 2015 thesis: - - type: + - title: de: Master Thesis 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. From d518eb908769319aea23ab9431fe09cda23a5cab Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:55:55 +0200 Subject: [PATCH 03/10] Extract volunteering from qualifications They deserve their own sections, now that I have volunteered for over a year. --- content.yml | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/content.yml b/content.yml index 4903eee..94bf167 100644 --- a/content.yml +++ b/content.yml @@ -355,6 +355,38 @@ thesis: 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 @@ -427,22 +459,6 @@ 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: From e53d5ca3864520f33a4b8ba64e3c3af94bc1d9fa Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:56:18 +0200 Subject: [PATCH 04/10] Refactor typst cv generation to make use of generalized entries --- cv.typ | 142 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 80 insertions(+), 62 deletions(-) diff --git a/cv.typ b/cv.typ index f0345c3..6db32f4 100644 --- a/cv.typ +++ b/cv.typ @@ -32,31 +32,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,41 +48,63 @@ ); } -#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))] } @@ -119,6 +116,7 @@ } } +// Old-style presentation of skills and qualifications, to be overhauled #let skill_item(item: ()) = { [*#item.at(lang)*: \ ] for skill in item.content { @@ -133,9 +131,35 @@ } } - #let resume(contents) = { + // 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[ + // FIXME: Source from about.fullname variable + Marty Oehme + // #sym.dot.c + // CV + ] + ][ + #counter(page).display() + ] + ], + ) + + set par(justify: true) + header(contents.about) + if "summary" in contents { section(title:"", { contents.summary.at(lang) @@ -144,23 +168,17 @@ 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) - } - for entry in contents.education { - education_item(item:entry) - } - }) + 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 { From 43549c1f53c2421e33f25105a45ecc45b8530fee Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 17 Sep 2024 15:57:08 +0200 Subject: [PATCH 05/10] Fix master thesis german translation --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index 94bf167..af0d62e 100644 --- a/content.yml +++ b/content.yml @@ -346,7 +346,7 @@ education: thesis: - title: - de: Master Thesis + de: Masterarbeit en: Master Thesis place: de: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism." From 5df8458b72b2db8a15fcacc16743ea1bc5df6973 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 17 Sep 2024 17:50:30 +0200 Subject: [PATCH 06/10] Add sidebar to document --- cv.typ | 179 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 126 insertions(+), 53 deletions(-) diff --git a/cv.typ b/cv.typ index 6db32f4..445986c 100644 --- a/cv.typ +++ b/cv.typ @@ -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[ @@ -108,31 +115,34 @@ [#par(item.abstract.at(lang))] } -#let sel_word_lang(de: "", en:"") = { - if lang == "de" { - de - } else { - en - } -} - -// Old-style presentation of skills and qualifications, to be overhauled -#let skill_item(item: ()) = { - [*#item.at(lang)*: \ ] - for skill in item.content { - [#skill.name.at(lang) (] - for (i, v) in skill.items.enumerate() { - [#v.at(lang)] - if i < skill.items.len() - 1 { - [, ] +// 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) = { - // Feel free to change the margin below to best fit your own CV +#let cv(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), @@ -142,14 +152,9 @@ size: 8pt, ) #_columns_3[ - #smallcaps[#datetime.today().display("[month repr:long] [day], [year]")] + #smallcaps[#datetime.today().display(date_formatting)] ][ - #smallcaps[ - // FIXME: Source from about.fullname variable - Marty Oehme - // #sym.dot.c - // CV - ] + #smallcaps[#contents.about.fullname] ][ #counter(page).display() ] @@ -160,38 +165,106 @@ header(contents.about) - if "summary" in contents { - section(title:"", { - contents.summary.at(lang) - }) - }; + 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, entries:contents.experience)[] + if "experience" in contents { + let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") + section(title: title, entries: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) + }) + } } - 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: "Qualifications", { - for cat in contents.skills { - skill_item(item:cat) + 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 + }), + { + 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( +#cv( yaml("content.yml") ) From 097cd1263d738340d8284e74ea48d62077fa54cb Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 17 Sep 2024 17:51:39 +0200 Subject: [PATCH 07/10] Decouple languages from skills Both retain the same yaml structure but are not tightly coupled anymore (like volunteering before). --- content.yml | 198 ++++++++++++++++++++++++++++------------------------ 1 file changed, 106 insertions(+), 92 deletions(-) diff --git a/content.yml b/content.yml index af0d62e..de8980c 100644 --- a/content.yml +++ b/content.yml @@ -388,95 +388,109 @@ volunteering: en: IT and event management services skills: - - de: Digitales Toolset - en: Digital toolset - content: - - name: - de: Versionskontrollsoftware - en: Version control software - items: - - de: Git - en: git - - name: - de: Office-Suite - en: Office suite - items: - - de: Excel - en: Excel - - de: Word - 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 - items: - - de: Wordpress - en: Wordpress - - de: Hugo - en: Hugo - - de: Flask - en: Flask - - de: Astro - en: Astro - - de: HTML - en: HTML - - de: CSS - 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 - items: - - de: GIMP - en: GIMP - - de: Adobe Suite - en: Adobe suite - - de: Sprachen - en: Languages - content: - - name: - de: Deutsch - en: German - items: - - de: Muttersprache - en: native - - name: - de: Englisch - en: English - items: - - de: fließend - en: fluent - - name: - de: Französisch - en: French - items: - - de: Grundkenntnisse - en: basics + - 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 + - de: Jujutsu + en: Jujutsu + - de: Fossil + en: Fossil + - name: + de: Office-Suite + en: Office suite + items: + - de: Excel + en: Excel + - de: Word + en: Word + - de: Access + en: Access + - name: + de: Web Content Management + en: Web content management + items: + - de: Wordpress + en: Wordpress + - de: Hugo + en: Hugo + - de: Flask + en: Flask + - de: Astro + en: Astro + - de: HTML + en: HTML + - de: CSS + en: CSS + - de: JavaScript + en: JavaScript + - name: + de: Design Software + en: Design software + items: + - de: GIMP + en: GIMP + - de: Adobe Suite + en: Adobe suite + +languages: + - name: + de: Deutsch + en: German + items: + - de: Muttersprache + en: native + - name: + de: Englisch + en: English + items: + - de: fließend + en: fluent + - name: + de: Französisch + en: French + items: + - de: Grundkenntnisse + en: basics From f19fd2540c79e55508b56bf7067c5526cf284a04 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 19 Sep 2024 17:15:45 +0200 Subject: [PATCH 08/10] Add resume with sidebar style --- resume.typ | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 resume.typ diff --git a/resume.typ b/resume.typ new file mode 100644 index 0000000..0d51e04 --- /dev/null +++ b/resume.typ @@ -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") +) + From 7a503d61fbef8e61bc8fcb5d650eecbe082428a4 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 19 Sep 2024 17:21:03 +0200 Subject: [PATCH 09/10] Allow setting sidebar or not for cv --- cv.typ | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/cv.typ b/cv.typ index 445986c..89bb34c 100644 --- a/cv.typ +++ b/cv.typ @@ -133,7 +133,7 @@ } } -#let cv(contents) = { +#let cv(contents, use_sidebar: false) = { set text(lang: lang) let date_formatting = { @@ -182,23 +182,25 @@ 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 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: title, { - skill_item(item:contents.skills) - }) - } + 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) - }) + if "languages" in contents { + let title = sel_word_lang(en:"Languages", de:"Sprachen") + section(title: title, { + skill_item(item:contents.languages) + }) + } } } @@ -228,6 +230,10 @@ } } + if not use_sidebar { + body + return + } let margin = 1pt grid( columns: (2fr, 1fr), @@ -264,7 +270,7 @@ } -#cv( +#cv.with(use_sidebar: false)( yaml("content.yml") ) From f6730e38ceff2f1da1f277b1e7e86c8ff83b885c Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 19 Sep 2024 17:31:55 +0200 Subject: [PATCH 10/10] Update summary texts --- content.yml | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/content.yml b/content.yml index de8980c..a02f5fe 100644 --- a/content.yml +++ b/content.yml @@ -15,31 +15,20 @@ 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: