Universe

Create project in app

A professional, elegant academic CV template built with Typst. Designed for researchers and academics who value clean typography, structured content, and maintainable source code. The name “Acadennial” reflects a perennial academic CV: a single, polished record that grows with your career.

View the full example: examples/cv.pdf

Features

  • Powered by Typst — Faster compilation, simpler syntax, and easier setup than LaTeX; works locally or in the Typst web app
  • Highly customizable — Configure fonts, margins, column ratios, text weights, and spacing through simple parameters
  • Three-column layout system — Flexible grid-based layout with configurable column widths and gutters for precise alignment
  • Modern typography — Uses Alegreya for body text and Helvetica for headings, with careful spacing and alignment
  • Structured content helpers — Dedicated functions for employment history, research entries, and publications with consistent formatting
  • Automatic publication numbering — Continuous numbering across preprints, journals, conferences, workshops, and posters
  • Academic social icons — Built-in icons for Google Scholar, LinkedIn, GitHub, ORCID, X/Twitter, and custom links with customizable styling

Quick Start

1. Install Required Fonts

This template uses the Alegreya font family. Download and install the fonts before compiling:

  1. Visit Google Fonts - Alegreya
  2. Click “Download family” to get the font files
  3. Important: Typst currently does not support variable fonts. Install the static font files from the static/ folder in the downloaded package
  4. Install the fonts on your system:
    • macOS: Double-click each .ttf file and click “Install Font”
    • Windows: Right-click each .ttf file and select “Install”
    • Linux: Copy .ttf files to ~/.local/share/fonts/ and run fc-cache -f -v

2. Initialize the Template

Use the following CLI command to initialize a new project from this template:

typst init @preview/acadennial-cv

Or search for acadennial-cv on Typst Universe to use it directly in the web app.

Usage Guide

The typical workflow for creating your CV:

  1. Configure default column layout — Set up col-cfg with your preferred column widths and gutter spacing
  2. Bind configuration to functions — Use .with() to apply the configuration to all helper functions
  3. Initialize the resume — Set up document metadata and author information
  4. Add content sections — Use Typst headings (==) and helper functions to add education, experience, publications, etc.

Best practice: Refer to template/cv.typ for a complete working example with all sections and helper functions.

Basic Structure

#import "@preview/acadennial-cv:0.1.0": *

// 1. Default function configurations
#let col-cfg = (
  c1-len: 15%, c2-len: 1fr, c3-len: auto, col-gutter: 1em,
)
#let employment-head = employment-head.with(..col-cfg)
#let meta-entry-item-list = meta-entry-item-list.with(..col-cfg)
// ... bind other functions

// 2. Initialize resume
#show: resume.with(
  col-args: (c1-len: col-cfg.c1-len, c2-len: col-cfg.c2-len, col-gutter: col-cfg.col-gutter),
  author-info: (name: "Your Name", primary-info: [...], secondary-info: [...]),
)

// 3. Add content sections
== Education
#employment-head-item-list(
  (c2: "University Name", c3: "City, State", body: [Ph.D. in Computer Science, 2025]),
)

== Publications
#pubs-reset()
#pub-item-list([*Your Name*, Co-authors. Paper Title. _Conference_, 2024.])

Section-Specific Customization

You can override default configurations for individual sections:

// Override text weight for a specific section
== Academic Service
#meta-entry-item-list(
  c2-text-args: (weight: "regular"),  // Non-bold titles for this section only
  (c1: "2024", c2: "Program Committee Member, Conference Name"),
)

For detailed function parameters and advanced customization, see the API Reference below.

API Reference

resume() — Document Setup

Initialize the CV document with global settings and author information.

#show: resume.with(
  // Paper and layout
  paper: "a4", // or "us-letter"
  margin: (left: 0.95in, right: 0.95in, top: 0.9in, bottom: 0.9in),

  // Typography
  text-args: (
    font-family: "Alegreya",
    font-size: 10pt,
  ),
  heading-args: (
    font-family: "Arial",
    level1-font-size: 20pt,
    level3-align: right,
  ),

  // Paragraph spacing
  par-args: (
    leading: 0.55em,
    spacing: 1em,
  ),

  // Link styling
  link-line-args: (
    stroke: 0.5pt + luma(200),
    offset: 2pt,
  ),

  // Column configuration
  col-args: (
    c1-len: 15%,
    c2-len: 1fr,
    col-gutter: 1em,
  ),

  // Author configuration
  author-args: (
    web-font-family: "Courier New",
    web-font-size: 0.95em,
  ),

  // Author information
  author-info: (
    name: "Your Name",
    primary-info: [
      Position Title \
      Department Name \
      Institution \
      City, State
    ],
    secondary-info: [
      #link("mailto:email@university.edu")[email\@university.edu] \
      #link("https://website.com")[https://website.com]
    ],
  ),
)

Parameters:

  • paper: Page size ("a4" or "us-letter")
  • margin: Page margins (dictionary with left, right, top, bottom)
  • text-args: Body text settings (font-family, font-size)
  • heading-args: Heading styles (font-family, level1-font-size, level3-align)
  • par-args: Paragraph spacing (leading, spacing)
  • link-line-args: Link underline styling (stroke, offset)
  • col-args: Default column configuration for all functions
  • author-info: Author name and contact information

Employment Functions

employment-head(c2, c3, ...)

Institution header without body content.

#employment-head("Stanford University", "Stanford, CA")

Parameters:

  • c2: Institution name (displayed in small caps, bold)
  • c3: Location (displayed in italics)
  • c1-len, c2-len, c3-len: Column widths
  • col-gutter: Space between columns
  • c2-text-args: Text styling for institution name (default: (weight: "bold"))
  • c3-text-args: Text styling for location (default: (style: "italic"))

employment-head-item(c2, c3, body, ...)

Institution header with indented body content.

#employment-head-item(
  "Stanford University",
  "Stanford, CA",
)[
  Ph.D. in Computer Science, June 2025 \
  _Thesis:_ Deep Learning for Systems \
  _Advisor:_ Prof. Name
]

Additional Parameters:

  • body: Content to display below the header (with left padding)
  • body-pad-left: Left padding for body content (default: 2em)

employment-head-item-list(...items)

Batch render multiple institution items.

#employment-head-item-list(
  (c2: "Stanford", c3: "CA", body: [Ph.D. in CS, 2025]),
  (c2: "MIT", c3: "MA", body: [B.S. in CS, 2020]),
)

Additional Parameters:

  • item-spacing: Vertical space between items (default: 1em)

Meta Entry Functions

meta-entry(c1, c2, c3, ...)

Three-column entry without body content.

#meta-entry("2024", "Best Paper Award", "Conference Name")

Parameters:

  • c1: Left column (typically dates or labels)
  • c2: Middle column (title or description, bold by default)
  • c3: Right column (location or affiliation, italic by default)
  • c1-text-args: Text styling for left column (default: (:) — no special styling)
  • c2-text-args: Text styling for middle column (default: (weight: "bold"))
  • c3-text-args: Text styling for right column (default: (style: "italic"))
  • c1-len, c2-len, c3-len, col-gutter: Column configuration
  • align: Column alignment (default: (left, left, right))

meta-entry-item(c1, c2, c3, body, ...)

Three-column entry with body content.

#meta-entry-item(
  "2023–2024",
  "Research Scientist",
  "Company Inc., City, State",
)[
  Developed machine learning systems for production deployment.
  Achieved 40% latency reduction through model optimization.
]

meta-entry-item-list(...items)

Batch render multiple entries.

#meta-entry-item-list(
  (
    c1: "2024",
    c2: "Research Intern",
    c3: "Google, CA",
    body: [Worked on distributed systems.],
  ),
  (
    c1: "2023",
    c2: "Teaching Assistant",
    c3: "Stanford, CA",
    body: [Taught CS101 to 200+ students.],
  ),
)

Configuration Override Example:

// Override default bold text for a specific section
#meta-entry-item-list(
  c2-text-args: (weight: "regular"),  // Non-bold titles
  item-spacing: 0.8em,                // Tighter spacing
  (c1: "2024", c2: "Program Committee Member, ICML"),
  (c1: "2023", c2: "Reviewer, NeurIPS"),
)

Publication Functions

pubs-reset()

Reset the publication counter to 1. Call this once before your first publication section.

== Publications
#pubs-reset()

pub-item(body, ...)

Single numbered publication item.

#pub-item[
  *Your Name*, Co-author 1, Co-author 2. Paper Title.
  In _Proceedings of ICML_, pages 1–14, 2024.
]

Publications are automatically numbered [1], [2], etc., in order of appearance.

pub-item-list(...items)

Batch render multiple publications.

=== Conference
#pub-item-list(
  [*Your Name*, Authors. Paper 1. _ICML_, 2024.],
  [*Your Name*, Authors. Paper 2. _NeurIPS_, 2023.],
)

=== Journal
#pub-item-list(
  [*Your Name*, Authors. Article Title. _Nature_, 2024.],
)

Parameters:

  • c1-len, c2-len, c3-len: Column widths (default: publication number uses right alignment)
  • col-gutter: Space between columns (default: 1em)
  • item-spacing: Vertical space between items (default: 1em)

Academic Social Icons

The template provides six pre-configured icons for academic and professional links, commonly used in the secondary-info section of your CV header.

Available Icons

#google-scholar-icon()  // Google Scholar
#linkedin-icon()        // LinkedIn
#github-icon()          // GitHub
#orcid-icon()           // ORCID
#x-icon()               // X (formerly Twitter)
#link-icon()            // Generic link/website

Usage Example

#show: resume.with(
  author-info: (
    name: "Your Name",
    secondary-info: [
      #link("mailto:email@university.edu")[email\@university.edu] \
      #link("https://yourwebsite.com")[https://yourwebsite.com] \
      #link("https://scholar.google.com/citations?user=ID")[#google-scholar-icon()]
      #link("https://linkedin.com/in/username")[#linkedin-icon()]
      #link("https://github.com/username")[#github-icon()]
      #link("https://orcid.org/0000-0000-0000-0000")[#orcid-icon()]
    ],
  ),
)

Default Configuration

Icons are pre-configured in lib.typ with these default settings:

#let configured-icons = configure-icon-registry(
  color: luma(20%),   // Dark gray color
  height: 0.95em,     // Icon height relative to text
  baseline: 20%,      // Vertical alignment
)

Custom Icon Styling

To customize icon appearance globally, reconfigure the icon registry at the top of your CV:

#import "@preview/acadennial-cv:0.1.0": *

// Custom icon configuration
#let custom-icons = configure-icon-registry(
  color: rgb("#2563eb"),  // Blue color
  height: 1em,            // Slightly larger
  baseline: 15%,          // Different alignment
)

// Override default icons
#let google-scholar-icon = custom-icons.at("google-scholar-icon")
#let linkedin-icon = custom-icons.at("linkedin-icon")
#let github-icon = custom-icons.at("github-icon")
#let orcid-icon = custom-icons.at("orcid-icon")
#let x-icon = custom-icons.at("x-icon")
#let link-icon = custom-icons.at("link-icon")

// Continue with resume setup...

Per-Icon Customization

You can also customize individual icons inline:

#link("https://scholar.google.com")[
  #google-scholar-icon(color: rgb("#4285f4"), height: 1.1em)
]

Icon Parameters:

  • color: Icon color (accepts Typst color values: luma(), rgb(), etc.)
  • height: Icon height (e.g., 0.95em, 1em, 12pt)
  • baseline: Vertical alignment offset as percentage

Configuration Hierarchy

The template uses a hierarchical configuration system with three levels:

  1. Global defaults (in lib.typ)

    #let default-c1-len = 15%
    #let default-c2-len = 1fr
    #let default-col-gutter = 1em
    
  2. Document-level defaults (top of your CV)

    #let col-cfg = (c1-len: 15%, c2-len: 1fr, col-gutter: 1em)
    #let meta-entry-item-list = meta-entry-item-list.with(..col-cfg)
    
  3. Section-level overrides (per function call)

    #meta-entry-item-list(
      c2-text-args: (weight: "regular"),  // Override for this section only
      (c1: "2024", c2: "Content"),
    )
    

Priority: Section-level > Document-level > Global defaults

Common customizations:

  • Column widths: Adjust c1-len for wider date columns, col-gutter for spacing
  • Text styling: Override c1-text-args, c2-text-args, c3-text-args to change weight, style, size, color
  • Spacing: Modify item-spacing to control vertical spacing between entries
  • Alignment: Change align parameter for different column alignments

Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.

License

This project is licensed under the MIT License.

Acknowledgments