summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:51:32 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:51:32 +0000
commitc527dbf71da60b363477eb3371989b216625a359 (patch)
tree0d1a4c6e27a25ceb604ac0883c0209c54e2b1c5e /Master/texmf-dist
parentb4f9edbb6c7363a4534991abd962637d66ff3808 (diff)
trunk/Master/texmf-dist/source/latex/calendar
git-svn-id: svn://tug.org/texlive/trunk@177 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/source/latex/calendar/CATALOG17
-rw-r--r--Master/texmf-dist/source/latex/calendar/MANIFEST31
-rw-r--r--Master/texmf-dist/source/latex/calendar/README128
-rw-r--r--Master/texmf-dist/source/latex/calendar/allcal.ins193
-rw-r--r--Master/texmf-dist/source/latex/calendar/autofilo.dtx642
-rw-r--r--Master/texmf-dist/source/latex/calendar/bigdemo.tgzbin0 -> 7797 bytes
-rw-r--r--Master/texmf-dist/source/latex/calendar/caldemos.dtx212
-rw-r--r--Master/texmf-dist/source/latex/calendar/calendar.dtx1975
-rw-r--r--Master/texmf-dist/source/latex/calendar/dates.dtx2630
-rw-r--r--Master/texmf-dist/source/latex/calendar/demo1997.cld13
-rw-r--r--Master/texmf-dist/source/latex/calendar/demoapt.cld14
-rw-r--r--Master/texmf-dist/source/latex/calendar/demoaptr.cld17
-rw-r--r--Master/texmf-dist/source/latex/calendar/demoevt.cld13
-rw-r--r--Master/texmf-dist/source/latex/calendar/demoevtr.cld17
-rw-r--r--Master/texmf-dist/source/latex/calendar/demohlst.htm14
-rw-r--r--Master/texmf-dist/source/latex/calendar/demohml.htm59
-rw-r--r--Master/texmf-dist/source/latex/calendar/demohmth.htm13
-rw-r--r--Master/texmf-dist/source/latex/calendar/demolist.cld14
-rw-r--r--Master/texmf-dist/source/latex/calendar/evntlist.dtx284
-rw-r--r--Master/texmf-dist/source/latex/calendar/htmlstuf.dtx385
-rw-r--r--Master/texmf-dist/source/latex/calendar/mkaddr.Frank20
-rw-r--r--Master/texmf-dist/source/latex/calendar/mkaddr.dtx579
-rw-r--r--Master/texmf-dist/source/latex/calendar/mkaddr.tcl201
-rw-r--r--Master/texmf-dist/source/latex/calendar/monthly.dtx565
-rw-r--r--Master/texmf-dist/source/latex/calendar/overword.dtx344
-rw-r--r--Master/texmf-dist/source/latex/calendar/plotutil.dtx78
-rw-r--r--Master/texmf-dist/source/latex/calendar/timesht.dtx688
-rw-r--r--Master/texmf-dist/source/latex/calendar/timetabl.dtx772
-rw-r--r--Master/texmf-dist/source/latex/calendar/weekly.dtx491
-rw-r--r--Master/texmf-dist/source/latex/calendar/yearly.dtx340
30 files changed, 10749 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/calendar/CATALOG b/Master/texmf-dist/source/latex/calendar/CATALOG
new file mode 100644
index 00000000000..fbebd973d1d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/CATALOG
@@ -0,0 +1,17 @@
+Name: calendar
+Problems-To: fb@soas.ac.uk
+Author: Frank G Bennett, Jr
+Version: 3.1
+Description: Provides an interface for the creation of calendars using
+ LaTeX. Each calendar "style" within this bundle produces a
+ calendar in a particular format. Calendars may incorporate lists of
+ events and appointments from external files. The package is stable,
+ easy to install, easy to use, powerful and flexible. The bundle
+ includes styles for: a yearly calendar, a monthly calendar, a weekly
+ filofax(tm) calendar, a timesheet generator and a timetable/conference/
+ itinerary generator.
+Keywords: calendar, timetable, diary, time management, office software,
+ scheduling
+See-Also: CTAN://tex-archive/macros/plain/contrib/calendar.
+Address: Law Department, School of Oriental and African Studies,
+ Thornhaugh Street, London WC1H 0XG
diff --git a/Master/texmf-dist/source/latex/calendar/MANIFEST b/Master/texmf-dist/source/latex/calendar/MANIFEST
new file mode 100644
index 00000000000..fcc4ea2a512
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/MANIFEST
@@ -0,0 +1,31 @@
+The LaTeX Calendar bundle consists of the following files:
+
+CATALOG (LaTeX index entry)
+MANIFEST (This file)
+README (Blurb about the package)
+calguide.tex (generic user manual)
+
+allcal.ins (Installation file)
+
+calendar.dtx (Core module)
+dates.dtx (Core module)
+overword.dtx (Core module)
+
+calopts.cfg (File containing common code)
+dates.cfg (Sample language configuration file)
+autofilo.dtx (Filofax(tm) page support)
+
+timesht.dtx (Timesheet style)
+weekly.dtx (Weekly style)
+monthly.dtx (Monthly style)
+yearly.dtx (Yearly style)
+timetabl.dtx (Timetable style)
+evntlist.dtx (Event list style)
+htmlstuf.dtx (Three HTML styles)
+
+margins.sty (Simple margin control)
+mkaddr.dtx (Sample Tcl and Emacs Lisp code for managing addresses)
+plotutil.dtx (Sample Tcl and LaTeX code for controlling HP 6xx plotters)
+
+caldemos.dtx (Calendar demo files)
+bigdemo.tgz (Large set of data files and sample document)
diff --git a/Master/texmf-dist/source/latex/calendar/README b/Master/texmf-dist/source/latex/calendar/README
new file mode 100644
index 00000000000..8f7e561a6f0
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/README
@@ -0,0 +1,128 @@
+The LaTeX Calendar bundle (version 3.1)
+
+INTRODUCTION
+------------
+The files in this bundle provide an interface for the creation of calendars
+using LaTeX. It is easy to use, flexible and powerful. Promise me more,
+right? Read on.
+
+Each calendar "style" provides an environment which will read its contents
+as a date or range of dates, and produce a corresponding calendar in a
+particular format. For example, a calendar for the first two weeks in
+August 1997 in the "weekly" style would be expressed as follows:
+
+ \begin{weekly}{}{}
+ 1 Aug 1997 to 8 Aug 1997
+ \end{weekly}
+
+The syntax for expressing dates is human-friendly: initial capitals are
+converted to lower case, abbreviations will be recognized, and within
+ordinary dates word order is irrelevant (i.e. both 1 aug 1997 and August 1
+1997 mean the same thing).
+
+Calendars may incorporate lists of events and appointments from external
+files. The syntax for such files permits the use of recursive dates limited
+by a range or ranges of dates ("every second saturday" during school
+session, that sort of thing), with a stop-list of holidays. Entries
+may also be color-coded if you have a color printer. You can also manage
+complex data sets by building large lists from smaller files in an
+object-oriented fashion.
+
+INSTALLATION
+------------
+The simplest way to install the tools in the package is to make a
+subdirectory in the search path of your TeX, FTP all of the source files to
+that directory, and run "latex allcal.ins". You should then be able to run
+the demonstration files. Note that demoover.tex and demodate.tex do not
+produce any printed output; these files just demonstrate the capabilities of
+the relevant code on the terminal.
+
+UPGRADING
+---------
+If there is a previous version of the LaTeX Calendar package on your system,
+these files should be used as a complete replacement. Each release
+is likely to incorporate bug-fixes or enhancements that affect several
+files, so it is best to save yourself the potential frustration of
+a broken installation and do it from scratch each time.
+
+WHAT'S NEW
+----------
+==Version 3.1==
+The LaTeX Calendar Bundle now speaks HTML. Language support and
+documentation have also vastly improved. You can now specify any language
+as the default, AND you can include multiple languages in a single *.cld
+file, choosing which text to include when a calendar is actually produced.
+There is now ONE manual, that tells you everything you need to know.
+
+==Version 2.2==
+Lots of bugfixes, large and small.
+
+First day in yearly calendars can now be selected at run time.
+
+Parsing code greatly optimized. Note that only the first letter
+of words in date text is now downcased.
+
+Documentation in timetabl.dtx improved.
+
+==Version 2.1==
+A lot of redundant and ornamental processing has been eliminated,
+and the package is slightly faster now.
+
+A bug affecting 2nd and subseqent pages in the Timesheets package
+has been fixed.
+
+The behaviour of "every other" declarations has been modified
+to make this slightly more useful. See calman.tex for details.
+
+Validation of entries has been tightened up somewhat.
+
+==Version 2.0==
+The "weekly" package and its supporting style "autofilo.sty" creates
+calendars in Filofax(TM) format (those little ring-binder-type things that
+seem such a good idea until you discover how much the commercially printed
+pages cost). All page parameters, including the size, number and spacing
+of the punch-marks, are configurable.
+
+For Unix systems with Emacs and Tcl, the "mkaddr" package includes some
+hacks that can be used to generate Filofax(TM)-type-format address lists
+from an Emacs BBDB database (q.v.).
+
+The limitation in the code which demanded that a bogus entry be placed at
+the bottom of files in some circumstances to protect against reads beyond
+end of file has been eliminated. The syntax for use in *.cld files has also
+been slightly modified to make the interface internally consistent; =all=
+declarations other than "freeze" are now meant to be followed by a
+description in squiggly braces.
+
+Anniversaries are now supported.
+
+Several cross-nested global/local assignments to the same variable, which
+produced "save size" errors with even relatively modest volumes of
+data, have been fixed. I =think= that bugs of this kind have been
+eliminated from the code, but if you do see this error on a large job,
+send me the logfile and I'll try to track the problem down.
+
+CONTRIBUTORS
+------------
+
+Most of the code in this package was written by Frank Bennett
+<fb@soas.ac.uk>. The core upon which it is based, however, is a collection
+of calendar macros for plain TeX, still available in the plain TeX area on
+CTAN. Very slightly modified versions of these macros are the means used
+for generating dates, identifying days of the week and so forth. These
+macros were released anonymously; if anyone can tell me who wrote them, I
+will include their author among the credits here.
+
+Christian Horn and Miroslav Novak did beta-testing of early versions of
+Bennett's LaTeX code, and their help is gratefully acknowledged here. The
+"Timetable" package was suggested by Miroslav Novak, and implemented by
+Bennett. Edward Czilli provided invaluable feedback in the testing phase of
+versions 2.0, 2.1 and 2.2. Thanks are also due for comments and bug reports
+received from Jason Alexander, Edward J. Czilli, Bob Fiegel, Lico Hoekema,
+and Gabrielle Owen. To everyone who has corresponded with me about the
+package, I want to convey my sincerest thanks.
+
+Enjoy!
+
+Frank Bennett
+fb@soas.ac.uk
diff --git a/Master/texmf-dist/source/latex/calendar/allcal.ins b/Master/texmf-dist/source/latex/calendar/allcal.ins
new file mode 100644
index 00000000000..df226cb5c4e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/allcal.ins
@@ -0,0 +1,193 @@
+%\iffalse
+% allcal.ins,v
+% Revision 3.1 1998/01/17 16:55:22 root
+% Release code
+%
+% Revision 2.10 1998/01/16 21:12:52 root
+% *** empty log message ***
+%
+% Revision 2.9 1998/01/16 21:08:40 root
+% *** empty log message ***
+%
+% Revision 2.8 1998/01/16 19:22:55 root
+% *** empty log message ***
+%
+% Revision 2.7 1997/12/06 21:13:24 root
+% Changed filoaddr.sty to filoaddr.cls
+%
+% Revision 2.6 1997/12/06 08:53:32 root
+% Log offset fixed.
+%
+%Revision 2.5 1997/12/06 08:50:25 root
+%Fixed missing log entry.
+%
+% allcal.ins,v
+% Revision 2.1.1.1 1997/11/01 15:36:56 bennett
+% *** empty log message ***
+%
+% Revision 2.1 1997/11/01 14:40:45 root
+% Release code.
+%
+% Revision 1.4 1997/10/30 20:13:44 root
+% Added \IfFileExists conditionals that paternalistically attempt
+% to determine whether it's worth calling the existence of the
+% Tcl/Emacs facilities to the attention of the user.
+%
+% Revision 1.3 1997/10/30 06:13:56 root
+% Eliminated extract-all-installation-files option.
+%
+% Revision 1.2 1997/10/29 08:40:33 root
+% Simple test of RCS.
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%\fi
+%
+\def\batchfile{allcal.ins}
+\input docstrip.tex
+
+\def\calextract#1#2#3#4{%
+ \IfFileExists{#1.dtx}{%
+ \ifcat$#4$\def\calexfn{#1}\else\def\calexfn{#4}\fi
+ \generate{
+ \file{\calexfn.#2} {\from{#1.dtx}{#3}}}}
+ \relax}
+
+\keepsilent
+
+\preamble
+This file is part of the Calendar package,
+Copyright (C) 1996, 1997 Frank Bennett, Jr.
+All rights reserved.
+------------------------------------------
+
+IMPORTANT NOTICE:
+
+You are not allowed to change this file. You may however copy
+this file to a file with a different name and then change the
+copy if (a) you do not charge for the modified code, (b) you
+acknowledge the author of this file in the new file, if it
+is distributed to others, and (c) you attach these same
+conditions to the new file.
+
+You are not allowed to distribute this file alone. You are not
+allowed to take money for the distribution or use of this file
+(or a changed version) except for a nominal charge for copying
+etc.
+
+You are allowed to distribute this file under the condition that
+it is distributed with all of its contents, intact.
+
+For error reports, or offers to help make this a more powerful,
+friendlier, and altogether more thrilling package, please contact me on
+fb@soas.ac.uk. Better yet, make a contribution to
+my pension. Account details available on request.
+------------------------------------------
+
+\endpreamble
+
+\Ask\demo{%
+^^JUnpack demonstration files? (optional) ^^J (y/n):
+}
+
+\newif\if@Emacs
+\IfFileExists{/usr/bin/emacs}{\@Emacstrue}{}
+\IfFileExists{/usr/local/bin/emacs}{\@Emacstrue}{}
+\IfFileExists{/usr/bin/mule}{\@Emacstrue}{}
+\IfFileExists{/usr/local/bin/mule}{\@Emacstrue}{}
+\if@Emacs
+\IfFileExists{/usr/bin/tclsh}{\@Emacstrue}{}
+\IfFileExists{/usr/local/bin/tclsh}{\@Emacstrue}{}
+\IfFileExists{/usr/bin/expect}{\@Emacstrue}{}
+\IfFileExists{/usr/local/bin/expect}{\@Emacstrue}{}
+\Ask\unix{%
+^^JUnpack address management files, meant for use on Unix systems (optional) ^^J (y/n):
+}
+\else
+\message{If you are a Unix user and install Emacs, Tcl and the BBDB email}
+\message{database, this pacakge contains a set of scripts that can be used}
+\message{to print address lists for your personal diary.}
+\fi
+
+\Ask\overwrite{%
+^^JBlindly OVERWRITE existing files (careful with this one) ^^J (y/n):
+}
+
+\ifx\overwrite\y\askforoverwritefalse\fi
+
+\calextract{overword}{sty}{style}{}
+\calextract{dates}{sty}{style}{}
+\calextract{calendar}{sty}{style}{}
+\calextract{evntlist}{sty}{style}{}
+\calextract{autofilo}{sty}{style}{}
+\calextract{monthly}{sty}{class}{}
+\calextract{timesht}{sty}{package}{}
+\calextract{timetabl}{sty}{package}{}
+\calextract{weekly}{cls}{class}{}
+\calextract{yearly}{sty}{style}{}
+\calextract{htmlstuf}{sty}{htmlmonth}{hmonth}
+\calextract{htmlstuf}{sty}{htmlevent}{hlist}
+\calextract{htmlstuf}{sty}{htmlmonthevent}{hml}
+
+\ifx\demo\y
+ \bgroup
+
+\preamble
+\endpreamble
+
+\postamble
+\endpostamble
+
+ \def\ins{n}
+ \calextract{dates}{tex}{demo}{demodate}
+ \calextract{overword}{tex}{demo}{demoover}
+ \calextract{caldemos}{cld}{1997}{demo1997}
+ \calextract{caldemos}{cld}{appts}{demoapt}
+ \calextract{caldemos}{cld}{apptsr}{demoaptr}
+ \calextract{caldemos}{cld}{demolist}{demolist}
+ \calextract{caldemos}{cld}{events}{demoevt}
+ \calextract{caldemos}{cld}{eventsr}{demoevtr}
+ \calextract{caldemos}{tex}{monthly}{demomont}
+ \calextract{caldemos}{tex}{timesht}{demotsht}
+ \calextract{caldemos}{tex}{timetabl}{demottbl}
+ \calextract{caldemos}{tex}{weekly}{demowkly}
+ \calextract{caldemos}{tex}{yearly}{demoyrly}
+ \calextract{caldemos}{tex}{evntlist}{demoevnt}
+ \calextract{caldemos}{tex}{hmonth}{demohmth}
+ \calextract{caldemos}{tex}{hlist}{demohlst}
+ \calextract{caldemos}{tex}{hml}{demohml}
+ \egroup
+\fi
+
+\ifx\unix\y
+
+\preamble
+\endpreamble
+
+\postamble
+\endpostamble
+
+\def\WritePreamble#1{}
+\def\WritePostamble#1{}
+
+\generate{\file{mkaddr.Frank}{\from{mkaddr.dtx}{format}}
+ \file{mkaddr.tcl}{\from{mkaddr.dtx}{script}}
+ \file{dotemacs}{\from{mkaddr.dtx}{elisp}}
+ \file{filoaddr.cls}{\from{mkaddr.dtx}{style}}
+ \file{dvipshpplotq}{\from{plotutil.dtx}{script}}
+ \file{hpplotsz.sty}{\from{plotutil.dtx}{style}}
+ }
+\fi
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, you have to move all *.sty}
+\Msg{* and *.cls files into a directory searched by TeX.}
+\Msg{*}
+\IfFileExists{mkaddr.dtx}{\ifx\unix\y
+\Msg{* You might also want to move the "mkaddr" file into your}
+\Msg{* executable search path after reading the documentation}
+\Msg{* in mkaddr.dtx and experimenting with the script to see}
+\Msg{* if you find it useful.}
+\Msg{*}\fi}\relax
+\Msg{***********************************************************}
diff --git a/Master/texmf-dist/source/latex/calendar/autofilo.dtx b/Master/texmf-dist/source/latex/calendar/autofilo.dtx
new file mode 100644
index 00000000000..34151b19e02
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/autofilo.dtx
@@ -0,0 +1,642 @@
+%\iffalse
+%
+% file: autofilo.dtx
+% Copyright (C) 1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+%\fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:13:42}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{autofilo.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% autofilo.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:13:42 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 16:56:58 root
+% Release code
+%
+% Revision 2.8 1998/01/16 11:52:55 root
+% *** empty log message ***
+%
+% Revision 2.7 1998/01/15 10:45:24 root
+% Filofax page now comes out centered on the physical page.
+% Just fold the thing in half and cut.
+%
+% Revision 2.6 1997/12/05 17:01:48 root
+% Added zero width vrule to force left-hand cut rule to right
+% position even when jawline has no width.
+%
+% Revision 2.5 1997/12/05 13:47:40 root
+% Fixed quandary of overlapping revisions.
+%
+% Revision 2.4 1997/12/05 12:14:08 root
+% Fixed missing brace in af@circle, and added RequirePackage
+% for keyval parser.
+% Revision 2.2.1.5 1997/11/26 11:07:51 bennett
+% Final change to documentation.
+%
+% Revision 2.2.1.4 1997/11/07 16:27:06 root
+% Fixed checksum, added some documentation for the jawmarks
+% code.
+%
+% Revision 2.2.1.3 1997/11/07 16:15:14 root
+% Final fixes to jawmark code, maybe.
+%
+% Revision 2.2.1.2 1997/11/07 16:10:59 root
+% Patched up code for jaw marks.
+%
+% Revision 2.2.1.1 1997/11/07 14:57:37 root
+% Trial code for jaw marks.
+%
+% Revision 2.4 1997/12/05 12:14:08 root
+% Fixed missing brace in af@circle, and added RequirePackage
+% for keyval parser.
+%
+% Revision 2.3 1997/11/07 14:52:50 root
+% Added trial code for jaw marks.
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 15:17:06 bennett
+% Release code.
+%
+% Revision 1.2 1997/10/29 20:03:07 bennett
+% *** empty log message ***
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the \texttt{autofilo}
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent This package provides an environment
+% within which pages are framed with cut lines and
+% printed with punch-marks, so that printed text can
+% easily be inserted into a filofax or binder.
+% \end{abstract}
+%
+% \CheckSum{692}
+%
+% \section{About the Style}
+%
+% This style provides a rough solution to the design
+% problem it addresses, but it does work. Pages are
+% always printed in landscape, rotated using the "lscape"
+% package from the "graphics" bundle, and centered on the
+% physical paper.\footnote{As a technical note, the frame itself
+% is not rotated, because it is inserted independently of
+% the output boxes controlled by the \LaTeX{} output routine.
+% The output modes (two-column,
+% and a hacked-together four-column mode) have
+% been modified to understand blocks of text as \cs{hbox}es
+% to be laid atop one another, rather than as \cs{vbox}es
+% to be set alongside one another.} It accepts two options,
+% "twocolumn" (the default) and "fourcolumn".
+%
+% The style provides an environment called "autofilo".
+% Most often, users of this package will be style
+% authors who want to incorporate it into other
+% environments that do more specific things. Because
+% "autofilo" accepts several "keyval"-style parameters,
+% style authors may have a use for documentation for those
+% optional parameters. So here is some sample documentation:
+%
+% \begin{description}
+% \item[\texttt{punchcluster}] Most filofaxes have two or
+% or more clusters or groups of punches to hold the
+% pages in place. This option sets the number of punches
+% in each cluster. The default is three.
+% \item[\texttt{intraspace}] This governs the space
+% between punchouts within a group. The default is
+% 19.25mm.
+% \item[\texttt{punchgroups}] This option sets the number
+% of groups of punches. The default is two groups.
+% \item[\texttt{interspace}] This option sets the
+% distance between the groups of punches. The default
+% is 51.25mm.
+% \item[\texttt{pageheight}] This fixes the height
+% of a filofax page (not the physical paper on
+% which it is printed). The default is 172mm.
+% \item[\texttt{pagewidth}] This fixes the width of an individual
+% page. The physical printed area will be twice this figure.
+% The default is 95mm, for a 190mm printed area.
+% \item[\texttt{grip}] This adjusts the distance from the
+% edge of the page to the outer edge of the punchouts.
+% Defaults to 5mm.
+% \item[\texttt{punchmargin}] This adjusts the distance from the
+% edge of the text to the inner edge of the punchouts.
+% Defaults to 2mm.
+% \item[\texttt{punchsize}] Size, in points, of punchouts.
+% Defaults to 15.
+% \item[\texttt{topspace}] Gap between top of filofax page
+% and top of text page.
+% \item[\texttt{bottomspace}] Gap between bottom of filofax page
+% and bottom of text page.
+% \item[\texttt{jawspread}] If set to a positive length, this places a set
+% of rules the width of the punchmarks on either side of each
+% punchhole, centered on its center and spread the distance specified.
+% This can be useful as a guide with some one-hole punches that are
+% designed to be used ``blind''.
+% \item[\texttt{jawline}] Sets the width of the lines used to make
+% jawmarks. The default value is \texttt{0.4pt}.
+% \end{description}
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{The Class File}
+%
+% \begin{macrocode}
+%<*style>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{autofilo}
+ [1997/12/05 12:14:08 2.4 Filofax page outlines (Frank Bennett)]
+% \end{macrocode}
+% We need a boolean to process our sole option.
+% \begin{macrocode}
+\newif\if@usequadruplecolumn
+% \end{macrocode}
+% We provide four columns as an option. Two columns (one for
+% each side of what will be the filofax page) will be the
+% default.
+% \begin{macrocode}
+\DeclareOption{fourcolumn}{\@usequadruplecolumntrue}
+% \end{macrocode}
+% Process the option if present, and load a supporting package.
+% \begin{macrocode}
+\ProcessOptions
+\RequirePackage{lscape}
+\RequirePackage{keyval}
+% \end{macrocode}
+% Declare some variables.
+% \begin{macrocode}
+\newif\if@quadruplecolumn
+\newbox\@leftleftcolumn
+\newbox\@leftrightcolumn
+\newbox\@rightleftcolumn
+\newbox\@rightrightcolumn
+\newcount\af@punchcluster
+\newcount\af@punchgroups
+\newlength\af@interspace
+\newlength\af@intraspace
+\newlength\af@grip
+\newlength\af@punchmargin
+\newcount\af@punchsize
+\newlength\af@punchwidth
+\newlength\af@halfpunchwidth
+\newcount\af@subtempcount
+\newcount\af@tempcount
+\newlength\af@textwidth
+\newlength\af@marginrel
+\newlength\af@halftextwidth
+\newlength\af@textheight
+\newlength\af@topmargin
+\newlength\af@bottommargin
+\newcount\col@no
+\newlength\af@jawspread
+\newlength\af@halfjawspread
+\newlength\af@jawline
+% \end{macrocode}
+% We'll need a macro to turn on the four-column mode.
+% This is just a modified version of \cs{twocolumn} in
+% the \LaTeX{} distribution.
+% \begin{macrocode}
+\def\quadruplecolumn{%
+ \clearpage
+ \global\columnwidth\textwidth
+ \global\advance\columnwidth-3\columnsep
+ \global\divide\columnwidth by4\relax
+ \global\hsize\columnwidth
+ \global\linewidth\columnwidth
+ \global\@twocolumntrue
+ \global\@quadruplecolumntrue
+ \global\@firstcolumntrue
+ \col@number=4\relax}
+% \end{macrocode}
+% Catch the output routine when the new mode is in effect.
+% \begin{macrocode}
+\def \@opcol {%
+ \if@twocolumn
+ \if@quadruplecolumn
+ \@outputqdrplcol
+ \else
+ \@outputdblcol
+ \fi
+ \else
+ \@outputpage
+ \fi
+ \global \@mparbottom \z@ \global \@textfloatsheight \z@
+ \@floatplacement}
+% \end{macrocode}
+% Add a new output routine for the new mode, and a modified
+% version of the two-column output routine. Note that these
+% work \textit{only} inside the \texttt{landscape} environment.
+% \begin{macrocode}
+\def\@outputqdrplcol{%
+ \ifcase\col@no
+ \global\@firstcolumnfalse
+ \global \setbox\@leftleftcolumn \box\@outputbox
+ \or
+ \global \setbox\@leftrightcolumn \box\@outputbox
+ \or
+ \global \setbox\@rightleftcolumn \box\@outputbox
+ \or
+ \global \@firstcolumntrue
+ \global\setbox\@rightrightcolumn\box\@outputbox
+ \setbox\@outputbox \vbox to\textwidth{%
+ \hb@xt@\textheight {%
+ \vrule height\columnwidth depth0pt width0pt
+ \box\@rightrightcolumn \hss}%
+ \vfill
+ \hrule \@width\columnseprule
+ \vfill
+ \hb@xt@\textheight {%
+ \vrule height\columnwidth depth0pt width0pt
+ \box\@rightleftcolumn \hss}%
+ \vfill
+ \hrule \@width\columnseprule
+ \vfill
+ \hb@xt@\textheight {%
+ \vrule height\columnwidth depth0pt width0pt
+ \box\@leftrightcolumn \hss}%
+ \vfill
+ \hrule \@width\columnseprule
+ \vfill
+ \hb@xt@\textheight {%
+ \box\@leftleftcolumn \hss}%
+ }%
+ \@combinedblfloats
+ \@outputpage
+ \begingroup
+ \@dblfloatplacement
+ \@startdblcolumn
+ \@whilesw\if@fcolmade \fi
+ {\@outputpage
+ \@startdblcolumn}%
+ \endgroup
+ \fi
+ \global\advance\col@no by1\relax
+ \ifnum\col@no=4\relax\global\col@no=0\fi}
+\def\@outputdblcol{%
+ \if@firstcolumn
+ \global \@firstcolumnfalse
+ \global \setbox\@leftcolumn \box\@outputbox
+ \else
+ \global \@firstcolumntrue
+ \setbox\@outputbox \vbox to\textwidth{%
+ \hbox to\textheight{%
+ \box\@outputbox}%
+ \vfil
+ \hrule \@width\columnseprule
+ \vfil
+ \hbox to\textheight{%
+ \box\@leftcolumn}}%
+ \@combinedblfloats
+ \@outputpage
+ \begingroup
+ \@dblfloatplacement
+ \@startdblcolumn
+ \@whilesw\if@fcolmade \fi
+ {\@outputpage
+ \@startdblcolumn}%
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% We use circles to make punchmarks.
+% When making circles, \TeX{} will put the center of the
+% circle at point, but consume horizontal space equal
+% to the full diameter of the circle. To compensate,
+% we need to skip forward by radius, and back again
+% after laying each circle.
+% \begin{macrocode}
+\def\af@circle{\hbox{\hskip\af@halfpunchwidth%
+ \ifnum\af@jawspread>0\relax%
+ \hskip-\af@halfjawspread%
+ \hskip-\af@jawline%
+ \vrule depth\af@halfpunchwidth%
+ height\af@halfpunchwidth%
+ width\af@jawline%
+ \hskip\af@halfjawspread%
+ \else%
+ \vrule depth\af@halfpunchwidth%
+ height\af@halfpunchwidth%
+ width0pt%
+ \fi%
+ \circle{\af@punchsize}%
+ \hskip-\af@punchwidth%
+ \ifnum\af@jawspread>0\relax%
+ \hskip\af@halfjawspread%
+ \vrule depth\af@halfpunchwidth%
+ height\af@halfpunchwidth
+ width\af@jawline%
+ \hskip-\af@halfjawspread%
+ \hskip-\af@jawline%
+ \fi%
+ \hskip-\af@halfpunchwidth}}
+% \end{macrocode}
+% We define a looping command that lays down a cluster
+% of circles. Grouping allows this loop to be nested
+% in another.
+% \begin{macrocode}
+\def\af@group{%
+ \bgroup%
+ \af@tempcount=0%
+ \af@circle%
+ \loop\advance\af@tempcount by1\relax%
+ \ifnum\af@tempcount<\af@punchcluster%
+ \hskip\af@intraspace\relax\af@circle%
+ \repeat%
+ \egroup}
+% \end{macrocode}
+% We define a command that lays down a set of clusters
+% (groups).
+% \begin{macrocode}
+\def\af@circles{%
+ \af@tempcount=0\relax%
+ \af@group%
+ \loop\advance\af@tempcount by1\relax%
+ \ifnum\af@tempcount<\af@punchgroups%
+ \hskip\af@interspace\relax\af@group%
+ \repeat%
+ \af@tempcount=0}
+% \end{macrocode}
+% The following command creates a set of punchmarks.
+% \begin{macrocode}
+\def\af@punches{%
+ \hbox to\af@textheight{\hfil\af@circles\hskip\af@halfpunchwidth\relax\hfil}}
+% \end{macrocode}
+% The following creates a frame. The model was lifted from the "geometry"
+% package.
+% \begin{macrocode}
+\def\@@@innerframe{%
+ \moveright-\af@topmargin%
+ \vbox to 0pt{%
+ \vskip\topmargin%
+ \vbox to0pt{\hrule width\af@textheight\vss}%
+ \hbox to\af@textheight{\llap{\vrule height\af@textwidth}%
+ \hfil\vrule height\af@textwidth}%
+ \vskip-\af@halftextwidth%
+ \vbox to0pt{\hrule width\af@textheight\vss}%
+ \vskip-\af@halftextwidth%
+ \vskip\af@grip%
+ \nointerlineskip\af@punches\nointerlineskip%
+ \vskip-\af@punchwidth%
+ \vskip-\af@grip%
+ \vskip\af@textwidth%
+ \vskip-\af@punchwidth%
+ \vskip-\af@grip%
+ \nointerlineskip\af@punches\nointerlineskip%
+ \vskip\af@grip%
+ \vbox to0pt{\hrule width\af@textheight\vss}%
+ \vss}}%
+% \end{macrocode}
+% A further modification of the output routine,
+% this time to put the frame in place. This, too, is
+% lifted from "geometry". It has been modified only
+% slightly, but we drop \LaTeX 2.09 support altogether.
+% \begin{macrocode}
+\newif\if@latextwoe
+\@ifundefined{if@compatibility}{\@latextwoefalse}{\@latextwoetrue}
+\if@latextwoe
+\def\@outputpage{%
+\begingroup % the \endgroup is put in by \aftergroup
+ \let \protect \noexpand
+ \@resetactivechars
+ \let\-\@dischyph
+ \let\'\@acci\let\`\@accii\let\=\@acciii
+ \let\\\@normalcr
+ \let\par\@@par %% 15 Sep 87
+ \shipout \vbox{%
+ \set@typeset@protect
+ \aftergroup \endgroup
+ \aftergroup \set@typeset@protect
+ \if@specialpage
+ \global\@specialpagefalse\@nameuse{ps@\@specialstyle}%
+ \fi
+ \if@twoside
+ \ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot
+ \let\@themargin\oddsidemargin
+ \else \let\@thehead\@evenhead
+ \let\@thefoot\@evenfoot \let\@themargin\evensidemargin
+ \fi
+ \fi
+ \reset@font
+ \normalsize
+ \baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@
+ \@begindvi
+ \moveright\@themargin %<<<<<<<<<<<<<<<<<<<<< added
+ \vtop{\@@@innerframe %<<<<<<<<<<<<<<<<<<<<< added
+ \vskip \topmargin
+ \vskip \af@marginrel
+% \moveright\@themargin \vbox OPENBRACE %<<<<<<<<<<<< original
+ \moveright\af@topmargin% <<<<<<<<<<<< Bennett
+ \vbox{% %<<<<<<<<<<<<<<<<<<<<< modified
+ \setbox\@tempboxa \vbox to\headheight{%
+ \vfil
+ \color@hbox
+ \normalcolor
+ \hb@xt@\textwidth {%
+ \let \label \@gobble
+ \let \index \@gobble
+ \let \glossary \@gobble %% 21 Jun 91
+ \@thehead
+ }%
+ \color@endbox
+ }% %% 22 Feb 87
+ \dp\@tempboxa \z@
+ \box\@tempboxa
+ \vskip \headsep
+ \box\@outputbox
+ \baselineskip \footskip
+ \color@hbox
+ \normalcolor
+ \hb@xt@\textwidth{%
+ \let \label \@gobble
+ \let \index \@gobble %% 22 Feb 87
+ \let \glossary \@gobble %% 21 Jun 91
+ \@thefoot
+ }%
+ \color@endbox
+ }}%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< One more close bracket added
+ }%
+\global \@colht \textheight
+\stepcounter{page}%
+\let\firstmark\botmark
+}
+\else
+\message{Sorry, autofilo.sty works only with LaTeX2e}
+\fi
+% \end{macrocode}
+% Set some global parameters.
+% \begin{macrocode}
+\headheight=0pt
+\headsep=0pt
+\footskip=0pt
+\marginparwidth=0pt
+\marginparsep=0pt
+\pagestyle{empty}
+\parindent=0pt
+\raggedbottom
+\columnseprule=0.0pt%
+\raggedright
+% \end{macrocode}
+% Some option definitions.
+% \begin{macrocode}
+\define@key{opt}{pageheight}{%
+ \af@textheight=#1\relax}
+\define@key{opt}{pagewidth}{%
+ \af@halftextwidth=#1\relax}
+\define@key{opt}{columnsep}{%
+ \columnsep=#1\relax}
+\define@key{opt}{punchcluster}{%
+ \af@punchcluster=#1}
+\define@key{opt}{punchgroups}{%
+ \af@punchgroups=#1}
+\define@key{opt}{interspace}{%
+ \af@interspace=#1}
+\define@key{opt}{intraspace}{%
+ \af@intraspace=#1}
+\define@key{opt}{grip}{%
+ \af@grip=#1}
+\define@key{opt}{punchmargin}{%
+ \af@punchmargin=#1}
+\define@key{opt}{punchpoints}{%
+ \af@punchsize=#1}
+\define@key{opt}{topspace}{%
+ \af@topmargin=#1}
+\define@key{opt}{bottomspace}{%
+ \af@bottommargin=#1}
+\define@key{opt}{jawspread}{%
+ \af@jawspread=#1}
+\define@key{opt}{jawline}{%
+ \af@jawline=#1}
+% \end{macrocode}
+% The default values for the options.
+% \begin{macrocode}
+\af@textheight=172mm
+\af@halftextwidth=95mm
+\columnsep=14pt
+\af@punchcluster=3
+\af@punchgroups=2
+\af@interspace=51.25mm
+\af@intraspace=19.25mm
+\af@grip=5mm
+\af@punchmargin=2mm
+\af@punchsize=15
+\af@topmargin=2pt
+\af@bottommargin=0pt\relax
+\af@jawline=0.4pt%
+% \end{macrocode}
+% The remaining dimensions must be calculated inside
+% the landscape environment. We define that now.
+% \begin{macrocode}
+\def\autofilo#1{%
+ \setkeys{opt}{#1}%
+ \oddsidemargin=-1in\relax%
+ \af@textwidth\paperwidth%
+ \advance\af@textwidth by-\af@textheight%
+ \divide\af@textwidth by2\relax%
+ \advance\oddsidemargin by\af@textwidth%
+ \evensidemargin=-1in\relax%
+ \advance\evensidemargin by\af@textwidth%
+ \topmargin=-1in\relax%
+ \af@textwidth\paperheight%
+ \advance\af@textwidth by-\af@halftextwidth%
+ \advance\af@textwidth by-\af@halftextwidth%
+ \divide\af@textwidth by2\relax%
+ \advance\topmargin by\af@textwidth\relax%
+ \landscape%
+ \af@halfjawspread\af@jawspread%
+ \divide\af@halfjawspread by2\relax%
+ \af@punchwidth=\af@punchsize pt%
+ \af@halfpunchwidth\af@punchwidth%
+ \divide\af@halfpunchwidth by2%
+ \textheight\af@textheight%
+ \advance\textheight by-\af@topmargin%
+ \advance\textheight by-\af@bottommargin%
+ \af@textwidth\af@halftextwidth%
+ \multiply\af@textwidth by2\relax%
+ \textwidth=\af@textwidth%
+ \advance\textwidth by-2\af@punchwidth%
+ \advance\textwidth by-2\af@grip%
+ \advance\textwidth by-2\af@punchmargin%
+ \af@marginrel\af@grip%
+ \advance\af@marginrel by\af@punchmargin%
+ \advance\af@marginrel by\af@punchwidth%
+ \vsize\textheight%
+ \hsize\textwidth%
+ \@colroom\vsize%
+ \@colht\vsize%
+ \if@usequadruplecolumn%
+ \quadruplecolumn%
+ \else%
+ \twocolumn%
+ \fi}
+% \end{macrocode}
+% The end of the environment is a simple thing.
+% \begin{macrocode}
+\def\endautofilo{%
+ \endlandscape}
+%</style>
+% \end{macrocode}
+% \Finale \PrintChanges
+
+
+
+
+
diff --git a/Master/texmf-dist/source/latex/calendar/bigdemo.tgz b/Master/texmf-dist/source/latex/calendar/bigdemo.tgz
new file mode 100644
index 00000000000..4f130a83493
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/bigdemo.tgz
Binary files differ
diff --git a/Master/texmf-dist/source/latex/calendar/caldemos.dtx b/Master/texmf-dist/source/latex/calendar/caldemos.dtx
new file mode 100644
index 00000000000..6947f02f599
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/caldemos.dtx
@@ -0,0 +1,212 @@
+%\iffalse
+%
+% file: demos.dtx
+% 1996-1997 by Frank Bennett. All rights reserved.
+%
+% Unlike the rest of the files in this package, these files
+% can be freely modified in any way you like.
+%
+%\fi
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{caldemos.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \CheckSum{70}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% caldemos.dtx,v
+% Revision 2.4 1998/01/16 21:23:26 root
+% *** empty log message ***
+%
+% Revision 2.3 1997/11/26 11:14:51 bennett
+% *** empty log message ***
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.3 1997/11/06 09:36:41 root
+% Eliminated list inclusions from demoyrly.texx
+%
+% Revision 2.1.1.2 1997/11/04 14:47:18 root
+% Fixed pinpoint dates in "every other" demo (if I remember this
+% one correctly).
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 15:15:52 bennett
+% Release code.
+%
+% Revision 1.2 1997/10/29 20:05:06 bennett
+% *** empty log message ***
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \StopEventually{\PrintIndex}
+%
+% \begin{macrocode}
+%<*evntlist>
+\documentclass{article}
+\usepackage{evntlist}
+\begin{document}
+\begin{eventlist}
+ {}
+ {demolist,demoaptr,demoevtr}
+ january 1 1997 to january 3 1997
+\end{eventlist}
+\end{document}
+%</evntlist>
+%<*hlist>
+\documentclass{article}
+\usepackage{hlist}
+\begin{document}
+\begin{htmllist}
+ {outputfile=demohlst.htm}
+ {demolist,demoaptr,demoevtr}
+ january 1 1997 to january 3 1997
+\end{htmllist}
+\end{document}
+%</hlist>
+%<*hmonth>
+\documentclass{article}
+\usepackage{hmonth}
+\begin{document}
+\begin{htmlmonth}
+ {outputfile=demohmth.htm}
+ {demolist,demoaptr,demoevtr}
+ january 1997
+\end{htmlmonth}
+\end{document}
+%</hmonth>
+%<*hml>
+\documentclass{article}
+\usepackage{hml}
+\begin{document}
+\begin{htmlmonthlist}
+ {outputfile=demohml.htm}
+ {demolist,demoaptr,demoevtr}
+ january 1997
+\end{htmlmonthlist}
+\end{document}
+%</hml>
+%<*monthly>
+\documentclass[a4paper]{article}
+\usepackage{monthly}
+\usepackage{margins}
+\usepackage{lscape}
+% \usepackage{color}
+\parindent=0pt
+\begin{document}
+\margins{1.5cm}
+\begin{landscape}
+\begin{monthly}
+ {}
+ {demolist,demoaptr,demoevtr}
+ january 1997
+\end{monthly}
+\end{landscape}
+\end{document}
+%</monthly>
+%<*timesht>
+\documentclass[a4paper]{article}
+% \usepackage{color}
+\usepackage{timesht}
+\usepackage{margins}
+\begin{document}
+\margins{1.5cm}
+\begin{timesheet}
+ {leftright=3/5}
+ {demolist,demoaptr,demoevtr}
+ january 1 1997 to january 3 1997
+\end{timesheet}
+\end{document}
+%</timesht>
+%<*timetabl>
+\documentclass[a4paper]{article}
+\usepackage{timetabl}
+% \usepackage{color}
+\usepackage{margins}
+\begin{document}
+\margins{1.5cm}
+\begin{timetable}
+ {title=Our Amazing Eclectic Conference}
+ {demolist,demoaptr,demoevtr}
+ january 1 1997 to january 3 1997
+\end{timetable}
+\end{document}
+%</timetabl>
+%<*weekly>
+\documentclass[a4paper]{weekly}
+% \usepackage{color}
+\begin{document}
+\begin{weekly}
+ {}
+ {demolist,demoaptr,demoevtr}
+ january 1 1997 to january 3 1997
+\end{weekly}
+\end{document}
+%</weekly>
+%<*yearly>
+\documentclass[a4paper]{article}
+\usepackage{yearly}
+% \usepackage{color}
+\parindent=0pt\relax
+\begin{document}
+\begin{yearly}
+ {}
+ {}
+ 1997
+\end{yearly}
+\end{document}
+%</yearly>
+%<*1997>
+January 1 1997 to December 31 1997 {The year 1997}
+%</1997>
+%<*appts>
+jan 1 1997 16:00 {Nancy} [Call Nancy to confirm]
+jan 1 1997 18:00-20:00 {Dinner} [New Year Dinner]
+%</appts>
+%<*apptsr>
+range demo1997 {Current year}
+every Monday 14:00-16:00 {Monday meeting}
+every other Wednesday from 1 January 1997 10:00 {Wednesday call}
+every 3 10:00-13:00 {Koffee klatch}
+every first Tuesday 13:00-15:00 {Study group}
+%</apptsr>
+%<*demolist>
+list demoevt {A separate list of events}
+list demoapt {A separate list of appointments}
+%</demolist>
+%<*events>
+jan 1 1997 {New Year} [New Year's Day]
+%</events>
+%<*eventsr>
+range demo1997
+every Monday {Monday event}
+every other friday from 10 january 1997 {Alternate Monday}
+every 3 {Third of month}
+every first Tuesday {First Tuesday}
+%</eventsr>
+% \end{macrocode}
+% \Finale \PrintChanges
+
+
diff --git a/Master/texmf-dist/source/latex/calendar/calendar.dtx b/Master/texmf-dist/source/latex/calendar/calendar.dtx
new file mode 100644
index 00000000000..827b8752f1b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/calendar.dtx
@@ -0,0 +1,1975 @@
+%\iffalse
+%
+% File calendar.dtx
+% Copyright (C) 1996, 1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author(s) in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make Calendar a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk
+%
+%<*dtx>
+ \ProvidesFile{calendar.dtx}
+%</dtx>
+%<style>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<style>\ProvidesPackage{calendar}
+%<style> [1998/01/17 18:14:52 3.1.1.1 Calendar engine (Frank Bennett)]
+% \fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:14:52}
+%
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+%\usepackage[dvips]{color}
+%\CodelineIndex
+%\EnableCrossrefs
+%\RecordChanges
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{calendar.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \changes{v0.01}{1996/11/10}{Initial Version}
+% \changes{v0.02}{1996/11/11}{Replaced \TeX{} newcount with \LaTeXe{}
+% newcounter, and changed counters accordingly.}
+% \changes{v0.02}{1996/11/11}
+% {Incorporated higher maths functions into an option declaration
+% in the main file (was loaded from a separate file in original
+% \TeX{} version.)}
+% \changes{v0.03}{1996/11/12}{Complete re-draft of recursing routines,
+% with documentation.}
+% \changes{v0.03}{1996/11/12}{Drafting of the sort engine.}
+% \changes{v0.03}{1996/11/12}{Picked up some more counters that
+% hadn't been converted to \LaTeXe format.}
+% \changes{v0.03}{1996/11/12}{Wholesale cutting of old recursing
+% and formatting routines. The package is now a background engine;
+% it knows nothing about printing anymore.}
+% \changes{v0.04}{1996/11/17}{Introduction of parsing routines
+% and reorganization of entire package.}
+% \changes{v0.05}{1996/11/25}{Completed new parsing routines and finished
+% debugging of same.}
+% \changes{v0.05}{1996/11/25}{Completed sorting routines and finished
+% debugging of same.}
+% \changes{v0.06}{1996/11/27}{Added support for indicating a range of
+% dates in an input file, and for declaring recursive entries.}
+% \changes{v0.07}{1996/11/27}{Minor alterations to make the package
+% work for the timesheets demo. Another alpha release.}
+% \changes{v0.08}{1996/11/27}{No changes to this file; but the
+% README shipped to CTAN was for Nelson Beebe's makeindex. Ah,
+% the wonders of automation...}
+% \changes{v0.09}{1996/11/29}{Added maths routines for weekly
+% and monthly recursion. Nearly finished!}
+% \changes{v0.10}{1996/11/29}{Various bug fixes.}
+% \changes{v0.10}{1996/11/29}{Added routines for handling comments
+% in CLD files. Added demonstration files and comments thereto.}
+% \changes{v0.11}{1996/12/04}{Enhanced input and parsing routine.
+% Now handles entries across multiple lines, even with par, and does
+% not make characters active outside of the parsed text.}
+% \changes{v0.11}{1996/12/04}{Provided a check to prevent multiple
+% input of data files. Necessary to provide support for groups
+% of lists.}
+% \changes{v0.11}{1996/12/06}{Further work on the initial input
+% code, to provide for groups of lists and groups of groups.
+% This portion of the code is now complete.}
+% \changes{v0.11}{1996/12/07}{Code clean-up in the date parsing
+% routine; the code must be reasonably transparent if it is
+% to be used as a general date parsing engine in the package.}
+% \changes{v0.12}{1996/12/15}{Complete redraft commenced following the
+% removal of the overword and dates code to separate
+% eponymous packages. Recursive interface macro completed and
+% first cut of debugging done. Released with the Thumbnail demo.}
+% \changes{v1.0}{1996/12/26}{Far too many changes to document here.
+% Finished through to final, hopefully stable form, and packaged
+% with demonstration sub-packages for CTAN release.}
+% \changes{v1.11}{1997/01/07}{Moved LoadClass declaration from
+% bottom of the timesht.cls file to the top, so that margin
+% adjustments would not be overwritten and options would take effect.}
+% \changes{v1.11}{1997/01/07}{Added newpage to group break in timesheets style
+% file.}
+% \changes{v1.12}{1997/01/18}{Fixed bug in the timesheets package that often caused
+% one line in any *.cld entry spanning a range of times to appear in the wrong place.
+% The ending, rather than the starting minutes of the range were used to calculate
+% the current time position within the timesheet. Oops. This bug was reported by Miroslav Novak.}
+% \changes{v1.12}{1997/01/18}{Added code to correct another infelicity pointed
+% out by Miroslav Novak; the appearance of an item description line in timesheet
+% boxes where the ending time of the range for the item
+% is the starting time of the range in the box.}
+% \changes{v1.13}{1997/01/30}{Began work on improved
+% documentation. No promises that this will happen quickly\ldots}
+% \changes{v1.13}{1997/02/01}{Added color package to timesheets demo file.}
+% \changes{v1.13}{1997/02/01}{Added reference to need for color package
+% to documentation.}
+% \changes{v1.14}{1997/02/12}{Corrected an error lurking in cal@text@init
+% (which turned out to be unused code --- the error cropped up when
+% the code was extracted for explicit invocation in the Monthly style)
+% that swallowed all event text when color was not in force, and gave
+% rise to a fatal error otherwise. Oops.}
+% \changes{v1.14}{1997/02/16}{Caught initialization of blank (but
+% non-empty) entries in \texttt{cal@print@format}.}
+% \changes{v1.14}{1997/02/20}{Cut subpackages from this file;
+% too many packages now to for this to be manageable.}
+% \changes{v1.14}{1997/02/21}{Eliminated erroneous use of
+% cal@read for inputting *.eve files.}
+% \changes{v1.14}{1997/02/21}{Eliminated extraneous argument
+% to PackageWarning.}
+% \changes{v1.14}{1997/02/21}{Added comment chars to the end
+% of exported *.eve file event entries.}
+% \changes{v1.14}{1997/02/21}{Added initalization of exception
+% list and cal@append instruction to load events drawn from
+% an *.eve file into memory. We now have phases of the moon.}
+% \changes{v1.14}{1997/02/21}{Not a change, but a note of a bug.
+% A function such as moon.cld should be allowed to dynamically
+% change a function, and have the change register in the
+% theshorttext or thelongtext macros as the function recurses.
+% But the moon.cld phases only change on export, not during
+% the first run.}
+% \changes{v1.14}{1997/02/22}{Added cal@dates@base and the
+% \texttt{z} incrementing option. This gives us vertical
+% date columns without much work. For use in a conference
+% style package for Miroslav Novak.}
+% \changes{v1.14}{1997/02/23}{Added quick but very ugly
+% patch to allow non-printing text to be dropped on DVI
+% at the beginning of a subgroup.}
+% \changes{v1.14}{1997/03/01}{Made a number of variable assignments
+% global to prevent buildup in \TeX{}'s save space. Job
+% is not finished, but reliability has improved.}
+% \changes{v1.14}{1997/03/01}{Merged a large number of changes
+% into this ".dtx" file from the "*.sty" file.}
+% \changes{v1.14}{1997/03/01}{Cut superfluous documentation
+% from this file, and edited the remainder.}
+% \changes{v1.15}{1997/03/08}{Fixed bug in \texttt{cal@@@print@items}
+% that suppressed entries for a single time falling at the top
+% of a selected range of times.}
+% \changes{v1.16}{1997/05/19}{Minor changes to pass through language
+% options to the \texttt{dates} package.}
+% \changes{v1.17}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+% \changes{v1.18}{1997/10/25}{Eliminated need for bogus entries
+% to protect against reads past end of file. }
+% \changes{v1.19}{1997/10/26}{One more cross-nesting, of \cs{cal@offset},
+% tracked down and eliminated.}
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% calendar.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:14:52 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 16:59:04 root
+% Release code
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.2 1997/11/05 12:38:40 root
+% Changed RAN to rAN.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 15:14:56 bennett
+% Release code.
+%
+% Revision 1.10 1997/11/01 14:28:10 root
+% Eliminated \enditall's from the package.
+%
+% Revision 1.9 1997/11/01 12:56:27 root
+% Added assignment to new counter \dates@range@limit.
+%
+% Revision 1.8 1997/10/31 21:56:23 root
+% Added hardwired \dates@requiremonthtrue immediately before
+% \cal@input.
+%
+% Revision 1.7 1997/10/29 20:06:34 bennett
+% *** empty log message ***
+%
+% Revision 1.6 1997/10/29 17:21:40 root
+% Further change affecting subgroup breaks?
+%
+% Revision 1.5 1997/10/29 16:52:21 root
+% Moved use of subgroup@setup to the right location (oops).
+%
+% Revision 1.4 1997/10/29 16:39:42 root
+% Added subgroup@setup to begin@subgroup, to guard against
+% starting the second and later pages of a timesheet with
+% the last time from the previous page. Thanks to Edward
+% Czilli for reporting this bug.
+%
+% Revision 1.3 1997/10/29 13:47:57 root
+% Restored date checking after discovering that it works
+% correctly if files are extracted from RCS using the -kv
+% option.
+%
+% Revision 1.2 1997/10/29 11:47:37 root
+% Eliminated optional date specification from RequirePackage{dates}
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+%
+% \title{Designer's Guide to the Calendar
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
+% \DoNotIndex{\@flushglue,\@gobble,\@input}
+% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
+% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
+% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
+% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
+% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
+% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
+% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup}
+% \DoNotIndex{\cal,\csname,\def,\documentstyle,\dospecials,\edef}
+% \DoNotIndex{\egroup}
+% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
+% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
+% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
+% \DoNotIndex{\ifcase}
+% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
+% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
+% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
+% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
+% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
+% \DoNotIndex{\strutbox}
+% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
+% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
+% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
+% \DoNotIndex{\catcode,\end,\escapechar,\frenchspacing,\glossary}
+% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
+% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
+% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
+% \DoNotIndex{\nopagebreak}
+% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
+% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
+% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
+% \DoNotIndex{\[,\{,\},\]}
+% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
+% \DoNotIndex{\baselineskip,\begin,\tw@}
+% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q}
+% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H}
+% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z}
+% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
+% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
+% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
+% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment}
+% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
+% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
+% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
+% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
+% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting}
+% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
+% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
+% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
+% \DoNotIndex{\bfdefault}
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent This package provides tools for creating
+% customized calendars using \LaTeXe.
+% \end{abstract}
+%
+%
+% \CheckSum{1460}
+%
+% \section{Overview and Exhortation}
+%
+% Think of this package as the Music Minus One
+% of the scheduling trade. It provides a standard
+% interface for drafting calendars,
+% but leaves you in control of the style and
+% content of the finished product.
+% The calendar style generator included
+% in this package can be
+% used to create simple lists of events, as well
+% as daily, weekly, monthly and yearly calendars in a variety of
+% formats. Calendars can be ground into DVI,
+% or can be exported in an arbitrary list or table formatting
+% language such as HTML, or delimited
+% ASCII text.
+% While the format of calendars is
+% pretty much up to you, all calendars created
+% using the Calendar package inherit a number of
+% useful features, among which are:
+%
+% \begin{itemize}
+% \item Access to external lists of events
+% and appointments written in a user-friendly syntax.
+% \item Selective printing of long or short descriptions of
+% events and appointments according to the list
+% from which they originate or, in the case of appointments,
+% according to their starting time.
+% \item Built-in recursive entries such as "every" "monday"
+% or "Every" "second" "Wednesday", governed by a range.
+% \item An extensible interface within list files
+% for defining calculable dates within a range
+% by reference to a mathematical formula.
+% \item ``Stopping'' of recursive entries by reference
+% to a list of holidays.
+% \item Colour-coding of lists and groups of lists
+% for the readable presentation of complex schedules.
+% Colours may be associated with individual lists,
+% or with entire groups of lists.
+% \end{itemize}
+%
+% On top of this, all calendar styles have a uniform
+% user interface. For examples, please see the
+% files included in the "styles" subdirectory
+% in or near the filespace from which you retrieved
+% this file.
+%
+% Finally, the Calendar package has the virtue of
+% being chilled, if not yet completely frozen.
+% While there will doubtless
+% be minor bug fixes and enhancements in future
+% releases, this package is intended to be a finished
+% and stable platform on which to build calendar
+% styles. It will not move out from underneath
+% your work. And if you draft a calendar style
+% and publish it on CTAN, others will be able to
+% put it straight to work on their own local lists
+% of events.
+%
+% ************
+% The documentation to this package explains how
+% to define your own calendar formats. There are many
+% possibilities, but here are a few ideas:
+%
+% \begin{itemize}
+% \item Web maintainers
+% can provide a current view of upcoming events formatted
+% with a tabular calendar at the top, the dates of
+% which are linked to events for that day.
+% \item Filofax
+% calendars can be produced which contain institutional
+% data and personal appointments on a per-user basis.
+% \item Scheduling conflicts or common free times can be identified by producing
+% concordance calendars that lay the daily schedules
+% of several members of staff alongside one another.
+% \item Timesheets with pre-printed diary entries can be
+% produced.
+% \item Consolidated academic timetables can be
+% produced.
+% \item To simplify the maintenance of lists, a
+% Web site may want to produce a forms interface
+% for the distributed creation and management of lists. This
+% task is greatly simplified by the fact that the
+% syntax for entries is flexible and human-readable.
+% \item Users at a Web site can be given direct control over
+% calendar content, by running \LaTeX{} and "dvips" from a
+% CGI behind a click-box and radio-button interface.
+% \end{itemize}
+%
+% All of these applications can be supported directly
+% by the package as it stands. All that is required
+% is to define appropriate calendar formats.
+% Classes and packages
+% that define new calendar formats contain only the
+% essential commands which define their structure.
+%
+% The source of the Calendar package and related
+% files is located in
+% the CTAN archives under:
+%
+% \begin{quote}
+% "macros/latex/contrib/supported/calendar"
+% \end{quote}
+%
+% If you design a new calendar format, please upload
+% it to the CTAN "/incoming" directory at "ftp.tex.ac.uk"
+% and send the site maintainers a note (see the file
+% "README.uploads" for their contact details) asking
+% them to place it in the "styles" subdirectory
+% of the Calendar package filespace. It is best
+% to send your calendar format as a "*.dtx" file, with
+% documentation on how to use it (see the existing
+% packages for model documentation).
+% If you design a CGI or other front-end
+% that calls on a style or manages
+% database entries, please send that as well, for placement
+% in the "tools" subdirectory. That way, anyone interested in
+% using Calendar will find everything that is available in one
+% place, and the utility of the package will be greatly
+% enhanced.
+%
+% I do not have time at present to write a
+% readable and well-presented guide to the style
+% drafting process. If you want to draft
+% your own style, your best bet is to read
+% through the commentary and code of an
+% existing calendar style, and modify it
+% to suit your needs.
+% Feel free to write me
+% on "fb@soas.ac.uk" if you have any questions
+% or comments.
+%
+%\StopEventually{\PrintIndex}
+%
+% \section{The Macros}
+%
+% The Dates and Keyval packages will be used.
+%
+% \begin{macrocode}
+%<*style>
+\DeclareOption{english}{\PassOptionsToPackage{\CurrentOption}{dates}}
+\DeclareOption{german}{\PassOptionsToPackage{\CurrentOption}{dates}}
+\ProcessOptions
+\RequirePackage{dates}[1997/10/29]
+\RequirePackage{keyval}
+% \end{macrocode}
+%
+% \subsection{The Calendar Formatter}
+%
+% \begin{macro}{\newcalendar}
+% \begin{macro}{\@newcalendar}
+%
+% This is the business end of the package. The
+% calendar-defining front end is spread across
+% two macros to allow us to use more than
+% nine arguments. The second through ninth given
+% to the first macro are stored in a macro that
+% is expanded in the second.
+%
+% (the macro defined just above newcalendar is used
+% to parse the increment field)
+%
+% \begin{macrocode}
+\def\cal@parseincrement#1#2#{%
+ \def\cal@incr{#1}%
+ \def\cal@subgroup@setup{#2}}%
+\long\def\newcalendar#1#2#3#4#5#6#7#8#9{%
+ \expandafter\def\csname cal@#1@bridge\endcsname{%
+ \def\cal@output{#2}%
+ \def\cal@first@weekday{#3}%
+ \def\cal@group@length{#4}%
+ \def\cal@subgroup@length{#5}%
+ \def\cal@item@sep@real{#6}%
+ \cal@parseincrement#7{}%
+ \def\cal@header{#8}%
+ \def\cal@footer{#9}}%
+ \@newcalendar{#1}}
+% \end{macrocode}
+%
+% This defines the start and finish macros for an
+% environment, which will be invoked using "\begin"
+% and "\end". The head macro just expands the head
+% matter, grabs its first and only argument to a
+% variable for future reference, and invokes the
+% "\dateread" command in order to read the date
+% text entered as the content of the environment.
+% The "\dateread" command will expire when it hits
+% the "\end" at the bottom of the enviroment.
+%
+% \begin{macrocode}
+\long\def\@newcalendar#1#2#3#4#5#6#7#8#9{%
+ \expandafter\def\csname#1\endcsname##1##2{%
+ #4%
+ \gdef\cal@optionslist{##1}%
+ \setkeys{opt}{##1}%
+ \gdef\cal@files{##2}%
+ \dateread{}}%
+% \end{macrocode}
+%
+% The tail macro for the environment will start
+% by setting up the starting and ending dates
+% for our calendar. Step one is to set a subrange
+% start and end (which "\dateread" sets if "to" is
+% used in the date text) if none is found. The
+% second step is to set the current date to be the
+% start of the subrange derived from the date text,
+% and generate human-readable register data for
+% future reference. We then set the overall range for
+% the calendar to the subrange dates.
+%
+% The next step is to expand the front matter given
+% in the calendar definition, after which we expand
+% the material contained in the second through ninth
+% arguments given to the first macro. Then a series
+% of other toggles and macros are defined.
+%
+% (We also set the date base, for the zigzag algorithm)
+%
+% \begin{macrocode}
+ \expandafter\def\csname end#1\endcsname{\relax%
+ \ifnum\dates@subrange@start=0%
+ \dates@subrange@start\dates@date%
+ \dates@subrange@end\dates@date%
+ \fi%
+ \global\dates@date\dates@subrange@start%
+ \caldate%
+ \cal@date@base\dates@date%
+ \cal@range@start\dates@subrange@start%
+ \cal@range@end\dates@subrange@end%
+ #5%
+ \dates@range@limit\cal@range@end%
+ \csname cal@#1@bridge\endcsname%
+ \def\cal@groupbreak{#2}%
+ \def\cal@subgroupbreak{#3}%
+ \long\def\cal@entry@sep{#6}%
+ \def\cal@item@init{#7}%
+ \def\cal@entry@init{#8}%
+ \long\def\cal@item@text{#9}%
+% \end{macrocode}
+%
+% We catch colors if the color package is not loaded.
+%
+% \begin{macrocode}
+ \@ifundefined{color}%
+ {\let\textcolor\@gobble%
+ \let\colorbox\@gobble}%
+ {}%
+% \end{macrocode
+%
+%
+% We then input the content of the event files given
+% as the argument to the environment, if any files exist
+% for processing.
+%
+% \begin{macrocode}
+ \ifcat$\cal@files$%
+ \else%
+ \dates@requiremonthtrue%
+ \dates@requiredaytrue%
+ \expandafter\cal@input\cal@files,,\end%
+ \fi%
+% \end{macrocode}
+%
+% Then we sort everything.
+%
+% \begin{macrocode}
+ \cal@sorts%
+% \end{macrocode}
+%
+% We set the date to the bottom of the range again,
+% and set the registers.
+%
+% \begin{macrocode}
+ \global\dates@date\cal@range@start%
+ \caldate%
+% \end{macrocode}
+%
+% Finally, we produce the calendar text.
+%
+% \begin{macrocode}
+ \cal@top}}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Input and Export for Event Lists}
+%
+% \begin{macro}{\cal@input}
+% \begin{macro}{\cal@append}
+% \begin{macro}{\cal@list@append}
+% \begin{macro}{\cal@list@init}
+% \begin{macro}{\cal@read}
+%
+% This is the input routine. It starts by setting
+% up to loop itself. Then it checks to see if the
+% list is empty, and sets up to quit if it is.
+% If there is an item in the list, it first
+% puts the remainder of the items onto the list for
+% future reference. Then the input file is defined
+% to be the first item. Then it checks to see
+% if a freeze file exists. If it does, it is input,
+% and the data file is ignored. The engine number
+% counter is also incremented. If the file does not
+% exist, we check for a list file. If one is found,
+% we increment the engine counter, and turn off
+% freezing --- this will be turned on in the file
+% itself if a request is found there. Then we
+% just input the file for scanning. We follow the
+% text in the file with a meaningless entry as
+% a buffer, and a command that shuts off the
+% macro that gobbles up entries.
+%
+% \begin{macrocode}
+\def\cal@check@colon#1:#2#{%
+ \def\dates@arg@a{#1}%
+ \def\dates@arg@b{#2}}
+\def\cal@input#1,#2,\end{%
+ \ifcat$#1$%
+ \let\cal@input@next\relax%
+ \global\let\cal@files\relax%
+ \else%
+ \advance\cal@engine by 1%
+ \cal@check@colon#1:{}%
+ \ifcat$\dates@arg@b$%
+ \expandafter\edef\csname cal@\the\cal@engine @color\endcsname{}%
+ \xdef\cal@color{}%
+ \else%
+ \expandafter\dates@strip@colon\dates@arg@b%
+ \expandafter\edef%
+ \csname cal@\the\cal@engine @color\endcsname{\dates@arg@b}%
+ \gdef\cal@color{:\dates@arg@b}%
+ \fi%
+ \xdef\cal@input@file{\dates@arg@a}%
+ \let\cal@input@next\cal@input%
+ \xdef\cal@files{#2,,\noexpand\end}%
+ \IfFileExists{\cal@input@file.eve}%
+ {\PackageWarning{Calendar}%
+ {Using freeze file \cal@input@file.eve}%
+ \expandafter\ifx\csname\cal@input@file @cal@engine\endcsname%
+ \relax%
+ \@@input\cal@input@file.eve\relax%
+ \fi}%
+ {\IfFileExists{\cal@input@file.cld}%
+ {\expandafter\ifx%
+ \csname\cal@input@file @cal@engine\endcsname%
+ \relax%
+ \cal@dofreezefalse%
+ \gdef\cal@exceptionlist{}%
+ \expandafter\cal@read%
+ \@@input\cal@input@file.cld\relax{}%
+ \ifcal@dofreeze%
+ \immediate\closeout\cal@freeze@file%
+ \fi%
+ \fi}%
+ {\@missingfileerror{\cal@input@file}{cld}}}%
+ \fi%
+ \expandafter\edef%
+ \csname\cal@input@file @cal@engine\endcsname{\the\cal@engine}%
+ \expandafter\cal@input@next\cal@files}
+\def\cal@input@next@default{\expandafter\cal@input@clone\cal@files}
+% \end{macrocode}
+%
+% This is the handler used to put date information
+% into memory and, optionally, to write data to
+% a freeze file. The chain of nested conditions
+% is explained step by step.
+%
+% \begin{macrocode}
+\def\cal@append{%
+% \end{macrocode}
+%
+% \textit{If we are looking at a list of holidays, we build
+% an exceptions list only.}
+%
+% \begin{macrocode}
+ \ifcal@holidays%
+ \cal@except%
+% \end{macrocode}
+%
+% \textit{Otherwise we are looking at dates for use in the calendar.
+% We check first for a matching exception date, and block all
+% action if one is found ("\cal@checkexception" sets the condition
+% that follows).}
+%
+% \begin{macrocode}
+ \else%
+ \cal@checkexception%
+ \ifcal@useentry%
+% \end{macrocode}
+%
+% \textit{If we are working on a range file, export to a freeze file
+% is blocked.}
+%
+% \begin{macrocode}
+ \ifcal@noexport%
+% \end{macrocode}
+%
+% \textit{We only export to a freeze file if specifically requested
+% to do so. But if freezing is requested, we export all non-range
+% items, regardless of the range used for the calendar.}
+%
+% \begin{macrocode}
+ \else%
+ \ifcal@dofreeze%
+ \cal@freeze%
+ \fi%
+ \fi%
+% \end{macrocode}
+%
+% \textit{The remainder of our conditions pertain to the loading of
+% data into memory. Range data is loaded, but only once,
+% so we use a separate condition to block action here.}
+%
+% \begin{macrocode}
+ \ifcal@noload%
+ \else%
+% \end{macrocode}
+%
+% \textit{If the current date is outside the range for
+% Memory store is only performed
+% for items within our overall date range for this
+% calendar. Having this data in memory
+% would do no affirmative harm, but it is dead weight
+% since we'll not be using it.}
+%
+% \begin{macrocode}
+ \ifnum\dates@date<\cal@range@start%
+ \else%
+ \ifnum\dates@date>\cal@range@end%
+ \else%
+ \cal@list@init{events}%
+ \cal@list@init{appointments}\relax%
+% \end{macrocode}
+%
+% \textit{We build separate lists for events and appointments.}
+%
+% \begin{macrocode}
+ \ifnum\dates@time@start=0%
+ \cal@list@append{events}%
+ \else%
+ \cal@list@append{appointments}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi}
+% \end{macrocode}
+%
+% This appends to the selected list type for the
+% current date. It grabs the list content, if any,
+% to a register. Then it defines the list to be
+% itself plus the new set of details.
+%
+% \begin{macrocode}
+\def\cal@list@append#1{%
+ \cal@reg@a=%
+ \expandafter\expandafter\expandafter{%
+ \csname\the\dates@date @#1\endcsname}%
+ \cal@reg@b\expandafter{\theshorttext}%
+ \cal@reg@c\expandafter{\thelongtext}%
+ \expandafter\edef%
+ \csname\the\dates@date @#1\endcsname{%
+ \the\cal@reg@a%
+ \noexpand\cal@delim%
+ {\the\dates@time@start}%
+ {\the\dates@time@end}%
+% \end{macrocode}
+%
+% The no-export toggle is set whenever the ends of a range are being
+% loaded. We use that here to fiddle the engine number for
+% these entries. This is necessary to prevent color from being
+% applied to them.
+%
+% \begin{macrocode}
+ {\ifcal@noexport%
+ 0%
+ \else%
+ \the\cal@engine%
+ \fi}%
+ {\the\cal@reg@b}%
+ {\the\cal@reg@c}}}%
+% \end{macrocode}
+%
+% This is the list initializer. We first
+% check to see if there is an existing
+% list, and initialize it if it is new.
+%
+% \begin{macrocode}
+\def\cal@list@init#1{%
+ \expandafter\ifx%
+ \csname\the\dates@date @#1\endcsname%
+ \relax%
+ \expandafter\def%
+ \csname\the\dates@date @#1\endcsname%
+ {}%
+ \fi}
+% \end{macrocode}
+%
+% This is the file scanner. The input handler
+% can be redefined. The default at start-up is
+% to handle list files by putting them into memory.
+%
+% \begin{macrocode}
+\def\cal@read{%
+ \dateread{\cal@append}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Sorting Routines}
+%
+% \begin{macro}{\cal@sorts}
+% \begin{macro}{\cal@@sorts}
+% \begin{macro}{\cal@@sorts@exit}
+% \begin{macro}{\cal@@sort@init}
+%
+% This is the front end for sorting all items in
+% memory. We step through the range day by day,
+% and execute the sort routine on any lists that
+% are found. One could avoid processing the empty
+% days by loading all items into a single list, but
+% a linear sort on a large number of items can be
+% very slow, both because the work done in a linear
+% sort grows geometrically, and because the sorting
+% alogorithm requires more comparisons.
+% On balance, this is a faster approach
+% in most cases.
+%
+% We start by setting the date to be the start of
+% the range, and do a "\let" that will set up
+% recursion in the next macro in the chain. We then
+% execute that macro.
+%
+% \begin{macrocode}
+\def\cal@sorts{%
+ \global\dates@date\cal@range@start%
+ \let\cal@@sorts@next\cal@@sorts%
+ \cal@@sorts}
+% \end{macrocode}
+%
+% The following will die when we hit the end of the range.
+% Otherwise, it will look to see if there is something
+% in a list for the current date in the events or appointment
+% macros, and execute a sort of each if required.
+%
+% \begin{macrocode}
+\def\cal@@sorts{\relax%
+ \ifnum\dates@date>\cal@range@end%
+ \let\cal@@sorts@next\cal@@sorts@exit%
+ \else%
+ \expandafter\ifx%
+ \csname\the\dates@date @events\endcsname\relax%
+ \else%
+ \cal@sort{\the\dates@date @events}%
+ \fi%
+ \expandafter\ifx%
+ \csname\the\dates@date @appointments\endcsname\relax%
+ \else%
+ \cal@sort{\the\dates@date @appointments}%
+ \fi%
+ \global\advance\dates@date by 1%
+ \fi%
+ \cal@@sorts@next}
+% \end{macrocode}
+%
+% When we finish all of the sorting work, we restore the date
+% to the start of the range, and we're ready to make a calendar!
+%
+% \begin{macrocode}
+\def\cal@@sorts@exit{%
+ \global\dates@date\cal@range@start%
+ \caldate}
+% \end{macrocode}
+%
+% This is used to initialize a list for sorting. It
+% simply appends an entry with a time of minus one
+% to the end of the primary working list.
+%
+% \begin{macrocode}
+\def\cal@sort@init{%
+ \cal@sort@A=-1%
+ \cal@sort@B=0%
+ \cal@sort@C=0%
+ \cal@sort@D{}%
+ \cal@sort@E{}%
+ \global\let\cal@sort@new\cal@sort@list%
+ \cal@appendright%
+ \let\cal@sort@list\cal@sort@new%
+ \gdef\cal@sort@new{}%
+ \cal@sort@passonetrue}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cal@sort}
+% \begin{macro}{\cal@@sort}
+% \begin{macro}{\cal@appendright}
+% \begin{macro}{\cal@sort@swap}
+%
+% This is the front end for sorting individual lists
+% of items. It takes a single
+% list macro name as its argument, invokes sorting on that
+% list macro, and sets it to be the sorted form. The sorting
+% setup here is designed to be easy to follow. It is probably
+% not the most efficient way of sorting, but the size of lists
+% is small (probably about ten items at the upper end),
+% so speed is not really an issue.
+%
+% The name of the list is given as text, to keep the code
+% where this is invoked more easily readable.
+%
+% \begin{macrocode}
+\def\cal@sort#1{%
+ \expandafter\let\expandafter\cal@sort@list\csname#1\endcsname%
+ \cal@sort@init%
+ \global\let\cal@delim\cal@@sort%
+ \cal@sort@list%
+ \expandafter\let\csname#1\endcsname\cal@sort@new}
+% \end{macrocode}
+% This is the sort engine itself. Our data in memory consists of
+% a list macro in groups of five items each. We will
+% use this list under the name of "\cal@sort@list", and a working
+% sort list for export under the name of "\cal@sort@new".
+%
+% We begin
+% by grabbing the items to registers.
+%
+% \begin{macrocode}
+\def\cal@@sort#1#2#3#4#5{%
+ \cal@sort@a=#1%
+ \cal@sort@b=#2%
+ \cal@sort@c=#3%
+ \cal@sort@d{#4}%
+ \cal@sort@e{#5}%
+% \end{macrocode}
+%
+% Our default action is to do nothing when we finish
+% with each sorting comparison; processing will be passed
+% to the next delimited item in the list.
+%
+% \begin{macrocode}
+ \let\cal@@sort@next\relax%
+% \end{macrocode}
+%
+% Every list for sorting is assumed to end in an entry with a
+% time of minus one. When this is encountered, we export
+% the last held item, and just expire if there was no change
+% in the list.
+%
+% set the new list to be "\cal@sort@list", or we perform
+% some actions to prepare for rerunning the list.
+%
+% \begin{macrocode}
+ \ifnum\cal@sort@a=-1\relax%
+ \message{.}%
+% \cal@sort@swap% ... ?
+ \cal@appendright%
+ \ifcal@nosortchange%
+% \end{macrocode}
+%
+% If we are to rerun the list, we reset the change toggle
+% and the pass toggle. Then we export the held item,
+% swap, and export the existing end-of-list marker.
+% Then we set next to be the new list, and blank the
+% new list to prevent geometric progression.
+%
+% \begin{macrocode}
+ \else%
+ \cal@nosortchangetrue%
+ \cal@sort@passonetrue%
+% \cal@appendright%
+ \cal@sort@swap%
+ \cal@appendright%
+ \let\cal@@sort@next\cal@sort@new%
+ \gdef\cal@sort@new{}%
+ \fi%
+% \end{macrocode}
+%
+% If are not at the end of the list, we start here.
+% If this is the first pass, we do nothing. Otherwise
+% we perform a series of comparisons.
+%
+% \begin{macrocode}
+ \else%
+ \ifcal@sort@passone%
+ \else%
+% \end{macrocode}
+%
+% The time held is larger than the existing time.
+% We need to change the order of the list, so we say so.
+% We swap and export the smaller item.
+%
+% \begin{macrocode}
+ \ifnum\cal@sort@A>\cal@sort@a\relax%
+ \cal@nosortchangefalse%
+ \cal@sort@swap%
+ \cal@appendright%
+% \end{macrocode}
+%
+% The time held is less than or equal to the existing time.\footnote{We also
+% need to keep engine numbers in sequence. But the
+% engine held must be less than the existing engine
+% because they are loaded in sequence. We therefore
+% do not need to check the next level.}
+% \changes{1996/12/25}{v1.2}{Cut out a check for equal
+% values in the sort comparison, and eliminated an erroneous
+% swap action.}
+%
+% \begin{macrocode}
+ \else%
+% \ifnum\cal@sort@A=\cal@sort@a\relax%
+ \cal@appendright%
+% \begin{macrocode}
+%
+% The time held was less than the existing time.
+%
+% \begin{macrocode}
+% \else%
+% \cal@appendright%
+% \fi%
+ \fi%
+ \fi%
+% \end{macrocode}
+%
+% Swap registers. The current small registers were not exported
+% to the new list, and are used as the large registers in the
+% next pass.
+%
+% \begin{macrocode}
+ \cal@sort@swap%
+ \cal@sort@passonefalse%
+ \fi%
+ \cal@@sort@next}
+% \end{macrocode}
+%
+% This simply appends to the end of the export list.
+%
+% \begin{macrocode}
+\def\cal@appendright{%
+ \cal@reg@a\expandafter{\cal@sort@new}%
+ \xdef\cal@sort@new{%
+ \the\cal@reg@a%
+ \noexpand\cal@delim%
+ {\the\cal@sort@A}%
+ {\the\cal@sort@B}%
+ {\the\cal@sort@C}%
+ {\the\cal@sort@D}%
+ {\the\cal@sort@E}}}
+% \end{macrocode}
+%
+% This swaps the large and small registers (trust me).
+%
+% \begin{macrocode}
+\def\cal@sort@swap{%
+ \cal@count@a\cal@sort@a%
+ \cal@sort@a\cal@sort@A%
+ \cal@sort@A\cal@count@a%
+ \cal@count@a\cal@sort@b%
+ \cal@sort@b\cal@sort@B%
+ \cal@sort@B\cal@count@a%
+ \cal@count@a\cal@sort@c%
+ \cal@sort@c\cal@sort@C%
+ \cal@sort@C\cal@count@a%
+ \cal@reg@a\expandafter{\the\cal@sort@d}%
+ \cal@sort@d\expandafter{\the\cal@sort@D}%
+ \cal@sort@D\expandafter{\the\cal@reg@a}%
+ \cal@reg@a\expandafter{\the\cal@sort@e}%
+ \cal@sort@e\expandafter{\the\cal@sort@E}%
+ \cal@sort@E\expandafter{\the\cal@reg@a}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The Calendar Generator}
+%
+% The following is run at the start of table generation only.
+% After adjusting the global range for the table,
+% it sets up the limiting counters for lines and groups.
+% It also sets up a counter that tracks the number of items
+% in a line and another that tracks the number of items
+% in a group,
+% and sets counters indicating the day on which
+% each line will start and finish. It then outputs the
+% headers and chains to the first macro in the loop.
+%
+% \begin{macrocode}
+\def\cal@top{\relax%
+ \ifnum\tracingdates>0%
+ \message{^^J\themonth}%
+ \fi%
+ \let\cal@add@date@item\cal@add@date@item@default%
+ \advance\cal@range@end by 1%
+ \global\cal@subgroup@count0%
+ \global\cal@group@count0%
+ \cal@subgroup@len\cal@subgroup@length%
+ \advance\cal@subgroup@len by -1\relax%
+ \global\cal@group@len\cal@group@length%
+% \advance\cal@group@len by -1\relax%
+ \cal@first@weekd\cal@first@weekday\relax%
+ \ifnum\cal@first@weekd=0%
+ \cal@last@weekd=6%
+ \else%
+ \cal@last@weekd\cal@first@weekd%
+ \advance\cal@last@weekd by -1%
+ \fi%
+ \cal@subgroup@setup%
+ \cal@output{\cal@header}\cal@begin@subgroup}
+% \end{macrocode}
+%
+% The following begins every line in the table.
+% It zeros the line item counter, then
+% checks to see if we are ready to finish the table.
+% If we are not finished, it checks to see if we have
+% finished a group. If so, it puts the name of the new month
+% on the terminal, resets the line and group counters,
+% and grabs the group length afresh (this can change if,
+% say, the group is a month). It then puts down a subfooter
+% (left out in the routine that feeds into this, so that
+% nothing will intervene between it and the foot), a footer
+% and a new header. It then either pads or goes straight
+% to input, as appropriate.
+% If we are not at the end of a group, it puts down the start of a line.
+% It then either starts the padding routine or goes straight
+% to the item insertion routine.
+% If we were ready to finish,
+% it puts down a final line ending and footer, then dies.
+%
+% \begin{macrocode}
+\def\cal@begin@subgroup{%
+ \global\cal@subgroup@count=0%
+ \global\def\cal@item@sep{}%
+ \ifnum\dates@date<\cal@range@end\relax%
+ \ifnum\cal@group@count=\cal@group@len\relax%
+ \ifnum\tracingdates>0%
+ \message{^^J\themonth}%
+ \fi%
+ \global\cal@group@count=0%
+ \global\cal@group@len\cal@group@length%
+ \cal@subgroup@setup%
+ \cal@output{\cal@groupbreak}\relax%
+ \ifnum\cal@first@weekd<7%
+ \let\next\cal@pad@start%
+ \else%
+ \let\next\cal@add@date@item%
+ \fi%
+ \else%
+ \ifnum\cal@first@weekd<7\relax%
+ \let\next\cal@pad@start%
+ \else%
+ \let\next\cal@add@date@item%
+ \fi%
+ \fi%
+ \else%
+ \cal@output{\cal@footer}%
+ \let\next\relax%
+ \fi%
+ \next}
+% \end{macrocode}
+%
+% This adds a date item. It starts by checking to
+% see if we are at the end of a group. It then either
+% selects padding or a new line, as requested.
+% If this is not the end of a group, we check to see
+% if it is the end of a line. If so, it puts out a
+% subfooter, but only if we're not going to be finishing
+% the whole table. (The same treatment should be given
+% to groups, come to think of it --- so there's at least
+% one known bug here). If we're not at the end of a line,
+% we place the item separator (which might be asleep),
+% then let it wake up. This is followed by the item
+% text and updates to the date and counters.
+%
+% \begin{macrocode}
+\def\cal@add@date@item@default{\relax%
+ \ifnum\cal@group@count=\cal@group@len\relax%
+ \ifnum\cal@first@weekd<7%
+ \let\next\cal@pad@end%
+ \else%
+ \let\next\cal@begin@subgroup%
+ \fi%
+ \if\cal@incr G%
+ \global\advance\dates@date by 1%
+ \caldate%
+ \fi%
+ \if\cal@incr z%
+ \global\advance\dates@date by1%
+ \fi%
+ \else\relax%
+ \ifnum\cal@subgroup@count>\cal@subgroup@len\relax%
+ \if\cal@incr z%
+ \global\dates@date\cal@date@base%
+% \global\advance\dates@date by-1%
+ \fi%
+ \ifnum\dates@date<\cal@range@end%
+ \if\cal@incr S%
+ \global\advance\dates@date by1%
+ \caldate%
+ \fi%
+ \cal@subgroup@setup%
+ \cal@output{\cal@subgroupbreak}%
+ \fi%
+ \let\next\cal@begin@subgroup%
+ \else%
+ \cal@output{\cal@item@sep}%
+ \global\def\cal@item@sep{\cal@item@sep@real}\relax%
+ \ifnum\tracingdates>0%
+ \message{\theday}%
+ \fi%
+ \cal@item@init%
+ \cal@output{\cal@item@text}%
+ \if\cal@incr I%
+ \global\advance\dates@date by 1%
+ \caldate%
+ \fi%
+ \if\cal@incr z%
+ \global\advance\dates@date by 1%
+ \caldate%
+ \fi%
+ \global\advance\cal@subgroup@count by 1\relax%
+ \global\advance\cal@group@count by 1\relax%
+ \let\next\cal@add@date@item%
+ \fi%
+ \fi%
+ \next}
+% \end{macrocode}
+%
+% This pads out a line if the current date is later
+% than the day that should start a table.
+%
+% It then calculates an offset that will be used
+% by the padding loop, restoring the current date
+% after the figure has been determined.
+%
+% \begin{macrocode}
+\def\cal@pad@start{%
+ \cal@temp@count\dates@date%
+ \bgroup%
+ \global\cal@offset=\dates@date%
+ \prevday\cal@first@weekd%
+ \global\advance\cal@offset by -\dates@date%
+ \egroup%
+ \global\dates@date\cal@temp@count%
+ \cal@pad@@start}
+% \end{macrocode}
+%
+% This is the padding loop. It moves to the beginning of
+% the next line
+% if padding is unnecessary or has been completed,
+% putting the item separator to sleep as it does so.
+% Otherwise, it wakes up the separator,
+% puts it down, and increments
+% the group and line counters.
+%
+% \begin{macrocode}
+\def\cal@pad@@start{\relax%
+ \ifnum\cal@offset=0\relax%
+ \global\def\cal@item@sep{}%
+ \let\next\cal@add@date@item%
+ \else%
+ \global\def\cal@item@sep{\cal@item@sep@real}%
+ \cal@output{\cal@item@sep}%
+ \global\advance\cal@offset by -1\relax%
+ \global\advance\cal@subgroup@count by 1\relax%
+ \let\next\cal@pad@@start%
+ \fi%
+ \next}
+% \end{macrocode}
+%
+% This pads a line to the ending day of the week.
+% It calculates the offset,
+% being careful not to let it hit an absurd value.
+%
+% \begin{macrocode}
+\def\cal@pad@end{%
+ \cal@temp@count\dates@date%
+ \bgroup%
+ \global\cal@offset=\dates@date\relax%
+ \nextday\cal@last@weekd%
+ \advance\dates@date by -\cal@offset%
+ \global\cal@offset\dates@date\relax%
+ \ifnum\cal@offset=6%
+ \global\cal@offset=0%
+ \else%
+ \global\advance\cal@offset by 1%
+ \fi%
+ \egroup%
+ \global\dates@date\cal@temp@count%
+ \cal@pad@@end}
+% \end{macrocode}
+%
+% If the offset is zero, there is no (longer) need for
+% padding, and we go back to see if it's okay to start
+% another line. Otherwise we output an item separator
+% and iterate.
+%
+% \begin{macrocode}
+\def\cal@pad@@end{\relax%
+ \ifnum\cal@offset=0\relax%
+ \let\next\cal@begin@subgroup%
+ \else%
+ \cal@output{\cal@item@sep}%
+ \global\advance\cal@offset by -1%
+ \global\advance\cal@subgroup@count by 1\relax%
+ \let\next\cal@pad@@end%
+ \fi%
+ \next}
+% \end{macrocode}
+%
+% \subsection{Event Macros}
+%
+% The macros in this section are used to place text in the
+% finished calendar. They are used by designers with
+% the "\newcalendar" formatting macro.
+%
+%
+% We provide several macros for conditional execution
+% of text and color. The first two make rough decisions
+% about an entire list of items, and are intended for
+% use in tiny calendars in which specific text relating
+% to events is not included.
+%
+% \begin{macro}{\ifanyitem}
+%
+% This executes one of two arguments depending on whether
+% there is an event or appointment associated with the
+% current date. We'll use this for small calendars
+% on black and white printers, to boldface text
+% showing that there is something significant about
+% the date.
+%
+% \begin{macrocode}
+\def\ifanyitem#1#2{%
+ \gdef\cal@temp{#1}%
+ \expandafter\ifx%
+ \csname\the\dates@date @events\endcsname%
+ \relax%
+ \expandafter\ifx%
+ \csname\the\dates@date @appointments\endcsname%
+ \relax%
+ \gdef\cal@temp{#2}%
+ \fi%
+ \fi%
+ \let\next\cal@temp%
+ \next}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\getanycolor}
+% \begin{macro}{\get@calcolor}
+% \begin{macro}{\calcolor}
+%
+% The next extracts a colour
+% associated with a date. The color is returned in
+% "\calcolor".
+%
+% \begin{macrocode}
+\def\getanycolor{%
+ \gdef\calcolor{}%
+ \global\let\cal@delim\get@anycolor%
+ \csname\the\dates@date @events\endcsname%
+ \csname\the\dates@date @appointments\endcsname}
+% \end{macrocode}
+%
+% The following is executed on each item in the list.
+% When a color is found, we stick with that; the
+% order of lists fed to the calendar will determine
+% priority.
+% \changes{v0.12}{1996/12/21}{First attempt at color
+% coding --- it works!}
+%
+% \begin{macrocode}
+\def\get@anycolor#1#2#3#4#5{%
+ \ifcat$\calcolor$%
+ \expandafter\ifx%
+ \csname cal@#3@color\endcsname%
+ \relax%
+ \else%
+ \xdef\calcolor{\csname cal@#3@color\endcsname}%
+ \fi%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Next, we have macros for working with lists. The set here
+% sets up for the execution of a list, and dumps the list into the
+% DVI hopper. Any list found will formatted using
+% "\thecaltext", which the user may wish to redefine.
+%
+% If options are given to the command, only matching
+% entries will be printed.
+%
+% We permit the selection of
+% appointments and events by time, and
+% by engine number.\footnote{The latter feature will allow
+% the creation of concordance calendars that lay
+% schedules side by side on the page. It should be
+% possible, with minor enhancements to the Calendar
+% package itself, to produce a schedule concordance
+% that formats itself to the number of top-level lists
+% fed to it. Really terrific if you have a use for it\ldots}
+%
+% We begin by hunting for options.
+%
+% \begin{macrocode}
+\def\cal@get@events{%
+ \def\theevents{}%
+ \gdef\cal@entry@macro{\theevents}%
+ \expandafter\let%
+ \expandafter\cal@dumplist\csname\the\dates@date @events\endcsname%
+ \cal@print@items}
+\def\cal@get@appointments{%
+ \gdef\theappointments{}%
+ \gdef\cal@entry@macro{\theappointments}%
+ \expandafter\let%
+ \expandafter\cal@dumplist%
+ \csname\the\dates@date @appointments\endcsname%
+ \cal@print@items}
+\def\cal@print@items{%
+ \cal@sort@passonetrue%
+ \@ifnextchar[%
+ {\cal@@print@items}%
+ {\cal@@print@items[-1/-1]}}
+\def\cal@@print@items#1[#2/#3]{%
+ \cal@select@start=#2%
+ \cal@select@end=#3%
+ \@ifnextchar[%
+ {\cal@@@print@items}%
+ {\cal@@@print@items[-1]}}
+\def\cal@@@print@items#1[#2]{%
+ \cal@engine@limit=#2%
+ \global\let\cal@delim\cal@print@format%
+ \cal@dumplist}
+% \end{macrocode}
+%
+% I'm sure there is a more clever way to do this,
+% but I can't think of it tonight. If no value
+% is given for an option, it becomes irrelevant
+% to the decision of whether or not to print. Otherwise,
+% a match for its value is required.
+%
+% \begin{macrocode}
+\def\cal@print@format#1#2#3#4#5{\relax%
+ \ifcat$#4$%
+ \else%
+ \def\theshorttext{#4}%
+ \ifcat$#5$%
+ \let\thelongtext\theshorttext%
+ \else%
+ \def\thelongtext{#5}%
+ \fi%
+ \global\dates@time@start#1\relax%
+ \global\dates@time@end#2\relax%
+ \mod{60}\dates@time@start\cal@minutes@start%
+ \cal@hours@start\dates@three%
+ \divide\cal@hours@start by60%
+ \mod{60}\dates@time@end\cal@minutes@end%
+ \cal@hours@end\dates@three%
+ \divide\cal@hours@end by60%
+ \ifnum\cal@minutes@start<10%
+ \xdef\cal@minutes@start@mac{%
+ 0\the\cal@minutes@start}%
+ \else%
+ \xdef\cal@minutes@start@mac{%
+ \the\cal@minutes@start}%
+ \fi%
+ \ifnum\cal@minutes@end<10%
+ \xdef\cal@minutes@end@mac{%
+ 0\the\cal@minutes@end}%
+ \else%
+ \xdef\cal@minutes@end@mac{%
+ \the\cal@minutes@end}%
+ \fi%
+ \xdef\cal@appt@start@text{%
+ \the\cal@hours@start:\cal@minutes@start@mac}%
+ \xdef\cal@appt@end@text{%
+ \the\cal@hours@end:\cal@minutes@end@mac}%
+ \cal@doeventfalse%
+ \cal@doapptfalse\relax%
+ \ifnum\cal@engine@limit>-1\relax%
+ \ifnum#3=\cal@engine@limit%
+ \cal@doeventtrue%
+ \fi%
+ \else%
+ \cal@doeventtrue%
+ \fi\relax%
+ \ifnum\cal@select@start>-1\relax%
+%
+% We eliminate anything that is outside or just
+% touches the time slot we're dealing with.
+%
+ \ifnum\dates@time@start<\cal@select@end%
+ \ifnum\dates@time@end>\cal@select@start%
+ \cal@doappttrue%
+%
+% Ha! But just-touching entries that are pinpoint
+% times are okay.
+%
+ \else
+ \ifnum\dates@time@end=\cal@select@start%
+ \ifnum\dates@time@start=\dates@time@end%
+ \cal@doappttrue%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \cal@doappttrue%
+ \fi%
+ \ifcal@doappt%
+ \ifcal@doevent%
+ \xdef\calcolor{\csname cal@#3@color\endcsname}%
+ \ifcal@sort@passone%
+ \cal@reg@a{}%
+ \else%
+ \cal@reg@a\expandafter{\cal@entry@sep}%
+ \fi%
+ \cal@times@init%
+ \global\let\cal@textcolor\relax%
+ \cal@entry@init%
+ \global%
+ \global\let\cal@textcolor\cal@textcolor@default%
+ \cal@reg@b\expandafter{\cal@entry@text}%
+ \cal@reg@c%
+ \expandafter\expandafter%
+ \expandafter{\cal@entry@macro}%
+ \expandafter\xdef\cal@entry@macro{%
+ \the\cal@reg@c%
+ \the\cal@reg@a%
+ \the\cal@reg@b}%
+ \cal@sort@passonefalse%
+ \fi%
+ \fi%
+ \fi}
+% \end{macrocode}
+%
+% This macro is used to initialize the values of
+% text-literal macros "\thetimestart" and "\thetimeend".
+%
+% \begin{macrocode}
+\def\cal@times@init{%
+ \mod{60}\dates@time@start\dates@one%
+ \dates@three\dates@time@start%
+ \divide\dates@three by 60%
+ \ifnum\dates@one<10\relax%
+ \xdef\cal@temp{0\the\dates@one}%
+ \else%
+ \xdef\cal@temp{\the\dates@one}%
+ \fi%
+ \xdef\thetimestart{\the\dates@three:\cal@temp}%
+ \mod{60}\dates@time@end\dates@one%
+ \dates@three\dates@time@end%
+ \divide\dates@three by 60%
+ \ifnum\dates@one<10\relax%
+ \xdef\cal@temp{0\the\dates@one}%
+ \else%
+ \xdef\cal@temp{\the\dates@one}%
+ \fi%
+ \xdef\thetimeend{\the\dates@three:\cal@temp}}
+% \end{macrocode}
+%
+% And last but not least, we have the default macros used
+% to print the text. Users may want to season this one
+% to taste, but it should serve for most purposes.
+% We need to define two macros. One always goes to DVI,
+% and can contain non-printable stuff. The other goes
+% may be routed to an external file, and should only
+% contain things that expand to text, as nearly as possible.
+%
+% \begin{macrocode}
+\def\cal@textcolor@default#1#2{%
+ \@ifundefined{color}
+ {\ifcat$#1$#2\else\textbf{#2}\fi}
+ {\ifcat$#1$#2\else\textcolor{#1}{#2}\fi}}
+\global\let\cal@textcolor\cal@textcolor@default
+% \end{macrocode}
+%
+% \subsection{Parser Customizations}
+%
+% This section contains macros that are used to alter
+% the behaviour of the "\dateread" macro. Two new commands
+% are introduced, "freeze" and "range". The first sets a toggle
+% that will cause pre-processed dates to be exported to
+% a freeze file for the list being imported. The second
+% sets a range for the current import file by referring to
+% a separate import file containing the range information.
+%
+% \begin{macro}{\fremac}
+% \begin{macro}{\cal@freeze}
+% \begin{macro}{\event}
+%
+% The first set is pretty simple. Users must be cautioned, however,
+% that they should only use this macro at the \textit{top} of a
+% file to be frozen, in order to catch all of the data it contains.
+% A patch could probably be applied to kill the parser if
+% "\fremac" occurs after the first argument is read. Later, later!
+%
+% \begin{macrocode}
+\def\fremac{%
+ \immediate\openout\cal@freeze@file=\cal@input@file.eve\relax
+ \cal@dofreezetrue%
+}
+% \end{macrocode}
+%
+% The following macro is used to export text if the
+% "\cal@dofreeze" toggle is on.
+%
+% \begin{macrocode}
+{\catcode`\%=12\xdef\cal@percent{%}}
+\def\cal@freeze{%
+ \immediate\write\cal@freeze@file\relax%
+ {\string\event%
+ {\the\dates@date}%
+ {\the\dates@time@start}%
+ {\the\dates@time@end}%
+ {\theshorttext}%
+ {\thelongtext}\cal@percent}}
+% \end{macrocode}
+%
+%
+% Frozen export files contain "\event" macros, the arguments to
+% which contain frozen data. The "\event" macro loads date items
+% into memory via the same handler used to import fresh-cooked
+% data. We don't set the engine number from the file, because
+% we've already set the figure for this run.
+%
+% \begin{macrocode}
+\def\event#1#2#3#4#5{%
+ \global\dates@date=#1\relax%
+ \global\dates@time@start=#2\relax%
+ \global\dates@time@end=#3\relax%
+ \def\theshorttext{#4}%
+ \def\thelongtext{#5}%
+ \cal@append}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ranmac}
+% \begin{macro}{\cal@@@read@ranmac}
+% \begin{macro}{\cal@get@range}
+% \begin{macro}{\cal@get@@range}
+% \begin{macro}{\rANmac}
+%
+% This set of macros fetches a file containing
+% ranges (or other dates, although that would not
+% be wise) into the current file.
+% We need to snatch the word immediately following the
+% command. We do this by diverting the flow of the
+% date parsing routines, as documented in the Dates
+% package.
+%
+% \begin{macrocode}
+\def\ranmac{%
+ \global\let\dates@@@read\cal@@@read@ranmac}%
+% \end{macrocode}
+%
+% The following will grab the very next word after
+% "range", and input that file immediately, so that
+% the currently-running dates parser can pass over
+% it. We look forward for a brace; if we
+% find one, it means that the user put a braced
+% argument after the range as a comment.
+%
+% \begin{macrocode}
+\def\cal@@@read@ranmac{%
+ \global\let\dates@@@read\dates@@@read@default%
+ \@ifoverword\dates@serious@brace%
+ {\expandafter\cal@get@range\@gobble}%
+ {\cal@get@range}%
+ {\message{This can't happen.}}}
+% \end{macrocode}
+%
+% The following two macros grab the range into the
+% current parsing process. The name of the file
+% is expanded first, then the "\@@input" is expanded,
+% then the parser proceeds without knowing that
+% the text it sees came from elsewhere.
+%
+% \begin{macrocode}
+\def\cal@get@range{%
+ \cal@noexporttrue%
+ \expandafter\ifx%
+ \csname\@overword @range@loaded\endcsname%
+ \relax%
+ \expandafter\def%
+ \csname\@overword @range@loaded\endcsname{%
+ 1}%
+ \else%
+ \cal@noloadtrue%
+ \fi%
+ \IfFileExists{\@overword.cld}%
+ {\expandafter\cal@get@@range\@overword.cld rAN }%
+ {\@missingfileerror{\@overword}{cld}}}
+% \end{macrocode}
+%
+% We need a single macro that grabs stuff.
+%
+% \begin{macrocode}
+\def\cal@get@@range{%
+ \expandafter\dates@read\@@input}
+% \end{macrocode}
+%
+% We need to prevent the range data from being
+% loaded into memory multiple times. We also
+% never want to export this data to a freeze
+% file; there would be no tidy means of determining
+% which range data had been loaded and which
+% not.
+%
+% We accomplish these effects
+% by checking whether this range has been
+% loaded previously, and toggling
+% "\ifcal@noload" to true in the above
+% macro if it has. We also toggle "\ifcal@noexport"
+% to true. We then plant
+% a macro after the imported text that will
+% restore this functionality in "\cal@append".
+% An all-caps word
+% in the user text will be lower-cased, so this
+% will not cause confusion.
+%
+% In a future release, the entry of ranges directly
+% into a list file should probably be prevented;
+% freezing several lists containing a literal range
+% would introduce precisely the problem referred to
+% in the first paragraph of this comment.
+%
+% The reset for "\cal@holidays" supports the modified
+% behaviour required by the holiday option immediately
+% below.
+%
+% \begin{macrocode}
+\def\rANmac{%
+ \cal@holidaysfalse%
+ \cal@noloadfalse\cal@noexportfalse}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\holmac}
+% \begin{macro}{\cal@except}
+% \begin{macro}{\cal@checkexception}
+% \begin{macro}{\cal@@checkexception}
+%
+% Some lists should ignore entries that fall on a holiday.
+% This is a property of the list, and so is governed by
+% a list of holidays called at the top of the list itself;
+% the user writing a calendar document does not need or
+% want control over holidays.
+%
+% We accomplish this by importing a holidays list into the
+% document, using the routines above. However, we
+% modify the action for the parser so that it builds an
+% exceptions list. This action is built into the
+% "\cal@append" macro.
+%
+% \begin{macrocode}
+\def\holmac{%
+ \cal@holidaystrue%
+ \global\let\dates@@@read\cal@@@read@ranmac}%
+% \end{macrocode}
+%
+% The "\cal@append" macro will call the following macro
+% to build an exceptions list.
+%
+% \begin{macrocode}
+\def\cal@except{%
+ \cal@reg@a\expandafter{\cal@exceptionlist}%
+ \xdef\cal@exceptionlist{%
+ \noexpand\cal@delim{\the\dates@date}\the\cal@reg@a}}
+% \end{macrocode}
+%
+% This sets to false if an entry exists on the exception list,
+% otherwise true.
+%
+% \begin{macrocode}
+\def\cal@checkexception{%
+ \cal@useentrytrue%
+ \global\let\cal@delim\cal@@checkexception%
+ \cal@exceptionlist}
+% \end{macrocode}
+%
+% This sets the condition, via the above macro, by checking each
+% item in the list.
+%
+% \begin{macrocode}
+\def\cal@@checkexception#1{\relax%
+ \ifnum\dates@date=#1\relax\cal@useentryfalse\fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lismac}
+%
+% We allow nested lists. We avoid nested input by placing the
+% name of the file onto the input list, so that the input
+% routine will pick it up during tail recursion. Nonetheless
+% we want the colors of susidiary lists to be governed by
+% the color at the top level, so we put the last-defined color onto the
+% list as well.
+%
+% \begin{macrocode}
+\def\lismac{%
+ \global\let\dates@@@read\cal@pass@list}
+% \end{macrocode}
+%
+% We need a little gadget to safely extract the contents of the
+% file list.
+%
+% \begin{macrocode}
+\def\cal@grablist#1\end{%
+ \def\cal@grabbedlist{#1}}
+% \end{macrocode}
+%
+% This just does the passing and returns control to "\dates@@@read".
+%
+% \begin{macrocode}
+\def\cal@pass@list{%
+ \expandafter\cal@grablist\cal@files%
+ \global\let\dates@@@read\dates@@@read@default%
+ \@ifoverword\dates@serious@brace%
+ {\xdef\cal@files{%
+ \@overword\cal@color,\cal@grabbedlist\noexpand\end}%
+ \expandafter\dates@read\@gobble}%
+ {\message{I don't think I'm supposed to do this}%
+ \xdef\cal@files{%
+ \@overword\cal@color,\cal@grabbedlist\noexpand\end}}%
+ {\message{This can't happen}}}
+% \end{macrocode}
+%\end{macro}
+%
+% \subsection{Initializations}
+%
+% Before any of this runs, we need the following registers,
+% macros and conditionals.
+%
+% \begin{macrocode}
+\newcount\cal@first@weekd
+\newcount\cal@range@start
+\newcount\cal@range@end
+\newcount\cal@temp@count
+\newcount\cal@last@weekd
+\newcount\cal@subgroup@len
+\newcount\cal@offset
+\newcount\cal@subgroup@count
+\newcount\cal@group@count
+\newcount\cal@group@len
+\newcount\cal@engine
+\newcount\cal@engine@limit
+\newcount\cal@select@start
+\newcount\cal@select@end
+\newcount\cal@hours@start
+\newcount\cal@minutes@start
+\newcount\cal@hours@end
+\newcount\cal@minutes@end
+\newcount\tracingdates
+\tracingdates=1
+\def\cal@sort@new{}
+\newtoks\cal@reg@a
+\newtoks\cal@reg@b
+\newtoks\cal@reg@c
+\newcount\cal@sort@A
+\newcount\cal@sort@B
+\newcount\cal@sort@C
+\newtoks\cal@sort@D
+\newtoks\cal@sort@E
+\newcount\cal@sort@a
+\newcount\cal@sort@b
+\newcount\cal@sort@c
+\newtoks\cal@sort@d
+\newtoks\cal@sort@e
+\newcount\cal@count@a
+\newwrite\cal@freeze@file
+\newif\ifcal@sort@passone
+\newif\ifcal@nosortchange
+\newif\ifcal@dofreeze
+\newif\ifcal@noload
+\newif\ifcal@noexport
+\newif\ifcal@holidays
+\newif\ifcal@useentry
+\newif\ifcal@doevent
+\newif\ifcal@doappt
+\def\cal@insert#1{#1}
+\expandafter\edef\csname cal@0@color\endcsname{black}
+\def\theappointments{}
+\def\theevents{}
+\def\cal@exceptionlist{}
+\newcount\cal@date@base
+%</style>
+% \end{macrocode}
+%
+%\iffalse
+% \section{The Installation File}
+% \begin{macrocode}
+%<*installer>
+\def\batchfile{calendar.ins}
+\input docstrip.tex
+
+\keepsilent
+
+\preamble
+
+This file is part of the Calendar package.
+Copyright (C) 1996 Frank Bennett, Jr.
+All rights reserved.
+------------------------------------------
+This is a generated file.
+
+IMPORTANT NOTICE:
+
+You are not allowed to change this file. You may however copy
+this file to a file with a different name and then change the
+copy if (a) you do not charge for the modified code, (b) you
+acknowledge the author(s) in the new file, if it
+is distributed to others, and (c) you attach these same
+conditions to the new file.
+
+You are not allowed to distribute this file alone. You are not
+allowed to take money for the distribution or use of this file
+(or a changed version) except for a nominal charge for copying
+etc.
+
+You are allowed to distribute this file under the condition that
+it is distributed with all of its contents, intact.
+
+For error reports, or offers to help make Calendar a more powerful,
+friendlier, and better package, please contact me on
+`fb' at soas.ac.uk
+
+\endpreamble
+
+\postamble
+\endpostamble
+
+\generate{\file{calendar.sty} {\from{calendar.dtx}{style}}
+}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space calendar.sty}
+\Msg{*}
+\Msg{* You will also need to have the following packages}
+\Msg{* installed on your system before using this package}
+\Msg{* or printing its documentation:}
+\Msg{*}
+\Msg{* \space\space overword.dtx}
+\Msg{* \space\space dates.dtx}
+\Msg{*}
+\Msg{***********************************************************}
+
+%</installer>
+% \end{macrocode}
+%\fi
+% \Finale \PrintChanges
diff --git a/Master/texmf-dist/source/latex/calendar/dates.dtx b/Master/texmf-dist/source/latex/calendar/dates.dtx
new file mode 100644
index 00000000000..5cc1205b089
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/dates.dtx
@@ -0,0 +1,2630 @@
+%\iffalse
+%
+% File dates.dtx
+% Copyright (C) 1996, 1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author(s) in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk
+%
+%<style>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<style>\ProvidesPackage{dates}
+%<style> [1998/01/17 17:12:39 3.1 Dates parsing support (Frank Bennett)]
+%\fi
+%
+% \def\fileversion{3.1}
+% \def\filedate{1998/01/17 17:12:39}
+%
+%\iffalse
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\RecordChanges
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{dates.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \changes{v1.0}{1996/12/10}{Initial version separated from calendar.dtx}
+% \changes{v1.0}{1996/12/12}{Overhauled to provide error handling and
+% various other features}
+% \changes{v1.0}{1996/12/14}{Adapted the plain \TeX{} code for the phases
+% of the moon and used it to set it up a function item in a list. It works!}
+% \changes{v1.0}{1996/12/14}{Tidied up some sloppiness in the handling of groups.
+% No active characters now appear in braced text, and functions no longer
+% require square braces. Documentation updated to this effect.}
+% \changes{v1.0}{1996/12/15}{Modified toXmac to allow no-frills ranges.}
+% \changes{v1.1}{1996/12/21}{Added handler for multiple enditall's.}
+% \changes{v1.1}{1996/12/27}{Minor bug fixes for final release with the
+% Calendar package.}
+% \changes{v1.2}{1997/01/18}{Changed gdef of characters in capsdown to
+% plain def, so that diacritics and maths will not be screwed up
+% by calendar. Capsdown state is fixed by xdef immediately
+% before group enclosing the capsdown; definition is in force
+% only just before and just after the high-speed read of the
+% argument.}
+% \changes{v1.2}{1997/01/18}{Fixed a bug that the above fix produced
+% in the handling of function definitions.}
+% \changes{v1.3}{1997/02/17}{Added code to support recursive dates
+% falling on exactly the same day of the month in every month.
+% Perhaps such dates should be permitted to conditionally shift to a nearby
+% day in the event of a holiday. Perhaps not.}
+% \changes{v1.4}{1997/03/01}{Large number of variable made
+% global, to prevent consumption of \TeX{} save space during
+% large runs. Task not yet complete, but hardiness much
+% improved.}
+% \changes{v1.4}{1997/03/01}{Cleanup of documentation; cut out
+% all user-level instructions in favour of a cross-reference
+% to user-level packages.}
+% \changes{v1.4}{1997/03/02}{Inserted fix for broken \texttt{othmac} support.}
+% \changes{v1.5}{1997/03/06}{Added initialization \texttt{let} to
+% definition of \texttt{daymac} to fix a bug reported by Miroslav
+% Novak.}
+% \changes{v1.5}{1997/03/06}{Fixed algorithm for ending subranges
+% in recursive entries --- was ending one day too soon always.}
+% \changes{v1.6}{1997/05/19}{Added language option. Initial language
+% support covers English and Japanese.}
+% \changes{v1.6}{1997/05/20}{German support added. Thanks due to
+% Christian Horn.}
+% \changes {v1.7}{1997/06/10}{Removed Japanese option --- far too
+% cumbersome to maintain.}
+% \changes{v1.8}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+% \changes{v1.9}{1997/10/24}{Eliminated the final (touch wood!)
+% cross-nested variable bug. Should run find on small \TeX's now.}
+% \changes{v1.10}{1997/10/25}{Eliminated need for bogus entries
+% to protect against reads past end of file. }
+% \changes{v1.11}{1997/10/26}{Added support for anniversaries.}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% dates.dtx,v
+% Revision 3.1 1998/01/17 17:12:39 root
+% Release code
+%
+% Revision 2.15 1998/01/17 06:10:58 root
+% *** empty log message ***
+%
+% Revision 2.14 1998/01/17 04:54:44 root
+% *** empty log message ***
+%
+% Revision 2.13 1998/01/16 11:41:21 root
+% *** empty log message ***
+%
+% Revision 2.12 1998/01/16 11:39:57 root
+% *** empty log message ***
+%
+% Revision 2.11 1998/01/16 11:18:23 root
+% *** empty log message ***
+%
+% Revision 2.10 1998/01/16 11:00:58 root
+% *** empty log message ***
+%
+% Revision 2.9 1998/01/16 09:26:26 root
+% *** empty log message ***
+%
+% Revision 2.8 1998/01/16 09:03:04 root
+% *** empty log message ***
+%
+% Revision 2.7 1998/01/15 23:34:12 root
+% *** empty log message ***
+%
+% Revision 2.6 1998/01/15 23:30:14 root
+% *** empty log message ***
+%
+% Revision 2.5 1998/01/15 21:42:28 root
+% *** empty log message ***
+%
+% Revision 2.4 1998/01/15 21:38:26 root
+% Trivial change.
+%
+% Revision 2.3 1998/01/15 21:35:30 root
+% First shot at proper language support.
+%
+% Revision 2.2.1.1 1997/11/07 11:16:06 root
+% Eliminated \@gobble from \dates@@@read@@function.
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.22 1997/11/05 07:40:27 root
+% Confirming a string of changes implementing multi-argument
+% (aka multi-lingual) support.
+%
+% Revision 2.1.1.21 1997/11/05 07:37:09 root
+% *** empty log message ***
+%
+% Revision 2.1.1.20 1997/11/05 07:35:42 root
+% *** empty log message ***
+%
+% Revision 2.1.1.19 1997/11/05 07:19:49 root
+% *** empty log message ***
+%
+% Revision 2.1.1.18 1997/11/05 07:14:39 root
+% *** empty log message ***
+%
+% Revision 2.1.1.17 1997/11/05 07:06:09 root
+% *** empty log message ***
+%
+% Revision 2.1.1.16 1997/11/05 06:55:18 root
+% *** empty log message ***
+%
+% Revision 2.1.1.15 1997/11/05 06:46:48 root
+% *** empty log message ***
+%
+% Revision 2.1.1.14 1997/11/05 06:44:42 root
+% *** empty log message ***
+%
+% Revision 2.1.1.13 1997/11/05 06:43:27 root
+% *** empty log message ***
+%
+% Revision 2.1.1.12 1997/11/05 06:41:21 root
+% *** empty log message ***
+%
+% Revision 2.1.1.11 1997/11/05 06:37:42 root
+% Backed off from adding new macro. Trying nesting of
+% \@ifnextnparchar.
+%
+% Revision 2.1.1.10 1997/11/05 06:29:43 root
+% Added calls to new macro \@ififnextnparchar, to cope
+% with possibility of bent brace without following square
+% brace.
+%
+% Revision 2.1.1.9 1997/11/04 21:29:48 root
+% Added prototype code for picking up extra entries
+%
+% Revision 2.1.1.8 1997/11/04 19:52:15 root
+% Moved the assignment to \dates@date to the top of
+% \dates@init@weekly. Careless error.
+%
+% Revision 2.1.1.7 1997/11/04 14:57:40 root
+% Fixed local assignments of \dates@date and \dates@catch
+% accidentally included in patch code.
+%
+% Revision 2.1.1.6 1997/11/04 14:45:10 root
+% Re-applied patches to cope with the common recursive entries,
+% now that the code for "every other" has made it necessary to
+% move the assignment to \dates@date out of the common code
+% for recursive entries.
+%
+% Revision 2.1.1.5 1997/11/04 08:25:42 root
+% Fixed silly typing error in fix just applied.
+%
+% Revision 2.1.1.4 1997/11/04 08:23:08 root
+% Moved downcasing code directly into \dates@execute
+%
+% Revision 2.1.1.3 1997/11/04 07:39:27 root
+% Added missing ` to \dates@downcase
+%
+% Revision 2.1.1.2 1997/11/04 07:33:08 root
+% Eliminated \capsdown from the code, installed new routine
+% based on character constants and \cs{ifcase}.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 15:08:09 bennett
+% Release code.
+%
+% Revision 1.17.0.8 1997/11/01 14:29:11 root
+% *** empty log message ***
+%
+% Revision 1.17.0.7 1997/11/01 13:28:54 root
+% Range limit trap suspended for the present; this needs careful
+% consideration, so that the "freeze" declaration is not rendered
+% useless or unpredictable.
+%
+% Revision 1.17.0.6 1997/11/01 12:50:18 root
+% Alterations to recursion routines broke anniversaries. Rewritten.
+% Also added optional counter \dates@range@limit, which cuts off
+% recursive entries to save processing time.
+%
+% Revision 1.17.0.5 1997/11/01 11:38:52 root
+% Fixed obvious error in initialization routine before testing;
+% if the pinpoint date is greater than the beginning of the
+% subrange, we just use that as the starting point.
+%
+% Revision 1.17.0.4 1997/11/01 11:34:41 root
+% First draft of new "every other week" function. "Other"
+% invokes a terminating macro that expects a pinpoint date.
+% This is then used as the base for every-other-week jumps.
+%
+% Revision 1.17.0.3 1997/11/01 11:13:35 root
+% Moved setting of \dates@date in recursive entries from the
+% generic opener \dates@read@exit@recurse into each of the
+% alternative recursive definitions. This gives us better
+% control; it allows us to use a pinpoint date as a starting date
+% for recursive processing.
+%
+% Revision 1.17.0.2 1997/11/01 10:52:56 root
+% Incorporated fix for encounters with \end; we no longer
+% need to gobble anything after the parsed text.
+%
+% Revision 1.17.0.1 1997/11/01 06:39:29 root
+% Cut enditalls.
+%
+% Revision 1.17 1997/11/01 06:29:27 root
+% New revision branch established to play with the elimination
+% of \enditall's from the code.
+%
+% Revision 1.16 1997/10/31 21:28:07 root
+% *** empty log message ***
+%
+% Revision 1.15 1997/10/31 21:13:53 root
+% *** empty log message ***
+%
+% Revision 1.14 1997/10/31 20:47:16 root
+% Moved date-validation code from \dates@fix to
+% \dates@read@exit@default where it belongs.
+%
+% Revision 1.13 1997/10/31 19:35:20 root
+% Eliminated \message's used to trace the problem with the
+% streamlined date conversion code just introduced.
+%
+% Revision 1.12 1997/10/31 19:32:42 root
+% Fixed egregious bug involving the use of \dates@day for two
+% completely unrelated purposes. With this fix, the more
+% streamlined use of but one invocation of either \caldate or
+% \dates@fix works.
+%
+% Revision 1.11 1997/10/31 18:51:19 root
+% *** empty log message ***
+%
+% Revision 1.10 1997/10/31 18:29:43 root
+% Eliminated what appeared to be unnecessary use of
+% \dates@monthnameget from previous revision. Caused an error,
+% but this may not have been the source of that error.
+%
+% Revision 1.9 1997/10/31 18:23:06 root
+% Added \dates@getmonthname and \dates@getdayname to the definition
+% of \dates@fix. This eliminates the need for running \caldate
+% after \dates@fix, and will further reduce the processing burden.
+%
+% Revision 1.8 1997/10/31 18:01:23 root
+% Finalized changes eliminating one use of \dates@capsdown.
+% Also made further changes to documentation, and added
+% (or rather changed) the name of \dates@@@@read@function
+% and the following macro to \dates@@@read... to help make
+% things a little easier to follow.
+%
+% Revision 1.7 1997/10/31 17:39:05 root
+% Restored use of @default prefix for \dates@read. Also
+% trying the elimination of one instance of \dates@capsdown.
+% If this works, it will eliminate a great deal of clutter
+% in save space.
+%
+% Revision 1.6 1997/10/31 11:18:55 root
+% Further documentation updates and what I thought were trivial
+% changes to the code. The trivial changes seem, however, to
+% have broken the "list" declaration.
+%
+% Revision 1.5 1997/10/31 09:00:27 root
+% First phase of combing through documentation.
+%
+% Revision 1.4 1997/10/29 20:08:04 bennett
+% *** empty log message ***
+%
+% Revision 1.3 1997/10/29 13:50:13 root
+% Restored use of date checking, after discovering that it
+% works correctly if files are extracted using the -kv
+% option.
+%
+% Revision 1.2 1997/10/29 11:47:37 root
+% Eliminated optional date specification from RequirePackage{overword}
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
+% \DoNotIndex{\@flushglue,\@gobble,\@input}
+% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
+% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
+% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
+% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
+% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
+% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
+% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup}
+% \DoNotIndex{\cal,\csname,\def,\documentstyle,\dospecials,\edef}
+% \DoNotIndex{\egroup}
+% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
+% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
+% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
+% \DoNotIndex{\ifcase}
+% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
+% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
+% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
+% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
+% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
+% \DoNotIndex{\strutbox}
+% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
+% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
+% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
+% \DoNotIndex{\catcode,\end,\escapechar,\frenchspacing,\glossary}
+% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
+% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
+% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
+% \DoNotIndex{\nopagebreak}
+% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
+% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
+% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
+% \DoNotIndex{\[,\{,\},\]}
+% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
+% \DoNotIndex{\baselineskip,\begin,\tw@}
+% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q}
+% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H}
+% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z}
+% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
+% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
+% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
+% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment}
+% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
+% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
+% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
+% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
+% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting}
+% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
+% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
+% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
+% \DoNotIndex{\bfdefault}
+%
+% \title{User's Guide to the Dates package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate.}}
+%
+% \author{Frank G. Bennett, Jr.\thanks{The code contained in this file just
+% provides a smart \LaTeXe front end to
+% the \texttt{calendar} macros for \TeX{} that I
+% found on CTAN. The \TeX{} macros work quite
+% well, but lack any documentation. Their provenance is also a
+% mystery. If anyone can tell me who wrote them, I will gladly
+% include an acknowledgement in this documentation.}}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent This package provides macros for the parsing of dates
+% using \LaTeXe{}.
+% \end{abstract}
+%
+% \CheckSum{1916}
+%
+% \section{Introduction}
+%
+% This package provides a macro, "\dateread", that can
+% be used to parse date strings, either individually
+% or recursively. The macro expects a human-readable
+% syntax, which it converts into an integer (a ``long
+% date'') that can
+% be more easily used for some types of computation.
+% A set of companion macros and token registers
+% is also provided for
+% converting long dates into human-readable form.
+%
+% Dates may be specified either individually,
+% or as recursive dates within a range.
+% The human-readable syntax for two
+% types of recursive date are built
+% into the package, but an interface for writing
+% specialized extensions in native \LaTeX{} is also provided.
+% The handling of parsed dates is also within
+% user control; it is defined in a
+% single argument fed to "\dateread" when it is invoked
+% in front of a list of dates.
+%
+% This package was
+% developed as one of the building blocks of
+% the "calendar" package, but is released as a separate
+% chunk of code because the date parsing task is a function
+% discrete from the work of building a calendar from
+% constituent blocks of information (which is the
+% main task of the Calendar package proper).
+%
+% For a description of the syntax understood by
+% the parser, and examples of how it can be
+% extended, please see the Calendar package and
+% the documentation for its associated style
+% files. The documentation here is not intended
+% for end users; it is provided for reference by
+% style designers who might wish to use
+% the parser in their own packages.
+%
+% \section{Calling the Parser}
+%
+% Printing of
+% variable text (such as the text of the date) is
+% done by passing that information through to the argument
+% to the "\dateread" macro.
+% This argument is an action that will be performed
+% once after each date in the list is read. The
+% date and the description text may be included by
+% using the appropriate commands. These are:
+%
+% \begin{tabular}{ll}
+% "\theyear" & The year (four digits).\\
+% "\themonth" & The full name of the month.\\
+% "\theshortmonth" & The name of the month (3 characters).\\
+% "\themonthnumber" & The number of the month.\\
+% "\theday" & The day of the month.\\
+% "\thetimestart" & Starting time for an item.\\
+% "\thetimeend" & Ending time for an item.\\
+% "\theweekday" & The name of the day of the week.\\
+% "\theshortweekday" & Abbreviated day of the week (3 characters).\\
+% "\theshorttext" & The text describing the date.\\
+% "\thelongtext" & A longer description of the date.\\
+% "\thelongdate" & The long date (an integer).\\
+% "\thedays" & The maximum number of days this month.\\
+% \end{tabular}
+%
+% You can also call up information using lower-level
+% registers and macros that contain date-related
+% information. If you need to do this, you're
+% on your own; please have a look at the code.
+%
+% The demonstration file included in this package
+% lists dates on the terminal using the "\message"
+% command. In a more serious application, text can
+% be printed, stored to registers or boxes, or
+% sent in pre-processed form to an external file.
+%
+% The following is a valid invocation of the
+% macro:
+%
+% \begin{quote}
+% \begin{verbatim}
+% \dateread{%
+% \message{%
+% \theweekday, %
+% \theday\space%
+% \themonthname\space%
+% \theyear}}
+% %
+% % The list of dates to be parsed
+% %
+% June 15 1997 {Summer Holiday Begins}
+% September 25 1997 {Summer Holiday Ends}
+% January 1 1997 {First day of January}
+% February 18 1997 {Frank's Birthday}
+% Every Monday at 2:00 {Go to the Beach}
+% Every 20 {20th day of the month}
+% %
+% % The end of the list.
+% %
+% \relax{}
+% \end{verbatim}
+% \end{quote}
+%
+% A style package that uses the date parser
+% should of course conceal stretches of code
+% like that above from the end user. If lists
+% of dates are maintained in separate files, you
+% can do something like the following,
+%
+% \begin{quote}
+% \begin{verbatim}
+% \def\readinput{%
+% \dateread{\message{\theweekday^^J}}}
+%
+% \def\inputandread{%
+% \expandafter\readinput%
+% \@@input \filename\relax{}
+% }
+% \end{verbatim}
+% \end{quote}
+%
+% \noindent where "\filename" contains the name of a file
+% to be read. One would confirm the existence
+% of the file, then run "\inputandread".
+%
+% \section{Extending the Parser}
+%
+% \label{analyze}
+% When the parser is used in a package, it may be
+% necessary to modify its behaviour to perform
+% special actions in the course of processing.
+% For example, you may want to provide a facility
+% for setting the range in files containing
+% recursive dates from a single file so that,
+% say, an academic schedule can be moved forward
+% to the next year without a lot of typing.
+% This kind of effect can be achieved by defining a
+% word which diverts processing to a macro that
+% performs the desired action before continuing
+% to digest the list of dates.
+%
+% The flow of processing can be diverted at two
+% points:
+%
+% \begin{enumerate}
+% \item Immediately after a word is read;
+% or
+% \item Immediately after a date and its
+% text have been digested.
+% \end{enumerate}
+%
+% The parser can be
+% re-entered in any of three states:
+%
+% \begin{enumerate}
+% \item One that
+% looks for the next word in a date string;
+% \item One that digests the description text; or
+% \item One
+% that completes the processing of a date
+% entry and its text.
+% \end{enumerate}
+%
+% Each of the exit points and reentry states is
+% associated with a macro name. Diversion is
+% accomplished by defining a word that "\let"s the
+% exit macro name be the user's own macro. Reentry
+% is accomplished in the user's macro by ending
+% with the appropriate macro name. The names
+% the macros to use as exit points are,
+% in the order of the first list above:
+%
+% \begin{enumerate}
+% \item "\dates@@@read"
+% \item "\dates@read@exit"
+% \end{enumerate}
+%
+% The names of macros to use for reentry
+% states are:
+%
+% \begin{enumerate}
+% \item "\dates@@@read@default"
+% \item "\dates@@@@read@default"
+% \item "\dates@read@exit@default"
+% \end{enumerate}
+%
+% An extension therefore consists of a user-defined
+% macro, and a user-defined word that invokes
+% "\let" as appropriate. Words should be padded
+% to exactly three characters using "X", and should
+% be appended with the suffix "mac". The following
+% defines a word, "if", which sets a toggle and
+% continues parsing a date:
+%
+% \begin{quote}
+% \begin{verbatim}
+% \newif\ifusedif
+%
+% \def\myownmacro{%
+% \usediftrue%
+% \dates@@@read@default}
+%
+% \def\ifXmac{%
+% \let\dates@@@read=\myownmacro}
+% \end{verbatim}
+% \end{quote}
+%
+% This is the same method used in the package
+% itself to provide recursive dates and the
+% function entry type; see the code commentary section
+% for less trivial examples.
+%
+% \subsection{Using the Argument Text}
+%
+% When dates are read they are unsorted, so text should not
+% be exported directly by \cs{dates@action} (let alone
+% dropped on DVI)
+% unless you have a filter for sorting
+% the text after \TeX{} exits. In normal use,
+% events should be sorted and selected
+% in memory after they are read, by other code in the
+% package calling "dates.sty". The Calendar package
+% is an example of how this can be done.
+%
+%\StopEventually{\PrintIndex}
+%
+% \section{The Macros}
+%
+% \begin{macrocode}
+%<*style>
+\newcount\dates@one
+\newcount\dates@two
+\newcount\dates@langnum
+\newtoks\dates@reg@a
+\newtoks\dates@reg@b
+\newtoks\dates@reg@c
+\def\DeclareCalendarLanguage#1#2#3#4#5{
+ \advance\dates@two by1\relax%
+ \expandafter\edef\csname dates@#1@langnum\endcsname{\the\dates@two}%
+ \ifnum\dates@two=1\relax\def\dates@default@language{#1}\fi%
+ \DeclareOption{#1}{%
+ \expandafter\expandafter\expandafter%
+ \dates@langnum\csname dates@#1@langnum\endcsname\relax%
+ \dates@buildcase{1}{\theweekday}{\dates@weekd}#2{}%
+ \dates@buildcase{1}{\theshortweekday}{\dates@weekd}#3{}%
+ \dates@buildcase{0}{\themonth}{\dates@month}#4{}%
+ \dates@buildcase{0}{\theshortmonth}{\dates@month}#5{}}}
+\def\dates@buildcase#1#2#3{%
+ \dates@one=#1\relax%
+ \dates@reg@c={#3}%
+ \gdef\dates@temp@a{#2}%
+ \dates@reg@a={}%
+ \dates@reg@b={}%
+ \def\dates@temp@c{}%
+ \dates@@buildcase}
+\def\dates@@buildcase#1{%
+ \ifcat$#1$%
+ \let\next\dates@@@buildcase%
+ \else%
+ \let\next\dates@@buildcase%
+ \dates@reg@a={\or#1}%
+ \dates@reg@b=\expandafter{\dates@temp@c}%
+ \edef\dates@temp@c{\the\dates@reg@b\the\dates@reg@a}
+ \fi%
+ \next}
+\def\dates@@@buildcase{%
+ \ifnum\dates@one=0\relax%
+ \dates@reg@a=\expandafter{\dates@temp@c}%
+ \else%
+ \dates@reg@a=\expandafter\expandafter\expandafter%
+ {\expandafter\@gobble\dates@temp@c}%
+ \fi%
+ \expandafter\edef\dates@temp@a{%
+ \noexpand\ifcase\the\dates@reg@c%
+ \the\dates@reg@a%
+ \noexpand\fi}}
+% \end{macrocode}
+% Load some useful code.
+% \begin{macrocode}
+\RequirePackage{overword}[1997/10/29]
+\InputIfFileExists{dates.cfg}{}{}
+\@ifundefined{theweekday}{%
+ \DeclareCalendarLanguage{english}
+ {{Sun}{Mon}{Tue}{Wed}{Thu}{Fri}{Sat}}
+ {{Sunday}{Monday}{Tuesday}{Wednesday}{Thursday}{Friday}{Saturday}}
+ {{Jan}{Feb}{Mar}{Apr}{May}{Jun}{Jul}{Aug}{Sep}{Oct}{Nov}{Dec}}
+ {{January}{February}{March}{April}{May}{June}{July}{August}{September}
+ {October}{November}{December}}}
+ {}
+\ExecuteOptions{\dates@default@language}
+\ProcessOptions
+% \end{macrocode}
+%
+% \subsection{The Engine Core}
+%
+% \begin{macro}{\dateread}
+% The top-level interface macro \cs{dateread} starts by setting "\dates@action"
+% to be its first argument. It then initializes
+% variables that are zeroed only at the start of a run
+% of dates, and passes control to the next macro in the chain,
+% \cs{dates@read}.
+% \begin{macrocode}
+\long\gdef\dateread#1{%
+ \gdef\dates@action{#1}%
+ \gdef\dates@subranges{}%
+ \dates@subrange@start=0%
+ \dates@subrange@end=0%
+ \dates@read@default}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\date@read}
+% The next macro continues with initialization,
+% zeroing and blanking variables that need to
+% be reset each time a new date is read. The reason
+% for the \texttt{@default} extension is explained below.
+% \begin{macrocode}
+\long\gdef\dates@read@default{%
+ \global\dates@time@start=0%
+ \global\dates@time@end=0%
+ \setyear{1900}%
+ \global\dates@month=0%
+ \global\dates@day=0%
+ \global\dates@weekd@target=7%
+ \gdef\theshorttext{}%
+ \gdef\thelongtext{}%
+% \end{macrocode}
+% \textit{The action, whatever the user has chosen it to be,
+% can be suppressed by toggling the following condition,
+% but the default here (as in life) is to do things.}
+% \begin{macrocode}
+ \global\dates@suppressfalse%
+% \end{macrocode}
+% \textit{Recursive entries will define the following two macros,
+% but initially we want them to be firmly turned off.}
+% \begin{macrocode}
+ \global\let\dates@init\relax%
+ \global\let\dates@increment\relax%
+% \end{macrocode}
+% \textit{The following assignments put the parsing machinery
+% into its default state. The first and the third macros below
+% have \texttt{@default} values not to allow modification of
+% parsing behaviour at these points, but because these two
+% macros are \cs{relax}ed to bring parsing to a halt when
+% desired.}
+% \begin{macrocode}
+ \global\let\dates@read=\dates@read@default%
+ \global\let\dates@@@read=\dates@@@read@default%
+ \global\let\dates@@@@read=\dates@@@@read@default%
+ \global\let\dates@read@exit=\dates@read@exit@default%
+% \end{macrocode}
+% \textit{We open a group, and make uppercase characters active
+% locally inside it. We use an invocation of \cs{@ifnextnparchar}
+% to look for the next character. If that is \cs{end},
+% then we close the group we've just opened, and that's
+% that. This sudden-death condition will seldom be satisfied
+% (you would need an \cs{end} immediately after \cs{dateread}
+% with no intervening date, or a date complete with braced
+% argument(s) followed immediately by \cs{end}), but the condition will
+% be trapped and handled if it does occur.}
+%
+% \textit{Apart from this, we look for a match to \cs{dates@serious@brace}.
+% It will be spotted in most cases
+% by the last invocation of \cs{@ifoverword} in parsing the
+% date (re which see below). The only case in which it will
+% need to be caught here is where there is no date at all,
+% but an immediate curly brace.}
+%
+% \textit{Thus, we will almost always be proceeding
+% on the middle, ``fail'' condition to the next macro in
+% the parsing chain, \cs{dates@@read}.}
+%
+% \textit{Apart from
+% handling possible if slightly weird error conditions, this
+% look forward will close a file, if one has been opened
+% to provide the list read by \cs{dateread} (see \texttt{calendar.dtx},
+% again, for a real-world example) and its text content has
+% been exhausted.}
+% \begin{macrocode}
+ \bgroup%
+ \@ifnextnparchar\dates@serious@brace%
+ {\message{This should never happen}}%
+ {\dates@@read}%
+ {\egroup}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\date@@read}
+% We grab everything up to the next brace. This
+% will ordinarily be a single date, but it could be a
+% range as well. The text for parsing is \cs{xdef}ed,
+% after first \cs{let}ting \cs{end} \cs{relax}.
+% The \cs{relax}ed \cs{end} will expand to itself
+% (I think they call this a ``quark''?) when \cs{xdef}ed.
+% Then we end the current group, which
+% will restore the definition
+% of \cs{end}, whatever it may happen to be.
+%
+% We then place a space after the argument text to be
+% sure we have one there, and
+% run the next macro, \cs{dates@@@read}, in front of
+% it.
+% \begin{macrocode}
+\long\def\dates@@read#1#{%
+ \let\end\relax%
+ \xdef\cal@temp{#1 }%
+ \egroup%
+ \expandafter\dates@@@read\cal@temp}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\date@@@read}
+% The \cs{dates@@@read@default} macro recursively
+% picks through the argument text word by word
+% using the \cs{@ifoverword} macro provided by the
+% \texttt{overword} package. Through the subsequent macro
+% "\dates@analyze", the definitions of
+% "\dates@@@read" and of "\dates@read@exit"
+% may be altered to achieve special effects. Any hooks that
+% redefine these functions should chain to
+% their default definitions.
+%
+% The \cs{@ifoverword} macro looks for \cs{dates@serious@brace}
+% that we just placed after the scanned date string
+% between us and the curly brace.
+%
+% This is one
+% of several macros in the parsing chain that can
+% be replaced with an alternative definition to
+% accomplish special effects.
+% In this code, the default
+% definitions of such macros bear the root name with
+% suffix "@default". Special definitions bear the root name
+% with a descriptive suffix.
+% \begin{macrocode}
+\def\dates@@@read@default{%
+% \end{macrocode}
+% \textit{If this macro has been called, we carefully be
+% sure it's set as the default under the root name too.}
+% \begin{macrocode}
+ \global\let\dates@@@read\dates@@@read@default%
+ \@ifoverword\dates@serious@brace%
+% \end{macrocode}
+% \textit{If there is a match, we're at the end of the
+% string. We send the word we've collected to \cs{dates@analyze},
+% and chain to the next
+% processing macro, \cs{dates@@@@read}, when it exits.}
+% \begin{macrocode}
+ {\expandafter\dates@analyze\@overword{}%
+ \dates@@@@read}%
+% \end{macrocode}
+% \textit{If the next token after the word we have just absorbed
+% is not a brace (and not \cs{end}), then we send the
+% absorbed word to \cs{dates@analyze} and reinvoke the
+% current macro.}
+% \begin{macrocode}
+ {\expandafter\dates@analyze\@overword{}%
+ \dates@@@read}%
+% \end{macrocode}
+% \textit{If we have hit \cs{end}, we want to recover gracefully,
+% completing our work before expiring so that the \cs{end}
+% can take effect.}
+%
+% \textit{The first thing we do is send the absorbed word to
+% \cs{dates@analyze}. Then we invoke \cs{dates@read@exit} to
+% process the date (calculating the long date, and performing
+% the action specified in the argument to \cs{dateread}) ---
+% after first relaxing \cs{dates@read}, so that the
+% \cs{dates@read@exit} macro will occur only once.}
+% \begin{macrocode}
+ {\expandafter\dates@analyze\@overword{}%
+ \ifnum\dates@year>0\relax%
+ \let\dates@read\relax%
+ \dates@read@exit%
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\dates@@@@read}
+% The following will read arguments (one mandatory
+% argument in curly braces, one optional one in square
+% braces) and save them for
+% use as text descriptions applying to the date.
+% After the arguments are stored, we
+% chain to the exit routine that will perform the action
+% that the user gave to "\dateread".
+%
+% The macro is defined with a \texttt{@default} suffix,
+% not because alternative processing is to be spliced in here,
+% but because one method of ending recursive parsing
+% is to \cs{let} this macro \cs{relax}.
+%
+% The effect we want to accomplish is to allow
+% users to put any legal text, including square
+% braces, inside \textrm{either} the curly braces marking
+% the mandatory argument, \textrm{or} the square braces
+% marking the optional argument. The usual \LaTeX{} method
+% of doing this, looking for a common or garden square brace
+% with \cs{@ifnextchar} and then chaining to a
+% macro that uses square braces as delimiters,
+% will not accomplish this purpose; with that approach,
+% \textrm{any} square brace, regardless of nesting level,
+% will end the argument.
+%
+% We need instead to see square braces as grouping characters.
+% This will make them disappear when the text is expanded, but
+% at least things won't blow up.
+%
+% To get ready for the optional argument (which comes \textrm{after}
+% this macro), we set the open square brace to be a grouping
+% character like "{". We can't use this directly as an argument
+% (because \TeX{} will try to keep reading
+% text until it finds the matching brace), so we \cs{let}
+% a macro have this token's value. The \cs{let} is
+% global because the value of "{" is global.
+% Then we use the funny brace macro inside the
+% definition as a match text for a square brace. This
+% works because the \cs{@ifnextnparchar} macro also works
+% with \cs{let} (well, \cs{futurelet}, which amounts to the
+% same thing in this context), resulting in an internal
+% ``funny brace'' macro used for the comparison.
+% All of this jiggery-pokery is necessary because
+% the "\futurelet" command (used by "\@ifnextnparchar") will stamp
+% a category code on the brace when it sees it, even though
+% \TeX{} won't yet read the character itself in for processing.
+% \begin{macrocode}
+\bgroup
+ \catcode`\[=1
+ \global\let\dates@funny@brace=[
+ \catcode`\<=1
+ \global\let\dates@bent@brace=<
+\egroup
+\gdef\dates@@@@read@default#1{%
+% \end{macrocode}
+% We reset any alternative definitions that are accidentally
+% in force, and save the text of the mandatory argument
+% to its macro for future reference.
+% \begin{macrocode}
+ \global\let\dates@@@@read\dates@@@@read@default%
+ \global\let\dates@@@read\dates@@@read@default%
+ \dates@textcount1%
+ \def\theshorttext{#1}%
+ \ifnum\dates@textcount=\dates@langnum\relax%
+ \gdef\thelongtext{}%
+ \fi%
+% \end{macrocode}
+% Here is where the funny brace macro referred to above
+% comes into play. We change the catcodes so that
+% square-brace-enclosed text will be interpreted as
+% a single argument. Then we look for a brace. If
+% a brace is found, we invoke \cs{dates@@@@@read}
+% to read and store the text. If not, we cut off the
+% special category code for square braces and
+% call the macro that interprets dates (since we already
+% know that we've finished with a date, and have grabbed
+% the mandatory text. Likewise, if we see an \cs{end}
+% out there (i.e. there was a curly-brace-enclosed
+% mandatory argument right after the date, but it's
+% followed immediately by \cs{end}), we also process
+% the digested date before proceeding. Note that the
+% \cs{end} in this event will be caught by the lookahead
+% machinery at the top of the parsing chain the next time
+% around, causing macro recursion to terminate.
+% \begin{macrocode}
+ \bgroup%
+ \catcode`\[=1\catcode`\]=2\relax%
+ \catcode`\<=1\catcode`\>=2\relax%
+ \@ifnextnparchar\dates@funny@brace%
+ {\dates@@@@@read}%
+ {\global\let\thelongtext\theshorttext%
+ \@ifnextnparchar\dates@bent@brace%
+ {\dates@@@@read@bent}%
+ {\egroup%
+ \dates@read@exit}%
+ {\message{This can't happen}}}%
+ {\egroup%
+ \dates@read@exit}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\dates@@@@@read}
+% The optional argument uses bog-standard \LaTeX{}
+% option syntax. The only wrinkle is in the
+% catcode changes invoked within a group in the
+% macro above. These are cut off by an \cs{egroup} here.
+% Apart from that, we just grab the text to a macro,
+% and call the macro that does the final processing
+% of the date and text information.
+% \begin{macrocode}
+\def\dates@@@@@read#1{%
+ \egroup%
+ \ifnum\dates@textcount=1\relax
+ \gdef\thelongtext{#1}%
+ \else%
+ \ifnum\dates@textcount=\dates@langnum\relax%
+ \gdef\thelongtext{#1}%
+ \fi%
+ \fi%
+ \bgroup%
+ \catcode`\<=1\catcode`\>=2\relax%
+ \@ifnextnparchar\dates@bent@brace%
+ {\dates@@@@read@bent}%
+ {\egroup%
+ \dates@read@exit}%
+ {\egroup%
+ \dates@read@exit}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\def\dates@@@@read@bent#1{%
+ \egroup%
+ \advance\dates@textcount by1\relax%
+ \ifnum\dates@textcount=\dates@langnum\relax
+ \def\theshorttext{#1}%
+ \fi%
+ \bgroup%
+ \catcode`\[=1\catcode`\]=2\relax%
+ \catcode`\<=1\catcode`\>=2\relax%
+ \@ifnextnparchar\dates@funny@brace%
+ {\dates@@@@@read}%
+ {\ifnum\dates@textcount=\dates@langnum\relax%
+ \gdef\thelongtext{}%
+ \fi%
+ \@ifnextnparchar\dates@bent@brace%
+ {\dates@@@@read@bent}%
+ {\egroup%
+ \dates@read@exit}%
+ {\message{This can't happen}}}%
+ {\egroup%
+ \dates@read@exit}}
+% \end{macrocode}
+% \begin{macro}{\dates@read@exit}
+%
+% \begin{macrocode}
+\def\dates@read@exit@default{%
+ \dates@verify%
+ \dates@fix%
+ \dates@lastdate\dates@date%
+ \ifdates@suppress@global%
+ \else%
+ \ifdates@suppress%
+ \else%
+ \dates@action%
+ \fi%
+ \fi%
+ \dates@read}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\dates@verify}
+% This macro is used in a few places to verify whether
+% all of the necessary date information is present.
+% It uses a couple of toggles to allow different bits
+% of the address to be confirmed.
+% \begin{macrocode}
+\def\dates@verify{%
+ \ifnum\dates@month=0%
+ \ifdates@requiremonth%
+ \PackageError{dates}{Missing month.}{}%
+ \else%
+ \global\dates@month=1%
+ \fi%
+ \fi%
+ \ifnum\dates@day=0%
+ \ifdates@requireday%
+ \PackageError{dates}{Missing day of the month.}{}%
+ \else%
+ \global\dates@day=1%
+ \fi%
+ \fi%
+ \ifnum\dates@year=0\relax%
+ \PackageError{dates}{Missing year in ordinary date.}{}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Selective Handling}
+%
+% There are three points at which special handling can
+% be spliced into the parsing routine. The defaults of
+% these macros have all been presented above. Below,
+% alternative versions internal to the \texttt{dates}
+% package itself are set forth.
+%
+% The following is the default value of "\dates@read@exit".
+% It fixes the date, rationalizes the registers
+% containing human-readable date information, and
+% saves the date for future reference (i.e.~in case
+% we need it as the beginning of a range).
+% It then performs the action given by the user in the
+% argument to "\dateread", and attempts to chain back to continue
+% parsing within the presented list of dates.
+%
+% \subsubsection{Recursive Handling}
+%
+% \begin{macro}{\dates@read@exit@range}
+%
+% This is meant to be spliced into the parser immediately
+% before the macro:
+%
+% \begin{quote}
+% "\dates@read@exit@default"
+% \end{quote}
+%
+% It is invoked
+% by the word "to" in the current date entry. Invoked
+% after the text argument describing the current date
+% has been grabbed, it begins by rationalizing the machine
+% and human readable dates. It then expands the registers
+% containing the starting and ending long dates describing
+% a range into a list macro. The dates are stepped down one
+% and up one day respectively, so that a simple ">" or "<"
+% will tell us whether a given date is within a subrange.
+% The list macro will later
+% be used as a series of bounds
+% in the generation of recursive dates and dates
+% defined by a function.
+%
+% \begin{macrocode}
+\def\dates@read@exit@range{%
+ \dates@fix%
+ \dates@subrange@end\dates@date%
+ \dates@reg@a=\expandafter{\dates@subranges}%
+ \xdef\dates@subranges{%
+ \the\dates@reg@a%
+ \noexpand\delim{\the\dates@subrange@start}%
+ {\the\dates@date}}%
+ \global\let\dates@read@exit\dates@read@exit@default%
+ \dates@read@exit}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dates@read@exit@recurse}
+% \begin{macro}{\dates@read@exit@@recurse}
+% \begin{macro}{\dates@read@exit@@@recurse}
+%
+% This is the generic routine for generating dates according
+% to a recursively invoked formula. It is also intended
+% for splicing in in front of the macro:
+%
+% \begin{quote}
+% "\dates@read@exit@default"
+% \end{quote}
+%
+% The first macro in this chain checks
+% to be sure that a list of ranges exists.
+% It then defines the macro used to delimit the list
+% to something that will recurse within a subrange.
+% The list macro is then dumped into the document
+% for complete expansion. When it finishes,
+% control is passed back to the top, so that
+% reading can continue through the list of dates.
+%
+% \begin{macrocode}
+\def\dates@read@exit@recurse{%
+ \expandafter\ifcat\expandafter$\dates@subranges$%
+ \PackageError{dates}{No range given}%
+ {You need to specify a range before %
+ recursive entries and formulae}%
+ \fi\relax%
+ \ifx\dates@init\relax%
+ \ifnum\dates@day>0\relax%
+ \dates@everymonth@day\dates@day%
+ \ifnum\dates@month>0\relax%
+ \dates@everyyear@month\dates@month%
+ \global\let\dates@init\dates@init@yearly@doy%
+ \global\let\dates@increment\dates@increment@yearly@doy%
+ \else%
+ \global\let\dates@init\dates@init@monthly@dom%
+ \global\let\dates@increment\dates@increment@monthly@dom%
+ \fi%
+ \else%
+ \PackageError{dates}{Incomplete recursive entry}%
+ {You need to specify a day of the week or a day of %
+ the month or something for entries beginning with %
+ the word Every.}
+ \fi%
+ \fi%
+ \global\let\delim\dates@read@exit@@recurse%
+ \dates@subranges%
+ \dates@read}
+% \end{macrocode}
+%
+% This is the macro to which "\delim" is set above.
+% It sets up registers with the top and bottom boundaries
+% of the range, as given in the list, then sets the
+% current date to be the bottom of the range.
+% It then executes an (arbitrary) function to find
+% the first calculated date above the bottom of the range,
+% rationalizes the human-readable date registers, and
+% performs the user's requested action. It then chains to
+% the macro that will loop until the range is exceeded.
+%
+% \begin{macrocode}
+\def\dates@read@exit@@recurse#1#2{%
+ \dates@subrange@start#1\relax%
+ \dates@subrange@end#2\relax%
+% \ifnum\dates@subrange@end>\dates@range@limit%
+% \dates@subrange@end\dates@range@limit%
+% \fi%
+ \dates@init%
+ \caldate%
+ \ifdates@suppress@global%
+ \else%
+ \ifdates@suppress%
+ \else%
+ \dates@action%
+ \fi%
+ \fi%
+ \let\next\dates@read@exit@@@recurse%
+ \dates@read@exit@@@recurse}
+% \end{macrocode}
+%
+% This is the macro that does the actual recursion for recursive entries.
+% It increments, checks the date, performs the action if appropriate,
+% otherwise breaks the loop so that control can pass back to
+% "\dates@read@exit@recurse".
+%
+% \begin{macrocode}
+\def\dates@read@exit@@@recurse{%
+ \dates@increment\relax%
+ \ifnum\dates@date>\dates@subrange@end\relax%
+ \let\next\relax%
+ \else%
+ \caldate%
+ \ifdates@suppress@global%
+ \else%
+ \ifdates@suppress%
+ \else%
+ \dates@action%
+ \fi%
+ \fi%
+ \fi%
+ \next}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dates@increment@daily}
+% \begin{macrocode}
+\def\dates@increment@daily{%
+ \global\advance\dates@date by 1\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dates@init@weekly}
+% \begin{macro}{\dates@increment@weekly}
+%
+% The following is the initialization macro for weekly recursion.
+% It moves to the first instance of the targetted
+% day of the week above the bottom of the subrange.
+%
+% \begin{macrocode}
+\def\dates@init@weekly{%
+ \global\dates@date\dates@subrange@start%
+ \mod7\dates@date\dates@weekd%
+ \dates@three=\dates@weekd@target\relax%
+ \advance\dates@three by -\dates@weekd\relax%
+ \ifnum\dates@three<0\relax%
+ \advance\dates@three by7%
+ \fi%
+ \global\advance\dates@date by\dates@three\relax}
+\def\dates@init@semiweekly{%
+ \dates@verify%
+ \dates@fix%
+ \ifnum\dates@subrange@start>\dates@date%
+ \dates@ct@z\dates@subrange@start%
+ \advance\dates@ct@z by-\dates@date%
+ \mod{14}\dates@ct@z\dates@catch%
+ \global\dates@date\dates@subrange@start%
+ \global\advance\dates@date by\dates@catch%
+ \fi}
+% \end{macrocode}
+%
+% This is the increment macro used for weekly recursion.
+% It just bumps up the date seven days each time it is invoked.
+%
+% \begin{macrocode}
+\def\dates@increment@weekly{%
+ \global\advance\dates@date by7\relax}
+\def\dates@increment@semiweekly{%
+ \global\advance\dates@date by14\relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dates@init@monthly@dow}
+% \begin{macro}{\dates@increment@monthly@dow}
+%
+% The following is the general initialization macro for finding
+% an instance of a day of the week within a month. It begins
+% by setting the value of a macro with which it terminates
+% to be "\relax", in the hope that a match will be found
+% the first time it is invoked. We then move the date
+% forward, if necessary, to find the targetted day of the week.
+% When this is found, we set the human-readable register
+% information according to that long date (including the
+% day of the month). Dividing and multiplying by "7" yields
+% the largest multiple of "7" that is equal to or less than the
+% day of the month. If this is "0", we're in the first week,
+% if "7" we're in the second, and so forth. If the value
+% of the current day is too low, we move up the date.
+% If it is too high, we move to the first day
+% of the next month, and request a loop back through
+% the same routines.
+%
+% \begin{macrocode}
+\def\dates@init@monthly@dow{%
+ \global\dates@date\dates@subrange@start%
+ \dates@init@monthly@@dow}
+\def\dates@init@monthly@@dow{%
+ \let\dates@init@monthly@dow@recurse\relax%
+ \caldate%
+ \nextday\dates@weekd@target%
+ \caldate%
+ \dates@one\dates@day%
+ \divide\dates@one by 7\relax%
+ \multiply\dates@one by 7\relax%
+ \ifnum\dates@modulo>\dates@one\relax%
+ \dates@two\dates@modulo%
+ \advance\dates@two by -\dates@one%
+ \global\advance\dates@date by \dates@two%
+ \else%
+ \ifnum\dates@modulo<\dates@one\relax%
+ \dates@next@month%
+ \let\dates@init@monthly@dow@recurse\dates@init@monthly@@dow%
+ \fi%
+ \fi%
+\dates@init@monthly@dow@recurse}
+\def\dates@init@monthly@dom{%
+ \global\dates@date\dates@subrange@start%
+ \dates@init@monthly@@dom}
+\def\dates@init@monthly@@dom{%
+ \let\dates@init@monthly@dom@recurse\relax%
+ \caldate%
+ \ifnum\dates@day>\dates@everymonth@day%
+ \dates@next@month%
+ \let\dates@init@monthly@dom@recurse\dates\init@monthly@@dom%
+ \else%
+ \global\dates@day\dates@everymonth@day%
+ \dates@fix%
+ \fi%
+ \dates@init@monthly@dom@recurse}
+\def\dates@init@yearly@doy{%
+ \global\dates@date\dates@subrange@start%
+ \dates@init@yearly@@doy}
+\def\dates@init@yearly@@doy{%
+ \let\dates@init@yearly@doy@recurse\relax%
+ \caldate%
+ \dates@ct@z\dates@day@offset%
+ \global\dates@day\dates@everymonth@day%
+ \global\dates@month\dates@everyyear@month%
+ \dates@fix%
+ \ifnum\dates@ct@z>\dates@day@offset%
+ \nextyear%
+ \dates@fix%
+ \let\dates@init@yearly@doy@recurse\dates@init@yearly@@doy%
+ \fi%
+ \dates@init@yearly@doy@recurse}
+% \end{macrocode}
+%
+% This is the general incrementing macro for monthly entries.
+% It's pretty simple; we just move to the first day of the
+% next month, then run the initialization macro again to
+% find the appropriate date within the month.
+%
+% \begin{macrocode}
+\def\dates@increment@monthly@dow{%
+ \dates@next@month%
+ \dates@init@monthly@@dow}
+\def\dates@increment@monthly@dom{%
+ \dates@next@month%
+ \dates@init@monthly@@dom}
+\def\dates@increment@yearly@doy{%
+ \nextyear%
+ \global\dates@month=\dates@everyyear@month\relax%
+ \global\dates@day=\dates@everymonth@day\relax%
+ \dates@fix%
+ \dates@init@yearly@@doy}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dates@@@read@function}
+% \begin{macro}{\dates@@@read@@function}
+%
+% This is designed to be spliced into the parser
+% immediately before the macro:
+%
+% \begin{quote}
+% "\dates@@@read@default".
+% \end{quote}
+%
+% It is invoked, like the other special handling routines,
+% via the "\dates@execute" hook in the text analyzer
+% (see \ref{analyze} for details). It reads two
+% arguments immediately following the word that
+% triggers it. It stores these for reference.
+% The third argument is read after checking to be
+% sure that we have reached the end of the parsing
+% string, and are looking at the delimiter that
+% ends it. Then this is gobbled, and dumped into the
+% document so that the definitions it contains will
+% take effect. The jiggery-pokery with grouping
+% limits the effect of "\makeatletter" to the
+% scope of the braces delimiting the user's
+% function definition, while the macros he defines
+% there can be defined locally.
+%
+% This third argument should not produce any printed output, and should define,
+% at minimum, two macros, the names of which are given as
+% the first and second arguments following the invoking
+% word in the parsed text. The first of these will
+% initialize to the first date conforming to the formula,
+% counting from the bottom of a range of dates, and should
+% return a long date in "\dates@date". The second should
+% increment upward one date from a given date, also returning
+% the result in "\dates@date". The demonstration file
+% contains a sample of code which calculates the phases of
+% the moon.
+%
+% \begin{macrocode}
+\long\def\dates@@@read@function #1 #2 {%
+ \xdef\dates@init{\csname#1\endcsname}%
+ \xdef\dates@increment{\csname#2\endcsname}%
+ \@ifnextnparchar\dates@serious@brace%
+ {\bgroup%
+ \makeatletter%
+ \expandafter\dates@@@read@@function}%
+ {\PackageError%
+ {dates}%
+ {Extra text after function names}%
+ {The third argument must be in curly braces.}}%
+ {\relax}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\long\def\dates@@@read@@function#1{%
+ \long\gdef\dates@temp{#1}%
+ \egroup%
+ \dates@temp%
+ \let\dates@temp\relax%
+ \dates@@@@read@default}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The Analyzer}
+%
+% Human-readable dates are fetched word by word by
+% the above routines. The "\dates@@@read@default"
+% macro feeds individual words to the analyzer
+% described here.
+%
+% \begin{macro}{dates@analyze}
+%
+% This
+% is a pretty straightforward set of nested
+% conditions that will uniquely identify an item
+% as a month, a year, a day or a time, and respond
+% accordingly. The macro is somewhat long, so
+% comments are provided to indicate nesting
+% levels and their functions.
+%
+% \begin{macrocode}
+\long\def\dates@analyze#1#2#{%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level One] Check to see if we're dealing with a number.
+% If so, define a macro containing only zero to use in a series of
+% parsing checks.
+% \end{description}
+%
+% \begin{macrocode}
+ \ifcat\noexpand#11%
+ \def\dates@zero{0}%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level Two] Check to see if this is not a range of times.
+% \end{description}
+%
+% \begin{macrocode}
+ \expandafter\dates@check@hyphen\@overword-{}%
+ \ifx\dates@arg@b\dates@zero%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level Three] It now looks like this either a lone time or
+% an integer. Check to see if it's not a time. (We use "\@overword",
+% but it will have the same content as "\dates@arg@a").
+% \end{description}
+%
+% \begin{macrocode}
+ \expandafter\dates@check@colon\@overword:{}%
+ \ifx\dates@arg@b\dates@zero%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level Four] Alright, so it's an integer. That means it's either a year
+% or a day of the month. The instructions require a 4-digit
+% year, which is always larger than a day of the month.
+% \end{description}
+%
+% \begin{macrocode}
+ \expandafter\ifnum\@overword>31%
+ \setyear{\dates@arg@a}%
+ \else%
+ \ifnum\dates@day>0%
+ \dates@dayerror%
+ \else%
+ \global\dates@day=\dates@arg@a%
+ \fi%
+ \fi%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level Three (again)] If the item was a lone time, we set variables
+% accordingly.
+% \end{description}
+%
+% \begin{macrocode}
+ \else%
+ \expandafter\dates@strip@colon\dates@arg@b%
+ \global\dates@time@start=\dates@arg@a%
+ \global\multiply\dates@time@start by 60%
+ \global\advance\dates@time@start by \dates@arg@b%
+ \global\dates@time@end=\dates@time@start%
+ \fi%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level Two (again)] If it was a range of times, we have the
+% extremes of the range in "\dates@arg@a" and "\dates@arg@b".
+% We process each so that a colon delimiter is not required,
+% but will be recognized if given. Note the "0" in the definition
+% of "\dates@check@colon" et al., above; this produces a default of zero
+% if this is a bare number with no colon delimiter.
+%
+% We proceed by first setting aside the contents of "\dates\arg@b"
+% so that they will not be overwritten. We then check for the
+% existence of a colon and, if one is found, the trailing
+% colon left by the test macro is stripped off. We then
+% set the time.
+% \end{description}
+%
+% \begin{macrocode}
+ \else%
+ \expandafter\dates@strip@hyphen\dates@arg@b%
+ \let\dates@temp\dates@arg@b%
+ \expandafter\dates@check@colon\dates@arg@a:{}%
+ \ifx\dates@arg@b\dates@zero%
+ \else%
+ \expandafter\dates@strip@colon\dates@arg@b%
+ \fi%
+ \global\dates@time@start=\dates@arg@a\relax%
+ \global\multiply\dates@time@start by 60\relax%
+ \global\advance\dates@time@start by \dates@arg@b\relax%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level Two (continued)] We then do exactly the same thing for the second time
+% given.
+% \end{description}
+%
+% \begin{macrocode}
+ \expandafter\dates@check@colon\dates@temp:{}%
+ \ifx\dates@arg@b\dates@zero%
+ \else%
+ \expandafter\dates@strip@colon\dates@arg@b%
+ \fi%
+ \global\dates@time@end=\dates@arg@a\relax%
+ \global\multiply\dates@time@end by 60\relax%
+ \global\advance\dates@time@end by \dates@arg@b%
+ \fi%
+% \end{macrocode}
+%
+% \begin{description}
+% \item[Level one (again)] If "\dates@word" does not look like a
+% number, then it is handled as text.
+% We pass control to a macro that will
+% simply execute a macro name derived from the first three
+% characters of the word. If it's unknown chaff, it will therefore
+% effectively be ignored. This can be used as a hook
+% for defining options not included in the "dates" package
+% proper. The description of the hooks used by the
+% vanilla version of "dates" is given below.
+% \end{description}
+%
+% \begin{macrocode}
+ \else%
+ \dates@execute#1#2XXX{}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dates@execute}
+%
+% Used as the default action in the analyzer, this just blindly
+% executes a macro that may match a day, month or option
+% name. If the date string is limited by "\relax{}",
+% the macro name "\relax" will be read in as a token
+% for interpretation. To prevent unexpected results,
+% we therefore convert a leading control sequence to a string
+% within "\csname" "\endcsname". We must not give
+% the same treatment to non-control-sequence items,
+% however, because this would prevent the expansion of
+% uppercase characters, which have been read in as active
+% characters, to their lowercase counterparts. An "\ifcat"
+% is used to choose which action is appropriate. The
+% macros invoked by "\dates@execute" never take arguments,
+% so they can be expanded within the scope of "\ifcat".
+%
+% \begin{macrocode}
+\def\dates@execute#1#2#3#4#{%
+ \ifcat#1\relax%
+ \expandafter\csname%
+ \string#1#2#3mac\endcsname%
+ \else%
+ \global\dates@catch=`#1\relax
+ \global\advance\dates@catch by-65
+ \dates@reg@a=\expandafter{\ifcase\dates@catch
+ a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or
+ m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or
+ y\or z\else #1\fi}
+ \csname\the\dates@reg@a#2#3mac\endcsname%
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Fodder for the Analyzer}
+%
+% As can be gleaned from an examination of "\dates@execute",
+% a word is read by executing a macro named using
+% its first three letters. We provide definitions
+% for a number of such macros here.
+%
+% \begin{macro}{\evemac}
+%
+% "Every" sets up for recursion, and for a default of
+% incrementing over days of the week.
+%
+% \begin{macrocode}
+\def\evemac{%
+ \global\let\dates@read@exit=\dates@read@exit@recurse}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\daymac}
+%
+% The following was suggested by Miroslav Novak, hacked
+% together by Frank Bennett in January 1997, but awaited
+% final testing while the Timetable package stabilized.
+% It was reported to fail by Miroslav on 5 March 1997,
+% and a fix was put in place and released by Frank on 6 March.
+%
+% \begin{macrocode}
+\def\daymac{%
+ \global\let\dates@init=\dates@init@daily%
+ \global\let\dates@increment=\dates@increment@daily}
+\def\dates@init@daily{%
+ \global\dates@date=\dates@subrange@start}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\othmac}
+%
+% "Other" will modify the effect of "every" to
+% choose every other date within the range, beginning
+% with the specified date. The specified date need not
+% be within the range.
+% \begin{macrocode}
+\def\othmac{%
+ \global\let\dates@init=\dates@init@semiweekly%
+ \global\let\dates@increment=\dates@increment@semiweekly}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\firmac}
+% \begin{macro}{\secmac}
+% \begin{macro}{\thimac}
+%
+% "First", "second" and "third" will set a counter than controls which
+% instance of a day of the week within a month should be chosen,
+% and modifies the effect of "every" to recurse on that
+% instance within every month, within the subrange.
+% \begin{macrocode}
+\def\firmac{%
+ \dates@modulo=0%
+ \global\let\dates@init=\dates@init@monthly@dow%
+ \global\let\dates@increment=\dates@increment@monthly@dow}%
+%
+\def\secmac{%
+ \dates@modulo=7%
+ \global\let\dates@init=\dates@init@monthly@dow%
+ \global\let\dates@increment=\dates@increment@monthly@dow}%
+%
+\def\thimac{%
+ \dates@modulo=14%
+ \global\let\dates@init=\dates@init@monthly@dow%
+ \global\let\dates@increment=\dates@increment@monthly@dow}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\toXmac}
+%
+% The following responds to "to" in the parsed text. If
+% the year is zero, it sets
+% the bottom of a range to the last date encountered, and
+% lets the exit macro for processing a finished date be
+% one which will set the top of the range before performing
+% the action specified by the user.
+% If the year is greater than zero, we grab the \textit{current}
+% date, reset everything to zero, and continue parsing.
+% This permits ``no frills'' range designations, as
+% in the "calendar" package.
+%
+% The "X" is appended to
+% fill out to three characters. For reasons that I do not
+% fully understand, this was necessary to prevent the
+% package from exiting within the scope of a group.
+%
+% \begin{macrocode}
+\def\toXmac{\relax%
+ \ifnum\dates@year=0%
+ \dates@subrange@start\dates@lastdate%
+ \else%
+ \dates@fix%
+ \dates@subrange@start\dates@date%
+ \global\dates@month=0%
+ \global\dates@day=0%
+ \setyear{1900}%
+ \fi%
+ \global\let\dates@read@exit\dates@read@exit@range}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\funmac}
+%
+% The following causes a function definition to be read
+% immediately after the word "function" in the date text.
+%
+% \begin{macrocode}
+\def\funmac{%
+ \global\let\dates@read@exit=\dates@read@exit@recurse%
+ \global\let\dates@@@read=\dates@@@read@function}
+% \end{macrocode}
+% \end{macro}
+%
+% The following causes the suppression of any action
+% in respect of the entry in which it is found.
+%
+% \begin{macrocode}
+\def\remmac{%
+ \global\dates@suppresstrue}
+% \end{macrocode}
+%
+% \begin{macro}{\janmac}
+% \begin{macro}{\jancheckmac}
+%
+% The months are defined globally using a recursive engine
+% that is discarded when the macros have been defined.
+% Each month macro first sets a counter to the number of
+% days in the month, so that a range check can be performed
+% when the date is interpreted. It then checks to
+% see if a month has already been selected, and if so
+% it forces a fatal error; otherwise, the month counter
+% is set to the appropriate value.
+%
+% \begin{macrocode}
+\bgroup
+ \def\monthdata#1#2#3#4#5\end{%
+ \expandafter\gdef\csname#2#3#4mac\endcsname{%
+ \ifnum\dates@month>0%
+ \dates@montherror%
+ \else%
+ \global\dates@month=#1%
+ \fi}%
+ \ifcat$#5$\let\next\@gobble\else\let\next\monthdata\fi%
+ \next#5\end}%
+% \end{macrocode}
+%
+%
+% The following does the action generation of month macros.
+% \begin{macrocode}
+ \monthdata1jan2feb3mar4apr5may6jun%
+ 7jul8aug9sep{10}oct{11}nov{12}dec\end
+\egroup
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\monmac}
+%
+% Days of the week are specified in a similar fashion.
+%
+% \begin{macrocode}
+\bgroup
+ \def\weekdata#1#2#3#4#5\end{%
+ \expandafter\gdef\csname #2#3#4mac\endcsname{%
+ \ifnum\dates@weekd@target<7\relax%
+ \dates@weekerror%
+ \else%
+ \global\dates@weekd@target=#1\relax%
+ \ifx\dates@init\relax%
+ \global\let\dates@init\dates@init@weekly%
+ \fi%
+ \ifx\dates@increment\relax%
+ \global\let\dates@increment\dates@increment@weekly%
+ \fi%
+ \fi}%
+ \ifcat$#5$\let\next\@gobble\else\let\next\weekdata\fi%
+ \next#5\end}
+ \weekdata0sun1mon2tue3wed4thu5fri6sat\end
+\egroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dates@montherror}
+% \begin{macro}{\dates@weekerror}
+% \begin{macro}{\dates@dayerror}
+%
+% These three macros are used in the above definitions
+% to produce error messages if something is wrong
+% with a date.
+%
+% \begin{macrocode}
+\def\dates@montherror{%
+ \PackageError{dates}{Month multiply defined}{%
+ You have set the month more than once here.}}
+\def\dates@dayerror{%
+ \PackageError{dates}{Day multiply defined}{%
+ You have set the day more than once here.}}
+\def\dates@weekerror{%
+ \PackageError{dates}{Week multiply defined}{%
+ You have set the day of the week more than once here.}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Low-level Bits and Pieces}
+%
+% \begin{macro}{\dates@capsdown}
+%
+% The "\lowercase" function provided in \TeX{} does not
+% operate in \TeX{}'s mouth, and so cannot be used to
+% create lowercase strings for export to a non-DVI
+% file or for display on the terminal.
+% We can get around this problem by
+% making all upper-case characters
+% active, and defining them to lowercase themselves. The
+% operative definition is "\dates@capsdown".
+% The
+% grouping culls the bootstrapping definitions used to
+% create these macros from memory. A detailed explanation
+% these macros is not given here, but they do work.
+% Essentially, they function by looping over sets of three
+% characters, two uppercase and one lowercase, building a
+% macro ("\dates@capsdown") that will make the uppercase
+% characters in the list locally active, with the appropriate
+% definition. Two uppercase characters are required in the
+% list because on is read to identify the character so
+% that it can be made active in order, on the second read,
+% to take its active form and define it.
+%
+% \begin{macrocode}
+%<*cull>
+\bgroup
+\dates@reg@a={}
+\gdef\dates@capsdown{}
+\def\dates@capsactive#1{%
+ \ifx#1\end%
+ \let\next\relax%
+ \else%
+ \catcode`#1=13%
+ \let\next\dates@@capsactive%
+ \fi%
+ \next}
+\def\dates@@capsactive#1#2{%
+ \dates@reg=\expandafter{%
+ \dates@capsdown\catcode`#1=13\def#1{#2}}%
+ \xdef\dates@capsdown{\the\dates@reg}%
+ \let\next\dates@capsactive%
+ \next}
+\dates@capsactive%
+ AAaBBbCCcDDdEEeFFfGGgHHhIIiJJjKKk%
+ LLlMMmNNnOOoPPpQQqRRrSSsTTtUUuVVv%
+ WWwXXxYYyZZz\end
+\egroup
+%</cull>
+% \end{macrocode}
+% \end{macro}
+%
+% For parsing strings, we use some little
+% macros to identify strings that have a colon in
+% them (which will be assumed to be a time)
+% or a hyphen (assumed to be a range of times),
+% and to strip those off where necessary.
+%
+% \begin{macrocode}
+\def\dates@check@colon#1:#2#{%
+ \def\dates@arg@a{#1}%
+ \def\dates@arg@b{0#2}}
+\def\dates@strip@colon#1:{%
+ \def\dates@arg@b{#1}}
+\def\dates@check@hyphen#1-#2#{%
+ \def\dates@arg@a{#1}%
+ \def\dates@arg@b{0#2}}
+\def\dates@strip@hyphen#1-{%
+ \def\dates@arg@b{#1}}
+% \end{macrocode}
+%
+% The following macro is used to terminate
+% processing.
+%
+% \begin{macrocode}
+\expandafter\expandafter\expandafter\def%
+ \expandafter\csname%
+ \string\relaxXXmac\endcsname{%
+ \global\let\dates@@@@read\relax}
+% \end{macrocode}
+%
+%
+%
+% \subsection{Interface Macros for Date Info}
+%
+% \begin{macro}{\theyear}
+% \begin{macro}{\themonth}
+% \begin{macro}{\theshortmonth}
+% \begin{macro}{\themonthnumber}
+% \begin{macro}{\theday}
+% \begin{macro}{\theweekday}
+% \begin{macro}{\theshortweekday}
+% \begin{macro}{\thelongdate}
+% \begin{macro}{\themonthdays}
+% \begin{macro}{\theshorttext}
+% \begin{macro}{\thelongtext}
+%
+% \label{interface} These macros can be used to include date information
+% in the text fed to "\dateread". They do not contain
+% unprintable operations, and so can be used to display
+% text on the terminal as well as in a document. All
+% are updated from the long date by the "\caldate" command.
+% The macros "\theshorttext" and "\thelongtext" are
+% defined elsewhere on the fly; token registers cannot
+% be used for these because they must be allowed to
+% expand fully on the terminal.
+%
+% \begin{macrocode}
+\def\theyear{\the\dates@year@full}
+% \def\themonth{\the\dates@monthname}
+% \def\theshortmonth{\the\dates@monthname}
+\def\themonthnumber{\the\dates@month}
+\def\theday{\the\dates@day}
+% \def\theweekday{\the\dates@dayname}
+% \def\theshortweekday{\the\dates@shortweekday}
+\def\thelongdate{\the\dates@date}
+\def\themonthdays{\the\dates@days}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Maths Functions for Dates}
+%
+% The following code is an almost direct rip-off of the
+% "calendar" macros for plain \TeX{} that are stored on
+% CTAN. If anyone knows who the author is, I will be happy
+% to include a credit here. I have made scant effort
+% to document the code, but it works well.
+%
+% \begin{macro}{\setyear}
+%
+% Set the current year.
+%
+% \begin{macrocode}
+\def\setyear#1{\dates@year=#1%
+ \advance\dates@year by -1900\calculateyearbase}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nextyear}
+%
+% Advance by one year
+%
+% \begin{macrocode}
+\def\nextyear{\advance\dates@year by1%
+ \calculateyearbase}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dates@next@month}
+% Advance by one month.
+%
+% \begin{macrocode}
+\def\dates@next@month{%
+ \ifnum\dates@month=12%
+ \advance\dates@year by 1\calculateyearbase%
+ \global\dates@month=1%
+ \global\dates@day=1%
+ \else%
+ \global\advance\dates@month by 1%
+ \global\dates@day=1%
+ \fi%
+ \dates@fix}
+% \end{macrocode}
+% \end{macro}
+%
+% Set the current time zone.
+%
+% \begin{macro}{\settimezone}
+% \begin{macrocode}
+\def\settimezone#1{\dates@timezone=#1%
+ \multiply\dates@timezone by 1000%
+ \divide\dates@timezone by24}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\calculateyearbase}
+%
+% Set the "\ifleapyear" toggle. Set "\dates@yearbase" to the number of
+% days passed from 1900, Jan 0 to New year's date in the target year.
+%
+% \begin{macrocode}
+\def\calculateyearbase{%
+ \global\dates@yearbase=-1%
+ {\dates@ct@z=\dates@year\divide\dates@ct@z by4%
+ \multiply\dates@ct@z by4\relax%
+ \ifnum\dates@year=\dates@ct@z%
+ \global\dates@catch=0%
+ \else%
+ \global\dates@catch=1%
+ \fi}%
+ \ifcase\dates@catch \leapyeartrue\or%
+ \leapyearfalse\fi%
+ {\dates@ct@z=\dates@year\multiply\dates@ct@z%
+ by1461\advance\dates@ct@z by3%
+ \divide\dates@ct@z by4%
+ \global\dates@catch=\dates@ct@z}%
+ \global\advance\dates@yearbase by\dates@catch\relax%
+ \ifnum\dates@year=0\global\dates@yearbase=0\leapyearfalse\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\monthdays}
+%
+% Set the number of days passed at the end of each month in "\dates@day".
+%
+% \begin{macrocode}
+\def\monthdays{%
+\global\dates@catch\ifcase\dates@month%
+ 0\or31\or%
+ 59\or90\or120\or151\or181\or212\or%
+ 243\or273\or304\or334\or365\fi%
+ {\ifleapyear\ifnum\dates@month>1%
+ \global\advance\dates@catch by1\fi\fi}%
+% ??????????? ************ global okay here?
+ \global\dates@day@offset=\dates@catch}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dates@fix}
+%
+% Return the long date of "\dates@month", "\dates@day" in the year "\dates@year"
+% in "\dates@date" after checking to be sure that the month and the day
+% have been set, if confirmation has been toggled on, and that
+% the number of days
+% in the month conforms to the constraints of reality.
+%
+% This can now be invoked by itself; there is no need to follow
+% it with \cs{caldate}.
+% \begin{macrocode}
+\def\dates@fix{%
+ \dates@year@get%
+ \dates@monthname@get%
+ \ifnum\dates@days<\dates@day%
+ \PackageError{dates}{Day of month out of range}{%
+ There are only \the\dates@days\space days in %
+ \themonth, but you have tried^^J%
+ to specify \the\dates@day.}%
+ \else%
+ \global\dates@date=\dates@day{\advance\dates@month by-1%
+ \monthdays%
+ \global\advance\dates@date by\dates@day@offset%
+ \global\advance\dates@date by\dates@yearbase}%
+ \fi%
+ \dates@dayname@get}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mod}
+%
+% Long date "MOD 7" will give the week day.
+% Sunday is "0" and Saturday is "6". The base
+% number is returned in "\dates@three",
+% the mod in "#3".
+%
+% \begin{macrocode}
+\def\mod#1#2#3{\dates@three=#2\relax%
+ \dates@four=\dates@three%
+ \divide\dates@three by#1%
+ \multiply\dates@three by#1%
+\advance\dates@four by-\dates@three%
+ #3=\dates@four}
+
+\def\dates@year@get{%
+ \global\dates@year@full\dates@year%
+ \global\advance\dates@year@full by 1900\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\theweekday}
+%
+% Set the names of week day (Local).
+%
+% \begin{macrocode}
+\def\dates@dayname@get{\mod7\dates@date\dates@weekd}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caldate}
+%
+% Gives the usual calendar date for
+% a long date in counter "\dates@date".
+% Returned in "\dates@day", "\dates@month" and "\dates@year"
+% and other registers. See the interface macros above
+% under \ref{interface}.
+%
+% \begin{macrocode}
+\def\caldate{\dates@year=\dates@date%
+ \multiply\dates@year by4\divide\dates@year by1461%
+ \calculateyearbase%
+ {\advance\dates@date by-\dates@yearbase\global\dates@month=0%
+ \loop\monthdays\ifnum\dates@day@offset<\dates@date%
+ \global\advance\dates@month by1\repeat%
+ {\advance\dates@month by-1\monthdays%
+ \advance\dates@date by-\dates@day@offset%
+ \global\dates@day=\dates@date}}%
+ \dates@year@get%
+ \dates@monthname@get%
+ \dates@dayname@get}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dates@monthname@get}
+%
+% This stores the names of the months to registers.
+% It is run by "\caldate". The definition here
+% is performed in the alternative, depending upon
+% the value of the "\dates@language" counter. This
+% counter is set in the options section. Packages
+% which draw on the Dates package (such as Calendar,
+% and the various Calendar style packages) can pass
+% the language options down to the Dates package through
+% the standard \LaTeXe{} package interface. Because Japanese
+% high-bit code may case a non-Japanese version of
+% \LaTeXe to fail, we allow for its exclusion here.
+% The odd structure of this is necessary to cope with the
+% fact that the "\ifcase" function is blind to the nesting
+% of case conditions.
+% \begin{macrocode}
+% Japanese removed.
+\def\dates@monthname@get{%
+ \ifcase\dates@month%
+ \or%
+ \global\dates@days=31\relax%
+ \or%
+ \ifleapyear%
+ \global\dates@days=29\relax%
+ \else%
+ \global\dates@days=28\relax%
+ \fi%
+ \or%
+ \global\dates@days=31\relax%
+ \or%
+ \global\dates@days=30\relax%
+ \or%
+ \global\dates@days=31\relax%
+ \or%
+ \global\dates@days=30\relax%
+ \or%
+ \global\dates@days=31\relax%
+ \or%
+ \global\dates@days=31\relax%
+ \or%
+ \global\dates@days=30\relax%
+ \or%
+ \global\dates@days=31\relax%
+ \or%
+ \global\dates@days=30\relax%
+ \or%
+ \global\dates@days=31\relax%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nextday}
+%
+% Find the next (previous) day after
+% (before) "\dates@date" with "\mod7=#1".
+%
+% \begin{macrocode}
+\def\nextday#1{{\dates@ct@z=#1\mod7\dates@date\dates@weekd%
+ \advance\dates@ct@z by-\dates@weekd\relax%
+ \ifnum\dates@ct@z<0\advance\dates@ct@z by7\fi%
+ \global\advance\dates@date by\dates@ct@z}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prevday}
+%
+% \begin{macrocode}
+\def\prevday#1{\snextday#1%
+ \global\advance\dates@date by-7}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\snextday}
+%
+% \begin{macrocode}
+\def\snextday#1{\global\advance\dates@date by1%
+ \nextday#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sprevday}
+%
+% \begin{macrocode}
+\def\sprevday#1{\global\advance\dates@date by-1%
+ \prevday#1}
+% \end{macrocode}
+% \end{macro}
+%
+% Convert from Julian date and time in
+% \date to long date (in local time)
+%
+% \begin{macrocode}
+\def\jdttol{\advance\dates@date by500%
+%\message{Ran jdttol^^J}%
+ \advance\dates@date by\dates@timezone%
+ \global\divide\dates@date by1000}
+% \end{macrocode}
+%
+% \subsection{Trigonometric Functions}
+%
+% \begin{macrocode}
+\def\sintable#1{\ifcase #1 0\or100\or199%
+ \or296\or389\or479\or565\or644\or717%
+ \or783\or841\or891\or932\or964\or985%
+ \or997\or1000\or992\or974\or946\or909%
+ \or863\or808\or746\or675\or598\or516%
+ \or427\or335\or239\or141\or42\or-58%
+ \or-158\fi}
+% \end{macrocode}
+%
+% Reduces modulo "2\pi" (requires positive
+% argument theta):
+% "theta := theta" "MOD 2\pi", where
+% "theta = count1*10^(-3)"
+%
+% \begin{macrocode}
+\def\twopimod{\count2 =\count1%
+ \divide\count2 by6284 \count3 =1853%
+ \count4 =6283\multiply\count3 by\count2%
+ \multiply\count4 by\count2%
+ \divide\count3 by10000%
+ \advance\count3 by\count4%
+ \advance\count1 by-\count3}%
+% \end{macrocode}
+%
+% "v := sin(theta)", where
+% "v = count4*10^(-3)";
+% "theta = count1*10^(-3)"
+% theta is reduced "MOD 2\pi" to be
+% "0<=theta<2\pi" by "\TWOPIMOD",
+% then linear interpolation is performed
+% using "\SINTABLE".
+%
+% \begin{macrocode}
+\def\sin{\relax%
+ \ifnum\count1<0 \signtrue%
+ \count1=-\count1\else \signfalse\fi%
+ \loop\ifnum\count1>6284\twopimod\repeat\relax%
+ \ifnum\count1>3142%
+ \advance\count1 by-3142%
+ \ifsign\signfalse\else\signtrue\fi\fi%
+ \multiply\count1 by10\count3=\count1%
+ \divide\count3 by1000\count2=\count3%
+ \multiply\count3 by1000%
+ \advance\count3 by-\count1 %
+ \count5 =\sintable{\count2 }%
+ \count4 =\count5\advance\count2 by1%
+ \advance\count4 by -\sintable{\count2}%
+ \multiply\count4 by\count3%
+ \divide\count4 by1000%
+ \advance\count4 by\count5%
+ \ifsign\count4 =-\count4\fi}%
+% \end{macrocode}
+%
+% "v := cos(theta)", where
+% "v = count4*10^(-3)";
+% "theta = count1*10^(-3)".
+% "\SIN" is evaluated on "pi/2-theta".
+% \begin{macrocode}
+\def\cos{\advance\count1 by-1571%
+ \multiply\count1 by-1\sin}%
+% \end{macrocode}
+% Linear transformation of T giving
+% "theta := a*T+b", where
+% "T = dates@ct@z*10^(-6)";
+% "theta = count1*10^(-3)";
+% "a = #1*10^3+#2+#3*10^(-3)";
+% "b = #4*10^(-3)"
+%
+% \begin{macrocode}
+\def\lin#1.#2.#3+#4.{\count1=#3%
+ \count2=#2\count3=#1%
+ \multiply\count1 by\dates@ct@z%
+ \multiply\count2 by\dates@ct@z\relax%
+ \multiply\count3 by\dates@ct@z%
+ \divide\count1 by1000%
+ \advance\count1 by\count2%
+ \divide\count1 by1000%
+ \advance\count1 by\count3%
+ \advance\count1 by #4\relax}
+% \end{macrocode}
+%
+% Accumulate value returned by a
+% trigonometric function, scaled by
+% factor f, into count6:
+% "ac := ac+f*v", where
+% "ac = count6*10^(-7)"
+% "v = value" of "SIN" or "COS =count4*10^(-3)"
+% "f = #1*10^(-4)"
+%
+% \begin{macrocode}
+\def\fac#1{\multiply\count4 by #1%
+ \advance\count6 by\count4}
+\def\id{\count4=\count1} % Identity
+% \end{macrocode}
+%
+% \subsection{Initialization}
+%
+% Before anything further is executed, the following registers
+% and macros need to be in place.
+%
+% \begin{macrocode}
+\newcount\dates@textcount
+\newcount\dates@ct@z
+\newcount\dates@range@limit
+\newcount\dates@year
+\newcount\dates@timezone
+\dates@timezone=0
+\newcount\dates@catch
+\newcount\dates@day
+\newcount\dates@day@offset
+\newcount\dates@everymonth@day
+\newcount\dates@everyyear@month
+\newcount\dates@month
+\newcount\dates@date
+\newcount\dates@date@current
+\newcount\dates@three
+\newcount\dates@four
+\newcount\dates@weekd
+\newcount\dates@time@start
+\newcount\dates@time@end
+\newcount\dates@subrange@start
+\newcount\dates@subrange@end
+\newcount\dates@days
+\newcount\dates@lastdate
+\newcount\dates@yearbase
+\newcount\dates@weekd@target
+\newcount\dates@modulo
+\newcount\dates@year@full
+\newcount\dates@extra@day
+\newtoks\dates@reg
+\newtoks\dates@dayname
+\newtoks\dates@shortweekday
+\newtoks\dates@monthname
+\newtoks\dates@shortmonthname
+\newif\ifdates@requiremonth
+\newif\ifdates@requireday
+\newif\ifdates@suppress
+\newif\ifdates@suppress@global
+\newif\ifleapyear
+\let\delim\relax
+\let\dates@serious@brace={
+\def\dates@empty{}
+%</style>
+% \end{macrocode}
+%
+%\iffalse
+%
+% \section{Demonstration File}
+%
+% \begin{macrocode}
+%<*demo>
+\documentclass{minimal}
+\usepackage{dates}
+\begin{document}
+
+\makeatletter
+%
+% We say HI to the user
+\message{^^J---------------------------------------------------------}
+\message{This is a demonstration file for the LaTeX dates package.}
+\message{It will print a number of dates to the terminal.^^J}
+\message{The code demonstrated by this package is not intended}
+\message{for direct use by humans, so I have not worked very hard}
+\message{to make its output look pretty, and it won't actually}
+\message{print anything. But if you get a cluttered list of dates}
+\message{and no error messages, the package is working for you.}
+\message{---------------------------------------------------------}
+%
+% We invoke the \dateread command.
+%
+\dateread
+%
+% We tell it to report a few details to the terminal.
+%
+{\message{\theshorttext}%
+ \message{\theday/\the\dates@month/\the\dates@year}%
+ \ifx\thelongtext\dates@empty%
+ \else%
+ \message{\thelongtext}%
+ \fi}
+%
+% The following are ranges.
+%
+ december 10 1995 {Start of First Period of Time}
+to jan 10 1996 {End of First Period of Time}
+ december 10 1996 {Start of Second Period of Time}
+to jan 10 1997 {End of Second Period of Time}
+%
+% The following are specific dates (obviously)
+%
+February 18 1997 {Frank's Next Birthday}
+ [The best presents come in small packages.^^JIt
+ would be a terrific present for someone to make
+ this one smaller.]
+February 18 1998 {Frank's Next Birthday But One}
+%
+% These are a couple of recursive dates.
+%
+Every Monday {(Monday Coffee)}
+Every Third Tuesday {(Third Tuesday Meeting)}
+Function moonsinit moonsincrement {%
+ \global\dates@date=\dates@subrange@start%
+ \caldate%
+ \newcount\moonno%
+ \newif\ifsign%
+ \def\firstmoon{\moonno=\dates@year
+ \multiply\moonno by123685
+ \divide\moonno by10000
+ \multiply\moonno by4\advance\moonno by-1
+ \loop\moondate\relax
+ \ifnum\dates@date<\dates@subrange@start
+ \advance\moonno by1\repeat}
+% Compute date for cycle quarter MOONNO
+ \def\moondate{{\dates@ct@z=\moonno
+ \lin 202.126.369+0.\dates@ct@z=\count1
+ \count6=0
+ \lin 0.2.319+2907.\sin\fac{3}
+ \divide\count6 by1000
+ \lin 365.249.86+7593.\id\fac{1}
+ \divide\count6 by10\count7 =\count6
+ \ifodd\moonno\quarters
+ \else\fullornew\fi\global\dates@date=\count7}
+ \jdttol}
+% Correction for full and new moon
+ \def\fullornew{\count6=0
+ \lin -393.0.0+0.
+ \divide\count1 by100000000
+ \advance\count6 by\count1
+ \lin 0.628.300+6269.\sin
+ \multiply\count6 by\count4
+ \lin -7.-700.-369+ 928.\sin\fac{ -74}
+ \lin 0. 628. 300+ 6269.\sin\fac{ 1734}
+ \lin 1. 256. 600+12539.\sin\fac{ 21}
+ \lin 8. 328. 670+ 5341.\sin\fac{-4068}
+ \lin 8. 538. 220+-4597.\sin\fac{ 10}
+ \lin 8. 956. 970+11610.\sin\fac{ -51}
+ \lin 16. 238. 589+-5526.\sin\fac{ -4}
+ \lin 16. 657. 340+10682.\sin\fac{ 161}
+ \lin 16. 866. 890+ 743.\sin\fac{ 104}
+ \lin 17. 285. 640+16951.\sin\fac{ 50}
+ \lin 17. 495. 190+ 7013.\sin\fac{ 4}
+ \lin 24. 986. 10+16023.\sin\fac{ -4}
+ \lin 25. 195. 560+ 6084.\sin\fac{ -6}
+ \divide\count6 by10000
+ \advance\count7 by\count6 }
+% Correction for quarters
+ \def\quarters{\lin -393.0.0+0.
+ \divide\count1 by100000000
+ \count6 =\count1 \lin 0.628.300+6269.
+ \sin\multiply\count6 by\count4
+ \lin -16. -29. -40+-4413.\sin\fac{ 40}
+ \lin -7.-700.-369+ 928.\sin\fac{ -47}
+ \lin -7. -72. -69+ 7198.\sin\fac{ -30}
+ \lin 0. 628. 300+ 6270.\sin\fac{ 1721}
+ \lin 1. 256. 600+12539.\sin\fac{ 21}
+ \lin 8. 328. 670+ 5341.\sin\fac{-6280}
+ \lin 8. 538. 220+-4598.\sin\fac{ 21}
+ \lin 8. 956. 970+11611.\sin\fac{ -119}
+ \lin 16. 238. 589+-5526.\sin\fac{ -4}
+ \lin 16. 657. 340+10682.\sin\fac{ 89}
+ \lin 16. 866. 890+ 743.\sin\fac{ 79}
+ \lin 17. 285. 640+16952.\sin\fac{ 3}
+ \lin 17. 495. 190+ 7013.\sin\fac{ 3}
+ \lin 24. 986. 10+16023.\sin\fac{ -4}
+ \lin 25. 195. 560+ 6085.\sin\fac{ -6}
+ \count8=\count6\count6=28000
+ \lin 628. 300. 373+ 6270.\cos\fac{ -4}
+ \lin 8. 328. 670+ 5341.\cos\fac{ 3}
+ \count2=\moonno
+ \advance\count2 by-1\divide\count2 by2
+ \ifodd\count2\multiply\count6 by-1 \fi
+ \advance\count6 by\count8
+ \divide\count6 by10000
+ \advance\count7 by\count6 }
+% Events for phases.
+% Uses PHASE (local).
+ \def\phase{{\dates@ct@z=\moonno
+ \count1=\moonno
+ \divide\dates@ct@z by4\multiply\dates@ct@z by4
+ \advance\count1 by-\dates@ct@z\relax
+ \xdef\themoon{\ifcase\count1
+ New Moon\or First Quarter\or
+ Full Moon\or Last Quarter\fi}}}
+ \gdef\moonsinit{%
+ \firstmoon
+ \global\dates@month=12\global\dates@day=31\dates@fix\global\advance\dates@date by1
+ \count1=\dates@date
+ \moondate
+ \phase
+ \caldate}
+ \gdef\moonsincrement{%
+ \advance\moonno by 1
+ \moondate\phase
+ \caldate}
+ }
+ {\themoon}
+\end{document}
+%</demo>
+% \end{macrocode}
+% \section{The Installation File}
+% \begin{macrocode}
+%<*installer>
+\def\batchfile{dates.ins}
+\input docstrip.tex
+
+\keepsilent
+
+\preamble
+
+This file is part of the Dates package.
+Copyright (C) 1996, 1997 Frank Bennett, Jr.
+All rights reserved.
+------------------------------------------
+This is a generated file.
+
+IMPORTANT NOTICE:
+
+You are not allowed to change this file. You may however copy
+this file to a file with a different name and then change the
+copy if (a) you do not charge for the modified code, (b) you
+acknowledge the author(s) in the new file, if it
+is distributed to others, and (c) you attach these same
+conditions to the new file.
+
+You are not allowed to distribute this file alone. You are not
+allowed to take money for the distribution or use of this file
+(or a changed version) except for a nominal charge for copying
+etc.
+
+You are allowed to distribute this file under the condition that
+it is distributed with all of its contents, intact.
+
+For error reports, or offers to help make this a more powerful,
+friendlier, and better package, please contact me on
+`fb' at soas.ac.uk
+
+\endpreamble
+
+\generate{\file{dates.sty} {\from{dates.dtx}{style}}
+ }
+
+\generate{\file{demodate.tex} {\from{dates.dtx}{demo}}
+ }
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space dates.sty}
+\Msg{*}
+\Msg{***********************************************************}
+
+%</installer>
+% \end{macrocode}
+%\fi
+% \Finale \PrintChanges
+
diff --git a/Master/texmf-dist/source/latex/calendar/demo1997.cld b/Master/texmf-dist/source/latex/calendar/demo1997.cld
new file mode 100644
index 00000000000..86b7befb545
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demo1997.cld
@@ -0,0 +1,13 @@
+%%
+%% This is file `demo1997.cld',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% caldemos.dtx (with options: `1997')
+%%
+January 1 1997 to December 31 1997 {The year 1997}
+
+%%
+%%
+%% End of file `demo1997.cld'.
diff --git a/Master/texmf-dist/source/latex/calendar/demoapt.cld b/Master/texmf-dist/source/latex/calendar/demoapt.cld
new file mode 100644
index 00000000000..dfff29c677a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demoapt.cld
@@ -0,0 +1,14 @@
+%%
+%% This is file `demoapt.cld',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% caldemos.dtx (with options: `appts')
+%%
+jan 1 1997 16:00 {Nancy} [Call Nancy to confirm]
+jan 1 1997 18:00-20:00 {Dinner} [New Year Dinner]
+
+%%
+%%
+%% End of file `demoapt.cld'.
diff --git a/Master/texmf-dist/source/latex/calendar/demoaptr.cld b/Master/texmf-dist/source/latex/calendar/demoaptr.cld
new file mode 100644
index 00000000000..622a4f97b6e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demoaptr.cld
@@ -0,0 +1,17 @@
+%%
+%% This is file `demoaptr.cld',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% caldemos.dtx (with options: `apptsr')
+%%
+range demo1997 {Current year}
+every Monday 14:00-16:00 {Monday meeting}
+every other Wednesday from 1 January 1997 10:00 {Wednesday call}
+every 3 10:00-13:00 {Koffee klatch}
+every first Tuesday 13:00-15:00 {Study group}
+
+%%
+%%
+%% End of file `demoaptr.cld'.
diff --git a/Master/texmf-dist/source/latex/calendar/demoevt.cld b/Master/texmf-dist/source/latex/calendar/demoevt.cld
new file mode 100644
index 00000000000..5c72a4382f8
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demoevt.cld
@@ -0,0 +1,13 @@
+%%
+%% This is file `demoevt.cld',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% caldemos.dtx (with options: `events')
+%%
+jan 1 1997 {New Year} [New Year's Day]
+
+%%
+%%
+%% End of file `demoevt.cld'.
diff --git a/Master/texmf-dist/source/latex/calendar/demoevtr.cld b/Master/texmf-dist/source/latex/calendar/demoevtr.cld
new file mode 100644
index 00000000000..091c37ec529
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demoevtr.cld
@@ -0,0 +1,17 @@
+%%
+%% This is file `demoevtr.cld',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% caldemos.dtx (with options: `eventsr')
+%%
+range demo1997
+every Monday {Monday event}
+every other friday from 10 january 1997 {Alternate Monday}
+every 3 {Third of month}
+every first Tuesday {First Tuesday}
+
+%%
+%%
+%% End of file `demoevtr.cld'.
diff --git a/Master/texmf-dist/source/latex/calendar/demohlst.htm b/Master/texmf-dist/source/latex/calendar/demohlst.htm
new file mode 100644
index 00000000000..77e668e0fc4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demohlst.htm
@@ -0,0 +1,14 @@
+<UL>
+<LI><A NAME="35430">1 January 1997</A>
+<BR>New Year's Day
+ <UL>
+ <LI>10:00 Wednesday call
+ <LI>16:00 Call Nancy to confirm
+ <LI>18:00--20:00 New Year Dinner
+ </UL>
+<LI><A NAME="35432">3 January 1997</A>
+<BR>Third of month
+ <UL>
+ <LI>10:00--13:00 Koffee klatch
+ </UL>
+</UL>
diff --git a/Master/texmf-dist/source/latex/calendar/demohml.htm b/Master/texmf-dist/source/latex/calendar/demohml.htm
new file mode 100644
index 00000000000..b86fd29f95b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demohml.htm
@@ -0,0 +1,59 @@
+<pre><B>January</B>
+ Wed Thu Fri Sat Sun Mon Tue
+ <A HREF="#35430">1</A> 2 <A HREF="#35432">3</A> 4 5 <A HREF="#35435">6</A> 7
+
+ 8 9 <A HREF="#35439">10</A> 11 12 <A HREF="#35442">13</A> 14
+
+ <A HREF="#35444">15</A> 16 17 18 19 <A HREF="#35449">20</A> 21
+
+ 22 23 <A HREF="#35453">24</A> 25 26 <A HREF="#35456">27</A> 28
+
+ <A HREF="#35458">29</A> 30 31
+
+</pre>
+<UL>
+<LI><A NAME="35430">1 January 1997</A>
+<BR>New Year's Day
+ <UL>
+ <LI>10:00 Wednesday call
+ <LI>16:00 Call Nancy to confirm
+ <LI>18:00--20:00 New Year Dinner
+ </UL>
+<LI><A NAME="35432">3 January 1997</A>
+<BR>Third of month
+ <UL>
+ <LI>10:00--13:00 Koffee klatch
+ </UL>
+<LI><A NAME="35435">6 January 1997</A>
+<BR>Monday event
+ <UL>
+ <LI>14:00--16:00 Monday meeting
+ </UL>
+<LI><A NAME="35439">10 January 1997</A>
+<BR>Alternate Monday
+<LI><A NAME="35442">13 January 1997</A>
+<BR>Monday event
+ <UL>
+ <LI>14:00--16:00 Monday meeting
+ </UL>
+<LI><A NAME="35444">15 January 1997</A>
+ <UL>
+ <LI>10:00 Wednesday call
+ </UL>
+<LI><A NAME="35449">20 January 1997</A>
+<BR>Monday event
+ <UL>
+ <LI>14:00--16:00 Monday meeting
+ </UL>
+<LI><A NAME="35453">24 January 1997</A>
+<BR>Alternate Monday
+<LI><A NAME="35456">27 January 1997</A>
+<BR>Monday event
+ <UL>
+ <LI>14:00--16:00 Monday meeting
+ </UL>
+<LI><A NAME="35458">29 January 1997</A>
+ <UL>
+ <LI>10:00 Wednesday call
+ </UL>
+</UL>
diff --git a/Master/texmf-dist/source/latex/calendar/demohmth.htm b/Master/texmf-dist/source/latex/calendar/demohmth.htm
new file mode 100644
index 00000000000..6913b9c17b8
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demohmth.htm
@@ -0,0 +1,13 @@
+<pre><B>January</B>
+ Wed Thu Fri Sat Sun Mon Tue
+ <A HREF="#35430">1</A> 2 <A HREF="#35432">3</A> 4 5 <A HREF="#35435">6</A> 7
+
+ 8 9 <A HREF="#35439">10</A> 11 12 <A HREF="#35442">13</A> 14
+
+ <A HREF="#35444">15</A> 16 17 18 19 <A HREF="#35449">20</A> 21
+
+ 22 23 <A HREF="#35453">24</A> 25 26 <A HREF="#35456">27</A> 28
+
+ <A HREF="#35458">29</A> 30 31
+
+</pre>
diff --git a/Master/texmf-dist/source/latex/calendar/demolist.cld b/Master/texmf-dist/source/latex/calendar/demolist.cld
new file mode 100644
index 00000000000..6ebbb65c05e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/demolist.cld
@@ -0,0 +1,14 @@
+%%
+%% This is file `demolist.cld',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% caldemos.dtx (with options: `demolist')
+%%
+list demoevt {A separate list of events}
+list demoapt {A separate list of appointments}
+
+%%
+%%
+%% End of file `demolist.cld'.
diff --git a/Master/texmf-dist/source/latex/calendar/evntlist.dtx b/Master/texmf-dist/source/latex/calendar/evntlist.dtx
new file mode 100644
index 00000000000..f2412966ce0
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/evntlist.dtx
@@ -0,0 +1,284 @@
+%\iffalse
+%
+% file: evntlist.dtx
+% Copyright (C) 1996-1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+%\fi
+%
+% \def\fileversion{2.2}
+% \def\filedate{1997/11/07 10:44:05}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{evntlist.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+%\iffalse
+% evntlist.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:14:57 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:12:58 root
+% Release code
+%
+% Revision 1.3 1998/01/16 17:46:34 root
+% *** empty log message ***
+%
+% Revision 1.2 1998/01/15 23:39:20 root
+% *** empty log message ***
+%
+% Revision 1.1 1997/11/26 07:20:12 bennett
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the Event List
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent This package makes a cronological list
+% of events.
+% \end{abstract}
+%
+% \CheckSum{133}
+%
+% Please see the file \texttt{calguide.tex} for details on the
+% use of this package.
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{The Class File}
+%
+% \subsection{Preliminaries}
+% Use \LaTeXe, and tell the user who we are.
+% \begin{macrocode}
+%<*style>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{evntlist}
+ [1997/11/07 10:44:05 2.2 Event List (Frank Bennett)]
+% \end{macrocode}
+% Define some more variables and switches for use in the body
+% of the style.
+%
+% \subsection{Options}
+%
+% In common with all other packages in the Calendar
+% bundle, we
+% include some code for declaring languages.
+%
+% \begin{macrocode}
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+% \end{macrocode}
+%
+% \subsection{Option Postprocessing}
+%
+% Now that the options lists are available to us,
+% we can start loading packages. The following packages
+% are always loaded.
+% \begin{macrocode}
+\RequirePackage{calendar}
+% \end{macrocode}
+% The "color" package is only loaded if the user asked
+% for it as an option to \sc{documentclass}, or in the
+% "weekly.cfg" file.
+% \begin{macrocode}
+ \newif\if@el@noheadyet
+ \@el@noheadyettrue
+ \def\el@output#1{\protected@write\@el@outputfile{}{#1}}
+ \def\el@maybeheader{\if@el@noheadyet%
+ \begin{itemize}\item\theday\space\themonth\space\theyear\@el@noheadyetfalse\fi}
+ \def\el@maybeitem{\if@el@noheadyet\else\item\theday\space\themonth\space\theyear%
+ \fi}
+% \end{macrocode}
+%
+% \subsection{Calendar Setup}
+%
+% \subsection{Calendar Definition}
+%
+% The calendar definition itself consists of a single command
+% and its associated arguments.
+% \begin{macrocode}
+\newcalendar%
+% \end{macrocode}
+% We give the environment a name.
+% \begin{macrocode}
+{eventlist}
+% \end{macrocode}
+% We're producing DVI, so we use the standard
+% macro for dropping text into the hopper.
+% \begin{macrocode}
+{\cal@insert}
+% \end{macrocode}
+% Starting day for the calendar is not fixed here,
+% because we don't pad with blank entries. Season to taste.
+% Use integers "0" through "6". A value over 7 means no padding.
+% \begin{macrocode}
+{8}
+% \end{macrocode}
+% The length of a group is one day.
+% \begin{macrocode}
+{1}
+% \end{macrocode}
+% The length of a subgroup is one day.
+% \begin{macrocode}
+{1}
+% \end{macrocode}
+% Our delimiter is an \cs{item}.
+% \begin{macrocode}
+{\relax}
+% \end{macrocode}
+% Increment the date counter with every item.
+% \begin{macrocode}
+{I}
+% \end{macrocode}
+% Define the header.
+% \begin{macrocode}
+{\relax}
+% \end{macrocode}
+% We define the end of the calendar. This spits out
+% all of the boxes one last time, and closes the page
+% formatting environment.
+% \begin{macrocode}
+{\end{itemize}}
+% \end{macrocode}
+% We define a way to open a new group. In this case,
+% we just relax.
+% \begin{macrocode}
+{\relax}
+% \end{macrocode}
+% We define the way to end a subgroup. This spits out
+% all of the boxes built for a page of text.
+% \begin{macrocode}
+{\relax}
+% \end{macrocode}
+% We set up to require a month and day in the environment typed
+% into the user's document.
+% \begin{macrocode}
+{\dates@requiremonthtrue\dates@requiredaytrue}
+% \end{macrocode}
+% The next section runs after the calendar dates have been
+% scanned from the environment, but before the table is
+% opened.
+% \textit{Start date.}
+% \begin{macrocode}
+{\global\dates@date\cal@range@start%
+ \caldate%
+% \end{macrocode}
+% \textit{We tell the user where we're starting.}
+% \begin{macrocode}
+ \message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+% \end{macrocode}
+% \textit{End date.}
+% \begin{macrocode}
+ \global\dates@date\cal@range@end%
+ \caldate%
+% \end{macrocode}
+% \textit{We let the user know where we plan to stop.}
+% \begin{macrocode}
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+% \end{macrocode}
+% \textit{We jump back to the starting date and reset the
+% human-side values.}
+% \begin{macrocode}
+ \global\dates@date\cal@range@start%
+ \caldate}%
+% \end{macrocode}
+% Events are delimited by \cs{item}.
+% \begin{macrocode}
+{\item}%
+% \end{macrocode}
+% The next argument is dropped on DVI for each item.
+% We use it here to fetch the text of appointments and
+% events to the standard list macros, using the
+% standard text-fetching commands. Each generates a
+% stack delimited by the phrase that was set above.
+% \begin{macrocode}
+{\cal@get@appointments\cal@get@events}%
+% \end{macrocode}
+% This sets \cs{cal@entry@text}. It is executed for every
+% event or appointment in the database that applies
+% to a given item. We differentiate between whole-day events,
+% pinpointed events and ranged events.
+% \begin{macrocode}
+{\relax%
+ \ifnum\dates@time@start>0\relax%
+ \ifnum\dates@time@start=\dates@time@end%
+ \protected@edef\cal@entry@text{%
+ \thetimestart\space%
+ \cal@textcolor{\calcolor}{\thelongtext}}%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \thetimestart--\thetimeend\space%
+ \cal@textcolor{\calcolor}{\thelongtext}}%
+ \fi%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \cal@textcolor{\calcolor}{\thelongtext}}%
+ \fi}%
+% \end{macrocode}
+% Finally ...
+% \begin{macrocode}
+{\ifcat$\theevents\theappointments$\else%
+\el@maybeitem%
+\el@maybeheader%
+\fi%
+\bgroup%
+\let\item\par%
+\ifcat$\theevents$\else%
+ \par%
+ \theevents%
+\fi%
+\egroup%
+\ifcat$\theappointments$\else%
+\begin{itemize}%
+\item%
+\theappointments%
+\end{itemize}%
+\fi}
+%</style>
+% \end{macrocode}
+% \Finale \PrintChanges
diff --git a/Master/texmf-dist/source/latex/calendar/htmlstuf.dtx b/Master/texmf-dist/source/latex/calendar/htmlstuf.dtx
new file mode 100644
index 00000000000..0fe88334dbb
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/htmlstuf.dtx
@@ -0,0 +1,385 @@
+%\iffalse
+%
+% file: htmlstuf.dtx
+% Copyright (C) 1996-1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+%\fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:15:02}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{htmlstuf.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+%\iffalse
+% htmlstuf.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:15:02 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:13:14 root
+% Release code
+%
+% Revision 1.11 1998/01/17 16:48:35 root
+% *** empty log message ***
+%
+% Revision 1.10 1998/01/17 11:07:21 root
+% *** empty log message ***
+%
+% Revision 1.9 1998/01/17 11:05:29 root
+% *** empty log message ***
+%
+% Revision 1.8 1998/01/17 10:48:00 root
+% *** empty log message ***
+%
+% Revision 1.7 1998/01/17 06:14:32 root
+% *** empty log message ***
+%
+% Revision 1.6 1998/01/16 21:33:57 root
+% *** empty log message ***
+%
+% Revision 1.5 1998/01/16 21:16:47 root
+% *** empty log message ***
+%
+% Revision 1.4 1998/01/16 21:09:07 root
+% *** empty log message ***
+%
+% Revision 1.3 1998/01/16 19:16:11 root
+% *** empty log message ***
+%
+% Revision 1.2 1998/01/16 18:40:07 root
+% *** empty log message ***
+%
+%\fi
+%
+% \title{User's Guide to the HTML Calendar
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent This package makes a cronological list
+% of events.
+% \end{abstract}
+%
+% \CheckSum{524}
+%
+% Please see the file \texttt{calguide.tex} for details on the
+% use of this package.
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{The Class Files}
+%
+% \subsection{HTML Month}
+% \begin{macrocode}
+%<*htmlmonth>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{hmonth}
+ [1998/01/17 18:15:02 3.1.1.1 HTML calendar (Frank Bennett)]
+\RequirePackage{calendar}
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+\define@key{opt}{title}{%
+ \def\yrly@title{#1}}
+\define@key{opt}{labels}{%
+ \@storelabels#1,,{}}
+\define@key{opt}{firstday}{%
+ \yrly@firstday=#1}
+\define@key{opt}{outputfile}{%
+ \@ifundefined{html@outputfile}
+ {\newwrite\html@output
+ \gdef\html@outputfile{#1}%
+ \immediate\openout\html@output=\html@outputfile}
+ {\gdef\hm@temp{#1}%
+ \ifx\html@outputfile\hm@temp%
+ \relax%
+ \else%
+ \immediate\closeout\html@output%
+ \gdef\html@outputfile{#1}%
+ \immediate\openout\html@output=\html@outputfile\relax
+ \fi}}
+\def\yrly@title{\themonth}
+\newcount\yrly@firstday
+\yrly@firstday=3\relax
+\newtoks\yrly@tempreg@a
+\newcount\yrly@tempcount
+\def\@storelabels{%
+ \def\yrly@labeltext{}%
+ \@@storelabels}
+\def\@@storelabels#1,#2#{%
+ \ifcat$#1$%
+ \yrly@tempreg@a=\expandafter{\yrly@labeltext}%
+ \edef\yrly@labeltext{\the\yrly@tempreg@a}%
+ \let\next\@gobble%
+ \else%
+ \let\next\@@storelabels%
+ \yrly@tempreg@a=\expandafter{\yrly@labeltext}%
+ \protected@edef\yrly@labeltext{\the\yrly@tempreg@a\space#1}%
+ \fi%
+ \next#2{}}
+\newcount\thumbnails%
+\newtoks\hm@line@a%
+\def\hm@line{}
+\def\hm@writeout#1{%
+ \edef\hm@temp{#1}%
+ \immediate\write\html@output{\hm@line\hm@temp}%
+ \def\hm@line{}}
+\def\hm@spaces{\ifcase\hm@spacenum\or\space\or\space\space\or\space\space\space%
+ \or\space\space\space\space\fi}
+\newcount\hm@spacenum
+\newcalendar%
+ {htmlmonth}
+ {\el@output}
+ {\yrly@firstday}
+ {\dates@days}
+ {7}
+ {\hm@spaces}
+ {I}
+ {<pre><B>\themonth</B>^^J\yrly@labeltext^^J}%
+ {^^J^^J</pre>}
+ {\cal@footer%
+ \cal@header}
+ {^^J}
+ {}
+ {\global\dates@day=1%
+ \dates@fix%
+ \cal@range@start\dates@date%
+ \message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \global\dates@date\cal@range@end%
+ \caldate%
+ \global\dates@day\dates@days%
+ \dates@fix%
+ \cal@range@end\dates@date%
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \global\dates@date=\cal@range@start%
+ \caldate%
+ \@ifundefined{yrly@labeltext}{%
+ \def\yrly@defaultlabels{}%
+ \yrly@tempcount=1%
+ \global\advance\dates@date by-\dates@weekd%
+ \global\advance\dates@date by\yrly@firstday%
+ \caldate%
+ \loop%
+ \yrly@tempreg@a=\expandafter{\yrly@defaultlabels}%
+ \edef\yrly@defaultlabels{\the\yrly@tempreg@a\theshortweekday,}%
+ \ifnum\yrly@tempcount<7%
+ \global\advance\dates@date by1%
+ \caldate%
+ \advance\yrly@tempcount by 1\relax%
+ \repeat%
+ \expandafter\@storelabels\yrly@defaultlabels,,{}%
+ \dates@date\cal@range@start%
+ \caldate}%
+ {}%
+ \def\el@output##1{%
+ \def\hm@temp{##1}%
+ \def\hm@temptwo{\cal@groupbreak}%
+ \ifx\hm@temp\hm@temptwo%
+ \hm@spacenum=4\relax%
+ \fi%
+ \ifnum\cal@subgroup@count>6\relax%
+ \hm@writeout{##1}%
+ \else%
+ \def\hm@temptwo{\cal@footer}%
+ \ifx\hm@temp\hm@temptwo%
+ \hm@writeout{##1}%
+ \else%
+ \hm@line@a=\expandafter{\hm@line}%
+ \edef\hm@line{\the\hm@line@a\hm@temp}%
+ \fi%
+ \fi}%
+ \hm@spacenum=4\relax}%
+ {}%
+ {\ifnum\dates@day<9\hm@spacenum=3\else\hm@spacenum=2\fi%
+ \cal@get@appointments\cal@get@events}%
+ {\protected@edef\cal@entry@text{X}}%
+ {\ifnum\dates@weekd=\yrly@firstday%
+ \hm@spaces%
+ \ifnum\theday=9%
+ \space\space%
+ \fi%
+ \else%
+ \ifnum\dates@day=1%
+ \space\hm@spaces%
+ \fi%
+ \fi%
+ \ifcat$\theappointments\theevents$%
+ \else%
+ <A HREF="\expandafter\@gobble\string\#\the\dates@date">%
+ \fi%
+ \theday%
+ \ifcat$\theappointments\theevents$%
+ \else%
+ </A>%
+ \fi}
+%</htmlmonth>
+% \end{macrocode}
+%
+% \subsection{HTML Event List}
+%
+% \begin{macrocode}
+%<*htmlevent>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{hlist}
+ [1997/11/07 10:44:05 2.2 HTML Event List (Frank Bennett)]
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+\ProcessOptions
+\RequirePackage{calendar}
+\define@key{opt}{textnum}{%
+ \dates@textnum=#1\relax}
+\define@key{opt}{outputfile}{%
+ \@ifundefined{html@outputfile}
+ {\newwrite\html@output%
+ \gdef\html@outputfile{#1}%
+ \immediate\openout\html@output=\html@outputfile}
+ {\gdef\el@temp{#1}%
+ \ifx\html@outputfile\el@temp%
+ \relax%
+ \else%
+ \immediate\closeout\html@output%
+ \gdef\html@outputfile{#1}%
+ \immediate\openout\html@output=\html@outputfile\relax%
+ \fi}}
+\def\el@item{<LI><A NAME="\the\dates@date">\theday\space\themonth\space\theyear</A>}
+\newcalendar%
+{htmllist}
+{\el@output}
+{8}
+{1}
+{1}
+{}
+{I}
+{<UL>}
+{</UL>}
+{}
+{}
+{\dates@requiremonthtrue\dates@requiredaytrue}
+{\global\dates@date\cal@range@start%
+ \caldate%
+ \message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \global\dates@date\cal@range@end%
+ \caldate%
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \global\dates@date\cal@range@start%
+ \caldate%
+ \def\el@output##1{\ifcat$##1$\else\immediate\write\html@output{##1}\fi}}%
+{}%
+{\cal@get@appointments\cal@get@events}%
+{\relax%
+ \ifnum\dates@time@start>0\relax%
+ \ifnum\dates@time@start=\dates@time@end%
+ \protected@edef\cal@entry@text{%
+ ^^J\space\space\space\space<LI>\thetimestart\space%
+ \thelongtext}%
+ \else%
+ \protected@edef\cal@entry@text{%
+ ^^J\space\space\space\space<LI>\thetimestart--\thetimeend\space%
+ \thelongtext}%
+ \fi%
+ \else%
+ \protected@edef\cal@entry@text{%
+ ^^J<BR>\thelongtext}%
+ \fi}%
+{\ifcat$\theevents\theappointments$\else%
+\el@item%
+\fi%
+\ifcat$\theevents$\else%
+ \theevents%
+\fi%
+\ifcat$\theappointments$\else%
+ ^^J\space\space\space\space<UL>%
+ \theappointments%
+ ^^J\space\space\space\space</UL>%
+\fi}
+%</htmlevent>
+% \end{macrocode}
+% \subsection{HTML Month and Event List}
+% \begin{macrocode}
+%<*htmlmonthevent>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{hml}
+ [1997/11/06 07:33:21 2.1.1.6 HTML calendar (Frank Bennett)]
+\RequirePackage{hmonth}
+\RequirePackage{hlist}
+\newtoks\hml@one
+\newtoks\hml@two
+\def\htmlmonthlist#1#2{%
+ \hml@one={#1}
+ \hml@two={#2}
+ \dateread{}}
+\def\endhtmlmonthlist{%
+ \ifnum\dates@subrange@start=0%
+ \dates@subrange@start\dates@date%
+ \dates@subrange@end\dates@date%
+ \fi%
+ \global\dates@date\dates@subrange@start%
+ \global\dates@day=1\relax%
+ \dates@fix%
+ \cal@range@start\dates@date%
+ \global\dates@date\dates@subrange@end%
+ \caldate%
+ \global\dates@day\dates@days%
+ \dates@fix%
+ \cal@range@end\dates@date%
+ \global\dates@date=\cal@range@start
+ \caldate
+ \edef\hml@start{\theday\space\themonth\space\theyear\space}
+ \global\dates@date=\cal@range@end
+ \caldate
+ \edef\hml@end{\theday\space\themonth\space\theyear}
+ \edef\hml@range{\hml@start to \hml@end\space}
+ \edef\hml@htmlmonth{\noexpand\begin{htmlmonth}{\the\hml@one}{\the\hml@two}}
+ \edef\hml@htmllist{\noexpand\begin{htmllist}{\the\hml@one}{\the\hml@two}}
+ \expandafter\hml@htmlmonth\hml@range\end{htmlmonth}
+ \expandafter\hml@htmllist\hml@range\end{htmllist}x}
+%<*htmlmonthevent>
+% \end{macrocode}
+% \Finale \PrintChanges
+
diff --git a/Master/texmf-dist/source/latex/calendar/mkaddr.Frank b/Master/texmf-dist/source/latex/calendar/mkaddr.Frank
new file mode 100644
index 00000000000..4ffee077445
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/mkaddr.Frank
@@ -0,0 +1,20 @@
+\documentclass{filoaddr}
+\begin{document}
+\begin{addresses}{%
+ topmargin=2cm,
+ rightmargin=3cm,
+ pageheight=172mm,
+ pagewidth=95mm,
+ columnsep=14pt,
+ punchcluster=3,
+ punchgroups=2,
+ interspace=51.25mm,
+ intraspace=19.25mm,
+ grip=5mm,
+ punchmargin=2mm,
+ punchpoints=15,
+ topspace=2pt,
+ bottomspace=1.5cm}
+%%BODY%%
+\end{addresses}
+\end{document}
diff --git a/Master/texmf-dist/source/latex/calendar/mkaddr.dtx b/Master/texmf-dist/source/latex/calendar/mkaddr.dtx
new file mode 100644
index 00000000000..b88c19364be
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/mkaddr.dtx
@@ -0,0 +1,579 @@
+%\iffalse
+%
+% file: mkaddr.dtx
+%
+% This file is distributed as-is, with no warranty whatsoever.
+% Out of courtesy to others, please do not distribute the
+% files contained in this file separately, but always
+% together with this file and the documentation it contains.
+%
+%\fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:15:06}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{mkaddr.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% mkaddr.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:15:06 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:13:48 root
+% Release code
+%
+% Revision 2.3 1997/12/06 21:15:31 root
+% *** empty log message ***
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 14:58:44 bennett
+% Release code.
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+%
+% \title{The \texttt{mkaddr} Tcl script\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent The utilities in this bundle
+% can be used together to generate address lists from
+% a database in the format used by the marvellous BBDB database
+% for Emacs.
+% \end{abstract}
+%
+% \CheckSum{392}
+%
+% \section{Installation and Use}
+%
+% The script is designed for use on a Unix system (if
+% you haven't already moved to Linux, you might consider
+% joining the gathering). You will need to have Emacs installed
+% on your system. You will also need the BBDB extensions,
+% which produce and maintain a database file, ".bbdb",
+% in your home directory. You should also have the
+% AUC\TeX{} extensions to Emacs installed, for editing, compiling,
+% previewing and printing \LaTeX{} documents. You will
+% also need "dvips" and, if (like me) you don't have
+% access to a PostScript printer, "ghostscript" --- or
+% some other combination of printing gear for which
+% page rotation is supported in the "graphics" bundle. Your
+% \TeX{} system will need the files in the "graphics"
+% bundle, and the "autofilo" package from the "calendar"
+% bundle for making filofax page frames.
+%
+% In your \texttt{/etc} directory,
+% you will need a format file or files. Each should
+% have the name "addresses", followed by an extension.
+% The extension(s) will be used by the first mandatory
+% option to the script. On my system, I have two
+% format files, "mkaddr.Frank" and "mkaddr.Mieko",
+% which produce pages suitable for my own and my wife's
+% diary, respectively. Each file is simply a \LaTeX{}
+% document, with "%%BODY%%" where the list of addresses
+% should be inserted. An example is given below. Note
+% that you will need to edit the script to reflect the
+% names of your format files.
+%
+% The ".bbdb" database is designed for use with email
+% systems, adding entries for your correspondents on
+% the fly as mail is received. To make it easier to add entries for
+% people with whom you have not corresponded by email, you
+% may want to add a suitable chunk of elisp to your
+% ".emacs" file. A chunk of such code is given below.
+% It sets your "f12" key to add a new entry, prompting
+% for details. Edit to taste (especially note the
+% "[M]" and "[F]"; you will want to change these.
+%
+% Flags for extracting data from the list should be
+% put into the "Notes:" field, in square braces.
+%
+% Extract everything, edit and install the script,
+% install the style,
+% and install one or more format files.
+% Run the script and read the instructions. On my system,
+% the command "mkaddr Frank [AaBb] [F]" will make a
+% file "mkaddr.tex" in the current directory, formatted
+% as specified in the format file "\etc\mkaddr.Frank",
+% containing all entries beginning with "A" or "a",
+% or "B" or "b", and flagged with "[F]". Run the
+% file through \LaTeX{} and "dvips", and you have an address list.
+%
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{Sample Format File}
+% \begin{macrocode}
+%<*format>
+\documentclass{filoaddr}
+\begin{document}
+\begin{addresses}{%
+ topmargin=2cm,
+ rightmargin=3cm,
+ pageheight=172mm,
+ pagewidth=95mm,
+ columnsep=14pt,
+ punchcluster=3,
+ punchgroups=2,
+ interspace=51.25mm,
+ intraspace=19.25mm,
+ grip=5mm,
+ punchmargin=2mm,
+ punchpoints=15,
+ topspace=2pt,
+ bottomspace=1.5cm}
+%%BODY%%
+\end{addresses}
+\end{document}
+%</format>
+% \end{macrocode}
+%
+% \section{Elisp for \texttt{.emacs}}
+%
+% \begin{macrocode}
+%<*elisp>
+;; Essential add-on for BBDB
+(defun bbdb-create-external ()
+ "Prompt for and create a record. Hacked from bbdb-read-new-record."
+ (interactive)
+ (let ((name (bbdb-read-string "Name: "))
+ (company (bbdb-read-string "Company: "))
+ (net (bbdb-split (bbdb-read-string "Network Address: ") ","))
+ (addrs
+ (let (L L-tail str addr)
+ (while
+ (not
+ (string=
+ ""
+ (setq str
+ (bbdb-read-string
+ "Address Description [RET when no more addrs]: "))))
+ (setq addr (make-vector bbdb-address-length nil))
+ (bbdb-record-edit-address addr str)
+ (if L
+ (progn (setcdr L-tail (cons addr nil))
+ (setq L-tail (cdr L-tail)))
+ (setq L (cons addr nil)
+ L-tail L)))
+ L))
+ (phones
+ (let (L L-tail str)
+ (while
+ (not
+ (string=
+ ""
+ (setq str
+ (bbdb-read-string
+ "Phone Location [RET when no more phones]: "))))
+ (let* ((phonelist
+ (bbdb-error-retry
+ (bbdb-parse-phone-number
+ (read-string
+ "Phone: "
+ (and
+ bbdb-default-area-code
+ (format "(%03d) " bbdb-default-area-code))))))
+ (phone (apply 'vector str
+ (if (= 3 (length phonelist))
+ (nconc phonelist '(0))
+ phonelist))))
+ (if L
+ (progn (setcdr L-tail (cons phone nil))
+ (setq L-tail (cdr L-tail)))
+ (setq L (cons phone nil)
+ L-tail L))))
+ L))
+ (notes (bbdb-read-string "Additional Comments: " "[M][F]")))
+ (if (string= company "") (setq company nil))
+ (if (string= name "") (setq name nil))
+ (if (string= notes "") (setq notes nil))
+ (bbdb-display-records
+ (list
+ (bbdb-create-internal name company net addrs phones notes)))))
+
+(global-set-key [f12] 'bbdb-create-external)
+%</elisp>
+% \end{macrocode}
+%
+% \section{The Script}
+%
+% You must edit this file for your system. Search
+% especially for instances of "Frank" and "Mieko".
+%
+% \begin{macrocode}
+%<*script>
+#!/usr/local/bin/tclsh
+if {[catch "kanji defaultInputCode EUC" errormsg]}\
+ {puts "Running $argv0 without Japanese support."
+ puts "For Japanese support, you need to use a Japanized"
+ puts "Tcl interpreter.\n"}\
+ {}
+# This script parses a database in the format used by
+# the Insidious Big Brother Database for Emacs. It can
+# be adapted to output LaTeX lists of contents and so forth.
+set format [lindex $argv 0]
+set range [lindex $argv 1]
+set condition [lindex $argv 2]
+set usage "Usage is: $argv0 \<SIZE\> \[<RANGE>\] \[<CONDITION>\]\
+\n(Square braces are literal)\
+\n(\<SIZE\> is one of \"Mieko\" or \"Frank\")"
+if {[string match $format "Mieko"]+\
+ [string match $format "Frank"]==0}\
+ {puts "$usage"; exit}\
+ {}
+if {[regexp {\[.*\]} $condition ignore]==0}\
+ {puts "$usage"; exit}\
+ {}
+if {[regexp {\[.*\]} $range ignore]==0}\
+ {puts "$usage"; exit}\
+ {}
+puts "Creating LaTeX2e file mkaddr.tex ..."
+regexp {\[(.*)\]} $condition ignore condition
+set condition "\\\[$condition\\\]"
+set ifh [open "/home/bennett/.bbdb"]
+set ofh [open "./mkaddr.tex" w+]
+set counter 0
+set temp ""
+# Let's grab the content of a header file
+set header [open "/etc/mkaddr.$format" r]
+while 1 {
+ if {[gets $header line] == -1} break
+ if {[string match $line "%%BODY%%"]} break
+ puts $ofh $line
+}
+while 1 {
+ if {[gets $ifh line] == -1} break
+ regsub -all {([ "])\\"} $line {\1``} line
+ regsub -all {\\"([^A-Za-z])} $line {''\1} line
+ regsub -all {\\n} $line { } line
+ regsub -all {([^\])%} $line {\1\\%} line
+ regsub -all {([^\])&} $line {\1\\\&} line
+set fn nil
+set ln nil
+set aka nil
+set co nil
+set ph nil
+set ad nil
+set net nil
+set op nil
+ regexp {
+*(nil|\"[^"]*\")\
++(nil|\"[^"]*\")\
++(nil|\(\".*\"\))\
++(nil|\"[^"]*\")\
++(nil|\(\[.*\]\))\
++(nil|\(\[.*\]\))\
++(nil|\(\".*\"\))\
++(nil|\(\(.*\)\)|\"[^"]*\")\
++nil} $line ignore fn ln aka co ph ad net op
+#
+# Make lone first names into lone last names
+if {[string match $ln "nil"]}\
+ {set ln $fn
+ set fn nil}\
+ {}
+# Check that we're in the range specified
+if {[regexp "\"$range" $ln ignore]}\
+ {}\
+ {if {[string match $ln nil]}\
+ {if {[regexp "\"$range" $co ignore]}\
+ {}\
+ {continue}}\
+ {continue}}
+#
+# Fish out the notes field so we can check whether this
+# record matches the specified conditions
+set tempone ""
+set temptwo ""
+regexp {\(notes \. \"([^"]*)\"|\"([^"]*)\"$} $op \
+ ignore tempone temptwo
+if {[string match $temptwo ""]} \
+ {set notes $tempone} \
+ {set notes $temptwo}
+if {[string match "*$condition*" $notes]} {} {continue}
+#
+# Are all three names missing? If so, skip it.
+ if { [expr 3 == \
+ [string match $fn "nil"]+\
+ [string match $ln "nil"]+\
+ [string match $co "nil"]] }\
+ {}\
+ {
+# Each entry is put in a parbox to keep it on one page.
+# The parbox opens with a vskip to make a little room
+# at the top of the page and between entries.
+puts $ofh "\\entry\{%"
+# Are both the first and last name missing? If so,
+# we skip that line.
+ set counter [expr $counter + 1]
+ if { [expr 2 == \
+ [string match $fn "nil"]+\
+ [string match $ln "nil"]] }\
+ {}\
+ {regexp {\"(.*)\"} $fn ignore fn
+ regexp {\"(.*)\"} $ln ignore ln
+puts -nonewline "$fn $ln"
+ set ln " \\textbf\{$ln\}"
+ puts $ofh "$fn$ln\\\\"}
+# Is the company name missing? If so, we'll
+# skip that line.
+ if { [string match $co "nil"] }\
+ {}\
+ {regexp {\"(.*)\"} $co ignore co
+ puts $ofh "\\textbf\{$co\}\\\\"
+ puts -nonewline $co}
+puts ""
+# Spit out any telephone numbers for this entry.
+if {[string match $ph nil]} {set ph ""} {}
+regexp {\((\[.*\])\)} $ph ignore ph
+while {[string match $ph ""] == 0} {
+ set temp ""
+ regexp {\[([^]]*)\](.*)} $ph ignore temp ph
+ regexp {\"([^"]*)\" *\"([^"]*)\"} $temp ignore temp number
+ puts -nonewline $ofh " \{\\small $number ($temp)\}"
+ if {[string match $ph ""] == 0}\
+ {puts $ofh "\\\\"}\
+ {if {[string match $ad nil]+[string match $net nil]==2}\
+ {puts $ofh ""}\
+ {puts $ofh "\\\\"}}
+ }
+# Spit out any addresses for this entry.
+if {[string match $ad nil]} {set ad ""} {}
+while {[string match $ad ""] == 0} {
+ set temp ""
+ set lineone ""
+ set linetwo ""
+ set linethree ""
+ set city ""
+ set state ""
+ set zip ""
+ set bridge ""
+ regexp {\(\[([^]]*)\](.*)\)} $ad ignore ad temp
+ regexp {\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++([0-9]*)} $ad ignore ad lineone linetwo linethree city state zip
+if {$zip == 0} {set zip ""} {}
+set comp [expr [string match $city ""]+[string match $state ""]]
+if {$comp==2}\
+ {}\
+ {if {$comp==1}\
+ {set bridge " "
+ set zip " $zip"}\
+ {if {$comp==0}\
+ {set bridge ", "
+ set zip " $zip"}\
+ {}}}
+ puts $ofh " \\address\{$ad\}\{\%"
+ if {[string match $lineone ""]}\
+ {puts $ofh "\\mygobble"}\
+ {puts $ofh " $lineone"}
+ if {[string match $linetwo ""]}\
+ {}\
+ {puts $ofh " \\\\$linetwo"}
+ if {[string match $linethree ""]}\
+ {}\
+ {puts $ofh " \\\\$linethree"}
+ if {[string match "$city$state$zip" ""]}\
+ {}\
+ {puts $ofh " \\\\$city$bridge$state$zip"}
+ puts $ofh " \}"
+ set ad $temp
+ }
+# Spit out any email addresses associated with this person
+if {[string match $net nil]} {set net ""} {}
+regexp {\((\".*\")\)} $net ignore net
+while {[string match $net ""] == 0} {
+ set temp ""
+ regexp {\"([^"]*)\"(.*)} $net ignore net temp
+ puts -nonewline $ofh "\\url\{$net\}"
+ set net $temp
+ if {[string match $net ""] == 0} {puts $ofh "\\\\"} {puts $ofh ""}
+ }
+puts $ofh "\}\n"
+}
+}
+# Once everything's finished, we send along the footer
+while 1 {
+ if {[gets $header line] == -1} break
+ puts $ofh $line
+}
+puts "Done."
+exit
+%</script>
+% \end{macrocode}
+%
+% \section{\LaTeX{} Style}
+% We use this to simplify the format file.
+% \begin{macrocode}
+%<*style>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesClass{filoaddr}
+ [1998/01/17 18:15:06 3.1.1.1 Filofax address pages (Frank Bennett)]
+\DeclareOption{fourcolumn}%
+ {\PassOptionsToPackage{\CurrentOption}{autofilo}}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\ProcessOptions
+\LoadClass{article}
+\RequirePackage{rotating}
+\RequirePackage{url}
+% \end{macrocode}
+% Some variables.
+% \begin{macrocode}
+\def\mygobble#1{}
+\newlength\templen
+\newlength\mytemplength
+\newlength\descheight
+\newlength\myparwidth
+\newlength\descwidth
+\newlength\biggerwidth
+\newlength\myentryheight
+\newlength\myparheight
+\newlength\mylinewidth
+% \end{macrocode}
+% Define a macro to format each entry.
+% \begin{macrocode}
+\def\entry#1{%
+\vbox{%
+\vskip2pt
+\topline
+\vskip 2pt
+\parbox{\linewidth}{%
+\raggedright%
+\small#1}
+\vskip 1pt
+\bottomline}}
+% \end{macrocode}
+% The above macro requires a couple of line-building
+% macros.
+% \begin{macrocode}
+\def\topline{%
+ \vbox to0pt{%
+ \hbox to\linewidth{%
+ \hskip-2.4pt%
+ \vrule width0.4pt height0pt depth7pt%
+ \vrule width\mylinewidth depth0.4pt height0pt%
+ \vrule width0.4pt height0pt depth7pt\hskip-2.4pt}%
+ \vskip-7pt}}
+\def\bottomline{%
+ \vbox to0pt{%
+ \vskip-7pt
+ \hbox to\linewidth{%
+ \hskip-2.4pt%
+ \vrule width0.4pt height7pt depth0pt%
+ \vrule width\mylinewidth depth0.4pt height0pt%
+ \vrule width0.4pt height7pt depth0pt%
+ \hskip-2.4pt}}}
+% \end{macrocode}
+% Define a macro to format addresses.
+% \begin{macrocode}
+\def\address#1#2{%
+ \settoheight\myparheight{\vbox{%
+ \boxmaxdepth0pt%
+ \parbox{\myparwidth}{\raggedright #2}}}%
+ \settowidth\descwidth{\small\textbf{#1}}%
+ \ifnum\descwidth>\myparheight\biggerwidth\descwidth\else%
+ \biggerwidth\myparheight\fi%
+ \vbox{\vskip3pt%
+ \hbox to\linewidth{%
+ \hskip3pt%
+ \vbox to\biggerwidth{%
+ \vfil%
+ \hbox to\descheight{%
+ \begin{sideways}{\small\textbf{#1}}\end{sideways}%
+ \hfil}%
+ \vfil}%
+ \hskip2pt%
+ \vbox to\biggerwidth{%
+ \vfil%
+ \hbox to\myparwidth{%
+ \parbox{\myparwidth}{\raggedright #2}}%
+ \vfil}}}}
+% \end{macrocode}
+% Define an environment that creates frames and sets up
+% variables for use in the macros we have just defined.
+% \begin{macrocode}
+\def\addresses#1{%
+ \autofilo{#1}
+ \settoheight\descheight{\vbox{\boxmaxdepth0pt{\small\textbf{Yy}}}}
+ \myparwidth\linewidth%
+ \advance\myparwidth by-\descheight\relax%
+ \advance\myparwidth by-5pt\relax%
+ \mylinewidth\linewidth
+ \advance\mylinewidth by4pt\relax}
+\def\endaddresses{\endautofilo}
+%</style>
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%<*installer>
+\def\batchfile{mkaddr.ins}
+\input docstrip.tex
+
+\keepsilent
+
+\preamble
+\endpreamble
+
+\postamble
+\endpostamble
+
+\def\WritePreamble#1{}
+\def\WritePostamble#1{}
+
+\generate{\file{mkaddr.Frank}{\from{mkaddr.dtx}{format}}
+ \file{mkaddr.tcl}{\from{mkaddr.dtx}{script}}
+ \file{.emacs.for.bbdb}{\from{mkaddr.dtx}{elisp}}
+ \file{filoaddr.sty}{\from{mkaddr.dtx}{style}}
+ }
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, you have to move the following}
+\Msg{* file into you executable search path:}
+\Msg{*}
+\Msg{* \space\space mkaddr}
+\Msg{*}
+\Msg{* And you have to move the following file into the search}
+\Msg{* used by TeX:}
+\Msg{*}
+\Msg{* \space\space filoaddr.sty}
+\Msg{*}
+\Msg{***********************************************************}
+%</installer>
+% \end{macrocode}
+%\fi
+% \Finale \PrintChanges
diff --git a/Master/texmf-dist/source/latex/calendar/mkaddr.tcl b/Master/texmf-dist/source/latex/calendar/mkaddr.tcl
new file mode 100644
index 00000000000..05bd464c816
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/mkaddr.tcl
@@ -0,0 +1,201 @@
+#!/usr/local/bin/tclsh
+if {[catch "kanji defaultInputCode EUC" errormsg]}\
+ {puts "Running $argv0 without Japanese support."
+ puts "For Japanese support, you need to use a Japanized"
+ puts "Tcl interpreter.\n"}\
+ {}
+# This script parses a database in the format used by
+# the Insidious Big Brother Database for Emacs. It can
+# be adapted to output LaTeX lists of contents and so forth.
+set format [lindex $argv 0]
+set range [lindex $argv 1]
+set condition [lindex $argv 2]
+set usage "Usage is: $argv0 \<SIZE\> \[<RANGE>\] \[<CONDITION>\]\
+\n(Square braces are literal)\
+\n(\<SIZE\> is one of \"Mieko\" or \"Frank\")"
+if {[string match $format "Mieko"]+\
+ [string match $format "Frank"]==0}\
+ {puts "$usage"; exit}\
+ {}
+if {[regexp {\[.*\]} $condition ignore]==0}\
+ {puts "$usage"; exit}\
+ {}
+if {[regexp {\[.*\]} $range ignore]==0}\
+ {puts "$usage"; exit}\
+ {}
+puts "Creating LaTeX2e file mkaddr.tex ..."
+regexp {\[(.*)\]} $condition ignore condition
+set condition "\\\[$condition\\\]"
+set ifh [open "/home/bennett/.bbdb"]
+set ofh [open "./mkaddr.tex" w+]
+set counter 0
+set temp ""
+# Let's grab the content of a header file
+set header [open "/etc/mkaddr.$format" r]
+while 1 {
+ if {[gets $header line] == -1} break
+ if {[string match $line "%%BODY%%"]} break
+ puts $ofh $line
+}
+while 1 {
+ if {[gets $ifh line] == -1} break
+ regsub -all {([ "])\\"} $line {\1``} line
+ regsub -all {\\"([^A-Za-z])} $line {''\1} line
+ regsub -all {\\n} $line { } line
+ regsub -all {([^\])%} $line {\1\\%} line
+ regsub -all {([^\])&} $line {\1\\\&} line
+set fn nil
+set ln nil
+set aka nil
+set co nil
+set ph nil
+set ad nil
+set net nil
+set op nil
+ regexp {
+*(nil|\"[^"]*\")\
++(nil|\"[^"]*\")\
++(nil|\(\".*\"\))\
++(nil|\"[^"]*\")\
++(nil|\(\[.*\]\))\
++(nil|\(\[.*\]\))\
++(nil|\(\".*\"\))\
++(nil|\(\(.*\)\)|\"[^"]*\")\
++nil} $line ignore fn ln aka co ph ad net op
+#
+# Make lone first names into lone last names
+if {[string match $ln "nil"]}\
+ {set ln $fn
+ set fn nil}\
+ {}
+# Check that we're in the range specified
+if {[regexp "\"$range" $ln ignore]}\
+ {}\
+ {if {[string match $ln nil]}\
+ {if {[regexp "\"$range" $co ignore]}\
+ {}\
+ {continue}}\
+ {continue}}
+#
+# Fish out the notes field so we can check whether this
+# record matches the specified conditions
+set tempone ""
+set temptwo ""
+regexp {\(notes \. \"([^"]*)\"|\"([^"]*)\"$} $op \
+ ignore tempone temptwo
+if {[string match $temptwo ""]} \
+ {set notes $tempone} \
+ {set notes $temptwo}
+if {[string match "*$condition*" $notes]} {} {continue}
+#
+# Are all three names missing? If so, skip it.
+ if { [expr 3 == \
+ [string match $fn "nil"]+\
+ [string match $ln "nil"]+\
+ [string match $co "nil"]] }\
+ {}\
+ {
+# Each entry is put in a parbox to keep it on one page.
+# The parbox opens with a vskip to make a little room
+# at the top of the page and between entries.
+puts $ofh "\\entry\{%"
+# Are both the first and last name missing? If so,
+# we skip that line.
+ set counter [expr $counter + 1]
+ if { [expr 2 == \
+ [string match $fn "nil"]+\
+ [string match $ln "nil"]] }\
+ {}\
+ {regexp {\"(.*)\"} $fn ignore fn
+ regexp {\"(.*)\"} $ln ignore ln
+puts -nonewline "$fn $ln"
+ set ln " \\textbf\{$ln\}"
+ puts $ofh "$fn$ln\\\\"}
+# Is the company name missing? If so, we'll
+# skip that line.
+ if { [string match $co "nil"] }\
+ {}\
+ {regexp {\"(.*)\"} $co ignore co
+ puts $ofh "\\textbf\{$co\}\\\\"
+ puts -nonewline $co}
+puts ""
+# Spit out any telephone numbers for this entry.
+if {[string match $ph nil]} {set ph ""} {}
+regexp {\((\[.*\])\)} $ph ignore ph
+while {[string match $ph ""] == 0} {
+ set temp ""
+ regexp {\[([^]]*)\](.*)} $ph ignore temp ph
+ regexp {\"([^"]*)\" *\"([^"]*)\"} $temp ignore temp number
+ puts -nonewline $ofh " \{\\small $number ($temp)\}"
+ if {[string match $ph ""] == 0}\
+ {puts $ofh "\\\\"}\
+ {if {[string match $ad nil]+[string match $net nil]==2}\
+ {puts $ofh ""}\
+ {puts $ofh "\\\\"}}
+ }
+# Spit out any addresses for this entry.
+if {[string match $ad nil]} {set ad ""} {}
+while {[string match $ad ""] == 0} {
+ set temp ""
+ set lineone ""
+ set linetwo ""
+ set linethree ""
+ set city ""
+ set state ""
+ set zip ""
+ set bridge ""
+ regexp {\(\[([^]]*)\](.*)\)} $ad ignore ad temp
+ regexp {\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++\"([^"]*)\"\
++([0-9]*)} $ad ignore ad lineone linetwo linethree city state zip
+if {$zip == 0} {set zip ""} {}
+set comp [expr [string match $city ""]+[string match $state ""]]
+if {$comp==2}\
+ {}\
+ {if {$comp==1}\
+ {set bridge " "
+ set zip " $zip"}\
+ {if {$comp==0}\
+ {set bridge ", "
+ set zip " $zip"}\
+ {}}}
+ puts $ofh " \\address\{$ad\}\{\%"
+ if {[string match $lineone ""]}\
+ {puts $ofh "\\mygobble"}\
+ {puts $ofh " $lineone"}
+ if {[string match $linetwo ""]}\
+ {}\
+ {puts $ofh " \\\\$linetwo"}
+ if {[string match $linethree ""]}\
+ {}\
+ {puts $ofh " \\\\$linethree"}
+ if {[string match "$city$state$zip" ""]}\
+ {}\
+ {puts $ofh " \\\\$city$bridge$state$zip"}
+ puts $ofh " \}"
+ set ad $temp
+ }
+# Spit out any email addresses associated with this person
+if {[string match $net nil]} {set net ""} {}
+regexp {\((\".*\")\)} $net ignore net
+while {[string match $net ""] == 0} {
+ set temp ""
+ regexp {\"([^"]*)\"(.*)} $net ignore net temp
+ puts -nonewline $ofh "\\url\{$net\}"
+ set net $temp
+ if {[string match $net ""] == 0} {puts $ofh "\\\\"} {puts $ofh ""}
+ }
+puts $ofh "\}\n"
+}
+}
+# Once everything's finished, we send along the footer
+while 1 {
+ if {[gets $header line] == -1} break
+ puts $ofh $line
+}
+puts "Done."
+exit
diff --git a/Master/texmf-dist/source/latex/calendar/monthly.dtx b/Master/texmf-dist/source/latex/calendar/monthly.dtx
new file mode 100644
index 00000000000..22dbb1ec360
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/monthly.dtx
@@ -0,0 +1,565 @@
+%\iffalse
+%
+% file: monthly.dtx
+% Copyright (C) 1996-1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+%\fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:15:10}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{monthly.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \changes{v1.0}{1996/02/15}{Initial Version}
+% \changes{v1.0}{1997/02/17}{Style now stable enough to
+% justify recording changes. Added protection for definition
+% of cal@entry@text. It is now possible to put a pound
+% sign in front of entries. A change to the
+% dates module allows entries on the same day each
+% month. So we can now record standing charges against
+% bank accounts. Oh joy.}
+% \changes{v1.0}{1997/02/20}{First release version.
+% Merged all code into the class file.
+% Thanks to Robin Fairbairns for
+% his help on the vertical sizing of
+% tables, and to David Carlisle for pointing out
+% the \texttt{protected@edef} command.}
+% \changes{v1.1}{1997/03/01}{Modified stacking method
+% for items to permit line wrapping. Code could be more
+% concise and clear, but it runs well enough.}
+% \changes{v1.1}{1997/03/01}{Adapted documentation from
+% the Timetable package.}
+% \changes{v1.2}{1997/05/12}{Page formatting is now handled
+% through the \texttt{geometry} package. Landscaping can
+% also handled through \texttt{geometry}, as suggested by
+% Christian Horn. Faulty linespacing has now been fixed.
+% Documentation has also been improved.}
+% \changes{v1.3}{1997/05/19}{Support is now provided for Japanese
+% as well as English calendars. There is no support for Imperial
+% dates; users have to put these in by hand using the \texttt{title}
+% option, if Imperial dates are required. The changes principally
+% affected the Dates package.}
+% \changes{v1.3}{1997/05/20}{Fixed bug in \texttt{firstday} option.
+% Labels were not shifting with the calendar start day.
+% Thanks due to Miroslav Novak for reporting this bug.}
+% \changes{v1.3}{1997/05/20}{Added German support. Thanks due to
+% Christian Horn.}
+% \changes{v1.4}{1997/05/29}{Amended documentation, including
+% a description of a proper set of options for handling page
+% orientation and layout. Still need to do the coding, though.}
+% \changes{v1.4}{1997/05/29}{Completed coding of orientation
+% and layout options. Pretty simple, once the strategy was
+% clear.}
+% \changes{v1.4}{1997/05/30}{Added linklandscape option and
+% added documentation on the new method of handling format
+% and orientation.}
+% \changes{v1.4}{1997/06/02}{Tidied up the way rotation and
+% page layout options are reconciled.}
+% \changes{v1.4}{1997/06/02}{Added \cs{noindent} to suppress
+% indentation internally.}
+% \changes{v1.4}{1997/06/03}{Generalized code for setting page
+% sizes and adjusting typefaces. Also added automatic selection
+% of abbreviated day names for narrow calendars. Ready for
+% final release.}
+% \changes{v1.4}{1997/06/06}{Major rearrangements were needed to
+% fix problems with page formatting and rotation, reported by
+% Christian Horn.}
+% \changes{v1.5}{1997/06/09}{Further improvements to calendar
+% sizing. An over-wide margin with B4 paper continues to cause
+% problems. Could Japanese B4 paper be a different size?}
+% \changes{v1.6}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% monthly.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:15:10 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:14:10 root
+% Release code
+%
+% Revision 2.8 1998/01/17 15:36:01 root
+% *** empty log message ***
+%
+% Revision 2.7 1998/01/17 15:34:30 root
+% *** empty log message ***
+%
+% Revision 2.6 1998/01/17 11:31:00 root
+% *** empty log message ***
+%
+% Revision 2.5 1998/01/16 17:05:53 root
+% *** empty log message ***
+%
+% Revision 2.4 1998/01/16 09:14:25 root
+% *** empty log message ***
+%
+% Revision 2.3 1998/01/16 08:04:38 root
+% *** empty log message ***
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 14:56:45 bennett
+% Release code.
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the Monthly Calendar
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \CheckSum{381}
+%
+% Please see the file \texttt{calguide.tex} for documentation
+% on this calendar style.
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{The Class File}
+%
+% \subsection{Preliminaries}
+%
+% Use \LaTeXe, and tell the user who we are.
+%
+% \begin{macrocode}
+%<*class>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{monthly}
+ [1998/01/17 18:15:10 3.1.1.1 Monthly Calendar (Frank Bennett)]
+% \end{macrocode}
+% Define some more variables and switches for use in the body
+% of the style.
+% \begin{macrocode}
+\newcount\mon@tempcount
+\newcount\mon@firstday
+\newtoks\mon@tempreg@b
+\newlength\mon@tablewidth
+\newtoks\mon@tempreg@a
+\newlength{\mon@vh}
+\newlength{\mon@hw}
+\newlength{\mon@templen}
+\newlength{\mon@heightlessboxes}
+\newlength{\mon@widthlessboxes}
+\newif\ifmon@explicittitle
+\newif\ifmon@shortdays
+\newlength{\mon@oddsidemargin}
+\newlength{\mon@evensidemargin}
+\newlength{\mon@topmargin}
+\newif\ifmon@usedgeometry
+\newlength{\mon@adjustment}
+\newlength{\mon@textwidth}
+\newlength{\mon@textheight}
+% \end{macrocode}
+%
+% \subsection{Options}
+%
+% In common with all other packages in the Calendar
+% bundle, we include options for all of the drivers supported
+% by the color package and the graphics package, and
+% include some code for declaring languages.
+%
+% \begin{macrocode}
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+% \end{macrocode}
+%
+% \subsection{Option Postprocessing}
+%
+% Now that the options lists are available to us,
+% we can start loading packages. The following packages
+% are always loaded, and always with the same options.
+% \begin{macrocode}
+\RequirePackage{array}[1996/06/14]
+\RequirePackage{calendar}
+% \end{macrocode}
+% Next, we set the dimensions
+% of the table that will contain the calendar.
+% \begin{macrocode}
+ \def\mon@settableheight{%
+ \setlength{\mon@vh}{\vsize}%
+ \addtolength{\mon@vh}{-0.001pt}}%
+ \def\mon@settablewidth{%
+ \setlength{\mon@tablewidth}{\hsize}}%
+% \end{macrocode}
+% Typefaces, and abbreviated day names versus full day names
+% are selected by options.
+% \begin{macrocode}
+
+% \end{macrocode}
+%
+% \subsection{Calendar Setup}
+%
+% Define some key values for use by the calendar environment.
+% \begin{macrocode}
+\define@key{opt}{title}{%
+ \def\mon@title{#1}\mon@explicittitletrue}
+\define@key{opt}{labels}{%
+ \@storelabels#1,,{}}
+\define@key{opt}{shortdays}{%
+ \mon@shortdaystrue}
+\define@key{opt}{firstday}{%
+ \mon@firstday=#1}
+\define@key{opt}{titletype}{\def\mon@titletype{#1}}
+\define@key{opt}{daynametype}{\def\mon@nametype{#1}}
+\define@key{opt}{datetype}{\def\mon@datetype{#1}}
+\define@key{opt}{texttype}{\def\mon@texttype{#1}}
+\mon@firstday=0%
+% \end{macrocode}
+% Define a utility macro for use by the \texttt{labels} key.
+% This stores a comma-delimited list of labels to a single
+% macro, which can then be used as a line in the table
+% environment that makes up the calendar.
+% \begin{macrocode}
+\def\@storelabels{%
+ \def\mon@labeltext{}%
+ \@@storelabels}
+\def\@@storelabels#1,#2#{%
+ \ifcat$#1$%
+ \mon@tempreg@a=\expandafter\expandafter\expandafter{%
+ \expandafter\@gobble\mon@labeltext}%
+ \protected@edef\mon@labeltext{\the\mon@tempreg@a}%
+ \let\next\@gobble%
+ \else%
+ \let\next\@@storelabels%
+ \mon@tempreg@a=\expandafter{\mon@labeltext}%
+ \protected@edef\mon@labeltext{\the\mon@tempreg@a&#1}%
+ \fi%
+ \next#2{}}
+% \end{macrocode}
+% Define default values for the environment keys. The title is set
+% inside the scope of \cs{newcalendar}
+% \begin{macrocode}
+\def\mon@theweekday{\ifmon@shortdays\theshortweekday\else%
+ \theweekday\fi}%
+\def\mon@titletype{\large\bfseries}%
+\def\mon@daynametype{\bfseries}%
+\def\mon@datetype{\bfseries}%
+\def\mon@texttype{\tiny}%
+\mon@firstday=0%
+% \end{macrocode}
+%
+% \subsection{Calendar Definition}
+%
+% The calendar definition itself consists of a single command
+% and its associated arguments.
+% \begin{macrocode}
+\newcalendar%
+% \end{macrocode}
+% We give the environment a name.
+% \begin{macrocode}
+{monthly}
+% \end{macrocode}
+% We're producing DVI, so we use the standard
+% macro for dropping text into the hopper.
+% \begin{macrocode}
+{\cal@insert}
+% \end{macrocode}
+% We start the calendar on Sunday. Season to taste.
+% Use integers "0" through "6".
+% \begin{macrocode}
+{\mon@firstday}
+% \end{macrocode}
+% The length of a group is the length of the month.
+% \begin{macrocode}
+{\dates@days}
+% \end{macrocode}
+% The length of a subgroup is one week.
+% \begin{macrocode}
+{7}
+% \end{macrocode}
+% The delimiter to go before every item but the first
+% is a table separator.
+% \begin{macrocode}
+{&}
+% \end{macrocode}
+% Increment the date counter with every item.
+% \begin{macrocode}
+{I}
+% \end{macrocode}
+% Define the header. The macro inserted here is defined
+% below, in the block of code run after the date is read,
+% and before the table is opened.
+% \begin{macrocode}
+{\mon@header}
+% \end{macrocode}
+% We define the end of the calendar.
+% \begin{macrocode}
+{\\\hline\end{tabular}}
+% \end{macrocode}
+% We define a way to open a new group.
+% \begin{macrocode}
+{\cal@footer\newpage\cal@header}
+% \end{macrocode}
+% We define the way to end a subgroup. In this case,
+% we want to start a new line and lay down a rule.
+% \begin{macrocode}
+{\\\hline}
+% \end{macrocode}
+% We set up to require a month in the environment typed
+% into the user's document.
+% \begin{macrocode}
+{\dates@requiremonthtrue}
+% \end{macrocode}
+% The next section runs after the calendar dates have been
+% scanned from the environment, but before the table is
+% opened.
+% \textit{Whatever month was (last) indicated in the environment
+% section of the calendar, we want to start on the first
+% day, and make a calendar for one month only. We accomplish
+% this by adjusting the human-side date, and pushing the
+% result through to the long date with \texttt{dates@fix}.
+% We then readjust the human side data with \texttt{caldate}.
+% This puts us on the first day of the month, and we
+% set the counter \texttt{cal@range@start} to this long date.}
+%
+% \begin{macrocode}
+{\dates@day=1%
+ \dates@fix%
+ \caldate%
+ \cal@range@start\dates@date%
+% \end{macrocode}
+% \textit{We tell the user where we're starting.}
+% \begin{macrocode}
+ \message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+% \end{macrocode}
+% \textit{Then we jump to the last day of the last
+% month in the range given by the user, and
+% do the same readjustment with \texttt{dates@fix} and
+% \texttt{caldate}. We set the end of the range to this
+% value.}
+% \begin{macrocode}
+ \dates@date\cal@range@end%
+ \caldate%
+ \dates@day\dates@days%
+ \dates@fix%
+ \caldate%
+ \cal@range@end\dates@date%
+% \end{macrocode}
+% \textit{We let the user know where we plan to stop.}
+% \begin{macrocode}
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+% \end{macrocode}
+% \textit{We jump back to the starting date and reset the
+% human-side values.}
+% \begin{macrocode}
+ \dates@date=\cal@range@start%
+ \caldate%
+% \end{macrocode}
+% \textit{Now that the date adjustments have been taken care of,
+% it's time to figure out the size of the calendar. We start by
+% getting some initial sizes from the height and width of the
+% text area of the current page.}
+% \begin{macrocode}
+ \mon@settablewidth%
+ \mon@settableheight%
+% \end{macrocode}
+% \textit{We add \cs{extrarowheight} to prim up the headings a little.
+% We will still get text touching lines with \cs{Huge} typefaces,
+% but this is better than nothing.}
+% \begin{macrocode}
+% \setlength{\extrarowheight}{3pt}%
+% \end{macrocode}
+% \textit{Fetch the full height of the title to heightlessboxes.}
+% \begin{macrocode}
+ \settoheight{\mon@templen}{\vbox{\boxmaxdepth=0pt%
+ \begin{tabular}{c}%
+ \mon@titletype%
+ \the\dates@monthname%
+ \end{tabular}}}%
+ \setlength{\mon@heightlessboxes}{\mon@templen}%
+% \end{macrocode}
+% \textit{Fetch the full height of the day labels to heightlessboxes.}
+% \begin{macrocode}
+ \settoheight{\mon@templen}{\vbox{\boxmaxdepth=0pt%
+ \begin{tabular}{c}%
+ \mon@daynametype%
+ Monday%
+ \end{tabular}}}%
+ \addtolength{\mon@heightlessboxes}{\mon@templen}%
+% \end{macrocode}
+% \textit{Add 10 $\times$ the rule width and the space between double-rules
+% to heightlessboxes.}
+% \begin{macrocode}
+ \addtolength{\mon@heightlessboxes}{10\arrayrulewidth}%
+ \addtolength{\mon@heightlessboxes}{\doublerulesep}%
+% \end{macrocode}
+% \textit{Finally, we make some adjustments that I arrived
+% at by trial and error; I have no idea why these particular
+% measurements work. If anyone wants to improve this, be my
+% guest. I have run out of patience on this one.}
+% \begin{macrocode}
+ \addtolength{\mon@heightlessboxes}{\mon@adjustment}%
+ \addtolength{\mon@heightlessboxes}{2pt}%
+% \end{macrocode}
+% \textit{The height of the boxes is the full width of
+% the text minus heightlessboxes. Divide
+% by 6 for the height of an individual box.}
+% \begin{macrocode}
+ \addtolength{\mon@vh}{-\mon@heightlessboxes}%
+ \divide\mon@vh by6%
+% \end{macrocode}
+% \textit{The width is simpler. We have 8 rules, and
+% a total of 14 gaps between text and rules.
+% Add it all up, subtract the total from textheight,
+% divide by 7 and Thunderbirds are Go.}
+% \begin{macrocode}
+ \setlength{\mon@hw}{\mon@tablewidth}%
+ \setlength{\mon@widthlessboxes}{8\arrayrulewidth}%
+ \addtolength{\mon@hw}{-\mon@widthlessboxes}%
+ \addtolength{\mon@hw}{-14\tabcolsep}%
+ \divide\mon@hw by7\relax%
+% \end{macrocode}
+% \textit{Well, almost go. We need to build the header macro.
+% Our first step is to create the default labels,
+% if the user has not specified any.}
+% \begin{macrocode}
+ \@ifundefined{mon@labeltext}{%
+ \def\mon@defaultlabels{}%
+ \mon@tempcount=1%
+ \advance\dates@date by-\dates@weekd%
+ \advance\dates@date by\mon@firstday%
+ \caldate%
+ \loop%
+ \mon@tempreg@a=\expandafter{\mon@defaultlabels}%
+ \edef\mon@defaultlabels{\the\mon@tempreg@a\mon@theweekday,}%
+ \ifnum\mon@tempcount<7%
+ \advance\dates@date by1%
+ \caldate%
+ \advance\mon@tempcount by 1\relax%
+ \repeat%
+ \expandafter\@storelabels\mon@defaultlabels,,{}%
+ \dates@date\cal@range@start%
+ \caldate}%
+ {}%
+% \end{macrocode}
+% \textit{Then we define the header itself.}
+% \begin{macrocode}
+ \def\mon@settitle{\ifmon@explicittitle\else%
+ \def\mon@title{\themonth\space\theyear}\fi}%
+ \protected@edef\mon@header{%
+ \noexpand\mon@settitle%
+ \noexpand\begin{tabular}{|c|c|c|c|c|c|c|}%
+ \noexpand\hline%
+ \noexpand\multicolumn{7}{|c|}{\mon@titletype%
+ \noexpand\mon@title}\noexpand\\%
+ \noexpand\hline\noexpand\hline%
+ \mon@labeltext\noexpand\\%
+ \noexpand\hline}}%
+% \end{macrocode}
+% Events are delimited by \cs{newline}.
+% \begin{macrocode}
+{\par}%
+% \end{macrocode}
+% The next argument is dropped on DVI for each item.
+% We use it here to fetch the text of appointments and
+% events to the standard list macros, using the
+% standard text-fetching commands. Each generates a
+% stack delimited by the phrase that was set above.
+% \begin{macrocode}
+{\cal@get@appointments\cal@get@events}%
+% \end{macrocode}
+% This sets \cs{cal@entry@text}. It is executed for every
+% event or appointment in the database that applies
+% to a given item. We differentiate between whole-day events,
+% pinpointed events and ranged events.
+% \begin{macrocode}
+{\relax%
+ \ifnum\dates@time@start>0\relax%
+ \ifnum\dates@time@start=\dates@time@end%
+ \protected@edef\cal@entry@text{%
+ \thetimestart\space%
+ \cal@textcolor{\calcolor}{\theshorttext}}%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \thetimestart--\thetimeend\space%
+ \cal@textcolor{\calcolor}{\theshorttext}}%
+ \fi%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \cal@textcolor{\calcolor}{\theshorttext}}%
+ \fi}%
+% \end{macrocode}
+% Finally we tell the style how to create the
+% text for each item (which is an individual date
+% box in this case). We use \texttt{vbox} to make
+% the height static.
+% Thanks are due to Christian Horn for forwarding a
+% handwritten sample of a tabular environment, demonstrating
+% that an error in the linespacing was \textit{not} produced
+% by \LaTeXe's internals. In the end, the problem turned out
+% to be due to grouping; \LaTeX{}, I now remember, sets
+% linespacing according to the typeface in force at the end
+% of a paragraph or parbox.
+% \begin{macrocode}
+{\vbox to\mon@vh{%
+ \vskip\medskipamount%
+ \hbox{\parbox{\mon@hw}{\mon@datetype\theday}}%
+ \ifcat$\theevents$%
+ \else%
+ \vskip\smallskipamount%
+ \hbox{\parbox{\mon@hw}{\raggedright%
+ \mon@texttype\theevents}}%
+ \fi%
+ \ifcat$\theappointments$%
+ \else%
+ \vskip\smallskipamount%
+ \hbox{\parbox{\mon@hw}{\raggedright%
+ \mon@texttype\theappointments}}%
+ \fi%
+ \vfil}}%
+%</class>
+% \end{macrocode}
+% \Finale \PrintChanges
diff --git a/Master/texmf-dist/source/latex/calendar/overword.dtx b/Master/texmf-dist/source/latex/calendar/overword.dtx
new file mode 100644
index 00000000000..b92b610a2f8
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/overword.dtx
@@ -0,0 +1,344 @@
+%\iffalse
+%
+% File overword.dtx
+% Copyright (C) 1996, 1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author(s) in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk
+%
+%<style>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<style>\ProvidesPackage{overword}
+%<style> [1998/01/17 18:15:15 3.1.1.1 Overword parsing support (Frank Bennett)]
+% \fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:15:15}
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{overword.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \changes{v1.0}{1996/11/10}{Initial version separated from calendar.dtx}
+% \changes{v1.1}{1996/11/10}{Fixed error in the installation file.}
+% \changes{v1.2}{1997/01/09}{Added @preoverwordspace, for use with Camel 1.0s.}
+% \changes{v1.3}{1997/03/01}{Trivial change to documentation.}
+% \changes{v1.4}{1997/03/04}{Put \texttt{iffalse} around installation
+% file section of \texttt{dtx} file.}
+% \changes{v1.5}{1997/10/05}{Changed local use of \cs{let} re \cs{@overword}
+% tp global, to avoid cross-nested local and global assignments.}
+% \changes{v1.6}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% overword.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:15:15 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:14:24 root
+% Release code
+%
+% Revision 2.3 1998/01/16 11:59:18 root
+% *** empty log message ***
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 14:55:51 bennett
+% Release code.
+%
+% Revision 1.5 1997/10/30 20:27:21 root
+% Trivial changes to the demo file.
+%
+% Revision 1.4 1997/10/30 08:15:14 root
+% Added a note in the documentation describing the \@ifnextnparchar
+% macro.
+%
+% Revision 1.3 1997/10/29 21:20:29 root
+% Eliminated what looked like a needless gdef of preoverwordspace
+% in @ifoverword.
+%
+% Revision 1.2 1997/10/29 20:10:35 bennett
+% *** empty log message ***
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the Overword package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
+% \DoNotIndex{\@flushglue,\@gobble,\@input}
+% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
+% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
+% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
+% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
+% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
+% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
+% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup}
+% \DoNotIndex{\cal,\csname,\def,\documentstyle,\dospecials,\edef}
+% \DoNotIndex{\egroup}
+% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
+% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
+% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
+% \DoNotIndex{\ifcase}
+% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
+% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
+% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
+% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
+% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
+% \DoNotIndex{\strutbox}
+% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
+% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
+% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
+% \DoNotIndex{\catcode,\end,\escapechar,\frenchspacing,\glossary}
+% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
+% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
+% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
+% \DoNotIndex{\nopagebreak}
+% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
+% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
+% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
+% \DoNotIndex{\[,\{,\},\]}
+% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
+% \DoNotIndex{\baselineskip,\begin,\tw@}
+% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q}
+% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H}
+% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z}
+% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
+% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
+% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
+% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment}
+% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
+% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
+% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
+% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
+% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting}
+% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
+% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
+% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
+% \DoNotIndex{\bfdefault}
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent This package provides two low-level macros for the parsing of text
+% using \LaTeXe{}.
+% \end{abstract}
+%
+%
+% \CheckSum{143}
+%
+% \section{Using the macros}
+%
+% This package provides two macros which can be used as
+% building blocks for the parsing of text. It forms
+% part of the Calendar package, but is written as
+% a discrete module that may be used in other packages
+% as well.
+%
+% The "\@ifoverword" macro takes four arguments. These
+% are, in order: a token to match; a text to expand when
+% a match is found; a text to expand if the match is
+% not found; and a text to expand if the macro encounters
+% "\end". This last is required to allow macros to be
+% built which will react gracefully when the end of an
+% environment or a document is encountered.
+%
+% This macro hops over word units (delimited by a space or spaces,
+% any number of return characters being treated as a space),
+% and expands text according to what it finds on the other side.
+% Within the text arguments, "\@overword" can be used to
+% insert the word that has been gobbled. The expanded
+% text can contain the name of the macro that invokes
+% "\@ifoverword".
+% Note that "\@overword" is relaxed at each invocation of
+% the macro. This can be used to detect whether the macro
+% has encountered an "\end" immediately after itself or
+% beyond a word, and thereby exit cleanly in either case.
+%
+% The file "demo.tex" contains a sample of the use of this macro.
+% This can be used as a model for building text-parsing loops.
+%
+% The \cs{@ifnextnparchar} macro serves the same purpose as
+% \cs{@ifnextchar} except that, like \cs{@ifoverword}, it is
+% indifferent to \cs{par} (if it encounters one, it will
+% gobble it and look at the next token following it).
+% And like \cs{@ifoverword}, it
+% takes a text to expand when the next token is \cs{end}
+% as its fourth argument, to help
+% protect against accidental attempts to read past the end
+% of the file.
+%
+%\StopEventually{\PrintIndex}
+%
+% \begin{macro}{\@ifoverword}
+% \begin{macrocode}
+%<*style>
+\long\def\@ifoverword#1#2#3#4{%
+ \let\reserved@a=#1%
+ \def\reserved@d{#4}\def\reserved@b{#2}\def\reserved@c{#3}%
+ \global\let\@overword\relax%
+ \futurelet\@let@token\@ifowd}
+\long\def\@ifowd{%
+ \ifx\@let@token\@sptoken%
+ \gdef\@preoverwordspace{ }%
+ \let\reserved@e\@xifowd%
+ \else%
+ \ifx\@let@token\end%
+ \let\reserved@e\reserved@d%
+ \else%
+ \ifx\@let@token\par%
+ \let\reserved@e\@xifpargobble%
+ \else%
+ \long\def\reserved@e##1 {\long\gdef\@overword{##1}\@@ifowd}%
+ \fi%
+ \fi%
+ \fi%
+ \reserved@e}
+\long\def\@xifpargobble#1{\futurelet\@let@token\@ifowd}
+\def\:{\@xifowd} \expandafter\def\: {\futurelet\@let@token\@ifowd}
+\def\@@ifowd{\futurelet\@let@token\@ifnparnch}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ifnextnparchar}
+% \begin{macrocode}
+\long\def\@ifnextnparchar#1#2#3#4{%
+ \let\reserved@a=#1%
+ \def\reserved@b{#2}\def\reserved@c{#3}\def\reserved@d{#4}%
+ \futurelet\@let@token\@ifnparnch}
+\long\def\@ifnparnch{%
+ \ifx\@let@token\@sptoken%
+ \let\reserved@e\@xifnparnch%
+ \else%
+ \ifx\@let@token\end%
+ \let\reserved@e\reserved@d%
+ \else%
+ \ifx\@let@token\par%
+ \let\reserved@e\@xifpargobblench%
+ \else%
+ \ifx\@let@token\reserved@a%
+ \let\reserved@e\reserved@b%
+ \else%
+ \let\reserved@e\reserved@c%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \reserved@e}
+\long\def\@xifpargobblench#1{\futurelet\@let@token\@ifnparnch}
+\def\:{\@xifnparnch}
+\expandafter\def\: {\futurelet\@let@token\@ifnparnch}
+%</style>
+% \end{macrocode}
+% \end{macro}
+%\iffalse
+% \section{Demo file}
+%
+% \begin{macrocode}
+%<*demo>
+\documentclass{minimal}
+\usepackage{overword}
+
+\begin{document}
+
+\makeatletter
+
+\newtoks\registerone
+\newtoks\registertwo
+\def\list{}
+
+\def\stashonright{%
+ \registerone=\expandafter{\@overword}
+ \registertwo=\expandafter{\list}
+ \edef\list{%
+ \noexpand\\{\the\registerone}\the\registertwo}}
+
+\def\showlist{%
+ \def\\##1{\message{##1}}
+ \message{\space\space -> }
+ \list
+ \message{^^J}}
+
+\def\readlistagain{%
+ \def\\##1{ ##1 }
+ \edef\listtext{\list}
+\message{\listtext}
+ \expandafter\store\listtext\enditall}
+
+\def\storeandshow{%
+ \@ifoverword\enditall
+ {\message{Ran into \string\enditall!^^J}
+ \stashonright
+ \expandafter\showlist\@gobble}
+ {\stashonright
+ \storeandshow}
+ {\message{Ran into \string\end!^^J}
+ \stashonright
+ \showlist}}
+
+\message{^^J----------------------------------------------------------------------}
+\message{This file demonstrates the operation of the Overword package for LaTeX}
+\message{Ordinarily, TeX reads and inteprets printable characters one by one.}
+\message{With this package, it is possible to read input word by word. This}
+\message{capability makes it possible to design user interfaces which are more}
+\message{intuitive to users. The Calendar bundle is one example of such an}
+\message{interface. Below, a phrase is printed to the terminal twice, once in}
+\message{reverse word order, and once in re-reversed (normal) word order. Each}
+\message{message is triggered by a control sequence found just beyond the last}
+\message{word read --- \string\enditall in the first instance, \string\end\space in the second.}
+\message{This file produces no printed output.}
+\message{^^J----------------------------------------------------------------------}
+
+\storeandshow This is a demonstration of the overword package \enditall
+
+\let\listclone\list
+\def\list{}
+\def\\#1{ #1 }
+\edef\listtext{\listclone}
+\expandafter\storeandshow\listtext
+
+\end{document}
+%</demo>
+% \end{macrocode}
+%\fi
+% \Finale \PrintChanges
diff --git a/Master/texmf-dist/source/latex/calendar/plotutil.dtx b/Master/texmf-dist/source/latex/calendar/plotutil.dtx
new file mode 100644
index 00000000000..11fa3fef28b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/plotutil.dtx
@@ -0,0 +1,78 @@
+%\iffalse
+%
+% This is a set of utilities that I have used in London
+% to print large files to an HP 6xx series plotter.
+% At least the way I use it, this plotter handles the top
+% margin in a bizzare way that requires some preprocessing
+% to get things into a predictable location on the physical
+% page. I don't provide any documentation here, because the
+% chances are good that my problems were one-off problems.
+% But it you, too, have trouble with HP 6xx series plotters
+% and dvips, I will be happy to explain how this stuff works
+% together (if I can remember).
+%
+%\fi
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{plotutil.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{77}
+%
+%\StopEventually{\PrintIndex}
+%
+% \begin{macrocode}
+%<*script>
+#!/bin/bash
+JOBNAME=`basename ${*##* } .dvi`
+if [ $# -gt 1 ] ; then
+ OPTIONS=${*% *}
+else
+ OPTIONS=""
+fi
+echo -------------------------------------------------------------------
+echo : Calculating offset value
+HEIGHT=`cat ./$JOBNAME.hps | sed -e s/.*PageSize\ \\\[[0-9]*\ \\\\\([0-9]*\\\\\)\\\].*/\\\1/`
+OFFSET=795
+echo : Offset base figure is ${OFFSET}pt
+PT_OFFSET=`echo $OFFSET $HEIGHT-p|dc|sed s/-/_/`
+echo : Required offset in points is ${PT_OFFSET}pt
+CM_OFFSET=`echo 2k$PT_OFFSET 72.27/2.54*p|dc`
+echo : Setting offset to ${CM_OFFSET}cm
+echo : ...
+echo : God only knows why this process is necessary.
+echo : \$\#\&\^\"\=\$\%\@
+echo -------------------------------------------------------------------
+echo dvips $OPTIONS -P372hpplotq -O 2.1cm,${CM_OFFSET}cm -h ./$JOBNAME.hps -o $JOBNAME.ps $JOBNAME.dvi
+dvips $OPTIONS -P372hpplotq -O 2.1cm,${CM_OFFSET}cm -h ./$JOBNAME.hps -o $JOBNAME.ps $JOBNAME.dvi
+echo Wrote PostScript\(TM\) output to $JOBNAME.ps \(I think\).
+%</script>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*style>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{hpplotsz}
+ [1997/11/07 Custom page sizes with HP 6xx series plotters (Frank Bennett)]
+\newlength\hps@templen
+\newwrite\hps@pagesizeheader
+\newcount\hps@orientation
+\def\hps@@strip#1.#2\end{#1}
+\def\hps@strip#1{\expandafter\hps@@strip\the#1\end}
+\def\sethpplotsize{%
+ \ifnum\hsize>\vsize\hps@orientation=3\else\hps@orientation=0\fi
+ \immediate\openout\hps@pagesizeheader=./\jobname.hps
+ \immediate\write\hps@pagesizeheader{%
+ <</PageSize [\hps@strip\paperwidth\space\hps@strip\paperheight] /Orientation \the\hps@orientation>>setpagedevice}
+ \immediate\closeout\hps@pagesizeheader}
+%</style>
+% \end{macrocode}
+% \Finale \PrintChanges
diff --git a/Master/texmf-dist/source/latex/calendar/timesht.dtx b/Master/texmf-dist/source/latex/calendar/timesht.dtx
new file mode 100644
index 00000000000..407b20ab454
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/timesht.dtx
@@ -0,0 +1,688 @@
+%\iffalse
+%
+% file: timesht.dtx
+% Copyright (C) 1996-1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+%\fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:15:23}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{timesht.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \changes{v1.1}{1997/02/26}{Redraft of original Timesheets
+% package, using Timetable package as a model.}
+% \changes{v1.2}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% timesht.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:15:23 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:15:05 root
+% Release code
+%
+% Revision 2.15 1998/01/17 11:54:43 root
+% *** empty log message ***
+%
+% Revision 2.14 1998/01/17 11:48:41 root
+% *** empty log message ***
+%
+% Revision 2.13 1998/01/17 10:27:17 root
+% *** empty log message ***
+%
+% Revision 2.12 1998/01/17 10:25:29 root
+% *** empty log message ***
+%
+% Revision 2.11 1998/01/17 04:42:57 root
+% *** empty log message ***
+%
+% Revision 2.10 1998/01/16 20:42:51 root
+% *** empty log message ***
+%
+% Revision 2.9 1998/01/16 17:10:16 root
+% *** empty log message ***
+%
+% Revision 2.8 1997/12/06 09:04:25 root
+% Finished elimination of landscape code, eliminated superfluous brace.
+%
+% Revision 2.7 1997/12/06 09:01:41 root
+% Initialized tms@blocklist to empty macro.
+%
+% Revision 2.6 1997/12/06 08:54:55 root
+% Changed docstrip label from class to package.
+%
+% Revision 2.5 1997/12/06 08:32:41 root
+% Disable paragraph indenting inside calendar environment.
+%
+% Revision 2.4 1997/12/06 08:27:43 root
+% Converted to style from class.
+%
+% Revision 2.3 1997/12/04 19:32:22 bennett
+% Added typeface variables for appointments having only a
+% single time.
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.3 1997/11/05 06:21:56 root
+% Superfluous brace in new definition.
+%
+% Revision 2.1.1.2 1997/11/05 06:17:14 root
+% Hooked up title parameter following report fro,
+%
+% from Edward Czilli.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 14:47:16 bennett
+% Release code.
+%
+% Revision 1.7 1997/10/30 20:25:58 root
+% Moved \extrarowheight so that it is only invoked once, when
+% the table is first opened.
+%
+% Revision 1.6 1997/10/30 13:46:59 root
+% Moved reset of counter, in the code for the group-closing
+% footer, above the closing \\\hline to avoid leftovers on
+% the following line.
+%
+% Revision 1.5 1997/10/30 12:38:13 root
+% Changed use of \@newline to \par, to avoid weird errors arising
+% from LaTeX for reasons I do not fully understand.
+%
+% Revision 1.4 1997/10/30 12:31:50 root
+% Put \relax after the option text setting blockminutes.
+%
+% Revision 1.3 1997/10/29 20:13:36 bennett
+% *** empty log message ***
+%
+% Revision 1.2 1997/10/29 17:18:39 root
+% Added reset of block counter on end of subgroup, to make
+% underlining between blocks position correctly on second
+% and subsequent pages.
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the Timesheet
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \CheckSum{598}
+%
+% \section{Note}
+%
+% Documentation for this package is contained in the file
+% \texttt{calguide.tex}.
+%
+%\StopEventually{\PrintIndex}
+%
+% \section{The Class File}
+%
+% Preliminaries.
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{timesht}
+ [1998/01/17 18:15:23 3.1.1.1 Timesheet (Frank Bennett)]
+% \end{macrocode}
+%
+% Initialize all registers and if statements to be
+% used by this class.
+%
+% \begin{macrocode}
+\newif\iftms@usetimes
+\tms@usetimestrue
+\newlength\tms@tablewidth
+\newlength{\tms@hw}
+\newlength{\tms@templen}
+\newlength{\tms@widthlessboxes}
+\newlength{\tms@timetextlen}
+\newtoks\tms@tempreg@a
+\newtoks\tms@tempreg@b
+\newcount\tms@tempcount
+\newcount\tms@start
+\newcount\tms@end
+\newcount\tms@minuteblocks
+\newcount\tms@boxes
+\newcount\tms@days
+\newcount\tms@blocks
+\newcount\tms@time@start
+\newcount\tms@time@end
+\newcount\tms@hours@start
+\newcount\tms@minutes@start
+\newcount\tms@hours@end
+\newcount\tms@minutes@end
+\newcount\tms@minute@base
+\newlength{\tms@numlen}
+\newcount\tms@rightprop
+\newcount\tms@leftprop
+\newcount\tms@groupblocks
+\newcount\tms@groupblockcount
+\tms@groupblockcount=1%
+\newlength{\tms@colonlen}
+\newlength{\tms@dashlen}
+\newlength{\tms@leftlen}
+\newlength{\tms@rightlen}
+\tms@leftprop=1%
+\tms@rightprop=1%
+% \end{macrocode}
+% Language setup.
+% \begin{macrocode}
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+% \end{macrocode}
+%
+% Load a bunch of useful packages.
+%
+% \begin{macrocode}
+\RequirePackage{longtable}
+\RequirePackage{array}[1996/06/14]
+\RequirePackage{calendar}
+\RequirePackage{keyval}
+% \end{macrocode}
+%
+% Turn off the listing of days in the Calendar style.
+% It only works well for monthly calendars.
+%
+% \begin{macrocode}
+\tracingdates=0%
+% \end{macrocode}
+%
+% Set up a list of options for the Calendar style engine
+% to use with the "keyval" parser.
+%
+% \begin{macrocode}
+\define@key{opt}{leftspace}{\setlength{\LTleft}{#1}}
+\define@key{opt}{rightspace}{\setlength{\LTright}{#1}}
+\define@key{opt}{width}{\setlength{\tms@tablewidth}{#1}}
+\define@key{opt}{title}{\def\tms@title{#1}}
+\define@key{opt}{start}{\@settime\tms@start#1{}}
+\define@key{opt}{end}{\@settime\tms@end#1{}}
+\define@key{opt}{blockminutes}{\tms@minuteblocks=#1\relax}
+\define@key{opt}{blockgroup}{\tms@groupblocks=#1\relax}
+\define@key{opt}{leftright}{\tms@extractprops#1{}}
+\define@key{opt}{titletype}{\def\tms@titletype##1{{#1{##1}}}}
+\define@key{opt}{labeltype}{\def\tms@labeltype##1{{#1{##1}}}}
+\define@key{opt}{timelabeltype}{\def\tms@timelabeltype##1{{#1{##1}}}}
+\define@key{opt}{timeitemtype}{\def\tms@timeitemtype##1{{#1{##1}}}}
+\define@key{opt}{itemtype}{\def\tms@itemtype##1{{#1{##1}}}}
+\define@key{opt}{notimes}[f]{\tms@usetimesfalse}
+% \end{macrocode}
+%
+% Before setting default values,
+% provide a set of parsing macros for use in scanning
+% some of the options fed to the "keyval" parser.
+% Doing this here allows us to specify the defaults in a
+% human readable syntax.
+%
+% \begin{macrocode}
+\def\tms@extractprops#1/#2#{%
+ \tms@leftprop=#1\tms@rightprop=#2}
+\def\@settime#1#2:#3#{%
+ \tms@tempcount=#2%
+ \multiply\tms@tempcount by60%
+ \advance\tms@tempcount by#3%
+ \global#1\tms@tempcount}
+\def\@splitblocks#1-#2#{%
+ \def\@blockstarttext{#1}%
+ \def\@blockendtext{#2}}
+\def\@setblocks#1,#2#{%
+ \ifcat$#1$%
+ \let\next\@gobble%
+ \else%
+ \let\next\@setblocks%
+ \global\advance\tms@blocks by 1%
+ \@splitblocks#1{}%
+ \expandafter\@settime%
+ \expandafter\tms@time@start\@blockstarttext{}%
+ \expandafter\@settime%
+ \expandafter\tms@time@end\@blockendtext{}%
+ \let\tms@tempmac\tms@blocklist%
+ \edef\tms@blocklist{%
+ \tms@tempmac\the\tms@time@start-\the\tms@time@end,}%
+ \fi%
+ \next#2{}}
+\def\tms@chopblock#1-#2,#3#{%
+ \global\tms@time@start=#1%
+ \global\tms@time@end=#2%
+ \gdef\tms@blocklist{#3}}%
+\def\tms@labellist{}%
+\def\@extractlabels#1,#2#{%
+ \ifcat$#1$%
+ \tms@tempreg@a=\expandafter{\tms@labellist}%
+ \edef\tms@label##1{%
+ \noexpand\ifcase##1\the\tms@tempreg@a\noexpand\fi}%
+ \let\next\@gobble%
+ \else%
+ \let\next\@extractlabels%
+ \let\tms@tempmac\tms@labellist%
+ \expandafter\def%
+ \expandafter\tms@labellist%
+ \expandafter{%
+ \tms@tempmac\or #1}%
+ \fi%
+ \next#2{}}
+% \end{macrocode}
+%
+% Set up default values for the "keyval" options.
+%
+% \begin{macrocode}
+\def\tms@titletype#1{{\Large\bfseries#1}}%
+\def\tms@labeltype#1{{\large\bfseries#1}}%
+\def\tms@timelabeltype#1{{\bfseries#1}}
+\def\tms@timeitemtype#1{{\large#1}}
+\def\tms@itemtype#1{{\small#1}}
+\def\tms@title{\themonth\space\theday,\space\theyear}
+\@settime\tms@start8:00{}
+\@settime\tms@end17:00{}
+\tms@minuteblocks=15\relax%
+\def\tms@blocklist{}%
+\def\tms@label#1{\themonth\space\theday}%
+\tms@groupblocks=4\relax%
+\tms@extractprops4/5{}
+% \end{macrocode}
+%
+%
+% Define the calendar. As for all Calendar styles,
+% this is done using "\newcalendar" with 17 arguments.
+%
+% \begin{macrocode}
+\newcalendar%
+% \end{macrocode}
+%
+% Name the new calendar environment.
+%
+% \begin{macrocode}
+{timesheet}
+% \end{macrocode}
+%
+% Select an off-the-shelf macro for printing
+% that will dump printable
+% items on DVI.
+%
+% \begin{macrocode}
+{\cal@insert}
+% \end{macrocode}
+%
+% Be indifferent to the starting day of the week.
+% ("0" through "6" specify Sunday through Saturday).
+%
+% \begin{macrocode}
+{7}
+% \end{macrocode}
+%
+% Set the number of items in a group (time blocks)
+%
+% \begin{macrocode}
+{\tms@blocks}
+% \end{macrocode}
+%
+% Set the number of items in a subgroup (one block).
+%
+% \begin{macrocode}
+{1}
+% \end{macrocode}
+%
+% Use ampersand table separator before all items
+% but the first in a subgroup (never used, b/c only one item).
+%
+% \begin{macrocode}
+{&}
+% \end{macrocode}
+%
+% Increment the date at the end of every group, and sneak
+% in a post-increment recalculation for the time labels.
+%
+% \begin{macrocode}
+{G\tms@gettimes}
+% \end{macrocode}
+%
+% Specify the header. This has to be built on the fly
+% in the Timesheet style, to give control over width
+% to the user. So just give the
+% name of the macro here.
+% \begin{macrocode}
+{\tms@header}
+% \end{macrocode}
+%
+% Specify the tail of the table.
+%
+% \begin{macrocode}
+{&%
+ \global\tms@groupblockcount=1\relax%
+ \\\hline%
+ \end{longtable}}%
+% \end{macrocode}
+%
+% How to end a group.
+%
+% \begin{macrocode}
+{\cal@footer\newpage\cal@header}
+% \end{macrocode}
+%
+% Specify how to break the end of a subgroup.
+% In this case, we end the table line and add
+% a time block that must be generated on the fly.
+%
+% The new "\\*" form in "longtable" seems to have no
+% impact here. Rats.
+%
+% \begin{macrocode}
+{&%
+ \ifnum\tms@groupblockcount<\tms@groupblocks%
+ \\*\cline{1-4}%
+ \global\advance\tms@groupblockcount by1\relax%
+ \else%
+ \\\hline%
+ \global\tms@groupblockcount=1\relax%
+ \fi%
+ \tms@timecoltext}
+% \end{macrocode}
+% Next is code to be run before the calendar options
+% are digested and the controlling date is read.
+%
+% \textit{Set a couple of Calendar toggles before
+% scanning the date contained in the "timesheet"
+% environment.}
+% \begin{macrocode}
+{\dates@requiremonthtrue\dates@requiredaytrue
+% \end{macrocode}
+% \textit{Set default width of table.}
+% \begin{macrocode}
+ \setlength{\tms@tablewidth}{\textwidth}
+% \end{macrocode}
+% \textit{Initialize \cs{tms@blocklist} to \texttt{nil}.}
+% \begin{macrocode}
+ \def\tms@blocklist{}}
+% \end{macrocode}
+%
+% "\cal@range@start", "\cal@range@end" and "\dates@date"
+% are all set internally, so we just provide information
+% here. Remember to adjust human-readable dates with
+% "\caldate" when changing "\dates@date", and
+% long dates with "\dates@fix" when adjusting
+% the human readable stuff.
+%
+% \begin{macrocode}
+{\message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \dates@date\cal@range@end%
+ \caldate%
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \dates@date\cal@range@start%
+ \caldate%
+% \end{macrocode}
+%
+% \textit{Set the number of blocks and the number of blocks in a group.}
+%
+% \begin{macrocode}
+\relax%
+\tms@blocks\tms@end%
+\advance\tms@blocks by-\tms@start%
+\divide\tms@blocks by\tms@minuteblocks%
+% \end{macrocode}
+%
+% \textit{Prepare an algorithm to derive the start and
+% end time of a block from the value of the
+% counter \texttt{cal@group@count} and set values in
+% \texttt{tms@time@start}, \texttt{tms@time@end}
+% and \texttt{tms@timecoltext}.}
+%
+% \begin{macrocode}
+ \def\tms@gettimes{%
+ \ifcat$\tms@blocklist$%
+ \tms@time@start\cal@group@count%
+ \multiply\tms@time@start by\tms@minuteblocks%
+ \global\advance\tms@time@start by\tms@start%
+ \tms@time@end\tms@time@start%
+ \global\advance\tms@time@end by\tms@minuteblocks%
+ \else%
+ \expandafter\tms@chopblock\tms@blocklist-,{}%
+ \fi%
+ \mod{60}\tms@time@start\tms@minutes@start%
+ \tms@hours@start\dates@three%
+ \divide\tms@hours@start by60%
+ \mod{60}\tms@time@end\tms@minutes@end%
+ \tms@hours@end\dates@three%
+ \divide\tms@hours@end by60%
+ \ifnum\tms@minutes@start<10%
+ \edef\tms@minutes@start@mac{0\the\tms@minutes@start}%
+ \else%
+ \edef\tms@minutes@start@mac{\the\tms@minutes@start}%
+ \fi%
+ \ifnum\tms@minutes@end<10%
+ \edef\tms@minutes@end@mac{0\the\tms@minutes@end}%
+ \else%
+ \edef\tms@minutes@end@mac{\the\tms@minutes@end}%
+ \fi%
+ \xdef\tms@timecoltext{%
+ \noexpand\tms@timelabeltype{\the\tms@hours@start}&%
+ \noexpand\tms@timelabeltype{\tms@minutes@start@mac}&%
+ \noexpand\tms@timelabeltype{\the\tms@hours@end}&%
+ \noexpand\tms@timelabeltype{\tms@minutes@end@mac}&}}%
+% \end{macrocode}
+%
+% \textit{Set the dimensions of the table. We don't have
+% to worry about the vertical dimensions; we leave that
+% to longtable.}
+%
+% \textit{First let the user know what we're planning to do.}
+%
+% \begin{macrocode}
+\message{Package Timesheet: %
+ setting table \the\tms@tablewidth\space in width.^^J}%
+% \end{macrocode}
+%
+% \textit{The rules surrounding the first (time) column.}
+%
+% \begin{macrocode}
+ \setlength{\tms@widthlessboxes}{2\arrayrulewidth}%
+% \end{macrocode}
+%
+% \textit{The rules at the end of the text columns.}
+%
+% \begin{macrocode}
+ \addtolength{\tms@widthlessboxes}{3\arrayrulewidth}%
+ \addtolength{\tms@widthlessboxes}{\doublerulesep}%
+% \end{macrocode}
+%
+% \textit{The space between the rules and the neighbouring text.}
+%
+% \begin{macrocode}
+ \addtolength{\tms@widthlessboxes}{6\tabcolsep}%
+% \end{macrocode}
+%
+% \textit{The width of the time text.}
+%
+% \begin{macrocode}
+ \settowidth{\tms@numlen}{\tms@timelabeltype{99}}%
+ \settowidth{\tms@colonlen}{\tms@timelabeltype{:}}%
+ \settowidth{\tms@dashlen}{\tms@timelabeltype{\ --\ }}%
+ \addtolength{\tms@widthlessboxes}{4\tms@numlen}%
+ \addtolength{\tms@widthlessboxes}{2\tms@colonlen}%
+ \addtolength{\tms@widthlessboxes}{\tms@dashlen}%
+% \end{macrocode}
+%
+% \textit{Everything else is for the text columns.}
+%
+% \begin{macrocode}
+ \tms@tempcount\tms@leftprop%
+ \advance\tms@tempcount by\tms@rightprop%
+%
+ \setlength{\tms@templen}{\tms@tablewidth}%
+ \addtolength{\tms@templen}{-\tms@widthlessboxes}%
+%
+ \tms@leftlen\tms@templen%
+ \divide\tms@leftlen by\tms@tempcount%
+ \global\multiply\tms@leftlen by\tms@leftprop%
+%
+ \tms@rightlen\tms@templen%
+ \divide\tms@rightlen by\tms@tempcount%
+ \global\multiply\tms@rightlen by\tms@rightprop%
+% \end{macrocode}
+%
+% \textit{Prepare the macro that will generate a table
+% header with an appropriate number of columns
+% in appropriate sizes.}
+%
+% \begin{macrocode}
+ \tms@tempcount\tms@days%
+ \advance\tms@tempcount by1%
+ \protected@edef\tms@header{%
+ \noexpand\begin{longtable}{%
+ |>{\hfill}%
+ m{\the\tms@numlen}%
+ @{\tms@timelabeltype{:}}%
+ m{\the\tms@numlen}%
+ @{\tms@timelabeltype{\ --\ }}%
+ >{\hfill}%
+ m{\the\tms@numlen}%
+ @{\tms@timelabeltype{:}}%
+ m{\the\tms@numlen}%
+ |%
+ m{\the\tms@leftlen}||%
+ m{\the\tms@rightlen}|}%
+ \noexpand\multicolumn{6}{c}%
+ {\tms@titletype{\noexpand\tms@title}}%
+ \\%
+ \noexpand\multicolumn{4}{l}{}%
+ &%
+ \noexpand\multicolumn{1}{c}{\textbf{Plan}}&%
+ \noexpand\multicolumn{1}{c}{\textbf{Action}}%
+ \noexpand\\\noexpand\hline%
+ \noexpand\endhead%
+ \noexpand\tms@timecoltext}%
+ \extrarowheight=3pt}
+% \end{macrocode}
+%
+% Specify the divider to be placed between entries
+% within a timesheet box.
+%
+% \begin{macrocode}
+{\par\smallskip}%
+% \end{macrocode}
+%
+% Use the standard Calendar item-fetching macros to
+% grab classes of items. We only need appointments
+% (things with a time associated with them) in this case,
+% and we specify the range of the current box to
+% limit the entries that are grabbed for current use.
+%
+% \begin{macrocode}
+{\cal@get@appointments[\tms@time@start/\tms@time@end]}%
+% \end{macrocode}
+%
+% Prepare macro text that will set the text to
+% "\longtext" on the first entry, and "\shorttext"
+% with braces thereafter.
+%
+% \begin{macrocode}
+{\relax%
+ \ifnum\dates@time@start>0\relax%
+% \end{macrocode}
+%
+% \textit{We print a short entry for anything that starts
+% outside the slot we are dealing with.}
+%
+% \begin{macrocode}
+ \ifnum\dates@time@start<\tms@time@start%
+ \protected@edef\cal@entry@text{%
+ \noexpand\parbox{\the\tms@leftlen}{\noexpand\raggedright%
+ \noexpand\tms@itemtype{%
+ \noexpand$\noexpand<\noexpand$%
+ \theshorttext, to \cal@appt@end@text%
+ \noexpand$\noexpand>\noexpand$}}}%
+% \end{macrocode}
+%
+% \textit{All other conforming entries get the long text.}
+%
+% \begin{macrocode}
+ \else%
+ \ifnum\dates@time@start<\dates@time@end%
+ \protected@edef\cal@entry@text{%
+ \noexpand\parbox{\the\tms@leftlen}{\noexpand\raggedright%
+ \iftms@usetimes%
+ \noexpand\tms@timeitemtype{%
+ \cal@appt@start@text%
+ --%
+ \cal@appt@end@text}%
+ \space%
+ \fi%
+ \noexpand\tms@itemtype{%
+ \thelongtext}}}%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \noexpand\parbox{\the\tms@leftlen}{\noexpand\raggedright%
+ \iftms@usetimes%
+ \noexpand\tms@timeitemtype{%
+ \cal@appt@start@text}%
+ \space%
+ \fi%
+ \tms@itemtype{\thelongtext}}}%
+ \fi%
+ \fi%
+ \fi}%
+% \end{macrocode}
+%
+% Chuck the assembled stack of appointments into
+% the box.
+%
+% \begin{macrocode}
+{\theappointments}
+\message{Done loading style}
+% \end{macrocode}
+%</package>
+% \Finale \PrintChanges
diff --git a/Master/texmf-dist/source/latex/calendar/timetabl.dtx b/Master/texmf-dist/source/latex/calendar/timetabl.dtx
new file mode 100644
index 00000000000..3d20d67f876
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/timetabl.dtx
@@ -0,0 +1,772 @@
+%\iffalse
+%
+% file: timetabl.dtx
+% Copyright (C) 1996-1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+%\fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:15:28}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{timetabl.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \changes{v1.0}{1997/02/26}{First release version, implementing
+% a suggestion from Miroslav Novak.}
+% \changes{v1.1}{1997/03/08}{Added \cs{protected@edef} to labels
+% definition, so my wife's birthday can be indicated in color
+% in our travel itinerary\ldots but it didn't work. Colors
+% in labels come up with an empty color. Problem occurs only if the
+% \cs{textcolor} command is at the start of the label, so
+% this is probably do to an unnecessary \cs{expandafter}.}
+% \changes{v1.1}{1997/03/08}{Added time type declaration to
+% pinpoint times for consistency.}
+% \changes{v1.2}{1997/05/15}{Merged improved preliminary matter from
+% the revised monthly.dtx package.}
+% \changes{v1.3}{1997/09/24}{Oops. Seem to have released without
+% completing the changes. File now works again. Converted to
+% package (from class) in the process.}
+% \changes{v1.4}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% timetabl.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:15:28 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:15:17 root
+% Release code
+%
+% Revision 2.5 1998/01/16 17:41:30 root
+% *** empty log message ***
+%
+% Revision 2.4 1998/01/15 10:20:31 root
+% Two typos: vline changed to vrule, and labelstrutbuf now
+% set using W, not the actual text.
+%
+% Revision 2.3 1997/11/26 07:49:48 bennett
+% Fixed typeface options, added footer, provided new option
+% to stretch label height, added color support.
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.4 1997/11/07 08:45:09 root
+% Added documentation for the new "notimes" option. Wrote
+% documentation notes for existing options that were unexplained.
+%
+% Revision 2.1.1.3 1997/11/07 08:11:13 root
+% Further changes to implement selective inclusion of times.
+% Fixed error in option definitions controlling typeface
+% selection.
+%
+% Revision 2.1.1.2 1997/11/07 03:23:22 root
+% Added code to suppress times in entries if desired.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 14:51:25 bennett
+% Release code.
+%
+% Revision 1.2 1997/10/29 19:54:57 bennett
+% Fixed error in RCS variable 1998/01/17 18:15:28 in the ProvidesPackage
+% declaration.
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the Timetable
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \CheckSum{641}
+%
+% Please see the file \texttt{calguide.tex} for details on
+% the use of this package.
+%
+%\StopEventually{\PrintIndex}
+%
+% \subsection{The Package File}
+%
+% Load a bunch of useful code.
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{timetabl}
+ [1998/01/17 18:15:28 3.1.1.1 Timetable (Frank Bennett)]
+% \end{macrocode}
+% Define a few boolean switches, which are needed to process
+% the style options.
+% \begin{macrocode}
+\newif\ifttbl@usecolor
+\newif\ifttbl@verbose
+% \end{macrocode}
+% Define some more variables and switches for use in the body
+% of the style.
+% \begin{macrocode}
+\newlength\ttbl@tablewidth
+\newlength{\ttbl@hw}
+\newlength{\ttbl@templen}
+\newlength{\ttbl@widthlessboxes}
+\newlength{\ttbl@timetextlen}
+\newtoks\ttbl@tempreg@a
+\newtoks\ttbl@tempreg@b
+\newcount\ttbl@tempcount
+\newcount\ttbl@start
+\newcount\ttbl@end
+\newcount\ttbl@minuteblocks
+\newcount\ttbl@boxes
+\newcount\ttbl@days
+\newcount\ttbl@blocks
+\newcount\ttbl@time@start
+\newcount\ttbl@time@end
+\newcount\ttbl@hours@start
+\newcount\ttbl@minutes@start
+\newcount\ttbl@hours@end
+\newcount\ttbl@minutes@end
+\newcount\ttbl@minute@base
+% \end{macrocode}
+%
+% \subsection{Options}
+%
+% We include the language support offered to all styles in the bundle.
+% \begin{macrocode}
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+% \end{macrocode}
+%
+% \subsection{Option Postprocessing}
+%
+% Now that the options lists are available to us,
+% we can start loading packages. The following packages
+% are always loaded, and always with the same options.
+% \begin{macrocode}
+\RequirePackage{array}[1996/06/14]
+\RequirePackage{calendar}
+\RequirePackage{longtable}
+\RequirePackage{rotating}
+% \end{macrocode}
+% We get ready to set the dimensions
+% of the table that will contain the calendar??
+% \begin{macrocode}
+ \def\ttbl@settablewidth{%
+ \setlength{\ttbl@tablewidth}{\hsize}}%
+% \end{macrocode}
+% Turn off the listing of days in the Calendar style.
+% It only works well for monthly calendars.
+% \begin{macrocode}
+\tracingdates=0%
+% \end{macrocode}
+% Set up a list of options for the Calendar style engine
+% to use with the "keyval" parser.
+% \begin{macrocode}
+\define@key{opt}{leftspace}{\setlength{\LTleft}{#1}}
+\define@key{opt}{rightspace}{\setlength{\LTright}{#1}}
+\define@key{opt}{width}{\setlength{\ttbl@tablewidth}{#1}}
+\define@key{opt}{title}{\def\ttbl@title{#1}}
+\define@key{opt}{start}{\@settime\ttbl@start#1{}}
+\define@key{opt}{end}{\@settime\ttbl@end#1{}}
+\define@key{opt}{blockminutes}{\ttbl@minuteblocks=#1}
+\define@key{opt}{blocks}{\@setblocks#1,,{}}
+\define@key{opt}{labels}{\@extractlabels#1,,{}}
+\define@key{opt}{timeitemface}{\def\ttbl@timeitemface##1{{#1{##1}}}}
+\define@key{opt}{timelabelface}{\def\ttbl@timelabelface##1{{#1{##1}}}}
+\define@key{opt}{itemface}{\def\ttbl@itemface##1{{#1{##1}}}}
+\define@key{opt}{titleface}{\def\ttbl@titleface##1{{#1{##1}}}}
+\define@key{opt}{labelface}{\def\ttbl@labelface##1{{#1{##1}}}}
+\define@key{opt}{notimes}[f]{\@ttbl@usetimesfalse}
+\define@key{opt}{footer}{\def\ttbl@foot{#1}}
+\define@key{opt}{extralabelheight}{\ttbl@extralabelheight=#1}
+\newlength\ttbl@extralabelheight
+\newlength\ttbl@labelstrut%
+\newlength\ttbl@labelstrutbuf%
+% \end{macrocode}
+%
+% Before setting default values,
+% provide a set of parsing macros for use in scanning
+% some of the options fed to the "keyval" parser.
+% Doing this here allows us to specify the defaults in a
+% human readable syntax.
+%
+% \begin{macrocode}
+\def\@settime#1#2:#3#{%
+ \ttbl@tempcount=#2%
+ \multiply\ttbl@tempcount by60%
+ \advance\ttbl@tempcount by#3%
+ \global#1\ttbl@tempcount}
+\def\@splitblocks#1-#2#{%
+ \def\@blockstarttext{#1}%
+ \def\@blockendtext{#2}}
+\def\@setblocks#1,#2#{%
+ \ifcat$#1$%
+ \let\next\@gobble%
+ \else%
+ \let\next\@setblocks%
+ \global\advance\ttbl@blocks by 1%
+ \@splitblocks#1{}%
+ \expandafter\@settime%
+ \expandafter\ttbl@time@start\@blockstarttext{}%
+ \expandafter\@settime%
+ \expandafter\ttbl@time@end\@blockendtext{}%
+ \let\ttbl@tempmac\ttbl@blocklist%
+ \edef\ttbl@blocklist{%
+ \ttbl@tempmac\the\ttbl@time@start-\the\ttbl@time@end,}%
+ \fi%
+ \next#2{}}
+\def\ttbl@chopblock#1-#2,#3#{%
+ \global\ttbl@time@start=#1%
+ \global\ttbl@time@end=#2%
+ \gdef\ttbl@blocklist{#3}}%
+\def\ttbl@labellist{}%
+\def\@extractlabels#1,#2#{%
+ \ifcat$#1$%
+ \ttbl@tempreg@a=\expandafter{\ttbl@labellist}%
+ \edef\ttbl@label##1{%
+ \noexpand\ifcase##1\the\ttbl@tempreg@a\noexpand\fi}%
+ \let\next\@gobble%
+ \else%
+ \let\next\@extractlabels%
+ \let\ttbl@tempmac\ttbl@labellist%
+ \expandafter\def%
+ \expandafter\ttbl@labellist%
+ \expandafter{%
+ \ttbl@tempmac\or #1}%
+ \fi%
+ \next#2{}}
+% \end{macrocode}
+%
+% Set up default values for the "keyval" options.
+%
+% \begin{macrocode}
+\def\ttbl@title{Conference Schedule}
+\@settime\ttbl@start8:00{}
+\@settime\ttbl@end17:00{}
+\ttbl@minuteblocks=60%
+\def\ttbl@blocklist{}%
+\def\ttbl@label#1{\themonth\space\theday}%
+\def\ttbl@timeitemface#1{{\small{#1}}}%
+\def\ttbl@timelabelface#1{{\small\textbf{#1}}}%
+\def\ttbl@itemface#1{{\small\textit{#1}}}%
+\def\ttbl@titleface#1{{\large\textbf{#1}}}%
+\def\ttbl@labelface#1{{\textbf{#1}}}%
+\newif\if@ttbl@usetimes%
+\@ttbl@usetimestrue%
+\def\ttbl@foot{}%
+% \end{macrocode}
+%
+%
+% Define the calendar. As for all Calendar styles,
+% this is done using "\newcalendar" with 17 arguments.
+%
+% \begin{macrocode}
+\newcalendar%
+% \end{macrocode}
+%
+% Name the new calendar environment.
+%
+% \begin{macrocode}
+{timetable}
+% \end{macrocode}
+%
+% Select an off-the-shelf macro for printing
+% that will dump printable
+% items on DVI.
+%
+% \begin{macrocode}
+{\cal@insert}
+% \end{macrocode}
+%
+% Be indifferent to the starting day of the week.
+% ("0" through "6" specify Sunday through Saturday).
+%
+% \begin{macrocode}
+{7}
+% \end{macrocode}
+%
+% Set the number of items in a group (the whole timetable, in this case).
+%
+% \begin{macrocode}
+{\ttbl@boxes}
+% \end{macrocode}
+%
+% Set the number of items in a subgroup (a line, in this case).
+%
+% \begin{macrocode}
+{\ttbl@days}
+% \end{macrocode}
+%
+% Use the ampersand table separator before all items
+% but the first in a subgroup.
+%
+% \begin{macrocode}
+{&}
+% \end{macrocode}
+%
+% Select a zigzig algorithm that increments the
+% day at each item, and jumps back to the start
+% day at the end of each subgroup. The use of
+% "\ttbl@gettimes" here is unsightly, but for the time
+% being this gives us a way to sneak in a non-printing
+% calculation in advance of the first item in a new
+% subgroup.
+%
+% \begin{macrocode}
+{z\ttbl@gettimes}
+% \end{macrocode}
+%
+% Specify the header. This has to be built on the fly
+% in the Timetable style, since all of the sizes
+% are determined from user options. So just give the
+% name of the macro here.
+% \begin{macrocode}
+{\extrarowheight=3pt\ttbl@header}
+% \end{macrocode}
+%
+% Specify the tail of the table. Remember to terminate
+% landscape if it was requested.
+%
+% \begin{macrocode}
+{\\\hline\end{longtable}}%
+% \end{macrocode}
+%
+% This will never be used in this style, because our
+% text consists of a single group.
+%
+% \begin{macrocode}
+{\cal@footer\newpage\cal@header}
+% \end{macrocode}
+%
+% Specify how to break the end of a subgroup.
+% In this case, we end the table line and add
+% a time block that must be generated on the fly.
+%
+% \begin{macrocode}
+{\\\hline\ttbl@timecoltext}
+% \end{macrocode}
+%
+% Set a couple of Calendar toggles before
+% scanning the date contained in the "timetable"
+% environment.
+%
+% \begin{macrocode}
+{\dates@requiremonthtrue\dates@requiredaytrue}
+% \end{macrocode}
+%
+% "\cal@range@start", "\cal@range@end" and "\dates@date"
+% are all set internally, so we just provide information
+% here. Remember to adjust human-readable dates with
+% "\caldate" when changing "\dates@date", and
+% long dates with "\dates@fix" when adjusting
+% the human readable stuff.
+%
+% \begin{macrocode}
+{\message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \dates@date\cal@range@end%
+ \caldate%
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \dates@date\cal@range@start%
+ \caldate%
+% \end{macrocode}
+%
+% \textit{Set the length of the conference in \texttt{ttbl@days}.}
+%
+% \begin{macrocode}
+ \ttbl@days\cal@range@end%
+ \advance\ttbl@days by-\cal@range@start%
+ \advance\ttbl@days by1%
+% \end{macrocode}
+%
+% \textit{Set the number of boxes in a group. The number of
+% vertical blocks will already have been set if
+% the \texttt{blocks} option was used, so bypass that if
+% appropriate.}
+%
+% \begin{macrocode}
+\ifcat$\ttbl@blocklist$%
+ \ttbl@blocks\ttbl@end%
+ \advance\ttbl@blocks by-\ttbl@start%
+ \divide\ttbl@blocks by\ttbl@minuteblocks%
+\fi%
+\ttbl@boxes\ttbl@blocks%
+\multiply\ttbl@boxes by\ttbl@days%
+% \end{macrocode}
+%
+% \textit{Prepare an algorithm to derive the start and
+% end time of a block from the value of the
+% counter \texttt{cal@group@count} and set values in
+% \texttt{ttbl@time@start}, \texttt{ttbl@time@end}
+% and \texttt{ttbl@timecoltext}.}
+%
+% \begin{macrocode}
+ \def\ttbl@gettimes{%
+ \ifcat$\ttbl@blocklist$%
+ \ttbl@time@start\cal@group@count%
+ \divide\ttbl@time@start by\ttbl@days%
+ \multiply\ttbl@time@start by\ttbl@minuteblocks%
+ \global\advance\ttbl@time@start by\ttbl@start%
+ \ttbl@time@end\ttbl@time@start%
+ \global\advance\ttbl@time@end by\ttbl@minuteblocks%
+ \else%
+ \expandafter\ttbl@chopblock\ttbl@blocklist-,{}%
+ \fi%
+ \mod{60}\ttbl@time@start\ttbl@minutes@start%
+ \ttbl@hours@start\dates@three%
+ \divide\ttbl@hours@start by60%
+ \mod{60}\ttbl@time@end\ttbl@minutes@end%
+ \ttbl@hours@end\dates@three%
+ \divide\ttbl@hours@end by60%
+ \ifnum\ttbl@minutes@start<10%
+ \edef\ttbl@minutes@start@mac{0\the\ttbl@minutes@start}%
+ \else%
+ \edef\ttbl@minutes@start@mac{\the\ttbl@minutes@start}%
+ \fi%
+ \ifnum\ttbl@minutes@end<10%
+ \edef\ttbl@minutes@end@mac{0\the\ttbl@minutes@end}%
+ \else%
+ \edef\ttbl@minutes@end@mac{\the\ttbl@minutes@end}%
+ \fi%
+ \xdef\ttbl@timecoltext{%
+ \noexpand\vbox{\vfil\vskip4pt%
+ \noexpand\begin{sideways}%
+ \noexpand\ttbl@timelabelface{%
+ \the\ttbl@hours@end:\ttbl@minutes@end@mac%
+ $\noexpand\leftarrow$%
+ \the\ttbl@hours@start:\ttbl@minutes@start@mac}%
+ \noexpand\end{sideways}%
+ \vfil}
+ &}}%
+% \end{macrocode}
+%
+% \textit{Set the dimensions of the table. We don't have
+% to worry about the vertical dimensions; we leave that
+% to longtable.}
+%
+% \textit{First let the user know what we're planning to do.}
+%
+% \begin{macrocode}
+\ttbl@tablewidth\textwidth%
+\message{Package Timetable: %
+ setting table \the\ttbl@tablewidth\space in width.^^J}%
+% \end{macrocode}
+%
+% \textit{The rules surrounding the first (time) column.}
+%
+% \begin{macrocode}
+ \setlength{\ttbl@widthlessboxes}{2\arrayrulewidth}%
+% \end{macrocode}
+%
+% \textit{The rules at the end of the text columns.}
+%
+% \begin{macrocode}
+ \addtolength{\ttbl@widthlessboxes}{\ttbl@days\arrayrulewidth}%
+% \end{macrocode}
+%
+% \textit{The space between the rules and the neighbouring text.}
+%
+% \begin{macrocode}
+ \addtolength{\ttbl@widthlessboxes}{2\tabcolsep}%
+ \setlength{\ttbl@templen}{2\tabcolsep}%
+ \addtolength{\ttbl@widthlessboxes}{\ttbl@days\ttbl@templen}%
+% \end{macrocode}
+%
+% \textit{The width of the time text.}
+%
+% \begin{macrocode}
+ \settoheight{\ttbl@timetextlen}{\ttbl@timelabelface{99:99--99:99}}%
+ \settodepth{\ttbl@templen}{\ttbl@timelabelface{99:99--99:99}}%
+ \addtolength{\ttbl@timetextlen}{\ttbl@templen}%
+ \addtolength{\ttbl@widthlessboxes}{\ttbl@timetextlen}%
+% \end{macrocode}
+%
+% \textit{Everything else is for the text columns.}
+%
+% \begin{macrocode}
+ \setlength{\ttbl@hw}{\ttbl@tablewidth}%
+ \addtolength{\ttbl@hw}{-\ttbl@widthlessboxes}%
+ \divide\ttbl@hw by\ttbl@days%
+% \end{macrocode}
+%
+% \textit{Prepare the macro that will generate a table
+% header with an appropriate number of columns
+% in appropriate sizes.}
+%
+% \textit{First we make up a unit in the width of the
+% time text, as determined above. We make that
+% the first chunk of the format.}
+%
+% \begin{macrocode}
+\edef\ttbl@firstunit{%
+ m{\the\ttbl@timetextlen}%
+ \noexpand|}%
+\ttbl@tempreg@a=\expandafter{\expandafter|\ttbl@firstunit}%
+% \end{macrocode}
+%
+% \textit{Then we make up a similar chunk, but with the
+% length of the day columns, and store it in a register.}
+%
+% \begin{macrocode}
+\edef\ttbl@dayunit{%
+ m{\the\ttbl@hw}%
+ \noexpand|}%
+\ttbl@tempreg@b=\expandafter{\ttbl@dayunit}%
+% \end{macrocode}
+%
+% \textit{Within a loop, we add the day unit format chunk
+% to the format string until we have a chunk for
+% each day in the conference.}
+%
+% \begin{macrocode}
+\ttbl@tempcount=1%
+\loop%
+ \edef\ttbl@tempmac{\the\ttbl@tempreg@a\the\ttbl@tempreg@b}%
+ \ttbl@tempreg@a=\expandafter{\ttbl@tempmac}%
+\ifnum\ttbl@tempcount<\ttbl@days%
+ \advance\ttbl@tempcount by1%
+\repeat%
+% \end{macrocode}
+%
+% \textit{Within another loop, we build the labels.
+% This is inelegant, but it works. We maintain
+% two counters in the loop, since the macro "ttbl@label"
+% might be looking for a date or the column number.}
+% \begin{macrocode}
+ \global\settoheight\ttbl@labelstrutbuf{\ttbl@labelface{W}}%
+ \global\advance\ttbl@labelstrutbuf by\ttbl@extralabelheight\relax%
+ \ifnum\ttbl@labelstrutbuf>\ttbl@labelstrut%
+ \global\ttbl@labelstrut\ttbl@labelstrutbuf%
+ \fi%
+ \def\ttbl@labeltext{}%
+ \dates@date=\cal@range@start%
+ \caldate%
+ \ttbl@tempcount=1%
+ \ttbl@tempreg@b={}%
+ \loop%
+ \protected@edef\ttbl@labeltext{\the\ttbl@tempreg@b&%
+ \noexpand\multicolumn{1}{c|}{%
+ \noexpand\ttbl@labelface{%
+ \ttbl@label{\ttbl@tempcount}}}}%
+ \ttbl@tempreg@b=\expandafter{\ttbl@labeltext}%
+ \ifnum\dates@date<\cal@range@end%
+ \advance\dates@date by1%
+ \caldate%
+ \advance\ttbl@tempcount by1%
+ \repeat%
+% \end{macrocode}
+%
+% \textit{Reset the starting date.}
+%
+% \begin{macrocode}
+ \dates@date\cal@range@start%
+ \caldate%
+% \end{macrocode}
+%
+% \textit{Then we put the rest of the basic header
+% stuff around the string. We use \texttt{protected@edef}
+% so that robust commands can be used in the title and
+% the labels. Note the conditional use of "landscape".}
+%
+% \begin{macrocode}
+ \ttbl@tempcount\ttbl@days%
+ \advance\ttbl@tempcount by1%
+ \protected@edef\ttbl@header{%
+ \noexpand\begin{longtable}{\the\ttbl@tempreg@a}%
+ \noexpand\multicolumn{\ttbl@tempcount}{c}%
+ {\noexpand\ttbl@titleface{\ttbl@title}}%
+ \noexpand\\\noexpand\hline%
+ \noexpand\vrule width0pt depth 0pt height\ttbl@labelstrut\relax%
+ \the\ttbl@tempreg@b\noexpand\\%
+ \noexpand\hline\noexpand\hline\noexpand\endhead%
+ \ifcat$\ttbl@foot$\else%
+ \noexpand\multicolumn{\ttbl@tempcount}{l}%
+ {\noexpand\ttbl@foot}\noexpand\\%
+ \noexpand\endfoot%
+ \fi%
+ \noexpand\ttbl@timecoltext}}%
+% \end{macrocode}
+%
+% Specify the divider to be placed between entries
+% within a time\-table box.
+%
+% \begin{macrocode}
+{\par\medskip}%
+% \end{macrocode}
+%
+% Use the standard Calendar item-fetching macros to
+% grab classes of items. We only need appointments
+% (things with a time associated with them) in this case,
+% and we specify the range of the current box to
+% limit the entries that are grabbed for current use.
+%
+% \begin{macrocode}
+{\cal@get@appointments[\ttbl@time@start/\ttbl@time@end]}%
+% \end{macrocode}
+%
+% Prepare macro text that will set the text to
+% "\longtext" on the first entry, and "\shorttext"
+% with braces thereafter. If no "\longtext"
+% exists, use the "\shorttext" for everything.
+%
+% \begin{macrocode}
+{\relax%
+ \ifnum\dates@time@start>0\relax%
+% \end{macrocode}
+%
+% \textit{We print a short entry for anything that starts
+% outside the slot we are dealing with.}
+%
+% \begin{macrocode}
+ \ifnum\dates@time@start<\ttbl@time@start%
+ \protected@edef\cal@entry@text{%
+ \noexpand\cal@textcolor{\calcolor}{%
+ \noexpand\ttbl@itemface{%
+ \noexpand$\noexpand<\noexpand$%
+ \theshorttext\if@ttbl@usetimes, to \cal@appt@end@text\fi%
+ \noexpand$\noexpand>\noexpand$}}}%
+% \end{macrocode}
+%
+% \textit{All other conforming entries get the long text.}
+%
+% \begin{macrocode}
+ \else%
+ \ifnum\dates@time@start<\dates@time@end%
+ \protected@edef\cal@entry@text{%
+ \if@ttbl@usetimes%
+ \noexpand\ttbl@timeitemface{%
+ \cal@appt@start@text%
+ --%
+ \cal@appt@end@text}%
+ \space%
+ \fi%
+ \noexpand\cal@textcolor{\calcolor}{%
+ \noexpand\ttbl@itemface{%
+ \thelongtext}}}%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \if@ttbl@usetimes%
+ \noexpand\ttbl@timeitemface{%
+ \cal@appt@start@text}%
+ \space%
+ \fi%
+ \noexpand\cal@textcolor{\calcolor}{%
+ \noexpand\ttbl@itemface{%
+ \thelongtext}}}%
+ \fi%
+ \fi%
+ \fi}%
+% \end{macrocode}
+%
+% Chuck the assembled stack of appointments into
+% the box.
+%
+% \begin{macrocode}
+{\theappointments}
+% \end{macrocode}
+%</package>
+%
+%\iffalse
+%
+% \section{The Installation File}
+%
+% \begin{macrocode}
+%<*installer>
+\def\batchfile{timetabl.ins}
+\input docstrip.tex
+\keepsilent
+\preamble
+This file is part of the Calendar package,
+Copyright (C) 1996-1997 by Frank Bennett, Jr.
+All rights reserved.
+------------------------------------------
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+\endpreamble
+
+\generate{\file{timetabl.sty}{\from{timetabl.dtx}{package}}
+ }
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space timetabl.sty}
+\Msg{*}
+\Msg{***********************************************************}
+
+%</installer>
+% \end{macrocode}
+%\fi
+% \Finale \PrintChanges
+
+
+
diff --git a/Master/texmf-dist/source/latex/calendar/weekly.dtx b/Master/texmf-dist/source/latex/calendar/weekly.dtx
new file mode 100644
index 00000000000..26b190ce037
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/weekly.dtx
@@ -0,0 +1,491 @@
+%\iffalse
+%
+% file: weekly.dtx
+% Copyright (C) 1996-1997 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge the author of this file in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk. Better yet, make a contribution to
+% my pension. Account details available on request.
+%
+%\fi
+%
+% \def\fileversion{3.1.1.1}
+% \def\filedate{1998/01/17 18:15:32}
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{weekly.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \changes{v1.0}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% weekly.dtx,v
+% Revision 3.1.1.1 1998/01/17 18:15:32 root
+% Release code, checksum verified
+%
+% Revision 3.1 1998/01/17 17:15:28 root
+% Release code
+%
+% Revision 2.4 1998/01/16 17:07:54 root
+% *** empty log message ***
+%
+% Revision 2.3 1997/12/06 09:52:13 root
+% Moved documentation to calguide.tex.
+%
+% Revision 2.2 1997/11/07 10:44:05 root
+% Release code.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 14:50:12 bennett
+% Release code.
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the Weekly Calendar
+% package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \CheckSum{343}
+%
+% \section{Brief Introduction}
+%
+% Please see the file \texttt{calguide.tex} for documentation
+% on this calendar style.
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{The Class File}
+%
+% \subsection{Preliminaries}
+%
+% Use \LaTeXe, and tell the user who we are.
+%
+% \begin{macrocode}
+%<*class>
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesClass{weekly}
+ [1998/01/17 18:15:32 3.1.1.1 Weekly Calendar (Frank Bennett)]
+% \end{macrocode}
+% Define a boolean switch needed to process
+% the style options.
+% \begin{macrocode}
+\newif\ifwk@usecolor
+% \end{macrocode}
+% Define some more variables and switches for use in the body
+% of the style.
+% \begin{macrocode}
+\newif\ifwk@overthetop
+\newcount\wk@firstday
+\newcount\wk@tempcount
+\newlength\wk@itemheight
+\parindent=0pt
+% \end{macrocode}
+%
+% \subsection{Options}
+%
+% Things like page and type size go to the article class.
+% \begin{macrocode}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+% \end{macrocode}
+% We use the generic language options, the same as other parts
+% of the system.
+% \begin{macrocode}
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+% \end{macrocode}
+%
+% \subsection{Option Postprocessing}
+%
+% Now that the options lists are available to us,
+% we can start loading packages. The following packages
+% are always loaded.
+% \begin{macrocode}
+\LoadClass{article}
+\RequirePackage{calendar}
+\RequirePackage{lscape}
+\RequirePackage{multicol}
+\RequirePackage{autofilo}
+\multicolsep=0pt\relax
+% \end{macrocode}
+% It is now time to do the final page formatting.
+% \begin{macrocode}
+\AtBeginDocument{%
+% \end{macrocode}
+% Eliminate page numbers and indenting.
+% \begin{macrocode}
+ \pagestyle{empty}
+ \parindent=0pt}
+% \end{macrocode}
+%
+% \subsection{Calendar Setup}
+%
+% Define some key values for use by the calendar environment.
+% \begin{macrocode}
+\define@key{opt}{firstday}{%
+ \wk@firstday=#1}
+% \end{macrocode}
+% Define default values for the environment keys.
+% \begin{macrocode}
+\wk@firstday=5%
+% \end{macrocode}
+% We declare eight boxes, one for each day of the
+% week plus an extra.
+% \begin{macrocode}
+\wk@tempcount=0
+\expandafter\newsavebox\csname wk@box\the\wk@tempcount\endcsname
+\loop\advance\wk@tempcount by1\relax
+\ifnum\wk@tempcount<8
+ \expandafter\newsavebox\csname wk@box\the\wk@tempcount\endcsname
+\repeat
+% \end{macrocode}
+% We need a macro to lay the boxes out on a page. We define
+% this now, with parameterized measurements that will be
+% determined by the settings given to the environment within
+% which this expands.
+% \begin{macrocode}
+\def\wk@spitoutboxes{%
+ \wk@tempcount=-1\relax%
+ \loop\advance\wk@tempcount by1\relax%
+ \ifnum\wk@tempcount<3\relax%
+ \hbox to\linewidth{%
+ \expandafter\usebox\csname wk@box\the\wk@tempcount\endcsname}%
+ \repeat%
+ \hbox to\linewidth{\vbox to\wk@itemheight{%
+ \hrule width\linewidth height0.4pt depth0pt%
+ \hbox to\linewidth{\hfil}\vfill}}%
+ \wk@tempcount=2\relax%
+ \loop\advance\wk@tempcount by1\relax%
+ \ifnum\wk@tempcount<7\relax%
+ \hbox to\linewidth{%
+ \expandafter\usebox\csname wk@box\the\wk@tempcount\endcsname}%
+ \repeat}%
+% \end{macrocode}
+% \textit{We define a macro that calculates the height of the date boxes.
+% The value of \cs{normallineskip} sneaks in between
+% stacked \cs{hbox}es, so we need to account for that.}
+% \begin{macrocode}
+\def\wk@getitemheight{%
+ \setlength\wk@itemheight\textheight\relax%
+ \addtolength\wk@itemheight{-4pt}%
+ \addtolength\wk@itemheight{-5\normallineskip}%
+ \divide\wk@itemheight by4\relax}%
+% \end{macrocode}
+%
+% \subsection{Calendar Definition}
+%
+% The calendar definition itself consists of a single command
+% and its associated arguments.
+% \begin{macrocode}
+\newcalendar%
+% \end{macrocode}
+% We give the environment a name.
+% \begin{macrocode}
+{weekly}
+% \end{macrocode}
+% We're producing DVI, so we use the standard
+% macro for dropping text into the hopper.
+% \begin{macrocode}
+{\cal@insert}
+% \end{macrocode}
+% Starting day for the calendar is not fixed here,
+% because we don't pad with blank entries. Season to taste.
+% Use integers "0" through "6". A value over 7 means no padding.
+% \begin{macrocode}
+{8}
+% \end{macrocode}
+% The length of a group is one day.
+% \begin{macrocode}
+{7}
+% \end{macrocode}
+% The length of a subgroup is seven days.
+% \begin{macrocode}
+{7}
+% \end{macrocode}
+% We don't need delimiters between output items, since
+% we're just building boxes.
+% \begin{macrocode}
+{\relax}
+% \end{macrocode}
+% Increment the date counter with every item.
+% \begin{macrocode}
+{I}
+% \end{macrocode}
+% Define the header.
+% \begin{macrocode}
+{\expandafter\autofilo\expandafter{\cal@optionslist}\wk@getitemheight}
+% \end{macrocode}
+% We define the end of the calendar. This spits out
+% all of the boxes one last time, and closes the page
+% formatting environment.
+% \begin{macrocode}
+{\wk@spitoutboxes\endautofilo}
+% \end{macrocode}
+% We define a way to open a new group. In this case,
+% we just relax.
+% \begin{macrocode}
+{\wk@spitoutboxes}
+% \end{macrocode}
+% We define the way to end a subgroup. This spits out
+% all of the boxes built for a page of text.
+% \begin{macrocode}
+{\relax}
+% \end{macrocode}
+% We set up to require a month and day in the environment typed
+% into the user's document.
+% \begin{macrocode}
+{\dates@requiremonthtrue\dates@requiredaytrue}
+% \end{macrocode}
+% The next section runs after the calendar dates have been
+% scanned from the environment, but before the table is
+% opened.
+% \textit{We step back, if necessary, from the designated
+% first date to reach the starting day for pages. (Default
+% is Friday.)}
+%
+% \begin{macrocode}
+{\global\dates@date\cal@range@start%
+ \prevday\wk@firstday%
+ \cal@range@start\dates@date%
+ \caldate%
+% \end{macrocode}
+% \textit{We tell the user where we're starting.}
+% \begin{macrocode}
+ \message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+% \end{macrocode}
+% \textit{Then we jump forward, again if necessary,
+% to the next day just before the starting day of
+% the week.}
+% \begin{macrocode}
+ \global\dates@date\cal@range@end%
+ \caldate%
+ \advance\wk@firstday by-1%
+ \ifnum\wk@firstday=7\wk@firstday=0\fi%
+ \nextday\wk@firstday%
+ \caldate%
+ \cal@range@end\dates@date%
+% \end{macrocode}
+% \textit{We let the user know where we plan to stop.}
+% \begin{macrocode}
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+% \end{macrocode}
+% \textit{We jump back to the starting date and reset the
+% human-side values.}
+% \begin{macrocode}
+ \global\dates@date=\cal@range@start%
+ \caldate}%
+% \end{macrocode}
+% Events are delimited by \cs{par}.
+% \begin{macrocode}
+{\par}%
+% \end{macrocode}
+% The next argument is dropped on DVI for each item.
+% We use it here to fetch the text of appointments and
+% events to the standard list macros, using the
+% standard text-fetching commands. Each generates a
+% stack delimited by the phrase that was set above.
+% \begin{macrocode}
+{\cal@get@appointments\cal@get@events}%
+% \end{macrocode}
+% This sets \cs{cal@entry@text}. It is executed for every
+% event or appointment in the database that applies
+% to a given item. We differentiate between whole-day events,
+% pinpointed events and ranged events.
+% \begin{macrocode}
+{\relax%
+ \ifnum\dates@time@start>0\relax%
+ \ifnum\dates@time@start=\dates@time@end%
+ \protected@edef\cal@entry@text{%
+ \thetimestart\space%
+ \cal@textcolor{\calcolor}{\theshorttext}}%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \thetimestart--\thetimeend\space%
+ \cal@textcolor{\calcolor}{\theshorttext}}%
+ \fi%
+ \else%
+ \protected@edef\cal@entry@text{%
+ \cal@textcolor{\calcolor}{\theshorttext}}%
+ \fi}%
+% \end{macrocode}
+% Finally we tell the style how to create the
+% text for each item.
+% We stash the text in each of the numbered boxes,
+% for extraction at the end of each group and at the
+% end of the run. In the event of an overfull \cs{vbox}, we
+% retry with two columns of text in a last-ditch attempt
+% to squeze everything in.
+% \begin{macrocode}
+{\global\wk@overthetopfalse%
+ \expandafter\sbox\csname wk@box\the\cal@subgroup@count\endcsname{%
+ \vbox to\wk@itemheight{\hbox{\parbox{\linewidth}{%
+\hrule width\linewidth%
+\vskip1pt\relax%
+\ifnum\cal@subgroup@count<3\relax%
+ \textbf{\theweekday\hfill%
+ \theday\space\themonth\space\theyear}\par%
+\else%
+ \textbf{\theday\space\themonth\space\theyear\hfill%
+ \theweekday}\par%
+\fi%
+\vskip0.5pt\relax%
+\hrule width\linewidth%
+\vskip1pt\relax%
+ \raggedright\small%
+ \ifcat$\theevents$%
+ \else%
+ \theevents\par%
+ \fi%
+ \ifcat$\theappointments$%
+ \else%
+ \theappointments%
+ \fi}% parbox
+}% hbox
+\vfill}% vbox
+\ifnum\badness=1000000\relax\global\wk@overthetoptrue\fi%
+}% sbox
+\ifwk@overthetop%
+ \message{Resetting this date in two-columns.}%
+\expandafter\sbox\csname wk@box\the\cal@subgroup@count\endcsname{%
+ \vbox to\wk@itemheight{\hbox{\parbox{\linewidth}{%
+\hrule width\linewidth%
+\vskip1pt\relax%
+\ifnum\cal@subgroup@count<3\relax%
+ \textbf{\theweekday\hfill%
+ \theday\space\themonth\space\theyear}\par%
+\else%
+ \textbf{\theday\space\themonth\space\theyear\hfill%
+ \theweekday}\par%
+\fi%
+\vskip0.5pt\relax%
+\hrule width\linewidth%
+\vskip1pt\relax%
+ \raggedright\small%
+ \begin{multicols}{2}%
+ \ifcat$\theevents$%
+ \else%
+ \theevents\par%
+ \fi%
+ \ifcat$\theappointments$%
+ \else%
+ \theappointments%
+ \fi%
+ \end{multicols}%
+}% parbox
+}% hbox
+\vfill}% vbox
+}% sbox
+\fi%
+ \advance\wk@tempcount by1\relax%
+ \ifnum\wk@tempcount>6\relax%
+ \wk@tempcount=0\relax%
+ \fi}
+%</class>
+% \end{macrocode}
+%
+%\iffalse
+% \begin{macrocode}
+%<*installer>
+\def\batchfile{weekly.ins}
+\input docstrip.tex
+
+\keepsilent
+
+\preamble
+This file is part of the Calendar package,
+Copyright (C) 1996, 1997 Frank Bennett, Jr.
+All rights reserved.
+------------------------------------------
+
+IMPORTANT NOTICE:
+
+You are not allowed to change this file. You may however copy
+this file to a file with a different name and then change the
+copy if (a) you do not charge for the modified code, (b) you
+acknowledge the author of this file in the new file, if it
+is distributed to others, and (c) you attach these same
+conditions to the new file.
+
+You are not allowed to distribute this file alone. You are not
+allowed to take money for the distribution or use of this file
+(or a changed version) except for a nominal charge for copying
+etc.
+
+You are allowed to distribute this file under the condition that
+it is distributed with all of its contents, intact.
+
+For error reports, or offers to help make this a more powerful,
+friendlier, and altogether more thrilling package, please contact me on
+fb@soas.ac.uk. Better yet, make a contribution to
+my pension. Account details available on request.
+------------------------------------------
+
+\endpreamble
+
+\generate{\file{weekly.cls}{\from{weekly.dtx}{class}}
+ }
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space weekly.sty}
+\Msg{*}
+\Msg{***********************************************************}
+
+%</installer>
+% \end{macrocode}
+%\fi
+% \Finale \PrintChanges
+
+
+
+
+
diff --git a/Master/texmf-dist/source/latex/calendar/yearly.dtx b/Master/texmf-dist/source/latex/calendar/yearly.dtx
new file mode 100644
index 00000000000..ea01432c9df
--- /dev/null
+++ b/Master/texmf-dist/source/latex/calendar/yearly.dtx
@@ -0,0 +1,340 @@
+%\iffalse
+%
+% File yearly.dtx
+% Copyright (C) 1996 by Frank Bennett. All rights reserved.
+%
+% This sub-package is provided for demonstration
+% purposes. Please feel free to edit it in any way whatsoever,
+% but do not distribute it in an altered condition to others
+% without permission.
+%
+% For error reports, or offers to help make this a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk
+%
+%<*dtx>
+ \ProvidesFile{yearly.dtx}
+%</dtx>
+%<style,class>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<style>\ProvidesPackage{yearly}
+%<style> [1997/11/06 07:33:21 2.1.1.6 Trivial yearly calendar (Frank Bennett)]
+% \fi
+%
+% \def\fileversion{2.1.1.6}
+% \def\filedate{1997/11/06 07:33:21}
+%
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+%\CodelineIndex
+%\EnableCrossrefs
+\begin{document}
+\OnlyDescription % Comment out for implementation details
+\DocInput{yearly.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \changes{v1.0}{1996/12/26}{Initial Version}
+% \changes{v1.1}{1997/10/18}{New public release of all styles
+% and modules incorporating global bug-fixes.}
+%
+%\iffalse
+% Source tree moved under RCS
+% ---------------------------
+% yearly.dtx,v
+% Revision 2.1.1.6 1997/11/06 07:33:21 root
+% Changed \yrly@theweekday to \theweekday.
+%
+% Revision 2.1.1.5 1997/11/06 07:31:25 root
+% Changed erroneous reference to \mon@firstday to
+% \yrly@firstday
+%
+% Revision 2.1.1.4 1997/11/06 07:30:04 root
+% Added declaration of \yrly@firstday
+%
+% Revision 2.1.1.3 1997/11/06 07:27:56 root
+% Second round of changes necessary to hook up the three new
+% options.
+%
+% Revision 2.1.1.2 1997/11/06 07:19:47 root
+% First draft of changes to introduce firstday, labels and
+% title options.
+%
+% Revision 2.1.1.1 1997/11/04 05:06:07 root
+% Development branch
+%
+% Revision 2.1 1997/11/01 14:43:45 bennett
+% Release code.
+%
+% Revision 1.3 1997/10/29 20:15:54 bennett
+% *** empty log message ***
+%
+% Revision 1.2 1997/10/29 15:41:56 root
+% Globalized assignments to dates@date, dates@day and dates@month.
+% Apparently save size overflow problems persist with the demo
+% of this style on small systems. Drat.
+%
+% Revision 1.1 1997/10/29 08:17:52 root
+% Initial revision
+%
+%\fi
+%
+% \title{User's Guide to the Yearly Calendar package\thanks{This file is version number
+% \fileversion{}. It was last revised on
+% \filedate{}.}}
+%
+% \author{Frank G. Bennett, Jr.}
+%
+% \maketitle
+%
+% \setcounter{StandardModuleDepth}{1}
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent This package makes a yearly calendar
+% on one side of A4.
+% \end{abstract}
+%
+%
+% \CheckSum{171}
+%
+% Please see the file \texttt{calguide.tex} for documentation
+% on this calendar style.
+%
+%\StopEventually{\PrintIndex}
+%
+% \section{The Macros}
+% We use the usual language options.
+% \begin{macrocode}
+\input calopts.cfg
+\InputIfFileExists{dates.cfg}{}{}
+\ProcessOptions
+% \end{macrocode}
+% Load some useful code.
+% \begin{macrocode}
+%<*style>
+\RequirePackage{calendar}
+% \end{macrocode}
+% Define some key values for use by the calendar environment.
+% \begin{macrocode}
+\define@key{opt}{title}{%
+ \def\yrly@title{#1}}
+\define@key{opt}{labels}{%
+ \@storelabels#1,,{}}
+\define@key{opt}{firstday}{%
+ \yrly@firstday=#1}
+\def\yrly@title{\theyear}
+\newcount\yrly@firstday
+\yrly@firstday=0\relax
+% \end{macrocode}
+% Define a utility macro for use by the \texttt{labels} key.
+% This stores a comma-delimited list of labels to a single
+% macro, which can then be used as a line in the table
+% environment that makes up the calendar.
+% \begin{macrocode}
+\newtoks\yrly@tempreg@a
+\newcount\yrly@tempcount
+\def\@storelabels{%
+ \def\yrly@labeltext{}%
+ \@@storelabels}
+\def\@@storelabels#1,#2#{%
+ \ifcat$#1$%
+ \yrly@tempreg@a=\expandafter\expandafter\expandafter{%
+ \expandafter\@gobble\yrly@labeltext}%
+ \edef\yrly@labeltext{\the\yrly@tempreg@a}%
+ \let\next\@gobble%
+ \else%
+ \let\next\@@storelabels%
+ \yrly@tempreg@a=\expandafter{\yrly@labeltext}%
+ \protected@edef\yrly@labeltext{\the\yrly@tempreg@a&#1}%
+ \fi%
+ \next#2{}}
+% \end{macrocode}
+% The environment is defined using "\newcalendar" and 17 arguments.
+% \begin{macrocode}
+\newcalendar%
+% \end{macrocode}
+% The name to be used in calling the calendar style.
+% \begin{macrocode}
+ {yearly}
+% \end{macrocode}
+% A command or group of commands used to print. This should end in a command
+% that takes one argument.
+% If we're making DVI,
+% we need to use the command "\cal@insert" to strip away the braces that surround this
+% in the Calendar style internals.
+% \begin{macrocode}
+ {\cal@insert}
+% \end{macrocode}
+% First day.
+% This is expressed as an integer.
+% Sunday is "0", Saturday is "6". Set this to "7" or more to
+% start the calendar and each line without any padding to
+% line up the day of the week.
+% \begin{macrocode}
+ {\yrly@firstday}
+% \end{macrocode}
+% Group Length.
+% This is an integer, or a macro that expands to an integer.
+% The table generator will increment a group counter by 1
+% each time a new ``item'' is output. It is set to 0 every
+% time a new group is started.
+%
+% \begin{macrocode}
+ {\dates@days}
+% \end{macrocode}
+% Subgroup length.
+% This may be an integer or a macro that expands to an integer.
+% The table generator will increment a subgroup counter by 1
+% each time a new ``item'' is output. It is set to 0 every
+% time a new subgroup is started.
+% \begin{macrocode}
+ {7}
+% \end{macrocode}
+% Item separator.
+% The item separator is placed before every item in the table
+% but the first in a subgroup.
+% \begin{macrocode}
+ {&}
+% \end{macrocode}
+% Increment event.
+% The date can be incremented after every item, every subgroup
+% or every group. The letters I, S and G carry these meanings,
+% respective.
+% \begin{macrocode}
+ {I}
+% \end{macrocode}
+% Calendar header.
+% Text to issue at the start of a calendar.
+% You can call on this elsewhere under the nickname
+% "\cal@header"
+% \begin{macrocode}
+ {\begin{tabular}[t]{ccccccc}%
+ \multicolumn{7}{c}{\textbf{\themonth}}\\\hline%
+ \yrly@labeltext\\\hline}%
+% \end{macrocode}
+%
+% \subsubsection{Calendar Footer}
+% Commands and text for the end of the calendar. You
+% can call on this in other macros as "\cal@footer".
+%
+% \begin{macrocode}
+ {\end{tabular}}
+% \end{macrocode}
+%
+% \subsubsection{Group Break}
+% This is issued at the end of every group but the last.
+%
+% \begin{macrocode}
+ {\cal@footer%
+ \ifodd\thumbnails%
+ \\%
+ \else%
+ \rule{0.25in}{0pt}%
+ \fi%
+ \advance\thumbnails by 1%
+ \cal@header}
+% \end{macrocode}
+%
+% \subsubsection{Sub-group Break}
+% This is issed at the end of every subgroup but the last
+% one in a calendar or a group.
+%
+% \begin{macrocode}
+ {\\}
+% \end{macrocode}
+%
+% \subsubsection{Range Initialization}
+% Preliminary macros to run before scanning the
+% overall range go here.
+%
+% \begin{macrocode}
+ {}
+% \end{macrocode}
+%
+% \subsubsection{Range Postprocessing}
+% These commands massage the date scanned for use in the
+% current calendar.
+%
+% \begin{macrocode}
+ {\global\dates@month=1%
+ \global\dates@day=1%
+ \dates@fix%
+ \cal@range@start\dates@date%
+ \message{^^JStart: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \global\dates@month=12%
+ \global\dates@day=31%
+ \dates@fix%
+ \caldate%
+ \cal@range@end\dates@date%
+ \message{^^JEnd: \theshortweekday\space%
+ \theday\space\theshortmonth\space\theyear}%
+ \global\dates@date=\cal@range@start%
+ \caldate%
+ \addtolength{\tabcolsep}{-0.5\tabcolsep}%
+ \newcount\thumbnails%
+ \@ifundefined{yrly@labeltext}{%
+ \def\yrly@defaultlabels{}%
+ \yrly@tempcount=1%
+ \global\advance\dates@date by-\dates@weekd%
+ \global\advance\dates@date by\yrly@firstday%
+ \caldate%
+ \loop%
+ \yrly@tempreg@a=\expandafter{\yrly@defaultlabels}%
+ \edef\yrly@defaultlabels{\the\yrly@tempreg@a\theshortweekday,}%
+ \ifnum\yrly@tempcount<7%
+ \global\advance\dates@date by1%
+ \caldate%
+ \advance\yrly@tempcount by 1\relax%
+ \repeat%
+ \expandafter\@storelabels\yrly@defaultlabels,,{}%
+ \dates@date\cal@range@start%
+ \caldate}%
+ {}%
+ \yrly@title\par\bigskip}%
+% \end{macrocode}
+%
+% \subsubsection{Entry Separator}
+% This is placed before every entry but the first in a list.
+%
+% \begin{macrocode}
+ {}%
+% \end{macrocode}
+%
+% \subsubsection{Item Initialization}
+% Commands that set registers and perform other non-printable
+% operations on a date by date basis should go here. This can be used to prepare
+% chunks of extractable text to place in a calendar that
+% is not being sent to DVI output.
+%
+% \begin{macrocode}
+ {\getanycolor}%
+% \end{macrocode}
+%
+% \subsubsection{Entry Initialization}
+% Commands that are dumped on DVI to define the
+% macro "\cal@entry@text" for every event entry
+% that matches the conditions, if any, given to
+% "\cal@get@appointments" or "\cal@get@events".
+% The content of this macro is then assembled with
+% other matching items in "\theappointments"
+% and "\theevents", so that it can be dropped
+% into the Item Text field as literal text. And
+% voil\`a, we can write HTML in \LaTeX.
+%
+% \begin{macrocode}
+ {}%
+% \end{macrocode}
+%
+% \subsubsection{Item Text}
+% And at last, that note we've been looking for!
+%
+% \begin{macrocode}
+ {\cal@textcolor{\calcolor}{\theday}}
+%</style>
+% \end{macrocode}
+% \Finale \PrintChanges