Every template here shares the same entry syntax: a listing is a table inside
a div with a style, written either by hand
::: {.entries style="detailed"}
| what | with | when |
|------------------|---------------------|-----------|
| Ph.D. in Physics | University of Paris | 1891-1895 |
:::or printed by a code cell, tagged with the same style:
```{r}
#| echo: false
#| vitae:
#| style: detailed
#| fields:
#| what: degree
#| with: institution
#| when: years
education |> filter(completed)
```The two are equivalent, but the code cell is usually the more useful of the
pair: your CV data lives in one data frame, and filter(), arrange() and the
rest of R, Python or Julia are what turn it into a job-specific CV — one
filter(...) away from a version tailored to a particular application,
without hand-editing a table.
Because the syntax is shared, switching designs is a one-line change to
format: — the same document renders in whichever of the templates below you
point it at.
| Template | Design | Install |
|---|---|---|
| awesomecv | Awesome-CV by Byungjin Park — a LaTeX CV with a matching cover letter format. | quarto use template quarto-vitae/awesomecv |
| hyndman | The CV style used by Rob J Hyndman — a shaded header box and coloured sans-serif section headings. | quarto use template quarto-vitae/hyndman |
| latexcv | All seven designs from jankapunkt/latexcv, from a plain centred résumé to a tinted sidebar — one repo, seven format: values. |
quarto use template quarto-vitae/latexcv |
Rendering these needs a LaTeX installation (quarto install tinytex if you
have none). Each repository's README covers its YAML options, listing styles,
and colour/font customisation in full.
Templates are built on curriculum,
the Lua filter that every template above embeds. It is the shared machinery
that lets a .entries table become a CV listing in any format, and it's what
"teaches" an ordinary Quarto extension to speak the vitae entry syntax:
- An author writes a listing as a table, or a code cell prints one and tags it
with
#| vitae: {style: ..., fields: ...}. curriculumfinds that data, applies anyfieldsrenaming, and hands each entry to your template's handler for that style — one small pandoc template per listing shape (entries/detailed.tex,entries/brief.tex, ...).- Everything else — an author's YAML header, section headings, colours — is ordinary Quarto format code with no filter involvement.
So building a new template means writing the usual Quarto extension (a
document class, a pandoc template, fonts) plus a handler per listing style you
support, and embedding curriculum into it with:
quarto add quarto-vitae/curriculum --embed yourcvThe full guide — _extension.yml conventions, resolving and overriding
handlers, style-naming conventions, and the embedding workflow in detail — is
at quarto-vitae.github.io/creating-templates,
with awesomecv as a working
template to read alongside it.