更新代码
%I added my full preamble for proper compiling
\PassOptionsToPackage{table,dvipsnames,svgnames}{xcolor}
\documentclass[11pt, twoside, a4paper]{report}
\usepackage[inner = 30mm, outer = 20mm, top = 30mm, bottom = 20mm, headheight = 13.6pt]{geometry}
\usepackage{emptypage}
\usepackage[toc,page]{appendix}
\usepackage{tikz}
\usepackage[pdfpagelayout=TwoPageRight]{hyperref}
\usepackage{listings}
\usepackage{multicol}
\usepackage{apacite}
\usepackage{color}
\usepackage{textcomp}
\usepackage{chngcntr}
\usepackage[export]{adjustbox}
\hypersetup{colorlinks=true, linktoc=all, allcolors=green!30!black,}
\usepackage{booktabs, siunitx, caption}
\newcommand{\source}[1]{\vspace{-8pt} \caption*{ Source: {#1}} }
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{slashbox}
\usepackage[caption=false]{subfig}
\usepackage{array}
\newlength\tbspace
\setlength\tbspace{3cm}
\newcolumntype{L}{l<{\hspace{\tbspace}}}
\usepackage{wrapfig}
\graphicspath{ {./Figures/} }
\usepackage{gensymb}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
\patchcmd{\@makechapterhead}{\vspace*{50\p@}}{}{}{}% Removes space above \chapter head
\patchcmd{\@makeschapterhead}{\vspace*{50\p@}}{}{}{}% Removes space above \chapter* head
\makeatother
\usepackage{pgfplots}
\pgfplotsset{compat=1.11,
/pgfplots/ybar legend/.style={
/pgfplots/legend image code/.code={%
\draw[##1,/tikz/.cd,yshift=-0.25em]
(0cm,0cm) rectangle (3pt,0.8em);},},}
\usepgfplotslibrary{statistics}
\usetikzlibrary{arrows}
\usepackage{tcolorbox}
\usepackage{fancyhdr}
\usepackage{layouts}
\usepackage{chronology}
%\usepackage{showframe}
\raggedbottom
\fancyfoot{}
\fancyhead{}
\fancyfoot[LE]{\thepage}
\fancyfoot[RO]{\thepage}
\fancyhead[LE]{\nouppercase{\leftmark}}
\fancyhead[RO]{\nouppercase{\rightmark}}
\pagestyle{fancy}
% Redefine the plain page style so chapter pages match my footer preference
\fancypagestyle{plain}{%
\fancyhf{}%
\fancyfoot[LE]{\thepage}
\fancyfoot[RO]{\thepage}
\renewcommand{\headrulewidth}{0pt}% Line at the header invisible
\renewcommand{\footrulewidth}{0pt}% Line at the footer visible
}
\usetikzlibrary{arrows.meta,calc,positioning}
\colorlet{A}{gray}
\colorlet{B}{lightgray}
\colorlet{C}{white}
\pgfdeclarelayer{background}
\pgfdeclarelayer{timeline}
\pgfdeclarelayer{period}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,timeline,period,main,foreground}
%https://tex.stackexchange.com/a/349215
\tikzset{
timeline/.style={arrows={}}%
,timeline style/.style={timeline/.append style={#1}}%
,year label/.style={font=\small\sffamily\bfseries,below}%
,year label style/.style={year label/.append style={#1}}%
,year tick/.style={tick size=0pt}%
,year tick style/.style={year tick/.append style={#1}}%
,minor tick/.style={tick size=0pt, very thin}%
,minor tick style/.style={minor tick/.append style={#1}}%
,period/.style={solid,line width=\timelinewidth,line cap=square}%
,periodbox/.style={font=\small\sffamily\bfseries,text=black}%
,eventline/.style={draw,red,thick,line cap=round,line join=round}%
,eventbox/.style={rectangle,rounded corners=3pt,inner sep=3pt,fill=red!25!white,text width=3cm,anchor=west,text=black,align=left,font=\small}%
,tick size/.code={\def\ticksize{#1}}%
,labeled years step/.code={\def\yearlabelstep{#1}}%
,minor tick step/.code={\def\minortickstep{#1}}%
,year tick step/.code={\def\yeartickstep{#1}}%
,enlarge timeline/.code={\def\enlarge{#1}}%
,eventboxa/.style={eventbox,text width=#1,draw=A,fill=none}%
,eventboxb/.style={eventbox,text width=#1,draw=A,fill=none}%
}
% Still from %https://tex.stackexchange.com/a/349215
\newcommand*{\drawtimeline}[5][]{%
\def\fromyear{#2}%
\def\toyear{#3}%
\def\timelinesize{#4}%
\def\timelinewidth{#5}%
\pgfmathsetmacro{\timelinesizept}{\timelinesize}%
\pgfmathsetmacro{\timelinewidthpt}{\timelinewidth}%
\pgfmathsetmacro{\timelineoffset}{\timelinewidth/2}
\pgfmathsetmacro{\timelineoffsetpt}{\timelineoffset}
%
\begin{scope}[x=1pt, y=1pt, % Change main units to pt
labeled years step=1,% Set some defaults
minor tick step=0.25,%
enlarge timeline=0cm,%
year tick step=1,#1]
\pgfmathsetmacro{\enlargept}{\enlarge}
\pgfmathsetmacro{\yearticksep}{\timelinesize/((\toyear-\fromyear)/\yeartickstep)}
\pgfmathsetmacro{\minorticksep}{\timelinesize/((\toyear-\fromyear)/\minortickstep)}
\pgfmathsetmacro{\minorticklast}{\minorticksep/\minortickstep}
\foreach \y[remember=\y as \lasty (initially 0), count=\i from \fromyear] in {0,\yearticksep,...,\timelinesizept}{
\coordinate (Y-\i) at (\y,0);
\draw[year tick] (\y,-\ticksize/2) -- ++(0,\ticksize);
\ifnum\i=\toyear\breakforeach\else
\foreach \q[count=\j from 0] in {0,\minorticksep,...,\minorticklast}
{
\coordinate (Y-\i-\j) at (\q+\y,0);
\begin{pgfonlayer}{timeline}
\draw[minor tick] (\q+\y,-\ticksize/2) -- ++(0,\ticksize);
\end{pgfonlayer}
};\fi};%
\pgfmathsetmacro{\nextyear}{int(\fromyear+\yearlabelstep)}
\begin{pgfonlayer}{timeline}
\draw[timeline] (0,0) -- ++(-\enlargept,0) (0,0) -- ++(\timelinesizept,0) coordinate (end) -- ++(\enlargept,0);% Timeline
\end{pgfonlayer}
% \foreach \y in {\fromyear,\nextyear,...,\toyear} \node[year label] at (Y-\y) {\y};
\end{scope}%
}
% Put a period identifier midway between the start and end of the period
% 1 = color of timeline segment
% 2 = period start
% 3 = period end
% 4 = period text
\newcommand{\period}[5]{\begin{pgfonlayer}{period} \draw[period,#1] (Y-#2) -- (Y-#3) node[periodbox,#5,midway,text=white] {\begin{tabular}{l} #4
\end{tabular}}; \end{pgfonlayer}}
%This somewhat follows @cfr's Chronos. It was certainly inspired by Chronos.
%https://tex.stackexchange.com/a/349236
% 1 = format of line and box
% 2 = starting coordinate
% 3 = pin associated with starting coordinate (well suited to using polar coordinate)
% 4 = branch at top of pin (well suited to using polar coordinate)
% 5 = Any extra formatting of node
% 6 = Name of node
% 7 = Node content
\newcommand{\vevent}[7]{\begin{pgfonlayer}{timeline} \draw[eventline,#1](Y-#2) -- ++(#3) -- ++(#4) node[#5] (#6) {#7}; \end{pgfonlayer}}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\drawtimeline[
labeled years step=1,
minor tick step=0.083333,
timeline style={draw=gray,line width=\timelinewidthpt},
minor tick style={-,lightgray,tick size=0pt,line width=0pt,yshift=-\timelineoffsetpt},
]%
{2017}{2019}{19cm}{0.5cm};
%
\period{A}{2017-0}{2017-1}{'17}{}
\period{B}{2017-1}{2017-2}{F}{}
\period{A}{2017-2}{2017-3}{M}{}
\period{B}{2017-3}{2017-4}{A}{}
\period{A}{2017-4}{2017-5}{M}{}
\period{B}{2017-5}{2017-6}{J}{}
\period{A}{2017-6}{2017-7}{J}{}
\period{B}{2017-7}{2017-8}{A}{}
\period{A}{2017-8}{2017-9}{S}{}
\period{B}{2017-9}{2017-10}{O}{}
\period{A}{2017-10}{2017-11}{N}{}
\period{B}{2017-11}{2017-12}{D}{}
\period{A}{2018-0}{2018-1}{'18}{}
\period{B}{2018-1}{2018-2}{F}{}
\period{A}{2018-2}{2018-3}{M}{}
\period{B}{2018-3}{2018-4}{A}{}
\period{A}{2018-4}{2018-5}{M}{}
\period{B}{2018-5}{2018-6}{J}{}
\period{A}{2018-6}{2018-7}{J}{}
\period{B}{2018-7}{2018-8}{A}{}
\period{C}{2018-8}{2018-12}{empty}{}
%
\vevent{A}{2017-0}{90:1cm}{45:0.5cm}{eventboxa=4cm,anchor=west}{H}{Start of ZoW consortium\\10 Jan '17}
\vevent{A}{2017-5}{-90:2cm}{45:-0.5cm}{eventboxa=3cm,anchor=east}{H}{1\textsuperscript{st} Symposium\\8 Jun '17}
\vevent{A}{2017-7}{90:1cm}{45:0.5cm}{eventboxa=2.5cm,anchor=west}{H}{Completion of \\FPV systems\\ 20 Jul '17}
\vevent{A}{2017-12}{-90:2cm}{45:-0.5cm}{eventboxa=3cm,anchor=east}{H}{2\textsuperscript{nd} Symposium\\14 Dec '17}
\vevent{A}{2018-0}{90:1cm}{45:0.5cm}{eventboxa=2cm,anchor=west}{H}{Storm\\3 Jan '18}
\vevent{A}{2018-0}{90:2cm}{45:0.5cm}{eventboxa=2cm,anchor=west}{H}{Storm\\18 Jan '18}
\vevent{A}{2018-6}{-90:2cm}{45:-0.5cm}{eventboxa=3cm,anchor=east}{H}{3\textsuperscript{rd} Symposium\\14 Jun '18}
%
\node[draw=none,rectangle,fill=blue!70!black,text width=5cm,minimum height=1cm, text=white, align=center,font=\normalsize] (AA) at ([yshift=-0.9cm]Y-2018-4) {Internship \\ 12 Feb - 10 Aug};
\end{tikzpicture}
\caption{Timeline}
\label{fig:timeline}
\end{figure}
\end{document}
剩余的问题是:
- 我无法让实习框在 2 月 12 日至 8 月 10 日之间浮动。我必须更改位置的唯一变量是
text width=5cm
和([yshift=-0.9cm]Y-2018-4)
,对吗? - 我希望实习框具有与事件标签相同的圆边
- 我希望将事件安排在发生的确切日期,而不是月初或月末。
- 我想将灰色栏中的字体更改为默认的 Computer Modern
答案1
这不符合您的要求,因为我借用了@GuilhermeZanotelli 和@cfr 的回答:tikz 年表 年 季度 时间轴以及一些从这些来源衍生的代码,我经常使用这些代码。由于最后一个原因,这个答案中存在冗余代码,例如设置为执行某些操作但此处不需要的层。
代码:
- 绘制一条跨越 2 年(2017-2018 年)的时间线 (@GuilhermeZanotelli),物理长度为 50 厘米,宽度为 2 厘米。时间线的右端需要裁剪,因为代码绘制的是完整的年份。
- 月份可以通过以下形式的坐标来识别
Y-Year-Month
(@GuilhermeZanotelli),例如 Y-2017-1 对应 2017 年 1 月底。请注意,Y-2017-0 是 1 月初。 - 该命令
\period
在时间线上确定与指定开始和结束日期相对应的节点。period
应用其第一个参数(这里是 A 和 B)给出的样式。 \vevent
使用命令(在@cfr 之后)定位时间线事件Chronos
。其格式也由其第一个可选参数决定。垂直位置由的\vevent
第二个和第三个参数给出。使用极坐标给出垂直位置很方便。它允许将事件放置在时间线的上方或下方,并将事件文本放置在其图钉的左侧或右侧。\vevent
将事件放置在月初。如果需要微调位置以与事件的日期相对应,可以应用偏移,但这里没有实现。
结果如下:
这是代码:
\PassOptionsToPackage{table,dvipsnames,svgnames}{xcolor}
\documentclass[tikz,margin=1cm]{standalone}
\usetikzlibrary{arrows.meta,calc,positioning}
\colorlet{A}{gray}
\colorlet{B}{lightgray}
\pgfdeclarelayer{background}
\pgfdeclarelayer{timeline}
\pgfdeclarelayer{period}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,timeline,period,main,foreground}
%https://tex.stackexchange.com/a/349215
\tikzset{
timeline/.style={arrows={}}%
,timeline style/.style={timeline/.append style={#1}}%
,year label/.style={font=\Huge\sffamily\bfseries,below}%
,year label style/.style={year label/.append style={#1}}%
,year tick/.style={tick size=5pt}%
,year tick style/.style={year tick/.append style={#1}}%
,minor tick/.style={tick size=2pt, very thin}%
,minor tick style/.style={minor tick/.append style={#1}}%
,period/.style={solid,line width=\timelinewidth,line cap=square}%
,periodbox/.style={font=\Huge\sffamily\bfseries,text=black}%
,eventline/.style={draw,red,thick,line cap=round,line join=round}%
,eventbox/.style={rectangle,rounded corners=3pt,inner sep=3pt,fill=red!25!white,text width=3cm,anchor=west,text=black,align=left,font=\large}%
,tick size/.code={\def\ticksize{#1}}%
,labeled years step/.code={\def\yearlabelstep{#1}}%
,minor tick step/.code={\def\minortickstep{#1}}%
,year tick step/.code={\def\yeartickstep{#1}}%
,enlarge timeline/.code={\def\enlarge{#1}}%
,eventboxa/.style={eventbox,text width=#1,draw=A,fill=none}%
,eventboxb/.style={eventbox,text width=#1,draw=A,fill=none}%
}
% Still from %https://tex.stackexchange.com/a/349215
\newcommand*{\drawtimeline}[5][]{%
\def\fromyear{#2}%
\def\toyear{#3}%
\def\timelinesize{#4}%
\def\timelinewidth{#5}%
\pgfmathsetmacro{\timelinesizept}{\timelinesize}%
\pgfmathsetmacro{\timelinewidthpt}{\timelinewidth}%
\pgfmathsetmacro{\timelineoffset}{\timelinewidth/2}
\pgfmathsetmacro{\timelineoffsetpt}{\timelineoffset}
%
\begin{scope}[x=1pt, y=1pt, % Change main units to pt
labeled years step=1,% Set some defaults
minor tick step=0.25,%
enlarge timeline=0cm,%
year tick step=1,#1]
\pgfmathsetmacro{\enlargept}{\enlarge}
\pgfmathsetmacro{\yearticksep}{\timelinesize/((\toyear-\fromyear)/\yeartickstep)}
\pgfmathsetmacro{\minorticksep}{\timelinesize/((\toyear-\fromyear)/\minortickstep)}
\pgfmathsetmacro{\minorticklast}{\minorticksep/\minortickstep}
\foreach \y[remember=\y as \lasty (initially 0), count=\i from \fromyear] in {0,\yearticksep,...,\timelinesizept}{
\coordinate (Y-\i) at (\y,0);
\draw[year tick] (\y,-\ticksize/2) -- ++(0,\ticksize);
\ifnum\i=\toyear\breakforeach\else
\foreach \q[count=\j from 0] in {0,\minorticksep,...,\minorticklast}{
\coordinate (Y-\i-\j) at (\q+\y,0);
\begin{pgfonlayer}{timeline}
\draw[minor tick] (\q+\y,-\ticksize/2) -- ++(0,\ticksize);
\end{pgfonlayer}
};\fi};%
\pgfmathsetmacro{\nextyear}{int(\fromyear+\yearlabelstep)}
\begin{pgfonlayer}{timeline}
\draw[timeline] (0,0) -- ++(-\enlargept,0) (0,0) -- ++(\timelinesizept,0) coordinate (end) -- ++(\enlargept,0);% Timeline
\end{pgfonlayer}
% \foreach \y in {\fromyear,\nextyear,...,\toyear} \node[year label] at (Y-\y) {\y};
\end{scope}%
}
% Put a period identifier midway between the start and end of the period
% 1 = color of timeline segment
% 2 = period start
% 3 = period end
% 4 = period text
\newcommand{\period}[5]{\begin{pgfonlayer}{period} \draw[period,#1] (Y-#2) -- (Y-#3) node[periodbox,#5,midway,text=white] {\begin{tabular}{l} #4 \end{tabular}}; \end{pgfonlayer}}
%This somewhat follows @cfr's Chronos. It was certainly inspired by Chronos.
%https://tex.stackexchange.com/a/349236
% 1 = format of line and box
% 2 = starting coordinate
% 3 = pin associated with starting coordinate (well suited to using polar coordinate)
% 4 = branch at top of pin (well suited to using polar coordinate)
% 5 = Any extra formatting of node
% 6 = Name of node
% 7 = Node content
\newcommand{\vevent}[7]{\begin{pgfonlayer}{timeline} \draw[eventline,#1](Y-#2) -- ++(#3) -- ++(#4) node[#5] (#6) {#7}; \end{pgfonlayer}}
\begin{document}
\begin{tikzpicture}
\drawtimeline[
labeled years step=1,
minor tick step=0.083333,
timeline style={draw=gray,line width=\timelinewidthpt},
minor tick style={-,lightgray,tick size=3pt,line width=3pt,yshift=-\timelineoffsetpt},
]%
{2017}{2019}{50cm}{2cm};
%
\period{A}{2017-0}{2017-2}{2017\\J-F}{}
\period{B}{2017-2}{2017-4}{M-A}{}
\period{A}{2017-4}{2017-6}{M-J}{}
\period{B}{2017-6}{2017-8}{J-A}{}
\period{A}{2017-8}{2017-10}{S-O}{}
\period{B}{2017-10}{2017-12}{N-D}{}
\period{A}{2018-0}{2018-2}{2018\\J-F}{}
\period{B}{2018-2}{2018-4}{M-A}{}
\period{A}{2018-4}{2018-6}{M-J}{}
\period{B}{2018-6}{2018-8}{J-A}{}
%
\vevent{A}{2017-0}{90:2.5cm}{45:0.5cm}{eventboxa=5cm,anchor=west}{H}{Start of ZoW consortium\\10 Jan}
\vevent{A}{2017-6}{-90:2.5cm}{-45:0.5cm}{eventboxa=4cm,anchor=west}{H}{1st Symposium\\8 Jun}
\vevent{A}{2017-7}{90:2.5cm}{45:0.5cm}{eventboxa=4cm,anchor=west}{H}{1st Symposium\\8 Jun}
\vevent{A}{2017-12}{-90:2.5cm}{-45:0.5cm}{eventboxa=4cm,anchor=west}{H}{2nd Symposium\\8 Jun}
\vevent{A}{2018-0}{90:2.5cm}{45:0.5cm}{eventboxa=4cm,anchor=west}{H}{Storm\\Jan}
\vevent{A}{2018-0}{90:4.5cm}{45:0.5cm}{eventboxa=4cm,anchor=west}{H}{Storm\\18 Jan}
\vevent{A}{2018-6}{-90:2.5cm}{-45:0.5cm}{eventboxa=4cm,anchor=west}{H}{3rd Symposium\\14 Jun}
%
\node[draw=none,rectangle,fill=cyan,text width=10cm,minimum height=1cm,text=black,align=center,font=\Large] (AA) at ([yshift=-5cm]Y-2018-5) {Internship};
\node[below=0.5cm of AA,font=\large] {12 Feb - 10 Aug};
\end{tikzpicture}
\end{document}
更新
已更新以反映新要求:
- 计算实习节点的定位,并使用
\fnode
以下新命令进行定位绘制由对角坐标定义的矩形节点,文本垂直居中。格式化,包括圆角,用样式完成block
。 - 使用部分计算将事件放置在与月份日期相对应的位置(请参阅 Tikz 手册第 4.2.1 节)。该方法假设每个月有 31 天。我用它来
ifthenelse
确定事件的正确位置。 - 从键中删除
\sffamily
以格式化周期标签。
结果如下:
这是代码:
\PassOptionsToPackage{table,dvipsnames,svgnames}{xcolor}
\documentclass[11pt, twoside, a4paper]{report}
\usepackage[inner = 30mm, outer = 20mm, top = 30mm, bottom = 20mm, headheight = 13.6pt]{geometry}
%\usepackage{emptypage}
%\usepackage[toc,page]{appendix}
\usepackage{tikz}
\usetikzlibrary{calc,fit,arrows.meta,calc,positioning}
\usepackage{xifthen}
%\usepackage[pdfpagelayout=TwoPageRight]{hyperref}
%\usepackage{listings}
%\usepackage{multicol}
%\usepackage{apacite}
%\usepackage{color}
%\usepackage{textcomp}
%\usepackage{chngcntr}
%\usepackage[export]{adjustbox}
%\hypersetup{colorlinks=true, linktoc=all, allcolors=green!30!black,}
%\usepackage{booktabs, siunitx, caption}
%\newcommand{\source}[1]{\vspace{-8pt} \caption*{ Source: {#1}} }
%\usepackage{amsmath}
%\usepackage{graphicx}
%\usepackage{slashbox}
%\usepackage[caption=false]{subfig}
%\usepackage{array}
%\newlength\tbspace
%\setlength\tbspace{3cm}
%\newcolumntype{L}{l<{\hspace{\tbspace}}}
%
%\usepackage{wrapfig}
%\graphicspath{ {./Figures/} }
%\usepackage{gensymb}
%\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
%\makeatletter
%\patchcmd{\@makechapterhead}{\vspace*{50\p@}}{}{}{}% Removes space above \chapter head
%\patchcmd{\@makeschapterhead}{\vspace*{50\p@}}{}{}{}% Removes space above \chapter* head
%\makeatother
%\usepackage{pgfplots}
%\pgfplotsset{compat=1.11,
% /pgfplots/ybar legend/.style={
% /pgfplots/legend image code/.code={%
% \draw[##1,/tikz/.cd,yshift=-0.25em]
% (0cm,0cm) rectangle (3pt,0.8em);},},}
%\usepgfplotslibrary{statistics}
%\usetikzlibrary{arrows}
%\usepackage{tcolorbox}
%\usepackage{fancyhdr}
%\usepackage{layouts}
%\usepackage{chronology}
%\usepackage{showframe}
%\raggedbottom
%\fancyfoot{}
%\fancyhead{}
%\fancyfoot[LE]{\thepage}
%\fancyfoot[RO]{\thepage}
%\fancyhead[LE]{\nouppercase{\leftmark}}
%\fancyhead[RO]{\nouppercase{\rightmark}}
%\pagestyle{fancy}
%
%% Redefine the plain page style so chapter pages match my footer preference
%\fancypagestyle{plain}{%
%\fancyhf{}%
%\fancyfoot[LE]{\thepage}
%\fancyfoot[RO]{\thepage}
%\renewcommand{\headrulewidth}{0pt}% Line at the header invisible
%\renewcommand{\footrulewidth}{0pt}% Line at the footer visible
%}
\colorlet{A}{gray}
\colorlet{B}{lightgray}
\colorlet{C}{white}
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
%https://tex.stackexchange.com/a/349215
\tikzset{
timeline/.style={arrows={}}%
,timeline style/.style={timeline/.append style={#1}}%
,year label/.style={font=\small\bfseries,below}% <- removed \sffamily
,year label style/.style={year label/.append style={#1}}%
,year tick/.style={tick size=0pt}%
,year tick style/.style={year tick/.append style={#1}}%
,minor tick/.style={tick size=0pt, very thin}%
,minor tick style/.style={minor tick/.append style={#1}}%
,period/.style={solid,line width=\timelinewidth,line cap=square}%
,periodbox/.style={font=\small\bfseries,text=black}% <- removed \sffamily
,eventline/.style={draw,red,thick,line cap=round,line join=round}%
,eventbox/.style={rectangle,rounded corners=3pt,inner sep=3pt,fill=red!25!white,text width=3cm,anchor=west,text=black,align=left,font=\small}%
,tick size/.code={\def\ticksize{#1}}%
,labeled years step/.code={\def\yearlabelstep{#1}}%
,minor tick step/.code={\def\minortickstep{#1}}%
,year tick step/.code={\def\yeartickstep{#1}}%
,enlarge timeline/.code={\def\enlarge{#1}}%
,eventboxa/.style={eventbox,text width=#1,draw=A,fill=none}%
,eventboxb/.style={eventbox,text width=#1,draw=A,fill=none}%
}
% Still from %https://tex.stackexchange.com/a/349215
\newcommand*{\drawtimeline}[5][]{%
\def\fromyear{#2}%
\def\toyear{#3}%
\def\timelinesize{#4}%
\def\timelinewidth{#5}%
\pgfmathsetmacro{\timelinesizept}{\timelinesize}%
\pgfmathsetmacro{\timelinewidthpt}{\timelinewidth}%
\pgfmathsetmacro{\timelineoffset}{\timelinewidth/2}
\pgfmathsetmacro{\timelineoffsetpt}{\timelineoffset}
%
\begin{scope}[x=1pt, y=1pt, % Change main units to pt
labeled years step=1,% Set some defaults
minor tick step=0.25,%
enlarge timeline=0cm,%
year tick step=1,#1]
\pgfmathsetmacro{\enlargept}{\enlarge}
\pgfmathsetmacro{\yearticksep}{\timelinesize/((\toyear-\fromyear)/\yeartickstep)}
\pgfmathsetmacro{\minorticksep}{\timelinesize/((\toyear-\fromyear)/\minortickstep)}
\pgfmathsetmacro{\minorticklast}{\minorticksep/\minortickstep}
\foreach \y[remember=\y as \lasty (initially 0), count=\i from \fromyear] in {0,\yearticksep,...,\timelinesizept}{
\coordinate (Y-\i) at (\y,0);
\draw[year tick] (\y,-\ticksize/2) -- ++(0,\ticksize);
\ifnum\i=\toyear\breakforeach\else
\foreach \q[count=\j from 0] in {0,\minorticksep,...,\minorticklast}
{
\coordinate (Y-\i-\j) at (\q+\y,0);
\draw[minor tick] (\q+\y,-\ticksize/2) -- ++(0,\ticksize);
};\fi};%
\pgfmathsetmacro{\nextyear}{int(\fromyear+\yearlabelstep)}
\draw[timeline] (0,0) -- ++(-\enlargept,0) (0,0) -- ++(\timelinesizept,0) coordinate (end) -- ++(\enlargept,0);% Timeline
% \foreach \y in {\fromyear,\nextyear,...,\toyear} \node[year label] at (Y-\y) {\y};
\end{scope}%
}
% Put a period identifier midway between the start and end of the period
% 1 = color of timeline segment
% 2 = period start
% 3 = period end
% 4 = period text
\newcommand{\period}[5]{\draw[period,#1] (Y-#2) -- (Y-#3) node[periodbox,#5,midway,text=white] {#4};}
%This somewhat follows @cfr's Chronos. It was certainly inspired by Chronos.
%https://tex.stackexchange.com/a/349236
% 1 = format of line and box
% 2 = year
% 3 = month
% 4 = day in month
% 5 = pin associated with starting coordinate (well suited to using polar coordinate)
% 6 = branch at top of pin (well suited to using polar coordinate)
% 7 = Any extra formatting of node
% 8 = Name of node
% 9 = Node content
\newcommand{\vevent}[9]{
\pgfmathtruncatemacro{\syr}{#2}
\pgfmathtruncatemacro{\smth}{#3-1}
\pgfmathsetmacro{\dim}{#4/31}
\ifthenelse{#3=12}{%
\pgfmathtruncatemacro{\fyr}{#2+1}
\pgfmathtruncatemacro{\fmth}{0}
}{%
\pgfmathtruncatemacro{\fyr}{#2}
\pgfmathtruncatemacro{\fmth}{#3}
}
\draw[eventline,#1]($(Y-\syr-\smth)!\dim!(Y-\fyr-\fmth)$) -- ++(#5) -- ++(#6) node[#7] (#8) {#9};
}
% https://tex.stackexchange.com/questions/255298/draw-rectangular-nodes-defined-by-opposing-corner-coordinates-with-vertically-ce
\tikzset{
block/.style 2 args = {
draw=none, inner sep=0, outer sep=0,
rounded corners=3pt,
fit=(#1) (#2)}
}
\newcommand{\fnode}[4][]{
\coordinate (bottom left) at (#2);
\coordinate (top right) at (#3);
\node[block={bottom left}{top right}, #1, label=center:#4] {};
}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\drawtimeline[
labeled years step=1,
minor tick step=0.083333,
timeline style={draw=gray,line width=\timelinewidthpt},
minor tick style={-,lightgray,tick size=0pt,line width=0pt,yshift=-\timelineoffsetpt},
]%
{2017}{2019}{19cm}{0.5cm};
%
\period{A}{2017-0}{2017-1}{'17}{}
\period{B}{2017-1}{2017-2}{F}{}
\period{A}{2017-2}{2017-3}{M}{}
\period{B}{2017-3}{2017-4}{A}{}
\period{A}{2017-4}{2017-5}{M}{}
\period{B}{2017-5}{2017-6}{J}{}
\period{A}{2017-6}{2017-7}{J}{}
\period{B}{2017-7}{2017-8}{A}{}
\period{A}{2017-8}{2017-9}{S}{}
\period{B}{2017-9}{2017-10}{O}{}
\period{A}{2017-10}{2017-11}{N}{}
\period{B}{2017-11}{2017-12}{D}{}
\period{A}{2018-0}{2018-1}{'18}{}
\period{B}{2018-1}{2018-2}{F}{}
\period{A}{2018-2}{2018-3}{M}{}
\period{B}{2018-3}{2018-4}{A}{}
\period{A}{2018-4}{2018-5}{M}{}
\period{B}{2018-5}{2018-6}{J}{}
\period{A}{2018-6}{2018-7}{J}{}
\period{B}{2018-7}{2018-8}{A}{}
\period{C}{2018-8}{2018-12}{empty}{}
%
\begin{pgfonlayer}{background}
\vevent{A}{2017}{1}{10}{90:1cm}{45:0.5cm}{eventboxa=4cm,anchor=west}{H}{Start of ZoW consortium\\10 Jan '17}
\vevent{A}{2017}{6}{8}{-90:2cm}{45:-0.5cm}{eventboxa=3cm,anchor=east}{H}{1\textsuperscript{st} Symposium\\8 Jun '17}
\vevent{A}{2017}{7}{20}{90:1cm}{45:0.5cm}{eventboxa=2.5cm,anchor=west}{H}{Completion of \\FPV systems\\ 20 Jul '17}
\vevent{A}{2017}{12}{14}{-90:2cm}{45:-0.5cm}{eventboxa=3cm,anchor=east}{H}{2\textsuperscript{nd} Symposium\\14 Dec '17}
\vevent{A}{2018}{1}{3}{90:2cm}{45:0.5cm}{eventboxa=2cm,anchor=west}{H}{Storm\\3 Jan '18}
\vevent{A}{2018}{1}{18}{90:1cm}{45:0.5cm}{eventboxa=2cm,anchor=west}{H}{Storm\\18 Jan '18}
\vevent{A}{2018}{6}{14}{-90:2cm}{45:-0.5cm}{eventboxa=3cm,anchor=east}{H}{3\textsuperscript{rd} Symposium\\14 Jun '18}
\end{pgfonlayer}
%
\coordinate (AA) at ([yshift=-1.6cm]$(Y-2018-1)!0.43!(Y-2018-2)$); % Bottom left
\coordinate (BB) at ([yshift=-0.6cm]$(Y-2018-7)!0.32!(Y-2018-8)$); % Top right
\fnode[fill=cyan]{AA}{BB}{Internship}
\end{tikzpicture}
\caption{Timeline}
\label{fig:timeline}
\end{figure}
\end{document}