% ---------------------------------------------------------------------------- %
%% \file cal.tex
%% \author Sebastien Beaugrand
%% \sa http://beaugrand.chez.com/
%% \copyright CeCILL 2.1 Free Software license
% ---------------------------------------------------------------------------- %
\documentclass[a4paper]{article}
\usepackage{vmargin}
\newlength{\width}
\setlength{\width}{297mm}
\newlength{\height}
\setlength{\height}{210mm}
\newlength{\margin}
\setlength{\margin}{7mm}
\setpapersize{custom}{\width}{\height}
\setmarginsrb{\margin}{10mm}{\margin}{10mm}{0mm}{0mm}{0mm}{0mm}
\renewcommand\normalsize{%
 \usefont{T1}{phv}{m}{n}\fontsize{8pt}{9pt}\selectfont}
\usepackage[french]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\pagestyle{empty}
\usepackage{colortbl}
\def\grey{\rowcolor[gray]{0.75}}
\def\greyII{\rowcolor[gray]{0.85}}
\definecolor{tgrey}{gray}{0.5}
\usepackage{graphics}
\usepackage{setspace}
\tabcolsep=1pt
\parindent0pt
\parskip0pt

% ---------------------------------------------------------------------------- %
% Paramètres
% ---------------------------------------------------------------------------- %
% Année
\input{year.tex}
% Latitude et longitude
\input{lat.tex}
\input{lon.tex}
% h0
\input{h0.tex}
% Vacances
\input{vacances\annee.tex}

% ---------------------------------------------------------------------------- %
% Lunes
% ---------------------------------------------------------------------------- %
\input{calendar/calend0.tex}
\input{calendar/sun.tex}
\setyear{\annee}
% Saisons
\newcount\winterday \linY 365.242.756+355784. \caldate \winterday=\Day
\newcount\springday \linY 365.242.365+ 79573. \caldate \springday=\Day
\newcount\summerday \linY 365.241.628+172405. \caldate \summerday=\Day
\newcount\fallday   \linY 365.242.045+266014. \caldate   \fallday=\Day
% Phases de la lune
\input{calendar/moon.tex}
\def\modulo#1#2{%
  \count0=#1
  \divide\count0 by #2
  \multiply\count0 by #2
  \multiply\count0 by -1
  \advance\count0 by #1
}
\newcount\moon
\def\moonphasenumber{%
  \count0=\moonno \count1=\moonno
  \divide\count0 by4\multiply\count0 by4
  \advance\count1 by-\count0
  \global\moon=\count1
}
\def\nextmoonphasenumber{%
  \moondate \moonphasenumber
  \global\advance\moonno by1
  \caldate
}
\def\initmoon{%
  \firstmoon \moonphasenumber
  \global\advance\moonno by1
  \caldate
  \ifnum\Month=12 \nextmoonphasenumber \fi
}
\initmoon
\font\moonfont=moonphase at 7pt
\setlength{\unitlength}{1pt}

% ---------------------------------------------------------------------------- %
% Vacances scolaires
% ---------------------------------------------------------------------------- %
\newcommand\vacancesScolaires{%
  \ifnum\mois=\vAsmZoneA \ifnum\jourdumois=\vAsdZoneA
    \global\zoneA=1 \global\zoneB=1 \global\zoneC=1 \fi \fi

  \ifnum\mois=\vBsmZoneA \ifnum\jourdumois=\vBsdZoneA \global\zoneA=1 \fi \fi
  \ifnum\mois=\vBsmZoneB \ifnum\jourdumois=\vBsdZoneB \global\zoneB=1 \fi \fi
  \ifnum\mois=\vBsmZoneC \ifnum\jourdumois=\vBsdZoneC \global\zoneC=1 \fi \fi

  \ifnum\mois=\vCsmZoneA \ifnum\jourdumois=\vCsdZoneA \global\zoneA=1 \fi \fi
  \ifnum\mois=\vCsmZoneB \ifnum\jourdumois=\vCsdZoneB \global\zoneB=1 \fi \fi
  \ifnum\mois=\vCsmZoneC \ifnum\jourdumois=\vCsdZoneC \global\zoneC=1 \fi \fi

  \ifnum\mois=\ascensmois \ifnum\jourdumois=\ascensjour
    \global\zoneA=1 \global\zoneB=1 \global\zoneC=1 \global\ascens=1 \fi \fi

  \ifnum\mois=\vDsmZoneA \ifnum\jourdumois=\vDsdZoneA
    \global\zoneA=1 \global\zoneB=1 \global\zoneC=1 \fi \fi

  \ifnum\mois=\vEsmZoneA \ifnum\jourdumois=\vEsdZoneA
    \global\zoneA=1 \global\zoneB=1 \global\zoneC=1 \fi \fi

  \ifnum\mois=\vFsmZoneA \ifnum\jourdumois=\vFsdZoneA
    \global\zoneA=1 \global\zoneB=1 \global\zoneC=1 \fi \fi

  \ifnum\zoneA=1 \textcolor{red}    {\vline width 1pt}%
    \else \phantom{\textcolor{red}  {\vline width 1pt}}\fi
  \hspace*{2pt}%
  \ifnum\zoneB=1 \textcolor{blue}   {\vline width 1pt}%
    \else \phantom{\textcolor{blue} {\vline width 1pt}}\fi
  \hspace*{2pt}%
  \ifnum\zoneC=1 \textcolor{green}  {\vline width 1pt}%
    \else \phantom{\textcolor{green}{\vline width 1pt}}\fi
  \hspace*{1pt}

  \ifnum\mois=\vAemZoneA \ifnum\jourdumois=\vAedZoneA
    \global\zoneA=0 \global\zoneB=0 \global\zoneC=0 \fi \fi

  \ifnum\mois=\vBemZoneA \ifnum\jourdumois=\vBedZoneA \global\zoneA=0 \fi \fi
  \ifnum\mois=\vBemZoneB \ifnum\jourdumois=\vBedZoneB \global\zoneB=0 \fi \fi
  \ifnum\mois=\vBemZoneC \ifnum\jourdumois=\vBedZoneC \global\zoneC=0 \fi \fi

  \ifnum\mois=\vCemZoneA \ifnum\jourdumois=\vCedZoneA \global\zoneA=0 \fi \fi
  \ifnum\mois=\vCemZoneB \ifnum\jourdumois=\vCedZoneB \global\zoneB=0 \fi \fi
  \ifnum\mois=\vCemZoneC \ifnum\jourdumois=\vCedZoneC \global\zoneC=0 \fi \fi

  \ifnum\ascens=1
    \ifnum\jour=1
      \global\zoneA=0 \global\zoneB=0 \global\zoneC=0 \global\ascens=0 \fi \fi

  \ifnum\mois=\vDemZoneA \ifnum\jourdumois=\vDedZoneA
    \global\zoneA=0 \global\zoneB=0 \global\zoneC=0 \fi \fi

  \ifnum\mois=\vEemZoneA \ifnum\jourdumois=\vEedZoneA
    \global\zoneA=0 \global\zoneB=0 \global\zoneC=0 \fi \fi

  \ifnum\mois=\vFemZoneA \ifnum\jourdumois=\vFedZoneA
    \global\zoneA=0 \global\zoneB=0 \global\zoneC=0 \fi \fi
}

% ---------------------------------------------------------------------------- %
% ligne
% ---------------------------------------------------------------------------- %
\newcommand\ligne{%
  \ifnum\jour=7
    \grey
  \else
    \ifnum\jourdumois=\paquesjour \ifnum\mois=\paquesmois \greyII \fi \fi
    \ifnum\jourdumois=\ascensjour \ifnum\mois=\ascensmois \greyII \fi \fi
    \ifnum\jourdumois=\pentecjour \ifnum\mois=\pentecmois \greyII \fi \fi
    \ifnum\jourdumois=1  \ifnum\mois=1  \greyII \fi \fi
    \ifnum\jourdumois=1  \ifnum\mois=5  \greyII \fi \fi
    \ifnum\jourdumois=8  \ifnum\mois=5  \greyII \fi \fi
    \ifnum\jourdumois=14 \ifnum\mois=7  \greyII \fi \fi
    \ifnum\jourdumois=15 \ifnum\mois=8  \greyII \fi \fi
    \ifnum\jourdumois=1  \ifnum\mois=11 \greyII \fi \fi
    \ifnum\jourdumois=11 \ifnum\mois=11 \greyII \fi \fi
    \ifnum\jourdumois=25 \ifnum\mois=12 \greyII \fi \fi
  \fi
  \centerline{\number\jourdumois}
  \tiny
  \setstretch{0}
  \IfFileExists{sun}{%
    \immediate\write18{sun
      \number\annee-\number\mois-\number\jourdumois{}
      \number\latitude{} \number\longitude{} \number\h0{} h
      | sed 's/:/$:$/g' >meridien-h.txt}
  }{}
  \IfFileExists{meridien-h.txt}{%
    \textcolor{tgrey}{\vspace*{-3pt}\hspace*{3.0pt}\input{meridien-h.txt}}
  }{}
  \normalsize
  &
  \centerline{\ifcase\jour \or L \or M \or M \or J \or V \or S \or D \fi}
  \tiny
  \setstretch{0}
  \IfFileExists{sun}{%
    \immediate\write18{sun
      \number\annee-\number\mois-\number\jourdumois{}
      \number\latitude{} \number\longitude{} \number\h0{} m
      | sed 's/:/$:$/g' >meridien-m.txt}
  }{}
  \IfFileExists{meridien-m.txt}{%
    \textcolor{tgrey}{\vspace*{-3pt}\hspace*{1.0pt}\input{meridien-m.txt}}
  }{}
  \normalsize
  &
  % Numéros des semaines
  \ifnum\jour=1
    \textcolor{tgrey}{\number\week} \global\advance\week1
  \else \ifnum\jourdumois=1 \ifnum\mois=1
    \textcolor{tgrey}{1}
  \fi \fi \fi
  % Changements d'heure
  \ifnum\mois=3  \ifnum\jour=7 \ifnum\jourdumois>24 +1h \fi \fi \fi
  \ifnum\mois=10 \ifnum\jour=7 \ifnum\jourdumois>24 -1h \fi \fi \fi
  % Fêtes païennes
  \ifnum\jourdumois=\winterday \ifnum\mois=12 Jul    \fi \fi
  \ifnum\jourdumois=\springday \ifnum\mois=3  Ostara \fi \fi
  \ifnum\jourdumois=\summerday \ifnum\mois=6  Litha  \fi \fi
  \ifnum\jourdumois=\fallday   \ifnum\mois=9  Mabon  \fi \fi
  \ifnum\jourdumois=2  \ifnum\mois=2  Imbolc     \fi \fi
  \ifnum\jourdumois=30 \ifnum\mois=4  Beltaine   \fi \fi
  \ifnum\jourdumois=1  \ifnum\mois=8  Lughnasadh \fi \fi
  \ifnum\jourdumois=31 \ifnum\mois=10 Samhain    \fi \fi
  \ifnum\mois=\fetemmois \ifnum\fetemmois=5 \ifnum\jour=7 \ifnum\jourdumois>24
    Fête des mères \fi \fi \fi \fi
  \ifnum\mois=\fetemmois \ifnum\fetemmois=6 \ifnum\jour=7 \ifnum\jourdumois<8
    Fête des mères \fi \fi \fi \fi
  \ifnum\mois=6  \ifnum\jour=7 \ifnum\jourdumois>14 \ifnum\jourdumois<22
    Fête des pères \fi \fi \fi \fi
  \ifnum\mois=3  \ifnum\jour=7 \ifnum\jourdumois<8
    Fête des grand-mères \fi \fi \fi
  \ifnum\mois=10 \ifnum\jour=7 \ifnum\jourdumois<8
    Fête des grand-pères \fi \fi \fi
  % Lever et coucher du soleil
  \tiny
  \IfFileExists{sun}{%
    \immediate\write18{sun
      \number\annee-\number\mois-\number\jourdumois{}
      \number\latitude{} \number\longitude{} \number\h0{}
      | sed 's/:/$:$/g' >sun.txt}
  }{}
  \IfFileExists{sun.txt}{%
    ~\vspace*{-3pt}\newline\input{sun.txt}
  }{}
  % Apogée, périgée, noeuds, déclinaisons et theme de la lune
  \IfFileExists{moon-events}{%
    \immediate\write18{moon-events
      \number\annee-\number\mois-\number\jourdumois{}
      | dd ibs=20 count=1 2>/dev/null
      | sed 's/:/$:$/' >moon.txt && test -s moon.txt || rm moon.txt}%
  }{}%
  \IfFileExists{moon.txt}{%
    \textcolor{tgrey}{\input{moon.txt}}
  }{%
    \IfFileExists{moon-themes}{%
      \immediate\write18{moon-themes
        \number\annee-\number\mois-\number\jourdumois{}
        | sed 's/:/$:$/' >moon.txt && test -s moon.txt || rm moon.txt}%
    }{}%
    \IfFileExists{moon.txt}{%
      \textcolor{tgrey}{\input{moon.txt}}
    }{%
      ~
    }
  }
  \normalsize
  &
  % Phases de la lune
  \ifnum\jourdumois=\Day \ifnum\mois=\Month
    \begin{picture}(7,7)(0,1.5){\moonfont\char\moon}\end{picture}
    $\nextmoonphasenumber$
  \fi \fi
  &
  % Vacances scolaires
  \vacancesScolaires

  \global\advance\jourdumois1
  \ifnum\jour<7 \global\advance\jour1 \else \global\advance\jour-6 \fi
  \\ \hline
}

% ---------------------------------------------------------------------------- %
% semestre
% ---------------------------------------------------------------------------- %
\newcommand\semestre[1]{%
  \begin{minipage}{\dimseme}
  \begin{center}
  \loop
  \newcount\jourdumois \jourdumois=1
  \newcount\last
  \ifcase\mois
    \or \last=31 \or \last=28 \or \last=31 \or \last=30
    \or \last=31 \or \last=30 \or \last=31 \or \last=31
    \or \last=30 \or \last=31 \or \last=30 \or \last=31
  \fi
  \ifnum\mois=2
    \tmp=\annee
    \divide\tmp4 \multiply\tmp4
    \ifnum\tmp=\annee \last=29 \fi
  \fi
  \begin{tabular}[t]{|p{10pt}|p{10pt}|p{\dimjour}@{}p{10pt}@{}r|}
  \multicolumn{5}{p{\dimmois}}{}\\ \hline
  \multicolumn{5}{|@{}c@{}|}{\textbf{
    \ifcase\mois
      \or JANVIER   \or FÉVRIER \or MARS     \or AVRIL
      \or MAI       \or JUIN    \or JUILLET  \or AOÛT
      \or SEPTEMBRE \or OCTOBRE \or NOVEMBRE \or DÉCEMBRE
    \fi
    \phantom{É}\annee}}\\ \hline \hline
  \ligne \ligne \ligne \ligne \ligne \ligne \ligne
  \ligne \ligne \ligne \ligne \ligne \ligne \ligne
  \ligne \ligne \ligne \ligne \ligne \ligne \ligne
  \ligne \ligne \ligne \ligne \ligne \ligne \ligne
  \ifnum\last>28 \ligne \fi
  \ifnum\last>29 \ligne \fi
  \ifnum\last>30 \ligne \fi
  \end{tabular}
  \global\advance\mois1
  \ifnum\mois<#1 \repeat\\
  % Bas de page
  \scriptsize
  \begin{tabular}{lllr}
  \textcolor{red}{Zone A :}
  Besançon, Bordeaux, Clermont-Ferrand, Dijon,
  Grenoble, Limoges, Lyon, Poitiers&&&
  \IfFileExists{moon-events}{
    AL: Apogée lunaire, PL: Périgée lunaire
  }{}\\
  \textcolor{blue}{Zone B :}
  Aix-Marseille, Amiens, Caen, Lille, Nancy-Metz, Nantes,
  Nice, Orléans-Tours, Reims, Rennes, Rouen, Strasbourg&
  \IfFileExists{moon-events}{
    \IfFileExists{moon-themes}{
      \texttt{PO SC CN} : jour feuilles&
      \texttt{VE BA GE} : jour fleurs&
    }{&&}
    NA: N\oe{}ud ascendant, ND: N\oe{}ud descendant
  }{}\\
  \textcolor{green}{Zone C :}
  Créteil, Montpellier, Paris, Toulouse, Versailles --
  Lundi de Pâques: \number\paquesjour/\number\paquesmois,
  Lundi de Pentecôte: \number\pentecjour/\number\pentecmois&
  \IfFileExists{moon-events}{
    \IfFileExists{moon-themes}{
      \texttt{CA VI TA} : jour racines&
      \texttt{SA LI BE} : jour graines et fruits&
    }{&&}
    LM: Lune montante, LD: Lune descendante
  }{}\\
  \multicolumn{4}{@{}p{\dimseme}@{}}{}
  \end{tabular}
  \normalsize
  \end{center}
  \end{minipage}
}

% ---------------------------------------------------------------------------- %
% main
% ---------------------------------------------------------------------------- %
\begin{document}
% Calcul du premier jour de la première semaine
\newcount\jour \jour=2
\newcount\tmp
\tmp=\annee \advance\tmp-1 \multiply\tmp5 \divide\tmp4 \advance\jour\tmp
\tmp=\annee \advance\tmp-1 \divide\tmp100 \advance\tmp-7 \multiply\tmp3
\divide\tmp4 \advance\jour-\tmp
\tmp=\jour \divide\tmp7 \multiply\tmp7 \advance\jour-\tmp
\ifnum\jour=0 \jour=7 \fi

% Lundi de paques, jeudi de l'ascension, lundi de pentecote
\input paques.tex
\paques
\ascension
\pentecote

% Fête des mères
\newcount\fetemmois \fetemmois=\pentecmois
\newcount\fetemjour \fetemjour=\pentecjour
\ifnum \fetemjour=1
  \advance\fetemmois-1 \advance\fetemjour\fetemmois \advance\fetemjour25
\else
  \advance\fetemjour-1
\fi
\ifnum \fetemmois=5
  \ifnum\fetemjour>24
    \fetemmois=6
  \fi
\else
  \fetemmois=5
\fi

\newcount\mois
\newcount\week
\newcount\zoneA
\newcount\zoneB
\newcount\zoneC
\newcount\ascens
\newlength{\dimseme}
\newlength{\dimmois}
\newlength{\dimjour}

\begin{center}
\mois=1
\week=1 \ifnum\jour>1 \advance\week1 \fi
\zoneA=0
\zoneB=0
\zoneC=0
\ascens=0
\setlength{\dimseme}{\width}
\addtolength{\dimseme}{-\margin}
\addtolength{\dimseme}{-\margin}
\newlength{\diviseur}
\setlength{\diviseur}{6pt}% 6 mois
\setlength{\dimmois}{\dimseme}
\addtolength{\dimmois}{-24pt}% marges
\setlength{\dimmois}{\dimexpr \numexpr \dimmois / \diviseur \relax pt\relax}
\setlength{\dimjour}{\dimmois}
\addtolength{\dimjour}{-10pt}% jour
\addtolength{\dimjour}{-10pt}% jour
\addtolength{\dimjour}{-10pt}% lune
\addtolength{\dimjour}{-8pt}% vacances
\addtolength{\dimjour}{-6pt}% marges
\semestre{7}
\newpage
\semestre{13}
\end{center}
\end{document}