3

I'm starting with these examples:

I'm looking to add a red bar under and possibly through the numbers indicating a multiday event. I'm interested in how to do this both within a week, and also over weekends (where wraparound would be an issue).

3

This is not an answer but an attempt to clarify your question. All I did was to copy the code from your second link and to add some basic thingy that I adapted drom p. 526 of the pgfmanual. This allows me to draw a red bar.

\documentclass{article}
% An example how to use the calendar library and modify the layout, i.e. put
% Sunday as the first week day.
%
% Author: Berteun Damman
\usepackage{tikz}
\usetikzlibrary{calendar}
\begin{document}
    \makeatletter

    % This way you can define your own conditions, for example, you
    % could make something as `full moon', `even week', `odd week',
    % et cetera. In principle. The math in TeX could be hard.
    \pgfkeys{/pgf/calendar/start of year/.code={%
        \ifnum\pgfcalendarifdateday=1\relax%
            \ifnum\pgfcalendarifdatemonth=1\relax\pgfcalendarmatchestrue\fi%
        \fi%
    }}%

    % Define our own style
    \tikzstyle{week list sunday}=[
        % Note that we cannot extend from week list,
        % the execute before day scope is cumulative
        execute before day scope={%
               \ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}{
               % On first of month, except when first date in calendar.
                   \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@month@yshift}%
                   \pgftransformyshift{-\pgf@y}
               }}{}%
        },
        execute at begin day scope={%
            % Because for TikZ Monday is 0 and Sunday is 6,
            % we can't directly use \pgfcalendercurrentweekday,
            % but instead we define \c@pgf@counta (basically) as:
            % (\pgfcalendercurrentweekday + 1) % 7
            \pgfmathsetlength\pgf@x{\tikz@lib@cal@xshift}%
            \ifnum\pgfcalendarcurrentweekday=6
                \c@pgf@counta=0
            \else
                \c@pgf@counta=\pgfcalendarcurrentweekday
                \advance\c@pgf@counta by 1
            \fi
            \pgf@x=\c@pgf@counta\pgf@x
            % Shift to the right position for the day.
            \pgftransformxshift{\pgf@x}
        },
        execute after day scope={
            % Week is done, shift to the next line.
            \ifdate{Saturday}{
                \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
                \pgftransformyshift{-\pgf@y}
            }{}%
        },
        % This should be defined, glancing from the source code.
        tikz@lib@cal@width=7
    ]

    % New style for drawing the year, it is always drawn
    % for January
    \tikzstyle{year label left}=[
        execute before day scope={
            \ifdate{start of year}{
                \drawyear
            }{}
        },
        % Right align
        every year/.append style={
            anchor=east,
        }
    ]

    % Style to force giving a month a year label.
    \tikzset{draw year/.style={
        execute before day scope={
            \ifdate{day of month=1}{\drawyear}{}
        }
    }}

    % This actually draws the year.
    \newcommand{\drawyear}{
        \pgfmathsetlength{\pgf@x}{\tikz@lib@cal@xshift}%
        \pgftransformxshift{-\pgf@x}
        % \tikzyearcode is defined by default
        \tikzyearcode
        \pgfmathsetlength{\pgf@x}{\tikz@lib@cal@xshift}%
        \pgftransformxshift{\pgf@x}
    }

    \makeatother

    % The actual calendar is now rather easy:
    \begin{tikzpicture}[every calendar/.style={
            month label above centered,
            month text={\textit{\%mt}},
            year label left,
            every year/.append style={font=\Large\sffamily\bfseries,
                green!50!black},
            if={(Sunday) [blue!70]},
            week list sunday,
        }]
        \matrix[column sep=1em, row sep=1em] {
            \calendar[dates=2018-04-01 to 2018-04-last,draw year]; &
            \calendar[dates=2018-05-01 to 2018-05-last]; &
            \calendar[dates=2018-06-01 to 2018-06-last]; \\
            \calendar[dates=2018-07-01 to 2018-07-last]; &
            \calendar[dates=2018-08-01 to 2018-08-last]; &
            \calendar (mycal) [dates=2018-09-01 to 2018-09-last]; \\
            \calendar[dates=2018-10-01 to 2018-10-last]; &
            \calendar[dates=2018-11-01 to 2018-11-last]; &
            \calendar[dates=2018-12-01 to 2018-12-last]; \\
            \calendar[dates=2019-01-01 to 2019-01-last]; &
            \calendar[dates=2019-02-01 to 2019-02-last]; &
            \calendar[dates=2019-03-01 to 2019-03-last]; \\
        };
    \draw[red] (mycal-2018-09-20.south west) -- (mycal-2018-09-22.south east);  
    \draw[red] (mycal-2018-09-23.south west) -- (mycal-2018-09-24.south east);  
    \end{tikzpicture}
\end{document}

enter image description here

Is your question how to replace the two draw commands by a single macro?

  • Thank you, that does essentially answer my question: I was unfamiliar with the syntax for: \draw[red] (mycal-2018-09-23.south west) -- (mycal-2018-09-24.south east); Any chance you could also point me to how I could make the line thicker and change its height? I saw I could use \draw[red] (oct-2018-10-08.mid west) -- (oct-2018-10-12.mid east); the mid command, but I'm looking for something like north-north-mid. – Mittenchops Sep 20 '18 at 2:45
  • 1
    @Mittenchops You can choose the line width to be e.g. thick, \draw[red,thick]... or ultra thick, or say \draw [line width=2pt,red]..... Then, if you say \draw[red,very thick] ([yshift=2pt]mycal-2018-09-20.south west) -- ([yshift=2pt]mycal-2018-09-22.south east); this will move the line up by 2pt, if you use -2pt it will move down by the same amount. I also think it will be not too difficult do define a style/macro for that. So if you append some information what you precisely want to your nice question (and ping me again) I'll be happy to give it a shot. – marmot Sep 20 '18 at 2:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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