diff options
Diffstat (limited to 'macros/latex209/contrib/misc/ukdate.sty')
-rw-r--r-- | macros/latex209/contrib/misc/ukdate.sty | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/macros/latex209/contrib/misc/ukdate.sty b/macros/latex209/contrib/misc/ukdate.sty new file mode 100644 index 0000000000..8a39f217a0 --- /dev/null +++ b/macros/latex209/contrib/misc/ukdate.sty @@ -0,0 +1,203 @@ +% --- ------------------------------------------------------------------ +% --- English-style Date Macros for LaTeX, version 1.00--0. +% --- ------------------------------------------------------------------ +% +% --- \today (replaces American-style macro of same name) generates +% --- today's date in the form Thursday 4th October 1066. +% --- The `th' is raised, reduced in size and underlined in the +% --- same font style (family) as the rest of the date. +% +% --- \st generates a raised, reduced, underlined `st', as in 1st. +% --- \nd generates a raised, reduced, underlined `nd', as in 2nd. +% --- \rd generates a raised, reduced, underlined `rd', as in 3rd. +% --- \th generates a raised, reduced, underlined `th', as in 4th. +% +% --- \dayofweek generates the day of the week, based on TeX's values +% --- of \day, \month and \year. +% +% --- \phaseofmoon generates the current phase of the moon, again based +% --- on TeX's values for \day, \month and \year. +% +% --- ------------------------------------------------------------------ +% --- Adrian F. Clark (alien@uk.ac.essex.ese) 26-Oct-1988 10:05:50 +% --- ------------------------------------------------------------------ + +% --- Counters. Note that we use the same registers as TeX holds other +% --- things in (e.g., \count0 holds the page number). This requires +% --- that \@savestyle, \@setstyle, \dayofweek and \phaseofmoon perform +% --- all their register manipulations within a group. This may seem +% --- a bit messy, but it saves having eight registers permanently set +% --- aside just for date calculation. + +\def\@cent{\count0 } % century number (1979 == 20) +\def\@diy{\count1 } % day in the year +\def\@dow{\count2 } % gets day of the week +\def\@epact{\count3 } % age of the moon on Jan. 1 +\def\@golden{\count4 } % Moon's golden number +\def\@leap{\count5 } % leap year fingaler +\def\@x{\count6 } % temp register +\def\@y{\count7 } % another temp register + + +% --- A replacement for the ``plain'' TeX and LaTeX \today macro, to +% --- to output the date in English-style. +% --- They ensure the smaller text comes out in the right font by saving +% --- the font family before reducing the size, then restoring it. (This +% --- was suggested by Leslie Lamport.) Of course, it requires that the +% --- font in use when today is invoked has a sensible family. + +\def\@up#1{{\@savestyle\thinspace$^{\underline{\hbox{% + \scriptsize\@setstyle#1\fam=-1 }}}$}} +\def\st{\@up{st}} +\def\nd{\@up{nd}} +\def\rd{\@up{rd}} +\def\th{\@up{th}} + +% --- Macros to save and restore the font family. + +\def\@savestyle{\count0=\the\fam} +\def\@setstyle{\ifcase\count0\rm\or\mit\or\cal\or\rm% what's family 3? + \or\it\or\sl\or\bf\or\tt\fi} + +% --- The date, English style (e.g. Thursday 4th October 1066). + +\def\today{\dayofweek\ \number\day\ifcase\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 + \space\ifcase\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 + \space\number\year} + +% --- The day of the week ("Sunday", etc.) is inserted into the text +% --- by \dayofweek. (This uses registers \@dow, \@leap, \@x and \@y.) +% --- I acquired this from elsewhere; I don't know who wrote it. + +\def\dayofweek{{% +% leap = year + (month - 14)/12; + \@leap=\month \advance\@leap by -14 \divide\@leap by 12 + \advance\@leap by \year +% dow = (13 * (month + 10 - (month + 10)/13*12) - 1)/5 + \@dow=\month \advance\@dow by 10 + \@y=\@dow \divide\@y by 13 \multiply\@y by 12 + \advance\@dow by -\@y \multiply\@dow by 13 + \advance\@dow by -1 \divide\@dow by 5 +% dow += day + 77 + 5 * (leap % 100)/4 + \advance\@dow by \day \advance\@dow by 77 + \@x=\@leap \@y=\@x \divide\@y by 100 \multiply\@y by 100 \advance\@x by -\@y + \multiply\@x by 5 \divide\@x by 4 \advance\@dow by \@x +% dow += leap / 400 + \@x=\@leap \divide\@x by 400 \advance\@dow by \@x +% dow -= leap / 100 * 2; +% dow = (dow % 7) + \@x=\@leap \divide\@x by 100 \multiply\@x by 2 \advance\@dow by -\@x + \@x=\@dow \divide\@x by 7 \multiply\@x by 7 \advance\@dow by -\@x + \ifcase\@dow Sunday\or Monday\or Tuesday\or Wednesday\or + Thursday\or Friday\or Saturday\fi}} +% +% --- Likewise, \phaseofmoon inserts the phase of the moon into the +% --- text. This was written by the same person as \dayofweek. +% --- The routine calculates the year's epact (the age of the moon on Jan 1.), +% --- adds this to the number of days in the year, and calculates the phase +% --- of the moon for this date. It returns the phase as a string, e.g., +% --- "new", "full", etc. +% +% --- In the algorithm: +% --- diy is the day of the year - 1 (i.e., Jan 1 is day 0). +% --- golden is the number of the year in the Mentonic cycle, used to +% --- determine the position of the calender moon. +% --- epact is the age of the calender moon (in days) at the beginning +% --- of the year. To calculate epact, two century-based +% --- corrections are applied: +% --- Gregorian: (3 * cent)/4 - 12 +% --- is the number of years such as 1700, 1800 when +% --- leap year was not held. +% --- Clavian: (((8 * cent) + 5) / 25) - 5 +% --- is a correction to the Mentonic cycle of about +% --- 8 days every 2500 years. Note that this will +% --- overflow 16 bits in the year 409600. Beware. +% --- The algorithm is accurate for the Gregorian calender only. +% +% --- The magic numbers used in the phase calculation are: +% --- 29.5 The moon's period in days. +% --- 177 29.5 scaled by 6 +% --- 22 (29.5 / 8) scaled by 6 (this gets the phase) +% --- 11 ((29.5 / 8) / 2) scaled by 6 +% +% --- Theoretically, this should yield a number in the range 0 .. 7. However, +% --- two days per year, things don't work out too well. +% +% --- Epact is calculated by the algorithm given in Knuth vol. 1 (Calculation +% --- of Easter). See also the article on Calenders in the Encyclopaedia +% --- Britannica and Knuth's algorithm in CACM April 1962, page 209. +% +\def\phaseofmoon{{% + \@diy=\day \advance\@diy by \ifcase\month % Jan 1 == 0 + -1\or -1\or 30\or 58\or 89\or 119\or 150\or % Jan .. Jun + 180\or 211\or 241\or 272\or 303\or 333\fi % Jul .. Dec +% if ((month > 2) && ((year % 4 == 0) && +% ((year % 400 == 0) || (year % 100 != 0)))) +% diy++; /* Leapyear fixup */ + \ifnum \month>2 + \@x=\year \@y=\@x \divide\@y by 4 \multiply\@y by 4 \advance\@x by -\@y + \ifnum \@x=0 % month > 2 and maybe leapyear + \@x=\year \@y=\@x \divide\@y by 400 + \multiply\@y by 400 \advance\@x by -\@y + \ifnum \@x=0 % 2000 is a leap year + \advance\@diy by 1 % so it's one day later + \else % not 2000, check other '00's + \@x=\year \@y=\@x \divide\@y by 100 + \multiply\@y by 100 \advance\@x by -\@y + \ifnum \@x>0 % not some other '00' year + \advance\@diy by 1 % it's still one day later + \fi % not odd century + \fi % not 2000-type century + \fi % not leapish year + \fi % not march or later +% cent = (year / 100) + 1; /* Century number */ +% golden = (year % 19) + 1; /* Golden number */ + \@cent=\year \divide\@cent by 100 \advance\@cent by 1 + \@golden=\year + \@y=\year \divide\@y by 19 \multiply\@y by 19 \advance\@golden by -\@y + \advance\@golden by 1 +% epact = ((11 * golden) + 20 /* Golden number */ +% + (((8 * cent) + 5) / 25) - 5 /* 400 year cycle */ +% - (((3 * cent) / 4) - 12)) % 30; /* Leap year correction */ + \@epact=11 \multiply\@epact by \@golden + \advance\@epact by 20 + \@x=8 \multiply\@x by \@cent \advance\@x by 5 + \divide\@x by 25 \advance\@x by -5 + \advance\@epact by \@x + \@x=3 \multiply\@x by \@cent \divide\@x by 4 \advance\@x by -12 + \advance\@epact by -\@x + \@y=\@epact \divide\@y by 30 \multiply\@y by 30 \advance\@epact by -\@y +% if (epact <= 0) +% epact += 30; /* Age range is 1 .. 30 */ +% if ((epact == 25 && golden > 11) || epact == 24) +% epact++; + \ifnum \@epact<0 + \advance\@epact by 30 + \fi + \ifnum \@epact=25 + \ifnum \@golden>11 + \advance \@epact by 1 + \fi + \else + \ifnum \@epact=24 + \advance \@epact by 1 + \fi + \fi +% +% --- Calculate the phase, using the magic numbers defined above. +% --- Note that phase may be equal to 8 (== 0) on two days of the year +% --- due to the way the algorithm was implemented. +% --- phase = (((((diy + epact) * 6) + 11) % 177) / 22) & 7; +% + \@x=\@diy \advance\@x by \@epact \multiply\@x by 6 \advance\@x by 11 + \@y=\@x \divide\@y by 177 \multiply\@y by 177 \advance\@x by -\@y + \divide\@x by 22 + \ifcase\@x new\or waxing crescent\or in its first quarter\or + waxing gibbous\or full\or waning gibbous\or + in its last quarter\or waning crescent\or new\fi}} + +% --- End of ukdate.sty |