summaryrefslogtreecommitdiff
path: root/macros/generic/diagrams/xypic/texinputs
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/generic/diagrams/xypic/texinputs
Initial commit
Diffstat (limited to 'macros/generic/diagrams/xypic/texinputs')
-rw-r--r--macros/generic/diagrams/xypic/texinputs/movie.cls333
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xy.sty137
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xy.tex2694
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xy16textures.tex122
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xy17oztex.tex121
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xy2cell.tex668
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyall.tex36
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyarc.tex683
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyarrow.tex538
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xybarr.tex1016
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xycmactex.tex28
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xycmtip.tex29
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xycolor.tex112
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xycrayon.tex32
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xycurve.tex2702
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xydummy.tex30
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xydvidrv.tex36
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xydvips.tex154
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xydvitops.tex179
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyemtex.tex101
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyframe.tex537
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xygraph.tex219
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyidioms.tex72
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyimport.tex68
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyknot.tex901
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyline.tex237
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xymacpat.xyp60
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xymatrix.tex500
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xymovie.tex75
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xynecula.tex330
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyoztex.tex130
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypdf-co.tex129
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypdf-cu.tex1187
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypdf-fr.tex438
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypdf-li.tex69
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypdf-ro.tex133
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypdf.tex522
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypic.sty32
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypic.tex24
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypicture.tex55
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypoly.tex609
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-c.tex69
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-col.tex97
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-f.tex127
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-l.tex68
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-pro.tex173
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-ps.tex280
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-r.tex61
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-s.tex51
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps-t.tex64
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyps.tex367
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypsdict.tex241
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xypspatt.tex104
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyrecat.tex36
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyrotate.tex161
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xysmart.tex320
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xytextures.tex123
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xytile.tex125
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xytips.tex81
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xytp-f.tex174
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xytpic.tex228
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyv2.tex277
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyweb.tex94
-rw-r--r--macros/generic/diagrams/xypic/texinputs/xyxdvi.tex138
64 files changed, 19537 insertions, 0 deletions
diff --git a/macros/generic/diagrams/xypic/texinputs/movie.cls b/macros/generic/diagrams/xypic/texinputs/movie.cls
new file mode 100644
index 0000000000..6486901aa8
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/movie.cls
@@ -0,0 +1,333 @@
+%% $Id: movie.cls,v 3.7 2011/03/14 20:14:00 krisrose Exp $ -*-latex-*-
+%%
+%% ``LaTeX Movie'' document class for DVI animations.
+%% Copyright (c) 1994-1997 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\NeedsTeXFormat{LaTeX2e}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Version.
+
+\def\next$#1: #2 #3${#2}
+\edef\next{\noexpand\ProvidesClass{movie}%
+ [\next$Date: 2011/03/14 20:14:00 $
+ Movies in LaTeX v.\next$Revision: 3.7 $.]}\next
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Options.
+
+% nocaption (omit caption at lower left; default)
+% caption (include caption)
+\newif\ifm@caption
+\DeclareOption{nocaption}{\m@captionfalse}
+\DeclareOption{caption}{\m@captiontrue}
+
+% nocount (omit count at lower left; default)
+% count (include count)
+\newif\ifm@count
+\DeclareOption{nocount}{\m@countfalse}
+\DeclareOption{count}{\m@counttrue}
+
+% notime (omit elapsed time in "seconds"; default)
+% time (include elapsed time)
+\newif\ifm@time
+\DeclareOption{notime}{\m@timefalse}
+\DeclareOption{time}{\m@timetrue}
+
+% loop (make the animation loop; default)
+% once (don't loop)
+\def\loop@@{-ns2}
+\DeclareOption{loop}{\def\loop@@{-ns2}}
+\DeclareOption{once}{\def\loop@@{-once}}
+
+% Paper size (ignored since result is never printed).
+\DeclareOption{a4paper}{}
+\DeclareOption{a5paper}{}
+\DeclareOption{b5paper}{}
+\DeclareOption{letterpaper}{}
+\DeclareOption{legalpaper}{}
+\DeclareOption{executivepaper}{}
+\DeclareOption{landscape}{}
+
+%\vsize=9in \voffset=0in
+%\hsize=7in \hoffset=0in % safe? :)
+
+\newdimen\textheight \textheight=\vsize
+\newdimen\textwidth \textwidth=\hsize
+
+% Font size.
+\renewcommand\normalsize{\fontsize{10}{12}\selectfont}
+\DeclareOption{10pt}{\renewcommand\normalsize{\fontsize{10}{12}\selectfont}}
+\DeclareOption{11pt}{\renewcommand\normalsize{\fontsize{11}{13}\selectfont}}
+\DeclareOption{12pt}{\renewcommand\normalsize{\fontsize{12}{14}\selectfont}}
+
+% Driver (passed on to packages).
+\DeclareOption{cmactex}{\OptionNotUsed}
+\DeclareOption{dvips}{\OptionNotUsed}
+\DeclareOption{dvitops}{\OptionNotUsed}
+\DeclareOption{emtex}{\OptionNotUsed}
+\DeclareOption{ln}{\OptionNotUsed}
+\DeclareOption{oztex}{\OptionNotUsed}
+\DeclareOption{textures}{\OptionNotUsed}
+\DeclareOption{xdvi}{\OptionNotUsed}
+
+% ...remaining options are numeric assignments...
+\def\m@keys{}
+\def\add@m@keys#1{\expandafter\def\expandafter\m@keys\expandafter{\m@keys,#1}}
+\DeclareOption*{\expandafter\add@m@keys\expandafter{\CurrentOption}}
+
+\ProcessOptions*
+
+\LoadClass{article}
+\pagestyle{empty}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Dependencies.
+
+\RequirePackage{keyval} % key=value pair support
+\input xy % Xy-pic kernel (not package to prevent clash)
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Parameters (set via options or the setup).
+
+% pixel=<dimen> (makes \pixels{<number>} a valid <dimen>; default: 1in/300)
+% dpi=<number> (dots per inch ~ pixel=1in/number)
+\newdimen\m@pixel \m@pixel=0.0033333333in
+\define@key{movie}{pixel}{\m@pixel=#1\relax}
+\define@key{movie}{dpi}{\m@pixel=1in \divide \m@pixel by #1\relax}
+
+% height=<dimen>
+% width=<dimen>
+\newdimen\m@height \m@height=2in
+\newdimen\m@width \m@width=2in
+\define@key{movie}{height}{\m@height=#1\relax}
+\define@key{movie}{width}{\m@width=#1\relax}
+
+% tick=<fraction> (set the duration of each frame to <fraction> seconds)
+% fps=<number> (frames per second ~ tick=1/number)
+\newdimen\m@tick \m@tick=0.083333333pt
+\define@key{movie}{tick}{\m@tick=#1pt\relax}
+\define@key{movie}{fps}{\m@tick=1pt \divide \m@tick by #1\relax}
+
+\def\next#1{\setkeys{movie}{#1}}
+\expandafter\next\expandafter{\m@keys}
+\let\m@keys=\undefined
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Setting parameters explicitly...
+
+\def\MovieSetup#1{\setkeys{movie}{#1}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Internals.
+
+\def\m@caption{}
+
+\countdef\m@scene=1 % count1 = scene#
+\countdef\m@frame=2 % count2 = frame# (in scene)
+
+\font\fiverm=cmr5 % safe small font
+
+\newdimen\m@total \m@total=0pt % total elapsed time
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% User accessible progress macros:
+
+\def\theFrame{0}
+\def\theScene{0}
+
+\def\theF{0}
+\def\theFr{1}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% User command: \scene [<fraction>] {...}
+%
+% Produce scene of <fraction> seconds (default: 1.0) with each frame produced
+% by ... centered in vertical mode.
+
+\newif\iflastframe@
+\newdimen\m@length % duration of scene
+\newdimen\m@init % start of zoom
+
+\newcommand\scene{%
+ \@ifnextchar*{\lastframe@true \DN@*{\scene@i}\next@}%
+ {\lastframe@false \scene@i}}
+
+\newcommand\scene@i[1][1]{\scene@ii{#1}}
+
+\def\setm@caption#1{\xdef\m@caption{#1}}
+
+\long\def\scene@ii#1#2{{%
+ \let\caption=\setm@caption
+ \global\advance\m@scene\@ne \edef\theScene{\the\m@scene}%
+ \global\m@frame=\z@ \m@length=#1pt \m@init=\z@
+ \loop
+ \dimen@=\m@frame\m@tick
+ \ifdim\dimen@<\m@length
+ \scene@frame{#2}%
+ \repeat
+ \iflastframe@ \scene@frame{#2}\fi
+ \dimen@=#1pt \advance\dimen@ by -\m@frame\m@tick
+ \ifdim.1\m@tick<\ifdim\dimen@<\z@-\fi\dimen@
+ \dimen@=\m@frame\m@tick
+ \@warning{scene \the\m@scene\space rounded from #1 to
+ \expandafter\unPT@\the\dimen@\space seconds}%
+ \fi}\ignorespaces}
+
+\def\scene@frame#1{\frame@compute
+ \null
+ \vfill
+ \hrule width\m@width
+ \hbox to\m@width{\hss
+ \vbox to\m@height{\hsize=\m@width \null\vfil{#1}\vfil\null}%
+ \hss}%
+ \setbox0=\hbox{%
+ \setbox0=\hbox to\m@width{\hss\fiverm\strut
+ \ifm@caption \m@caption \fi
+ \ifm@time \quad \m@nicetotal s \fi
+ \ifm@count \quad \the\m@scene.%
+ \ifnum\m@frame<100 0\ifnum\m@frame<10 0\fi\fi\the\m@frame\fi}%
+ \dimen0=\dp0 \ht0=0pt \dp0=0pt \raise\dimen0\box0}%
+ \ht0=0pt \dp0=0pt \box0\relax
+ \hrule width\m@width
+ \global\advance\m@frame\@ne
+ \global\advance\m@total\m@tick
+ \eject}
+
+\def\frame@compute{%
+ \edef\theFrame{\the\m@frame}%
+ \dimen@=\m@frame\m@tick \advance\dimen@-\m@init
+ \ifdim\dimen@<\z@ \dimen@=\z@ \fi
+ \ifdim\dimen@>\m@length \dimen@=\m@length \fi
+ \quotient@\theF\dimen@\m@length
+ \dimen@=-\dimen@ \advance\dimen@\m@length
+ \quotient@\theFr\dimen@\m@length}
+
+\def\m@nicetotal{%
+ \edef\tmp{\expandafter\removePT@\the\m@total}%
+ \expandafter\twodecimals@\tmp 00@}
+\def\twodecimals@#1.#2#3#4@{#1.#2#3}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Triggers.
+%
+% Triggers are used to make the individual frames in a scene different! :)
+
+% \F{C} expands to C(F) where F = (#frames / frame#) ; 0.0 < F <= 1.0 .
+% \Fr{C} expands to C(Fr) where Fr = 1 - F .
+
+\def\F{\expandafter\F@\expandafter{\theF}}
+\def\Fr{\expandafter\F@\expandafter{\theFr}}
+
+\def\F@#1#2{#2(#1)}
+
+% \Zoom[A;B]{C} expands C zooming onto the interval [A;B], i.e., within C the
+% interval [0;1] really denotes the (current) interval [A;B] ...
+
+% Specifically: F F inside [A;B]
+% 0;A 0
+% A;B F-A / B-A
+% B;1 1
+
+\newcommand\Zoom[1][0;1]{\Zoom@#1;}
+\def\Zoom@#1;#2;#3{{%
+ \dimen@=#1\m@length \advance\dimen@\m@init
+ \m@length=#2\m@length \advance\m@length\m@init
+ \advance\m@length-\dimen@ \m@init=\dimen@
+ \frame@compute #3}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Preliminary FADING support...
+%
+% by Ross Moore; depends on Xy-pic `ps' backend...
+%
+% use as a <shape> modifier: \drop[<colour>][!\F\lighten]<object>
+% use as a <shape> modifier: \drop[<colour>][!\F\darken}]<object>
+%
+% \lighten(1) = white \lighten(0) = natural colour
+% \darken (1) = black \darken (0) = natural colour
+%
+\def\lighten@(#1){/@col #1 def{1 sub 1 @col sub mul 1 add}settransfer}
+\def\darken@(#1){/@col #1 def{1 @col sub mul}settransfer}
+
+\xywithoption{ps}{\let\lighten=\lighten@ \let\darken=\darken@}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Dump size file.
+%
+\AtEndDocument{\dumpsizefile}
+
+\newwrite\m@write
+
+{\catcode`p=12 \catcode`t=12 \gdef\unPT@#1pt{#1}}
+
+\def\dumpsizefile{\immediate\openout\m@write=\jobname.size
+%
+ \dimen@=1in \divide\dimen@\m@pixel
+ \immediate\write\m@write{dpi=\number\dimen@}%
+%
+ \dimen@=\m@tick \multiply\dimen@ by 1000\advance\dimen@.5\m@tick
+ \divide\dimen@\p@ \immediate\write\m@write{delay=\number\dimen@}%
+%
+ \immediate\write\m@write{loop=\loop@@}%
+%
+ \immediate\closeout\m@write}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Misc. class-provided commands...
+
+\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
+\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
+\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
+\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
+\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
+\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
+\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The End.
+
+\endinput
+
+% $Log: movie.cls,v $
+% Revision 3.7 2011/03/14 20:14:00 krisrose
+% Preparing for release 3.8.6.
+%
+% Revision 3.6 2010/06/10 18:45:49 krisrose
+% Reference to GPL by URL.
+%
+% Revision 3.5 2010/04/16 06:06:51 krisrose
+% Preparing for a new release...
+%
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 1.5 1997/05/13 12:36:26 krisrose
+% Intermediate version; factors function nicely.
+%
+% Revision 1.4 1997/05/01 21:55:44 krisrose
+% Works again.
+%
+% Revision 1.3 1997/02/11 04:20:19 krisrose
+% Fits new dvitogif89a 1.1 :)
+%
+% Moved to Xy-pic hierarchy.
diff --git a/macros/generic/diagrams/xypic/texinputs/xy.sty b/macros/generic/diagrams/xypic/texinputs/xy.sty
new file mode 100644
index 0000000000..29218a0a26
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xy.sty
@@ -0,0 +1,137 @@
+%% $Id: xy.sty,v 3.10 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% ``Xy-pic as LaTeX 2.09 style option and LaTeX 2e package''.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+
+% Load Xy-pic with catcode of @ set as it will be in user text:
+\count255=\the\catcode`\@ {\catcode`\@=11 \xdef\xystycatcode{\the\count255}}
+\makeatletter
+
+% REPAIR bug of the 2e version of AMS-LaTeX where \makeatother is broken...
+\ifx\@ifpackageloaded\undefined \makeatother
+\else \@ifpackageloaded{amstex}{\catcode`\@=\active}{\makeatother}\fi
+
+\input xy
+
+% That is all unless this is called as a LaTeX2e `native mode' package. Is
+% there an official way to check this? Anyway, this seems to work:
+\makeatletter
+\ifx\if@compatibility\undefined \catcode`\@=\xystycatcode \endinput \fi
+
+% Ensure that we are *really* running LaTeX2e...!
+\NeedsTeXFormat{LaTeX2e}
+
+% So we can check for pdfTeX.
+\RequirePackage{ifpdf}
+
+% This file provides the current version of Xy-pic!
+\edef\next{%
+ \noexpand\ProvidesPackage{xy}[\xydate\space Xy-pic version \xyversion]}\next
+
+% Recognise some standard LaTeX2e class options (cf. old `LaTeX Companion' p.317):
+\DeclareOption{cmactex}{\xyoption{dvips}} % Thomas Kiffe's CMacTeX uses dvips
+\DeclareOption{dvips}{\xyoption{dvips}\xyoption{ps}}
+\DeclareOption{dvitops}{\xyoption{dvitops}\xyoption{ps}}
+\DeclareOption{emtex}{\xyoption{emtex}}
+\DeclareOption{ln}{\xywarning@{`ln' DVI driver not yet fully supported}}
+\DeclareOption{oztex}{\xyoption{oztex}}
+\DeclareOption{textures}{\xyoption{textures}}
+\DeclareOption{xdvi}{\xyoption{xdvi}}
+
+% Recognise standard aliases for the pdf option.
+\DeclareOption{pdftex}{\xyoption{pdf}}
+\DeclareOption{dvipdfm}{\xyoption{pdf}}
+\DeclareOption{dvipdfmx}{\xyoption{pdf}}
+
+% This is special.
+\DeclareOption{colour}{\xyoption{color}} % :-)
+
+% This (obsolete) cmtip style option should be activated after loading:
+\DeclareOption{cmtip}{\xyoption{cmtip}\UseComputerModernTips}
+
+% Pass the desired tip size if defined
+\DeclareOption{10pt}{\xywithoption{tips}{\def\tipsize@@{10}}}
+\DeclareOption{11pt}{\xywithoption{tips}{\def\tipsize@@{11}}}
+\DeclareOption{12pt}{\xywithoption{tips}{\def\tipsize@@{12}}}
+
+% Other options are just loaded.
+\DeclareOption*{\edef\next{\noexpand\xyoption{\CurrentOption}}\next}
+
+% Reinstall catcode of @...
+\catcode`\@=\xystycatcode
+
+% ...and process the options.
+\ProcessOptions\relax
+
+% Now, if no backend is loaded but we can generate PDF, do.
+\ifpdf\makeatletter
+ \ifx\xydriversloaded@@\xydriversloaded@none
+ \makeatother\xyoption{pdf}\fi\fi
+
+% That's all.
+\endinput
+
+% $Log: xy.sty,v $
+% Revision 3.10 2011/03/14 20:14:00 krisrose
+% Preparing for release 3.8.6.
+%
+% Revision 3.9 2010/06/10 18:45:49 krisrose
+% Reference to GPL by URL.
+%
+% Revision 3.8 2010/04/28 07:14:30 krisrose
+% New Xy-pic home page installed.
+%
+% Revision 3.7 2010/04/26 01:45:23 krisrose
+% First proper integration of xypdf into Xy-pic "make dist".
+%
+% Revision 3.6 2010/04/25 21:48:06 krisrose
+% First proper integration of xypdf into Xy-pic "make dist".
+%
+% Revision 3.5 2010/04/20 20:36:43 krisrose
+% Documentation updates.
+%
+% Revision 3.4 2010/04/16 06:06:52 krisrose
+% Preparing for a new release...
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% New for version 2.7.
diff --git a/macros/generic/diagrams/xypic/texinputs/xy.tex b/macros/generic/diagrams/xypic/texinputs/xy.tex
new file mode 100644
index 0000000000..0ea737b2ab
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xy.tex
@@ -0,0 +1,2694 @@
+%% xy.tex from $Id: xy.doc,v 3.35 2013/10/06 01:14:17 krisrose Exp $
+%%
+%% Basic Xy-pictures: Xy-pic bootstrap and kernel macros.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined\else\message{not reloaded}\endinput\fi
+\let\xyloaded=\relax
+\message{Bootstrap\string'ing\string:}
+{\catcode96 12\catcode`\#6\catcode`\.12\catcode`\:12\catcode`\'12\catcode`\@11
+\ifx\xywarnifdefined\undefined\else \immediate\write16{}%
+ \immediate\write16{Xy-pic Warning: \string\xywarnifdefined\space redefined.}%
+ \immediate\write16{}\fi
+\gdef\xywarnifdefined#1{\ifx#1\undefined\else \immediate\write16{}%
+ \immediate\write16{Xy-pic Warning: `\string#1' redefined.}%
+ \immediate\write16{}\fi}
+\xywarnifdefined\xydef@ \gdef\xydef@#1{\xywarnifdefined#1\gdef#1}
+\xywarnifdefined\xylet@ \gdef\xylet@#1{\xywarnifdefined#1\global\let#1}
+\xywarnifdefined\xynew@
+ \gdef\xynew@#1#2{\xywarnifdefined#2\csname new#1\endcsname#2}}
+\message{catcodes\string,}
+\xywarnifdefined\xyuncatcodes
+\xywarnifdefined\xyreuncatcodes \def\xyreuncatcodes{\edef\xyuncatcodes{%
+ \catcode92 0 \catcode123 1 \catcode125 2 \catcode37 14
+ \catcode 9 \the\catcode 9 \catcode10 \the\catcode10 \catcode12 \the\catcode12
+ \catcode35 \the\catcode35 \catcode36 \the\catcode36 \catcode38 \the\catcode38
+ \catcode43 \the\catcode43 \catcode45 \the\catcode45 \catcode46 \the\catcode46
+ \catcode47 \the\catcode47
+ \catcode60 \the\catcode60 \catcode61 \the\catcode61 \catcode62 \the\catcode62
+ \catcode64 \the\catcode64 \catcode96 \the\catcode96
+ \newlinechar \the\newlinechar \endlinechar \the\endlinechar }}
+\xyreuncatcodes
+\xywarnifdefined\xycatcodes \def\xycatcodes{%
+ \catcode 9 10
+ \catcode 35 6 \catcode 36 3 \catcode 38 4
+ \catcode 43 12 \catcode 45 12 \catcode 46 12 \catcode 47 12
+ \catcode 60 12 \catcode 61 12 \catcode 62 12
+ \catcode 64 11 \catcode 96 12 }
+\xycatcodes
+\message{docmode,}
+{\catcode`\|0 \xywarnifdefined|DOCMODE
+\gdef|DOCMODE#1{\ifx(#1\relax \xycatcodes \expandafter\ignorespaces
+ \else \skipspecials@ \expandafter\docm@\fi}%
+\xywarnifdefined\skipspecials@
+\gdef\skipspecials@{%
+ \catcode`\\12 \catcode`\{12 \catcode`\}12 \catcode`\#12 \catcode`\%12
+ \catcode`\^^L12 \endlinechar`\^^J }%
+\catcode`\/=12 \lccode`\/`\\%
+\lccode`\D`\D \lccode`\O`\O \lccode`\C`\C \lccode`\M`\M \lccode`\E`\E
+\lowercase{%
+\xywarnifdefined\docm@ \gdef\docm@{\docm@i}%
+\xywarnifdefined\docm@i \gdef\docm@i#1^^J{\docm@ii#1/DOCMODE\docm@iii}%
+\xywarnifdefined\docm@ii
+ \gdef\docm@ii#1/DOCMODE{\def\next@{#1}\futurelet\next\docm@iii}%
+\xywarnifdefined\docm@iii \gdef\docm@iii#1\docm@iii{%
+ \ifx\next\docm@iii \let\next\next@ \docecho@ \let\next@\docm@
+ \else\ifx\next@\empty \let\next@\docfinish@
+ \else \edef\next@{\noexpand\docm@iv\next@/DOCMODE#1\noexpand\docm@iv}%
+ \fi\fi \next@}%
+\xywarnifdefined\docm@iv
+ \gdef\docm@iv#1/DOCMODE\docm@iv{\def\next{#1}\docecho@ \docm@}}%
+\xywarnifdefined\docecho@ \global\let\docecho@\relax
+\xywarnifdefined\docfinish@ \gdef\docfinish@{\xyuncatcodes|DOCMODE\next}}
+\xydef@\xydefcsname@#1{\DN@{#1}\DNii@##1{%
+ \ifx ##1\relax\else \xywarning@{\string`\string##1\string' redefined}\fi
+ \def##1}%
+ \expandafter\nextii@\csname\codeof\next@\endcsname}
+\xydef@\xyletcsnamecsname@#1#2{\def\1{#1}\def\2{#2}\DN@##1##2{%
+ \ifx ##1\relax\else \xywarning@{`\string##1\string' redefined}\fi
+ \let##1=##2}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\csname\expandafter\codeof\expandafter\1\expandafter\endcsname
+ \csname\codeof\2\endcsname}
+\xywarnifdefined\codeof
+\xywarnifdefined\codeof@
+{\catcode`\:=12
+ \gdef\codeof#1{\expandafter\codeof@\meaning#1<-:}
+ \gdef\codeof@#1:->#2<-:{#2}}
+\xywarnifdefined\addAT@
+\xywarnifdefined\addHASH@
+\xywarnifdefined\addDOLL@
+\xywarnifdefined\addAND@
+\xywarnifdefined\addRQ@
+\xywarnifdefined\addPLUS@
+\xywarnifdefined\addDASH@
+\xywarnifdefined\addDOT@
+\xywarnifdefined\addLT@
+\xywarnifdefined\addEQ@
+\xywarnifdefined\addGT@
+\xywarnifdefined\addLQ@
+\xydef@\xymakeADD@#1#2 #3 {\ifnum\catcode#3=6 \def#1##1{##1#2#2}%
+ \else \def#1##1{##1#2}\fi}
+\xydef@\xyrecat@{\xymakeADD@\addAT@}
+\xydef@\xyrecat{\xyrecat@}
+\xydef@\xyresetcatcodes{\def\xyrecat{\xyrecat@}\xyreuncatcodes
+ \input xyrecat \relax \xyuncatcodes}
+\xyuncatcodes \xyresetcatcodes \xycatcodes
+\xydef@\testAND@{{\aftergroup\ifx
+ \addAND@\ifx\next\addFalse@\else\addTrue@\fi}}
+\xydef@\addFalse@{\aftergroup\iffalse}
+\xydef@\addTrue@{\aftergroup\iftrue}
+\input xyidioms
+\xydef@\stripRCS$#1${\stripRCS@#1: @@ @@@}
+\xydef@\stripRCS@#1: #2@ #3@@@{%
+ \ifx @#2\string?\else\ifx :#2\else\stripRCS@@#2\fi\fi}
+\xydef@\stripRCS@@#1 #2: @{#1}
+\xydef@\xyversion{3.8.9}
+\edef\next{\stripRCS$Date: 2013/10/06 01:14:17 $}
+\xylet@\xydate=\next
+\xydef@\Xygreet@{%
+ \W@{}%
+ \W@{ Xy-pic version \xyversion\space<\xydate>}%
+ \W@{ Copyright (c) 1991-2013 by Kristoffer H. Rose <krisrose@tug.org> and others}%
+ \W@{ Xy-pic is free software: see the User\string's Guide for details.}%
+ \W@{}}
+\Xygreet@
+\expandafter\everyjob\expandafter{\the\everyjob\Xygreet@}
+\message{Loading kernel:}
+\xydef@\Xy@{\leavevmode
+ \hbox{\kern-.1em X\kern-.3em\lower.4ex\hbox{Y\kern-.15em}}}
+\ifx\undefined\DeclareRobustCommand\let\Xy=\Xy@
+\else\DeclareRobustCommand{\Xy}{\Xy@}\fi
+\message{messages;}
+\xywarnifdefined\thelineno@
+\ifx\inputlineno\undefined \edef\thelineno@{\string?}
+\else \def\thelineno@{\the\inputlineno}\fi
+\xydef@\xytracelineno@{ \string[\jobname:\thelineno@\string]}
+\xydef@\xywarning@#1{{\newlinechar=10
+ \W@{}\W@{Xy-pic Warning: #1\xytracelineno@.}\W@{}}}
+\xydef@\xyerror@#1#2{\if\inxy@\xy@{ERROR #1}{}\fi
+ {\def\2{#2}\newlinechar=10
+ \ifx\2\empty \errhelp{See the Xy-pic manual for further information.}%
+ \else \errhelp{#2}\fi
+ \errmessage{Xy-pic error: #1}}}
+\xydef@\xybug@#1{{\newlinechar=10
+ \errhelp{This is a bug in Xy-pic and should not happen!^^J%
+If it did then please send a bug report with the offending Xy-pic code^^J%
+to the author of Xy-pic, krisrose@tug.org.}%
+ \errmessage{Xy-pic BUG: #1 -- notify krisrose@tug.org.}}}
+\message{fonts;}
+\xydef@\xyfont@#1{\ifx#1\undefined \DN@{\global\font#1}\expandafter\next@
+ \else \xywarning@{Using previously loaded \string#1\space font}\fi}
+\xyfont@\xydashfont=xydash10
+\xydef@\xydashl@{\fontdimen6\xydashfont}
+\xydef@\xydashh@{\fontdimen5\xydashfont}
+\xydef@\xydashw@{\fontdimen8\xydashfont}
+\xyfont@\xyatipfont=xyatip10
+\xyfont@\xybtipfont=xybtip10
+\xyfont@\xybsqlfont=xybsql10
+\xydef@\xybsqll@{\fontdimen6\xybsqlfont}
+\xydef@\xybsqlh@{\fontdimen5\xybsqlfont}
+\xydef@\xybsqlw@{\fontdimen8\xybsqlfont}
+\xyfont@\xycircfont=xycirc10
+\message{allocations:}
+\message{state,}
+\xynew@{dimen}\X@c
+\xynew@{dimen}\Y@c
+\xynew@{dimen}\U@c
+\xynew@{dimen}\D@c
+\xynew@{dimen}\L@c
+\xynew@{dimen}\R@c
+\xynew@{toks}\Edge@c
+\xynew@{dimen}\X@p
+\xynew@{dimen}\Y@p
+\xynew@{dimen}\U@p
+\xynew@{dimen}\D@p
+\xynew@{dimen}\L@p
+\xynew@{dimen}\R@p
+\xynew@{toks}\Edge@p
+\xynew@{dimen}\X@origin \X@origin=\z@
+\xynew@{dimen}\Y@origin \X@origin=\z@
+\xynew@{dimen}\X@xbase \X@xbase=1mm
+\xynew@{dimen}\Y@xbase \Y@xbase=\z@
+\xynew@{dimen}\X@ybase \X@ybase=\z@
+\xynew@{dimen}\Y@ybase \Y@ybase=1mm
+\xynew@{dimen}\X@min
+\xynew@{dimen}\Y@min
+\xynew@{dimen}\X@max
+\xynew@{dimen}\Y@max
+\xynew@{box}\lastobjectbox@
+\xynew@{box}\zerodotbox@
+\setbox\zerodotbox@=\hbox{\dimen@=.5\xydashw@
+ \kern-\dimen@ \vrule width\xydashw@ height\dimen@ depth\dimen@}
+\wd\zerodotbox@=\z@ \ht\zerodotbox@=\z@ \dp\zerodotbox@=\z@
+\xynew@{dimen}\almostz@ \almostz@=50sp
+\xydef@\zz@#1{\ifdim#1<\z@-\fi#1<\almostz@\relax}
+\xynew@{if}\iftmp@
+\message{direction,}
+\xynew@{dimen}\d@X
+\xynew@{dimen}\d@Y
+\xydef@\sd@X{}
+\xydef@\sd@Y{}
+\xynew@{count}\K@ \K@=1024
+\xynew@{count}\KK@ \KK@=32
+\xynew@{count}\Direction
+\xynew@{dimen}\K@dXdY
+\xynew@{dimen}\K@dYdX
+\xydef@\cosDirection{}
+\xydef@\sinDirection{}
+\xywarnifdefined\DirectionChar
+\xywarnifdefined\SemiDirectionChar
+\xynew@{read}\xyread@
+\xynew@{write}\xywrite@
+\xynew@{count}\csp@
+\xynew@{dimen}\quotPTK@
+\message{utility macros;}
+\xydef@\addtotoks@#1{\toks@=\expandafter{\the\toks@#1}}
+\xydef@\xyinputorelse@#1#2{%
+ \expandafter\let\expandafter\next@\csname#1loaded\endcsname
+ \ifx\next@\empty \else
+ \DN@{\xyinputorelse@@{#1}{\xyinputorelse@@{#1.doc}{#2}}}%
+ \fi \next@}
+\xydef@\xyinputorelse@@#1#2{\openin\xyread@=#1
+ \ifeof\xyread@ \DN@{#2}\else \DN@{\closein\xyread@\input#1 }\fi \next@}
+\global\csp@=\z@
+\xydef@\enter@#1{\global\advance\csp@\@ne
+ \expandafter\xdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
+\xydef@\nter@#1{\global\advance\csp@\@ne
+ \expandafter\gdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
+\xydef@\dontleave@{\csname cs@\number\csp@\endcsname}
+\xydef@\unenter@{\global\advance\csp@\m@ne}
+\xydef@\leave@{\expandafter\unenter@\csname cs@\number\csp@\endcsname}
+\quotPTK@=\p@ \divide\quotPTK@\K@
+\xylet@\quotsign@@=\empty
+\xywarnifdefined\removePT@
+{\catcode`p=12 \catcode`t=12 \gdef\removePT@#1pt{#1}}
+\xydef@\quotient@#1#2#3{\A@=#2\relax \B@=#3\relax
+ \ifdim\A@<\z@\def\quotsign@@{-}\else\def\quotsign@@{+}\fi
+ \ifdim\quotsign@@\A@<15pt \multiply\A@\K@
+ \else\ifdim\quotsign@@\A@<511pt \multiply\A@\KK@
+ \advance\B@\ifdim\B@<\z@-\fi 16sp \divide\B@\KK@
+ \else
+ \advance\B@\ifdim\B@<\z@-\fi 512sp \divide\B@\K@
+ \fi\fi
+ \ifdim\ifdim\B@<\z@-\fi\B@<\quotPTK@ \xywarning@{division overflow}%
+ \else \advance\A@.5\B@ \divide\A@\B@ \fi
+ \multiply\A@\quotPTK@ \edef#1{\expandafter\removePT@\the\A@}}
+\xydef@\quotient@@#1#2#3{\A@=#2\relax \B@=#3\relax \multiply\A@\KK@
+ \advance\B@\ifdim\B@<\z@-\fi 128sp \divide\B@\KK@ \divide\B@ 8
+ \ifdim\B@=\z@\else \advance\A@.5\B@ \divide\A@\B@ \fi
+ \B@=.125\quotPTK@ \multiply\A@\B@ \edef#1{\expandafter\removePT@\the\A@}}
+\xydef@\loop@#1\repeat@{\def\body@{#1}\iterate@}\xylet@\repeat@=\fi
+\xydef@\iterate@{\body@\expandafter\iterate@\else\fi}
+\xydef@\xyinitial@#1#2{\DN@{#1}%
+ \xyerror@{command used out of context: \codeof\next@}{}}
+\xylet@\xy@=\xyinitial@
+\xylet@\oxy@=\xy@
+\xydef@\change@oxy@#1{\let\oxy@=#1\relax
+}
+\xydef@\inxy@{T\ifx\xy@\xyinitial@ F\else T\fi}
+\xydef@\xyxy@@ix@{\begingroup
+ \xyuncatcodes\afterassignment\endgroup\global\toks9=}
+\xydef@\xy@@{\xy@{}}
+\xydef@\plainxy@{\let\xy@=\xyxy@ \change@oxy@\xy@ \let\xy@@ix@=\xyxy@@ix@}
+\message{pictures: \string\xy,}
+\xydef@\xy{\ifmmode\expandafter\xymath@\else\expandafter\xynomath@\fi}
+\xydef@\xymath@{\hbox\bgroup \dimen@=\the\fontdimen22\textfont\tw@ \xyinside@}
+\xydef@\xynomath@{\hbox\bgroup \dimen@=\z@ \xyinside@}
+\xydef@\xyinside@{%
+ \saveXyStyle@ \aftergroup\xycheck@end
+ \setboxz@h\bgroup
+ \plainxy@
+ \X@c=\z@ \Y@c=\z@ \czeroEdge@
+ \X@p=\z@ \Y@p=\z@ \U@p=\z@ \D@p=\z@ \L@p=\z@ \R@p=\z@ \Edge@p={\zeroEdge}%
+ \X@min=\hsize \X@max=-\hsize \Y@min=\hsize \Y@max=-\hsize
+ \mathsurround=\z@
+ \expandafter\POS\everyxy@@}
+\xydef@\czeroEdge@{\U@c=\z@ \D@c=\U@c \L@c=\U@c \R@c=\U@c \Edge@c={\zeroEdge}}
+\xydef@\xyxy@#1#2{#2}
+\xywarnifdefined\everyxy
+\expandafter\def\addEQ@\everyxy#1{\def\everyxy@@{#1}\ignorespaces}
+\xylet@\everyxy@@=\empty
+\xydef@\endxy{\if\inxy@\else\xyerror@{Unexpected \string\endxy}{}\fi
+ \relax
+ \dimen@=\Y@max \advance\dimen@-\Y@min
+ \ifdim\dimen@<\z@ \dimen@=\z@ \Y@min=\z@ \Y@max=\z@ \fi
+ \dimen@=\X@max \advance\dimen@-\X@min
+ \ifdim\dimen@<\z@ \dimen@=\z@ \X@min=\z@ \X@max=\z@ \fi
+ \edef\tmp@{\egroup
+ \setboxz@h{\kern-\the\X@min\boxz@}%
+ \ht\z@=\the\Y@max \dp\z@=-\the\Y@min \wdz@=\the\dimen@
+ \noexpand\maybeunraise@ \raise\dimen@\boxz@
+ \noexpand\recoverXyStyle@ \egroup \noexpand\xy@end
+ \U@c=\the\Y@max \D@c=-\the\Y@min \L@c=-\the\X@min \R@c=\the\X@max}\tmp@}
+\xydef@\maybeunraise@{\if\inxy@\else \dimen@ii=\dp\z@
+ \ifdim\dimen@ii<\z@ \advance\dimen@\dimen@ii \fi\fi}
+\xydef@\xycheck@end{\xyFN@\xycheck@end@}
+\xydef@\xycheck@end@{\ifx\next\xy@end\DN@\xy@end{}\else\DN@{\xy@end}\fi\next@}
+\xydef@\xy@end{%
+ \xyerror@{An \string\xy\space environment is not closed correctly.}%
+ {I expected \string\endxy. You probably have an umatched {} grouping.}}
+\message{positions,}
+\xydef@\POS{\afterPOS{}}
+\xydef@\afterPOS#1{%
+ \DN@##1{\def\afterPOS@{\def\afterPOS@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterPOS@}%
+ \afterCOORD{\xyFN@\POS@}}
+\xylet@\afterPOS@=\empty
+\xydef@\afterCOORD#1{%
+ \DN@##1{\def\afterCOORD@{\def\afterCOORD@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterCOORD@}%
+ \afterVECTORorEMPTY{\xy@@\czeroEdge@ \afterCOORD@}{\xyFN@\COORD@}}
+\xylet@\afterCOORD@=\empty
+\xydef@\afterVECTORorEMPTY#1#2{%
+ \DN@##1{\def\afterVECTOR@{\def\afterVECTOR@{##1}%
+ \ifVECTORempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
+ \expandafter\next@\expandafter{\afterVECTOR@}%
+ \xyFN@\VECTOR@}
+\xynew@{if}\ifVECTORempty@
+\xylet@\afterVECTOR@=\empty
+\xydef@\xyVECTOR@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\VECTOR@}%
+ \else \ifcat A\noexpand\next \let\next@=\VECTOR@letter
+ \else \let\next@=\VECTOR@other \fi\fi \next@}
+\xylet@\VECTOR@=\xyVECTOR@
+\def\notrelaxorelse@#1#2{\ifx#1\relax \expandafter#2\else\expandafter#1\fi}
+\xydef@\VECTOR@letter{%
+ \ifx a\next \expandafter\VECTOR@a \else \expandafter\CORNER@ \fi}
+\xydef@\VECTOR@a a(#1){\xy@{a(#1)}{\vfromcartesianangle@{#1}}%
+ \VECTORempty@false \afterVECTOR@}
+\xydef@\CORNER@{%
+ \xy@{}{\A@=-.5\L@c \advance\A@.5\R@c \B@=-.5\D@c \advance\B@.5\U@c
+ \let\nextii@=\zeroit@}%
+ \VECTORempty@true\CORNER@i}
+\xydef@\zeroit@#1{#1=\z@}
+\xydef@\CORNER@i{%
+ \ifx D\next \DN@ D{\xy@{D}{\Y@c=-\D@c \nextii@\X@c \B@=\Y@c}\CORNER@ii}%
+ \else\ifx U\next \DN@ U{\xy@{U}{\Y@c= \U@c \nextii@\X@c \B@=\Y@c}\CORNER@ii}%
+ \else\ifx L\next \DN@ L{\xy@{L}{\X@c=-\L@c \nextii@\Y@c \A@=\X@c}\CORNER@ii}%
+ \else\ifx R\next \DN@ R{\xy@{R}{\X@c= \R@c \nextii@\Y@c \A@=\X@c}\CORNER@ii}%
+ \else\ifx C\next \DN@ C{\xy@{C}{\X@c= \A@ \Y@c= \B@}\CORNER@ii}%
+ \else\ifx E\next \DN@ E{\xy@{E}{%
+ \A@=\X@c \B@=\Y@c \the\Edge@c\z@ \advance\X@c-\A@ \advance\Y@c-\B@}%
+ \CORNER@ii}%
+ \else\ifx P\next \DN@ P{\xy@{P}{%
+ \A@=\X@c \B@=\Y@c \the\Edge@c\thr@@ \advance\X@c-\A@ \advance\Y@c-\B@}%
+ \CORNER@ii}%
+ \else\ifx (\next
+ \DN@(##1){\xy@{(##1)}{\X@c=##1\X@c \Y@c=##1\Y@c}\afterVECTOR@}%
+ \else\ifx A\next \DN@ A{\xy@{A}{\Y@c=\fontdimen22\textfont\tw@ \nextii@\X@c \B@=\Y@c}\CORNER@ii}%
+ \else\ifx V\next \DN@ V{\xy@{V}{\nextii@\X@c \Y@c=\U@p}\CORNER@ii}%
+ \else\ifx H\next \DN@ H{\xy@{H}{\nextii@\Y@c \X@c=\R@p}\CORNER@ii}%
+ \else \let\next@=\afterVECTOR@
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\CORNER@ii{\xy@@{\let\nextii@=\eat@}%
+ \VECTORempty@false \xyFN@\CORNER@i}
+\xydef@\VECTOR@other{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@##1}{\xy@{<##1>}{\vfromabsolute@{##1}}%
+ \VECTORempty@false\afterVECTOR@}%
+ \else\ifx (\next
+ \DN@({\xyFN@\VECTOR@other@open}%
+ \else\ifx /\next
+ \DN@/##1/{\xy@@ix@{{##1}}%
+ \xy@{/##1/}{\expandafter\vfromslide@\the\toks9 }%
+ \VECTORempty@false\afterVECTOR@}%
+ \else\ifx 0\next
+ \DN@ 0{\xy@{0}{\X@c=\z@ \Y@c=\z@}\VECTORempty@false\afterVECTOR@}%
+ \else
+ \DN@{\VECTORempty@true\afterVECTOR@}%
+ \fi\fi\fi\fi \next@}
+\xydef@\VECTOR@other@open{%
+ \ifx *\next \DN@{\VECTORempty@true \xyFN@\afterVECTOR@(}%
+ \else
+ \DN@##1){\xy@{(##1)}{\vfromcartesian@{##1}}\VECTORempty@false\afterVECTOR@}%
+ \fi \next@}
+\xydef@\xyCOORD@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\COORD@}%
+ \else \ifcat A\noexpand\next \let\next@=\xyCOORD@letter
+ \else \let\next@=\xyCOORD@other \fi\fi \next@}
+\xylet@\COORD@=\xyCOORD@
+\xydef@\xyCOORD@letter{%
+ \ifx c\next
+ \DN@ c{\xy@{c}{}\afterCOORD@}%
+ \else\ifx p\next
+ \DN@ p{\xy@{p}\cfromp@ \afterCOORD@}%
+ \else\ifx x\next
+ \DN@ x{\xy@{x}{\R@c=\X@xbase \U@c=\Y@xbase \intersect@}\afterCOORD@}%
+ \else\ifx y\next
+ \DN@ y{\xy@{y}{\R@c=\X@ybase \U@c=\Y@ybase \intersect@}\afterCOORD@}%
+ \else\ifx s\next
+ \DN@ s##1{\xy@{s{##1}}{\cfroms@{##1}}\afterCOORD@}%
+ \else \let\next@=\afterCOORD@ \fi\fi\fi\fi\fi \next@}
+\xydef@\xyCOORD@other{%
+ \ifx "\next
+ \DN@"##1"{\xy@{"##1"}{\cfromid@{##1}}\afterCOORD@}%
+ \else\ifx \bgroup\next
+ \DN@##1{\xy@{{##1}}{\enter@{\pfromthep@\basefromthebase@}}%
+ \silencexy@ \POS##1\relax \unsilencexy@ \xy@@\leave@ \afterCOORD@}%
+ \else\ifx (\next
+ \DN@({\xyFN@\xyCOORD@other@open}%
+ \else \let\next@=\afterCOORD@ \fi\fi\fi \next@}
+\xynew@{if}\ifsilentxy@
+\xydef@\silencexy@{%
+ \ifsilentxy@ \nter@{}%
+ \else \nter@{\silentxy@false \let\xy@=\unsilent@@xy@}
+ \silentxy@true \let\unsilent@@xy@=\xy@ \def\xy@##1##2{\unsilent@@xy@{}{##2}}%
+ \fi}
+\xydef@\unsilencexy@{\leave@}
+\xydef@\xyCOORD@other@open{%
+ \ifx *\next
+ \DN@*##1*){\xy@{(*}{\enter@{\pfromthep@\basefromthebase@}}%
+ \POS##1\relax \xy@{*)}\leave@ \afterCOORD@}%
+ \else \DN@{\xyFN@\afterCOORD@(}%
+ \fi \next@}
+\xydef@\xyPOS@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\POS@}%
+ \else\addPLUS@\ifx \next
+ \addPLUS@\DN@{\xy@+{\enter@\cplusthec@}%
+ \afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
+ \else\addDASH@\ifx \next
+ \addDASH@\DN@{\xy@-{\enter@\cplusthec@}%
+ \afterCOORD{\xy@@{\X@c=-\X@c \Y@c=-\Y@c\leave@}\xyFN@\POS@}}%
+ \else\ifx !\next
+ \DN@ !{\xy@!{\enter@\cskewthec@}\afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
+ \else\addDOT@\ifx \next
+ \addDOT@\DN@{\xy@.{\enter@\cmergethec@}\afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
+ \else\ifx ,\next
+ \DN@ ,{\xy@,{\comma@@}\afterCOORD{\xyFN@\POS@}}%
+ \else\ifx ;\next
+ \DN@ ;{\xy@;{\swap@}\afterCOORD{\xyFN@\POS@}}%
+ \else\ifx :\next
+ \DN@ :{\xyFN@\POS@colon}%
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@{\xyFN@\saveid@}%
+ \else\ifx *\next
+ \DN@ *{\xyFN@\POS@star}%
+ \else\ifx ?\next
+ \DN@ ?{\xy@?{}\afterPLACE{\xyFN@\POS@}}%
+ \else \addAT@\ifx \next
+ \addAT@\DN@{\xyFN@\STACK@}%
+ \else
+ \let\next@=\afterPOS@
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xylet@\comma@@=\relax
+\xylet@\POS@=\xyPOS@
+\xydef@\POS@colon{\DNii@{\afterCOORD{\xyFN@\POS@}}%
+ \ifx :\next \xy@{::}{\setbase@@\X@c\Y@c}\DN@:{\nextii@}%
+ \else \xy@:{\setbase@\X@p\Y@p\X@c\Y@c}\let\next@=\nextii@ \fi
+ \next@}
+\xydef@\POS@star{%
+ \ifx *\next
+ \DN@*##1##{\nextii@{##1}}%
+ \DNii@##1##2{\xy@@ix@{{##1}{##2}}%
+ \xy@{**##1{##2}}{\expandafter\connect@\the\toks9 }\xyFN@\POS@}%
+ \else
+ \DN@##1##{\nextii@{##1}}%
+ \DNii@##1##2{\xy@@ix@{{##1}{##2}}%
+ \xy@{*##1{##2}}{\expandafter\drop@\the\toks9 }\xyFN@\POS@}%
+ \fi
+ \next@}
+\xydef@\cfromp@{\X@c=\X@p \Y@c=\Y@p \U@c=\U@p \D@c=\D@p \L@c=\L@p \R@c=\R@p
+ \Edge@c=\expandafter{\the\Edge@p}}
+\xydef@\pfromc@{\X@p=\X@c \Y@p=\Y@c \U@p=\U@c \D@p=\D@c \L@p=\L@c \R@p=\R@c
+ \Edge@p=\expandafter{\the\Edge@c}}
+\xydef@\swapdimen@#1#2{\dimen@=#1\relax #1=#2\relax #2=\dimen@}
+\xynew@{toks}\swaptoks@@
+\xydef@\swap@{\swapdimen@\X@c\X@p \swapdimen@\Y@c\Y@p
+ \swapdimen@\U@c\U@p\swapdimen@\D@c\D@p \swapdimen@\L@c\L@p\swapdimen@\R@c\R@p
+ \swaptoks@@=\Edge@c \Edge@c=\Edge@p \Edge@p=\swaptoks@@}
+\xydef@\vfromabsolute@#1{\vfromabsolute@@#1,@}
+\xydef@\vfromabsolute@@#1,#2@{\X@c=#1\relax
+ \DN@{#2}\ifx\next@\empty \Y@c=\X@c
+ \else \DN@##1,{\Y@c=##1}\next@#2\relax \fi
+}
+\xydef@\cfromthec@{\X@c=\the\X@c \Y@c=\the\Y@c
+ \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \Edge@c={\expandafter\noexpand\the\Edge@c}}
+\xydef@\cfromthep@{\X@c=\the\X@p \Y@c=\the\Y@p
+ \U@c=\the\U@p \D@c=\the\D@p \L@c=\the\L@p \R@c=\the\R@p
+ \Edge@c={\expandafter\noexpand\the\Edge@p}}
+\xydef@\pfromthep@{\X@p=\the\X@p \Y@p=\the\Y@p
+ \U@p=\the\U@p \D@p=\the\D@p \L@p=\the\L@p \R@p=\the\R@p
+ \Edge@p={\expandafter\noexpand\the\Edge@p}}
+\xydef@\pfromthec@{\X@p=\the\X@c \Y@p=\the\Y@c
+ \U@p=\the\U@c \D@p=\the\D@c \L@p=\the\L@c \R@p=\the\R@c
+ \Edge@p={\expandafter\noexpand\the\Edge@c}}
+\xydef@\cplusthec@{\advance\X@c\the\X@c \advance\Y@c\the\Y@c}
+\xydef@\cskewthec@{%
+ \noexpand\cskew@{\the\Y@c}{\the\X@c}{\the\D@c}{\the\U@c}{\the\L@c}{\the\R@c}}
+\xydef@\cskew@#1#2#3#4#5#6{%
+ \D@c=#3\advance\D@c \Y@c \ifdim\D@c<\z@ \D@c=\z@ \fi
+ \U@c=#4\advance\U@c-\Y@c \ifdim\U@c<\z@ \U@c=\z@ \fi
+ \advance\Y@c#1%
+ \L@c=#5\advance\L@c \X@c \ifdim\L@c<\z@ \L@c=\z@ \fi
+ \R@c=#6\advance\R@c-\X@c \ifdim\R@c<\z@ \R@c=\z@ \fi
+ \advance\X@c#2%
+ \Edge@c={\rectangleEdge}}
+\xydef@\cmergethec@{%
+ \noexpand\cmerge@{\the\Y@c}{\the\X@c}{\the\D@c}{\the\U@c}{\the\L@c}{\the\R@c}}
+\xydef@\cmerge@#1#2#3#4#5#6{\the\Edge@c4%
+ \A@=#2\advance\A@-\X@c \B@=#1\advance\B@-\Y@c
+ \dimen@=#5\advance\L@c \A@ \ifdim\L@c<\dimen@ \L@c=\dimen@ \fi
+ \dimen@=#6\advance\R@c-\A@ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \dimen@=#3\advance\D@c \B@ \ifdim\D@c<\dimen@ \D@c=\dimen@ \fi
+ \dimen@=#4\advance\U@c-\B@ \ifdim\U@c<\dimen@ \U@c=\dimen@ \fi
+ \advance\X@c\A@ \advance\Y@c\B@}
+\xydef@\halfroottwo{.70710678}
+\xydef@\partroottwo{.29289322}
+\xydef@\halfrootthree{.8660254}
+\xydef@\vfromcartesian@#1{\vfromcartesian@@#1@}
+\xydef@\vfromcartesian@@#1,#2@{%
+ \X@c=\X@origin \advance\X@c#1\X@xbase \advance\X@c#2\X@ybase
+ \Y@c=\Y@origin \advance\Y@c#1\Y@xbase \advance\Y@c#2\Y@ybase}
+\xydef@\setbase@#1#2#3#4{%
+ \X@origin=#1\relax \Y@origin=#2\relax
+ \X@xbase=#3\relax \advance\X@xbase-\X@origin
+ \Y@xbase=#4\relax \advance\Y@xbase-\Y@origin
+ \X@ybase=-\Y@xbase \Y@ybase=\X@xbase}
+\xydef@\setbase@@#1#2{%
+ \X@ybase=#1\relax \advance\X@ybase-\X@origin
+ \Y@ybase=#2\relax \advance\Y@ybase-\Y@origin}
+\xydef@\basefromthebase@{\X@origin=\the\X@origin \Y@origin=\the\Y@origin
+ \X@xbase=\the\X@xbase \Y@xbase=\the\Y@xbase
+ \X@ybase=\the\X@ybase \Y@ybase=\the\Y@ybase}
+\xydef@\vfromcartesianangle@#1{\enter@\basefromthebase@ \R@=#1\p@
+ \B@=360\p@
+ \loop@ \ifdim\R@<\z@ \advance\R@\B@ \repeat@
+ \loop@ \ifdim\R@>\B@ \advance\R@-\B@ \repeat@
+ \ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@
+ \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi
+ \B@=180\p@
+ \ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@
+ \X@xbase=-\X@xbase \Y@xbase=-\Y@xbase \fi
+ \B@=90\p@
+ \ifdim\R@<.5\B@ \let\nextiii@=\literal@
+ \else \R@=-\R@ \advance\R@\B@ \def\nextiii@##1,##2@{##2,##1@}\fi
+ \dimen@=\z@ \DN@{1,0@}%
+ \dimen@ii=45\p@ \DNii@{.70710678,.70710678@}%
+ \chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {4.090909}{.99677570,.08023846@}%
+ {}}%
+ {6}{.99452190,.10452846@}%
+ {\chooseangleinterval@
+ {}%
+ {8.181818}{.98982144,.14231484@}%
+ {}}}%
+ {10}{.98480775,.17364818@}%
+ {\chooseangleinterval@
+ {}%
+ {12.857143}{.97492791,.22252093@}%
+ {}}}%
+ {15}{.96592583,.25881905@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {16.363636}{.95949297,.28173256@}%
+ {}}%
+ {18}{.95105652,.30901699@}%
+ {\chooseangleinterval@
+ {}%
+ {20}{.93969262,.34202014@}%
+ {}}}}%
+ {22.5}{.92387953,.38268343@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {24.545455}{.90963200,.41541501@}%
+ {}}%
+ {25.714286}{.90096887,.43388374@}%
+ {}}%
+ {30}{.86602540,.5@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {32.727273}{.84125353,.54064082@}%
+ {}}%
+ {36}{.80901699,.58778525@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {38.571429}{.78183148,.62348980@}%
+ {}}%
+ {40.909091}{.75574957,.65486073@}%
+ {\chooseangleinterval@
+ {}%
+ {40}{.76604444,.64278761@}%
+ {}}}}}%
+ \A@=\R@ \advance\A@-\dimen@
+ \ifdim\ifdim\A@<\z@-\fi\A@<.01\p@ \edef\next@{\expandafter\nextiii@\next@}%
+ \else \B@=\dimen@ii \advance\B@-\R@
+ \ifdim\A@<\B@ \dimen@=\toradians@\A@
+ \edef\next@{\next@ \expandafter\removePT@\the\dimen@ @}%
+ \else \dimen@=-\toradians@\B@
+ \edef\next@{\nextii@ \expandafter\removePT@\the\dimen@ @}%
+ \fi
+ \expandafter\interpolatepoint@\next@
+ \edef\next@{\expandafter\nextiii@\next@}%
+ \fi
+ \expandafter\vfromcartesian@@\next@
+ \leave@}
+\xydef@\chooseangleinterval@#1#2#3#4{%
+ \B@=#2\p@ \def\next{#3}%
+ \ifdim\R@<\B@ \dimen@ii=\B@ \let\nextii@=\next #1%
+ \else \dimen@=\B@ \let\next@=\next \ifdim\B@<\R@ #4\fi\fi}
+\xydef@\interpolateinterval@#1,#2@#3,#4@{%
+ \A@=#1\p@ \dimen@=#3\p@ \advance\dimen@-\A@ \advance\A@\next\dimen@
+ \B@=#2\p@ \dimen@=#4\p@ \advance\dimen@-\B@ \advance\B@\next\dimen@
+ \edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
+\xydef@\toradians@{0.01745329}
+\xydef@\interpolatepoint@#1,#2@#3@{%
+ \A@=#1\p@ \dimen@ii=#3\A@ \dimen@ii=-.5\dimen@ii \advance\A@#3\dimen@ii
+ \dimen@=-#2\p@ \advance\A@#3\dimen@
+ \B@=#2\p@ \dimen@ii=#3\B@ \dimen@ii=-.5\dimen@ii \advance\B@#3\dimen@ii
+ \dimen@=#1\p@ \advance\B@#3\dimen@
+ \edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
+\xydef@\drop@#1#2{%
+ \global\setbox\lastobjectbox@=\object#1{#2}%
+ \ifHidden@ \dimen@=\X@c \advance\dimen@-\L@c \else
+ \dimen@=\Y@c \advance\dimen@ \U@c \ifdim\Y@max<\dimen@ \Y@max=\dimen@ \fi
+ \dimen@=\Y@c \advance\dimen@-\D@c \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi
+ \dimen@=\X@c \advance\dimen@ \R@c \ifdim\X@max<\dimen@ \X@max=\dimen@ \fi
+ \dimen@=\X@c \advance\dimen@-\L@c \ifdim\dimen@<\X@min \X@min=\dimen@ \fi
+ \fi
+ \ifInvisible@\else
+ \setboxz@h{\kern\dimen@ \raise\Y@c\box\lastobjectbox@}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi}
+\xydef@\connect@#1#2{\setupDirection@ \enter@{\cfromthec@}%
+ \global\setbox\lastobjectbox@=\object#1{#2}\leave@
+ \Connect@@}
+\xydef@\preconnect@#1#2{\setupDirection@ \enter@{\cfromthec@}%
+ \global\setbox\lastobjectbox@=\object#1{#2}\leave@ \connectStore@
+ \ifInvisible@ \Connect@@ \else \Invisible@true\Connect@@\Invisible@false \fi}
+\xynew@{box}\connectobjectbox@@
+\xylet@\connectDrop@@=\empty
+\xylet@\connectpreXY@style@=\empty
+\xylet@\connectpostXY@style@=\empty
+\xylet@\connectRest@@=\empty
+\xydef@\connectStore@{%
+ \global\setbox\connectobjectbox@@=\copy\lastobjectbox@
+ \let\connectDrop@@=\Drop@@
+ \let\connectpreXY@style@ =\preXY@style@
+ \let\connectpostXY@style@=\postXY@style@
+ \xdef\connectRest@@{%
+ \def\noexpand\Upness@{\Upness@}%
+ \def\noexpand\Leftness@{\Leftness@}%
+ \ifInvisible@ \noexpand\Invisible@true \else \noexpand\Invisible@false \fi
+ \ifHidden@ \noexpand\Hidden@true \else \noexpand\Hidden@false \fi}}
+\xydef@\connectRestore@{%
+ \ifvbox\connectobjectbox@@
+ \setbox\lastobjectbox@=\copy\voidb@x
+ \else
+ \global\setbox\lastobjectbox@=\copy\connectobjectbox@@
+ \fi
+ \let\Drop@@=\connectDrop@@
+ \global\let\preXY@style@ =\connectpreXY@style@
+ \global\let\postXY@style@=\connectpostXY@style@
+ \connectRest@@}
+\xydef@\afterPLACE#1{%
+ \DN@##1{\def\afterPLACE@{\xy@@\leave@ \def\afterPLACE@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterPLACE@}%
+ \def\PLACEf@{{.5}}%
+ \xy@@{\enter@{\pfromthep@}%
+ \Creset@@ \def\PLACEf@{{.5}}%
+ \let\PLACEedgep@@=\PLACEedgep@ \let\PLACEedgec@@=\PLACEedgec@}%
+ \xyFN@\PLACE@}
+\xydef@\PLACEf@{}
+\xydef@\PLACEedgep@@{}
+\xydef@\PLACEedgec@@{}
+\xydef@\PLACEedgep@{\Cshavep@@ \def\PLACEedgep@@{\Cslidep@@\jot}}
+\xydef@\PLACEedgec@{\Cshavec@@ \def\PLACEedgec@@{\Cslidec@@{-\jot}}}
+\xylet@\afterPLACE@=\empty
+\xydef@\PLACE@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@}%
+ \else\addLT@\ifx \next
+ \addLT@\DN@{\addLT@\xy@{\def\PLACEf@{{0}}\PLACEedgep@@}\xyFN@\PLACE@}%
+ \else\addGT@\ifx \next
+ \addGT@\DN@{\addGT@\xy@{\def\PLACEf@{{1}}\PLACEedgec@@}\xyFN@\PLACE@}%
+ \else\ifx (\next
+ \DN@(##1){\def\PLACEf@{{##1}}\xy@{(##1)}{\def\PLACEf@{{##1}}}\xyFN@\PLACE@}%
+ \else\ifx !\next
+ \DN@!{\xyFN@\PLACE@intercept}%
+ \else
+ \DN@{\xy@@{\expandafter\Calong@@\PLACEf@ \czeroEdge@}\PLACE@@}%
+ \fi\fi\fi\fi\fi \next@}
+\xydef@\PLACE@intercept{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@intercept}%
+ \else\ifx \bgroup\next
+ \DN@##1{\xy@{!{##1}}{}\PLACE@intercept@{##1}}%
+ \else\ifx (\next
+ \DN@(*##1*){\xy@{!(*##1*)}{}\PLACE@intercept@{##1}}%
+ \else \DN@{\xyerror@{{<pos>} expected after ! in <place>}{}}%
+ \fi\fi\fi \next@}
+\xydef@\PLACE@intercept@#1{%
+ \xy@@{\enter@{\pfromthep@\basefromthebase@}\begingroup}%
+ \xy@@ix@{#1}\xy@@{\plainxy@ \expandafter\POS\the\toks9\relax
+ \edef\next@{\endgroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \next@ \Cintercept@@ \leave@}%
+ \PLACE@@}
+\xydef@\PLACE@@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@@}%
+ \else\ifx /\next \DN@/##1/{\xy@{/##1/}{\Cslidec@@{##1}}\afterPLACE@}%
+ \else \let\next@=\afterPLACE@
+ \fi\fi \next@}
+\xydef@\intersect@{%
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \A@=\X@c \advance\A@-\X@origin \B@=\Y@c \advance\B@-\Y@origin
+ \edef\next@{\expandafter\removePT@\the\R@c}%
+ \edef\nextii@{\expandafter\removePT@\the\U@c}%
+ \D@c=\next@\d@Y \advance\D@c-\nextii@\d@X \divide\D@c\KK@
+ \L@c=\next@\B@ \advance\L@c-\nextii@\A@ \divide\L@c\KK@
+ \ifdim\D@c=\z@\zeroDivide@\else \quotient@\next@\L@c\D@c \fi
+ \advance\X@c-\next@\d@X \advance\Y@c-\next@\d@Y
+ \czeroEdge@}
+\xydef@\zeroDivide@@{\zeroDivide@message{\intersect@}{treated as 0}\DN@{0}}
+\xydef@\zeroDivide@message#1#2{\xywarning@{division by 0 in \string#1, #2}}
+\xylet@\zeroDivide@=\zeroDivide@@
+\xydef@\zeroDivideLimit@@{\ifdim\L@c=\z@ \DN@{0}%
+ \else\ifdim\L@c<\z@\DN@{-\zeroDivide@Limit}%
+ \else\DN@{\zeroDivide@Limit}\fi\fi
+ \zeroDivide@message{\intersect@}{replaced by \zeroDivide@Limit}}
+\xydef@\zeroDivideLimit@#1{\edef\zeroDivide@Limit{#1}%
+ \let\zeroDivide@=\zeroDivideLimit@@}
+\xylet@\zeroDivideLimit=\zeroDivideLimit@
+\xydef@\vfromslide@#1{\enter@\DirectionfromtheDirection@ \begingroup
+ \plainxy@\afterDIRECTIONorEMPTY\vfromslide@i\vfromslide@i#1@}
+\xydef@\vfromslide@i#1@{\DN@{#1}%
+ \edef\next{\endgroup
+ \ifx\next@\empty \dimen@=.5pc \else \dimen@=#1\relax \fi
+ \X@c=\cosDirection\dimen@ \Y@c=\sinDirection\dimen@}\next
+ \leave@}
+\xydef@\s@bot{-1}
+\xydef@\s@top{-1}
+\xydef@\cfroms@#1{\tests@{#1}\runs@\outofranges@}
+\xydef@\tests@#1#2#3{\DN@{#3}%
+ \count@=\s@top \advance\count@-#1\relax
+ \ifnum\count@>\s@bot\relax \ifnum\count@>\s@top\else\DN@{#2}\fi\fi
+ \next@}
+\xydef@\runs@{\csname S@\the\count@\endcsname}
+\xydef@\outofranges@{\count@=\s@top \advance\count@-\s@bot
+ \xyerror@{stack index out of range (should be 0..\the\count@)}{}}
+\xydef@\STACK@{%
+ \addPLUS@\ifx\next
+ \addPLUS@\DN@{\xy@{@+}{}\afterCOORD{\xy@@\spushc@ \xyFN@\POS@}}%
+ \else\addDASH@\ifx\next
+ \addDASH@\DN@{\xy@{@-}{}\afterCOORD{\xy@@\spop@ \xyFN@\POS@}}%
+ \else \ifx i\next \DN@ i{\xy@{@i}\sinit@ \xyFN@\POS@}%
+ \else \ifx (\next \DN@ ({\xy@{@(}\senter@ \xyFN@\POS@}%
+ \else \ifx )\next \DN@ ){\xy@{@)}\sleave@ \xyFN@\POS@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\STACK@load}%
+ \else\addAT@\ifx\next \addAT@\DN@{\xy@{@@}{}\smap@}%
+ \else \DN@##1{\xyerror@{illegal stack command ##1}{}\afterCOORD{\xyFN@\POS@}}%
+ \fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\STACK@load{\xy@{@=}{%
+ \if\sempty@\else \xywarning@{loading on top of non-empty stack}\sinit@ \fi
+ \let\comma@@=\spushc@}%
+ \afterCOORD{\xy@@{\spushc@ \let\comma@@=\relax}\xyFN@\POS@}}
+\xydef@\spushc@{%
+ \count@=\s@top \advance\count@\@ne \edef\s@top{\the\count@}%
+ \expandafter\edef\csname S@\s@top\endcsname{\cfromthec@}}
+\xydef@\spushid@#1{\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
+ \expandafter\let\expandafter\next@\csname Q@\nextii@\endcsname
+ \ifx\next@\relax \xyerror@{<pos> \string"\nextii@\string" not defined}{}%
+ \else
+ \count@=\s@top \advance\count@\@ne \edef\s@top{\the\count@}%
+ \DNii@##1{\expandafter\def\csname S@\s@top\endcsname{##1}}%
+ \expandafter\nextii@\expandafter{\next@}%
+ \fi}
+\xydef@\idfroms@#1#2{%
+ \tests@{#2}{\DN@{\idfromxy@{#1}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\csname S@\the\count@\endcsname}%
+ }\outofranges@}
+\xydef@\spop@{\count@=\s@top
+ \ifnum\count@>\s@bot \advance\count@\m@ne \edef\s@top{\the\count@}%
+ \else \xyerror@{nothing to pop from stack}{}\fi}
+\xydef@\sinit@{\edef\s@top{\s@bot}}
+\xydef@\senter@{%
+ \count@=\s@top \advance\count@\@ne
+ \expandafter\edef\csname S@\the\count@\endcsname{\s@bot}%
+ \edef\s@bot{\the\count@}\edef\s@top{\the\count@}}
+\xydef@\sleave@{%
+ \ifnum\s@bot=\s@top\else \xywarning@{leaving non-empty stack}\sinit@ \fi
+ \ifnum\s@bot>\m@ne \edef\s@bot{\csname S@\s@top\endcsname}%
+ \count@=\s@top \advance\count@\m@ne \edef\s@top{\the\count@}%
+ \edef\sbot{\the\count@}\fi}
+\xydef@\sempty@{\ifnum\s@top=\s@bot TT\else TF\fi}
+\xydef@\xytotoks@#1#2{\addtotoks@{#2}}
+\xydef@\xytotoks@@toksix@#1{\addtotoks@{\toks9={#1}}}
+\xydef@\smap@{%
+ \begingroup \toks@={}\let\xy@=\xytotoks@ \change@oxy@\xy@
+ \let\xy@@ix@=\xytotoks@@toksix@
+ \afterCOORD{\expandafter\endgroup
+ \expandafter\smapxy@@\expandafter{\the\toks@}\xyFN@\POS@}}
+\xydef@\smapxy@@#1{\xy@@{\edef\smapp@@{\s@bot}\smapxy@i{#1}}}
+\xylet@\smapp@@=\empty
+\xydef@\smapxy@i#1{%
+ \ifnum\smapp@@<\s@top
+ \count@=\smapp@@ \advance\count@\@ne \edef\smapp@@{\the\count@}%
+ \DN@{\csname S@\smapp@@\endcsname #1\relax \smapxy@i{#1}}%
+ \else \let\next@=\relax
+ \fi \next@}
+\xydef@\saveid@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\saveid@}%
+ \else \ifx "\next\DN@"##1"{\xy@{="##1"}{\idfromc@{##1}}\xyFN@\POS@}%
+ \else \ifx :\next\DN@:##1"##2"{\xy@{=:"##2"}{\idfrombase@{##2}}\xyFN@\POS@}%
+ \else\addAT@\ifx\next
+ \addAT@\DN@"##1"{\xy@{=@"##1"}{\idfromstack@{##1}}\xyFN@\POS@}%
+ \else \ifx s\next
+ \DN@ s##1"##2"{\xy@{=s##1"##2"}{\idfroms@{##2}{##1}}\xyFN@\POS@}%
+ \else\addEQ@\ifx\next \let\saveid@COORD@@=\saveid@COORDii
+ \addEQ@\DN@{\xyFN@\saveid@COORD}%
+ \else \let\saveid@COORD@@=\saveid@COORDi \let\next@=\saveid@COORD
+ \fi\fi\fi\fi\fi\fi \next@}
+\xylet@\saveid@COORD@@=\relax
+\xydef@\idfromc@#1{\DN@{#1}%
+ \expandafter\edef\csname Q@\codeof\next@\endcsname{\cfromthec@}}
+\xydef@\idfrombase@#1{\DN@{#1}%
+ \expandafter\edef\csname Q@\codeof\next@\endcsname{\basefromthebase@}}
+\xydef@\idfromstack@#1{%
+ \toks@={\if\sempty@\else
+ \xywarning@{loading on top of non-empty stack}\sinit@ \fi}%
+ \count@=\s@bot \advance\count@\@ne
+ \ifnum\count@>\s@top\else
+ \loop@
+ \expandafter\let\expandafter\next@\csname S@\the\count@\endcsname
+ \expandafter\addtotoks@\expandafter{\next@}%
+ \ifnum\count@<\s@top \advance\count@\@ne \addtotoks@{\spushc@}\repeat@
+ \fi
+ \DN@{#1}\edef\next@##1{%
+ \def\expandafter\noexpand\csname Q@\codeof\next@\endcsname{##1}}%
+ \expandafter\next@\expandafter{\the\toks@}}
+\xydef@\saveid@COORD{%
+ \begingroup \toks@={}\let\xy@=\xytotoks@ \change@oxy@\xy@
+ \let\xy@@ix@=\xytotoks@@toksix@
+ \afterCOORD{\expandafter\saveid@COORDi\expandafter{\the\toks@}}}
+\xydef@\saveid@COORDi#1#2"#3"{\endgroup \xy@@{\idfromxy@{#3}{#1}}\xyFN@\POS@}
+\xydef@\saveid@COORDii#1#2"#3"{\endgroup \xy@@{\idfromcxy@{#3}{#1}}\xyFN@\POS@}
+\xydef@\idfromxy@#1#2{\DN@{#1}%
+ \expandafter\def\csname Q@\codeof\next@\endcsname{#2}}
+\xydef@\idfromcxy@#1#2{\DN@{#1}%
+ \expandafter\edef\csname Q@\codeof\next@\endcsname{\cfromthec@#2}}
+\xydef@\cfromid@#1{\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
+ \expandafter\let\expandafter\next@\csname Q@\nextii@\endcsname
+ \ifx\next@\relax \xyerror@{<pos> \string"\nextii@\string" not defined}{}%
+ \else \expandafter\next@\fi}
+\message{objects,}
+\xydef@\OBJECT@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\OBJECT@}%
+ \else\ifcat A\noexpand\next \let\next@=\OBJECT@letter
+ \else \let\next@=\OBJECT@other \fi\fi \next@}
+\xydef@\OBJECT@letter{%
+ \ifx i\next \DN@ i{\addtotoks@\Invisible@true \xyFN@\OBJECT@}%
+ \else\ifx h\next\DN@ h{\addtotoks@\Hidden@true \xyFN@\OBJECT@}%
+ \else\ifx o\next\DN@ o{\xywarning@{Obsolete o modifier used}\OBJECT@shape{o}}%
+ \else\ifx x\next\DN@ x{\xywarning@{Obsolete x modifier used}\OBJECT@shape{}}%
+ \else\ifx @\next\DN@ @##1##{%
+\xywarning@{Impossible @ (letter) should not be here!!}
+ \OBJECT@@{\dir##1}}%
+ \else \let\next@=\OBJECT@direction
+ \fi\fi\fi\fi\fi \next@}
+\xydef@\OBJECT@other{%
+ \ifx !\next \DN@!{\OBJECT@shift}%
+ \else\addPLUS@\ifx \next \DN@{\OBJECT@change}%
+ \else\addDASH@\ifx \next \DN@{\OBJECT@change}%
+ \else\addEQ@\ifx \next \DN@{\OBJECT@set}%
+ \else\ifx [\next
+ \DN@[##1]{\xy@{[##1]}{\OBJECT@shape{##1}}}%
+ \else\ifx ^\next \let\next@=\OBJECT@direction
+ \else\ifx _\next \let\next@=\OBJECT@direction
+ \else\ifx :\next \let\next@=\OBJECT@direction
+ \else\ifx ?\next
+ \DN@ ?{\xywarning@{\string? modifier used}\xyFN@\OBJECT@direction}%
+ \else\ifx (\next
+ \let\next@=\OBJECT@direction
+ \else\addAT@\ifx\next \addAT@\DN@##1##{\OBJECT@@{\dir##1}}%
+ \else \DN@##1##{\OBJECT@@{##1}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\prevEdge@@{\zeroEdge}
+\xydef@\OBJECT@@#1#2{%
+ \expandafter\def\expandafter\prevEdge@@\expandafter{\the\Edge@c}%
+ \expandafter\Edge@c\expandafter{\objectEdge}%
+ \Invisible@false\Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \gdef\preXY@style@{}\gdef\postXY@style@{}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}%
+ \DN@{#1}\ifx\next@\empty \DNii@{#2}%
+ \ifx\nextii@\empty \DN@{\hbox\bgroup\no@}\else \let\next@=\objectbox \fi\fi
+ \setbox\z@=\next@{#2}\L@c=\Leftness@\wdz@ \R@c=\wdz@ \advance\R@c-\L@c
+ \D@c=\dp\z@ \advance\D@c\ht\z@ \U@c=\Upness@\D@c \advance\D@c-\U@c
+ \R@p=\z@ \L@p=\L@c \U@p=\U@c \advance\U@p-\ht\z@ \D@p=-\U@p
+ \the\toks@\toks@={}\setboxz@h{\kern\R@p \raise\U@p\boxz@}%
+ \checkZeroEdge@
+ \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c \boxz@
+ \OBJECT@x}
+\xydef@\adjustLR@{%
+ \ifdim\zz@\wdz@ \L@c=\z@ \R@c=\z@ \dimen@=\Leftness@\p@
+ \ifdim\dimen@<\z@ \L@c=\dimen@ \R@c=-\L@c
+ \else\ifdim\dimen@>\p@ \L@c=\dimen@ \advance\L@c-\p@ \R@c=-\L@c \fi\fi
+ \else \L@c=\Leftness@\wdz@ \R@c=\wdz@ \advance\R@c-\L@c \fi}
+\xydef@\adjustUD@{\dimen@=\ht\z@ \advance\dimen@\dp\z@
+ \ifdim\zz@\dimen@ \U@c=\z@ \D@c=\z@ \dimen@=\Upness@\p@
+ \ifdim\dimen@<\z@ \U@c=\dimen@ \D@c=-\L@c
+ \else\ifdim\dimen@>\p@ \U@c=\dimen@ \advance\U@c-\p@ \D@c=-\L@c \fi\fi
+ \else \D@c=\dimen@ \U@c=\Upness@\dimen@ \advance\D@c-\U@c \fi}
+\def\checkZeroEdge@{%
+ \expandafter\DN@\expandafter{\the\Edge@c}\def\nextii@{\zeroEdge}%
+ \ifx\next@\nextii@\Edge@c={\rectangleEdge}\fi
+ \DN@{}\def\nextii@{}%
+ \ifdim\zz@\L@c \ifdim\zz@\R@c \ifdim\zz@\U@c \ifdim\zz@\D@c
+ \DN@{\Edge@c={\zeroEdge}}\fi\fi\fi\fi
+ \next@}
+\xydef@\OBJECT@x{\toks@={\egroup\def\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
+ \edef\tmp@{\D@c=\the\D@c \U@c=\the\U@c \L@c=\the\L@c \R@c=\the\R@c
+ \Edge@c={\expandafter\noexpand\the\Edge@c}%
+ \ifInvisible@\noexpand\Invisible@true\else\noexpand\Invisible@false\fi
+ \ifHidden@\noexpand\Hidden@true\else\noexpand\Hidden@false\fi
+ \def\noexpand\Leftness@{\Leftness@}\def\noexpand\Upness@{\Upness@}}%
+ \expandafter\addtotoks@\expandafter{\tmp@}\the\toks@}
+\xynew@{if}\ifInvisible@
+\xynew@{if}\ifHidden@
+\xydef@\Leftness@{}
+\xydef@\Upness@{}
+\xydef@\Drop@@{\styledboxz@}
+\xydef@\Connect@@{}
+\xydef@\objectbox#1{\hbox{$\m@th\objectstyle{#1}$}}
+\xylet@\objectstyle=\textstyle
+\xydef@\object{\hbox\bgroup\resetStyle@\object@}
+\xydef@\object@{%
+ \edef\next@{={\DirectionfromtheDirection@}}\expandafter\toks@\next@
+ \plainxy@ \xyFN@\OBJECT@}
+\xydef@\composite#1#{\hbox\bgroup\composite@{#1}}
+\xydef@\composite@#1#2{%
+ \DN@{#1}\ifx\next@\empty\else\xywarning@{no variants of
+ \string\composite\space allowed}\fi
+ \global\setbox9=\hbox\bgroup
+ \D@p=-\maxdimen \U@p=-\maxdimen \L@p=-\maxdimen \R@p=-\maxdimen
+ \xyFN@\composite@i#2@}
+\xydef@\composite@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@i}%
+ \else\ifx *\next \DN@ *{\xyFN@\composite@i}%
+ \else\ifx @\next \DN@ @{\composite@x}%
+ \xyerror@{<composite> object expected}{}\czeroEdge@
+ \else \DN@{\composite@ii}\fi\fi\fi \next@}
+\xydef@\composite@ii#1#{\composite@iii{#1}}
+\xydef@\composite@iii#1#2{%
+ \setbox\z@=\object#1{#2}%
+ \ifInvisible@ \setboxz@h{}\else
+ \setboxz@h{\kern-\L@c \boxz@}\ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi
+ \ifHidden@\else
+ \ifdim\U@p<\U@c \U@p=\U@c \fi \ifdim\D@p<\D@c \D@p=\D@c \fi
+ \ifdim\R@p<\R@c \R@p=\R@c \fi \ifdim\L@p<\L@c \L@p=\L@c \fi
+ \fi
+ \xyFN@\composite@iv}
+\xydef@\composite@iv{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@iv}%
+ \else \ifx @\next \DN@ @{\composite@x}%
+ \else \let\next@=\composite@i \fi\fi \next@}
+\xydef@\composite@x{%
+ \edef\tmp@{\egroup
+ \D@c=\the\D@p \U@c=\the\U@p \L@c=\the\L@p \R@c=\the\R@p}\tmp@
+ \setboxz@h{\kern\L@c\box9}\ht\z@=\U@c \dp\z@=\D@c
+ \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@
+ \Edge@c={\rectangleEdge}\computeLeftUpness@ \boxz@
+ \OBJECT@x}
+\xydef@\computeLeftUpness@{%
+ \dimen@=\L@c \advance\dimen@\R@c
+ \ifdim\zz@\dimen@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
+ \ifdim\zz@\L@c\else
+ \DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edge@c}%
+ \ifx\next@\nextii@\Edge@c={\rectangleEdge}\fi\fi
+ \else \quotient@\Leftness@\L@c\dimen@ \fi
+ \dimen@=\U@c \advance\dimen@\D@c
+ \ifdim\zz@\dimen@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
+ \ifdim\zz@\U@c\else
+ \DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edge@c}%
+ \ifx\next@\nextii@\Edge@c={\rectangleEdge}\fi\fi
+ \else \quotient@\Upness@\U@c\dimen@ \fi}
+\xydef@\xybox#1{\xy#1\endxy \Edge@c={\rectangleEdge}\computeLeftUpness@}
+\xydef@\OBJECT@shift{%
+ \let\xy@=\xytotoks@ \afterVECTORorEMPTY
+ {\OBJECT@shift@}%
+ {\addtotoks@{\X@c=-\L@c \advance\X@c\R@p \advance\X@c\L@p \Y@c=\U@p}%
+ \OBJECT@shift@}}
+\xydef@\OBJECT@shift@{%
+ \addtotoks@{\advance\U@p-\Y@c
+ \advance\L@c\X@c \advance\R@c-\X@c \advance\D@c\Y@c \advance\U@c-\Y@c
+ \computeLeftUpness@}%
+ \let\xy@=\oxy@ \xyFN@\OBJECT@}
+\xylet@\objectmargin@=\jot
+\xylet@\objectwidth@=\z@
+\xylet@\objectheight@=\z@
+\xydef@\objectmargin{\afterADDOP{\Addop@@\objectmargin@}}
+\xydef@\objectwidth{\afterADDOP{\Addop@@\objectwidth@}}
+\xydef@\objectheight{\afterADDOP{\Addop@@\objectheight@}}
+\xydef@\OBJECT@change{%
+ \afterADDOP{%
+ \addEQ@\ifx \next
+ \addtotoks@{\X@c=\D@c \advance\X@c\U@c \Y@c=\L@c \advance\Y@c\R@c}%
+ \else
+ \addtotoks@{\X@c=\objectmargin@ \advance\X@c\X@c \Y@c=\X@c}%
+ \fi
+ \let\xy@=\xytotoks@
+ \afterVECTORorEMPTY\OBJECT@change@\OBJECT@change@}}
+\xydef@\OBJECT@set{%
+ \afterADDOP{%
+ \let\xy@=\xytotoks@ \afterVECTORorEMPTY\OBJECT@change@
+ {\addtotoks@{\X@c=\objectwidth@ \Y@c=\objectheight@}\OBJECT@change@}}}
+\xydef@\OBJECT@change@{%
+ \addtotoks@{\advance\R@c\L@c \advance\R@p-\L@c \let\tmp@=\R@c}%
+ \expandafter\addtotoks@\expandafter{\Addop@@\tmp@\X@c\R@c=\tmp@
+ \L@c=\Leftness@\R@c \advance\R@p\L@c \advance\R@c-\L@c}%
+ \addtotoks@{\advance\D@c\U@c \let\tmp@=\D@c}%
+ \expandafter\addtotoks@\expandafter{\Addop@@\tmp@\Y@c\D@c=\tmp@
+ \U@c=\Upness@\D@c \advance\D@c-\U@c}%
+ \let\xy@=\oxy@ \xyFN@\OBJECT@}
+\xydef@\afterADDOP#1{\def\afterADDOP@{#1}\xyFN@\ADDOP@}
+\xylet@\afterADDOP@=\empty
+\xydef@\ADDOP@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ADDOP@}%
+ \else\addPLUS@\ifx \next \addPLUS@\DN@{\xyFN@\ADDOP@plus}%
+ \else\addDASH@\ifx \next \addDASH@\DN@{\xyFN@\ADDOP@minus}%
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
+ \else
+ \DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
+ \fi\fi\fi\fi \next@}
+\xydef@\ADDOP@plus{%
+ \addEQ@\ifx \next
+ \addEQ@\DN@{\def\Addop@@{\Addop@0+<}\afterADDOP@}%
+ \else
+ \DN@{\def\Addop@@{\Addop@1+=}\afterADDOP@}%
+ \fi \next@}
+\xydef@\ADDOP@minus{%
+ \addEQ@\ifx \next
+ \addEQ@\DN@{\def\Addop@@{\Addop@0+>}\afterADDOP@}%
+ \else
+ \DN@{\def\Addop@@{\Addop@1-=}\afterADDOP@}%
+ \fi \next@}
+\xydef@\Addop@#1#2#3#4#5{%
+ \dimen@=#4\relax \edef#4{\the\dimen@}%
+ \dimen@=#1\dimen@ \advance\dimen@#2#5\relax
+ \ifdim\dimen@#3#4\else \edef#4{\the\dimen@}\fi
+ \ifx\xy@\xyinitial@\else \DN@##1{\xy@@{\edef#4{##1}\checkZeroEdge@}}%
+ \expandafter\next@\expandafter{#4}\fi}
+\xydef@\objectEdge{\rectangleEdge}
+\xydefcsname@{shape [r]}{\advance\U@p\D@c \centerobject@
+ \ifdim\L@c>\D@c
+ \advance\R@c\L@c \L@c=.5\U@c \advance\L@c.5\D@c \advance\R@c-\L@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [l]}{\advance\U@p\D@c \centerobject@
+ \ifdim\L@c>\D@c
+ \advance\L@c\R@c \R@c=.5\U@c \advance\R@c.5\D@c \advance\L@c-\R@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [u]}{\advance\U@p\D@c \centerobject@
+ \ifdim\D@c>\L@c
+ \advance\U@c\D@c \D@c=.5\L@c \advance\D@c.5\R@c \advance\U@c-\D@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [d]}{\advance\U@p\D@c \centerobject@
+ \ifdim\D@c>\L@c
+ \advance\D@c\U@c \U@c=.5\L@c \advance\U@c.5\R@c \advance\D@c-\U@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [c]}{\advance\U@p\D@c \centerobject@ \advance\U@p-\D@c}
+\xydef@\centerobject@{%
+ \advance\D@c\U@c \D@c=.5\D@c \U@c=\D@c \advance\L@c\R@c \L@c=.5\L@c \R@c=\L@c}
+\xydef@\OBJECT@shape#1{\DN@{shape [#1]}%
+ \expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
+ \ifx\nextii@\relax\DN@{style [#1]}%
+ \expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
+ \ifx\nextii@\relax \DN@{\OBJECT@shapei[#1]}%
+ \else\DN@{\nextii@\xyFN@\OBJECT@}\fi
+ \else \expandafter\addtotoks@\expandafter{\nextii@}%
+ \DN@{\xyFN@\OBJECT@}%
+ \fi \next@}
+\xydefcsname@{shape []}{\the\Edge@c5\relax}%
+\xydefcsname@{shape [Outer]}{\the\Edge@c5\relax}%
+\xydefcsname@{shape [Inner]}{\the\Edge@c4\relax}%
+\xydefcsname@{shape [o]}{\Edge@c={\circleEdge}\the\Edge@c5\relax
+ \Edge@c={\circleEdge}\def\prevEdge@@{\circleEdge}}
+\xydefcsname@{shape [.]}{\czeroEdge@}
+\def\OBJECT@shapei[#1#2]{\DN@{shape [#1...]}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax\DN@{*stylechar@#1@}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax\DNii@{shape [#1#2]}%
+ \xywarning@{illegal [<shape>] ignored: \codeof\nextii@\space not defined}%
+ \DN@{\xyFN@\OBJECT@}%
+ \else% Delete this: \expandafter\addtotoks@\expandafter{\next{#2}}%
+ \DN@{\next{#2}\xyFN@\OBJECT@}%
+ \fi
+ \else
+\expandafter\addtotoks@\expandafter{\next{#2}}\DN@{\next{#2}\xyFN@\OBJECT@}%
+ \fi \next@}
+\xydef@\preXY@style@{}
+\xydef@\postXY@style@{}
+\xydef@\resetStyle@{\gdef\preXY@style@{}\gdef\postXY@style@{}}
+\xynew@{toks}{\styletoks@}
+\xydef@\addtostyletoks@#1{%
+ \expandafter\styletoks@\expandafter{\the\styletoks@#1}}
+\xydef@\styledboxz@{%
+ \xypre@Style@@
+ \boxz@
+ \xypost@Style@@}
+\xydef@\xypre@Style@{\styletoks@={}\saveXyStyle@\preXY@style@
+ \expandafter\DN@\expandafter{\the\styletoks@}%
+ \ifx\next@\empty \DN@{\let\xypre@Style@@=\relax
+ \let\xypost@Style@@=\relax \xypre@skipStyle@}%
+ \else
+ \let\xypre@Style@@=\relax \let\xypost@Style@@=\xypost@Style@
+ \DN@{\expandafter\xydoprestyles@\expandafter{\the\styletoks@}}%
+ \fi \next@ }
+\xydef@\xypost@Style@{\styletoks@={}\postXY@style@
+ \expandafter\xydopoststyles@\expandafter{\the\styletoks@}%
+ \let\xypost@Style@@=\relax \let\xypre@Style@@=\xypre@Style@ }
+\xydef@\xypre@skipStyle@#1\xypost@Style@@{#1\relax
+ \let\xypre@Style@@=\xypre@Style@ }
+\xydef@\xydoprestyles@@{\literal@}
+\xydef@\xydopoststyles@@{\literal@}
+\xylet@\xydoprestyles@=\xydoprestyles@@
+\xylet@\xydopoststyles@=\xydopoststyles@@
+\xydef@\modXYstyle@{%
+ \ifx\xy@style@\empty\resetStyle@\fi \checkXyStyle@
+ \expandafter\expandafter\expandafter\DN@
+ \expandafter\expandafter\expandafter{\preXYstyle@@}%
+ \ifx\next@\empty\else\DN@{\modXYstyle@@}\fi \next@ }
+\xydef@\modXYstyle@@{%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\preStyle@@}%
+ \DN@##1{\expandafter\gdef\expandafter\preXY@style@\expandafter{%
+ \preXY@style@ ##1}}\expandafter\next@\expandafter{\tmp@}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\postStyle@@}%
+ \DN@##1{\expandafter\gdef\expandafter\postXY@style@\expandafter{%
+ \tmp@ ##1}}\expandafter\next@\expandafter{\postXY@style@}}
+\xydef@\xy@style@{}
+\xydef@\checkXyStyle@{\ifx\xy@style@\empty\resetStyle@\fi
+ \let\xy@style@=\relax}
+\xydef@\preStyle@@{}
+\xydef@\postStyle@@{}
+\xydef@\preXYstyle@@{\relax}
+\xydef@\loadxystyle@{%
+ \let\xypre@Style@@=\xypre@Style@ \def\preXYstyle@@{\preStyle@@}}
+\loadxystyle@
+\xydef@\Unloadstyle@{%
+ \let\xypre@Style@@=\relax \let\xypost@Style@@=\relax
+ \def\preXYstyle@@{\relax}}
+\xydefcsname@{shape [=...]}#1{\checkXyStyle@ \addtotoks@{\xynamestyle@{#1}}}
+\xydef@\xynamestyle@#1{\checkXyStyle@
+ \expandafter\DNii@\expandafter{\csname shape [#1]\endcsname}%
+ \expandafter\ifx\nextii@\relax
+ \else\xywarning@{Redefining style [#1]}\fi
+ \expandafter\xynamestyle@@\csname shape [#1]\endcsname }
+\xydef@\xynamestyle@@#1{%
+ \expandafter\def\expandafter\tmp@\expandafter{\preXY@style@}%
+ \DN@##1{\def\tmp@{\checkXyStyle@\gdef\preXY@style@{##1}}}%
+ \expandafter\next@\expandafter{\preXY@style@}%
+ \DN@##1{\expandafter\gdef\expandafter#1\expandafter{\tmp@
+ \gdef\postXY@style@{##1}}}%
+ \expandafter\next@\expandafter{\postXY@style@}\DN@{}}
+\xydef@\prevXypreStyle@@{}
+\xydef@\prevXypostStyle@@{}
+\xydef@\saveXyStyle@{\expandafter
+ \def\expandafter\prevXypreStyle@@\expandafter{\preXY@style@}%
+ \expandafter\def\expandafter\prevXypostStyle@@\expandafter{%
+ \postXY@style@}}
+\xydef@\recoverXyStyle@{\expandafter
+ \gdef\expandafter\preXY@style@\expandafter{\prevXypreStyle@@}%
+ \expandafter\gdef\expandafter\postXY@style@\expandafter{%
+ \prevXypostStyle@@}}
+\xydef@\newxystyle#1#2#3{%
+ \DN@{#3}\ifx\next@\empty
+ \xydefcsname@{shape [#1]}{\csname xyshape@#1@\endcsname}%
+ \else \expandafter\def\csname shape [#1]\endcsname{%
+ \csname xyshape@#1@\endcsname}\fi
+ \DN@{#2}\ifx\next@\empty
+ \expandafter\def\csname xyshape@#1@\endcsname{%
+ \xyundefinedStyle@{#1}{}@@}%
+ \else \expandafter\def\csname xyshape@#1@\endcsname{#2}\fi}
+\xydef@\xyundefinedStyle@#1#2@@{%
+ \xywarning@{style #1 not defined, nothing to apply}}
+\xydef@\applyFIFOstyle@#1#2#3#4{\bgroup
+ \styletoks@={\egroup\gdef\preXY@style@}%
+ \expandafter\toks@\expandafter{\preXY@style@}%
+ \expandafter\addtotoks@\expandafter{\expandafter#1\expandafter{#2}}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}%
+ \gdef\postXY@style@}%
+ \expandafter\toks@\expandafter{\expandafter#3\expandafter{#4}}%
+ \expandafter\addtotoks@\expandafter{\postXY@style@}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}}%
+ \the\styletoks@ }
+\xydef@\applyLIFOstyle@#1#2#3#4{\bgroup
+ \styletoks@={\egroup\gdef\preXY@style@}%
+ \expandafter\toks@\expandafter{\expandafter#1\expandafter{#2}}%
+ \expandafter\addtotoks@\expandafter{\preXY@style@}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}%
+ \gdef\postXY@style@}%
+ \expandafter\toks@\expandafter{\postXY@style@}%
+ \expandafter\addtotoks@\expandafter{\expandafter#3\expandafter{#4}}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}}%
+ \the\styletoks@ }
+\xydef@\OBJECT@direction{\afterDIRECTIONorEMPTY{%
+ \edef\next@{{\DirectionfromtheDirection@}}\expandafter\addtotoks@\next@
+ \xyFN@\OBJECT@}%
+ {\xyFN@\OBJECT@}}
+\xydef@\afterDIRECTIONorEMPTY#1#2{%
+ \DN@##1{\def\afterDIRECTION@{\def\afterDIRECTION@{##1}%
+ \ifDIRECTIONempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
+ \expandafter\next@\expandafter{\afterDIRECTION@}%
+ \xyFN@\DIRECTION@}
+\xylet@\afterDIRECTION@=\empty
+\xynew@{if}\ifDIRECTIONempty@
+\xydef@\DIRECTION@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\DIRECTION@}%
+ \else\ifx v\next \DN@ v{\DIRECTION@v}%
+ \else\ifx \bgroup\next \let\next@=\DIRECTION@group
+ \else\ifx (\next \DN@({\xyFN@\DIRECTION@open}%
+ \else
+ \DN@{\count@=8
+ \afterDIAG{\ifnum\count@=8 \DN@{\DIRECTIONempty@true \xyFN@\DIRECTION@i}%
+ \else \DN@{\xy@@{\dimen@=\xydashl@}\Directionfromdiag@}\fi \next@}}%
+ \fi\fi\fi\fi \next@}
+\xydef@\DIRECTION@open{%
+ \ifx *\next \DN@*##1*){\DIRECTION@group{##1}}%
+ \else \DN@{\xyerror@{(* <pos> *) expected}{} \xyFN@\DIRECTION@i}%
+ \fi \next@}
+\def\afterDIAG#1{\def\afterDIAG@{#1}\xyFN@\DIAG@}
+\xydef@\DIAG@{%
+ \ifx d\next \DN@ d{\count@=1 \xyFN@\DIAG@@}%
+ \else\ifx r\next \DN@ r{\count@=3 \xyFN@\DIAG@@}%
+ \else\ifx u\next \DN@ u{\count@=5 \xyFN@\DIAG@@}%
+ \else\ifx l\next \DN@ l{\count@=7 \xyFN@\DIAG@@}%
+ \else \let\next@=\afterDIAG@
+ \fi\fi\fi\fi \next@}
+\xydef@\DIAG@@{\ifcase\count@ \or
+ \DIAG@@@ l0r2\or\or \DIAG@@@ d2u4\or\or \DIAG@@@ r4l6\or\or \DIAG@@@ u6d0%
+ \else\xybug@{impossible <diag> number}\fi
+ \next@}
+\xydef@\DIAG@@@#1#2#3#4{%
+ \ifx #1\next \count@=#2\DN@#1{\afterDIAG@}%
+ \else \ifx #3\next \count@=#4\DN@#3{\afterDIAG@}%
+ \else \let\next@=\afterDIAG@ \fi\fi}
+\xydef@\Directionfromdiag@{\ifcase\count@
+ \xy@@{\dlDirection@\dimen@}%
+ \or \xy@@{\dDirection@\dimen@}%
+ \or \xy@@{\drDirection@\dimen@}%
+ \or \xy@@{\rDirection@\dimen@}%
+ \or \xy@@{\urDirection@\dimen@}%
+ \or \xy@@{\uDirection@\dimen@}%
+ \or \xy@@{\ulDirection@\dimen@}%
+ \or \xy@@{\lDirection@\dimen@}%
+ \or
+ \else\xybug@{impossible <diag>}\fi
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}
+\xydef@\DIRECTION@v{%
+ \xy@{v}{\enter@{\cfromthec@ \X@origin=\the\X@origin \Y@origin=\the\Y@origin
+ \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \X@origin=\z@ \Y@origin=\z@}%
+ \afterVECTORorEMPTY
+ {\xy@@{\X@p=\z@ \Y@p=\z@ \setupDirection@ \leave@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ {\xy@@\leave@ \xyerror@{<vector> expected after v}{}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}}
+\xydef@\DIRECTION@group#1{%
+ \xy@@{\begingroup}\xy@@ix@{#1}\xy@@{\plainxy@\expandafter\POS\the\toks9\relax
+ \setupDirection@\edef\next@{\endgroup \DirectionfromtheDirection@}\next@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}
+\xydef@\DIRECTION@i{%
+ \ifx ^\next \DN@ ^{\xy@^{\aboveDirection@\xydashl@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ \else\ifx _\next \DN@ _{\xy@_{\belowDirection@\xydashl@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ \else\ifx :\next \DN@ :{%
+ \xy@{:}{\enter@{\cfromthec@ \basefromthebase@ \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \X@origin=\z@ \Y@origin=\z@
+ \X@xbase=\cosDirection\xydashl@ \Y@xbase=\sinDirection\xydashl@
+ \X@ybase=-\Y@xbase \Y@ybase=\X@xbase}%
+ \afterVECTORorEMPTY
+ {\xy@@{\X@p=\z@ \Y@p=\z@ \setupDirection@ \leave@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ {\xy@@\leave@ \xyerror@{<vector> expected after :}{}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}}%
+ \else
+ \let\next@=\afterDIRECTION@
+ \fi\fi\fi \next@}
+\message{decorations;}
+\xydef@\drop#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
+ \xy@{\drop#1{##1}}{\expandafter\drop@\the\toks9 }\ignorespaces}\next@}
+\xydef@\connect#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
+ \xy@{\connect#1{##1}}{\expandafter\connect@\the\toks9 }\ignorespaces}\next@}
+\xydef@\preconnect#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
+ \xy@{\connect#1{##1}}{\expandafter\preconnect@\the\toks9 }\ignorespaces}\next@}
+\xydef@\save{\relax\saveC}
+\xydef@\saveC{\xy@\save\save@ \POS}
+\xydef@\save@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}}
+\xydef@\restore{\xy@\restore\leave@ \ignorespaces}
+\xydef@\xyecho{%
+ \xy@\xyecho{\let\xy@=\xyecho@ \message{\string\xyecho}}\POS}
+\xydef@\xyecho@#1#2{{\def\1{#1}\ifx\1\empty\else\message{\codeof\1}\fi}%
+ \oxy@{#1}{#2}}
+\xydef@\xyverbose{%
+ \xy@\xyverbose{\let\xy@=\xyverbose@
+ \W@{Xy: \string\xyverbose\xytracelineno@}}\POS}
+\xydef@\xyverbose@#1#2{%
+ {\def\1{#1}\ifx\1\empty\else\W@{Xy: \codeof\1\xytracelineno@}\fi}%
+ \oxy@{#1}{#2}}
+\xydef@\xytracing{%
+ \xy@\xytracing{\let\xy@=\xytracing@
+ \W@{Xy TRACE: \string\xytracing\xytracelineno@}\xystatus@:}\POS}
+\xydef@\xytracing@#1#2{{\def\1{#1}\def\2{#2}%
+ \W@{Xy TRACE: \codeof\1 {\codeof\2}\xytracelineno@}}\oxy@{#1}{#2}\xystatus@:}
+\xydef@\xystatus@#1{\xystatus@cp{#1}%
+ \W@{#1 d=<\the\d@X,\the\d@Y>
+ Direction=\the\Direction=\string(\cosDirection,\sinDirection\string)}%
+ \W@{#1 base=<\the\X@origin,\the\Y@origin>+%
+ <\the\X@xbase,\the\Y@xbase>x+<\the\X@ybase,\the\Y@ybase>y}%
+ \W@{#1 min/max=<\the\X@min,\the\Y@min>/<\the\X@max,\the\Y@max>
+ S=\the\csp@}}
+\xydef@\xystatus@cp#1{%
+ \W@{#1 c=<\the\X@c,\the\Y@c> \expandafter\string\the\Edge@c
+ \string[\the\L@c+\the\R@c,\the\D@c+\the\U@c\string]
+ \ifInvisible@ I\fi\ifHidden@ H\fi}%
+ \W@{#1 p=<\the\X@p,\the\Y@p> \expandafter\string\the\Edge@p
+ \string[\the\L@p+\the\R@p,\the\D@p+\the\U@p\string]}}
+\xydef@\xystatus@c#1{%
+ \W@{#1<\the\X@c,\the\Y@c> \expandafter\string\the\Edge@c
+ \string[\the\L@c+\the\R@c,\the\D@c+\the\U@c\string]}}
+\xydef@\xyquiet{\xy@\xyquiet{\let\xy@=\oxy@}}
+\xydef@\xyignore#1{\xy@\xyignore{\xyignore@{#1}}\ignorespaces}
+\xydef@\xyignore@#1{{\let\xy@=\xyeat@ \change@oxy@\xy@ \POS#1\relax}}
+\xydef@\xyeat@#1#2{}
+\xydef@\xycompile@@{\jobname-}
+\xydef@\xycompileno@@{0}
+\xydef@\CompilePrefix#1{%
+ \def\xycompile@@{#1}\xdef\xycompile@@{\codeof\xycompile@@}%
+ \xdef\xycompileno@@{0}}
+\xydef@\xycompile{%
+ \count@=\xycompileno@@ \advance\count@\@ne
+ \xdef\xycompileno@@{\ifnum10>\count@ 0\fi \the\count@}%
+ \edef\next{\noexpand\xycompileto{\xycompile@@\xycompileno@@}}\next}
+\xylet@\compilename@@=\empty
+\xylet@\xyrecompile@@=\relax
+\xydef@\xycompileto#1#2{%
+ \if\inxy@ \DN@{\xy@@{\nter@{}}}%
+ \else \DN@{\xy \xy@@{\nter@{\endxy}}}\fi \next@
+ \ifxysaving@ \xyerror@{Compilations can not be nested}{}\fi
+ \DN@{#1}\edef\compilename@@{\codeof\next@}\DNii@{#2}%
+ \def\xyrecompile@@{recompiling TRUNCATED}%
+ \expandafter\xyinputorelse@@\expandafter{\compilename@@.xyc}%
+ {\def\xyrecompile@@{compiling to}}%
+ \ifx\xyrecompile@@\relax \else \expandafter\xyrecompile@ \fi
+ \xy@@\leave@ \ignorespaces}
+\xydef@\xyrecompile@{%
+ \message{(\xyrecompile@@\space\string`\compilename@@.xyc\string'}%
+ \DN@{\immediate\openout\xywrite@=}\expandafter\next@\compilename@@.xyc
+ \immediate\write\xywrite@{%
+ \string\xycompiled{\compilename@@}%
+ {\the\year/\the\month/\the\day\string:\the\time\xytracelineno@}%
+ {Xy-pic \xyversion}\xycomment@}%
+ \immediate\write\xywrite@{{\codeof\nextii@}\relax}%
+ {\xysaving@ \expandafter\POS\nextii@ \relax}%
+ \immediate\write\xywrite@{\string\xyendcompiled}%
+ \immediate\closeout\xywrite@ \message{done)}%
+ \expandafter\input\compilename@@.xyc
+ \outlines@@\writeoutline@\writeoutline@}
+\xydef@\xysaving@{\let\xy@=\xysave@ \change@oxy@\xy@
+ \let\xy@@ix@=\xysave@@toksix@ \xysaving@true}
+\xynew@{if}\ifxysaving@ \xysaving@false
+\xydef@\xysave@#1#2{{\DN@{{#1}{#2}}%
+ \immediate\write\xywrite@{\string\xy@\codeof\next@\xycomment@}}}
+\xydef@\xysave@@toksix@#1{{\DN@{{#1}}%
+ \immediate\write\xywrite@{\string\xy@@ix@\codeof\next@\relax}}}
+\xywarnifdefined\xycomment@
+{\catcode`\%=12 \catcode`\(=1 \catcode`\)=2 \gdef\xycomment@(%)}
+\xydef@\xycompiled#1#2#3#4{\DN@{#1}\edef\next@{\codeof\next@}%
+ \ifx\next@\compilename@@\else
+ \xywarning@{This file does not contain the result of
+ \string\xycompileto{\compilename@@}{...}^^J%
+ but of \string\xycompileto{\next@}}\fi
+ \edef\next{Xy-pic \xyversion}\DN@{#3}\ifx\next\next@
+ \DN@{#4}\ifx\next@\nextii@ \xycatcodes \outlines@@\relax\readoutline@
+ \else \def\xyrecompile@@{recompiling to}\endinput \fi
+ \else \def\xyrecompile@@{Xy-pic version change - recompiling}\endinput \fi}
+\xydef@\xyendcompiled{\let\xyrecompile@@=\relax \xyuncatcodes\endinput}
+\xydef@\CompileFixPoint#1{%
+ \expandafter\ifx\csname#1FIX@@\endcsname\relax
+ \expandafter\xdef\csname#1FIX@@\endcsname{\xycompileno@@}%
+ \else
+ \xdef\xycompileno@@{\csname#1FIX@@\endcsname}\fi}
+\xydef@\outlines@no#1#2{}
+\xydef@\outlines@make#1#2{#1}
+\xydef@\outlines@only#1#2{#2}
+\xylet@\outlines@@=\outlines@no
+\xylet@\writeoutline@@=\relax
+\xylet@\readoutline@@=\relax
+\xydef@\MakeOutlines{\let\outlines@@=\outlines@make}
+\xydef@\OnlyOutlines{\xywarning@{Compiled pictures only shown as outlines}%
+ \let\outlines@@=\outlines@only}
+\xydef@\ShowOutlines{\let\readoutline@@=\typesetoutline@}
+\xydef@\NoOutlines{\let\outlines@@=\outlines@no}
+\xydef@\writeoutline@{%
+ \DN@{\immediate\openout\xywrite@=}\expandafter\next@\compilename@@.xyd
+ \immediate\write\xywrite@{\xycomment@\space\compilename@@.xyd}
+ \immediate\write\xywrite@{%
+ \string\X@min=\the\X@min \string\X@max=\the\X@max
+ \string\Y@min=\the\Y@min \string\Y@max=\the\Y@max \string\relax}%
+ \writeoutline@@
+ \immediate\closeout\xywrite@}
+\xynew@{if}\ifoutlineread@
+\xydef@\readoutline@{\outlineread@true
+ \expandafter\xyinputorelse@@\expandafter{\compilename@@.xyd}%
+ {\def\xyrecompile@@{outline missing - recompiling to}\outlineread@false}%
+ \ifoutlineread@ \readoutline@@
+ \writeoutline@\expandafter\xyendcompiled\fi}
+\xydef@\typesetoutline@{%
+ \xy@@{\czeroEdge@ \U@p=\z@ \D@p=\z@ \L@p=\z@ \R@p=\z@ \Edge@p={\zeroEdge}%
+ \X@p=\X@min \Y@p=\Y@min \X@c=\X@min \Y@c=\Y@max \connect@\dir{.}%
+ \X@p=\X@c \Y@p=\Y@c \X@c=\X@max \Y@c=\Y@max \connect@\dir{.}%
+ \X@p=\X@c \Y@p=\Y@c \X@c=\X@max \Y@c=\Y@min \connect@\dir{.}%
+ \X@p=\X@c \Y@p=\Y@c \X@c=\X@min \Y@c=\Y@min \connect@\dir{.}}}
+\message{kernel objects:}
+\message{directionals,}
+\xydef@\dir{\hbox\bgroup\xyFN@\dir@i}
+\xydef@\dir@i{\ifx *\next \DN@*{\resetStyle@\object@}%
+ \else \let\next@=\dir@ii \fi \next@}
+\xydef@\dir@ii#1#{\dir@{#1}}
+\xydef@\dir@#1#2{\DN@{dir#1{#2}}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax \DN@{dir{#2}}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax \DN@{\dir#1{#2}}%
+ \xyerror@{illegal <dir>: \codeof\next@\space not defined}{}%
+ \let\next=\no@ \fi\fi \next}
+\xydefcsname@{dir{}}{\no@}
+\xyletcsnamecsname@{dir0{}}{dir{}}
+\xyletcsnamecsname@{dir1{}}{dir{}}
+\xyletcsnamecsname@{dir^{}}{dir{}}
+\xyletcsnamecsname@{dir_{}}{dir{}}
+\xyletcsnamecsname@{dir2{}}{dir{}}
+\xyletcsnamecsname@{dir3{}}{dir{}}
+\xyletcsnamecsname@{dir{ }}{dir{}}
+\xydef@\no@{\egroup \czeroEdge@
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\setbox\z@=\copy\voidb@x}\def\Connect@@{\no@@}}
+\xydefcsname@{dir1{-}}{\line@}
+\xydefcsname@{dir2{-}}{\line@ \double@\xydashh@}
+\xydefcsname@{dir3{-}}{\line@ \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{-}}{dir{}}
+\xyletcsnamecsname@{dir{-}}{dir1{-}}
+\xyletcsnamecsname@{dir{=}}{dir2{-}}
+\xydef@\line@{\dimen@=\sd@Y\sinDirection\xydashl@
+ \ifnum\SemiDirectionChar<31 \D@c=\z@ \U@c=\dimen@ \DN@{\d@Y<\z@}%
+ \else\ifnum\SemiDirectionChar<64 \D@c=\dimen@ \U@c=\z@ \DN@{\z@<\d@Y}%
+ \else\ifnum\SemiDirectionChar<96 \D@c=\dimen@ \U@c=\z@ \DN@{\d@X<\z@}%
+ \else \D@c=\z@ \U@c=\dimen@ \DN@{\d@X<\z@}\fi\fi\fi
+ \setboxz@h{\line@@}\ht\z@=\U@c \dp\z@=\D@c
+ \L@c=\z@ \R@c=\wdz@
+ \ifdim\next@ \dimen@=\R@c \R@c=\L@c \L@c=\dimen@
+ \dimen@=\U@c \U@c=\D@c \D@c=\dimen@ \advance\dimen@-\U@c
+ \lower\dimen@\boxz@
+ \else \boxz@ \fi
+ \edef\tmp@{\egroup \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c}%
+ \tmp@
+ \Edge@c={\rectangleEdge}%
+ \ifdim\z@<\U@c \def\Upness@{1}\else \def\Upness@{0}\fi
+ \ifdim\z@<\L@c \def\Leftness@{1}\else \def\Leftness@{0}\fi
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\solid@}}
+\xydef@\line@@{{\xydashfont\SemiDirectionChar\/}}
+\xydef@\solid@{%
+ \checkXy@rules@\solidhrule@\solidvrule@{\straight@\solidSpread@}}
+\xydef@\checkXy@rules@#1#2#3{%
+ \dimen@=\Y@c \advance\dimen@-\Y@p
+ \ifjusthvtest@.05pt>\ifdim\dimen@<\z@-\fi\dimen@ \DN@{#1}%
+ \else \dimen@=\X@c \advance\dimen@-\X@p
+ \ifjusthvtest@.05pt>\ifdim\dimen@<\z@-\fi\dimen@ \DN@{#2}%
+ \else \DN@{#3}\fi\fi \next@}
+\xydef@\solidSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi}
+\xylet@\ifjusthvtest@=\ifdim
+\xydef@\NoRules{\let\ifjusthvtest@=\iffalse}
+\xydef@\UseRules{\let\ifjusthvtest@=\ifdim}
+\xydef@\solidvrule@{\no@@ \solidvrule@typeset \ifHidden@\else\noinsert@\fi
+ \solidvrule@pre}
+\xydef@\solidvrule@pre{%
+ \def\Cbreak@@{%
+ \connectRestore@ \swap@\lastbreak@@\swap@
+ \solidvrule@typeset \edef\lastbreak@@{\cfromthec@}\Creset@@}%
+ \def\Clast@@{%
+ \connectRestore@ \Creset@@\swap@\lastbreak@@\swap@
+ \solidvrule@typeset \Creset@@ \edef\lastbreak@@{\cfromthep@}}%
+}
+\xydef@\solidvrule@typeset{%
+ \ifInvisible@ \let\next@=\relax \else \let\next@=\solidvrule@typeset@ \fi
+ \checkoverlap@@ \next@}
+\xydef@\solidvrule@typeset@{{%
+ \advance\X@c\X@p \X@c=.5\X@c \X@p=\X@c
+ \advance\X@c-.5\xydashw@ \advance\X@p.5\xydashw@
+ \ifdim\Y@c<\Y@p \advance\Y@c\U@c \advance\Y@p-\D@p
+ \else \swapdimen@\Y@c\Y@p \advance\Y@c\U@p \advance\Y@p-\D@c \fi
+ \Droprule@}}
+\xydef@\solidhrule@{\no@@ \solidhrule@typeset \ifHidden@\else\noinsert@\fi
+ \solidhrule@pre}
+\xydef@\solidhrule@pre{%
+ \def\Cbreak@@{%
+ \connectRestore@ \swap@\lastbreak@@\swap@
+ \solidhrule@typeset \edef\lastbreak@@{\cfromthec@}\Creset@@}%
+ \def\Clast@@{%
+ \connectRestore@ \Creset@@\swap@\lastbreak@@\swap@
+ \solidhrule@typeset \Creset@@ \edef\lastbreak@@{\cfromthep@}}%
+}
+\xydef@\solidhrule@typeset{%
+ \ifInvisible@ \let\next@=\relax \else \let\next@=\solidhrule@typeset@ \fi
+ \checkoverlap@@ \next@}
+\xydef@\solidhrule@typeset@{{%
+ \ifdim\X@c<\X@p \advance\X@c\R@c \advance\X@p-\L@p
+ \else \swapdimen@\X@c\X@p \advance\X@c\R@p \advance\X@p-\L@c \fi
+ \advance\Y@c\Y@p \Y@c=.5\Y@c \Y@p=\Y@c
+ \advance\Y@c-.5\xydashw@ \advance\Y@p.5\xydashw@
+ \Droprule@}}
+\xydef@\Droprule@{\advance\X@p-\X@c
+ \setboxz@h{\kern\X@c \vrule width\X@p depth-\Y@c height\Y@p}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ \Drop@@}
+\xydef@\zerodot{\copy\zerodotbox@}
+\xydefcsname@{dir1{.}}{\point@}
+\xydefcsname@{dir2{.}}{\point@ \double@\xydashh@}
+\xydefcsname@{dir3{.}}{\point@ \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{.}}{dir{}}
+\xyletcsnamecsname@{dir{.}}{dir1{.}}
+\xyletcsnamecsname@{dir{:}}{dir2{.}}
+\xydef@\point@{\pointlike@\zerodot\p@}
+\xydef@\pointlike@#1#2{%
+ \setboxz@h{#1}\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@\egroup
+ \def\Leftness@{.5}\def\Upness@{.5}\ctipEdge@
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@{#2}}}}
+\xydef@\dottedSpread@#1{%
+ \dimen@=#1\relax \DN@{\A@=2\A@ \B@=2\B@ \dottedSpread@i}%
+ \A@=\sd@X\cosDirection\dimen@ \B@=\sd@Y\sinDirection\dimen@
+ \dimen@=\A@ \advance\dimen@\B@
+ \dimen@ii=\sd@X\d@X \advance\dimen@ii\sd@Y\d@Y
+ \ifdim\dimen@>\dimen@ii \DN@{\count@@=\z@}\fi
+ \next@}
+\xydef@\dottedSpread@i{%
+ \global\setbox8=\hbox to\A@{\hss
+ \kern.5\A@\box\lastobjectbox@\kern.5\A@\hss}\dp8=.5\B@ \ht8=.5\B@
+ \advance\d@X\sd@X\A@ \advance\d@Y\sd@Y\B@
+ \advance\X@c\sd@X.5\A@ \advance\Y@c\sd@Y.5\B@
+ \ifdim\sd@Y\d@Y<\sd@X\d@X \dimen@=\sd@X\d@X
+ \ifdim\zz@\A@\else \divide\dimen@\A@ \fi \count@@=\dimen@
+ \else \dimen@=\sd@Y\d@Y
+ \ifdim\zz@\B@\else \divide\dimen@\B@ \fi \count@@=\dimen@
+ \fi \advance\count@@\@ne}
+\xydefcsname@{dir1{~}}{\squiggle@}
+\xydefcsname@{dir2{~}}{\squiggle@ \double@\xybsqlh@}
+\xydefcsname@{dir3{~}}{\squiggle@ \triple@\xybsqlh@}
+\xyletcsnamecsname@{dir0{~}}{dir{}}
+\xyletcsnamecsname@{dir{~}}{dir1{~}}
+\xydef@\squiggle@{\xybsqlfont
+ \dimen@=\sd@X\cosDirection\xybsqll@ \advance\dimen@.1\p@
+ \dimen@ii=\sd@Y\sinDirection\xybsqll@
+ \kern\dimen@\squiggle@@
+ \edef\tmp@{\egroup \U@c=\the\dimen@ii \L@c=\the\dimen@}\tmp@
+ \wdz@=2\L@c \R@c=\L@c \ht\z@=\U@c \D@c=\U@c \dp\z@=\U@c
+ \Edge@c={\rectangleEdge}%
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\squiggledSpread@}}
+\xydef@\squiggle@@{\DirectionChar \count@=\DirectionChar
+ \advance\count@-64 \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}
+\xydef@\squiggledSpread@{%
+ \dimen@=\d@X \advance\dimen@-\sd@X\count@@\A@ \advance\dimen@\sd@X.3\p@
+ \advance\X@c-.5\dimen@ \advance\d@X-\dimen@
+ \dimen@=\d@Y \advance\dimen@-\sd@Y\count@@\B@ \advance\dimen@\sd@Y.3\p@
+ \advance\Y@c-.5\dimen@ \advance\d@Y-\dimen@}
+\xydef@\double@#1{\edef\Drop@@{\dimen@=#1\relax
+ \dimen@=.5\dimen@ \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
+ \setboxz@h{\setbox2=\hbox{\kern\A@\raise\B@\copy\z@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
+ \setbox2=\hbox{\kern-\A@\raise-\B@ \noexpand\boxz@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 }%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \noexpand\styledboxz@}}
+\xydef@\triple@#1{\edef\Drop@@{\dimen@=#1\relax
+ \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
+ \setboxz@h{\setbox2=\hbox{\kern\A@\raise\B@\copy\z@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
+ \setbox2=\hbox{\kern-\A@\raise-\B@\copy\z@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
+ \dp\z@=\z@ \ht\z@=\z@ \wdz@=\z@ \noexpand\boxz@}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \noexpand\styledboxz@}}
+\xydefcsname@{dir1{--}}{\dash@}
+\xydefcsname@{dir2{--}}{\dash@ \double@\xydashh@}
+\xydefcsname@{dir3{--}}{\dash@ \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{--}}{dir{}}
+\xyletcsnamecsname@{dir{--}}{dir1{--}}
+\xyletcsnamecsname@{dir{==}}{dir2{--}}
+\xydef@\dash@{\line@ \wdz@=2\wdz@ \ht\z@=2\ht\z@ \dp\z@=2\dp\z@
+ \multiply\D@c\tw@ \multiply\U@c\tw@ \multiply\L@c\tw@ \multiply\R@c\tw@
+ \def\Connect@@{\straight@\dashedSpread@}}
+\xydef@\dashedSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
+ \advance\d@X\sd@X.5\A@ \advance\d@Y\sd@Y.5\B@
+ \ifdim\z@<\d@X \advance\X@c.5\A@ \fi \advance\Y@c\sd@Y.5\B@}
+\xydefcsname@{dir1{~~}}{\dashsquiggle@}
+\xydefcsname@{dir2{~~}}{\dashsquiggle@ \double@\xybsqlh@}
+\xydefcsname@{dir3{~~}}{\dashsquiggle@ \triple@\xybsqlh@}
+\xyletcsnamecsname@{dir0{~~}}{dir{}}
+\xyletcsnamecsname@{dir{~~}}{dir1{~~}}
+\xydef@\dashsquiggle@{\squiggle@
+ \multiply\D@c\tw@ \multiply\U@c\tw@ \multiply\L@c\tw@ \multiply\R@c\tw@
+ \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c
+ \def\Connect@@{\straight@\dashsquiggledSpread@}}
+\xydef@\dashsquiggledSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
+ \advance\X@c.5\A@ \advance\d@X.5\A@ \advance\Y@c.25\B@ \advance\d@Y.5\B@}
+\xyletcsnamecsname@{dir1{..}}{dir{.}}
+\xyletcsnamecsname@{dir2{..}}{dir2{.}}
+\xyletcsnamecsname@{dir3{..}}{dir3{.}}
+\xyletcsnamecsname@{dir{..}}{dir1{.}}
+\xyletcsnamecsname@{dir{::}}{dir2{.}}
+\xylet@\ctipEdge@=\czeroEdge@
+\xydefcsname@{dir1{>}}{\tip@}
+\xydefcsname@{dir^{>}}{\atip@}
+\xydefcsname@{dir_{>}}{\btip@}
+\xyletcsnamecsname@{dir0{>}}{dir{}}
+\xyletcsnamecsname@{dir{>}}{dir1{>}}
+\xydefcsname@{dir1{<}}{\reverseDirection@\tip@}
+\xydefcsname@{dir^{<}}{\reverseDirection@\btip@}
+\xydefcsname@{dir_{<}}{\reverseDirection@\atip@}
+\xyletcsnamecsname@{dir0{<}}{dir{}}
+\xyletcsnamecsname@{dir{<}}{dir1{<}}
+\xydef@\tip@{\tip@x\tip@@}
+\xydef@\atip@{\tip@x\atip@@}
+\xydef@\btip@{\tip@x\btip@@}
+\xydef@\tip@x#1{#1\egroup
+ \ctipEdge@
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+\xydef@\tip@@{\atip@@\btip@@}
+\xydef@\atip@@{\xyatipfont\DirectionChar}
+\xydef@\btip@@{\xybtipfont\DirectionChar}
+\xydefcsname@{dir2{>}}{\Tip@}
+\xydefcsname@{dir2{<}}{\reverseDirection@\Tip@}
+\xydef@\Tip@{\kern2.5pt \vrule height2.5pt depth2.5pt width\z@
+ \Tip@@ \kern2.5pt \egroup
+ \U@c=2.5pt \D@c=2.5pt \L@c=2.5pt \R@c=2.5pt \Edge@c={\circleEdge}%
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+\xydef@\Tip@@{\count@=\DirectionChar
+ \advance\count@-4 \ifnum\count@<\z@ \advance\count@128 \fi
+ \xyatipfont\char\count@
+ \advance\count@ 8 \ifnum127<\count@ \advance\count@-128 \fi
+ \xybtipfont\char\count@}
+\xydefcsname@{dir3{>}}{\Ttip@}
+\xydefcsname@{dir3{<}}{\composite@{}{:(-1,0)\dir3{>}}}
+\xydef@\Ttip@{\kern3.2pt \vrule height3.2pt depth3.2pt width\z@
+ \Ttip@@ \kern3.2pt \egroup
+ \U@c=3.2pt \D@c=3.2pt \L@c=3.2pt \R@c=3.2pt \Edge@c={\circleEdge}%
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+\xydef@\Ttip@@{%
+ \setboxz@h\bgroup\reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c
+ {\vDirection@(1,-.31)\xydashl@ \xyatipfont\char\DirectionChar}%
+ {\vDirection@(1,+.31)\xydashl@ \xybtipfont\char\DirectionChar}}
+\xydefcsname@{dir1{|}}{\stopper@}
+\xydefcsname@{dir^{|}}{\aboveDirection@\xydashl@
+ \shiftdir@\line@\z@ \pointlike@{}\xydashh@}
+\xydefcsname@{dir_{|}}{\belowDirection@\xydashl@
+ \shiftdir@\line@\z@ \pointlike@{}\xydashh@}
+\xydefcsname@{dir2{|}}{\stopper@ \double@\xydashh@}
+\xydefcsname@{dir3{|}}{\stopper@ \double@{2\xydashh@}}
+\xyletcsnamecsname@{dir0{|}}{dir{}}
+\xyletcsnamecsname@{dir{|}}{dir1{|}}
+\xydef@\stopper@{\tip@x\stopper@@}
+\xydef@\stopper@@{\setboxz@h{\count@=\SemiDirectionChar \advance\count@64
+ \ifnum127<\count@ \advance\count@-128 \fi \xydashfont\char\count@\/}%
+ \setboxz@h{\kern-.5\wdz@ \dimen@=\sd@Y\cosDirection\xydashl@
+ \ifnum\SemiDirectionChar=95 \dimen@=\sd@X\sd@Y\dimen@ \fi
+ \raise.5\dimen@\boxz@}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydefcsname@{dir1{(}}{\hook@}
+\xydefcsname@{dir^{(}}{\ahook@}
+\xydefcsname@{dir_{(}}{\bhook@}
+\xyletcsnamecsname@{dir0{(}}{dir{}}
+\xyletcsnamecsname@{dir{(}}{dir1{(}}
+\xydefcsname@{dir1{)}}{\reverseDirection@\hook@}
+\xydefcsname@{dir^{)}}{\reverseDirection@\bhook@}
+\xydefcsname@{dir_{)}}{\reverseDirection@\ahook@}
+\xyletcsnamecsname@{dir0{)}}{dir{}}
+\xyletcsnamecsname@{dir{)}}{dir1{)}}
+\xydef@\hook@{\tip@x\hook@@}
+\xydef@\hook@@{\setboxz@h{\xybsqlfont
+ \vDirection@(1,-1){.707107\xybsqll@}%
+ \hbox{\DirectionChar
+ \kern-\d@Y\raise\d@X\hbox{\count@=\DirectionChar \advance\count@-32
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydef@\ahook@{\tip@x\ahook@@}
+\xydef@\ahook@@{\setboxz@h{\xybsqlfont
+ \vDirection@(1,-1){.707107\xybsqll@}\kern-\d@X
+ \lower\d@Y\hbox{\DirectionChar
+ \kern-\d@Y\raise\d@X\hbox{\count@=\DirectionChar \advance\count@-32
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydef@\bhook@{\tip@x\bhook@@}
+\xydef@\bhook@@{\setboxz@h{\xybsqlfont
+ \vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar
+ \kern\d@X\raise\d@Y\hbox{\count@=\DirectionChar \advance\count@-96
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydefcsname@{dir^{'}}{\reverseDirection@\bturn@}
+\xydefcsname@{dir_{'}}{\reverseDirection@\aturn@}
+\xydefcsname@{dir^{`}}{\aturn@}
+\xydefcsname@{dir_{`}}{\bturn@}
+\xydef@\aturn@{\tip@x\aturn@@}
+\xydef@\aturn@@{\setboxz@h{\xybsqlfont
+ \vDirection@(1,-1){.707107\xybsqll@}\kern-\d@X
+ \lower\d@Y\hbox{\DirectionChar}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydef@\bturn@{\tip@x\bturn@@}
+\xydef@\bturn@@{\setboxz@h{\xybsqlfont
+ \vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydef@\newdir#1#{\newdir@{#1}}
+\xydef@\newdir@#1#2#3{\xydefcsname@{dir#1{#2}}{\composite@{}{#3}}}
+\xydef@\shiftdir@#1#2{%
+ \setbox\z@=\hbox\bgroup#1\relax
+ \setboxz@h{\dimen@ii=#2\relax
+ \dimen@=-\cosDirection\dimen@ii \advance\dimen@-\L@c
+ \kern\dimen@ \lower\sinDirection\dimen@ii\boxz@}%
+ \wdz@\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xylet@\tipjot@=\jot
+\xydefcsname@{dir1{>>}}{\shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir^{>>}}{\shiftdir@\atip@\tipjot@ \atip@}
+\xydefcsname@{dir_{>>}}{\shiftdir@\btip@\tipjot@ \btip@}
+\xydefcsname@{dir2{>>}}{\composite@{}{h!/\tipjot@/\dir2{>}*\dir2{>}}}
+\xydefcsname@{dir3{>>}}{\composite@{}{h!/\tipjot@/\dir3{>}*\dir3{>}}}
+\xyletcsnamecsname@{dir0{>>}}{dir{}}
+\xyletcsnamecsname@{dir{>>}}{dir1{>>}}
+\xydefcsname@{dir1{<<}}{\reverseDirection@ \shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir^{<<}}{\reverseDirection@ \shiftdir@\btip@\tipjot@ \btip@}
+\xydefcsname@{dir_{<<}}{\reverseDirection@ \shiftdir@\atip@\tipjot@ \atip@}
+\xydefcsname@{dir2{<<}}{\composite@{}{h!/-\tipjot@/\dir2{<}*\dir2{<}}}
+\xydefcsname@{dir3{<<}}{\composite@{}{h!/-\tipjot@/\dir3{<}*\dir3{<}}}
+\xyletcsnamecsname@{dir0{<<}}{dir{}}
+\xyletcsnamecsname@{dir{<<}}{dir1{<<}}
+\xydefcsname@{dir1{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
+ \pointlike@{}\jot}
+\xydefcsname@{dir^{||}}{\shiftdir@{\aboveDirection@\xydashl@\line@}\xydashh@
+ \shiftdir@{\aboveDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
+\xydefcsname@{dir_{||}}{\shiftdir@{\belowDirection@\xydashl@\line@}\xydashh@
+ \shiftdir@{\belowDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
+\xydefcsname@{dir2{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
+ \pointlike@{}\jot \double@\xydashh@}
+\xydefcsname@{dir3{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
+ \pointlike@{}\jot \double@{2\xydashh@}}
+\xyletcsnamecsname@{dir0{||}}{dir{}}
+\xyletcsnamecsname@{dir{||}}{dir1{||}}
+\xydefcsname@{dir1{>|}}{\shiftdir@\stopper@\z@ \tip@}
+\xydefcsname@{dir2{>|}}{\composite@{}{\dir2{>}*\dir2{|}}}
+\xydefcsname@{dir3{>|}}{\composite@{}{\dir3{>}*\dir3{|}}}
+\xyletcsnamecsname@{dir0{>|}}{dir{}}
+\xyletcsnamecsname@{dir{>|}}{dir1{>|}}
+\xydefcsname@{dir1{>>|}}{\shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir2{>>|}}{\composite@{}{h!/\tipjot@/\dir2{>}*\dir2{>}*\dir2{|}}}
+\xydefcsname@{dir3{>>|}}{\composite@{}{h!/\tipjot@/\dir3{>}*\dir3{>}*\dir3{|}}}
+\xyletcsnamecsname@{dir0{>>|}}{dir{}}
+\xyletcsnamecsname@{dir{>>|}}{dir1{>>|}}
+\xydefcsname@{dir1{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \tip@}
+\xydefcsname@{dir2{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \Tip@}
+\xydefcsname@{dir3{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \Ttip@}
+\xyletcsnamecsname@{dir0{|<}}{dir{}}
+\xyletcsnamecsname@{dir{|<}}{dir1{|<}}
+\xydefcsname@{dir1{|<<}}{\reverseDirection@
+ \shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir2{|<<}}{%
+ \composite@{}{h!/-\tipjot@/\dir2{<}*\dir2{<}*\dir2{|}}}
+\xydefcsname@{dir3{|<<}}{%
+ \composite@{}{h!/-\tipjot@/\dir3{<}*\dir3{<}*\dir3{|}}}
+\xyletcsnamecsname@{dir0{|<<}}{dir{}}
+\xyletcsnamecsname@{dir{|<<}}{dir1{|<<}}
+\xydefcsname@{dir1{|-}}{\shiftdir@\stopper@\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot}
+\xydefcsname@{dir^{|-}}{\shiftdir@{\aboveDirection@\xydashl@ \line@}\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot}
+\xydefcsname@{dir_{|-}}{\shiftdir@{\belowDirection@\xydashl@ \line@}\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot}
+\xydefcsname@{dir2{|-}}{\shiftdir@\stopper@\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot \double@\xydashh@}
+\xydefcsname@{dir3{|-}}{\shiftdir@\stopper@\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{|-}}{dir{}}
+\xyletcsnamecsname@{dir{|-}}{dir1{|-}}
+\xyletcsnamecsname@{dir{|=}}{dir2{|-}}
+\xydefcsname@{dir{+}}{%
+ \DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
+\xyletcsnamecsname@{dir0{+}}{dir{}}
+\xydefcsname@{dir{x}}{\vDirection@(1,1)\jot
+ \DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
+\xyletcsnamecsname@{dir0{x}}{dir{}}
+\xydefcsname@{dir{/}}{\vDirection@(1,-.3)\jot \stopper@}
+\xyletcsnamecsname@{dir0{/}}{dir{}}
+\xydefcsname@{dir{//}}{\vDirection@(1,-.3)\jot
+ \shiftdir@\stopper@\xydashh@ \stopper@}
+\xyletcsnamecsname@{dir0{//}}{dir{}}
+\xydefcsname@{dir{*}}{\solidpoint@}
+\xydef@\solidpoint@{%
+ \pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\bullet$}}\jot}
+\xyletcsnamecsname@{dir0{*}}{dir{}}
+\xydefcsname@{dir{o}}{\hollowpoint@}
+\xydef@\hollowpoint@{%
+ \pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\circ$}}\jot}
+\xyletcsnamecsname@{dir0{o}}{dir{}}
+\message{circles,}
+\xydef@\cir#1#{\hbox\bgroup
+ \afterVECTORorEMPTY{\xy@@{\R@=\X@c}\cir@}{\xy@@{\R@=\R@c}\cir@}#1@}
+\xydef@\cir@#1@#2{%
+ \DN@{#1}\ifx\next@\empty\else \xyerror@{illegal circle <radius>: must be
+ <vector> or <empty>}{}\fi
+ \afterCIRorDIAG{\xyFN@\cir@cir}{\xyFN@\cir@diag}#2@}
+\xydef@\cir@cir{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\cir@cir}%
+ \else \ifx @\next \DN@ @{\cir@i}%
+ \else \xyerror@{illegal <cir>: must have form <diag><orient><diag> or
+ <empty>}{}%
+ \fi\fi \next@}
+\xydef@\cir@diag{%
+ \DN@{\xyerror@{illegal <cir>: must have form <diag><orient><diag> or
+ <empty>}{}}%
+ \ifx @\next \ifnum\count@=8
+ \DN@ @{\def\CIRin@@{0}\def\CIRorient@@{\CIRfull@}\def\CIRout@@{7}\cir@i}%
+ \fi\fi \next@}
+\xydef@\cir@i{%
+ \ifnum\CIRin@@=8 \xyerror@{incomplete <cir> specification}{%
+The <cir> you specified as <diag><orient><diag> is not sufficiently specific.}%
+ \def\CIRin@@{0}\fi
+ \ifdim\R@<.5\p@ \R@=\z@ \zerodot
+ \else \CIRorient@@ \cirbuild@ \fi
+ \L@c=\R@ \R@c=\R@ \D@c=\R@ \U@c=\R@ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}%
+ \Edge@c={\circleEdge}\OBJECT@x}
+\xydef@\CIRin@@{3}
+\xydef@\CIRout@@{3}
+\xylet@\CIRorient@@=\empty
+\xydef@\afterCIRorDIAG#1#2{\def\afterCIR@{#1}\def\afterCIRDIAG@{#2}\xyFN@\CIR@}
+\xylet@\afterCIR@=\empty
+\xylet@\afterCIRDIAG@=\empty
+\xydef@\CIR@{\count@=8 \afterDIAG{\edef\CIRin@@{\the\count@}\xyFN@\CIR@@}}
+\xydef@\CIR@@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\CIR@@}%
+ \else\ifx ^\next
+ \DN@ ^{\def\CIRorient@@{\CIRacw@}%
+ \afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
+ \else\ifx _\next
+ \DN@_{\def\CIRorient@@{\CIRcw@}%
+ \afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
+ \else
+ \DN@{\def\CIRorient@@{\relax}\afterCIRDIAG@}%
+ \fi\fi\fi \next@}
+\xylet@\CIRtest@@=\relax
+\xydef@\CIRlo@@{0}
+\xydef@\CIRhi@@{0}
+\xydef@\CIRfull@{\def\CIRtest@@##1##2{##2}}
+\xydef@\cirbuild@{\cirrestrict@@ \multiply\count@8
+ \circhar@0\circhar@7\kern\dimen@
+ \circhar@1\circhar@6\kern\dimen@
+ \circhar@2\circhar@5\kern\dimen@
+ \circhar@3\circhar@4\kern\dimen@}
+\xydef@\circhar@#1{%
+ \setboxz@h{\circhar@@{#1}}\dimen@=\wdz@ \wdz@=\z@ \ht\z@=\R@ \dp\z@=\R@
+ \CIRtest@@#1{\styledboxz@}\setbox\z@=\copy\voidb@x}
+\xydef@\circhar@@#1{{\xycircfont \advance\count@#1\relax \char\count@}}
+\xydef@\cirrestrict@@{\begingroup \dimen@=\R@
+ \setboxz@h{\xycircfont\char\z@\char\@ne}\A@=\wdz@
+ \ifdim\R@<8\A@ \count@=\dimen@ \divide\count@\A@ \advance\count@\m@ne
+ \else\ifdim\R@<16\A@ \count@=\dimen@
+ \dimen@=2\A@ \divide\count@\dimen@ \advance\count@3
+ \else\ifdim\R@<32\A@ \count@=\dimen@
+ \dimen@=4\A@ \divide\count@\dimen@ \advance\count@7
+ \else \count@=15 \fi\fi\fi
+ \R@=\A@
+ \ifnum\count@<8 \multiply\R@\count@ \advance\R@\A@
+ \else\ifnum\count@<12 \multiply\R@\count@ \multiply\R@\tw@ \advance\R@-6\A@
+ \else\ifnum\count@<16 \multiply\R@\count@ \multiply\R@ 4 \advance\R@-28\A@
+ \else \multiply\R@ 32 \fi\fi\fi
+ \edef\@tmp{\endgroup \R@=\the\R@ \count@=\the\count@}\@tmp}
+\xydef@\CIRacw@{\count@@=\CIRin@@ \count@=\CIRout@@
+ \ifnum\count@=8 \count@=\count@@
+ \ifnum\count@<6 \advance\count@\tw@ \else \advance\count@-6 \fi \fi
+ \ifnum\count@@<\@ne \advance\count@@7 \else \advance\count@@\m@ne \fi
+ \ifnum\count@<\@ne \advance\count@7 \else \advance\count@\m@ne \fi
+ \ifnum\count@@>\count@ \let\CIRtest@@=\CIRtest@outside
+ \edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
+ \else \let\CIRtest@@=\CIRtest@inside
+ \edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
+ \fi}
+\xydef@\CIRcw@{\count@@=\CIRin@@ \count@=\CIRout@@
+ \ifnum\count@=8 \count@=\count@@
+ \ifnum\count@>\@ne \advance\count@-\tw@ \else \advance\count@6 \fi \fi
+ \ifnum\count@@<5 \advance\count@@\thr@@ \else \advance\count@@-5 \fi
+ \ifnum\count@<5 \advance\count@\thr@@ \else \advance\count@-5 \fi
+ \ifnum\count@@<\count@ \let\CIRtest@@=\CIRtest@outside
+ \edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
+ \else \let\CIRtest@@=\CIRtest@inside
+ \edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
+ \fi}
+\xydef@\CIRtest@inside#1#2{\let\next@=\relax
+ \ifnum\CIRlo@@>#1\else \ifnum#1<\CIRhi@@\DN@{#2}\fi\fi \next@}
+\xydef@\CIRtest@outside#1#2{\let\next@=\relax
+ \ifnum\CIRlo@@>#1\DN@{#2}\else \ifnum#1<\CIRhi@@\else\DN@{#2}\fi\fi \next@}
+\message{text;}
+\xydef@\txt{\hbox\bgroup \xyFN@\txt@}
+\xydef@\txt@{%
+ \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\A@=##1\txt@i}%
+ \else \DN@{\A@=\maxdimen \txt@i}\fi \next@}
+\xydef@\txt@i#1#{%
+ \setboxz@h{#1\mathstrut}\dimen@=\ht\z@ \advance\dimen@\dp\z@
+ \baselineskip=1.1\dimen@ \lineskip=.2\dimen@ \lineskiplimit=\lineskip
+ \def\txtline@@##1{\txtline@{#1}{##1}}\object@\txt@ii}
+\xylet@\txtline@@=\eat@
+\xydef@\txtline@#1#2{\relax\setboxz@h{#1{\ignorespaces #2\unskip}}%
+ \ifdim\A@<\wdz@ \setboxz@h{\hsize=\A@
+ \leftskip=0pt plus4em \rightskip=\leftskip
+ \parfillskip=0pt \parindent=0pt
+ \spaceskip=.3333em \xspaceskip=.5em
+ \pretolerance=9999 \tolerance=9999
+ \hyphenpenalty=9999 \exhyphenpenalty=9999
+ \vbox{#1\noindent\ignorespaces #2\unskip}}%
+ \else\ifdim\A@<\maxdimen\setboxz@h to\A@{\hfil\boxz@\hfil}\fi\fi
+ \boxz@}
+\xydef@\txt@ii#1{\vbox{%
+ \let\\=\cr
+ \tabskip=\z@skip \halign{\relax\hfil\txtline@@{##}\hfil\cr\leavevmode#1\crcr}}}
+\message{options;}
+\xylet@\xyoption@@=\relax
+\xydef@\xyoption#1{\DN@{#1}\edef\next@{\codeof\next@}%
+ \csname xyeveryrequest@\next@ @\endcsname
+ \xyinputorelse@{xy#1}{\xyoption@truncated#1@@@@@@@@@,#1@}%
+ \def\xyoption@@{#1}\edef\xyoption@@{\codeof\xyoption@@}
+ \expandafter\let\expandafter\next@\csname xy\xyoption@@ version\endcsname
+ \expandafter\let\csname xy\xyoption@@ loaded\endcsname=\next@
+ \runxywith@ \ignorespaces}
+\xydef@\xyoption@truncated#1#2#3#4#5#6#7@#8,#9@{%
+ \DN@{#7}\ifx\next@\empty \DN@##1##2{##2}\else\let\next@=\xyinputorelse@ \fi
+ \next@{xy#1#2#3#4#5#6}%
+ {\DN@{#1#2#3#4#5#6}\edef\next@{\codeof\next@}%
+ \xyerror@{No `\next@' option}{%
+Your \xyoption{#9} request could not be granted: the required^^J%
+file `xy#9.tex' could not be located. Please make sure that it is^^J%
+properly installed before continuing.}}}
+\xydef@\xyrequire#1{\DN@{#1}\edef\next@{\codeof\next@}%
+ \csname xyeveryrequest@\next@ @\endcsname
+ \expandafter\let\expandafter\next@\csname xy\codeof\next@ loaded\endcsname
+ \ifx \next@\relax \DN@{\xyoption{#1}}\else \DN@{\ignorespaces}\fi \next@}
+\xylet@\xywith@@=\empty
+\xydef@\runxywith@{\let\xywithdo@@=\xywithtest@ \xywith@@}
+\xydef@\xywithoption#1#2{\DN@{#1}\edef\next@{\codeof\next@}%
+ \expandafter\let\expandafter\nextii@\csname xy\next@ loaded\endcsname
+ \ifx \nextii@\relax
+ \expandafter\def\expandafter\xywith@@\expandafter{\xywith@@
+ \xywithdo@@{#1}{#2}}%
+ \else \expandafter\xywithrun@\expandafter{\next@}{#2}\fi}
+\xydef@\xywithtest@#1#2{\DN@{#1}\edef\next@{\codeof\next@}%
+ \ifx\next@\xyoption@@ \expandafter\xywithrun@\expandafter{\next@}{#2}\fi}
+\xydef@\xywithrun@#1#2{\csname xyeverywithoption@#1@\endcsname #2}
+\xydef@\xyevery@#1#2#3{\DN@{#2}\edef\next@{\codeof\next@}%
+ \expandafter\ifx\csname xyevery#1@\next@ @\endcsname\relax
+ \expandafter\let\csname xyevery#1@\next@ @\endcsname=\empty \fi
+ \DNii@##1{\expandafter\def\expandafter##1\expandafter{##1#3}}%
+ \expandafter\nextii@\csname xyevery#1@\next@ @\endcsname}
+\xydef@\xyeveryrequest{\xyevery@{request}}
+\xydef@\xyeverywithoption{\xyevery@{withoption}}
+\xydef@\xyprovide#1#2#3#4#5#6{%
+ \def\xyoption@@{#1}\edef\xyoption@@{\codeof\xyoption@@}\edef\next@{#3}%
+ \message{ Xy-pic option: #2 v.\next@}%
+ \expandafter\let\expandafter\nextii@\csname xy\xyoption@@ loaded\endcsname
+ \ifx \next@\nextii@ \message{not reloaded}\endinput
+ \else
+ \ifx \nextii@\relax\else \xyerror@{Option `\xyoption@@' version mismatch}{%
+You previously loaded, or the format has preloaded, a different version^^J%
+of this option. Just continue to try to load this version instead (and^^J%
+be prepared for a lot of warnings about redefinitions).}%
+ \fi
+ \expandafter\let\csname xy\xyoption@@ version\endcsname=\next@
+ \expandafter\let\expandafter\xyenddocmode@\csname DOCMODE\endcsname
+ \expandafter\let\csname DOCMODE\endcsname\xyprovidedocmode@
+ \xycatcodes
+ \fi \ignorespaces}
+\xydef@\xyendinput{\expandafter\let\csname DOCMODE\endcsname=\xyenddocmode@
+ \message{loaded}\xyuncatcodes\endinput}
+\expandafter\xylet@\expandafter\xyprovidedocmode@\csname DOCMODE\endcsname
+\xylet@\xyenddocmode@=\relax
+\xydef@\xydriversloaded@none{\do{unload}}
+\xylet@\xydriversloaded@@=\xydriversloaded@none
+\xylet@\xydriversselected@@=\empty
+\xylet@\xydriver@unload@support@@=\empty
+\xydef@\selectdriver@#1{\DN@{#1}\edef\next@{\codeof\next@}%
+ \expandafter\selectdriver@@\expandafter{\next@}}
+\xydef@\selectdriver@single#1{\xysetup@@{\def\xydriversselected@@{\do{#1}}%
+ \xyLoadDrivers@}\let\selectdriver@@=\changedriver@single}
+\xydef@\changedriver@single#1{\xysetup@@{\def\xydriversselected@@{\do{#1}}%
+ \xyReloadDrivers@}}
+\xydef@\selectdriver@multiple#1{\expandafter\xysetup@@\expandafter{%
+ \expandafter\def\expandafter\xydriversselected@@\expandafter{%
+ \xydriversselected@@ \do{#1}}%
+ \let\do=\activatedriver@ \xydriversselected@@}}
+\xydef@\UseSingleDriver{\let\selectdriver@@=\selectdriver@single}
+\xydef@\MultipleDrivers{\let\selectdriver@@=\selectdriver@multiple}
+\xydef@\xyLoadDrivers@{\let\do=\activatedriver@ \xydriversselected@@}
+\xydef@\xyReloadDrivers@{\activatedriver@{unload}\xyLoadDrivers@}
+\xylet@\xyReloadDrivers=\xyReloadDrivers@
+\xydef@\activatedriver@#1{%
+ \let\doii=\activatedriversupport@ \csname xydriver@#1@support@@\endcsname}
+\xydef@\activatedriversupport@#1#2{%
+ \expandafter\ifx\csname xy#1loaded\endcsname\relax\DN@{}%
+ \else\DN@{#2}\fi \next@}
+\UseSingleDriver
+\xydef@\xyselectoptionsupport@{\let\do=\activatedriver@ \xydriversselected@@}
+\xydef@\xyShowDrivers{{\W@{Loaded:}\let\do=\doShow \xydriversloaded@@
+ \let\next@=\empty
+ \def\do##1{\ifx\next@\empty \DN@{##1}%
+ \else \expandafter\DN@\expandafter{\next@, ##1}\fi}%
+ \xydriversselected@@\W@{Selected: \next@.}}}
+\def\doShow#1{\let\next@=\empty
+ \def\doii##1##2{\ifx\next@\empty \DN@{##1}%
+ \else \expandafter\DN@\expandafter{\next@, ##1}\fi}%
+ \csname xydriver@#1@support@@\endcsname
+ \W@{ <driver> #1 supports \next@.}}
+\xydef@\newdriver#1{%
+ \def\nextiii@##1{%
+ \expandafter\def\expandafter\xydriversloaded@@
+ \expandafter{\xydriversloaded@@\do{##1}}%
+ \expandafter\let\csname xydriver@\xyoption@@ @support@@\endcsname=\empty}%
+ \def\do##1{\DNii@{##1}\ifx\xyoption@@\nextii@ \let\nextiii@=\eat@ \fi}%
+ \xydriversloaded@@ \expandafter\nextiii@\expandafter{\xyoption@@}%
+ #1\relax
+ \DN@##1{\xywithoption{##1}{%
+ \selectdriver@{##1}\xyeveryrequest{##1}{\selectdriver@{##1}}}}%
+ \expandafter\next@\expandafter{\xyoption@@}\ignorespaces}
+\xydef@\xyaddsupport{\expandafter\xyadddriversupport@\expandafter{\xyoption@@}}
+\xydef@\xyaddunsupport{\xyadddriversupport@{unload}}
+\xydef@\xyadddriversupport@#1#2#3{%
+ \DNii@{#1}\edef\nextii@{\codeof\nextii@}%
+ \def\nextiii@{#2}\edef\nextiii@{\codeof\nextiii@}%
+\def\next{\xybug@{<driver> \nextii@\space not loaded}}%
+\def\do##1{\DN@{##1}\edef\next@{\codeof\next@}%
+ \ifx\next@\nextii@ \let\next=\relax \fi}\xydriversloaded@@ \next
+\def\next{\xybug@{<driver> \nextii@\space already supports \nextiii@}}%
+\def\doii##1##2{\DN@{##1}\edef\next@{\codeof\next@}%
+ \ifx\next@\nextiii@ \let\next=\relax \fi}\xydriversloaded@@ \next
+ \DN@##1##2{\ifx##1\relax \let##1=\empty \fi
+ \expandafter\def\expandafter##1\expandafter{##1\doii{##2}{#3}}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\csname xydriver@\nextii@ @support@@\endcsname
+ \expandafter{\nextiii@}%
+ \DN@##1{\expandafter\xyeverywithoption\expandafter{\nextiii@}{%
+ \xytestforsupport@{##1}}}%
+ \expandafter\next@\expandafter{\nextii@}\xydriversloaded@@
+ \ignorespaces}
+\xydef@\xytestforsupport@#1{\def\do##1{\DN@{##1}\DNii@{#1}%
+ \ifx\next@\nextii@ \expandafter\xyselectoptionsupport@ \fi}}
+\xynew@{if}\ifunsupportwarnings@
+\xydef@\xyunsupportwarning@#1#2{{%
+ \DN@{#1}\edef\next@{\codeof\next@}
+ \expandafter\ifx\csname xywarn@unload@\next@ @\endcsname\relax
+ \expandafter\gdef\csname xywarn@unload@\next@ @\endcsname{}%
+ \ifunsupportwarnings@ \xyclosedown@@\xyunsupportwarnings@@ \fi
+ \global\unsupportwarnings@true
+ \expandafter\gdef\expandafter\xyunsupportwarnings@@\expandafter{%
+ \xyunsupportwarnings@@ \W@{ #2.}}%
+ \W@{}%
+ \W@{Xy-pic Warning: `\next@' reproduction is NOT EXACT\xytracelineno@:}%
+ \W@{ #2.}%
+ \W@{}%
+ \fi}}
+\xydef@\xyunsupportwarnings@@{\W@{}%
+ \W@{Xy-pic Warning: The produced DVI file is NOT EXACT:}}
+\xynew@{if}\ifsupportwarnings@
+\xydef@\xysupportwarning@#1#2{{%
+ \DN@{#1}\edef\next@{\codeof\next@}\DNii@{#2}\edef\nextii@{\codeof\nextii@}%
+ \expandafter\ifx\csname xywarn@\next@ @\nextii@ @\endcsname\relax
+ \expandafter\gdef\csname xywarn@\next@ @\nextii@ @\endcsname{}%
+ \ifsupportwarnings@ \xyclosedown@@\xysupportwarnings@@ \fi
+ \global\supportwarnings@true
+ \expandafter\gdef\expandafter\xysupportwarnings@@\expandafter{%
+ \xysupportwarnings@@ \driverextensioncomplain@{#1}{#2}}%
+ \W@{}%
+ \W@{Xy-pic Warning: The produced DVI file is NOT PORTABLE\xytracelineno@:}%
+ \driverextensioncomplain@{#1}{#2}%
+ \W@{}%
+ \fi}}
+\xydef@\xysupportwarnings@@{%
+ \W@{Xy-pic Warning: The produced DVI file is NOT PORTABLE:}}
+\xydef@\driverextensioncomplain@#1#2{%
+ \DN@{#1}\edef\next@{\codeof\next@}\DNii@{#2}\edef\nextii@{\codeof\nextii@}%
+ \W@{ It contains <driver> `\next@' \string\special s for the `\nextii@'
+ extension.}}
+\xydef@\dvimessage@#1#2{\xysupportwarning@{#1}{#2}}
+\xynew@{if}\ifxydrivernoloads@
+\xydef@\xydrivernoload@#1{\xyerror@{Could not load xy#1.tex}{}%
+ \xydrivernoloads@true}
+\xydef@\xydriverfail@#1{\xyerror@{Sorry, #1 not supported.}{}}
+\xydef@\xyunload@#1{\xywarning@{Unloading #1.}}
+\message{algorithms: directions,}
+\xydef@\DirectionfromtheDirection@{\noexpand\Direction=\the\Direction
+ \noexpand\d@X=\the\d@X \noexpand\d@Y=\the\d@Y
+ \def\noexpand\sd@X{\sd@X}\def\noexpand\sd@Y{\sd@Y}%
+ \noexpand\K@dXdY=\the\K@dXdY \noexpand\K@dYdX=\the\K@dYdX
+ \chardef\noexpand\DirectionChar=\the\DirectionChar
+ \chardef\noexpand\SemiDirectionChar=\the\SemiDirectionChar
+ \def\noexpand\cosDirection{\cosDirection}%
+ \def\noexpand\sinDirection{\sinDirection}%
+ \noexpand\resetupDirection@}
+\xydef@\Directiontest@@#1#2{#2}
+\xydef@\setupDirection@{%
+ \d@X=\X@c\advance\d@X-\X@p \d@Y=\Y@c\advance\d@Y-\Y@p
+ \Directiontest@@\relax\setupDirection@i}
+\xydef@\setupDirection@i{\DN@{\setupDirection@ii}%
+ \ifdim\d@X=\d@Y
+ \ifdim\zz@\d@Y \DN@{}%
+ \else\ifdim\d@X<\z@ \DN@{\dlDirection@{-1.4142\d@X}}%
+ \else \DN@{\urDirection@{1.4142\d@X}}\fi\fi
+ \else\ifdim\d@X<\d@Y
+ \ifdim\zz@\d@X \DN@{\uDirection@\d@Y}%
+ \else\ifdim\zz@\d@Y \DN@{\lDirection@{-\d@X}}%
+ \else\ifdim-\d@X=\d@Y \DN@{\ulDirection@{-1.4142\d@X}}\fi\fi\fi
+ \else
+ \ifdim\zz@\d@X \DN@{\dDirection@{-\d@Y}}%
+ \else\ifdim\zz@\d@Y \DN@{\rDirection@\d@X}%
+ \else\ifdim\d@X=-\d@Y \DN@{\drDirection@{1.4142\d@X}}\fi\fi\fi
+ \fi\fi \next@}
+\xydef@\dlDirection@{\Direction=\z@
+ \def\cosDirection{-.7071}\def\sinDirection{-.7071}\def\sd@X{-}\def\sd@Y{-}%
+ \chardef\DirectionChar=127\relax\chardef\SemiDirectionChar=127\relax
+ \K@dXdY=1\K@ \K@dYdX=1\K@ \fixedDirection@}
+\xydef@\dDirection@{\Direction=\K@
+ \def\cosDirection{0}\def\sinDirection{-1}\def\sd@Y{-}%
+ \edef\sd@X{\ifdim\X@c<\X@p-\else+\fi}%
+ \chardef\DirectionChar=15\relax\chardef\SemiDirectionChar=31\relax
+ \K@dXdY=\z@ \K@dYdX=\KK@\K@ \fixedDirection@}
+\xydef@\drDirection@{\dimen@ii=2\K@ \Direction=\dimen@ii
+ \def\cosDirection{+.7071}\def\sinDirection{-.7071}\def\sd@X{+}\def\sd@Y{-}%
+ \chardef\DirectionChar=31\relax\chardef\SemiDirectionChar=63\relax
+ \K@dXdY=-1\K@ \K@dYdX=-1\K@ \fixedDirection@}
+\xydef@\rDirection@{\dimen@ii=3\K@ \Direction=\dimen@ii
+ \def\cosDirection{+1}\def\sinDirection{0}\def\sd@X{+}%
+ \edef\sd@Y{\ifdim\Y@c<\Y@p-\else+\fi}%
+ \chardef\DirectionChar=47\relax\chardef\SemiDirectionChar=95\relax
+ \K@dXdY=\KK@\K@ \K@dYdX=\z@ \fixedDirection@}
+\xydef@\urDirection@{\dimen@ii=4\K@ \Direction=\dimen@ii
+ \def\cosDirection{+.7071}\def\sinDirection{+.7071}\def\sd@X{+}\def\sd@Y{+}%
+ \chardef\DirectionChar=63\relax\chardef\SemiDirectionChar=127\relax
+ \K@dXdY=1\K@ \K@dYdX=1\K@ \fixedDirection@}
+\xydef@\uDirection@{\dimen@ii=-3\K@ \Direction=\dimen@ii
+ \def\cosDirection{0}\def\sinDirection{+1}\def\sd@Y{+}%
+ \edef\sd@X{\ifdim\X@c<\X@p-\else+\fi}%
+ \chardef\DirectionChar=79\relax\chardef\SemiDirectionChar=31\relax
+ \K@dXdY=\z@ \K@dYdX=\KK@\K@ \fixedDirection@}
+\xydef@\ulDirection@{\dimen@ii=-2\K@ \Direction=\dimen@ii
+ \def\cosDirection{-.7071}\def\sinDirection{+.7071}\def\sd@X{-}\def\sd@Y{+}%
+ \chardef\DirectionChar=95\relax\chardef\SemiDirectionChar=63\relax
+ \K@dXdY=-1\K@ \K@dYdX=-1\K@ \fixedDirection@}
+\xydef@\lDirection@{\Direction=-\K@
+ \def\cosDirection{-1}\def\sinDirection{0}\def\sd@X{-}%
+ \edef\sd@Y{\ifdim\Y@c<\Y@p-\else+\fi}%
+ \chardef\DirectionChar=111\relax\chardef\SemiDirectionChar=95\relax
+ \K@dXdY=\KK@\K@ \K@dYdX=\z@ \fixedDirection@}
+\xydef@\fixedDirection@#1{\dimen@ii=#1\relax
+ \d@X=\cosDirection\dimen@ii \d@Y=\sinDirection\dimen@ii
+ \resetupDirection@}
+\xydef@\setupDirection@ii{%
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \K@dXdY=\sd@X\d@X \ifdim\K@dXdY<500pt \multiply\K@dXdY\KK@ \fi
+ \dimen@=\sd@Y\d@Y
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\KK@ \divide\dimen@\KK@
+ \ifdim\dimen@=\z@\else
+ \advance\K@dXdY by.5\dimen@\relax \divide\K@dXdY\dimen@
+ \fi \K@dXdY=\sd@X\sd@Y\K@dXdY
+ \K@dYdX=\sd@Y\d@Y \ifdim\K@dYdX<500pt \multiply\K@dYdX\KK@ \fi
+ \dimen@=\sd@X\d@X
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\KK@ \divide\dimen@\KK@
+ \ifdim\dimen@=\z@\else
+ \advance\K@dYdX by.5\dimen@\relax \divide\K@dYdX\dimen@
+ \fi \K@dYdX=\sd@X\sd@Y\K@dYdX
+ \Direction=\maxdimen
+ \ifnum\K@dXdY<-\K@ \else \ifnum\K@<\K@dXdY \else
+ \ifdim \d@Y<\z@
+ \Direction=\K@ \advance\Direction-\K@dXdY
+ \else
+ \Direction=\K@ \multiply\Direction-\thr@@ \advance\Direction-\K@dXdY
+ \fi\fi\fi
+ \ifnum-\K@<\K@dYdX \ifnum\K@dYdX<\K@
+ \ifdim \d@X<\z@
+ \Direction=-\K@ \advance\Direction\K@dYdX
+ \else
+ \Direction=\K@ \multiply\Direction\thr@@ \advance\Direction\K@dYdX
+ \fi\fi\fi
+ \ifnum\Direction=\maxdimen
+ \Direction=\K@dYdX \advance\Direction-\K@dXdY
+ \advance\Direction\ifnum\Direction<\z@-\fi\@ne \divide\Direction\tw@
+ \ifnum\K@dXdY<\z@ \advance\Direction\K@ \advance\Direction\K@
+ \else \advance\Direction-\K@ \advance\Direction-\K@ \fi
+ \fi
+ \imposeDirection@i
+ \resetupDirection@
+ }
+\xydef@\imposeDirection@{\count@@=\Direction
+ \loop@\ifnum\count@@>4096 \advance\count@@-8192 \repeat@
+ \loop@\ifnum\count@@<-4096 \advance\count@@8192 \repeat@
+ \def\sd@X{+}\ifnum\count@@<\K@ \relax
+ \ifnum\count@@>-3072 \def\sd@X{-}\fi\fi
+ \def\sd@Y{+}\ifnum\count@@<3072 \relax
+ \ifnum\count@@>-\K@ \relax\def\sd@Y{-}\fi\fi
+ \imposeDirection@i
+ \d@X=\cosDirection\xydashl@ \d@Y=\sinDirection\xydashl@
+ \resetupDirection@}
+\xydef@\imposeDirection@i{%
+ \count@@=\K@ \multiply\count@@ by8 \advance\count@@\Direction
+ \count@=\count@@ \advance\count@\KK@ \divide\count@64 \advance\count@\m@ne
+ \loop@\ifnum127<\count@ \advance\count@-128 \repeat@
+ \chardef\DirectionChar\count@
+ \advance\count@@16 \divide\count@@\KK@ \advance\count@@\m@ne
+ \loop@\ifnum127<\count@@ \advance\count@@-128 \repeat@
+ \chardef\SemiDirectionChar\count@@
+ \setbox8=\hbox{\xydashfont\SemiDirectionChar\/}%
+ \quotient@@\cosDirection{\sd@X\wd8}\xydashl@
+ \setbox8=\hbox{\xydashfont\count@=\SemiDirectionChar\advance\count@-64
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@\/}%
+ \quotient@@\sinDirection{\sd@Y\wd8}\xydashl@}
+\xydef@\getxyDirection@#1{\xy@@\bgroup\xy@@ix@{#1}%
+ \xy@@{\expandafter\POS\the\toks9\relax\setupDirection@
+ \edef\next@{\egroup \Direction=\the\Direction}\next@ \imposeDirection@ }}
+\xydef@\reverseDirection@{%
+ \d@X=-\d@X \d@Y=-\d@Y
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \dimen@=4\K@ \ifnum\Direction<\z@ \advance\Direction\dimen@
+ \else \advance\Direction-\dimen@ \fi
+ \count@=\DirectionChar \ifnum\count@<64 \advance\count@64
+ \else \advance\count@-64 \fi \chardef\DirectionChar=\count@
+ \edef\cosDirection{\if-\cosDirection\else-\cosDirection\fi}%
+ \edef\sinDirection{\if-\sinDirection\else-\sinDirection\fi}%
+ \resetupDirection@}
+\xydef@\aboveDirection@#1{%
+ \dimen@=\d@X \d@X=-\d@Y \d@Y=\dimen@
+ \dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \dimen@=2\K@ \ifdim 1\Direction<\dimen@\else \dimen@=-6\K@ \fi
+ \advance\Direction\dimen@
+ \count@=\DirectionChar \ifnum\count@<96 \advance\count@32
+ \else \advance\count@-96 \fi \chardef\DirectionChar=\count@
+ \count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64
+ \else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
+ \let\tmp@=\cosDirection
+ \edef\cosDirection{\if-\sinDirection\else-\sinDirection\fi}%
+ \let\sinDirection=\tmp@
+ \dimen@=#1\relax \d@X=\cosDirection\dimen@ \d@Y=\sinDirection\dimen@
+ \resetupDirection@}
+\xydef@\belowDirection@#1{%
+ \dimen@=\d@X \d@X=\d@Y \d@Y=-\dimen@
+ \dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \dimen@=-2\K@\ifdim 1\Direction<\dimen@\dimen@=6\K@\fi
+ \advance\Direction\dimen@
+ \count@=\DirectionChar \ifnum\count@<32 \advance\count@96
+ \else \advance\count@-32 \fi \chardef\DirectionChar=\count@
+ \count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64
+ \else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
+ \let\tmp@=\sinDirection
+ \edef\sinDirection{\if-\cosDirection\else-\cosDirection\fi}%
+ \let\cosDirection=\tmp@
+ \dimen@=#1\relax \d@X=\cosDirection\dimen@ \d@Y=\sinDirection\dimen@
+ \resetupDirection@}
+\xydef@\vDirection@(#1,#2)#3{\dimen@ii=#3\relax
+ \dimen@=#1\dimen@ii \dimen@ii=#2\dimen@ii
+ \d@X=\cosDirection\dimen@ \advance\d@X-\sinDirection\dimen@ii
+ \d@Y=\sinDirection\dimen@ \advance\d@Y \cosDirection\dimen@ii
+ \X@p=\X@c \advance\X@p-\d@X \Y@p=\Y@c \advance\Y@p-\d@Y
+ \setupDirection@\ignorespaces}
+\xydef@\resetDirection@{%
+ \d@X=\X@c\advance\d@X-\X@p \d@Y=\Y@c\advance\d@Y-\Y@p
+ \let\next@=\resetupDirection@
+ \ifdim\sd@X\d@X<\z@ \let\next@=\setupDirection@i \fi
+ \ifdim\sd@Y\d@Y<\z@ \let\next@=\setupDirection@i \fi
+ \next@}
+\xydef@\resetupDirection@{%
+ \edef\Directiontest@@##1##2{\noexpand\DN@{##2}%
+ \noexpand\ifdim\noexpand\d@X=\the\d@X\relax
+ \noexpand\ifdim\noexpand\d@Y=\the\d@Y\relax \noexpand\DN@{##1}%
+ \noexpand\fi\noexpand\fi \noexpand\next@}}
+\xydef@\unsetupDirection@{\def\Directiontest@@##1##2{##2}}
+\uDirection@\xydashl@
+\message{edges,}
+\xynew@{if}\ifInside@
+\xydef@\zeroEdge#1{%
+ \ifcase#1\relax \or \Inside@false \or \dimen@=\z@
+ \or \else \Edge@c={\rectangleEdge}\fi}
+\xydef@\circleEdge#1{\ifcase#1\expandafter\circleEdge@
+ \or \expandafter\circleUnder@ \or \dimen@=\R@c
+ \or \expandafter\circleProp@ \or \expandafter\circleInner@
+ \else \expandafter\circleOuter@ \fi}
+\xydef@\circleEdge@{\DN@{\ellipseEdge@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\circlecentredEdge@}%
+ \else\DN@{\ellipsecentredEdge@}\fi
+ \fi\fi \next@}
+\xydef@\circleProp@{\DN@{\reverseDirection@\ellipseEdge@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\reverseDirection@\circlecentredEdge@}%
+ \else\DN@{\reverseDirection@\ellipsecentredEdge@}\fi
+ \fi\fi \next@}
+\xydef@\circleUnder@{\Inside@false
+ \ifdim\X@p=\X@c \relax \ifdim\Y@p=\Y@c \Inside@true \fi \fi
+ \ifInside@ \else \expandafter \circleCentre@ \fi}
+\xydef@\circleCentre@{{%
+ \ifdim\L@c=\R@c \relax\else
+ \dimen@=\R@c\advance\dimen@-\L@c \divide\dimen@\tw@
+ \advance\X@c\dimen@ \advance\R@c-\dimen@ \fi
+ \d@X=\X@c \advance\d@X-\X@p \d@X=\ifdim\d@X<\z@-\fi\d@X
+ \ifdim\U@c=\D@c\relax \else
+ \dimen@=\U@c\advance\dimen@-\D@c \divide\dimen@\tw@
+ \advance\Y@c\dimen@ \advance\U@c-\dimen@ \fi
+ \d@Y=\Y@c \advance\d@Y-\Y@p \d@Y=\ifdim\d@Y<\z@-\fi\d@Y
+ \DN@{}\ifdim\d@X>\R@c \relax \else \ifdim\d@Y>\U@c \relax
+ \else \ifdim\U@c=\R@c \DN@{\circlecentredUnder@}%
+ \else \DN@{\ellipsecentredUnder@}\fi
+ \fi\fi \next@}}
+\xydef@\circleInner@{\DN@{\ellipseInner@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\circlecentredInner@}%
+ \else\DN@{\ellipsecentredInner@}\fi
+ \fi\fi \next@}
+\xydef@\circleOuter@{\DN@{\ellipseOuter@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\circlecentredOuter@}%
+ \else\DN@{\ellipsecentredOuter@}\fi
+ \fi\fi \next@}
+\xydef@\circlecentredEdge@{%
+ \dimen@=-\cosDirection\R@c \advance\X@c\dimen@
+ \dimen@=-\sinDirection\R@c \advance\Y@c\dimen@}
+\xydef@\circlecentredUnder@{%
+ \loop\ifdim\R@c>100\p@ \circlescale@ \repeat
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\R@c
+ \edef\tmp@{\expandafter\removePT@\the\d@X}\advance\dimen@-\tmp@\d@X
+ \edef\tmp@{\expandafter\removePT@\the\d@Y}\advance\dimen@-\tmp@\d@Y
+ \ifdim\dimen@>\z@ \aftergroup\Inside@true \fi}
+%%\xydef@\circlescale@{\divide\R@c\KK@ \divide\d@X\KK@ \divide\d@Y\KK@ }
+\xydef@\circlescale@{\divide\R@c\KK@ \divide\d@X\KK@ \divide\d@Y\KK@ }
+\xydef@\circlecentredInner@{%
+ \L@c=\sd@X\cosDirection\R@c \D@c=\sd@Y\sinDirection\R@c
+ \R@c=\L@c \U@c=\D@c \Edge@c={\rectangleEdge}}
+\xydef@\circlecentredOuter@{%
+ \L@c=\R@c \D@c=\R@c \U@c=\D@c \Edge@c={\rectangleEdge}}
+\xydef@\ellipsecentredEdge@{\bgroup \X@p=\X@c \Y@p=\Y@c
+ \ifdim\U@c>\R@c
+ \X@c=\cosDirection\U@c \Y@c=\sinDirection\U@c
+ \quotient@\tmp@\U@c\R@c \X@c=\tmp@\X@c \R@c=\U@c
+ \else
+ \X@c=\cosDirection\R@c \Y@c=\sinDirection\R@c
+ \quotient@\tmp@\R@c\U@c \Y@c=\tmp@\Y@c
+ \fi
+ \advance\X@c\X@p \advance\Y@c\Y@p
+ \setupDirection@ \X@c=\X@p \Y@c=\Y@p \circlecentredEdge@
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \ifdim\U@c>\L@c \quotient@\tmp@\L@c\U@c \d@X=\tmp@\d@X
+ \else \quotient@\tmp@\U@c\R@c \d@Y =\tmp@\d@Y \fi
+ \X@c=\X@p \advance\X@c\d@X \Y@c=\Y@p \advance\Y@c\d@Y
+ \edef\next@{\egroup \X@c=\the\X@c \Y@c=\the\Y@c}\next@ }%
+\xydef@\ellipsecentredUnder@{%
+ \ifdim\R@c>64\p@ \circlescale@ \divide\U@c\KK@
+ \else \ifdim\U@c>64\p@ \circlescale@ \divide\U@c\KK@ \fi\fi
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\d@Y=\tmp@\d@Y
+ \edef\tmp@{\expandafter\removePT@\the\U@c}\d@X=\tmp@\d@X
+ \R@c=\tmp@\R@c \circlecentredUnder@ }
+\xydef@\ellipsecentredOuter@{\Edge@c={\rectangleEdge}}
+\xydef@\ellipsecentredInner@{%
+ \bgroup \X@p=\X@c \Y@p=\Y@c \ellipsecentredEdge@
+ \advance\X@c-\X@p \L@c=\ifdim\X@c<\z@-\fi\X@c
+ \advance\Y@c-\Y@p \D@c=\ifdim\Y@c<\z@-\fi\Y@c
+ \edef\next@{\egroup \L@c=\the\L@c \D@c=\the\D@c}\next@
+ \R@c=\L@c \U@c=\D@c \Edge@c={\rectangleEdge}}
+\xydef@\ellipseEdge@{\bgroup
+ \A@=\R@c \B@=\U@c
+ \ifdim\R@c=\L@c \d@X=\z@
+ \else \d@X=.5\R@c \advance\d@X-.5\L@c
+ \advance\A@\L@c \divide\A@\tw@ \fi
+ \ifdim\U@c=\D@c \d@Y=\z@
+ \else \d@Y=.5\U@c \advance\d@Y-.5\D@c
+ \advance\B@\D@c \divide\B@\tw@ \fi
+ \bgroup
+ \L@c=\A@ \U@c=\B@
+ \R@p=\U@c \advance\R@p\L@c \multiply\R@p\tw@
+ \ifdim\B@<\A@ \quotient@\tmp@\U@c\L@c \R@c=\tmp@\p@ \D@c=\p@
+ \quotient@\tmp@\R@p\L@c \R@p=\tmp@\p@
+ \else
+ \ifdim\A@<\B@ \quotient@\tmp@\L@c\U@c \D@c=\tmp@\p@ \R@c=\p@
+ \quotient@\tmp@\R@p\U@c \R@p=\tmp@\p@
+ \else
+ \R@c=\p@ \D@c=\p@ \quotient@\tmp@\R@p\U@c \R@p=\tmp@\p@
+ \fi\fi
+ \quotient@\sd@X\d@X\L@c \d@X=\sd@X\p@
+ \quotient@\sd@Y\d@Y\U@c \d@Y=\sd@Y\p@
+ \loop
+ \bgroup \U@p=-\p@ \D@p=\z@
+ \ifdim\R@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\R@p
+ \advance\d@X\cosDirection\dimen@
+ \else \advance\d@X\cosDirection\R@p \fi
+ \edef\sd@X{\expandafter\removePT@\the\d@X}%
+ \advance\U@p\sd@X\d@X
+ \ifdim\R@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\d@X
+ \advance\D@p\cosDirection\dimen@
+ \else \advance\D@p\cosDirection\d@X \fi
+ \ifdim\D@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\D@c}\dimen@=\tmp@\R@p
+ \advance\d@Y\sinDirection\dimen@
+ \else \advance\d@Y\sinDirection\R@p \fi
+ \edef\sd@Y{\expandafter\removePT@\the\d@Y}%
+ \advance\U@p\sd@Y\d@Y
+ \ifdim\D@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\D@c}\dimen@=\tmp@\d@Y
+ \advance\D@p\sinDirection\dimen@
+ \else \advance\D@p\sinDirection\d@Y \fi
+ \multiply\D@p\tw@
+ \dimen@=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\dimen@<.01\p@ \U@p=\z@
+ \else
+ \quotient@\tmp@\U@p\D@p \U@p=\tmp@\p@
+ \ifdim\U@p<\z@\xywarning@{poor convergence}\U@p=\z@
+ \else \advance\R@p-\U@p \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \fi \fi
+ \edef\next@{\egroup \R@p=\the\R@p \U@p=\the\U@p \D@p=\the\D@p}\next@
+ \ifdim\U@p>\z@ \repeat
+ \edef\next@{\egroup \dimen@=\the\R@p}\next@
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \ifdim\B@<\A@ \dimen@=\tmp@\B@ \else \dimen@=\tmp@\A@ \fi
+ \dimen@=-\dimen@
+ \advance\X@c\cosDirection\dimen@
+ \advance\Y@c\sinDirection\dimen@
+ \edef\next@{\egroup \X@c=\the\X@c \Y@c=\the\Y@c}\next@ }%
+\xydef@\ellipseOuter@{\Edge@c={\rectangleEdge}}
+\xydef@\ellipseInner@{%
+ \bgroup \X@p=\X@c \Y@p=\Y@c \ellipseEdge@
+ \d@X=\X@c\advance\d@X-\X@p
+ \ifdim\d@X>\z@ \R@p=\d@X \L@p=\R@p
+ \ifdim\L@c=\R@c\else\advance\L@p\L@c \advance\L@p-\R@c \fi
+ \else \L@p=-\d@X \R@p=\L@p
+ \ifdim\L@c=\R@c \else\advance\R@p\R@c \advance\R@p-\L@c \fi
+ \fi
+ \d@Y=\Y@c\advance\d@Y-\Y@p
+ \ifdim\d@Y>\z@ \U@p=\d@Y \D@p=\U@p
+ \ifdim\D@c=\U@c\else\advance\D@p\D@c \advance\D@p-\U@c \fi
+ \else \D@p=-\d@Y \U@p=\D@p
+ \ifdim\D@c=\U@c\else\advance\U@p\U@c \advance\U@p-\D@c \fi
+ \fi
+ \edef\next@{\egroup
+ \L@c=\the\L@p \D@c=\the\D@p \R@c=\the\R@p \U@c=\the\U@p}%
+ \next@ \Edge@c={\rectangleEdge}}
+\xydef@\rectangleEdge#1{\ifcase#1\expandafter\rectangleEdge@
+ \or \expandafter\rectangleUnder@ \or \expandafter\rectangleDist@
+ \or \expandafter\rectangleProp@
+ \else \relax \fi}
+\xydef@\rectangleEdge@{%
+ \ifdim\d@Y<-.05\p@ \rectangleEdge@i
+ \else\ifdim\d@Y<.05\p@ \rectangleEdge@ii
+ \else \rectangleEdge@iii\fi\fi
+ \resetupDirection@}
+\xydef@\rectangleEdge@i{%
+ \ifdim\d@X<-.05\p@
+ \settomin@\X@c+\R@c\U@c\d@X\d@Y \settomin@\Y@c+\U@c\R@c\d@Y\d@X%1a
+ \else\ifdim\d@X<.05\p@ \advance\Y@c\U@c
+ \else \settomin@\X@c-\L@c\U@c\d@X\d@Y \settomin@\Y@c+\U@c\L@c\d@Y\d@X
+ \fi\fi}
+\xydef@\rectangleEdge@ii{%
+ \ifdim\d@X<-.05\p@ \advance\X@c\R@c
+ \else\ifdim\d@X<.05\p@
+ \else \advance\X@c-\L@c
+ \fi\fi}
+\xydef@\rectangleEdge@iii{%
+ \ifdim\d@X<-.05\p@
+ \settomin@\X@c+\R@c\D@c\d@X\d@Y \settomin@\Y@c-\D@c\R@c\d@Y\d@X%3a
+ \else\ifdim\d@X<.05\p@ \advance\Y@c-\D@c
+ \else \settomin@\X@c-\L@c\D@c\d@X\d@Y \settomin@\Y@c-\D@c\L@c\d@Y\d@X
+ \fi\fi}
+\xydef@\settomin@#1#2#3#4#5#6{%
+ \edef\nextii@{\A@=\the\A@ \B@=\the\B@}\quotient@\next@{#5}{#6}\nextii@
+ \dimen@=\sd@X\sd@Y\next@#4\relax
+ \ifdim#3<\dimen@ \dimen@=#3\fi \advance#1#2\dimen@}
+\xydef@\rectangleUnder@{\Inside@false
+ \ifdim\X@p=\X@c \ifdim\Y@p=\Y@c \Inside@true \fi\fi
+ \ifInside@ \else
+ \dimen@=\X@p \advance\dimen@-\X@c
+ \ifdim \dimen@>-\L@c \relax \ifdim\dimen@<\R@c
+ \dimen@=\Y@p \advance\dimen@-\Y@c
+ \ifdim \dimen@>-\D@c \relax \ifdim\dimen@<\U@c
+ \Inside@true
+ \fi\fi\fi\fi\fi }
+\xydef@\rectangleDist@{\let\next@=\rectangleDist@i
+ \ifdim\d@X<-.05\p@ \dimen@=\R@c
+ \else\ifdim\d@X<.05\p@ \dimen@=\z@ \DN@{\dimen@=\dimen@ii}%
+ \else \dimen@=\L@c \fi\fi
+ \ifdim\d@Y<-.05\p@ \dimen@ii=\U@c
+ \else\ifdim\d@Y<.05\p@ \DN@{}%
+ \else \dimen@ii=\D@c \fi\fi
+ \next@}
+\xydef@\rectangleDist@i{%
+ \begingroup \quotient@\next\p@{\sd@X\cosDirection\p@}%
+ \edef\next{\endgroup \dimen@=\next\dimen@}\next
+ \begingroup \quotient@\next\p@{\sd@Y\sinDirection\p@}%
+ \edef\next{\endgroup \dimen@ii=\the\dimen@ii}\next
+ \ifdim\dimen@ii<\dimen@ \dimen@=\dimen@ii \fi}
+\xydef@\rectangleProp@{%
+ \enter@{\A@=\the\A@ \B@=\the\B@ \DirectionfromtheDirection@}%
+ \reverseDirection@
+ \dimen@=1\Direction \count@=\K@ \multiply\count@\tw@
+ \ifnum \Direction>\count@
+ \DN@{0}%
+ \advance\dimen@-2\K@ \quotient@\nextii@{\dimen@}{2\K@}%
+ \else\ifnum \Direction>\z@
+ \dimen@=-\dimen@ \advance\dimen@2\K@ \quotient@\next@{\dimen@}{2\K@}%
+ \DNii@{0}%
+ \else\ifnum \Direction>-\count@
+ \DN@{1}%
+ \quotient@\nextii@{-\dimen@}{2\K@}%
+ \else
+ \advance\dimen@4\K@ \quotient@\next@{\dimen@}{2\K@}%
+ \DNii@{1}%
+ \fi\fi\fi
+ \advance\X@c-\L@c \dimen@=\L@c \advance\dimen@\R@c
+ \ifdim\dimen@=\z@ \advance\X@c 2\L@c \else \advance\X@c\next@\dimen@ \fi
+ \advance\Y@c+\U@c \dimen@=\D@c \advance\dimen@\U@c
+ \ifdim\dimen@=\z@ \advance\Y@c-2\U@c \advance\Y@c\Upness@\U@c
+ \else \advance\Y@c-\nextii@\dimen@ \fi
+ \leave@}
+\message{connections;}
+\xydef@\Creset@@{}
+\xydef@\Cshavep@@{\noCshavep@@}
+\xydef@\Cshavec@@{\noCshavec@@}
+\xydef@\Cslidep@@{\noCslidep@@}
+\xydef@\Cslidec@@{\noCslidec@@}
+\xydef@\Calong@@{\noCalong@@}
+\xydef@\Cintercept@@{\noCintercept@@}
+\xydef@\Cbreak@@{\noCbreak@@}
+\xydef@\Clast@@{\noClast@@}
+\xylet@\lastbreak@@=\empty
+\xydef@\noCshavep@@{\setupDirection@
+ \enter@{\cfromthec@ \DirectionfromtheDirection@}%
+ \reverseDirection@ \cfromp@ \the\Edge@c\z@
+ \pfromc@ \leave@ \resetDirection@}
+\xydef@\noCshavec@@{\setupDirection@ \the\Edge@c\z@ \resetDirection@}
+\xydef@\noCslidep@@#1{\dimen@=#1\relax
+ \advance\X@p\cosDirection\dimen@ \advance\Y@p\sinDirection\dimen@
+ \resetDirection@}
+\xydef@\noCslidec@@#1{\dimen@=#1\relax
+ \advance\X@c\cosDirection\dimen@ \advance\Y@c\sinDirection\dimen@
+ \resetDirection@}
+\xydef@\noCalong@@#1{%
+ \d@X=#1\d@X \d@Y=#1\d@Y \X@c=\X@p \Y@c=\Y@p \advance\X@c\d@X \advance\Y@c\d@Y
+ \resetupDirection@}
+\xydef@\noCintercept@@{\enter@{\pfromthep@}%
+ \begingroup\Creset@@ \edef\tmp@{\endgroup
+ \X@origin=\the\X@p \Y@origin=\the\Y@p \R@c=\the\d@X \U@c=\the\d@Y}\tmp@
+ \loop@\dimen@=\ifdim\R@c<\z@-\fi\R@c \advance\dimen@\ifdim\U@c<\z@-\fi\U@c
+ \ifdim\dimen@>10\p@ \advance\R@c \ifdim\R@c<\z@-\fi 16sp \divide\R@c\KK@
+ \advance\U@c \ifdim\U@c<\z@-\fi 16sp \divide\U@c\KK@ \repeat@
+ \intersect@ \leave@}
+\xydef@\noCbreak@@{\edef\lastbreak@@{\cfromthec@}}
+\xydef@\noClast@@{\Creset@@ \edef\lastbreak@@{\cfromthep@}}
+\xydef@\no@@{\setupDirection@ \edef\lastbreak@@{\cfromthep@}%
+ \enter@{\cfromthec@\pfromthep@\DirectionfromtheDirection@}%
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \edef\next@{{\sd@X}{\sd@Y}}\expandafter\straightcheckoverlap@\next@
+ \setupDirection@ \the\Edge@c\z@
+ \swap@\reverseDirection@\the\Edge@c\z@\swap@\reverseDirection@
+ \resetDirection@
+ \edef\Cshavep@@{\DirectionfromtheDirection@
+ \pfromthep@\noexpand\resetDirection@}%
+ \edef\Cshavec@@{\DirectionfromtheDirection@
+ \cfromthec@\noexpand\resetDirection@}%
+ \leave@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\def\Cintercept@@{\noCintercept@@}%
+ \def\Cbreak@@{\noCbreak@@}\def\Clast@@{\noClast@@}\noinsert@}
+\xydef@\noinsert@{\ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi
+ \fi}
+\xydef@\Spread@@{}
+\xydef@\checkoverlap@@{}
+\xydef@\straight@#1{\setupDirection@ \def\Spread@@{#1}%
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \edef\lastbreak@@{\cfromthep@}%
+ \edef\next@{{\sd@X}{\sd@Y}}\expandafter\straightcheckoverlap@\next@
+ \setupDirection@ \the\Edge@c\z@
+ \swap@\reverseDirection@\the\Edge@c\z@\swap@\reverseDirection@
+ \resetDirection@
+ \edef\Cshavep@@{\DirectionfromtheDirection@
+ \pfromthep@\noexpand\resetDirection@}%
+ \edef\Cshavec@@{\DirectionfromtheDirection@
+ \cfromthec@\noexpand\resetDirection@}%
+ \noinsert@
+ \straight@typeset
+ \def\Cbreak@@{\straightCbreak@}\def\Clast@@{\straightClast@}%
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\def\Cintercept@@{\noCintercept@@}%
+ \Creset@@}
+\xydef@\straightcheckoverlap@#1#2{\def\checkoverlap@@{%
+ \ifdim#1\X@p>#1\X@c \let\next@=\relax \fi
+ \ifdim#2\Y@p>#2\Y@c \let\next@=\relax \fi}}
+\xydef@\straight@typeset{%
+ \ifInvisible@ \let\next@=\relax
+ \else\ifdim 1\Direction<-2\K@ \DN@{\straightv@}%
+ \else\ifdim 1\Direction<\z@ \DN@{\straighth@}%
+ \else\ifdim 1\Direction<2\K@ \DN@{\straightv@}%
+ \else \DN@{\straighth@}%
+ \fi\fi\fi\fi \checkoverlap@@ \next@}
+\xylet@\nextbreak@@=\empty
+\xydef@\straightCbreak@{\connectRestore@
+ \edef\nextbreak@@{\cfromthec@}%
+ \Creset@@ \swap@ \the\Edge@c4\enter@{\cmergethec@}\lastbreak@@ \leave@
+ \swap@ \the\Edge@c4\enter@{\cmergethec@}\nextbreak@@ \leave@
+ \setupDirection@
+ \the\Edge@c\z@
+ \swap@ \reverseDirection@ \the\Edge@c\z@ \swap@ \reverseDirection@
+ \resetDirection@ \noinsert@ \straight@typeset
+ \Creset@@ \let\lastbreak@@=\nextbreak@@}
+\xydef@\straightClast@{\connectRestore@
+ \Creset@@ \swap@ \the\Edge@c4\enter@{\cmergethec@}\lastbreak@@ \leave@
+ \swap@
+ \setupDirection@
+ \the\Edge@c\z@
+ \swap@\reverseDirection@ \the\Edge@c\z@ \swap@\reverseDirection@
+ \resetDirection@ \noinsert@ \straight@typeset
+ \Creset@@ \edef\lastbreak@@{\cfromthep@}}
+\xydef@\straighth@{\setbox\z@=\hbox{%
+ \setbox8=\copy\lastobjectbox@
+ \A@=\wd8\relax \B@=\dp8\relax \advance\B@\ht8\relax
+ \ifdim \A@=\z@ \count@@=\m@ne
+ \else \dimen@=\sd@X\d@X \divide\dimen@\A@ \count@@=\dimen@ \fi
+ \Spread@@
+ \ifdim\d@X>\z@ \advance\X@c-\wd8\relax\fi
+ \dimen@=-\sd@X\wd8\relax
+ \multiply\dimen@\K@dYdX \divide\dimen@\K@
+ \ifdim\d@X>\z@ \advance\Y@c\dimen@ \advance\Y@c-\Leftness@\dimen@
+ \else \advance\Y@c\Leftness@\dimen@ \fi
+ \dimen@=\wd8\relax \A@=\sd@X\d@X \advance\A@-\dimen@
+ \B@=\sd@X\dimen@ \multiply\B@\K@dYdX \divide\B@\K@
+ \advance\B@-\d@Y \B@=\sd@Y\B@
+ \count@=\count@@ \advance\count@\m@ne
+ \ifnum\z@<\count@ \divide\A@\count@ \divide\B@\count@ \fi
+ \A@=-\sd@X\A@ \B@=\sd@Y\B@ \wd8=\A@
+ \kern\X@c \count@=\z@
+ \loop@\ifnum\count@<\count@@ \advance\count@\@ne
+ \raise\Y@c\copy8\relax \advance\Y@c\B@ \repeat@}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
+\xydef@\straightv@{\setbox\z@=\vtop{%
+ \setbox8=\copy\lastobjectbox@
+ \A@=\wd8\relax \B@=\dp8\relax \advance\B@\ht8\relax
+ \ifdim \B@=\z@ \count@@=\m@ne
+ \else \dimen@=\sd@Y\d@Y \divide\dimen@\B@ \count@@=\dimen@ \fi
+ \Spread@@
+ \dimen@=\dp8\relax \advance\dimen@\ht8\relax
+ \B@=\sd@Y\d@Y \advance\B@-\dimen@
+ \A@=\sd@Y\dimen@ \multiply\A@\K@dXdY \divide\A@\K@ \advance\A@-\d@X
+ \A@=\sd@X\A@ \count@=\count@@ \advance\count@\m@ne
+ \ifnum\z@<\count@ \divide\B@\count@ \divide\A@\count@ \fi
+ \B@=\sd@Y\B@ \A@=\sd@X\A@ \ht8=\B@ \dp8=\z@
+ \ifdim\d@Y<\z@
+ \advance\Y@c\dimen@ \advance\Y@c\Upness@\B@
+ \else
+ \advance\dimen@\Upness@\B@ \advance\Y@c-\dimen@ \advance\Y@c\B@
+ \fi
+ \advance\Y@c\B@
+ \ifdim\d@X<\z@ \else \advance\X@c-\wd8\relax \fi
+ \null \kern-\Y@c \count@=\z@
+ \loop@\ifnum\count@<\count@@ \advance\count@\@ne
+ \nointerlineskip \moveright\X@c\copy8\relax \advance\X@c\A@
+ \repeat@}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
+\message{ Xy-pic loaded}\xyuncatcodes \endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xy16textures.tex b/macros/generic/diagrams/xypic/texinputs/xy16textures.tex
new file mode 100644
index 0000000000..79b773b025
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xy16textures.tex
@@ -0,0 +1,122 @@
+%% xy16textures.tex from $Id: xy16textures.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Textures v1.6'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{16textures}{Textures v1.6 driver}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\oldTextures@@#1{\dvimessage@{Textures v1.6}{#1}}
+\newdriver{%
+ \xyaddsupport{color}\oldtexturesColor@@
+ \xyaddsupport{crayon}\oldtexturesCrayon@@
+ \xyaddsupport{ps}\oldtexturesPS@@
+ \xyaddsupport{rotate}\oldtexturesRotate@@
+ \xyaddsupport{line}\oldtexturesLine@@
+ \xyaddsupport{frame}\oldtexturesFrames@@
+ \xyaddsupport{tile}\oldtexturesTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\xydef@\oldTexturesColours@{\oldtexturesPStypes@
+ \let\xylocalColor@=\xyNoColor@@ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\oldtexturesCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@ \fi \next@
+ \let\xycolorwarning@=\relax
+ \let\oldtexturesColor@@=\relax
+ \let\UnloadColor@@=\NooldTexturesColor@
+ }
+\xydef@\oldtexturesColor@@{\oldTexturesColours@}
+\xydef@\NooldTexturesColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\oldtexturesColor@@=\oldTexturesColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\xydef@\oldtexturesCrayon@@{\oldtexturesColor@@\oldtexturesCrayon@}
+\xydef@\oldtexturesCrayon@{\installCrayolaColors@}%
+\xydef@\oldtexturesPS@@{\oldtexturesPS@}
+\xydef@\oldtexturesPSunload@{\UnloadPS@
+ \ifx\xyrealshipout@\undefined\else
+ \ifx\shipout\xyrealshipout@
+ \else \let\shipout=\xyrealshipout@\fi\fi
+ \let\installxyps@@=\relax
+ \let\UnloadPS@@=\UnloadPS@
+ \let\oldtexturesPS@@=\oldtexturesPS@ }
+\xydef@\oldTexturesSpecial@#1{\firstPS@@\special{postscript #1}}
+\xydef@\oldTexturesMacro@#1{\special{postscript {#1}xy}}
+\xydef@\oldTexturesInclude@#1{\firstPS@@\special{rawpostscriptfile #1}}
+\xydef@\oldTexturesRaw@#1{\firstPS@@\special{rawpostscript #1}}
+\xydef@\oldtexturesPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\oldTexturesSpecial@\else
+ \let\PSspecial@@=\oldTexturesSpecial@
+ \let\PSmacro@@=\oldTexturesMacro@
+ \let\PSdict@@=\oldTexturesRaw@
+ \let\PSraw@@=\oldTexturesRaw@
+ \let\PSinclude@@=\oldTexturesInclude@
+ \let\PSspecialdict@@=\oldTexturesRaw@
+ \let\xyPSobeylines@@=\obeyoldTextureslines@
+ \oldTextures@@{PostScript}%
+ \fi
+ \oldtexturesCurrpt@ \@PSshipout }
+{\catcode`\^^M=\active
+ \gdef\next{\catcode`\^^M=\active \let^^M=\par \obeyspaces}}
+\xylet@\obeyoldTextureslines@=\next
+\xydef@\oldtexturesCurrpt@{\let\xyPScurrpt@@=\oldtexturesCurrpt@@}%
+\xydef@\oldtexturesCurrpt@@{\PSspecial@@{xyi}\PSraw@@{userdict begin xyx end}}
+\xydef@\oldtexturesPS@{\oldtexturesPStypes@
+ \let\oldtexturesPS@@=\relax
+ \let\UnloadPS@@=\oldtexturesPSunload@
+ \let\installxyps@@=\@PSshipout \installxyps@ }
+\xydef@\oldtexturesRotate@@{\oldtexturesRotate@}
+\xydef@\oldtexturesRotate@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xyRotScale@@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+\xydef@\oldtexturesLine@@{\oldtexturesLine@}
+\xydef@\oldtexturesLine@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}%
+ \installPSline@ }%
+ \else\DN@{\xydriverfail@{line-styles are}\UnloadLine@\relax}\fi
+ \next@ }
+\xydef@\oldtexturesFrames@@{\oldtexturesFrames@}
+\xydef@\oldtexturesFrames@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}%
+ \installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\xydef@\oldtexturesTiles@@{\oldtexturesTiles@}
+\xydef@\oldtexturesTiles@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}%
+ \installPSpatterns@ \xystandardpatterns@}%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xy17oztex.tex b/macros/generic/diagrams/xypic/texinputs/xy17oztex.tex
new file mode 100644
index 0000000000..fed8bf2a6a
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xy17oztex.tex
@@ -0,0 +1,121 @@
+%% xy17oztex.tex from $Id: xy17oztex.doc,v 3.8 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``OzTeX v1.7'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{17oztex}{OzTeX v1.7 driver}{\stripRCS$Revision: 3.8 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\OzTeX@@#1{\dvimessage@{OzTeX v1.7}{#1}}
+\newdriver{%
+ \xyaddsupport{color}\oldoztexColor@@
+ \xyaddsupport{crayon}\oldoztexCrayon@@
+ \xyaddsupport{ps}\oldoztexPS@@
+ \xyaddsupport{rotate}\oldoztexRotate@@
+ \xyaddsupport{line}\oldoztexLine@@
+ \xyaddsupport{frame}\oldoztexFrames@@
+ \xyaddsupport{tile}\oldoztexTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\xydef@\oldoztexColor@@{\oldOzTeXColours@}
+\xydef@\oldOzTeXColours@{\oldOzTeXPStypes@
+ \let\xylocalColor@=\xyNoColor@@ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\oldOzTeXCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@\fi \next@
+ \let\xycolorwarning@=\relax
+ \let\oldoztexColor@@=\relax
+ \let\UnloadColor@@=\NooldOzTeXColor@
+ }
+\xydef@\NooldOzTeXColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\oldoztexColor@@=\oldOzTeXColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\xydef@\oldOzTeXCrayon@@{\installCrayolaColors@}
+\xydef@\oldoztexPS@@{\oldoztexPS@}
+\xydef@\oldoztexPSunload@{\UnloadPS@
+ \def\xyPSdictname{}\UsePSdict@@false
+ \let\installxyps@@=\relax
+ \let\UnloadPS@@=\UnloadPS@
+ \xyPSshapes@true
+ \let\oldoztexPS@@=\oldoztexPS@ }
+\xydef@\oldOzTeXSpecial@#1{\special{empty.ps {#1}xy}}
+\xydef@\oldOzTeXMacro@#1{\special{empty.ps {#1}xy}}
+\xydef@\oldOzTeXDict@#1{\special{empty.ps @obxy{#1}stopped pop @eoxy}}
+\xydef@\oldOzTeXinclude@#1{\special{#1}}
+\xydef@\oldOzTeXraw@#1{\special{empty.ps @boxy #1 @eoxy}}%
+\xydef@\oldOzTeXPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\oldOzTeXSpecial@\else
+ \let\PSspecial@@=\oldOzTeXSpecial@
+ \let\PSmacro@@=\oldOzTeXMacro@
+ \let\PSdict@@=\oldOzTeXDict@
+ \let\PSraw@@=\oldOzTeXraw@
+ \let\PSinclude@@=\oldOzTeXinclude@
+ \let\xyPSobeylines@@=\obeyoldOzTeXlines@
+ \let\PSspecialdict@@=\oldOzTeXDict@
+ \oldOzTeX@@{PostScript}%
+ \fi
+ \oldOzTeXCurrpt@ }
+{\catcode`\^^M=\active
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space \obeyspaces}}
+\xylet@\obeyoldOzTeXlines@=\next
+\xydef@\oldOzTeXCurrpt@{\let\xyPScurrpt@@=\OzTeXCurrpt@@}%
+\xydef@\oldOzTeXCurrpt@@{}
+\xydef@\oldoztexPS@@{\oldOzTeXPStypes@
+ \let\installxyps@@=\old@OzTeX@PS@
+ \installxyps@ }
+\xydef@\old@OzTeX@PS@{\UsePSdict@@true
+ \let\includePSmessage@=\xyoldOzTeXheader
+ \ifx\undefined\xyPSdictname\def\xyPSdictname{global.ps}\fi}
+\xydef@\xyoldOzTeXheader#1#2#3{\UsePSdict@@true}
+\xydef@\oldoztexLine@@{\oldoztexLine@}
+\xydef@\oldoztexLine@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-styles are}\UnloadLine@\relax}\fi
+ \next@ }
+\xydef@\oldoztexFrames@@{\oldOzTeXFrames@}
+\xydef@\oldOzTeXFrames@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\xydef@\oldoztexTiles@@{\oldOzTeXTiles@}
+\xydef@\oldOzTeXTiles@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@
+ \xystandardpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\xydef@\oldoztexRotate@@{\oldOzTeXRotate@}
+\xydef@\oldOzTeXRotate@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xyRotScale@@ \installPSrotscale@ \xyPSshapes@false }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xy2cell.tex b/macros/generic/diagrams/xypic/texinputs/xy2cell.tex
new file mode 100644
index 0000000000..05d3534f48
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xy2cell.tex
@@ -0,0 +1,668 @@
+%% xy2cell.tex from $Id: xy2cell.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``2-cell'' feature.
+%% Copyright (c) 1993-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this macro package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{2cell}{Two-cell feature}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xyrequire{curve}\xycatcodes
+\message{two-cells,}
+\xydef@\UseTwocells{\definesupermorphism{twocell}{%
+ \xy@{start of 2-cell}{\begingroup}%
+ \twocell@}}
+\xydef@\UseHalfTwocells{%
+ \definesupermorphism{uppertwocell}{%
+ \xy@{start of 2-cell}{\begingroup}%
+ \uppertwocell@}%
+ \definesupermorphism{lowertwocell}{%
+ \xy@{start of 2-cell}{\begingroup}%
+ \lowertwocell@}}
+\xydef@\UseCompositeMaps{\definesupermorphism{compositemap}{%
+ \xy@{start composite-map}{\begingroup}%
+ \compositemap@}}
+\xydef@\UseAllTwocells{%
+ \UseTwocells \UseHalfTwocells \UseCompositeMaps }
+\xydef@\supermorphism#1[#2]#3{\def\afterMORPHISM{[#2]#3}#1}
+\xydef@\afterMORPHISM{}
+\xydef@\definesupermorphism#1#2{%
+ \expandafter\def\csname x#1\endcsname{\supermorphism{#2}}%
+ \expandafter\def\csname u#1\endcsname{\supermorphism{#2}[-1,0]{}}%
+ \expandafter\def\csname d#1\endcsname{\supermorphism{#2}[1,0]{}}%
+ \expandafter\def\csname l#1\endcsname{\supermorphism{#2}[0,-1]{}}%
+ \expandafter\def\csname r#1\endcsname{\supermorphism{#2}[0,1]{}}%
+ \expandafter\def\csname uu#1\endcsname{\supermorphism{#2}[-2,0]{}}%
+ \expandafter\def\csname dd#1\endcsname{\supermorphism{#2}[2,0]{}}%
+ \expandafter\def\csname ll#1\endcsname{\supermorphism{#2}[0,-2]{}}%
+ \expandafter\def\csname rr#1\endcsname{\supermorphism{#2}[0,2]{}}%
+ \expandafter\def\csname ur#1\endcsname{\supermorphism{#2}[-1,1]{}}%
+ \expandafter\def\csname ul#1\endcsname{\supermorphism{#2}[-1,-1]{}}%
+ \expandafter\def\csname dr#1\endcsname{\supermorphism{#2}[1,1]{}}%
+ \expandafter\def\csname dl#1\endcsname{\supermorphism{#2}[1,-1]{}}%
+ \expandafter\def\csname uul#1\endcsname{\supermorphism{#2}[-2,-1]{}}%
+ \expandafter\def\csname uur#1\endcsname{\supermorphism{#2}[-2,1]{}}%
+ \expandafter\def\csname ull#1\endcsname{\supermorphism{#2}[-1,-2]{}}%
+ \expandafter\def\csname urr#1\endcsname{\supermorphism{#2}[-1,2]{}}%
+ \expandafter\def\csname ddl#1\endcsname{\supermorphism{#2}[2,-1]{}}%
+ \expandafter\def\csname ddr#1\endcsname{\supermorphism{#2}[2,1]{}}%
+ \expandafter\def\csname dll#1\endcsname{\supermorphism{#2}[1,-2]{}}%
+ \expandafter\def\csname drr#1\endcsname{\supermorphism{#2}[1,2]{}}%
+ \expandafter\def\csname uull#1\endcsname{\supermorphism{#2}[-2,-2]{}}%
+ \expandafter\def\csname uurr#1\endcsname{\supermorphism{#2}[-2,2]{}}%
+ \expandafter\def\csname ddll#1\endcsname{\supermorphism{#2}[2,-2]{}}%
+ \expandafter\def\csname ddrr#1\endcsname{\supermorphism{#2}[2,2]{}}}
+\newdir{=>}{!/5pt/\dir{=}!/2.5pt/\dir{=}*!/-5pt/\dir2{>}}
+\xydef@\arrowobject#1{\def\Arrowobject@{#1}}
+\xydef@\Arrowobject@{\dir{=>}}
+\xydef@\twocell@{\toks6={3.5}\toks5={@}\toks7={@}\toks8={@}\toks3={f}%
+ \tw@cell@ }
+\xydef@\uppertwocell@{\toks6={7}\toks5={@}\toks7={@}\toks8={@}\toks3={o}%
+ \tw@cell@ }
+\xydef@\lowertwocell@{\toks6={-7}\toks5={@}\toks7={@}\toks8={@}\toks3={o}%
+ \tw@cell@ }
+\xydef@\compositemap@{\toks6={3.5}\toks5={@}\toks7={@}\toks8={@}\toks3={t}%
+ \tw@cell@ }
+\xydef@\tw@cell@@@{%
+ \expandafter\ifx\the\toks6\omit\relax\toks6={}\else
+ \expandafter\ifx\expandafter @\the\toks7\relax\expandafter\dimen@\the\toks6\p@
+ \expandafter\if\the\toks3t\relax\dimen@=\p@
+ \else\expandafter\if\the\toks3o\divide\dimen@\tw@
+ \ifdim\dimen@<\z@ \dimen@ii-\p@ \advance\dimen@ii\dimen@
+ \dimen@=\dimen@ii \else \dimen@\p@ \fi
+ \else\dimen@\p@
+ \fi\fi
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\toks\expandafter7\expandafter{\tmp@}\fi
+ \expandafter\ifx\expandafter @\the\toks8\relax
+ \expandafter\dimen@\the\toks6\p@
+ \expandafter\if\the\toks3t\relax\dimen@\p@
+ \else\expandafter\if\the\toks3o\divide\dimen@\tw@
+ \ifdim\dimen@<\z@ \dimen@ii-\p@ \advance\dimen@ii\dimen@
+ \dimen@=\dimen@ii \else \dimen@\p@ \fi
+ \else\dimen@\p@
+ \fi\fi
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\toks\expandafter8\expandafter{\tmp@}\fi
+ \expandafter\ifx\expandafter @\the\toks5\relax
+ \expandafter\dimen@\the\toks6\p@
+ \expandafter\if\the\toks3o\divide\dimen@ by-4\relax
+ \else\dimen@\z@\fi
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\toks\expandafter5\expandafter{\tmp@}\fi
+ \fi
+ \twocellmod@
+ \expandafter\if\the\toks3t\relax
+ \edef\tmp@{.[\noexpand\twocell@@@@{\the\toks6}{\the\toks5}%
+ {\the\toks7}{\the\toks8}{\the\toks3}%
+ {\the\toks2}{\the\toks1}{\the\toks@}{\the\toks4}!!!].\afterMORPHISM}%
+ \else
+ \edef\tmp@{.[\noexpand\twocell@@@@{\the\toks6}{\the\toks5}%
+ {\the\toks7}{\the\toks8}{\the\toks3}%
+ {\the\toks1}{\the\toks2}{\the\toks@}{\the\toks4}!!!].\afterMORPHISM}%
+ \fi
+ \toks@={\endgroup}%
+ \expandafter\def\expandafter\next@\expandafter{%
+ \expandafter\def\expandafter\twocellhead@\expandafter{\twocellhead@}}%
+ \expandafter\addtotoks@\expandafter{\next@}%
+ \expandafter\def\expandafter\next@\expandafter{%
+ \expandafter\def\expandafter\twocelltail@\expandafter{\twocelltail@}}%
+ \expandafter\addtotoks@\expandafter{\next@}%
+ \expandafter\addtotoks@\expandafter{\expandafter\twocellPATH\tmp@}%
+ \the\toks@ }%
+\xydef@\twocellstyle{\scriptstyle}
+\xydef@\droptwocelllabel@#1{\xyFN@\droptwocelllabel@@#1@!}
+\xydef@\droptwocelllabel@@{%
+ \ifx*\next\DN@*{\droptwocelldrop@}%
+ \else\DN@##1@!{\droptwocelltext@{##1}}%
+ \fi \next@ }
+{\xyuncatcodes \gdef\next#1{\drop+!C{\twocellstyle #1}}}
+\xylet@\droptwocelltext@=\next
+\xydef@\droptwocelldrop@#1@!{\bgroup \let\xy@=\oxy@
+ \let\objectstyle=\twocellstyle \drop#1{}%
+ \edef\tmp@{\egroup \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max}\tmp@ }
+\xydef@\twocellhead#1{\def\twocellhead@{#1}}
+\xydef@\twocelltail#1{\def\twocelltail@{#1}}
+\xydef@\twocellhead@{\dir{>}}
+\xydef@\twocelltail@{}
+\xywarnifdefined\twocellmod@
+\xydef@\tw@cell@{\begingroup
+ \toks@={{}}\toks1={{}}\toks2={{}}\toks4={{}}%
+ \def\twocellmod@{}\xyFN@\tw@@cell@}%
+\xydef@\tw@@cell@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\tw@@cell@}%
+ \else\ifx\bgroup\next \let\next@=\toks@\afterassignment\tw@@cell@@
+ \else\ifx ^\next \DN@^##1{\toks@={##1}\nudgepos@71\tw@@cell@}%
+ \else\ifx _\next \DN@_##1{\toks@={##1}\nudgepos@82\tw@@cell@}%
+ \else\addLT@\ifx \next \addGT@{\addLT@\DN@##1}{%
+ \toks6={##1}\ifx\omit##1\relax\toks3={t}\toks5={0}\fi\xyFN@\tw@@cell@}%
+ \else\ifx\omit\next \DN@\omit{\omitarrows@\xyFN@\tw@@cell@}%
+ \else\ifx~\next \DN@~{\xyFN@\whichCurveObject@}%
+ \else \DN@{\xyFN@\tw@cell@@\empty @}%
+ \fi\fi\fi\fi\fi\fi\fi%
+ \next@ }
+\xydef@\whichCurveObject@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\whichCurveObject@}%
+ \else\ifx\next^\DN@^##1{\xy@{~^{##1}}{\uppercurveobject{##1}}\xyFN@\tw@@cell@}%
+ \else\ifx\next_\DN@_##1{\xy@{~_{##1}}{\lowercurveobject{##1}}\xyFN@\tw@@cell@}%
+ \else\addRQ@\ifx\next \addRQ@\DN@##1{%
+ \xy@{~'{##1}}{\def\twocellhead@{##1}}\xyFN@\tw@@cell@}%
+ \else\addLQ@\ifx\next \addLQ@\DN@##1{%
+ \xy@{~`{##1}}{\def\twocelltail@{##1}}\xyFN@\tw@@cell@}%
+ \else\ifx!\next \DN@!{\xyFN@\checkmodmap@}%
+ \else\ifx\next\bgroup\DN@##1{\xy@{~{##1}}{\curveobject{##1}}\xyFN@\tw@@cell@}%
+ \else\DN@##1{\xy@{~##1}{\curveobject{##1}}\xyFN@\tw@@cell@}%
+ \fi\fi\fi\fi \fi\fi\fi
+ \next@ }
+\xydef@\checkmodmap@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\checkmodmap@}%
+ \else \def\twocellmod@{\modmap@}%
+ \ifx\next!\DN@!##1{%
+ \xy@{~!!{##1}}{\def\modmapobject@{##1}}\xyFN@\tw@@cell@}%
+ \else \DN@{\xyFN@\tw@@cell@}\fi
+ \fi \next@ }
+\xydef@\omitarrows@{\toks5={0}\toks6={}\toks7={0}\toks8={0}}
+\xydef@\tw@@cell@@{\expandafter\xyFN@\expandafter\tw@cell@@\the\toks@ @}
+\xydef@\tw@cell@@{\ifx \space@\next\expandafter\DN@\space{\xyFN@\tw@cell@@}%
+ \else\ifx ^\next
+ \DN@^##1@{\toks@={##1}\toks4={^}\nudgepos@50\tw@cell@@@}%
+ \else\addEQ@\ifx\next
+ \addEQ@\DN@##1@{\toks@={##1}\toks4={=}\nudgepos@50\tw@cell@@@}%
+ \else\ifx _\next
+ \DN@_##1@{\toks@={##1}\toks4={_}\nudgepos@50\tw@cell@@@}%
+ \else\addLT@\ifx \next
+ \DN@##1@{\toks@={##1}\toks4={_}\nudgepos@50\tw@cell@@@}%
+ \else\ifx\omit\next \DN@\omit##1@{\toks4={@}\toks@={##1}\tw@cell@@@}%
+ \else\addRQ@\ifx\next \addRQ@\DN@##1@{\toks4={@}\toks3={/}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\addLQ@\ifx\next \addLQ@\DN@##1@{\toks4={@}\toks3={b}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\ifx"\next \DN@"##1@{\toks4={@}\toks3={B}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\ifx!\next \DN@!##1@{\toks4={@}\toks3={@}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\ifx\next\empty\DN@##1@{\toks@={{}}\toks4={_}\tw@cell@@@}%
+ \else\DN@##1@{\toks@={##1}\toks4={_}\tw@cell@@@}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@ }
+\xywarnifdefined\whichnudge
+\xywarnifdefined\whichinfo
+\xywarnifdefined\afternudge
+\xydef@\nudgepos@#1#2#3{\def\whichnudge{\toks#1}\def\whichinfo{\toks#2}%
+ \def\afternudge{#3}\expandafter\xyFN@\expandafter\nudgepos@@\the\toks@ @}
+\xydef@\nudgepos@@{\ifx \space@\next\expandafter\DN@\space{\xyFN@\nudgepos@}%
+ \else\addLT@\ifx \next
+ \addGT@{\addLT@\DN@##1}##2@{%
+ \ifx\omit##1\relax\whichnudge={0}\whichinfo={}%
+ \else\whichnudge={##1}\whichinfo={##2}\fi\xyFN@\afternudge}%
+ \else \DN@##1@{\whichinfo={##1}\xyFN@\afternudge}%
+ \fi\fi \next@ }
+\xydef@\modmap@{%
+ \expandafter\ifx\the\toks4@\toks4={!}%
+ \else\expandafter\ifx\the\toks4=\toks4={H}%
+ \else\expandafter\ifx\the\toks4^\toks4={A}%
+ \else\expandafter\ifx\the\toks4_\toks4={V}\fi\fi\fi\fi
+ \expandafter\DN@\expandafter{\the\toks6}%
+ \ifx\next@\empty\relax\else\expandafter\moddefs@\fi}
+\xydef@\moddefs@{%
+ \expandafter\dimen@\the\toks6\p@
+ \ifdim\dimen@=\z@\relax
+ \expandafter\dimen@\the\toks7\p@
+ \ifdim\dimen@<\z@\advance\dimen@.5\p@\else\advance\dimen@-.5\p@\fi
+ \edef\tmp@{\noexpand\toks7={\expandafter\removePT@\the\dimen@}}\tmp@
+ \expandafter\dimen@\the\toks8\p@
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \expandafter\ifx\the\toks3t\advance\dimen@-1\p@\fi
+ \edef\tmp@{\noexpand\toks8={\expandafter\removePT@\the\dimen@}}\tmp@
+ \else
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \edef\tmp@{\noexpand\toks6={\expandafter\removePT@\the\dimen@}}\tmp@
+ \expandafter\dimen@\the\toks7\p@
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \expandafter\ifx\the\toks3t\advance\dimen@-2\p@\fi
+ \edef\tmp@{\noexpand\toks7={\expandafter\removePT@\the\dimen@}}\tmp@
+ \expandafter\dimen@\the\toks8\p@
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \expandafter\ifx\the\toks3t\advance\dimen@-2\p@\fi
+ \edef\tmp@{\noexpand\toks8={\expandafter\removePT@\the\dimen@}}\tmp@
+ \fi }%
+\xydef@\modmapobject#1{\def\modmapobject@{#1}}
+\xydef@\modmapobject@{\dir{|}}
+\xydef@\@modmapobject@{{\if\@mod@\relax\expandafter\empty
+ \else\expandafter\modmapobject@\fi}}
+\xydef@\curveobject#1{\def\ucurveObject@{~*#1}\def\dcurveObject@{~*#1}}
+\xydef@\uppercurveobject#1{\def\ucurveObject@{~*#1}}
+\xydef@\lowercurveobject#1{\def\dcurveObject@{~*#1}}
+\xydef@\ucurveObject@{}
+\xydef@\dcurveObject@{}
+\xydef@\savetwocellobjects{%
+ \xy@{twocell objects}{%
+ \expandafter\uppercurveobject\expandafter{\ucurveObject@}%
+ \expandafter\lowercurveobject\expandafter{\dcurveObject@}%
+ \expandafter\modmapobject\expandafter{\modmapobject@}%
+ \expandafter\twocellhead\expandafter{\twocellhead@}%
+ \expandafter\twocelltail\expandafter{\twocelltail@}%
+ \expandafter\arrowobject\expandafter{Arrowobject@}%
+ }}
+\xydef@\twocell@path.[#1].{%
+ \expandafter\ifx\csname Q@@c\endcsname\relax
+ \DN@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}%
+ \xy@{}{\expandafter\edef\csname Q@@\endcsname{\cfromthec@}}%
+ \afterPOS{\xy@{}%
+ {\expandafter\edef\csname Q@@c\endcsname{\cfromthec@}}%
+ \xy@{}%
+ {\cfromid@{@}\expandafter\edef\csname Q@@p\endcsname{\cfromthec@}}%
+ \xy@{twocell #1}{#1}\leave@\aftertwoCELL};p,}%
+ \else
+ \DN@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}%
+ \xy@{twocell #1}{#1}\leave@\aftertwoCELL}%
+ \fi \next@ }
+\xydef@\twocellpath.[#1].{%
+ \expandafter\edef\csname Q@@p\endcsname{\cfromthec@}%
+ \xy@{}{\enter@{\pfromthep@}}%
+ \xy@{}{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}%
+ \enter@{\pfromthec@}}%
+ \afterPOS{\xy@{}{\leave@\setupDirection@}#1\restore\restore
+ \xy@{end of 2-cell}\xysaveMinMax@ }}%
+\xydef@\xysaveMinMax@{\edef\tmp@{\endgroup
+ \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi
+ \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi
+ }\tmp@ }
+\xylet@\twocellPATH=\twocellpath
+\xydef@\aftertwo@CELL{\let\twocellPATH=\twocellpath \def\aftertwoCELL{}}
+\xydef@\aftertwoCELL{}
+\xydef@\twocell@@@@#1!!!{\xy@{twocell #1}{\twocell@@#1!!!}}
+\let\xystatus=\xystatus@
+\xydef@\twocell{\hbox\bgroup\@twocell}
+\xydef@\uppertwocell{\hbox\bgroup\@uppertwocell}
+\xydef@\lowertwocell{\hbox\bgroup\@lowertwocell}
+\xydef@\compositemap{\hbox\bgroup\@compositemap}
+\xydef@\twocelll#1#{\hbox\bgroup\xy@\save\save@\@twocelll{#1}}
+\xydef@\@twocelll#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\twocell@#1{#2}}}
+\xydef@\uppertwocelll#1#{\hbox\bgroup\xy@\save\save@\@uppertwocelll{#1}}
+\xydef@\@uppertwocelll#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\uppertwocell@#1{#2}}}
+\xydef@\lowertwocelll#1#{\hbox\bgroup\xy@\save\save@\@lowertwocelll{#1}}
+\xydef@\@lowertwocelll#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\lowertwocell@#1{#2}}}
+\xydef@\compositemapp#1#{\hbox\bgroup\xy@\save\save@\@compositemapp{#1}}
+\xydef@\@compositemapp#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\compositemap@#1{#2}}}
+\xydef@\@twocelll@{%
+ \expandafter\edef\csname Q@@c\endcsname{\cfromthec@}\swap@
+ \expandafter\edef\csname Q@@p\endcsname{\cfromthec@}\swap@
+ \let\twocellPATH=\twocell@path
+ \def\aftertwoCELL{\twocell@DONE \xy@\restore \leave@
+ }}
+\xydef@\@twocell#1{\DN@{\@twocell@\twocell@}\xyFN@\next@[#1]}
+\xydef@\@uppertwocell#1{\DN@{\@twocell@\uppertwocell@}\xyFN@\next@[#1]}
+\xydef@\@lowertwocell#1{\DN@{\@twocell@\lowertwocell@}\xyFN@\next@[#1]}
+\xydef@\@compositemap#1{\DN@{\@twocell@\compositemap@}\xyFN@\next@[#1]}
+\xydef@\@twocell@#1{\ifx\next[\DN@[{\toks@={#1}\xyFN@\@@twocell@}%
+ \else\DN@{#1{}}\fi
+%%
+ \expandafter\edef\csname Q@@c\endcsname{\cfromthec@}\swap@
+ \expandafter\edef\csname Q@@p\endcsname{\cfromthec@}\swap@
+ \let\twocellPATH=\twocell@path
+ \def\aftertwoCELL{\twocell@DONE}\next@}
+\xydef@\@@twocell@{\ifx\next\bgroup\DN@##1]{\the\toks@{##1}}%
+ \else\DN@##1]{\the\toks@##1}\fi\next@}
+%% \DN@{\twocell}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@twocell}
+%% \DN@{\uppertwocell}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@uppertwocell}
+%% \DN@{\lowertwocell}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@lowertwocell}
+%% \DN@{\compositemap}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@compositemap}
+\xydef@\twocell@DONE{%
+ \edef\tmp@{\egroup \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max}\tmp@
+ \L@c=\X@c \advance\L@c-\X@min \R@c=\X@max \advance\R@c-\X@c
+ \D@c=\Y@c \advance\D@c-\Y@min \U@c=\Y@max \advance\U@c-\Y@c
+ \ht\z@=\U@c \dp\z@=\D@c \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@
+ \computeLeftUpness@
+\setboxz@h{\kern-\X@p \raise-\Y@c\boxz@ }%
+\dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c
+ \Edge@c={\rectangleEdge}\Invisible@false \Hidden@false
+ \edef\Drop@@{\noexpand\drop@Twocell
+ \noexpand\def\noexpand\Leftness@{\Leftness@}%
+ \noexpand\def\noexpand\Upness@{\Upness@}}%
+ \edef\Connect@@{\noexpand\connect@Twocell
+ \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi
+ \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi }}%
+\xydef@\drop@Twocell{\boxz@ }
+\xydef@\connect@Twocell{%
+ \setboxz@h{\kern\X@p \raise\Y@c\box\lastobjectbox@ }%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \Drop@@ }
+\xywarnifdefined\@mod@
+\xywarnifdefined\Arrowtok@
+\xydef@\twocell@@#1#2#3#4#5#6#7#8#9!!!{%
+ \def\@mod@{@}\DN@{#9}%
+ \ifx #9!\def\Arrowtok@{@}\else\ifx #9A\def\Arrowtok@{^}%
+ \else\ifx #9V\def\Arrowtok@{_}\else\ifx #9H\def\Arrowtok@{=}%
+ \else\def\@mod@{\relax}%
+ \ifx #5/\def\Arrowtok@{@}\else\ifx #5b\def\Arrowtok@{@}%
+ \else\ifx #5B\def\Arrowtok@{@}\else\ifx #5@\def\Arrowtok@{@}%
+ \else\def\Arrowtok@{#9}%
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \addEQ@\ifx #9\def\Arrowtok@{=}\fi
+ \DN@{\omit}\ifx\next@\Arrowtok@\def\Arrowtok@{}\else
+ \edef\Arrowtok@{\codeof\Arrowtok@}\fi
+ \save@ \idfromc@{@c}\swap@\idfromc@{@p}\swap@
+ \cfromid@{@c}\no@@
+ \ifdim \X@c<\X@p \X@min=\X@c \X@max=\X@p \else \X@min=\X@p \X@max=\X@c \fi
+ \ifdim \Y@c<\Y@p \Y@min=\Y@c \Y@max=\Y@p \else \Y@min=\Y@p \Y@max=\Y@c \fi
+ \Calong@@{.5}\idfromc@{@m}\idfromc@{@m1}\idfromc@{@m2}%
+ \ifx #5t\relax
+ \enter@{\cplusthec@\pfromthep@}%
+ \enter@\DirectionfromtheDirection@ \begingroup\aboveDirection@ \xydashl@
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@=\z@ \DN@{\vfromslide@i{\xydashl@}@}\relax
+ \else\DN@{\vfromslide@i{#1\xydashl@}@}\fi \next@
+ \czeroEdge@ \leave@ \no@@ \drop@{+}{}\idfromc@{@m1}%
+ \DN@{#1}\ifx\next@\empty\DN@{\no@@}\else\DN@{\connect@{\dir}{-}}\fi
+ \else
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@=\z@ \enter@{\cplusthec@\pfromthep@}%
+ \enter@\DirectionfromtheDirection@ \begingroup\aboveDirection@\xydashl@
+ \vfromslide@i{\xydashl@}@\czeroEdge@ \leave@ \idfromc@{@m1}%
+ \cfromid@{@p}\swap@\cfromid@{@c}%
+ \DN@{#1}\ifx\next@\empty\DN@{\no@@}\else\DN@{\connect@{\dir}{-}}\fi
+ \else \DN@{\enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup\aboveDirection@ \xydashl@
+ \vfromslide@i{#1\xydashl@}@\czeroEdge@ \leave@
+ \idfromc@{@m1}\cfromid@{@p}\swap@\cfromid@{@c}%
+ \edef\next@{\codeof\ucurveObject@}%
+ \ifx\next@\empty\DN@{\connect@\crv{"@m1"}}%
+ \else
+ \DNii@####1{\connect@\crv{####1}}\expandafter\DN@\expandafter{%
+ \expandafter\nextii@\expandafter{\ucurveObject@"@m1"}}%
+ \fi \next@ }%
+%% \ifx\next@\empty\def\ucurveObject@{.}\fi
+%% \enter@\cfromthec@\sinit@\cfromid@{@m1}\senter@\leave@
+%% \expandafter\connect@\expandafter\crvs\expandafter{\ucurveObject@}%
+%% \sinit@\sleave@ }%
+ \fi
+ \fi \next@
+ \DN@{#1}\ifx\next@\empty\relax\else
+ \if\@mod@ @\relax
+ \enter@\pfromthep@ \Creset@@
+ \ifx #5t\relax
+ \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}%
+ \else \def\next@{\crvreset@}%
+ \ifx\next@\Creset@@
+ \gettwocelledges@ \edef\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \else \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}\fi
+ \fi
+ \expandafter\Calong@@\PLACEf@ \czeroEdge@ \leave@
+ \edef\tmp@{\codeof\modmapobject@}%
+ \ifx\tmp@\empty \DN@{\drop@{\dir}{|}}%
+ \else \DNii@##1##{\drop@{##1}}%
+ \DN@{\expandafter\nextii@\modmapobject@{}}%
+ \fi \next@
+ \fi\fi
+ \DN@{#6}\ifx\next@\empty\DN@{\relax}\else
+ \DNii@{{}}\ifx\next@\nextii@\DN@{\relax}\else
+ \ifx @#3\relax\DN@{\relax}\else
+ \DN@{\enter@\pfromthep@ \Creset@@
+ \Calong@@{.5}\czeroEdge@ \leave@
+ \enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@\begingroup
+ \DN@{#1}\ifx\next@\empty\dimen@\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@<\z@ \belowDirection@ \xydashl@
+ \else \aboveDirection@ \xydashl@ \fi
+ \dimen@=#3\p@ \if\@mod@ @\relax
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\p@\fi
+ \edef\next@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\vfromslide@i\expandafter{\next@\xydashl@}@\leave@
+ \droptwocelllabel@{#6}}%
+ \fi\fi\fi \next@
+ \DN@{#1}\ifx\next@\empty\relax\else
+ \ifx #5b\relax
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@ \DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi
+ \else\ifx #5@\relax
+ \else
+ \enter@\pfromthep@ \Creset@@ \PLACEedgec@
+ \Calong@@{1}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocellhead@}%
+ \ifx\next@\empty\drop@{\dir}{>}%
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocellhead@{}%
+ \fi
+ \ifx #5B\relax
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@\DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\drop\twocelltail@{}%
+ \fi
+ \else\ifx #5/\relax
+ \else \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty\relax\else
+ \enter@\pfromthep@ \Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi\fi\fi
+ \fi\fi\fi
+ \cfromid@{@p}\swap@\cfromid@{@c}\no@@ \cfromid@{@m}%
+ \ifx #5t\relax
+ \idfromc@{@m2}\cfromid@{@m1}\swap@ \cfromid@{@c}\no@@
+ \DN@{#1}\ifx\next@\empty\DN@{\no@@}\else\DN@{\connect@{\dir}{-}}\fi
+ \else\ifx #5o\relax
+ \idfromc@{@m2}\DN@{}%
+ \else
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@=\z@
+ \enter@{\cplusthec@\pfromthep@}%
+ \enter@\DirectionfromtheDirection@ \begingroup \belowDirection@\xydashl@
+ \vfromslide@i{\xydashl@}@\czeroEdge@ \leave@ \idfromc@{@m2}%
+ \DN@{\cfromid@{@p}\swap@\cfromid@{@c}\no@@}%
+ \else \DN@{\enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup \belowDirection@ \xydashl@
+ \vfromslide@i{#1\xydashl@}@\czeroEdge@ \leave@
+ \idfromc@{@m2}\cfromid@{@p}\swap@\cfromid@{@c}%
+ \edef\next@{\codeof\dcurveObject@}%
+ \ifx\next@\empty\DN@{\connect@\crv{"@m2"}}%
+ \else
+ \DNii@####1{\connect@\crv{####1}}\expandafter\DN@\expandafter{%
+ \expandafter\nextii@\expandafter{\dcurveObject@"@m2"}}%
+ \fi \next@ }\fi
+%% \enter@\cfromthec@\sinit@\cfromid@{@m2}\senter@\leave@
+%% \expandafter\connect@\expandafter\crvs\expandafter{\dcurveObject@}%
+%% \sinit@\sleave@
+%% }\fi
+ \fi\fi \next@
+ \DN@{#1}\ifx\next@\empty\relax\else \ifx #5o\relax\else
+ \if\@mod@ @\DN@{\enter@\pfromthep@ \Creset@@
+ \ifx #5t\relax
+ \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}%
+ \else \def\next@{\crvreset@}%
+ \ifx\next@\Creset@@
+ \gettwocelledges@ \edef\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \else \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}\fi
+ \fi
+ \expandafter\Calong@@\PLACEf@ \czeroEdge@ \leave@
+ \edef\tmp@{\codeof\modmapobject@}\ifx\tmp@\empty\DN@{\drop@{\dir}{|}}%
+ \else \DNii@####1####{\drop@{####1}}%
+ \DN@{\expandafter\nextii@\modmapobject@{}}\fi
+ \next@ }\else\DN@{\relax}\fi
+ \next@ \fi\fi
+ \DN@{#7}\ifx\next@\empty\DN@{\relax}\else
+ \DNii@{{}}\ifx\next@\nextii@\DN@{\relax}\else
+ \ifx @#4\relax\DN@{\relax}\else
+ \DN@{\enter@\pfromthep@ \Creset@@
+ \Calong@@{.5}\czeroEdge@ \leave@
+ \enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \DN@{#1}\ifx\next@\empty\dimen@\z@ \else\dimen@=#1\p@\fi
+ \ifx #5t\relax \ifdim\dimen@<\z@ \belowDirection@ \xydashl@
+ \else \aboveDirection@ \xydashl@ \fi
+ \else \ifdim\dimen@<\z@ \aboveDirection@ \xydashl@
+ \else \belowDirection@ \xydashl@ \fi
+ \fi \dimen@=#4\p@ \if\@mod@ @\relax
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\p@\fi
+ \edef\next@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\vfromslide@i\expandafter{\next@\xydashl@}@\leave@
+ \droptwocelllabel@{#7}}%
+ \fi\fi\fi \next@
+ \DN@{#1}\ifx\next@\empty\relax\else
+ \ifx #5o\relax
+ \else\ifx #5b\relax
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgec@
+ \Calong@@{1}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{>}%
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocellhead@{}%
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\drop\twocelltail@{}%
+ \fi
+ \else\ifx #5/\relax
+ \enter@{\pfromthep@}\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@\DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi
+ \else\ifx #5@\relax
+ \else
+ \enter@\pfromthep@ \Creset@@ \PLACEedgec@
+ \Calong@@{1}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocellhead@}%
+ \ifx\next@\empty\drop@{\dir}{>}%
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocellhead@{}%
+ \fi
+ \ifx #5B\relax
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty\DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@\DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi
+ \else
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty\relax\else
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi\fi
+ \fi\fi\fi
+ \fi\fi
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@<\z@ \cfromid@{@m2}\swap@\cfromid@{@m1}%
+ \else \cfromid@{@m1}\swap@\cfromid@{@m2}%
+ \fi \no@@ \cfromid@{@m}%
+ \ifx\Arrowtok@\empty
+ \else\DN@{_}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \enter@{\pfromthep@ \cplusthec@}\dimen@=#2\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m}%
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\Arrowobject@{}%
+ \else\DN@{^}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \DN@{_}\edef\Arrowtok@{\codeof\next@}%
+ \enter@{\pfromthep@ \cplusthec@}\dimen@=#2\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m}\reverseDirection@
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\Arrowobject@{}%
+ \else \DN@{=}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \enter@{\pfromthep@ \cplusthec@}%
+ \dimen@=#2\xydashl@ \advance\dimen@\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m2}%
+ \cfromid@{@m}%
+ \enter@{\pfromthep@ \cplusthec@}%
+ \dimen@=#2\xydashl@ \advance\dimen@-\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m1}%
+ \cfromid@{@m2}\swap@\cfromid@{@m1}\connect@{\dir 2}{-}%
+ \fi\fi\fi\fi
+ \DN@{#8}\ifx\next@\empty\DN@{}\else\DN@{%
+ \ifx\Arrowtok@\empty
+ \Calong@@{.5}%
+ \else\DN@{=}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \Calong@@{.5}%
+ \else\DN@{_}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \cfromid@{@m}%
+ \fi\fi\fi
+ \enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup \aboveDirection@\xydashl@
+ \ifx\Arrowtok@\empty
+ \def\tmp@{0pt}%
+ \else\DN@{=}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \def\tmp@{\xydashl@}%
+ \else\DN@{_}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \def\tmp@{1.2\xydashl@}%
+ \else\def\tmp@{0pt}%
+ \fi\fi\fi
+ \expandafter\vfromslide@i\expandafter{\tmp@}@\czeroEdge@ \leave@
+ \droptwocelllabel@{#8}%
+ }\fi \next@
+ \leave@ }%
+\xydef@\gettwocelledges@{%
+ \bgroup \the\crvpts@
+ \edef\next@{\edges@}%
+ \expandafter\gettwocelledges@@\next@ }
+\xydef@\gettwocelledges@@#1;#2,#3;#4,{%
+ \dimen@=#2\advance\dimen@-#4\relax
+ \advance\dimen@ 2\p@ \divide\dimen@ by4 \relax
+ \edef\next@{\egroup\dimen@=\the\dimen@ }\next@}%
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyall.tex b/macros/generic/diagrams/xypic/texinputs/xyall.tex
new file mode 100644
index 0000000000..a95fe9d213
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyall.tex
@@ -0,0 +1,36 @@
+%% xyall.tex from $Id: xyall.doc,v 3.8 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``All features'' option.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{all}{All features}{\stripRCS$Revision: 3.8 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xyrequire{curve}
+\xyrequire{frame}
+\xyrequire{cmtip}
+\xyrequire{line}
+\xyrequire{rotate}
+\xyrequire{color}
+\xyrequire{matrix}
+\xyrequire{arrow}
+\xyrequire{graph}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyarc.tex b/macros/generic/diagrams/xypic/texinputs/xyarc.tex
new file mode 100644
index 0000000000..eaad720083
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyarc.tex
@@ -0,0 +1,683 @@
+%% xyarc.tex from $Id: xyarc.doc,v 3.8 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Circles, Ellipses and Arcs'' feature.
+%% Copyright (c) 1995-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The XY-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The XY-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{arc}{Circle, Ellipse, Arc feature}{\stripRCS$Revision: 3.8 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xyrequire{curve}
+\xycatcodes
+\xydef@\ellipse#1#{\xy@{ELLIPSE}{\hbox\bgroup\save@}%
+ \let\endarc@=\endellipse@@ \xyFN@\preARC@ #1@}
+\xydef@\endellipse@@{\xy@{endELLIPSE}{\leave@\origDirection@
+ \edef\next@{\egroup \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max }\next@}\let\bstartPLACE@=\relax}
+\xydef@\preARC@{%
+ \ifx\next\space@ \expandafter\DN@\space{\xyFN@\preARC@}%
+ \else\ifx\next @\DN@{\xy@{ellipseARC}\ellipticARC@ \arc@}%
+ \else\ifx\next ~\DN@~##1{\tildeARC@{##1}}%
+ \else\DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}%
+ \fi\fi\fi \next@ }
+\xydef@\arc@#1@#2{\DN@{#2}%
+ \ifx\next@\empty \xy@{arcSTYLE}{\def\arcSTYLE{-}}%
+ \else \xy@{arcSTYLE}{\def\arcSTYLE{#2}}\fi \arc@i
+ \DNii@{#1}%
+ \ifx\nextii@\empty \DN@{\fullCircle@}%
+ \else \DN@{_}%
+ \ifx\next@\nextii@ \xy@{_}{\def\arcOrient@@{_}}%
+ \let\arcOrient@@=\next@ \DN@{\fullCircle@}%
+ \else \DN@{^}%
+ \ifx\next@\nextii@ \xy@{^}{\def\arcOrient@@{^}}%
+ \let\arcOrient@@=\next@ \DN@{\fullCircle@}%
+ \else \DN@{\def\afterARCextents@@{%
+ \xy@{aftARCext}{\let\doCircleArc@=\doCircleArc@@}%
+ \ellipseArc@ \xy@{doCircARCs}{\doCircleArcs@}\endarc@ }%
+ \xyFN@\getarcparams@#1@}\fi\fi\fi
+ \next@ }
+\xydef@\arc@i{\xy@{ARCi}{%
+ \save@\idfromc@{0@c}\cfromp@\idfromc@{0@p}%
+ \enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i{}@\czeroEdge@
+ \leave@\idfromc@{0@m}\leave@ \zeroDivideLimit@{50}%
+ \edef\origDirection@{\Direction=\the\Direction
+ \relax\noexpand\imposeDirection@}%
+ \let\startDirection@=\origDirection@ \def\startDirection@@{}%
+ \def\endDirection@{}\def\endDirection@@{}\def\arcOrient@@{^}}%
+ \def\arcOrient@@{^}\let\processDirections@=\checkstartDirection@
+ \def\arcRadius@{}\def\ellipseRatio@{}\def\arcScale@{\arcScale@@}}
+\message{circles,}
+\xydef@\fullCircle@{\xy@{fullCIRC}{\let\endDirection@=\relax
+ \let\doCircleArc@=\doMergeEndArc@@}\circleArc@ }%
+\xydef@\getarcparams@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\getarcparams@}%
+ \else\addLT@\ifx \next \xy@{<}{}%
+ \addGT@{\addLT@\DN@##1}{\splitRadius@dim##1,,@}%
+ \else\ifx\next (\DN@({\xyFN@\checkRadOpen@}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}%
+ \else \addLQ@\ifx \next \addLQ@\DN@{\xy@`{}\ARCturn@}%
+ \else \DN@{\getarcExtents@}%
+ \fi\fi\fi\fi\fi \next@ }
+\xydef@\checkRadOpen@{%
+ \ifx\next *\DN@{\xyFN@\getarcExtents@ (}%
+ \else \xy@{(}{}\DN@##1){\splitRadius@##1,,@}%
+ \fi \next@ }
+\xydef@\fixedRadiusArc@{%
+ \xy@{fixRadArc}{\save@ \idfromc@{0@0}\cfromp@\idfromc@{0@c}\leave@}%
+ \xyFN@\fixedRadiusArc@i }
+\xydef@\fixedRadiusArc@i{%
+ \ifx\next\space@ \expandafter\DN@\space{\xyFN@\fixedRadiusArc@i}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}%
+ \else\DN@{\let\processDirections@=\processArcDirections@
+ \def\afterARCextents@@{\xy@{aftARCext}{\let\doCircleArc@=\doCircleArc@@
+ \ellipseSector@}}\xyFN@\getarcExtents@}%
+ \fi\fi \next@ }
+\xydef@\arcScale@@{\xy@{arcSCALE@@}{\save@
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setbase@\X@p\Y@p\X@c\Y@c}}
+\xydef@\arcScale@dim#1{\xy@{arcSCALEdim}{\save@
+ \cfromid@{0@0}\pfromc@ \cfromid@{0@p}\setupDirection@\cfromp@
+ \enter@\cplusthec@ \begingroup\vfromslide@i#1@%
+ \setbase@\X@p\Y@p\X@c\Y@c \idfromc@{0@p}}}
+\xydef@\ellipseScale@dim#1{\xy@{ellSCALEdim}{\setupDirection@\cfromp@
+ \enter@\cplusthec@ \aboveDirection@\xydashl@ \vfromslide@{#1}\leave@
+ \setbase@@\X@c\Y@c}}
+\xydef@\ellipseScale@#1{\xy@{ellSCALE@}%
+ {\vfromcartesian@@0,#1@\setbase@@\X@c\Y@c}}
+\xydef@\splitRadius@dim#1,#2,#3@{%
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\relax%\splinetracing
+ \expandafter\def\expandafter\arcRadius@
+ \expandafter{\arcScale@dim{#1}}\fi
+ \DN@{#2}\ifx\next@\empty\dimen@ii=\z@\def\ellipseRatio@{}%
+ \else\dimen@ii=#2\relax \expandafter
+ \def\expandafter\ellipseRatio@\expandafter{\ellipseScale@dim{#2}}%
+ \fi \fixedRadiusArc@ }
+\xydef@\splitRadius@#1,#2,#3@{%
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\relax\fi
+ \DN@{#2}\ifx\next@\empty\dimen@ii=\z@\else\dimen@ii=#2\p@\relax\fi
+ \ifdim\dimen@=\z@ \ifdim\dimen@ii=\z@\else \expandafter
+ \def\expandafter\ellipseRatio@\expandafter{\ellipseScale@{#2}}\fi
+ \else
+ \ifdim\dimen@ii=\z@
+ \def\arcScale@{\xy@{arcSCALE@}{\save@\cfromid@{0@0}%
+ \X@origin=\X@c \Y@origin=\Y@c
+ \X@xbase=#1\X@xbase \Y@xbase=#1\Y@xbase
+ \X@ybase=#1\X@ybase \Y@ybase=#1\Y@ybase
+ \advance\X@c\X@xbase \advance\Y@c\Y@xbase \czeroEdge@
+ \idfromc@{0@p}\idfromc@{0@c}}}%
+ \else
+ \def\arcScale@{\xy@{arcSCALE@}{\save@\cfromid@{0@0}%
+ \X@origin=\X@c \Y@origin=\Y@c
+ \X@xbase=#1\X@xbase \Y@xbase=#1\Y@xbase
+ \X@ybase=#2\X@ybase \Y@ybase=#2\Y@ybase
+ \advance\X@c\X@xbase \advance\Y@c\Y@xbase \czeroEdge@
+ \idfromc@{0@p}\idfromc@{0@c}}}%
+ \fi
+ \fi \fixedRadiusArc@ }
+\xydef@\baseOrient@{\DN@{_}\ifx\next@\arcOrient@@
+ \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi }
+\message{ellipses,}
+\xydef@\fullEllipse@{\xy@{fullELLIPSE}%
+ {\def\startDirection@{}\let\doCircleArc@=\doMergeEndArc@@}%
+ \ellipseArc@
+ \xy@{doCIRCarcs}{\leave@ \doCircleArcs@}\endarc@ }
+\xydef@\ellipseArc@{%
+ \arcScale@ \arcRadius@ \ellipseRatio@
+ \xy@{arcCONTROLS}{\baseOrient@ \arcControls@ \let\bstartPLACE@=\relax }}
+\xydef@\cubicARCcontrols@@{\czeroEdge@
+ \vfromcartesian@@0,1@\idfromc@{1@c}%
+ \vfromcartesian@@-1,0@\idfromc@{2@c}%
+ \vfromcartesian@@0,-1@\idfromc@{3@c}%
+ \vfromcartesian@@1,\arcparam@ @\idfromc@{1@m}%
+ \vfromcartesian@@\arcparam@,1@\idfromc@{2@m}%
+ \vfromcartesian@@-\arcparam@,1@\idfromc@{3@m}%
+ \vfromcartesian@@-1,\arcparam@ @\idfromc@{4@m}%
+ \vfromcartesian@@-1,-\arcparam@ @\idfromc@{5@m}%
+ \vfromcartesian@@-\arcparam@,-1@\idfromc@{6@m}%
+ \vfromcartesian@@\arcparam@,-1@\idfromc@{7@m}%
+ \vfromcartesian@@1,-\arcparam@ @\idfromc@{8@m}%
+ }
+\xydef@\doCircleArc@@#1#2{\save@ \ifcase#2\relax
+ \doCircleArc@@@{0@p}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleArc@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleArc@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleArc@@@{3@c}{7@m}{8@m}{0@p}{#1}\or
+ \doCircleArc@@@{0@p}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleArc@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleArc@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleArc@@@{3@c}{7@m}{8@m}{0@p}{#1}\fi \leave@ }
+\xydef@\doCircleArc@@@#1#2#3#4#5{%
+ \cfromid@{#1}\pfromc@\senter@
+ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \connect@\crvs{#5}\relax\sinit@\sleave@}
+\xydef@\doMergeEndArc@@#1#2{\save@\ifcase#2\relax
+ \doMergeEnd@@@{0@p}{1@m}{2@m}{1@c}{#1}\relax\or
+ \doMergeEnd@@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or
+ \doMergeEnd@@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or
+ \doMergeEnd@@@{3@c}{7@m}{8@m}{0@p}{#1}@\fi \leave@ }
+\xydef@\doMergeEnd@@@#1#2#3#4#5#6{%
+ \cfromid@{#1}\pfromc@\senter@
+ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \ifx#6\relax
+ \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi
+ \enter@\cmergethec@\cfromid@{0@c}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#1}{#2}{#3}{#4}\leave@
+ \connect@\crvs{#5}\relax
+ \sinit@\sleave@}
+\xydef@\doMergeStartArc@#1#2{\save@\ifcase#2\relax
+ \doMergeStart@@{0@p}{1@m}{2@m}{1@c}{#1}@\or
+ \doMergeStart@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or
+ \doMergeStart@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or
+ \doMergeStart@@{3@c}{7@m}{8@m}{0@p}{#1}\relax\fi \leave@ }
+\xydef@\doMergeStart@@#1#2#3#4#5#6{%
+ \cfromid@{#1}\ifx#6\relax
+ \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi
+ \enter@\cmergethec@\cfromid@{0@x}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#4}{#3}{#2}{#1}\leave@
+ \pfromc@
+ \senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \connect@\crvs{#5}\relax\sinit@\sleave@}
+\xydef@\doMergeBothArc@#1#2{\save@\ifcase#2\relax
+ \doMergeBoth@@{0@p}{1@m}{2@m}{1@c}{#1}@\or
+ \doMergeBoth@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or
+ \doMergeBoth@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or
+ \doMergeBoth@@{3@c}{7@m}{8@m}{0@p}{#1}\relax\fi \leave@ }
+\xydef@\doMergeBoth@@#1#2#3#4#5#6{%
+ \cfromid@{#1}\ifx#6\relax
+ \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi
+ \enter@\cmergethec@\cfromid@{0@x}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#4}{#3}{#2}{#1}\leave@
+ \pfromc@
+ \senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \enter@\cmergethec@\cfromid@{0@c}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#1}{#2}{#3}{#4}\leave@
+ \connect@\crvs{#5}\relax\sinit@\sleave@}
+\xydef@\doMergeEndArc@#1#2{\count@@=#2\relax
+ \ifnum\count@@>\thr@@ \advance\count@@-4\fi\relax
+ \doMergeEndArc@@{#1}\count@@ }
+\xydef@\doStraightArc@@#1{\xy@{STRAITarc}{\save@
+ \cfromid@{0@p}\pfromc@\cfromid@{0@c}%
+ \senter@\connect@\crvs{#1}\sinit@\sleave@\leave@}}
+\xydef@\cfromcontrols@#1#2#3#4{\bgroup
+ \cfromid@{#1}\L@p=\X@c \U@p=\Y@c
+ \cfromid@{#4}\R@p=\X@c \D@p=\Y@c
+ \cfromid@{#3}\A@=\X@c \B@=\Y@c \cfromid@{#2}%
+ \ifdim\R@p>\L@p \ifdim\A@>\R@p \R@p=\A@
+ \ifdim\X@c>\R@p \R@p=\X@c\fi\fi
+ \else \ifdim\A@<\R@p \R@p=\A@
+ \ifdim\X@c<\R@p \R@p=\X@c\fi\fi
+ \fi
+ \ifdim\D@p>\U@p \ifdim\B@>\D@p \D@p=\B@
+ \ifdim\Y@p>\D@p \D@p=\Y@p\fi\fi
+ \else \ifdim\B@<\D@p \D@p=\B@
+ \ifdim\Y@p<\D@p \D@p=\Y@p\fi\fi
+ \fi
+ \edef\next@{\egroup \X@c=\the\R@p \Y@c=\the\D@p}\next@ }
+\xydef@\doCircleArcs@{\save@
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@
+ \startDirection@ \edef\startDirection@@{\the\Direction}%
+ \cfromid@{1@c}\setupDirection@ \edef\quadDirection@{\the\Direction}\relax
+ \count@=\quadDirection@ \relax\def\nextii@{^}%
+ \let\preDirection@@=\startDirection@@
+ \ifx\nextii@\arcOrient@@
+ \ifnum\quadDirection@>\startDirection@@ \relax
+ \else \advance\count@ by8192 \relax\edef\quadDirection@{\the\count@}\fi
+ \ifx\endDirection@@\empty
+ \ifx\endDirection@\relax
+ \bgroup\cfromid@{0@c}\setupDirection@
+ \edef\next@{\egroup \count@@=\the\Direction}\next@ \relax
+ \ifnum\count@@<\startDirection@@ \advance\count@@ 8192 \fi
+ \edef\endDirection@@{\the\count@@}%
+ \else
+ \count@@=\startDirection@@
+ \advance\count@@ by8192 \edef\endDirection@@{\the\count@@}%
+ \fi
+ \else
+ \count@@=\endDirection@@ \relax\ifnum\count@@<\startDirection@@ \relax
+ \advance\count@@ by8192 \edef\endDirection@@{\the\count@@}\fi
+ \fi
+ \ifnum\endDirection@@>\quadDirection@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{0}}%
+ \else
+ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{0}}%
+ \fi
+ \else
+ \ifnum\count@<\startDirection@@\relax\else\advance\count@ by-8192 \relax
+ \edef\quadDirection@{\the\count@}\fi
+ \ifx\endDirection@@\empty
+ \ifx\endDirection@\relax
+ \bgroup\cfromid@{0@c}\setupDirection@
+ \edef\next@{\egroup \count@@=\the\Direction}\next@ \relax
+ \ifnum\count@@>\startDirection@@ \advance\count@@-8192 \fi
+ \edef\endDirection@@{\the\count@@}%
+ \else
+ \count@@=\startDirection@@
+ \advance\count@@ by-8192 \edef\endDirection@@{\the\count@@}%
+ \fi
+ \else
+ \count@@=\endDirection@@ \relax \ifnum\count@@>\startDirection@@
+ \advance\count@@ by-8192 \edef\endDirection@@{\the\count@@}\fi
+ \fi
+ \ifnum\endDirection@@<\quadDirection@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{0}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{0}}\fi
+ \fi
+ \next@ \relax
+ \count@=\quadDirection@ \relax\def\nextii@{^}\DN@{}%
+ \ifx\nextii@\arcOrient@@
+ \count@@=\startDirection@@ \advance\count@@ by4096 \relax
+ \ifnum \count@<\endDirection@@ \relax
+ \ifnum\endDirection@@>\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{1}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{1}}\fi
+ \fi
+ \else
+ \count@@=\startDirection@@ \advance\count@@ by-4096 \relax
+ \ifnum \count@>\endDirection@@ \relax
+ \ifnum\endDirection@@<\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{1}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{1}}\fi
+ \fi\fi
+ \next@ \relax
+ \ifx\next@\empty \else \relax
+ \count@=\startDirection@@ \relax\def\nextii@{^}\DN@{}%
+ \ifx\nextii@\arcOrient@@ \advance\count@ by4096 \relax
+ \count@@=\quadDirection@ \advance\count@@ by4096 \relax
+ \ifnum \count@<\endDirection@@
+ \ifnum\endDirection@@>\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{2}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{2}}\fi
+ \fi
+ \else \advance\count@ by-4096 \relax
+ \count@@=\quadDirection@ \advance\count@@ by-4096 \relax
+ \ifnum \count@>\endDirection@@ \relax
+ \ifnum\endDirection@@<\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{2}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{2}}\fi
+ \fi\fi
+ \next@ \relax
+ \fi
+ \ifx\next@\empty \else \relax
+ \count@=\quadDirection@ \def\nextii@{^}\DN@{}%
+ \ifx\nextii@\arcOrient@@ \advance\count@ by4096 \relax
+ \ifnum \count@<\endDirection@@
+ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{3}}\fi
+ \else \advance\count@ by-4096 \relax
+ \ifnum \count@>\endDirection@@
+ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{3}}\fi
+ \fi \next@ \relax
+ \fi
+ \leave@ }
+\message{elliptical arcs,}
+\xydef@\arcmagic@@{0.5517847}
+\xylet@\arcmagic=\arcmagic@@
+\xydef@\tildeARC@#1{%
+ \if q#1\DN@{\xy@{quadARC}\quadARC@ \arc@}%
+ \else\if c#1\DN@{\xyFN@\cubicARC@i}%
+ \else\if e#1\DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}%
+ \else\if i#1\DN@{\xy@{interpARC}\interpARC@ \arc@}%
+ \else\if p#1\DN@{\xy@{cuspidalARC}\cuspidalARC@ \arc@}%
+ \else\xywarning@{unknown arc type: #1 }%
+ \DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}%
+ \fi\fi\fi\fi\fi \next@ }
+\xydef@\cubicARC@i{%
+ \ifx\next\space@ \expandafter\DN@\space{\xyFN@\cubicARC@i}%
+ \else\ifx\next (\DN@(##1){\xy@{cubicARC(##1)}{\cubicARC@{##1}}\arc@}%
+ \else \DN@{\xy@{cubicARC(1)}{\cubicARC@{1}}\arc@}%
+ \fi\fi \next@ }
+\xydef@\ellipticARC@{\let\arcControls@=\cubicARCcontrols@@
+ \edef\arcparam@{\arcmagic@@}}
+\xydef@\cubicARC@#1{\let\arcControls@=\cubicARCcontrols@@
+ \dimen@=#1\p@ \edef\arcparam@{\expandafter\removePT@\the\dimen@}}
+\xydef@\quadARC@{\let\arcControls@=\cubicARCcontrols@@
+ \def\arcparam@{.66667}}
+\xydef@\cuspidalARC@{\let\arcControls@=\cubicARCcontrols@@
+ \def\arcparam@{2}}
+\xydef@\interpARC@{\let\arcControls@=\cubicARCcontrols@@
+ \def\arcparam@{1.33333}}
+\xydef@\ARCturn@{\xy@@\bgroup\afterCOORD{%
+ \xy@@{\edef\next@{\egroup \A@=\the\X@c \B@=\the\Y@c}\next@}\ARCturn@@}}
+\xydef@\ARCturn@@#1@{\DN@{#1}\DNii@{^}%
+ \ifx\next@\nextii@ \xy@{^}{\def\arcOrient@@{^}}%
+ \else\DNii@{_}\ifx\next@\nextii@ \xy@{_}{\def\arcOrient@@{_}}%
+ \else\xy@{}{\def\arcOrient@@{}}\fi\fi
+ \xy@@\ARCturn@@@ \processDirections@@ }
+\xydef@\ARCturn@@@{%
+ \bgroup\cfromid@{0@p}\X@p=\X@c \Y@p=\Y@c \X@c=\A@ \Y@c=\B@
+ \setupDirection@ \edef\next@{\egroup\count@=\the\Direction}\next@\relax
+ \edef\startDirection@@{\the\count@ }%
+ \bgroup\cfromid@{0@c}\X@p=\A@ \Y@p=\B@
+ \setupDirection@ \edef\next@{\egroup\count@=\the\Direction}\next@\relax
+ \edef\endDirection@@{\the\count@}%
+ \ifx\arcOrient@@\empty
+ \bgroup\cfromid@{0@p}\X@p=\X@c \Y@p=\Y@c \cfromid@{0@c}%
+ \setupDirection@ \edef\next@{\egroup\count@@=\the\Direction}\next@\relax
+ \count@=-\count@@ \advance\count@\startDirection@@ \relax \count@=-\count@
+ \ifnum\count@>4096 \def\arcOrient@@{_}%
+ \else\ifnum\count@<-4096 \def\arcOrient@@{^}%
+ \else\ifnum\count@>\z@ \def\arcOrient@@{^}%
+ \else\def\arcOrient@@{_}\fi\fi\fi
+ \fi }
+\xydef@\circleArc@{%
+ \xy@{circARC@}{\cfromid@{0@p}\pfromc@\cfromp@\startDirection@
+ \arcCenter@\idfromc@{0@0}%
+ \def\startDirection@{\bgroup
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@
+ \edef\next@{\egroup \Direction=\the\Direction}\next@
+ \relax\imposeDirection@}}%
+ \ifx\endDirection@@\empty
+ \ifx\arcRadius@\empty \ifx\ellipseRatio@\empty\else
+ \DN@{\arcScale@@}\ifx\arcScale@\next@\else
+ \xy@@{\bgroup\cfromid@{0@0}\pfromc@\cfromid@{0@c}\setupDirection@
+ \edef\next@{\egroup \Direction=\the\Direction}\next@
+ \edef\endDirection@@{\the\Direction}}\fi\fi\fi\fi
+ \ellipseArc@ \xy@@{\leave@ \doCircleArcs@}\endarc@ }
+\xydef@\arcbisector{%
+ \cfromid@{0@p}\pfromc@\cfromid@{0@c}\setupDirection@
+ \advance\X@c\X@p\divide\X@c\tw@
+ \advance\Y@c\Y@p\divide\Y@c\tw@ \czeroEdge@ \pfromc@
+ \enter@\cplusthec@ \enter@\relax\begingroup
+ \aboveDirection@\xydashl@ \vfromslide@i{}@\leave@ }
+\xydef@\arcCenter@{%
+ \cfromid@{0@p}\pfromc@\cfromid@{0@m}\setupDirection@
+ \cfromp@\enter@\cplusthec@ \enter@\relax\begingroup
+ \aboveDirection@\xydashl@ \vfromslide@i{}@\leave@\no@@
+ \arcCenter@i }
+\xydef@\arcCenter@i{%
+ \enter@{\pfromthep@}\setupDirection@ \Creset@@
+ \let\PLACEedgep@@=\PLACEedgep@ \let\PLACEedgec@@=\PLACEedgec@
+ \enter@{\pfromthep@\basefromthebase@}\bgroup
+ \arcbisector \edef\next@{\egroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p }%
+ \next@ \Cintercept@@ \leave@\leave@ }
+\xydef@\getarcExtents@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcExtents@}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}%
+ \else\DN@{\xy@{arcEXTENTs}{\save@
+ \def\startDirection@{\Direction=\startDirection@@ \imposeDirection@}}%
+ \xyFN@\getarcExtents@ii}\fi\fi \next@ }
+\xydef@\getarcExtents@ii{%
+ \ifx\next!\xy@{![[}{}\DN@![[##1]]{\getxyDirection@{##1}\getarcExtents@iv}%
+ \else\DN@{\getarcExtents@iv}\fi \next@ }
+\xydef@\getarcExtents@iv{\afterDIRECTIONorEMPTY
+ {\xy@{startDIR}{\edef\startDirection@@{\the\Direction}\leave@}%
+ \xyFN@\getarcOrientation@}%
+ {\xy@{startDIR}{\edef\startDirection@@{\the\Direction}\leave@}%
+ \xyFN@\getarcOrientation@}}
+\xydef@\getarcOrientation@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcOrientation@}%
+ \else\ifx\next @\xy@{@}{}\DN@{\getEndDirection@x}%
+ \else\ifx\next,\xy@{,}{}\DN@,{\xyFN@\getarcOrientation@i}%
+ \else\DN@{\getarcOrientation@i}\fi\fi\fi \next@ }%
+\xydef@\getarcOrientation@i{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcOrientation@i}%
+ \else\ifx\next @\xy@{@}{}\DN@{\getEndDirection@x}%
+ \else\ifx\next^{}\DN@##1{\xy@{^}{\def\arcOrient@@{^}}%
+ \def\arcOrient@@{^}\xyFN@\getEndDirection@}%
+ \else\ifx\next_\DN@##1{\xy@{_}{\def\arcOrient@@{_}}%
+ \def\arcOrient@@{_}\xyFN@\getEndDirection@}%
+ \else\DN@{\xyFN@\getEndDirection@}%
+ \fi\fi\fi\fi \next@ }
+\xydef@\getEndDirection@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getEndDirection@}%
+ \else\ifx\next,\DN@,{\xy@{,}{}\xyFN@\getEndDirection@}%
+ \else\addEQ@\ifx\next\addEQ@\DN@{\xy@{=}{\save@\startDirection@}%
+ \xyFN@\getEqDirection@}%
+ \else \ifx\next!\DN@![[##1]]{\xy@{![[}{\save@}\getxyDirection@{##1}%
+ \xy@{endDIR}{\edef\endDirection@@{\the\Direction}}%
+ \xyFN@\getEndDirection@i}%
+ \else \DN@{\xy@{origDIR}{\save@\origDirection@}\getEndDirection@i}%
+ \fi\fi\fi\fi \next@ }
+\xydef@\getEqDirection@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getEqDirection@}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{%
+ \xy@{sameDIR}{\edef\endDirection@@{\startDirection@@}\leave@}%
+ \parEllipse@{1}{}}%
+ \else\ifx\next (\DN@({\xyFN@\checkEqOpen@}%
+ \else \DN@{\getEndDirection@i}\fi\fi\fi \next@ }
+\xydef@\checkEqOpen@{%
+ \ifx\next *\DN@{\getEndDirection@i (}%
+ \else \DN@##1)##2@{\xy@{()}\leave@ \parEllipse@{##1}{##2}}%
+ \fi \next@ }
+\xydef@\getEndDirection@i{\afterDIRECTIONorEMPTY
+ {\xy@{endDIR}{\edef\endDirection@@{\the\Direction}\leave@}%
+ \getEndDirection@x }%
+ {\xy@{endDIR}\leave@ \getEndDirection@x }}
+\xydef@\getEndDirection@x#1@{%
+ \DN@{#1}\ifx\next@\empty\relax \else\xywarning@{\omittingTokens@}\fi
+ \processDirections@ }
+\xydef@\omittingTokens@{omitting unused tokens: \codeof\next@ }
+\xydef@\processDirections@@{%
+ \ifx\endDirection@@\empty \skewCircle@
+ \else \skewEllipse@ \expandafter \afterARCextents@@ \fi }
+\xydef@\processArcDirections@{%
+ \xy@{ARCdirs}{\ifx\endDirection@@\empty
+ \origDirection@ \edef\endDirection@@{\the\Direction}\fi}%
+ \ellipseArc@
+ \xy@{procARCdirs}\processArcDirections@@
+ \let\arcScale@\ellsave@ \let\arcRadius@\ellsave@ \def\ellipseRatio@{}%
+ \xy@{circSECTORS}{\doCircleSectors@}\endarc@ }
+\xydef@\ellsave@{\xy@@{\save@}}
+\xydef@\processArcDirections@@{\save@
+ \bgroup \cfromid@{0@0}\pfromc@ \Direction=\startDirection@@
+ \DN@{_}\ifx\next@\arcOrient@@
+ \advance\Direction \ifnum\Direction<\z@-\fi 4096 \relax\fi
+ \imposeDirection@
+ \d@X=\cosDirection\Y@ybase \advance\d@X-\sinDirection\X@ybase
+ \d@Y=-\cosDirection\Y@xbase \advance\d@Y\sinDirection\X@xbase
+ \setupDirection@i
+ \d@X=-\cosDirection\X@ybase \advance\d@X\sinDirection\X@xbase
+ \d@Y=-\cosDirection\Y@ybase \advance\d@Y\sinDirection\Y@xbase
+ \enter@\cplusthec@\X@c=\d@X \Y@c=\d@Y \leave@ \czeroEdge@
+ \setupDirection@i
+ \czeroEdge@
+ \edef\next@{\egroup \cfromthec@ \count@=\the\Direction}\next@
+ \edef\startDirection@@{\the\count@}\idfromc@{0@x}%
+ \bgroup \cfromid@{0@0}\pfromc@ \Direction=\endDirection@@
+ \DN@{_}\ifx\next@\arcOrient@@
+ \advance\Direction \ifnum\Direction<\z@-\fi 4096 \relax\fi
+ \imposeDirection@
+ \d@X=\cosDirection\Y@ybase \advance\d@X-\sinDirection\X@ybase
+ \d@Y=-\cosDirection\Y@xbase \advance\d@Y\sinDirection\X@xbase
+ \setupDirection@i
+ \d@X=-\cosDirection\X@ybase \advance\d@X\sinDirection\X@xbase
+ \d@Y=-\cosDirection\Y@ybase \advance\d@Y\sinDirection\Y@xbase
+ \enter@\cplusthec@\X@c=\d@X \Y@c=\d@Y \leave@
+ \czeroEdge@
+ \setupDirection@i
+ \edef\next@{\egroup \cfromthec@ \count@=\the\Direction}\next@
+ \edef\endDirection@@{\the\count@}\idfromc@{0@c}%
+ \count@=\startDirection@@ \relax \count@@=\endDirection@@ \relax
+ \DN@{^}\ifx\arcOrient@@\next@
+ \ifnum\count@@>\count@ \else\advance\count@@ 8192 \relax\fi
+ \else
+ \ifnum\count@@<\count@ \else\advance\count@@-8192 \relax\fi\fi
+ \edef\startDirection@@{\the\count@}%
+ \edef\endDirection@@{\the\count@@}}%
+\xydef@\doCircleSectors@{%
+ \let\doCircleArc@=\doMergeEndArc@@ \leave@ \leave@
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@
+ \count@=\Direction \DN@{^}\ifx\arcOrient@@\next@
+ \ifnum\count@>\startDirection@@ \advance\count@-8192 \fi\relax
+ \count@@=\count@ \advance\count@@ 8192 \relax
+ \ifnum\count@@<\endDirection@@ \advance\count@@ 8192 \fi\relax
+ \else
+ \ifnum\count@<\startDirection@@ \advance\count@ 8192 \fi\relax
+ \count@@=\count@ \advance\count@@-8192 \relax
+ \ifnum\count@@>\endDirection@@ \advance\count@@-8192 \fi\relax
+ \fi \relax
+ \edef\preDirection@@{\the\count@}\edef\postDirection@@{\the\count@@}%
+ \cfromid@{1@c}\setupDirection@ \count@=\Direction
+ \def\nextii@{^}\ifx\nextii@\arcOrient@@
+ \DN@{\forwardSectors@\doEllipseSectors@}%
+ \ifnum\count@<\preDirection@@ \advance\count@ 8192 \relax
+ \else \count@@=\count@\advance\count@-8192 \relax
+ \ifnum\count@@<\preDirection@@ \else\count@=\count@@ \fi\fi
+ \else
+ \DN@{\backwardSectors@\doEllipseSectors@}%
+ \ifnum\count@>\preDirection@@ \advance\count@-8192 \relax
+ \else \count@@=\count@\advance\count@ 8192 \relax
+ \ifnum\count@@>\preDirection@@ \else\count@=\count@@ \fi\fi
+ \fi \edef\quadDirection@{\the\count@}%
+ \next@ }
+\xydef@\forwardSectors@{%
+ \ifnum \startDirection@@<\quadDirection@ \def\startSector@@{0}%
+ \else\count@=\preDirection@@ \advance\count@ 4096 \relax
+ \ifnum \startDirection@@<\count@ \def\startSector@@{1}%
+ \else\count@=\quadDirection@ \advance\count@ 4096 \relax
+ \ifnum\startDirection@@<\count@ \def\startSector@@{2}%
+ \else \def\startSector@@{3}\fi\fi\fi
+ \ifnum\quadDirection@ <\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@ 4096 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@ 4096 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@ 8192 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@ 8192 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@ 12288 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@ 12288 \relax
+ \ifnum\count@<\endDirection@@ \def\endSector@@{7}%
+ \else \def\endSector@@{6}\fi
+ \else \def\endSector@@{5}\fi
+ \else \def\endSector@@{4}\fi
+ \else \def\endSector@@{3}\fi
+ \else \def\endSector@@{2}\fi
+ \else \def\endSector@@{1}\fi
+ \else \def\endSector@@{0}\fi }
+\xydef@\backwardSectors@{%
+ \ifnum \startDirection@@>\quadDirection@ \def\startSector@@{0}%
+ \else\count@=\preDirection@@ \advance\count@-4096 \relax
+ \ifnum \startDirection@@>\count@ \def\startSector@@{1}%
+ \else\count@=\quadDirection@ \advance\count@-4096 \relax
+ \ifnum\startDirection@@>\count@ \def\startSector@@{2}%
+ \else \def\startSector@@{3}\fi\fi\fi
+ \ifnum\quadDirection@>\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@-4096 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@-4096 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@-8192 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@-8192 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@-12288 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@-12288 \relax
+ \ifnum\count@>\endDirection@@ \def\endSector@@{7}%
+ \else \def\endSector@@{6}\fi
+ \else \def\endSector@@{5}\fi
+ \else \def\endSector@@{4}\fi
+ \else \def\endSector@@{3}\fi
+ \else \def\endSector@@{2}\fi
+ \else \def\endSector@@{1}\fi
+ \else \def\endSector@@{0}\fi }
+\xydef@\doEllipseSectors@{%
+ \ifx\startSector@@\endSector@@
+ \DN@{\expandafter\doMergeBothArc@\expandafter{\arcSTYLE}{\endSector@@}}%
+ \else
+ \expandafter\doMergeStartArc@\expandafter{\arcSTYLE}{\startSector@@}%
+ \edef\countArcs@@{\startSector@@}%
+ \loop@ \count@=\countArcs@@ \relax \advance\count@\@ne
+ \ifnum \count@ < \endSector@@ \edef\countArcs@@{\the\count@}%
+ \bgroup\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{\countArcs@@}%
+ \egroup
+ \repeat@
+ \DN@{\expandafter\doMergeEndArc@\expandafter{\arcSTYLE}{\endSector@@}}%
+ \fi \next@ }
+\xydef@\checkstartDirection@{%
+ \bgroup\no@@ \edef\next@{\egroup\count@@=\the\Direction}\next@\relax
+ \ifnum\count@@=\startDirection@@ \relax \DN@{\straightArc@}%
+ \else \advance\count@@-\startDirection@@ \relax
+ \ifnum\count@@=\ifnum\count@@<\z@-\fi 4096 \relax \DN@{\straightArc@}%
+ \else \DN@{\processDirections@@}\fi\fi \next@ }
+\xydef@\straightArc@{\xywarning@{straight arc encountered}%
+ \xy@@{\let\bstartPLACE@=\relax
+ \expandafter\doStraightArc@@\expandafter{\arcSTYLE}}\endarc@ }%
+\xydef@\skewEllipse@{\xy@@{\doskewEllipse@}%
+ \def\afterARCextents@@{\xy@{aftARCext}{\let\doCircleArc@=\doMergeEndArc@@}%
+ \ellipseArc@ \xy@{doCircARCs}{\doCircleArcs@}\endarc@ }%
+ \let\arcScale@=\relax \def\arcRadius@{}\def\ellipseRatio@{}}
+\xydef@\skewCircle@{\xy@@{\setupDirection@}%
+ \ifnum\Direction=\startDirection@@\relax\DN@{\halfEllipse@{1}}%
+ \else
+ \xy@@{\def\startDirection@{\Direction=\startDirection@@\imposeDirection@}%
+ \cfromid@{0@p}\enter@\cplusthec@ \startDirection@
+ \enter@\relax\begingroup\vfromslide@i{}@\czeroEdge@\leave@\idfromc@{0@m}%
+ \let\endDirection@=\relax \let\doCircleArc@=\doMergeEndArc@@}%
+ \DN@{\circleArc@}%
+ \fi \next@ }
+\xydef@\doskewEllipse@{%
+ \def\startDirection@{\Direction=\startDirection@@ \relax
+ \imposeDirection@}\startDirection@ \cfromid@{0@p}%
+ \enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i{}@\leave@
+ \idfromc@{0@x}%
+ \ifx\endDirection@@\empty \parallelDirection@
+ \else
+ \def\endDirection@{\Direction=\endDirection@@ \relax
+ \imposeDirection@ }\endDirection@ \skewEllB@
+ \bgroup\setupDirection@\edef\next@{\egroup\count@@=\the\Direction}\next@
+ \edef\endDirection@@{\the\count@@}%
+ \fi
+ \cfromid@{0@p}\bgroup \setupDirection@
+ \edef\next@{\egroup \count@@=\the\Direction}\next@
+ \edef\startDirection@@{\the\count@@}}
+\xydef@\halfEllipse@#1{\xy@@{%
+ \cfromid@{0@p}\pfromc@\cfromid@{0@c}\no@@
+ \edef\endDirection@@{\the\Direction}%
+ \advance\X@c\X@p \divide\X@c\tw@ \advance\Y@c\Y@p \divide\Y@c\tw@
+ \idfromc@{0@0}\pfromc@ \cfromid@{0@p}\setbase@\X@p\Y@p\X@c\Y@c
+ \dimen@=\X@origin \advance\dimen@-\X@c \dimen@ii=\cosDirection\dimen@
+ \dimen@=\Y@origin \advance\dimen@-\Y@c \advance\dimen@ii \sinDirection\dimen@
+ \X@c=\X@origin \Y@c=\Y@origin \enter@\cplusthec@
+ \dimen@=#1\p@ \ifdim\dimen@<\z@ \DN@{^}\dimen@ii=-#1\dimen@ii
+ \ifx\next@\arcOrient@@\def\arcOrient@@{_}\else\def\arcOrient@@{^}\fi
+ \else \dimen@ii=#1\dimen@ii\fi
+ \startDirection@ \enter@\relax\begingroup\expandafter
+ \vfromslide@i\expandafter{\the\dimen@ii}@\leave@
+ \idfromc@{1@c}\setbase@@ \X@c \Y@c \adjustBaseOrient@
+ \count@@=\endDirection@@ \relax
+ \DN@{^}\advance\count@@\ifx\arcOrient@@\next@\else-\fi 4096 \relax
+ \edef\startDirection@@{\the\count@@}%
+ \def\startDirection@{\Direction=\startDirection@@ \imposeDirection@ }%
+ \let\doCircleArc@=\doMergeEndArc@@ }%
+ \let\arcScale@=\relax \ellipseArc@
+ \xy@@{\doCircleArcs@}\endarc@ }
+\xydef@\parallelDirection@{\show\parallelDirection@}%
+\xydef@\parEllipse@#1#2{\DN@{#2}\ifx\next@\empty
+ \else\xywarning@{\omittingTokens@ }\fi \halfEllipse@{#1}}
+\xydef@\skewEllB@{\cfromid@{0@c}\pfromc@\enter@\cplusthec@
+ \enter@\relax\begingroup\vfromslide@i{}@\leave@
+ \enter@{\pfromthep@\basefromthebase@}\no@@
+ \bgroup \cfromid@{0@p}\pfromc@\cfromid@{0@x}\edef\next@{\egroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p }\next@
+ \Cintercept@@\leave@ \idfromc@{0@x}\cfromid@{0@p}\enter@\cplusthec@
+ \cfromid@{0@c}\leave@ \enter@\cplusthec@ \cfromid@{0@x}%
+ \X@c=-\X@c \Y@c=-\Y@c \leave@ \idfromc@{0@0}\pfromc@\cfromid@{0@p}%
+ \setbase@\X@p\Y@p\X@c\Y@c \cfromid@{0@c}\setbase@@\X@c\Y@c
+ \adjustBaseOrient@ }
+\xydef@\adjustBaseOrient@{%
+ \edef\tmp@{\expandafter\removePT@\the\X@xbase}\dimen@=\Y@ybase
+ \divide\dimen@ 64 \relax \dimen@ii=\tmp@\dimen@
+ \edef\tmp@{\expandafter\removePT@\the\X@ybase}\dimen@=\Y@xbase
+ \divide\dimen@ 64 \relax \dimen@=\tmp@\dimen@
+ \ifdim\dimen@>\dimen@ii \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi }
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyarrow.tex b/macros/generic/diagrams/xypic/texinputs/xyarrow.tex
new file mode 100644
index 0000000000..56f8349940
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyarrow.tex
@@ -0,0 +1,538 @@
+%% xyarrow.tex from $Id: xyarrow.doc,v 3.9 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Arrows and Paths'' feature.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{arrow}{Arrow and Path feature}{\stripRCS$Revision: 3.9 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\message{path,}
+\xydef@\PATH{\afterPATH{}}
+\xylet@\afterPATH@=\empty
+\xydef@\afterPATH#1{\save
+ \DN@##1{\def\afterPATH@{\restore \def\afterPATH@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterPATH@}%
+ \let\PATHfail@@=\empty
+ \let\PATHbefore@@=\empty
+ \let\PATHafter@@=\empty
+ \let\PATHlabelsevery@@=\empty
+ \let\PATHlabelsnext@@=\empty
+ \let\PATHlabelslast@@=\empty
+ \xy@{\afterPATH{#1}}{\def\PATHslide@@{\z@}}%
+ \def\PATHcontinue@@{\xyFN@\PATH@}%
+ \xyFN@\PATH@}
+\xynew@{if}\ifPATHsingle@
+\xydef@\PATH@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATH@}%
+ \else\ifPATHsingle@ \let\next@=\PATH@single
+ \else \let\next@=\PATH@normal \fi\fi \next@}
+\xydef@\PATH@normal{%
+ \ifx ~\next \DN@ ~{\xyFN@\PATHsetting@}%
+ \else \addRQ@\ifx \next \addRQ@\DN@{\xy@'{}\xyFN@\PATHstraight@}%
+ \else \addLQ@\ifx \next \addLQ@\DN@{\xy@`{}\xyFN@\PATHturn@}%
+ \else\ifx \PATHfail@@\PATH@x \DN@{\xyFN@\PATHfinal@}%
+ \else
+ \DNii@{\let\PATHfail@@=\PATH@x \xyFN@\PATH@}%
+ \DN@{\expandafter\nextii@\PATHfail@@}%
+ \fi\fi\fi\fi \next@}
+\xylet@\PATHfail@@=\empty
+\xylet@\PATHbefore@@=\empty
+\xylet@\PATHafter@@=\empty
+\xylet@\PATHlabelsevery@@=\empty
+\xylet@\PATHlabelsnext@@=\empty
+\xylet@\PATHlabelslast@@=\empty
+\xydef@\PATHsetting@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHsetting@}%
+ \else\ifx \bgroup\next
+ \DN@##1{\xy@{~{##1}}{}\def\PATHfail@@{##1}\xyFN@\PATH@}%
+ \else \addEQ@\ifx \next
+ \addEQ@\DN@##1{\xy@{~={##1}}{}\def\PATHbefore@@{##1}\xyFN@\PATH@}%
+ \else \addLT@\ifx \next
+ \addLT@\DN@##1{\xy@{~<{##1}}{}\def\PATHlabelsnext@@{##1}\xyFN@\PATH@}%
+ \else \addGT@\ifx \next
+ \addGT@\DN@##1{\xy@{~>{##1}}{}\def\PATHlabelslast@@{##1}\xyFN@\PATH@}%
+ \else \addPLUS@\ifx \next
+ \addPLUS@\DN@##1{\xy@{~+{##1}}{}\def\PATHlabelsevery@@{##1}\xyFN@\PATH@}%
+ \else \ifx /\next
+ \DN@/##1{\xy@{~/{##1}}{}\def\PATHafter@@{##1}\xyFN@\PATH@}%
+ \else \addDASH@\ifx \next
+ \xywarning@{Obsolete `-' PATH <action> translated to `='.}%
+ \addDASH@\DN@##1{\xy@{~-{##1}}{}\def\PATHbefore@@{##1}\xyFN@\PATH@}%
+ \else
+ \xyerror@{Unknown \string~ setting: \meaning\next}%
+ {See the Xy-pic arrow feature documentation for help.}%
+ \fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xylet@\PATHinit@@=\empty
+\xylet@\PATHextra@@=\empty
+\xylet@\PATHpost@@=\empty
+\xylet@\PATHcontinue@@=\empty
+\xydef@\PATHstraight@{%
+ \def\PATHinit@@{\PATHinitstraight@}%
+ \let\PATHextra@@=\empty
+ \let\PATHpost@@=\empty
+ \let\PATHlabelsextra@@=\relax
+ \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}
+\xydef@\PATHfinal@{%
+ \def\PATHinit@@{\PATHinitstraight@}%
+ \def\PATHextra@@{\let\PATHcontinue@@=\afterPATH@}%
+ \let\PATHpost@@=\empty
+ \let\PATHlabelsextra@@=\PATHlabelsextralast@
+ \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}
+\xydef@\PATHlabelsextralast@{\let\PATHlabelsextra@@=\relax
+ \expandafter\xyFN@\expandafter\PATHlabels@\PATHlabelslast@@}
+\xydef@\PATHinitstraight@{\xy@@{\setupDirection@ \dimen@=\PATHslide@@
+ \dimen@ii=-\sinDirection\dimen@
+ \ifPATHomitslide@@\else\advance\X@p\dimen@ii\fi \advance\X@c\dimen@ii
+ \dimen@ii= \cosDirection\dimen@
+ \ifPATHomitslide@@\else\advance\Y@p\dimen@ii\fi \advance\Y@c\dimen@ii
+ \PATHomitslide@@false \resetupDirection@}}
+\xydef@\PATHslide@@{\z@}
+\xynew@{if}\ifPATHomitslide@@
+\xydef@\PATHsegment@{%
+ \addLT@\ifx\next
+ \addGT@{\addLT@\DN@##1}{%
+ \xy@{<##1>}{\dimen@=##1\relax \edef\PATHslide@@{\the\dimen@}}%
+ \xyFN@\PATHsegment@@}%
+ \else \let\next@=\PATHsegment@@
+ \fi \next@}
+\xydef@\PATHsegment@@{\PATHinit@@ \addEQ@\PATHaction@\PATHbefore@@ \PATHextra@@
+ \expandafter\toks@\expandafter{\PATHlabelsnext@@}\let\PATHlabelsnext@@=\empty
+ \expandafter\addtotoks@\expandafter{\PATHlabelsevery@@}%
+ \expandafter\def\expandafter\PATHlabels@@\expandafter{\the\toks@}%
+ \toks@={}\expandafter\xyFN@\expandafter\PATHlabels@\PATHlabels@@}
+\xylet@\PATHlabelit@@=\empty
+\xydef@\PATHlabels@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHlabels@}%
+ \else \ifx ^\next
+ \DN@##1{\xy@^{}\let\PATHlabelit@@=\PATHlabelabove@@
+ \DNii@{}\xyFN@\PATHanchor@}%
+ \else \ifx _\next
+ \DN@##1{\xy@_{}\let\PATHlabelit@@=\PATHlabelbelow@@
+ \DNii@{}\xyFN@\PATHanchor@}%
+ \else \ifx |\next
+ \DN@##1{\xy@|{}\let\PATHlabelit@@=\PATHlabelbreak@
+ \DNii@{}\xyFN@\PATHanchor@}%
+ \else \let\next@=\PATHfinishsegments@ \fi\fi\fi\fi \next@}
+\xydef@\PATHanchor@{\begingroup \toks@={}\PATHanchor@i}
+\xydef@\PATHanchor@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHanchor@i}%
+ \else\addDASH@\ifx \next
+ \addDASH@\DN@{\expandafter\addtotoks@\expandafter{\PATHanchor@toks}%
+ \xyFN@\PATHanchor@i}%
+ \else
+ \DNii@##1{\endgroup\afterPLACE{\xyFN@\PATHit@}##1}%
+ \DN@{\expandafter\nextii@\expandafter{\the\toks@}}%
+ \fi\fi \next@}
+{\xyuncatcodes \gdef\next{<>(.5)}}
+\xylet@\PATHanchor@toks=\next
+\xylet@\PATHitshapes@@=\empty
+\xydef@\PATHit@{\let\PATHitshape@@=\empty \xyFN@\PATHit@i}
+\xydef@\PATHit@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHit@i}%
+ \else \ifx *\next \DN@*##1##{\PATHlabelit@@{!C##1}}%
+ \else \addAT@\ifx\next \addAT@\DN@##1##{\PATHlabelit@@{\dir##1}}%
+ \else \ifx [\next \DN@[##1]{%
+ \expandafter\def\expandafter\PATHitshape@@\expandafter{\PATHitshape@@[##1]}%
+ \xyFN@\PATHit@i}%
+ \else \DN@{\PATHlabelit@@{}}%
+ \fi\fi\fi\fi \next@}
+\xydef@\PATHfinishsegments@{%
+ \ifx\PATHlabelsextra@@\relax \expandafter\PATHfinishsegments@i
+ \else
+ \expandafter\PATHlabelsextra@@ \fi}
+\xydef@\PATHfinishsegments@i{%
+ \xy@@{\Clast@@}\the\toks@ \toks@={}%
+ \xy@@\setupDirection@
+ \PATHpost@@ \PATHaction@/\PATHafter@@
+ \PATHcontinue@@}
+\xydef@\PATHaction@default#1#2{\xy@{PATHaction#1{#2}}{}\POS#2\relax}
+\xylet@\PATHaction=\PATHaction@default
+\xydef@\PATHaction@#1#2{\expandafter\PATHaction\expandafter#1\expandafter{#2}}
+\xylet@\PATHafterPOS@default=\afterPOS
+\xylet@\PATHafterPOS=\PATHafterPOS@default
+\xydef@\PATHlastout@@{3}
+\xydef@\PATHturn@{\afterCIRorDIAG\PATHturn@cir\PATHturn@diag}
+\xydef@\PATHturn@cir{\toks@={\xy@@{%
+ \count@=\CIRin@@ \ifnum\count@<4\else\advance\count@-4\fi
+ \count@@=\CIRout@@ \ifnum\count@@<4\else\advance\count@@-4\fi
+ \ifnum\count@=\count@@ \xyerror@{<turn> cannot be half or full}{%
+You asked for a <turn>ed segment with parallel in- and out-direction.^^J%
+This is not allowed because it is not possible to position it uniquely.}\fi}}%
+ \edef\next@{{\CIRin@@}{\expandafter\noexpand\CIRorient@@}{\CIRout@@}}%
+ \expandafter\PATHturn@i\next@}
+\xydef@\PATHturn@diag{\toks@={\xy@@{%
+ \setupDirection@ \count@=\CIRin@@ \dimen@=\xydashl@ \ABfromdiag@
+ \ifdim \sinDirection\A@>\cosDirection\B@ \def\CIRorient@@{\CIRacw@}%
+ \advance\count@\ifnum\count@<6 \tw@ \else -6\fi
+ \else \def\CIRorient@@{\CIRcw@}%
+ \advance\count@\ifnum\count@>\@ne -\tw@ \else 6\fi
+ \fi
+ \edef\CIRout@@{\the\count@}}}%
+ \edef\next@{{\CIRin@@}{}{}}%
+ \expandafter\PATHturn@i\next@}
+\xylet@\PATHpostpos@@=\empty
+\xydef@\PATHturn@i#1#2#3{%
+ \DN@##1{\def\PATHinit@@{\xy@@{%
+ \def\CIRin@@{#1}\def\CIRorient@@{#2}\def\CIRout@@{#3}%
+ \ifnum\CIRin@@=8 \let\CIRin@@=\PATHlastout@@ \fi
+ \R@=\turnradius@
+ ##1\relax}%
+ \xy@@{\count@=\CIRin@@
+ \ifPATHomitslide@@ \dimen@=-\PATHslide@@
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@ \fi
+ \enter@{\pfromthep@ \basefromthebase@}}%
+ \xy@@{\dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@
+ \X@origin=\X@p \Y@origin=\Y@p}%
+ \xy@@{\dimen@=\xydashl@ \ABfromdiag@ \R@c=\A@ \U@c=\B@
+ \count@=\CIRout@@
+ \dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@
+ \ABfromdiag@ \advance\X@c-\B@ \advance\Y@c\A@
+ \dimen@=\xydashl@ \X@p=\X@c \Y@p=\Y@c
+ \ABfromdiag@ \advance\X@p-\A@ \advance\Y@p-\B@
+ \intersect@
+ \count@=\CIRin@@ \dimen@=\p@ \ABfromdiag@}%
+ \xy@@{\edef\next@{\expandafter\removePT@\the\A@}%
+ \edef\nextii@{\expandafter\removePT@\the\B@}%
+ \A@=\X@c \advance\A@-\X@origin \B@=\Y@c \advance\B@-\Y@origin
+ \ifdim \next@\A@<-\nextii@\B@
+ \dontleave@ \cfromp@
+ \count@=\CIRin@@ \advance\count@\ifnum\count@<4 +4\else -4\fi
+ \dimen@=\xydashl@ \Directionfromdiag@
+ \the\Edge@c\z@
+ \count@=\CIRin@@ \dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@
+ \ABfromdiag@ \advance\X@c-\B@ \advance\Y@c\A@
+ \dimen@=5sp \ABfromdiag@ \advance\X@c\A@ \advance\Y@c\B@
+ \fi
+ \dimen@ii=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\PATHslide@@
+ \advance\R@\dimen@ii
+ \drop@\literal@{\hbox\bgroup\cir@i}}%
+ \xy@@{\X@p=\X@c \Y@p=\Y@c
+ \count@=\CIRout@@
+ \dimen@=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\R@c
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@
+ \edef\PATHpostpos@@{\X@c=\the\X@p \Y@c=\the\Y@p \noexpand\czeroEdge@
+ \noexpand\PATHomitslide@@true}}%
+ \xy@@{\count@=\CIRin@@
+ \dimen@=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\R@c
+ \ABfromdiag@ \advance\X@c-\B@ \advance\Y@c\A@ \czeroEdge@}%
+ \xy@@{\leave@
+ \count@=\CIRin@@ \dimen@=\PATHslide@@
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@
+ \edef\PATHlastout@@{\CIRout@@}%
+ \count@=\CIRout@@ \dimen@=\xydashl@ \Directionfromdiag@}}}%
+ \expandafter\next@\expandafter{\the\toks@}\toks@={}%
+ \let\PATHextra@@=\empty
+ \def\PATHpost@@{\xy@@\PATHpostpos@@}%
+ \let\PATHlabelsextra@@=\relax
+ \xyFN@\PATHturn@ii}
+\xydef@\PATHturn@ii{%
+ \ifx /\next
+ \DN@ /{\afterassignment\nextii@\dimen@=}%
+ \DNii@{%
+ \edef\next@{\noexpand\xy@@{\edef\noexpand\turnradius@{\the\dimen@}}}\next@
+ \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}%
+ \else \DN@{\xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}\fi
+ \next@}
+\xydef@\ABfromdiag@{\ifcase\count@\relax
+ \A@=-.7071\dimen@ \B@=-.7071\dimen@ \or \A@=\z@ \B@=-\dimen@
+ \or \A@=+.7071\dimen@ \B@=-.7071\dimen@ \or \A@=\dimen@ \B@=\z@
+ \or \A@=+.7071\dimen@ \B@=+.7071\dimen@ \or \A@=\z@ \B@=+\dimen@
+ \or \A@=-.7071\dimen@ \B@=+.7071\dimen@ \or \A@=-\dimen@ \B@=\z@
+ \else\xybug@{impossible <diag>?}\fi}
+\xydef@\turnradius@{10pt}
+\xydef@\turnradius{\afterADDOP{\Addop@@\turnradius@}}
+\xydef@\PATHlabelabove@#1#2{\droplabel@\belowDirection@{#1}{#2}%
+ \let\afteraliases@@=\empty \xyFN@\PATHlabelalias@}
+\xydef@\PATHlabelbelow@#1#2{\droplabel@\aboveDirection@{#1}{#2}%
+ \let\afteraliases@@=\empty \xyFN@\PATHlabelalias@}
+\xylet@\PATHlabelabove@@=\PATHlabelabove@
+\xylet@\PATHlabelbelow@@=\PATHlabelbelow@
+\xydef@\droplabel@#1#2#3{\xy@@{\enter@\DirectionfromtheDirection@}%
+ \DN@{#2}\ifx\next@\empty
+ \expandafter\xy@@ix@\expandafter{\PATHitshape@@\labelbox{#3}}%
+ \else \expandafter\xy@@ix@\expandafter{\PATHitshape@@#2{#3}}\fi
+ \xy@@{\setbox\z@=\expandafter\object\the\toks9
+ \advance\L@c\labelmargin@ \advance\R@c\labelmargin@
+ \advance\D@c\labelmargin@ \advance\U@c\labelmargin@
+ \setboxz@h{\kern\labelmargin@\boxz@\kern\labelmargin@}%
+ \A@=\X@c \B@=\Y@c #1\xydashl@ \the\Edge@c\thr@@
+ \advance\A@-\X@c \advance\B@-\Y@c \advance\X@c 2\A@ \advance\Y@c 2\B@
+ \ht\z@=\U@c \dp\z@=\D@c \dimen@=\L@c \advance\dimen@\R@c \wd\z@=\dimen@
+ \setbox\lastobjectbox@=\hbox{\X@c=\L@c \Y@c=\z@ \Drop@@}%
+ \drop@{\box\lastobjectbox@}{}%
+ \leave@}}
+\xydef@\PATHlabelbreak@#1#2{%
+ \DN@{#1}\ifx\next@\empty \drop\labelbox{#2}\else \drop#1{#2}\fi
+ \def\afteraliases@@{\xy@@\Cbreak@@}\xyFN@\PATHlabelalias@}
+\xylet@\labelmargin@=\objectmargin@
+\xydef@\labelmargin{\afterADDOP{\Addop@@\labelmargin@}}
+\xydef@\hole{\hbox{\dimen@=\objectmargin@ \kern2\dimen@
+ \vrule height\dimen@ depth\dimen@ width\z@}}
+\xylet@\labelstyle=\scriptstyle
+\xydef@\labelbox#1{\hbox{$\m@th\labelstyle{#1}$}}
+\xydef@\PATHlabelalias@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHlabelalias@}%
+ \else \addEQ@\ifx \next
+ \addEQ@\DN@"##1"{\savealias@{##1}\xyFN@\PATHlabelalias@}%
+ \else \DN@{\afteraliases@@\PATHlabels@}\fi\fi \next@}
+\xylet@\afteraliases@@=\empty
+\xydef@\savealias@#1{\xy@@{\enter@\cfromthec@
+ \advance\X@c-\L@c \advance\L@c\R@c \L@c=.5\L@c \R@c=\L@c \advance\X@c\L@c
+ \advance\Y@c-\D@c \advance\D@c\U@c \D@c=.5\D@c \U@c=\D@c \advance\Y@c\D@c
+ \idfromc@{#1}\leave@}}
+\message{\string\ar,}
+\xylet@\arvariant@@=\empty
+\xylet@\arstemprefix@@=\empty
+\xylet@\artail@@=\empty
+\xylet@\arstem@@=\empty
+\xylet@\arhead@@=\empty
+\xylet@\armodifiers@@=\empty
+\xylet@\arlabels@@=\empty
+\xylet@\arafterPOS@@=\empty
+\xylet@\arinit@@=\empty
+\xylet@\arexit@@=\empty
+\xylet@\arcomponent@@=\relax
+\xylet@\arcomponenttype@@=\relax
+\xylet@\afterar@@=\relax
+\xydef@\ar{\relax\arSAFE}
+\xydef@\arSAFE{%
+ \let\arvariant@@=\empty
+ \def\arstemprefix@@{\dir}%
+ \edef\artail@@{\arvariant@@{}}%
+ \edef\arstem@@{\arvariant@@{-}}%
+ \edef\arhead@@{\arvariant@@{>}}%
+ \def\armodifiers@@{}%
+ \def\arafterPOS@@{}%
+ \def\arlabels@@{}%
+ \def\arinit@@{}%
+ \def\arexit@@{}%
+ \let\PATHlabelabove@@=\PATHlabelabove@
+ \let\PATHlabelbelow@@=\PATHlabelbelow@
+ \xyFN@\ar@}
+\xydef@\ar@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ar@}%
+ \else \addAT@\ifx\next \addAT@\DN@{\xyFN@\ar@form}%
+ \else\ifx |\next
+ \DN@ |{\ar@anchor|}%
+ \else\ifx ^\next
+ \DN@ ^{\ar@anchor^}%
+ \else\ifx _\next
+ \DN@ _{\ar@anchor_}%
+ \else \let\next@=\ar@x \fi\fi\fi\fi\fi \next@}
+\xydef@\addtoarinit@#1{%
+ \expandafter\def\expandafter\arinit@@\expandafter{\arinit@@ #1}}
+\xydef@\addtoarlabels@#1{%
+ \expandafter\def\expandafter\arlabels@@\expandafter{\arlabels@@ #1}}
+\xydef@\ar@anchor#1{\begingroup
+ \def\PATHlabelit@@##1##2{%
+ \DN@{##1}\ifx\next@\empty
+ \DN@####1{\expandafter\endgroup\expandafter\addtoarlabels@
+ \expandafter{\the\toks@####1{##2}}\xyFN@\ar@}%
+ \else
+ \DN@####1{\expandafter\endgroup\expandafter\addtoarlabels@
+ \expandafter{\the\toks@*!C####1##1{##2}}\xyFN@\ar@}\fi
+ \expandafter\next@\expandafter{\PATHitshape@@}}%
+ \toks@={#1}%
+ \def\xy@##1##2{\addtotoks@{##1}}\change@oxy@\xy@ \let\xy@@ix@=\eat@
+ \DNii@{}\xyFN@\PATHanchor@}
+\xydef@\ar@form{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ar@form}%
+ \else\ifx ^\next \DN@ ^{\xyFN@\ar@style}\edef\arvariant@@{\string^}%
+ \else\ifx _\next \DN@ _{\xyFN@\ar@style}\edef\arvariant@@{\string_}%
+ \else\ifx 0\next \DN@ 0{\xyFN@\ar@style}\def\arvariant@@{0}%
+ \else\ifx 1\next \DN@ 1{\xyFN@\ar@style}\def\arvariant@@{1}%
+ \else\ifx 2\next \DN@ 2{\xyFN@\ar@style}\def\arvariant@@{2}%
+ \else\ifx 3\next \DN@ 3{\xyFN@\ar@style}\def\arvariant@@{3}%
+ \else\ifx \bgroup\next \let\next@=\ar@style
+ \else\ifx [\next \DN@[##1]{\ar@modifiers{[##1]}}%
+ \else\ifx *\next \DN@ *{\ar@modifiers}%
+ \else\addLT@\ifx\next \let\next@=\ar@slide
+ \else\ifx /\next \let\next@=\ar@curveslash
+ \else\ifx (\next \let\next@=\ar@curveinout
+ \else\addRQ@\ifx\next \addRQ@\DN@{\ar@curve@}%
+ \else\addLQ@\ifx\next \addLQ@\DN@{\xyFN@\ar@curve}%
+ \else\addDASH@\ifx\next \addDASH@\DN@{\defarstem@-\xyFN@\ar@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\def\arvariant@@{2}\defarstem@-\xyFN@\ar@}%
+ \else\addDOT@\ifx\next \addDOT@\DN@{\defarstem@.\xyFN@\ar@}%
+ \else\ifx :\next \DN@:{\def\arvariant@@{2}\defarstem@.\xyFN@\ar@}%
+ \else\ifx ~\next \DN@~{\defarstem@~\xyFN@\ar@}%
+ \else\ifx !\next \DN@!{\dasharstem@\xyFN@\ar@}%
+ \else\ifx ?\next \DN@?{\ar@upsidedown\xyFN@\ar@}%
+ \else \let\next@=\ar@error
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\defarstem@#1{\edef\arstem@@{\arvariant@@{\string#1}}%
+ \DNii@##1##{\next@}%
+ \edef\next@##1{\def\noexpand\artail@@{\arvariant@@{##1}}}%
+ \expandafter\nextii@\artail@@
+ \edef\next@##1{\def\noexpand\arhead@@{\arvariant@@{##1}}}%
+ \expandafter\nextii@\arhead@@}
+\xydef@\dasharstem@{%
+ \DN@##1##{\nextii@{##1}}\DNii@##1##2{\def\arstem@@{##1{##2##2}}}%
+ \expandafter\next@\arstem@@}
+\xydef@\ar@error#1{\xyerror@{Illegal <form>ation (\meaning\next)}{}%
+ \xyFN@\ar@}
+\xydef@\ar@style{%
+ \ifx \bgroup\next \def\artail@@{{}}%
+ \edef\arstem@@{\arvariant@@{-}}\edef\arhead@@{\arvariant@@{>}}%
+ \expandafter\ar@i
+ \else \resetvariant@\artail@@ \resetvariant@\arstem@@ \resetvariant@\arhead@@
+ \expandafter\xyFN@\expandafter\ar@ \fi}
+\xydef@\resetvariant@#1{%
+ \DN@##1##{\DN@{##1}\ifx\next@\empty
+ \DN@{\expandafter\nextii@\expandafter{\arvariant@@}}%
+ \else \DN@{\nextii@{##1}}\fi \next@}%
+ \DNii@##1##2{\def#1{##1{##2}}}%
+ \expandafter\next@#1}
+\xydef@\ar@i#1{\DN@{#1}%
+ \ifx\next@\empty \edef\arstem@@{\arvariant@@{}}\edef\arhead@@{\arvariant@@{}}%
+ \DN@{\xyFN@\ar@}%
+ \else
+ \let\arcomponent@@=\ar@ii \let\arcomponenttype@@=\artip@
+ \DN@{\xyFN@\arcomponent@#1$}%
+ \fi \next@}
+\xydef@\ar@ii{\ifx $\next \let\next@=\ar@iv
+ \else \expandafter\def\expandafter\artail@@\expandafter{\the\toks@}%
+ \let\arcomponent@@=\ar@iii \let\arcomponenttype@@=\arconn@
+ \DN@{\xyFN@\arcomponent@}\fi \next@}
+\xydef@\ar@iii{%
+ \expandafter\def\expandafter\arstem@@\expandafter{\the\toks@}%
+ \resetvariant@\artail@@
+ \let\arcomponent@@=\ar@iv \let\arcomponenttype@@=\artip@
+ \xyFN@\arcomponent@}
+\xydef@\ar@iv{%
+ \expandafter\def\expandafter\arhead@@\expandafter{\the\toks@}%
+ \ifx $\next \DN@ ${\xyFN@\ar@}%
+ \else \xyerror@{illegal <arrow>: \meaning\next\space not valid}{}\fi \next@}
+\xydef@\ar@x{%
+ \let\arsavedPATHafterPOS@@=\PATHafterPOS \let\PATHafterPOS=\arafterPOS@
+ \toks@={\ar@PATH}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\artail@@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\arstem@@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\arstemprefix@@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\arhead@@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\armodifiers@@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\arinit@@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\arexit@@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\arlabels@@}}%
+ \addtotoks@{\afterar@@}%
+ \expandafter\DNii@\expandafter{\the\toks@}\toks@={}%
+ \nextii@}
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{%
+ \def\next{%
+ \afterPATH{#9}%
+ ~={#6\preconnect#5#3#2}%
+ ~/{#7}%
+ ~<{|<*h#5\dir#1}%
+ ~>{|>*h#5\dir#4}%
+ ~+{#8}%
+ }%
+ \next}}
+\xylet@\ar@PATH=\next
+\xydef@\arafterPOS@#1{%
+ \arsavedPATHafterPOS@@{\let\PATHafterPOS=\arsavedPATHafterPOS@@
+ \DN@{#1}\expandafter\next@\arafterPOS@@}}%
+\xylet@\arsavedPATHafterPOS@@=\relax
+\xydef@\arcomponent@{%
+ \ifx ^\next \toks@ii={^}\DN@ ^{\xyFN@\arcomponent@i}%
+ \else\ifx _\next \toks@ii={_}\DN@ _{\xyFN@\arcomponent@i}%
+ \else\ifx 1\next \toks@ii={1}\DN@ 1{\xyFN@\arcomponent@i}%
+ \else\ifx 2\next \toks@ii={2}\DN@ 2{\xyFN@\arcomponent@i}%
+ \else\ifx 3\next \toks@ii={3}\DN@ 3{\xyFN@\arcomponent@i}%
+ \else\ifx \bgroup\next \expandafter\toks@ii\expandafter{\arvariant@@}%
+ \let\next@=\arcomponent@i
+ \else\ifx *\next \DN@*##1##{\arcomponent@ii{##1}}%
+ \else \expandafter\toks@ii\expandafter{\arvariant@@}\toks@={}%
+ \let\next@=\arcomponenttype@@
+ \fi\fi\fi\fi\fi\fi\fi
+ \next@}
+\xydef@\arcomponent@i#1{\toks@={#1}\arcomponent@x}
+\xydef@\arcomponent@ii#1#2{\toks@={*#1{#2}}\xyFN@\arcomponent@@}
+\xydef@\artip@{%
+ \addGT@\ifx\next \addGT@\addtotoks@ \addGT@\DN@{\xyFN@\artip@}%
+ \else\addLT@\ifx\next \addLT@\addtotoks@ \addLT@\DN@{\xyFN@\artip@}%
+ \else\ifx (\next \addtotoks@(\DN@({\xyFN@\artip@}%
+ \else\ifx )\next \addtotoks@)\DN@){\xyFN@\artip@}%
+ \else\ifx |\next \addtotoks@|\DN@|{\xyFN@\artip@}%
+ \else\addLQ@\ifx\next \addLQ@\addtotoks@ \addLQ@\DN@{\xyFN@\artip@}%
+ \else\addRQ@\ifx\next \addRQ@\addtotoks@ \addRQ@\DN@{\xyFN@\artip@}%
+ \else\addPLUS@\ifx \next \addPLUS@\addtotoks@ \addPLUS@\DN@{\xyFN@\artip@}%
+ \else\ifx /\next \addtotoks@/\DN@/{\xyFN@\artip@}%
+ \else\ifcat A\noexpand\next \DN@##1{\addtotoks@{##1}\xyFN@\artip@}%
+ \else\ifx\space@\next \addtotoks@{ }\expandafter\DN@\space{\xyFN@\artip@}%
+ \else \let\next@=\arcomponent@x
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\arconn@{%
+ \addDASH@\ifx\next \addDASH@\addtotoks@ \addDASH@\DN@{\xyFN@\arconn@}%
+ \else\addEQ@\ifx\next \addEQ@\addtotoks@ \addEQ@\DN@{\xyFN@\arconn@}%
+ \ifx\arvariant@@\empty \def\arvariant@@{2}\fi
+ \else\addDOT@\ifx\next \addDOT@\addtotoks@ \addDOT@\DN@{\xyFN@\arconn@}%
+ \else\ifx :\next \addtotoks@:\DN@:{\xyFN@\arconn@}%
+ \ifx\arvariant@@\empty \def\arvariant@@{2}\fi
+ \else\ifx ~\next \addtotoks@~\DN@~{\xyFN@\arconn@}%
+ \else \let\next@=\arcomponent@x
+ \fi\fi\fi\fi\fi \next@}
+\xydef@\arcomponent@x{%
+ \DN@##1{\toks@=\expandafter{\the\toks@ii{##1}}}%
+ \expandafter\next@\expandafter{\the\toks@}%
+ \xyFN@\arcomponent@@}
+\xydef@\ar@curveslash/#1/{\expandafter\ar@curve@\ar@slashing{#1}}
+\xydef@\ar@slashing#1{{\xy@{**{} ?+/#1/+/#1/ @+c}{\setupDirection@
+ \vfromslide@{#1}%
+ \X@c=2\X@c \advance\X@c\X@p \advance\X@c.5\d@X
+ \Y@c=2\Y@c \advance\Y@c\Y@p \advance\Y@c.5\d@Y
+ \czeroEdge@
+ \spushc@}}}
+{\xyuncatcodes \catcode`\#=6
+ \gdef\next(#1,#2){{+/#1 3pc/,p+/#2 3pc/}}}
+\xylet@\ar@curveinout@=\next
+\xydef@\ar@curveinout{\expandafter\ar@curve@load\ar@curveinout@}
+\xydef@\ar@curve{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ar@curve}%
+ \else\ifx \bgroup\next \let\next@=\ar@curve@load
+ \else\ifx "\next \DN@"##1"{\ar@curve@{"##1"}}%
+ \else \xyerror@{@= <form> must be followed by \string"<id>\string" or
+ {<control point list>}}{}%
+ \fi\fi\fi \next@}
+{\xyuncatcodes \gdef\next#1#2{\def#1##1{#2{;@={##1}}}}}
+\next\ar@curve@load\ar@curve@
+\xydef@\ar@curve@#1{\curve@check
+ \setcurvearinit@{#1}\setcurvearexit@\arexit@@
+ \def\arstemprefix@@{\crvi}\xyFN@\ar@}
+{\xyuncatcodes \gdef\next#1{\save @(,#1\restore}}
+\xylet@\setcurvearinit@i=\next
+\xydef@\setcurvearinit@#1{%
+ \expandafter\addtoarinit@\expandafter{\setcurvearinit@i{#1}}}
+{\xyuncatcodes \gdef\next#1{\def#1{\POS @i @) }}}
+\xylet@\setcurvearexit@=\next
+\xydef@\curve@check{%
+ \xyerror@{Forms @/.../, @(...), and @`{...}, only available when curve
+ extension loaded}{}}
+\xywithoption{curve}{\let\curve@check=\relax}
+\xydef@\ar@modifiers#1{%
+ \expandafter\def\expandafter\armodifiers@@\expandafter{\armodifiers@@#1}%
+ \xyFN@\ar@}
+{\xyuncatcodes \catcode`\#=6 \catcode`\@=11
+ \gdef\next<#1>{\def\arafterPOS@@{<#1>}\xyFN@\ar@}}
+\xylet@\ar@slide=\next
+\xydef@\ar@upsidedown{\let\next=\PATHlabelabove@@
+ \let\PATHlabelabove@@=\PATHlabelbelow@@ \let\PATHlabelbelow@@=\next}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xybarr.tex b/macros/generic/diagrams/xypic/texinputs/xybarr.tex
new file mode 100644
index 0000000000..51a419db15
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xybarr.tex
@@ -0,0 +1,1016 @@
+%% xybarr.tex from $Id: xybarr.doc,v 1.3 2013/10/06 00:12:30 krisrose Exp $
+%%
+%% Xy-pic ``Barr Feature'' option.
+%% Copyright (c) 2001 Michael Barr <barr@barrs.org>
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Michael Barr
+%%
+%% This work is derived from the file diagxy.tex and has
+%% documentation/tutorial file barrdoc.latex
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{barr}{Barr's diagram feature}{2011-06-18}%
+ {Michael Barr}{barr@math.mcgill.ca}%
+ {Dept of Math and Stats,
+ McGill University,
+ 805 Sherbrooke Street West,
+ Montreal, Quebec H3A 0B9, Canada}
+\xyrequire{curve}
+\xyrequire{arrow}
+\xycatcodes
+\def\dated#1{\def\thedate{#1}}%
+\dated{2011-06-18}%
+ \newdimen\xydashw@@
+ \xydashw@@\xydashw@
+ \multiply\xydashw@@ by 7
+ \divide\xydashw@@ by 4
+\setbox\zerodotbox@=\hbox{\dimen@=.5\xydashw@@
+ \kern-\dimen@ \vrule width\xydashw@@ height\dimen@ depth\dimen@}
+\wd\zerodotbox@=\z@ \ht\zerodotbox@=\z@ \dp\zerodotbox@=\z@
+\catcode`\@=12
+\newdir{ >}{{ }*!/-.9em/@{>}}%
+\newdir^{ (}{{ }*!/-.5em/@^{(}}%
+\newdir{< }{!/.9em/@{<}*{ }}%
+\newdir{) }{!/.9em/@^{)}*{ }}%
+\newdir{ (}{{ }*!/-.5em/@^{(}}%
+\newdir{d}{\object{.}}
+\newdir{into}{{ }*!/-.5em/@^{(}}%
+\newdimen\high%
+\newdimen\ul%
+\newcount\deltax%
+\newcount\deltay%
+\newcount\deltaX%
+\newcount\deltaXprime%
+\newcount\deltaY%
+\newcount\deltaYprime%
+\newdimen\wdth%
+\newcount\xend%
+\newcount\yend%
+\newcount\Xend%
+\newcount\Yend%
+\newcount\xpos%
+\newcount\ypos%
+\newcount\default \default=500%
+\newcount\defaultmargin \defaultmargin=150%
+\newcount\topw%
+\newcount\botw%
+\newcount\Xpos%
+\newcount\Ypos%
+\def\ratchet#1#2{\ifnum#1<#2\global #1=#2\fi}%
+\catcode`\@=11%
+\expandafter\ifx\csname @ifnextchar\endcsname\relax%
+\def\ifnextchar#1#2#3{\let\@tempe%
+#1\def\@tempa{#2}\def\@tempb{#3}\futurelet%
+ \@tempc\@ifnch}%
+\def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch%
+ \else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi%
+ \fi \@tempd}%
+\def\:{\let\@sptoken= } \:
+\def\:{\@xifnch} \expandafter\def\: {\futurelet\@tempc\@ifnch}%
+\else%
+\let\ifnextchar\@ifnextchar%
+\fi%
+\setbox0=\hbox{$x$}
+\newdimen\axis \axis=\fontdimen22\textfont2%
+\ul=.01em%
+\X@xbase =.01em%
+\Y@ybase =.01em%
+\def\scalefactor#1{\ul=#1\ul \X@xbase=#1\X@xbase \Y@ybase=#1\Y@ybase}%
+\catcode`\@=12%
+\def\fontscale#1{%
+\if#1h\relax%
+\font\xydashfont=xydash10 scaled \magstephalf%
+\font\xyatipfont=xyatip10 scaled \magstephalf%
+\font\xybtipfont=xybtip10 scaled \magstephalf%
+\font\xybsqlfont=xybsql10 scaled \magstephalf%
+\font\xycircfont=xycirc10 scaled \magstephalf%
+\else%
+\font\xydashfont=xydash10 scaled \magstep#1%
+\font\xyatipfont=xyatip10 scaled \magstep#1%
+\font\xybtipfont=xybtip10 scaled \magstep#1%
+\font\xybsqlfont=xybsql10 scaled \magstep#1%
+\font\xycircfont=xycirc10 scaled \magstep#1%
+\fi}%
+\def\bfig{\vcenter\bgroup\xy}%
+\def\efig{\endxy\egroup}%
+\def\car#1#2\nil{#1}%
+\def\morphism{\ifnextchar({\morphismp}{\morphismp(0,0)}}%
+\def\morphismp(#1){\ifnextchar|{\morphismpp(#1)}{\morphismpp(#1)|a|}}%
+\def\morphismpp(#1)|#2|{\ifnextchar/{\morphismppp(#1)|#2|}%
+ {\morphismppp(#1)|#2|/>/}}%
+\def\morphismppp(#1)|#2|/#3/{%
+ \ifnextchar<{\morphismpppp(#1)|#2|/#3/}%
+ {\morphismpppp(#1)|#2|/#3/<\default,0>}}%
+\def\morphismpppp(#1,#2)|#3|/#4/<#5,#6>[#7`#8;#9]{%
+\xend#1\advance \xend by #5%
+\yend#2\advance \yend by #6%
+\domorphism(#1,#2)|#3|/#4/<#5,#6>[{#7}`{#8};{#9}]}%
+\def\domorphism(#1,#2)|#3|/#4/<#5,#6>[#7`#8;#9]{%
+\def\next{\car#4.\nil}%
+\if@\next\relax%
+ \if#3l%
+ \ifnum #6>0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3m%
+ \setbox0\hbox{$#9$}%
+ \ifdim \wd0=0pt%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4 (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4|-*+<1pt,4pt>{\labelstyle#9}%
+ (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3r%
+ \ifnum #6<0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3a%
+ \ifnum #5>0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3b%
+ \ifnum #5<0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4 (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi\fi\fi\fi\fi%
+\else%
+ \if#3l%
+ \ifnum #6>0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3m%
+ \setbox0\hbox{$#9$}%
+ \ifdim \wd0=0pt%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}|-*+<1pt,4pt>{\labelstyle#9}%
+ (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3r%
+ \ifnum #6<0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3a%
+ \ifnum #5>0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else \if#3b%
+ \ifnum #5<0%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi%
+ \else%
+ \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4} (\xend,\yend)*+!!<0ex,\axis>{#8}%
+ \fi\fi\fi\fi\fi%
+\fi\ignorespaces}%
+\def\vect(#1,#2)/#3/<#4,#5>{%
+ \xend#1 \yend#2 \advance\xend by #4 \advance\yend by #5%
+ \POS(#1,#2)\ar#3 (\xend,\yend)}%
+\def\squarepppp(#1,#2)|#3|/#4`#5`#6`#7/<#8>[#9]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3##4|{%
+ \def\xa{##1}\def\xb{##2}\def\xc{##3}\def\xd{##4}\ignorespaces}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\ignorespaces}%
+\next[#9]%
+\morphism(\xpos,\ypos)|\xd|/{#7}/<\deltax,0>[\nodec`\noded;\labeld]%
+\advance \ypos by \deltay%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+ \advance \xpos by \deltax%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<0,-\deltay>[\nodeb`\noded;\labelc]%
+\ignorespaces}%
+\def\square{\ifnextchar({\squarep}{\squarep(0,0)}}%
+\def\squarep(#1){\ifnextchar|{\squarepp(#1)}{\squarepp(#1)|alrb|}}%
+\def\squarepp(#1)|#2|{\ifnextchar/{\squareppp(#1)|#2|}%
+ {\squareppp(#1)|#2|/>`>`>`>/}}%
+\def\squareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\squarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\squarepppp(#1)|#2|/#3`#4`#5`#6/<\default,\default>}}%
+\def\diamondpppp(#1,#2)|#3|/#4`#5`#6`#7/<#8>[#9]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3##4|{%
+ \def\xa{##1}\def\xb{##2}\def\xc{##3}\def\xd{##4}\ignorespaces}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}%
+\def\labeld{##8}\ignorespaces}%
+\next[#9]%
+\advance\ypos\deltay
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,-\deltay>[\nodeb`\noded;\labelc]%
+\advance\xpos \deltax
+\advance\xpos \deltax
+\morphism(\xpos,\ypos)|\xd|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labeld]%
+\advance\ypos\deltay \advance\xpos -\deltax
+\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+}
+\def\Diamond{\ifnextchar({\diamondp}{\diamondp(0,0)}}%
+\def\diamondp(#1){\ifnextchar|{\diamondpp(#1)}{\diamondpp(#1)|lrlr|}}%
+\def\diamondpp(#1)|#2|{\ifnextchar/{\diamondppp(#1)|#2|}%
+ {\diamondppp(#1)|#2|/>`>`>`>/}}%
+\def\diamondppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\diamondpppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\diamondpppp(#1)|#2|/#3`#4`#5`#6/<400,400>}}%
+\def\ptrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\ignorespaces}%
+\def\qtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<0,-\deltay>[\nodeb`\nodec;\labelc]%
+\ignorespaces}%
+\def\dtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\advance\ypos by \deltay\advance \xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+\def\btrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<0,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+\def\Atrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\multiply\deltax by 2%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\divide\deltax by 2%
+\advance\ypos by \deltay\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+\def\Vtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\multiply\deltax by 2%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\advance\xpos by \deltax \divide \deltax by 2%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\ignorespaces}%
+\def\Ctrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance \ypos by \deltay%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\advance\ypos by \deltay \advance \xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\multiply\deltay by 2%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+\def\Dtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\xpos by \deltax \advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\advance\xpos by -\deltax \advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodeb;\labelb]%
+\multiply \deltay by 2%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<0,-\deltay>[\nodea`\nodec;\labela]%
+\ignorespaces}%
+\def\ptriangle{\ifnextchar({\ptrianglep}{\ptrianglep(0,0)}}%
+\def\ptrianglep(#1){\ifnextchar|{\ptrianglepp(#1)}{\ptrianglepp(#1)|alr|}}%
+\def\ptrianglepp(#1)|#2|{\ifnextchar/{\ptriangleppp(#1)|#2|}%
+ {\ptriangleppp(#1)|#2|/>`>`>/}}%
+\def\ptriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\ptrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\ptrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\qtriangle{\ifnextchar({\qtrianglep}{\qtrianglep(0,0)}}%
+\def\qtrianglep(#1){\ifnextchar|{\qtrianglepp(#1)}{\qtrianglepp(#1)|alr|}}%
+\def\qtrianglepp(#1)|#2|{\ifnextchar/{\qtriangleppp(#1)|#2|}%
+ {\qtriangleppp(#1)|#2|/>`>`>/}}%
+\def\qtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\qtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\qtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\dtriangle{\ifnextchar({\dtrianglep}{\dtrianglep(0,0)}}%
+\def\dtrianglep(#1){\ifnextchar|{\dtrianglepp(#1)}{\dtrianglepp(#1)|lrb|}}%
+\def\dtrianglepp(#1)|#2|{\ifnextchar/{\dtriangleppp(#1)|#2|}%
+ {\dtriangleppp(#1)|#2|/>`>`>/}}%
+\def\dtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\dtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\dtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\btriangle{\ifnextchar({\btrianglep}{\btrianglep(0,0)}}%
+\def\btrianglep(#1){\ifnextchar|{\btrianglepp(#1)}{\btrianglepp(#1)|lrb|}}%
+\def\btrianglepp(#1)|#2|{\ifnextchar/{\btriangleppp(#1)|#2|}%
+ {\btriangleppp(#1)|#2|/>`>`>/}}%
+\def\btriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\btrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\btrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\Atriangle{\ifnextchar({\Atrianglep}{\Atrianglep(0,0)}}%
+\def\Atrianglep(#1){\ifnextchar|{\Atrianglepp(#1)}{\Atrianglepp(#1)|lrb|}}%
+\def\Atrianglepp(#1)|#2|{\ifnextchar/{\Atriangleppp(#1)|#2|}%
+ {\Atriangleppp(#1)|#2|/>`>`>/}}%
+\def\Atriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Atrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Atrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\Vtriangle{\ifnextchar({\Vtrianglep}{\Vtrianglep(0,0)}}%
+\def\Vtrianglep(#1){\ifnextchar|{\Vtrianglepp(#1)}{\Vtrianglepp(#1)|alb|}}%
+\def\Vtrianglepp(#1)|#2|{\ifnextchar/{\Vtriangleppp(#1)|#2|}%
+ {\Vtriangleppp(#1)|#2|/>`>`>/}}%
+\def\Vtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Vtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Vtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\Ctriangle{\ifnextchar({\Ctrianglep}{\Ctrianglep(0,0)}}%
+\def\Ctrianglep(#1){\ifnextchar|{\Ctrianglepp(#1)}{\Ctrianglepp(#1)|arb|}}%
+\def\Ctrianglepp(#1)|#2|{\ifnextchar/{\Ctriangleppp(#1)|#2|}%
+ {\Ctriangleppp(#1)|#2|/>`>`>/}}%
+\def\Ctriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Ctrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Ctrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\Dtriangle{\ifnextchar({\Dtrianglep}{\Dtrianglep(0,0)}}%
+\def\Dtrianglep(#1){\ifnextchar|{\Dtrianglepp(#1)}{\Dtrianglepp(#1)|lab|}}%
+\def\Dtrianglepp(#1)|#2|{\ifnextchar/{\Dtriangleppp(#1)|#2|}%
+ {\Dtriangleppp(#1)|#2|/>`>`>/}}%
+\def\Dtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Dtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Dtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+\def\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<\deltax,0>[\nodeb`\nodec;\labeld]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<\deltax,0>[\nodec`\noded;\labele]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,-\deltay>[\nodea`\noded;\labelc]%
+\ignorespaces}%
+\def\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,-\deltay>[\nodea`\noded;\labelc]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<\deltax,0>[\nodeb`\nodec;\labelb]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<0,-\deltay>[\nodeb`\noded;\labeld]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labele]%
+\ignorespaces}%
+\def\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<0,-\deltay>[\nodec`\noded;\labele]%
+\advance\xpos by -\deltax%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<\deltax,-\deltay>[\nodeb`\noded;\labeld]%
+\advance\ypos by \deltay%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+\def\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<0,-\deltay>[\nodeb`\noded;\labeld]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<0,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\advance\ypos by -\deltay%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labele]%
+\ignorespaces}%
+\def\Atrianglepair{\ifnextchar({\Atrianglepairp}{\Atrianglepairp(0,0)}}%
+\def\Atrianglepairp(#1){\ifnextchar|{\Atrianglepairpp(#1)}%
+{\Atrianglepairpp(#1)|lmrbb|}}%
+\def\Atrianglepairpp(#1)|#2|{\ifnextchar/{\Atrianglepairppp(#1)|#2|}%
+ {\Atrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Atrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+\def\Vtrianglepair{\ifnextchar({\Vtrianglepairp}{\Vtrianglepairp(0,0)}}%
+\def\Vtrianglepairp(#1){\ifnextchar|{\Vtrianglepairpp(#1)}%
+{\Vtrianglepairpp(#1)|aalmr|}}%
+\def\Vtrianglepairpp(#1)|#2|{\ifnextchar/{\Vtrianglepairppp(#1)|#2|}%
+ {\Vtrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Vtrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+\def\Ctrianglepair{\ifnextchar({\Ctrianglepairp}{\Ctrianglepairp(0,0)}}%
+\def\Ctrianglepairp(#1){\ifnextchar|{\Ctrianglepairpp(#1)}%
+{\Ctrianglepairpp(#1)|lrmlr|}}%
+\def\Ctrianglepairpp(#1)|#2|{\ifnextchar/{\Ctrianglepairppp(#1)|#2|}%
+ {\Ctrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Ctrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+\def\Dtrianglepair{\ifnextchar({\Dtrianglepairp}{\Dtrianglepairp(0,0)}}%
+\def\Dtrianglepairp(#1){\ifnextchar|{\Dtrianglepairpp(#1)}%
+{\Dtrianglepairpp(#1)|lrmlr|}}%
+\def\Dtrianglepairpp(#1)|#2|{\ifnextchar/{\Dtrianglepairppp(#1)|#2|}%
+ {\Dtrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Dtrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+\def\pplace[#1](#2,#3)[#4]{\POS(#2,#3)*+!!<0ex,\axis>!#1{#4}\ignorespaces}%
+\def\cplace(#1,#2)[#3]{\POS(#1,#2)*+!!<0ex,\axis>{#3}\ignorespaces}%
+\def\place{\ifnextchar[{\pplace}{\cplace}}%
+\def\pullback#1]#2]{\square#1]\trident#2]\ignorespaces}%
+\def\tridentppp|#1#2#3|/#4`#5`#6/<#7,#8>[#9]{%
+\def\next[##1;##2`##3`##4]{\def\nodee{##1}\def\labele{##2}%
+ \def\labelf{##3}\def\labelg{##4}}%
+\next[#9]%
+\advance \xpos by -\deltax%
+\advance \xpos by -#7\advance \ypos by #8%
+\advance\deltax by #7%
+\morphism(\xpos,\ypos)|#1|/{#4}/<\deltax,-#8>[\nodee`\nodeb;\labele]%
+\advance\deltax by -#7%
+\morphism(\xpos,\ypos)|#2|/{#5}/<#7,-#8>[\nodee`\nodea;\labelf]%
+\advance\deltay by #8%
+\morphism(\xpos,\ypos)|#3|/{#6}/<#7,-\deltay>[\nodee`\nodec;\labelg]%
+\ignorespaces}%
+\def\trident{\ifnextchar|{\tridentp}{\tridentp|amb|}}%
+\def\tridentp|#1|{\ifnextchar/{\tridentpp|#1|}{\tridentpp|#1|/{>}`{>}`{>}/}}%
+\def\tridentpp|#1|/#2/{\ifnextchar<{\tridentppp|#1|/#2/}%
+ {\tridentppp|#1|/#2/<500,500>}}%
+\def\setmorphismwidth#1#2#3#4{%
+ \setbox0=\hbox{$#1{\labelstyle#3#3}#2$}#4=\wd0%
+ \divide #4 by 2 \divide #4 by \ul%
+ \advance #4 by 350 \ratchet{#4}{500}}%
+\def\setSquarewidth[#1`#2`#3`#4;#5`#6`#7`#8]{%
+ \setmorphismwidth{#1}{#2}{#5}{\topw}%
+ \setmorphismwidth{#3}{#4}{#8}{\botw}%
+\ratchet{\topw}{\botw}}%
+\def\Squarepppp(#1)|#2|/#3/<#4>[#5]{%
+ \setSquarewidth[#5]%
+ \squarepppp(#1)|#2|/#3/<\topw,#4>[#5]%
+\ignorespaces}%
+\def\Square{\ifnextchar({\Squarep}{\Squarep(0,0)}}%
+\def\Squarep(#1){\ifnextchar|{\Squarepp(#1)}{\Squarepp(#1)|alrb|}}%
+\def\Squarepp(#1)|#2|{\ifnextchar/{\Squareppp(#1)|#2|}%
+ {\Squareppp(#1)|#2|/>`>`>`>/}}%
+\def\Squareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\Squarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\Squarepppp(#1)|#2|/#3`#4`#5`#6/<\default>}}%
+\def\hsquarespppp(#1,#2)|#3|/#4/<#5>[#6;#7]{%
+\Xpos=#1\Ypos=#2%
+\def\next|##1##2##3##4##5##6##7|{%
+ \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
+ \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
+\next|#3|%
+\def\next<##1,##2,##3>{\deltaX=##1\deltaXprime=##2\deltaY=##3}%
+\next<#5>%
+\def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
+ \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
+\next[#6]%
+\def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
+ \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
+\next[#7]%
+\dohsquares/#4/}%
+\def\dohsquares/#1`#2`#3`#4`#5`#6`#7/{%
+\squarepppp(\Xpos,\Ypos)|\Xa\Xc\Xd\Xf|/#1`#3`#4`#6/<\deltaX,\deltaY>%
+ [\Nodea`\Nodeb`\Noded`\Nodee;\Labela`\Labelc`\Labeld`\Labelf]%
+ \advance \Xpos by \deltaX%
+\squarepppp(\Xpos,\Ypos)|\Xb\Xd\Xe\Xg|/#2``#5`#7/<\deltaXprime,\deltaY>%
+[\Nodeb`\Nodec`\Nodee`\Nodef;\Labelb``\Labele`\Labelg]%
+\ignorespaces}%
+\def\hsquares{\ifnextchar({\hsquaresp}{\hsquaresp(0,0)}}%
+\def\hsquaresp(#1){\ifnextchar|{\hsquarespp(#1)}{\hsquarespp%
+(#1)|aalmrbb|}}%
+\def\hsquarespp(#1)|#2|{\ifnextchar/{\hsquaresppp(#1)|#2|}%
+ {\hsquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\hsquaresppp(#1)|#2|/#3/{%
+ \ifnextchar<{\hsquarespppp(#1)|#2|/#3/}%
+ {\hsquarespppp(#1)|#2|/#3/<\default,\default,\default>}}%
+\def\hSquarespppp(#1,#2)|#3|/#4/<#5>[#6;#7]{%
+\Xpos=#1\Ypos=#2%
+\def\next|##1##2##3##4##5##6##7|{%
+ \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
+ \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
+\next|#3|%
+\deltaY=#5%
+\def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
+ \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
+\next[#6]%
+\def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
+ \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
+\next[#7]%
+\dohSquares/#4/}%
+\def\dohSquares/#1`#2`#3`#4`#5`#6`#7/{%
+\Squarepppp(\Xpos,\Ypos)|\Xa\Xc\Xd\Xf|/#1`#3`#4`#6/<\deltaY>%
+ [\Nodea`\Nodeb`\Noded`\Nodee;\Labela`\Labelc`\Labeld`\Labelf]%
+ \advance \Xpos by \topw%
+\Squarepppp(\Xpos,\Ypos)|\Xb\Xd\Xe\Xg|/#2``#5`#7/<\deltaY>%
+[\Nodeb`\Nodec`\Nodee`\Nodef;\Labelb``\Labele`\Labelg]%
+\ignorespaces}%
+\def\hSquares{\ifnextchar({\hSquaresp}{\hSquaresp(0,0)}}%
+\def\hSquaresp(#1){\ifnextchar|{\hSquarespp(#1)}{\hSquarespp%
+(#1)|aalmrbb|}}%
+\def\hSquarespp(#1)|#2|{\ifnextchar/{\hSquaresppp(#1)|#2|}%
+ {\hSquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\hSquaresppp(#1)|#2|/#3/{%
+ \ifnextchar<{\hSquarespppp(#1)|#2|/#3/}%
+ {\hSquarespppp(#1)|#2|/#3/<\default>}}%
+\def\vsquarespppp(#1,#2)|#3|/#4/<#5>[#6;#7]{%
+\Xpos=#1\Ypos=#2%
+\def\next|##1##2##3##4##5##6##7|{%
+ \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
+ \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
+\next|#3|%
+\def\next<##1,##2,##3>{\deltaX=##1\deltaY=##2\deltaYprime=##3}%
+\next<#5>%
+\def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
+ \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
+\next[#6]%
+\def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
+ \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
+\next[#7]%
+\dovsquares/#4/}%
+\def\dovsquares/#1`#2`#3`#4`#5`#6`#7/{%
+\squarepppp(\Xpos,\Ypos)|\Xd\Xe\Xf\Xg|/`#5`#6`#7/<\deltaX,\deltaYprime>%
+[\Nodec`\Noded`\Nodee`\Nodef;`\Labele`\Labelf`\Labelg]%
+ \advance\Ypos by \deltaYprime%
+\squarepppp(\Xpos,\Ypos)|\Xa\Xb\Xc\Xd|/#1`#2`#3`#4/<\deltaX,\deltaY>%
+ [\Nodea`\Nodeb`\Nodec`\Noded;\Labela`\Labelb`\Labelc`\Labeld]%
+\ignorespaces}%
+\def\vsquares{\ifnextchar({\vsquaresp}{\vsquaresp(0,0)}}%
+\def\vsquaresp(#1){\ifnextchar|{\vsquarespp(#1)}{\vsquarespp%
+(#1)|aalmrbb|}}%
+\def\vsquarespp(#1)|#2|{\ifnextchar/{\vsquaresppp(#1)|#2|}%
+ {\vsquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\vsquaresppp(#1)|#2|/#3/{%
+ \ifnextchar<{\vsquarespppp(#1)|#2|/#3/}%
+ {\vsquarespppp(#1)|#2|/#3/<\default,\default,\default>}}%
+\def\vSquarespppp(#1,#2)|#3|/#4/<#5,#6>[#7;#8]{%
+\Xpos=#1\Ypos=#2%
+\def\next|##1##2##3##4##5##6##7|{%
+ \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
+ \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
+\next|#3|%
+\deltaX=#5%
+\deltaY=#6%
+\def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
+ \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
+\next[#7]%
+\def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
+ \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
+\next[#8]%
+\dovSquares/#4/\ignorespaces}%
+\def\dovSquares/#1`#2`#3`#4`#5`#6`#7/{%
+\setmorphismwidth{\Nodea}{\Nodeb}{\Labela}{\topw}%
+\setmorphismwidth{\Nodec}{\Noded}{\Labeld}{\botw}%
+\ratchet{\topw}{\botw}%
+\setmorphismwidth{\Nodee}{\Nodef}{\Labelg}{\botw}%
+\ratchet{\topw}{\botw}%
+\square(\Xpos,\Ypos)|\Xd\Xe\Xf\Xg|/`#5`#6`#7/<\topw,\deltaY>%
+ [\Nodec`\Noded`\Nodee`\Nodef;`\Labele`\Labelf`\Labelg]%
+\advance \Ypos by \deltaY%
+\square(\Xpos,\Ypos)|\Xa\Xb\Xc\Xd|/#1`#2`#3`#4/<\topw,\deltaX>%
+ [\Nodea`\Nodeb`\Nodec`\Noded;\Labela`\Labelb`\Labelc`\Labeld]%
+}%
+\def\vSquares{\ifnextchar({\vSquaresp}{\vSquaresp(0,0)}}%
+\def\vSquaresp(#1){\ifnextchar|{\vSquarespp(#1)}{\vSquarespp%
+(#1)|alrmlrb|}}%
+\def\vSquarespp(#1)|#2|{\ifnextchar/{\vSquaresppp(#1)|#2|}%
+ {\vSquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\vSquaresppp(#1)|#2|/#3/{%
+ \ifnextchar<{\vSquarespppp(#1)|#2|/#3/}%
+ {\vSquarespppp(#1)|#2|/#3/<\default,\default>}}%
+\def\osquarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]{\squarepppp%
+ (#1)|#2|/#3`#4`#5`#6/<#7>[#8]%
+ \let\Nodea\nodea\let\Nodeb\nodeb%
+\let\Nodec\nodec\let\Noded\noded\Xpos=\xpos\Ypos=\ypos%
+\deltaX=\deltax \deltaY=\deltay \isquare}%
+\def\cube{\ifnextchar({\osquarep}{\osquarep(0,0)}}%
+\def\osquarep(#1){\ifnextchar|{\osquarepp(#1)}{\osquarepp(#1)|alrb|}}%
+\def\osquarepp(#1)|#2|{\ifnextchar/{\osquareppp(#1)|#2|}%
+ {\osquareppp(#1)|#2|/>`>`>`>/}}%
+\def\osquareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\osquarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\osquarepppp(#1)|#2|/#3`#4`#5`#6/<1500,1500>}}%
+\def\isquarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]{%
+ \squarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]%
+\ifnextchar|{\cubep}{\cubep|mmmm|}}%
+\def\cubep|#1|{\ifnextchar/{\cubepp|#1|}{\cubepp|#1|/>`>`>`>/}}%
+\def\isquare{\ifnextchar({\isquarep}{\isquarep(\default,\default)}}%
+\def\isquarep(#1){\ifnextchar|{\isquarepp(#1)}{\isquarepp(#1)|alrb|}}%
+\def\isquarepp(#1)|#2|{\ifnextchar/{\isquareppp(#1)|#2|}%
+ {\isquareppp(#1)|#2|/>`>`>`>/}}%
+\def\isquareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\isquarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\isquarepppp(#1)|#2|/#3`#4`#5`#6/<500,500>}}%
+\def\cubepp|#1#2#3#4|/#5`#6`#7`#8/[#9]{%
+\def\next[##1`##2`##3`##4]{\gdef\Labela{##1}%
+\gdef\Labelb{##2}\gdef\Labelc{##3}\gdef\Labeld{##4}}\next[#9]%
+\xend\xpos \yend\ypos%
+\Xend\xend\advance\Xend by -\Xpos%
+\Yend\yend\advance\Yend by -\Ypos%
+\domorphism(\Xpos,\Ypos)|#2|/#6/<\Xend,\Yend>[\Nodeb`\nodeb;\Labelb]%
+\advance\Xpos by-\deltaX%
+\advance\xend by-\deltax%
+\Xend\xend\advance\Xend by -\Xpos%
+\domorphism(\Xpos,\Ypos)|#1|/#5/<\Xend,\Yend>[\Nodea`\nodea;\Labela]%
+\advance\Ypos by-\deltaY%
+\advance\yend by-\deltay%
+\Yend\yend\advance\Yend by -\Ypos%
+\domorphism(\Xpos,\Ypos)|#3|/#7/<\Xend,\Yend>[\Nodec`\nodec;\Labelc]%
+\advance\Xpos by\deltaX%
+\advance\xend by\deltax%
+\Xend\xend\advance\Xend by -\Xpos%
+\domorphism(\Xpos,\Ypos)|#4|/#8/<\Xend,\Yend>[\Noded`\noded;\Labeld]%
+\ignorespaces}%
+\def\setwdth#1#2{\setbox0\hbox{$\labelstyle#1$}\wdth=\wd0%
+\setbox0\hbox{$\labelstyle#2$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi}%
+\def\topppp/#1/<#2>^#3_#4{\:%
+\ifnum#2=0%
+ \setwdth{#3}{#4}\deltax=\wdth \divide \deltax by \ul%
+ \advance \deltax by \defaultmargin \ratchet{\deltax}{100}%
+\else \deltax #2%
+\fi%
+\xy\ar@{#1}^{#3}_{#4}(\deltax,0) \endxy%
+\:}%
+\def\toppp/#1/<#2>^#3{\ifnextchar_{\topppp/#1/<#2>^{#3}}{\topppp/#1/<#2>^{#3}_{}}}%
+\def\topp/#1/<#2>{\ifnextchar^{\toppp/#1/<#2>}{\toppp/#1/<#2>^{}}}%
+\def\toop/#1/{\ifnextchar<{\topp/#1/}{\topp/#1/<0>}}%
+\def\to{\ifnextchar/{\toop}{\toop/>/}}%
+\def\mon{\to/ >->/}%
+\def\epi{\to/->>/}%
+\def\toleft{\to/<-/}%
+\def\monleft{\to/<-< /}%
+\def\epileft{\to/<<-/}%
+\def\rlimto{{%
+\font\xyatipfont=xyatip10 scaled 800
+\font\xybtipfont=xybtip10 scaled 800
+\raise 2pt\hbox{\,\xy\ar@{->}(100,0) \endxy}\,}}
+\def\llimto{{%
+\font\xyatipfont=xyatip10 scaled 800
+\font\xybtipfont=xybtip10 scaled 800
+\raise 2pt\hbox{\,\xy\ar@{<-}(100,0) \endxy}\,}}
+\def\twopppp/#1`#2/<#3>^#4_#5{\:%
+\ifnum0=#3%
+ \setwdth{#4}{#5}\deltax=\wdth \divide \deltax by \ul \advance \deltax%
+ by \defaultmargin \ratchet{\deltax}{200}%
+\else \deltax#3 \fi%
+\xy\ar@{#1}@<2.5pt>^{#4}(\deltax,0)%
+\ar@{#2}@<-2.5pt>_{#5}(\deltax,0)\endxy\:}%
+\def\twoppp/#1`#2/<#3>^#4{\ifnextchar_{\twopppp/#1`#2/<#3>^{#4}}%
+ {\twopppp/#1`#2/<#3>^{#4}_{}}}%
+\def\twopp/#1`#2/<#3>{\ifnextchar^{\twoppp/#1`#2/<#3>}{\twoppp/#1`#2/<#3>^{}}}%
+\def\twop/#1`#2/{\ifnextchar<{\twopp/#1`#2/}{\twopp/#1`#2/<0>}}%
+\def\two{\ifnextchar/{\twop}{\twop/>`>/}}%
+\def\twoleft{\two/<-`<-/}%
+\def\threeppppp/#1`#2`#3/<#4>^#5|#6_#7{\:%
+\ifnum0=#4%
+\setbox0\hbox{$\labelstyle#5$}\wdth=\wd0%
+\setbox0\hbox{$\labelstyle#6$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi%
+\setbox0\hbox{$\labelstyle#7$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi%
+\deltax=\wdth \divide \deltax by \ul \advance \deltax by%
+\defaultmargin \ratchet{\deltax}{300}%
+\else\deltax#4 \fi%
+ \xy \ifnum\wd0=0 \ar@{#2}(\deltax,0)%
+ \else \ar@{#2}|{#6}(\deltax,0)\fi%
+\ar@{#1}@<4.5pt>^{#5}(\deltax,0)%
+\ar@{#3}@<-4.5pt>_{#7}(\deltax,0)\endxy\:}%
+\def\threepppp/#1`#2`#3/<#4>^#5|#6{\ifnextchar_{\threeppppp%
+ /#1`#2`#3/<#4>^{#5}|{#6}}{\threeppppp/#1`#2`#3/<#4>^{#5}|{#6}_{}}}%
+\def\threeppp/#1`#2`#3/<#4>^#5{\ifnextchar|{\threepppp%
+ /#1`#2`#3/<#4>^{#5}}{\threepppp/#1`#2`#3/<#4>^{#5}|{}}}%
+\def\threepp/#1`#2`#3/<#4>{\ifnextchar^{\threeppp/#1`#2`#3/<#4>}%
+ {\threeppp/#1`#2`#3/<#4>^{}}}%
+\def\threep/#1`#2`#3/{\ifnextchar<{\threepp/#1`#2`#3/}%
+ {\threepp/#1`#2`#3/<0>}}%
+\def\three{\ifnextchar/{\threep}{\threep/>`>`>/}}%
+\def\twoar(#1,#2){{%
+ \scalefactor{0.1}%
+ \deltax#1\deltay#2%
+ \deltaX=\ifnum\deltax<0-\fi\deltax%
+ \deltaY=\ifnum\deltay<0-\fi\deltay%
+ \Xend\deltax \multiply \Xend by \deltax%
+ \Yend\deltay \multiply \Yend by \deltay%
+ \advance\Xend by \Yend \multiply \Xend by 3%
+ \ifnum \deltaX > \deltaY%
+ \multiply \deltaX by 3 \advance \deltaX by \deltaY%
+ \else%
+ \multiply \deltaY by 3 \advance \deltaX by \deltaY%
+ \fi%
+ \multiply\deltax by 500%
+ \multiply\deltay by 500%
+ \xpos\deltax \multiply \xpos by 3 \divide\xpos by \deltaX%
+ \Xpos\deltax \multiply \Xpos by \deltaX \divide \Xpos by \Xend%
+ \advance \xpos by \Xpos%
+ \ypos\deltay \multiply \ypos by 3 \divide\ypos by \deltaX%
+ \Ypos\deltay \multiply \Ypos by \deltaX \divide \Ypos by \Xend%
+ \advance \ypos by \Ypos%
+ \xy \ar@{=>}(\xpos,\ypos) \endxy%
+}\ignorespaces}%
+\def\iiixiiipppppp(#1,#2)|#3|/#4/<#5>#6<#7>[#8;#9]{%
+ \xpos#1\ypos#2\relax%
+ \def\next|##1##2##3##4##5##6##7|{\def\xa{##1}\def\xb{##2}%
+ \def\xc{##3}\def\xd{##4}\def\xe{##5}\def\xf{##6}\nextt|##7|}%
+ \def\nextt|##1##2##3##4##5##6|{\def\xg{##1}\def\xh{##2}%
+ \def\xi{##3}\def\xj{##4}\def\xk{##5}\def\xl{##6}}%
+ \next|#3|%
+ \def\next<##1,##2>{\deltax##1\deltay##2}%
+ \next<#5>%
+ \def\next<##1,##2>{\deltaX##1\deltaY##2}%
+ \next<#7>%
+ \def\next##1{\topw##1\relax%
+ \ifodd\topw \def\za{}\else\def\za{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zb{}\else\def\zb{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zc{}\else\def\zc{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zd{}\else\def\zd{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\ze{}\else\def\ze{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zf{}\else\def\zf{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zg{}\else\def\zg{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zh{}\else\def\zh{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zi{}\else\def\zi{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zj{}\else\def\zj{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zk{}\else\def\zk{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zl{}\else\def\zl{\relax}\fi}%
+ \next{#6}%
+ \def\next[##1`##2`##3`##4`##5`##6`##7`##8`##9]{%
+ \def\nodeA{##1}\def\nodeB{##2}\def\nodeC{##3}%
+ \def\nodeD{##4}\def\nodeE{##5}\def\nodeF{##6}%
+ \def\nodeG{##7}\def\nodeH{##8}\def\nodeI{##9}}%
+ \next[#8]%
+ \def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\labela{##1}\def\labelb{##2}\def\labelc{##3}%
+ \def\labeld{##4}\def\labele{##5}\def\labelf{##6}\nextt[##7]}%
+ \def\nextt[##1`##2`##3`##4`##5`##6]{%
+ \def\labelg{##1}\def\labelh{##2}\def\labeli{##3}%
+ \def\labelj{##4}\def\labelk{##5}\def\labell{##6}}%
+ \next[#9]%
+ \def\next/##1`##2`##3`##4`##5`##6`##7`##8/{%
+ \advance\ypos\deltay
+ \ifx\zf\empty \morphism(\xpos,\ypos)/<-/<-\deltaX,0>[\nodeD`0;]\fi
+ \morphism(\xpos,\ypos)|\xf|/{##6}/<\deltax,0>[\nodeD`\nodeE;\labelf]%
+ \advance \xpos\deltax
+ \morphism(\xpos,\ypos)|\xg|/{##7}/<\deltax,0>[\nodeE`\nodeF;\labelg]%
+ \ifx\zg\empty \advance\xpos \deltax
+ \morphism(\xpos,\ypos)<\deltaX,0>[\nodeF`0;]\fi
+ \xpos#1 \advance\ypos\deltay
+ \ifx\zd\empty \morphism(\xpos,\ypos)/<-/<-\deltaX,0>[\nodeA`0;]\fi
+ \ifx\za\empty \morphism(\xpos,\ypos)/<-/<0,\deltaY>[\nodeA`0;]\fi
+ \morphism(\xpos,\ypos)|\xa|/{##1}/<\deltax,0>[\nodeA`\nodeB;\labela]%
+ \morphism(\xpos,\ypos)|\xc|/{##3}/<0,-\deltay>[\nodeA`\nodeD;\labelc]%
+ \advance \xpos\deltax
+ \morphism(\xpos,\ypos)|\xb|/{##2}/<\deltax,0>[\nodeB`\nodeC;\labelb]%
+ \morphism(\xpos,\ypos)|\xd|/{##4}/<0,-\deltay>[\nodeB`\nodeE;\labeld]%
+ \ifx\zb\empty \morphism(\xpos,\ypos)/<-/<0,\deltaY>[\nodeB`0;]\fi
+ \advance\xpos\deltax
+ \morphism(\xpos,\ypos)|\xe|/{##5}/<0,-\deltay>[\nodeC`\nodeF;\labele]%
+ \ifx\zc\empty \morphism(\xpos,\ypos)/<-/<0,\deltaY>[\nodeC`0;]\fi
+ \ifx\ze\empty \morphism(\xpos,\ypos)<\deltaX,0>[\nodeC`0;]\fi
+ \nextt/##8/}%
+ \def\nextt/##1`##2`##3`##4`##5/{%
+ \xpos#1\ypos#2\relax%
+ \ifx\zh\empty \morphism(\xpos,\ypos)/<-/<-\deltaX,0>[\nodeG`0;]\fi
+ \ifx\zj\empty \morphism(\xpos,\ypos)<0,-\deltaY>[\nodeG`0;]\fi
+ \morphism(\xpos,\ypos)|\xk|/{##4}/<\deltax,0>[\nodeG`\nodeH;\labelk]%
+ \advance\xpos\deltax
+ \morphism(\xpos,\ypos)|\xl|/{##5}/<\deltax,0>[\nodeH`\nodeI;\labell]%
+ \ifx\zk\empty \morphism(\xpos,\ypos)<0,-\deltaY>[\nodeH`0;]\fi
+ \advance\xpos\deltax
+ \ifx\zi\empty \morphism(\xpos,\ypos)<\deltaX,0>[\nodeI`0;]\fi
+ \ifx\zl\empty \morphism(\xpos,\ypos)<0,-\deltaY>[\nodeI`0;]\fi
+ \xpos#1 \advance\ypos\deltay
+ \morphism(\xpos,\ypos)|\xh|/{##1}/<0,-\deltay>[\nodeD`\nodeG;\labelh]%
+ \advance \xpos\deltax
+ \morphism(\xpos,\ypos)|\xi|/{##2}/<0,-\deltay>[\nodeE`\nodeH;\labeli]%
+ \advance \xpos\deltax
+ \morphism(\xpos,\ypos)|\xj|/{##3}/<0,-\deltay>[\nodeF`\nodeI;\labelj]}%
+ \next/#4/\ignorespaces}%
+\def\iiixiii{\ifnextchar({\iiixiiip}{\iiixiiip(0,0)}}%
+\def\iiixiiip(#1){\ifnextchar|{\iiixiiipp(#1)}%
+ {\iiixiiipp(#1)|aalmrmmlmrbb|}}%
+\def\iiixiiipp(#1)|#2|{\ifnextchar/{\iiixiiippp(#1)|#2|}%
+ {\iiixiiippp(#1)|#2|/>`>`>`>`>`>`>`>`>`>`>`>/}}%
+\def\iiixiiippp(#1)|#2|/#3/{%
+ \ifnextchar<{\iiixiiipppp(#1)|#2|/#3/}%
+ {\iiixiiipppp(#1)|#2|/#3/<\default,\default>}}%
+\def\iiixiiipppp(#1)|#2|/#3/<#4>{\ifnextchar[{\iiixiiippppp(#1)|#2|/#3/%
+ <#4>0<0,0>}{\iiixiiippppp(#1)|#2|/#3/<#4>}}%
+\def\iiixiiippppp(#1)|#2|/#3/<#4>#5{\ifnextchar<%
+ {\iiixiiipppppp(#1)|#2|/#3/<#4>{#5}}%
+ {\iiixiiipppppp(#1)|#2|/#3/<#4>{#5}<400,400>}}%
+\def\iiixiipppppp(#1,#2)|#3|/#4/<#5>#6<#7>[#8;#9]{%
+ \xpos#1\ypos#2\relax%
+ \def\next|##1##2##3##4##5##6##7|{\def\xa{##1}\def\xb{##2}%
+ \def\xc{##3}\def\xd{##4}\def\xe{##5}\def\xf{##6}\def\xg{##7}}%
+ \next|#3|%
+ \def\next<##1,##2>{\deltax##1\deltay##2}%
+ \next<#5>%
+ \deltaX#7
+ \topw#6
+ \def\next{%
+ \ifodd\topw \def\za{}\else\def\za{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zb{}\else\def\zb{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zc{}\else\def\zc{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zd{}\else\def\zd{\relax}\fi}%
+ \next%
+ \def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\noded{##4}\def\nodee{##5}\def\nodef{##6}}%
+ \next[#8]%
+ \def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\labela{##1}\def\labelb{##2}\def\labelc{##3}%
+ \def\labeld{##4}\def\labele{##5}\def\labelf{##6}\def\labelg{##7}}%
+ \next[#9]%
+ \def\next/##1`##2`##3`##4`##5`##6`##7/{%
+ {\ifx\zc\empty\advance\xpos -\deltaX
+\relax\morphism(\xpos,\ypos)<\deltaX,0>[0`\noded;]\fi}%
+ \morphism(\xpos,\ypos)|\xf|/##6/<\deltax,0>[\noded`\nodee;\labelf]%
+ \advance\xpos by \deltax%
+ \morphism(\xpos,\ypos)|\xg|/##7/<\deltax,0>[\nodee`\nodef;\labelg]%
+ {\ifx\zd\empty \advance\xpos by \deltax
+\relax \morphism(\xpos,\ypos)<\deltaX,0>[\nodef`0;]\fi}%
+ \advance\xpos by -\deltax \advance\ypos by \deltay
+ {\ifx\za\empty\advance \xpos by -\deltaX
+\relax\morphism(\xpos,\ypos)<\deltaX,0>[0`\nodea;]\fi}%
+ \morphism(\xpos,\ypos)|\xa|/##1/<\deltax,0>[\nodea`\nodeb;\labela]%
+ \morphism(\xpos,\ypos)|\xc|/##3/<0,-\deltay>[\nodea`\noded;\labelc]%
+ \advance\xpos by \deltax%
+ \morphism(\xpos,\ypos)|\xb|/##2/<\deltax,0>[\nodeb`\nodec;\labelb]%
+ \morphism(\xpos,\ypos)|\xd|/##4/<0,-\deltay>[\nodeb`\nodee;\labeld]%
+ \advance\xpos by \deltax%
+ \morphism(\xpos,\ypos)|\xe|/##5/<0,-\deltay>[\nodec`\nodef;\labele]%
+ \ifx\zb\empty\relax \morphism(\xpos,\ypos)<\deltaX,0>[\nodec`0;]\fi}%
+ \next/#4/\ignorespaces}%
+\def\iiixii{\ifnextchar({\iiixiip}{\iiixiip(0,0)}}%
+\def\iiixiip(#1){\ifnextchar|{\iiixiipp(#1)}%
+ {\iiixiipp(#1)|aalmrbb|}}%
+\def\iiixiipp(#1)|#2|{\ifnextchar/{\iiixiippp(#1)|#2|}%
+ {\iiixiippp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\iiixiippp(#1)|#2|/#3/{%
+ \ifnextchar<{\iiixiipppp(#1)|#2|/#3/}%
+ {\iiixiipppp(#1)|#2|/#3/<\default,\default>}}%
+\def\iiixiipppp(#1)|#2|/#3/<#4>{\ifnextchar[{\iiixiippppp(#1)|#2|/#3/%
+ <#4>{0}<0>}{\iiixiippppp(#1)|#2|/#3/<#4>}}%
+\def\iiixiippppp(#1)|#2|/#3/<#4>#5{\ifnextchar<%
+ {\iiixiipppppp(#1)|#2|/#3/<#4>{#5}}%
+ {\iiixiipppppp(#1)|#2|/#3/<#4>{#5}<400>}}%
+\def\node#1(#2,#3)[#4]{%
+\expandafter\gdef\csname x@#1\endcsname{#2}%
+\expandafter\gdef\csname y@#1\endcsname{#3}%
+\expandafter\gdef\csname ob@#1\endcsname{#4}%
+\ignorespaces}%
+\newcount\xfinish%
+\newcount\yfinish%
+\def\arrow{\ifnextchar|{\arrowp}{\arrowp|a|}}%
+\def\arrowp|#1|{\ifnextchar/{\arrowpp|#1|}{\arrowpp|#1|/>/}}%
+\def\arrowpp|#1|/#2/[#3`#4;#5]{%
+\xfinish=\csname x@#4\endcsname%
+\yfinish=\csname y@#4\endcsname%
+\advance\xfinish by -\csname x@#3\endcsname%
+\advance\yfinish by -\csname y@#3\endcsname%
+\morphism(\csname x@#3\endcsname,\csname y@#3\endcsname)|#1|/{#2}/%
+<\xfinish,\yfinish>[\csname ob@#3\endcsname`\csname ob@#4\endcsname;#5]%
+}%
+\def\Loop(#1,#2)#3(#4,#5){\POS(#1,#2)*+!!<0ex,\axis>{#3}\ar@(#4,#5)}%
+\def\iloop#1(#2,#3){\xy\Loop(0,0)#1(#2,#3)\endxy}%
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xycmactex.tex b/macros/generic/diagrams/xypic/texinputs/xycmactex.tex
new file mode 100644
index 0000000000..78e5fe6f8a
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xycmactex.tex
@@ -0,0 +1,28 @@
+%% xycmactex.tex from $Id: xycmactex.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``CMacTeX'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{cmactex}{CMacTeX driver}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xyrequire{dvips}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xycmtip.tex b/macros/generic/diagrams/xypic/texinputs/xycmtip.tex
new file mode 100644
index 0000000000..ac0a223d3c
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xycmtip.tex
@@ -0,0 +1,29 @@
+%% xycmtip.tex from $Id: xycmtip.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Computer Modern tips'' extension.
+%% Copyright (c) 1992-1996 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{cmtip}{Computer Modern tip extension}{\stripRCS$Revision: 3.7 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xyrequire{tips}\xycatcodes
+\xydef@\UseComputerModernTips{\SelectTips{cm}{10}\UseTips}
+\xydef@\NoComputerModernTips{\NoTips}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xycolor.tex b/macros/generic/diagrams/xypic/texinputs/xycolor.tex
new file mode 100644
index 0000000000..d4a6574218
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xycolor.tex
@@ -0,0 +1,112 @@
+%% xycolor.tex from $Id: xycolor.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Colour extension'' option.
+%% Copyright (c) 1993-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{color}{Colour extension}{\stripRCS$Revision: 3.11 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\xycolorwarning@@{\xycolormessage@
+ \gdef\xycolorwarning@{\xycolormessage@
+ \xywarning@{...no further colour warnings will be given.}%
+ \global\let\xycolorwarning@=\relax }}
+\xylet@\xycolorwarning@=\xycolorwarning@@
+\xydef@\xycolormessage@{%
+ \xywarning@{Current driver does not support colour.}}%
+\xydef@\xyNoColor@#1{}
+\xylet@\xycolor@@=\xyNoColor@
+\xydef@\xyNoColor@@#1#2{\xycolorwarning@}
+\xydef@\xycolor@{\xycolor@@}
+\xylet@\xylocalColor@=\xyNoColor@@
+\xydef@\UnloadColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@ }
+\xylet@\UnloadColor@@=\UnloadColor@
+\xyaddunsupport{color}{\UnloadColor@@\relax}
+\ifx\current@color\undefined \xydef@\xybasecolor@{}%
+\else \def\xybasecolor@{\current@color}\fi
+\xydef@\xystackcolor@{\bgroup \DN@##1##2{\egroup}%
+ \ifInvisible@\else\ifHidden@\else\DNii@{\no@@}\ifx\nextii@\Connect@@
+ \else\DN@{\xystackcolor@i}\fi\fi\fi \next@ }
+\xydef@\xystackcolor@i#1#2{\checkXyStyle@
+ \DN@{#2}\ifx\next@\empty
+ \def\tmp@##1{\DN@{\xycolor@push{#1}##1\xycolor@pop}}%
+ \else\def\tmp@##1{\DN@{\xycolor@push{#2 #1}##1\xycolor@pop}}\fi
+ \toks@={\egroup \let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\tmp@\expandafter{\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}\def\Connect@@}%
+ \expandafter\tmp@\expandafter{\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}}%
+ \the\toks@ }%
+\xydef@\xycolor@push@@#1{\special{color push #1}}
+\xydef@\xycolor@pop{\special{color pop}}
+\xylet@\xycolor@push=\xycolor@push@@
+\xydef@\newxycolor#1#2{\newxyColor{#1}{}{}{#2}{}}
+\xydef@\newxyColor#1#2#3#4{\newxycolor@{#1}{#2}{#3}{#4}{}}
+\xydef@\newxycolor@#1#2#3#4#5{%
+ \expandafter\let\expandafter\next@\csname shape [#1]\endcsname
+ \ifx\next@\relax
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{}{#3}\xycolor@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#2 #3}}}%
+ \fi
+ \else\DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{#4}{}\xycolor@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#4}}}%
+ \fi \fi
+ \else \def\tmp@{\relax}\DNii@{#5}%
+ \ifx\nextii@\tmp@
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{}{#3}\xycolor@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#2 #3}}}%
+ \fi
+ \else
+ \DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{#4}{}\xycolor@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#4}}}%
+ \fi \fi
+ \else\DN@{}\fi\fi \next@\relax}
+\xydef@\xystandardcolors@{%
+ \newxycolor@{black}{0. 0. 0.}{rgb}{}\relax
+ \newxycolor@{white}{1. 1. 1.}{rgb}{}\relax
+ \newxycolor@{gray}{.5}{gray}{}\relax
+ \newxycolor@{grey}{.5}{gray}{}\relax
+ \newxycolor@{red}{1. 0. 0.}{rgb}{}\relax
+ \newxycolor@{green}{0. 1. 0.}{rgb}{}\relax
+ \newxycolor@{blue}{0. 0. 1.}{rgb}{}\relax
+ \newxycolor@{cyan}{0. 1. 1.}{rgb}{}\relax
+ \newxycolor@{magenta}{1. 0. 1.}{rgb}{}\relax
+ \newxycolor@{yellow}{1. 1. 0.}{rgb}{}\relax
+ \xyuncatcodes }
+\xydef@\UseCrayolaColors{\xyrequire{crayon}\xyuncatcodes}%
+\xydef@\xyBEcolorcheck@{\ifx\xycolor@@\xyNoColor@\else
+ \xywarning@{PostScript colour support should be OK.}\fi }%
+\xywithoption{ps}{%
+ \xyinputorelse@{xyps-c}{\xyerror@{Could not load xyps-c}{}}}%
+ \xycatcodes
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xycrayon.tex b/macros/generic/diagrams/xypic/texinputs/xycrayon.tex
new file mode 100644
index 0000000000..8eae152ab8
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xycrayon.tex
@@ -0,0 +1,32 @@
+%% xycrayon.tex from $Id: xycrayon.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Crayola colours'' PostScript backend support.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{crayon}{Crayola Colours}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\installCrayolaColors@{%
+ \xyinputorelse@{xyps-col}{\xyerror@{Could not load Crayola colours}{}}%
+ \let\installCrayolaColors@=\relax
+ \xyuncatcodes }
+\xyendinput
+#
diff --git a/macros/generic/diagrams/xypic/texinputs/xycurve.tex b/macros/generic/diagrams/xypic/texinputs/xycurve.tex
new file mode 100644
index 0000000000..f5692fe257
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xycurve.tex
@@ -0,0 +1,2702 @@
+%% xycurve.tex from $Id: xycurve.doc,v 3.12 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Curves and Splines'' extension.
+%% Copyright (c) 1993-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{curve}{Curve and Spline extension}{\stripRCS$Revision: 3.12 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\message{curve,}
+\xynew@{count}\crv@cnt@
+\xydef@\xynumctrlpts@{\the\crv@cnt@}
+\xynew@{toks}\crvpts@
+\xydef@\setcurve@{%
+ \edef\xysplineparams@{%
+ \expandafter\noexpand\csname params@\endcsname}%
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \edef\xycrvcnt@{%
+ \expandafter\noexpand\csname crvcnt@\endcsname}%
+ \expandafter\edef\xycrvcnt@{\number\crv@cnt@}%
+ \ifcase\crv@cnt@
+ \expandafter\xycvxhull@\or
+ \expandafter\xyquadbezier@\or
+ \expandafter\xycubicbezier@\or
+ \expandafter\xybspline@iii\or
+ \expandafter\xybspline@iv\else
+ \expandafter\xybspline@
+ \fi}
+\xydef@\curve{\connect\crv}
+\xydef@\crv#1#{\hbox \bgroup \crvresetbreaks@ \initshape@
+ \def\pure@crv{\crv@saveStyles@}\crv@{#1}}
+\xydef@\crv@#1#2{%
+ \DN@{#1}\ifx\empty\next@
+ \DN@{\def\afterCURVEaction@{}\parsecurve@\xycurve@@}%
+ \else\DN@{\parseCURVE@#1\parsecurve@\curveSTYLE@}\fi
+ \next@ #2\@endcurve\endcrv@ }
+\xydef@\curveSTYLE@{\xycurve@@}%
+\xydef@\afterCURVEaction@{}%
+\xydef@\@endcurve{}%
+\xydef@\endcrv@@{\endcrv@\POS}%
+\xydef@\pure@crv{\relax}
+\xywarnifdefined\crv@normaltemplate
+\xywarnifdefined\crv@othertemplate
+\xywarnifdefined\crv@specialtemplate@@
+{\xyuncatcodes \catcode`\@=11 \catcode`\#=6
+ \gdef\crv@normaltemplate#1{{}{~**#1\xy@@crvaddstack@}}
+ \gdef\crv@othertemplate#1{{}{~*=<2\jot>{}~**#1\xy@@crvaddstack@}}
+ \gdef\crv@specialtemplate@@#1{{}{~**\dir{#1}\xy@@crvaddstack@}}
+}
+\xydef@\crvs#1#{\hbox \bgroup \def\pure@crv{\relax}\crvs@{#1}}%
+\xydef@\crvi#1#{\hbox \bgroup \def\pure@crv{\relax}\invisbreaks@ \crvs@{#1}}%
+\xydef@\crvs@#1{\DN@{\initshape@ \@crv@{#1}}%
+ \def\crv@defaultshape{-}%
+ \ifx\bstartPLACE@\relax \else
+ \ifx\bstartPLACE@\empty \Invisible@true \else
+\splinetrace@{bstartPLACE@=\bstartPLACE@, bendPLACE@=\bendPLACE@}%
+ \DN@{\let\xy@@crvaddstack@=\xy@@samecurve@
+ \let\saveshape@=\savesame@
+ \let\savectrlptsnum@=\relax
+ \let\startxycurve@=\recovercurve@
+ \crv@cnt@=\xycrvptsnum@\relax \@crv@{#1}}%
+ \fi \fi \next@ }
+\xydef@\xy@@samecurve@{\xyFN@\checkendcurve@}
+\xydef@\savesame@{\egroup }
+\xydef@\recovercurve@{%
+ \crv@cnt@=\xycrvptsnum@ \splinereset@ \recovercv@end
+ \ifx\bendPLACE@\relax \def\bendPLACE@{1}\fi
+ \ifdim\zz@\R@c \ifdim\zz@\L@c \ifdim\zz@\D@c \ifdim\zz@\U@c
+ \Edge@c={\zeroEdge}\fi\fi\fi\fi
+ \edef\cv@end{\cfromthec@}\edef\cv@start{\cfromthep@}}
+\xydef@\recovercv@end{\count@=\ptsnum@\relax\advance\count@\@ne
+ \edef\tmp@{\the\count@}\csname cv@\tmp@\endcsname}%
+\xydef@\crvSTYLE@@{}
+\expandafter\xydef@\expandafter\crv@defaultshape\expandafter{\addDASH@{}}
+\xydef@\crv@noobject{\Invisible@true}
+\xydef@\@crv@#1#2{\DN@{#1#2}%
+ \ifx\next@\empty \edef\next@{\crv@defaultshape}%
+ \ifx\bstartPLACE@\empty \xdef\crvSTYLE@@{{\crv@defaultshape}}\fi
+ \else
+ \ifx\bstartPLACE@\empty \gdef\crvSTYLE@@{#1{#2}}\fi
+ \fi
+ \ifx\next@\empty \crv@noobject \DN@{\crv@{}{\xy@@crvaddstack@}}%
+ \else\def\tmp@{-}\ifx\next@\tmp@ \DN@{\crv@{}{\xy@@crvaddstack@}}%
+ \else\def\tmp@{=}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{=}}}%
+ \else\def\tmp@{2-}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{2.}}}%
+ \else\def\tmp@{3-}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{3.}}}%
+ \else\def\tmp@{--}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@specialtemplate@{--}}%
+ \else\def\tmp@{==}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir2{--}}}%
+ \else\def\tmp@{2--}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir2{--}}}%
+ \else\def\tmp@{3--}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir3{--}}}%
+ \else\def\tmp@{.}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@specialtemplate@{.}}%
+ \else\def\tmp@{:}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{:}}}%
+ \else\def\tmp@{2.}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{:}}}%
+ \else\def\tmp@{..}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@specialtemplate@{.}}%
+ \else
+ \DN@{\expandafter\crv@\crv@othertemplate{\dir#1{#2}}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xylet@\crv@specialtemplate@=\crv@specialtemplate@@
+\xydef@\crv@special#1{}
+\xydef@\parseCURVE@{\def\curveSTYLE@{\xycurve@@}\def\afterCURVEaction@{}%
+ \xyFN@\parseCURVE@@}
+\xydef@\parseCURVE@@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\parseCURVE@@}%
+ \else\ifx ~\next \DN@ ~{\xy@~{}\xyFN@\setcurveSTYLE@@}%
+ \else\ifx\parsecurve@\next\DN@{}%
+ \else\ifcat\active\noexpand\next\DN@{\xyactive@Warning}%
+ \else\ifcat a\noexpand\next\DN@##1{\xytilde@Warning\setcurveSTYLE@{##1}%
+ \xyFN@\parseCURVE@@}%
+ \else\DN@{}\fi\fi\fi\fi\fi \next@ }%
+\xydef@\xyactive@Warning{\xywarning@{expandable control sequences should
+ not be here, results are unpredictable in diagrams.}}%
+\xydef@\xytilde@Warning{Please use ~ to set curve style.}%
+\xydef@\setcurveSTYLE@#1{\xyFN@\setcurveSTYLE@@#1}
+\xydef@\setcurveSTYLE@@{%
+ \ifx\next p\def\curveSTYLE@{\xyc@trlpts@@}%
+ \DN@ p{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next P\def\curveSTYLE@{\xyc@trlpts@}%
+ \DN@ P{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next l\def\curveSTYLE@{\xyc@vxhull@@}%
+ \DN@ l{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next L\def\curveSTYLE@{\xyc@vxhull@}%
+ \DN@ L{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next c\def\curveSTYLE@{\xycurve@@}%
+ \DN@ c{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next C\def\curveSTYLE@{\xycurve@@}%
+ \DN@ C{\xyFN@\setafterCURVEaction@}%
+ \else \DN@##1{\xywarning@{unknown curve style ##1}\xyFN@\parseCURVE@@}%
+ \fi\fi\fi\fi\fi\fi \next@ }
+\xydef@\setafterCURVEaction@{%
+ \ifx\next~\DN@~{\xyFN@\setcurveSTYLE@@}%
+ \else\ifcat a\noexpand\next\DN@{\setafterCURVEaction@@}%
+ \else\DN@{\xyFN@\parseCURVE@@}%
+ \fi\fi \next@}
+\xydef@\setafterCURVEaction@@{%
+ \ifx\next c\DN@ c{%
+ \def\afterCURVEaction@{\noexpand\endcurve\noexpand\xy@curve@}%
+ \xyFN@\parseCURVE@@ }%
+ \else\ifx\next C\DN@ C{%
+ \def\afterCURVEaction@{\noexpand\endcurve\noexpand\xy@curve@@}%
+ \xyFN@\parseCURVE@@ }%
+ \else \DN@##1{\xywarning@{unknown after-curve action ##1}%
+ \xyFN@\parseCURVE@@ }%
+ \fi\fi \next@ }
+\xydef@\parsecurve@{\xyFN@\parsecurve@@}
+\xydef@\parsecurve@@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\parsecurve@@}%
+ \else\ifx\next\@endcurve\DN@\@endcurve{\checkafterCURVE@}%
+ \else\ifcat\active\noexpand\next\DN@{\relax}%
+ \else\DN@{\xycurve@@}\fi\fi\fi\next@}%
+\xydef@\xycurve@{\begingroup\afterCURVE{\setcurve@\endgroup}\crvobjects@
+ \startxycurve@\xycrvmods@}
+\xydef@\xycurve@@{\afterCURVE{\setcurve@}\crvobjects@\startxycurve@
+ \xycrvmods@}
+\xydef@\xy@curve@{\xy@curve@@@{\splinedefaulttol@\crvobjects@}}
+\xydef@\xy@curve@@{\xy@curve@@@{\resetcrvobjects@}}
+\xydef@\xy@curve@@@#1{\ifx\cv@start\relax
+ \DN@{\xywarning@{There is no curve to plot}}.
+ \else\DN@{\begingroup\afterCURVE{\setcurve@\endgroup}#1\cv@end}%
+ \fi \next@ }
+\xydef@\crvobjects@{\def\xycrvdrop@{}\def\xycrvconn@{}}
+\xydef@\resetcrvobjects@{\crvobjects@}
+\xylet@\savecurve=\xycurve@@
+\xylet@\samecurve=\xy@curve@
+\xydef@\xycrvmods@{\xyFN@\xy@crvmods@}%
+\xydef@\xy@crvmods@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\xy@crvmods@}%
+ \else\ifx\next ~\DN@ ~{\xyFN@\xy@crvmods@@}%
+ \else\DN@{\xy@crvmods@@@@}\fi\fi \next@}%
+\xydef@\xy@crvmods@@@@{\xyFN@\checkendcurve@}%
+\xydef@\xy@crvmods@@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\xy@crvmods@@}%
+ \else\ifx\next *\DN@ *{\xyFN@\xy@@crvmods@}%
+ \else\addAT@\ifx\next\addAT@\DN@{\xyFN@\xy@@crvaddstack}%
+ \else\DN@{\xywarning@{badly-formed curve option}\xyFN@\xy@crvmods@}%
+ \fi\fi\fi \next@}%
+\xydef@\xy@@crvmods@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\xy@@crvmods@}%
+ \else\ifx\next *\DN@ *{\xyFN@\xy@@crvmods@@}%
+ \else\DN@{\xy@crv@mods@@}\fi\fi \next@}%
+\xydef@\xy@crv@mods@@#1#{\DN@##1{\xy@crvmods@@@{#1}{##1}}\next@}%
+\xydef@\xy@crvmods@@@#1#2{%
+ \DN@{#1#2}\ifx\next@\empty \def\xycrvdrop@{ #1{\zerodot}}%
+ \else \def\xycrvdrop@{ #1{#2}}\fi
+ \xyFN@\xy@crvmods@ }%
+\xydef@\xy@@crvmods@@#1#{\DN@##1{\xy@@crvmods@@@{#1}{##1}}\next@}%
+\xydef@\xy@@crvmods@@@#1#2{\def\xycrvconn@{ #1{#2}}\xyFN@\xy@crvmods@ }%
+\xydef@\checkendcurve@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\checkendcurve@}%
+ \else\ifx\next\endcurve\DN@\endcurve{\clearsearchflag@\endxycurve@}%
+ \else\ifx\next\@endcurve\DN@\@endcurve{\checkafterCURVE@}%
+ \else\ifx\next\xy@@crvaddstack@\DN@{}%
+ \else\ifx\next\endxy\DN@{\clearsearchflag@\sloppyendcrv@}%
+ \else\testAND@\iffalse \DN@##1{\clearsearchflag@\searchnextpt@}%
+ \else\ifx ~\next\DN@ ~{\xyFN@\checkcrvtilde@}%
+ \else\ifx\next\relax\DN@\relax{\clearsearchflag@\searchnextpt@}%
+ \else\ifx\next\\\DN@\\{\clearsearchflag@\searchnextpt@}%
+ \else\ifx\searchflag@\relax
+ \DN@{\setsearchflag@\searchnextpt@}%
+ \else\DN@##1{\flagwarn@{##1}}\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi \next@ }
+\xydef@\searchnextpt@{\afterPOS{\xy@@\addtocrv@ \xyFN@\checkendcurve@}}
+\xydef@\checkafterCURVE@{%
+ \edef\tmp@{\noexpand\xyFN@\noexpand\checkendcurve@
+ \afterCURVEaction@\noexpand\endcurve}\tmp@ }
+\xylet@\searchflag@=\relax
+\xydef@\setsearchflag@{\let\searchflag@=@}
+\xydef@\clearsearchflag@{\let\searchflag@=\relax}
+\xydef@\flagwarn@#1{%
+ \ifx\next\@endcurve\DN@{\xyFN@\checkendcurve@\endcurve}%
+ \else\setsearchflag@\DN@{\xyFN@\checkendcurve@}%
+ \xywarning@{skipping invalid token \string#1\space in curve}%
+ \fi \next@ }
+\xydef@\sloppyendcrv@{%
+\xywarning@{Please use \string\endcurve\space to end the curve.}\endxycurve@}
+\xydef@\endcrv@{\saveshape@
+ \Edge@c={\splineEdge}\Invisible@false\Hidden@false
+ \edef\Drop@@{\noexpand\ifInvisible@ \setbox\z@=\copy\voidb@x
+ \noexpand\else
+ \noexpand\wdz@=\z@
+ \noexpand\ht\z@=\z@ \noexpand\dp\z@=\z@
+ \noexpand\splineDrop@
+ \noexpand\fi }%
+ \edef\Connect@@{%
+ \noexpand\setbox\z@=\noexpand\box\lastobjectbox@
+ \noexpand\wdz@=\z@
+ \noexpand\ht\z@=\z@ \noexpand\dp\z@=\z@
+ \expandafter\noexpand\pure@crv
+ \noexpand\ifInvisible@ \noexpand\crv@saveStyles@ \noexpand\else
+ \noexpand\crv@getStyles@\noexpand\styledboxz@ \noexpand\fi
+ \noexpand\ifHidden@\noexpand\else
+ \noexpand\ifx\noexpand\COORD@\noexpand\xymatrixCOORD@ \noexpand\else
+ \noexpand\X@min=\the\X@min \noexpand\X@max=\the\X@max
+ \noexpand\Y@min=\the\Y@min \noexpand\Y@max=\the\Y@max
+ \noexpand\fi \noexpand\fi
+ \savecrvparams@ \noexpand\crvconnect@
+ }%
+ \wdz@=\z@
+ \ht\z@=\z@ \dp\z@=\z@ }
+\xydef@\crvXY@pre@{}
+\xydef@\crvXY@post@{}
+\xydef@\crv@saveStyles@{\def\xy@style@{}%
+ \expandafter\def\expandafter\crvXY@pre@\expandafter{\preXY@style@}%
+ \expandafter\def\expandafter\crvXY@post@\expandafter{\postXY@style@}}
+\xydef@\crv@getStyles@{\def\xy@style@{}%
+ \gdef\preXY@style@{\crvXY@pre@}\gdef\postXY@style@{\crvXY@post@}}
+\xydef@\initshape@{\savescope@
+ \ifdim\X@c>\X@p \X@min=\X@p \X@max=\X@c \else \X@max=\X@p \X@min=\X@c \fi
+ \ifdim\Y@c>\Y@p \Y@min=\Y@p \Y@max=\Y@c \else \Y@max=\Y@p \Y@min=\Y@c \fi }
+\xydef@\saveshape@{\savectrlptsnum@
+ \R@c=\X@max \advance\R@c-\X@c \L@c=\X@c \advance\L@c-\X@min
+ \U@c=\Y@max \advance\U@c-\Y@c \D@c=\Y@c \advance\D@c-\Y@min
+ \edef\tmp@{\egroup \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \noexpand\ifdim\noexpand\X@min>\the\X@min\noexpand\X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\noexpand\Y@min>\the\Y@min\noexpand\Y@min=\the\Y@min\noexpand\fi
+ \noexpand\ifdim\noexpand\X@max<\the\X@max\noexpand\X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\noexpand\Y@max<\the\Y@max\noexpand\Y@max=\the\Y@max\noexpand\fi
+ \savecrvparams@ \def\noexpand\pure@crv{\expandafter\noexpand\pure@crv}}%
+ \tmp@ }
+\xydef@\savecrvparams@{\crvpts@={\the\crvpts@}%
+ \noexpand\def\noexpand\crvconnect@{\expandafter\noexpand\crvconnect@}}%
+\xydef@\splineEdge{\rectangleEdge}
+\xydef@\xy@@crvaddstack{%
+ \ifx\next ~\xywarning@{there should be a poslist here, \string~@ ignored}%
+ \DN@{\xy@crvmods@}%
+ \else\DN@{\xy@@crvaddstack@}\fi \next@}
+\xydef@\xy@@crvaddstack@{\smapxy@@\addtocrv@ \xyFN@\checkendcurve@}
+\xydef@\checkcrvtilde@{%
+ \addAT@\ifx\next\addAT@\DN@{\xy@@crvaddstack@}%
+ \else\xywarning@{invalid token after ~, ignored}%
+ \DN@##1{\xyFN@\checkendcurve@}%
+ \fi \next@ }
+\xydef@\crvconnect@@{%
+ \def\Creset@@{\crvreset@}%
+ \def\Cshavep@@{\crvshavep@}%
+ \def\Cshavec@@{\crvshavec@}%
+ \def\Cslidep@@{\crvslidep@}%
+ \def\Cslidec@@{\crvslidec@}%
+ \def\Calong@@{\crvalong@}%
+ \def\Cintercept@@{\crvintercept@}%
+ \def\Cbreak@@{\crvbreak@}%
+ \def\Clast@@{\crvlast@}%
+}
+\xydef@\straitconnect@{\crvconnect@@
+ \let\crvreset@=\straitreset@
+ \let\crvshavep@=\straitshavep@
+ \let\crvshavec@=\straitshavec@
+ \let\crvslidep@=\straitslidep@
+ \let\crvslidec@=\straitslidec@
+ \let\crvalong@=\straitalong@
+ \let\crvintercept@=\straitintercept@
+ \let\crvbreak@=\straitbreak@
+ \let\crvlast@=\straitlast@
+}
+\xydef@\straitreset@{\the\crvpts@
+ \edef\xycrvptsnum@{\csname ptsnum@\endcsname}%
+ \def\segmentnum@{0}}
+\xydef@\straitslidep@{\setupDirection@ii \noCslidep@@ }
+\xydef@\straitslidec@{\setupDirection@ii \noCslidec@@ }
+\xydef@\straitshavep@{%
+ \expandafter\ifnum\xycrvptsnum@>\z@
+ \def\segmentnum@{0}%
+ \csname cv@1\endcsname
+ \resetDirection@ \setupDirection@ii
+ \fi \noCshavep@@ }
+\xydef@\straitshavec@{%
+ \expandafter\ifnum\xycrvptsnum@>\z@
+ \expandafter\count@@\xycrvptsnum@\relax
+ \bgroup \csname cv@\number\count@@\endcsname
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \edef\segmentnum@{\xycrvptsnum@}%
+ \resetDirection@ \setupDirection@ii
+ \fi \noCshavec@@ }
+\xydef@\straitalong@#1{%
+ \ifdim#1\p@<\z@
+ \xywarning@{parameter value #1 is negative, using 0}%
+ \cfromp@ \def\PLACEf@{{0}}%
+ \else
+ \dimen@=#1\p@ \count@=\dimen@ \divide\count@\p@
+ \expandafter\count@@\xycrvptsnum@\relax \advance\count@@\@ne
+ \advance\dimen@\segmentnum@\p@
+ \advance\count@\segmentnum@\relax
+ \def\segmentnum@{0}%
+ \ifnum\count@@<\count@
+ \xywarning@{parameter value #1 too large, using \the\count@@}%
+ \count@=\count@@ \advance\count@\m@ne \edef\PLACEf@{{1}}%
+ \else
+ \advance\dimen@-\count@\p@
+ \ifdim\zz@\dimen@\ifnum\count@>\z@
+ \advance\count@\m@ne \advance\dimen@\p@ \fi\fi
+ \edef\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \fi
+ \ifnum\count@=\z@\else \bgroup
+ \csname cv@\number\count@\endcsname
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \fi
+ \advance\count@\@ne
+ \ifnum\count@<\count@@
+\splinetrace@{find place \the\dimen@\space along straight segment
+ \the\count@}%
+ \csname cv@\number\count@\endcsname
+ \fi
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi \expandafter\noCalong@@\PLACEf@ \czeroEdge@ }
+\xydef@\straitintercept@{\noCintercept@@}
+\xydef@\straitbreak@{\straightCbreak@@}
+\xydef@\straitlast@{\straightClast@@}
+\xydef@\splineconnect@{%
+ \let\crvreset@=\splinereset@
+ \let\crvshavep@=\splineshavep@
+ \let\crvshavec@=\splineshavec@
+ \let\crvslidep@=\splineslidep@
+ \let\crvslidec@=\splineslidec@
+ \let\crvalong@=\splinealong@
+ \let\crvintercept@=\splineintercept@
+ \let\crvbreak@=\splinebreak@
+ \let\crvlast@=\splinelast@
+}
+\xydef@\splinereset@{\the\crvpts@
+ \edef\xycrvptsnum@{\csname ptsnum@\endcsname}%
+ \edef\xysplineparams@{%
+ \expandafter\noexpand\csname params@\endcsname}%
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \def\segmentnum@{1}\def\splinecorrect@p{0}\def\splinecorrect@c{0}%
+ \splinelength@=\z@ \def\splineplace@f{.5}%
+}
+\xydef@\splineshavep@{\begingroup
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \expandafter\expandafter\expandafter\getsplineedges@safe\xysplineedges@ @@%
+ \edef\tmp@{\noexpand\removePT@\the\dimen5}%
+ \edef\tmp@{\endgroup
+ \noexpand\def\noexpand\splinecorrect@p{\tmp@}}\tmp@
+ \setupDirection@ii }
+\xydef@\splineshavec@{\begingroup
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \expandafter\expandafter\expandafter\getsplineedges@safe\xysplineedges@ @@%
+ \dimen@=-\dimen7\relax \advance\dimen@\p@
+%% \getcrvsegsnum@ \advance\dimen@\count@\p@
+ \edef\tmp@{\noexpand\removePT@\the\dimen@}%
+ \edef\tmp@{\endgroup
+ \noexpand\def\noexpand\splinecorrect@c{\tmp@}}\tmp@
+ \setupDirection@ii }
+\xydef@\splineslidep@#1{\enter@{\pfromthep@}%
+ \begingroup \splinealong@@{0}{#1}+\splineslidep@@@
+ \setupDirection@ii \leave@ }%
+\xydef@\splineslidep@@@{%
+ \d@X=\dimen5 \d@Y=\dimen7 \edef\tmp@{\postfind@}\tmp@ \dimen@=\splineval@
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@>\tw@ \advance\count@\m@ne
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \fi
+ \edef\tmp@{\endgroup \endgroup
+ \noexpand\def\noexpand\xysplineval@{\the\splineval@}%
+ \noexpand\def\noexpand\splinecorrect@p{\expandafter\removePT@\the\dimen@}%
+\splinetrace@{slide = \the\splinelength@}%
+ \X@c=\dimen@i \Y@c=\dimen3
+ \d@X=\the\d@X \d@Y=\the\d@Y
+ \noexpand\def\noexpand\segmentnum@{\segmentnum@}}\tmp@ }
+\xydef@\splineslidec@#1{\enter@{\pfromthep@}%
+ \begingroup
+ \expandafter\splinealong@@\PLACEf@{#1}+\splineslidec@@@
+ \setupDirection@ii \leave@ }
+\xydef@\splineslidec@@@{%
+ \d@X=\dimen5 \d@Y=\dimen7 \edef\tmp@{\postfind@}\tmp@ \dimen@=\splineval@
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@>\tw@ \advance\count@\m@ne
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \dimen@=-\dimen@ \advance\dimen@\count@\p@
+ \else \dimen@=-\dimen@ \advance\dimen@\p@ \fi
+%% splinecorrect@c is probably wrong here!!
+ \edef\tmp@{\endgroup \endgroup
+ \noexpand\def\noexpand\xysplineval@{\the\splineval@}%
+ \noexpand\def\noexpand\splinecorrect@c{\expandafter\removePT@\the\dimen@}%
+\splinetrace@{slide = \the\splinelength@; correct@c=\noexpand\splinecorrect@c}%
+ \X@c=\dimen@i \Y@c=\dimen3
+ \d@X=\the\d@X \d@Y=\the\d@Y
+ \noexpand\def\noexpand\segmentnum@{\segmentnum@}}\tmp@ }
+\xydef@\checkslidemore@#1{%
+ \dimen@ii=-#1\relax\ifdim\dimen@ii<\z@\multiply\dimen@ii\m@ne\fi
+ \dimen@=-\splinelength@ \advance\dimen@\dimen@ii\relax
+ \ifdim\dimen@<\z@\dimen@ii=-\dimen@\else\dimen@ii=\dimen@\fi
+ \ifdim\dimen@ii<.2\p@\DN@{\splineslidec@@ \leave@}%
+ \else \splinetrace@{not found yet, \the\dimen@ii\space still to go}%
+ \dimen@ii=#1\relax\ifdim\dimen@ii<\z@\multiply\dimen@\m@ne\fi
+ \DN@{\expandafter\splineslidemore@\expandafter{\the\dimen@}}\fi
+ \next@}%
+\xydef@\splineslidemore@#1{%
+ \expandafter\count@\segmentnum@\relax
+ \ifdim#1<\z@\advance\count@\m@ne\dimen@=\p@
+ \else\advance\count@\@ne\dimen@=\z@\fi
+ \ifnum\count@<\@ne
+ \expandafter\splinesegment@\expandafter{\segmentnum@}%
+ \DN@{\xywarning@{cannot slide beyond start of curve}%
+ \spline@find{\z@}{\z@}{}\splineslidec@@ \leave@ }%
+ \else \expandafter\count@@\xycrvptsnum@\relax\advance\count@@\m@ne
+ \expandafter\ifnum\count@@<\count@\relax
+ \expandafter\splinesegment@\expandafter{\segmentnum@}%
+ \DN@{\xywarning@{cannot slide beyond end of curve}%
+ \spline@find{\p@}{\z@}{}\splineslidec@@ \leave@ }%
+ \else
+ \edef\segmentnum@{\the\count@}%
+ \expandafter\splinesegment@\expandafter{\segmentnum@}%
+\splinetrace@{sliding onto segment \segmentnum@}%
+ \expandafter\spline@find\expandafter{\the\dimen@}{#1}{}%
+ \DN@{\checkslidemore@{#1}}%
+ \fi\fi \next@ }
+\xydef@\splineslidec@@{%
+ \dimen@=\splineval@ \advance\dimen@\segmentnum@\p@\advance\dimen@-\p@
+ \edef\tmp@{\endgroup
+ \noexpand\def\noexpand\xysplineval@{\the\dimen@}%
+\splinetrace@{slide = \the\splinelength@}%
+ \X@c=\the\dimen@i \Y@c=\the\dimen3 \d@X=\the\dimen5 \d@Y=\the\dimen7 \postfind@
+ \noexpand\def\noexpand\segmentnum@{\segmentnum@}}\tmp@
+ \setupDirection@ii}
+\xydef@\splinealong@#1{\def\postfind@{}\splinealong@@{#1}\z@+%
+ \splineslidec@@
+ \dimen@=\xysplineval@\relax
+ \count@=\xycrvptsnum@\relax \ifnum\count@>\@ne \advance\count@\m@ne\fi
+ \ifnum\count@>\@ne \dimen@nth\count@\dimen@
+ \fi \edef\bthisPLACE@{\expandafter\removePT@\the\dimen@}%
+\splinetrace@{bthisPLACE@=\bthisPLACE@}}%
+\xydef@\splinealong@@#1#2#3{%
+ \edef\tmp@{#1}\relax \dimen@ii\tmp@\p@
+%% \getcrvsegsnum@
+%% \dimen@=-\count@\p@
+ \dimen@=-\p@
+ \expandafter\advance\expandafter\dimen@\splinecorrect@p\p@
+ \expandafter\advance\expandafter\dimen@\splinecorrect@c\p@
+ \edef\tmp@{#1}\relax \dimen@=-\tmp@\dimen@ \relax
+ \expandafter\advance\expandafter\dimen@\splinecorrect@p\p@
+ \getcrvsegsnum@ \multiply \dimen@ by\count@\relax
+\splinetrace@{actual:\the\dimen@; f:\the\dimen@ii; p:\splinecorrect@p, c:\splinecorrect@c}%
+ \count@=\dimen@ \divide\count@\p@ \DN@{\relax}%
+ \def\tmp@{\relax}\ifx\next@\tmp@
+ \expandafter\ifnum\xycrvptsnum@<\count@
+ \xywarning@{parameter value #1 too large}%
+ \DNii@{\relax}\DN@{\begingroup}%
+ \else
+ \edef\xysplineval@{\the\dimen@}%
+ \advance\dimen@-\count@\p@
+ \ifdim\dimen@=\z@
+\splinetrace@{find knot point \the\count@}%
+ \ifnum\count@=\z@ \count@=\@ne \else \dimen@=\p@ \fi
+ \else \advance\count@\@ne
+\splinetrace@{find point \the\dimen@\space on spline segment \the\count@}%
+ \fi
+ \edef\segmentnum@{\the\count@}%
+ \edef\next@{\begingroup\noexpand\splinesegment@{\the\count@}}%
+ \edef\nextii@{%
+ \noexpand\spline@find{\the\dimen@}{#2}{}\noexpand\checksplinefind@{#2}}%
+ \ifx>#3\relax
+ \edef\nextii@{%
+ \noexpand\spline@find{\the\dimen@}{#2}#3\noexpand\checksplinefind@{#2}}%
+ \else\ifx-#3\relax \ifdim\dimen@>\z@\relax \ifdim\dimen@<\p@
+ \dimen@=-\dimen@ \advance\dimen@\p@
+ \edef\nextii@{\noexpand\splinereverse@
+ \noexpand\spline@find{\the\dimen@}{#2}{}\noexpand\checksplinefind@{#2}}%
+ \fi\fi
+ \else\ifx<#3\relax \ifdim\dimen@>\z@\relax \ifdim\dimen@<\p@
+ \dimen@=-\dimen@ \advance\dimen@\p@
+ \edef\nextii@{\noexpand\splinereverse@
+ \noexpand\spline@find{\the\dimen@}{#2}#3\noexpand\checksplinefind@{#2}}%
+ \fi\fi
+ \fi\fi\fi
+ \fi\fi \expandafter\next@\nextii@ }
+\xydef@\checksplinefind@#1{%
+ \dimen@ii=#1\relax \dimen@=\splinelength@
+ \ifdim\dimen@ii=\z@\DN@{}%
+ \else
+ \ifdim\dimen@ii<\z@\advance\dimen@\dimen@ii
+ \else\advance\dimen@-\dimen@ii\fi
+ \ifdim\dimen@<\z@\multiply\dimen@\m@ne\fi
+ \ifdim\dimen@<.2\p@\DN@{}%
+ \else
+ \count@=\segmentnum@\relax
+ \ifdim\dimen@ii<\z@\advance\dimen@ii\splinelength@
+ \ifnum\count@>\@ne\advance\count@\m@ne
+ \edef\next@{\noexpand\splinesegment@{\the\count@}%
+ \noexpand\spline@find\p@{\the\dimen@ii}{}%
+ \noexpand\checksplinefind@{\the\dimen@ii}}%
+ \else
+ \xywarning@{cannot slide \the\dimen@ii\space before start}%
+ \DN@{\splinesegment@\@ne \spline@find\z@\z@{}}\fi
+ \else\advance\dimen@ii-\splinelength@
+ \count@@=\numcontrolpts
+ \ifnum\count@<\count@@ \advance\count@\@ne
+ \edef\next@{\noexpand\splinesegment@{\the\count@}%
+ \noexpand\spline@find\z@{\the\dimen@ii}{}%
+ \noexpand\checksplinefind@{\the\dimen@ii}}%
+ \else
+ \xywarning@{cannot slide \the\dimen@ii\space beyond end}%
+ \DN@{\splinesegment@{\the\count@@}\spline@find\p@\z@{}}\fi
+ \fi
+ \fi\fi \next@ }
+\xydef@\resetbreaks@{%
+ \let\bstartPLACE@=\relax \let\bthisPLACE@=\empty
+ \let\bendPLACE@=\relax \let\bprevPLACE@=\relax}
+\xydef@\invisbreaks@{\resetbreaks@ \let\bstartPLACE@=\empty}
+\xydef@\crvresetbreaks@{\resetbreaks@ \let\bstartPLACE@=\relax }
+\xydef@\initbreaks@{\xy@@{\ifx\bstartPLACE@\relax
+ \def\bstartPLACE@{0}\def\bendPLACE@{1}\else
+ \ifx\bstartPLACE@\empty\def\bstartPLACE@{0}\def\bendPLACE@{1}%
+ \fi\fi}}
+\xydef@\lastbreaks@{\ifx\bprevPLACE@\relax \def\bstartPLACE@{0}%
+ \else \expandafter \bprevPLACE@ \fi
+ \let\bprevPLACE@\relax \let\bendPLACE@\relax}
+\xylet@\bstartPLACE@\relax
+\xylet@\bendPLACE@\relax
+\xylet@\bprevPLACE@\relax
+\xydef@\bthisPLACE@{1}
+\xydef@\splinebreak@{%
+\splinetrace@{***new break*** this:\bthisPLACE@ }%
+ \ifx\bthisPLACE@\empty\def\bendPLACE@{1}%
+ \else\edef\bendPLACE@{\bthisPLACE@}\let\bthisPLACE@\empty\fi
+ \ifx\bprevPLACE@\relax\def\bstartPLACE@{0}\else\expandafter\bprevPLACE@\fi
+ \edef\bprevPLACE@{\def\noexpand\bstartPLACE@{\bendPLACE@}\pfromthec@}%
+\splinetrace@{splineBREAK: \bstartPLACE@ <> \bendPLACE@}%
+ \edef\cv@brend{\cfromthec@}%
+ \edef\cv@brstart{\cfromthep@}%
+ \expandafter\connect\expandafter\crvs\crvSTYLE@@{}%
+ \let\cv@brend=\relax
+ \let\cv@brstart=\relax
+\splinetrace@{**break done**}%
+}
+\xydef@\splinelast@{\splinereset@ \lastbreaks@
+\splinetrace@{splineLAST}%
+ \edef\cv@brend{\cfromthec@}%
+ \edef\cv@brstart{\cfromthep@}%
+ \expandafter\connect\expandafter\crvs\crvSTYLE@@{}%
+ \let\cv@brend=\relax
+ \let\cv@brstart=\relax
+\splinetrace@{**last done**}%
+ \resetbreaks@}
+\xydef@\splineNointercept@{\enter@{\pfromthep@}%
+ \begingroup \splinereset@ \csname cv@0\endcsname \swap@
+ \count@=\ptsnum@ \advance\count@\@ne \csname cv@\the\count@\endcsname
+ \edef\tmp@{\endgroup \X@origin=\the\X@p \Y@origin=\the\Y@p
+ \R@c=\the\d@X \U@c=\the\d@Y}\tmp@
+ \loop@
+ \dimen@=\ifdim\R@c<\z@-\fi\R@c
+ \advance\dimen@ \ifdim\U@c<\z@-\fi\U@c
+ \ifdim\dimen@>10\p@
+ \advance\R@c \ifdim\R@c<\z@-\fi 16sp \divide\R@c\KK@
+ \advance\U@c \ifdim\U@c<\z@-\fi 16sp \divide\U@c\KK@
+ \repeat@
+ \intersect@ \leave@}
+\xydef@\splineintercept@{\Hidden@true\Invisible@true\splineintercept@i}
+\xydef@\splineintercept@i{\enter@{\pfromthep@}\begingroup
+ \R@p=\X@c \L@p=\X@p \d@X=\R@p \advance\d@X-\L@p
+ \D@p=\Y@c \U@p=\Y@p \d@Y=\D@p \advance\d@Y-\U@p
+ \dimen@nth\KK@\d@X \edef\sd@X{\expandafter\removePT@\the\d@X}%
+ \dimen@nth\KK@\d@Y \edef\sd@Y{\expandafter\removePT@\the\d@Y}%
+ \dimen@=\sd@Y\L@p \advance\dimen@-\sd@X\U@p
+ \edef\sideOffset@{\the\dimen@}\def\closestseg@{1}%
+ \let\crvconnect@@=\relax \crvconnect@
+ \let\spline@end=\splinef@end
+ \def\spline@start{\bgroup \def\prevnext@{+-}%
+ \def\splinerec@{\let\splinerec@=\splineIrec@ \splineinterceptTest@}%
+ \def\splinedecast@{\let\splinedecast@=\splinedecast@@
+ \def\splineadvance@{\splineIadvance@@}\splinedecast@@}%
+ \def\splineadvance@{\intercepthull@}%
+ \global\let\splinepoint=\splineIpt@@
+ \global\let\splinegoal@=\splinef@pt
+ \global\let\splinefinish@=\splinefinish@@}%
+ \begingroup \splineIsegment@
+ \splinesetparams@ \splined@@ \def\postfind@{}\splineIplace@
+ \setupDirection@ii \leave@ }
+\xydef@\splineIplace@{%
+ \d@X=\dimen5 \d@Y=\dimen7 \dimen@=\splineval@
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@>\tw@ \advance\count@\m@ne
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \dimen@nth\count@\dimen@
+ \fi \edef\tmp@{\endgroup \endgroup
+ \def\noexpand\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \X@c=\dimen@i \Y@c=\dimen3
+ \d@X=\the\d@X \d@Y=\the\d@Y }\tmp@
+\splinetrace@{PLACE = \PLACEf@:(\the\X@c, \the\Y@c)}%
+ \expandafter\edef\expandafter\bthisPLACE@\PLACEf@
+ }
+\xydef@\splineIrec@{\splineinterceptTest@ }
+\xydef@\squineIpt@{\edef\tmp@{\endgroup
+ \def\noexpand\prevnext@{\next}\begingroup}\tmp@ }
+\xydef@\squineIadvance@{\edef\tmp@{\endgroup
+ \def\noexpand\prevnext@{\next}\def\noexpand\howclose@{\howclose@}}%
+ \tmp@ \splineadvance@@\begingroup}
+\xydef@\cubicIpt@{\edef\tmp@{\endgroup
+ \def\noexpand\prevnext@{\next}\begingroup}\tmp@ }
+\xydef@\cubicIadvance@{\edef\tmp@{\egroup
+ \def\noexpand\prevnext@{\next}\def\noexpand\howclose@{\howclose@}}%
+ \tmp@ \splineadvance@@\bgroup}
+\xydef@\splineIsegment@{\DN@{\splinesegment@\@ne}%
+ \ifx\splinesegment@\squinesegment@\else
+ \ifx\splinesegment@\cubicsegment@\else\DN@{\findIsegment@}%
+ \fi\fi\next@}
+\xydef@\findIsegment@{\expandafter\count@\xycrvptsnum@ \count@@\z@
+ \loop@ \advance\count@@\@ne \bgroup
+ \expandafter\splinesegment@\expandafter{\the\count@@}%
+ \xysidesofinterval@
+ \findIsegment@i \repeat@
+ \expandafter\dimen@\prevhowclose@ \relax
+ \ifdim\dimen@=\z@ \edef\closestseg@{\the\count@@}\fi
+ \expandafter\splinesegment@\expandafter{\closestseg@}}
+\xydef@\findIsegment@i{%
+ \expandafter\ifx\next \expandafter\findIsegment@ii
+ \else\expandafter\findIsegment@x\fi \next@ }
+\xydef@\findIsegment@ii{\expandafter\count@\xycrvptsnum@ \relax
+ \advance\count@\m@ne \ifnum\count@>\segmentnum@\relax
+ \expandafter\findIsegment@y\else\expandafter\findIsegment@x\fi}
+\xydef@\findIsegment@x{%
+ \edef\next@{\egroup\def\noexpand\next{\next}%
+ \def\noexpand\prevhowclose@{\prevhowclose@}%
+ \def\noexpand\closestseg@{\closestseg@}\noexpand\iffalse}}
+\xydef@\findIsegment@y{%
+ \edef\next@{\egroup\def\noexpand\next{\next}%
+ \def\noexpand\prevhowclose@{\prevhowclose@}%
+ \def\noexpand\closestseg@{\closestseg@}\noexpand\iftrue}}
+\xydef@\xysidesofinterval@{\bgroup
+ \L@p=\sd@X\Y@p \advance\L@p-\sd@Y\X@p \advance\L@p\sideOffset@
+ \U@p=\sd@X\Y@c \advance\U@p-\sd@Y\X@c \advance\U@p\sideOffset@
+ \def\this@{}\ifdim\L@p>\almostz@ \ifdim\U@p>\almostz@ \def\next{++}\else
+ \ifdim\U@p<-\almostz@ \def\next{+-}\else\def\next{+0}\def\this@{-}\fi\fi
+ \else\ifdim\L@p<-\almostz@ \ifdim\U@p>\almostz@ \def\next{-+}\else
+ \ifdim\U@p<-\almostz@ \def\next{--}\else\def\next{-0}\def\this@{+}\fi\fi
+ \else \ifdim\U@p>\almostz@ \def\next{0+}\else
+ \ifdim\U@p<-\almostz@ \def\next{0-}\else\def\next{00}\def\this@{+}\fi\fi
+ \fi\fi
+ \ifx\this@\empty
+ \L@p=\ifdim\L@p<\z@-\fi\L@p \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\L@p<\U@p \edef\howclose@{\the\L@p}\def\this@{-}%
+ \else \edef\howclose@{\the\U@p}\def\this@{+}\fi
+ \else\def\howclose@{0.0pt}\fi
+\splinetrace@{\next:\this@:\howclose@;\the\splineval@:%
+ (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c)}%
+ \ifdim\howclose@<\prevhowclose@\relax
+ \edef\tmp@{\egroup\def\noexpand\this@{\this@}\def\noexpand\next{\next}%
+ \def\noexpand\howclose@{\howclose@}\def\noexpand\prevhowclose@{\howclose@}%
+ \def\noexpand\closestseg@{\segmentnum@}}%
+\splinetrace@{closest yet: \howclose@, in segment \segmentnum@}%
+ \else
+ \edef\tmp@{\egroup\def\noexpand\this@{\this@}\def\noexpand\next{\next}%
+ \def\noexpand\howclose@{\howclose@}}%
+ \fi \tmp@ }
+\xydef@\splineinterceptTest@{%
+ \xysidesofinterval@ \DN@{\splineadvance@}%
+ \DNii@{0.0pt}\ifx\howclose@\nextii@ \DN@{\splineclosest@}%
+ \else\expandafter\ifx\next \expandafter\ifx\prevnext@
+ \ifx\next\prevnext@\else\DN@{\X@c=\X@p \Y@c=\Y@p
+ \splinefinishf@}\fi\fi
+ \else \DN@{\splinedecast@}\fi\fi
+ {\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\next@
+ \else\aftergroup\splineclosest@
+\splinetrace@{too close: (\the\X@p,\the\Y@p)::(\the\X@c,\the\Y@c)}%
+ \fi}}
+\xydef@\splineclosest@{%
+ \expandafter\ifx\this@-\relax
+ \X@c=\X@p \Y@c=\Y@p \global\advance\splineval@-\splinedepth@
+ \fi \splinefinishf@ }%
+\xydef@\squinetestcvxhull@{\begingroup
+\splinetrace@{hull: closest in segment \closestseg@}%
+ \expandafter\splinesegment@\ifx\undefined\closestseg@\@ne\else\closestseg@\fi
+ \X@c=\L@c \Y@c=\U@c \xysidesofinterval@
+ \expandafter\ifx\next \expandafter\splineoutsidehull@@
+ \else \expandafter\splineinsidehull@\fi}
+\xydef@\cubictestcvxhull@{\begingroup
+ \expandafter\splinesegment@\ifx\undefined\closestseg@\@ne\else\closestseg@\fi
+ \X@c=\L@c \Y@c=\U@c \xysidesofinterval@
+ \expandafter\ifx\next \expandafter\cubictestcvxhull@i
+ \else \expandafter\splineinsidehull@\fi}
+\xydef@\cubictestcvxhull@i{%
+ \X@c=\R@c \Y@c=\D@c \xysidesofinterval@
+ \expandafter\ifx\next \expandafter\splineoutsidehull@@
+ \else \expandafter\splineinsidehull@\fi}
+\xydef@\xysidesofhull@{\bgroup
+ \L@p=\sd@X\Y@p \advance\L@p-\sd@Y\X@p \advance\L@p\sideOffset@
+ \U@p=\sd@X\Y@c \advance\U@p-\sd@Y\X@c \advance\U@p\sideOffset@
+ \L@p=\ifdim\L@p<\z@-\fi\L@p \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\L@p<\U@p \edef\howclose@{\the\L@p}\def\this@{-}%
+ \else \edef\howclose@{\the\U@p}\def\this@{+}\fi
+ \ifx\splinedecast@\squinedecast@ \D@c=\U@c \R@c=\L@c \fi
+ \L@p=\sd@X\U@c \advance\L@p-\sd@Y\L@c \advance\L@p\sideOffset@
+ \L@p=\ifdim\L@p<\z@-\fi\L@p
+ \expandafter\if\this@-%
+ \ifdim\L@p<\prevhowclose@ \def\next{-+}\else \def\next{--}\fi
+ \else
+ \ifdim\L@p<\howclose@ \def\next{-+}\else
+ \U@p=\sd@X\D@c \advance\U@p-\sd@Y\R@c \advance\U@p\sideOffset@
+ \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\U@p<\howclose@ \def\next{+-}\else \def\next{++}\fi
+ \fi\fi
+ \edef\tmp@{\egroup\def\noexpand\this@{\this@}\def\noexpand\next{\next}%
+ \def\noexpand\howclose@{\howclose@}}\tmp@ }
+\def\PLACE@intercept@#1{%
+ \xy@@{\enter@{\pfromthep@\basefromthebase@}\begingroup}%
+ \xy@@ix@{#1}\xy@@{\plainxy@ \def\Creset@@{}%
+ \expandafter\POS\the\toks9\relax
+ \DNii@{\crvreset@}\ifx\nextii@\Creset@@ \edef\next@{\endgroup
+ \def\noexpand\xyinterceptpts@{\the\crvpts@}%
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p
+ \noexpand\CCintercept@@ }%
+ \else \edef\next@{\endgroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p
+ \noexpand\Cintercept@@ }%
+ \fi \next@ \leave@}%
+ \PLACE@@}
+\xydef@\CCintercept@@{\splineSintercept@}
+\xydef@\splineSintercept@{\enter@{\pfromthep@}\begingroup
+ \Creset@@ \edef\connect@pts{\cfromthec@ \pfromthep@}%
+ \xyinterceptpts@ \splinereset@ \connect@pts \splineintercept@
+ \edef\next@{\endgroup \cfromthec@ \DirectionfromtheDirection@ }%
+ \next@ \let\xyinterceptpts@=\empty \leave@}
+\xydef@\nointerceptwarning@{\let\nointerceptwarning@=\relax
+ \xywarning@{perhaps no curve intersection, or many. }}
+\xydef@\intercepthull@{\nointerceptwarning@
+ \expandafter\def\expandafter\prevnext@\expandafter{\next}%
+ \splinetestcvxhull@}
+\xydef@\splinetestcvxhull@{\begingroup
+ \X@c=\L@c \Y@c=\U@c \splinetrace@{hull:}\xysidesofinterval@
+ \expandafter\ifx\next \expandafter\splineoutsidehull@@
+ \else \expandafter\splineinsidehull@\fi}
+\xydef@\splineinsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}%
+ \noexpand\interceptinsidehull@}\tmp@ }
+\xydef@\interceptinsidehull@{\edef\prevhowclose@{\howclose@}%
+ \splinedecast@@ }
+{\xdef\next{\the\maxdimen}}
+\xylet@\prevhowclose@=\next
+\xydef@\splineoutsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}%
+ \noexpand\interceptoutsidehull@}\tmp@}
+\xylet@\splineoutsidehull@@=\splineoutsidehull@
+\xydef@\interceptoutsidehull@{\dimen@=\howcvxclose@ \relax
+\splinetrace@{OUTSIDE HULL: \the\dimen@ : (\howclose@)(\prevhowclose@)}%
+ \let\splinedecast@=\splinedecast@@
+ \let\splinerec@\splineHnear@test
+ \let\splineadvance@\splineIadvance@@
+ \splinedecast@@ }
+\xydef@\splineHnear@test{%
+ \xysidesofhull@ \DN@{\splinedecast@}%
+ \ifdim\howclose@<\prevhowclose@\edef\howclose@{\prevhowclose@}\fi
+ \expandafter\if\this@-%
+ \expandafter\ifx\next\DN@{\splineclosest@}\fi
+ \else
+ \expandafter\ifx\next\DN@{\splineadvance@}\fi
+ \fi
+ {\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\next@
+ \else\aftergroup\splineclosest@
+\splinetrace@{too close: (\the\X@p,\the\Y@p)::(\the\X@c,\the\Y@c)}%
+ \fi}}
+\xydef@\cubicoutsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}}\tmp@
+ \edef\prevhowcvxclose@{\howcvxclose@}\begingroup
+ \X@p=\R@c \Y@p=\D@c \splinetrace@{hullii:}\xysidesofinterval@
+ \expandafter\ifx\next \expandafter\cubicoutsidehull@i
+ \else \expandafter\cubicinsidehull@\fi}
+\xydef@\cubicinsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howclose@{\howclose@}}\tmp@
+ \cubicoutsidehull@ii }
+\xydef@\cubicoutsidehull@i{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}}\tmp@
+ \dimen@=\prevhowcvxclose@\relax
+ \ifdim\dimen@<\howcvxclose@ \relax
+ \edef\howcvxclose@{\the\dimen@}\expandafter\interceptoutsidehull@
+ \else \expandafter\cubicoutsidehull@ii\fi }
+\xydef@\cubicoutsidehull@ii{%
+ \def\splineadvance@{\splineadvance@@}%
+ \def\splinepoint\endgroup{\endgroup
+ \global\let\splinepoint=\relax
+ \def\splineadvance@{\intercepthull@}}%
+ \splinedecast@@ }%
+\xydef@\splineHadvance@{\futurelet\next@\splineHadvance@i}
+\xydef@\splineHadvance@i{\ifx\next@\endgroup
+ \expandafter\splineHadvance@x\else\expandafter\splineclosest@\fi}
+\xydef@\splineHadvance@x{\edef\tmp@{\endgroup
+ \def\noexpand\prevhowclose@{\prevhowclose@}%
+ \def\noexpand\prevnext@{\next}\def\noexpand\howcvxclose@{\howclose@}}%
+ \tmp@ \dimen@=\prevhowclose@ \relax
+ \ifdim\dimen@<\howclose@ \relax \DN@{\splineclosest@\begingroup}%
+ \else\ifdim\howcvxclose@=\dimen@\DN@{\splineclosest@\begingroup}%
+ \else\DN@{\splineadvance@@\begingroup}\fi\fi \next@ }
+\xydef@\xyclearcrv@{\cv@end\cv@restore\loop@
+ \expandafter\let\csname cv@\number\crv@cnt@\endcsname\relax
+ \ifnum\crv@cnt@>0\advance\crv@cnt@\m@ne\repeat@
+ \let\cv@start=\relax \let\cv@end=\relax \let\cv@restore=\relax \POS}
+\xylet@\clearcurve=\xyclearcrv@
+\xylet@\numcontrolpts=\xynumctrlpts@
+\xydef@\xycontrolpt@#1{{%
+ \ifnum#1<\z@\aftergroup\cv@restore\aftergroup\cv@start
+ \else
+ \expandafter\count@\xycrvptsnum@\relax \advance\count@\@ne
+ \ifnum#1>\count@ \ifx\cv@end\relax
+ \expandafter\aftergroup\csname cv@\number#1\endcsname
+ \else\aftergroup\cv@end\fi
+ \else
+ \expandafter\ifx\csname cv@\number#1\endcsname\relax
+ \ifnum#1=\z@\aftergroup\cv@start\else\aftergroup\cv@end\fi
+ \else\expandafter\aftergroup\csname cv@\number#1\endcsname
+ \fi\fi\fi}}%
+\xylet@\xycontrolpt=\xycontrolpt@
+\xydef@\startxycurve@@{\crv@cnt@=\z@
+ \edef\cv@start{\cfromthep@}%
+ \ifdim\zz@\R@c \ifdim\zz@\L@c \ifdim\zz@\D@c \ifdim\zz@\U@c
+ \Edge@c={\zeroEdge}\fi\fi\fi\fi
+ \edef\cv@end{\cfromthec@}%
+ \edef\cv@restore{\pfromthep@\basefromthebase@}}
+\xylet@\startxycurve@=\startxycurve@@
+\xylet@\cv@start=\relax
+\xylet@\cv@end=\relax
+\xylet@\cv@restore=\relax
+\xydef@\readxycurve@{\startxycurve@\xycrvmods@}
+\xylet@\readxycurve=\readxycurve@
+\xydef@\addtocrv@{\advance\crv@cnt@\@ne
+ \edef\tmp@{%
+ \expandafter\noexpand\csname cv@\number\crv@cnt@\endcsname}%
+ \expandafter\edef\tmp@{\cfromthec@}%
+ \edef\tmp@{\noexpand\addtocrvpts@{\noexpand\def
+ \expandafter\noexpand\tmp@{\X@c=\the\X@c \Y@c=\the\Y@c }}}\tmp@
+ \edef\xycrvptsnum@{\the\crv@cnt@}%
+}
+\xydef@\xycrvdrop@{ {\zerodot}}
+\xydef@\xycrvconn@{}
+\xydef@\xyc@trlpts@{\def\xycrvdrop@{ \dir{x}}\def\xycrvconn@{}%
+ \afterCURVE{\savecrvobjects@\xyctrlpts@}\readxycurve@}
+\xydef@\xyc@trlpts@@{%
+ \afterCURVE{\savecrvobjects@\def\xycrvdrop@{ \dir{x}}%
+ \def\xycrvconn@{}\xyctrlpts@}\readxycurve@}
+\xydef@\xyc@vxhull@{\def\xycrvdrop@{ {}}%
+ \edef\xycrvconn@{ \noexpand\dir{\addDASH@{}}}%
+ \afterCURVE{\savecrvobjects@\xycvxhull@}\readxycurve@}
+\xydef@\xyc@vxhull@@{%
+ \afterCURVE{\savecrvobjects@\def\xycrvdrop@{ {}}%
+ \edef\xycrvconn@{ \noexpand\dir{\addDASH@{}}}\xycvxhull@}\readxycurve@}
+\xylet@\controlpts=\xyc@trlpts@
+\xylet@\convexhull=\xyc@vxhull@
+\xydef@\savecrvobjects@{\bgroup
+ \expandafter\toks@\expandafter{\xycrvdrop@}%
+ \expandafter\toks@ii\expandafter{\xycrvconn@}%
+ \edef\tmp@{\egroup\noexpand\def\noexpand\resetcrvobjects@{%
+ \noexpand\def\noexpand\xycrvdrop@{\the\toks@}%
+ \noexpand\def\noexpand\xycrvconn@{\the\toks@ii}%
+ }}\tmp@}
+\xydef@\afterCURVE#1{\def\afterCURVE@{#1}}
+\xydef@\endxycurve@{\cv@end\savectrlptsnum@
+ \expandafter\def\csname params@\endcsname{\the\crvpts@}%
+ \cv@restore\afterCURVE@\POS}
+\xylet@\endcurve=\endxycurve@
+\xydef@\xyctrlpts@{\cv@end \cv@restore
+ \def\crvconnect@{\straitconnect@}%
+ \ifnum\crv@cnt@>\z@
+ \count@@@=\@ne \DN@{\loop@\xycontrolpt@{\count@@@}\relax
+ \expandafter\xycvxhulldrop@\xycrvdrop@
+ \ifnum\crv@cnt@>\count@@@\advance\count@@@\@ne\repeat@
+ \cv@end \cv@restore }%
+ \else\DN@{\relax}\fi \next@ }
+\xylet@\xyctrlpts=\xyctrlpts@
+\xydef@\addtocrvpts@#1{\crvpts@=\expandafter{\the\crvpts@#1}}
+\xydef@\savescope@{\crvpts@={}%
+ \edef\tmp@{\expandafter\noexpand\csname cv@0\endcsname}%
+ \edef\tmp@{\noexpand\addtocrvpts@{\noexpand\def
+ \expandafter\noexpand\tmp@{\X@c=\the\X@p \Y@c=\the\Y@p}}}%
+ \tmp@ }
+\xydef@\savectrlptsnum@{%
+ \advance\crv@cnt@\@ne \edef\tmp@{%
+ \expandafter\noexpand\csname cv@\number\crv@cnt@\endcsname}%
+ \edef\tmp@{\noexpand\addtocrvpts@{\noexpand\def
+ \expandafter\noexpand\tmp@{\X@c=\the\X@c \Y@c=\the\Y@c}}}\tmp@
+ \advance\crv@cnt@\m@ne
+ \edef\tmp@{\expandafter\noexpand\csname ptsnum@\endcsname}%
+ \edef\tmp@{\noexpand\addtocrvpts@{%
+ \noexpand\def\expandafter\noexpand\tmp@{\number\crv@cnt@}}}%
+ \tmp@ }
+\xydef@\xycvxhull@{\cv@end \cv@restore
+ \addtocrvpts@{\def\crvconnect@{\straitconnect@}}%
+ \def\crvconnect@{\straitconnect@}%
+ \ifnum\crv@cnt@>\z@
+ \count@@@=\@ne\relax \DN@{\loop@\xycontrolpt@{\count@@@}\relax
+ \expandafter\xycvxhulldrop@\xycrvdrop@
+ {\expandafter\connect\xycrvconn@{}}\pfromc@
+ \ifnum\crv@cnt@>\count@@@\relax \advance\count@@@\@ne\repeat@
+ \cv@end }%
+ \else
+ \ifx\empty\xycrvconn@
+ \edef\xycrvconn@{\noexpand!C\noexpand\dir{\addDASH@{}}}\fi
+ \DN@{\relax}\fi \next@
+ {{\expandafter\connect\xycrvconn@{}}}%
+ \cv@end \cv@restore }
+\xylet@\xycvxhull=\xycvxhull@
+\xydef@\xycvxhulldrop@#1#{\drop@{#1}}
+\xydef@\savespline@{%
+\splinetrace@{savespline@:}%
+ \edef\endspline@{\endgroup
+ \savesplineparams@ \savesplinerefs@
+ \X@min=\the\X@min\relax \X@max=\the\X@max\relax
+ \Y@min=\the\Y@min\relax \Y@max=\the\Y@max\relax
+ \ifInvisible@\noexpand\Invisible@true
+ \else\noexpand\Invisible@false\fi
+ }\endspline@
+ \edef\tmp@{\noexpand\addtocrvpts@{\savesplineparams@}}\tmp@
+ \xycontrolpt@\z@ \cv@end }
+\xydef@\savesplineparams@{%
+ \noexpand\def\expandafter\noexpand\xysplineedges@{\xysplineedges@}}
+\xydef@\savesplinerefs@{%
+ \noexpand\def\noexpand\xysplineparams@{%
+ \expandafter\noexpand\xysplineparams@}%
+ \noexpand\def\noexpand\xysplineedges@{%
+ \expandafter\noexpand\xysplineedges@}%
+}
+\xynew@{box}\splinebox@
+\xynew@{dimen}\splineval@
+\xynew@{dimen}\splinedepth@
+\xynew@{dimen}\splinetol@
+\xynew@{dimen}\splinelength@
+\xynew@{if}\ifsplinefar@
+\xynew@{if}\ifsplineplot@
+\xydef@\splinetracing{\let\splinetrace@=\W@}
+\xydef@\splineignore@#1{}
+\xylet@\splinetrace@=\splineignore@
+\xydef@\readsplineparams@{%
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+ \expandafter\expandafter\expandafter\getsplineedges@safe\xysplineedges@ @@}
+\xydef@\getsplineedges@safe#1@@{\DN@{#1}%
+ \ifx\next@\empty \DN@{\getsplineedges@.0pt;0.0pt,0.0pt;0.0pt,}%
+ \else \DN@{\getsplineedges@safe@#1@@}\fi \next@}
+\xydef@\getsplineedges@safe@#1;#2,#3@@{\DN@{#3}%
+\splinetrace@{getsplineedges@safe}%
+ \ifx\next@\empty \DN@{\getsplineedges@#1;#2,0.0pt;0.0pt,}%
+ \else \DN@{\getsplineedges@#1;#2,#3}\fi \next@}
+\xydef@\getsplineedges@#1;#2,#3;#4,{%
+ \global\dimen@i=#1\global\dimen5=#2\relax
+ \dimen@=#3\multiply\dimen@\m@ne \advance\dimen@\splinelength@
+ \global\dimen3=\dimen@
+ \dimen@=#4\relax
+ \ifdim\dimen@>\p@ \xywarning@{edge out-of-range: \the\dimen@}%
+ \count@=\dimen@ \divide\count@\p@
+ \advance\dimen@-\count@\p@ \multiply\dimen@\m@ne
+ \advance\dimen@ \count@\p@ \advance\dimen@\p@
+\splinetrace@{\the\dimen@}%
+ \else
+ \multiply\dimen@\m@ne \advance\dimen@\p@
+ \fi
+ \global\dimen7=\dimen@ }
+\xydef@\dimen@half{%
+ \advance\dimen@ \ifdim\dimen@<\z@-\fi 1sp \divide\dimen@\tw@}
+\xydef@\halve@dimen#1{\dimen@=#1\relax \dimen@half #1=\dimen@}
+\xydef@\dimen@nth#1#2{\dimen@=#2\relax \dimen@ii=#1sp
+ \advance\dimen@ \ifdim\dimen@<\z@-\fi.5\dimen@ii
+ \divide\dimen@ by#1\relax #2=\dimen@}
+\xydef@\splinetolerance@#1{\dimen@=#1\relax
+ \ifdim\dimen@>\z@ \splinetol@=\dimen@
+ \else\splinetol@=.4\p@\fi}
+\xylet@\splinedefaulttol@=\relax
+\xydef@\splinetolerance#1{\splinetolerance@{#1}%
+ \edef\splinedefaulttol@{\splinetol@=\the\splinetol@}}
+\splinetolerance\z@
+\xydef@\SloppyCurves{\splinetolerance{.8\p@}}
+\xydef@\xylowtolerance@{\splinedefaulttol@
+ \ifdim\splinetol@<\p@ \divide\splinetol@\tw@ \fi}
+\xywarnifdefined\splinedrop@
+\xydef@\setstdsplinedrop@{%
+ \setbox\splinebox@=\hbox\bgroup
+ \setboxz@h{\expandafter\object\xycrvdrop@{}}%
+ \splinedefaulttol@ \dimen@=\wd\z@ \dimen@ii=\ht\z@ \advance\dimen@ii\dp\z@
+ \ifdim\dimen@ii>\dimen@ \dimen@=\dimen@ii \fi \dimen@=1.4142\dimen@
+ \ifdim\dimen@>\splinetol@ \splinetol@=\dimen@\else\dimen@=\splinetol@\fi
+ \dimen@=.5\wd\z@
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \kern-\dimen@ \Drop@@ \kern\dimen@
+ \edef\tmp@{\egroup \splinetol@=\the\splinetol@
+ \ifInvisible@\noexpand\Invisible@true
+ \else\noexpand\Invisible@false\fi}\tmp@
+ \edef\splinedefaulttol@{\splinetol@=\the\splinetol@}%
+ \def\splinedrop@{\copy\splinebox@\splineextra@@}}
+\xywarnifdefined\splineconn@
+\xydef@\stdsplineconn@{{\setsplinedir@
+ \setboxz@h\bgroup\expandafter\object\xycrvconn@{}%
+ \edef\tmp@{\egroup\L@c=\the\L@c \R@c=\the\R@c \D@c=\the\D@c \U@c=\the\U@c
+ \noexpand\def\noexpand\Drop@@}\expandafter\tmp@\expandafter{\Drop@@}%
+ \setboxz@h{\kern-\L@c \boxz@}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \Drop@@}}
+\xydef@\setcrvobjects@{\setstdsplinedrop@ \def\splineconn@{\stdsplineconn@}}
+\xylet@\splineextra@@=\relax
+\xydef@\splinenear@#1#2#3#4{{\d@X=#1\advance\d@X-#2%
+ \ifdim\d@X<\z@ \d@X=-\d@X\fi
+ \ifdim\splinetol@<\d@X \aftergroup\splinefar@true
+ \else \d@Y=#3\advance\d@Y-#4\ifdim\d@Y<\z@ \d@Y=-\d@Y\fi
+ \ifdim\splinetol@<\d@Y\aftergroup\splinefar@true
+ \else \xydist@\d@X\d@Y
+ \ifdim\splinetol@<\dimen@ \aftergroup\splinefar@true
+ \else
+ \ifdim\dimen@<.1\splinetol@\aftergroup\splinetooclose@\fi
+ \fi\fi\fi}}
+\xydef@\splineadvance@@{\global\advance\splineval@\splinedepth@}
+\xydef@\splinetooclose@{\aftergroup\aftergroup\aftergroup\splinetooclose@@}
+\xydef@\splinetooclose@@{\def\splineplotpt@{\relax}}
+\xydef@\splinepoint@@{%
+\splinetrace@{P@:(\the\X@c,\the\Y@c)::\the\splineval@;\the\splinedepth@}%
+ {\splinetest@\ifsplineplot@\relax\else\aftergroup\splinecontinue\fi}}
+\xydef@\splinepoint@{%
+ {\splinetest@\ifsplineplot@\aftergroup\splinecontinue\fi}}
+\xylet@\splinepoint=\splinepoint@
+\xydef@\splinecontinue@{%
+ \global\let\splinepoint=\splinepoint@@
+ \global\let\splinecontinue=\splinecontinue@@}
+\xydef@\splinecontinue@@{%
+ \global\let\splinepoint=\splinepoint@
+ \global\let\splinecontinue=\relax}
+\xylet@\splinecontinue=\splinecontinue@
+\xydef@\splineknotpoint@{{\X@p=\X@c \Y@p=\Y@c \cv@start
+ \the\Edge@c\@ne \ifInside@\else\aftergroup\splineknotpoint@@\fi}}%
+\xydef@\splineknotpoint@@{{\X@p=\X@c \Y@p=\Y@c \cv@end
+ \the\Edge@c\@ne \ifInside@\else \aftergroup\splinepoint\fi}}%
+\xylet@\firstsplinepoint@=\splineknotpoint@
+\xylet@\lastsplinepoint@= \splineknotpoint@
+\xydef@\splined@@@{%
+\splinetrace@{finding end types}%
+\splinetrace@{bstartPLACE@:\bstartPLACE@; bendPLACE@:\bendPLACE@}%
+ \DN@{\splinescan@}\ifx\bstartPLACE@\empty
+ \ifx\bendPLACE@\relax\def\bendPLACE@{1}\fi
+ \else\ifx\bstartPLACE@\relax
+ \else\ifx\bstartPLACE@\undefined
+ \else
+ \DN@{\splinescanbreak@}\ifx\bendPLACE@\relax\def\bendPLACE@{1}\fi
+ \DNii@{0}\ifx\bstartPLACE@\nextii@
+ \DNii@{1}\ifx\bendPLACE@\nextii@\DN@{}%
+ \fi\fi
+ \fi\fi\fi \next@ }%
+\xydef@\splineStarttest@{{\X@p=\X@c \Y@p=\Y@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineEndtest@{{\X@p=\X@c \Y@p=\Y@c \cv@end \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineBreakStarttest@{{\X@p=\X@c \Y@p=\Y@c \cv@brstart \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineBreakEndtest@{{\X@p=\X@c \Y@p=\Y@c \cv@brend \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+\xylet@\splineStarttest=\splineStarttest@
+\xylet@\splineEndtest=\splineEndtest@
+\xydef@\splineSlowStarttest{{\X@p=\X@c \Y@p=\Y@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@maybe@@\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineSlowEndtest{{\X@p=\X@c \Y@p=\Y@c \cv@end \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@maybe@@\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineplot@maybe{\splineplot@false}%
+\xylet@\splineplot@maybe@@=\splineplot@maybe
+\xydef@\splinescan@{\bgroup%
+ \expandafter\def\xysplineedges@{\z@;\z@,\z@;\z@,}%
+ \bgroup \cv@start
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \gdef\splineedges@{\z@;\z@,}%
+ \else\aftergroup\splinestartScan@\fi
+ \egroup \relax
+ \bgroup \cv@end
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@
+ \getcrvsegsnum@ \edef\segmentnum@{\the\count@}%
+ \splineval@=\z@ \splineRecordEndValue@
+ \else\aftergroup\splineendScan@\fi
+ \egroup \egroup
+ \expandafter\testsplineedges@\splineedges@;,@@%
+ \expandafter\edef\xysplineedges@{\splineedges@}%
+ \global\let\splineedges@=\relax
+\splinetrace@{edge params: \xysplineedges@}}%
+\xydef@\testsplineedges@#1;#2,#3;#4,#5@@{%
+ \DN@{#5}\ifx\next@\empty
+ \DNii@{#4}\ifx\nextii@\empty
+ \xynoedgespline@{end}\def\splineedges@{#1;#2,\z@;\z@,}\fi
+ \DNii@{#2}\ifx\nextii@\empty
+ \xynoedgespline@{start}\def\splineedges@{\z@;\z@,\z@;\z@,}\fi
+ \fi }
+\xydef@\xynoedgespline@#1{\xywarning@{#1 edge of spline not found}}%
+\xydef@\splinestartScan@{\bgroup
+\splinetrace@{scan for start}%
+ \global\let\splineadvance@=\splineadvance@@
+ \let\spline@start=\splinefindStart@
+ \let\spline@end=\spline@end@@
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\splinelength@=\z@
+ \def\splinerec@{\let\splinerec@=\splineSrec@ \splinedecast@@}%
+ \edef\splineedges@{}%
+ \expandafter\let\xysplineedges@\relax
+ \xylowtolerance@ \splined@@
+ \ifx\splineedges@\empty\expandafter\splineslowScan@\fi
+ \ifx\splineedges@\relax\expandafter\splinenostart@\fi
+ \egroup }%
+\xydef@\splineslowScan@{%
+ \let\splineStarttest=\splineSlowStarttest
+ \let\splinescanStarttest=\relax
+ \def\splinerec@{\let\splinerec@=\splineSrec@ \splinedecast@@}%
+ \splined@@ }
+\xydef@\splineslowEnd@{%
+ \global\let\splineEndtest=\splineSlowEndtest
+ \let\splinescanEndtest=\relax
+ \def\splinerec@{\let\splinerec@=\splineErec@ \splinedecast@@}%
+ \splined@@ }
+\xydef@\splinenostart@{%
+ \def\segmentnum@{1}\splinelength@=\z@ \splineval@=\z@
+ \xynoedgespline@{start}\splineRecordValue@ }
+\xydef@\splineendScan@{\bgroup
+ \bgroup
+\splinetrace@{scan for end}%
+ \global\let\splineadvance@=\splineadvance@@
+ \let\spline@start=\splinefindEnd@
+ \let\spline@end=\spline@end@@
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\splinelength@=\z@
+ \global\let\splineEndtest=\splineEndtest@
+ \def\splinerec@{\let\splinerec@=\splineErec@ \splinedecast@@}%
+ \expandafter\def\expandafter\prevedges@\expandafter{\splineedges@}%
+ \xylowtolerance@ \splined@@
+ \ifx\splineedges@\prevedges@\expandafter\splineslowScan@\fi
+ \egroup \egroup}
+\xydef@\splinescanbreak@{%
+\splinetrace@{SCANBREAK}%
+ \gdef\breakedges@{}%
+ \DN@{0}\ifx\next@\bstartPLACE@
+ \DN@{\bgroup \def\tmp@####1;####2,####3;####4,{%
+ \global\splineval@=####2\relax}%
+ \expandafter\expandafter\expandafter\tmp@\xysplineedges@
+ \def\segmentnum@{1}\splineRecordBreakValue@ \egroup}%
+ \else
+ \bgroup \cv@start
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \aftergroup\splinezerostart
+ \else\aftergroup\splinewidestart\fi
+ \egroup
+ \fi \next@
+ \DN@{1}\ifx\next@\bendPLACE@
+ \DN@{\bgroup \def\tmp@####1;####2,####3;####4,{%
+ \global\splineval@=####4\relax}%
+ \expandafter\expandafter\expandafter\tmp@\xysplineedges@
+%% \multiply\splineval@\m@ne \advance\splineval@\p@
+%% \def\segmentnum@{1}
+ \getcrvsegsnum@ \edef\segmentnum@{\the\count@}%
+ \global\multiply\splineval@\count@
+ \splineRecordEndBreakValue@ \egroup}%
+ \else
+ \bgroup \cv@end
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \aftergroup\splinezeroend
+ \else\aftergroup\splinewideend\fi
+ \egroup
+ \fi \next@
+ \expandafter\def\expandafter
+ \xybreakedges@\expandafter{\breakedges@}%
+ \global\let\breakedges@=\relax
+\splinetrace@{break params: \xybreakedges@::\bstartPLACE@--\bendPLACE@}%
+ \expandafter\let\xysplineedges@\xybreakedges@ }
+\xydef@\getcrvsegsnum@{%
+ \count@=\ptsnum@\relax \ifnum\count@>\@ne\advance\count@\m@ne\fi}
+\xydef@\splinezerostart{\DN@{\bgroup
+\splinetrace@{splinezerostart:}%
+ \dimen@=\bstartPLACE@\p@
+ \global\splineval@=\dimen@
+ \splineRecordBreakValue@ \egroup }}
+\xydef@\splinezeroend{\DN@{\bgroup
+\splinetrace@{splinezeroend:}%
+ \dimen@=\bendPLACE@\p@
+ \multiply\dimen@\m@ne \advance\dimen@\p@
+ \def\segmentnum@{0}\global\splineval@=\dimen@
+ \splineRecordEndBreakValue@ \egroup }}
+\xydef@\splinewidestart{\DN@{\bgroup
+ \splinetrace@{scan for start}%
+ \let\splinefbcontinue@=\breakstartcontinue@
+ \let\splinef@pt=\splinef@breakpt
+ \let\splinef@end=\break@start
+ \edef\tmp@{{\bstartPLACE@}}%
+ \expandafter\splinealong@@\tmp@\z@>\endgroup\egroup }}
+\xydef@\splinewideend{\DN@{\bgroup
+ \splinetrace@{scan for wide end}%
+ \let\splinefbcontinue@=\breakendcontinue@
+ \let\splinef@pt=\splinef@breakpt
+ \let\splinef@end=\break@end
+ \edef\tmp@{{\bendPLACE@}}%
+ \expandafter\splinealong@@\tmp@\z@<\endgroup\egroup }}
+\xydef@\splineSrec@{{%
+\splinetrace@{v=\the\splineval@ + d=\the\splinedepth@ :
+ (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c):Srec }%
+ \splineStarttest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \global\advance\splineval@ .5\splinedepth@
+ \else\aftergroup\splinedecast@@ \fi
+ \else \aftergroup\splineadvance@ \fi}}
+\xydef@\splinefindStart@@{\bgroup \bgroup
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinepoint=\relax
+ \let\splinegoal@=\splineRecordValue@ \global\dimen5=\z@
+ {\X@c=\X@p \Y@c=\Y@p \splinescanStarttest }%
+}
+\xydef@\splinefindStart@{%
+ \expandafter\crv@cnt@\xycrvptsnum@\relax
+ \ifnum\crv@cnt@>\tw@
+ \crv@cnt@=\@ne \splineplot@false \splinesegment@{\crv@cnt@}%
+ {\splineStarttest
+ \ifsplineplot@\aftergroup\splineplot@true\fi}%
+ \ifsplineplot@ \else \searchforStartsegment@ \fi
+ \splinesegment@{\crv@cnt@}%
+\splinetrace@{start is in segment \segmentnum@}%
+ \else \splinesegment@\@ne \fi
+ \splineplot@false \splinefindStart@@
+}
+\xydef@\searchforStartsegment@{\splineplot@true\loop@
+ \advance\crv@cnt@\@ne
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@=\crv@cnt@\expandafter\splineplot@false
+ \else
+ \splinesegment@{\crv@cnt@}{\splineStarttest
+ \ifsplineplot@\aftergroup\splineplot@false
+ \else\aftergroup\splineplot@true\fi }%
+ \fi \ifsplineplot@\repeat@
+}
+\xydef@\splinefindEnd@@{\bgroup \bgroup
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+\splinetrace@{params:\xysplineparams@}%
+ \splinereverse@@
+\splinetrace@{params:\xysplineparams@}%
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinepoint=\splinescanEndtest
+ \let\splinegoal@=\splineRecordEndValue@ \global\dimen5=\z@
+ {\X@c=\X@p \Y@c=\Y@p \splinescanEndtest }%
+}
+\xydef@\splinereverse@@{\splinereverse@@@}
+\xydef@\splinereverse@@@{%
+ \def\postspline@{\d@X=-\d@X \d@Y=-\d@Y}%
+ \dimen@ii=\X@c \X@c=\X@p \X@p=\dimen@ii
+ \dimen@ii=\Y@c \Y@c=\Y@p \Y@p=\dimen@ii
+ \global\dimen5=-\dimen5\relax
+ \global\advance\dimen5\splinelength@ }
+\xydef@\postspline@{}
+\xydef@\splineErec@{{%
+ \dimen@=\splineval@ \advance\dimen@\splinedepth@
+\splinetrace@{ER (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+\the\dimen@,\the\splinedepth@}%
+ \splineEndtest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \else\aftergroup\splinedecast@@ \fi
+ \else \aftergroup\splineadvance@ \fi}}
+\xydef@\splinefindEnd@{%
+ \expandafter\crv@cnt@\xycrvptsnum@\relax
+ \ifnum\crv@cnt@>\tw@
+ \advance\crv@cnt@\m@ne
+ \splineplot@false \splinesegment@{\crv@cnt@}%
+ {\X@c=\X@p \Y@c=\Y@p \splineEndtest
+ \ifsplineplot@\aftergroup\splineplot@true\fi }%
+ \ifsplineplot@
+ \else \searchforEndsegment@ \fi
+ \splinesegment@{\crv@cnt@}%
+\splinetrace@{end is in segment: \segmentnum@ }%
+ \else \splinesegment@\@ne \fi
+ \splineplot@false\splinefindEnd@@
+}
+\xydef@\searchforEndsegment@{\splineplot@true\loop@
+ \advance\crv@cnt@\m@ne
+ \ifnum\crv@cnt@=\z@\expandafter\splineplot@false
+ \else
+ \splinesegment@{\crv@cnt@}{\X@c=\X@p \Y@c=\Y@p \splineEndtest
+ \ifsplineplot@\aftergroup\splineplot@false
+ \else\aftergroup\splineplot@true\fi}%
+ \fi \ifsplineplot@\repeat@
+}
+\xydef@\splinescanStarttest{%
+\splinetrace@{SST (\the\X@c,\the\Y@c); \the\splinelength@, \the\splineval@}%
+ {\splineplot@false\splineStarttest
+ \ifsplineplot@\expandafter\splinefinish@\fi}}
+\xydef@\splinescanEndtest{%
+\splinetrace@{SET (\the\X@c,\the\Y@c); \the\splinelength@, \the\splineval@}%
+ {\splineplot@false\splineEndtest
+ \ifsplineplot@\expandafter\splinefinish@\fi}}
+\xydef@\splineBrec@{{%
+ \dimen@=\splineval@ \advance\dimen@\splinedepth@
+\splinetrace@{BR (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+\the\dimen@,\the\splinedepth@}%
+ \splineEndtest
+ \ifsplineplot@ \aftergroup\splineadvance@ \else
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \else\aftergroup\splinedecast@@ \fi \fi}}
+\xydef@\splineBSrec@{{%
+\splinetrace@{SR (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+\the\dimen@,\the\splinedepth@:SR}%
+ \splineStarttest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \global\advance\splineval@ .5\splinedepth@
+ \else \advance\splineval@\splinedepth@
+ \splinetest@ \advance\splineval@-\splinedepth@
+ \ifsplineplot@\aftergroup\splineadvance@
+ \else\aftergroup\splinedecast@@\fi
+ \fi
+ \else
+ \global\advance\splineval@\splinedepth@
+ \aftergroup\splinefinish@ \fi }}
+\xydef@\splineBErec@{{%
+ \dimen@=\splineval@ \advance\dimen@\splinedepth@
+\splinetrace@{BE (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+ \the\dimen@,\the\splinedepth@}%
+ \splineEndtest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \global\advance\splineval@ .5\splinedepth@
+ \else \advance\splineval@\splinedepth@
+ \splinetest@ \advance\splineval@-\splinedepth@
+ \ifsplineplot@\aftergroup\splineadvance@
+ \else\aftergroup\splinedecast@@\fi
+ \fi
+ \else
+ \ifdim\splinedepth@<\p@ \global\advance\splineval@\splinedepth@ \fi
+ \aftergroup\splinefinish@ \fi }}
+\xydef@\splinef@breakpt#1{%
+ \ifdim\splineval@>\z@
+\splinetrace@{found: val=\the\splineval@;(\the\X@c,\the\Y@c)}%
+ \else
+\splinetrace@{found: val=\the\splineval@;(\the\X@p,\the\Y@p)}%
+ \fi \splinefbcontinue@ }
+\xydef@\splinef@pt@@{%
+ \ifdim\splineval@>\z@
+\splinetrace@{found: val=\the\splineval@;c:(\the\X@c,\the\Y@c)}%
+ \global\dimen@i=\X@c \global\dimen3=\Y@c
+ \else
+\splinetrace@{found: val=\the\splineval@;p:(\the\X@p,\the\Y@p)}%
+ \fi
+ \setsplinedir@ \global\dimen5=\d@X \global\dimen7=\d@Y
+ \global\splineval@=\splineval@
+ \aftergroup\splinefocus@ }
+\xydef@\findbreakwarning@#1{%
+ \xywarning@{#1 of break not found: bSTART=\bstartPLACE@, bEND=\bendPLACE@}%
+ \DN@{#1}\def\DNii@{start}\ifx\next@\nextii@\splineRecordBreakValue@
+ \else\splineRecordEndBreakValue@\fi\egroup}%
+\xydef@\breakstartcontinue@{\bgroup \cv@start
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \aftergroup\breakstartfound@
+ \else \aftergroup\breakstartcontinue@i\fi \egroup }%
+\xydef@\breakstartcontinue@i{%
+\splinetrace@{move to start edge, from (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splineEndtest=\splineBreakStarttest@
+ \global\let\splinetest@=\splineBreakStarttest@
+ \gdef\splinerec@{\global\let\splinerec@=\splineSrec@ \splinedecast@@}%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\checkfoundSbreak@
+ \global\let\splinegoal@=\splineRecordSBreakValue@
+ \global\let\splinefinish@=\splinefinish@@ }
+\xydef@\breakstartfound@{%
+\splinetrace@{found start edge, at (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splinetest@=\splineStarttest
+ \gdef\splinerec@{\splinegoal@ \global\let\splinerec@=\splinefinish@ }%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\relax
+ \global\let\splinegoal@=\splineRecordBreakValue@
+ \global\let\splinefinish@=\splinefinish@@
+ }
+\xydef@\checkfoundSbreak@{%
+ \ifnum\xycrvptsnum@<\thr@@\DN@{\findbreakwarning@{start}}%
+ \else\DN@{\searchBreakSsegment@}\fi \next@ }%
+\xydef@\searchBreakSsegment@{%
+ \crv@cnt@=\segmentnum@ \DN@{}\count@=\crv@cnt@
+ \DNii@{}\ifnum\splineval@=\z@ \ifnum\crv@cnt@=\@ne
+ \ifnum\xycrvptsnum@=\@ne\count@=\z@\DNii@{\egroup}\fi
+ \else \DN@{\egroup}\fi
+ \else \ifnum\splineval@=\m@ne
+ \else \advance\crv@cnt@\@ne \fi \fi
+ \ifnum\crv@cnt@=\xycrvptsnum@\relax
+ \ifnum\xycrvptsnum@>\tw@ \DNii@{\egroup}\fi
+ \DN@{\expandafter\splineRecordBreakValue@\nextii@}%
+ \else
+ \DN@{\splinesegment@{\crv@cnt@}\splinesetparams@
+ \splined@@ \egroup}%
+ \fi \next@ }
+\xydef@\checkfoundEbreak@{%
+ \ifnum\xycrvptsnum@<\thr@@\DN@{\findbreakwarning@{end}}%
+ \else\DN@{\searchBreakEsegment@}\fi \next@ }%
+\xydef@\searchBreakEsegment@{%
+ \crv@cnt@=\segmentnum@ \DN@{}\count@=\crv@cnt@
+ \DNii@{}\ifnum\splineval@=\z@ \ifnum\crv@cnt@=\@ne
+ \ifnum\xycrvptsnum@=\@ne\count@=\z@\DNii@{\egroup}\fi
+ \else\DN@{\egroup}\fi
+ \else \advance\crv@cnt@\m@ne \fi
+ \ifnum\count@=\z@
+ \ifnum\xycrvptsnum@>\tw@ \splineval@=\m@ne\p@
+ \DNii@{\egroup}\fi
+ \DN@{\expandafter\splineRecordEndBreakValue@\nextii@}\else
+ \DN@{\splinesegment@{\crv@cnt@}\splinereverse@
+ \readsplineparams@ \splined@@ \egroup}%
+ \fi \next@ }
+\xydef@\break@start{\egroup \egroup
+\splinetrace@{scan for start}%
+ \global\let\splineadvance@=\splineadvance@@
+ \let\spline@start=\splinefindBStart@
+ \let\spline@end=\egroup
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinepoint=\relax
+ \let\splinegoal@=\splineRecordBreakValue@
+ \global\dimen5=\z@ \global\splinelength@=\z@
+ \let\splinerec@=\splineSrec@
+ \def\breakedges@{}%
+ \bgroup \bgroup \splined@@ }
+\xydef@\splinefindBStart@{\bgroup
+ \global\splineval@=\z@ \splinedepth@=.5\p@}
+\xydef@\breakendcontinue@{\bgroup
+ \edef\tmp@{\X@p = \the\X@c \Y@p=\the\Y@c}\cv@end\tmp@
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \aftergroup\breakendfound@
+ \else\aftergroup\breakendcontinue@i\fi \egroup }%
+\xydef@\breakendcontinue@i{%
+\splinetrace@{move to end edge, from (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splineEndtest=\splineBreakEndtest@
+ \global\let\splinetest@=\splineBreakEndtest@
+ \gdef\splinerec@{\global\let\splinerec@=\splineErec@\splinedecast@@}%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\checkfoundEbreak@
+ \global\let\splinegoal@=\splineRecordEBreakValue@
+ \global\let\splinefinish@=\splinefinish@@
+ \splinerec@ }
+\xydef@\splineRecordEBreakValue@{%
+\splinetrace@{\the\count@\space segments, \the\splineval@}%
+ \splineRecordEndBreakValue@ }
+\xydef@\splineRecordSBreakValue@{\getcrvsegsnum@
+ \dimen@=\splineval@
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@ \def\segmentnum@{1}%
+ \splineRecordBreakValue@ }
+\xydef@\breakendfound@{%
+\splinetrace@{found end edge, at (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splinetest@=\splineEndtest
+ \gdef\splinerec@{\splinegoal@ \global\let\splinerec@=\splinefinish@}%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\relax
+ \global\let\splinegoal@=\splineRecordEndBreakValue@
+ \global\let\splinefinish@=\splinefinish@@ }
+\xydef@\break@end{\egroup \egroup
+ \global\let\splineadvance@=\splineadvance@@
+ \let\spline@start=\splinefindBEnd@
+ \let\spline@end=\egroup
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinegoal@=\splineRecordEndBreakValue@
+ \global\splinelength@=\z@
+ \let\splinerec@=\splineErec@
+ \global\let\splineEndtest=\splineEndtest@
+ \bgroup \splined@@ }
+\xydef@\splinefindBEnd@{\bgroup\bgroup
+ \splinereverse@ \readsplineparams@
+ \global\splineval@=\z@ }
+\xydef@\splineRecordValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else
+ \getcrvsegsnum@
+ \dimen@=\splineval@ \advance\dimen@ \segmentnum@\p@
+ \advance\dimen@-\p@ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@
+ \fi
+ \xdef\splineedges@{\splineedges@\the\splinelength@;\the\splineval@,}%
+\splinetrace@{found edge: \splineedges@}}
+\xydef@\splineRecordEndValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else
+ \getcrvsegsnum@
+ \dimen@=\splineval@ \advance\dimen@ \count@\p@
+ \advance\dimen@-\segmentnum@\p@ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@
+ \fi
+ \xdef\splineedges@{\splineedges@\the\splinelength@;\the\splineval@,}%
+\splinetrace@{found edge: \splineedges@}}
+\xydef@\splineRecordBreakValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else\expandafter\advance\expandafter\splineval@\segmentnum@\p@
+ \count@=\segmentnum@\relax
+ \ifnum\count@>0 \advance\splineval@-\p@ \fi\fi
+ \xdef\breakedges@{\breakedges@\the\splinelength@;\the\splineval@,}%
+ \global\let\spline@end=\egroup
+\splinetrace@{found break edge: \breakedges@}}
+\xydef@\splineRecordEndBreakValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else\count@=\segmentnum@\relax \ifnum\count@=\z@
+ \else \getcrvsegsnum@
+ \count@@=\count@ \advance\count@@-\segmentnum@\relax
+ \dimen@=\splineval@ \advance\dimen@ \count@@\p@
+ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@
+ \fi\fi
+ \ifdim\splineval@<\z@ \relax\splineval@=\z@ \fi
+ \ifx\breakedges@\relax\relax\else\ifx\breakedges@\empty\else
+ \ifdim\splineval@<\p@\relax \ifdim\splineval@>\z@
+ \expandafter\testbreakedges@\breakedges@ @%
+ \fi\fi\fi\fi
+ \xdef\breakedges@{\breakedges@\the\splinelength@;\the\splineval@,}%
+ \global\let\spline@end=\egroup
+\splinetrace@{found break edge: \breakedges@}}
+\xydef@\testbreakedges@#1;#2,#3@{\bgroup \dimen@=#2\relax
+ \advance\dimen@\splineval@ \advance\dimen@-\p@
+\splinetrace@{testbreak: #1;#2,#3@ \the\splineval@::\the\dimen@}%
+ \DN@{\egroup}\ifdim\dimen@>\z@
+ \edef\next@{\egroup\def\noexpand\breakedges@{#1;1pt,#3}}%
+ \else\ifdim\zz@\dimen@
+ \edef\next@{\egroup\def\noexpand\breakedges@{#1;1pt,#3}}%
+ \fi \fi \next@ }
+\xydef@\splineRecordBreakEValue{%
+ \ifdim\splineval@>\z@
+ \splineval@=-\splineval@ \advance\splineval@\p@ \fi
+ \splineRecordBreakValue@ }%
+\xydef@\xydist@#1#2{\ifdim#1>#2\relax
+ \quotient@@\tmp@#2#1\expandafter\dimen@ii\tmp@#2\relax
+ \ifdim\dimen@ii>.41422#1\relax
+ \dimen@=1.060665#1\advance\dimen@ .353555\dimen@ii\relax
+ \else \dimen@=#1\advance\dimen@.5\dimen@ii\fi
+ \else
+ \quotient@@\tmp@#1#2\expandafter\dimen@ii\tmp@#1\relax
+ \ifdim\dimen@ii>.41422#2\relax
+ \dimen@=1.060665#2\advance\dimen@ .353555\dimen@ii\relax
+ \else \dimen@=#2\advance\dimen@.5\dimen@ii\fi
+ \fi}
+\xydef@\splineDadvance@{\splineadvance@@
+ \expandafter\splineDadvance@@\splineDadvance@@@}
+\xydef@\splineDadvance@@#1#2#3#4{%
+ {\d@X=#1\advance\d@X-#2\ifdim\d@X<\z@ \d@X=-\d@X\fi
+ \d@Y=#3\advance\d@Y-#4\ifdim\d@Y<\z@ \d@Y=-\d@Y\fi
+ \xydist@\d@X\d@Y
+ \global\advance\splinelength@\dimen@
+\splinetrace@{d=(\the\d@X,\the\d@Y): v=\the\splineval@: l=\the\splinelength@}%
+}}
+\xydef@\spline@end@{\lastsplinepoint@ \egroup \egroup
+ \ht\z@=\z@ \dp\z@=\z@ \wdz@=\z@ \boxz@}%
+\gdef\splinetest@{\splineplot@true}
+\xydef@\spline@end@@{\egroup \egroup}
+\xydef@\splinefrec@{{%
+ \advance\splineval@\splinedepth@
+\splinetrace@{F:(\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;
+\the\splineval@;\the\splinedepth@}%
+ \ifdim\dimen5=\splineval@ \aftergroup\splinefinishf@
+ \else \dimen@=\dimen5\advance\dimen@-\splineval@
+ \ifdim\dimen@<\z@ \dimen@=-\dimen@ \fi
+ \ifdim\dimen@<.0001\p@ \aftergroup\splinefinishf@
+ \else
+ \ifdim\dimen5<\splineval@\aftergroup\splinedecast@@
+ \else \aftergroup\splineadvance@
+ \fi\fi\fi}}
+\xydef@\splinefinishf@{\global\advance\splineval@\splinedepth@
+ \splinefinish@}%
+\xydef@\spline@find#1#2#3{%
+\splinetrace@{spline@find #1 #2 #3}%
+ \readsplineparams@
+ \global\let\splinefinish@=\splinefinish@@
+ \global\let\splinegoal@=\splinef@pt
+ \global\let\splinepoint=\relax
+ \dimen@=#1\relax\dimen@ii=#2\relax
+ \ifdim\dimen@ii=\z@ \def\postfind@{}%
+ \else\def\postfind@{}%
+ \ifdim\dimen@ii<\z@ \splinereverse@
+ \readsplineparams@
+\splinetrace@{reverse orientation: (\the\X@p,\the\Y@p),(\the\X@c,\the\Y@c)}%
+ \dimen@=#1\relax\dimen@ii=#2\relax
+ \multiply\dimen@\m@ne \advance\dimen@\p@ \multiply\dimen@ii\m@ne
+ \def\postfind@{\d@X=-\the\d@X \d@Y=-\the\d@Y \noexpand\reversesplineval@}%
+ \fi\fi
+ \expandafter\splinetrace@\expandafter{\xysplineparams@}%
+ \edef\next@{\noexpand\spline@@find{\the\dimen@}{\the\dimen@ii}{#3}}%
+ \next@ }
+\xydef@\reversesplineval@{\splineval@=-\splineval@ \advance\splineval@\p@ }
+\xydef@\spline@@find#1#2#3{%
+\splinetrace@{spline@@find #1 #2 #3}%
+ \let\splinerec@=\splinefrec@
+ \global\let\splineadvance@=\splineadvance@@
+ \dimen5=#1\relax
+ \ifdim #2=\z@\relax
+ \ifdim #1=\z@\relax \bgroup
+ \let\splined@@=\spline@@knot
+ \global\splineval@=\m@ne\p@
+ \else\ifdim #1=\p@\relax \bgroup
+ \let\splined@@=\spline@@knot
+ \global\splineval@=\z@
+ \else
+ \global\splineval@=\z@
+ \global\let\splineadvance@=\splineadvance@@
+ \DN@{#3}\ifx\next@\empty \setsplinetest@\splineval@>{#1}{}%
+ {{\ifdim\splineval@=\dimen5\aftergroup\splineplot@false\fi}}%
+ \else\DNii@{>}\ifx\next@\nextii@
+ \setsplineundertest@\splineval@>{#1}{}{}%
+ \let\splinerec@=\splineBSrec@
+ \else\DNii@{<}\ifx\next@\nextii@
+ \setsplineundertest@\splineval@>{#1}{}{}%
+ \let\splinerec@=\splineBErec@
+ \else\xywarning@{unknown find-mode: #3}\fi\fi\fi
+ \fi\fi
+ \else
+ \global\splineval@=\z@
+ \def\splineslidetest@@{%
+ \setsplinetest@\splinelength@<{#2}{}{}}%
+ \let\splinefinish@=\splinefcontinue@
+ \fi
+ \let\spline@end=\splinef@end
+ \let\splinepoint@=\relax
+ \splinelength@=\z@
+ \def\spline@start{\bgroup\xylowtolerance@}%
+ \splined@@ }
+\xydef@\spline@@knot{%
+ \let\setsplinedir@=\setsplineknotdir@
+ \splinesetparams@\spline@start
+ \splinedepth@=\p@
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \splinefinishf@ \spline@end \egroup }
+\xydef@\splinefcontinue@{%
+\splinetrace@{sliding... from (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splinerec@=\splinerec@@
+ \global\splinelength@=\z@
+ \global\splineval@=\splineval@
+ \global\let\splinepoint=\splinefindtest@
+ \global\let\splinegoal@=\splinef@pt
+ \global\let\splineadvance@=\splineDadvance@
+ \global\let\splinefinish@=\splinefinish@@
+ \splineslidetest@@
+ }
+\xydef@\splinefindtest@{%
+\splinetrace@{SFT (\the\X@c,\the\Y@c); \the\splinelength@, \the\splineval@}%
+ {\splineplot@false\splinetest@
+ \ifsplineplot@\expandafter\splinefinishf@\fi}}
+\def\setsplineundertest@#1#2#3#4#5{%
+\splinetrace@{setsplineundertest@: #1,#2,#3,#4,#5,}%
+ \DNii@{\gdef\splinetest@}%
+ \DN@##1\next{\def\tmp@{{\splineplot@false
+ \ifdim#1#2##1\relax #4\else\splineplot@true#5\fi }}}%
+ \next@#3\relax\next
+ \expandafter\nextii@\tmp@ }
+\xydef@\splinef@end{\edef\tmp@{\egroup\splinelength@=\the\splinelength@}\tmp@}
+\xydef@\splinef@pt{%
+ \ifdim\splineval@>\z@
+\splinetrace@{found: val=\the\splineval@;c:(\the\X@c,\the\Y@c)}%
+ \global\dimen@i=\X@c \global\dimen3=\Y@c
+ \else
+\splinetrace@{found: val=\the\splineval@;p:(\the\X@p,\the\Y@p)}%
+ \fi
+ \setsplinedir@ \global\dimen5=\d@X \global\dimen7=\d@Y
+ \global\splineval@=\splineval@
+ \aftergroup\splinefocus@ }
+\def\setsplinetest@#1#2#3#4#5{%
+ \DNii@{\gdef\splinetest@}%
+ \DN@##1\next{\def\tmp@{{\splineplot@false \ifdim#1#2##1\relax
+ #4\else\splineplot@true#5\fi}}}%
+ \next@#3\relax\next
+ \expandafter\nextii@\tmp@ }%
+\xydef@\splinefocus@{%
+ \d@X=\dimen5\relax \d@Y=\dimen7\relax \setsplinedir@ }
+\xydef@\splinesegment@#1{}
+\xydef@\xyprecurve@{}
+\xydef@\xypostcurve@{}
+\xydef@\splineset@{%
+\splinetrace@{splineset@:}%
+ \ifx\bstartPLACE@\empty
+ \DN@{\xyprecurve@
+ \edef\tmp@{\egroup \X@max=\the\X@max \X@min=\the\X@min
+ \Y@max=\the\Y@max \Y@min=\the\Y@min}\tmp@ \xypostcurve@ }%
+ \else
+ \DN@{\xyprecurve@ \xysplinespecialcases@
+ \edef\tmp@{\egroup \X@max=\the\X@max \X@min=\the\X@min
+ \Y@max=\the\Y@max \Y@min=\the\Y@min}\tmp@ \xypostcurve@ }%
+ \fi
+ \next@ }
+\xydef@\xysplinespecialcases@{%
+ \ifx\empty\xycrvdrop@
+ \ifx\empty\xycrvconn@ \DN@{\splinesolid@}%
+ \else \DN@{ \dir{-}}\ifx\next@\xycrvconn@ \DN@{\splinesolid@}%
+ \else \DN@{ \dir 2{-}}\ifx\next@\xycrvconn@ \DN@{\splinedoubled@}%
+ \else \DN@{ \dir{=}}\ifx\next@\xycrvconn@ \DN@{\splineribboned@}%
+ \else \DN@{ \dir {2.}}\ifx\next@\xycrvconn@ \DN@{\splinedoubled@}%
+ \else \DN@{ \dir 3{-}}\ifx\next@\xycrvconn@ \DN@{\splinetrebled@}%
+ \else \DN@{ \dir {3.}}\ifx\next@\xycrvconn@ \DN@{\splinetrebled@}%
+ \else \DN@{ \dir{--}}\ifx\next@\xycrvconn@ \DN@{\splinedashed@}%
+ \else \DN@{ \dir{.}}\ifx\next@\xycrvconn@ \DN@{\splinedotted@}%
+ \else \DN@{ \dir{:}}\ifx\next@\xycrvconn@ \DN@{\splinedbldotted@}%
+ \else \ifdim\splinetol@>\z@ \else \splinedefaulttol@ \fi
+ \DN@{\splineset@@}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \else
+ \DN@{\splineset@@}%
+ \fi \ifInvisible@\DN@{}\fi \next@ }
+\xydef@\splinesolid@{\setbox\splinebox@=\zerodot \def\xycrvdrop@{ }%
+ \def\xycrvconn@{}\splineset@@}
+\xydef@\splinedoubled@{\splinedefaulttol@\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \def\xycrvconn@{!C\dir2{.}}\splineset@@}
+\xydef@\splineribboned@{\splinedefaulttol@\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \def\xycrvconn@{!C\dir{:}}\splineset@@}
+\xydef@\splinetrebled@{\splinedefaulttol@\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \def\xycrvconn@{!C\dir3{.}}\splineset@@}
+\xydef@\splinedashed@{\splinetol@=1.5pc \def\xycrvdrop@{ }%
+ \def\splinedrop@{}\edef\xycrvconn@{\noexpand!C\noexpand\dir{\addDASH@{}}}%
+ \splineset@@}
+\xydef@\splinedotted@{\setbox\splinebox@=\zerodot \def\xycrvdrop@{ }%
+ \splinetol@=1.5\jot \def\xycrvconn@{}\splineset@@}
+\xydef@\splinedbldotted@{\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \splinetol@=1.5\jot \def\xycrvconn@{!C\dir{:}}\splineset@@}
+\xydef@\splineset@@{%
+ \readsplineparams@
+ \ifx\xycrvdrop@\empty \splinetol@=7.5\p@
+ \def\splinedefaulttol@{\splinetol@=7.5\p@}\def\splinedrop@{}%
+ \else\edef\splinedefaulttol@{\splinetol@=\the\splinetol@}\fi
+ \ifx\xycrvconn@\empty \def\splineconn@{}\fi
+\splinetrace@{set the curve: >\the\dimen5, <\the\dimen7}%
+ \global\let\splineadvance@=\splineadvance@@
+ \let\splinerec@=\splineTrec@
+ \def\splineStarttest{\splinetest@}%
+ \global\let\splinepoint=\relax
+ \let\spline@start=\spline@start@
+ \let\spline@end=\spline@end@
+ \ifdim\dimen7=\p@
+ \gdef\splinecontinue{\splinesetting@
+ \global\let\splinetest@=\splineplot@true}%
+ \else
+ \ifdim\dimen7=\tw@\p@
+%% \ifdim\bendPLACE@\p@=\z@ \emptyspline@ \else
+ \ifdim\bendPLACE@\p@=\p@
+ \fi
+ \else
+ \xdef\splinecontinue{\noexpand\setsplinetest@
+ \splineval@>{\the\dimen7}{\noexpand\splinebreakcancel@}{}%
+ \noexpand\splinesetting@ }%
+ \fi\fi
+ \ifdim\dimen7>\z@ \DN@{\splinesetting@\splinecontinue}%
+ \ifdim\zz@{\dimen5}%
+ \else
+ \edef\next@{\noexpand\setsplinetest@
+ \splineval@<{\the\dimen5}{}%
+ {\noexpand\expandafter\noexpand\splinecontinue}%
+ \noexpand\splinesetting@ }%
+ \fi
+ \else\DN@{\dimen5=\p@}\fi
+ \next@
+ \ifdim\dimen5=\p@\DN@{}\else\DN@{\splined@@}\fi \next@
+ }
+\xydef@\emptyspline@{\xywarning@{empty curve subsegment}%
+\splinetrace@{bstartPLACE@=\bstartPLACE@, bendPLACE@=\bendPLACE@,
+ empty segment}%
+ \gdef\splinecontinue{\splinesetting@
+ \global\let\splinetest@=\splineplot@false
+ \global\dimen5=\z@ }}
+\xydef@\splineTrec@{{%
+ \advance\splineval@\splinedepth@
+ \ifdim\dimen5=\splineval@
+ \aftergroup\splinecontinue
+ \else \dimen@=\dimen5\advance\dimen@-\splineval@
+ \ifdim\dimen@<\z@ \dimen@=-\dimen@ \fi
+ \ifdim\dimen@<.001\p@
+ \aftergroup\splinecontinue
+ \else
+ \ifdim\dimen5<\splineval@\aftergroup\splinedecast@@
+ \else \aftergroup\splineadvance@
+ \fi\fi\fi}}
+\xydef@\splinesetting@{\splinesetting@@}
+\xydef@\splinesetting@@{%
+\splinetrace@{splinesetting@@:}%
+ \ifdim\splinedepth@=\z@ \splinedepth@=\p@ \fi
+ \ifdim\splinedepth@=\p@
+ \def\splinerec@{\global\let\splinerec@=\splinerec@@\splinedecast@@}%
+ \else \global\let\splinerec@=\splinerec@@ \fi
+ \gdef\splinepoint{\splineplotpt@}}
+\xydef@\splineplotpt@{{\global\advance\dimen@i-\X@c
+ \splinetest@ \DN@{\splineglue@}\ifsplineplot@
+ \DN@{\dosplineplotpt@}%
+ \fi \next@ \global\dimen@i=\X@c \global\dimen3=\Y@c }}
+\xydef@\splineglue@{\hglue-\dimen@i
+\splinetrace@{N:(\the\X@c,\the\Y@c);;\the\dimen@i;\the\dimen3%
+ ,\the\splinelength@,\the\splineval@,\the\splinedepth@}}
+\xydef@\dosplineplotpt@{\ifdim\dimen@i<\z@
+ \raise\Y@c\hbox to-\dimen@i{\hfill\splinedrop@}%
+ \else \kern-\dimen@i\raise\Y@c\hbox{\splinedrop@}\fi
+ \ifx\splineconn@\relax\else\raise\Y@c\hbox{%
+ \setboxz@h{\splineconn@}\Drop@@}\fi
+\splinetrace@{P:(\the\X@c,\the\Y@c);;\the\dimen@i;\the\dimen3
+ ,\the\splinelength@,\the\splineval@,\the\splinedepth@}}
+\xydef@\splinefinish@@{\postspline@ \splinegoal@ \splinecancel@ }
+\xydef@\splinecancel@{%
+ \global\let\splinerec@=\relax
+ \global\let\splinepoint=\relax
+ \global\let\splinecontinue=\relax
+ \global\let\splinedecast@=\relax
+ }
+\xydef@\splinebreakcancel@{\bsplinecancel@ \splinecancel@}
+\xydef@\bsplinecancel@{\gdef\lastbspline@{\leave@\leave@}%
+ \global\let\middlebspline@=\lastbspline@ }
+\xydef@\splinegoal@{\ifdim\splineval@>\z@
+ \global\dimen@i=\X@c \global\dimen3=\Y@c \fi
+ \global\splineval@=\splineval@ \global\splinelength@=\splinelength@
+ \splinesetdir@ }
+\xylet@\splinefinish@\splinefinish@@
+\xylet@\splinewhich\splineDwhich@
+\xydef@\squinewhich@{%
+ \ifdim\dimen5>\squinelength
+ \d@X=\X@c \d@Y=\Y@c \advance\d@X-\L@c \advance\d@Y-\U@c
+ \advance\squineval-\squinedepth
+ \else \X@c=\X@p \Y@c=\Y@p \advance\squineval-\squinedepth
+ \d@X=\L@c \d@Y=\U@c \advance\d@X-\X@p \advance\d@Y-\Y@p \fi
+ \d@X=-\d@X \d@Y=-\d@Y
+ \squinefinish}
+\xydef@\squineDwhich@{%
+ \ifdim\dimen5>\squinelength
+ \d@X=\X@c \d@Y=\Y@c \advance\d@X-\L@c \advance\d@Y-\U@c
+ \else \X@c=\X@p \Y@c=\Y@p \advance\squineval-\squinedepth
+ \d@X=\L@c \d@Y=\U@c \advance\d@X-\X@p \advance\d@Y-\Y@p \fi
+ \d@X=-\d@X \d@Y=-\d@Y
+ \squinefinish}
+\xydef@\xyquadbezier@{%
+ \global\let\splinerec@=\relax
+ \addtocrvpts@{\def\crvconnect@{\squineconnect@}}%
+ \xyquadmethods@ \let\splinesegment@=\squinesegment@
+ \begingroup\setcrvobjects@ \xysplineparams@ \splined@@@
+ \bgroup \setupsquine@ \squined@ \splineset@ \savespline@ }
+\xydef@\xyquadmethods@{%
+ \def\crvconnect@{\squineconnect@}%
+ \def\splinereverse@@{\splinereverse@@@}%
+ \let\getsplineparams@=\getsquineparams@
+ \let\spline@start@=\squine@start@
+ \let\splinedecast@@=\squinedecast@
+ \let\splinerec@@=\squinerec@
+ \let\splined@@=\squined@@
+ \let\splineIpt@@=\squineIpt@
+ \let\splineIadvance@@=\squineIadvance@
+ \let\splineinfo@=\squineinfo@
+ \let\setsplinedir@=\setsquinedir@
+ \let\splinetestcvxhull@=\squinetestcvxhull@
+ \let\setsplineknotdir@=\setsquineknotdir@
+ \let\splinereverse@=\squinereverse@
+ \let\splineDadvance@@@=\squineDadvance@@@
+ \let\splinesetparams@=\squinesetparams@
+ \let\splineplot@maybe@@=\squineplot@maybe
+}
+\xydef@\squineconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\squinesegment@ }%
+\xydef@\squinesegment@#1{\xyquadmethods@ \def\segmentnum@{1}%
+ \setupsquine@ \squined@ }
+\xydef@\setupsquine@{%
+ \xycontrolpt@\z@ \X@p=\X@c \Y@p=\Y@c
+ \xycontrolpt@\@ne \A@=\X@c \B@=\Y@c
+ \xycontrolpt@\tw@
+ \ifdim \A@>\X@max
+ \dimen@=\X@p\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@>\X@max \X@max=\dimen@ \fi
+ \dimen@=\X@c\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@>\X@max \X@max=\dimen@ \fi
+ \else \ifdim \A@<\X@min
+ \dimen@=\X@p\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@<\X@min \X@min=\dimen@ \fi
+ \dimen@=\X@c\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@>\X@min \X@min=\dimen@ \fi
+ \fi\fi
+ \ifdim \B@>\Y@max
+ \dimen@=\Y@p\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@>\Y@max \Y@max=\dimen@ \fi
+ \dimen@=\Y@c\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@>\Y@max \Y@max=\dimen@ \fi
+ \else \ifdim \B@<\Y@min
+ \dimen@=\Y@p\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@<\Y@min \Y@min=\dimen@ \fi
+ \dimen@=\Y@c\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@>\Y@min \Y@min=\dimen@ \fi
+ \fi\fi }
+\xydef@\squinedecast@{\halve@dimen\splinedepth@
+ \R@c=\L@c \advance\L@c\X@p \halve@dimen\L@c
+ \advance\R@c\X@c \halve@dimen\R@c
+ \A@=\L@c \advance\A@\R@c \halve@dimen\A@
+ \D@c=\U@c \advance\U@c\Y@p \halve@dimen\U@c
+ \advance\D@c\Y@c \halve@dimen\D@c
+ \B@=\U@c \advance\B@\D@c \halve@dimen\B@
+ \begingroup \X@c=\A@ \Y@c=\B@ \splinerec@ \endgroup
+ \begingroup \X@c=\A@ \Y@c=\B@ \splinepoint \endgroup
+ \X@p=\A@ \L@c=\R@c \Y@p=\B@ \U@c=\D@c \splinerec@}
+\xydef@\squinerec@{{\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\squinedecast@
+ \else \aftergroup\splineadvance@ \fi}}
+\xydef@\squineDadvance@@@{\X@p\L@c\Y@p\D@c}
+\xydef@\squineplot@maybe{{\X@p=\L@c \Y@p=\U@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}
+\xydef@\setsquinedir@{%
+ \d@X=\X@c \advance\d@X-\L@c \d@Y=\Y@c \advance\d@Y-\U@c
+ \dimen@=\ifdim\d@X<\z@-\fi\d@X \ifdim\dimen@<.02\p@
+ \dimen@=\ifdim\d@Y<\z@-\fi\d@Y \ifdim\dimen@<.02\p@
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p \fi\fi
+ \ifdim\X@c=\X@p \ifdim\Y@c=\Y@p
+ \d@X=\L@c \advance\d@X-\X@p \d@Y=\U@c \advance\d@Y-\Y@p \fi\fi
+ \setupDirection@ii }
+\xydef@\setsquineknotdir@{%
+ \ifdim\zz@\splineval@ \expandafter \setsquinezerodir@
+ \else\expandafter \setsquinedir@ \fi }
+\xydef@\setsquinezerodir@{%
+ \d@X=\L@c \advance\d@X-\X@p \d@Y=\U@c \advance\d@Y-\Y@p
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi\fi \setupDirection@ii }
+\xydef@\getsquineparams@#1,#2,#3,#4,#5,#6,#7,{%
+ \splinelength@=#1\relax\X@p=#2\relax\Y@p=#3\relax
+ \A@=#4\relax\B@=#5\relax\X@c=#6\relax\Y@c=#7\relax
+}
+\xydef@\squineinfo@{%
+\expandafter\removePT@\the\X@c\space
+\expandafter\removePT@\the\Y@c\space
+\expandafter\removePT@\the\A@\space
+\expandafter\removePT@\the\B@\space
+\expandafter\removePT@\the\X@p\space
+\expandafter\removePT@\the\Y@p\space
+\expandafter\removePT@\the\dimen5\space\space
+\expandafter\removePT@\the\dimen7\space
+ }%
+\xydef@\squinereverse@{\readsplineparams@
+ \expandafter\edef\xysplineparams@{\the\splinelength@,%
+ \the\X@c,\the\Y@c,\the\A@,\the\B@,\the\X@p,\the\Y@p,}}%
+\xydef@\squine@start@{\setboxz@h\bgroup
+ \global\splinelength@=\z@ \global\dimen@i=\z@ \global\dimen3=\z@
+ \kern\X@p
+ {\squinesetparams@ \X@c=\X@p \Y@c=\Y@p \firstsplinepoint@
+ }\bgroup }
+\xydef@\squinesetparams@{%
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \L@c=\A@ \U@c=\B@ \R@c=\L@c \D@c=\U@c }%
+\xydef@\squined@{%
+ \expandafter\edef\xysplineparams@{%
+ \the\z@,\the\X@p,\the\Y@p,\the\A@,\the\B@,\the\X@c,\the\Y@c,}}
+\xydef@\squined@@{%
+ \splinedepth@=\p@
+ \global\splineval@=\z@
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \spline@start
+ \ifx\splinerec@\relax \let\splinerec@=\squinerec@\fi
+ \L@c=\A@ \U@c=\B@ \R@c=\L@c \D@c=\U@c
+ \splinerec@ \spline@end }
+\xydef@\xycubicbezier@{%
+ \addtocrvpts@{\def\crvconnect@{\cubicconnect@}}%
+ \xycubicmethods@ \let\splinesegment@=\cubicsegment@
+ \begingroup \setcrvobjects@ \xysplineparams@ \splined@@@
+ \bgroup \setupcubic@ \cubiced@ \splineset@ \savespline@ }
+\xydef@\xycubicmethods@{%
+ \def\crvconnect@{\cubicconnect@}%
+ \def\splinereverse@@{\cubicreverse@@}%
+ \let\getsplineparams@=\getcubicparams@
+ \let\spline@start@=\cubic@start@
+ \let\splinedecast@@=\cubicdecast@
+ \let\splinerec@@=\cubicrec@
+ \let\splined@@=\cubiced@@
+ \let\splineIpt@@=\cubicIpt@
+ \let\splineIadvance@@=\cubicIadvance@
+ \let\splineoutsidehull@@=\cubicoutsidehull@
+ \let\splinetestcvxhull@=\cubictestcvxhull@
+ \let\splineinfo@=\cubicinfo@
+ \let\setsplinedir@=\setcubicdir@
+ \let\setsplineknotdir@=\setcubicknotdir@
+ \let\splinereverse@=\cubicreverse@
+ \let\splineDadvance@@@=\cubicDadvance@@@
+ \let\splinesetparams@=\cubicsetparams@
+ \let\splineplot@maybe@@=\cubicplot@maybe
+ }
+\xydef@\cubicconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\cubicsegment@ }%
+\xydef@\cubicsegment@#1{\xycubicmethods@ \def\segmentnum@{1}%
+ \setupcubic@ \cubiced@ }
+\xydef@\setupcubic@{%
+ \xycontrolpt@\z@ \X@p=\X@c \Y@p=\Y@c
+ \xycontrolpt@\@ne \A@=\X@c \B@=\Y@c
+ \xycontrolpt@\tw@ \global\dimen3=\X@c \global\dimen5=\Y@c
+ \xycontrolpt@\thr@@
+ \adjustmaxmin@ }
+\xydef@\adjustmaxmin@{%
+ \ifdim \A@>\X@max \dimen@=\A@ \advance\dimen@\X@p \dimen@half
+ \ifdim\dimen@>\X@max \X@max=\dimen@ \fi \else
+ \ifdim \A@<\X@min \dimen@=\A@ \advance\dimen@\X@p \dimen@half
+ \ifdim\dimen@<\X@min \X@min=\dimen@ \fi \fi\fi
+ \ifdim \B@>\Y@max \dimen@=\B@ \advance\dimen@\Y@p \dimen@half
+ \ifdim\dimen@>\Y@max \Y@max=\dimen@ \fi \else
+ \ifdim \B@<\Y@min \dimen@=\B@ \advance\dimen@\Y@p \dimen@half
+ \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi \fi\fi
+ \ifdim \dimen3>\X@max \dimen@=\dimen3\advance\dimen@\X@c \dimen@half
+ \ifdim\dimen@>\X@max \X@max=\dimen@ \fi \else
+ \ifdim \dimen3<\X@min \dimen@=\dimen3\advance\dimen@\X@c \dimen@half
+ \ifdim\dimen@<\X@min \X@min=\dimen@ \fi \fi\fi
+ \ifdim \dimen5>\Y@max \dimen@=\dimen5\advance\dimen@\Y@c \dimen@half
+ \ifdim\dimen@>\Y@max \Y@max=\dimen@ \fi \else
+ \ifdim \dimen5<\Y@min \dimen@=\dimen5\advance\dimen@\Y@c \dimen@half
+ \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi \fi\fi
+ \dimen@=\A@ \advance\dimen@\dimen3 \dimen@half
+ \ifdim\dimen@>\X@max \X@max=\dimen@
+ \else \ifdim\dimen@<\X@min \X@min=\dimen@ \fi\fi
+ \dimen@=\B@ \advance\dimen@\dimen5 \dimen@half
+ \ifdim\dimen@>\Y@max \Y@max=\dimen@
+ \else \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi\fi
+}
+\xydef@\cubicdecast@{\halve@dimen\splinedepth@
+ \A@=\L@c \advance\A@\R@c \halve@dimen\A@
+ \advance\R@c\X@c \halve@dimen\R@c
+ \B@=\U@c \advance\B@\D@c \halve@dimen\B@
+ \advance\D@c\Y@c \halve@dimen\D@c
+ \advance\L@c\X@p \halve@dimen\L@c
+ \advance\U@c\Y@p \halve@dimen\U@c
+ \begingroup
+ \X@c=\R@c \advance\X@c\L@c \halve@dimen\X@c
+ \advance\X@c\A@ \halve@dimen\X@c
+ \Y@c=\D@c \advance\Y@c\U@c \halve@dimen\Y@c
+ \advance\Y@c\B@ \halve@dimen\Y@c
+ \R@c=\L@c \advance\R@c\A@ \halve@dimen\R@c
+ \D@c=\U@c \advance\D@c\B@ \halve@dimen\D@c
+ \bgroup \splinerec@
+ \egroup \splinepoint \endgroup
+ \X@p=\L@c \advance\X@p\R@c \halve@dimen\X@p
+ \advance\X@p\A@ \halve@dimen\X@p
+ \L@c=\R@c \advance\L@c\A@ \halve@dimen\L@c
+ \Y@p=\U@c \advance\Y@p\D@c \halve@dimen\Y@p
+ \advance\Y@p\B@ \halve@dimen\Y@p
+ \U@c=\D@c \advance\U@c\B@ \halve@dimen\U@c
+ \splinerec@ }
+\xydef@\cubicrec@{{\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\cubicdecast@
+ \else \aftergroup\splineadvance@ \fi}}
+\xydef@\cubicDadvance@@@{\X@p\X@c\Y@p\Y@c}
+\xydef@\cubicplot@maybe{{\X@p=\L@c \Y@p=\U@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\cubicplot@maybeii\else\aftergroup\splineplot@true\fi}}
+\xydef@\cubicplot@maybeii{{\X@p=\R@c \Y@p=\D@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}
+\xydef@\cubiced@@{%
+ \splinedepth@=\p@
+ \global\splineval@=\z@
+ \spline@start
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \splinerec@ \spline@end }
+\xydef@\setcubicdir@{%
+ \ifdim\splinedepth@<.001\p@\DN@{\cubiccoarsedir@}%
+ \else\DN@{\cubicfinedir@}\fi \next@ }
+\xydef@\cubicfinedir@{%
+ \d@X=\X@c \advance\d@X-\R@c \d@Y=\Y@c \advance\d@Y-\D@c
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\L@c \d@Y=\Y@c \advance\d@Y-\U@c
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi\fi \fi\fi
+ \setupDirection@ii
+\splinetrace@{dir:(\the\d@X,\the\d@Y),\the\Direction; depth:\the\splinedepth@}%
+}
+\xydef@\cubiccoarsedir@{%
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p \setupDirection@ii
+ \global\dimen5=\d@X \global\dimen7=\d@Y
+\splinetrace@{dir:(\the\d@X,\the\d@Y),\the\Direction; depth:\the\splinedepth@}%
+}
+\xydef@\setcubicknotdir@{%
+ \ifdim\zz@\splineval@ \DN@{\setcubiczerodir@}%
+ \else \DN@{\cubicfinedir@}\fi \next@ }
+\xydef@\setcubiczerodir@{%
+ \d@X=\L@c \advance\d@X-\X@p \d@Y=\U@c \advance\d@Y-\Y@p
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\R@c \advance\d@X-\X@p \d@Y=\D@c \advance\d@Y-\Y@p
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi\fi \fi\fi \setupDirection@ii }
+\xydef@\getcubicparams@#1,#2,#3,#4,#5,#6,#7,#8,#9,{%
+ \splinelength@=#1\relax\X@p=#2\relax\Y@p=#3\relax\L@c=#4\relax
+ \U@c=#5\relax\R@c=#6\relax\D@c=#7\relax\X@c=#8\relax\Y@c=#9\relax
+}%
+\xydef@\cubicinfo@{%
+\expandafter\removePT@\the\X@p\space
+\expandafter\removePT@\the\Y@p\space
+\expandafter\removePT@\the\L@c\space
+\expandafter\removePT@\the\U@c\space
+\expandafter\removePT@\the\R@c\space
+\expandafter\removePT@\the\D@c\space
+\expandafter\removePT@\the\X@c\space
+\expandafter\removePT@\the\Y@c\space
+\expandafter\removePT@\the\dimen5\space\space
+\expandafter\removePT@\the\dimen7\space
+ }%
+\xydef@\cubicreverse@{\readsplineparams@
+ \expandafter\edef\xysplineparams@{\the\splinelength@,%
+ \the\X@c,\the\Y@c,\the\R@c,\the\D@c,\the\L@c,\the\U@c,\the\X@p,\the\Y@p,}}%
+\xydef@\cubicreverse@@{%
+ \splinereverse@@@
+ \dimen@ii=\L@c \L@c=\R@c \R@c=\dimen@ii
+ \dimen@ii=\U@c \U@c=\D@c \D@c=\dimen@ii }
+\xydef@\cubic@start@{\setboxz@h\bgroup
+ \global\splinelength@=\z@ \global\dimen@i=\z@ \global\dimen3=\z@
+ \kern\X@p
+ {\cubicsetparams@ \X@c=\X@p \Y@c=\Y@p \R@c=\X@c \D@c=\Y@c
+ \firstsplinepoint@ }\bgroup
+}
+\xydef@\cubicsetparams@{%
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+ \global\dimen@i=\X@p \global\dimen3=\Y@p }
+\xydef@\cubiced@{%
+ \expandafter\edef\xysplineparams@{\the\z@,\the\X@p,\the\Y@p
+ ,\the\A@,\the\B@,\the\dimen3,\the\dimen5,\the\X@c,\the\Y@c,}%
+ }%
+\xydef@\xybspline@iii{%
+ \addtocrvpts@{\def\crvconnect@{\bsplineiiiconnect@}}%
+ \def\crvconnect@{\bsplineiiiconnect@}\xybsplinemethods@
+ \let\splinesegment@=\bsplinesegment@iii
+ \begingroup\setcrvobjects@ \dobspline@ \savespline@ }
+\xydef@\bsplineiiiconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\bsplinesegment@iii }%
+\xydef@\xybspline@iv{%
+ \addtocrvpts@{\def\crvconnect@{\bsplineivconnect@}}%
+ \def\crvconnect@{\bsplineivconnect@}\xybsplinemethods@
+ \let\splinesegment@=\bsplinesegment@iv
+ \begingroup\setcrvobjects@ \dobspline@ \savespline@ }
+\xydef@\bsplineivconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\bsplinesegment@iv }%
+\xydef@\xybspline@{%
+\splinetrace@{B-spline with \numcontrolpts\space control points.}%
+ \addtocrvpts@{\def\crvconnect@{\bsplineconnect@}}%
+ \def\crvconnect@{\bsplineconnect@}\xybsplinemethods@
+ \let\splinesegment@=\bsplinesegment@
+ \begingroup\setcrvobjects@
+ \dobspline@ \savespline@ }
+\xydef@\xybsplinemethods@{%
+ \def\splinereverse@@{\cubicreverse@@}%
+ \let\getsplineparams@=\getbsplineparams@
+ \let\spline@start@=\cubic@start@
+ \let\splinedecast@@=\cubicdecast@
+ \let\splinerec@@=\cubicrec@
+ \let\splineIpt@@=\cubicIpt@
+ \let\splineIadvance@@=\cubicIadvance@
+ \let\splined@@=\bsplined@@
+ \let\splineinfo@=\cubicinfo@
+ \let\setsplinedir@=\setcubicdir@
+ \let\setsplineknotdir@=\setcubicknotdir@
+ \let\splinereverse@=\cubicreverse@
+ \let\splineDadvance@@@=\cubicDadvance@@@
+ \let\splinesetparams@=\cubicsetparams@
+ \global\let\lastbspline@=\lastbspline@@
+ \global\let\middlebspline@=\middlebspline@@
+}
+\xydef@\bsplined@@{%
+ \splinedepth@=\p@
+ \global\splineval@=\z@
+ \spline@start
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \splinerec@ \spline@end }
+\xydef@\bsplineconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\bsplinesegment@ }%
+\xydef@\getbsplineparams@{\getcubicparams@}
+\xydef@\dobspline@{\xysplineparams@ \scanbspline@ \firstbspline@ }%
+\xydef@\firstbspline@{%
+ \enter@{\pfromthep@ \cfromthec@}\enter@{\cfromthec@}\bgroup
+ \def\segmentnum@{1}\xycontrolpt@\z@ \X@p=\X@c \Y@p=\Y@c
+\splinetrace@{0: \the\X@p, \the\Y@p}%
+ \xycontrolpt@\@ne \A@=\X@c \B@=\Y@c
+\splinetrace@{1: \the\X@c, \the\Y@c}%
+ \xycontrolpt@\tw@
+\splinetrace@{2: \the\X@c, \the\Y@c}%
+ \dimen@=\X@c \advance\dimen@\A@ \dimen@half
+ \global\dimen3=\dimen@
+ \dimen@=\Y@c \advance\dimen@\B@ \dimen@half
+ \global\dimen5=\dimen@
+ \xycontrolpt@{3}%
+\splinetrace@{3: \the\X@c, \the\Y@c}%
+ \expandafter\count@\xycrvcnt@\relax
+ \ifnum\count@=3\relax
+ \advance\X@c-\A@ \dimen@nth4\X@c
+ \advance\X@c\dimen3\relax
+ \advance\Y@c-\B@ \dimen@nth4\Y@c
+ \advance\Y@c\dimen5\relax
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \crv@cnt@=\@ne\relax
+ \noexpand\lastbspline@ }%
+ \else
+ \advance\X@c 7\dimen3 \advance\X@c-2\A@
+ \dimen@nth6\X@c
+ \advance\Y@c 7\dimen5 \advance\Y@c-2\B@
+ \dimen@nth6\Y@c
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \crv@cnt@=\@ne\relax
+ \noexpand\middlebspline@ }%
+ \fi \adjustmaxmin@ \czeroEdge@
+ \bsplined@ \splineset@ \leave@ }
+\xydef@\lastbspline@@{\bgroup
+ \advance\crv@cnt@\@ne \edef\segmentnum@{\the\crv@cnt@}%
+\splinetrace@{<: \the\X@p, \the\Y@p}%
+ \advance\crv@cnt@\@ne \xycontrolpt@{\crv@cnt@}%
+ \global\dimen3=\X@c \global\dimen5=\Y@c
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \advance\crv@cnt@\m@ne \xycontrolpt@{\crv@cnt@}%
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \A@=\X@c \advance\A@\dimen3 \halve@dimen\A@
+ \B@=\Y@c \advance\B@\dimen5 \halve@dimen\B@
+ \adjustmaxmin@ \leave@ \relax \cv@end
+\splinetrace@{>: \the\X@c, \the\Y@c}%
+ \bsplined@ \splineset@ \leave@ }%
+\xylet@\lastbspline@=\lastbspline@@
+\xydef@\middlebspline@@{%
+ \advance\crv@cnt@\@ne \edef\segmentnum@{\the\crv@cnt@}%
+\splinetrace@{<: \the\X@p, \the\Y@p}%
+ \bgroup
+ \xycontrolpt@{\crv@cnt@}\A@=2\X@c \B@=2\Y@c
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \advance\crv@cnt@\@ne \xycontrolpt@{\crv@cnt@}%
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \advance\A@\X@c \dimen@nth3\A@
+ \advance\B@\Y@c \dimen@nth3\B@
+ \advance\X@c\A@ \halve@dimen\X@c
+ \advance\Y@c\B@ \halve@dimen\Y@c
+ \global\dimen3=\X@c \global\dimen5=\Y@c
+ \advance\crv@cnt@\@ne \xycontrolpt@{\crv@cnt@}%
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \expandafter\count@\xycrvcnt@\relax
+ \ifnum\crv@cnt@<\count@\relax
+ \advance\X@c 7\dimen3\advance\X@c-2\A@
+ \dimen@nth6\X@c
+ \advance\Y@c 7\dimen5\advance\Y@c-2\B@
+ \dimen@nth6\Y@c
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \crv@cnt@=\segmentnum@\relax
+ \noexpand\middlebspline@}%
+ \else
+ \advance\X@c-\A@ \dimen@nth4\X@c
+ \advance\X@c \dimen3\relax
+ \advance\Y@c-\B@ \dimen@nth4\Y@c
+ \advance\Y@c \dimen5\relax
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \noexpand\lastbspline@}%
+ \fi \adjustmaxmin@
+ \bsplined@ \splineset@ \leave@ }
+\xylet@\middlebspline@=\middlebspline@@
+\xydef@\scanbspline@{\splined@@@}
+\xydef@\bsplined@{\cubiced@
+ \expandafter\ifx\xysplineedges@\relax\relax\DN@{}%
+ \else\DN@{\adjustbsplineedges@}\fi \next@ }
+\xydef@\adjust@forsegments@{\getcrvsegsnum@
+ \ifnum\count@>\@ne
+\splinetrace@{adjust for \the\count@\space segments:
+ \the\dimen5, \the\dimen7}%
+ \multiply\dimen5 by \count@\relax \dimen@=\segmentnum@\p@
+ \ifnum\dimen5>\dimen@ \relax\dimen5=\p@
+ \else \advance\dimen5-\segmentnum@\p@ \advance\dimen5 by\p@ \fi
+ \ifnum\dimen5<\z@ \relax\dimen5=\z@\relax\fi
+ \multiply\dimen7 by \count@\relax
+ \dimen@=\segmentnum@\p@
+ \ifnum\dimen7<\dimen@ \advance\dimen@-\p@
+ \ifnum\dimen7>\dimen@ \advance\dimen7-\dimen@
+ \else \dimen7=\z@ \fi
+ \else \dimen7=\p@ \fi
+\splinetrace@{adjusted for \the\count@\space segments:
+ \the\dimen5, \the\dimen7}%
+ \fi}
+\xydef@\adjustbsplineedges@{\bgroup
+\splinetrace@{** adjusting edges **}%
+ \readsplineparams@ \adjust@forsegments@
+\splinetrace@{params:\xysplineparams@}%
+\splinetrace@{segment \segmentnum@:<\the\dimen5,\the\dimen7>:\xysplineedges@}%
+ \multiply\dimen7by\m@ne \advance\dimen7by\p@
+ \expandafter\edef\xysplineedges@{%
+ \noexpand\z@;\the\dimen5,\noexpand\z@;\the\dimen7,}%
+ \edef\tmp@{\egroup
+ \noexpand\def\expandafter\noexpand\xysplineedges@{\xysplineedges@}}%
+ \tmp@ }
+\xydef@\bsegment@@ii@iii{%
+ \xycontrolpt@{\count@@}\global\dimen3=\X@c \global\dimen5=\Y@c
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\count@@\@ne \xycontrolpt@{\count@@}\A@=\X@c \B@=\Y@c
+ \advance\A@ by2\dimen3 \dimen@nth3\A@
+ \advance\B@ by2\dimen5 \dimen@nth3\B@
+ \dimen@=\dimen3 \advance\dimen@ by2\X@c
+ \dimen@nth3\dimen@
+ \global\dimen3=\dimen@
+ \dimen@=\dimen5 \advance\dimen@ by2\Y@c
+ \dimen@nth3\dimen@
+ \global\dimen5=\dimen@
+\splinetrace@{<: \the\dimen3, \the\dimen5}%
+\splinetrace@{>: \the\A@, \the\B@}%
+ \advance\count@@\m@ne }
+\xydef@\bsegment@@i{\bgroup
+ \advance\count@@\m@ne \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \advance\X@p-2\dimen3\advance\X@p by7\A@
+ \dimen@nth6\X@p
+ \advance\Y@p-2\dimen5\advance\Y@p by7\B@
+ \dimen@nth6\Y@p
+}
+\xydef@\bsegment@@iv{%
+ \advance\count@@\tw@ \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\X@c by7\dimen3\advance\X@c-2\A@
+ \dimen@nth6\X@c
+ \advance\Y@c by7\dimen5\advance\Y@c-2\B@
+ \dimen@nth6\Y@c
+\splinetrace@{>>: \the\X@c, \the\Y@c }%
+}
+\xydef@\bsegment@@ii@i{\bgroup
+ \advance\count@@\m@ne \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \advance\X@p-\dimen3\advance\X@p by4\A@
+ \dimen@nth4\X@p
+ \advance\Y@p-\dimen5\advance\Y@p by4\B@
+ \dimen@nth4\Y@p
+\splinetrace@{<<: \the\X@p, \the\Y@p}%
+}
+\xydef@\bsegment@@y@iv{%
+ \advance\count@@\tw@ \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\X@c by4\dimen3\advance\X@c-\A@
+ \dimen@nth4\X@c
+ \advance\Y@c by4\dimen5\advance\Y@c-\B@
+ \dimen@nth4\Y@c
+}
+\xydef@\bsegment@i{%
+ \xycontrolpt@\z@ \X@p=\the\X@c \Y@p=\the\Y@c
+\splinetrace@{0: \the\X@p \the\Y@p}%
+ \xycontrolpt@\@ne
+\splinetrace@{1: \the\X@c, \the\Y@c}\A@=\X@c \B@=\Y@c
+ \xycontrolpt@\tw@
+ \dimen@=\X@c \advance\dimen@\A@ \dimen@half
+ \global\dimen3=\dimen@
+\splinetrace@{2: \the\X@c, \the\Y@c}%
+ \dimen@=\Y@c \advance\dimen@\B@ \dimen@half
+ \global\dimen5=\dimen@ }
+\xydef@\bsegment@i@iv{%
+ \xycontrolpt@{3}%
+\splinetrace@{3: \the\X@c, \the\Y@c}%
+ \advance\X@c by7\dimen3\advance\X@c-2\A@
+ \dimen@nth6\X@c
+ \advance\Y@c by7\dimen5\advance\Y@c-2\B@
+ \dimen@nth6\Y@c
+ }
+\xydef@\bsegment@z{%
+ \expandafter\count@@\xycrvptsnum@ \advance\count@@\@ne
+ \xycontrolpt@{\the\count@@}\relax
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\count@@\m@ne
+ \bgroup
+ \xycontrolpt@{\the\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \global\dimen3=\X@c \global\dimen5=\Y@c
+ \advance\count@@\m@ne \xycontrolpt@{\the\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \A@=\X@c \advance\A@\dimen3 \halve@dimen\A@
+ \B@=\Y@c \advance\B@\dimen5 \halve@dimen\B@
+ \edef\tmp@{\egroup \A@=\the\A@ \B@=\the\B@ \count@@=\the\count@@}%
+ \tmp@ }
+\xydef@\bsegment@z@i{%
+ \expandafter\count@@\xycrvptsnum@\relax\advance\count@@-\tw@
+ \bgroup
+ \xycontrolpt@{\count@@}\X@p=\the\X@c \Y@p=\the\Y@c
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\X@p by7\A@ \advance\X@p-2\dimen3 \dimen@nth6\X@p
+ \advance\Y@p by7\B@ \advance\Y@p-2\dimen5 \dimen@nth6\Y@p
+ \edef\tmp@{\egroup \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \tmp@ }
+\xydef@\bsplinesegment@#1{\xybsplinemethods@
+ \count@@=#1\relax
+ \ifnum\count@@=\@ne
+ \bsegment@i \bsegment@i@iv
+ \else\ifnum\count@@=\tw@
+ \bsegment@@ii@iii \bsegment@@ii@i \bsegment@@iv
+ \else\expandafter\count@\xycrvptsnum@\advance\count@\m@ne
+ \ifnum\count@@=\count@
+ \bsegment@z \bsegment@z@i
+ \else\advance\count@\m@ne
+ \ifnum\count@@=\count@
+ \bsegment@@ii@iii \bsegment@@i \bsegment@@y@iv
+ \else
+ \bsegment@@ii@iii \bsegment@@i \bsegment@@iv
+ \fi\fi\fi\fi
+ \expandafter\def\expandafter\segmentnum@\expandafter{\number#1}%
+ \bsplined@ }
+\xydef@\bsplinesegment@iii#1{\xybsplinemethods@
+\splinetrace@{2 segments; \number#1}%
+ \count@@=#1\relax
+ \ifnum\count@@=\@ne \bsegment@i
+ \xycontrolpt@{3}%
+\splinetrace@{3: \the\X@c, \the\Y@c}%
+ \advance\X@c 4\dimen3\advance\X@c-\A@
+ \dimen@nth4\X@c
+ \advance\Y@c 4\dimen5\advance\Y@c-\B@
+ \dimen@nth4\Y@c
+ \else\ifnum\count@@=\tw@ \bsegment@z
+ \bgroup\xycontrolpt@{\@ne}%
+\splinetrace@{1: \the\X@c, \the\Y@c}%
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \advance\X@p 4\A@ \advance\X@p-\dimen3
+ \dimen@nth4\X@p
+ \advance\Y@p 4\B@ \advance\Y@p-\dimen5
+ \dimen@nth4\Y@p
+ \fi\fi
+ \expandafter\def\expandafter\segmentnum@\expandafter{\number#1}%
+ \bsplined@ }
+\xydef@\bsplinesegment@iv#1{\xybsplinemethods@
+\splinetrace@{3 segments; \number#1}%
+ \count@@=#1\relax
+ \ifnum\count@@=\@ne \bsegment@i \bsegment@i@iv
+ \else\ifnum\count@@=\tw@
+ \bsegment@@ii@iii \bsegment@@ii@i \bsegment@@y@iv
+ \else\ifnum\count@@=3\relax
+ \bsegment@z \bsegment@z@i
+ \fi\fi\fi
+ \expandafter\def\expandafter\segmentnum@\expandafter{\number#1}%
+ \bsplined@ }
+\message{circles,}
+\xydef@\Circmagic@@{0.5517847}
+\xylet@\Circmagic=\Circmagic@@
+\xydef@\twoPi@{6.2831852}
+\xydef@\fullPi@{3.1415926}
+\xydef@\halfPi@{1.5707963}
+\xynew@{dimen}\L@
+\xydef@\xycircle#1#{\hbox\bgroup\afterVECTORorEMPTY{%
+ \xy@@{\R@=\X@c \L@=\Y@c}\xycircle@}{\xy@@{\R@=\R@c \L@=\L@c}\xycircle@}#1@}
+\xydef@\xycircle@#1@#2{%
+ \DN@{#1}\ifx\next@\empty\def\onlyQuad@{}\else \count@=#1\relax
+ \ifnum\count@<5 \advance\count@-3\relax
+ \ifnum\count@<\z@ \advance\count@ 4\relax\fi \edef\onlyQuad@{\the\count@}%
+ \else\xyerror@{illegal circle <radius>: must be <vector> or <empty>}{}\fi
+ \fi \xy@@{\def\circleSTYLE@{#2}}\def\circleSTYLE@{#2}\xycircle@i}
+\xydef@\xycircle@i{\hbox{\vbox{\vskip\L@
+ \hbox to2\R@{\hfill \buildcircle@ \hfill}\vskip\L@ }}%
+ \L@c=\R@ \R@c=\R@ \D@c=\L@ \U@c=\L@ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}\Edge@c={\circleEdge}%
+ \OBJECT@x}
+\xydef@\adjustMinMaxcirc@#1#2{%
+ \dimen@=\X@c \advance\dimen@#1\relax\ifdim\dimen@>\X@max \X@max=\dimen@\fi
+ \dimen@=\X@c \advance\dimen@-#1\relax\ifdim\dimen@<\X@min \X@min=\dimen@\fi
+ \dimen@=\Y@c \advance\dimen@#2\relax\ifdim\dimen@>\Y@max \Y@max=\dimen@\fi
+ \dimen@=\Y@c \advance\dimen@-#2\relax\ifdim\dimen@<\Y@min \Y@min=\dimen@\fi
+}
+%% \cubicCircleControls@@
+\xydef@\cubicCircleControls@@{\X@origin=\z@ \Y@origin=\z@
+ \X@xbase=\R@ \Y@xbase=\z@ \X@ybase=\z@ \Y@ybase=\L@
+ \vfromcartesian@@1,0@\czeroEdge@\idfromc@{0@c}%
+ \vfromcartesian@@0,1@\czeroEdge@\idfromc@{1@c}%
+ \vfromcartesian@@-1,0@\czeroEdge@\idfromc@{2@c}%
+ \vfromcartesian@@0,-1@\czeroEdge@\idfromc@{3@c}%
+ \vfromcartesian@@1,\Circmagic@@ @\czeroEdge@\idfromc@{1@m}%
+ \vfromcartesian@@\Circmagic@@,1@\czeroEdge@\idfromc@{2@m}%
+ \vfromcartesian@@-\Circmagic@@,1@\czeroEdge@\idfromc@{3@m}%
+ \vfromcartesian@@-1,\Circmagic@@ @\czeroEdge@\idfromc@{4@m}%
+ \vfromcartesian@@-1,-\Circmagic@@ @\czeroEdge@\idfromc@{5@m}%
+ \vfromcartesian@@-\Circmagic@@,-1@\czeroEdge@\idfromc@{6@m}%
+ \vfromcartesian@@\Circmagic@@,-1@\czeroEdge@\idfromc@{7@m}%
+ \vfromcartesian@@1,-\Circmagic@@ @\czeroEdge@\idfromc@{8@m}%
+ }
+\xydef@\doCircleQuadrant@@#1#2{\save@ \ifcase#2\relax
+ \doCircleQuadrant@@@{0@c}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleQuadrant@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleQuadrant@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleQuadrant@@@{3@c}{7@m}{8@m}{0@c}{#1}\or
+ \doCircleQuadrant@@@{0@c}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleQuadrant@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleQuadrant@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleQuadrant@@@{3@c}{7@m}{8@m}{0@c}{#1}\fi \leave@ }
+\xydef@\doCircleQuadrant@@@#1#2#3#4#5{%
+ \cfromid@{#1}\pfromc@\senter@
+ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \let\bstartPLACE@=\empty \connect@\crvs{#5}\relax\sinit@\sleave@
+ \resetbreaks@}
+\xydef@\dosolidcircle@#1{%
+ \cubicCircleControls@@
+ \doCircleQuadrant@@{#1}1 \relax\Clast@@
+ \doCircleQuadrant@@{#1}2 \relax\Clast@@
+ \doCircleQuadrant@@{#1}3 \relax\Clast@@
+ \doCircleQuadrant@@{#1}4 \relax\Clast@@}%
+\xydef@\solidcircle@{\dosolidcircle@@}
+\xylet@\dosolidcircle@@=\dosolidcircle@
+\xydef@\circledobjects@{\cubicCircleControls@@
+ \setboxz@h{\expandafter\object\circleSTYLE@{}}%
+ \ifdim\L@>\R@ \dimen@ii=\ht\z@ \advance\dimen@ii \dp\z@
+ \ifdim\zz@\dimen@ii \dimen@ii=\wdz@\fi
+ \else \dimen@ii=\wdz@
+ \ifdim\zz@\dimen@ii \dimen@ii=\ht\z@ \advance\dimen@ii \dp\z@\fi
+ \fi \ifdim\zz@\dimen@ii \dimen@ii=2\jot\fi
+ \expandafter\dimen@\ifdim\L@>\R@ \twoPi@\L@\else \twoPi@\R@\fi
+ \advance\dimen@.5\dimen@ii
+ \count@@=\dimen@ \count@=\dimen@ii \divide\count@@\count@
+ \edef\numobjects{\the\count@@}\dimen@=4\p@
+ \dimen@nth\numobjects\dimen@
+ \edef\circleseparation@{\expandafter\removePT@\the\dimen@}%
+ \edef\circleplace@{-\circleseparation@}\placeQuadrants@}%
+\xydef@\placeQuadrants@{\DN@{\placeAllQuadrants@}%
+ \ifx\onlyQuad@\undefined\else\ifx\onlyQuad@\empty\else
+ \DN@{\expandafter\placeCircQuadrant@\expandafter{\onlyQuad@}}%
+ \fi\fi \next@ }%
+\xydef@\placeAllQuadrants@{%
+ \placeCircQuadrant@{1}%
+ \advance\dimen@-\p@\advance\dimen@-\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \placeCircQuadrant@{2}%
+ \advance\dimen@-\p@\advance\dimen@-\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \placeCircQuadrant@{3}%
+ \advance\dimen@-\p@\advance\dimen@-\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \placeCircQuadrant@{4}}
+\xydef@\placeCircQuadrant@#1{%
+ \let\bstartPLACE@=\relax \doCircleQuadrant@@{}#1%
+ \loop@
+ \expandafter\dimen@\circleplace@\p@
+ \advance\dimen@\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \ifdim\dimen@<\p@ \placeCircObject@
+ \repeat@ }
+\xydef@\placeCircObject@{\begingroup
+ \crvconnect@@ \Creset@@ \Invisible@false
+ \expandafter\splinealong@\expandafter{\circleplace@}%
+ \expandafter\drop\circleSTYLE@{}\endgroup }
+\xydef@\buildcircle@{\save@
+ \DNii@{\circledobjects@}%
+ \ifx\circleSTYLE@\empty\DNii@{\solidcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDASH@{}}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\solidcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addEQ@{}}%
+ \ifx\next@\circleSTYLE@
+ \expandafter\circletemplate@\expandafter{\addEQ@{}}{}%
+ \else \expandafter\DN@\expandafter{\addDASH@ 2}%
+ \ifx\next@\circleSTYLE@ \DNii@{\doublecircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDASH@ 3}%
+ \ifx\next@\circleSTYLE@ \DNii@{\triplecircle@{}}%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addDASH@\addDASH@{}}%
+ \ifx\next@\circleSTYLE@ \DNii@{\dashedcircle@{}}%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addEQ@\addEQ@{}}%
+ \ifx\next@\circleSTYLE@ \expandafter\expandafter\expandafter
+ \circletemplate@\expandafter\expandafter\expandafter{%
+ \expandafter\addEQ@\addEQ@{}}2%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addEQ@\addEQ@2}%
+ \ifx\next@\circleSTYLE@ \expandafter\expandafter\expandafter
+ \circletemplate@\expandafter\expandafter\expandafter{%
+ \expandafter\addEQ@\addEQ@{}}2%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addEQ@\addEQ@3}%
+ \ifx\next@\circleSTYLE@ \expandafter\expandafter\expandafter
+ \circletemplate@\expandafter\expandafter\expandafter{%
+ \expandafter\addEQ@\addEQ@{}}3%
+ \else \expandafter\DN@\expandafter{\addDOT@{}}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\dottedcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDOT@2}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\dbldottedcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDOT@3}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\trpldottedcircle@{}}%
+ \else \DN@{:}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\dbldottedcircle@{}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \nextii@ \leave@}
+\xydef@\circletemplate@#1#2{\def\circleSTYLE@{\dir#2{#1}}}
+\xydef@\doublecircle@#1{%
+ \advance\R@-\p@ \advance\L@-\p@ \solidcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \solidcircle@{}}
+\xydef@\triplecircle@#1{%
+ \advance\R@-2\p@ \advance\L@-2\p@ \solidcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \solidcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \solidcircle@{}}
+\xydef@\dottedcircle@#1{%
+ \expandafter\def\expandafter\circleSTYLE@\expandafter{%
+ \zerodot@i}%
+ \circledobjects@}
+\xydef@\dashedcircle@#1{%
+ \expandafter\def\expandafter\circleSTYLE@\expandafter{\zerodash@i}%
+ \circledobjects@}
+\xydef@\dbldottedcircle@#1{%
+ \advance\R@-\p@ \advance\L@-\p@ \dottedcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \dottedcircle@{}}
+\xydef@\trpldottedcircle@{%
+ \advance\R@-2\p@ \advance\L@-2\p@ \dottedcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \dottedcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \dottedcircle@{}}
+{\xyuncatcodes \gdef\next{=<.75\jot>{\zerodot}}}
+\xylet@\zerodot@i=\next
+{\dimen0=2\xydashl@ \xyuncatcodes
+\expandafter\gdef\expandafter\next\expandafter{\expandafter
+ =\expandafter<\the\dimen0 >_\dir{|}}}
+\xylet@\zerodash@i=\next
+{\xyuncatcodes\gdef\next{--}}
+\xylet@\dashcorntemp@@=\next
+{\xyuncatcodes\gdef\next{.}}
+\xylet@\dotcorntemp@@=\next
+\xydef@\dotcorner@#1{%
+ \expandafter\circleCorner@\expandafter{\dotcorntemp@@}{#1}}%
+\xydef@\dashcorner@#1{%
+ \expandafter\circleCorner@\expandafter{\dashcorntemp@@}{#1}}
+\xydef@\circleCorner@#1#2{\setboxz@h\bgroup
+ \edef\next{#2\relax\R@=\the\R@\relax\L@=\R@ }%
+ \expandafter\xycircle@\next @{#1}%
+ \ifcase#2\or \setboxz@h{\lower\R@\boxz@\kern\X@c}%
+ \or \setboxz@h{\kern-\R@\lower\R@\boxz@\kern\R@\kern\X@c}%
+ \or \setboxz@h{\kern-\R@\lower\R@\boxz@\kern\R@\kern\X@c}%
+ \or \setboxz@h{\lower\R@\boxz@\kern\X@c}\fi
+ \wdz@=\R@ \ht\z@=\R@ \dp\z@=\R@ \boxz@
+ }
+\xydef@\qspline{\hbox\bgroup\crvresetbreaks@ \xy@spline@}
+\xydef@\xy@spline@#1#{\if\sempty@ \DN@{\crvs@{}\resetbreaks@}%
+ \else\DN@{\xy@spline@i{#1}}\fi \next@ }%
+\xydef@\xy@spline@i#1#2{\def\splineSTYLE@{#2}%
+ \DN@{\xy@spline@ii}\DNii@{#1}%
+ \ifx\nextii@\empty\DN@{\xy@spline@ii@@}\fi \next@ }
+\xydef@\xy@spline@ii{\save@ \cfromp@\idfromc@{@p}%
+ \enter@\cplusthec@ \count@@=\s@top\advance\count@@\m@ne
+ \cfroms@{\count@@}\leave@
+ \halve@dimen\X@c
+ \halve@dimen\Y@c
+ \czeroEdge@ \idfromc@{@c}%
+ \expandafter\doSplineStraight@\expandafter{\splineSTYLE@}%
+ \count@=\@ne \edef\next@{\the\count@}%
+ \ifx\next@\s@top\DN@{\xy@spline@iv}\else\DN@{\xy@spline@iii}\fi
+ \next@ }
+\xylet@\xy@spline@ii@@=\xy@spline@ii
+\xydef@\xy@spline@iii{\crv@cnt@=\s@top
+ \loop \advance\crv@cnt@\m@ne \xy@spline@g \ifnum\crv@cnt@>\@ne\repeat
+ \xy@spline@iv}
+\xydef@\xy@spline@g{\cfromid@{@c}\idfromc@{@p}%
+ \count@@=\crv@cnt@\cfroms@{\count@@}\idfromc@{@m}%
+ \enter@\cplusthec@ \count@@=\crv@cnt@ \advance\count@@\m@ne
+ \cfroms@{\count@@}\leave@
+ \halve@dimen\X@c
+ \halve@dimen\Y@c
+ \czeroEdge@\idfromc@{@c}%
+ \expandafter\doSplineSegment@\expandafter{\splineSTYLE@}}
+\xydef@\xy@spline@iv{\cfromid@{@c}\idfromc@{@p}%
+ \cfroms@{\z@}\idfromc@{@m}\leave@ \save@
+ \enter@\cplusthec@ \cfromid@{@m}\leave@
+ \halve@dimen\X@c
+ \halve@dimen\Y@c
+ \czeroEdge@\idfromc@{@c}%
+ \expandafter\doSplineSegment@\expandafter{\splineSTYLE@}%
+ \xy@spline@v }
+\xydef@\xy@spline@v{\cfromid@{@c}\idfromc@{@p}%
+ \leave@ \save@ \idfromc@{@c}%
+ \expandafter\doSplineStraight@\expandafter{\splineSTYLE@}%
+ \xy@spline@x }
+\xydef@\xy@spline@x{\leave@
+ \def\Drop@@{\splineDrop@ \resetbreaks@}%
+ \def\Connect@@{\straight@\relax\splineConnect@ \resetbreaks@}%
+ \OBJECT@x}
+\xydef@\splineDrop@{\ifInvisible@\setboxz@h{}%
+ \else\setboxz@h{\kern-\the\X@c\raise-\the\Y@c\hbox{\styledboxz@}}\fi
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@ }
+\xydef@\splineConnect@{%
+ \ifInvisible@\else\box\lastobjectbox@\fi }%
+\xydef@\doSplineStraight@#1{\begingroup \sinit@
+ \cfromid@{@p}\pfromc@\cfromid@{@c}%
+ \connect@\crvs{#1}\relax\sleave@\endgroup }
+\xydef@\doSplineSegment@#1{\begingroup \sinit@
+ \cfromid@{@p}\pfromc@\senter@\cfromid@{@m}\spushc@\cfromid@{@c}%
+ \connect@\crvs{#1}\relax\sinit@\sleave@\endgroup }
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xydummy.tex b/macros/generic/diagrams/xypic/texinputs/xydummy.tex
new file mode 100644
index 0000000000..99182b8b5c
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xydummy.tex
@@ -0,0 +1,30 @@
+%% xydummy.tex from $Id: xydummy.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Dummy'' option.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{dummy}{Dummy option}{\stripRCS$Revision: 3.7 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xynew@{count}\xydummyrequires@@
+\xyeveryrequest{dummy}{\global\advance\xydummyrequires@@\@ne
+ \W@{The `dummy' option was used \the\xydummyrequires@@\space times!}}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xydvidrv.tex b/macros/generic/diagrams/xypic/texinputs/xydvidrv.tex
new file mode 100644
index 0000000000..2f8eb1745e
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xydvidrv.tex
@@ -0,0 +1,36 @@
+%% xydvidrv.tex from $Id: xydvidrv.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``dvidrv-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{dvidrv}{dvidrv driver}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\dvidrv@@#1{\dvimessage@{dvidrv}{#1}}
+\newdriver{%
+ \xyaddsupport{emtex}\dvidrvEmTeX@@
+ \xyaddsupport{line}\dvidrvLine@@
+}
+\xydef@\dvidrvEmTeX@@{\dvidrvEmTeX@}%
+\xydef@\dvidrvEmTeX@{\setupxyEMTeX@}%
+\xydef@\dvidrvLine@@{\dvidrvLine@}%
+\xydef@\dvidrvLine@{\xywithoption{emtex}{\installEMline@}}%
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xydvips.tex b/macros/generic/diagrams/xypic/texinputs/xydvips.tex
new file mode 100644
index 0000000000..d0d1176753
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xydvips.tex
@@ -0,0 +1,154 @@
+%% xydvips.tex from $Id: xydvips.doc,v 3.9 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``dvips-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{dvips}{DVIPS driver}{\stripRCS$Revision: 3.9 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\dvips@@#1{\dvimessage@{dvips}{#1}}
+\newdriver{%
+ \xyaddsupport{color}\dvipsColor@@
+ \xyaddsupport{crayon}\dvipsCrayola@@
+ \xyaddsupport{ps}\dvipsPS@@
+ \xyaddsupport{rotate}\dvipsRotate@@
+ \xyaddsupport{line}\dvipsLine@@
+ \xyaddsupport{frame}\dvipsFrames@@
+ \xyaddsupport{tile}\dvipsTiles@@
+ \xyaddsupport{tpic}\dvipsTPIC@
+ \xyaddsupport{emtex}\dvipsEM@
+ \xyaddsupport{tips}\dvipsTIPS@
+}
+\xydef@\dvips@Color@{\dvipsPStypes@
+ \let\xylocalColor@=\xystackcolor@
+ \let\xycolor@push\xycolor@push@@
+ \def\xycolor@{\xycolor@@}\let\xycolorwarning@=\relax
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}\installPScolor@ }%
+ \else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\dvipsCrayola@{}}%
+ \else \DN@{\xystandardcolors@}\fi \next@
+ \let\dvipsColor@@=\relax
+ \let\UnloadColor@@=\NoDVIPScolor@
+ }%
+\xydef@\dvipsColor@@{\dvips@Color@}
+\xydef@\NoDVIPScolor@{%
+ \def\xycolor@{\xycolor@@}%
+ \let\xycolor@@=\xyNoColor@
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\dvipsColor@@=\dvips@Color@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\xydef@\NoDVIPScolordvi@{\xywarning@{%
+ Neither colordvi.tex nor colordvi.sty could be found.}%
+ \xyBEcolorcheck@}%
+\xydef@\dvipsCrayola@@{\dvipsColor@@\dvipsCrayola@}
+\xydef@\dvipsCrayola@{%
+ \let\prevxycolor@=\newxycolor@
+ \def\newxyDVIPScolor@##1##2##3{\prevxycolor@{##1}{}{##1}}%
+ \let\newxycolor@=\newxyDVIPScolor@ \dvipsInclude@{color.pro}%
+ \installCrayolaColors@
+ \let\newxycolor@=\prevxycolor@ }%
+\xydef@\dvipsPS@@{\dvipsPS@}
+\xydef@\dvipsPS@unload{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\dvipsPS@@=\dvipsPS@ }
+\xydef@\dvipsPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\dvipsSpecial@\else
+ \let\PSspecial@@=\dvipsSpecial@
+ \let\PSmacro@@=\dvipsMacro@
+ \let\PSdict@@=\dvipsDict@
+ \let\PSspecialdict@@=\dvipsDict@
+ \let\PSraw@@=\dvipsRaw@
+ \let\PSinclude@@=\dvipsInclude@
+ \let\xyPSobeylines@@=\obeyDVIPSlines@
+ \let\xyPScurrpt@@=\dvipsCurrpt@@
+ \dvips@@{PostScript}%
+ \fi
+ \XYpredict@ }
+\xywarnifdefined\dvipsSpecial@
+\xywarnifdefined\dvipsMacro@
+\xywarnifdefined\dvipsDict@
+\xywarnifdefined\dvipsInclude@
+\xywarnifdefined\dvipsRaw@
+{\catcode`\"=11 \catcode`\!=11 \catcode`\:=11
+ \gdef\dvipsSpecial@#1{\special{ps:: SDict begin #1 end}}
+ \gdef\dvipsMacro@#1{\firstPS@@\special{" {#1}xy}}
+ \gdef\dvipsDict@#1{\special{! #1}}
+ \gdef\dvipsInclude@#1{\special{header=#1}}
+ \gdef\dvipsRaw@#1{\special{ps: SDict begin #1 end}}
+\catcode`\^^M=\active
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space }}%
+\xylet@\obeyDVIPSlines@=\next
+\xydef@\dvipsCurrpt@{\let\xyPScurrpt@@=\dvipsCurrpt@@}%
+\xydef@\dvipsCurrpt@@{\PSraw@@{xyp}}
+\xydef@\dvipsPS@{\dvipsPStypes@
+ \let\dvipsPS@@=\PSspecials@true
+ \let\UnloadPS@@=\dvipsPS@unload
+ \let\installxyps@@=\relax \installxyps@ }
+\xydef@\dvipsRotate@@{\dvipsRotate@}
+\xydef@\dvipsRotate@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \dvipsCurrpt@ \dvipsRotScale@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}UnloadRotate@\relax}\fi
+ \next@ }
+\xydef@\dvipsRotScale@{%
+ \def\xyrot@start(##1){{xyct ##1\space xyrs }}%
+ \def\xyrot@end{}%
+ \def\xyscale@start(##1,##2){{xyct ##1\space##2\space xyss }}%
+ \def\xyscale@end{}}
+\xydef@\dvipsLine@@{\dvipsLine@}
+\xydef@\dvipsLine@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\xydef@\dvipsFrames@@{\dvipsFrames@}
+\xydef@\dvipsFrames@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadFrames@\relax}\fi
+ \next@ }
+\xydef@\dvipsTiles@@{\dvipsTiles@}
+\xydef@\dvipsTiles@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\xydef@\dvipsTPIC@@{\dvipsTPIC@}
+\xydef@\dvipsTPIC@{\setupxyTPIC@}
+\xydef@\dvipsEM@@{\dvipsEM@}
+\xydef@\dvipsEM@{\setupxyEMTeX@}
+\xydef@\dvipsTIPS@{
+ \PSdict@@{/XYdict where pop begin XYdict begin}%
+ \PSdict@@{%
+ /lu{0.04 0.0 -0.16 0.125 -0.11 0.0
+ 1 1 6{pop xyfsize mul 6 1 roll}for
+ lineto lineto lineto closepath fill
+ 0 0 0 0 0 0}def
+ }%
+ \PSdict@@{end end}%
+}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xydvitops.tex b/macros/generic/diagrams/xypic/texinputs/xydvitops.tex
new file mode 100644
index 0000000000..42f8f8ea2e
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xydvitops.tex
@@ -0,0 +1,179 @@
+%% xydvitops.tex from $Id: xydvitops.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``DVITOPS-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{dvitops}{DVITOPS driver}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\dvitops@@#1{\dvimessage@{DVITOPS}{#1}}
+\newdriver{%
+ \xyaddsupport{color}\dvitopsColor@@
+ \xyaddsupport{crayon}\dvitopsCrayon@@
+ \xyaddsupport{ps}\dvitopsPS@@
+ \xyaddsupport{rotate}\dvitopsRotate@@
+ \xyaddsupport{line}\dvitopsLine@@
+ \xyaddsupport{frame}\dvitopsFrames@@
+ \xyaddsupport{tile}\dvitopsTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\xydef@\dvitopsColor@@{\dvitops@Color@}
+\xydef@\dvitops@Color@{\dvitopsPStypes@
+ \let\xylocalColor@=\xyDVITOPScolor@
+ \let\xycolor@push\xycolor@push@@
+ \def\xycolor@{\xycolor@@}\let\xycolorwarning@=\relax
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}\xycatcodes
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\dvitopsCrayon@{}}%
+ \else\let\next@=\xystandardcolors@
+ \fi \next@
+ \let\dvitops@Color@@=\relax
+ \let\UnloadColor@@=\NoDVITOPScolor@
+ }%
+\xydef@\NoDVITOPScolor@{%
+ \def\xycolor@{\xycolor@@}%
+ \let\xycolor@@=\xyNoColor@
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\dvitops@Color@@=\dvitops@Color@
+ }
+\xydef@\xyDVITOPScolor@{\bgroup \DN@##1##2{\egroup}%
+ \ifInvisible@\else\ifHidden@\else\DNii@{\no@@}\ifx\nextii@\Connect@@
+ \else\DN@{\xyDVITOPScolor@i}\fi\fi\fi \next@ }
+\xydef@\xyDVITOPScolor@i#1#2{\checkXyStyle@
+ \DN@{#2}\ifx\next@\empty
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{#1}}}%
+ \else\DNii@{gray}\ifx\next@\nextii@
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{gray}{#1}}}%
+ \else\DNii@{rgb}\ifx\next@\nextii@
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{rgbcolor}{#1}}}%
+ \else\DNii@{hsb}\ifx\next@\nextii@
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{hsbcolor}{#1}}}%
+ \else \DN@{\xywarning@{DVITOPS cannot support color: #2 #1}}%
+ \fi\fi\fi\fi
+ \toks@={\egroup \let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\tmp@\expandafter{\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}\def\Connect@@}%
+ \expandafter\tmp@\expandafter{\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}}%
+ \the\toks@ }%
+\xydef@\xycolor@begin{\dvitopsBegin@{color}}
+\xydef@\xycolor@end{\dvitopsEnd@{color}\dvitopsColor@x}
+\xydef@\dvitopsCrayon@@{\dvitopsColor@@\dvitopsCrayon@}
+\xydef@\dvitopsCrayon@{\installCrayolaColors@}%
+\xydef@\dvitopsPS@@{\dvipsPS@}
+\xydef@\dvitopsPS@unload{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\dvitopsPS@@=\dvitopsPS@ }
+\xydef@\dvitopsPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\dvitopsSpecial@\else
+ \let\PSspecial@@=\dvitopsSpecial@
+ \let\PSmacro@@=\dvitopsMacro@
+ \let\PSdict@@=\dvitopsDict@
+ \let\PSspecialdict@@=\dvitopsDict@
+ \let\PSraw@@=\dvitopsRaw@
+ \let\PSinclude@@=\dvitopsInclude@
+ \let\xyPSobeylines@@=\obeyDVIPSlines@
+ \let\xyPScurrpt@@=\dvitopsCurrpt@@
+ \dvitops@@{PostScript}%
+ \fi
+ \XYpredict@ }
+\xywarnifdefined\dvitopsSpecial@
+\xywarnifdefined\dvitopsMacro@
+\xywarnifdefined\dvitopsDict@
+\xywarnifdefined\dvitopsInclude@
+\xywarnifdefined\dvitopsRaw@
+\xywarnifdefined\dvitopsOrigin@
+\xywarnifdefined\dvitopsBegin@
+\xywarnifdefined\dvitopsEnd@
+\xywarnifdefined\dvitopsRotate@x
+\xywarnifdefined\dvitopsTransform@x
+\xywarnifdefined\dvitopsColor@x
+{\catcode`\:=11
+ \gdef\dvitopsSpecial@#1{\special{dvitops: inline #1}}
+ \gdef\dvitopsMacro@#1{\special{dvitops: inline {#1}xy}}
+ \gdef\dvitopsDict@#1{\special{dvitops: inline #1}}
+ \gdef\dvitopsInclude@#1{\special{dvitops: prolog #1}}
+ \gdef\dvitopsRaw@#1{\special{dvitops: inline #1}}
+ \gdef\dvitopsOrigin@#1{\special{dvitops: origin #1}}
+ \gdef\dvitopsBegin@#1{\special{dvitops: begin #1}}
+ \gdef\dvitopsEnd@#1{\special{dvitops: end #1}}
+ \gdef\dvitopsRotate@x#1{\special{dvitops: rotate #1}}
+ \gdef\dvitopsTransform@x#1{\special{dvitops: transform #1}}
+ \gdef\dvitopsColor@x#1#2{\special{dvitops: #1 color #2}}
+}
+\catcode`\^^M=\active
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space }}%
+\xylet@\obeyDVIPSlines@=\next
+\xydef@\dvitopsCurrpt@{\global\let\xyPScurrpt@@=\relax}%
+\xydef@\dvitopsPS@{\dvitopsPStypes@
+ \let\installxyps@@=\relax \installxyps@ }
+\xydef@\dvitopsRotate@@{\dvitopsRotate@}
+\xydef@\dvitopsRotate@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty
+ \DN@{\xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \installDVITOPSrotate@ }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+\xydef@\dvitopsRotScale@{%
+ \def\xyrot@start{\dvitopsBegin@{rot}\dvitopsOrigin@{rot}}%
+ \def\xyrot@end(##1){\dvitopsEnd@{rot}\dvitopsRotate@x{##1}}%
+ \def\xyscale@start{\dvitopsBegin@{scal}\dvitopsOrigin@{scal}}%
+ \def\xyscale@end(##1,##2){%
+ \dvitopsEnd@{scal}\dvitopsTransform@x{##1 0 ##2 0}}%
+ }
+\xydef@\installDVITOPSrotate@{\installPSstyle@
+ \let\xyRotate@@=\dvitopsRotate@
+ \let\doSpecialRotate@@=\dvitopsSpecialRotate@
+ \let\xyscale@@=\dvitopsScale@
+ \dvitopsCurrpt@
+ \dvitopsRotScale@ \xyPSshapes@true }
+\xydef@\UnloadDVITOPSrotate@{\UnloadRotate@\relax}
+ \xydef@\dvitopsRotate@#1{\xyPSsplitPS@
+ {\dvitopsBegin@{rot}\dvitopsOrigin@{rot}}%
+ {\dvitopsEnd@{rot}\dvitopsRotate@x{#1}}}%
+ \xydef@\dvitopsScale@#1#2{\xyPSsplitPS@
+ {\dvitopsBegin@{scal}\dvitopsOrigin@{scal}}%
+ {\dvitopsEnd@{scal}\dvitopsTransform@x{#1 0 #2 0}}}
+ \xydef@\dvitopsSpecialRotate@#1@@{\dvitopsRotate@{#1}}
+\xydef@\dvitopsLine@@{\dvitopsLine@}
+\xydef@\dvitopsLine@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\xydef@\dvitopsFrames@@{\dvitopsFrames@}
+\xydef@\dvitopsFrames@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadFrames@\relax}\fi
+ \next@ }
+\xydef@\dvitopsTiles@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\xydef@\dvitopsTPIC@@{\dvitopsTPIC@}
+\xydef@\dvitopsTPIC@{\setupxyTPIC@}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyemtex.tex b/macros/generic/diagrams/xypic/texinputs/xyemtex.tex
new file mode 100644
index 0000000000..d1a7e76da0
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyemtex.tex
@@ -0,0 +1,101 @@
+%% xyemtex.tex from $Id: xyemtex.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``em-TeX'' back-end extension.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{emtex}{em-TeX backend}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xynew@{if}\ifEMspecials@
+\xydef@\UseEMspecials{\EMspecials@true}
+\xydef@\NoEMspecials{\EMspecials@false}
+\xydef@\xyemtex@lineto{\xyEM@special{lineto}}
+\xydef@\xyemtex@moveto{\xyEM@special{moveto}}
+\xydef@\xyemtex@line#1{\xyEM@special{line #1}}
+\xydef@\xyemtex@point#1{\xyEM@special{point #1}}
+\xydef@\xyemtex@pen#1{\addtostyletoks@{\xyEM@special{linewidth #1}}}
+{\catcode`:=12 \gdef\next#1{\special{em:#1}}}
+\xylet@\xyEM@special=\next
+{\catcode`:=12 \gdef\next#1{%
+ \W@{EM:#1 (\the\X@p,\the\Y@p),(\the\X@c,\the\Y@c)}\special{em:#1}}}
+\xylet@\xyEM@noisy=\next
+\xydef@\NoisyEMTeX{\let\xyEM@special=\xyEM@noisy}
+\xydef@\EMalternative@#1#2{%
+\expandafter\global\expandafter\let\csname origxy#2@\endcsname=#1%
+ \xdef#1{\noexpand\ifEMspecials@
+ \noexpand\expandafter\expandafter\noexpand\csname xyemtex@#2@\endcsname
+ \noexpand\else
+ \noexpand\expandafter\expandafter\noexpand\csname origxy#2@\endcsname
+ \noexpand\fi}}%
+\xydef@\setupxyEMTeX@{\xywarning@{using em-TeX specials}%
+ \EMalternative@{\solid@}{solid}%
+ \EMalternative@{\splinesolid@}{splinesolid}%
+ \let\setupxyEM@=\reloadxyEM@
+ \activateEM@ }
+\xydef@\xyunloadEM@{\xywarning@{EM specials turned off}%
+ \xywithoption{line}{\xysetup@@\uninstallEMline@ }%
+ \EMspecials@false
+ \let\setupxyEM@=\reloadxyEM@ }
+\xydef@\activateEM@{%
+ \xywithoption{line}{\xysetup@@\installEMline@}%
+ \EMspecials@true }
+\xydef@\reloadxyEM@{\xywarning@{EM specials back on}\activateEM@ }
+\xydef@\xyemtex@solid@{%
+ \ifInvisible@ \let\next@=\no@@
+ \else \DN@{\xyEMstraight@}\fi
+ \next@ }
+\xydef@\xyEMstraight@{\setupDirection@
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \DN@##1##2{\def\checkoverlap@@{%
+ \ifdim##1\X@p>##1\X@c \let\next@=\relax \fi
+ \ifdim##2\Y@p>##2\Y@c \let\next@=\relax \fi}}%
+ \edef\nextii@{{\sd@X}{\sd@Y}}\expandafter\next@\nextii@
+ \noCshavep@@ \edef\Cshavep@@{\pfromthep@ \noexpand\resetDirection@}%
+ \noCshavec@@ \edef\Cshavec@@{\cfromthec@ \noexpand\resetDirection@}%
+ \ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi \fi
+ \ifInvisible@\let\next@=\relax \else
+ \DN@{%
+ \setboxz@h{\kern\X@p \raise\Y@p\hbox{\xyemtex@moveto}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@
+ \setboxz@h{\boxz@ \kern\X@c \raise\Y@c\hbox{\xyemtex@lineto}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}%
+ \fi
+ \checkoverlap@@
+ \ifdim\d@X=\z@ \ifdim\d@Y=\z@ \DN@{\relax}\fi\fi \next@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\Creset@@ }
+\xydef@\xyemtex@splinesolid@{\setbox\splinebox@=\copy\voidb@x
+ \multiply\splinetol@\thr@@
+ \gdef\splineextra@@{\xyemtex@moveto\gdef\splineextra@@{\xyemtex@lineto}}%
+ \def\xycrvdrop@{ }\def\xycrvconn@{}\splineset@@ }
+\xydef@\xyEMlinewidth@#1{\dimen@=#1\relax\edef\next@{\the\dimen@}}
+\xydef@\installEMline@{%
+ \let\xylinewidth@@=\xylinewidth@
+ \let\xylineSpecial@@=\xyemtex@pen
+ \let\transxyline@@=\xyEMlinewidth@ }
+\xydef@\uninstallEMline@{\UnloadLine@\relax}%
+\xydef@\UseEMlinewidth{\installEMline@}%
+\xydef@\NoEMlinewidth{\uninstallEMline@}%
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyframe.tex b/macros/generic/diagrams/xypic/texinputs/xyframe.tex
new file mode 100644
index 0000000000..c4a04214a6
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyframe.tex
@@ -0,0 +1,537 @@
+%% xyframe.tex from $Id: xyframe.doc,v 3.14 2012/05/24 00:30:38 krisrose Exp $
+%%
+%% Xy-pic ``Frames and Brackets'' extension.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{frame}{Frame and Bracket extension}{\stripRCS$Revision: 3.14 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xydef@\frm{\hbox{}\dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@
+ \ht\z@=\U@c \dp\z@=\D@c \dimen@=\U@c \advance\dimen@\D@c
+ \ifdim\wdz@=\z@ \def\Leftness@{.5}\else \quotient@\Leftness@\L@c\wdz@ \fi
+ \ifdim\dimen@=\z@ \def\Upness@{.5}\else \quotient@\Upness@\U@c\dimen@ \fi
+ \expandafter\Edge@c\expandafter{\prevEdge@@}\let\frmradius@@=\z@
+ \def\Drop@@{}%
+ \def\Connect@@{\xy@@{\save@\cmerge@\Y@p\X@p\D@p\U@p\L@p\R@p\Drop@@}\restore}%
+ \xyFN@\frm@i}
+\xylet@\frmradius@@=\z@
+\xydef@\frm@i{%
+ \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\def\frmradius@@{##1}\xyFN@\frm@i}%
+ \else \DN@##1##{\frm@{##1}}\fi \next@}
+\xydef@\frm@#1#2{\DNii@{frm#1{#2}}%
+ \expandafter\let\expandafter\next@\csname\codeof\nextii@\endcsname
+ \ifx\next@\relax \DNii@{frm{#2}}%
+ \expandafter\let\expandafter\next@\csname\codeof\nextii@\endcsname
+ \ifx\next@\relax \let\next@=\frm@generic \fi\fi \next@}
+\xydef@\frm@generic{\xyerror@{No generic frames yet!}{}}
+\xydef@\frmDrop@#1{%
+ \ifx\frmradius@@\z@ \addtoDrop@@{\let\frmradius@@=\z@ #1}%
+ \else \expandafter\addtoDrop@@\expandafter{%
+ \expandafter\def\expandafter\frmradius@@\expandafter{\frmradius@@}#1}\fi}
+\xydef@\EdgefromtheEdge@{%
+ \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \Edge@c={\expandafter\noexpand\the\Edge@c}}
+\xydef@\prevEdgefromtheEdge@{%
+ \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \noexpand\def\noexpand\prevEdge@@{\expandafter\noexpand\the\Edge@c}}
+\xydef@\addtoDrop@@#1{%
+ \expandafter\def\expandafter\Drop@@\expandafter{\Drop@@#1}}
+\xydef@\addbeforeDrop@@#1{\DNii@{#1}%
+ \expandafter\DN@\expandafter{\expandafter\nextii@\Drop@@}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\Drop@@
+ \expandafter\expandafter\expandafter{\next@}}
+\xydefcsname@{frm{}}{}
+\xyletcsnamecsname@{frm[]{}}{frm{}}
+\xyletcsnamecsname@{frm[o]{}}{frm{}}
+\xydefcsname@{frm{.}}{\frmDrop@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@doth@@ \let\framevfill=\frm@dotv@@
+ \framed@@{\frmradius@@}}}
+\xyletcsnamecsname@{frm[]{.}}{frm{.}}
+\xydef@\frm@doth@@{\setboxz@h{\kern5\B@\framezerodot@@\kern5\B@}\ht\z@=\B@
+ \dp\z@=\B@\kern5\B@\xleaders\boxz@\hss\kern5\B@}
+\xydef@\frm@dotv@@{\setboxz@h to2\B@{\hss\framezerodot@@\hss}\ht\z@=5\B@
+ \dp\z@=5\B@\kern5\B@\xleaders\boxz@\vss\kern5\B@}
+\xyletcsnamecsname@{frm{..}}{frm{.}}
+\xylet@\framezerodot@@=\zerodot
+\xydefcsname@{frm{-}}{\frmDrop@{\framed@\frmradius@@}}
+\xyletcsnamecsname@{frm[]{-}}{frm{-}}
+\xydef@\framed@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@ \framed@@}
+\xylet@\framesetthick@=\relax
+\xydef@\frm@solidh@@{\framesetthick@\leaders\hrule height\B@ depth\B@\hfill}
+\xydef@\frm@solidv@@{\framesetthick@\leaders\vrule width2\B@\vfill}
+\xydefcsname@{frm{=}}{\frmDrop@{\framed@\frmradius@@
+ {\advance\L@c-2\p@ \advance\R@c-2\p@ \advance\U@c-2\p@ \advance\D@c-2\p@
+ \dimen@=\frmradius@@
+ \ifdim\dimen@>2\p@ \advance\dimen@-2\p@ \else \dimen@=\z@\fi
+ \framed@\dimen@}}}
+\xyletcsnamecsname@{frm[]{=}}{frm{=}}
+\xydef@\framesetthick@line{\B@=.5\xylinethick@}
+\xydef@\frm@thickc@@{\hbox{\framesetthick@line
+ \vrule height.5\B@ depth.5\B@ width\B@}}
+\xywithoption{line}{%
+ \let\framezerodot@@\frm@thickc@@ \let\framesetthick@=\framesetthick@line}
+\xydef@\framed@@#1{\setboxz@h{\R@=#1\relax
+ \dimen@=\L@c \advance\dimen@\R@c \dimen@ii=\U@c \advance\dimen@ii\D@c
+ \ifdim.5\dimen@<\R@ \R@=.5\dimen@ \fi
+ \ifdim.5\dimen@ii<\R@ \R@=.5\dimen@ii \fi
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \ifdim\R@<\p@\else \cirrestrict@@ \fi
+ \dimen@=2\R@ \advance\dimen@-\L@c \advance\dimen@-\R@c
+ \ifdim\dimen@>\z@ \advance\A@-.5\dimen@ \fi
+ \dimen@=2\R@ \advance\dimen@-\U@c \advance\dimen@-\D@c
+ \ifdim\dimen@>\z@ \advance\B@-.5\dimen@ \fi
+ \kern\A@ \raise\B@\vbox to \dimen@ii{\framed@body@@}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+\xydef@\framed@body@{%
+ \advance\dimen@ii.22\p@ \advance\dimen@-.2\p@
+ \setboxz@h{\corn@@4\R@}\A@=-.5\wdz@ \B@=.5\xydashw@
+ \dimen@=\L@c \advance\dimen@\R@c \advance\dimen@-.2\p@
+ \setboxz@h to\dimen@{\kern\A@ \boxz@ \framehfill\corn@@3\R@\kern\A@}%
+ \advance\dimen@ii-\dp\z@ \kern-\ht\z@ \nointerlineskip\boxz@
+ \dimen@=\L@c \advance\dimen@\R@c \advance\dimen@-.2\p@
+ \setboxz@h to\dimen@{\kern\A@\corn@@1\R@\framehfill\corn@@2\R@\kern\A@}%
+ \advance\dimen@ii-\ht\z@
+ \dimen@=\L@c \advance\dimen@\R@c \advance\dimen@.2\p@
+ \nointerlineskip\hbox to\dimen@{%
+ \setbox\z@=\vbox to\dimen@ii{\framevfill}\kern-.5\wdz@\copy\z@
+ \hss \copy\z@\kern-.5\wdz@ }%
+ \nointerlineskip\boxz@ \vss \kern\z@}
+\xylet@\framed@body@@=\framed@body@
+\xylet@\zerocorner=\framezerodot@@
+\xydef@\solidcorner@#1#2{\hbox\bgroup \R@=#2\relax
+ \ifdim\R@<\p@ \zerocorner
+ \else \cirrestrict@@ \multiply\count@8
+ \setboxz@h{\corn@x@@{#1}}\dimen@=\wdz@
+ \ifcase#1\or \ht\z@=\z@ \kern\dimen@ \raise\dimen@\boxz@
+ \or \ht\z@=\z@ \raise\dimen@\boxz@ \kern\dimen@
+ \or \dp\z@=\z@ \lower\dimen@\boxz@ \kern\dimen@
+ \or \dp\z@=\z@ \kern\dimen@ \lower\dimen@\boxz@ \fi
+ \vrule height\dimen@ depth\dimen@ width\z@\fi
+ \edef\tmp@{\egroup \U@c=\the\dimen@}\tmp@ \D@c=\U@c \L@c=\U@c \R@c=\U@c
+ \Edge@c={\circleEdge}\ignorespaces}
+\xydef@\corn@x@#1{\ifcase#1\or
+ \circhar@@\z@ \circhar@@\@ne\or\circhar@@\tw@ \circhar@@3\or
+ \circhar@@5\circhar@@4\or\circhar@@7\circhar@@6\fi}
+\xylet@\corn@x@@=\corn@x@
+\xydef@\corn@@{\DN@{\solidcorner@}%
+ \ifx\framehfill\frm@doth@@ \DN@{\let\cirrestrict@@=\relax
+ \let\corn@x@@=\dotcorner@@ \let\zerodot=\framezerodot@@
+ \solidcorner@ }%
+ \else\ifx\framehfill\frm@dashh@@ \DN@{\let\cirrestrict@@=\relax
+ \let\corn@x@@=\dashcorner@@ \let\zerodot=\framezerodot@@
+ \solidcorner@ }%
+ \fi\fi \next@}
+\xydef@\dotcorner@@#1{\zerocorner}
+\xydef@\dashcorner@@#1{\zerocorner}
+\xywithoption{curve}{%
+ \let\dotcorner@@=\dotcorner@ \let\dashcorner@@=\dashcorner@}
+\xydefcsname@{frm{--}}{%
+ \frmDrop@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@dashh@@ \let\framevfill=\frm@dashv@@
+ \framed@@\frmradius@@}}
+\xyletcsnamecsname@{frm[]{--}}{frm{--}}
+\xydef@\frm@dashh@@{\setboxz@h{\dashhfillchar}%
+ \ht\z@=\B@ \dp\z@=\B@ \wdz@=2\xydashl@
+ \copy\z@ \xleaders\copy\z@\hss \boxz@\kern-\xydashl@}
+\xydef@\frm@dashv@@{\setboxz@h to2\B@{\hss\dashvfillchar\hss}\ht\z@=\z@
+ \dp\z@=2\xydashl@ \nointerlineskip\copy\z@ \xleaders\copy\z@\vss
+ \nointerlineskip\boxz@\kern-\xydashl@}%
+\xydef@\dashhfillchar{{\rDirection@\xydashl@ \line@@}}
+\xydef@\dashvfillchar{{\dDirection@\xydashl@ \line@@}}
+\xydefcsname@{frm{o-}}{%
+ \ifdim\frmradius@@<2\xydashl@\relax \dimen@=.8\xydashl@
+ \expandafter\def\expandafter\frmradius@@\expandafter{\the\dimen@}\fi
+ \frmDrop@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@rddashh@@ \let\framevfill=\frm@rddashv@@
+ \framed@@\frmradius@@}}%
+\xydef@\frm@rddashh@@{\setboxz@h{\kern\xydashl@\dashhfillchar}%
+ \ht\z@=\B@ \dp\z@=\B@ \copy\z@ \xleaders\copy\z@\hss \boxz@ \kern\xydashl@}
+\xydef@\frm@rddashv@@{\ifdim\dimen@ii<2\xydashl@\else
+ \setbox\z@=\vbox to2\xydashl@{\hbox to2\B@{\hss\dashvfillchar\hss}\vss}%
+ \kern\xydashl@ \copy\z@ \xleaders\copy\z@\vss
+ {\ifdim\dimen@ii<2\xydashl@\else\aftergroup\boxz@\fi}\fi}
+\xydefcsname@{frm{,}}{%
+ \ifx\frmradius@@\z@ \shaded@{1.2\p@}\else \shaded@\frmradius@@ \fi}
+\xydef@\shaded@#1{\frmDrop@{\R@=#1\relax
+ {\advance\X@c\R@ \advance\Y@c-\D@c \U@c=\z@ \D@c=\R@ \blacked@}%
+ {\advance\X@c\R@c \advance\Y@c-\R@ \L@c=\z@ \R@c=\R@ \blacked@}}}
+\xydefcsname@{frm{-,}}{\addtoDrop@@{\drop\frm{-}\drop\frm{,}}}
+\xydef@\blacked@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \dimen@=\L@c \advance\dimen@\R@c
+ \B@=\Y@c \advance\B@-\D@c \dimen@ii=\Y@c \advance\dimen@ii\U@c
+ \advance\A@-.5\xydashw@
+ \kern\A@ \blacked@@ }%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+\xydef@\bblacked@{\setboxz@h{%
+ \dimen@=\L@c \advance\dimen@\R@c \B@=-\D@c \dimen@ii=\U@c
+ \kern-\L@c \blacked@@ \kern-\dimen@ \kern\L@c}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+\xydef@\blacked@@{\vrule width\dimen@ depth-\B@ height\dimen@ii}
+\xydefcsname@{frm{o}}{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@
+ \circled@\dimen@}%
+ \else
+ \frmDrop@{\let\framehfill=\frm@solidh@@
+ \let\framevfill=\frm@solidv@@ \circled@\frmradius@@}%
+ \fi}
+\xydefcsname@{frm{oo}}{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@
+ {\circled@\dimen@}\advance\dimen@-2.1\p@ \circled@\dimen@}%
+ \else
+ \frmDrop@{\dimen@=\frmradius@@
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@
+ {\circled@\dimen@}\advance\dimen@-2.1\p@ \circled@\dimen@}%
+ \fi}
+\xydef@\circled@#1{\setboxz@h\bgroup \R@=#1\relax
+ \setboxz@h{\vbox{\circled@x@@}}%
+ \A@=\X@c \advance\A@-.5\wd\z@
+ \B@=\Y@c \advance\B@-.5\ht\z@ \advance\B@.5\dp\z@ \advance\B@.2\p@
+ \edef\tmp@{\egroup\dimen@=\the\wdz@}%
+ \kern\A@ \raise\B@\boxz@
+ \tmp@ \divide\dimen@4 \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+\xydef@\circled@x@{\hbox{\corn@@4\R@ \corn@@3\R@}%
+ \nointerlineskip\hbox{\corn@@1\R@ \corn@@2\R@}}
+\xylet@\circled@x@@=\circled@x@
+\xydefcsname@{frm{.o}}{%
+ \ifx\frmradius@@\z@ \frmDrop@{\let\framehfill=\frm@doth@@
+ \dimen@=.5\L@c \advance\dimen@.5\R@c \circled@\dimen@}%
+ \else
+ \frmDrop@{\let\framehfill=\frm@doth@@ \circled@\frmradius@@}%
+ \fi}
+\xydefcsname@{frm{-o}}{%
+ \ifx\frmradius@@\z@ \frmDrop@{\let\framehfill=\frm@dashh@@
+ \dimen@=.5\L@c \advance\dimen@.5\R@c \circled@\dimen@}%
+ \else
+ \frmDrop@{\let\framehfill=\frm@dashh@@ \circled@\frmradius@@}%
+ \fi}
+\xydefcsname@{frm{e}}{\ellipse@whichfrm@\ellipsesolidframed@}%
+\xydefcsname@{frm{.e}}{\ellipse@whichfrm@\ellipsedotframed@}%
+\xydefcsname@{frm{-e}}{\ellipse@whichfrm@\ellipsedashframed@}%
+\xydefcsname@{frm{ee}}{\ellipse@whichdblfrm@\ellipsesolidframed@}%
+\xydefcsname@{frm2{.e}}{\ellipse@whichdblfrm@\ellipsedotframed@}%
+\xydefcsname@{frm2{-e}}{\ellipse@whichdblfrm@\ellipsedashframed@}%
+\xyletcsnamecsname@{frm[o]{-}}{frm{e}}
+\xyletcsnamecsname@{frm[o]{=}}{frm{ee}}
+\xyletcsnamecsname@{frm[o]{.}}{frm{.e}}
+\xyletcsnamecsname@{frm[o]{--}}{frm{-e}}
+\xydef@\ellipse@whichfrm@#1{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{#1\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}\next@ }%
+ \else
+ \frmDrop@{#1\expandafter\ellipsed@i@\frmradius@@,,@@}%
+ \fi}
+\xydef@\ellipse@whichdblfrm@#1{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{#1\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}\next@ }%
+ \else
+ \frmDrop@{#1\expandafter\ellipsed@ei@\frmradius@@,,@@}%
+ \fi}
+\xydef@\ellipsed@i@#1,#2,#3@@{\DNii@{,}\DN@{#3}%
+ \ifx\next@\nextii@
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \else \ifx\next@\empty \DN@{#2}%
+ \ifx\next@\empty \DN@{#1}%
+ \dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \else \dimen@=#1\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \fi
+ \else\xywarning@{ignoring extra tokens in elliptical frame: #3 }%
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \fi\fi \next@ }
+\xydef@\ellipsed@ei@#1,#2,#3@@{\DNii@{,}\DN@{#3}%
+ \ifx\next@\nextii@
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}%
+ \else \ifx\next@\empty \DN@{#2}%
+ \ifx\next@\empty \DN@{#1}%
+ \dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}%
+ \else
+ \dimen@=#1\relax
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@}}%
+ \fi
+ \else\xywarning@{ignoring extra tokens in elliptical frame: #3 }%
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}%
+ \fi\fi \next@ }
+\xydef@\ellipsed@e@#1#2{%
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}\next@
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \ifdim\dimen@>2\p@ \advance\dimen@-2\p@ \else \dimen@=\z@\fi
+ \ifdim\dimen@ii>2\p@ \advance\dimen@ii-2\p@ \else \dimen@ii=\z@\fi
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}\next@ }%
+\xydef@\ellipsed@#1#2{\setboxz@h\bgroup \relax
+ \setboxz@h{\vbox{\ellipsed@x@@{#1}{#2}}}%
+ \A@=\X@c \advance\A@-.5\wd\z@
+ \B@=\Y@c \advance\B@-.5\ht\z@ \advance\B@.5\dp\z@
+ \edef\tmp@{\egroup\dimen@=\the\wdz@}%
+ \kern\A@ \raise\B@\boxz@
+ \tmp@ \divide\dimen@4 \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+\xydef@\ellipsed@i#1#2{{\R@c=#1\relax\L@c=\R@c
+ \U@c=#2\relax\D@c=\U@c \ellipsed@{#1}{#2}}}
+\xydef@\ellipsed@x@#1#2{\R@=#1\relax\advance\R@#2\relax
+ \divide\R@\tw@ \circled@x@@ }
+\xylet@\ellipsed@x@@=\ellipsed@x@
+\xydef@\ellipsesolidframed@{%
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@}
+\xydef@\ellipsedotframed@{%
+ \let\framehfill=\frm@doth@@ \let\framevfill=\frm@dotv@@}
+\xydef@\ellipsedashframed@{%
+ \let\framehfill=\frm@dashh@@ \let\framevfill=\frm@dashv@@}
+\xydefcsname@{frm{\{}}{\addtoDrop@@{\lbraced}}
+\xydefcsname@{frm{\}}}{\addtoDrop@@{\rbraced}}
+\xydefcsname@{frm{^\}}}{\addtoDrop@@{\ubraced}}
+\xydefcsname@{frm{_\}}}{\addtoDrop@@{\dbraced}}
+\xydef@\dbraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@ \advance\B@-.5\ht\z@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \advance\A@-.25pt
+ \kern\A@\raise\B@\hbox{%
+ \hbox to\L@c{$\m@th\bracelu\leaders\vrule\hfil\bracerd$}%
+ \kern.5pt
+ \hbox to\R@c{$\m@th\braceld\leaders\vrule\hfil\braceru$}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\xydef@\ubraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@\U@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \advance\A@-.25pt
+ \kern\A@\raise\B@\hbox{%
+ \hbox to\L@c{$\m@th\braceld\leaders\vrule\hfil\braceru$}%
+ \kern.5pt
+ \hbox to\R@c{$\m@th\bracelu\leaders\vrule\hfil\bracerd$}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+{\catcode`\"=12
+ \global\mathchardef\braceur="338
+ \global\mathchardef\braceul="339
+ \global\mathchardef\bracedr="33A
+ \global\mathchardef\bracedl="33B
+ \global\mathchardef\bracecl="33C
+ \global\mathchardef\bracecr="33D
+ \global\mathchardef\bracec="33E }
+\xydef@\lbraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecl$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \kern\A@\raise\B@\vbox{\vbox to\U@c{%
+ \nointerlineskip\hbox{$\m@th\braceur$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.4\dimen@
+ \nointerlineskip\hbox{$\m@th\bracecl$}\kern-.5\dimen@ii}%
+ \nointerlineskip\vbox to\D@c{\kern.5\dimen@ii
+ \kern-.4\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedr$}\kern\z@}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\xydef@\rbraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@\R@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecr$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \kern\A@\raise\B@\vbox{\vbox to\U@c{%
+ \nointerlineskip\hbox{$\m@th\braceul$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.4\dimen@
+ \nointerlineskip\hbox{$\m@th\bracecr$}\kern-.5\dimen@ii}%
+ \nointerlineskip\vbox to\D@c{\kern.5\dimen@ii
+ \kern-.4\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedl$}\kern\z@}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\xydefcsname@{frm{(}}{\addtoDrop@@{\lparenthesized}}
+\xydefcsname@{frm{)}}{\addtoDrop@@{\rparenthesized}}
+\xydefcsname@{frm{^)}}{\addtoDrop@@{\uparenthesized}}
+\xydefcsname@{frm{_)}}{\addtoDrop@@{\dparenthesized}}
+\xydef@\dparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@ \advance\B@-.5\ht\z@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \dimen@=\L@c \advance\dimen@\R@c
+ \kern\A@\raise\B@\hbox to\dimen@{%
+ $\m@th\bracelu\leaders\vrule\hfil\braceru$}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\xydef@\uparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@\U@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \dimen@=\L@c \advance\dimen@\R@c
+ \kern\A@\raise\B@\hbox to\dimen@{%
+ $\m@th\braceld\leaders\vrule\hfil\bracerd$}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\xydef@\lparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecr$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \dimen@ii\U@c \advance\dimen@ii\D@c
+ \kern\A@\raise\B@\vbox to \dimen@ii{%
+ \nointerlineskip\hbox{$\m@th\braceur$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedr$}\kern\z@}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\xydef@\rparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@\R@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecr$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \dimen@ii\U@c \advance\dimen@ii\D@c
+ \kern\A@\raise\B@\vbox to \dimen@ii{%
+ \nointerlineskip\hbox{$\m@th\braceul$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedl$}\kern\z@}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\xydefcsname@{frm{*}}{%
+ \expandafter\frmDrop@\expandafter{%
+ \expandafter\def\expandafter\prevEdge@@\expandafter{\prevEdge@@}%
+ \frame@fill@@\frmradius@@}}
+\xydefcsname@{frm{**}}{%
+ \expandafter\frmDrop@\expandafter{%
+ \expandafter\def\expandafter\prevEdge@@\expandafter{\prevEdge@@}%
+ \frame@emph@@\frmradius@@}}
+\xydef@\frame@fill@#1{\filled@{#1}\empty}
+\xydef@\frame@emph@#1{\framed@\frmradius@@}
+\xylet@\frame@fill@@=\frame@fill@
+\xylet@\frame@emph@@=\frame@emph@
+\xydef@\filled@#1{\R@=#1\relax
+ \expandafter\DNii@\expandafter{\prevEdge@@}%
+ \DN@{\rectangleEdge}\ifx\next@\prevEdge@@
+ \ifdim\R@=\z@ \DN@{\filled@Rectangle@}%
+ \else \DN@{\filled@Oval@}\fi
+ \else \DN@{\circleEdge}\ifx\next@\prevEdge@@
+ \ifdim\R@=\z@ \DN@{\filled@Ellipse@}%
+ \else \DN@{\restR@max\filled@Circle@}\fi
+ \else
+ \ifdim\R@=\z@ \DN@{\filled@Rectangle@}%
+ \else \DN@{\filled@Circle@}\fi
+ \fi\fi \next@}
+\xydef@\restR@max{%
+ \dimen@=\L@c\advance\dimen@\R@c
+ \dimen@ii=\U@c \advance\dimen@ii\D@c
+ \ifdim\dimen@ii>\dimen@ \dimen@=\dimen@ii\fi
+ \ifdim\dimen@>\z@ \divide\dimen@\tw@
+ \ifdim\R@>\dimen@\R@=\dimen@\fi\fi }
+\xylet@\filledRectangle@@=\bblacked@
+\xylet@\filledCircle@@=\bblacked@
+\xylet@\filledEllipse@@=\bblacked@
+\xylet@\filledOval@@=\bblacked@
+\xydef@\filled@Region@#1#2{\setboxz@h\bgroup
+ \setboxz@h{\vbox{#1#2\empty}}%
+ \A@=\X@c \advance\A@-.5\wd\z@
+ \B@=\Y@c \advance\B@-.5\ht\z@ \advance\B@.5\dp\z@
+ \edef\tmp@{\egroup\dimen@=\the\wdz@}%
+ \kern\A@ \raise\B@\boxz@ \kern-\A@
+ \tmp@ \divide\dimen@\tw@ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \styledboxz@}
+\xydef@\filled@Rectangle@{\filled@Region@\filledRectangle@@}
+\xydef@\filled@Oval@{\filled@Region@\filledOval@@}
+\xydef@\filled@Circle@{\filled@Region@\filledCircle@@}
+\xydef@\filled@Ellipse@{\filled@Region@\filledEllipse@@}
+\xydefcsname@{shape [F...]}#1{\xyFN@\Fshape@#1:@}
+\xylet@\whichframe@@=\empty
+\xylet@\whichoptions@@=\empty
+\xydef@\Fshape@#1:{\def\whichframe@@{{#1}}%
+ \DN@{{}}\ifx\whichframe@@\next@ \def\whichframe@@{{-}}\fi
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\circleEdge}\ifx\next@\nextii@
+ \DN@##1{\def\whichframe@@{[o]##1}}%
+ \expandafter\next@\expandafter{\whichframe@@}\fi
+ \let\whichoptions@@=\empty \xyFN@\Fshape@i}
+\xydef@\Fshape@i{%
+ \ifx @\next \let\next@=\Fshape@x
+ \else\addLT@\ifx\next \let\next@=\Fshape@iii
+ \else \let\next@=\Fshape@ii \fi\fi \next@}
+\xydef@\Fshape@ii#1:{%
+ \expandafter\def\expandafter\whichoptions@@\expandafter{\whichoptions@@[#1]}%
+ \xyFN@\Fshape@i}
+\xydef@\Fshape@iii#1:{\DN@##1{\def\whichframe@@{#1##1}}%
+ \expandafter\next@\expandafter{\whichframe@@}\xyFN@\Fshape@i}
+\xydef@\Fshape@x @{%
+ \edef\next@##1{\noexpand\addbeforeDrop@@{{\EdgefromtheEdge@##1}}}%
+ \DNii@##1##2{\next@{\saveframestyles@{\setbox\z@=\object##2\frm##1%
+ \xypre@Style@@\Drop@@\xypost@Style@@\restoreframestyles@}}}%
+ \expandafter\expandafter\expandafter\nextii@
+ \expandafter\expandafter\expandafter{%
+ \expandafter\whichframe@@\expandafter}\expandafter{\whichoptions@@}}
+\xydef@\saveframestyles@{%
+ \expandafter\def\expandafter\afterframe@preStyle@\expandafter{\preXY@style@}%
+ \expandafter\def\expandafter\afterframe@postStyle@\expandafter{\postXY@style@}}
+\xydef@\restoreframestyles@{%
+ \expandafter\gdef\expandafter\preXY@style@\expandafter{\afterframe@preStyle@}%
+ \expandafter\gdef\expandafter\postXY@style@\expandafter{\afterframe@postStyle@}%
+ \def\afterframe@preStyle@{}\def\afterframe@postStyle@{}}
+\xydef@\xycircleframe@x@{\L@=\R@ \xycircleframe@x@i}%
+\xydef@\xyellipseframe@x@#1#2{\R@=#1\relax \L@=#2\relax \xycircleframe@x@i}
+\xydef@\xycircleframe@x@i{%
+ \ifx\framehfill\frm@solidh@@\def\circleSTYLE@{}%
+ \else\ifx\framehfill\frm@doth@@
+ \expandafter\def\expandafter\circleSTYLE@\expandafter{\addDOT@{}}%
+ \else\ifx\framehfill\frm@dashh@@
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter
+ \expandafter\circleSTYLE@\expandafter\expandafter\expandafter
+ {\expandafter\addDASH@\addDASH@{}}%
+ \fi\fi\fi \xycircleframe@x@x }
+\xydef@\xycircleframe@x@x{\hbox{\vbox{\vskip\L@
+ \hbox to2\R@{\hfill \buildcircle@ \hfill}\vskip\L@ }}}
+\xydef@\UseCurveFrames@{%
+ \let\circled@x@@=\xycircleframe@x@
+ \let\ellipsed@x@@=\xyellipseframe@x@ }
+\def\UseCurveFrames{\xywithoption{curve}{\UseCurveFrames@}}%
+\xydef@\UseFontFrames@{%
+ \let\circled@x@@=\circled@x@
+ \let\ellipsed@x@@=\ellipsed@x@ }
+\xylet@\UseFontFrames=\UseFontFrames@
+\xydef@\UnloadFrames@{%
+ \let\framed@body@@=\framed@body@
+ \let\circled@x@@=\circled@x@
+ \let\ellipsed@x@@=\ellipsed@x@
+ \let\frame@fill@@=\frame@fill@
+ \let\frame@emph@@=\frame@emph@
+ \let\filledRectangle@@=\bblacked@
+ \let\filledCircle@@=\bblacked@
+ \let\filledEllipse@@=\bblacked@
+ \let\filledOval@@=\bblacked@
+}
+\xyaddunsupport{frame}\UnloadFrames@
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xygraph.tex b/macros/generic/diagrams/xypic/texinputs/xygraph.tex
new file mode 100644
index 0000000000..fef420ce6f
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xygraph.tex
@@ -0,0 +1,219 @@
+%% xygraph.tex from $Id: xygraph.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Graph Combinator feature'' option.
+%% Copyright (c) 1994-1997 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{graph}{Graph feature}{\stripRCS$Revision: 3.11 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xyrequire{arrow}\xycatcodes
+\xydef@\xygraph#1{\relax\graph#1\endgraph}
+\xydef@\graph{\if\inxy@ \DN@{\xy@@{\nter@{}}}%
+ \else \DN@{\xy \xy@\xy{\nter@\endxy}}\fi \next@
+ \xy@\xygraph{\senter@ \idfromc@{?NODE}\spushc@
+ \expandafter\let\expandafter\next@\csname Q@graphbase\endcsname
+ \ifx\next@\relax \setbase@\z@\z@{3pc}\z@
+ \else \expandafter\next@ \fi}%
+ \GRAPH[]}
+\xydef@\endgraph{\ignorespaces}
+\xydef@\GRAPH{\xyFN@\GRAPH@}
+\xydef@\GRAPH@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\GRAPH@}%
+ \else\ifx :\next \DN@:{\xy@:{}\expandafter\GRAPHar@\GRAPHeveryarrow@@}%
+ \else\addDASH@\ifx\next
+ \addDASH@\DN@{\xy@-{}\expandafter\GRAPHar@\GRAPHeveryline@@}%
+ \else\ifx (\next
+ \DN@({\xy@({\spushid@{?NODE}\idfromc@{?NODE}}\xyFN@\GRAPH@}%
+ \else\ifx ,\next
+ \DN@,{\xy@,{\cfromid@{?NODE}}\xyFN@\GRAPH@}%
+ \else\ifx )\next
+ \DN@){\xy@){\cfromid@{?NODE}%
+ \tests@\z@{\idfroms@{?NODE}\z@ \spop@}{\xyerror@{) without (}{}}}%
+ \xyFN@\GRAPH@}%
+ \else\ifx \endgraph\next \DN@{\xy@@{\tests@\z@\spop@\sleave@\leave@}}%
+ \else\ifx \end\next \DN@{\xy@@{\tests@\z@\spop@\sleave@\leave@}}%
+ \else\ifx ~\next
+ \DN@~{\xy@@{\enter@\cfromthec@}\afterNODE{\leave@ \xyFN@\GRAPH@}!}%
+ \else \DN@{\afterNODE{\xyFN@\GRAPH@}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xylet@\GRAPHsaved@PATHafterPOS=\PATHafterPOS
+\xylet@\GRAPHsaved@afterar@@=\afterar@@
+\xydef@\GRAPHar@{%
+ \let\PATHafterPOS=\afterNODE \let\afterar@@=\GRAPHafterar@ \ar}
+\xydef@\GRAPHafterar@{%
+ \let\PATHafterPOS=\GRAPHsaved@PATHafterPOS
+ \let\afterar@@=\GRAPHsaved@afterar@@
+ \xy@@{\cfromid@{}}\xyFN@\GRAPH@}
+\xylet@\afterNODE@@=\empty
+\xydef@\afterNODE#1{\xy@@{\enter@\pfromthep@}%
+ \DN@##1{\def\afterNODE@@{\xy@@\leave@ \def\afterNODE@@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterNODE@@}%
+ \xyFN@\NODE@}
+\xylet@\theMOVE@@=\relax
+\xydef@\NODE@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@}%
+ \else\ifx [\next \DN@[##1]{\xy@{[##1]}{}%
+ \def\theMOVE@@{[##1]}\xyFN@\MOVE@##1]}%
+ \else\ifx "\next \DN@ "##1"{%
+ \xy@{"##1"}{\cfromid@{##1}}\def\theMOVE@@{"##1"}\xyFN@\NODE@i}%
+ \else\ifx ?\next \DN@ ?{%
+ \xy@?{\cfromid@{?NODE}}\def\theMOVE@@{?}\xyFN@\NODE@i}%
+ \else\ifx !\next \def\theMOVE@@{[]}\let\next@=\NODE@i
+ \else \testAND@\iffalse
+ \DN@##1{\xy@{}{\pfromc@ \advance\X@c\X@xbase \advance\Y@c\Y@xbase
+ \czeroEdge@}\jumpMOVE@ \xyFN@\NODE@i}%
+ \else\ifx \\\next
+ \DN@\\{\xy@\\{\pfromc@ \advance\X@c\X@xbase \advance\Y@c\Y@xbase
+ \R@c=\X@ybase \U@c=\Y@ybase \intersect@
+ \advance\X@c-\X@ybase \advance\Y@c-\Y@ybase
+ \czeroEdge@}\def\theMOVE@@{\\}\xyFN@\NODE@i}%
+ \else \xyerror@{Illegal <node>: \string`\meaning\next\string' unexpected}{}%
+ \fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\jumpMOVE@@{&}
+\xydef@\jumpMOVE@{\let\theMOVE@@=\jumpMOVE@@}
+\xydef@\MOVE@{\xy@@{\count@=\z@ \count@@=\z@}%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\MOVE@}%
+ \else\ifcat A\noexpand\next \let\next@=\MOVE@letter
+ \else \let\next@=\MOVE@x \fi\fi \next@}
+\xydef@\MOVE@letter{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\MOVE@letter}%
+ \else\ifx u\next \DN@ u{\xy@@{\advance\count@\@ne}\xyFN@\MOVE@letter}%
+ \else\ifx d\next \DN@ d{\xy@@{\advance\count@\m@ne}\xyFN@\MOVE@letter}%
+ \else\ifx l\next \DN@ l{\xy@@{\advance\count@@\m@ne}\xyFN@\MOVE@letter}%
+ \else\ifx r\next \DN@ r{\xy@@{\advance\count@@\@ne}\xyFN@\MOVE@letter}%
+ \else \let\next@=\MOVE@x \fi\fi\fi\fi\fi \next@}
+\xydef@\MOVE@x{%
+ \ifx ]\next \DN@ ]{\MOVE@hop \xyFN@\NODE@i}%
+ \else\ifx (\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\ifx !\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\ifx /\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\addLT@\ifx\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\addGT@\ifx\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\addDASH@\ifx\next \addDASH@\DN@{\xyerror@{- not implemented yet}{}}%
+ \else \xyerror@{illegal <move>: \codeof\theMOVE@@}{}\let\next@=\NODE@i
+ \fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\MOVE@hop{\xy@@{\pfromc@ \czeroEdge@
+ \edef\next@{\the\count@@,\the\count@ @}\expandafter\vfromcartesian@@\next@
+ \advance\X@c-\X@origin \advance\Y@c-\Y@origin
+ \advance\X@c\X@p \advance\Y@c\Y@p}}
+\xydef@\MOVE@place{\xy@@\no@@ \afterPLACE{\xyFN@\MOVE@}}
+\xydef@\NODE@i{\let\next@=\NODE@x
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@i}%
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@"##1"{\xy@{="##1"}{\idfromc@{##1}}\xyFN@\NODE@i}%
+ \else\ifx !\next \DN@!{\xyFN@\NODE@escape}%
+ \else\ifx :\next
+ \else\addDASH@\ifx\next
+ \else\ifx (\next
+ \else\ifx ,\next
+ \else\ifx )\next
+ \else\ifx ~\next
+ \else\ifx [\next
+ \else\ifx "\next
+ \else\ifx ?\next
+ \else\ifx ^\next
+ \else\ifx _\next
+ \else\ifx |\next
+ \else\addLQ@\ifx\next
+ \else\addRQ@\ifx\next
+ \else \testAND@ \iffalse
+ \else\ifx \\\next
+ \else\ifx \endgraph\next
+ \else\ifx \end\next
+ \else \let\next@=\NODE@it
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\NODE@x{\xy@@{\idfromc@{}}\afterNODE@@}
+\xydef@\NODE@it{\let\PATHlabelit@@=\NODEit@ \PATHit@}
+{\xyuncatcodes \gdef\next{+}}
+\xylet@\GRAPHnodemodifiers@@=\next
+\xydef@\NODEit@#1{%
+ \DN@{#1}\ifx\next@\empty
+ \DN@{\expandafter\NODEit@i\expandafter{\GRAPHnodemodifiers@@}}%
+ \else \DN@{\NODEit@i{#1}}\fi \next@}
+\def\NODEit@i#1#2{\xy@{*#1{#2}}{\drop@{#1}{#2}}%
+ \DN@{\addEQ@\ifx\next\else \xy@@{\idfromc@{#2}}\fi \NODE@i}%
+ \xyFN@\next@}
+\xydef@\NODE@escape{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@escape}%
+ \else\ifcat A\noexpand\next \DN@##1{\rungraphescape@{##1}}%
+ \else\ifcat !\noexpand\next \DN@##1{\rungraphescape@{##1}}%
+ \else\ifx \bgroup\next \DN@##1{\xy@{!{##1}}{}\POS##1\relax \xyFN@\NODE@i}%
+ \else\ifx ~\next \let\next@=\graphsetup@
+ \else \DN@{\xyerror@{Unknown graph <escape>}{}\xyFN@\NODE@i}%
+ \fi\fi\fi\fi\fi \next@}
+\xydefcsname@{graph !M}#1#{\NODE@matrix{#1}}
+\xydef@\NODE@matrix#1#2{\xyerror@{matrix feature not loaded}{}\xyFN@\GRAPH@}
+\xydef@\NODE@matrix@#1#2{\xy@{!M#1{#2}}{}%
+ \def\everyentry@{\GRAPHeveryentry}%
+ \xymatrix#1{#2}%
+ \let\everyentry@=\empty \insertmatrixingraph@ \xyFN@\NODE@i}
+\xydef@\GRAPHeveryentry{\def\:{\ar}\def\="##1"{\xy@@{\idfromc@{##1}}}}
+\xywithoption{matrix}{\let\NODE@matrix=\NODE@matrix@}
+\xydef@\insertmatrixingraph@{%
+ \xy@@{\enter@{\cfromthec@ \pfromthep@}%
+ \expandafter\let\expandafter\next@\csname Q@1,1\endcsname
+ \ifx\next@\relax\else
+ \next@ \swap@
+ \expandafter\let\expandafter\next@\csname Q@1,2\endcsname
+ \ifx\next@\relax\else \next@ \setbase@\X@p\Y@p\X@c\Y@c
+ \expandafter\let\expandafter\next@\csname Q@2,1\endcsname
+ \ifx\next@\relax\else
+ \next@ \setbase@@{-\X@c}{-\Y@c}\fi\fi\fi
+ \leave@}}
+\xydefcsname@{graph !P}#1#{\NODE@poly{#1}}
+\xydef@\NODE@poly#1#2{\xyerror@{poly(gon) feature not loaded}{}\xyFN@\GRAPH@}
+\xydef@\NODE@poly@#1#2{\xy@{!P#1{#2}}{}\xypoly@#1{#2}\xyFN@\NODE@i}
+\xywithoption{poly}{\let\NODE@poly=\NODE@poly@}
+\xydefcsname@{graph !E}#1#{\NODE@arc{#1}!}
+\xydef@\NODE@arc#1#2{\xyerror@{(ellipse+)arc feature not loaded}{}%
+ \xyFN@\GRAPH@}
+\xydef@\NODE@arc@#1#2{\xy@{!E#1{#2}}{}\ellipse#1{#2}\xyFN@\NODE@i}
+\xywithoption{arc}{\let\NODE@arc=\NODE@arc@}
+\xylet@\GRAPHeveryarrow@@=\empty
+{\xyuncatcodes \gdef\next{@{-}}}
+\xylet@\GRAPHeveryline@@=\next
+\xydef@\graphsetup@~{\xyFN@\graphsetup@i}
+\xydef@\graphsetup@i{%
+ \ifx :\next \DN@:##1{\def\GRAPHeveryarrow@@{##1}\xyFN@\NODE@i}%
+ \else\addDASH@\ifx\next
+ \addDASH@\DN@##1{\def\GRAPHeveryline@@{##1}\xyFN@\NODE@i}%
+ \else\ifx *\next \DN@*##1{\def\GRAPHnodemodifiers@@{##1}\xyFN@\NODE@i}%
+ \else\ifcat A\next \DN@##1##2{\newgraphescape{##1}{##2}\xyFN@\NODE@i}%
+ \else \DN@{\xyerror@{illegal graph setup \codeof\next@}{}\xyFN@\NODE@i}%
+ \fi\fi\fi\fi \next@}
+\xydef@\newgraphescape#1{%
+ \expandafter\let\expandafter\next\csname graph !#1\endcsname
+ \ifx\next\relax\else \expandafter\let\csname G!#1\endcsname=\undefined
+ \xywarning@{Redefining graph <escape> !#1}\fi
+ \expandafter\gdef\csname graph !#1\endcsname{%
+ \expandafter\let\expandafter\next\csname G!#1\endcsname
+ \expandafter\xyFN@\expandafter\NODE@\next}%
+ \DN@{\newgraphescape@{#1}}\xyFN@\next@}
+\xydef@\newgraphescape@#1{%
+ \ifx [\next
+ \ifx\newcommand\undefined \xyerror@{[n] only with LaTeX}%
+ \else
+ \def\nextiv@{\expandafter\newcommand\expandafter{\csname G!#1\endcsname}}\fi
+ \else \def\nextiv@{\expandafter\gdef\csname G!#1\endcsname}\fi \nextiv@}
+\xydef@\rungraphescape@#1{%
+ \expandafter\let\expandafter\next\csname graph !#1\endcsname
+ \ifx\next\relax \xyerror@{Undefined graph <escape> !#1}\fi \next}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyidioms.tex b/macros/generic/diagrams/xypic/texinputs/xyidioms.tex
new file mode 100644
index 0000000000..c4026d436b
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyidioms.tex
@@ -0,0 +1,72 @@
+%% xyidioms.tex from $Id: xyidioms.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Format-dependent idioms for Xy-pic.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyidiomsloaded\empty \message{not reloaded}\endinput \fi
+\let\xyidiomsloaded=\empty
+\xywarnifdefined\A@ \dimendef\A@=4
+\xywarnifdefined\B@ \dimendef\B@=6
+\xywarnifdefined\R@ \dimendef\R@=8
+\ifx\undefined\AveryUNLIKELYc@ntr@lSEQUENCE@@\else
+\errmessage{Xy-pic Error: \string\undefined\space defined.}\fi
+\ifx\undefined\literal@ \def\literal@#1{#1}\fi
+\ifx\undefined\eat@ \def\eat@#1{}\fi
+\xydef@\xyFN@{\futurelet\next}
+\ifx\undefined\DN@ \def\DN@{\def\next@}\fi
+\ifx\undefined\DNii@ \def\DNii@{\def\nextii@}\fi
+\ifx\undefined\setboxz@h\def\setboxz@h{\setbox\z@\hbox}\fi
+\ifx\undefined\wdz@ \def\wdz@{\wd\z@}\fi
+\ifx\undefined\boxz@ \def\boxz@{\box\z@}\fi
+\ifx\undefined\W@ \def\W@{\immediate\write16 }\fi
+\ifx\undefined\space@ \def\space@.{\futurelet\space@\relax}\space@. \fi
+\ifx\undefined\notempty \def\notempty#1{T\if @#1@F\else T\fi}\fi
+\xydef@\xysetup@dummy#1{\xyuncatcodes#1}
+\xywarnifdefined\xysetup@@
+\ifx\AtEndDocument\undefined
+ \expandafter\ifx\csname amsppt.sty\endcsname\relax
+ \let\xysetup@@=\xysetup@dummy
+ \else
+ \def\xysetup@@#1{%
+ \expandafter\def\expandafter\topmatter\expandafter{\topmatter
+ #1\xyuncatcodes}}\fi
+\else
+ \def\xysetup@@#1{\AtBeginDocument{#1\xyuncatcodes}}
+\fi
+\ifx\xysetup@@\xysetup@dummy\else
+ \xysetup@@{\let\xysetup@@=\xysetup@dummy \xyuncatcodes}\fi
+\xywarnifdefined\xyclosedown@@
+\ifx\AtEndDocument\undefined \let\xyclosedown@@=\eat@
+\else \def\xyclosedown@@#1{\AtEndDocument{#1}}\fi
+\xylet@\xy@begindvi=\literal@
+\ifx\undefined\AtBeginDvi\else
+ \AtBeginDocument{\let\xy@begindvi=\AtBeginDvi}
+ \AtBeginDvi{\global\let\xy@begindvi=\literal@}\fi
+\ifx\amstexloaded@\relax
+\xylet@\toks@ii=\toks@@ \endinput \fi
+\ifx\@tempcnta\undefined
+\xynew@{count}\count@@
+\xynew@{count}\count@@@
+\else
+\xylet@\count@@=\@tempcnta
+\xylet@\count@@@=\@tempcntb
+\fi
+\ifx\undefined\toks@ii \toksdef\toks@ii=2 \fi
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyimport.tex b/macros/generic/diagrams/xypic/texinputs/xyimport.tex
new file mode 100644
index 0000000000..6c5e340d4e
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyimport.tex
@@ -0,0 +1,68 @@
+%% xyimport.tex from $Id: xyimport.doc,v 3.13 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Import feature'' option.
+%% Copyright (c) 1993-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{import}{Import graphics extension}{\stripRCS$Revision: 3.13 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\xyimport#1#{\xyimport@{#1}}
+\xydef@\xyimport@#1#2{\xydelayimport@{#1}{#2}}
+\xydef@\xydelayimport@#1#2{\xy@@ix@{#1{#2}}%
+ \xy@@{\expandafter\xyextern@\the\toks9}}
+\xydef@\xyextern@(#1,#2){\hbox\bgroup\R@c=#1\p@ \U@c=#2\p@\xyextern@i}
+\xydef@\xyextern@i#1#{\DN@{#1}%
+ \ifx\next@\empty \L@c=\z@ \D@c=\z@ \DN@{\xyextern@x}%
+ \else \DN@{\xyextern@ii#1}\fi \next@ }
+\xydef@\xyextern@ii(#1,#2){\L@c=#1\p@ \D@c=#2\p@
+ \advance\R@c-\L@c \advance\U@c-\D@c \xyextern@x}
+\xydef@\xyimportdefault@{3}
+\xydef@\xyexportwarning@#1#2#3{\xywarning@{%
+ #1 for import has zero #2; using \xyimportdefault@#3 default}}
+\xydef@\xyextern@x#1{\toks@={\egroup\L@c=}\setboxz@h{#1}%
+ \dimen@ii=\L@c \advance\dimen@ii\R@c \dimen@=\wdz@
+ \ifdim\dimen@=\z@ \xyexportwarning@{graphic}{width}{cm}%
+ \dimen@=\xyimportdefault@ cm\fi
+ \ifdim\dimen@ii=\z@ \xyexportwarning@{coords}{width}{unit}%
+ \dimen@ii=\xyimportdefault@\p@\fi
+ \quotient@\next@\dimen@\dimen@ii \dimen@=\next@\p@
+ \edef\tmp@{\expandafter\removePT@\the\L@c}\L@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\L@c\relax\R@c=}%
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\R@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\R@c\relax\setbase@\z@\z@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\dimen@}\z@\D@c=}%
+ \dimen@ii=\U@c \advance\dimen@ii\D@c \dimen@=\ht\z@\advance\dimen@\dp\z@
+ \ifdim\dimen@=\z@ \xyexportwarning@{graphic}{height}{cm}%
+ \dimen@=\xyimportdefault@ cm\fi
+ \ifdim\dimen@ii=\z@ \xyexportwarning@{coords}{height}{unit}%
+ \dimen@ii=\xyimportdefault@\p@\fi
+ \quotient@\next@\dimen@\dimen@ii \dimen@=\next@\p@
+ \edef\tmp@{\expandafter\removePT@\the\D@c}\D@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\D@c\relax\U@c=}%
+ \edef\tmp@{\expandafter\removePT@\the\U@c}\U@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\U@c\relax\setbase@@\z@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\dimen@}}%
+ \setboxz@h{\kern-\L@c\lower\D@c\boxz@\kern\L@c}%
+ \wd\z@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@ \the\toks@ \X@c=\z@ \Y@c=\z@
+ \ifdim\X@min>-\L@c \X@min=-\L@c \fi \ifdim\X@max<\R@c \X@max=\R@c \fi
+ \ifdim\Y@min>-\D@c \Y@min=-\D@c \fi \ifdim\Y@max<\U@c \Y@max=\U@c \fi
+ \idfromc@{import}\POS }
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyknot.tex b/macros/generic/diagrams/xypic/texinputs/xyknot.tex
new file mode 100644
index 0000000000..4c5d7108ed
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyknot.tex
@@ -0,0 +1,901 @@
+%% xyknot.tex from $Id: xyknot.doc,v 3.9 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Knots and Links'' feature.
+%% Copyright (c) 1994-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this macro package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{knot}{Knots and Links feature}{\stripRCS$Revision: 3.9 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\message{knots and links,}
+\xyrequire{arrow}\xycatcodes
+\xydef@\xykparsecross@{%
+ \def\xykSCALE@@{}\edef\xyknotPLACE{\xykmidPLACE@}%
+ \let\xykparser@=\xykparsecross@@
+ \def\xykdefaultbreak@{\let\xykbreak@=\xykforetemp@
+ \def\xyknotPLACE{(.5)}\appendtoholder@}%
+ \xyFN@\xykparsescale@ }
+{\xyuncatcodes \catcode`@=11
+\gdef\next{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsecross@@}%
+ \else\addLT@\ifx\next \addLT@\DN@{\xyprecross@}%
+ \else\addGT@\ifx\next \addGT@\DN@{\xypostcross@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\xyFN@\xykparsetips@@}%
+ \else\ifx|\next\DN@|{\xymidcross@}%
+ \else\addAT@\ifx\next \addAT@\DN@(##1){%
+ \xyadjustBREAK@i##1@@\xyFN@\xykparsecross@@}%
+ \else\DN@{\afterknot@}%
+ \fi\fi\fi\fi\fi\fi \next@ }}
+\xylet@\xykparsecross@@=\next
+\xydef@\xyprecross@{%
+ \def\xykholder@{\xykprebreak@@}%
+ \edef\xyknotPLACE{\xykprePLACE@}%
+ \xyFN@\xykparsebreak@}
+\xydef@\xypostcross@{%
+ \def\xykholder@{\xykpostbreak@@}%
+ \edef\xyknotPLACE{\xykpostPLACE@}%
+ \xyFN@\xykparsebreak@}
+\xydef@\xymidcross@{%
+ \def\xykholder@{\xykmidbreak@@}%
+ \edef\xyknotPLACE{\xykmidPLACE@}%
+ \xyFN@\xykparsebreak@}
+\xydef@\xykcross@#1{\xykcheckTIPS@
+ \expandafter\toks@\expandafter{\expandafter#1\knotSTYLE}}
+\xydef@\xykoverstring@{\addtotoks@{{}}\xykmidbreak@ \xyknottips@}
+\xydef@\xykunderstring@{\xykprebreak@ \xykpostbreak@ \xyknottips@}
+\xydef@\vcross{\begingroup\def\afterknot@{\xyvcross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\hcross{\begingroup\def\afterknot@{\xyhcross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vcrossneg{\begingroup\def\afterknot@{\xyvcrossneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\hcrossneg{\begingroup\def\afterknot@{\xyhcrossneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vuncross{\begingroup\def\afterknot@{\xyvuncross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\huncross{\begingroup\def\afterknot@{\xyhuncross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xyvcross{\xykcross@\xykcrossv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyhcross{\xykcross@\xykcrossh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyvcrossneg{\xykcross@\xykcrossv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyhcrossneg{\xykcross@\xykcrossh
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyvuncross{\xykcross@\xykuncrossv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyhuncross{\xykcross@\xykuncrossh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz_\ar #1@'{"_<"**{}?(.25)@+,?+(.375,0)@+,
+ "_>";"^>"**{}?-(.375,0)@+,?(.25)@+}"_>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?+(.375,0)@+,
+ "^>";"_>"**{}?-(.375,0)@+,?(.25)@+}"^>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykcrossv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz_\ar #1@'{"_>"**{}?(.25)@+,?+(0,.375)@+,
+ "^>";"^<"**{}?-(0,.375)@+,?(.25)@+}"^>"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?+(0,.375)@+,
+ "^<";"^>"**{}?-(0,.375)@+,?(.25)@+}"^<"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykcrossh=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"_<"**{}?(.25)@+,?(.375)+(.375,0)@+,
+ "^>";"_>"**{}?(.375)-(.375,0)@+,?(.25)@+}"^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?(.375)+(.375,0)@+,
+ "_>";"^>"**{}?(.375)-(.375,0)@+,?(.25)@+}"_>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykuncrossv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz^\ar #1@'{"_>"**{}?(.25)@+,?(.375)+(0,.375)@+,
+ "^<";"^>"**{}?(.375)-(0,.375)@+,?(.25)@+}"^<"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?(.375)+(0,.375)@+,
+ "^>";"^<"**{}?(.375)-(0,.375)@+,?(.25)@+}"^>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykuncrossh=\next
+\xydef@\vover{\begingroup\def\afterknot@{\xyvover}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{|(.725)\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\hover{\begingroup\def\afterknot@{\xyhover}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{|(.725)\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vunder{\begingroup\def\afterknot@{\xyvunder}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.2)}\def\xykpostbreak@@{|(.275)\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\hunder{\begingroup\def\afterknot@{\xyhunder}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.2)}\def\xykpostbreak@@{|(.275)\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vunover{\begingroup\def\afterknot@{\xyvunover}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\hunover{\begingroup\def\afterknot@{\xyhunover}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xoverv{\begingroup\def\afterknot@{\xyxoverv}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xunderv{\begingroup\def\afterknot@{\xyxunderv}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xoverh{\begingroup\def\afterknot@{\xyxoverh}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xunderh{\begingroup\def\afterknot@{\xyxunderh}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.85)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xunover{\begingroup\def\afterknot@{\xyxunover}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xunoverv{\begingroup\def\afterknot@{\xyxunoverv}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.2)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xunoverh{\begingroup\def\afterknot@{\xyxunoverh}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xyvover{\xykcross@\xykoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyhover{\xykcross@\xykoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyvunder{\xykcross@\xykoverv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyhunder{\xykcross@\xykoverh
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyvunover{\xykcross@\xykunoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyhunover{\xykcross@\xykunoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyxoverv{\xykcross@\xykxoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyxunderv{\xykcross@\xykxoverv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyxoverh{\xykcross@\xykxoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyxunderh{\xykcross@\xykxoverh
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyxunover{\xykcross@\xykxoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyxunoverv{\xykcross@\xykxunoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyxunoverh{\xykcross@\xykxunoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"^>"**{}?(.25)@+,?(.625)+(0,-.125)@+,
+ "_>";"^>"**{}?(.625)-(.125,0)@+,?(.25)@+}"_>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?(.625)+(.125,0)@+,
+ "^>";"^<"**{}?(.625)-(0,.125)@+,?(.25)@+}"^>"#6#7#8},\restore\POS#9}}
+\xylet@\xykoverv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz^\ar #1@'{"^<"**{}?(.25)@+,?(.625)+(.125,0)@+,
+ "^>";"^<"**{}?(.625)-(0,.125)@+,?(.25)@+}"^>"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?(.625)+(0,.125)@+,
+ "^<";"_<"**{}?(.625)+(.125,0)@+,?(.25)@+}"^<"#6#7#8},\restore\POS#9}}
+\xylet@\xykoverh=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"^>"**{}?(.25)@+,?-(0,.175)@+,?(.75)@+}
+ "^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?+(.125,0)@+,
+ "_>"**{}?+(0,.7)@+,"_>";"^>"**{}?-(.125,0)@+,?(.25)@+}
+ "_>"#6#7#8},\restore\POS#9}}
+\xylet@\xykunoverv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz^\ar #1@'{"^<"**{}?(.25)@+,?+(.175,0)@+,?(.75)@+}
+ "^<"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?+(0,.125)@+,
+ "^>"**{}?-(.7,0)@+,"^>";"^<"**{}?-(0,.125)@+,?(.25)@+}
+ "^>"#6#7#8},\restore\POS#9}}
+\xylet@\xykunoverh=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"^>"**{}?="^_","_<";"_>"**{}?;"^_",**{}?="^_",
+ "^>",{\xykz^\ar #1@'{"^_"@+}"_<"#3#4#5},
+ "^<",{\xykz_\ar #2@'{"^_"@+}"_>"#6#7#8},\restore\POS#9}}
+\xylet@\xykxoverv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"_<"**{}?="^_","^>";"_>"**{}?;"^_",**{}?="^_",
+ "^<",{\xykz_\ar #1@'{"^_"@+}"_>"#3#4#5},
+ "_<",{\xykz_\ar #2@'{"^_"@+}"^>"#6#7#8},\restore\POS#9}}
+\xylet@\xykxoverh=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"^>"**{}?="^_","_<";"_>"**{}?;"^_",**{}?="^_",
+ "^>",{\xykz^\ar #1@'{"^_"@+}"_>"#3#4#5},
+ "^<",{\xykz^\ar #2@'{"^_"@+}"_<"#6#7#8},\restore\POS#9}}
+\xylet@\xykxunoverv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"_<"**{}?="^_","^>";"_>"**{}?;"^_",**{}?="^_",
+ "^<",{\xykz^\ar #1@'{"^_"@+}"^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^_"@+}"_>"#6#7#8},
+ \restore\POS#9}}
+\xylet@\xykxunoverh=\next
+\xydef@\vtwist{\begingroup\def\afterknot@{\xyvtwist}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\htwist{\begingroup\def\afterknot@{\xyhtwist}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vtwistneg{\begingroup\def\afterknot@{\xyvtwistneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\htwistneg{\begingroup\def\afterknot@{\xyhtwistneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vuntwist{\begingroup\def\afterknot@{\xyvuntwist}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.85)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\huntwist{\begingroup\def\afterknot@{\xyhuntwist}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.85)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\xyvtwist{\xykcross@\xyktwistv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyvtwistneg{\xykcross@\xyktwistv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyvuntwist{\xykcross@\xykuntwistv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyhtwist{\xykcross@\xyktwisth
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyhuntwist{\xykcross@\xykuntwisth
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\xydef@\xyhtwistneg{\xykcross@\xyktwisth
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^>",{\xykz_\ar #1@'{"_>"**{}?(.25)@+,?-(.375,0)@+,
+ "_<";"^<"**{}?+(.375,0)@+,?(.25)@+}"_<"#3#4#5},
+ "^<",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?+(.375,0)@+,
+ "_>";"^>"**{}?+(-.375,0)@+,?(.25)@+}"_>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xyktwistv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^>",{\xykz^\ar #1@'{"_>"**{}?(.125)@+,?(.375)-(.25,0)@+,
+ ?(.625)-(.25,0)@+,?(.875)@+}"_>"#3#4#5},
+ "^<",{\xykz^\ar #2@'{"_<"**{}?(.125)@+,?(.375)+(.25,0)@+,
+ ?(.625)+(.25,0)@+,?(.875)@+}"_<"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykuntwistv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz_\ar #1@'{"^>"**{}?(.25)@+,?+(0,-.375)@+,
+ "_>";"_<"**{}?+(0,.375)@+,?(.25)@+}"_>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"_>"**{}?(.25)@+,?+(0,.375)@+,
+ "^>";"^<"**{}?-(0,.375)@+,?(.25)@+}"^>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xyktwisth=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"^>",**{}?(.125)@+,?(.375)+(0,-.25)@+,
+ ?(.625)+(0,-.25)@+,?(.875)@+}"^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"_>",**{}?(.125)@+,?(.375)+(0,.25)@+,
+ ?(.625)+(0,.25)@+,?(.875)@+}"_>"#6#7#8},\restore\POS #9}}
+\xylet@\xykuntwisth=\next
+\xydef@\xykparsescale@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsescale@}%
+ \else\addDASH@\ifx\next \addDASH@\DN@{\def\xykSCALE@@{-1}%
+ \xyFN@\xykparser@}%
+ \else\ifx[\next \DN@[##1]{\dimen@=##1\p@
+ \ifdim\dimen@=\z@\xywarning@{\xykscaleerror@}%
+ \else\edef\xykSCALE@@{\expandafter\removePT@\the\dimen@}\fi
+ \xyFN@\xykparser@}%
+ \else\ifx~\next \DN@~##1##2##3##4{%
+ \def\xykSCALE@@{@{##1}{##2}{##3}{##4}}\xyFN@\xykparser@}%
+ \else\DN@{\xyFN@\xykparser@}%
+ \fi\fi\fi\fi \next@}
+\xydef@\xykscaleerror@{Ignoring zero scale factor}
+\xydef@\xykhobject@{\aftergroup\xykhadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+\xydef@\xykvobject@{\aftergroup\xykvadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+\xydef@\xykhvobject@{\aftergroup\xykhvadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+\xydef@\xykhuobject@{\aftergroup\xykhuadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+\xydef@\xyksavescale@#1#2{%
+ \expandafter\ifx\the\Edge@c\zeroEdge\relax \def\xyksaveEdgec{}%
+ \else
+ \edef\xyksaveEdgec{\noexpand\Edge@c={\expandafter\noexpand\the\Edge@c}%
+ \L@c=\the\L@c \R@c=\the\R@c \D@c=\the\D@c \U@c=\the\U@c}%
+ \fi
+ \edef\next@##1##2{\endgroup
+ \def\noexpand\xyksaveEdgec{}%
+ \def\noexpand\xykSCALE@@\noexpand{##1}%
+ \def\noexpand\xykjoincontrol\noexpand{\xykjoincontrol}%
+ \noexpand\toks@\noexpand{##2}%
+ \noexpand\xy@@{\def\noexpand\xyksaveEdgec{}%
+ \def\noexpand\xykSCALE@@{##1}%
+ \def\noexpand\xykjoincontrol{\xykjoincontrol}}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\xykSCALE@@\expandafter}%
+ \expandafter{\the\toks@}%
+ \xykrescale@ #1\the\toks@\restore\POS#2}
+\xydef@\xykkeepscale@{%
+ \edef\next@##1{\endgroup \noexpand\toks@={##1}%
+ \def\noexpand\xykjoincontrol{\xykjoincontrol}}%
+ \expandafter\next@\expandafter{\the\toks@}%
+ \def\xykSCALE@@{}\def\xyksaveEdgec{}%
+ \xy@@{\def\xykSCALE@@{}\def\xyksaveEdgec{}}%
+ \edef\next@{\def\noexpand\xykjoincontrol{\xykjoincontrol}}%
+ \expandafter\xy@@\expandafter{\next@}%
+ \xyknoflexscale@ \the\toks@}
+\xydef@\xykrescale@{\expandafter\xykcheckscale@\xykSCALE@@ !}%
+\xydef@\xykcheckscale@#1#2!{%
+ \expandafter\DN@\expandafter{\codeof{#1}}%
+ \expandafter\DNii@\expandafter{\codeof{@}}%
+ \ifx\next@\nextii@\relax\DN@{\xykflexiscale@#2%
+ \xy@@{\divide\X@xbase2\divide\X@ybase2\divide\Y@xbase2\divide\Y@ybase2%
+ \def\xykSCALE@@{}}\def\xykSCALE@@{}%
+ \expandafter\toks@\expandafter{\afterFLEX@}}%
+ \else\DN@{\save \xykrescale@@}\fi \next@ }
+\xydef@\xykflexiscale@{%
+ \expandafter\def\expandafter\afterFLEX@\expandafter{\the\toks@}%
+ \xykflexiscale@@ }
+\xydef@\xykrescale@@{%
+ \edef\next@{\X@xbase=\xykSCALE@@\X@xbase \X@ybase=\xykSCALE@@\X@ybase
+ \Y@xbase=\xykSCALE@@\Y@xbase \Y@ybase=\xykSCALE@@\Y@ybase}%
+ \expandafter\xy@@\expandafter{\next@}%
+ \ifdim\xykSCALE@@\p@<\z@\relax \DN@{\xyknegflexscale@}%
+ \else\DN@{\xyknoflexscale@}\fi \next@ }
+{\xyuncatcodes \gdef\next#1#2#3#4{\save="@",
+ #1,="^<",\POS"@",#2,="^>",\POS"@",#3,="_<",\POS"@",#4,="_>",
+ (0,0);"^>"-"^<"+"_>"-"_<":"^<"-"_<"+"^>"-"_>"::}}
+\xylet@\xykflexiscale@@=\next
+{\xyuncatcodes \gdef\next{\save ="^<",
+ +(1,0)="^>",-(1,1)="_<",+(1,0)="_>"\restore }}
+\xylet@\xyknoflexscale@@=\next
+\xylet@\xyknoflexscale@=\next
+{\xyuncatcodes \gdef\next{\save ="_>",
+ +(-1,1)="^<",+(1,0)="^>",-(1,1)="_<"\restore }}
+\xylet@\xyknegflexscale@@=\next
+\xylet@\xyknegflexscale@=\next
+{\xyuncatcodes \gdef\next{\save ="_<",
+ +(1,0)="_>",+(-1,1)="^<",+(1,0)="^>"\restore }}
+\xylet@\xykhscale@@=\next
+{\xyuncatcodes \gdef\next{\save ="^>",
+ -(1,0)="^<",+(1,-1)="_>",-(1,0)="_<"\restore }}
+\xylet@\xykvscale@@=\next
+\xydef@\xykhadjust@{%
+ \let\xyknoflexscale@=\xykhscale@@
+ \let\xyknegflexscale@=\xyknegflexscale@@ }
+\xydef@\xykvadjust@{%
+ \let\xyknoflexscale@=\xyknoflexscale@@
+ \let\xyknegflexscale@=\xykhscale@@ }
+\xydef@\xykhvadjust@{%
+ \let\xyknoflexscale@=\xyknoflexscale@@
+ \let\xyknegflexscale@=\xyknegflexscale@@ }
+\xydef@\xykhuadjust@{%
+ \let\xyknoflexscale@=\xykhscale@@
+ \let\xyknegflexscale@=\xykvscale@@ }
+\xydef@\xykprebreak@{%
+ \ifx\xykprebreak@@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xykprebreak@@}}\fi}
+\xydef@\xykpostbreak@{%
+ \ifx\xykpostbreak@@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xykpostbreak@@}}\fi}
+\xydef@\xykmidbreak@{%
+ \ifx\xykmidbreak@@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xykmidbreak@@}}\fi}
+\xydef@\xykparsebreak@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsebreak@}%
+ \else \addLT@\ifx\next
+ \expandafter\appendtoholder@\xykbacktemp@\next@
+ \addLT@\DN@{\xyFN@\xykparser@}%
+ \else \addGT@\ifx\next
+ \expandafter\appendtoholder@\xykforetemp@\next@
+ \addGT@\DN@{\xyFN@\xykparser@}%
+ \else \ifx|\next
+ \expandafter\appendtoholer@\xyknulltemp@\next@
+ \DN@|{\xyFN@\xykparser@}%
+ \else \ifx\next \bgroup\DN@##1{\checkgroupbreak@##1@}%
+ \else \ifx (\next\DN@(##1){\xyadjustknotPLACE@i##1@@%
+ \xyFN@\xykparsebreak@}%
+ \else \ifx\next \knothole@\DN@##1{\expandafter\appendtoholder@@
+ \expandafter{\expandafter|\xyknotPLACE\knothole}\next@
+ \xyFN@\xykparser@}%
+ \else
+ \expandafter\xykdefaultbreak@\xykbreak@\next@
+ \DN@{\xyFN@\xykparser@}%
+ \fi\fi\fi\fi\fi\fi\fi \next@ }
+{\xyuncatcodes \gdef\next{^>*\dir{>}}}
+\xylet@\xykforetips@=\next
+{\xyuncatcodes \gdef\next{^<*\dir{<}}}
+\xylet@\xykbacktips@=\next
+{\xyuncatcodes \gdef\next{*!/-1pt/=0\dir{>}}}
+\xylet@\xykforetemp@=\next
+{\xyuncatcodes \gdef\next{*!/1pt/=0\dir{<}}}
+\xylet@\xykbacktemp@=\next
+{\xyuncatcodes \gdef\next{*=<\xykholesize>[o]{}}}
+\xylet@\xykholetemp@=\next
+\xydef@\knothole@{\hbox to\xykholesize{%
+ \dimen@=\xykholesize \divide\dimen@\tw@
+ \hfill \vrule height\dimen@ depth\dimen@ width\z@ }}
+\xylet@\knothole=\knothole@
+\xylet@\khole=\knothole@
+{\xyuncatcodes \gdef\next{*=<0pt>{}}}
+\xylet@\xyknulltemp@=\next
+\xylet@\xykbreak@=\xyknulltemp@
+\xydef@\checkgroupbreak@#1#2@{%
+ \ifx|#1\DN@{\appendtoholder@@#1#2\next@ \xyFN@\xykparser@}%
+ \else \ifx_#1\DN@{\appendtoholder@@_#2\next@ \xyFN@\xykparser@}%
+ \else \ifx^#1\DN@{\appendtoholder@@^#2\next@ \xyFN@\xykparser@}%
+ \else
+ \def\next##1\next{\expandafter\DNii@\expandafter{\xyk@@##1}}%
+ \expandafter\next\xyknotPLACE\next
+ \ifx*#1%
+ \expandafter\DN@\expandafter{%
+ \expandafter\appendtoholder@@\nextii@#1#2\next@ \xyFN@\xykparser@}%
+ \else
+ \expandafter\DN@\expandafter{%
+ \expandafter\appendtoholder@@\nextii@{#1#2}\next@ \xyFN@\xykparser@}%
+ \fi\fi\fi\fi \next@ }
+{\xyuncatcodes \gdef\next{%
+ \expandafter{\expandafter^\xyknotPLACE##1}}}%
+ \DN@{\xydef@\xykholder@@##1}\DNii@{\expandafter\toks@}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\nextii@\next}
+\xydef@\appendtoholder@#1\next@{\xykholder@@{#1}%
+ \DN@##1{\expandafter\DN@\expandafter{\xykholder@##1}}%
+ \expandafter\next@\expandafter{\the\toks@}\appendtoholder@@@ }
+\xydef@\appendtoholder@@#1\next@{%
+ \DN@##1\next@{\expandafter\DN@\expandafter{\xykholder@##1}}%
+ \next@#1\next@ \appendtoholder@@@}%
+\xydef@\appendtoholder@@@{%
+ \expandafter\expandafter\expandafter\DN@
+ \expandafter\expandafter\expandafter{\next@}%
+ \DNii@{\expandafter\def\xykholder@}%
+ \expandafter\nextii@\expandafter{\next@}}
+{\xyuncatcodes \gdef\next{%
+ \expandafter{\expandafter|\xyknotPLACE##1}}}%
+\DN@{\xydef@\xykholer@@##1}\DNii@{\expandafter\toks@}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\nextii@\next}
+\xydef@\appendtoholer@#1\next@{\xykholer@@{#1}%
+ \DN@##1{\expandafter\DN@\expandafter{\xykholder@##1}}%
+ \expandafter\next@\expandafter{\the\toks@}\appendtoholder@@@ }
+\xydef@\xykz#1{\let\xyk@@=#1\xy@@{\let\xyk@@=#1}}
+{\xyuncatcodes \global\let\next=_}
+\xylet@\xyk@@=\next
+\xydef@\xyadjustknotPLACE@i{%
+ \ifx\xyknotPLACE\empty\DN@{\dimen@=.5\p@}%
+ \else\DN@{\expandafter\xygetknotPLACE@@\xyknotPLACE}%
+ \fi \next@ \relax \let\xywhichknotPLACE@@=\xysetknotPLACE@@
+ \xyFN@\xyadjustknotPLACE@}
+\xydef@\xyadjustknotPLACE@{\expandafter\ifx\space@\next
+ \expandafter\DN@\space{\xyFN@\xyadjustknotPLACE@}%
+ \else\addDASH@\ifx\next\DN@{\xyadjustknotPLACE@@}%
+ \else\addPLUS@\ifx\next\DN@{\xyadjustknotPLACE@@}%
+ \else\addEQ@\ifx\next\addEQ@\DN@{\dimen@=\z@ \xyadjustknotPLACE@@}%
+ \else \DN@{\dimen@=\z@ \xyadjustknotPLACE@@}%
+ \fi\fi\fi\fi \next@}
+\xydef@\xyadjustknotPLACE@@#1@@{\advance\dimen@#1\p@
+ \expandafter\xysetknotPLACE@\expandafter{\the\dimen@}}
+\xydef@\xysetknotPLACE@#1{%
+ \expandafter\xywhichknotPLACE@@\expandafter{\removePT@#1}}
+{\xyuncatcodes\gdef\next#1{\def\xyknotPLACE{(#1)}}}%
+\xylet@\xysetknotPLACE@@=\next
+{\xyuncatcodes \catcode`@=11
+ \gdef\next(#1){\DN@\next@{#1}\ifx\next@\empty
+ \dimen@=\z@\else\dimen@=#1\p@ \fi}}%
+\xylet@\xygetknotPLACE@@=\next
+\xydef@\xyadjustJOIN@i{%
+ \ifx\xykjoincontrol\empty\DN@{\dimen@=.75\p@}%
+ \else\DN@{\expandafter\xygetknotPLACE@@\expandafter(\xykjoincontrol)}%
+ \fi \next@ \relax \let\xywhichknotPLACE@@=\xysetjoincontrol@
+ \xyFN@\xyadjustknotPLACE@}
+\xydef@\xyadjustBREAK@i{%
+ \ifx\xykpostbreak@@\empty\DN@{\dimen@=.5\p@}%
+ \else\DN@{\expandafter\xygetpostBREAK@\xykpostbreak@@}%
+ \fi \next@ \relax \let\xywhichknotPLACE@@=\xysetpostbreak@
+ \xyFN@\xyadjustknotPLACE@}
+\xydef@\xygetpostBREAK@|#1\knothole{\DN@{#1}%
+ \ifx\next@\empty\dimen@=.5\p@\else \xygetknotPLACE@@#1\fi}
+\xydef@\xysetpostbreak@#1{\def\xykpostbreak@@{|(#1)\knothole}}
+\xydef@\xysetjoincontrol@#1{\edef\xykjoincontrol{#1}}
+\xydef@\xykparsetips@{%
+ \def\xyknotTIPS@@{}\def\xyknotPLACE{}%
+ \let\xykparser@=\xykparsetips@@
+ \xyFN@\xykparser@ }
+\xydef@\xykparsetips@@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsetips@@}%
+ \else\addLT@\ifx\next
+ \ifx\xyknotTIPS@@\empty \def\xyknotTIPS@@{TF}%
+ \else\DN@{FF}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{TF}%
+ \else\DN@{FT}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{TT}%
+ \fi\fi\fi
+ \addLT@\DN@{\xyFN@\xykparser@}%
+ \else\addGT@\ifx\next
+ \ifx\xyknotTIPS@@\empty \def\xyknotTIPS@@{FT}%
+ \else\DN@{FF}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{FT}%
+ \else\DN@{TF}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{TT}%
+ \fi\fi\fi
+ \addGT@\DN@{\xyFN@\xykparser@}%
+ \else\addEQ@\ifx\next \def\xyknotTIPS@@{TT}%
+ \addEQ@\DN@{\xyFN@\xykparser@}%
+ \else \ifx!\next \def\xyknotTIPS@@{FF}\DN@!{\xyFN@\xykparser@}%
+ \else\DN@{\xyFN@\xykparser@}%
+ \fi\fi\fi\fi\fi \next@ }
+\xydef@\xykcheckTIPS@{%
+ \ifx\xyknotTIPS@@\empty \edef\xyknotTIPS@@{\xyknotTIPS@}\fi
+ \DN@{FF}\ifx\next@\xyknotTIPS@@\def\tmp@{}%
+ \else\DN@{FT}\ifx\next@\xyknotTIPS@@
+ \expandafter\def\expandafter\tmp@\expandafter{\xykforetips@}%
+ \else\DN@{TF}\ifx\next@\xyknotTIPS@@
+ \expandafter\def\expandafter\tmp@\expandafter{\xykbacktips@}%
+ \else
+ \DN@##1\next@{\DN@{\xykforetips@##1}}%
+ \expandafter\next@\xykbacktips@\next@
+ \DNii@{\expandafter\def\expandafter\tmp@\expandafter}%
+ \expandafter\nextii@\expandafter{\next@}%
+ \fi\fi\fi \def\xyknotTIPS@@{}}
+\xydef@\xyknottips@{%
+ \ifx\tmp@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\tmp@}}\fi}
+\xydef@\xykparsejoin@{%
+ \def\xykSCALE@@{}%
+ \edef\xyknotPLACE{\xykmidPLACE@}%
+ \let\xykparser@=\xykparsejoin@@
+ \def\xykdefaultbreak@{\let\xykbreak@=\xykforetemp@
+ \def\xyknotPLACE{(.5)}\appendtoholder@}%
+ \xyFN@\xykparsescale@ }
+{\xyuncatcodes \catcode`@=11
+\gdef\next{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsejoin@@}%
+ \else\addLT@\ifx\next \let\xykbreak@=\xykbacktemp@
+ \def\xykdefaultbreak@{\def\xyknotPLACE{(.5)}%
+ \appendtoholder@}\addLT@\DN@{\xyprecross@}%
+ \else\addGT@\ifx\next \let\xykbreak@=\xykforetemp@
+ \def\xykdefaultbreak@{\def\xyknotPLACE{(.5)}%
+ \appendtoholder@}\addGT@\DN@{\xypostcross@}%
+ \else\ifx|\next \let\xykbreak@=\xyknulltemp@
+ \def\xykdefaultbreak@{\def\xyknotPLACE{(.5)}%
+ \appendtoholer@}\DN@|{\xymidcross@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\xyFN@\xykparsetips@@}%
+ \else\addAT@\ifx\next \addAT@\DN@(##1){%
+ \xyadjustJOIN@i##1@@\xyFN@\xykparsejoin@@}%
+ \else\DN@{\afterknot@}%
+ \fi\fi\fi\fi\fi\fi \next@ }}
+\xylet@\xykparsejoin@@=\next
+\xydef@\xykjoincontrol@@{.75}%
+\xydef@\xyk@joincontrol@#1{\DN@{#1}%
+ \ifx\next@\empty\edef\xykjoincontrol@@{.75}%
+ \else\dimen@=#1\p@
+ \edef\xykjoincontrol@@{\expandafter\removePT@\the\dimen@}\fi}
+\xylet@\xykjoincontrol\empty
+\xydef@\xykjoincontrol@(#1){\DN@{#1}%
+ \ifx\next@\empty\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \else\dimen@=#1\p@
+ \edef\xykjoincontrol{\expandafter\removePT@\the\dimen@}%
+ \fi \xyFN@\xykparsejoin@@ }
+\xydef@\xykjoincontrol@i#1{\DN@{#1}%
+ \ifx\next@\empty\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \else\dimen@=#1\p@
+ \edef\xykjoincontrol{\expandafter\removePT@\the\dimen@}\fi}
+\xydef@\xykjoin@#1{%
+ \expandafter\toks@\expandafter{\expandafter#1\knotSTYLE}}
+\xydef@\xyksetjoin@{\xykcheckTIPS@
+ \xykprebreak@ \xykmidbreak@ \xykpostbreak@ \xyknottips@ }
+\xydef@\hcap{\begingroup\def\afterknot@{\xyhcap}%
+ \def\xykprePLACE@{(.385)}\def\xykpostPLACE@{(.615)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.25}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\vcap{\begingroup\def\afterknot@{\xyvcap}%
+ \def\xykprePLACE@{(.385)}\def\xykpostPLACE@{(.615)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.25}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xcapv{\begingroup\def\afterknot@{\xyxcapv}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xcaph{\begingroup\def\afterknot@{\xyxcaph}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xyvcap{\xykjoin@\xykcapv \xyksetjoin@ \xykhobject@{}}
+\xydef@\xyhcap{\xykjoin@\xykcaph \xyksetjoin@ \xykvobject@{}}
+\xydef@\xyxcapv{\xykjoin@\xykxcapv \xyksetjoin@ \xykvobject@{+(0,-1)}}
+\xydef@\xyxcaph{\xykjoin@\xykxcaph \xyksetjoin@ \xykhobject@{+(1,0)}}
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_>",{\xyksaveEdgec},{\xykz_\ar #1@'{"^>"**{}?(\xykjoincontrol)@+
+ ,?-(.25,0)@+,"_<";"^<"**{}?+(.25,0)@+,?(\xykjoincontrol)@+}
+ "_<"#3#4#5#6},\restore \POS#7}}
+\xylet@\xykcapv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xyksaveEdgec},{\xykz_\ar #1@'{"_>"**{}?(\xykjoincontrol)@+,
+ ?+(0,.25)@+,"^<";"^>"**{}?-(0,.25)@+,?(\xykjoincontrol)@+}
+ "^<"#3#4#5#6}
+ \restore \POS#7}}
+\xylet@\xykcaph=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^>";"_>"**{}?="^_","^<";"_<"**{}?;"^_",**{}?(\xykjoincontrol)="^_",
+ "_<",{\xyksaveEdgec},{\xykz_\ar #1@'{"^_"@+}
+ "^<"#3#4#5#6},\restore \POS#7}}
+\xylet@\xykxcapv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<";"^>"**{}?="^_","_<";"_>"**{}?;"^_",**{}?(\xykjoincontrol)="^_",
+ "_>",{\xyksaveEdgec},{\xykz_\ar #1@'{"^_"@+}
+ "_<"#3#4#5#6},\restore \POS#7}}
+\xylet@\xykxcaph=\next
+\xydef@\hloop{\begingroup\def\afterknot@{\xyhloop}%
+ \def\xykprePLACE@{(.07)}\def\xykpostPLACE@{(.93)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.75}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\vloop{\begingroup\def\afterknot@{\xyvloop}%
+ \def\xykprePLACE@{(.07)}\def\xykpostPLACE@{(.93)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.75}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xyvloop{\xykjoin@\xykloopv \xyksetjoin@ \xykhobject@{}}
+\xydef@\xyhloop{\xykjoin@\xyklooph \xyksetjoin@ \xykvobject@{}}
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_>",{\xykz_\ar #1@'{"^>"**{}?(\xykjoincontrol)@+,?(1.25)-(.25,0)@+,
+ "_<";"^<"**{}?(1.25)+(.25,0)@+,?(\xykjoincontrol)@+}"_<"#3#4#5#6}
+ \restore \POS#7}}
+\xylet@\xykloopv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xykz_\ar #1@'{"_>"**{}?(\xykjoincontrol)@+,?(1.25)+(0,.25)@+,
+ "^<";"^>"**{}?(1.25)+(0,-.25)@+,?(\xykjoincontrol)@+}"^<"#3#4#5#6}
+ \restore \POS#7}}
+\xylet@\xyklooph=\next
+\xydef@\zbendh{\begingroup\def\afterknot@{\xyzbendh}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\sbendv{\begingroup\def\afterknot@{\xysbendv}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\sbendh{\begingroup\def\afterknot@{\xysbendh}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\zbendv{\begingroup\def\afterknot@{\xyzbendv}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xbendr{\begingroup\def\afterknot@{\xyxbendr}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xbendl{\begingroup\def\afterknot@{\xyxbendl}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xbendu{\begingroup\def\afterknot@{\xyxbendu}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xbendd{\begingroup\def\afterknot@{\xyxbendd}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xyzbendh{\xykjoin@\xykzbendh \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+\xydef@\xysbendv{\xykjoin@\xyksbendv \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+\xydef@\xysbendh{\xykjoin@\xyksbendh \xyksetjoin@ \xykhuobject@{+(1,1)}}
+\xydef@\xyzbendv{\xykjoin@\xykzbendv \xyksetjoin@ \xykhuobject@{+(1,1)}}
+\xydef@\xyxbendr{\xykjoin@\xykxbendr \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+\xydef@\xyxbendl{\xykjoin@\xykxbendl \xyksetjoin@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyxbendu{\xykjoin@\xykxbendu \xyksetjoin@ \xykhvobject@{+(1,0)}}
+\xydef@\xyxbendd{\xykjoin@\xykxbendd \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<",{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"^>"**{}?(\xykjoincontrol)@+,
+ "_>";"_<"**{}?(\xykjoincontrol)@+}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykzbendh=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<",{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_<"**{}?(\xykjoincontrol)@+,
+ "_>";"^>"**{}?(\xykjoincontrol)@+}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xyksbendv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_>"**{}?(\xykjoincontrol)@+,
+ "^>";"^<"**{}?(\xykjoincontrol)@+}"^>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xyksbendh=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"^<"**{}?(\xykjoincontrol)@+,
+ "^>";"_>"**{}?(\xykjoincontrol)@+}"^>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykzbendv=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<"-(0,.5),{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_<";"_>"**{}?(\xykjoincontrol)@+,}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendr=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^>"-(0,.5),{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"_>";"_<"**{}?(\xykjoincontrol)@+,}"_<"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendl=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<"+(.5,0),{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_>";"^>"**{}?(\xykjoincontrol)@+,}"^>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendu=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<"+(.5,0),{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"^>";"_>"**{}?(\xykjoincontrol)@+,}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendd=\next
+{\xyuncatcodes \gdef\next{{@{-}}{@{-}}}}
+\xylet@\knotSTYLE=\next
+{\xyuncatcodes \gdef\next#1{\def\knotSTYLE{{@{#1}}{@{#1}}}}}
+\xylet@\knotstyle=\next
+{\xyuncatcodes \gdef\next#1#2{\def\knotSTYLE{{@{#1}}{@{#2}}}}}
+\xylet@\knotstyles=\next
+{\xyuncatcodes \gdef\next#1{\def\knotSTYLE{#1}}}
+\xylet@\KNOTstyle=\next
+\xydef@\knotholesize@#1{\def\xykholesize{#1}}
+\xydef@\xykholesize{5pt}
+\xylet@\knotholesize=\knotholesize@
+\xylet@\holesize=\knotholesize@
+\xydef@\knottips#1{\def\xyknotTIPS@{#1}}
+\xydef@\xyknotTIPS@{FF}
+\xydef@\xyknotTIPS@@{}
+\xydef@\xykSCALE@@{}
+\xydef@\xykprebreak@@{}%
+\xydef@\xykpostbreak@@{}%
+\xydef@\xykmidbreak@@{}%
+\xydef@\xykprePLACE@{(.25)}%
+\xydef@\xykpostPLACE@{(.75)}%
+\xydef@\xykmidPLACE@{}%
+\xylet@\xykPLACE@=\xykmidPLACE@
+{\gdef\next#1#2#3#4{%
+ \save(0,0);"#2"-"#1"+"#4"-"#3":(.5,0):
+ "#3"-"#1"+"#4"-"#2"::(0,.5)::}}
+\xylet@\xykflexbase@=\next
+\xylet@\xykflexbase=\xykflexbase@
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8{\xykflexbase{#1}{#2}{#3}{#4}%
+ "#1",{\ar @{#5}@'{"#1"+(0,.125)@++(.1875,.125)@+,
+ "#4"-(.1875,.25)@++(.1875,.125)@+}"#4" #6},
+ "#2",{\ar @{#5}@'{"#2"+(0,.125)@++(-.1875,.125)@+,
+ "#3"+(.1875,-.25)@++(-.1875,.125)@+}"#3" #7}%
+\restore \POS#8}}
+\xylet@\Xtwist=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8{\xykflexbase{#1}{#2}{#3}{#4}%
+ "#1",{\ar @{#5}@'{"#1"+(0,.0625)@++(.1875,.0625)@+,
+ "#3"+(.1875,-.125)@++(-.1875,.0625)@+}"#3" #6},
+ "#2",{\ar @{#5}@'{"#2"+(0,.0625)@++(-.1875,.0625)@+,
+ "#4"-(.1875,.125)@++(.1875,.0625)@+}"#4" #7}%
+\restore \POS#8}}
+\xylet@\Xuntwist=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\xykflexbase{#1}{#2}{#3}{#4}%
+ "#1",{\ar @{#5}@'{"#1"+(.1875,.0625)@++(.1875,.1875)@+,
+ "#4"+(-#9,-.125)@+}"#4" #6},
+ "#2",{\ar @{#5}@'{"#2"+(-.1875,.0625)@++(-.1875,.1875)@+,
+ "#3"+(#9,-.125)@+}"#3" #7}%
+\restore \POS#8}}
+\xylet@\Xover=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\xykflexbase{#1}{#2}{#3}{#4}%
+ "#1",{\ar @{#5}@'{"#1"+(.1875,.0625)@++(.1875,.1875)@+,
+ "#2"+(-.1875,.0625)@+}"#2" #6},
+ "#3",{\ar @{#5}@'{"#3"+(#9,-.125)@+,"#3"+(.25,-.25)@+,
+ "#4"+(-#9,-.125)@+}"#4" #7}%
+\restore \POS#8}}
+\xylet@\Xunover=\next
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\xykflexbase{#1}{#2}{#3}{#4}%
+ "#1",{\ar @{#5}@'{"#1"+(0,.125)@++(.125,.25)@+,
+ "#4"+(-.125,.375)@++(.125,-.25)@+}"#4" #6},
+\restore \POS#7}}
+\xylet@\Xcap=\next
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4#5#6#7#8#9{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\Xunover{#2}{#3}{#4}{#5}{#8}{#6}{#7}{"#5"}}%
+ \else\ifdim\dimen@>\z@
+ \DNii@{#6}\ifx\nextii@\empty
+ \DN@{\Xover{#2}{#3}{#4}{#5}{#8}{|(.45)\knothole}{#7}{"#5"}}%
+ \else \DN@{\Xover{#2}{#3}{#4}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \else
+ \DNii@{#7}\ifx\nextii@\empty
+ \DN@{\Xover{#2}{#3}{#4}{#5}{#8}{#6}{|(.45)\knothole}{"#5"}}%
+ \else\DN@{\Xover{#2}{#3}{#4}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \fi\fi
+ \def\tmp@{{#9}}\ifx\tmp@\empty\def\tmp@{{0}}\else\dimen@=#9\p@\fi
+ \expandafter\next@\tmp@ }}
+\xylet@\XXover=\next
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4#5#6#7#8{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\Xuntwist{#2}{#4}{#3}{#5}{#8}{#6}{#7}{"#5"}}%
+ \else\ifdim\dimen@>\z@
+ \DNii@{#6}\ifx\nextii@\empty
+ \DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{|(.45)\knothole}{#7}{"#5"}}%
+ \else \DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \else
+ \DNii@{#7}\ifx\nextii@\empty
+ \DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{#6}{|(.45)\knothole}{"#5"}}%
+ \else\DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \fi\fi \next@ }}
+\xylet@\XXtwist=\next
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\xykuncrossv{#4}{#2}{#3}{+(0,-1)}}%
+ \else\ifdim\dimen@>\z@
+ \DNii@{#2}\ifx\nextii@\empty
+ \DN@{\xyktwistv{#4}{|\knothole}{#3}{+(1,0)}}%
+ \else \DN@{\xyktwistv{#4}{#2}{#3}{+(1,0)}}\fi
+ \else
+ \DNii@{#3}\ifx\nextii@\empty
+ \DN@{\xyktwistv{#4}{#2}{|\knothole}{+(0,-1)}}%
+ \else\DN@{\xyktwistv{#4}{#2}{#3}{+(0,-1)}}\fi
+ \fi\fi \next@ }}
+\xylet@\Vcross=\next
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\xykuncrossh{#4}{#2}{#3}{+(0,-1)}}%
+ \else\ifdim\dimen@<\z@
+ \DNii@{#2}\ifx\nextii@\empty
+ \DN@{\xyktwisth{#4}{|\knothole}{#3}{+(1,0)}}%
+ \else \DN@{\xyktwisth{#4}{#2}{#3}{+(1,0)}}\fi
+ \else
+ \DNii@{#3}\ifx\nextii@\empty
+ \DN@{\xyktwisth{#4}{}{|\knothole}{+(1,0)}}%
+ \else\DN@{\xyktwisth{#4}{#2}{#3}{+(1,0)}}\fi
+ \fi\fi \next@ }}
+\xylet@\Hcross=\next
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3{\dimen@=#1\p@ \save
+ \ifdim\dimen@<\z@
+ \DN@{\POS="@",p="@@",(0,0);(-1,0):(0,-1)::"@@";"@",}%
+ \else\DN@{}\fi
+ \next@ \xykcaph{#3}{#2}\restore }}
+\xylet@\Hcap=\next
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3{\dimen@=#1\p@ \save
+ \ifdim\dimen@<\z@
+ \DN@{\POS="@",p="@@",(0,0);(0,-1)::"@@";"@",}%
+ \else\DN@{}\fi
+ \next@ \xykcapv{#3}{#2}\restore }}
+\xylet@\Vcap=\next
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyline.tex b/macros/generic/diagrams/xypic/texinputs/xyline.tex
new file mode 100644
index 0000000000..d70d6f84ab
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyline.tex
@@ -0,0 +1,237 @@
+%% xyline.tex from $Id: xyline.doc,v 3.10 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Line Width'' extension.
+%% Copyright (c) 1993-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{line}{Line styles extension}{\stripRCS$Revision: 3.10 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydefcsname@{*stylechar@|@}#1{\xyFN@\xywidthchar@#1@@}%
+\xydefcsname@{style [thinner]}{\xyshape@thinner@}
+\xydefcsname@{style [thicker]}{\xyshape@thicker@}
+\xynew@{dimen}\xylinethick@ \xylinethick@=\xydashw@
+\xydef@\xyshape@thicker@{\xylinewidth@i{\multiply\xylinethick@\tw@}}
+\xydef@\xyshape@thinner@{\xylinewidth@i{\divide\xylinethick@\tw@}}
+\xydef@\xylinewidth@i#1{\edef\xyprevwidth@@{\the\xylinethick@}%
+ #1\edef\next@{\xylinethick@=\the\xylinethick@}%
+ \edef\next@ii{\noexpand\addtotoks@{%
+ \noexpand\xylinewidth@@{\next@}{\xyprevwidth@@}}}%
+ \next@ii }
+\xydef@\xywidthchar@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xywidthchar@}%
+ \else\ifx @\next \DN@ @@{\checkXyStyle@}%
+ \else\ifx (\next \DN@ (##1)##2@@{%
+ \xylinewidth@i{\xylinethick@=##1\xydashw@}}%
+ \else\addLT@\ifx \next \addGT@{\addLT@\DN@ ##1}##2@@{%
+ \xylinewidth@i{\xylinethick@=##1\relax}}%
+ \else\ifx *\next \DN@ *@@{\recoverXyStyle@}%
+ \else\addEQ@\ifx \next \addEQ@\DN@##1@@{\checkXyStyle@
+ \addtotoks@{\xynamestyle@{##1}}}%
+ \else\ifx C\next \DN@ C##1@@{\xysetlinecap@{##1}@}%
+ \else\ifx J\next \DN@ J##1@@{\xysetlinejoin@{##1}@}%
+ \else\ifx M\next \DN@ M(##1)@@{\xymiterlimit@{##1}@}%
+ \else \DN@##1@@{\xylinewidth@i{\xylinethick@=##1\relax}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\xylinecap@{2}
+\xydef@\xylinejoin@{2}
+\xydef@\xylinemiter@{10}
+\xydefcsname@{style [bevel]}{\xyshape@bevel@}
+\xydefcsname@{style [roundjoin]}{\xyshape@rdjoin@}
+\xydefcsname@{style [miter]}{\xyshape@miter@}
+\xydefcsname@{style [butt]}{\xyshape@butt@}
+\xydefcsname@{style [roundcap]}{\xyshape@rdcap@}
+\xydefcsname@{style [projcap]}{\xyshape@projcap@}
+\xydef@\xyshape@butt@{\xysetlinecap@@0}
+\xydef@\xyshape@rdcap@{\xysetlinecap@@1}
+\xydef@\xyshape@projcap@{\xysetlinecap@@2}
+\xydef@\xyshape@miter@{\xysetlinejoin@@0}
+\xydef@\xyshape@rdjoin@{\xysetlinejoin@@1}
+\xydef@\xyshape@bevel@{\xysetlinejoin@@2}
+\xydef@\xysetlinecap@#1@{\DN@ii{#1}\count@=#1\relax
+ \expandafter\DN@\expandafter{\the\count@}%
+ \ifx\next@\next@ii\else
+ \xywarning@{ignoring extra tokens in line-cap: \next@}\fi
+ \expandafter\xysetlinecap@@\expandafter{\next@}}
+\xydef@\xysetlinejoin@#1@{\DN@ii{#1}\count@=#1\relax
+ \expandafter\DN@\expandafter{\the\count@}%
+ \ifx\next@\next@ii\else
+ \xywarning@{ignoring extra tokens in line-join: \next@}\fi
+ \expandafter\xysetlinejoin@@\expandafter{\next@}}
+\xydef@\xysetmiterlimit@#1@{\DN@ii{#1}\dimen@=#1\p@\relax
+ \edef\next@{\expandafter\removePT@\the\dimen@}%
+ \ifx\next@\next@ii\else
+ \xywarning@{ignoring extra tokens in miter-limit: \next@}\fi
+ \expandafter\xysetmiterlimit@@\expandafter{\next@}}
+\xydef@\xysetlinecap@@#1{\xy@linecap@i{\def\xylinecap@{#1}}}
+\xydef@\xysetlinejoin@@#1{\xy@linejoin@i{\def\xylinejoin@{#1}}}
+\xydef@\xysetmiterlimit@@#1{%
+ \xy@linemiter@i{\def\xylinemiter@{#1}}}
+\xydef@\xy@linecap@i#1{#1\addtotoks@{\xy@linecap@@{#1}}}
+\xydef@\xy@linejoin@i#1{#1\addtotoks@{\xy@linejoin@{#1}}}
+\xydef@\xy@linemiter@i#1{#1\addtotoks@{\xy@linemiter@{#1}}}
+\xydef@\xy@linecap@#1{\checkXyStyle@ \edef\xyprevcap@@{\xylinecap@}%
+ #1\let\prexylinecap@=\prexylinecap@@ \let\postxylinecap@=\postxylinecap@@
+ \applyLIFOstyle@\prexylinecap@{\xylinecap@}%
+ \postxylinecap@{\xyprevcap@@}}
+\xydef@\prexylinecap@@{\let\prexylinecap@=\eat@
+ \let\postxylinecap@=\postxylinecap@@ \outputxylinecap@ }
+\xydef@\postxylinecap@@{\let\postxylinecap@=\eat@
+ \let\prexylinecap@=\prexylinecap@@ \resetxylinecap@@ }
+\xylet@\prexylinecap@=\prexylinecap@@
+\xylet@\postxylinecap@=\postxylinecap@@
+\xydef@\outputxylinecap@#1{\xycapSpecial@@{#1}}
+\xydef@\resetxylinecap@#1{\resetxylinecap@i{#1}\outputxylinecap@{#1}}
+\xydef@\resetxylinecap@i#1{\def\xylinecap@{#1}}
+\xylet@\resetxylinecap@@=\resetxylinecap@
+\xylet@\xycapSpecial@@=\eat@
+\xydef@\xy@linejoin@#1{\checkXyStyle@
+ \edef\xyprevjoin@@{\xylinejoin@}#1%
+ \let\prexylinejoin@=\prexylinejoin@@
+ \let\postxylinejoin@=\postxylinejoin@@
+ \applyLIFOstyle@\prexylinejoin@{\xylinejoin@}%
+ \postxylinecap@{\xyprevjoin@@}}
+\xydef@\prexylinejoin@@{\let\prexylinejoin@=\eat@
+ \let\postxylinejoin@=\postxylinejoin@@ \outputxylinejoin@ }
+\xydef@\postxylinejoin@@{\let\postxylinejoin@=\eat@
+ \let\prexylinejoin@=\prexylinejoin@@ \resetxylinejoin@@ }
+\xylet@\prexylinejoin@=\prexylinejoin@@
+\xylet@\postxylinejoin@=\postxylinejoin@@
+\xydef@\outputxylinejoin@#1{\xyjoinSpecial@@{#1}}
+\xydef@\resetxylinejoin@#1{\resetxylinejoin@i{#1}\outputxylinejoin@{#1}}
+\xydef@\resetxylinejoin@i#1{\def\xylinejoin@{#1}}
+\xylet@\resetxylinejoin@@=\resetxylinejoin@
+\xylet@\xyjoinSpecial@@=\eat@
+\xydef@\xy@linemiter@#1{\checkXyStyle@
+ \edef\xyprevmiter@@{\xylinemiter@}#1%
+ \let\prexylinemiter@=\prexylinemiter@@
+ \let\postxylinemiter@=\postxylinemiter@@
+ \applyLIFOstyle@\prexylinemiter@{\xylinemiter@}%
+ \postxylinecap@{\xyprevmiter@@}}
+\xydef@\prexylinemiter@@{\let\prexylinemiter@=\eat@
+ \let\postxylinemiter@=\postxylinemiter@@ \outputxylinemiter@ }
+\xydef@\postxylinemiter@@{\let\postxylinemiter@=\eat@
+ \let\prexylinemiter@=\prexylinemiter@@ \resetxylinemiter@@ }
+\xylet@\prexylinemiter@=\prexylinemiter@@
+\xylet@\postxylinemiter@=\postxylinemiter@@
+\xydef@\outputxylinemiter@#1{\xymiterSpecial@@{#1}}
+\xydef@\resetxylinemiter@#1{\resetxylinemiter@i{#1}\outputxylinemiter@{#1}}
+\xydef@\resetxylinemiter@i#1{\def\xylinemiter@{#1}}
+\xylet@\resetxylinemiter@@=\resetxylinemiter@
+\xylet@\xymiterSpecial@@=\eat@
+\xydef@\xypolyline#1{\xypolyline@{#1}}
+\xydef@\xypolyline@#1{\hbox\bgroup
+ \enter@{\pfromthep@ \basefromthebase@ \cfromthec@}%
+ \def\xyps@list{}\edef\smapp@@{\s@bot}%
+ \smapxy@i{\enter@{\pfromthep@ \basefromthebase@ }%
+ \edef\xyps@list{\expandafter\removePT@\the\X@c\space
+ \expandafter\removePT@\the\Y@c\space \xyps@list}\leave@}%
+ \leave@ \xy@polystyle@@{#1}\xydopoly@style\egroup
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\styledboxz@}}%
+\xylet@\xypolyline@Special=\eat@
+\xylet@\xypolyfill@Special=\eat@
+\xylet@\xypolyeofill@Special=\eat@
+\xylet@\xypolydot@Special=\eat@
+\xylet@\xypolydash@Special=\eat@
+\xydef@\UnloadpolySpecials@{%
+ \let\xypolyline@Special=\eat@
+ \let\xypolyfill@Special=\eat@
+ \let\xypolyeofill@Special=\eat@
+ \let\xypolydot@Special=\eat@
+ \let\xypolydash@Special=\eat@
+}
+\xydef@\xy@polystyle@#1{%
+ \let\poly@style@@=\xypolyline@Special
+ \DNii@{#1}\ifx\nextii@\empty
+ \else\DN@{*}\ifx\next@\nextii@ \let\poly@style@@=\xypolyfill@Special
+ \else\DN@{?}\ifx\next@\nextii@ \let\poly@style@@=\xypolyeofill@Special
+ \else\expandafter\DN@\expandafter{\addDOT@{}}\ifx\next@\nextii@
+ \let\poly@style@@=\xypolydot@Special
+ \else\expandafter\DN@\expandafter{\addDASH@{}}\ifx\next@\nextii@
+ \let\poly@style@@=\xypolydash@Special
+ \else\DN@{{*}}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{*}}%
+ \else \def\poly@style@@{\xypolystraight@{#1}}%
+ \fi\fi\fi\fi\fi\fi }
+\xydef@\xydopoly@style{\expandafter\poly@style@@\expandafter{\xyps@list}}
+\xydef@\xynopolystyle@#1#2{\xyundefinedLine@{polyline}{{#1}}@@}
+\xydef@\xypolynospec@#1{\DNii@{#1}%
+ \ifx\nextii@\empty\def\poly@style@@{\xypolystraight@{-}}%
+ \else\DN@{.}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{.}}%
+ \else\DN@{-}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{--}}%
+ \else\DN@{*}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{.}}%
+ \else\DN@{?}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{.}}%
+ \else\DN@{{*}}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{*}}%
+ \else \def\poly@style@@{\xypolystraight@{#1}}%
+ \fi\fi\fi\fi\fi\fi }
+\xydef@\xypolystraight@#1#2{%
+ \enter@{\pfromthep@ \basefromthebase@ \cfromthec@}%
+ \edef\smapp@@{\s@bot}\csname S@0\endcsname\czeroEdge@\pfromc@\def\smapp@@{0}%
+ \smapxy@i{\czeroEdge@\enter@{\pfromthec@}{\connect@\dir{#1}}\leave@}\leave@ }
+\xylet@\xy@polystyle@@=\xypolynospec@
+\xydef@\UninstallPolylines@{%
+ \UnloadpolySpecials@
+ \let\xy@polystyle@@=\xypolynospec@ }
+\UninstallPolylines@
+\xydef@\xyundefinedLine@#1#2@@{%
+ \xywarning@{The #1 #2 effect is not implemented with the current driver.}}%
+\xydef@\xynolinewidth@#1#2{%
+ \xyundefinedLine@{linewidth}{\the\xylinethick@}@@}%
+\xydef@\xynolinecap@#1{\xyundefinedLine@{linecap}{\xylinecap@}@@}%
+\xydef@\xynolinejoin@#1{\xyundefinedLine@{linejoin}{\xylinejoin@}@@}%
+\xydef@\xynolinemiter@#1{\xyundefinedLine@{miterlimit}{\xylinemiter@}@@}%
+\xylet@\xylinewidth@@=\xynolinewidth@
+\xylet@\xy@linecap@@=\xynolinecap@
+\xylet@\xy@linejoin@@=\xynolinejoin@
+\xylet@\xy@linemiter@@=\xynolinemiter@
+\xydef@\UnloadLine@#1{%
+ \ifx#1\relax\else\xyunload@{line width extension}\fi
+ \let\resetxyline@@=\resetxyline@
+ \let\resetxylinecap@@=\resetxylinecap@
+ \let\resetxylinejoin@@=\resetxylinejoin@
+ \let\resetxylinemiter@@=\resetxylinemiter@
+ \let\transxyline@@=\DN@
+ \let\xylineSpecial@@=\eat@
+ \let\xycapSpecial@@=\eat@
+ \let\xyjoinSpecial@@=\eat@
+ \let\xymiterSpecial@@=\eat@
+ \let\xylinewidth@@=\xynolinewidth@
+ \let\xy@linecap@@=\xynolinecap@
+ \let\xy@linejoin@@=\xynolinejoin@
+ \let\xy@linemiter@@=\xynolinemiter@
+ \UninstallPolylines@ }
+\xyaddunsupport{line}{\UnloadLine@\relax}
+\xydef@\xylinewidth@#1#2{\checkXyStyle@
+ #1\let\prexyline@=\prexyline@@ \let\postxyline@=\postxyline@@
+ \applyLIFOstyle@\prexyline@{\the\xylinethick@}\postxyline@{#2}}
+\xydef@\prexyline@@{\let\prexyline@=\eat@
+ \let\postxyline@=\postxyline@@ \outputxyline@ }
+\xydef@\postxyline@@{\let\postxyline@=\eat@
+ \let\prexyline@=\prexyline@@ \resetxyline@@ }
+\xylet@\prexyline@=\prexyline@@
+\xylet@\postxyline@=\postxyline@@
+\xydef@\resetxyline@#1{\resetxyline@i{#1}\outputxyline@{#1}}
+\xydef@\resetxyline@i#1{\xylinethick@=#1\relax}
+\xydef@\outputxyline@#1{\transxyline@@{#1}%
+ \expandafter\xylineSpecial@@\expandafter{\next@}}
+\xylet@\resetxyline@@=\resetxyline@
+\xydef@\transxyline@#1{\edef\next@{\removePT@#1}}
+\xylet@\transxyline@@=\DN@
+\xylet@\xylineSpecial@@=\eat@
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xymacpat.xyp b/macros/generic/diagrams/xypic/texinputs/xymacpat.xyp
new file mode 100644
index 0000000000..5bdf9716db
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xymacpat.xyp
@@ -0,0 +1,60 @@
+% $Id: xymacpat.xyp,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%
+% Patterns for Xy-pic tile extension.
+% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%
+% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+% See the companion README and INSTALL files for further information.
+% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%
+% The Xy-pic package is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.
+%
+% The Xy-pic package is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License along
+% with this package; if not, see http://www.gnu.org/licenses/.
+%
+mac01 00 <FFFFFFFFFFFFFFFF>
+mac02 08 <DDFF77FFDDFF77FF>
+mac03 16 <DD77DD77DD77DD77>
+mac04 32 <AA55AA55AA55AA55>
+mac05 16 <55FF55FF55FF55FF>
+mac06 32 <AAAAAAAAAAAAAAAA> <AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>
+mac07 16 <EEDDBB77EEDDBB77> <EEEEEEDDDDDDBBBBBB777777EEEEEEDDDDDDBBBBBB777777>
+mac08 48 <8888888888888888> <888888888888888888888888888888888888888888888888>
+mac09 40 <B130031BD8C00C8D> <B1B1B13030300303031B1B1BD8D8D8C0C0C00C0C0C8D8D8D>
+mac10 56 <8010022001084004> <808080101010020202202020010101080808404040040404>
+mac11 36 <FF888888FF888888> <FFFFFF888888888888888888FFFFFF888888888888888888>
+mac12 42 <FF808080FF080808> <FFFFFF808080808080808080FFFFFF080808080808080808>
+mac13 63 <8000000000000000> <808080000000000000000000000000000000000000000000>
+mac14 58 <8040200002040800> <808080404040202020000000020202040404080808000000>
+mac15 49 <8244394482010101> <828282444444393939444444828282010101010101010101>
+mac16 34 <F87422478F172271> <F8F8F87474742222224747478F8F8F171717222222717171>
+mac17 48 <55A04040550A0404> <555555A0A0A04040404040405555550A0A0A040404040404>
+mac18 50 <2050888888880502> <202020505050888888888888888888888888050505020202>
+mac19 31 <BF00BFBFB0B0B0B0> <BFBFBF000000BFBFBFBFBFBFB0B0B0B0B0B0B0B0B0B0B0B0>
+mac20 64 <0000000000000000>
+mac21 60 <8000080080000800>
+mac22 56 <8800220088002200>
+mac23 48 <8822882288228822>
+mac24 48 <AA00AA00AA00AA00>
+mac25 32 <FF00FF00FF00FF00> <FFFFFF000000FFFFFF000000FFFFFF000000FFFFFF000000>
+mac26 48 <1122448811224488> <111111222222444444888888111111222222444444888888>
+mac27 48 <FF000000FF000000> <FFFFFF000000000000000000FFFFFF000000000000000000>
+mac28 56 <0102040810204080> <010101020202040404080808101010202020404040808080>
+mac29 56 <AA00800088008000> <AAAAAA000000808080000000888888000000808080000000>
+mac30 49 <FF80808080808080> <FFFFFF808080808080808080808080808080808080808080>
+mac31 51 <081C22C180010204> <0808081C1C1C222222C1C1C1808080010101020202040404>
+mac32 50 <881422418800AA00> <888888141414222222414141888888000000AAAAAA000000>
+mac33 58 <40A00000040A0000> <404040A0A0A00000000000000404040A0A0A000000000000>
+mac34 51 <038448300C020101> <0303038484844848483030300C0C0C020202010101010101>
+mac35 46 <8080413E080814E3> <8080808080804141413E3E3E080808080808141414E3E3E3>
+mac36 44 <102054AAFF020408> <101010202020545454AAAAAAFFFFFF020202040404080808>
+mac37 26 <77898F8F7798F8F8> <7777778989898F8F8F8F8F8F777777989898F8F8F8F8F8F8>
+mac38 48 <0008142A552A1408> <0000000808081414142A2A2A5555552A2A2A141414080808>
diff --git a/macros/generic/diagrams/xypic/texinputs/xymatrix.tex b/macros/generic/diagrams/xypic/texinputs/xymatrix.tex
new file mode 100644
index 0000000000..9cdf39b8d7
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xymatrix.tex
@@ -0,0 +1,500 @@
+%% xymatrix.tex from $Id: xymatrix.doc,v 3.14 2011/03/31 06:10:57 krisrose Exp $
+%%
+%% Xy-pic ``Matrix'' feature.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{matrix}{Matrix feature}{\stripRCS$Revision: 3.14 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xynew@{count}\Row
+\xynew@{count}\Col
+\xydef@\maxrow@{0}
+\xydef@\maxcol@{0}
+\xydef@\maxcolrow@{0}
+\xynew@{toks}\queue@
+\xynew@{toks}\queue@@
+\xynew@{count}\qcount@
+\xynew@{count}\qcount@@
+\xydef@\clearq@{%
+ \global\queue@={}\global\qcount@=\@ne
+ \global\queue@@={}\global\qcount@@=\z@}
+\xydef@\addq@#1{\global\advance\matrixsize@\@ne
+ \ifnum\qcount@@<\qcount@ \let\addq@@=\addq@i
+ \else \let\addq@@=\addq@ii \fi
+ \expandafter\addq@@\the\queue@@\addq@@{#1}}
+\xylet@\addq@@=\relax
+\xydef@\addq@i#1\addq@@#2{%
+ \global\advance\qcount@@\@ne \global\queue@@={#1#2}}
+\xydef@\addq@ii#1\addq@@#2{%
+ \global\advance\qcount@\@ne \global\qcount@@=\z@
+ \global\queue@=\expandafter{\the\queue@#1#2}\global\queue@@={}}
+\xydef@\finishq@{\expandafter\addq@ii\the\queue@@\addq@@{}}
+\xynew@{count}\matrixsize@
+\xynew@{if}\ifnoisymatrices@ \noisymatrices@true
+\xydef@\SilentMatrices{\noisymatrices@false}
+\xydef@\NoisyMatrices{\noisymatrices@true}
+\xydef@\xymatrixnocompile{\global\matrixsize@=\z@
+ \ifnoisymatrices@\message{<xymatrix}\fi
+ \if\inxy@
+ \DN@{\nter@{}\xy@\xymatrix{\enter@{%
+ \def\noexpand\xy@minX@@{\xy@minX@@}\def\noexpand\xy@maxX@@{\xy@maxX@@}%
+ \def\noexpand\xy@minY@@{\xy@minY@@}\def\noexpand\xy@maxY@@{\xy@maxY@@}%
+ \edef\noexpand\xymatrixprefix@@{\codeof\xymatrixprefix@@}}}}%
+ \else \DN@{\xy \nter@\endxy \xy@\xymatrix{\nter@{}}}\fi \next@
+ \xy@@{\save@ \edef\matrixorigin@{\X@c=\the\X@c \Y@c=\the\Y@c}%
+ \edef\xy@minX@@{\the\X@c}\edef\xy@maxX@@{\the\X@c}%
+ \edef\xy@minY@@{\the\Y@c}\edef\xy@maxY@@{\the\Y@c}}%
+ \xdef\maxrow@{0}\xdef\maxcol@{0}\xdef\maxcolrow@{0}%
+ \mkHWdefaults@ \xymatrix@prefix""}
+\xylet@\xymatrix=\xymatrixnocompile
+\xydef@\xymatrixprefix@@{}
+\xydef@\xymatrix@prefix"#1"{\DN@{#1}\edef\xymatrixprefix@@{\codeof\next@}%
+ \DNii@##1{\xy@{"#1"}{\edef\xymatrixprefix@@{##1}}}%
+ \expandafter\nextii@\expandafter{\xymatrixprefix@@}%
+ \xyFN@\xymatrix@setup}
+\xydef@\xymatrix@setup{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@setup}%
+ \else\ifx \bgroup\next \let\next@=\xymatrix@ii
+ \else\addAT@\ifx\next \addAT@\DN@{\xy@{@}{}\xyFN@\xymatrix@at}%
+ \else\ifx "\next \let\next@=\xymatrix@prefix
+ \else \DN@{\xyerror@{\string\xymatrix<setup>{<rows>} expected}{}}%
+ \fi\fi\fi\fi \next@}
+\xydef@\xymatrix@ii#1{%
+ \xymatrix@pretypeset{#1}%
+ \ifnum\maxcol@=\z@ \mkWcol@ \mkWmax@ \mkHrow@ \mkHmax@
+ \xdef\maxcol@{\the\Col}\xdef\maxcolrow@{\the\Row}\fi
+ \ifnoisymatrices@\message{\maxcol@ x\maxrow@}\fi
+ \xymatrix@measureit@@ \the\queue@ \global\queue@={}%
+ \xymatrix@typeset{#1}\restore\xymatrix@insert
+ \xy@@\leave@ \leave@
+ \ifnoisymatrices@\message{\the\matrixsize@>}\fi \ignorespaces}
+\xydef@\xymatrixcompile#1#{\xymatrixcompile@{#1}}
+\xydef@\xymatrixcompile@#1#2{\xycompile{\xymatrixnocompile#1{#2}}}
+\xydef@\CompileMatrices{\let\xymatrix=\xymatrixcompile}
+\xydef@\NoCompileMatrices{\let\xymatrix=\xymatrixnocompile}
+\xydef@\xy@cossign@@{+}
+\xydef@\xy@sinsign@@{+}
+\xydef@\xy@cosabs@@{1}
+\xydef@\xy@sinabs@@{0}
+\xydef@\xy@tanabs@@{0}
+\xydef@\xy@cotabs@@{100}
+\xydef@\xymatrix@rotation{%
+ \xy@@{%
+ \edef\xy@cossign@@{\ifdim\cosDirection\p@<\z@-\else+\fi}%
+ \edef\xy@sinsign@@{\ifdim\sinDirection\p@<\z@-\else+\fi}%
+ \edef\xy@cosabs@@{%
+ \if\xy@cossign@@\cosDirection\else\xy@cossign@@\cosDirection\fi}%
+ \edef\xy@sinabs@@{%
+ \if\xy@sinsign@@\sinDirection\else\xy@sinsign@@\sinDirection\fi}%
+ \dimen@=\xy@cosabs@@\p@ \dimen@ii=\xy@sinabs@@\p@
+ \ifdim\dimen@ii<.01\p@ \def\xy@cotabs@@{100}%
+ \else \quotient@\xy@cotabs@@\dimen@\dimen@ii \fi
+ \dimen@=\xy@cosabs@@\p@ \dimen@ii=\xy@sinabs@@\p@
+ \ifdim\dimen@<.01\p@ \def\xy@tanabs@@{100}%
+ \else \quotient@\xy@tanabs@@\dimen@ii\dimen@ \fi}}
+\xylet@\xymatrixsavedCOORD@=\relax
+\xydef@\xymatrix@pretypeset#1{%
+ \global\Row=\z@ \xdef\maxcol@{0}\clearq@
+ \setbox8=\vtop{%
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@
+ \everycr{}\let\\=\cr \tabskip=\z@ \offinterlineskip
+ \halign{\prentry@ ##!@&&\xyFN@\prentry@@##!@\cr#1\crcr}%
+ \prentry@@@}%
+ \xdef\maxrow@{\the\Row}%
+ \finishq@}
+\xydef@\prentry@{\relax
+ \ifnum\Row>\z@
+ \ifnum\maxcol@<\Col\xdef\maxcol@{\the\Col}\xdef\maxcolrow@{\the\Row}\fi
+ \expandafter\xdef\csname maxcol@\the\Row\endcsname{\the\Col}\fi
+ \global\advance\Row\@ne \global\Col=\z@ \xyFN@\prentry@@}
+\xylet@\lastprentry@@=\relax
+\xydef@\xyeatall@{\let\xy@=\xyeat@ \change@oxy@\xyeat@ \let\xy@@ix@=\eat@}
+\xydef@\prentry@@{\global\advance\Col\@ne
+ \let\next@=\prentry@@norm
+ \ifoldxymatrix@\else \ifx *\next \DN@*{\xyFN@\prentry@@star}\fi \fi
+ \next@}
+\xydef@\prentry@@star{\ifx *\next \DN@*{\xyFN@\prentry@@star@ii}%
+ \else \DN@##1##{\prentry@@star@i{##1}}\fi \next@}
+\xydef@\prentry@@star@i#1#2#3!@{\gdef\lastprentry@@{*#1{#2}#3}%
+ \setbox\lastobjectbox@=\object#1{#2}%
+ \prentry@@x}
+\xydef@\prentry@@star@ii{%
+ \ifx [\next
+ \DN@[##1]{\DN@####1{\def\entrymodifiers@{[##1]####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\prentry@@norm}%
+ \else
+ \DN@##1{\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\prentry@@norm}%
+ \fi \next@}
+\xydef@\prentry@@norm#1!@{\gdef\lastprentry@@{#1}%
+ \DN@{\setbox\lastobjectbox@=\object}%
+ \expandafter\next@\entrymodifiers@{\xyeatall@ \everyentry@ #1}%
+ \prentry@@x}
+\xydef@\prentry@@x{%
+ \edef\next@{{\noexpand\pre@emit{\the\Row}{\Upness@}{\the\Col}{\Leftness@}%
+ {\the\L@c}{\the\R@c}{\the\D@c}{\the\U@c}{\expandafter\noexpand\the\Edge@c}}}%
+ \expandafter\addq@\next@ \box\lastobjectbox@}
+\xynew@{if}\ifoldxymatrix@ \oldxymatrix@false
+\xydef@\prentry@@@{\relax \let\next@=\prentry@@@i
+ \ifoldxymatrix@ \ifnum\Col=\@ne \ifx\lastprentry@@\empty
+ \global\advance\Row\m@ne \let\next@=\relax \fi\fi\fi
+ \global\let\lastprentry@@=\relax \next@}
+\xydef@\prentry@@@i{%
+ \ifnum\maxcol@<\Col \xdef\maxcol@{\the\Col}\xdef\maxcolrow@{\the\Row}\fi
+ \expandafter\xdef\csname maxcol@\the\Row\endcsname{\the\Col}}
+\xydef@\xy@minX@@{\z@}
+\xydef@\xy@maxX@@{\z@}
+\xydef@\xy@minY@@{\z@}
+\xydef@\xy@maxY@@{\z@}
+\xydef@\pre@emit#1#2#3#4#5#6#7#8#9{%
+ \global\Row=#1\global\Col=#3\relax
+ \ifnum#3=\@ne
+ \ifnum#1=\@ne \xy@@{\matrixorigin@}%
+ \else \count@@=#1\advance\count@@\m@ne
+ \edef\next@{\noexpand\xy@@{\noexpand\cfromid@
+ {\xymatrixprefix@@\the\count@@,1}}}\next@
+ \pre@emit@ \W@maxout\Hrow@c@@\W@maxin\Hrow@in\xy@tanabs@@
+ \X@c\xy@sinsign@@\xy@sinabs@@\xymatrixrowsep@
+ \pre@emit@ \Hrow@c@@\W@maxout\Hrow@in\W@maxin\xy@cotabs@@
+ \Y@c{-\xy@cossign@@}\xy@cosabs@@\xymatrixrowsep@
+ \fi
+ \else \count@@=#3\advance\count@@\m@ne
+ \pre@emit@ \Wcol@c@@\H@maxout\Wcol@in\H@maxin\xy@cotabs@@
+ \X@c\xy@cossign@@\xy@cosabs@@\xymatrixcolsep@
+ \pre@emit@ \H@maxout\Wcol@c@@\H@maxin\Wcol@in\xy@tanabs@@
+ \Y@c\xy@sinsign@@\xy@sinabs@@\xymatrixcolsep@
+ \fi
+ \DN@##1{\xy@@{\L@c=#5\R@c=#6\D@c=#7\U@c=#8\Edge@c={#9}\idfromc@{##1#1,#3}}}%
+ \expandafter\next@\expandafter{\xymatrixprefix@@}%
+ \xy@@{%
+ \dimen@=\X@c \advance\dimen@-\L@c
+ \ifdim\dimen@<\xy@minX@@ \edef\xy@minX@@{\the\dimen@}\fi
+ \dimen@=\X@c \advance\dimen@+\R@c
+ \ifdim\dimen@>\xy@maxX@@ \edef\xy@maxX@@{\the\dimen@}\fi
+ \dimen@=\Y@c \advance\dimen@-\D@c
+ \ifdim\dimen@<\xy@minY@@ \edef\xy@minY@@{\the\dimen@}\fi
+ \dimen@=\Y@c \advance\dimen@+\U@c
+ \ifdim\dimen@>\xy@maxY@@ \edef\xy@maxY@@{\the\dimen@}\fi}}
+\xydef@\pre@emit@#1#2#3#4{#1\A@ #2\B@ #3\R@ #4\dimen@
+ \edef\next@{{\the\A@}{\the\B@}{\the\R@}{\the\dimen@}}%
+ \expandafter\pre@emit@i\next@}
+\xydef@\pre@emit@i#1#2#3#4#5{\xy@@{%
+ \dimen@=#2\R@=#5\dimen@ \dimen@=#1\relax \ifdim\R@>\dimen@ \R@=\dimen@ \fi
+ \dimen@=#4\B@=#5\dimen@ \dimen@=#3\relax \ifdim\B@>\dimen@ \B@=\dimen@ \fi
+ \advance\R@\B@}%
+ \pre@emit@ii}
+\xydef@\pre@emit@ii#1#2#3#4{\xy@@{%
+ \dimen@=#4\dimen@=#3\dimen@ \advance\R@\dimen@ \advance#1#2\R@}}
+\xydef@\Wcol@in#1{#1=\csname Wcol@\the\Col\endcsname #1=.5#1}
+\xydef@\Wcol@out#1{#1=\csname Wcol@\the\Col\endcsname #1=.5#1}
+\xydef@\Wcol@c@@#1{#1=\csname Wcol@\the\count@@\endcsname #1=.5#1}
+\xydef@\W@maxin#1{#1=\W@max #1=.5#1}
+\xydef@\W@maxout#1{#1=\W@max #1=.5#1}
+\xydef@\Hrow@in#1{#1=\csname Hrow@\the\Row\endcsname #1=.5#1}
+\xydef@\Hrow@out#1{#1=\csname Hrow@\the\Row\endcsname #1=.5#1}
+\xydef@\Hrow@c@@#1{#1=\csname Hrow@\the\count@@\endcsname #1=.5#1}
+\xydef@\H@maxin#1{#1=\H@max #1=.5#1}
+\xydef@\H@maxout#1{#1=\H@max #1=.5#1}
+\xydef@\H@max{\z@}
+\xydef@\W@max{\z@}
+\xydef@\HW@max{\z@}
+\xydef@\mkHrow@{}
+\xydef@\mkWcol@{}
+\xydef@\mkHmax@{}
+\xydef@\mkWmax@{}
+\xydef@\mkHWmax@{}
+\xydef@\mkHWdefaults@{\let\xymatrix@measureit@@=\xymatrix@measureit
+ \let\mkHrow@=\Hrow@R \let\mkWcol@=\Wcol@C
+ \def\mkHmax@{\ifdim\dimen@>\H@max\relax \xdef\H@max{\the\dimen@}\fi}%
+ \def\mkWmax@{\ifdim\dimen@>\W@max\relax \xdef\W@max{\the\dimen@}\fi}%
+ \let\mkHWmax@=\HWmax@max}
+\xydef@\Hrow@R{\expandafter\xdef\csname Hrow@\the\Row\endcsname{\the\dimen@}}
+\xydef@\Wcol@C{\expandafter\xdef\csname Wcol@\the\Col\endcsname{\the\dimen@}}
+\xydef@\Hrow@max{\expandafter\gdef\csname Hrow@\the\Row\endcsname{\H@max}}
+\xydef@\Wcol@max{\expandafter\gdef\csname Wcol@\the\Col\endcsname{\W@max}}
+\xydef@\Hrow@HWmax{\expandafter\gdef\csname Hrow@\the\Row\endcsname{\HW@max}}
+\xydef@\Wcol@HWmax{\expandafter\gdef\csname Wcol@\the\Col\endcsname{\HW@max}}
+\xydef@\HWmax@max{%
+ \ifdim\H@max>\W@max\global\let\HW@max=\H@max\else\global\let\HW@max=\W@max\fi}
+\xydef@\HWmax@set#1{\gdef\HW@max{#1}%
+ \global\let\H@max=\HW@max \global\let\W@max=\HW@max}
+\xydef@\xymatrix@measureit{%
+ \xdef\H@max{\z@}\xdef\W@max{\z@}%
+ \setbox6=\vbox{\unvbox8 \global\Row=\maxrow@
+ \loop@ \dimen@ii=\lastskip\unskip \ifnum\z@<\Row
+ \setbox4=\lastbox \dimen@=\dp4 \advance\dimen@\ht4 \mkHrow@ \mkHmax@
+ \ifnum\Row=\maxcolrow@
+ \setbox2=\hbox{\unhbox4
+ \global\Col=\maxcol@
+ \loop@ \dimen@ii=\lastskip\unskip \ifnum\z@<\Col
+ \setbox\z@=\lastbox \dimen@=\wdz@ \mkWcol@ \mkWmax@
+ \global\advance\Col\m@ne
+ \repeat@}\fi
+ \global\advance\Row\m@ne
+ \repeat@}%
+ \mkHWmax@}
+\xylet@\xymatrix@measureit@@=\relax
+\xydef@\xymatrix@typeset#1{%
+ \clearq@
+ \hbox{\vtop{\xyqall@
+ \xy@@{\ifx\xymatrixsavedCOORD@\relax
+ \enter@{\noexpand\let\noexpand\COORD@\noexpand\xymatrixsavedCOORD@}%
+ \let\xymatrixsavedCOORD@=\COORD@ \let\COORD@=\xymatrixCOORD@
+ \else \enter@{}\fi}%
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@
+ \kern\z@ \global\Row=\z@
+ \everycr{}\let\\=\cr \tabskip=\z@ \offinterlineskip
+ \halign{\entry@##!@&&\entry@@##!@\cr#1\crcr}%
+ \xy@@{\leave@}}}%
+ \finishq@ \expandafter\xy@@\expandafter{\the\queue@}\global\queue@={}}
+\xydef@\entry@{\relax \global\advance\Row\@ne \global\Col=\z@ \entry@@}
+\xydef@\entry@@{\global\advance\Col\@ne
+ \DN@##1,##2,##3@{\xy@{ENTRY "##3##1,##2"}{\Row=##1 \Col=##2\relax
+ \cfromid@{##3##1,##2}\pfromc@}}%
+ \edef\nextii@{\the\Row,\the\Col,\xymatrixprefix@@ @}%
+ \expandafter\next@\nextii@
+ \xyFN@\entry@@i}
+\xydef@\entry@@i{\let\next@=\entry@@norm
+ \ifoldxymatrix@\else \ifx *\next \DN@*{\xyFN@\entry@@star}\fi \fi
+ \next@}
+\xydef@\entry@@star{\ifx *\next \DN@*{\xyFN@\entry@@star@ii}%
+ \else \DN@##1##{\entry@@star@i{##1}}\fi \next@}
+\xydef@\entry@@star@i#1#2#3!@{%
+ \xy@@ix@{{#1}{#2}}\xy@@{\expandafter\dropentry@\the\toks9}%
+ \setboxz@h{\xyqall@
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@ \everyentry@ #3}%
+ \setbox\z@=\copy\voidb@x}
+\xydef@\entry@@star@ii{%
+ \ifx [\next
+ \DN@[##1]{\DN@####1{\def\entrymodifiers@{[##1]####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\entry@@norm}%
+ \else
+ \DN@##1{\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\entry@@norm}%
+ \fi \next@}
+\xydef@\entry@@norm#1!@{%
+ \DN@##1{\expandafter\xy@@ix@
+ \expandafter{\expandafter{\entrymodifiers@}{##1}}}%
+ \expandafter\next@\expandafter{\everyentry@#1}%
+ \xy@@{\expandafter\dropentry@\the\toks9}%
+ \setbox\z@=\expandafter\object\entrymodifiers@{\xyqall@
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@ \everyentry@ #1}%
+ \setbox\z@=\copy\voidb@x}
+\xydef@\dropentry@#1#2{\drop@{#1}{\xyeatall@
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@ #2}}
+\xydef@\xyqall@{%
+ \ifxysaving@ \let\xy@=\xyqs@ \let\xy@@ix@=\xysave@@toksix@
+ \else \let\xy@=\xyq@ \let\xy@@ix@=\xyq@@toksix@ \fi
+ \change@oxy@\xy@}
+\xydef@\xyq@#1#2{\addq@{#2}}
+\xydef@\xyq@@toksix@{\begingroup
+ \xyuncatcodes \afterassignment\xyq@@toksix@i \global\toks9=}
+\xydef@\xyq@@toksix@i{%
+ \DN@##1{\endgroup \xy@@{\global\toks9={##1}}}%
+ \expandafter\next@\expandafter{\the\toks9}}
+\xydef@\xyqs@{\global\advance\matrixsize@\@ne \xysave@}
+\xydef@\xymatrix@insert{%
+ \xy@@{\edef\nextii@{{\xy@minX@@}{\xy@maxX@@}{\xy@minY@@}{\xy@maxY@@}}%
+ \expandafter\xymatrix@insert@\nextii@}}
+\xydef@\xymatrix@insert@#1#2#3#4{\matrixorigin@
+ \L@c=+\X@c \advance\L@c-#1\relax
+ \R@c=-\X@c \advance\R@c+#2\relax
+ \D@c=+\Y@c \advance\D@c-#3\relax
+ \U@c=-\Y@c \advance\U@c+#4\relax
+ \Edge@c={\rectangleEdge}}
+\xylet@\thematrixCOORD@@=\relax
+\xylet@\thematrixprefix@@=\relax
+\xydef@\xymatrixCOORD@{%
+ \ifx [\next
+ \DN@[##1]{\xy@{[##1]}{\def\thematrixCOORD@@{[##1]}}%
+ \xyFN@\xymatrixCOORD@i##1]}%
+ \else \let\next@=\xymatrixsavedCOORD@ \fi \next@}
+\xydef@\xymatrixCOORD@i{\count@=\Row \count@@=\Col
+ \let\thematrixprefix@@=\xymatrixprefix@@
+ \ifcat A\noexpand\next
+ \DN@##1{\expandafter\notrelaxorelse@\csname xymatrixCOORD@i@##1\endcsname
+ \xymatrixCOORD@other}%
+ \else\ifx ]\next \DN@]{\xymatrixCOORD@x}%
+ \else\ifx "\next \DN@"##1"{\DN@{##1}\edef\thematrixprefix@@{\codeof\next@}%
+ \xyFN@\xymatrixCOORD@ii}%
+ \else \let\next@=\xymatrixCOORD@other \fi\fi\fi \next@}
+\xydef@\xymatrixCOORD@i@u{\advance\count@ \m@ne\xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@i@d{\advance\count@ \@ne \xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@i@l{\advance\count@@\m@ne\xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@i@r{\advance\count@@\@ne \xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@ii{%
+ \ifcat A\noexpand\next
+ \DN@##1{\expandafter\notrelaxorelse@\csname xymatrixCOORD@i@##1\endcsname
+ \xymatrixCOORD@error}%
+ \else\ifx ]\next \DN@]{\xymatrixCOORD@x}%
+ \else \let\next@=\xymatrixCOORD@xx \fi\fi \next@}
+\xydef@\xymatrixCOORD@error#1{\DN@{#1}%
+ \xyerror@{illegal <coord> (\codeof\next@): illegal [...] target form}{}%
+ \xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@other#1,#2]{%
+ \advance\count@#1\advance\count@@#2\xymatrixCOORD@x}
+\xydef@\xymatrixCOORD@x{%
+ \DN@##1{\xy@@{%
+ \expandafter\let\expandafter\next@\csname Q@##1\endcsname
+ \ifx\next@\relax \xyerror@RC{##1}\else \next@ \fi}%
+ \afterCOORD@}%
+ \edef\nextii@{{\thematrixprefix@@\the\count@,\the\count@@}}%
+ \expandafter\next@\nextii@}
+\xydef@\xymatrixCOORD@xx{%
+ \DN@##1{\xy@@{%
+ \expandafter\let\expandafter\next@\csname Q@##1\endcsname
+ \ifx\next@\relax \xyerror@RC{##1}\else \next@\no@@ \fi}%
+ \afterPLACE\xymatrixCOORD@after}%
+ \edef\nextii@{{\thematrixprefix@@\the\count@,\the\count@@}}%
+ \expandafter\next@\nextii@}
+\xydef@\xymatrixCOORD@after{%
+ \ifx ]\next \DN@]{\afterCOORD@}%
+ \else \let\next@=\xymatrixCOORD@error \fi \next@}
+\xydef@\xyerror@RC#1{\xyerror@{in entry \string"\the\Row,\the\Col\string":
+ No \codeof\thematrixCOORD@@\space(is \string"#1\string") from here}{}}
+\xylet@\xymatrix@addop@@=\relax
+\xydef@\xymatrix@at{\def\xymatrix@addop@@{\xymatrix@R\xymatrix@C}%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@at}%
+ \else\ifx !\next \DN@!{\xyFN@\xymatrix@fix}%
+ \else\addPLUS@\ifx \next \let\next@=\xymatrix@addop
+ \else\addDASH@\ifx \next \let\next@=\xymatrix@addop
+ \else\addEQ@\ifx \next \let\next@=\xymatrix@addop
+ \else\ifx 1\next \DN@1{%
+ \let\objectmargin@=\p@ \xyFN@\xymatrix@setup}%
+ \else\ifx R\next \def\xymatrix@addop@@{\xymatrix@R}\DN@ R{\xymatrix@addop}%
+ \else\ifx C\next \def\xymatrix@addop@@{\xymatrix@C}\DN@ C{\xymatrix@addop}%
+ \else\ifx M\next \def\xymatrix@addop@@{\xymatrix@M}\DN@ M{\xymatrix@addop}%
+ \else\ifx L\next \def\xymatrix@addop@@{\xymatrix@L}\DN@ L{\xymatrix@addop}%
+ \else\ifx H\next \def\xymatrix@addop@@{\xymatrix@H}\DN@ H{\xymatrix@addop}%
+ \else\ifx W\next \def\xymatrix@addop@@{\xymatrix@W}\DN@ W{\xymatrix@addop}%
+ \else\ifx *\next \DN@*{\xyFN@\xymatrix@mods}%
+ \else \DN@{\afterDIRECTIONorEMPTY
+ {\xymatrix@rotation \xyFN@\xymatrix@setup}{%
+ \xyerror@{<addop> or <direction> or one of 1RCMLHW*! expected}{}%
+ \xyFN@\xymatrix@setup}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\xymatrix@fix{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@fix}%
+ \else\ifx R\next \let\mkHrow@=\Hrow@max \DN@ R{\xyFN@\xymatrix@fix@}%
+ \else\ifx C\next \let\mkWcol@=\Wcol@max \DN@ C{\xyFN@\xymatrix@fix@}%
+ \else \let\mkHrow@=\Hrow@HWmax \let\mkWcol@=\Wcol@HWmax
+ \let\next@=\xymatrix@fix@
+ \fi\fi\fi \next@}
+\xydef@\xymatrix@fix@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@fix@}%
+ \else\ifx 0\next \def\mkHWmax@{\HWmax@set\z@}\DN@ 0{\xyFN@\xymatrix@setup}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\afterassignment\xymatrix@fix@x\dimen@ii=}%
+ \else \let\mkHWmax@=\HWmax@max \let\next@=\xymatrix@setup \fi\fi\fi \next@}
+\xydef@\xymatrix@fix@x{%
+ \edef\mkHWmax@{\noexpand\HWmax@set{\the\dimen@ii}}\xyFN@\xymatrix@setup}
+\xydef@\xymatrix@addop{\afterADDOP{\xyFN@\xymatrix@addop@}}
+\xydef@\xymatrix@addop@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@addop@}%
+ \else\ifx R\next \DN@ R{\xy@{R}{}\dimen@ii=\xymatrixrowsep@\xymatrix@addop@x}%
+ \else\ifx C\next \DN@ C{\xy@{C}{}\dimen@ii=\xymatrixcolsep@\xymatrix@addop@x}%
+ \else \DN@{\afterassignment\xymatrix@addop@x\dimen@ii=}\fi\fi\fi \next@}
+\xydef@\xymatrix@addop@x{\expandafter\xy@\expandafter{\the\dimen@ii}{}%
+ \xymatrix@addop@@ \xyFN@\xymatrix@setup}
+\xydef@\xymatrix@R{\Addop@@\xymatrixrowsep@\dimen@ii}
+\xydef@\xymatrix@C{\Addop@@\xymatrixcolsep@\dimen@ii}
+\xydef@\xymatrix@M{\Addop@@\objectmargin@\dimen@ii}
+\xydef@\xymatrix@L{\Addop@@\labelmargin@\dimen@ii}
+\xydef@\xymatrix@H{\Addop@@\objectheight@\dimen@ii}
+\xydef@\xymatrix@W{\Addop@@\objectwidth@\dimen@ii}
+\xydef@\xymatrixrowsep@{2pc}
+\xydef@\xymatrixcolsep@{2pc}
+\xydef@\xymatrixrowsep{\afterADDOP{\Addop@@\xymatrixrowsep@}}
+\xydef@\xymatrixcolsep{\afterADDOP{\Addop@@\xymatrixcolsep@}}
+\xydef@\xymatrix@mods{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@mods}%
+ \else\ifx [\next
+ \DN@ [##1]{\xy@{[##1]}{}\DN@####1{\def\entrymodifiers@{[##1]####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\xyFN@\xymatrix@setup}%
+ \else\addPLUS@\ifx \next \DN@##1{\DNii@{##1}\xyFN@\xymatrix@change}%
+ \else\addDASH@\ifx \next \DN@##1{\DNii@{##1}\xyFN@\xymatrix@change}%
+ \else\addEQ@\ifx \next \DN@##1{\DNii@{##1}\xymatrix@set}%
+ \else \let\next@=\xymatrix@mods@error \fi\fi\fi\fi\fi \next@}
+\xydef@\xymatrix@set{%
+ \begingroup \plainxy@
+ \afterVECTORorEMPTY\xymatrix@mods@x\xymatrix@mods@error}
+\xydef@\xymatrix@change{%
+ \addEQ@\ifx\next \DN@##1{\expandafter\DNii@\expandafter{\nextii@##1}%
+ \expandafter\xy@\expandafter{\nextii@}{}\begingroup \plainxy@
+ \afterVECTORorEMPTY\xymatrix@mods@x\xymatrix@mods@xx}%
+ \else \DN@{\expandafter\xy@\expandafter{\nextii@}{}\begingroup \plainxy@
+ \afterVECTORorEMPTY\xymatrix@mods@x\xymatrix@mods@xx}\fi
+ \next@}
+\xydef@\xymatrix@mods@x{\expandafter\xy@\expandafter{\nextii@}{}%
+ \def\next@##1##2##3{\def\nextii@####1{##1##2####1##3}}%
+ \addGT@{\addLT@{\expandafter\next@\expandafter{\nextii@}}}%
+ \DN@##1{\gdef\tmp@@@{{##1}}}%
+ \edef\nextiii@{{\the\X@c,\the\Y@c}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\nextii@\nextiii@}%
+ \endgroup
+ \DN@##1{\xy@{##1}{}\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\xyFN@\xymatrix@setup}%
+ \expandafter\next@\tmp@@@}
+\xydef@\xymatrix@mods@xx{\expandafter\xy@\expandafter{\nextii@}{}%
+ \expandafter\gdef\expandafter\tmp@@@\expandafter{\expandafter{\nextii@}}%
+ \endgroup
+ \DN@##1{\xy@{##1}{}\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\xyFN@\xymatrix@setup}%
+ \expandafter\next@\tmp@@@}
+\xydef@\xymatrix@mods@error{\endgroup
+ \xyerror@{Impossible @*<addop><size> <setup>.}{}\xyFN@\xymatrix@setup}
+\xywarnifdefined\entrymodifiers
+\expandafter\def\addEQ@\entrymodifiers#1{\def\entrymodifiers@{#1}\ignorespaces}
+\xydef@\entrymodifiers@{!V\entrybox}
+\xydef@\entrybox#1{\hbox{\setbox\z@=\objectbox{#1}%
+%%
+%% \L@p=\wdz@ \D@p=\ht\z@ \advance\D@p\dp\z@
+%% \dimen@=\objectwidth@ \advance\dimen@-\L@p
+%% \ifdim\dimen@>\z@ \advance\L@p\dimen@ \R@p=.5\dimen@ \else \R@p=\z@ \fi
+%% \dimen@=\objectheight@ \advance\dimen@-\D@p
+%% \ifdim\dimen@>\z@ \advance\D@p\dimen@ \fi
+%% \dimen@=\objectmargin@ \advance\L@p2\dimen@ \advance\D@p2\dimen@
+%% \U@p=-.5\ht\z@ \advance\U@p.5\dp\z@ \advance\R@p\objectmargin@
+%% \setboxz@h{\kern\R@p \raise\U@p\boxz@}%
+%% \wdz@=\L@p \ht\z@=.5\D@p \dp\z@=.5\D@p
+ \L@p=\wdz@ \R@p=\z@
+ \dimen@=\objectwidth@ \advance\dimen@-\L@p
+ \ifdim\dimen@>\z@ \advance\L@p\dimen@ \R@p=.5\dimen@ \fi
+ \dimen@=\objectmargin@ \advance\L@p2\dimen@ \advance\R@p\dimen@
+ \D@p=\ht\z@ \advance\D@p\dp\z@ \U@p=-\fontdimen22\textfont\tw@
+ \dimen@=\objectheight@ \advance\dimen@-\D@p
+ \ifdim\dimen@>\z@ \advance\D@p\dimen@ \fi
+ \dimen@=\objectmargin@ \advance\D@p2\dimen@
+ \setboxz@h{\kern\R@p \raise\U@p\boxz@}%
+ \wdz@=\L@p
+ \advance\D@p-\ht\z@ \advance\D@p-\dp\z@ \D@p=.5\D@p
+ \dimen@=\ht\z@ \advance\dimen@\D@p \ht\z@=\dimen@
+ \dimen@=\dp\z@ \advance\dimen@\D@p \dp\z@=\dimen@
+ \boxz@}}
+\xywarnifdefined\everyentry
+\expandafter\def\addEQ@\everyentry#1{\def\everyentry@{#1}\ignorespaces}
+\xylet@\everyentry@=\empty
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xymovie.tex b/macros/generic/diagrams/xypic/texinputs/xymovie.tex
new file mode 100644
index 0000000000..a8950e694a
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xymovie.tex
@@ -0,0 +1,75 @@
+%% xymovie.tex from $Id: xymovie.doc,v 3.9 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Movie Storyboard extension'' option.
+%% Copyright (c) 1996-1997 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{movie}{Movie Storyboard extension}{\stripRCS$Revision: 3.9 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xynew@{dimen}\m@height
+\xynew@{dimen}\m@width
+\xydef@\extractparameterm@#1#2#3{%
+ \DN@##1,#1=##2,##3@{\csname m@#1\endcsname=##2\relax}%
+ \next@,#2,#3,@}
+\xydef@\MovieSetup#1{%
+ \extractparameterm@{height}{#1}{height=2in}%
+ \extractparameterm@{width}{#1}{width=2in}%
+}
+\xydef@\theScene{0}
+\xydef@\theF{0}
+\xydef@\theFr{1}
+\xydef@\F#1{#1(0)}
+\xydef@\Fr#1{#1(1)}
+\xynew@{if}\iflastframe@
+\xynew@{count}\m@scene
+\xydef@\scene{\advance\m@scene\@ne
+ \DN@{\ifx*\next \lastframe@true \DN@*{\xyFN@\scene@}%
+ \else \let\next@=\scene@ \fi \next@}%
+ \xyFN@\next@}
+\xydef@\scene@{%
+ \ifx[\next \DN@[##1]{\scene@i}\else \let\next@=\scene@i \fi \next@}
+\long\def\scene@i#1{{%
+ \def\caption##1{\gdef\m@caption{Scene \the\m@scene. ##1}}%
+ \edef\theScene{\the\m@scene}%
+ \def\theF{0}\def\theFr{1}%
+ \def\F##1{##1(0)}\def\Fr##1{##1(1)}%
+ \scene@frame{#1}%
+ \iflastframe@
+ \def\caption##1{}%
+ \gdef\m@caption{The End.}%
+ \def\theF{1}\def\theFr{0}%
+ \def\F##1{##1(1)}\def\Fr##1{##1(0)}%
+ \scene@frame{#1}%
+ \fi
+ }\ignorespaces}
+\def\scene@frame#1{\vbox{\null
+ \dimen@=\m@width \advance\dimen@2\xydashw@
+ \hrule width\dimen@
+ \hbox to\dimen@{\vrule width\xydashw@ \hss
+ \vbox to\m@height{\hsize=\m@width \null\vfil{#1}\vfil\null}%
+ \hss \vrule width\xydashw@}%
+ \hrule width\dimen@
+ \setbox0=\hbox{%
+ \setbox0=\hbox to\m@width{\hss\strut \m@caption\hss}%
+ \dimen0=\dp0 \ht0=0pt \dp0=0pt \raise\dimen0\box0}%
+ \ht0=0pt \dp0=0pt \box0\relax
+ \null}}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xynecula.tex b/macros/generic/diagrams/xypic/texinputs/xynecula.tex
new file mode 100644
index 0000000000..d39f505232
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xynecula.tex
@@ -0,0 +1,330 @@
+%% xynecula.tex from $Id: xynecula.doc,v 3.4 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Necula extensions'' option.
+%% Copyright (c) 1998 George C. Necula <necula@cs.cmu.edu>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{necula}{Necula's extensions}{\stripRCS$Revision: 3.4 $}%
+ {George C. Necula}{necula@cs.cmu.edu}%
+ {School of Computer Science,
+ Carnegie Mellon University,
+ 5000 Forbes Avenue,
+ Pittsburgh, PA 15213-3891, USA}
+\def\expandbeforenext@#1{%
+ \DN@ e|##1|{\edef\tmp@{##1}\expandafter\xyFN@\expandafter#1\tmp@}%
+}
+\xylet@\xy@oldOBJECT@=\OBJECT@
+\xydef@\xy@newOBJECT@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xy@newOBJECT@}%
+ \else\ifx e\next
+ \expandbeforenext@\OBJECT@
+ \else
+ \DN@{\xy@oldOBJECT@}\fi\fi
+ \next@}%
+\let\OBJECT@=\xy@newOBJECT@
+\xylet@\xy@oldCOORD@=\COORD@
+\xydef@\xy@newCOORD@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xy@newCOORD@}%
+ \else\ifx e\next
+ \expandbeforenext@\COORD@
+ \else
+ \DN@{\xy@oldCOORD@}\fi\fi
+ \next@}%
+\let\COORD@=\xy@newCOORD@
+\xydefcsname@{*stylechar@P@}#1{\Pshape@#1@}
+\xynew@{count}\c@poly@count \c@poly@count=\z@
+\xydef@\Pshape@:#1@{%
+ \addtotoks@{%
+ \def\poly@list{@}%
+ \poly@parse #1,\relax,%Sets the poly@list
+ \def\poly@cache{}%
+ \edef\poly@id{\the\c@poly@count}%
+ \global\advance\c@poly@count\@ne
+ \poly@setEdge
+ \edef\poly@saveLcshape{\the\L@c}%
+ \polygonEdge@Outer% Set U,R,D,L
+ \poly@setEdge
+ \dimen@=\poly@saveLcshape\advance\dimen@-\L@c
+ \advance\R@p -\dimen@
+}}
+\xydef@\poly@setEdge{\expandafter\poly@setEdge@\poly@list\poly@id}
+\xydef@\poly@setEdge@#1@#2{\Edge@c={\polygonEdge#1@#2@}%
+ \expandafter\xdef\csname poly@cache#2%
+ \endcsname{\poly@cache}}
+\xydefcsname@{frm[P]{-}}{\expandafter\draw@polyframe\the\Edge@c{-}}
+\xydefcsname@{frm[P]{.}}{\expandafter\draw@polyframe\the\Edge@c{.}}
+\xydefcsname@{frm[P]{=}}{\expandafter\draw@polyframe\the\Edge@c{=}}
+\xydef@\draw@polyframe\polygonEdge#1@#2@#3{%
+ \def\poly@dir{#3}%
+ \def\poly@list{#1@}%
+ \def\poly@id{#2}%
+ \edef\poly@cache{\csname poly@cache\poly@id\endcsname}%
+ \draw@polygon}
+\xydef@\poly@empty{}
+\xydef@\poly@map#1#2,#3;#4@{%
+ #1{#2}{#3}%
+ \def\tmp@{#4}%
+ \ifx \poly@empty\tmp@ \else
+ \poly@map@next#1#4@%
+ \fi
+}
+\xydef@\poly@map@stop#1@{}
+\xydef@\poly@mapExpand#1#2{%
+ \edef\tmp@{\noexpand\poly@map\noexpand #1#2}%
+ \tmp@}
+\xydef@\poly@parse #1,{%
+ \ifx #1\relax
+ \poly@close
+ \let\next@=\relax
+ \else
+ \save@
+ \POS #1%
+ \edef\tmp@{{\the\X@c}{\the\Y@c}}%
+ \expandafter\poly@append\tmp@
+ \restore
+ \let\next@=\poly@parse
+ \fi
+ \next@
+}
+\xydef@\poly@append#1#2{\expandafter\poly@append@\poly@list{#1,#2;}}
+\xydef@\poly@append@#1@#2{\global\def\poly@list{#1#2@}}
+\xydef@\poly@close{\expandafter\poly@close@\poly@list}
+\xydef@\poly@close@#1,#2;#3@{\poly@append{#1}{#2}}
+\xydef@\draw@polygon{%
+ \save@
+ \X@origin=\X@c \Y@origin=\Y@c
+ \poly@setp
+ \U@c=\z@\R@c=\z@\D@c=\z@\L@c=\z@\U@p=\z@\R@p=\z@\D@p=\z@\L@p=\z@
+ \Edge@c={\zeroEdge}\Edge@p={\zeroEdge}%
+ \let\poly@map@next=\poly@map
+ \poly@mapExpand\poly@drawseg\poly@rest
+ \restore
+}
+\xydef@\poly@setp{\expandafter\poly@setp@\poly@list}
+\xydef@\poly@setp@#1,#2;#3@{%
+ \X@p=#1\advance\X@p\X@origin \Y@p=#2\advance\Y@p\Y@origin%
+ \global\def\poly@rest{#3@}}
+\xydef@\poly@drawseg#1#2{%
+ \dimen@=#1\X@c=\the\dimen@\advance\X@c \X@origin
+ \dimen@=#2\Y@c=\the\dimen@\advance\Y@c \Y@origin
+ \expandafter\connect@\expandafter\dir\poly@dir%
+ \X@p=\X@c\Y@p=\Y@c}
+\xydef@\polygonEdge#1@#2@#3{%
+ \def\poly@list{#1@}%
+ \def\poly@id{#2}%
+ \edef\poly@cache{\csname poly@cache\poly@id\endcsname}%
+ \ifcase#3\relax
+ \DN@{\polygonEdge@Inters
+ }%
+ \or \DN@{\polygonEdge@Under}%
+ \or \DN@{\polygonEdge@Dist}%
+ \or \DN@{\rectangleProp@}%
+ \or \DN@{\polygonEdge@Inner}%
+ \or \DN@{\polygonEdge@Outer}%
+ \else \DN@{}\fi
+ \next@}
+\newif\ifpoly@badinters
+\xydef@\polygonEdge@Inters{%
+ \ifx\poly@cache\poly@empty
+ \poly@intersdoit
+ \else
+ \expandafter\poly@intersprobecache\poly@cache @%
+ \fi
+}
+\xydef@\poly@cachehit#1#2{%
+ \X@c=#1\Y@c=#2}
+\xydef@\poly@cachehitdisable#1#2{\poly@intersdoit}
+\xydef@\poly@intersprobecache#1,#2,#3,#4,#5@{%
+ \dimen@=#1\advance\dimen@-\d@X
+ \ifdim\zz@\dimen@
+ \dimen@=#2\advance\dimen@-\d@Y
+ \ifdim\zz@\dimen@
+ \poly@cachehit{#3}{#4}
+ \else
+ \poly@intersdoit
+ \fi
+ \else
+ \poly@intersdoit
+ \fi
+}
+\xydef@\poly@intersdoit{%
+ \edef\polyoldA@{\the\A@}\edef\polyoldB@{\the\B@}%
+ \def\poly@intersneg{}\def\poly@interspos{}%
+ \save@
+ \poly@setorigin
+ \def\zeroDivide@{\poly@badinterstrue}%
+ \let\poly@map@next=\poly@map
+ \poly@mapExpand\poly@interseg\poly@rest
+ \ifx\poly@intersneg\poly@empty
+ \poly@badinterstrue
+ \else
+ \ifx\poly@interspos\poly@empty
+ \poly@badinterstrue
+ \else
+ \poly@badintersfalse
+ \fi
+ \fi
+ \restore
+ \A@=\polyoldA@\B@=\polyoldB@
+ \ifpoly@badinters \else
+ \edef\tmp@{\poly@interspos,\poly@intersneg @}%
+ \expandafter\poly@intersfinish\tmp@
+ \fi
+}
+\xydef@\poly@intersfinish#1,#2,#3@{%
+ \X@c=#1\Y@c=#2\relax
+ \xdef\poly@cache{\the\d@X,\the\d@Y,#1,#2,#3}%
+ \poly@setEdge
+}
+\xydef@\poly@setorigin{\expandafter\poly@setorigin@\poly@list}
+\xydef@\poly@setorigin@#1,#2;#3@{%
+ \X@origin=#1\advance\X@origin\X@c \Y@origin=#2\advance\Y@origin\Y@c%
+ \global\def\poly@rest{#3@}}
+\xydef@\poly@interseg#1#2{%
+ \dimen@=#1\advance\dimen@\X@c \edef\poly@saveXcinters{\the\dimen@}%
+ \dimen@=#2\advance\dimen@\Y@c \edef\poly@saveYcinters{\the\dimen@}%
+ \save@
+ \poly@badintersfalse
+ \R@c=\poly@saveXcinters \advance\R@c -\X@origin
+ \U@c=\poly@saveYcinters \advance\U@c -\Y@origin
+ \intersect@
+ \A@=\X@c \B@=\Y@c
+ \restore
+ \ifpoly@badinters
+ \else
+\poly@isonseg\X@origin\Y@origin\A@\B@\poly@saveXcinters\poly@saveYcinters
+ \ifpoly@badinters
+ \else
+ \poly@isonray\X@c\Y@c\A@\B@\X@p\Y@p
+ \ifpoly@badinters
+ \edef\poly@intersneg{\the\A@,\the\B@}%
+ \else
+ \edef\poly@interspos{\the\A@,\the\B@}%
+ \fi
+ \fi
+ \fi
+ \X@origin=\poly@saveXcinters\Y@origin=\poly@saveYcinters
+}
+\xydef@\polygonEdge@Dist{\xyerror@{Dist is not yet implemented for polygons}}
+\newif\ifpoly@closedrange
+\xydef@\poly@isinrange#1#2#3{%
+ \ifpoly@badinters \else
+ \dimen@=#1\dimen@i=#2\dimen@ii=#3\relax
+ \advance\dimen@ii -\dimen@ \advance\dimen@i -\dimen@
+ \ifdim\dimen@ii<0pt\relax
+ \ifdim\dimen@i>100\almostz@
+ \poly@badinterstrue
+ \fi
+ \dimen@i=-\dimen@i \dimen@ii=-\dimen@ii
+ \else
+ \ifdim\dimen@i<-100\almostz@\relax
+ \poly@badinterstrue
+ \fi
+ \fi
+ \ifpoly@closedrange
+ \advance\dimen@ii 100\almostz@
+ \ifdim\dimen@i>\dimen@ii
+ \poly@badinterstrue
+ \fi
+ \fi
+ \fi}
+\xydef@\poly@isonseg#1#2#3#4#5#6{%
+ \poly@closedrangetrue
+ \poly@isinrange{#1}{#3}{#5}%
+ \poly@isinrange{#2}{#4}{#6}%
+}
+\xydef@\poly@isonray#1#2#3#4#5#6{%
+ \poly@closedrangefalse
+ \poly@isinrange{#1}{#3}{#5}%
+ \poly@isinrange{#2}{#4}{#6}%
+}
+\xydef@\polygonEdge@Under{%
+ \edef\polysaveA@under{\the\A@}\edef\polysaveB@under{\the\B@}%
+ \edef\poly@saveXcUnder{\the\X@c}\edef\poly@saveYcUnder{\the\Y@c}%
+ \polygonEdge@Inters
+ \ifpoly@badinters% p is very close to c
+ \Inside@true
+ \else
+ \A@=\X@c\B@=\Y@c
+ \X@c=\poly@saveXcUnder\Y@c=\poly@saveYcUnder
+ \poly@isonseg\X@c\Y@c\X@p\Y@p\A@\B@
+ \ifpoly@badinters \Inside@false \else \Inside@true\fi
+ \A@=\polysaveA@under\B@=\poly@saveB@under
+ \fi
+}
+\xydef@\polygonEdge@Inner{%
+ \enter@{\basefromthebase@ \pfromthep@ \DirectionfromtheDirection@}%
+ \L@c=\X@c \D@c=\Y@c
+ \polygonEdge@Inters
+ \ifpoly@badinters
+ \czeroEdge@
+ \else
+ \expandafter\poly@getinterspoints\poly@cache @%
+ \ifdim\X@c>\R@c
+ \L@c=\R@c \R@c=\X@c
+ \else
+ \L@c=\X@c
+ \fi
+ \X@c=0.5\L@c \advance\X@c 0.5\R@c \advance\R@c -\X@c \L@c=\R@c
+ \ifdim\Y@c>\U@c
+ \D@c=\U@c \U@c=\Y@c
+ \else
+ \D@c=\Y@c
+ \fi
+ \Y@c=0.5\D@c \advance\Y@c 0.5\U@c \advance\U@c -\Y@c \D@c=\U@c
+ \Edge@c={\rectangleEdge}%
+ \fi
+ \leave@
+}
+\xydef@\poly@getinterspoints#1,#2,#3,#4,#5,#6@{%
+ \R@c=#3\U@c=#4\X@c=#5\Y@c=#6}
+\xydef@\polygonEdge@Outer{%
+ \enter@{\basefromthebase@ \pfromthep@ \DirectionfromtheDirection@}%
+ \czeroEdge@
+ \let\poly@map@next=\poly@map
+ \poly@mapExpand\poly@findextent\poly@list
+ \Edge@c={\rectangleEdge}%
+ \leave@
+}
+\xydef@\poly@findextent#1#2{%
+ \dimen@=#1\dimen@=\the\dimen@% it fails if I remove the second assign
+ \ifdim\dimen@>\R@c \R@c=\dimen@ \fi
+ \ifdim -\dimen@>\L@c \L@c=-\dimen@ \fi
+ \dimen@=#2\dimen@=\the\dimen@% it fails if I remove the second assign
+ \ifdim\dimen@>\U@c \U@c=\dimen@ \fi
+ \ifdim -\dimen@>\D@c \D@c=-\dimen@ \fi
+}
+\xydef@\Fshape@#1:{\def\whichframe@@{{#1}}\let\whichoptions@@=\empty
+ \DN@{{}}\ifx\whichframe@@\next@ \def\whichframe@@{{-}}\fi
+ \expandafter\xyFN@\expandafter\Fshape@whichframe\the\Edge@c}
+\xydef@\Fshape@whichframe{%
+ \ifx\next\circleEdge
+ \edef\whichframe@@{[o]\whichframe@@}%
+ \DN@##1{\xyFN@\Fshape@i}%
+ \else
+ \ifx\next\polygonEdge
+ \edef\whichframe@@{[P]\whichframe@@}%
+ \DN@\polygonEdge##1@##2@{\xyFN@\Fshape@i}%
+ \else
+ \DN@##1{\xyFN@\Fshape@i}%
+ \fi\fi
+ \next@
+}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyoztex.tex b/macros/generic/diagrams/xypic/texinputs/xyoztex.tex
new file mode 100644
index 0000000000..68550dafb5
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyoztex.tex
@@ -0,0 +1,130 @@
+%% xyoztex.tex from $Id: xyoztex.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``OzTeX'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{oztex}{OzTeX driver}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\OzTeX@@#1{\dvimessage@{OzTeX}{#1}}
+\newdriver{%
+ \xyaddsupport{color}\oztexColor@@
+ \xyaddsupport{crayon}\oztexCrayon@@
+ \xyaddsupport{ps}\oztexPS@@
+ \xyaddsupport{rotate}\oztexRotate@@
+ \xyaddsupport{line}\oztexLine@@
+ \xyaddsupport{frame}\oztexFrames@@
+ \xyaddsupport{tile}\oztexTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\xydef@\oztexColor@@{\OzTeXColours@}
+\xydef@\OzTeXColours@{\OzTeXPStypes@
+ \let\xylocalColor@=\xyNoColor@@ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\OzTeXCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@\fi \next@
+ \let\xycolorwarning@=\relax
+ \let\oztexColor@@=\relax
+ \let\UnloadColor@@=\NoOzTeXColor@
+}
+\xydef@\NoOzTeXColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\oztexColor@@=\OzTeXColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\xydef@\OzTeXCrayon@@{\installCrayolaColors@}
+\xydef@\oztexPS@@{\oztexPS@}
+\xydef@\oztexPSunload@{\UnloadPS@
+ \def\xyPSdictname{}\UsePSdict@@false
+ \let\installxyps@@=\relax
+ \let\UnloadPS@@=\UnloadPS@
+ \xyPSshapes@true
+ \let\oztexPS@@=\oztexPS@ }
+\xydef@\OzTeXSpecial@#1{\special{empty.ps {#1}xy}}
+\xydef@\OzTeXMacro@#1{\special{empty.ps {#1}xy}}
+\xydef@\OzTeXDict@#1{\special{empty.ps @bxy{#1}stopped pop @exy}}
+\xydef@\OzTeXinclude@#1{\special{#1}}
+\xydef@\OzTeXraw@#1{\special{empty.ps @bxy #1 @exy}}%
+\xydef@\OzTeXPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\OzTeXSpecial@\else
+ \let\PSspecial@@=\OzTeXSpecial@
+ \let\PSmacro@@=\OzTeXMacro@
+ \let\PSdict@@=\OzTeXDict@
+ \let\PSraw@@=\OzTeXraw@
+ \let\PSinclude@@=\OzTeXinclude@
+ \let\xyPSobeylines@@=\obeyOzTeXlines@
+ \let\PSspecialdict@@=\OzTeXDict@
+ \OzTeX@@{PostScript}%
+ \fi
+ \OzTeXCurrpt@ }
+{\catcode`\^^M=\active
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space \obeyspaces}}
+\xylet@\obeyOzTeXlines@=\next
+\xydef@\OzTeXCurrpt@{\let\xyPScurrpt@@=\OzTeXCurrpt@@}%
+\xydef@\OzTeXCurrpt@@{\PSraw@@{xyp}}
+\xydef@\oztexPS@{\OzTeXPStypes@
+ \let\oztexPS@@=\relax
+ \let\UnloadPS@@=\oztexPSunload@
+ \let\installxyps@@=\@OzTeX@PS@
+ \installxyps@ }
+\xydef@\@OzTeX@PS@{\UsePSdict@@true
+ \let\includePSmessage@=\xyOzTeXheader
+ \ifx\undefined\xyPSdictname\def\xyPSdictname{global.ps}\fi}
+\xydef@\xyOzTeXheader#1#2#3{\UsePSdict@@true}
+\xydef@\oztexLine@@{\oztexLine@}
+\xydef@\oztexLine@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-styles are}\UnloadLine@\relax}\fi
+ \next@ }
+\xydef@\oztexFrames@@{\OzTeXFrames@}
+\xydef@\OzTeXFrames@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\xydef@\oztexTiles@@{\OzTeXTiles@}
+\xydef@\OzTeXTiles@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@
+ \xystandardpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\xydef@\oztexRotate@@{\OzTeXRotate@}
+\xydef@\OzTeXRotate@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \OzTeXRotScale@ \installPSrotscale@ \xyPSshapes@false }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+\xydef@\OzTeXRotScale@{%
+ \def\xyrot@start(##1){%
+ {xyp xyt ##1\space xyr}{OzXy begin gsave}}%
+ \def\xyscale@start(##1,##2){%
+ {xyp xyt ##1\space##2\space xys}{OzXy begin gsave}}%
+ \def\xyrot@end{grestore end}\def\xyscale@end{grestore end}}
+\let\OzTeXRotScale@=\xyRotScale@@
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xypdf-co.tex b/macros/generic/diagrams/xypic/texinputs/xypdf-co.tex
new file mode 100644
index 0000000000..60e4060dbb
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypdf-co.tex
@@ -0,0 +1,129 @@
+%%
+%% This is file `xypdf-co.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% xypdf.dtx (with options: `color')
+%%
+%% The xypdf package for TeX and LaTeX
+%% Copyright (c) 2010 by Daniel Müllner (M\"ullner)
+%% <http://math.stanford.edu/~muellner>
+%% --------------------------------------------------------------------------
+%%
+%% This program is free software: you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the Free
+%% Software Foundation, either version 2 of the License, or (at your option)
+%% any later version.
+%%
+%% This program is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% The GNU General Public License is available at
+%% <http://www.gnu.org/licenses/>.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% This file is part of the xypdf package for TeX and LaTeX2e. The xypdf
+%% package may be distributed and/or modified under the conditions of the
+%% GNU General Public License as published by the Free Software Foundation,
+%% either version 2 of the License, or (at your option) any later version.
+%% The distribution consists of the following files:
+%%
+%% xypdf.dtx - Documented source code
+%% xypdf.ins - Installation script
+%% xypdf.pdf - Documentation (generated from xypdf.dtx)
+%%
+%% The files with the TeX code are generated by the following command:
+%%
+%% latex xypdf.ins
+%%
+%% This generates the files xypdf.tex, xypdf-co.tex, xypdf-cu.tex,
+%% xypdf-fr.tex, xypdf-li.tex and xypdf-ro.tex.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% The xypdf package improves the output quality of the Xy-pic package when
+%% PDF documents are generated. It produces generic PDF code for graphical
+%% elements like lines, curves and circles instead of approximating these
+%% elements with glyphs in special fonts as the original Xy-pic package does.
+%% The xypdf package works with both TeX and LaTeX in the occurrences of
+%% pdfTeX, XeTeX and eTeX with dvipdfm(x) to generate PDF files. It is being
+%% integrated and distributed together with Xy-pic, starting with Xy-pic
+%% version 3.8.
+%%
+%% The copyright for the xypdf package is by its author, Daniel Müllner
+%% (Muellner, M\"ullner).
+%%
+\xycatcodes
+\expandafter\let\csname xypdf-co@loaded\endcsname\@empty
+\@ifdefinable\xP@colorname\relax
+\@ifdefinable\xP@colA\relax
+\@ifdefinable\xP@colB\relax
+\@ifdefinable\xP@colC\relax
+\@ifdefinable\xP@colD\relax
+\xP@hook{color}{newxycolor}
+\newcommand*\xP@newxycolor[2]{\def\xP@colorname{#1}\xP@parsecolor#2 @}
+\xP@color@on
+\@ifdefinable\xP@parsecolor\relax
+\def\xP@parsecolor#1 #2 #3@{\def\xP@colA{#1}\def\xP@colB{#2}\ifx\xP@colB\xP@gray
+\xP@newcolor\xP@colorname\xP@colA\xP@gray\newxycolor
+\else
+\xP@parsecolor@#3 @\fi
+}
+\@ifdefinable\xP@parsecolor@\relax
+\def\xP@parsecolor@#1 #2 #3 #4@{\def\xP@colC{#1}\def\xP@colD{#2}\ifx\xP@colD\xP@rgb
+\xP@newcolor\xP@colorname{\xP@colA,\xP@colB,\xP@colC}\xP@rgb\newxycolor
+\else
+\def\@tempa{#3}\ifx\@tempa\xP@cmyk
+\xP@newcolor\xP@colorname{\xP@colA,\xP@colB,\xP@colC,\xP@colD}{cmyk}\newxycolor
+\else
+\PackageError{xypdf}{Syntax error in \string\newxycolor}{}\fi
+\fi
+}
+\newcommand*\xP@gray{gray}
+\newcommand*\xP@rgb{rgb}
+\newcommand*\xP@cmyk{cmyk}
+\xP@hook{color}{OBJECT@shape}
+\newcommand*\xP@OBJECT@shape[1]{\DN@{shape [#1]}\expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
+\ifx\nextii@\relax\DN@{style [#1]}\expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
+\ifx\nextii@\relax\DN@{\xP@checkcolor{#1}}\else\DN@{\nextii@\xyFN@\OBJECT@}\fi
+\else\expandafter\addtotoks@\expandafter{\nextii@}\DN@{\xyFN@\OBJECT@}\fi \next@}
+\newcommand*\xP@checkcolor[1]{\@ifundefined{\string\color@\detokenize{#1}}{\OBJECT@shapei[#1]}{\xP@append\toks@{\noexpand\xP@color{{\detokenize{#1}}}}\xyFN@\OBJECT@
+}}
+\newcommand*\xP@color[1]{\def\preStyle@@{\addtostyletoks@{\bgroup\xP@protectedcolor#1}}\def\postStyle@@{\addtostyletoks@{\egroup}}\modXYstyle@
+}
+\@ifdefinable\xP@protectedcolor\relax
+\protected\def\xP@protectedcolor{\@ifundefined{color}\xP@pdfcolor\color
+}
+\@ifdefinable\xP@pdfcolor\relax
+\def\xP@pdfcolor[#1]#2{\edef\@tempa{#1}\ifx\@tempa\xP@gray
+\DN@{\xP@graycolor{#2}}\else\ifx\@tempa\xP@rgb
+\DN@{\xP@rgbcolor#2@}\else\ifx\@tempa\xP@cmyk
+\DN@{\xP@cmykcolor#2@}\fi\fi\fi
+\aftergroup\xP@resetcolor
+\next@
+}\newcommand*\xP@graycolor[1]{\xP@setcolor{#1}gG}\@ifdefinable\xP@rgbcolor\relax
+\def\xP@rgbcolor#1,#2,#3@{\xP@setcolor{#1 #2 #3}{rg}{RG}}
+\@ifdefinable\xP@cmykcolor\relax
+\def\xP@cmykcolor#1,#2,#3,#4@{\xP@setcolor{#1 #2 #3 #4}kK}
+\newcommand*\xP@newcolor[4]{\expandafter\let\expandafter\next@\csname shape [#1]\endcsname
+\ifx\next@\relax
+\@ifundefined{\string\color@#1}\relax
+{\xP@warning{xypdf}{The color `#1' is overridden by \string#4}}\edef\next@{\noexpand\newxystyle{#1}{\noexpand\xP@unnamedcolor{#2}{#3}}}\else
+\DN@{}\fi
+\next@\relax}
+\newcommand*\xP@unnamedcolor[2]{\xP@color{[#2]{#1}}}
+\newcommand\xP@definecrayolacolor[2]{\xP@newcolor{#1}{#2}{cmyk}\UseCrayolaColors}\newcommand*\xP@installCrayolaColors{\xP@definecrayolacolor{GreenYellow}{.15,0,.69,0}\xP@definecrayolacolor{Yellow}{0,0,1,0}\xP@definecrayolacolor{Goldenrod}{0,.1,.84,0}\xP@definecrayolacolor{Dandelion}{0,.29,.84,0}\xP@definecrayolacolor{Apricot}{0,.32,.52,0}\xP@definecrayolacolor{Peach}{0,.5,.7,0}\xP@definecrayolacolor{Melon}{0,.46,.5,0}\xP@definecrayolacolor{YellowOrange}{0,.42,1,0}\xP@definecrayolacolor{Orange}{0,.61,.87,0}\xP@definecrayolacolor{BurntOrange}{0,.51,1,0}\xP@definecrayolacolor{Bittersweet}{0,.75,1,.24}\xP@definecrayolacolor{RedOrange}{0,.77,.87,0}\xP@definecrayolacolor{Mahogany}{0,.85,.87,.35}\xP@definecrayolacolor{Maroon}{0,.87,.68,.32}\xP@definecrayolacolor{BrickRed}{0,.89,.94,.28}\xP@definecrayolacolor{Red}{0,1,1,0}\xP@definecrayolacolor{OrangeRed}{0,1,.5,0}\xP@definecrayolacolor{RubineRed}{0,1,.13,0}\xP@definecrayolacolor{WildStrawberry}{0,.96,.39,0}\xP@definecrayolacolor{Salmon}{0,.53,.38,0}\xP@definecrayolacolor{CarnationPink}{0,.63,0,0}\xP@definecrayolacolor{Magenta}{0,1,0,0}\xP@definecrayolacolor{VioletRed}{0,.81,0,0}\xP@definecrayolacolor{Rhodamine}{0,.82,0,0}\xP@definecrayolacolor{Mulberry}{.34,.9,0,.02}\xP@definecrayolacolor{RedViolet}{.07,.9,0,.34}\xP@definecrayolacolor{Fuchsia}{.47,.91,0,.08}\xP@definecrayolacolor{Lavender}{0,.48,0,0}\xP@definecrayolacolor{Thistle}{.12,.59,0,0}\xP@definecrayolacolor{Orchid}{.32,.64,0,0}\xP@definecrayolacolor{DarkOrchid}{.4,.8,.2,0}\xP@definecrayolacolor{Purple}{.45,.86,0,0}\xP@definecrayolacolor{Plum}{.5,1,0,0}\xP@definecrayolacolor{Violet}{.79,.88,0,0}\xP@definecrayolacolor{RoyalPurple}{.75,.9,0,0}\xP@definecrayolacolor{BlueViolet}{.86,.91,0,.04}\xP@definecrayolacolor{Periwinkle}{.57,.55,0,0}\xP@definecrayolacolor{CadetBlue}{.62,.57,.23,0}\xP@definecrayolacolor{CornflowerBlue}{.65,.13,0,0}\xP@definecrayolacolor{MidnightBlue}{.98,.13,0,.43}\xP@definecrayolacolor{NavyBlue}{.94,.54,0,0}\xP@definecrayolacolor{RoyalBlue}{1,.5,0,0}\xP@definecrayolacolor{Blue}{1,1,0,0}\xP@definecrayolacolor{Cerulean}{.94,.11,0,0}\xP@definecrayolacolor{Cyan}{1,0,0,0}\xP@definecrayolacolor{ProcessBlue}{.96,0,0,0}\xP@definecrayolacolor{SkyBlue}{.62,0,.12,0}\xP@definecrayolacolor{Turquoise}{.85,0,.2,0}\xP@definecrayolacolor{TealBlue}{.86,0,.34,.02}\xP@definecrayolacolor{Aquamarine}{.82,0,.3,0}\xP@definecrayolacolor{BlueGreen}{.85,0,.33,0}\xP@definecrayolacolor{Emerald}{1,0,.5,0}\xP@definecrayolacolor{JungleGreen}{.99,0,.52,0}\xP@definecrayolacolor{SeaGreen}{.69,0,.5,0}\xP@definecrayolacolor{Green}{1,0,1,0}\xP@definecrayolacolor{ForestGreen}{.91,0,.88,.12}\xP@definecrayolacolor{PineGreen}{.92,0,.59,.25}\xP@definecrayolacolor{LimeGreen}{.5,0,1,0}\xP@definecrayolacolor{YellowGreen}{.44,0,.74,0}\xP@definecrayolacolor{SpringGreen}{.26,0,.76,0}\xP@definecrayolacolor{OliveGreen}{.64,0,.95,.4}\xP@definecrayolacolor{RawSienna}{0,.72,1,.45}\xP@definecrayolacolor{Sepia}{0,.83,1,.7}\xP@definecrayolacolor{Brown}{0,.81,1,.6}\xP@definecrayolacolor{Tan}{.14,.42,.56,0}\xP@definecrayolacolor{Gray}{0,0,0,.5}\xP@definecrayolacolor{Black}{0,0,0,1}\xP@definecrayolacolor{White}{0,0,0,0}}
+\xywithoption{crayon}{\xP@installCrayolaColors
+\renewcommand*\installCrayolaColors@{}}
+\xyendinput
+
+
+
+
+
+%%
+%% End of file `xypdf-co.tex'.
diff --git a/macros/generic/diagrams/xypic/texinputs/xypdf-cu.tex b/macros/generic/diagrams/xypic/texinputs/xypdf-cu.tex
new file mode 100644
index 0000000000..310d6a8ce6
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypdf-cu.tex
@@ -0,0 +1,1187 @@
+%%
+%% This is file `xypdf-cu.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% xypdf.dtx (with options: `curve')
+%%
+%% The xypdf package for TeX and LaTeX
+%% Copyright (c) 2010 by Daniel Müllner (M\"ullner)
+%% <http://math.stanford.edu/~muellner>
+%% --------------------------------------------------------------------------
+%%
+%% This program is free software: you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the Free
+%% Software Foundation, either version 2 of the License, or (at your option)
+%% any later version.
+%%
+%% This program is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% The GNU General Public License is available at
+%% <http://www.gnu.org/licenses/>.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% This file is part of the xypdf package for TeX and LaTeX2e. The xypdf
+%% package may be distributed and/or modified under the conditions of the
+%% GNU General Public License as published by the Free Software Foundation,
+%% either version 2 of the License, or (at your option) any later version.
+%% The distribution consists of the following files:
+%%
+%% xypdf.dtx - Documented source code
+%% xypdf.ins - Installation script
+%% xypdf.pdf - Documentation (generated from xypdf.dtx)
+%%
+%% The files with the TeX code are generated by the following command:
+%%
+%% latex xypdf.ins
+%%
+%% This generates the files xypdf.tex, xypdf-co.tex, xypdf-cu.tex,
+%% xypdf-fr.tex, xypdf-li.tex and xypdf-ro.tex.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% The xypdf package improves the output quality of the Xy-pic package when
+%% PDF documents are generated. It produces generic PDF code for graphical
+%% elements like lines, curves and circles instead of approximating these
+%% elements with glyphs in special fonts as the original Xy-pic package does.
+%% The xypdf package works with both TeX and LaTeX in the occurrences of
+%% pdfTeX, XeTeX and eTeX with dvipdfm(x) to generate PDF files. It is being
+%% integrated and distributed together with Xy-pic, starting with Xy-pic
+%% version 3.8.
+%%
+%% The copyright for the xypdf package is by its author, Daniel Müllner
+%% (Muellner, M\"ullner).
+%%
+\xycatcodes
+\expandafter\let\csname xypdf-cu@loaded\endcsname\@empty
+\newcommand*\xP@tempvar[2]{\@ifdefinable#1\relax
+\let#1#2}
+\newcommand*\xP@oldornewdimen[2]{\@ifundefined{#2}{\xP@newdimen#1}{\expandafter\xP@tempvar\expandafter#1\csname#2\endcsname}}
+\xP@tempvar\xP@bigdim\quotPTK@
+\xP@tempvar\xP@parA\L@p
+\xP@tempvar\xP@velA\U@p
+\xP@tempvar\xP@parB\R@p
+\xP@tempvar\xP@velB\D@p
+\xP@tempvar\xP@parC\X@origin
+\xP@tempvar\xP@velC\Y@origin
+\xP@tempvar\xP@parD\X@xbase
+\xP@tempvar\xP@velD\Y@xbase
+\xP@tempvar\xP@parE\X@ybase
+\xP@tempvar\xP@velE\Y@ybase
+\xP@tempvar\xP@lenA\X@min
+\xP@tempvar\xP@lenB\Y@min
+\xP@tempvar\xP@partlen\X@max
+\xP@tempvar\xP@oldpartlen\Y@max
+\xP@tempvar\xP@tolerance\almostz@
+\xP@tempvar\xP@A\L@p
+\xP@tempvar\xP@B\U@p
+\xP@tempvar\xP@C\R@p
+\xP@tempvar\xP@D\D@p
+\xP@tempvar\xP@E\X@origin
+\xP@tempvar\xP@F\Y@origin
+\xP@tempvar\xP@G\X@xbase
+\xP@tempvar\xP@H\Y@xbase
+\xP@tempvar\xP@I\X@ybase
+\xP@tempvar\xP@J\Y@ybase
+\xP@tempvar\xP@K\X@min
+\xP@tempvar\xP@L\Y@min
+\xP@tempvar\xP@fa\X@max
+\xP@tempvar\xP@fd\Y@max
+\xP@tempvar\xP@tm\almostz@
+\xP@tempvar\xP@xm\K@dXdY
+\xP@tempvar\xP@ym\K@dYdX
+\xP@tempvar\xP@off\splineval@
+\xP@tempvar\xP@ta\splinedepth@
+\xP@tempvar\xP@tb\splinetol@
+\xP@tempvar\xP@tc\splinelength@
+\xP@tempvar\xP@M\L@
+\@tempcnta\count11\relax
+\xP@oldornewdimen\xP@oldobj{normallineskiplimit}
+\xP@oldornewdimen\xP@Tax{@savsk}
+\xP@oldornewdimen\xP@Tay{lower@bound}
+\xP@oldornewdimen\xP@Tdx{upper@bound}
+\xP@oldornewdimen\xP@Tdy{leftmargin}
+\xP@oldornewdimen\xP@Tmx{rightmargin}
+\xP@oldornewdimen\xP@Tmy{listparindent}
+\xP@oldornewdimen\xP@xa{itemindent}
+\xP@oldornewdimen\xP@ya{labelwidth}
+\xP@oldornewdimen\xP@xb{labelsep}
+\xP@oldornewdimen\xP@yb{linewidth}
+\xP@oldornewdimen\xP@xc{@totalleftmargin}
+\xP@oldornewdimen\xP@yc{leftmargini}
+\xP@oldornewdimen\xP@xd{leftmarginii}
+\xP@oldornewdimen\xP@yd{leftmarginiii}
+\count11\@tempcnta
+\xP@tempvar\xP@a\X@ybase
+\xP@tempvar\xP@b\Y@ybase
+\xP@tempvar\xP@c\X@min
+\xP@tempvar\xP@valA\Y@min
+\xP@tempvar\xP@valB\X@max
+\xP@tempvar\xP@devA\Y@max
+\xP@tempvar\xP@devB\almostz@
+\xP@tempvar\xP@ti\K@dXdY
+\xP@tempvar\xP@tip\K@dYdX
+\xP@tempvar\xP@sa\xP@Tax
+\xP@tempvar\xP@sb\xP@Tay
+\xP@tempvar\xP@sc\xP@Tdx
+\xP@tempvar\xP@Ab\xP@Tdy
+\xP@tempvar\xP@AAb\xP@Tmx
+\xP@tempvar\xP@Aba\xP@Tmy
+\xP@tempvar\xP@Abb\xP@xa
+\xP@tempvar\xP@Abc\xP@ya
+\xP@tempvar\xP@AAba\xP@xb
+\xP@tempvar\xP@AAbb\xP@yb
+\xP@tempvar\xP@AAbc\xP@xc
+\xP@tempvar\xP@dta\xP@yc
+\xP@tempvar\xP@dtb\xP@xd
+\xP@tempvar\xP@dtc\xP@yd
+\xP@tempvar\xP@temppar\X@origin
+\xP@tempvar\xP@tempvel\Y@origin
+\xP@tempvar\xP@posX\X@xbase
+\xP@tempvar\xP@posY\Y@xbase
+\xP@tempvar\xP@oldpar\X@ybase
+\xP@tempvar\xP@lastpar\Y@ybase
+\xP@tempvar\xP@tempvel@\X@min
+\xP@tempvar\xP@parinc\Y@min
+\xP@tempvar\xP@squiglen\almostz@
+\xP@tempvar\xP@scaleone\K@
+\xP@tempvar\xP@scaletwo\KK@
+\xP@tempvar\xP@scalethree\Direction
+\xP@hook{curve}{splinesolid@}
+\newcommand*\xP@splinesolid@{\xP@spline\xP@setsolidpat}
+\xP@hook{curve}{splinedashed@}
+\newcommand*\xP@splinedashed@{\xP@spline\xP@setdashpat}
+\xP@hook{curve}{splinedotted@}
+\newcommand*\xP@splinedotted@{\xP@spline\xP@setdottedpat}
+\newcommand*\xP@spline[1]{\readsplineparams@
+\ifdim\dimen5<\dimen7
+\xP@preparespline
+\ifdim\@tempdimb>\z@
+#1\xP@stroke{\xP@coor\X@p\Y@p m \xP@coor\L@c\U@c\xP@coor\R@c\D@c\xP@coor\X@c\Y@c c}\xP@savec
+\fi
+\fi
+}
+\newcommand*\xP@preparespline{\ifx\splineinfo@\squineinfo@
+\L@c\dimexpr(\X@p+2\A@)/3\relax
+\U@c\dimexpr(\Y@p+2\B@)/3\relax
+\R@c\dimexpr(\X@c+2\A@)/3\relax
+\D@c\dimexpr(\Y@c+2\B@)/3\relax
+\fi
+\xP@shavespline
+\xP@bezierlength
+}
+\newcommand*\xP@inibigdim{\xP@bigdim5040pt}
+\newcommand*\xP@shavespline{\xP@shaveprec{\dimen5*\xP@bigdim/\p@}{\dimen7*\xP@bigdim/\p@}}
+\newcommand*\xP@shaveprec[2]{{\xP@inibigdim
+\A@\dimexpr#1\relax
+\B@\dimexpr#2\relax
+\@tempswatrue
+\ifdim\A@=\z@\ifdim\B@=\xP@bigdim\@tempswafalse\fi\fi
+\if@tempswa
+\L@p\dimexpr\L@c-\X@p\relax
+\U@p\dimexpr\R@c-\L@p-\L@c\relax
+\R@p\dimexpr\X@c-3\R@c+3\L@c-\X@p\relax
+\D@p\dimexpr\U@c-\Y@p\relax
+\X@min\dimexpr\D@c-\D@p-\U@c\relax
+\Y@min\dimexpr\Y@c-3\D@c+3\U@c-\Y@p\relax
+\xdef\@gtempa{\X@p\the\dimexpr\X@p+(3\L@p+(3\U@p+\R@p*\A@/\xP@bigdim)*\A@/\xP@bigdim)*\A@/\xP@bigdim\relax
+\Y@p\the\dimexpr\Y@p+(3\D@p+(3\X@min+\Y@min*\A@/\xP@bigdim)*\A@/\xP@bigdim)*\A@/\xP@bigdim\relax
+\L@c\the\dimexpr\X@p+(2\A@+\B@)*\L@p/\xP@bigdim+((\A@+2\B@)*\U@p/\xP@bigdim+\R@p*\A@/\xP@bigdim*\B@/\xP@bigdim)*\A@/\xP@bigdim\relax
+\U@c\the\dimexpr\Y@p+(2\A@+\B@)*\D@p/\xP@bigdim+((\A@+2\B@)*\X@min/\xP@bigdim+\Y@min*\A@/\xP@bigdim*\B@/\xP@bigdim)*\A@/\xP@bigdim\relax
+\R@c\the\dimexpr\X@p+(2\B@+\A@)*\L@p/\xP@bigdim+((\B@+2\A@)*\U@p/\xP@bigdim+\R@p*\B@/\xP@bigdim*\A@/\xP@bigdim)*\B@/\xP@bigdim\relax
+\D@c\the\dimexpr\Y@p+(2\B@+\A@)*\D@p/\xP@bigdim+((\B@+2\A@)*\X@min/\xP@bigdim+\Y@min*\B@/\xP@bigdim*\A@/\xP@bigdim)*\B@/\xP@bigdim\relax
+\X@c\the\dimexpr\X@p+(3\L@p+(3\U@p+\R@p*\B@/\xP@bigdim)*\B@/\xP@bigdim)*\B@/\xP@bigdim\relax
+\Y@c\the\dimexpr\Y@p+(3\D@p+(3\X@min+\Y@min*\B@/\xP@bigdim)*\B@/\xP@bigdim)*\B@/\xP@bigdim\relax}\else
+\global\let\@gtempa\relax
+\fi
+}\@gtempa
+}
+\newcommand*\xP@bezierlength{{\xP@inibigdim
+\@tempdimb\z@
+\xP@parA\z@
+\xP@velocity\z@\xP@velA
+\xP@parC.5\xP@bigdim
+\xP@velocity\xP@parC\xP@velC
+\xP@velocity\xP@bigdim\xP@velE
+\xP@oldpartlen\dimexpr(\xP@velA+4\xP@velC+\xP@velE)/6\relax
+\xP@tolerance\xP@max{1sp}{\dimexpr\xP@oldpartlen/100000\relax}\xP@arclength\xP@parC\xP@velC\xP@bigdim\xP@velE\xP@oldpartlen
+\global\dimen@i\@tempdimb
+}\@tempdimb\dimen@i
+}
+\newcommand*\xP@velocity[2]{{\@tempdima\dimexpr#1\relax
+\xP@tangent
+\global\dimen@i\@tempdimb
+}#2\dimen@i
+}
+\newcommand*\xP@tangent{\d@X3\xP@precbeziertan\X@p\L@c\R@c\X@c\@tempdima
+\d@Y3\xP@precbeziertan\Y@p\U@c\D@c\Y@c\@tempdima
+\xP@veclen
+}
+\newcommand*\xP@tangentvec[1]{{\@tempdima#1\relax
+\xP@tangent
+\ifdim\@tempdimb=\z@
+\L@p\dimexpr\X@c-\X@p+(\L@c-\R@c)*3\relax
+\U@p\dimexpr\Y@c-\Y@p+(\U@c-\D@c)*3\relax
+\d@X\dimexpr\L@p*\@tempdima/\xP@bigdim+(\X@p-2\L@c+\R@c)\relax
+\d@Y\dimexpr\U@p*\@tempdima/\xP@bigdim+(\Y@p-2\U@c+\D@c)\relax
+\xP@veclen
+\ifdim\@tempdimb=\z@
+\d@X\L@p
+\d@Y\U@p
+\xP@veclen
+\ifdim\@tempdimb=\z@
+\xP@warning{xypdf}{Cannot determine a tangent vector to a curve}\@tempdimb\p@
+\fi
+\fi
+\fi
+\global\dimen@i\d@X
+\global\dimen3\d@Y
+\global\dimen5\@tempdimb
+}\d@X\dimen@i
+\d@Y\dimen3\relax
+\@tempdimb\dimen5\relax
+}
+\newcommand*\xP@arclength[5]{\xP@parE#3\xP@velE#4\xP@parC#1\xP@velC#2\xP@oldpartlen#5\xP@parB\dimexpr(\xP@parC+\xP@parA)/2\relax
+\xP@velocity\xP@parB\xP@velB
+\xP@parD\dimexpr(\xP@parE+\xP@parC)/2\relax
+\xP@velocity\xP@parD\xP@velD
+\xP@lenA
+\dimexpr(\xP@velA+4\xP@velB+\xP@velC)/6*(\xP@parC-\xP@parA)/\xP@bigdim\relax
+\xP@lenB
+\dimexpr(\xP@velC+4\xP@velD+\xP@velE)/6*(\xP@parE-\xP@parC)/\xP@bigdim\relax
+\xP@partlen\dimexpr\xP@lenA+\xP@lenB\relax
+{\@tempdima\dimexpr\xP@oldpartlen-\xP@partlen\relax
+\expandafter}\ifdim\ifdim\@tempdima<\z@-\fi\@tempdima>\xP@tolerance
+\edef\next@{\noexpand\xP@arclength\xP@parB\xP@velB\xP@parC\xP@velC\xP@lenA
+\noexpand\xP@arclength{\the\xP@parD}{\the\xP@velD}{\the\xP@parE}{\the\xP@velE}{\the\xP@lenB}}\else
+\xP@parA\xP@parE
+\xP@velA\xP@velE
+\advance\@tempdimb\xP@partlen
+\DN@{}\fi
+\next@
+}
+\xP@hook{curve}{@crv@}
+\newcommand*\xP@@crv@[2]{\DN@{#1#2}\ifx\next@\@empty \edef\next@{\crv@defaultshape}\ifx\bstartPLACE@\@empty\xdef\crvSTYLE@@{{\crv@defaultshape}}\fi
+\else
+\ifx\bstartPLACE@\@empty\gdef\crvSTYLE@@{#1{#2}}\fi
+\fi
+\ifx\next@\@empty\crv@noobject \DN@{\crv@{}{\xy@@crvaddstack@}}\else\def\tmp@{-}\ifx\next@\tmp@ \DN@{\crv@{}{\xy@@crvaddstack@}}\else\def\tmp@{=}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir{=}}}\else\def\tmp@{2-}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir{2.}}}\else\def\tmp@{3-}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir{3.}}}\else\def\tmp@{--}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@specialtemplate@{--}}\else\def\tmp@{==}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir2{--}}}\else\def\tmp@{2--}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir2{--}}}\else\def\tmp@{3--}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir3{--}}}\else\def\tmp@{.}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@specialtemplate@{.}}\else\def\tmp@{:}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir{:}}}\else\def\tmp@{2.}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir{:}}}\else\def\tmp@{3.}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir3{.}}}\else\def\tmp@{~}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir{~}}}\else\def\tmp@{2~}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir2{~}}}\else\def\tmp@{3~}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir3{~}}}\else\def\tmp@{~~}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir{~~}}}\else\def\tmp@{2~~}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir2{~~}}}\else\def\tmp@{3~~}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@normaltemplate{\dir3{~~}}}\else\def\tmp@{..}\ifx\next@\tmp@
+\DN@{\expandafter\crv@\crv@specialtemplate@{.}}\else
+\DN@{\expandafter\crv@\crv@othertemplate{\dir#1{#2}}}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\next@}
+\xP@hook{curve}{xysplinespecialcases@}
+\newcommand*\xP@xysplinespecialcases@{\ifx\@empty\xycrvdrop@
+\ifx\@empty\xycrvconn@\DN@{\splinesolid@}\else\DN@{ \dir{-}}\ifx\next@\xycrvconn@\DN@{\splinesolid@}\else\DN@{ \dir2{-}}\ifx\next@\xycrvconn@\DN@{\splinedoubled@}\else\DN@{ \dir{=}}\ifx\next@\xycrvconn@\DN@{\splineribboned@}\else\DN@{ \dir{2.}}\ifx\next@\xycrvconn@\DN@{\splinedoubled@}\else\DN@{ \dir3{-}}\ifx\next@\xycrvconn@\DN@{\splinetrebled@}\else\DN@{ \dir{3.}}\ifx\next@\xycrvconn@\DN@{\splinetrebled@}\else\DN@{ \dir{--}}\ifx\next@\xycrvconn@\DN@{\splinedashed@}\else\DN@{ \dir{.}}\ifx\next@\xycrvconn@\DN@{\splinedotted@}\else\DN@{ \dir{:}}\ifx\next@\xycrvconn@\DN@{\splinedbldotted@}\else\DN@{ \dir2{.}}\ifx\next@\xycrvconn@\DN@{\splinedbldotted@}\else\DN@{ \dir3{.}}\ifx\next@\xycrvconn@\DN@{\xP@splinetrbldotted}\else\DN@{ \dir2{--}}\ifx\next@\xycrvconn@\DN@{\xP@splinedbldashed}\else\DN@{ \dir3{--}}\ifx\next@\xycrvconn@\DN@{\xP@splinetrbldashed}\else\DN@{ \dir{~}}\ifx\next@\xycrvconn@\DN@{\xP@splinesquiggled}\else\DN@{ \dir2{~}}\ifx\next@\xycrvconn@\DN@{\xP@splinedblsquiggled}\else\DN@{ \dir3{~}}\ifx\next@\xycrvconn@\DN@{\xP@splinetrblsquiggled}\else\DN@{ \dir{~~}}\ifx\next@\xycrvconn@\DN@{\xP@splinebrokensquiggled}\else\DN@{ \dir2{~~}}\ifx\next@\xycrvconn@\DN@{\xP@splinebrokendblsquiggled}\else\DN@{ \dir3{~~}}\ifx\next@\xycrvconn@\DN@{\xP@splinebrokentrblsquiggled}\else\ifdim\splinetol@>\z@\else\splinedefaulttol@\fi
+\DN@{\splineset@@}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+\else
+\DN@{\splineset@@}\fi
+\ifInvisible@\DN@{}\fi
+\next@
+}
+\xP@hook{curve}{splinedoubled@}
+\newcommand*\xP@splinedoubled@{\xP@checkspline\xP@splinemultsolid\xP@doublestroke}
+\xP@hook{curve}{splineribboned@}
+\@ifdefinable\xP@splineribboned@\relax
+\let\xP@splineribboned@\xP@splinedoubled@
+\xP@hook{curve}{splinetrebled@}
+\newcommand*\xP@splinetrebled@{\xP@checkspline\xP@splinemultsolid\xP@trblstroke}
+\newcommand*\xP@doublestroke{\xydashh@/2,-\xydashh@/2}
+\newcommand*\xP@trblstroke{\xydashh@,\z@,-\xydashh@}
+\newcommand*\xP@checkspline[1]{\readsplineparams@
+\let\next@\@gobble
+\ifdim\dimen5<\dimen7
+\xP@preparespline
+\ifdim\@tempdimb>\z@
+\ifdim\@tempdimb<2\dimexpr\xP@preclw\relax
+\let\next@\xP@splinemultsolid
+\else
+\let\next@#1\fi
+\fi
+\fi
+\next@
+}
+\newcommand*\xP@splinemultsolid[1]{{\xP@inibigdim
+\@temptokena{}\xP@setsolidpat
+\@for\@tempa:={#1}\do{\xP@paintsolid\z@\xP@bigdim}\xP@stroke{\the\@temptokena}}}
+\newcommand*\xP@paintsolid[2]{{\xP@savepts
+\xP@a#1\relax
+\xP@c#2\relax
+\xP@movetotrue
+\xP@paintsolid@
+\xdef\@gtempa{\the\@temptokena}}\@temptokena\expandafter{\@gtempa}}
+\newcommand*\xP@paintsolid@{\xP@b\xP@c
+\xP@off\dimexpr\@tempa\relax
+\ifdim\xP@off=\z@
+\xP@shaveprec\xP@a\xP@c
+\else
+\loop
+\xP@restorepts
+\xP@offsetsegment
+\xP@testoffset
+\unless\ifxP@offsetok
+\xP@b\dimexpr\xP@a+(\xP@b-\xP@a)*7/10\relax
+\repeat
+\fi
+\xP@append\@temptokena{\ifxP@moveto\xP@coor\X@p\Y@p m \fi
+\xP@coor\L@c\U@c\xP@coor\R@c\D@c\xP@coor\X@c\Y@c c }\xP@movetofalse
+\ifdim\xP@b<\xP@c\relax
+\xP@a\xP@b
+\expandafter\xP@paintsolid@
+\fi
+}
+\@ifdefinable\ifxP@moveto\relax
+\@ifdefinable\xP@movetotrue\relax
+\@ifdefinable\xP@movetofalse\relax
+\newif\ifxP@moveto
+\newcommand*\xP@savepts{\xP@xa\X@p
+\xP@ya\Y@p
+\xP@xb\L@c
+\xP@yb\U@c
+\xP@xc\R@c
+\xP@yc\D@c
+\xP@xd\X@c
+\xP@yd\Y@c
+}
+\newcommand*\xP@restorepts{\X@p\xP@xa
+\Y@p\xP@ya
+\L@c\xP@xb
+\U@c\xP@yb
+\R@c\xP@xc
+\D@c\xP@yc
+\X@c\xP@xd
+\Y@c\xP@yd
+}
+\@ifdefinable\xP@tmx\relax
+\@ifdefinable\xP@tmy\relax
+\newcommand*\xP@Tmxy{*\xP@Tmx/\xP@Tmy}
+\newcommand*\xP@Tmyx{*\xP@Tmy/\xP@Tmx}
+\newcommand*\xP@Tmzero{*\z@}
+\newcommand*\xP@offsetsegment{{\xP@tangentvec\xP@a
+\xP@xa\dimexpr\xP@precbezierpoly\X@p\L@c\R@c\X@c\xP@a/8+\d@Y*\xP@off/\@tempdimb\relax
+\xP@ya\dimexpr\xP@precbezierpoly\Y@p\U@c\D@c\Y@c\xP@a/8-\d@X*\xP@off/\@tempdimb\relax
+\xP@scaleT
+\xP@Tax\d@X
+\xP@Tay\d@Y
+\xP@E\@tempdimb
+\xP@tangentvec\xP@b
+\xP@xd\dimexpr\xP@precbezierpoly\X@p\L@c\R@c\X@c\xP@b/8+\d@Y*\xP@off/\@tempdimb\relax
+\xP@yd\dimexpr\xP@precbezierpoly\Y@p\U@c\D@c\Y@c\xP@b/8-\d@X*\xP@off/\@tempdimb\relax
+\xP@scaleT
+\xP@Tdx-\d@X
+\xP@Tdy-\d@Y
+\xP@F\@tempdimb
+\xP@M\z@
+\xP@Max\xP@M\xP@Tdx
+\xP@Max\xP@M\xP@Tdy
+\xP@L\dimexpr\xP@Tax*\xP@Tdx/\xP@M+\xP@Tay*\xP@Tdy/\xP@M\relax
+\xP@tm\dimexpr(\xP@a+\xP@b)/2\relax
+\ifdim\xP@L>\dimexpr\xP@E*\xP@F/\xP@M*49/50\relax
+\d@X-\dimexpr\xP@Tay+\xP@Tdy\relax
+\d@Y\dimexpr\xP@Tax+\xP@Tdx\relax
+\xP@veclen
+\xP@A\dimexpr\X@c-\X@p\relax
+\xP@B\dimexpr\Y@c-\Y@p\relax
+\xP@M\z@
+\xP@Max\xP@M\xP@A
+\xP@Max\xP@M\xP@B
+\ifdim\xP@M=\z@
+\xP@A\dimexpr\R@c-\L@c\relax
+\xP@B\dimexpr\D@c-\U@c\relax
+\xP@Max\xP@M\xP@A
+\xP@Max\xP@M\xP@B
+\fi
+\xP@M\dimexpr\d@X*\xP@A/\xP@M+\d@Y*\xP@B/\xP@M\relax
+\ifdim\xP@M<\z@
+\multiply\d@X\m@ne
+\multiply\d@Y\m@ne
+\fi
+\else
+\xP@tangentvec\xP@tm
+\fi
+\xP@xm\dimexpr\xP@precbezierpoly\X@p\L@c\R@c\X@c\xP@tm+8\d@Y*\xP@off/\@tempdimb\relax
+\xP@ym\dimexpr\xP@precbezierpoly\Y@p\U@c\D@c\Y@c\xP@tm-8\d@X*\xP@off/\@tempdimb\relax
+\xP@Tmx\d@X
+\xP@Tmy\d@Y
+\xP@ifabsless\xP@Tmy\xP@Tmx
+\let\xP@tmy\xP@Tmyx
+\let\xP@tmx\@empty
+\else
+\ifdim\xP@Tmy=\z@
+\let\xP@tmx\xP@Tmzero
+\let\xP@tmy\xP@Tmzero
+\else
+\let\xP@tmy\@empty
+\let\xP@tmx\xP@Tmxy
+\fi
+\fi
+\xP@fa\p@
+\xP@fd\p@
+\xP@tm\p@
+\count@\z@
+\loop
+\xP@offsetpoints
+\@tempswafalse
+\ifnum10>\count@
+\xP@objfun\xP@oldobj
+\ifdim\xP@oldobj>\xP@maxobjfun\relax\@tempswatrue\fi
+\fi
+\if@tempswa
+\xP@offsetloop
+\repeat
+\xdef\@gtempa{\X@p\the\xP@xa\Y@p\the\xP@ya
+\L@c\the\xP@xb\U@c\the\xP@yb\R@c\the\xP@xc\D@c\the\xP@yc
+\X@c\the\xP@xd\Y@c\the\xP@yd\relax}}\@gtempa
+}
+\newcommand*\xP@scaleT{\xP@B6.28\xP@off
+\xP@abs\xP@B
+\xP@C\dimexpr\d@X*\xP@B/\@tempdimb\relax
+\xP@D\dimexpr\d@Y*\xP@B/\@tempdimb\relax
+\xP@A\dimexpr\xP@b-\xP@a\relax
+\d@X\dimexpr\xP@C+\d@X*\xP@A/\xP@bigdim\relax
+\d@Y\dimexpr\xP@D+\d@Y*\xP@A/\xP@bigdim\relax
+\@tempdimb\dimexpr\xP@B+\@tempdimb*\xP@A/\xP@bigdim\relax
+}
+\newcommand*\xP@offsetloop{\xP@C\dimexpr\xP@C/2\relax
+\xP@G\dimexpr\xP@G/2\relax
+\xP@ta\dimexpr2\p@-\xP@tm\relax
+\xP@tb\dimexpr\xP@tm*\xP@ta/\p@\relax
+\xP@A\dimexpr\xP@Tax*\xP@tb/\p@*\xP@ta/\p@\relax
+\xP@B\dimexpr\xP@Tdx*\xP@tb/\p@*\xP@tm/\p@\relax
+\xP@E\dimexpr\xP@Tay*\xP@tb/\p@*\xP@ta/\p@\relax
+\xP@F\dimexpr\xP@Tdy*\xP@tb/\p@*\xP@tm/\p@\relax
+\xP@tb\dimexpr2\p@-3\xP@tm\relax
+\xP@tc\dimexpr\xP@tb+2\p@\relax
+\xP@I\dimexpr(2\xP@Tay\xP@tmx-2\xP@Tax\xP@tmy)*\xP@tb/\p@*\xP@ta/\p@\relax
+\xP@J\dimexpr(2\xP@Tdy\xP@tmx-2\xP@Tdx\xP@tmy)*\xP@tc/\p@*\xP@tm/\p@\relax
+\xP@K\dimexpr((\xP@yd-\xP@ya+(\xP@yb-\xP@yc)*3)
+*\xP@tm/\p@+(\xP@yc-2\xP@yb+\xP@ya)*2)*12\xP@tmx
+-((\xP@xd-\xP@xa+(\xP@xb-\xP@xc)*3)
+*\xP@tm/\p@+(\xP@xc-2\xP@xb+\xP@xa)*2)*12\xP@tmy\relax
+\xP@solvelinearsystem
+\ifxP@validsol
+\xP@correctsol
+\ifdim\xP@ta=\z@
+\ifdim\xP@tb=\z@
+\ifdim\xP@tc=\z@
+\xP@validsolfalse
+\fi\fi\fi
+\fi
+\ifxP@validsol
+\else
+\xP@applinsys
+\advance\xP@fa-\xP@ta
+\advance\xP@fd-\xP@tb
+\advance\xP@tm-\xP@tc
+\ifdim\xP@tm<\z@\xP@tm\z@\fi
+\ifdim\xP@tm>2\p@\xP@tm2\p@\fi
+\fi
+\advance\count@\@ne
+}
+\newcommand*\xP@maxsol{3pt}
+\newcommand*\xP@correctsol{\xP@M\z@
+\xP@Max\xP@M\xP@ta
+\xP@Max\xP@M\xP@tb
+\xP@Max\xP@M\xP@tc
+\ifdim\xP@M>\xP@maxsol
+\xP@ta\dimexpr\xP@maxsol*\xP@ta/\xP@M\relax
+\xP@tb\dimexpr\xP@maxsol*\xP@tb/\xP@M\relax
+\xP@tc\dimexpr\xP@maxsol*\xP@tc/\xP@M\relax
+\fi
+\advance\xP@fa-\xP@ta
+\advance\xP@fd-\xP@tb
+\xP@M\xP@tm
+\advance\xP@tm-\xP@tc
+\ifdim\xP@tm<\z@\xP@tm\z@\fi
+\ifdim\xP@tm>2\p@\xP@tm2\p@\fi
+{\xP@offsetpoints
+\xP@objfun\xP@M
+\expandafter}\ifdim\xP@M>\xP@oldobj
+\advance\xP@fa\xP@ta
+\advance\xP@fd\xP@tb
+\xP@tm\xP@M
+\xP@validsolfalse
+\fi
+}
+\newcommand*\xP@objfun[1]{\xP@D\dimexpr\xP@bezierpoly\xP@xa\xP@xb\xP@xc\xP@xd\xP@tm-\xP@xm\relax
+\xP@H\dimexpr\xP@bezierpoly\xP@ya\xP@yb\xP@yc\xP@yd\xP@tm-\xP@ym\relax
+\xP@C\xP@beziertan\xP@xa\xP@xb\xP@xc\xP@xd\xP@tm
+\xP@G\xP@beziertan\xP@ya\xP@yb\xP@yc\xP@yd\xP@tm
+\xP@L\dimexpr\xP@G\xP@tmx-\xP@C\xP@tmy\relax
+#1\z@
+\xP@Max#1\xP@D
+\xP@Max#1\xP@H
+\xP@Max#1\xP@L
+#1\ifdim#1>4843165sp
+\maxdimen
+\else
+\dimexpr\xP@D*\xP@D/\p@+\xP@H*\xP@H/\p@+\xP@L*\xP@L/\p@\relax
+\fi
+}
+\newcommand*\xP@offsetpoints{\xP@xb\dimexpr\xP@xa+\xP@Tax*\xP@fa/196608\relax
+\xP@yb\dimexpr\xP@ya+\xP@Tay*\xP@fa/196608\relax
+\xP@xc\dimexpr\xP@xd+\xP@Tdx*\xP@fd/196608\relax
+\xP@yc\dimexpr\xP@yd+\xP@Tdy*\xP@fd/196608\relax
+}
+\newcommand*\xP@bezierpoly[5]{\dimexpr(((#4-#1+(#2-#3)*3)*#5/\p@+(#1-2#2+#3)*6)*#5/\p@+(#2-#1)*12)*#5/\p@
++#1*8\relax
+}
+\newcommand*\xP@precbezierpoly[5]{\dimexpr(((#4-#1+(#2-#3)*3)*2*#5/\xP@bigdim+(#1-2#2+#3)*6)*2*#5/\xP@bigdim
++(#2-#1)*12)*2*#5/\xP@bigdim+#1*8\relax
+}
+\newcommand*\xP@beziertan[5]{\dimexpr((#4-#1+(#2-#3)*3)*3*#5/32768+(#1-2#2+#3)*24)*#5/\p@+(#2-#1)*24\relax
+}
+\newcommand*\xP@precbeziertan[5]{\dimexpr((#4-#1+(#2-#3)*3)*#5/\xP@bigdim+(#1-2#2+#3)*2)*#5/\xP@bigdim
++#2-#1\relax
+}
+\@ifdefinable\xP@varone\relax
+\@ifdefinable\xP@vartwo\relax
+\@ifdefinable\xP@varthree\relax
+\@ifdefinable\ifxP@validsol\relax
+\@ifdefinable\xP@validsoltrue\relax
+\@ifdefinable\xP@validsolfalse\relax
+\newif\ifxP@validsol
+\newcommand*\xP@solvelinearsystem{{\xP@scalerow\xP@A\xP@B\xP@C\xP@D
+\xP@scalerow\xP@E\xP@F\xP@G\xP@H
+\xP@scalerow\xP@I\xP@J\xP@K\xP@L
+\xP@scalecol\xP@A\xP@E\xP@I\xP@scaleone
+\xP@scalecol\xP@B\xP@F\xP@J\xP@scaletwo
+\xP@scalecol\xP@C\xP@G\xP@K\xP@scalethree
+\let\xP@varone\xP@ta
+\let\xP@vartwo\xP@tb
+\let\xP@varthree\xP@tc
+\count@\m@ne
+\@tempcnta\m@ne
+\xP@ifabsless\xP@A\xP@B\@tempcnta\z@\xP@M\xP@B
+\else\xP@M\xP@A\fi
+\xP@ifabsless\xP@M\xP@C\@tempcnta\@ne\xP@M\xP@C\fi
+\xP@ifabsless\xP@M\xP@E\@tempcnta\m@ne\count@\z@\xP@M\xP@E\fi
+\xP@ifabsless\xP@M\xP@F\@tempcnta\z@\count@\z@\xP@M\xP@F\fi
+\xP@ifabsless\xP@M\xP@G\@tempcnta\@ne\count@\z@\xP@M\xP@G\fi
+\xP@ifabsless\xP@M\xP@I\@tempcnta\m@ne\count@\@ne\xP@M\xP@I\fi
+\xP@ifabsless\xP@M\xP@J\@tempcnta\z@\count@\@ne\xP@M\xP@J\fi
+\xP@ifabsless\xP@M\xP@K\@tempcnta\@ne\count@\@ne\fi
+\ifcase\count@
+\xP@swapdim\xP@A\xP@E
+\xP@swapdim\xP@B\xP@F
+\xP@swapdim\xP@C\xP@G
+\xP@swapdim\xP@D\xP@H
+\or
+\xP@swapdim\xP@A\xP@I
+\xP@swapdim\xP@B\xP@J
+\xP@swapdim\xP@C\xP@K
+\xP@swapdim\xP@D\xP@L
+\fi
+\ifcase\@tempcnta
+\xP@swapdim\xP@A\xP@B
+\xP@swapdim\xP@E\xP@F
+\xP@swapdim\xP@I\xP@J
+\let\xP@varone\xP@tb
+\let\xP@vartwo\xP@ta
+\xP@swapnum\xP@scaleone\xP@scaletwo
+\or
+\xP@swapdim\xP@A\xP@C
+\xP@swapdim\xP@E\xP@G
+\xP@swapdim\xP@I\xP@K
+\let\xP@varone\xP@tc
+\let\xP@varthree\xP@ta
+\xP@swapnum\xP@scaleone\xP@scalethree
+\fi
+\multiply\xP@E\m@ne
+\multiply\xP@I\m@ne
+\ifdim\xP@A=\z@
+\else
+\advance\xP@F\dimexpr\xP@B*\xP@E/\xP@A\relax
+\advance\xP@G\dimexpr\xP@C*\xP@E/\xP@A\relax
+\advance\xP@H\dimexpr\xP@D*\xP@E/\xP@A\relax
+\advance\xP@J\dimexpr\xP@B*\xP@I/\xP@A\relax
+\advance\xP@K\dimexpr\xP@C*\xP@I/\xP@A\relax
+\advance\xP@L\dimexpr\xP@D*\xP@I/\xP@A\relax
+\fi
+\count@\m@ne
+\xP@ifabsless\xP@F\xP@G\@tempcnta\z@\xP@M\xP@G
+\else\@tempcnta\m@ne\xP@M\xP@F\fi
+\xP@ifabsless\xP@M\xP@J\@tempcnta\m@ne\count@\z@\xP@M\xP@J\fi
+\xP@ifabsless\xP@M\xP@K\@tempcnta\z@\count@\z@\fi
+\ifnum\count@=\z@
+\xP@swapdim\xP@F\xP@J
+\xP@swapdim\xP@G\xP@K
+\xP@swapdim\xP@H\xP@L
+\fi
+\ifnum\@tempcnta=\z@
+\xP@swapdim\xP@B\xP@C
+\xP@swapdim\xP@F\xP@G
+\xP@swapdim\xP@J\xP@K
+\let\@tempa\xP@varthree
+\let\xP@varthree\xP@vartwo
+\let\xP@vartwo\@tempa
+\xP@swapnum\xP@scaletwo\xP@scalethree
+\fi
+\ifdim\xP@F=\z@
+\else
+\advance\xP@K\dimexpr-\xP@G*\xP@J/\xP@F\relax
+\advance\xP@L\dimexpr-\xP@H*\xP@J/\xP@F\relax
+\fi
+\xP@ifabsless{\dimexpr\xP@L/60\relax}{\dimexpr\xP@K/\xP@scalethree\relax}\xP@validsoltrue
+\xP@varthree\dimexpr\xP@L*(\xP@scalethree*\p@)/\xP@K\relax
+\else
+\xP@validsolfalse
+\fi
+\xP@checkabs{\xP@H/8191}{\xP@F/\xP@scaletwo}\xP@checkabs{\xP@G/\xP@scalethree/136}{\xP@F/\xP@scaletwo}\ifxP@validsol
+\xP@vartwo\dimexpr\xP@H*(\xP@scaletwo*\p@)/\xP@F
+-\xP@varthree*\xP@scaletwo/\xP@scalethree*\xP@G/\xP@F\relax
+\xP@checkabs\xP@vartwo{60pt}\fi
+\xP@checkabs{\xP@D/5461}{\xP@A/\xP@scaleone}\xP@checkabs{\xP@B/\xP@scaletwo/91}{\xP@A/\xP@scaleone}\xP@checkabs{\xP@C/\xP@scalethree/91}{\xP@A/\xP@scaleone}\ifxP@validsol
+\xP@varone\dimexpr\xP@D*(\xP@scaleone*\p@)/\xP@A
+-\xP@vartwo*\xP@scaleone/\xP@scaletwo*\xP@B/\xP@A
+-\xP@varthree*\xP@scaleone/\xP@scalethree*\xP@C/\xP@A\relax
+\xP@checkabs\xP@varone{60pt}\fi
+\xdef\@gtempa{\ifxP@validsol
+\xP@ta\the\xP@ta\relax
+\xP@tb\the\xP@tb\relax
+\xP@tc\the\xP@tc\relax
+\noexpand\xP@validsoltrue
+\else
+\noexpand\xP@validsolfalse
+\fi
+}}\@gtempa
+}
+\newcommand*\xP@scalerow[4]{\xP@M\z@
+\xP@Max\xP@M#1\xP@Max\xP@M#2\xP@Max\xP@M#3\xP@Max\xP@M#4\count@134217727
+\loop
+\divide\xP@M\tw@
+\ifdim\xP@M>\z@
+\divide\count@\tw@
+\repeat
+\advance\count@\@ne
+\multiply#1\count@
+\multiply#2\count@
+\multiply#3\count@
+\multiply#4\count@
+}
+\newcommand*\xP@scalecol[4]{\xP@M\z@
+\xP@Max\xP@M#1\xP@Max\xP@M#2\xP@Max\xP@M#3#416777215
+\loop
+\divide\xP@M\tw@
+\ifdim\xP@M>\z@
+\divide#4\tw@
+\repeat
+\advance#4\@ne
+\multiply#1#4\multiply#2#4\multiply#3#4}
+\newcommand*\xP@checkabs[2]{\xP@ifabsless{\dimexpr#1\relax}{\dimexpr#2\relax}\else\xP@validsolfalse\fi}
+\newcommand*\xP@applinsys{{\xP@applinsys@
+\xP@ta\xP@dta
+\xP@tb\xP@dtb
+\xP@tc\xP@dtc
+\xP@checkapp
+\if@tempswa
+\xP@modobj
+\xP@applinsys@
+\xP@checkapp
+\if@tempswa
+\xP@modsol
+\xP@modobj
+\xP@applinsys@
+\xP@modsol
+\fi
+\fi
+\xdef\@gtempa{\xP@ta\the\xP@ta\relax
+\xP@tb\the\xP@tb\relax
+\xP@tc\the\xP@tc\relax
+}}\@gtempa
+}
+\newcommand*\xP@checkapp{\@tempswatrue
+\ifdim\xP@dta=\z@
+\ifdim\xP@dtb=\z@
+\ifdim\xP@dtc=\z@
+\@tempswafalse
+\fi\fi\fi
+}
+\newcommand*\xP@modobj{\advance\xP@D
+\dimexpr-\xP@A*\xP@dta/\p@-\xP@B*\xP@dtb/\p@-\xP@C*\xP@dtc/\p@\relax
+\advance\xP@H
+\dimexpr-\xP@E*\xP@dta/\p@-\xP@F*\xP@dtb/\p@-\xP@G*\xP@dtc/\p@\relax
+\advance\xP@L
+\dimexpr-\xP@I*\xP@dta/\p@-\xP@J*\xP@dtb/\p@-\xP@K*\xP@dtc/\p@\relax
+}
+\newcommand*\xP@modsol{\advance\xP@ta\xP@dta
+\advance\xP@tb\xP@dtb
+\advance\xP@tc\xP@dtc
+}
+\newcommand*\xP@applinsys@{{\xP@sa\z@
+\xP@Max\xP@sa\xP@A
+\xP@Max\xP@sa\xP@B
+\xP@Max\xP@sa\xP@C
+\xP@Max\xP@sa\xP@E
+\xP@Max\xP@sa\xP@F
+\xP@Max\xP@sa\xP@G
+\xP@Max\xP@sa\xP@I
+\xP@Max\xP@sa\xP@J
+\xP@Max\xP@sa\xP@K
+\xP@sa\ifdim\xP@sa<5460pt\thr@@\xP@sa\else\maxdimen\fi
+\xP@sb\z@
+\xP@Max\xP@sb\xP@D
+\xP@Max\xP@sb\xP@H
+\xP@Max\xP@sb\xP@L
+\ifdim\xP@sb>\z@
+\xP@D\dimexpr\xP@D*\maxdimen/\xP@sb\relax
+\xP@H\dimexpr\xP@H*\maxdimen/\xP@sb\relax
+\xP@L\dimexpr\xP@L*\maxdimen/\xP@sb\relax
+\fi
+\xP@Aba\dimexpr\xP@A*\xP@D/\xP@sa+\xP@E*\xP@H/\xP@sa+\xP@I*\xP@L/\xP@sa\relax
+\xP@Abb\dimexpr\xP@B*\xP@D/\xP@sa+\xP@F*\xP@H/\xP@sa+\xP@J*\xP@L/\xP@sa\relax
+\xP@Abc\dimexpr\xP@C*\xP@D/\xP@sa+\xP@G*\xP@H/\xP@sa+\xP@K*\xP@L/\xP@sa\relax
+\xP@AAba\dimexpr\xP@A*\xP@Aba/\xP@sa+\xP@B*\xP@Abb/\xP@sa
++\xP@C*\xP@Abc/\xP@sa\relax
+\xP@AAbb\dimexpr\xP@E*\xP@Aba/\xP@sa+\xP@F*\xP@Abb/\xP@sa
++\xP@G*\xP@Abc/\xP@sa\relax
+\xP@AAbc\dimexpr\xP@I*\xP@Aba/\xP@sa+\xP@J*\xP@Abb/\xP@sa
++\xP@K*\xP@Abc/\xP@sa\relax
+\xP@sc\z@
+\xP@Max\xP@sc\xP@Aba
+\xP@Max\xP@sc\xP@Abb
+\xP@Max\xP@sc\xP@Abc
+\xP@Max\xP@sc\xP@AAba
+\xP@Max\xP@sc\xP@AAbb
+\xP@Max\xP@sc\xP@AAbc
+\ifdim\xP@sc=\z@
+\xP@AAb\z@
+\else
+\xP@Ab\dimexpr\xP@Aba*\xP@bigdim/\xP@sc*\xP@Aba/\xP@sc
++\xP@Abb*\xP@bigdim/\xP@sc*\xP@Abb/\xP@sc
++\xP@Abc*\xP@bigdim/\xP@sc*\xP@Abc/\xP@sc
+\relax
+\xP@AAb\dimexpr\xP@AAba*\xP@bigdim/\xP@sc*\xP@AAba/\xP@sc
++\xP@AAbb*\xP@bigdim/\xP@sc*\xP@AAbb/\xP@sc
++\xP@AAbc*\xP@bigdim/\xP@sc*\xP@AAbc/\xP@sc
+\relax
+\fi
+\xdef\@gtempa{\ifdim\xP@AAb=\z@
+\xP@dta\z@
+\xP@dtb\z@
+\xP@dtc\z@
+\else
+\xP@dta\the\dimexpr\xP@Aba*\xP@sb/\xP@sa*\p@/\xP@AAb*\xP@Ab/\maxdimen
+\relax
+\xP@dtb\the\dimexpr\xP@Abb*\xP@sb/\xP@sa*\p@/\xP@AAb*\xP@Ab/\maxdimen
+\relax
+\xP@dtc\the\dimexpr\xP@Abc*\xP@sb/\xP@sa*\p@/\xP@AAb*\xP@Ab/\maxdimen
+\relax
+\fi
+}}\@gtempa
+}
+\@ifdefinable\ifxP@offsetok\relax
+\@ifdefinable\xP@offsetoktrue\relax
+\@ifdefinable\xP@offsetokfalse\relax
+\newif\ifxP@offsetok
+\newcommand*\xP@maxdev{.1pt}
+\newcommand*\xP@maxobjfun{.005pt}
+\newcommand*\xP@testoffset{{\gdef\xP@afteroffsetok{\xP@offsetoktrue}\def\xP@offsetokif{\ifdim\xP@ti<1.85pt}\xP@ti.1pt
+\loop
+\xP@tip\dimexpr\xP@a+(\xP@b-\xP@a)*\xP@ti/131072\relax
+\L@p\xP@precbezierpoly\xP@xa\xP@xb\xP@xc\xP@xd\xP@tip
+\U@p\xP@precbezierpoly\xP@ya\xP@yb\xP@yc\xP@yd\xP@tip
+\xP@valA\dimexpr\xP@bezierpoly\X@p\L@c\R@c\X@c\xP@ti-\L@p\relax
+\xP@valB\dimexpr\xP@bezierpoly\Y@p\U@c\D@c\Y@c\xP@ti-\U@p\relax
+\d@X3\xP@precbeziertan\xP@xa\xP@xb\xP@xc\xP@xd\xP@tip
+\d@Y3\xP@precbeziertan\xP@ya\xP@yb\xP@yc\xP@yd\xP@tip
+\xP@veclen
+\@tempdimc\dimexpr(\xP@b-\xP@a)*\@tempdimb/\xP@bigdim\relax
+\xP@abs\@tempdimc
+\ifdim.01pt<\@tempdimc
+\xP@devA\dimexpr\xP@valA*\d@X/\@tempdimb+\xP@valB*\d@Y/\@tempdimb\relax
+\xP@devB\dimexpr\xP@valA*\d@Y/\@tempdimb-\xP@valB*\d@X/\@tempdimb-8\xP@off
+\relax
+\xP@abs\xP@devA
+\xP@abs\xP@devB
+\@tempdima\dimexpr\xP@devA+\xP@devB\relax
+\else
+\ifdim\@tempdimc=\z@
+\@tempdima\z@
+\else
+{\d@X\xP@valA
+\d@Y\xP@valB
+\xP@veclen@
+\global\dimen@i\@tempdimb
+}\@tempdima\dimen@i
+\advance\@tempdima\ifdim\xP@off>\z@-\fi8\xP@off
+\xP@abs\@tempdima
+\fi
+\fi
+\ifdim\@tempdima>\xP@maxdev
+\divide\L@p-8\relax
+\divide\U@p-8\relax
+{\xP@transformcoor\X@p\Y@p
+\xP@transformcoor\L@c\U@c
+\xP@transformcoor\R@c\D@c
+\xP@transformcoor\X@c\Y@c
+\xP@findzero
+}\fi
+\xP@offsetokif
+\advance\xP@ti.1pt
+\repeat
+\expandafter}\xP@afteroffsetok
+}
+\newcommand*\xP@afteroffsetok{}
+\newcommand*\xP@offsetokif{}
+\newcommand*\xP@transformcoor[2]{\advance#1\L@p
+\advance#2\U@p
+\@tempdima\dimexpr#1*\d@X/\@tempdimb+#2*\d@Y/\@tempdimb\relax
+#2\dimexpr#2*\d@X/\@tempdimb-#1*\d@Y/\@tempdimb\relax
+#1\@tempdima
+}
+\newcommand*\xP@findzero{\xP@setleftvalue{.05}\xP@setrightvalue{.05}\ifdim\xP@valB<\z@\xP@reversecoeff\fi
+\ifdim\xP@valA>\z@
+\@tempswatrue
+\@for\@tempa:={.1,.15,.2,.25,.35,.5,1.1}\do{\if@tempswa
+\xP@setleftvalue\@tempa
+\ifdim\xP@valA<\z@\@tempswafalse\fi
+\if@tempswa
+\xP@setrightvalue\@tempa
+\ifdim\xP@valB<\z@
+\@tempswafalse
+\xP@reversecoeff
+\fi
+\fi
+\fi
+}\if@tempswa
+\L@p\xP@ti
+\xP@valA\xP@bezierpoly\X@p\L@c\R@c\X@c\L@p
+\ifdim\xP@valA<\z@
+\xP@setrightvalue{.05}\else
+\U@p\L@p
+\xP@valB\xP@valA
+\fi
+\fi
+\fi
+\loop
+\ifnum\numexpr\U@p-\L@p\relax>\@ne
+\xP@ti\dimexpr(\L@p+\U@p)/2\relax
+\xP@devA\xP@bezierpoly\X@p\L@c\R@c\X@c\xP@ti
+\ifdim\xP@devA>\z@
+\U@p\xP@ti
+\xP@valB\xP@devA
+\else
+\L@p\xP@ti
+\xP@valA\xP@devA
+\fi
+\repeat
+\xP@ifabsless\xP@valB\xP@valA
+\L@p\U@p
+\xP@valA\xP@valB
+\fi
+\xP@valB\dimexpr\xP@bezierpoly\Y@p\U@c\D@c\Y@c\L@p+8\xP@off\relax
+\xP@abs\xP@valA
+\xP@abs\xP@valB
+\ifdim\dimexpr\xP@valA+\xP@valB\relax>\xP@maxdev\relax
+\xP@failed
+\fi
+}
+\newcommand*\xP@failed{\global\let\xP@offsetokif\iffalse
+\gdef\xP@afteroffsetok{\xP@offsetokfalse}}
+\newcommand*\xP@reversecoeff{\multiply\X@p\m@ne
+\multiply\L@c\m@ne
+\multiply\R@c\m@ne
+\multiply\X@c\m@ne
+\multiply\xP@valA\m@ne
+\multiply\xP@valB\m@ne
+}
+\newcommand*\xP@setleftvalue[1]{\L@p\dimexpr\xP@ti-#1\p@\relax
+\ifdim\L@p<-.1pt\L@p-.1pt\fi
+\xP@valA\xP@bezierpoly\X@p\L@c\R@c\X@c\L@p
+}
+\newcommand*\xP@setrightvalue[1]{\U@p\dimexpr\xP@ti+#1\p@\relax
+\ifdim\U@p>2.1\p@\U@p2.1\p@\fi
+\xP@valB\xP@bezierpoly\X@p\L@c\R@c\X@c\U@p
+}
+\newcommand*\xP@splinedbldashed{\xP@checkspline\xP@splinemultdashed\xP@doublestroke}
+\newcommand*\xP@splinetrbldashed{\xP@checkspline\xP@splinemultdashed\xP@trblstroke}
+\newcommand*\xP@splinemultdashed[1]{\xP@testcont\xP@dashmacro
+\@tempcnta
+\ifxP@splinecont
+\numexpr2*((\@tempdimb-\xydashl@/3)/(2*\xydashl@))\relax
+\else
+\numexpr2*((\@tempdimb+\xydashl@)/(2*\xydashl@))-1\relax
+\fi
+\ifnum\@tempcnta>\@ne
+\xP@splinemultdashed@#1\else
+\ifnum\@tempcnta=\@ne
+\xP@splinemultsolid#1
+\else
+\xP@savec
+\fi
+\fi
+\global\let\xP@lastpattern\xP@dashmacro
+}
+\newcommand*\xP@splinemultdashed@[1]{{\xP@inibigdim
+\@tempdima\dimexpr\@tempdimb/\@tempcnta\relax
+\xP@temppar\z@
+\toks@{}\xP@savec
+\ifodd\@tempcnta
+\else
+\xP@slide
+\fi
+\@tempcnta\z@
+\loop
+\advance\@tempcnta\@ne
+\xP@append\toks@{\ifodd\@tempcnta\noexpand\xP@paintdash\fi
+{\the\xP@temppar}}\xP@oldpar\xP@temppar
+\xP@slide
+\ifdim\xP@temppar<\xP@bigdim
+\repeat
+\xP@lastpar
+\ifodd\@tempcnta
+\xP@temppar
+\xP@append\toks@{{\the\xP@temppar}}\else
+\xP@oldpar
+\fi
+\@temptokena{}\xP@setsolidpat
+\global\let\xP@lastpattern\xP@dashmacro
+\@for\@tempa:={#1}\do{\the\toks@}\xP@stroke{\the\@temptokena}}}
+\newcommand*\xP@paintdash[2]{\xP@paintsolid{\dimexpr#1*\xP@bigdim/\xP@lastpar\relax}{\dimexpr#2*\xP@bigdim/\xP@lastpar\relax}}
+\xP@hook{curve}{splinedbldotted@}
+\newcommand*\xP@splinedbldotted@{\let\xP@normalmult\@ne
+\xP@checkspline\xP@splinemultdotted\xP@doublestroke}
+\newcommand*\xP@splinetrbldotted{\let\xP@normalmult\tw@
+\xP@checkspline\xP@splinemultdotted\xP@trblstroke}
+\newcommand*\xP@multidottedpat{\def\xP@pattern{0 J [\xP@coor\xP@preclw{\xydashh@-\xP@preclw}]0 d}\global\let\xP@lastpattern\xP@dotmacro
+}
+\@ifdefinable\xP@normalmult\relax
+\newcommand\xP@splinemultdotted[1]{{\xP@inibigdim
+\xP@temppar\z@
+\xP@testcont\xP@dotmacro
+\ifxP@splinecont
+\@tempdimc\dimexpr\@tempdimb/(\@tempdimb/131072+1)\relax
+\@tempdima\dimexpr\@tempdimc-\xP@preclw/2\relax
+\xP@slide
+\@tempdima\@tempdimc
+\else
+\@tempdima\dimexpr\xP@preclw/2\relax
+\xP@slide
+\@tempdima\dimexpr\@tempdimb-\xP@preclw\relax
+\ifdim\@tempdima<\z@\@tempdima\z@\fi
+\@tempdima\dimexpr\@tempdima/(\@tempdima/131072+1)\relax
+\fi
+\xP@savec
+\toks@{}\ifdim\xP@temppar<\xP@bigdim
+\loop
+\xP@append\toks@{\noexpand\xP@paintdot{\the\xP@temppar}}\xP@oldpar\xP@temppar
+\xP@slide
+\ifdim\xP@temppar<\xP@bigdim
+\repeat
+\xP@velocity\xP@bigdim\xP@tempvel
+\ifdim
+\ifdim\xP@preclw<\xP@tempvel
+\dimexpr2\xP@bigdim-\xP@oldpar-\xP@preclw*\xP@bigdim/\xP@tempvel\relax
+\else
+-\maxdimen
+\fi<\xP@temppar
+\xP@temppar\xP@oldpar
+\else
+\xP@append\toks@{\noexpand\xP@paintdot{\the\xP@temppar}}\fi
+\@tempdima\dimexpr\xP@preclw/2\relax
+\xP@slide
+\xP@lastpar\xP@temppar
+\@temptokena{}\the\toks@
+\xP@multidottedpat
+\xP@stroke{\the\@temptokena}\else
+\global\let\xP@lastpattern\@empty
+\fi
+}}
+\newcommand*\xP@slide{{\xP@slide@
+\global\dimen@i\xP@temppar
+}\xP@temppar\dimen@i
+}
+\newcommand*\xP@slide@{\xP@velocity\xP@temppar\xP@tempvel
+\@tempdimc\dimexpr\xP@bigdim*\@tempdima/\@tempdimb\relax
+\count@\z@
+\@tempswatrue
+\loop
+\xP@velocity{\xP@temppar+\@tempdimc}\xP@tempvel@
+\ifdim\dimexpr\@tempdima*4/13\relax>\xP@tempvel@
+\@tempswafalse
+\else
+\xP@parinc\dimexpr\@tempdima*\xP@bigdim/\xP@tempvel@
+-(\xP@tempvel+\xP@tempvel@)/2*\@tempdimc/\xP@tempvel@\relax
+\advance\@tempdimc\xP@parinc
+\ifdim\@tempdimc>.12\xP@bigdim
+\@tempswafalse
+\else
+\ifdim\xP@parinc=\z@
+\@tempswafalse
+\else
+\ifnum\count@=9\relax
+\@tempswafalse
+\fi
+\fi
+\fi
+\fi
+\if@tempswa
+\advance\count@\@ne
+\repeat
+\ifdim\xP@temppar<5461pt
+\ifdim\@tempdimc>.1\xP@bigdim
+\@tempswatrue
+\fi
+\fi
+\if@tempswa
+{\dimen5\xP@temppar
+\advance\xP@temppar.1\xP@bigdim
+\ifdim\xP@temppar>5461pt\xP@temppar5461pt\fi
+\dimen7\xP@temppar
+\xP@shaveprec{\dimen5}{\dimen7}\xP@bezierlength
+\global\dimen@i\dimexpr\@tempdima-\@tempdimb\relax
+\global\dimen3\xP@temppar
+}\@tempdima\dimen@i
+\xP@temppar\dimen3\relax
+\expandafter\xP@slide@
+\else
+\advance\xP@temppar\@tempdimc
+\fi
+}
+\newcommand*\xP@paintdot[1]{\@tempdima\dimexpr#1*\xP@bigdim/\xP@lastpar\relax
+\xP@tangent
+\xP@posX\dimexpr\xP@precbezierpoly\X@p\L@c\R@c\X@c\@tempdima/8\relax
+\xP@posY\dimexpr\xP@precbezierpoly\Y@p\U@c\D@c\Y@c\@tempdima/8\relax
+\@tempdima\dimexpr(\xydashh@+\xP@preclw/\xP@normalmult)/2\relax
+\L@p\dimexpr\d@Y*\@tempdima/\@tempdimb\relax
+\U@p\dimexpr-\d@X*\@tempdima/\@tempdimb\relax
+\xP@append\@temptokena{\xP@coor{\xP@posX+\L@p*\xP@normalmult}{\xP@posY+\U@p*\xP@normalmult}m \xP@coor{\xP@posX-\L@p*(\xP@normalmult+\@ne)}{\xP@posY-\U@p*(\xP@normalmult+\@ne)}l }}
+\newcommand*\xP@splinesquiggled{\xP@checkspline\xP@splinesquiggled@\z@}
+\newcommand*\xP@splinedblsquiggled{\xP@checkspline\xP@splinesquiggled@\xP@doublestroke}
+\newcommand*\xP@splinetrblsquiggled{\xP@checkspline\xP@splinesquiggled@\xP@trblstroke}
+\newcommand*\xP@splinesquiggled@[1]{{\xP@inibigdim
+\xP@testcont\xP@oddsquigglemacro
+\ifxP@splinecont
+\def\xP@squigsign{-}\else
+\let\xP@squigsign\@empty
+\fi
+\xP@savec
+\@tempcnta=\numexpr\@tempdimb/\xybsqll@\relax
+\ifnum\@tempcnta<\tw@\@tempcnta\tw@\fi
+\multiply\@tempcnta\tw@
+\@tempdima\dimexpr\@tempdimb/\@tempcnta\relax
+\xP@squiglen\@tempdima
+\xP@temppar\z@
+\toks@{}\@tempcnta\z@
+\loop
+\advance\@tempcnta\@ne
+\xP@append\toks@{\noexpand\xP@paintsquiggle{\the\xP@temppar}}\xP@oldpar\xP@temppar
+\xP@slide
+\ifdim\xP@temppar<\xP@bigdim
+\repeat
+\xP@lastpar
+\ifodd\@tempcnta
+\xP@oldpar
+\advance\@tempcnta\m@ne
+\else
+\xP@temppar
+\xP@append\toks@{\noexpand\xP@paintsquiggle{\the\xP@temppar}}\fi
+\@temptokena{}\xP@setsolidpat
+\global\expandafter\let\expandafter\xP@lastpattern
+\ifodd\numexpr\@tempcnta/2\if\xP@squigsign-+1\fi\relax
+\xP@oddsquigglemacro
+\else
+\xP@evensquigglemacro
+\fi
+\@for\@tempa:={#1}\do{\let\xP@dosquiggle\xP@dosquiggle@
+\count@\z@
+\the\toks@
+}\xP@stroke{\the\@temptokena}}}
+\newcommand*\xP@paintsquiggle[1]{\xP@squigglevectors{#1}\xP@dosquiggle
+\ifnum\count@=\thr@@\relax\count@\z@\else\advance\count@\@ne\fi
+}
+\newcommand*\xP@squigglevectors[1]{\@tempdima\dimexpr#1*\xP@bigdim/\xP@lastpar\relax
+\xP@tangent
+\xP@posX\dimexpr\xP@precbezierpoly\X@p\L@c\R@c\X@c\@tempdima/8-\d@Y*(\@tempa)/\@tempdimb\relax
+\xP@posY\dimexpr\xP@precbezierpoly\Y@p\U@c\D@c\Y@c\@tempdima/8+\d@X*(\@tempa)/\@tempdimb\relax
+\L@p\dimexpr\d@X*\xP@squiglen/\@tempdimb\relax
+\U@p\dimexpr\d@Y*\xP@squiglen/\@tempdimb\relax
+\R@p\dimexpr\L@p*543339720/1311738121\relax
+\D@p\dimexpr\U@p*543339720/1311738121\relax
+\X@min\dimexpr\L@p*362911648/967576667\relax
+\Y@min\dimexpr\U@p*362911648/967576667\relax
+\X@max\dimexpr(\L@p+\xP@squigsign\U@p)*173517671/654249180\relax
+\Y@max\dimexpr(\L@p-\xP@squigsign\U@p)*173517671/654249180\relax
+}
+\@ifdefinable\xP@dosquiggle@\relax
+\newcommand*\xP@dosquiggle@{\edef\next@{\xP@coor{\xP@posX}{\xP@posY}m
+\xP@coor{\xP@posX+\Y@max}{\xP@posY+\xP@squigsign\X@max}}\let\xP@dosquiggle\xP@dosquiggle@@
+}
+\newcommand*\xP@dosquiggle@@{\xP@append\@temptokena{\next@\expandafter\xP@coor
+\ifcase\count@
+{\xP@posX-\Y@max}{\xP@posY-\xP@squigsign\X@max}\xP@coor\xP@posX\xP@posY
+\or
+{\xP@posX-\xP@squigsign\D@p-\X@min}{\xP@posY+\xP@squigsign\R@p-\Y@min}\xP@coor{\xP@posX-\xP@squigsign\D@p}{\xP@posY+\xP@squigsign\R@p}\or
+{\xP@posX-\X@max}{\xP@posY+\xP@squigsign\Y@max}\xP@coor\xP@posX\xP@posY
+\or
+{\xP@posX+\xP@squigsign\D@p-\X@min}{\xP@posY-\xP@squigsign\R@p-\Y@min}\xP@coor{\xP@posX+\xP@squigsign\D@p}{\xP@posY-\xP@squigsign\R@p}\fi c }\edef\next@{\expandafter\xP@coor
+\ifcase\count@
+{\xP@posX+\Y@max}{\xP@posY+\xP@squigsign\X@max}\or
+{\xP@posX-\xP@squigsign\D@p+\X@min}{\xP@posY+\xP@squigsign\R@p+\Y@min}\or
+{\xP@posX+\X@max}{\xP@posY-\xP@squigsign\Y@max}\or
+{\xP@posX+\xP@squigsign\D@p+\X@min}{\xP@posY-\xP@squigsign\R@p+\Y@min}\fi
+}}
+\newcommand*\xP@splinebrokensquiggled{\xP@checkspline\xP@splinebrokensquiggled@\z@}
+\newcommand*\xP@splinebrokendblsquiggled{\xP@checkspline\xP@splinebrokensquiggled@\xP@doublestroke}
+\newcommand*\xP@splinebrokentrblsquiggled{\xP@checkspline\xP@splinebrokensquiggled@\xP@trblstroke}
+\newcommand*\xP@splinebrokensquiggled@[1]{{\xP@inibigdim
+\xP@testcont\xP@brokensquigglemacro
+\ifxP@splinecont
+\let\xP@squigsign\@firstoftwo
+\else
+\let\xP@squigsign\@secondoftwo
+\fi
+\xP@savec
+\@tempcnta\numexpr(\@tempdimb\xP@squigsign{}{+2*\xybsqll@})/(4*\xybsqll@)\relax
+\ifnum\@tempcnta<\@ne\@tempcnta\@ne\fi
+\@tempdima\dimexpr\@tempdimb/(8*\@tempcnta\xP@squigsign{}{-4})\relax
+\xP@squiglen\@tempdima
+\xP@temppar\z@
+\xP@squigsign{\xP@slide\xP@slide\xP@slide\xP@slide}{}\count@\z@
+\toks@{}\loop
+\xP@append\toks@{\noexpand\xP@paintbrokensquiggle{\the\xP@temppar}}\xP@slide
+\xP@append\toks@{{\the\xP@temppar}}\xP@slide
+\xP@append\toks@{{\the\xP@temppar}}\xP@slide
+\xP@append\toks@{{\the\xP@temppar}}\xP@slide
+\xP@append\toks@{{\the\xP@temppar}}\xP@lastpar\xP@temppar
+\advance\count@\@ne
+\ifnum\count@<\@tempcnta
+\xP@slide
+\xP@slide
+\xP@slide
+\xP@slide
+\repeat
+\@temptokena{}\xP@setsolidpat
+\global\let\xP@lastpattern\xP@brokensquigglemacro
+\let\xP@squigsign\@empty
+\@for\@tempa:={#1}\do{\the\toks@}\xP@stroke{\the\@temptokena}}}
+\newcommand*\xP@paintbrokensquiggle[5]{\xP@squigglevectors{#1}\xP@append\@temptokena{\xP@coor\xP@posX\xP@posY m \xP@coor{\xP@posX+\Y@max}{\xP@posY+\X@max}}\xP@squigglevectors{#2}\xP@append\@temptokena{\xP@coor{\xP@posX-\D@p-\X@min}{\xP@posY+\R@p-\Y@min}\xP@coor{\xP@posX-\D@p}{\xP@posY+\R@p}c \xP@coor{\xP@posX-\D@p+\X@min}{\xP@posY+\R@p+\Y@min}}\xP@squigglevectors{#3}\xP@append\@temptokena{\xP@coor{\xP@posX-\X@max}{\xP@posY+\Y@max}\xP@coor\xP@posX\xP@posY c \xP@coor{\xP@posX+\X@max}{\xP@posY-\Y@max}}\xP@squigglevectors{#4}\xP@append\@temptokena{\xP@coor{\xP@posX+\D@p-\X@min}{\xP@posY-\R@p-\Y@min}\xP@coor{\xP@posX+\D@p}{\xP@posY-\R@p}c \xP@coor{\xP@posX+\D@p+\X@min}{\xP@posY-\R@p+\Y@min}}\xP@squigglevectors{#5}\xP@append\@temptokena{\xP@coor{\xP@posX-\Y@max}{\xP@posY-\X@max}\xP@coor\xP@posX\xP@posY c }}
+\xyendinput
+
+
+
+
+
+%%
+%% End of file `xypdf-cu.tex'.
diff --git a/macros/generic/diagrams/xypic/texinputs/xypdf-fr.tex b/macros/generic/diagrams/xypic/texinputs/xypdf-fr.tex
new file mode 100644
index 0000000000..4138294c1a
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypdf-fr.tex
@@ -0,0 +1,438 @@
+%%
+%% This is file `xypdf-fr.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% xypdf.dtx (with options: `frame')
+%%
+%% The xypdf package for TeX and LaTeX
+%% Copyright (c) 2010 by Daniel Müllner (M\"ullner)
+%% <http://math.stanford.edu/~muellner>
+%% --------------------------------------------------------------------------
+%%
+%% This program is free software: you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the Free
+%% Software Foundation, either version 2 of the License, or (at your option)
+%% any later version.
+%%
+%% This program is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% The GNU General Public License is available at
+%% <http://www.gnu.org/licenses/>.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% This file is part of the xypdf package for TeX and LaTeX2e. The xypdf
+%% package may be distributed and/or modified under the conditions of the
+%% GNU General Public License as published by the Free Software Foundation,
+%% either version 2 of the License, or (at your option) any later version.
+%% The distribution consists of the following files:
+%%
+%% xypdf.dtx - Documented source code
+%% xypdf.ins - Installation script
+%% xypdf.pdf - Documentation (generated from xypdf.dtx)
+%%
+%% The files with the TeX code are generated by the following command:
+%%
+%% latex xypdf.ins
+%%
+%% This generates the files xypdf.tex, xypdf-co.tex, xypdf-cu.tex,
+%% xypdf-fr.tex, xypdf-li.tex and xypdf-ro.tex.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% The xypdf package improves the output quality of the Xy-pic package when
+%% PDF documents are generated. It produces generic PDF code for graphical
+%% elements like lines, curves and circles instead of approximating these
+%% elements with glyphs in special fonts as the original Xy-pic package does.
+%% The xypdf package works with both TeX and LaTeX in the occurrences of
+%% pdfTeX, XeTeX and eTeX with dvipdfm(x) to generate PDF files. It is being
+%% integrated and distributed together with Xy-pic, starting with Xy-pic
+%% version 3.8.
+%%
+%% The copyright for the xypdf package is by its author, Daniel Müllner
+%% (Muellner, M\"ullner).
+%%
+\xyrequire{curve}\xycatcodes
+\expandafter\let\csname xypdf-fr@loaded\endcsname\@empty
+\newcommand*\xP@framedrop[1]{\expandafter\frmDrop@\expandafter{\expandafter\def\expandafter\prevEdge@@\expandafter{\prevEdge@@}\setboxz@h{#1\frmradius@@}\styledboxz@}}
+\xP@hook{frame}{frm{-}}
+\expandafter\newcommand\expandafter*\csname xP@frm{-}\endcsname{\xP@framedrop\xP@solidframe
+}
+\newcommand*\xP@solidframe[1]{\R@#1\relax
+\xP@setsolidpat
+\let\xP@fillorstroke\xP@stroke
+\xP@frameifnotzero\xP@oval
+}
+\newcommand*\xP@ifzerosize[2]{\@tempswafalse
+\ifdim\L@c=\z@\ifdim\R@c=\z@\ifdim\U@c=\z@\ifdim\D@c=\z@
+\@tempswatrue
+\fi\fi\fi\fi
+\if@tempswa#1\else#2\fi
+}
+\newcommand*\xP@frameifnotzero[1]{\setboxz@h{\hskip\X@c\raise\Y@c\hbox{\xP@ifzerosize{}{#1}}}\wd\z@\z@\ht\z@\z@\dp\z@\z@
+\boxz@
+}
+\newcommand*\xP@oval{\hskip-\L@c
+\lower\D@c\hbox{\dimen@\dimexpr\L@c+\R@c\relax
+\dimen@ii\dimexpr\U@c+\D@c\relax
+\R@\xP@min\R@{.5\dimen@}\R@\xP@min\R@{.5\dimen@ii}\@tempdimb\dimexpr2\dimen@+2\dimen@ii-\R@*696621973/405764219\relax
+\ifdim\R@=\z@
+\xP@fillorstroke{0 0 \xP@coor\dimen@\dimen@ii re}\else
+\def\@tempa{*119763188/267309217}\xP@fillorstroke{\xP@dim\R@0 m \xP@dim{\R@\@tempa}0 0 \xP@dim{\R@\@tempa}0 \xP@dim\R@ c \ifdim2\R@=\dimen@ii\else
+0 \xP@dim{\dimen@ii-\R@}l \fi
+0 \xP@dim{\dimen@ii-\R@\@tempa}\xP@coor{\R@\@tempa}\dimen@ii
+\xP@coor\R@\dimen@ii c \ifdim2\R@=\dimen@\else
+\xP@coor{\dimen@-\R@}\dimen@ii l \fi
+\xP@coor{\dimen@-\R@\@tempa}\dimen@ii
+\xP@coor\dimen@{\dimen@ii-\R@\@tempa}\xP@coor\dimen@{\dimen@ii-\R@} c \ifdim2\R@=\dimen@ii\else
+\xP@coor\dimen@\R@ l \fi
+\xP@coor\dimen@{\R@\@tempa}\xP@dim{\dimen@-\R@\@tempa}0 \xP@dim{\dimen@-\R@}0 c h}\fi
+}}
+\xP@hook{frame}{frm[o]{-}}
+\expandafter\newcommand\expandafter*\csname xP@frm[o]{-}\endcsname{\xP@framedrop{\xP@ellipseframe\xP@setsolidpat}}
+\newcommand*\xP@ellipseframe[2]{\xP@getradii{#2}\xP@ifzerosize{}{\def\xP@fillorstroke{#1\xP@stroke}\setboxz@h{\hskip\X@c\raise\Y@c\hbox{\xP@framedellipse}}\wd\z@\z@\ht\z@\z@\dp\z@\z@
+\boxz@
+}}
+\xP@hook{frame}{frm{.}}
+\expandafter\newcommand\expandafter*\csname xP@frm{.}\endcsname{\xP@framedrop\xP@rectframedotted
+}
+\newcommand*\xP@rectframedotted[1]{\R@#1\relax
+\xP@frameifnotzero{\ifdim\R@=\z@
+\xP@dottedrect
+\else
+\xP@dottedoval
+\fi
+}}
+\newcommand*\xP@dottedrect{\hskip-\L@c
+\lower\D@c\hbox{\dimen@ii\dimexpr\U@c+\D@c\relax
+\@tempdimc\dimexpr\xP@preclw/-2\relax
+\@tempdimb\dimexpr\L@c+\R@c+\xP@preclw\relax
+\xP@contfalse
+\xP@setdottedpat
+\dimen@\dimexpr\@tempdimb+\@tempdima/2+\@tempdimc\relax
+\xP@stroke{\xP@dim\@tempdimc0 m \xP@dim\dimen@0 l \xP@coor\@tempdimc\dimen@ii m \xP@coor\dimen@\dimen@ii l}\let\xP@testcont\xP@alwaysconttrue
+\@tempdimb\dimen@ii
+\xP@setdottedpat
+\dimen@\dimexpr\L@c+\R@c\relax
+\advance\dimen@ii\dimexpr\@tempdimc-\@tempdima/2\relax
+\multiply\@tempdimc\m@ne
+\xP@stroke{0 \xP@dim\@tempdimc m 0 \xP@dim\dimen@ii l \xP@coor\dimen@\@tempdimc m \xP@coor\dimen@\dimen@ii l}}}
+\newcommand*\xP@dottedoval{\def\xP@fillorstroke{\xP@setcldottedpat\xP@stroke}\xP@oval
+}
+\xP@hook{frame}{frm[o]{.}}
+\expandafter\newcommand\expandafter*\csname xP@frm[o]{.}\endcsname{\xP@framedrop{\xP@ellipseframe\xP@setcldottedpat}}
+\xP@hook{frame}{frm{--}}
+\expandafter\newcommand\expandafter*\csname xP@frm{--}\endcsname{\xP@framedrop\xP@rectframedashed
+}
+\newcommand*\xP@rectframedashed[1]{\R@#1\relax
+\xP@frameifnotzero{\ifdim\R@=\z@
+\xP@dashedrect
+\else
+\xP@dashedoval
+\fi
+}}
+\newcommand*\xP@dashedrect{\hskip-\L@c
+\lower\D@c\hbox{\dimen@\dimexpr\L@c+\R@c\relax
+\dimen@ii\dimexpr\U@c+\D@c\relax
+\@tempdimb\dimen@
+\xP@contfalse
+\xP@setdashpat
+\xP@stroke{0 0 m \xP@dim\dimen@0 l 0 \xP@dim\dimen@ii m \xP@coor\dimen@\dimen@ii l}\@tempdimb\dimen@ii
+\xP@setdashpat
+\xP@stroke{0 0 m 0 \xP@dim\dimen@ii l \xP@dim\dimen@0 m \xP@coor\dimen@\dimen@ii l}}}
+\newcommand*\xP@dashedoval{\def\xP@fillorstroke{\xP@setcldashpat\xP@stroke}\xP@oval
+}
+\xP@hook{frame}{frm[o]{--}}
+\expandafter\newcommand\expandafter*\csname xP@frm[o]{--}\endcsname{\xP@framedrop{\xP@ellipseframe\xP@setcldashpat}}
+\xP@hook{frame}{frm{,}}
+\expandafter\newcommand\expandafter*\csname xP@frm{,}\endcsname{\xP@framedrop\xP@frameshadow
+}
+\newcommand*\xP@frameshadow[1]{\R@#1\relax
+\ifdim\R@=\z@\R@1.2pt\relax\fi
+\xP@frameifnotzero\xP@shadow
+}
+\newcommand*\xP@shadow{\hskip\dimexpr\R@c+\R@/2\relax
+\lower\dimexpr\D@c+\R@/2\relax\hbox{\def\xP@pattern{0 J 0 j []0 d}\edef\xP@lw{\xP@dim\R@}\xP@stroke{\xP@dim{\R@/2-\L@c-\R@c} 0 m 0 0 l 0 \xP@dim{\D@c+\U@c-\R@/2}l}}}
+\xP@hook{frame}{frm{o-}}
+\expandafter\newcommand\expandafter*\csname xP@frm{o-}\endcsname{\xP@framedrop\xP@roundedrectframe
+}
+\newcommand*\xP@roundedrectframe[1]{\R@#1\relax
+\ifdim\R@=\z@\R@\xydashl@\relax\fi
+\xP@frameifnotzero\xP@roundedrectangle
+}
+\newcommand*\xP@roundedrectangle{\dimen@\dimexpr\L@c+\R@c\relax
+\dimen@ii\dimexpr\U@c+\D@c\relax
+\R@\xP@min\R@{.5\dimen@}\R@\xP@min\R@{.5\dimen@ii}\hskip-\L@c
+\lower\D@c\hbox{\@tempdimb\dimexpr2\dimen@+2\dimen@ii-\R@*696621973/405764219\relax
+\def\@tempa{*119763188/267309217}\xP@setsolidpat
+\xP@stroke{\xP@dim\R@0 m \xP@dim{\R@\@tempa}0 0 \xP@dim{\R@\@tempa}0 \xP@dim\R@ c \ifdim2\R@=\dimen@ii\else
+0 \xP@dim{\dimen@ii-\R@}m \fi
+0 \xP@dim{\dimen@ii-\R@\@tempa}\xP@coor{\R@\@tempa}\dimen@ii
+\xP@coor\R@\dimen@ii c \ifdim2\R@=\dimen@\else
+\xP@coor{\dimen@-\R@}\dimen@ii m \fi
+\xP@coor{\dimen@-\R@\@tempa}\dimen@ii
+\xP@coor\dimen@{\dimen@ii-\R@\@tempa}\xP@coor\dimen@{\dimen@ii-\R@} c \ifdim2\R@=\dimen@ii\else
+\xP@coor\dimen@\R@ m \fi
+\xP@coor\dimen@{\R@\@tempa}\xP@dim{\dimen@-\R@\@tempa}0 \xP@dim{\dimen@-\R@}0 c}\xP@contfalse
+\@tempdimb\dimexpr\L@c+\R@c-2\R@\relax
+\ifdim\@tempdimb<\z@\@tempdimb\z@\fi
+\xP@setdashpat
+\ifdim\@tempdima>\z@
+\dimen@\dimexpr\@tempdimb+\R@-\@tempdima/2\relax
+\dimen@ii\dimexpr\U@c+\D@c\relax
+\xP@stroke{\xP@dim{\R@+\@tempdima}0 m \xP@dim\dimen@ 0 l \xP@coor{\R@+\@tempdima}\dimen@ii m \xP@coor\dimen@\dimen@ii l}\fi
+\@tempdimb\dimexpr\U@c+\D@c-2\R@\relax
+\ifdim\@tempdimb<\z@\@tempdimb\z@\fi
+\xP@setdashpat
+\ifdim\@tempdima>\z@
+\dimen@\dimexpr\L@c+\R@c\relax
+\dimen@ii\dimexpr\@tempdimb+\R@-\@tempdima/2\relax
+\xP@stroke{0 \xP@dim{\R@+\@tempdima}m 0 \xP@dim\dimen@ii l \xP@coor\dimen@{\R@+\@tempdima}m \xP@coor\dimen@\dimen@ii l}\fi
+}}
+\xP@hook{frame}{frm{=}}
+\expandafter\newcommand\expandafter*\csname xP@frm{=}\endcsname{\xP@framedrop\xP@dsframe
+}
+\newcommand*\xP@dsframe[1]{\R@#1\relax
+\xP@frameifnotzero\xP@dsoval
+}
+\newcommand*\xP@dsoval{\dimen@\dimexpr(\L@c+\R@c)/2\relax
+\ifdim\dimen@<\xydashh@\dimen@\xydashh@\fi
+\dimen@ii\dimexpr(\U@c+\D@c)/2\relax
+\ifdim\dimen@ii<\xydashh@\dimen@ii\xydashh@\fi
+\R@\xP@min\R@\dimen@
+\R@\xP@min\R@\dimen@ii
+\xP@setsolidpat
+\let\xP@fillorstroke\xP@stroke
+\xP@oval
+\hskip\L@c
+\advance\L@c-\xydashh@
+\advance\R@c-\xydashh@
+\advance\U@c-\xydashh@
+\advance\D@c-\xydashh@
+\advance\R@-\xydashh@
+\ifdim\R@<\z@\R@\z@\fi
+\xP@oval
+}
+\xP@hook{frame}{frm[o]{=}}
+\expandafter\newcommand\expandafter*\csname xP@frm[o]{=}\endcsname{\xP@framedrop\xP@dsellframe
+}
+\xP@hook{frame}{frm{ee}}
+\expandafter\newcommand\expandafter*\csname xP@frm{ee}\endcsname{\xP@framedrop\xP@dsellframe
+}
+\newcommand*\xP@dsellframe[1]{\xP@getradii{#1}\xP@frameifnotzero\xP@dsellipse
+}
+\@ifdefinable\xP@temppath\relax
+\newcommand*\xP@dsellipse{\hskip\dimexpr(\R@c-\L@c)/2\relax
+\lower\dimexpr(\D@c-\U@c)/2\relax
+\hbox{\advance\A@-\xydashh@
+\advance\B@-\xydashh@
+\ifdim\A@<\z@\A@\z@\fi
+\ifdim\B@<\z@\B@\z@\fi
+\def\xP@fillorstroke{\edef\xP@temppath}\xP@ellipse@
+\xP@inibigdim
+\let\@tempa\xydashh@
+\xP@offsetellipse
+\xP@setsolidpat
+\xP@stroke{\xP@temppath\space\the\@temptokena}}}
+\newcommand*\xP@offsetellipse{\xP@movetotrue
+\@temptokena{}\xP@offsetelliptseg\A@\z@\A@{\B@*173517671/654249180}{\A@*554561898/619869377}{\B@*34221476/65864945}{\A@*543339720/768398401}{\B@*543339720/768398401}\xP@offsetelliptseg{\A@*543339720/768398401}{\B@*543339720/768398401}{\A@*34221476/65864945}{\B@*554561898/619869377}{\A@*173517671/654249180}\B@\z@\B@
+\xP@mirrorpath
+}
+\newcommand*\xP@mirrorpath{\edef\@tempa{\the\@temptokena\relax\space\space\space\space}\let\@tempb\@empty
+\let\@tempc\@empty
+\expandafter\xP@mirrorpath@\@tempa
+}
+\@ifdefinable\xP@mirrorpath@\relax
+\def\xP@mirrorpath@#1 #2 #3 #4 #5 #6 #7 {\ifx\relax#4\xP@append\@temptokena{\@tempb\xP@minus#1 \xP@minus#2 #3 \@tempc h}\else
+\edef\@tempb{\xP@minus#6 #7 \xP@minus#4 #5 \xP@minus#1 #2 c \@tempb\if#3m\else\xP@minus#1 \xP@minus#2 #3 \fi\xP@minus#4 \xP@minus#5 \xP@minus#6 \xP@minus#7 }\edef\@tempc{#6 \xP@minus#7 #4 \xP@minus#5 #1 \xP@minus#2 c \@tempc}\expandafter\xP@mirrorpath@
+\fi
+}
+\@ifdefinable\xP@minus\relax
+\def\xP@minus#1 {\if-#1 \else\ifdim\dimexpr#1pt\relax=\z@\else-\fi#1 \fi}
+\newcommand*\xP@insertbefore[2]{{\edef\@tempa{#1{#2\the#1}}\expandafter}\@tempa}
+\newcommand*\xP@offsetelliptseg[8]{\X@p\dimexpr#1\relax
+\Y@p\dimexpr#2\relax
+\L@c\dimexpr#3\relax
+\U@c\dimexpr#4\relax
+\R@c\dimexpr#5\relax
+\D@c\dimexpr#6\relax
+\X@c\dimexpr#7\relax
+\Y@c\dimexpr#8\relax
+\xP@savepts
+\xP@a\z@
+\xP@c\xP@bigdim
+\xP@paintsolid@
+}
+\newcommand*\xP@getradii[1]{\edef\@tempa{#1}\expandafter\xP@getradii@\@tempa,\maxdimen,@}
+\@ifdefinable\xP@getradii@\relax
+\def\xP@getradii@#1,#2,#3@{\A@#1\relax
+\B@#2\relax
+\ifdim\B@=\maxdimen
+\A@\dimexpr(\L@c+\R@c)/2\relax
+\B@\dimexpr(\U@c+\D@c)/2\relax
+\fi
+}
+\xP@hook{frame}{frm{o}}
+\expandafter\newcommand\expandafter*\csname xP@frm{o}\endcsname{\xP@framedrop{\xP@circleframe\xP@setsolidpat}}
+\xP@hook{frame}{frm{-o}}
+\expandafter\newcommand\expandafter*\csname xP@frm{-o}\endcsname{\xP@framedrop{\xP@circleframe\xP@setcldashpat}}
+\xP@hook{frame}{frm{.o}}
+\expandafter\newcommand\expandafter*\csname xP@frm{.o}\endcsname{\xP@framedrop{\xP@circleframe\xP@setcldottedpat}}
+\newcommand*\xP@circleframe[2]{\R@#2\relax
+\def\xP@fillorstroke{#1\xP@stroke}\xP@ifzerosize{\ifdim\R@>\z@
+\xP@circleframe@
+\fi
+}{\ifdim\R@=\z@
+\A@\dimexpr(\L@c+\R@c)/2\relax
+\B@\dimexpr(\U@c+\D@c)/2\relax
+\R@\xP@max\A@\B@
+\fi
+\xP@circleframe@
+}}
+\newcommand*\xP@circleframe@{\setboxz@h{\hskip\X@c\raise\Y@c\hbox{\xP@circle}}\wd\z@\z@\ht\z@\z@\dp\z@\z@
+\boxz@
+}
+\xP@hook{frame}{frm{e}}
+\expandafter\newcommand\expandafter*\csname xP@frm{e}\endcsname{\xP@framedrop{\xP@ellipseframe\xP@setsolidpat}}
+\xP@hook{frame}{frm{-e}}
+\expandafter\newcommand\expandafter*\csname xP@frm{-e}\endcsname{\xP@framedrop{\xP@ellipseframe\xP@setcldashpat}}
+\xP@hook{frame}{frm{.e}}
+\expandafter\newcommand\expandafter*\csname xP@frm{.e}\endcsname{\xP@framedrop{\xP@ellipseframe\xP@setcldottedpat}}
+\xP@hook{frame}{frm2{.e}}
+\expandafter\newcommand\expandafter*\csname xP@frm2{.e}\endcsname{\xP@framedrop\xP@dsdottedellframe
+}
+\newcommand*\xP@dsdottedellframe[1]{\xP@getradii{#1}\xP@frameifnotzero\xP@dsdottedellipse
+}
+\newcommand*\xP@dsdottedellipse{\hskip\dimexpr(\R@c-\L@c)/2\relax
+\lower\dimexpr(\D@c-\U@c)/2\relax
+\hbox{\@tempdima.5\xydashh@\relax
+\advance\A@-\@tempdima
+\advance\B@-\@tempdima
+\ifdim\A@<\@tempdima\A@\@tempdima\fi
+\ifdim\B@<\@tempdima\B@\@tempdima\fi
+\let\xP@normalmult\@ne
+\xP@specialellipse{\xP@splinemultdotted\xP@doublestroke}}}
+\newcommand*\xP@specialellipse[1]{\def\@tempa{*147546029/267309217}\X@p\A@
+\Y@p\z@
+\L@c\A@
+\U@c\dimexpr\B@\@tempa\relax
+\R@c\dimexpr\A@\@tempa\relax
+\D@c\B@
+\X@c\z@
+\Y@c\B@
+\xP@bezierlength
+\let\xP@testcont\xP@alwaysconttrue
+#1\X@p\z@
+\Y@p\B@
+\L@c-\R@c
+\D@c\U@c
+\U@c\B@
+\R@c-\A@
+\X@c-\A@
+\Y@c\z@
+#1\X@p-\A@
+\Y@p\z@
+\R@c\L@c
+\L@c-\A@
+\U@c-\D@c
+\D@c-\B@
+\X@c\z@
+\Y@c-\B@
+#1\X@p\z@
+\Y@p-\B@
+\L@c-\R@c
+\D@c\U@c
+\U@c-\B@
+\R@c\A@
+\X@c\A@
+\Y@c\z@
+#1}
+\newcommand*\xP@alwaysconttrue[1]{\xP@splineconttrue}
+\xP@hook{frame}{frm2{-e}}
+\expandafter\newcommand\expandafter*\csname xP@frm2{-e}\endcsname{\xP@framedrop\xP@dsdashellframe
+}
+\newcommand*\xP@dsdashellframe[1]{\xP@getradii{#1}\xP@frameifnotzero\xP@dsdashellipse
+}
+\newcommand*\xP@dsdashellipse{\hskip\dimexpr(\R@c-\L@c)/2\relax
+\lower\dimexpr(\D@c-\U@c)/2\relax
+\hbox{\advance\A@-\xydashh@
+\advance\B@-\xydashh@
+\ifdim\A@<\z@\A@\z@\fi
+\ifdim\B@<\z@\B@\z@\fi
+\xP@specialellipse{\xP@splinemultdashed\xP@elldoublestroke}}}
+\newcommand*\xP@elldoublestroke{\z@,\xydashh@}
+\newcommand*\xP@fill[1]{\xP@literal{#1 f}}
+\newcommand*\xP@fillstroke[1]{\xP@literal{\xP@dim{\xP@preclw/2}w 1 j 0 G #1 b}}
+\newcommand*\xP@fillorstroke{}
+\xP@hook{frame}{frm{*}}
+\expandafter\newcommand\expandafter*\csname xP@frm{*}\endcsname{\xP@framedrop{\let\xP@fillorstroke\xP@fill\xP@framefill}}
+\xP@hook{frame}{frm{**}}
+\expandafter\newcommand\expandafter*\csname xP@frm{**}\endcsname{\xP@framedrop{\let\xP@fillorstroke\xP@fillstroke\xP@framefill}}
+\newcommand*\xP@framefill[1]{\R@#1\relax
+\xP@setsolidpat
+\setboxz@h{\hskip\X@c\raise\Y@c\hbox{\DN@{\rectangleEdge}\ifx\next@\prevEdge@@
+\DN@{\xP@oval}\else
+\DN@{\circleEdge}\ifx\next@\prevEdge@@
+\ifdim\R@=\z@
+\DN@{\xP@filledellipse}\else
+\DN@{\restR@max\xP@circle}\fi
+\else
+\ifdim\R@=\z@
+\DN@{\xP@oval}\else
+\DN@{\xP@circle}\fi
+\fi
+\fi
+\next@
+}}\wd\z@\z@\ht\z@\z@\dp\z@\z@
+\boxz@
+}
+\newcommand*\xP@circle{\xP@ellipse\R@\R@
+}
+\newcommand*\xP@filledellipse{\xP@ellipse{\dimexpr(\L@c+\R@c)/2\relax}{\dimexpr(\U@c+\D@c)/2\relax}}
+\newcommand*\xP@framedellipse{\xP@ellipse\A@\B@
+}
+\newcommand*\xP@ellipse[2]{\hskip\dimexpr(\R@c-\L@c)/2\relax
+\lower\dimexpr(\D@c-\U@c)/2\relax
+\hbox{\A@#1\relax
+\B@#2\relax
+\xP@ellipse@
+}}
+\newcommand*\xP@ellipse@{\X@p\dimexpr\A@*543339720/768398401\relax
+\Y@p\dimexpr\B@*543339720/768398401\relax
+\L@c\dimexpr\A@*34221476/65864945\relax
+\U@c\dimexpr\B@*554561898/619869377\relax
+\R@c\dimexpr\A@*173517671/654249180\relax
+\D@c\B@
+\X@c\z@
+\Y@c\B@
+\xP@bezierlength
+\@tempdima\@tempdimb
+\X@p\A@
+\Y@p\z@
+\L@c\A@
+\U@c\dimexpr\B@*173517671/654249180\relax
+\R@c\dimexpr\A@*554561898/619869377\relax
+\D@c\dimexpr\B@*34221476/65864945\relax
+\X@c\dimexpr\A@*543339720/768398401\relax
+\Y@c\dimexpr\B@*543339720/768398401\relax
+\xP@bezierlength
+\@tempdimb4\dimexpr\@tempdima+\@tempdimb\relax
+\edef\@tempa{\xP@dim\A@0 m
+\xP@coor\L@c\U@c
+\xP@coor\R@c\D@c
+\xP@coor\X@c\Y@c c \xP@coor{\A@*34221476/65864945}{\B@*554561898/619869377}\xP@coor{\A@*173517671/654249180}\B@
+0 \xP@dim\B@ c }\@temptokena\expandafter{\@tempa}\xP@mirrorpath
+\xP@fillorstroke{\the\@temptokena}}
+\xyendinput
+
+
+
+
+
+%%
+%% End of file `xypdf-fr.tex'.
diff --git a/macros/generic/diagrams/xypic/texinputs/xypdf-li.tex b/macros/generic/diagrams/xypic/texinputs/xypdf-li.tex
new file mode 100644
index 0000000000..5fc4de376b
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypdf-li.tex
@@ -0,0 +1,69 @@
+%%
+%% This is file `xypdf-li.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% xypdf.dtx (with options: `line')
+%%
+%% The xypdf package for TeX and LaTeX
+%% Copyright (c) 2010 by Daniel Müllner (M\"ullner)
+%% <http://math.stanford.edu/~muellner>
+%% --------------------------------------------------------------------------
+%%
+%% This program is free software: you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the Free
+%% Software Foundation, either version 2 of the License, or (at your option)
+%% any later version.
+%%
+%% This program is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% The GNU General Public License is available at
+%% <http://www.gnu.org/licenses/>.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% This file is part of the xypdf package for TeX and LaTeX2e. The xypdf
+%% package may be distributed and/or modified under the conditions of the
+%% GNU General Public License as published by the Free Software Foundation,
+%% either version 2 of the License, or (at your option) any later version.
+%% The distribution consists of the following files:
+%%
+%% xypdf.dtx - Documented source code
+%% xypdf.ins - Installation script
+%% xypdf.pdf - Documentation (generated from xypdf.dtx)
+%%
+%% The files with the TeX code are generated by the following command:
+%%
+%% latex xypdf.ins
+%%
+%% This generates the files xypdf.tex, xypdf-co.tex, xypdf-cu.tex,
+%% xypdf-fr.tex, xypdf-li.tex and xypdf-ro.tex.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% The xypdf package improves the output quality of the Xy-pic package when
+%% PDF documents are generated. It produces generic PDF code for graphical
+%% elements like lines, curves and circles instead of approximating these
+%% elements with glyphs in special fonts as the original Xy-pic package does.
+%% The xypdf package works with both TeX and LaTeX in the occurrences of
+%% pdfTeX, XeTeX and eTeX with dvipdfm(x) to generate PDF files. It is being
+%% integrated and distributed together with Xy-pic, starting with Xy-pic
+%% version 3.8.
+%%
+%% The copyright for the xypdf package is by its author, Daniel Müllner
+%% (Muellner, M\"ullner).
+%%
+\xycatcodes
+\expandafter\let\csname xypdf-li@loaded\endcsname\@empty
+\xyendinput
+
+
+
+
+
+%%
+%% End of file `xypdf-li.tex'.
diff --git a/macros/generic/diagrams/xypic/texinputs/xypdf-ro.tex b/macros/generic/diagrams/xypic/texinputs/xypdf-ro.tex
new file mode 100644
index 0000000000..d0bcf79638
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypdf-ro.tex
@@ -0,0 +1,133 @@
+%%
+%% This is file `xypdf-ro.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% xypdf.dtx (with options: `rotate')
+%%
+%% The xypdf package for TeX and LaTeX
+%% Copyright (c) 2010 by Daniel Müllner (M\"ullner)
+%% <http://math.stanford.edu/~muellner>
+%% --------------------------------------------------------------------------
+%%
+%% This program is free software: you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the Free
+%% Software Foundation, either version 2 of the License, or (at your option)
+%% any later version.
+%%
+%% This program is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% The GNU General Public License is available at
+%% <http://www.gnu.org/licenses/>.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% This file is part of the xypdf package for TeX and LaTeX2e. The xypdf
+%% package may be distributed and/or modified under the conditions of the
+%% GNU General Public License as published by the Free Software Foundation,
+%% either version 2 of the License, or (at your option) any later version.
+%% The distribution consists of the following files:
+%%
+%% xypdf.dtx - Documented source code
+%% xypdf.ins - Installation script
+%% xypdf.pdf - Documentation (generated from xypdf.dtx)
+%%
+%% The files with the TeX code are generated by the following command:
+%%
+%% latex xypdf.ins
+%%
+%% This generates the files xypdf.tex, xypdf-co.tex, xypdf-cu.tex,
+%% xypdf-fr.tex, xypdf-li.tex and xypdf-ro.tex.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% The xypdf package improves the output quality of the Xy-pic package when
+%% PDF documents are generated. It produces generic PDF code for graphical
+%% elements like lines, curves and circles instead of approximating these
+%% elements with glyphs in special fonts as the original Xy-pic package does.
+%% The xypdf package works with both TeX and LaTeX in the occurrences of
+%% pdfTeX, XeTeX and eTeX with dvipdfm(x) to generate PDF files. It is being
+%% integrated and distributed together with Xy-pic, starting with Xy-pic
+%% version 3.8.
+%%
+%% The copyright for the xypdf package is by its author, Daniel Müllner
+%% (Muellner, M\"ullner).
+%%
+\xycatcodes
+\expandafter\let\csname xypdf-ro@loaded\endcsname\@empty
+\xP@hook{rotate}{xyscale@@}
+\newcommand*\xP@xyscale@@[2]{\setboxz@h{\hskip\L@c
+\hskip-\R@p
+\lower\U@p\hbox{\xP@cm{#1}00{#2}{\raise\U@p\hb@xt@\z@{\hskip-\L@c\hskip\R@p\boxz@\hss}}}}\global\let\xP@lastpattern\@empty
+}
+\xP@hook{rotate}{xyRotate@@}
+\newcommand\xP@xyRotate@@{\xP@rotate@\xP@trigfromdir}
+\xP@hook{rotate}{doSpecialRotate@@}
+\@ifdefinable\xP@doSpecialRotate@@\relax
+\def\xP@doSpecialRotate@@#1@@{\xP@rotate@\xP@trig{#1}}
+\newcommand*\xP@rotate@[2]{\setboxz@h{#1{#2}\hskip\L@c
+\hskip-\R@p
+\lower\U@p\hbox{\xP@cm\cosDirection\sinDirection
+{\if-\sinDirection\else-\sinDirection\fi}\cosDirection
+{\raise\U@p\hb@xt@\z@{\hskip-\L@c\hskip\R@p\boxz@\hss}}}}\global\let\xP@lastpattern\@empty
+}
+\newcommand*\xP@trig[1]{\@tempdima\dimexpr#1pt\relax
+\@tempdimb\@tempdima
+\divide\@tempdimb23592960
+\advance\@tempdima-23592960\@tempdimb
+\ifdim\@tempdima<\z@\advance\@tempdima360pt\fi
+\@tempdimb\@tempdima
+\divide\@tempdimb5898240
+\ifcase\@tempdimb
+\xP@sinpoly
+\edef\sinDirection{\xP@EARPT\@tempdimb}\@tempdima\dimexpr90pt-\@tempdima\relax
+\xP@sinpoly
+\edef\cosDirection{\xP@EARPT\@tempdimb}\or
+\@tempdima\dimexpr180pt-\@tempdima\relax
+\xP@sinpoly
+\edef\sinDirection{\xP@EARPT\@tempdimb}\@tempdima\dimexpr90pt-\@tempdima\relax
+\xP@sinpoly
+\edef\cosDirection{\xP@EARPT\dimexpr-\@tempdimb\relax}\or
+\@tempdima\dimexpr\@tempdima-180pt\relax
+\xP@sinpoly
+\edef\sinDirection{\xP@EARPT\dimexpr-\@tempdimb\relax}\@tempdima\dimexpr90pt-\@tempdima\relax
+\xP@sinpoly
+\edef\cosDirection{\xP@EARPT\dimexpr-\@tempdimb\relax}\or
+\@tempdima\dimexpr360pt-\@tempdima\relax
+\xP@sinpoly
+\edef\sinDirection{\xP@EARPT\dimexpr-\@tempdimb\relax}\@tempdima\dimexpr90pt-\@tempdima\relax
+\xP@sinpoly
+\edef\cosDirection{\xP@EARPT\@tempdimb}\else
+\PackageError{xypdf}{Unexpected case in sin/cos calculation}{Feel free to contact the author of the xypdf package with a minimal example.}\fi
+}
+\newcommand*\xP@sinpoly{{\ifdim\@tempdima<49pt
+\ifdim\@tempdima<27pt
+\@tempdimb\dimexpr((\@tempdima*-529771058/16039085-1384933sp)*\@tempdima/268756075+10714164sp)*\@tempdima/613777813\relax
+\else
+\advance\@tempdima-27pt
+\@tempdimb\dimexpr(((\@tempdima*-743101305/20672414-238989613sp)*\@tempdima/80975565+42661556sp)*\@tempdima/622461739+2\p@)*157520747/693945047\relax
+\fi
+\else
+\ifdim\@tempdima<70pt
+\advance\@tempdima-49pt
+\@tempdimb\dimexpr(((\@tempdima*-348406699/107952940-55079229sp)*\@tempdima/866635628+408805sp)*\@tempdima/26926757+\p@)*135751711/179873976\relax
+\else
+\advance\@tempdima-70pt
+\@tempdimb\dimexpr(((\@tempdima*-1015850353/137849442-460519207sp)*\@tempdima/8742349+142263941sp)*\@tempdima/972432199+23\p@)*31253604/764969669\relax
+\fi
+\fi
+\global\dimen@i\@tempdimb
+}\@tempdimb\dimen@i
+}
+\xyendinput
+
+
+
+
+
+%%
+%% End of file `xypdf-ro.tex'.
diff --git a/macros/generic/diagrams/xypic/texinputs/xypdf.tex b/macros/generic/diagrams/xypic/texinputs/xypdf.tex
new file mode 100644
index 0000000000..176128f515
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypdf.tex
@@ -0,0 +1,522 @@
+%%
+%% This is file `xypdf.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% xypdf.dtx (with options: `basic')
+%%
+%% The xypdf package for TeX and LaTeX
+%% Copyright (c) 2010 by Daniel Müllner (M\"ullner)
+%% <http://math.stanford.edu/~muellner>
+%% --------------------------------------------------------------------------
+%%
+%% This program is free software: you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the Free
+%% Software Foundation, either version 2 of the License, or (at your option)
+%% any later version.
+%%
+%% This program is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% The GNU General Public License is available at
+%% <http://www.gnu.org/licenses/>.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% This file is part of the xypdf package for TeX and LaTeX2e. The xypdf
+%% package may be distributed and/or modified under the conditions of the
+%% GNU General Public License as published by the Free Software Foundation,
+%% either version 2 of the License, or (at your option) any later version.
+%% The distribution consists of the following files:
+%%
+%% xypdf.dtx - Documented source code
+%% xypdf.ins - Installation script
+%% xypdf.pdf - Documentation (generated from xypdf.dtx)
+%%
+%% The files with the TeX code are generated by the following command:
+%%
+%% latex xypdf.ins
+%%
+%% This generates the files xypdf.tex, xypdf-co.tex, xypdf-cu.tex,
+%% xypdf-fr.tex, xypdf-li.tex and xypdf-ro.tex.
+%%
+%% --------------------------------------------------------------------------
+%%
+%% The xypdf package improves the output quality of the Xy-pic package when
+%% PDF documents are generated. It produces generic PDF code for graphical
+%% elements like lines, curves and circles instead of approximating these
+%% elements with glyphs in special fonts as the original Xy-pic package does.
+%% The xypdf package works with both TeX and LaTeX in the occurrences of
+%% pdfTeX, XeTeX and eTeX with dvipdfm(x) to generate PDF files. It is being
+%% integrated and distributed together with Xy-pic, starting with Xy-pic
+%% version 3.8.
+%%
+%% The copyright for the xypdf package is by its author, Daniel Müllner
+%% (Muellner, M\"ullner).
+%%
+\ifx\xyloaded\undefined\input xy \fi
+\xyprovide{pdf}{PDF driver}{1.7}{Daniel M\"ullner\newline}{\url{http://math.stanford.edu/~muellner}}{}
+\ifx\makeatletter\undefined\input miniltx \fi
+\newcommand*\xypdfdate{2011/03/20}
+\newdriver{\xyaddsupport{pdf}\xP@pdf@on
+\xyaddsupport{color}\xP@color@on
+\xyaddsupport{curve}\xP@curve@on
+\xyaddsupport{frame}\xP@frame@on
+\xyaddsupport{rotate}\xP@rotate@on
+}
+\xyaddunsupport{pdf}\xP@pdf@off
+\xyaddunsupport{color}\xP@color@off
+\xyaddunsupport{curve}\xP@curve@off
+\xyaddunsupport{frame}\xP@frame@off
+\xyaddunsupport{rotate}\xP@rotate@off
+\newcommand*\xypdfon{\xP@pdf@on
+\xP@color@on
+\xP@curve@on
+\xP@frame@on
+\xP@line@on
+\xP@rotate@on
+}
+\newcommand*\xypdfoff{\xP@pdf@off
+\xP@color@off
+\xP@curve@off
+\xP@frame@off
+\xP@line@off
+\xP@rotate@off
+}
+\ifx\unexpanded\@undefined
+\PackageError{xypdf}{eTeX is needed for the xypdf package}{}
+\fi
+\newcommand*\xP@testpdfsave{\ifpdf
+\ifx\pdfsave\@undefined
+\PackageError{xypdf}{pdfTeX version 1.40.0 or higher is needed for the xypdf^^Jpackage with PDF output}{}\fi
+\fi
+\let\xP@testpdfsave\@undefined
+}
+\ifx\PackageWarning\@undefined
+\newcommand*\xP@warning[2]{{\newlinechar`\^^J\@warning{Package #1 Warning: #2\@empty.}}}
+\else
+\newcommand*\xP@warning{\PackageWarning}
+\fi
+\newcommand*\xP@pdf@on{}
+\newcommand*\xP@pdf@off{}
+\newcommand*\xP@color@on{}
+\newcommand*\xP@color@off{}
+\newcommand*\xP@curve@on{}
+\newcommand*\xP@curve@off{}
+\newcommand*\xP@frame@on{}
+\newcommand*\xP@frame@off{}
+\newcommand*\xP@line@on{}
+\newcommand*\xP@line@off{}
+\newcommand*\xP@rotate@on{}
+\newcommand*\xP@rotate@off{}
+\newcommand*\xP@hook[2]{\edef\next@{\let\expandafter\noexpand\csname xP@old@#2\endcsname
+\expandafter\noexpand\csname#2\endcsname}\next@
+\expandafter\edef\csname xP@#1@on\endcsname{\unexpanded\expandafter\expandafter\expandafter{\csname xP@#1@on\endcsname}\let\expandafter\noexpand\csname#2\endcsname
+\expandafter\noexpand\csname xP@#2\endcsname
+}\expandafter\edef\csname xP@#1@off\endcsname{\unexpanded\expandafter\expandafter\expandafter{\csname xP@#1@off\endcsname}\let\expandafter\noexpand\csname#2\endcsname
+\expandafter\noexpand\csname xP@old@#2\endcsname
+}}
+\newcommand*\xP@defpdfliteral{\ifpdf
+\newcommand*\xP@literal[1]{\pdfsave\pdfliteral{##1}\pdfrestore}
+\newcommand*\xP@cm[5]{\pdfsave
+\pdfsetmatrix{##1 ##2 ##3 ##4}##5\pdfrestore
+}
+\@ifundefined{@pdfcolorstack}{\def\@pdfcolorstack{\z@}}{}\newcommand*\xP@setcolor[3]{\pdfcolorstack\@pdfcolorstack push{##1 ##2 ##1 ##3}}
+\newcommand*\xP@resetcolor{\pdfcolorstack\@pdfcolorstack pop\relax}\else
+\newcommand*\xP@literal{\xP@warning{xypdf}{The produced DVI file is NOT PORTABLE. Convert it with^^Jdvipdfm(x) to the PDF format but do not expect the DVI file itself to be^^Jdisplayed correctly\@gobble}\global\let\xP@literal\xP@literal@
+\xP@literal
+}
+\newcommand*\xP@literal@[1]{\special{pdf:content ##1}}
+\newcommand*\xP@cm[5]{\special{pdf:btrans matrix ##1 ##2 ##3 ##4 0 0}##5\special{pdf:etrans}}
+\newcommand*\xP@setcolor[3]{\special{pdf:bcolor[##1]}}
+\newcommand*\xP@resetcolor{\special{pdf:ecolor}}\fi
+\let\xP@defpdfliteral\@undefined
+}
+\DN@{\@firstofone}
+\DNii@{xy}
+\ifx\@currname\nextii@
+\ifx\AtEndOfPackage\@undefined
+\else
+\DN@{\AtEndOfPackage}\fi
+\fi
+\next@
+{\RequirePackage{ifpdf}\xP@testpdfsave
+\xP@defpdfliteral}
+\ifx\pdfdecimaldigits\@undefined
+\newcommand*\xP@digits{2}
+\else
+\@ifdefinable\xP@digits\relax
+\xdef\xP@digits{\the\pdfdecimaldigits}
+\ifnum\pdfdecimaldigits<2
+\xP@warning{xypdf}{The precision in \string\pdfdecimaldigits\space is only \xP@digits\space
+decimals.^^JIt is recommended to set \string\pdfdecimaldigits\space to 2 or 3 for best output quality\@gobble}
+\fi
+\fi
+\newcommand*\xP@dim[1]{\expandafter\xP@removePT\the\dimexpr(#1)*800/803\relax\space}
+\newcommand*\xP@precdim[1]{\xP@EARPT\dimexpr(#1)*800/803\relax\space}
+\newcommand*\xP@EARPT{\expandafter\removePT@\the}
+\newcommand*\xP@coor[1]{\xP@dim{#1}\xP@dim}
+\@ifdefinable\xP@removePT\relax
+{\@makeother\p\@makeother\t\gdef\xP@removePT#1pt{\xP@removePT@#10000@}}
+\@ifdefinable\xP@removePT@\relax
+\ifcase\xP@digits
+\def\xP@removePT@#1.#2#3@{\ifnum#2<5
+#1\else
+\the\numexpr-\if-#1-\else-#1+\fi\@ne\relax
+\fi
+}
+\or
+\def\xP@removePT@#1#2.#3#4#5@{\ifnum#4<5
+#1#2\if#30\else
+.#3\fi
+\else
+\expandafter\xP@removePT
+\the\dimexpr#1#2.#3pt+\if#1--\fi.12pt\relax
+\fi
+}
+\or
+\def\xP@removePT@#1#2.#3#4#5#6@{\ifnum#5<5
+#1#2\if#40\if#30\else
+.#3\fi
+\else
+.#3#4\fi
+\else
+\expandafter\xP@removePT
+\the\dimexpr#1#2.#3#4pt+\if#1--\fi786sp\relax
+\fi
+}
+\or
+\def\xP@removePT@#1#2.#3#4#5#6#7@{\ifnum#6<5
+#1#2\if#50\if#40\if#30\else
+.#3\fi
+\else
+.#3#4\fi
+\else
+.#3#4#5\fi
+\else
+\expandafter\xP@removePT
+\the\dimexpr#1#2.#3#4#5pt+\if#1--\fi79sp\relax
+\fi
+}
+\or
+\def\xP@removePT@#1#2.#3#4#5#6#7#8@{\ifnum#7<5
+#1#2\if#60\if#50\if#40\if#30\else
+.#3\fi
+\else
+.#3#4\fi
+\else
+.#3#4#5\fi
+\else
+.#3#4#5#6\fi
+\else
+\expandafter\xP@removePT
+\the\dimexpr#1#2.#3#4#5#6pt+\if#1--\fi8sp\relax
+\fi
+}
+\else
+\let\xP@dim\xP@precdim
+\fi
+\AtBeginDocument{{\setboxz@h{$ $}}\@ifdefinable\xP@lw\relax
+\@ifdefinable\xP@preclw\relax
+\edef\xP@preclw{\the\fontdimen8\textfont3}\edef\xP@lw{\xP@dim\xP@preclw}\PackageInfo{xypdf}{Line width: \xP@preclw}}
+\xP@hook{pdf}{line@}
+\newcommand*\xP@line@{\setboxz@h{\xP@setsolidpat
+\xP@stroke{0 0 m \xP@coor{\cosDirection\xydashl@}{\sinDirection\xydashl@}l}}\U@c\sinDirection\xydashl@
+\D@c\z@
+\ifdim\U@c<\z@
+\multiply\U@c\m@ne
+\xP@swapdim\U@c\D@c
+\fi
+\ht\z@\U@c
+\dp\z@\D@c
+\R@c\cosDirection\xydashl@
+\L@c\z@
+\ifdim\R@c<\z@
+\multiply\R@c\m@ne
+\xP@swapdim\L@c\R@c
+\fi
+\hskip\L@c\boxz@\hskip\R@c
+\edef\tmp@{\egroup\U@c\the\U@c\D@c\the\D@c\L@c\the\L@c\R@c\the\R@c}\tmp@
+\Edge@c={\rectangleEdge}\edef\Upness@{\ifdim\z@<\U@c1\else0\fi}\edef\Leftness@{\ifdim\z@<\L@c1\else0\fi}\def\Drop@@{\styledboxz@}\def\Connect@@{\solid@}}
+\xP@hook{pdf}{solid@}
+\newcommand*\xP@solid@{\straight@\xP@solidSpread}
+\@ifdefinable\xP@solidSpread\relax
+\def\xP@solidSpread#1\repeat@{{\@tempswatrue
+\ifdim\X@p=\X@c
+\ifdim\Y@p=\Y@c
+\@tempswafalse
+\fi
+\fi
+\if@tempswa
+\xP@setsolidpat
+\xP@stroke{\xP@coor\X@p\Y@p m \xP@coor\X@c\Y@c l}\fi
+}}
+\newcommand*\xP@pattern{}
+\newcommand*\xP@setsolidpat{\def\xP@pattern{1 J 1 j []0 d}\global\let\xP@lastpattern\xP@solidmacro
+}
+\newcommand*\xP@stroke[1]{\xP@literal{\xP@lw w \xP@pattern\space#1 S}}
+\xP@hook{pdf}{dash@}
+\newcommand\xP@dash@{\line@\def\Connect@@{\straight@\xP@dashedSpread}}
+\@ifdefinable\xP@dashedSpread\relax
+\def\xP@dashedSpread#1\repeat@{{\xP@veclen
+\ifdim\@tempdimb>\z@
+\xP@setdashpat
+\xP@savec
+\xP@stroke{\xP@coor\X@p\Y@p m \xP@coor\X@c\Y@c l}\fi
+}}
+\newcommand*\xP@setdashpat{\xP@testcont\xP@dashmacro
+\ifxP@splinecont
+{\count@\numexpr2*((\@tempdimb-\xydashl@/3)/(2*\xydashl@))\relax
+\global\dimen@i
+\ifnum\count@>\z@
+\dimexpr\@tempdimb/\count@\relax
+\else
+\z@
+\fi
+}\@tempdima\dimen@i
+\edef\xP@pattern{1 J 1 j [\ifdim\@tempdima>\z@
+\xP@precdim\@tempdima]\xP@precdim\@tempdima
+\else
+]0 \fi
+d}\else
+\@tempdima
+\ifdim\@tempdimb>\xydashl@
+\dimexpr\@tempdimb/(2*((\@tempdimb+\xydashl@)/(2*\xydashl@))-1)\relax
+\else
+\z@
+\fi
+\edef\xP@pattern{1 J 1 j [\ifdim\@tempdima>\z@\xP@precdim\@tempdima\fi
+]0 d}\fi
+\global\let\xP@lastpattern\xP@dashmacro
+}
+\newcommand*\xP@setcldashpat{{\count@\numexpr2*((\@tempdimb-\xydashl@/3)/(2*\xydashl@))\relax
+\xdef\@gtempa{1 J 1 j [\ifnum\count@>\z@\xP@precdim{\@tempdimb/\count@}\fi]\ifnum\count@>\z@\xP@precdim{\@tempdimb*3/2/\count@}\else0 \fi d}}\edef\xP@pattern{\@gtempa}}
+\xP@hook{pdf}{point@}
+\newcommand*\xP@point@{\xP@zerodot\egroup\Invisible@false
+\Hidden@false\def\Leftness@{.5}\def\U@pness@{.5}\ctipEdge@
+\def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\xP@dottedSpread}}
+\newcommand*\xP@zerodot{\hb@xt@\z@{\hss
+\vbox to\z@{\vss\hrule\@width\xP@preclw\@height\xP@preclw\vss}\hss}}
+\@ifdefinable\xP@dottedSpread\relax
+\def\xP@dottedSpread#1\repeat@{{\xP@veclen
+\ifdim\@tempdimb>\z@
+\xP@setdottedpat
+\xP@savec
+\xP@stroke{\xP@coor\X@p\Y@p m \xP@coor\X@c\Y@c l}\fi
+}}
+\newcommand*\xP@setdottedpat{\xP@testcont\xP@dotmacro
+\ifxP@splinecont
+\@tempdima\dimexpr\@tempdimb/(\@tempdimb/131072+1)-\xP@preclw\relax
+\edef\xP@pattern{0 J [\ifdim\@tempdima>\z@
+\xP@precdim\xP@preclw\xP@precdim\@tempdima
+\fi
+]\xP@precdim{\xP@preclw+1sp}d}\else
+\advance\@tempdimb-\xP@preclw
+\ifdim\@tempdimb<\z@\@tempdimb\z@\fi
+\@tempdima\dimexpr\@tempdimb/(\@tempdimb/131072+1)-\xP@preclw\relax
+\edef\xP@pattern{0 J [\ifdim\@tempdima>\z@
+\xP@precdim\xP@preclw\xP@precdim\@tempdima
+\fi
+]0 d}\fi
+\global\let\xP@lastpattern\xP@dotmacro
+}
+\newcommand*\xP@setcldottedpat{\@tempdima\dimexpr\@tempdimb/(\@tempdimb/131072+1)-\xP@preclw\relax
+\edef\xP@pattern{0 J [\ifdim\@tempdima>\z@
+\xP@precdim\xP@preclw\xP@precdim\@tempdima
+\fi
+]\xP@precdim{\dimexpr\xP@preclw+\@tempdima/2\relax}d}}
+\newcommand*\xP@abs[1]{\ifdim#1<\z@\multiply#1\m@ne\fi}
+\newcommand*\xP@ifabsless[2]{\ifpdfabsdim#1<#2}
+\ifx\ifpdfabsdim\@undefined
+\renewcommand*\xP@ifabsless[2]{\ifdim\ifdim#1<\z@-\fi#1<\ifdim#2<\z@-\fi#2}
+\@gobble\fi
+\fi
+\newcommand*\xP@swapdim[2]{\@tempdima#1#1#2#2\@tempdima}
+\newcommand*\xP@swapnum[2]{\@tempcnta#1#1#2#2\@tempcnta}
+\newcommand*\xP@min[2]{\ifdim#1<#2#1\else#2\fi}
+\newcommand*\xP@max[2]{\ifdim#1>#2#1\else#2\fi}
+\newcommand*\xP@Max[2]{#1\ifdim#2<\z@\xP@max#1{-#2}\else\xP@max#1#2\fi}
+\newcommand*\xP@sqrt{\loop
+\@tempdimb\dimexpr(\@tempdimc+(\@tempdima*\p@/\@tempdimc))/2\relax
+\unless\ifdim\@tempdimc=\@tempdimb
+\@tempdimc\@tempdimb\relax
+\repeat
+}
+\newcommand*\xP@veclen{{\xP@veclen@
+\global\dimen@i\@tempdimb
+}\@tempdimb\dimen@i
+}
+\newcommand*\xP@veclen@{\xP@abs\d@Y
+\ifdim\d@X=\z@
+\@tempdimb\d@Y
+\else
+\xP@abs\d@X
+\ifdim\d@Y=\z@
+\@tempdimb\d@X
+\else
+\@tempswatrue
+\ifdim\d@X>5931641sp\relax\@tempswafalse\fi
+\ifdim\d@Y>5931641sp\relax\@tempswafalse\fi
+\if@tempswa
+\count@\@ne
+\loop
+\@tempdima\dimexpr\d@X*\d@X/\p@+\d@Y*\d@Y/\p@\relax
+\ifdim\@tempdima<4096pt
+\@tempcnta\ifdim\@tempdima<1024pt\ifdim\@tempdima<256pt8\else4\fi\else\tw@\fi
+\multiply\d@X\@tempcnta
+\multiply\d@Y\@tempcnta
+\multiply\count@\@tempcnta
+\repeat
+\@tempdimc\dimexpr(\d@X+\d@Y)*3/4\relax
+\xP@sqrt
+\@tempdimb\dimexpr\@tempdimb/\count@\relax
+\else
+\ifdim\d@X>83042982sp\relax\@tempswatrue\fi
+\ifdim\d@Y>83042982sp\relax\@tempswatrue\fi
+\if@tempswa
+\@tempdima\dimexpr\d@X/182*\d@X/11927552+\d@Y/182*\d@Y/11927552\relax
+\@tempdimc\dimexpr(\d@X+\d@Y)*3/728\relax
+\xP@sqrt
+\multiply\@tempdimb182\relax
+\else
+\@tempdima\dimexpr\d@X*\d@X/12845056+\d@Y*\d@Y/12845056\relax
+\@tempdimc\dimexpr(\d@X+\d@Y)*3/56\relax
+\xP@sqrt
+\multiply\@tempdimb14\relax
+\fi
+\fi
+\fi
+\fi
+}
+\xP@hook{pdf}{squiggledSpread@}
+\@ifdefinable\xP@squiggledSpread@\relax
+\def\xP@squiggledSpread@#1\repeat@{{\xP@veclen
+\ifdim\@tempdimb>\z@
+\edef\@tempa{\xP@coor\X@p\Y@p m }\toks@\expandafter{\@tempa}\@tempcnta\numexpr\@tempdimb/\xybsqll@\relax
+\ifnum\@tempcnta<\tw@\@tempcnta\tw@\fi
+\@tempdima\dimexpr\d@X/\@tempcnta\relax
+\@tempdimc\dimexpr\d@Y/\@tempcnta\relax
+\xP@testcont\xP@oddsquigglemacro
+\ifxP@splinecont
+\def\xP@squigsign{-}\else
+\let\xP@squigsign\@empty
+\fi
+\count@\z@
+\loop
+\xP@append\toks@{\xP@coor{\X@p+\d@X*\count@/\@tempcnta+(\@tempdima
+-\xP@squigsign\ifodd\count@-\fi\@tempdimc)*147546029/534618434}{\Y@p+\d@Y*\count@/\@tempcnta+(\@tempdimc
++\xP@squigsign\ifodd\count@-\fi\@tempdima)*147546029/534618434}}\advance\count@\@ne
+\xP@append\toks@{\xP@coor{\X@p+\d@X*\count@/\@tempcnta-(\@tempdima
+-\xP@squigsign\ifodd\count@-\fi\@tempdimc)*147546029/534618434}{\Y@p+\d@Y*\count@/\@tempcnta-(\@tempdimc
++\xP@squigsign\ifodd\count@-\fi\@tempdima)*147546029/534618434}\xP@coor{\X@p+\d@X*\count@/\@tempcnta}{\Y@p+\d@Y*\count@/\@tempcnta}c }\ifnum\count@<\@tempcnta
+\repeat
+\xP@setsolidpat
+\global\expandafter\let\expandafter\xP@lastpattern
+\ifodd\numexpr\count@\if\xP@squigsign-+1\fi\relax
+\xP@oddsquigglemacro
+\else
+\xP@evensquigglemacro
+\fi
+\xP@savec
+\xP@stroke{\the\toks@}\fi
+}}
+\newcommand*\xP@squigsign{}
+\newcommand*\xP@append[2]{{\edef\@tempa{#1{\the#1#2}}\expandafter}\@tempa
+}
+\xP@hook{pdf}{circhar@@}
+\newcommand*\xP@circhar@@[1]{\expandafter\xP@circhar@@@\ifcase#1 000{-173517671/654249180}{65307479/619869377}{-34221476/65864945}{225058681/768398401}{-543339720/768398401}\or
+0{-543339720/768398401}{181455824/967576667}{-554561898/619869377}{826676217/1870772527}{-1}{543339720/768398401}{-1}\or
+0{-1}{173517671/654249180}{-1}{34221476/65864945}{-554561898/619869377}{543339720/768398401}{-543339720/768398401}\or
+0{-543339720/768398401}{181455824/967576667}{-34221476/65864945}{225058681/768398401}{-173517671/654249180}{225058681/768398401}0\or
+0{543339720/768398401}{181455824/967576667}{34221476/65864945}{225058681/768398401}{173517671/654249180}{225058681/768398401}0\or
+01{173517671/654249180}1{34221476/65864945}{554561898/619869377}{543339720/768398401}{543339720/768398401}\or
+0{543339720/768398401}{181455824/967576667}{554561898/619869377}{826676217/1870772527}1{543339720/768398401}1\or
+000{173517671/654249180}{65307479/619869377}{34221476/65864945}{225058681/768398401}{543339720/768398401}\fi}
+\newcommand\xP@circhar@@@[8]{\xP@setsolidpat
+\xP@stroke{\xP@coor{\R@*#1}{\R@*#2}m
+\xP@coor{\R@*#3}{\R@*#4}\xP@coor{\R@*#5}{\R@*#6}\xP@coor{\R@*#7}{\R@*#8}c}\vrule width\z@ height\R@ depth\R@
+\kern\dimexpr\R@*#7\relax
+}
+\xP@hook{pdf}{cirrestrict@@}
+\newcommand*\xP@cirrestrict@@{\count@\z@\relax}
+\newcommand*\xP@trigfromdir[1]{{\Direction#1\relax
+\count@-\Direction
+\advance\count@4096
+\divide\count@2048
+\ifcase\count@
+\d@X\K@\p@
+\d@Y\numexpr\Direction-3*\K@\relax\p@
+\or
+\d@X\numexpr\Direction-\K@\relax\p@
+\d@Y-\K@\p@
+\or
+\d@X-\K@\p@
+\d@Y\numexpr-\Direction-\K@\relax\p@
+\or
+\d@X\numexpr-\Direction-3*\K@\relax\p@
+\d@Y\K@\p@
+\else
+\PackageError{xypdf}{Unexpected case in direction calculation}{Feel free to contact the author of the xypdf package with a minimal example.}\fi
+\xP@veclen
+\xdef\@gtempa{\def\noexpand\cosDirection{\xP@EARPT\dimexpr\d@X*\p@/\@tempdimb\relax}\def\noexpand\sinDirection{\xP@EARPT\dimexpr\d@Y*\p@/\@tempdimb\relax}}}\@gtempa
+}
+\outer\def\@tempa{\alloc@1\dimen\dimendef\insc@unt}
+\let\xP@newdimen\newdimen
+\ifx\newdimen\@tempa
+\def\xP@newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\fi
+\outer\def\@tempa#1{\count@=\escapechar\escapechar=-1
+\expandafter\expandafter\expandafter
+\def\@if#1{true}{\let#1=\iftrue}\expandafter\expandafter\expandafter
+\def\@if#1{false}{\let#1=\iffalse}\@if#1{false}\escapechar=\count@}
+\let\@tempa\relax
+\newcommand*\xP@lastX{}
+\newcommand*\xP@lastY{}
+\newcommand*\xP@lastpattern{}
+\newcommand*\xP@solidmacro{solid}
+\newcommand*\xP@dotmacro{dot}
+\newcommand*\xP@dashmacro{dash}
+\newcommand*\xP@evensquigglemacro{evensquiggle}
+\newcommand*\xP@oddsquigglemacro{oddsquiggle}
+\newcommand*\xP@brokensquigglemacro{brokensquiggle}
+\renewcommand*\xyinside@{\global\let\xP@lastpattern\@empty
+\saveXyStyle@ \aftergroup\xycheck@end
+\setboxz@h\bgroup
+\plainxy@
+\X@c=\z@\Y@c=\z@\czeroEdge@
+\X@p=\z@\Y@p=\z@\U@p=\z@\D@p=\z@\L@p=\z@\R@p=\z@\Edge@p={\zeroEdge}\X@min=\hsize\X@max=-\hsize\Y@min=\hsize\Y@max=-\hsize
+\mathsurround=\z@
+\expandafter\POS\everyxy@@
+}
+\newcommand*\xP@savec{\xdef\xP@lastX{\the\X@c}\xdef\xP@lastY{\the\Y@c}}
+\@ifdefinable\ifxP@splinecont\relax
+\@ifdefinable\xP@splineconttrue\relax
+\@ifdefinable\xP@splinecontfalse\relax
+\newif\ifxP@splinecont
+\newcommand*\xP@testcont[1]{\xP@splinecontfalse
+\ifxP@cont
+\ifx\xP@lastpattern#1\ifdim\xP@lastX=\X@p
+\ifdim\xP@lastY=\Y@p
+\xP@splineconttrue
+\fi
+\fi
+\fi
+\fi
+}
+\@ifdefinable\ifxP@cont\relax
+\@ifdefinable\xP@conttrue\relax
+\@ifdefinable\xP@contfalse\relax
+\newif\ifxP@cont
+\newcommand*\xypdfcontpatternon{\xP@conttrue}
+\newcommand*\xypdfcontpatternoff{\xP@contfalse}
+\xP@conttrue
+\let\@tempa\@undefined
+\let\nextii@\@undefined
+\DN@{\xywithoption{color}{\message{Xy-pic pdf driver: `color' extension support}\@ifundefined{xypdf-co@loaded}{\input xypdf-co\relax}{\message{not reloaded}}}\xywithoption{curve}{\message{Xy-pic pdf driver: `curve' extension support}\@ifundefined{xypdf-cu@loaded}{\input xypdf-cu\relax}{\message{not reloaded}}}\xywithoption{frame}{\message{Xy-pic pdf driver: `frame' extension support}\@ifundefined{xypdf-fr@loaded}{\input xypdf-fr\relax}{\message{not reloaded}}}\xywithoption{line}{\message{Xy-pic pdf driver: `line' extension support}\@ifundefined{xypdf-li@loaded}{\input xypdf-li\relax}{\message{not reloaded}}}\xywithoption{rotate}{\message{Xy-pic pdf driver: `rotate' extension support}\@ifundefined{xypdf-ro@loaded}{\input xypdf-ro\relax}{\message{not reloaded}}}}
+\next@
+\xyendinput
+%%
+%% End of file `xypdf.tex'.
diff --git a/macros/generic/diagrams/xypic/texinputs/xypic.sty b/macros/generic/diagrams/xypic/texinputs/xypic.sty
new file mode 100644
index 0000000000..befdb653b4
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypic.sty
@@ -0,0 +1,32 @@
+%% $Id: xypic.sty,v 3.4 2010/04/16 06:06:52 krisrose Exp $ -*-tex-*-
+%%
+%% LaTeX style option to load Xy-pic in version 2 compatibility mode.
+%% by Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is in the public domain. It is distributed in the hope that it
+%% will be useful, but WITHOUT ANY WARRANTY; without even the implied
+%% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+%%
+\input{xy.sty}
+\xyoption{v2}
+\catcode`\@=\xystycatcode
+\endinput
+
+% $Log: xypic.sty,v $
+% Revision 3.4 2010/04/16 06:06:52 krisrose
+% Preparing for a new release...
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
diff --git a/macros/generic/diagrams/xypic/texinputs/xypic.tex b/macros/generic/diagrams/xypic/texinputs/xypic.tex
new file mode 100644
index 0000000000..db0839b363
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypic.tex
@@ -0,0 +1,24 @@
+%% xypic.tex from $Id: xypic.doc,v 3.6 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic v2 compatibility loading.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\input xyv2
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xypicture.tex b/macros/generic/diagrams/xypic/texinputs/xypicture.tex
new file mode 100644
index 0000000000..d1d44c3f2d
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypicture.tex
@@ -0,0 +1,55 @@
+%% xypicture.tex from $Id: xypicture.doc,v 3.6 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``LaTeX Picture Mode'' option.
+%% Copyright (c) 199802011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1998 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{picture}{LaTeX Picture extension}{\stripRCS$Revision: 3.6 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.J.Watson Research Center, P.O.Box 704, Yorktown Heights, NY 10598, USA}
+\xynew@{dimen}\xyp@xsize
+\xynew@{dimen}\xyp@ysize
+\xylet@\xyp@arrow=\relax
+{\xyuncatcodes\makeatletter
+ \gdef\xyp@tail{}
+ \gdef\xyp@mid{-}
+ \gdef\xyp@head{>}
+}
+\xydef@\xyvector(#1,#2)#3{%
+ \xyp@xsize#3\relax
+ \ifnum#1<\z@\multiply\xyp@xsize\m@ne\fi
+ \xyp@ysize\xyp@xsize\relax
+ \ifnum#1=\z@
+ \xyp@xsize\z@
+ \ifnum#2<\z@\multiply\xyp@ysize\m@ne\fi
+ \else
+ \multiply\xyp@ysize#2\relax\divide\xyp@ysize#1\relax
+ \fi
+ \edef\xyp@arrow{\noexpand\arAT{\xyp@tail\xyp@mid\xyp@head}}%
+ \ifnum#1<\z@
+ \makebox(\xyp@xsize,\xyp@ysize){%
+ \begin{xy} 0;<\unitlength,\z@>:%
+ \xyp@arrow(\xyp@xsize,\xyp@ysize)
+ \end{xy}}%
+ \else
+ \xyp@arrow(\xyp@xsize,\xyp@ysize)\relax
+ \fi
+}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xypoly.tex b/macros/generic/diagrams/xypic/texinputs/xypoly.tex
new file mode 100644
index 0000000000..48c01fe501
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypoly.tex
@@ -0,0 +1,609 @@
+%% xypoly.tex from $Id: xypoly.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Polygon'' feature.
+%% Copyright (c) 1994-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this macro package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{poly}{Polygon feature}{\stripRCS$Revision: 3.11 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xyrequire{arrow}\xycatcodes
+\message{polygons,}
+\xynew@{count}\xypolynode@\xypolynode@=\m@ne
+\xydef@\xypolynode{\the\xypolynode@}
+\xydef@\xypolyNUMSIDES@{}
+\xydef@\xypolynum{\xypolyNUMSIDES@}
+\xydef@\xypolygon{\xypoly@}%
+\xydef@\xypoly@{%
+ \if\inxy@
+ \if\inxypoly@
+ \edef\next@{\noexpand\xy@@{\noexpand\nter@{\xypolynode@=\the\xypolynode@
+ \noexpand\def\noexpand\xypolyNUMSIDES@{\xypolyNUMSIDES@}}}}%
+ \else
+ \DN@{\xy@@{\def\inxypoly@{TT}%
+ \nter@{\def\inxypoly@{TF}\xypolynode@=\m@ne}}}%
+ \fi
+ \else
+ \if\inxypoly@
+ \edef\next@{\noexpand\xy
+ \noexpand\xy@@{\noexpand\nter@{\xypolyside=\the\xypolyside
+ \noexpand\def\noexpand\xypolyNUMSIDES@{\xypolyNUMSIDES@}\endxy}}}%
+ \else
+ \DN@{\xy \xy@@{\def\inxypoly@{TT}%
+ \nter@{\def\inxypoly@{TF}\xypolynode@=\m@ne \endxy}}}%
+ \fi
+ \fi
+ \next@ \count@=\z@ \xyFN@\xypoly@n}
+\xydef@\inxypoly@{TF}%
+\xydef@\xypoly@x{\xy@@{\leave@\leave@}}
+\xydef@\xypoly@n{%
+ \DN@##1{\multiply\count@10\relax \advance\count@##1\relax \xyFN@\xypoly@n}%
+ \ifx \space@\next
+ \ifnum\count@>\z@ \expandafter\DN@\space@{\xyFN@\xypoly@i}%
+ \else \expandafter\DN@\space@{\xyFN@\xypoly@n}\fi
+ \else\ifx 0\next \else\ifx 1\next \else\ifx 2\next \else\ifx 3\next
+ \else\ifx 4\next \else\ifx 5\next \else\ifx 6\next \else\ifx 7\next
+ \else\ifx 8\next \else\ifx 9\next
+ \else \let\next@=\xypoly@i \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\xydef@\xypoly@i{\edef\xypolyNUMSIDES@{\the\count@}\xyFN@\xygetpolyprefix@}
+\xydef@\xypolyPREFIX@{}%
+\xydef@\xypolyPREFIX@@{}%
+\xydef@\xypolyname{\xypolyPREFIX@}%
+\xydef@\xygetpolyprefix@{%
+ \ifx\next"\DN@"##1"{\def\xypolyPREFIX@@{##1}\expandafter
+ \edef\csname\xypolyPREFIX@@ NUMSIDES\endcsname{\xypolyNUMSIDES@}%
+ \xypolyprefix@@ }%
+ \else
+ \ifnum\xypolynode@<\z@\def\xypolyPREFIX@@{}%
+ \else
+ \edef\xypolyPREFIX@@{\xypolyPREFIX@\the\xypolynode@,}%
+ \fi \DN@{\xypolyprefix@@}%
+ \fi \next@ }
+\xydef@\xypolyprefix@@{%
+ \expandafter\toks@\expandafter{\addEQ@\POS"}%
+ \expandafter\addtotoks@\expandafter{\xypolyPREFIX@@0"\relax}%
+ \the\toks@
+ \ifnum\xypolynode@<\z@
+ \expandafter\def\expandafter\xypolyPREFIX@\expandafter{\xypolyPREFIX@@}%
+ \xy@@{\enter@{\xypolynode@=\the\xypolynode@
+ \noexpand\def\noexpand\xypolyPREFIX@{\xypolyPREFIX@}}\xypolynode@=\z@ }%
+ \else
+ \xy@@{\enter@{\xypolynode@=\the\xypolynode@
+ \noexpand\def\noexpand\xypolyPREFIX@{\xypolyPREFIX@}}\xypolynode@=\z@ }%
+ \expandafter\def\expandafter\xypolyPREFIX@\expandafter{\xypolyPREFIX@@}%
+ \fi
+ \xypoly@@i }
+\xydef@\xypoly@@i#1#{\begingroup
+ \DN@{#1}\ifx\next@\empty\else
+ \xywarning@{discarding unused tokens: #1}\fi \xypoly@@ }
+\xydef@\xypoly@@#1{\xypolydefaults@
+ \DN@{#1}\ifx\next@\empty\DN@{\xypoly@@@}%
+ \else \DN@{\xyFN@\xypolyparams@#1~!}\fi \next@}
+\xydef@\xypolydefaults@{\def\xypolySCALE@{}%
+ \def\xypolySPOKES@{{}}\def\xypostSPOKES@{}\let\xypreSPOKES@\relax
+ \def\xypolySIDES@{{-}}\def\xypostSIDES@{}\let\xypreSIDES@\relax
+ \def\xypolyVERTEX@{}\def\xypolyALIGN@{}}
+{\xyuncatcodes \gdef\next{*=0}}
+\xylet@\xypolynullvertex@=\next
+{\xyuncatcodes \gdef\next{*[o]}}
+\xylet@\xypolyvertex@=\next
+{\xyuncatcodes \gdef\next{*+[o]}}
+\xylet@\xypolywidevertex@=\next
+\xydef@\xypolyparams@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xypolyparams@}%
+ \else\ifx\next~\DN@~{\xyFN@\xypolywhich@}%
+ \else\ifx\next\bgroup\DN@##1~!{%
+ \ifx\empty\xypolyVERTEX@\expandafter
+ \def\expandafter\xypolyVERTEX@\expandafter{\xypolyvertex@{##1}}%
+ \else\xypolyVERTEXerror@{##1}\fi \xypoly@@@}%
+ \else\DN@##1~!{\DN@{##1}\ifx\next@\empty\else
+ \ifx\empty\xypolyVERTEX@\def\xypolyVERTEX@{*##1}%
+ \expandafter\checkpolytok@\expandafter\xypolyVERTEX@
+ \expandafter{\xypolynullvertex@}##1@@!\relax
+ \else\xypolyVERTEXerror@{##1}\fi\fi \xypoly@@@}%
+ \fi\fi\fi \next@ }
+\xydef@\xypolyVERTEXerror@#1{\xywarning@{%
+ vertex already specified, discarding unused tokens:#1}}
+\xydef@\xypolywhich@{%
+ \ifx\next!\DN@!{\xypoly@@@}%
+ \else \addLT@\ifx\next \addLT@\DN@{\xyFN@\xypoly@SPOKES@}%
+ \else \addGT@\ifx\next \addGT@\DN@{\xyFN@\xypoly@SIDES@}%
+ \else \addEQ@\ifx\next \addEQ@\DN@##1{%
+ \def\xypolyALIGN@{##1}\xyFN@\xypolyparams@ }%
+ \else \ifx :\next \DN@:##1{%
+ \def\xypolySCALE@{##1}\xyFN@\xypolyparams@ }%
+ \else\ifx\next*\DN@*##1{\expandafter
+ \def\expandafter\xypolyVERTEX@\expandafter{\xypolywidevertex@{##1}}%
+ \xyFN@\xypolyparams@}%
+ \fi\fi\fi\fi\fi\fi \next@ }
+\xydef@\xypoly@SPOKES@{%
+ \addLT@\ifx\next \addLT@\DN@##1{%
+ \def\xypreSPOKES@{##1}\def\xypolySPOKES@{}\xyFN@\xypolyparams@ }%
+ \else \addGT@\ifx\next \addGT@\DN@##1{%
+ \def\xypostSPOKES@{##1}\xyFN@\xypolyparams@ }%
+ \else \ifx\next\bgroup \DN@##1{%
+ \def\xypolySPOKES@{##1}\let\xypreSPOKES@\relax
+ \checkpolytok@\xypolySPOKES@{}##1@@!{\xyFN@\xypolyparams@}}%
+ \else \DN@##1{%
+ \let\xypreSPOKES@\relax \def\xypolySPOKES@{{##1}}\xyFN@\xypolyparams@}%
+ \fi\fi\fi \next@ }
+\xydef@\xypoly@SIDES@{%
+ \addLT@\ifx\next \addLT@\DN@##1{%
+ \def\xypreSIDES@{##1}\def\xypolySIDES@{}\xyFN@\xypolyparams@ }%
+ \else \addGT@\ifx\next \addGT@\DN@ ##1{%
+ \def\xypostSIDES@{##1}\xyFN@\xypolyparams@ }%
+ \else \ifx\next\bgroup \DN@##1{%
+ \def\xypolySIDES@{##1}\let\xypreSIDES@\relax
+ \checkpolytok@\xypolySIDES@{}##1@@!{\xyFN@\xypolyparams@}}%
+ \else \DN@##1{%
+ \let\xypreSIDES@\relax \def\xypolySIDES@{{##1}}\xyFN@\xypolyparams@}%
+ \fi\fi\fi \next@ }
+\xydef@\checkpolytok@#1#2#3#4@!#5{\DNii@{#1}\DN@{#4}%
+ \ifx\next@\empty\expandafter\def\nextii@{{}}%
+ \else\ifx#4@\expandafter\def\nextii@{#2{#3}}\fi\fi #5}
+\xydef@\xytrigerror@#1#2{\string#1 only works from 0 to 12}
+\xydef@\cosPIon#1{\ifcase#1 1\or-1\or0\or.5\or\halfroottwo\or
+ .809017\or\halfrootthree\or.900969\or.92388\or.939693\or.951057\or
+ .959493\or.965926\else1\xytrigerror@\cosPIon{#1}\fi}
+\xydef@\sinPIon#1{\ifcase#1 0\or0\or1\or\halfrootthree\or\halfroottwo\or
+ .587785\or.5\or.433884\or.382683\or.34202\or.309017\or
+ .281733\or.258819\else0\xytrigerror@\sinPIon{#1}\fi}
+\xydef@\cosTwoPIon#1{\ifcase#1 1\or1\or-1\or-\cosPIon3\or\cosPIon2\or
+ \sinPIon{10}\or\cosPIon3\or.62349\or\cosPIon4\or
+ .766044\or\cosPIon5\or.841254\or\cosPIon6%
+ \else1\xytrigerror@\cosTwoPIon{#1}\fi}
+\xydef@\sinTwoPIon#1{\ifcase#1 0\or0\or0\or-\sinPIon3\or\sinPIon2\or
+ \cosPIon{10}\or\sinPIon3\or.781831\or\sinPIon4\or
+ .642788\or\sinPIon5\or.540641\or\sinPIon6%
+ \else0\xytrigerror@\sinTwoPIon{#1}\fi}
+\xydef@\cosThreePIon#1{\ifcase#1 1\or-1\or0\or-1\or-\cosPIon4\or
+ -\cosPIon5\or\cosPIon2\or.222521\or\sinPIon8\or\cosPIon3\or
+ \sinTwoPIon5\or.654861\or\cosPIon4%
+ \else1\xytrigerror@\cosThreePIon{#1}\fi}
+\xydef@\sinThreePIon#1{\ifcase#1 0\or0\or1\or0\or\sinPIon4\or
+ \sinTwoPIon5\or\sinPIon2\or.974928\or\cosPIon8\or\sinPIon3\or
+ \cosTwoPIon5\or.75575\or\sinPIon4%
+ \else0\xytrigerror@\sinThreePIon{#1}\fi}
+\xydef@\cosFourPIon#1{\ifcase#1 1\or1\or1\or-\cosPIon3\or-1\or-\cosPIon5\or
+ \cosTwoPIon3\or-\cosThreePIon7\or0\or.173648\or\cosTwoPIon5\or
+ .415415\or\cosPIon3%
+ \else1\xytrigerror@\cosFourPIon{#1}\fi}
+\xydef@\sinFourPIon#1{\ifcase#1 0\or0\or0\or-\sinPIon3\or0\or\sinPIon5\or
+ \sinTwoPIon3\or\sinThreePIon7\or1\or.984808\or\sinTwoPIon5\or
+ .909632\or\sinPIon3%
+ \else0\xytrigerror@\sinFourPIon{#1}\fi}
+\xydef@\cosFivePIon#1{\ifcase#1 1\or-1\or0\or\cosPIon3\or-\cosPIon4\or
+ -1\or-\cosPIon6\or-\cosTwoPIon7\or-\cosThreePIon8\or-\cosFourPIon9\or
+ 0\or.142315\or\sinPIon{12}%
+ \else1\xytrigerror@\cosFivePIon{#1}\fi}
+\xydef@\sinFivePIon#1{\ifcase#1 0\or0\or1\or-\sinPIon3\or-\sinPIon4\or
+ 0\or\sinPIon6\or\sinTwoPIon7\or\sinThreePIon8\or\sinFourPIon9\or1\or
+ .989821\or\cosPIon{12}%
+ \else0\xytrigerror@\sinFivePIon{#1}\fi}
+\xydef@\xypoly@@@{\count@=\xypolyNUMSIDES@\relax
+ \ifx\xypolyALIGN@\empty
+ \ifnum\count@<\thr@@\relax\DN@{\xypolytoosmall@{\the\count@}}%
+ \else \advance\count@-\thr@@
+ \ifcase\count@ \DN@{\xyPolygon@@@\xytriangle@@}%
+ \or \DN@{\xyPolygon@@@\xysquare@@}%
+ \or \DN@{\xyPolygon@@@\xypentagon@@}%
+ \or \DN@{\xyPolygon@@@\xyhexagon@@}%
+ \or \DN@{\xyPolygon@@@\xyheptagon@@}%
+ \or \DN@{\xyPolygon@@@\xyoctagon@@}%
+ \or \DN@{\xyPolygon@@@\xynonagon@@}%
+ \or \DN@{\xyPolygon@@@\xydecagon@@}%
+ \or \DN@{\xyPolygon@@@\xyundecagon@@}%
+ \or \DN@{\xyPolygon@@@\xydodecagon@@}%
+ \else \DN@{\xylargePolygon@{0}{\xypolyNUMSIDES@}}%
+ \fi\fi
+ \else
+ \DN@{\xylargePolygon@{\xypolyALIGN@}{\xypolyNUMSIDES@}}%
+ \fi \next@ \xypoly@@@x}
+\xydef@\xypoly@@@x{\restore\xypoly@x}
+\xydef@\xypolytoosmall@#1{\xyerror@{#1 sides is too few for a polygon}}
+\xydef@\xyPolygon@@@#1{%
+ \toks@={\def\xypolyNUMSIDES@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyNUMSIDES@}\save}%
+ \ifx\empty\xypolySCALE@ \addtotoks@{\POS"}%
+ \else \addtotoks@{\POS;0;}%
+ \expandafter\addtotoks@\expandafter{\xypolySCALE@\relax\POS"}%
+ \fi
+ \expandafter\addtotoks@\expandafter{\xypolyPREFIX@0"\relax}%
+ \ifx\xypreSPOKES@\relax
+ \addtotoks@{#1{;}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyVERTEX@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyPREFIX@}}%
+ \DN@##1\next@{\def\tmp@{**\dir##1}}%
+ \expandafter\next@\expandafter{\xypolySPOKES@}\next@
+ \expandafter\addtotoks@\expandafter{\expandafter{\tmp@}}%
+ \else
+ \expandafter\DN@\expandafter{\expandafter\ar\xypreSPOKES@}%
+ \addtotoks@{#1}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyVERTEX@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyPREFIX@}{}}%
+ \fi
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypostSPOKES@}}%
+ \ifx\xypreSIDES@\relax
+ \addtotoks@{{;}}%
+ \DN@##1\next@{\def\tmp@{**\dir##1}}%
+ \expandafter\next@\expandafter{\xypolySIDES@}\next@
+ \expandafter\addtotoks@\expandafter{\expandafter{\tmp@}}%
+ \else
+ \expandafter\DN@\expandafter{\expandafter\ar\xypreSIDES@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}{}}%
+ \fi
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypostSIDES@}}%
+ \ifx\xypolyALIGN@\empty
+ \ifnum\xypolyNUMSIDES@>12\addtotoks@{{0}}\fi
+ \else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyALIGN@}}%
+ \fi
+ \expandafter\DN@\expandafter{\expandafter\endgroup\the\toks@ }%
+ \next@}
+\xydef@\xytriangle@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(0,1)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(-\cosPIon6, -.5)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon6,-.5)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#33"#6"#31"#7#8\relax }
+\xydef@\xysquare@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\halfroottwo,\halfroottwo)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(-\halfroottwo,\halfroottwo)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\halfroottwo,\halfroottwo)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(-\halfroottwo,\halfroottwo)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#34"#6"#31"#7#8\relax }
+\xydef@\xypentagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\cosPIon{10},\sinPIon{10})#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(0,1)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\cosPIon{10},\sinPIon{10})#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon5,\cosPIon5)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon5,-\cosPIon5)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#35"#6"#31"#7#8\relax }
+\xydef@\xyhexagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(1,0)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(.5,\halfrootthree)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-.5,\halfrootthree)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(1,0)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(.5,\halfrootthree)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(-.5,\halfrootthree)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#36"#6"#31"#7#8\relax }
+\xydef@\xyheptagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\sinTwoPIon7,\cosTwoPIon7)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(0,1)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinTwoPIon7,\cosTwoPIon7)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinThreePIon7,\cosThreePIon7)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon7,\cosPIon7)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon7,-\cosPIon7)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinThreePIon7,-\cosThreePIon7)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#37"#6"#31"#7#8\relax }
+\xydef@\xyoctagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\cosPIon8,\sinPIon8)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\sinPIon8,\cosPIon8)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon8,-\cosPIon8)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon8,-\sinPIon8)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon8,\sinPIon8)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon8,\cosPIon8)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon8,-\cosPIon8)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon8,-\sinPIon8)#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#38"#6"#31"#7#8\relax }
+\xydef@\xynonagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\sinFourPIon9,\cosFourPIon9)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\sinTwoPIon9,\cosTwoPIon9)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(0,1)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinTwoPIon9,\cosTwoPIon9)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinFourPIon9,\cosFourPIon9)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon6,\sinPIon6)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon9,\cosPIon9)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon9,-\cosPIon9)#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon6,-\sinPIon6)#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#39"#6"#31"#7#8\relax }
+\xydef@\xydecagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(1,0)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\cosPIon5,\sinPIon5)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{10},\cosPIon{10})#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{10},-\cosPIon{10})#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon5,-\sinPIon5)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(1,0)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon5,\sinPIon5)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{10},\cosPIon{10})#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{10},-\cosPIon{10})#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon5,-\sinPIon5)#2="#310"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#39"#6"#310"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#310"#6"#31"#7#8\relax }
+\xydef@\xyundecagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\sinFourPIon{11},\cosFourPIon{11})#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\sinTwoPIon{11},\cosTwoPIon{11})#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(0,1)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinTwoPIon{11},\cosTwoPIon{11})#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinFourPIon{11},\cosFourPIon{11})#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinFivePIon{11},\cosFivePIon{11})#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinThreePIon{11},\cosThreePIon{11})#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{11},\cosPIon{11})#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{11},-\cosPIon{11})#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinThreePIon{11},-\cosThreePIon{11})#2="#310"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#39"#6"#310"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinFivePIon{11},-\cosFivePIon{11})#2="#311"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#310"#6"#311"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#311"#6"#31"#7#8\relax }
+\xydef@\xydodecagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\cosPIon{12},\sinPIon{12})#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\halfroottwo,\halfroottwo)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{12},\cosPIon{12})#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{12},-\cosPIon{12})#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\halfroottwo,-\halfroottwo)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon{12},-\sinPIon{12})#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon{12},\sinPIon{12})#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\halfroottwo,\halfroottwo)#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{12},\cosPIon{12})#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{12},-\cosPIon{12})#2="#310"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#39"#6"#310"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\halfroottwo,-\halfroottwo)#2="#311"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#310"#6"#311"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon{12},-\sinPIon{12})#2="#312"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#311"#6"#312"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#312"#6"#31"#7#8\relax }
+\xydef@\xylargePolygon@#1#2{%
+ \dimen@=#1\p@
+ \xyPolygon@@@\xypolygon@@}
+\xydef@\xypolyrepeat@{\fi}
+\xydef@\xypolybody@{}
+\xydef@\xypolyiterate@{\xypolybody@\expandafter\xypolyiterate@\else\fi}
+\xydef@\xypolyloop@#1\xypolyrepeat@{\def\xypolybody@{#1}\xypolyiterate@}
+\xydef@\xypolygon@@#1#2#3#4#5#6#7#8#9{\save
+ \vfromcartesianangle@{#9}\edef\next@{\the\X@c,\the\Y@c\addGT@\empty}%
+ \xy@@{\xypolynode@=\@ne}%
+ \toks@={\POS#1"#30"+}%
+ \expandafter\expandafter\expandafter\addtotoks@\expandafter
+ \expandafter\expandafter{\addLT@\empty}%
+ \expandafter\addtotoks@\expandafter{\next@#2="#31"#4#5\relax}%
+ \xy@@\dontleave@ \the\toks@
+ \xypolyloop@
+ \dimen@=360\p@ \count@@=\xypolyNUMSIDES@\relax \advance\dimen@ .5\count@@
+ \divide\dimen@ \xypolyNUMSIDES@ \relax
+ \multiply\dimen@\xypolynode@ \relax \advance\dimen@ #9\p@
+ \edef\tmp@{%
+ \noexpand\vfromcartesianangle@{\expandafter\removePT@\the\dimen@}}%
+ \tmp@ \edef\next@{\the\X@c,\the\Y@c\addGT@\empty}%
+ \xy@@{\advance\xypolynode@\@ne}\count@=\xypolynode@
+ \toks@={\POS"#30"#1"#30"+}\edef\nextii@{\the\count@}%
+ \expandafter\expandafter\expandafter\addtotoks@\expandafter
+ \expandafter\expandafter{\addLT@\space}%
+ \expandafter\addtotoks@\expandafter{\next@#2="#3}%
+ \expandafter\addtotoks@\expandafter{\nextii@"#4#5\relax}%
+ \the\toks@
+ \count@=\xypolynode@ \xy@@{\advance\xypolynode@\m@ne}%
+ \toks@={\POS"#3}\expandafter\addtotoks@\expandafter{\the\xypolynode@"#6"#3}%
+ \expandafter\addtotoks@\expandafter{\the\count@"#7#8\relax}%
+ \the\toks@
+ \xy@@{\advance\xypolynode@\@ne}\count@=\xypolyNUMSIDES@ \relax
+ \ifnum\xypolynode@<\count@ \relax \xypolyrepeat@
+ \toks@={\POS"#3}%
+ \expandafter\addtotoks@\expandafter{\xypolyNUMSIDES@"#6"#31"#7#8\relax}%
+ \the\toks@ \restore }
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-c.tex b/macros/generic/diagrams/xypic/texinputs/xyps-c.tex
new file mode 100644
index 0000000000..e471ede76d
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-c.tex
@@ -0,0 +1,69 @@
+%% xyps-c.tex from $Id: xyps-c.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Colour extension'' PostScript backend support.
+%% Copyright (c) 1993-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-cloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-cloaded\endcsname=\empty \xycatcodes
+\expandafter\ifx \csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\xydef@\UsePScolor{\installPScolor@}
+\xydef@\NoPScolor{\UnloadColor@}
+\xydef@\installPScolor@{\installPSstyle@
+ \let\xymath@=\xyPSmath@ \let\xynomath@=\xyPSnomath@
+ \let\checkxyPScolor@=\checkxyPScolor@@
+ \let\xycolor@@=\xyPScolor@@
+ \xystandardcolors@
+ \xyuncatcodes }
+\xydef@\xyPSmath@{\hbox\bgroup\dimen@=.55ex \checkxyPScolor@ \xyinside@}
+\xydef@\xyPSnomath@{\hbox\bgroup\dimen@=\z@ \checkxyPScolor@ \xyinside@}
+\xydef@\checkxyPScolor@@{\xycolor@raw@@{}\let\checkxyPScolor@=\relax}
+\xylet@\checkxyPScolor@=\relax
+\xydef@\xyPSnewcolor@#1#2#3#4#5{%
+ \expandafter\DN@\expandafter{\csname shape [#1]\endcsname}%
+ \DNii@{\relax}\ifx\next@\nextii@\newxycolor{#1}{}\relax\fi
+ \DNii@{#4}\ifx\nextii@\empty
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPScolor@{#2 #3}}\else
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPScolor@{#4}}\fi
+ \ifx\nextii@\empty\expandafter\def\next@{\xyPSnotimplemented@@`#1'@@}%
+ \else
+ \edef\tmp@{\noexpand\let\expandafter\noexpand\next@
+ \expandafter\noexpand\nextii@}\expandafter\tmp@\fi }
+\xydef@\xyPScolor@{\ifPSspecials@\expandafter\xyPScolor@@
+ \else\expandafter\eat@\fi}
+\xydef@\xyPScolor@@#1{\bgroup \checkXyStyle@
+ \def\preStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpre@}}%
+ \def\postStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpost@}}%
+ \let\modPSboxz@=\modXYstyle@ \xyPS@color@@{#1}%
+ \toks@={\egroup\let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
+ \the\toks@ }
+\xydef@\xyPS@color@@#1{\xyPSsplitPS@{{#1}cc}{}}
+\xydef@\xycolor@raw@@#1{\PSraw@@{xyc}}
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-col.tex b/macros/generic/diagrams/xypic/texinputs/xyps-col.tex
new file mode 100644
index 0000000000..83413ae77e
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-col.tex
@@ -0,0 +1,97 @@
+%% xyps-col.tex from $Id: xyps-col.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Crayola colour names'' PostScript colour support.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyrequire{color}\xycatcodes
+\newxycolor@{GreenYellow}{0.15 0 0.69 0}{cmyk}{}{}%
+\newxycolor@{Yellow}{0 0 1. 0}{cmyk}{}{}%
+\newxycolor@{Goldenrod}{0 0.10 0.84 0}{cmyk}{}{}%
+\newxycolor@{Dandelion}{0 0.29 0.84 0}{cmyk}{}{}%
+\newxycolor@{Apricot}{0 0.32 0.52 0}{cmyk}{}{}%
+\newxycolor@{Peach}{0 0.50 0.70 0}{cmyk}{}{}%
+\newxycolor@{Melon}{0 0.46 0.50 0}{cmyk}{}{}%
+\newxycolor@{YellowOrange}{0 0.42 1. 0}{cmyk}{}{}%
+\newxycolor@{Orange}{0 0.61. 0.87 0}{cmyk}{}{}%
+\newxycolor@{BurntOrange}{0 0.51 1. 0}{cmyk}{}{}%
+\newxycolor@{Bittersweet}{0 0.75 1. 0.24}{cmyk}{}{}%
+\newxycolor@{RedOrange}{0 0.77 0.87 0}{cmyk}{}{}%
+\newxycolor@{Mahogany}{0 0.85 0.87 0.35}{cmyk}{}{}%
+\newxycolor@{Maroon}{0 0.87 0.68 0.32}{cmyk}{}{}%
+\newxycolor@{BrickRed}{0 0.89 0.94 0.28}{cmyk}{}{}%
+\newxycolor@{Red}{0 1. 1. 0}{cmyk}{}{}%
+\newxycolor@{OrangeRed}{0 1. 0.50 0}{cmyk}{}{}%
+\newxycolor@{RubineRed}{0 1. 0.13 0}{cmyk}{}{}%
+\newxycolor@{WildStrawberry}{0 0.96 0.39 0}{cmyk}{}{}%
+\newxycolor@{Salmon}{0 0.53 0.38 0}{cmyk}{}{}%
+\newxycolor@{CarnationPink}{0 0.63 0 0}{cmyk}{}{}%
+\newxycolor@{Magenta}{0 1. 0 0}{cmyk}{}{}%
+\newxycolor@{VioletRed}{0 0.81 0 0}{cmyk}{}{}%
+\newxycolor@{Rhodamine}{0 0.82 0 0}{cmyk}{}{}%
+\newxycolor@{Mulberry}{0.34 0.90 0 0.02}{cmyk}{}{}%
+\newxycolor@{RedViolet}{0.07 0.90 0 0.34}{cmyk}{}{}%
+\newxycolor@{Fuchsia}{0.47 0.91 0 0.08}{cmyk}{}{}%
+\newxycolor@{Lavender}{0 0.48 0 0}{cmyk}{}{}%
+\newxycolor@{Thistle}{0.12 0.59 0 0}{cmyk}{}{}%
+\newxycolor@{Orchid}{0.32 0.64 0 0}{cmyk}{}{}%
+\newxycolor@{DarkOrchid}{0.40 0.80 0.20 0}{cmyk}{}{}%
+\newxycolor@{Purple}{0.45 0.86 0 0}{cmyk}{}{}%
+\newxycolor@{Plum}{0.50 1. 0 0}{cmyk}{}{}%
+\newxycolor@{Violet}{0.79 0.88 0 0}{cmyk}{}{}%
+\newxycolor@{RoyalPurple}{0.75 0.90 0 0}{cmyk}{}{}%
+\newxycolor@{BlueViolet}{0.86 0.91 0 0.04}{cmyk}{}{}%
+\newxycolor@{Periwinkle}{0.57 0.55 0 0}{cmyk}{}{}%
+\newxycolor@{CadetBlue}{0.62 0.57 0.23 0}{cmyk}{}{}%
+\newxycolor@{CornflowerBlue}{0.65 0.13 0 0}{cmyk}{}{}%
+\newxycolor@{MidnightBlue}{0.98 0.13 0 0.43}{cmyk}{}{}%
+\newxycolor@{NavyBlue}{0.94 0.54 0 0}{cmyk}{}{}%
+\newxycolor@{RoyalBlue}{1. 0.50 0 0}{cmyk}{}{}%
+\newxycolor@{Blue}{1. 1. 0 0}{cmyk}{}{}%
+\newxycolor@{Cerulean}{0.94 0.11 0 0}{cmyk}{}{}%
+\newxycolor@{Cyan}{1. 0 0 0}{cmyk}{}{}%
+\newxycolor@{ProcessBlue}{0.96 0 0 0}{cmyk}{}{}%
+\newxycolor@{SkyBlue}{0.62 0 0.12 0}{cmyk}{}{}%
+\newxycolor@{Turquoise}{0.85 0 0.20 0}{cmyk}{}{}%
+\newxycolor@{TealBlue}{0.86 0 0.34 0.02}{cmyk}{}{}%
+\newxycolor@{Aquamarine}{0.82 0 0.30 0}{cmyk}{}{}%
+\newxycolor@{BlueGreen}{0.85 0 0.33 0}{cmyk}{}{}%
+\newxycolor@{Emerald}{1. 0 0.50 0}{cmyk}{}{}%
+\newxycolor@{JungleGreen}{0.99 0 0.52 0}{cmyk}{}{}%
+\newxycolor@{SeaGreen}{0.69 0 0.50 0}{cmyk}{}{}%
+\newxycolor@{Green}{1. 0 1. 0}{cmyk}{}{}%
+\newxycolor@{ForestGreen}{0.91 0 0.88 0.12}{cmyk}{}{}%
+\newxycolor@{PineGreen}{0.92 0 0.59 0.25}{cmyk}{}{}%
+\newxycolor@{LimeGreen}{0.50 0 1. 0}{cmyk}{}{}%
+\newxycolor@{YellowGreen}{0.44 0 0.74 0}{cmyk}{}{}%
+\newxycolor@{SpringGreen}{0.26 0 0.76 0}{cmyk}{}{}%
+\newxycolor@{OliveGreen}{0.64 0 0.95 0.40}{cmyk}{}{}%
+\newxycolor@{RawSienna}{0 0.72 1. 0.45}{cmyk}{}{}%
+\newxycolor@{Sepia}{0 0.83 1. 0.70}{cmyk}{}{}%
+\newxycolor@{Brown}{0 0.81 1. 0.60}{cmyk}{}{}%
+\newxycolor@{Tan}{0.14 0.42 0.56 0}{cmyk}{}{}%
+\newxycolor@{Gray}{0 0 0 0.50}{cmyk}{}{}%
+\newxycolor@{Black}{0 0 0 1.}{cmyk}{}{}%
+\newxycolor@{White}{0 0 0 0}{cmyk}{}{}%
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-f.tex b/macros/generic/diagrams/xypic/texinputs/xyps-f.tex
new file mode 100644
index 0000000000..83b5766591
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-f.tex
@@ -0,0 +1,127 @@
+%% xyps-f.tex from $Id: xyps-f.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Frame extension'' PostScript backend support.
+%% Copyright (c) 1995-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-floaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-floaded\endcsname=\empty \xycatcodes
+\xydef@\installPSframes@{%
+ \let\framed@body@@=\xyPSframed@body@
+ \let\circled@x@@=\xyPScircled@x@
+ \let\ellipsed@x@@=\xyPSellipsed@x@
+ \installPSfills@
+ \xyuncatcodes}
+\xydef@\UsePSframes{\installPSframes@}
+\xydef@\NoPSframes{\UnloadFrames@}
+\xydef@\xyPSframed@body@{\DN@{\framed@body@}%
+ \ifx\framehfill\frm@solidh@@
+ \DN@{\xyPSframed@oval@\xyPSoval@Special}%
+ \else\ifdim\R@=\z@\else
+ \ifx\framehfill\frm@dashh@@
+ \DN@{\xyPSframed@oval@\xyPSdashoval@Special}%
+ \else\ifx\framehfill\frm@doth@@
+ \DN@{\xyPSframed@oval@\xyPSdotoval@Special}%
+ \fi\fi
+ \fi\fi \next@ }
+\xydef@\xyPSframed@oval@#1{\vglue\U@c
+ \hbox{\hglue\L@c\xypsoval@#1\hglue\R@c}\vglue\D@c}
+\xydef@\xyPScircled@x@{\DN@{\xyPScircled@x@@\xyPScirc@Special}%
+ \ifx\framehfill\frm@doth@@
+ \DN@{\xyPScircled@x@@\xyPSdotcirc@Special}%
+ \else\ifx\framehfill\frm@dashh@@
+ \DN@{\xyPScircled@x@@\xyPSdashcirc@Special}%
+ \fi\fi \next@ }
+\xydef@\xyPScircled@x@@#1{\vglue2\R@
+ \hbox{\hglue2\R@\xypscircle@#1\hglue2\R@}%
+ \vglue2\R@}
+\xydef@\xyPSellipsed@x@#1#2{%
+ \DN@{\xyPSellipsed@x@@\xyPScirc@Special}%
+ \ifx\framehfill\frm@doth@@
+ \DN@{\xyPSellipsed@x@@\xyPSdotcirc@Special}%
+ \else\ifx\framehfill\frm@dashh@@
+ \DN@{\xyPSellipsed@x@@\xyPSdashcirc@Special}%
+ \fi\fi \next@{#1}{#2}}
+\xydef@\xyPSellipsed@x@@#1#2#3{\vglue #3\vglue #3\relax
+ \hbox{\L@c = #2\relax \R@c=\L@c \D@c = #3\relax \U@c=\D@c
+ \hglue#2\hglue#2\relax\xypsellipse@#1\hglue#2\hglue#2\relax}%
+ \vglue #3\vglue #3\relax}
+\xydef@\xyPSdashhfill@{{\SemiDirectionChar=95 \Direction=3072 \xyPSdash@}}
+\xydef@\xyPSdashvfill@{{\SemiDirection=31 \Direction=1023 \xyPSdash@}}
+\xydef@\xypsoval@#1{%
+ \dimen@=\L@c \advance\dimen@\R@c
+ \dimen@ii=\U@c \advance\dimen@ii\D@c
+ \ifdim\dimen@ii<\dimen@ \relax \dimen@=\dimen@ii\fi \divide\dimen@\tw@
+ \ifdim\R@>\dimen@ \relax \R@=\dimen@ \fi
+ \D@c=-\D@c \L@c=-\L@c
+ \edef\tmp@{\expandafter\removePT@\the\R@
+ \space\expandafter\removePT@\the\R@c
+ \space\expandafter\removePT@\the\D@c
+ \space\expandafter\removePT@\the\L@c
+ \space\expandafter\removePT@\the\U@c }%
+ \expandafter#1\expandafter{\tmp@}}
+\xydef@\xypscircle@#1{\dimen@=\R@
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter#1\expandafter{\tmp@}}
+\xydef@\xypsellipse@#1{\edef\tmp@{%
+ \expandafter\removePT@\the\U@c \space
+ \expandafter\removePT@\the\D@c \space
+ \expandafter\removePT@\the\L@c \space
+ \expandafter\removePT@\the\R@c }%
+ \expandafter#1\expandafter{\tmp@}}
+\xydef@\xyPSoval@Special#1{\PSmacro@{#1 ov}}
+\xydef@\xyPScirc@Special#1{\PSmacro@{#1 ox}}
+\xydef@\xyPSdotcirc@Special#1{\PSmacro@{#1 ot}}
+\xydef@\xyPSdashcirc@Special#1{\PSmacro@{#1 od}}
+\xydef@\xyPSdotoval@Special#1{\PSmacro@{#1 vt}}
+\xydef@\xyPSdashoval@Special#1{\PSmacro@{#1 vd}}
+\xydef@\xyPSfilledRegion#1#2{\setboxz@h{\lower\D@c\vbox{%
+ \vglue\U@c\hbox{#1#2\empty\hglue\L@c\hglue\R@c}\vglue\D@c}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+\xydef@\filledRectangle@PS{%
+ \xyPSfilledRegion{\xypsoval@\xyPSfilloval@Special}}
+\xydef@\filledCircle@PS#1{{\R@c=\R@ \L@c=\R@ \U@c=\R@ \D@c=\R@
+ \xyPSfilledRegion{\xypscircle@\xyPSfillcirc@Special}#1}}
+\xydef@\filledEllipse@PS{%
+ \xyPSfilledRegion{\xypsellipse@\xyPSfillellipse@Special}}
+\xydef@\filledOval@PS{%
+ \xyPSfilledRegion{\xypsoval@\xyPSfilloval@Special}}
+\xydef@\frame@emph@PS#1{\filled@{#1}\relax}
+\xydef@\installPSfills@{%
+ \let\frame@emph@@=\frame@emph@PS
+ \let\filledRectangle@@=\filledRectangle@PS
+ \let\filledOval@@=\filledOval@PS
+ \let\filledCircle@@=\filledCircle@PS
+ \let\filledEllipse@@=\filledEllipse@PS
+}
+\xydef@\xyPSfilloval@Special#1#2{%
+ \ifx#2\relax\PSmacro@{#1 sfo}%
+ \else\PSmacro@{#1 fo}\fi}
+\xydef@\xyPSfillcirc@Special#1#2{%
+ \ifx#2\relax\PSmacro@{#1 sfc}%
+ \else\PSmacro@{#1 fc}\fi}
+\xydef@\xyPSfillellipse@Special#1#2{%
+ \ifx#2\relax\PSmacro@{#1 sfe}%
+ \else\PSmacro@{#1 fe}\fi}
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-l.tex b/macros/generic/diagrams/xypic/texinputs/xyps-l.tex
new file mode 100644
index 0000000000..4220082f6d
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-l.tex
@@ -0,0 +1,68 @@
+%% xyps-l.tex from $Id: xyps-l.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Line extension'' PostScript backend support.
+%% Copyright (c) 1993-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-lloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-lloaded\endcsname=\empty \xycatcodes
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\xydef@\installPSline@{\installPSstyle@
+ \installPSlinestyles@ \installPSpolylines@ }
+\xydef@\UsePSlines{\installPSline@}
+\xydef@\NoPSlines{\UnloadLine@\relax}
+\xydef@\xyPSlineSpecial@#1{\addtostyletoks@{ #1 lw}}
+\xydef@\xyPScapSpecial@#1{\addtostyletoks@{ #1 lc}}
+\xydef@\xyPSjoinSpecial@#1{\addtostyletoks@{ #1 lj}}
+\xydef@\xyPSmiterSpecial@#1{\addtostyletoks@{ #1 ml}}
+\xydef@\installPSlinestyles@{%
+ \let\xylinewidth@@=\xylinewidth@
+ \let\transxyline@@=\transxyline@
+ \let\xylineSpecial@@=\xyPSlineSpecial@
+ \let\resetxyline@@=\resetxyline@i
+ \let\xy@linecap@@=\xy@linecap@
+ \let\xycapSpecial@@=\xyPScapSpecial@
+ \let\resetxylinecap@@=\resetxylinecap@i
+ \let\xy@linejoin@@=\xy@linejoin@
+ \let\xyjoinSpecial@@=\xyPSjoinSpecial@
+ \let\resetxylinejoin@@=\resetxylinejoin@i
+ \let\xy@linemiter@@=\xy@linemiter@
+ \let\xymiterSpecial@@=\xyPSmiterSpecial@
+ \let\resetxylinemiter@@=\resetxylinemiter@i
+}
+\xydef@\xypolylinePS@Special#1{\PSmacro@{#1 pl}}
+\xydef@\xypolydotPS@Special#1{\PSmacro@{#1 pt}}
+\xydef@\xypolydashPS@Special#1{\PSmacro@{#1 pd}}
+\xydef@\xypolyfillPS@Special#1{\PSmacro@{#1 pf}}
+\xydef@\xypolyeofillPS@Special#1{\PSmacro@{#1 pe}}
+\xydef@\installPSpolylines@{%
+ \let\xypolyline@Special=\xypolylinePS@Special
+ \let\xypolydot@Special=\xypolydotPS@Special
+ \let\xypolydash@Special=\xypolydashPS@Special
+ \let\xypolyfill@Special=\xypolyfillPS@Special
+ \let\xypolyeofill@Special=\xypolyeofillPS@Special
+ \let\xy@polystyle@@=\xy@polystyle@ }
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-pro.tex b/macros/generic/diagrams/xypic/texinputs/xyps-pro.tex
new file mode 100644
index 0000000000..17aa385d2f
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-pro.tex
@@ -0,0 +1,173 @@
+%% xyps-pro.tex from $Id: xyps-pro.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``PostScript Prolog'' for PostScript support.
+%% Copyright (c) 1993-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+\begingroup \xycatcodes%
+ \count@=\xydashl@\relax \count@@=\xydashw@\relax%
+ \let\firstPS@@=\relax%
+ \xyPSobeylines@@%
+\PSspecialdict@@{%
+/XYdict where not{250 dict /XYdict exch def
+ /xy{mark exch XYdict begin countdictstack /xylevel exch def
+ xyopen xycolor mark xypatt xypattern stopped xyclose end
+ cleartomark}def /xyg{gsave xy}def
+ /xyf{currentfont exch xy grestore setfont}def
+ /xycc{{xychgcol}xy}def /xyc{XYdict begin xycolstore end}def
+ /xyx{/xyYpos exch def /xyXpos exch def}def
+ /xyp{currentpoint xyx}def
+ /xyd{setupDirection XYdirection 2 mul}def
+ /xyct{currentpoint xyt 2 copy 6 2 roll}def
+ /xyt{xyXpos xyYpos 2 copy translate}def /xyr{neg rotate xynt}def
+ /xyrs{neg rotate 3 -1 roll sub neg 3 1 roll sub exch moveto xynt}def
+ /xynt{neg exch neg exch translate}def /xys{scale xynt}def
+ /xyss{scale 3 -1 roll sub neg 3 1 roll sub exch moveto xynt}def
+ /xyi{0 0 transform grestore gsave itransform}def
+ }if}%
+\tmp@false\def\do#1{\DN@{#1}\ifx\next@\nextii@\tmp@true\fi}%
+\DNii@{17oztex}\xydriversselected@@\iftmp@\PSspecialdict@@{%
+ /@boxy{prespecialVM restore grestore}def
+ /@eoxy{gsave /prespecialVM save def}def
+ }%
+\else \DNii@{oztex}\xydriversselected@@\iftmp@\PSspecialdict@@{%
+ /@oxy{prespecialVM restore grestore}def
+ /@oxy{gsave /prespecialVM save def}def
+ }\fi\fi%
+\PSdict@@{/XYdict where pop begin XYdict begin}%
+\PSdict@@{%
+ /xyopen{currentdict /XYddict known{XYddict null eq{}
+ {XYddict begin xyopen}ifelse}if}def
+ /xyclose{countdictstack -1 xylevel 1 add{pop end}for}def
+ /xychgcol{/xycolor exch def}def /xysetcol{xypush xychgcol}def
+}%
+\PSdict@@{%
+ /xypush{16 dict /XYddict exch def XYddict begin}def
+ /undef where
+ {pop /xypop{countdictstack xylevel eq{}{end}ifelse
+ currentdict /XYddict undef}def}
+ {/xypop{countdictstack xylevel eq{}{end}ifelse
+ /XYddict null def}def}ifelse
+ /pu /xypush load def /pp /xypop load def}%
+\PSdict@@{%
+ /xypspt{72 72.27 div dup scale}bind def /pscorrect{.85 mul}bind def
+ /gstartxy{gsave xypspt xywidth xycap xyjoin xymiter newpath 0 0 moveto}def
+ /xypath{gstartxy rmoveto counttomark 2 idiv -1 1{pop lineto}for}def
+ /xystroke{stroke grestore}bind def
+ /xyfill{closepath fill grestore}bind def
+ /xystfil{closepath gsave fill grestore 0 setgray
+ 0 setlinewidth xystroke}bind def
+ /xyeofill{closepath eofill grestore}bind def
+}%
+\PSdict@@{%
+ /xypolyline{xypath xystroke}def /xypolyfill{xypath xyfill}def
+ /xydotsep{/@ currentlinewidth 2 mul def}def
+ /xypolydot{xypath xydotsep [xydt @] 0 setdash xystroke}def
+ /xypolydash{xypath xydotsep [@ @] 0 setdash xystroke}def
+ /xypolyeofill{xypath xyeofill}def /pe /xypolyeofill load def
+ /pl /xypolyline load def /pf /xypolyfill load def
+ /pt /xypolydot load def /pd /xypolydash load def }%
+\PSdict@@{%
+ /arc4pop{arcto 4{pop}repeat}bind def
+ /xyoval{gstartxy oval closepath xystroke}def
+ /xycircle{gstartxy circle xystroke}def
+ /circle{dup 0 moveto 0 0 3 -1 roll 0 360 arc}def
+ /oval{newpath 2 copy exch 5 index add 2 div exch 3 copy 10 3 roll
+ moveto 1 index dup 5 1 roll 3 index 7 index arc4pop
+ dup dup 4 1 roll 4 index exch 6 index arc4pop
+ 1 index dup 8 1 roll 4 index 4 index arc4pop
+ arc4pop closepath}def
+ /xyellipse{gstartxy counttomark 1 gt{squarify pop pop 1}if
+ circle xystroke}def
+ /ov /xyoval load def /ox /xyellipse load def }%
+\PSdict@@{%
+ /dotit{dup currentlinewidth 6 mul div round div
+ /@ exch def [xydt @] 0 setdash}def
+ /elldash{dup 4 -1 roll 10 exch div dashit}def
+ /ovdash{dup 10 dashit}def
+ /dashit{div round 2 mul div /@ exch def [@ @] 0 setdash}def
+ /dotcirc{gstartxy cirlen dotit circle xystroke}def
+ /dashcirc{gstartxy cirlen dashit circle xystroke}def
+ /dotoval{gstartxy 5 copy ovlen dotit oval xystroke}def
+ /dashoval{gstartxy 5 copy ovlen ovdash oval xystroke}def
+ /cirlen{dup 6.283185 mul}bind def
+ /ovlen{3 -1 roll sub 3 1 roll sub add exch 1.716815 mul sub}def
+ /dotellipse{gstartxy counttomark 1 gt{squarify pop pop 1}if
+ cirlen dotit circle closepath xystroke}def
+ /dashellipse{gstartxy counttomark 1 gt{squarify add 2 div 1}
+ {1 exch 1 exch}ifelse cirlen elldash circle xystroke}def
+ /ot /dotellipse load def /od /dashellipse load def
+ /vt /dotoval load def /vd /dashoval load def }%
+\PSdict@@{%
+ /filloval{gstartxy oval xyfill}def
+ /stfiloval{gstartxy oval xystfil}def
+ /fillcircle{gstartxy circle xyfill}def
+ /stfilcircle{gstartxy circle xystfil}def
+ /fillellipse{gstartxy squarify pop pop 1 circle xyfill}def
+ /stfilellipse{gstartxy squarify pop pop 1 circle xystfil}def
+ /squarify{4 copy sub 2 div 3 1 roll sub 2 div translate
+ add 2 div 3 1 roll add 2 div 2 copy scale
+ 2 copy add 2 div currentlinewidth exch div setlinewidth
+ newpath}def
+ /fe /fillellipse load def /sfe /stfilellipse load def
+ /fo /filloval load def /sfo /stfiloval load def
+ /fc /fillcircle load def /sfc /stfilcircle load def }%
+\PSdict@@{%
+ /xywidth{.4 pscorrect setlinewidth}bind def
+ /xydash{[] 0 setdash}bind def /xycap{1 setlinecap}bind def
+ /xyjoin{1 setlinejoin}bind def /xymiter{10 setmiterlimit}bind def
+}%
+\PSdict@@{%
+ /cc{dup exec xychgcol}def
+ /lw{dup setlinewidth /@l exch def
+ /xywidth{@l setlinewidth}bind def}def
+ /lc{dup setlinecap /@c exch def
+ /xycap{@c setlinecap}bind def}def
+ /lj{dup setlinejoin /@j exch def
+ /xyjoin{@j setlinejoin}bind def}def
+ /ml{dup setmitrelimit /@m exch def
+ /xymiter{@m setmitrelimit}bind def}def
+}%
+\PSdict@@{%
+ /setupDirection{dup -2048 lt{3072 add neg 1024 exch}
+ {dup 0 lt{1024 add neg -1024}{dup 2048 lt{1024 sub -1024 exch}
+ {3072 sub 1024}ifelse}ifelse}ifelse atan
+ dup 180 gt{360 sub}if dup /XYdirection exch def rotate}def
+ }%
+\PSdict@@{%
+ userdict begin
+ /gray{setgray}bind def /gray@{setgray}bind def
+ /rgb{setrgbcolor}bind def /rgb@{setrgbcolor}bind def
+ /hsb{sethsbcolor}bind def /hsb@{sethsbcolor}bind def
+ /setcmykcolor where{pop}{/setcmykcolor{dup 3 1 roll dup 5 1 roll
+ exch sub 1 add 5 1 roll exch sub 1 add 4 1 roll
+ exch sub 1 add 3 1 roll setrgbcolor}bind def}ifelse
+ /cmyk{setcmykcolor}bind def /cmyk@{setcmykcolor}bind def
+ /sethalftone where{/sethalftone load /tone exch def}if
+ /xycolarray 3 array def /xycolstore{currentrgbcolor 2 -1 0
+ {exch xycolarray 3 1 roll put}for}def xycolstore
+ /xycolor{0 1 2{xycolarray exch get}for setrgbcolor}def
+ /xypatt{}def /xypattern{cleartomark}bind def
+ end}%
+\PSdict@@{end end}%
+\endgroup%
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-ps.tex b/macros/generic/diagrams/xypic/texinputs/xyps-ps.tex
new file mode 100644
index 0000000000..5fa607c10e
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-ps.tex
@@ -0,0 +1,280 @@
+%% xyps-ps.tex from $Id: xyps-ps.doc,v 3.12 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``PS-PS'' PostScript support.
+%% Copyright (c) 1993-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-psloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-psloaded\endcsname=\empty \xycatcodes
+\xylet@\PSmacro@@=\eat@
+\xylet@\PSdict@@=\eat@
+\xylet@\PSspecial@@=\eat@
+\xylet@\PSread@@=\eat@
+\xylet@\PSinclude@@=\eat@
+\xylet@\PSraw@@=\eat@
+\xylet@\xyPSobeylines@@=\relax
+\xylet@\PSspecialdict@@=\eat@
+\xydef@\UnloadPSps@{%
+ \let\PSmacro@@=\eat@
+ \let\PSdict@@=\eat@
+ \let\PSspecial@@=\eat@
+ \let\PSread@@=\eat@
+ \let\PSinclude@@=\eat@
+ \let\PSraw@@=\eat@
+ \let\xyPSobeylines@@=\relax
+ \let\PSspecialdict@@=\eat@
+}
+\xydef@\UnloadPS@{\UnloadPSps@
+ \expandafter\ifx\csname xypsloaded\endcsname\unknown\PSspecials@false
+ \else\expandafter\NoPSspecials\fi}
+\xylet@\UnloadPS@@=\UnloadPS@
+\ifx\undefined\dvitype@\xydef@\dvitype@{null}\fi
+\xylet@\xyrealshipout@=\shipout
+\xydef@\xyPSshipout@{\setbox9=\copy\voidb@x
+ \afterassignment\xyPSshipout@i\setbox9=}
+\xydef@\xyPSshipout@i{\ifvoid9 \expandafter\aftergroup\fi\xyPSshipout@ii}
+\xydef@\xyPSshipout@ii{\xyrealshipout@\vbox{\XYpredict@@\box9}}
+\xydef@\@PSshipout{\global\let\shipout=\xyPSshipout@ }
+\xydef@\xyPSshipout@PSii{%
+ \ifUsePSdict@@\let\XYshipdict@=\includeXYPSdict@@
+ \else\def\XYshipdict@{\XYpredict@@\XYdict@@}\fi
+ \xyrealshipout@\vbox{\XYshipdict@\box9}}
+\xydef@\firstPS@{%
+ \global\let\firstPS@@=\relax \global\let\firstPS@=\relax}
+\xylet@\firstPS@@=\firstPS@
+\ifx\undefined\dumpPSdict@@ \xylet@\dumpPSdict@@=\relax \fi
+\xydef@\installxyps@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}\xycatcodes
+ \installxyps@@ \installxyps@x }
+\xylet@\installxyps@@=\relax
+\xylet@\setupxyPS@@=\relax
+\xywithoption{ps}{\let\setupxyPS@@=\setupxyPS@}
+\xydef@\installxyps@x{\dumpPSdict@@
+ \ifx\xyrealshipout@\undefined \let\xyrealshipout@=\shipout\fi
+ \ifx \shipout \xyrealshipout@
+ \ifUsePSdict@@ \DN@{\includePSmessage@\includeXYPSdict@\message{>}}%
+ \else \DN@{\XYdict@\endXYdict@}\fi
+ \else \DN@{\let\xyPSshipout@ii=\xyPSshipout@PSii \@PSshipout}\fi
+ \let\firstPS@=\relax \next@
+ \let\XYpredict@=\relax
+ \setupxyPS@@ }
+\let\realinstallxyps@x=\installxyps@x
+\ifx\undefined\AfterBeginDocument
+ \def\installxyps@x{\xysetup@@{\realinstallxyps@x}}%
+\else
+ \def\installxyps@x{\AfterBeginDocument{\realinstallxyps@x}}%
+\fi
+\xydef@\xydefaultdriver@{dvips}
+\xydef@\xyPSdriver#1{\def\xydefaultdriver@{#1}}
+\xydef@\installxyps@orig{\DN@{}%
+ \ifx\xydriversselected@@\empty
+ \DN@{\expandafter\defaultinstallps@\expandafter{\xydefaultdriver@}}%
+ \else \def\do##1{%
+ \expandafter\ifx\csname##1@xy@ps\endcsname\relax
+ \DN@{\defaultinstallps@{##1}}}%
+ \xydriversselected@@
+ \else \DN@##1{}\fi\fi \next@ }
+\xydef@\defaultinstallps@#1#2{%
+ \xywarning@{no driver specified, using #1 }%
+ \xyrequire{#1}\csname #1@xy@ps\endcsname{}}
+\xydef@\null@xy@ps{\installxyps@}
+\xydefcsname@{shape [!...]}#1{%
+ \expandafter\ifx\csname xyps-sloaded\endcsname\empty \DN@{\xyPSescapestyle@{#1}@@}%
+ \else\ifxyPSshapes@\DN@{\xyPSshapechar@{#1}@@}%
+ \else \DN@{\xyPScharwarning@}\fi\fi \next@ }
+\xydefcsname@{shape [psxy]}{\ifxyPSshapes@\DN@{\xyPSpsxy@}%
+ \else \DN@{\xyPScharwarning@}\fi \next@ }
+\xydef@\xyPSpsxy@{%
+ \setboxz@h{\dimen@=\L@p \advance\dimen@-\R@p
+ \dimen@ii=-\U@p \raise\dimen@ii\hbox to\z@{%
+ \kern\dimen@\xyPScurrpt@\kern-\dimen@}\boxz@}}%
+\xydef@\xyPScurrpt@{\ifxyPSshapes@\expandafter\xyPScurrpt@@\fi}
+\xydef@\xyPScurrpt@@@{\PSspecial@@{xyi}\PSraw@@{userdict begin xyx end}}
+\ifx\undefined\xyPScurrpt@@ \xylet@\xyPScurrpt@@=\xyPScurrpt@@@ \fi
+\xywarnifdefined\xyPSshapechar@
+\xywarnifdefined\xyPSsplitshape@
+{\xyuncatcodes \catcode`@=11
+ \gdef\xyPSshapechar@#1@@{\xyPSsplitshape@#1<><>@@}%
+ \gdef\xyPSsplitshape@#1<>#2<>#3@@{\xyPSsplitPS@{#1}{#2}}}
+\xydef@\xyPSrawA@#1{\expandafter\xyPSrawAA@ #1{}}%
+\xydef@\xyPSrawAA@#1#2{\PSraw@@{{pu #1}xyg #2}%
+ \PSmessage{{pu #1}xyg #2}}%
+\xydef@\xyPSrawZ@#1{\PSraw@@{{#1 pp}xyf}\PSmessage{{#1 pp}xyf}}%
+\xydef@\modPSboxz@{%
+ \expandafter\DN@\expandafter{\xyPSpre@{}}\ifx\next@\empty\else
+ \setboxz@h{\expandafter\xyPSrawA@\expandafter{\xyPSpre@{}}\boxz@
+ \expandafter\xyPSrawZ@\expandafter{\xyPSpost@}}\DN@{}\fi}%
+\xydef@\modPSdrop@{%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawA@\expandafter{\xyPSpre@{}}}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{\nextii@ ##1}}%
+ \expandafter\next@\expandafter{\Drop@@}%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawZ@\expandafter{\xyPSpost@}}%
+ \DN@##1{\expandafter\def\expandafter\Drop@@\expandafter{\tmp@ ##1}}%
+ \expandafter\next@\expandafter{\nextii@}}%
+\xydef@\modPSconnect@{%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawA@\expandafter{\xyPSpre@{}}}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{\nextii@ ##1}}%
+ \expandafter\next@\expandafter{\Connect@@}%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawZ@\expandafter{\xyPSpost@}}%
+ \DN@##1{\expandafter\def\expandafter\Connect@@\expandafter{\tmp@ ##1}}%
+ \expandafter\next@\expandafter{\nextii@}}%
+\xydef@\xyPSpre@{{}{}}
+\xydef@\xyPSpost@{}
+\xydef@\PSmessage@#1{\W@{PS: #1, direction=\the\Direction}}
+\xydef@\PSignore@#1{}%
+\xydef@\showPSmessages{\let\PSmessage=\PSmessage@}
+\xydef@\hidePSmessages{\let\PSmessage=\PSignore@}
+\xylet@\PStracing=\showPSmessages
+\hidePSmessages
+\xydef@\PSmacro@#1{\PSmacro@@{#1}\PSmessage{#1}}
+\xydef@\includeXYPSdict@@{%
+ \expandafter\PSinclude@@\expandafter{\xyPSdictname}}
+\xydef@\includeXYPSdict@r{\message{PS: includeXYPSdict}\includeXYPSdict@@
+ \let\includeXYPSdict@=\relax}
+\xylet@\includeXYPSdict@\includeXYPSdict@r
+\xydef@\endXYdict@{}
+\xydef@\includePSmessage@@{\message{<xyps: including \xyPSdictname}}
+\xylet@\includePSmessage@=\includePSmessage@@
+\xydef@\xyPSdictknown@{%
+ \immediate\closein\xyread@
+ \xywarning@{File \xyPSdictname\space already exists}
+ \message{ Do you wish to overwrite it \string? y/n }%
+ \read16 to \next
+ \DNii@{\xywarning@{You did not type Y or N -- try again please}%
+ \xyPSdictknown@}%
+ \DN@{Y }\ifx\next@\next \DNii@{\writePSdict@@}%
+ \else\DN@{y }\ifx\next@\next \DNii@{\writePSdict@@}%
+ \else\DN@{n }\ifx\next@\next \DNii@{\cancelPSdict@}%
+ \else\DN@{N }\ifx\next@\next \DNii@{\cancelPSdict@}%
+ \fi\fi\fi\fi \nextii@ }
+\xydef@\cancelPSdict@{%
+ \xywarning@{cancelling dump of PostScript dictionary}}
+\xydef@\noDictmessage@{%
+ \xywarning@{\dvitype@\space does not support the use of a header file}}
+\DN@{\csname newif\endcsname\ifUsePSdict@@\DN@{}}
+ \ifx\undefined\UsePSdict@@true\else\DN@{}\fi \next@
+\ifx\undefined\xyPSdefaultdict
+ \xydef@\xyPSdefaultdict{%
+ \DN@##1.##2.##3@{\gdef\xyPSdictname{xy##1##2dict.pro}}%
+ \expandafter\next@\xyversion.@}%
+\fi
+\ifx\undefined\UsePSheader@
+ \xydef@\UsePSheader@#1{%
+ \DN@{#1}\ifx\next@\empty
+ \else \gdef\xyPSdictname{#1}\fi
+ \ifx\xyPSdictname\undefined\xyPSdefaultdict\fi
+ \gdef\xyHeaderMessage@{%
+ It includes a reference to the PostScript file \xyPSdictname.^^J}%
+ \UsePSdict@@true}%
+ \let\UsePSheader=\UsePSheader@
+\fi
+\xywarnifdefined\xyPS@@
+\xywarnifdefined\xyPS@@@
+{\catcode`|=14 \catcode`\%=12 \catcode`\<=1 \catcode`\>=2 |
+ \gdef\xyPS@@<%%>\gdef\xyPS@@@<%!>}
+\xydef@\writePSdict@@{\message{PS: writePSdict@@}\writePSdict@
+ \def\writePSdict@@{\message{write PS relaxed}}}
+{\catcode`|=14 \catcode`\%=12
+ \gdef\writePSdict@{{\begingroup|
+ \immediate\openout\xywrite@=\xyPSdictname \relax
+ \message{<xyps: dumping \xyPSdictname}|
+ \def\PSdict@@@##1{\immediate\write\xywrite@{##1}}|
+ \let\xyPSobeylines@@=\obeyoutlines@
+ \let\firstPS@@=\relax
+ \let\endXYdict@=\relax
+ \PSdict@@@{\xyPS@@@ PS-Adobe-3.0 Resource-procset}|
+ \PSdict@@@{\xyPS@@ Title: \xyPSdictname}|
+ \PSdict@@@{\xyPS@@ Version: 3.8.9}|
+ \PSdict@@@{\xyPS@@ Creator: Xy-ps backend to Xy-pic}|
+ \PSdict@@@{\xyPS@@ DocumentSuppliedProcSets: XYdict}|
+ \ifx\dvitype@\undefined
+ \PSdict@@@{\xyPS@@ For: use with Xy-pic}\else
+ \PSdict@@@{\xyPS@@ For: \dvitype@ use of Xy-pic}\fi
+ \PSdict@@@{\xyPS@@ BeginResource: procset XYdict}|
+ \def\PSspecialdict@@##1{\PSdict@@@{##1^^J}}|
+ \let\PSdict@@=\PSdict@@@ \let\xy@begindvi=\literal@|
+ \UsePSdict@@false\XYpredict@@|
+ \XYdict@@|
+ \PSdict@@@{\xyPS@@ EndResource}|
+ \immediate\closeout\xywrite@
+ \message{>}|
+ \endgroup}}}
+\xywarnifdefined\obeyoutlines@
+{\catcode`\^^M=\active%
+ \gdef\obeyoutlines@{\catcode`\^^M=\active \def^^M{^^J}%
+ \newlinechar=`\^^J\obeyspaces}}
+\xydef@\XYpredict@@{\ifUsePSdict@@\DN@{}\else
+ \DN@{\xy@begindvi{\xyinputorelse@{xyps-pro}%
+ {\xyerror@{Could not load xyps-pro}{}}\xyuncatcodes}}%
+ \next@
+ \DN@{\xy@begindvi{\xyinputorelse@{xypspatt}%
+ {\xyerror@{Could not load xypspatt}{}}\xyuncatcodes}}\fi
+ \next@ }
+\xydef@\XYpredict@r{\XYpredict@@ \let\XYpredict@=\relax \installxyps@}
+\xylet@\XYpredict@\XYpredict@r
+\xydef@\XYdict@{\XYdict@@\def\XYdict@{\message{PS relaxed}}}%
+\xydef@\XYdict@@{\DN@{\xyinputorelse@{xypsdict}%
+ {\xyerror@{Could not load xypsdict}{}}\xyuncatcodes}%
+ \expandafter\xy@begindvi\expandafter{\next@}}
+\xydef@\forceload@XYdict{%
+ \let\includeXYPSdict@=\includeXYPSdict@r
+ \let\XYpredict@=\XYpredict@r
+ \let\XYdict@=\XYdict@@ \expandafter\installxyps@ }
+\xynew@{if}\ifxyPSshapes@ \xyPSshapes@true
+\xydef@\xyPScharwarning@@{\xyPScharmessage@
+ \gdef\xyPScharwarning@@{\xyPScharmessage@
+ \xywarning@{...no further PostScript warnings will be given}%
+ \global\let\xyPScharwarning@@=\relax }}
+\xydef@\xyPScharmessage@{\xywarning@{%
+ the current <driver> does not fully support PostScript effects}}%
+\xydef@\newxyshape#1#2#3{%
+ \DN@{#3}\ifx\next@\empty
+ \xydefcsname@{shape [#1]}{\csname xyshape@#1@\endcsname}%
+ \else \expandafter\def\csname shape [#1]\endcsname{%
+ \csname xyshape@#1@\endcsname}\fi
+ \DN@{#2}\ifx\next@\empty
+ \expandafter\def\csname xyshape@#1@\endcsname{%
+ \xyundefinedEffect@{#1}{}@@}%
+ \else \expandafter\def\csname xyshape@#1@\endcsname{#2}\fi }
+\xydef@\xyundefinedEffect@#1#2@@{%
+ \xywarning@{The #1 #2 effect is not implemented with the current driver}}%
+\xydef@\newxyPSshape#1#2{%
+ \expandafter\DN@\expandafter{\csname shape [#1]\endcsname}%
+ \DNii@{\relax}\ifx\next@\nextii@ \newxyshape{#1}{}\relax\fi
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{#2}%
+ \ifx\nextii@\empty\expandafter\def\next@{\xyPSnotimplemented@@`#1'@@}%
+ \else
+ \edef\tmp@{\noexpand\let\expandafter\noexpand\next@
+ \expandafter\noexpand\nextii@}%
+ \expandafter\tmp@\fi }
+\xydef@\xyPSnotimplemented@@#1@@{%
+ \xywarning@{This PostScript effect is not implemented yet}}%
+\xydef@\xyPSnotfinished@@{%
+ \xywarning@{This effect is not reliable yet; box sizes may be wrong}}%
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-r.tex b/macros/generic/diagrams/xypic/texinputs/xyps-r.tex
new file mode 100644
index 0000000000..c862790063
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-r.tex
@@ -0,0 +1,61 @@
+%% xyps-r.tex from $Id: xyps-r.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``PostScript Rotations and Scaling''.
+%% Copyright (c) 1993-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-rloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-rloaded\endcsname=\empty \xycatcodes
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\xydef@\installPSrotscale@{\installPSstyle@
+ \let\xyRotate@@=\xyPSrotate@@
+ \let\doSpecialRotate@@=\doPSspecialRotate@@
+ \let\xyscale@@=\xyPSscale@@
+ \xyPSshapes@true
+ \xyuncatcodes }
+\xydef@\UsePSrotate{\installPSrotscale@}
+\xydef@\NoPSrotate{\UnloadRotate@\relax}
+\xydef@\xyPSpretransform@{\xyPSrawA@{\preXYtransform@@}}
+\xydef@\xyPSposttransform@{\xyPSrawZ@{\postXYtransform@@}}
+\let\preXYtransform@=\xyPSpretransform@
+\let\postXYtransform@=\xyPSposttransform@
+\xydef@\xyPSrotSplit@{%
+ \expandafter\def\expandafter\preShape@@\expandafter{\xyPSpre@}%
+ \expandafter\def\expandafter\postShape@@\expandafter{\xyPSpost@}}
+\xydef@\xyPSscale@@#1#2{%
+ \xyPSsplitPS@{\xyscale@start(#1,#2)}{\xyscale@end}%
+ \xyPSrotSplit@\xyPSpsxy@ }
+\xydef@\xyPSrotate@@#1{%
+ \xyPSsplitPS@{\xyrot@start(#1 xyd)}{\xyrot@end}%
+ \xyPSrotSplit@\xyPSpsxy@ }
+\xydef@\xyPSspecialRotate@#1{%
+ \xyPSsplitPS@{\xyrot@start(#1)}{\xyrot@end}\xyPSrotSplit@\xyPSpsxy@ }
+\xydef@\doPSspecialRotate@@#1@@{\xyPSspecialRotate@{#1}}
+\xydef@\xyRotScale@@{%
+ \def\xyrot@start(##1){{xyt ##1\space xyr}}%
+ \def\xyscale@start(##1,##2){{xyt ##1\space##2\space xys}}%
+ \def\xyrot@end{}\def\xyscale@end{}}
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-s.tex b/macros/generic/diagrams/xypic/texinputs/xyps-s.tex
new file mode 100644
index 0000000000..45f2299a8e
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-s.tex
@@ -0,0 +1,51 @@
+%% xyps-s.tex from $Id: xyps-s.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Style extension'' PostScript support.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-sloaded\endcsname=\empty \xycatcodes
+\xydef@\xykillstyles@@{\Unloadstyle@}%
+\xywarnifdefined\xyPSescapestyle@
+\xywarnifdefined\xyPSsplitescape@
+{\xyuncatcodes \catcode`@=11
+ \gdef\xyPSescapestyle@#1@@{\xyPSsplitescape@#1<><>@@}%
+ \gdef\xyPSsplitescape@#1<>#2<>#3@@{\xyescape@@{#1}{#2}}}
+\xydef@\xyPSsplitPS@#1#2{%
+ \def\xyPSpre@{#1}\def\xyPSpost@{#2}\modPSboxz@ }
+\xydef@\xyescape@@#1#2{\checkXyStyle@
+ \applyFIFOstyle@\prexyescape@{#1}\postxyescape@{#2}}
+\xydef@\prexyescape@{\xyescapeSpecial@}
+\xydef@\postxyescape@{\xyescapeSpecial@}
+\xylet@\xyescapeSpecial@=\eat@
+\let\xyescapeSpecial@=\addtostyletoks@
+\xydef@\installPSstyle@{%
+ \def\preXYstyle@@{\xyPSpre@}%
+ \let\xydoprestyles@=\xyPSrawstyleA@
+ \let\xydopoststyles@=\xyPSrawZ@
+ \let\xykillstyles@=\xykillstyles@@
+ }
+\xydef@\xyPSrawstyleA@#1{\xyPSrawA@{{#1}{}}}
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps-t.tex b/macros/generic/diagrams/xypic/texinputs/xyps-t.tex
new file mode 100644
index 0000000000..cfb7cce2d7
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps-t.tex
@@ -0,0 +1,64 @@
+%% xyps-t.tex from $Id: xyps-t.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Pattern and Tile extension'' PostScript support.
+%% Copyright (c) 1993-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-tloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-tloaded\endcsname=\empty \xycatcodes
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\xydef@\installPSpatterns@{\installPSstyle@
+ \let\xypattern@=\xyPSpattern@@
+ \let\xypatternwarning@=\relax
+ \xystandardpatterns@
+ \xyuncatcodes }
+\xylet@\UnloadPSpatterns@=\Unloadpattern@
+\xydef@\UsePStiles{\installPSpatterns@}
+\xydef@\NoPStiles{\UnloadPSpatterns@\relax}
+\xydef@\xyPSnewpattern@#1#2#3#4#5{%
+ \expandafter\DN@\expandafter{\csname shape [#1]\endcsname}%
+ \DNii@{\relax}\ifx\next@\nextii@\newxypattern{#1}{}\relax\fi
+ \DNii@{#4}\ifx\nextii@\empty
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPSpattern@{#2 #3}}\else
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPSpattern@{#4}}\fi
+ \ifx\nextii@\empty\expandafter\def\next@{\xyPSnotimplemented@@`#1'@@}%
+ \else
+ \edef\tmp@{\noexpand\let\expandafter\noexpand\next@
+ \expandafter\noexpand\nextii@}\expandafter\tmp@\fi }
+\xydef@\xyPSpattern@{\ifPSspecials@\expandafter\xyPSpattern@@
+ \else\expandafter\eat@\fi}%
+\xydef@\xyPSpattern@@#1{\bgroup \checkXyStyle@
+ \def\preStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpre@}}%
+ \def\postStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpost@}}%
+ \let\modPSboxz@=\modXYstyle@ \xyPS@pattern@@{#1}%
+ \toks@={\egroup\let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
+ \the\toks@ }
+\xydef@\xyPS@pattern@@#1{\xyPSsplitPS@{{#1}sp}{}}
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyps.tex b/macros/generic/diagrams/xypic/texinputs/xyps.tex
new file mode 100644
index 0000000000..09a3536924
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyps.tex
@@ -0,0 +1,367 @@
+%% xyps.tex from $Id: xyps.doc,v 3.12 2011/05/27 04:51:17 krisrose Exp $
+%%
+%% Xy-pic ``PostScript backend''.
+%% Copyright (c) 1993-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{ps}{PostScript backend}{\stripRCS$Revision: 3.12 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\UsePSspecials{\DNii@{{[4]}}\xyFN@\UsePSspecials@i}
+\xydef@\UsePSspecials@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\UsePSspecials@i}%
+ \else\ifx [\next \DN@[##1]{\DNii@{{[##1]}}\xyFN@\UsePSspecials@i}%
+ \else\ifcat 5\noexpand\next \DN@##1{\DNii@{{[##1]}}\xyFN@\UsePSspecials@i}%
+ \else\ifx\bgroup\next \DN@{\expandafter\UsePS@specials\nextii@}%
+ \else \DN@{\UsePS@specials{[4]}}%
+ \fi\fi\fi\fi \next@ }
+\xydef@\UsePS@specials#1#2{%
+ \ifx\empty\whichPSspecials@
+ \DN@{#2}\ifx\next@\empty
+ \else
+ \expandafter\let\expandafter\next\csname#2@\endcsname
+ \ifx\next\relax \DN@{\UsePSspecials@{#2}{}}%
+ \else \DN@{\UsePSspecials@{#2}{#1}}\fi
+ \fi
+ \else
+ \DN@{#2}\ifx\next@\empty \DN@{\PSspecials@true}%
+ \else
+ \DN@{#2}%
+ \edef\nextii@{\expandafter\string\whichPSspecials@}%
+ \ifx\next@\nextii@\DN@{\PSspecials@true}%
+ \else
+ \ifx\firstPS@@\relax
+ \DN@{\xyerror@{Only one PS <driver> allowed: \dvitype@ already loaded}{}}%
+ \else
+ \expandafter\let\expandafter\next\csname#2@\endcsname
+ \ifx\next\relax
+ \DN@{\xyerror@{PostScript specials for `#2' not supported}{}}%
+ \else
+ \xywarning@{Changing PS <driver> to #2 }%
+ \DN@{\UsePSspecials@{#2}{#1}}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi \next@}
+\xydef@\UseDVIPSspecials{\UsePSspecials@\dvips@}
+\xydef@\UseTexturesPSspecials{\UsePSspecials@\Textures@}
+\xydef@\UseTexturesSpecials{\UsePSspecials@\Textures@}
+\xydef@\UsePostScriptSpecials{\UsePSspecials@\dvips@}
+\xydef@\UseOzTeXspecials{\UsePSspecials@\OzTeX@}
+\xydef@\UseDVITOPSspecials{\UsePSspecials@\dvitops@}
+\message{drivers,}
+\xydef@\loadPSdriver@#1#2{\xyinputorelse@{xy#1}%
+ {\xyrequire{#2}\expandafter\ifx\csname xy#2loaded\else
+ {\xyerror@{Unable to load xy#1.tex for #2 driver}{}}\fi}}
+\xydef@\dvips@{\loadPSdriver@{ps-dvi}{dvips}}
+\xydef@\Textures@{\loadPSdriver@{ps-txt}{Textures}}
+\xydef@\OzTeX@{\loadPSdriver@{ps-oz}{OzTeX}}
+\xydef@\dvitops@{\loadPSdriver@{ps-dto}{dvitops}}
+\xydef@\dvipsone@{\loadPSdriver@{ps-one}{dvipsone}}
+\global\newif\ifPSspecials@
+\xydef@\UsePSspecials@#1{\def\whichPSspecials@{#1}%
+ \DN@{\Textures@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{textures}%
+ \def\whichPSspecials@{textures}\xyps@options}%
+ \else\DN@{\dvips@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{dvips}%
+ \def\whichPSspecials@{dvips}\xyps@options}%
+ \else\DN@{\OzTeX@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{oztex}%
+ \def\whichPSspecials@{oztex}\xyps@options}%
+ \else\DN@{\dvitops@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{dvitops}%
+ \def\whichPSspecials@{dvitops}\xyps@options}%
+ \else
+ \DN@##1{\xyrequire{ps}\xyrequire{#1}\xyps@options}%
+ \fi\fi\fi\fi \next@ }
+\xydef@\xyps@options{%
+ \xyrequire{ps}\xyrequire{line}\xyrequire{color}\xyrequire{crayon}%
+ \xyrequire{rotate}\xyrequire{tile}\xyrequire{frame}\xyuncatcodes }
+\xydef@\whichPSspecials@{}
+\xydef@\NoPSspecials{\xyPSwarning@{off}%
+ \PSspecials@false\aftergroup\resetPS@}
+\xydef@\resetPS@{\ifPSspecials@\xyPSwarning@{back on}\fi}
+\xydef@\UsePSspecials@x{\PSspecials@true\resetPS@}
+\xydef@\xyPSwarning@#1{\xywarning@{PostScript switched #1}}
+\xyaddunsupport{ps}{\csname UnloadPS@@\endcsname}
+\xydef@\PSspecials@{%
+ \ifx\next[\DN@[##1]{\setxyPSlevel@{##1}\xyFN@\PSspecials@}%
+ \else\DN@{\whichPSspecials@\PSspecials@@}%
+ \fi \next@ }%
+\xydef@\PSspecials@@{%
+ \ifx\und@fined\PSmessage\hidePSmessages\fi \setupxyPS@}
+\xydef@\setupxyPSlevelO@{\relax}
+\xydef@\setxyPSlevel@#1{\ifcase#1%
+ \gdef\setupxyPS@{\setupxyPSlevelO@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelA@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelB@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelC@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelD@}%
+ \else\gdef\setupxyPS@{\setupxyPSlevelD@}\fi }
+\xywarnifdefined\setupxyPS@
+ \gdef\setupxyPS@{\setupxyPSlevelD@ \gdef\setupxyPS@{\PSspecials@true}}
+\xydef@\PSincrease@#1{%
+ \xywarning@{The PS level may only increase: #1 is already active}}
+\DN@{\csname newif\endcsname\ifUsePSdict@@\DN@{}}
+ \ifx\undefined\UsePSdict@@true\else\DN@{}\fi \next@
+\ifx\undefined\xyPSdefaultdict
+ \xydef@\xyPSdefaultdict{%
+ \DN@##1.##2.##3@{\gdef\xyPSdictname{xy##1##2dict.pro}}%
+ \expandafter\next@\xyversion.@}%
+\fi
+\ifx\undefined\UsePSheader@
+ \xydef@\UsePSheader@#1{%
+ \DN@{#1}\ifx\next@\empty
+ \else \gdef\xyPSdictname{#1}\fi
+ \ifx\xyPSdictname\undefined\xyPSdefaultdict\fi
+ \gdef\xyHeaderMessage@{%
+ It includes a reference to the PostScript file \xyPSdictname.^^J}%
+ \UsePSdict@@true}%
+ \let\UsePSheader=\UsePSheader@
+\fi
+\xydef@\dumpPSdict#1{\DN@{#1}\ifx\next@\empty
+ \ifx\undefined\xyPSdictname\xyPSdefaultdict\fi
+ \else\gdef\xyPSdictname{#1}\fi
+ \def\dumpPSdict@@{\writePSdict@@}%
+ \ifx\xydriversselected@@\empty\DN@{\xysetup@@\null@xy@ps}%
+ \else \DN@{\installxyps@x}\fi \next@}
+\message{hooks,}
+\gdef\xyPSalternative@#1#2{%
+\expandafter\global\expandafter\let\csname origxy#2@\endcsname=#1%
+ \xdef#1{\noexpand\ifPSspecials@
+ \noexpand\expandafter\expandafter\noexpand\csname xyPS#2@\endcsname
+ \noexpand\else
+ \noexpand\expandafter\expandafter\noexpand\csname origxy#2@\endcsname
+ \noexpand\fi}}%
+\xydef@\setupxyPSlevelA@{\xyPStips@%
+ \xyPSalternative@{\Tip@@}{Tip}%
+ \xyPSalternative@{\Ttip@@}{Ttip}%
+ \xyPSalternative@{\Tip@@eu}{Tip@eu}%
+ \xyPSalternative@{\Ttip@@eu}{Ttip@eu}%
+ \xyPSalternative@{\hook@@}{hook}%
+ \xyPSalternative@{\ahook@@}{ahook}%
+ \xyPSalternative@{\bhook@@}{bhook}%
+ \xyPSalternative@{\aturn@@}{aturn}%
+ \xyPSalternative@{\bturn@@}{bturn}%
+ \xyPSalternative@{\squiggle@@}{squiggle}%
+ \xyPSalternative@{\stopper@@}{stopper}%
+ \xyPSalternative@{\line@@}{dash}%
+ \xyPSalternative@{\circhar@@}{circhar@}%
+ \gdef\setupxyPSlevelA@{\PSincrease@{1}}%
+ \global\let\UsePSspecials=\UsePSspecials@x \PSspecials@true}
+\xydef@\setupxyPSlevelB@{%
+ \let\xyPSfont@=\empty \let\xyPSsemifont@=\empty
+ \xyPSalternative@{\cirrestrict@@}{cirrest}%
+ \gdef\setupxyPSlevelB@{\PSincrease@{2}}%
+ \setupxyPSlevelA@ }
+\xydef@\setupxyPSlevelC@{%
+ \xyPSalternative@{\cirbuild@}{cirbuild}%
+ \xyPSalternative@{\CIRfull@}{CIRfull}%
+ \xyPSalternative@{\solid@}{solid}%
+ \xyPSalternative@{\point@}{point}%
+ \xywithoption{curve}{%
+ \xyPSalternative@{\splinesolid@}{splinesolid}}%
+ \gdef\setupxyPSlevelC@{\PSincrease@{3}}%
+ \setupxyPSlevelB@ }%
+\xydef@\setupxyPSlevelD@{%
+ \xyPSalternative@{\dash@}{dashed}%
+ \xywithoption{curve}{%
+ \xyPSalternative@{\splinedashed@}{splinedashed}%
+ \xyPSalternative@{\splinedotted@}{splinedotted}}%
+ \gdef\setupxyPSlevelD@{}%
+ \setupxyPSlevelC@ }
+\xydef@\xyPSchar@#1{%
+ \PSmacro@{\the\Direction\space \xyPSfont@ #1}}
+\xydef@\xyPSsemichar@#1{%
+ \PSmacro@{\the\Direction\space \xyPSsemifont@ #1}}
+\xydef@\xyPSfont@{f }%
+\xydef@\xyPSsemifont@{fs }%
+\xydef@\xyPStip@{\xyPSchar@{t}}%
+\xydef@\xyPSTip@{\xyPSchar@{/XT tt}}%
+\xydef@\xyPSTtip@{\setboxz@h\bgroup
+ \reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c \xyPSchar@{/Xt tT}}%
+\xydef@\xyPSTip@eu@{\xyPSchar@{/ET tt}}%
+\xydef@\xyPSTtip@eu@{\setboxz@h\bgroup
+ \reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c \xyPSchar@{/ET tT}}%
+\xydef@\xyPScm@\tip@x{\xyFN@\xyPScm@@}%
+\xydef@\xyPScm@@{%
+ \ifx\next\tip@@ \DN@\tip@@{\tip@x\xyPScmtip@}%
+ \else\ifx\next\atip@@ \DN@\atip@@{\tip@x\xyPScmatip@}%
+ \else\ifx\next\btip@@ \DN@\btip@@{\tip@x\xyPScmbtip@}%
+ \else\DN@{}%
+ \fi\fi\fi \next@}%
+\xydef@\xyPScmtip@{\xyPSchar@{ct}}%
+\xydef@\xyPScmatip@{\xyPSchar@{ca}}%
+\xydef@\xyPScmbtip@{\xyPSchar@{cb}}%
+\xydef@\xyPStips@{%
+ \xyPSalternative@{\atip@@}{atip}%
+ \xyPSalternative@{\btip@@}{btip}%
+ \xyPSalternative@{\tip@@}{abtip}%
+}%
+\xydef@\xyPSatip@{\xyPSwhichatip@
+ \expandafter\xyPSchar@\expandafter{\xyPSfont@@}}%
+\xydef@\xyPSbtip@{\xyPSwhichbtip@
+ \expandafter\xyPSchar@\expandafter{\xyPSfont@@}}%
+\xydef@\xyPSabtip@{\xyPSwhichabtip@
+ \expandafter\xyPSchar@\expandafter{\xyPSfont@@}}%
+\xydef@\xyPSwhichatip@{\ifx\xyatipfont\xy@@atfont
+ \expandafter\xyPSatip@i \else\def\xyPSfont@@{10 /xy A}\fi }%
+\xydef@\xyPSwhichbtip@{\ifx\xybtipfont\xy@@btfont
+ \expandafter\xyPSbtip@i \else\def\xyPSfont@@{10 /xy B}\fi }%
+\xydef@\xyPSwhichabtip@{\ifx\xyatipfont\xy@@atfont
+ \expandafter\xyPSabtip@i \else\def\xyPSfont@@{10 /xy AB}\fi }%
+\xydef@\xyPSatip@i{%
+ \edef\xyPSfont@@{\tipsize@@\space/\tipfamily@@\space A}}
+\xydef@\xyPSbtip@i{%
+ \edef\xyPSfont@@{\tipsize@@\space/\tipfamily@@\space B}}
+\xydef@\xyPSabtip@i{%
+ \edef\xyPSfont@@{\tipsize@@\space/\tipfamily@@\space AB}}
+\xydef@\xyPSTtips@{%
+ \let\Ttip@xy=\Ttip@
+ \let\Ttip@cm=\Ttip@
+ \let\Ttip@eu=\Ttip@ }
+\xydef@\xyPShook@{\xyPSchar@{h}}%
+\xydef@\xyPSahook@{\xyPSchar@{ha}}%
+\xydef@\xyPSbhook@{\xyPSchar@{hb}}%
+\xydef@\xyPSaturn@{\xyPSchar@{ta}}%
+\xydef@\xyPSbturn@{\xyPSchar@{tb}}%
+\xydef@\xyPSsquiggle@{\xyPSchar@{g}}%
+\xydef@\xyPSstopper@{\xyPSchar@{st}}%
+\xydef@\xyPSfliptrue@{\DN@{\xyPSsemichar@{T d}}}
+\xydef@\xyPSdash@{%
+ \DN@{\xyPSsemichar@{F d}}%
+ \ifnum\SemiDirectionChar=31
+ \ifdim\d@Y<\z@
+ \ifdim\d@X<\z@ \ifx\xyPSsemifont@\empty\xyPSfliptrue@\fi\fi
+ \else
+ \ifdim\z@>\d@X
+ \ifx\xyPSsemifont@\empty\else\xyPSfliptrue@\fi
+ \else\xyPSfliptrue@\fi
+ \fi\fi
+ \next@ \setboxz@h{\origxydash@}\kern\wdz@
+ \setbox\z@=\box\voidb@x }
+\xydef@\xyPScirchar@#1{\count@=#1\edef\tmp@{\the\count@}%
+ \ifcase#1%
+ \xyPScirchar@@@{-180}{-135}{\tmp@}\dimen@=\partroottwo\R@
+ \or\xyPScirchar@@@{-135}{-90}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{-90}{-45}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{-45}0{\tmp@}\dimen@=\partroottwo\R@
+ \or\xyPScirchar@@@0{45}{\tmp@}\dimen@=\partroottwo\R@
+ \or\xyPScirchar@@@{45}{90}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{90}{135}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{135}{180}{\tmp@}\dimen@=\partroottwo\R@
+ \fi}
+\xydef@\xyPScirrest@{\relax}%
+\xydef@\xyPScirchar@@#1{\relax\count@=#1\edef\tmp@{\the\count@}%
+ \expandafter\xyPScirchar@@@\ifcase#1%
+ {-180}{-135}{\tmp@}\kern\partroottwo\R@
+ \or{-135}{-90}{\tmp@}\kern\halfroottwo\R@
+ \or{-90}{-45}{\tmp@}\kern\halfroottwo\R@
+ \or{-45}0{\tmp@}\kern\partroottwo\R@
+ \or 0{45}{\tmp@}\kern\partroottwo\R@
+ \or{45}{90}{\tmp@}\kern\halfroottwo\R@
+ \or{90}{135}{\tmp@}\kern\halfroottwo\R@
+ \or{135}{180}{\tmp@}\kern\partroottwo\R@
+ \fi}
+\xydef@\xyPScirchar@@@#1#2#3{\edef\tmp@{#1\space#2\space
+ \expandafter\removePT@\the\R@\space #3\space c}%
+ \PSmacro@{\tmp@}}
+\xydef@\xyPScirc@#1#2{\edef\tmp@{\expandafter\removePT@\the\R@}%
+ \PSmacro@{\tmp@\space #1 #2 o}}
+\xydef@\xyPSCIRfull@{\setboxz@h{\kern\R@\xyPScirc@0{360}\kern\R@}%
+ \wd\z@=\z@ \ht\z@=\R@ \dp\z@=\R@ \boxz@}%
+\xydef@\xyPScirbuild@{{%
+ \count@=\CIRlo@@ \count@@=\CIRhi@@
+ \multiply\count@ by45 \advance\count@-180 \relax
+ \multiply\count@@ by45 \advance\count@@-180 \relax
+ \def\tmp@{}%
+ \ifx\CIRtest@@\CIRtest@inside
+ \ifnum\count@@>\count@
+ \edef\tmp@{\noexpand\xyPScirc@{\the\count@}{\the\count@@}}\fi
+ \else\ifx\CIRtest@@\CIRtest@outside
+ \ifnum\count@>-180 \advance\count@ by360 \relax
+ \edef\tmp@{\noexpand\xyPScirc@{\the\count@@}{\the\count@}}%
+ \else
+ \ifnum\count@@<180 \relax
+ \edef\tmp@{\noexpand\xyPScirc@{\the\count@@}{180}}%
+ \fi\fi
+ \fi\fi
+ \kern\R@\tmp@\kern\R@}}
+\xydef@\xyPSstraight@#1{\setupDirection@
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \DN@##1##2{\def\checkoverlap@@{%
+ \ifdim##1\X@p>##1\X@c \let\next@=\relax \fi
+ \ifdim##2\Y@p>##2\Y@c \let\next@=\relax \fi}}%
+ \edef\nextii@{{\sd@X}{\sd@Y}}\expandafter\next@\nextii@
+ \noCshavep@@
+ \edef\Cshavep@@{\pfromthep@ \noexpand\resetDirection@}%
+ \noCshavec@@
+ \edef\Cshavec@@{\cfromthec@ \noexpand\resetDirection@}%
+ \ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi \fi
+ \ifInvisible@\let\next@=\relax \else
+ \DN@{\setboxz@h{\kern\X@c \raise\Y@c\hbox{#1}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\xykillstyles@\Drop@@}}%
+ \fi
+ \checkoverlap@@
+ \ifdim\d@X=\z@ \ifdim\d@Y=\z@ \DN@{\relax}\fi\fi \next@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\Creset@@ }
+\xylet@\xykillstyles@=\relax
+\xydef@\xyPSsolid@{\straight@\xyPSsolidSpread@}%
+\xydef@\xyPSsolidSpread@{\xyPSspread@{solid}{l}@@}%
+\xydef@\xyPSdottedSpread@{\xyPSspread@{dotted}{dt}@@}%
+\xydef@\xyPSdashed@{\line@ \def\Connect@@{\straight@\xyPSdashedSpread@}}
+\xydef@\xyPSdashedSpread@{\xyPSspread@{dashed}{dd}@@}%
+\xydef@\xyPSspread@#1#2@@#3\repeat@{\edef\tmp@{%
+ \expandafter\removePT@\the\d@X\space\expandafter\removePT@\the\d@Y}%
+ \setboxz@h{\kern\X@c \raise\Y@c\hbox{%
+ \PSmessage{#1 line:}\PSmacro@{\tmp@\space #2}}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydef@\xyPSpoint@{\xyPSzerodot@\egroup
+ \Invisible@false \Hidden@false \def\Leftness@{.5}\def\U@pness@{.5}\ctipEdge@
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\xyPSdottedSpread@}}
+\xydef@\xyPSzerodot@{\PSmessage{dot:}\PSmacro@{p}}
+\xydef@\xyPScubic@#1{\readsplineparams@
+ \PSmessage{CUBIC:}%
+ \DN@{#1}\ifx\next@\empty\PSmacro@{mark \cubicinfo@\space bz}%
+ \else\PSmacro@{mark \cubicinfo@\space b#1}\fi}
+\xydef@\xyPSsquine@#1{\readsplineparams@
+ \PSmessage{SQUINE:}%
+ \DN@{#1}\ifx\next@\empty\PSmacro@{mark \squineinfo@\space q#1}%
+ \else\PSmacro@{mark \squineinfo@\space q#1}\fi}
+\xydef@\xyPSsplinesolid@{\ifx\splineinfo@\squineinfo@
+ \expandafter\xyPSsquine@\else\expandafter\xyPScubic@\fi{}}
+\xydef@\xyPSsplinedashed@{\ifx\splineinfo@\squineinfo@
+ \expandafter\xyPSsquine@\else\expandafter\xyPScubic@\fi{d}}
+\xydef@\xyPSsplinedotted@{\ifx\splineinfo@\squineinfo@
+ \expandafter\xyPSsquine@\else\expandafter\xyPScubic@\fi{t}}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xypsdict.tex b/macros/generic/diagrams/xypic/texinputs/xypsdict.tex
new file mode 100644
index 0000000000..0d949b0cdf
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypsdict.tex
@@ -0,0 +1,241 @@
+%% xypsdict.tex from $Id: xypsdict.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``PostScript backend prolog''.
+%% Copyright (c) 1995-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+\begingroup \xycatcodes%
+ \count@=\xydashl@\relax \count@@=\xydashw@\relax%
+ \XYpredict@\relax \xycatcodes \xyPSobeylines@@%
+\PSdict@@{/XYdict where pop begin XYdict begin}%
+\PSdict@@{%
+ /xysize 10 def /T true def /F false def
+ /dimendiv{65536 div}bind def
+ /xysegl \number\count@\space dimendiv def
+ /xyopp{1 -1 scale}bind def
+ /xynormwidth{\number\count@@\space dimendiv pscorrect}bind def
+ /xywidth{xynormwidth setlinewidth}bind def
+}%
+\PSdict@@{%
+ /xyfont{4096 add 64 div round 64 mul 4096 sub}def /xydt 0.01 def
+ /xysdfont{4096 add 32 div round 32 mul 4096 sub}def
+ /xydots{xywidth 1 setlinecap [xydt 2] 0 setdash}bind def
+ /f /xyfont load def /fs /xysdfont load def}%
+\PSdict@@{%
+ /xyCheckDir{dup 8 div 3 mul 3 -1 roll sub neg exch div 360 mul
+ dup dup XYdirection sub 180 div round 180 mul XYdirection add
+ dup 3 -1 roll sub abs 10 gt not{exch}if pop}def
+}%
+\ifdim\xydashw@=0pt\xydashw@=.4pt\fi\count@@=\xydashw@\relax%
+\PSdict@@{%
+ /xyrulth{\number\count@@\space dimendiv pscorrect setlinewidth
+ 0 setlinecap}bind def
+}%
+\PSdict@@{%
+ /gsavexy{gsave xypspt XYdirection rotate xywidth newpath 0 0 moveto}def
+ /gchksavexy{gsave xypspt setupDirection xywidth newpath 0 0 moveto}def
+}%
+\PSdict@@{%
+ /xyswap{XYdirection 180 add /XYdirection exch def}def
+ /xyline{gstartxy setupDirection rlineto xystroke}def
+}%
+\PSdict@@{%
+ /dash{exch gchksavexy xysegl XYdirection dup
+ -90 lt{pop neg}{90 gt{neg}if}ifelse exch{neg}if
+ 0 rlineto xystroke}def
+ /stopper{gstartxy setupDirection 0 xysegl 2 div rmoveto
+ 0 xysegl neg rlineto xystroke }def
+ /d /dash load def /st /stopper load def}%
+\PSdict@@{%
+ /solid{gstartxy xydash neg exch neg exch rlineto xystroke}def
+ /dashed{gstartxy 2 copy dup mul exch dup mul add sqrt dup
+ xysegl add xysegl 2 mul div round 2 mul 1 sub div [ exch dup ] 0 setdash
+ neg exch neg exch rlineto xystroke}def
+ /l /solid load def /dd /dashed load def}%
+\PSdict@@{%
+ /dot{gstartxy 2 setlinecap [xydt 2] 0 setdash
+ 1 0 rlineto xystroke}def
+ /dotted{gstartxy 2 copy dup mul exch dup mul add sqrt dup
+ 2 div round 1 add div 2 setlinecap [xydt 3 -1 roll] 0 setdash
+ neg exch neg exch rlineto 0 0 rlineto xystroke}def
+ /p /dot load def /dt /dotted load def}%
+\PSdict@@{%
+ /cubic{gstartxy docubic} def
+ /docubic{chkvalid
+ {chkcubedge 8 -2 roll moveto curveto xystroke pop}
+ {cleartomark grestore}ifelse}def
+ /chkcubedge{2 copy 1.0 eq{0.0 eq{pop pop}{cubicedge}ifelse}
+ {pop cubicedge}ifelse}def
+ /bz /cubic load def}%
+\PSdict@@{%
+ /dotcubic{gstartxy 1 setlinecap [xydt 2] 0 setdash docubic}def
+ /dashcubic{gstartxy [5 5] 0 setdash docubic}def
+ /bt /dotcubic load def /bd /dashcubic load def}%
+\PSdict@@{%
+ /squine{gstartxy dosquine}def
+ /dosquine{chkvalid
+ {chksquedge 2 copy moveto xysq2cub curveto xystroke pop}
+ {cleartomark grestore}ifelse}def
+ /q /squine load def}%
+\PSdict@@{%
+ /chkvalid{2 copy lt{dup 1 gt{false}{true}ifelse}{false}ifelse}def
+}%
+\PSdict@@{%
+ /chksquedge{2 copy 1.0 eq{0.0 eq{pop pop}{squineedge}ifelse}
+ {pop squineedge}ifelse}def
+ /xysq2cub{xysq2cubit 6 1 roll xysq2cubit 6 1 roll 3 index 3 index
+ xysq2cubit 6 1 roll xysq2cubit 6 1 roll pop pop}def
+ /xysq2cubit{2 index 2 mul add 3 div}def
+}%
+\PSdict@@{%
+ /dotsquine{gstartxy 1 setlinecap [xydt 2] 0 setdash dosquine}def
+ /dashsquine{gstartxy [5 5] 0 setdash dosquine}def
+ /qt /dotsquine load def /qd /dashsquine load def}%
+\PSdict@@{%
+/xy4mul{8 copy
+ 5 -1 roll mul 5 1 roll 6 -1 roll mul 6 1 roll
+ 3 -1 roll mul exch 4 -1 roll mul 3 1 roll
+ add 3 1 roll add exch 10 2 roll
+ 7 -1 roll mul 7 1 roll 4 -1 roll mul 5 1 roll
+ 4 -1 roll mul 4 1 roll mul add 3 1 roll add
+ exch 3 -1 roll }def
+}%
+\PSdict@@{%
+ /xy44mul{4 copy 16 4 roll exch 3 1 roll 4 copy 12 4 roll
+ xy4mul 12 4 roll xy4mul 12 -4 roll 4 copy 16 4 roll
+ 8 4 roll xy4mul 12 4 roll xy4mul}def
+}%
+\PSdict@@{%
+ /cubicedge{10 2 roll exch 8 1 roll 3 -1 roll dup dup 9 2 roll
+ 5 -1 roll dup dup 9 1 roll 8 3 roll
+ 4 1 roll dup dup 5 3 roll dup dup 5 1 roll 3 -1 roll
+ 18 -2 roll 2 copy 1 sub neg 4 1 roll 1 sub neg exch 4 1 roll
+ xy444mul
+ pop pop pop 13 1 roll pop pop pop 9 1 roll 10 1 roll
+ pop 8 1 roll 7 1 roll 8 1 roll pop 5 1 roll 3 1 roll}def
+}%
+\PSdict@@{%
+ /xy444mul{4 copy 24 4 roll 12 -4 roll 16 4 roll 4 copy 16 4 roll
+ xy44mul 20 8 roll xy44mul
+ 12 -4 roll 4 -1 roll 7 1 roll exch 4 1 roll exch 6 -1 roll exch
+ 4 2 roll 16 8 roll 8 4 roll
+ 4 -1 roll 7 1 roll exch 4 1 roll exch 6 -1 roll exch 4 2 roll
+ 8 4 roll 16 4 roll 8 4 roll 20 -4 roll exch 3 1 roll
+ 4 copy 20 4 roll 4 copy 16 4 roll 4 copy 12 4 roll
+ xy4mul 28 4 roll xy4mul 20 4 roll xy4mul 12 4 roll xy4mul}def
+}%
+\PSdict@@{%
+ /squineedge{8 2 roll
+ exch 5 1 roll 3 -1 roll dup 6 2 roll 1 index exch
+ 10 -2 roll 2 copy 1 sub neg 4 1 roll 1 sub neg exch 4 1 roll
+ xy44mul 4 1 roll pop 5 1 roll 6 1 roll 3 -1 roll pop}def
+}%
+\PSdict@@{%
+ /xyshort{2 copy abs exch abs add xysegl .5 mul lt
+ {pop pop grestore}{rlineto xystroke}ifelse}def
+}%
+\PSdict@@{%
+ /tipwidth{xywidth xynormwidth dup currentlinewidth exch div
+ sqrt dup dup scale mul setlinewidth 1 setlinecap}def
+}%
+\PSdict@@{%
+ /halftip{tipwidth xysize 10 div 0 0 moveto
+ -.25 0 3 -1 roll -2.5 mul 0 xysize 2 div neg
+ dup .62 mul 2 div neg curveto}bind def
+}%
+\PSdict@@{/atip{gchksavexy halftip xystroke}def
+ /btip{gchksavexy xyopp halftip xystroke}def
+ /tip{gchksavexy gsave halftip stroke grestore
+ xyopp halftip xystroke}def
+ /t /tip load def /a /atip load def /b /btip load def}%
+\PSdict@@{/cmatip{gchksavexy halfcmtip xystroke}def
+ /cmbtip{gchksavexy xyopp halfcmtip xystroke}def
+ /cmtip{gchksavexy gsave halfcmtip stroke grestore
+ xyopp halfcmtip xystroke}def
+ /halfcmtip{tipwidth 0 0 moveto
+ -.1333 0 .25 neg dup .125 3 -1 roll .25 curveto}bind def
+ /ct /cmtip load def /ca /cmatip load def /cb /cmbtip load def}%
+\PSdict@@{%
+ /xyfscale{/xyfsize exch def}def /xyfsize{10}def
+ /eu{-0.0551 0.0643 -0.0976 0.1386 -0.125 0.2188}def
+ /cm{-0.105 0.0437 -0.1804 0.1380 -0.2 0.25}def
+ /XY{-0.1753 0.0181 -0.3452 0.0708 -0.5 0.155}def
+ /tipstart{3 -1 roll gchksavexy exch xyfscale tipwidth dup XYdict exch
+ known{dup /xy eq{pop /XY}if}{pop /XY}ifelse XYdict exch get}def
+ /tipend{halfxytip xystroke}def
+ /halfxytip{1 1 6{pop xyfsize mul 6 1 roll}for 0 0 moveto curveto}def
+ /A{tipstart D}def /B{tipstart C}def /C{xyopp D}def /D{exec tipend}def
+ /AB{tipstart dup gsave exec halfxytip stroke grestore C}def
+}%
+\PSdict@@{%
+ /Tip{exch gchksavexy /xyfsize{10}def tipwidth gsave
+ dup XYdict exch known{dup /xy eq{pop /XT}if}{pop /XT}ifelse
+ XYdict exch get dup
+ halfTip stroke grestore xyopp halfTip xystroke}def
+ /XT{360 32 div neg}def /Xt{-1 .31 mul 1 atan}def
+ /ET{360 64 div 5 mul neg}def /Et{-1 .31 mul 1 atan}def
+ /halfTip{exec rotate XY halfxytip}def /halfTtip{halfTip}def
+ /Ttip{exch gchksavexy /xyfsize{10}def tipwidth gsave
+ dup XYdict exch known{dup /xy eq{pop /Xt}if}{pop /Xt}ifelse
+ XYdict exch get dup
+ halfTtip stroke grestore xyopp halfTtip xystroke}def
+ /tt /Tip load def /tT /Ttip load def}%
+\PSdict@@{/halfturn{xysegl 2 div dup dup neg exch rmoveto
+ 0 exch dup exch -180 -90 arc}bind def
+ /aturn{gchksavexy halfturn xystroke}def
+ /bturn{gchksavexy xyopp halfturn xystroke}def
+ /ta /aturn load def /tb /bturn load def}%
+\dimen@=\xybsqll@\relax\count@=\dimen@%
+\PSdict@@{%
+ /xysqll \the\count@\space dimendiv def
+ /squigl{gchksavexy xysqll dup neg 0 rmoveto
+ 2 div dup dup neg dup 3 -1 roll
+ 2 sqrt mul dup 5 1 roll
+ 135 45 arcn dup 3 -1 roll -135 -45 arc
+ xystroke}def
+ /g /squigl load def}%
+\PSdict@@{/fullhook{0 xysegl 2 div dup -90 90 arcn}bind def
+ /halfhook{xysegl 2 div dup 0 exch 180 90 arcn}bind def
+}%
+\PSdict@@{/ahook{gchksavexy fullhook xystroke}def
+ /bhook{gchksavexy xyopp fullhook xystroke}def
+ /hook{gchksavexy gsave halfhook stroke grestore
+ xyopp halfhook xystroke}def
+ /h /hook load def /ha /ahook load def /hb /bhook load def}%
+\PSdict@@{%
+ /xyqcirc{dup dup neg exch translate newpath
+ dup neg 0 exch moveto 0 0 3 -1 roll -90 0 arc}bind def
+}%
+\PSdict@@{%
+ /circ{gstartxy
+ 3 copy pop 2 copy cos mul 3 1 roll sin mul
+ rmoveto 0 0 5 2 roll arc xystroke}bind def
+ /o /circ load def}%
+\PSdict@@{%
+ /circhar{gsave dup 3 gt{7 sub neg}if dup
+ 3 eq{pop dup 2 sqrt -2 div mul}{dup 1 eq{pop dup 2 sqrt 2 div mul}
+ {0 eq{dup}{0}ifelse}ifelse}ifelse
+ 0 translate 3 1 roll circ grestore}bind def
+ /c /circhar load def}%
+\PSdict@@{end end}%
+\endgroup%
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xypspatt.tex b/macros/generic/diagrams/xypic/texinputs/xypspatt.tex
new file mode 100644
index 0000000000..927ad08c11
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xypspatt.tex
@@ -0,0 +1,104 @@
+%% xypspatt.tex from $Id: xypspatt.doc,v 3.11 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``PostScript pattern prolog''.
+%% Copyright (c) 1995-1998 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\begingroup \xycatcodes \xyPSobeylines@@%
+\PSdict@@{/XYdict where pop begin XYdict begin}%
+\PSdict@@{/:patt
+{XYddict begin
+14 dict begin
+/BGnd exch def
+/FGnd exch def
+/PaintData exch def
+/PatternType 1 def
+/PaintType 1 def
+/BBox[0 0 1 1]def
+/TilingType 1 def
+/XStep 1 def
+/YStep 1 def
+/PatternMtx[24 0 0 24 0 0]def
+/PaintProc BGnd null ne
+ {{begin BGnd aload pop setrgbcolor 0 0 1 1 rF
+ FGnd aload pop setrgbcolor
+ 24 24 true PatternMtx PaintData imagemask end}}
+ {{begin FGnd aload pop setrgbcolor
+ 24 24 true PatternMtx PaintData imagemask end}}
+ ifelse def
+ currentdict PatternMtx end
+ gsave patangle xyland{180 add}if
+ rotate macfreq patfreq div dup neg exch scale matrix currentmatrix
+ grestore gsave setmatrix /DeviceRGB setcolorspace makepattern grestore
+ end}def}%
+\PSdict@@{%
+/rF{gsave
+ newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ fill grestore}bind def }%
+\PSdict@@{%
+ /setpatscreen{/pattstring exch store patfreq
+ patangle xyport not{90 add}if
+ {1 add 4 mul cvi pattstring exch get exch 1 add 4 mul cvi 7 sub
+ bitshift 1 and}setscreen}bind def
+ /setcolpattern{setpatscreen 64 div 1 exch sub currentrgbcolor
+ 1 1 3{pop 1 exch sub 3 index mul 1 exch sub 3 1 roll}for
+ setrgbcolor pop}def
+ /setgraypattern{setpatscreen 64 div setgray}def
+ /macfreq 9.375 def /patangle 0 def /patfreq 12.5 def}%
+\PSdict@@{/checkland{%
+ /normland where{pop normland not}{false}ifelse
+ /xyland exch def
+ /por where{pop por}{/isls where{pop isls not /xyland true def}
+ {/land where{pop land not}{true}
+ ifelse}ifelse}ifelse /xyport exch def}def }%
+\PSdict@@{%
+ /setpatfreq{/patfreq exch def}def
+ /setpatangle{/patangle exch def}def
+ /setbackcolor{/backcolor exch def}def
+ /setforecolor{/forecolor exch def}def
+ [1 1 1] setbackcolor xycolarray setforecolor
+ /bg /setbackcolor load def /fg /setforecolor load def
+ /pa /setpatangle load def /pq /setpatfreq load def }%
+\PSdict@@{%
+ /xypattern{checkland counttomark dup 0 eq{pop}
+ {dup 1 eq{pop setpatscreen}
+ {dup 2 eq{pop setcolpattern}
+ {dup 3 eq{pop
+ /setcolorspace where {
+ /.setcolorspace where{pop pop pop setcolpattern}
+ {/.buildpattern where {pop
+ forecolor backcolor :patt setpattern
+ }{pop pop setcolpattern}ifelse}ifelse}
+ {pop setcolpattern}ifelse}
+ {5 eq{/setcolorspace where{
+ /.setcolorspace where{pop pop pop pop pop setcolpattern}
+ {/.buildpattern where {pop
+ :patt setpattern
+ }{pop pop pop pop setcolpattern}ifelse}ifelse}
+ {pop pop pop setcolpattern}ifelse
+ }{}ifelse}ifelse}ifelse}ifelse}ifelse cleartomark }def
+ /xysetpattern{/xypatt exch def}def
+ /sp /xysetpattern load def }%
+\PSdict@@{end end}%
+\endgroup%
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyrecat.tex b/macros/generic/diagrams/xypic/texinputs/xyrecat.tex
new file mode 100644
index 0000000000..a70f24e5c4
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyrecat.tex
@@ -0,0 +1,36 @@
+%% xyrecat.tex from $Id: xyrecat.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Reset Category Codes'' utility.
+%% Copyright (c) 1994-1996 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\xyuncatcodes
+\xyrecat @ 64 \catcode 64 11
+\xymakeADD@\addHASH@ # 35
+\xymakeADD@\addDOLL@ $ 36
+\xymakeADD@\addAND@ & 38
+\xymakeADD@\addRQ@ ' 39
+\xymakeADD@\addPLUS@ + 43
+\xymakeADD@\addDASH@ - 45
+\xymakeADD@\addDOT@ . 46
+\xymakeADD@\addLT@ < 60
+\xymakeADD@\addEQ@ = 61
+\xymakeADD@\addGT@ > 62
+\xymakeADD@\addLQ@ ` 96
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyrotate.tex b/macros/generic/diagrams/xypic/texinputs/xyrotate.tex
new file mode 100644
index 0000000000..302e8819d0
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyrotate.tex
@@ -0,0 +1,161 @@
+%% xyrotate.tex from $Id: xyrotate.doc,v 3.8 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Rotate and Scale extension'' option.
+%% Copyright (c) 1993-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{rotate}{Rotate and Scale extension}{\stripRCS$Revision: 3.8 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\xyundefinedRotate@#1#2@@{%
+ \xywarning@{The #1 #2 effect is not implemented with the current driver.}}%
+\xydef@\NoResizing{\xyNoResizing@}
+\xydef@\UseResizing{\xyUseResizing@}
+\xydef@\xyNoResizing@{%
+ \global\let\origxyrescale@=\xyrescale@
+ \global\let\origxyrotSizeMod@=\xyrotateSizeMod@
+ \global\let\xyNoResizing@=\xyNoResizing@@
+ \global\let\xyUseResizing@=\xyUseResizing@@
+ \xyNoResizing@@ }
+\xydef@\xyNoResizing@@{%
+ \global\let\xyrescale@=\xyignorescale@
+ \global\let\xyrotateSizeMod@=\xyignoreSizeMod@
+ }
+\xylet@\xyUseResizing@=\relax
+\xydef@\xyUseResizing@@{%
+ \global\let\xyrescale@=\origxyrescale@
+ \global\let\xyrotateSizeMod@=\origxyrotSizeMod@
+ }
+\xydefcsname@{shape [@...]}#1{\xyrotatechar@#1@@}%
+\xydefcsname@{shape [<...]}#1{\xyshearchar@{#1}@@}%
+\xydefcsname@{shape [*...]}#1{\xyscalechar@{#1}@@}%
+\xydefcsname@{shape [left]}{\xyshape@left@}
+\xydefcsname@{shape [right]}{\xyshape@right@}
+\xydefcsname@{shape [flip]}{\xyshape@flip@}
+\xydefcsname@{shape [halfsize]}{\xyshape@halfsize@}
+\xydefcsname@{shape [dblsize]}{\xyshape@dblsize@}
+\xydefcsname@{shape [vflip]}{\xyshape@vflip@}
+\xydefcsname@{shape [hflip]}{\xyshape@hflip@}
+\xydef@\preXYtransform@{}
+\xydef@\postXYtransform@{}
+\xywarnifdefined\preXYtransform@@
+\xywarnifdefined\postXYtransform@@
+ \gdef\preXYtransform@@{}
+ \gdef\postXYtransform@@{}
+\xydef@\xy@transform@{}
+\xydef@\preShape@@{}
+\xydef@\postShape@@{}
+\xydef@\modXYtransform@{%
+ \ifx\xy@transform@\empty
+ \transformDrop@\transformConnect@\resetTransform@\fi
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\preShape@@}%
+ \DN@##1{\expandafter\gdef\expandafter\preXYtransform@@\expandafter{%
+ \tmp@ ##1}}\expandafter\next@\expandafter{\preXYtransform@@}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\postShape@@}%
+ \DN@##1{\expandafter\gdef\expandafter\postXYtransform@@\expandafter{%
+ \postXYtransform@@ ##1}}\expandafter\next@\expandafter{\tmp@}}%
+\xydef@\transformDrop@{\let\xy@transform@=\relax
+ \expandafter\def\expandafter\Drop@@\expandafter{%
+ \expandafter\preXYtransform@\Drop@@\postXYtransform@}}
+\xydef@\transformConnect@{\let\xy@transform@=\relax
+ \expandafter\def\expandafter\Connect@@\expandafter{%
+ \expandafter\preXYtransform@\Connect@@\postXYtransform@}}
+\xydef@\resetTransform@{\gdef\preXYtransform@@{}\gdef\postXYtransform@@{}}
+\xydef@\xynametransform@#1{%
+ \DN@{\expandafter\gdef\expandafter#1\expandafter{\the\toks@}}\next@ }
+\xydef@\xyscalechar@#1@@{\xyscalechars@#1,#1,@@}
+\xydef@\xyscalechars@#1,#2,#3@@{%
+ \DN@{\xyrescale@(#1,#2)}%
+ \dimen@=#1\p@
+ \ifdim\dimen@>\z@ \else \ifdim\dimen@<\z@ \else
+ \DN@{\xywarning@{invalid scaling factors #1, #2}}%
+ \fi\fi \dimen@=#2\p@
+ \ifdim\dimen@>\z@ \else \ifdim\dimen@<\z@ \else
+ \DN@{\xywarning@{invalid scaling factors #1, #2 }}%
+ \fi\fi \next@ }
+\xydef@\xyrescale@(#1,#2){%
+ \setboxz@h{\xyscale@@{#1}{#2}%
+ \dimen@=\ifx-#1\R@c\advance\dimen@-\R@c \dimen@=-\dimen@
+ \else#1\L@c \advance\dimen@-\L@c\fi
+ \kern\dimen@\boxz@\kern-\dimen@}%
+ \R@c=\if-#1\L@c\else#1\R@c\fi
+ \L@c=\if-#1\R@c\else#1\L@c\fi
+ \U@c=\if-#2\D@c\else#2\U@c\fi
+ \D@c=\if-#2\U@c\else#2\D@c\fi }
+\xydef@\xyignorescale@(#1,#2){\xywarning@{Ignoring rescale: #1,#2}%
+ \setboxz@h{\xyscale@@{#1}{#2}\boxz@}}%
+\xydef@\xyshape@halfsize@{\xyrescale@(.5,.5)}
+\xydef@\xyshape@dblsize@{\xyrescale@(2,2)}
+\xydef@\xyshape@flip@{\xyrescale@(-1,-1)}
+\xydef@\xyshape@vflip@{\xyrescale@(1,-1)}
+\xydef@\xyshape@hflip@{\xyrescale@(-1,1)}
+\xydef@\xyrotatechar@{\bgroup
+ \afterDIRECTIONorEMPTY{\xyrotateSizeMod@}{\xyFN@\xySpecialRotate@i}}
+\xydef@\xySpecialRotate@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xySpecialRotate@i}%
+ \else\ifx @\next \let\next@=\xyrotateSizeMod@
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@##1@@{%
+ \expandafter\xynametransform@\csname shape [##1]\endcsname\egroup}%
+ \else\ifx !\next \DN@!{\egroup\getSpecialRotate@}%
+ \else\ifx *\next \DN@*@@{\egroup\transformDrop@}%
+ \else \DN@{\xySpecialRotate@@}%
+ \fi\fi\fi\fi\fi \next@ }
+\xydef@\getSpecialRotate@{\doSpecialRotate@@}
+\xydef@\xyRotate@#1{\xyundefinedRotate@{rotate}{#1}@@}
+\xydef@\xySpecialRotate@#1@@{\xyundefinedRotate@{rotate}{#1}@@\egroup}
+\xydef@\doSpecialRotate@#1@@{\xyundefinedRotate@{special rotate}{#1}@@}
+\xydef@\xyscale@#1#2{\xyundefinedRotate@{scale}{#1,#2}@@}
+\xydef@\UnloadRotate@#1{%
+ \ifx#1\relax\else\xyunload@{rotation extension}\fi
+ \let\xyRotate@@=\xyRotate@
+ \let\xySpecialRotate@@=\xySpecialRotate@
+ \let\doSpecialRotate@@=\doSpecialRotate@
+ \let\xyscale@@=\xyscale@ }
+\UnloadRotate@\relax
+\xyaddunsupport{rotate}{\UnloadRotate@\relax}
+\xydef@\xyrotateSizeMod@ @@{%
+ \L@p=\L@c \R@p=\R@c \U@p=\U@c \D@p=\D@c
+ \ifdim\cosDirection\p@>\z@
+ \R@c=\cosDirection\R@p \L@c=\cosDirection\L@p
+ \U@c=\cosDirection\U@p \D@c=\cosDirection\D@p
+ \else
+ \R@c=\cosDirection\L@p \L@c=\cosDirection\R@p
+ \U@c=\cosDirection\D@p \D@c=\cosDirection\U@p
+ \fi
+ \advance\L@c \if-\sinDirection\D@p\else\sinDirection\U@p\fi
+ \advance\R@c \if-\sinDirection\U@p\else\sinDirection\D@p\fi
+ \advance\U@c \if-\sinDirection\L@p\else\sinDirection\R@p\fi
+ \advance\D@c \if-\sinDirection\R@p\else\sinDirection\L@p\fi
+ \dimen@ii=\L@c \advance\dimen@ii-\L@p
+ \edef\tmp@{\egroup \L@c=\the\L@c \R@c=\the\R@c \U@c=\the\U@c \D@c=\the\D@c
+ \dimen@ii=\the\dimen@ii \noexpand\setboxz@h\bgroup
+ \noexpand\xyRotate@@{\the\Direction}}\tmp@
+ \xydropRotated@ }
+\xydef@\xydropRotated@@{%
+ \kern\dimen@ii \boxz@ \kern-\dimen@ii \modXYtransform@ \egroup }
+\xylet@\xydropRotated@=\xydropRotated@@
+\xydef@\xyignoreSizeMod@ @@{\xywarning@{Ignoring rotation}}
+\xydef@\xyshape@left@{\xyrotatechar@ v(0,1)@@}
+\xydef@\xyshape@right@{\xyrotatechar@ v(0,-1)@@}
+\xydef@\xyshearchar@{\xyundefinedRotate@{shearing}}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xysmart.tex b/macros/generic/diagrams/xypic/texinputs/xysmart.tex
new file mode 100644
index 0000000000..e98c281f4e
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xysmart.tex
@@ -0,0 +1,320 @@
+%% xysmart.tex from $Id: xysmart.doc,v 3.6 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Smart Path feature'' option.
+%% Copyright (c) 1998 George C. Necula <necula@cs.cmu.edu>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{smart}{Smart Path option}{\stripRCS$Revision: 3.6 $}%
+ {George C. Necula}{necula@cs.cmu.edu}%
+ {School of Computer Science,
+ Carnegie Mellon University,
+ 5000 Forbes Avenue,
+ Pittsburgh, PA 15213-3891, USA}
+\xyrequire{arrow}\xycatcodes
+\let\origPATHturn@=\PATHturn@
+\def\PATHturn@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHturn@}%
+ \else\ifx s\next
+ \let\origPATHturn@i=\PATHturn@i\let\PATHturn@i=\PATHsmartturn@i
+ \let\origPATHturn@cir=\PATHturn@cir\let\PATHturn@cir=\PATHsmartturn@cir
+ \DN@ s{\xyFN@\origPATHturn@}%
+ \else
+ \DN@{\origPATHturn@}%
+ \fi\fi
+ \next@}
+\xydef@\PATHsmartturn@cir{%
+ \edef\next@{{\CIRin@@}{\expandafter\noexpand\CIRorient@@}{\CIRout@@}}%
+ \expandafter\PATHturn@i\next@}
+\xydef@\PATHsmartturn@i#1#2#3{%
+ \DN@##1{%
+ \def\PATHinit@@{%
+ \xy@@{%
+ \def\sm@CIRin{#1}\def\sm@CIRout{#3}%
+ \ifx\sm@CIRout\empty
+ \let\sm@CIRout=\sm@CIRin
+ \let\sm@CIRin=\PATHlastout@@
+ \fi
+ ##1\relax}%
+ \xy@@{\enter@{\basefromthebase@}}%
+ \xy@@{\sm@conn}%
+ \xy@@{\X@p=\X@c \Y@p=\Y@c \czeroEdge@% Save the start of the segment
+ \count@=\sm@CIRout\count@=\the\count@% Move forward a dash to
+ \dimen@=\xydashl@ \ABfromdiag@ \advance\X@c\A@ \advance\Y@c\B@
+ \edef\PATHpostpos@@{\X@c=\the\X@c \Y@c=\the\Y@c \noexpand\czeroEdge@
+ \noexpand\PATHomitslide@@true}}%
+ \xy@@{\leave@
+ \edef\PATHlastout@@{\sm@CIRout}%
+ \count@=\sm@CIRout \dimen@=\xydashl@ \Directionfromdiag@}}}%
+ \expandafter\next@\expandafter{\the\toks@}\toks@={}%
+ \let\PATHextra@@=\empty
+ \def\PATHpost@@{\xy@@\PATHpostpos@@}%
+ \let\PATHlabelsextra@@=\relax
+ \let\PATHturn@i=\origPATHturn@i
+ \let\PATHturn@cir=\origPATHturn@cir
+ \xyFN@\PATHturn@ii}
+\xydef@\sm@nil{}
+\xydef@\sm@nnil{\sm@nil}
+\xydef@\sm@maxcost{1000mm}%
+\xydef@\sm@conn{
+ \enter@{\cfromthec@ \DirectionfromtheDirection@}\cfromp@% Adjust p
+ \count@=\sm@CIRin\count@=\the\count@
+ \dimen@=\xydashl@ \ABfromdiag@ \advance\X@p\A@\advance\Y@p\B@
+ \setupDirection@ \the\Edge@c\z@ \czeroEdge@
+ \pfromc@
+ \reverseDirection@
+ \count@=\sm@CIRin\count@=\the\count@
+ \dimen@=\xydashl@ \ABfromdiag@
+ \edef\tmp@{\noexpand\dir\artail@@}\expandafter\sm@drop@\tmp@
+ \X@c=\X@p\advance\X@c\A@ \Y@c=\Y@p\advance\Y@c\B@ \czeroEdge@
+ \sm@stri
+ \X@p=\X@c \Y@p=\Y@c
+ \leave@
+ \enter@{\pfromthep@ \DirectionfromtheDirection@}\pfromc@% Adjust c
+ \count@=\sm@CIRout\count@=\the\count@
+ \dimen@=\xydashl@ \ABfromdiag@ \advance\X@p-\A@\advance\Y@p-\B@
+ \setupDirection@ \the\Edge@c\z@
+ \advance\X@c-\A@\advance\Y@c-\B@% Leave room for a dash to terminate the seg
+ \czeroEdge@
+ \def\PATHlabelsnext@@{}%
+ \leave@
+ \R@=\turnradius@
+ \cirrestrict@@%Adjust the radius to fit the circles
+ \let\sm@circles=\sm@nil
+ \edef\sm@bestcost{\sm@maxcost}%
+ \sm@trycircles 1%Try counter clockwise first
+ \sm@trycircles{-1}%
+ \ifdim\sm@bestcost<\sm@maxcost
+ \cfromp@
+ \expandafter\sm@conndraw\sm@bestconn
+ \else
+ \xyerror@{Cannot draw the smart connector}{}%
+ \fi
+}
+\xydef@\sm@trycircles#1{%
+ \ifnum #1>0% Compute the opposite orientation
+ \def\sm@CIRorienti{-1}%
+ \else
+ \def\sm@CIRorienti{1}%
+ \fi
+ \edef\tmp@{{{\sm@CIRin}{#1}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+ \count@@=\sm@CIRin\count@@=\the\count@@\count@=\count@@
+ \sm@roundcount@{#1}%
+ \edef\sm@savecount@{\the\count@}%
+ \ifnum\the\count@=\the\count@@ \else
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+ \fi
+ \count@=\sm@savecount@\count@=\the\count@
+ \sm@advancecount@ 2{#1}\edef\sm@savecount@{\the\count@}%
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+ \count@=\sm@savecount@\count@=\the\count@
+ \sm@advancecount@ 2{#1}\edef\sm@savecount@{\the\count@}%
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+ \count@=\sm@savecount@\count@=\the\count@
+ \sm@advancecount@ 2{#1}\edef\sm@savecount@{\the\count@}%
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+}
+\xydef@\sm@advancecount@#1#2{%
+ \ifnum #2>0
+ \edef\tmp@{#1}%
+ \else
+ \edef\tmp@{-#1}%
+ \fi
+ \advance\count@\tmp@\count@=\the\count@
+ \ifnum\the\count@<0 \advance\count@ 8\fi
+ \ifnum\the\count@>7 \advance\count@ -8\fi
+ \count@=\the\count@
+}
+\xydef@\sm@roundcount@#1{%
+ \ifcase\the\count@
+ \advance\count@ #1\or
+ \or \advance\count@ #1\or
+ \or \advance\count@ #1\or
+ \or \advance\count@ #1\fi
+ \count@=\the\count@
+ \ifnum\the\count@<0 \advance\count@ 8\fi
+ \ifnum\the\count@>7 \advance\count@ -7\fi
+ \count@=\the\count@
+}
+\newif\ifsm@firstseg
+\newif\ifsm@acceptable
+\xydef@\sm@trycirclelist#1{%
+ \R@p=\z@\U@p=\R@p% Clear the deltas
+ \def\sm@exthp{0}\def\sm@exthm{0}%
+ \def\sm@extvp{0}\def\sm@extvm{0}%
+ \def\sm@dxp{0pt}\def\sm@dxm{0pt}%
+ \def\sm@dyp{0pt}\def\sm@dym{0pt}%
+ \def\sm@segs{}%
+ \sm@firstsegtrue
+ \def\sm@connlen{0pt}%
+ \let\sm@tryclcont=\sm@trycirclelist@i
+ \sm@trycirclelist@i #1%Strip {} to expose the list elements
+ \count@@=\sm@CIRout\count@@=\the\count@\count@=\the\count@
+ \sm@roundcount@{1}%
+ \ifnum\count@=\count@@
+ \edef\sm@segs{\sm@segs{{\the\count@}{1}{\the\count@}}}%
+ \fi
+ \A@=\X@p\advance\A@\R@p\advance\A@ -\X@c\A@=-\A@
+ \B@=\Y@p\advance\B@\U@p\advance\B@ -\Y@c\B@=-\B@
+ \sm@acceptabletrue
+ \ifdim\A@>0pt
+ \ifnum\sm@exthp>0 \dimen@=\A@ \divide\dimen@\sm@exthp
+ \edef\sm@dxp{\the\dimen@}%
+ \else \sm@acceptablefalse\fi\fi
+ \ifdim\A@<0pt
+ \ifnum\sm@exthm>0 \dimen@=\A@ \divide\dimen@\sm@exthm
+ \edef\sm@dxm{\the\dimen@}%
+ \else \sm@acceptablefalse\fi
+ \A@=-\A@%Make it positive
+ \fi
+ \ifdim\B@>0pt
+ \ifnum\sm@extvp>0 \dimen@=\B@ \divide\dimen@\sm@extvp
+ \edef\sm@dyp{\the\dimen@}%
+ \else \sm@acceptablefalse\fi\fi
+ \ifdim\B@<0pt
+ \ifnum\sm@extvm>0 \dimen@=\B@ \divide\dimen@\sm@extvm
+ \edef\sm@dym{\the\dimen@}%
+ \else \sm@acceptablefalse\fi
+ \B@=-\B@
+ \fi
+ \ifsm@acceptable
+ \dimen@=\sm@connlen\advance\dimen@\A@\advance\dimen@\B@
+ \ifdim\dimen@<\sm@bestcost
+ \edef\sm@bestcost{\the\dimen@}%
+ \edef\sm@bestconn{{\sm@dxp}{\sm@dxm}{\sm@dyp}{\sm@dym}{\sm@segs}}%
+ \fi
+ \fi
+}
+\xydef@\sm@showext#1{%
+ \W@{#1\space hp=\sm@exthp,hm=\sm@exthm,vp=\sm@extvp
+ ,vm=\sm@extvm,len=\sm@connlen}}
+\xydef@\sm@trycirclelist@i#1{%
+ \def\@tmp{#1}%
+ \ifx \@tmp\sm@nnil \let\sm@tryclcont=\relax\else
+ \expandafter\sm@tryclcar\@tmp \fi
+ \sm@tryclcont}
+\xydef@\sm@tryclcar#1#2#3{%
+ \dimen@=\ifnum #2<0 -\fi\R@
+ \count@=#1\count@=\the\count@ \ABfromdiag@
+ \advance\R@p -\B@ \advance\U@p \A@
+ \count@=#3\count@=\the\count@ \ABfromdiag@
+ \advance\R@p \B@ \advance\U@p -\A@
+ \sm@computeext{#1}{#2}{#3}%
+}
+\xydef@\sm@computeext#1#2#3{%
+ \ifsm@firstseg
+ \sm@accumext#1%
+ \sm@firstsegfalse
+ \fi
+ \count@@=#1\count@@=\the\count@@\count@=\count@@
+ \dimen@=\sm@connlen
+ \sm@roundcount@{#2}%
+ \ifnum \count@=\count@@
+ \sm@advancecount@ 1{#2}%
+ \advance\dimen@ 0.7854\R@% It was incremented with 1/8 circle
+ \ifnum \count@=#3% Check if done
+ \else
+ \sm@advancecount@ 1{#2}%
+ \advance\dimen@ 0.7854\R@% It was incremented with 1/8 circle
+ \fi
+ \else
+ \advance\dimen@ 0.7854\R@% It was incremented with 1/8 circle
+ \fi
+ \edef\sm@connlen{\the\dimen@}%
+ \sm@accumext{\the\count@}%
+ \edef\sm@segs{\sm@segs{{#1}{#2}{\the\count@}}}%
+ \ifnum\the\count@=#3 \else
+ \edef\tmp@{{\the\count@}{#2}{#3}}%
+ \expandafter\sm@computeext\tmp@
+ \fi
+}
+\xydef@\sm@accumext#1{%
+ \ifcase #1%
+ \or \count@@=\sm@extvm\advance\count@@ by1%
+ \edef\sm@extvm{\the\count@@}%
+ \or\or \count@@=\sm@exthp\advance\count@@ by1%
+ \edef\sm@exthp{\the\count@@}%
+ \or\or \count@@=\sm@extvp\advance\count@@ by1%
+ \edef\sm@extvp{\the\count@@}%
+ \or\or \count@@=\sm@exthm\advance\count@@ by1%
+ \edef\sm@exthm{\the\count@@}%
+ \fi
+}
+\xydef@\sm@conndraw#1#2#3#4#5{%
+ \def\sm@contlist{\sm@drawseglist}%
+ \edef\sm@dxp{#1}%
+ \edef\sm@dxm{#2}%
+ \edef\sm@dyp{#3}%
+ \edef\sm@dym{#4}%
+ \sm@drawseglist #5\sm@nil}
+\xydef@\sm@drawseglist#1{%
+ \ifx #1\sm@nil \def\sm@contlist{}\else
+ \sm@drawseg #1\fi
+ \sm@contlist}
+\xydef@\sm@drawseg#1#2#3{%
+ \def\CIRin@@{#1}\def\CIRout@@{#3}%
+ \sm@straight%See if a straight line is needed here. Insert it and
+ \ifnum\CIRin@@=\CIRout@@ \else
+ \count@=\CIRin@@
+ \dimen@=\ifnum #2<0 -\fi\R@
+ \ABfromdiag@
+ \advance\X@c -\B@ \advance\Y@c \A@
+ \ifnum #2>0 \def\CIRorient@@{\CIRacw@}%
+ \else \def\CIRorient@@{\CIRcw@}\fi
+ \drop@\literal@{\hbox\bgroup\cir@i}%
+ \dimen@=\ifnum #2<0 -\fi\R@
+ \count@=\CIRout@@\count@=\count@%Wierd. If I remove this last assignm
+ \ABfromdiag@
+ \advance\X@c\B@ \advance\Y@c-\A@
+ \fi
+}
+\xydef@\sm@straight{%
+ \U@c=\z@\D@c=\U@c\L@c=\U@c\R@c=\U@c
+ \pfromc@
+ \ifcase \CIRin@@ \or% 1 is V-
+ \A@=\sm@dym\advance \Y@c\A@
+ \or\or
+ \A@=\sm@dxp\advance \X@c\A@
+ \or\or
+ \A@=\sm@dyp\advance \Y@c\A@
+ \or\or
+ \A@=\sm@dxm\advance \X@c\A@ \fi
+ \ifdim\X@c=\X@p\ifdim\Y@c=\Y@p\else \sm@stri \fi\else \sm@stri \fi
+}
+\xydef@\sm@stri{%
+ \edef\tmp@{\expandafter\noexpand\arstemprefix@@\arstem@@}%
+ \expandafter\sm@connect@\tmp@}
+\xydef@\sm@connect@#1#{%
+ \DN@##1{\connect@{#1}{##1}}\next@}
+\xydef@\sm@drop@#1#{%
+ \DN@##1{\drop@{#1}{##1}}\next@}
+\xydef@\smconn#1#2#3{%
+ \edef\sm@CIRin{#1}\edef\sm@CIRout{#2}%
+ \R@=#3\R@=\the\R@
+ \sm@conn}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xytextures.tex b/macros/generic/diagrams/xypic/texinputs/xytextures.tex
new file mode 100644
index 0000000000..e69f1de5f2
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xytextures.tex
@@ -0,0 +1,123 @@
+%% xytextures.tex from $Id: xytextures.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Textures'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{textures}{Textures driver}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\Textures@@#1{\dvimessage@{Textures}{#1}}
+\newdriver{%
+ \xyaddsupport{color}\texturesColor@@
+ \xyaddsupport{crayon}\texturesCrayon@@
+ \xyaddsupport{ps}\texturesPS@@
+ \xyaddsupport{rotate}\texturesRotate@@
+ \xyaddsupport{line}\texturesLine@@
+ \xyaddsupport{frame}\texturesFrames@@
+ \xyaddsupport{tile}\texturesTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\xydef@\TexturesColor@push#1{\special{color push}\special{color #1}}
+\xydef@\TexturesColours@{\texturesPStypes@
+ \let\xylocalColor@=\xystackcolor@
+ \let\xycolor@push=\TexturesColor@push
+ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\texturesCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@ \fi \next@
+ \let\xycolorwarning@=\relax \Textures@@{color}%
+ \let\texturesColor@@=\relax
+ \let\UnloadColor@@=\NoTexturesColor@
+ }
+\xydef@\texturesColor@@{\TexturesColours@}
+\xydef@\NoTexturesColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\texturesColor@@=\TexturesColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\xydef@\texturesCrayon@@{\texturesColor@@\texturesCrayon@}
+\xydef@\texturesCrayon@{\installCrayolaColors@}%
+\xydef@\texturesPS@@{\texturesPS@}
+\xydef@\texturesPSunload@{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\texturesPS@@=\texturesPS@ }
+\xydef@\texturesPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\TexturesSpecial@\else
+ \let\PSspecial@@=\TexturesSpecial@
+ \let\PSmacro@@=\TexturesMacro@
+ \let\PSdict@@=\TexturesDict@
+ \let\PSraw@@=\TexturesRaw@
+ \let\PSinclude@@=\TexturesInclude@
+ \let\PSspecialdict@@=\TexturesSpecialDict@
+ \let\xyPSobeylines@@=\obeyTextureslines@
+ \Textures@@{PostScript}%
+ \fi \texturesCurrpt@ \XYpredict@ }
+\xydef@\TexturesSpecial@#1{\firstPS@@\special{postscript #1}}
+\xydef@\TexturesMacro@#1{\special{postscript {#1}xy}}
+\xydef@\TexturesDict@#1{\special{prePostScript #1}}
+\xydef@\TexturesSpecialDict@#1{\special{prePostScript #1}}
+\xydef@\TexturesInclude@#1{\firstPS@@\special{prePostScriptfile #1}}
+\xydef@\TexturesRaw@#1{\firstPS@@\special{rawpostscript #1}}%
+{\catcode`\^^M=\active%
+ \gdef\next{\catcode`\^^M=\active \let^^M=\par%
+ \let\PSspecial@@=\TexturesDict@ \obeyspaces}}
+\xylet@\obeyTextureslines@=\next
+\xydef@\texturesCurrpt@{\let\xyPScurrpt@@=\texturesCurrpt@@}%
+\xydef@\texturesCurrpt@@{\PSspecial@@{xyi}\PSraw@@{userdict begin xyx end}}
+\xydef@\texturesPS@{\texturesPStypes@
+ \let\texturesPS@@=\relax
+ \let\UnloadPS@@=\texturesPSunload@
+ \let\installxyps@@=\relax \installxyps@ }
+\xydef@\texturesRotate@@{\texturesRotate@}
+\xydef@\texturesRotate@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xyRotScale@@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@}
+\xydef@\texturesLine@@{\texturesLine@}
+\xydef@\texturesLine@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}%
+ \installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\xydef@\texturesFrames@@{\texturesFrames@}
+\xydef@\texturesFrames@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}%
+ \installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\xydef@\texturesTiles@@{\texturesTiles@}
+\xydef@\texturesTiles@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}%
+ \installPSpatterns@ \xystandardpatterns@}%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xytile.tex b/macros/generic/diagrams/xypic/texinputs/xytile.tex
new file mode 100644
index 0000000000..fb411fca66
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xytile.tex
@@ -0,0 +1,125 @@
+%% xytile.tex from $Id: xytile.doc,v 3.8 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Pattern and Tile extension'' option.
+%% Copyright (c) 1993-1997 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{tile}{Pattern and Tile extension}{\stripRCS$Revision: 3.8 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\xypatternwarning@@{\xypatternmessage@
+ \gdef\xypatternwarning@{\xypatternmessage@
+ \xywarning@{...no further pattern warnings will be given.}%
+ \global\let\xypatternwarning@=\relax }}
+\xylet@\xypatternwarning@=\xypatternwarning@@
+\xydef@\xypatternmessage@{%
+ \xywarning@{Current driver does not support patterns.}}%
+\xydef@\newxypattern{\begingroup\xycatcodes\newxypattern@i}
+\xydef@\newxypattern@i#1#2{\edef\next@{\endgroup
+ \noexpand\newxyPattern{#1}{}{#2}{}}\next@}
+\xydef@\newxyPattern#1#2#3#4{\newxypattern@{#1}{#2}{#3}{#4}{}}
+\xydef@\newxypattern@#1#2#3#4#5{%
+ \expandafter\let\expandafter\next@\csname shape [#1]\endcsname
+ \ifx\next@\relax
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{}{#3}\xypattern@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#2 #3}}}%
+ \fi
+ \else\DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#4}{}\xypattern@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#4}}}%
+ \fi\fi
+ \else \def\tmp@{\relax}\DNii@{#5}%
+ \ifx\nextii@\tmp@
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{}{#3}\xypattern@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#2 #3}}}%
+ \fi
+ \else
+ \DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#4}{}\xypattern@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#4}}}%
+ \fi\fi
+ \else\DN@{}\fi\fi \next@\relax }
+\xydef@\xyNopattern@#1{}
+\xylet@\xypattern@@=\xyNopattern@
+\xydef@\xyNopattern@@#1#2{\xypatternwarning@}
+\xylet@\xypattern@=\xypattern@@
+\xylet@\xylocalpattern@=\xyNopattern@@
+\xydef@\Unloadpattern@{%
+ \let\xylocalpattern@=\xyNopattern@@
+ \let\xypattern@=\xyNopattern@
+ \let\xypatternwarning@=\xypatternwarning@@ }
+\Unloadpattern@
+\xydef@\xystandardpatterns@{}%
+\xynew@{read}{\xypatread@}
+\xydef@\defaultpattfile@{}
+\xydef@\xygetfilepatterns@#1{\DN@{#1}%
+ \ifx\next@\empty
+ \ifx\defaultpattfile@\empty \xywarning@{No pattern file specified.}%
+ \else \DN@{\expandafter\openpattfile@\expandafter{\defaultpattfile@}}\fi
+ \else \DN@{\openpattfile@{#1}}\fi \next@ }
+\xydef@\openpattfile@#1{\openin\xypatread@=#1.xyp
+ \ifeof\xypatread@\xywarning@{No patterns in file: #1.xyp}%
+ \closein\xypatread@
+ \else \expandafter \xyreadpatfile@ \fi }%
+\xydef@\UsePatternFile#1{\def\defaultpattfile@{#1}}
+\xydef@\LoadAllPatterns{\let\parsepattern@=\parsepattern@@
+ \xygetfilepatterns@ }
+\xydef@\LoadPattern#1{\let\parsepattern@=\filepattern@@
+ \def\pattname@{#1}\xygetfilepatterns@}
+\xydef@\AliasPattern#1#2{\let\parsepattern@=\aliaspattern@@
+ \def\aliasname@{#1}\def\pattname@{#2}\xygetfilepatterns@}
+\xydef@\xyreadpatfile@{%
+ \loop@ \bgroup\xycatcodes
+ \global\read\xypatread@ to\xypatline@
+ \ifeof\xypatread@ \aftergroup\endpatread@
+ \else\aftergroup\morepatread@\fi \edef\next@{%
+ \egroup\noexpand\getxypattern@{\xypatline@!!!}\relax}\next@
+ \repeat@ }
+\xydef@\endpatread@{\closein\xypatread@\iffalse}
+\xydef@\morepatread@{\iftrue}
+\xydef@\getxypattern@#1{\def\next{#1}\getxypattern@@}
+\xydef@\getxypattern@@{\DN@{!!!}\ifx\next\next@\DN@{}%
+ \else\DN@{\expandafter\parsepattern@\next}\fi \next@ }
+\xydef@\parsepattern@@#1 #2!#3\relax{\newxypattern{#1}{#2}}
+\xydef@\filepattern@@#1 #2!#3\relax{\DN@{#1}%
+ \ifx\next@\pattname@
+ \DN@{\expandafter\foundpattern@\expandafter{\pattname@}{#2}}%
+ \else\DN@{}\fi \next@ }
+\xydef@\foundpattern@#1#2{\newxypattern{#1}{#2}\endpatread@\fi
+ \expandafter\eat@}
+\xydef@\aliaspattern@@#1 #2!#3\relax{\DN@{#1}%
+ \ifx\next@\pattname@
+ \DN@{\expandafter\foundpattern@\expandafter{\aliasname@}{#2}}%
+ \else\DN@{}\fi \next@ }
+\DN@{\xyaddunsupport{tile}\Unloadpattern@}%
+\ifx\xyeverywithoption@tile@\undefined
+\else\ifx\xyeverywithoption@tile@\empty
+\else
+ \DN@{\xysetup@@{\xywithoption{tile}{\xyeverywithoption@tile@\xydriversloaded@@}}}%
+\fi\fi \next@
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xytips.tex b/macros/generic/diagrams/xypic/texinputs/xytips.tex
new file mode 100644
index 0000000000..55a61b25e4
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xytips.tex
@@ -0,0 +1,81 @@
+%% xytips.tex from $Id: xytips.doc,v 3.11 2013/10/06 01:12:08 krisrose Exp $
+%%
+%% Xy-pic ``More Tips'' extension.
+%% Copyright (c) 1992-1996 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{tips}{More Tips extension}{\stripRCS$Revision: 3.11 $}%
+ {Kristoffer H.~Rose}{kris@diku.dk}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xylet@\tip@xy=\tip@
+\xylet@\atip@xy=\atip@
+\xylet@\btip@xy=\btip@
+\xylet@\Tip@xy=\Tip@
+\xylet@\Ttip@xy=\Ttip@
+\xylet@\tipjot@xy=\tipjot@
+\xyfont@\xy@@atfont=xycmat10
+\xyfont@\xy@@btfont=xycmbt10
+\xyfont@\xy@@alfont=xyluat10
+\xyfont@\xy@@blfont=xylubt10
+\xydef@\tipfamily@@{cm}
+\xydef@\tipsize@@{10}
+\xydef@\SelectTips#1#2{%
+ \DN@{#1}\ifx\next@\empty\else \def\tipfamily@@{#1}\fi
+ \DN@{#2}\ifx\next@\empty\else \def\tipsize@@{#2}\fi
+ \csname tipfamily \tipfamily@@\endcsname \ignorespaces}
+\xydefcsname@{tipfamily cm}{\loadtipfonts@
+ \let\tip@=\tip@cm \let\atip@=\atip@cm \let\btip@=\btip@cm
+ \let\Tip@=\Tip@xy \let\Ttip@=\Ttip@xy \def\tipjot@{.2em}}
+\xydef@\loadtipfonts@{\edef\next##1##2{##1=xy\tipfamily@@##2\tipsize@@}%
+ \next{\font\xy@@atfont}{at}
+ \next{\font\xy@@btfont}{bt}
+}
+\xydef@\tip@cm{\activatetips@ \tip@x\tip@@}
+\xydef@\atip@cm{\activatetips@ \tip@x\atip@@}
+\xydef@\btip@cm{\activatetips@ \tip@x\btip@@}
+\xydef@\activatetips@{\let\xyatipfont=\xy@@atfont \let\xybtipfont=\xy@@btfont}
+\xydefcsname@{tipfamily eu}{\loadtipfonts@
+ \let\tip@=\tip@cm \let\atip@=\atip@cm \let\btip@=\btip@cm
+ \let\Tip@=\Tip@eu \let\Ttip@=\Ttip@eu \def\tipjot@{.15em}}
+\xydef@\Tip@eu{\kern1.5pt \vrule height1.5pt depth1.5pt width\z@
+ \Tip@@eu \kern1.5pt \egroup
+ \U@c=1.5pt \D@c=1.5pt \L@c=1.5pt \R@c=1.5pt \Edge@c={\circleEdge}%
+ \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+\xydef@\Tip@@eu{\count@=\DirectionChar
+ \advance\count@-10 \ifnum\count@<\z@ \advance\count@128 \fi
+ \xyatipfont\char\count@
+ \advance\count@ 20 \ifnum127<\count@ \advance\count@-128 \fi
+ \xybtipfont\char\count@}
+\xydef@\Ttip@eu{\kern2.4pt \vrule height2.4pt depth2.4pt width\z@
+ \Ttip@@eu \kern2.4pt \egroup
+ \U@c=2.4pt \D@c=2.4pt \L@c=2.4pt \R@c=2.4pt \Edge@c={\circleEdge}%
+ \Invisible@false \Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+\xydef@\Ttip@@eu{%
+ \setboxz@h\bgroup\reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c \Tip@@eu}
+\xydefcsname@{tipfamily lu}{\loadtipfonts@
+ \let\tip@=\tip@cm \let\atip@=\atip@cm \let\btip@=\btip@cm
+ \let\Tip@=\Tip@xy \let\Ttip@=\Ttip@xy \def\tipjot@{.2em}}
+\xydef@\UseTips{\csname tipfamily \tipfamily@@\endcsname}
+\xydef@\NoTips{\let\tip@=\tip@xy \let\atip@=\atip@xy \let\btip@=\btip@xy
+ \let\Tip@=\Tip@xy \let\Ttip@=\Ttip@xy \let\tipjot@=\tipjot@xy}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xytp-f.tex b/macros/generic/diagrams/xypic/texinputs/xytp-f.tex
new file mode 100644
index 0000000000..68243fe9c4
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xytp-f.tex
@@ -0,0 +1,174 @@
+%% xytp-f.tex from $Id: xytp-f.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Frame extension'' TPIC backend support.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xytpfloaded\empty \message{not reloaded}\endinput \fi
+\let\xytpfloaded=\empty \xycatcodes
+\xydef@\installTPICframes@{%
+ \let\framed@body@@=\xyTPICframed@body@
+ \let\circled@x@@=\xyTPICcircled@x@
+ \let\ellipsed@x@@=\xyTPICellipsed@x@
+ \installTPICfills@
+ \xyuncatcodes}
+\xydef@\UseTPICframes{\installTPICframes@}
+\xydef@\NoTPICframes{\UnloadFrames@}
+\xydef@\xyTPICframed@body@{\DN@{\framed@body@}%
+ \ifdim\R@=\z@
+ \ifx\framehfill\frm@solidh@@
+ \DN@{\xyTPICframed@rect@i\xytpic@solid@@}%
+ \else\ifx\framehfill\frm@dashh@@
+ \DN@{\xyTPICframed@rect@i\xytpic@dashed@@}%
+ \else\ifx\framehfill\frm@doth@@
+ \DN@{\xyTPICframed@rect@i\xytpic@dotted@@}%
+ \fi\fi\fi\fi \next@ }
+\xydef@\xyTPICframed@rect@i#1{\vglue\U@c
+ \hbox{\hglue\L@c\xyTPICrect@{#1}\hglue\R@c}\vglue\D@c}
+\xydef@\xyTPICcircled@x@{\DN@{\xyTPICcircled@xx{}}%
+ \ifx\framehfill\frm@doth@@ \DN@{\xyTPICdotcirc@}%
+ \else\ifx\framehfill\frm@dashh@@\DN@{\xyTPICdashcirc@}%
+ \fi\fi \next@ }
+\xydef@\xyTPICcircled@xx#1{\vglue2\R@
+ \hbox{\hglue2\R@\xyTPICfullcircle@#1\hglue2\R@}\vglue2\R@}
+\xydef@\xyTPICdotcirc@{\let\zerodot=\framezerodot@@
+ \L@=\R@ \circled@x@@ }
+\xydef@\xyTPICdashcirc@{\L@=\R@ \circled@x@@ }
+\xydef@\xyTPICdotellip@{\ellipsed@x@@ }
+\xydef@\xyTPICdashellip@{\ellipsed@x@@ }
+\xydef@\xyTPICellipsed@x@#1#2{\DN@{\xyTPICellipsed@xx{}}%
+ \ifx\framehfill\frm@doth@@\DN@{\xyTPICdotellip@}%
+ \else\ifx\framehfill\frm@dashh@@\DN@{\xyTPICdashellip@}%
+ \fi\fi \next@{#1}{#2}}
+\xydef@\xyTPICellipsed@xx#1#2#3{\vglue #3\vglue #3\relax
+ \hbox{\L@c = #2\relax \R@c=\L@c \D@c = #3\relax \U@c=\D@c
+ \hglue#2\hglue#2\relax \R@=#2\relax \L@=#3\relax
+ \xyTPICfullcircle@#1\hglue#2\hglue#2\relax}%
+ \vglue #3\vglue #3\relax}
+\xydef@\xyTPICrect@#1{\DNii@{\relax}\DN@{#1}\toks@={}%
+ \ifx\next@\nextii@ \xytpic@pn0\relax\xytpic@bk
+ \def\xytpic@style@@{\xytpic@fp}%
+ \else\DNii@{\empty}%
+ \ifx\next@\nextii@\def\xytpic@style@@{\xytpic@ip}\xytpic@bk
+ \else\ifx\next@\empty\def\xytpic@style@@{\xytpic@ip}\xytpic@bk
+ \else#1\fi\fi\fi
+ \xytpic@pt\R@c
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt\D@c
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt{\L@c}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt{\U@c}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \expandafter\xyTPICrect@x\the\toks@
+ \DNii@{\relax}\DN@{#1}\ifx\next@\nextii@
+ \def\xytpic@style@@{\xytpic@fp}\expandafter\xyTPICrect@x\the\toks@\fi }
+\xydef@\xyTPICrect@x#1#2#3#4{\xyTPIC@special{pa -#3 -#4}%
+ \xyTPIC@special{pa -#3 #2}\xyTPIC@special{pa #1 #2}%
+ \xyTPIC@special{pa #1 -#4}\xyTPIC@special{pa -#3 -#4}%
+ \xytpic@style@@ }
+\xydef@\xyTPICoval@#1{\DN@{#1}\DNii@{\relax}%
+ \ifx\next@\nextii@ \DN@{\xyTPICfilledoval@\relax}%
+ \else\DNii@{\empty}\ifx\next@\nextii@ \DN@{\xyTPICfilledoval@\empty}%
+ \else\DN@{\xyTPICoval@i{#1}}\fi\fi \next@ }
+\xylet@\xyTPICoval@i=\eat@
+\xydef@\xyTPICfilledoval@#1{%
+ {\advance\L@c-\R@ \advance\R@c-\R@ \xyTPICrect@{\empty}}%
+ {\advance\U@c-\R@ \advance\D@c-\R@ \xyTPICrect@{\empty}}%
+ \L@=\R@ \bgroup
+ \dimen@=-\U@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=-\L@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \bgroup
+ \dimen@=-\U@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=\R@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \bgroup
+ \dimen@=\D@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=-\L@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \bgroup
+ \dimen@=\D@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=\R@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \DN@{#1}\DNii@{\relax}\ifx\next@\nextii@
+ \def\tmp@{{\xytpic@pn0\def\xytpic@style@@{\xytpic@fp}}}%
+ \DN@{\expandafter\xyTPICoval@i\tmp@}%
+ \else\DN@{}\fi \next@ }
+\xydef@\setTPICcircstyle@{%
+ \def\xytpic@circstyle@@{\xytpic@ia}\xytpic@bk}
+\xydef@\xyTPICcircle@#1{\DNii@{\relax}%
+ \DN@{#1}\toks@={00}\ifx\next@\nextii@
+ \xytpic@pn0\relax\xytpic@bk \def\xytpic@circstyle@@{\xytpic@ar}%
+ \else\DNii@{\empty}%
+ \ifx\next@\nextii@ \setTPICcircstyle@
+ \else\ifx\next@\empty \setTPICcircstyle@
+ \else#1\fi\fi\fi
+ \xytpic@pt\R@
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt\L@
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \expandafter\xytpic@circstyle@@\the\toks@ 0\twoPi@}
+\xydef@\xyTPICellipse@{%
+ \X@p=\R@c \advance\X@p-\L@c \divide\X@p\tw@ \R@=\R@c \advance\R@-\X@p
+ \Y@p=\D@c \advance\Y@p-\U@c \divide\Y@p\tw@ \L@=\D@c \advance\L@-\Y@p
+ \xyTPICcircle@}
+\xydef@\xyTPICrect@Special#1#2#3#4{\TPICmacro@@{#1 fp}}
+\xydef@\xyTPICdotrect@Special#1{\TPICmacro@@{#1 fp}}
+\xydef@\xyTPICdashrect@Special#1{\TPICmacro@@{#1 fp}}
+\xydef@\xyTPICcirc@Special#1{\TPICmacro@@{#1 ar}}
+\xydef@\xyTPICdotcirc@Special#1{\TPICmacro@@{#1 ar}}
+\xydef@\xyTPICdashcirc@Special#1{\TPICmacro@@{#1 ar}}
+\xydef@\xyTPICfilledRegion#1#2{\vglue\U@c
+ \hbox{\hglue\L@c#1#2\empty\hglue\R@c}\vglue\D@c}
+\xydef@\filledRectangle@TPIC@@{%
+ \ifdim\R@=\z@ \DN@{\xyTPICfilledRegion\xyTPICrect@}%
+ \else \DN@{\xyTPICfilledRegion\xyTPICoval@}%
+ \fi \next@ }
+\xydef@\filledCircle@TPIC@@#1{{\R@c=\R@ \L@c=\R@ \U@c=\R@ \D@c=\R@
+ \xyTPICfilledRegion\xyTPICcircle@#1{}}}
+\xydef@\filledEllipse@TPIC@@{\xyTPICfilledRegion\xyTPICellipse@}
+\xydef@\filledOval@TPIC@@{\xyTPICfilledRegion\xyTPICoval@}
+\xydef@\installTPICfills@{%
+ \let\filledRectangle@@=\filledRectangle@TPIC@@
+ \let\filledOval@@=\filledOval@TPIC@@
+ \let\filledCircle@@=\filledCircle@TPIC@@
+ \let\filledEllipse@@=\filledEllipse@TPIC@@
+}
+\xydef@\xyTPICfillrect@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 fp}%
+ \else\TPICmacro@@{#1 ip}\fi}
+\xydef@\xyTPICfilloval@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 fp}%
+ \else\TPICmacro@@{#1 ip}\fi}
+\xydef@\xyTPICfillcirc@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 ar}%
+ \else\TPICmacro@@{#1 ai}\fi}
+\xydef@\xyTPICfillellipse@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 ar}%
+ \else\TPICmacro@@{#1 ai}\fi}
+\endinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xytpic.tex b/macros/generic/diagrams/xypic/texinputs/xytpic.tex
new file mode 100644
index 0000000000..a58ca347e8
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xytpic.tex
@@ -0,0 +1,228 @@
+%% xytpic.tex from $Id: xytpic.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``tpic'' TPIC backend, for lines, curves and fills.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{tpic}{TPIC backend}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xynew@{if}\ifTPICspecials@
+\xydef@\UseTPICspecials{\TPICspecials@true}
+\xydef@\NoTPICspecials{\TPICspecials@false}
+\xynew@{count}\xytpic@cnt
+\xydef@\xytpic@max{300}
+\xydef@\maxTPICpoints#1{\count@=#1 \relax
+ \ifnum\count@>\tw@ \edef\xytpic@max{\the\count@}%
+ \else\expandafter\xyTPICmaxwarning@\expandafter{\the\count@}\fi}
+\xydef@\xyTPICmaxwarning@#1{max points must be at least 2, #1 invalid}
+\xydef@\xytpic@style@@{\xytpic@fp}
+\xydef@\xytpic@reset@{\gdef\xytpic@style@@{\xytpic@fp}%
+ \global\xytpic@cnt=\z@ }
+\xydef@\xytpic@set@#1{\xdef\xytpic@style@@{\noexpand#1}}
+\xydef@\xytpic@pn#1{\xyTPIC@special{pn #1}}
+\xydef@\xytpic@pa#1#2{\global\advance\xytpic@cnt\@ne\relax
+ \ifnum\xytpic@cnt=\xytpic@max\relax \xyTPIC@special{pa #1 #2}%
+ \kern-\X@c\raise-\Y@c\hbox{\xytpic@style@@}\kern\X@c
+ \global\xytpic@cnt=\@ne \relax\fi \xyTPIC@special{pa #1 #2}}
+\xydef@\xytpic@fp{\xyTPIC@special{fp}}
+\xydef@\xytpic@ip{\xyTPIC@special{ip}}
+\xydef@\xytpic@da#1{\xyTPIC@special{da #1}}
+\xydef@\xytpic@dt#1{\xyTPIC@special{dt #1}}
+\xydef@\xytpic@sp#1{\xyTPIC@special{sp #1}}
+\xydef@\xytpic@ar#1#2#3#4#5#6{\xyTPIC@special{ar #1 #2 #3 #4 #5 #6}}
+\xydef@\xytpic@ia#1#2#3#4#5#6{\xyTPIC@special{ia #1 #2 #3 #4 #5 #6}}
+\xydef@\xytpic@sh#1{\xyTPIC@special{sh #1}}
+\xydef@\xytpic@wh{\xyTPIC@special{sh 0}}
+\xydef@\xytpic@bk{\xyTPIC@special{sh 1}}
+\xydef@\xyTPIC@special#1{\special{#1}}
+\xydef@\xyTPIC@noisy#1{\W@{TPIC: #1}\special{#1}}
+\xydef@\NoisyTPIC{\let\xyTPIC@special=\xyTPIC@noisy}
+\xydef@\xyTPICsplit@#1#2{\setboxz@h{#1\boxz@#2}}%
+\xydef@\xytpic@pt#1{\dimen@=#1\divide\dimen@ by72
+ \multiply\dimen@ by 1000 \advance\dimen@.5\p@
+ \count@=\dimen@ \divide\count@\p@ }
+\xydef@\xytpic@in#1{\dimen@=#1\divide\dimen@ by72
+ \edef\next@{\expandafter\removePT@\the\dimen@}}%
+\xydef@\xytpic@dot@@{\xytpic@pa00}
+\xydef@\xytpic@width@{\xytpic@pt{\xylinethick@}%
+ \expandafter\xytpic@pn\expandafter{\the\count@}}
+\xydef@\xytpic@line{%
+ \xytpic@dot@@ \xytpic@pt{-\d@X}\count@@=\count@
+ \xytpic@pt\d@Y \edef\next@{{\the\count@@}{\the\count@}}%
+ \expandafter\xytpic@pa\next@ \xytpic@style@@ \xytpic@reset@ }
+\xydef@\xytpic@solid@@{\xytpic@set@\xytpic@fp}
+\xydef@\xytpic@dashed@@{\xytpic@in\xydashl@ \xytpic@dad}
+\xydef@\xytpic@dotted@@{\dimen@=.5\xydashl@ \xytpic@in\dimen@ \xytpic@dtd}
+\xydef@\xytpic@dad{\expandafter\xytpic@set@\expandafter{%
+ \expandafter\xytpic@da\expandafter{\next@}}}
+\xydef@\xytpic@dtd{\expandafter\xytpic@set@\expandafter{%
+ \expandafter\xytpic@dt\expandafter{\next@}}}
+\xydef@\xytpic@polysolid@{\xytpic@set@\xytpic@fp}
+\xydef@\xytpic@polydashed@#1{\count@=#1 \xytpic@dad}
+\xydef@\xytpic@polydotted@#1{\count@=#1 \xytpic@dtd}
+\xydef@\xytpic@postpoly@{\xytpic@style@@ \xytpic@reset@}
+\xydef@\TPICalternative@#1#2{%
+\expandafter\global\expandafter\let\csname origxy#2@\endcsname=#1%
+ \xdef#1{\noexpand\ifTPICspecials@
+ \noexpand\expandafter\expandafter\noexpand\csname xytpic@#2@\endcsname
+ \noexpand\else
+ \noexpand\expandafter\expandafter\noexpand\csname origxy#2@\endcsname
+ \noexpand\fi}}%
+\xydef@\setupxyTPIC@{\xywarning@{using TPIC specials}%
+ \TPICalternative@{\solid@}{solid}%
+ \TPICalternative@{\dash@}{dashed}%
+ \TPICalternative@{\point@}{point}%
+ \TPICalternative@{\circhar@@}{circhar}%
+ \TPICalternative@{\splinesolid@}{splinesolid}%
+ \xywithoption{frame}{\xyinputorelse@{xytp-f}{}\xyuncatcodes}%
+ \let\setupxyTPIC@=\reloadxyTPIC@
+ \activateTPIC@ }
+\xydef@\xyunloadTPIC@{\xywarning@{TPIC specials turned off}%
+ \xywithoption{curve}{\xysetup@@\uninstallTPICcurves@ }%
+ \xywithoption{line}{\xysetup@@\uninstallTPICline@ }%
+ \xywithoption{frame}{\xysetup@@\uninstallTPICframes@ }%
+ \TPICspecials@false
+ \let\setupxyTPIC@=\reloadxyTPIC@ }
+\xydef@\activateTPIC@{%
+ \xywithoption{line}{\xysetup@@\installTPICline@}%
+ \xywithoption{curve}{\xysetup@@\installTPICcurves@}%
+ \xywithoption{frame}{\xysetup@@\installTPICframes@}%
+ \TPICspecials@true }
+\xydef@\reloadxyTPIC@{\xywarning@{TPIC specials back on}\activateTPIC@ }
+\xydef@\xytpic@solid@{%
+ \ifInvisible@ \let\next@=\no@@
+ \else \DN@{\xyTPICstraight@{\xytpic@solid@@ \xytpic@line}}\fi
+ \next@ }
+\xydef@\xytpic@dashed@{\line@
+ \def\Connect@@{\xyTPICstraight@{\xytpic@dashed@@ \xytpic@line}}}
+\xydef@\xytpic@point@{\xytpic@dot@@\xytpic@fp\egroup
+ \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}\ctipEdge@
+ \def\Drop@@{\styledboxz@}%
+ \def\Connect@@{\xyTPICstraight@{\xytpic@dotted@@ \xytpic@line}}}
+\xydef@\xyTPICstraight@#1{\setupDirection@
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \DN@##1##2{\def\checkoverlap@@{%
+ \ifdim##1\X@p>##1\X@c \let\next@=\relax \fi
+ \ifdim##2\Y@p>##2\Y@c \let\next@=\relax \fi}}%
+ \edef\nextii@{{\sd@X}{\sd@Y}}\expandafter\next@\nextii@
+ \noCshavep@@ \edef\Cshavep@@{\pfromthep@ \noexpand\resetDirection@}%
+ \noCshavec@@ \edef\Cshavec@@{\cfromthec@ \noexpand\resetDirection@}%
+ \ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi \fi
+ \ifInvisible@\let\next@=\relax \else
+ \DN@{\setboxz@h{\kern\X@c \raise\Y@c\hbox{#1}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}%
+ \fi
+ \checkoverlap@@
+ \ifdim\d@X=\z@ \ifdim\d@Y=\z@ \DN@{\relax}\fi\fi \next@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\Creset@@ }
+\xydef@\xytpic@splinesolid@{\xyTPICspline@\xytpic@fp }
+\xydef@\xytpic@splinedashed@{\xytpic@in\xydashl@\expandafter\xyTPICspline@
+ \expandafter{\expandafter\xytpic@da\expandafter{\next@}}}
+\xydef@\xytpic@splinedotted@{\xytpic@in{.5\xydashl@}\expandafter\xyTPICspline@
+ \expandafter{\expandafter\xytpic@dt\expandafter{\next@}}}
+\xydef@\xyTPICspline@#1{\setbox\splinebox@=\copy\voidb@x
+ \SloppyCurves
+ \global\xytpic@cnt=\@ne \xytpic@set@{#1}%
+ \def\splineextra@@{\xyTPICspline@dot}%
+ \def\xycrvdrop@{ }\def\xycrvconn@{}\splineset@@ \xytpic@style@@}
+\xydef@\xyTPICspline@dot{\xytpic@pt{\X@c}\count@@=\count@
+ \xytpic@pt{-\Y@c}\edef\next@{{\the\count@@}{\the\count@}}%
+ \expandafter\xytpic@pa\next@ }
+\xydef@\xyTPIClinewidth@#1{\xytpic@pt{#1}\edef\next@{\the\count@}}
+\xydef@\installTPICline@{%
+ \let\xylinewidth@@=\xylinewidth@
+ \let\xylineSpecial@@=\xytpic@pn
+ \let\transxyline@@=\xyTPIClinewidth@ }
+\xydef@\uninstallTPICline@{\UnloadLine@}%
+\xydef@\xydoTPICcircle@#1{\DN@{#1}%
+ \ifx\next@\empty\DN@{\xyTPICfullcircle@}%
+ \else\expandafter\DNii@\expandafter{\addDASH@{}}%
+ \ifx\next@\nextii@\DN@{\L@=\R@ \xyTPICfullcircle@}%
+ \else\DN@{\dosolidcircle@{#1}}\fi\fi \next@ }
+\xydef@\xyTPICfullcircle@{\xyTPICpartcircle@{00}0\twoPi@}%
+\xydef@\xyTPICpartcircle@#1#2#3{%
+ \xytpic@pt{\R@}\expandafter\DNii@\expandafter{\the\count@}%
+ \xytpic@pt{\L@}\edef\next@{#1{\nextii@}{\the\count@}{#2}{#3}}%
+ \expandafter\xytpic@ar\next@ }
+\xydef@\qartPi@{0.7853981}
+\xydef@\tartPi@{2.3561944}
+\xydef@\xytpic@circhar@#1{\xytpic@width@\ifcase#1%
+ \xytpic@pt{\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{\tartPi@}{\fullPi@}\kern\partroottwo\R@
+ \or
+ \xytpic@pt{\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{\halfPi@}{\tartPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{\z@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{\qartPi@}{\halfPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{-\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@0{\qartPi@}\kern\partroottwo\R@
+ \or
+ \xytpic@pt{-\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\qartPi@}0\kern\partroottwo\R@
+ \or
+ \xytpic@pt{\z@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\halfPi@}{-\qartPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\tartPi@}{-\halfPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\fullPi@}{-\tartPi@}\kern\partroottwo\R@
+ \fi}
+\xydef@\xyTPICcirchar@i#1#2#3{\L@=\R@ \xyTPICpartcircle@{#1}{#2}{#3}}
+\xydef@\xyTPIC@spline@ii@{\DN@{\xy@spline@ii}%
+ \ifx\splineSTYLE@\empty\DN@{\xyTPICqspline@{0}}%
+ \else\expandafter\DNii@\expandafter{\addDASH@{}}%
+ \ifx\splineSTYLE@\nextii@\DN@{\xyTPICqspline@{0}}%
+ \else\expandafter\DNii@\expandafter{\addDOT@{}}%
+ \ifx\splineSTYLE@\nextii@\DN@{\xyTPICqspline@{-.5}}%
+ \else\expandafter\expandafter\expandafter\DNii@\expandafter\expandafter
+ \expandafter{\expandafter\addDASH@\addDASH@{}}%
+ \ifx\splineSTYLE@\nextii@\DN@{\xyTPICqspline@{}}%
+ \fi\fi\fi\fi
+ \next@ }%
+\xydef@\xyTPIC@accumulate{\xytpic@pt\X@c \count@@=\count@
+ \xytpic@pt{-\Y@c}\edef\next@{{\the\count@@}{\the\count@}}%
+ \expandafter\xytpic@pa\next@ }
+\xydef@\xyTPICqspline@#1{\xytpic@width@
+ \xytpic@in{#1\xydashl@}\expandafter\gdef\expandafter\xytpic@style@@
+ \expandafter{\expandafter\xytpic@sp\expandafter{\next@}}%
+ \save@ \cfromp@ \xyTPIC@accumulate
+ \edef\smapp@@{\s@bot}\smapxy@i{\xyTPIC@accumulate}%
+ \leave@ \xyTPIC@accumulate \xytpic@style@@ \xytpic@reset@
+ \enter@{}\xy@spline@x }
+\xydef@\installTPICcurves@{%
+ \let\dosolidcircle@@=\xydoTPICcircle@
+ \let\xy@spline@ii@@=\xyTPIC@spline@ii@
+ }
+\xydef@\uninstallTPICcurves@{%
+ \let\dosolidcircle@@=\dosolidcircle@
+ \let\xy@spline@ii@@=\xy@spline@ii }
+ \xywithoption{frame}{\xyinputorelse@{xytp-f}{}}
+\xydef@\uninstallTPICframes@{\UnloadFrames@}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyv2.tex b/macros/generic/diagrams/xypic/texinputs/xyv2.tex
new file mode 100644
index 0000000000..4d92bd01cf
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyv2.tex
@@ -0,0 +1,277 @@
+%% xyv2.tex from $Id: xyv2.doc,v 3.8 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Version 2 compatibility'' feature.
+%% Copyright (c) 1993-1995 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{v2}{Version 2 Compatibility}{\stripRCS$Revision: 3.8 $}%
+ {Kristoffer H.~Rose}{krisrose@tug.org}%
+ {IBM T.~ J.\ Watson Research Center, P.O.~Box 704, Yorktown Heights, NY 10598 (USA)}
+\xylet@\XY=\Xy
+\ifx\redefine\undefined \let\redefine=\def \fi
+\ifx\define\undefined \let\define=\xydef@ \fi
+\ifx\dsize\undefined \let\dsize=\displaystyle \fi
+\ifx\tsize\undefined \let\dsize=\textstyle \fi
+\ifx\ssize\undefined \let\ssize=\scriptstyle \fi
+\ifx\sssize\undefined \let\sssize=\scriptscriptstyle \fi
+\ifx\text\undefined
+ \def\text{\relax\textC}%
+ \xydef@\textC#1{\relax
+ \ifmmode\mathchoice
+ {\hbox{\the\textfont0\relax#1}}%
+ {\hbox{\the\textfont0\relax#1}}%
+ {\hbox{\the\scriptfont0\relax#1}}%
+ {\hbox{\the\scriptscriptfont0\relax#1}}%
+ \else{\relax#1}\fi}
+\fi
+\xydef@\Text{\relax\xyFN@\Text@}
+\xydef@\TextC{\relax\textC}%
+\xydef@\Text@{%
+ \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\A@=##1\Text@i}%
+ \else \DN@{\A@=\maxdimen \Text@i}\fi \next@}
+\xydef@\Text@i#1{%
+ \ifmmode \mathchoice
+ {\expandafter\Text@ii\the\textfont0{#1}}%
+ {\expandafter\Text@ii\the\textfont0{#1}}%
+ {\expandafter\Text@ii\the\scriptfont0{#1}}%
+ {\expandafter\Text@ii\the\scriptscriptfont0{#1}}%
+ \else
+ \leavevmode \expandafter\Text@ii\the\textfont0{#1}%
+ \fi\ignorespaces}
+\xydef@\Text@ii{\hbox\bgroup \txt@i}
+\xylet@\cL=\L@c
+\xylet@\cR=\R@c
+\xylet@\cD=\D@c
+\xylet@\cH=\U@c
+\xylet@\Xc=\X@c
+\xylet@\Yc=\Y@c
+\xylet@\Uc=\U@c
+\xylet@\Dc=\D@c
+\xylet@\Lc=\L@c
+\xylet@\Rc=\R@c
+\xylet@\Xp=\X@p
+\xylet@\Yp=\Y@p
+\xylet@\Up=\U@p
+\xylet@\Dp=\D@p
+\xylet@\Lp=\L@p
+\xylet@\Rp=\R@p
+\xylet@\dX=\d@X
+\xylet@\dY=\d@Y
+\xylet@\Xorigin=\X@origin
+\xylet@\Yorigin=\Y@origin
+\xylet@\Xxbase =\X@xbase
+\xylet@\Yxbase =\Y@xbase
+\xylet@\Xybase =\X@ybase
+\xylet@\Yybase =\Y@ybase
+\xylet@\Xmin=\X@min
+\xylet@\Ymin=\Y@min
+\xylet@\Xmax=\X@max
+\xylet@\Ymax=\Y@max
+\xydef@\go{\aftergo{}}
+\xydef@\aftergo#1{\xy@\aftergo{\enter@\pfromthec@}\afterPOS{\xy@@\leave@#1}}
+\xydef@\merge{\POS.p\relax}
+\xydef@\swap{\xy@\swap\swap@}
+\xydef@\Drop{\expandafter\drop\entrymodifiers@}
+\xydef@\none{\xy@\none{}\ignorespaces}
+\xydef@\solid{\connect h\dir{-}}
+\xydef@\Solid{\connect h\dir2{-}}
+\xydef@\Ssolid{\connect h\dir3{-}}
+\xydef@\dashed{\connect h\dir{--}}
+\xydef@\Dashed{\connect h\dir2{--}}
+\xydef@\Ddashed{\connect h\dir3{--}}
+\xydef@\dotted{\connect h\dir{.}}
+\xydef@\Dotted{\connect h\dir2{.}}
+\xydef@\Ddotted{\connect h\dir3{.}}
+\xydef@\dottedwith#1{\connect h{#1}}
+\xydef@\notip{\dir{}}
+\xydef@\stop{\dir{|}}
+\xydef@\astop{\dir^{|}}
+\xydef@\bstop{\dir_{|}}
+\xydef@\tip{\dir{>}}
+\xydef@\atip{\dir^{>}}
+\xydef@\btip{\dir_{>}}
+\xydef@\Tip{\dir2{>}}
+\xywarnifdefined\aTip
+\xywarnifdefined\bTip
+{\xyuncatcodes
+ \gdef\aTip{\object=<5pt>:(32,-1)\dir^{>}}
+ \gdef\bTip{\object=<5pt>:(32,+1)\dir_{>}}}
+\xydef@\Ttip{\dir3{>}}
+\xydef@\ahook{\dir^{(}}
+\xydef@\bhook{\dir_{(}}
+\xydef@\aturn{\dir^{'}}
+\xydef@\bturn{\dir_{'}}
+\xydef@\rotate{\hbox\bgroup
+ \DN@{\ifx (\next
+ \DN@(####1){\rotate@ii{####1}}%
+ \else \DN@{\rotate@i}\fi\next@}\xyFN@\next@}
+\xydef@\rotate@i#1{\reverseDirection@ #1\OBJECT@x}
+\xydef@\rotate@ii#1#2{\dimen@=#1\p@
+ \ifdim \dimen@=-\p@ \aboveDirection@\xydashl@
+ \else\ifdim\dimen@= \p@ \belowDirection@\xydashl@
+ \else\ifdim\dimen@<-1.5\p@ \advance\dimen@-2\p@
+ \edef\next@{\expandafter\removePT@\the\dimen@}\vDirection@(-1,\next@){1pc}%
+ \else\ifdim\dimen@<-.5\p@ \vDirection@(#1,-1){1pc}%
+ \else\ifdim\dimen@< .5\p@ \vDirection@( 1,#1){1pc}%
+ \else\ifdim\dimen@<1.5\p@ \vDirection@(#1, 1){1pc}%
+ \else \dimen@=-\dimen@ \advance\dimen@2\p@
+ \edef\next@{\expandafter\removePT@\the\dimen@}\vDirection@(-1,\next@){1pc}%
+ \fi\fi\fi\fi\fi\fi
+ #2\OBJECT@x}
+\xydef@\squash#1{%
+ \ifmmode\setboxz@h{\m@th${\mathstrut}#1{\mathstrut}$}\else\setboxz@h{#1}\fi
+ \setboxz@h{\kern-.5\wdz@ \dimen@=.5\ht\z@ \advance\dimen@-.5\dp\z@
+ \lower\dimen@\boxz@}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\xydef@\grow{%
+ \DN@{\ifx <\next \DN@<####1>{\dimen@=####1\grow@\empty}%
+ \else \DN@{\dimen@=2\p@ \grow@\empty}\fi\next@}\xyFN@\next@}
+\xydef@\grow@#1#{\grow@@{#1}}
+\xydef@\grow@@#1#2{\relax
+ \ifmmode \setboxz@h{\kern\dimen@ \m@th$#2$\kern\dimen@}%
+ \else \setboxz@h{\kern\dimen@ {#2}\kern\dimen@}\fi
+ \dimen@ii=\ht\z@ \advance\dimen@ii\dimen@ \ht\z@=\dimen@ii
+ \dimen@ii=\dp\z@ \advance\dimen@ii\dimen@ \dp\z@=\dimen@ii \boxz@}
+\xydef@\squarify{\addEQ@{\addPLUS@\object}}
+\xydef@\qc{\corn@@}
+\xyrequire{frame}\xycatcodes
+\xydef@\framed{\relax\convertframed{-}}
+\xydef@\Framed{\relax\convertframed{=}}
+\xydef@\circled{\relax\convertframed{o}}
+\xydef@\Circled{\relax\convertframed{oo}}
+\xydef@\convertframed#1{\DNii@##1@{\drop\frm##1{#1}}\xyFN@\convertframed@i}
+\xydef@\convertframed@i{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@##1}{\addGT@{\addLT@{\nextii@}##1}@}%
+ \else \DN@{\nextii@ @}\fi \next@}
+\xydef@\dotframed{\relax\drop\frm{.}}
+\xydef@\dashframed{\relax\drop\frm{--}}
+\xydef@\rounddashframed{\relax\drop\frm{o-}}
+\xydef@\filled{\DN@{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@####1}{\xy@@{\frame@fill@@{####1}}}%
+ \else \DN@{\xy@@{\frame@fill@@\z@}}%
+ \fi\next@}\xyFN@\next@}
+\xydef@\Filled{\DN@{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@####1}{\xy@@{\frame@emph@@{####1}}}%
+ \else \DN@{\xy@@{\frame@emph@@\z@}}%
+ \fi\next@}\xyFN@\next@}
+\xyrequire{matrix}\xycatcodes
+\xydef@\diagram#1\enddiagram{\relax\diagram@\diagram@@{#1}}
+\xydef@\diagram@{\relax
+ \ifmmode \DN@##1##2{\vcenter{\oldxymatrix@true \xy##1{\xymatrix{##2}}\endxy}}%
+ \else\DN@##1##2{{\oldxymatrix@true \xy/u.8ex/##1{\xymatrix{##2}}\endxy}}%
+ \fi \next@}
+\xydef@\LaTeXdiagrams{\def\diagram{\ltxdiagram@\diagram@@}%
+ \def\diagramnocompile{\ltxdiagram@\literal@}%
+ \def\diagramcompileto##1{\ltxdiagram@{\NoCompileMatrices\xycompileto{##1}}}}
+\xydef@\ltxdiagram@#1#2\end#3{\relax
+ \DN@{#3}\DNii@{diagram}\ifx\next@\nextii@\diagram@{#1}{#2}\end{diagram}%
+ \else\xyerr@{Put \string{\string} around \string\begin...\string\end\space
+ within diagrams}\fi}
+\xylet@\diagram@@=\literal@
+\xydef@\NoisyDiagrams{}
+\xydef@\spreaddiagramrows#1{\addPLUS@\xymatrixrowsep{#1}}
+\xydef@\spreaddiagramcolumns#1{\addPLUS@\xymatrixcolsep{#1}}
+\xyrequire{arrow}\xycatcodes
+\xylet@\arrow=\ar
+{\xyuncatcodes
+ \gdef\morPHISM#1#2#3{\PATH~={\oldconnect{#1}}~<{|<*{#3}}~>{|>*{#2}}}}
+\xydef@\morphism{\relax\morPHISM}
+\xylet@\connect@iii=\connect
+\xydef@\oldconnect#1{%
+ \let\PATHlabelabove@@=\PATHlabelabove@
+ \let\PATHlabelbelow@@=\PATHlabelbelow@
+ \let\connect=\preconnect#1\let\connect=\connect@iii}
+\xydef@\definemorphism#1#2#3#4{%
+ \xydefcsname@{x#1}{\morphism{#2}{#3}{#4}}%
+ \xydefcsname@{u#1}{\morphism{#2}{#3}{#4}[u]}%
+ \xydefcsname@{d#1}{\morphism{#2}{#3}{#4}[d]}%
+ \xydefcsname@{l#1}{\morphism{#2}{#3}{#4}[l]}%
+ \xydefcsname@{r#1}{\morphism{#2}{#3}{#4}[r]}%
+ \xydefcsname@{uu#1}{\morphism{#2}{#3}{#4}[uu]}%
+ \xydefcsname@{dd#1}{\morphism{#2}{#3}{#4}[dd]}%
+ \xydefcsname@{ll#1}{\morphism{#2}{#3}{#4}[ll]}%
+ \xydefcsname@{rr#1}{\morphism{#2}{#3}{#4}[rr]}%
+ \xydefcsname@{ur#1}{\morphism{#2}{#3}{#4}[ur]}%
+ \xydefcsname@{ul#1}{\morphism{#2}{#3}{#4}[ul]}%
+ \xydefcsname@{dr#1}{\morphism{#2}{#3}{#4}[dr]}%
+ \xydefcsname@{dl#1}{\morphism{#2}{#3}{#4}[dl]}%
+ \xydefcsname@{uul#1}{\morphism{#2}{#3}{#4}[uul]}%
+ \xydefcsname@{uur#1}{\morphism{#2}{#3}{#4}[uur]}%
+ \xydefcsname@{ull#1}{\morphism{#2}{#3}{#4}[ull]}%
+ \xydefcsname@{urr#1}{\morphism{#2}{#3}{#4}[urr]}%
+ \xydefcsname@{ddl#1}{\morphism{#2}{#3}{#4}[ddl]}%
+ \xydefcsname@{ddr#1}{\morphism{#2}{#3}{#4}[ddr]}%
+ \xydefcsname@{dll#1}{\morphism{#2}{#3}{#4}[dll]}%
+ \xydefcsname@{drr#1}{\morphism{#2}{#3}{#4}[drr]}%
+ \xydefcsname@{uull#1}{\morphism{#2}{#3}{#4}[uull]}%
+ \xydefcsname@{uurr#1}{\morphism{#2}{#3}{#4}[uurr]}%
+ \xydefcsname@{ddll#1}{\morphism{#2}{#3}{#4}[ddll]}%
+ \xydefcsname@{ddrr#1}{\morphism{#2}{#3}{#4}[ddrr]}}
+\definemorphism{to}\solid\tip\notip
+\definemorphism{line}\solid\notip\notip
+\definemorphism{dashed}\dashed\notip\notip
+\definemorphism{dotted}\dotted\notip\notip
+\definemorphism{double}\Solid\notip\notip
+\xywarnifdefined\xyviitoi
+\xywarnifdefined\xyviitoii
+\xydef@\XXtoY@#1#2#3#4#5{\save;[#3]\relax
+ \xy@@{%
+ \dimen@=\turnradius@ \ifdim#1<#2\relax \dimen@ii=#2\else\dimen@ii=#1\fi
+ \advance\dimen@\ifdim\dimen@>\dimen@ii +\dimen@\else +\dimen@ii\fi
+ \edef\xyviitoi{\the\dimen@}\leave@}%
+ \xto ~{[#3]} `#4[#3]#5/#4\xyviitoi/ `[#3]}
+\xydef@\toXY@#1#2#3#4#5{\xy@@{\idfromc@{@}%
+ \dimen@=\turnradius@ \dimen@ii=#1\relax
+ \advance\dimen@\ifdim\dimen@>\dimen@ii +\dimen@\else +\dimen@ii\fi
+ \edef\xyviitoi{\the\dimen@}%
+ \dimen@=\turnradius@ \dimen@ii=#2\relax
+ \advance\dimen@\ifdim\dimen@>\dimen@ii +\dimen@\else +\dimen@ii\fi
+ \edef\xyviitoii{\the\dimen@}}%
+ \morphism\solid{\object #4:(-1,0)\dir{>}}\notip
+ ~{`"@" "@"} `#3"@"#5/#3\xyviitoi/#5/#4\p@/ `"@"#5/#4\xyviitoii/}
+\xyuncatcodes \catcode64=11
+\xydef@\lltod{\XXtoY@\D@c\D@p{ll}{d}+}
+\xydef@\lltou{\XXtoY@\U@c\U@p{ll}{u}+}
+\xydef@\rrtod{\XXtoY@\D@c\D@p{rr}{d}+}
+\xydef@\rrtou{\XXtoY@\U@c\U@p{rr}{u}+}
+\xydef@\ddtol{\XXtoY@\L@c\L@p{dd}{l}+}
+\xydef@\ddtor{\XXtoY@\R@c\R@p{dd}{r}+}
+\xydef@\uutol{\XXtoY@\L@c\L@p{uu}{l}+}
+\xydef@\uutor{\XXtoY@\R@c\R@p{uu}{r}+}
+\xydef@\told{\toXY@\L@c\D@c{l}{d}+}
+\xydef@\tolu{\toXY@\L@c\U@c{l}{u}+}
+\xydef@\tord{\toXY@\R@c\D@c{r}{d}+}
+\xydef@\toru{\toXY@\R@c\U@c{r}{u}+}
+\xydef@\todl{\toXY@\D@c\L@c{d}{l}+}
+\xydef@\todr{\toXY@\D@c\R@c{d}{r}+}
+\xydef@\toul{\toXY@\U@c\L@c{u}{l}+}
+\xydef@\tour{\toXY@\U@c\R@c{u}{r}+}
+\xycatcodes
+\xydef@\TurnRadius{\addEQ@\turnradius}
+\xydef@\diagramcompileto#1#2\enddiagram{\relax
+ \diagram@{\NoCompileMatrices\xycompileto{#1}}{#2}}
+\xydef@\diagramnocompile#1\enddiagram{\relax\diagram@\literal@{#1}}
+\xydef@\CompileAllDiagrams#1{\CompilePrefix{#1}\CompileMatrices}
+\xydef@\NoCompileAllDiagrams{\NoCompileMatrices}
+\xydef@\ReCompileAllDiagrams{\CompileMatrices}
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyweb.tex b/macros/generic/diagrams/xypic/texinputs/xyweb.tex
new file mode 100644
index 0000000000..290612e5de
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyweb.tex
@@ -0,0 +1,94 @@
+%% xyweb.tex from $Id: xyweb.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``Lattice and web'' feature.
+%% Copyright (c) 1994-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{web}{Lattice and web feature}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\message{lattices,}
+\xynew@{count}\lattice@A
+\xynew@{count}\lattice@B
+\xydef@\latticeA{\lattice@A}
+\xydef@\latticeB{\lattice@B}
+\xydef@\xylattice#1#2#3#4{\xy@{LATTICE}{\xylattice@{#1}{#2}{#3}{#4}}}%
+\xydef@\xylattice@#1#2#3#4{%
+ \lattice@A=#1\relax
+ \loop \bgroup\lattice@B=#3\relax
+ \innerlatticeloop@{#4}%
+ \edef\tmp@{\egroup
+ \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max
+ }\tmp@ \ifnum\lattice@A<#2\relax \advance\lattice@A\@ne
+ \repeat }
+\xydef@\innerlatticeloop@#1{%
+ \loop \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ \the\lattice@A,\the\lattice@B @%
+ \edef\latticeX{\expandafter\removePT@\the\X@c}%
+ \edef\latticeY{\expandafter\removePT@\the\Y@c}%
+ \leave@ \latticebody \leave@
+ \ifnum\lattice@B<#1\relax \advance\lattice@B\@ne
+ \repeat }
+\xydef@\croplattice#1#2#3#4#5#6#7#8{\xy@{LATTICE}%
+ {\xycroplattice@{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}%
+\xydef@\xycroplattice@#1#2#3#4#5#6#7#8{%
+ \enter@{\X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max}%
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ #5,0 @\leave@ \X@min=\X@c \leave@
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ #6,0 @\leave@ \X@max=\X@c \leave@
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ 0,#7 @\leave@ \Y@min=\Y@c \leave@
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ 0,#8 @\leave@ \Y@max=\Y@c \leave@
+ \lattice@A=#1\relax
+ \loop
+ \bgroup\lattice@B=#3\relax
+ \enter@{\cfromthec@}\innercroplatticeloop@{#4}\leave@
+ \egroup
+ \ifnum\lattice@A<#2\relax \advance\lattice@A\@ne
+ \repeat \mergecropextents@ }
+\xydef@\innercroplatticeloop@#1{%
+ \loop
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ \the\lattice@A,\the\lattice@B @%
+ \edef\latticeX{\expandafter\removePT@\the\X@c}%
+ \edef\latticeY{\expandafter\removePT@\the\Y@c}%
+ \leave@ \DN@{\latticebody}%
+ \ifdim\X@c<\X@min\DN@{}%
+ \else\ifdim\X@c>\X@max\DN@{}%
+ \else\ifdim\Y@c<\Y@min\DN@{}%
+ \else\ifdim\Y@c>\Y@max\DN@{}%
+ \fi\fi\fi\fi \next@ \leave@
+ \ifnum\lattice@B<#1\relax \advance\lattice@B\@ne
+ \repeat }
+\xydef@\mergecropextents@{%
+ \edef\tmp@{%
+ \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi
+ \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi}%
+ \leave@ \tmp@ }
+\xydef@\deflatticebody@{\def\latticebody{\drop{\bullet}}}
+\xydef@\defaultlatticebody{\deflatticebody@}
+\deflatticebody@
+\xyendinput
diff --git a/macros/generic/diagrams/xypic/texinputs/xyxdvi.tex b/macros/generic/diagrams/xypic/texinputs/xyxdvi.tex
new file mode 100644
index 0000000000..7da34d1d1d
--- /dev/null
+++ b/macros/generic/diagrams/xypic/texinputs/xyxdvi.tex
@@ -0,0 +1,138 @@
+%% xyxdvi.tex from $Id: xyxdvi.doc,v 3.7 2011/03/14 20:14:00 krisrose Exp $
+%%
+%% Xy-pic ``xdvi-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross.moore@mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-2011 Kristoffer H. Rose <krisrose@tug.org>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, see http://www.gnu.org/licenses/.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+\xyprovide{xdvi}{XDVI driver}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross.moore@mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+\xydef@\xdvi@@#1{\dvimessage@{xdvi}{#1}}
+\newdriver{%
+ \xyaddsupport{color}\xdviColor@@
+ \xyaddsupport{crayon}\xdviCrayola@@
+ \xyaddsupport{ps}\xdviPS@@
+ \xyaddsupport{rotate}\xdviRotate@@
+ \xyaddsupport{line}\xdviLine@@
+ \xyaddsupport{frame}\xdviFrames@@
+ \xyaddsupport{tile}\xdviTiles@@
+ \xyaddsupport{tpic}\xdviTPIC@
+}
+\xydef@\xdvi@Color@{\xdviPStypes@
+ \let\xylocalColor@=\xyNoColor@@
+ \def\xycolor@{\xycolor@@}\let\xycolorwarning@=\relax
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}\installPScolor@ }%
+ \else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\xdviCrayola@{}}%
+ \else \DN@{\xystandardcolors@}\fi \next@
+ \let\xdviColor@@=\relax
+ \let\UnloadColor@@=\NoXDVIcolor@
+ }%
+\xydef@\xdviColor@@{\xdvi@Color@}
+\xydef@\NoXDVIcolor@{%
+ \def\xycolor@{\xycolor@@}%
+ \let\xycolor@@=\xyNoColor@
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\xdviColor@@=\xdvi@Color@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\xydef@\NoXDVIcolordvi@{\xywarning@{%
+ Neither colordvi.tex nor colordvi.sty could be found.}%
+ \xyBEcolorcheck@}%
+\xydef@\xdviCrayola@@{\xdviColor@@\xdviCrayola@}
+\xydef@\xdviCrayola@{%
+ \let\prevxycolor@=\newxycolor@
+ \def\newxyXDVIcolor@##1##2##3{\prevxycolor@{##1}{}{##1}}%
+ \let\newxycolor@=\newxyXDVIcolor@
+ \installCrayolaColors@
+ \let\newxycolor@=\prevxycolor@ }%
+\xydef@\xdviPS@@{\xdviPS@}
+\xydef@\xdviPS@unload{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\xdviPS@@=\xdviPS@ }
+\xydef@\xdviPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\xdviSpecial@\else
+ \let\PSspecial@@=\xdviSpecial@
+ \let\PSmacro@@=\xdviMacro@
+ \let\PSdict@@=\xdviDict@
+ \let\PSspecialdict@@=\xdviDict@
+ \let\PSraw@@=\xdviRaw@
+ \let\PSinclude@@=\xdviInclude@
+ \let\xyPSobeylines@@=\obeyXDVIlines@
+ \let\xyPScurrpt@@=\xdviCurrpt@@
+ \xdvi@@{PostScript}%
+ \fi \XYpredict@ }
+\xywarnifdefined\xdviSpecial@
+\xywarnifdefined\xdviMacro@
+\xywarnifdefined\xdviDict@
+\xywarnifdefined\xdviInclude@
+\xywarnifdefined\xdviRaw@
+{\catcode`\"=11 \catcode`\!=11 \catcode`\:=11
+ \gdef\xdviSpecial@#1{\special{ps:: SDict begin #1 end}}
+ \gdef\xdviMacro@#1{\firstPS@@\special{" {#1}xy}}
+ \gdef\xdviDict@#1{\special{! #1}}
+ \gdef\xdviInclude@#1{\special{header=#1}}
+ \gdef\xdviRaw@#1{\special{ps: SDict begin #1 end}}
+\catcode`\^^M=\active
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space }}%
+\xylet@\obeyXDVIlines@=\next
+\xydef@\xdviCurrpt@{\let\xyPScurrpt@@=\xdviCurrpt@@}%
+\xydef@\xdviCurrpt@@{\PSraw@@{xyp}}
+\xydef@\xdviPS@{\xdviPStypes@
+ \let\xdviPS@@=\PSspecials@true
+ \let\UnloadPS@@=\xdviPS@unload
+ \let\installxyps@@=\relax \installxyps@ }
+\xydef@\xdviRotate@@{\xdviRotate@}
+\xydef@\xdviRotate@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xdviCurrpt@ \xdviRotScale@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}UnloadRotate@\relax}\fi
+ \next@ }
+\xydef@\xdviRotScale@{%
+ \def\xyrot@start(##1){{xyct ##1\space xyrs }}%
+ \def\xyrot@end{}%
+ \def\xyscale@start(##1,##2){{xyct ##1\space##2\space xyss }}%
+ \def\xyscale@end{}}
+\xydef@\xdviLine@@{\xdviLine@}
+\xydef@\xdviLine@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\xydef@\xdviFrames@@{\xdviFrames@}
+\xydef@\xdviFrames@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadFrames@\relax}\fi
+ \next@ }
+\xydef@\xdviTiles@@{\xdviTiles@}
+\xydef@\xdviTiles@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\xydef@\xdviTPIC@@{\xdviTPIC@}
+\xydef@\xdviTPIC@{\setupxyTPIC@}
+\xyendinput