Skip to main content

Mx. Leah Velleman

Coder, linguist, singer, occasional blogger. See my Github profile or my résumé and how I build it.

Write a LaTeX résumé; don't use a template

21 Sep 2020

Writing your own resume in LaTeX is great. LaTeX resume templates are absolutely terrible. Luckily, they’re unnecessary.

Pros and cons

The LaTeX part is great. You can put it under source control. You can comment out different bits for different jobs. You get attractive results and a quiet sense of moral superiority.

LaTeX resume templates are absolutely terrible, though: ugly, inflexible, and a hassle to use.

Luckily, they’re unnecessary. You can get better results — including a flexible two-column layout that handles page breaks with grace — using a standard documentclass and a dozen or two lines of preamble.

image

Columns versus sidebars

Honestly, the only hard part here is the two-colum layout.

But wait, let’s back up. Why is it even hard? Doesn’t LaTeX have a twocolumn option?

The trouble is, normal LaTeX two-column layouts work like an old print newspaper — you read to the bottom of the first column, then start at the top of the second, and only turn the page when you’ve read both. This doesn’t work for a two-column resume, where the two columns have entirely different kinds of content.

Try this document to see what happens: the tiny text wraps around into the second column instead of staying in its lane.

\documentclass[11pt,oneside,twocolumn]{memoir}
\usepackage{lipsum}
\begin{document}
    \tiny\lipsum
    \large\lipsum
\end{document}

Fortunately, Memoir has a sidebar macro that does the right thing.

\documentclass[11pt, oneside]{memoir}
\usepackage{lipsum}
\begin{document}
    \sidebar{
        \large\lipsum}
    \tiny \lipsum
\end{document}

Your main text runs in a single large column. Sidebar content runs in a separate, smaller column that is technically in the right margin. Both get the benefit of LaTeX’s automatic spacing and page breaking, but both stay in their own lane.

The short answer

If you have simple needs and like the default TeX fonts, your entire preamble can look very much the examples in the previous section. Just make your right margin wide enough to fit your sidebar content — I went with 3 inches, specified on line 2 — and make a few more tweaks to spacing and section numbering.

\documentclass[11pt, oneside]{memoir}
\setlrmarginsandblock{0.5in}{3in}{*}
\setulmarginsandblock{0.5in}{0.7in}{*}
\setlength{\sidebarhsep}{0.5in}
\setlength{\sidebarwidth}{2in}
\setsidebarheight{\textheight}
\checkandfixthelayout
\setcounter{secnumdepth}{0}
\nonzeroparskip
\setlength{\parindent}{0pt}
\newcommand{\position}[2]{
     \subsubsection{#1\hfill\mdseries{#2}}}

That’s it, you’re done, twelve lines of preamble has you covered, and you can skip ahead to usage.

The long answer

The rest of the post is based on those last 12 lines of code. I’ll talk through how it works and provide a few extra lines of modern font setup.

First, as in the examples before, specify an 11-point font, and let even and odd pages have the same layout rather than being mirror images of each other. Without this, the columns would switch places from one page to the next.

\documentclass[11pt,oneside]{memoir}

Set narrow margins, except on the right (that second argument of \\setlrmarginsandblock again).

\setlrmarginsandblock{0.7in}{3in}{*}
\setulmarginsandblock{0.7in}{0.7in}{*}

Fill that wide right margin with a two-inch sidebar set off from the rest of the page by a half-inch gutter, and set the sidebar to the same height as everything else.

\setlength{\sidebarhsep}{0.5in}
\setlength{\sidebarwidth}{2in}
\setsidebarheight{\textheight}

Finalize the layout — in Memoir, unlike in plain LaTeX documentclasses like Article, this requires a special command, without which some settings won’t take effect.

\checkandfixthelayout

Fonts

Pick fonts you like. Here are some fonts I like.

\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{Brill}
\setsansfont[Ligatures=TeX, BoldFont=* Demi Bold]{Avenir Next}

(These fonts require the Fontspec package. They must be installed on your system, and they require you to compile your document using XeLaTeX. If you want your favorite vanilla LaTeX fonts, set them up the way you’re accustomed to instead.)

Make the default font sans-serif — I only use the roman as a display font. You could skip the font contrast entirely if you wanted.

\renewcommand{\familydefault}{\sfdefault}

If you wanted a special font in the sidebar, or special spacing in the sidebar, you could also \renewcommand{\sidebarfont}. I don’t recommend this, though — it’s too visually busy for me.

Paragraph style

Resumes often have bullet lists. I disapprove. Bullets are good for distinguishing list items from the main text that surrounds them. But resumes don’t have any “main text” — they’re all lists (and headers). So there’s no need for bullets.

This means we don’t need to use the LaTeX itemize environment. Items can just be paragraphs, with their indent removed.

\setlength{\parindent}{0pt}

To separate them, add a bit of extra vertical space. Memoir has a special macro for this that applies the amount its author likes best, which suits me fine.

\nonzeroparskip

If you want to do the same thing in the sidebar, you need to declare it separately, which means redefining \\sidebarfont after all.

\renewcommand{\sidebarfont}{
    \normalsize\normalfont
    \nonzeroparskip}

But I don’t actually do this in my resume. I find the narrow sidebar looks better typeset tighter.

Headings

Headings like Experience, or names of employers, can be generated using section commands. By doing it this way rather than writing my own macros from scratch, I avoided having to even think about all the spacing-related edge cases that can come up — I could just trust that the documentclass had handled them.

To section headers them from appearing like 1.2 Experience instead, remove section numbering.

\setcounter{secnumdepth}{0}

Headings of different depths are normally different sizes in Memoir. But on a crowded page with a lot of other design elements, too many sizes can look hectic and janky. Take the number of sizes down to two, with the lowest heads the same size as body text.

\setsubsubsecheadstyle{\normalsize\bfseries}
\setsubsecheadstyle{\Large\bfseries}

For the highest level headings, use a small rule for emphasis to avoid needing a larger font. Earlier I said you should override defaults in a conservative direction. This is the one decision I’ve made that violates that suggestion — by introducing rules to a style that didn’t have them before. I think I’ve gotten away with it, but it’s something I did carefully.

\newcommand{\ruledsec}[1]{
    \Large\bfseries #1 \par\vskip-2mm
    \rule{1in}{0.1mm}
    \par\vskip-2mm}
\setsecheadstyle{\ruledsec}

Treat the names of jobs, studentships, and so on as subsection titles (within larger sections such as Experience or Education). Create a special command that will set the name of the position flush left, and the dates in a lighter weight flush right.

\newcommand{\position}[2]{\subsubsection{#1
    \hfill\sffamily
    #2}}

Crucially, though, all it does is call a normal sectioning command to create a normal section title with some stretchy horizontal space and a font change in the middle. So you aren’t making a bunch of hard decisions about spacing, page breaking, and the dozens of edge cases they bring up. You’re just reusing code you trust.

Usage

That’s the end of the preamble. Time to fill in your own content for the rest.

The title

Your name and contact information should go at the top of your resume.

If you wanted to this format to work with any name, then you’d want a fully flexible macro here that could attractively accommodate text from နု through Kiefer William Frederick Dempsey George Rufus Sutherland and beyond. Even for personal use, you might want such a thing: I changed my name a few years into my career, and others use different names in different countries or industries.

Luckly, I’ve got no further changes planned. I just put my own personal details in some minipages and positioned them where they looked good — name in the main column, contact info in the sidebar. You could swap in your own details here, or design a totally different title.

\begin{document}
\begin{minipage}[t][0.6in][b]{4in}
    {\fontsize{34pt}{40pt}\selectfont
        \rmfamily\textbf{Leah Velleman, Ph.D.}}
    \vfill
    \textsf{Technical writer, editor, 
        mentor, and toolsmith since 2007}
\end{minipage}
\sidebar{\begin{minipage}[t][0.6in][b]{1in}
    www.velleman.org
    \vfill
    leahvelleman\@gmail.com
    \vfill
    www.github.com/leahvelleman
\end{minipage}}
\vskip15pt

After that comes the main body.

\sidebar{
    \section{Skills}
    \subsection{Writing}
    ...
    \subsection{Editing}
    ...
}

\sidebar{
    \section{Technology}
    Python
    \LaTeX
    Sphinx
    ...
}

\section{Experience}
\subsection{MathWorks}
\position{Senior Technical Content Editor}{2018--present}
\position{Technical Content Editor}{2015--present}

Edit complex, high-profile documentation and UX 
text for structure, clarity, and voice.

Advocate organizationwide for communication best 
practices and readers’ needs.
...
\end{document}

The thing to notice here is that, except for the presence of a few \\sidebar macros, this is totally idiomatic LaTeX. You can write it without thinking.

Conclusion

Don Knuth had a beautiful vision of a world. where any would-be designer could cook up their own TeX format.

Sadly, making that vision a reality is a terrible, terrible idea. Writing your own page layout code is almost always a mistake, for the same reason writing your own datetime library is a mistake: it’s hard, it’s full of shitty edge cases, and someone more pedantic than you has already done it right.

(For what it’s worth, the last decade or so of CSS frameworks has made the same point: don’t write your own CSS if you can help it, even if it’s a simple static site and you have the ability; use someone else’s, someone you trust, and then consciously tweak the few details that need tweaking. Using the Memoir documentclass for a simpler, less rich information type than the full multi-volume book it was designed for is very much in that spirit.)