% \iffalse meta-comment
%
% Copyright Andrew Gilbert Moschou 2008
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
%
%   http://www.latex-project.org/lppl.txt
%
% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{eukdate}[2008/07/07 v1.02 LaTeX Package UK format date with weekday]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{eukdate}
\EnableCrossrefs
\CodelineIndex
\newcommand\US{\textsc{us}}
\newcommand\UK{\textsc{uk}}
\newcommand\floor[1]{\left\lfloor#1\right\rfloor}
\newcommand\pp[1]{\left(#1\right)}
\usepackage{amsmath}
\frenchspacing
\begin{document}
  \DocInput{eukdate.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{163}
%
% \GetFileInfo{eukdate.sty}
%
% \DoNotIndex{\addtocounter}
% \DoNotIndex{\day,\DeclareOption,\def,\divide}
% \DoNotIndex{\else,\ExecuteOptions,\eukordinal}
% \DoNotIndex{\fi}
% \DoNotIndex{\ifcase,\ifnum}
% \DoNotIndex{\loop}
% \DoNotIndex{\month,\multiply}
% \DoNotIndex{\newcommand,\newcounter,\newif,\number}
% \DoNotIndex{\or}
% \DoNotIndex{\ProcessOptions}
% \DoNotIndex{\relax,\repeat}
% \DoNotIndex{\setcounter,\space}
% \DoNotIndex{\year}
%
% \title{The \textsf{eukdate} package\thanks{This document corresponds to \textsf{eukdate}~\fileversion, dated~\filedate.}}
% \author{Andrew Gilbert Moschou\\\textsf{andmos@gmail.com}}
%
% \maketitle
%
% \section{Introduction}
%
% This package redefines \DescribeMacro{\today}|\today|, to typeset |\today|'s date in, for example the format \emph{Day, Date Month Year} (here, called `\UK\ format'), `\weekday, \number\day\ \monthname\ \number\year' as is preferred in many parts of the world outside the \US. Thus, |\maketitle| uses the \UK\ format (instead of the default \US\ format, `\monthname\ \number\day, \number\year' as used in the |article| class).
%
% This package also determines |\today|'s day of the week, which still makes the package useful even to Americans who might use the |usdate| option. The day of the week is calculated according to Zeller's congruence:
% \begin{align*}w &= \begin{cases}
% d + \floor{\frac{26}{10}\pp{m+1}} + y + \floor{\frac{y}{4}} + \floor{\frac{c}{4}} - 2c\mod 7 & \mbox{Gregorian calendar}\\
% d + \floor{\frac{26}{10}\pp{m+1}} + y + \floor{\frac{y}{4}} + 5 - c\mod 7 & \mbox{Julian calendar}
% \end{cases}\end{align*}where $d$ is the day of the month, $m$ is the number of the month, $y$ is the two digit year, $c$ is the century (so the year is given by $100c+y$) and $w$ represents the day of the week (0 for Saturday through to 6 for Friday); January and February are counted as months 13 and 14 of the previous year.
%
% \makeatletter
% The ordinal indicator of the date (in e.g. \number\day\textsuperscript{\euk@ordinal}, \number\day\euk@ordinal) is absent because its use is outdated.
% \makeatother
%
% \section{Usage}
%
% The package is invoked with |\usepackage{eukdate}|. This package also defines \DescribeMacro{\weekday}|\weekday| to typeset |\today|'s day of the week and \DescribeMacro{\monthname}|\monthname| to typeset the name of |\today|'s month (`\weekday' and `\monthname' when this document was typeset).
%
% \subsection{Options}
%
% \begin{description}
% \item[\sffamily no-weekday]Suppresses the weekday when typesetting |\today|, for example, `\number\day\ \monthname\ \number\year'. |\weekday| is still defined and can be used in the document.
% \item[\sffamily  ukdate]Typesets |\today| in \UK\ format, `\weekday, \number\day\ \monthname\ \number\year'. This option is applied by default, if the |usdate| option is not specified.
% \item[\sffamily  usdate]Typesets |\today| in \US\ format, `\weekday, \monthname\ \number\day, \number\year'.
% \item[\sffamily  gregorian]Calculates the day of the week according to the Gregorian calendar, which is the calendar that is socially used today. This option is applied by default, if the |julian| option is not specified.
% \item[\sffamily  julian]Calculates the day of the week according to the Julian calendar. However, since |\today|'s date is not \emph{today}'s date, as intepreted using the Julian calendar, this option is of limited use and can be safely ignored for every day use.
% \end{description}
%
% \StopEventually{\PrintIndex}
% \section{\textsf{eukdate.sty}}
%    \begin{macrocode}
\newif\if@euk@noweekday
\newif\if@euk@usdate
\newif\if@euk@julian
\DeclareOption{no-weekday}{\@euk@noweekdaytrue}
\DeclareOption{ukdate}{\@euk@usdatefalse}
\DeclareOption{usdate}{\@euk@usdatetrue}
\DeclareOption{gregorian}{\@euk@julianfalse}
\DeclareOption{julian}{\@euk@juliantrue}
\ExecuteOptions{ukdate,gregorian}
\ProcessOptions\relax
%    \end{macrocode}
% \subsection{Zeller's congruence}
% Actually, the equivalent congruence:\begin{align*}w &= \begin{cases}
% d + \floor{\frac{26}{10}\pp{m+1}} + y + \floor{\frac{y}{4}} + \floor{\frac{c}{4}} + 5c\mod 7 & \mbox{Gregorian calendar}\\
% d + \floor{\frac{26}{10}\pp{m+1}} + y + \floor{\frac{y}{4}} + 5 + 6c\mod 7 & \mbox{Julian calendar}
% \end{cases}\end{align*}is used instead of Zeller's, as claimed, to simplify the algorithm for the modulo operation.
%    \begin{macrocode}
\newcounter{euk@date}
\newcounter{euk@month}
\newcounter{euk@century}
\newcounter{euk@year}
\setcounter{euk@date}{\number\day}
\setcounter{euk@month}{\number\month}
\setcounter{euk@century}{\number\year}
\divide\c@euk@century by 100
\setcounter{euk@year}{\number\year}
\addtocounter{euk@year}{-\theeuk@century00}
\ifnum\number\theeuk@month<3
  \addtocounter{euk@month}{13}
  \addtocounter{euk@year}{-1}
\else
  \addtocounter{euk@month}{1}
\fi
\multiply\c@euk@month by 26
\divide\c@euk@month by 10
\addtocounter{euk@date}{\theeuk@month}
\addtocounter{euk@date}{\theeuk@year}
\divide\c@euk@year by 4
\addtocounter{euk@date}{\theeuk@year}
\if@euk@julian
  \addtocounter{euk@date}{6\theeuk@century}
  \addtocounter{euk@date}{5}
\else
  \addtocounter{euk@date}{5\theeuk@century}
  \divide\c@euk@century by 4
  \addtocounter{euk@date}{\theeuk@century}
\fi
%    \end{macrocode}
% The modulo operation.
%    \begin{macrocode}
\loop\ifnum6<\theeuk@date
  \addtocounter{euk@date}{-7}
\repeat
%    \end{macrocode}
% \subsection{Definitions}
% \begin{macro}{\weekday}
% Define |\weekday| to typeset the day of the week.
%    \begin{macrocode}
\newcommand\weekday{%
  \ifcase\theeuk@date Saturday\or Sunday\or Monday\or%
    Tuesday\or Wednesday\or Thursday\or Friday\fi}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\monthname}
% Define |\monthname| to typeset the month.
%    \begin{macrocode}
\newcommand\monthname{%
  \ifcase\number\month\or January\or February\or March\or%
    April\or May\or June\or July\or August\or%
    September\or October\or November\or December\fi}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\today}
% Redefine |\today|.
%    \begin{macrocode}
\def\today{%
  \if@euk@noweekday\else\weekday,\space\fi%
  \if@euk@usdate
    \monthname\space\number\day,%
  \else
    \number\day\space\monthname%
  \fi
  \space\number\year}
%    \end{macrocode}
% \end{macro}
% An `undocumented' feature.
%    \begin{macrocode}
\edef\euk@ordinal{%
   \ifcase\number\day\or st\or nd\or rd\or th\or th\or%
     th\or th\or th\or th\or th\or th\or th\or th\or th\or%
     th\or th\or th\or th\or th\or th\or st\or nd\or rd\or%
     th\or th\or th\or th\or th\or th\or th\or st\fi}
%    \end{macrocode}
% \Finale
\endinput