%% This is file 'prerex.sty'
%%
%% Copyright (C) 2006-14 R. D. Tennent, rdt@cs.queensu.ca
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2003/12/01 or later.
%%
%% This work has the LPPL maintenance status "author-maintained".
%%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{prerex}[2014/03/22 v6.5.0 LaTeX style for prerequisite charts, pgf version]
%
% Changelog is at the end of the file.
%
% Instructions supported inside \begin{chart} ... \end{chart}:
%
% \[req|opt]{half|full}course[c] x,y: {course code}{course title}{timetable code}[{color}]
%
% \mini x,y: {course code}
%
% solid arrow: \prereq x0,y0,x1,y1: \prereqc x0,y0,x1,y1;curvature:
% dotted arrow: \coreq x0,y0,x1,y1: \coreqc x0,y0,x1,y1;curvature:
% dashed arrow: \recomm x0,y0,x1,y1: \recommc x0,y0,x1,y1;curvature:
%
% \text x,y: {lines of text}
%
% \grid coordinate grid background
%
% Stand-alone instructions (for explanatory notes):
%
% \solidarrow in-line solid arrow
% \dottedarrow in-line dotted arrow
% \dashedarrow in-line dashed arrow
%
% \lightbox in-line light course box
% \boldbox in-line bold course box
% \dottedbox in-line dotted course box
%
% The nominal diagram width is (\textwidth divided by \unit) + 10
%
\newlength{\unit}
\newlength{\ppt}
\setlength{\ppt}{0.0138888888in} % one Postscript point = (1/72) in.
\setlength{\unit}{5.7816pt} % 10 pixels per unit at 125dpi; 1pt = (1/72.27) in.
\newcommand{\PixelsPerUnit}{10}
\newcommand{\dpi}{125}
\newcommand{\ppi}{72}
\RequirePackage{relsize}
\RequirePackage{calc}
\RequirePackage{pgf}[2013/12/18]
\RequirePackage{tikz}\usetikzlibrary{arrows.meta}
\RequirePackage{textcomp}
\RequirePackage{zref-savepos}
\PassOptionsToPackage{urlcolor=black,colorlinks,raiselinks}{hyperref}
\RequirePackage{hyperref}
\RequirePackage{ifpdf}
\RequirePackage{xcolor}
\definecolor{light}{gray}{0.5}
\definecolor{somewhatlight}{gray}{0.7}
\definecolor{verylight}{gray}{0.85}
\definecolor{white}{rgb}{1.0,1.0,1.0} % not transparent, hides grid
\newcommand{\DefaultCurvature}{20}
% where the argument should be in the range 0-100; 0 means no curvature.
\newcommand{\CourseURL}[3]{#3.html}
% where the arguments supplied at the call are the x and y coordinates
% and the course code.
\newcommand{\background}{yellow!15}
\newcommand{\solidwidth}{0.5pt}
\newcommand{\boldwidth}{1.0pt}
\newcommand{\dottedwidth}{0.8pt}
\newcommand{\dashedwidth}{0.5pt}
\newcommand{\smallersize}{\relsize{-3}}
\newcommand{\baselineAdj}{-0.5ex}
\newcounter{@myangle}
\newcounter{@inangle}
\newcounter{@dx}
\newcounter{@dy}
\newif\ifgridon
\gridonfalse
\newcounter{@gridwidth}
\newcounter{@gridright}
\newcounter{@gridheight}
\newcounter{@gridtop}
\newcounter{@diagwidth}
\newcounter{diagheight}
\setcounter{diagheight}{75}
\ifdim\paperwidth>\paperheight
\setcounter{diagheight}{65}
\fi
\newcounter{chart} % in case there is more than one chart in the document
\newcounter{xNW}\newcounter{yNW}
\newcounter{xSE}\newcounter{ySE}
\newcounter{xSW}\newcounter{ySW}
\newcounter{xL}\newcounter{yL}
\newcounter{XSE}\newcounter{YSE}
\def\@unitmult{\unit * 5} % used for the grid and as the minimum height of half-course boxes
\def\@outputImapData#1,#2:#3#4#5{%
% #1,#2 coordinates
% #3 URL
% #4 horizontal delta
% #5 vertical delta
%
\ifpdf
\setcounter{xNW}{\dpi * \ratio{\zposx{gridOrigin_\thechart}sp}{1in}}% # of pixels from left edge to origin
\addtocounter{xNW}{(#1-#4)*\PixelsPerUnit}% add # pixels from origin to node (-#4 units)
\setcounter{xSE}{\dpi * \ratio{\zposx{gridOrigin_\thechart}sp}{1in}}%
\addtocounter{xSE}{(#1+#4)*\PixelsPerUnit}% add # pixels from origin to node (+#4 units)
\setcounter{yNW}{ \dpi * \ratio{\paperheight}{1in}} % # of pixels for the whole page
\addtocounter{yNW}{ 0 - \dpi * \ratio{\zposy{gridOrigin_\thechart}sp}{1in}} % subtract # pixels from bottom edge to origin
\addtocounter{yNW}{0 - (#2 - #5) * \PixelsPerUnit } % subtract # of pixels from origin to node (-#5)
\setcounter{ySE}{ \dpi * \ratio{\paperheight}{1in}}
\addtocounter{ySE}{0 - \dpi * \ratio{\zposy{gridOrigin_\thechart}sp}{1in}}
\addtocounter{ySE}{0 - (#2 + #5) * \PixelsPerUnit } % subtract # of pixels from origin to node (+#5)
\immediate\write\@imapfile{}%
\immediate\write\@linkfile{ }
\fi
}
\pgfsetlayers{}
\def\solidarrow{%
\tikz[x=\unit,y=\unit,baseline=\baselineAdj]
\draw[-{Latex[length=4pt]},line width =\solidwidth] (0,0) -- (4,0);
}
\def\dottedarrow{%
\tikz[x=\unit,y=\unit,baseline=\baselineAdj]
\draw[-{Latex[length=4pt]},loosely dotted,line width=\dottedwidth] (0,0) -- (4,0);
}
\def\dashedarrow{%
\tikz[x=\unit,y=\unit,baseline=\baselineAdj]
\draw[-{Latex[length=4pt]},dashed,line width=\dashedwidth] (0,0) -- (4,0);
}
\def\lightbox{%
\tikz[thin,baseline=\baselineAdj]\node[draw,rounded corners=2pt,inner xsep=1.8pt]
{\rule[-2pt]{0pt}{4pt}light};
}
\def\boldbox{%
\tikz[baseline=\baselineAdj]\node[draw,line width=\boldwidth,rounded corners=2pt,inner xsep=1.8pt]
{\rule[-2pt]{0pt}{4pt}\bfseries bold};
}
\def\dottedbox{%
\tikz[baseline=\baselineAdj]\node[draw,dotted,line width=\boldwidth,rounded corners=2pt,inner xsep=1.8pt]
{\rule[-2pt]{0pt}{4pt}dotted};
}
\pgfdeclarelayer{arrows}
\pgfdeclarelayer{courses}
\pgfdeclarelayer{grid}
\pgfsetlayers{grid,arrows,courses,main}
\def\@halfcourse#1,#2:#3#4#5{%
\begin{pgfonlayer}{courses}%
\node[draw,thin,fill=\background,minimum height=\@unitmult](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{0.8}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{2}%
\end{pgfonlayer}%
}
\def\@halfcoursec#1,#2:#3#4#5#6{%
\begin{pgfonlayer}{courses}%
\node[draw,thin,fill=#6,minimum height=\@unitmult](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{0.8}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize\selectfont{#3}}%
\,\hfill\,%
{\smallersize{\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{2}%
\end{pgfonlayer}%
}
\def\@reqhalfcourse#1,#2:#3#4#5{%
\begin{pgfonlayer}{courses}%
\node[draw,line width=\boldwidth,fill=\background,minimum height=\@unitmult](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{0.8}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize\bfseries#3}%
\,\hfill\,%
{\smallersize\bfseries\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}%
}};%
\@outputImapData#1,#2:{#3}{4}{2}%
\end{pgfonlayer}%
}
\def\@reqhalfcoursec#1,#2:#3#4#5#6{%
\begin{pgfonlayer}{courses}%
\node[draw,line width=\boldwidth,fill=#6,minimum height=\@unitmult](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{0.8}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize\bfseries#3}%
\,\hfill\,%
{\smallersize\bfseries\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}%
}};%
\@outputImapData#1,#2:{#3}{4}{2}%
\end{pgfonlayer}%
}
\def\@opthalfcourse#1,#2:#3#4#5{%
\begin{pgfonlayer}{courses}%
\node[draw,dotted,line width=\boldwidth,fill=\background,minimum height=\@unitmult](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{0.8}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{2}%
\end{pgfonlayer}%
}
\def\@opthalfcoursec#1,#2:#3#4#5#6{%
\begin{pgfonlayer}{courses}%
\node[draw,dotted,line width=\boldwidth,fill=#6,minimum height=\@unitmult](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{0.8}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{2}%
\end{pgfonlayer}%
}
\def\@fullcourse#1,#2:#3#4#5{%
\begin{pgfonlayer}{courses}%
\node[draw,thin,fill=\background](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{1.7}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{5}%
\end{pgfonlayer}%
}
\def\@fullcoursec#1,#2:#3#4#5#6{%
\begin{pgfonlayer}{courses}%
\node[draw,thin,fill=#6](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{1.7}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\end{pgfonlayer}%
\@outputImapData#1,#2:{#3}{4}{5}%
}
\def\@reqfullcourse#1,#2:#3#4#5{%
\begin{pgfonlayer}{courses}%
\node[draw,line width=\boldwidth,fill=\background](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{1.7}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize\bfseries#3}%
\,\hfill\,%
{\smallersize\bfseries\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{5}%
\end{pgfonlayer}%
}
\def\@reqfullcoursec#1,#2:#3#4#5#6{%
\begin{pgfonlayer}{courses}%
\node[draw,line width=\boldwidth,fill=#6](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{1.7}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize\bfseries#3}%
\,\hfill\,%
{\smallersize\bfseries\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{5}%
\end{pgfonlayer}%
}
\def\@fullcoursec#1,#2:#3#4#5#6{%
\begin{pgfonlayer}{courses}%
\node[draw,thin,fill=#6](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{1.7}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{5}%
\end{pgfonlayer}%
}
\def\@optfullcourse#1,#2:#3#4#5{%
\begin{pgfonlayer}{courses}%
\node[draw,dotted,line width=\boldwidth,fill=\background](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{1.7}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{5}%
\end{pgfonlayer}%
}
\def\@optfullcoursec#1,#2:#3#4#5#6{%
\begin{pgfonlayer}{courses}%
\node[draw,dotted,line width=\boldwidth,fill=#6](x#1y#2) at (#1,#2)%
{
\renewcommand{\arraystretch}{1.7}%
\href{\CourseURL{#1}{#2}{#3}}{\begin{tabular}{@{\hspace{1pt}}c@{\hspace{1pt}}}%
{\smallersize#3}%
\,\hfill\,%
{\smallersize\renewcommand{\arraystretch}{0.5}\begin{tabular}[t]{@{}r@{}}#5\end{tabular}}%
\\ #4%
\end{tabular}}%
};%
\@outputImapData#1,#2:{#3}{4}{5}%
\end{pgfonlayer}%
}
\def\@mini#1,#2:#3{%
\begin{pgfonlayer}{courses}%
\ifgridon
\node[fill=white,draw=white](x#1y#2) at (#1,#2)%
{
\href{\CourseURL{#1}{#2}{#3}}{%
{\smallersize\mdseries#3}}};%
\else
\node[fill=none,draw=none](x#1y#2) at (#1,#2)%
{
\href{\CourseURL{#1}{#2}{#3}}{%
{\smallersize\mdseries#3}}};%
\fi
\@outputImapData#1,#2:{#3}{2}{1}%
\end{pgfonlayer}%
}
\def\@text#1,#2:#3{%
% include coordinates if grid on, but don't hyperlink if grid off
\begin{pgfonlayer}{courses}%
\ifgridon
\node[fill=white,draw=white](x#1y#2) at (#1,#2)%
{\href{coord: #1,#2}{\sffamily\mdseries\renewcommand{\arraystretch}{0.5}\begin{tabular}[b]{@{}c@{}}#3\\[-0.4ex]\end{tabular}}};%
\else
\node[fill=none,draw=none](x#1y#2) at (#1,#2){\sffamily\mdseries\renewcommand{\arraystretch}{0.5}\begin{tabular}[b]{@{}c@{}}#3\\[-0.4ex]\end{tabular}};%
\fi
\end{pgfonlayer}%
}
\def\@prereq#1,#2,#3,#4:{%
\setcounter{@dy}{#2-#4}
\ifnum\the@dy<10
\@straight#1,#2,#3,#4:
\else\ifnum#1=#3
\@straight#1,#2,#3,#4:
\else\ifnum#2=#4
\@straight#1,#2,#3,#4:
\else
\@prereqc#1,#2,#3,#4;\DefaultCurvature:
\fi\fi\fi
}
\def\@prereqc#1,#2,#3,#4;#5:{%
\ifnum#5=0
\@straight#1,#2,#3,#4:
\else
\@curved#1,#2,#3,#4;#5:
\fi
}
\def\@recomm#1,#2,#3,#4:{%
\setcounter{@dy}{#2-#4}
\ifnum\the@dy<10
\@straightDashed#1,#2,#3,#4:
\else\ifnum#1=#3
\@straightDashed#1,#2,#3,#4:
\else\ifnum#2=#4
\@straightDashed#1,#2,#3,#4:
\else
\@recommc#1,#2,#3,#4;\DefaultCurvature:
\fi\fi\fi
}
\def\@recommc#1,#2,#3,#4;#5:{%
\ifnum#5=0
\@straightDashed#1,#2,#3,#4:
\else
\@curvedDashed#1,#2,#3,#4;#5:
\fi
}
\def\@coreq#1,#2,#3,#4:{%
\setcounter{@dy}{#2-#4}
\ifnum\the@dy<10
\@straightDotted#1,#2,#3,#4:
\else\ifnum#1=#3
\@straightDotted#1,#2,#3,#4:
\else\ifnum#2=#4
\@straightDotted#1,#2,#3,#4:
\else
\@coreqc#1,#2,#3,#4;\DefaultCurvature:
\fi\fi\fi
}
\def\@coreqc#1,#2,#3,#4;#5:{%
\ifnum#5=0
\@straightDotted#1,#2,#3,#4:
\else
\@curvedDotted#1,#2,#3,#4;#5:
\fi
}
\def\@straight#1,#2,#3,#4:{%
\begin{pgfonlayer}{arrows}
\draw[draw=white,line width=1.5pt](x#1y#2) -- (x#3y#4) ;
\ifgridon
\draw[->,line width=\solidwidth](x#1y#2) -- node[anchor=mid] {\href{coord: #1,#2,#3,#4}{\textbullet}} (x#3y#4);
\else
\draw[->,line width=\solidwidth](x#1y#2) -- (x#3y#4) ;
\fi
\end{pgfonlayer}
}
\def\@curved#1,#2,#3,#4;#5:{
\setcounter{@dy}{#2-#4}
\ifnum#3<#1
\setcounter{@dx}{#1-#3}
\setcounter{@myangle}{(-#5) * \the@dx * \the@dy * 2}
\else
\setcounter{@dx}{#3-#1}
\setcounter{@myangle}{#5 * \the@dx * \the@dy * 2}
\fi
\setcounter{@myangle}{\the@myangle / ((\the@dx + \the@dy) * (\the@dx + \the@dy))}
\setcounter{@inangle}{180 - \the@myangle}
\begin{pgfonlayer}{arrows}
\draw[draw=white,line width=1.5pt](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] (x#3y#4) ;
\ifgridon
\draw[->,line width=\solidwidth](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] node[anchor=mid] {\href{coord: #1,#2,#3,#4}{\textbullet}} (x#3y#4) ;
\else
\draw[->,line width=\solidwidth](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] (x#3y#4) ;
\fi
\end{pgfonlayer}
}
\def\@straightDashed#1,#2,#3,#4:{%
\begin{pgfonlayer}{arrows}
\draw[draw=white,line width=1.5pt] (x#1y#2) -- (x#3y#4);
\ifgridon
\draw[->,dashed,line width=\dashedwidth] (x#1y#2) -- node[anchor=mid] {\href{coord: #1,#2,#3,#4}{\textbullet}} (x#3y#4) ;
\else
\draw[->,dashed,line width=\dashedwidth] (x#1y#2) -- (x#3y#4);
\fi
\end{pgfonlayer}
}
\def\@curvedDashed#1,#2,#3,#4;#5:{
\setcounter{@dy}{#2-#4}
\ifnum#3<#1
\setcounter{@dx}{#1-#3}
\setcounter{@myangle}{(-#5) * \the@dx * \the@dy * 2}
\else
\setcounter{@dx}{#3-#1}
\setcounter{@myangle}{#5 * \the@dx * \the@dy * 2}
\fi
\setcounter{@myangle}{\the@myangle / ((\the@dx + \the@dy) * (\the@dx + \the@dy))}
\setcounter{@inangle}{180 - \the@myangle}
\begin{pgfonlayer}{arrows}
\draw[draw=white,line width=1.5pt](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] (x#3y#4) ;
\ifgridon
\draw[->,dashed,line width=\dashedwidth](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] node[anchor=mid] {\href{coord: #1,#2,#3,#4}{\textbullet}} (x#3y#4);
\else
\draw[->,dashed,line width=\dashedwidth](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] (x#3y#4);
\fi
\end{pgfonlayer}
}
\def\@straightDotted#1,#2,#3,#4:{%
\begin{pgfonlayer}{arrows}
\draw[draw=white,line width=1.5pt] (x#1y#2) -- (x#3y#4);
\ifgridon
\draw[->,loosely dotted,line width=\dottedwidth] (x#1y#2) -- node[anchor=mid] {\href{coord: #1,#2,#3,#4}{\textbullet}} (x#3y#4) ;
\else
\draw[->,loosely dotted,line width=\dottedwidth] (x#1y#2) -- (x#3y#4);
\fi
\end{pgfonlayer}
}
\def\@curvedDotted#1,#2,#3,#4;#5:{
\setcounter{@dy}{#2-#4}
\ifnum#3<#1
\setcounter{@dx}{#1-#3}
\setcounter{@myangle}{(-#5) * \the@dx * \the@dy * 2}
\else
\setcounter{@dx}{#3-#1}
\setcounter{@myangle}{#5 * \the@dx * \the@dy * 2}
\fi
\setcounter{@myangle}{\the@myangle / ((\the@dx + \the@dy) * (\the@dx + \the@dy))}
\setcounter{@inangle}{180 - \the@myangle}
\begin{pgfonlayer}{arrows}
\draw[draw=white,line width=1.5pt](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] (x#3y#4) ;
\ifgridon
\draw[->,loosely dotted,line width=\dottedwidth](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] node[anchor=mid] {\href{coord: #1,#2,#3,#4}{\textbullet}} (x#3y#4) ;
\else
\draw[->,loosely dotted,line width=\dottedwidth](x#1y#2) to[out=\the@myangle,in=\the@inangle,relative] (x#3y#4) ;
\fi
\end{pgfonlayer}
}
\def\@grid{
\gridontrue
\renewcommand{\CourseURL}[3]{coord: ##1,##2} % "coord:" makes it look like a URI
\begin{pgfonlayer}{grid}
\draw[line width=0.3pt,draw=verylight] (0,0) grid [step=1] (\value{@gridright},\value{@gridtop});
\draw[line width=0.4pt,draw=somewhatlight] (0,0) grid [step=5] (\value{@gridright},\value{@gridtop});
\foreach \i in {0,10,...,\value{@gridright}}
\node at (\i,-4){\small \i};
\foreach \i in {0,10,...,\value{@gridtop}}
\node at (-5,\i){\small \i};
\foreach \i in {0,10,...,\value{@gridright}}
\node at (\i,\value{@gridtop}+4){\small \i};
\foreach \i in {0,10,...,\value{@gridtop}}
\node at (\value{@gridright}+5,\i){\small \i};
% anchors are to allow computation of coordinates from mouse clicks in kpdf/okular:
% latex/dvips requires non-null href box
\node at (-5,-4) {\href{anchor: -5,-4}{\kern1sp}};
\setcounter{@gridtop}{\value{@gridtop} + 4}
\setcounter{@gridright}{\value{@gridright} + 5}
\node at (\the@gridright,\the@gridtop) {\href{anchor: \the@gridright,\the@gridtop}{\kern1sp}};
\end{pgfonlayer}
}
%
%
% \begin{chart} ... \end{chart}
%
%
\newenvironment{chart}
{ \setcounter{@diagwidth}{10 + 1 * \ratio{\textwidth}{\unit}}
\ifpdf
\newwrite\@imapfile % image-map data
\newwrite\@scriptfile % shell script to crop PNG image
\newwrite\@linkfile % link data for SVG
\ifnum\value{chart}=0
\immediate\openout\@imapfile=\jobname.map
\immediate\write\@imapfile{