# Making Your Résumé Beautiful And Maintainable With LaTeX

## What is $\LaTeX$?

LaTeX is a document mark-up language that is used to define how text is laid out on a page. I think of it as a computer language that compiles into a document rather than a program. It allows you latitude in developing custom styles and allows you to treat your text documents as you would code. It takes some work to setup a document in LaTeX, but once it is done you will have a beautiful document that behaves exactly as you want and is very easy to update and maintain.

For a little over a year I have been using LaTeX to write my resume. I have found that it creates a reliable and attractive finished product that I can modify very easily. LaTeX gives you a lot of control over the formatting without forcing you to manage readjusting the layout yourself every time you make a change. When I got started it took me about a day to figure out how to compile the LaTeX and then assemble my resume. I based my initial draft off of one I found online but then I expanded some of the environments, as I will show below.

This post is to demonstrate one way of creating a LaTeX resume. Obviously your resume style may be very different from mine, indeed depending on the position my resume can look very different compared to the format used below. This post will not provide a step-by-step guide to getting LaTeX up and running. It is very easy to do in most Linux distributions and I believe that the following link should help Windows folks: TexLive.

Please click to see full resume code, see below for information on individual components. To see how this document looks when compiled look at the pdf at the bottom of the page.

% Modified Jul 5,2013

\documentclass[10pt, letterpaper, oneside]{article}

\usepackage{geometry}
\usepackage[T1]{fontenc}
\usepackage[dvipsnames]{color}
\usepackage{multirow}
\usepackage{tabularx}
\usepackage{multicol}
\usepackage{enumitem}

\pagestyle{plain}

\setlength{\parindent}{0in}
\setlength{\parskip}{0in}

% Name and contact information
\newcommand{\name}{Campbell Hennessy}
\newcommand{\street}{xxxxxx}
\newcommand{\city}{Smalltown ON}
\newcommand{\postal}{AAA AAA}
\newcommand{\phone}{(123) 456-7890}
\newcommand{\email}{campbell.hennessy@gmail.com}

% Colors
\definecolor{light-grey}{gray}{0.8}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Commands and Environments for resume

% A horizontal rule for sections
\newcommand{\HRule}[2]{\textcolor{#1}{\rule{\linewidth}{#2}}}

% A section tile command
\newcommand{\sectiontitle}[1]{\begin{minipage}{\textwidth}\HRule{black}{0.25mm}\vspace{-10pt}\begin{center}\Large\MakeUppercase{#1}\end{center}\end{minipage}\\\HRule{light-grey}{0.15mm}\vspace{\baselineskip}}

% An environment for a resume section
\newenvironment{ressection}[1]{
\sectiontitle{#1}}
{\vspace{-\baselineskip}}

% A ressection that has to be on one page, awards, education etc
\newenvironment{tightressection}[1]{
\begin{minipage}{\textwidth}
\sectiontitle{#1}}
{\vspace{\baselineskip}\end{minipage}}

% A column if there is a two columned section such as in awards
\newenvironment{rescolumn}{
\begin{minipage}{0.5\textwidth}
\begin{itemize}[noitemsep,nolistsep]}
{\end{itemize}
\end{minipage}}

% A resitem is a simple list element
\newcommand{\resitem}[1]{
\vspace{2pt}
\item \begin{flushleft} #1 \end{flushleft}
}

% An entry for memberships
% Arg1: Board
% Arg2: Position
% Arg3: Date
\newcommand{\boardentry}[3]{
\begin{minipage}{\textwidth}
\vspace{-9pt}
\textbf{#1}\\
\textit{#2}, \textit{#3}\\
\vspace{0.5\baselineskip}
\end{minipage}
}

% An entry for education
% Arg1: Institution
% Arg2: Program
% Arg3: Dates
\newcommand{\resedentry}[3]{
\begin{minipage}{\textwidth}
\vspace{-10pt}
\textbf{#1}\\
\textit{#2}\hfill\textcolor{light-grey}{#3}\\
\vspace{0.5\baselineskip}
\end{minipage}
}

% Resentry defines a position
% Arg1: Position title
% Arg2: Company or Office---Company
% Arg3: Location, PROV
% Arg4: Date Range
\vspace{-5pt}
\textbf{#1}\hspace{\stretch{1}}\textcolor{light-grey}{#3}\\
\textit{#2}\hspace{\stretch{1}}\textcolor{light-grey}{#4}\\
}

% This is a resume entry with a header and bullet items
\newenvironment{resentry}[4]{
\begin{minipage}{\textwidth}
\vspace{-\baselineskip}
\begin{itemize}[noitemsep,nolistsep]
}{
\end{itemize}
\vspace{\baselineskip}
\end{minipage}
}

%%%%%%%%%%%%
% Begin The Resume

\begin{document}

\begin{tabularx}{\linewidth}{X r}
\multirow{3}{*}{\Huge\textbf{\name}} & \\& \email\\\\
\end{tabularx}\\

\begin{ressection}{experience}
\begin{resentry}{Inshore Rescue Boat Coxswain (Summers)}{Inshore Rescue Boat Program --- Canadian Coast Guard}{Hill Is, ON}{May 2012 --- Present}
\resitem{Command a Coast Guard fast rescue craft (FRC) and Coast Guard station.}
\resitem{Responsible for the on-site training and direction of two crewmembers.}
\resitem{Responsible to respond within 15 minutes as the primary marine search and rescue unit in our operational area to search and rescue taskings provided by the Joint Rescue Coordination Centre.}
\resitem{Responsible for carrying out public search and rescue prevention programs such as Pleasure Craft Courtesy Checks and informational interviews.}
\end{resentry}

\begin{resentry}{Lab Assistant}{Department of Electronics --- Carleton University}{Ottawa, ON}{January 2013 --- April 2013}
\resitem{Assist in the labs for a new third year electrical engineering project course.}
\resitem{Act as a consultant for the students on topics relating to embedded hardware and software design.}
\resitem{Assist in diagnosing technical problems and directing students to appropriate technical resources.}
\end{resentry}

\begin{resentry}{Senior Campus Tour Guide}{Undergraduate Recruitment --- Carleton University}{Ottawa, ON}{September 2009 (Senior: October 2011) --- Present}
\resitem{Provide 1.5 to 2 hour campus tours and information to prospective students and their families.}
%    \resitem{Work with other tour guides to staff departmental recruitment events.}
%    \resitem{Organize tour structure dynamically to present to the interests of the guests.}
\resitem{As a Senior Guide, evaluate and advise new guides and participate in special recruitment events.}
\resitem{Represent Carleton Engineering at the Ontario Universities Fair (2011 and 2012).}
\end{resentry}

\begin{resentry}{Research Assistant}{Department of Electronics --- Carleton University}{Ottawa, ON}{January 2012 --- May 2012}
\resitem{Assisted Professor Alan Steele with research into open hardware electronics.}
\resitem{Designed and tested circuits and sensors for use in a micro-aerial vehicle (MAV).}
\resitem{Designed an integrated electronics platform for further MAV research based around the ATMega1284 microcontroller}
\end{resentry}

\begin{resentry}{Teaching Assistant}{Department of Mathematics and Statistics --- Carleton University}{Ottawa, ON}{September 2009 --- December 2011}
\resitem{Ran weekly tutorial sessions for 30 to 40 students in engineering/business calculus and linear algebra.}
\resitem{Marked all tests and assignments for students in my tutorial section.}
\resitem{Provided students with weekly office hours to answer any questions and to provide additional assistance.}
\end{resentry}

\begin{resentry}{Inshore Rescue Boat Crew (Summers)}{Inshore Rescue Boat Program --- Canadian Coast Guard}{Hill Is. and Brebeuf Is., ON}{May 2010 --- August 2011}
\resitem{Carried out responsibilities of a crew member on a Canadian Coast Guard FRC.}
\resitem{Operated all equipment on the FRC including radio and electronic navigation systems.}
\end{resentry}

\begin{resentry}{Residence Fellow}{Department of Housing and Conference Services --- Carleton University}{Ottawa, ON}{August 2008 --- May 2010}
\resitem{Worked within a team of all residence life staff in order to develop initiatives to create a welcoming environment for residence students.}
%    \resitem{Directed residents to appropriate University support services.}
\resitem{Provided encouragement and support to students on my floor in residence.}
\resitem{Helped resolve disputes between roommates and other students on the floor.}
%    \resitem{Designed active and passive programs to educate and involve students.}
\end{resentry}

\begin{resentry}{Kitchen Assistant}{Camp Chief Hector --- Calgary YMCA/YWCA}{Exshaw, AB}{May 2009 --- August 2009}
\resitem{Worked as a kitchen assistant at an overnight children's summer camp.}
\end{resentry}

\begin{resentry}{Summer Orientation Leader (Parent Outreach)}{First Year Experience Office --- Carleton University}{Ottawa, ON}{May 2008 --- August 2008}
\resitem{As a member of a team, engaged new university students and their families in informative sessions about academic and social life at Carleton University.}
%   \resitem{Guided incoming students on campus tours.}
\resitem{Kept informed of plans and programs at Carleton University and informed about general trends at
\resitem{Encouraged incoming students to get involved at Carleton.}
\end{resentry}

\begin{resentry}{Lifeguard/Swimming Instructor/Pool Staff}{Perth Indoor Swimming Pool}{Perth, ON}{August 2005 --- August 2007}
\resitem{Worked as a lifeguard, swimming instructor and day camp councilor.}
\end{resentry}

\end{ressection}

% Volunteer Experience
\begin{ressection}{Extra-Curricular/Volunteer work}
\begin{resentry}{Medical First Responder}{Carleton University Student Emergency Response Team --- Carleton University}{Ottawa, ON}{September 2007 --- Present}
\resitem{Work as a member within the team to provide medical first response services to Carleton University.}
\resitem{Assist members of the Carleton community, using training as an Advanced Medical First Responder, with injuries or medical emergencies}
\resitem{Cover at least one twelve hour shift and attend at least two hours of training each week}
\end{resentry}

\begin{resentry}{Trainer}{Carleton University Student Emergency Response Team --- Carleton University}{Ottawa, ON}{Sept 2010 --- Dec 2012}
\resitem{Run weekly trainings for team members to review and improve their first aid skills.}
\resitem{Develop practice and evaluation scenarios for members}
\resitem{Hold office hours as necessary to give specific help to team members when needed.}
%  \resitem{Assist in the evaluation of team members to determine their eligibility to go on call.}
\end{resentry}

\begin{resentry}{Conference Director}{2011 Mixer Committee --- Association of Campus Emergency Response Teams}{Ottawa, ON}{February 2011 --- November 2011}
\resitem{Lead a team of volunteers to organize a national conference for campus emergency responders.}
\resitem{Responsible for the overall financing and organizing the conference.}
\resitem{Hosted over 160 delegates from universities in Ontario, Quebec and British Columbia for the 3 day conference.}
\end{resentry}

\end{ressection}

% Awards
\begin{tightressection}{awards}
\begin{rescolumn}
\resitem{John Matheson Leadership Award (\$100), 2007} \resitem{Charles and Helen Pattenson Scholarship (\$3000), 2007}
\resitem{Claude Bissell Scholarship (\$3000), 2008} \resitem{Murdoch Maxwell MacOdrum Scholarship (\$3000), 2009}
\end{rescolumn}
\begin{rescolumn}
\resitem{David A. Golden Scholarship (\$3000), 2010} \resitem{Manimaran Kanagasabapathy Memorial Scholarship (\$1720), 2010 \& 2011}
\resitem{Adrian D.C. Chan Award for Volunteer and Community Service (\\$500), 2013}
\resitem{University Medal for Engineering (Carleton University), 2013}
\end{rescolumn}
\end{tightressection}

% Publications
\begin{itemize}[noitemsep,nolistsep]
\resitem{Presentation: Design of an Open Source Hardware Sensor and Data Logging Unit''.  Presented at the National Conference on Undergraduate Research, University of Wisconsin - La Crosse, April 2013.}
\resitem{Presentation of Unpublished Paper: Inside Everything: Strategies to Promote Taiwan's Continued Importance in the Global Semiconductor Market''. Presented at the National Chengchi University, Taipei, October 2012.}
\end{itemize}
\end{tightressection}

% Qualifications
\begin{tightressection}{current qualifications}
\begin{rescolumn}
\resitem{Advanced Medical First Responder (St John Ambulance, re-certified September 2010)}
\resitem{CPR Healthcare Provider Level (Ottawa Paramedic Service, re-certified September 2012)}
\resitem{Standard First Aid/CPR C (Ottawa Paramedic Service, re-certified September 2012)}
\resitem{Oxygen Administration \& AED (Ottawa Paramedic Service, re-certifiedSeptember 2012)}
\end{rescolumn}
\begin{rescolumn}
\resitem{Small Vessel Operator Proficiency (Transport Canada, May 2010)}
\resitem{Rigid Hull Inflatable Operator Training (Transport Canada, May 2010)}
\resitem{Marine Emergency Duties A3 (May 2010)}
\resitem{Marine VHF Operator License with DSC option (April 2010)}
\resitem{Pleasure Craft Operator's Card}
\end{rescolumn}
\end{tightressection}

%Boards and Committees
\begin{tightressection}{Boards and Committees}
\boardentry{Carleton University Amateur Radio Club Executive}{Operations Executive}{September 2011 --- May 2013}
\boardentry{Canadian Association of Campus Emergency Response Teams (ACERT)}{Member of the Board of Directors}{February 2012 --- May 2013}
\boardentry{CUSERT Executive Selection Board}{Member (2011), Chair (2012)(2013)}{Annually in April, 2011 --- 2013}
\boardentry{Adrian D.C. Chan Award Committee}{Student Member}{October 2011 --- March 2012}
\boardentry{ACERT Mixer Committee}{Chair}{February 2011 --- November 2011}
\boardentry{CUSERT Executive}{External-Communications}{May 2008 --- May 2009}
\end{tightressection}

% Education
\vspace{-15pt}
\begin{tightressection}{education}
\resedentry{Carleton University}{Bachelor of Engineering (Computer Systems) (CGPA: 11.90/12)}{September 2009 --- May 2013}
\resedentry{Carleton University}{Bachelor of Public Affair and Policy Management (Incomplete) (CGPA: 11.45/12)}{September 2007 --- April 2009}
\end{tightressection}

\end{document}


## Document Setup

First you have to setup constants that define what packages to use (these are a part of LaTeX). I setup some constants for details on myself that I can use in the resume as well as a definition for a color I use to differentiate some text sections in the job entries.

\documentclass[10pt, letterpaper, oneside]{article}

\usepackage{geometry}
\usepackage[T1]{fontenc}
\usepackage[dvipsnames]{color}
\usepackage{multirow}
\usepackage{tabularx}
\usepackage{multicol}
\usepackage{enumitem}

\pagestyle{plain}

\setlength{\parindent}{0in}
\setlength{\parskip}{0in}

% Name and contact information
\newcommand{\name}{Campbell Hennessy}
\newcommand{\street}{xxxxxx}
\newcommand{\city}{Smalltown ON}
\newcommand{\postal}{AAA AAA}
\newcommand{\phone}{(123) 456-7890}
\newcommand{\email}{campbell.hennessy@gmail.com}

% Colors
\definecolor{light-grey}{gray}{0.8}


The documentclass defines the font and the page size. All of the usepackage statements allow you to use the stated LaTeX packages to add features to your resume. The geometry package for example, can change the margins instantly by editing the geometry line; since all of the spacing used in formatting is relative to the usable page space, you can change the margins and all of your resume items will adjust to use the space while keeping in line with your formatting rules. Each of the newcommand lines effectively generates a shortcut for inserting the information in the curly braces into the document. I used definecolor to create a color, light-grey, to use to highlight some sections of text in the resume.

## Commands and Environments

I have organized my resume using custom LaTeX environments, these environments allow me to apply commands to the beginning and to the end of sections of text. I have also defined some of my own commands which are effectively shortcuts to call a series of other commands. If you follow through this section you can get a feel for how to develop your own commands and environments if you need features beyond what I use in my resume.

% A horizontal rule for sections
\newcommand{\HRule}[2]{\textcolor{#1}{\rule{\linewidth}{#2}}}

% A section tile command
\newcommand{\sectiontitle}[1]{\begin{minipage}{\textwidth}\HRule{black}{0.25mm}\vspace{-10pt}\begin{center}\Large\MakeUppercase{#1}\end{center}\end{minipage}\\\HRule{light-grey}{0.15mm}\vspace{\baselineskip}}


The HRule command creates a horizontal line of a given colour, I use these to divide sections in my resume. The sectiontitle command defines a title for a resume section such as “Work Experience”. By changing just this one line you can change the appearance of all of your section titles, no having to go through and highlight each line one at a time.

% An environment for a resume section
\newenvironment{ressection}[1]{
\sectiontitle{#1}}
{\vspace{-\baselineskip}}


The ressection environment allows you to create a basic resume section, it takes care of placing the title and making sure that there isn’t a large space between this section and the next.

% Resentry defines a position
% Arg1: Position title
% Arg2: Company or Office---Company
% Arg3: Location, PROV
% Arg4: Date Range
\vspace{-5pt}
\textbf{#1}\hspace{\stretch{1}}\textcolor{light-grey}{#3}\\
\textit{#2}\hspace{\stretch{1}}\textcolor{light-grey}{#4}\\
}

% A resitem is a simple list element
\newcommand{\resitem}[1]{
\vspace{2pt}
\item \begin{flushleft} #1 \end{flushleft}
}


The two commands above are the basis for the experience entries in the resume. The first, resentryheader, creates a header with a job title, company, location and the dates worked. The second, resitem, inserts the details of the job. The commands are combined into the environment, resentry, below.

% This is a resume entry with a header and bullet items
\newenvironment{resentry}[4]{
\begin{minipage}{\textwidth}
\vspace{-\baselineskip}
\begin{itemize}[noitemsep,nolistsep]
}{
\end{itemize}
\vspace{\baselineskip}
\end{minipage}
}


The resentry creates a contained environment for work or volunteer positions. It ensures that each position is completely contained on the same page. This feature prevents a position from being spread across two pages (I find split entries to be distracting). Below you can see a sample work experience resume section with one job entry.

\begin{ressection}{experience}
\begin{resentry}{Lab Assistant}{Department of Electronics --- Carleton University}{Ottawa, ON}{January 2013 --- April 2013}
\resitem{Assist in the labs for a new third year electrical engineering project course.}
\resitem{Act as a consultant for the students on topics relating to embedded hardware and software design.}
\resitem{Assist in diagnosing technical problems and directing students to appropriate technical resources.}
\end{resentry}
\end{ressection}


While I don’t mind if my work experience sections flow across pages, I do not like it when some of the smaller resume sections such as education start on the end of a page and flow onto the next. To avoid this I created a special resume section environment, tightressection, which ensures the section stays on a single page.

% A ressection that has to be on one page, awards, education etc
\newenvironment{tightressection}[1]{
\begin{minipage}{\textwidth}
\sectiontitle{#1}}
{\vspace{\baselineskip}\end{minipage}}


For some resume sections, such as awards, I can fit each entry using only half of the width of the page. I have an environment, rescolumn that can create columns using half of the side of a page.

% A column if there is a two columned section such as in awards
\newenvironment{rescolumn}{
\begin{minipage}{0.5\textwidth}
\begin{itemize}[noitemsep,nolistsep]}
{\end{itemize}
\end{minipage}}


The tightressection and rescolumn are used in my qualifications section to create a two-columned section that stays on a single page.

\begin{tightressection}{current qualifications}
\begin{rescolumn}
\resitem{Advanced Medical First Responder (St John Ambulance, re-certified September 2010)}
\resitem{CPR Healthcare Provider Level (Ottawa Paramedic Service, re-certified September 2012)}
\resitem{Standard First Aid/CPR C (Ottawa Paramedic Service, re-certified September 2012)}
\resitem{Oxygen Administration \& AED (Ottawa Paramedic Service, re-certifiedSeptember 2012)}
\end{rescolumn}
\begin{rescolumn}
\resitem{Small Vessel Operator Proficiency (Transport Canada, May 2010)}
\resitem{Rigid Hull Inflatable Operator Training (Transport Canada, May 2010)}
\resitem{Marine Emergency Duties A3 (May 2010)}
\resitem{Marine VHF Operator License with DSC option (April 2010)}
\resitem{Pleasure Craft Operator's Card}
\end{rescolumn}
\end{tightressection}


Finally, I have special commands for education and positions on committees or boards. The special commands are seen below along with my education section to show their use.

% An entry for memberships
% Arg1: Board
% Arg2: Position
% Arg3: Date
\newcommand{\boardentry}[3]{
\begin{minipage}{\textwidth}
\vspace{-9pt}
\textbf{#1}\\
\textit{#2}, \textit{#3}\\
\vspace{0.5\baselineskip}
\end{minipage}
}

% An entry for education
% Arg1: Institution
% Arg2: Program
% Arg3: Dates
\newcommand{\resedentry}[3]{
\begin{minipage}{\textwidth}
\vspace{-10pt}
\textbf{#1}\\
\textit{#2}\hfill\textcolor{light-grey}{#3}\\
\vspace{0.5\baselineskip}
\end{minipage}
}

% Education
\vspace{-15pt}
\begin{tightressection}{education}
\resedentry{Carleton University}{Bachelor of Engineering (Computer Systems) (CGPA: 11.90/12)}{September 2009 --- May 2013}
\resedentry{Carleton University}{Bachelor of Public Affair and Policy Management (Incomplete) (CGPA: 11.45/12)}{September 2007 --- April 2009}
\end{tightressection}


Now that all the environments are defined it is very easy to add in new experience or sections. I always customize my resume for each application. Before moving to LaTeX, I kept a full resume that had all of my job experience with complete descriptions for each job. When I needed to prepare a resume for an application, I would copy and paste what I wanted into a new document. With LaTeX, I keep the complete resume in LaTeX. If I don’t want something in a particular application, I place a ‘%’ in front of any lines to be omitted. When the document is made, LaTeX ignores all lines prefixed by ‘%’. This allows me to quickly remove positions or even individual bullet points from job descriptions.

If you are used to working with code, you can take advantage of your favourite version control system to keep previous revisions of your resume or even to create specialized branches for specific applications. I have used Git in the past to track and collaborate on a large technical document and really appreciate the ability to treat text like code.

PDF of the code above:

GDE Error: Error retrieving file - if necessary turn off error checking (404:Not Found)

## 8 thoughts on “Making Your Résumé Beautiful And Maintainable With LaTeX”

1. Campbell Post author

Hi thanks for posting this link. I just took a look and it is a very clean package for styling resumes. I wanted to share this post not so much because I think my resume style is particularly good but more to show a short break down of how people could adapt an existing style to suit their needs. I got my start for my code here and adapted it to suit my needs and style, one thing I like about LaTeX is that there are many people who have taken time to create very reusable styles you can use, or you can modify, or you can create your own. I welcome links that might help people find other starting points and ready-made solutions

1. mike

If you haven’t already, check out Lyx, a gui for LaTex. As much as programmers like working with code, it is nice to have some of the work done for us!
You still end up with a LaTex file to do with as you please, plus you can render directly to pdf, html, etc. Tons of support for different styles via MikTex package. I wrote my masters thesis using it and my PhD is going the same way.

2. Tyler

I was wondering, you have defined several variables that dont appear used here:
\newcommand{\name}{Campbell Hennessy}
\newcommand{\street}{xxxxxx}
\newcommand{\city}{Smalltown ON}
\newcommand{\postal}{AAA AAA}
\newcommand{\phone}{(123) 456-7890}
\newcommand{\email}{campbell.hennessy@gmail.com}

I was wondering, when attempting to add additional lines under the email in the upper right, the new lines have massive breaks in them when using the & & commands in ‘multirow’. Basically, then each representing an empty column, but adding additional rows to the third column

1. Campbell Post author

The line I use for the upper right is below. This line (which includes street and city) works for me without causing any unusual breaks. Please let me know if this helps:
\multirow{3}{*}{\Huge\textbf{\name}} & \\& \street \\& \city \\& \email\\\\

1. Campbell Post author

The full tex code is included towards the top (you have to click on ‘expand source’ just above the subheading ‘Document Setup’), the code in that box should compile if you copy and paste it.