summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/misc/ukdate.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex209/contrib/misc/ukdate.sty')
-rw-r--r--macros/latex209/contrib/misc/ukdate.sty203
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