[Tex/LaTex] Partially transparent gray chronoevents in the chronosys timeline? Or using any other Plain-TeX, LaTeX, LuaLaTeX, or even a XeLaTex package or method

chronosyscolorplain-textikz-pgf

While putting together a "traditional" timeline, I kludged together a means of coloring my boxes in chronosys, but I would like the event boxes to be partially transparent.

This would allow better eye-tracking, particularly when events are close together, with different mark depths. Please see the below mock up, made with Gimp, for how this might look.

It would also be nice if the text was better aligned to the colorbox, notice the "s" in Darwin and the "m-" in Empire. My kludge code seems to work but produces errors. **(Thanks to Kola B., and see Gray vs. grey)

The code is below:

\documentclass[letterpaper,12pt,landscape]{article}
\usepackage[T1]{fontenc}
\usepackage{chronosys}

\begin{document}

\subsection*{Biographical cornerstones}
\startchronology[startyear=1850,stopyear=1950,height=0.5ex]

\chronoevent[textwidth=4.5cm,colorbox={grey!10},markdepth=100pt]%
{1882}{born in the Austrian part of the Austria-Hungarian Empire}
\chronoevent[textwidth=4cm,colorbox={grey!10},markdepth=40pt]%
{1885}{Publication of Darwin's Evolutionary Theory}

\stopchronology

\end{document}

A sample of the above when compiled:

enter image description here

A crude mock up of what this might look like:

The chronosys documentation does not mention transparency as an option, but as it uses Tikz (for drawing lines), and colorbox (for events) and I believe transparency is possible.

I tried the following, attempting to use how to specify transparent colors per cfr's reference:

\documentclass[letterpaper,12pt,landscape]{article}
\usepackage[T1]{fontenc}
\usepackage{chronosys}
\usepackage{transparent}

\begin{document}

\subsection*{Biographical cornerstones}
\startchronology[startyear=1850,stopyear=1950,height=0.5ex]

\chronoevent[textwidth=4.5cm,colorbox={gray!10},markdepth=100pt]%
{1881}{born in the Austrian part of the Austria-Hungarian Empire}
\chronoevent[textwidth=4cm,markdepth=40pt]%
{1885}{\transparent{0.3}\colorbox{blue}{Publication of Darwin's Evolutionary Theory}}

\stopchronology

\end{document}

But the result was this:

enter image description here

Changing the transparency affects the color of the box, making it lighter or darker, but not allowing the box to become more, or less, transparent. Notice that the text in the light blue box is very faint. The text within the box also becomes lighter or darker when the "transparency" is modified, an unwanted side effect.

Please advise if a solution exists using another timeline package other than chronosys It also occurred to me that another way of accomplishing the goal would be to somehow make the lines connecting the boxes semi transparent. The solution should be able to reflect month/day/year for events, with automatic horizontal placement of events on the timeline. If anyone knows how to turn percusse's answer into a MWE that would be appreciated. It does not matter if the answer is "plain-TeX" or "Tikz", or requires multiple compilation, or otherwise, just so long as it works.

Bravo to @cfr for the below solution which works perfectly. His solution makes for a different type of timeline than can be made with currently available LaTeX/TeX packages (at least with the packages that I know of).

Notwithstanding the wonderful solution presented, it still be helpful to have a "package" based solution, either with chronosys or another package.

Best Answer

Current version of chronos is available at:
https://tex.stackexchange.com/a/342699/ (2016-12-06)

Here's a basic version. Essentially, the style chronos sets up the basic timeline. chronos date can then be used to get the appropriate point on that timeline from which to drop the lines to the event nodes. Information from chronos date can also be used in the node itself. Here it is used to print the date before the node content.

I've used a loop to add events, but this is just to save typing. They could be added one by one if preferred.

The basic timeline schema should be laid out like this:

\begin{tikzpicture}
    [
      chronos={%
        <options>
      },
    ]
    <events and such on the timeline specified in the usual way>
\end{tikzpicture}

The options for chronos are as follows:

  • width=<dimension>,
  • height=<dimension>,
  • start date=YYYY-MM-DD,
  • end date=YYYY-MM-DD,

By default the timeline is 1pt high and 100mm wide and the start and end dates are at the beginning of the last millennium.

chronos date=YYYY-MM-DD can then be used in the picture to help place things on the timeline. For example, I use it below in a loop as follows where \i holds the date for the current iteration, \j holds the text and \k holds the distance to offset the node below the timeline.

\path [postaction={draw=gray, -{Triangle[width=1.5pt,reversed,length=.75pt,fill=gray]}}, chronos date/.expanded={\i}] ({(\thechronosthingdate-\thechronosstartdate)*\chronosunit pt},0) -- +(0,-\k) node [anchor=north, fill opacity=.75, fill=gray!25, draw=gray, rounded corners, font=\footnotesize\sffamily] {\chronosthingday/\chronosthingmonth/\chronosthingyear\\\j};

chronos date is fed \i i.e. the date and this sets both \thechronosthingdate and each of \chronosthingyear, \chronosthingmonth and \chronosthingday. The first is a number which can be used to calculate how far along the timeline to place the event. This should be at

({(\thechronosthingdate-\thechronosstartdate)*\chronosunit pt},0)

\thechronosstartdate holds a number corresponding to the start date of the timeline and \chronosunit holds the length in points allowed for each day. This is calculated when chronos is used from the start and end dates and the width. An offset of 10pt is allowed at each end so that the first date isn't right at the start nor the last date right at the end.

\chronosthingday, \chronosthingmonth and \chronosthingyear hold the day, month and year set by chronos date respectively and can be used in the content of nodes or labels, if desired.

Feeding our loop the following set of triples (\i/\j/\k)

  • {1001-11-05}/{No fireworks}/10pt
  • {1002-07-04}/{No fireworks}/80pt
  • {1002-05-01}/{May Day}/50pt
  • {1002-06-21}/{Summer Solstice}/10pt

thus yields

chronos

Complete code:

\documentclass[tikz,multi,border=10pt]{standalone}
\usepackage{datenumber}
\usetikzlibrary{arrows.meta}
\newcounter{chronosstartdate}
\newcounter{chronosenddate}
\newcounter{chronosstartyear}
\newcounter{chronosendyear}
\newcounter{chronosyeardate}
\newcounter{chronosthingdate}
\pgfkeys{/pgf/number format,
  int detect,
  set thousands separator={},
}
\tikzset{
  chronos/.code={% https://tex.stackexchange.com/a/159856/ - Claudio Fiandrino
    \tikzset{%
      align=center,
      anchor=mid,
      /chronos/.cd,
      #1
    }%
    \setstartyear{\chronosstartyear}%
    \setmydatenumber{chronosstartdate}{\chronosstartyear}{\chronosstartmonth}{\chronosstartday}%
    \setmydatenumber{chronosenddate}{\chronosendyear}{\chronosendmonth}{\chronosendday}%
    \pgfmathsetmacro\chronosunit{(\chronoswidth-20pt)/(\thechronosenddate-\thechronosstartdate)}%
    \draw [line width=\chronosheight] (-10pt,0) coordinate (chronos pre) -- +(\chronoswidth,0) coordinate (chronos post);
    \coordinate (chronos start) at (0,0);
    \coordinate (chronos end) at ([xshift=-10pt]chronos post);
    \setcounter{chronosstartyear}{\chronosstartyear}%
    \setcounter{chronosendyear}{\chronosendyear}%
    \def\tempa{01}%
    \ifx\chronosstartmonth\tempa
      \ifx\chronosstartday\tempa
        \else\stepcounter{chronosstartyear}%
      \fi
      \else\stepcounter{chronosstartyear}%
    \fi
    \def\tempa{12}%
    \def\tempb{31}%
    \ifx\chronosendmonth\tempa
      \ifx\chronosendday\tempb
        \stepcounter{chronosendyear}%
      \fi
    \fi
    \foreach \i in {\thechronosstartyear,...,\thechronosendyear} {%
      \setmydatenumber{chronosyeardate}{\i}{01}{01}%
      \node [above, anchor=south] at ({(\thechronosyeardate-\thechronosstartdate)*\chronosunit pt},0) {\i}; }
  },
  chronos date/.code args={#1-#2-#3}{%
    \tikzset{%
      /chronos/.cd,
      thing year={#1},
      thing month={#2},
      thing day={#3},
    }%
    \setmydatenumber{chronosthingdate}{\chronosthingyear}{\chronosthingmonth}{\chronosthingday}%
  },
  /chronos/.search also={/tikz},
  /chronos/.cd,
  start year/.store in=\chronosstartyear,
  start month/.store in=\chronosstartmonth,
  start day/.store in=\chronosstartday,
  end year/.store in=\chronosendyear,
  end month/.store in=\chronosendmonth,
  end day/.store in=\chronosendday,
  thing year/.store in=\chronosthingyear,
  thing month/.store in=\chronosthingmonth,
  thing day/.store in=\chronosthingday,
  start date/.style args={#1-#2-#3}{%
    start year={#1},
    start month={#2},
    start day={#3},
  },
  end date/.style args={#1-#2-#3}{%
    end year={#1},
    end month={#2},
    end day={#3},
  },
  width/.store in=\chronoswidth,
  height/.store in=\chronosheight,
  start date=1001-10-01,
  end date=1003-06-14,
  width=100mm,
  height=1pt,
  chronos date=1850-01-01,
}
\begin{document}
\begin{tikzpicture}
  [chronos]
  \foreach \i/\j/\k in {{1001-11-05}/{No fireworks}/10pt,{1002-07-04}/{No fireworks}/80pt,{1002-05-01}/{May Day}/50pt,{1002-06-21}/{Summer Solstice}/10pt}
 {%
   \path [postaction={draw=gray, -{Triangle[width=1.5pt,reversed,length=.75pt,fill=gray]}}, chronos date/.expanded={\i}] ({(\thechronosthingdate-\thechronosstartdate)*\chronosunit pt},0) -- +(0,-\k) node [anchor=north, fill opacity=.75, fill=gray!25, draw=gray, rounded corners, font=\footnotesize\sffamily] {\chronosthingday/\chronosthingmonth/\chronosthingyear\\\j};
  }
\end{tikzpicture}
\end{document}
Related Question