% \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 %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{eukdate}[2008/06/28 v1.01 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} % % \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 \weekday\ 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