You are currently browsing the tag archive for the ‘calendar’ tag.

Ci sono altre soluzioni con TikZ che ho trovato cercando nella rete.

Una viene dal forum di PGF-TikZ su Nabble, la si può trovare sotto la discussione: Calendar utility function: Improvement request. Questa soluzione implica stampare un mese per pagina. Il risultato del codice è riportato sotto.

%%in preamble:
%
\usepackage{tikz}
   \usetikzlibrary{calendar,shadows,patterns}
%%in document:
%
\tikzstyle{every shadow}=[opacity=.4,shadow xshift=2pt,shadow yshift=-2pt,fill=black!60]
\tikzstyle{caption}=[drop shadow,rounded corners=5pt,inner sep=4pt,draw=black!50,fill=black!5]
\tikzstyle{plot legend}=[
   rounded corners=2.5pt,inner xsep=3pt,inner ysep=2pt,
   draw=black!50,fill=white,
   font=\footnotesize,cells={anchor=center},
   nodes={inner sep=2pt,text depth=0.15em,rounded corners=0pt,right}]

\begin{tikzpicture}

\newlength{\daywidth}
\newlength{\dayheight}
\setlength{\daywidth}{3.5cm}
\setlength{\dayheight}{2.5cm}

\newcount\monthsheetdate
\newcount\monthsheetweekday

\pgfcalendardatetojulian{2009-02-01}{\monthsheetdate}
\pgfcalendarjuliantoweekday{\the\monthsheetdate}{\monthsheetweekday}
\advance\monthsheetdate by -\the\monthsheetweekday
\pgfcalendarjuliantodate{\the\monthsheetdate}{\myyear}{\mymonth}{\myday}
\edef\monthsheetbegin{\myyear-\mymonth-\myday}

\pgfcalendardatetojulian{2009-02-last}{\monthsheetdate}
\pgfcalendarjuliantoweekday{\the\monthsheetdate}{\monthsheetweekday}
\advance\monthsheetdate by -\the\monthsheetweekday
\advance\monthsheetdate by 6
\pgfcalendarjuliantodate{\the\monthsheetdate}{\myyear}{\mymonth}{\myday}
\edef\monthsheetend{\myyear-\mymonth-\myday}

\calendar[
    dates=\monthsheetbegin{} to \monthsheetend{},
    execute before day scope={%
      % month caption:
      \ifdate{equals=2009-02-01}{%
        \path (3.5\daywidth,0)
          node[above=1.8cm,
               every month,
               font=\Huge\bf,
               caption,
               inner sep=.5em]
            {\tikzmonthtext{} \tikzyeartext}
        ;
      }{}
      % week day captions:
      \ifdate{at most=\monthsheetbegin+6}{
        \path (\pgfcalendarcurrentweekday\daywidth,0)
          node[xshift=.5\daywidth,
               font=\LARGE\bf,
               above=1ex,
               anchor=base] {%
            \pgfcalendarweekdayshortname{\pgfcalendarcurrentweekday}%
          };
      }{}
    },
    execute at begin day scope={%
      \pgftransformxshift{\pgfcalendarcurrentweekday\daywidth}%
    },
    execute after day scope={%
      \ifdate{Sunday}{%
        \pgftransformyshift{-\dayheight}%
      }{}%
    },
%    week list,
%    day xshift=\daywidth,
%    day yshift=\dayheight,
    day bg/.style=,
    every day text/.style={font=\Large\bf},
    day code={%
      \node[anchor=north west,
            draw,
            minimum width=\daywidth,
            minimum height=\dayheight,
            day bg]{};%
      \node[anchor=north west,
            every day text,
            inner sep=7pt]{\tikzdaytext};%
    },
  every month/.append style={anchor=base}
%    month label above centered
  ]
  if (Sunday) [red]
  if (weekend) [day bg/.append style={fill=black!10}]
  if (at most=2009-02-01+-1,at least=2009-02-last+1)
    [%day bg/.append style={pattern=north east lines,pattern color=black!50},
     day bg/.append style={fill=black!25},
     every day text/.append style={font=\large}]
;
\end{tikzpicture}
Calendario dal forum su Nabble di PGF.

Calendario dal forum su Nabble di PGF.

Un’altra soluzione di calendario, di formato ridotto, è quella che ho trovato su fr.comp.text.tex nella discussione: PGF Calendar, problème de positionnement.

Il codice completo è riportato di seguito.

\documentclass{minimal}

\setlength{\paperwidth}{8cm}
\setlength{\paperheight}{8cm}

\usepackage{calc}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{calendar}

\setlength{\hoffset}{-1in}
\setlength{\voffset}{-1in}
\setlength\textwidth{\paperwidth}
\setlength\textheight{\paperheight}

% Let's get started
\begin{document}

% A counter
\newcount\MyDate

% Loop on the months
\foreach \month in
{01,02,03,04,05,06,07,08,09,10,11,12}
{%
\begin{tikzpicture}%
\calendar (cal) [
dates=2009-\month-01 to 2009-\month-last,
week list,
month label above centered,
% Shift month a little to let space for the day names
every month/.append style={yshift=.5cm},
day xshift=1cm,
day yshift=1cm,
execute at begin day scope={\ifdate{at most=\month-07}{%
% Get the current date (between 1 and 7)
\MyDate=\pgfcalendarcurrentday%
% Move it between 0 and 6
\advance\MyDate by -1\relax
% If the date is > to the weekday, then shift by twice the height of a cell
% Otherwise, only by the heigth of a cell
% Print the day name (they are all on the same line)
\ifnum \MyDate>\pgfcalendarcurrentweekday %
\node[yshift=2cm] {\pgfcalendarweekdayshortname
{\pgfcalendarcurrentweekday}}%
\else%
\node[yshift=1cm] {\pgfcalendarweekdayshortname
{\pgfcalendarcurrentweekday}}%
\fi}
{%
% For days after the seventh, do nothing
};}];\end{tikzpicture}\newpage}

\end{document}

Una delle pagine generate dal codice è riportata in figura.

Calendario dal forum fr.comp.text.tex.

Calendario dal forum fr.comp.text.tex.

Infine ecco un’idea per creare un calendario-agenda mensile con i giorni uno sotto l’altro, trovata su it.comp.software.tex sotto la discussione
Calendario usando pgf/TikZ. Riporto di seguito il codice e l’immagine ottenuta.

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usetikzlibrary{calendar}
\pagestyle{empty}

\begin{document}

\begin{tikzpicture}
\calendar
        [dates=2009-07-01 to 2009-07-last,
        day list downward,
        month label left,
        day code={\node[name=\pgfcalendarsuggestedname,
        every day]{\pgfcalendarweekdayshortname{\pgfcalendarcurrentweekday}\
\tikzdaytext};},
        every month/.append style={anchor=base east,xshift=-2em}];
\end{tikzpicture}

\end{document}
Calendario dal forum it.comp.software.tex.

Calendario dal forum it.comp.software.tex.

Terzo metodo per creare un calendario: usare TikZ-PGF. In realtà questo racchiude in sé tante soluzioni, come vedremo. È anche il metodo più complicato: intendiamoci, TikZ è uno strumento potentissimo, bellissimo, si possono realizzare layout impensabili altrimenti, ma per me è anche uno strumento complesso, difficile da imparare, con una curva di apprendimento ripidissima.

Vabbè, ma questo è il mio parere, veniamo al calendario. TikZ ha una libreria apposita, chiamata non sorprendentemente calendar. Sarebbe molto facile da usare, ma ha l’inspiegabile difetto di non inserire in modo diretto e lineare i giorni della settimana.

Personalmente ho aggirato il problema sfruttando l’ottima possibilità di posizionare i nodi e di controllarne la disposizione attraverso le matrici.

%%in preamble:
%
\usepackage{tikz}
\usetikzlibrary{positioning,calendar}
\usetikzlibrary{decorations.markings}

\newcommand{\calrow}[1]{\node[anchor=base east](lun){l};
\node[base right=of lun](mar){m}; \node[base right=of mar](mer){m};
\node[base right=of mer](gio){g}; \node[base right=of gio](ven){v};
\node[base right=of ven](sab){s}; \node[base right=of sab](dom){d};
\node[darkgreen,above=of gio]{\textbf{#1}};}

\newcommand{\calperiod}[1]{\calendar[dates=\the\year-#1-01 to \the\year-#1-last]
if(Sunday) [black!50] \holidays;}

\newcommand{\holidays}{% holidays in Italy
if (equals=01-01) [black!50]%
if (equals=01-06) [black!50]%
if (equals=04-04) [black!50]%
if (equals=04-05) [black!50]%
if (equals=04-25) [black!50]%
if (equals=05-01) [black!50]%
if (equals=05-01) [black!50]%
if (equals=06-02) [black!50]%
if (equals=08-15) [black!50]%
if (equals=11-01) [black!50]%
if (equals=12-08) [black!50]%
if (equals=12-25) [black!50]%
if (equals=12-26) [black!50]%
}

\colorlet{darkgreen}{green!50!black}

%%in document:
%
\begin{tikzpicture}[every calendar/.style={week list}]
\sffamily
\matrix[%
row 1/.style={darkgreen,node distance=.3ex},%
row 3/.style={darkgreen,node distance=.3ex},
column sep=1ex,%
draw=darkgreen,thick,rounded corners=5pt,%
postaction={decorate,decoration={markings,mark=at position 0.51 with
{\node[fill=white,text=darkgreen,font={\bfseries\Large}] (year) {\the\year};}}}
% year on frame: decorations.markings library
]{%
% first row: week day and month
\calrow{Gennaio} & \calrow{Febbraio} & \calrow{Marzo} &
\calrow{Aprile} & \calrow{Maggio} & \calrow{Giugno} \\
% second row: calendar
\calperiod{01} & \calperiod{02} & \calperiod{03} &
\calperiod{04} & \calperiod{05} & \calperiod{06} \\[1ex]
% third row: week day and month
\calrow{Luglio} & \calrow{Agosto} & \calrow{Settembre} &
\calrow{Ottobre} & \calrow{Novembre} & \calrow{Dicembre} \\
% forth row: calendar
\calperiod{07} & \calperiod{08} & \calperiod{09} &
\calperiod{10} & \calperiod{11} & \calperiod{12} \\
};
\end{tikzpicture}
Calendario su un foglio con TikZ

Calendario su un foglio con TikZ.

Tipo di soluzione intrapresa: ho posizionato i calendari dentro una matrice, i giorni della settimana e il nome del mese li ho inseriti manualmente nelle celle delle righe poste sopra i corrispondenti calendari (libreria positioning).

Ho inserito l’anno come decorazione della cornice disegnata attorno alla matrice (libreria decorations.markings), seguendo le spiegazioni relative alla libreria sul poderoso manuale di TikZ.

Nel mio caso volevo che il calendario fosse stampato su un foglio con orientazione portrait (verticale) ad una certa distanza dal margine superiore. Dopo aver posto il codice sopra riportato in un file a sé stante (denominato “cal-annuale”), ho ridimensionato e posizionato il tutto:

\vspace*{.3\textheight}
\makebox[\textwidth][c]{%
   \resizebox{1.07\textwidth}{!}{%
      \input{cal-annuale}}}

Parliamo sempre di calendario annuale su una pagina, e vediamo quale è il secondo metodo: usare il pacchetto yearly incluso in calendar. Ha il vantaggio di essere estremamente semplice nell’uso, lo svantaggio di essere poco personalizzabile.

Per ottenere il risultato nella figura sotto, il codice usato è il seguente:

%% in preamble:
%
\usepackage{comicsans}
\usepackage{yearly}
\usepackage{eso-pic}
\usepackage[svgnames]{xcolor}

%%in document:
%
\pagestyle{empty}

\AddToShipoutPicture{\AtTextUpperLeft{%
\put(-80,30){\includegraphics[width=1.5\textwidth]{photo}}%
}}

\begin{yearly}
{title={\centering \textcolor{SkyBlue}{\huge 2007}},firstday=1}{}
1 jan 2007
\end{yearly}

Calendario con il pacchetto yearly

Calendario con il pacchetto yearly.

Grazie al pacchetto eso-pic, ho inserito un’immagine nella pagina, che altrimenti risultava troppo spoglia.

What’s new

My logo (yes, I’ve got it) :-)

Ho un logo tutto mio (anche grazie a OpenClipArt)

Post Archives

Categories

Enter your email address to follow this blog and receive notifications of new posts by email.

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.