\documentclass{article}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage[a4paper,margin=2cm]{geometry}
%% Manuel LUQUE <Mluque5130aol.com> %%
%% 1 Octobre 1999 pour le dodécaèdre %%
%% 23 avril 2003 pour le calendrier %%
%% 26 avril : calcul de la date de Pâques %%
%% 27 avril 20003 : repérer une date particulière,
%% suggestion de Jean-Michel Sarlat %%
%% jours fériés : 1 et 8 mai, 1 et 11 décembre
%% 25 août et lundi de Pâques
\pagestyle{empty}
%
\usepackage[french]{pst-calendar}
%
\usepackage{url}
\newcommand\Encadre[1]{\psframebox[fillstyle=solid,fillcolor=yellow,linecolor=red]{#1}}
\title{Calculer un calendrier avec \LaTeX{},\\
le dessiner en 3D avec PSTricks (version 0.47)}
\author{Manuel Luque}
\date{\today}
\begin{document}

\maketitle
%{\typein[\Year]{Entrez l'année (2000...2099)?}
%\def\Year{2006}
\begin{center}
\psset{An=2006}
\begin{tabular}{ll}
\psCalendar[Mois=1]&\psCalendar[Mois=2]\\
\psCalendar[Mois=3]&\psCalendar[Mois=4]\\
\psCalendar[Mois=5]&\psCalendar[Mois=6]
\end{tabular}

\end{center}
\begin{center}
\begin{tabular}{ll}
\psCalendar[Mois=7]&\psCalendar[Mois=8]\\
\psCalendar[Mois=9]&\psCalendar[Mois=10]\\
\psCalendar[Mois=11]&\psCalendar[Mois=12]
\end{tabular}
\end{center}
%}
\begin{center}
\psscalebox{0.5}{\psCalDodecaeder[Vx=-\rd,Vy=\rc,Vz=0,viewangle=198]}
\end{center}
\section{Objectifs, outils et méthodes adoptés}
\subsection{Objectifs}
Il s'agissait de calculer avec \LaTeX{}, un calendrier valable de l'an
2\,000 à l'an 2\,099 (je suis optimiste), puis d'adopter une méthode
originale de représentation en 3D, en plaçant chaque mois sur l'une des
faces d'un dodécaèdre. Un calendrier de ce type était, il y quelques années,
offert par les visiteurs médicaux des laboratoires \textsc{Pfizer}.
\subsection{Outils adoptés}
Il existe déjà un calendrier écrit en \LaTeX{}, dont les calculs sont faits
directement en \TeX{}. Il s'agit de \texttt{calendar}, écrit par Michael
Barret et disponible sur le serveur du \texttt{CTAN} ; c'est très bien fait.

Un calendrier en 3D, dessiné avec PSTricks, est déjà proposé depuis plusieurs d'années par Denis
Girou sur : \url{http://tug.org/applications/PSTricks/More}.

Donc, rien de neuf, mais revu à ma façon : pour ma part j'ai décidé d'utiliser les macros du package \texttt{fp} de Michael
Mehlich, qui forment un excellent outil de calcul. La lecture du code écrit
avec ce package est plus compréhensible que celui écrit en \TeX{} de base.

Pour la représentation en 3d, j'ai aussi, utilisé PSTricks de Timothy Van Zandt, et
en particulier l'extension \texttt{pst-3d}.
\subsection{Méthode adoptée}
La méthode de calcul des jours de semaine du calendrier est déduite de quelques
observations :
\begin{enumerate}
  \item Le 1 janvier 2\,000 est un samedi. On adopte la convention de
  représenter les jours de semaine par un numéro : j'ai choisi :
\begin{center}
  \renewcommand{\arraystretch}{1.5}
  \begin{tabular}{ccccccc}
  lundi&mardi&mercredi&jeudi&vendredi&samedi&dimanche\\ \hline
  1&2&3&4&5&6&7
  \end{tabular}
\end{center}
  \item Une année ordinaire comprend 365 jours, or $365=52\times7+1$. Il y a
  donc un décalage de 1~jour dans le nom des jours pour l'année suivante si
  elle est ordinaire elle aussi. Autrement dit le 1~janvier 2\,001 devrait
  être un dimanche ($6+1=7$). Or l'an 2\,000 est bissextile et comporte 366~jours : le
  décalage sera de 2, le 1~janvier 2\,001 correspondra au numéro $6+2=8=1\ (modulo\ 7)$.
  \item Sur la période retenue 2\,000/2\,099 les années divisibles par 4 :
  2\,000, 2\,004, 2\,008 etc. sont bissextiles. On déterminera donc si
  l'année choisie est bissextile en testant si elle est un multiple de~4.
\begin{verbatim}
% test d'une année bissextile
\FPeval{\YearBissextil}{(\psk@CalendrierA)/4}
\FPtrunc{\YearBissextil}{\YearBissextil}{0}
\FPeval{\YearBissextil}{(\YearBissextil)*4}
\FPtrunc{\YearBissextil}{\YearBissextil}{0}
\ifnum\YearBissextil=\psk@CalendrierA
etc.
\end{verbatim}
  \item Pour une année choisie, on calculera le décalage par rapport à
  2\,000, en comptant les années et en ajoutant 1 chaque fois qu'il y aura
  dans cet intervalle une année bissextile (en tenant compte de 2\,000).
  \item On retient pour le début de chaque mois :
\begin{center}
  \renewcommand{\arraystretch}{1.5}
  \begin{tabular}{c|c|c}
  mois&année ordinaire&année bissextile\\ \hline
  janvier&1&1\\
  février&32&32\\
  mars&60&61\\
  avril&91&92\\
  mai&121&122\\
  juin&152&153\\
  juillet&182&183\\
  août&213&214\\
  septembre&244&245\\
  octobre&274&275\\
  novembre&305&306\\
  décembre&335&336\\
  \end{tabular}
\end{center}
\end{enumerate}




\section{L'utilisation}
\subsection{Utilisation simple}
Si on veut voir uniquement le mois de l'année choisie, on fera, par exemple :
\begin{verbatim}
\psCalendar[An=2099,Mois=12,Jour=25,MoisChoisi=12]
\end{verbatim}
\begin{center}
\psCalendar[An=2099,Mois=12,Jour=25,MoisChoisi=12]
\end{center}
Cette étude ne teste pas si les valeurs introduites pour l'année(\texttt{An}) et le mois(\texttt{Mois}), sont correctes !

Par défaut, la commande \verb+\psCalendar+ affiche le mois et l'année en
cours et entoure la date du jour (suggestion de Jean-Michel \textsc{Sarlat}).

Si on veut voir afficher, un jour d'un mois particulier, on rajoutera le
paramètre \Encadre{\texttt{MoisChoisi=valeur}} aux autres, comme dans
l'exemple précédent et le suivant.
\begin{center}
\psCalendar
\end{center}
\begin{verbatim}
\psCalendar[An=2004,Mois=6,Jour=21,MoisChoisi=6]
\end{verbatim}
\begin{center}
\psCalendar[An=2004,Mois=6,Jour=21,MoisChoisi=6]
\end{center}
\subsection{Le calendrier en 3D}
La commande s'écrit très simplement :
\begin{verbatim}
\psCalDodecaeder
\end{verbatim}
\begin{center}
\psscalebox{0.5}{\psCalDodecaeder}
\end{center}
pour avoir le calendrier de l'année en cours. Si le schéma est trop grand à
votre goût, encadrez la commande par un \verb+\psscalebox{0.5}{\psCalDodecaeder}+

Pour avoir le mois de mai face à soi, on écrira, par exemple :
\begin{verbatim}
\psscalebox{0.5}{\psCalDodecaeder[style=mai]}
\end{verbatim}
\begin{center}
\psscalebox{0.5}{\psCalDodecaeder[style=mai]}
\end{center}
\verb+Vx, Vy, Vz+ sont les valeurs des paramètres de \texttt{viewpoint=-5.85 -3.62
0} de la commande \verb+\ThreeDput+ de \verb+pst-3d+, qui sont les
coordonnées d'un vecteur définissant la direction où se trouve
l'observateur (la direction de la projection parallèle).

On jouera aussi sur le paramètre \verb+viewangle+, pour amener la face
observée dans le bon sens de la lecture.

Pour avoir le mois de janvier face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=janvier]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=janvier]}
\end{center}
Pour avoir le mois de février face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=fevrier]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=fevrier]}
\end{center}
Pour avoir le mois de mars face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=mars]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=mars]}
\end{center}
Pour avoir le mois d'avril face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=avril]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=avril]}
\end{center}
Pour avoir le mois de juin face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=juin]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=juin]}
\end{center}
Pour avoir le mois de juillet face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=juillet]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=juillet]}
\end{center}
Pour avoir le mois d'août face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=aout]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=aout]}
\end{center}
Pour avoir le mois de septembre face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=septembre]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=septembre]}
\end{center}
Pour avoir le mois d'octobre face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=octobre]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=octobre]}
\end{center}
Pour avoir le mois de novembre face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=novembre]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=novembre]}
\end{center}
Pour avoir le mois de décembre face à soi, on écrira :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=decembre]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=decembre]}
\end{center}
Pour visualiser une année particulière, avec un mois choisi face à soi, et un jour de ce mois, (15~mai~2004) on
fera :
\begin{verbatim}
\psscalebox{0.35}{\psCalDodecaeder[style=mai,An=2004,MoisChoisi=5,Jour=15]}
\end{verbatim}
\begin{center}
\psscalebox{0.35}{\psCalDodecaeder[style=mai,An=2004,MoisChoisi=5,Jour=15]}
\end{center}
\section{Calcul de la date de Pâques}
On trouve sur internet, à propos de ce sujet de nombreux sites. \'A partir
de la \textit{définition} de la fête proprement dite, les formules <<
magiques >> abondent. L'une d'elle a retenu mon attention, je l'ai
retranscrite avec le package \texttt{fp}. Dans l'ordre, un aperçu de la
page, puis le codage des calculs avec \texttt{fp}.

Le site : \texttt{http://www.altcal.com/elmcal.html}, et un extrait :

\begin{verbatim}
Version 2.0 - 11 Nov 1998

Copyright and disclaimer
------------------------
        This document is Copyright (C) 1998 by Claus Tondering.
        E-mail: claus@tondering.dk.
        The document may be freely distributed, provided this
        copyright notice is included and no money is charged for
        the document.
        This document is provided "as is". No warranties are made as
        to its correctness.

G = year mod 19

For the Julian calendar:
    I = (19*G + 15) mod 30
    J = (year + year/4 + I) mod 7

For the Gregorian calendar:
    C = year/100
    H = (C - C/4 - (8*C+13)/25 + 19*G + 15) mod 30
    I = H - (H/28)*(1 - (H/28)*(29/(H + 1))*((21 - G)/11))
    J = (year + year/4 + I + 2 - C + C/4) mod 7

Thereafter, for both calendars:
L = I - J
EasterMonth = 3 + (L + 40)/44
EasterDay = L + 28 - 31*(EasterMonth/4)
\end{verbatim}

\hrule
{\blue
\begin{verbatim}
\FPset{\Year}{1981}  % placer ici l'année
\FPeval\GY{(\Year)-19*trunc((\Year)/19,0)}
\FPeval{\Cent}{trunc((\Year)/100,0)}
\FPeval{\Iter}{trunc((\Cent)-trunc((\Cent)/4,0)-trunc((8*(\Cent)+13)/25,0)+
                (\GY)*19+15,0)}
\FPeval{\Iterdiv}{trunc((\Iter)/30,0)}
\FPeval\Hepact{(\Iter)-30*(\Iterdiv)}
\FPeval\Inbre{trunc((\Hepact)-trunc((\Hepact)/28,0)*
              (1-trunc((\Hepact)/28,0))*(trunc(29/((\Hepact)+1),0)*trunc((21-(\GY))/11,0)),0)}
\FPeval\Jnbreinter{trunc((\Year)+trunc((\Year)/4,0)+(\Inbre)+2-(\Cent)+trunc((\Cent)/4,0),0)}
\FPeval\Jnbre{trunc((\Jnbreinter)-7*trunc((\Jnbreinter)/7,0),0)}
\FPeval\Lnbre{trunc((\Inbre)-(\Jnbre),0)}
\FPeval\Month{trunc(3+trunc(((\Lnbre)+40)/44,0),0)}
\FPeval\Day{trunc((\Lnbre)+28-31*trunc((\Month)/4,0),0)}
\ifnum\Month=4
  \ifnum\Day>25 \FPeval{\Day}{trunc((\Day)-7,0)} \fi
\fi

P\^aques le Dimanche \FPprint\Day/\FPprint\Month/\FPprint\Year
\end{verbatim}}
\FPset{\Year}{1981}  % placer ici l'année
\FPeval\GY{(\Year)-19*trunc((\Year)/19,0)}
\FPeval{\Cent}{trunc((\Year)/100,0)}
\FPeval{\Iter}{trunc((\Cent)-trunc((\Cent)/4,0)-trunc((8*(\Cent)+13)/25,0)+
                (\GY)*19+15,0)}
\FPeval{\Iterdiv}{trunc((\Iter)/30,0)}
\FPeval\Hepact{(\Iter)-30*(\Iterdiv)}
\FPeval\Inbre{trunc((\Hepact)-trunc((\Hepact)/28,0)*
              (1-trunc((\Hepact)/28,0))*(trunc(29/((\Hepact)+1),0)*trunc((21-(\GY))/11,0)),0)}
\FPeval\Jnbreinter{trunc((\Year)+trunc((\Year)/4,0)+(\Inbre)+2-(\Cent)+trunc((\Cent)/4,0),0)}
\FPeval\Jnbre{trunc((\Jnbreinter)-7*trunc((\Jnbreinter)/7,0),0)}
\FPeval\Lnbre{trunc((\Inbre)-(\Jnbre),0)}
\FPeval\Month{trunc(3+trunc(((\Lnbre)+40)/44,0),0)}
\FPeval\Day{trunc((\Lnbre)+28-31*trunc((\Month)/4,0),0)}
\ifnum\Month=4
  \ifnum\Day>25 \FPeval{\Day}{trunc((\Day)-7,0)} \fi
\fi

\centerline{\Encadre{P\^aques tombe le dimanche
\FPprint\Day/\FPprint\Month/\FPprint\Year}}

Vous y reconnaîtrez sans peine l'algorithme initial, j'ai rajouté les trois
dernières lignes, car l'auteur des formules précédentes semble avoir oublié
que Pâques peut varier seulement entre le 22~mars et le 25~avril inclus
 Sans cette correction, le programme affiche dans l'exemple précédent (1981), le dimanche 26~avril au lieu du
 19~avril.

Pour le tester quelques dates :
\begin{center}
\begin{tabular}{c|c}
1978& 26 mars \\ \hline
1979&15 avril \\ \hline
1980&6 avril \\ \hline
2000&23 avril \\ \hline
2002&31 mars \\ \hline
2003&20 avril \\ \hline
\end{tabular}
\end{center}
Ce n'est pas garanti sans erreurs, l'emploi des fonctions \texttt{trunc} ou
\texttt{round} ou \texttt{clip} ne donnent pas à 100\% toujours, le résultat
attendu. Par exemple si \texttt{fp} calcule $14.99999999$, alors que
de toute évidence c'est $15$, il ne vaut mieux pas faire
\texttt{trunc} pour avoir la partie entière, mais \texttt{round},
car sinon on commet une erreur d'une unité en moins ! Il faudrait
donc prévoir de tester ces cas !
\section{Que reste-t-il à faire ? Problèmes !}
\begin{itemize}
  \item Placer les jours fériés du lundi de Pâques et du lundi de
  Pentecôte.
  \item Dessiner automatiquement le mois en cours, face à notre regard.
  \item Prévoir un test qui limite l'année choisie à l'intervalle permis,
  soit $[2000-2099]$.
  \item Trouver un moyen simple, élégant et cohérent d'entourer la date choisie.
  \item Débusquer les erreurs, si vous en trouvez\ldots
\end{itemize}

\end{document}
