% single-valued dependency, i.e., A -> B
\newcommand{\svd}[2]{\emph{#1} $\rightarrow$ \emph{#2}}

% multivalued dependency, i.e., A ->> B
\newcommand{\mvd}[2]{\emph{#1} $\twoheadrightarrow$ \emph{#2}}

% a representation, i.e., R(T,S); second form has a subscript as second argument
\newcommand{\Representation}[3]{\ensuremath{\mathfrak{#1}(#2,#3)}}
\newcommand{\RepresentationS}[4]{\ensuremath{\mathfrak{#1}_{#2}(#3,#4)}}
\newcommand{\Rep}[1]{\ensuremath{\mathfrak{#1}}}
\newcommand{\RepS}[2]{\ensuremath{\mathfrak{#1}_{#2}}}

% a description, i.e., D(V,T,S)
\newcommand{\Description}[4]{\ensuremath{#1(#2,#3,#4)}}
\newcommand{\rDescription}[5]{\ensuremath{#1(#2,\Representation{#3}{#4}{#5})}}
\newcommand{\rDescriptionS}[6]{\ensuremath{#1(#2,\RepresentationS{#3}{#4}{#5}{#6})}}
\newcommand{\shortDescription}[3]{\ensuremath{#1(#2,\mathfrak{#3})}}
\newcommand{\shortDescriptionS}[4]{\ensuremath{#1(#2,\mathfrak{#3}_{#4})}}

% a construct name
\newcommand{\domain}[1]{\textsc{#1}}

% elements D[e] and D[e:C]
\newcommand{\Element}[2]{\ensuremath{ #1 \left[ #2 \right] }}
\newcommand{\Elementt}[3]{\ensuremath{ #1 \left[ #2 : \domain{#3} \right] }}

% constructs R[C] and R[C:X]; lowercase ones don't have the calligraphic 'R' on front
\newcommand{\construct}[2]{\ensuremath{ #1 \left[ \domain{#2} \right] }}
\newcommand{\Construct}[2]{\ensuremath{ \mathfrak{#1} \left[ \domain{#2} \right] }}
\newcommand{\ConstructS}[3]{\ensuremath{ \mathfrak{#1}_{#2} \left[ \domain{#3} \right] }}
\newcommand{\constructt}[3]{\ensuremath{ #1 \left[ #2 : \domain{#3} \right] }}
\newcommand{\ConstructT}[3]{\ensuremath{ \mathfrak{#1} \left[ #2 : \domain{#3} \right] }}
\newcommand{\ConstructTS}[4]{\ensuremath{ \mathfrak{#1}_{#2} \left[ #3 : \domain{#4} \right] }}

% old notation

% constructs R[C] and R[C:X]; lowercase ones don't have the calligraphic 'R' on front
\newcommand{\oconstruct}[2]{\ensuremath{ #1 \left[ #2 \right] }}
\newcommand{\oConstruct}[2]{\ensuremath{ \mathfrak{#1} \left[ #2 \right] }}
\newcommand{\oconstructt}[3]{\ensuremath{ #1 \left[ #2 : \domain{#3} \right] }}
\newcommand{\oConstructT}[3]{\ensuremath{ \mathfrak{#1} \left[ #2 : \domain{#3} \right] }}
\newcommand{\oconstructx}[4]%
	{\ensuremath{ #1 \left[ #2 : \domain{#3} \mid \left\{ #4 \right\} \right] }}
\newcommand{\oConstructX}[4]%
	{\ensuremath{ \mathfrak{#1} \left[ #2 : \domain{#3} \mid \left\{ #4 \right\} \right] }}
\newcommand{\obigconstructx}[4]%
	{\ensuremath{	#1 \left[
					\begin{array}{l}
						#2 : \domain{#3} \mid \\
						\left\{ #4 \right\}
					\end{array}
	              	\right]
				}
	}
\newcommand{\oBigConstructX}[4]%
	{\ensuremath{	\mathfrak{#1} \left[
					\begin{array}{l}
						#2 : \domain{#3} \mid \\
						\left\{ #4 \right\}
					\end{array}
					\right]
				}
	}

% translation operators

% overlay two math operators, thanks to Donald Arseneau
\newcommand\mathoverlay[3]{%   symbol, style, other symbol
  \ooalign{\hfil$#2#1$\hfil\cr\hfil$#2#3$\hfil\cr}}

\newcommand\crossrightarrow{\mathrel{% I forgot this at first
  \mathpalette{\mathoverlay\rightarrow}{\raisebox{.5pt}{$\shortmid$}}%
  }}
 
\newcommand\crossleftarrow{\mathrel{%
  \mathpalette{\mathoverlay\leftarrow}{\raisebox{.5pt}{$\shortmid$}}%
  }}
 
\newcommand\crossleftrightarrow{\mathrel{%
  \mathpalette{\mathoverlay\leftrightarrow}{\raisebox{.5pt}{$\shortmid$}}%
  }}
 
\newcommand\crossrightharpoonup{\mathrel{%
  \mathpalette{\mathoverlay\rightharpoonup}{\raisebox{.5pt}{$\shortmid$}}%
  }}
 
\newcommand\crossleftharpoondown{\mathrel{%
  \mathpalette{\mathoverlay\leftharpoondown}{\raisebox{.5pt}{$\shortmid$}}%
  }}
 
\newcommand\crossrightleftharpoons{\mathrel{%
  \mathpalette{\mathoverlay\rightleftharpoons}{\raisebox{.5pt}{$\shortmid$}}%
  }}

\newcommand{\TransRight}{\ensuremath{\rightarrow}}
\newcommand{\TransRightC}{\ensuremath{\overset{\circ}{\rightarrow}}}
\newcommand{\TransRightH}{\ensuremath{\crossrightarrow}}
\newcommand{\TransRightCH}{\ensuremath{\overset{\circ}{\TransRightH}}}

\newcommand{\TransLeft}{\ensuremath{\leftarrow}}
\newcommand{\TransLeftC}{\ensuremath{\overset{\circ}{\leftarrow}}}
\newcommand{\TransLeftH}{\ensuremath{\crossleftarrow}}
\newcommand{\TransLeftCH}{\ensuremath{\overset{\circ}{\TransLeftH}}}

\newcommand{\TransLeftRight}{\ensuremath{\leftrightarrow}}
\newcommand{\TransLeftRightC}{\ensuremath{\overset{\circ}{\leftrightarrow}}}
\newcommand{\TransLeftRightH}{\ensuremath{\crossleftrightarrow}}
\newcommand{\TransLeftRightCH}{\ensuremath{\overset{\circ}{\TransLeftRightH}}}

\newcommand{\PTransRight}{\ensuremath{\rightharpoonup}}
\newcommand{\PTransRightC}{\ensuremath{\overset{\circ}{\rightharpoonup}}}
\newcommand{\PTransRightH}{\ensuremath{\crossrightharpoonup}}
\newcommand{\PTransRightCH}{\ensuremath{\overset{\circ}{\PTransRightH}}}

\newcommand{\PTransLeft}{\ensuremath{\leftharpoondown}}
\newcommand{\PTransLeftC}{\ensuremath{\overset{\circ}{\leftharpoondown}}}
\newcommand{\PTransLeftH}{\ensuremath{\crossleftharpoondown}}
\newcommand{\PTransLeftCH}{\ensuremath{\overset{\circ}{\PTransLeftH}}}

\newcommand{\PTransLeftRight}{\ensuremath{\rightleftharpoons}}
\newcommand{\PTransLeftRightC}{\ensuremath{\overset{\circ}{\rightleftharpoons}}}
\newcommand{\PTransLeftRightH}{\ensuremath{\crossrightleftharpoons}}
\newcommand{\PTransLeftRightCH}{\ensuremath{\overset{\circ}{\PTransLeftRightH}}}

% \newcommand{\CTransRight}{\ensuremath{\rightrightarrows}}
% \newcommand{\CTransRightC}{\ensuremath{\overset{\circ}{\rightrightarrows}}}
% \newcommand{\CTransRightH}{\ensuremath{\overset{\ast}{\rightrightarrows}}}
% \newcommand{\CTransRightCH}{\ensuremath{\overset{\circledast}{\rightrightarrows}}}
% 
% \newcommand{\CTransLeft}{\ensuremath{\leftleftarrows}}
% \newcommand{\CTransLeftC}{\ensuremath{\overset{\circ}{\leftleftarrows}}}
% \newcommand{\CTransLeftH}{\ensuremath{\overset{\ast}{\leftleftarrows}}}
% \newcommand{\CTransLeftCH}{\ensuremath{\overset{\circledast}{\leftleftarrows}}}
% 
% \newcommand{\CTransLeftRight}{\ensuremath{\rightleftarrows}}
% \newcommand{\CTransLeftRightC}{\ensuremath{\overset{\circ}{\rightleftarrows}}}
% \newcommand{\CTransLeftRightH}{\ensuremath{\overset{\ast}{\rightleftarrows}}}
% \newcommand{\CTransLeftRightCH}{\ensuremath{\overset{\circledast}{\rightleftarrows}}}

\newcommand{\HTransRight}{\ensuremath{\dashrightarrow}}
\newcommand{\HTransRightC}{\ensuremath{\overset{\circ}{\dashrightarrow}}}
\newcommand{\HTransLeft}{\ensuremath{\dashleftarrow}}
\newcommand{\HTransLeftC}{\ensuremath{\overset{\circ}{\dashleftarrow}}}
% \newcommand{\HTransLeftRight}{\ensuremath{\dashleftrightarrow}}
% \newcommand{\HTransLeftRightS}{\ensuremath{\overset{\ast}{\dashleftrightarrow}}}

% description translations
\newcommand{\Translation}[2]{\ensuremath{#1 \TransRight #2}}
\newcommand{\TranslationC}[2]{\ensuremath{#1 \TransRightC #2}}
\newcommand{\TranslationH}[2]{\ensuremath{#1 \TransRightH #2}}
\newcommand{\TranslationCH}[2]{\ensuremath{#1 \TransRightCH #2}}

\newcommand{\LTranslation}[2]{\ensuremath{#1 \TransLeft #2}}
\newcommand{\LTranslationC}[2]{\ensuremath{#1 \TransLeftC #2}}
\newcommand{\LTranslationH}[2]{\ensuremath{#1 \TransLeftH #2}}
\newcommand{\LTranslationCH}[2]{\ensuremath{#1 \TransLeftCH #2}}

\newcommand{\LRTranslation}[2]{\ensuremath{#1 \TransLeftRight #2}}
\newcommand{\LRTranslationC}[2]{\ensuremath{#1 \TransLeftRightC #2}}
\newcommand{\LRTranslationH}[2]{\ensuremath{#1 \TransLeftRightH #2}}
\newcommand{\LRTranslationCH}[2]{\ensuremath{#1 \TransLeftRightCH #2}}

\newcommand{\Partial}[2]{\ensuremath{#1 \PTransRight #2}}
\newcommand{\PartialC}[2]{\ensuremath{#1 \PTransRightC #2}}
\newcommand{\PartialH}[2]{\ensuremath{#1 \PTransRightH #2}}
\newcommand{\PartialCH}[2]{\ensuremath{#1 \PTransRightCH #2}}

\newcommand{\LPartial}[2]{\ensuremath{#1 \PTransLeft #2}}
\newcommand{\LPartialC}[2]{\ensuremath{#1 \PTransLeftC #2}}
\newcommand{\LPartialH}[2]{\ensuremath{#1 \PTransLeftH #2}}
\newcommand{\LPartialCH}[2]{\ensuremath{#1 \PTransLeftCH #2}}

\newcommand{\LRPartial}[2]{\ensuremath{#1 \PTransLeftRight #2}}
\newcommand{\LRPartialC}[2]{\ensuremath{#1 \PTransLeftRightC #2}}
\newcommand{\LRPartialH}[2]{\ensuremath{#1 \PTransLeftRightH #2}}
\newcommand{\LRPartialCH}[2]{\ensuremath{#1 \PTransLeftRightCH #2}}

% \newcommand{\Complete}[2]{\ensuremath{#1 \CTransRight #2}}
% \newcommand{\CompleteC}[2]{\ensuremath{#1 \CTransRightC #2}}
% \newcommand{\CompleteS}[2]{\ensuremath{#1 \CTransRightS #2}}
% \newcommand{\CompleteCS}[2]{\ensuremath{#1 \CTransRightCS #2}}
% 
% \newcommand{\LComplete}[2]{\ensuremath{#1 \CTransLeft #2}}
% \newcommand{\LCompleteC}[2]{\ensuremath{#1 \CTransLeftC #2}}
% \newcommand{\LCompleteS}[2]{\ensuremath{#1 \CTransLeftS #2}}
% \newcommand{\LCompleteCS}[2]{\ensuremath{#1 \CTransLeftCS #2}}
% 
% \newcommand{\LRComplete}[2]{\ensuremath{#1 \CTransLeftRight #2}}
% \newcommand{\LRCompleteC}[2]{\ensuremath{#1 \CTransLeftRightC #2}}
% \newcommand{\LRCompleteS}[2]{\ensuremath{#1 \CTransLeftRightS #2}}
% \newcommand{\LRCompleteCS}[2]{\ensuremath{#1 \CTransLeftRightCS #2}}

% construct translations
\newcommand{\CTranslation}[2]{\ensuremath{\Translation{#1}{#2}}}
\newcommand{\CTranslationC}[2]{\ensuremath{\TranslationC{#1}{#2}}}
\newcommand{\CTranslationH}[2]{\ensuremath{\TranslationH{#1}{#2}}}
\newcommand{\CTranslationCH}[2]{\ensuremath{\TranslationCH{#1}{#2}}}

\newcommand{\LCTranslation}[2]{\ensuremath{\LTranslation{#1}{#2}}}
\newcommand{\LCTranslationC}[2]{\ensuremath{\LTranslationC{#1}{#2}}}
\newcommand{\LCTranslationH}[2]{\ensuremath{\LTranslationH{#1}{#2}}}
\newcommand{\LCTranslationCH}[2]{\ensuremath{\LTranslationCH{#1}{#2}}}

\newcommand{\LRCTranslation}[2]{\ensuremath{\LRTranslation{#1}{#2}}}
\newcommand{\LRCTranslationC}[2]{\ensuremath{\LRTranslationC{#1}{#2}}}
\newcommand{\LRCTranslationH}[2]{\ensuremath{\LRTranslationH{#1}{#2}}}
\newcommand{\LRCTranslationCH}[2]{\ensuremath{\LRTranslationCH{#1}{#2}}}

\newcommand{\HTranslation}[2]{\ensuremath{#1 \HTransRight #2}}
\newcommand{\HTranslationS}[2]{\ensuremath{#1 \HTransRightS #2}}

\newcommand{\LHTranslation}[2]{\ensuremath{#1 \HTransLeft #2}}
\newcommand{\LHTranslationS}[2]{\ensuremath{#1 \HTransLeftS #2}}

% refinement
\newcommand{\RefineRight}{\ensuremath{\mapsto}}

% component of
\newcommand{\Cpt}{\ensuremath{\in}}

% dominates
\newcommand{\Dominates}[2]{\ensuremath{#2 \preceq #1}}
\newcommand{\Equivalent}[2]{\ensuremath{#1 \equiv #2}}

% a chunk of SQL code, or an SQL keyword
\newcommand{\sql}[1]{\texttt{#1}}

% a Java class name
\newcommand{\jclass}[1]{\textsf{#1}}

% a PostgreSQL class name
\newcommand{\pclass}[1]{\textsf{#1}}

% blank figure
\newcommand{\blankfigure}[1][5cm]%
	{\centering \framebox[#1][c]{\rule[-2cm]{0cm}{4cm}Figure to go here soon.}}

% commands to set up rule and heuristic numbering
% \newcommand{\enumrulest}{	\renewcommand{\theenumi}{T\arabic{enumi}}
% 							\renewcommand{\labelenumi}{\textbf{\theenumi}}
% 						}
% \newcommand{\enumruless}{\renewcommand{\theenumi}{S\arabic{enumi}}
% 							\renewcommand{\labelenumi}{\textbf{\theenumi}}
% 						}
% \newcommand{\enumheuristics}{\renewcommand{\theenumi}{H\arabic{enumi}}
% 							\renewcommand{\labelenumi}{\textbf{\theenumi}}
% 						}
% \newcommand{\enumnormal}{\renewcommand{\theenumi}{\arabic{enumi}}
% 							\renewcommand{\labelenumi}{\theenumi.}
% 						}
% 
% \newcommand{\eqnrulest}{\renewcommand{\theequation}{T\arabic{equation}}
% 						\setcounter{equation}{0}}
% \newcommand{\eqnruless}{\renewcommand{\theequation}{S\arabic{equation}}
% 						\setcounter{equation}{0}}
% \newcommand{\eqnheuristics}{\renewcommand{\theequation}{H\arabic{equation}}
% 							\setcounter{equation}{0}}
\newcommand{\eqnnormal}{\renewcommand{\theequation}{\thechapter.\arabic{equation}}
						\setcounter{equation}{0}}

% table column types for maths
% \newcolumntype{X}{>{\tiny}l<{\normalsize}}
% \newcolumntype{Y}{>{\tiny}c<{\normalsize}}
% \newcolumntype{Z}{>{\tiny}r<{\normalsize}}
% \newcolumntype{L}{>{$}l<{$}}
% \newcolumntype{C}{>{$}c<{$}}
% \newcolumntype{R}{>{$}r<{$}}
% \newcolumntype{P}{>{\PBS\raggedright\hspace{0pt}}p{6cm}}
% \newcolumntype{Q}{>{\PBS\raggedright\hspace{0pt}}p{4cm}}
% \newcolumntype{F}{>{\PBS\raggedright\hspace{0pt}}p{5cm}}
% \newcolumntype{W}{p{0.97\columnwidth}}

% fixes for raggedright table columns
% \newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}

% table notes
\newcommand{\tabnote}[1]{\textrm{\textsuperscript{#1}}}
\newcommand{\tablenote}[3]{\multicolumn{#1}{p{0.97\columnwidth}}{\tabnote{#2} #3}}
\newcommand{\tablenotehead}[2]{\multicolumn{#1}{p{0.97\columnwidth}}{\textbf{#2}}}
\newcounter{tnote}
\renewcommand{\thetnote}{\alph{tnote}}
\newenvironment{tabnotes}[1]%
	{	\vspace{\baselineskip}
		\begin{minipage}{0.95\columnwidth}
			\textbf{#1}
			\begin{list}{\thetnote}%
			{	\setlength{\topsep}{0pt}
				\setlength{\itemsep}{0pt}
				\setlength{\parsep}{0pt}
				\usecounter{tnote}
				\renewcommand{\makelabel}[1]{\hfil{\textsuperscript{##1}}}
			}
	}%
	{		\end{list}
		\end{minipage}
	}

% set width of longtable captions to 80% of columnwidth
% \setlength{\LTcapwidth}{0.8\columnwidth}

% change line spacing for something that looks best in single-spacing
\newcommand{\SingleSpace}{\renewcommand{\baselinestretch}{1.1} \normalsize}
\newcommand{\OneHalfSpace}{\renewcommand{\baselinestretch}{1.5} \normalsize}

% misc stuff
\newcommand{\ER}{\mathit{E\textrm{-}R}}
\newcommand{\Martin}{\mathit{ERD_{Martin}}}
\newcommand{\Chen}{\mathit{ERD_{Chen}}}
\newcommand{\MartinA}{\mathit{ERD_{Martin-A}}}
\newcommand{\FD}{\mathit{FuncDep}}
\newcommand{\Smith}{\mathit{FDD_{Smith}}}
% \newcommand{\SmithS}{\mathit{FDD_{S/S}}}
\newcommand{\SmithS}{\mathit{FDD_{Smith}}}
\newcommand{\RM}{\mathit{Relational}}
\newcommand{\SQL}{\mathit{SQL/92}}
\newcommand{\DF}{\mathit{DataFlow}}
\newcommand{\Gane}{\mathit{DFD_{G\&S}}}
% \setlength{\multlinegap}{0pt}
\newcommand{\UsedCars}{V_{\mathit{cars}}}
\newcommand{\OINK}{V_{\mathit{agri}}}
\newcommand{\Marks}{V_{\mathit{marks}}}

% OzTeX logo
% \input oztex

% stuff for meta-models
% \newcommand{\extends}{\textbf{specialises}}
% \newcommand{\onecolmodel}[2]%
% 	{	\begin{tabular}{l}
% 			\begin{minipage}{#1}
% 				\sffamily
% 				\input{#2}
% 			\end{minipage}	\\
% 		\end{tabular}
% 	}
% \newcommand{\twocolmodel}[1]%
% 	{	\begin{tabular}{l}
% 			\begin{minipage}{0.9\columnwidth}
% 				\setlength{\columnseprule}{0.4pt}
% 				\begin{multicols}{2}
% 					\sffamily
% 					\input{#1}
% 				\end{multicols}
% 				\setlength{\columnseprule}{0pt}
% 			\end{minipage}	\\
% 		\end{tabular}
% 	}

% SIG notation
% \newcommand{\Sedge}[1]{\ensuremath{\sigma_{\textrm{#1}}}}
% \newcommand{\SedgeP}[1]{\ensuremath{\sigma_{\textrm{#1}}^{'}}}
% \newcommand{\Total}%
% 	{	\setlength{\unitlength}{0.25mm}
% 		\thinlines
% 		\begin{picture}(22,14)
% 			\put(3,4){\line(1,0){16}}
% 			\put(7,-3){\line(0,1){14}}
% 		\end{picture}
% 	}
% \newcommand{\Surjective}%
% 	{	\setlength{\unitlength}{0.25mm}
% 		\thinlines
% 		\begin{picture}(22,14)
% 			\put(3,4){\line(1,0){16}}
% 			\put(15,-3){\line(0,1){14}}
% 		\end{picture}
% 	}

% a chunk of VML code
% \newenvironment{vmlcode}[1][\tiny]%
% 	{\renewcommand{\baselinestretch}{1.1} #1}%
% 	{\renewcommand{\baselinestretch}{1.5} \normalsize \vspace{-\baselineskip}}
% % \newenvironment{vmlcode}[1][]%
% % 	{\renewcommand{\verbatimtabsize}{2}
% % 	 \renewcommand{\baselinestretch}{1.1} #1 \obeylines\@verbatimtab}%
% % 	{\endtrivlist
% % 	 \renewcommand{\verbatimtabsize}{8}
% % 	 \renewcommand{\baselinestretch}{1.5} \normalsize}

% a translation equation
% \newenvironment{translation}[1][]%
% 	{\edef\basetemp{\the\baselineskip}#1\baselineskip\basetemp \begin{displaymath}}%
% 	{\end{displaymath}}
% \catcode`*=11
% \newenvironment{translationml}[1][]%
% 	{\edef\basetemp{\the\baselineskip}#1\baselineskip\basetemp \multline*}%
% 	{\endmultline*}
% \catcode`*=12
% 
\newenvironment{ERD}%
	{	\thinlines
		\setlength{\unitlength}{1mm}
		\begin{picture}(16,38)
	}%
	{\end{picture}}

\newcommand{\srcdst}%
	{	\begin{picture}(16,38)
			\put(0,0){\makebox(16,10)[r]{\footnotesize \emph{Destination}}}
			\put(0,28){\makebox(16,10)[r]{\footnotesize \emph{Source}}}
		\end{picture}
	}

\newcommand{\baseERD}%
	{	\put(0,28){\framebox(16,10){}}
		\put(8,10){\line(0,1){18}}
		\put(0,0){\framebox(16,10){}}
	}

\newcommand{\tmany}{\drawline(6,28)(8,24)(10,28)}
\newcommand{\bmany}{\drawline(6,10)(8,14)(10,10)}

\newcommand{\toone}{\put(7,26){\line(1,0){2}} \put(8,24){\circle{2}}}
\newcommand{\boone}{\put(7,12){\line(1,0){2}} \put(8,14){\circle{2}}}
\newcommand{\tmone}{\multiput(7,26)(0,-1){2}{\line(2,0){2}}}
\newcommand{\bmone}{\multiput(7,12)(0,-1){2}{\line(2,0){2}}}
\newcommand{\tomany}{\tmany \put(8,22){\circle{2}}}
\newcommand{\bomany}{\bmany \put(8,16){\circle{2}}}
\newcommand{\tmmany}{\tmany \put(7,23){\line(1,0){2}}}
\newcommand{\bmmany}{\bmany \put(7,15){\line(1,0){2}}}

\newcommand{\tannotate}[2][]{\put(0,28){\makebox(16,10)[#1]{\scriptsize \textsf{#2}}}}
\newcommand{\bannotate}[2][]{\put(0,0){\makebox(16,10)[#1]{\scriptsize \textsf{#2}}}}
\newcommand{\rannotate}[1]{\put(9,19){\makebox(0,0)[l]{\scriptsize \textsf{#1}}}}

\newcommand{\tfk}{\tannotate[l]{FK} \put(2,31){\vector(0,-1){8}}}
\newcommand{\tu}{\tannotate{U}}
\newcommand{\tnn}{\tannotate[r]{NN}}
\newcommand{\bfk}{\bannotate[l]{FK} \put(2,7){\vector(0,1){8}}}
\newcommand{\bu}{\bannotate{U}}
\newcommand{\bnn}{\bannotate[r]{NN}}

% showgrid macro from LGC, p. 142
% \newpsobject{showgrid}{psgrid}{subgriddiv=1,griddots=10,gridlabels=6pt}

% redefine label for listing environment to be scriptsize tt
% \renewcommand{\listinglabel}[1]{\llap{\scriptsize\ttfamily\the#1}\hskip\listingoffset\relax}

% a few lengths to use in \multirow commands
\newlength{\mra}
\newlength{\mrb}
\newlength{\mrc}
\newlength{\mrd}
\newlength{\mre}
\newlength{\mrf}

% commands for cross-references in glossary
% \newcommand{\see}[1]{(See \emph{#1}.)}
% \newcommand{\seealso}[1]{(See also \emph{#1}.)}

% humongous `}'s for use in tables
\newlength{\BIGlen}
\newcommand{\BIGL}[2][0cm]{
	\setlength{\BIGlen}{#1} \divide\BIGlen by 2
	$\left\}\text{ \rule[-\BIGlen]{0cm}{#1}#2}\right.$}
\newcommand{\BIGR}[2][0cm]{
	\setlength{\BIGlen}{#1} \divide\BIGlen by 2
	$\left.\text{\rule[-\BIGlen]{0cm}{#1}#2 }\right\{$}
% from LaTeX Graphics Companion, p. 49
% #1 x coordinate of reference point of brace in pt
% #2 y coordinate of reference point of brace in pt
% #3 rotation angle for large brace in degrees
% #4 half total height of brace in mm
\newcommand{\Bpara}[4]{
	\begin{picture}(0,0)%
		\setlength{\unitlength}{1pt}%
		\put(#1,#2){\rotatebox{#3}{\raisebox{0mm}[0mm][0mm]{%
			\makebox[0mm]{$\left.\rule{0mm}{#4mm}\right\}$}}}}%
	\end{picture}%
	}

% signature operators
% \newcommand{\Sig}{\ensuremath{\operatorname{sig}}}
% \newcommand{\SigU}[2]{\ensuremath{\Sig_{#2}(#1)}}
% \newcommand{\SigF}[1]{\ensuremath{\overset{\rightarrow}{\Sig}(#1)}}
% \newcommand{\SigR}[1]{\ensuremath{\overset{\leftarrow}{\Sig}(#1)}}

% BNF commands
% \renewcommand{\Production}{\mathrel{::=}}

% VMLS operators
% \newcommand{\Vright}{\texttt{=>>}}
% \newcommand{\Vleft}{\texttt{<<=}}
% \newcommand{\Vleftright}{\texttt{<=>}}

% subsumes and restricts operators
% \newcommand{\Subsumes}{\ensuremath{\overset{\varsigma}{\rightarrow}}}
\newcommand{\Subsumes}{\rightarrow}
\newcommand{\Restricts}{\ensuremath{\overset{\rho}{\rightarrow}}}

% a list of constructs
% \newenvironment{constructlist}%
% 	{	\begin{list}{}%
% 		{	\renewcommand{\makelabel}[1]{\hspace{0.5\leftmargin}\hfil{\domain{##1}}}
% 		}
% 	}%
% 	{	\end{list}
% 	}

% misc notation stuff for appendices
% ERDs
% \newcommand{\RegularEntity}%
% 	{	\begin{pspicture}(1.5,0.8)
% 			\psframe(0,0)(1.5,0.8)
% 		\end{pspicture}
% 	}
% \newcommand{\WeakEntity}%
% 	{	\begin{pspicture}(1.5,0.8)
% 			\psframe[doubleline=true](0,0)(1.5,0.8)
% 		\end{pspicture}
% 	}
% \newcommand{\AssociativeEntity}%
% 	{	\begin{pspicture}(1.5,0.8)
% 			\psframe(0,0)(1.5,0.8)
% 			\psline(0,0.4)(0.75,0)(1.5,0.4)(0.75,0.8)(0,0.4)
% 		\end{pspicture}
% 	}
% 
% \newcommand{\lmone}{\psline(0.1,0.25)(0.1,0) \psline(0.2,0.25)(0.2,0)}
% \newcommand{\roone}{\psline(1.4,0.25)(1.4,0) \pscircle(1.175,0.125){0.125}}
% \newcommand{\rmone}{\psline(1.4,0.25)(1.4,0) \psline(1.3,0.25)(1.3,0)}
% \newcommand{\rmany}{\psline(1.5,0.25)(1.25,0.125)(1.5,0)}
% \newcommand{\romany}{\psline(1.5,0.25)(1.25,0.125)(1.5,0) \pscircle(1.025,0.125){0.125}}
% \newcommand{\rmmany}{\psline(1.5,0.25)(1.25,0.125)(1.5,0) \psline(1.15,0.25)(1.15,0)}
% 
% \newcommand{\Relationship}[2]% left, right
% 	{	\begin{pspicture}(1.5,0.25)
% 			\psline(0,0.125)(1.5,0.125) #1 #2
% 		\end{pspicture}
% 	}
% \newcommand{\SubtypeParent}%
% 	{	\begin{pspicture}(1.5,0.4)
% 			\psline(0,0.2)(1.5,0.2)
% 			\psline(0.75,0.4)(0.75,0)
% 		\end{pspicture}
% 	}
% \newcommand{\SubtypeChild}%
% 	{	\begin{pspicture}(1.5,0.25)
% 			\psline(0,0.125)(1.5,0.125)
% 		\end{pspicture}
% 	}
% 
% % DFDs
% \newcommand{\ExternalEntity}[1][\psline(0.75,0)(1,0.25)]%
% 	{	\begin{pspicture}(1,1)
% 			\psframe(0,0.1)(0.9,1)
% 			\psframe[fillcolor=white,fillstyle=solid](0.1,0)(1,0.9)
% 			\rput(0.2,0.8){\tiny\textsf{a}}
% 			#1
% 		\end{pspicture}
% 	}
% \newcommand{\DataStore}[1][\psline(0.1,0)(0.1,0.8)]%
% 	{	\begin{pspicture}(1.5,0.8)
% 			\psline(1.5,0.8)(0,0.8)(0,0)(1.5,0)
% 			\psline(0.4,0)(0.4,0.8)
% 			\rput(0.2,0.4){\tiny\textsf{Dn}}
% 			#1
% 		\end{pspicture}
% 	}
% \newcommand{\RsrcStore}%
% 	{	\begin{pspicture}(1.5,0.8)
% 			\psframe(0,0)(1.5,0.8)
% 		\end{pspicture}
% 	}
% \newcommand{\Process}%
% 	{	\begin{pspicture}(1,1)
% 			\psframe[framearc=0.1](0,0)(1,1)
% 			\psline(0,0.75)(1,0.75)
% 			\rput(0.5,0.875){\tiny\textsf{Pn}}
% 		\end{pspicture}
% 	}
% \newcommand{\MultiProcess}%
% 	{	\begin{pspicture}(1,1)
% 			\psframe[framearc=0.1,doubleline=true](0,0)(1,1)
% 			\psline(0,0.75)(1,0.75)
% 			\rput(0.5,0.875){\tiny\textsf{Pn}}
% 		\end{pspicture}
% 	}
% 
% \newcommand{\DataFlow}%
% 	{	\begin{pspicture}(1.5,0.25)
% 			\psline(0,0.125)(1.5,0.125)
% 			\psline(1.25,0.25)(1.5,0.125)(1.25,0)
% 		\end{pspicture}
% 	}
% \newcommand{\RsrcFlow}%
% 	{	\begin{pspicture}(1.5,0.25)
% 			\psline[linestyle=dashed](0,0.125)(1.5,0.125)
% 			\psline[linestyle=dashed](1.25,0.25)(1.5,0.125)(1.25,0)
% 		\end{pspicture}
% 	}


% stuff for two-siding
% \newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}}
% \newcommand{\shortpage}{\enlargethispage{-\baselineskip}}
% \newcommand{\longpage}{\enlargethispage*{\baselineskip}}

% [sic]
\newcommand{\sic}[1]{#1 [\emph{sic}]}
