This question led to a new package:

I just had the idea of using a timeline to specify dates in my CV. I've made a mockup in Inkscape:


The idea, as you see it, is to display the dates of experience on timelines instead of just typesetting them. I think this makes it nicer and more understandable somehow. When the position is still held, I want to use a gradient at the end of the line. Since I'm using moderncv and it uses lines for sections (like the orange line in front of "Experience"), I would like to calibrate the time lines on this line, setting a start and an end dates corresponding to the extremities of the section line. In my example, the section line goes from 2000 to 2011 for example.

I think using TiKz could do. How would you suggest to implement this? Is there an existing package that would almost do this?

  • it will be nice if the package come up with a template that includes an entry of each nice stuff that the package can do.
    – Cfun
    Jun 28, 2016 at 1:56
  • @SAM if you want an example, you can check my own CV on github.com/raphink/CV
    – raphink
    Jun 28, 2016 at 8:20
  • @ℝaphink: The code in my answer doesn't work with recent versions of moderncv. Could you accept your answer instead of mine, so mine isn't shown at the top?
    – Jake
    Jun 28, 2016 at 11:11

3 Answers 3


For the record, I have adapted Jake's code and began working on a new package called moderntimeline:


% Set the scale.
% I go up to 2013 otherwise some late dates overflow on the entry
% Set the line width.
% This automatically sets the space under the top label to be 1pt more
% Set the labels text size

And then a few examples:

\subsection{IT Experience}
\tlcventry[blue]{2006}{0}{Systems Engineer}{\href{http://www.orness.com}{ORNESS} then \href{http://www.alten.fr}{Alten}}{Sophia Antipolis}{}
{Consultant at France T\'el\'ecom
 \item Administration of Cfengine, FAI and the software package repository;
 \item Renewal and industrialization of the software deployment system for Debian/Ubuntu;
 \item Management of the Gforge (collaborative development web interface) platform;
 \item Monitoring of the fleet of servers;
 \item Writing of technical documentation.


  {\href{http://www.croix-rouge.fr/}{French Red Cross}}{Paris Suburbs}{}
  {Served in several volunteer missions as a paramedic}


\tldatelabelcventry[red]{2004}{July 2004}{Blue Collar Internship}
  {Assembled and equilibrated turbo reactors for planes}


\tldatecventry[green]{2005}{Student in Pedagogy (`Gestion Mentale')}
  {Pedagogy, Didacticism, Cognitive Psychology}


Edit: Since moderncv aligns the left column to the right, there were weird things with dates, so I decided to put a white rectangle all over each entry to make sure the whole space was used. After that, my wife suggested I used a thin line to every entry to make things clearer, so now it looks like this (color and width of the thin line can be set):


Full examples can be seen in my updated CV.

  • 8
    Appreciate you turning useful thing into packages!
    – N.N.
    Sep 28, 2011 at 12:35
  • 1
    Package uploaded to CTAN :-)
    – raphink
    Sep 28, 2011 at 14:10
  • @NN: If I had some time, I think I would turn a lot of answers on TeX.SX into packages. I just think it makes life easier once it's done.
    – raphink
    Sep 29, 2011 at 6:16
  • 2
    I really like the version with the thin lines - makes the entire timeline thought clearer to the reader. Thank your wife from me! =) Apr 23, 2012 at 19:08
  • 1
    tex community is great tex.stackexchange.com/questions/99236/… that seems like a good starting point.
    – Sik
    Nov 28, 2013 at 17:19

This code doesn't work with versions of moderncv after 2012. Please use ℝaphink's moderntimeline package instead

Here's a way of getting this to work with moderncv. I've defined a new macro, \funkycventry that takes the start and end year and then all the same arguments as cventry, and uses this to draw the timeline bar in the same colour and width as the section headers. If the end year is 0, the bar fades out, and no end year is printed.




        inner xsep=0pt,
        anchor=base west,
        inner xsep=0pt,
        anchor=north east,


    \fill [sectionrectanglecolor] (0,0) 
        node [startyear] {#1}
        rectangle (\endfraction*\hintscolumnwidth,0.5ex)
        node [endyear] {\pgfmathparse{ifthenelse(#2==0,,#2)}\pgfmathresult}
        (\hintscolumnwidth,0pt) ;
    \ifnum #2=0
        \shade [left color=sectionrectanglecolor]
        (\endfraction*\hintscolumnwidth-1em,0pt) rectangle ++(1em,0.5ex);

\funkycventry{2002}{2007}{Job title}{Employer}{City}{}{General description no longer than 1--2 lines.\newline{}%
Detailed achievements:%
\item Achievement 1;
\item Achievement 2, with sub-achievements:
\item Achievement 3.
\funkycventry{2000}{2011}{Job title}{Employer}{City}{}{Description line 1\newline{}Description line 2}
\funkycventry{2005}{0}{Job title}{Employer}{City}{}{Description}

  • 3
    Great. I've adapted the code for my need. I might make a package out of it.
    – raphink
    Sep 28, 2011 at 7:35
  • Looking forward to seeing it!
    – Jake
    Sep 28, 2011 at 7:36
  • I have pushed a (not ready for release yet, missing the doc) version on github.
    – raphink
    Sep 28, 2011 at 11:54
  • 1
    This was beautiful. I'm going to start working on my CV right now! Apr 23, 2012 at 19:07
  • 1
    @Jake moderntimeline now supports months in a simpler way. Recently I made some changes to the code on my CV to display them with three letters; when I'll have some time I'll make a pull request to modertimeline repository.
    – Astrinus
    Jun 28, 2016 at 14:19

If I understood your description correctly, this could be what you need:



\begin{tikzpicture}[ultra thick]
\def\timelineunfinished#1#2{\node (refnode) at (0,0) {};%
                   \shade [left color=#1,right color=white] (${#2-2000}*(1,0)$) rectangle ++(${2011-#2}*(1,0)+1*(0,-0.5)$) node [pos=0, label=#2] (startdate) {};}


\def\timelinefinished#1#2#3{\node (refnode) at (0,0) {};%
                   \path [fill=#1] (${#2-2000}*(1,0)$) rectangle ++(${#3-#2}*(1,0)+1*(0,-0.5)$) node [pos=0, label=#2] (startdate) {} node [label=#3] (enddate) at ++(0,0.5) {};}


What I did, is define two new commands, one for timelines that have a start and an end date (these will not be rendered with gradient, but with solid fill) and one for the timelines that are 'in progress'. The timelines can start at 2000 earliest and end at latest in 2011. To change the limits, just replace the numbers in the code accordingly.

The code can probably be cleaned up, error checking could be included to avoid having the end earlier than the start, etc. But for a primer I hope this will do.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .