summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-calendar.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-calendar.tex')
-rw-r--r--Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-calendar.tex884
1 files changed, 884 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-calendar.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-calendar.tex
new file mode 100644
index 00000000000..fda9a875d75
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-calendar.tex
@@ -0,0 +1,884 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Calendar Library}
+
+\label{section-calender-snakes}
+
+\begin{tikzlibrary}{calendar}
+ The library defines the |\calendar| command, which can be used to
+ typeset calendars. The command relies on the |\pgfcalendar| command
+ from the |pgfcalendar| package, which is loaded automatically.
+
+ The |\calendar| command is quite configurable, allowing you to
+ produce all kinds of different calendars.
+\end{tikzlibrary}
+
+
+\subsection{Calendar Command}
+
+The core command for creating calendars in \tikzname\ is the
+|\calendar| command. It is available only inside |{tikzpicture}|
+environments (similar to, say, the |\draw| command).
+
+\begin{command}{\calendar \meta{calendar specification}|;|}
+ The syntax for this command is similar to commands like |\node| or
+ |\matrix|. However, it has its complete own parser and only those
+ commands described in the following will be recognized, nothing
+ else. Note, furthermore, that a \meta{calendar specification} is not
+ a path specification, indeed, no path is created for the calendar.
+
+ \medskip
+ \textbf{The specification syntax.}
+ The \meta{calendar specification} must be a sequence of
+ elements, each of which has one of the following structures:
+ \begin{itemize}
+ \item |[|\meta{options}|]|
+
+ You provide \meta{options} in square brackets as
+ in |[red,draw=none]|. These \meta{options} can be any \tikzname\
+ option and they apply to the whole calendar. You can provide this
+ element multiple times, the effect accumulates.
+ \item |(|\meta{name}|)|
+
+ This has the same effect as saying |[name=|\meta{name}|]|. The
+ effect of providing a \meta{name} is explained later. Note
+ alreadys that \emph{a calendar is not a node} and the \meta{name}
+ is \emph{not the name of a node}.
+ \item |at (|\meta{coordinate}|)|
+
+ This has the same effect as saying |[at=(|\meta{coordinate}|)]|.
+ \item |if (|\meta{date condition}|)| \meta{options or
+ commands}\opt{|else|\meta{else options or commands}}
+
+ The effect of such an |if| is explained later.
+ \end{itemize}
+
+ At the beginning of every calendar, the following style is used:
+ \begin{itemize}
+ \itemstyle{every calendar} This style is empty be default.
+ \end{itemize}
+
+ \medskip
+ \textbf{The date range.}
+ The overall effect of the |\calendar| command is to execute code for
+ each day of a range of dates. This range of dates is set using the
+ following option:
+ \begin{itemize}
+ \itemoption{dates}|=|\meta{start date}| to |\meta{end date} This
+ option specifies the date range. Both the start and end date are
+ specified as described on page~\pageref{calendar-date-format}. In
+ short: You can provide ISO-format type dates like |2006-01-02|, you
+ can replace the day of month by |last| to refer to the last day of a
+ month (so |2006-02-last| is the same as |2006-02-28|), and you can
+ add a plus sign followed by a number to specify an offset (so
+ |2006-01-01+-1| is the same as |2005-12-31|).
+ \end{itemize}
+ It will be useful to fix two pieces of terminology for the following
+ descriptions: The |\calendar| command iterates over the dates in the
+ range. The \emph{current date} refers to the current date the
+ command is processing as it iterates over the dates. For each
+ current date code is executed, which will be called the
+ \emph{current date code}. The current date code consists of
+ different parts, to be detailed later.
+
+ The central part of the current date code is the execution of the
+ code |\tikzdaycode|. By default, this code simply produces a node
+ whose text is set to the day of month. This means that unless further
+ action is taken, all days of a calendar will be put on top of each
+ other! To avoid this, you must modify the current date code to shift
+ days around appropriately. Predefined arrangements like
+ |day list downward| or |week list| do this for you, but you can
+ define arrangements yourself. Since defining an arrangement is a bit
+ tricky, it is explained only later on. For the time being, let us
+ use a predefined arrangement to produce our first calendar:
+
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list];
+\end{codeexample}
+
+ \medskip
+ \textbf{Changing the spacing.}
+ In the above calendar, the spacing between the days is determined by
+ the numerous options. Most arrangement do not use all of these
+ options, but only those that apply naturally.
+ \begin{itemize}
+ \itemoption{day xshift}|=|\meta{dimension} specifies the
+ horizontal shift between days. This is not the gap between days,
+ but the shift between the anchors of their nodes. The default is
+ |3.5ex|.
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,day xshift=3ex];
+\end{codeexample}
+ \itemoption{day yshift}|=|\meta{dimension} specifies the
+ vertical shift between days. Again, this is the shift between the
+ anchors of their nodes. The default is |3ex|.
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,day yshift=2ex];
+\end{codeexample}
+ \itemoption{month xshift}|=|\meta{dimension} specifies an
+ additional horizontal shift between different months.
+ \itemoption{month yshift}|=|\meta{dimension} specifies an
+ additional vertical shift between different months.
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-02-last,week list,
+ month yshift=0pt];
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-02-last,week list,
+ month yshift=1cm];
+\end{codeexample}
+ \end{itemize}
+
+ \medskip
+ \textbf{Changing the position of the calendar.}
+ The calendar is placed in such a way that, normally, the anchor of
+ the first day label is at the origin. This can be changed by using
+ the |at| option. When you say |at={(1,1)}|, this anchor of the first
+ day will lie at coordinate $(1,1)$.
+
+ In general, arrangements will not always place the anchor of the
+ first day at the origin. Sometimes, additional spacing rules get in
+ the way. There are different ways of addressing this problem: First,
+ you can just ignore it. Since calendars are often placed in their own
+ |{tikzpicture}| and since their size if computed automatically, the
+ exact position of the origin often does not matter at all. Second,
+ you can put the calendar inside a node as in
+ |...node {\tikz \calendar...}|. This allows you to position the node
+ in the normal ways using the node's anchors. Third, you can be very
+ clever and use a single-cell matrix. The advantage is that a matrix
+ allows you to provide any anchor of any node inside the matrix as an
+ anchor for the whole matrix. For example, the following calendar is
+ placed in such a way the center of 2000-01-20 lies on the position
+ $(2,2)$:
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \matrix [anchor=cal-2000-01-20.center] at (2,2)
+ { \calendar(cal)[dates=2000-01-01 to 2000-01-31,week list]; \\};
+\end{tikzpicture}
+\end{codeexample}
+ Unfortunately, the matrix-base positions, which is the cleanest way,
+ isnot as portable as the other approaches (it currently does not
+ work with the \textsc{svg} backend for instance).
+
+ \medskip
+ \textbf{Changing the appearance of days.}
+ As mentioned before, each day in the above calendar is produced by
+ an execution of the |\tikzdaycode|. Each time this code is executed,
+ the coordinate system will have been setup appropriately to place
+ the day of the month correctly. You can change both the code and its
+ appearance using the following options.
+ \begin{itemize}
+ \itemoption{day code}|=|\meta{code}
+ This option allows you to change the code that is executed for
+ each day. The default is to create a node with an appropriate
+ name, but you can change this:
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ day code={\fill[blue] (0,0) circle (2pt);}];
+\end{codeexample}
+ The default code is the following:
+\begin{codeexample}[code only]
+\node[name=\pgfcalendarsuggestedname,every day]{\tikzdaytext};
+\end{codeexample}
+ The first part causes the day nodes to be accessible via the
+ following names: If \meta{name} is the name given to the calendar
+ via a |name=| option or via the specification element
+ |(|\meta{name}|)|, then |\pgfcalendarsuggestedname| will expand to
+ \meta{name}|-|\meta{date}, where \meta{date} is the date of the
+ day that is currently being processed in ISO format .
+
+ For example, if January 1, 2006 is being processed and the
+ calendar has been named |mycal|, then the node containg the |1|
+ for this date will be names |mycal-2006-01-01|. You can later
+ reference this node.
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \calendar (mycal) [dates=2000-01-01 to 2000-01-31,week list];
+
+ \draw[red] (mycal-2000-01-20) circle (4pt);
+\end{tikzpicture}
+\end{codeexample}
+
+ \itemoption{day text}|=|\meta{text}
+ This option changes the setting of the |\tikzdaytext|. By default,
+ this macro simply yields the current day of month, but you can
+ change it arbitrarily. Here is a silly example:
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ day text=x];
+\end{codeexample}
+ More useful examples are based on using the |\%| command. This
+ command is redefined inside a |\pgfcalendar| to mean the same as
+ |\pgfcalendarshorthand|. (The original meaning of |\%| is lost
+ inside the calendar, you need to save if before the calendar if
+ you really need it.)
+
+ The |\%| inserts the current day/month/year/day of week in a
+ certain format into the text. The first letter following the |\%|
+ selects the type (permisslbe values are |d|, |m|, |y|, |w|), the
+ second letter specifies how the value should be displayed (|-|
+ means numerically, |=| means numerically with leading
+ space, |0| means numerically with leading zeros, |t| means
+ textual, and |.| means textual, abbreviated). For example |\%d0|
+ gives the day with a leading zero (for more details see
+ the description of |\pgfcalendarshorthand| on
+ page~\pageref{pgfcalendarshorthand}).
+
+ Let us redefine the |day text| so that it yields the day with a
+ leading zero:
+\begin{codeexample}[leave comments]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ day text=\%d0];
+\end{codeexample}
+ \itemstyle{every day}
+ This style is executed by the default node code for each day. The
+ default setting is
+\begin{codeexample}[code only]
+anchor=base east
+\end{codeexample}
+ The |every day| style is useful for changing the way days
+ look. For example, let us make all days red:
+\begin{codeexample}[leave comments]
+\tikzstyle{every day}+=[red]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list];
+\end{codeexample}
+ \end{itemize}
+
+ \medskip
+ \textbf{Changing the appearance of month and year labels.}
+ In addition to the days of a calendar, labels for the months and
+ even years (for really long calendars) can be added. These labels
+ are only added once per month or year and this is not done by
+ default. Rather, special styles starting with |month label|
+ place these labels and make them visible:
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-02-last,week list,
+ month label above centered];
+\end{codeexample}
+
+ The following options change the appearance of the month and year
+ label:
+ \begin{itemize}
+ \itemoption{month code}|=|\meta{code}
+ This option allows you to specify what the macro |\tikzmonthcode|
+ should expand to.
+
+ By default, the |\tikzmonthcode| it is set to
+\begin{codeexample}[code only]
+\node[every month]{\tikzmonthtext};
+\end{codeexample}
+ Note that this node is not named by default.
+ \itemoption{month text}|=|\meta{text}
+ This option allows you to change the macro |\tikzmonthtext|. By
+ default, the month text is a long textual presentation of the
+ current month being typeset.
+\begin{codeexample}[leave comments]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ month label above centered,
+ month text=\textcolor{red}{\%mt} \%y-];
+\end{codeexample}
+ \itemstyle{every month}
+ This style, which is empty by default, can be used to change the
+ appearance of month labels.
+ \itemoption{year code}|=|\meta{code} Works like |month code|,
+ only for years.
+ \itemoption{year text}|=|\meta{text} Works like |month text|,
+ only for years.
+ \itemstyle{every year} Works like |every month|,
+ only for years.
+ \end{itemize}
+
+ \medskip
+ \textbf{Date ifs.}
+ Much of the power of the |\calendar| command comes from the use of
+ conditionals. There are two equivalent way of specifying such a
+ conditional. First, you can add the text
+ |if (|\meta{conditions}|) |\meta{code or options} to your
+ \meta{calendar specification}, possibly followed by |else|\meta{else
+ code or options}. You can have multiple such conditionals (but
+ you cannot nest them in this simple manner). The second way is to
+ use the following option:
+ \begin{itemize}
+ \itemoption{if}|=(|\meta{coditions}|)|\meta{code or
+ options}\opt{|else|\meta{else code or options}} This option has
+ the same effect as giving a corresponding if in the \meta{calendar
+ specification}. The option is mostly useful for use in the
+ |every calendar| style, where you cannot provide if conditionals
+ otherwise.
+ \end{itemize}
+ Now, regardless of how you specify a conditional, it has the
+ following effect (individually and independently for each date in
+ the calendar):
+ \begin{enumerate}
+ \item It is checked whether the current date is one of the
+ possibilities listed in \meta{coditions}. An example of such a
+ condition is |Sunday|. Thus, when you write
+ |if (Saturday,Sunday) {foo}|, then |foo| will be executed for
+ every day in the calendar that is a Saturday \emph{or} a Sunday.
+
+ The command |\ifdate| and, thereby, |\pgfcalendarifdate| are used
+ to evaluate the \meta{conditions}, see
+ page~\pageref{pgfcalendarifdate} for a complete list of possible
+ tests. The most useful tests are: Tests like |Monday| and so on,
+ |workday| for the days Monday to Friday, |weekend| for Saturday
+ and Sunday, |equals| for testing whether the current date equals a
+ given date, |at least| and |at least| for comparing the current
+ date with a given date.
+ \item If the date passes the check, the \meta{code or options} is
+ evaluated in a manner to be described in a moment; if the date
+ fails, the \meta{else code or options} is evaluated, if present.
+
+ The \meta{code or options} can either be some code. This is
+ indicated by surrounding the code with curly braces. It can also
+ be a list of \tikzname\ options. This is indicated by surrounding
+ the options with square brackets. For example in the date test
+ |if (Sunday) {\draw...} else {\fill...}| there are two pieces of
+ code involved. By comparison, |if (Sunday) [red] else [green]|
+ involves two options.
+
+ If \meta{code or options} is code, it is simply executed (for the
+ current day). If it is a list of options, these options are passed
+ to a scope surrounding the current date.
+ \end{enumerate}
+ Let us now have a look at some examples. First, we use a conditional
+ to make all Sundays red.
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-31,week list]
+ if (Sunday) [red];
+\end{codeexample}
+ Next, let us do something on a specific date:
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-31,week list]
+ if (Sunday) [red]
+ if (equals=2000-01-20) {\draw (0,0) circle (8pt);};
+\end{codeexample}
+ You might wonder why the circle seems to be ``off'' the
+ date. Actually, it is centered on the date, it is just that the date
+ label uses the |base east| anchor, which shifts the label up and
+ right. To overcome this problem we can change the anchor:
+\begin{codeexample}[]
+\tikzstyle{every day}=[anchor=mid]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-31,week list]
+ if (Sunday) [red]
+ if (equals=2000-01-20) {\draw (0,0) circle (8pt);};
+\end{codeexample}
+ However, the single day dates are now no longer aligned
+ correctly. For this, we can change the day text to |\%d=|,
+ which adds a space at the beginning of single day
+ text.
+
+ In the following, more technical information is covered. Most
+ readers may wish to skip it.
+
+ \medskip
+ \textbf{The current date code.}
+ As mentioned earlier, for each date in the calendar the current date
+ code is executed. It is the job of this code to shift around date
+ nodes, to render the date nodes, to draw the month labels and to do
+ all other stuff that is necessary to draw a calendar.
+
+ The current daet code consists of the following parts, in this order:
+ \begin{enumerate}
+ \item The before-scope code.
+ \item A scope is opened.
+ \item The at-begin-scope code.
+ \item All date-ifs from the \meta{calendar specification} are
+ executed.
+ \item The at-end-scope code.
+ \item The scope is closed.
+ \item The after-scope code.
+ \end{enumerate}
+ All of the codes mentioned above can be changed using appropriate
+ options, see below. In case you wonder why so many are needed, the
+ reason is that the current date code as a whole is not
+ surrounded by a scope or \TeX\ group. This means that code executed
+ in the before-scope code and in the after-scope code has an effect
+ on all following days. For example, if the after-scope code modifies
+ the transformation matrix by shifting everything downward, all
+ following days will be shifted downward. If each day does this, you
+ get a list of days, one below the other.
+
+ However, you do not always want code to have an effect on everything
+ that follows. For instance, if a day has the date-if
+ |if (Sunday) [red]|, we only want this Sunday to red, not all
+ following days also. Similarly, sometimes it is easier to compute
+ the position of a day relative to a fixed origin and we do not want
+ any modifications of the transformation matrix to have an effect
+ outside the scope.
+
+ By cleverly adjusting the different codes, all sorts of different
+ day arrangements are possible.
+
+ \begin{itemize}
+ \itemoption{execute before day scope}|=|\meta{code} This
+ code is executed before everything else for each date. Multiple
+ calls of this option have an accumulative effect. Thus, if you use
+ this option twice, the code from the first use is used first for
+ each day, followed by the code given the second time.
+ \itemoption{execute at begin day scope}|=|\meta{code}
+ This code is execute before everything else inside the scope of
+ the current date. Again, the effect is accumulative.
+ \itemoption{execute at end day scope}|=|\meta{code}
+ This code is executed just before the day scope is
+ closed. The effect is also accumulative, however, in reverse
+ order. This is useful to pair, say, |\scope| and |\endscope|
+ commands in at-begin- and at-end-code.
+ \itemoption{execute after day scope}|=|\meta{code} This
+ is executed at the very end of the current date, outside the
+ scope. The accumulation is also in reverse.
+ \end{itemize}
+\end{command}
+
+
+In the rest of the following subsections we have a look at how the
+different scope codes can be used to create different calendar
+arrangements.
+
+
+\subsubsection{Creating a Simple List of Days}
+
+We start with a list the days of the calendar, one day below the
+other. For this, we simply shift the coordinate system downward at the
+end of the code for each day. This shift must be \emph{outside} the
+day scope as we want day shifts to accumulate. Thus, we use the
+following code:
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-01 to 2000-01-08,
+ execute after day scope=
+ {\pgftransformyshift{-1em}}];
+\end{codeexample}
+Clearly, we can use this approach to create day lists going up,
+down, right, left, or even diagonally.
+
+
+\subsubsection{Adding a Month Label}
+
+We now want to add a month label to the left of the beginning of each
+month. The idea is to do two things:
+\begin{enumerate}
+\item We add code that is executed only on the first of each month.
+\item The code is executed before the actual day is rendered. This
+ ensures that options applying to the days do not affect the month
+ rendering.
+\end{enumerate}
+We have two options where we should add the month code: Either we add
+it at the beginning of the day scope or before. Either will work fine,
+but it might be safer to put the code inside the scope to ensure that
+settings to not inadventerdly ``leak outside.''
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-08,
+ execute after day scope={\pgftransformyshift{-1em}},
+ execute at begin day scope=
+ {\ifdate{day of month=1}{\tikzmonthcode}{}},
+ set style={{every month}+=[anchor=base east,xshift=-2em]}];
+\end{codeexample}
+
+In the above code we used the |\ifdate|\marg{condition}\marg{then
+ code}\marg{else code} command, which is described on
+page~\pageref{ifdate} in detail and which has much the same effect as
+|if (|\meta{condition}|)|\marg{then code}| else |\marg{else code}, but
+works in normal code.
+
+
+\subsubsection{Creating a Week List Arrangement}
+
+Let us now address a more complicated arrangement: A week list. In
+this arrangement there is line for each week. The horizontal placement
+of the days is thus that all Mondays lie below each other, likewise
+for all Tuesdays, and so on.
+
+In order to typeset this arrangement, we can use the following
+approach: The origin of the coordinate system rests at the anchor for
+the Monday of each week. That means that at the end of each week the
+origin is moved downward one line. On all other days, the origin at
+the end of the day code is the same as at the beginning. To position
+each day correctly, we use code inside and at the beginning of the day
+scope to horizontally shift the day according to its day of week.
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-20,
+ % each day is shifted right according to the day of week
+ execute at begin day scope=
+ {\pgftransformxshift{\pgfcalendarcurrentweekday em}},
+ % after each week, the origin is shifted downward:
+ execute after day scope=
+ {\ifdate{Sunday}{\pgftransformyshift{-1em}}{}}];
+\end{codeexample}
+
+
+\subsubsection{Creating a Month List Arrangement}
+
+For another example, let us create an arrangment that contains one
+line for each month. This is easy enough to do as for weeks, unless we
+add the following requirement: Again, we want all days in a column to
+have the same day of week. Since months start on different days of
+week, this means that each row has to have an individual offset.
+
+One possible way is to use the following approach: After each month
+(or at the beginning of each month) we advance the vertical position
+of the offset by one line. For horizontal placement, inside the day
+scope we locally shift the day by its day of month. Furthermore, we
+must additionally shift the day to ensure that the first day of the
+month lies on the correct day of week column. For this, we remember
+this day of week the first time we see it.
+\begin{codeexample}[]
+\newcount\mycount
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-02-last,
+ execute before day scope=
+ {
+ \ifdate{day of month=1} {
+ % Remember the weekday of first day of month
+ \mycount=\pgfcalendarcurrentweekday
+ % Shift downward
+ \pgftransformyshift{-1em}
+ }{}
+ },
+ execute at begin day scope=
+ {
+ % each day is shifted right according to the day of month
+ \pgftransformxshift{\pgfcalendarcurrentday em}
+ % and additionally according to the weekday of the first
+ \pgftransformxshift{\the\mycount em}
+ }];
+\end{codeexample}
+
+
+\subsection{Arrangements}
+
+An \emph{arrangement} specifies how the days of calendar are arranged
+on the page. The calendar library defines a number of predefined
+arrangements.
+
+We start with arrangements in which the days are listed in a long
+line.
+
+\begin{itemize}
+ \itemstyle{day list downward}
+ This style causes the days of a month to be typeset one below the
+ other. The shift between days is given by |day yshift|. Between
+ month an additional shift of |month yshift| is added.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em];
+\end{codeexample}
+ \itemstyle{day list upward}
+ works as above, only the list grows upward instead of downward.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list upward,month yshift=1em];
+\end{codeexample}
+ \itemstyle{day list right}
+ This style also works as before, but the list of days grows to the
+ right. Instead of |day yshift| and |month yshift|, the values of
+ |day xshift| and |month xshift| are used.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list right,month xshift=1em];
+\end{codeexample}
+ \itemstyle{day list left}
+ as above, but the list grows left.
+\end{itemize}
+
+The next arrangement lists days weekwise.
+
+\begin{itemize}
+ \itemstyle{week list}
+ This style creates one row for each week in the range. The value
+ of |day xshift| is used for the distance between days in each week
+ row, the value of |day yshift| is used for the distance between
+ rows. In both cases, ``distance'' refers to the distance between
+ the anchors of the nodes of the days (or, more generally, the
+ distance between the origins of the little pictures created for each
+ day).
+
+ The days inside each week are shifted such that Monday is always
+ at the first position (to change this, you need to copy and then
+ modify the code appropriately). If the date range does not start on
+ a Monday, the first line will not start in the first column, but
+ rather in the column appropriate for the first date in the range.
+
+ At the beginning of each month (except for the first month in the
+ range) an additional vertical space of |month yshift| is added. If
+ this is set to |0pt| you get a continuous list of days.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-01 to 2000-02-last,week list];
+\end{codeexample}
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-01 to 2000-02-last,week list,
+ month yshift=0pt];
+\end{codeexample}
+\end{itemize}
+
+The following arrangement gives a very compact view of a whole year.
+\begin{itemize}
+ \itemstyle{month list}
+ In this arrangement there is a row for each month. As for the
+ |week list|, the |day xshift| is used for the horizontal distance.
+ For the vertical shft, |month yshift| is used.
+
+ In each row, all days of the month are listed alongside each
+ other. However, it is once more ensured that days in each column lie
+ on the same day of week. Thus, the very first column contains only
+ Mondays. If a month does not start with a Monday, its days are
+ shifted to the right such that the days lie on the correct columns.
+\end{itemize}
+\begin{codeexample}[]
+\sffamily\scriptsize
+\tikz
+ \calendar [dates=2000-01-01 to 2000-12-31,
+ month list,month label left,month yshift=1.25em]
+ if (Sunday) [black!50];
+\end{codeexample}
+
+
+\subsection{Month Labels}
+
+For many calendars you may wish to add a labels to each month. We have
+already covered how month nodes are created and rendered in the
+description of the |\calendar| command: use |month text|,
+|every month|, and also |month code| (if necessary) to change the
+appearance of the month labels.
+
+What we have not yet covered is where these labels are placed. By
+default, they are not placed at all as there is no good ``default
+position'' for them. Instead, you can use one of the following options
+to specify a position for the labels:
+\begin{itemize}
+ \itemstyle{month label left}
+ Places the month label to the left of the first day of the
+ month. (For |week list| and |month list| where a month does not
+ start on a Monday, the position is chosen ``as if'' the month had
+ started on a Monday -- which is usually exactly what you want.)
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label left];
+\end{codeexample}
+ \itemstyle{month label left vertical}
+ This style works like the above style, only the label is rotated
+ counterclockwise by 90 degrees.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label left vertical];
+\end{codeexample}
+ \itemstyle{month label right}
+ This style places the month label to the right of the row in which
+ the first day of the month lies. This means that for a day list the
+ label is to the right of the first day, for a week list it is to the
+ right of the first week, and for a month list it is to the right of
+ the whole month.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label right];
+\end{codeexample}
+ \itemstyle{month label right vertical}
+ as above, only the label is rotated clockwise by 90 degrees.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label right vertical];
+\end{codeexample}
+
+ \itemstyle{month label above left}
+ This style places the month label above of the row of the first day,
+ flushed left to the leftmost column. The amount by which the label
+ is raised is fixed to |1.25em|; use the |yshift| option with the
+ month node to modify this.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list right,month xshift=1em,
+ month label above left];
+\end{codeexample}
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-20 to 2000-02-10,
+ week list,month label above left];
+\end{codeexample}
+
+ \itemstyle{month label above centered}
+ works as above, only the label is centered above the row containing
+ the first day.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-02-01 to 2000-02-last,
+ day list right,month label above centered];
+\end{codeexample}
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-20 to 2000-02-10,
+ week list,month label above centered];
+\end{codeexample}
+
+ \itemstyle{month label above right}
+ works as above, but flushed right
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-20 to 2000-02-10,
+ week list,month label above right];
+\end{codeexample}
+
+ \itemstyle{month label below left}
+ Works like |month label above left|, only the label is placed below
+ the row. This placement is not really useful with the |week list|
+ arrangement, but rather with the |day list right| or |month list|
+ arrangement.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-02-01 to 2000-02-last,
+ day list right,month label below left];
+\end{codeexample}
+ \itemstyle{month label below centered}
+ works like |month label above centered|, only below.
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-02-01 to 2000-02-last,
+ day list right,month label below centered];
+\end{codeexample}
+\end{itemize}
+
+
+\subsection{Examples}
+
+In the following, some example calendars are shown that come either
+from real applications or are just nice to look at.
+
+Let us start with a year-2100-countdown, in which we cross out dates
+as we approach the big celebration. For
+this, we set the shape to |strike out| for these dates.
+
+\begin{codeexample}[leave comments]
+\begin{tikzpicture}
+ \calendar
+ [
+ dates=2099-12-01 to 2100-01-last,
+ week list,inner sep=2pt,month label above centered,
+ month text=\%mt \%y0
+ ]
+ if (at most=2099-12-29) [nodes={strike out,draw}]
+ if (weekend) [black!50,nodes={draw=none}]
+ ;
+\end{tikzpicture}
+\end{codeexample}
+
+The next calendar shows a deadline, which is 10 days in the future
+from the current date. The last three days before the deadline are in
+red, because we really should be done by then. All days on which we
+can no longer work on the project are crossed out.
+
+\begin{codeexample}[leave comments]
+\begin{tikzpicture}
+ \calendar
+ [
+ dates=\year-\month-\day+-25 to \year-\month-\day+25,
+ week list,inner sep=2pt,month label above centered,
+ month text=\textit{\%mt \%y0}
+ ]
+ if (at least=\year-\month-\day) {}
+ else [nodes={strike out,draw}]
+ if (at most=\year-\month-\day+7)
+ [green!50!black]
+ if (between=\year-\month-\day+8 and \year-\month-\day+10)
+ [red]
+ if (Sunday)
+ [gray,nodes={draw=none}]
+ ;
+\end{tikzpicture}
+\end{codeexample}
+
+The following example is a futuristic calendar that is all about circles:
+
+\begin{codeexample}[]
+\sffamily
+
+\colorlet{winter}{blue}
+\colorlet{spring}{green!60!black}
+\colorlet{summer}{orange}
+\colorlet{fall}{red}
+
+% A counter, since TikZ is not clever enough (yet) to handle
+% arbitrary angle systems.
+\newcount\mycount
+
+\begin{tikzpicture}[transform shape]
+ \tikzstyle{every day}=[anchor=mid,font=\fontsize{6}{6}\selectfont]
+ \node{\normalsize\the\year};
+ \foreach \month/\monthcolor in
+ {1/winter,2/winter,3/spring,4/spring,5/spring,6/summer,
+ 7/summer,8/summer,9/fall,10/fall,11/fall,12/winter}
+ {
+ % Computer angle:
+ \mycount=\month
+ \advance\mycount by -1
+ \multiply\mycount by 30
+ \advance\mycount by -90
+
+ % The actual calendar
+ \calendar at (\the\mycount:6.4cm)
+ [
+ dates=\the\year-\month-01 to \the\year-\month-last,
+ ]
+ if (day of month=1) {\color{\monthcolor}\tikzmonthcode}
+ if (Sunday) [red]
+ if (all)
+ {
+ % Again, compute angle
+ \mycount=1
+ \advance\mycount by -\pgfcalendarcurrentday
+ \multiply\mycount by 11
+ \advance\mycount by 90
+ \pgftransformshift{\pgfpointpolar{\mycount}{1.4cm}}
+ };
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+Next, lets us have a whole year in a tight column:
+\begin{codeexample}[leave comments]
+\begin{tikzpicture}
+ \small\sffamily
+ \colorlet{darkgreen}{green!50!black}
+ \calendar[dates=\year-01-01 to \year-12-31,week list,
+ month label left,month yshift=0pt,
+ month text=\textcolor{darkgreen}{\%m0}]
+ if (Sunday) [black!50];
+\end{tikzpicture}
+\end{codeexample}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End: