<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">%% timetable.tex - TeX macro for generating timetables.        version 1.0
%% Jiri VERUNEK                                                4. 11. 2001
%% http://verunek.oceany.cz
%% verunek@vol.cz, jiri.verunek@seznam.cz
%%
%%
%% DESCRIPTION
%%   timetable.tex is a TeX macro for generating timetables. It uses
%%   plain format commands. It excels in extremelely high configurability,
%%   nice appearance and simple input. It supports alternating subjects
%%   in dependence on odd and even week. Macro has radix sort mechanism
%%   so the order of subjects in input is irrelevant.
%%   Note that this macro is distributed under the GNU General Public Licence.
%%
%% SYNOPSIS
%%   \timetable[OPTIONS]{SUBJECTS}
%%
%% SUBJECTS
%%   Each subject has following structure
%%     &lt;day&gt;:&lt;subject type&gt;:&lt;beginning&gt;-&lt;duration&gt;=&lt;subjectname&gt;-&lt;location&gt;
%%
%%   &lt;day&gt;
%%     consist of the first two chars of the day (MO,TU,WE,TH,FR)
%%
%%   &lt;subject type&gt;
%%     is one of these OL, L, EL, OP, P, EP.
%%     L means lecture, P - practice, O - odd week and E - even week.
%%
%%   &lt;beginning&gt;
%%     is a number of the teaching hour in which the subject begins.
%%
%%   &lt;duration&gt;
%%     is a number representing the subject duration in the teaching hours
%%
%%   Subjects are separated by commas without spaces. Note the next paragraph.
%%
%% OPTIONS
%%   Options are separated by commas without spaces. The whole block
%%   of options must be enclosed by brackets. All must be placed on
%%   the one line. If you wish to place it on a several lines you will
%%   had to use per cent char `%' on the end of each line!
%%
%%   tablewidth=&lt;DIMENSION&gt;
%%     Table will be stretched into this dimension. It will only enlarge
%%     the distance between vertical lines. No font transformation
%%     will be done.
%%
%%   heading=&lt;text&gt;
%%     This text will be typed in the left upper edge of the table.
%%
%%   strut=height&lt;DIMENSION&gt; depth&lt;DIMENSION&gt;
%%     This invisible prop is inserted into each subject row to enlarge
%%     the height of that row.
%%     Default value is `height1em depth.35em'.
%%
%%   forcehrules
%%     Normally each subject is rounded by lines and no other lines are
%%     drown between the subjects. Using of this option will force
%%     drawing horizontal lines between the days.
%%
%%   forcevrules
%%     Normally each subject is rounded by lines and no other lines are
%%     drown between the subjects. Using of this option will force
%%     drawing verical lines between the teaching hours. No subject will be
%%     naturally crossed out.
%%
%%   environment=&lt;environment&gt;
%%     This does a lot of work. It changes the fonts, names of the day, etc.
%%     So you needn't use some other options to adjust texts to your language.
%%     Send me e-mail if you wish to add your environment.
%%     Supported environment:
%%       czech
%%       slovak
%%
%%   headingfont=&lt;fontname&gt;
%%     This option sets a font in which will be typed the heading text.
%%     Default value for absent environment option is `cmb10'.
%%
%%   columnheadingfont=&lt;fontname&gt;
%%     This option sets a font in which are typed the numbers
%%     of the teaching hours.
%%     Default value for absent environment option is `cmb10'.
%%
%%   rowheadingfont=&lt;fontname&gt;
%%     This option sets a font in which are typed the names of the days
%%     and the `from' and the `to' text.
%%     Default value for absent environment option is `cmb10'.
%%
%%   Lsubjectnamefont=&lt;fontname&gt;
%%     This option sets a font in which is typed the name of the lecture.
%%     Default value for absent environment option is `cmss10'.
%%
%%   Llocationfont=&lt;fontname&gt;
%%     This option sets a font in which are typed the names of the rooms
%%     in which is that lecture taught.
%%     Default value for absent environment option is `cmssi10'.
%%
%%   Psubjectnamefont=&lt;fontname&gt;
%%     This option sets a font in which is typed the name of the practice.
%%     Default value for absent environment option is `cmr10'.
%%
%%   Plocationfont=&lt;fontname&gt;
%%     This option sets a font in which are typed the names of the rooms
%%     in which is that practice taught.
%%     Default value for absent environment option is `cmti10'.
%%
%%   linewidth=&lt;DIMENSION&gt;
%%     This influences width of all lines in the table.
%%     Default value is `0.4pt'.
%%
%%   linespacewidth=&lt;DIMENSION&gt;
%%     You can change the width of the space between the vertical lines
%%     on the left and on the right of the table by this option.
%%     Default value is `1.3pt'.
%%
%%   linespaceheight=&lt;DIMENSION&gt;
%%     You can change the height of the space between the vertical lines
%%     on the top and at the bottom of the table by this option.
%%     Default value is `1.2pt'.
%%
%%   MO=&lt;text&gt;
%%   TU=&lt;text&gt;
%%   WE=&lt;text&gt;
%%   TH=&lt;text&gt;
%%   FR=&lt;text&gt;
%%     This texts are typed in the first column of the table.
%%     Default values for absent environment option are `Monday', etc.
%%
%%   from=&lt;text&gt;
%%   to=&lt;text&gt;
%%     This texts are typed in the first column of the table. The beginning
%%     time and the end time of the each teaching hour are typed in the
%%     next columns.
%%     Default values for absent environment option are `from', `to'.
%%
%%   subjectsfrom=&lt;timelist&gt;
%%   subjectsto=&lt;timelist&gt;
%%     Timelist is a list of the beginning/end time of each teaching hour.
%%     The times are separated by pipes `|' and are in h:mm format.
%%
%% &lt;DIMENSION&gt;
%%   This are the standard TeX dimension types which consists from a number
%%   and from an unit like em, en, pt, dd, in, cm, sp, etc.
%%   It is good to use first two units which rely on the font size.
%%
%% BUGS
%%   It seem that there is a bug in dvips. If you would like create
%%   PostScript output, you can use pdfTeX and the print function of Xpdf.
%%
%%   If you find some bug in this TeX macro send me a report with your input
%%   please. However be sure of having the right input before sending a report.
%%   Criticism and admiration are welcome.
%%
%% EXAMPLE
%%   \timetable[tablewidth=15cm,heading=ZS 2001/2002,environment=czech,%
%%   subjectsfrom=7:30|8:15|9:15|10:00|11:00|11:45|||14:30||16:15,%
%%   subjectsto=|9:00|9:45|10:45|11:30|12:30||14:15||16:00|16:55|17:45|19:25]%
%%   {TU:P:11-2=TI-K3,TH:L:1-2=EL-209,MO:L:5-2=M5D-K1,FR:P:3-2=LS-K307,%
%%   TU:L:1-3=TI-K1,MO:OP:8-2=DBS-K5,TU:L:6-2=\TeX-340,TH:OP:5-2=SOJ-K310,%
%%   TH:L:9-3=LS-337,MO:L:2-3=DBS-K1,FR:P:1-2=NLP-T204,MO:EP:9-2=DBS-K311,%
%%   WE:EP:4-2=EL-041/9}
%%
%%
\edef\oldcountten{\the\count10\relax} % \count register
\edef\oldcounteleven{\the\count11\relax} % \dimen register
\edef\oldcountfourteen{\the\count14\relax} % \box register
\edef\oldcountfiveteen{\the\count15\relax} % \toks register
\newtoks\halignbody
\newcount\nrofdeclared
\newcount\nrofcolumns
\newcount\tempnum
\newcount\nextsubjectbeg
\newcount\restcolumns
\newcount\currentcolumn
\newcount\hruleoldbelowbeg
\newcount\hruleoldbelowdur
\newcount\hruleabovebeg
\newcount\hruleabovedur
\newcount\hrulemiddlebeg
\newcount\hrulemiddledur
\newcount\hrulebelowbeg
\newcount\hrulebelowdur
\newdimen\tempdimen
\newdimen\columnwidth
\newbox\tempbox
\def\timetable{\bgroup
 \def\myrelaxtocolon##1:{\relax}
 \def\declareto##1:{\let\next=\declareloop \next##1:}
 \def\declareloop##1:{
  \ifnum \nrofdeclared=##1 \let\next=\myrelaxtocolon
  \else \advance\nrofdeclared by 1
   \expandafter\def\csname col\the\nrofdeclared\endcsname{}
  \fi \next##1:}
 \def\analysethebeginning##1:##2:##3-##4=##5,{
  \ifnum##3&gt;\nrofdeclared \declareto ##3: \fi
  \tempnum=##3
  \advance\tempnum by ##4
  \advance\tempnum by -1
  \ifnum \tempnum&gt;\nrofcolumns \nrofcolumns=\tempnum \fi
  \ex\ex\ex\ex\ex\ex\ex\def\ex\ex\ex\ex\ex\ex\csname col##3\endcsname
   \ex\ex\ex{\csname col##3\endcsname ##1:##2:##3-##4=##5,}}
 \def\myrelaxtwo##1##2{\relax}
 \def\myrelaxone##1{\relax}
 \def\browse##1,{\browseaction##1,
  \futurelet \nextchar\testnextchar}
 \def\testnextchar{
  \ifx ,\nextchar \let\browsenext=\myrelaxtwo
  \else
   \ifx *\nextchar \let\browsenext=\myrelaxone \fi
  \fi
  \browsenext}
 \def\browsetimes##1|{\browseaction##1|
  \futurelet \nextchar\testnexttimeschar}
 \def\testnexttimeschar{
  \ifx *\nextchar \let\browsenext=\myrelaxone \fi
  \browsenext}
 \def\mergethebeginning{
  \def\subjects{}
  \def\add####1:{\ex\ex\ex\ex\ex\ex\ex \def \ex\ex\ex\ex\ex\ex\ex \subjects
   \ex\ex\ex\ex\ex\ex\ex{\ex\ex\ex \subjects \csname col####1\endcsname}}
  \tempnum=0 \let\next=\mergethenextbeginning \next}
 \def\mergethenextbeginning{
  \ifnum\tempnum=\nrofdeclared \let\next=\relax
  \else \advance\tempnum by 1 \expandafter\add\the\tempnum:
  \fi \next}
 \def\getfromhruleoldbelow##1-##2,##3*{
   \def\hruleoldbelow{##3}
   \hruleoldbelowbeg=##1
   \hruleoldbelowdur=##2\relax}
 \def\analyseOE##1:##2##3:##4-##5=##6,{
  \def\addoldbelowtohruleabove{
   \edef\hruleabove{\hruleabove \the\hruleoldbelowbeg-\the\hruleoldbelowdur,}}
  \def\addtohruleabove{
   \edef\hruleabove{\hruleabove \the\hruleabovebeg-\the\hruleabovedur,}
   \hruleabovebeg=##4
   \hruleabovedur=##5}
  \def\addtohrulemiddle{
   \edef\hrulemiddle{\hrulemiddle \the\hrulemiddlebeg-\the\hrulemiddledur,}
   \hrulemiddlebeg=##4
   \hrulemiddledur=##5}
  \def\addtohrulebelow{
   \edef\hrulebelow{\hrulebelow \the\hrulebelowbeg-\the\hrulebelowdur,}
   \hrulebelowbeg=##4
   \hrulebelowdur=##5}
  \def\hruleabovetest{
   \ifnum\hruleoldbelowbeg=0
    \ifx \empty\hruleoldbelow \let\next=\hruleabovetestwithoutoldbelow
    \else
     \let\next=\hruleaboveloop
     \let\getnextoldbelow=\getfromhruleoldbelowexp
    \fi
   \else
    \let\next=\hruleaboveloop
    \let\getnextoldbelow=\relax
   \fi \next}
  \def\getfromhruleoldbelowexp{
   \expandafter\getfromhruleoldbelow\hruleoldbelow *}
  \def\hruleabovetestwithoutoldbelow{
   \ifnum\hruleabovebeg&gt;0
    \tempnum=\hruleabovebeg
    \advance\tempnum by \hruleabovedur
    \ifnum \tempnum&lt;##4 % space
     \addtohruleabove
    \else 
     \tempnum=##4
     \advance\tempnum by ##5
     \advance\tempnum by -\hruleabovebeg
     \advance\tempnum by -\hruleabovedur
     \ifnum \tempnum&gt;0
      \advance\hruleabovedur by \tempnum
     \fi
    \fi
   \else
    \hruleabovebeg=##4
    \hruleabovedur=##5
   \fi}
  \def\hruleaboveloop{
   \ifnum\hruleabovebeg&gt;0 % not first pass?
    \ifnum\hruleoldbelowbeg=0
     \ifx \empty\hruleoldbelow \let\next=\relax
     \fi
    \fi
    \ifx \next\relax
    \else
     \getnextoldbelow
     \tempnum=##4
     \advance\tempnum by ##5
     \advance\tempnum by 1
     \ifnum \hruleoldbelowbeg&lt;\tempnum 
      \ifnum \hruleoldbelowbeg&lt;\hruleabovebeg
       \tempnum=\hruleoldbelowbeg
       \advance\tempnum by \hruleoldbelowdur
       \advance\tempnum by 1
       \ifnum \hruleabovebeg&lt;\tempnum % 1
        \advance\hruleabovedur by \hruleabovebeg
        \advance\hruleabovedur by -\hruleoldbelowbeg
        \hruleabovebeg=\hruleoldbelowbeg
        \ifnum \hruleoldbelowdur&gt;\hruleabovedur
         \hruleabovedur=\hruleoldbelowdur
        \fi
        \let\getnextoldbelow=\getfromhruleoldbelowexp
        \hruleoldbelowbeg=0
        \hruleoldbelowdur=0
       \else % 3
        \addoldbelowtohruleabove
        \let\getnextoldbelow=\getfromhruleoldbelowexp
        \hruleoldbelowbeg=0
        \hruleoldbelowdur=0
       \fi
      \else
       \tempnum=\hruleabovebeg
       \advance\tempnum by \hruleabovedur
       \advance\tempnum by 1
       \ifnum \hruleoldbelowbeg&lt;\tempnum % 2
         \tempnum=\hruleoldbelowbeg
         \advance\tempnum by \hruleoldbelowdur
         \advance\tempnum by -\hruleabovebeg
         \advance\tempnum by -\hruleabovedur
         \ifnum \tempnum&gt;0
          \advance\hruleabovedur by \tempnum
         \fi
        \let\getnextoldbelow=\getfromhruleoldbelowexp
        \hruleoldbelowbeg=0
        \hruleoldbelowdur=0
       \else % 4
        \tempnum=##4
        \advance\tempnum by ##5
        \advance\tempnum by -\hruleabovebeg
        \advance\tempnum by -\hruleabovedur
        \ifnum \tempnum&gt;0 % Can the actual subject extend the hruleabove?
         \ifnum \tempnum&gt;##5 % If the extension is longer than duration
          \addtohruleabove   % of the actual subject there must be a space.
         \else
          \advance\hruleabovedur by \tempnum
         \fi
        \fi
       \fi
      \fi
     \else % the next comparisons are in the authority of the next subject
      \tempnum=\hruleabovebeg
      \advance\tempnum by \hruleabovedur
      \advance\tempnum by 1
      \ifnum \tempnum&gt;##4 %nospace
       \tempnum=##4
       \advance\tempnum by ##5
       \advance\tempnum by -\hruleabovebeg
       \advance\tempnum by -\hruleabovedur
       \ifnum \tempnum&gt;0
        \advance\hruleabovedur by \tempnum
       \fi
      \else
       \addtohruleabove
      \fi
      \let\getnextoldbelow=\relax
      \let\next=\relax
     \fi
    \fi
   \else
    \hruleabovebeg=##4
    \hruleabovedur=##5
   \fi \next}
  \def\hrulemiddletest{
   \ifnum\hrulemiddlebeg&gt;0
    \tempnum=\hrulemiddlebeg
    \advance\tempnum by \hrulemiddledur
    \ifnum ##4&gt;\tempnum % space
     \addtohrulemiddle
    \else
     \advance\tempnum by -##4
     \multiply\tempnum by -1
     \advance\tempnum by ##5
     \ifnum\tempnum&gt;0
      \advance\hrulemiddledur by \tempnum
     \fi
    \fi
   \else
    \hrulemiddlebeg=##4
    \hrulemiddledur=##5
   \fi}
  \def\hrulebelowtest{
   \ifnum\hrulebelowbeg&gt;0
    \tempnum=\hrulebelowbeg
    \advance\tempnum by \hrulebelowdur
    \ifnum \tempnum=##4 % no space
     \advance\hrulebelowdur by ##5
    \else \addtohrulebelow
    \fi
   \else
    \hrulebelowbeg=##4
    \hrulebelowdur=##5
   \fi}
  \ifx :##3: % Is that non-alternating subject?
   \ex\def\ex\mylineO\ex{\mylineO ##1:O##2:##4-##5=-,}
   \ex\def\ex\mylineE\ex{\mylineE ##1:E##2:##4-##5=-,}
   \ifnum \hrulemiddledur&gt;0
    \addtohrulemiddle
    \hrulemiddlebeg=0
    \hrulemiddledur=0
   \fi
   \let\testthehruleabove=\hruleabovetest
   \let\testthehrulemiddle=\relax
   \let\testthehrulebelow=\hrulebelowtest
   \ex\def\ex\myline\ex{\myline ##1:##2##3:##4-##5=##6,}
  \else
   \ifx O##2
    \let\testthehruleabove=\hruleabovetest
    \let\testthehrulemiddle=\hrulemiddletest
    \let\testthehrulebelow=\relax
    \ex\def\ex\mylineO\ex{\mylineO ##1:##2##3:##4-##5=##6,}
   \else
    \ifx E##2
     \let\testthehruleabove=\relax
     \let\testthehrulemiddle=\hrulemiddletest
     \let\testthehrulebelow=\hrulebelowtest
     \ex\def\ex\mylineE\ex{\mylineE ##1:##2##3:##4-##5=##6,}
    \else \errmessage{Bad input: ##1:##2##3:##4-##5=##6}
    \fi
   \fi
  \fi
  \testthehruleabove
  \testthehrulemiddle
  \testthehrulebelow}
 \def\analysetheday##1:##2,{
  \def\myday{##1}
  \ifx \dayMO\myday \ex\def\ex\mylineMO\ex{\mylineMO ##1:##2,}
  \else
   \ifx \dayTU\myday \ex\def\ex\mylineTU\ex{\mylineTU ##1:##2,}
   \else
    \ifx \dayWE\myday \ex\def\ex\mylineWE\ex{\mylineWE ##1:##2,}
    \else
     \ifx \dayTH\myday \ex\def\ex\mylineTH\ex{\mylineTH ##1:##2,}
     \else
      \ifx \dayFR\myday \ex\def\ex\mylineFR\ex{\mylineFR ##1:##2,}
      \else \errmessage{##1 is not valid format of the day of week.
       Use one of these - MO,TU,WE,TH,FR}
      \fi
     \fi
    \fi
   \fi
  \fi}
 \def\radixsort{
  \let\browseaction=\analysethebeginning
  \nrofdeclared=0
  \let\browsenext=\browse
  \expandafter\browse\subjects,*
  \mergethebeginning
  \tempnum=\nrofdeclared
  \nrofdeclared=0
  \expandafter\declareto\the\tempnum:
  \def\mylineMO{}
  \def\mylineTU{}
  \def\mylineWE{}
  \def\mylineTH{}
  \def\mylineFR{}
  \let\browseaction=\analysetheday
  \let\browsenext=\browse
  \expandafter\browse\subjects *
  \def\subjects{}}
 \def\testthetimetable{
  \ifx [\nextchar \let\next=\timetablewhopt
  \else \let\next=\timetablewhoutopt
  \fi \next}
 \def\timetablewhoutopt##1{\def\subjects{##1}
  \drawthetimetable}
 \def\timetablewhopt[##1]##2{\def\subjects{##2}
  \def\tablewidthopt{tablewidth}
  \def\headingopt{heading}
  \def\strutopt{strut}
  \def\forcehrulesopt{forcehrules}
  \def\forcevrulesopt{forcevrules}
  \def\environmentopt{environment}
  \def\headingfontopt{headingfont}
  \def\columnheadingfontopt{columnheadingfont}
  \def\rowheadingfontopt{rowheadingfont}
  \def\Lsubjectnamefontopt{Lsubjectnamefont}
  \def\Llocationfontopt{Llocationfont}
  \def\Psubjectnamefontopt{Psubjectnamefont}
  \def\Plocationfontopt{Plocationfont}
  \def\linewidthopt{linewidth}
  \def\linespacewidthopt{linespacewidth}
  \def\linespaceheightopt{linespaceheight}
  \def\fromopt{from}
  \def\toopt{to}
  \def\subjectsfromopt{subjectsfrom}
  \def\subjectstoopt{subjectsto}
  \let\browseaction=\analyseoptions
  \let\browsenext=\browse
  \browse##1,*
  \drawthetimetable}
 \def\analyseoptions##1,{
  \def\myoption{##1}
  \ifx \myoption\forcehrulesopt \let\drawthehrulesabove=\drawthelonghrule
  \else
   \ifx \myoption\forcevrulesopt \let\sepvrule=\relax
   \else \analyseequals##1,
   \fi
  \fi}
 \def\analyseequals##1=##2,{
  \def\myoption{##1}
  \ifx \myoption\tablewidthopt \def\tablewidth{to ##2}
  \else
   \ifx \myoption\headingopt \def\heading{##2}
   \else
    \ifx \myoption\environmentopt \def\environment{##2}
    \else
     \ifx \myoption\headingfontopt \font\headingfont=##2
     \else
      \ifx \myoption\columnheadingfontopt \font\columnheadingfont=##2
      \else
       \ifx \myoption\rowheadingfontopt \font\rowheadingfont=##2
       \else
        \ifx \myoption\Lsubjectnamefontopt \font\Lsubjectnamefont=##2
        \else
         \ifx \myoption\Llocationfontopt \font\Llocationfont=##2
         \else
          \ifx \myoption\Psubjectnamefontopt \font\Psubjectnamefont=##2
          \else
           \ifx \myoption\Plocationfontopt \font\Plocationfont=##2
           \else
            \ifx \myoption\linewidthopt
             \def\myhrule{\hrule height##2}
             \def\myvrule{\vrule width##2}
             \def\hrulefill{\leaders\myhrule\hfill}
            \else
             \ifx \myoption\linespacewidthopt
              \def\linespacewidth{\kern ##2}
             \else
              \ifx \myoption\linespaceheightopt
               \def\linespaceheight{\myvrule height##2}
              \else
               \ifx \myoption\dayMO \def\MO{##2}
               \else
                \ifx \myoption\dayTU \def\TU{##2}
                \else
                 \ifx \myoption\dayWE \def\WE{##2}
                 \else
                  \ifx \myoption\dayTH \def\TH{##2}
                  \else
                   \ifx \myoption\dayFR \def\FR{##2}
                   \else
                    \ifx \myoption\fromopt \def\from{##2}
                    \else
                     \ifx \myoption\toopt \def\to{##2}
                     \else
                      \ifx \myoption\subjectsfromopt
                       \def\subjectsfrom{##2}
                       \let\testthefromrow=\addthefromrow
                      \else
                       \ifx \myoption\subjectstoopt
                        \def\subjectsto{##2}
                        \let\testthetorow=\addthetorow
                       \else
                        \ifx \myoption\strutopt
                         \def\mystrut{\vrule width0pt ##2}
                        \else
                         \ifx \myoption\headingopt \def\heading{##2}
                         \else \errmessage{Bad option: ##1} 
                         \fi
                        \fi
                       \fi
                      \fi
                     \fi
                    \fi
                   \fi
                  \fi
                 \fi
                \fi
               \fi
              \fi
             \fi
            \fi
           \fi
          \fi
         \fi
        \fi
       \fi
      \fi
     \fi
    \fi
   \fi
  \fi}
 \def\emptythehrules{
  \def\myline{}
  \def\mylineO{}
  \def\mylineE{}
  \hruleoldbelowbeg=0
  \hruleoldbelowdur=0
  \hruleabovebeg=0
  \hruleabovedur=0
  \hrulemiddlebeg=0
  \hrulemiddledur=0
  \hrulebelowbeg=0
  \hrulebelowdur=0
  \def\hruleabove{}
  \def\hrulemiddle{}
  \def\hrulebelow{}}
 \def\testtherests{
  \ifnum\hruleabovebeg&gt;0
   \addtohruleabove
  \else
   \ifx \empty\hruleabove
    \edef\hruleabove{\hruleoldbelow}
   \fi
  \fi
  \ifnum\hrulemiddlebeg&gt;0 \addtohrulemiddle \fi
  \ifnum\hrulebelowbeg&gt;0 \addtohrulebelow \fi
  \ifnum\hruleoldbelowbeg&gt;0 \addoldbelowtohruleabove \fi}
 \def\divideintorows{
  \def\hruleoldbelow{}
  \emptythehrules
  \ifx \empty\mylineMO
  \else
   \let\browseaction=\analyseOE
   \let\browsenext=\browse
   \expandafter\browse\mylineMO *
   \testtherests
  \fi
  \ex\def\ex\mylineMOO\ex{\mylineO}
  \ex\def\ex\mylineMO\ex{\myline}
  \ex\def\ex\mylineMOE\ex{\mylineE}
  \edef\hrulemiddleMO{\hrulemiddle}
% TUESDAY
  \edef\hruleoldbelow{\hrulebelow}
  \emptythehrules
  \ifx \empty\mylineTU
   \edef\hruleaboveTU{\hruleoldbelow}
  \else
   \let\browseaction=\analyseOE
   \let\browsenext=\browse
   \expandafter\browse\mylineTU *
   \testtherests
   \edef\hruleaboveTU{\hruleabove}
  \fi
  \ex\def\ex\mylineTUO\ex{\mylineO}
  \ex\def\ex\mylineTU\ex{\myline}
  \ex\def\ex\mylineTUE\ex{\mylineE}
  \edef\hrulemiddleTU{\hrulemiddle}
% WEDNESDAY
  \edef\hruleoldbelow{\hrulebelow}
  \emptythehrules
  \ifx \empty\mylineWE
   \edef\hruleaboveWE{\hruleoldbelow}
  \else
   \let\browseaction=\analyseOE
   \let\browsenext=\browse
   \expandafter\browse\mylineWE *
   \testtherests
   \edef\hruleaboveWE{\hruleabove}
  \fi
  \ex\def\ex\mylineWEO\ex{\mylineO}
  \ex\def\ex\mylineWE\ex{\myline}
  \ex\def\ex\mylineWEE\ex{\mylineE}
  \edef\hrulemiddleWE{\hrulemiddle}
% THURSDAY
  \edef\hruleoldbelow{\hrulebelow}
  \emptythehrules
  \ifx \empty\mylineTH
   \edef\hruleaboveTH{\hruleoldbelow}
  \else
   \let\browseaction=\analyseOE
   \let\browsenext=\browse
   \expandafter\browse\mylineTH *
   \testtherests
   \edef\hruleaboveTH{\hruleabove}
  \fi
  \ex\def\ex\mylineTHO\ex{\mylineO}
  \ex\def\ex\mylineTH\ex{\myline}
  \ex\def\ex\mylineTHE\ex{\mylineE}
  \edef\hrulemiddleTH{\hrulemiddle}
% FRIDAY
  \edef\hruleoldbelow{\hrulebelow}
  \emptythehrules
  \ifx \empty\mylineFR
   \edef\hruleaboveFR{\hruleoldbelow}
  \else
   \let\browseaction=\analyseOE
   \let\browsenext=\browse
   \expandafter\browse\mylineFR *
   \testtherests
   \edef\hruleaboveFR{\hruleabove}
  \fi
  \ex\def\ex\mylineFRO\ex{\mylineO}
  \ex\def\ex\mylineFR\ex{\myline}
  \ex\def\ex\mylineFRE\ex{\mylineE}
  \edef\hrulemiddleFR{\hrulemiddle}
  \emptythehrules}
 \def\emptysubjectloop{
  \ifnum \tempnum&gt;0
   \ifnum \tempnum&gt;1
    \halignbody=\expandafter{\the\halignbody &amp;&amp;\sepvrule}
   \else
    \halignbody=\expandafter{\the\halignbody &amp;&amp;}
    \ifnum\currentcolumn&gt;\nrofcolumns
     \halignbody=\ex\ex\ex{\ex\the\ex\halignbody\addstrut\cr}
    \fi
   \fi
   \advance\tempnum by -1
  \else
   \let\next=\relax
  \fi \next}
 \def\getnexthrulemiddle##1-##2,##3*{
  \hrulemiddlebeg=##1
  \hrulemiddledur=##2
  \def\hrulemiddle{##3}}
 \def\hrulesubjectsloop{
  \ifnum \hrulemiddlebeg=0
   \ifx \empty\hrulemiddle
    \tempnum=\nextsubjectbeg
    \advance\tempnum by -\currentcolumn
    \advance\currentcolumn by \tempnum
    \let\addstrut=\space
    \let\next=\emptysubjectloop
    \let\nexthruleloop=\next
   \else
    \expandafter\getnexthrulemiddle\hrulemiddle *
   \fi
  \fi
  \ifnum \hrulemiddlebeg&gt;0
   \ifnum \nextsubjectbeg&lt;\hrulemiddlebeg % add spaces to next subject
    \tempnum=\nextsubjectbeg
    \advance\tempnum by -\currentcolumn
    \advance\currentcolumn by \tempnum
    \let\next=\emptysubjectloop
    \next
   \else % add spaces to middlehrulebeg
    \tempnum=\hrulemiddlebeg
    \advance \tempnum by -\currentcolumn
    \ifnum \tempnum&gt;0
     \advance\currentcolumn by \tempnum
     \let\next=\emptysubjectloop
     \next
    \fi
    \ifnum \hrulemiddlebeg=1
     \def\begvvrulecorrection{\vvrule}
    \else
     \def\begvvrulecorrection{\relax}
    \fi
    \tempnum=\hrulemiddlebeg
    \advance\tempnum by \hrulemiddledur
    \advance\tempnum by -1
    \ifnum \tempnum=\nrofcolumns
     \def\endvvrulecorrection{\vvrule}
    \else
     \def\endvvrulecorrection{\relax} 
    \fi
    \edef\correctedline{\begvvrulecorrection\hrulefill\endvvrulecorrection}
    \tempnum=\hrulemiddledur
    \multiply\tempnum by 2
    \advance\tempnum by 1
    \advance\currentcolumn by \hrulemiddledur
    \halignbody=\ex\ex\ex\ex\ex\ex\ex{\ex\ex\ex\the\ex\ex\ex\halignbody
     \ex\ex\ex\multispan\ex\ex\ex{\ex\the\ex\tempnum\ex}\correctedline}
    \ifnum \currentcolumn&gt;\nrofcolumns
     \halignbody=\expandafter{\the\halignbody \cr}
    \fi
   \fi
   \ifnum\currentcolumn&lt;\nextsubjectbeg
    \tempnum=\hrulemiddlebeg
    \advance\tempnum by \hrulemiddledur
    \advance\tempnum by -1
    \ifnum \currentcolumn&gt;\tempnum
     \hrulemiddlebeg=0
    \fi
   \else
    \let\nexthruleloop=\relax
   \fi
  \fi
  \nexthruleloop}
 \def\testthecolumnwidth ##1##2=##3-##4,{
  \ifx L##1
   \setbox\tempbox=\hbox{\Lsubjectnamefont\ ##3\Llocationfont ##4\ }
  \else
   \setbox\tempbox=\hbox{\Psubjectnamefont\ ##3\Plocationfont ##4\ }
  \fi
  \tempdimen=\wd\tempbox
  \divide \tempdimen by ##2
  \ifnum \tempdimen&gt;\columnwidth
   \columnwidth=\tempdimen
  \fi}
 \def\drawthesubject##1:##2##3:##4-##5=##6-##7,{
  \ifnum \currentcolumn&lt;##4 % Is it necessary to add spaces?
   \if :##3: % add spaces with middlehrules
    \nextsubjectbeg=##4
    \hrulemiddlebeg=0
    \let\nexthruleloop=\hrulesubjectsloop
     \nexthruleloop
   \else % add spaces without hrules
    \edef\addstrut{\higheststrutfont\mystrut}
    \tempnum=##4
    \advance\tempnum by -\currentcolumn
    \advance\currentcolumn by \tempnum
    \let\next=\emptysubjectloop
    \next
   \fi
  \fi
  \tempnum=##5
  \multiply\tempnum by 2
  \advance\tempnum by -1
  \advance\currentcolumn by ##5
  \ifx :##3:
   \ifx L##2
    \halignbody=\ex\ex\ex{\ex\the\ex\halignbody \ex &amp;\ex\multispan
     \ex{\the\tempnum}\hfil\hidewidth \vbox to0pt{\vss\hbox{\Lsubjectnamefont
      ##6 \mystrut\Llocationfont ##7\mystrut}\vss}\hidewidth\hfil &amp;}
    \testthecolumnwidth L##5=##6-##7,
   \else
    \halignbody=\ex\ex\ex{\ex\the\ex\halignbody \ex &amp;\ex\multispan
     \ex{\the\tempnum}\hfil\hidewidth \vbox to0pt{\vss\hbox{\Psubjectnamefont
      ##6 \mystrut\Plocationfont ##7\mystrut}\vss}\hidewidth\hfil &amp;}
    \testthecolumnwidth P##5=##6-##7,
   \fi
   \ifnum\currentcolumn&gt;\nrofcolumns
    \halignbody=\ex\ex\ex{\ex\the\ex\halignbody \cr}
   \fi
  \else
   \ifx L##3
    \halignbody=\ex\ex\ex{\ex\the\ex\halignbody \ex &amp;\ex\multispan
     \ex{\the\tempnum}\hfil\hidewidth\Lsubjectnamefont ##6
      \Llocationfont ##7\hidewidth\hfil &amp;}
    \testthecolumnwidth L##5=##6-##7,
   \else
    \halignbody=\ex\ex\ex{\ex\the\ex\halignbody \ex &amp;\ex\multispan
     \ex{\the\tempnum}\hfil\hidewidth\Psubjectnamefont ##6
      \Plocationfont ##7\hidewidth\hfil &amp;}
    \testthecolumnwidth P##5=##6-##7,
   \fi
   \ifnum\currentcolumn&gt;\nrofcolumns
    \halignbody=\ex\ex\ex{\ex\the\ex\halignbody\addstrut \cr}
   \fi
  \fi}
 \def\hrulesaboveinit{
  \halignbody=\expandafter{\the\halignbody \multispan3\vvrule\hrulefill &amp;}
  \currentcolumn=1
  \nextsubjectbeg=\nrofcolumns
  \advance\nextsubjectbeg by 1
  \let\nexthruleloop=\hrulesubjectsloop
  \nexthruleloop}
 \def\longhrule{\multispan3\vvrule\hrulefill&amp;\multispan\restcolumns
  \span\omit\vvrule\hrulefill\vvrule\cr}
 \def\drawthelonghrule{\halignbody=\ex{\the\halignbody \longhrule}}
 \def\testonetime##1|{
  \ifnum \tempnum&lt;\nrofcolumns
   \ifx |##1|
    \halignbody=\ex{\the\halignbody &amp;&amp;}
    \advance\tempnum by 1
   \else \typeonetime##1|
   \fi
  \fi}
 \def\typeonetime##1:##2|{
  \ifnum \tempnum&lt;\nrofcolumns
   \halignbody=\ex{\the\halignbody &amp;$##1^{##2\mathstrut}\mathstrut$&amp;}
   \advance\tempnum by 1
   \setbox\tempbox=\hbox{\ $##1^{##2}$\ }
   \tempdimen=\wd\tempbox
   \ifnum \tempdimen&gt;\columnwidth
    \columnwidth=\tempdimen
   \fi
  \fi}
 \def\addthefromrow{
  \def\lastvkern{\longhrule\vkern}
  \halignbody=\ex{\the\halignbody \longhrule &amp;\rowheadingfont\from\mystrut &amp;&amp;}
  \let\browsenext=\browsetimes
  \let\browseaction=\testonetime
  \tempnum=0
  \expandafter\browsetimes\subjectsfrom |*
  \ifnum \tempnum&lt;\nrofcolumns
   \nextsubjectbeg=\tempnum % nextsubjectbeg has the temporary value here
   \tempnum=\nrofcolumns
   \advance\tempnum by -\nextsubjectbeg
   \let\next=\emptytimesloop
   \next
  \fi
  \halignbody=\ex{\the\halignbody \mystrut\cr}}
 \def\addthetorow{
  \def\lastvkern{\longhrule\vkern}
  \halignbody=\ex{\the\halignbody \longhrule &amp;\rowheadingfont\to\mystrut &amp;&amp;}
  \let\browsenext=\browsetimes
  \let\browseaction=\testonetime
  \tempnum=0
  \expandafter\browsetimes\subjectsto |*
  \ifnum \tempnum&lt;\nrofcolumns
   \nextsubjectbeg=\tempnum % nextsubjectbeg has the temporary value here
   \tempnum=\nrofcolumns
   \advance\tempnum by -\nextsubjectbeg
   \let\next=\emptytimesloop
   \next
  \fi
  \halignbody=\ex{\the\halignbody \mystrut\cr}}
 \def\emptytimesloop{
  \ifnum \tempnum&gt;0
   \halignbody=\expandafter{\the\halignbody &amp;&amp;}
   \advance\tempnum by -1
  \else
   \let\next=\relax
  \fi \next}
 \def\drawthetimetable{
  \ifx \empty\environment
   \ifx \empty\headingfont \font\headingfont=cmb10 \fi
   \ifx \empty\columnheadingfont \font\columnheadingfont=cmb10 \fi
   \ifx \empty\rowheadingfont \font\rowheadingfont=cmb10 \fi
   \ifx \empty\Lsubjectnamefont \font\Lsubjectnamefont=cmss10 \fi
   \ifx \empty\Llocationfont \font\Llocationfont=cmssi10 \fi
   \ifx \empty\Psubjectnamefont \font\Psubjectnamefont=cmr10 \fi
   \ifx \empty\Plocationfont \font\Plocationfont=cmti10 \fi
   \ifx \empty\MO \def\MO{Monday} \fi
   \ifx \empty\TU \def\TU{Tuesday} \fi
   \ifx \empty\WE \def\WE{Wednesday} \fi
   \ifx \empty\TH \def\TH{Thursday} \fi
   \ifx \empty\FR \def\FR{Friday} \fi
   \ifx \empty\from \def\from{from} \fi
   \ifx \empty\to \def\to{to} \fi
  \else
   \def\environmentopt{czech}
   \ifx \environment\environmentopt
    \ifx \empty\headingfont \font\headingfont=csb10 \fi
    \ifx \empty\columnheadingfont \font\columnheadingfont=csb10 \fi
    \ifx \empty\rowheadingfont \font\rowheadingfont=csb10 \fi
    \ifx \empty\Lsubjectnamefont \font\Lsubjectnamefont=csss10 \fi
    \ifx \empty\Llocationfont \font\Llocationfont=csssi10 \fi
    \ifx \empty\Psubjectnamefont \font\Psubjectnamefont=csr10 \fi
    \ifx \empty\Plocationfont \font\Plocationfont=csti10 \fi
    \ifx \empty\MO \def\MO{Pond�l�} \fi
    \ifx \empty\TU \def\TU{�ter�} \fi
    \ifx \empty\WE \def\WE{St�eda} \fi
    \ifx \empty\TH \def\TH{�tvrtek} \fi
    \ifx \empty\FR \def\FR{P�tek} \fi
    \ifx \empty\from \def\from{od} \fi
    \ifx \empty\to \def\to{do} \fi
   \else 
    \def\environmentopt{slovak}
    \ifx \environment\environmentopt
     \ifx \empty\headingfont \font\headingfont=csb10 \fi
     \ifx \empty\columnheadingfont \font\columnheadingfont=csb10 \fi
     \ifx \empty\rowheadingfont \font\rowheadingfont=csb10 \fi
     \ifx \empty\Lsubjectnamefont \font\Lsubjectnamefont=csss10 \fi
     \ifx \empty\Llocationfont \font\Llocationfont=csssi10 \fi
     \ifx \empty\Psubjectnamefont \font\Psubjectnamefont=csr10 \fi
     \ifx \empty\Plocationfont \font\Plocationfont=csti10 \fi
     \ifx \empty\MO \def\MO{Pondelok} \fi
     \ifx \empty\TU \def\TU{Utorok} \fi
     \ifx \empty\WE \def\WE{Streda} \fi
     \ifx \empty\TH \def\TH{�tvrtok} \fi
     \ifx \empty\FR \def\FR{Piatok} \fi
     \ifx \empty\from \def\from{od} \fi
     \ifx \empty\to \def\to{do} \fi
    \else \errmessage{Unknown environment parameter: \environment}
    \fi
   \fi
  \fi
  \radixsort
  \divideintorows
  \def\vvrule{\myvrule\linespacewidth \myvrule}
  \def\vkern{\multispan\restcolumns
   \span\omit\span\omit\span\omit\span\omit
   \linespaceheight \hfil \linespaceheight \cr}
  \def\addtohalignmask{
   \ifnum \tempnum=\nrofcolumns
    \halignbody=\expandafter{\the\halignbody
     \hbox to\columnwidth{\hfil########\hfil}&amp;########\vvrule\tabskip=0pt}
    \let\next=\relax
   \else
    \halignbody=\expandafter{\the\halignbody
     \hbox to\columnwidth{\hfil########\hfil}&amp;########\myvrule&amp;}
    \advance\tempnum by 1
   \fi \next}
  \restcolumns=\nrofcolumns
  \multiply\restcolumns by 2
  \halignbody={\tabskip=0pt plus 1fil\vvrule ####&amp;
   \hfil\ ####\ \hfil &amp; ####\tabskip=0pt &amp;
   \tabskip=0pt plus 1fil\vvrule ####&amp;}
  \tempnum=1
  \let\next=\addtohalignmask
  \next
  \halignbody=\expandafter{\the\halignbody \cr \noalign{\myhrule} \vkern \cr
   \longhrule &amp;\headingfont\heading\mystrut&amp;}
  \def\typetheheading{
   \ifnum \tempnum=\nrofcolumns
    \halignbody=\expandafter{\the\halignbody &amp;\columnheadingfont\mystrut
     \cr \longhrule\vkern \cr \longhrule}
    \let\next=\relax
   \else
    \advance\tempnum by 1
    \ex\setbox\ex\tempbox\ex\hbox\ex{\ex\columnheadingfont\ex\ \the\tempnum\ }
    \tempdimen=\wd\tempbox
    \ifnum \tempdimen&gt;\columnwidth
     \columnwidth=\tempdimen
    \fi
    \halignbody=\ex\ex\ex{\ex\the\ex\halignbody\ex&amp;\ex&amp;\ex\columnheadingfont
     \the\tempnum}
   \fi \next}
  \tempnum=0
  \let\next=\typetheheading
  \next
  \def\initOE{% alternating subjects
   \hrulemiddlebeg=0
   \halignbody=\expandafter{\the\halignbody &amp;\omit &amp;&amp;}
   \currentcolumn=1
   \let\browsenext=\browse
   \let\browseaction=\drawthesubject
   \if \empty\subjects
   \else
    \expandafter\browse\subjects *
   \fi
   \ifnum \currentcolumn&gt;\nrofcolumns
    \let\next=\relax
   \else
    \tempnum=\nrofcolumns
    \advance\tempnum by -\currentcolumn
    \advance\tempnum by 1
    \advance\currentcolumn by \tempnum
    \edef\addstrut{\higheststrutfont\mystrut}
    \let\next=\emptysubjectloop
   \fi \next}
  \def\init{% non alternating subjects
   \hrulemiddlebeg=0
   \currentcolumn=1
   \let\browsenext=\browse
   \let\browseaction=\drawthesubject
   \ifx \empty\subjects
   \else
    \expandafter\browse\subjects *
   \fi
   \nextsubjectbeg=\nrofcolumns
   \advance\nextsubjectbeg by 1
   \let\addstrut=\space
   \let\nexthruleloop=\hrulesubjectsloop
   \nexthruleloop}
% compute highest strut in subjects
  \setbox\tempbox=\hbox{\Lsubjectnamefont\mystrut}
  \tempdimen=\ht\tempbox % \tempdimen = the highest strut
  \let\higheststrutfont=\Lsubjectnamefont
  \setbox\tempbox=\hbox{\Psubjectnamefont\mystrut}
  \ifnum \tempdimen&lt;\ht\tempbox
   \tempdimen=\ht\tempbox
   \let\higheststrutfont=\Psubjectnamefont
  \fi
  \setbox\tempbox=\hbox{\Llocationfont\mystrut}
  \ifnum \tempdimen&lt;\ht\tempbox
   \tempdimen=\ht\tempbox
   \let\higheststrutfont=\Llocationfont
  \fi
  \setbox\tempbox=\hbox{\Plocationfont\mystrut}
  \ifnum \tempdimen&lt;\ht\tempbox
   \tempdimen=\ht\tempbox
   \let\higheststrutfont=\Plocationfont
  \fi
% Monday
  \let\subjects=\mylineMOO
  \initOE
  \let\subjects=\mylineMO
  \let\hrulemiddle=\hrulemiddleMO
  \halignbody=\expandafter{\the\halignbody &amp;\vbox to0pt{\vss
   \hbox{\rowheadingfont \MO\mystrut}\vss}&amp;&amp;}
  \init
  \let\subjects=\mylineMOE
  \initOE
% Tuesday
  \let\hrulemiddle=\hruleaboveTU
  \drawthehrulesabove
  \let\subjects=\mylineTUO
  \initOE
  \let\subjects=\mylineTU
  \let\hrulemiddle=\hrulemiddleTU
  \halignbody=\expandafter{\the\halignbody &amp;\vbox to0pt{\vss
   \hbox{\rowheadingfont \TU\mystrut}\vss}&amp;&amp;}
  \init
  \let\subjects=\mylineTUE
  \initOE
% Wednesday
  \let\hrulemiddle=\hruleaboveWE
  \drawthehrulesabove
  \let\subjects=\mylineWEO
  \initOE
  \let\subjects=\mylineWE
  \let\hrulemiddle=\hrulemiddleWE
  \halignbody=\expandafter{\the\halignbody &amp;\vbox to0pt{\vss
   \hbox{\rowheadingfont \WE\mystrut}\vss}&amp;&amp;}
  \init
  \let\subjects=\mylineWEE
  \initOE
% Thursday
  \let\hrulemiddle=\hruleaboveTH
  \drawthehrulesabove
  \let\subjects=\mylineTHO
  \initOE
  \let\subjects=\mylineTH
  \let\hrulemiddle=\hrulemiddleTH
  \halignbody=\expandafter{\the\halignbody &amp;\vbox to0pt{\vss
   \hbox{\rowheadingfont \TH\mystrut}\vss}&amp;&amp;}
  \init
  \let\subjects=\mylineTHE
  \initOE
% Friday
  \let\hrulemiddle=\hruleaboveFR
  \drawthehrulesabove
  \let\subjects=\mylineFRO
  \initOE
  \let\subjects=\mylineFR
  \let\hrulemiddle=\hrulemiddleFR
  \halignbody=\expandafter{\the\halignbody &amp;\vbox to0pt{\vss
   \hbox{\rowheadingfont \FR\mystrut}\vss}&amp;&amp;}
  \init
  \let\subjects=\mylineFRE
  \initOE
  \halignbody=\ex{\the\halignbody \longhrule \vkern}
  \testthefromrow
  \testthetorow
  \halignbody=\ex{\the\halignbody \lastvkern \noalign{\myhrule}}
  \expandafter\ialign\tablewidth{\span\the\halignbody}
  \egroup
% cancel the changes made by the \newcount commands etc.
  \count10=\oldcountten
  \count11=\oldcounteleven
  \count14=\oldcountfourteen
  \count15=\oldcountfiveteen}
% the beginning
 \offinterlineskip
 \nrofcolumns=0
 \def\tablewidth{}
 \def\heading{}
 \def\mystrut{\myvrule width0pt height1em depth.35em}
 \let\sepvrule=\omit
 \let\drawthehrulesabove=\hrulesaboveinit
 \let\testthefromrow=\relax
 \let\testthetorow=\relax
 \let\lastvkern=\space
 \def\environment{}
 \def\headingfont{}
 \def\columnheadingfont{}
 \def\rowheadingfont{}
 \def\Lsubjectnamefont{}
 \def\Llocationfont{}
 \def\Psubjectnamefont{}
 \def\Plocationfont{}
 \let\myhrule=\hrule
 \let\myvrule=\vrule
 \def\linespacewidth{\kern 1.3pt}
 \def\linespaceheight{\myvrule height1.2pt}
 \def\dayMO{MO}
 \def\dayTU{TU}
 \def\dayWE{WE}
 \def\dayTH{TH}
 \def\dayFR{FR}
 \def\MO{}
 \def\TU{}
 \def\WE{}
 \def\TH{}
 \def\FR{}
 \def\from{}
 \def\to{}
 \def\subjectsfrom{}
 \def\subjectsto{}
 \columnwidth=0pt
 \let\ex=\expandafter
 \futurelet\nextchar \testthetimetable}
\end
</pre></body></html>