4.2 KiB
Mike Eberlein — Resume
Single-page resume for Mike Eberlein (Engineering Manager — automotive infotainment / software-defined vehicles).
Single content source: resume.yaml. Two renderers (LaTeX and ODT) read the YAML and emit format-specific files. DOCX is produced by converting the ODT with LibreOffice. Edit resume.yaml; the generated .tex should not be edited by hand.
Two flavors are produced from the same YAML:
- Short — condensed single-page resume. Outputs:
MikeEberlein_Resume.{tex,pdf,odt,docx}. - Detailed — longer version with extra bullets / roles / jobs. Outputs:
MikeEberlein_Resume_Detailed.{tex,pdf,odt,docx}.
Files
| File | Purpose |
|---|---|
resume.yaml |
Source of truth. Edit this. |
render_tex.py |
YAML → MikeEberlein_Resume.tex. LaTeX preamble lives inline. |
render_odt.py |
YAML → MikeEberlein_Resume.odt. ODT styles live inline. |
MikeEberlein_Resume.tex |
Generated. Do not edit by hand. |
MikeEberlein_Resume.pdf |
Built from .tex via pdflatex. |
MikeEberlein_Resume.odt |
Built from YAML via render_odt.py. |
MikeEberlein_Resume.docx |
Built from .odt via LibreOffice. |
Makefile |
Build orchestration. |
fonts/ |
Official Google Roboto font repo. Variable fonts at the top level; individual weights under fonts/static/. License in fonts/OFL.txt. Used by both build paths: lualatex loads from fonts/static/; the ODT renderer embeds these .ttf files inside the ODT zip. |
Build
make # short PDF (default)
make odt # short ODT
make docx # short DOCX
make short # short PDF + ODT + DOCX
make detailed # detailed PDF + ODT + DOCX
make all # both flavors, every format
make clean # remove TeX aux files
make distclean # also remove generated PDF/ODT/DOCX/TEX
Run the renderers directly if you want a custom output path:
python3 render_tex.py --level=full --output=foo.tex
python3 render_odt.py --level=short --output=foo.odt
Required system packages (Debian/Ubuntu):
sudo apt install texlive-latex-recommended texlive-latex-extra texlive-luatex
sudo apt install libreoffice # for the .docx output
sudo apt install python3-yaml # for the renderers (usually pre-installed)
The PDF build uses lualatex with fontspec, loading Roboto directly from fonts/static/. No dependency on TeX Live's roboto package or any system-installed Roboto. The ODT/DOCX outputs embed the Roboto faces inside the document zip, so the resume looks correct even on a machine with no Roboto installed.
Editing
Open resume.yaml. The schema:
header: { name, tagline, email }
summary: <paragraph>
experience:
- company, dates
roles:
- title, dates
# either:
bullets: [ ... ]
# or, for nested sub-roles (used for one role with concurrent focus areas):
subroles:
- title, dates
bullets: [ ... ]
education:
- school, dates, bullets
certifications: [ ... ]
Short vs. Detailed
Any list field above can have a sibling list with the _full suffix. The base list always renders. The _full list is appended only in --level=full. Examples:
bullets: # always shown
- Short bullet.
bullets_full: # appended in detailed only
- Extra detail bullet.
subroles:
- { title: Always-shown sub-role, ... }
subroles_full:
- { title: Detailed-only sub-role, ... }
experience: [ ... ]
experience_full: # an entire extra job, only in detailed
- { company: ..., dates: ..., roles: [ ... ] }
Same convention works on roles_full, education_full, certifications_full.
After editing, make all rebuilds both flavors in every format from the same YAML.
Layout / styling
Both renderers contain their own styling code (LaTeX preamble in render_tex.py, ODT XML styles in render_odt.py). Tweak typography, colors, spacing, etc. there. The two renderers aim for visual parity but are not byte-identical — pdflatex and LibreOffice differ on font metrics and line breaking.
The DOCX is produced from the ODT (LibreOffice's ODT→DOCX conversion is essentially lossless because the formats are siblings). DOCX fidelity is therefore nearly identical to ODT.