You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
458 lines
12 KiB
458 lines
12 KiB
% 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 Public License.
|
|
%
|
|
% See the file doc/generic/pgf/licenses/LICENSE for more details.
|
|
|
|
\ProvidesFileRCS{tikzlibrarycalendar.code.tex}
|
|
|
|
|
|
\pgfutil@usemodule{pgfcalendar}
|
|
|
|
|
|
%
|
|
% General options (these options affect all calendars typeset unsind \calendar):
|
|
%
|
|
% Start, end, and code executed for each current date
|
|
%
|
|
|
|
\tikzoption{dates}{\tikz@lib@cal@parse#1\relax}
|
|
\def\tikz@lib@cal@parse#1to#2\relax{%
|
|
\def\tikz@lib@cal@start{#1}
|
|
\def\tikz@lib@cal@end{#2}%
|
|
}
|
|
\tikzoption{execute at begin day scope}{\expandafter\def\expandafter\tikz@atbegin@day\expandafter{\tikz@atbegin@day#1}}
|
|
\tikzoption{execute at end day scope}{%
|
|
\def\pgf@temp{#1}%
|
|
\expandafter\expandafter\expandafter\def%
|
|
\expandafter\expandafter\expandafter\tikz@atend@day%
|
|
\expandafter\expandafter\expandafter{\expandafter\pgf@temp\tikz@atend@day}}
|
|
\tikzoption{execute before day scope}{\expandafter\def\expandafter\tikz@before@day\expandafter{\tikz@before@day#1}}
|
|
\tikzoption{execute after day scope}{\expandafter\def\expandafter\tikz@after@day\expandafter{\tikz@after@day#1}}
|
|
|
|
\let\tikz@atbegin@day=\pgfutil@empty
|
|
\let\tikz@atend@day=\pgfutil@empty
|
|
\let\tikz@before@day=\pgfutil@empty
|
|
\let\tikz@after@day=\pgfutil@empty
|
|
|
|
|
|
|
|
%
|
|
% Options affecting some calendars:
|
|
%
|
|
|
|
%
|
|
% Shifts and skips
|
|
%
|
|
|
|
% Shift between days
|
|
|
|
\tikzoption{day xshift}{\def\tikz@lib@cal@xshift{#1}}
|
|
\tikzoption{day yshift}{\def\tikz@lib@cal@yshift{#1}}
|
|
|
|
\def\tikz@lib@cal@yshift{3ex}
|
|
\def\tikz@lib@cal@xshift{3.5ex}
|
|
|
|
|
|
% Shift between months
|
|
|
|
\tikzoption{month xshift}{\def\tikz@lib@cal@month@xshift{#1}}
|
|
\tikzoption{month yshift}{\def\tikz@lib@cal@month@yshift{#1}}
|
|
|
|
\def\tikz@lib@cal@month@yshift{9ex}
|
|
\def\tikz@lib@cal@month@xshift{9ex}
|
|
|
|
|
|
|
|
|
|
% Templates for typesetting days, month, years
|
|
|
|
\tikzoption{day code}{\def\tikzdaycode{#1}}
|
|
\tikzoption{day text}{\def\tikzdaytext{#1}}
|
|
\tikzoption{days}{\tikzset{every day/.append style={#1}}}
|
|
\tikzset{every day/.style={anchor=base east}}
|
|
|
|
\tikzoption{month code}{\def\tikzmonthcode{#1}}
|
|
\tikzoption{month text}{\def\tikzmonthtext{#1}}
|
|
\tikzset{every month/.style={}}
|
|
|
|
\tikzoption{year code}{\def\tikzyearcode{#1}}
|
|
\tikzoption{year text}{\def\tikzyeartext{#1}}
|
|
\tikzset{every year/.style={}}
|
|
|
|
\def\tikzdaycode{\node[name=\pgfcalendarsuggestedname,every day]{\tikzdaytext};}
|
|
\def\tikzmonthcode{\node[every month]{\tikzmonthtext};}
|
|
\def\tikzyearcode{\node[every year]{\tikzyeartext};}
|
|
|
|
\def\tikzdaytext{\%d-}
|
|
\def\tikzmonthtext{\%mt}
|
|
\def\tikzyeartext{\%y0}
|
|
|
|
|
|
% Internal option for storing the "width" of a calendar as a number of
|
|
% days
|
|
|
|
\tikzoption{tikz@lib@cal@width}{\def\tikz@lib@cal@width{#1}}
|
|
|
|
\def\tikz@lib@cal@width{1}
|
|
|
|
%
|
|
% Days on a line
|
|
%
|
|
|
|
\tikzset{day list downward/.style={%
|
|
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 after day scope={\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}\pgftransformyshift{-\pgf@y}},
|
|
tikz@lib@cal@width=1
|
|
}}
|
|
\tikzset{day list upward/.style={%
|
|
execute before day scope={
|
|
\ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
|
|
{%
|
|
% On first of month, except when first date in calendar.
|
|
\pgftransformyshift{\tikz@lib@cal@month@yshift}%
|
|
}%
|
|
}{}%
|
|
},
|
|
execute after day scope={\pgftransformyshift\tikz@lib@cal@yshift},
|
|
tikz@lib@cal@width=1
|
|
}}
|
|
\tikzset{day list right/.style={%
|
|
execute before day scope={
|
|
\ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
|
|
{%
|
|
% On first of month, except when first date in calendar.
|
|
\pgftransformxshift{\tikz@lib@cal@month@xshift}%
|
|
}%
|
|
}{}%
|
|
},
|
|
execute after day scope={\pgftransformxshift\tikz@lib@cal@xshift},
|
|
tikz@lib@cal@width=30% not quite right, but close enough in most cases...
|
|
}}
|
|
|
|
\tikzset{day list left/.style={%
|
|
execute before day scope={
|
|
\ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
|
|
{%
|
|
% On first of month, except when first date in calendar.
|
|
\pgfmathsetlength{\pgf@x}{\tikz@lib@cal@month@xshift}
|
|
\pgftransformxshift{-\pgf@x}%
|
|
}%
|
|
}{}%
|
|
},
|
|
execute after day scope={
|
|
\pgfmathsetlength{\pgf@x}{\tikz@lib@cal@xshift}
|
|
\pgftransformxshift{-\pgf@x}%
|
|
},
|
|
tikz@lib@cal@width=30% not quite right, but close enough in most cases...
|
|
}}
|
|
|
|
|
|
|
|
%
|
|
% Week list
|
|
%
|
|
|
|
\tikzset{week list/.style={%
|
|
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={%
|
|
\pgfmathsetlength\pgf@x{\tikz@lib@cal@xshift}%
|
|
\pgf@x=\pgfcalendarcurrentweekday\pgf@x%
|
|
\pgftransformxshift{\pgf@x}%
|
|
},
|
|
execute after day scope={%
|
|
\ifdate{Sunday}{%
|
|
\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
|
|
\pgftransformyshift{-\pgf@y}
|
|
}{}%
|
|
},
|
|
tikz@lib@cal@width=7
|
|
}}
|
|
|
|
|
|
|
|
%
|
|
% Month list
|
|
%
|
|
|
|
\tikzset{month list/.style={%
|
|
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}
|
|
}%
|
|
}{}%
|
|
\ifdate{day of month=1}
|
|
{%
|
|
\edef\tikz@lib@cal@month@list@start{\pgfcalendarcurrentweekday}%
|
|
}{}%
|
|
\ifdate{equals=\pgfcalendarbeginiso}%
|
|
{%
|
|
% Computer day of week for start of month
|
|
{%
|
|
\c@pgf@counta=\pgfcalendarcurrentjulian%
|
|
\advance\c@pgf@counta by-\pgfcalendarcurrentday%
|
|
\advance\c@pgf@counta by1\relax%
|
|
\pgfcalendarjuliantoweekday{\c@pgf@counta}{\c@pgf@countb}%
|
|
\xdef\pgf@temp{\the\c@pgf@countb}%
|
|
}%
|
|
\let\tikz@lib@cal@month@list@start=\pgf@temp%
|
|
}{}%
|
|
},
|
|
execute at begin day scope={%
|
|
\pgfmathsetlength\pgf@xa{\tikz@lib@cal@xshift}%
|
|
\pgf@xb=\pgfcalendarcurrentday\pgf@xa%
|
|
\advance\pgf@xb by\tikz@lib@cal@month@list@start\pgf@xa%
|
|
\advance\pgf@xb by-\pgf@xa\relax%
|
|
\pgftransformxshift{\pgf@xb}%
|
|
},
|
|
tikz@lib@cal@width=37
|
|
}}
|
|
|
|
|
|
|
|
|
|
%
|
|
% Month labels
|
|
%
|
|
|
|
\tikzset{month label left/.style={%
|
|
execute before day scope={\ifdate{day of month=1}{\tikzmonthcode}{}},
|
|
every month/.append style={anchor=base east,xshift=-3.5ex}
|
|
}}
|
|
|
|
\tikzset{month label left vertical/.style={%
|
|
execute before day scope={\ifdate{day of month=1}{\tikzmonthcode}{}},
|
|
every month/.append style={anchor=base east,xshift=-4.5ex,yshift=2.25ex,rotate=90}
|
|
}}
|
|
|
|
\tikzset{month label right/.style={%
|
|
execute before day scope={\ifdate{day of month=1}{%
|
|
{%
|
|
\pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
|
|
\pgftransformxshift{\tikz@lib@cal@width\pgf@xa}%
|
|
\pgftransformxshift{-\pgf@xa}%
|
|
\tikzmonthcode%
|
|
}}{}},
|
|
every month/.append style={anchor=base west,xshift=1ex}
|
|
}}
|
|
|
|
\tikzset{month label right vertical/.style={%
|
|
execute before day scope={\ifdate{day of month=1}{%
|
|
{%
|
|
\pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
|
|
\pgftransformxshift{\tikz@lib@cal@width\pgf@xa}%
|
|
\pgftransformxshift{-\pgf@xa}%
|
|
\tikzmonthcode%
|
|
}}{}},
|
|
every month/.append style={anchor=base west,xshift=2ex,yshift=2.25ex,rotate=-90}
|
|
}}
|
|
|
|
\tikzset{month label above centered/.style={%
|
|
execute before day scope={%
|
|
\ifdate{day of month=1}{%
|
|
{
|
|
\pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
|
|
\pgf@xb=\tikz@lib@cal@width\pgf@xa%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\pgf@xb=.5\pgf@xb%
|
|
\pgftransformxshift{\pgf@xb}%
|
|
\pgftransformxshift{-1.5ex}%
|
|
\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
|
|
\pgftransformyshift{1.25\pgf@y}
|
|
\tikzmonthcode%
|
|
}
|
|
}{}},
|
|
every month/.append style={anchor=base}
|
|
}}
|
|
|
|
\tikzset{month label above left/.style={%
|
|
execute before day scope={%
|
|
\ifdate{day of month=1}{%
|
|
{
|
|
\pgftransformxshift{-3.25ex}%
|
|
\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
|
|
\pgftransformyshift{1.25\pgf@y}
|
|
\tikzmonthcode%
|
|
}
|
|
}{}},
|
|
every month/.append style={anchor=base west}
|
|
}}
|
|
|
|
|
|
|
|
\tikzset{month label above right/.style={%
|
|
execute before day scope={%
|
|
\ifdate{day of month=1}{%
|
|
{
|
|
\pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
|
|
\pgf@xb=\tikz@lib@cal@width\pgf@xa%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\pgftransformxshift{\pgf@xb}%
|
|
\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
|
|
\pgftransformyshift{1.25\pgf@y}
|
|
\tikzmonthcode%
|
|
}
|
|
}{}},
|
|
every month/.append style={anchor=base east}
|
|
}}
|
|
|
|
\tikzset{month label below centered/.style={%
|
|
execute before day scope={%
|
|
\ifdate{day of month=1}{%
|
|
{
|
|
\pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
|
|
\pgf@xb=\tikz@lib@cal@width\pgf@xa%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\pgf@xb=.5\pgf@xb%
|
|
\pgftransformxshift{\pgf@xb}%
|
|
\pgftransformxshift{-1.5ex}%
|
|
\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
|
|
\pgftransformyshift{-1.25\pgf@y}
|
|
\tikzmonthcode%
|
|
}
|
|
}{}},
|
|
every month/.append style={anchor=base}
|
|
}}
|
|
|
|
\tikzset{month label below left/.style={%
|
|
execute before day scope={%
|
|
\ifdate{day of month=1}{%
|
|
{
|
|
\pgftransformxshift{-3.25ex}%
|
|
\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
|
|
\pgftransformyshift{-1.25\pgf@y}
|
|
\tikzmonthcode%
|
|
}
|
|
}{}},
|
|
every month/.append style={anchor=base west}
|
|
}}
|
|
|
|
|
|
|
|
%
|
|
% Code of the actual \calendar command (tikz.code.tex contains \let\calendar=\tikz@lib@cal@calendar):
|
|
%
|
|
|
|
\def\tikz@lib@cal@calendar{%
|
|
\begingroup%
|
|
\let\tikz@lib@cal@ifs=\pgfutil@empty%
|
|
\tikz@expandcount=1000\relax%
|
|
\tikzset{name=,at={(0,0)}}%
|
|
\let\%=\pgfcalendarshorthand%
|
|
\tikzset{every calendar/.try}%
|
|
\tikz@lib@cal@scanner%
|
|
}
|
|
|
|
\def\tikz@lib@cal@scanner{%
|
|
\afterassignment\tikz@lib@cal@handle\let\pgf@let@token=%
|
|
}
|
|
|
|
\def\tikz@lib@cal@handle{%
|
|
\let\pgfutil@next=\tikz@lib@cal@expand%
|
|
\ifx\pgf@let@token;%
|
|
\let\pgfutil@next=\tikz@lib@cal@stop%
|
|
\else%
|
|
\ifx\pgf@let@token(%)
|
|
\let\pgfutil@next=\tikz@lib@cal@name%
|
|
\else%
|
|
\ifx\pgf@let@token a%
|
|
\let\pgfutil@next=\tikz@lib@cal@at%
|
|
\else%
|
|
\ifx\pgf@let@token[%
|
|
\let\pgfutil@next=\tikz@lib@cal@option%
|
|
\else%
|
|
\ifx\pgf@let@token i%
|
|
\let\pgfutil@next=\tikz@lib@cal@if%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\pgfutil@next%
|
|
}
|
|
\def\tikz@lib@cal@expand{%
|
|
\advance\tikz@expandcount by -1%
|
|
\ifnum\tikz@expandcount<0\relax%
|
|
\tikzerror{Giving up on this calendar}%
|
|
\let\pgfutil@next=\tikz@lib@cal@end%
|
|
\else%
|
|
\let\pgfutil@next=\tikz@lib@cal@@expand
|
|
\fi%
|
|
\pgfutil@next}
|
|
|
|
\def\tikz@lib@cal@@expand{\expandafter\tikz@lib@cal@scanner\pgf@let@token}
|
|
|
|
|
|
\def\tikz@lib@cal@name#1){%
|
|
\tikzset{name=#1}%
|
|
\tikz@lib@cal@scanner%
|
|
}
|
|
\def\tikz@lib@cal@at t#1(#2){%
|
|
\tikzset{at={(#2)}}%
|
|
\tikz@lib@cal@scanner%
|
|
}
|
|
\def\tikz@lib@cal@option#1]{%
|
|
\tikzset{#1}%
|
|
\tikz@lib@cal@scanner%
|
|
}
|
|
\def\tikz@lib@cal@if f#1(#2){%
|
|
\pgfutil@ifnextchar[{\tikz@lib@cal@if@opt{#2}}{\tikz@lib@cal@if@code{#2}}}%}
|
|
|
|
\def\tikz@lib@cal@if@opt#1[#2]{\tikz@lib@cal@if@code{#1}{\tikzset{#2}}}
|
|
\def\tikz@lib@cal@if@code#1#2{%
|
|
\pgfutil@ifnextchar e{\tikz@lib@cal@if@else{#1}{#2}}{\tikz@lib@cal@if@else{#1}{#2}else{}}}
|
|
|
|
\def\tikz@lib@cal@if@else#1#2else{%
|
|
\pgfutil@ifnextchar[{\tikz@lib@cal@if@else@opt{#1}{#2}}{\tikz@lib@cal@if@else@code{#1}{#2}}}%}
|
|
\def\tikz@lib@cal@if@else@opt#1#2[#3]{\tikz@lib@cal@if@else@code{#1}{#2}{\tikzset{#3}}}
|
|
\def\tikz@lib@cal@if@else@code#1#2#3{%
|
|
\expandafter\def\expandafter\tikz@lib@cal@ifs\expandafter{\tikz@lib@cal@ifs\ifdate{#1}{#2}{#3}}%
|
|
\tikz@lib@cal@scanner%
|
|
}
|
|
\def\tikz@lib@cal@stop{%
|
|
\pgftransformshift{\tikz@node@at}%
|
|
\expandafter\pgfcalendar\expandafter{\tikz@fig@name}{\tikz@lib@cal@start}{\tikz@lib@cal@end}%
|
|
{%
|
|
\tikz@before@day%
|
|
\scope%
|
|
\tikz@atbegin@day%
|
|
\tikz@lib@cal@ifs%
|
|
\tikzdaycode%
|
|
\tikz@atend@day%
|
|
\endscope%
|
|
\tikz@after@day%
|
|
}%
|
|
\endgroup%
|
|
}
|
|
|
|
\tikzoption{if}{%
|
|
\let\tikz@lib@cal@scanner@orig=\tikz@lib@cal@scanner%
|
|
\let\tikz@lib@cal@scanner=\relax%
|
|
\tikz@lib@cal@if f#1\relax%
|
|
\let\tikz@lib@cal@scanner=\tikz@lib@cal@scanner@orig}
|
|
|
|
|
|
|
|
\endinput
|
|
|