#let lang = sys.inputs.at("lang", default: "de") #set page(paper: "a4", margin: 2.5cm) #set text(font: "Linux Libertine O", size: 11pt, lang: lang) #show link: set text(fill: black) #let light = "Archivo Narrow" #let data = json("resume." + lang + ".json") #let months = ( de: ( "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember", ), en: ( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ), ) #let sections = ( de: ( work: "Berufserfahrung", education: "Ausbildung", skills: "Kenntnisse", languages: "Sprachen", publications: "Veröffentlichungen", ), en: ( work: "Work Experience", education: "Education", skills: "Skills", languages: "Languages", publications: "Publications", ), ) #let t = sections.at(lang) // Replace LaTeX-isms in JSON strings #let clean(s) = { s.replace("\\LaTeX", "LaTeX") .replace("\\-", "\u{00AD}") .replace("--", "\u{2013}") } // Convert "YYYY-MM-DD" → "MM/YYYY", pass through anything else (e.g. "heute", "present") #let simpledate(s) = { let parts = s.split("-") if parts.len() == 3 { parts.at(1) + "/" + parts.at(0) } else { s } } #let cvsection(title, body) = { line(length: 100%, stroke: 0.4pt) text(font: light, size: 10pt, tracking: 0.06em, upper(title)) v(0.5em) body } #let cvperiod(dates, body) = { grid( columns: (70%, 30%), body, align(right, dates), ) } #let cvhighlights(entry, fmt: h => [#h]) = { if "highlights" in entry and entry.highlights.len() > 0 { v(-0.2em) pad(left: 0.8em, list(spacing: 0.8em, ..entry.highlights.map(fmt)) ) v(0.3em) } } // ── Header ── #align(center)[ #text(font: light, size: 16pt, tracking: 0.18em, upper[#data.basics.title~#data.basics.name]) #v(1em) #text(font: light, size: 10pt, tracking: 0.12em, upper[ #data.basics.location.address #h(0.5em) • #h(0.5em) #data.basics.location.postalCode #data.basics.location.city #h(0.5em) • #h(0.5em) #data.basics.phone ]) #v(0.4em) #text(font: light, size: 10pt, tracking: 0.12em)[ #link("mailto:" + data.basics.email)[#upper[#data.basics.email]] #h(0.5em) • #h(0.5em) #link("https://github.com/matze")[#upper[github.com/matze]] #h(0.5em) • #h(0.5em) #link("https://bloerg.net")[#upper[bloerg.net]] ] ] #v(1em) // ── Work experience ── #cvsection(t.work)[ #v(-0.4em) #for work in data.work { cvperiod( [#simpledate(work.startDate)–#simpledate(work.endDate)], [#work.company], ) v(-0.2em) emph[#work.position] cvhighlights(work) v(0.2em) } #v(0.4em) ] // ── Education ── #cvsection(t.education)[ #v(-0.4em) #for stage in data.education { let degree = if stage.area != "" { stage.studyType + " " + stage.area } else { stage.studyType } cvperiod( [#simpledate(stage.startDate)–#simpledate(stage.endDate)], [#stage.institution], ) emph[#degree] cvhighlights(stage) v(0.6em) } #v(0.4em) ] // ── Skills ── #pagebreak(weak: true) #cvsection(t.skills)[ #v(-0.4em) #for skill in data.skills { grid( columns: (6.0em, 1fr), [#skill.name], clean(skill.keywords.join(", ")), ) } #v(0.4em) ] // ── Languages ── #cvsection(t.languages)[ #v(-0.4em) #for l in data.languages { grid( columns: (6.0em, 1fr), [#l.language], [#l.fluency], ) } ] #v(4em) // #v(1fr) // ── Signature ── #image("signature.png", width: 2cm) #{ let today = datetime.today() [#data.basics.location.city, #today.day(). #months.at(lang).at(today.month() - 1) #today.year()] } // ── Publications ── #pagebreak() #line(length: 100%, stroke: 0.4pt) #v(-0.2em) #text(font: light, size: 12pt, tracking: 0.12em, upper[#t.publications]) #v(1em) #bibliography("publications.bib", full: true, title: none, style: "ieee")