Detecting...
...
--- --
--:--:--
RETURN_TO_LOGS

How to Build a Professional Resume PDF using LaTeX

Jul 11, 202610 min read

Building a Resume with LaTeXBuilding a Resume with LaTeX

Let's be real: trying to align a text box in Microsoft Word or Google Docs without the entire page shattering into a million pieces is a major L. If you're a developer, managing your resume shouldn't feel like you're fighting a WYSIWYG editor from 2010.

Enter LaTeX.

What is LaTeX and Why Should You Care?

LaTeX (pronounced LAY-tech or LAH-tech) is a high-quality typesetting system that essentially treats your document like a codebase. You write plain text mixed with markup tags (think HTML/CSS but for PDFs), and a compiler handles the heavy lifting of spacing, typography, and alignment.

It's the ultimate "docs-as-code" approach to your career.

The Tool Matchup: LaTeX vs. The Rest

If you're still using mainstream tools, here is why you might want to pivot:

  • Word / Google Docs: Easy to spin up, but their formatting is extremely fragile. Good luck keeping things pixel-perfect. Plus, they often spit out messy PDFs that ATS (Applicant Tracking Systems) struggle to parse.
  • Canva / Figma: Massive W for aesthetics, but an absolute nightmare for ATS. These design tools often render text as vector shapes or jumble the reading order. The robots reading your resume will literally see garbage.
  • LaTeX: Strict, predictable, and modular. You set up the layout rules once, and adding a new job is just calling a macro. No drag-and-drop required.

The TL;DR on LaTeX Pros and Cons

Pros (The Ws):

  • Perfect Consistency: Margins and spacing are mathematically calculated. No more weird gaps.
  • ATS-Friendly: Compiles into highly structured, machine-readable PDFs. The ATS parsers will eat it up.
  • Git-Native: It's just plain text. You can track your career progression in Git and host your resume repo on GitHub.
  • DRY (Don't Repeat Yourself): Change the styling in one place, and it globally updates.

Cons (The Ls):

  • The Learning Curve: The syntax looks a bit alien at first. (But hey, you code, you'll be fine).
  • Cryptic Debugging: Missing a single curly brace } can nuke your compilation with a completely unhelpful error message.
  • Zero Visual Flair: If you want neon gradients or complex UI elements, look elsewhere. LaTeX is built for clean, academic-level professionalism.

Alright, enough theory. Let's build this thing.


1. Initializing the Document (The Boilerplate)

Every LaTeX file kicks off by declaring its base class—essentially setting up your root framework. For a resume, the article class is the move.

\documentclass[a4paper,10pt]{article}

Breaking down the config:

  • \documentclass: Defines the global formatting rules.
  • a4paper: Standard A4 size. Swap to letterpaper if you're aiming for the US market.
  • 10pt: The base font size. Keep it between 10pt and 12pt so recruiters don't have to squint.
  • {article}: The perfect class for standard, chapter-less documents.

2. Importing Dependencies

Think of these like your npm packages. We need to pull in some essential utilities to make the resume look modern.

\usepackage[empty]{fullpage}
\usepackage{titlesec}
\usepackage[usenames,dvipsnames]{color}
\usepackage{enumitem}
\usepackage[hidelinks]{hyperref}
\usepackage{tabularx}
\usepackage[scaled]{helvet} % Modern Sans-Serif font
\renewcommand\familydefault{\sfdefault}
\usepackage[T1]{fontenc}

What's in the package.json?

  • fullpage: LaTeX defaults to massive margins. This package reclaims that screen real estate.
  • titlesec: Gives you API-like control over your \section headers.
  • enumitem: Lets you tweak the padding and bullets of your lists.
  • hyperref: Crucial. Makes your links actually clickable. The [hidelinks] flag stops LaTeX from drawing ugly boxes around them.
  • helvet & fontenc: Swaps the default academic serif font for a sleek, modern sans-serif.

3. Margin Hacks and ATS Parsability

Even with fullpage, we want to manually override the margins to maximize our content payload.

% Global margin overrides
\addtolength{\oddsidemargin}{-0.5in}
\addtolength{\evensidemargin}{-0.5in}
\addtolength{\textwidth}{1in}
\addtolength{\topmargin}{-.5in}
\addtolength{\textheight}{1.0in}

The ATS Cheat Code

This next part is non-negotiable. You need to ensure the PDF compiler maps your text to standard Unicode so the ATS bots can read it accurately.

\input{glyphtounicode}
\pdfgentounicode=1

If you skip this, copying text from your PDF might output gibberish, meaning an ATS will instantly ghost your application.


4. Building Reusable Components (Macros)

Here is where developers thrive. Instead of hardcoding tables every time you add a new role, we create a reusable macro using \newcommand.

First, let's inject some CSS-style rules for our main headers using titlesec:

% Section formatting
\titleformat{\section}{
  \vspace{-4pt}\scshape\raggedright\large
}{}{0em}{}[\color{black}\titlerule \vspace{-5pt}]

This forces all \section text to be small-caps (\scshape), left-aligned, and underlined (\titlerule).

Next, let's write our ResumeSubheading component:

\newcommand{\resumeSubheading}[4]{
  \vspace{-1pt}\item
    \begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
      \textbf{#1} & #2 \\
      \textit{\small #3} & \textit{\small #4} \\
    \end{tabular*}\vspace{-5pt}
}

Under the Hood:

  • [4] means this macro accepts 4 props.
  • It opens a table (tabular*) that spans 97% of the width.
  • l@{\extracolsep{\fill}}r is basically Flexbox justify-content: space-between. It pushes the first column left and the second column right.
  • \textbf{#1} & #2 renders Prop 1 (Role) bold on the left, and Prop 2 (Dates) on the right.
  • \textit{\small #3} & \textit{\small #4} renders Prop 3 (Company) and Prop 4 (Location) right below them.

5. Rendering the UI (The Content)

Time to actually write the resume. Everything goes inside the main document block.

The Header

\begin{document}

\begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}r}
  \textbf{\href{https://memoowi.site/}{\LARGE Your Name}} & Email: \href{mailto:you@example.com}{you@example.com}\\
  \href{https://memoowi.site/}{your-portfolio.dev} & Mobile: \href{tel:+1234567890}{+1-234-567-890} \\
  \href{https://github.com/yourhandle}{github.com/yourhandle} & LinkedIn: \href{https://linkedin.com/in/yourhandle}{linkedin.com/in/yourhandle} \\
\end{tabular*}

This stacks your contact info cleanly. The \href{url}{display text} command is basically an <a> tag.

Injecting Experience

Now we just call our custom macro and pass the props.

\section{Experience}
  \begin{itemize}[leftmargin=*] % Resets bullet padding
    
    \resumeSubheading
      {Senior Full Stack Engineer}{San Francisco, CA}
      {Tech Corp Inc.}{Jan 2024 -- Present}
      
      \begin{itemize}
        \item\small{Architected a scalable microservices ecosystem, boosting uptime by 99.9\%.}
        \item\small{Mentored a squad of 5 junior devs and built out the GitHub Actions CI/CD pipeline.}
      \end{itemize}

  \end{itemize}

Look how clean that is. No messy styling logic mixed with the content. If you want to change how the dates look later, you just update the macro definition at the top, and it trickles down instantly.


6. Compile and Ship It

Close out your file with:

\end{document}

To compile this into a PDF, you can either:

  1. The Cloud Route (Overleaf): Go to overleaf.com, drop in your code, and compile it right in the browser. Low friction, highly recommended.
  2. The Local Host Route: Install TeX Live on your machine, grab the LaTeX Workshop extension for VS Code, and compile on save.

Wrap Up

Moving your resume to LaTeX is a massive quality-of-life upgrade for any developer. You get pixel-perfect consistency, native version control via Git, and a document that breezes through ATS filters.

If you want to see an example of how this looks, check out the source code here.

Say goodbye to fighting word processors. Start treating your resume like the codebase it deserves to be.

#LaTeX#Resume#PDF#Career#Guide