apatypstcv
This package provides helper functions for creating academic CVs with APA-style formatting using Typst and Quarto. It extends and modifies kazuyanagimoto/quarto-awesomecv-typst with specialized entry functions for academic CVs.
This work is inspired by:
- Byungjin Park’s Awesome-CV — A beautiful LaTeX template of CV
- Paul Tsouchlos’s modern-cv — A Typst implementation of Awesome-CV
- Mitchell O’Hara-Wild and Rob Hyndman’s vitae — R package for modern CV, including Awesome-CV
- kazuyanagimoto’s typstcv — Original R package for Typst CVs
Installation
You can install the development version of apatypstcv from GitHub with:
# install.packages("devtools
devtools::install_github("emmarshall/apatypstcv")Features
- Specialized entry functions for education, teaching, workshops, awards, and service
- Built-in link handling — no manual
paste0()required for URLs - APA-style bibliography sections with proper hanging indents
- Date-first entry format for service and awards
- Icon support for website and document links
Usage
library(apatypstcv)Use Template
Install the Quarto extension in your project:
quarto add emmarshall/quarto-awesomecv-typstYAML Configuration
Set author information in your QMD YAML header:
---
title: "CV"
author:
firstname: Paris
lastname: Geller
address: "123 Chilton Lane, Hartford, CT 06101"
position: "JD, MA, DDS"
contacts:
- icon: fa envelope
text: paris.geller@yale.edu
url: "mailto:paris.geller@yale.edu"
- icon: fa globe
text: parisgeller.com
url: "https://www.parisgeller.com"
brand:
typography:
fonts:
- family: Sora
source: google
weight: [400, 600, 700]
style: [normal]
- family: IBM Plex Sans
source: google
weight: [400, 500, 600, 700]
style: [normal, italic]
base: IBM Plex Sans
color:
primary: "#d00000"
link: "#202b47"
defaults:
awesomecv-typst:
font-header: Sora
format:
awesomecv-typst: default
---- Font Awesome icons are supported via duskmoon314/typst-fontawesome with
faprefix - SVG icons can be used by specifying the path to the icon file
Entry Functions
Education Entry
education_entry(educ)The education_entry() function automatically: - Links institutions when institution_url is provided - Formats thesis/concentration information
Teaching Entry
teaching_entry(
teaching,
links = list(c("website", "globe"), c("syllabus", "file-pdf"))
)The teaching_entry() function: - Combines title and course name - Formats institution, course number, size, and modality - Adds icon links for websites and syllabi
Workshop Entry
workshop_entry(
workshop,
links = list(c("website", "globe"), c("slides", "file-powerpoint"))
)The workshop_entry() function: - Combines type and title (e.g., “Guest Lecturer: Topic”) - Adds venue information - Includes icon links for materials
Date-First Entry (for Service, Memberships, Awards)
For entries where the date should appear on the left:
date_first_entry(
service,
date = "date",
title = "title",
description = "organization",
description_url = "organization_url"
)Output format:
2023 - 2025 Committee Member
American Psychology-Law Society
Generic Resume Entry
For custom entries or sections not covered by specialized functions:
resume_entry(
data,
title = "title",
title_url = "title_url",
location = "location",
date = "date",
description = "description",
description_url = "description_url",
description2 = "description2"
)APA Bibliography Sections
For publications and presentations using a .bib file:
# Publications
::: {.apa-bib}
[@citation_key1]
[@citation_key2]
:::
# Presentations
::: {.apa-bib mentee-note="true"}
[@presentation1]
[@presentation2]
:::The mentee-note="true" option adds “† Denotes undergraduate mentee” above the section.
Date Formatter
Format date ranges from Date columns:
work |>
format_date(
start = "start",
end = "end",
date_format = "%Y",
sep = " - ",
sort_by = "start"
) |>
resume_entry()Recommended Workflow
- Create a data script (
data-raw/cv-data.R) with all your CV entries - Save data to
.rdafor easy loading - Keep your QMD simple — just load data and call entry functions
Example data-raw/cv-data.R:
library(tibble)
education <- tribble(
~degree, ~institution, ~institution_url, ~location, ~date, ~thesis_type, ~thesis_title,
"Ph.D. in Psychology", "University of Nebraska-Lincoln", "https://unl.edu", "Lincoln, NE", "2026", "Dissertation", "My Dissertation Title"
)
# ... more data ...
cv_data <- list(
education = education,
# ... more sections ...
)
save(cv_data, file = "data/cv_data.rda")Example cv.qmd:
#| label: setup
#| include: false
library(apatypstcv)
load("data/cv_data.rda")#| label: education
#| output: asis
education_entry(cv_data$education)Workflow:
- Edit
data-raw/cv-data.Rto add/remove/modify entries - Run
source("data-raw/cv-data.R")to regenerate the data - Render
cv.qmdwithquarto render cv.qmd
