levineuwirth.org/yaml-source
Levi Neuwirth 6f916cac63
vita: roman venue and role lines, and stop chips restating the venue
"Preprint" in the venue line directly above a PREPRINT chip was a labelling
error: the venue says what the document is, so the chip should say what the
link yields. All four paper links are the full text, hosted here, so they
are labelled that way; Code, Calculator, and Artifact are unchanged. Fixes
the same redundancy on the CV, which read "Preprint. [Preprint]" and
"Technical report … [Report]".

The venue line is now roman. Citation convention italicizes journal and book
titles but not conference names or status words, and publications.yml
already marks the journal names it wants italic — so a blanket italic on the
line flattened that distinction (italic nested in italic reads as nothing)
and set "Preprint" in a register reserved for titles. Roman lets the data
carry the emphasis, and JAMIA's full name now actually renders italic inside
a roman line.

Role and degree lines lose their italic too. The size step down from the
title and the muted ink already separate them, so it was emphasis on a line
that only labels. The two font-style resets that existed solely to escape
these italics are gone with them.

Italic on these pages is now either data-level <em> or the dagger footnote.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SUGesXiMmACsLBTGG1xuEU
2026-08-11 09:51:29 +02:00
..
data vita: roman venue and role lines, and stop chips restating the venue 2026-08-11 09:51:29 +02:00
templates chore: track CV/résumé pipeline source 2026-08-10 23:40:01 +02:00
Makefile chore: track CV/résumé pipeline source 2026-08-10 23:40:01 +02:00
README.md chore: track CV/résumé pipeline source 2026-08-10 23:40:01 +02:00
build.py chore: track CV/résumé pipeline source 2026-08-10 23:40:01 +02:00

README.md

Levi Neuwirth — CV and Résumé

Single-source pipeline producing two PDFs from a shared YAML content store:

  • output/cv.pdf — multi-page academic CV.
  • output/resume.pdf — one-page industry résumé.

How it works

Content lives in data/*.yml, one file per logical section. Each entry has cv_visible and resume_visible flags that control whether it appears in the CV, the résumé, or both. The two Jinja2 templates in templates/ render into LaTeX, which xelatex compiles.

Building

make all       # build both PDFs
make cv        # build CV only
make resume    # build résumé only
make clean     # remove build/ and output/
make install   # pip install pyyaml + jinja2 (user install)

Requires: Python 3.9+, xelatex (TeX Live, MacTeX, or equivalent), Source Serif Pro and Source Sans Pro fonts. On most Linux distributions these fonts are in the texlive-fonts-extra or equivalent package; on macOS they're available through Homebrew (brew install --cask font-source-serif-pro font-source-sans-pro) or directly from Adobe.

Maintenance patterns

Add a new publication: edit data/publications.yml, append an entry, set cv_visible and resume_visible as appropriate. Rebuild.

Update a role: edit data/experience.yml. The cv_order and resume_order fields let you reorder per document.

Change the ordering on the résumé without changing the CV: adjust resume_order in experience.yml. The CV uses cv_order independently.

Move a project from "in progress" to "published": move its entry from projects.yml into publications.yml.

Hide something temporarily: flip its visibility flag to false. The entry stays in source, preserving history.

Page-count notes

  • Résumé is a clean 1 page. It holds five Experience entries (MARS V, Shu Lab, NeuroAI, xAI, contracting), 3 projects, education, and header. The fit depends on two deliberate choices: xAI is held to a single line (scope line dropped, metrics bullets removed — see below), and the résumé-only spacing in resume.tex.j2 (\titlespacing, itemize spacing, \parskip) is tuned so the last education note lands on page 1. Adding a multi-line Experience or Projects entry will spill onto a second page; when that happens, either trim content or nudge \parskip down (0.1em is the current value; page 1 still reads with air at that level).
  • xAI is intentionally de-emphasized. It sits fourth in Experience and is one line that keeps only the grok-code-fast-1 credential. The old scope line and the two metrics bullets (tool-execution / API-usage percentages, hallucination-rate reduction) were removed on purpose to keep both documents' centre of gravity on research; do not re-add them without a reason.
  • CV at 4 pages is normal for this level of output. Page 4 is sparse (Languages, Skills, Research Interests); tightening \titlespacing and \parskip in preamble.tex can collapse to 3 pages but tends to reappear at 4 as soon as new content is added.

Design notes

  • Body: Source Serif Pro. Headers: Source Sans Pro. Fully black and white.
  • Templates use LaTeX-safe Jinja delimiters: %% ... %% for blocks, (( ... )) for variables, %# ... #% for comments. This avoids collisions with LaTeX's own % and {}.
  • \entryheader in templates/shared/commands.tex is the unified organization/role/date/location block used by both templates.
  • The MARS V and Shu Lab entries have cv_section: research set in experience.yml, which routes them into the CV's "Research Experience" section while they still sit under plain "Experience" on the résumé. Other routing flags can be added similarly.
  • Ordering is per-axis. The résumé sorts Experience by resume_order (research-first: MARS V, Shu Lab, NeuroAI, then xAI and contracting). The CV templates render in file order within each section — the cv_order field is documentation of intent, not a sort key, so keep the YAML file order and cv_order consistent when reordering.

File layout

cv/
├── data/              # YAML content (source of truth)
│   ├── affiliations.yml
│   ├── education.yml
│   ├── experience.yml
│   ├── grants.yml
│   ├── personal.yml
│   ├── presentations.yml
│   ├── projects.yml
│   ├── publications.yml
│   └── skills.yml
├── templates/
│   ├── cv.tex.j2
│   ├── resume.tex.j2
│   └── shared/
│       ├── commands.tex
│       └── preamble.tex
├── build.py           # renders + compiles
├── Makefile
├── build/             # intermediate (.aux, .log, rendered .tex)
└── output/
    ├── cv.pdf
    └── resume.pdf