TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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?

share|improve this question
up vote 65 down vote accepted

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}

share|improve this answer
Great. I've adapted the code for my need. I might make a package out of it. – ℝaphink Sep 28 '11 at 7:35
Looking forward to seeing it! – Jake Sep 28 '11 at 7:36
I have pushed a (not ready for release yet, missing the doc) version on github. – ℝaphink Sep 28 '11 at 11:54
This was beautiful. I'm going to start working on my CV right now! – Tomas Lycken Apr 23 '12 at 19:07

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.

share|improve this answer
Appreciate you turning useful thing into packages! – N.N. Sep 28 '11 at 12:35
Package uploaded to CTAN :-) – ℝaphink Sep 28 '11 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. – ℝaphink Sep 29 '11 at 6:16
I really like the version with the thin lines - makes the entire timeline thought clearer to the reader. Thank your wife from me! =) – Tomas Lycken Apr 23 '12 at 19:08
tex community is great tex.stackexchange.com/questions/99236/… that seems like a good starting point. – Sik Nov 28 '13 at 17: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.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.