From 873660d1a83ece926fe7206288dda9c36b349c1b Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Thu, 12 Jan 2006 23:46:03 +0000
Subject: generic 1

git-svn-id: svn://tug.org/texlive/trunk@613 c570f23f-e606-0410-a88d-b1316a301751
---
 .../texmf-dist/tex/generic/genmisc/dayofweek.tex   | 149 +++++++++++++++++++++
 1 file changed, 149 insertions(+)
 create mode 100644 Master/texmf-dist/tex/generic/genmisc/dayofweek.tex

(limited to 'Master/texmf-dist/tex/generic/genmisc/dayofweek.tex')

diff --git a/Master/texmf-dist/tex/generic/genmisc/dayofweek.tex b/Master/texmf-dist/tex/generic/genmisc/dayofweek.tex
new file mode 100644
index 00000000000..4ce46ac2434
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/genmisc/dayofweek.tex
@@ -0,0 +1,149 @@
+%
+%	\DayOfWeek	expands to the day of the week ("Sunday", etc.)
+%	\PhaseOfMoon	expands to the phase of the moon
+%
+%	Written by Martin Minow of DEC (minow%bolt.dec@decwrl.dec.com).
+%
+\def\DayOfWeek{%
+%
+% 	Calculate day of the week, return "Sunday", etc.
+%
+  \newcount\dow				% Gets day of the week
+  \newcount\leap			% Leap year fingaler
+  \newcount\x				% Temp register
+  \newcount\y 				% Another temp register
+%		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
+}
+%%
+%%
+%%
+\def\PhaseOfMoon{%	Calculate the phase of the (civil) moon.
+%
+% 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 as follows:
+%	 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.
+%
+  \newcount\cent		% Century number (1979 == 20)
+  \newcount\epact		% Age of the moon on Jan. 1
+  \newcount\diy			% Day in the year
+  \newcount\golden		% Moon's golden number
+  \newcount\x			% Temp
+  \newcount\m			% Temp for modulus
+  \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 \m=\x \divide\m by 4 \multiply\m by 4 \advance\x by -\m
+    \ifnum \x=0				% month > 2 and maybe leapyear
+      \x=\year \m=\x \divide\m by 400 \multiply\m by 400 \advance\x by -\m
+      \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 \m=\x \divide\m by 100 \multiply\m by 100 \advance\x by -\m
+	\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
+  \m=\year \divide\m by 19 \multiply\m by 19 \advance\golden by -\m
+  \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
+  \m=\epact \divide\m by 30 \multiply\m by 30 \advance\epact by -\m
+%	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
+  \m=\x \divide\m by 177 \multiply\m by 177 \advance\x by -\m
+  \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
+}
-- 
cgit v1.2.3

