% stdpjmmacros.tex
% Favourite macros used by Peter McBrien (pjm@doc.ic.ac.uk)
% Not intended to be a proper LaTeX style file
%
\ProvidesPackage{stdpjmmacros}

\def\ifUndefinedCs#1{\expandafter\ifx\csname #1\endcsname\relax }

%\usepackage{ukdate} % must come before curves
\ifUndefinedCs{table}\else\usepackage{subfigure}\fi
\usepackage{soul}
\usepackage{colours}
\usepackage{xcolor} % table,dvipsnames
\usepackage{amssymb}
\usepackage{curves} % must come before epic/eepic
\usepackage{colortbl}
\usepackage{xml}
\usepackage{hdm}
\usepackage{graphicx}
\usepackage{pifont}
\usepackage{epic}
\usepackage{eepic}
%\usepackage{multicol}

%%%%%%%%%%%%%%%%%%%%%%%%% Fancy Characters %%%%%%%%%%%%%%%%%%%%%%%

% Dingbats
\def\tick{\Pisymbol{pzd}{"33}}
\def\cross{\Pisymbol{pzd}{"37}}
\def\chsp{\mbox{\unitlength=0.7em\begin{picture}(1,0.5)
\path(0.1,0.4)(0.1,0)(0.9,0)(0.9,0.4)
\end{picture}}}
\def\chnl{\mbox{\unitlength=0.7em\begin{picture}(1,1)
\path(0.9,0)(0.9,0.9)(0.7,0.9)
\put(0.9,0){\vector(-1,0){0.8}}
\end{picture}}}
\def\chgt{\mbox{\ensuremath{\rangle}}}
\def\chlt{\mbox{\ensuremath{\langle}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Produce a coloured cell in an array or tabular environment
% #1 colour of cell
% #2 text in cell
\def\colourcell#1#2{\multicolumn{1}{>{\columncolor{#1}}c}{#2}}


\def\inlineblock#1{\begin{minipage}{\textwidth}
\begin{tabbing}
#1
\end{tabbing}
\end{minipage}}

\ifUndefinedCs{chapter}
%\typeout{******************* No Chapter ************************}
%\newtheorem{stddefinitiontheorem}{Definition}[section]
\else
%\typeout{******************* CHAPTER ************************}
%\newtheorem{stddefinitiontheorem}{Definition}[section]
\fi

\ifUndefinedCs{chapter}\newtheorem{stddefinitiontheorem}{Definition}[section]\else%
\newtheorem{stddefinitiontheorem}{Definition}[chapter]\fi

\ifUndefinedCs{chapter}\newtheorem{stdexampletheorem}{Example}[section]\else%
\newtheorem{stdexampletheorem}{Example}[chapter]\fi

\newenvironment{shortitemize}{\begin{itemize}\setlength{\parskip}
{0ex}}{\end{itemize}}

\newenvironment{shortenumerate}{\begin{enumerate}\setlength{\parskip}
{0ex}}{\end{enumerate}}


\newenvironment{program}[2]{\begin{stdfigure}{#1}{#2}
}{\end{stdfigure}}

\newenvironment{codelist}{\begin{sf}\begin{tabbing} 
\setlength{\parindent}{0em}
\setlength{\parskip}{0ex}
XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= 
XX \= XX \=\kill}{\end{tabbing}\end{sf}}

\newenvironment{sql}{\begin{minipage}{\textwidth}\begin{sf}\begin{tabbing} 
\setlength{\parindent}{0em} 
\setlength{\parskip}{0ex}
SELECT \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \=\kill}{\end{tabbing}\end{sf}\end{minipage}}

\def\sqlsmallindent{XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= XX \= 
XX \= XX \=\kill}

\newenvironment{sqltransaction}{\begin{minipage}{\textwidth}\begin{sf}\begin{tabbing} 
\setlength{\parindent}{0em} 
\setlength{\parskip}{0ex}
\sqlsmallindent}{\end{tabbing}\end{sf}\end{minipage}}

\def\mcbrien{M$\stackrel{\mbox{c}}{\mbox{\rm.}}$Brien}
\def\mcbrienemail{mailto:pjm@dcs.kcl.ac.uk}
\def\mcbrienURL{http://www.dcs.kcl.ac.uk/staff/pjm}
\def\tempora{{\sc Tempora}}
\def\intuitive{{\sc Intuitive}}
\def\hod{{\sc Hod}}
\def\etc{{\em etc}}
\def\ie{{\em i.e.~}}
\def\eg{{\em e.g.~}}
\def\forwhich{\mathbin{.}}
\def\implies{{\ensuremath{\rightarrow} }}

\newcommand{\commentbox}[1]{\framebox{\em \begin{minipage}{0.98\textwidth}#1\end{minipage}}}

\def\tuple#1{\mbox{$\langle$}#1\mbox{$\rangle$}}
\def\set#1{\mbox{$\{$}#1\mbox{$\}$}}
%\def\keyname#1{\underline{\strut #1}}
\def\keyname#1{\setuldepth{a}\ul{#1}} % needs soul package
\def\keyword#1{\index{#1}\textbf{#1}}
\def\keywordabbr#1#2{{\index{#1}\textbf{#1} (\index{#2}\textbf{#2})}}
\def\indexkeyword#1#2{\index{#1}{\textbf{#2}}}
\def\indexkeywordabbr#1#2#3{\index{#1}\index{#2}\index{#3}{\textbf{#2}} (\textbf{#3})}
\def\stdpicmag#1{\stdx=#1
\advance\stdx 10
\ifcase\stdx%
\unitlength=0.16em
\or\unitlength=0.29em
\or\unitlength=0.32em
\or\unitlength=0.36em
\or\unitlength=0.40em
\or\unitlength=0.44em
\or\unitlength=0.49em
\or\unitlength=0.54em
\or\unitlength=0.6em
\or\unitlength=0.68em
\or\unitlength=0.75em
\or\unitlength=0.82em
\or\unitlength=0.90em
\or\unitlength=1em
\or\unitlength=1.1em
\or\unitlength=1.21em
\else\unitlength=0.75em\fi}
\def\stdpicsize{\unitlength=0.75em}
\unitlength=0.75em

\newenvironment{stdexample}[2]{\begin{minipage}{\textwidth}
\begin{stdexampletheorem}{\bf #1}%\\[0em]
\label{#2}\rm}{%\vspace{-3em}
\begin{flushright}$\Box$\end{flushright}\end{stdexampletheorem}
\end{minipage}}


\newenvironment{stddefinition}[2]{\pagebreak[1]
\begin{stddefinitiontheorem}{\bf #1}%\\[0em]
\label{#2}\rm}{\vspace{-1em}
\begin{flushright}$\Box$\end{flushright}\end{stddefinitiontheorem}}

\def\stdparskip{0.5em}

\newenvironment{stdfigure}[2]{\begin{figure}[htbp]
\begin{center}
\def\stdfigcap{#1}
\def\stdfiglab{#2}
\parskip=\stdparskip
}{\caption{\textrm{\stdfigcap}\label{\stdfiglab}}
\end{center}
\end{figure}}

\newenvironment{stdfigure*}[2]{\begin{figure*}[htbp]
\begin{center}
\def\stdfigcap{#1}
\def\stdfiglab{#2}
\parskip=\stdparskip
}{\caption{\textrm{\stdfigcap}\label{\stdfiglab}}
\end{center}
\end{figure*}}

\newenvironment{stdtable}[2]{\begin{table}[htb]
\begin{center}
\def\stdfigcap{#1}
\def\stdfiglab{#2}
\parskip=\stdparskip
}{\caption{\stdfigcap\label{\stdfiglab}}
\end{center}
\end{table}}



\newcount\stdr
\newcount\stds
\newcount\stdt
\newcount\stdu
\newcount\stdw
\newcount\stdv
\newcount\stdx
\newcount\stdy
\newcount\stdz

\newcount\userx
\newcount\usery


%%%%%%%%%%%%%%%%%%%%%%%%% Put a box %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%% PUT A COLOUR BOX ON A GRAPHICS AREA
%\def\putcolourbox(#1,#2)(#3,#4)#5#6{\setlength{\fboxsep}{0em}
%\put(#1,#2){\colorbox{#5}{\makebox(#3,#4){\shortstack{#6}}}}}

\def\putcolourbox{\futurelet\testchar\MaybeOptArgPCB}

\def\MaybeOptArgPCB{\ifx[\testchar \let\next\OptArgPCB
                \else \let\next\NoOptArgPCB \fi \next}

\def\NoOptArgPCB(#1,#2)(#3,#4)#5#6{\OptArgPCB[c,i](#1,#2)(#3,#4){#5}{#6}}

\def\OptArgPCB[#1,#2](#3,#4)(#5,#6)#7#8{%\putcolourframebox(#3,#4)(#5,#6){#7}{}
% A hack to make the box contain characters and hence work with dvips -E
%\put(#3,#4){\textcolor{#7}{\tiny.}}
%\put(#5,#6){\textcolor{#7}{\tiny.}}
\setlength{\fboxsep}{0em}
\put(#3,#4){\shade\color{#7}{\pjmdrawbox(#5,#6)}}
\put(#3,#4){\color{#7}{\pjmdrawbox(#5,#6)}}%
\ifx#2i%
\put(#3,#4){\makebox(#5,#6)[#1]{\shortstack{#8}}}\else%
\put(#3,#4){\makebox(#5,#6)[#1]{\makebox(0,0)[b]{\shortstack{#8}}}}\fi}

\def\putbox{\futurelet\testchar\MaybeOptArgPB}

\def\MaybeOptArgPB{\ifx[\testchar \let\next\OptArgPB
                \else \let\next\NoOptArgPB \fi \next}

\def\NoOptArgPB(#1,#2)(#3,#4)#5{\OptArgPB[c,i](#1,#2)(#3,#4){#5}}

\def\OptArgPB[#1,#2](#3,#4)(#5,#6)#7{\ifx#2i%
\put(#3,#4){\makebox(#5,#6)[#1]{\shortstack{#7}}}\else%
\put(#3,#4){\makebox(#5,#6)[#1]{\makebox(0,0)[b]{\shortstack{#7}}}}\fi}

\def\pjmdrawbox(#1,#2){\begin{picture}(#1,#2)
\path(0,0)(#1,0)(#1,#2)(0,#2)(0,0)
\end{picture}}

\def\putcolourellipse(#1,#2)#3#4#5#6{%
\put(#1,#2){\shade\color{#3}\ellipse{#4}{#5}}
\put(#1,#2){\color{#3}\ellipse{#4}{#5}}
\put(#1,#2){\makebox(0,0){#6}}}

\def\putcolourframeellipse(#1,#2)#3#4#5#6#7{%
\put(#1,#2){\shade\color{#3}\ellipse{#5}{#6}}
\put(#1,#2){\color{#4}\ellipse{#5}{#6}}
\put(#1,#2){\makebox(0,0){\shortstack{#7}}}}

\def\putcolourcircle(#1,#2)#3#4#5{\put(#1,#2){\shade\color{#3}\circle{#4}}
\put(#1,#2){\color{#3}\circle{#4}}
\put(#1,#2){\makebox(0,0){\shortstack{#5}}}}

%\def\putcolourframecircle(#1,#2)#3#4#5{\put(#1,#2){\shade\color{#3}\circle{#4}}
%\put(#1,#2){\makebox(0,0){\shortstack{#5}}}}

\def\putcolourframecircle(#1,#2)#3#4#5#6{%
\put(#1,#2){\shade\color{#3}\circle{#5}}
\put(#1,#2){\color{#4}\circle{#5}}
\put(#1,#2){\makebox(0,0){\shortstack{#6}}}}

%\def\putcolourframebox(#1,#2)(#3,#4)#5#6{\setlength{\fboxsep}{0em}
%\put(#1,#2){\shade\color{#5}{\pjmdrawbox(#3,#4)}}
%\putbox(#1,#2)(#3,#4){\shortstack{#6}}}

\def\putcolourframebox{\futurelet\testchar\MaybeOptArgPCFB}

\def\MaybeOptArgPCFB{\ifx[\testchar \let\next\OptArgPCFB
                \else \let\next\NoOptArgPCFB \fi \next}

\def\NoOptArgPCFB(#1,#2)(#3,#4)#5#6#7{\OptArgPCFB[c,i](#1,#2)(#3,#4){#5}{#6}{#7}}

\def\OptArgPCFB[#1,#2](#3,#4)(#5,#6)#7#8#9{%
\OptArgPCB[#1,#2](#3,#4)(#5,#6){#7}{#9}%
\put(#3,#4){\color{#8}{\pjmdrawbox(#5,#6)}}}

%\def\putbox(#1,#2)(#3,#4)#5{\put(#1,#2){\makebox(#3,#4){\shortstack{#5}}}}

\def\putdashbox(#1,#2)(#3,#4)#5{\put(#1,#2){\dashbox(#3,#4){\shortstack{#5}}}}

\def\putframebox(#1,#2)(#3,#4)#5{\stdx=#1%
\advance \stdx #3%
\stdy=#2%
\advance \stdy #4%
\path(#1,#2)(\stdx,#2)(\stdx,\stdy)(#1,\stdy)(#1,#2)%
\put(#1,#2){\makebox(#3,#4){\shortstack{#5}}}}

\def\lightgreycircle#1{{\lightgrey\shade\circle{#1}}}

\def\dashpath(#1,#2)(#3,#4){\dashline{0.4}(#1,#2)(#3,#4)}

\def\colourtape(#1,#2)#3#4#5{\put(#1,#2){\begin{picture}(4,3)
\putcolourbox(0,0)(4,3){#3}{}
\putcolourcircle(1,1.5){#4}{1}{}
\putcolourcircle(3,1.5){#4}{1.5}{}
\putbox(0,0)(4,3){#5}
\end{picture}}}

\def\tape(#1,#2)#3{\colourtape(#1,#2){midgrey}{middarkgrey}{#3}}


\def\database(#1,#2)#3{\stdx=#1
\stdy=#2
\advance \stdy -2
\putcolourellipse(\stdx,\stdy){midgrey}{4}{2}{}
\advance \stdx -2
\putcolourbox(\stdx,\stdy)(4,4){midgrey}{}
\advance \stdx 2
\advance \stdy 4
\putcolourellipse(\stdx,\stdy){darkmidgrey}{4}{2}{}
\advance \stdx -2
\advance \stdy -4
\putbox(\stdx,\stdy)(4,4){#3}}

\def\colourdatabase(#1,#2)#3#4#5{\stdx=#1
\stdy=#2
\advance \stdy -2
\putcolourellipse(\stdx,\stdy){#3}{4}{2}{}
\advance \stdx -2
\putcolourbox(\stdx,\stdy)(4,4){#3}{}
\advance \stdx 2
\advance \stdy 4
\putcolourellipse(\stdx,\stdy){#4}{4}{2}{}
\advance \stdx -2
\advance \stdy -4
\putbox(\stdx,\stdy)(4,4){\shortstack{#5}}}

%\color[gray]{0.85}
\def\outlinedatabase(#1,#2)#3{\stdx=#1
\stdy=#2
\put(#1,#2){\makebox(0,0){\shortstack{#3}}}
\advance \stdy -2
\put(\stdx,\stdy){\ellipse{4}{2}}
\advance \stdy 4
\put(\stdx,\stdy){\ellipse{4}{2}}
\advance \stdx -2
\multiput(\stdx,\stdy)(4,0){2}{\line(0,-1){4}}
}


\def\user(#1,#2){\stdx=#1
\stdy=#2
\stdz=#1
\advance\stdx 1
\advance\stdy 1
\advance\stdz 2
\path(#1,#2)(\stdx,\stdy)(\stdz,#2)
\stdw=\stdy
\advance\stdy 1
\path(\stdx,\stdy)(\stdx,\stdw)
\advance\stdw 2
\path(#1,\stdw)(\stdx,\stdy)(\stdz,\stdw)
\path(\stdx,\stdy)(\stdx,\stdw)
\put(\stdx,\stdw){\filltype{white}\circle*{1.0}}}

\def\labline(#1,#2)(#3,#4)#5#6{\stdx=#3%
\advance \stdx -#1%
\stdy=#4%
\advance \stdy -#2%
\path(#1,#2)(#3,#4)%
\ifnum#2=#4\put(#1,#2){\makebox(\stdx,0)[b]{\shortstack{#5\\~}}}%
\put(#1,#2){\makebox(\stdx,0)[t]{\shortstack{~\\{#6}}}}\else%
\ifnum#1=#3%
\stdx=#4%
\advance\stdx -#2%
\put(#1,#2){\makebox(0,\stdx)[r]{\shortstack{#5}~}}%
\put(#1,#2){\makebox(0,\stdx)[l]{~\shortstack{#6}}}\else%
\divide \stdy 2%
\divide \stdx 2%
\advance \stdx #1%
\advance \stdy #2%
%\ifnum#2=#4\else\fi
\put(\stdx,\stdy){\makebox(0,0)[r]{\shortstack{#5}~}}%
\put(\stdx,\stdy){\makebox(0,0)[l]{~\shortstack{#6}}}\fi\fi}

\def\labdashline(#1,#2)(#3,#4)#5#6{\stdx=#3%
\advance \stdx -#1%
\stdy=#4%
\advance \stdy -#2%
\dashline{1.1}(#1,#2)(#3,#4)%
\ifnum#2=#4\put(#1,#2){\makebox(\stdx,0)[b]{\shortstack{#5\\~}}}%
\put(#1,#2){\makebox(\stdx,0)[t]{\shortstack{~\\{#6}}}}\else%
\ifnum#1=#3%
\stdx=#4%
\advance\stdx -#2%
\put(#1,#2){\makebox(0,\stdx)[r]{\shortstack{#5}~}}%
\put(#1,#2){\makebox(0,\stdx)[l]{~\shortstack{#6}}}\else%
\divide \stdy 2%
\divide \stdx 2%
\advance \stdx #1%
\advance \stdy #2%
%\ifnum#2=#4\else\fi
\put(\stdx,\stdy){\makebox(0,0)[r]{\shortstack{#5}~}}%
\put(\stdx,\stdy){\makebox(0,0)[l]{~\shortstack{#6}}}\fi\fi}

\def\oldlabline(#1,#2)(#3,#4)#5#6{\stdx=#3
\advance \stdx -#1
\stdy=#4
\advance \stdy -#2
\path(#1,#2)(#3,#4)
\ifnum#2=#4\put(#1,#2){\makebox(\stdx,0)[b]{\shortstack{~#5~\\~}}}
\put(#1,#2){\makebox(\stdx,0)[t]{\shortstack{~\\~#6~}}}\else%
\divide \stdy 2
\divide \stdx 2
\advance \stdx #1
\advance \stdy #2
%\ifnum#2=#4\else\fi
\put(\stdx,\stdy){\makebox(0,0)[r]{\shortstack{#5}~}}
\put(\stdx,\stdy){\makebox(0,0)[l]{~\shortstack{#6}}}\fi}

\def\ifCommonFactor#1#2#3{\stdv=#1
\multiply \stdv \stdv
\stdw=#2
\multiply \stdw \stdw
\stdz=\stdw
\divide \stdw \stdv
\multiply \stdw \stdv
\advance \stdz -\stdw
\stdw=#3
\multiply \stdw \stdw
\advance \stdz \stdw
\divide \stdw \stdv
\multiply \stdw \stdv
\advance \stdz -\stdw
\ifnum\stdz=0 }

\def\labvector(#1,#2)(#3,#4)#5#6{\labline(#1,#2)(#3,#4){#5}{#6}%
\arrowhead(#1,#2)(#3,#4)}

\def\labbivector(#1,#2)(#3,#4)#5#6{\labline(#1,#2)(#3,#4){#5}{#6}%
\arrowhead(#1,#2)(#3,#4)\arrowhead(#3,#4)(#1,#2)}

\def\dashpathvector(#1,#2)(#3,#4){\dashpath(#1,#2)(#3,#4)%
\arrowhead(#1,#2)(#3,#4)}

\def\pathvector(#1,#2)(#3,#4){\path(#1,#2)(#3,#4)%
\arrowhead(#1,#2)(#3,#4)}

\def\pathbivector(#1,#2)(#3,#4){\path(#1,#2)(#3,#4)%
\arrowhead(#1,#2)(#3,#4)\arrowhead(#3,#4)(#1,#2)}

\def\arrowhead(#1,#2)(#3,#4){\stdx=#3%
\advance\stdx -#1%
\stdy=#4%
\advance\stdy -#2%
\ifCommonFactor{17}{\stdx}{\stdy} \divide \stdx 17
\divide \stdy 17 \fi%
\ifCommonFactor{13}{\stdx}{\stdy} \divide \stdx 13
\divide \stdy 13 \fi%
\ifCommonFactor{11}{\stdx}{\stdy} \divide \stdx 11
\divide \stdy 11 \fi%
\ifCommonFactor{7}{\stdx}{\stdy} \divide \stdx 7
\divide \stdy 7 \fi%
\ifCommonFactor{6}{\stdx}{\stdy} \divide \stdx 6
\divide \stdy 6 \fi%
\ifCommonFactor{5}{\stdx}{\stdy} \divide \stdx 5
\divide \stdy 5 \fi%
\ifCommonFactor{4}{\stdx}{\stdy} \divide \stdx 4
\divide \stdy 4 \fi%
\ifCommonFactor{3}{\stdx}{\stdy} \divide \stdx 3
\divide \stdy 3 \fi%
\ifCommonFactor{2}{\stdx}{\stdy} \divide \stdx 2
\divide \stdy 2 \fi%
\ifnum\stdx>4 \stdx=4 \fi
\ifnum\stdy>4 \stdy=4 \fi
\ifnum\stdx<-4 \stdx=-4 \fi
\ifnum\stdy<-4 \stdy=-4 \fi
\ifCommonFactor{2}{\stdx}{\stdy} \divide \stdx 2
\divide \stdy 2 \fi%
\ifCommonFactor{2}{\stdx}{\stdy} \divide \stdx 2
\divide \stdy 2 \fi%
\put(#3,#4){\vector(\stdx,\stdy){0}}}

% put at (#1,#2) at document icon with label #3 on top, text #4 inside, and
% coloured #5
\def\doc(#1,#2)#3#4#5{\stdx=#1
\advance\stdx 4
\stdy=#2
\advance\stdy 5
\stdv=#1
\advance\stdv 3
\stdw=#2
\advance\stdw 1
{\shade\color{#5}\path(#1,#2)(#1,\stdy)(\stdx,\stdy)(\stdx,\stdw)(\stdv,#2)(#1,#2)
\path(\stdx,\stdw)(\stdv,\stdw)(\stdv,#2)}
\put(#1,\stdy){\makebox(0,2)[l]{\sf #3}}
\put(#1,\stdw){~\makebox(0,4)[l]{\sf\shortstack[l]{#4}}}}

\newenvironment{graph}[4]{\stdx=#1
\advance\stdx 2
\stdy=#3
\advance\stdy 2
\begin{picture}(\stdx,\stdy)(-2,-2)
\graphaxis(0,0){#1}{#2}{#3}{#4}}{\end{picture}}

\def\graphaxis(#1,#2)#3#4#5#6{\put(#1,#2){\vector(1,0){#3}}
\stdx=#1
\advance \stdx #3
\stdy=#2
\advance \stdy -1
\put(\stdx,\stdy){\makebox(0,0)[t]{#4}}
\put(#1,#2){\vector(0,1){#5}}
\stdx=#1
\advance \stdx -1
\stdy=#2
\advance \stdy #5
\put(\stdx,\stdy){\makebox(0,0)[r]{\shortstack[r]{#6}}}}

\def\graphxlabel(#1,#2)#3{\put(#1,#2){\line(0,1){0.5}}
\put(#1,#2){\line(0,-1){0.5}}
\stdy=#2
\advance\stdy -1
\put(#1,\stdy){\makebox(0,0)[t]{\shortstack{#3}}}}

\def\graphylabel(#1,#2)#3{\put(#1,#2){\line(-1,0){0.5}}
\put(#1,#2){\line(-1,0){0.5}}
\stdx=#1
\advance\stdx -1
\put(\stdx,#2){\makebox(0,0)[r]{\shortstack[r]{#3}}}}

\def\graphpointtwo(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(2,2)
\shade\color{blue}{\path(0,0)(1,2)(2,0)(0,0)}
\end{picture}}}}
\def\graphpointthree(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(2,2)
\putcolourframecircle(1,1){red}{black}{2}{}
\end{picture}}}}
\def\graphpointone(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(2,2)
\shade\color{green}{\path(0,0)(0,2)(2,2)(2,0)(0,0)}
\end{picture}}}}
\def\graphpointfour(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(2,2)
\shade\color{yellow}{\path(0,1)(1,2)(2,1)(1,0)(0,1)}
\end{picture}}}}


\def\graphpointfiveplot[#1](#2,#3){\put(#2,#3){%
\makebox(0,0){\begin{picture}(0,0)
\shade\color{yellow}{\path(-#1,0)(0,#1)(#1,0)(0,-#1)(-#1,0)}
\end{picture}}}}

\def\graphpointtwo(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(1,1)
\shade\color{blue}{\path(0,0)(0.5,1)(1,0)(0,0)}
\end{picture}}}}
\def\graphpointthree(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(1,1)
\putcolourframecircle(0.5,0.5){red}{black}{1}{}
\end{picture}}}}
\def\graphpointone(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(1,1)
\shade\color{green}{\path(0,0)(0,1)(1,1)(1,0)(0,0)}
\end{picture}}}}
\def\graphpointfour(#1,#2){\put(#1,#2){\makebox(0,0){\begin{picture}(1,1)
\shade\color{yellow}{\path(0,0.5)(0.5,1)(1,0.5)(0.5,0)(0,0.5)}
\end{picture}}}}

\def\ns#1{\begin{picture}(1,1)
\put(0.5,0.5){\circle{1}}
\putbox(0,0)(1,1){#1}
\end{picture}}

\def\putlabelledcolourbox(#1,#2)(#3,#4)#5#6{\putcolourbox(#1,#2)(#3,#4){#5}{}
\stdy=#2
\advance\stdy -2
\putbox(#1,\stdy)(#3,2){#6}}

%%%%%%%%%%%%%%%%%%% Host and Channel Message Macros %%%%%%%%%%%%%%%%%%%%%%%

\def\hostwidth{14}
\def\channelwidth{4}
\def\messagedelay{2}
\def\channelheight{28}

\def\stdmessage(#1,#2,#3)#4#5{
% Place send message
\stdt=#1
\advance\stdt-1
\stdr=\hostwidth
\advance\stdr\channelwidth
\multiply\stdr\stdt
\putbox(\stdr,#3)(\hostwidth,0){#4}
% calculate delay
\stds=#3
\advance\stds-\messagedelay
% Go left, right or both?
\if r#2
\else
\stdt=\stdr
\advance\stdt-\channelwidth
\putbox(\stdt,\stds)(-\hostwidth,0){\shortstack{#5}}
\pathvector(\stdr,#3)(\stdt,\stds)
\fi
\if l#2
\else
\advance\stdr\hostwidth
\stdt=\stdr
\advance\stdt\channelwidth
\putbox(\stdt,\stds)(\hostwidth,0){\shortstack{#5}}
\pathvector(\stdr,#3)(\stdt,\stds)
\fi}

\def\lostmessage(#1,#2,#3)#4{
% Place send message
\stdt=#1
\advance\stdt-1
\stdr=\hostwidth
\advance\stdr\channelwidth
\multiply\stdr\stdt
\putbox(\stdr,#3)(\hostwidth,0){#4}
% calculate delay
\stds=#3
\advance\stds-\messagedelay
% Go left, right or both?
\if r#2
\else
\stdt=\stdr
\advance\stdt-\channelwidth
\dashpathvector(\stdr,#3)(\stdt,\stds)
\fi
\if l#2
\else
\advance\stdr\hostwidth
\stdt=\stdr
\advance\stdt\channelwidth
\dashpathvector(\stdr,#3)(\stdt,\stds)
\fi}

\def\hostcaption(#1)#2{\stdr=#1
\advance\stdr-1
\stds=\hostwidth
\advance\stds\channelwidth
\multiply\stdr\stds
\putcolourbox(\stdr,0)(\hostwidth,\channelheight){lightgrey}{}
\putbox(\stdr,\channelheight)(\hostwidth,2){#2}}

\def\hostcolourtext(#1,#2)#3#4{\stdr=#1
\advance\stdr-1
\stds=\hostwidth
\advance\stds\channelwidth
\multiply\stdr\stds
\stds=#2
\advance\stds-1
\putcolourbox(\stdr,\stds)(\hostwidth,2){#3}{#4}}

\def\hosttext(#1,#2)#3{\hostcolourtext(#1,#2){lightgrey}{#3}}

\def\channelcaption(#1)#2{\stdr=#1
\stds=\hostwidth
\advance\stds\channelwidth
\multiply\stdr\stds
\advance\stdr-\channelwidth
\putcolourbox(\stdr,0)(\channelwidth,\channelheight){midgrey}{}
\putbox(\stdr,\channelheight)(\channelwidth,2){#2}}

\newenvironment{hostchannel}[2]{\def\channelheight{#2}
\stdr=\hostwidth
\advance\stdr\channelwidth
\multiply\stdr#1
\advance\stdr-\channelwidth
\stds=\channelheight
\advance\stds2
\begin{picture}(\stdr,\stds)}{\end{picture}}

\def\verticaldogleg(#1,#2)(#3,#4){\stdw=#2%
\advance\stdw #4%
\divide\stdw 2%
\path(#1,#2)(#1,\stdw)(#3,\stdw)(#3,#4)}

\def\horizontaldogleg(#1,#2)(#3,#4){\stdw=#1
\advance\stdw #3
\divide\stdw 2
\path(#1,#2)(\stdw,#2)(\stdw,#4)(#3,#4)}

%%%%%%%%%%%%%%%%%%%%%%% Citation box in papers %%%%%%%%%%%%%%%%%%%%%%%%

\def\citedetailbox(#1,#2)#3{\begin{picture}(0,0)
\stdpicmag{0}
\put(#1,#2){\begin{minipage}{20em}
\tt
#3
\end{minipage}}
\end{picture}}

