summaryrefslogtreecommitdiff
path: root/macros/generic/diagrams/taylor
diff options
context:
space:
mode:
Diffstat (limited to 'macros/generic/diagrams/taylor')
-rw-r--r--macros/generic/diagrams/taylor/Borceux-to-Taylor.tex796
-rw-r--r--macros/generic/diagrams/taylor/V3,90.tex1908
-rw-r--r--macros/generic/diagrams/taylor/V3,91.tex1917
-rw-r--r--macros/generic/diagrams/taylor/V3,93.tex1912
l---------macros/generic/diagrams/taylor/diagrams.sty1
l---------macros/generic/diagrams/taylor/diagrams.tex1
-rw-r--r--macros/generic/diagrams/taylor/index.html599
-rw-r--r--macros/generic/diagrams/taylor/manual.bklt.gzbin0 -> 259169 bytes
-rw-r--r--macros/generic/diagrams/taylor/manual.dvibin0 -> 151084 bytes
-rw-r--r--macros/generic/diagrams/taylor/manual.pdfbin0 -> 344003 bytes
-rw-r--r--macros/generic/diagrams/taylor/manual.ps.gzbin0 -> 258884 bytes
-rw-r--r--macros/generic/diagrams/taylor/manual.tex2695
-rw-r--r--macros/generic/diagrams/taylor/msg1992.html236
13 files changed, 10065 insertions, 0 deletions
diff --git a/macros/generic/diagrams/taylor/Borceux-to-Taylor.tex b/macros/generic/diagrams/taylor/Borceux-to-Taylor.tex
new file mode 100644
index 0000000000..d48eef3845
--- /dev/null
+++ b/macros/generic/diagrams/taylor/Borceux-to-Taylor.tex
@@ -0,0 +1,796 @@
+\message{Partial emulation of Francis Borceux's diagrams using...............}
+% you need Paul Taylor's commutative diagrams package loaded as well.
+\input diagrams
+\message{<Emulation (PT) version 0.21, 16 June 1994>}
+
+% The macro names have been taken from Francis Borceux's "diagram.tex"
+% and replaced with equivalent commands in Paul Taylor's package.
+
+% The "ternary" (4x2), curved, multiple and free arrows have not yet
+% been implemented. To do so requires an option to be added to PT's
+% diagrams which, it is intended, will be in the next version.
+
+% Some of these commands can of course be implemented essentially by
+% copying FB's macros. You can do this if you want to, but I shall not
+% do it myself, distribute your code or guarantee that it will work
+% in future.
+
+% If you want to add commands which do have translations, please send
+% them to me, accompanied by a test file which exercises them. Please
+% test it with both FB's macros and the emulation. Your contributions
+% will then be included in this file, with acknowledgement.
+
+% The commands below are terminated with "\relax". This is to ensure
+% that anything that follows is printed afterwards instead of being
+% interpreted as a label or optional argument. DO NOT MAKE A HABIT OF
+% PUTTING \relax AFTER ARROW COMMANDS. If anything follows a horizontal
+% arrow within a cell, the "through" feature is disabled, so the filler
+% is printed in two parts instead of one. When the filler is made from
+% repeated components, such as those with double shafts, this may result
+% in gaps if the arrow is too short.
+
+% In this version all size parameters are ignored. We ought to save the
+% size specified in \DIAGV, and convert that in sized diagonals to cells.
+
+% If you think this emulation was worth the effort, please tell me!
+% (Otherwise I shaln't bother to maintain it.)
+
+%***************************************************************************
+
+%% crossed LaTeX arrowheads
+\def\lhxla{\lhla\mkern-3mu\scriptaxis+}%%
+\def\rhxla{\scriptaxis+\mkern-2mu\rhla}%%
+\def\uhxla{\hbox{\uhla\raise-1.5ex\hbox to0pt{\hss$\scriptstyle+$\hss}}}%%
+\def\dhxla{\hbox{\dhla\lower-1ex\hbox to0pt{\hss$\scriptstyle+$\hss}}}%%
+\newarrowhead{+la}\rhxla\lhxla\dhxla\uhxla
+
+\newarrowtail+++++
+
+\newarrow{Into}+--->
+\newarrow{Bi}+---{+la}
+\newarrow{Onto}----{+la}
+
+%\newarrow{To}---->
+%\newarrow{Dotsto}....>
+%\newarrow{Eq}=====
+%\newarrow{Mono}
+%\newarrow{ar}---->
+%\newarrow{dotar}....>
+%\newarrow{mono}+--->
+%\newarrow{epi}----{+>}
+%\newarrow{bimo}+---{+la}
+%\newarrow{iso}--{iso}->
+
+% It would be better to define \newarrow's with names like FBar, FBmono, etc
+
+% nohcheck allows arrows in text (ie not maths) mode, amongst other things.
+% The assumption is that you start off with a correct FB diagram; in this
+% case you don't want extra &s being inserted!
+% 2620000sp is approx 40pt (4em at 10pt size)
+\diagramstyle[heads=LaTeX,nohcheck,size=2620000sp]
+
+% This was for debugging, to list the commands as they're defined.
+%\let\ddef\def
+%\ddef\zdef#1{\message{\string#1^^J}\ddef#1}
+%\let\def\zdef
+
+% The begin/end diagram commands.
+\def\DIAG#1{\begin{diagram}[]\relax#1\relax}
+\def\DIAGV#1#2{\dimen0=#1\DiagramCellHeight\CellSize=.01\dimen0
+ \begin{diagram}[]\relax#2\relax}
+\def\diag{\relax\end{diagram}}
+
+% \diagv{t}{l}{b} prints the last item of the diagram and
+% adds a t points extra space at the top of the diagram
+% adds a l points extra space at the left of the diagram
+% adds a b points extra space at the bottom of the diagram
+\def\diagv#1#2#3{\relax\end{diagram}}% currently ignored.
+
+% Overprint, next cell & next line commands
+\def\n#1{&#1}
+\def\nn#1{\\#1}
+\def\cross#1#2{\relax#1\relax#2\relax}
+
+% Make the next arrow bold.
+\def\B{\csname diagramstyle\endcsname[thick]}
+
+% Not implemented.
+\def\movename#1#2#3{#1}
+\def\com{}
+
+% commutative diagram symbol
+%\newcommand{\com}{\begin{picture}(12,8)%
+%\put(6,4){\oval(8,8)[b]}\put(6,4){\oval(8,8)[r]}%
+%\put(6,8){\vector(-1,0){2}}\end{picture}}%
+
+\def\adj{\mbox{$\dashv$}}
+
+% Natural transformations
+\def\nat{\pile{\rTo\\\Downarrow\\\rTo}}
+
+\def\Nat#1#2#3{\pile{\rTo^{#1\qquad}\\
+ \Downarrow{\scriptstyle#2}\\
+ \rTo^{#3\quad}}}
+
+\def\binat{\pile{\rTo\\\Downarrow\\\rTo\\\Downarrow\\\rTo}}
+
+\def\Binat#1#2#3#4#5{\pile{\rTo^{#1\qquad}\\
+ \Downarrow{\scriptstyle#2}\\
+ \rTo^{#3\quad}\\
+ \Downarrow{\scriptstyle#2}\\
+ \rTo^{#3\quad}}}
+
+%***************************************************************************
+% PRIMARY ARROW COMMANDS - FULLY TESTED
+%***************************************************************************
+
+% right-ward in-text arrows
+\def\ar {\rTo\relax}
+\def\dotar{\rDotsto\relax}
+\def\mono {\rInto\relax}
+\def\epi {\rOnto\relax}
+\def\bimo {\rBi\relax}
+\def\iso {\rTo^{\cong}\relax}
+\def\biar {\pile{\rTo\\\rTo}\relax}
+\def\eql {\rEq\relax}
+\def\adjar{\pile{\lTo\\\rTo}\relax}
+
+% labelled right-ward in-text arrows
+\def\Ar #1{\rTo^{#1}\relax}
+\def\Dotar#1{\rDotsto^{#1}\relax}
+\def\Mono #1{\rInto^{#1}\relax}
+\def\Epi #1{\rOnto^{#1}\relax}
+\def\Bimo #1{\rBi^{#1}\relax}
+\def\Iso #1{\rTo^{{\cong}{#1}}\relax}
+\def\Biar #1#2{\pile{\rTo^{#1}\\\rTo_{#2}}\relax}
+%\def\Eql #1{\rEq^{#1}\relax}
+\def\Adjar#1#2{\pile{\lTo^{#1}\\\rTo_{#2}}\relax}
+
+% left-ward in-text arrows
+\def\bkar {\lTo\relax}
+\def\bkdotar{\lDotsto\relax}
+\def\bkmono {\lInto\relax}
+\def\bkepi {\lOnto\relax}
+\def\bkbimo {\lBi\relax}
+\def\bkiso {\lTo^{\cong}\relax}
+\def\bkbiar {\pile{\lTo\\\lTo}\relax}
+\def\bkeql {\lEq\relax}
+\def\bkadjar{\pile{\rTo\\\lTo}\relax}
+
+% labelled left-ward in-text arrows
+\def\Bkar #1{\lTo^{#1}\relax}
+\def\Bkdotar#1{\lDotsto^{#1}\relax}
+\def\Bkmono #1{\lInto^{#1}\relax}
+\def\Bkepi #1{\lOnto^{#1}\relax}
+\def\Bkbimo #1{\lBi^{#1}\relax}
+\def\Bkiso #1{\lTo^{{\cong}{#1}}\relax}
+\def\Bkbiar #1#2{\pile{\lTo^{#1}\\\lTo_{#2}}\relax}
+%\def\Bkeql #1{\lEq^{#1}\relax}
+\def\Bkadjar#1#2{\pile{\rTo^{#1}\\\lTo_{#2}}\relax}
+
+% east-ward diagram arrows
+\def\ear {\rTo\relax}
+\def\edotar{\rDotsto\relax}
+\def\emono {\rInto\relax}
+\def\eepi {\rOnto\relax}
+\def\ebimo {\rBi\relax}
+\def\eiso {\rTo^{\cong}\relax}
+\def\ebiar {\pile{\rTo\\\rTo}\relax}
+\def\eeql {\rEq\relax}
+\def\eadjar{\pile{\lTo\\\rTo}\relax}
+
+% labelled east-ward diagram arrows
+\def\Ear #1{\rTo^{#1}\relax}
+\def\Edotar#1{\rDotsto^{#1}\relax}
+\def\Emono #1{\rInto^{#1}\relax}
+\def\Eepi #1{\rOnto^{#1}\relax}
+\def\Ebimo #1{\rBi^{#1}\relax}
+\def\Eiso #1{\rTo^{{\cong}{#1}}\relax}
+\def\Ebiar #1#2{\pile{\rTo^{#1}\\\rTo_{#2}}\relax}
+%\def\Eeql #1{\rEq^{#1}\relax}
+\def\Eadjar#1#2{\pile{\lTo^{#1}\\\rTo_{#2}}\relax}
+
+% labelled east-ward diagram arrows
+\def\eaR #1{\rTo_{#1}\relax}
+\def\edotaR#1{\rDotsto_{#1}\relax}
+\def\emonO #1{\rInto_{#1}\relax}
+\def\eepI #1{\rOnto_{#1}\relax}
+\def\ebimO #1{\rBi_{#1}\relax}
+\def\eisO #1{\rTo_{{\cong}{#1}}\relax}
+%\def\ebiaR #1#2{\pile{\rTo_{#1}\\\rTo_{#2}}\relax}
+%\def\eeqL #1{\rEq_{#1}\relax}
+%\def\eadjaR#1#2{\pile{\lTo_{#1}\\\rTo_{#2}}\relax}
+
+
+% west-ward diagram arrows
+\def\war {\lTo\relax}
+\def\wdotar{\lDotsto\relax}
+\def\wmono {\lInto\relax}
+\def\wepi {\lOnto\relax}
+\def\wbimo {\lBi\relax}
+\def\wiso {\lTo^{\cong}\relax}
+\def\wbiar {\pile{\lTo\\\lTo}\relax}
+\def\weql {\lEq\relax}
+\def\wadjar{\pile{\rTo\\\lTo}\relax}
+
+% labelled west-ward diagram arrows
+\def\War #1{\lTo^{#1}\relax}
+\def\Wdotar#1{\lDotsto^{#1}\relax}
+\def\Wmono #1{\lInto^{#1}\relax}
+\def\Wepi #1{\lOnto^{#1}\relax}
+\def\Wbimo #1{\lBi^{#1}\relax}
+%\def\Wiso #1{\lTo^{{\cong}{#1}}\relax}%%%%%%% FB's has no \cong!!!!!!!!
+\def\Wiso #1{\lTo^{{#1}}\relax}
+\def\Wbiar #1#2{\pile{\lTo^{#1}\\\lTo_{#2}}\relax}
+%\def\Weql #1{\lEq^{#1}\relax}
+\def\Wadjar#1#2{\pile{\rTo^{#1}\\\lTo_{#2}}\relax}
+
+% labelled west-ward diagram arrows
+\def\waR #1{\lTo_{#1}\relax}
+\def\wdotaR#1{\lDotsto_{#1}\relax}
+\def\wmonO #1{\lInto_{#1}\relax}
+\def\wepI #1{\lOnto_{#1}\relax}
+\def\wbimO #1{\lBi_{#1}\relax}
+%\def\wisO #1{\lTo_{{\cong}{#1}}\relax}%%%%%%%%%%%%% FB's has no \cong!!!!!!!
+\def\wisO #1{\lTo_{{#1}}\relax}
+%\def\wbiaR #1#2{\pile{\lTo_{#1}\\\lTo_{#2}}\relax}
+%\def\weqL #1{\lEq_{#1}\relax}
+%\def\wadjaR#1#2{\pile{\rTo_{#1}\\\lTo_{#2}}\relax}
+
+
+% north-ward diagram arrows
+\def\nar {\uTo\relax}
+\def\ndotar{\uDotsto\relax}
+\def\nmono {\uInto\relax}
+\def\nepi {\uOnto\relax}
+\def\nbimo {\uBi\relax}
+\def\niso {\uTo>{\cong}\relax}
+\def\nbiar {\uTo\uTo\relax}
+\def\neql {\uEq\relax}
+\def\nadjar{\uTo\dTo\relax}
+
+% labelled north-ward diagram arrows
+\def\Nar #1{\uTo^{#1}\relax}
+\def\Ndotar#1{\uDotsto^{#1}\relax}
+\def\Nmono #1{\uInto^{#1}\relax}
+\def\Nepi #1{\uOnto^{#1}\relax}
+\def\Nbimo #1{\uBi^{#1}\relax}
+\def\Niso #1{\uTo<{#1}>{\cong}\relax}
+\def\Nbiar #1#2{uTo^{#1}\uTo_{#2}\relax}
+%\def\Neql #1{\uEq^{#1}\relax}
+\def\Nadjar#1#2{\uTo^{#1}\dTo_{#2}\relax}
+
+% labelled north-ward diagram arrows
+\def\naR #1{\uTo_{#1}\relax}
+\def\ndotaR#1{\uDotsto_{#1}\relax}
+\def\nmonO #1{\uInto_{#1}\relax}
+\def\nepI #1{\uOnto_{#1}\relax}
+\def\nbimO #1{\uBi_{#1}\relax}
+%\def\nisO #1{\uTo_{{\cong}{#1}}\relax}
+%\def\nbiaR #1#2{uTo_{#1}\\\uTo_{#2}\relax}
+%\def\neqL #1{\uEq_{#1}\relax}
+%\def\nadjaR#1#2{\uTo_{#1}\dTo_{#2}\relax}
+
+
+% south-ward diagram arrows
+\def\sar {\dTo\relax}
+\def\sdotar{\dDotsto\relax}
+\def\smono {\dInto\relax}
+\def\sepi {\dOnto\relax}
+\def\sbimo {\dBi\relax}
+\def\siso {\dTo>{\cong}\relax}
+\def\sbiar {\dTo\dTo\relax}
+\def\seql {\dEq\relax}
+\def\sadjar{\dTo\uTo\relax}
+
+% labelled south-ward diagram arrows
+\def\Sar #1{\dTo^{#1}\relax}
+\def\Sdotar#1{\dDotsto^{#1}\relax}
+\def\Smono #1{\dInto^{#1}\relax}
+\def\Sepi #1{\dOnto^{#1}\relax}
+\def\Sbimo #1{\dBi^{#1}\relax}
+\def\Siso #1{\dTo<{#1}>{\cong}\relax}
+\def\Sbiar #1#2{\dTo^{#1}\dTo_{#2}\relax}
+%\def\Seql #1{\dEq^{#1}\relax}
+\def\Sadjar#1#2{\dTo^{#1}\uTo_{#2}\relax}
+
+% labelled south-ward diagram arrows
+\def\saR #1{\dTo_{#1}\relax}
+\def\sdotaR#1{\dDotsto_{#1}\relax}
+\def\smonO #1{\dInto_{#1}\relax}
+\def\sepI #1{\dOnto_{#1}\relax}
+\def\sbimO #1{\dBi_{#1}\relax}
+%\def\sisO #1{\dTo_{{\cong}{#1}}\relax}
+%\def\sbiaR #1#2{\dTo_{#1}\dTo_{#2}\relax}
+%\def\seqL #1{\dEq_{#1}\relax}
+%\def\sadjaR#1#2{\dTo_{#1}\uTo_{#2}\relax}
+
+% east-ward variable-length diagram arrows
+\def\earv #1{\rTo\relax}
+\def\edotarv#1{\rDotsto\relax}
+\def\emonov #1{\rInto\relax}
+\def\eepiv #1{\rOnto\relax}
+\def\ebimov #1{\rBi\relax}
+\def\eisov #1{\rTo^{\cong}\relax}
+\def\ebiarv #1{\pile{\rTo\\\rTo}\relax}
+\def\eeqlv #1{\rEq\relax}
+\def\eadjarv#1{\pile{\lTo\\\rTo}\relax}
+
+% labelled east-ward variable-length diagram arrows
+\def\Earv #1#2{\rTo^{#1}\relax}
+\def\Edotarv#1#2{\rDotsto^{#1}\relax}
+\def\Emonov #1#2{\rInto^{#1}\relax}
+\def\Eepiv #1#2{\rOnto^{#1}\relax}
+\def\Ebimov #1#2{\rBi^{#1}\relax}
+\def\Eisov #1#2{\rTo^{{\cong}{#1}}\relax}
+\def\Ebiarv #1#2#3{\pile{\rTo^{#1}\\\rTo_{#2}}\relax}
+%\def\Eeqlv #1#2{\rEq^{#1}\relax}
+\def\Eadjarv#1#2#3{\pile{\lTo^{#1}\\\rTo_{#2}}\relax}
+
+% labelled east-ward variable-length diagram arrows
+\def\eaRv #1#2{\rTo_{#1}\relax}
+\def\edotaRv#1#2{\rDotsto_{#1}\relax}
+\def\emonOv #1#2{\rInto_{#1}\relax}
+\def\eepIv #1#2{\rOnto_{#1}\relax}
+\def\ebimOv #1#2{\rBi_{#1}\relax}
+\def\eisOv #1#2{\rTo_{{\cong}{#1}}\relax}
+%\def\ebiaRv #1#2#3{\pile{\rTo_{#1}\\\rTo_{#2}}\relax}
+%\def\eeqLv #1#2{\rEq_{#1}\relax}
+%\def\eadjaRv#1#2#3{\pile{\lTo_{#1}\\\rTo_{#2}}\relax}
+
+
+% west-ward variable-length diagram arrows
+\def\warv #1{\lTo\relax}
+\def\wdotarv#1{\lDotsto\relax}
+\def\wmonov #1{\lInto\relax}
+\def\wepiv #1{\lOnto\relax}
+\def\wbimov #1{\lBi\relax}
+\def\wisov #1{\lTo^{\cong}\relax}
+\def\wbiarv #1{\pile{\lTo\\\lTo}\relax}
+\def\weqlv #1{\lEq\relax}
+\def\wadjarv#1{\pile{\rTo\\\lTo}\relax}
+
+% labelled west-ward variable-length diagram arrows
+\def\Warv #1#2{\lTo^{#1}\relax}
+\def\Wdotarv#1#2{\lDotsto^{#1}\relax}
+\def\Wmonov #1#2{\lInto^{#1}\relax}
+\def\Wepiv #1#2{\lOnto^{#1}\relax}
+\def\Wbimov #1#2{\lBi^{#1}\relax}
+\def\Wisov #1#2{\lTo^{{\cong}{#1}}\relax}
+\def\Wbiarv #1#2#3{\pile{\lTo^{#1}\\\lTo_{#2}}\relax}
+%\def\Weqlv #1#2{\lEq^{#1}\relax}
+\def\Wadjarv#1#2#3{\pile{\rTo^{#1}\\\lTo_{#2}}\relax}
+
+% labelled west-ward variable-length diagram arrows
+\def\waRv #1#2{\lTo_{#1}\relax}
+\def\wdotaRv#1#2{\lDotsto_{#1}\relax}
+\def\wmonOv #1#2{\lInto_{#1}\relax}
+\def\wepIv #1#2{\lOnto_{#1}\relax}
+\def\wbimOv #1#2{\lBi_{#1}\relax}
+\def\wisOv #1#2{\lTo_{{\cong}{#1}}\relax}
+%\def\wbiaRv #1#2#3{\pile{\lTo_{#1}\\\lTo_{#2}}\relax}
+%\def\weqLv #1#2{\lEq_{#1}\relax}
+%\def\wadjaRv#1#2#3{\pile{\rTo_{#1}\\\lTo_{#2}}\relax}
+
+
+% north-ward variable-length diagram arrows
+\def\narv #1{\uTo\relax}
+\def\ndotarv#1{\uDotsto\relax}
+\def\nmonov #1{\uInto\relax}
+\def\nepiv #1{\uOnto\relax}
+\def\nbimov #1{\uBi\relax}
+\def\nisov #1{\uTo>{\cong}\relax}
+\def\nbiarv #1{\uTo\uTo\relax}
+\def\neqlv #1{\uEq\relax}
+\def\nadjarv#1{\uTo\dTo\relax}
+
+% labelled north-ward variable-length diagram arrows
+\def\Narv #1#2{\uTo^{#1}\relax}
+\def\Ndotarv#1#2{\uDotsto^{#1}\relax}
+\def\Nmonov #1#2{\uInto^{#1}\relax}
+\def\Nepiv #1#2{\uOnto^{#1}\relax}
+\def\Nbimov #1#2{\uBi^{#1}\relax}
+\def\Nisov #1#2{\uTo<{#1}>{\cong}\relax}
+\def\Nbiarv #1#2#3{\uTo^{#1}\uTo_{#2}\relax}
+%\def\Neqlv #1#2{\uEq^{#1}\relax}
+\def\Nadjarv#1#2#3{\uTo^{#1}\dTo_{#2}\relax}
+
+% labelled north-ward variable-length diagram arrows
+\def\naRv #1#2{\uTo_{#1}\relax}
+\def\ndotaRv#1#2{\uDotsto_{#1}\relax}
+\def\nmonOv #1#2{\uInto_{#1}\relax}
+\def\nepIv #1#2{\uOnto_{#1}\relax}
+\def\nbimOv #1#2{\uBi_{#1}\relax}
+%\def\nisOv #1#2{\uTo_{{\cong}{#1}}\relax}
+%\def\nbiaRv #1#2#3{\uTo_{#1}\uTo_{#2}\relax}
+%\def\neqLv #1#2{\uEq_{#1}\relax}
+%\def\nadjaRv#1#2#3{\uTo_{#1}\dTo_{#2}\relax}
+
+
+% south-ward variable-length diagram arrows
+\def\sarv #1{\dTo\relax}
+\def\sdotarv#1{\dDotsto\relax}
+\def\smonov #1{\dInto\relax}
+\def\sepiv #1{\dOnto\relax}
+\def\sbimov #1{\dBi\relax}
+\def\sisov #1{\dTo>{\cong}\relax}
+\def\sbiarv #1{\dTo\dTo\relax}
+\def\seqlv #1{\dEq\relax}
+\def\sadjarv#1{\dTo\uTo\relax}
+
+% labelled south-ward variable-length diagram arrows
+\def\Sarv #1#2{\dTo^{#1}\relax}
+\def\Sdotarv#1#2{\dDotsto^{#1}\relax}
+\def\Smonov #1#2{\dInto^{#1}\relax}
+\def\Sepiv #1#2{\dOnto^{#1}\relax}
+\def\Sbimov #1#2{\dBi^{#1}\relax}
+\def\Sisov #1#2{\dTo<{#1}>{\cong}\relax}
+\def\Sbiarv #1#2#3{\dTo^{#1}\dTo_{#2}\relax}
+%\def\Seqlv #1#2{\dEq^{#1}\relax}
+\def\Sadjarv#1#2#3{\dTo^{#1}\uTo_{#2}\relax}
+
+% labelled south-ward variable-length diagram arrows
+\def\saRv #1#2{\dTo_{#1}\relax}
+\def\sdotaRv#1#2{\dDotsto_{#1}\relax}
+\def\smonOv #1#2{\dInto_{#1}\relax}
+\def\sepIv #1#2{\dOnto_{#1}\relax}
+\def\sbimOv #1#2{\dBi_{#1}\relax}
+%\def\sisOv #1#2{\dTo_{{\cong}{#1}}\relax}
+%\def\sbiaRv #1#2#3{\dTo_{#1}\dTo_{#2}\relax}
+%\def\seqLv #1#2{\dEq_{#1}\relax}
+%\def\sadjaRv#1#2#3{\dTo_{#1}\uTo_{#2}\relax}
+
+%***************************************************************************
+% THE SECONDARY ARROWS NEED THOROUGH TESTING!
+%***************************************************************************
+
+% north-east-ward diagram arrows
+\def\near {\ruTo\relax}
+\def\nedotar{\ruDotsto\relax}
+\def\nemono {\ruInto\relax}
+\def\neepi {\ruOnto\relax}
+\def\nebimo {\ruBi\relax}
+\def\neiso {\ruTo^{\cong}\relax}
+\def\nebiar {\ruTo\ruTo\relax}
+\def\neeql {\ruEq\relax}
+\def\neadjar{\ldTo\ruTo\relax}
+
+% labelled north-east-ward diagram arrows
+\def\Near #1{\ruTo^{#1}\relax}
+\def\Nedotar#1{\ruDotsto^{#1}\relax}
+\def\Nemono #1{\ruInto^{#1}\relax}
+\def\Neepi #1{\ruOnto^{#1}\relax}
+\def\Nebimo #1{\ruBi^{#1}\relax}
+\def\Neiso #1{\ruTo^{{\cong}{#1}}\relax}
+\def\Nebiar #1#2{\ruTo^{#1}\ruTo_{#2}\relax}
+%\def\Neeql #1{\ruEq^{#1}\relax}
+\def\Neadjar#1#2{\ldTo^{#1}\ruTo_{#2}\relax}
+
+% labelled north-east-ward diagram arrows
+\def\neaR #1{\ruTo_{#1}\relax}
+\def\nedotaR#1{\ruDotsto_{#1}\relax}
+\def\nemonO #1{\ruInto_{#1}\relax}
+\def\neepI #1{\ruOnto_{#1}\relax}
+\def\nebimO #1{\ruBi_{#1}\relax}
+%\def\neisO #1{\ruTo_{{\cong}{#1}}\relax}
+%\def\nebiaR #1#2{\ruTo_{#1}\ruTo_{#2}\relax}
+%\def\neeqL #1{\ruEq_{#1}\relax}
+%\def\neadjaR#1#2{\ldTo_{#1}\ruTo_{#2}\relax}
+
+
+% north-west-ward diagram arrows
+\def\nwar {\luTo\relax}
+\def\nwdotar{\luDotsto\relax}
+\def\nwmono {\luInto\relax}
+\def\nwepi {\luOnto\relax}
+\def\nwbimo {\luBi\relax}
+\def\nwiso {\luTo^{\cong}\relax}
+\def\nwbiar {\luTo\luTo\relax}
+\def\nweql {\luEq\relax}
+\def\nwadjar{\luTo\rdTo\relax}
+
+% labelled north-west-ward diagram arrows
+\def\Nwar #1{\luTo^{#1}\relax}
+\def\Nwdotar#1{\luDotsto^{#1}\relax}
+\def\Nwmono #1{\luInto^{#1}\relax}
+\def\Nwepi #1{\luOnto^{#1}\relax}
+\def\Nwbimo #1{\luBi^{#1}\relax}
+\def\Nwiso #1{\luTo^{{\cong}{#1}}\relax}
+\def\Nwbiar #1#2{\luTo^{#1}\luTo_{#2}\relax}
+%\def\Nweql #1{\luEq^{#1}\relax}
+\def\Nwadjar#1#2{\luTo^{#1}\rdTo_{#2}\relax}
+
+% labelled north-west-ward diagram arrows
+\def\nwaR #1{\luTo_{#1}\relax}
+\def\nwdotaR#1{\luDotsto_{#1}\relax}
+\def\nwmonO #1{\luInto_{#1}\relax}
+\def\nwepI #1{\luOnto_{#1}\relax}
+\def\nwbimO #1{\luBi_{#1}\relax}
+%\def\nwisO #1{\luTo_{{\cong}{#1}}\relax}
+%\def\nwbiaR #1#2{\luTo_{#1}\luTo_{#2}\relax}
+%\def\nweqL #1{\luEq_{#1}\relax}
+%\def\nwadjaR#1#2{\luTo_{#1}\rdTo_{#2}\relax}
+
+
+% south-east-ward diagram arrows
+\def\sear {\rdTo\relax}
+\def\sedotar{\rdDotsto\relax}
+\def\semono {\rdInto\relax}
+\def\seepi {\rdOnto\relax}
+\def\sebimo {\rdBi\relax}
+\def\seiso {\rdTo^{\cong}\relax}
+\def\sebiar {\rdTo\rdTo\relax}
+\def\seeql {\rdEq\relax}
+\def\seadjar{\rdTo\luTo\relax}
+
+% labelled south-east-ward diagram arrows
+\def\Sear #1{\rdTo^{#1}\relax}
+\def\Sedotar#1{\rdDotsto^{#1}\relax}
+\def\Semono #1{\rdInto^{#1}\relax}
+\def\Seepi #1{\rdOnto^{#1}\relax}
+\def\Sebimo #1{\rdBi^{#1}\relax}
+\def\Seiso #1{\rdTo^{{\cong}{#1}}\relax}
+\def\Sebiar #1#2{\rdTo^{#1}\rdTo_{#2}\relax}
+%\def\Seeql #1{\rdEq^{#1}\relax}
+\def\Seadjar#1#2{\rdTo^{#1}\luTo_{#2}\relax}
+
+% labelled south-east-ward diagram arrows
+\def\seaR #1{\rdTo_{#1}\relax}
+\def\sedotaR#1{\rdDotsto_{#1}\relax}
+\def\semonO #1{\rdInto_{#1}\relax}
+\def\seepI #1{\rdOnto_{#1}\relax}
+\def\sebimO #1{\rdBi_{#1}\relax}
+%\def\seisO #1{\rdTo_{{\cong}{#1}}\relax}
+%\def\sebiaR #1#2{\rdTo_{#1}\rdTo_{#2}\relax}
+%\def\seeqL #1{\rdEq_{#1}\relax}
+%\def\seadjaR#1#2{\rdTo_{#1}\luTo_{#2}\relax}
+
+
+% south-west-ward diagram arrows
+\def\swar {\ldTo\relax}
+\def\swdotar{\ldDotsto\relax}
+\def\swmono {\ldInto\relax}
+\def\swepi {\ldOnto\relax}
+\def\swbimo {\ldBi\relax}
+\def\swiso {\ldTo^{\cong}\relax}
+\def\swbiar {\ldTo\ldTo\relax}
+\def\sweql {\ldEq\relax}
+\def\swadjar{\ruTo\ldTo\relax}% ?
+
+% labelled south-west-ward diagram arrows
+\def\Swar #1{\ldTo^{#1}\relax}
+\def\Swdotar#1{\ldDotsto^{#1}\relax}
+\def\Swmono #1{\ldInto^{#1}\relax}
+\def\Swepi #1{\ldOnto^{#1}\relax}
+\def\Swbimo #1{\ldBi^{#1}\relax}
+\def\Swiso #1{\ldTo^{{\cong}{#1}}\relax}
+\def\Swbiar #1#2{\ldTo^{#1}\ldTo_{#2}\relax}
+%\def\Sweql #1{\ldEq^{#1}\relax}
+\def\Swadjar#1#2{\ruTo^{#1}\ldTo_{#2}\relax}% ?
+
+% labelled south-west-ward diagram arrows
+\def\swaR #1{\ldTo_{#1}\relax}
+\def\swdotaR#1{\ldDotsto_{#1}\relax}
+\def\swmonO #1{\ldInto_{#1}\relax}
+\def\swepI #1{\ldOnto_{#1}\relax}
+\def\swbimO #1{\ldBi_{#1}\relax}
+%\def\swisO #1{\ldTo_{{\cong}{#1}}\relax}
+%\def\swbiaR #1#2{\ldTo_{#1}\ldTo_{#2}\relax}
+%\def\sweqL #1{\ldEq_{#1}\relax}
+%\def\swadjaR#1#2{\ruTo_{#1}\ldTo_{#2}\relax}% ?
+
+% secondary variable-length diagram arrows
+\def\nwarv#1{\luTo\relax}%
+\def\nearv#1{\ruTo\relax}%
+\def\swarv#1{\ldTo\relax}%
+\def\searv#1{\rdTo\relax}%
+
+% labelled secondary variable-length diagram arrows
+\def\nwaRv#1#2{\luTo^{#1}\relax}%
+\def\neaRv#1#2{\ruTo^{#1}\relax}%
+\def\swaRv#1#2{\ldTo^{#1}\relax}%
+\def\seaRv#1#2{\rdTo^{#1}\relax}%
+\def\Nwarv#1#2{\luTo^{#1}\relax}%
+\def\Nearv#1#2{\ruTo^{#1}\relax}%
+\def\Swarv#1#2{\ldTo^{#1}\relax}%
+\def\Searv#1#2{\rdTo^{#1}\relax}%
+
+% curved arrows second argument is length
+\def\Necurve#1#2{\uTo^{#1}\relax}
+\def\Nwcurve#1#2{\uTo^{#1}\relax}
+\def\Securve#1#2{\dTo^{#1}\relax}
+\def\Swcurve#1#2{\dTo^{#1}\relax}
+\def\Encurve#1#2{\rTo^{#1}\relax}
+\def\Escurve#1#2{\rTo^{#1}\relax}
+\def\Wncurve#1#2{\lTo^{#1}\relax}
+\def\Wscurve#1#2{\lTo^{#1}\relax}
+
+%***************************************************************************
+% THE TERNARY ARROWS ARE NOT CORRECTLY PLACED!
+%***************************************************************************
+
+% ternary arrows --- MISPLACED!
+\def\nnwar{\luTo[diagonalbase=(1,2)](2,4)\relax}
+\def\nnear{\ruTo[diagonalbase=(1,2)](2,4)\relax}
+\def\wnwar{\luTo[diagonalbase=(2,1)](4,2)\relax}
+\def\enear{\ruTo[diagonalbase=(2,1)](4,2)\relax}
+\def\sswar{\ldTo[diagonalbase=(1,2)](2,4)\relax}
+\def\ssear{\rdTo[diagonalbase=(1,2)](2,4)\relax}
+\def\wswar{\ldTo[diagonalbase=(2,1)](4,2)\relax}
+\def\esear{\rdTo[diagonalbase=(2,1)](4,2)\relax}
+
+% labelled ternary arrows --- MISPLACED!
+\def\Nnwar#1{\luTo[diagonalbase=(1,2)](2,4)^{#1}\relax}
+\def\Nnear#1{\ruTo[diagonalbase=(1,2)](2,4)^{#1}\relax}
+\def\Wnwar#1{\luTo[diagonalbase=(2,1)](4,2)^{#1}\relax}
+\def\Enear#1{\ruTo[diagonalbase=(2,1)](4,2)^{#1}\relax}
+\def\Sswar#1{\ldTo[diagonalbase=(1,2)](2,4)^{#1}\relax}
+\def\Ssear#1{\rdTo[diagonalbase=(1,2)](2,4)^{#1}\relax}
+\def\Wswar#1{\ldTo[diagonalbase=(2,1)](4,2)^{#1}\relax}
+\def\Esear#1{\rdTo[diagonalbase=(2,1)](4,2)^{#1}\relax}
+
+% labelled ternary arrows --- MISPLACED!
+\def\nnwaR#1{\luTo[diagonalbase=(1,2)](2,4)_{#1}\relax}
+\def\nneaR#1{\ruTo[diagonalbase=(1,2)](2,4)_{#1}\relax}
+\def\wnwaR#1{\luTo[diagonalbase=(2,1)](4,2)_{#1}\relax}
+\def\eneaR#1{\ruTo[diagonalbase=(2,1)](4,2)_{#1}\relax}
+\def\sswaR#1{\ldTo[diagonalbase=(1,2)](2,4)_{#1}\relax}
+\def\sseaR#1{\rdTo[diagonalbase=(1,2)](2,4)_{#1}\relax}
+\def\wswaR#1{\ldTo[diagonalbase=(2,1)](4,2)_{#1}\relax}
+\def\eseaR#1{\rdTo[diagonalbase=(2,1)](4,2)_{#1}\relax}
+
+%***************************************************************************
+% THE CURVED ARROWS ARE NOT SUPPORTED!
+%***************************************************************************
+
+% curved arrows
+\def\necurve#1{\uTo^{#1}\relax}
+\def\nwcurve#1{\uTo^{#1}\relax}
+\def\securve#1{\dTo^{#1}\relax}
+\def\swcurve#1{\dTo^{#1}\relax}
+\def\encurve#1{\rTo^{#1}\relax}
+\def\escurve#1{\rTo^{#1}\relax}
+\def\wncurve#1{\lTo^{#1}\relax}
+\def\wscurve#1{\lTo^{#1}\relax}
+
+% The remainder of this file is included so that the original
+% and emulated versions appear to have the same commands in them.
+%
+% missing commands
+%\def\ADJAR#1{}% draws a pair of adjoint arrows of length n units
+%\def\AR#1{}% draws an arrow of length n units
+%\def\BIAR#1{}% draws a pair of arrows of length n units
+%\def\BIMO#1{}% draws a bimorphism of length n units
+%\def\BKADJAR#1{}% draws a pair of adjoint arrows of length n units
+%\def\BKAR#1{}% draws a pointing back arrow of length n units
+%\def\BKBIAR#1{}% draws a pair of pointing back arrows of length n units
+%\def\BKBIMO#1{}% draws a pointing back bimorphism of length n units
+%\def\BKDOTAR#1{}% draws a backward dotted arrow
+%\def\BKEPI#1{}% draws a pointing back epimorphism of length n units
+%\def\BKMONO#1{}% draws a pointing back monomorphism of length n units
+%\def\DOTAR#1{}% draws a dotted arrow of length n units
+%\def\EADJAR#1{}% draws an east pair of adjoint arrows of length n
+%\def\EAR#1{}% draws an east arrow of length n units
+%\def\EBIAR#1{}% draws an east pair of arrows of length n units
+%\def\EBIMO#1{}% draws an east bimorphism of length n units
+%\def\EDOTAR{}% draws a dotted arrow of length n units
+%\def\EEPI#1{}% draws an east epimorphism of length n units
+%\def\EEQL#1{}% draws an east equality of length n units
+%\def\EMONO#1{}% draws an east monomorphism of length n units
+%\def\ENEAR{f}{g}{}% draws a east-north-east arrow with names f, g
+%\def\EPI#1{}% draws an epimorphism of length n units
+%\def\EQL#1{}% draws an equality of length n units
+%\def\ESEAR{f}{g}% draws an east-south-east arrow with names f, g
+%\def\MONO{}%
+%\def\NADJAR#1{}% draws a pair of vertical adjoint arrows of length n pt
+%\def\NAR#1{}% draws a north arrow of length n pt
+%\def\NBIAR#1{}% draws a pair of north arrows of length n pt
+%\def\NBIMO#1{}% draws a north bimorphism of length n pt
+%\def\NDOTAR#1{}% draws a north dotted arrow of length n units
+%\def\NEADJAR{}% draws a north-east pair of adjoint arrows
+%\def\NEAR{}% draws a north-east arrow
+%\def\NEARV#1{}% draws a north-east arrow of length nx100 units
+%\def\NEBIAR{}% draws a pair of north-east arrows
+%\def\NEBIMO{}% draws a north-east bimorphism
+%\def\NEDOTAR{}% draws a north-east dotted arrow
+%\def\NEEPI{}% draws a north-east epimorphism
+%\def\NEEQL{}% draws a north-east equality
+%\def\NEMONO{}% draws a north-east monomorphism
+%\def\NEPI#1{}% draws a north epimorphism of length n pt
+%\def\NMONO#1{}% draws a north monomorphism of length n pt
+%\def\NNEAR{f}{g}{}% draws a north-north-east arrow with names f, g
+%\def\NNWAR{f}{g}{}% draws a north-north-west arrow with names f, g
+%\def\NWADJAR{}% draws a north-west pair of adjoint arrows
+%\def\NWAR{}% draws a north-west arrow
+%\def\NWARV#1{}% draws a north-west arrow of length nx100 units
+%\def\NWBIAR{}% draws a pair of north-west arrows
+%\def\NWBIMO{}% draws a north-west bimorphism
+%\def\NWDOTAR{}% draws a north-west dotted arrow
+%\def\NWEPI{}% draws a north-west epimorphism
+%\def\NWMONO{}% draws a north-west monomorphism
+%\def\SADJAR#1{}% draws a pair of vertical adjoint arrows of length n units
+%\def\SAR#1{}% draws a south arrow of length n units
+%\def\SBIAR#1{}% draws a pair of south arrows of length n units
+%\def\SBIMO#1{}% draws a south bimorphism of length n units
+%\def\SDOTAR#1{}% draws a south dotted arrow of length n units
+%\def\SEADJAR{}% draws a south-east pair of adjoint arrows
+%\def\SEAR{}% draws a south-east arrow
+%\def\SEARV#1{}% draws a south-east arrow of length nx100 units
+%\def\SEBIAR{}% draws a pair of south-east arrows
+%\def\SEBIMO{}% draws a south-east bimorphism
+%\def\SEDOTAR{}% draws a south-east dotted arrow
+%\def\SEEPI{}% draws a south-east epimorphism
+%\def\SEEQL{}% draws a south-east equality
+%\def\SEMONO{}% draws a south-east monomorphism
+%\def\SEPI#1{}% draws a south epimorphism of length n units
+%\def\SEQL#1{}% draws a vertical equality of length n units
+%\def\SMONO#1{}% draws a south monomorphism of length n units
+%\def\SSEAR{f}{g}{}% draws a south-south-east arrow with names f, g
+%\def\SSWAR{f}{g}{}% draws a south-south-west arrow with names f, g
+%\def\SWADJAR{}% draws a south-west pair of adjoint arrows
+%\def\SWAR{}% draws a south-west arrow
+%\def\SWARV#1{}% draws a south-west arrow of length nx100 units
+%\def\SWBIAR{}% draws a pair of south-west arrows
+%\def\SWBIMO{}% draws a south-west bimorphism
+%\def\SWDOTAR{}% draws a south-west dotted arrow
+%\def\SWEPI{}% draws a south-west epimorphism
+%\def\SWMONO{}% draws a south-west monomorphism
+%\def\WADJAR#1{}% draws a pair of adjoint arrows of length n units
+%\def\WAR#1{}% draws a pointing back arrow of length n units
+%\def\WBIAR#1{}% draws a pair of pointing back arrows of length n units
+%\def\WBIMO#1{}% draws a pointing back bimorphism of length n units
+%\def\WDOTAR{}% draws a dotted arrow of length n units
+%\def\WEPI#1{}% draws a pointing back epimorphism of length n units
+%\def\WMONO#1{}% draws a pointing back monomorphism of length n units
+%\def\WNWAR{f}{g}% draws a west-north-west arrow with names f, g
+%\def\WSWAR{f}{g}% draws a west-south-west arrow with names f, g
+%
+%\newcount\ARROW{}%
+%\newcount\ARROWLENGTH{}%
+%\newcount\COLUMN{}%
+%\newcount\LINE{}%
+%\newcount\NUMBER{}%
+%\newcount\NUMBEROFDOTS{}%
+%\newcount\SCALE{}%
+%\newcount\SOURCE{}%
+%\newcount\TARGET
+%\newcount\WIDTH
+%\newskip\firstitem
+%\newskip\itemlength
+%\newskip\seconditem
+%
+%\def\Freear{}%
+%\def\Hbicase{}%
+%\def\Hcase{}%
+%\def\N{}%
+%\def\Tbicase{}%
+%\def\Tcase{}%
+%\def\Vbicase{}%
+%\def\Vcase{}%
+%\def\changecounters{}%
+%\def\conclude{}%
+%\def\crosslength{}%
+%\def\fdbicase{}%
+%\def\fdcase{}%
+%\def\freear{}%
+%\def\hbicase{}%
+%\def\hcasE{}%
+%\def\hcase{}%
+%\def\initialize{}%
+%\def\lowername{}%
+%\def\movearrow{}%
+%\def\movevertex{}%
+%\def\sdbicase{}%
+%\def\sdcase{}%
+%\def\tbicase{}%
+%\def\tcase{}%
+%\def\tlowername{}%
+%\def\truex{}%
+%\def\truey{}%
+%\def\truez{}%
+%\def\vbicase{}%
+%\def\vcasE{}%
+%\def\vcase{}%
+%
+%
+%\let\def\ddef\bye \ No newline at end of file
diff --git a/macros/generic/diagrams/taylor/V3,90.tex b/macros/generic/diagrams/taylor/V3,90.tex
new file mode 100644
index 0000000000..b5b5223039
--- /dev/null
+++ b/macros/generic/diagrams/taylor/V3,90.tex
@@ -0,0 +1,1908 @@
+% mangletex (24 Nov 1995) run at 16:49 BST Sunday 11 April 2004
+\message{<Paul Taylor's commutative diagrams, version 3.90, 11 April 2004>}%
+%%
+\message{#===============================================================#}%
+\message{........PostScript mode (dvips) is now the default...............}%
+\message{(DVI mode has not been supported since 1992 and produces inferior}%
+\message{results which are completely unsuitable for publication. However,}%
+\message{if you really still need it, read the manual for how to get it.)}%
+\message{#===============================================================#}%
+%%
+%% This code runs the LaTeX \ProvidesPackage command iff it is defined.
+%% included at the request of Michael Downes <mjd@ams.org> March 2002.
+%% Put \listfiles in your LaTeX preamble to see the effect.
+\expandafter\ifx\csname ProvidesPackage\endcsname\relax\toks0=\expandafter{%
+\fi\ProvidesPackage{diagrams}[2004/04/11 v3.90 Paul Taylor's commutative
+diagrams]%%
+\toks0=\bgroup}%%
+%%======================================================================%
+%% TeX macros for drawing category-theoretic diagrams %
+%% %
+%% Paul Taylor %
+%% %
+%% www.ctan.org/tex-archive/macros/generic/diagrams/taylor %
+%% www.cs.man.ac.uk/~pt/diagrams %
+%% %
+%% PLEASE READ THE MANUAL! %
+%% %
+%% Please ensure that you are registered with me as a user so that %
+%% you can be informed of future releases. Any electronic mail %
+%% message with "commutative" or "diagram" in the subject line %
+%% (such as your request for the package, a question about it, or %
+%% even an otherwise blank message) automatically registers you. %
+%% %
+%% %
+%% CONTENTS: %
+%% (O) corruption-sensitive hacks (to approx line 328) %
+%% Arrow components & commands - starts approx line 1240 %
+%% (22) auxillary macros for adjustment of components %
+%% (23) bits of arrows (\rhvee etc) %
+%% (24) arrow commands (\rTo etc) %
+%% (25) miscellaneous %
+%% Apart from these five sections, the rest is intended to be totally %
+%% meaningless in the undocumented version, which is approximately %
+%% 1910 lines long. Please do not waste trees by printing it out. %
+%% %
+%% COPYRIGHT NOTICE: %
+%% This package may be copied and used freely for any academic %
+%% (not commercial or military) purpose, on condition that it %
+%% is not altered in any way, and that an acknowledgement is %
+%% included in any published work making substantial use of it. %
+%% %
+%% IT IS SUPPLIED "AS IS", WITHOUT WARRANTY, EXPRESS OR IMPLIED. %
+%% %
+%% If you are doing something where mistakes cost money (or where %
+%% success brings financial profit) then you must use commercial %
+%% software, not this package. In any case, please remember to %
+%% keep several backup copies of all files, and check everything %
+%% visually before sending final copy to the publishers. %
+%% %
+%% You may use this package as a (substantial) aid to writing an %
+%% academic research or text book on condition that %
+%% (i) you contact me at a suitable time to ensure that you have %
+%% an up-to-date version (and any infelicities can be fixed), %
+%% (ii) you send me a copy of the book when it's published. %
+%% %
+%% HISTORY %
+%% 3.90 Released 11 April 2004 %
+%% use PostScript=Rokicki not pure DVI by default %
+%% 3.89 Released 7 July 2002 %
+%% Added support for pdftex, which is recognised automatically. %
+%% 3.88 Released 1 September 2000 %
+%% Square hook tail: \newarrow{SquareInto}{sqhook}---> %
+%% 3.87 Released 1 September 1999 %
+%% This version was used for the final 1200dpi PS copy of my book %
+%% ``Practical Foundations of Mathematics'' (Cambridge Univ Press) %
+%% see http://www.dcs.qmw.ac.uk/~pt/Practical_Foundations %
+%% 3.86 Released 1 September 1998 %
+%% New options hug and nohug in PostScript mode: [PS,nohug] uses %
+%% PS for the arrows without rotating the labels, but the way of %
+%% calculating the actual position of these horizontal labels on %
+%% will remain subject to alteration for some period of time --- %
+%% please send me examples if you feel that adjustment is needed. %
+%% %
+%% Suppress indentation of following text (due to LaTeX change) %
+%% Mangle \left@label and \right@label (conflict with Elsevier). %
+%% midvshaft and snake for vertical arrows %
+%% New option [gap=width] (default=shortfall) to use instead of %
+%% ~{\;} on horizontals and PS diagonals, as this caused ^ and _ %
+%% labels to be moved too far away from the shaft. %
+%% Added >-> and <-< heads and tails, same as >> and << but the %
+%% shaft goes *through* the extra arrowhead. %
+%% 3.85 Released 20 August 1997 %
+%% New option [crab=distance] shifts horizontals and PS diagonals %
+%% transversally by the specified distance (positive=upward). %
+%% New option [snake=distance] shifts midshaft horizontals and %
+%% PS diagonals longitudinally by the specified distance. %
+%% New option [leftflush], like [flushleft] but reckons alignment %
+%% from multiple verticals, or from text if there's no vertical. %
+%% Most of the history has been suppressed from the user version. %
+%% 3.83 Released 18 May 1995 %
+%% "dotted" option (set dot filler on maps) %
+%% Parallel maps (\pile) outside diagrams stretch correctly. %
+%% Option "LaTeXeqno" uses LaTeX's equation number and style %
+%% for "eqno"; LaTeX's \label command picks this up. %
+%% Suppress warnings & 2nd pass errors with "silent" option. %
+%% 3.81 Second alpha release 18 July 1994 %
+%% \overprint{text} sets text in maths and overprints it in the %
+%% current cell, centered in the column irrespective of other stuff%
+%% "repositionpullbacks" option uses this for \SEpbk etc %
+%% \newdiagramgrid declaration, grid option and pentagon grid. %
+%% 3.80 Alpha release for adjusted diagonals 15 July 1994. %
+%% Introduced landscape and portrait options. %
+%% Diagonals adjusted to meet their endpoints, at last!!!! %
+%% 3.28 Released 30 November 1993 %
+%% Peter Freyd's \puncture symbol provided. %
+%% 3.25 Released 30 January 1993 %
+%% LaTeX heads made default (unless \tenln undefined, when vee) %
+%% Circle, cross, little vee, little black triangle heads. %
+%% First-use warning when defaulted diagonal components are used. %
+%% AMSTEX emulation - works at least when amstex not present. %
+%% 3.24 Release 7 Sept 1992 advertised to users. %
+%% PostScript option introduced: %
+%% LaTeX, vee, curlyvee, triangle & blacktriangle heads & tails %
+%% TPIC option introduced as an alternative to \LaTeX@make@line. %
+%% Postscript arrows (basic code). %
+%% Implemented \newarrow \newarrowhead etc. %
+%% Horizontal arrows outside diagram can stretch by wordspacing. %
+%% Added < and > for labels on left and right of arrow; %
+%% 3.16 (20.7.90) as mass mailed; only have mangled version %
+%% -- all following version numbers are post-facto -- %
+%% 3 (Jan 90) stretching vertical arrows %
+%% 2 (Sept 89) horizontals stretch to objects; "superscript" labels %
+%% 1 (1987) horizontal arrows stretch to edge of cell %
+%% 0 (1986) implementation of Knuth's TeXercise 18.46 for my thesis %
+%%======================================================================%
+
+%%======================================================================%
+%% %
+%% (1) CORRUPTION-SENSITIVE HACKS %
+%% %
+%%======================================================================%
+
+%% CORRUPTION & \catcode WARNING
+
+%% BITNET (IBM) machines may corrupt certain important characters
+%% in transmission by electronic mail:
+%% 0123456789=digits, abcdefghijklmnopqrstuvwxyz=lowers,
+%% ABCDEFGHIJKLMNOPQRSTUVWXYZ=uppers, @=at (internal names),
+%% {}=curly braces (grouping), \=backslash (keywords),
+%% %=percent (comment), #=hash/sharp (argument), +=plus, -=minus,
+%% <>=angle brackets (relations \ifnum,\ifdim), ==equals,
+%% ,=comma, .=dot, :=colon, ;=semicolon, =space
+%% $=dollar (maths) is only used in the "bits of maps" section
+
+%% The following characters are marked by a comment including the word "ASCII",
+%% except in comments and messages:
+%% &=and (alignment), ~=tilde, |=vertical, []=square brackets,
+%% ^=caret (superscript), _=underline (subscript),
+%% `=grave/backquote (catcodes), '=acute/single quote (octal),
+%% "=double quote (hex), ()=round brackets,
+%% /=slash, ?=query, !=pling/bang,
+
+%% The \catcode's marked * are assumed for reading this file:
+%% \=0* {=1* }=2* $=3 &=4 return=5* #=6 ^=7 _=8 ignored=9*
+%% space=10* letter=11* other=12 active=13 %=14* invalid=15
+%% If you want to load this package inside Stallman's "texinfo", you must do
+%%% @catcode`@\=0 \catcode`\%=14 \input diagrams \catcode`\%=12 \catcode`\\=13
+%% and then use @diagram @rTo @\ @enddiagram etc. (braces {} stay the same).
+%% Also need @catcode`@&=4.
+
+%%*** You *MUST NOT* use the internal commands (with names beginning \CD@)****
+%% don't load me twice!
+\ifx\diagram\undefined\else\message{WARNING: the \string\diagram\space command
+is already defined and will not be loaded again}\expandafter\endinput\fi
+
+%% make @ letter, saving its old code to restore at the end of this file
+%%% look for this on the last line of the file if you think something's missing!
+%% the other \catcode assignments are to make it work with texinfo.
+\edef\cdrestoreat{%%
+\noexpand\catcode\lq\noexpand\@=\the\catcode\lq\@%%
+\noexpand\catcode\lq\noexpand\#=\the\catcode\lq\#%%
+\noexpand\catcode\lq\noexpand\$=\the\catcode\lq\$%%
+\noexpand\catcode\lq\noexpand\<=\the\catcode\lq\<%%
+\noexpand\catcode\lq\noexpand\>=\the\catcode\lq\>%%
+\noexpand\catcode\lq\noexpand\:=\the\catcode\lq\:%% Johannes L. Braams's
+\noexpand\catcode\lq\noexpand\;=\the\catcode\lq\;%% Babel languages package
+\noexpand\catcode\lq\noexpand\!=\the\catcode\lq\!%% makes these \active.
+\noexpand\catcode\lq\noexpand\?=\the\catcode\lq\?%%
+\noexpand\catcode\lq\noexpand\+=\the\catcode\rq53%
+%% texinfo @+ is @outer@active
+}\catcode\lq\@=11 \catcode\lq\#=6 \catcode\lq\<=12 \catcode\lq\>=12 \catcode
+\rq53=12 \catcode\lq\:=12 \catcode\lq\;=12 \catcode\lq\!=12 \catcode\lq\?=12
+
+%% Change y to n if pool_size in your implementation of TeX is small.
+%% This is reasonable if you have a small ("personal") computer, but if you
+%%% have a sun, dec, hp, ... workstation or a mainframe, complain to your local
+%% system manager and get him/her to install a version of TeX with bigger
+%% parameters. The "hash size" (number of command names) gets you next.
+\ifx\diagram@help@messages\undefined\let\diagram@help@messages y\fi
+
+%% The following macro is used to include literal PostScript commands in the
+%% DVI file for rotation, etc. Since this goes beyond standard TeX, it is
+%%% dependent on the convention used by your local DVI-to-PostScript translator.
+%% Choose whichever line applies to the program used at your site, or, if
+%% yours is not listed, consult the manual, experiment with this macro and
+%% (please) tell me what is needed to make it work.
+%%
+%%
+%%% dvips (Tomas Rokicki, Radical Eye) labrea.stanford.edu /pub/dvips9999.tar.Z
+%% CTAN: dviware/dvips
+\def\cdps@Rokicki#1{\special{ps:#1}}\let\cdps@dvips\cdps@Rokicki\let
+\cdps@RadicalEye\cdps@Rokicki\let\CD@IK\cdps@Rokicki\let\CD@HB\cdps@Rokicki
+%%
+%% I'm not sure that the rest work.
+%%
+%% dvitps (Stephan Bechtolsheim, Integrated Computer Systems)
+%% arthur.cs.purdue.edu /pub/TeXPS-9.99.tar.Z
+\def\cdps@Bechtolsheim#1{\special{dvitps: Literal "#1"}}%
+%% ASCII two dbl quotes
+\let\cdps@dvitps\cdps@Bechtolsheim\let\cdps@IntegratedComputerSystems
+\cdps@Bechtolsheim%%
+%% dvitops (James Clark)
+%% CTAN: dviware/dvitops
+\def\cdps@Clark#1{\special{dvitops: inline #1}}%%
+\let\cdps@dvitops\cdps@Clark%%
+%% OzTeX (Andrew Trevorrow) cannot be used
+\let\cdps@OzTeX\empty\let\cdps@oztex\empty\let\cdps@Trevorrow\empty%%
+%% dvi3ps (Kevin Coombes)
+%% CTAN: dviware/dvi2ps/dvi3ps
+\def\cdps@Coombes#1{\special{ps-string #1}}%%
+%% psprint (Trevorrow) CTAN: dviware/psprint
+%% dvi2ps (Senn) CTAN: dviware/dvi2ps
+%% psdvi (Elwell) CTAN: dviware/dvi2ps/psdvi
+
+\count@=\year\multiply\count@12 \advance\count@\month%%
+\ifnum\count@>24080 %% (August 2006)
+\message{***********************************************************}%%ascii
+\message{! YOU HAVE AN OUT OF DATE VERSION OF COMMUTATIVE DIAGRAMS! *}%%
+\message{! it expired in December 2004 and is time-bombed for January *}%%
+\message{! You may get an up to date version of this package from *}%%ascii
+\message{! ftp://ftp.dcs.qmw.ac.uk/pub/tex/contrib/pt/diagrams/ *}%%
+\message{***********************************************************}%%ascii
+\ifnum\count@>24083 %% (November 2006)
+\errhelp{You may press RETURN and carry on for the time being.}\message{! It
+is embarrassing to see papers in conference proceedings}\message{! and
+journals containing bugs which I had fixed years before.}\message{! It is easy
+to obtain and install a new version, which will}\errmessage{! remain
+compatible with your files. Please get it NOW.}\fi\fi
+
+\def\CD@DE{\global\let}\def\CD@RH{\outer\def}
+
+%% safe names for braces, tab (&) and maths ($), as commands and for messages
+{\escapechar\m@ne\xdef\CD@o{\string\{}\xdef\CD@yC{\string\}}%%
+%%
+%% three ASCII ampersands (ands) (&&&) appear on the next line
+\catcode\lq\&=4 \CD@DE\CD@Q=&\xdef\CD@S{\string\&}%%ascii three ands
+%%
+%% ASCII ^ and _ each appear twice on next line
+%% six ASCII dollars ($$$$$$) appear on the next two lines.
+\catcode\lq\$=3 \CD@DE\CD@k=$\CD@DE\CD@ND=$%%ascii three dollars
+\xdef\CD@nC{\string\$}\gdef\CD@LG{$$}%%ascii three dollars
+%%
+%% two ASCII underlines (__) appear on the next line.
+\catcode\lq\_=8 \CD@DE\CD@lJ=_%%ascii two underlines
+%%
+%% eight ASCII carets (^^^^^^^^) appear on the next three lines.
+\obeylines\catcode\lq\^=7 \CD@DE\@super=^%%ascii two carets
+\ifnum\newlinechar=10 \gdef\CD@uG{^^J}%%ascii two carets
+\else\ifnum\newlinechar=13 \gdef\CD@uG{^^M}%%ascii two carets
+\else\ifnum\newlinechar=-1 \gdef\CD@uG{^^J}%%ascii two carets
+\else\CD@DE\CD@uG\space\expandafter\message{! input error: \noexpand
+\newlinechar\space is ASCII \the\newlinechar, not LF=10 or CR=13.}%%
+\fi\fi\fi}%%
+
+%% avoid using <> (because I personally re-define them to mean \langle\rangle)
+\mathchardef\lessthan=\rq30474 \mathchardef\greaterthan=\rq30476
+
+%% LaTeX line and arrowhead font
+%% the "hit return" comments show up if the font is missing.
+\ifx\tenln\undefined%%
+\font\tenln=line10\relax%% Hit return - who needs diagonals?
+\fi\ifx\tenlnw\undefined\ifx\tenln\nullfont\let\tenlnw\nullfont\else%%
+\font\tenlnw=linew10\relax%% Hit return - who needs diagonals?
+\fi\fi%%
+
+%% report line numbers in TeX3 only
+\ifx\inputlineno\undefined\csname newcount\endcsname\inputlineno\inputlineno
+\m@ne\message{***************************************************}\message{!
+Obsolete TeX (version 2). You should upgrade to *}\message{! version 3, which
+has been available since 1990. *}\message{***********************************%
+****************}\fi
+
+\def\cd@shouldnt#1{\CD@KB{* THIS (#1) SHOULD NEVER HAPPEN! *}}
+
+%% turn round- and square-bracketed arguments into curly-bracketed
+\def\get@round@pair#1(#2,#3){#1{#2}{#3}}%%ascii round brackets ()
+\def\get@square@arg#1[#2]{#1{#2}}%%ascii square brackets []
+\def\CD@AE#1{\CD@PK\let\CD@DH\CD@@E\CD@@E#1,],}%%ascii sq brackets
+\def\CD@m{[}\def\CD@RD{]}\def\commdiag#1{{\let\enddiagram\relax\diagram[]#1%
+\enddiagram}}
+
+%% ASCII open square bracket occurs on next line
+\def\CD@BF{{\ifx\CD@EH[\aftergroup\get@square@arg\aftergroup\CD@YH\else
+\aftergroup\CD@JH\fi}}%%
+\def\CD@CF#1#2{\def\CD@YH{#1}\def\CD@JH{#2}\futurelet\CD@EH\CD@BF}
+
+%% ASCII vertical bar (|) occurs on the next line
+\def\CD@KK{|}
+
+\def\CD@PB{%% arguments to maps inside diagrams
+\tokcase\CD@DD:\CD@y\break@args;\catcase\@super:\upper@label;\catcase\CD@lJ:%
+\lower@label;\tokcase{~}:\middle@label;%%ascii tilde
+\tokcase<:\CD@iF;%%ascii less-than
+\tokcase>:\CD@iI;%%ascii greater-than
+\tokcase(:\CD@BC;%%)%ascii open round bracket
+\tokcase[:\optional@;%%]%ascii open square bracket
+\tokcase.:\CD@JJ;%%ascii dot 12.7.94
+\catcase\space:\eat@space;\catcase\bgroup:\positional@;\default:\CD@@A
+\break@args;\endswitch}
+
+\def\switch@arg{%% arguments to horizontal maps outside diagrams
+\catcase\@super:\upper@label;\catcase\CD@lJ:\lower@label;\tokcase[:\optional@
+;%%]%ascii open square bracket
+\tokcase.:\CD@JJ;%%ascii dot 12.7.94 % ; was : before 15.6.97
+\catcase\space:\eat@space;\catcase\bgroup:\positional@;\tokcase{~}:%
+\middle@label;%%ascii tilde (questionable!)
+\default:\CD@y\break@args;\endswitch}
+
+%% That's as much as you get to read "in clear" - the rest is private!
+
+\let\CD@tJ\relax\ifx\protect\undefined\let\protect\relax\fi\ifx\AtEndDocument
+\undefined\def\CD@PG{\CD@gB}\def\CD@GF#1#2{}\else\def\CD@PG#1{\edef\CD@CH{#1}%
+\expandafter\CD@oC\CD@CH\CD@OD}\def\CD@oC#1\CD@OD{\AtEndDocument{\typeout{%
+\CD@tA: #1}}}\def\CD@GF#1#2{\gdef#1{#2}\AtEndDocument{#1}}\fi\def\CD@ZA#1#2{%
+\def#1{\CD@PG{#2\CD@mD\CD@W}\CD@DE#1\relax}}\def\CD@uF#1\repeat{\def\CD@p{#1}%
+\CD@OF}\def\CD@OF{\CD@p\relax\expandafter\CD@OF\fi}\def\CD@sF#1\repeat{\def
+\CD@q{#1}\CD@PF}\def\CD@PF{\CD@q\relax\expandafter\CD@PF\fi}\def\CD@tF#1%
+\repeat{\def\CD@r{#1}\CD@QF}\def\CD@QF{\CD@r\relax\expandafter\CD@QF\fi}\def
+\CD@tG#1#2#3{\def#2{\let#1\iftrue}\def#3{\let#1\iffalse}#3}\if y%
+\diagram@help@messages\def\CD@rG#1#2{\csname newtoks\endcsname#1#1=%
+\expandafter{\csname#2\endcsname}}\else\csname newtoks\endcsname\no@cd@help
+\no@cd@help{See the manual}\def\CD@rG#1#2{\let#1\no@cd@help}\fi\chardef\CD@lF
+=1 \chardef\CD@lI=2 \chardef\CD@MH=5 \chardef\CD@tH=6 \chardef\CD@sH=7
+\chardef\CD@PC=9 \dimendef\CD@hI=2 \dimendef\CD@hF=3 \dimendef\CD@mF=4
+\dimendef\CD@mI=5 \dimendef\CD@wJ=6 \dimendef\CD@tI=8 \dimendef\CD@sI=9
+\skipdef\CD@uB=1 \skipdef\CD@NF=2 \skipdef\CD@tB=3 \skipdef\CD@ZE=4 \skipdef
+\CD@JK=5 \skipdef\CD@kI=6 \skipdef\CD@kF=7 \skipdef\CD@qI=8 \skipdef\CD@pI=9
+\countdef\CD@JC=9 \countdef\CD@gD=8 \countdef\CD@A=7 \def\sdef#1#2{\def#1{#2}%
+}\def\CD@L#1{\expandafter\aftergroup\csname#1\endcsname}\def\CD@RC#1{%
+\expandafter\def\csname#1\endcsname}\def\CD@sD#1{\expandafter\gdef\csname#1%
+\endcsname}\def\CD@vC#1{\expandafter\edef\csname#1\endcsname}\def\CD@nF#1#2{%
+\expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname}\def\CD@EE
+#1#2{\expandafter\CD@DE\csname#1\expandafter\endcsname\csname#2\endcsname}%
+\def\CD@AK#1{\csname#1\endcsname}\def\CD@XJ#1{\expandafter\show\csname#1%
+\endcsname}\def\CD@ZJ#1{\expandafter\showthe\csname#1\endcsname}\def\CD@WJ#1{%
+\expandafter\showbox\csname#1\endcsname}\def\CD@tA{Commutative Diagram}\edef
+\CD@kH{\string\par}\edef\CD@dC{\string\diagram}\edef\CD@HD{\string\enddiagram
+}\edef\CD@EC{\string\\}\def\CD@eF{LaTeX}\ifx\@ignoretrue\undefined
+\expandafter\CD@tG\csname if@ignore\endcsname\ignore@true\ignore@false\def
+\@ignoretrue{\global\ignore@true}\def\@ignorefalse{\global\ignore@false}\fi
+
+\def\CD@g{{\ifnum0=\lq}\fi}\def\CD@wC{\ifnum0=\lq{\fi}}\def\catcase#1:{\ifcat
+\noexpand\CD@EH#1\CD@tJ\expandafter\CD@kC\else\expandafter\CD@dJ\fi}\def
+\tokcase#1:{\ifx\CD@EH#1\CD@tJ\expandafter\CD@kC\else\expandafter\CD@dJ\fi}%
+\def\CD@kC#1;#2\endswitch{#1}\def\CD@dJ#1;{}\let\endswitch\relax\def\default:%
+#1;#2\endswitch{#1}\ifx\at@\undefined\def\at@{@}\fi\edef\CD@P{\CD@o pt\CD@yC}%
+\CD@RC{\CD@P>}#1>#2>{\CD@z\rTo\sp{#1}\sb{#2}\CD@z}\CD@RC{\CD@P<}#1<#2<{\CD@z
+\lTo\sp{#1}\sb{#2}\CD@z}\CD@RC{\CD@P)}#1)#2){\CD@z\rTo\sp{#1}\sb{#2}\CD@z}%
+%%ascii round
+\CD@RC{\CD@P(}#1(#2({\CD@z\lTo\sp{#1}\sb{#2}\CD@z}%%ascii brack
+\def\CD@O{\def\endCD{\enddiagram}\CD@RC{\CD@P A}##1A##2A{\uTo<{##1}>{##2}%
+\CD@z\CD@z}\CD@RC{\CD@P V}##1V##2V{\dTo<{##1}>{##2}\CD@z\CD@z}\CD@RC{\CD@P=}{%
+\CD@z\hEq\CD@z}\CD@RC{\CD@P\CD@KK}{\vEq\CD@z\CD@z}\CD@RC{\CD@P\string\vert}{%
+\vEq\CD@z\CD@z}\CD@RC{\CD@P.}{\CD@z\CD@z}\let\CD@z\CD@Q}\def\CD@IE{\let\tmp
+\CD@JE\ifcat A\noexpand\CD@CH\else\ifcat=\noexpand\CD@CH\else\ifcat\relax
+\noexpand\CD@CH\else\let\tmp\at@\fi\fi\fi\tmp}\def\CD@JE#1{\CD@nF{tmp}{\CD@P
+\string#1}\ifx\tmp\relax\def\tmp{\at@#1}\fi\tmp}\def\CD@z{}\begingroup
+\aftergroup\def\aftergroup\CD@T\aftergroup{\aftergroup\def\catcode\lq\@%
+\active\aftergroup @\endgroup{\futurelet\CD@CH\CD@IE}}\newcount\CD@uA
+\newcount\CD@vA\newcount\CD@wA\newcount\CD@xA\newdimen\CD@OA\newdimen\CD@PA
+\CD@tG\CD@gE\CD@@A\CD@y\CD@tG\CD@hE\CD@EA\CD@BA\newdimen\CD@RA\newdimen\CD@SA
+\newcount\CD@yA\newcount\CD@zA\newdimen\CD@QA\newbox\CD@DA\CD@tG\CD@lE\CD@dA
+\CD@bA\newcount\CD@LH\newcount\CD@TC\def\CD@V#1#2{\ifdim#1<#2\relax#1=#2%
+\relax\fi}\def\CD@X#1#2{\ifdim#1>#2\relax#1=#2\relax\fi}\newdimen\CD@XH\CD@XH
+=1sp \newdimen\CD@zC\CD@zC\z@\def\CD@cJ{\ifdim\CD@zC=1em\else\CD@nJ\fi}\def
+\CD@nJ{\CD@zC1em\def\CD@NC{\fontdimen8\textfont3 }\CD@@J\CD@NJ\setbox0=\vbox{%
+\CD@t\noindent\CD@k\null\penalty-9993\null\CD@ND\null\endgraf\setbox0=%
+\lastbox\unskip\unpenalty\setbox1=\lastbox\global\setbox\CD@IG=\hbox{\unhbox0%
+\unskip\unskip\unpenalty\setbox0=\lastbox}\global\setbox\CD@KG=\hbox{\unhbox1%
+\unskip\unpenalty\setbox1=\lastbox}}}\newdimen\CD@@I\CD@@I=1true in \divide
+\CD@@I300 \def\CD@zH#1{\multiply#1\tw@\advance#1\ifnum#1<\z@-\else+\fi\CD@@I
+\divide#1\tw@\divide#1\CD@@I\multiply#1\CD@@I}\def\MapBreadth{%
+\afterassignment\CD@gI\CD@LF}\newdimen\CD@LF\newdimen\CD@oI\def\CD@gI{\CD@oI
+\CD@LF\CD@V\CD@@I{4\CD@XH}\CD@X\CD@@I\p@\CD@zH\CD@oI\ifdim\CD@LF>\z@\CD@V
+\CD@oI\CD@@I\fi\CD@cJ}\def\CD@RJ#1{\CD@zD\count@\CD@@I#1\ifnum\count@>\z@
+\divide\CD@@I\count@\fi\CD@gI\CD@NJ}\def\CD@NJ{\dimen@\CD@QC\count@\dimen@
+\divide\count@5\divide\count@\CD@@I\edef\CD@OC{\the\count@}}\def\CD@AJ{\CD@QJ
+\z@}\def\CD@QJ#1{\CD@tI\axisheight\advance\CD@tI#1\relax\advance\CD@tI-.5%
+\CD@oI\CD@zH\CD@tI\CD@sI-\CD@tI\advance\CD@tI\CD@LF}\newdimen\CD@DC\CD@DC\z@
+\newdimen\CD@eJ\CD@eJ\z@\def\CD@CJ#1{\CD@sI#1\relax\CD@tI\CD@sI\advance\CD@tI
+\CD@LF\relax}\def\horizhtdp{height\CD@tI depth\CD@sI}\def\axisheight{%
+\fontdimen22\the\textfont\tw@}\def\script@axisheight{\fontdimen22\the
+\scriptfont\tw@}\def\ss@axisheight{\fontdimen22\the\scriptscriptfont\tw@}\def
+\CD@NC{0.4pt}\def\CD@VK{\fontdimen3\textfont\z@}\def\CD@UK{\fontdimen3%
+\textfont\z@}\newdimen\PileSpacing\newdimen\CD@nA\CD@nA\z@\def\CD@RG{%
+\ifincommdiag1.3em\else2em\fi}\newdimen\CD@YB\def\CellSize{\afterassignment
+\CD@kB\DiagramCellHeight}\newdimen\DiagramCellHeight\DiagramCellHeight-%
+\maxdimen\newdimen\DiagramCellWidth\DiagramCellWidth-\maxdimen\def\CD@kB{%
+\DiagramCellWidth\DiagramCellHeight}\def\CD@QC{3em}\newdimen\MapShortFall\def
+\MapsAbut{\MapShortFall\z@\objectheight\z@\objectwidth\z@}\newdimen\CD@iA
+\CD@iA\z@\def\newarrowhead{\CD@mG h\CD@BG\CD@GG>}\def\newarrowtail{\CD@mG t%
+\CD@BG\CD@GG>}\def\newarrowmiddle{\CD@mG m\CD@BG\hbox@maths\empty}\def
+\newarrowfiller{\CD@mG f\CD@bE\CD@MK-}\def\CD@mG#1#2#3#4#5#6#7#8#9{\CD@RC{r#1%
+:#5}{#2{#6}}\CD@RC{l#1:#5}{#2{#7}}\CD@RC{d#1:#5}{#3{#8}}\CD@RC{u#1:#5}{#3{#9}%
+}\CD@vC{-#1:#5}{\expandafter\noexpand\csname-#1:#4\endcsname\noexpand\CD@MC}%
+\CD@vC{+#1:#5}{\expandafter\noexpand\csname+#1:#4\endcsname\noexpand\CD@MC}}%
+\CD@ZA\CD@MC{\CD@eF\space diagonals are used unless PostScript is set}\def
+\defaultarrowhead#1{\edef\CD@sJ{#1}\CD@@J}\def\CD@@J{\CD@IJ\CD@sJ<>ht\CD@IJ
+\CD@sJ<>th}\def\CD@IJ#1#2#3#4#5{\CD@HJ{r#4}{#3}{l#5}{#2}{r#4:#1}\CD@HJ{r#5}{#%
+2}{l#4}{#3}{l#4:#1}\CD@HJ{d#4}{#3}{u#5}{#2}{d#4:#1}\CD@HJ{d#5}{#2}{u#4}{#3}{u%
+#4:#1}}\def\CD@HJ#1#2#3#4#5{\begingroup\aftergroup\CD@GJ\CD@L{#1+:#2}\CD@L{#1%
+:#2}\CD@L{#3:#4}\CD@L{#5}\endgroup}\def\CD@GJ#1#2#3#4{\csname newbox%
+\endcsname#1\def#2{\copy#1}\def#3{\copy#1}\setbox#1=\box\voidb@x}\def\CD@sJ{}%
+\CD@@J\def\CD@GJ#1#2#3#4{\setbox#1=#4}\ifx\tenln\nullfont\def\CD@sJ{vee}\else
+\let\CD@sJ\CD@eF\fi\def\CD@xF#1#2#3{\begingroup\aftergroup\CD@wF\CD@L{#1#2:#3%
+#3}\CD@L{#1#2:#3}\aftergroup\CD@yF\CD@L{#1#2:#3-#3}\CD@L{#1#2:#3}\endgroup}%
+\def\CD@wF#1#2{\def#1{\hbox{\rlap{#2}\kern.4\CD@zC#2}}}\def\CD@yF#1#2{\def#1{%
+\hbox{\rlap{#2}\kern.4\CD@zC#2\kern-.4\CD@zC}}}\CD@xF lh>\CD@xF rt>\CD@xF rh<%
+\CD@xF rt<\def\CD@yF#1#2{\def#1{\hbox{\kern-.4\CD@zC\rlap{#2}\kern.4\CD@zC#2}%
+}}\CD@xF rh>\CD@xF lh<\CD@xF lt>\CD@xF lt<\def\CD@wF#1#2{\def#1{\vbox{\vbox to%
+\z@{#2\vss}\nointerlineskip\kern.4\CD@zC#2}}}\def\CD@yF#1#2{\def#1{\vbox{%
+\vbox to\z@{#2\vss}\nointerlineskip\kern.4\CD@zC#2\kern-.4\CD@zC}}}\CD@xF uh>%
+\CD@xF dt>\CD@xF dh<\CD@xF dt<\def\CD@yF#1#2{\def#1{\vbox{\kern-.4\CD@zC\vbox
+to\z@{#2\vss}\nointerlineskip\kern.4\CD@zC#2}}}\CD@xF dh>\CD@xF ut>\CD@xF uh<%
+\CD@xF ut<\def\CD@BG#1{\hbox{\mathsurround\z@\offinterlineskip\CD@k\mkern-1.5%
+mu{#1}\mkern-1.5mu\CD@ND}}\def\hbox@maths#1{\hbox{\CD@k#1\CD@ND}}\def\CD@GG#1%
+{\hbox to\CD@LF{\setbox0=\hbox{\offinterlineskip\mathsurround\z@\CD@k{#1}%
+\CD@ND}\dimen0.5\wd0\advance\dimen0-.5\CD@oI\CD@zH{\dimen0}\kern-\dimen0%
+\unhbox0\hss}}\def\CD@sB#1{\hbox to2\CD@LF{\hss\offinterlineskip\mathsurround
+\z@\CD@k{#1}\CD@ND\hss}}\def\CD@vF#1{\hbox{\mathsurround\z@\CD@k{#1}\CD@ND}}%
+\def\CD@bE#1{\hbox{\kern-.15\CD@zC\CD@k{#1}\CD@ND\kern-.15\CD@zC}}\def\CD@MK#%
+1{\vbox{\offinterlineskip\kern-.2ex\CD@GG{#1}\kern-.2ex}}\def\@fillh{%
+\xleaders\vrule\horizhtdp}\def\@fillv{\xleaders\hrule width\CD@LF}\CD@nF{rf:-%
+}{@fillh}\CD@nF{lf:-}{@fillh}\CD@nF{df:-}{@fillv}\CD@nF{uf:-}{@fillv}\CD@nF{%
+rh:}{null}\CD@nF{rm:}{null}\CD@nF{rt:}{null}\CD@nF{lh:}{null}\CD@nF{lm:}{null%
+}\CD@nF{lt:}{null}\CD@nF{dh:}{null}\CD@nF{dm:}{null}\CD@nF{dt:}{null}\CD@nF{%
+uh:}{null}\CD@nF{um:}{null}\CD@nF{ut:}{null}\CD@nF{+h:}{null}\CD@nF{+m:}{null%
+}\CD@nF{+t:}{null}\CD@nF{-h:}{null}\CD@nF{-m:}{null}\CD@nF{-t:}{null}\def
+\CD@@D{\hbox{\vrule height 1pt depth-1pt width 1pt}}\CD@RC{rf:}{\CD@@D}\CD@nF
+{lf:}{rf:}\CD@nF{+f:}{rf:}\CD@RC{df:}{\CD@@D}\CD@nF{uf:}{df:}\CD@nF{-f:}{df:}%
+\def\CD@BD{\CD@U\null\CD@@D\null\CD@@D\null}\edef\CD@lG{\string\newarrow}\def
+\newarrow#1#2#3#4#5#6{\begingroup\edef\@name{#1}\edef\CD@oJ{#2}\edef\CD@iD{#3%
+}\edef\CD@QG{#4}\edef\CD@jD{#5}\edef\CD@LE{#6}\let\CD@HE\CD@sG\let\CD@FK
+\CD@BH\let\@x\CD@AH\ifx\CD@oJ\CD@iD\let\CD@oJ\empty\fi\ifx\CD@LE\CD@jD\let
+\CD@LE\empty\fi\def\CD@LI{r}\def\CD@SF{l}\def\CD@IC{d}\def\CD@yJ{u}\def\CD@gH
+{+}\def\@m{-}\ifx\CD@iD\CD@jD\ifx\CD@QG\CD@iD\let\CD@QG\empty\fi\ifx\CD@LE
+\empty\ifx\CD@iD\CD@aE\let\@x\CD@yG\else\let\@x\CD@zG\fi\fi\else\edef\CD@a{%
+\CD@iD\CD@oJ}\ifx\CD@a\empty\ifx\CD@QG\CD@jD\let\CD@QG\empty\fi\fi\fi\ifmmode
+\aftergroup\CD@kG\else\CD@@A\CD@oB rh{head\space\space}\CD@LE\CD@oB rf{filler%
+}\CD@iD\CD@oB rm{middle}\CD@QG\ifx\CD@jD\CD@iD\else\CD@oB rf{filler}\CD@jD\fi
+\CD@oB rt{tail\space\space}\CD@oJ\CD@gE\CD@HE\CD@FK\@x\CD@nG l-2+2{lu}{nw}%
+\NorthWest\CD@nG r+2+2{ru}{ne}\NorthEast\CD@nG l-2-2{ld}{sw}\SouthWest\CD@nG r%
++2-2{rd}{se}\SouthEast\else\aftergroup\CD@b\CD@L{r\@name}\fi\fi\endgroup}\def
+\CD@sG{\CD@vG\CD@LI\CD@SF rl\Horizontal@Map}\def\CD@BH{\CD@vG\CD@IC\CD@yJ du%
+\Vertical@Map}\def\CD@AH{\CD@vG\CD@gH\@m+-\Vector@Map}\def\CD@yG{\CD@vG\CD@gH
+\@m+-\Slant@Map}\def\CD@zG{\CD@vG\CD@gH\@m+-\Slope@Map}\catcode\lq\/=\active
+\def\CD@vG#1#2#3#4#5{\CD@jG#1#3#5t:\CD@oJ/f:\CD@iD/m:\CD@QG/f:\CD@jD/h:\CD@LE
+//\CD@jG#2#4#5h:\CD@LE/f:\CD@jD/m:\CD@QG/f:\CD@iD/t:\CD@oJ//}\def\CD@jG#1#2#3%
+#4//{\edef\CD@fG{#2}\aftergroup\sdef\CD@L{#1\@name}\aftergroup{\aftergroup#3%
+\CD@M#4//\aftergroup}}\def\CD@M#1/{\edef\CD@EH{#1}\ifx\CD@EH\empty\else\CD@L{%
+\CD@fG#1}\expandafter\CD@M\fi}\catcode\lq\/=12 \def\CD@nG#1#2#3#4#5#6#7#8{%
+\aftergroup\sdef\CD@L{#6\@name}\aftergroup{\CD@L{#2\@name}\if#2#4\aftergroup
+\CD@CI\else\aftergroup\CD@BI\fi\CD@L{#1\@name}%
+%% ASCII round brackets and comma (,) appear on the next line
+\aftergroup(\aftergroup#3\aftergroup,\aftergroup#5\aftergroup)\aftergroup}}%
+\def\CD@oB#1#2#3#4{\expandafter\ifx\csname#1#2:#4\endcsname\relax\CD@y\CD@gB{%
+arrow#3 "#4" undefined}\fi}\CD@rG\CD@VE{All five components must be defined
+before an arrow.}\CD@rG\CD@SE{\CD@lG, unlike \string\HorizontalMap, is a
+declaration.}\def\CD@b#1{\CD@YA{Arrows \string#1 etc could not be defined}%
+\CD@VE}\def\CD@kG{\CD@YA{misplaced \CD@lG}\CD@SE}\def\newdiagramgrid#1#2#3{%
+\CD@RC{cdgh@#1}{#2,],}%% ASCII close square bracket
+\CD@RC{cdgv@#1}{#3,],}}%% ASCII close square bracket
+\CD@tG\ifincommdiag\incommdiagtrue\incommdiagfalse\CD@tG\CD@@F\CD@IF\CD@HF
+\newcount\CD@VA\CD@VA=0 \def\CD@yH{\CD@VA6 }\def\CD@OB{\CD@VA1 \global\CD@yA1
+\CD@DE\CD@YF\empty}\def\CD@YF{}\def\CD@nB#1{\relax\CD@MD\edef\CD@vJ{#1}%
+\begingroup\CD@rE\else\ifcase\CD@VA\ifmmode\else\CD@YG\CD@E0\fi\or\CD@cE5\or
+\CD@YG\CD@F5\or\CD@YG\CD@B5\or\CD@YG\CD@B5\or\CD@YG\CD@C5\or\CD@cE7\or\CD@YG
+\CD@D7\fi\fi\endgroup\xdef\CD@YF{#1}}\def\CD@pB#1#2#3#4#5{\relax\CD@MD\xdef
+\CD@vJ{#4}\begingroup\ifnum\CD@VA<#1 \expandafter\CD@cE\ifcase\CD@VA0\or#2\or
+#3\else#2\fi\else\ifnum\CD@VA<6 \CD@tJ\CD@YG\CD@B#2\else\CD@YG\CD@G#2\fi\fi
+\endgroup\CD@DE\CD@YF\CD@vJ\ifincommdiag\let\CD@ZD#5\else\let\CD@ZD\CD@LK\fi}%
+\def\CD@yI{\global\CD@yA=\ifnum\CD@VA<5 1\else2\fi\relax}\def\CD@OI{\CD@VA
+\CD@yA}\def\CD@cE#1{\aftergroup\CD@VA\aftergroup#1\aftergroup\relax}\def
+\CD@HH{\def\CD@nB##1{\relax}\let\CD@pB\CD@FH\let\CD@yH\relax\let\CD@OB\relax
+\let\CD@yI\relax\let\CD@OI\relax}\def\CD@FH#1#2#3#4#5{\ifincommdiag\let\CD@ZD
+#5\else\xdef\CD@vJ{#4}\let\CD@ZD\CD@LK\fi}\def\CD@YG#1{\aftergroup#1%
+\aftergroup\relax\CD@cE}\def\CD@B{\CD@YE\CD@S\CD@ME\CD@Q}\def\CD@G{\CD@YE{%
+\CD@yC\CD@S}\CD@XE\CD@QD\CD@Q}\def\CD@F{\CD@YE{*\CD@S}\CD@RE\clubsuit\CD@Q}%
+\def\CD@C{\CD@YE{\CD@S*\CD@S}\CD@RE\CD@Q\clubsuit\CD@Q}\def\CD@D{\CD@YE\CD@EC
+\CD@TE\\}\def\CD@E{\CD@YE\CD@nC\CD@QE\CD@k}\def\CD@LK{\CD@YA{\CD@vJ\space
+ignored \CD@dH}\CD@WE}\def\CD@FE{}\def\CD@d{\CD@YA{maps must never be enclosed
+in braces}\CD@OE}\def\CD@dH{outside diagram}\def\CD@FC{\string\HonV, \string
+\VonH\space and \string\HmeetV}\CD@rG\CD@ME{The way that horizontal and
+vertical arrows are terminated implicitly means\CD@uG that they cannot be
+mixed with each other or with \CD@FC.}\CD@rG\CD@XE{\string\pile\space is for
+parallel horizontal arrows; verticals can just be put together in\CD@uG a cell%
+. \CD@FC\space are not meaningful in a \string\pile.}\CD@rG\CD@RE{The
+horizontal maps must point to an object, not each other (I've put in\CD@uG one
+which you're unlikely to want). Use \string\pile\space if you want them
+parallel.}\CD@rG\CD@TE{Parallel horizontal arrows must be in separate layers
+of a \string\pile.}\CD@rG\CD@QE{Horizontal arrows may be used \CD@dH s, but
+must still be in maths.}\CD@rG\CD@WE{Vertical arrows, \CD@FC\space\CD@dH s don%
+'t know where\CD@uG where to terminate.}\CD@rG\CD@OE{This prevents them from
+stretching correctly.}\def\CD@YE#1{\CD@YA{"#1" inserted \ifx\CD@YF\empty
+before \CD@vJ\else between \CD@YF\ifx\CD@YF\CD@vJ s\else\space and \CD@vJ\fi
+\fi}}\count@=\year\multiply\count@12 \advance\count@\month\ifnum\count@>24087
+\message{because this one expired in December 2006!}\expandafter\endinput\fi
+\def\Horizontal@Map{\CD@nB{horizontal map}\CD@LC\CD@TJ\CD@qD}\def\CD@TJ{%
+\CD@GB-9999 \let\CD@ZD\CD@XD\ifincommdiag\else\CD@cJ\ifinpile\else\skip2\z@
+plus 1.5\CD@VK minus .5\CD@UK\skip4\skip2 \fi\fi\let\CD@kD\@fillh\CD@nF{%
+fill@dot}{rf:.}}\def\Vector@Map{\CD@HK4}\def\Slant@Map{\CD@HK{\CD@EF255\else6%
+\fi}}\def\Slope@Map{\CD@HK\CD@OC}\def\CD@HK#1#2#3#4#5#6{\CD@LC\def\CD@WK{2}%
+\def\CD@aK{2}\def\CD@ZK{1}\def\CD@bK{1}\let\Horizontal@Map\CD@nI\def\CD@OG{#1%
+}\def\CD@NI{\CD@U#2#3#4#5#6}}\def\CD@nI{\CD@TJ\CD@JB\let\CD@ZD\CD@TD\CD@qD}%
+\CD@tG\CD@pE\CD@rA\CD@qA\CD@rA\def\cds@missives{\CD@rA}\def\CD@TD{\CD@vE\let
+\CD@OG\CD@OC\CD@x\CD@zE\CD@WF\fi\setbox0\hbox{\incommdiagfalse\CD@HI}\CD@pE
+\CD@aD\else\global\CD@YC\CD@bD\fi\ifvoid6 \ifvoid7 \CD@eE\fi\fi\CD@zE\else
+\CD@BD\global\CD@YC\let\CD@CG\CD@IH\CD@YD\fi\else\CD@NI\CD@MI\global\CD@YC
+\CD@YD\fi}\def\CD@LC{\begingroup\dimen1=\MapShortFall\dimen2=\CD@RG\dimen5=%
+\MapShortFall\setbox3=\box\voidb@x\setbox6=\box\voidb@x\setbox7=\box\voidb@x
+\CD@pD\mathsurround\z@\skip2\z@ plus1fill minus 1000pt\skip4\skip2 \CD@TB}%
+\CD@tG\CD@tE\CD@UB\CD@TB\def\CD@U#1#2#3#4#5{\let\CD@oJ#1\let\CD@iD#2\let
+\CD@QG#3\let\CD@jD#4\let\CD@LE#5\CD@TB\ifx\CD@iD\CD@jD\CD@UB\fi}\def\CD@qD#1#%
+2#3#4#5{\CD@U#1#2#3#4#5\CD@tD}\def\Vertical@Map{\CD@pB433{vertical map}\CD@cD
+\CD@LC\CD@GB-9995 \let\CD@kD\@fillv\CD@nF{fill@dot}{df:.}\CD@qD}\def
+\break@args{\def\CD@tD{\CD@ZD}\CD@ZD\endgroup\aftergroup\CD@FE}\def\CD@MJ{%
+\setbox1=\CD@oJ\setbox5=\CD@LE\ifvoid3 \ifx\CD@QG\null\else\setbox3=\CD@QG\fi
+\fi\CD@@G2\CD@iD\CD@@G4\CD@jD}\def\CD@pF#1{\ifvoid1\else\CD@oF1#1\fi\ifvoid2%
+\else\CD@oF2#1\fi\ifvoid3\else\CD@oF3#1\fi\ifvoid4\else\CD@oF4#1\fi\ifvoid5%
+\else\CD@oF5#1\fi} \def\CD@oF#1#2{\setbox#1\vbox{\offinterlineskip\box#1%
+\dimen@\prevdepth\advance\dimen@-#2\relax\setbox0\null\dp0\dimen@\ht0-\dimen@
+\box0}}\def\CD@@G#1#2{\ifx#2\CD@kD\setbox#1=\box\voidb@x\else\setbox#1=#2\def
+#2{\xleaders\box#1}\fi}\CD@ZA\CD@BK{\string\HorizontalMap, \string
+\VerticalMap\space and \string\DiagonalMap\CD@uG are obsolete - use \CD@lG
+\space to pre-define maps}\def\HorizontalMap#1#2#3#4#5{\CD@BK\CD@nB{old
+horizontal map}\CD@LC\CD@TJ\def\CD@oJ{\CD@UH{#1}}\CD@SH\CD@iD{#2}\def\CD@QG{%
+\CD@UH{#3}}\CD@SH\CD@jD{#4}\def\CD@LE{\CD@UH{#5}}\CD@tD}\def\VerticalMap#1#2#%
+3#4#5{\CD@BK\CD@pB433{vertical map}\CD@cD\CD@LC\CD@GB-9995 \let\CD@kD\@fillv
+\def\CD@oJ{\CD@GG{#1}}\CD@VH\CD@iD{#2}\def\CD@QG{\CD@GG{#3}}\CD@VH\CD@jD{#4}%
+\def\CD@LE{\CD@GG{#5}}\CD@tD}\def\DiagonalMap#1#2#3#4#5{\CD@BK\CD@LC\def
+\CD@OG{4}\let\CD@kD\undefined\let\CD@ZD\CD@YD\def\CD@WK{2}\def\CD@aK{2}\def
+\CD@ZK{1}\def\CD@bK{1}\def\CD@QG{\CD@vF{#3}}\ifPositiveGradient\let\mv\raise
+\def\CD@oJ{\CD@vF{#5}}\def\CD@iD{\CD@vF{#4}}\def\CD@jD{\CD@vF{#2}}\def\CD@LE{%
+\CD@vF{#1}}\else\let\mv\lower\def\CD@oJ{\CD@vF{#1}}\def\CD@iD{\CD@vF{#2}}\def
+\CD@jD{\CD@vF{#4}}\def\CD@LE{\CD@vF{#5}}\fi\CD@tD}\def\CD@aE{-}\def\CD@AD{%
+\empty}\def\CD@SH{\CD@EG\CD@bE\CD@aE\@fillh}\def\CD@VH{\CD@EG\CD@MK\CD@KK
+\@fillv}\def\CD@EG#1#2#3#4#5{\def\CD@CH{#5}\ifx\CD@CH#2\let#4#3\else\let#4%
+\null\ifx\CD@CH\empty\else\ifx\CD@CH\CD@AD\else\let#4\CD@CH\fi\fi\fi}\def
+\CD@UH#1{\hbox{\mathsurround\z@\offinterlineskip\def\CD@CH{#1}\ifx\CD@CH
+\empty\else\ifx\CD@CH\CD@AD\else\CD@k\mkern-1.5mu{\CD@CH}\mkern-1.5mu\CD@ND
+\fi\fi}}\def\CD@yD#1#2{\setbox#1=\hbox\bgroup\setbox0=\hbox{\CD@k\labelstyle(%
+)\CD@ND}%% ASCII round brackets
+\setbox1=\null\ht1\ht0\dp1\dp0\box1 \kern.1\CD@zC\CD@k\bgroup\labelstyle
+\aftergroup\CD@LD\CD@xD}\def\CD@LD{\CD@ND\kern.1\CD@zC\egroup\CD@tD}\def
+\CD@xD{\futurelet\CD@EH\CD@mJ}\def\CD@mJ{%% qualifiers on label arguments
+\catcase\bgroup:\CD@v;\catcase\egroup:\missing@label;\catcase\space:\CD@TF;%
+\tokcase[:\CD@XF;%%]%ascii close square bracket
+\default:\CD@zJ;\endswitch}\def\CD@v{\let\CD@MD\CD@c\let\CD@CH}\def\CD@zJ#1{%
+\let\CD@UF\egroup{\let\actually@braces@missing@around@macro@in@label\CD@ZH
+\let\CD@MD\CD@xC\let\CD@UF\CD@VF#1%
+\actually@braces@missing@around@macro@in@label}\CD@UF}\def
+\actually@braces@missing@around@macro@in@label{\let\CD@CH=}\def\missing@label
+{\egroup\CD@YA{missing label}\CD@PE}\def\CD@xC{\egroup\missing@label}\outer
+\def\CD@ZH{}\def\CD@UF{}\def\CD@VF{\CD@wC\CD@UF}\def\CD@MD{}\def\CD@XF{\let
+\CD@N\CD@xD\get@square@arg\CD@AE}\CD@rG\CD@PE{The text which has just been
+read is not allowed within map labels.}\def\CD@c{\egroup\CD@YA{missing \CD@yC
+\space inserted after label}\CD@PE}\def\upper@label{\CD@oD\CD@yD6}\def
+\lower@label{\def\positional@{\CD@@A\break@args}\CD@yD7}\def\middle@label{%
+\CD@yD3}\CD@tG\CD@yE\CD@pD\CD@oD\def\CD@iF{\ifPositiveGradient\CD@tJ
+\expandafter\upper@label\else\expandafter\lower@label\fi}\def\CD@iI{%
+\ifPositiveGradient\CD@tJ\expandafter\lower@label\else\expandafter
+\upper@label\fi}\def\positional@{\CD@gB{labels as positional arguments are
+obsolete}\CD@yE\CD@tJ\expandafter\upper@label\else\expandafter\lower@label\fi
+-}\def\CD@tD{\futurelet\CD@EH\switch@arg}\def\eat@space{\afterassignment
+\CD@tD\let\CD@EH= }\def\CD@TF{\afterassignment\CD@xD\let\CD@EH= }\def\CD@BC{%
+\get@round@pair\CD@uD}\def\CD@uD#1#2{\def\CD@WK{#1}\def\CD@aK{#2}\CD@tD}\def
+\optional@{\let\CD@N\CD@tD\get@square@arg\CD@AE}\def\CD@JJ.{\CD@sC\CD@tD}\def
+\CD@sC{\let\CD@iD\fill@dot\let\CD@jD\fill@dot\def\CD@MI{\let\CD@iD\dfdot\let
+\CD@jD\dfdot}}\def\CD@MI{}\def\CD@@E#1,{\CD@nH#1,\begingroup\ifx\@name\CD@RD
+\CD@FF\aftergroup\CD@e\fi\aftergroup\CD@jC\else\expandafter\def\expandafter
+\CD@RF\expandafter{\csname\@name\endcsname}\expandafter\CD@vD\CD@RF\CD@KD\ifx
+\CD@RF\empty\aftergroup\CD@pC\expandafter\aftergroup\csname\CD@FB\@name
+\endcsname\expandafter\aftergroup\csname\CD@FB @\@name\endcsname\else\gdef
+\CD@GE{#1}\CD@gB{\string\relax\space inserted before `[\CD@GE'}\message{(I was
+trying to read this as a \CD@tA\ option.)}\aftergroup\CD@H\fi\fi\endgroup}%
+\def\CD@vD#1#2\CD@KD{\def\CD@RF{#2}}\def\CD@jC{\let\CD@CH\CD@N\let\CD@N\relax
+\CD@CH}\def\CD@H#1],{%% ASCII close square bracket
+\CD@jC\relax\def\CD@RF{#1}\ifx\CD@RF\empty\def\CD@RF{[\CD@GE]}%
+%% ASCII open and close square bracket
+\else\def\CD@RF{[\CD@GE,#1]}%% ASCII open and close square bracket
+\fi\CD@RF}\def\CD@pC#1#2{\ifx#2\undefined\ifx#1\undefined\CD@gB{option `%
+\@name' undefined}\else#1\fi\else\CD@FF\expandafter#2\CD@GK\CD@PK\else\CD@QK
+\fi\fi\CD@DH}\CD@tG\CD@FF\CD@QK\CD@PK\def\CD@nH#1,{\CD@FF\ifx\CD@GK\undefined
+\CD@e\else\expandafter\CD@oH\CD@GK,#1,(,),(,)[]%
+%%ASCII 5commas two pairs round, pair square
+\fi\fi\CD@FF\else\CD@mH#1==,\fi}\def\CD@e{\CD@gB{option `\@name' needs (x,y)
+value}\CD@PK\let\@name\empty}\def\CD@mH#1=#2=#3,{\def\@name{#1}\def\CD@GK{#2}%
+\def\CD@RF{#3}\ifx\CD@RF\empty\let\CD@GK\undefined\fi}%
+%% ASCII 2commas 2pair round, pair square on next line
+\def\CD@oH#1(#2,#3)#4,(#5,#6)#7[]{\def\CD@GK{{#2}{#3}}\def\CD@RF{#1#4#5#6}%
+\ifx\CD@RF\empty\def\CD@RF{#7}\ifx\CD@RF\empty\CD@e\fi\else\CD@e\fi}\def
+\CD@FB{cds@}\let\CD@N\relax\def\CD@zD#1{\ifx\CD@GK\undefined\CD@gB{option `%
+\@name' needs a value}\else#1\CD@GK\relax\fi}\def\CD@BE#1#2{\ifx\CD@GK
+\undefined#1#2\relax\else#1\CD@GK\relax\fi}\def\cds@@showpair#1#2{\message{x=%
+#1,y=#2}}\def\cds@@diagonalbase#1#2{\edef\CD@ZK{#1}\edef\CD@bK{#2}}\def\CD@DI
+#1{\CD@nF{@x}{cdps@#1}\ifx\@x\relax\CD@f{#1}{unknown}\else\ifx\@x\empty\CD@f{%
+#1}{cannot be used}\else\let\CD@IK\@x\fi\fi}\def\CD@f#1#2{\CD@gB{PostScript
+translator `#1' #2}\CD@ZB\let\cds@PS\empty\let\cds@noPS\empty}\def\CD@PH{}%
+\def\CD@PJ{\CD@fA\edef\CD@PH{\noexpand\CD@KB{\@name\space ignored within maths%
+}}}\def\diagramstyle{\CD@cJ\let\CD@N\relax\CD@CF\CD@AE\CD@AE}\let
+\diagramsstyle\diagramstyle\CD@tG\CD@sE\CD@SB\CD@RB\CD@tG\CD@qE\CD@EB\CD@DB
+\CD@tG\CD@oE\CD@pA\CD@oA\CD@tG\CD@iE\CD@HA\CD@GA\CD@HA\CD@tG\CD@jE\CD@JA
+\CD@IA\CD@tG\CD@kE\CD@LA\CD@KA\CD@tG\CD@vE\CD@aB\CD@ZB\CD@tG\CD@EF\CD@DK
+\CD@CK\CD@tG\CD@rE\CD@JB\CD@IB\CD@tG\CD@mE\CD@gA\CD@fA\CD@tG\CD@nE\CD@kA
+\CD@jA\CD@tG\CD@AF\CD@iG\CD@hG\CD@RC{cds@ }{}\CD@RC{cds@}{}\CD@RC{cds@1em}{%
+\CellSize1\CD@zC}\CD@RC{cds@1.5em}{\CellSize1.5\CD@zC}\CD@RC{cds@2em}{%
+\CellSize2\CD@zC}\CD@RC{cds@2.5em}{\CellSize2.5\CD@zC}\CD@RC{cds@3em}{%
+\CellSize3\CD@zC}\CD@RC{cds@3.5em}{\CellSize3.5\CD@zC}\CD@RC{cds@4em}{%
+\CellSize4\CD@zC}\CD@RC{cds@4.5em}{\CellSize4.5\CD@zC}\CD@RC{cds@5em}{%
+\CellSize5\CD@zC}\CD@RC{cds@6em}{\CellSize6\CD@zC}\CD@RC{cds@7em}{\CellSize7%
+\CD@zC}\CD@RC{cds@8em}{\CellSize8\CD@zC}\def\cds@abut{\MapsAbut\dimen1\z@
+\dimen5\z@}\def\cds@alignlabels{\CD@IA\CD@KA}\def\cds@amstex{\ifincommdiag
+\CD@O\else\def\CD{\diagram[amstex]}%%ascii square brackets []
+\fi\CD@T\catcode\lq\@\active}\def\cds@b{\let\CD@dB\CD@bB}\def\cds@balance{%
+\let\CD@hA\CD@AA}\let\cds@bottom\cds@b\def\cds@center{\cds@vcentre
+\cds@nobalance}\let\cds@centre\cds@center\def\cds@centerdisplay{\CD@HA\CD@PJ
+\cds@balance}\let\cds@centredisplay\cds@centerdisplay\def\cds@crab{\CD@BE
+\CD@DC{.5\PileSpacing}}\CD@RC{cds@crab-}{\CD@DC-.5\PileSpacing}\CD@RC{%
+cds@crab+}{\CD@DC.5\PileSpacing}\CD@RC{cds@crab++}{\CD@DC1.5\PileSpacing}%
+\CD@RC{cds@crab--}{\CD@DC-1.5\PileSpacing}\def\cds@defaultsize{\CD@BE{\let
+\CD@QC}{3em}\CD@NJ}\def\cds@displayoneliner{\CD@DB}\let\cds@dotted\CD@sC\def
+\cds@dpi{\CD@RJ{1truein}}\def\cds@dpm{\CD@RJ{100truecm}}\let\CD@XA\undefined
+\def\cds@eqno{\let\CD@XA\CD@GK\let\CD@EJ\empty}\def\cds@fixed{\CD@qA}\CD@tG
+\CD@fE\CD@J\CD@I\def\cds@flushleft{\CD@I\CD@GA\CD@PJ\cds@nobalance\CD@BE
+\CD@nA\CD@nA}\def\cds@gap{\CD@AJ\setbox3=\null\ht3=\CD@tI\dp3=\CD@sI\CD@BE{%
+\wd3=}\MapShortFall} \def\cds@grid{\ifx\CD@GK\undefined\let\h@grid\relax\let
+\v@grid\relax\else\CD@nF{h@grid}{cdgh@\CD@GK}\CD@nF{v@grid}{cdgv@\CD@GK}\ifx
+\h@grid\relax\CD@gB{unknown grid `\CD@GK'}\else\CD@WB\fi\fi}\let\h@grid\relax
+\let\v@grid\relax\def\cds@gridx{\ifx\CD@GK\undefined\else\cds@grid\fi\let
+\CD@CH\h@grid\let\h@grid\v@grid\let\v@grid\CD@CH}\def\cds@h{\CD@zD
+\DiagramCellHeight}\def\cds@hcenter{\let\CD@hA\CD@aA}\let\cds@hcentre
+\cds@hcenter\def\cds@heads{\CD@BE{\let\CD@sJ}\CD@sJ\CD@@J\CD@vE\else\ifx
+\CD@sJ\CD@eF\else\CD@MC\fi\fi}\let\cds@height\cds@h\let\cds@hmiddle
+\cds@balance\def\cds@htriangleheight{\CD@BE\DiagramCellHeight
+\DiagramCellHeight\DiagramCellWidth1.73205\DiagramCellHeight}\def
+\cds@htrianglewidth{\CD@BE\DiagramCellWidth\DiagramCellWidth
+\DiagramCellHeight.57735\DiagramCellWidth}\CD@tG\CD@zE\CD@eE\CD@dE\CD@eE\def
+\cds@hug{\CD@eE} \def\cds@inline{\CD@gA\let\CD@PH\empty}\def
+\cds@inlineoneliner{\CD@EB}\CD@RC{cds@l>}{\CD@zD{\let\CD@RG}\dimen2=\CD@RG}%
+\def\cds@labelstyle{\CD@zD{\let\labelstyle}}\def\cds@landscape{\CD@kA}\def
+\cds@large{\CellSize5\CD@zC}\let\CD@EJ\empty\def\CD@FJ{\refstepcounter{%
+equation}\def\CD@XA{\hbox{\@eqnnum}}}\def\cds@LaTeXeqno{\let\CD@EJ\CD@FJ}\def
+\cds@lefteqno{\CD@pA}\def\cds@leftflush{\cds@flushleft\CD@J}\def
+\cds@leftshortfall{\CD@zD{\dimen1 }}\def\cds@lowershortfall{%
+\ifPositiveGradient\cds@leftshortfall\else\cds@rightshortfall\fi}\def
+\cds@loose{\CD@VB}\def\cds@midhshaft{\CD@JA}\def\cds@midshaft{\CD@JA}\def
+\cds@midvshaft{\CD@LA}\def\cds@moreoptions{\CD@@A}\let\cds@nobalance
+\cds@hcenter\def\cds@nohcheck{\CD@HH}\def\cds@nohug{\CD@dE} \def
+\cds@nooptions{\def\CD@aC{\CD@WD}}\let\cds@noorigin\cds@nobalance\def
+\cds@nopixel{\CD@@I4\CD@XH\CD@cJ}\def\cds@noPostScript{\global\let\CD@n\empty
+\CD@BE\CD@DI\empty\CD@ZB\let\cds@PS\empty\let\cds@noPS\empty}\def\cds@noPS{%
+\CD@ZB\global\let\CD@n\empty}\def\cds@notextflow{\CD@RB}\def\cds@noTPIC{%
+\CD@CK}\def\cds@objectstyle{\CD@zD{\let\objectstyle}}\def\cds@origin{\let
+\CD@hA\CD@iB}\def\cds@p{\CD@zD\PileSpacing}\CD@tG\CD@hK\CD@dK\CD@cK\CD@cK\let
+\cds@pilespacing\cds@p\def\cds@pixelsize{\CD@zD\CD@@I\CD@gI}\def\cds@portrait
+{\CD@jA}\def\cds@PostScript{\CD@aB\global\let\CD@n\empty\let\cds@PS\CD@aB\let
+\cds@noPS\CD@ZB\CD@BE\CD@DI\empty}\def\cds@PS{\CD@aB\global\let\CD@n\empty}%
+\CD@GF\CD@n{\typeout{\CD@tA: try the PostScript option for better results}}%
+\def\cds@repositionpullbacks{\let\make@pbk\CD@fH\let\CD@qH\CD@pH}\def
+\cds@righteqno{\CD@oA}\def\cds@rightshortfall{\CD@zD{\dimen5 }}\def
+\cds@ruleaxis{\CD@zD{\let\axisheight}}\def\cds@cmex{\let\CD@GG\CD@sB\let
+\CD@QJ\CD@CJ}\def\cds@s{\cds@height\DiagramCellWidth\DiagramCellHeight}\def
+\cds@scriptlabels{\let\labelstyle\scriptstyle}\def\cds@shortfall{\CD@zD
+\MapShortFall\dimen1\MapShortFall\dimen5\MapShortFall}\def\cds@showfirstpass{%
+\CD@BE{\let\CD@nD}\z@}\def\cds@silent{\def\CD@KB##1{}\def\CD@gB##1{}}\let
+\cds@size\cds@s\def\cds@small{\CellSize2\CD@zC}\def\cds@snake{\CD@BE\CD@eJ\z@
+}\def\cds@t{\let\CD@dB\CD@fB}\def\cds@textflow{\CD@SB\CD@PJ}\def\cds@thick{%
+\let\CD@rF\tenlnw\CD@LF\CD@NC\CD@BE\MapBreadth{2\CD@LF}\CD@@J}\def\cds@thin{%
+\let\CD@rF\tenln\CD@BE\MapBreadth{\CD@NC}\CD@@J}\def\cds@tight{\CD@WB}\let
+\cds@top\cds@t\def\cds@TPIC{\CD@DK}\def\cds@uppershortfall{%
+\ifPositiveGradient\cds@rightshortfall\else\cds@leftshortfall\fi}\def
+\cds@vcenter{\let\CD@dB\CD@cB}\let\cds@vcentre\cds@vcenter\def
+\cds@vtriangleheight{\CD@BE\DiagramCellHeight\DiagramCellHeight
+\DiagramCellWidth.577035\DiagramCellHeight}\def\cds@vtrianglewidth{\CD@BE
+\DiagramCellWidth\DiagramCellWidth\DiagramCellHeight1.73205\DiagramCellWidth}%
+\def\cds@vmiddle{\let\CD@dB\CD@eB}\def\cds@w{\CD@zD\DiagramCellWidth}\let
+\cds@width\cds@w\def\diagram{\relax\protect\CD@bC}\def\enddiagram{\protect
+\CD@SG}\def\CD@bC{\CD@g\CD@uI\incommdiagtrue\edef\CD@wI{\the\CD@NB}\global
+\CD@NB\z@\boxmaxdepth\maxdimen\everycr{}\ifx\pdfoutput\undefined\else\ifx
+\pdfoutput\relax\else\ifnum\pdfoutput>\z@\CD@dK\CD@aB\global\let\CD@n\empty
+\fi\fi\fi\CD@aC}\def\CD@aC{\CD@y\let\CD@N\CD@ZC\CD@CF\CD@AE\CD@WD}\def\CD@ZC{%
+\CD@gE\expandafter\CD@aC\else\expandafter\CD@WD\fi}\def\CD@WD{\let\CD@EH
+\relax\CD@nE\CD@vE\else\CD@hK\else\CD@KB{landscape ignored without PostScript%
+}\CD@jA\fi\fi\fi\CD@EJ\setbox2=\vbox\bgroup\CD@JF\CD@VD}\def\CD@cH{\CD@nE
+\CD@fB\else\CD@dB\fi\CD@hA\nointerlineskip\setbox0=\null\ht0-\CD@pI\dp0\CD@pI
+\wd0\CD@kI\box0 \global\CD@QA\CD@kF\global\CD@yA\CD@XB\ifx\CD@NK\undefined
+\global\CD@RA\CD@kF\else\global\CD@RA\CD@NK\fi\egroup\CD@zF\CD@nE\setbox2=%
+\hbox to\dp2{\vrule height\wd2 depth\CD@QA width\z@\global\CD@QA\ht2\ht2\z@
+\dp2\z@\wd2\z@\CD@hK\pdfliteral{q 0 1 -1 0 0 0 cm}\else\global\CD@iG\CD@IK{0 1
+bturn}\fi\box2\CD@gK\hss}\CD@DB\fi\ifnum\CD@yA=1 \else\CD@DB\fi\global
+\@ignorefalse\CD@mE\leavevmode\fi\ifvmode\CD@TA\else\ifmmode\CD@PH\CD@GI\else
+\CD@qE\CD@gA\fi\ifinner\CD@gA\fi\CD@mE\CD@GI\else\CD@sE\CD@QB\else\CD@TA\fi
+\fi\fi\fi\CD@dD}\def\CD@dD{\global\CD@NB\CD@wI\relax\CD@xE\global\CD@ID\else
+\aftergroup\CD@mC\fi\if@ignore\aftergroup\ignorespaces\fi\CD@wC\ignorespaces}%
+\def\CD@fB{\advance\CD@pI\dimen1\relax}\def\CD@eB{\advance\CD@pI.5\dimen1%
+\relax}\def\CD@bB{}\def\CD@cB{\CD@fB\advance\CD@pI\CD@YB\divide\CD@pI2
+\advance\CD@pI-\axisheight\relax}\def\CD@aA{}\def\CD@iB{\CD@kF\z@}\def\CD@AA{%
+\ifdim\dimen2>\CD@kF\CD@kF\dimen2 \else\dimen2\CD@kF\CD@kI\dimen0 \advance
+\CD@kI\dimen2 \fi}\def\CD@QB{\skip0\z@\relax\loop\skip1\lastskip\ifdim\skip1>%
+\z@\unskip\advance\skip0\skip1 \repeat\vadjust{\prevdepth\dp\strutbox\penalty
+\predisplaypenalty\vskip\abovedisplayskip\CD@UA\penalty\postdisplaypenalty
+\vskip\belowdisplayskip}\ifdim\skip0=\z@\else\hskip\skip0 \global\@ignoretrue
+\fi}\def\CD@TA{\CD@LG\kern-\displayindent\CD@UA\CD@LG\global\@ignoretrue}\def
+\CD@UA{\hbox to\hsize{\CD@fE\ifdim\CD@RA=\z@\else\advance\CD@QA-\CD@RA\setbox
+2=\hbox{\kern\CD@RA\box2}\fi\fi\setbox1=\hbox{\ifx\CD@XA\undefined\else\CD@k
+\CD@XA\CD@ND\fi}\CD@oE\CD@iE\else\advance\CD@QA\wd1 \fi\wd1\z@\box1 \fi\dimen
+0\wd2 \advance\dimen0\wd1 \advance\dimen0-\hsize\ifdim\dimen0>-\CD@nA\CD@HA
+\fi\advance\dimen0\CD@QA\ifdim\dimen0>\z@\CD@KB{wider than the page by \the
+\dimen0 }\CD@HA\fi\CD@iE\hss\else\CD@V\CD@QA\CD@nA\fi\CD@GI\hss\kern-\wd1\box
+1 }}\def\CD@GI{\CD@AF\CD@@F\else\CD@SC\global\CD@hG\fi\fi\kern\CD@QA\box2 }%
+\CD@tG\CD@wE\CD@YC\CD@XC\def\CD@JF{\CD@cJ\ifdim\DiagramCellHeight=-\maxdimen
+\DiagramCellHeight\CD@QC\fi\ifdim\DiagramCellWidth=-\maxdimen
+\DiagramCellWidth\CD@QC\fi\global\CD@XC\CD@IF\let\CD@FE\empty\let\CD@z\CD@Q
+\let\overprint\CD@eH\let\CD@s\CD@rJ\let\enddiagram\CD@ED\let\\\CD@cC\let\par
+\CD@jH\let\CD@MD\empty\let\switch@arg\CD@PB\let\shift\CD@iA\baselineskip
+\DiagramCellHeight\lineskip\z@\lineskiplimit\z@\mathsurround\z@\tabskip\z@
+\CD@OB}\def\CD@VD{\penalty-123 \begingroup\CD@jA\aftergroup\CD@K\halign
+\bgroup\global\advance\CD@NB1 \vadjust{\penalty1}\global\CD@FA\z@\CD@OB\CD@j#%
+#\CD@DD\CD@Q\CD@Q\CD@OI\CD@j##\CD@DD\cr}\def\CD@ED{\CD@MD\CD@GD\crcr\egroup
+\global\CD@JD\endgroup}\def\CD@j{\global\advance\CD@FA1 \futurelet\CD@EH\CD@i
+}\def\CD@i{\ifx\CD@EH\CD@DD\CD@tJ\hskip1sp plus 1fil \relax\let\CD@DD\relax
+\CD@vI\else\hfil\CD@k\objectstyle\let\CD@FE\CD@d\fi}\def\CD@DD{\CD@MD\relax
+\CD@yI\CD@vI\global\CD@QA\CD@iA\penalty-9993 \CD@ND\hfil\null\kern-2\CD@QA
+\null}\def\CD@cC{\cr}\def\across#1{\span\omit\mscount=#1 \global\advance
+\CD@FA\mscount\global\advance\CD@FA\m@ne\CD@sF\ifnum\mscount>2 \CD@fJ\repeat
+\ignorespaces}\def\CD@fJ{\relax\span\omit\advance\mscount\m@ne}\def\CD@qJ{%
+\ifincommdiag\ifx\CD@iD\@fillh\ifx\CD@jD\@fillh\ifdim\dimen3>\z@\else\ifdim
+\dimen2>93\CD@@I\ifdim\dimen2>18\p@\ifdim\CD@LF>\z@\count@\CD@bJ\advance
+\count@\m@ne\ifnum\count@<\z@\count@20\let\CD@aJ\CD@uJ\fi\xdef\CD@bJ{\the
+\count@}\fi\fi\fi\fi\fi\fi\fi}\def\CD@cG#1{\vrule\horizhtdp width#1\dimen@
+\kern2\dimen@}\def\CD@uJ{\rlap{\dimen@\CD@@I\CD@V\dimen@{.182\p@}\CD@zH
+\dimen@\advance\CD@tI\dimen@\CD@cG0\CD@cG0\CD@cG2\CD@cG6\CD@cG6\CD@cG2\CD@cG0%
+\CD@cG0\CD@cG2\CD@cG6\CD@cG0\CD@cG0\CD@cG2\CD@cG2\CD@cG6\CD@cG0\CD@cG0\CD@cG2%
+\CD@cG6\CD@cG2\CD@cG2\CD@cG0\CD@cG0}}\def\CD@bJ{10}\def\CD@aJ{}\def\CD@XD{%
+\CD@gE\CD@TB\fi\CD@x\CD@WF\CD@HI}\def\CD@x{\CD@QJ\CD@DC\CD@MJ\ifdim\CD@DC=\z@
+\else\CD@pF\CD@DC\fi\ifvoid3 \setbox3=\null\ht3\CD@tI\dp3\CD@sI\else\CD@V{\ht
+3}\CD@tI\CD@V{\dp3}\CD@sI\fi\dimen3=.5\wd3 \ifdim\dimen3=\z@\CD@tE\else\dimen
+3-\CD@XH\fi\else\CD@TB\fi\CD@V{\dimen2}{\wd7}\CD@V{\dimen2}{\wd6}\CD@qJ
+\advance\dimen2-2\dimen3 \dimen4.5\dimen2 \dimen2\dimen4 \advance\dimen2%
+\CD@eJ\advance\dimen4-\CD@eJ\advance\dimen2-\wd1 \advance\dimen4-\wd5 \ifvoid
+2 \else\CD@V{\ht3}{\ht2}\CD@V{\dp3}{\dp2}\CD@V{\dimen2}{\wd2}\fi\ifvoid4 \else
+\CD@V{\ht3}{\ht4}\CD@V{\dp3}{\dp4}\CD@V{\dimen4}{\wd4}\fi\advance\skip2\dimen
+2 \advance\skip4\dimen4 \CD@tE\advance\skip2\skip4 \dimen0\dimen5 \advance
+\dimen0\wd5 \skip3-\skip4 \advance\skip3-\dimen0 \let\CD@jD\empty\else\skip3%
+\z@\relax\dimen0\z@\fi}\def\CD@WF{\offinterlineskip\lineskip.2\CD@zC\ifvoid6
+\else\setbox3=\vbox{\hbox to2\dimen3{\hss\box6\hss}\box3}\fi\ifvoid7 \else
+\setbox3=\vtop{\box3 \hbox to2\dimen3{\hss\box7\hss}}\fi}\def\CD@HI{\kern
+\dimen1 \box1 \CD@aJ\CD@iD\hskip\skip2 \kern\dimen0 \ifincommdiag\CD@jE
+\penalty1\fi\kern\dimen3 \penalty\CD@GB\hskip\skip3 \null\kern-\dimen3 \else
+\hskip\skip3 \fi\box3 \CD@jD\hskip\skip4 \box5 \kern\dimen5}\def\CD@MF{\ifnum
+\CD@LH>\CD@TC\CD@V{\dimen1}\objectheight\CD@V{\dimen5}\objectheight\else\CD@V
+{\dimen1}\objectwidth\CD@V{\dimen5}\objectwidth\fi}\def\CD@Y{\begingroup
+\ifdim\dimen7=\z@\kern\dimen8 \else\ifdim\dimen6=\z@\kern\dimen9 \else\dimen5%
+\dimen6 \dimen6\dimen9 \CD@KJ\dimen4\dimen2 \CD@dG{\dimen4}\dimen6\dimen5
+\dimen7\dimen8 \CD@KJ\CD@iC{\dimen2}\ifdim\dimen2<\dimen4 \kern\dimen2 \else
+\kern\dimen4 \fi\fi\fi\endgroup}\def\CD@jJ{\CD@JI\setbox\z@\hbox{\lower
+\axisheight\hbox to\dimen2{\CD@DF\ifPositiveGradient\dimen8\ht\CD@MH\dimen9%
+\CD@mI\else\dimen8\dp3 \dimen9\dimen1 \fi\else\dimen8 \ifPositiveGradient
+\objectheight\else\z@\fi\dimen9\objectwidth\fi\advance\dimen8
+\ifPositiveGradient-\fi\axisheight\CD@Y\unhbox\z@\CD@DF\ifPositiveGradient
+\dimen8\dp3 \dimen9\dimen0 \else\dimen8\ht\CD@MH\dimen9\CD@mF\fi\else\dimen8
+\ifPositiveGradient\z@\else\objectheight\fi\dimen9\objectwidth\fi\advance
+\dimen8 \ifPositiveGradient\else-\fi\axisheight\CD@Y}}}\def\CD@bD{\dimen6
+\CD@aK\DiagramCellHeight\dimen7 \CD@WK\DiagramCellWidth\CD@jJ
+\ifPositiveGradient\advance\dimen7-\CD@ZK\DiagramCellWidth\else\dimen7 \CD@ZK
+\DiagramCellWidth\dimen6\z@\fi\advance\dimen6-\CD@bK\DiagramCellHeight\CD@mK
+\setbox0=\rlap{\kern-\dimen7 \lower\dimen6\box\z@}\ht0\z@\dp0\z@\raise
+\axisheight\box0 }\def\CD@mK{\setbox0\hbox{\ht\z@\z@\dp\z@\z@\wd\z@\z@\CD@hK
+\expandafter\pdfliteral{q \CD@eK\space\CD@lK\space\CD@kK\space\CD@eK\space0 0
+cm}\else\global\CD@iG\CD@eD{\the\CD@TC\space\ifPositiveGradient\else-\fi\the
+\CD@LH\space bturn}\fi\box\z@\CD@gK}}\def\CD@vB{\advance\CD@hF-\CD@mI\CD@wJ
+\CD@hF\advance\CD@wJ\CD@hI\ifvoid\CD@sH\ifdim\CD@wJ<.1em\ifnum\CD@gD=\@m\else
+\CD@aG h\CD@wJ<.1em:objects overprint:\CD@FA\CD@gD\fi\fi\else\ifhbox\CD@sH
+\CD@SK\else\CD@TK\fi\advance\CD@wJ\CD@mI\CD@bH{-\CD@mI}{\box\CD@sH}{\CD@wJ}%
+\z@\fi\CD@hF-\CD@mF\CD@gD\CD@FA\CD@hI\z@}\def\CD@SK{\setbox\CD@sH=\hbox{%
+\unhbox\CD@sH\unskip\unpenalty}\setbox\CD@tH=\hbox{\unhbox\CD@tH\unskip
+\unpenalty}\setbox\CD@sH=\hbox to\CD@wJ{\CD@OA\wd\CD@sH\unhbox\CD@sH\CD@PA
+\lastkern\unkern\ifdim\CD@PA=\z@\CD@UB\advance\CD@OA-\wd\CD@tH\else\CD@TB\fi
+\ifnum\lastpenalty=\z@\else\CD@JA\unpenalty\fi\kern\CD@PA\ifdim\CD@hF<\CD@OA
+\CD@JA\fi\ifdim\CD@hI<\wd\CD@tH\CD@JA\fi\CD@jE\CD@hI\CD@wJ\advance\CD@hI-%
+\CD@OA\advance\CD@hI\wd\CD@tH\ifdim\CD@hI<2\wd\CD@tH\CD@aG h\CD@hI<2\wd\CD@tH
+:arrow too short:\CD@FA\CD@gD\fi\divide\CD@hI\tw@\CD@hF\CD@wJ\advance\CD@hF-%
+\CD@hI\fi\CD@tE\kern-\CD@hI\fi\hbox to\CD@hI{\unhbox\CD@tH}\CD@HG}}\CD@tG
+\ifinpile\inpiletrue\inpilefalse\inpilefalse\def\pile{\protect\CD@UJ\protect
+\CD@uH}\def\CD@uH#1{\CD@l#1\CD@QD}\def\CD@UJ{\CD@nB{pile}\setbox0=\vtop
+\bgroup\aftergroup\CD@lD\inpiletrue\let\CD@FE\empty\let\pile\CD@KF\let\CD@QD
+\CD@PD\let\CD@GD\CD@FD\CD@yH\baselineskip.5\PileSpacing\lineskip.1\CD@zC
+\relax\lineskiplimit\lineskip\mathsurround\z@\tabskip\z@\let\\\CD@wH}\def
+\CD@l{\CD@DE\CD@YF\empty\halign\bgroup\hfil\CD@k\let\CD@FE\CD@d\let\\\CD@vH##%
+\CD@MD\CD@ND\hfil\CD@Q\CD@R##\cr}\CD@rG\CD@NE{pile only allows one column.}%
+\CD@rG\CD@UE{you left it out!}\def\CD@R{\CD@QD\CD@Q\relax\CD@YA{missing \CD@yC
+\space inserted after \string\pile}\CD@NE}\def\CD@PD{\CD@MD\crcr\egroup
+\egroup}\def\CD@GD{\CD@MD}\def\CD@FD{\CD@MD\relax\CD@QD\CD@YA{missing \CD@yC
+\space inserted between \string\pile\space and \CD@HD}\CD@UE}\def\CD@QD{%
+\CD@MD}\def\CD@lD{\vbox{\dimen1\dp0 \unvbox0 \setbox0=\lastbox\advance\dimen1%
+\dp0 \nointerlineskip\box0 \nointerlineskip\setbox0=\null\dp0.5\dimen1\ht0-%
+\dp0 \box0}\ifincommdiag\CD@tJ\penalty-9998 \fi\xdef\CD@YF{pile}}\def\CD@vH{%
+\cr}\def\CD@wH{\noalign{\skip@\prevdepth\advance\skip@-\baselineskip
+\prevdepth\skip@}}\def\CD@KF#1{#1}\def\CD@TK{\setbox\CD@sH=\vbox{\unvbox
+\CD@sH\setbox1=\lastbox\setbox0=\box\voidb@x\CD@tF\setbox\CD@sH=\lastbox
+\ifhbox\CD@sH\CD@rC\repeat\unvbox0 \global\CD@QA\CD@ZE}\CD@ZE\CD@QA}\def
+\CD@rC{\CD@jE\setbox\CD@sH=\hbox{\unhbox\CD@sH\unskip\setbox\CD@sH=\lastbox
+\unskip\unhbox\CD@sH}\ifdim\CD@wJ<\wd\CD@sH\CD@aG h\CD@wJ<\wd\CD@sH:arrow in
+pile too short:\CD@FA\CD@gD\else\setbox\CD@sH=\hbox to\CD@wJ{\unhbox\CD@sH}%
+\fi\else\CD@gJ\fi\setbox0=\vbox{\box\CD@sH\nointerlineskip\ifvoid0 \CD@tJ\box
+1 \else\vskip\skip0 \unvbox0 \fi}\skip0=\lastskip\unskip}\def\CD@gJ{\penalty7
+\noindent\unhbox\CD@sH\unskip\setbox\CD@sH=\lastbox\unskip\unhbox\CD@sH
+\endgraf\setbox\CD@tH=\lastbox\unskip\setbox\CD@tH=\hbox{\CD@JG\unhbox\CD@tH
+\unskip\unskip\unpenalty}\ifcase\prevgraf\cd@shouldnt P\or\ifdim\CD@wJ<\wd
+\CD@tH\CD@aG h\CD@wJ<\wd\CD@sH:object in pile too wide:\CD@FA\CD@gD\setbox
+\CD@sH=\hbox to\CD@wJ{\hss\unhbox\CD@tH\hss}\else\setbox\CD@sH=\hbox to\CD@wJ
+{\hss\kern\CD@hF\unhbox\CD@tH\kern\CD@hI\hss}\fi\or\setbox\CD@sH=\lastbox
+\unskip\CD@SK\else\cd@shouldnt Q\fi\unskip\unpenalty}\def\CD@cD{\CD@MJ\ifvoid
+3 \setbox3=\null\ht3\axisheight\dp3-\ht3 \dimen3.5\CD@LF\else\dimen4\dp3
+\dimen3.5\wd3 \setbox3=\CD@GG{\box3}\dp3\dimen4 \ifdim\ht3=-\dp3 \else\CD@TB
+\fi\fi\dimen0\dimen3 \advance\dimen0-.5\CD@LF\setbox0\null\ht0\ht3\dp0\dp3\wd
+0\wd3 \ifvoid6\else\setbox6\hbox{\unhbox6\kern\dimen0\kern2pt}\dimen0\wd6 \fi
+\ifvoid7\else\setbox7\hbox{\kern2pt\kern\dimen3\unhbox7}\dimen3\wd7 \fi
+\setbox3\hbox{\ifvoid6\else\kern-\dimen0\unhbox6\fi\unhbox3 \ifvoid7\else
+\unhbox7\kern-\dimen3\fi}\ht3\ht0\dp3\dp0\wd3\wd0 \CD@tE\dimen4=\ht\CD@MH
+\advance\dimen4\dp5 \advance\dimen4\dimen1 \let\CD@jD\empty\else\dimen4\ht3
+\fi\setbox0\null\ht0\dimen4 \offinterlineskip\setbox8=\vbox spread2ex{\kern
+\dimen5 \box1 \CD@iD\vfill\CD@tE\else\kern\CD@eJ\fi\box0}\ht8=\z@\setbox9=%
+\vtop spread2ex{\kern-\ht3 \kern-\CD@eJ\box3 \CD@jD\vfill\box5 \kern\dimen1}%
+\dp9=\z@\hskip\dimen0plus.0001fil \box9 \kern-\CD@LF\box8 \CD@kE\penalty2 \fi
+\CD@tE\penalty1 \fi\kern\PileSpacing\kern-\PileSpacing\kern-.5\CD@LF\penalty
+\CD@GB\null\kern\dimen3}\def\CD@cI{\ifhbox\CD@VA\CD@KB{clashing verticals}\ht
+\CD@MH.5\dp\CD@VA\dp\CD@MH-\ht5 \CD@yB\ht\CD@MH\z@\dp\CD@MH\z@\fi\dimen1\dp
+\CD@VA\CD@xA\prevgraf\unvbox\CD@VA\CD@wA\lastpenalty\unpenalty\setbox\CD@VA=%
+\null\setbox\CD@lI=\hbox{\CD@JG\unhbox\CD@lI\unskip\unpenalty\dimen0\lastkern
+\unkern\unkern\unkern\kern\dimen0 \CD@HG}\setbox\CD@lF=\hbox{\unhbox\CD@lF
+\dimen0\lastkern\unkern\unkern\global\CD@QA\lastkern\unkern\kern\dimen0 }%
+\CD@tF\ifnum\CD@xA>4 \CD@zI\repeat\unskip\unskip\advance\CD@mF.5\wd\CD@VA
+\advance\CD@mF\wd\CD@lF\advance\CD@mI.5\wd\CD@VA\advance\CD@mI\wd\CD@lI\ifnum
+\CD@FA=\CD@lA\CD@OA.5\wd\CD@VA\edef\CD@NK{\the\CD@OA}\fi\setbox\CD@VA=\hbox{%
+\kern-\CD@mF\box\CD@lF\unhbox\CD@VA\box\CD@lI\kern-\CD@mI\penalty\CD@wA
+\penalty\CD@NB}\ht\CD@VA\dimen1 \dp\CD@VA\z@\wd\CD@VA\CD@tB\CD@vB}\def\CD@zI{%
+\ifdim\wd\CD@lF<\CD@QA\setbox\CD@lF=\hbox to\CD@QA{\CD@JG\unhbox\CD@lF}\fi
+\advance\CD@xA\m@ne\setbox\CD@VA=\hbox{\box\CD@lF\unhbox\CD@VA}\unskip\setbox
+\CD@lF=\lastbox\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip\unpenalty\dimen0%
+\lastkern\unkern\unkern\global\CD@QA\lastkern\unkern\kern\dimen0 }}\def\CD@yB
+{\dimen1\dp\CD@VA\ifhbox\CD@VA\CD@xB\else\CD@zB\fi\setbox\CD@VA=\vbox{%
+\penalty\CD@NB}\dp\CD@VA-\dp\CD@MH\wd\CD@VA\CD@tB}\def\CD@zB{\unvbox\CD@VA
+\CD@wA\lastpenalty\unpenalty\ifdim\dimen1<\ht\CD@MH\CD@aG v\dimen1<\ht\CD@MH:%
+rows overprint:\CD@NB\CD@wA\fi}\def\CD@xB{\dimen0=\ht\CD@VA\setbox\CD@VA=%
+\hbox\bgroup\advance\dimen1-\ht\CD@MH\unhbox\CD@VA\CD@xA\lastpenalty
+\unpenalty\CD@wA\lastpenalty\unpenalty\global\CD@RA-\lastkern\unkern\setbox0=%
+\lastbox\CD@tF\setbox\CD@VA=\hbox{\box0\unhbox\CD@VA}\setbox0=\lastbox\ifhbox
+0 \CD@kJ\repeat\global\CD@SA-\lastkern\unkern\global\CD@QA\CD@JK\unhbox\CD@VA
+\egroup\CD@JK\CD@QA\CD@bH{\CD@SA}{\box\CD@VA}{\CD@RA}{\dimen1}}\def\CD@kJ{%
+\setbox0=\hbox to\wd0\bgroup\unhbox0 \unskip\unpenalty\dimen7\lastkern\unkern
+\ifnum\lastpenalty=1 \unpenalty\CD@UB\else\CD@TB\fi\ifnum\lastpenalty=2
+\unpenalty\dimen2.5\dimen0\advance\dimen2-.5\dimen1\advance\dimen2-%
+\axisheight\else\dimen2\z@\fi\setbox0=\lastbox\dimen6\lastkern\unkern\setbox1%
+=\lastbox\setbox0=\vbox{\unvbox0 \CD@tE\kern-\dimen1 \else\ifdim\dimen2=\z@
+\else\kern\dimen2 \fi\fi}\ifdim\dimen0<\ht0 \CD@aG v\dimen0<\ht0:upper part of
+vertical too short:{\CD@tE\CD@NB\else\CD@wA\fi}\CD@xA\else\setbox0=\vbox to%
+\dimen0{\unvbox0}\fi\setbox1=\vtop{\unvbox1}\ifdim\dimen1<\dp1 \CD@aG v\dimen
+1<\dp1:lower part of vertical too short:\CD@NB\CD@wA\else\setbox1=\vtop to%
+\dimen1{\ifdim\dimen2=\z@\else\kern-\dimen2 \fi\unvbox1 }\fi\box1 \kern\dimen
+6 \box0 \kern\dimen7 \CD@HG\global\CD@QA\CD@JK\egroup\CD@JK\CD@QA\relax}%
+\countdef\CD@u=14 \newcount\CD@CA\newcount\CD@XB\newcount\CD@NB\let\CD@LB
+\insc@unt\newcount\CD@FA\newcount\CD@lA\let\CD@mA\CD@XB\newcount\CD@MB\CD@tG
+\CD@DF\CD@bI\CD@aI\CD@aI\def\CD@nD{-1}\def\CD@K{\ifnum\CD@nD<\z@\else
+\begingroup\scrollmode\showboxdepth\CD@nD\showboxbreadth\maxdimen\showlists
+\endgroup\fi\CD@bI\CD@zF\CD@CA=\CD@u\advance\CD@CA1 \CD@XB=\CD@CA\ifnum\CD@NB
+=1 \CD@JA\fi\advance\CD@XB\CD@NB\dimen1\z@\skip0\z@\count@=\insc@unt\advance
+\count@\CD@u\divide\count@2 \ifnum\CD@XB>\count@\CD@KB{The diagram has too
+many rows! It can't be reformatted.}\else\CD@NG\CD@WI\fi\CD@cH}\def\CD@NG{%
+\CD@NB\CD@CA\CD@uF\ifnum\CD@NB<\CD@XB\setbox\CD@NB\box\voidb@x\advance\CD@NB1%
+\relax\repeat\CD@NB\CD@CA\skip\z@\z@\CD@uF\CD@GB\lastpenalty\unpenalty\ifnum
+\CD@GB>\z@\CD@KE\repeat\ifnum\CD@GB=-123 \CD@tJ\unpenalty\else\cd@shouldnt D%
+\fi\ifx\v@grid\relax\else\CD@NB\CD@XB\advance\CD@NB\m@ne\expandafter\CD@VJ
+\v@grid\fi\CD@MB\CD@mA\CD@tB\z@\CD@XG\ifx\h@grid\relax\else\expandafter\CD@LJ
+\h@grid\fi\count@\CD@XB\advance\count@\m@ne\CD@YB\ht\count@}\def\CD@KE{%
+\ifcase\CD@GB\or\CD@MG\else\CD@uA-\lastpenalty\unpenalty\CD@vA\lastpenalty
+\unpenalty\setbox0=\lastbox\CD@WG\fi\CD@wD}\def\CD@wD{\skip1\lastskip\unskip
+\advance\skip0\skip1 \ifdim\skip1=\z@\else\expandafter\CD@wD\fi}\def\CD@MG{%
+\setbox0=\lastbox\CD@pI\dp0 \advance\CD@pI\skip\z@\skip\z@\z@\advance\CD@NF
+\CD@pI\CD@uE\ifnum\CD@NB>\CD@CA\CD@NF\DiagramCellHeight\CD@pI\CD@NF\advance
+\CD@pI-\CD@qI\fi\fi\CD@qI\ht0 \CD@NF\CD@qI\setbox\CD@NB\hbox{\unhbox\CD@NB
+\unhbox0}\dp\CD@NB\CD@pI\ht\CD@NB\CD@qI\advance\CD@NB1 }\def\CD@WG{\ifnum
+\CD@uA<\z@\advance\CD@uA\CD@XB\ifnum\CD@uA<\CD@CA\CD@UG\else\CD@OA\dp\CD@uA
+\CD@PA\ht\CD@uA\setbox\CD@uA\hbox{\box\z@\penalty\CD@vA\penalty\CD@GB\unhbox
+\CD@uA}\dp\CD@uA\CD@OA\ht\CD@uA\CD@PA\fi\else\CD@UG\fi}\def\CD@UG{\CD@KB{%
+diagonal goes outside diagram (lost)}}\def\CD@fI{\advance\CD@uA\CD@XB\ifnum
+\CD@uA<\CD@CA\CD@UG\else\ifnum\CD@uA=\CD@NB\CD@VG\else\ifnum\CD@uA>\CD@NB
+\cd@shouldnt M\else\CD@OA\dp\CD@uA\CD@PA\ht\CD@uA\setbox\CD@uA\hbox{\box\z@
+\penalty\CD@vA\penalty\CD@GB\unhbox\CD@uA}\dp\CD@uA\CD@OA\ht\CD@uA\CD@PA\fi
+\fi\fi}\def\CD@WI{\CD@t\CD@AJ\setbox\CD@PC=\hbox{\CD@k A\@super f\CD@lJ f%
+\CD@ND}\CD@ZE\z@\CD@JK\z@\CD@kI\z@\CD@kF\z@\CD@NB=\CD@XB\CD@NF\z@\CD@uB\z@
+\CD@uF\ifnum\CD@NB>\CD@CA\advance\CD@NB\m@ne\CD@qI\ht\CD@NB\CD@pI\dp\CD@NB
+\advance\CD@NF\CD@qI\CD@rI\advance\CD@uB\CD@NF\CD@KC\CD@ZI\CD@w\ht\CD@NB
+\CD@qI\dp\CD@NB\CD@pI\nointerlineskip\box\CD@NB\CD@NF\CD@pI\setbox\CD@NB\null
+\ht\CD@NB\CD@uB\repeat\CD@wB\nointerlineskip\box\CD@NB\CD@gG\CD@ZE
+\DiagramCellWidth{width}\CD@gG\CD@JK\DiagramCellHeight{height}\CD@VA\CD@LB
+\advance\CD@VA-\CD@lA\advance\CD@VA\m@ne\advance\CD@VA\CD@mA\dimen0\wd\CD@VA
+\CD@tI\axisheight\dimen1\CD@uB\advance\dimen1-\CD@YB\dimen2\CD@kI\advance
+\dimen2-\dimen0 \advance\CD@XB-\CD@CA\advance\CD@LB-\CD@lA}\count@\year
+\multiply\count@12 \advance\count@\month\ifnum\count@>24090 \loop\iftrue
+\message{gone October 2007!}\repeat\fi\def\CD@wB{\CD@qI-\CD@NF\CD@pI\CD@NF
+\setbox\CD@MH=\null\dp\CD@MH\CD@NF\ht\CD@MH-\CD@NF\CD@mF\z@\CD@mI\z@\CD@lA
+\CD@LB\advance\CD@lA-\CD@MB\advance\CD@lA\CD@mA\CD@FA\CD@LB\CD@VA\CD@MB\CD@sF
+\ifnum\CD@FA>\CD@lA\advance\CD@FA\m@ne\advance\CD@VA\m@ne\CD@tB\wd\CD@VA
+\setbox\CD@FA=\box\voidb@x\CD@yB\repeat\CD@w\ht\CD@NB\CD@qI\dp\CD@NB\CD@pI}%
+\def\CD@gG#1#2#3{\ifdim#1>.01\CD@zC\CD@PA#2\relax\advance\CD@PA#1\relax
+\advance\CD@PA.99\CD@zC\count@\CD@PA\divide\count@\CD@zC\CD@KB{increase cell #%
+3 to \the\count@ em}\fi}\def\CD@rI{\CD@FA=\CD@LB\penalty4 \noindent\unhbox
+\CD@NB\CD@sF\unskip\setbox0=\lastbox\ifhbox0 \advance\CD@FA\m@ne\setbox\CD@FA
+\hbox to\wd0{\null\penalty-9990\null\unhbox0}\repeat\CD@lA\CD@FA\advance
+\CD@FA\CD@MB\advance\CD@FA-\CD@mA\ifnum\CD@FA<\CD@LB\count@\CD@FA\advance
+\count@\m@ne\dimen0=\wd\count@\count@\CD@MB\advance\count@\m@ne\CD@tB\wd
+\count@\CD@sF\ifnum\CD@FA<\CD@LB\CD@DJ\CD@XG\dimen0\wd\CD@FA\advance\CD@FA1
+\repeat\fi\CD@sF\CD@GB\lastpenalty\unpenalty\ifnum\CD@GB>\z@\CD@vA
+\lastpenalty\unpenalty\CD@VG\repeat\endgraf\unskip\ifnum\lastpenalty=4
+\unpenalty\else\cd@shouldnt S\fi}\def\CD@VG{\advance\CD@vA\CD@lA\advance
+\CD@vA\m@ne\setbox0=\lastbox\ifnum\CD@vA<\CD@LB\setbox\CD@vA\hbox{\box0%
+\penalty\CD@GB\unhbox\CD@vA}\else\CD@UG\fi}\def\CD@bG{}\CD@tG\CD@uE\CD@WB
+\CD@VB\def\CD@DJ{\advance\dimen0\wd\CD@FA\divide\dimen0\tw@\CD@uE\dimen0%
+\DiagramCellWidth\else\CD@V{\dimen0}\DiagramCellWidth\CD@pJ\fi\advance\CD@tB
+\dimen0 }\def\CD@XG{\setbox\CD@MB=\vbox{}\dp\CD@MB=\CD@uB\wd\CD@MB\CD@tB
+\advance\CD@MB1 }\def\CD@LJ#1,{\def\CD@GK{#1}\ifx\CD@GK\CD@RD\else\advance
+\CD@tB\CD@GK\DiagramCellWidth\CD@XG\expandafter\CD@LJ\fi}\def\CD@VJ#1,{\def
+\CD@GK{#1}\ifx\CD@GK\CD@RD\else\ifnum\CD@NB>\CD@CA\CD@NF\CD@GK
+\DiagramCellHeight\advance\CD@NF-\dp\CD@NB\advance\CD@NB\m@ne\ht\CD@NB\CD@NF
+\fi\expandafter\CD@VJ\fi}\def\CD@pJ{\CD@wE\CD@OA\dimen0 \advance\CD@OA-%
+\DiagramCellWidth\ifdim\CD@OA>2\MapShortFall\CD@KB{badly drawn diagonals (see
+manual)}\let\CD@pJ\empty\fi\else\let\CD@pJ\empty\fi}\def\CD@KC{\CD@VA\CD@mA
+\CD@sF\ifnum\CD@VA<\CD@MB\dimen0\dp\CD@VA\advance\dimen0\CD@NF\dp\CD@VA\dimen
+0 \advance\CD@VA1 \repeat}\def\CD@bH#1#2#3#4{\ifnum\CD@FA<\CD@LB\CD@OA=#1%
+\relax\setbox\CD@FA=\hbox{\setbox0=#2\dimen7=#4\relax\dimen8=#3\relax\ifhbox
+\CD@FA\unhbox\CD@FA\advance\CD@OA-\lastkern\unkern\fi\ifdim\CD@OA=\z@\else
+\kern-\CD@OA\fi\raise\dimen7\box0 \kern-\dimen8 }\ifnum\CD@FA=\CD@lA\CD@V
+\CD@kF\CD@OA\fi\else\cd@shouldnt O\fi}\def\CD@w{\setbox\CD@NB=\hbox{\CD@FA
+\CD@lA\CD@VA\CD@mA\CD@PA\z@\relax\CD@sF\ifnum\CD@FA<\CD@LB\CD@tB\wd\CD@VA
+\relax\CD@eI\advance\CD@FA1 \advance\CD@VA1 \repeat}\CD@V\CD@kI{\wd\CD@NB}\wd
+\CD@NB\z@}\def\CD@eI{\ifhbox\CD@FA\CD@OA\CD@tB\relax\advance\CD@OA-\CD@PA
+\relax\ifdim\CD@OA=\z@\else\kern\CD@OA\fi\CD@PA\CD@tB\advance\CD@PA\wd\CD@FA
+\relax\unhbox\CD@FA\advance\CD@PA-\lastkern\unkern\fi}\def\CD@ZI{\setbox
+\CD@sH=\box\voidb@x\CD@VA=\CD@MB\CD@FA\CD@LB\CD@VA\CD@mA\advance\CD@VA\CD@FA
+\advance\CD@VA-\CD@lA\advance\CD@VA\m@ne\CD@tB\wd\CD@VA\count@\CD@LB\advance
+\count@\m@ne\CD@hF.5\wd\count@\advance\CD@hF\CD@tB\CD@A\m@ne\CD@gD\@m\CD@sF
+\ifnum\CD@FA>\CD@lA\advance\CD@FA\m@ne\advance\CD@hF-\CD@tB\CD@PI\wd\CD@VA
+\CD@tB\advance\CD@hF\CD@tB\advance\CD@VA\m@ne\CD@tB\wd\CD@VA\repeat\CD@mF
+\CD@kF\CD@mI-\CD@mF\CD@vB}\newcount\CD@GB\def\CD@s{}\def\CD@t{\mathsurround
+\z@\hsize\z@\rightskip\z@ plus1fil minus\maxdimen\parfillskip\z@\linepenalty
+9000 \looseness0 \hfuzz\maxdimen\hbadness10000 \clubpenalty0 \widowpenalty0
+\displaywidowpenalty0 \interlinepenalty0 \predisplaypenalty0
+\postdisplaypenalty0 \interdisplaylinepenalty0 \interfootnotelinepenalty0
+\floatingpenalty0 \brokenpenalty0 \everypar{}\leftskip\z@\parskip\z@
+\parindent\z@\pretolerance10000 \tolerance10000 \hyphenpenalty10000
+\exhyphenpenalty10000 \binoppenalty10000 \relpenalty10000 \adjdemerits0
+\doublehyphendemerits0 \finalhyphendemerits0 \CD@IA\prevdepth\z@}\newbox
+\CD@KG\newbox\CD@IG\def\CD@JG{\unhcopy\CD@KG}\def\CD@HG{\unhcopy\CD@IG}\def
+\CD@iJ{\hbox{}\penalty1\nointerlineskip}\def\CD@PI{\penalty5 \noindent\setbox
+\CD@MH=\null\CD@mF\z@\CD@mI\z@\ifnum\CD@FA<\CD@LB\ht\CD@MH\ht\CD@FA\dp\CD@MH
+\dp\CD@FA\unhbox\CD@FA\skip0=\lastskip\unskip\else\CD@OK\skip0=\z@\fi\endgraf
+\ifcase\prevgraf\cd@shouldnt Y \or\cd@shouldnt Z \or\CD@RI\or\CD@XI\else
+\CD@QI\fi\unskip\setbox0=\lastbox\unskip\unskip\unpenalty\noindent\unhbox0%
+\setbox0\lastbox\unpenalty\unskip\unskip\unpenalty\setbox0\lastbox\CD@tF
+\CD@GB\lastpenalty\unpenalty\ifnum\CD@GB>\z@\setbox\z@\lastbox\CD@lB\repeat
+\endgraf\unskip\unskip\unpenalty}\def\CD@YJ{\CD@uA\CD@XB\advance\CD@uA-\CD@NB
+\CD@vA\CD@FA\advance\CD@vA-\CD@lA\advance\CD@vA1 \expandafter\message{%
+prevgraf=\the\prevgraf at (\the\CD@uA,\the\CD@vA)}}\def\CD@XI{\CD@CE\setbox
+\CD@lI=\lastbox\setbox\CD@lI=\hbox{\unhbox\CD@lI\unskip\unpenalty}\unskip
+\ifdim\ht\CD@lI>\ht\CD@PC\setbox\CD@MH=\copy\CD@lI\else\ifdim\dp\CD@lI>\dp
+\CD@PC\setbox\CD@MH=\copy\CD@lI\else\CD@FG\CD@lI\fi\fi\advance\CD@mF.5\wd
+\CD@lI\advance\CD@mI.5\wd\CD@lI\setbox\CD@lI=\hbox{\unhbox\CD@lI\CD@HG}\CD@bH
+\CD@mF{\box\CD@lI}\CD@mI\z@\CD@yB\CD@vB}\def\CD@CE{\ifnum\CD@A>0 \advance
+\dimen0-\CD@tB\CD@iA-.5\dimen0 \CD@A-\CD@A\else\CD@A0 \CD@iA\z@\fi\setbox
+\CD@MH=\lastbox\setbox\CD@MH=\hbox{\unhbox\CD@MH\unskip\unskip\unpenalty
+\setbox0=\lastbox\global\CD@QA\lastkern\unkern}\advance\CD@iA-.5\CD@QA\unskip
+\setbox\CD@MH=\null\CD@mI\CD@iA\CD@mF-\CD@iA}\def\CD@Z{\ht\CD@MH\CD@tI\dp
+\CD@MH\CD@sI}\def\CD@FG#1{\setbox\CD@MH=\hbox{\CD@V{\ht\CD@MH}{\ht#1}\CD@V{%
+\dp\CD@MH}{\dp#1}\CD@V{\wd\CD@MH}{\wd#1}\vrule height\ht\CD@MH depth\dp\CD@MH
+width\wd\CD@MH}}\def\CD@QI{\CD@CE\CD@Z\setbox\CD@lI=\lastbox\unskip\setbox
+\CD@lF=\lastbox\unskip\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip\global\CD@yA
+\lastpenalty\unpenalty}\advance\CD@yA9999 \ifcase\CD@yA\CD@VI\or\CD@YI\or
+\CD@TI\or\CD@dI\or\CD@cI\or\CD@SI\else\cd@shouldnt9\fi}\def\CD@VI{\CD@FG
+\CD@lI\CD@UI\setbox\CD@sH=\box\CD@lF\setbox\CD@tH=\box\CD@lI}\def\CD@YI{%
+\CD@FG\CD@lF\setbox\CD@lI\hbox{\penalty8 \unhbox\CD@lI\unskip\unpenalty\ifnum
+\lastpenalty=8 \else\CD@xH\fi}\CD@UI\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip
+\unpenalty\global\setbox\CD@DA=\lastbox}\ifdim\wd\CD@lF=\z@\else\CD@xH\fi
+\setbox\CD@sH=\box\CD@DA}\def\CD@xH{\CD@KB{extra material in \string\pile
+\space cell (lost)}}\def\CD@UI{\CD@yB\ifvoid\CD@sH\else\CD@KB{Clashing
+horizontal arrows}\CD@mI.5\CD@hF\CD@mF-\CD@mI\CD@vB\CD@mI\z@\CD@mF\z@\fi
+\CD@hI\CD@hF\advance\CD@hI-\CD@mI\CD@hF-\CD@mF\CD@JC\CD@FA}\def\CD@RI{\setbox
+0\lastbox\unskip\CD@iA\z@\CD@Z\ifdim\skip0>\z@\CD@tJ\CD@A0 \else\ifnum\CD@A<1
+\CD@A0 \dimen0\CD@tB\fi\advance\CD@A1 \fi}\def\VonH{\CD@MA46\VonH{.5\CD@LF}}%
+\def\HonV{\CD@MA57\HonV{.5\CD@LF}}\def\HmeetV{\CD@MA44\HmeetV{-\MapShortFall}%
+}\def\CD@MA#1#2#3#4{\CD@pB34#1{\string#3}\CD@SD\CD@GB-999#2 \dimen0=#4\CD@tI
+\dimen0\advance\CD@tI\axisheight\CD@sI\dimen0\advance\CD@sI-\axisheight\CD@CF
+\CD@HC\CD@ZD}\def\CD@HC#1{\setbox0=\hbox{\CD@k#1\CD@ND}\dimen0.5\wd0 \CD@tI
+\ht0 \CD@sI\dp0 \CD@ZD}\def\CD@SD{\setbox0=\null\ht0=\CD@tI\dp0=\CD@sI\wd0=%
+\dimen0 \copy0\penalty\CD@GB\box0 }\def\CD@TI{\CD@GC\CD@yB}\def\CD@dI{\CD@GC
+\CD@vB}\def\CD@SI{\CD@GC\CD@yB\CD@vB}\def\CD@GC{\setbox\CD@lI=\hbox{\unhbox
+\CD@lI}\setbox\CD@lF=\hbox{\unhbox\CD@lF\global\setbox\CD@DA=\lastbox}\ht
+\CD@MH\ht\CD@DA\dp\CD@MH\dp\CD@DA\advance\CD@mF\wd\CD@DA\advance\CD@mI\wd
+\CD@lI}\CD@tG\ifPositiveGradient\CD@CI\CD@BI\CD@CI\CD@tG\ifClimbing\CD@rB
+\CD@qB\CD@rB\newcount\DiagonalChoice\DiagonalChoice\m@ne\ifx\tenln\nullfont
+\CD@tJ\def\CD@qF{\CD@KH\ifPositiveGradient/\else\CD@k\backslash\CD@ND\fi}%
+\else\def\CD@qF{\CD@rF\char\count@}\fi\let\CD@rF\tenln\def\Use@line@char#1{%
+\hbox{#1\CD@rF\ifPositiveGradient\else\advance\count@64 \fi\char\count@}}\def
+\CD@cF{\Use@line@char{\count@\CD@TC\multiply\count@8\advance\count@-9\advance
+\count@\CD@LH}}\def\CD@ZF{\Use@line@char{\ifcase\DiagonalChoice\CD@gF\or
+\CD@fF\or\CD@fF\else\CD@gF\fi}}\def\CD@gF{\ifnum\CD@TC=\z@\count@\rq33 \else
+\count@\CD@TC\multiply\count@\sixt@@n\advance\count@-9\advance\count@\CD@LH
+\advance\count@\CD@LH\fi}\def\CD@fF{\count@\rq\ifcase\CD@LH55\or\ifcase\CD@TC
+66\or22\or52\or61\or72\fi\or\ifcase\CD@TC66\or25\or22\or63\or52\fi\or\ifcase
+\CD@TC66\or16\or36\or22\or76\fi\or\ifcase\CD@TC66\or27\or25\or67\or22\fi\fi
+\relax}\def\CD@uC#1{\hbox{#1\setbox0=\Use@line@char{#1}\ifPositiveGradient
+\else\raise.3\ht0\fi\copy0 \kern-.7\wd0 \ifPositiveGradient\raise.3\ht0\fi
+\box0}}\def\CD@jF#1{\hbox{\setbox0=#1\kern-.75\wd0 \vbox to.25\ht0{%
+\ifPositiveGradient\else\vss\fi\box0 \ifPositiveGradient\vss\fi}}}\def\CD@jI#%
+1{\hbox{\setbox0=#1\dimen0=\wd0 \vbox to.25\ht0{\ifPositiveGradient\vss\fi
+\box0 \ifPositiveGradient\else\vss\fi}\kern-.75\dimen0 }}\CD@RC{+h:>}{%
+\Use@line@char\CD@fF}\CD@RC{-h:>}{\Use@line@char\CD@gF}\CD@nF{+t:<}{-h:>}%
+\CD@nF{-t:<}{+h:>}\CD@RC{+t:>}{\CD@jF{\Use@line@char\CD@fF}}\CD@RC{-t:>}{%
+\CD@jI{\Use@line@char\CD@gF}}\CD@nF{+h:<}{-t:>}\CD@nF{-h:<}{+t:>}\CD@RC{+h:>>%
+}{\CD@uC\CD@fF}\CD@RC{-h:>>}{\CD@uC\CD@gF}\CD@nF{+t:<<}{-h:>>}\CD@nF{-t:<<}{+%
+h:>>}\CD@nF{+h:>->}{+h:>>}\CD@nF{-h:>->}{-h:>>}\CD@nF{+t:<-<}{-h:>>}\CD@nF{-t%
+:<-<}{+h:>>}\CD@RC{+t:>>}{\CD@jF{\CD@uC\CD@fF}}\CD@RC{-t:>>}{\CD@jI{\CD@uC
+\CD@gF}}\CD@nF{+h:<<}{-t:>>}\CD@nF{-h:<<}{+t:>>}\CD@nF{+t:>->}{+t:>>}\CD@nF{-%
+t:>->}{-t:>>}\CD@nF{+h:<-<}{-t:>>}\CD@nF{-h:<-<}{+t:>>}\CD@RC{+f:-}{\CD@EF
+\null\else\CD@cF\fi}\CD@nF{-f:-}{+f:-}\def\CD@tC#1#2{\vbox to#1{\vss\hbox to#%
+2{\hss.\hss}\vss}}\def\hfdot{\CD@tC{2\axisheight}{.5em}}%
+%% % .7em until 29.7.98
+\def\vfdot{\CD@tC{1ex}\z@}%% % 1.46ex until 29.7.98
+\def\CD@bF{\hbox{\dimen0=.3\CD@zC\dimen1\dimen0 \ifnum\CD@LH>\CD@TC\CD@iC{%
+\dimen1}\else\CD@dG{\dimen0}\fi\CD@tC{\dimen0}{\dimen1}}}\newarrowfiller{.}%
+\hfdot\hfdot\vfdot\vfdot\def\dfdot{\CD@bF\CD@CK}\CD@RC{+f:.}{\dfdot}\CD@RC{-f%
+:.}{\dfdot}\def\CD@@K#1{\hbox\bgroup\def\CD@CH{#1\egroup}\afterassignment
+\CD@CH%%
+\count@=\rq}\def\lnchar{\CD@@K\CD@qF}\let\laf\lnchar\let\lah\lnchar\def\lad{%
+\CD@@K\xlad}\def\xlad{\setbox2=\hbox{\CD@qF}\setbox0=\hbox to.3\wd2{\hss.\hss
+}\dimen0=\ht0 \advance\dimen0-\dp0 \dimen1=.3\ht2 \advance\dimen1-\dimen0 \dp
+0=.5\dimen1 \dimen1=.3\ht2 \advance\dimen1\dimen0 \ht0=.5\dimen1 \raise\dp0%
+\box0}\def\lahh{\CD@@K\xlahh}\def\lat{\CD@@K\xlat}\def\xlat{\setbox0=\hbox{%
+\CD@qF}\dimen0=\ht0 \setbox1=\hbox to.25\wd0{\ifcase\DiagonalChoice\box0\hss
+\or\hss\box0 \or\hss\box0 \or\box0\hss\fi}\vbox to.25\dimen0{\ifClimbing\box1%
+\vss\else\vss\box1\fi\kern\z@}}\def\xlahh{\setbox0=\hbox{\CD@qF}%
+\ifPositiveGradient\CD@tJ\copy0 \kern-.7\wd0 \mv.3\ht0\box0 \else\ifClimbing
+\CD@tJ\copy0 \kern-.7\wd0 \mv.3\ht0\box0 \else\mv-.3\ht0\copy0 \kern-.7\wd0
+\box0 \fi\fi}\def\CD@dF#1{\setbox#1=\hbox{\dimen5\dimen#1 \setbox8=\box#1
+\dimen1\wd8 \count@\dimen5 \divide\count@\dimen1 \ifnum\count@=0 \box8 \ifdim
+\dimen5<.95\dimen1 \CD@gB{diagonal line too short}\fi\else\dimen3=\dimen5
+\advance\dimen3-\dimen1 \divide\dimen3\count@\dimen4\dimen3 \CD@dG{\dimen4}%
+\ifPositiveGradient\multiply\dimen4\m@ne\fi\dimen6\dimen1 \advance\dimen6-%
+\dimen3 \loop\raise\count@\dimen4\copy8 \ifnum\count@>0 \kern-\dimen6 \advance
+\count@\m@ne\repeat\fi}}\def\CD@CG#1{\CD@EF\CD@xJ{#1}\else\CD@dF{#1}\fi}\def
+\CD@IH#1{}\newdimen\objectheight\objectheight1.8ex \newdimen\objectwidth
+\objectwidth1em \def\CD@YD{\dimen6=\CD@aK\DiagramCellHeight\dimen7=\CD@WK
+\DiagramCellWidth\CD@KJ\ifnum\CD@LH>0 \ifnum\CD@TC>0 \CD@aF\else\aftergroup
+\CD@VC\fi\else\aftergroup\CD@UC\fi}\def\CD@VC{\CD@YA{diagonal map is nearly
+vertical}\CD@NA}\def\CD@UC{\CD@YA{diagonal map is nearly horizontal}\CD@NA}%
+\CD@rG\CD@NA{Use an orthogonal map instead}\def\CD@aF{\CD@MJ\dimen3\dimen7%
+\dimen7\dimen6\CD@iC{\dimen7}\advance\dimen3-\dimen7 \CD@MF\ifnum\CD@LH>%
+\CD@TC\advance\dimen6-\dimen1\advance\dimen6-\dimen5 \CD@iC{\dimen1}\CD@iC{%
+\dimen5}\else\dimen0\dimen1\advance\dimen0\dimen5\CD@dG{\dimen0}\advance
+\dimen6-\dimen0 \fi\dimen2.5\dimen7\advance\dimen2-\dimen1 \dimen4.5\dimen7%
+\advance\dimen4-\dimen5 \ifPositiveGradient\dimen0\dimen5 \advance\dimen1-%
+\CD@WK\DiagramCellWidth\advance\dimen1 \CD@ZK\DiagramCellWidth\setbox6=\llap{%
+\unhbox6\kern.1\ht2}\setbox7=\rlap{\kern.1\ht2\unhbox7}\else\dimen0\dimen1
+\advance\dimen1-\CD@ZK\DiagramCellWidth\setbox7=\llap{\unhbox7\kern.1\ht2}%
+\setbox6=\rlap{\kern.1\ht2\unhbox6}\fi\setbox6=\vbox{\box6\kern.1\wd2}\setbox
+7=\vtop{\kern.1\wd2\box7}\CD@dG{\dimen0}\advance\dimen0-\axisheight\advance
+\dimen0-\CD@bK\DiagramCellHeight\dimen5-\dimen0 \advance\dimen0\dimen6
+\advance\dimen1.5\dimen3 \ifdim\wd3>\z@\ifdim\ht3>-\dp3\CD@TB\fi\fi\dimen3%
+\dimen2 \dimen7\dimen2\advance\dimen7\dimen4 \ifvoid3 \else\CD@tE\else\dimen8%
+\ht3\advance\dimen8-\axisheight\CD@iC{\dimen8}\CD@X{\dimen8}{.5\wd3}\dimen9%
+\dp3\advance\dimen9\axisheight\CD@iC{\dimen9}\CD@X{\dimen9}{.5\wd3}%
+\ifPositiveGradient\advance\dimen2-\dimen9\advance\dimen4-\dimen8 \else
+\advance\dimen4-\dimen9\advance\dimen2-\dimen8 \fi\fi\advance\dimen3-.5\wd3
+\fi\dimen9=\CD@aK\DiagramCellHeight\advance\dimen9-2\DiagramCellHeight\CD@tE
+\advance\dimen2\dimen4 \CD@CG{2}\dimen2-\dimen0\advance\dimen2\dp2 \else
+\CD@CG{2}\CD@CG{4}\ifPositiveGradient\dimen2-\dimen0\advance\dimen2\dp2 \dimen
+4\dimen5\advance\dimen4-\ht4 \else\dimen4-\dimen0\advance\dimen4\dp4 \dimen2%
+\dimen5\advance\dimen2-\ht2 \fi\fi\setbox0=\hbox to\z@{\kern\dimen1 \ifvoid1
+\else\ifPositiveGradient\advance\dimen0-\dp1 \lower\dimen0 \else\advance
+\dimen5-\ht1 \raise\dimen5 \fi\rlap{\unhbox1}\fi\raise\dimen2\rlap{\unhbox2}%
+\ifvoid3 \else\lower.5\dimen9\rlap{\kern\dimen3\unhbox3}\fi\kern.5\dimen7
+\lower.5\dimen9\box6 \lower.5\dimen9\box7 \kern.5\dimen7 \CD@tE\else\raise
+\dimen4\llap{\unhbox4}\fi\ifvoid5 \else\ifPositiveGradient\advance\dimen5-\ht
+5 \raise\dimen5 \else\advance\dimen0-\dp5 \lower\dimen0 \fi\llap{\unhbox5}\fi
+\hss}\ht0=\axisheight\dp0=-\ht0\box0 }\def\NorthWest{\CD@BI\CD@rB
+\DiagonalChoice0 }\def\NorthEast{\CD@CI\CD@rB\DiagonalChoice1 }\def\SouthWest
+{\CD@CI\CD@qB\DiagonalChoice3 }\def\SouthEast{\CD@BI\CD@qB\DiagonalChoice2 }%
+\def\CD@aD{\vadjust{\CD@uA\CD@FA\advance\CD@uA\ifPositiveGradient\else-\fi
+\CD@ZK\relax\CD@vA\CD@NB\advance\CD@vA-\CD@bK\relax\hbox{\advance\CD@uA
+\ifPositiveGradient-\fi\CD@WK\advance\CD@vA\CD@aK\hbox{\box6 \kern\CD@DC\kern
+\CD@eJ\penalty1 \box7 \box\z@}\penalty\CD@uA\penalty\CD@vA}\penalty\CD@uA
+\penalty\CD@vA\penalty104}}\def\CD@eH#1{\relax\vadjust{\hbox@maths{#1}%
+\penalty\CD@FA\penalty\CD@NB\penalty\tw@}}\def\CD@lB{\ifcase\CD@GB\or\or
+\CD@bH{.5\wd0}{\box0}{.5\wd0}\z@\or\unhbox\z@\setbox\z@\lastbox\CD@bH{.5\wd0}%
+{\box0}{.5\wd0}\z@\unpenalty\unpenalty\setbox\z@\lastbox\or\CD@TG\else
+\advance\CD@GB-100 \ifnum\CD@GB<\z@\cd@shouldnt B\fi\setbox\z@\hbox{\kern
+\CD@mF\copy\CD@MH\kern\CD@mI\CD@uA\CD@XB\advance\CD@uA-\CD@NB\penalty\CD@uA
+\CD@uA\CD@FA\advance\CD@uA-\CD@lA\penalty\CD@uA\unhbox\z@\global\CD@yA
+\lastpenalty\unpenalty\global\CD@zA\lastpenalty\unpenalty}\CD@uA-\CD@yA\CD@vA
+\CD@zA\CD@fI\fi}\def\CD@TG{\unhbox\z@\setbox\z@\lastbox\CD@uA\lastpenalty
+\unpenalty\advance\CD@uA\CD@mA\CD@vA\CD@XB\advance\CD@vA-\lastpenalty
+\unpenalty\dimen1\lastkern\unkern\setbox3\lastbox\dimen0\lastkern\unkern
+\setbox0=\hbox to\z@{\unhbox0\setbox0\lastbox\setbox7\lastbox\unpenalty\CD@eJ
+\lastkern\unkern\CD@DC\lastkern\unkern\setbox6\lastbox\dimen7\CD@tB\advance
+\dimen7-\wd\CD@uA\ifdim\dimen7<\z@\CD@CI\multiply\dimen7\m@ne\let\mv\empty
+\else\CD@BI\def\mv{\raise\ht1}\kern-\dimen7 \fi\ifnum\CD@vA>\CD@NB\dimen6%
+\CD@uB\advance\dimen6-\ht\CD@vA\else\dimen6\z@\fi\CD@jJ\CD@mK\setbox1\null\ht
+1\dimen6\wd1\dimen7 \dimen7\dimen2 \dimen6\wd1 \CD@KJ\CD@uA\CD@LH\CD@vA\CD@TC
+\dimen6\ht1 \CD@KJ\setbox2\null\divide\dimen2\tw@\advance\dimen2\CD@eJ\CD@eG{%
+\dimen2}\wd2\dimen2 \dimen0.5\dimen7 \advance\dimen0\ifPositiveGradient\else-%
+\fi\CD@eJ\CD@dG{\dimen0}\advance\dimen0-\axisheight\ht2\dimen0 \dimen0\CD@DC
+\CD@eG{\dimen0}\advance\dimen0\ht2\ht2\dimen0 \dimen0\ifPositiveGradient-\fi
+\CD@DC\CD@dG{\dimen0}\advance\dimen0\wd2\wd2\dimen0 \setbox4\null\dimen0 .6%
+\CD@zC\CD@eG{\dimen0}\ht4\dimen0 \dimen0 .2\CD@zC\CD@dG{\dimen0}\wd4\dimen0
+\dimen0\wd2 \ifvoid6\else\dimen1\ht4 \advance\dimen1\ht2 \CD@CC6+-\raise
+\dimen1\rlap{\ifPositiveGradient\advance\dimen0-\wd6\advance\dimen0-\wd4 \else
+\advance\dimen0\wd4 \fi\kern\dimen0\box6}\fi\dimen0\wd2 \ifvoid7\else\dimen1%
+\ht4 \advance\dimen1-\ht2 \CD@CC7-+\lower\dimen1\rlap{\ifPositiveGradient
+\advance\dimen0\wd4 \else\advance\dimen0-\wd7\advance\dimen0-\wd4 \fi\kern
+\dimen0\box7}\fi\mv\box0\hss}\ht0\z@\dp0\z@\CD@bH{\z@}{\box\z@}{\z@}{%
+\axisheight}}\def\CD@CC#1#2#3{\dimen4.5\wd#1 \ifdim\dimen4>.25\dimen7\dimen4=%
+.25\dimen7\fi\ifdim\dimen4>\CD@zC\dimen4.4\dimen4 \advance\dimen4.6\CD@zC\fi
+\CD@eG{\dimen4}\dimen5\axisheight\CD@dG{\dimen5}\advance\dimen4-\dimen5 \dimen
+5\dimen4\CD@eG{\dimen5}\advance\dimen0\ifPositiveGradient#2\else#3\fi\dimen5
+\CD@dG{\dimen4}\advance\dimen1\dimen4 } \def\CD@eD#1{\expandafter\CD@IK{#1}}%
+\CD@ZA\CD@EK{output is PostScript dependent}\def\CD@SC{\CD@IK{/bturn {gsave
+currentpoint currentpoint translate 4 2 roll neg exch atan rotate neg exch neg
+exch translate } def /eturn {currentpoint grestore moveto} def}}\def\CD@gK{%
+\relax\CD@hK\pdfliteral{Q}\else\CD@IK{eturn}\fi} \def\CD@OJ#1{\count@#1\relax
+\multiply\count@7\advance\count@16577\divide\count@33154 }\def\CD@fD#1{%
+\expandafter\special{#1}} \def\CD@xJ#1{\setbox#1=\hbox{\dimen0\dimen#1\CD@dG{%
+\dimen0}\CD@OJ{\dimen0}\setbox0=\null\ifPositiveGradient\count@-\count@\ht0%
+\dimen0 \else\dp0\dimen0 \fi\box0 \CD@uA\count@\CD@OJ\CD@LF\CD@fD{pn \the
+\count@}\CD@fD{pa 0 0}\CD@OJ{\dimen#1}\CD@fD{pa \the\count@\space\the\CD@uA}%
+\CD@fD{fp}\kern\dimen#1}}\def\CD@JI{\CD@KJ\begingroup\ifdim\dimen7<\dimen6
+\dimen2=\dimen6 \dimen6=\dimen7 \dimen7=\dimen2 \count@\CD@LH\CD@LH\CD@TC
+\CD@TC\count@\else\dimen2=\dimen7 \fi\ifdim\dimen6>.01\p@\CD@KI\global\CD@QA
+\dimen0 \else\global\CD@QA\dimen7 \fi\endgroup\dimen2\CD@QA\CD@iK\CD@lK{%
+\ifPositiveGradient\else-\fi\dimen6}\CD@iK\CD@kK{\ifPositiveGradient-\fi
+\dimen6}\CD@iK\CD@eK{\dimen7}}\def\CD@KI{\CD@hJ\ifdim\dimen7>1.73\dimen6
+\divide\dimen2 4 \multiply\CD@TC2 \else\dimen2=0.353553\dimen2 \advance\CD@LH
+-\CD@TC\multiply\CD@TC4 \fi\dimen0=4\dimen2 \CD@ZG4\CD@ZG{-2}\CD@ZG2\CD@ZG{-2%
+.5}}\def\CD@AI{\begingroup\count@\dimen0 \dimen2 45pt \divide\count@\dimen2
+\ifdim\dimen0<\z@\advance\count@\m@ne\fi\ifodd\count@\advance\count@1\CD@@A
+\else\CD@y\fi\advance\dimen0-\count@\dimen2 \CD@gE\multiply\dimen0\m@ne\fi
+\ifnum\count@<0 \multiply\count@-7 \fi\dimen3\dimen1 \dimen6\dimen0 \dimen7
+3754936sp \ifdim\dimen0<6\p@\def\CD@OG{4000}\fi\CD@KJ\dimen2\dimen3\CD@dG{%
+\dimen2}\CD@hJ\multiply\CD@TC-6 \dimen0\dimen2 \CD@ZG1\CD@ZG{0.3}\dimen1%
+\dimen0 \dimen2\dimen3 \dimen0\dimen3 \CD@ZG3\CD@ZG{1.5}\CD@ZG{0.3}\divide
+\count@2 \CD@gE\multiply\dimen1\m@ne\fi\ifodd\count@\dimen2\dimen1\dimen1%
+\dimen0\dimen0-\dimen2 \fi\divide\count@2 \ifodd\count@\multiply\dimen0\m@ne
+\multiply\dimen1\m@ne\fi\global\CD@QA\dimen0\global\CD@RA\dimen1\endgroup
+\dimen6\CD@QA\dimen7\CD@RA}\def\CD@OC{255}\let\CD@OG\CD@OC\def\CD@KJ{%
+\begingroup\ifdim\dimen7<\dimen6 \dimen9\dimen7\dimen7\dimen6\dimen6\dimen9%
+\CD@@A\else\CD@y\fi\dimen2\z@\dimen3\CD@XH\dimen4\CD@XH\dimen0\z@\dimen8=%
+\CD@OG\CD@XH\CD@lC\global\CD@yA\dimen\CD@gE0\else3\fi\global\CD@zA\dimen
+\CD@gE3\else0\fi\endgroup\CD@LH\CD@yA\CD@TC\CD@zA}\def\CD@lC{\count@\dimen6
+\divide\count@\dimen7 \advance\dimen6-\count@\dimen7 \dimen9\dimen4 \advance
+\dimen9\count@\dimen0 \ifdim\dimen9>\dimen8 \CD@@C\else\CD@AC\ifdim\dimen6>%
+\z@\dimen9\dimen6 \dimen6\dimen7 \dimen7\dimen9 \expandafter\expandafter
+\expandafter\CD@lC\fi\fi}\def\CD@@C{\ifdim\dimen0=\z@\ifdim\dimen9<2\dimen8
+\dimen0\dimen8 \fi\else\advance\dimen8-\dimen4 \divide\dimen8\dimen0 \ifdim
+\count@\CD@XH<2\dimen8 \count@\dimen8 \dimen9\dimen4 \advance\dimen9\count@
+\dimen0 \CD@AC\fi\fi}\def\CD@AC{\dimen4\dimen0 \dimen0\dimen9 \advance\dimen2%
+\count@\dimen3 \dimen9\dimen2 \dimen2\dimen3 \dimen3\dimen9 }\def\CD@ZG#1{%
+\CD@dG{\dimen2}\advance\dimen0 #1\dimen2 }\def\CD@dG#1{\divide#1\CD@TC
+\multiply#1\CD@LH}\def\CD@eG#1{\divide#1\CD@vA\multiply#1\CD@uA}\def\CD@iC#1{%
+\divide#1\CD@LH\multiply#1\CD@TC}\def\CD@hJ{\dimen6\CD@LH\CD@XH\multiply
+\dimen6\CD@LH\dimen7\CD@TC\CD@XH\multiply\dimen7\CD@TC\CD@KJ}\def\CD@iK#1#2{%
+\begingroup\dimen@#2\relax\loop\ifdim\dimen2<.4\maxdimen\multiply\dimen2\tw@
+\multiply\dimen@\tw@\repeat\divide\dimen2\@cclvi\divide\dimen@\dimen2\relax
+\multiply\dimen@\@cclvi\expandafter\CD@jK\the\dimen@\endgroup\let#1\CD@fK}{%
+\catcode\lq p=12 \catcode\lq0=12 \catcode\lq.=12 \catcode\lq t=12 \gdef\CD@jK
+#1pt{\gdef\CD@fK{#1}}}\ifx\errorcontextlines\undefined\CD@tJ\let\CD@GH\relax
+\else\def\CD@GH{\errorcontextlines\m@ne}\fi\ifnum\inputlineno<0 \let\CD@CD
+\empty\let\CD@W\empty\let\CD@mD\relax\let\CD@uI\relax\let\CD@vI\relax\let
+\CD@zF\relax\message{! Why not upgrade to TeX version 3? (available since 1990%
+)}\else\def\CD@W{ at line \number\inputlineno}\def\CD@mD{ - first occurred}%
+\def\CD@uI{\edef\CD@h{\the\inputlineno}\global\let\CD@jB\CD@h}\def\CD@h{9999}%
+\def\CD@vI{\xdef\CD@jB{\the\inputlineno}}\def\CD@jB{\CD@h}\def\CD@zF{\ifnum
+\CD@h<\inputlineno\edef\CD@CD{\space at lines \CD@h--\the\inputlineno}\else
+\edef\CD@CD{\CD@W}\fi}\fi\let\CD@CD\empty\def\CD@YA#1#2{\CD@GH\errhelp=#2%
+\expandafter\errmessage{\CD@tA: #1}}\def\CD@KB#1{\begingroup\expandafter
+\message{! \CD@tA: #1\CD@CD}\ifnum\CD@XB>\CD@NB\ifnum\CD@CA>\CD@NB\else\ifnum
+\CD@lA>\CD@FA\else\ifnum\CD@LB>\CD@FA\advance\CD@XB-\CD@NB\advance\CD@FA-%
+\CD@lA\advance\CD@FA1\relax\expandafter\message{! (error detected at row \the
+\CD@XB, column \the\CD@FA, but probably caused elsewhere)}\fi\fi\fi\fi
+\endgroup}\def\CD@gB#1{{\expandafter\message{\CD@tA\space Warning: #1\CD@W}}}%
+\def\CD@CB#1#2{\CD@gB{#1 \string#2 is obsolete\CD@mD}}\def\CD@AB#1{\CD@CB{%
+Dimension}{#1}\CD@DE#1\CD@BB\CD@BB}\def\CD@BB{\CD@OA=}\def\CD@@B#1{\CD@CB{%
+Count}{#1}\CD@DE#1\CD@OH\CD@OH}\def\CD@OH{\count@=}\def\HorizontalMapLength{%
+\CD@AB\HorizontalMapLength}\def\VerticalMapHeight{\CD@AB\VerticalMapHeight}%
+\def\VerticalMapDepth{\CD@AB\VerticalMapDepth}\def\VerticalMapExtraHeight{%
+\CD@AB\VerticalMapExtraHeight}\def\VerticalMapExtraDepth{\CD@AB
+\VerticalMapExtraDepth}\def\DiagonalLineSegments{\CD@@B\DiagonalLineSegments}%
+\ifx\tenln\nullfont\CD@ZA\CD@KH{\CD@eF\space diagonal line and arrow font not
+available}\else\let\CD@KH\relax\fi\def\CD@aG#1#2<#3:#4:#5#6{\begingroup\CD@PA
+#3\relax\advance\CD@PA-#2\relax\ifdim.1em<\CD@PA\CD@uA#5\relax\CD@vA#6\relax
+\ifnum\CD@uA<\CD@vA\count@\CD@vA\advance\count@-\CD@uA\CD@KB{#4 by \the\CD@PA
+}\if#1v\let\CD@CH\CD@JK\edef\tmp{\the\CD@uA--\the\CD@vA,\the\CD@FA}\else
+\advance\count@\count@\if#1l\advance\count@-\CD@A\else\if#1r\advance\count@
+\CD@A\fi\fi\advance\CD@PA\CD@PA\let\CD@CH\CD@ZE\edef\tmp{\the\CD@NB,\the
+\CD@uA--\the\CD@vA}\fi\divide\CD@PA\count@\ifdim\CD@CH<\CD@PA\global\CD@CH
+\CD@PA\fi\fi\fi\endgroup}\CD@tG\CD@xE\CD@JD\CD@ID\CD@rG\CD@xI{See the message
+above.}\CD@rG\CD@lH{Perhaps you've forgotten to end the diagram before
+resuming the text, in\CD@uG which case some garbage may be added to the
+diagram, but we should be ok now.\CD@uG Alternatively you've left a blank line
+in the middle - TeX will now complain\CD@uG that the remaining \CD@S s are
+misplaced - so please use comments for layout.}\CD@rG\CD@hD{You have already
+closed too many brace pairs or environments; an \CD@HD\CD@uG command was (%
+over)due.}\CD@rG\CD@hH{\CD@dC\space and \CD@HD\space commands must match.}%
+\def\CD@jH{\ifnum\inputlineno=0 \else\expandafter\CD@iH\fi}\def\CD@iH{\CD@MD
+\CD@GD\crcr\CD@YA{missing \CD@HD\space inserted before \CD@kH- type "h"}%
+\CD@lH\enddiagram\CD@AG\CD@kH\par}\def\CD@AG#1{\edef\enddiagram{\noexpand
+\CD@rD{#1\CD@W}}}\def\CD@rD#1{\CD@YA{\CD@HD\space(anticipated by #1) ignored}%
+\CD@xI\let\enddiagram\CD@SG}\def\CD@SG{\CD@YA{misplaced \CD@HD\space ignored}%
+\CD@hH}\def\CD@mC{\CD@YA{missing \CD@HD\space inserted.}\CD@hD\CD@AG{closing
+group}}\ifx\DeclareOption\undefined\else\ifx\DeclareOption\@notprerr\else
+\DeclareOption*{\let\CD@N\relax\let\CD@DH\relax\expandafter\CD@@E
+\CurrentOption,}\fi\fi
+%%======================================================================%
+%% %
+%% (22) AUXILLARY MACROS FOR ADJUSTMENT OF COMPONENTS %
+%% %
+%%======================================================================%
+
+%% NOTE: The recommended way of defining arrow commands is now
+%% \newarrow{Name}{tail}{filler}{middle}{filler}{head}
+%% which defines \rName, \lName, \dName and \uName using arrow parts which
+%% have themselves previously been defined using the commands
+%% \newarrowtail, \newarrowfiller, \newarrowmiddle and \newarrowhead.
+
+%% The components \rhvee etc have been retained for the time being, as an
+%% intermediate stage and to continue to support the old \HorizontalMap and
+%% \VerticalMap commands, but you should not rely on the continued existence
+%% of these macros.
+
+%% The various components usually need some correction
+%% - longitudinally, ie to prevent gaps and overprints with the shaft,
+%% - transversally, ie to prevent "steps" in the junction with the shaft.
+%% The former can be done safely ad hoc, eg with \mkern1mu.
+%% The latter are now done with the macros \scriptaxis, \boldscriptaxis,
+%% \shifthook and \raisehook, which include pixel corrections.
+
+%% Please note that these and the other auxillary macros which follow are
+%% interim. When it becomes clear exactly what kinds of adjustments are
+%% needed for characters, this job will be done by a suitable extension
+%% to the language of \newarrowhead, etc. If you have any other ideas for
+%% transformations of general use please tell me.
+
+%% By all means experiment with other characters for arrowheads, but
+%% please, in your own interests, do not rely on macros like \rhvee,
+%% send me a copy of your definitions for distribution to other users
+%% in this file, and keep track of where your efforts get copied so
+%% that they can be replaced with the "official" version when it is
+%% incorporated.
+
+%% ***** DONT use macros with mangled names like \Cd@gH. *****
+
+\catcode\lq\$=3 %% make sure that $ means maths-shift
+\def\vboxtoz{\vbox to\z@}%% \z@ is in plain TeX and means 0pt
+
+%% print #1 in \scriptstyle, adjusting for the maths axis height
+\def\scriptaxis#1{\@scriptaxis{$\scriptstyle#1$}}%%
+\def\ssaxis#1{\@ssaxis{$\scriptscriptstyle#1$}}%%
+\def\@scriptaxis#1{\dimen0\axisheight\advance\dimen0-\ss@axisheight\raise
+\dimen0\hbox{#1}}\def\@ssaxis#1{\dimen0\axisheight\advance\dimen0-%
+\ss@axisheight\raise\dimen0\hbox{#1}}
+
+%% Some of the characters would look better in bold since they're
+%% taken from sub/superscript fonts; we use LaTeX's \boldmath to
+%% do this, defining this to do nothing if it doesn't exist.
+%% With the old LaTeX font selection at other than 10pt you may still
+%% get nothing happenning. Also, PK fonts may be missing.
+%% If you have problems, DONT use boldhook or boldlittlevee.
+\ifx\boldmath\undefined%%
+\let\boldscriptaxis\scriptaxis%%
+\def\boldscript#1{\hbox{$\scriptstyle#1$}}%%
+\def\boldscriptscript#1{\hbox{$\scriptscriptstyle#1$}}%%
+\else\def\boldscriptaxis#1{\@scriptaxis{\boldmath$\scriptstyle#1$}}%%
+\def\boldscript#1{\hbox{\boldmath$\scriptstyle#1$}}%%
+\def\boldscriptscript#1{\hbox{\boldmath$\scriptscriptstyle#1$}}%%
+\fi
+
+%% #1= {} or \boldmath; #2= + or -; #3=\subset or \supset
+\def\raisehook#1#2#3{\hbox{\setbox3=\hbox{#1$\scriptscriptstyle#3$}%
+%% the character to use
+\dimen0\ss@axisheight%% \scriptscriptstyle axis height
+\dimen1\axisheight\advance\dimen1-\dimen0%% difference in axis heights
+\dimen2\ht3\advance\dimen2-\dimen0%
+%% height of char above axis (half spread)
+\advance\dimen2-0.021em\advance\dimen1 #2\dimen2%
+%% shift = axis_difference +/- half_spread
+\raise\dimen1\box3}}%% print the character
+%% Mark Dawson suggested using the width
+\def\shifthook#1#2#3{\setbox1=\hbox{#1$\scriptscriptstyle#3$}\dimen0\wd1%
+\divide\dimen0 12\CD@zH{\dimen0}%% "u"
+\dimen1\wd1\advance\dimen1-2\dimen0 \advance\dimen1-2\CD@oI\CD@zH{\dimen1}%
+\kern#2\dimen1\box1}%% print
+
+%% use the extension font (cmex) for double vertical arrows
+\def\@cmex{\mathchar"03}%%ascii double quote
+
+%% ************* P U L L B A C K S ************
+
+%% These will probably be replaced by something less ad hoc
+%% in a future version.
+
+\def\make@pbk#1{\setbox\tw@\hbox to\z@{#1}\ht\tw@\z@\dp\tw@\z@\box\tw@}\def
+\CD@fH#1{\overprint{\hbox to\z@{#1}}}\def\CD@qH{\kern0.11em}\def\CD@pH{\kern0%
+.35em}
+
+%% This is a hack for my book ``Practical Foundations of Mathematics''
+%% and WILL NOT BE SUPPORTED --- DO NOT USE IT!
+\def\dblvert{\def\CD@rH{\kern.5\PileSpacing}}\def\CD@rH{}
+
+\def\SEpbk{\make@pbk{\CD@qH\CD@rH\vrule depth 2.87ex height -2.75ex width 0.%
+95em \vrule height -0.66ex depth 2.87ex width 0.05em \hss}}
+
+\def\SWpbk{\make@pbk{\hss\vrule height -0.66ex depth 2.87ex width 0.05em
+\vrule depth 2.87ex height -2.75ex width 0.95em \CD@qH\CD@rH}}
+
+\def\NEpbk{\make@pbk{\CD@qH\CD@rH\vrule depth -3.81ex height 4.00ex width 0.%
+95em \vrule height 4.00ex depth -1.72ex width 0.05em \hss}}
+
+\def\NWpbk{\make@pbk{\hss\vrule height 4.00ex depth -1.72ex width 0.05em
+\vrule depth -3.81ex height 4.00ex width 0.95em \CD@qH\CD@rH}}
+
+%% Freyd & Scedrov puncture symbol for non-commuting polygon
+\def\puncture{{\setbox0\hbox{A}\vrule height.53\ht0 depth-.47\ht0 width.35\ht
+0 \kern.12\ht0 \vrule height\ht0 depth-.65\ht0 width.06\ht0 \kern-.06\ht0
+\vrule height.35\ht0 depth0pt width.06\ht0 \kern.12\ht0 \vrule height.53\ht0
+depth-.47\ht0 width.35\ht0 }}
+
+%% 2-cells: (24.11.95)
+%%% \NEclck puts a clockwise (ie southeast) arrow to the northwest of cell etc
+\def\NEclck{\overprint{\raise2.5ex\rlap{ \CD@rH$\scriptstyle\searrow$}}}%%
+\def\NEanti{\overprint{\raise2.5ex\rlap{ \CD@rH$\scriptstyle\nwarrow$}}}%%
+\def\NWclck{\overprint{\raise2.5ex\llap{$\scriptstyle\nearrow$ \CD@rH}}}%%
+\def\NWanti{\overprint{\raise2.5ex\llap{$\scriptstyle\swarrow$ \CD@rH}}}%%
+\def\SEclck{\overprint{\lower1ex\rlap{ \CD@rH$\scriptstyle\swarrow$}}}%%
+\def\SEanti{\overprint{\lower1ex\rlap{ \CD@rH$\scriptstyle\nearrow$}}}%%
+\def\SWclck{\overprint{\lower1ex\llap{$\scriptstyle\nwarrow$ \CD@rH}}}%%
+\def\SWanti{\overprint{\lower1ex\llap{$\scriptstyle\searrow$ \CD@rH}}}
+
+%%======================================================================%
+%% %
+%% (23) BITS OF ARROWS %
+%% %
+%%======================================================================%
+
+%% ********** H E A D S ***********
+
+%% \diagramstyle[heads=xxx] defines {>} as {xxx} where xxx
+%% has been defined by \newarrowhead{xxx} and \newarrowtail{xxx}
+
+%% vee head
+\def\rhvee{\mkern-10mu\greaterthan}%%
+\def\lhvee{\lessthan\mkern-10mu}%%
+\def\dhvee{\vboxtoz{\vss\hbox{$\vee$}\kern0pt}}%%
+\def\uhvee{\vboxtoz{\hbox{$\wedge$}\vss}}%%
+\newarrowhead{vee}\rhvee\lhvee\dhvee\uhvee
+
+%% little vee head
+\def\dhlvee{\vboxtoz{\vss\hbox{$\scriptstyle\vee$}\kern0pt}}%%
+\def\uhlvee{\vboxtoz{\hbox{$\scriptstyle\wedge$}\vss}}%%
+\newarrowhead{littlevee}{\mkern1mu\scriptaxis\rhvee}{\scriptaxis\lhvee}%
+\dhlvee\uhlvee\ifx\boldmath\undefined%%
+\newarrowhead{boldlittlevee}{\mkern1mu\scriptaxis\rhvee}{\scriptaxis\lhvee}%
+\dhlvee\uhlvee\else%%
+\def\dhblvee{\vboxtoz{\vss\boldscript\vee\kern0pt}}%%
+\def\uhblvee{\vboxtoz{\boldscript\wedge\vss}}%%
+\newarrowhead{boldlittlevee}{\mkern1mu\boldscriptaxis\rhvee}{\boldscriptaxis
+\lhvee}\dhblvee\uhblvee%%
+\fi
+
+%% curly vee head (uses AMS symbols fonts)
+\def\rhcvee{\mkern-10mu\succ}%%
+\def\lhcvee{\prec\mkern-10mu}%%
+\def\dhcvee{\vboxtoz{\vss\hbox{$\curlyvee$}\kern0pt}}%%
+\def\uhcvee{\vboxtoz{\hbox{$\curlywedge$}\vss}}%%
+\newarrowhead{curlyvee}\rhcvee\lhcvee\dhcvee\uhcvee
+
+%% double vee head %% will probably be withdrawn later
+\def\rhvvee{\mkern-13mu\gg}%% 24.8.92 changed 10mu to 13mu
+\def\lhvvee{\ll\mkern-13mu}%% to make rule go through
+\def\dhvvee{\vboxtoz{\vss\hbox{$\vee$}\kern-.6ex\hbox{$\vee$}\kern0pt}}%%
+\def\uhvvee{\vboxtoz{\hbox{$\wedge$}\kern-.6ex \hbox{$\wedge$}\vss}}%%
+\newarrowhead{doublevee}\rhvvee\lhvvee\dhvvee\uhvvee
+
+%% open and closed triangles (uses AMS symbols fonts)
+\def\triangleup{{\scriptscriptstyle\bigtriangleup}}%%
+\def\littletriangledown{{\scriptscriptstyle\triangledown}}%% AMS
+\def\rhtriangle{\triangleright\mkern1.2mu}%% 29.1.93
+\def\lhtriangle{\triangleleft\mkern.8mu}%%
+\def\uhtriangle{\vbox{\kern-.2ex \hbox{$\scriptscriptstyle\bigtriangleup$}%
+\kern-.25ex}}%%
+%% Changed \scriptstyle\triangledown to \scriptscriptstyle\bigtriangledown
+%% at the suggestion of Martin Hofmann (25.11.92) to avoid using AMS symbols
+%% and also for compatibility with upward arrow.
+\def\dhtriangle{\vbox{\kern-.28ex \hbox{$\scriptscriptstyle\bigtriangledown$}%
+\kern-.1ex}}%% 15.1.93 from -.25ex
+\def\dhblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\blacktriangledown$}}}%
+%% AMS
+\def\uhblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\blacktriangle$}}}%
+%% AMS
+\def\dhlblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\scriptstyle
+\blacktriangledown$}}}%% AMS
+\def\uhlblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\scriptstyle
+\blacktriangle$}}}%% AMS
+\newarrowhead{triangle}\rhtriangle\lhtriangle\dhtriangle\uhtriangle
+\newarrowhead{blacktriangle}{\mkern-1mu\blacktriangleright\mkern.4mu}{%
+\blacktriangleleft}\dhblack\uhblack\newarrowhead{littleblack}{\mkern-1mu%
+\scriptaxis\blacktriangleright}{\scriptaxis\blacktriangleleft\mkern-2mu}%
+\dhlblack\uhlblack
+
+%% LaTeX arrowheads
+\def\rhla{\hbox{\setbox0=\lnchar55\dimen0=\wd0\kern-.6\dimen0\ht0\z@\raise
+\axisheight\box0\kern.1\dimen0}}%%
+\def\lhla{\hbox{\setbox0=\lnchar33\dimen0=\wd0\kern.05\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.5\dimen0}}%%
+\def\dhla{\vboxtoz{\vss\rlap{\lnchar77}}}%%
+\def\uhla{\vboxtoz{\setbox0=\lnchar66 \wd0\z@\kern-.15\ht0\box0\vss}}%% 1/93
+\newarrowhead{LaTeX}\rhla\lhla\dhla\uhla
+
+%% double LaTeX arrowheads %% will probably be withdrawn later
+\def\lhlala{\lhla\kern.3em\lhla}%%
+\def\rhlala{\rhla\kern.3em\rhla}%%
+\def\uhlala{\hbox{\uhla\raise-.6ex\uhla}}%%
+\def\dhlala{\hbox{\dhla\lower-.6ex\dhla}}%%
+\newarrowhead{doubleLaTeX}\rhlala\lhlala\dhlala\uhlala
+
+%% circles % \rho is a Greek letter!
+\def\hhO{\scriptaxis\bigcirc\mkern.4mu} \def\hho{{\circ}\mkern1.2mu}%
+\newarrowhead{o}\hho\hho\circ\circ%%
+\newarrowhead{O}\hhO\hhO{\scriptstyle\bigcirc}{\scriptstyle\bigcirc}%%
+
+%% crosses
+\def\rhtimes{\mkern-5mu{\times}\mkern-.8mu}\def\lhtimes{\mkern-.8mu{\times}%
+\mkern-5mu}\def\uhtimes{\setbox0=\hbox{$\times$}\ht0\axisheight\dp0-\ht0%
+\lower\ht0\box0 }\def\dhtimes{\setbox0=\hbox{$\times$}\ht0\axisheight\box0 }%
+\newarrowhead{X}\rhtimes\lhtimes\dhtimes\uhtimes\newarrowhead+++++
+
+%% empty head {} is also available
+
+%% Y from stmaryrd (vertical ones still need large adjustment)
+\newarrowhead{Y}{\mkern-3mu\Yright}{\Yleft\mkern-3mu}\Yup\Ydown
+
+%% ********** H E A D S with S H A F T S ***********
+
+%% little arrow with shaft
+\newarrowhead{->}\rightarrow\leftarrow\downarrow\uparrow
+
+%% arrow with double shaft
+%%\newarrowhead{=>}\Rightarrow\Leftarrow\Downarrow\Uparrow
+\newarrowhead{=>}\Rightarrow\Leftarrow{\@cmex7F}{\@cmex7E}
+
+%% harpoon with shaft (trailing up/left can be changed to down/right)
+\newarrowhead{harpoon}\rightharpoonup\leftharpoonup\downharpoonleft
+\upharpoonleft
+
+%% little double-headed arrow with shaft (uses AMS symbols fonts)
+\def\twoheaddownarrow{\rlap{$\downarrow$}\raise-.5ex\hbox{$\downarrow$}}%%
+\def\twoheaduparrow{\rlap{$\uparrow$}\raise.5ex\hbox{$\uparrow$}}%%
+\newarrowhead{->>}\twoheadrightarrow\twoheadleftarrow\twoheaddownarrow
+\twoheaduparrow
+
+%% ********** T A I L S ***********
+
+%% vee tail
+\def\rtvee{\greaterthan}%%
+\def\ltvee{\mkern-1mu{\lessthan}\mkern.4mu}%% \mkern added 15.1.93
+\def\dtvee{\vee}%%
+\def\utvee{\wedge}%%
+\newarrowtail{vee}\greaterthan\ltvee\vee\wedge
+
+%% little vee tail
+\newarrowtail{littlevee}{\scriptaxis\greaterthan}{\mkern-1mu\scriptaxis
+\lessthan}{\scriptstyle\vee}{\scriptstyle\wedge}\ifx\boldmath\undefined
+\newarrowtail{boldlittlevee}{\scriptaxis\greaterthan}{\mkern-1mu\scriptaxis
+\lessthan}{\scriptstyle\vee}{\scriptstyle\wedge}\else\newarrowtail{%
+boldlittlevee}{\boldscriptaxis\greaterthan}{\mkern-1mu\boldscriptaxis
+\lessthan}{\boldscript\vee}{\boldscript\wedge}\fi
+
+%% curly vee tail (uses AMS symbols fonts)
+\newarrowtail{curlyvee}\succ{\mkern-1mu{\prec}\mkern.4mu}\curlyvee\curlywedge
+
+%% open and closed triangle tails (uses AMS symbols fonts)
+\def\rttriangle{\mkern1.2mu\triangleright}%% 29.1.93
+\newarrowtail{triangle}\rttriangle\lhtriangle\dhtriangle\uhtriangle
+\newarrowtail{blacktriangle}\blacktriangleright{\mkern-1mu\blacktriangleleft
+\mkern.4mu}\dhblack\uhblack\newarrowtail{littleblack}{\scriptaxis
+\blacktriangleright\mkern-2mu}{\mkern-1mu\scriptaxis\blacktriangleleft}%
+\dhlblack\uhlblack
+
+%% LaTeX tails
+\def\rtla{\hbox{\setbox0=\lnchar55\dimen0=\wd0\kern-.5\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.2\dimen0}}%%
+\def\ltla{\hbox{\setbox0=\lnchar33\dimen0=\wd0\kern-.15\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.5\dimen0}}%%
+\def\dtla{\vbox{\setbox0=\rlap{\lnchar77}\dimen0=\ht0\kern-.7\dimen0\box0%
+\kern-.1\dimen0}}%% 15.1.93 from -.6
+\def\utla{\vbox{\setbox0=\rlap{\lnchar66}\dimen0=\ht0\kern-.1\dimen0\box0%
+\kern-.6\dimen0}}%%
+\newarrowtail{LaTeX}\rtla\ltla\dtla\utla
+
+%% double vee tail %% will probably be withdrawn later
+\def\rtvvee{\gg\mkern-3mu}%%
+\def\ltvvee{\mkern-3mu\ll}%%
+\def\dtvvee{\vbox{\hbox{$\vee$}\kern-.6ex \hbox{$\vee$}\vss}}%%
+\def\utvvee{\vbox{\vss\hbox{$\wedge$}\kern-.6ex \hbox{$\wedge$}\kern\z@}}%%
+\newarrowtail{doublevee}\rtvvee\ltvvee\dtvvee\utvvee
+
+%% double LaTeX tails %% will probably be withdrawn later
+\def\ltlala{\ltla\kern.3em\ltla}%%
+\def\rtlala{\rtla\kern.3em\rtla}%%
+\def\utlala{\hbox{\utla\raise-.6ex\utla}}%%
+\def\dtlala{\hbox{\dtla\lower-.6ex\dtla}}%%
+\newarrowtail{doubleLaTeX}\rtlala\ltlala\dtlala\utlala
+
+%% bar (as in \mapsto)
+\def\utbar{\vrule height 0.093ex depth0pt width 0.4em}%%
+\let\dtbar\utbar%%
+\def\rtbar{\mkern1.5mu\vrule height 1.1ex depth.06ex width .04em\mkern1.5mu}%
+%%
+\let\ltbar\rtbar%%
+\newarrowtail{mapsto}\rtbar\ltbar\dtbar\utbar%%
+\newarrowtail{|}\rtbar\ltbar\dtbar\utbar%%ascii vertical bar (|)
+
+%% hooks (as in \into): choice of after/above and before/below
+
+\def\rthooka{\raisehook{}+\subset\mkern-1mu}%%
+\def\lthooka{\mkern-1mu\raisehook{}+\supset}%%
+\def\rthookb{\raisehook{}-\subset\mkern-2mu}%%
+\def\lthookb{\mkern-1mu\raisehook{}-\supset}%%
+
+\def\dthooka{\shifthook{}+\cap}%%
+\def\dthookb{\shifthook{}-\cap}%%
+\def\uthooka{\shifthook{}+\cup}%%
+\def\uthookb{\shifthook{}-\cup}%%
+
+\newarrowtail{hooka}\rthooka\lthooka\dthooka\uthooka\newarrowtail{hookb}%
+\rthookb\lthookb\dthookb\uthookb
+
+\ifx\boldmath\undefined\newarrowtail{boldhooka}\rthooka\lthooka\dthooka
+\uthooka\newarrowtail{boldhookb}\rthookb\lthookb\dthookb\uthookb\newarrowtail
+{boldhook}\rthooka\lthooka\dthookb\uthooka\else\def\rtbhooka{\raisehook
+\boldmath+\subset\mkern-1mu}%%
+\def\ltbhooka{\mkern-1mu\raisehook\boldmath+\supset}%%
+\def\rtbhookb{\raisehook\boldmath-\subset\mkern-2mu}%%
+\def\ltbhookb{\mkern-1mu\raisehook\boldmath-\supset}%%
+\def\dtbhooka{\shifthook\boldmath+\cap}%%
+\def\dtbhookb{\shifthook\boldmath-\cap}%%
+\def\utbhooka{\shifthook\boldmath+\cup}%%
+\def\utbhookb{\shifthook\boldmath-\cup}%%
+\newarrowtail{boldhooka}\rtbhooka\ltbhooka\dtbhooka\utbhooka\newarrowtail{%
+boldhookb}\rtbhookb\ltbhookb\dtbhookb\utbhookb\newarrowtail{boldhook}%
+\rtbhooka\ltbhooka\dtbhooka\utbhooka\fi
+
+%% square-ended hooks (used for closed subsets in ``lifting and gluing'')
+\def\dtsqhooka{\shifthook{}+\sqcap}%%
+\def\dtsqhookb{\shifthook{}-\sqcap}%%
+\def\ltsqhooka{\mkern-1mu\raisehook{}+\sqsupset}%%
+\def\ltsqhookb{\mkern-1mu\raisehook{}-\sqsupset}%%
+\def\rtsqhooka{\raisehook{}+\sqsubset\mkern-1mu}%%
+\def\rtsqhookb{\raisehook{}-\sqsubset\mkern-2mu}%%
+\def\utsqhooka{\shifthook{}+\sqcup}%%
+\def\utsqhookb{\shifthook{}-\sqcup}%%
+\newarrowtail{sqhook}\rtsqhooka\ltsqhooka\dtsqhooka\utsqhooka
+
+%% the following seem the better choices at 10pt & 300dpi
+\newarrowtail{hook}\rthooka\lthookb\dthooka\uthooka\newarrowtail{C}\rthooka
+\lthookb\dthooka\uthooka
+
+%% circles
+\newarrowtail{o}\hho\hho\circ\circ%%
+\newarrowtail{O}\hhO\hhO{\scriptstyle\bigcirc}{\scriptstyle\bigcirc}%%
+
+%% crosses
+\newarrowtail{X}\lhtimes\rhtimes\uhtimes\dhtimes\newarrowtail+++++
+
+%% empty tail {} is also available
+
+%% Y from stmaryrd (vertical ones still need adjustment)
+\newarrowtail{Y}\Yright\Yleft\Yup\Ydown
+
+%% harpoon with shaft (trailing up/left can be changed to down/right)
+\newarrowtail{harpoon}\leftharpoondown\rightharpoondown\upharpoonright
+\downharpoonright
+
+%% ********** F I L L E R S ***********
+
+%% shortening is up to 0.15em=2.7mu horiz and 0.35ex vertically at each end.
+
+%% dot {.}, single rule {-} and empty {} fillers are also available
+
+%% double and triple lines
+%%\newarrowfiller{=}==\Vert\Vert%%
+\newarrowfiller{=}=={\@cmex77}{\@cmex77}%% 16.1.93
+\def\vfthree{\mid\!\!\!\mid\!\!\!\mid}%%ascii
+\newarrowfiller{3}\equiv\equiv\vfthree\vfthree
+
+%% dashed line
+\def\vfdashstrut{\vrule width0pt height1.3ex depth0.7ex}%%
+\def\vfthedash{\vrule width\CD@LF height0.6ex depth 0pt}%%
+\def\hfthedash{\CD@AJ\vrule\horizhtdp width 0.26em}%%
+\def\hfdash{\mkern5.5mu\hfthedash\mkern5.5mu}%%
+\def\vfdash{\vfdashstrut\vfthedash}%%
+\newarrowfiller{dash}\hfdash\hfdash\vfdash\vfdash
+
+%% ************* M I D D L E S ************
+
+%% plus
+\newarrowmiddle+++++
+
+%% ************* D I A G O N A L S ************
+
+%% simple arrow heads
+%%\def\nwhTO{\nwarrow\mkern-1mu}%%
+%%\def\nehTO{\mkern-.1mu\nearrow}%%
+%%\def\sehTO{\searrow\mkern-.02mu}%%
+%%\def\swhTO{\mkern-.8mu\swarrow}%%
+
+%%======================================================================%
+%% %
+%% (24) ARROW COMMANDS %
+%% %
+%%======================================================================%
+
+%% change to \iftrue to get mixed heads
+\iffalse%%
+\newarrow{To}----{vee}%%
+\newarrow{Arr}----{LaTeX}%%
+\newarrow{Dotsto}....{vee}%%
+\newarrow{Dotsarr}....{LaTeX}%%
+\newarrow{Dashto}{}{dash}{}{dash}{vee}%%
+\newarrow{Dasharr}{}{dash}{}{dash}{LaTeX}%%
+\newarrow{Mapsto}{mapsto}---{vee}%%
+\newarrow{Mapsarr}{mapsto}---{LaTeX}%%
+\newarrow{IntoA}{hooka}---{vee}%%
+\newarrow{IntoB}{hookb}---{vee}%%
+\newarrow{Embed}{vee}---{vee}%%
+\newarrow{Emarr}{LaTeX}---{LaTeX}%%
+\newarrow{Onto}----{doublevee}%%
+\newarrow{Dotsonarr}....{doubleLaTeX}%%
+\newarrow{Dotsonto}....{doublevee}%%
+\newarrow{Dotsonarr}....{doubleLaTeX}%%
+\else%%
+\newarrow{To}---->%%
+\newarrow{Arr}---->%%
+\newarrow{Dotsto}....>%%
+\newarrow{Dotsarr}....>%%
+\newarrow{Dashto}{}{dash}{}{dash}>%%
+\newarrow{Dasharr}{}{dash}{}{dash}>%%
+\newarrow{Mapsto}{mapsto}--->%%
+\newarrow{Mapsarr}{mapsto}--->%%
+\newarrow{IntoA}{hooka}--->%%
+\newarrow{IntoB}{hookb}--->%%
+\newarrow{Embed}>--->%%
+\newarrow{Emarr}>--->%%
+\newarrow{Onto}----{>>}%%
+\newarrow{Dotsonarr}....{>>}%%
+\newarrow{Dotsonto}....{>>}%%
+\newarrow{Dotsonarr}....{>>}%%
+\fi%%
+
+\newarrow{Implies}===={=>}%% minimum cell height 9.5pt
+\newarrow{Project}----{triangle}%%
+\newarrow{Pto}----{harpoon}%% partial function
+\newarrow{Relto}{harpoon}---{harpoon}%% binary relation
+
+\newarrow{Eq}=====%%
+\newarrow{Line}-----%%
+\newarrow{Dots}.....%%
+\newarrow{Dashes}{}{dash}{}{dash}{}%%
+
+%% square hooked arrow (used in my ``gluing and lifting'' paper)
+\newarrow{SquareInto}{sqhook}--->
+
+%% braces and parentheses
+%% \newarrow gives inappropriate directions, so we change the names
+%% the vertical filler is too far to the right; horizontal too high
+%% the vertical middles are too low with midvshaft
+%% maybe we'll add square brackets and the integral sign one day
+\newarrowhead{cmexbra}{\@cmex7B}{\@cmex7C}{\@cmex3B}{\@cmex38}%%
+\newarrowtail{cmexbra}{\@cmex7A}{\@cmex7D}{\@cmex39}{\@cmex3A}%%
+\newarrowmiddle{cmexbra}{\braceru\bracelu}{\bracerd\braceld}{\vcenter{%
+\hbox@maths{\@cmex3D\mkern-2mu}}}%% right
+{\vcenter{\hbox@maths{\mkern2mu\@cmex3C}}}%% left
+\newarrow{@brace}{cmexbra}-{cmexbra}-{cmexbra}%% braces
+\newarrow{@parenth}{cmexbra}---{cmexbra}%% straight parentheses
+\def\rightBrace{\d@brace[thick,cmex]}%%ASCII square brackets []
+\def\leftBrace{\u@brace[thick,cmex]}%%ASCII square brackets []
+\def\upperBrace{\r@brace[thick,cmex]}%%ASCII square brackets []
+\def\lowerBrace{\l@brace[thick,cmex]}%%ASCII square brackets []
+\def\rightParenth{\d@parenth[thick,cmex]}%%ASCII square brackets []
+\def\leftParenth{\u@parenth[thick,cmex]}%%ASCII square brackets []
+\def\upperParenth{\r@parenth[thick,cmex]}%%ASCII square brackets []
+\def\lowerParenth{\l@parenth[thick,cmex]}%%ASCII square brackets []
+
+%% synonyms for reverse compatibility
+
+\let\uFrom\uTo%%
+\let\lFrom\lTo%%
+\let\uDotsfrom\uDotsto%%
+\let\lDotsfrom\lDotsto%%
+\let\uDashfrom\uDashto%%
+\let\lDashfrom\lDashto%%
+\let\uImpliedby\uImplies%%
+\let\lImpliedby\lImplies%%
+\let\uMapsfrom\uMapsto%%
+\let\lMapsfrom\lMapsto%%
+\let\lOnfrom\lOnto%%
+\let\uOnfrom\uOnto%%
+\let\lPfrom\lPto%%
+\let\uPfrom\uPto%%
+
+\let\uInfromA\uIntoA%%
+\let\uInfromB\uIntoB%%
+\let\lInfromA\lIntoA%%
+\let\lInfromB\lIntoB%%
+\let\rInto\rIntoA%%
+\let\lInto\lIntoA%%
+\let\dInto\dIntoB%%
+\let\uInto\uIntoA%%
+\let\ruInto\ruIntoA%%
+\let\luInto\luIntoA%%
+\let\rdInto\rdIntoA%%
+\let\ldInto\ldIntoA%%
+%%
+\let\hEq\rEq%%
+\let\vEq\uEq%%
+\let\hLine\rLine%%
+\let\vLine\uLine%%
+\let\hDots\rDots%%
+\let\vDots\uDots%%
+\let\hDashes\rDashes%%
+\let\vDashes\uDashes%%
+
+%%=========================================================================%
+%% The following are included for reverse compatibility only.
+%%=========================================================================%
+\let\NW\luTo\let\NE\ruTo\let\SW\ldTo\let\SE\rdTo\def\nNW{\luTo(2,3)}\def\nNE{%
+\ruTo(2,3)}%%ascii
+\def\sSW{\ldTo(2,3)}\def\sSE{\rdTo(2,3)}%%ascii
+\def\wNW{\luTo(3,2)}\def\eNE{\ruTo(3,2)}%%ascii
+\def\wSW{\ldTo(3,2)}\def\eSE{\rdTo(3,2)}%%ascii
+\def\NNW{\luTo(2,4)}\def\NNE{\ruTo(2,4)}%%ascii
+\def\SSW{\ldTo(2,4)}\def\SSE{\rdTo(2,4)}%%ascii
+\def\WNW{\luTo(4,2)}\def\ENE{\ruTo(4,2)}%%ascii
+\def\WSW{\ldTo(4,2)}\def\ESE{\rdTo(4,2)}%%ascii
+\def\NNNW{\luTo(2,6)}\def\NNNE{\ruTo(2,6)}%%ascii
+\def\SSSW{\ldTo(2,6)}\def\SSSE{\rdTo(2,6)}%%ascii
+\def\WWNW{\luTo(6,2)}\def\EENE{\ruTo(6,2)}%%ascii
+\def\WWSW{\ldTo(6,2)}\def\EESE{\rdTo(6,2)}%%ascii
+
+\let\NWd\luDotsto\let\NEd\ruDotsto\let\SWd\ldDotsto\let\SEd\rdDotsto\def\nNWd
+{\luDotsto(2,3)}\def\nNEd{\ruDotsto(2,3)}%%ascii
+\def\sSWd{\ldDotsto(2,3)}\def\sSEd{\rdDotsto(2,3)}%%ascii
+\def\wNWd{\luDotsto(3,2)}\def\eNEd{\ruDotsto(3,2)}%%ascii
+\def\wSWd{\ldDotsto(3,2)}\def\eSEd{\rdDotsto(3,2)}%%ascii
+\def\NNWd{\luDotsto(2,4)}\def\NNEd{\ruDotsto(2,4)}%%ascii
+\def\SSWd{\ldDotsto(2,4)}\def\SSEd{\rdDotsto(2,4)}%%ascii
+\def\WNWd{\luDotsto(4,2)}\def\ENEd{\ruDotsto(4,2)}%%ascii
+\def\WSWd{\ldDotsto(4,2)}\def\ESEd{\rdDotsto(4,2)}%%ascii
+\def\NNNWd{\luDotsto(2,6)}\def\NNNEd{\ruDotsto(2,6)}%%ascii
+\def\SSSWd{\ldDotsto(2,6)}\def\SSSEd{\rdDotsto(2,6)}%%ascii
+\def\WWNWd{\luDotsto(6,2)}\def\EENEd{\ruDotsto(6,2)}%%ascii
+\def\WWSWd{\ldDotsto(6,2)}\def\EESEd{\rdDotsto(6,2)}%%ascii
+
+\let\NWl\luLine\let\NEl\ruLine\let\SWl\ldLine\let\SEl\rdLine\def\nNWl{\luLine
+(2,3)}\def\nNEl{\ruLine(2,3)}%%ascii
+\def\sSWl{\ldLine(2,3)}\def\sSEl{\rdLine(2,3)}%%ascii
+\def\wNWl{\luLine(3,2)}\def\eNEl{\ruLine(3,2)}%%ascii
+\def\wSWl{\ldLine(3,2)}\def\eSEl{\rdLine(3,2)}%%ascii
+\def\NNWl{\luLine(2,4)}\def\NNEl{\ruLine(2,4)}%%ascii
+\def\SSWl{\ldLine(2,4)}\def\SSEl{\rdLine(2,4)}%%ascii
+\def\WNWl{\luLine(4,2)}\def\ENEl{\ruLine(4,2)}%%ascii
+\def\WSWl{\ldLine(4,2)}\def\ESEl{\rdLine(4,2)}%%ascii
+\def\NNNWl{\luLine(2,6)}\def\NNNEl{\ruLine(2,6)}%%ascii
+\def\SSSWl{\ldLine(2,6)}\def\SSSEl{\rdLine(2,6)}%%ascii
+\def\WWNWl{\luLine(6,2)}\def\EENEl{\ruLine(6,2)}%%ascii
+\def\WWSWl{\ldLine(6,2)}\def\EESEl{\rdLine(6,2)}%%ascii
+
+\let\NWld\luDots\let\NEld\ruDots\let\SWld\ldDots\let\SEld\rdDots\def\nNWld{%
+\luDots(2,3)}\def\nNEld{\ruDots(2,3)}%%ascii
+\def\sSWld{\ldDots(2,3)}\def\sSEld{\rdDots(2,3)}%%ascii
+\def\wNWld{\luDots(3,2)}\def\eNEld{\ruDots(3,2)}%%ascii
+\def\wSWld{\ldDots(3,2)}\def\eSEld{\rdDots(3,2)}%%ascii
+\def\NNWld{\luDots(2,4)}\def\NNEld{\ruDots(2,4)}%%ascii
+\def\SSWld{\ldDots(2,4)}\def\SSEld{\rdDots(2,4)}%%ascii
+\def\WNWld{\luDots(4,2)}\def\ENEld{\ruDots(4,2)}%%ascii
+\def\WSWld{\ldDots(4,2)}\def\ESEld{\rdDots(4,2)}%%ascii
+\def\NNNWld{\luDots(2,6)}\def\NNNEld{\ruDots(2,6)}%%ascii
+\def\SSSWld{\ldDots(2,6)}\def\SSSEld{\rdDots(2,6)}%%ascii
+\def\WWNWld{\luDots(6,2)}\def\EENEld{\ruDots(6,2)}%%ascii
+\def\WWSWld{\ldDots(6,2)}\def\EESEld{\rdDots(6,2)}%%ascii
+
+\let\NWe\luEmbed\let\NEe\ruEmbed\let\SWe\ldEmbed\let\SEe\rdEmbed\def\nNWe{%
+\luEmbed(2,3)}\def\nNEe{\ruEmbed(2,3)}%%ascii
+\def\sSWe{\ldEmbed(2,3)}\def\sSEe{\rdEmbed(2,3)}%%ascii
+\def\wNWe{\luEmbed(3,2)}\def\eNEe{\ruEmbed(3,2)}%%ascii
+\def\wSWe{\ldEmbed(3,2)}\def\eSEe{\rdEmbed(3,2)}%%ascii
+\def\NNWe{\luEmbed(2,4)}\def\NNEe{\ruEmbed(2,4)}%%ascii
+\def\SSWe{\ldEmbed(2,4)}\def\SSEe{\rdEmbed(2,4)}%%ascii
+\def\WNWe{\luEmbed(4,2)}\def\ENEe{\ruEmbed(4,2)}%%ascii
+\def\WSWe{\ldEmbed(4,2)}\def\ESEe{\rdEmbed(4,2)}%%ascii
+\def\NNNWe{\luEmbed(2,6)}\def\NNNEe{\ruEmbed(2,6)}%%ascii
+\def\SSSWe{\ldEmbed(2,6)}\def\SSSEe{\rdEmbed(2,6)}%%ascii
+\def\WWNWe{\luEmbed(6,2)}\def\EENEe{\ruEmbed(6,2)}%%ascii
+\def\WWSWe{\ldEmbed(6,2)}\def\EESEe{\rdEmbed(6,2)}%%ascii
+
+\let\NWo\luOnto\let\NEo\ruOnto\let\SWo\ldOnto\let\SEo\rdOnto\def\nNWo{\luOnto
+(2,3)}\def\nNEo{\ruOnto(2,3)}%%ascii
+\def\sSWo{\ldOnto(2,3)}\def\sSEo{\rdOnto(2,3)}%%ascii
+\def\wNWo{\luOnto(3,2)}\def\eNEo{\ruOnto(3,2)}%%ascii
+\def\wSWo{\ldOnto(3,2)}\def\eSEo{\rdOnto(3,2)}%%ascii
+\def\NNWo{\luOnto(2,4)}\def\NNEo{\ruOnto(2,4)}%%ascii
+\def\SSWo{\ldOnto(2,4)}\def\SSEo{\rdOnto(2,4)}%%ascii
+\def\WNWo{\luOnto(4,2)}\def\ENEo{\ruOnto(4,2)}%%ascii
+\def\WSWo{\ldOnto(4,2)}\def\ESEo{\rdOnto(4,2)}%%ascii
+\def\NNNWo{\luOnto(2,6)}\def\NNNEo{\ruOnto(2,6)}%%ascii
+\def\SSSWo{\ldOnto(2,6)}\def\SSSEo{\rdOnto(2,6)}%%ascii
+\def\WWNWo{\luOnto(6,2)}\def\EENEo{\ruOnto(6,2)}%%ascii
+\def\WWSWo{\ldOnto(6,2)}\def\EESEo{\rdOnto(6,2)}%%ascii
+
+\let\NWod\luDotsonto\let\NEod\ruDotsonto\let\SWod\ldDotsonto\let\SEod
+\rdDotsonto\def\nNWod{\luDotsonto(2,3)}\def\nNEod{\ruDotsonto(2,3)}%%ascii
+\def\sSWod{\ldDotsonto(2,3)}\def\sSEod{\rdDotsonto(2,3)}%%ascii
+\def\wNWod{\luDotsonto(3,2)}\def\eNEod{\ruDotsonto(3,2)}%%ascii
+\def\wSWod{\ldDotsonto(3,2)}\def\eSEod{\rdDotsonto(3,2)}%%ascii
+\def\NNWod{\luDotsonto(2,4)}\def\NNEod{\ruDotsonto(2,4)}%%ascii
+\def\SSWod{\ldDotsonto(2,4)}\def\SSEod{\rdDotsonto(2,4)}%%ascii
+\def\WNWod{\luDotsonto(4,2)}\def\ENEod{\ruDotsonto(4,2)}%%ascii
+\def\WSWod{\ldDotsonto(4,2)}\def\ESEod{\rdDotsonto(4,2)}%%ascii
+\def\NNNWod{\luDotsonto(2,6)}\def\NNNEod{\ruDotsonto(2,6)}%%ascii
+\def\SSSWod{\ldDotsonto(2,6)}\def\SSSEod{\rdDotsonto(2,6)}%%ascii
+\def\WWNWod{\luDotsonto(6,2)}\def\EENEod{\ruDotsonto(6,2)}%%ascii
+\def\WWSWod{\ldDotsonto(6,2)}\def\EESEod{\rdDotsonto(6,2)}%%ascii
+
+%%======================================================================%
+%% %
+%% (25) MISCELLANEOUS %
+%% %
+%%======================================================================%
+
+\def\labelstyle{%%
+\ifincommdiag%%
+\textstyle%%
+\else%%
+\scriptstyle%%
+\fi}%%
+\let\objectstyle\displaystyle
+
+\newdiagramgrid{pentagon}{0.618034,0.618034,1,1,1,1,0.618034,0.618034}{1.%
+17557,1.17557,1.902113,1.902113}
+
+\newdiagramgrid{perspective}{0.75,0.75,1.1,1.1,0.9,0.9,0.95,0.95,0.75,0.75}{0%
+.75,0.75,1.1,1.1,0.9,0.9}
+
+\diagramstyle[%%ascii open square bracket
+dpi=300,%% office laserwriters are usually 300 dots per inch
+vmiddle,nobalance,%% vertical and horizontal positioning
+loose,%% allow rows and columns to stretch
+thin,%% line10 arrows; default rule thickness (TeXbook p447)
+pilespacing=10pt,%
+%% parallel vertical separation (horizontals: half this)
+shortfall=4pt,%% distance between arrowheads and their targets
+PostScript=Rokicki,%% default to PostScript not pure DVI
+%% The following are defaulted on entry to the diagram itself.
+%% l>=2em minimum length of horizontal arrow shafts in text
+%% l>=1em ditto in diagrams
+%% size=3em cell size
+%% heads=LaTeX arrowheads
+]%%ascii close square bracket
+
+%% process options to LaTeX2e's \usepackage[options]{diagrams}
+\ifx\ProcessOptions\undefined\else\CD@PK\ProcessOptions\relax\CD@FF\CD@e\fi
+\fi
+
+\cdrestoreat%% restore old category code for @ etc
+%%============================== THE END ==============================
+
+\dimen0 200pt \dimen1 210pt \dimen2 220pt \dimen3 230pt \dimen4 240pt \dimen5
+250pt \dimen6 260pt \dimen7 270pt \dimen8 280pt \dimen9 290pt
+
+%% This is the end of Paul Taylor's commutative diagrams package.
+
diff --git a/macros/generic/diagrams/taylor/V3,91.tex b/macros/generic/diagrams/taylor/V3,91.tex
new file mode 100644
index 0000000000..c5c6ce2f11
--- /dev/null
+++ b/macros/generic/diagrams/taylor/V3,91.tex
@@ -0,0 +1,1917 @@
+% mangletex (24 Nov 1995) run at 17:43 BST Friday 01 September 2006
+\message{===================================================================}%
+\message{< Paul Taylor's commutative diagrams - version 3.91, August 2006 > }%
+%%
+%%
+%% This code runs the LaTeX \ProvidesPackage command iff it is defined.
+%% included at the request of Michael Downes <mjd@ams.org> March 2002.
+%% Put \listfiles in your LaTeX preamble to see what this is for.
+\expandafter\ifx\csname ProvidesPackage\endcsname\relax\toks0=\expandafter{%
+\fi\ProvidesPackage{diagrams}[2006/08/31 v3.91 Paul Taylor's commutative
+diagrams]%%
+\toks0=\bgroup}%%
+%%======================================================================%
+%% TeX macros for drawing category-theoretic diagrams %
+%% %
+%% Paul Taylor %
+%% %
+%% www.ctan.org or www.cs.man.ac.uk/~pt/diagrams %
+%% %
+%% PLEASE READ THE MANUAL! %
+%% %
+%% Please ensure that you are registered with me as a user so that %
+%% you can be informed of future releases. Any electronic mail %
+%% message with "commutative" or "diagram" in the subject line %
+%% (such as your request for the package, a question about it, or %
+%% even an otherwise blank message) automatically registers you. %
+%% %
+%% %
+%% CONTENTS: %
+%% (O) corruption-sensitive hacks (to approx line 328) %
+%% Arrow components & commands - starts approx line 1240 %
+%% (22) auxillary macros for adjustment of components %
+%% (23) bits of arrows (\rhvee etc) %
+%% (24) arrow commands (\rTo etc) %
+%% (25) miscellaneous %
+%% Apart from these five sections, the rest is intended to be totally %
+%% meaningless in the undocumented version, which is approximately %
+%% 1910 lines long. Please do not waste trees by printing it out. %
+%% %
+%% COPYRIGHT NOTICE: %
+%% This package may be copied and used freely for any academic %
+%% (not commercial or military) purpose, on condition that it %
+%% is not altered in any way, and that an acknowledgement is %
+%% included in any published work making substantial use of it. %
+%% %
+%% IT IS SUPPLIED "AS IS", WITHOUT WARRANTY, EXPRESS OR IMPLIED. %
+%% %
+%% If you are doing something where mistakes cost money (or where %
+%% success brings financial profit) then you must use commercial %
+%% software, not this package. In any case, please remember to %
+%% keep several backup copies of all files, and check everything %
+%% visually before sending final copy to the publishers. %
+%% %
+%% You may use this package as a (substantial) aid to writing an %
+%% academic research or text book on condition that %
+%% (i) you contact me at a suitable time to ensure that you have %
+%% an up-to-date version (and any infelicities can be fixed), %
+%% (ii) you send me a copy of the book when it's published. %
+%% %
+%% HISTORY %
+%% 3.91 Released 31 August 2006 %
+%% Renamed "noPostScript" option as "UglyObsolete". %
+%% 3.90 Released 11 April 2004 %
+%% use PostScript=Rokicki not pure DVI by default %
+%% 3.89 Released 7 July 2002 %
+%% Added support for pdftex, which is recognised automatically. %
+%% 3.88 Released 1 September 2000 %
+%% Square hook tail: \newarrow{SquareInto}{sqhook}---> %
+%% 3.87 Released 1 September 1999 %
+%% This version was used for the final 1200dpi PS copy of my book %
+%% ``Practical Foundations of Mathematics'' (Cambridge Univ Press) %
+%% see http://www.cs.man.ac.uk/~pt/Practical_Foundations %
+%% 3.86 Released 1 September 1998 %
+%% New options hug and nohug in PostScript mode: [PS,nohug] uses %
+%% PS for the arrows without rotating the labels, but the way of %
+%% calculating the actual position of these horizontal labels on %
+%% will remain subject to alteration for some period of time --- %
+%% please send me examples if you feel that adjustment is needed. %
+%% %
+%% Suppress indentation of following text (due to LaTeX change) %
+%% Mangle \left@label and \right@label (conflict with Elsevier). %
+%% midvshaft and snake for vertical arrows %
+%% New option [gap=width] (default=shortfall) to use instead of %
+%% ~{\;} on horizontals and PS diagonals, as this caused ^ and _ %
+%% labels to be moved too far away from the shaft. %
+%% Added >-> and <-< heads and tails, same as >> and << but the %
+%% shaft goes *through* the extra arrowhead. %
+%% 3.85 Released 20 August 1997 %
+%% New option [crab=distance] shifts horizontals and PS diagonals %
+%% transversally by the specified distance (positive=upward). %
+%% New option [snake=distance] shifts midshaft horizontals and %
+%% PS diagonals longitudinally by the specified distance. %
+%% New option [leftflush], like [flushleft] but reckons alignment %
+%% from multiple verticals, or from text if there's no vertical. %
+%% Most of the history has been suppressed from the user version. %
+%% 3.83 Released 18 May 1995 %
+%% "dotted" option (set dot filler on maps) %
+%% Parallel maps (\pile) outside diagrams stretch correctly. %
+%% Option "LaTeXeqno" uses LaTeX's equation number and style %
+%% for "eqno"; LaTeX's \label command picks this up. %
+%% Suppress warnings & 2nd pass errors with "silent" option. %
+%% 3.81 Second alpha release 18 July 1994 %
+%% \overprint{text} sets text in maths and overprints it in the %
+%% current cell, centered in the column irrespective of other stuff%
+%% "repositionpullbacks" option uses this for \SEpbk etc %
+%% \newdiagramgrid declaration, grid option and pentagon grid. %
+%% 3.80 Alpha release for adjusted diagonals 15 July 1994. %
+%% Introduced landscape and portrait options. %
+%% Diagonals adjusted to meet their endpoints, at last!!!! %
+%% 3.28 Released 30 November 1993 %
+%% Peter Freyd's \puncture symbol provided. %
+%% 3.25 Released 30 January 1993 %
+%% LaTeX heads made default (unless \tenln undefined, when vee) %
+%% Circle, cross, little vee, little black triangle heads. %
+%% First-use warning when defaulted diagonal components are used. %
+%% AMSTEX emulation - works at least when amstex not present. %
+%% 3.24 Release 7 Sept 1992 advertised to users. %
+%% PostScript option introduced: %
+%% LaTeX, vee, curlyvee, triangle & blacktriangle heads & tails %
+%% TPIC option introduced as an alternative to \LaTeX@make@line. %
+%% Postscript arrows (basic code). %
+%% Implemented \newarrow \newarrowhead etc. %
+%% Horizontal arrows outside diagram can stretch by wordspacing. %
+%% Added < and > for labels on left and right of arrow; %
+%% 3.16 (20.7.90) as mass mailed; only have mangled version %
+%% -- all following version numbers are post-facto -- %
+%% 3 (Jan 90) stretching vertical arrows %
+%% 2 (Sept 89) horizontals stretch to objects; "superscript" labels %
+%% 1 (1987) horizontal arrows stretch to edge of cell %
+%% 0 (1986) implementation of Knuth's TeXercise 18.46 for my thesis %
+%%======================================================================%
+
+%%======================================================================%
+%% %
+%% (1) CORRUPTION-SENSITIVE HACKS %
+%% %
+%%======================================================================%
+
+%% CORRUPTION & \catcode WARNING
+
+%% BITNET (IBM) machines may corrupt certain important characters
+%% in transmission by electronic mail:
+%% 0123456789=digits, abcdefghijklmnopqrstuvwxyz=lowers,
+%% ABCDEFGHIJKLMNOPQRSTUVWXYZ=uppers, @=at (internal names),
+%% {}=curly braces (grouping), \=backslash (keywords),
+%% %=percent (comment), #=hash/sharp (argument), +=plus, -=minus,
+%% <>=angle brackets (relations \ifnum,\ifdim), ==equals,
+%% ,=comma, .=dot, :=colon, ;=semicolon, =space
+%% $=dollar (maths) is only used in the "bits of maps" section
+
+%% The following characters are marked by a comment including the word "ASCII",
+%% except in comments and messages:
+%% &=and (alignment), ~=tilde, |=vertical, []=square brackets,
+%% ^=caret (superscript), _=underline (subscript),
+%% `=grave/backquote (catcodes), '=acute/single quote (octal),
+%% "=double quote (hex), ()=round brackets,
+%% /=slash, ?=query, !=pling/bang,
+
+%% The \catcode's marked * are assumed for reading this file:
+%% \=0* {=1* }=2* $=3 &=4 return=5* #=6 ^=7 _=8 ignored=9*
+%% space=10* letter=11* other=12 active=13 %=14* invalid=15
+%% If you want to load this package inside Stallman's "texinfo", you must do
+%%% @catcode`@\=0 \catcode`\%=14 \input diagrams \catcode`\%=12 \catcode`\\=13
+%% and then use @diagram @rTo @\ @enddiagram etc. (braces {} stay the same).
+%% Also need @catcode`@&=4.
+
+%%*** You *MUST NOT* use the internal commands (with names beginning \CD@)****
+
+%% don't load me twice!
+\ifx\diagram\CD@qK\else\message{WARNING: the \string\diagram\space command is
+already defined and will not be loaded again}\expandafter\endinput\fi
+
+%% make @ letter, saving its old code to restore at the end of this file
+%%% look for this on the last line of the file if you think something's missing!
+%% the other \catcode assignments are to make it work with texinfo.
+\edef\cdrestoreat{%%
+\noexpand\catcode\lq\noexpand\@=\the\catcode\lq\@%%
+\noexpand\catcode\lq\noexpand\#=\the\catcode\lq\#%%
+\noexpand\catcode\lq\noexpand\$=\the\catcode\lq\$%%
+\noexpand\catcode\lq\noexpand\<=\the\catcode\lq\<%%
+\noexpand\catcode\lq\noexpand\>=\the\catcode\lq\>%%
+\noexpand\catcode\lq\noexpand\:=\the\catcode\lq\:%% Johannes L. Braams's
+\noexpand\catcode\lq\noexpand\;=\the\catcode\lq\;%% Babel languages package
+\noexpand\catcode\lq\noexpand\!=\the\catcode\lq\!%% makes these \active.
+\noexpand\catcode\lq\noexpand\?=\the\catcode\lq\?%%
+\noexpand\catcode\lq\noexpand\+=\the\catcode\rq53%
+%% texinfo @+ is @outer@active
+}\catcode\lq\@=11 \catcode\lq\#=6 \catcode\lq\<=12 \catcode\lq\>=12 \catcode
+\rq53=12 \catcode\lq\:=12 \catcode\lq\;=12 \catcode\lq\!=12 \catcode\lq\?=12
+
+%% Change y to n if pool_size in your implementation of TeX is small.
+%% This is reasonable if you have a small ("personal") computer, but if you
+%%% have a sun, dec, hp, ... workstation or a mainframe, complain to your local
+%% system manager and get him/her to install a version of TeX with bigger
+%% parameters. The "hash size" (number of command names) gets you next.
+\ifx\diagram@help@messages\CD@qK\let\diagram@help@messages y\fi
+
+%% The following macro is used to include literal PostScript commands in the
+%% DVI file for rotation, etc. Since this goes beyond standard TeX, it is
+%%% dependent on the convention used by your local DVI-to-PostScript translator.
+%% Choose whichever line applies to the program used at your site, or, if
+%% yours is not listed, consult the manual, experiment with this macro and
+%% (please) tell me what is needed to make it work.
+%%
+%%
+%%% dvips (Tomas Rokicki, Radical Eye) labrea.stanford.edu /pub/dvips9999.tar.Z
+%% CTAN: dviware/dvips
+\def\cdps@Rokicki#1{\special{ps:#1}}\let\cdps@dvips\cdps@Rokicki\let
+\cdps@RadicalEye\cdps@Rokicki\let\CD@HB\cdps@Rokicki\let\CD@IK\cdps@Rokicki
+\let\CD@HB\cdps@Rokicki%%
+%% I'm not sure that the rest work.
+%%
+%% dvitps (Stephan Bechtolsheim, Integrated Computer Systems)
+%% arthur.cs.purdue.edu /pub/TeXPS-9.99.tar.Z
+\def\cdps@Bechtolsheim#1{\special{dvitps: Literal "#1"}}%
+%% ASCII two dbl quotes
+\let\cdps@dvitps\cdps@Bechtolsheim\let\cdps@IntegratedComputerSystems
+\cdps@Bechtolsheim%%
+%% dvitops (James Clark)
+%% CTAN: dviware/dvitops
+\def\cdps@Clark#1{\special{dvitops: inline #1}}%%
+\let\cdps@dvitops\cdps@Clark%%
+%% OzTeX (Andrew Trevorrow) cannot be used
+\let\cdps@OzTeX\empty\let\cdps@oztex\empty\let\cdps@Trevorrow\empty%%
+%% dvi3ps (Kevin Coombes)
+%% CTAN: dviware/dvi2ps/dvi3ps
+\def\cdps@Coombes#1{\special{ps-string #1}}%%
+%% psprint (Trevorrow) CTAN: dviware/psprint
+%% dvi2ps (Senn) CTAN: dviware/dvi2ps
+%% psdvi (Elwell) CTAN: dviware/dvi2ps/psdvi
+
+\count@=\year\multiply\count@12 \advance\count@\month%%
+\ifnum\count@>24096 %% (December 2007)
+\message{***********************************************************}%%ascii
+\message{! YOU HAVE AN OUT OF DATE VERSION OF COMMUTATIVE DIAGRAMS! *}%%
+\message{! it expired in December 2007 and is time-bombed for April *}%%
+\message{! You may get an up to date version of this package from *}%%ascii
+\message{! either www.ctan.org or www.cs.man.ac.uk/~pt/diagrams/ *}%%
+\message{***********************************************************}%%ascii
+\ifnum\count@>24099 %% (March 2008)
+\errhelp{You may press RETURN and carry on for the time being.}\message{! It
+is embarrassing to see papers in conference proceedings}\message{! and
+journals containing bugs which I had fixed years before.}\message{! It is easy
+to obtain and install a new version, which will}\errmessage{! remain
+compatible with your files. Please get it NOW.}\fi\fi
+
+\def\CD@DE{\global\let}\def\CD@RH{\outer\def}
+
+%% safe names for braces, tab (&) and maths ($), as commands and for messages
+{\escapechar\m@ne\xdef\CD@o{\string\{}\xdef\CD@yC{\string\}}%%
+%%
+%% three ASCII ampersands (ands) (&&&) appear on the next line
+\catcode\lq\&=4 \CD@DE\CD@Q=&\xdef\CD@S{\string\&}%%ascii three ands
+%%
+%% ASCII ^ and _ each appear twice on next line
+%% six ASCII dollars ($$$$$$) appear on the next two lines.
+\catcode\lq\$=3 \CD@DE\CD@k=$\CD@DE\CD@ND=$%%ascii three dollars
+\xdef\CD@nC{\string\$}\gdef\CD@LG{$$}%%ascii three dollars
+%%
+%% two ASCII underlines (__) appear on the next line.
+\catcode\lq\_=8 \CD@DE\CD@lJ=_%%ascii two underlines
+%%
+%% eight ASCII carets (^^^^^^^^) appear on the next three lines.
+\obeylines\catcode\lq\^=7 \CD@DE\@super=^%%ascii two carets
+\ifnum\newlinechar=10 \gdef\CD@uG{^^J}%%ascii two carets
+\else\ifnum\newlinechar=13 \gdef\CD@uG{^^M}%%ascii two carets
+\else\ifnum\newlinechar=-1 \gdef\CD@uG{^^J}%%ascii two carets
+\else\CD@DE\CD@uG\space\expandafter\message{! input error: \noexpand
+\newlinechar\space is ASCII \the\newlinechar, not LF=10 or CR=13.}%%
+\fi\fi\fi}%%
+
+%% avoid using <> (because I personally re-define them to mean \langle\rangle)
+\mathchardef\lessthan=\rq30474 \mathchardef\greaterthan=\rq30476
+
+%% LaTeX line and arrowhead font
+%% the "hit return" comments show up if the font is missing.
+\ifx\tenln\CD@qK%%
+\font\tenln=line10\relax%% Hit return - who needs diagonals?
+\fi\ifx\tenlnw\CD@qK\ifx\tenln\nullfont\let\tenlnw\nullfont\else%%
+\font\tenlnw=linew10\relax%% Hit return - who needs diagonals?
+\fi\fi%%
+
+%% report line numbers in TeX3 only
+\ifx\inputlineno\CD@qK\csname newcount\endcsname\inputlineno\inputlineno\m@ne
+\message{***************************************************}\message{!
+Obsolete TeX (version 2). You should upgrade to *}\message{! version 3, which
+has been available since 1990. *}\message{***********************************%
+****************}\fi
+
+\def\cd@shouldnt#1{\CD@KB{* THIS (#1) SHOULD NEVER HAPPEN! *}}
+
+%% turn round- and square-bracketed arguments into curly-bracketed
+\def\get@round@pair#1(#2,#3){#1{#2}{#3}}%%ascii round brackets ()
+\def\get@square@arg#1[#2]{#1{#2}}%%ascii square brackets []
+\def\CD@AE#1{\CD@PK\let\CD@DH\CD@@E\CD@@E#1,],}%%ascii sq brackets
+\def\CD@m{[}\def\CD@RD{]}\def\commdiag#1{{\let\enddiagram\relax\diagram[]#1%
+\enddiagram}}
+
+%% ASCII open square bracket occurs on next line
+\def\CD@BF{{\ifx\CD@EH[\aftergroup\get@square@arg\aftergroup\CD@YH\else
+\aftergroup\CD@JH\fi}}%%
+\def\CD@CF#1#2{\def\CD@YH{#1}\def\CD@JH{#2}\futurelet\CD@EH\CD@BF}
+
+%% ASCII vertical bar (|) occurs on the next line
+\def\CD@KK{|}
+
+\def\CD@PB{%% arguments to maps inside diagrams
+\tokcase\CD@DD:\CD@y\break@args;\catcase\@super:\upper@label;\catcase\CD@lJ:%
+\lower@label;\tokcase{~}:\middle@label;%%ascii tilde
+\tokcase<:\CD@iF;%%ascii less-than
+\tokcase>:\CD@iI;%%ascii greater-than
+\tokcase(:\CD@BC;%%)%ascii open round bracket
+\tokcase[:\optional@;%%]%ascii open square bracket
+\tokcase.:\CD@JJ;%%ascii dot 12.7.94
+\catcase\space:\eat@space;\catcase\bgroup:\positional@;\default:\CD@@A
+\break@args;\endswitch}
+
+\def\switch@arg{%% arguments to horizontal maps outside diagrams
+\catcase\@super:\upper@label;\catcase\CD@lJ:\lower@label;\tokcase[:\optional@
+;%%]%ascii open square bracket
+\tokcase.:\CD@JJ;%%ascii dot 12.7.94 % ; was : before 15.6.97
+\catcase\space:\eat@space;\catcase\bgroup:\positional@;\tokcase{~}:%
+\middle@label;%%ascii tilde (questionable!)
+\default:\CD@y\break@args;\endswitch}
+
+%% That's as much as you get to read "in clear" - the rest is private!
+
+\let\CD@tJ\relax\ifx\protect\CD@qK\let\protect\relax\fi\ifx\AtEndDocument
+\CD@qK\def\CD@PG{\CD@gB}\def\CD@GF#1#2{}\else\def\CD@PG#1{\edef\CD@CH{#1}%
+\expandafter\CD@oC\CD@CH\CD@OD}\def\CD@oC#1\CD@OD{\AtEndDocument{\typeout{%
+\CD@tA: #1}}}\def\CD@GF#1#2{\gdef#1{#2}\AtEndDocument{#1}}\fi\def\CD@ZA#1#2{%
+\def#1{\CD@PG{#2\CD@mD\CD@W}\CD@DE#1\relax}}\def\CD@uF#1\repeat{\def\CD@p{#1}%
+\CD@OF}\def\CD@OF{\CD@p\relax\expandafter\CD@OF\fi}\def\CD@sF#1\repeat{\def
+\CD@q{#1}\CD@PF}\def\CD@PF{\CD@q\relax\expandafter\CD@PF\fi}\def\CD@tF#1%
+\repeat{\def\CD@r{#1}\CD@QF}\def\CD@QF{\CD@r\relax\expandafter\CD@QF\fi}\def
+\CD@tG#1#2#3{\def#2{\let#1\iftrue}\def#3{\let#1\iffalse}#3}\if y%
+\diagram@help@messages\def\CD@rG#1#2{\csname newtoks\endcsname#1#1=%
+\expandafter{\csname#2\endcsname}}\else\csname newtoks\endcsname\no@cd@help
+\no@cd@help{See the manual}\def\CD@rG#1#2{\let#1\no@cd@help}\fi\chardef\CD@lF
+=1 \chardef\CD@lI=2 \chardef\CD@MH=5 \chardef\CD@tH=6 \chardef\CD@sH=7
+\chardef\CD@PC=9 \dimendef\CD@hI=2 \dimendef\CD@hF=3 \dimendef\CD@mF=4
+\dimendef\CD@mI=5 \dimendef\CD@wJ=6 \dimendef\CD@tI=8 \dimendef\CD@sI=9
+\skipdef\CD@uB=1 \skipdef\CD@NF=2 \skipdef\CD@tB=3 \skipdef\CD@ZE=4 \skipdef
+\CD@JK=5 \skipdef\CD@kI=6 \skipdef\CD@kF=7 \skipdef\CD@qI=8 \skipdef\CD@pI=9
+\countdef\CD@JC=9 \countdef\CD@gD=8 \countdef\CD@A=7 \def\sdef#1#2{\def#1{#2}%
+}\def\CD@L#1{\expandafter\aftergroup\csname#1\endcsname}\def\CD@RC#1{%
+\expandafter\def\csname#1\endcsname}\def\CD@sD#1{\expandafter\gdef\csname#1%
+\endcsname}\def\CD@vC#1{\expandafter\edef\csname#1\endcsname}\def\CD@nF#1#2{%
+\expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname}\def\CD@EE
+#1#2{\expandafter\CD@DE\csname#1\expandafter\endcsname\csname#2\endcsname}%
+\def\CD@AK#1{\csname#1\endcsname}\def\CD@XJ#1{\expandafter\show\csname#1%
+\endcsname}\def\CD@ZJ#1{\expandafter\showthe\csname#1\endcsname}\def\CD@WJ#1{%
+\expandafter\showbox\csname#1\endcsname}\def\CD@tA{Commutative Diagram}\edef
+\CD@kH{\string\par}\edef\CD@dC{\string\diagram}\edef\CD@HD{\string\enddiagram
+}\edef\CD@EC{\string\\}\def\CD@eF{LaTeX}\ifx\@ignoretrue\CD@qK\expandafter
+\CD@tG\csname if@ignore\endcsname\ignore@true\ignore@false\def\@ignoretrue{%
+\global\ignore@true}\def\@ignorefalse{\global\ignore@false}\fi
+
+\def\CD@g{{\ifnum0=\lq}\fi}\def\CD@wC{\ifnum0=\lq{\fi}}\def\catcase#1:{\ifcat
+\noexpand\CD@EH#1\CD@tJ\expandafter\CD@kC\else\expandafter\CD@dJ\fi}\def
+\tokcase#1:{\ifx\CD@EH#1\CD@tJ\expandafter\CD@kC\else\expandafter\CD@dJ\fi}%
+\def\CD@kC#1;#2\endswitch{#1}\def\CD@dJ#1;{}\let\endswitch\relax\def\default:%
+#1;#2\endswitch{#1}\ifx\at@\CD@qK\def\at@{@}\fi\edef\CD@P{\CD@o pt\CD@yC}%
+\CD@RC{\CD@P>}#1>#2>{\CD@z\rTo\sp{#1}\sb{#2}\CD@z}\CD@RC{\CD@P<}#1<#2<{\CD@z
+\lTo\sp{#1}\sb{#2}\CD@z}\CD@RC{\CD@P)}#1)#2){\CD@z\rTo\sp{#1}\sb{#2}\CD@z}%
+%%ascii round
+\CD@RC{\CD@P(}#1(#2({\CD@z\lTo\sp{#1}\sb{#2}\CD@z}%%ascii brack
+\def\CD@O{\def\endCD{\enddiagram}\CD@RC{\CD@P A}##1A##2A{\uTo<{##1}>{##2}%
+\CD@z\CD@z}\CD@RC{\CD@P V}##1V##2V{\dTo<{##1}>{##2}\CD@z\CD@z}\CD@RC{\CD@P=}{%
+\CD@z\hEq\CD@z}\CD@RC{\CD@P\CD@KK}{\vEq\CD@z\CD@z}\CD@RC{\CD@P\string\vert}{%
+\vEq\CD@z\CD@z}\CD@RC{\CD@P.}{\CD@z\CD@z}\let\CD@z\CD@Q}\def\CD@IE{\let\tmp
+\CD@JE\ifcat A\noexpand\CD@CH\else\ifcat=\noexpand\CD@CH\else\ifcat\relax
+\noexpand\CD@CH\else\let\tmp\at@\fi\fi\fi\tmp}\def\CD@JE#1{\CD@nF{tmp}{\CD@P
+\string#1}\ifx\tmp\relax\def\tmp{\at@#1}\fi\tmp}\def\CD@z{}\begingroup
+\aftergroup\def\aftergroup\CD@T\aftergroup{\aftergroup\def\catcode\lq\@%
+\active\aftergroup @\endgroup{\futurelet\CD@CH\CD@IE}}\newcount\CD@uA
+\newcount\CD@vA\newcount\CD@wA\newcount\CD@xA\newdimen\CD@OA\newdimen\CD@PA
+\CD@tG\CD@gE\CD@@A\CD@y\CD@tG\CD@hE\CD@EA\CD@BA\newdimen\CD@RA\newdimen\CD@SA
+\newcount\CD@yA\newcount\CD@zA\newdimen\CD@QA\newbox\CD@DA\CD@tG\CD@lE\CD@dA
+\CD@bA\newcount\CD@LH\newcount\CD@TC\def\CD@V#1#2{\ifdim#1<#2\relax#1=#2%
+\relax\fi}\def\CD@X#1#2{\ifdim#1>#2\relax#1=#2\relax\fi}\newdimen\CD@XH\CD@XH
+=1sp \newdimen\CD@zC\CD@zC\z@\def\CD@cJ{\ifdim\CD@zC=1em\else\CD@nJ\fi}\def
+\CD@nJ{\CD@zC1em\def\CD@NC{\fontdimen8\textfont3 }\CD@@J\CD@NJ\setbox0=\vbox{%
+\CD@t\noindent\CD@k\null\penalty-9993\null\CD@ND\null\endgraf\setbox0=%
+\lastbox\unskip\unpenalty\setbox1=\lastbox\global\setbox\CD@IG=\hbox{\unhbox0%
+\unskip\unskip\unpenalty\setbox0=\lastbox}\global\setbox\CD@KG=\hbox{\unhbox1%
+\unskip\unpenalty\setbox1=\lastbox}}}\newdimen\CD@@I\CD@@I=1true in \divide
+\CD@@I300 \def\CD@zH#1{\multiply#1\tw@\advance#1\ifnum#1<\z@-\else+\fi\CD@@I
+\divide#1\tw@\divide#1\CD@@I\multiply#1\CD@@I}\def\MapBreadth{%
+\afterassignment\CD@gI\CD@LF}\newdimen\CD@LF\newdimen\CD@oI\def\CD@gI{\CD@oI
+\CD@LF\CD@V\CD@@I{4\CD@XH}\CD@X\CD@@I\p@\CD@zH\CD@oI\ifdim\CD@LF>\z@\CD@V
+\CD@oI\CD@@I\fi\CD@cJ}\def\CD@RJ#1{\CD@zD\count@\CD@@I#1\ifnum\count@>\z@
+\divide\CD@@I\count@\fi\CD@gI\CD@NJ}\def\CD@NJ{\dimen@\CD@QC\count@\dimen@
+\divide\count@5\divide\count@\CD@@I\edef\CD@OC{\the\count@}}\def\CD@AJ{\CD@QJ
+\z@}\def\CD@QJ#1{\CD@tI\axisheight\advance\CD@tI#1\relax\advance\CD@tI-.5%
+\CD@oI\CD@zH\CD@tI\CD@sI-\CD@tI\advance\CD@tI\CD@LF}\newdimen\CD@DC\CD@DC\z@
+\newdimen\CD@eJ\CD@eJ\z@\def\CD@CJ#1{\CD@sI#1\relax\CD@tI\CD@sI\advance\CD@tI
+\CD@LF\relax}\def\horizhtdp{height\CD@tI depth\CD@sI}\def\axisheight{%
+\fontdimen22\the\textfont\tw@}\def\script@axisheight{\fontdimen22\the
+\scriptfont\tw@}\def\ss@axisheight{\fontdimen22\the\scriptscriptfont\tw@}\def
+\CD@NC{0.4pt}\def\CD@VK{\fontdimen3\textfont\z@}\def\CD@UK{\fontdimen3%
+\textfont\z@}\newdimen\PileSpacing\newdimen\CD@nA\CD@nA\z@\def\CD@RG{%
+\ifincommdiag1.3em\else2em\fi}\newdimen\CD@YB\def\CellSize{\afterassignment
+\CD@kB\DiagramCellHeight}\newdimen\DiagramCellHeight\DiagramCellHeight-%
+\maxdimen\newdimen\DiagramCellWidth\DiagramCellWidth-\maxdimen\def\CD@kB{%
+\DiagramCellWidth\DiagramCellHeight}\def\CD@QC{3em}\newdimen\MapShortFall\def
+\MapsAbut{\MapShortFall\z@\objectheight\z@\objectwidth\z@}\newdimen\CD@iA
+\CD@iA\z@\CD@tG\CD@vE\CD@aB\CD@ZB\expandafter\ifx\expandafter\iftrue\csname
+ifUglyObsoleteDiagrams\endcsname\CD@ZB\else\CD@aB\fi\CD@nF{%
+ifUglyObsoleteDiagrams}{relax}\newif\ifUglyObsoleteDiagrams\def\CD@nK{\CD@aB
+\UglyObsoleteDiagramsfalse}\def\CD@oK{\CD@ZB\UglyObsoleteDiagramstrue}\CD@vE
+\CD@nK\else\CD@oK\fi\CD@tG\CD@hK\CD@dK\CD@cK\CD@cK\def\CD@pK{\global\CD@dK
+\global\CD@aB\global\UglyObsoleteDiagramsfalse\global\let\CD@n\empty\global
+\let\CD@oK\relax}\def\newarrowhead{\CD@mG h\CD@BG\CD@GG>}\def\newarrowtail{%
+\CD@mG t\CD@BG\CD@GG>}\def\newarrowmiddle{\CD@mG m\CD@BG\hbox@maths\empty}%
+\def\newarrowfiller{\CD@mG f\CD@bE\CD@MK-}\def\CD@mG#1#2#3#4#5#6#7#8#9{\CD@RC
+{r#1:#5}{#2{#6}}\CD@RC{l#1:#5}{#2{#7}}\CD@RC{d#1:#5}{#3{#8}}\CD@RC{u#1:#5}{#3%
+{#9}}\CD@vC{-#1:#5}{\expandafter\noexpand\csname-#1:#4\endcsname\noexpand
+\CD@MC}\CD@vC{+#1:#5}{\expandafter\noexpand\csname+#1:#4\endcsname\noexpand
+\CD@MC}}\CD@ZA\CD@MC{\CD@eF\space diagonals are used unless PostScript is set%
+}\def\defaultarrowhead#1{\edef\CD@sJ{#1}\CD@@J}\def\CD@@J{\CD@IJ\CD@sJ<>ht%
+\CD@IJ\CD@sJ<>th}\def\CD@IJ#1#2#3#4#5{\CD@HJ{r#4}{#3}{l#5}{#2}{r#4:#1}\CD@HJ{%
+r#5}{#2}{l#4}{#3}{l#4:#1}\CD@HJ{d#4}{#3}{u#5}{#2}{d#4:#1}\CD@HJ{d#5}{#2}{u#4}%
+{#3}{u#4:#1}}\def\CD@HJ#1#2#3#4#5{\begingroup\aftergroup\CD@GJ\CD@L{#1+:#2}%
+\CD@L{#1:#2}\CD@L{#3:#4}\CD@L{#5}\endgroup}\def\CD@GJ#1#2#3#4{\csname newbox%
+\endcsname#1\def#2{\copy#1}\def#3{\copy#1}\setbox#1=\box\voidb@x}\def\CD@sJ{}%
+\CD@@J\def\CD@GJ#1#2#3#4{\setbox#1=#4}\ifx\tenln\nullfont\def\CD@sJ{vee}\else
+\let\CD@sJ\CD@eF\fi\def\CD@xF#1#2#3{\begingroup\aftergroup\CD@wF\CD@L{#1#2:#3%
+#3}\CD@L{#1#2:#3}\aftergroup\CD@yF\CD@L{#1#2:#3-#3}\CD@L{#1#2:#3}\endgroup}%
+\def\CD@wF#1#2{\def#1{\hbox{\rlap{#2}\kern.4\CD@zC#2}}}\def\CD@yF#1#2{\def#1{%
+\hbox{\rlap{#2}\kern.4\CD@zC#2\kern-.4\CD@zC}}}\CD@xF lh>\CD@xF rt>\CD@xF rh<%
+\CD@xF rt<\def\CD@yF#1#2{\def#1{\hbox{\kern-.4\CD@zC\rlap{#2}\kern.4\CD@zC#2}%
+}}\CD@xF rh>\CD@xF lh<\CD@xF lt>\CD@xF lt<\def\CD@wF#1#2{\def#1{\vbox{\vbox to%
+\z@{#2\vss}\nointerlineskip\kern.4\CD@zC#2}}}\def\CD@yF#1#2{\def#1{\vbox{%
+\vbox to\z@{#2\vss}\nointerlineskip\kern.4\CD@zC#2\kern-.4\CD@zC}}}\CD@xF uh>%
+\CD@xF dt>\CD@xF dh<\CD@xF dt<\def\CD@yF#1#2{\def#1{\vbox{\kern-.4\CD@zC\vbox
+to\z@{#2\vss}\nointerlineskip\kern.4\CD@zC#2}}}\CD@xF dh>\CD@xF ut>\CD@xF uh<%
+\CD@xF ut<\def\CD@BG#1{\hbox{\mathsurround\z@\offinterlineskip\CD@k\mkern-1.5%
+mu{#1}\mkern-1.5mu\CD@ND}}\def\hbox@maths#1{\hbox{\CD@k#1\CD@ND}}\def\CD@GG#1%
+{\hbox to\CD@LF{\setbox0=\hbox{\offinterlineskip\mathsurround\z@\CD@k{#1}%
+\CD@ND}\dimen0.5\wd0\advance\dimen0-.5\CD@oI\CD@zH{\dimen0}\kern-\dimen0%
+\unhbox0\hss}}\def\CD@sB#1{\hbox to2\CD@LF{\hss\offinterlineskip\mathsurround
+\z@\CD@k{#1}\CD@ND\hss}}\def\CD@vF#1{\hbox{\mathsurround\z@\CD@k{#1}\CD@ND}}%
+\def\CD@bE#1{\hbox{\kern-.15\CD@zC\CD@k{#1}\CD@ND\kern-.15\CD@zC}}\def\CD@MK#%
+1{\vbox{\offinterlineskip\kern-.2ex\CD@GG{#1}\kern-.2ex}}\def\@fillh{%
+\xleaders\vrule\horizhtdp}\def\@fillv{\xleaders\hrule width\CD@LF}\CD@nF{rf:-%
+}{@fillh}\CD@nF{lf:-}{@fillh}\CD@nF{df:-}{@fillv}\CD@nF{uf:-}{@fillv}\CD@nF{%
+rh:}{null}\CD@nF{rm:}{null}\CD@nF{rt:}{null}\CD@nF{lh:}{null}\CD@nF{lm:}{null%
+}\CD@nF{lt:}{null}\CD@nF{dh:}{null}\CD@nF{dm:}{null}\CD@nF{dt:}{null}\CD@nF{%
+uh:}{null}\CD@nF{um:}{null}\CD@nF{ut:}{null}\CD@nF{+h:}{null}\CD@nF{+m:}{null%
+}\CD@nF{+t:}{null}\CD@nF{-h:}{null}\CD@nF{-m:}{null}\CD@nF{-t:}{null}\def
+\CD@@D{\hbox{\vrule height 1pt depth-1pt width 1pt}}\CD@RC{rf:}{\CD@@D}\CD@nF
+{lf:}{rf:}\CD@nF{+f:}{rf:}\CD@RC{df:}{\CD@@D}\CD@nF{uf:}{df:}\CD@nF{-f:}{df:}%
+\def\CD@BD{\CD@U\null\CD@@D\null\CD@@D\null}\edef\CD@lG{\string\newarrow}\def
+\newarrow#1#2#3#4#5#6{\begingroup\edef\@name{#1}\edef\CD@oJ{#2}\edef\CD@iD{#3%
+}\edef\CD@QG{#4}\edef\CD@jD{#5}\edef\CD@LE{#6}\let\CD@HE\CD@sG\let\CD@FK
+\CD@BH\let\@x\CD@AH\ifx\CD@oJ\CD@iD\let\CD@oJ\empty\fi\ifx\CD@LE\CD@jD\let
+\CD@LE\empty\fi\def\CD@LI{r}\def\CD@SF{l}\def\CD@IC{d}\def\CD@yJ{u}\def\CD@gH
+{+}\def\@m{-}\ifx\CD@iD\CD@jD\ifx\CD@QG\CD@iD\let\CD@QG\empty\fi\ifx\CD@LE
+\empty\ifx\CD@iD\CD@aE\let\@x\CD@yG\else\let\@x\CD@zG\fi\fi\else\edef\CD@a{%
+\CD@iD\CD@oJ}\ifx\CD@a\empty\ifx\CD@QG\CD@jD\let\CD@QG\empty\fi\fi\fi\ifmmode
+\aftergroup\CD@kG\else\CD@@A\CD@oB rh{head\space\space}\CD@LE\CD@oB rf{filler%
+}\CD@iD\CD@oB rm{middle}\CD@QG\ifx\CD@jD\CD@iD\else\CD@oB rf{filler}\CD@jD\fi
+\CD@oB rt{tail\space\space}\CD@oJ\CD@gE\CD@HE\CD@FK\@x\CD@nG l-2+2{lu}{nw}%
+\NorthWest\CD@nG r+2+2{ru}{ne}\NorthEast\CD@nG l-2-2{ld}{sw}\SouthWest\CD@nG r%
++2-2{rd}{se}\SouthEast\else\aftergroup\CD@b\CD@L{r\@name}\fi\fi\endgroup}\def
+\CD@sG{\CD@vG\CD@LI\CD@SF rl\Horizontal@Map}\def\CD@BH{\CD@vG\CD@IC\CD@yJ du%
+\Vertical@Map}\def\CD@AH{\CD@vG\CD@gH\@m+-\Vector@Map}\def\CD@yG{\CD@vG\CD@gH
+\@m+-\Slant@Map}\def\CD@zG{\CD@vG\CD@gH\@m+-\Slope@Map}\catcode\lq\/=\active
+\def\CD@vG#1#2#3#4#5{\CD@jG#1#3#5t:\CD@oJ/f:\CD@iD/m:\CD@QG/f:\CD@jD/h:\CD@LE
+//\CD@jG#2#4#5h:\CD@LE/f:\CD@jD/m:\CD@QG/f:\CD@iD/t:\CD@oJ//}\def\CD@jG#1#2#3%
+#4//{\edef\CD@fG{#2}\aftergroup\sdef\CD@L{#1\@name}\aftergroup{\aftergroup#3%
+\CD@M#4//\aftergroup}}\def\CD@M#1/{\edef\CD@EH{#1}\ifx\CD@EH\empty\else\CD@L{%
+\CD@fG#1}\expandafter\CD@M\fi}\catcode\lq\/=12 \def\CD@nG#1#2#3#4#5#6#7#8{%
+\aftergroup\sdef\CD@L{#6\@name}\aftergroup{\CD@L{#2\@name}\if#2#4\aftergroup
+\CD@CI\else\aftergroup\CD@BI\fi\CD@L{#1\@name}%
+%% ASCII round brackets and comma (,) appear on the next line
+\aftergroup(\aftergroup#3\aftergroup,\aftergroup#5\aftergroup)\aftergroup}}%
+\def\CD@oB#1#2#3#4{\expandafter\ifx\csname#1#2:#4\endcsname\relax\CD@y\CD@gB{%
+arrow#3 "#4" undefined}\fi}\CD@rG\CD@VE{All five components must be defined
+before an arrow.}\CD@rG\CD@SE{\CD@lG, unlike \string\HorizontalMap, is a
+declaration.}\def\CD@b#1{\CD@YA{Arrows \string#1 etc could not be defined}%
+\CD@VE}\def\CD@kG{\CD@YA{misplaced \CD@lG}\CD@SE}\def\newdiagramgrid#1#2#3{%
+\CD@RC{cdgh@#1}{#2,],}%% ASCII close square bracket
+\CD@RC{cdgv@#1}{#3,],}}%% ASCII close square bracket
+\CD@tG\ifincommdiag\incommdiagtrue\incommdiagfalse\CD@tG\CD@@F\CD@IF\CD@HF
+\newcount\CD@VA\CD@VA=0 \def\CD@yH{\CD@VA6 }\def\CD@OB{\CD@VA1 \global\CD@yA1
+\CD@DE\CD@YF\empty}\def\CD@YF{}\def\CD@nB#1{\relax\CD@MD\edef\CD@vJ{#1}%
+\begingroup\CD@rE\else\ifcase\CD@VA\ifmmode\else\CD@YG\CD@E0\fi\or\CD@cE5\or
+\CD@YG\CD@F5\or\CD@YG\CD@B5\or\CD@YG\CD@B5\or\CD@YG\CD@C5\or\CD@cE7\or\CD@YG
+\CD@D7\fi\fi\endgroup\xdef\CD@YF{#1}}\def\CD@pB#1#2#3#4#5{\relax\CD@MD\xdef
+\CD@vJ{#4}\begingroup\ifnum\CD@VA<#1 \expandafter\CD@cE\ifcase\CD@VA0\or#2\or
+#3\else#2\fi\else\ifnum\CD@VA<6 \CD@tJ\CD@YG\CD@B#2\else\CD@YG\CD@G#2\fi\fi
+\endgroup\CD@DE\CD@YF\CD@vJ\ifincommdiag\let\CD@ZD#5\else\let\CD@ZD\CD@LK\fi}%
+\def\CD@yI{\global\CD@yA=\ifnum\CD@VA<5 1\else2\fi\relax}\def\CD@OI{\CD@VA
+\CD@yA}\def\CD@cE#1{\aftergroup\CD@VA\aftergroup#1\aftergroup\relax}\def
+\CD@HH{\def\CD@nB##1{\relax}\let\CD@pB\CD@FH\let\CD@yH\relax\let\CD@OB\relax
+\let\CD@yI\relax\let\CD@OI\relax}\def\CD@FH#1#2#3#4#5{\ifincommdiag\let\CD@ZD
+#5\else\xdef\CD@vJ{#4}\let\CD@ZD\CD@LK\fi}\def\CD@YG#1{\aftergroup#1%
+\aftergroup\relax\CD@cE}\def\CD@B{\CD@YE\CD@S\CD@ME\CD@Q}\def\CD@G{\CD@YE{%
+\CD@yC\CD@S}\CD@XE\CD@QD\CD@Q}\def\CD@F{\CD@YE{*\CD@S}\CD@RE\clubsuit\CD@Q}%
+\def\CD@C{\CD@YE{\CD@S*\CD@S}\CD@RE\CD@Q\clubsuit\CD@Q}\def\CD@D{\CD@YE\CD@EC
+\CD@TE\\}\def\CD@E{\CD@YE\CD@nC\CD@QE\CD@k}\def\CD@LK{\CD@YA{\CD@vJ\space
+ignored \CD@dH}\CD@WE}\def\CD@FE{}\def\CD@d{\CD@YA{maps must never be enclosed
+in braces}\CD@OE}\def\CD@dH{outside diagram}\def\CD@FC{\string\HonV, \string
+\VonH\space and \string\HmeetV}\CD@rG\CD@ME{The way that horizontal and
+vertical arrows are terminated implicitly means\CD@uG that they cannot be
+mixed with each other or with \CD@FC.}\CD@rG\CD@XE{\string\pile\space is for
+parallel horizontal arrows; verticals can just be put together in\CD@uG a cell%
+. \CD@FC\space are not meaningful in a \string\pile.}\CD@rG\CD@RE{The
+horizontal maps must point to an object, not each other (I've put in\CD@uG one
+which you're unlikely to want). Use \string\pile\space if you want them
+parallel.}\CD@rG\CD@TE{Parallel horizontal arrows must be in separate layers
+of a \string\pile.}\CD@rG\CD@QE{Horizontal arrows may be used \CD@dH s, but
+must still be in maths.}\CD@rG\CD@WE{Vertical arrows, \CD@FC\space\CD@dH s don%
+'t know where\CD@uG where to terminate.}\CD@rG\CD@OE{This prevents them from
+stretching correctly.}\def\CD@YE#1{\CD@YA{"#1" inserted \ifx\CD@YF\empty
+before \CD@vJ\else between \CD@YF\ifx\CD@YF\CD@vJ s\else\space and \CD@vJ\fi
+\fi}}\count@=\year\multiply\count@12 \advance\count@\month\ifnum\count@>24103
+\message{because this one expired in July 2008!}\expandafter\endinput\fi\def
+\Horizontal@Map{\CD@nB{horizontal map}\CD@LC\CD@TJ\CD@qD}\def\CD@TJ{\CD@GB-%
+9999 \let\CD@ZD\CD@XD\ifincommdiag\else\CD@cJ\ifinpile\else\skip2\z@ plus 1.5%
+\CD@VK minus .5\CD@UK\skip4\skip2 \fi\fi\let\CD@kD\@fillh\CD@nF{fill@dot}{rf:%
+.}}\def\Vector@Map{\CD@HK4}\def\Slant@Map{\CD@HK{\CD@EF255\else6\fi}}\def
+\Slope@Map{\CD@HK\CD@OC}\def\CD@HK#1#2#3#4#5#6{\CD@LC\def\CD@WK{2}\def\CD@aK{%
+2}\def\CD@ZK{1}\def\CD@bK{1}\let\Horizontal@Map\CD@nI\def\CD@OG{#1}\def\CD@NI
+{\CD@U#2#3#4#5#6}}\def\CD@nI{\CD@TJ\CD@JB\let\CD@ZD\CD@TD\CD@qD}\CD@tG\CD@pE
+\CD@rA\CD@qA\CD@rA\def\cds@missives{\CD@rA}\def\CD@TD{\CD@vE\let\CD@OG\CD@OC
+\CD@x\CD@zE\CD@WF\fi\setbox0\hbox{\incommdiagfalse\CD@HI}\CD@pE\CD@aD\else
+\global\CD@YC\CD@bD\fi\ifvoid6 \ifvoid7 \CD@eE\fi\fi\CD@zE\else\CD@BD\global
+\CD@YC\let\CD@CG\CD@IH\CD@YD\fi\else\CD@NI\CD@MI\global\CD@YC\CD@YD\fi}\def
+\CD@LC{\begingroup\dimen1=\MapShortFall\dimen2=\CD@RG\dimen5=\MapShortFall
+\setbox3=\box\voidb@x\setbox6=\box\voidb@x\setbox7=\box\voidb@x\CD@pD
+\mathsurround\z@\skip2\z@ plus1fill minus 1000pt\skip4\skip2 \CD@TB}\CD@tG
+\CD@tE\CD@UB\CD@TB\def\CD@U#1#2#3#4#5{\let\CD@oJ#1\let\CD@iD#2\let\CD@QG#3%
+\let\CD@jD#4\let\CD@LE#5\CD@TB\ifx\CD@iD\CD@jD\CD@UB\fi}\def\CD@qD#1#2#3#4#5{%
+\CD@U#1#2#3#4#5\CD@tD}\def\Vertical@Map{\CD@pB433{vertical map}\CD@cD\CD@LC
+\CD@GB-9995 \let\CD@kD\@fillv\CD@nF{fill@dot}{df:.}\CD@qD}\def\break@args{%
+\def\CD@tD{\CD@ZD}\CD@ZD\endgroup\aftergroup\CD@FE}\def\CD@MJ{\setbox1=\CD@oJ
+\setbox5=\CD@LE\ifvoid3 \ifx\CD@QG\null\else\setbox3=\CD@QG\fi\fi\CD@@G2%
+\CD@iD\CD@@G4\CD@jD}\def\CD@pF#1{\ifvoid1\else\CD@oF1#1\fi\ifvoid2\else\CD@oF
+2#1\fi\ifvoid3\else\CD@oF3#1\fi\ifvoid4\else\CD@oF4#1\fi\ifvoid5\else\CD@oF5#%
+1\fi} \def\CD@oF#1#2{\setbox#1\vbox{\offinterlineskip\box#1\dimen@\prevdepth
+\advance\dimen@-#2\relax\setbox0\null\dp0\dimen@\ht0-\dimen@\box0}}\def\CD@@G
+#1#2{\ifx#2\CD@kD\setbox#1=\box\voidb@x\else\setbox#1=#2\def#2{\xleaders\box#%
+1}\fi}\CD@ZA\CD@BK{\string\HorizontalMap, \string\VerticalMap\space and
+\string\DiagonalMap\CD@uG are obsolete - use \CD@lG\space to pre-define maps}%
+\def\HorizontalMap#1#2#3#4#5{\CD@BK\CD@nB{old horizontal map}\CD@LC\CD@TJ\def
+\CD@oJ{\CD@UH{#1}}\CD@SH\CD@iD{#2}\def\CD@QG{\CD@UH{#3}}\CD@SH\CD@jD{#4}\def
+\CD@LE{\CD@UH{#5}}\CD@tD}\def\VerticalMap#1#2#3#4#5{\CD@BK\CD@pB433{vertical
+map}\CD@cD\CD@LC\CD@GB-9995 \let\CD@kD\@fillv\def\CD@oJ{\CD@GG{#1}}\CD@VH
+\CD@iD{#2}\def\CD@QG{\CD@GG{#3}}\CD@VH\CD@jD{#4}\def\CD@LE{\CD@GG{#5}}\CD@tD}%
+\def\DiagonalMap#1#2#3#4#5{\CD@BK\CD@LC\def\CD@OG{4}\let\CD@kD\CD@qK\let
+\CD@ZD\CD@YD\def\CD@WK{2}\def\CD@aK{2}\def\CD@ZK{1}\def\CD@bK{1}\def\CD@QG{%
+\CD@vF{#3}}\ifPositiveGradient\let\mv\raise\def\CD@oJ{\CD@vF{#5}}\def\CD@iD{%
+\CD@vF{#4}}\def\CD@jD{\CD@vF{#2}}\def\CD@LE{\CD@vF{#1}}\else\let\mv\lower\def
+\CD@oJ{\CD@vF{#1}}\def\CD@iD{\CD@vF{#2}}\def\CD@jD{\CD@vF{#4}}\def\CD@LE{%
+\CD@vF{#5}}\fi\CD@tD}\def\CD@aE{-}\def\CD@AD{\empty}\def\CD@SH{\CD@EG\CD@bE
+\CD@aE\@fillh}\def\CD@VH{\CD@EG\CD@MK\CD@KK\@fillv}\def\CD@EG#1#2#3#4#5{\def
+\CD@CH{#5}\ifx\CD@CH#2\let#4#3\else\let#4\null\ifx\CD@CH\empty\else\ifx\CD@CH
+\CD@AD\else\let#4\CD@CH\fi\fi\fi}\def\CD@UH#1{\hbox{\mathsurround\z@
+\offinterlineskip\def\CD@CH{#1}\ifx\CD@CH\empty\else\ifx\CD@CH\CD@AD\else
+\CD@k\mkern-1.5mu{\CD@CH}\mkern-1.5mu\CD@ND\fi\fi}}\def\CD@yD#1#2{\setbox#1=%
+\hbox\bgroup\setbox0=\hbox{\CD@k\labelstyle()\CD@ND}%% ASCII round brackets
+\setbox1=\null\ht1\ht0\dp1\dp0\box1 \kern.1\CD@zC\CD@k\bgroup\labelstyle
+\aftergroup\CD@LD\CD@xD}\def\CD@LD{\CD@ND\kern.1\CD@zC\egroup\CD@tD}\def
+\CD@xD{\futurelet\CD@EH\CD@mJ}\def\CD@mJ{%% qualifiers on label arguments
+\catcase\bgroup:\CD@v;\catcase\egroup:\missing@label;\catcase\space:\CD@TF;%
+\tokcase[:\CD@XF;%%]%ascii close square bracket
+\default:\CD@zJ;\endswitch}\def\CD@v{\let\CD@MD\CD@c\let\CD@CH}\def\CD@zJ#1{%
+\let\CD@UF\egroup{\let\actually@braces@missing@around@macro@in@label\CD@ZH
+\let\CD@MD\CD@xC\let\CD@UF\CD@VF#1%
+\actually@braces@missing@around@macro@in@label}\CD@UF}\def
+\actually@braces@missing@around@macro@in@label{\let\CD@CH=}\def\missing@label
+{\egroup\CD@YA{missing label}\CD@PE}\def\CD@xC{\egroup\missing@label}\outer
+\def\CD@ZH{}\def\CD@UF{}\def\CD@VF{\CD@wC\CD@UF}\def\CD@MD{}\def\CD@XF{\let
+\CD@N\CD@xD\get@square@arg\CD@AE}\CD@rG\CD@PE{The text which has just been
+read is not allowed within map labels.}\def\CD@c{\egroup\CD@YA{missing \CD@yC
+\space inserted after label}\CD@PE}\def\upper@label{\CD@oD\CD@yD6}\def
+\lower@label{\def\positional@{\CD@@A\break@args}\CD@yD7}\def\middle@label{%
+\CD@yD3}\CD@tG\CD@yE\CD@pD\CD@oD\def\CD@iF{\ifPositiveGradient\CD@tJ
+\expandafter\upper@label\else\expandafter\lower@label\fi}\def\CD@iI{%
+\ifPositiveGradient\CD@tJ\expandafter\lower@label\else\expandafter
+\upper@label\fi}\def\positional@{\CD@gB{labels as positional arguments are
+obsolete}\CD@yE\CD@tJ\expandafter\upper@label\else\expandafter\lower@label\fi
+-}\def\CD@tD{\futurelet\CD@EH\switch@arg}\def\eat@space{\afterassignment
+\CD@tD\let\CD@EH= }\def\CD@TF{\afterassignment\CD@xD\let\CD@EH= }\def\CD@BC{%
+\get@round@pair\CD@uD}\def\CD@uD#1#2{\def\CD@WK{#1}\def\CD@aK{#2}\CD@tD}\def
+\optional@{\let\CD@N\CD@tD\get@square@arg\CD@AE}\def\CD@JJ.{\CD@sC\CD@tD}\def
+\CD@sC{\let\CD@iD\fill@dot\let\CD@jD\fill@dot\def\CD@MI{\let\CD@iD\dfdot\let
+\CD@jD\dfdot}}\def\CD@MI{}\def\CD@@E#1,{\CD@nH#1,\begingroup\ifx\@name\CD@RD
+\CD@FF\aftergroup\CD@e\fi\aftergroup\CD@jC\else\expandafter\def\expandafter
+\CD@RF\expandafter{\csname\@name\endcsname}\expandafter\CD@vD\CD@RF\CD@KD\ifx
+\CD@RF\empty\aftergroup\CD@pC\expandafter\aftergroup\csname\CD@FB\@name
+\endcsname\expandafter\aftergroup\csname\CD@FB @\@name\endcsname\else\gdef
+\CD@GE{#1}\CD@gB{\string\relax\space inserted before `[\CD@GE'}\message{(I was
+trying to read this as a \CD@tA\ option.)}\aftergroup\CD@H\fi\fi\endgroup}%
+\def\CD@vD#1#2\CD@KD{\def\CD@RF{#2}}\def\CD@jC{\let\CD@CH\CD@N\let\CD@N\relax
+\CD@CH}\def\CD@H#1],{%% ASCII close square bracket
+\CD@jC\relax\def\CD@RF{#1}\ifx\CD@RF\empty\def\CD@RF{[\CD@GE]}%
+%% ASCII open and close square bracket
+\else\def\CD@RF{[\CD@GE,#1]}%% ASCII open and close square bracket
+\fi\CD@RF}\def\CD@pC#1#2{\ifx#2\CD@qK\ifx#1\CD@qK\CD@gB{option `\@name'
+undefined}\else#1\fi\else\CD@FF\expandafter#2\CD@GK\CD@PK\else\CD@QK\fi\fi
+\CD@DH}\CD@tG\CD@FF\CD@QK\CD@PK\def\CD@nH#1,{\CD@FF\ifx\CD@GK\CD@qK\CD@e\else
+\expandafter\CD@oH\CD@GK,#1,(,),(,)[]%
+%%ASCII 5commas two pairs round, pair square
+\fi\fi\CD@FF\else\CD@mH#1==,\fi}\def\CD@e{\CD@gB{option `\@name' needs (x,y)
+value}\CD@PK\let\@name\empty}\def\CD@mH#1=#2=#3,{\def\@name{#1}\def\CD@GK{#2}%
+\def\CD@RF{#3}\ifx\CD@RF\empty\let\CD@GK\CD@qK\fi}%
+%% ASCII 2commas 2pair round, pair square on next line
+\def\CD@oH#1(#2,#3)#4,(#5,#6)#7[]{\def\CD@GK{{#2}{#3}}\def\CD@RF{#1#4#5#6}%
+\ifx\CD@RF\empty\def\CD@RF{#7}\ifx\CD@RF\empty\CD@e\fi\else\CD@e\fi}\def
+\CD@FB{cds@}\let\CD@N\relax\def\CD@zD#1{\ifx\CD@GK\CD@qK\CD@gB{option `\@name
+' needs a value}\else#1\CD@GK\relax\fi}\def\CD@BE#1#2{\ifx\CD@GK\CD@qK#1#2%
+\relax\else#1\CD@GK\relax\fi}\def\cds@@showpair#1#2{\message{x=#1,y=#2}}\def
+\cds@@diagonalbase#1#2{\edef\CD@ZK{#1}\edef\CD@bK{#2}}\def\CD@DI#1{\def\CD@CH
+{#1}\CD@nF{@x}{cdps@#1}\ifx\CD@CH\empty\CD@f\CD@CH{cannot be used}\else\ifx
+\CD@CH\relax\CD@f\CD@CH{unknown}\else\let\CD@IK\@x\fi\fi}\def\CD@f#1#2{\CD@gB
+{PostScript translator `#1' #2}\CD@oK\let\cds@PS\empty\let\cds@noPS\empty}%
+\def\CD@PH{}\def\CD@PJ{\CD@fA\edef\CD@PH{\noexpand\CD@KB{\@name\space ignored
+within maths}}}\def\diagramstyle{\CD@cJ\let\CD@N\relax\CD@CF\CD@AE\CD@AE}\let
+\diagramsstyle\diagramstyle\CD@tG\CD@sE\CD@SB\CD@RB\CD@tG\CD@qE\CD@EB\CD@DB
+\CD@tG\CD@oE\CD@pA\CD@oA\CD@tG\CD@iE\CD@HA\CD@GA\CD@HA\CD@tG\CD@jE\CD@JA
+\CD@IA\CD@tG\CD@kE\CD@LA\CD@KA\CD@tG\CD@EF\CD@DK\CD@CK\CD@tG\CD@rE\CD@JB
+\CD@IB\CD@tG\CD@mE\CD@gA\CD@fA\CD@tG\CD@nE\CD@kA\CD@jA\CD@tG\CD@AF\CD@iG
+\CD@hG\CD@RC{cds@ }{}\CD@RC{cds@}{}\CD@RC{cds@1em}{\CellSize1\CD@zC}\CD@RC{%
+cds@1.5em}{\CellSize1.5\CD@zC}\CD@RC{cds@2em}{\CellSize2\CD@zC}\CD@RC{cds@2.5%
+em}{\CellSize2.5\CD@zC}\CD@RC{cds@3em}{\CellSize3\CD@zC}\CD@RC{cds@3.5em}{%
+\CellSize3.5\CD@zC}\CD@RC{cds@4em}{\CellSize4\CD@zC}\CD@RC{cds@4.5em}{%
+\CellSize4.5\CD@zC}\CD@RC{cds@5em}{\CellSize5\CD@zC}\CD@RC{cds@6em}{\CellSize
+6\CD@zC}\CD@RC{cds@7em}{\CellSize7\CD@zC}\CD@RC{cds@8em}{\CellSize8\CD@zC}%
+\def\cds@abut{\MapsAbut\dimen1\z@\dimen5\z@}\def\cds@alignlabels{\CD@IA\CD@KA
+}\def\cds@amstex{\ifincommdiag\CD@O\else\def\CD{\diagram[amstex]}%
+%%ascii square brackets []
+\fi\CD@T\catcode\lq\@\active}\def\cds@b{\let\CD@dB\CD@bB}\def\cds@balance{%
+\let\CD@hA\CD@AA}\let\cds@bottom\cds@b\def\cds@center{\cds@vcentre
+\cds@nobalance}\let\cds@centre\cds@center\def\cds@centerdisplay{\CD@HA\CD@PJ
+\cds@balance}\let\cds@centredisplay\cds@centerdisplay\def\cds@crab{\CD@BE
+\CD@DC{.5\PileSpacing}}\CD@RC{cds@crab-}{\CD@DC-.5\PileSpacing}\CD@RC{%
+cds@crab+}{\CD@DC.5\PileSpacing}\CD@RC{cds@crab++}{\CD@DC1.5\PileSpacing}%
+\CD@RC{cds@crab--}{\CD@DC-1.5\PileSpacing}\def\cds@defaultsize{\CD@BE{\let
+\CD@QC}{3em}\CD@NJ}\def\cds@displayoneliner{\CD@DB}\let\cds@dotted\CD@sC\def
+\cds@dpi{\CD@RJ{1truein}}\def\cds@dpm{\CD@RJ{100truecm}}\let\CD@XA\CD@qK\def
+\cds@eqno{\let\CD@XA\CD@GK\let\CD@EJ\empty}\def\cds@fixed{\CD@qA}\CD@tG\CD@fE
+\CD@J\CD@I\def\cds@flushleft{\CD@I\CD@GA\CD@PJ\cds@nobalance\CD@BE\CD@nA
+\CD@nA}\def\cds@gap{\CD@AJ\setbox3=\null\ht3=\CD@tI\dp3=\CD@sI\CD@BE{\wd3=}%
+\MapShortFall} \def\cds@grid{\ifx\CD@GK\CD@qK\let\h@grid\relax\let\v@grid
+\relax\else\CD@nF{h@grid}{cdgh@\CD@GK}\CD@nF{v@grid}{cdgv@\CD@GK}\ifx\h@grid
+\relax\CD@gB{unknown grid `\CD@GK'}\else\CD@WB\fi\fi}\let\h@grid\relax\let
+\v@grid\relax\def\cds@gridx{\ifx\CD@GK\CD@qK\else\cds@grid\fi\let\CD@CH
+\h@grid\let\h@grid\v@grid\let\v@grid\CD@CH}\def\cds@h{\CD@zD
+\DiagramCellHeight}\def\cds@hcenter{\let\CD@hA\CD@aA}\let\cds@hcentre
+\cds@hcenter\def\cds@heads{\CD@BE{\let\CD@sJ}\CD@sJ\CD@@J\CD@vE\else\ifx
+\CD@sJ\CD@eF\else\CD@MC\fi\fi}\let\cds@height\cds@h\let\cds@hmiddle
+\cds@balance\def\cds@htriangleheight{\CD@BE\DiagramCellHeight
+\DiagramCellHeight\DiagramCellWidth1.73205\DiagramCellHeight}\def
+\cds@htrianglewidth{\CD@BE\DiagramCellWidth\DiagramCellWidth
+\DiagramCellHeight.57735\DiagramCellWidth}\CD@tG\CD@zE\CD@eE\CD@dE\CD@eE\def
+\cds@hug{\CD@eE} \def\cds@inline{\CD@gA\let\CD@PH\empty}\def
+\cds@inlineoneliner{\CD@EB}\CD@RC{cds@l>}{\CD@zD{\let\CD@RG}\dimen2=\CD@RG}%
+\def\cds@labelstyle{\CD@zD{\let\labelstyle}}\def\cds@landscape{\CD@kA}\def
+\cds@large{\CellSize5\CD@zC}\let\CD@EJ\empty\def\CD@FJ{\refstepcounter{%
+equation}\def\CD@XA{\hbox{\@eqnnum}}}\def\cds@LaTeXeqno{\let\CD@EJ\CD@FJ}\def
+\cds@lefteqno{\CD@pA}\def\cds@leftflush{\cds@flushleft\CD@J}\def
+\cds@leftshortfall{\CD@zD{\dimen1 }}\def\cds@lowershortfall{%
+\ifPositiveGradient\cds@leftshortfall\else\cds@rightshortfall\fi}\def
+\cds@loose{\CD@VB}\def\cds@midhshaft{\CD@JA}\def\cds@midshaft{\CD@JA}\def
+\cds@midvshaft{\CD@LA}\def\cds@moreoptions{\CD@@A}\let\cds@nobalance
+\cds@hcenter\def\cds@nohcheck{\CD@HH}\def\cds@nohug{\CD@dE} \def
+\cds@nooptions{\def\CD@aC{\CD@WD}}\let\cds@noorigin\cds@nobalance\def
+\cds@nopixel{\CD@@I4\CD@XH\CD@cJ}\def\cds@UO{\CD@oK\global\let\CD@n\empty}%
+\def\cds@UglyObsolete{\cds@UO\let\cds@PS\empty\let\cds@noPS\empty}\ifnum\year
+<2008 \let\cds@noPostScript\UglyObsolete\let\cds@noPS\cds@UO\else\def
+\cds@noPS{\CD@gB{option `noPS' no longer recognised}}\def\cds@noPS{\CD@gB{%
+option `noPostScript' no longer recognised}}\fi\def\cds@notextflow{\CD@RB}%
+\def\cds@noPS{\CD@oK\global\let\CD@n\empty}\def\cds@noTPIC{\CD@CK}\def
+\cds@objectstyle{\CD@zD{\let\objectstyle}}\def\cds@origin{\let\CD@hA\CD@iB}%
+\def\cds@p{\CD@zD\PileSpacing}\let\cds@pilespacing\cds@p\def\cds@pixelsize{%
+\CD@zD\CD@@I\CD@gI}\def\cds@portrait{\CD@jA}\def\cds@PostScript{\CD@nK\global
+\let\CD@n\empty\CD@BE\CD@DI\empty}\def\cds@PS{\CD@nK\global\let\CD@n\empty}%
+\CD@GF\CD@n{\typeout{\CD@tA: try the PostScript option for better results}}%
+\def\cds@repositionpullbacks{\let\make@pbk\CD@fH\let\CD@qH\CD@pH}\def
+\cds@righteqno{\CD@oA}\def\cds@rightshortfall{\CD@zD{\dimen5 }}\def
+\cds@ruleaxis{\CD@zD{\let\axisheight}}\def\cds@cmex{\let\CD@GG\CD@sB\let
+\CD@QJ\CD@CJ}\def\cds@s{\cds@height\DiagramCellWidth\DiagramCellHeight}\def
+\cds@scriptlabels{\let\labelstyle\scriptstyle}\def\cds@shortfall{\CD@zD
+\MapShortFall\dimen1\MapShortFall\dimen5\MapShortFall}\def\cds@showfirstpass{%
+\CD@BE{\let\CD@nD}\z@}\def\cds@silent{\def\CD@KB##1{}\def\CD@gB##1{}}\let
+\cds@size\cds@s\def\cds@small{\CellSize2\CD@zC}\def\cds@snake{\CD@BE\CD@eJ\z@
+}\def\cds@t{\let\CD@dB\CD@fB}\def\cds@textflow{\CD@SB\CD@PJ}\def\cds@thick{%
+\let\CD@rF\tenlnw\CD@LF\CD@NC\CD@BE\MapBreadth{2\CD@LF}\CD@@J}\def\cds@thin{%
+\let\CD@rF\tenln\CD@BE\MapBreadth{\CD@NC}\CD@@J}\def\cds@tight{\CD@WB}\let
+\cds@top\cds@t\def\cds@TPIC{\CD@DK}\def\cds@uppershortfall{%
+\ifPositiveGradient\cds@rightshortfall\else\cds@leftshortfall\fi}\def
+\cds@vcenter{\let\CD@dB\CD@cB}\let\cds@vcentre\cds@vcenter\def
+\cds@vtriangleheight{\CD@BE\DiagramCellHeight\DiagramCellHeight
+\DiagramCellWidth.577035\DiagramCellHeight}\def\cds@vtrianglewidth{\CD@BE
+\DiagramCellWidth\DiagramCellWidth\DiagramCellHeight1.73205\DiagramCellWidth}%
+\def\cds@vmiddle{\let\CD@dB\CD@eB}\def\cds@w{\CD@zD\DiagramCellWidth}\let
+\cds@width\cds@w\def\diagram{\relax\protect\CD@bC}\def\enddiagram{\protect
+\CD@SG}\def\CD@bC{\CD@g\CD@uI\incommdiagtrue\edef\CD@wI{\the\CD@NB}\global
+\CD@NB\z@\boxmaxdepth\maxdimen\everycr{}\everymath{}\everyhbox{}\ifx
+\pdfoutput\CD@qK\else\ifx\pdfoutput\relax\else\ifnum\pdfoutput>\z@\CD@pK\fi
+\fi\fi\CD@aC}\def\CD@aC{\CD@y\let\CD@N\CD@ZC\CD@CF\CD@AE\CD@WD}\def\CD@ZC{%
+\CD@gE\expandafter\CD@aC\else\expandafter\CD@WD\fi}\def\CD@WD{\let\CD@EH
+\relax\CD@nE\CD@vE\else\CD@hK\else\CD@KB{landscape ignored without PostScript%
+}\CD@jA\fi\fi\fi\CD@EJ\setbox2=\vbox\bgroup\CD@JF\CD@VD}\def\CD@cH{\CD@nE
+\CD@fB\else\CD@dB\fi\CD@hA\nointerlineskip\setbox0=\null\ht0-\CD@pI\dp0\CD@pI
+\wd0\CD@kI\box0 \global\CD@QA\CD@kF\global\CD@yA\CD@XB\ifx\CD@NK\CD@qK\global
+\CD@RA\CD@kF\else\global\CD@RA\CD@NK\fi\egroup\CD@zF\CD@nE\setbox2=\hbox to%
+\dp2{\vrule height\wd2 depth\CD@QA width\z@\global\CD@QA\ht2\ht2\z@\dp2\z@\wd
+2\z@\CD@hK\pdfliteral{q 0 1 -1 0 0 0 cm}\else\global\CD@iG\CD@IK{0 1 bturn}%
+\fi\box2\CD@gK\hss}\CD@DB\fi\ifnum\CD@yA=1 \else\CD@DB\fi\global\@ignorefalse
+\CD@mE\leavevmode\fi\ifvmode\CD@TA\else\ifmmode\CD@PH\CD@GI\else\CD@qE\CD@gA
+\fi\ifinner\CD@gA\fi\CD@mE\CD@GI\else\CD@sE\CD@QB\else\CD@TA\fi\fi\fi\fi
+\CD@dD}\def\CD@dD{\global\CD@NB\CD@wI\relax\CD@xE\global\CD@ID\else
+\aftergroup\CD@mC\fi\if@ignore\aftergroup\ignorespaces\fi\CD@wC\ignorespaces}%
+\def\CD@fB{\advance\CD@pI\dimen1\relax}\def\CD@eB{\advance\CD@pI.5\dimen1%
+\relax}\def\CD@bB{}\def\CD@cB{\CD@fB\advance\CD@pI\CD@YB\divide\CD@pI2
+\advance\CD@pI-\axisheight\relax}\def\CD@aA{}\def\CD@iB{\CD@kF\z@}\def\CD@AA{%
+\ifdim\dimen2>\CD@kF\CD@kF\dimen2 \else\dimen2\CD@kF\CD@kI\dimen0 \advance
+\CD@kI\dimen2 \fi}\def\CD@QB{\skip0\z@\relax\loop\skip1\lastskip\ifdim\skip1>%
+\z@\unskip\advance\skip0\skip1 \repeat\vadjust{\prevdepth\dp\strutbox\penalty
+\predisplaypenalty\vskip\abovedisplayskip\CD@UA\penalty\postdisplaypenalty
+\vskip\belowdisplayskip}\ifdim\skip0=\z@\else\hskip\skip0 \global\@ignoretrue
+\fi}\def\CD@TA{\CD@LG\kern-\displayindent\CD@UA\CD@LG\global\@ignoretrue}\def
+\CD@UA{\hbox to\hsize{\CD@fE\ifdim\CD@RA=\z@\else\advance\CD@QA-\CD@RA\setbox
+2=\hbox{\kern\CD@RA\box2}\fi\fi\setbox1=\hbox{\ifx\CD@XA\CD@qK\else\CD@k
+\CD@XA\CD@ND\fi}\CD@oE\CD@iE\else\advance\CD@QA\wd1 \fi\wd1\z@\box1 \fi\dimen
+0\wd2 \advance\dimen0\wd1 \advance\dimen0-\hsize\ifdim\dimen0>-\CD@nA\CD@HA
+\fi\advance\dimen0\CD@QA\ifdim\dimen0>\z@\CD@KB{wider than the page by \the
+\dimen0 }\CD@HA\fi\CD@iE\hss\else\CD@V\CD@QA\CD@nA\fi\CD@GI\hss\kern-\wd1\box
+1 }}\def\CD@GI{\CD@AF\CD@@F\else\CD@SC\global\CD@hG\fi\fi\kern\CD@QA\box2 }%
+\CD@tG\CD@wE\CD@YC\CD@XC\def\CD@JF{\CD@cJ\ifdim\DiagramCellHeight=-\maxdimen
+\DiagramCellHeight\CD@QC\fi\ifdim\DiagramCellWidth=-\maxdimen
+\DiagramCellWidth\CD@QC\fi\global\CD@XC\CD@IF\let\CD@FE\empty\let\CD@z\CD@Q
+\let\overprint\CD@eH\let\CD@s\CD@rJ\let\enddiagram\CD@ED\let\\\CD@cC\let\par
+\CD@jH\let\CD@MD\empty\let\switch@arg\CD@PB\let\shift\CD@iA\baselineskip
+\DiagramCellHeight\lineskip\z@\lineskiplimit\z@\mathsurround\z@\tabskip\z@
+\CD@OB}\def\CD@VD{\penalty-123 \begingroup\CD@jA\aftergroup\CD@K\halign
+\bgroup\global\advance\CD@NB1 \vadjust{\penalty1}\global\CD@FA\z@\CD@OB\CD@j#%
+#\CD@DD\CD@Q\CD@Q\CD@OI\CD@j##\CD@DD\cr}\def\CD@ED{\CD@MD\CD@GD\crcr\egroup
+\global\CD@JD\endgroup}\def\CD@j{\global\advance\CD@FA1 \futurelet\CD@EH\CD@i
+}\def\CD@i{\ifx\CD@EH\CD@DD\CD@tJ\hskip1sp plus 1fil \relax\let\CD@DD\relax
+\CD@vI\else\hfil\CD@k\objectstyle\let\CD@FE\CD@d\fi}\def\CD@DD{\CD@MD\relax
+\CD@yI\CD@vI\global\CD@QA\CD@iA\penalty-9993 \CD@ND\hfil\null\kern-2\CD@QA
+\null}\def\CD@cC{\cr}\def\across#1{\span\omit\mscount=#1 \global\advance
+\CD@FA\mscount\global\advance\CD@FA\m@ne\CD@sF\ifnum\mscount>2 \CD@fJ\repeat
+\ignorespaces}\def\CD@fJ{\relax\span\omit\advance\mscount\m@ne}\def\CD@qJ{%
+\ifincommdiag\ifx\CD@iD\@fillh\ifx\CD@jD\@fillh\ifdim\dimen3>\z@\else\ifdim
+\dimen2>93\CD@@I\ifdim\dimen2>18\p@\ifdim\CD@LF>\z@\count@\CD@bJ\advance
+\count@\m@ne\ifnum\count@<\z@\count@20\let\CD@aJ\CD@uJ\fi\xdef\CD@bJ{\the
+\count@}\fi\fi\fi\fi\fi\fi\fi}\def\CD@cG#1{\vrule\horizhtdp width#1\dimen@
+\kern2\dimen@}\def\CD@uJ{\rlap{\dimen@\CD@@I\CD@V\dimen@{.182\p@}\CD@zH
+\dimen@\advance\CD@tI\dimen@\CD@cG0\CD@cG0\CD@cG2\CD@cG6\CD@cG6\CD@cG2\CD@cG0%
+\CD@cG0\CD@cG2\CD@cG6\CD@cG0\CD@cG0\CD@cG2\CD@cG2\CD@cG6\CD@cG0\CD@cG0\CD@cG2%
+\CD@cG6\CD@cG2\CD@cG2\CD@cG0\CD@cG0}}\def\CD@bJ{10}\def\CD@aJ{}\def\CD@XD{%
+\CD@gE\CD@TB\fi\CD@x\CD@WF\CD@HI}\def\CD@x{\CD@QJ\CD@DC\CD@MJ\ifdim\CD@DC=\z@
+\else\CD@pF\CD@DC\fi\ifvoid3 \setbox3=\null\ht3\CD@tI\dp3\CD@sI\else\CD@V{\ht
+3}\CD@tI\CD@V{\dp3}\CD@sI\fi\dimen3=.5\wd3 \ifdim\dimen3=\z@\CD@tE\else\dimen
+3-\CD@XH\fi\else\CD@TB\fi\CD@V{\dimen2}{\wd7}\CD@V{\dimen2}{\wd6}\CD@qJ
+\advance\dimen2-2\dimen3 \dimen4.5\dimen2 \dimen2\dimen4 \advance\dimen2%
+\CD@eJ\advance\dimen4-\CD@eJ\advance\dimen2-\wd1 \advance\dimen4-\wd5 \ifvoid
+2 \else\CD@V{\ht3}{\ht2}\CD@V{\dp3}{\dp2}\CD@V{\dimen2}{\wd2}\fi\ifvoid4 \else
+\CD@V{\ht3}{\ht4}\CD@V{\dp3}{\dp4}\CD@V{\dimen4}{\wd4}\fi\advance\skip2\dimen
+2 \advance\skip4\dimen4 \CD@tE\advance\skip2\skip4 \dimen0\dimen5 \advance
+\dimen0\wd5 \skip3-\skip4 \advance\skip3-\dimen0 \let\CD@jD\empty\else\skip3%
+\z@\relax\dimen0\z@\fi}\def\CD@WF{\offinterlineskip\lineskip.2\CD@zC\ifvoid6
+\else\setbox3=\vbox{\hbox to2\dimen3{\hss\box6\hss}\box3}\fi\ifvoid7 \else
+\setbox3=\vtop{\box3 \hbox to2\dimen3{\hss\box7\hss}}\fi}\def\CD@HI{\kern
+\dimen1 \box1 \CD@aJ\CD@iD\hskip\skip2 \kern\dimen0 \ifincommdiag\CD@jE
+\penalty1\fi\kern\dimen3 \penalty\CD@GB\hskip\skip3 \null\kern-\dimen3 \else
+\hskip\skip3 \fi\box3 \CD@jD\hskip\skip4 \box5 \kern\dimen5}\def\CD@MF{\ifnum
+\CD@LH>\CD@TC\CD@V{\dimen1}\objectheight\CD@V{\dimen5}\objectheight\else\CD@V
+{\dimen1}\objectwidth\CD@V{\dimen5}\objectwidth\fi}\def\CD@Y{\begingroup
+\ifdim\dimen7=\z@\kern\dimen8 \else\ifdim\dimen6=\z@\kern\dimen9 \else\dimen5%
+\dimen6 \dimen6\dimen9 \CD@KJ\dimen4\dimen2 \CD@dG{\dimen4}\dimen6\dimen5
+\dimen7\dimen8 \CD@KJ\CD@iC{\dimen2}\ifdim\dimen2<\dimen4 \kern\dimen2 \else
+\kern\dimen4 \fi\fi\fi\endgroup}\def\CD@jJ{\CD@JI\setbox\z@\hbox{\lower
+\axisheight\hbox to\dimen2{\CD@DF\ifPositiveGradient\dimen8\ht\CD@MH\dimen9%
+\CD@mI\else\dimen8\dp3 \dimen9\dimen1 \fi\else\dimen8 \ifPositiveGradient
+\objectheight\else\z@\fi\dimen9\objectwidth\fi\advance\dimen8
+\ifPositiveGradient-\fi\axisheight\CD@Y\unhbox\z@\CD@DF\ifPositiveGradient
+\dimen8\dp3 \dimen9\dimen0 \else\dimen8\ht\CD@MH\dimen9\CD@mF\fi\else\dimen8
+\ifPositiveGradient\z@\else\objectheight\fi\dimen9\objectwidth\fi\advance
+\dimen8 \ifPositiveGradient\else-\fi\axisheight\CD@Y}}}\def\CD@bD{\dimen6
+\CD@aK\DiagramCellHeight\dimen7 \CD@WK\DiagramCellWidth\CD@jJ
+\ifPositiveGradient\advance\dimen7-\CD@ZK\DiagramCellWidth\else\dimen7 \CD@ZK
+\DiagramCellWidth\dimen6\z@\fi\advance\dimen6-\CD@bK\DiagramCellHeight\CD@mK
+\setbox0=\rlap{\kern-\dimen7 \lower\dimen6\box\z@}\ht0\z@\dp0\z@\raise
+\axisheight\box0 }\def\CD@mK{\setbox0\hbox{\ht\z@\z@\dp\z@\z@\wd\z@\z@\CD@hK
+\expandafter\pdfliteral{q \CD@eK\space\CD@lK\space\CD@kK\space\CD@eK\space0 0
+cm}\else\global\CD@iG\CD@eD{\the\CD@TC\space\ifPositiveGradient\else-\fi\the
+\CD@LH\space bturn}\fi\box\z@\CD@gK}}\def\CD@vB{\advance\CD@hF-\CD@mI\CD@wJ
+\CD@hF\advance\CD@wJ\CD@hI\ifvoid\CD@sH\ifdim\CD@wJ<.1em\ifnum\CD@gD=\@m\else
+\CD@aG h\CD@wJ<.1em:objects overprint:\CD@FA\CD@gD\fi\fi\else\ifhbox\CD@sH
+\CD@SK\else\CD@TK\fi\advance\CD@wJ\CD@mI\CD@bH{-\CD@mI}{\box\CD@sH}{\CD@wJ}%
+\z@\fi\CD@hF-\CD@mF\CD@gD\CD@FA\CD@hI\z@}\def\CD@SK{\setbox\CD@sH=\hbox{%
+\unhbox\CD@sH\unskip\unpenalty}\setbox\CD@tH=\hbox{\unhbox\CD@tH\unskip
+\unpenalty}\setbox\CD@sH=\hbox to\CD@wJ{\CD@OA\wd\CD@sH\unhbox\CD@sH\CD@PA
+\lastkern\unkern\ifdim\CD@PA=\z@\CD@UB\advance\CD@OA-\wd\CD@tH\else\CD@TB\fi
+\ifnum\lastpenalty=\z@\else\CD@JA\unpenalty\fi\kern\CD@PA\ifdim\CD@hF<\CD@OA
+\CD@JA\fi\ifdim\CD@hI<\wd\CD@tH\CD@JA\fi\CD@jE\CD@hI\CD@wJ\advance\CD@hI-%
+\CD@OA\advance\CD@hI\wd\CD@tH\ifdim\CD@hI<2\wd\CD@tH\CD@aG h\CD@hI<2\wd\CD@tH
+:arrow too short:\CD@FA\CD@gD\fi\divide\CD@hI\tw@\CD@hF\CD@wJ\advance\CD@hF-%
+\CD@hI\fi\CD@tE\kern-\CD@hI\fi\hbox to\CD@hI{\unhbox\CD@tH}\CD@HG}}\CD@tG
+\ifinpile\inpiletrue\inpilefalse\inpilefalse\def\pile{\protect\CD@UJ\protect
+\CD@uH}\def\CD@uH#1{\CD@l#1\CD@QD}\def\CD@UJ{\CD@nB{pile}\setbox0=\vtop
+\bgroup\aftergroup\CD@lD\inpiletrue\let\CD@FE\empty\let\pile\CD@KF\let\CD@QD
+\CD@PD\let\CD@GD\CD@FD\CD@yH\baselineskip.5\PileSpacing\lineskip.1\CD@zC
+\relax\lineskiplimit\lineskip\mathsurround\z@\tabskip\z@\let\\\CD@wH}\def
+\CD@l{\CD@DE\CD@YF\empty\halign\bgroup\hfil\CD@k\let\CD@FE\CD@d\let\\\CD@vH##%
+\CD@MD\CD@ND\hfil\CD@Q\CD@R##\cr}\CD@rG\CD@NE{pile only allows one column.}%
+\CD@rG\CD@UE{you left it out!}\def\CD@R{\CD@QD\CD@Q\relax\CD@YA{missing \CD@yC
+\space inserted after \string\pile}\CD@NE}\def\CD@PD{\CD@MD\crcr\egroup
+\egroup}\def\CD@GD{\CD@MD}\def\CD@FD{\CD@MD\relax\CD@QD\CD@YA{missing \CD@yC
+\space inserted between \string\pile\space and \CD@HD}\CD@UE}\def\CD@QD{%
+\CD@MD}\def\CD@lD{\vbox{\dimen1\dp0 \unvbox0 \setbox0=\lastbox\advance\dimen1%
+\dp0 \nointerlineskip\box0 \nointerlineskip\setbox0=\null\dp0.5\dimen1\ht0-%
+\dp0 \box0}\ifincommdiag\CD@tJ\penalty-9998 \fi\xdef\CD@YF{pile}}\def\CD@vH{%
+\cr}\def\CD@wH{\noalign{\skip@\prevdepth\advance\skip@-\baselineskip
+\prevdepth\skip@}}\def\CD@KF#1{#1}\def\CD@TK{\setbox\CD@sH=\vbox{\unvbox
+\CD@sH\setbox1=\lastbox\setbox0=\box\voidb@x\CD@tF\setbox\CD@sH=\lastbox
+\ifhbox\CD@sH\CD@rC\repeat\unvbox0 \global\CD@QA\CD@ZE}\CD@ZE\CD@QA}\def
+\CD@rC{\CD@jE\setbox\CD@sH=\hbox{\unhbox\CD@sH\unskip\setbox\CD@sH=\lastbox
+\unskip\unhbox\CD@sH}\ifdim\CD@wJ<\wd\CD@sH\CD@aG h\CD@wJ<\wd\CD@sH:arrow in
+pile too short:\CD@FA\CD@gD\else\setbox\CD@sH=\hbox to\CD@wJ{\unhbox\CD@sH}%
+\fi\else\CD@gJ\fi\setbox0=\vbox{\box\CD@sH\nointerlineskip\ifvoid0 \CD@tJ\box
+1 \else\vskip\skip0 \unvbox0 \fi}\skip0=\lastskip\unskip}\def\CD@gJ{\penalty7
+\noindent\unhbox\CD@sH\unskip\setbox\CD@sH=\lastbox\unskip\unhbox\CD@sH
+\endgraf\setbox\CD@tH=\lastbox\unskip\setbox\CD@tH=\hbox{\CD@JG\unhbox\CD@tH
+\unskip\unskip\unpenalty}\ifcase\prevgraf\cd@shouldnt P\or\ifdim\CD@wJ<\wd
+\CD@tH\CD@aG h\CD@wJ<\wd\CD@sH:object in pile too wide:\CD@FA\CD@gD\setbox
+\CD@sH=\hbox to\CD@wJ{\hss\unhbox\CD@tH\hss}\else\setbox\CD@sH=\hbox to\CD@wJ
+{\hss\kern\CD@hF\unhbox\CD@tH\kern\CD@hI\hss}\fi\or\setbox\CD@sH=\lastbox
+\unskip\CD@SK\else\cd@shouldnt Q\fi\unskip\unpenalty}\def\CD@cD{\CD@MJ\ifvoid
+3 \setbox3=\null\ht3\axisheight\dp3-\ht3 \dimen3.5\CD@LF\else\dimen4\dp3
+\dimen3.5\wd3 \setbox3=\CD@GG{\box3}\dp3\dimen4 \ifdim\ht3=-\dp3 \else\CD@TB
+\fi\fi\dimen0\dimen3 \advance\dimen0-.5\CD@LF\setbox0\null\ht0\ht3\dp0\dp3\wd
+0\wd3 \ifvoid6\else\setbox6\hbox{\unhbox6\kern\dimen0\kern2pt}\dimen0\wd6 \fi
+\ifvoid7\else\setbox7\hbox{\kern2pt\kern\dimen3\unhbox7}\dimen3\wd7 \fi
+\setbox3\hbox{\ifvoid6\else\kern-\dimen0\unhbox6\fi\unhbox3 \ifvoid7\else
+\unhbox7\kern-\dimen3\fi}\ht3\ht0\dp3\dp0\wd3\wd0 \CD@tE\dimen4=\ht\CD@MH
+\advance\dimen4\dp5 \advance\dimen4\dimen1 \let\CD@jD\empty\else\dimen4\ht3
+\fi\setbox0\null\ht0\dimen4 \offinterlineskip\setbox8=\vbox spread2ex{\kern
+\dimen5 \box1 \CD@iD\vfill\CD@tE\else\kern\CD@eJ\fi\box0}\ht8=\z@\setbox9=%
+\vtop spread2ex{\kern-\ht3 \kern-\CD@eJ\box3 \CD@jD\vfill\box5 \kern\dimen1}%
+\dp9=\z@\hskip\dimen0plus.0001fil \box9 \kern-\CD@LF\box8 \CD@kE\penalty2 \fi
+\CD@tE\penalty1 \fi\kern\PileSpacing\kern-\PileSpacing\kern-.5\CD@LF\penalty
+\CD@GB\null\kern\dimen3}\def\CD@cI{\ifhbox\CD@VA\CD@KB{clashing verticals}\ht
+\CD@MH.5\dp\CD@VA\dp\CD@MH-\ht5 \CD@yB\ht\CD@MH\z@\dp\CD@MH\z@\fi\dimen1\dp
+\CD@VA\CD@xA\prevgraf\unvbox\CD@VA\CD@wA\lastpenalty\unpenalty\setbox\CD@VA=%
+\null\setbox\CD@lI=\hbox{\CD@JG\unhbox\CD@lI\unskip\unpenalty\dimen0\lastkern
+\unkern\unkern\unkern\kern\dimen0 \CD@HG}\setbox\CD@lF=\hbox{\unhbox\CD@lF
+\dimen0\lastkern\unkern\unkern\global\CD@QA\lastkern\unkern\kern\dimen0 }%
+\CD@tF\ifnum\CD@xA>4 \CD@zI\repeat\unskip\unskip\advance\CD@mF.5\wd\CD@VA
+\advance\CD@mF\wd\CD@lF\advance\CD@mI.5\wd\CD@VA\advance\CD@mI\wd\CD@lI\ifnum
+\CD@FA=\CD@lA\CD@OA.5\wd\CD@VA\edef\CD@NK{\the\CD@OA}\fi\setbox\CD@VA=\hbox{%
+\kern-\CD@mF\box\CD@lF\unhbox\CD@VA\box\CD@lI\kern-\CD@mI\penalty\CD@wA
+\penalty\CD@NB}\ht\CD@VA\dimen1 \dp\CD@VA\z@\wd\CD@VA\CD@tB\CD@vB}\def\CD@zI{%
+\ifdim\wd\CD@lF<\CD@QA\setbox\CD@lF=\hbox to\CD@QA{\CD@JG\unhbox\CD@lF}\fi
+\advance\CD@xA\m@ne\setbox\CD@VA=\hbox{\box\CD@lF\unhbox\CD@VA}\unskip\setbox
+\CD@lF=\lastbox\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip\unpenalty\dimen0%
+\lastkern\unkern\unkern\global\CD@QA\lastkern\unkern\kern\dimen0 }}\def\CD@yB
+{\dimen1\dp\CD@VA\ifhbox\CD@VA\CD@xB\else\CD@zB\fi\setbox\CD@VA=\vbox{%
+\penalty\CD@NB}\dp\CD@VA-\dp\CD@MH\wd\CD@VA\CD@tB}\def\CD@zB{\unvbox\CD@VA
+\CD@wA\lastpenalty\unpenalty\ifdim\dimen1<\ht\CD@MH\CD@aG v\dimen1<\ht\CD@MH:%
+rows overprint:\CD@NB\CD@wA\fi}\def\CD@xB{\dimen0=\ht\CD@VA\setbox\CD@VA=%
+\hbox\bgroup\advance\dimen1-\ht\CD@MH\unhbox\CD@VA\CD@xA\lastpenalty
+\unpenalty\CD@wA\lastpenalty\unpenalty\global\CD@RA-\lastkern\unkern\setbox0=%
+\lastbox\CD@tF\setbox\CD@VA=\hbox{\box0\unhbox\CD@VA}\setbox0=\lastbox\ifhbox
+0 \CD@kJ\repeat\global\CD@SA-\lastkern\unkern\global\CD@QA\CD@JK\unhbox\CD@VA
+\egroup\CD@JK\CD@QA\CD@bH{\CD@SA}{\box\CD@VA}{\CD@RA}{\dimen1}}\def\CD@kJ{%
+\setbox0=\hbox to\wd0\bgroup\unhbox0 \unskip\unpenalty\dimen7\lastkern\unkern
+\ifnum\lastpenalty=1 \unpenalty\CD@UB\else\CD@TB\fi\ifnum\lastpenalty=2
+\unpenalty\dimen2.5\dimen0\advance\dimen2-.5\dimen1\advance\dimen2-%
+\axisheight\else\dimen2\z@\fi\setbox0=\lastbox\dimen6\lastkern\unkern\setbox1%
+=\lastbox\setbox0=\vbox{\unvbox0 \CD@tE\kern-\dimen1 \else\ifdim\dimen2=\z@
+\else\kern\dimen2 \fi\fi}\ifdim\dimen0<\ht0 \CD@aG v\dimen0<\ht0:upper part of
+vertical too short:{\CD@tE\CD@NB\else\CD@wA\fi}\CD@xA\else\setbox0=\vbox to%
+\dimen0{\unvbox0}\fi\setbox1=\vtop{\unvbox1}\ifdim\dimen1<\dp1 \CD@aG v\dimen
+1<\dp1:lower part of vertical too short:\CD@NB\CD@wA\else\setbox1=\vtop to%
+\dimen1{\ifdim\dimen2=\z@\else\kern-\dimen2 \fi\unvbox1 }\fi\box1 \kern\dimen
+6 \box0 \kern\dimen7 \CD@HG\global\CD@QA\CD@JK\egroup\CD@JK\CD@QA\relax}%
+\countdef\CD@u=14 \newcount\CD@CA\newcount\CD@XB\newcount\CD@NB\let\CD@LB
+\insc@unt\newcount\CD@FA\newcount\CD@lA\let\CD@mA\CD@XB\newcount\CD@MB\CD@tG
+\CD@DF\CD@bI\CD@aI\CD@aI\def\CD@nD{-1}\def\CD@K{\ifnum\CD@nD<\z@\else
+\begingroup\scrollmode\showboxdepth\CD@nD\showboxbreadth\maxdimen\showlists
+\endgroup\fi\CD@bI\CD@zF\CD@CA=\CD@u\advance\CD@CA1 \CD@XB=\CD@CA\ifnum\CD@NB
+=1 \CD@JA\fi\advance\CD@XB\CD@NB\dimen1\z@\skip0\z@\count@=\insc@unt\advance
+\count@\CD@u\divide\count@2 \ifnum\CD@XB>\count@\CD@KB{The diagram has too
+many rows! It can't be reformatted.}\else\CD@NG\CD@WI\fi\CD@cH}\def\CD@NG{%
+\CD@NB\CD@CA\CD@uF\ifnum\CD@NB<\CD@XB\setbox\CD@NB\box\voidb@x\advance\CD@NB1%
+\relax\repeat\CD@NB\CD@CA\skip\z@\z@\CD@uF\CD@GB\lastpenalty\unpenalty\ifnum
+\CD@GB>\z@\CD@KE\repeat\ifnum\CD@GB=-123 \CD@tJ\unpenalty\else\cd@shouldnt D%
+\fi\ifx\v@grid\relax\else\CD@NB\CD@XB\advance\CD@NB\m@ne\expandafter\CD@VJ
+\v@grid\fi\CD@MB\CD@mA\CD@tB\z@\CD@XG\ifx\h@grid\relax\else\expandafter\CD@LJ
+\h@grid\fi\count@\CD@XB\advance\count@\m@ne\CD@YB\ht\count@}\def\CD@KE{%
+\ifcase\CD@GB\or\CD@MG\else\CD@uA-\lastpenalty\unpenalty\CD@vA\lastpenalty
+\unpenalty\setbox0=\lastbox\CD@WG\fi\CD@wD}\def\CD@wD{\skip1\lastskip\unskip
+\advance\skip0\skip1 \ifdim\skip1=\z@\else\expandafter\CD@wD\fi}\def\CD@MG{%
+\setbox0=\lastbox\CD@pI\dp0 \advance\CD@pI\skip\z@\skip\z@\z@\advance\CD@NF
+\CD@pI\CD@uE\ifnum\CD@NB>\CD@CA\CD@NF\DiagramCellHeight\CD@pI\CD@NF\advance
+\CD@pI-\CD@qI\fi\fi\CD@qI\ht0 \CD@NF\CD@qI\setbox\CD@NB\hbox{\unhbox\CD@NB
+\unhbox0}\dp\CD@NB\CD@pI\ht\CD@NB\CD@qI\advance\CD@NB1 }\def\CD@WG{\ifnum
+\CD@uA<\z@\advance\CD@uA\CD@XB\ifnum\CD@uA<\CD@CA\CD@UG\else\CD@OA\dp\CD@uA
+\CD@PA\ht\CD@uA\setbox\CD@uA\hbox{\box\z@\penalty\CD@vA\penalty\CD@GB\unhbox
+\CD@uA}\dp\CD@uA\CD@OA\ht\CD@uA\CD@PA\fi\else\CD@UG\fi}\def\CD@UG{\CD@KB{%
+diagonal goes outside diagram (lost)}}\def\CD@fI{\advance\CD@uA\CD@XB\ifnum
+\CD@uA<\CD@CA\CD@UG\else\ifnum\CD@uA=\CD@NB\CD@VG\else\ifnum\CD@uA>\CD@NB
+\cd@shouldnt M\else\CD@OA\dp\CD@uA\CD@PA\ht\CD@uA\setbox\CD@uA\hbox{\box\z@
+\penalty\CD@vA\penalty\CD@GB\unhbox\CD@uA}\dp\CD@uA\CD@OA\ht\CD@uA\CD@PA\fi
+\fi\fi}\def\CD@WI{\CD@t\CD@AJ\setbox\CD@PC=\hbox{\CD@k A\@super f\CD@lJ f%
+\CD@ND}\CD@ZE\z@\CD@JK\z@\CD@kI\z@\CD@kF\z@\CD@NB=\CD@XB\CD@NF\z@\CD@uB\z@
+\CD@uF\ifnum\CD@NB>\CD@CA\advance\CD@NB\m@ne\CD@qI\ht\CD@NB\CD@pI\dp\CD@NB
+\advance\CD@NF\CD@qI\CD@rI\advance\CD@uB\CD@NF\CD@KC\CD@ZI\CD@w\ht\CD@NB
+\CD@qI\dp\CD@NB\CD@pI\nointerlineskip\box\CD@NB\CD@NF\CD@pI\setbox\CD@NB\null
+\ht\CD@NB\CD@uB\repeat\CD@wB\nointerlineskip\box\CD@NB\CD@gG\CD@ZE
+\DiagramCellWidth{width}\CD@gG\CD@JK\DiagramCellHeight{height}\CD@VA\CD@LB
+\advance\CD@VA-\CD@lA\advance\CD@VA\m@ne\advance\CD@VA\CD@mA\dimen0\wd\CD@VA
+\CD@tI\axisheight\dimen1\CD@uB\advance\dimen1-\CD@YB\dimen2\CD@kI\advance
+\dimen2-\dimen0 \advance\CD@XB-\CD@CA\advance\CD@LB-\CD@lA}\count@\year
+\multiply\count@12 \advance\count@\month\ifnum\count@>24110 \loop\iftrue
+\message{gone February 2009!}\repeat\fi\def\CD@wB{\CD@qI-\CD@NF\CD@pI\CD@NF
+\setbox\CD@MH=\null\dp\CD@MH\CD@NF\ht\CD@MH-\CD@NF\CD@mF\z@\CD@mI\z@\CD@lA
+\CD@LB\advance\CD@lA-\CD@MB\advance\CD@lA\CD@mA\CD@FA\CD@LB\CD@VA\CD@MB\CD@sF
+\ifnum\CD@FA>\CD@lA\advance\CD@FA\m@ne\advance\CD@VA\m@ne\CD@tB\wd\CD@VA
+\setbox\CD@FA=\box\voidb@x\CD@yB\repeat\CD@w\ht\CD@NB\CD@qI\dp\CD@NB\CD@pI}%
+\def\CD@gG#1#2#3{\ifdim#1>.01\CD@zC\CD@PA#2\relax\advance\CD@PA#1\relax
+\advance\CD@PA.99\CD@zC\count@\CD@PA\divide\count@\CD@zC\CD@KB{increase cell #%
+3 to \the\count@ em}\fi}\def\CD@rI{\CD@FA=\CD@LB\penalty4 \noindent\unhbox
+\CD@NB\CD@sF\unskip\setbox0=\lastbox\ifhbox0 \advance\CD@FA\m@ne\setbox\CD@FA
+\hbox to\wd0{\null\penalty-9990\null\unhbox0}\repeat\CD@lA\CD@FA\advance
+\CD@FA\CD@MB\advance\CD@FA-\CD@mA\ifnum\CD@FA<\CD@LB\count@\CD@FA\advance
+\count@\m@ne\dimen0=\wd\count@\count@\CD@MB\advance\count@\m@ne\CD@tB\wd
+\count@\CD@sF\ifnum\CD@FA<\CD@LB\CD@DJ\CD@XG\dimen0\wd\CD@FA\advance\CD@FA1
+\repeat\fi\CD@sF\CD@GB\lastpenalty\unpenalty\ifnum\CD@GB>\z@\CD@vA
+\lastpenalty\unpenalty\CD@VG\repeat\endgraf\unskip\ifnum\lastpenalty=4
+\unpenalty\else\cd@shouldnt S\fi}\def\CD@VG{\advance\CD@vA\CD@lA\advance
+\CD@vA\m@ne\setbox0=\lastbox\ifnum\CD@vA<\CD@LB\setbox\CD@vA\hbox{\box0%
+\penalty\CD@GB\unhbox\CD@vA}\else\CD@UG\fi}\def\CD@bG{}\CD@tG\CD@uE\CD@WB
+\CD@VB\def\CD@DJ{\advance\dimen0\wd\CD@FA\divide\dimen0\tw@\CD@uE\dimen0%
+\DiagramCellWidth\else\CD@V{\dimen0}\DiagramCellWidth\CD@pJ\fi\advance\CD@tB
+\dimen0 }\def\CD@XG{\setbox\CD@MB=\vbox{}\dp\CD@MB=\CD@uB\wd\CD@MB\CD@tB
+\advance\CD@MB1 }\def\CD@LJ#1,{\def\CD@GK{#1}\ifx\CD@GK\CD@RD\else\advance
+\CD@tB\CD@GK\DiagramCellWidth\CD@XG\expandafter\CD@LJ\fi}\def\CD@VJ#1,{\def
+\CD@GK{#1}\ifx\CD@GK\CD@RD\else\ifnum\CD@NB>\CD@CA\CD@NF\CD@GK
+\DiagramCellHeight\advance\CD@NF-\dp\CD@NB\advance\CD@NB\m@ne\ht\CD@NB\CD@NF
+\fi\expandafter\CD@VJ\fi}\def\CD@pJ{\CD@wE\CD@OA\dimen0 \advance\CD@OA-%
+\DiagramCellWidth\ifdim\CD@OA>2\MapShortFall\CD@KB{badly drawn diagonals (see
+manual)}\let\CD@pJ\empty\fi\else\let\CD@pJ\empty\fi}\def\CD@KC{\CD@VA\CD@mA
+\CD@sF\ifnum\CD@VA<\CD@MB\dimen0\dp\CD@VA\advance\dimen0\CD@NF\dp\CD@VA\dimen
+0 \advance\CD@VA1 \repeat}\def\CD@bH#1#2#3#4{\ifnum\CD@FA<\CD@LB\CD@OA=#1%
+\relax\setbox\CD@FA=\hbox{\setbox0=#2\dimen7=#4\relax\dimen8=#3\relax\ifhbox
+\CD@FA\unhbox\CD@FA\advance\CD@OA-\lastkern\unkern\fi\ifdim\CD@OA=\z@\else
+\kern-\CD@OA\fi\raise\dimen7\box0 \kern-\dimen8 }\ifnum\CD@FA=\CD@lA\CD@V
+\CD@kF\CD@OA\fi\else\cd@shouldnt O\fi}\def\CD@w{\setbox\CD@NB=\hbox{\CD@FA
+\CD@lA\CD@VA\CD@mA\CD@PA\z@\relax\CD@sF\ifnum\CD@FA<\CD@LB\CD@tB\wd\CD@VA
+\relax\CD@eI\advance\CD@FA1 \advance\CD@VA1 \repeat}\CD@V\CD@kI{\wd\CD@NB}\wd
+\CD@NB\z@}\def\CD@eI{\ifhbox\CD@FA\CD@OA\CD@tB\relax\advance\CD@OA-\CD@PA
+\relax\ifdim\CD@OA=\z@\else\kern\CD@OA\fi\CD@PA\CD@tB\advance\CD@PA\wd\CD@FA
+\relax\unhbox\CD@FA\advance\CD@PA-\lastkern\unkern\fi}\def\CD@ZI{\setbox
+\CD@sH=\box\voidb@x\CD@VA=\CD@MB\CD@FA\CD@LB\CD@VA\CD@mA\advance\CD@VA\CD@FA
+\advance\CD@VA-\CD@lA\advance\CD@VA\m@ne\CD@tB\wd\CD@VA\count@\CD@LB\advance
+\count@\m@ne\CD@hF.5\wd\count@\advance\CD@hF\CD@tB\CD@A\m@ne\CD@gD\@m\CD@sF
+\ifnum\CD@FA>\CD@lA\advance\CD@FA\m@ne\advance\CD@hF-\CD@tB\CD@PI\wd\CD@VA
+\CD@tB\advance\CD@hF\CD@tB\advance\CD@VA\m@ne\CD@tB\wd\CD@VA\repeat\CD@mF
+\CD@kF\CD@mI-\CD@mF\CD@vB}\newcount\CD@GB\def\CD@s{}\def\CD@t{\mathsurround
+\z@\hsize\z@\rightskip\z@ plus1fil minus\maxdimen\parfillskip\z@\linepenalty
+9000 \looseness0 \hfuzz\maxdimen\hbadness10000 \clubpenalty0 \widowpenalty0
+\displaywidowpenalty0 \interlinepenalty0 \predisplaypenalty0
+\postdisplaypenalty0 \interdisplaylinepenalty0 \interfootnotelinepenalty0
+\floatingpenalty0 \brokenpenalty0 \everypar{}\leftskip\z@\parskip\z@
+\parindent\z@\pretolerance10000 \tolerance10000 \hyphenpenalty10000
+\exhyphenpenalty10000 \binoppenalty10000 \relpenalty10000 \adjdemerits0
+\doublehyphendemerits0 \finalhyphendemerits0 \CD@IA\prevdepth\z@}\newbox
+\CD@KG\newbox\CD@IG\def\CD@JG{\unhcopy\CD@KG}\def\CD@HG{\unhcopy\CD@IG}\def
+\CD@iJ{\hbox{}\penalty1\nointerlineskip}\def\CD@PI{\penalty5 \noindent\setbox
+\CD@MH=\null\CD@mF\z@\CD@mI\z@\ifnum\CD@FA<\CD@LB\ht\CD@MH\ht\CD@FA\dp\CD@MH
+\dp\CD@FA\unhbox\CD@FA\skip0=\lastskip\unskip\else\CD@OK\skip0=\z@\fi\endgraf
+\ifcase\prevgraf\cd@shouldnt Y \or\cd@shouldnt Z \or\CD@RI\or\CD@XI\else
+\CD@QI\fi\unskip\setbox0=\lastbox\unskip\unskip\unpenalty\noindent\unhbox0%
+\setbox0\lastbox\unpenalty\unskip\unskip\unpenalty\setbox0\lastbox\CD@tF
+\CD@GB\lastpenalty\unpenalty\ifnum\CD@GB>\z@\setbox\z@\lastbox\CD@lB\repeat
+\endgraf\unskip\unskip\unpenalty}\def\CD@YJ{\CD@uA\CD@XB\advance\CD@uA-\CD@NB
+\CD@vA\CD@FA\advance\CD@vA-\CD@lA\advance\CD@vA1 \expandafter\message{%
+prevgraf=\the\prevgraf at (\the\CD@uA,\the\CD@vA)}}\def\CD@XI{\CD@CE\setbox
+\CD@lI=\lastbox\setbox\CD@lI=\hbox{\unhbox\CD@lI\unskip\unpenalty}\unskip
+\ifdim\ht\CD@lI>\ht\CD@PC\setbox\CD@MH=\copy\CD@lI\else\ifdim\dp\CD@lI>\dp
+\CD@PC\setbox\CD@MH=\copy\CD@lI\else\CD@FG\CD@lI\fi\fi\advance\CD@mF.5\wd
+\CD@lI\advance\CD@mI.5\wd\CD@lI\setbox\CD@lI=\hbox{\unhbox\CD@lI\CD@HG}\CD@bH
+\CD@mF{\box\CD@lI}\CD@mI\z@\CD@yB\CD@vB}\def\CD@CE{\ifnum\CD@A>0 \advance
+\dimen0-\CD@tB\CD@iA-.5\dimen0 \CD@A-\CD@A\else\CD@A0 \CD@iA\z@\fi\setbox
+\CD@MH=\lastbox\setbox\CD@MH=\hbox{\unhbox\CD@MH\unskip\unskip\unpenalty
+\setbox0=\lastbox\global\CD@QA\lastkern\unkern}\advance\CD@iA-.5\CD@QA\unskip
+\setbox\CD@MH=\null\CD@mI\CD@iA\CD@mF-\CD@iA}\def\CD@Z{\ht\CD@MH\CD@tI\dp
+\CD@MH\CD@sI}\def\CD@FG#1{\setbox\CD@MH=\hbox{\CD@V{\ht\CD@MH}{\ht#1}\CD@V{%
+\dp\CD@MH}{\dp#1}\CD@V{\wd\CD@MH}{\wd#1}\vrule height\ht\CD@MH depth\dp\CD@MH
+width\wd\CD@MH}}\def\CD@QI{\CD@CE\CD@Z\setbox\CD@lI=\lastbox\unskip\setbox
+\CD@lF=\lastbox\unskip\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip\global\CD@yA
+\lastpenalty\unpenalty}\advance\CD@yA9999 \ifcase\CD@yA\CD@VI\or\CD@YI\or
+\CD@TI\or\CD@dI\or\CD@cI\or\CD@SI\else\cd@shouldnt9\fi}\def\CD@VI{\CD@FG
+\CD@lI\CD@UI\setbox\CD@sH=\box\CD@lF\setbox\CD@tH=\box\CD@lI}\def\CD@YI{%
+\CD@FG\CD@lF\setbox\CD@lI\hbox{\penalty8 \unhbox\CD@lI\unskip\unpenalty\ifnum
+\lastpenalty=8 \else\CD@xH\fi}\CD@UI\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip
+\unpenalty\global\setbox\CD@DA=\lastbox}\ifdim\wd\CD@lF=\z@\else\CD@xH\fi
+\setbox\CD@sH=\box\CD@DA}\def\CD@xH{\CD@KB{extra material in \string\pile
+\space cell (lost)}}\def\CD@UI{\CD@yB\ifvoid\CD@sH\else\CD@KB{Clashing
+horizontal arrows}\CD@mI.5\CD@hF\CD@mF-\CD@mI\CD@vB\CD@mI\z@\CD@mF\z@\fi
+\CD@hI\CD@hF\advance\CD@hI-\CD@mI\CD@hF-\CD@mF\CD@JC\CD@FA}\def\CD@RI{\setbox
+0\lastbox\unskip\CD@iA\z@\CD@Z\ifdim\skip0>\z@\CD@tJ\CD@A0 \else\ifnum\CD@A<1
+\CD@A0 \dimen0\CD@tB\fi\advance\CD@A1 \fi}\def\VonH{\CD@MA46\VonH{.5\CD@LF}}%
+\def\HonV{\CD@MA57\HonV{.5\CD@LF}}\def\HmeetV{\CD@MA44\HmeetV{-\MapShortFall}%
+}\def\CD@MA#1#2#3#4{\CD@pB34#1{\string#3}\CD@SD\CD@GB-999#2 \dimen0=#4\CD@tI
+\dimen0\advance\CD@tI\axisheight\CD@sI\dimen0\advance\CD@sI-\axisheight\CD@CF
+\CD@HC\CD@ZD}\def\CD@HC#1{\setbox0=\hbox{\CD@k#1\CD@ND}\dimen0.5\wd0 \CD@tI
+\ht0 \CD@sI\dp0 \CD@ZD}\def\CD@SD{\setbox0=\null\ht0=\CD@tI\dp0=\CD@sI\wd0=%
+\dimen0 \copy0\penalty\CD@GB\box0 }\def\CD@TI{\CD@GC\CD@yB}\def\CD@dI{\CD@GC
+\CD@vB}\def\CD@SI{\CD@GC\CD@yB\CD@vB}\def\CD@GC{\setbox\CD@lI=\hbox{\unhbox
+\CD@lI}\setbox\CD@lF=\hbox{\unhbox\CD@lF\global\setbox\CD@DA=\lastbox}\ht
+\CD@MH\ht\CD@DA\dp\CD@MH\dp\CD@DA\advance\CD@mF\wd\CD@DA\advance\CD@mI\wd
+\CD@lI}\CD@tG\ifPositiveGradient\CD@CI\CD@BI\CD@CI\CD@tG\ifClimbing\CD@rB
+\CD@qB\CD@rB\newcount\DiagonalChoice\DiagonalChoice\m@ne\ifx\tenln\nullfont
+\CD@tJ\def\CD@qF{\CD@KH\ifPositiveGradient/\else\CD@k\backslash\CD@ND\fi}%
+\else\def\CD@qF{\CD@rF\char\count@}\fi\let\CD@rF\tenln\def\Use@line@char#1{%
+\hbox{#1\CD@rF\ifPositiveGradient\else\advance\count@64 \fi\char\count@}}\def
+\CD@cF{\Use@line@char{\count@\CD@TC\multiply\count@8\advance\count@-9\advance
+\count@\CD@LH}}\def\CD@ZF{\Use@line@char{\ifcase\DiagonalChoice\CD@gF\or
+\CD@fF\or\CD@fF\else\CD@gF\fi}}\def\CD@gF{\ifnum\CD@TC=\z@\count@\rq33 \else
+\count@\CD@TC\multiply\count@\sixt@@n\advance\count@-9\advance\count@\CD@LH
+\advance\count@\CD@LH\fi}\def\CD@fF{\count@\rq\ifcase\CD@LH55\or\ifcase\CD@TC
+66\or22\or52\or61\or72\fi\or\ifcase\CD@TC66\or25\or22\or63\or52\fi\or\ifcase
+\CD@TC66\or16\or36\or22\or76\fi\or\ifcase\CD@TC66\or27\or25\or67\or22\fi\fi
+\relax}\def\CD@uC#1{\hbox{#1\setbox0=\Use@line@char{#1}\ifPositiveGradient
+\else\raise.3\ht0\fi\copy0 \kern-.7\wd0 \ifPositiveGradient\raise.3\ht0\fi
+\box0}}\def\CD@jF#1{\hbox{\setbox0=#1\kern-.75\wd0 \vbox to.25\ht0{%
+\ifPositiveGradient\else\vss\fi\box0 \ifPositiveGradient\vss\fi}}}\def\CD@jI#%
+1{\hbox{\setbox0=#1\dimen0=\wd0 \vbox to.25\ht0{\ifPositiveGradient\vss\fi
+\box0 \ifPositiveGradient\else\vss\fi}\kern-.75\dimen0 }}\CD@RC{+h:>}{%
+\Use@line@char\CD@fF}\CD@RC{-h:>}{\Use@line@char\CD@gF}\CD@nF{+t:<}{-h:>}%
+\CD@nF{-t:<}{+h:>}\CD@RC{+t:>}{\CD@jF{\Use@line@char\CD@fF}}\CD@RC{-t:>}{%
+\CD@jI{\Use@line@char\CD@gF}}\CD@nF{+h:<}{-t:>}\CD@nF{-h:<}{+t:>}\CD@RC{+h:>>%
+}{\CD@uC\CD@fF}\CD@RC{-h:>>}{\CD@uC\CD@gF}\CD@nF{+t:<<}{-h:>>}\CD@nF{-t:<<}{+%
+h:>>}\CD@nF{+h:>->}{+h:>>}\CD@nF{-h:>->}{-h:>>}\CD@nF{+t:<-<}{-h:>>}\CD@nF{-t%
+:<-<}{+h:>>}\CD@RC{+t:>>}{\CD@jF{\CD@uC\CD@fF}}\CD@RC{-t:>>}{\CD@jI{\CD@uC
+\CD@gF}}\CD@nF{+h:<<}{-t:>>}\CD@nF{-h:<<}{+t:>>}\CD@nF{+t:>->}{+t:>>}\CD@nF{-%
+t:>->}{-t:>>}\CD@nF{+h:<-<}{-t:>>}\CD@nF{-h:<-<}{+t:>>}\CD@RC{+f:-}{\CD@EF
+\null\else\CD@cF\fi}\CD@nF{-f:-}{+f:-}\def\CD@tC#1#2{\vbox to#1{\vss\hbox to#%
+2{\hss.\hss}\vss}}\def\hfdot{\CD@tC{2\axisheight}{.5em}}%
+%% % .7em until 29.7.98
+\def\vfdot{\CD@tC{1ex}\z@}%% % 1.46ex until 29.7.98
+\def\CD@bF{\hbox{\dimen0=.3\CD@zC\dimen1\dimen0 \ifnum\CD@LH>\CD@TC\CD@iC{%
+\dimen1}\else\CD@dG{\dimen0}\fi\CD@tC{\dimen0}{\dimen1}}}\newarrowfiller{.}%
+\hfdot\hfdot\vfdot\vfdot\def\dfdot{\CD@bF\CD@CK}\CD@RC{+f:.}{\dfdot}\CD@RC{-f%
+:.}{\dfdot}\def\CD@@K#1{\hbox\bgroup\def\CD@CH{#1\egroup}\afterassignment
+\CD@CH%%
+\count@=\rq}\def\lnchar{\CD@@K\CD@qF}\let\laf\lnchar\let\lah\lnchar\def\lad{%
+\CD@@K\xlad}\def\xlad{\setbox2=\hbox{\CD@qF}\setbox0=\hbox to.3\wd2{\hss.\hss
+}\dimen0=\ht0 \advance\dimen0-\dp0 \dimen1=.3\ht2 \advance\dimen1-\dimen0 \dp
+0=.5\dimen1 \dimen1=.3\ht2 \advance\dimen1\dimen0 \ht0=.5\dimen1 \raise\dp0%
+\box0}\def\lahh{\CD@@K\xlahh}\def\lat{\CD@@K\xlat}\def\xlat{\setbox0=\hbox{%
+\CD@qF}\dimen0=\ht0 \setbox1=\hbox to.25\wd0{\ifcase\DiagonalChoice\box0\hss
+\or\hss\box0 \or\hss\box0 \or\box0\hss\fi}\vbox to.25\dimen0{\ifClimbing\box1%
+\vss\else\vss\box1\fi\kern\z@}}\def\xlahh{\setbox0=\hbox{\CD@qF}%
+\ifPositiveGradient\CD@tJ\copy0 \kern-.7\wd0 \mv.3\ht0\box0 \else\ifClimbing
+\CD@tJ\copy0 \kern-.7\wd0 \mv.3\ht0\box0 \else\mv-.3\ht0\copy0 \kern-.7\wd0
+\box0 \fi\fi}\def\CD@dF#1{\setbox#1=\hbox{\dimen5\dimen#1 \setbox8=\box#1
+\dimen1\wd8 \count@\dimen5 \divide\count@\dimen1 \ifnum\count@=0 \box8 \ifdim
+\dimen5<.95\dimen1 \CD@gB{diagonal line too short}\fi\else\dimen3=\dimen5
+\advance\dimen3-\dimen1 \divide\dimen3\count@\dimen4\dimen3 \CD@dG{\dimen4}%
+\ifPositiveGradient\multiply\dimen4\m@ne\fi\dimen6\dimen1 \advance\dimen6-%
+\dimen3 \loop\raise\count@\dimen4\copy8 \ifnum\count@>0 \kern-\dimen6 \advance
+\count@\m@ne\repeat\fi}}\def\CD@CG#1{\CD@EF\CD@xJ{#1}\else\CD@dF{#1}\fi}\def
+\CD@IH#1{}\newdimen\objectheight\objectheight1.8ex \newdimen\objectwidth
+\objectwidth1em \def\CD@YD{\dimen6=\CD@aK\DiagramCellHeight\dimen7=\CD@WK
+\DiagramCellWidth\CD@KJ\ifnum\CD@LH>0 \ifnum\CD@TC>0 \CD@aF\else\aftergroup
+\CD@VC\fi\else\aftergroup\CD@UC\fi}\def\CD@VC{\CD@YA{diagonal map is nearly
+vertical}\CD@NA}\def\CD@UC{\CD@YA{diagonal map is nearly horizontal}\CD@NA}%
+\CD@rG\CD@NA{Use an orthogonal map instead}\def\CD@aF{\CD@MJ\dimen3\dimen7%
+\dimen7\dimen6\CD@iC{\dimen7}\advance\dimen3-\dimen7 \CD@MF\ifnum\CD@LH>%
+\CD@TC\advance\dimen6-\dimen1\advance\dimen6-\dimen5 \CD@iC{\dimen1}\CD@iC{%
+\dimen5}\else\dimen0\dimen1\advance\dimen0\dimen5\CD@dG{\dimen0}\advance
+\dimen6-\dimen0 \fi\dimen2.5\dimen7\advance\dimen2-\dimen1 \dimen4.5\dimen7%
+\advance\dimen4-\dimen5 \ifPositiveGradient\dimen0\dimen5 \advance\dimen1-%
+\CD@WK\DiagramCellWidth\advance\dimen1 \CD@ZK\DiagramCellWidth\setbox6=\llap{%
+\unhbox6\kern.1\ht2}\setbox7=\rlap{\kern.1\ht2\unhbox7}\else\dimen0\dimen1
+\advance\dimen1-\CD@ZK\DiagramCellWidth\setbox7=\llap{\unhbox7\kern.1\ht2}%
+\setbox6=\rlap{\kern.1\ht2\unhbox6}\fi\setbox6=\vbox{\box6\kern.1\wd2}\setbox
+7=\vtop{\kern.1\wd2\box7}\CD@dG{\dimen0}\advance\dimen0-\axisheight\advance
+\dimen0-\CD@bK\DiagramCellHeight\dimen5-\dimen0 \advance\dimen0\dimen6
+\advance\dimen1.5\dimen3 \ifdim\wd3>\z@\ifdim\ht3>-\dp3\CD@TB\fi\fi\dimen3%
+\dimen2 \dimen7\dimen2\advance\dimen7\dimen4 \ifvoid3 \else\CD@tE\else\dimen8%
+\ht3\advance\dimen8-\axisheight\CD@iC{\dimen8}\CD@X{\dimen8}{.5\wd3}\dimen9%
+\dp3\advance\dimen9\axisheight\CD@iC{\dimen9}\CD@X{\dimen9}{.5\wd3}%
+\ifPositiveGradient\advance\dimen2-\dimen9\advance\dimen4-\dimen8 \else
+\advance\dimen4-\dimen9\advance\dimen2-\dimen8 \fi\fi\advance\dimen3-.5\wd3
+\fi\dimen9=\CD@aK\DiagramCellHeight\advance\dimen9-2\DiagramCellHeight\CD@tE
+\advance\dimen2\dimen4 \CD@CG{2}\dimen2-\dimen0\advance\dimen2\dp2 \else
+\CD@CG{2}\CD@CG{4}\ifPositiveGradient\dimen2-\dimen0\advance\dimen2\dp2 \dimen
+4\dimen5\advance\dimen4-\ht4 \else\dimen4-\dimen0\advance\dimen4\dp4 \dimen2%
+\dimen5\advance\dimen2-\ht2 \fi\fi\setbox0=\hbox to\z@{\kern\dimen1 \ifvoid1
+\else\ifPositiveGradient\advance\dimen0-\dp1 \lower\dimen0 \else\advance
+\dimen5-\ht1 \raise\dimen5 \fi\rlap{\unhbox1}\fi\raise\dimen2\rlap{\unhbox2}%
+\ifvoid3 \else\lower.5\dimen9\rlap{\kern\dimen3\unhbox3}\fi\kern.5\dimen7
+\lower.5\dimen9\box6 \lower.5\dimen9\box7 \kern.5\dimen7 \CD@tE\else\raise
+\dimen4\llap{\unhbox4}\fi\ifvoid5 \else\ifPositiveGradient\advance\dimen5-\ht
+5 \raise\dimen5 \else\advance\dimen0-\dp5 \lower\dimen0 \fi\llap{\unhbox5}\fi
+\hss}\ht0=\axisheight\dp0=-\ht0\box0 }\def\NorthWest{\CD@BI\CD@rB
+\DiagonalChoice0 }\def\NorthEast{\CD@CI\CD@rB\DiagonalChoice1 }\def\SouthWest
+{\CD@CI\CD@qB\DiagonalChoice3 }\def\SouthEast{\CD@BI\CD@qB\DiagonalChoice2 }%
+\def\CD@aD{\vadjust{\CD@uA\CD@FA\advance\CD@uA\ifPositiveGradient\else-\fi
+\CD@ZK\relax\CD@vA\CD@NB\advance\CD@vA-\CD@bK\relax\hbox{\advance\CD@uA
+\ifPositiveGradient-\fi\CD@WK\advance\CD@vA\CD@aK\hbox{\box6 \kern\CD@DC\kern
+\CD@eJ\penalty1 \box7 \box\z@}\penalty\CD@uA\penalty\CD@vA}\penalty\CD@uA
+\penalty\CD@vA\penalty104}}\def\CD@eH#1{\relax\vadjust{\hbox@maths{#1}%
+\penalty\CD@FA\penalty\CD@NB\penalty\tw@}}\def\CD@lB{\ifcase\CD@GB\or\or
+\CD@bH{.5\wd0}{\box0}{.5\wd0}\z@\or\unhbox\z@\setbox\z@\lastbox\CD@bH{.5\wd0}%
+{\box0}{.5\wd0}\z@\unpenalty\unpenalty\setbox\z@\lastbox\or\CD@TG\else
+\advance\CD@GB-100 \ifnum\CD@GB<\z@\cd@shouldnt B\fi\setbox\z@\hbox{\kern
+\CD@mF\copy\CD@MH\kern\CD@mI\CD@uA\CD@XB\advance\CD@uA-\CD@NB\penalty\CD@uA
+\CD@uA\CD@FA\advance\CD@uA-\CD@lA\penalty\CD@uA\unhbox\z@\global\CD@yA
+\lastpenalty\unpenalty\global\CD@zA\lastpenalty\unpenalty}\CD@uA-\CD@yA\CD@vA
+\CD@zA\CD@fI\fi}\def\CD@TG{\unhbox\z@\setbox\z@\lastbox\CD@uA\lastpenalty
+\unpenalty\advance\CD@uA\CD@mA\CD@vA\CD@XB\advance\CD@vA-\lastpenalty
+\unpenalty\dimen1\lastkern\unkern\setbox3\lastbox\dimen0\lastkern\unkern
+\setbox0=\hbox to\z@{\unhbox0\setbox0\lastbox\setbox7\lastbox\unpenalty\CD@eJ
+\lastkern\unkern\CD@DC\lastkern\unkern\setbox6\lastbox\dimen7\CD@tB\advance
+\dimen7-\wd\CD@uA\ifdim\dimen7<\z@\CD@CI\multiply\dimen7\m@ne\let\mv\empty
+\else\CD@BI\def\mv{\raise\ht1}\kern-\dimen7 \fi\ifnum\CD@vA>\CD@NB\dimen6%
+\CD@uB\advance\dimen6-\ht\CD@vA\else\dimen6\z@\fi\CD@jJ\CD@mK\setbox1\null\ht
+1\dimen6\wd1\dimen7 \dimen7\dimen2 \dimen6\wd1 \CD@KJ\CD@uA\CD@LH\CD@vA\CD@TC
+\dimen6\ht1 \CD@KJ\setbox2\null\divide\dimen2\tw@\advance\dimen2\CD@eJ\CD@eG{%
+\dimen2}\wd2\dimen2 \dimen0.5\dimen7 \advance\dimen0\ifPositiveGradient\else-%
+\fi\CD@eJ\CD@dG{\dimen0}\advance\dimen0-\axisheight\ht2\dimen0 \dimen0\CD@DC
+\CD@eG{\dimen0}\advance\dimen0\ht2\ht2\dimen0 \dimen0\ifPositiveGradient-\fi
+\CD@DC\CD@dG{\dimen0}\advance\dimen0\wd2\wd2\dimen0 \setbox4\null\dimen0 .6%
+\CD@zC\CD@eG{\dimen0}\ht4\dimen0 \dimen0 .2\CD@zC\CD@dG{\dimen0}\wd4\dimen0
+\dimen0\wd2 \ifvoid6\else\dimen1\ht4 \advance\dimen1\ht2 \CD@CC6+-\raise
+\dimen1\rlap{\ifPositiveGradient\advance\dimen0-\wd6\advance\dimen0-\wd4 \else
+\advance\dimen0\wd4 \fi\kern\dimen0\box6}\fi\dimen0\wd2 \ifvoid7\else\dimen1%
+\ht4 \advance\dimen1-\ht2 \CD@CC7-+\lower\dimen1\rlap{\ifPositiveGradient
+\advance\dimen0\wd4 \else\advance\dimen0-\wd7\advance\dimen0-\wd4 \fi\kern
+\dimen0\box7}\fi\mv\box0\hss}\ht0\z@\dp0\z@\CD@bH{\z@}{\box\z@}{\z@}{%
+\axisheight}}\def\CD@CC#1#2#3{\dimen4.5\wd#1 \ifdim\dimen4>.25\dimen7\dimen4=%
+.25\dimen7\fi\ifdim\dimen4>\CD@zC\dimen4.4\dimen4 \advance\dimen4.6\CD@zC\fi
+\CD@eG{\dimen4}\dimen5\axisheight\CD@dG{\dimen5}\advance\dimen4-\dimen5 \dimen
+5\dimen4\CD@eG{\dimen5}\advance\dimen0\ifPositiveGradient#2\else#3\fi\dimen5
+\CD@dG{\dimen4}\advance\dimen1\dimen4 } \def\CD@eD#1{\expandafter\CD@IK{#1}}%
+\CD@ZA\CD@EK{output is PostScript dependent}\def\CD@SC{\CD@IK{/bturn {gsave
+currentpoint currentpoint translate 4 2 roll neg exch atan rotate neg exch neg
+exch translate } def /eturn {currentpoint grestore moveto} def}}\def\CD@gK{%
+\relax\CD@hK\pdfliteral{Q}\else\CD@IK{eturn}\fi} \def\CD@OJ#1{\count@#1\relax
+\multiply\count@7\advance\count@16577\divide\count@33154 }\def\CD@fD#1{%
+\expandafter\special{#1}} \def\CD@xJ#1{\setbox#1=\hbox{\dimen0\dimen#1\CD@dG{%
+\dimen0}\CD@OJ{\dimen0}\setbox0=\null\ifPositiveGradient\count@-\count@\ht0%
+\dimen0 \else\dp0\dimen0 \fi\box0 \CD@uA\count@\CD@OJ\CD@LF\CD@fD{pn \the
+\count@}\CD@fD{pa 0 0}\CD@OJ{\dimen#1}\CD@fD{pa \the\count@\space\the\CD@uA}%
+\CD@fD{fp}\kern\dimen#1}}\def\CD@JI{\CD@KJ\begingroup\ifdim\dimen7<\dimen6
+\dimen2=\dimen6 \dimen6=\dimen7 \dimen7=\dimen2 \count@\CD@LH\CD@LH\CD@TC
+\CD@TC\count@\else\dimen2=\dimen7 \fi\ifdim\dimen6>.01\p@\CD@KI\global\CD@QA
+\dimen0 \else\global\CD@QA\dimen7 \fi\endgroup\dimen2\CD@QA\CD@iK\CD@lK{%
+\ifPositiveGradient\else-\fi\dimen6}\CD@iK\CD@kK{\ifPositiveGradient-\fi
+\dimen6}\CD@iK\CD@eK{\dimen7}}\def\CD@KI{\CD@hJ\ifdim\dimen7>1.73\dimen6
+\divide\dimen2 4 \multiply\CD@TC2 \else\dimen2=0.353553\dimen2 \advance\CD@LH
+-\CD@TC\multiply\CD@TC4 \fi\dimen0=4\dimen2 \CD@ZG4\CD@ZG{-2}\CD@ZG2\CD@ZG{-2%
+.5}}\def\CD@AI{\begingroup\count@\dimen0 \dimen2 45pt \divide\count@\dimen2
+\ifdim\dimen0<\z@\advance\count@\m@ne\fi\ifodd\count@\advance\count@1\CD@@A
+\else\CD@y\fi\advance\dimen0-\count@\dimen2 \CD@gE\multiply\dimen0\m@ne\fi
+\ifnum\count@<0 \multiply\count@-7 \fi\dimen3\dimen1 \dimen6\dimen0 \dimen7
+3754936sp \ifdim\dimen0<6\p@\def\CD@OG{4000}\fi\CD@KJ\dimen2\dimen3\CD@dG{%
+\dimen2}\CD@hJ\multiply\CD@TC-6 \dimen0\dimen2 \CD@ZG1\CD@ZG{0.3}\dimen1%
+\dimen0 \dimen2\dimen3 \dimen0\dimen3 \CD@ZG3\CD@ZG{1.5}\CD@ZG{0.3}\divide
+\count@2 \CD@gE\multiply\dimen1\m@ne\fi\ifodd\count@\dimen2\dimen1\dimen1%
+\dimen0\dimen0-\dimen2 \fi\divide\count@2 \ifodd\count@\multiply\dimen0\m@ne
+\multiply\dimen1\m@ne\fi\global\CD@QA\dimen0\global\CD@RA\dimen1\endgroup
+\dimen6\CD@QA\dimen7\CD@RA}\def\CD@OC{255}\let\CD@OG\CD@OC\def\CD@KJ{%
+\begingroup\ifdim\dimen7<\dimen6 \dimen9\dimen7\dimen7\dimen6\dimen6\dimen9%
+\CD@@A\else\CD@y\fi\dimen2\z@\dimen3\CD@XH\dimen4\CD@XH\dimen0\z@\dimen8=%
+\CD@OG\CD@XH\CD@lC\global\CD@yA\dimen\CD@gE0\else3\fi\global\CD@zA\dimen
+\CD@gE3\else0\fi\endgroup\CD@LH\CD@yA\CD@TC\CD@zA}\def\CD@lC{\count@\dimen6
+\divide\count@\dimen7 \advance\dimen6-\count@\dimen7 \dimen9\dimen4 \advance
+\dimen9\count@\dimen0 \ifdim\dimen9>\dimen8 \CD@@C\else\CD@AC\ifdim\dimen6>%
+\z@\dimen9\dimen6 \dimen6\dimen7 \dimen7\dimen9 \expandafter\expandafter
+\expandafter\CD@lC\fi\fi}\def\CD@@C{\ifdim\dimen0=\z@\ifdim\dimen9<2\dimen8
+\dimen0\dimen8 \fi\else\advance\dimen8-\dimen4 \divide\dimen8\dimen0 \ifdim
+\count@\CD@XH<2\dimen8 \count@\dimen8 \dimen9\dimen4 \advance\dimen9\count@
+\dimen0 \CD@AC\fi\fi}\def\CD@AC{\dimen4\dimen0 \dimen0\dimen9 \advance\dimen2%
+\count@\dimen3 \dimen9\dimen2 \dimen2\dimen3 \dimen3\dimen9 }\def\CD@ZG#1{%
+\CD@dG{\dimen2}\advance\dimen0 #1\dimen2 }\def\CD@dG#1{\divide#1\CD@TC
+\multiply#1\CD@LH}\def\CD@eG#1{\divide#1\CD@vA\multiply#1\CD@uA}\def\CD@iC#1{%
+\divide#1\CD@LH\multiply#1\CD@TC}\def\CD@hJ{\dimen6\CD@LH\CD@XH\multiply
+\dimen6\CD@LH\dimen7\CD@TC\CD@XH\multiply\dimen7\CD@TC\CD@KJ}\def\CD@iK#1#2{%
+\begingroup\dimen@#2\relax\loop\ifdim\dimen2<.4\maxdimen\multiply\dimen2\tw@
+\multiply\dimen@\tw@\repeat\divide\dimen2\@cclvi\divide\dimen@\dimen2\relax
+\multiply\dimen@\@cclvi\expandafter\CD@jK\the\dimen@\endgroup\let#1\CD@fK}{%
+\catcode\lq p=12 \catcode\lq0=12 \catcode\lq.=12 \catcode\lq t=12 \gdef\CD@jK
+#1pt{\gdef\CD@fK{#1}}}\ifx\errorcontextlines\CD@qK\CD@tJ\let\CD@GH\relax\else
+\def\CD@GH{\errorcontextlines\m@ne}\fi\ifnum\inputlineno<0 \let\CD@CD\empty
+\let\CD@W\empty\let\CD@mD\relax\let\CD@uI\relax\let\CD@vI\relax\let\CD@zF
+\relax\message{! Why not upgrade to TeX version 3? (available since 1990)}%
+\else\def\CD@W{ at line \number\inputlineno}\def\CD@mD{ - first occurred}\def
+\CD@uI{\edef\CD@h{\the\inputlineno}\global\let\CD@jB\CD@h}\def\CD@h{9999}\def
+\CD@vI{\xdef\CD@jB{\the\inputlineno}}\def\CD@jB{\CD@h}\def\CD@zF{\ifnum\CD@h<%
+\inputlineno\edef\CD@CD{\space at lines \CD@h--\the\inputlineno}\else\edef
+\CD@CD{\CD@W}\fi}\fi\let\CD@CD\empty\def\CD@YA#1#2{\CD@GH\errhelp=#2%
+\expandafter\errmessage{\CD@tA: #1}}\def\CD@KB#1{\begingroup\expandafter
+\message{! \CD@tA: #1\CD@CD}\ifnum\CD@XB>\CD@NB\ifnum\CD@CA>\CD@NB\else\ifnum
+\CD@lA>\CD@FA\else\ifnum\CD@LB>\CD@FA\advance\CD@XB-\CD@NB\advance\CD@FA-%
+\CD@lA\advance\CD@FA1\relax\expandafter\message{! (error detected at row \the
+\CD@XB, column \the\CD@FA, but probably caused elsewhere)}\fi\fi\fi\fi
+\endgroup}\def\CD@gB#1{{\expandafter\message{\CD@tA\space Warning: #1\CD@W}}}%
+\def\CD@CB#1#2{\CD@gB{#1 \string#2 is obsolete\CD@mD}}\def\CD@AB#1{\CD@CB{%
+Dimension}{#1}\CD@DE#1\CD@BB\CD@BB}\def\CD@BB{\CD@OA=}\def\CD@@B#1{\CD@CB{%
+Count}{#1}\CD@DE#1\CD@OH\CD@OH}\def\CD@OH{\count@=}\def\HorizontalMapLength{%
+\CD@AB\HorizontalMapLength}\def\VerticalMapHeight{\CD@AB\VerticalMapHeight}%
+\def\VerticalMapDepth{\CD@AB\VerticalMapDepth}\def\VerticalMapExtraHeight{%
+\CD@AB\VerticalMapExtraHeight}\def\VerticalMapExtraDepth{\CD@AB
+\VerticalMapExtraDepth}\def\DiagonalLineSegments{\CD@@B\DiagonalLineSegments}%
+\ifx\tenln\nullfont\CD@ZA\CD@KH{\CD@eF\space diagonal line and arrow font not
+available}\else\let\CD@KH\relax\fi\def\CD@aG#1#2<#3:#4:#5#6{\begingroup\CD@PA
+#3\relax\advance\CD@PA-#2\relax\ifdim.1em<\CD@PA\CD@uA#5\relax\CD@vA#6\relax
+\ifnum\CD@uA<\CD@vA\count@\CD@vA\advance\count@-\CD@uA\CD@KB{#4 by \the\CD@PA
+}\if#1v\let\CD@CH\CD@JK\edef\tmp{\the\CD@uA--\the\CD@vA,\the\CD@FA}\else
+\advance\count@\count@\if#1l\advance\count@-\CD@A\else\if#1r\advance\count@
+\CD@A\fi\fi\advance\CD@PA\CD@PA\let\CD@CH\CD@ZE\edef\tmp{\the\CD@NB,\the
+\CD@uA--\the\CD@vA}\fi\divide\CD@PA\count@\ifdim\CD@CH<\CD@PA\global\CD@CH
+\CD@PA\fi\fi\fi\endgroup}\CD@tG\CD@xE\CD@JD\CD@ID\CD@rG\CD@xI{See the message
+above.}\CD@rG\CD@lH{Perhaps you've forgotten to end the diagram before
+resuming the text, in\CD@uG which case some garbage may be added to the
+diagram, but we should be ok now.\CD@uG Alternatively you've left a blank line
+in the middle - TeX will now complain\CD@uG that the remaining \CD@S s are
+misplaced - so please use comments for layout.}\CD@rG\CD@hD{You have already
+closed too many brace pairs or environments; an \CD@HD\CD@uG command was (%
+over)due.}\CD@rG\CD@hH{\CD@dC\space and \CD@HD\space commands must match.}%
+\def\CD@jH{\ifnum\inputlineno=0 \else\expandafter\CD@iH\fi}\def\CD@iH{\CD@MD
+\CD@GD\crcr\CD@YA{missing \CD@HD\space inserted before \CD@kH- type "h"}%
+\CD@lH\enddiagram\CD@AG\CD@kH\par}\def\CD@AG#1{\edef\enddiagram{\noexpand
+\CD@rD{#1\CD@W}}}\def\CD@rD#1{\CD@YA{\CD@HD\space(anticipated by #1) ignored}%
+\CD@xI\let\enddiagram\CD@SG}\def\CD@SG{\CD@YA{misplaced \CD@HD\space ignored}%
+\CD@hH}\def\CD@mC{\CD@YA{missing \CD@HD\space inserted.}\CD@hD\CD@AG{closing
+group}}\ifx\DeclareOption\CD@qK\else\ifx\DeclareOption\@notprerr\else
+\DeclareOption*{\let\CD@N\relax\let\CD@DH\relax\expandafter\CD@@E
+\CurrentOption,}\fi\fi
+%%======================================================================%
+%% %
+%% (22) AUXILLARY MACROS FOR ADJUSTMENT OF COMPONENTS %
+%% %
+%%======================================================================%
+
+%% NOTE: The recommended way of defining arrow commands is now
+%% \newarrow{Name}{tail}{filler}{middle}{filler}{head}
+%% which defines \rName, \lName, \dName and \uName using arrow parts which
+%% have themselves previously been defined using the commands
+%% \newarrowtail, \newarrowfiller, \newarrowmiddle and \newarrowhead.
+
+%% The components \rhvee etc have been retained for the time being, as an
+%% intermediate stage and to continue to support the old \HorizontalMap and
+%% \VerticalMap commands, but you should not rely on the continued existence
+%% of these macros.
+
+%% The various components usually need some correction
+%% - longitudinally, ie to prevent gaps and overprints with the shaft,
+%% - transversally, ie to prevent "steps" in the junction with the shaft.
+%% The former can be done safely ad hoc, eg with \mkern1mu.
+%% The latter are now done with the macros \scriptaxis, \boldscriptaxis,
+%% \shifthook and \raisehook, which include pixel corrections.
+
+%% Please note that these and the other auxillary macros which follow are
+%% interim. When it becomes clear exactly what kinds of adjustments are
+%% needed for characters, this job will be done by a suitable extension
+%% to the language of \newarrowhead, etc. If you have any other ideas for
+%% transformations of general use please tell me.
+
+%% By all means experiment with other characters for arrowheads, but
+%% please, in your own interests, do not rely on macros like \rhvee,
+%% send me a copy of your definitions for distribution to other users
+%% in this file, and keep track of where your efforts get copied so
+%% that they can be replaced with the "official" version when it is
+%% incorporated.
+
+%% ***** DONT use macros with mangled names like \Cd@gH. *****
+
+\catcode\lq\$=3 %% make sure that $ means maths-shift
+\def\vboxtoz{\vbox to\z@}%% \z@ is in plain TeX and means 0pt
+
+%% print #1 in \scriptstyle, adjusting for the maths axis height
+\def\scriptaxis#1{\@scriptaxis{$\scriptstyle#1$}}%%
+\def\ssaxis#1{\@ssaxis{$\scriptscriptstyle#1$}}%%
+\def\@scriptaxis#1{\dimen0\axisheight\advance\dimen0-\ss@axisheight\raise
+\dimen0\hbox{#1}}\def\@ssaxis#1{\dimen0\axisheight\advance\dimen0-%
+\ss@axisheight\raise\dimen0\hbox{#1}}
+
+%% Some of the characters would look better in bold since they're
+%% taken from sub/superscript fonts; we use LaTeX's \boldmath to
+%% do this, defining this to do nothing if it doesn't exist.
+%% With the old LaTeX font selection at other than 10pt you may still
+%% get nothing happenning. Also, PK fonts may be missing.
+%% If you have problems, DONT use boldhook or boldlittlevee.
+\ifx\boldmath\CD@qK%%
+\let\boldscriptaxis\scriptaxis%%
+\def\boldscript#1{\hbox{$\scriptstyle#1$}}%%
+\def\boldscriptscript#1{\hbox{$\scriptscriptstyle#1$}}%%
+\else\def\boldscriptaxis#1{\@scriptaxis{\boldmath$\scriptstyle#1$}}%%
+\def\boldscript#1{\hbox{\boldmath$\scriptstyle#1$}}%%
+\def\boldscriptscript#1{\hbox{\boldmath$\scriptscriptstyle#1$}}%%
+\fi
+
+%% #1= {} or \boldmath; #2= + or -; #3=\subset or \supset
+\def\raisehook#1#2#3{\hbox{\setbox3=\hbox{#1$\scriptscriptstyle#3$}%
+%% the character to use
+\dimen0\ss@axisheight%% \scriptscriptstyle axis height
+\dimen1\axisheight\advance\dimen1-\dimen0%% difference in axis heights
+\dimen2\ht3\advance\dimen2-\dimen0%
+%% height of char above axis (half spread)
+\advance\dimen2-0.021em\advance\dimen1 #2\dimen2%
+%% shift = axis_difference +/- half_spread
+\raise\dimen1\box3}}%% print the character
+%% Mark Dawson suggested using the width
+\def\shifthook#1#2#3{\setbox1=\hbox{#1$\scriptscriptstyle#3$}\dimen0\wd1%
+\divide\dimen0 12\CD@zH{\dimen0}%% "u"
+\dimen1\wd1\advance\dimen1-2\dimen0 \advance\dimen1-2\CD@oI\CD@zH{\dimen1}%
+\kern#2\dimen1\box1}%% print
+
+%% use the extension font (cmex) for double vertical arrows
+\def\@cmex{\mathchar"03}%%ascii double quote
+
+%% ************* P U L L B A C K S ************
+
+%% These will probably be replaced by something less ad hoc
+%% in a future version.
+
+\def\make@pbk#1{\setbox\tw@\hbox to\z@{#1}\ht\tw@\z@\dp\tw@\z@\box\tw@}\def
+\CD@fH#1{\overprint{\hbox to\z@{#1}}}\def\CD@qH{\kern0.11em}\def\CD@pH{\kern0%
+.35em}
+
+%% This is a hack for my book ``Practical Foundations of Mathematics''
+%% and WILL NOT BE SUPPORTED --- DO NOT USE IT!
+\def\dblvert{\def\CD@rH{\kern.5\PileSpacing}}\def\CD@rH{}
+
+\def\SEpbk{\make@pbk{\CD@qH\CD@rH\vrule depth 2.87ex height -2.75ex width 0.%
+95em \vrule height -0.66ex depth 2.87ex width 0.05em \hss}}
+
+\def\SWpbk{\make@pbk{\hss\vrule height -0.66ex depth 2.87ex width 0.05em
+\vrule depth 2.87ex height -2.75ex width 0.95em \CD@qH\CD@rH}}
+
+\def\NEpbk{\make@pbk{\CD@qH\CD@rH\vrule depth -3.81ex height 4.00ex width 0.%
+95em \vrule height 4.00ex depth -1.72ex width 0.05em \hss}}
+
+\def\NWpbk{\make@pbk{\hss\vrule height 4.00ex depth -1.72ex width 0.05em
+\vrule depth -3.81ex height 4.00ex width 0.95em \CD@qH\CD@rH}}
+
+%% Freyd & Scedrov puncture symbol for non-commuting polygon
+\def\puncture{{\setbox0\hbox{A}\vrule height.53\ht0 depth-.47\ht0 width.35\ht
+0 \kern.12\ht0 \vrule height\ht0 depth-.65\ht0 width.06\ht0 \kern-.06\ht0
+\vrule height.35\ht0 depth0pt width.06\ht0 \kern.12\ht0 \vrule height.53\ht0
+depth-.47\ht0 width.35\ht0 }}
+
+%% 2-cells: (24.11.95)
+%%% \NEclck puts a clockwise (ie southeast) arrow to the northwest of cell etc
+\def\NEclck{\overprint{\raise2.5ex\rlap{ \CD@rH$\scriptstyle\searrow$}}}%%
+\def\NEanti{\overprint{\raise2.5ex\rlap{ \CD@rH$\scriptstyle\nwarrow$}}}%%
+\def\NWclck{\overprint{\raise2.5ex\llap{$\scriptstyle\nearrow$ \CD@rH}}}%%
+\def\NWanti{\overprint{\raise2.5ex\llap{$\scriptstyle\swarrow$ \CD@rH}}}%%
+\def\SEclck{\overprint{\lower1ex\rlap{ \CD@rH$\scriptstyle\swarrow$}}}%%
+\def\SEanti{\overprint{\lower1ex\rlap{ \CD@rH$\scriptstyle\nearrow$}}}%%
+\def\SWclck{\overprint{\lower1ex\llap{$\scriptstyle\nwarrow$ \CD@rH}}}%%
+\def\SWanti{\overprint{\lower1ex\llap{$\scriptstyle\searrow$ \CD@rH}}}
+
+%%======================================================================%
+%% %
+%% (23) BITS OF ARROWS %
+%% %
+%%======================================================================%
+
+%% ********** H E A D S ***********
+
+%% \diagramstyle[heads=xxx] defines {>} as {xxx} where xxx
+%% has been defined by \newarrowhead{xxx} and \newarrowtail{xxx}
+
+%% vee head
+\def\rhvee{\mkern-10mu\greaterthan}%%
+\def\lhvee{\lessthan\mkern-10mu}%%
+\def\dhvee{\vboxtoz{\vss\hbox{$\vee$}\kern0pt}}%%
+\def\uhvee{\vboxtoz{\hbox{$\wedge$}\vss}}%%
+\newarrowhead{vee}\rhvee\lhvee\dhvee\uhvee
+
+%% little vee head
+\def\dhlvee{\vboxtoz{\vss\hbox{$\scriptstyle\vee$}\kern0pt}}%%
+\def\uhlvee{\vboxtoz{\hbox{$\scriptstyle\wedge$}\vss}}%%
+\newarrowhead{littlevee}{\mkern1mu\scriptaxis\rhvee}{\scriptaxis\lhvee}%
+\dhlvee\uhlvee\ifx\boldmath\CD@qK%%
+\newarrowhead{boldlittlevee}{\mkern1mu\scriptaxis\rhvee}{\scriptaxis\lhvee}%
+\dhlvee\uhlvee\else%%
+\def\dhblvee{\vboxtoz{\vss\boldscript\vee\kern0pt}}%%
+\def\uhblvee{\vboxtoz{\boldscript\wedge\vss}}%%
+\newarrowhead{boldlittlevee}{\mkern1mu\boldscriptaxis\rhvee}{\boldscriptaxis
+\lhvee}\dhblvee\uhblvee%%
+\fi
+
+%% curly vee head (uses AMS symbols fonts)
+\def\rhcvee{\mkern-10mu\succ}%%
+\def\lhcvee{\prec\mkern-10mu}%%
+\def\dhcvee{\vboxtoz{\vss\hbox{$\curlyvee$}\kern0pt}}%%
+\def\uhcvee{\vboxtoz{\hbox{$\curlywedge$}\vss}}%%
+\newarrowhead{curlyvee}\rhcvee\lhcvee\dhcvee\uhcvee
+
+%% double vee head %% will probably be withdrawn later
+\def\rhvvee{\mkern-13mu\gg}%% 24.8.92 changed 10mu to 13mu
+\def\lhvvee{\ll\mkern-13mu}%% to make rule go through
+\def\dhvvee{\vboxtoz{\vss\hbox{$\vee$}\kern-.6ex\hbox{$\vee$}\kern0pt}}%%
+\def\uhvvee{\vboxtoz{\hbox{$\wedge$}\kern-.6ex \hbox{$\wedge$}\vss}}%%
+\newarrowhead{doublevee}\rhvvee\lhvvee\dhvvee\uhvvee
+
+%% open and closed triangles (uses AMS symbols fonts)
+\def\triangleup{{\scriptscriptstyle\bigtriangleup}}%%
+\def\littletriangledown{{\scriptscriptstyle\triangledown}}%% AMS
+\def\rhtriangle{\triangleright\mkern1.2mu}%% 29.1.93
+\def\lhtriangle{\triangleleft\mkern.8mu}%%
+\def\uhtriangle{\vbox{\kern-.2ex \hbox{$\scriptscriptstyle\bigtriangleup$}%
+\kern-.25ex}}%%
+%% Changed \scriptstyle\triangledown to \scriptscriptstyle\bigtriangledown
+%% at the suggestion of Martin Hofmann (25.11.92) to avoid using AMS symbols
+%% and also for compatibility with upward arrow.
+\def\dhtriangle{\vbox{\kern-.28ex \hbox{$\scriptscriptstyle\bigtriangledown$}%
+\kern-.1ex}}%% 15.1.93 from -.25ex
+\def\dhblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\blacktriangledown$}}}%
+%% AMS
+\def\uhblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\blacktriangle$}}}%
+%% AMS
+\def\dhlblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\scriptstyle
+\blacktriangledown$}}}%% AMS
+\def\uhlblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\scriptstyle
+\blacktriangle$}}}%% AMS
+\newarrowhead{triangle}\rhtriangle\lhtriangle\dhtriangle\uhtriangle
+\newarrowhead{blacktriangle}{\mkern-1mu\blacktriangleright\mkern.4mu}{%
+\blacktriangleleft}\dhblack\uhblack\newarrowhead{littleblack}{\mkern-1mu%
+\scriptaxis\blacktriangleright}{\scriptaxis\blacktriangleleft\mkern-2mu}%
+\dhlblack\uhlblack
+
+%% LaTeX arrowheads
+\def\rhla{\hbox{\setbox0=\lnchar55\dimen0=\wd0\kern-.6\dimen0\ht0\z@\raise
+\axisheight\box0\kern.1\dimen0}}%%
+\def\lhla{\hbox{\setbox0=\lnchar33\dimen0=\wd0\kern.05\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.5\dimen0}}%%
+\def\dhla{\vboxtoz{\vss\rlap{\lnchar77}}}%%
+\def\uhla{\vboxtoz{\setbox0=\lnchar66 \wd0\z@\kern-.15\ht0\box0\vss}}%% 1/93
+\newarrowhead{LaTeX}\rhla\lhla\dhla\uhla
+
+%% double LaTeX arrowheads %% will probably be withdrawn later
+\def\lhlala{\lhla\kern.3em\lhla}%%
+\def\rhlala{\rhla\kern.3em\rhla}%%
+\def\uhlala{\hbox{\uhla\raise-.6ex\uhla}}%%
+\def\dhlala{\hbox{\dhla\lower-.6ex\dhla}}%%
+\newarrowhead{doubleLaTeX}\rhlala\lhlala\dhlala\uhlala
+
+%% circles % \rho is a Greek letter!
+\def\hhO{\scriptaxis\bigcirc\mkern.4mu} \def\hho{{\circ}\mkern1.2mu}%
+\newarrowhead{o}\hho\hho\circ\circ%%
+\newarrowhead{O}\hhO\hhO{\scriptstyle\bigcirc}{\scriptstyle\bigcirc}%%
+
+%% crosses
+\def\rhtimes{\mkern-5mu{\times}\mkern-.8mu}\def\lhtimes{\mkern-.8mu{\times}%
+\mkern-5mu}\def\uhtimes{\setbox0=\hbox{$\times$}\ht0\axisheight\dp0-\ht0%
+\lower\ht0\box0 }\def\dhtimes{\setbox0=\hbox{$\times$}\ht0\axisheight\box0 }%
+\newarrowhead{X}\rhtimes\lhtimes\dhtimes\uhtimes\newarrowhead+++++
+
+%% empty head {} is also available
+
+%% Y from stmaryrd (vertical ones still need large adjustment)
+\newarrowhead{Y}{\mkern-3mu\Yright}{\Yleft\mkern-3mu}\Yup\Ydown
+
+%% ********** H E A D S with S H A F T S ***********
+
+%% little arrow with shaft
+\newarrowhead{->}\rightarrow\leftarrow\downarrow\uparrow
+
+%% arrow with double shaft
+%%\newarrowhead{=>}\Rightarrow\Leftarrow\Downarrow\Uparrow
+\newarrowhead{=>}\Rightarrow\Leftarrow{\@cmex7F}{\@cmex7E}
+
+%% harpoon with shaft (trailing up/left can be changed to down/right)
+\newarrowhead{harpoon}\rightharpoonup\leftharpoonup\downharpoonleft
+\upharpoonleft
+
+%% little double-headed arrow with shaft (uses AMS symbols fonts)
+\def\twoheaddownarrow{\rlap{$\downarrow$}\raise-.5ex\hbox{$\downarrow$}}%%
+\def\twoheaduparrow{\rlap{$\uparrow$}\raise.5ex\hbox{$\uparrow$}}%%
+\newarrowhead{->>}\twoheadrightarrow\twoheadleftarrow\twoheaddownarrow
+\twoheaduparrow
+
+%% ********** T A I L S ***********
+
+%% vee tail
+\def\rtvee{\greaterthan}%%
+\def\ltvee{\mkern-1mu{\lessthan}\mkern.4mu}%% \mkern added 15.1.93
+\def\dtvee{\vee}%%
+\def\utvee{\wedge}%%
+\newarrowtail{vee}\greaterthan\ltvee\vee\wedge
+
+%% little vee tail
+\newarrowtail{littlevee}{\scriptaxis\greaterthan}{\mkern-1mu\scriptaxis
+\lessthan}{\scriptstyle\vee}{\scriptstyle\wedge}\ifx\boldmath\CD@qK
+\newarrowtail{boldlittlevee}{\scriptaxis\greaterthan}{\mkern-1mu\scriptaxis
+\lessthan}{\scriptstyle\vee}{\scriptstyle\wedge}\else\newarrowtail{%
+boldlittlevee}{\boldscriptaxis\greaterthan}{\mkern-1mu\boldscriptaxis
+\lessthan}{\boldscript\vee}{\boldscript\wedge}\fi
+
+%% curly vee tail (uses AMS symbols fonts)
+\newarrowtail{curlyvee}\succ{\mkern-1mu{\prec}\mkern.4mu}\curlyvee\curlywedge
+
+%% open and closed triangle tails (uses AMS symbols fonts)
+\def\rttriangle{\mkern1.2mu\triangleright}%% 29.1.93
+\newarrowtail{triangle}\rttriangle\lhtriangle\dhtriangle\uhtriangle
+\newarrowtail{blacktriangle}\blacktriangleright{\mkern-1mu\blacktriangleleft
+\mkern.4mu}\dhblack\uhblack\newarrowtail{littleblack}{\scriptaxis
+\blacktriangleright\mkern-2mu}{\mkern-1mu\scriptaxis\blacktriangleleft}%
+\dhlblack\uhlblack
+
+%% LaTeX tails
+\def\rtla{\hbox{\setbox0=\lnchar55\dimen0=\wd0\kern-.5\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.2\dimen0}}%%
+\def\ltla{\hbox{\setbox0=\lnchar33\dimen0=\wd0\kern-.15\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.5\dimen0}}%%
+\def\dtla{\vbox{\setbox0=\rlap{\lnchar77}\dimen0=\ht0\kern-.7\dimen0\box0%
+\kern-.1\dimen0}}%% 15.1.93 from -.6
+\def\utla{\vbox{\setbox0=\rlap{\lnchar66}\dimen0=\ht0\kern-.1\dimen0\box0%
+\kern-.6\dimen0}}%%
+\newarrowtail{LaTeX}\rtla\ltla\dtla\utla
+
+%% double vee tail %% will probably be withdrawn later
+\def\rtvvee{\gg\mkern-3mu}%%
+\def\ltvvee{\mkern-3mu\ll}%%
+\def\dtvvee{\vbox{\hbox{$\vee$}\kern-.6ex \hbox{$\vee$}\vss}}%%
+\def\utvvee{\vbox{\vss\hbox{$\wedge$}\kern-.6ex \hbox{$\wedge$}\kern\z@}}%%
+\newarrowtail{doublevee}\rtvvee\ltvvee\dtvvee\utvvee
+
+%% double LaTeX tails %% will probably be withdrawn later
+\def\ltlala{\ltla\kern.3em\ltla}%%
+\def\rtlala{\rtla\kern.3em\rtla}%%
+\def\utlala{\hbox{\utla\raise-.6ex\utla}}%%
+\def\dtlala{\hbox{\dtla\lower-.6ex\dtla}}%%
+\newarrowtail{doubleLaTeX}\rtlala\ltlala\dtlala\utlala
+
+%% bar (as in \mapsto)
+\def\utbar{\vrule height 0.093ex depth0pt width 0.4em}%%
+\let\dtbar\utbar%%
+\def\rtbar{\mkern1.5mu\vrule height 1.1ex depth.06ex width .04em\mkern1.5mu}%
+%%
+\let\ltbar\rtbar%%
+\newarrowtail{mapsto}\rtbar\ltbar\dtbar\utbar%%
+\newarrowtail{|}\rtbar\ltbar\dtbar\utbar%%ascii vertical bar (|)
+
+%% hooks (as in \into): choice of after/above and before/below
+
+\def\rthooka{\raisehook{}+\subset\mkern-1mu}%%
+\def\lthooka{\mkern-1mu\raisehook{}+\supset}%%
+\def\rthookb{\raisehook{}-\subset\mkern-2mu}%%
+\def\lthookb{\mkern-1mu\raisehook{}-\supset}%%
+
+\def\dthooka{\shifthook{}+\cap}%%
+\def\dthookb{\shifthook{}-\cap}%%
+\def\uthooka{\shifthook{}+\cup}%%
+\def\uthookb{\shifthook{}-\cup}%%
+
+\newarrowtail{hooka}\rthooka\lthooka\dthooka\uthooka\newarrowtail{hookb}%
+\rthookb\lthookb\dthookb\uthookb
+
+\ifx\boldmath\CD@qK\newarrowtail{boldhooka}\rthooka\lthooka\dthooka\uthooka
+\newarrowtail{boldhookb}\rthookb\lthookb\dthookb\uthookb\newarrowtail{%
+boldhook}\rthooka\lthooka\dthookb\uthooka\else\def\rtbhooka{\raisehook
+\boldmath+\subset\mkern-1mu}%%
+\def\ltbhooka{\mkern-1mu\raisehook\boldmath+\supset}%%
+\def\rtbhookb{\raisehook\boldmath-\subset\mkern-2mu}%%
+\def\ltbhookb{\mkern-1mu\raisehook\boldmath-\supset}%%
+\def\dtbhooka{\shifthook\boldmath+\cap}%%
+\def\dtbhookb{\shifthook\boldmath-\cap}%%
+\def\utbhooka{\shifthook\boldmath+\cup}%%
+\def\utbhookb{\shifthook\boldmath-\cup}%%
+\newarrowtail{boldhooka}\rtbhooka\ltbhooka\dtbhooka\utbhooka\newarrowtail{%
+boldhookb}\rtbhookb\ltbhookb\dtbhookb\utbhookb\newarrowtail{boldhook}%
+\rtbhooka\ltbhooka\dtbhooka\utbhooka\fi
+
+%% square-ended hooks (used for closed subsets in ``lifting and gluing'')
+\def\dtsqhooka{\shifthook{}+\sqcap}%%
+\def\dtsqhookb{\shifthook{}-\sqcap}%%
+\def\ltsqhooka{\mkern-1mu\raisehook{}+\sqsupset}%%
+\def\ltsqhookb{\mkern-1mu\raisehook{}-\sqsupset}%%
+\def\rtsqhooka{\raisehook{}+\sqsubset\mkern-1mu}%%
+\def\rtsqhookb{\raisehook{}-\sqsubset\mkern-2mu}%%
+\def\utsqhooka{\shifthook{}+\sqcup}%%
+\def\utsqhookb{\shifthook{}-\sqcup}%%
+\newarrowtail{sqhook}\rtsqhooka\ltsqhooka\dtsqhooka\utsqhooka
+
+%% the following seem the better choices at 10pt & 300dpi
+\newarrowtail{hook}\rthooka\lthookb\dthooka\uthooka\newarrowtail{C}\rthooka
+\lthookb\dthooka\uthooka
+
+%% circles
+\newarrowtail{o}\hho\hho\circ\circ%%
+\newarrowtail{O}\hhO\hhO{\scriptstyle\bigcirc}{\scriptstyle\bigcirc}%%
+
+%% crosses
+\newarrowtail{X}\lhtimes\rhtimes\uhtimes\dhtimes\newarrowtail+++++
+
+%% empty tail {} is also available
+
+%% Y from stmaryrd (vertical ones still need adjustment)
+\newarrowtail{Y}\Yright\Yleft\Yup\Ydown
+
+%% harpoon with shaft (trailing up/left can be changed to down/right)
+\newarrowtail{harpoon}\leftharpoondown\rightharpoondown\upharpoonright
+\downharpoonright
+
+%% ********** F I L L E R S ***********
+
+%% shortening is up to 0.15em=2.7mu horiz and 0.35ex vertically at each end.
+
+%% dot {.}, single rule {-} and empty {} fillers are also available
+
+%% double and triple lines
+%%\newarrowfiller{=}==\Vert\Vert%%
+\newarrowfiller{=}=={\@cmex77}{\@cmex77}%% 16.1.93
+\def\vfthree{\mid\!\!\!\mid\!\!\!\mid}%%ascii
+\newarrowfiller{3}\equiv\equiv\vfthree\vfthree
+
+%% dashed line
+\def\vfdashstrut{\vrule width0pt height1.3ex depth0.7ex}%%
+\def\vfthedash{\vrule width\CD@LF height0.6ex depth 0pt}%%
+\def\hfthedash{\CD@AJ\vrule\horizhtdp width 0.26em}%%
+\def\hfdash{\mkern5.5mu\hfthedash\mkern5.5mu}%%
+\def\vfdash{\vfdashstrut\vfthedash}%%
+\newarrowfiller{dash}\hfdash\hfdash\vfdash\vfdash
+
+%% ************* M I D D L E S ************
+
+%% plus
+\newarrowmiddle+++++
+
+%% ************* D I A G O N A L S ************
+
+%% simple arrow heads
+%%\def\nwhTO{\nwarrow\mkern-1mu}%%
+%%\def\nehTO{\mkern-.1mu\nearrow}%%
+%%\def\sehTO{\searrow\mkern-.02mu}%%
+%%\def\swhTO{\mkern-.8mu\swarrow}%%
+
+%%======================================================================%
+%% %
+%% (24) ARROW COMMANDS %
+%% %
+%%======================================================================%
+
+%% change to \iftrue to get mixed heads
+\iffalse%%
+\newarrow{To}----{vee}%%
+\newarrow{Arr}----{LaTeX}%%
+\newarrow{Dotsto}....{vee}%%
+\newarrow{Dotsarr}....{LaTeX}%%
+\newarrow{Dashto}{}{dash}{}{dash}{vee}%%
+\newarrow{Dasharr}{}{dash}{}{dash}{LaTeX}%%
+\newarrow{Mapsto}{mapsto}---{vee}%%
+\newarrow{Mapsarr}{mapsto}---{LaTeX}%%
+\newarrow{IntoA}{hooka}---{vee}%%
+\newarrow{IntoB}{hookb}---{vee}%%
+\newarrow{Embed}{vee}---{vee}%%
+\newarrow{Emarr}{LaTeX}---{LaTeX}%%
+\newarrow{Onto}----{doublevee}%%
+\newarrow{Dotsonarr}....{doubleLaTeX}%%
+\newarrow{Dotsonto}....{doublevee}%%
+\newarrow{Dotsonarr}....{doubleLaTeX}%%
+\else%%
+\newarrow{To}---->%%
+\newarrow{Arr}---->%%
+\newarrow{Dotsto}....>%%
+\newarrow{Dotsarr}....>%%
+\newarrow{Dashto}{}{dash}{}{dash}>%%
+\newarrow{Dasharr}{}{dash}{}{dash}>%%
+\newarrow{Mapsto}{mapsto}--->%%
+\newarrow{Mapsarr}{mapsto}--->%%
+\newarrow{IntoA}{hooka}--->%%
+\newarrow{IntoB}{hookb}--->%%
+\newarrow{Embed}>--->%%
+\newarrow{Emarr}>--->%%
+\newarrow{Onto}----{>>}%%
+\newarrow{Dotsonarr}....{>>}%%
+\newarrow{Dotsonto}....{>>}%%
+\newarrow{Dotsonarr}....{>>}%%
+\fi%%
+
+\newarrow{Implies}===={=>}%% minimum cell height 9.5pt
+\newarrow{Project}----{triangle}%%
+\newarrow{Pto}----{harpoon}%% partial function
+\newarrow{Relto}{harpoon}---{harpoon}%% binary relation
+
+\newarrow{Eq}=====%%
+\newarrow{Line}-----%%
+\newarrow{Dots}.....%%
+\newarrow{Dashes}{}{dash}{}{dash}{}%%
+
+%% square hooked arrow (used in my ``gluing and lifting'' paper)
+\newarrow{SquareInto}{sqhook}--->
+
+%% braces and parentheses
+%% \newarrow gives inappropriate directions, so we change the names
+%% the vertical filler is too far to the right; horizontal too high
+%% the vertical middles are too low with midvshaft
+%% maybe we'll add square brackets and the integral sign one day
+\newarrowhead{cmexbra}{\@cmex7B}{\@cmex7C}{\@cmex3B}{\@cmex38}%%
+\newarrowtail{cmexbra}{\@cmex7A}{\@cmex7D}{\@cmex39}{\@cmex3A}%%
+\newarrowmiddle{cmexbra}{\braceru\bracelu}{\bracerd\braceld}{\vcenter{%
+\hbox@maths{\@cmex3D\mkern-2mu}}}%% right
+{\vcenter{\hbox@maths{\mkern2mu\@cmex3C}}}%% left
+\newarrow{@brace}{cmexbra}-{cmexbra}-{cmexbra}%% braces
+\newarrow{@parenth}{cmexbra}---{cmexbra}%% straight parentheses
+\def\rightBrace{\d@brace[thick,cmex]}%%ASCII square brackets []
+\def\leftBrace{\u@brace[thick,cmex]}%%ASCII square brackets []
+\def\upperBrace{\r@brace[thick,cmex]}%%ASCII square brackets []
+\def\lowerBrace{\l@brace[thick,cmex]}%%ASCII square brackets []
+\def\rightParenth{\d@parenth[thick,cmex]}%%ASCII square brackets []
+\def\leftParenth{\u@parenth[thick,cmex]}%%ASCII square brackets []
+\def\upperParenth{\r@parenth[thick,cmex]}%%ASCII square brackets []
+\def\lowerParenth{\l@parenth[thick,cmex]}%%ASCII square brackets []
+
+%% synonyms for reverse compatibility
+
+\let\uFrom\uTo%%
+\let\lFrom\lTo%%
+\let\uDotsfrom\uDotsto%%
+\let\lDotsfrom\lDotsto%%
+\let\uDashfrom\uDashto%%
+\let\lDashfrom\lDashto%%
+\let\uImpliedby\uImplies%%
+\let\lImpliedby\lImplies%%
+\let\uMapsfrom\uMapsto%%
+\let\lMapsfrom\lMapsto%%
+\let\lOnfrom\lOnto%%
+\let\uOnfrom\uOnto%%
+\let\lPfrom\lPto%%
+\let\uPfrom\uPto%%
+
+\let\uInfromA\uIntoA%%
+\let\uInfromB\uIntoB%%
+\let\lInfromA\lIntoA%%
+\let\lInfromB\lIntoB%%
+\let\rInto\rIntoA%%
+\let\lInto\lIntoA%%
+\let\dInto\dIntoB%%
+\let\uInto\uIntoA%%
+\let\ruInto\ruIntoA%%
+\let\luInto\luIntoA%%
+\let\rdInto\rdIntoA%%
+\let\ldInto\ldIntoA%%
+%%
+\let\hEq\rEq%%
+\let\vEq\uEq%%
+\let\hLine\rLine%%
+\let\vLine\uLine%%
+\let\hDots\rDots%%
+\let\vDots\uDots%%
+\let\hDashes\rDashes%%
+\let\vDashes\uDashes%%
+
+%%=========================================================================%
+%% The following are included for reverse compatibility only.
+%%=========================================================================%
+\let\NW\luTo\let\NE\ruTo\let\SW\ldTo\let\SE\rdTo\def\nNW{\luTo(2,3)}\def\nNE{%
+\ruTo(2,3)}%%ascii
+\def\sSW{\ldTo(2,3)}\def\sSE{\rdTo(2,3)}%%ascii
+\def\wNW{\luTo(3,2)}\def\eNE{\ruTo(3,2)}%%ascii
+\def\wSW{\ldTo(3,2)}\def\eSE{\rdTo(3,2)}%%ascii
+\def\NNW{\luTo(2,4)}\def\NNE{\ruTo(2,4)}%%ascii
+\def\SSW{\ldTo(2,4)}\def\SSE{\rdTo(2,4)}%%ascii
+\def\WNW{\luTo(4,2)}\def\ENE{\ruTo(4,2)}%%ascii
+\def\WSW{\ldTo(4,2)}\def\ESE{\rdTo(4,2)}%%ascii
+\def\NNNW{\luTo(2,6)}\def\NNNE{\ruTo(2,6)}%%ascii
+\def\SSSW{\ldTo(2,6)}\def\SSSE{\rdTo(2,6)}%%ascii
+\def\WWNW{\luTo(6,2)}\def\EENE{\ruTo(6,2)}%%ascii
+\def\WWSW{\ldTo(6,2)}\def\EESE{\rdTo(6,2)}%%ascii
+
+\let\NWd\luDotsto\let\NEd\ruDotsto\let\SWd\ldDotsto\let\SEd\rdDotsto\def\nNWd
+{\luDotsto(2,3)}\def\nNEd{\ruDotsto(2,3)}%%ascii
+\def\sSWd{\ldDotsto(2,3)}\def\sSEd{\rdDotsto(2,3)}%%ascii
+\def\wNWd{\luDotsto(3,2)}\def\eNEd{\ruDotsto(3,2)}%%ascii
+\def\wSWd{\ldDotsto(3,2)}\def\eSEd{\rdDotsto(3,2)}%%ascii
+\def\NNWd{\luDotsto(2,4)}\def\NNEd{\ruDotsto(2,4)}%%ascii
+\def\SSWd{\ldDotsto(2,4)}\def\SSEd{\rdDotsto(2,4)}%%ascii
+\def\WNWd{\luDotsto(4,2)}\def\ENEd{\ruDotsto(4,2)}%%ascii
+\def\WSWd{\ldDotsto(4,2)}\def\ESEd{\rdDotsto(4,2)}%%ascii
+\def\NNNWd{\luDotsto(2,6)}\def\NNNEd{\ruDotsto(2,6)}%%ascii
+\def\SSSWd{\ldDotsto(2,6)}\def\SSSEd{\rdDotsto(2,6)}%%ascii
+\def\WWNWd{\luDotsto(6,2)}\def\EENEd{\ruDotsto(6,2)}%%ascii
+\def\WWSWd{\ldDotsto(6,2)}\def\EESEd{\rdDotsto(6,2)}%%ascii
+
+\let\NWl\luLine\let\NEl\ruLine\let\SWl\ldLine\let\SEl\rdLine\def\nNWl{\luLine
+(2,3)}\def\nNEl{\ruLine(2,3)}%%ascii
+\def\sSWl{\ldLine(2,3)}\def\sSEl{\rdLine(2,3)}%%ascii
+\def\wNWl{\luLine(3,2)}\def\eNEl{\ruLine(3,2)}%%ascii
+\def\wSWl{\ldLine(3,2)}\def\eSEl{\rdLine(3,2)}%%ascii
+\def\NNWl{\luLine(2,4)}\def\NNEl{\ruLine(2,4)}%%ascii
+\def\SSWl{\ldLine(2,4)}\def\SSEl{\rdLine(2,4)}%%ascii
+\def\WNWl{\luLine(4,2)}\def\ENEl{\ruLine(4,2)}%%ascii
+\def\WSWl{\ldLine(4,2)}\def\ESEl{\rdLine(4,2)}%%ascii
+\def\NNNWl{\luLine(2,6)}\def\NNNEl{\ruLine(2,6)}%%ascii
+\def\SSSWl{\ldLine(2,6)}\def\SSSEl{\rdLine(2,6)}%%ascii
+\def\WWNWl{\luLine(6,2)}\def\EENEl{\ruLine(6,2)}%%ascii
+\def\WWSWl{\ldLine(6,2)}\def\EESEl{\rdLine(6,2)}%%ascii
+
+\let\NWld\luDots\let\NEld\ruDots\let\SWld\ldDots\let\SEld\rdDots\def\nNWld{%
+\luDots(2,3)}\def\nNEld{\ruDots(2,3)}%%ascii
+\def\sSWld{\ldDots(2,3)}\def\sSEld{\rdDots(2,3)}%%ascii
+\def\wNWld{\luDots(3,2)}\def\eNEld{\ruDots(3,2)}%%ascii
+\def\wSWld{\ldDots(3,2)}\def\eSEld{\rdDots(3,2)}%%ascii
+\def\NNWld{\luDots(2,4)}\def\NNEld{\ruDots(2,4)}%%ascii
+\def\SSWld{\ldDots(2,4)}\def\SSEld{\rdDots(2,4)}%%ascii
+\def\WNWld{\luDots(4,2)}\def\ENEld{\ruDots(4,2)}%%ascii
+\def\WSWld{\ldDots(4,2)}\def\ESEld{\rdDots(4,2)}%%ascii
+\def\NNNWld{\luDots(2,6)}\def\NNNEld{\ruDots(2,6)}%%ascii
+\def\SSSWld{\ldDots(2,6)}\def\SSSEld{\rdDots(2,6)}%%ascii
+\def\WWNWld{\luDots(6,2)}\def\EENEld{\ruDots(6,2)}%%ascii
+\def\WWSWld{\ldDots(6,2)}\def\EESEld{\rdDots(6,2)}%%ascii
+
+\let\NWe\luEmbed\let\NEe\ruEmbed\let\SWe\ldEmbed\let\SEe\rdEmbed\def\nNWe{%
+\luEmbed(2,3)}\def\nNEe{\ruEmbed(2,3)}%%ascii
+\def\sSWe{\ldEmbed(2,3)}\def\sSEe{\rdEmbed(2,3)}%%ascii
+\def\wNWe{\luEmbed(3,2)}\def\eNEe{\ruEmbed(3,2)}%%ascii
+\def\wSWe{\ldEmbed(3,2)}\def\eSEe{\rdEmbed(3,2)}%%ascii
+\def\NNWe{\luEmbed(2,4)}\def\NNEe{\ruEmbed(2,4)}%%ascii
+\def\SSWe{\ldEmbed(2,4)}\def\SSEe{\rdEmbed(2,4)}%%ascii
+\def\WNWe{\luEmbed(4,2)}\def\ENEe{\ruEmbed(4,2)}%%ascii
+\def\WSWe{\ldEmbed(4,2)}\def\ESEe{\rdEmbed(4,2)}%%ascii
+\def\NNNWe{\luEmbed(2,6)}\def\NNNEe{\ruEmbed(2,6)}%%ascii
+\def\SSSWe{\ldEmbed(2,6)}\def\SSSEe{\rdEmbed(2,6)}%%ascii
+\def\WWNWe{\luEmbed(6,2)}\def\EENEe{\ruEmbed(6,2)}%%ascii
+\def\WWSWe{\ldEmbed(6,2)}\def\EESEe{\rdEmbed(6,2)}%%ascii
+
+\let\NWo\luOnto\let\NEo\ruOnto\let\SWo\ldOnto\let\SEo\rdOnto\def\nNWo{\luOnto
+(2,3)}\def\nNEo{\ruOnto(2,3)}%%ascii
+\def\sSWo{\ldOnto(2,3)}\def\sSEo{\rdOnto(2,3)}%%ascii
+\def\wNWo{\luOnto(3,2)}\def\eNEo{\ruOnto(3,2)}%%ascii
+\def\wSWo{\ldOnto(3,2)}\def\eSEo{\rdOnto(3,2)}%%ascii
+\def\NNWo{\luOnto(2,4)}\def\NNEo{\ruOnto(2,4)}%%ascii
+\def\SSWo{\ldOnto(2,4)}\def\SSEo{\rdOnto(2,4)}%%ascii
+\def\WNWo{\luOnto(4,2)}\def\ENEo{\ruOnto(4,2)}%%ascii
+\def\WSWo{\ldOnto(4,2)}\def\ESEo{\rdOnto(4,2)}%%ascii
+\def\NNNWo{\luOnto(2,6)}\def\NNNEo{\ruOnto(2,6)}%%ascii
+\def\SSSWo{\ldOnto(2,6)}\def\SSSEo{\rdOnto(2,6)}%%ascii
+\def\WWNWo{\luOnto(6,2)}\def\EENEo{\ruOnto(6,2)}%%ascii
+\def\WWSWo{\ldOnto(6,2)}\def\EESEo{\rdOnto(6,2)}%%ascii
+
+\let\NWod\luDotsonto\let\NEod\ruDotsonto\let\SWod\ldDotsonto\let\SEod
+\rdDotsonto\def\nNWod{\luDotsonto(2,3)}\def\nNEod{\ruDotsonto(2,3)}%%ascii
+\def\sSWod{\ldDotsonto(2,3)}\def\sSEod{\rdDotsonto(2,3)}%%ascii
+\def\wNWod{\luDotsonto(3,2)}\def\eNEod{\ruDotsonto(3,2)}%%ascii
+\def\wSWod{\ldDotsonto(3,2)}\def\eSEod{\rdDotsonto(3,2)}%%ascii
+\def\NNWod{\luDotsonto(2,4)}\def\NNEod{\ruDotsonto(2,4)}%%ascii
+\def\SSWod{\ldDotsonto(2,4)}\def\SSEod{\rdDotsonto(2,4)}%%ascii
+\def\WNWod{\luDotsonto(4,2)}\def\ENEod{\ruDotsonto(4,2)}%%ascii
+\def\WSWod{\ldDotsonto(4,2)}\def\ESEod{\rdDotsonto(4,2)}%%ascii
+\def\NNNWod{\luDotsonto(2,6)}\def\NNNEod{\ruDotsonto(2,6)}%%ascii
+\def\SSSWod{\ldDotsonto(2,6)}\def\SSSEod{\rdDotsonto(2,6)}%%ascii
+\def\WWNWod{\luDotsonto(6,2)}\def\EENEod{\ruDotsonto(6,2)}%%ascii
+\def\WWSWod{\ldDotsonto(6,2)}\def\EESEod{\rdDotsonto(6,2)}%%ascii
+
+%%======================================================================%
+%% %
+%% (25) MISCELLANEOUS %
+%% %
+%%======================================================================%
+
+\def\labelstyle{%%
+\ifincommdiag%%
+\textstyle%%
+\else%%
+\scriptstyle%%
+\fi}%%
+\let\objectstyle\displaystyle
+
+\newdiagramgrid{pentagon}{0.618034,0.618034,1,1,1,1,0.618034,0.618034}{1.%
+17557,1.17557,1.902113,1.902113}
+
+\newdiagramgrid{perspective}{0.75,0.75,1.1,1.1,0.9,0.9,0.95,0.95,0.75,0.75}{0%
+.75,0.75,1.1,1.1,0.9,0.9}
+
+\diagramstyle[%%ascii open square bracket
+dpi=300,%% office laserwriters are usually 300 dots per inch
+vmiddle,nobalance,%% vertical and horizontal positioning
+loose,%% allow rows and columns to stretch
+thin,%% line10 arrows; default rule thickness (TeXbook p447)
+pilespacing=10pt,%
+%% parallel vertical separation (horizontals: half this)
+shortfall=4pt,%% distance between arrowheads and their targets
+%% The following are defaulted on entry to the diagram itself.
+%% l>=2em minimum length of horizontal arrow shafts in text
+%% l>=1em ditto in diagrams
+%% size=3em cell size
+%% heads=LaTeX arrowheads
+]%%ascii close square bracket
+
+%% process options to LaTeX2e's \usepackage[options]{diagrams}
+\ifx\ProcessOptions\CD@qK\else\CD@PK\ProcessOptions\relax\CD@FF\CD@e\fi\fi
+
+%%============================== THE END ====================================
+\CD@vE\message{| >>>>>>>> POSTSCRIPT MODE (DVIPS) IS NOW THE DEFAULT <<<<<<<<%
+<<<<|}\message{|(DVI mode has not been supported since 1992 and produces
+inferior|}\message{|results which are completely unsuitable for publication.
+However,|}\message{|if you really still need it, you can still get it by
+loading the |}\message{|package using ``\string\usepackage[UglyObsolete]{%
+diagrams}'' instead. ) |}\else\message{| >>>>>>>> USING UGLY OBSOLETE DVI CODE
+- PLEASE STOP <<<<<<<<<<<<|}\message{|(DVI mode has not been supported since
+1992 and produces inferior|}\message{|results which are completely unsuitable
+for publication - Please |}\message{|use the PostScript or PDF mode instead,
+for much better results.)|}\fi\cdrestoreat
+%% restore old category code for @ etc
+\message{===================================================================}%
+%% This is the end of Paul Taylor's commutative diagrams package.
+
diff --git a/macros/generic/diagrams/taylor/V3,93.tex b/macros/generic/diagrams/taylor/V3,93.tex
new file mode 100644
index 0000000000..1969460bb1
--- /dev/null
+++ b/macros/generic/diagrams/taylor/V3,93.tex
@@ -0,0 +1,1912 @@
+\message{==================================================================}%
+\message{<Paul Taylor's commutative diagrams - version 3.93, 9 June 2009>}%%
+%%
+%% This code runs the LaTeX \ProvidesPackage command iff it is defined.
+%% included at the request of Michael Downes <mjd@ams.org> March 2002.
+%% Put \listfiles in your LaTeX preamble to see what this is for.
+\expandafter\ifx\csname ProvidesPackage\endcsname\relax\toks0=\expandafter{%
+\fi\ProvidesPackage{diagrams}[2008/10/15 v3.93 Paul Taylor's commutative
+diagrams]%%
+\toks0=\bgroup}%%
+%%======================================================================%
+%% TeX macros for drawing category-theoretic diagrams %
+%% %
+%% Paul Taylor %
+%% %
+%% www.PaulTaylor.EU/diagrams %
+%% www.ctan.org/tex-archive/macros/generic/diagrams/taylor/ %
+%% %
+%% PLEASE READ THE MANUAL! %
+%% %
+%% Please ensure that you are registered with me as a user so that %
+%% you can be informed of future releases. Any electronic mail %
+%% message with "commutative" or "diagram" in the subject line %
+%% (such as your request for the package, a question about it, or %
+%% even an otherwise blank message) automatically registers you. %
+%% %
+%% %
+%% CONTENTS: %
+%% (O) corruption-sensitive hacks (to approx line 330) %
+%% Arrow components & commands - starts approx line 1240 %
+%% (22) auxillary macros for adjustment of components %
+%% (23) bits of arrows (\rhvee etc) %
+%% (24) arrow commands (\rTo etc) %
+%% (25) miscellaneous %
+%% Apart from these five sections, the rest is intended to be totally %
+%% meaningless in the undocumented version, which is approximately %
+%% 1913 lines long. Please do not waste trees by printing it out. %
+%% %
+%% COPYRIGHT NOTICE: %
+%% This package may be copied and used freely for any academic %
+%% (not commercial or military) purpose, on condition that it %
+%% is not altered in any way, and that an acknowledgement is %
+%% included in any published work making substantial use of it. %
+%% %
+%% IT IS SUPPLIED "AS IS", WITHOUT WARRANTY, EXPRESS OR IMPLIED. %
+%% %
+%% If you are doing something where mistakes cost money (or where %
+%% success brings financial profit) then you must use commercial %
+%% software, not this package. In any case, please remember to %
+%% keep several backup copies of all files, and check everything %
+%% visually before sending final copy to the publishers. %
+%% %
+%% You may use this package as a (substantial) aid to writing an %
+%% academic research or text book on condition that %
+%% (i) you contact me at a suitable time to ensure that you have %
+%% an up-to-date version (and any infelicities can be fixed), %
+%% (ii) you send me a copy of the book when it's published. %
+%% %
+%% HISTORY %
+%% 3.93 Released 9 June 2009 %
+%% Added support for XeTeX, with help from Apostolos Syropoulos. %
+%% 3.92 Released 31 December 2007 %
+%% 3.91 Released 31 August 2006 %
+%% Renamed "noPostScript" option as "UglyObsolete". %
+%% 3.90 Released 11 April 2004 %
+%% use PostScript=Rokicki not pure DVI by default %
+%% 3.89 Released 7 July 2002 %
+%% Added support for pdftex, which is recognised automatically. %
+%% 3.88 Released 1 September 2000 %
+%% Square hook tail: \newarrow{SquareInto}{sqhook}---> %
+%% 3.87 Released 1 September 1999 %
+%% This version was used for the final 1200dpi PS copy of my book %
+%% ``Practical Foundations of Mathematics'' (Cambridge Univ Press) %
+%% see http://www.PaulTaylor.EU/Practical_Foundations %
+%% 3.86 Released 1 September 1998 %
+%% New options hug and nohug in PostScript mode: [PS,nohug] uses %
+%% PS for the arrows without rotating the labels, but the way of %
+%% calculating the actual position of these horizontal labels on %
+%% will remain subject to alteration for some period of time --- %
+%% please send me examples if you feel that adjustment is needed. %
+%% %
+%% midvshaft and snake for vertical arrows %
+%% New option [gap=width] (default=shortfall) to use instead of %
+%% ~{\;} on horizontals and PS diagonals, as this caused ^ and _ %
+%% labels to be moved too far away from the shaft. %
+%% Added >-> and <-< heads and tails, same as >> and << but the %
+%% shaft goes *through* the extra arrowhead. %
+%% 3.85 Released 20 August 1997 %
+%% New option [crab=distance] shifts horizontals and PS diagonals %
+%% transversally by the specified distance (positive=upward). %
+%% New option [snake=distance] shifts midshaft horizontals and %
+%% PS diagonals longitudinally by the specified distance. %
+%% New option [leftflush], like [flushleft] but reckons alignment %
+%% from multiple verticals, or from text if there's no vertical. %
+%% Most of the history has been suppressed from the user version. %
+%% 3.83 Released 18 May 1995 %
+%% "dotted" option (set dot filler on maps) %
+%% Parallel maps (\pile) outside diagrams stretch correctly. %
+%% Option "LaTeXeqno" uses LaTeX's equation number and style %
+%% for "eqno"; LaTeX's \label command picks this up. %
+%% Suppress warnings & 2nd pass errors with "silent" option. %
+%% 3.81 Second alpha release 18 July 1994 %
+%% \overprint{text} sets text in maths and overprints it in the %
+%% current cell, centered in the column irrespective of other stuff%
+%% "repositionpullbacks" option uses this for \SEpbk etc %
+%% \newdiagramgrid declaration, grid option and pentagon grid. %
+%% 3.80 Alpha release for adjusted diagonals 15 July 1994. %
+%% Introduced landscape and portrait options. %
+%% Diagonals adjusted to meet their endpoints, at last!!!! %
+%% 3.28 Released 30 November 1993 %
+%% Peter Freyd's \puncture symbol provided. %
+%% 3.25 Released 30 January 1993 %
+%% LaTeX heads made default (unless \tenln undefined, when vee) %
+%% Circle, cross, little vee, little black triangle heads. %
+%% First-use warning when defaulted diagonal components are used. %
+%% AMSTEX emulation - works at least when amstex not present. %
+%% 3.24 Release 7 Sept 1992 advertised to users. %
+%% PostScript option introduced: %
+%% LaTeX, vee, curlyvee, triangle & blacktriangle heads & tails %
+%% TPIC option introduced as an alternative to \LaTeX@make@line. %
+%% Postscript arrows (basic code). %
+%% Implemented \newarrow \newarrowhead etc. %
+%% Horizontal arrows outside diagram can stretch by wordspacing. %
+%% Added < and > for labels on left and right of arrow; %
+%% 3.16 (20.7.90) as mass mailed; only have mangled version %
+%% -- all following version numbers are post-facto -- %
+%% 3 (Jan 90) stretching vertical arrows %
+%% 2 (Sept 89) horizontals stretch to objects; "superscript" labels %
+%% 1 (1987) horizontal arrows stretch to edge of cell %
+%% 0 (1986) implementation of Knuth's TeXercise 18.46 for my thesis %
+%%======================================================================%
+
+%%======================================================================%
+%% %
+%% (1) CORRUPTION-SENSITIVE HACKS %
+%% %
+%%======================================================================%
+
+%% CORRUPTION & \catcode WARNING
+
+%% BITNET (IBM) machines may corrupt certain important characters
+%% in transmission by electronic mail:
+%% 0123456789=digits, abcdefghijklmnopqrstuvwxyz=lowers,
+%% ABCDEFGHIJKLMNOPQRSTUVWXYZ=uppers, @=at (internal names),
+%% {}=curly braces (grouping), \=backslash (keywords),
+%% %=percent (comment), #=hash/sharp (argument), +=plus, -=minus,
+%% <>=angle brackets (relations \ifnum,\ifdim), ==equals,
+%% ,=comma, .=dot, :=colon, ;=semicolon, =space
+%% $=dollar (maths) is only used in the "bits of maps" section
+
+%% The following characters are marked by a comment including the word "ASCII",
+%% except in comments and messages:
+%% &=and (alignment), ~=tilde, |=vertical, []=square brackets,
+%% ^=caret (superscript), _=underline (subscript),
+%% "=double quote (hex), ()=round brackets,
+%% /=slash, ?=query, !=pling/bang,
+%% The following are no longer flagged:
+%% `=grave/backquote (catcodes), '=acute/single quote (octal),
+
+%% The \catcode's marked * are assumed for reading this file:
+%% \=0* {=1* }=2* $=3 &=4 return=5* #=6 ^=7 _=8 ignored=9*
+%% space=10* letter=11* other=12 active=13 %=14* invalid=15
+%% If you want to load this package inside Stallman's "texinfo", you must do
+%%% @catcode`@\=0 \catcode`\%=14 \input diagrams \catcode`\%=12 \catcode`\\=13
+%% and then use @diagram @rTo @\ @enddiagram etc. (braces {} stay the same).
+%% Also need @catcode`@&=4.
+
+%%*** You *MUST NOT* use the internal commands (with names beginning \CD@)****
+
+%% don't load me twice!
+\ifx\diagram\isundefined\else\message{WARNING: the \string\diagram\space
+command is already defined and will not be loaded again}\expandafter\endinput
+\fi
+
+%% make @ letter, saving its old code to restore at the end of this file
+%%% look for this on the last line of the file if you think something's missing!
+%% the other \catcode assignments are to make it work with texinfo.
+\edef\cdrestoreat{%%
+\noexpand\catcode`\noexpand\@=\the\catcode`\@%%
+\noexpand\catcode`\noexpand\#=\the\catcode`\#%%
+\noexpand\catcode`\noexpand\$=\the\catcode`\$%%
+\noexpand\catcode`\noexpand\<=\the\catcode`\<%%
+\noexpand\catcode`\noexpand\>=\the\catcode`\>%%
+\noexpand\catcode`\noexpand\:=\the\catcode`\:%% Johannes L. Braams's
+\noexpand\catcode`\noexpand\;=\the\catcode`\;%% Babel languages package
+\noexpand\catcode`\noexpand\!=\the\catcode`\!%% makes these \active.
+\noexpand\catcode`\noexpand\?=\the\catcode`\?%%
+\noexpand\catcode`\noexpand\+=\the\catcode'53%% texinfo @+ is @outer@active
+}\catcode`\@=11 \catcode`\#=6 \catcode`\<=12 \catcode`\>=12 \catcode'53=12
+\catcode`\:=12 \catcode`\;=12 \catcode`\!=12 \catcode`\?=12
+
+%% Change y to n if pool_size in your implementation of TeX is small.
+%% This is reasonable if you have a small ("personal") computer, but if you
+%%% have a sun, dec, hp, ... workstation or a mainframe, complain to your local
+%% system manager and get him/her to install a version of TeX with bigger
+%% parameters. The "hash size" (number of command names) gets you next.
+\ifx\diagram@help@messages\CD@qK\let\diagram@help@messages y\fi
+
+%% The following macro is used to include literal PostScript commands in the
+%% DVI file for rotation, etc. Since this goes beyond standard TeX, it is
+%%% dependent on the convention used by your local DVI-to-PostScript translator.
+%% Choose whichever line applies to the program used at your site, or, if
+%% yours is not listed, consult the manual, experiment with this macro and
+%% (please) tell me what is needed to make it work.
+%%
+%%
+%%% dvips (Tomas Rokicki, Radical Eye) labrea.stanford.edu /pub/dvips9999.tar.Z
+%% CTAN: dviware/dvips
+\def\cdps@Rokicki#1{\special{ps:#1}}\let\cdps@dvips\cdps@Rokicki\let
+\cdps@RadicalEye\cdps@Rokicki\let\CD@HB\cdps@Rokicki\let\CD@IK\cdps@Rokicki
+\let\CD@HB\cdps@Rokicki%%
+%% I'm not sure that the rest work.
+%%
+%% dvitps (Stephan Bechtolsheim, Integrated Computer Systems)
+%% arthur.cs.purdue.edu /pub/TeXPS-9.99.tar.Z
+\def\cdps@Bechtolsheim#1{\special{dvitps: Literal "#1"}}%
+%% ASCII two dbl quotes
+\let\cdps@dvitps\cdps@Bechtolsheim\let\cdps@IntegratedComputerSystems
+\cdps@Bechtolsheim%%
+%% dvitops (James Clark)
+%% CTAN: dviware/dvitops
+\def\cdps@Clark#1{\special{dvitops: inline #1}}%%
+\let\cdps@dvitops\cdps@Clark%%
+%% OzTeX (Andrew Trevorrow) cannot be used
+\let\cdps@OzTeX\empty\let\cdps@oztex\empty\let\cdps@Trevorrow\empty%%
+%% dvi3ps (Kevin Coombes)
+%% CTAN: dviware/dvi2ps/dvi3ps
+\def\cdps@Coombes#1{\special{ps-string #1}}%%
+%% psprint (Trevorrow) CTAN: dviware/psprint
+%% dvi2ps (Senn) CTAN: dviware/dvi2ps
+%% psdvi (Elwell) CTAN: dviware/dvi2ps/psdvi
+
+\count@=\year\multiply\count@12 \advance\count@\month%%
+\ifnum\count@>24144 %% (December 2011)
+\message{***********************************************************}%%ascii
+\message{! YOU HAVE AN OUT OF DATE VERSION OF COMMUTATIVE DIAGRAMS! *}%%
+\message{! it expired in December 2009 and is time-bombed for April *}%%
+\message{! You may get an up to date version of this package from *}%%ascii
+\message{! either www.ctan.org or www.PaulTaylor.EU/diagrams/ *}%%
+\message{***********************************************************}%%ascii
+\ifnum\count@>24147 %% (March 2012)
+\errhelp{You may press RETURN and carry on for the time being.}\message{! It
+is embarrassing to see papers in conference proceedings}\message{! and
+journals containing bugs which I had fixed years before.}\message{! It is easy
+to obtain and install a new version, which will}\errmessage{! remain
+compatible with your files. Please get it NOW.}\fi\fi
+
+\def\CD@DE{\global\let}\def\CD@RH{\outer\def}
+
+%% safe names for braces, tab (&) and maths ($), as commands and for messages
+{\escapechar\m@ne\xdef\CD@o{\string\{}\xdef\CD@yC{\string\}}%%
+%%
+%% three ASCII ampersands (ands) (&&&) appear on the next line
+\catcode`\&=4 \CD@DE\CD@Q=&\xdef\CD@S{\string\&}%%ascii three ands
+%%
+%% ASCII ^ and _ each appear twice on next line
+%% six ASCII dollars ($$$$$$) appear on the next two lines.
+\catcode`\$=3 \CD@DE\CD@k=$\CD@DE\CD@ND=$%%ascii three dollars
+\xdef\CD@nC{\string\$}\gdef\CD@LG{$$}%%ascii three dollars
+%%
+%% two ASCII underlines (__) appear on the next line.
+\catcode`\_=8 \CD@DE\CD@lJ=_%%ascii two underlines
+%%
+%% eight ASCII carets (^^^^^^^^) appear on the next three lines.
+\obeylines\catcode`\^=7 \CD@DE\@super=^%%ascii two carets
+\ifnum\newlinechar=10 \gdef\CD@uG{^^J}%%ascii two carets
+\else\ifnum\newlinechar=13 \gdef\CD@uG{^^M}%%ascii two carets
+\else\ifnum\newlinechar=-1 \gdef\CD@uG{^^J}%%ascii two carets
+\else\CD@DE\CD@uG\space\expandafter\message{! input error: \noexpand
+\newlinechar\space is ASCII \the\newlinechar, not LF=10 or CR=13.}%%
+\fi\fi\fi}%%
+
+%% avoid using <> (because I personally re-define them to mean \langle\rangle)
+\mathchardef\lessthan='30474 \mathchardef\greaterthan='30476
+
+%% LaTeX line and arrowhead font
+%% the "hit return" comments show up if the font is missing.
+\ifx\tenln\CD@qK%%
+\font\tenln=line10\relax%% Hit return - who needs diagonals?
+\fi\ifx\tenlnw\CD@qK\ifx\tenln\nullfont\let\tenlnw\nullfont\else%%
+\font\tenlnw=linew10\relax%% Hit return - who needs diagonals?
+\fi\fi%%
+
+%% report line numbers in TeX3 only
+\ifx\inputlineno\CD@qK\csname newcount\endcsname\inputlineno\inputlineno\m@ne
+\message{***************************************************}\message{!
+Obsolete TeX (version 2). You should upgrade to *}\message{! version 3, which
+has been available since 1990. *}\message{***********************************%
+****************}\fi
+
+\def\cd@shouldnt#1{\CD@KB{* THIS (#1) SHOULD NEVER HAPPEN! *}}
+
+%% turn round- and square-bracketed arguments into curly-bracketed
+\def\get@round@pair#1(#2,#3){#1{#2}{#3}}%%ascii round brackets ()
+\def\get@square@arg#1[#2]{#1{#2}}%%ascii square brackets []
+\def\CD@AE#1{\CD@PK\let\CD@DH\CD@@E\CD@@E#1,],}%%ascii sq brackets
+\def\CD@m{[}\def\CD@RD{]}\def\commdiag#1{{\let\enddiagram\relax\diagram[]#1%
+\enddiagram}}
+
+%% ASCII open square bracket occurs on next line
+\def\CD@BF{{\ifx\CD@EH[\aftergroup\get@square@arg\aftergroup\CD@YH\else
+\aftergroup\CD@JH\fi}}%%
+\def\CD@CF#1#2{\def\CD@YH{#1}\def\CD@JH{#2}\futurelet\CD@EH\CD@BF}
+
+%% ASCII vertical bar (|) occurs on the next line
+\def\CD@KK{|}
+
+\def\CD@PB{%% arguments to maps inside diagrams
+\tokcase\CD@DD:\CD@y\break@args;\catcase\@super:\upper@label;\catcase\CD@lJ:%
+\lower@label;\tokcase{~}:\middle@label;%%ascii tilde
+\tokcase<:\CD@iF;%%ascii less-than
+\tokcase>:\CD@iI;%%ascii greater-than
+\tokcase(:\CD@BC;%%)%ascii open round bracket
+\tokcase[:\optional@;%%]%ascii open square bracket
+\tokcase.:\CD@JJ;%%ascii dot 12.7.94
+\catcase\space:\eat@space;\catcase\bgroup:\positional@;\default:\CD@@A
+\break@args;\endswitch}
+
+\def\switch@arg{%% arguments to horizontal maps outside diagrams
+\catcase\@super:\upper@label;\catcase\CD@lJ:\lower@label;\tokcase[:\optional@
+;%%]%ascii open square bracket
+\tokcase.:\CD@JJ;%%ascii dot 12.7.94 % ; was : before 15.6.97
+\catcase\space:\eat@space;\catcase\bgroup:\positional@;\tokcase{~}:%
+\middle@label;%%ascii tilde (questionable!)
+\default:\CD@y\break@args;\endswitch}
+
+%% That's as much as you get to read "in clear" - the rest is private!
+
+\let\CD@tJ\relax\ifx\protect\CD@qK\let\protect\relax\fi\ifx\AtEndDocument
+\CD@qK\def\CD@PG{\CD@gB}\def\CD@GF#1#2{}\else\def\CD@PG#1{\edef\CD@CH{#1}%
+\expandafter\CD@oC\CD@CH\CD@OD}\def\CD@oC#1\CD@OD{\AtEndDocument{\typeout{%
+\CD@tA: #1}}}\def\CD@GF#1#2{\gdef#1{#2}\AtEndDocument{#1}}\fi\def\CD@ZA#1#2{%
+\def#1{\CD@PG{#2\CD@mD\CD@W}\CD@DE#1\relax}}\def\CD@uF#1\repeat{\def\CD@p{#1}%
+\CD@OF}\def\CD@OF{\CD@p\relax\expandafter\CD@OF\fi}\def\CD@sF#1\repeat{\def
+\CD@q{#1}\CD@PF}\def\CD@PF{\CD@q\relax\expandafter\CD@PF\fi}\def\CD@tF#1%
+\repeat{\def\CD@r{#1}\CD@QF}\def\CD@QF{\CD@r\relax\expandafter\CD@QF\fi}\def
+\CD@tG#1#2#3{\def#2{\let#1\iftrue}\def#3{\let#1\iffalse}#3}\if y%
+\diagram@help@messages\def\CD@rG#1#2{\csname newtoks\endcsname#1#1=%
+\expandafter{\csname#2\endcsname}}\else\csname newtoks\endcsname\no@cd@help
+\no@cd@help{See the manual}\def\CD@rG#1#2{\let#1\no@cd@help}\fi\chardef\CD@lF
+=1 \chardef\CD@lI=2 \chardef\CD@MH=5 \chardef\CD@tH=6 \chardef\CD@sH=7
+\chardef\CD@PC=9 \dimendef\CD@hI=2 \dimendef\CD@hF=3 \dimendef\CD@mF=4
+\dimendef\CD@mI=5 \dimendef\CD@wJ=6 \dimendef\CD@tI=8 \dimendef\CD@sI=9
+\skipdef\CD@uB=1 \skipdef\CD@NF=2 \skipdef\CD@tB=3 \skipdef\CD@ZE=4 \skipdef
+\CD@JK=5 \skipdef\CD@kI=6 \skipdef\CD@kF=7 \skipdef\CD@qI=8 \skipdef\CD@pI=9
+\countdef\CD@JC=9 \countdef\CD@gD=8 \countdef\CD@A=7 \def\sdef#1#2{\def#1{#2}%
+}\def\CD@L#1{\expandafter\aftergroup\csname#1\endcsname}\def\CD@RC#1{%
+\expandafter\def\csname#1\endcsname}\def\CD@sD#1{\expandafter\gdef\csname#1%
+\endcsname}\def\CD@vC#1{\expandafter\edef\csname#1\endcsname}\def\CD@nF#1#2{%
+\expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname}\def\CD@EE
+#1#2{\expandafter\CD@DE\csname#1\expandafter\endcsname\csname#2\endcsname}%
+\def\CD@AK#1{\csname#1\endcsname}\def\CD@XJ#1{\expandafter\show\csname#1%
+\endcsname}\def\CD@ZJ#1{\expandafter\showthe\csname#1\endcsname}\def\CD@WJ#1{%
+\expandafter\showbox\csname#1\endcsname}\def\CD@tA{Commutative Diagram}\edef
+\CD@kH{\string\par}\edef\CD@dC{\string\diagram}\edef\CD@HD{\string\enddiagram
+}\edef\CD@EC{\string\\}\def\CD@eF{LaTeX}\ifx\@ignoretrue\CD@qK\expandafter
+\CD@tG\csname if@ignore\endcsname\ignore@true\ignore@false\def\@ignoretrue{%
+\global\ignore@true}\def\@ignorefalse{\global\ignore@false}\fi
+
+\def\CD@g{{\ifnum0=`}\fi}\def\CD@wC{\ifnum0=`{\fi}}\def\catcase#1:{\ifcat
+\noexpand\CD@EH#1\CD@tJ\expandafter\CD@kC\else\expandafter\CD@dJ\fi}\def
+\tokcase#1:{\ifx\CD@EH#1\CD@tJ\expandafter\CD@kC\else\expandafter\CD@dJ\fi}%
+\def\CD@kC#1;#2\endswitch{#1}\def\CD@dJ#1;{}\let\endswitch\relax\def\default:%
+#1;#2\endswitch{#1}\ifx\at@\CD@qK\def\at@{@}\fi\edef\CD@P{\CD@o pt\CD@yC}%
+\CD@RC{\CD@P>}#1>#2>{\CD@z\rTo\sp{#1}\sb{#2}\CD@z}\CD@RC{\CD@P<}#1<#2<{\CD@z
+\lTo\sp{#1}\sb{#2}\CD@z}\CD@RC{\CD@P)}#1)#2){\CD@z\rTo\sp{#1}\sb{#2}\CD@z}%
+%%ascii round
+\CD@RC{\CD@P(}#1(#2({\CD@z\lTo\sp{#1}\sb{#2}\CD@z}%%ascii brack
+\def\CD@O{\def\endCD{\enddiagram}\CD@RC{\CD@P A}##1A##2A{\uTo<{##1}>{##2}%
+\CD@z\CD@z}\CD@RC{\CD@P V}##1V##2V{\dTo<{##1}>{##2}\CD@z\CD@z}\CD@RC{\CD@P=}{%
+\CD@z\hEq\CD@z}\CD@RC{\CD@P\CD@KK}{\vEq\CD@z\CD@z}\CD@RC{\CD@P\string\vert}{%
+\vEq\CD@z\CD@z}\CD@RC{\CD@P.}{\CD@z\CD@z}\let\CD@z\CD@Q}\def\CD@IE{\let\tmp
+\CD@JE\ifcat A\noexpand\CD@CH\else\ifcat=\noexpand\CD@CH\else\ifcat\relax
+\noexpand\CD@CH\else\let\tmp\at@\fi\fi\fi\tmp}\def\CD@JE#1{\CD@nF{tmp}{\CD@P
+\string#1}\ifx\tmp\relax\def\tmp{\at@#1}\fi\tmp}\def\CD@z{}\begingroup
+\aftergroup\def\aftergroup\CD@T\aftergroup{\aftergroup\def\catcode`\@\active
+\aftergroup @\endgroup{\futurelet\CD@CH\CD@IE}}\newcount\CD@uA\newcount\CD@vA
+\newcount\CD@wA\newcount\CD@xA\newdimen\CD@OA\newdimen\CD@PA\CD@tG\CD@gE
+\CD@@A\CD@y\CD@tG\CD@hE\CD@EA\CD@BA\newdimen\CD@RA\newdimen\CD@SA\newcount
+\CD@yA\newcount\CD@zA\newdimen\CD@QA\newbox\CD@DA\CD@tG\CD@lE\CD@dA\CD@bA
+\newcount\CD@LH\newcount\CD@TC\def\CD@V#1#2{\ifdim#1<#2\relax#1=#2\relax\fi}%
+\def\CD@X#1#2{\ifdim#1>#2\relax#1=#2\relax\fi}\newdimen\CD@XH\CD@XH=1sp
+\newdimen\CD@zC\CD@zC\z@\def\CD@cJ{\ifdim\CD@zC=1em\else\CD@nJ\fi}\def\CD@nJ{%
+\CD@zC1em\def\CD@NC{\fontdimen8\textfont3 }\CD@@J\CD@NJ\setbox0=\vbox{\CD@t
+\noindent\CD@k\null\penalty-9993\null\CD@ND\null\endgraf\setbox0=\lastbox
+\unskip\unpenalty\setbox1=\lastbox\global\setbox\CD@IG=\hbox{\unhbox0\unskip
+\unskip\unpenalty\setbox0=\lastbox}\global\setbox\CD@KG=\hbox{\unhbox1\unskip
+\unpenalty\setbox1=\lastbox}}}\newdimen\CD@@I\CD@@I=1true in \divide\CD@@I300
+\def\CD@zH#1{\multiply#1\tw@\advance#1\ifnum#1<\z@-\else+\fi\CD@@I\divide#1%
+\tw@\divide#1\CD@@I\multiply#1\CD@@I}\def\MapBreadth{\afterassignment\CD@gI
+\CD@LF}\newdimen\CD@LF\newdimen\CD@oI\def\CD@gI{\CD@oI\CD@LF\CD@V\CD@@I{4%
+\CD@XH}\CD@X\CD@@I\p@\CD@zH\CD@oI\ifdim\CD@LF>\z@\CD@V\CD@oI\CD@@I\fi\CD@cJ}%
+\def\CD@RJ#1{\CD@zD\count@\CD@@I#1\ifnum\count@>\z@\divide\CD@@I\count@\fi
+\CD@gI\CD@NJ}\def\CD@NJ{\dimen@\CD@QC\count@\dimen@\divide\count@5\divide
+\count@\CD@@I\edef\CD@OC{\the\count@}}\def\CD@AJ{\CD@QJ\z@}\def\CD@QJ#1{%
+\CD@tI\axisheight\advance\CD@tI#1\relax\advance\CD@tI-.5\CD@oI\CD@zH\CD@tI
+\CD@sI-\CD@tI\advance\CD@tI\CD@LF}\newdimen\CD@DC\CD@DC\z@\newdimen\CD@eJ
+\CD@eJ\z@\def\CD@CJ#1{\CD@sI#1\relax\CD@tI\CD@sI\advance\CD@tI\CD@LF\relax}%
+\def\horizhtdp{height\CD@tI depth\CD@sI}\def\axisheight{\fontdimen22\the
+\textfont\tw@}\def\script@axisheight{\fontdimen22\the\scriptfont\tw@}\def
+\ss@axisheight{\fontdimen22\the\scriptscriptfont\tw@}\def\CD@NC{0.4pt}\def
+\CD@VK{\fontdimen3\textfont\z@}\def\CD@UK{\fontdimen3\textfont\z@}\newdimen
+\PileSpacing\newdimen\CD@nA\CD@nA\z@\def\CD@RG{\ifincommdiag1.3em\else2em\fi}%
+\newdimen\CD@YB\def\CellSize{\afterassignment\CD@kB\DiagramCellHeight}%
+\newdimen\DiagramCellHeight\DiagramCellHeight-\maxdimen\newdimen
+\DiagramCellWidth\DiagramCellWidth-\maxdimen\def\CD@kB{\DiagramCellWidth
+\DiagramCellHeight}\def\CD@QC{3em}\newdimen\MapShortFall\def\MapsAbut{%
+\MapShortFall\z@\objectheight\z@\objectwidth\z@}\newdimen\CD@iA\CD@iA\z@
+\CD@tG\CD@vE\CD@aB\CD@ZB\expandafter\ifx\expandafter\iftrue\csname
+ifUglyObsoleteDiagrams\endcsname\CD@ZB\else\CD@aB\fi\CD@nF{%
+ifUglyObsoleteDiagrams}{relax}\newif\ifUglyObsoleteDiagrams\def\CD@nK{\CD@aB
+\UglyObsoleteDiagramsfalse}\def\CD@oK{\CD@ZB\UglyObsoleteDiagramstrue}\CD@vE
+\CD@nK\else\CD@oK\fi\CD@tG\CD@hK\CD@dK\CD@cK\CD@cK\def\CD@sK{\ifx\pdfoutput
+\CD@qK\else\ifx\pdfoutput\relax\else\ifnum\pdfoutput>\z@\CD@pK\fi\fi\fi} \def
+\CD@pK{\global\CD@dK\global\CD@aB\global\UglyObsoleteDiagramsfalse\global\let
+\CD@n\empty\global\let\CD@oK\relax\global\let\CD@pK\relax\global\let\CD@sK
+\relax}\def\CD@tK#1{\special{pdf: literal #1}}\ifx\pdfliteral\CD@qK\else\ifx
+\pdfliteral\relax\else\let\CD@tK\pdfliteral\fi\fi\ifx\XeTeXrevision\CD@qK
+\else\ifx\XeTeXrevision\relax\else\ifdim\XeTeXrevision pt<.996pt \expandafter
+\message{! XeTeX version \XeTeXrevision\space does not support PDF literals,
+so diagonals will not work!}\else\expandafter\message{RUNNING UNDER XETEX
+\XeTeXrevision}\CD@pK\fi\fi\fi\CD@sK\def\newarrowhead{\CD@mG h\CD@BG\CD@GG>}%
+\def\newarrowtail{\CD@mG t\CD@BG\CD@GG>}\def\newarrowmiddle{\CD@mG m\CD@BG
+\hbox@maths\empty}\def\newarrowfiller{\CD@mG f\CD@bE\CD@MK-}\def\CD@mG#1#2#3#%
+4#5#6#7#8#9{\CD@RC{r#1:#5}{#2{#6}}\CD@RC{l#1:#5}{#2{#7}}\CD@RC{d#1:#5}{#3{#8}%
+}\CD@RC{u#1:#5}{#3{#9}}\CD@vC{-#1:#5}{\expandafter\noexpand\csname-#1:#4%
+\endcsname\noexpand\CD@MC}\CD@vC{+#1:#5}{\expandafter\noexpand\csname+#1:#4%
+\endcsname\noexpand\CD@MC}}\CD@ZA\CD@MC{\CD@eF\space diagonals are used unless
+PostScript is set}\def\defaultarrowhead#1{\edef\CD@sJ{#1}\CD@@J}\def\CD@@J{%
+\CD@IJ\CD@sJ<>ht\CD@IJ\CD@sJ<>th}\def\CD@IJ#1#2#3#4#5{\CD@HJ{r#4}{#3}{l#5}{#2%
+}{r#4:#1}\CD@HJ{r#5}{#2}{l#4}{#3}{l#4:#1}\CD@HJ{d#4}{#3}{u#5}{#2}{d#4:#1}%
+\CD@HJ{d#5}{#2}{u#4}{#3}{u#4:#1}}\def\CD@HJ#1#2#3#4#5{\begingroup\aftergroup
+\CD@GJ\CD@L{#1+:#2}\CD@L{#1:#2}\CD@L{#3:#4}\CD@L{#5}\endgroup}\def\CD@GJ#1#2#%
+3#4{\csname newbox\endcsname#1\def#2{\copy#1}\def#3{\copy#1}\setbox#1=\box
+\voidb@x}\def\CD@sJ{}\CD@@J\def\CD@GJ#1#2#3#4{\setbox#1=#4}\ifx\tenln
+\nullfont\def\CD@sJ{vee}\else\let\CD@sJ\CD@eF\fi\def\CD@xF#1#2#3{\begingroup
+\aftergroup\CD@wF\CD@L{#1#2:#3#3}\CD@L{#1#2:#3}\aftergroup\CD@yF\CD@L{#1#2:#3%
+-#3}\CD@L{#1#2:#3}\endgroup}\def\CD@wF#1#2{\def#1{\hbox{\rlap{#2}\kern.4%
+\CD@zC#2}}}\def\CD@yF#1#2{\def#1{\hbox{\rlap{#2}\kern.4\CD@zC#2\kern-.4\CD@zC
+}}}\CD@xF lh>\CD@xF rt>\CD@xF rh<\CD@xF rt<\def\CD@yF#1#2{\def#1{\hbox{\kern-%
+.4\CD@zC\rlap{#2}\kern.4\CD@zC#2}}}\CD@xF rh>\CD@xF lh<\CD@xF lt>\CD@xF lt<%
+\def\CD@wF#1#2{\def#1{\vbox{\vbox to\z@{#2\vss}\nointerlineskip\kern.4\CD@zC#%
+2}}}\def\CD@yF#1#2{\def#1{\vbox{\vbox to\z@{#2\vss}\nointerlineskip\kern.4%
+\CD@zC#2\kern-.4\CD@zC}}}\CD@xF uh>\CD@xF dt>\CD@xF dh<\CD@xF dt<\def\CD@yF#1%
+#2{\def#1{\vbox{\kern-.4\CD@zC\vbox to\z@{#2\vss}\nointerlineskip\kern.4%
+\CD@zC#2}}}\CD@xF dh>\CD@xF ut>\CD@xF uh<\CD@xF ut<\def\CD@BG#1{\hbox{%
+\mathsurround\z@\offinterlineskip\CD@k\mkern-1.5mu{#1}\mkern-1.5mu\CD@ND}}%
+\def\hbox@maths#1{\hbox{\CD@k#1\CD@ND}}\def\CD@GG#1{\hbox to\CD@LF{\setbox0=%
+\hbox{\offinterlineskip\mathsurround\z@\CD@k{#1}\CD@ND}\dimen0.5\wd0\advance
+\dimen0-.5\CD@oI\CD@zH{\dimen0}\kern-\dimen0\unhbox0\hss}}\def\CD@sB#1{\hbox
+to2\CD@LF{\hss\offinterlineskip\mathsurround\z@\CD@k{#1}\CD@ND\hss}}\def
+\CD@vF#1{\hbox{\mathsurround\z@\CD@k{#1}\CD@ND}}\def\CD@bE#1{\hbox{\kern-.15%
+\CD@zC\CD@k{#1}\CD@ND\kern-.15\CD@zC}}\def\CD@MK#1{\vbox{\offinterlineskip
+\kern-.2ex\CD@GG{#1}\kern-.2ex}}\def\@fillh{\xleaders\vrule\horizhtdp}\def
+\@fillv{\xleaders\hrule width\CD@LF}\CD@nF{rf:-}{@fillh}\CD@nF{lf:-}{@fillh}%
+\CD@nF{df:-}{@fillv}\CD@nF{uf:-}{@fillv}\CD@nF{rh:}{null}\CD@nF{rm:}{null}%
+\CD@nF{rt:}{null}\CD@nF{lh:}{null}\CD@nF{lm:}{null}\CD@nF{lt:}{null}\CD@nF{dh%
+:}{null}\CD@nF{dm:}{null}\CD@nF{dt:}{null}\CD@nF{uh:}{null}\CD@nF{um:}{null}%
+\CD@nF{ut:}{null}\CD@nF{+h:}{null}\CD@nF{+m:}{null}\CD@nF{+t:}{null}\CD@nF{-h%
+:}{null}\CD@nF{-m:}{null}\CD@nF{-t:}{null}\def\CD@@D{\hbox{\vrule height 1pt
+depth-1pt width 1pt}}\CD@RC{rf:}{\CD@@D}\CD@nF{lf:}{rf:}\CD@nF{+f:}{rf:}%
+\CD@RC{df:}{\CD@@D}\CD@nF{uf:}{df:}\CD@nF{-f:}{df:}\def\CD@BD{\CD@U\null
+\CD@@D\null\CD@@D\null}\edef\CD@lG{\string\newarrow}\def\newarrow#1#2#3#4#5#6%
+{\begingroup\edef\@name{#1}\edef\CD@oJ{#2}\edef\CD@iD{#3}\edef\CD@QG{#4}\edef
+\CD@jD{#5}\edef\CD@LE{#6}\let\CD@HE\CD@sG\let\CD@FK\CD@BH\let\@x\CD@AH\ifx
+\CD@oJ\CD@iD\let\CD@oJ\empty\fi\ifx\CD@LE\CD@jD\let\CD@LE\empty\fi\def\CD@LI{%
+r}\def\CD@SF{l}\def\CD@IC{d}\def\CD@yJ{u}\def\CD@gH{+}\def\@m{-}\ifx\CD@iD
+\CD@jD\ifx\CD@QG\CD@iD\let\CD@QG\empty\fi\ifx\CD@LE\empty\ifx\CD@iD\CD@aE\let
+\@x\CD@yG\else\let\@x\CD@zG\fi\fi\else\edef\CD@a{\CD@iD\CD@oJ}\ifx\CD@a\empty
+\ifx\CD@QG\CD@jD\let\CD@QG\empty\fi\fi\fi\ifmmode\aftergroup\CD@kG\else\CD@@A
+\CD@oB rh{head\space\space}\CD@LE\CD@oB rf{filler}\CD@iD\CD@oB rm{middle}%
+\CD@QG\ifx\CD@jD\CD@iD\else\CD@oB rf{filler}\CD@jD\fi\CD@oB rt{tail\space
+\space}\CD@oJ\CD@gE\CD@HE\CD@FK\@x\CD@nG l-2+2{lu}{nw}\NorthWest\CD@nG r+2+2{%
+ru}{ne}\NorthEast\CD@nG l-2-2{ld}{sw}\SouthWest\CD@nG r+2-2{rd}{se}\SouthEast
+\else\aftergroup\CD@b\CD@L{r\@name}\fi\fi\endgroup}\def\CD@sG{\CD@vG\CD@LI
+\CD@SF rl\Horizontal@Map}\def\CD@BH{\CD@vG\CD@IC\CD@yJ du\Vertical@Map}\def
+\CD@AH{\CD@vG\CD@gH\@m+-\Vector@Map}\def\CD@yG{\CD@vG\CD@gH\@m+-\Slant@Map}%
+\def\CD@zG{\CD@vG\CD@gH\@m+-\Slope@Map}\catcode`\/=\active\def\CD@vG#1#2#3#4#%
+5{\CD@jG#1#3#5t:\CD@oJ/f:\CD@iD/m:\CD@QG/f:\CD@jD/h:\CD@LE//\CD@jG#2#4#5h:%
+\CD@LE/f:\CD@jD/m:\CD@QG/f:\CD@iD/t:\CD@oJ//}\def\CD@jG#1#2#3#4//{\edef\CD@fG
+{#2}\aftergroup\sdef\CD@L{#1\@name}\aftergroup{\aftergroup#3\CD@M#4//%
+\aftergroup}}\def\CD@M#1/{\edef\CD@EH{#1}\ifx\CD@EH\empty\else\CD@L{\CD@fG#1}%
+\expandafter\CD@M\fi}\catcode`\/=12 \def\CD@nG#1#2#3#4#5#6#7#8{\aftergroup
+\sdef\CD@L{#6\@name}\aftergroup{\CD@L{#2\@name}\if#2#4\aftergroup\CD@CI\else
+\aftergroup\CD@BI\fi\CD@L{#1\@name}%
+%% ASCII round brackets and comma (,) appear on the next line
+\aftergroup(\aftergroup#3\aftergroup,\aftergroup#5\aftergroup)\aftergroup}}%
+\def\CD@oB#1#2#3#4{\expandafter\ifx\csname#1#2:#4\endcsname\relax\CD@y\CD@gB{%
+arrow#3 "#4" undefined}\fi}\CD@rG\CD@VE{All five components must be defined
+before an arrow.}\CD@rG\CD@SE{\CD@lG, unlike \string\HorizontalMap, is a
+declaration.}\def\CD@b#1{\CD@YA{Arrows \string#1 etc could not be defined}%
+\CD@VE}\def\CD@kG{\CD@YA{misplaced \CD@lG}\CD@SE}\def\newdiagramgrid#1#2#3{%
+\CD@RC{cdgh@#1}{#2,],}%% ASCII close square bracket
+\CD@RC{cdgv@#1}{#3,],}}%% ASCII close square bracket
+\CD@tG\ifincommdiag\incommdiagtrue\incommdiagfalse\CD@tG\CD@@F\CD@IF\CD@HF
+\newcount\CD@VA\CD@VA=0 \def\CD@yH{\CD@VA6 }\def\CD@OB{\CD@VA1 \global\CD@yA1
+\CD@DE\CD@YF\empty}\def\CD@YF{}\def\CD@nB#1{\relax\CD@MD\edef\CD@vJ{#1}%
+\begingroup\CD@rE\else\ifcase\CD@VA\ifmmode\else\CD@YG\CD@E0\fi\or\CD@cE5\or
+\CD@YG\CD@F5\or\CD@YG\CD@B5\or\CD@YG\CD@B5\or\CD@YG\CD@C5\or\CD@cE7\or\CD@YG
+\CD@D7\fi\fi\endgroup\xdef\CD@YF{#1}}\def\CD@pB#1#2#3#4#5{\relax\CD@MD\xdef
+\CD@vJ{#4}\begingroup\ifnum\CD@VA<#1 \expandafter\CD@cE\ifcase\CD@VA0\or#2\or
+#3\else#2\fi\else\ifnum\CD@VA<6 \CD@tJ\CD@YG\CD@B#2\else\CD@YG\CD@G#2\fi\fi
+\endgroup\CD@DE\CD@YF\CD@vJ\ifincommdiag\let\CD@ZD#5\else\let\CD@ZD\CD@LK\fi}%
+\def\CD@yI{\global\CD@yA=\ifnum\CD@VA<5 1\else2\fi\relax}\def\CD@OI{\CD@VA
+\CD@yA}\def\CD@cE#1{\aftergroup\CD@VA\aftergroup#1\aftergroup\relax}\def
+\CD@HH{\def\CD@nB##1{\relax}\let\CD@pB\CD@FH\let\CD@yH\relax\let\CD@OB\relax
+\let\CD@yI\relax\let\CD@OI\relax}\def\CD@FH#1#2#3#4#5{\ifincommdiag\let\CD@ZD
+#5\else\xdef\CD@vJ{#4}\let\CD@ZD\CD@LK\fi}\def\CD@YG#1{\aftergroup#1%
+\aftergroup\relax\CD@cE}\def\CD@B{\CD@YE\CD@S\CD@ME\CD@Q}\def\CD@G{\CD@YE{%
+\CD@yC\CD@S}\CD@XE\CD@QD\CD@Q}\def\CD@F{\CD@YE{*\CD@S}\CD@RE\clubsuit\CD@Q}%
+\def\CD@C{\CD@YE{\CD@S*\CD@S}\CD@RE\CD@Q\clubsuit\CD@Q}\def\CD@D{\CD@YE\CD@EC
+\CD@TE\\}\def\CD@E{\CD@YE\CD@nC\CD@QE\CD@k}\def\CD@LK{\CD@YA{\CD@vJ\space
+ignored \CD@dH}\CD@WE}\def\CD@FE{}\def\CD@d{\CD@YA{maps must never be enclosed
+in braces}\CD@OE}\def\CD@dH{outside diagram}\def\CD@FC{\string\HonV, \string
+\VonH\space and \string\HmeetV}\CD@rG\CD@ME{The way that horizontal and
+vertical arrows are terminated implicitly means\CD@uG that they cannot be
+mixed with each other or with \CD@FC.}\CD@rG\CD@XE{\string\pile\space is for
+parallel horizontal arrows; verticals can just be put together in\CD@uG a cell%
+. \CD@FC\space are not meaningful in a \string\pile.}\CD@rG\CD@RE{The
+horizontal maps must point to an object, not each other (I've put in\CD@uG one
+which you're unlikely to want). Use \string\pile\space if you want them
+parallel.}\CD@rG\CD@TE{Parallel horizontal arrows must be in separate layers
+of a \string\pile.}\CD@rG\CD@QE{Horizontal arrows may be used \CD@dH s, but
+must still be in maths.}\CD@rG\CD@WE{Vertical arrows, \CD@FC\space\CD@dH s don%
+'t know where\CD@uG where to terminate.}\CD@rG\CD@OE{This prevents them from
+stretching correctly.}\def\CD@YE#1{\CD@YA{"#1" inserted \ifx\CD@YF\empty
+before \CD@vJ\else between \CD@YF\ifx\CD@YF\CD@vJ s\else\space and \CD@vJ\fi
+\fi}}\count@=\year\multiply\count@12 \advance\count@\month\ifnum\count@>24151
+\message{because this one expired in July 2012!}\expandafter\endinput\fi\def
+\Horizontal@Map{\CD@nB{horizontal map}\CD@LC\CD@TJ\CD@qD}\def\CD@TJ{\CD@GB-%
+9999 \let\CD@ZD\CD@XD\ifincommdiag\else\CD@cJ\ifinpile\else\skip2\z@ plus 1.5%
+\CD@VK minus .5\CD@UK\skip4\skip2 \fi\fi\let\CD@kD\@fillh\CD@nF{fill@dot}{rf:%
+.}}\def\Vector@Map{\CD@HK4}\def\Slant@Map{\CD@HK{\CD@EF255\else6\fi}}\def
+\Slope@Map{\CD@HK\CD@OC}\def\CD@HK#1#2#3#4#5#6{\CD@LC\def\CD@WK{2}\def\CD@aK{%
+2}\def\CD@ZK{1}\def\CD@bK{1}\let\Horizontal@Map\CD@nI\def\CD@OG{#1}\def\CD@NI
+{\CD@U#2#3#4#5#6}}\def\CD@nI{\CD@TJ\CD@JB\let\CD@ZD\CD@TD\CD@qD}\CD@tG\CD@pE
+\CD@rA\CD@qA\CD@rA\def\cds@missives{\CD@rA}\def\CD@TD{\CD@vE\let\CD@OG\CD@OC
+\CD@x\CD@zE\CD@WF\fi\setbox0\hbox{\incommdiagfalse\CD@HI}\CD@pE\CD@aD\else
+\global\CD@YC\CD@bD\fi\ifvoid6 \ifvoid7 \CD@eE\fi\fi\CD@zE\else\CD@BD\global
+\CD@YC\let\CD@CG\CD@IH\CD@YD\fi\else\CD@NI\CD@MI\global\CD@YC\CD@YD\fi}\def
+\CD@LC{\begingroup\dimen1=\MapShortFall\dimen2=\CD@RG\dimen5=\MapShortFall
+\setbox3=\box\voidb@x\setbox6=\box\voidb@x\setbox7=\box\voidb@x\CD@pD
+\mathsurround\z@\skip2\z@ plus1fill minus 1000pt\skip4\skip2 \CD@TB}\CD@tG
+\CD@tE\CD@UB\CD@TB\def\CD@U#1#2#3#4#5{\let\CD@oJ#1\let\CD@iD#2\let\CD@QG#3%
+\let\CD@jD#4\let\CD@LE#5\CD@TB\ifx\CD@iD\CD@jD\CD@UB\fi}\def\CD@qD#1#2#3#4#5{%
+\CD@U#1#2#3#4#5\CD@tD}\def\Vertical@Map{\CD@pB433{vertical map}\CD@cD\CD@LC
+\CD@GB-9995 \let\CD@kD\@fillv\CD@nF{fill@dot}{df:.}\CD@qD}\def\break@args{%
+\def\CD@tD{\CD@ZD}\CD@ZD\endgroup\aftergroup\CD@FE}\def\CD@MJ{\setbox1=\CD@oJ
+\setbox5=\CD@LE\ifvoid3 \ifx\CD@QG\null\else\setbox3=\CD@QG\fi\fi\CD@@G2%
+\CD@iD\CD@@G4\CD@jD}\def\CD@pF#1{\ifvoid1\else\CD@oF1#1\fi\ifvoid2\else\CD@oF
+2#1\fi\ifvoid3\else\CD@oF3#1\fi\ifvoid4\else\CD@oF4#1\fi\ifvoid5\else\CD@oF5#%
+1\fi} \def\CD@oF#1#2{\setbox#1\vbox{\offinterlineskip\box#1\dimen@\prevdepth
+\advance\dimen@-#2\relax\setbox0\null\dp0\dimen@\ht0-\dimen@\box0}}\def\CD@@G
+#1#2{\ifx#2\CD@kD\setbox#1=\box\voidb@x\else\setbox#1=#2\def#2{\xleaders\box#%
+1}\fi}\CD@ZA\CD@BK{\string\HorizontalMap, \string\VerticalMap\space and
+\string\DiagonalMap\CD@uG are obsolete - use \CD@lG\space to pre-define maps}%
+\def\HorizontalMap#1#2#3#4#5{\CD@BK\CD@nB{old horizontal map}\CD@LC\CD@TJ\def
+\CD@oJ{\CD@UH{#1}}\CD@SH\CD@iD{#2}\def\CD@QG{\CD@UH{#3}}\CD@SH\CD@jD{#4}\def
+\CD@LE{\CD@UH{#5}}\CD@tD}\def\VerticalMap#1#2#3#4#5{\CD@BK\CD@pB433{vertical
+map}\CD@cD\CD@LC\CD@GB-9995 \let\CD@kD\@fillv\def\CD@oJ{\CD@GG{#1}}\CD@VH
+\CD@iD{#2}\def\CD@QG{\CD@GG{#3}}\CD@VH\CD@jD{#4}\def\CD@LE{\CD@GG{#5}}\CD@tD}%
+\def\DiagonalMap#1#2#3#4#5{\CD@BK\CD@LC\def\CD@OG{4}\let\CD@kD\CD@qK\let
+\CD@ZD\CD@YD\def\CD@WK{2}\def\CD@aK{2}\def\CD@ZK{1}\def\CD@bK{1}\def\CD@QG{%
+\CD@vF{#3}}\ifPositiveGradient\let\mv\raise\def\CD@oJ{\CD@vF{#5}}\def\CD@iD{%
+\CD@vF{#4}}\def\CD@jD{\CD@vF{#2}}\def\CD@LE{\CD@vF{#1}}\else\let\mv\lower\def
+\CD@oJ{\CD@vF{#1}}\def\CD@iD{\CD@vF{#2}}\def\CD@jD{\CD@vF{#4}}\def\CD@LE{%
+\CD@vF{#5}}\fi\CD@tD}\def\CD@aE{-}\def\CD@AD{\empty}\def\CD@SH{\CD@EG\CD@bE
+\CD@aE\@fillh}\def\CD@VH{\CD@EG\CD@MK\CD@KK\@fillv}\def\CD@EG#1#2#3#4#5{\def
+\CD@CH{#5}\ifx\CD@CH#2\let#4#3\else\let#4\null\ifx\CD@CH\empty\else\ifx\CD@CH
+\CD@AD\else\let#4\CD@CH\fi\fi\fi}\def\CD@UH#1{\hbox{\mathsurround\z@
+\offinterlineskip\def\CD@CH{#1}\ifx\CD@CH\empty\else\ifx\CD@CH\CD@AD\else
+\CD@k\mkern-1.5mu{\CD@CH}\mkern-1.5mu\CD@ND\fi\fi}}\def\CD@yD#1#2{\setbox#1=%
+\hbox\bgroup\setbox0=\hbox{\CD@k\labelstyle()\CD@ND}%% ASCII round brackets
+\setbox1=\null\ht1\ht0\dp1\dp0\box1 \kern.1\CD@zC\CD@k\bgroup\labelstyle
+\aftergroup\CD@LD\CD@xD}\def\CD@LD{\CD@ND\kern.1\CD@zC\egroup\CD@tD}\def
+\CD@xD{\futurelet\CD@EH\CD@mJ}\def\CD@mJ{%% qualifiers on label arguments
+\catcase\bgroup:\CD@v;\catcase\egroup:\missing@label;\catcase\space:\CD@TF;%
+\tokcase[:\CD@XF;%%]%ascii close square bracket
+\default:\CD@zJ;\endswitch}\def\CD@v{\let\CD@MD\CD@c\let\CD@CH}\def\CD@zJ#1{%
+\let\CD@UF\egroup{\let\actually@braces@missing@around@macro@in@label\CD@ZH
+\let\CD@MD\CD@xC\let\CD@UF\CD@VF#1%
+\actually@braces@missing@around@macro@in@label}\CD@UF}\def
+\actually@braces@missing@around@macro@in@label{\let\CD@CH=}\def\missing@label
+{\egroup\CD@YA{missing label}\CD@PE}\def\CD@xC{\egroup\missing@label}\outer
+\def\CD@ZH{}\def\CD@UF{}\def\CD@VF{\CD@wC\CD@UF}\def\CD@MD{}\def\CD@XF{\let
+\CD@N\CD@xD\get@square@arg\CD@AE}\CD@rG\CD@PE{The text which has just been
+read is not allowed within map labels.}\def\CD@c{\egroup\CD@YA{missing \CD@yC
+\space inserted after label}\CD@PE}\def\upper@label{\CD@oD\CD@yD6}\def
+\lower@label{\def\positional@{\CD@@A\break@args}\CD@yD7}\def\middle@label{%
+\CD@yD3}\CD@tG\CD@yE\CD@pD\CD@oD\def\CD@iF{\ifPositiveGradient\CD@tJ
+\expandafter\upper@label\else\expandafter\lower@label\fi}\def\CD@iI{%
+\ifPositiveGradient\CD@tJ\expandafter\lower@label\else\expandafter
+\upper@label\fi}\def\positional@{\CD@gB{labels as positional arguments are
+obsolete}\CD@yE\CD@tJ\expandafter\upper@label\else\expandafter\lower@label\fi
+-}\def\CD@tD{\futurelet\CD@EH\switch@arg}\def\eat@space{\afterassignment
+\CD@tD\let\CD@EH= }\def\CD@TF{\afterassignment\CD@xD\let\CD@EH= }\def\CD@BC{%
+\get@round@pair\CD@uD}\def\CD@uD#1#2{\def\CD@WK{#1}\def\CD@aK{#2}\CD@tD}\def
+\optional@{\let\CD@N\CD@tD\get@square@arg\CD@AE}\def\CD@JJ.{\CD@sC\CD@tD}\def
+\CD@sC{\let\CD@iD\fill@dot\let\CD@jD\fill@dot\def\CD@MI{\let\CD@iD\dfdot\let
+\CD@jD\dfdot}}\def\CD@MI{}\def\CD@@E#1,{\CD@nH#1,\begingroup\ifx\@name\CD@RD
+\CD@FF\aftergroup\CD@e\fi\aftergroup\CD@jC\else\expandafter\def\expandafter
+\CD@RF\expandafter{\csname\@name\endcsname}\expandafter\CD@vD\CD@RF\CD@KD\ifx
+\CD@RF\empty\aftergroup\CD@pC\expandafter\aftergroup\csname\CD@FB\@name
+\endcsname\expandafter\aftergroup\csname\CD@FB @\@name\endcsname\else\gdef
+\CD@GE{#1}\CD@gB{\string\relax\space inserted before `[\CD@GE'}\message{(I was
+trying to read this as a \CD@tA\ option.)}\aftergroup\CD@H\fi\fi\endgroup}%
+\def\CD@vD#1#2\CD@KD{\def\CD@RF{#2}}\def\CD@jC{\let\CD@CH\CD@N\let\CD@N\relax
+\CD@CH}\def\CD@H#1],{%% ASCII close square bracket
+\CD@jC\relax\def\CD@RF{#1}\ifx\CD@RF\empty\def\CD@RF{[\CD@GE]}%
+%% ASCII open and close square bracket
+\else\def\CD@RF{[\CD@GE,#1]}%% ASCII open and close square bracket
+\fi\CD@RF}\def\CD@pC#1#2{\ifx#2\CD@qK\ifx#1\CD@qK\CD@gB{option `\@name'
+undefined}\else#1\fi\else\CD@FF\expandafter#2\CD@GK\CD@PK\else\CD@QK\fi\fi
+\CD@DH}\CD@tG\CD@FF\CD@QK\CD@PK\def\CD@nH#1,{\CD@FF\ifx\CD@GK\CD@qK\CD@e\else
+\expandafter\CD@oH\CD@GK,#1,(,),(,)[]%
+%%ASCII 5commas two pairs round, pair square
+\fi\fi\CD@FF\else\CD@mH#1==,\fi}\def\CD@e{\CD@gB{option `\@name' needs (x,y)
+value}\CD@PK\let\@name\empty}\def\CD@mH#1=#2=#3,{\def\@name{#1}\def\CD@GK{#2}%
+\def\CD@RF{#3}\ifx\CD@RF\empty\let\CD@GK\CD@qK\fi}%
+%% ASCII 2commas 2pair round, pair square on next line
+\def\CD@oH#1(#2,#3)#4,(#5,#6)#7[]{\def\CD@GK{{#2}{#3}}\def\CD@RF{#1#4#5#6}%
+\ifx\CD@RF\empty\def\CD@RF{#7}\ifx\CD@RF\empty\CD@e\fi\else\CD@e\fi}\def
+\CD@FB{cds@}\let\CD@N\relax\def\CD@zD#1{\ifx\CD@GK\CD@qK\CD@gB{option `\@name
+' needs a value}\else#1\CD@GK\relax\fi}\def\CD@BE#1#2{\ifx\CD@GK\CD@qK#1#2%
+\relax\else#1\CD@GK\relax\fi}\def\cds@@showpair#1#2{\message{x=#1,y=#2}}\def
+\cds@@diagonalbase#1#2{\edef\CD@ZK{#1}\edef\CD@bK{#2}}\def\CD@DI#1{\def\CD@CH
+{#1}\CD@nF{@x}{cdps@#1}\ifx\CD@CH\empty\CD@f\CD@CH{cannot be used}\else\ifx
+\CD@CH\relax\CD@f\CD@CH{unknown}\else\let\CD@IK\@x\fi\fi}\def\CD@f#1#2{\CD@gB
+{PostScript translator `#1' #2}}\def\CD@PH{}\def\CD@PJ{\CD@fA\edef\CD@PH{%
+\noexpand\CD@KB{\@name\space ignored within maths}}}\def\diagramstyle{\CD@cJ
+\let\CD@N\relax\CD@CF\CD@AE\CD@AE}\let\diagramsstyle\diagramstyle\CD@tG\CD@sE
+\CD@SB\CD@RB\CD@tG\CD@qE\CD@EB\CD@DB\CD@tG\CD@oE\CD@pA\CD@oA\CD@tG\CD@iE
+\CD@HA\CD@GA\CD@HA\CD@tG\CD@jE\CD@JA\CD@IA\CD@tG\CD@kE\CD@LA\CD@KA\CD@tG
+\CD@EF\CD@DK\CD@CK\CD@tG\CD@rE\CD@JB\CD@IB\CD@tG\CD@mE\CD@gA\CD@fA\CD@tG
+\CD@nE\CD@kA\CD@jA\CD@tG\CD@AF\CD@iG\CD@hG\CD@RC{cds@ }{}\CD@RC{cds@}{}\CD@RC
+{cds@1em}{\CellSize1\CD@zC}\CD@RC{cds@1.5em}{\CellSize1.5\CD@zC}\CD@RC{cds@2%
+em}{\CellSize2\CD@zC}\CD@RC{cds@2.5em}{\CellSize2.5\CD@zC}\CD@RC{cds@3em}{%
+\CellSize3\CD@zC}\CD@RC{cds@3.5em}{\CellSize3.5\CD@zC}\CD@RC{cds@4em}{%
+\CellSize4\CD@zC}\CD@RC{cds@4.5em}{\CellSize4.5\CD@zC}\CD@RC{cds@5em}{%
+\CellSize5\CD@zC}\CD@RC{cds@6em}{\CellSize6\CD@zC}\CD@RC{cds@7em}{\CellSize7%
+\CD@zC}\CD@RC{cds@8em}{\CellSize8\CD@zC}\def\cds@abut{\MapsAbut\dimen1\z@
+\dimen5\z@}\def\cds@alignlabels{\CD@IA\CD@KA}\def\cds@amstex{\ifincommdiag
+\CD@O\else\def\CD{\diagram[amstex]}%%ascii square brackets []
+\fi\CD@T\catcode`\@\active}\def\cds@b{\let\CD@dB\CD@bB}\def\cds@balance{\let
+\CD@hA\CD@AA}\let\cds@bottom\cds@b\def\cds@center{\cds@vcentre\cds@nobalance}%
+\let\cds@centre\cds@center\def\cds@centerdisplay{\CD@HA\CD@PJ\cds@balance}%
+\let\cds@centredisplay\cds@centerdisplay\def\cds@crab{\CD@BE\CD@DC{.5%
+\PileSpacing}}\CD@RC{cds@crab-}{\CD@DC-.5\PileSpacing}\CD@RC{cds@crab+}{%
+\CD@DC.5\PileSpacing}\CD@RC{cds@crab++}{\CD@DC1.5\PileSpacing}\CD@RC{cds@crab%
+--}{\CD@DC-1.5\PileSpacing}\def\cds@defaultsize{\CD@BE{\let\CD@QC}{3em}\CD@NJ
+}\def\cds@displayoneliner{\CD@DB}\let\cds@dotted\CD@sC\def\cds@dpi{\CD@RJ{1%
+truein}}\def\cds@dpm{\CD@RJ{100truecm}}\let\CD@XA\CD@qK\def\cds@eqno{\let
+\CD@XA\CD@GK\let\CD@EJ\empty}\def\cds@fixed{\CD@qA}\CD@tG\CD@fE\CD@J\CD@I\def
+\cds@flushleft{\CD@I\CD@GA\CD@PJ\cds@nobalance\CD@BE\CD@nA\CD@nA}\def\cds@gap
+{\CD@AJ\setbox3=\null\ht3=\CD@tI\dp3=\CD@sI\CD@BE{\wd3=}\MapShortFall} \def
+\cds@grid{\ifx\CD@GK\CD@qK\let\h@grid\relax\let\v@grid\relax\else\CD@nF{%
+h@grid}{cdgh@\CD@GK}\CD@nF{v@grid}{cdgv@\CD@GK}\ifx\h@grid\relax\CD@gB{%
+unknown grid `\CD@GK'}\else\CD@WB\fi\fi}\let\h@grid\relax\let\v@grid\relax
+\def\cds@gridx{\ifx\CD@GK\CD@qK\else\cds@grid\fi\let\CD@CH\h@grid\let\h@grid
+\v@grid\let\v@grid\CD@CH}\def\cds@h{\CD@zD\DiagramCellHeight}\def\cds@hcenter
+{\let\CD@hA\CD@aA}\let\cds@hcentre\cds@hcenter\def\cds@heads{\CD@BE{\let
+\CD@sJ}\CD@sJ\CD@@J\CD@vE\else\ifx\CD@sJ\CD@eF\else\CD@MC\fi\fi}\let
+\cds@height\cds@h\let\cds@hmiddle\cds@balance\def\cds@htriangleheight{\CD@BE
+\DiagramCellHeight\DiagramCellHeight\DiagramCellWidth1.73205%
+\DiagramCellHeight}\def\cds@htrianglewidth{\CD@BE\DiagramCellWidth
+\DiagramCellWidth\DiagramCellHeight.57735\DiagramCellWidth}\CD@tG\CD@zE\CD@eE
+\CD@dE\CD@eE\def\cds@hug{\CD@eE} \def\cds@inline{\CD@gA\let\CD@PH\empty}\def
+\cds@inlineoneliner{\CD@EB}\CD@RC{cds@l>}{\CD@zD{\let\CD@RG}\dimen2=\CD@RG}%
+\def\cds@labelstyle{\CD@zD{\let\labelstyle}}\def\cds@landscape{\CD@kA}\def
+\cds@large{\CellSize5\CD@zC}\let\CD@EJ\empty\def\CD@FJ{\refstepcounter{%
+equation}\def\CD@XA{\hbox{\@eqnnum}}}\def\cds@LaTeXeqno{\let\CD@EJ\CD@FJ}\def
+\cds@lefteqno{\CD@pA}\def\cds@leftflush{\cds@flushleft\CD@J}\def
+\cds@leftshortfall{\CD@zD{\dimen1 }}\def\cds@lowershortfall{%
+\ifPositiveGradient\cds@leftshortfall\else\cds@rightshortfall\fi}\def
+\cds@loose{\CD@VB}\def\cds@midhshaft{\CD@JA}\def\cds@midshaft{\CD@JA}\def
+\cds@midvshaft{\CD@LA}\def\cds@moreoptions{\CD@@A}\let\cds@nobalance
+\cds@hcenter\def\cds@nohcheck{\CD@HH}\def\cds@nohug{\CD@dE} \def
+\cds@nooptions{\def\CD@aC{\CD@WD}}\let\cds@noorigin\cds@nobalance\def
+\cds@nopixel{\CD@@I4\CD@XH\CD@cJ}\def\cds@UO{\CD@oK\global\let\CD@n\empty}%
+\def\cds@UglyObsolete{\cds@UO\let\cds@PS\empty}\def\CD@rK#1{\CD@gB{option `#1%
+' renamed as `UglyObsolete'}}\def\cds@noPostScript{\CD@rK{noPostScript}}\def
+\cds@noPS{\CD@rK{noPostScript}}\def\cds@notextflow{\CD@RB}\def\cds@noTPIC{%
+\CD@CK}\def\cds@objectstyle{\CD@zD{\let\objectstyle}}\def\cds@origin{\let
+\CD@hA\CD@iB}\def\cds@p{\CD@zD\PileSpacing}\let\cds@pilespacing\cds@p\def
+\cds@pixelsize{\CD@zD\CD@@I\CD@gI}\def\cds@portrait{\CD@jA}\def
+\cds@PostScript{\CD@nK\global\let\CD@n\empty\CD@BE\CD@DI\empty}\def\cds@PS{%
+\CD@nK\global\let\CD@n\empty}\CD@GF\CD@n{\typeout{\CD@tA: try the PostScript
+option for better results}}\def\cds@repositionpullbacks{\let\make@pbk\CD@fH
+\let\CD@qH\CD@pH}\def\cds@righteqno{\CD@oA}\def\cds@rightshortfall{\CD@zD{%
+\dimen5 }}\def\cds@ruleaxis{\CD@zD{\let\axisheight}}\def\cds@cmex{\let\CD@GG
+\CD@sB\let\CD@QJ\CD@CJ}\def\cds@s{\cds@height\DiagramCellWidth
+\DiagramCellHeight}\def\cds@scriptlabels{\let\labelstyle\scriptstyle}\def
+\cds@shortfall{\CD@zD\MapShortFall\dimen1\MapShortFall\dimen5\MapShortFall}%
+\def\cds@showfirstpass{\CD@BE{\let\CD@nD}\z@}\def\cds@silent{\def\CD@KB##1{}%
+\def\CD@gB##1{}}\let\cds@size\cds@s\def\cds@small{\CellSize2\CD@zC}\def
+\cds@snake{\CD@BE\CD@eJ\z@}\def\cds@t{\let\CD@dB\CD@fB}\def\cds@textflow{%
+\CD@SB\CD@PJ}\def\cds@thick{\let\CD@rF\tenlnw\CD@LF\CD@NC\CD@BE\MapBreadth{2%
+\CD@LF}\CD@@J}\def\cds@thin{\let\CD@rF\tenln\CD@BE\MapBreadth{\CD@NC}\CD@@J}%
+\def\cds@tight{\CD@WB}\let\cds@top\cds@t\def\cds@TPIC{\CD@DK}\def
+\cds@uppershortfall{\ifPositiveGradient\cds@rightshortfall\else
+\cds@leftshortfall\fi}\def\cds@vcenter{\let\CD@dB\CD@cB}\let\cds@vcentre
+\cds@vcenter\def\cds@vtriangleheight{\CD@BE\DiagramCellHeight
+\DiagramCellHeight\DiagramCellWidth.577035\DiagramCellHeight}\def
+\cds@vtrianglewidth{\CD@BE\DiagramCellWidth\DiagramCellWidth
+\DiagramCellHeight1.73205\DiagramCellWidth}\def\cds@vmiddle{\let\CD@dB\CD@eB}%
+\def\cds@w{\CD@zD\DiagramCellWidth}\let\cds@width\cds@w\def\diagram{\relax
+\protect\CD@bC}\def\enddiagram{\protect\CD@SG}\def\CD@bC{\CD@g\CD@uI
+\incommdiagtrue\edef\CD@wI{\the\CD@NB}\global\CD@NB\z@\boxmaxdepth\maxdimen
+\everycr{}\CD@sK\everymath{}\everyhbox{}\ifx\pdfsyncstop\CD@qK\else
+\pdfsyncstop\fi\CD@aC}\def\CD@aC{\CD@y\let\CD@N\CD@ZC\CD@CF\CD@AE\CD@WD}\def
+\CD@ZC{\CD@gE\expandafter\CD@aC\else\expandafter\CD@WD\fi}\def\CD@WD{\let
+\CD@EH\relax\CD@nE\CD@vE\else\CD@hK\else\CD@KB{landscape ignored without
+PostScript}\CD@jA\fi\fi\fi\CD@EJ\setbox2=\vbox\bgroup\CD@JF\CD@VD}\def\CD@cH{%
+\CD@nE\CD@fB\else\CD@dB\fi\CD@hA\nointerlineskip\setbox0=\null\ht0-\CD@pI\dp0%
+\CD@pI\wd0\CD@kI\box0 \global\CD@QA\CD@kF\global\CD@yA\CD@XB\ifx\CD@NK\CD@qK
+\global\CD@RA\CD@kF\else\global\CD@RA\CD@NK\fi\egroup\CD@zF\CD@nE\setbox2=%
+\hbox to\dp2{\vrule height\wd2 depth\CD@QA width\z@\global\CD@QA\ht2\ht2\z@
+\dp2\z@\wd2\z@\CD@hK\CD@tK{q 0 1 -1 0 0 0 cm}\else\global\CD@iG\CD@IK{0 1
+bturn}\fi\box2\CD@gK\hss}\CD@DB\fi\ifnum\CD@yA=1 \else\CD@DB\fi\global
+\@ignorefalse\CD@mE\leavevmode\fi\ifvmode\CD@TA\else\ifmmode\CD@PH\CD@GI\else
+\CD@qE\CD@gA\fi\ifinner\CD@gA\fi\CD@mE\CD@GI\else\CD@sE\CD@QB\else\CD@TA\fi
+\fi\fi\fi\CD@dD}\def\CD@dD{\global\CD@NB\CD@wI\relax\CD@xE\global\CD@ID\else
+\aftergroup\CD@mC\fi\if@ignore\aftergroup\ignorespaces\fi\CD@wC\ignorespaces}%
+\def\CD@fB{\advance\CD@pI\dimen1\relax}\def\CD@eB{\advance\CD@pI.5\dimen1%
+\relax}\def\CD@bB{}\def\CD@cB{\CD@fB\advance\CD@pI\CD@YB\divide\CD@pI2
+\advance\CD@pI-\axisheight\relax}\def\CD@aA{}\def\CD@iB{\CD@kF\z@}\def\CD@AA{%
+\ifdim\dimen2>\CD@kF\CD@kF\dimen2 \else\dimen2\CD@kF\CD@kI\dimen0 \advance
+\CD@kI\dimen2 \fi}\def\CD@QB{\skip0\z@\relax\loop\skip1\lastskip\ifdim\skip1>%
+\z@\unskip\advance\skip0\skip1 \repeat\vadjust{\prevdepth\dp\strutbox\penalty
+\predisplaypenalty\vskip\abovedisplayskip\CD@UA\penalty\postdisplaypenalty
+\vskip\belowdisplayskip}\ifdim\skip0=\z@\else\hskip\skip0 \global\@ignoretrue
+\fi}\def\CD@TA{\CD@LG\kern-\displayindent\CD@UA\CD@LG\global\@ignoretrue}\def
+\CD@UA{\hbox to\hsize{\CD@fE\ifdim\CD@RA=\z@\else\advance\CD@QA-\CD@RA\setbox
+2=\hbox{\kern\CD@RA\box2}\fi\fi\setbox1=\hbox{\ifx\CD@XA\CD@qK\else\CD@k
+\CD@XA\CD@ND\fi}\CD@oE\CD@iE\else\advance\CD@QA\wd1 \fi\wd1\z@\box1 \fi\dimen
+0\wd2 \advance\dimen0\wd1 \advance\dimen0-\hsize\ifdim\dimen0>-\CD@nA\CD@HA
+\fi\advance\dimen0\CD@QA\ifdim\dimen0>\z@\CD@KB{wider than the page by \the
+\dimen0 }\CD@HA\fi\CD@iE\hss\else\CD@V\CD@QA\CD@nA\fi\CD@GI\hss\kern-\wd1\box
+1 }}\def\CD@GI{\CD@AF\CD@@F\else\CD@SC\global\CD@hG\fi\fi\kern\CD@QA\box2 }%
+\CD@tG\CD@wE\CD@YC\CD@XC\def\CD@JF{\CD@cJ\ifdim\DiagramCellHeight=-\maxdimen
+\DiagramCellHeight\CD@QC\fi\ifdim\DiagramCellWidth=-\maxdimen
+\DiagramCellWidth\CD@QC\fi\global\CD@XC\CD@IF\let\CD@FE\empty\let\CD@z\CD@Q
+\let\overprint\CD@eH\let\CD@s\CD@rJ\let\enddiagram\CD@ED\let\\\CD@cC\let\par
+\CD@jH\let\CD@MD\empty\let\switch@arg\CD@PB\let\shift\CD@iA\baselineskip
+\DiagramCellHeight\lineskip\z@\lineskiplimit\z@\mathsurround\z@\tabskip\z@
+\CD@OB}\def\CD@VD{\penalty-123 \begingroup\CD@jA\aftergroup\CD@K\halign
+\bgroup\global\advance\CD@NB1 \vadjust{\penalty1}\global\CD@FA\z@\CD@OB\CD@j#%
+#\CD@DD\CD@Q\CD@Q\CD@OI\CD@j##\CD@DD\cr}\def\CD@ED{\CD@MD\CD@GD\crcr\egroup
+\global\CD@JD\endgroup}\def\CD@j{\global\advance\CD@FA1 \futurelet\CD@EH\CD@i
+}\def\CD@i{\ifx\CD@EH\CD@DD\CD@tJ\hskip1sp plus 1fil \relax\let\CD@DD\relax
+\CD@vI\else\hfil\CD@k\objectstyle\let\CD@FE\CD@d\fi}\def\CD@DD{\CD@MD\relax
+\CD@yI\CD@vI\global\CD@QA\CD@iA\penalty-9993 \CD@ND\hfil\null\kern-2\CD@QA
+\null}\def\CD@cC{\cr}\def\across#1{\span\omit\mscount=#1 \global\advance
+\CD@FA\mscount\global\advance\CD@FA\m@ne\CD@sF\ifnum\mscount>2 \CD@fJ\repeat
+\ignorespaces}\def\CD@fJ{\relax\span\omit\advance\mscount\m@ne}\def\CD@qJ{%
+\ifincommdiag\ifx\CD@iD\@fillh\ifx\CD@jD\@fillh\ifdim\dimen3>\z@\else\ifdim
+\dimen2>93\CD@@I\ifdim\dimen2>18\p@\ifdim\CD@LF>\z@\count@\CD@bJ\advance
+\count@\m@ne\ifnum\count@<\z@\count@20\let\CD@aJ\CD@uJ\fi\xdef\CD@bJ{\the
+\count@}\fi\fi\fi\fi\fi\fi\fi}\def\CD@cG#1{\vrule\horizhtdp width#1\dimen@
+\kern2\dimen@}\def\CD@uJ{\rlap{\dimen@\CD@@I\CD@V\dimen@{.182\p@}\CD@zH
+\dimen@\advance\CD@tI\dimen@\CD@cG0\CD@cG0\CD@cG2\CD@cG6\CD@cG6\CD@cG2\CD@cG0%
+\CD@cG0\CD@cG2\CD@cG6\CD@cG0\CD@cG0\CD@cG2\CD@cG2\CD@cG6\CD@cG0\CD@cG0\CD@cG2%
+\CD@cG6\CD@cG2\CD@cG2\CD@cG0\CD@cG0}}\def\CD@bJ{10}\def\CD@aJ{}\def\CD@XD{%
+\CD@gE\CD@TB\fi\CD@x\CD@WF\CD@HI}\def\CD@x{\CD@QJ\CD@DC\CD@MJ\ifdim\CD@DC=\z@
+\else\CD@pF\CD@DC\fi\ifvoid3 \setbox3=\null\ht3\CD@tI\dp3\CD@sI\else\CD@V{\ht
+3}\CD@tI\CD@V{\dp3}\CD@sI\fi\dimen3=.5\wd3 \ifdim\dimen3=\z@\CD@tE\else\dimen
+3-\CD@XH\fi\else\CD@TB\fi\CD@V{\dimen2}{\wd7}\CD@V{\dimen2}{\wd6}\CD@qJ
+\advance\dimen2-2\dimen3 \dimen4.5\dimen2 \dimen2\dimen4 \advance\dimen2%
+\CD@eJ\advance\dimen4-\CD@eJ\advance\dimen2-\wd1 \advance\dimen4-\wd5 \ifvoid
+2 \else\CD@V{\ht3}{\ht2}\CD@V{\dp3}{\dp2}\CD@V{\dimen2}{\wd2}\fi\ifvoid4 \else
+\CD@V{\ht3}{\ht4}\CD@V{\dp3}{\dp4}\CD@V{\dimen4}{\wd4}\fi\advance\skip2\dimen
+2 \advance\skip4\dimen4 \CD@tE\advance\skip2\skip4 \dimen0\dimen5 \advance
+\dimen0\wd5 \skip3-\skip4 \advance\skip3-\dimen0 \let\CD@jD\empty\else\skip3%
+\z@\relax\dimen0\z@\fi}\def\CD@WF{\offinterlineskip\lineskip.2\CD@zC\ifvoid6
+\else\setbox3=\vbox{\hbox to2\dimen3{\hss\box6\hss}\box3}\fi\ifvoid7 \else
+\setbox3=\vtop{\box3 \hbox to2\dimen3{\hss\box7\hss}}\fi}\def\CD@HI{\kern
+\dimen1 \box1 \CD@aJ\CD@iD\hskip\skip2 \kern\dimen0 \ifincommdiag\CD@jE
+\penalty1\fi\kern\dimen3 \penalty\CD@GB\hskip\skip3 \null\kern-\dimen3 \else
+\hskip\skip3 \fi\box3 \CD@jD\hskip\skip4 \box5 \kern\dimen5}\def\CD@MF{\ifnum
+\CD@LH>\CD@TC\CD@V{\dimen1}\objectheight\CD@V{\dimen5}\objectheight\else\CD@V
+{\dimen1}\objectwidth\CD@V{\dimen5}\objectwidth\fi}\def\CD@Y{\begingroup
+\ifdim\dimen7=\z@\kern\dimen8 \else\ifdim\dimen6=\z@\kern\dimen9 \else\dimen5%
+\dimen6 \dimen6\dimen9 \CD@KJ\dimen4\dimen2 \CD@dG{\dimen4}\dimen6\dimen5
+\dimen7\dimen8 \CD@KJ\CD@iC{\dimen2}\ifdim\dimen2<\dimen4 \kern\dimen2 \else
+\kern\dimen4 \fi\fi\fi\endgroup}\def\CD@jJ{\CD@JI\setbox\z@\hbox{\lower
+\axisheight\hbox to\dimen2{\CD@DF\ifPositiveGradient\dimen8\ht\CD@MH\dimen9%
+\CD@mI\else\dimen8\dp3 \dimen9\dimen1 \fi\else\dimen8 \ifPositiveGradient
+\objectheight\else\z@\fi\dimen9\objectwidth\fi\advance\dimen8
+\ifPositiveGradient-\fi\axisheight\CD@Y\unhbox\z@\CD@DF\ifPositiveGradient
+\dimen8\dp3 \dimen9\dimen0 \else\dimen8\ht\CD@MH\dimen9\CD@mF\fi\else\dimen8
+\ifPositiveGradient\z@\else\objectheight\fi\dimen9\objectwidth\fi\advance
+\dimen8 \ifPositiveGradient\else-\fi\axisheight\CD@Y}}}\def\CD@bD{\dimen6
+\CD@aK\DiagramCellHeight\dimen7 \CD@WK\DiagramCellWidth\CD@jJ
+\ifPositiveGradient\advance\dimen7-\CD@ZK\DiagramCellWidth\else\dimen7 \CD@ZK
+\DiagramCellWidth\dimen6\z@\fi\advance\dimen6-\CD@bK\DiagramCellHeight\CD@mK
+\setbox0=\rlap{\kern-\dimen7 \lower\dimen6\box\z@}\ht0\z@\dp0\z@\raise
+\axisheight\box0 }\def\CD@mK{\setbox0\hbox{\ht\z@\z@\dp\z@\z@\wd\z@\z@\CD@hK
+\expandafter\CD@tK{q \CD@eK\space\CD@lK\space\CD@kK\space\CD@eK\space0 0 cm}%
+\else\global\CD@iG\CD@eD{\the\CD@TC\space\ifPositiveGradient\else-\fi\the
+\CD@LH\space bturn}\fi\box\z@\CD@gK}}\def\CD@vB{\advance\CD@hF-\CD@mI\CD@wJ
+\CD@hF\advance\CD@wJ\CD@hI\ifvoid\CD@sH\ifdim\CD@wJ<.1em\ifnum\CD@gD=\@m\else
+\CD@aG h\CD@wJ<.1em:objects overprint:\CD@FA\CD@gD\fi\fi\else\ifhbox\CD@sH
+\CD@SK\else\CD@TK\fi\advance\CD@wJ\CD@mI\CD@bH{-\CD@mI}{\box\CD@sH}{\CD@wJ}%
+\z@\fi\CD@hF-\CD@mF\CD@gD\CD@FA\CD@hI\z@}\def\CD@SK{\setbox\CD@sH=\hbox{%
+\unhbox\CD@sH\unskip\unpenalty}\setbox\CD@tH=\hbox{\unhbox\CD@tH\unskip
+\unpenalty}\setbox\CD@sH=\hbox to\CD@wJ{\CD@OA\wd\CD@sH\unhbox\CD@sH\CD@PA
+\lastkern\unkern\ifdim\CD@PA=\z@\CD@UB\advance\CD@OA-\wd\CD@tH\else\CD@TB\fi
+\ifnum\lastpenalty=\z@\else\CD@JA\unpenalty\fi\kern\CD@PA\ifdim\CD@hF<\CD@OA
+\CD@JA\fi\ifdim\CD@hI<\wd\CD@tH\CD@JA\fi\CD@jE\CD@hI\CD@wJ\advance\CD@hI-%
+\CD@OA\advance\CD@hI\wd\CD@tH\ifdim\CD@hI<2\wd\CD@tH\CD@aG h\CD@hI<2\wd\CD@tH
+:arrow too short:\CD@FA\CD@gD\fi\divide\CD@hI\tw@\CD@hF\CD@wJ\advance\CD@hF-%
+\CD@hI\fi\CD@tE\kern-\CD@hI\fi\hbox to\CD@hI{\unhbox\CD@tH}\CD@HG}}\CD@tG
+\ifinpile\inpiletrue\inpilefalse\inpilefalse\def\pile{\protect\CD@UJ\protect
+\CD@uH}\def\CD@uH#1{\CD@l#1\CD@QD}\def\CD@UJ{\CD@nB{pile}\setbox0=\vtop
+\bgroup\aftergroup\CD@lD\inpiletrue\let\CD@FE\empty\let\pile\CD@KF\let\CD@QD
+\CD@PD\let\CD@GD\CD@FD\CD@yH\baselineskip.5\PileSpacing\lineskip.1\CD@zC
+\relax\lineskiplimit\lineskip\mathsurround\z@\tabskip\z@\let\\\CD@wH}\def
+\CD@l{\CD@DE\CD@YF\empty\halign\bgroup\hfil\CD@k\let\CD@FE\CD@d\let\\\CD@vH##%
+\CD@MD\CD@ND\hfil\CD@Q\CD@R##\cr}\CD@rG\CD@NE{pile only allows one column.}%
+\CD@rG\CD@UE{you left it out!}\def\CD@R{\CD@QD\CD@Q\relax\CD@YA{missing \CD@yC
+\space inserted after \string\pile}\CD@NE}\def\CD@PD{\CD@MD\crcr\egroup
+\egroup}\def\CD@GD{\CD@MD}\def\CD@FD{\CD@MD\relax\CD@QD\CD@YA{missing \CD@yC
+\space inserted between \string\pile\space and \CD@HD}\CD@UE}\def\CD@QD{%
+\CD@MD}\def\CD@lD{\vbox{\dimen1\dp0 \unvbox0 \setbox0=\lastbox\advance\dimen1%
+\dp0 \nointerlineskip\box0 \nointerlineskip\setbox0=\null\dp0.5\dimen1\ht0-%
+\dp0 \box0}\ifincommdiag\CD@tJ\penalty-9998 \fi\xdef\CD@YF{pile}}\def\CD@vH{%
+\cr}\def\CD@wH{\noalign{\skip@\prevdepth\advance\skip@-\baselineskip
+\prevdepth\skip@}}\def\CD@KF#1{#1}\def\CD@TK{\setbox\CD@sH=\vbox{\unvbox
+\CD@sH\setbox1=\lastbox\setbox0=\box\voidb@x\CD@tF\setbox\CD@sH=\lastbox
+\ifhbox\CD@sH\CD@rC\repeat\unvbox0 \global\CD@QA\CD@ZE}\CD@ZE\CD@QA}\def
+\CD@rC{\CD@jE\setbox\CD@sH=\hbox{\unhbox\CD@sH\unskip\setbox\CD@sH=\lastbox
+\unskip\unhbox\CD@sH}\ifdim\CD@wJ<\wd\CD@sH\CD@aG h\CD@wJ<\wd\CD@sH:arrow in
+pile too short:\CD@FA\CD@gD\else\setbox\CD@sH=\hbox to\CD@wJ{\unhbox\CD@sH}%
+\fi\else\CD@gJ\fi\setbox0=\vbox{\box\CD@sH\nointerlineskip\ifvoid0 \CD@tJ\box
+1 \else\vskip\skip0 \unvbox0 \fi}\skip0=\lastskip\unskip}\def\CD@gJ{\penalty7
+\noindent\unhbox\CD@sH\unskip\setbox\CD@sH=\lastbox\unskip\unhbox\CD@sH
+\endgraf\setbox\CD@tH=\lastbox\unskip\setbox\CD@tH=\hbox{\CD@JG\unhbox\CD@tH
+\unskip\unskip\unpenalty}\ifcase\prevgraf\cd@shouldnt P\or\ifdim\CD@wJ<\wd
+\CD@tH\CD@aG h\CD@wJ<\wd\CD@sH:object in pile too wide:\CD@FA\CD@gD\setbox
+\CD@sH=\hbox to\CD@wJ{\hss\unhbox\CD@tH\hss}\else\setbox\CD@sH=\hbox to\CD@wJ
+{\hss\kern\CD@hF\unhbox\CD@tH\kern\CD@hI\hss}\fi\or\setbox\CD@sH=\lastbox
+\unskip\CD@SK\else\cd@shouldnt Q\fi\unskip\unpenalty}\def\CD@cD{\CD@MJ\ifvoid
+3 \setbox3=\null\ht3\axisheight\dp3-\ht3 \dimen3.5\CD@LF\else\dimen4\dp3
+\dimen3.5\wd3 \setbox3=\CD@GG{\box3}\dp3\dimen4 \ifdim\ht3=-\dp3 \else\CD@TB
+\fi\fi\dimen0\dimen3 \advance\dimen0-.5\CD@LF\setbox0\null\ht0\ht3\dp0\dp3\wd
+0\wd3 \ifvoid6\else\setbox6\hbox{\unhbox6\kern\dimen0\kern2pt}\dimen0\wd6 \fi
+\ifvoid7\else\setbox7\hbox{\kern2pt\kern\dimen3\unhbox7}\dimen3\wd7 \fi
+\setbox3\hbox{\ifvoid6\else\kern-\dimen0\unhbox6\fi\unhbox3 \ifvoid7\else
+\unhbox7\kern-\dimen3\fi}\ht3\ht0\dp3\dp0\wd3\wd0 \CD@tE\dimen4=\ht\CD@MH
+\advance\dimen4\dp5 \advance\dimen4\dimen1 \let\CD@jD\empty\else\dimen4\ht3
+\fi\setbox0\null\ht0\dimen4 \offinterlineskip\setbox8=\vbox spread2ex{\kern
+\dimen5 \box1 \CD@iD\vfill\CD@tE\else\kern\CD@eJ\fi\box0}\ht8=\z@\setbox9=%
+\vtop spread2ex{\kern-\ht3 \kern-\CD@eJ\box3 \CD@jD\vfill\box5 \kern\dimen1}%
+\dp9=\z@\hskip\dimen0plus.0001fil \box9 \kern-\CD@LF\box8 \CD@kE\penalty2 \fi
+\CD@tE\penalty1 \fi\kern\PileSpacing\kern-\PileSpacing\kern-.5\CD@LF\penalty
+\CD@GB\null\kern\dimen3}\def\CD@cI{\ifhbox\CD@VA\CD@KB{clashing verticals}\ht
+\CD@MH.5\dp\CD@VA\dp\CD@MH-\ht5 \CD@yB\ht\CD@MH\z@\dp\CD@MH\z@\fi\dimen1\dp
+\CD@VA\CD@xA\prevgraf\unvbox\CD@VA\CD@wA\lastpenalty\unpenalty\setbox\CD@VA=%
+\null\setbox\CD@lI=\hbox{\CD@JG\unhbox\CD@lI\unskip\unpenalty\dimen0\lastkern
+\unkern\unkern\unkern\kern\dimen0 \CD@HG}\setbox\CD@lF=\hbox{\unhbox\CD@lF
+\dimen0\lastkern\unkern\unkern\global\CD@QA\lastkern\unkern\kern\dimen0 }%
+\CD@tF\ifnum\CD@xA>4 \CD@zI\repeat\unskip\unskip\advance\CD@mF.5\wd\CD@VA
+\advance\CD@mF\wd\CD@lF\advance\CD@mI.5\wd\CD@VA\advance\CD@mI\wd\CD@lI\ifnum
+\CD@FA=\CD@lA\CD@OA.5\wd\CD@VA\edef\CD@NK{\the\CD@OA}\fi\setbox\CD@VA=\hbox{%
+\kern-\CD@mF\box\CD@lF\unhbox\CD@VA\box\CD@lI\kern-\CD@mI\penalty\CD@wA
+\penalty\CD@NB}\ht\CD@VA\dimen1 \dp\CD@VA\z@\wd\CD@VA\CD@tB\CD@vB}\def\CD@zI{%
+\ifdim\wd\CD@lF<\CD@QA\setbox\CD@lF=\hbox to\CD@QA{\CD@JG\unhbox\CD@lF}\fi
+\advance\CD@xA\m@ne\setbox\CD@VA=\hbox{\box\CD@lF\unhbox\CD@VA}\unskip\setbox
+\CD@lF=\lastbox\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip\unpenalty\dimen0%
+\lastkern\unkern\unkern\global\CD@QA\lastkern\unkern\kern\dimen0 }}\def\CD@yB
+{\dimen1\dp\CD@VA\ifhbox\CD@VA\CD@xB\else\CD@zB\fi\setbox\CD@VA=\vbox{%
+\penalty\CD@NB}\dp\CD@VA-\dp\CD@MH\wd\CD@VA\CD@tB}\def\CD@zB{\unvbox\CD@VA
+\CD@wA\lastpenalty\unpenalty\ifdim\dimen1<\ht\CD@MH\CD@aG v\dimen1<\ht\CD@MH:%
+rows overprint:\CD@NB\CD@wA\fi}\def\CD@xB{\dimen0=\ht\CD@VA\setbox\CD@VA=%
+\hbox\bgroup\advance\dimen1-\ht\CD@MH\unhbox\CD@VA\CD@xA\lastpenalty
+\unpenalty\CD@wA\lastpenalty\unpenalty\global\CD@RA-\lastkern\unkern\setbox0=%
+\lastbox\CD@tF\setbox\CD@VA=\hbox{\box0\unhbox\CD@VA}\setbox0=\lastbox\ifhbox
+0 \CD@kJ\repeat\global\CD@SA-\lastkern\unkern\global\CD@QA\CD@JK\unhbox\CD@VA
+\egroup\CD@JK\CD@QA\CD@bH{\CD@SA}{\box\CD@VA}{\CD@RA}{\dimen1}}\def\CD@kJ{%
+\setbox0=\hbox to\wd0\bgroup\unhbox0 \unskip\unpenalty\dimen7\lastkern\unkern
+\ifnum\lastpenalty=1 \unpenalty\CD@UB\else\CD@TB\fi\ifnum\lastpenalty=2
+\unpenalty\dimen2.5\dimen0\advance\dimen2-.5\dimen1\advance\dimen2-%
+\axisheight\else\dimen2\z@\fi\setbox0=\lastbox\dimen6\lastkern\unkern\setbox1%
+=\lastbox\setbox0=\vbox{\unvbox0 \CD@tE\kern-\dimen1 \else\ifdim\dimen2=\z@
+\else\kern\dimen2 \fi\fi}\ifdim\dimen0<\ht0 \CD@aG v\dimen0<\ht0:upper part of
+vertical too short:{\CD@tE\CD@NB\else\CD@wA\fi}\CD@xA\else\setbox0=\vbox to%
+\dimen0{\unvbox0}\fi\setbox1=\vtop{\unvbox1}\ifdim\dimen1<\dp1 \CD@aG v\dimen
+1<\dp1:lower part of vertical too short:\CD@NB\CD@wA\else\setbox1=\vtop to%
+\dimen1{\ifdim\dimen2=\z@\else\kern-\dimen2 \fi\unvbox1 }\fi\box1 \kern\dimen
+6 \box0 \kern\dimen7 \CD@HG\global\CD@QA\CD@JK\egroup\CD@JK\CD@QA\relax}%
+\countdef\CD@u=14 \newcount\CD@CA\newcount\CD@XB\newcount\CD@NB\let\CD@LB
+\insc@unt\newcount\CD@FA\newcount\CD@lA\let\CD@mA\CD@XB\newcount\CD@MB\CD@tG
+\CD@DF\CD@bI\CD@aI\CD@aI\def\CD@nD{-1}\def\CD@K{\ifnum\CD@nD<\z@\else
+\begingroup\scrollmode\showboxdepth\CD@nD\showboxbreadth\maxdimen\showlists
+\endgroup\fi\CD@bI\CD@zF\CD@CA=\CD@u\advance\CD@CA1 \CD@XB=\CD@CA\ifnum\CD@NB
+=1 \CD@JA\fi\advance\CD@XB\CD@NB\dimen1\z@\skip0\z@\count@=\insc@unt\advance
+\count@\CD@u\divide\count@2 \ifnum\CD@XB>\count@\CD@KB{The diagram has too
+many rows! It can't be reformatted.}\else\CD@NG\CD@WI\fi\CD@cH}\def\CD@NG{%
+\CD@NB\CD@CA\CD@uF\ifnum\CD@NB<\CD@XB\setbox\CD@NB\box\voidb@x\advance\CD@NB1%
+\relax\repeat\CD@NB\CD@CA\skip\z@\z@\CD@uF\CD@GB\lastpenalty\unpenalty\ifnum
+\CD@GB>\z@\CD@KE\repeat\ifnum\CD@GB=-123 \CD@tJ\unpenalty\else\cd@shouldnt D%
+\fi\ifx\v@grid\relax\else\CD@NB\CD@XB\advance\CD@NB\m@ne\expandafter\CD@VJ
+\v@grid\fi\CD@MB\CD@mA\CD@tB\z@\CD@XG\ifx\h@grid\relax\else\expandafter\CD@LJ
+\h@grid\fi\count@\CD@XB\advance\count@\m@ne\CD@YB\ht\count@}\def\CD@KE{%
+\ifcase\CD@GB\or\CD@MG\else\CD@uA-\lastpenalty\unpenalty\CD@vA\lastpenalty
+\unpenalty\setbox0=\lastbox\CD@WG\fi\CD@wD}\def\CD@wD{\skip1\lastskip\unskip
+\advance\skip0\skip1 \ifdim\skip1=\z@\else\expandafter\CD@wD\fi}\def\CD@MG{%
+\setbox0=\lastbox\CD@pI\dp0 \advance\CD@pI\skip\z@\skip\z@\z@\advance\CD@NF
+\CD@pI\CD@uE\ifnum\CD@NB>\CD@CA\CD@NF\DiagramCellHeight\CD@pI\CD@NF\advance
+\CD@pI-\CD@qI\fi\fi\CD@qI\ht0 \CD@NF\CD@qI\setbox\CD@NB\hbox{\unhbox\CD@NB
+\unhbox0}\dp\CD@NB\CD@pI\ht\CD@NB\CD@qI\advance\CD@NB1 }\def\CD@WG{\ifnum
+\CD@uA<\z@\advance\CD@uA\CD@XB\ifnum\CD@uA<\CD@CA\CD@UG\else\CD@OA\dp\CD@uA
+\CD@PA\ht\CD@uA\setbox\CD@uA\hbox{\box\z@\penalty\CD@vA\penalty\CD@GB\unhbox
+\CD@uA}\dp\CD@uA\CD@OA\ht\CD@uA\CD@PA\fi\else\CD@UG\fi}\def\CD@UG{\CD@KB{%
+diagonal goes outside diagram (lost)}}\def\CD@fI{\advance\CD@uA\CD@XB\ifnum
+\CD@uA<\CD@CA\CD@UG\else\ifnum\CD@uA=\CD@NB\CD@VG\else\ifnum\CD@uA>\CD@NB
+\cd@shouldnt M\else\CD@OA\dp\CD@uA\CD@PA\ht\CD@uA\setbox\CD@uA\hbox{\box\z@
+\penalty\CD@vA\penalty\CD@GB\unhbox\CD@uA}\dp\CD@uA\CD@OA\ht\CD@uA\CD@PA\fi
+\fi\fi}\def\CD@WI{\CD@t\CD@AJ\setbox\CD@PC=\hbox{\CD@k A\@super f\CD@lJ f%
+\CD@ND}\CD@ZE\z@\CD@JK\z@\CD@kI\z@\CD@kF\z@\CD@NB=\CD@XB\CD@NF\z@\CD@uB\z@
+\CD@uF\ifnum\CD@NB>\CD@CA\advance\CD@NB\m@ne\CD@qI\ht\CD@NB\CD@pI\dp\CD@NB
+\advance\CD@NF\CD@qI\CD@rI\advance\CD@uB\CD@NF\CD@KC\CD@ZI\CD@w\ht\CD@NB
+\CD@qI\dp\CD@NB\CD@pI\nointerlineskip\box\CD@NB\CD@NF\CD@pI\setbox\CD@NB\null
+\ht\CD@NB\CD@uB\repeat\CD@wB\nointerlineskip\box\CD@NB\CD@gG\CD@ZE
+\DiagramCellWidth{width}\CD@gG\CD@JK\DiagramCellHeight{height}\CD@VA\CD@LB
+\advance\CD@VA-\CD@lA\advance\CD@VA\m@ne\advance\CD@VA\CD@mA\dimen0\wd\CD@VA
+\CD@tI\axisheight\dimen1\CD@uB\advance\dimen1-\CD@YB\dimen2\CD@kI\advance
+\dimen2-\dimen0 \advance\CD@XB-\CD@CA\advance\CD@LB-\CD@lA}\count@\year
+\multiply\count@12 \advance\count@\month\ifnum\count@>24158 \loop\iftrue
+\message{gone February 2013!}\repeat\fi\def\CD@wB{\CD@qI-\CD@NF\CD@pI\CD@NF
+\setbox\CD@MH=\null\dp\CD@MH\CD@NF\ht\CD@MH-\CD@NF\CD@mF\z@\CD@mI\z@\CD@lA
+\CD@LB\advance\CD@lA-\CD@MB\advance\CD@lA\CD@mA\CD@FA\CD@LB\CD@VA\CD@MB\CD@sF
+\ifnum\CD@FA>\CD@lA\advance\CD@FA\m@ne\advance\CD@VA\m@ne\CD@tB\wd\CD@VA
+\setbox\CD@FA=\box\voidb@x\CD@yB\repeat\CD@w\ht\CD@NB\CD@qI\dp\CD@NB\CD@pI}%
+\def\CD@gG#1#2#3{\ifdim#1>.01\CD@zC\CD@PA#2\relax\advance\CD@PA#1\relax
+\advance\CD@PA.99\CD@zC\count@\CD@PA\divide\count@\CD@zC\CD@KB{increase cell #%
+3 to \the\count@ em}\fi}\def\CD@rI{\CD@FA=\CD@LB\penalty4 \noindent\unhbox
+\CD@NB\CD@sF\unskip\setbox0=\lastbox\ifhbox0 \advance\CD@FA\m@ne\setbox\CD@FA
+\hbox to\wd0{\null\penalty-9990\null\unhbox0}\repeat\CD@lA\CD@FA\advance
+\CD@FA\CD@MB\advance\CD@FA-\CD@mA\ifnum\CD@FA<\CD@LB\count@\CD@FA\advance
+\count@\m@ne\dimen0=\wd\count@\count@\CD@MB\advance\count@\m@ne\CD@tB\wd
+\count@\CD@sF\ifnum\CD@FA<\CD@LB\CD@DJ\CD@XG\dimen0\wd\CD@FA\advance\CD@FA1
+\repeat\fi\CD@sF\CD@GB\lastpenalty\unpenalty\ifnum\CD@GB>\z@\CD@vA
+\lastpenalty\unpenalty\CD@VG\repeat\endgraf\unskip\ifnum\lastpenalty=4
+\unpenalty\else\cd@shouldnt S\fi}\def\CD@VG{\advance\CD@vA\CD@lA\advance
+\CD@vA\m@ne\setbox0=\lastbox\ifnum\CD@vA<\CD@LB\setbox\CD@vA\hbox{\box0%
+\penalty\CD@GB\unhbox\CD@vA}\else\CD@UG\fi}\def\CD@bG{}\CD@tG\CD@uE\CD@WB
+\CD@VB\def\CD@DJ{\advance\dimen0\wd\CD@FA\divide\dimen0\tw@\CD@uE\dimen0%
+\DiagramCellWidth\else\CD@V{\dimen0}\DiagramCellWidth\CD@pJ\fi\advance\CD@tB
+\dimen0 }\def\CD@XG{\setbox\CD@MB=\vbox{}\dp\CD@MB=\CD@uB\wd\CD@MB\CD@tB
+\advance\CD@MB1 }\def\CD@LJ#1,{\def\CD@GK{#1}\ifx\CD@GK\CD@RD\else\advance
+\CD@tB\CD@GK\DiagramCellWidth\CD@XG\expandafter\CD@LJ\fi}\def\CD@VJ#1,{\def
+\CD@GK{#1}\ifx\CD@GK\CD@RD\else\ifnum\CD@NB>\CD@CA\CD@NF\CD@GK
+\DiagramCellHeight\advance\CD@NF-\dp\CD@NB\advance\CD@NB\m@ne\ht\CD@NB\CD@NF
+\fi\expandafter\CD@VJ\fi}\def\CD@pJ{\CD@wE\CD@OA\dimen0 \advance\CD@OA-%
+\DiagramCellWidth\ifdim\CD@OA>2\MapShortFall\CD@KB{badly drawn diagonals (see
+manual)}\let\CD@pJ\empty\fi\else\let\CD@pJ\empty\fi}\def\CD@KC{\CD@VA\CD@mA
+\CD@sF\ifnum\CD@VA<\CD@MB\dimen0\dp\CD@VA\advance\dimen0\CD@NF\dp\CD@VA\dimen
+0 \advance\CD@VA1 \repeat}\def\CD@bH#1#2#3#4{\ifnum\CD@FA<\CD@LB\CD@OA=#1%
+\relax\setbox\CD@FA=\hbox{\setbox0=#2\dimen7=#4\relax\dimen8=#3\relax\ifhbox
+\CD@FA\unhbox\CD@FA\advance\CD@OA-\lastkern\unkern\fi\ifdim\CD@OA=\z@\else
+\kern-\CD@OA\fi\raise\dimen7\box0 \kern-\dimen8 }\ifnum\CD@FA=\CD@lA\CD@V
+\CD@kF\CD@OA\fi\else\cd@shouldnt O\fi}\def\CD@w{\setbox\CD@NB=\hbox{\CD@FA
+\CD@lA\CD@VA\CD@mA\CD@PA\z@\relax\CD@sF\ifnum\CD@FA<\CD@LB\CD@tB\wd\CD@VA
+\relax\CD@eI\advance\CD@FA1 \advance\CD@VA1 \repeat}\CD@V\CD@kI{\wd\CD@NB}\wd
+\CD@NB\z@}\def\CD@eI{\ifhbox\CD@FA\CD@OA\CD@tB\relax\advance\CD@OA-\CD@PA
+\relax\ifdim\CD@OA=\z@\else\kern\CD@OA\fi\CD@PA\CD@tB\advance\CD@PA\wd\CD@FA
+\relax\unhbox\CD@FA\advance\CD@PA-\lastkern\unkern\fi}\def\CD@ZI{\setbox
+\CD@sH=\box\voidb@x\CD@VA=\CD@MB\CD@FA\CD@LB\CD@VA\CD@mA\advance\CD@VA\CD@FA
+\advance\CD@VA-\CD@lA\advance\CD@VA\m@ne\CD@tB\wd\CD@VA\count@\CD@LB\advance
+\count@\m@ne\CD@hF.5\wd\count@\advance\CD@hF\CD@tB\CD@A\m@ne\CD@gD\@m\CD@sF
+\ifnum\CD@FA>\CD@lA\advance\CD@FA\m@ne\advance\CD@hF-\CD@tB\CD@PI\wd\CD@VA
+\CD@tB\advance\CD@hF\CD@tB\advance\CD@VA\m@ne\CD@tB\wd\CD@VA\repeat\CD@mF
+\CD@kF\CD@mI-\CD@mF\CD@vB}\newcount\CD@GB\def\CD@s{}\def\CD@t{\mathsurround
+\z@\hsize\z@\rightskip\z@ plus1fil minus\maxdimen\parfillskip\z@\linepenalty
+9000 \looseness0 \hfuzz\maxdimen\hbadness10000 \clubpenalty0 \widowpenalty0
+\displaywidowpenalty0 \interlinepenalty0 \predisplaypenalty0
+\postdisplaypenalty0 \interdisplaylinepenalty0 \interfootnotelinepenalty0
+\floatingpenalty0 \brokenpenalty0 \everypar{}\leftskip\z@\parskip\z@
+\parindent\z@\pretolerance10000 \tolerance10000 \hyphenpenalty10000
+\exhyphenpenalty10000 \binoppenalty10000 \relpenalty10000 \adjdemerits0
+\doublehyphendemerits0 \finalhyphendemerits0 \CD@IA\prevdepth\z@}\newbox
+\CD@KG\newbox\CD@IG\def\CD@JG{\unhcopy\CD@KG}\def\CD@HG{\unhcopy\CD@IG}\def
+\CD@iJ{\hbox{}\penalty1\nointerlineskip}\def\CD@PI{\penalty5 \noindent\setbox
+\CD@MH=\null\CD@mF\z@\CD@mI\z@\ifnum\CD@FA<\CD@LB\ht\CD@MH\ht\CD@FA\dp\CD@MH
+\dp\CD@FA\unhbox\CD@FA\skip0=\lastskip\unskip\else\CD@OK\skip0=\z@\fi\endgraf
+\ifcase\prevgraf\cd@shouldnt Y \or\cd@shouldnt Z \or\CD@RI\or\CD@XI\else
+\CD@QI\fi\unskip\setbox0=\lastbox\unskip\unskip\unpenalty\noindent\unhbox0%
+\setbox0\lastbox\unpenalty\unskip\unskip\unpenalty\setbox0\lastbox\CD@tF
+\CD@GB\lastpenalty\unpenalty\ifnum\CD@GB>\z@\setbox\z@\lastbox\CD@lB\repeat
+\endgraf\unskip\unskip\unpenalty}\def\CD@YJ{\CD@uA\CD@XB\advance\CD@uA-\CD@NB
+\CD@vA\CD@FA\advance\CD@vA-\CD@lA\advance\CD@vA1 \expandafter\message{%
+prevgraf=\the\prevgraf at (\the\CD@uA,\the\CD@vA)}}\def\CD@XI{\CD@CE\setbox
+\CD@lI=\lastbox\setbox\CD@lI=\hbox{\unhbox\CD@lI\unskip\unpenalty}\unskip
+\ifdim\ht\CD@lI>\ht\CD@PC\setbox\CD@MH=\copy\CD@lI\else\ifdim\dp\CD@lI>\dp
+\CD@PC\setbox\CD@MH=\copy\CD@lI\else\CD@FG\CD@lI\fi\fi\advance\CD@mF.5\wd
+\CD@lI\advance\CD@mI.5\wd\CD@lI\setbox\CD@lI=\hbox{\unhbox\CD@lI\CD@HG}\CD@bH
+\CD@mF{\box\CD@lI}\CD@mI\z@\CD@yB\CD@vB}\def\CD@CE{\ifnum\CD@A>0 \advance
+\dimen0-\CD@tB\CD@iA-.5\dimen0 \CD@A-\CD@A\else\CD@A0 \CD@iA\z@\fi\setbox
+\CD@MH=\lastbox\setbox\CD@MH=\hbox{\unhbox\CD@MH\unskip\unskip\unpenalty
+\setbox0=\lastbox\global\CD@QA\lastkern\unkern}\advance\CD@iA-.5\CD@QA\unskip
+\setbox\CD@MH=\null\CD@mI\CD@iA\CD@mF-\CD@iA}\def\CD@Z{\ht\CD@MH\CD@tI\dp
+\CD@MH\CD@sI}\def\CD@FG#1{\setbox\CD@MH=\hbox{\CD@V{\ht\CD@MH}{\ht#1}\CD@V{%
+\dp\CD@MH}{\dp#1}\CD@V{\wd\CD@MH}{\wd#1}\vrule height\ht\CD@MH depth\dp\CD@MH
+width\wd\CD@MH}}\def\CD@QI{\CD@CE\CD@Z\setbox\CD@lI=\lastbox\unskip\setbox
+\CD@lF=\lastbox\unskip\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip\global\CD@yA
+\lastpenalty\unpenalty}\advance\CD@yA9999 \ifcase\CD@yA\CD@VI\or\CD@YI\or
+\CD@TI\or\CD@dI\or\CD@cI\or\CD@SI\else\cd@shouldnt9\fi}\def\CD@VI{\CD@FG
+\CD@lI\CD@UI\setbox\CD@sH=\box\CD@lF\setbox\CD@tH=\box\CD@lI}\def\CD@YI{%
+\CD@FG\CD@lF\setbox\CD@lI\hbox{\penalty8 \unhbox\CD@lI\unskip\unpenalty\ifnum
+\lastpenalty=8 \else\CD@xH\fi}\CD@UI\setbox\CD@lF=\hbox{\unhbox\CD@lF\unskip
+\unpenalty\global\setbox\CD@DA=\lastbox}\ifdim\wd\CD@lF=\z@\else\CD@xH\fi
+\setbox\CD@sH=\box\CD@DA}\def\CD@xH{\CD@KB{extra material in \string\pile
+\space cell (lost)}}\def\CD@UI{\CD@yB\ifvoid\CD@sH\else\CD@KB{Clashing
+horizontal arrows}\CD@mI.5\CD@hF\CD@mF-\CD@mI\CD@vB\CD@mI\z@\CD@mF\z@\fi
+\CD@hI\CD@hF\advance\CD@hI-\CD@mI\CD@hF-\CD@mF\CD@JC\CD@FA}\def\CD@RI{\setbox
+0\lastbox\unskip\CD@iA\z@\CD@Z\ifdim\skip0>\z@\CD@tJ\CD@A0 \else\ifnum\CD@A<1
+\CD@A0 \dimen0\CD@tB\fi\advance\CD@A1 \fi}\def\VonH{\CD@MA46\VonH{.5\CD@LF}}%
+\def\HonV{\CD@MA57\HonV{.5\CD@LF}}\def\HmeetV{\CD@MA44\HmeetV{-\MapShortFall}%
+}\def\CD@MA#1#2#3#4{\CD@pB34#1{\string#3}\CD@SD\CD@GB-999#2 \dimen0=#4\CD@tI
+\dimen0\advance\CD@tI\axisheight\CD@sI\dimen0\advance\CD@sI-\axisheight\CD@CF
+\CD@HC\CD@ZD}\def\CD@HC#1{\setbox0=\hbox{\CD@k#1\CD@ND}\dimen0.5\wd0 \CD@tI
+\ht0 \CD@sI\dp0 \CD@ZD}\def\CD@SD{\setbox0=\null\ht0=\CD@tI\dp0=\CD@sI\wd0=%
+\dimen0 \copy0\penalty\CD@GB\box0 }\def\CD@TI{\CD@GC\CD@yB}\def\CD@dI{\CD@GC
+\CD@vB}\def\CD@SI{\CD@GC\CD@yB\CD@vB}\def\CD@GC{\setbox\CD@lI=\hbox{\unhbox
+\CD@lI}\setbox\CD@lF=\hbox{\unhbox\CD@lF\global\setbox\CD@DA=\lastbox}\ht
+\CD@MH\ht\CD@DA\dp\CD@MH\dp\CD@DA\advance\CD@mF\wd\CD@DA\advance\CD@mI\wd
+\CD@lI}\CD@tG\ifPositiveGradient\CD@CI\CD@BI\CD@CI\CD@tG\ifClimbing\CD@rB
+\CD@qB\CD@rB\newcount\DiagonalChoice\DiagonalChoice\m@ne\ifx\tenln\nullfont
+\CD@tJ\def\CD@qF{\CD@KH\ifPositiveGradient/\else\CD@k\backslash\CD@ND\fi}%
+\else\def\CD@qF{\CD@rF\char\count@}\fi\let\CD@rF\tenln\def\Use@line@char#1{%
+\hbox{#1\CD@rF\ifPositiveGradient\else\advance\count@64 \fi\char\count@}}\def
+\CD@cF{\Use@line@char{\count@\CD@TC\multiply\count@8\advance\count@-9\advance
+\count@\CD@LH}}\def\CD@ZF{\Use@line@char{\ifcase\DiagonalChoice\CD@gF\or
+\CD@fF\or\CD@fF\else\CD@gF\fi}}\def\CD@gF{\ifnum\CD@TC=\z@\count@'33 \else
+\count@\CD@TC\multiply\count@\sixt@@n\advance\count@-9\advance\count@\CD@LH
+\advance\count@\CD@LH\fi}\def\CD@fF{\count@'\ifcase\CD@LH55\or\ifcase\CD@TC66%
+\or22\or52\or61\or72\fi\or\ifcase\CD@TC66\or25\or22\or63\or52\fi\or\ifcase
+\CD@TC66\or16\or36\or22\or76\fi\or\ifcase\CD@TC66\or27\or25\or67\or22\fi\fi
+\relax}\def\CD@uC#1{\hbox{#1\setbox0=\Use@line@char{#1}\ifPositiveGradient
+\else\raise.3\ht0\fi\copy0 \kern-.7\wd0 \ifPositiveGradient\raise.3\ht0\fi
+\box0}}\def\CD@jF#1{\hbox{\setbox0=#1\kern-.75\wd0 \vbox to.25\ht0{%
+\ifPositiveGradient\else\vss\fi\box0 \ifPositiveGradient\vss\fi}}}\def\CD@jI#%
+1{\hbox{\setbox0=#1\dimen0=\wd0 \vbox to.25\ht0{\ifPositiveGradient\vss\fi
+\box0 \ifPositiveGradient\else\vss\fi}\kern-.75\dimen0 }}\CD@RC{+h:>}{%
+\Use@line@char\CD@fF}\CD@RC{-h:>}{\Use@line@char\CD@gF}\CD@nF{+t:<}{-h:>}%
+\CD@nF{-t:<}{+h:>}\CD@RC{+t:>}{\CD@jF{\Use@line@char\CD@fF}}\CD@RC{-t:>}{%
+\CD@jI{\Use@line@char\CD@gF}}\CD@nF{+h:<}{-t:>}\CD@nF{-h:<}{+t:>}\CD@RC{+h:>>%
+}{\CD@uC\CD@fF}\CD@RC{-h:>>}{\CD@uC\CD@gF}\CD@nF{+t:<<}{-h:>>}\CD@nF{-t:<<}{+%
+h:>>}\CD@nF{+h:>->}{+h:>>}\CD@nF{-h:>->}{-h:>>}\CD@nF{+t:<-<}{-h:>>}\CD@nF{-t%
+:<-<}{+h:>>}\CD@RC{+t:>>}{\CD@jF{\CD@uC\CD@fF}}\CD@RC{-t:>>}{\CD@jI{\CD@uC
+\CD@gF}}\CD@nF{+h:<<}{-t:>>}\CD@nF{-h:<<}{+t:>>}\CD@nF{+t:>->}{+t:>>}\CD@nF{-%
+t:>->}{-t:>>}\CD@nF{+h:<-<}{-t:>>}\CD@nF{-h:<-<}{+t:>>}\CD@RC{+f:-}{\CD@EF
+\null\else\CD@cF\fi}\CD@nF{-f:-}{+f:-}\def\CD@tC#1#2{\vbox to#1{\vss\hbox to#%
+2{\hss.\hss}\vss}}\def\hfdot{\CD@tC{2\axisheight}{.5em}}%
+%% % .7em until 29.7.98
+\def\vfdot{\CD@tC{1ex}\z@}%% % 1.46ex until 29.7.98
+\def\CD@bF{\hbox{\dimen0=.3\CD@zC\dimen1\dimen0 \ifnum\CD@LH>\CD@TC\CD@iC{%
+\dimen1}\else\CD@dG{\dimen0}\fi\CD@tC{\dimen0}{\dimen1}}}\newarrowfiller{.}%
+\hfdot\hfdot\vfdot\vfdot\def\dfdot{\CD@bF\CD@CK}\CD@RC{+f:.}{\dfdot}\CD@RC{-f%
+:.}{\dfdot}\def\CD@@K#1{\hbox\bgroup\def\CD@CH{#1\egroup}\afterassignment
+\CD@CH%%
+\count@='}\def\lnchar{\CD@@K\CD@qF}\def\CD@dF#1{\setbox#1=\hbox{\dimen5\dimen
+#1 \setbox8=\box#1 \dimen1\wd8 \count@\dimen5 \divide\count@\dimen1 \ifnum
+\count@=0 \box8 \ifdim\dimen5<.95\dimen1 \CD@gB{diagonal line too short}\fi
+\else\dimen3=\dimen5 \advance\dimen3-\dimen1 \divide\dimen3\count@\dimen4%
+\dimen3 \CD@dG{\dimen4}\ifPositiveGradient\multiply\dimen4\m@ne\fi\dimen6%
+\dimen1 \advance\dimen6-\dimen3 \loop\raise\count@\dimen4\copy8 \ifnum\count@
+>0 \kern-\dimen6 \advance\count@\m@ne\repeat\fi}}\def\CD@CG#1{\CD@EF\CD@xJ{#1%
+}\else\CD@dF{#1}\fi}\def\CD@IH#1{}\newdimen\objectheight\objectheight1.8ex
+\newdimen\objectwidth\objectwidth1em \def\CD@YD{\dimen6=\CD@aK
+\DiagramCellHeight\dimen7=\CD@WK\DiagramCellWidth\CD@KJ\ifnum\CD@LH>0 \ifnum
+\CD@TC>0 \CD@aF\else\aftergroup\CD@VC\fi\else\aftergroup\CD@UC\fi}\def\CD@VC{%
+\CD@YA{diagonal map is nearly vertical}\CD@NA}\def\CD@UC{\CD@YA{diagonal map
+is nearly horizontal}\CD@NA}\CD@rG\CD@NA{Use an orthogonal map instead}\def
+\CD@aF{\CD@MJ\dimen3\dimen7\dimen7\dimen6\CD@iC{\dimen7}\advance\dimen3-%
+\dimen7 \CD@MF\ifnum\CD@LH>\CD@TC\advance\dimen6-\dimen1\advance\dimen6-%
+\dimen5 \CD@iC{\dimen1}\CD@iC{\dimen5}\else\dimen0\dimen1\advance\dimen0%
+\dimen5\CD@dG{\dimen0}\advance\dimen6-\dimen0 \fi\dimen2.5\dimen7\advance
+\dimen2-\dimen1 \dimen4.5\dimen7\advance\dimen4-\dimen5 \ifPositiveGradient
+\dimen0\dimen5 \advance\dimen1-\CD@WK\DiagramCellWidth\advance\dimen1 \CD@ZK
+\DiagramCellWidth\setbox6=\llap{\unhbox6\kern.1\ht2}\setbox7=\rlap{\kern.1\ht
+2\unhbox7}\else\dimen0\dimen1 \advance\dimen1-\CD@ZK\DiagramCellWidth\setbox7%
+=\llap{\unhbox7\kern.1\ht2}\setbox6=\rlap{\kern.1\ht2\unhbox6}\fi\setbox6=%
+\vbox{\box6\kern.1\wd2}\setbox7=\vtop{\kern.1\wd2\box7}\CD@dG{\dimen0}%
+\advance\dimen0-\axisheight\advance\dimen0-\CD@bK\DiagramCellHeight\dimen5-%
+\dimen0 \advance\dimen0\dimen6 \advance\dimen1.5\dimen3 \ifdim\wd3>\z@\ifdim
+\ht3>-\dp3\CD@TB\fi\fi\dimen3\dimen2 \dimen7\dimen2\advance\dimen7\dimen4
+\ifvoid3 \else\CD@tE\else\dimen8\ht3\advance\dimen8-\axisheight\CD@iC{\dimen8%
+}\CD@X{\dimen8}{.5\wd3}\dimen9\dp3\advance\dimen9\axisheight\CD@iC{\dimen9}%
+\CD@X{\dimen9}{.5\wd3}\ifPositiveGradient\advance\dimen2-\dimen9\advance
+\dimen4-\dimen8 \else\advance\dimen4-\dimen9\advance\dimen2-\dimen8 \fi\fi
+\advance\dimen3-.5\wd3 \fi\dimen9=\CD@aK\DiagramCellHeight\advance\dimen9-2%
+\DiagramCellHeight\CD@tE\advance\dimen2\dimen4 \CD@CG{2}\dimen2-\dimen0%
+\advance\dimen2\dp2 \else\CD@CG{2}\CD@CG{4}\ifPositiveGradient\dimen2-\dimen0%
+\advance\dimen2\dp2 \dimen4\dimen5\advance\dimen4-\ht4 \else\dimen4-\dimen0%
+\advance\dimen4\dp4 \dimen2\dimen5\advance\dimen2-\ht2 \fi\fi\setbox0=\hbox to%
+\z@{\kern\dimen1 \ifvoid1 \else\ifPositiveGradient\advance\dimen0-\dp1 \lower
+\dimen0 \else\advance\dimen5-\ht1 \raise\dimen5 \fi\rlap{\unhbox1}\fi\raise
+\dimen2\rlap{\unhbox2}\ifvoid3 \else\lower.5\dimen9\rlap{\kern\dimen3\unhbox3%
+}\fi\kern.5\dimen7 \lower.5\dimen9\box6 \lower.5\dimen9\box7 \kern.5\dimen7
+\CD@tE\else\raise\dimen4\llap{\unhbox4}\fi\ifvoid5 \else\ifPositiveGradient
+\advance\dimen5-\ht5 \raise\dimen5 \else\advance\dimen0-\dp5 \lower\dimen0 \fi
+\llap{\unhbox5}\fi\hss}\ht0=\axisheight\dp0=-\ht0\box0 }\def\NorthWest{\CD@BI
+\CD@rB\DiagonalChoice0 }\def\NorthEast{\CD@CI\CD@rB\DiagonalChoice1 }\def
+\SouthWest{\CD@CI\CD@qB\DiagonalChoice3 }\def\SouthEast{\CD@BI\CD@qB
+\DiagonalChoice2 }\def\CD@aD{\vadjust{\CD@uA\CD@FA\advance\CD@uA
+\ifPositiveGradient\else-\fi\CD@ZK\relax\CD@vA\CD@NB\advance\CD@vA-\CD@bK
+\relax\hbox{\advance\CD@uA\ifPositiveGradient-\fi\CD@WK\advance\CD@vA\CD@aK
+\hbox{\box6 \kern\CD@DC\kern\CD@eJ\penalty1 \box7 \box\z@}\penalty\CD@uA
+\penalty\CD@vA}\penalty\CD@uA\penalty\CD@vA\penalty104}}\def\CD@eH#1{\relax
+\vadjust{\hbox@maths{#1}\penalty\CD@FA\penalty\CD@NB\penalty\tw@}}\def\CD@lB{%
+\ifcase\CD@GB\or\or\CD@bH{.5\wd0}{\box0}{.5\wd0}\z@\or\unhbox\z@\setbox\z@
+\lastbox\CD@bH{.5\wd0}{\box0}{.5\wd0}\z@\unpenalty\unpenalty\setbox\z@
+\lastbox\or\CD@TG\else\advance\CD@GB-100 \ifnum\CD@GB<\z@\cd@shouldnt B\fi
+\setbox\z@\hbox{\kern\CD@mF\copy\CD@MH\kern\CD@mI\CD@uA\CD@XB\advance\CD@uA-%
+\CD@NB\penalty\CD@uA\CD@uA\CD@FA\advance\CD@uA-\CD@lA\penalty\CD@uA\unhbox\z@
+\global\CD@yA\lastpenalty\unpenalty\global\CD@zA\lastpenalty\unpenalty}\CD@uA
+-\CD@yA\CD@vA\CD@zA\CD@fI\fi}\def\CD@TG{\unhbox\z@\setbox\z@\lastbox\CD@uA
+\lastpenalty\unpenalty\advance\CD@uA\CD@mA\CD@vA\CD@XB\advance\CD@vA-%
+\lastpenalty\unpenalty\dimen1\lastkern\unkern\setbox3\lastbox\dimen0\lastkern
+\unkern\setbox0=\hbox to\z@{\unhbox0\setbox0\lastbox\setbox7\lastbox
+\unpenalty\CD@eJ\lastkern\unkern\CD@DC\lastkern\unkern\setbox6\lastbox\dimen7%
+\CD@tB\advance\dimen7-\wd\CD@uA\ifdim\dimen7<\z@\CD@CI\multiply\dimen7\m@ne
+\let\mv\empty\else\CD@BI\def\mv{\raise\ht1}\kern-\dimen7 \fi\ifnum\CD@vA>%
+\CD@NB\dimen6\CD@uB\advance\dimen6-\ht\CD@vA\else\dimen6\z@\fi\CD@jJ\CD@mK
+\setbox1\null\ht1\dimen6\wd1\dimen7 \dimen7\dimen2 \dimen6\wd1 \CD@KJ\CD@uA
+\CD@LH\CD@vA\CD@TC\dimen6\ht1 \CD@KJ\setbox2\null\divide\dimen2\tw@\advance
+\dimen2\CD@eJ\CD@eG{\dimen2}\wd2\dimen2 \dimen0.5\dimen7 \advance\dimen0%
+\ifPositiveGradient\else-\fi\CD@eJ\CD@dG{\dimen0}\advance\dimen0-\axisheight
+\ht2\dimen0 \dimen0\CD@DC\CD@eG{\dimen0}\advance\dimen0\ht2\ht2\dimen0 \dimen
+0\ifPositiveGradient-\fi\CD@DC\CD@dG{\dimen0}\advance\dimen0\wd2\wd2\dimen0
+\setbox4\null\dimen0 .6\CD@zC\CD@eG{\dimen0}\ht4\dimen0 \dimen0 .2\CD@zC
+\CD@dG{\dimen0}\wd4\dimen0 \dimen0\wd2 \ifvoid6\else\dimen1\ht4 \advance
+\dimen1\ht2 \CD@CC6+-\raise\dimen1\rlap{\ifPositiveGradient\advance\dimen0-%
+\wd6\advance\dimen0-\wd4 \else\advance\dimen0\wd4 \fi\kern\dimen0\box6}\fi
+\dimen0\wd2 \ifvoid7\else\dimen1\ht4 \advance\dimen1-\ht2 \CD@CC7-+\lower
+\dimen1\rlap{\ifPositiveGradient\advance\dimen0\wd4 \else\advance\dimen0-\wd7%
+\advance\dimen0-\wd4 \fi\kern\dimen0\box7}\fi\mv\box0\hss}\ht0\z@\dp0\z@
+\CD@bH{\z@}{\box\z@}{\z@}{\axisheight}}\def\CD@CC#1#2#3{\dimen4.5\wd#1 \ifdim
+\dimen4>.25\dimen7\dimen4=.25\dimen7\fi\ifdim\dimen4>\CD@zC\dimen4.4\dimen4
+\advance\dimen4.6\CD@zC\fi\CD@eG{\dimen4}\dimen5\axisheight\CD@dG{\dimen5}%
+\advance\dimen4-\dimen5 \dimen5\dimen4\CD@eG{\dimen5}\advance\dimen0%
+\ifPositiveGradient#2\else#3\fi\dimen5 \CD@dG{\dimen4}\advance\dimen1\dimen4 }
+\def\CD@eD#1{\expandafter\CD@IK{#1}}\CD@ZA\CD@EK{output is PostScript
+dependent}\def\CD@SC{\CD@IK{/bturn {gsave currentpoint currentpoint translate
+4 2 roll neg exch atan rotate neg exch neg exch translate } def /eturn {%
+currentpoint grestore moveto} def}}\def\CD@gK{\relax\CD@hK\CD@tK{Q}\else
+\CD@IK{eturn}\fi} \def\CD@OJ#1{\count@#1\relax\multiply\count@7\advance
+\count@16577\divide\count@33154 }\def\CD@fD#1{\expandafter\special{#1}} \def
+\CD@xJ#1{\setbox#1=\hbox{\dimen0\dimen#1\CD@dG{\dimen0}\CD@OJ{\dimen0}\setbox
+0=\null\ifPositiveGradient\count@-\count@\ht0\dimen0 \else\dp0\dimen0 \fi\box
+0 \CD@uA\count@\CD@OJ\CD@LF\CD@fD{pn \the\count@}\CD@fD{pa 0 0}\CD@OJ{\dimen#%
+1}\CD@fD{pa \the\count@\space\the\CD@uA}\CD@fD{fp}\kern\dimen#1}}\def\CD@JI{%
+\CD@KJ\begingroup\ifdim\dimen7<\dimen6 \dimen2=\dimen6 \dimen6=\dimen7 \dimen
+7=\dimen2 \count@\CD@LH\CD@LH\CD@TC\CD@TC\count@\else\dimen2=\dimen7 \fi
+\ifdim\dimen6>.01\p@\CD@KI\global\CD@QA\dimen0 \else\global\CD@QA\dimen7 \fi
+\endgroup\dimen2\CD@QA\CD@iK\CD@lK{\ifPositiveGradient\else-\fi\dimen6}\CD@iK
+\CD@kK{\ifPositiveGradient-\fi\dimen6}\CD@iK\CD@eK{\dimen7}}\def\CD@KI{\CD@hJ
+\ifdim\dimen7>1.73\dimen6 \divide\dimen2 4 \multiply\CD@TC2 \else\dimen2=0.%
+353553\dimen2 \advance\CD@LH-\CD@TC\multiply\CD@TC4 \fi\dimen0=4\dimen2 \CD@ZG
+4\CD@ZG{-2}\CD@ZG2\CD@ZG{-2.5}}\def\CD@AI{\begingroup\count@\dimen0 \dimen2 45%
+pt \divide\count@\dimen2 \ifdim\dimen0<\z@\advance\count@\m@ne\fi\ifodd
+\count@\advance\count@1\CD@@A\else\CD@y\fi\advance\dimen0-\count@\dimen2
+\CD@gE\multiply\dimen0\m@ne\fi\ifnum\count@<0 \multiply\count@-7 \fi\dimen3%
+\dimen1 \dimen6\dimen0 \dimen7 3754936sp \ifdim\dimen0<6\p@\def\CD@OG{4000}%
+\fi\CD@KJ\dimen2\dimen3\CD@dG{\dimen2}\CD@hJ\multiply\CD@TC-6 \dimen0\dimen2
+\CD@ZG1\CD@ZG{0.3}\dimen1\dimen0 \dimen2\dimen3 \dimen0\dimen3 \CD@ZG3\CD@ZG{%
+1.5}\CD@ZG{0.3}\divide\count@2 \CD@gE\multiply\dimen1\m@ne\fi\ifodd\count@
+\dimen2\dimen1\dimen1\dimen0\dimen0-\dimen2 \fi\divide\count@2 \ifodd\count@
+\multiply\dimen0\m@ne\multiply\dimen1\m@ne\fi\global\CD@QA\dimen0\global
+\CD@RA\dimen1\endgroup\dimen6\CD@QA\dimen7\CD@RA}\def\CD@OC{255}\let\CD@OG
+\CD@OC\def\CD@KJ{\begingroup\ifdim\dimen7<\dimen6 \dimen9\dimen7\dimen7\dimen
+6\dimen6\dimen9\CD@@A\else\CD@y\fi\dimen2\z@\dimen3\CD@XH\dimen4\CD@XH\dimen0%
+\z@\dimen8=\CD@OG\CD@XH\CD@lC\global\CD@yA\dimen\CD@gE0\else3\fi\global\CD@zA
+\dimen\CD@gE3\else0\fi\endgroup\CD@LH\CD@yA\CD@TC\CD@zA}\def\CD@lC{\count@
+\dimen6 \divide\count@\dimen7 \advance\dimen6-\count@\dimen7 \dimen9\dimen4
+\advance\dimen9\count@\dimen0 \ifdim\dimen9>\dimen8 \CD@@C\else\CD@AC\ifdim
+\dimen6>\z@\dimen9\dimen6 \dimen6\dimen7 \dimen7\dimen9 \expandafter
+\expandafter\expandafter\CD@lC\fi\fi}\def\CD@@C{\ifdim\dimen0=\z@\ifdim\dimen
+9<2\dimen8 \dimen0\dimen8 \fi\else\advance\dimen8-\dimen4 \divide\dimen8%
+\dimen0 \ifdim\count@\CD@XH<2\dimen8 \count@\dimen8 \dimen9\dimen4 \advance
+\dimen9\count@\dimen0 \CD@AC\fi\fi}\def\CD@AC{\dimen4\dimen0 \dimen0\dimen9
+\advance\dimen2\count@\dimen3 \dimen9\dimen2 \dimen2\dimen3 \dimen3\dimen9 }%
+\def\CD@ZG#1{\CD@dG{\dimen2}\advance\dimen0 #1\dimen2 }\def\CD@dG#1{\divide#1%
+\CD@TC\multiply#1\CD@LH}\def\CD@eG#1{\divide#1\CD@vA\multiply#1\CD@uA}\def
+\CD@iC#1{\divide#1\CD@LH\multiply#1\CD@TC}\def\CD@hJ{\dimen6\CD@LH\CD@XH
+\multiply\dimen6\CD@LH\dimen7\CD@TC\CD@XH\multiply\dimen7\CD@TC\CD@KJ}\def
+\CD@iK#1#2{\begingroup\dimen@#2\relax\loop\ifdim\dimen2<.4\maxdimen\multiply
+\dimen2\tw@\multiply\dimen@\tw@\repeat\divide\dimen2\@cclvi\divide\dimen@
+\dimen2\relax\multiply\dimen@\@cclvi\expandafter\CD@jK\the\dimen@\endgroup
+\let#1\CD@fK}{\catcode`p=12 \catcode`0=12 \catcode`.=12 \catcode`t=12 \gdef
+\CD@jK#1pt{\gdef\CD@fK{#1}}}\ifx\errorcontextlines\CD@qK\CD@tJ\let\CD@GH
+\relax\else\def\CD@GH{\errorcontextlines\m@ne}\fi\ifnum\inputlineno<0 \let
+\CD@CD\empty\let\CD@W\empty\let\CD@mD\relax\let\CD@uI\relax\let\CD@vI\relax
+\let\CD@zF\relax\message{! Why not upgrade to TeX version 3? (available since
+1990)}\else\def\CD@W{ at line \number\inputlineno}\def\CD@mD{ - first occurred%
+}\def\CD@uI{\edef\CD@h{\the\inputlineno}\global\let\CD@jB\CD@h}\def\CD@h{9999%
+}\def\CD@vI{\xdef\CD@jB{\the\inputlineno}}\def\CD@jB{\CD@h}\def\CD@zF{\ifnum
+\CD@h<\inputlineno\edef\CD@CD{\space at lines \CD@h--\the\inputlineno}\else
+\edef\CD@CD{\CD@W}\fi}\fi\let\CD@CD\empty\def\CD@YA#1#2{\CD@GH\errhelp=#2%
+\expandafter\errmessage{\CD@tA: #1}}\def\CD@KB#1{\begingroup\expandafter
+\message{! \CD@tA: #1\CD@CD}\ifnum\CD@XB>\CD@NB\ifnum\CD@CA>\CD@NB\else\ifnum
+\CD@lA>\CD@FA\else\ifnum\CD@LB>\CD@FA\advance\CD@XB-\CD@NB\advance\CD@FA-%
+\CD@lA\advance\CD@FA1\relax\expandafter\message{! (error detected at row \the
+\CD@XB, column \the\CD@FA, but probably caused elsewhere)}\fi\fi\fi\fi
+\endgroup}\def\CD@gB#1{{\expandafter\message{\CD@tA\space Warning: #1\CD@W}}}%
+\def\CD@CB#1#2{\CD@gB{#1 \string#2 is obsolete\CD@mD}}\def\CD@AB#1{\CD@CB{%
+Dimension}{#1}\CD@DE#1\CD@BB\CD@BB}\def\CD@BB{\CD@OA=}\def\CD@@B#1{\CD@CB{%
+Count}{#1}\CD@DE#1\CD@OH\CD@OH}\def\CD@OH{\count@=}\def\HorizontalMapLength{%
+\CD@AB\HorizontalMapLength}\def\VerticalMapHeight{\CD@AB\VerticalMapHeight}%
+\def\VerticalMapDepth{\CD@AB\VerticalMapDepth}\def\VerticalMapExtraHeight{%
+\CD@AB\VerticalMapExtraHeight}\def\VerticalMapExtraDepth{\CD@AB
+\VerticalMapExtraDepth}\def\DiagonalLineSegments{\CD@@B\DiagonalLineSegments}%
+\ifx\tenln\nullfont\CD@ZA\CD@KH{\CD@eF\space diagonal line and arrow font not
+available}\else\let\CD@KH\relax\fi\def\CD@aG#1#2<#3:#4:#5#6{\begingroup\CD@PA
+#3\relax\advance\CD@PA-#2\relax\ifdim.1em<\CD@PA\CD@uA#5\relax\CD@vA#6\relax
+\ifnum\CD@uA<\CD@vA\count@\CD@vA\advance\count@-\CD@uA\CD@KB{#4 by \the\CD@PA
+}\if#1v\let\CD@CH\CD@JK\edef\tmp{\the\CD@uA--\the\CD@vA,\the\CD@FA}\else
+\advance\count@\count@\if#1l\advance\count@-\CD@A\else\if#1r\advance\count@
+\CD@A\fi\fi\advance\CD@PA\CD@PA\let\CD@CH\CD@ZE\edef\tmp{\the\CD@NB,\the
+\CD@uA--\the\CD@vA}\fi\divide\CD@PA\count@\ifdim\CD@CH<\CD@PA\global\CD@CH
+\CD@PA\fi\fi\fi\endgroup}\CD@tG\CD@xE\CD@JD\CD@ID\CD@rG\CD@xI{See the message
+above.}\CD@rG\CD@lH{Perhaps you've forgotten to end the diagram before
+resuming the text, in\CD@uG which case some garbage may be added to the
+diagram, but we should be ok now.\CD@uG Alternatively you've left a blank line
+in the middle - TeX will now complain\CD@uG that the remaining \CD@S s are
+misplaced - so please use comments for layout.}\CD@rG\CD@hD{You have already
+closed too many brace pairs or environments; an \CD@HD\CD@uG command was (%
+over)due.}\CD@rG\CD@hH{\CD@dC\space and \CD@HD\space commands must match.}%
+\def\CD@jH{\ifnum\inputlineno=0 \else\expandafter\CD@iH\fi}\def\CD@iH{\CD@MD
+\CD@GD\crcr\CD@YA{missing \CD@HD\space inserted before \CD@kH- type "h"}%
+\CD@lH\enddiagram\CD@AG\CD@kH\par}\def\CD@AG#1{\edef\enddiagram{\noexpand
+\CD@rD{#1\CD@W}}}\def\CD@rD#1{\CD@YA{\CD@HD\space(anticipated by #1) ignored}%
+\CD@xI\let\enddiagram\CD@SG}\def\CD@SG{\CD@YA{misplaced \CD@HD\space ignored}%
+\CD@hH}\def\CD@mC{\CD@YA{missing \CD@HD\space inserted.}\CD@hD\CD@AG{closing
+group}}\ifx\DeclareOption\CD@qK\else\ifx\DeclareOption\@notprerr\else
+\DeclareOption*{\let\CD@N\relax\let\CD@DH\relax\expandafter\CD@@E
+\CurrentOption,}\fi\fi
+%%======================================================================%
+%% %
+%% (22) AUXILLARY MACROS FOR ADJUSTMENT OF COMPONENTS %
+%% %
+%%======================================================================%
+
+%% NOTE: The recommended way of defining arrow commands is now
+%% \newarrow{Name}{tail}{filler}{middle}{filler}{head}
+%% which defines \rName, \lName, \dName and \uName using arrow parts which
+%% have themselves previously been defined using the commands
+%% \newarrowtail, \newarrowfiller, \newarrowmiddle and \newarrowhead.
+
+%% The components \rhvee etc have been retained for the time being, as an
+%% intermediate stage and to continue to support the old \HorizontalMap and
+%% \VerticalMap commands, but you should not rely on the continued existence
+%% of these macros.
+
+%% The various components usually need some correction
+%% - longitudinally, ie to prevent gaps and overprints with the shaft,
+%% - transversally, ie to prevent "steps" in the junction with the shaft.
+%% The former can be done safely ad hoc, eg with \mkern1mu.
+%% The latter are now done with the macros \scriptaxis, \boldscriptaxis,
+%% \shifthook and \raisehook, which include pixel corrections.
+
+%% Please note that these and the other auxillary macros which follow are
+%% interim. When it becomes clear exactly what kinds of adjustments are
+%% needed for characters, this job will be done by a suitable extension
+%% to the language of \newarrowhead, etc. If you have any other ideas for
+%% transformations of general use please tell me.
+
+%% By all means experiment with other characters for arrowheads, but
+%% please, in your own interests, do not rely on macros like \rhvee,
+%% send me a copy of your definitions for distribution to other users
+%% in this file, and keep track of where your efforts get copied so
+%% that they can be replaced with the "official" version when it is
+%% incorporated.
+
+%% ***** DONT use macros with mangled names like \Cd@gH. *****
+
+\catcode`\$=3 %% make sure that $ means maths-shift
+\def\vboxtoz{\vbox to\z@}%% \z@ is in plain TeX and means 0pt
+
+%% print #1 in \scriptstyle, adjusting for the maths axis height
+\def\scriptaxis#1{\@scriptaxis{$\scriptstyle#1$}}%%
+\def\ssaxis#1{\@ssaxis{$\scriptscriptstyle#1$}}%%
+\def\@scriptaxis#1{\dimen0\axisheight\advance\dimen0-\ss@axisheight\raise
+\dimen0\hbox{#1}}\def\@ssaxis#1{\dimen0\axisheight\advance\dimen0-%
+\ss@axisheight\raise\dimen0\hbox{#1}}
+
+%% Some of the characters would look better in bold since they're
+%% taken from sub/superscript fonts; we use LaTeX's \boldmath to
+%% do this, defining this to do nothing if it doesn't exist.
+%% With the old LaTeX font selection at other than 10pt you may still
+%% get nothing happenning. Also, PK fonts may be missing.
+%% If you have problems, DONT use boldhook or boldlittlevee.
+\ifx\boldmath\CD@qK%%
+\let\boldscriptaxis\scriptaxis%%
+\def\boldscript#1{\hbox{$\scriptstyle#1$}}%%
+\def\boldscriptscript#1{\hbox{$\scriptscriptstyle#1$}}%%
+\else\def\boldscriptaxis#1{\@scriptaxis{\boldmath$\scriptstyle#1$}}%%
+\def\boldscript#1{\hbox{\boldmath$\scriptstyle#1$}}%%
+\def\boldscriptscript#1{\hbox{\boldmath$\scriptscriptstyle#1$}}%%
+\fi
+
+%% #1= {} or \boldmath; #2= + or -; #3=\subset or \supset
+\def\raisehook#1#2#3{\hbox{\setbox3=\hbox{#1$\scriptscriptstyle#3$}%
+%% the character to use
+\dimen0\ss@axisheight%% \scriptscriptstyle axis height
+\dimen1\axisheight\advance\dimen1-\dimen0%% difference in axis heights
+\dimen2\ht3\advance\dimen2-\dimen0%
+%% height of char above axis (half spread)
+\advance\dimen2-0.021em\advance\dimen1 #2\dimen2%
+%% shift = axis_difference +/- half_spread
+\raise\dimen1\box3}}%% print the character
+%% Mark Dawson suggested using the width
+\def\shifthook#1#2#3{\setbox1=\hbox{#1$\scriptscriptstyle#3$}\dimen0\wd1%
+\divide\dimen0 12\CD@zH{\dimen0}%% "u"
+\dimen1\wd1\advance\dimen1-2\dimen0 \advance\dimen1-2\CD@oI\CD@zH{\dimen1}%
+\kern#2\dimen1\box1}%% print
+
+%% use the extension font (cmex) for double vertical arrows
+\def\@cmex{\mathchar"03}%%ascii double quote
+
+%% ************* P U L L B A C K S ************
+
+%% These will probably be replaced by something less ad hoc
+%% in a future version.
+
+\def\make@pbk#1{\setbox\tw@\hbox to\z@{#1}\ht\tw@\z@\dp\tw@\z@\box\tw@}\def
+\CD@fH#1{\overprint{\hbox to\z@{#1}}}\def\CD@qH{\kern0.11em}\def\CD@pH{\kern0%
+.35em}
+
+%% This is a hack for my book ``Practical Foundations of Mathematics''
+%% and WILL NOT BE SUPPORTED --- DO NOT USE IT!
+\def\dblvert{\def\CD@rH{\kern.5\PileSpacing}}\def\CD@rH{}
+
+\def\SEpbk{\make@pbk{\CD@qH\CD@rH\vrule depth 2.87ex height -2.75ex width 0.%
+95em \vrule height -0.66ex depth 2.87ex width 0.05em \hss}}
+
+\def\SWpbk{\make@pbk{\hss\vrule height -0.66ex depth 2.87ex width 0.05em
+\vrule depth 2.87ex height -2.75ex width 0.95em \CD@qH\CD@rH}}
+
+\def\NEpbk{\make@pbk{\CD@qH\CD@rH\vrule depth -3.81ex height 4.00ex width 0.%
+95em \vrule height 4.00ex depth -1.72ex width 0.05em \hss}}
+
+\def\NWpbk{\make@pbk{\hss\vrule height 4.00ex depth -1.72ex width 0.05em
+\vrule depth -3.81ex height 4.00ex width 0.95em \CD@qH\CD@rH}}
+
+%% Freyd & Scedrov puncture symbol for non-commuting polygon
+\def\puncture{{\setbox0\hbox{A}\vrule height.53\ht0 depth-.47\ht0 width.35\ht
+0 \kern.12\ht0 \vrule height\ht0 depth-.65\ht0 width.06\ht0 \kern-.06\ht0
+\vrule height.35\ht0 depth0pt width.06\ht0 \kern.12\ht0 \vrule height.53\ht0
+depth-.47\ht0 width.35\ht0 }}
+
+%% 2-cells: (24.11.95)
+%%% \NEclck puts a clockwise (ie southeast) arrow to the northwest of cell etc
+\def\NEclck{\overprint{\raise2.5ex\rlap{ \CD@rH$\scriptstyle\searrow$}}}%%
+\def\NEanti{\overprint{\raise2.5ex\rlap{ \CD@rH$\scriptstyle\nwarrow$}}}%%
+\def\NWclck{\overprint{\raise2.5ex\llap{$\scriptstyle\nearrow$ \CD@rH}}}%%
+\def\NWanti{\overprint{\raise2.5ex\llap{$\scriptstyle\swarrow$ \CD@rH}}}%%
+\def\SEclck{\overprint{\lower1ex\rlap{ \CD@rH$\scriptstyle\swarrow$}}}%%
+\def\SEanti{\overprint{\lower1ex\rlap{ \CD@rH$\scriptstyle\nearrow$}}}%%
+\def\SWclck{\overprint{\lower1ex\llap{$\scriptstyle\nwarrow$ \CD@rH}}}%%
+\def\SWanti{\overprint{\lower1ex\llap{$\scriptstyle\searrow$ \CD@rH}}}
+
+%%======================================================================%
+%% %
+%% (23) BITS OF ARROWS %
+%% %
+%%======================================================================%
+
+%% ********** H E A D S ***********
+
+%% \diagramstyle[heads=xxx] defines {>} as {xxx} where xxx
+%% has been defined by \newarrowhead{xxx} and \newarrowtail{xxx}
+
+%% vee head
+\def\rhvee{\mkern-10mu\greaterthan}%%
+\def\lhvee{\lessthan\mkern-10mu}%%
+\def\dhvee{\vboxtoz{\vss\hbox{$\vee$}\kern0pt}}%%
+\def\uhvee{\vboxtoz{\hbox{$\wedge$}\vss}}%%
+\newarrowhead{vee}\rhvee\lhvee\dhvee\uhvee
+
+%% little vee head
+\def\dhlvee{\vboxtoz{\vss\hbox{$\scriptstyle\vee$}\kern0pt}}%%
+\def\uhlvee{\vboxtoz{\hbox{$\scriptstyle\wedge$}\vss}}%%
+\newarrowhead{littlevee}{\mkern1mu\scriptaxis\rhvee}{\scriptaxis\lhvee}%
+\dhlvee\uhlvee\ifx\boldmath\CD@qK%%
+\newarrowhead{boldlittlevee}{\mkern1mu\scriptaxis\rhvee}{\scriptaxis\lhvee}%
+\dhlvee\uhlvee\else%%
+\def\dhblvee{\vboxtoz{\vss\boldscript\vee\kern0pt}}%%
+\def\uhblvee{\vboxtoz{\boldscript\wedge\vss}}%%
+\newarrowhead{boldlittlevee}{\mkern1mu\boldscriptaxis\rhvee}{\boldscriptaxis
+\lhvee}\dhblvee\uhblvee%%
+\fi
+
+%% curly vee head (uses AMS symbols fonts)
+\def\rhcvee{\mkern-10mu\succ}%%
+\def\lhcvee{\prec\mkern-10mu}%%
+\def\dhcvee{\vboxtoz{\vss\hbox{$\curlyvee$}\kern0pt}}%%
+\def\uhcvee{\vboxtoz{\hbox{$\curlywedge$}\vss}}%%
+\newarrowhead{curlyvee}\rhcvee\lhcvee\dhcvee\uhcvee
+
+%% double vee head %% will probably be withdrawn later
+\def\rhvvee{\mkern-13mu\gg}%% 24.8.92 changed 10mu to 13mu
+\def\lhvvee{\ll\mkern-13mu}%% to make rule go through
+\def\dhvvee{\vboxtoz{\vss\hbox{$\vee$}\kern-.6ex\hbox{$\vee$}\kern0pt}}%%
+\def\uhvvee{\vboxtoz{\hbox{$\wedge$}\kern-.6ex \hbox{$\wedge$}\vss}}%%
+\newarrowhead{doublevee}\rhvvee\lhvvee\dhvvee\uhvvee
+
+%% open and closed triangles (uses AMS symbols fonts)
+\def\triangleup{{\scriptscriptstyle\bigtriangleup}}%%
+\def\littletriangledown{{\scriptscriptstyle\triangledown}}%% AMS
+\def\rhtriangle{\triangleright\mkern1.2mu}%% 29.1.93
+\def\lhtriangle{\triangleleft\mkern.8mu}%%
+\def\uhtriangle{\vbox{\kern-.2ex \hbox{$\scriptscriptstyle\bigtriangleup$}%
+\kern-.25ex}}%%
+%% Changed \scriptstyle\triangledown to \scriptscriptstyle\bigtriangledown
+%% at the suggestion of Martin Hofmann (25.11.92) to avoid using AMS symbols
+%% and also for compatibility with upward arrow.
+\def\dhtriangle{\vbox{\kern-.28ex \hbox{$\scriptscriptstyle\bigtriangledown$}%
+\kern-.1ex}}%% 15.1.93 from -.25ex
+\def\dhblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\blacktriangledown$}}}%
+%% AMS
+\def\uhblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\blacktriangle$}}}%
+%% AMS
+\def\dhlblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\scriptstyle
+\blacktriangledown$}}}%% AMS
+\def\uhlblack{\vbox{\kern-.25ex\nointerlineskip\hbox{$\scriptstyle
+\blacktriangle$}}}%% AMS
+\newarrowhead{triangle}\rhtriangle\lhtriangle\dhtriangle\uhtriangle
+\newarrowhead{blacktriangle}{\mkern-1mu\blacktriangleright\mkern.4mu}{%
+\blacktriangleleft}\dhblack\uhblack\newarrowhead{littleblack}{\mkern-1mu%
+\scriptaxis\blacktriangleright}{\scriptaxis\blacktriangleleft\mkern-2mu}%
+\dhlblack\uhlblack
+
+%% LaTeX arrowheads
+\def\rhla{\hbox{\setbox0=\lnchar55\dimen0=\wd0\kern-.6\dimen0\ht0\z@\raise
+\axisheight\box0\kern.1\dimen0}}%%
+\def\lhla{\hbox{\setbox0=\lnchar33\dimen0=\wd0\kern.05\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.5\dimen0}}%%
+\def\dhla{\vboxtoz{\vss\rlap{\lnchar77}}}%%
+\def\uhla{\vboxtoz{\setbox0=\lnchar66 \wd0\z@\kern-.15\ht0\box0\vss}}%% 1/93
+\newarrowhead{LaTeX}\rhla\lhla\dhla\uhla
+
+%% double LaTeX arrowheads %% will probably be withdrawn later
+\def\lhlala{\lhla\kern.3em\lhla}%%
+\def\rhlala{\rhla\kern.3em\rhla}%%
+\def\uhlala{\hbox{\uhla\raise-.6ex\uhla}}%%
+\def\dhlala{\hbox{\dhla\lower-.6ex\dhla}}%%
+\newarrowhead{doubleLaTeX}\rhlala\lhlala\dhlala\uhlala
+
+%% circles % \rho is a Greek letter!
+\def\hhO{\scriptaxis\bigcirc\mkern.4mu} \def\hho{{\circ}\mkern1.2mu}%
+\newarrowhead{o}\hho\hho\circ\circ%%
+\newarrowhead{O}\hhO\hhO{\scriptstyle\bigcirc}{\scriptstyle\bigcirc}%%
+
+%% crosses
+\def\rhtimes{\mkern-5mu{\times}\mkern-.8mu}\def\lhtimes{\mkern-.8mu{\times}%
+\mkern-5mu}\def\uhtimes{\setbox0=\hbox{$\times$}\ht0\axisheight\dp0-\ht0%
+\lower\ht0\box0 }\def\dhtimes{\setbox0=\hbox{$\times$}\ht0\axisheight\box0 }%
+\newarrowhead{X}\rhtimes\lhtimes\dhtimes\uhtimes\newarrowhead+++++
+
+%% empty head {} is also available
+
+%% Y from stmaryrd (vertical ones still need large adjustment)
+\newarrowhead{Y}{\mkern-3mu\Yright}{\Yleft\mkern-3mu}\Ydown\Yup
+
+%% ********** H E A D S with S H A F T S ***********
+
+%% little arrow with shaft
+\newarrowhead{->}\rightarrow\leftarrow\downarrow\uparrow
+
+%% arrow with double shaft
+%%\newarrowhead{=>}\Rightarrow\Leftarrow\Downarrow\Uparrow
+\newarrowhead{=>}\Rightarrow\Leftarrow{\@cmex7F}{\@cmex7E}
+
+%% harpoon with shaft (trailing up/left can be changed to down/right)
+\newarrowhead{harpoon}\rightharpoonup\leftharpoonup\downharpoonleft
+\upharpoonleft
+
+%% little double-headed arrow with shaft (uses AMS symbols fonts)
+\def\twoheaddownarrow{\rlap{$\downarrow$}\raise-.5ex\hbox{$\downarrow$}}%%
+\def\twoheaduparrow{\rlap{$\uparrow$}\raise.5ex\hbox{$\uparrow$}}%%
+\newarrowhead{->>}\twoheadrightarrow\twoheadleftarrow\twoheaddownarrow
+\twoheaduparrow
+
+%% ********** T A I L S ***********
+
+%% vee tail
+\def\rtvee{\greaterthan}%%
+\def\ltvee{\mkern-1mu{\lessthan}\mkern.4mu}%% \mkern added 15.1.93
+\def\dtvee{\vee}%%
+\def\utvee{\wedge}%%
+\newarrowtail{vee}\greaterthan\ltvee\vee\wedge
+
+%% little vee tail
+\newarrowtail{littlevee}{\scriptaxis\greaterthan}{\mkern-1mu\scriptaxis
+\lessthan}{\scriptstyle\vee}{\scriptstyle\wedge}\ifx\boldmath\CD@qK
+\newarrowtail{boldlittlevee}{\scriptaxis\greaterthan}{\mkern-1mu\scriptaxis
+\lessthan}{\scriptstyle\vee}{\scriptstyle\wedge}\else\newarrowtail{%
+boldlittlevee}{\boldscriptaxis\greaterthan}{\mkern-1mu\boldscriptaxis
+\lessthan}{\boldscript\vee}{\boldscript\wedge}\fi
+
+%% curly vee tail (uses AMS symbols fonts)
+\newarrowtail{curlyvee}\succ{\mkern-1mu{\prec}\mkern.4mu}\curlyvee\curlywedge
+
+%% open and closed triangle tails (uses AMS symbols fonts)
+\def\rttriangle{\mkern1.2mu\triangleright}%% 29.1.93
+\newarrowtail{triangle}\rttriangle\lhtriangle\dhtriangle\uhtriangle
+\newarrowtail{blacktriangle}\blacktriangleright{\mkern-1mu\blacktriangleleft
+\mkern.4mu}\dhblack\uhblack\newarrowtail{littleblack}{\scriptaxis
+\blacktriangleright\mkern-2mu}{\mkern-1mu\scriptaxis\blacktriangleleft}%
+\dhlblack\uhlblack
+
+%% LaTeX tails
+\def\rtla{\hbox{\setbox0=\lnchar55\dimen0=\wd0\kern-.5\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.2\dimen0}}%%
+\def\ltla{\hbox{\setbox0=\lnchar33\dimen0=\wd0\kern-.15\dimen0\ht0\z@\raise
+\axisheight\box0\kern-.5\dimen0}}%%
+\def\dtla{\vbox{\setbox0=\rlap{\lnchar77}\dimen0=\ht0\kern-.7\dimen0\box0%
+\kern-.1\dimen0}}%% 15.1.93 from -.6
+\def\utla{\vbox{\setbox0=\rlap{\lnchar66}\dimen0=\ht0\kern-.1\dimen0\box0%
+\kern-.6\dimen0}}%%
+\newarrowtail{LaTeX}\rtla\ltla\dtla\utla
+
+%% double vee tail %% will probably be withdrawn later
+\def\rtvvee{\gg\mkern-3mu}%%
+\def\ltvvee{\mkern-3mu\ll}%%
+\def\dtvvee{\vbox{\hbox{$\vee$}\kern-.6ex \hbox{$\vee$}\vss}}%%
+\def\utvvee{\vbox{\vss\hbox{$\wedge$}\kern-.6ex \hbox{$\wedge$}\kern\z@}}%%
+\newarrowtail{doublevee}\rtvvee\ltvvee\dtvvee\utvvee
+
+%% double LaTeX tails %% will probably be withdrawn later
+\def\ltlala{\ltla\kern.3em\ltla}%%
+\def\rtlala{\rtla\kern.3em\rtla}%%
+\def\utlala{\hbox{\utla\raise-.6ex\utla}}%%
+\def\dtlala{\hbox{\dtla\lower-.6ex\dtla}}%%
+\newarrowtail{doubleLaTeX}\rtlala\ltlala\dtlala\utlala
+
+%% bar (as in \mapsto)
+\def\utbar{\vrule height 0.093ex depth0pt width 0.4em}%%
+\let\dtbar\utbar%%
+\def\rtbar{\mkern1.5mu\vrule height 1.1ex depth.06ex width .04em\mkern1.5mu}%
+%%
+\let\ltbar\rtbar%%
+\newarrowtail{mapsto}\rtbar\ltbar\dtbar\utbar%%
+\newarrowtail{|}\rtbar\ltbar\dtbar\utbar%%ascii vertical bar (|)
+
+%% hooks (as in \into): choice of after/above and before/below
+
+\def\rthooka{\raisehook{}+\subset\mkern-1mu}%%
+\def\lthooka{\mkern-1mu\raisehook{}+\supset}%%
+\def\rthookb{\raisehook{}-\subset\mkern-2mu}%%
+\def\lthookb{\mkern-1mu\raisehook{}-\supset}%%
+
+\def\dthooka{\shifthook{}+\cap}%%
+\def\dthookb{\shifthook{}-\cap}%%
+\def\uthooka{\shifthook{}+\cup}%%
+\def\uthookb{\shifthook{}-\cup}%%
+
+\newarrowtail{hooka}\rthooka\lthooka\dthooka\uthooka\newarrowtail{hookb}%
+\rthookb\lthookb\dthookb\uthookb
+
+\ifx\boldmath\CD@qK\newarrowtail{boldhooka}\rthooka\lthooka\dthooka\uthooka
+\newarrowtail{boldhookb}\rthookb\lthookb\dthookb\uthookb\newarrowtail{%
+boldhook}\rthooka\lthooka\dthookb\uthooka\else\def\rtbhooka{\raisehook
+\boldmath+\subset\mkern-1mu}%%
+\def\ltbhooka{\mkern-1mu\raisehook\boldmath+\supset}%%
+\def\rtbhookb{\raisehook\boldmath-\subset\mkern-2mu}%%
+\def\ltbhookb{\mkern-1mu\raisehook\boldmath-\supset}%%
+\def\dtbhooka{\shifthook\boldmath+\cap}%%
+\def\dtbhookb{\shifthook\boldmath-\cap}%%
+\def\utbhooka{\shifthook\boldmath+\cup}%%
+\def\utbhookb{\shifthook\boldmath-\cup}%%
+\newarrowtail{boldhooka}\rtbhooka\ltbhooka\dtbhooka\utbhooka\newarrowtail{%
+boldhookb}\rtbhookb\ltbhookb\dtbhookb\utbhookb\newarrowtail{boldhook}%
+\rtbhooka\ltbhooka\dtbhooka\utbhooka\fi
+
+%% square-ended hooks (used for closed subsets in ``lifting and gluing'')
+\def\dtsqhooka{\shifthook{}+\sqcap}%%
+\def\dtsqhookb{\shifthook{}-\sqcap}%%
+\def\ltsqhooka{\mkern-1mu\raisehook{}+\sqsupset}%%
+\def\ltsqhookb{\mkern-1mu\raisehook{}-\sqsupset}%%
+\def\rtsqhooka{\raisehook{}+\sqsubset\mkern-1mu}%%
+\def\rtsqhookb{\raisehook{}-\sqsubset\mkern-2mu}%%
+\def\utsqhooka{\shifthook{}+\sqcup}%%
+\def\utsqhookb{\shifthook{}-\sqcup}%%
+\newarrowtail{sqhook}\rtsqhooka\ltsqhooka\dtsqhooka\utsqhooka
+
+%% the following seem the better choices at 10pt & 300dpi
+\newarrowtail{hook}\rthooka\lthookb\dthooka\uthooka\newarrowtail{C}\rthooka
+\lthookb\dthooka\uthooka
+
+%% circles
+\newarrowtail{o}\hho\hho\circ\circ%%
+\newarrowtail{O}\hhO\hhO{\scriptstyle\bigcirc}{\scriptstyle\bigcirc}%%
+
+%% crosses
+\newarrowtail{X}\lhtimes\rhtimes\uhtimes\dhtimes\newarrowtail+++++
+
+%% empty tail {} is also available
+
+%% Y from stmaryrd (vertical ones still need adjustment)
+\newarrowtail{Y}\Yright\Yleft\Ydown\Yup
+
+%% harpoon with shaft (trailing up/left can be changed to down/right)
+\newarrowtail{harpoon}\leftharpoondown\rightharpoondown\upharpoonright
+\downharpoonright
+
+%% ********** F I L L E R S ***********
+
+%% shortening is up to 0.15em=2.7mu horiz and 0.35ex vertically at each end.
+
+%% dot {.}, single rule {-} and empty {} fillers are also available
+
+%% double and triple lines
+%%\newarrowfiller{=}==\Vert\Vert%%
+\newarrowfiller{=}=={\@cmex77}{\@cmex77}%% 16.1.93
+\def\vfthree{\mid\!\!\!\mid\!\!\!\mid}%%ascii
+\newarrowfiller{3}\equiv\equiv\vfthree\vfthree
+
+%% dashed line
+\def\vfdashstrut{\vrule width0pt height1.3ex depth0.7ex}%%
+\def\vfthedash{\vrule width\CD@LF height0.6ex depth 0pt}%%
+\def\hfthedash{\CD@AJ\vrule\horizhtdp width 0.26em}%%
+\def\hfdash{\mkern5.5mu\hfthedash\mkern5.5mu}%%
+\def\vfdash{\vfdashstrut\vfthedash}%%
+\newarrowfiller{dash}\hfdash\hfdash\vfdash\vfdash
+
+%% ************* M I D D L E S ************
+
+%% plus
+\newarrowmiddle+++++
+
+%% ************* D I A G O N A L S ************
+
+%% simple arrow heads
+%%\def\nwhTO{\nwarrow\mkern-1mu}%%
+%%\def\nehTO{\mkern-.1mu\nearrow}%%
+%%\def\sehTO{\searrow\mkern-.02mu}%%
+%%\def\swhTO{\mkern-.8mu\swarrow}%%
+
+%%======================================================================%
+%% %
+%% (24) ARROW COMMANDS %
+%% %
+%%======================================================================%
+
+%% change to \iftrue to get mixed heads
+\iffalse%%
+\newarrow{To}----{vee}%%
+\newarrow{Arr}----{LaTeX}%%
+\newarrow{Dotsto}....{vee}%%
+\newarrow{Dotsarr}....{LaTeX}%%
+\newarrow{Dashto}{}{dash}{}{dash}{vee}%%
+\newarrow{Dasharr}{}{dash}{}{dash}{LaTeX}%%
+\newarrow{Mapsto}{mapsto}---{vee}%%
+\newarrow{Mapsarr}{mapsto}---{LaTeX}%%
+\newarrow{IntoA}{hooka}---{vee}%%
+\newarrow{IntoB}{hookb}---{vee}%%
+\newarrow{Embed}{vee}---{vee}%%
+\newarrow{Emarr}{LaTeX}---{LaTeX}%%
+\newarrow{Onto}----{doublevee}%%
+\newarrow{Dotsonarr}....{doubleLaTeX}%%
+\newarrow{Dotsonto}....{doublevee}%%
+\newarrow{Dotsonarr}....{doubleLaTeX}%%
+\else%%
+\newarrow{To}---->%%
+\newarrow{Arr}---->%%
+\newarrow{Dotsto}....>%%
+\newarrow{Dotsarr}....>%%
+\newarrow{Dashto}{}{dash}{}{dash}>%%
+\newarrow{Dasharr}{}{dash}{}{dash}>%%
+\newarrow{Mapsto}{mapsto}--->%%
+\newarrow{Mapsarr}{mapsto}--->%%
+\newarrow{IntoA}{hooka}--->%%
+\newarrow{IntoB}{hookb}--->%%
+\newarrow{Embed}>--->%%
+\newarrow{Emarr}>--->%%
+\newarrow{Onto}----{>>}%%
+\newarrow{Dotsonarr}....{>>}%%
+\newarrow{Dotsonto}....{>>}%%
+\newarrow{Dotsonarr}....{>>}%%
+\fi%%
+
+\newarrow{Implies}===={=>}%% minimum cell height 9.5pt
+\newarrow{Project}----{triangle}%%
+\newarrow{Pto}----{harpoon}%% partial function
+\newarrow{Relto}{harpoon}---{harpoon}%% binary relation
+
+\newarrow{Eq}=====%%
+\newarrow{Line}-----%%
+\newarrow{Dots}.....%%
+\newarrow{Dashes}{}{dash}{}{dash}{}%%
+
+%% square hooked arrow (used in my ``gluing and lifting'' paper)
+\newarrow{SquareInto}{sqhook}--->
+
+%% braces and parentheses
+%% \newarrow gives inappropriate directions, so we change the names
+%% the vertical filler is too far to the right; horizontal too high
+%% the vertical middles are too low with midvshaft
+%% maybe we'll add square brackets and the integral sign one day
+\newarrowhead{cmexbra}{\@cmex7B}{\@cmex7C}{\@cmex3B}{\@cmex38}%%
+\newarrowtail{cmexbra}{\@cmex7A}{\@cmex7D}{\@cmex39}{\@cmex3A}%%
+\newarrowmiddle{cmexbra}{\braceru\bracelu}{\bracerd\braceld}{\vcenter{%
+\hbox@maths{\@cmex3D\mkern-2mu}}}%% right
+{\vcenter{\hbox@maths{\mkern2mu\@cmex3C}}}%% left
+\newarrow{@brace}{cmexbra}-{cmexbra}-{cmexbra}%% braces
+\newarrow{@parenth}{cmexbra}---{cmexbra}%% straight parentheses
+\def\rightBrace{\d@brace[thick,cmex]}%%ASCII square brackets []
+\def\leftBrace{\u@brace[thick,cmex]}%%ASCII square brackets []
+\def\upperBrace{\r@brace[thick,cmex]}%%ASCII square brackets []
+\def\lowerBrace{\l@brace[thick,cmex]}%%ASCII square brackets []
+\def\rightParenth{\d@parenth[thick,cmex]}%%ASCII square brackets []
+\def\leftParenth{\u@parenth[thick,cmex]}%%ASCII square brackets []
+\def\upperParenth{\r@parenth[thick,cmex]}%%ASCII square brackets []
+\def\lowerParenth{\l@parenth[thick,cmex]}%%ASCII square brackets []
+
+%% synonyms for reverse compatibility
+
+\let\uFrom\uTo%%
+\let\lFrom\lTo%%
+\let\uDotsfrom\uDotsto%%
+\let\lDotsfrom\lDotsto%%
+\let\uDashfrom\uDashto%%
+\let\lDashfrom\lDashto%%
+\let\uImpliedby\uImplies%%
+\let\lImpliedby\lImplies%%
+\let\uMapsfrom\uMapsto%%
+\let\lMapsfrom\lMapsto%%
+\let\lOnfrom\lOnto%%
+\let\uOnfrom\uOnto%%
+\let\lPfrom\lPto%%
+\let\uPfrom\uPto%%
+
+\let\uInfromA\uIntoA%%
+\let\uInfromB\uIntoB%%
+\let\lInfromA\lIntoA%%
+\let\lInfromB\lIntoB%%
+\let\rInto\rIntoA%%
+\let\lInto\lIntoA%%
+\let\dInto\dIntoB%%
+\let\uInto\uIntoA%%
+\let\ruInto\ruIntoA%%
+\let\luInto\luIntoA%%
+\let\rdInto\rdIntoA%%
+\let\ldInto\ldIntoA%%
+%%
+\let\hEq\rEq%%
+\let\vEq\uEq%%
+\let\hLine\rLine%%
+\let\vLine\uLine%%
+\let\hDots\rDots%%
+\let\vDots\uDots%%
+\let\hDashes\rDashes%%
+\let\vDashes\uDashes%%
+
+%%=========================================================================%
+%% The following are included for reverse compatibility only.
+%%=========================================================================%
+\let\NW\luTo\let\NE\ruTo\let\SW\ldTo\let\SE\rdTo\def\nNW{\luTo(2,3)}\def\nNE{%
+\ruTo(2,3)}%%ascii
+\def\sSW{\ldTo(2,3)}\def\sSE{\rdTo(2,3)}%%ascii
+\def\wNW{\luTo(3,2)}\def\eNE{\ruTo(3,2)}%%ascii
+\def\wSW{\ldTo(3,2)}\def\eSE{\rdTo(3,2)}%%ascii
+\def\NNW{\luTo(2,4)}\def\NNE{\ruTo(2,4)}%%ascii
+\def\SSW{\ldTo(2,4)}\def\SSE{\rdTo(2,4)}%%ascii
+\def\WNW{\luTo(4,2)}\def\ENE{\ruTo(4,2)}%%ascii
+\def\WSW{\ldTo(4,2)}\def\ESE{\rdTo(4,2)}%%ascii
+\def\NNNW{\luTo(2,6)}\def\NNNE{\ruTo(2,6)}%%ascii
+\def\SSSW{\ldTo(2,6)}\def\SSSE{\rdTo(2,6)}%%ascii
+\def\WWNW{\luTo(6,2)}\def\EENE{\ruTo(6,2)}%%ascii
+\def\WWSW{\ldTo(6,2)}\def\EESE{\rdTo(6,2)}%%ascii
+
+\let\NWd\luDotsto\let\NEd\ruDotsto\let\SWd\ldDotsto\let\SEd\rdDotsto\def\nNWd
+{\luDotsto(2,3)}\def\nNEd{\ruDotsto(2,3)}%%ascii
+\def\sSWd{\ldDotsto(2,3)}\def\sSEd{\rdDotsto(2,3)}%%ascii
+\def\wNWd{\luDotsto(3,2)}\def\eNEd{\ruDotsto(3,2)}%%ascii
+\def\wSWd{\ldDotsto(3,2)}\def\eSEd{\rdDotsto(3,2)}%%ascii
+\def\NNWd{\luDotsto(2,4)}\def\NNEd{\ruDotsto(2,4)}%%ascii
+\def\SSWd{\ldDotsto(2,4)}\def\SSEd{\rdDotsto(2,4)}%%ascii
+\def\WNWd{\luDotsto(4,2)}\def\ENEd{\ruDotsto(4,2)}%%ascii
+\def\WSWd{\ldDotsto(4,2)}\def\ESEd{\rdDotsto(4,2)}%%ascii
+\def\NNNWd{\luDotsto(2,6)}\def\NNNEd{\ruDotsto(2,6)}%%ascii
+\def\SSSWd{\ldDotsto(2,6)}\def\SSSEd{\rdDotsto(2,6)}%%ascii
+\def\WWNWd{\luDotsto(6,2)}\def\EENEd{\ruDotsto(6,2)}%%ascii
+\def\WWSWd{\ldDotsto(6,2)}\def\EESEd{\rdDotsto(6,2)}%%ascii
+
+\let\NWl\luLine\let\NEl\ruLine\let\SWl\ldLine\let\SEl\rdLine\def\nNWl{\luLine
+(2,3)}\def\nNEl{\ruLine(2,3)}%%ascii
+\def\sSWl{\ldLine(2,3)}\def\sSEl{\rdLine(2,3)}%%ascii
+\def\wNWl{\luLine(3,2)}\def\eNEl{\ruLine(3,2)}%%ascii
+\def\wSWl{\ldLine(3,2)}\def\eSEl{\rdLine(3,2)}%%ascii
+\def\NNWl{\luLine(2,4)}\def\NNEl{\ruLine(2,4)}%%ascii
+\def\SSWl{\ldLine(2,4)}\def\SSEl{\rdLine(2,4)}%%ascii
+\def\WNWl{\luLine(4,2)}\def\ENEl{\ruLine(4,2)}%%ascii
+\def\WSWl{\ldLine(4,2)}\def\ESEl{\rdLine(4,2)}%%ascii
+\def\NNNWl{\luLine(2,6)}\def\NNNEl{\ruLine(2,6)}%%ascii
+\def\SSSWl{\ldLine(2,6)}\def\SSSEl{\rdLine(2,6)}%%ascii
+\def\WWNWl{\luLine(6,2)}\def\EENEl{\ruLine(6,2)}%%ascii
+\def\WWSWl{\ldLine(6,2)}\def\EESEl{\rdLine(6,2)}%%ascii
+
+\let\NWld\luDots\let\NEld\ruDots\let\SWld\ldDots\let\SEld\rdDots\def\nNWld{%
+\luDots(2,3)}\def\nNEld{\ruDots(2,3)}%%ascii
+\def\sSWld{\ldDots(2,3)}\def\sSEld{\rdDots(2,3)}%%ascii
+\def\wNWld{\luDots(3,2)}\def\eNEld{\ruDots(3,2)}%%ascii
+\def\wSWld{\ldDots(3,2)}\def\eSEld{\rdDots(3,2)}%%ascii
+\def\NNWld{\luDots(2,4)}\def\NNEld{\ruDots(2,4)}%%ascii
+\def\SSWld{\ldDots(2,4)}\def\SSEld{\rdDots(2,4)}%%ascii
+\def\WNWld{\luDots(4,2)}\def\ENEld{\ruDots(4,2)}%%ascii
+\def\WSWld{\ldDots(4,2)}\def\ESEld{\rdDots(4,2)}%%ascii
+\def\NNNWld{\luDots(2,6)}\def\NNNEld{\ruDots(2,6)}%%ascii
+\def\SSSWld{\ldDots(2,6)}\def\SSSEld{\rdDots(2,6)}%%ascii
+\def\WWNWld{\luDots(6,2)}\def\EENEld{\ruDots(6,2)}%%ascii
+\def\WWSWld{\ldDots(6,2)}\def\EESEld{\rdDots(6,2)}%%ascii
+
+\let\NWe\luEmbed\let\NEe\ruEmbed\let\SWe\ldEmbed\let\SEe\rdEmbed\def\nNWe{%
+\luEmbed(2,3)}\def\nNEe{\ruEmbed(2,3)}%%ascii
+\def\sSWe{\ldEmbed(2,3)}\def\sSEe{\rdEmbed(2,3)}%%ascii
+\def\wNWe{\luEmbed(3,2)}\def\eNEe{\ruEmbed(3,2)}%%ascii
+\def\wSWe{\ldEmbed(3,2)}\def\eSEe{\rdEmbed(3,2)}%%ascii
+\def\NNWe{\luEmbed(2,4)}\def\NNEe{\ruEmbed(2,4)}%%ascii
+\def\SSWe{\ldEmbed(2,4)}\def\SSEe{\rdEmbed(2,4)}%%ascii
+\def\WNWe{\luEmbed(4,2)}\def\ENEe{\ruEmbed(4,2)}%%ascii
+\def\WSWe{\ldEmbed(4,2)}\def\ESEe{\rdEmbed(4,2)}%%ascii
+\def\NNNWe{\luEmbed(2,6)}\def\NNNEe{\ruEmbed(2,6)}%%ascii
+\def\SSSWe{\ldEmbed(2,6)}\def\SSSEe{\rdEmbed(2,6)}%%ascii
+\def\WWNWe{\luEmbed(6,2)}\def\EENEe{\ruEmbed(6,2)}%%ascii
+\def\WWSWe{\ldEmbed(6,2)}\def\EESEe{\rdEmbed(6,2)}%%ascii
+
+\let\NWo\luOnto\let\NEo\ruOnto\let\SWo\ldOnto\let\SEo\rdOnto\def\nNWo{\luOnto
+(2,3)}\def\nNEo{\ruOnto(2,3)}%%ascii
+\def\sSWo{\ldOnto(2,3)}\def\sSEo{\rdOnto(2,3)}%%ascii
+\def\wNWo{\luOnto(3,2)}\def\eNEo{\ruOnto(3,2)}%%ascii
+\def\wSWo{\ldOnto(3,2)}\def\eSEo{\rdOnto(3,2)}%%ascii
+\def\NNWo{\luOnto(2,4)}\def\NNEo{\ruOnto(2,4)}%%ascii
+\def\SSWo{\ldOnto(2,4)}\def\SSEo{\rdOnto(2,4)}%%ascii
+\def\WNWo{\luOnto(4,2)}\def\ENEo{\ruOnto(4,2)}%%ascii
+\def\WSWo{\ldOnto(4,2)}\def\ESEo{\rdOnto(4,2)}%%ascii
+\def\NNNWo{\luOnto(2,6)}\def\NNNEo{\ruOnto(2,6)}%%ascii
+\def\SSSWo{\ldOnto(2,6)}\def\SSSEo{\rdOnto(2,6)}%%ascii
+\def\WWNWo{\luOnto(6,2)}\def\EENEo{\ruOnto(6,2)}%%ascii
+\def\WWSWo{\ldOnto(6,2)}\def\EESEo{\rdOnto(6,2)}%%ascii
+
+\let\NWod\luDotsonto\let\NEod\ruDotsonto\let\SWod\ldDotsonto\let\SEod
+\rdDotsonto\def\nNWod{\luDotsonto(2,3)}\def\nNEod{\ruDotsonto(2,3)}%%ascii
+\def\sSWod{\ldDotsonto(2,3)}\def\sSEod{\rdDotsonto(2,3)}%%ascii
+\def\wNWod{\luDotsonto(3,2)}\def\eNEod{\ruDotsonto(3,2)}%%ascii
+\def\wSWod{\ldDotsonto(3,2)}\def\eSEod{\rdDotsonto(3,2)}%%ascii
+\def\NNWod{\luDotsonto(2,4)}\def\NNEod{\ruDotsonto(2,4)}%%ascii
+\def\SSWod{\ldDotsonto(2,4)}\def\SSEod{\rdDotsonto(2,4)}%%ascii
+\def\WNWod{\luDotsonto(4,2)}\def\ENEod{\ruDotsonto(4,2)}%%ascii
+\def\WSWod{\ldDotsonto(4,2)}\def\ESEod{\rdDotsonto(4,2)}%%ascii
+\def\NNNWod{\luDotsonto(2,6)}\def\NNNEod{\ruDotsonto(2,6)}%%ascii
+\def\SSSWod{\ldDotsonto(2,6)}\def\SSSEod{\rdDotsonto(2,6)}%%ascii
+\def\WWNWod{\luDotsonto(6,2)}\def\EENEod{\ruDotsonto(6,2)}%%ascii
+\def\WWSWod{\ldDotsonto(6,2)}\def\EESEod{\rdDotsonto(6,2)}%%ascii
+
+%%======================================================================%
+%% %
+%% (25) MISCELLANEOUS %
+%% %
+%%======================================================================%
+
+\def\labelstyle{%%
+\ifincommdiag%%
+\textstyle%%
+\else%%
+\scriptstyle%%
+\fi}%%
+\let\objectstyle\displaystyle
+
+\newdiagramgrid{pentagon}{0.618034,0.618034,1,1,1,1,0.618034,0.618034}{1.%
+17557,1.17557,1.902113,1.902113}
+
+\newdiagramgrid{perspective}{0.75,0.75,1.1,1.1,0.9,0.9,0.95,0.95,0.75,0.75}{0%
+.75,0.75,1.1,1.1,0.9,0.9}
+
+\diagramstyle[%%ascii open square bracket
+dpi=300,%% office laserwriters are usually 300 dots per inch
+vmiddle,nobalance,%% vertical and horizontal positioning
+loose,%% allow rows and columns to stretch
+thin,%% line10 arrows; default rule thickness (TeXbook p447)
+pilespacing=10pt,%
+%% parallel vertical separation (horizontals: half this)
+shortfall=4pt,%% distance between arrowheads and their targets
+%% The following are defaulted on entry to the diagram itself.
+%% l>=2em minimum length of horizontal arrow shafts in text
+%% l>=1em ditto in diagrams
+%% size=3em cell size
+%% heads=LaTeX arrowheads
+]%%ascii close square bracket
+
+%% process options to LaTeX2e's \usepackage[options]{diagrams}
+\ifx\ProcessOptions\CD@qK\else\CD@PK\ProcessOptions\relax\CD@FF\CD@e\fi\fi
+
+%%============================== THE END ====================================
+\CD@vE\CD@hK\message{| running in pdf mode -- diagonal arrows will work
+automatically |}\else\message{| >>>>>>>> POSTSCRIPT MODE (DVIPS) IS NOW THE
+DEFAULT <<<<<<<<<<<<|}\message{|(DVI mode has not been supported since 1992
+and produces inferior|}\message{|results which are completely unsuitable for
+publication. However,|}\message{|if you really still need it, you can still
+get it by loading the |}\message{|package using ``\string\usepackage[%
+UglyObsolete]{diagrams}'' instead. ) |}\fi\else\message{| >>>>>>>> USING UGLY
+OBSOLETE DVI CODE - PLEASE STOP <<<<<<<<<<<<|}\message{|(DVI mode has not been
+supported since 1992 and produces inferior|}\message{|results which are
+completely unsuitable for publication - Please |}\message{|use the PostScript
+or PDF mode instead, for much better results.)|}\fi\cdrestoreat
+%% restore old category code for @ etc
+\message{===================================================================}%
+%% This is the end of Paul Taylor's commutative diagrams package.
diff --git a/macros/generic/diagrams/taylor/diagrams.sty b/macros/generic/diagrams/taylor/diagrams.sty
new file mode 120000
index 0000000000..900cb89f4b
--- /dev/null
+++ b/macros/generic/diagrams/taylor/diagrams.sty
@@ -0,0 +1 @@
+diagrams.tex \ No newline at end of file
diff --git a/macros/generic/diagrams/taylor/diagrams.tex b/macros/generic/diagrams/taylor/diagrams.tex
new file mode 120000
index 0000000000..a18d216e51
--- /dev/null
+++ b/macros/generic/diagrams/taylor/diagrams.tex
@@ -0,0 +1 @@
+V3,93.tex \ No newline at end of file
diff --git a/macros/generic/diagrams/taylor/index.html b/macros/generic/diagrams/taylor/index.html
new file mode 100644
index 0000000000..ae66144ea2
--- /dev/null
+++ b/macros/generic/diagrams/taylor/index.html
@@ -0,0 +1,599 @@
+
+
+
+
+
+
+
+
+<title> Commutative Diagrams in TeX</title>
+
+<h1 align="center">Commutative Diagrams in TeX </h1>
+
+<h3 align="center">Paul Taylor </h3>
+
+<h3 align="center">since 1986 </h3>
+
+
+
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+
+<div class="p"><!----></div>
+
+
+
+
+
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+
+
+<div class="p"><!----></div>
+
+
+
+<div class="p"><!----></div>
+
+
+<div class="p"><!----></div>
+
+
+
+<div class="p"><!----></div>
+
+
+
+
+
+
+<div class="p"><!----></div>
+
+
+<div class="p"><!----></div>
+
+ This is a macro package for drawing so-called "commutative" diagrams
+in category theory and related subjects.
+
+<div class="p"><!----></div>
+
+<h2>The macros and the manual</h2>
+
+<div class="p"><!----></div>
+Unlike many other packages there is no "installation procedure" -
+you just copy <a href="diagrams.sty"><b>the macros themselves</b></a>
+to your <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;macros directory.
+
+<div class="p"><!----></div>
+The <b>manual</b> is available in several formats:
+<a href="manual.tex">LaTeX source</a>,
+<a href="manual.pdf">PDF</a>,
+<a href="manual.dvi">DVI</a>,
+<a href="manual.ps.gz">600dpi A4 PostScript</a> and
+<a href="booklet.ps.gz">600dpi A5 PS booklet</a>.
+The "booklet" form requires a two-sided printer with A4 paper;
+if you don't have such a thing, don't bother taking the file.
+
+<div class="p"><!----></div>
+If you have not already done so, please register as a user by sending
+a message to <b>pt @ cs.man.ac.uk</b>
+with the words "commutative diagrams" in the subject line.
+
+<div class="p"><!----></div>
+I have also written some macros for <a href="../proofs/index.html">proofs</a>
+and <a href="../tex/index.html">other things</a>.
+
+<div class="p"><!----></div>
+
+<h2>Diagonal arrows, PostScript and PDF</h2>
+
+<div class="p"><!----></div>
+<a href="http://en.wikipedia.org/wiki/TeX"><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span></a> itself
+and its basic output format
+(<a href="http://en.wikipedia.org/wiki/DVI_(file_format)">DVI</a>) were
+designed by Donald Knuth to place letters and symbols from a variety
+of typefaces on an orthogonal grid, an idea that goes back to
+Gutenberg's original "movable type" printing press. This means that
+there is no natural way of drawing diagonal lines or rotating text.
+
+<div class="p"><!----></div>
+Though DVI has the merit of simplicity, most complex documents
+nowadays in both the open-source and commercial worlds are distributed
+in Adobe's PostScript or PDF formats.
+In particular, the commonest way of printing (the DVI output from) <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;documents is to use Tomas Rokicki's program
+<a href="http://www.radicaleye.com"><b>dvips</b></a>.
+
+<div class="p"><!----></div>
+PostScript and PDF have a much more general coordinate system than
+<span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;has, and it is very easy to rotate blocks of text.
+The diagrams package was designed in 1992 to take advantage of this
+feature of PostScript and (from 2002) PDF. It was always intended to
+be used in this way, although only in 2004 was the default changed to
+use this.
+
+<div class="p"><!----></div>
+Unfortunately, because of the inappropriately set optional behaviour,
+many users were not enjoying any of the benefits of the package.
+They were instead using the obsolete pre-1992 code (see below);
+this generated <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>-style arrows, that had incompatible arrowheads
+and didn't meet the objects to which they were supposed to point.
+
+<div class="p"><!----></div>
+<br />There are other graphical packages, including several that are also
+used to draw categorical diagrams, that draw diagonal lines in other
+ways, some of which are understood by xdvi. Like <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>'s
+<tt>picture</tt> environment, they do this by juxtaposing many
+characters (such as diagonal line-segments or dots) from special fonts.
+These fonts need to be distributed and installed along with the
+macro packages themselves.
+
+<div class="p"><!----></div>
+My diagrams package, on the other hand, needs no special fonts, and
+there is just the macro package itself to install. It achieves the
+same generality of diagonal arrows as it has horizontal ones by
+taking advantage of the method that most people use to print their
+documents.
+This design decision was taken following
+<a href="msg1992.html">consultation</a> with users,
+and I have always remained convinced that it was the correct one.
+
+<div class="p"><!----></div>
+The method was adapted to
+<a href="http://www.tug.org/applications/pdftex">pdftex</a>.
+If xdvi or other programs implemented extensions to DVI to rotate boxes,
+it could be used for them too.
+
+<div class="p"><!----></div>
+
+<h2>DVI previewers</h2>
+
+<div class="p"><!----></div>
+DVI previewers such as
+<a href="http://math.berkeley.edu/~vojta/xdvi.html">xdvi</a> and
+<a href="http://math.ndsu.nodak.edu/resources/tex/bibliography/yap/yap.html">YAP</a>
+do not understand the fragments of PostScript that are used to rotate
+the arrows, so what should be diagonal arrows appear horizontal
+instead. This behaviour is automatically corrected when you use
+dvips to print the document.
+
+<div class="p"><!----></div>
+If, for some reason, you need to use xdvi or yap to display documents
+containing diagonals, you can still make use of the obsolete code. Use
+the command
+
+<center>
+ <tt><tt>\usepackage&nbsp;</tt>[UglyObsolete,tight,heads=LaTeX] {diagrams}</tt>
+</center>
+to load the diagrams package.
+
+<div class="p"><!----></div>
+<br /><b>Please do not use the obsolete code for publication.</b>
+
+<div class="p"><!----></div>
+<br />Previous generations understood that you had to understand what
+tools did and how they worked. Indeed, there was a saying that
+"<b>bad workmen blame their tools</b>".
+In the computer age, maybe even more so than in the pre-scientific one,
+people expect things to "just work", <em>i.e</em>.&nbsp;by magic,
+without understanding anything.
+
+<div class="p"><!----></div>
+The pre-1992 pure DVI code in the diagrams package was a useful tool
+in its day, and I still try to make most of my diagrams work with it.
+However, if you wish to make extensive use of it, you too will have to
+understand how it works, and make the manual adjustments that are
+necessary to make up for the lack of magical programming behind it.
+
+<div class="p"><!----></div>
+Firstly, since pure DVI cannot rotate characters, only the standard <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;arrowheads are available for diagonals, so you should only use the
+<b>heads=LaTeX</b> option, and not (for example) <b>heads=vee</b>.
+
+<div class="p"><!----></div>
+Second, since it uses <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>'s diagonal line and arrow characters,
+the only slopes that are allowed are those with numerator and
+denominator at most&nbsp;4. However, since the package rounds slopes to
+simple rationals anyway (even in the "PostScript" code), this is
+not usually a problem in small diagrams.
+
+<div class="p"><!----></div>
+<br />But there is a <b>more serious problem</b> than this.
+
+<div class="p"><!----></div>
+The package makes two "passes" when constructing each diagram:
+one in which it constructs a "matrix" from the data that you type,
+and a second in which it takes this matrix apart and stretches
+each of the arrows to meet its endpoints.
+
+<div class="p"><!----></div>
+The obsolete "pure DVI" code constructs diagonal lines entirely in
+the first pass and <b>does not stretch them</b> in the second pass.
+It just makes a guess at the appropriate length, based on the
+<b>width</b> and <b>height</b> options for the diagram.
+
+<div class="p"><!----></div>
+<br /><b>You should always choose the appropriate width and height yourself.</b>
+
+<div class="p"><!----></div>
+<br />By default, the rows and columns of the diagram are <b>loose</b> -
+they stretch in the same way as any other matrix or table, and
+the "PostScript" code corrects for this.
+This default was chosen to make the package "just work",
+but <b>diagrams look better if they are of a uniform regular size</b>.
+
+<div class="p"><!----></div>
+Since the obsolete pure DVI code does not make the necessary correction
+in the second pass, you have to make sure that its first guess is correct,
+by setting the width and height yourself, and making the diagram
+<b>tight</b>. When you set the <b>tight</b> option, you will
+find at first that the object labels sometimes overprint. The package
+generates error messages to tell you where this happens,
+and makes a suggestion for the appropriate <b>size</b>
+(common height and width), although this is usually too big.
+
+<div class="p"><!----></div>
+Sometimes you will also need to adjust the <b>shortfall</b>
+of any arrows that point at large object labels,
+<em>i.e</em>.&nbsp;the distance between the end of the arrow and the object.
+
+<div class="p"><!----></div>
+<br />Finally, you may ask why I don't "fix" this code. Indeed I have looked
+into doing so several times. The answer is quite simply that the
+small benefit that would accrue from rewriting it does not justify the
+labour that would be needed.
+Not only is it much simpler to rotate horizontal arrows,
+but the the results are also far superior.
+
+<div class="p"><!----></div>
+
+<h2>Arrowheads used in my book</h2>
+
+<div class="p"><!----></div>
+You will see that the diagrams in my book
+<a href="../Practical-Foundations/index.html"><i>Practical Foundations of Mathematics</i></a>
+have arrowheads compatible with those of <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>'s ordinary <tt>\rightarrow</tt>.
+This was done by modifying the MetaFont source of <tt>\rightarrow</tt>
+to reduce its shaft to nothing, ie to make it just an arrowhead.
+
+<div class="p"><!----></div>
+I regret that I will <em>not</em> be releasing this MetaFont code, or PK
+files derived from it, because I am not prepared to undertake the
+support work that would be necessary afterwards.
+(Not even if you "promise to keep it to yourself",
+as you will inevitably release DVI files into the world containing
+references to these characters, obliging me to provide PK files to
+your readers, and explain to them why they keep getting checksum errors
+from dvips.)
+
+<div class="p"><!----></div>
+However, if you are intending to create a new symbols font yourself
+(to follow the "St. Mary Road" fonts),
+<em>and undertake the necessary support work</em>,
+I will be very pleased to give you the MetaFont source for these arrowheads
+and the other new symbols that are introduced in the book.
+I now have these in a form that's compatible with teTeX.
+
+<div class="p"><!----></div>
+
+<h2>Features introduced since September 1992</h2>
+
+<div class="p"><!----></div>
+See also the top of the source file for bug fixes and adjustments
+to the positioning of things.
+
+<div class="p"><!----></div>
+
+<h3>3.91 Released 1 September 2006</h3>
+
+<div class="p"><!----></div>
+
+<h3>3.90 Released 11 April 2004</h3>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+PostScript mode made default.
+
+<div class="p"><!----></div>
+
+<h3>3.89 Released 7 July 2002</h3>
+
+<div class="p"><!----></div>
+Added support for pdftex, which is recognised automatically.
+
+<div class="p"><!----></div>
+
+<h3>3.88 Released 1 September 2000</h3>
+
+<div class="p"><!----></div>
+
+<ul>
+<li> Square hooks made available as arrowtails:
+
+<pre>
+&nbsp;&nbsp;&nbsp;\newarrow{SquareInto}{sqhook}---&#62;
+&nbsp;&nbsp;&nbsp;\begin{diagram}
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&amp;&nbsp;\rSquareInto&nbsp;B
+&nbsp;&nbsp;&nbsp;\end{diagram}
+
+</pre>
+
+<div class="p"><!----></div>
+</li>
+</ul>
+
+<div class="p"><!----></div>
+
+<h3>3.87 Released 1 September 1999</h3>
+
+<div class="p"><!----></div>
+This version was used for the absolutely final 1200dpi PostScript copy
+of the book, as it was handed over to CUP in December 1998.
+
+<div class="p"><!----></div>
+The only change was a 0.2pt fudge to the positioning of the components
+of arrows. Previously a lot of tweaking had been done in this department.
+
+<div class="p"><!----></div>
+
+<h3>3.86 Released 1 September 1998</h3>
+
+<div class="p"><!----></div>
+
+<ul>
+<li> New options <b>hug</b> and <b>nohug</b> in PostScript mode:
+
+<pre>
+&nbsp;&nbsp;&nbsp;\diagramstyle[PS,nohug]
+
+</pre>
+ uses PostScript for the arrows without rotating the labels, but the
+ way of calculating the actual position of these horizontal labels on
+ will remain subject to alteration for some period of time - please
+ send me examples if you feel that adjustment is needed.
+<div class="p"><!----></div>
+</li>
+
+<li> <b>midvshaft</b> and <b>snake</b> for vertical arrows
+<div class="p"><!----></div>
+</li>
+
+<li> New option
+
+<pre>
+&nbsp;&nbsp;\rTo[gap=5pt]
+
+</pre>
+ to create a gap in horizontals and PS diagonals, instead of the hack
+
+<pre>
+&nbsp;&nbsp;\rTo~{\;}
+
+</pre>
+ which caused <tt>^</tt> and <tt>_</tt> labels to be moved too far away
+ from the shaft. The width, here 5pt, defaults to the same
+ value as <b>shortfall</b>.
+<div class="p"><!----></div>
+</li>
+
+<li> Added <tt>&gt;-&gt;</tt> and /verb/&lt;-&lt;/ arrowheads; these are the same
+ as <tt>&gt;</tt> and <tt>&lt;</tt> but the shaft goes <em>through</em> the extra
+ arrowhead.
+<div class="p"><!----></div>
+</li>
+
+<li> Added 2pt space separating labels from vertical arrows.
+<div class="p"><!----></div>
+</li>
+
+<li> Identify the cell in which a second-pass error occurs.
+<div class="p"><!----></div>
+</li>
+
+<li> Corrected position of hook in <tt>\dInto</tt> (see <tt>\shifthook</tt>).
+<div class="p"><!----></div>
+</li>
+
+<li> Corrections to <tt>\lhtriangle</tt>, <tt>\dhtriangle</tt>,
+ and <tt>\newarrowtail{boldhook}</tt>.
+<div class="p"><!----></div>
+</li>
+
+<li> Suppress indentation of text following diagram (due to <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;change).
+<div class="p"><!----></div>
+</li>
+
+<li> Mangle <tt>\left@label</tt> and <tt>\right@label</tt> because of a
+ conflict with Elsevier's macros.
+<div class="p"><!----></div>
+</li>
+
+<li> Corrected dot spacing with <tt>[dotted]</tt> option.
+<div class="p"><!----></div>
+</li>
+</ul>
+
+<div class="p"><!----></div>
+
+<h3>3.85 Released 20 August 1997</h3>
+
+<div class="p"><!----></div>
+
+<ul>
+<li> New option <tt>[leftflush=margin]</tt> for left alignment of
+ diagrams on a margin, instead of centering them.
+ <tt>[leftflush]</tt> is like <tt>[flushleft]</tt>,
+ except that it reckons the alignment from multiple
+ verticals, or from text if there's no vertical.
+<div class="p"><!----></div>
+</li>
+
+<li> New options <tt>[hug]</tt> and <tt>[nohug]</tt> in PostScript mode:
+ <tt>[PS,nohug]</tt> uses PS for the arrows <b>without rotating the
+ labels</b>. Beware that this has been done in a lazy way by
+ overprinting empty <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>-style diagonals carrying the labels, which
+ may therefore be mis-placed.
+<div class="p"><!----></div>
+</li>
+
+<li> New option <tt>[crab=distance]</tt> shifts horizontals and PS
+ diagonals transversally by the specified distance.
+ The abbreviations <tt>[crab+]</tt> and <tt>[crab-]</tt> use
+ <tt>\PileSpacing</tt>, so to put four diagonal lines in parallel
+ do something like
+
+<pre>
+&nbsp;&nbsp;\ruTo[crab--]&nbsp;\ldTo[crab-]&nbsp;\ruTo[crab+]&nbsp;\ldTo[crab++]
+
+</pre>
+ This doesn't work with <tt>[nohug]</tt>.
+<div class="p"><!----></div>
+</li>
+
+<li> New option <tt>[snake=distance]</tt> shifts the middle of midshaft
+ horizontals and PS diagonals longitudinally by the specified
+ distance.
+<div class="p"><!----></div>
+</li>
+</ul>
+
+<div class="p"><!----></div>
+
+<h3>3.84 Released 2 September 1996</h3>
+
+<div class="p"><!----></div>
+Provided <tt>\NWclck</tt> etc 2-cell arrows.
+
+<div class="p"><!----></div>
+
+<h3>3.83 Released 18 May 1995</h3>
+
+<div class="p"><!----></div>
+
+<ul>
+<li> New <tt>[dotted]</tt> option to change the filler on an arrow to
+ dots (useful for mediators for universal properties).
+<div class="p"><!----></div>
+</li>
+
+<li> Option <tt>[LaTeXeqno]</tt> uses <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>'s equation number and style
+ for "eqno"; <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>'s <tt>\label</tt> command picks this up.
+<div class="p"><!----></div>
+</li>
+</ul>
+
+<div class="p"><!----></div>
+
+<h3>3.81 Released 18 July 1994</h3>
+
+<div class="p"><!----></div>
+
+<ul>
+<li> <b>Stretchable PostScript diagonals implemented</b>.
+<div class="p"><!----></div>
+</li>
+
+<li> <tt>\overprint{text}</tt> sets text in maths and overprints it in the
+ current cell, centered in the column irrespective of other stuff.
+<div class="p"><!----></div>
+</li>
+
+<li> Option <tt>[repositionpullbacks]</tt>
+ redefines <tt>\SEpbk</tt> etc to use <tt>\overprint</tt>.
+<div class="p"><!----></div>
+</li>
+
+<li> New option <tt>[grid]</tt> to set column and row widths individually:
+ see manual for examples such as a regular pentagon and cube with perspective.
+<div class="p"><!----></div>
+</li>
+
+<li> Option <tt>[PostScript=name]</tt> takes the name of a DVI<font face="symbol">®</font
+>PS
+ translator as argument.
+<div class="p"><!----></div>
+</li>
+
+<li> Equilateral triangle or regular hexagon size options.
+<div class="p"><!----></div>
+</li>
+
+<li> Introduced landscape and portrait options.
+<div class="p"><!----></div>
+</li>
+
+<li> Peter Freyd's <tt>\puncture</tt> symbol provided.
+<div class="p"><!----></div>
+</li>
+</ul>
+
+<div class="p"><!----></div>
+
+<h3>Earlier Version numbers</h3>
+
+<ul>
+<li> 2 was circulated to some people in September 1989
+<div class="p"><!----></div>
+</li>
+
+<li> 3.16 was advertised on <tt>types</tt> and <tt>categories</tt>
+ in July 1990 and emailed to those who asked for it.
+<div class="p"><!----></div>
+</li>
+
+<li> 3.18 was the final bug-fix before the re-write began in April
+ 1992.
+<div class="p"><!----></div>
+</li>
+
+<li> 3.20 introduced error-recovery, and <tt>\newarrow</tt> for
+ horizontals and verticals.
+<div class="p"><!----></div>
+</li>
+
+<li> 3.22 completely rewrote the reformatting program for h and
+ corrected numerous alignment errors; introduced options in square
+ brackets
+<div class="p"><!----></div>
+</li>
+
+<li> 3.23 fixed a catastrophic error in nested diagrams
+<div class="p"><!----></div>
+</li>
+
+<li> 3.24 extended <tt>\newarrow</tt> to diagonals, added
+ trigonometry code, rewrote code for drawing <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;diagonals,
+ introduced PostScript and TPIC diagonals, consistent choice of
+ arrowheads.
+<div class="p"><!----></div>
+</li>
+</ul>
+
+<div class="p"><!----></div>
diff --git a/macros/generic/diagrams/taylor/manual.bklt.gz b/macros/generic/diagrams/taylor/manual.bklt.gz
new file mode 100644
index 0000000000..d0260bdf1e
--- /dev/null
+++ b/macros/generic/diagrams/taylor/manual.bklt.gz
Binary files differ
diff --git a/macros/generic/diagrams/taylor/manual.dvi b/macros/generic/diagrams/taylor/manual.dvi
new file mode 100644
index 0000000000..afaa65122c
--- /dev/null
+++ b/macros/generic/diagrams/taylor/manual.dvi
Binary files differ
diff --git a/macros/generic/diagrams/taylor/manual.pdf b/macros/generic/diagrams/taylor/manual.pdf
new file mode 100644
index 0000000000..13bd061411
--- /dev/null
+++ b/macros/generic/diagrams/taylor/manual.pdf
Binary files differ
diff --git a/macros/generic/diagrams/taylor/manual.ps.gz b/macros/generic/diagrams/taylor/manual.ps.gz
new file mode 100644
index 0000000000..1b831e2e1f
--- /dev/null
+++ b/macros/generic/diagrams/taylor/manual.ps.gz
Binary files differ
diff --git a/macros/generic/diagrams/taylor/manual.tex b/macros/generic/diagrams/taylor/manual.tex
new file mode 100644
index 0000000000..e9b6a044a0
--- /dev/null
+++ b/macros/generic/diagrams/taylor/manual.tex
@@ -0,0 +1,2695 @@
+\errorcontextlines 999
+%
+% =========================================
+\title { Commutative Diagrams in \TeX\ %
+ (version 4)}
+% | |
+% | by |
+% | |
+\author {{\bf Paul Taylor }\\
+% =========================================
+%
+ {\tt www.cs.man.ac.uk/$\sim$pt}}
+%
+\date {15 June 1997}
+%
+\def\abstracttext
+ {\TeX\ and \LaTeX\ have become standard as a way of writing papers
+ in Computer Science and Category Theory.
+ Even in source form they are easier to compose and read than
+ attempts to write mathematics in ASCII. In~Category Theory
+ ``commutative diagrams'' are essential for a clear visual
+ understanding of the paper, but the graphics capabilities of \TeX\
+ are so limited that it is very difficult to draw them nicely, if at
+ all. This manual describes a new but reverse-compatible version of
+ a package to draw such diagrams, expressed in a language in which many
+ users have already found it very easy to express themselves.}
+%
+% ===============================================================
+\documentclass[a4paper]{article}
+\usepackage{diagrams}
+\makeatletter
+\makeindex
+\def\pt@input#1#2#3{\openin1 #1 \ifeof1 \typeout{#2}#3%
+ \else\closein1 \relax\input #1 \fi}%
+%
+% Read the diagram macros file, saving the banner from the top.
+\let\messagex\message
+\def\banner{Paul Taylor's diagrams package}%
+%\def\getbanner<#1>{\def\banner{#1}}%
+%\def\message#1{\getbanner#1\let\message\messagex\message{#1}}%
+%\pt@input{diagrams}%
+%{I can't find the commutative diagrams package,
+%so I can't process the manual!}\endinput
+%\ifx\newarrow\undefined
+%\message{This manual cannot be processed by any version earlier than 3.24.}%
+%\message{Please get an up-to-date version from ftp.dcs.qmw.ac.uk.}%
+%\expandafter\endinput\fi
+%
+% **********************************************************
+% * You can experiment with changing the following options *
+% * as explained in the "Options" section of this manual. *
+% **********************************************************
+%
+\diagramstyle[tight,centredisplay%
+%,dpi=300% 300dpi is default;
+%,dpi=212% for two-up (A4 on A5) reduction of 300dpi
+,dpi=600% for more modern laser-printers
+%,dpi=424% for two-up (A4 on A5) reduction of 600dpi
+%,PostScript=Rokicki%
+,UglyObsolete% formerly called ``noPostScript''
+%,TPIC%
+,heads=LaTeX%
+%,heads=vee%
+%,heads=triangle%
+%,heads=curlyvee% uses AMS symbols
+%,heads=littlevee%
+%,heads=boldlittlevee% needs good-bold-math below
+%,heads=littleblack% uses AMS symbols
+%,heads=blacktriangle% uses AMS symbols
+]
+% The boldhook tails and boldlittlevee heads use sizes of cmsy and cmmi
+% fonts which you may not have available. In this case, please change
+% the following to \havegoodboldmathfalse.
+\newif\ifhavegoodboldmath\havegoodboldmathtrue
+%
+% ===============================================================
+% ===============================================================
+% Try to read various non-essential auxiliary input files.
+%
+\iftrue
+ \ifx\ds@amssymb\undefined
+ \ifx\ds@mssymb\undefined
+ \ifx\ds@amssymbols\undefined
+ \pt@input{amssymb.sty}{}{%
+ \pt@input{mssymb.tex}{}{%
+ \pt@input{amssymbols.sty}%
+ {Some of the arrowheads in the diagrams package use symbols from the extra
+ ^^Jfonts (msxm/msym or msam/msbm) provided by the American Mathematical
+ Society.^^JYou can get these by anonymous FTP from e-math.ams.com and
+ elsewhere.
+ ^^JIn this manual the relevant examples will just be left out.^^J}{}}}%
+ \else\ds@amssymbols\fi\else\ds@mssymb\fi\else\ds@amssymb\fi
+ \makeatletter % old versions of mssymb b*gg*r up \catcode`\@
+\fi
+%
+\pt@input{a4.sty}%
+{^^JThis manual was written for European A4 paper, but you do not have a4.sty.
+^^JYou'll get lots of Over-full \string\hbox'es, but don't worry.
+It doesn't matter.^^JWe can carry on without any real harm.}{}%
+\advance\textheight 5mm
+%
+\def\AMS{$\cal A$\kern-.1667em\lower.5ex\hbox{$\cal M$}\kern-.125em$\cal S$}
+\def\AmSTeX{\AMS-\TeX}
+\def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em\the\scriptfont2 A}%
+ \kern-.2em\lower.376ex\hbox{\the\textfont2 M}%
+ \kern-.125em {\the\textfont2 S}-\TeX}
+\def\AMSLaTeX{\AMS-\LaTeX}
+\def\LaTeXe{\mbox{\LaTeX\kern.15em$2_{\textstyle\varepsilon}$}}
+
+\def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC}
+\def\PiCTeX{\PiC\kern-.11em\TeX}
+\def\XYpic{\leavevmode\hbox{X\kern-.3em\lower.4ex\hbox{Y\kern-.15em}-pic}}
+
+%
+% I prefer paragraphs spaced rather than indented
+\parskip=2pt plus 2pt minus 1pt
+% and I don't like hyphenation
+\spaceskip=.5em plus .6em minus .2em
+\pretolerance=2000
+\binoppenalty=2000
+\relpenalty=1500
+% Penalty for splitting paragraphs
+\interlinepenalty=150
+\predisplaypenalty=10000
+\postdisplaypenalty=400
+\@beginparpenalty=\predisplaypenalty
+%
+%
+%\let\@mkboth\markboth
+\def\@oddfoot{}%
+\def\@evenfoot{}%
+\def\@evenhead{{\bf\thepage}\hfil{\rm\topmark}}%
+\def\@oddhead{{\rm\banner}\hfil{\bf\thepage}}%
+\def\sectionmark#1{\mark{\thesection. #1}}% should have \S but doesn't work
+%\def\section@mark#1{\markboth{#1}{\banner}}%
+\@twosidetrue
+%
+%
+\let\volx\relax % for ltugbot.sty
+\newcommand{\bsl}{$\backslash$}
+%
+\def\ix#1{#1\index{#1}}\def\person#1#2{#1 #2\index{#2, #1}}%
+{\escapechar-1 \xdef\bslch{\string\\}}%
+\def\ixcmd#1{{\escapechar-1 \xdef\cmdname{\string#1}}%
+ \expandafter\index{\cmdname @\bslch verb/\string#1/}}%
+\def\ixprotect#1{{\escapechar-1 \xdef\cmdname{\string#1}}%
+ \expandafter\index{\cmdname @\protect#1}}%
+
+\newarrow{Congruent}33333
+\newarrow{Curlyto}----{curlyvee}
+\newarrow{TeXto}----{->}
+\newarrow{TeXonto}----{->>}
+\newarrow{Blackinto}{blacktriangle}--->
+\newarrow{Openinto}{triangle}--->
+\newarrow{EEmbedd}{>>}---{>>}
+\newarrow{Corresponds}<--->
+\newarrow{Backwards}<----
+\newarrow{Multi}----o
+\newarrow{Crossto}----X
+\newarrow{Partial}----{harpoon}
+\newarrow{Into}{\ifhavegoodboldmath bold\fi hook}--->
+
+%=================================================================
+%
+% verbatim array
+%
+%=================================================================
+
+
+% This defines two new LaTeX environments: verbarray and verbdiag.
+
+% The first is like the verbatim environment, except that it treats each
+% cell of an array individually, centring the text within aligned &s. The two
+% arguments specify the text to be used for & and \\. Because of the
+% eager parsing at the beginning of a cell, \relax is needed before
+% commands that expand to anything other than their own text.
+% For example,
+% \begin{verbarray}{\ \&\ }{\ \string\\ \ }
+% A&\relax\rTo^f&B\\
+% \relax\dTo^g&&\relax\dTo^h\\
+% C&\relax\rTo^k&D
+% \end{verbarray}
+% produces the contents of a simple diagram.
+
+% The second packages this to produce a verbatim diagram, ie it encloses
+% the text in ``\begin{diagram}'' and ``\end{diagram}''. Any text which
+% follows ``\begin{verbdiag}'' on the same line is copied verbatim after
+% \begin{diagram}.
+
+% Here is a list of the characters that have been specially catcoded
+% except & [adapted from plain.tex]
+\def\dospecialsexceptand{\do\\\do\{\do\}\do\$%
+ \do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+% (not counting ascii null, tab, linefeed, formfeed, return, delete)
+% Each symbol in the list is preceded by \do, which can be defined
+% if you want to do something to every item in the list.
+
+\def\lverbcell{\begingroup \catcode``=13 \@noligs
+\tt \let\do\@makeother \dospecialsexceptand \dolverbcell}
+\def\dolverbcell#1\rverbcell{#1\endgroup}
+
+\def\verbarraycr{\omit{\verbarraycrstring}\cr}
+
+\newenvironment{verbarray}[2]%
+{\abovedisplayskip\z@ \abovedisplayshortskip\abovedisplayskip
+\belowdisplayskip\abovedisplayskip\belowdisplayshortskip\abovedisplayskip
+$$\hss\vbox\bgroup
+\tabskip\z@
+\let\\\verbarraycr\edef\verbarraycrstring{#2}%
+\halign\bgroup
+\hfil\lverbcell##\rverbcell\hfil&&{#1}\hfil\lverbcell##\rverbcell\hfil\cr
+%$$
+}%
+{%$$
+\verbarraycr\egroup\egroup\hss$$}
+
+\def\ke{\kern.25em}
+
+\newenvironment{verbdiag}%
+{\begin{pageblock}%
+ \vspace{2ex}%
+ \let\do\@makeother
+ \def\beginverbdiag{\begin{verbarray}{\ke\tt\&\ke}{\ke\string\\}}%
+ \noindent\tt\string\begin\{diagram\}
+ \bgroup\aftergroup\beginverbdiag\let\par\egroup
+ \obeylines\dospecials
+}%
+{\end{verbarray}%
+ \string\end\{diagram\}%\$\$
+ \vspace{2ex}%
+ \end{pageblock}%
+}
+
+\newenvironment{clean}{}{}
+\newenvironment{pageblock}{\vbox\bgroup}{\egroup}
+
+\makeatother
+%=============================================================================
+%=============================================================================
+%=============================================================================
+
+\begin{document}
+\maketitle
+\begin{abstract}\noindent\abstracttext\end{abstract}
+
+\section{Introduction}
+In papers in mathematics and computer science which employ Category Theory,
+there is much benefit in clarity if ``commutative diagrams'' are used as
+much as possible to illustrate definitions, equations and universal
+properties. Here is a typical such diagram: it is one of the
+Mac~Lane-Kelly equations.%
+\index{Mac Lane, Saunders}\index{Kelly, Gregory Max}
+\def\Id{{\rm id}}\def\Assl{{\rm assl}}%
+\begin{diagram}[width=6em]
+A*(B*(C*D))&\relax\rTo^\Assl&(A*B)*(C*D)&\relax\rTo^\Assl&((A*B)*C)*D\\
+\dTo^{\Id*\Assl} & & = & &\relax\uTo_{\Assl*\Id}\\
+ A*((B*C)*D) & &\relax\rTo^\Assl & & (A*(B*C))*D\\
+\end{diagram}
+This manual describes version~4 of the author's package for drawing
+diagrams line this in (plain) \TeX\ or \LaTeX.
+Version~3 is already very widely used in
+the Category Theory and Theoretical Computer Science communities.
+Most of the underlying code has been rewritten, with a great improvement to
+the appearance of the diagrams, but it remains compatible with the previously
+developed and very popular straightforward language.
+
+\section{Design Criteria}
+Drawing such a diagram using the \LaTeX\ \verb/picture/ environment%
+\ixprotect\LaTeX\index{picture environment}
+takes
+about sixty lines of code, though some saving is possible (with the positioning
+of labels on arrows) by means of some simple macro programming.
+To get the arrows to match up neatly with the objects takes quite a lot of
+experimentation, and the whole job has to be repeated with each new diagram
+or each modification.
+Again, the use of macros for commonly occurring diagrams such as squares and
+triangles can save effort, but this does not postpone the difficulty very
+far, because as soon as we want to draw a slightly more complicated diagram
+we're back to square one.
+
+The now widespread use of workstations with big screens and ``personal''
+computers has lead to a kind of religious fervour that a mouse with at most
+three buttons is always easier to use than a keyboard with maybe over a hundred.
+This might be so if the tracking software were accurate and could use telepathy
+to ascertain what the user wanted, but in reality the attempts I have seen to
+``draw it on the screen'' and include the result in a \TeX\ document have
+looked as professional as what children bring home from their first
+day at school. My view is, if you want {\em wysiwyg,} use pen and paper!%
+\index{wysiwyg}\index{mouse}
+
+Besides the awful results, mouse-driven methods take longer and are less
+portable. If you want to write a joint paper with a colleague on the other
+side of the world, it is a great deal simpler to send a single ascii file
+by electronic mail than to package twenty of them (including one file per
+diagram as well as the main text) encoded in some weird commercial binary
+format.
+
+On the basis of these remarks, the design criteria of this package are as
+follows:
+
+\begin{enumerate}
+
+\item The entire diagram must form part of the source of the document itself.
+In other words, there must be no preprocessing
+({\em cf.}~{\tt eqn} in {\sc Unix})
+or inclusion of files (such as {\sc \ix{PostScript}} pictures).
+
+\item Simple diagrams must be able to be drawn ``on the fly'' and not
+need to be drawn on paper first.
+Obviously, complex diagrams will already have been worked out on paper anyway.
+
+\item The layout of the source code must resemble the intended
+diagram as far as syntactically possible.
+
+\item There must be no \ix{measuring} of labels to calculate \ix{co-ordinates}
+or lengths of arrows.
+
+\item There must be a variety of arrow styles, with facilities for
+defining new ones.\index{arrowheads}\index{heads}\index{diagonal arrows}
+Diagonal arrows (which, through lack of appropriate primitives,
+\TeX\ makes very difficult to draw) should be provided at various
+slopes, albeit with limited choice and features.
+
+\item The package must be compatible both with {\tt plain}~\TeX\ and%
+\index{plain \protect\TeX}\ixprotect\LaTeX\
+with \LaTeX, and not rely on non-standard fonts\footnote{Diagonal lines
+can {\em only\/} be drawn using \LaTeX's {\tt line10} and {\tt linew10}
+fonts,\index{line10 and linew10 fonts}\index{AMS symbols fonts}
+and for exotic arrow styles the AMS maths symbols fonts may be
+useful: we regard these as standard.
+\person{Alan}{Jeffery}'s \ix{St.\protect~Mary Road symbols font}
+is also useful.}
+or language features.
+
+\item Future versions which improve the appearance of the diagrams
+must, as far as possible, be compatible with past papers written using the
+package --- but you hack at your own risk!
+
+\end{enumerate}
+
+\noindent In addition there are {\ae}sthetic criteria,
+some of which may be a matter of opinion:
+
+\begin{itemize}
+
+\item Arrows should \ix{stretch} to meet the objects which are intended to
+be their endpoints.
+
+\item Arrows should be aligned (both horizontally and vertically)
+with the centres of the objects.\index{aligned labels}
+
+\item Labels on arrows should not affect the spacing of the diagram
+except to avoid overlapping.\index{labels}
+
+\item Stretching of arrows should not affect the centering of their
+labels.
+
+\end{itemize}
+
+%=================================================================
+%
+% my version
+%
+%=================================================================
+
+\section{Typing the diagram}\label{typing}
+
+The diagram above is produced in \LaTeX\ixprotect\LaTeX\
+as follows:%
+\ixcmd\input\ixcmd\usepackage
+\ixcmd\diagram\ixcmd\enddiagram
+\ixcmd{\begin{diagram}}\ixcmd{\end{diagram}}%
+
+
+\vskip2ex
+
+\begin{pageblock}
+\noindent\verb/\input diagrams/\\
+\verb/\def\Assl{{\rm assl}}\def\Id{{\rm id}}/\\[-2ex]
+\begin{verbdiag}
+A*(B*(C*D))&\relax\rTo^\Assl&(A*B)*(C*D)&\relax\rTo^\Assl&((A*B)*C)*D&\\
+\relax\dTo^{\Id*\Assl}&&=&&\relax\uTo_{\Assl*\Id}&\\
+A*((B*C)*D)&&\relax\rTo^\Assl&&(A*(B*C))*D&
+\end{verbdiag}
+\end{pageblock}
+In {\tt plain} \TeX\index{plain \protect\TeX}
+you do the same thing, writing \verb/\diagram/ and
+\verb/\enddiagram/ wherever we have \verb/\begin{diagram}/ and
+\verb/\end{diagram}/.
+
+In \LaTeXe\ixprotect\LaTeXe\ you can put
+\begin{quote}
+\verb/\usepackage{diagrams}/
+\end{quote}
+in place of the \verb/\input/ command, but you have to rename or alias
+the file to \verb/diagrams.sty/.\index{diagrams.sty}\index{diagrams.tex}
+
+The basic rule is to divide the diagram into cells,
+\begin{diagram}[height=1em,width=0pt,loose,textflow]
+%&&\relax\ && \ && \ && \ \\%39
+&A*(B*(C*D))\;&&\rTo^{\qquad\Assl\qquad}&&\;(A*B)*(C*D)\;&&
+\rTo^{\qquad\Assl\qquad}&&\;((A*B)*C)*D\\%38
+\ &\HonV&&&& \rDots &&&&\HonV& \ \\%37
+\\
+&\dTo^{\Id*\Assl} &
+ \uDots && \uDots &=& \uDots && \uDots &
+ \uTo_{\Assl*\Id}\\%36
+\\
+\ &\HonV&&&& \rDots &&&&\HonV& \ \\%35
+&A*((B*C)*D) & & & & \rTo_\Assl & & & & (A*(B*C))*D \\%34
+%&& \ && \ && \ && \ \\%33
+\end{diagram}
+just like the cells of a \ix{matrix}, and then type the contents
+of the cells with columns delimited by ``{\tt\&}''\ixcmd{&} and rows by
+``\verb/\\/''.\expandafter\index{\string\\@\string\\}
+The bottom arrow extends through the \ix{empty cells} either
+side of~it. Notice that although the matrix imposes a kind of co-ordinate
+system, the widths of the columns and the heights of the rows are variable
+and chosen automatically --- by \TeX, in the same way as it does for matrices,
+tables,~{\it etc.}\index{co-ordinates}
+
+At first you will probably need to draw the diagram carefully on paper and
+divide it into cells in this way before typing it in.
+The main difficulty is working out how many \verb/&/s\ixcmd{&} to insert;
+for this it is useful to observe that {\em in the simplest cases\/}%
+ \footnote{The bottom arrow disobeys this rule, since it goes across
+ three columns.}
+\begin{itemize}\index{parity rule}
+\item objects and verticals go in odd-numbered columns, and
+\item horizontals and diagonals go in even-numbered columns.
+\end{itemize}
+Then, of course, you need an even number of \verb/&/s between columns
+of the same parity and an odd number between different ones.
+After a little practice you'll learn other rules of thumb,
+but even if you make a mistake, the DVI previewer will make it clear how
+to correct~it.
+Error messages about {\em clashing\/}\index{clashing arrows}
+or {\em unterminated\/} arrows\index{unterminated arrows} indicate
+that something is wrong without previewing.\index{error checking}
+
+Each cell should contain {\it either\/} an \ix{object} (an~ordinary
+mathematical expression, set in maths mode) {\it or\/}~a~\ix{morphism}
+(an~\ix{arrow} such as \verb/\rTo^f/). Horizontal and vertical arrows cannot
+be mixed in one cell; moreover only one horizontal arrow per cell is allowed,
+but see the section~\ref{parallels} on parallel maps below.
+
+The horizontal and vertical arrows extend through the \ix{empty cells} either
+side until they meet a non-empty cell, just like the
+rook\index{rook (chess rule)} (castle\index{castle (chess rule)})
+in chess.
+For this purpose anything other than \ix{white space} (space, tab and newline),
+comments (\verb/%/) and \verb/\empty/ in the source make a cell non-empty.
+For example \verb/\null/, \verb*/\ / or \verb/{}/\index{{}}
+may be used to terminate arrows: it's not necessary that anything be printed.
+If you don't terminate an arrow, it will extend to
+the \ix{edge of the diagram},
+but just exactly where the ``edge'' {\em is}, particularly the right one,
+will be determined somewhat arbitrarily.
+
+The \ix{chess rule} does not apply to diagonals, whose endpoints are specified
+differently: see section~\ref{diagonals}.
+
+Do not enclose the arrow commands in \ix{boxes} or \ix{braces}, because this
+prevents the automatic \ix{stretch}ing from working.
+
+The {\em horizontal\/} arrow commands
+\index{horizontal arrows} (including \verb/\pile/) \ixcmd\pile
+may also be used in \ix{text}, $A \rTo^f B$.
+Since there is no enclosing matrix, this is written
+as \verb/$A \rTo^f B$/ {\em without\/}~\verb/&/.\ixcmd{&}
+You still need the \ix{dollars}\ixcmd{$}
+because it's still a \ix{mathematical expression}.
+Arrows participate in the horizontal stretching and shrinking of spaces
+between words in a paragraph, but of course their labels also force
+the lines of the paragraph apart.
+
+The arrow commands are {\em \ix{fragile}\/} in the \LaTeX\ sense:
+if you want to use them in section headings you must \verb/\protect/%
+\ixcmd\protect\ them.
+
+
+%===========================================================================
+
+\section{Labels}
+
+Each arrow carries up to three \ix{labels}, whose position is specified
+analogously to \ix{superscripts}%
+ \footnote{However they are {\em not\/} recognised syntactically in the
+ same way, and so for instance {\tt\bsl nolimits}\ixcmd\nolimits\
+ will not work.
+ The sub- and superscript characters are recognised by their
+ {\tt\string\catcode}s, so {\tt\string\sp} and {\tt\string\sb}%
+ \ixcmd\catcode\ixcmd\sp\ixcmd\sb\ixcmd\ifx\ixcmd\ifcat\
+ will work, but the others are compared using {\tt\string\ifx},
+ so have to be the same characters, with the same {\tt\string\catcode}s
+ as when {\tt diagrams.tex} was read in.
+ \index{Sp environment}\index{Sb environment}%
+ \ixprotect\AmSTeX\ixprotect\AMSLaTeX\index{{}}\ixcmd\bgroup\ixcmd\egroup
+ The {\tt Sb} and {\tt Sp} environments
+ in \AmSTeX\space and \AMSLaTeX\space will not work, and the text of the
+ label itself must be either a single token or be explicitly enclosed in
+ {\tt\string{\string}} or {\tt\string\bgroup\string\egroup}.}
+by
+\begin{center}
+\vskip-2ex
+\verb/^/ above,\qquad \verb/_/ below,\qquad \verb/</ left,\qquad
+\verb/>/ right\qquad and\qquad \verb/~/ middle.
+\end{center}
+\ixcmd{^}\ixcmd{_}\ixcmd{~}\index{<@$<$}\index{>@$>$}%
+For reverse compatibility, above=left and below=right for vertical arrows.
+Very old versions of the package used positional arguments; these are also
+still supported, but {\em must be enclosed in braces, e.g.\/}~\verb/\rTo{f}{g}/
+but not \verb/\rTo f g/.
+
+Explicitly, the labels are placed as follows:
+\begin{itemize}
+\item for {\bf horizontal} arrows,\index{horizontal arrows}
+ \verb/\rTo^f_g/ and \verb/\rTo{f}{g}/
+ give \smash{$\mathop{\longrightarrow}\limits^f_g$};
+\item for {\bf vertical} arrows,\index{vertical arrows}
+ \verb/\dTo <f >g/, \verb/\dTo^f_g/ and
+ \verb/\dTo{f}{g}/ give $f{\big\downarrow}g$;
+\item for {\bf positive\/} gradient {\bf diagonal} arrows,%
+ \index{diagonal arrows}\index{positive gradient}\index{negative gradient}
+ \verb/\ldTo^f_g/, \verb/\ldTo <f >g/ and \verb/\ldTo{f}{g}/ all give
+ ${}^f\!\!\!\!\swarrow\!\!\!\!_g$ (similarly \verb/\ruTo/).
+\item but for {\bf negative\/} gradient arrows, above=right and below=left,
+ so \verb/\rdTo^f_g/, \verb/\rdTo <g >f/ and \verb/\rdTo{f}{g}/ give
+ ${}_g\!\!\!\searrow\!\!\!^f$ (similarly \verb/\luTo/);
+\item Using tilde, the label may instead {\bf break} the arrow: \verb/\rTo~f/
+ gives \hbox to5em{$A\rTo~{\textstyle f}B$}.\index{broken arrows}
+ If~the arrow had a middle
+ ({\em e.g.}~\verb/+/ in \verb/\rCrossedInto/, page~\pageref{crossedinto}),
+ \ixcmd\newarrowmiddle\ixcmd\rCrossedInto
+ the label would replace~it.
+ This is sometimes useful to preserve the symmetry of a diagram with three
+ verticals.
+\end{itemize}
+Although the arrows extend into adjacent cells, the labels on horizontal and
+vertical maps remain centred {\em in~the cell in which the arrow was declared.}
+
+Any ordinary (mathematical) text you put in the cell with an arrow will
+appear in the usual way:
+\begin{itemize}
+\item For horizontal arrows it will therefore be attached to the arrowhead
+ or tail.
+
+ This offers a simple way of \ix{annotating the head of an arrow},%
+ \index{arrowheads!annotating}
+ for example
+ \verb/$ A \rTo^f \relax ^* B {}_s \lTo_g C$/\quad gives
+ \begin{quote}
+ $ A \rTo^f \relax ^* B {}_s \lTo_g C$.
+ \end{quote}
+ where \verb/\relax/ is needed to stop \verb/\rTo/ from reading \verb/^*/
+ as another label and \verb/{}/ serves as an object to which $s$ is
+ subscripted.\ixcmd\relax\index{{}}
+ The spacing in this example is not entirely satisfactory, because
+ \verb/\rTo/ and \verb/\lTo/ generate the \verb/shortfall/ spacing as
+ part of themselves and regard everything else as their targets.
+ You can use \verb/\!/ and \verb/\;/ commands to compensate for this,
+ remembering that should you subsequently change the \verb/shortfall/
+ amount then you must also adjust the compensation.\index{shortfall}
+
+ An alternative way of doing this is to define a new arrow command:
+ section~\ref{newarrow} explains how.\ixcmd\newarrow
+
+ Don't make a habit of putting \verb/\relax/ after arrow commands:
+ it can lead to gaps in short double-shafted arrows, for reasons which
+ are too complicated to explain here.
+\item For vertical and diagonal arrows additional text will lie to the
+ side of (or between) the arrows.
+ In the case of verticals this is at the same height as the middle and labels
+ of the arrows; see section~\ref{parallels}.
+\end{itemize}
+
+\ixcmd\textstyle\ixcmd\displaystyle\ixcmd\scriptstyle\ixcmd\scriptscriptstyle
+\ixcmd\labelstyle\ixcmd\objectstyle
+By default the labels on the arrows are set in \verb/\textstyle/
+(the same size as in text) when they are part of a matrix, and in
+\verb/\scriptstyle/ (like subscripts) in text. However this may be changed
+using the \verb/labelstyle/ option (page~\pageref{labelstyle}).
+%This re-defines the command \verb/\labelstyle/, for instance
+\begin{quote}
+\begin{verbatim}
+\begin{displaymath}
+\begin{diagram}[labelstyle=\scriptscriptstyle]
+A &\rTo^{\sum^n_1 f_i}_{\rm scriptscript} & B
+\end{diagram}
+\qquad
+...
+\end{displaymath}
+\end{verbatim}
+\end{quote}
+\noindent gives \vadjust{\vskip-4ex}%
+\begin{displaymath}
+\hss\begin{diagram}[inline,labelstyle=\scriptscriptstyle]
+A & \rTo^{\sum^n_1 f_i}_{\rm scriptscript} & B
+\end{diagram}
+\qquad
+\begin{diagram}[inline,labelstyle=\scriptstyle]
+A & \rTo^{\sum^n_1 f_i}_{\rm script} & B
+\end{diagram}
+\qquad
+\begin{diagram}[inline,labelstyle=\textstyle]
+A & \rTo^{\sum^n_1 f_i}_{\rm text} & B
+\end{diagram}
+\qquad
+\begin{diagram}[inline,labelstyle=\displaystyle]
+A &\relax\rTo^{\sum^n_1 f_i}_{\rm display} & B
+\end{diagram}
+\hss\end{displaymath}
+Similarly, objects within a diagram are set in \verb/\displaystyle/ unless the
+\verb/objectstyle/ option is used.
+(In text, {\em e.g.}~\verb/$A \rTo B$/, the setting of the objects is
+out of the control of the diagrams package.
+Unless you have done some special programming of your own, they will
+be set in \verb/\textstyle/.)
+
+%===========================================================================
+
+\section{The Cube}\label{cube}
+The \ix{cube} offers a good example of how horizontal and \ix{vertical arrows}
+\ix{stretch}.\index{horizontal arrows}
+Notice how the cells have been sub-divided further to give the
+``3D'' effect,\index{3D effect}
+and that the positions of the labels on the maps betray
+the cells in which they were declared.
+Because of the sub-division, the \ix{parity rule} for the column in which the
+horizontal arrows go has broken down.
+You should now formulate for yourself a new rule of thumb
+for the cases when you need one, two, three or four \verb/&/s between
+two commands.\ixcmd{&}
+
+\begin{verbdiag}
+A'&&\relax\rTo^{f'}&&B'&&&\\
+&\relax\rdTo_a&&&\relax\vLine^{h'}&\relax\rdTo_b&&\\
+\relax\dTo^{g'}&&A&\relax\rTo^f&\relax\HonV&&B&\\
+&&\relax\dTo^g&&\relax\dTo&&&\\
+C'&\relax\hLine&\relax\VonH&\relax\rTo^{k'}&D'&&\relax\dTo_h&\\
+&\relax\rdTo_c&&&&\relax\rdTo_d&&\\
+&&C&&\relax\rTo^k&&D&
+\end{verbdiag}
+
+\ixcmd\HonV\ixcmd\VonH\index{broken arrows}\index{hidden lines}%
+\index{meeting lines}\index{joining lines}\index{corners}
+The broken lines ($h'$~and~$k'$) are simply two arrows. The commands
+\verb/\HonV/ (``horizontal on vertical'') and \verb/\VonH/ (``vertical
+on horizontal'') allow arrows in one direction to pass through, whilst
+obstructing arrows in the other direction as if an object were present.
+They each have an optional argument: \verb/\HonV[=]/ and \verb/\VonH[\|]/
+should be used to allow extra space for double lines.
+An~alternative is to declare the ``front'' line in the intersection cell,
+where it will have the effect of obstructing the other arrow,
+but then its label (if any) would clash with the other arrow.
+
+\ixcmd\HmeetV
+There is also a command \verb/\HmeetV/ which causes single horizontal and
+vertical lines to meet, forming a corner.
+\begin{diagram}[notextflow]
+ A' & &\rTo^{f'} & & B' \\
+ & \rdTo_a & & & \vLine^{h'}& \rdTo_b \\
+\dTo^{g'} & & A & \rTo^f & \HonV & & B \\
+ & & \dTo^g & & \dTo \\
+ C' & \hLine & \VonH & \rTo^{k'} & D' & & \dTo_h \\
+ & \rdTo_c & & & & \rdTo_d \\
+ & & C & & \rTo^k & & D \\
+\end{diagram}
+You should soon be able to read and compose the source of
+these diagrams as easily as the printed version, although one would not
+normally go to the trouble of aligning the \verb/&/s in the source code!%
+\footnote{To do so neatly in this manual required special programming: the
+{\tt verbatim} environment produced unsatisfactory results.}%
+\index{verbatim environment}
+
+%==========================================================================
+
+\section{Parallel arrows}\label{parallels}\index{parallel arrows}%
+\ixcmd\pile\ixcmd\Downarrow\ixcmd\dashv\ixcmd\puncture
+You can draw two arrows between the same two vertices,
+including extra things like \ix{2-cells} ($\Downarrow$, \verb/\Downarrow/),
+the adjoint symbol ($\dashv$, \verb/\dashv/) in between.
+\person{Peter}{Freyd}'s \verb/\puncture/ symbol is also defined in the diagrams
+package.\index{adjunction}
+
+\begin{verbdiag}
+A&\relax\pile{\rTo^f\\
+\puncture\quad\alpha \\
+\rTo_g}&B&\\
+\relax\dTo^h\dashv\uTo_k&&&\\
+C&&&
+\end{verbdiag}
+
+\vskip-4ex
+\diagram
+A & \pile{ \rTo^f \\ \puncture\quad\alpha \\ \rTo_g } & B \\
+\dTo^h \relax\dashv \uTo_k \\
+C \\
+\enddiagram
+
+{\bf Horizontal} arrows\index{horizontal arrows}\index{pilespacing}
+may be \verb/\pile/d on top of each other.
+Effectively, a one-column diagram is created, which may have {\em either\/}
+a horizontal arrow {\em or\/} an object in each row. This works both
+in diagrams and in text.
+The spacing (\verb/\baselineskip/\ixcmd\baselineskip) between the rows
+is {\em half\/} of that specified by the \verb/pilespacing/ option
+(page~\pageref{pilespacing}),
+on the assumption that you will put something
+between parallel arrows; a blank line (\verb/\\ \\/) will suffice, then
+the spacing is the same as that for vertical arrows.
+
+{\bf Vertical} arrows\index{vertical arrows}
+may simply be put together in the same cell,
+with any text between them. The spacing is always that given by
+\verb/\pilespacing/.
+(\verb/\pile/ must not be used.)
+
+{\bf Diagonal} lines.\index{diagonal arrows}
+At the moment parallel diagonal lines are not properly implemented;
+(there will be a \verb/crab/\index{crab} option for transverse movement).
+
+However the option \verb/fixed/\index{fixed} may be used to force the
+diagonals to be set on the firsr pass, as fixed (non-stretching) boxes.
+These can be juxtaposed, separated with explicit space and
+moved with \verb/\raise/ or \verb/\raisebox/ commands.
+\begin{quote}
+\verb/\raise 5pt \hbox{$\ldTo^R$}\rightthreetimes\raise-5pt\hbox{$\ruTo^L$}/
+\end{quote}
+\ixcmd\raise\ixcmd\raisebox\ixcmd\lower\index{error checking}%
+There is an error message (``you must not put arrows in \ix{braces}''),
+which warns you that this is not a satisfactory solution.
+
+%==========================================================================
+\section{Defining arrow styles}\label{newarrow}
+It is easy to define other arrows besides the basic line with arrowhead given
+by \verb/\rTo/ and friends.\index{arrowheads} For example,\ixcmd\newarrow
+
+%\vskip-3\baselineskip
+
+\ifx\twoheadrightarrow\undefined % a typical AMS symbol name
+ \let\amsarrows\empty
+\else
+ \def\amsarrows{%
+ TeXonto&----\{->>\}&\rTeXonto\cr
+ }%
+ \ixcmd\rTeXonto
+\fi
+
+\ifhavegoodboldmath
+ \def\boldarrows{CrossedInto&\{boldhook\}-+->&
+ %\showboxdepth999 \showboxbreadth 999 \tracingonline 1
+ %\tracingcommands1 \tracingmacros1
+ \rCrossedInto
+ %\showlists
+ \cr}%
+ \newarrow{CrossedInto}{boldhook}-+->
+\else
+ \def\boldarrows{CrossedInto&C-+->&\rCrossedInto\cr}%
+ \newarrow{CrossedInto}C-+->
+\fi
+
+\ixcmd\rTo\ixcmd\rLine\ixcmd\rEmbed\ixcmd\rOnto\ixcmd\rEEmbedd
+\ixcmd\rDotsto\ixcmd\rDashto\ixcmd\rCorresponds\ixcmd\rImplies
+\ixcmd\rMapsto\ixcmd\rInto\ixcmd\rOpeninto\ixcmd\rCongruent
+\ixcmd\rTeXto\ixcmd\rBackwards\ixcmd\rMulti\ixcmd\rCrossto
+\ixcmd\rPartial\ixcmd\rCrossedInto
+\index{>@$>$ arrowhead}\index{-- filler}\index{>>@$\gg$ arrowhead}
+\index{. filler}%
+\index{dash filler}\index{| tail}\index{O arrowheads}\index{x arrowheads}%
+\index{harpoon arrowhead}\index{triangle arrowheads}\index{3 filler}%
+\index{hook tail}\index{C tail}\index{boldhook tail}%
+
+\begin{quote}\leavevmode\label{crossedinto}
+\vbox{\halign{\tt\string\newarrow\kern2pt\{#\}\kern2pt\hfil&\tt#\quad\hfil&%
+ $#$\cr\omit&&\omit\kern80pt\cr
+ To&---->&\rTo\cr
+ Line&-----&\rLine\cr
+ Embed&>--->&\rEmbed\cr
+ Onto&----\{>>\}&\rOnto\cr
+ EEmbedd&\{>>\}---\{>>\}&\rEEmbedd\cr
+ Dotsto&....>&\rDotsto\cr
+ Dashto&\{\}\{dash\}\{\}\{dash\}>&\rDashto\cr
+ Corresponds&<--->&\rCorresponds\cr
+ \boldarrows
+ Implies&====\{=>\}&\rImplies\cr
+ Mapsto&|--->&\rMapsto\cr
+ Into&C--->&\rInto\cr
+ Openinto&\{triangle\}--->&\rOpeninto\cr
+ Congruent&33333&\rCongruent\cr
+ TeXto&----\{->\}&\rTeXto\cr
+ Backwards&<----&\rBackwards\cr
+ Multi&----o&\rMulti\cr
+ Crossto&----X&\rCrossto\cr
+ Partial&----\{harpoon\}&\rPartial\cr
+ \amsarrows
+}}\end{quote}
+\noindent Note that the
+\ixcmd\rightharpoonhown\ixcmd\twoheadrightarrow\ixcmd\rightarrow
+\ixcmd\Rightarrow\ixcmd\boldmath
+\index{->>@\protect\verb/->>/ arrowhead}%
+\index{->@\protect\verb/->/ arrowhead}%
+\index{littlevee arrowheads}\index{boldlittlevee arrowheads}%
+\ifx\twoheadrightarrow\undefined\else\verb/{->>}/, \fi
+\verb/{harpoon}/, \verb/{->}/ and \verb/{=>}/ heads
+use \TeX's \verb/\rightharpoondown/ ($\rightharpoondown$), \verb/\rightarrow/
+($\rightarrow$) and \verb/\Rightarrow/ ($\Rightarrow$) symbols, consisting
+of heads {\em with shafts.}
+\ifhavegoodboldmath
+ Also, the \verb/boldbook/ tail uses \LaTeX's \verb/\boldmath/:
+\else
+ There is also a \verb/boldhook/ tail, which is not shown because the
+ appropriate fonts were not available when this copy of the manual
+ was printed:
+\fi
+please see the note about \verb/heads=littlevee/
+on page~\pageref{heads option}.
+The \verb/hook/ and \verb/C/ tails are the same.
+
+Each declaration\ixcmd\newarrow
+\index{north (east, west)}\index{south (east, west)}\index{east}\index{west}%
+\index{compass}\index{left}\index{right}\index{up}\index{down}
+\begin{center}
+\verb/\newarrow{/{\em Name\/}\verb/}{/{\em tail\/}\verb/}{/{\em filler\/}%
+\verb/}{/{\em middle\/}\verb/}{/{\em filler\/}\verb/}{/{\em head\/}\verb/}/
+\end{center}
+defines eight arrow commands
+$$\vcenter{\advance\hsize-2.5\baselineskip\advance\hsize-6em
+ \halign{\tt\bsl#\it Name\quad\hfil&#\hfil\quad or\quad&#\hfil\cr
+ r&right&east\cr
+ l&left&west\cr
+ d&down&south\cr
+ u&up&north\cr
+ ru&right \& up&northeast\cr
+ rd&right \& down&southeast\cr
+ lu&left \& up&northwest\cr
+ ld&left \& down&southwest\cr
+}}\qquad\qquad
+ \begin{diagram}[vcentre,inline,size=1.75\baselineskip,abut,shortfall=4pt]
+ \hbox{\tt lu}&&\hbox{\tt u}&&\hbox{\tt ru}\\
+ &\luTo[lowershortfall=2pt]&\uTo[lowershortfall=2pt]&
+ \ruTo[lowershortfall=2pt]\\
+ \hbox{\tt l}&\lTo[rightshortfall=2pt]&\vcenter{}&\rTo[leftshortfall=2pt]&
+ \hbox{\tt r}\\
+ &\ldTo[uppershortfall=2pt]&\dTo[uppershortfall=2pt]&
+ \rdTo[uppershortfall=2pt]\\
+ \hbox{\tt ld}&&\hbox{\tt d}&&\hbox{\tt rd}
+ \end{diagram}$$
+from the five named components.
+
+\ixcmd\isomorphic\ixcmd\cong
+Some but not all of the names given in the examples above are defined in the
+source of the package as distributed.
+However this is only really intended for reverse compatibility, because
+just as it is better to define a macro \verb/\isomorphic/ for the
+symbol $\cong$ (if that is what you use it to mean) than to write
+\verb/\cong/ in your documents, so it is advisable to define the arrow
+command names in the file where you keep your private collection of symbols.
+
+\ixcmd\rEmbed\ixcmd\rInto\ixcmd\rOpeninto\ixcmd\rImmerse\ixcmd\rInclude
+\ixcmd\rInternalise
+For example, if in your subject there are special kinds of functions known
+standardly as immersions, inclusions and internalisations and written as
+$\rInto$, $\rEmbed$ and $\rOpeninto$, then you should define
+\verb/\rImmerse/, \verb/\rInclude/ and \verb/\rInternalise/ instead of
+using the names \verb/\rInto/, \verb/\rEmbed/ and \verb/\rOpeninto/.
+The motto is {\em what you see is what you mean\/}!
+This avoids remembering or getting confused about the so-called
+standard macro names, and also enables you to change your mind about the
+notation if it is not standard but subject to experimentation.
+
+\ixcmd\newarrowhead\ixcmd\newarrowtail\ixcmd\newarrowmiddle
+\ixcmd\newarrowfiller
+The components as given in the \verb/\newarrow/ command are mnemonics,
+which are themselves defined using the commands
+\begin{center}
+\verb/\newarrowhead/, \verb/\newarrowtail/, \verb/\newarrowfiller/
+and \verb/\newarrowmiddle/.
+\end{center}
+Most of the characters in the standard \TeX\ \ix{Computer Modern fonts} which
+are appropriate for these components have already been used in the package
+and are illustrated above.
+If you wish to define other components, the examples at the end of the
+source show how to do this.
+If you are doing this with publicly available fonts, please contribute
+them for the benefit of other users by sending the definitions to me by
+electronic mail.
+It is in your interests to do so --- and to confine use of these four
+component-declaration commands to a single macro file --- because a more
+elaborate syntax may be used in future to facilitate adjustment of
+positioning. The \verb/\newarrow/ command itself, however, will remain
+as it is.
+
+\index{>@$>$ arrowhead}\index{>>@$\gg$ arrowhead}%
+\index{heads}\index{arrowheads}\index{+ arrowhead}\index{x arrowheads}%
+\index{O arrowheads}%
+\ixcmd\rBackwards\ixprotect{\LaTeX\ arrowheads}%
+The components \verb/>/, \verb/{>>}/, \verb/</, \verb/{<<}/, \verb/x/,
+\verb/+/, \verb/O/ and \verb/o/ can be used both as heads (fifth position)
+and \ix{tails} (first).
+The declaration \verb/<----/ defines \verb/\rBackwards/ to be a left-ward
+pointing arrow and \verb/\lBackwards/ to point right;
+this is not recommended, as you're certain to get confused.
+We shall see in the next section how to change the style of the four
+arrowhead components in a systematic way, thereby avoiding the ugly mixture
+of vee and \LaTeX\ arrowheads obtained using earlier versions of this package.
+
+\ixcmd\newarrow
+In some of the examples above (with the dot and rule fillers) the filler was
+repeated as the middle and one or both of the tips, whereas with others
+(dash) we used empty middle and tips instead.
+This was just to make the definitions easier to type: \verb/\newarrow/
+treats middles and tips which agree with the fillers as empty ones.
+It is possible to use two different fillers, but this is not recommended.
+
+\ixcmd\HorizontalMap\ixcmd\VerticalMap\ixcmd\DiagonalMap
+The commands \verb/\HorizontalMap/ and \verb/\VerticalMap/ are still
+supported, but should be replaced by \verb/\newarrow/.
+These ought only to have been used in macro files --- not in the text of
+documents --- to define four arrow commands together (right, left, up and down).
+The twenty arguments defining the five components of each of these four
+arrows can (if they're not already provided) be re-arranged as the four
+arguments of each of five \verb/\newarrowhead/, {\em etc.,} declarations
+with the same effect.
+The mnemonics of the five components are then given to \verb/\newarrow/.
+If~you have any difficulty doing this conversion, please contact me.
+
+
+%==========================================================================
+
+\section{Options}\label{options}\index{options}
+\ixcmd\diagram\ixcmd{\begin{diagram}}\ixcmd\diagramstyle\ixcmd\usepackage
+\ixprotect\LaTeX\ixprotect\LaTeXe
+The \verb/\diagram/ or \verb/\begin{diagram}/ command and the arrow
+commands may be followed by a list of options in square brackets, for example
+\begin{center}
+\verb/\begin{diagram}[size=2em,textflow]/ \qquad \verb/\rTo[abut]/
+\end{center}
+which apply to the diagram or arrow to which they are attached.
+Options may be given for an entire document, or within \TeX's normal
+scoping rules, by a stand-alone command such as
+\begin{center}
+\verb/\diagramstyle[centredisplay,PostScript=dvips]/
+\end{center}
+You may use any number of \verb/\diagramstyle/ commands.
+In \LaTeXe\ these options can be given when loading:
+\begin{center}
+\verb/\usepackage[centredisplay,PostScript=dvips]{diagrams}/
+\end{center}
+though you should avoid using macros in the option values
+(see page~\pageref{miss endcs}).
+
+{\bf Note:} if the text of the first cell in a diagram begins with a
+square bracket, the program will attempt to read it as an option, just
+as square brackets within \LaTeX\ \verb/array/s can cause trouble.
+This usually leads to a catastrophic
+error, which can be avoided using \verb/\diagramstyle[nooptions]/.%
+\index{nooptions}\index{{}[]}\ixcmd{\begin{diagram}}
+This problem doesn't arise in \LaTeX\ if you use \verb/\begin{diagram}/
+followed by a (space or) new line before the text of the diagram.
+
+Some options take a value, using an equals sign; those enclosed in square
+brackets below are optional, the others mandatory.
+Most of the options are appropriate for diagrams rather than arrows.
+
+\def\coordpair{{\rm($x$,$y$)}}
+
+\begin{description}
+\def\makelabel#1{{\tt#1} --- }
+\item[abut] Leave no gap between maps and objects; useful for (``Hasse'')
+ diagrams displaying order structures (page~\pageref{Hasse}).%
+ \index{abut}\index{posets}\index{Hasse diagrams}\index{order structures}%
+ \index{lattices}\index{shortfall}
+\item[alignlabels] The \ix{labels} on horizontal arrows remain centred in the
+ cells where they are defined, despite different size endpoints;
+ {\em cf.} \verb/midshaft/.\index{midshaft}\index{aligned labels}
+ This is the default, and it is recommended for diagrams of a regular
+ character.
+ If there is insufficient space to position the labels in this way, they
+ are centred (automatically and silently) instead.
+ Whichever option is used, the middle of the arrow, if present, is always
+ positioned with the labels.
+\item[amstex] Enable recognition of \AmSTeX's commutative diagram commands;
+ see section~\ref{emulate}.\ixprotect\AmSTeX\index{amscd.sty}
+\item[balance] The whole diagram is centred horizontally without regard to
+ the left- and rightmost labels,
+ so that its weight lies in the middle of the page.
+ This is not the default, because if you were not aware of it the gaps
+ would come as a surprise, but it is recommended.%
+ \index{balance}\index{centre}
+\item[bottom] When the diagram is placed alongside some simple text,
+ the baseline of that text is aligned with that of the bottom row of the
+ diagram.\index{bottom}
+\item[centre {\em or\/} center] The diagram is centred%
+ \footnote{Notice that I have provided the ``-er'' alternative as a
+ courtesy to American users which \person{Donald}{Knuth}
+ and \person{Leslie}{Lamport} did not afford to British ones.}
+ na\"{\i}vely, using \verb/nobalance/ and \verb/vcentre/;
+ {\em cf.}~\verb/middle/.\index{nobalance}\ixcmd\vcenter\index{centre}
+\item[centredisplay {\em or\/} centerdisplay] Disables \verb/flushleft/,
+ enables \verb/balance/ and gives a warning when used within \verb/$$...$$/
+ (see below).\index{flush left}\ixcmd{$$}
+\item[cmex] Set the arrow parts appropriately for use of the \verb/cmex/
+ (Computer Modern \ix{extension font})\index{Computer Modern fonts};
+ used by the \ix{brace} and \ix{paretheses} arrows.\index{cmex}
+%\item[defaultsize]
+\item[diagonalbase=\coordpair] Start \ix{diagonal arrows} from
+ $x$~columns beyond (left or right depending on the direction)
+ and $y$~rows above the current cell. Default (1,1).
+ Intended for emulation of other diagrams packages:
+ see section~\ref{emulate}.
+%\item[displayoneliner] Disables \verb/inlineoneliner/.
+\item[dotted] Use \ix{dots} instead of a ruled line for arrow shafts.
+ Useful for mediators for \ix{universal properties} in category theory.
+\item[dpi={\em resolution\/}] Anticipate the output resolution in pixels per
+ inch (default 300). A~fudge factor is applied to horizontal and vertical
+ ruled lines, without which pixel rounding at 300dpi would cause the
+ {\em bottom\/} rather than the middle of the horizontal rule to align
+ with the cusp of the \ix{vee arrowheads}:\index{dpi}
+ compare $\rTo[heads=vee]$ and $\rTo[nopixel,heads=vee]$.
+ Other similar adjustments may also be made to character positioning,
+ and to the slopes of diagonals in PostScript mode to avoid ``stepping.''
+ Most office laser printers are 300dpi, but if you intend to use a printer
+ of a different resolution for your final output, set {\tt dpi=1270} or
+ whatever --- otherwise the shafts will be too low instead. The same applies
+ if you intend to magnify or reduce; for example {\tt dpi=212} should be
+ used for two-up or \ix{A4-on-A5} final printing.
+ In \verb/plain/ \TeX\ you may set \verb/\magnification/ at the beginning
+ of the file, but {\em do not\/} change \verb/dpi/ as this compensates
+ automatically.
+ The \verb/nopixel/ option disables the fudge factor.%
+ \ixcmd\magnification\index{pixel size}\index{300 dpi}\index{resolution}
+\item[dpm={\em resolution\/}] As {\tt dpi} but in dots per metre; {\em e.g.}
+ 1270dpi=50000dpm.
+\item[eqno={\em label\/}] Place {\em label\/} (in maths mode) beside the
+ diagram, as an \ix{equation number}.
+ See also \verb/LaTeXeqno/.
+\item[fixed] Force diagonal arrows to be set on the first pass and not
+ stretched.
+\item[flushleft{[={\em width\/}]}] The old version of \verb/leftflush/.
+ The alignment is on the edge of the grid, irrespective of
+ what vertical maps are present
+ (this makes the diagram stick out on the left with no good visual reason).
+ \index{indented style}\index{asymmetric design}
+\item[grid={\em name\/}] Use the \ix{grid} {\em name}.
+ See page~\pageref{grid}.\ixcmd\newdiagramgrid
+\item[gridx={\em name\/}] Use the grid with the horizontal and vertical
+ components interchanged.
+\item[h={\em distance\/}] Same as \verb/height/.\index{height}\index{size}
+\item[hcentre {\em or\/} hcenter] Same as \verb/nobalance/.%
+ \index{balance}\index{centre}
+\item[heads={\em name\/}]\label{heads option}
+ Set the \verb/>/ and \verb/{>>}/ arrow heads
+ and tails to those defined by \verb/\newarrowhead{/{\em name\/}\verb/}/ and
+ \verb/\newarrowtail{/{\em name\/}\verb/}/.
+ \index{arrowheads}\index{heads}\ixcmd\newarrowhead\ixcmd\newarrowtail
+ \index{line10 and linew10 fonts}\ixprotect{\LaTeX\ arrowheads}%
+ \index{vee arrowheads}\index{littlevee arrowheads}\index{O arrowheads}%
+ \index{boldlittlevee arrowheads}\index{triangle arrowheads}%
+ \index{x arrowheads}\index{curlyvee arrowheads}%
+ \index{blacktriangle arrowheads}\index{littleblack arrowheads}%
+ \index{AMS symbols fonts}\ixcmd\boldmath
+ The following styles are currently available:
+ \message{(There may follow a warning message about LaTeX diagonals
+ - please ignore it.)}%
+ \begin{quote}
+ \ifx\twoheadrightarrow\undefined\else\def\amsarrows{%
+ \dohead{curlyvee}(uses AMS symbols)\cr
+ \dohead{blacktriangle}(uses AMS symbols)\cr
+ \dohead{littleblack}(uses AMS symbols)\cr
+ }\fi
+ \ifhavegoodboldmath\def\boldarrows{%
+ \dohead{boldlittlevee}(uses {\tt\string\boldmath})\cr
+ }\else\let\boldarrows\empty\fi
+ \diagramstyle[l>=50pt]\leavevmode
+ \def\dohead#1{\tt#1\quad&\relax
+ \csname diagramstyle\endcsname[heads=#1]$\rEmbed\quad\rEEmbedd$&\quad}
+ \vbox{\halign{#&#&#\hfil\cr&\omit\kern100pt\cr
+ \dohead{LaTeX}(default; uses {\tt line10})\cr
+ \dohead{vee}\cr
+ \dohead{littlevee}\cr
+ \boldarrows
+ \dohead{triangle}\cr
+ \dohead{o}\cr
+ \dohead{O}\cr
+ \dohead{X}\cr
+ \dohead{+}\cr
+ \amsarrows
+ }}\end{quote}
+ \ifx\twoheadrightarrow\undefined
+ There are also heads called
+ \verb/curlyvee/, \verb/blacktriangle/ and \verb/littleblack/,
+ but these require the AMS symbols fonts, which were unfortunately
+ not available when this copy of the manual was printed.
+ If~you try to use them
+ \else
+ The vertical \verb/curlyvee/ heads come from the AMS symbols, and
+ the horizontals, from \verb/cmsy/ in the \ix{Computer Modern fonts},
+ seem appear to be slightly mis-aligned with the \verb/vee/ heads
+ from \verb/cmmi/.
+ If~you use them but forget to
+ \ifx\usepackage\undefined
+ \verb/\input mssymb/,
+ \else
+ \verb/\usepackage{amssymb}/,
+ \fi
+ \fi
+ \index{undefined control sequence}\index{cmsy}\index{amssymb.sty}%
+ you'll get an ``{\tt undefined control sequence}'' error in the middle of
+ a lot of garbage (deeply nested): hit return several times and carry on.
+
+ The \verb/boldlittlevee/ heads \ifhavegoodboldmath\else(not shown above) \fi
+ rely on \LaTeX's \verb/\boldmath/ command, and default to \verb/littlevee/
+ in \verb/plain/ \TeX.\index{plain \protect\TeX}\ixprotect{\LaTeX 2.09}
+ They~may not work correctly if you use \person{Leslie}{Lamport}'s old
+ \LaTeX2.09 \ix{font selection}.
+ Even if you use \person{Frank}{Mittelbach} and \person{Rainer}{Sch\"opf}'s
+ new one (which is part of \LaTeXe\ixprotect\LaTeXe) some \ix{PK files}
+ \ifhavegoodboldmath
+ which are not in the standard distribution may be needed.
+ \else
+ are needed which were not available when this copy of the manual
+ was printed.
+ \fi
+ It~is only intended for final copy in the event that the \verb/littlevee/
+ appears too feint. The same applies to the \verb/boldhook/ tails.
+\item[height={\em distance\/}] The distance between the baselines of
+ successive rows in the diagram is as specified. Note that as objects and
+ arrows commonly alternate, this is usually half the distance between
+ one horizontal arrow and the next.\index{height}\index{size}
+\item[hmiddle] Same as \verb/balance/.\index{balance}\index{centre}
+\item[hug] If \verb/PostScript/ is enabled, rotate labels on %vertical and
+ diagonal maps. %The text then runs {\em up\/} the verticals.
+ (Not yet implemented --- in fact the \verb/PostScript/ option currently
+ {\em always\/} does this to diagonals, but not to verticals.
+\item[htriangleheight={\em distance\/}] Set \verb/height/={\em distance\/}
+ and then \verb/width/ in such a way that the minimal $3\times5$-grid
+ will make an equilateral $\triangleright$ \ix{triangle},
+ and a $5\times7$-grid makes a regular \ix{hexagon} (page~\pageref{hexagon}).
+ If~the {\em distance\/} is not specified, the existing \verb/height/
+ is used and the \verb/width/ adjusted accordingly.
+\item[htrianglewidth={\em distance\/}] Set \verb/width/={\em distance\/}
+ and then \verb/height/ to make these figures.
+\item[inline] Use this option on individual diagrams which are being displayed
+ alongside one another, for example in \verb/$$/...\verb/$$/ or \LaTeX's
+ \verb/center/ or \verb/displaymath/ environments, when the global display
+ option is \verb/flushleft/ or \verb/centredisplay/.\index{in line}%
+ \index{flush left}\index{displaymath environment}\index{center environment}
+%\item[inlineoneliner] If the diagram has only one row, run it on in the text
+% instead of displaying~it. (This is highly questionable.)
+\item[l>={\em distance\/}] Forces arrows (particularly horizontals and
+ rotated diagonals) to have at least the specified length (default 2em),
+ to avoid getting \ix{birds' feet} instead of arrows:
+ \hbox to2.8em{$A\rTo[l>=0pt,heads=vee]B$}.
+ Sometimes this makes the arrow \ix{over-print} an object or appear displaced;
+ in this case you'll see an ``over-full \verb/\hbox/'' or ``increase
+ cell \ix{width}'' error message.\index{over-full hbox}
+\item[labelstyle={\em command\/}]\label{labelstyle}
+ Inserts this command in every label
+ text;\ixcmd\scriptstyle\index{labels}
+ \verb/\scriptstyle/ is the commonest choice apart from the default.
+\item[landscape] If \verb/PostScript/ is enabled, rotate the entire diagram
+ by $90^\circ$ anticlockwise.\index{landscape}\index{PostScript}
+ Options which refer to the extreme rows and columns are modified
+ accordingly. Useful for big diagrams with long objects or labels.%
+ \index{rotation}
+\item[large] Same as \verb/size=5em/.\index{size}\index{large}
+\item[LaTeXeqno] Use \LaTeX's running \verb/equation/ numbering
+ for an \verb/eqno/ (\emph{q.v.}).\index{equation number}
+ You can put a \LaTeX\ \verb/\label/ inside the diagram.\ixcmd{label}
+\item[lefteqno] Place the \ix{equation number}, as given by \verb/eqno/, on the
+ left of the diagram.
+\item[leftflush{[={\em width\/}]}]
+ Display the diagram on the left of the page instead of the centre,
+ {\em cf.} \verb/fleqn.sty/.\index{flush left}\index{fleqn.sty}
+ This is considered good \ix{book design} by certain publishers.
+ If {\em width\/} is given, the leftmost vertical of the diagram is,
+ if possible, aligned at that distance from the left edge of the page.
+ The idea is that the arrows, rather than the text, define the
+ visual extent of the diagram.
+ If the first column contains multiple verticals, the leftmost
+ of them is used for the alignment.
+ If there are no verticals in the leftmost column, the alignment
+ is on the left extremity of the text.
+ \index{indented style}\index{asymmetric design}
+\item[leftshortfall={\em distance\/}] The gap between the arrow (to which it
+ is applied individually) and the object on its left is as specified.%
+ \index{short fall}
+%\item[locate=$x$:$y$] Move the origin of the diagonals. Not yet implemented.
+\item[lowershortfall={\em distance\/}] Similarly below.
+\item[loose] The rows and columns of the diagram have {\em at least\/} the
+ \verb/height/ and \verb/width/ specified, but may stretch, in the same
+ way as those of an array or table.
+ This is the default, because the results are more of less right in most
+ circumstances, but this can result in gaps in the diagram, so it is
+ recommended that \verb/tight/ be used in the final version of a document,
+ with appropriate manual adjustment of the size of the grid.%
+ \index{tight}\index{loose}\index{width}
+\item[middle] The diagram is centred both horizontally
+ using \verb/balance/ and vertically using \verb/vmiddle/, {\em q.v.}%
+ \index{middle}\index{centre}\index{balance}
+\item[midhshaft {\em or\/} midshaft] Labels are centred in the shafts of
+ horizontal arrows; {\em cf.} \verb/alignlabels/.%
+ \index{aligned labels}\index{midshaft}
+ This happens automatically for in-text or one-line diagrams,
+ or if the arrow is too short to align the labels.
+%\item[midvshaft] The same for vertical arrows (doesn't work).
+%\item[missives] Enable missives.
+\item[moreoptions] Allow another list of \ix{options} in square brackets.
+ This is intended for macros like
+ %\begin{center}
+ \verb/\def\funnydiagram{\diagram[/{\em options\/}\verb/,moreoptions]}/
+ %\end{center}
+ to allow \verb/\funnydiagram[/{\em options\/}\verb/]/.
+ The arrow commands always allow any number of lists of options.
+\item[nobalance] Horizontal centring of diagrams is done with respect to the
+ extremities.\index{balance}
+\item[nohcheck] Disables certain \ix{error checking}.
+\item[nohug] Do not rotate the labels on vertical and diagonal maps, but
+ print them horizontally.
+ (Not yet implemented --- in fact the \verb/PostScript/ option currently
+ {\em always\/} rotates labels on diagonals, but not on verticals.
+\item[nooptions] Used in \verb/\diagramstyle/, this disables the parsing
+ of \ix{options}. \ixcmd\diagramstyle
+ This is for reverse compatibility in the case where several diagrams
+ begin with a square bracket.
+\item[noorigin] Disables \verb/origin/ and \verb/balance/.%
+ \index{balance}\index{origin}
+\item[nopixel] Disable the \verb/dpi/ fudge factor, {\em q.v.}, by setting
+ a very high resolution.\index{pixel size}
+\item[noPostScript] Disables the use of embedded {\sc \ix{PostScript}}
+ {\em and\/} the \verb/PS/ and \verb/noPS/ options.
+ The value, if any, is ignored, so you need only edit in/out the prefix
+ \verb/no/ whilst leaving the choice of {\sc PostScript} translator intact.
+\item[noPS] Disable {\sc PostScript} on individual maps and diagrams.
+\item[notextflow] Disables \verb/textflow/. This is needed on some individual
+ diagrams (where they appear as nouns in a sentence, for instance) when you
+ use \verb/\diagramstyle[textflow]/.\index{text flow}
+\item[noTPIC] Disable the use of TPIC \verb/\special/s.%
+ \index{TPIC}\ixcmd\special
+\item[objectstyle={\em command\/}] Inserts this command in every \ix{object}
+ text; \ixcmd\scriptstyle
+ \verb/\scriptstyle/ is the commonest choice apart from the default.
+\item[origin] Makes the width, height and depth of the whole diagram zero,
+ locating it at the baseline of the bottom row, in the centre of the leftmost
+ column.
+ This allows it to be positioned by the user; useful for mixing diagrams with
+ \LaTeX\ pictures and other graphics.
+ \index{origin}\index{picture environment}\ixprotect\LaTeX
+\item[p={\em distance or\/} pilespacing={\em distance\/}] Set the distance
+ between parallel verticals (in the same cell); that between the rows of a
+ \verb/\pile/ is half of this to allow things to be put between parallel
+ horizontals.\index{parallel arrows}\ixcmd\pile\label{pilespacing}
+\item[pixelsize={\em distance\/}] Anticipate this output resolution;
+ {\tt pixelsize=.02true mm} is the same as {\tt dpi=1270} or {\tt dpm=50000}.%
+ \index{pixel size}
+\item[portrait] Disable the \verb/landscape/ option,
+ {\em q.v.}\index{landscape}\index{portrait}
+\item[PostScript={\em author\/}]\label{PS}
+ Enable the use of embedded \ix{Adobe}
+ {\sc \ix{PostScript}} \verb/\special/ commands in a form supported by
+ {\em author\/}'s translator.
+ The following are currently recognised by the {\em author\/}s' surnames,
+ their programs or their companies.
+ The surname is the preferable form, since the programs have very similar
+ names.
+ The master \ix{FTP} source is also given.\index{anonymous FTP}
+ \begin{itemize}
+ \item (Tomas) \verb/Rokicki/, \verb/dvips/, \verb/RadicalEye/:
+ labrea.stanford.edu /pub/dvips9999.tar.Z%
+ \index{Rokicki, Tomas}\index{dvips}\index{Radical Eye}
+ \item (Stephan) \verb/Bechtolsheim/, \verb/dvitps/,
+ \verb/IntegratedComputerSystems/:\\
+ arthur.cs.purdue.edu /pub/TeXPS-9.99.tar.Z%
+ \index{Bechtolsheim, Stephen}\index{Integrated Computer Systems}%
+ \index{dvitps}
+ \item (James) \verb/Clark/, \verb/dvitops/\index{Clark, James}\index{dvitops}
+ \end{itemize}
+ These are currently used to implement diagonals by rotating horizontals.
+ It is not possible to use \person{Andrew}{Trevorrow}'s Oz\TeX.%
+ \index{oztex@Oz\protect\TeX}
+\item[PS] Suppose you want to use {\sc \ix{PostScript}} for some but not all
+ maps and diagrams in the final version. Then use \verb/PS/ for each of them
+ but put \verb/\diagramstyle{noPostScript}/ in the preamble during drafting.
+\item[repositionpullbacks] The \ix{pullback} symbols
+ have a fixed position relative to the cell, irrespectively of
+ where you put the \verb/\SEpbk/ {\em etc}.~command.
+\item[righteqno] Put the \ix{equation number} (\verb/eqno/), if any,
+ on the right.
+\item[rightshortfall={\em distance\/}] Analogous to \verb/leftshortfall/.%
+ \index{short fall}
+\item[ruleaxis] Set the height of the shaft of the horizontal arrows;
+ normally \verb/\mathaxis/.
+ \index{ruleaxis}\index{horizontal arrow}\ixcmd\mathaxis
+\item[s={\em distance\/}] Same as \verb/size/.\index{size}
+\item[scriptlabels] Labels on maps are set in \verb/\scriptstyle/; useful
+ if they're rather long.
+\item[shortfall={\em distance\/}] Set the gap between arrows and the objects
+ to which they point.\index{short fall}
+%\item[showpair=\coordpair] Debug
+\item[silent] Suppress \ix{warnings} and second-pass \ix{error messages}.
+ Only use this option if either you don't care what the diagram looks like
+ or you've typeset it and looked at the result already. Not recommended.
+ \index{silent}
+\item[size={\em distance\/}] Set both \verb/height=/{\em distance\/} and
+ \verb/width=/{\em distance}.\index{size}
+ \begin{center}
+ {\bf Most geometrical problems with diagrams can be solved by enlarging
+ the cells.} Please try this and the \verb/tight/ option before contacting me.
+ \end{center}
+\item[small] Same as \verb/size=2em/.\index{size}
+\item[textflow] The text which follows the diagram in the \TeX\ source is
+ brought up to fill out the line preceding it; useful to avoid the
+ ``such that the diagram $\clubsuit$ commutes'' clich\'e.
+ This has been used for several diagrams in this manual.\index{text flow}
+\item[thick{[={\em breadth\/}]}] As \LaTeX\ \verb/\thicklines/, optionally
+ setting the width of orthogonal ruled lines. The \LaTeX\ command itself has
+ no effect within diagrams. The default rule breadth is twice that for the
+ \verb/thin/ option.\ixcmd\thicklines
+\item[thin{[={\em breadth\/}]}] This is similarly analogous to
+ \verb/\thinlines/.\ixcmd\thinlines
+ The default rule breadth is the same as that used by \TeX, namely
+ \verb/\fontdimen8\textfont3/.
+\item[tight] Force all of the cells in the grid to have exactly the \ix{size}
+ you specify.\index{tight}\index{height}\index{width}\index{loose}
+ This is recommended for the final version of a document, but
+ is not the default because it may cause \ix{over-print}ing,
+ which requires the intervention of the user to cure
+ (by setting \verb/height/ and \verb/width/); {\em cf.} \verb/loose/.
+\item[top] Analogous to \verb/bottom/, except that the top row is used.
+\item[TPIC] Use \ix{TPIC} \verb/\special/ commands instead of \LaTeX\ line
+ segments to draw diagonal lines.
+ These are supported by {\sc Textures}, \person{Tomas}{Rokicki}'s
+ \verb/dvips/ and \person{Paul}{Vojta}'s \verb/xdvi/.%
+ \ixcmd\special\index{xdvi}\index{dvips}
+\item[uppershortfall={\em distance\/}] Analogous to \verb/leftshortfall/,
+ except above.\index{short fall}
+\item[vcentre {\em or\/} vcenter] Vertical positioning is the same as with
+ \TeX's \verb/\vcenter/\ixcmd\vcenter\ixcmd{[c]}\index{centre}
+ command or \LaTeX's \verb/[c]/ option.
+ However \verb/vmiddle/ is what is usually wanted.
+\item[vmiddle] If a diagram with an odd number of rows of constant height
+ (the usual case) is placed alongside some simple text,
+ the baseline of the text will be aligned
+ with that of the middle row, irrespectively of the height and depth of the
+ labels on the top and bottom rows.
+ In general, the baseline of the diagram is half-way between those of the
+ top and bottom rows.\index{centre}
+\item[vtriangleheight={\em distance\/}] Set \verb/height/={\em distance\/}
+ and then \verb/width/ in such a way that the minimal $5\times3$-grid
+ will make an equilateral $\bigtriangleup$ \ix{triangle}
+ and a $9\times 5$-grid makes a regular \ix{hexagon} (page~\pageref{hexagon}).
+ \index{width}\index{height}
+\item[vtrianglewidth={\em distance\/}] Set \verb/width/={\em distance\/}
+ and then \verb/height/ to make these figures.
+\item[w={\em distance or\/} width={\em distance\/}] Set the distance between
+ the centre of one column and the next to the right.\index{width}
+\end{description}
+
+
+%==========================================================================
+
+\section{Application to adjunctions}
+Here is a side application of commutative diagrams to displaying
+``adjoint correspondences.'' It also illustrates the way arrows
+stretch to meet their endpoints but keep their labels centred in
+the column of arrows. The options are chosen to avoid getting
+lots of extra space around the cells, which in this case we don't want.
+Notice also the invisible ``objects'' terminating the \verb/\hLine/
+``morphism'' command.\index{adjunction}
+
+\ixcmd\hLine\ixcmd\dashv\index{empty cells}\index{invisible objects}
+
+\begin{verbdiag}[loose,height=.8em,width=0pt]
+&Z\times X&\relax\rTo^f&Y&\\
+\relax\ &&\relax\hLine&&\relax\ &\\
+&Z&\relax\rTo^{{\bf curry}(f)}&Y^X&
+\end{verbdiag}
+
+\vskip-6ex
+\diagram[loose,height=.8em,width=0pt]
+&Z \times X &\relax\rTo^f & Y \\
+\ &&\relax\hLine && \ \\
+&Z & \rTo^{\ {\bf curry}(f)\ } & Y^X \\
+\enddiagram
+
+\ixcmd\hfill
+
+If you want the $Z$s lined up, it's no good \verb/\hfill/ing the second
+one on the right, because the arrow will not stretch to meet
+it\footnote{There is no way of detecting {\em where\/} \ix{glue} is placed
+inside a box, so the \ix{stretch}ing algorithm {\em assumes\/} the object
+is centred and extends the arrow by half the amount of glue in the
+object box.}. The best solution is probably to split the object into
+two cells:
+
+\begin{verbdiag}[loose,height=.8em,width=0pt,l>=3em,midshaft]
+&Z&\relax{}\times X&\relax\rTo^f&Y&\\
+\relax\ &&&\relax\hLine&&\relax\ &\\
+&Z&&\relax\rTo^{{\bf curry}(f)}&Y^X&
+\end{verbdiag}
+
+\vskip-6ex
+\diagram[loose,height=.8em,width=0pt,l>=3em,midshaft]
+&Z & {} \times X &\relax\rTo^f & Y \\
+\ &&& \hLine&& \ \\
+&Z & & \rTo^{{\bf curry}(f)} & Y^X \\
+\enddiagram
+
+\noindent The \verb/{}/ makes sure \verb/\times/ still gets the spacing
+appropriate to a binary operator.
+
+%==========================================================================
+\section{Diagonal lines}\label{diagonals}\index{diagonal arrows}
+Whereas horizontal and vertical arrows such as \verb/\rTo/ and \verb/\dTo/
+stretch to meet their endpoints without your telling them where those are,
+the diagonals (\verb/\ruTo/) need to be told explicitly if you want to use
+them for anything other than to go across a $3\times3$ square.
+
+\ixcmd\line\ixcmd\vector\ixcmd\ruTo\ixcmd\rdTo\ixcmd\luTo\ixcmd\ldTo
+\ixcmd{()}%
+The approximate direction of the arrow stays the same ---
+right/left and up/down --- as given by its name.
+The length (and exact direction) are given by {\em positive\/} coordinates.
+As with \LaTeX's \verb/\line/s and \verb/\vector/s,
+these are given pairs of (small) positive integers in round brackets, except
+that there is no restriction on the values.
+
+\ixcmd\laf\ixcmd\lah\index{line10 and linew10 fonts}\index{height}\index{width}
+However these numbers count the {\em cells,} horizontally and vertically,
+through which the arrow passes, rather than the absolute distance.
+This means%
+ \footnote{This represents a change from version~3, in which they were
+ required to be the same for the diagonals to work. The coordinates are
+ now converted internally into distances, and then back into a rational
+ number, and the appropriate \LaTeX\ arrow characters chosen.
+ The macros {\tt\string\laf}, {\tt\string\lah}, {\em etc.} and their octal
+ arguments are now obsolete.}
+that if the \verb/height/ of the rows and the \verb/width/ of the
+columns are different, \verb/\ruTo(2,2)/ is no longer a $45^\circ$ slope.
+
+The names of the arrow commands specify the horizontal direction first,
+as a reminder that this is also the convention for coordinates.
+
+Another difference from the orthogonal arrows is the rule for where to place
+the command. Somewhat arbitrarily,%
+ \footnote{The option \texttt{diagonalbase} changes this; it is
+ intended for emulation of other diagrams packages.}
+this is
+\begin{quote}
+ in the row {\em below the upper endpoint\/} (irrespectively of the direction
+ of the arrowheads, if any), and in the adjoining column
+\end{quote}
+In the commonest case (the diagonal of a small square) this means the middle
+of the square; more generally for positive gradients (\verb/\ruTo/ and
+\verb/\ldTo/) the arrow command goes below and to the left of the upper
+endpoint, and for negative gradients (\verb/\rdTo/ and \verb/\luTo/) below
+and to the right.
+
+\ixcmd\SEpbk\ixcmd\SWpbk\ixcmd\NEpbk\ixcmd\NWpbk
+For example, here is the diagram which defines a \ix{pullback}.
+The corner symbol is a macro (\verb/\SEpbk/) placed in the same cell as the
+object, but which prints way outside it.
+$$\begin{verbdiag}
+U&&&&&\\
+&\relax\rdTo~{(x,y)}\rdTo(4,2)^x\rdTo(2,4)_y&&&&\\
+&&X\times_Z\SEpbk Y&\relax\rTo_p&X&\\
+&&\relax\dTo^q&&\relax\dTo_f&\\
+&&Y&\relax\rTo^g&Z&
+\end{verbdiag}$$
+\vskip-6ex
+\begin{diagram}
+U \\
+ &\relax\rdTo~{(x,y)} \rdTo(4,2)^x
+ \rdTo(2,4)_y \\
+ & & X\times_Z \SEpbk Y & \rTo_p & X \\
+ & & \dTo^q & & \dTo_f \\
+ & & Y & \rTo^g & Z \\
+\end{diagram}
+
+For reverse compatibility, some commands with ``\ix{compass}''
+names are provided, such as \verb/\NW/, \verb/\WNW/, \verb/\NNNW/,
+together with dotted and other variants. However
+{\em the auxiliary file \verb/extra-diagonals.tex/ is obsolete and must
+not be used.}
+
+\label{Hasse}
+The main use of diagonals other than the simplest ones is for illustrating
+\ix{order structures} (``\ix{Hasse diagrams}'').\index{posets}\index{lattices}
+Posets are trivial categories, but in practice they're the most difficult
+diagrams to draw!
+\begin{quote}
+\begin{verbatim}
+\begin{diagram}[height=2.5em,width=1.5em,abut]
+o&&&&o&&&&o&&&&o\\
+&\luLine\luLine(10,2)&&\ruLine&&\relax\luLine(6,2)&&
+\ruLine(6,2)&&\luLine&&\ruLine\ruLine(10,2)&\\
+&&o&&&&&&&&o&
+\end{diagram}
+\end{verbatim}
+\end{quote}
+
+\begin{diagram}[height=2.5em,width=1.5em,abut]
+o&&&&o&&&&o&&&&o\\
+&\relax\luLine\luLine(10,2)&&\relax\ruLine&&\relax\luLine(6,2)&&
+\relax\ruLine(6,2)&&\relax\luLine&&\relax\ruLine\ruLine(10,2)\\
+&&o&&&&&&&&o
+\end{diagram}
+
+\ixcmd\DiagonalMap\index{lams1 to 5 fonts}\index{line10 and linew10 fonts}
+The obsolete command \verb/\DiagonalMap/ is also still supported, but should
+be replaced by the new commands. If you have used this with fonts other than
+\verb/line10/ (for example \person{Michael}{Spivak}'s fonts
+\verb/lams1/ to \verb/lams5/),
+please contact me to assist with conversion.
+
+\ixcmd\raise\ixcmd\lower\ixcmd\raisebox\index{abut}%
+By default, the diagonal arrows are set on the \ix{first pass} using
+\LaTeX\ line segments.
+By~contrast, the horizontals and verticals use ruled lines wherever possible
+and are adjusted on a \ix{second pass} of the diagram
+(within the \verb/\enddiagram/ command) to meet their endpoints.
+
+When the diagonals are set during the first pass, everything happens
+within the cell where they are declared, where the algorithm has
+no access to information about the size (and exact whereabouts)
+of the objects at which the arrows are meant to point.
+Therefore the lengths of the diagonals are chosen somewhat arbitrarily,
+though the \verb/abut/ option will make them touch a \verb/\cdot/.
+
+To get better results we have to use more sophisticated methods,
+and go outside what is strictly ``standard'' \TeX.
+
+%==========================================================================
+\section{Alternative \TeX nology}
+In order to get the best results, you should be aware of the way in which
+diagonals are constructed.
+\TeX\ is ultimately only capable of positioning characters from various fonts
+and drawing black rectangles with horizontal and vertical sides: there
+is no primitive for diagonal lines or for \ix{rotation}.\index{diagonal arrows}
+This means that we have
+\begin{itemize}\ixcmd\line\ixcmd\vector
+\item either to juxtapose characters with a limited choice of angles,
+ as \LaTeX's \verb/\line/ and \verb/\vector/ commands do,
+ with the result that (because of pixel rounding
+ errors) they may not line up correctly,
+\item or to use the loophole in the \ix{DVI} language provided by the
+ \verb/\special/ command to tell some post-processing software
+ (such as \verb/dvips/) to do the work for us, thereby surrendering
+ portability,\ixcmd\special\index{dvips}
+\item or to over-print a large number of dots, making the DVI file very
+ large since at least 12 bytes are needed for each dot.
+ This is what \PiCTeX\ does.\ixprotect\PiCTeX
+\end{itemize}
+In this package options are provided to employ the first two of these methods.
+\begin{itemize}
+\item By default, characters from \LaTeX's%
+ \footnote{The code is similar to that underlying the \LaTeX\ commands,
+ but is not the same. In particular, the line segment characters are
+ equally spaced, instead of a single overlap between the last two.}
+ \verb/line10/ font are used.\index{line10 and linew10 fonts}
+ Arrowheads from this font are used irrespectively of those chosen by the
+ \verb/heads/ option.
+ The nearest%
+ \footnote{The approximation uses \ix{continued fractions}, {\em alias\/}
+ \ix{Euclid's algorithm}, with a correction.
+ There is also code for computing \ix{Pythagorean sums} (for the lengths of
+ rotated diagonals) and \ix{trigonometric functions} (currently unused).}
+ available \LaTeX\ slope is chosen, with the effect that arrows
+ may sometimes fall short or overshoot: \verb/height/ and \verb/width/
+ should be set with this in mind.\index{height}\index{width}\index{size}
+\item If the \verb/PostScript/ option is enabled, horizontal arrows are
+ used, and \verb/\special/ commands%
+ \footnote{The code is adapted from \person{Tomas}{Rokicki}'s
+ {\tt \ix{rotate.sty}}.}
+ are embedded in the DVI file which have the effect of rotating them.
+ If the DVI file is post-processed
+ by a program which does not understand Adobe {\sc PostScript} an error
+ message will probably be generated and the arrows will appear horizontal.
+
+ Currently the labels are rotated with the arrows; later there will be an
+ option either to do this or to set them horizontally.
+
+ Literal {\sc PostScript} commands are included in the DVI file
+ using \TeX's \verb/\special/ command.
+ The various DVI to {\sc PostScript} translators (page~\pageref{PS})
+ make use of this in different ways,
+ so it is necessary to specify which one you are using.
+ I~use Tomas Rokicki's \verb/dvips/;
+ if the program you use is not listed,
+ please consult its manual for the appropriate way of including literal
+ {\sc PostScript} commands and tell me the result
+ so that I can add this as an option.
+ The rotation code should be independent of the design of the translator.
+
+ It does not and cannot work with the Oz\TeX\ {\sc PostScript} translator
+ because this sorts the characters on each page by font and cannot deal
+ with \verb/\special/ commands.\index{oztex@Oz\protect\TeX}
+\item If the \verb/TPIC/%
+ \footnote{\ix{TPIC} is a graphics preprocessor for \TeX\ by
+ \person{Tim}{Morgan} which uses this set of {\tt\string\special} commands.
+ The same ones were also adopted by \ixcmd\special
+ \person{Dirk}{Grunwald} for {\tt \ix{texpictex}} and
+ by \person{Conrad}{Kwok} for {\tt \ix{eepic}},
+ which are \LaTeX\ macro packages for \ix{graphics}.}
+ option is enabled, a simpler set of \verb/\special/
+ commands is used to draw diagonal lines, but rotation is not available.
+ \verb/dvips/ and \verb/xdvi/ understand these, but other post-processors
+ may give error messages and print nothing.\index{xdvi}\index{dvips}
+\end{itemize}
+No additional macro packages or special knowledge are needed to make use of
+these methods: all of the necessary code is built in to the diagrams package.
+
+Future versions may exploit these extensions to provide other features, such
+as curved lines; indeed this is likely to be the main direction of further
+development. Other methods may also be provided.
+However
+\begin{itemize}
+\item if no extension option is selected a standard DVI file
+ (using the \verb/line10/ font) will be always generated,
+ giving an approximation to the features requested.
+\item development of new features will use \verb/PostScript/ mode,
+ without which a ``\ix{second class service}'' will be provided.
+\end{itemize}
+
+
+
+%===========================================================================
+\section{Regular figures}
+
+The difference between these options can be seen by trying to draw a
+regular \ix{hexagon}.\label{hexagon}\index{abut}\index{tight}
+$$\begin{verbdiag}[vtrianglewidth=1em,abut,tight]
+ &&\relax{}&&\relax\rLine&&\relax{}&\\
+ &\relax\ruLine&&&&&&\relax\luLine&\\
+ \relax{}&&&&&&&&\relax{}&\\
+ &\relax\luLine&&&&&&\relax\ruLine&\\
+ &&\relax{}&&\relax\rLine&&\relax{}&
+\end{verbdiag}$$
+The \verb/PostScript/ and
+\verb/TPIC/ options will make it meet up exactly, whereas the default \LaTeX\
+method does not --- though it is surprisingly accurate!
+\begin{center}
+ \begin{diagram}[vtrianglewidth=1em,abut,tight,inline,PS]
+ &&{}&&\rLine&&{}\\
+ &\ruLine&&&&&&\luLine\\
+ {}&&&&&&&&{}\\
+ &\luLine&&&&&&\ruLine\\
+ &&{}&&\rLine&&{}
+ \end{diagram}
+ \qquad\qquad
+ \begin{diagram}[vtrianglewidth=1em,abut,tight,inline,noTPIC,noPS]
+ &&{}&&\rLine&&{}\\
+ &\ruLine&&&&&&\luLine\\
+ {}&&&&\hbox{\rm\LaTeX}&&&&{}\\
+ &\luLine&&&&&&\ruLine\\
+ &&{}&&\rLine&&{}
+ \end{diagram}
+\end{center}
+The \verb/vtrianglewidth/ option and its variants set the \verb/width/
+and \verb/height/\index{width}\index{height}\index{size} of the cells,
+but the array retains the symmetry of a rectangle.
+Tesselations of \ix{triangle}s and \ix{hexagon}s
+may be drawn in this way.
+
+Drawing a regular \ix{pentagon} requires rows and columns
+of different sizes.
+It~is envisaged that only a few special ways of doing this will
+be used, so this feature is provided by a \emph{declaration}%
+ \footnote{I cannot think of a natural way of specifying the distances
+ without coding general \ix{Gaussian elimination}.
+ I'm~quite happy to accept angles expressed in degrees.}
+of the form\ixcmd\newdiagramgrid\label{grid}
+\begin{quote}
+\begin{verbatim}
+\newdiagramgrid{pentagon}%
+ {0.618034,0.618034,1,1,1,1,0.618034,0.618034}%
+ {1.17557,1.17557,1.902113,1.902113}
+\end{verbatim}
+\end{quote}
+(In fact this is already made within the source of the package.)
+The numbers in the first list specify the distances between the centres
+of the first and second columns, the second and third, and so on,
+and similarly those in the second list the distances between the
+baselines of the rows.
+The units are the specified cell \verb/height/ and \verb/width/.
+
+Once declared, the \ix{grid} is chosen by name using the obvious option.
+Note that this forces the \verb/tight/ option.\index{tight}
+\begin{verbatim}
+\begin{verbdiag}[grid=pentagon,PostScript]
+ &&&&(A*B)*(C*D)& \\
+ &&&\ruTo(4,2)^\Assl&&\rdTo(4,2)^\Assl&\\
+ A*(B*(C*D))&&&&&&&&((A*B)*C)*D&\\
+ &\rdTo_{\Id*\Assl}&&&&&&\ruTo_{\Assl*\Id}&\\
+ &&A*((B*C)*D)&&\rTo^\Assl&&(A*(B*C))*D&
+\end{verbdiag}
+\end{verbatim}
+\begin{diagram}[grid=pentagon,small]
+ &&&&(A*B)*(C*D)& \\
+ &&&\relax\ruTo(4,2)^\Assl&&\relax\rdTo(4,2)^\Assl&\\
+ A*(B*(C*D))&&&&&&&&((A*B)*C)*D&\\
+ &\relax\rdTo_{\Id*\Assl}&&&&&&\relax\ruTo_{\Assl*\Id}&\\
+ &&A*((B*C)*D)&&\relax\rTo^\Assl&&(A*(B*C))*D&
+\end{diagram}
+A similar grid for a pentagon with a vertical side is obtained by
+the \verb/gridx/ option.
+
+The grid \verb/perspective/\index{perspective} has this effect
+on the \ix{cube} on page~\pageref{cube}:
+\begin{diagram}[grid=perspective]
+ A' & &\rTo^{f'} & & B' \\
+ & \rdTo_a & & & \vLine^{h'}& \rdTo_b \\
+\dTo^{g'} & & A & \rTo^f & \HonV & & B \\
+ & & \dTo^g & & \dTo \\
+ C' & \hLine & \VonH & \rTo^{k'} & D' & & \dTo_h \\
+ & \rdTo_c & & & & \rdTo_d \\
+ & & C & & \rTo^k & & D \\
+\end{diagram}
+Without the \verb/PostScript/\index{PostScript} option the
+\ix{diagonal arrows} will not be set correctly.
+
+
+%===========================================================================
+
+\iffalse
+\section{Bent lines --- not currently implemented}
+
+The diagonal lines in the previous section were difficult to draw and
+rather ugly. Here is a prettier way of doing it:
+\begin{verbdiag}
+U&&\relax\hLine^x&&\relax\dlBentto&\\
+&\relax\rdTo^{\langle x,y\rangle}&\\
+\vLine^y&&X\times_Z\SEpbk Y&\relax\rTo^p&X&\\
+&&\relax\dTo^q&&\relax\dTo_f\\
+\relax\ruBentto&&Y&\relax\rTo^g&Z&\\
+\end{verbdiag}
+which gives:
+\begin{diagram}
+U && \hLine^x & &
+\dlBentto \\
+& \rdTo^{\langle x,y\rangle} \\
+\vLine^y && X \times_Z \SEpbk Y & \rTo^p & X \\
+&&\dTo^q && \dTo_f \\
+\ruBentto&& Y & \rTo^g & Z \\
+\end{diagram}
+
+Notice that the bent lines consist of two separate arrow commands,
+one of them an ordinary \verb/\hLine/ or \verb/\vLine/ and the other
+a ``bent'' arrow. The latter are designed to meet orthogonal lines
+exactly. To be precise,
+\begin{itemize}
+
+\item \verb/\dlBentto/, {\em etc.}, has a corner which is vertically
+positioned on the maths axis and includes a short horizontal line to
+compensate for the space at the end of \verb/\hLine/.
+{\em It~must be placed in the cell corresponding to the corner.}
+There are similar commands \verb/\ulBentto/
+for upward maps, \verb/\drBentto/ to meet lines on the right and
+\verb/\dlBent/ without an arrowhead (and all the combinations).
+
+\item \verb/\ruBentto/, {\em etc.}, has a corner which is horizontally
+positioned in the centre of the {\em next\/} cell (assuming that's
+empty). So {\em it must be placed in the cell next to the corner,
+in fact that corresponding to the edge.} The arrow is extended
+automatically.
+Again there are commands with variant names.
+
+\end{itemize}
+
+These bent line commands are defined in exactly the same way as ordinary
+horizontal and vertical arrows, except that
+\begin{itemize}
+
+\item \verb/\dlBentto/ has only a bottom half, {\em i.e.}~the leading
+tip and first filler are \verb/\empty/. The second filler and trailing
+tip are quite ordinary but the middle is special (\verb/\ldmcorner/).
+
+\item \verb/\ruBentto/, on the other hand, is a complete arrow, the
+{\em tail\/} now being a special corner.
+
+\end{itemize}
+Other middles could be defined to give rounded corners, using \LaTeX's
+{\tt circle10} font.
+\fi
+
+
+%=========================================================================
+\section{Emulation of \TeX ercise 18.46}\label{18.46}
+\ixprotect{\TeX book}\index{Exercise 18.46}\ixprotect{\TeX ercise 18.46}%
+\index{emulation}%
+This and the next section describe how to convert diagrams in your existing
+documents which were drawn using other commutative diagram macro packages to
+use this one, wherever possible changing only the preamble or macro
+file and not the text itself.
+
+Exercise 18.46 of {\em The \TeX book\/} provided some ideas for commutative
+diagrams, from which the present package was originally developed.
+The following instructions are based on what is given there,
+but if you have added other arrow macros you will have to work out how to
+re-define them by following the examples given.
+
+\ixcmd\matrix
+If you have used the {\em\TeX book\/} macros as they stand --- with
+\verb/\matrix/ enclosing the diagram --- you will first have to distinguish
+between the diagrams and real matrices.
+(If~you give arrays of numbers to the commutative diagrams package, they
+will come out rather widely spaced.)
+This process is unnecessary if you already have a macro for diagrams
+rather than matrices: just re-define that in a similar way.
+
+In~your macro file you probably have something like what follows the
+\verb/\iffalse/ command below, but with additional macros written in
+a similar way (this is the reason for setting it all out in gory detail
+in the manual rather than providing an extra input file as in the case
+of some of the ``packages'' described in the next section).
+If~you make the following additions you will be able to revert to the
+original (in the unlikely event that you are not satisfied)
+by changing this to \verb/\iftrue/.
+
+This is not particularly difficult: when, as a \TeX\ novice, I~wrote my
+Ph.D.~thesis in August 1986, I~had sixty diagrams drawn using
+the {\it\TeX book\/}
+macros, together with several others that had to be drawn by hand.
+Recovering that from an archive tape, I~recently found that all but five
+of the sixty could be converted without any change at all to the text,
+whilst the hand-drawn ones can now be drawn with the up-to-date package.
+
+\ixcmd\mapright\ixcmd\mapleft\ixcmd\mapup\ixcmd\mapdown
+\ixcmd\inputlineno
+\begin{quote}\small
+\begin{verbatim}
+\iffalse
+ % your macros, copied or adapted from TeXercise 18.46 (page 325)
+ \def\mapright#1{\smash{\mathop{\longrightarrow}\limits^{#1}}}}
+ \def\mapdown#1{\Big\downarrow\rlap{$\vcenter{\hbox{$\scriptstyle#1$}}$}}
+ %
+ \let\cdmatrix\matrix % revert to using \matrix for diagrams
+\else
+ % Replacement for the above using ...
+ \input diagrams % Paul Taylor's diagrams.
+%
+ \def\mapright#1{\global\matrixwascdtrue\rTo^{#1}\relax}
+ \def\mapleft #1{\global\matrixwascdtrue\lTo^{#1}\relax}
+ \def\mapup #1{\global\matrixwascdtrue\uTo>{#1}\relax}
+ \def\mapdown #1{\global\matrixwascdtrue\dTo>{#1}\relax}
+%
+ % Maybe you have some variants like this:
+ \def\mapupbefore#1{\global\matrixwascdtrue\uTo<{#1}\relax}
+%
+ % The following examples may also be useful:
+ \let\into\rInto
+ \def\horizadjoint#1#2{\pile{\lTo^{#1}\\\bot\\\rTo_{#2}}}
+ \def\vertadjoint #1#2{\dTo<{#1}\dashv\uTo>{#2}}
+%
+ % Here is a replacement for \matrix which gives a commutative
+ % diagram, including some extra macros for use inside them.
+ \def\cdmatrix{\bgroup
+ \edef\matrixlineno{\the\inputlineno}\global\matrixwascdfalse
+ %
+ \let\matrix\pile % inner \matrix is probably parallel horizontals
+ %
+ % re-define the diagonal arrows
+ \let\nwarrow\luTo\let\nearrow\ruTo\let\swarrow\ldTo\let\searrow\rdTo
+ %
+ \diagram[]% begin the diagram (without options)
+ \getthematrix% delete this line if you use amstex rather than plain
+ }
+ \def\getthematrix#1{#1\endcdmatrix}
+ \newif\ifmatrixwascd
+ \def\endcdmatrix{\enddiagram\egroup}
+%
+ % The following tells you whether it was actually a diagram or
+ % a matrix. Remove this when you've changed those \matrix
+ % commands in your text which should be diagrams to \cdmatrix.
+ \def\endcdmatrix{\enddiagram\egroup
+ \expandafter\message{^^JThe \string\matrix\space at lines
+ \matrixlineno--\the\inputlineno\space was really a
+ \ifmatrixwascd diagram\else matrix\fi.^^J}}
+ \let\matrix\cdmatrix \let\endmatrix\endcdmatrix
+%
+\fi
+\end{verbatim}\end{quote}
+
+The code as shown above assumes you have \TeX\ version~3 (to provide
+\verb/\inputlineno/); it prints a \verb/\message/ to tell you whether
+each \verb/\matrix/ has used any arrow commands.
+With a clever choice of this message you can even get your editor
+to make the necessary changes to the text for you in batch mode!
+Delete the extra code after you have done this.
+
+\ixprotect\AmSTeX\index{array environment}\ixcmd\endmatrix
+Beware that \AmSTeX\space uses \verb/\matrix#1\endmatrix/ instead of
+\verb/\matrix#1/.
+In~this case, delete \verb/\getthematrix/ as indicated.
+Then (where appropriate) change \verb/\endmatrix/ as well as \verb/\matrix/.
+The same applies if you have used the \verb/array/ enviroment in \LaTeX.
+
+% \begin{itemize}
+% \item \verb/\matrix{..}/ must be changed to
+% \verb/\diagram..\enddiagram/ (or~\verb/\commdiag{..}/).
+% \item \verb/\mapright/, {\em etc.,} must be changed to (or~defined
+% as) \verb/\rTo/. Positional arguments are still recognised,
+% {\em so long as they are enclosed in braces.}
+% \item \verb/\cr/ should be changed to \verb/\\/.
+% \end{itemize}
+
+%=========================================================================
+\section{Emulation of other macro packages}\label{emulate}\index{emulation}
+There are several other \TeX\ macro packages in circulation for drawing
+commutative diagrams, of varying degrees of sophistication.
+This section describes how to adapt the preamble of an existing document
+which was written to use such macros so that it prints diagrams like those
+in this manual instead.
+When you publish documents prepared in this fashion, please remember to
+acknowledge the authors of both packages, making it clear which you used to
+type the original source and which produced the finished product.%
+\index{acknowledgement}
+
+\bigskip
+\noindent{\bf \ix{American Mathematical Society}}%
+\ixprotect\AmSTeX\ixprotect\AMSLaTeX\index{amscd.sty}
+(\AmSTeX, and \AMSLaTeX's \verb/amscd.sty/): see Michael Spivak below.
+
+\bigskip
+\noindent{\bf \person{Michael}{Barr}}'s \verb/catmac/\index{catmac.tex} macros
+were based on a principle of overlapping squares.
+Whilst this is perhaps closer conceptually to the
+ categorical ideas which are being expressed, it is not possible to emulate
+ the language using the matrix syntax. The simple shape macros can, however,
+ be replaced by
+\ixcmd\square
+\begin{quote}\begin{verbatim}
+\def\square[#1`#2`#3`#4;#5`#6`#7`#8]{%
+ \diagram[]
+ {#1} & \rTo^{#5} & {#2} \\
+ \dTo<{#6} & & \dTo>{#7} \\
+ {#3} & \rTo^{#8} & {#4}
+ \enddiagram}
+\end{verbatim}\end{quote}
+ and similarly \verb/\atriangle/, \verb/\btriangle/, \verb/\dtriangle/,
+ \verb/\ptriangle/, \verb/\qtriangle/, \verb/\Atriangle/, \verb/\Ctriangle/,
+ \verb/\Driangle/, \verb/\Vriangle/,
+ \verb/\Arianglepair/, \verb/\Vrianglepair/ and \verb/\recurse/,
+ which are easy exercises.%
+\ixcmd\atriangle\ixcmd\btriangle\ixcmd\dtriangle\ixcmd\ptriangle
+\ixcmd\qtriangle\ixcmd\Atriangle\ixcmd\Ctriangle\ixcmd\Driangle
+\ixcmd\Vriangle\ixcmd\Arianglepair\ixcmd\Vrianglepair\ixcmd\recurse
+
+\bigskip
+\noindent{\bf \person{Karl}{Berry}}'s \verb/eplain/:\index{eplain.tex}
+see Steven Smith below.
+
+\bigskip
+\noindent{\bf \person{Francis}{Borceux}}'s \verb/diagram/ package uses \LaTeX's
+ \verb/picture/ environment\index{picture environment}
+ instead of \TeX\ arrays, but since it is designed in an array fashion
+ it can be interpreted.
+ Instead of that file, use
+\begin{quote}\begin{verbatim}
+\input diagrams
+\input Borceux-to-Taylor
+\end{verbatim}\end{quote}
+ This is available from the same place as (my) \verb/diagrams.tex/ itself.
+ Currently the curved, free and multiple arrows
+ are not implemented, and all size parameters are ignored.
+
+\bigskip
+\noindent{\bf \person{Eitan}{Gurari}}'s \verb/dratex/:\index{dratex}
+I haven't looked in to this package yet.
+
+\bigskip
+\noindent{\bf Donald Knuth}'s Exercise 18.46:
+ see section~\ref{18.46} of this manual.
+
+%\bigskip
+%\noindent{\bf J\"urgen Koslowski}: I haven't looked in to this package yet.
+
+\bigskip
+\noindent{\bf \person{Frank}{Mittelbach}}'s \AMSLaTeX\space \verb/amscd.sty/:
+see Michael Spivak below.
+
+\bigskip
+\noindent{\bf \person{John}{Reynolds}}:
+I haven't looked in to this package yet.
+
+\bigskip
+\noindent{\bf \person{Kris}{Rose}}'s \XYpic\ixprotect\XYpic\
+ uses a different convention for
+ where to declare arrows, namely in the cells with their sources.
+ This convention will be supported in the next release.
+ The syntax of Rose's arrow commands is also more complicated.
+ I~do not intend to support his fonts or turning commands.
+
+\bigskip
+\noindent{\bf \person{Rainer}{Sch\"opf}}'s \AMSLaTeX\space \verb/amscd.sty/:
+see Michael Spivak below.
+
+\bigskip
+\noindent{\bf \person{Steven}{Smith}}: I haven't looked in to this package yet.
+
+\bigskip
+\noindent{\bf \person{Michael}{Spivak}}'s \LAMSTeX:\ixprotect\LAMSTeX
+similar comments apply here as to Kris Rose's package.
+
+\bigskip\noindent{\bf Michael Spivak}'s \AmSTeX\space\ixprotect\AmSTeX
+ (as described in {\em The Joy of \TeX\/})%
+ \index{joy@{\em The Joy of \protect\TeX}}
+ had some very primitive commutative diagrams,\ixcmd\CD\ixcmd\endCD
+ enclosed in \verb/\CD...\endCD/.
+ \iffalse
+ Horizontal arrows were drawn with the commands
+ \verb/@</$f$\verb/</$g$/\verb/</ or \verb/@(/$f$\verb/(/$g$/\verb/(/
+ and \verb/@>/$f$\verb/>/$g$/\verb/>/ or \verb/@)/$f$\verb/)/$g$/\verb/)/,
+ where $f$ and $g$ are the upper and lower labels.
+ Vertical arrows used
+ \verb/@A/$f$\verb/A/$g$/\verb/A/ and \verb/@V/$f$\verb/V/$g$/\verb/V/
+ where $f$ and $g$ are the left and right labels.
+ These arrows were only as long as their labels.
+ A~long equals without labels could be drawn with % ??? \verb/@-/,
+ \verb/@=/ and \verb/@|/ or \verb/@\vert/. % ?? \verb/@\|/ and \verb/@\Vert/
+ for single and double lines.
+ \fi
+
+ You can obtain a dramatic improvement in these diagrams without changing
+ the text of your document by using my package with the \verb/amstex/ option.
+ Given a (complete, correct) \AmSTeX\ document, change the header to read
+ \begin{quote}\begin{verbatim}
+ \input amstex
+ \input diagrams
+ \diagramstyle[amstex]
+ \end{verbatim}\end{quote}
+ \vskip-2ex
+ If~\AmSTeX\space or \AMSLaTeX\space (\verb/amscd.sty/) had been loaded,
+ this will replace the definitions.\ixprotect\AMSLaTeX\index{amscd.sty}
+
+ You can also include \AmSTeX\space diagrams extracted from old papers
+ in new \verb/plain/ \TeX\ or \LaTeX\ documents. In~this case,
+ do not load \AmSTeX\ (unless you want it for some other reason)
+ but instead use
+ \begin{quote}\begin{verbatim}
+ \input diagrams
+ \def\CD{\diagram[amstex]}
+ \end{verbatim}\end{quote}
+ \vskip-2ex
+ to confine the changes to the meaning of the \verb/@/ character to the
+ diagrams themselves.
+ The in-line horizontal arrows will then not be interpreted.
+
+\bigskip
+\noindent{\bf \person{Timothy}{van Zandt}}'s \verb/pstricks/:\index{pstricks}
+I haven't looked in to this package yet.
+
+%=========================================================================
+\section{Frequently asked questions}\label{faq}
+\noindent{\bf Wouldn't it be better to draw it with a mouse?} No.%
+\index{mouse}\index{wysiwyg}
+
+\bigskip\noindent{\bf How do I get it?}
+See section~\ref{get}.
+
+\bigbreak\noindent{\bf Is it compatible with ...?}\index{compatibility}
+From 1986 until after version~3 of this package was announced in July~1990
+I~used \verb/plain/ \TeX,\index{plain \protect\TeX}
+whilst giving assistance to colleagues who used \LaTeX. \ixprotect\LaTeX
+In~December 1991 the local \TeX\ system was converted to use
+\person{Frank}{Mittelbach} and \person{Rainer}{Sch\"opf}'s font selection
+(NFSS1)\index{NFSS} for \LaTeX.
+Now we use \LaTeXe\ixprotect\LaTeXe, which includes NFSS2.
+
+Consequently there is a great deal of collective experience in using the
+diagrams package in all of these environments. I~do not have experience
+of \AmSTeX, \AMSLaTeX, \verb/eplain/ or commercial \TeX\ packages, but
+do not know of any reason why it should not work with them:
+please tell me if you find any difficulties.
+
+It is, regrettably, not uncommon for publishers to copy parts of
+\LaTeX\ and {\tt\ix{article.sty}}
+into their own journal and conference styles,%
+\index{journals}\index{conference proceedings}
+and not keep these up to date with respect to bug-fixes and other changes.
+Many of the bug reports which I~receive in connection with the diagrams
+package are in fact traceable to errors of this kind in publishers' styles.
+My~policy is that I~will no longer fix bugs in software from commercial
+organisations for free, but suggest some consultancy arrangement.
+If, however, it is possible to make the package more robust and circumvent
+such bugs in other software then I~will do this.
+
+\person{Richard}{Stallman}'s \verb/texinfo/\index{texinfo.tex}
+is designed for documenting other software,
+in which \TeX's special characters often have important meanings.
+For this reason many of the \verb/\catcode/s \ixcmd\catcode
+have been changed, and in
+particular \verb/@/ is used where \TeX\ uses \verb/\/.
+The usual \TeX\ meanings are restored within \verb/@tex..\Etex/.
+It~is possible to load this package without this, but you must do
+\begin{quote}\begin{verbatim}
+@catcode`@\=0 \catcode`\%=14 \input diagrams \catcode`\%=12 \catcode`\\=13
+\end{verbatim}\end{quote}
+You must also do \verb/@catcode`@&=4/ before using \verb/@diagram/.
+Braces \verb/{}/ stay the same.
+
+Unfortunately the package does not seem to work with TeX-XeT,
+the extension to \TeX\ for typesetting Arabic and Hebrew.
+I~believe this problem is insuperable.
+
+\bigbreak\noindent{\bf Does it use any special \ix{fonts}?} No.
+One of the design
+criteria of the package is that all of the components come from the standard
+\ix{Computer Modern fonts} that come with \TeX,
+except that the diagonal arrowhead characters come from \LaTeX's
+\verb/line10/ font.\index{line10 and linew10 fonts}
+As~one user said,
+\begin{quote}
+``I agree with you in being against the use of additional fonts.
+It takes some time and experience to port, say,
+\LAMSTeX\ixprotect\LAMSTeX\space fonts to [my `personal' computer].
+I would much prefer embedded {\sc PostScript} commands.\index{PostScript}
+Custom \ix{DVI} drivers such as \verb/xdvi/,\index{xdvi} on the other hand,
+are not widely available, at least not for [my computer].''
+\end{quote}
+There are {\em optional\/} arrowheads from the \ix{AMS symbols fonts},
+which were
+\ifx\twoheadrightarrow\undefined not available\else used\fi\space
+when this copy of the manual was printed. They may be obtained by anonymous
+\ix{FTP} from \verb/e-math.ams.com/.\index{anonymous FTP}
+
+It is sometimes claimed that it is advantageous to have specially designed
+fonts in order to ensure that the components match up correctly.
+However the reason why they frequently do not is pixel-rounding,
+{\em even when the DVI-driver does this correctly according to the rules
+specified by \person{Donald}{Knuth}}.\index{pixel size}%
+ \footnote{If you don't believe me, calculate for yourself which pixels
+ are inked when a 0.4pt-wide rule is centered on the maths axis of
+ {\tt cmmi10} (2.5pt above the baseline) at 300dpi (1~point~=~4.15~pixels),
+ and compare this with characters such as $\greaterthan$ in the output of
+ {\tt gftype -i cmmi10.300gf}. The character $\succ$ in {\tt cmsy} is
+ one pixel lower than this.}
+The \verb/dpi/ option has been included to correct for this.\index{dpi}
+
+If you have other arrowhead fonts available, such as those provided by
+\person{Kris}{Rose} for \XYpic\ixprotect\XYpic\
+and \person{Michael}{Spivak} for \LAMSTeX,\ixprotect\LAMSTeX\
+you may use them if you write your own \verb/\newarrowhead/ commands.%
+\ixcmd\newarrowhead
+
+\bigbreak\noindent{\bf Corruption by \ix{electronic mail}.}\index{corruption}
+If you cannot use FTP and the route to you by electronic mail passes
+through non-\ix{ASCII} machines (such as through \ix{BITNET}),
+the file may suffer corruption.\index{EBCDIC}
+This doesn't matter very much with the manual, but the macro
+package itself has a list of characters at the top, and use of most of those
+which experience has shown to be vulnerable has been confined to the first
+section, wherever possible. Search for the word ASCII if in doubt.
+
+\bigbreak\noindent{\bf \TeX\ capacity exceeded.}
+\TeX\ was designed in the early 1980s, when RAM was measured in kilobytes,
+and does not have \ix{dynamic memory allocation}.
+Although \verb/tex.web/\index{tex.web}
+says loudly ``Don't Touch!'', the compile-time
+parameters listed on page 300 of {\it The \TeX book\/} {\em are\/} meant to be
+changeable, and \person{Donald}{Knuth} provided a mechanism
+(\verb/tex.ch/) for doing so.
+\person{Karl}{Berry}'s widely used \verb/web-to-C/\index{web-to-C}
+{\sc Unix}\index{Unix} port of \TeX\
+increases them substantially --- in accordance with the \ix{RAM} available in
+1990s hardware and that needed by 1990s software. There is nothing
+{\sc Unix}-specific about these changes: they can just as well be made in
+any other compilation environment.
+Currently it seems Oz\TeX\index{oztex@Oz\protect\TeX} has not made
+the changes --- please complain about this to its author,
+\person{Andrew}{Trevorrow}, not~me.
+
+The increase in size over version~3 is largely due to the diagnostics,
+{\em i.e.} helping you to use the package!\index{error recovery}
+
+If you get ``no room for another \verb/\dimen/'' \ixcmd\dimen
+it probably means you're using \PiCTeX\ixprotect\PiCTeX,
+which uses 110 out of the available~256; I~use~20.
+
+The process of stretching the arrows in a completed diagram is quite slow,
+but at least in this package \TeX\ spends the time doing something useful
+rather than parsing (\LaTeX\ \verb/picture/)\index{picture environment}
+\verb/\put/ commands inside macros.
+The emulation of \person{Francis}{Borceux}'s macros, for instance,
+is 50\% faster than the original.
+\person{Kris}{Rose}'s \XYpic\ixprotect\XYpic\ takes about six times
+as long to draw the same diagram.
+
+\bigbreak\noindent{\bf Default \ix{arrowheads}.} Even when you define your own
+arrows with special arrowheads, you still get get \LaTeX\ heads on diagonals.
+This is because \LaTeX\ heads are available in a variety of directions,
+but your special ones are only defined for up, down, left and right.
+To~get special heads on diagonals, it is necessary to rotate them, and to
+do that you need the \verb/PostScript/ option.%
+\index{diagonal arrows}\index{PostScript}
+
+\bigbreak\noindent{\bf Display options.} If, as was advised in earlier versions
+of this manual, you enclose the diagram in \verb/$$...$$/\ixcmd{$$}
+or a \index{displaymath environment},
+the new \ix{options} in section~\ref{options} for positioning it cannot work.
+Except in those cases where you want two or more diagrams side by side,
+or a small diagram in-line in the text, it is better to remove such
+enclosings; then you can experiment with the options using
+\verb/\diagramstyle/. \ixcmd\diagramstyle
+\LaTeX's \verb/center/ environment is,\index{center environment}
+for this purpose, {\em not\/} a display but a paragraph of text,
+with some strange results if you use the \verb/textflow/ option;%
+\index{text flow}
+in this case you should use the \verb/inline/ option\index{in line}
+on the individual diagrams to make them appear side by side.
+
+\bigskip\noindent{\bf Large \ix{gaps} between diagonals and their endpoints.}
+\index{PostScript}\index{diagonal arrows}
+This happens if you try to use the default \verb/LaTeX/ line segments
+to draw very steep or very shallow diagonals.
+Try using the \verb/PostScript/ option.
+
+By~default, the (rows and) columns of the matrix forming the diagram can
+\ix{stretch} to accommodate long pieces of text as objects and arrow labels.
+This is appropriate for rectangular diagrams and requires no user intervention.
+If,~however, you have diagonals, this stretching causes them to fall short of
+the objects to which they are meant to point, because currently they are
+(unlike the horizontals and verticals) rigid.
+\message{A message about "badly drawn diagonals" follows. It is deliberate.}%
+
+\vskip-5ex
+\begin{diagram}[loose,size=3em,notextflow,heads=LaTeX,noPS]
+ A & \rTo^{\lessthan 1_A,0_A\greaterthan} & A\times N\\
+ & \rdTo[fixed]_f&\dDotsto>h\\
+ &&B
+\end{diagram}
+An example provided by a user is shown. The solution is to use options like
+\begin{quote}
+ \verb/\begin{diagram}[tight,width=4em,height=3em]/
+\end{quote}
+See section~\ref{options} for details.\index{tight}
+Sometimes there isn't room on the page to increase the width sufficiently.
+Try using the \verb/scriptlabels/ option, or, failing that, put the whole
+diagram in the scope of a \LaTeX\ \verb/\small/ or even \verb/\tiny/
+declaration.\ixcmd\small\ixcmd\tiny
+
+This real-life example illustrates another common problem: the symbols
+$\lessthan$ and $\greaterthan$ are {\em \ix{relations}\/}
+$\langle$not~brackets$\rangle$ --- and it's not unusual to see line-breaks
+the wrong side of them, even in published, supposedly proof-read, books.
+If~you don't often use the strict arithmetical relations and find it a bore
+to type \verb/\langle..\rangle/, put the following in your macro file:%
+\ixcmd\langle\ixcmd\rangle\ixcmd{<}\ixcmd{>}\ixcmd\mathcode
+\ixcmd\mathchardef
+\begin{quote}\begin{verbatim}
+\mathcode`\<="4268 % < = \langle
+\mathcode`\>="5269 % > = \rangle
+\mathchardef\gt="313E % arithmetic
+\mathchardef\lt="313C % strict order
+\end{verbatim}\end{quote}
+\ixcmd\mbox
+As another piece of general advice, many people use \verb/\mbox/ when it is
+completely unnecessary. Amongst other things, it inhibits the reduction of
+the contents when used as a sub- or superscript.
+In~\LaTeXe, try using the \verb/\text/\ixcmd\text\ and
+\verb/\ensuremath/\ixcmd\ensuremath\ commands.
+
+%\bigskip\noindent{\bf Diagonals overprint or don't quite meet their
+%endpoints.} I'm~sorry about this: it's because I~haven't got round to writing
+%the code to stretch the diagonals in the same way as the horizontals and
+%verticals. This will be done in the next release, because I~need it for my
+%book.
+%
+%In~the case of poset diagrams, the \verb/[tight,abut]/ options should work
+%satisfactorily.
+
+\bigskip\noindent{\bf ``Badly drawn diagonals'' error message.}%
+\index{badly drawn diagonals}\index{diagonal arrows}
+This warning is given if (a)~you use diagonals which are set on the first
+pass ({\em i.e.}~\LaTeX, \ix{TPIC} or \verb/fixed/\index{fixed}) {\em and\/}
+(b)~some of the columns are significantly wider than was specified by
+the \verb/width/ or \verb/size/ option.\index{width}\index{size}
+It~indicates that the problem above, with big gaps at the ends of diagonals,
+may have occurred.
+Check this, and if necessary set the \verb/tight/ option and specify the
+necessary (increased) \verb/width/ yourself.
+Alternatively, use the \verb/PostScript/ option to get the diagonals
+set on the second pass; then they will meet their endpoints.%
+\index{PostScript}\index{width}\index{size}
+
+\bigskip\noindent{\bf Labels on arrows \ix{over-print} objects or
+\ix{arrowheads} become detached.}\index{labels}\index{decapitated arrows}
+You're trying to squeeze too much into the column: increase
+\verb/width/ (as it tells you to do). If~the object at one end is much
+longer than that at the other, the \verb/midshaft/ option may be appropriate.%
+\index{midshaft}\index{width}\index{size}
+
+\bigskip\noindent{\bf Mixed or missing \ix{arrowheads}.}
+The idea of providing the \verb/heads/\index{heads} option
+is that you should specify at the beginning of your
+document which style you want. The default is \verb/heads=LaTeX/ since this
+provides consistency between orthogonal and diagonal arrowheads when rotation
+is not available.
+
+\bigskip\noindent{\bf Undefined symbols.}%
+\index{undefined control sequence} To~use the curly and black
+arrowheads you need the \ix{AMS symbols fonts};
+if one of these (\verb/\curlyvee/, \verb/\blacktriangleleft/)%
+\ixcmd\curlyvee\ixcmd\blacktriangleleft\ is undefined,
+hit return several times to complete
+the run of \TeX\ on your document, then go back and insert
+ \ifx\usepackage\undefined
+ \verb/\input mssymb/
+ \else
+ \verb/\usepackage{amssymb}/
+ \fi
+or change the heads declaration.\index{amssymb.sty}
+
+If~you find a symbol with a \ix{meaningless name} like \verb/\CD@gF/
+\ixcmd{\CD@gF} or
+\verb/\cD@hA/ is undefined, it means that you have used internal macros
+from a previous version of the diagrams package. Please remove them:
+the names are deliberately meaningless to persuade you not to use them.
+
+\bigbreak\noindent{\bf Can you put \ix{diagrams within diagrams}?}%
+\index{nested diagrams}\ixcmd\pile\index{parallel arrows}
+Yes, but it's not often that such things are needed. Remember that
+\verb/\pile/ is used for parallel horizontals. Sometimes you may want an
+array of diagrams.
+
+During development I~found problems when the first cell of the inner
+diagram was empty, and version 3.22 resulted in \TeX's elusive
+``\ix{interwoven alignment preambles} are not allowed'' error
+({\it The \TeX book}, page 299).\ixprotect{\TeX book}
+Although I believe these bugs have now been fixed, this is a delicate area
+and it is possible that others may arise.
+
+\bigskip\noindent{\bf \verb/Missing \endcsname inserted./}\label{miss endcs}
+\index{missing \protect\verb/\endcsname/}\ixcmd\endcsname\ixcmd\the
+This can happen if a macro occurs within an option [in~square brackets].
+In~general you must ensure that such macros expand to text characters only.
+For example in \LaTeXe:\ixprotect\LaTeXe\ixcmd\usepackage
+\begin{quote}
+ \verb/\usepackage[flushleft=\mainindent]{diagrams}/
+\end{quote}
+where \verb/\mainindent/ is a \verb/\dimen/;
+in this case \verb/\the\mainindent/ will work,
+because \verb/\the/ expands the \verb/\dimen/ to its value
+({\it\TeX book}, page 214).
+Values for options to individual diagrams and arrows, or parsed by
+\verb/\diagramstyle/ instead of \verb/\usepackage/, may safely contain
+macros where appropriate.
+
+\bigskip\noindent{\bf Horizontal arrows \ix{overprint} objects.}
+\index{horizontal arrows}\ixcmd\hfill\ixcmd\hss\ixcmd\hspace\ixcmd\hidewidth
+You must not use \verb/\hfill/, \verb/\hss/, \verb/\hspace/,
+\verb/\hidewidth/ or other similar commands to try to
+alter the effective size of the object.
+
+\index{bug reports}
+\bigskip\noindent{\bf What if it still doesn't work?} If you have a problem
+which is not answered by this manual, please compile a {\em short\/} file
+containing your problem diagram and any macros (such as \verb/\Assl/ in
+section~\ref{typing}) it contains. Run it through \verb/tex/ or \verb/latex/
+to check that no definitions are missing, and include a note of the date
+and version number which you are using. Then send it by {\em electronic\/}
+mail: please do not use the telephone or postal mail.
+
+\ixcmd\scrollmode\index{error recovery}
+I am keen to know about any adverse interactions with other software,
+anything which is not well explained in this manual, or any cases of
+mis-typing in which \verb/\scrollmode/ does not get to the end of the
+document because of a diagrams error.
+
+% automatic floats
+% picture-mode inserts for braids, etc
+
+%=========================================================================
+\section{Conditions of use}\index{conditions of use}\index{copyright}
+You may freely copy and pass on this package and include it in collections
+of free software, but may not alter it or charge a fee for it.
+
+\index{registration as a user}
+Please ensure that you are registered with me as a user, so that you can be
+informed of new versions. Any \ix{electronic mail} message containing the words
+``commutative'' or ``diagram'' automatically registers you, as does quoting
+your electronic mail address when fetching it by~\ix{FTP} from
+\verb/ftp.dcs.qmw.ac.uk/.
+
+\index{acknowledgement}
+If you consider this package good enough to use, then it is good enough to
+acknowledge. After all, it is academic protocol to credit prior or
+simultaneous discovery of techniques related to your own, even if you were
+unaware of them or did not rely on them when you made your own discovery.
+Such acknowledgement is a condition of use of this package.
+However this condition is waived if use amounts to no more than five diagrams,
+each of which is either a square or a triangle.
+This acknowledgement must, of course, be removed if the document is re-typeset
+by methods which do not use this package.
+
+No permission was in the past given to use this package for
+commercial purposes.\index{commercial use}
+This includes a document whose copyright is seded by the author (for valuable
+consideration or not) to another person or body which subsequently intends to
+collect \ix{royalties} for its reproduction.
+This applies to certain journals and conference proceedings.
+Permission is now granted for its use for the production of academic
+research and \ix{textbooks}, \ix{journals} and \ix{conference proceedings},
+subject to the conditions that
+\begin{itemize}
+\item acknowledgement be given as above,
+\item an up-to-date version of the package be used for the final production,
+\item and one copy of the book be sent to me on publication in lieu of royalty,
+ at the above address.
+\end{itemize}
+Use by commercial organisations is considered (for this purpose) to be
+academic if the results are intended for publication in an academic forum,
+concern pure research and do not relate to any particular commercial product.
+
+The software may not be used for any military purpose under any circumstances.%
+\index{military use}
+
+No \ix{warranty} is given with this software.
+It is supplied ``\ix{as is}'', and neither the source nor this manual
+nor anything else shall be taken as a \ix{representation}
+that it will perform any particular function, is suitable for any particular
+purpose or is of \ix{merchantable quality}.
+In executing the software, the user implicitly accepts the above conditions
+and indemnifies\index{indemnification} the author,
+\ix{Queen Mary and Westfield College}
+and any person through whom the software was obtained, against
+\ix{liability} for direct or consequential \ix{damages}
+arising from the use of this software.
+
+{\em Whenever\/} you use computers you {\em must\/} keep at least two
+back-up copies of all of your files, with one of them well away from the
+machine, in case of fire or major failure.
+Before sending any documents for publication or to an expendive printer
+make a thorough visual check using a previewer such as \verb/xdvi/\index{xdvi}
+and a low resolution printer.
+
+%=========================================================================
+\section{Reverse compatibility}\index{compatibility}
+Compatibility with past and future versions (the numbers of some of which have
+been assigned {\em post facto\/}) is as follows. Note the difference between
+``should'' and ``must''.
+
+\begin{description}
+\item[Version 0:] See section~\ref{18.46}.
+\item[Version 1:] Horizontal arrows made to stretch to edge of cell; 1987--9.
+ \begin{itemize}
+ \item \verb/\rTo{f}{g}/ works, but \verb/\rTo f g/ doesn't: it must
+ be changed to \verb/\rTo^f_g/.
+ \item the \verb/\mkern-20mu\rTo{f}{g}\mkern-20mu/ idiom for manual
+ stretching of horizontal arrows to meet objects must be
+ removed.\ixcmd\mkern
+ \item \verb/\VerticalMapHeight/ and \verb/\VerticalMapDepth/ commands
+ are obsolete and are ignored: they should be removed.%
+ \ixcmd\VerticalMapHeight\ixcmd\VerticalMapDepth
+ \item Three- or four-argument uses of \verb/\HorizontalMap/,
+ \verb/\VerticalMap/ and \verb/\DiagonalMap/ must be
+ changed to five-argument uses or, preferably, to
+ \verb/\newarrow/.%
+ \ixcmd\HorizontalMap\ixcmd\VerticalMap\ixcmd\DiagonalMap
+ \item Nested \verb/\commdiag/ commands for parallel maps must be
+ changed to \verb/\pile/.\ixcmd\commdiag\ixcmd\pile
+ \index{nested diagrams}\index{parallel arrows}
+ \item Parallel maps constructed by putting them in the rows or columns
+ before and after must be moved to the correct cell and
+ (in the case of horizontals) put in a \verb/\pile/.
+ \end{itemize}
+\item[Version 2:] Horizontal arrows made to stretch to meet objects and
+``\ix{superscript}'' labels introduced; versions with banners
+dated September to December 1989.
+ \begin{itemize}
+ \item \verb/&\rTo\across3&/ now works more accurately than in
+ version~3, but should be changed to \verb/&&\rTo&&/.%
+ \ixcmd\across
+ \item {\raggedright The parameters \verb/\HorizontalMapLength/,
+ \verb/\VerticalMapHeight/, \verb/\VerticalMapDepth/,
+ \verb/\VerticalMapExtraHeight/, \verb/\VerticalMapExtraDepth/
+ and \verb/\DiagonalLineSegments/ are obsolete and are ignored:
+ they should be removed.\par}%
+ \ixcmd\HorizontalMapLength\ixcmd\VerticalMapHeight
+ \ixcmd\VerticalMapExtraDepth\ixcmd\DiagonalLineSegments
+ \ixcmd\VerticalMapDepth\ixcmd\VerticalMapExtraHeight
+ \item The \ix{labels} on southeast and northwest \ix{diagonal arrows}
+ have changed their position.
+ \verb/^/~and \verb/_/\ixcmd{^}\ixcmd{_} previously meant
+ left and right respectively for diagonals; they now mean ---
+ more logically --- above and below; \verb/</ and \verb/>/ are
+ used for left and right, respectively. Unqualified labels
+ are positioned as they originally were: the first above and
+ the second below.
+ \item Diagonal lines are constructed differently; user-defined
+ \ix{diagonal arrows} should be replaced with \verb/\ruTo(2,4)/
+ {\em etc.,} and explicit movement of them removed.
+ \item Bent lines, with \verb/\dlBent/ and \verb/\ruBentto/, currently
+ do not work. Instead \verb/\HmeetV/ must be
+ placed at the corner. Bent or half arrows will be reintroduced
+ later but with a different naming convention.%
+ \index{bent lines}\ixcmd\dlBent\ixcmd\ruBentto\ixcmd\HmeetV
+ \end{itemize}
+\item[Version 3:] Vertical maps also made to stretch to meet objects; widely
+circulated with banners dated July 1990 to April 1992.
+ \begin{itemize}
+ \item \verb/\HorizontalMap/, \verb/\VerticalMap/ and
+ \verb/\DiagonalMap/ should be replaced by \verb/\newarrow/
+ declarations.%
+ \ixcmd\HorizontalMap\ixcmd\VerticalMap\ixcmd\DiagonalMap
+ \item Negative spacing around \ix{wide objects} (used to avoid the
+ stretching of the diagram which they caused) should be
+ removed, and the \verb/tight/ option used instead.
+ This is because objects are now allowed to extend into the
+ neighbouring columns, with a check that there is enough space.
+ \item Enclosing \verb/$$...$$/ or display environments should be
+ removed, as they prevent the new display positioning options
+ from working.\ixcmd{$$}\index{display options}
+ \item Diagonal arrows with ``\ix{compass}'' names,
+ particularly the ones from \verb/extra-diagonals.tex/
+ \index{extra-diagonals.tex}\index{diagonal arrows}
+ (which must not be used any more),
+ should be changed to the new geometrical names.
+ \item The command names \verb/\lt/ and \verb/\gt/ (for $\lessthan$ and
+ $\greaterthan$) have been removed, at the request of a user
+ who considered these to be unreasonable names for internal
+ commands.\ixcmd\lt\ixcmd\gt\ixcmd{>}\ixcmd{<}%
+ \ixcmd\greaterthan\ixcmd\lessthan
+ \item The arrow commands with names like \verb/\rArr/ and \verb/\rTo/
+ now all use the default \ix{arrowheads}; the original behaviour
+ (\verb/\rArr/ used \verb/LaTeX/ and \verb/\rTo/ used \verb/vee/)
+ may be restored by changing a switch \verb/\iffalse/ in the
+ final section of the source.\ixcmd\rArr\index{vee arrowheads}%
+ \ixprotect{\LaTeX\ arrowheads}
+ \end{itemize}
+\item[Version 4:] Advertised in September 1992.
+ \begin{itemize}
+ \item The default arrowhead has been changed from \verb/vee/ to
+ \verb/LaTeX/ to ensure consistency if \verb/PostScript/
+ is not used.\index{arrowheads}
+ \item Explicit movement of \ix{diagonal arrows} vertically using
+ \verb/\raise/, \verb/\lower/ or \verb/\raisebox/
+ \ixcmd\raise\ixcmd\lower\ixcmd\raisebox
+ or horizontally by spacing commands or otherwise
+ will not work for the diagonals which are adjusted to meet
+ their endpoints.\index{stretch}
+ For the time being use either of the options
+ \verb/noPS/ or \verb/fixed/\index{PostScript}\index{fixed}
+ to suppress adjustment.
+ A~new option \verb/crab/\index{crab} will be introduced
+ shortly to allow \ix{sideways movement of arrows}.
+ \end{itemize}
+\item[Future:] The following are high on the agenda:
+ \begin{itemize}
+ \item Placing of labels at the head and tail of arrows.
+ \item Curved arrows (\verb/PostScript/ only).
+ \item Sideways movement of arrows.
+ \item An~alternative way of specifying the positions of arrows,
+ namely at the tail with signed relative co-ordinates for
+ the head, to allow emulation of
+ \person{Kris}{Rose}'s \XYpic\ixprotect\XYpic\ and
+ \person{Michael}{Spivak}'s \LAMSTeX\ixprotect\LAMSTeX.
+ \item Shifting objects, by specifying the left or right width.
+ \item Option to rotate labels on diagonals or leave them horizontal.
+ \item Application to electronic circuit diagrams.
+ \end{itemize}
+\end{description}
+
+Suggestions for improvements and further applications ({\em e.g.\/} proof nets,
+Petri nets and circuit diagrams) are welcome.
+
+%==========================================================================
+
+\section{Availability}\label{get}
+
+
+The diagram package is currently available as a single
+112kb\footnote{Without comments; the development version is about 300kb.}
+printable \TeX\ source file which is compatible with both \LaTeX\
+and {\tt plain} \TeX. It loads the \LaTeX\ {\tt line10} font as \verb/\tenln/
+(its \LaTeX\ name) and also defines some (exotic) arrow commands in terms
+the AMS symbols, but if these are to be used then the
+ \ifx\usepackage\undefined
+ file \verb/mssymb/
+ \else
+ package \verb/amssymb/
+ \fi
+must be loaded separately.
+
+\index{anonymous FTP}
+It~is easiest to get this package by anonymous \ix{FTP}.
+This stands for ``\ix{file transfer protocol}'';
+it is a way in which you can log on interactively to my computer and fetch
+(some of) my files. A~very large amount of software is now freely available
+by this method, so it is well worth putting pressure on your system
+administrator to get your machines connected.
+
+The authoritative version of the package may be found at the FTP address
+\begin{quote}
+{\tt ftp://ftp.dcs.qmw.ac.uk/pub/tex/contrib/pt/diagrams}
+\end{quote}
+It may also be obtained from the \ix{Comprehensive \TeX\ Archive Network}
+(\ix{CTAN)} at any of the sites
+\begin{quote}
+ \begin{tabular}{llll}
+ ftp.adfa.oz.au &Australia& /pub/tex/ctan\\
+ ftp.cs.rmit.edu.au &Australia& /tex-archive\\
+ ftp.muni.cz &Czech Republic& /pub/tex/CTAN\\
+ ftp.tex.ac.uk &England& /tex-archive\\% (/pub/tex /pub/archive)\\
+ ftp.loria.fr &France& /pub/unix/tex/ctan\\
+ ftp.uni-bielefeld.de &Germany& /pub/tex\\
+ ftp.uni-stuttgart.de &Germany& /tex-archive (/pub/tex)\\
+ ftp.dante.de &Germany& /tex-archive\\% (/pub/tex /pub/archive)\\
+ ftp.center.osaka-u.ac.jp &Japan& /CTAN\\
+ wuarchive.wustl.edu &Missouri, USA& /packages/TeX\\
+ ftp.cs.ruu.nl &Netherlands& /pub/tex-archive\\
+ ftp.duke.edu &North Carolina, USA& /tex-archive\\
+ sunsite.unc.edu &North Carolina, USA& /pub/packages/TeX\\
+ ftpserver.nus.sg &Singapore& /pub/zi/TeX\\
+ nic.switch.ch &Switzerland& /mirror/tex\\
+ dongpo.math.ncu.edu.tw &Taiwan& /tex-archive\\
+ ftp.uu.net &Virginia, USA& /pub/text-processing/TeX\\
+ ftp.shsu.edu &Texas, USA& /tex-archive\\% (/pub/tex /pub/archive)\\
+ \end{tabular}
+\end{quote}
+where the root of the archive is the given directory and my package is
+\begin{quote}
+ {\tt macros/generic/diagrams/Taylor/diagrams.tex}
+\end{quote}
+relative to this.
+
+The ``\verb/archie/''\index{archie} utility is extremely useful as a way
+of locating software and other information on the \ix{Internet}.
+You just give it (part of) the name of the file you want
+({\em e.g.}~``diagram'') and it will tell you where files of that name
+are located in numerous public \ix{FTP} archives around the world.
+Beware, however, that many of them are just ``\ix{magpies' nests}'' ---
+they collect things from other places without verifying their
+authenticity or keeping them up to date.\index{anonymous FTP}
+
+If you are unable to use FTP it is possible to get the package
+(and indeed anything you can get by ftp) by electronic mail.
+I~do not recommend this method, because it is susceptible to
+corruption, and you have to concatenate the files and remove the
+mail headers. Send the following message to
+\verb/<ftpmail@doc.ic.ac.uk>/:
+\begin{quote}
+\begin{verbatim}
+open ftp.dcs.qmw.ac.uk
+cd pub/tex/pt/diagrams
+get diagrams-V4-news
+get diagrams.tex
+get diagrams-manual.tex
+quit
+\end{verbatim}
+\end{quote}
+You will get an acknowledgement message first, followed by the files,
+and finally a job log file.
+The files may be split up into several messages.
+%in which case the \verb/Subject:/
+%lines will begin \verb/[part /$n$\verb/ of /$m$\verb/]/.
+%
+\iffalse Other availability information will be added later, after checking.
+Also available from
+archive.cs.ruu.nl [131.211.80.17] /pub/TEX/DIAGRAM/diagrams.tex
+%
+Other \TeX\ FTP sources:
+e-math.ams.com [130.44.1.100] for AMS symbols and AMS-\LaTeX.
+ftp.cs.umb.edu [192.12.26.23] for Karl Berry's web-to-C \TeX\ port.
+\fi
+
+\makeatletter\pt@input{manual.ind}{}{}
+%============================================================================
+\end{document}
+
+% Ideas for future editions of this manual:
+
+% Use bezier.sty and the origin option in a picture environment to draw
+% braids on top of a diagram - Robert Seely had an example.
+
+% I haven't composed the example yet.
+%\newif\ifHaveBezier\HaveBeziertrue
+%\pt@input{bezier.sty}%
+%{^^JYou don't have bezier.sty. That's a pity, because I wanted to show you an
+%^^Jexample of drawing curved lines on top of a diagram. We'll do without it.}%
+%\HaveBezierfalse
+
+% Use \matrix or array environment to put long objects on two lines within
+% a diagram. LFPP.tex has a suitable example.
+
+% Commutative diagram of posets. Example in my thesis (fig 2.2.13) (5.2.2)
+
+% new sections:
+% other TeX macros of mine
+% resource usage
+% list of errors
+% how to draw {\em nice\/} diagrams
+
+% FTP instructions \ No newline at end of file
diff --git a/macros/generic/diagrams/taylor/msg1992.html b/macros/generic/diagrams/taylor/msg1992.html
new file mode 100644
index 0000000000..14158b7260
--- /dev/null
+++ b/macros/generic/diagrams/taylor/msg1992.html
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+<title> Commutative Diagrams in TeX</title>
+
+<h1 align="center">Commutative Diagrams in TeX </h1>
+
+<h3 align="center">Paul Taylor </h3>
+
+<h3 align="center">September 1992 </h3>
+
+
+
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+
+<div class="p"><!----></div>
+
+
+
+
+
+
+<div class="p"><!----></div>
+
+<div class="p"><!----></div>
+
+
+
+<div class="p"><!----></div>
+
+
+
+<div class="p"><!----></div>
+
+
+<div class="p"><!----></div>
+
+
+
+<div class="p"><!----></div>
+
+
+
+
+
+
+<div class="p"><!----></div>
+
+
+<div class="p"><!----></div>
+
+
+<h2>Message sent to registered users in September 1992</h2>
+
+<div class="p"><!----></div>
+This message brings news of the development of my <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;package for
+drawing "commutative" diagrams, which is now widely used in the
+category theory and theoretical computer science communities. It is
+being sent directly to all of the users I know of (who have requested
+it by electronic mail or FTP from me, or asked questions about it),
+but as I know the package has been passed on, I would be grateful if
+you would <em>copy this message to anyone to whom you have given
+ the package itself.</em>
+
+<div class="p"><!----></div>
+The package was originally advertised on the "types" and
+"categories" electronic mailing lists in July 1990. In the following
+eighteen months some fixing of bugs took place, but there was little
+substantial change.
+
+<div class="p"><!----></div>
+Since April 1992, I have re-written most of the code, largely with a
+view to improving the geometrical layout of the diagrams. Before
+completing this work and calling it version 4, I would like some
+feedback from users.
+
+<div class="p"><!----></div>
+One of the areas which I have neglected in the past (largely because
+<span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;makes it so difficult) is diagonal arrows. The code for drawing
+these using <span class="roman">L</span><sup><span class="roman">A</span></sup><span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;line segments has been re-written: now the closest
+available slope is chosen automatically and the commands have names
+similar to the horizontals and verticals.
+
+<div class="p"><!----></div>
+However to do a better job of diagonals (and in future to support
+curved lines) some extension to <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;is needed. Being extensions they
+are necessarily not standard. Three possibilities are:
+
+<ul>
+<li> additional fonts (as, for example, used by Spivak's Lamstex).
+ However my experience of design-size fonts and linear logic symbols
+ suggests that for users without expert knowledge or control of their
+ local <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;systems this is more trouble than it's worth.
+<div class="p"><!----></div>
+</li>
+
+<li> PostScript is, I believe, now almost universally used as the
+ language in which <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;documents are sent to a printer. PS commands
+ can be embedded in DVI files and incorporated in the PS translation
+ without extra system or user files or any user intervention. This is
+ to some extent dependent on which DVI<font face="symbol">®</font
+>PS translator is used. In
+ the new version this is exploited in an option to implement
+ diagonals by rotating horizontals, which works with Tomas Rokicki's
+ "dvips".
+<div class="p"><!----></div>
+</li>
+
+<li> TPIC is a graphics extension of <span class="roman">T</span><sub><span class="roman">E</span></sub><span class="roman">X</span>&nbsp;which uses a simpler set
+ of embedded commands. These can be used to draw diagonal lines and
+ curves but not to perform rotations; they are, however, understood
+ by Vojta's "xdvi" as well. Another option in the new version uses
+ these to draw diagonal lines.
+<div class="p"><!----></div>
+</li>
+</ul>
+Besides diagonals, the code for adjusting horizontal and vertical
+arrows has been completely rewritten and does a much better job of the
+geometry. Many of the problems with alignment, positioning and gaps
+have been fixed automatically, and greater control is given to the
+user to adjust those which cannot be. There are also several new
+options for the placement of the finished diagram on the page.
+
+<div class="p"><!----></div>
+Arrow commands are now declared in a much simpler way. The declaration
+
+<pre>
+&nbsp;\newarrow{CrossedInto}{hook}-+-&#62;
+
+</pre>
+is now all that is needed to define the example <tt>\rCrossedInto</tt>
+in the manual, along with the corresponding left, down, up and
+diagonal commands. Another option makes a consistent selection of
+arrowheads for all arrows, from a choice of vee, LaTeX, curlyvee,
+triangle and blacktriangle.
+
+<div class="p"><!----></div>
+So much for selling you the new version. The reason for mailing you
+and asking for comments before completing what I intend to do for
+version 4 is that I want to get feedback on the following questions:
+
+<div class="p"><!----></div>
+
+<ul>
+<li> Can you use FTP (file transfer protocol)? This is the easiest
+ method of distribution for me and for you, and there is now a huge
+ volume of public domain software available by this method. My
+ archive is called <tt>ftp.dcs.qmw.ac.uk</tt>
+ and the diagrams package is in the directory /pub/tex/contrib/pt/diagrams.
+ Please try to fetch the new version and manual by this method.
+<div class="p"><!----></div>
+</li>
+
+<li> If you can't use FTP, and your electronic mail passes via
+ non-ASCII machines (particularly BITNET), what characters tend to
+ get corrupted? The new version uses a restricted character set to
+ avoid this problem.
+<div class="p"><!----></div>
+</li>
+
+<li> Do you have available for printing final copy a printer which
+ understands Adobe PostScript, for example an Apple or Sun
+ laserwriter? Who is the author of the DVI-&#62; PS translation program
+ you use? Please fetch the new version, try the PostScript option and
+ tell me if you have any difficulty printing. (You may have to change
+ the <tt>\verbatim@ps@special</tt> macro if you don't use Rokicki's
+ dvips: if so, please send me details.) You can preview with a PS
+ previewer such as PageView under OpenWindows or
+ GhostView/GhostScript under Xwindows.
+<div class="p"><!----></div>
+</li>
+
+<li> Do your DVI translators and previewers understand TPIC
+ <tt>\special</tt>s (as used in eepic.sty)? Please try the TPIC
+ option. I would like to know whether it is worth putting effort into
+ PostScript, TPIC or some other method.
+<div class="p"><!----></div>
+</li>
+
+<li> Have you defined your own arrow commands using
+ <tt>\HorizontalMap</tt>, <tt>\VerticalMap</tt> or <tt>\DiagonalMap</tt>?
+ Please use "grep alMap *.tex *.sty" or some similar command to
+ find out, and tell me if you have used any components other than
+ those in the source of version&nbsp;3. It is in your interests to do
+ this, because <tt>\newarrow</tt> defines arrow commands in a
+ different way.
+<div class="p"><!----></div>
+</li>
+
+<li> Please tell me if you have any difficulty adapting to the new
+ version, or any general comments about doing so which might be of
+ benefit to other users.
+<div class="p"><!----></div>
+</li>
+
+<li> Other comments: have you used other packages for drawing
+ diagrams? Do you have applications for my package other than the
+ categorical diagrams for which it was designed? What do you see as
+ the major limitations of the package? What persuaded you to use it,
+ or not to use it?
+<div class="p"><!----></div>
+</li>
+</ul>
+
+<div class="p"><!----></div>