Writing a CV in LaTeX

Writing my curriculum in LaTeX was a task that has been on my TODO-list for quite a while. I liked the style of my Word-written CV and I believed it would take hours to come up with a reasonable CV in LaTeX. Nevertheless, I recently sat down, began writing, and after not too long, I came up with a presentable result that I would like to share.

A complete minimal example can be found at the end of this post.

The Title

In order to even spacing all around, we change the page margins to 3cm using the geometry package. We further make use of the standard article maketitle command, printing the person’s name (title field) and e-mail address (author field).

\documentclass[10pt]{article}
\usepackage[margin=3cm]{geometry}
\title{\bfseries\Huge Tom T. Texblog}
\author{texblog+cv@gmail.com}
\date{}
\begin{document}
\maketitle
\end{document}

In case you prefer to add a photo to your CV, try the following slightly more complex code, using minipage:

\documentclass[10pt]{article}
\usepackage[margin=3cm]{geometry}
\title{\bfseries\Huge Tom T. Texblog}
\author{texblog+cv@gmail.com}
\date{}
\begin{document}
\begin{minipage}{0.65\textwidth}
\begingroup
\let\center\flushleft
\let\endcenter\endflushleft
\maketitle
\endgroup
\end{minipage}
\begin{minipage}{0.3\textwidth}
\flushright{\rule{3.5cm}{4.5cm}}
\end{minipage}
\end{document}

We use minipage again to split the page into two parts, one for the address and the second for some personal information if that’s required. Straight forward.

\begin{minipage}[ht]{0.48\textwidth}
City 12345\\
State of Sabotage
\end{minipage}
\begin{minipage}[ht]{0.48\textwidth}
Nonlandian\\
January 3rd, 2020\\
+12 34 56 789
\end{minipage}

The space between the title and the address is just about right. To add more space, use:

\vspace{2em}

The Content

After the cosmetics, we now add the actual content. We use the standard article section with a star to omit numbering. Sections may include: Objective (of the CV), Professional Experience, Education, Languages, Publications, Programming Languages, etc. We will show a few examples here, the structure is always the same.

Let’s first prepare the content with some code in the preamble. We use the tabular environment to divide the page into two columns, a small column for the year/title and a wide column for the description. In order to minimize typing, we define two new columntypes in the preamble, “L” and “R” as well as a thin light-gray line in between, \VRule.

\usepackage{array, xcolor}
\definecolor{lightgray}{gray}{0.8}
\newcolumntype{L}{>{\raggedleft}p{0.14\textwidth}}
\newcolumntype{R}{p{0.8\textwidth}}
\newcommand\VRule{\color{lightgray}\vrule width 0.5pt}

Now we can start creating content sections using the tabular environment as follows:

\section*{Heading}
\begin{tabular}{L!{\VRule}R}
2012&Some text\\[5pt]
2011&Some other text\\
\end{tabular}

For better readability, we add small vertical spaces between rows in the tabular.

Education

Let’s start by looking at the example with education. We highlighted the parts in bold which are most recent or most important.

\section*{Education}
\begin{tabular}{L!{\VRule}R}
2005--2007&{\bf MSc in Computer Science, Great University, Country.}\\[5pt]
2001--2005&BSc in Life Science, Great University, Country.\\
\end{tabular}

Languages

Here, we use the left column for the language and the right column for the level of proficiency.

\section*{Languages}
\begin{tabular}{L!{\VRule}R}
Klingon&Mother tongue\\
{\bf English}&{\bf Fluent}\\
French&Fluent (DELF 2010)\\
Japanese&Fair\\
\end{tabular}

Professional Experience

\usepackage{lipsum}
...
\section*{Professional Experience}
\begin{tabular}{L!{\VRule}R}
2011--today&{\bf Work at company XY.}\\
&\lipsum[66]\\[5pt]
2008--2010&{\bf Trainee at company ZY.}\\
&\lipsum[66]\\
\end{tabular}

Publications

We use the bibentry package to generate an inline list of publications. The references are stored in a bibtex file.

\usepackage{bibentry}
...
\bibliographystyle{plain}
\nobibliography{publication.bib}
\section*{Publications}
\begin{tabular}{L!{\VRule}R}
2006&\bibentry{knuth2006art}\\[5pt]
1968&\bibentry{lamport1986latex}\\
\end{tabular}

Minimal Example CV

\documentclass[10pt]{article}
\usepackage{array, xcolor, lipsum, bibentry}
\usepackage[margin=3cm]{geometry}

\title{\bfseries\Huge Tom T. Texblog}
\author{texblog+cv@gmail.com}
\date{}

\definecolor{lightgray}{gray}{0.8}
\newcolumntype{L}{>{\raggedleft}p{0.14\textwidth}}
\newcolumntype{R}{p{0.8\textwidth}}
\newcommand\VRule{\color{lightgray}\vrule width 0.5pt}

\begin{filecontents}{publication.bib}
@article{lamport1986latex,
title={LaTEX: User's Guide \& Reference Manual},
author={Lamport, L.},
year={1986},
}
@book{knuth2006art,
title={The art of computer programming: Generating all trees: history of combinatorial generation},
author={Knuth, D.E.},
volume={4},
year={2006},
}
\end{filecontents}

\begin{document}
\maketitle
\vspace{1em}
\begin{minipage}[ht]{0.48\textwidth}
City 12345\\
State of Sabotage
\end{minipage}
\begin{minipage}[ht]{0.48\textwidth}
Nonlandian\\
January 3rd, 2020\\
+12 34 56 789
\end{minipage}
\vspace{20pt}

\section*{Objective}
Find a job.

\section*{Professional Experience}
\begin{tabular}{L!{\VRule}R}
2011--today&{\bf Work at company XY.}\\
&\lipsum[66]\\
\end{tabular}

\section*{Education}
\begin{tabular}{L!{\VRule}R}
2005--2007&{\bf MSc in Computer Science, Great University, Country.}\\[5pt]
2001--2005&BSc in Life Science, Great University, Country.\\
\end{tabular}

\section*{Languages}
\begin{tabular}{L!{\VRule}R}
Klingon&Mother tongue\\
{\bf English}&{\bf Fluent}\\
French&Fluent (DELF 2010)\\
Japanese&Fair\\
\end{tabular}

\bibliographystyle{plain}
\nobibliography{publication.bib}

\section*{Publications}
\begin{tabular}{L!{\VRule}R}
2006&\bibentry{knuth2006art}\\[5pt]
1986&\bibentry{lamport1986latex}\\
\end{tabular}
{\vspace{20pt}\newline\newline
\vspace{20pt}
\scriptsize\hfill Created by http://texblog.org}

\end{document}


Drop me a comment if you know of other resources and I will add them to the list.

Update

A few days after publishing this post, a vivid discussion took place with lots of interesting CV examples on hackerne.ws.

70 Responses to “Writing a CV in LaTeX”

• jeroendehaas

For the last three years I’ve used the moderncv package to typeset my CV: http://www.ctan.org/pkg/moderncv. Well worth checking out if you’re considering writing your CV in LaTeX.

• P

NIce article. For Europe CV, I use the europecv package: http://www.ctan.org/tex-archive/macros/latex/contrib/europecv.
Cheers, P.

• nignasi

I’ve never used but here you have two more links to CV tex templates

http://nitens.org/taraborelli/cvtex

http://www.latextemplates.com/cat/curricula-vitaes

• henningninneh

excellent. this looks exactly like my word-typeset cv. now i must give it a try in LaTex. thanks for this post.

• copiancestral

It looks good, but I would go with the cv or the moderncv packages. They’re quite easy to use, and yet produce simple but elegant résumés.

• Didier Verna

Out of completeness, you should also mention the CurVe class (shameless plug). Available on CTAN.

• Gergely Schmidt (@sgergely)

that is not mother tongue it is native language

• Bala

beautiful!!!

• Professional Resume Using Latex Templates « Abstract Confusions

[...] Here is an another excellent post discussing   resume. 13.060416 80.249634 Rate this: Sharing is fun:MoreLike this:LikeBe the first to like this post. [...]

• akmkat

• tom

Hi!

Thanks for your comment. Did you use the minipage environment as in the example above? Please provide a minimal example and I’ll try to help.

Best, Tom.

• Learning Latex – Resumes | blog.fejes.ca

• eiselekd

The layout is nice however there a problems I think:
When using tabular and you have a long list, i.e.
in the “Practical Experience” section, tabular will
not break across multiple pages. Also when you add
footnotes inside tables you need to be an expert. A simpler
2 column layout would be, it misses the vertical ruler however:

\documentclass{scrartcl}
\usepackage{lipsum}
\begin{document}
\begin{labeling}{XXXXXXX}%template for longest item.
\item[2000] \lipsum[1-2]
\item[2001] \lipsum[1-2]
\end{labeling}
\end{document}
• tom

Thanks for the sample code. I agree, one may run into problems, but LaTeX almost always provides a reasonable solution. I wrote about footnotes in tables in one of my previous posts. Concerning the multipage issue, often one can arrange things with margins, font size, line spacing, etc. Another possibility would be to use the longtable package instead, which allows tables to span across multiple pages.

Best, Tom.

• Daniel

Thanks for a great post and blog!
I’m wondering about how to change the indentation of the dates in the first column. Suppose you want to specify the month e.g. 201203 – 201206. This causes a line-break but it seems there is more space to use to the left. What would you do?

• tom

Hi Daniel,

Thanks for your comment. What you would do is to change the width of the manually defined columns. Try for example 0.25\textwidth for L and 0.6\textwidth for R as in the code below.

\usepackage{array, xcolor}
\definecolor{lightgray}{gray}{0.8}
\newcolumntype{L}{>{\raggedleft}p{0.25\textwidth}}
\newcolumntype{R}{p{0.6\textwidth}}
\newcommand\VRule{\color{lightgray}\vrule width 0.5pt}

Best, Tom.

• Daniel

Thanks! By the way, is there a way to let the red line come before the first column?

• tom

Hi Daniel,

Do you mean a vertical red line? You could color a vrule with the xcolor package:

\documentclass[10pt]{article}
\usepackage[table]{xcolor}
\usepackage{array, lipsum, bibentry}
\usepackage{tabu}
\usepackage[margin=3cm]{geometry}
\taburulecolor{red}
\title{\bfseries\Huge Tom T. Texblog}
\author{texblog+cv@gmail.com}
\date{}
\definecolor{lightgray}{gray}{0.8}
\newcolumntype{L}{|>{\raggedleft}p{0.14\textwidth}}
\newcolumntype{R}{p{0.8\textwidth}}
\newcommand\VRule{\color{lightgray}\vrule width 0.5pt}
...

Changes are highlighted.

Best, Tom.

• Daniel

Nice! Yes, that’s what I meant:), (of course I mean the lightgray line which I changed to red, thus the confusion). I changed \tabular to \tabu and then everything worked perfectly.
Cheers, Daniel

• crlsmrgf

Thank u very much!
It was also something in my TO-DO list for too long, and it was much ore easy than I thought!

• Alex

I’m having trouble getting the publications section to work… Even if I copy your source code exactly, I get and error: “Citation ‘knuth2006art’ undefined”. Any idea how to fix this?

• tom

Hi Alex,

Two things:

• Did you run latex, bibtex, latex, latex?
• Do you have a publication.bib file containing the bib-entries?

In case you use the complete example provided in the post, the file will be created when you typeset the document (latex) the first time.

Hope this helps.
Best, Tom

• Matt Brown

With the publications list, I get a vertical space in front of each of my \bibentry bits, so that the year is a line above the text. If I add some text or “\hspace{0pt}” ahead of it, it jumps back on the right line. This is an ugly hack, though. Any suggestions?

• tom

Hi Matt,

Unfortunately, I wasn’t able to reproduce what you describe above. Could you provide a minimal working example? Something similar to the code below would do.

Thanks, Tom.

\documentclass{article}
\usepackage{bibentry}
\usepackage{array, xcolor}
\definecolor{lightgray}{gray}{0.8}
\newcolumntype{L}{>{\raggedleft}p{0.14\textwidth}}
\newcolumntype{R}{p{0.8\textwidth}}
\newcommand\VRule{\color{lightgray}\vrule width 0.5pt}
\begin{filecontents}{publication.bib}
@book{knuth2006art,
title={The art of computer programming: Generating all trees: history of combinatorial generation},
author={Knuth, D.E.},
volume={4},
year={2006},
\end{filecontents}
\begin{document}
\bibliographystyle{plain}
\nobibliography{publication.bib}
\section*{Publications}
\begin{tabular}{L!{\VRule}R}
2006&\bibentry{knuth2006art}\vspace{5pt}\\
\end{tabular}
\end{document}
• resume formats

interesting,thanks for sharing.

• Martin Vogel

Hi,
Thanks for your nice CV template.
I just wonder how to modify the code to include properly a photo in the beginning. I am not very familiar with the minipage environment.
Martin

• tom

Thanks for your question, Martin. That’s fairly simple. Copy-paste the code above in the post which has the photo black box and replace:

\rule{width}{height}

with

\includegraphics[width=3.5cm]{path/photo.png}

You’ll have to load the graphicx package to make use of the width option.

Let me know if you have any problems with that and if you provide the code, I’ll most certainly be able to help.

Cheers, Tom.

• Preparing an Academic CV in LaTeX using Mendeley | Monkeyologist

[...] Blog’s Writing a CV in LaTeX (where I found out about the bibentry [...]

• Jolyon Bloomfield

Heya,

Just wanted to point out that the use of “\vspace{5pt}\\” to get nice spacing in the tables can backfire if the \vspace will cause a new line to be added to that row (if your text is _just_ the wrong length). Better is to use “\\[5pt]” which doesn’t have this problem.

Best,
Jolyon

• Phil

Hi there.
I’m very new to latex so forgive me naive question.

I noticed that when a section was a bit long it started on a new page leaving sometime a lot of extra white page after the previous section.

Is it something that can be changed easily?

Otherwise, thank for the excellent post.

• tom

Hi Phil,

Thanks for your question. You probably have to play around to find the optimal arrangement. However, in general, I would not expect a section to be automatically moved to the next page if there is blank space left on the current page. Unless you add \clearpage or \newpage of course.

Could you provide a minimal example for illustration?

Thanks, Tom.

• jolyonbloomfield

Hi there,

This happens because LaTeX tries to fit a tabular environment on a single page; it won’t break it across pages. I ran into this same issue recently. The fix is to use the longtable package:

\usepackage{longtable}


You probably also want to use these commands in the preamble (otherwise the spacing gets a little big):

\setlength{\LTpre}{0pt}
\setlength{\LTpost}{0pt}


Then, wherever \begin{tabular} … \end{\tabular} appears, change it to the following.

\begin{longtable}
...
\end{longtable}


I hope this helps!
Jolyon

• Ben

Dear All,

Thank you for this template. It works really great.

But I want to add a foot note stating the date and company for wich this Resume is made.

I’ve been searching the net for how to do this, but I can’t figure out how to get a footer on the first page …

Is there any good trick to do this?

Thank you!

• tom

Hi Ben,

Assuming you are using the fancyhdr package and redefined the header/footer according to your needs. Now to get a header/footer on the first page, just add the following line after \maketitle:

\thispagestyle{fancy}

Best, Tom.

• Johnathan

Just wanted to say this is a great guide, many thanks for this.

Cheers,
Johnathan

• Rivka

Hi,
I used this as a template to write my CV, thanks!

• dottag

Thank you for the awesome CV! This was exactly my Word-style but my limited knowledge of LaTeX did not allow me to do the same.

One question: how do I make the second column left-justified? I’d loke to do it because I don’t like that LaTeX stretches out the between-words spaces (it’s not an article, so the right margin looks “ragged” anyway).

• tom

Hello!
Left-align the right side is done similarly to right-align the left side using \raggedright in the column definition. I attached a minimal working example below.

\documentclass{article}
\usepackage{xcolor, blindtext, array}
\definecolor{lightgray}{gray}{0.8}
\newcolumntype{L}{>{\raggedleft}p{0.14\textwidth}}
\newcolumntype{R}{>{\raggedright}p{0.8\textwidth}}
\newcommand\VRule{\color{lightgray}\vrule width 0.5pt}
\begin{document}
\section*{Title}
\begin{tabular}{L!{\VRule}R}
2013&\blindtext\\
\end{tabular}
\end{document}
• peddrim

Thank you very much! Your CV template is the most beautiful I could find

• Tom Walton

Hi Tom,

Have you seen the LaTeX CV template on http://www.writelatex.com – you can open it for editing in their online editor with one click. Is pretty neat (the original template is from howtotex)

cheers,
Tom

• Chaanakya

This post was really nice. Thank you One suggestion/improvement: for the address/other info, you could use this code instead, which would put the address and other info flush against the left/right side respectively:

\begin{minipage}[ht]{0.48\textwidth}
\begin{flushleft}
666 Devil St. \\
Hell
\end{flushleft}
\end{minipage}
\begin{minipage}[ht]{0.48\textwidth}
\begin{flushright}
666-666-6666 \\
satan@gmail.com
\end{flushright}
\end{minipage}
• lazhar