Take the 2-minute tour ×
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.

I am looking to make a standard timeline, nothing fancy, like the one below (although, it does not have to be like that) using any library. How can I go about the achieving this in the best way?

A standard timeline

share|improve this question

2 Answers 2

up vote 33 down vote accepted
+50

Here's one possibility using TikZ:

Update:

I made some additional improvements to the original code (older versions can be seen in the edit history of this answer):

\documentclass{article}
\usepackage[margin=3cm]{geometry}
\usepackage{ragged2e}
\usepackage{fourier}
\usepackage{tikz} 
\usetikzlibrary{chains,shapes.arrows,fit}

\definecolor{arrowcolor}{RGB}{201,216,232}% color for the arrow filling
\definecolor{circlecolor}{RGB}{79,129,189}% color for the inner circles filling
\colorlet{textcolor}{white}% color for the text inside the circles
\colorlet{bordercolor}{white}% color for the outer border of circles

\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

\newcounter{task}

\newlength\taskwidth% width of the box for the task description
\newlength\taskvsep% vertical distance between the task description and arrow

\setlength\taskwidth{2.5cm}
\setlength\taskvsep{17pt}

\def\taskpos{}
\def\taskanchor{}

\newcommand\task[1]{%
  {\parbox[t]{\taskwidth}{\scriptsize\Centering#1}}}

\tikzset{
inner/.style={
  on chain,
  circle,
  inner sep=4pt,
  fill=circlecolor,
  line width=1.5pt,
  draw=bordercolor,
  text width=1.2em,
  align=center,
  text height=1.25ex,
  text depth=0ex
},
on grid
}

\newcommand\Task[2][]{%
\node[inner xsep=0pt] (c1) {\phantom{A}};
\stepcounter{task}
\ifodd\thetask\relax
  \renewcommand\taskpos{\taskvsep}\renewcommand\taskanchor{south}
\else
  \renewcommand\taskpos{-\taskvsep}\renewcommand\taskanchor{north}
\fi
\node[inner,font=\footnotesize\sffamily\color{textcolor}]    
  (c\the\numexpr\value{task}+1\relax) {#1};
\node[anchor=\taskanchor,yshift=\taskpos] 
  at (c\the\numexpr\value{task}+1\relax) {\task{#2}};
}

\newcommand\drawarrow{% the arrow is placed in the background layer 
                                                     % after the node for the tasks have been placed
\ifnum\thetask=0\relax
  \node[on chain] (c1) {}; % if no \Task command is used, the arrow will be drawn
\fi
\node[on chain] (f) {};
\begin{pgfonlayer}{background}
\node[
  inner sep=10pt,
  single arrow,
  single arrow head extend=0.8cm,
  draw=none,
  fill=arrowcolor,
  fit= (c1) (f)
] (arrow) {};
\fill[white] % the decoration at the tail of the arrow
  (arrow.before tail) -- (c1|-arrow.west) -- (arrow.after tail) -- cycle;
\end{pgfonlayer}
}

\newenvironment{timeline}[1][node distance=.75\taskwidth]
  {\par\noindent\begin{tikzpicture}[start chain,#1]}
  {\drawarrow\end{tikzpicture}\par}

\begin{document}

\begin{timeline}
\Task{Complete oral presentation\\ 27/04/2012}
\Task{Work on user interface and some modulation \\ 28/04/2012}
\Task{Work on and complete proposal to hand in \\ 29/04/2012}
\Task{Hand in proposal and astart working on Software planning \\ 04/05/2012}
\Task{Hand in Software planning and work on more content \\ 06/05/2012}
\Task{Complete full user UI with action listeners \\ 12/05/2012}
\Task{Complete beta testing and debug \\ May 13th to May 29th}
\end{timeline}

\vspace{1cm}

\definecolor{arrowcolor}{RGB}{144,168,65}
\colorlet{circlecolor}{white}
\definecolor{bordercolor}{RGB}{168,89,65}
\colorlet{textcolor}{bordercolor}
\setlength\taskwidth{1.7cm}

\begin{timeline}
\Task[M]{Grilled cheese sandwiches on whole-wheat bread, one peach}
\Task[Tu]{Penne pasta Caprese salad}
\Task[W]{Zucchini muffins with cream cheese, grapes, and watermelon}
\Task[Th]{Peanut butter and banana sandwiches, popcorn, one peach}
\Task[F]{Cream cheese and cucumber sandwich, grapes, and blueberries}
\Task[Sa]{Grilled fish with lemon, grilled corn, and whole-wheat biscuits}
\Task[Su]{Yogurth with honey and blueberries}
\end{timeline}

\end{document}

enter image description here

How the code works:

Inside the timeline environment, use \Task{<description>} for each task. For example:

\begin{timeline}
\taskmark{This is the first task}
\taskmark{This is the description of the second task and it is a little long}
\taskmark{This is the description of the third task and it is short}
\taskmark{This is the description of the fourth task}
\taskmark{This is the description of the fifth task}
\taskmark{Here is the description of the sixth task}
\end{timeline}

If no \Task command is used, only the arrow will be drawn. The optional argument for \Task, allows to add a label to the inner circles (if the label is too long, the width for the inner style will have to be increased).

share|improve this answer
    
I'm getting this error "! LaTeX Error: Command \widering already defined. What could be the issue? –  gekkostate Apr 15 '13 at 1:40
    
@gekkostate that error indicates a conflict between names of commands. The only package that perhaps could be causing the name clash that in my code it's fourier; don't load it. If the error persists, it must be elsewhere in your code, not in mine. You can build a MWE illustrating the problem and add it to your question. –  Gonzalo Medina Apr 15 '13 at 1:44
    
I removed the fourier package it is fixed! Thanks a bunch! –  gekkostate Apr 15 '13 at 1:45
    
Can you please demonstrate how to add more tasks? I kind of have it figured out but it would be better if you could give an explanation of your code. –  gekkostate Apr 15 '13 at 1:47
1  
@gekkostate yes, of course, I am improving the code. As soon as I finish, I'll update it and provide an explanation. –  Gonzalo Medina Apr 15 '13 at 1:59

With PSTricks.

enter image description here

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{etoolbox}
\SpecialCoor
\def\Mark#1#2#3{%
    \pscircle[linewidth=2pt,linecolor=white,fillstyle=solid,fillcolor=blue!75](!2.5 #1 mul 1 add 0){.5}
    \ifstrequal{#2}{t}{%
        \rput[b](!2.5 #1 mul 1 add  1){\parbox{2cm}{\scriptsize #3}}}{%
        \rput[t](!2.5 #1 mul 1 add -1){\parbox{2cm}{\scriptsize #3}}}}

\def\Axis#1{%
    \psline[linecolor=blue!50,linewidth=1.5,arrowinset=0,arrowlength=0.5]{->}(0,0)(!2.5 #1 mul 5 add 0)
    \pspolygon*[linecolor=white](0,.75)(.75,0)(0,-.75)}

\begin{document}
\begin{pspicture}(0,-3)(10,3)
    \Axis{2}
    \Mark{0}{t}{Karl's students do not care about dashing patterns.}
    \Mark{1}{b}{Karl's students do not care about arrow tips.}
    \Mark{2}{t}{Karl's students, by the way, do not know what a transformation matrix is.}
\end{pspicture}
\end{document}
share|improve this answer

Your Answer

 
discard

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.