\documentclass[10pt]{article}
\usepackage{mathpazo}
\usepackage[scaled=0.9]{helvet}
\usepackage{fullpage}
\usepackage{prerex}
%\def\LaTeX{\mbox{LaTeX}}
\begin{document}

\title{\textsf{prerex.sty}: Prerequisite Charts in \LaTeX\\{\large Version 6.3}}
\author{R. D. Tennent\\\texttt{rdt@cs.queensu.ca}}
\date{\today}
\maketitle 
\thispagestyle{empty}

\section{Description}
\texttt{prerex.sty}
defines macros that 
[pdf]\LaTeX\ 
can use
to draw charts consisting of labelled course boxes linked by arrows
that represent pre- and co-requisite requirements; see
the example chart in Figure~\ref{chart} on page~\pageref{chart}.
In addition to the usual 
[pdf]\LaTeX\ 
output, auxiliary files will be generated containing image-map data for the 
hyperlinked nodes in the diagram and a shell script for cropping a PNG image
obtained from the [pdf]\LaTeX\ output.

If the source file satisfies the constraints
of the
\textsf{prerex(5)}
format, a chart description may be edited using the
\textsf{prerex(1)}
interactive editor (as well as any conventional text editor).

\begin{figure}
\setcounter{diagheight}{40}
\begin{chart}
\text 15,40:{\textsf{\textbf{\Large Computer Science}}}
\reqfullcourse 50,35:{1083}{Comput.\,Sci.\\Concepts}{TTh 10:00}
\reqhalfcourse 25,30:{1303}{Discrete\\Structures}{MWF 9:30}
\reqhalfcourse 30,20:{2813}{Computer\\Organiz.\,I}{MWF 8:30}
  \prereq 50,35,30,20:
  \prereq 25,30,30,20:
\reqhalfcourse 45,20:{2023}{Procedural\\Prog.\,Devel.}{MWF 2:30}
  \prereq 50,35,45,20:
\reqhalfcourse 65,20:{2513}{Informat.\\Systems}{TTh 1:00}
  \coreq 50,35,65,20:
\mini 10,16:{1083}
\reqhalfcourse 10,10:{2333}{Computab.\,\&\\Formal\,Lang.}{TTh 11:30}
  \prereq 25,30,10,10:
  \prereq 10,16,10,10:
\reqhalfcourse 45,10:{2013}{Software\\Engineer.\,I}{MWF 11:30}
  \prereq 45,20,45,10:
\halfcourse 55,10:{2685}{\texttt{C++}\\Program.}{no}
  \prereq 45,20,55,10:
\mini 21,6:{2013}
\reqhalfcourse 15,0:{3323}{Data\\Structures}{MWF 10:30}
  \prereq 25,30,15,0:
  \prereq 21,6,15,0:
\reqhalfcourse 25,0:{3813}{Comput.\\Organiz.\,II}{TTh 8:30}
  \prereq 30,20,25,0:
\reqhalfcourse 35,0:{3413}{Operating\\Systems\,I}{MWF 9:30}
  \prereq 30,20,35,0:
  \recomm 45,10,35,0:
\halfcourse 45,0:{3013}{Software\\Engineer.\,II}{MWF 11:30}
  \prereq 45,10,45,0:
\halfcourse 58,0:{3513}{Database\\Mngt.\,Sys.\,I}{MWF 8:30 pm}
  \prereq 65,20,58,0:
  \prereq 45,10,58,0:
\reqhalfcourse 70,0:{3503}{Sys.\,Anal.\\\&\,Design}{TTh 10:00}
  \prereq 65,20,70,0:
\end{chart}

\paragraph{Notes}
\begin{itemize}
\item
A solid arrow \solidarrow\  indicates a required prerequisite, 
a dotted arrow \dottedarrow\ 
indicates a corequisite (to be taken before or concurrently), and a
dashed arrow \dashedarrow\ indicates a recommended prerequisite.
Core courses are in \boldbox\ boxes; 
other courses (i.e.,~options or prerequisites)
are in \lightbox\ boxes.
\item Timetable abbreviations: M, T, W, Th, F$=$Mon, Tue, Wed, Thur, Fri, resp.; no$=$not offered.
\item \dots
\end{itemize}
\caption{A Prerequisite Chart}
\label{chart}
\end{figure}
\section{Terminology}
A prerequisite chart consists of a number of 
\emph{course boxes},
linked by 
\emph{arrows}.
Courses are either
\emph{half}
or
\emph{full},
and may be 
\emph{required} or \emph{optional} (or neither).
Each course box can contain a course
\emph{code}
(upper left corner),
a course 
\emph{title}
(lower half),
and
\emph{timetable}
information
(upper right corner).
An arrow can be either a \emph{prerequisite} (solid),
a \emph{corequisite} (dotted),
or 
\emph{recommended} (dashed).
When a conventional arrow would be inappropriate, it is possible to use
a
\emph{mini} 
course ``box'' (consisting of just a course code) just above a target box.
A line of text may be placed anywhere on the chart.
\section{Coordinate System}
A conventional two-dimensional
Cartesian coordinate system is used to specify the locations of
diagram elements.
The
origin (where
$x = 0$
and
$y = 0$)
is at the lower-left corner of the diagram.
The diagram height is configurable; the width is determined by
the values of
\verb|\textwidth|
and
an adjustable
\verb|\unit|
length, which defines the absolute value of a coordinate unit.
It is possible to put a coordinate grid with labelled axes
in the background of a chart.
The coordinates of a
\emph{box,}
\emph{mini,}
or
\emph{text-line}
are those of its centre point.  
An
\emph{arrow} 
is described by the
coordinates of the centre points of its source and target boxes/minis/text-lines. 



\section{Usage}
The command
\verb|\usepackage{prerex}|
should appear in the document preamble.
This will define a \LaTeX\ environment 
\begin{list}{}{}
\item \verb|\begin{chart}|\quad$\cdots$\quad \verb|\end{chart}|
\end{list}
within which the commands described in the following sub-sections may be used
to produce course boxes, minis, text-lines, and arrows. 
The order of commands is not significant except
that the commands for the source and target boxes of an arrow should 
precede
the command for the arrow, and the \verb|\grid| command, if present, should precede
other chart commands.

\subsection{Course Boxes}
The commands producing course boxes have the following forms:
\begin{list}{}{}
\item \verb|\halfcourse | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}|
\item \verb|\reqhalfcourse | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}|
\item \verb|\opthalfcourse | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}|
\item \verb|\fullcourse | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}|
\item \verb|\reqfullcourse | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}|
\item \verb|\optfullcourse | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}|
\end{list}
where
$x,y$
are the coordinates of the 
centerpoint 
of the box, relative to the origin
of the coordinate system at the lower-left corner of the diagram.
The 
\emph{code},
\emph{title},
and
\emph{timetable}
arguments are arbitrary (well-bracketed) text, possibly with \LaTeX\ markup.

The following are similar but take an additional argument to specify
the (non-default) background color of the course box:
\begin{list}{}{}
\item \verb|\halfcoursec | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}| \verb|{| \emph{color} \verb|}|
\item \verb|\reqhalfcoursec | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}| \verb|{| \emph{color} \verb|}|
\item \verb|\opthalfcoursec | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}| \verb|{| \emph{color} \verb|}|
\item \verb|\fullcoursec | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}| \verb|{| \emph{color} \verb|}|
\item \verb|\reqfullcoursec | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}| \verb|{| \emph{color} \verb|}|
\item \verb|\optfullcoursec | $x,y$ \verb|:{| \emph{code} \verb|}{| \emph{title} \verb|}{| \emph{timetable} \verb|}| \verb|{| \emph{color} \verb|}|
\end{list}

\subsection{Mini Course Boxes and Text-Lines}
A mini course ``box'' is produced by a command of the form
\begin{list}{}{}
\item \verb|\mini| $x,y$ \verb|:{| \emph{code} \verb|}|
\end{list}
A text-line is produced by a command of the form
\begin{list}{}{}
\item \verb|\text| $x,y$ \verb|:{| \emph{line of text} \verb|}|
\end{list}
There are several differences between minis and text-lines.
The maximum length allowed for a course-code may be less than that
for a text-line. A sans-serif font and a reduced font size is
used for a course-code.  A course-code
may be hyperlinked but a text-line is not (except when the coordinate grid is on).
A \verb|\parbox| command may be used if more than one line is desired.


\subsection{Arrows}
Arrows between course boxes (or minis or text-lines) are produced
by commands of the form
\begin{list}{}{}
\item \verb|\prereq| $ x_0,y_0,x_1,y_1$\verb|:|
\item \verb|\coreq| $ x_0,y_0,x_1,y_1$\verb|:|
\item \verb|\recomm| $ x_0,y_0,x_1,y_1$\verb|:|
\end{list}
These produce, respectively, solid, dotted, and dashed arrows from
the course box (or mini or text-line) centered at coordinates
$x_0,y_0$
to the entity centered at coordinates
$x_1,y_1$.

Arrows by default have a
non-zero curvature (unless they are very short).  It is possible to override the default curvature 
for a particular arrow by using
the instructions
\begin{list}{}{}
\item \verb|\prereqc| $ x_0,y_0,x_1,y_1;c$\verb|:|
\item \verb|\coreqc| $ x_0,y_0,x_1,y_1;c$\verb|:|
\item \verb|\recommc| $ x_0,y_0,x_1,y_1;c$\verb|:|
\end{list}
where
$c$
is an integer in the range $0$--$100$ specifying the desired curvature; for example, 
$c= 0$
will produce a 
straight 
arrow. To change the default curvature for all arrows, the user program may redefine the
\verb|\DefaultCurvature|
command.
\subsection{Web Links}
\label{WebLinks}
Course boxes and minis may be hyperlinked.
The default URL for course boxes is 
\emph{course-code}\verb|.html|
where
\emph{course-code}
is
the 
\emph{code}
argument
of the course box. The URL scheme may be changed by the user 
by re-defining the 
\verb|\CourseURL|
command; see Section~\ref{Configuration}.
\subsection{Coordinate Grid}
The following command produces a coordinate grid with labelled axes, which is
useful while editing a diagram: 
\begin{list}{}{}
\item \verb|\grid|
\end{list}
This is normally placed before all the other chart commands so that
grid lines are in the background, covered by course boxes, minis, text-lines, and arrows,
as in Figure~\ref{grid} on page~\pageref{grid}. 

The \verb|\grid| command
also redefines the \verb|CourseURL| command 
so that, in suitable PDF viewers, 
if the mouse cursor is placed over a box, mini, or midpoint of an arrow,
the \emph{coordinates} of the box/mini/textline (or the coordinates of the source \emph{and} target
of the arrow) will be displayed 
as follows: in the 
status bar
in \texttt{xpdf} and \texttt{gpdf}, and in a
``tooltip'' in recent versions of \texttt{kpdf}/\texttt{okular}, \texttt{evince}, and the Acrobat Reader.
This coordinate display make it easier to edit chart descriptions.
When the grid is on, the mid-point of every arrow is highlighted by 
a ``bullet''.

The 
\texttt{prerex}
package at 
\url{http://www.ctan.org/tex-archive/graphics/prerex/}
has a patch for 
\texttt{kpdf} (recently incorporated into \texttt{okular})
to allow capture coordinates of course boxes,
arrows, and
background points in the X selection clipboard (for pasting into a 
command being composed at the 
\texttt{prerex} 
prompt).
There is also a GUI frontend 
\texttt{vprerex} to the \texttt{prerex} 
editor which incorporates a minimalistic prerex-enabled PDF viewer.

\begin{figure}
\setcounter{diagheight}{40}
\begin{chart}
\grid
\text 15,40:{\textsf{\textbf{\Large Computer Science}}}
\reqfullcourse 50,35:{1083}{Comput.\,Sci.\\Concepts}{TTh 10:00}
\reqhalfcourse 25,30:{1303}{Discrete\\Structures}{MWF 9:30}
\reqhalfcourse 30,20:{2813}{Computer\\Organiz.\,I}{MWF 8:30}
  \prereq 25,30,30,20:
  \prereq 50,35,30,20:
\reqhalfcourse 45,20:{2023}{Procedural\\Prog.\,Devel.}{MWF 2:30}
  \prereq 50,35,45,20:
\reqhalfcourse 65,20:{2513}{Informat.\\Systems}{TTh 1:00}
  \coreq 50,35,65,20:
\mini 10,16:{1083}
\reqhalfcourse 10,10:{2333}{Computab.\,\&\\Formal\,Lang.}{TTh 11:30}
  \prereq 10,16,10,10:
  \prereq 25,30,10,10:
\reqhalfcourse 45,10:{2013}{Software\\Engineer.\,I}{MWF 11:30}
  \prereq 45,20,45,10:
\halfcourse 55,10:{2685}{\texttt{C++}\\Program.}{no}
  \prereq 45,20,55,10:
\mini 21,6:{2013}
\reqhalfcourse 15,0:{3323}{Data\\Structures}{MWF 10:30}
  \prereq 21,6,15,0:
  \prereq 25,30,15,0:
\reqhalfcourse 25,0:{3813}{Comput.\\Organiz.\,II}{TTh 8:30}
  \prereq 30,20,25,0:
\reqhalfcourse 35,0:{3413}{Operating\\Systems\,I}{MWF 9:30}
  \recomm 45,10,35,0:
  \prereq 30,20,35,0:
\halfcourse 45,0:{3013}{Software\\Engineer.\,II}{MWF 11:30}
  \prereq 45,10,45,0:
\halfcourse 58,0:{3513}{Database\\Mngt.\,Sys.\,I}{MWF 8:30 pm}
  \prereq 45,10,58,0:
  \prereq 65,20,58,0:
\reqhalfcourse 70,0:{3503}{Sys.\,Anal.\\\&\,Design}{TTh 10:00}
  \prereq 65,20,70,0:
\end{chart}
\vspace*{2ex}
\caption{A Prerequisite Chart with a Coordinate Grid}
\label{grid}
\end{figure}
\subsection{Stand-Alone Commands}
The following commands may be used outside a 
\verb|chart|
environment, such as in the explanatory notes for a chart:
\begin{center}
\begin{tabular}{lc}
\verb|\solidarrow| & \solidarrow\\
\verb|\dottedarrow| & \dottedarrow \\
\verb|\dashedarrow| & \dashedarrow \\
\verb|\lightbox|  & \lightbox \\
\verb|\boldbox|   & \boldbox \\
\verb|\dottedbox|   & \dottedbox \\
\end{tabular}
\end{center}

\section{Dependencies}
This implementation of 
\verb|prerex.sty|
uses 
\verb|pgf|
(version~1.18 or later)
with add-on package
\verb|tikz|.
The following additional packages are used:
\verb|multido|,
\verb|relsize|,
\verb|calc|,
\verb|ifthen|,
\verb|textcomp|,
\verb|zref-savepos|,
and 
\verb|hyperref|.
\emph{Either} \verb\pdflatex\
\emph{or}
\verb\latex\ (followed by \verb\dvips\ and, possibly, \verb\ps2pdf\)
may be used.

\section{Conversion to Portable Network Graphic (PNG) Format}

To convert a chart (in Postscript or PDF format) to a reasonably high-quality image, it is suggested to use the
\verb|convert| tool of the 
\verb|ImageMagick| package as follows:
\begin{verbatim}
  convert -density 125 chart.ps chart.png 
\end{verbatim}
or
\begin{verbatim}
  convert -density 125 chart.pdf chart.png 
\end{verbatim}
The density parameter specifies the number of pixels per inch; if this is too small, the
image is of poor quality, and if it is too large, the image file is too big.
By default, the shell script generated by \texttt{prerex.sty} crops the image at the southeast corner.
It is possible to use a PNG compression application such as
\texttt{optipng} to reduce the file-size of the cropped image (without loss of quality).

An auxiliary file
containing image-map data for the hyperlinked nodes in the chart is also generated;
consult a reference on the HTML language for an explanation of (client-side) image maps.

\section{Installation}

\begin{enumerate}
  \item install the most recent version of 
\verb\pgf\ from \url{http://sourceforge.net/projects/pgf/}.
  \item  copy \verb|prerex.sty| to \emph{your-texmf-tree}\verb|/tex/latex/misc|
  \item copy \verb|doc/prerex.{tex,pdf}| to \emph{your-texmf-tree}\verb|/doc/latex/misc|
  \item if necessary, refresh the \TeX\ database (e.g., \verb|texhash|)
  \item copy \verb|man/prerex.sty.7| to sub-directory \verb|man7| of a \verb|man| directory on your 
    \verb|MANPATH|
  \item test by doing 

\begin{verbatim}
$ man 7 prerex.sty
$ make chart.pdf
\end{verbatim}


\end{enumerate}

\section{Configuration} 
\label{Configuration}
The following are defined by the style file but may be re-defined by the
user:
\begin{list}{}{}
\item \verb|\newcommand{\DefaultCurvature}{20}|
\end{list}
where the argument should be in the range $0$--$100$; $0$ means no curvature.
\begin{list}{}{}
\item \verb|\newcommand{\CourseURL}[3]{#3.html}|
\end{list}
where the arguments supplied at the call are the $x$ and $y$ coordinates
of the box or mini and the course code.
\begin{list}{}{}
\item \verb|\newcommand{\background}{yellow!15}|
\end{list}
which specifies the default background color of course boxes.
\begin{list}{}{}
\item \verb|\setlength{\unit}{5.7816pt}|
\end{list}
which defines the absolute size of a coordinate unit;
this yields 10 pixels per
coordinate unit if the chart is converted to an image at 125 dpi.
\begin{list}{}{}
\item \verb|\newcommand{\dpi}{125}| 
\item \verb|\newcommand{\PixelsPerUnit}{10}| 
\end{list}
These have to re-defined together if the image-map data are to be correct.
\begin{list}{}{}
\item \verb|\setcounter{diagheight}{75}|
\end{list}
which is the 
$y$-coordinate
of the top of the diagram (reduced to $65$ in landscape mode);
the nominal diagram width is 
\verb|\textwidth|~$\div$~\verb|\unit|~$+ 10$.


The following define the thicknesses of the three kinds of arrows,
and the thickness of bold boxes:
\begin{list}{}{}
\item
\verb|\newcommand{\solidwidth}{0.5pt}|
\item
\verb|\newcommand{\dottedwidth}{0.8pt}|
\item
\verb|\newcommand{\dashedwidth}{0.5pt}|
\item
\verb|\newcommand{\boldwidth}{1.0pt}|
\end{list}

The following command is used to change to a smaller size for course codes,
timetable information, and mini-course codes:
\begin{list}{}{}
\item
\verb|\newcommand{\smallersize}{\relsize{-3}}|
\end{list}

The following command defines the baseline adjustment for the stand-alone arrows and boxes;
this parameter is font-dependent.
\begin{list}{}{}
\item
\verb|\newcommand{\baselineAdj}{-0.5ex}|
\end{list}

\section{Implementation Details}

\subsection{Boxes}

To improve the appearance, boxes are drawn with slightly rounded corners.  The half-course
boxes are assigned a minimum height to give a more uniform appearance to horizontal
rows of such boxes. 
The mini and text boxes have white frames and their
fill colour is white, which is assumed to be the background colour of the chart.
A text box is not normally hyperlinked; however, if the coordinate grid is
on, it is hyperlinked and its chart coordinates are encoded in the URI.  

\subsection{Arrows}
Arrows with a small height and arrows whose
source and target points have equal x or y coordinates are always draw straight
(using a specialized and simpler macro)  unless an explicit
non-zero curvature argument is provided.

If the coordinate grid is on, a hyperlink with the source and target coordinates is placed
at the mid-point of the arrow.

A wider background white edge is drawn below an arrow to 
improve the appearance
of crossing arrows; the background also
ensures visibility of the
arrow when the coordinate grid is on.
A thin white arrow (with a visible
arrowhead) is drawn beneath the visible arrow to obtain a thin arrowhead.

\subsection{Coordinate Grid and Associated Changes}
When the coordinate grid is drawn, the \texttt{CourseURL} command
is re-defined to pass node coordinates in URIs. Also,
two ``anchor'' hyperlinks are inserted at the southwest and northeast corners
of the diagram to allow prerex-enabled
PDF viewers to compute chart coordinates.

\subsection{Chart Images}

\enlargethispage*{8ex}

To support HTML versions of charts,
\texttt{prerex.sty} 
generates a script to crop a chart image at the southeast corner, allowing
descriptive notes below the chart to be treated as ordinary text. Also,
it generates image-map data for use with an HTML image map.  To
obtain absolute page coordinates, the \texttt{zsavepos}, \texttt{zposx}
and \texttt{zposy} commands are used; the page coordinates are converted into pixel coordinates
for cropping and image-map use.

\section{License}
\verb|prerex.sty|, \verb|prerex.sty.7|, \verb|README.prerex| and this document may be distributed and/or modified under the
conditions of the \LaTeX\ Project Public License.
\end{document}
