1. Introduction

In the competitive job market landscape, a well-crafted curriculum vitae (CV) can make a remarkable difference in securing our dream career opportunity. The content and presentation of our CV play a vital role in grabbing the attention of potential employers and highlighting our skills and qualifications effectively.

While various tools are available for creating CVs, one approach that stands out for its professionalism and aesthetic appeal is using LaTeX. In this tutorial, we’ll study step-by-step how to create a CV with LaTeX using ModernCV – one of the most common and powerful package for creating CVs.

2. Install the ModernCV Package

Before installing ModernCV, let’s ensure we have LaTeX on our computer. If not, the following will show how to install MikTeX, the core of LaTeX.

If we’re using Windows, we can run the following commands in administrator mode to install the package MikTeX:

winget install MiKTeX.MiKTeX
miktexsetup --shared=yes finish
initexmf --admin --set-config-value [MPM]AutoInstall=1
miktex packages upgrade complete

With Ubuntu and other Linux distros, the install process is less complicated. We can just copy and run these commands:

echo "deb http://miktex.org/download/ubuntu jammy universe" | sudo tee /etc/apt/sources.list.d/miktex.list
sudo apt-get update
sudo apt-get install miktex
sudo miktexsetup --shared=yes finish
sudo initexmf --admin --set-config-value [MPM]AutoInstall=1
miktex packages upgrade complete

After the installation of MikTex, we can run the following command to install ModernCV:

miktex packages install moderncv

3. Setting Up Our Document

First, we need to define the preamble of the LaTeX document. This starts with the declaration of the class moderncv. Then we can choose the theme for the CV, i.e., the style of the PDF result after compiling the LaTeX document.

The following describes the typical preamble for a LaTeX document using ModernCV:

% (1) Define the use of ModernCV document class

% (2) Choose the theme for CV

% (3) Choose the color theme

% (4) Modify the page margins

% (5) Change the encoding of the file (utf8, latin1, ...)

% (6) Change the language

4. Style Configuration

There are several options we can modify:

Rendered by QuickLaTeX.com

4.1. Page Size and Fonts

We can freely change the format (page size, text size, etc.) of the CV. For example, if we want to have a CV in the A4 paper size, default text size 10pt, support color printing, and that’s draft, we can define the documentclass as follows:

\documentclass[a4paper, 10pt, draft]

If we want a CV to be in letter paper size with a landscape look, default text of size 12pt, black-and-white printing, and the file is the final version, here is the config:

\documentclass[letterpaper, landscape, 12pt, nocolor, final]{moderncv}

There are five available themes, as indicated in the above table: casual (default), classic, banking, oldstyle, and fancy. Here is what they look like after compiling:

Available themes of ModernCV

Additionally, we have five available color options for themes (the color of titles and some bars and lines in the CV):

Available theme colors of ModernCV

4.2. Margins

The margin of the CV can also be modified. The below table lists the optional parameters for margins:

Rendered by QuickLaTeX.com

For example, if we want a CV to have a scale of about 25% of free paper space, here is the command:


Or we can manually set each margin parameters (top, bottom, left, right) with this command:

\usepackage[top=3cm, bottom=3cm, left=2.5cm, right=2.5cm]

4.3. Encoding

With this line, we can change the file’s encoding. We usually use the utf8 encoding:


4.4. Language

In this line, we can define the language of the CV. If our CV will be in English, here is the command:


4.5. Disable Page Numbering

For multi-page CVs, we can add this line to disable page numbering:


It is commonly recommended to summarize a CV in one page. A résumé, on the other hand, can have multiple pages.

5. Fill in Personal Information

Once all the configurations are done, we can start writing the content of our CV—our personal information. We can use the following lines to define them:

% Name

% Title (optional)

% Contact informations (optional)

% Homepage (optional)

% Extra info (optional)
\extrainfo{<additional_info>} % can be anything, for example, your website's address

% Photo (optional)
\photo[<photo_height_in_pt>][<frame_size>]{<path_to_picture>} % the recommended photo size is 64pt

% Quote (optional)

% Social links
% platform can be one of following: linkedin, xing, github, gitlab, codeberg, bitbucket, stackoverflow, skype, orcid, researchgate, researcherid, googlescholar, twitter, mastodon, telegram, whatsapp, signal, matrix, discord, youtube, twitch, tiktok, instagram, soundcloud, steam, xbox, playstation, battlenet

6. Customizing Sections

To open or close a section or subsection, we can use the following commands:

% (1) Open a new section(s)

% (2) Close the section

% (3) Create an empty section

The command to open a new section is \section{<section_title>}. Every section can be divided into subsections with \subsection{<subsection_title>}. When needed, we can close the section with \closesection{} or create an empty section with \emptysection{}.

The following lines demonstrate the use of the above commands:

\section{This is a section}
Our content is placed here, inside a normal \LaTeX{} environment.
Any \LaTeX{} command can be used here, including mathematics, figures or tables.

This is a sample equation 


. \emptysection{} \cvline{now}{Back to modern CV layout, no new section needed.}

This results in the below figure:

Sample section in LaTeX CV

6.1. Customizing Items

We can add items of many different types inside sections depending on our purpose.

To describe our education or job experiences, we can use the following command (note that the last three arguments are optional):


There is also a language section for any language certificate that we achieved:


The computer skill section contains some parameters as follows:


We can also add a skill entry with rating:


To insert a line with a hint on the left, we can use the following command:


To create a pair of two-item sections, we can use the command \cvdoubleitem. This command is often used to present information in two columns, such as a skill and its corresponding proficiency level, or a qualification and its date of completion:


For example, if we want to add a section for “Computer Skills” with multiple categories, we can write:

\section{Computer skills}
\cvdoubleitem{category 1}{XXX, YYY, ZZZ}{category 4}{XXX, YYY, ZZZ}
\cvdoubleitem{category 2}{XXX, YYY, ZZZ}{category 5}{XXX, YYY, ZZZ}
\cvdoubleitem{category 3}{XXX, YYY, ZZZ}{category 6}{XXX, YYY, ZZZ}

This will generate the following result:

Example of '\cvdoubleitem

To insert a list item inside a section, we need the following line:


We can also insert a section that list all of our publications. These data need to be stored in a BibTeX file (*.bib):


The name of the section title can be changed by the command \renewcommand{\refname}{<new_name>}.

6.2. Further Customizations:

We can modify the symbols used for personal data highlighting by redefining them as follows:


For command_name, the available options are: phonesymbol, emailsymbol, addresssymbol, mobilesymbol, faxsymbol. For new_symbol, we can use any possible symbol in LaTeX, such as \star or \rightarrow.


In addition, it is possible to change the symbol of the lists:

% Redefining command listitemsymbol

The following code sums up all of the above commands:

% Sample of changing the bullet type of items
\section{Sample of changeing bullet type of items}
\cvlistitem{item 1}
\cvlistdoubleitem{item 2}{item 3}
\cvlistitem{item 4}
\cvlistdoubleitem{item 5}{item 6}

The result is shown in the below figure:

Example of customization of the list labels.

Many distances definitions are used by ModernCV, and all of them can be customized with the command:


The available options for the parameters length and new_value in the above command are:

  • length: quotewidth, separatorcolumnwidth, maincolumnwidth, doubleitemcolumnwidth, listitemsymbolwidth, listdoublwitemmaincolumnwidth
  • new_value: any distance value that LaTeX can understand

In particular, the first column can be set to any width in two ways:

% Method 1
% <length> is the desired length that LaTeX can understand
% Method 2
% <string> is a string of the desired length (usually the longest string in the column) 

To indicate the creation date of our CV, we can add the date that our CV was produced with the command \today.

To add some lines at the bottom of the CV, we can drop out the layout of ModernCV and push the line at the end.

\textit{\small This is the end of the CV.}

7. Final Result

Once we’ve done all of these above steps. It’s time now to compile the LaTeX file and see the result PDFs:

CV sample - page 1 CV sample - page 2

8. Alternative Options to Create CVs in LaTeX

Besides ModernCV, there also exists other packages to create a CV/Resume in LaTeX, such as EuropassCV, Scott Clark CV, EuroCV, friggeri-cv, and so many others. It is worth noticing that some of them do have documentation and sample codes, and others don’t.

9. Conclusion

This article has provided a fast way to create a CV with LaTeX using the ModernCV package. Whether we are a seasoned LaTeX user or new to this remarkable typesetting system, this article will equip us with the knowledge and skills to create a standout CV that opens doors to exciting career prospects.

Comments are closed on this article!