diff --git a/README.md b/README.md index 29a97f8..ae62ba2 100644 --- a/README.md +++ b/README.md @@ -18,28 +18,6 @@ Is called like the following: ``` This is the default invocation, though sidebar and main body sections can be exchanged at will. -The following sections currently exist: - -- education -- experience, subdivided in "experience", "experience_by_client" and "experience_by_type" -- languages -- skills -- summary -- volunteering - -Sections in the main body or sidebar can be reordered at will. - -## Advanced experience settings - -The experience section has 3 forms: - -Purely chronological ("experience"), which is the default; -separated by client worked for ("experience_by_client"); -separated by the type of work undertaken, then further separated by client worked for ("experience_by_client"). - -These options are intended especially for self-employed / entrepreneurial CVs. -They let you subdivide your work experience whichever way works best, -and additionally divide work undertaken for your own employ or salaried positions for example. TODO: @@ -64,4 +42,4 @@ TODO: - [x] Can be switched between Ger/En - [x] Try sidebar version - [ ] Generalize sidebar version through abstraction/extractions -- [x] unify items: experience/education/(thesis?) +- [ ] unify items: experience/education/(thesis?) diff --git a/content.yml b/content.yml index 0cd575d..2afb449 100644 --- a/content.yml +++ b/content.yml @@ -386,8 +386,8 @@ volunteering: 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 Unterstützung und personalisierte Einzelberatungen - en: Personalized tech assistance appointments and individual technical support consultations + - de: Personalisierte technische Hilfsmeetings und technische Support-Beratungen + en: Personalized tech assistance appointments and technical support consultations - title: de: Verpixelt en: Verpixelt diff --git a/cv.typ b/cv.typ index 19a5459..227584a 100644 --- a/cv.typ +++ b/cv.typ @@ -65,7 +65,7 @@ section( title: title, { - sidebar_entry(item: contents.skills) + skill_item(item: contents.skills) }, ) } @@ -75,7 +75,7 @@ section( title: title, { - sidebar_entry(item: contents.languages) + skill_item(item: contents.languages) }, ) } @@ -97,14 +97,14 @@ if "languages" in contents { let title = (en: "Languages", de: "Sprachen").at(lang) [== #title] - sidebar_entry(item: contents.languages, is_sidebar: true) + skill_item(item: contents.languages, is_sidebar: true) [\ ] } if "skills" in contents { let title = (en: "Qualifications", de: "Kenntnisse").at(lang) [== #title] - sidebar_entry(item: contents.skills, is_sidebar: true) + skill_item(item: contents.skills, is_sidebar: true) } } diff --git a/letter.qmd b/letter.qmd new file mode 100644 index 0000000..6b4078d --- /dev/null +++ b/letter.qmd @@ -0,0 +1,53 @@ +--- +backaddress: Marty Oehme, Körnerstraße 54, 04107 Leipzig +fromname: Marty Oehme +fromaddress: | + Körnerstraße 54 + 04107 Leipzig +fromphone: "0177 / 377 49 49" +place: Leipzig, DAY MONTH YEAR +placeseparator: "‎ " +sendto: | + NAME OF COMPANY + ITS ADDRESS STREET AND NUMBER + LOCATION ZIPCODE +lang: en +subject: Bewerbung für JOBSTELLE +signature: Marty Oehme +opening: Dear CONTACTNAME +closing: Sincerely +format: + pdf: + template: templates/letter.latex +--- + +After two years of cooperation, I recently finished the final in a row of projects undertaken as consultant for UNU-WIDER and the ILO. +I am glad to have happened upon your job posting for the position of project officer as part-time worker with minimum 32 hours, as for me it may allow a more medium term stability than the previous short-term freelance positions did. + +Over the previous two years, I have primarily provided research assistance for three major projects under the helm of the UN, the ILO and Roskilde University: +In addition to the descriptive analysis undertaken for all of these projects, +my consultancy for UNU-WIDER required the creation of a time-series visualization on the basis of empirical analysis over roughly 200.000 observations within the UN's WIID dataset. +The previous work for the ILO and Roskilde University instead consisted of deep research for the creation of wide-ranging scoping reviews, +which necessitated collecting, organizing and cleaning datasets of around 2000 source potentials. +I accomplished both of these tasks more efficiently with the help of Python and its data analysis modules which is also where my primary statistical programming focus lies. + +Additionally, I have long been helping publish academic, particularly empirical, works, +first in the role of academic assistant and later on as editorial consultant. +Perhaps most personally beneficial for the current position was the publication of a large academic anthology under the SPIWORK project: +During this time I worked with clients located internationally, +collaborating directly to create clear and concise manuscripts for each individual topic, +before merging the divergent aspects into a final coherent whole while also fulfilling publisher's formal requirements. +I would love to bring both the analytical and editorial skillsets together in my new work, +to be able to push them forward in tandem. + +Lastly, my skills of communication, especially international communication skills, have been honed throughout this time as I was both participant and leader of small (from 3 people) to medium-sized (up to 8 people) teams. +Collaboration in this way was both exciting and straightforward for me, +and I firmly believe concise and clear communication both engenders easier productivity flows +and is fundamental to the ability to precisely frame topics as complex as energy transition. + +My interactions with processes of both long-term energy planning and renewables-based electrification of end-use sectors primarily stem from research undertaken in Vietnam and Benin under the helm of the Agence française de développement, +where the eventual distributional impact of access to clean water and new energy grids provided the project's focus. +I have, however, both the willingness and curiosity to dive deeper into these topics and their related issues of regulatory frameworks, financing and policy framing. + +I will be happy to hear back from you and am confident that I could be a good match. +Should you agree that my profile is a good fit for the offered position then do not hesitate to contact me and I would be delighted to arrange a meeting. diff --git a/lib.typ b/lib.typ index ff4c0ed..09b33e1 100644 --- a/lib.typ +++ b/lib.typ @@ -1,4 +1,11 @@ +// set some styles +#let style(it) = { + show heading: set text(font: "New Computer Modern") + show link: underline + it +} + // transform md-similes to actual symbols #let smartypants(it) = { // smartypants and latex compatibility @@ -8,14 +15,6 @@ it } -// set some styles -#let style(it) = { - show heading: set text(font: "New Computer Modern") - show link: underline - show: smartypants - it -} - // Choose the compiled language through cli by doing // // $ typst compile --input lang=de cv.typ @@ -91,24 +90,6 @@ } } - -#let sidebar_entry(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 horizon_line() = { v(-3pt) line(length: 100%) @@ -131,39 +112,6 @@ } }; -// TODO: make it _return_ the data, not display it on its own -#let 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((title: item.title.at(lang), date: item.date.at(lang))) - } - - for (client, jobs) in by_client { - [*#client*:] - for j in jobs { - [- #j.title #h(1fr) #j.date] - } - } -} - -#let by_experience_type(type: (), experience: ()) = { - let by_ty = (:) - for (id, desc) in type { - let matching_exp_items = experience.filter(item => int(item.typeid) == int(id)) - if matching_exp_items.len() == 0 { - return - } - - [=== _#desc.at(lang)_] - by_client(experience: matching_exp_items) - } -} - // Slightly re-styled entry with PLACE first and TITLE second #let education_entry(item: ()) = { assert( @@ -180,3 +128,21 @@ [*#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 [)] + }) + } +} diff --git a/resume.typ b/resume.typ index 2930ed1..789e029 100644 --- a/resume.typ +++ b/resume.typ @@ -1,7 +1,41 @@ #import "lib.typ": * -#let resume(contents, main: ("experience_by_type", "education"), sidebar: ("volunteering", "languages", "skills")) = { +// TODO: make it _return_ the data, not display it on its own +#let 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 by_experience_type(type: (), experience: ()) = { + let by_ty = (:) + for (id, desc) in type { + let matching_exp_items = experience.filter(item => int(item.typeid) == int(id)) + if matching_exp_items.len() == 0 { + return + } + + [=== _#desc.at(lang)_] + by_client(experience: matching_exp_items) + } +} + +#let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { show: style + show: smartypants set text(lang: lang) let date_formatting = { @@ -34,88 +68,75 @@ header(contents.about) let body = { - for item in main { - if item == "summary" and "summary" in contents { - section( - title: "", - { - contents.summary.at(lang) - }, - ) - } + if "summary" in main and "summary" in contents { + section( + title: "", + { + contents.summary.at(lang) + }, + ) + } - if item == "experience_by_type" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_experience_type(experience: contents.experience, type: contents.experience_types) - } - if item == "experience_by_client" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_client(experience: contents.experience) - } - if item == "experience" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title, entries: contents.experience)[] - } + if "experience" in main and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_experience_type(experience: contents.experience, type: contents.experience_types) + } - if item == "education" and "education" in contents { - let title = (en: "Education", de: "Ausbildung").at(lang) - section(title: title, entries: contents.thesis + contents.education)[] - } + if "education" in main and "education" in contents { + let title = (en: "Education", de: "Ausbildung").at(lang) + section(title: title, entries: contents.thesis + contents.education)[] + } - if item == "volunteering" and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - section(title: title, entries: contents.volunteering)[] - } + if "volunteering" in main and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + section(title: title, entries: contents.volunteering)[] + } - if item == "skills" and "skills" in contents { - let title = (en: "Qualifications", de: "Qualifikationen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.skills) - }, - ) - } + if "skills" in main and "skills" in contents { + let title = (en: "Qualifications", de: "Qualifikationen").at(lang) + section( + title: title, + { + skill_item(item: contents.skills) + }, + ) + } - if item == "languages" and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.languages) - }, - ) - } + if "languages" in main and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + section( + title: title, + { + skill_item(item: contents.languages) + }, + ) } } let sidebar = { - for item in sidebar { - if item == "volunteering" and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - [== #title] - for e in contents.at("volunteering") { - [ - - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ - ] - } + if "volunteering" in sidebar and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + [== #title] + for e in contents.at("volunteering") { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] } + } - if item == "languages" and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - [== #title] - sidebar_entry(item: contents.languages, is_sidebar: true) - [\ ] - } + if "languages" in sidebar and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + [== #title] + skill_item(item: contents.languages, is_sidebar: true) + [\ ] + } - if item == "skills" and "skills" in contents { - let title = (en: "Qualifications", de: "Kenntnisse").at(lang) - [== #title] - sidebar_entry(item: contents.skills, is_sidebar: true) - } + if "skills" in sidebar and "skills" in contents { + let title = (en: "Qualifications", de: "Kenntnisse").at(lang) + [== #title] + skill_item(item: contents.skills, is_sidebar: true) } } @@ -149,6 +170,7 @@ align( right, block( + fill: luma(250), width: 90%, { v(15pt)