%\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
%
%
\documentclass{ltxdoc}
%\CodelineIndex
%\EnableCrossrefs
\begin{document}
\OnlyDescription % Comment out for implementation details
\DocInput{timetabl.dtx}
\end{document}
%
%\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}
%
\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@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@date0\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\noexpand$}}}%
% \end{macrocode}
%
% \textit{All other conforming entries get the long text.}
%
% \begin{macrocode}
\else%
\ifnum\dates@time@start
%
%\iffalse
%
% \section{The Installation File}
%
% \begin{macrocode}
%
\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{***********************************************************}
%
% \end{macrocode}
%\fi
% \Finale \PrintChanges