# Vertical timeline latex

Given the vertical timelines in "How can you create a vertical timeline?" and specifically this, would it be possible to make the distance between points scale with their numerical distance?
E.g. points 2000, 2005 will be half as far apart as 2010,2020

from the second link:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{charter}
\usepackage{environ}
\usepackage{tikz}
\usetikzlibrary{calc,matrix}

% code by Andrew:
% http://tex.stackexchange.com/a/28452/13304
\makeatletter
\let\matamp=&
\catcode\&=13
\makeatletter
\def&{\iftikz@is@matrix
\pgfmatrixnextcell
\else
\matamp
\fi}
\makeatother

\newcounter{lines}
\def\endlr{\stepcounter{lines}\\}

\newcounter{vtml}
\setcounter{vtml}{0}

\newif\ifvtimelinetitle
\newif\ifvtimebottomline
\tikzset{description/.style={
column 2/.append style={#1}
},
timeline color/.store in=\vtmlcolor,
timeline color=red!80!black,
timeline color st/.style={fill=\vtmlcolor,draw=\vtmlcolor},
timeline title/.store in=\vtimelinetitle,
timeline title={},
line offset/.store in=\lineoffset,
line offset=4pt,
}

\NewEnviron{vtimeline}[1][]{%
\setcounter{lines}{1}%
\stepcounter{vtml}%
\begin{tikzpicture}[column 1/.style={anchor=east},
column 2/.style={anchor=west},
text depth=0pt,text height=1ex,
row sep=1ex,
column sep=1em,
#1
]
\matrix(vtimeline\thevtml)[matrix of nodes]{\BODY};
\pgfmathtruncatemacro\endmtx{\thelines-1}
\path[timeline color st]
($(vtimeline\thevtml-1-1.north east)!0.5!(vtimeline\thevtml-1-2.north west)$)--
($(vtimeline\thevtml-\endmtx-1.south east)!0.5!(vtimeline\thevtml-\endmtx-2.south west)$);
\foreach \x in {1,...,\endmtx}{
\node[circle,timeline color st, inner sep=0.15pt, draw=white, thick]
(vtimeline\thevtml-c-\x) at
($(vtimeline\thevtml-\x-1.east)!0.5!(vtimeline\thevtml-\x-2.west)$){};
\draw[timeline color st](vtimeline\thevtml-c-\x.west)--++(-3pt,0);
}
\ifvtimelinetitle%
\draw[timeline color st]([yshift=\lineoffset]vtimeline\thevtml.north west)--
([yshift=\lineoffset]vtimeline\thevtml.north east);
\node[anchor=west,yshift=16pt,font=\large]
at (vtimeline\thevtml-1-1.north west)
{\textsc{Timeline \thevtml}: \textit{\vtimelinetitle}};
\else%
\relax%
\fi%
\ifvtimebottomline%
\draw[timeline color st]([yshift=-\lineoffset]vtimeline\thevtml.south west)--
([yshift=-\lineoffset]vtimeline\thevtml.south east);
\else%
\relax%
\fi%
\end{tikzpicture}
}

\begin{document}

\begin{vtimeline}[timeline color=cyan!80!blue, add bottom line, line offset=2pt]
1947 & AT and T Bell Labs develop the idea of cellular phones\endlr
1968 & Xerox Palo Alto Research Centre envisage the Dynabook'\endlr
1971 & Busicom 'Handy-LE' Calculator\endlr
1973 & First mobile handset invented by Martin Cooper\endlr
1978 & Parker Bros. Merlin Computer Toy\endlr
1981 & Osborne 1 Portable Computer\endlr
1982 & Grid Compass 1100 Clamshell Laptop\endlr
1983 & TRS-80 Model 100 Portable PC\endlr
1984 & Psion Organiser Handheld Computer\endlr
1991 & Psion Series 3 Minicomputer\endlr
\end{vtimeline}

\end{document}

• I used the solution here: vertical timeline tikz clash with beamer poster
– Una
Sep 20, 2020 at 23:29
• Honestly I wish I could combine the two. Torbjørn T's is prettier but I wish I could manipulate the lines for when entries are very close to one another.
– SKNB
Sep 22, 2020 at 18:17

That specific approach uses a \matrix to lay out the timeline, so it's not straightforward to adjust the row spacing as you want to. A different approach would be to use pgfplots and make the timeline with an actual plot. The text can be added with nodes near coords.

I haven't tried wrapping this in a macro/environment as in the post you refer to, but I can try doing that tomorrow, if you want to.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{charter}
\usepackage{pgfplotstable}

year ; label
1947 ; AT and T Bell Labs develop the idea of cellular phones
1968 ; Xerox Palo Alto Research Centre envisage the Dynabook'
1971 ; Busicom 'Handy-LE' Calculator
1973 ; First mobile handset invented by Martin Cooper
1978 ; Parker Bros. Merlin Computer Toy
1981 ; Osborne 1 Portable Computer
1982 ; Grid Compass 1100 Clamshell Laptop
1983 ; TRS-80 Model 100 Portable PC
1984 ; Psion Organiser Handheld Computer
1991 ; Psion Series 3 Minicomputer
}\datatable

\begin{document}
\begin{tikzpicture}
\begin{axis}[
y dir=reverse,
footnotesize,
hide x axis,
axis y line=left,
axis line style={-, draw=none},
ytick=data,
xmin=0.99,
clip=false,
nodes near coords,
nodes near coords align=right,
point meta=explicit symbolic,
yticklabel style={
/pgf/number format/set thousands separator={},
inner sep=1pt
},
scale only axis,
width=1mm,
height=15cm,
tick align=outside,
every tick/.append style={thin, cyan}
]

\addplot [mark=*,cyan,mark size=2, shorten <=-2mm, shorten >=-2mm, thick] table[y index=0, x expr=1, meta=label] {\datatable};

\end{axis}
\end{tikzpicture}
\end{document}


• It's pretty near perfect for what I'm looking for. And it helps me wrap my head around the enigma that is tikz/pgf, so thanks a million (: My only question(s): is there a way to extend a line like @Una's answer for only some entries (i.e. when two entries are so close to one another that they'd overlap)? And is there a way to break long entries into two lines (i.e. 1 point but 2 right-hand line)? I'm using this for a daily 24h log, and entries are often within 5 minutes of each other. Which even with the timeline spanning the full vertical height of the page still overlaps.
– SKNB
Sep 22, 2020 at 18:16
• I'll just mark it as solved in any event
– SKNB
Sep 22, 2020 at 18:18
• @SKNB For line breaking, if you add nodes near coords style={anchor=mid west, align=left}, to the axis options you can use \\ in the data file to add line breaks manually. Alternatively, text width=8cm (or some other suitable length) instead of align=left`, for automatic line breaking. Don't have a solution for the other problem, it's probably possible, but would take some work. Sep 22, 2020 at 18:27