% \iffalse
% +AMDG  This document was begun on 1 May 1202, the
% feast of St. Joseph the Worker, and it
% is humbly dedicated to him and to the Immaculate Heart of
% Mary for their prayers, and to the Sacred Heart of Jesus 
% for His mercy.
%
% This document is copyright 2018 by Donald P. Goodman, and is
% released publicly under the LaTeX Project Public License.  The
% distribution and modification of this work is constrained by the
% conditions of that license.  See
% 	http://www.latex-project.org/lppl.txt
% for the text of the license.  This document is released
% under version 1.3(c) of that license, and this work may be distributed
% or modified under the terms of that license or, at your option, any
% later version.
% 
% This work has the LPPL maintenance status 'maintained'.
% 
% The Current Maintainer of this work is Donald P. Goodman
% (dgoodmaniii@gmail.com).
% 
% This work consists of texdate.dtx, texdate.ins, and
% derived files texdate.sty and texdate.pdf.
% \fi

% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{texdate}[2018/12/08 v2.0 Print and manipulate dates in plain TeX]
%<*driver>
\documentclass{ltxdoc}

\usepackage{doc}
\usepackage{modulus}
\usepackage{multicol}
\usepackage{texdate}
\usepackage{fancyvrb}
\usepackage{fvrb-ex}
\usepackage{booktabs}
\usepackage[typeone]{dozenal}
\def\x{\noexpand{\TextOrMath{\protect\doz{{X}}}{\doz@X}}}%
\def\e{\noexpand{\TextOrMath{\protect\doz{{E}}}{\doz@E}}}%
\usepackage{longtable}
\usepackage{xellipsis}

\begin{document}
\DocInput{texdate.dtx}
\end{document}
%</driver> \fi
%
% \title{The |texdate| Package, v2.0}
% \author{Donald P.\ Goodman III}
% \date{\today}
%
% \maketitle
%
% \begin{abstract}
% \noindent
% \TeX\ and \LaTeX\ provide few facilities for dates by
% default, though many packages have filled this gap.
% |texdate| fills it, as well, with a pure \TeX-primitive
% implementation.  It can print dates, advance them by
% numbers of days, weeks, or months, determine the weekday
% automatically, and print them in (mostly) arbitrary
% format.  It can also print calendars (monthly and yearly)
% automatically, and can be easily localized for non-English
% languages.
% \end{abstract}
%
% \tableofcontents
%
% \section{Introduction:  The State of the \TeX}
% \label{sect:intro}
%
% \TeX\ by default contains very little facilities for
% dealing with dates, and \LaTeX\ follows suit.  As far as
% primitives go, \TeX\ just offers the counters |\day|,
% |\month|, and |\year|, which give the current values of
% those units of time; e.g., |\the\year-\the\month-\the\day|
% will yield ``\the\year-\the\month-\the\day'' (which is the
% date on which this document was compiled).  \LaTeX\ also
% has |\today|, which will produce the current date in the
% default American style:  ``\today''.  But that's
% really about all there is.
%
% Many packages have attempted to fill up this gap, some
% with excellent success; |datetime2| certain deserves
% special mention here, particularly as it goes beyond what
% |texdate| offers, given that |texdate| contains no
% facilities for \emph{times} at all.  |texdate| tries to fill the gap,
% as well; but it does it using only \TeX-primitives, in the
% hope that the solution will be (a) pretty fast, (b)
% pretty portable, and (c) not requiring the loading of
% massive packages, only a fraction of the capabilities of
% which will actually be used.
%
% For comparison, |datetime2| uses |pgfcalendar|, which of
% course requires |pgf|, which is a huge package.  Our
% modern computers make loading such packages often a
% negligible overhead; but with large and complex documents,
% it's not always trivial.  Also, it's an enjoyable
% challenge to write a usable package in \TeX\ for something
% for which \TeX\ was not designed; and some of us enjoy
% \emph{just knowing} that we're using a lean package, even
% it makes little practical difference.
%
% This document is numbered in \emph{dozenal}, or base
% twelve; numbering proceeds 1, 2, 3, 4, 5, 6, 7, 8, 9, \x,
% \e, 10, 11, 12\xelip  It uses the |dozenal| \LaTeX\
% package to do this.  For more information, see
% \url{http://www.dozenal.org}.
%
% \section{Dependencies}
% \label{sect:deps}
%
% |texdate| requires the |padcount|, |modulus|, and |iflang|
% packages internally, so be sure that they are installed.
% They are all available on CTAN and in the \TeX{}Live
% distribution.
%
% \section{Printing and Setting the Date}
% \label{sect:basic}
%
% |texdate| works with an \emph{internal date}, which is the
% current setting of all the date variables.  When
% initiated, the internal date is 1 January of the current
% year.  We can print that date with
% \DescribeMacro{\printdate}|\printdate|:
%
% \bigskip
% \hrule
% \begin{Example}
% \printdate
% \end{Example}
% \hrule
% \bigskip
%
% We can easily set the internal date to the current date by
% running the macro \DescribeMacro{\initcurrdate}|\initcurrdate|:
%
% \bigskip
% \hrule
% \begin{Example}
% \initcurrdate
% \printdate
% \end{Example}
% \hrule
% \bigskip
%
% (This is the current date at the time this document was
% compiled.)
%
% You can also easily \emph{set} the internal date, by
% running the \DescribeMacro{\initdate}|\initdate| macro:
%
% \begin{quote}
% \cmd{\initdate} \marg{year} \marg{month} \marg{day-of-month}
% \end{quote}
%
% The elements of the date must be supplied to |\initdate|
% in that order, or |texdate| will become confused.  It's
% obvious why; what should |texdate| do if the month is
% entered as |2019|?
%
% \bigskip
% \hrule
% \begin{Example}
% \initdate{2019}{6}{24}
% \printdate
% \end{Example}
% \hrule
% \bigskip
%
% While internally dates are kept as zero-indexed, these
% dates are received by |\initdate| as one-indexed; that is,
% |24| will mean the twenty-fourth, not the twenty-fifth,
% because we count starting at 1 rather than 0.
%
%
% \section{Date Formats}
% \label{sect:dateforms}
%
% The date format we've seen so far is the default, which is
% designed primarily to demonstrate several of the possible
% variables that can be in a date format.  Naturally, you'll
% want to change it; and it can be changed, almost
% arbitrarily, simply by redefining a command, or by using
% one of several presets.
%
% \subsection{Preset Formats}
% \label{sub:presetforms}
%
% |texdate| provides a number of preset formats that can be
% easily selected without having to design a format string
% (for which see Section \ref{sub:customforms}, on page
% \pageref{sub:customforms}).
%
% \DescribeMacro{\printfdate\{ISO\}}|\printfdate{ISO}|
% will print the current date in the default
% ISO 8601 format, which is \emph{|yyyymmdd|}.  In
% |texdate|'s formatting strings, this is |Ymd|; you'll
% learn more about these in Section \ref{sub:customforms}.
% There is also the ``ISO extended'' form, |Y-m-d|.
%
% \bigskip
% \hrule
% \begin{Example}
% \initdate{2019}{6}{24}
% \printfdate{ISO}
%
% \printfdate{ISOext}
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% For Americans fond of our curious customary format, you
% can use
% \DescribeMacro{\printfdate\{american\}}|\printfdate{american}|;
% in |texdate| format strings, this is |B\ d, Y|.  There is
% also
% \DescribeMacro{\printfdate\{shamerican\}}|\printfdate{shamerican}|,
% which is the abbreviated form, using slashes rather than
% hyphens.
%
% \bigskip
% \hrule
% \begin{Example}
% \initdate{2019}{6}{24}
% \printfdate{american}
%
% \printfdate{shamerican}
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% The British also have their own ways of writing dates,
% which correspond largely to the way the American military
% writes them (which are consequently sometimes called
% ``military dates,'' in the same way that twenty-four-hour
% time readings are sometimes called ``military time'').
% These are
% \DescribeMacro{\printfdate\{british\}}|\printfdate{british}|
% and 
% \DescribeMacro{\printfdate\{shbritish\}}|\printfdate{shbritish}|,
% along with alternate form 
% \DescribeMacro{\printfdate\{shbritishdots\}}|\printfdate{shbritishdots}|,
%
% \bigskip
% \hrule
% \begin{Example}
% \initdate{2019}{6}{24}
% \printfdate{british}
%
% \printfdate{shbritish}
%
% \printfdate{shbritishdots}
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% This is enough to cover the standards of most places in
% the world.  However, if you want something different, you
% can easily create it with format strings.
%
% \subsection{Custom Date Formats}
% \label{sub:customforms}
%
% All the custom formats described in Section
% \ref{sub:presetforms} and printed with |\printfdate| are
% created using the same general mechanism described in this
% section.  We will begin by discussing a way to generically
% change the presentation of all dates called with the basic
% |\printdate|, then move on to creating custom date formats
% that can be printed by name with |\printfdate|.
%
% The macro \DescribeMacro{\setdateformat}|\setdateformat|
% holds the formatting string for the date.  It's not
% \emph{completely} arbitrary, because none of the
% characters used to produce specific parts of the date can
% be used in the string itself; however, it's pretty
% flexible despite that limitation.
%
% The default date format string, quite unsuitable for real
% work, includes most of the possible control characters,
% and is |A{ }(a),\ B\ (b){ }d,\ Y|.  Note that spaces
% have to be preserved by either \emph{bracing} them or
% \emph{escaping} them; that is, to put a space in your
% format string, use either ``|\ |'' or ``|{ }|''.
%
% Table \ref{tab:lets} on page \pageref{tab:lets} shows
% the control characters, an
% explanation of their meaning, and an example of each.
% They assume the date 4 June 2019, selected by
% |\initdate{2019}{6}{4}|.
% \initdate{2019}{6}{4}
%
% \begin{table}[htp]
% \centering
% \begin{tabular}{lp{3in}l}
% \toprule
% \itshape Let. & \itshape Result & \itshape Ex. \\
% \midrule
% d & Numeric day of the month; 0-padded to two digits if
%		necessary & \printfdate{d} \\
% e & Numeric day of the month; space-padded to two spaces
%		if necessary & \printfdate{e} \\
% B & Full name of the month & \printfdate{B} \\
% b & Abbreviated name of the month & \printfdate{b} \\
% h & Abbreviated name of the month; same as |b| & \printfdate{h} \\
% m & Number of month, with January as 1; 0-padded to two
%		digits if necessary & \printfdate{m} \\
% A & Full name of the weekday & \printfdate{A} \\
% a & Abbreviated name of the weekday & \printfdate{a} \\
% w & Numeric value of weekday, with Sunday as 0 & \printfdate{w} \\
% u & ISO numeric value of weekday, with Monday as 1 and
%		Sunday as 7 & \printfdate{u} \\
% Y & Number of the current year & \printfdate{Y} \\
% j & Numeric day of the year, starting on a constant count
%		from 1 Jan; 0-padded to three digits if necessary & \printfdate{j} \\
% C & Century; essentially, the first two digits of the year &
%		\printfdate{C} \\
% y & The year, in only two digits & \printfdate{y} \\
% U & Week number of the year, starting at 0, with the week
%		starting on Sunday; 0-padded to two digits if
%		necessary & \printfdate{U} \\
% V & ISO week number of the year, starting at 1, with the week
%		starting on Monday; 0-padded to two digits if
%		necessary & \printfdate{V} \\
% W & Week number of the year, starting at 0, with the week
%		starting on Monday; 0-padded to two digits if necesary &
%		\printfdate{W} \\
% \bottomrule
% \end{tabular}
% \caption{Control codes for date formats}
% \label{tab:lets}
% \end{table}
%
% For folks not familiar with the \emph{control characters}
% concept, the essential idea is that you format some
% information with a certain ``string,'' called the ``format
% string.''  The format string contains some characters
% which are meaningless as far as formatting goes, and are
% passed through unchanged; and some characters which will
% be replaced with certain information.  In other words,
% assume that we have a format string consisting of the
% following characters:  |a b c d e|.  |c| is a control
% character, and represents the information ``zzz''; the other
% characters are not control characters.
%
% \begin{quote}
% |a b c d e| $\rightarrow$ a b zzz d e
% \end{quote}
%
% Anyone who has used GNU
% |date| or BSD |date| will recognize these control
% characters, though of course in those programs a |%|
% character would be necessary, as well.  |texdate|
% duplicates the behavior of these programs as closely as
% my \TeX-pertise allows.
%
% \bigskip
% \hrule
% \begin{Example}
% \initcurrdate
% \advancebyweeks{6}
% \def\setdateformat{d\ B\ Y}
% |d\ B\ Y|:  \printdate\par
% \def\setdateformat{Y-m-d}
% |Y-m-d|:  \printdate\par
% \def\setdateformat{a,\ d\ b\ Y}
% |a,\ d\ b\ Y|:  \printdate\par
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% We can meddle with this however we like, except that these
% control characters (the ones that turn into elements of
% the date) cannot be included literally.
%
% You can also define \emph{named date formats}:
% \DescribeMacro{\nameddateformat}
%
% \begin{quote}
% \cmd{\nameddateformat} \marg{name} \marg{format-string}
% \end{quote}
%
% Perhaps I want a peculiar date format, with the month,
% followed by the year, followed by the day of the month,
% followed by the day of the year in parentheses.  My format
% string should be |m-Y-d\ (j)|.  I'll then want to use the
% \DescribeMacro{\printfdate}|\printfdate| command with its single
% argument, which is the name of the date format I want to
% use.
%
% \bigskip
% \hrule
% \begin{Example}
% \initcurrdate
% \nameddateformat{weird}{m-Y-d\ (j)}
% \printfdate{weird}\par
% \printdate
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% It's worth nothing that all of the control characters also
% have a formatted print string that can be called by name.
% So one could duplicate the above |weird| date format the
% hard way, by using these each individually:
%
% \bigskip
% \hrule
% \begin{Example}
% \initcurrdate
% \printfdate{m}-\printfdate{Y}-\printfdate{d} (\printfdate{j})
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% These seems a bit convoluted, but perhaps you want to wrap
% it in a macro?
%
% \subsection{Number Format}
% \label{sub:numforms}
%
% Any command which will work on a \TeX\ count register can
% be inserted into the
% \DescribeMacro{\texdatenumformat}|\texdatenumformat|
% command, which will be applied to all the numbers which
% |texdate| outputs.  For example, if you are using the
% |dozenal| package:
%
% \bigskip
% \hrule
% \begin{Example}
% \def\texdatenumformat#1{\dozens{#1}}
% \initdate{2018}{12}{25}
% \printfdate{ISOext}
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
%
% \section{Manipulating Dates}
% \label{sect:manipdate}
%
% |texdate| goes well beyond merely printing and setting
% dates; you can manipulate them in many ways.  The original
% purpose of the package was to allow \LaTeX\ to print
% calendar sheets and things of that nature without
% resorting to an external program, or loading some enormous
% package, so it needed the ability to move forward and
% backward by given increments.  So we have that.
%
% \subsection{Moving Dates Forward and Backward}
% \label{sub:movedate}
%
% You can advance the date by a certain number of days,
% weeks, or months.  The macros are named, unsurprisingly,
% \DescribeMacro{\advancebydays}|\advancebydays|,
% \DescribeMacro{\advancebyweeks}|\advancebyweeks|, and
% \DescribeMacro{\advancebymonths}|\advancebymonths|, each
% of which takes one argument, which is the number of that
% unit you wish to advance the date by.  The corresponding
% commands \DescribeMacro{\regressbydays}|\regressbydays|,
% \DescribeMacro{\regressbyweeks}|\regressbyweeks|, and
% \DescribeMacro{\regressbymonths}|\regressbymonths| also
% exist.
%
% \bigskip
% \hrule
% \begin{Example}
% \initcurrdate
% Current date:  \printdate\par
% \advancebydays{8}
% 8 days later:  \printdate\par
% \advancebyweeks{4}
% 4 weeks later:  \printdate\par
% \advancebymonths{4}
% 4 months later:  \printdate\par
% \regressbydays{14}
% 14 days earlier:  \printdate\par
% \regressbyweeks{8}
% 8 weeks earlier:  \printdate\par
% \regressbymonths{2}
% 2 months earlier:  \printdate\par
% \end{Example}
% \nobreak\medskip\nobreak
% \hrule
% \bigskip
%
% Note that |\advancebymonths| does not validate the date,
% so it's possible that you'll end up with something
% impossible, such as 31 September.  It's best to watch the
% results of this one carefully.
%
% Both the |\advanceby|s and the |\regressby|s should be
% given positive numbers; negative numbers will just confuse
% them.
%
% \subsection{Saving and Restoring Dates}
% \label{sub:savedate}
%
% Sometimes you may wish to save a date, change the internal
% date, use that internal date for a while, then restore the
% old date.  |texdate| makes it possible to save and use as
% many dates as you want (or, at any rate, as many as \TeX\
% will tolerate).
%
% \DescribeMacro{\savedate}|\savedate| takes a single
% argument, the \emph{name} you'd like to give your saved
% date.  This can be anything that \TeX\ allows in a control
% sequence; best to stick with normal, seven-bit ASCII
% letters.  You then access the saved date with
% \DescribeMacro{\restoredate}|\restoredate|, which takes
% that same name as its argument.
%
% \bigskip
% \hrule
% \begin{Example}
% \initcurrdate
% \printdate\par
% \savedate{current}
% \advancebyweeks{12}
% \printdate\par
% \savedate{advanced}
% \restoredate{current}
% \printdate\par
% \advancebydays{3}
% \printdate\par
% \restoredate{advanced}
% \printdate\par
% \restoredate{current}
% \printdate\par
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% You can also retrieve your saved date directly; rather
% than calling |\restoredate|, you can call
% |\savedate<name>|, without the angle brackets.  That's the
% name that |texdate| uses internally, and calls with
% |\restoredate| to get your information back.
%
%
% \section{Convenience Macros}
% \label{sect:convmacs}
%
% |texdate| offers a few macros for tasks which its author
% anticipates will likely be common.  For example, to
% produce a small monthly calendar, consider using the
% |\texdcal| macro, which takes two arguments:  the year and
% the month of the calendar you're seeking to create:
%
% \bigskip
% \hrule
% \begin{Example}
% \begin{center}
% \begin{tabular}{cc}
% \texdcal{2018}{5} &
% \texdcal{2018}{6} \\
% \texdcal{2018}{8} &
% \texdcal{2018}{9} \\
% \end{tabular}
% \end{center}
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% Notice that |\texdcal| does the right thing when there a
% month goes into an extra week:  it simply prints another
% week.  It also correctly refuses to print the days of a
% week which do not belong to the requested month.
%
% \DescribeMacro{\texdcalyear}|\texdcalyear| will produce
% one of these calendars for an entire year, in three
% columns; the year chosen is the argument given to the
% macro.  Because the margins of the \LaTeX\ standard
% classes are much too large (or rather, the paper sizes are
% much too large; the text blocks are rather nicely
% proportioned), |\texdcalyear| prints this calendar in a
% small size, with very small space between columns.
%
% \bigskip
% \hrule
% \begin{Example}
% \footnotesize%
% \begin{center}
% \texdcalyear{2018}
% \end{center}
% \end{Example}
% \medskip
% \hrule
% \bigskip
%
% Obviously, it uses |\texdcal| internally to do this, so
% the definition of |\texdcalyear| is much simpler than that
% of |\texdcal|.
%
% Just as obviously, these yearly calendars
% could easily be formatted in many different ways; so many,
% in fact, that attempting to make the macros flexible
% enough for meaningful customization would be prohibitively
% difficult.  More fruitful results can be obtained by
% reading the macros themselves (they are truly not very
% difficult) and customizing them oneself.
%
% \section{Language Specification}
% \label{sect:lang}
%
% |texdate| does understand \LaTeX\ language specifications,
% using Heiko Oberdiek's |iflang| package, which should work
% for both |babel| and |polyglossia|.  Built-in are
% only English (the default), Spanish, French, and German.
% However, it's pretty simple to customize the
% month name and weekday name strings by defining a few
% commands, so if you need a different language, you just
% need to redefine a few strings.
%
% Each string begins with the prefix |\texd@|, then the
% English ordinal string for the order in which it comes,
% with January being the first month and Sunday being the
% first weekday; e.g., |\texd@first|.  Then comes |sh| if
% it's an abbreviation; e.g., |\texd@firstsh|.  Finally
% comes the string |mon| if it's a month, or |name| if
% it's a weekday name.  Below is the complete list, for
% German.
%
% \begin{quote}
% |\makeatletter|\\
% |\def\texd@firstmon{Januar}|\\
% |\def\texd@firstshmon{Jan}|\\
% |\def\texd@secondmon{Februar}|\\
% |\def\texd@secondshmon{Feb}|\\
% |\def\texd@thirdmon{März}|\\
% |\def\texd@thirdshmon{März}|\\
% |\def\texd@fourthmon{April}|\\
% |\def\texd@fourthshmon{Apr}|\\
% |\def\texd@fifthmon{Mai}|\\
% |\def\texd@fifthshmon{Mai}|\\
% |\def\texd@sixthmon{Juni}|\\
% |\def\texd@sixthshmon{Juni}|\\
% |\def\texd@seventhmon{Juli}|\\
% |\def\texd@seventhshmon{Juli}|\\
% |\def\texd@eighthmon{August}|\\
% |\def\texd@eighthshmon{Aug}|\\
% |\def\texd@ninthmon{September}|\\
% |\def\texd@ninthshmon{Sept}|\\
% |\def\texd@tenthmon{Oktober}|\\
% |\def\texd@tenthshmon{Okt}|\\
% |\def\texd@eleventhmon{November}|\\
% |\def\texd@eleventhshmon{Nov}|\\
% |\def\texd@twelfthmon{Dezember}|\\
% |\def\texd@twelfthshmon{Dez}|\\
% |\def\texd@firstdayname{Sonntag}|\\
% |\def\texd@firstdayshname{So}|\\
% |\def\texd@seconddayname{Montag}|\\
% |\def\texd@seconddayshname{Mo}|\\
% |\def\texd@thirddayname{Dienstag}|\\
% |\def\texd@thirddayshname{Di}|\\
% |\def\texd@fourthdayname{Mittwoch}|\\
% |\def\texd@fourthdayshname{Mi}|\\
% |\def\texd@fifthdayname{Donnerstag}|\\
% |\def\texd@fifthdayshname{Do}|\\
% |\def\texd@sixthdayname{Freitag}|\\
% |\def\texd@sixthdayshname{Fr}|\\
% |\def\texd@seventhdayname{Samstag}|\\
% |\def\texd@seventhdayshname{Sa}|\\
% |\makeatother|
% \end{quote}
%
% Doing something like this for your desired language,
% \emph{after} you've loaded |texdate|, will localize all
% the strings involved.
%
% \section{Plain \TeX\ Usage}
%
% I was asked recently, quite unexpectedly, whether
% |texdate| could be used with plain \TeX.  My initial
% thought was an obvious ``yes,'' since it's implemented
% entirely with \TeX\ primitives; however, the matter wasn't
% quite that simple.  The package file does use some
% \LaTeX-specific macros, all related to the packaging
% itself; and it uses a |padcount| macro which doesn't work
% with plain \TeX.  Also, according to \LaTeX\ convention,
% it uses |@| as a letter in control sequences willy-nilly,
% and \TeX\ balks at such craziness.  Finally, a small
% change in the code (due to deep \TeX\ magic involving
% |\outer| that is best left unspoken) needed to be made.
% This done, however, the package \emph{can} (mostly) be
% used in plain \TeX.  Here's how.
%
% The following must be included in your document in order
% to prevent \TeX\ from choking on our \LaTeX\ packaging
% macros:
%
% \begin{quote}
% |\def\NeedsTeXFormat#1[#2]{}|\\
% |\def\ProvidesPackage#1[#2]{}|\\
% |\def\RequirePackage#1{}|\\
% |\def\AtBeginDocument#1{}|\\
% \end{quote}
%
% This simply defines these macros to do nothing, which is
% how \TeX\ prefers packaging macros to work.  Then, you
% need to tell \TeX\ that |@| can, in fact, be part of the
% name of a control sequence:
%
% \begin{quote}
% |\catcode`@=11|
% \end{quote}
%
% This, again, is some deep \TeX\ magic best left
% undiscussed for the benefit of those not interested.
% There's plenty of information around if you really want
% it.  Finally, we need to input the packages that |texdate|
% needs, and tell \TeX\ not to use the
% |padcount| macro that it doesn't like, by redefining it to
% simply spit out its own parameter:
%
% \begin{quote}
% |\input modulus.sty|\\
% |\input padcount.sty|\\
% |\input texdate.sty|\\
% |\def\padnum#1{#1}|\\
% \end{quote}
%
% These things done, |texdate| will work almost entirely
% with plain \TeX, except that (obviously) the padding
% options won't have any effect.  So, if plain \TeX\ is your
% preference, go for it.
% 
%
% \section{Implementation}
%
%    \begin{macrocode}
\RequirePackage{modulus}%
\RequirePackage{padcount}%
\RequirePackage{iflang}%
\newcount\texd@loopi\texd@loopi=0%
\newcount\texd@mon\texd@mon=0%
\newcount\texd@dow\texd@dow=0%
\newcount\texd@dom\texd@dom=0%
\newcount\texd@yr\texd@yr=\year%
\newcount\texd@rdom\texd@rdom=\texd@dom\advance\texd@rdom by1%
\newcount\texd@rmon%
%% taken from dayofweek.tex, by Martin Minow of DEC;
%% included in TeXLive
\newcount\texd@dow% Gets day of the week
\newcount\texd@leap% Leap year fingaler
\newcount\texd@x% Temp register
\newcount\texd@y% Another temp register
\def\texd@nextdow#1#2#3{%
	\global\texd@leap=#2%
	\global\advance\texd@leap by-14%
	\global\divide\texd@leap by12%
	\global\advance\texd@leap by#3%
	\global\texd@dow=#2%
	\global\advance\texd@dow by10%
	\global\texd@y=\texd@dow%
	\global\divide\texd@y by13%
	\global\multiply\texd@y by12%
	\global\advance\texd@dow by-\texd@y%
	\global\multiply\texd@dow by13%
	\global\advance\texd@dow by-1%
	\global\divide\texd@dow by5%
	\global\advance\texd@dow by#1%
	\global\advance\texd@dow by77%
	\global\texd@x=\texd@leap%
	\global\texd@y=\texd@x%
	\global\divide\texd@y by100%
	\global\multiply\texd@y by100%
	\global\advance\texd@x by-\texd@y%
	\global\multiply\texd@x by5%
	\global\divide\texd@x by4%
	\global\advance\texd@dow by\texd@x%
	\global\texd@x=\texd@leap%
	\global\divide\texd@x by400%
	\global\advance\texd@dow by\texd@x%
	\global\texd@x=\texd@leap%
	\global\divide\texd@x by100%
	\global\multiply\texd@x by2%
	\global\advance\texd@dow by-\texd@x%
	\global\texd@x=\texd@dow%
	\global\divide\texd@x by7%
	\global\multiply\texd@x by7%
	\global\advance\texd@dow by-\texd@x%
}
%% end taken from dayofweek.tex, by Martin Minow of DEC;
%% included in TeXLive
\def\texd@leapyear{%
}%
\def\texd@downame{%
  \ifcase\texd@dow
		\texd@firstdayname%
	\or%
		\texd@seconddayname%
	\or%
		\texd@thirddayname%
	\or%
		\texd@fourthdayname%
	\or%
		\texd@fifthdayname%
	\or%
		\texd@sixthdayname%
	\or%
		\texd@seventhdayname%
	\fi%
}%
\def\texd@shdowname{%
  \ifcase\texd@dow
		\texd@firstdayshname%
	\or%
		\texd@seconddayshname%
	\or%
		\texd@thirddayshname%
	\or%
		\texd@fourthdayshname%
	\or%
		\texd@fifthdayshname%
	\or%
		\texd@sixthdayshname%
	\or%
		\texd@seventhdayshname%
	\fi%
}%
\def\texd@nextmonth{%
	\ifnum\texd@mon<11\global\advance\texd@mon by1\fi%
	\ifnum\texd@mon=11\global\texd@mon=0\fi%
}%
\def\texd@lastmonth{%
	\ifnum\texd@mon=0%
		\global\texd@mon=11%
		\global\advance\texd@yr by-1%
	\fi%
	\ifnum\texd@mon>0\global\advance\texd@mon by-1\fi%
}%
\def\texd@nextdate{%
	\ifnum\texd@mon=11%
		\ifnum\texd@dom=30%
			\global\advance\texd@yr by1%
			\global\texd@mon=0%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<30%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=10%
		\ifnum\texd@dom=29%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<29%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=9%
		\ifnum\texd@dom=30%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<30%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=8%
		\ifnum\texd@dom=29%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<29%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=7%
		\ifnum\texd@dom=30%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<30%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=6%
		\ifnum\texd@dom=30%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<30%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=5%
		\ifnum\texd@dom=29%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<29%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=4%
		\ifnum\texd@dom=30%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<30%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=3%
		\ifnum\texd@dom=29%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<29%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=2%
		\ifnum\texd@dom=30%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi
		\ifnum\texd@dom<30%
			\global\advance\texd@dom by1%
		\fi%
	\else\ifnum\texd@mon=1%
		\ifnum\texd@leapyear=0%
			\ifnum\texd@dom=27%
				\global\advance\texd@mon by1%
				\global\texd@dom=0%
			\fi
			\ifnum\texd@dom<27%
				\global\advance\texd@dom by1%
			\fi%
		\else\ifnum\texd@leapyear=1%
			\ifnum\texd@dom=28%
				\global\advance\texd@mon by1%
				\global\texd@dom=0%
			\fi%
			\ifnum\texd@dom<28%
				\global\advance\texd@dom by1%
			\fi%
		\fi\fi%
	\else\ifnum\texd@mon=0%
		\ifnum\texd@dom=30%
			\global\advance\texd@mon by1%%
			\global\texd@dom=0%
		\fi%
		\ifnum\texd@dom<30%
			\global\advance\texd@dom by1%
		\fi%
	\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi%
	\global\texd@rdom=\texd@dom\global\advance\texd@rdom by1%
	\global\texd@rmon=\texd@mon\global\advance\texd@rmon by1%
	\texd@setjnum%
	\texd@nextdow{\the\texd@rdom}{\the\texd@rmon}{\the\texd@yr}%
}%
\def\texd@lastdate{%
	\global\advance\texd@dom by-1%
	\ifnum\texd@dom=0%
		\global\advance\texd@mon by-1%
		\ifnum\texd@mon=11%
			\global\texd@dom=30%
		\fi%
		\ifnum\texd@mon=0%
			\global\texd@mon=11%
			\global\advance\texd@yr by-1%
			\global\texd@dom=30%
		\fi%
		\ifnum\texd@mon=10%
			\global\texd@dom=29%
		\fi%
		\ifnum\texd@mon=9%
			\global\texd@dom=30%
		\fi%
		\ifnum\texd@mon=8%
			\global\texd@dom=29%
		\fi%
		\ifnum\texd@mon=7%
			\global\texd@dom=30%
		\fi%
		\ifnum\texd@mon=6%
			\global\texd@dom=30%
		\fi%
		\ifnum\texd@mon=5%
			\global\texd@dom=29%
		\fi%
		\ifnum\texd@mon=4%
			\global\texd@dom=30%
		\fi%
		\ifnum\texd@mon=3%
			\global\texd@dom=29%
		\fi%
		\ifnum\texd@mon=2%
			\global\texd@dom=30%
		\fi%
		\ifnum\texd@mon=1%
			\ifnum\texd@leapyear=0%
				\global\texd@dom=27%
			\else\ifnum\texd@leapyear=1%
				\global\texd@dom=28%
			\fi\fi%
		\fi%
		\ifnum\texd@mon=0%
			\global\texd@dom=30%
		\fi%
	\fi%
	\global\texd@rdom=\texd@dom\global\advance\texd@rdom by1%
	\global\texd@rmon=\texd@mon\global\advance\texd@rmon by1%
	\texd@setjnum%
	\texd@nextdow{\the\texd@rdom}{\the\texd@rmon}{\the\texd@yr}%
}%
\def\texd@setrdom{\global\texd@rdom=\texd@dom\global\advance\texd@rdom by1}%
\def\texd@setrmon{\global\texd@rmon=\texd@mon\global\advance\texd@rmon by1}%
%    \end{macrocode}
% We have to deal with leap years somehow.  We have the
% counter |\texd@leapyear|, which is 0 if it's not a leap
% year and 1 if it is.  Then we have |\texd@isleapyear|,
% which sets the counter appropriately.
%    \begin{macrocode}
\newcount\texd@leapyear\texd@leapyear=0%
\def\texd@isleapyear{%
	\global\texd@leapyear=0%
	\modulo{\texd@yr}{4}%
	\ifnum\remainder=0%
		\modulo{\texd@yr}{100}%
		\ifnum\remainder=0%
			\global\texd@leapyear=0%
		\fi\ifnum\remainder>0%
			\global\texd@leapyear=1%
		\fi%
	\fi%
}%
%    \end{macrocode}
% Print the month names.
%    \begin{macrocode}
\def\texd@monthname{%
	\ifnum\texd@mon=0%
		\texd@firstmon%
	\fi%
	\ifnum\texd@mon=1%
		\texd@secondmon%
	\fi%
	\ifnum\texd@mon=2%
		\texd@thirdmon%
	\fi%
	\ifnum\texd@mon=3%
		\texd@fourthmon%
	\fi%
	\ifnum\texd@mon=4%
		\texd@fifthmon%
	\fi%
	\ifnum\texd@mon=5%
		\texd@sixthmon%
	\fi%
	\ifnum\texd@mon=6%
		\texd@seventhmon%
	\fi%
	\ifnum\texd@mon=7%
		\texd@eighthmon%
	\fi%
	\ifnum\texd@mon=8%
		\texd@ninthmon%
	\fi%
	\ifnum\texd@mon=9%
		\texd@tenthmon%
	\fi%
	\ifnum\texd@mon=10%
		\texd@eleventhmon%
	\fi%
	\ifnum\texd@mon=11%
		\texd@twelfthmon%
	\fi%
}%
\def\texd@shmonthname{%
	\ifnum\texd@mon=0%
		\texd@firstshmon%
	\fi%
	\ifnum\texd@mon=1%
		\texd@secondshmon%
	\fi%
	\ifnum\texd@mon=2%
		\texd@thirdshmon%
	\fi%
	\ifnum\texd@mon=3%
		\texd@fourthshmon%
	\fi%
	\ifnum\texd@mon=4%
		\texd@fifthshmon%
	\fi%
	\ifnum\texd@mon=5%
		\texd@sixthshmon%
	\fi%
	\ifnum\texd@mon=6%
		\texd@seventhshmon%
	\fi%
	\ifnum\texd@mon=7%
		\texd@eighthshmon%
	\fi%
	\ifnum\texd@mon=8%
		\texd@ninthshmon%
	\fi%
	\ifnum\texd@mon=9%
		\texd@tenthshmon%
	\fi%
	\ifnum\texd@mon=10%
		\texd@eleventhshmon%
	\fi%
	\ifnum\texd@mon=11%
		\texd@twelfthshmon%
	\fi%
}%
%    \end{macrocode}
% Here we define the |\advanceby|s, so that you can add move
% the internal date forward by a given number of units.  Does
% \emph{not} print the date.
%    \begin{macrocode}
\def\advancebydays#1{%
	\texd@loopi=0%
	\loop%
		\ifnum\texd@loopi<#1%
			\texd@nextdate%
			\advance\texd@loopi by1%
	\repeat%
}%
\def\regressbydays#1{%
	\texd@loopi=0%
	\loop%
		\ifnum\texd@loopi<#1%
			\texd@lastdate%
			\advance\texd@loopi by1%
	\repeat%
}%
\newcount\texd@loopj%
\def\advancebyweeks#1{%
	\texd@loopi=0%
	\texd@loopj=#1%
	\multiply\texd@loopj by7%
	\loop%
		\ifnum\texd@loopi<\texd@loopj%
			\texd@nextdate%
			\advance\texd@loopi by1%
	\repeat%
}%
\def\regressbyweeks#1{%
	\texd@loopi=0%
	\texd@loopj=#1%
	\multiply\texd@loopj by7%
	\loop%
		\ifnum\texd@loopi<\texd@loopj%
			\texd@lastdate%
			\advance\texd@loopi by1%
	\repeat%
}%
\def\advancebymonths#1{%
	\texd@loopi=0%
	\loop%
		\ifnum\texd@loopi<#1%
			\texd@nextmonth%
			\advance\texd@loopi by1%
	\repeat%
	\texd@setrmon%
	\initdate{\the\texd@yr}{\the\texd@rmon}{\the\texd@rdom}%
}%
\def\regressbymonths#1{%
	\texd@loopi=0%
	\loop%
		\ifnum\texd@loopi<#1%
			\texd@lastmonth%
			\advance\texd@loopi by1%
	\repeat%
	\texd@setrmon%
	\initdate{\the\texd@yr}{\the\texd@rmon}{\the\texd@rdom}%
}%
%    \end{macrocode}
% Print the date, either with the default format or a named
% format.
%    \begin{macrocode}
\def\printdate{%
	\texd@dateformat%
}%
\def\printfdate#1{%
	\texd@formatdateformat{#1}%
}%
%    \end{macrocode}
% This defines the date format.  We need some helper macros
% to flip through each character one at a time.
%    \begin{macrocode}
\def\texd@expandloop#1{%
	\texd@xloop#1\relax
}
\def\texdatenumformat#1{#1}
\def\texd@xloop#1{%
	\ifx\relax#1%
	\else%
		\ifx#1d%
			\setpadnum{2}\setpadchar{0}%
			\padnum{\texdatenumformat{\the\texd@rdom}}%
		\else\ifx#1e%
			\setpadnum{2}\setpadchar{\hskip1ex}%
			\padnum{\texdatenumformat{\the\texd@rdom}}%
		\else\ifx#1a%
			\texd@shdowname%
		\else\ifx#1A%
			\texd@downame%
		\else\ifx#1b%
			\texd@shmonthname%
		\else\ifx#1h%
			\texd@shmonthname%
		\else\ifx#1B%
			\texd@monthname%
		\else\ifx#1w%
			\the\texd@dow%
		\else\ifx#1u%
			\ifnum\texd@dow>0\leavevmode\texdatenumformat{\the\texd@dow}\fi%
			\ifnum\texd@dow=0 7\fi%
		\else\ifx#1Y%
			\setpadnum{2}\setpadchar{0}%
			\padnum{\texdatenumformat{\the\texd@yr}}%
		\else\ifx#1m%
			\texd@setrmon%
			\setpadnum{2}\setpadchar{0}%
			\leavevmode\padnum{\texdatenumformat{\the\texd@rmon}}%
		\else\ifx#1j%
			\texd@setjnum%
			\setpadnum{3}\setpadchar{0}%
			\leavevmode\padnum{\texdatenumformat{\the\texd@jnum}}%
		\else\ifx#1C%
			\quotient{\texd@yr}{100}%
			\leavevmode\texdatenumformat{\the\intquotient}%
		\else\ifx#1y%
			\modulo{\texd@yr}{100}%
			\leavevmode\texdatenumformat{\the\remainder}%
		\else\ifx#1U%
			\quotient{\texd@jnum}{7}
			\setpadnum{2}\setpadchar{0}%
			\leavevmode\padnum{\texdatenumformat{\the\intquotient}}%
		\else\ifx#1V%
			\quotient{\texd@jnum}{7}
			\ifnum\texd@dow>0\advance\intquotient by1\fi%
			\setpadnum{2}\setpadchar{0}%
			\leavevmode\padnum{\texdatenumformat{\the\intquotient}}%
		\else\ifx#1W%
			\quotient{\texd@jnum}{7}
			\ifnum\texd@dow=0\advance\intquotient by-1\fi%
			\setpadnum{2}\setpadchar{0}%
			\leavevmode\padnum{\texdatenumformat{\the\intquotient}}%
		\else%
			#1%
		\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi%
		\expandafter\texd@xloop%
	\fi%
}%
\def\texd@dateformat{%
	\expandafter\expandafter\texd@expandloop{\setdateformat}%
}%
\def\texd@formatdateformat#1{%
	\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\texd@expandloop{\csname texd@df#1\endcsname}%
}%
\def\setdateformat{A{ }(a),\ B\ (b){ }d,\ Y}
\def\nameddateformat#1#2{%
	\expandafter\def\csname texd@df#1\endcsname{#2}%
}%
\nameddateformat{american}{B\ d,\ Y}
\nameddateformat{shamerican}{m/d/Y}
\nameddateformat{ISO}{Ymd}
\nameddateformat{ISOext}{Y-m-d}
\nameddateformat{shbritish}{d/m/Y}
\nameddateformat{shbritishdots}{d.m.Y}
\nameddateformat{british}{d\ B\ Y}
\nameddateformat{d}{d}
\nameddateformat{e}{e}
\nameddateformat{B}{B}
\nameddateformat{b}{b}
\nameddateformat{h}{h}
\nameddateformat{m}{m}
\nameddateformat{A}{A}
\nameddateformat{a}{a}
\nameddateformat{w}{w}
\nameddateformat{u}{u}
\nameddateformat{Y}{Y}
\nameddateformat{j}{j}
\nameddateformat{C}{C}
\nameddateformat{y}{y}
\nameddateformat{U}{U}
\nameddateformat{V}{V}
\nameddateformat{W}{W}
%    \end{macrocode}
% Initialize the date to the current date, or to an
% arbitrary date, entered in the order year, month, and day
% of month.
%    \begin{macrocode}
\def\initcurrdate{%
	\global\texd@mon=\month%
	\global\advance\texd@mon by-1%
	\global\texd@dom=\day%
	\global\advance\texd@dom by-1%
	\global\texd@yr=\year%
	\texd@isleapyear%
	\texd@setrdom%
	\texd@setrmon%
	\texd@setjnum%
	\texd@nextdow{\the\texd@rdom}{\the\texd@rmon}{\the\texd@yr}%
}%
\def\initdate#1#2#3{%
	\global\texd@yr=#1%
	\global\texd@mon=#2%
	\global\advance\texd@mon by-1%
	\global\texd@dom=#3%
	\global\advance\texd@dom by-1%
	\global\texd@setrdom%
	\global\texd@setrmon%
	\texd@setjnum%
	\texd@isleapyear%
	\texd@nextdow{\the\texd@rdom}{\the\texd@rmon}{\the\texd@yr}%
}%
%    \end{macrocode}
% Now we define the macros for saving and restoring dates.
%    \begin{macrocode}
\def\savedate#1{%
	\expandafter\edef\csname savedate#1\endcsname{\initdate{\the\texd@yr}{\the\texd@rmon}{\the\texd@rdom}}%
}%
\def\restoredate#1{%
	\csname savedate#1\endcsname%
}%
%    \end{macrocode}
% Convenience macros.  First, |\texdcal|.
%    \begin{macrocode}
\newcount\texd@looptmp\texd@looptmp=0%
\def\texdcal#1#2{%
	\global\texd@mon=#2%
	\global\advance\texd@mon by-1%
	\global\texd@yr=#1%
	\global\texd@dom=0%
	\texd@setrmon\texd@setrdom%
	\initdate{\the\texd@yr}{\the\texd@rmon}{\the\texd@rdom}%
	\def\setdateformat{B\ Y}%
	\begin{tabular}{rrrrrrr}
		\multicolumn{7}{c}{\printdate} \\
		\loop\ifnum\texd@dow>0\texd@lastdate\repeat%
		\def\setdateformat{d}%
			\ifnum\texd@dom>8 {} \fi\ifnum\texd@dom<8\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom>8 {} \fi\ifnum\texd@dom<8\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom>8 {} \fi\ifnum\texd@dom<8\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom>8 {} \fi\ifnum\texd@dom<8\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom>8 {} \fi\ifnum\texd@dom<8\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom>8 {} \fi\ifnum\texd@dom<8\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom>8 {} \fi\ifnum\texd@dom<8\leavevmode\printdate\fi\\
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate \\
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate \\
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate &
		\def\setdateformat{d}\advancebydays{1}\printdate \\
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi\\
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi&
		\def\setdateformat{d}\advancebydays{1}%
			\ifnum\texd@dom<14 {} \fi\ifnum\texd@dom>14\leavevmode\printdate\fi\\
	\end{tabular}
}%
\def\texdcalyear#1{%
	\texd@yr=#1%
	\texd@mon=0%
	\texd@dom=0%
	\texd@setrmon%
	\texd@setrdom%
	{\tabcolsep=3pt%
	\begin{tabular}{ccc}
		\texdcal{#1}{1} & \texdcal{#1}{2} & \texdcal{#1}{3} \\
		\texdcal{#1}{4} & \texdcal{#1}{5} & \texdcal{#1}{6} \\
		\texdcal{#1}{7} & \texdcal{#1}{8} & \texdcal{#1}{9} \\
		\texdcal{#1}{10} & \texdcal{#1}{11} & \texdcal{#1}{12} \\
	\end{tabular}
	}%
}%
%    \end{macrocode}
% Calculate the day of the year (|%j|).
%    \begin{macrocode}
\newcount\texd@jnum\texd@jnum=0%
\def\texd@setjnum{%
	\texd@jnum=0%
	\ifnum\texd@mon>0\global\advance\texd@jnum by31\fi%
	\ifnum\texd@mon>1%
		\global\advance\texd@jnum by28%
	\fi%
	\ifnum\texd@mon>2\global\advance\texd@jnum by31\fi%
	\ifnum\texd@mon>3\global\advance\texd@jnum by30\fi%
	\ifnum\texd@mon>4\global\advance\texd@jnum by31\fi%
	\ifnum\texd@mon>5\global\advance\texd@jnum by30\fi%
	\ifnum\texd@mon>6\global\advance\texd@jnum by31\fi%
	\ifnum\texd@mon>7\global\advance\texd@jnum by31\fi%
	\ifnum\texd@mon>8\global\advance\texd@jnum by30\fi%
	\ifnum\texd@mon>9\global\advance\texd@jnum by31\fi%
	\ifnum\texd@mon>10\global\advance\texd@jnum by30\fi%
	\global\advance\texd@jnum by\the\texd@dom%
	\global\advance\texd@jnum by1%
}%
%    \end{macrocode}
% Language strings.  I've only got English here right now, but
% additiona languages would be trivial to add, either in a
% particular document, or in a separate package.
%    \begin{macrocode}
\def\texd@firstmon{January}%
\def\texd@firstshmon{Jan}%
\def\texd@secondmon{February}%
\def\texd@secondshmon{Feb}%
\def\texd@thirdmon{March}%
\def\texd@thirdshmon{Mar}%
\def\texd@fourthmon{April}%
\def\texd@fourthshmon{Apr}%
\def\texd@fifthmon{May}%
\def\texd@fifthshmon{May}%
\def\texd@sixthmon{June}%
\def\texd@sixthshmon{Jun}%
\def\texd@seventhmon{July}%
\def\texd@seventhshmon{Jul}%
\def\texd@eighthmon{August}%
\def\texd@eighthshmon{Aug}%
\def\texd@ninthmon{September}%
\def\texd@ninthshmon{Sep}%
\def\texd@tenthmon{October}%
\def\texd@tenthshmon{Oct}%
\def\texd@eleventhmon{November}%
\def\texd@eleventhshmon{Nov}%
\def\texd@twelfthmon{December}%
\def\texd@twelfthshmon{Dec}%
\def\texd@firstdayname{Sunday}%
\def\texd@firstdayshname{Sun}%
\def\texd@seconddayname{Monday}%
\def\texd@seconddayshname{Mon}%
\def\texd@thirddayname{Tuesday}%
\def\texd@thirddayshname{Tue}%
\def\texd@fourthdayname{Wednesday}%
\def\texd@fourthdayshname{Wed}%
\def\texd@fifthdayname{Thursday}%
\def\texd@fifthdayshname{Thu}%
\def\texd@sixthdayname{Friday}%
\def\texd@sixthdayshname{Fri}%
\def\texd@seventhdayname{Saturday}%
\def\texd@seventhdayshname{Sat}%
\AtBeginDocument{%
	\IfLanguageName{spanish}{%
		\def\texd@firstmon{enero}%
		\def\texd@firstshmon{ene}%
		\def\texd@secondmon{febrero}%
		\def\texd@secondshmon{feb}%
		\def\texd@thirdmon{marzo}%
		\def\texd@thirdshmon{mar}%
		\def\texd@fourthmon{abril}%
		\def\texd@fourthshmon{abr}%
		\def\texd@fifthmon{mayo}%
		\def\texd@fifthshmon{may}%
		\def\texd@sixthmon{junio}%
		\def\texd@sixthshmon{jun}%
		\def\texd@seventhmon{julio}%
		\def\texd@seventhshmon{jul}%
		\def\texd@eighthmon{agosto}%
		\def\texd@eighthshmon{ago}%
		\def\texd@ninthmon{septiembre}%
		\def\texd@ninthshmon{sep}%
		\def\texd@tenthmon{octubre}%
		\def\texd@tenthshmon{oct}%
		\def\texd@eleventhmon{noviembre}%
		\def\texd@eleventhshmon{nov}%
		\def\texd@twelfthmon{diciembre}%
		\def\texd@twelfthshmon{dic}%
		\def\texd@firstdayname{domingo}%
		\def\texd@firstdayshname{dom}%
		\def\texd@seconddayname{lunes}%
		\def\texd@seconddayshname{lun}%
		\def\texd@thirddayname{martes}%
		\def\texd@thirddayshname{mar}%
		\def\texd@fourthdayname{miercoles}%
		\def\texd@fourthdayshname{mie}%
		\def\texd@fifthdayname{jueves}%
		\def\texd@fifthdayshname{jue}%
		\def\texd@sixthdayname{viernes}%
		\def\texd@sixthdayshname{vie}%
		\def\texd@seventhdayname{sabado}%
		\def\texd@seventhdayshname{sab}%
	}{}%
	\IfLanguageName{french}{%
		\def\texd@firstmon{janvier}%
		\def\texd@firstshmon{janv}%
		\def\texd@secondmon{février}%
		\def\texd@secondshmon{févr}%
		\def\texd@thirdmon{mars}%
		\def\texd@thirdshmon{mars}%
		\def\texd@fourthmon{avril}%
		\def\texd@fourthshmon{avr}%
		\def\texd@fifthmon{mai}%
		\def\texd@fifthshmon{mai}%
		\def\texd@sixthmon{juin}%
		\def\texd@sixthshmon{juin}%
		\def\texd@seventhmon{juil}%
		\def\texd@seventhshmon{juil}%
		\def\texd@eighthmon{août}%
		\def\texd@eighthshmon{août}%
		\def\texd@ninthmon{septembre}%
		\def\texd@ninthshmon{sept}%
		\def\texd@tenthmon{octobre}%
		\def\texd@tenthshmon{oct}%
		\def\texd@eleventhmon{novembre}%
		\def\texd@eleventhshmon{nov}%
		\def\texd@twelfthmon{décembre}%
		\def\texd@twelfthshmon{déc}%
		\def\texd@firstdayname{dimanche}%
		\def\texd@firstdayshname{dim}%
		\def\texd@seconddayname{lundi}%
		\def\texd@seconddayshname{lun}%
		\def\texd@thirddayname{mardi}%
		\def\texd@thirddayshname{mar}%
		\def\texd@fourthdayname{mercredi}%
		\def\texd@fourthdayshname{mer}%
		\def\texd@fifthdayname{jeudi}%
		\def\texd@fifthdayshname{jeu}%
		\def\texd@sixthdayname{vendredi}%
		\def\texd@sixthdayshname{ven}%
		\def\texd@seventhdayname{samedi}%
		\def\texd@seventhdayshname{sam}%
	}{}%
	\IfLanguageName{german}{%
		\def\texd@firstmon{Januar}%
		\def\texd@firstshmon{Jan}%
		\def\texd@secondmon{Februar}%
		\def\texd@secondshmon{Feb}%
		\def\texd@thirdmon{März}%
		\def\texd@thirdshmon{März}%
		\def\texd@fourthmon{April}%
		\def\texd@fourthshmon{Apr}%
		\def\texd@fifthmon{Mai}%
		\def\texd@fifthshmon{Mai}%
		\def\texd@sixthmon{Juni}%
		\def\texd@sixthshmon{Juni}%
		\def\texd@seventhmon{Juli}%
		\def\texd@seventhshmon{Juli}%
		\def\texd@eighthmon{August}%
		\def\texd@eighthshmon{Aug}%
		\def\texd@ninthmon{September}%
		\def\texd@ninthshmon{Sept}%
		\def\texd@tenthmon{Oktober}%
		\def\texd@tenthshmon{Okt}%
		\def\texd@eleventhmon{November}%
		\def\texd@eleventhshmon{Nov}%
		\def\texd@twelfthmon{Dezember}%
		\def\texd@twelfthshmon{Dez}%
		\def\texd@firstdayname{Sonntag}%
		\def\texd@firstdayshname{So}%
		\def\texd@seconddayname{Montag}%
		\def\texd@seconddayshname{Mo}%
		\def\texd@thirddayname{Dienstag}%
		\def\texd@thirddayshname{Di}%
		\def\texd@fourthdayname{Mittwoch}%
		\def\texd@fourthdayshname{Mi}%
		\def\texd@fifthdayname{Donnerstag}%
		\def\texd@fifthdayshname{Do}%
		\def\texd@sixthdayname{Freitag}%
		\def\texd@sixthdayshname{Fr}%
		\def\texd@seventhdayname{Samstag}%
		\def\texd@seventhdayshname{Sa}%
	}{}%
}%
%    \end{macrocode}
% Happy \TeX{}ing!
