summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-12 23:51:54 +0000
committerKarl Berry <karl@freefriends.org>2006-01-12 23:51:54 +0000
commit5a275789faf2cac524744b203794259d7b974c36 (patch)
tree9f8fb2c5fb5badff5c185d0d164bead31ca8fb65 /Master/texmf-dist
parentc11a98e10de0410a50337e5ab4e3b63b210eec13 (diff)
barr
git-svn-id: svn://tug.org/texlive/trunk@693 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/tex/latex/barr/diagram.tex1048
-rw-r--r--Master/texmf-dist/tex/latex/barr/diagxy.tex952
2 files changed, 2000 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/barr/diagram.tex b/Master/texmf-dist/tex/latex/barr/diagram.tex
new file mode 100644
index 00000000000..2a322759d3b
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/barr/diagram.tex
@@ -0,0 +1,1048 @@
+% This should appear in a file named diagram.tex
+% Copyright 1988,1989 Michael Barr
+% Department of Mathematics and Statistics
+% McGill University
+% 805 Sherbrooke St., W
+% Montreal, Quebec, Canada
+% H3P 1S4
+%
+% barr@triples.math.mcgill.ca
+%
+% All commercial rights reserved. May be freely distributed
+% and used with the following exceptions:
+% 1. No commercial use without explicit permission.
+% 2. It may not be used by any employee of a telephone
+% company.
+% 3. It may not be distributed without this notice.
+%
+% Last revised 91-05-04
+
+% Ascii character test:
+% 32: 33: ! 34: " 35: # 36: $ 37: % 38: & 39: '
+% 40: ( 41: ) 42: * 43: + 44: , 45: - 46: . 47: /
+% 48: 0 49: 1 50: 2 51: 3 52: 4 53: 5 54: 6 55: 7
+% 56: 8 57: 9 58: : 59: ; 60: < 61: = 62: > 63: ?
+% 64: @ 65: A 66: B 67: C 68: D 69: E 70: F 71: G
+% 72: H 73: I 74: J 75: K 76: L 77: M 78: N 79: O
+% 80: P 81: Q 82: R 83: S 84: T 85: U 86: V 87: W
+% 88: X 89: Y 90: Z 91: [ 92: \ 93: ] 94: ^ 95: _
+% 96: ` 97: a 98: b 99: c 100: d 101: e 102: f 103: g
+% 104: h 105: i 106: j 107: k 108: l 109: m 110: n 111: o
+% 112: p 113: q 114: r 115: s 116: t 117: u 118: v 119: w
+% 120: x 121: y 122: z 123: { 124: | 125: } 126: ~
+
+
+\makeatletter
+
+\def\diagram{\m@th\leftwidth=\z@ \rightwidth=\z@ \topheight=\z@
+\botheight=\z@ \setbox\@picbox\hbox\bgroup}
+
+\def\enddiagram{\egroup\wd\@picbox\rightwidth\unitlength
+\ht\@picbox\topheight\unitlength \dp\@picbox\botheight\unitlength
+\hskip\leftwidth\unitlength\box\@picbox}
+
+\def\bfig{\begin{diagram}}
+\def\efig{\end{diagram}}
+\newcount\wideness \newcount\leftwidth \newcount\rightwidth
+\newcount\highness \newcount\topheight \newcount\botheight
+
+\def\ratchet#1#2{\ifnum#1<#2 \global #1=#2 \fi}
+
+\def\putbox(#1,#2)#3{%
+\horsize{\wideness}{#3} \divide\wideness by 2
+{\advance\wideness by #1 \ratchet{\rightwidth}{\wideness}}
+{\advance\wideness by -#1 \ratchet{\leftwidth}{\wideness}}
+\vertsize{\highness}{#3} \divide\highness by 2
+{\advance\highness by #2 \ratchet{\topheight}{\highness}}
+{\advance\highness by -#2 \ratchet{\botheight}{\highness}}
+\put(#1,#2){\makebox(0,0){$#3$}}}
+
+\def\putlbox(#1,#2)#3{%
+\horsize{\wideness}{#3}
+{\advance\wideness by #1 \ratchet{\rightwidth}{\wideness}}
+{\ratchet{\leftwidth}{-#1}}
+\vertsize{\highness}{#3} \divide\highness by 2
+{\advance\highness by #2 \ratchet{\topheight}{\highness}}
+{\advance\highness by -#2 \ratchet{\botheight}{\highness}}
+\put(#1,#2){\makebox(0,0)[l]{$#3$}}}
+
+\def\putrbox(#1,#2)#3{%
+\horsize{\wideness}{#3}
+{\ratchet{\rightwidth}{#1}}
+{\advance\wideness by -#1 \ratchet{\leftwidth}{\wideness}}
+\vertsize{\highness}{#3} \divide\highness by 2
+{\advance\highness by #2 \ratchet{\topheight}{\highness}}
+{\advance\highness by -#2 \ratchet{\botheight}{\highness}}
+\put(#1,#2){\makebox(0,0)[r]{$#3$}}}
+
+
+\def\adjust[#1]{} % For compatibility
+
+\newcount \coefa
+\newcount \coefb
+\newcount \coefc
+\newcount\tempcounta
+\newcount\tempcountb
+\newcount\tempcountc
+\newcount\tempcountd
+\newcount\xext
+\newcount\yext
+\newcount\xoff
+\newcount\yoff
+\newcount\gap%
+\newcount\arrowtypea
+\newcount\arrowtypeb
+\newcount\arrowtypec
+\newcount\arrowtyped
+\newcount\arrowtypee
+\newcount\height
+\newcount\width
+\newcount\xpos
+\newcount\ypos
+\newcount\run
+\newcount\rise
+\newcount\arrowlength
+\newcount\halflength
+\newcount\arrowtype
+\newdimen\tempdimen
+\newdimen\xlen
+\newdimen\ylen
+\newsavebox{\tempboxa}%
+\newsavebox{\tempboxb}%
+\newsavebox{\tempboxc}%
+
+\newdimen\w@dth
+
+\def\setw@dth#1#2{\setbox\z@\hbox{\m@th$#1$}\w@dth=\wd\z@
+\setbox\@ne\hbox{\m@th$#2$}\ifnum\w@dth<\wd\@ne \w@dth=\wd\@ne \fi
+\advance\w@dth by 1.2em}
+
+%The definitions below look more elaborate than they need to be.
+%The reason is that an empty asscript will still cause extra vertical
+%spacing and the only way to avoid ugly extra space seems to be using
+%some such method as this.
+
+\def\t@^#1_#2{\allowbreak\def\n@one{#1}\def\n@two{#2}\mathrel
+{\setw@dth{#1}{#2}
+\mathop{\hbox to \w@dth{\rightarrowfill}}\limits
+\ifx\n@one\empty\else ^{\box\z@}\fi
+\ifx\n@two\empty\else _{\box\@ne}\fi}}
+%\def\t@^#1_#2{\mathrel{\mathop{\hbox{\rightarrowfill}}\limits
+%^{\mkern12mu#1\mkern12mu}_{\mkern12mu#2\mkern12mu}}}
+\def\t@@^#1{\@ifnextchar_{\t@^{#1}}{\t@^{#1}_{}}}
+\def\to{\@ifnextchar^{\t@@}{\t@@^{}}}
+
+\def\t@left^#1_#2{\def\n@one{#1}\def\n@two{#2}\mathrel{\setw@dth{#1}{#2}
+\mathop{\hbox to \w@dth{\leftarrowfill}}\limits
+\ifx\n@one\empty\else ^{\box\z@}\fi
+\ifx\n@two\empty\else _{\box\@ne}\fi}}
+%\def\t@left^#1_#2{\mathrel{\mathop{\hbox{\leftarrowfill}}\limits
+%^{\mkern12mu#1\mkern12mu}_{\mkern12mu#2\mkern12mu}}}
+\def\t@@left^#1{\@ifnextchar_{\t@left^{#1}}{\t@left^{#1}_{}}}
+\def\toleft{\@ifnextchar^{\t@@left}{\t@@left^{}}}
+
+\def\two@^#1_#2{\allowbreak
+\def\n@one{#1}\def\n@two{#2}\mathrel{\setw@dth{#1}{#2}
+\mathop{\vcenter{\lineskip\z@\baselineskip\z@
+ \hbox to \w@dth{\rightarrowfill}%
+ \hbox to \w@dth{\rightarrowfill}}%
+ }\limits
+\ifx\n@one\empty\else ^{\box\z@}\fi
+\ifx\n@two\empty\else _{\box\@ne}\fi}}
+\def\tw@@^#1{\@ifnextchar _{\two@^{#1}}{\two@^{#1}_{}}}
+\def\two{\@ifnextchar ^{\tw@@}{\tw@@^{}}}
+
+\def\tofr@^#1_#2{\def\n@one{#1}\def\n@two{#2}\mathrel{\setw@dth{#1}{#2}
+\mathop{\vcenter{\hbox to \w@dth{\rightarrowfill}\kern-1.7ex
+ \hbox to \w@dth{\leftarrowfill}}%
+ }\limits
+\ifx\n@one\empty\else ^{\box\z@}\fi
+\ifx\n@two\empty\else _{\box\@ne}\fi}}
+\def\t@fr@^#1{\@ifnextchar_ {\tofr@^{#1}}{\tofr@^{#1}_{}}}
+\def\tofro{\@ifnextchar^ {\t@fr@}{\t@fr@^{}}}
+
+\def\epi{\mathop{\mathchar"221\mkern -12mu\mathchar"221}\limits}
+\def\leftepi{\mathop{\mathchar"220\mkern -12mu\mathchar"220}\limits}
+\def\mon{\mathop{\m@th\hbox to
+ 14.6\P@{\lasyb\char'51\hskip-2.1\P@$\arrext$\hss
+$\mathord\rightarrow$}}\limits} % width of \epi
+\def\leftmono{\mathrel{\m@th\hbox to
+14.6\P@{$\mathord\leftarrow$\hss$\arrext$\hskip-2.1\P@\lasyb\char'50%
+}}\limits} % width of \epi
+\mathchardef\arrext="0200 % amr minus for arrow extension (see \into)
+
+
+\setlength{\unitlength}{.01em}%
+\def\settypes(#1,#2,#3){\arrowtypea#1 \arrowtypeb#2 \arrowtypec#3}
+\def\settoheight#1#2{\setbox\@tempboxa\hbox{#2}#1\ht\@tempboxa\relax}%
+\def\settodepth#1#2{\setbox\@tempboxa\hbox{#2}#1\dp\@tempboxa\relax}%
+\def\settokens`#1`#2`#3`#4`{%
+ \def\tokena{#1}\def\tokenb{#2}\def\tokenc{#3}\def\tokend{#4}}
+\def\setsqparms[#1`#2`#3`#4;#5`#6]{%
+\arrowtypea #1
+\arrowtypeb #2
+\arrowtypec #3
+\arrowtyped #4
+\width #5
+\height #6
+}
+\def\setpos(#1,#2){\xpos=#1 \ypos#2}
+
+
+
+\def\settriparms[#1`#2`#3;#4]{\settripairparms[#1`#2`#3`1`1;#4]}%
+
+\def\settripairparms[#1`#2`#3`#4`#5;#6]{%
+\arrowtypea #1
+\arrowtypeb #2
+\arrowtypec #3
+\arrowtyped #4
+\arrowtypee #5
+\width #6
+\height #6
+}
+
+\def\resetparms{\settripairparms[1`1`1`1`1;500]\width 500}%default values%
+
+\resetparms
+
+\def\mvector(#1,#2)#3{%%
+\put(0,0){\vector(#1,#2){#3}}%
+\put(0,0){\vector(#1,#2){26}}%
+}
+\def\evector(#1,#2)#3{{%%
+\arrowlength #3
+\put(0,0){\vector(#1,#2){\arrowlength}}%
+\advance \arrowlength by-30
+\put(0,0){\vector(#1,#2){\arrowlength}}%
+}}
+
+\def\horsize#1#2{%
+\settowidth{\tempdimen}{$#2$}%
+#1=\tempdimen
+\divide #1 by\unitlength
+}
+
+\def\vertsize#1#2{%
+\settoheight{\tempdimen}{$#2$}%
+#1=\tempdimen
+\settodepth{\tempdimen}{$#2$}%
+\advance #1 by\tempdimen
+\divide #1 by\unitlength
+}
+
+\def\putvector(#1,#2)(#3,#4)#5#6{{%
+\ifnum3<\arrowtype
+\putdashvector(#1,#2)(#3,#4)#5\arrowtype
+\else
+\ifnum\arrowtype<-3
+\putdashvector(#1,#2)(#3,#4)#5\arrowtype
+\else
+\xpos=#1
+\ypos=#2
+\run=#3
+\rise=#4
+\arrowlength=#5
+\ifnum \arrowtype<0
+ \ifnum \run=0
+ \advance \ypos by-\arrowlength
+ \else
+ \tempcounta \arrowlength
+ \multiply \tempcounta by\rise
+ \divide \tempcounta by\run
+ \ifnum\run>0
+ \advance \xpos by\arrowlength
+ \advance \ypos by\tempcounta
+ \else
+ \advance \xpos by-\arrowlength
+ \advance \ypos by-\tempcounta
+ \fi
+ \fi
+ \multiply \arrowtype by-1
+ \multiply \rise by-1
+ \multiply \run by-1
+\fi
+\ifcase \arrowtype
+\or \put(\xpos,\ypos){\vector(\run,\rise){\arrowlength}}%
+\or \put(\xpos,\ypos){\mvector(\run,\rise)\arrowlength}%
+\or \put(\xpos,\ypos){\evector(\run,\rise){\arrowlength}}%
+\fi\fi\fi
+}}
+
+\def\putsplitvector(#1,#2)#3#4{%%
+\xpos #1
+\ypos #2
+\arrowtype #4
+\halflength #3
+\arrowlength #3
+\gap 140
+\advance \halflength by-\gap
+\divide \halflength by2
+\ifnum\arrowtype>0
+ \ifcase \arrowtype
+ \or \put(\xpos,\ypos){\line(0,-1){\halflength}}%
+ \advance\ypos by-\halflength
+ \advance\ypos by-\gap
+ \put(\xpos,\ypos){\vector(0,-1){\halflength}}%
+ \or \put(\xpos,\ypos){\line(0,-1)\halflength}%
+ \put(\xpos,\ypos){\vector(0,-1)3}%
+ \advance\ypos by-\halflength
+ \advance\ypos by-\gap
+ \put(\xpos,\ypos){\vector(0,-1){\halflength}}%
+ \or \put(\xpos,\ypos){\line(0,-1)\halflength}%
+ \advance\ypos by-\halflength
+ \advance\ypos by-\gap
+ \put(\xpos,\ypos){\evector(0,-1){\halflength}}%
+ \fi
+\else \arrowtype=-\arrowtype
+ \ifcase\arrowtype
+ \or \advance \ypos by-\arrowlength
+ \put(\xpos,\ypos){\line(0,1){\halflength}}%
+ \advance\ypos by\halflength
+ \advance\ypos by\gap
+ \put(\xpos,\ypos){\vector(0,1){\halflength}}%
+ \or \advance \ypos by-\arrowlength
+ \put(\xpos,\ypos){\line(0,1)\halflength}%
+ \put(\xpos,\ypos){\vector(0,1)3}%
+ \advance\ypos by\halflength
+ \advance\ypos by\gap
+ \put(\xpos,\ypos){\vector(0,1){\halflength}}%
+ \or \advance \ypos by-\arrowlength
+ \put(\xpos,\ypos){\line(0,1)\halflength}%
+ \advance\ypos by\halflength
+ \advance\ypos by\gap
+ \put(\xpos,\ypos){\evector(0,1){\halflength}}%
+ \fi
+\fi
+}
+
+\def\putmorphism(#1)(#2,#3)[#4`#5`#6]#7#8#9{{%
+\run #2
+\rise #3
+\ifnum\rise=0
+ \puthmorphism(#1)[#4`#5`#6]{#7}{#8}#9%
+\else\ifnum\run=0
+ \putvmorphism(#1)[#4`#5`#6]{#7}{#8}#9%
+\else
+\setpos(#1)%
+\arrowlength #7
+\arrowtype #8
+\ifnum\run=0
+\else\ifnum\rise=0
+\else
+\ifnum\run>0
+ \coefa=1
+\else
+ \coefa=-1
+\fi
+\ifnum\arrowtype>0
+ \coefb=0
+ \coefc=-1
+\else
+ \coefb=\coefa
+ \coefc=1
+ \arrowtype=-\arrowtype
+\fi
+\width=2
+\multiply \width by\run
+\divide \width by\rise
+\ifnum \width<0 \width=-\width\fi
+\advance\width by60
+\if l#9 \width=-\width\fi
+\putbox(\xpos,\ypos){#4}% %node 1
+{\multiply \coefa by\arrowlength% %node 2
+\advance\xpos by\coefa
+\multiply \coefa by\rise
+\divide \coefa by\run
+\advance \ypos by\coefa
+\putbox(\xpos,\ypos){#5} }%
+{\multiply \coefa by\arrowlength% %label
+\divide \coefa by2
+\advance \xpos by\coefa
+\advance \xpos by\width
+\multiply \coefa by\rise
+\divide \coefa by\run
+\advance \ypos by\coefa
+\if l#9%
+ \putrbox(\xpos,\ypos){#6}%
+\else\if r#9%
+ \putlbox(\xpos,\ypos){#6}%
+\fi\fi }%
+{\multiply \rise by-\coefc% %arrow
+\multiply \run by-\coefc
+\multiply \coefb by\arrowlength
+\advance \xpos by\coefb
+\multiply \coefb by\rise
+\divide \coefb by\run
+\advance \ypos by\coefb
+\multiply \coefc by70
+\advance \ypos by\coefc
+\multiply \coefc by\run
+\divide \coefc by\rise
+\advance \xpos by\coefc
+\multiply \coefa by140
+\multiply \coefa by\run
+\divide \coefa by\rise
+\advance \arrowlength by\coefa
+\ifcase\arrowtype
+\or \put(\xpos,\ypos){\vector(\run,\rise){\arrowlength}}%
+\or \put(\xpos,\ypos){\mvector(\run,\rise){\arrowlength}}%
+\or \put(\xpos,\ypos){\evector(\run,\rise){\arrowlength}}%
+\fi}\fi\fi\fi\fi}}
+
+
+\newcount\numbdashes \newcount\lengthdash \newcount\increment
+
+\def\howmanydashes{% Actually returns both number and length
+\numbdashes=\arrowlength \lengthdash=40
+\divide\numbdashes by \lengthdash
+\lengthdash=\arrowlength
+\divide\lengthdash by \numbdashes
+%This futzing around is to minimize round-off error.
+\increment=\lengthdash
+\multiply\lengthdash by 3
+\divide\lengthdash by 5
+}
+
+\def\putdashvector(#1)(#2,#3)#4#5{%
+\ifnum#3=0 \putdashhvector(#1){#4}#5
+\else
+\ifnum#2=0
+\putdashvvector(#1){#4}#5\fi\fi}
+
+\def\putdashhvector(#1,#2)#3#4{{%
+\arrowlength=#3 \howmanydashes
+\multiput(#1,#2)(\increment,0){\numbdashes}%
+{\vrule height .4pt width \lengthdash\unitlength}
+\arrowtype=#4 \xpos=#1
+\ifnum\arrowtype<0 \advance\arrowtype by 7 \fi
+\ifcase\arrowtype
+\or \advance\xpos by 10
+ \put(\xpos,#2){\vector(-1,0){\lengthdash}}
+ \advance\xpos by 40
+ \put(\xpos,#2){\vector(-1,0){\lengthdash}}
+\or \advance \xpos by 10
+ \put(\xpos,#2){\vector(-1,0){\lengthdash}}
+ \advance\xpos by \arrowlength
+ \advance\xpos by -50
+ \put(\xpos,#2){\vector(-1,0){\lengthdash}}
+\or \advance\xpos by 10
+ \put(\xpos,#2){\vector(-1,0){\lengthdash}}
+\or \advance\xpos by \arrowlength
+ \advance\xpos by -\lengthdash
+ \put(\xpos,#2){\vector(1,0){\lengthdash}}
+\or {\advance\xpos by 10
+ \put(\xpos,#2){\vector(1,0){\lengthdash}}}
+ \advance\xpos by \arrowlength
+ \advance\xpos by -\lengthdash
+ \put(\xpos,#2){\vector(1,0){\lengthdash}}
+\or \advance\xpos by \arrowlength
+ \advance\xpos by -\lengthdash
+ \put(\xpos,#2){\vector(1,0){\lengthdash}}
+ \advance\xpos by -40
+ \put(\xpos,#2){\vector(1,0){\lengthdash}}
+ \fi
+}}
+
+\def\putdashvvector(#1,#2)#3#4{{%
+\arrowlength=#3 \howmanydashes
+\ypos=#2 \advance\ypos by -\arrowlength
+\multiput(#1,#2)(0,\increment){\numbdashes}%
+ {\vrule width .4pt height \lengthdash\unitlength}
+\arrowtype=#4 \ypos=#2
+\ifnum\arrowtype<0 \advance\arrowtype by 7 \fi
+\ifcase\arrowtype
+\or \advance\ypos by \arrowlength \advance\ypos by -40
+ \put(#1,\ypos){\vector(0,1){\lengthdash}}
+ \advance\ypos by -40
+ \put(#1,\ypos){\vector(0,1){\lengthdash}}
+\or \advance\ypos by 10
+ \put(#1,\ypos){\vector(0,1){\lengthdash}}
+ \advance\ypos by \arrowlength \advance\ypos by -40
+ \put(#1,\ypos){\vector(0,1){\lengthdash}}
+\or \advance\ypos by \arrowlength \advance\ypos by -40
+ \put(#1,\ypos){\vector(0,1){\lengthdash}}
+\or \advance\ypos by 10
+ \put(#1,\ypos){\vector(0,-1){\lengthdash}}
+\or \advance\ypos by 10
+ \put(#1,\ypos){\vector(0,-1){\lengthdash}}
+ \advance\ypos by \arrowlength \advance\ypos by -40
+ \put(#1,\ypos){\vector(0,-1){\lengthdash}}
+\or \advance\ypos by 10
+ \put(#1,\ypos){\vector(0,-1){\lengthdash}}
+ \advance\ypos by 40
+ \put(#1,\ypos){\vector(0,-1){\lengthdash}}
+\fi
+}}
+
+\def\puthmorphism(#1,#2)[#3`#4`#5]#6#7#8{{%
+\xpos #1
+\ypos #2
+\width #6
+\arrowlength #6
+\arrowtype=#7
+\putbox(\xpos,\ypos){#3\vphantom{#4}}%
+{\advance \xpos by\arrowlength
+\putbox(\xpos,\ypos){\vphantom{#3}#4}}%
+\horsize{\tempcounta}{#3}%
+\horsize{\tempcountb}{#4}%
+\divide \tempcounta by2
+\divide \tempcountb by2
+\advance \tempcounta by30
+\advance \tempcountb by30
+\advance \xpos by\tempcounta
+\advance \arrowlength by-\tempcounta
+\advance \arrowlength by-\tempcountb
+\putvector(\xpos,\ypos)(1,0)\arrowlength\arrowtype
+\divide \arrowlength by2
+\advance \xpos by\arrowlength
+\vertsize{\tempcounta}{#5}%
+\divide\tempcounta by2
+\advance \tempcounta by20
+\if a#8 %
+ \advance \ypos by\tempcounta
+ \putbox(\xpos,\ypos){#5}%
+\else
+ \advance \ypos by-\tempcounta
+ \putbox(\xpos,\ypos){#5}%
+\fi}}
+
+\def\putvmorphism(#1,#2)[#3`#4`#5]#6#7#8{{%
+\xpos #1
+\ypos #2
+\arrowlength #6
+\arrowtype #7
+\settowidth{\xlen}{$#5$}%
+\putbox(\xpos,\ypos){#3}%
+{\advance \ypos by-\arrowlength
+\putbox(\xpos,\ypos){#4}}%
+{\advance\arrowlength by-140
+\advance \ypos by-70
+\ifdim\xlen>0pt
+ \if m#8%
+ \putsplitvector(\xpos,\ypos)\arrowlength\arrowtype
+ \else
+ \putvector(\xpos,\ypos)(0,-1)\arrowlength\arrowtype
+ \fi
+\else
+ \putvector(\xpos,\ypos)(0,-1)\arrowlength\arrowtype
+\fi}%
+\ifdim\xlen>0pt
+ \divide \arrowlength by2
+ \advance\ypos by-\arrowlength
+ \if l#8%
+ \advance \xpos by-40
+ \putrbox(\xpos,\ypos){#5}%
+ \else\if r#8%
+ \advance \xpos by40
+ \putlbox(\xpos,\ypos){#5}%
+ \else
+ \putbox(\xpos,\ypos){#5}%
+ \fi\fi
+\fi
+}}
+
+\def\putsquarep<#1>(#2)[#3;#4`#5`#6`#7]{{%
+\setsqparms[#1]%
+\setpos(#2)%
+\settokens`#3`%
+\puthmorphism(\xpos,\ypos)[\tokenc`\tokend`{#7}]{\width}{\arrowtyped}b%
+\advance\ypos by \height
+\puthmorphism(\xpos,\ypos)[\tokena`\tokenb`{#4}]{\width}{\arrowtypea}a%
+\putvmorphism(\xpos,\ypos)[``{#5}]{\height}{\arrowtypeb}l%
+\advance\xpos by \width
+\putvmorphism(\xpos,\ypos)[``{#6}]{\height}{\arrowtypec}r%
+}}
+
+\def\putsquare{\@ifnextchar <{\putsquarep}{\putsquarep%
+ <\arrowtypea`\arrowtypeb`\arrowtypec`\arrowtyped;\width`\height>}}
+\def\square{\@ifnextchar< {\squarep}{\squarep
+ <\arrowtypea`\arrowtypeb`\arrowtypec`\arrowtyped;\width`\height>}}
+ % #6
+\def\squarep<#1>[#2`#3`#4`#5;#6`#7`#8`#9]{{% % #2------>#3
+\setsqparms[#1]% % | |
+\diagram% % | |
+\putsquarep<\arrowtypea`\arrowtypeb`\arrowtypec`% % #7| |#8
+\arrowtyped;\width`\height>% % | |
+(0,0)[#2`#3`#4`{#5};#6`#7`#8`{#9}]% % | |
+\enddiagram% % v v
+}} % #4------>#5
+ % #9
+\def\putptrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+\advance\ypos by \height
+\puthmorphism(\xpos,\ypos)[#4`#5`{#7}]{\height}{\arrowtypea}a%
+\putvmorphism(\xpos,\ypos)[`#6`{#8}]{\height}{\arrowtypeb}l%
+\advance\xpos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[``{#9}]{\height}{\arrowtypec}r%
+}}
+
+\def\putptriangle{\@ifnextchar <{\putptrianglep}{\putptrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\ptriangle{\@ifnextchar <{\ptrianglep}{\ptrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #5
+\def\ptrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % #2----->#3
+\settriparms[#1]% % | /
+\diagram% % | /
+\putptrianglep<\arrowtypea`\arrowtypeb`% % #6| /#7
+\arrowtypec;\height>% % | /
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % | /
+\enddiagram%% % v v
+}} % #4
+
+\def\putqtrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+\advance\ypos by\height
+\puthmorphism(\xpos,\ypos)[#4`#5`{#7}]{\height}{\arrowtypea}a%
+\putmorphism(\xpos,\ypos)(1,-1)[``{#8}]{\height}{\arrowtypeb}l%
+\advance\xpos by\height
+\putvmorphism(\xpos,\ypos)[`#6`{#9}]{\height}{\arrowtypec}r%
+}}
+
+\def\putqtriangle{\@ifnextchar <{\putqtrianglep}{\putqtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\qtriangle{\@ifnextchar <{\qtrianglep}{\qtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #5
+\def\qtrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % #2----->#3
+\settriparms[#1]% % \ |
+\width=\height % \ |
+\diagram% % #6\ |#7
+\putqtrianglep<\arrowtypea`\arrowtypeb`% % \ |
+\arrowtypec;\height>% % \ |
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % v v
+\enddiagram%% % #4
+}}
+
+\def\putdtrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+\puthmorphism(\xpos,\ypos)[#5`#6`{#9}]{\height}{\arrowtypec}b%
+\advance\xpos by \height \advance\ypos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[``{#7}]{\height}{\arrowtypea}l%
+\putvmorphism(\xpos,\ypos)[#4``{#8}]{\height}{\arrowtypeb}r%
+}}
+
+\def\putdtriangle{\@ifnextchar <{\putdtrianglep}{\putdtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\dtriangle{\@ifnextchar <{\dtrianglep}{\dtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #2
+\def\dtrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % / |
+\settriparms[#1]% % / |
+\width=\height % #5/ |#6
+\diagram% % / |
+\putdtrianglep<\arrowtypea`\arrowtypeb`% % / |
+\arrowtypec;\height>% % v v
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % #3----->#4
+\enddiagram%% % #7
+}}
+
+\def\putbtrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+\puthmorphism(\xpos,\ypos)[#5`#6`{#9}]{\height}{\arrowtypec}b%
+\advance\ypos by\height
+\putmorphism(\xpos,\ypos)(1,-1)[``{#8}]{\height}{\arrowtypeb}r%
+\putvmorphism(\xpos,\ypos)[#4``{#7}]{\height}{\arrowtypea}l%
+}}
+
+\def\putbtriangle{\@ifnextchar <{\putbtrianglep}{\putbtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\btriangle{\@ifnextchar <{\btrianglep}{\btrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #2
+\def\btrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % | \
+\settriparms[#1]% % | \
+\width=\height % #5| \#6
+\diagram% % | \
+\putbtrianglep<\arrowtypea`\arrowtypeb`% % | \
+\arrowtypec;\height>% % v v
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % #3----->#4
+\enddiagram%% % #7
+}}
+
+\def\putAtrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+{\multiply \height by2
+\puthmorphism(\xpos,\ypos)[#5`#6`{#9}]{\height}{\arrowtypec}b}%
+\advance\xpos by\height \advance\ypos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[#4``{#7}]{\height}{\arrowtypea}l%
+\putmorphism(\xpos,\ypos)(1,-1)[``{#8}]{\height}{\arrowtypeb}r%
+}}
+
+\def\putAtriangle{\@ifnextchar <{\putAtrianglep}{\putAtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\Atriangle{\@ifnextchar <{\Atrianglep}{\Atrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #2
+\def\Atrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % / \
+\settriparms[#1]% % / \
+\width=\height % #5/ \#6
+\diagram% % / \
+\putAtrianglep<\arrowtypea`\arrowtypeb`% % / \
+\arrowtypec;\height>% % v v
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % #3------------>#4
+\enddiagram%% % #7
+}}
+
+\def\putAtrianglepairp<#1>(#2)[#3;#4`#5`#6`#7`#8]{{%
+\settripairparms[#1]%
+\setpos(#2)%
+\settokens`#3`%
+\puthmorphism(\xpos,\ypos)[\tokenb`\tokenc`{#7}]{\height}{\arrowtyped}b%
+\advance\xpos by\height
+\puthmorphism(\xpos,\ypos)[\phantom{\tokenc}`\tokend`{#8}]%
+{\height}{\arrowtypee}b%
+\advance\ypos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[\tokena``{#4}]{\height}{\arrowtypea}l%
+\putvmorphism(\xpos,\ypos)[``{#5}]{\height}{\arrowtypeb}m%
+\putmorphism(\xpos,\ypos)(1,-1)[``{#6}]{\height}{\arrowtypec}r%
+}}
+
+\def\putAtrianglepair{\@ifnextchar <{\putAtrianglepairp}{\putAtrianglepairp%
+ <\arrowtypea`\arrowtypeb`\arrowtypec`\arrowtyped`\arrowtypee;\height>}}
+\def\Atrianglepair{\@ifnextchar <{\Atrianglepairp}{\Atrianglepairp%
+ <\arrowtypea`\arrowtypeb`\arrowtypec`\arrowtyped`\arrowtypee;\height>}}
+
+\def\Atrianglepairp<#1>[#2;#3`#4`#5`#6`#7]{{% % #2a
+\settripairparms[#1]% % / | \
+\settokens`#2`% % / | \
+\width=\height % #3/ #4 \#5
+\diagram% % / | \
+\putAtrianglepairp % / | \
+<\arrowtypea`\arrowtypeb`\arrowtypec`% % v v v
+\arrowtyped`\arrowtypee;\height>% % #2b---->#2c---->#2d
+(0,0)[{#2};#3`#4`#5`#6`{#7}]% % #6 #7
+\enddiagram%%
+}}
+
+\def\putVtrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+\advance\ypos by\height
+{\multiply\height by2
+\puthmorphism(\xpos,\ypos)[#4`#5`{#7}]{\height}{\arrowtypea}a}%
+\putmorphism(\xpos,\ypos)(1,-1)[`#6`{#8}]{\height}{\arrowtypeb}l%
+\advance\xpos by\height
+\advance\xpos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[``{#9}]{\height}{\arrowtypec}r%
+}}
+
+\def\putVtriangle{\@ifnextchar <{\putVtrianglep}{\putVtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\Vtriangle{\@ifnextchar <{\Vtrianglep}{\Vtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #5
+\def\Vtrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % #2------------->#3
+\settriparms[#1]% % \ /
+\width=\height % \ /
+\diagram% % #6\ /#7
+\putVtrianglep<\arrowtypea`\arrowtypeb`% % \ /
+\arrowtypec;\height>% % \ /
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % v v
+\enddiagram%% % #4
+}}
+
+\def\putVtrianglepairp<#1>(#2)[#3;#4`#5`#6`#7`#8]{{
+\settripairparms[#1]%
+\setpos(#2)%
+\settokens`#3`%
+\advance\ypos by\height
+\putmorphism(\xpos,\ypos)(1,-1)[`\tokend`{#6}]{\height}{\arrowtypec}l%
+\puthmorphism(\xpos,\ypos)[\tokena`\tokenb`{#4}]{\height}{\arrowtypea}a%
+\advance\xpos by\height
+\puthmorphism(\xpos,\ypos)[\phantom{\tokenb}`\tokenc`{#5}]%
+{\height}{\arrowtypeb}a%
+\putvmorphism(\xpos,\ypos)[``{#7}]{\height}{\arrowtyped}m%
+\advance\xpos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[``{#8}]{\height}{\arrowtypee}r%
+}}
+
+\def\putVtrianglepair{\@ifnextchar <{\putVtrianglepairp}{\putVtrianglepairp%
+ <\arrowtypea`\arrowtypeb`\arrowtypec`\arrowtyped`\arrowtypee;\height>}}
+\def\Vtrianglepair{\@ifnextchar <{\Vtrianglepairp}{\Vtrianglepairp%
+ <\arrowtypea`\arrowtypeb`\arrowtypec`\arrowtyped`\arrowtypee;\height>}}
+ % #3 #4
+\def\Vtrianglepairp<#1>[#2;#3`#4`#5`#6`#7]{{% % #2a---->#2b---->#2c
+\settripairparms[#1]% % \ | /
+\settokens`#2`% % \ | /
+\diagram% % #5\ #6 /#7
+\putVtrianglepairp % \ | /
+<\arrowtypea`\arrowtypeb`\arrowtypec`% % \ | /
+\arrowtyped`\arrowtypee;\height>% % v v v
+(0,0)[{#2};#3`#4`#5`#6`{#7}]% % #2d
+\enddiagram%%
+}}
+
+
+\def\putCtrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+\advance\ypos by\height
+\putmorphism(\xpos,\ypos)(1,-1)[``{#9}]{\height}{\arrowtypec}l%
+\advance\xpos by\height
+\advance\ypos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[#4`#5`{#7}]{\height}{\arrowtypea}l%
+{\multiply\height by 2
+\putvmorphism(\xpos,\ypos)[`#6`{#8}]{\height}{\arrowtypeb}r}%
+}}
+
+\def\putCtriangle{\@ifnextchar <{\putCtrianglep}{\putCtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\Ctriangle{\@ifnextchar <{\Ctrianglep}{\Ctrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #2
+\def\Ctrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % / |
+\settriparms[#1]% % #5/ |
+\width=\height % / |
+\diagram% % v |
+\putCtrianglep<\arrowtypea`\arrowtypeb`% % #3 |#6
+\arrowtypec;\height>% % \ |
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % #7\ |
+\enddiagram%% % \ |
+}} % v v
+ % #4
+\def\putDtrianglep<#1>(#2,#3)[#4`#5`#6;#7`#8`#9]{{%
+\settriparms[#1]%
+\xpos=#2 \ypos=#3
+\advance\xpos by\height \advance\ypos by\height
+\putmorphism(\xpos,\ypos)(-1,-1)[``{#9}]{\height}{\arrowtypec}r%
+\advance\xpos by-\height \advance\ypos by\height
+\putmorphism(\xpos,\ypos)(1,-1)[`#5`{#8}]{\height}{\arrowtypeb}r%
+{\multiply\height by 2
+\putvmorphism(\xpos,\ypos)[#4`#6`{#7}]{\height}{\arrowtypea}l}%
+}}
+
+\def\putDtriangle{\@ifnextchar <{\putDtrianglep}{\putDtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+\def\Dtriangle{\@ifnextchar <{\Dtrianglep}{\Dtrianglep
+ <\arrowtypea`\arrowtypeb`\arrowtypec;\height>}}
+ % #2
+\def\Dtrianglep<#1>[#2`#3`#4;#5`#6`#7]{{%% % | \
+\settriparms[#1]% % | \#6
+\width=\height % | \
+\diagram% % | v
+\putDtrianglep<\arrowtypea`\arrowtypeb`% % #5| #3
+\arrowtypec;\height>% % | /
+(0,0)[#2`#3`#4;#5`#6`{#7}]% % | /#7
+\enddiagram%% % | /
+}} % v v
+ % #4
+\def\setrecparms[#1`#2]{\width=#1 \height=#2}%
+% #4
+% #3b<-------#3a x #3b
+% ^ | |
+% / | |
+% #5/ | |
+% / | |
+% / | |
+% / | |
+% #3c |#6 |#3a x #5
+% \ | |
+% \ | |
+% #8\ | |
+% \ | |
+% \ | |
+% v v v
+% #3d<-------#3a x #3d
+% #8
+
+\def\recursep<#1`#2>[#3;#4`#5`#6`#7`#8]{{\m@th
+\width=#1 \height=#2
+\settokens`#3`
+\settowidth{\tempdimen}{$\tokena$}
+\ifdim\tempdimen=0pt
+ \savebox{\tempboxa}{\hbox{$\tokenb$}}%
+ \savebox{\tempboxb}{\hbox{$\tokend$}}%
+ \savebox{\tempboxc}{\hbox{$#6$}}%
+\else
+ \savebox{\tempboxa}{\hbox{$\hbox{$\tokena$}\times\hbox{$\tokenb$}$}}%
+ \savebox{\tempboxb}{\hbox{$\hbox{$\tokena$}\times\hbox{$\tokend$}$}}%
+ \savebox{\tempboxc}{\hbox{$\hbox{$\tokena$}\times\hbox{$#6$}$}}%
+\fi
+\ypos=\height
+\divide\ypos by 2
+\xpos=\ypos
+\advance\xpos by \width
+\bfig
+\putCtrianglep<-1`1`1;\ypos>(0,0)[`\tokenc`;#5`#6`{#7}]%
+\puthmorphism(\ypos,0)[\tokend`\usebox{\tempboxb}`{#8}]{\width}{-1}b%
+\puthmorphism(\ypos,\height)[\tokenb`\usebox{\tempboxa}`{#4}]{\width}{-1}a%
+\advance\ypos by \width
+\putvmorphism(\ypos,\height)[``\usebox{\tempboxc}]{\height}1r%
+\efig
+}}
+
+\def\recurse{\@ifnextchar <{\recursep}{\recursep<\width`\height>}}
+
+\def\puttwohmorphisms(#1,#2)[#3`#4;#5`#6]#7#8#9{{%
+% 1 and 2 are position, 3 and 4 are the nodes, 5 and 6 the labels,
+% 7 the distance between node centers and 8 & 9 are the arrow types.
+% #5
+% #3 ===========> #4
+% #6
+%
+\puthmorphism(#1,#2)[#3`#4`]{#7}0a
+\ypos=#2
+\advance\ypos by 20
+\puthmorphism(#1,\ypos)[\phantom{#3}`\phantom{#4}`#5]{#7}{#8}a
+\advance\ypos by -40
+\puthmorphism(#1,\ypos)[\phantom{#3}`\phantom{#4}`#6]{#7}{#9}b
+}}
+
+\def\puttwovmorphisms(#1,#2)[#3`#4;#5`#6]#7#8#9{{%
+% 1 and 2 are position, 3 and 4 are the nodes, 5 and 6 the labels,
+% 7 the distance between node centers and 8 & 9 are the arrow types.
+%
+% #3
+% ||
+% ||
+% #5 || #6
+% ||
+% ||
+% vv
+% #4
+%
+\putvmorphism(#1,#2)[#3`#4`]{#7}0a
+\xpos=#1
+\advance\xpos by -20
+\putvmorphism(\xpos,#2)[\phantom{#3}`\phantom{#4}`#5]{#7}{#8}l
+\advance\xpos by 40
+\putvmorphism(\xpos,#2)[\phantom{#3}`\phantom{#4}`#6]{#7}{#9}r
+}}
+
+\def\puthcoequalizer(#1)[#2`#3`#4;#5`#6`#7]#8#9{{%
+% #1 is (\xpos,\ypos), the next 6 are the nodes and arrow labels
+% #8 is the distance between each pair of nodes and #9 is the pos of #7
+% either a (above) or b (below)
+% #5 #7
+% #2 ===========> #3 --------> #4
+% #6
+%
+\setpos(#1)%
+\puttwohmorphisms(\xpos,\ypos)[#2`#3;#5`#6]{#8}11%
+\advance\xpos by #8
+\puthmorphism(\xpos,\ypos)[\phantom{#3}`#4`#7]{#8}1{#9}
+}}
+
+\def\putvcoequalizer(#1)[#2`#3`#4;#5`#6`#7]#8#9{{%
+% #1 is (\xpos,\ypos), the next 6 are the nodes and arrow labels
+% #8 is the distance between each pair of nodes and #9 is the pos of #7
+% either l (left) or r (right)
+%
+% #2
+% | |
+% | |
+% #5 | | #6
+% | |
+% | |
+% v v
+% #3
+% |
+% |
+% #7 |
+% |
+% v
+% #4
+%
+\setpos(#1)%
+\puttwovmorphisms(\xpos,\ypos)[#2`#3;#5`#6]{#8}11%
+\advance\ypos by -#8
+\putvmorphism(\xpos,\ypos)[\phantom{#3}`#4`#7]{#8}1{#9}
+}}
+
+\def\putthreehmorphisms(#1)[#2`#3;#4`#5`#6]#7(#8)#9{{%
+% Use: \putthreehmorphisms(xpos,ypos)[lnode`rnode;toplabel`midlabel%
+% botlabel]{distance}(toparrowtype,midarrowtype,botarrowtype){position}
+\setpos(#1) \settypes(#8)
+\if a#9 %
+ \vertsize{\tempcounta}{#5}%
+ \vertsize{\tempcountb}{#6}%
+ \ifnum \tempcounta<\tempcountb \tempcounta=\tempcountb \fi
+\else
+ \vertsize{\tempcounta}{#4}%
+ \vertsize{\tempcountb}{#5}%
+ \ifnum \tempcounta<\tempcountb \tempcounta=\tempcountb \fi
+\fi
+\advance \tempcounta by 60
+\puthmorphism(\xpos,\ypos)[#2`#3`#5]{#7}{\arrowtypeb}{#9}
+\advance\ypos by \tempcounta
+\puthmorphism(\xpos,\ypos)[\phantom{#2}`\phantom{#3}`#4]{#7}{\arrowtypea}{#9}
+\advance\ypos by -\tempcounta \advance\ypos by -\tempcounta
+\puthmorphism(\xpos,\ypos)[\phantom{#2}`\phantom{#3}`#6]{#7}{\arrowtypec}{#9}
+}}
+
+\def\setarrowtoks[#1`#2`#3`#4`#5`#6]{%
+\def\toka{#1}
+\def\tokb{#2}
+\def\tokc{#3}
+\def\tokd{#4}
+\def\toke{#5}
+\def\tokf{#6}
+}
+\def\hex{\@ifnextchar <{\hexp}{\hexp<1000`400>}}
+\def\hexp<#1`#2>[#3`#4`#5`#6`#7`#8;#9]{%
+\setarrowtoks[#9]
+\yext=#2 \advance \yext by #2
+\xext=#1 \advance\xext by \yext
+\bfig
+\putCtriangle<-1`0`1;#2>(0,0)[`#5`;\tokb``\tokd]
+\xext=#1 \yext=#2 \advance \yext by #2
+\putsquare<1`0`0`1;\xext`\yext>(#2,0)[#3`#4`#7`#8;\toka```\tokf]
+\advance \xext by #2
+\putDtriangle<0`1`-1;#2>(\xext,0)[`#6`;`\tokc`\toke]
+\efig
+}
+%\def\doublecomplex[#1`#2`#3`#4`#5`#6`#7`#8`#9]{%
+%\bfig
+%\putsquare<0`0`1`1;500`500>(0,1700)[`\vdots`\cdots`{#1};```]
+%\puthmorphism(500,1700)[\ph{#1}`\cdots`]{500}1a
+%\puthmorphism(1000,1700)[\ph{\cdots}`\ph{#2}`]{500}1a
+%\putsquare<0`1`1`1;700`500>(1500,1700)[\vdots`\vdots`{#2}`{#3};```]
+%\puthmorphism(2200,1700)[\ph{#3}`0`]{500}1a
+%\putvmorphism(500,1700)[`\vdots`]{400}1a \putvmorphism(500,1300)[``]{400}1a
+%\putvmorphism(1500,1700)[`\vdots`]{400}1a \putvmorphism(1500,1300)[``]{400}1a
+%\putvmorphism(2200,1700)[`\vdots`]{400}1a \putvmorphism(2200,1300)[``]{400}1a
+%\putsquare<1`0`1`1;500`500>(0,400)[\cdots`{#4}`\cdots`{#7};```]
+%\puthmorphism(500,900)[\ph{#1}`\cdots`]{500}1a
+%\puthmorphism(1000,900)[\ph{\cdots}`\ph{#2}`]{500}1a
+%\puthmorphism(500,400)[\ph{#1}`\cdots`]{500}1a
+%\puthmorphism(1000,400)[\ph{\cdots}`\ph{#2}`]{500}1a
+%\putsquare<1`1`1`1;700`500>(1500,400)[{#5}`{#6}`{#8}`{#9};```]
+%\puthmorphism(2200,900)[\ph{#6}`0`]{500}1a
+%\puthmorphism(2200,400)[\ph{#9}`0`]{500}1a
+%\putvmorphism(500,400)[`0`]{400}1a
+%\putvmorphism(1500,400)[`0`]{400}1a
+%\putvmorphism(2200,400)[`0`]{400}1a
+%\efig
+%}
+%
+%\def\doublecocomplex[#1`#2`#3`#4`#5`#6`#7`#8`#9]{%
+%\bfig
+%\putsquare<0`0`-1`-1;500`500>(0,1700)[`\vdots`\cdots`{#1};```]
+%\puthmorphism(500,1700)[\ph{#1}`\cdots`]{500}{-1}a
+%\puthmorphism(1000,1700)[\ph{\cdots}`\ph{#2}`]{500}{-1}a
+%\putsquare<0`-1`-1`-1;500`500>(1500,1700)[\vdots`\vdots`{#2}`{#3};```]
+%\puthmorphism(2000,1700)[\ph{#3}`0`]{500}{-1}a
+%\putvmorphism(500,1700)[`\vdots`]{400}{-1}a \putvmorphism(500,1300)[``]{400}{-1}a
+%\putvmorphism(1500,1700)[`\vdots`]{400}{-1}a \putvmorphism(1500,1300)[``]{400}{-1}a
+%\putvmorphism(2000,1700)[`\vdots`]{400}{-1}a \putvmorphism(2000,1300)[``]{400}{-1}a
+%\putsquare<-1`0`-1`-1;500`500>(0,400)[\cdots`{#4}`\cdots`{#7};```]
+%\puthmorphism(500,900)[\ph{#1}`\cdots`]{500}{-1}a
+%\puthmorphism(1000,900)[\ph{\cdots}`\ph{#2}`]{500}{-1}a
+%\puthmorphism(500,400)[\ph{#1}`\cdots`]{500}{-1}a
+%\puthmorphism(1000,400)[\ph{\cdots}`\ph{#2}`]{500}{-1}a
+%\putsquare<-1`-1`-1`-1;500`500>(1500,400)[{#5}`{#6}`{#8}`{#9};```]
+%\puthmorphism(2000,900)[\ph{#6}`0`]{500}{-1}a
+%\puthmorphism(2000,400)[\ph{#9}`0`]{500}{-1}a
+%\putvmorphism(500,400)[`0`]{400}{-1}a
+%\putvmorphism(1500,400)[`0`]{400}{-1}a
+%\putvmorphism(2000,400)[`0`]{400}{-1}a
+%\efig
+%}
+\makeatother
diff --git a/Master/texmf-dist/tex/latex/barr/diagxy.tex b/Master/texmf-dist/tex/latex/barr/diagxy.tex
new file mode 100644
index 00000000000..5fc36e7cf54
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/barr/diagxy.tex
@@ -0,0 +1,952 @@
+ \def\dated#1{\def\thedate{#1}}
+ \dated{2001-10-14}
+ % This is a package of commutative diagram macros built on top of Xy-pic
+ % by Michael Barr (email: barr@barrs.org). Its use is unrestricted. It
+ % may be freely distributed, unchanged, for non-commercial or commercial
+ % use. If changed, it must be renamed. Inclusion in a commercial
+ % software package is also permitted, but I would appreciate receiving a
+ % free copy for my personal examination and use. There are no guarantees
+ % that this package is good for anything. I have tested it with LaTeX 2e,
+ % LaTeX 2.09 and Plain TeX. Although I know of no reason it will not work
+ % with AMSTeX, I have not tested it.
+
+\input xy
+\xyoption{arrow}
+
+\newdir{ >}{{ }*!/-9pt/@{>}}
+\newdir{ (}{{ }*!/-5pt/@{(}}
+\newdir^{ (}{{ }*!/-5pt/@^{(}}
+\newdir{< }{!/9pt/@{<}*{ }}
+
+\newbox\Label%
+\newdimen\high%
+\newdimen\deep%
+\newdimen\ul%
+\newcount\deltax%
+\newcount\deltay%
+\newcount\deltaX%
+\newcount\deltaY%
+
+\newdimen\wdth
+\newcount\xend%
+\newcount\yend%
+\newcount\Xend
+\newcount\Yend
+\newcount\xpos%
+\newcount\ypos%
+\newcount\default \default=500%
+\newcount\defaultmargin \defaultmargin=150
+\newcount\topw%
+\newcount\botw%
+\newcount\Xpos%
+\newcount\Ypos%
+\def\ratchet#1#2{\ifnum#1<#2\global #1=#2\fi}%
+
+\newcount\atcode \atcode=\catcode`\@%
+\catcode`\@=11
+\expandafter\ifx\csname @ifnextchar\endcsname\relax
+\def\ifnextchar#1#2#3{\let\@tempe
+#1\def\@tempa{#2}\def\@tempb{#3}\futurelet
+ \@tempc\@ifnch}%
+\def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch
+ \else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi
+ \fi \@tempd}%
+\def\:{\let\@sptoken= } \: % this makes \@sptoken a space token
+\def\:{\@xifnch} \expandafter\def\: {\futurelet\@tempc\@ifnch}%
+\else
+\let\ifnextchar\@ifnextchar
+\fi
+\ul=.01em%
+\X@xbase =.01em%
+\Y@ybase =.01em%
+\def\scalefactor#1{\ul=#1\ul \X@xbase=#1\X@xbase \Y@ybase=#1\Y@ybase}%
+\catcode`\@=12%
+
+\def\fontscale#1{%
+\if#1h\relax
+\font\xydashfont=xydash10 scaled \magstephalf
+\font\xyatipfont=xyatip10 scaled \magstephalf
+\font\xybtipfont=xybtip10 scaled \magstephalf
+\font\xybsqlfont=xybsql10 scaled \magstephalf
+\font\xycircfont=xycirc10 scaled \magstephalf
+\else
+\font\xydashfont=xydash10 scaled \magstep#1%
+\font\xyatipfont=xyatip10 scaled \magstep#1%
+\font\xybtipfont=xybtip10 scaled \magstep#1%
+\font\xybsqlfont=xybsql10 scaled \magstep#1%
+\font\xycircfont=xycirc10 scaled \magstep#1%
+\fi}
+
+\let\bfig\xy%
+\let\efig\endxy%
+
+\def\car#1#2\nil{#1}%
+
+\def\morphism{\ifnextchar({\morphismp}{\morphismp(0,0)}}%
+\def\morphismp(#1){\ifnextchar|{\morphismpp(#1)}{\morphismpp(#1)|a|}}%
+\def\morphismpp(#1)|#2|{\ifnextchar/{\morphismppp(#1)|#2|}%
+ {\morphismppp(#1)|#2|/>/}}%
+\def\morphismppp(#1)|#2|/#3/{%
+ \ifnextchar<{\morphismpppp(#1)|#2|/#3/}%
+ {\morphismpppp(#1)|#2|/#3/<\default,0>}}%
+
+\def\morphismpppp(#1,#2)|#3|/#4/<#5,#6>[#7`#8;#9]{%
+\xend#1\advance \xend by #5%
+\yend#2\advance \yend by #6%
+\domorphism(#1,#2)|#3|/#4/<#5,#6>[#7`#8;#9]}
+
+\def\domorphism(#1,#2)|#3|/#4/<#5,#6>[#7`#8;#9]{%
+\edef\next{#4}%
+\ifx\next\empty\relax
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+\else \def\next{\car#4\nil}\fi
+\if@\next\relax
+ \if#3l%
+ \ifnum #6>0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else \if#3m%
+ \setbox0\hbox{$#9$}%
+ \ifdim \wd0=0pt
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4 (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else
+ \setbox\Label=\hbox{\kern .5pt $\labelstyle #9$\kern .5pt}%
+ \high=\ht\Label \advance\high by 2pt \ht\Label=\high%
+ \deep=\dp\Label \advance\deep by 2pt \dp\Label=\deep%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4|-{\box\Label} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi
+ \else \if#3r%
+ \ifnum #6<0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else \if#3a%
+ \ifnum #5>0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else \if#3b%
+ \ifnum #5<0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar#4 (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi\fi\fi\fi\fi%
+\else%
+\edef\next{#4}%
+ \ifx\next\empty\relax
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}; (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else \edef\next{#4}%
+ \ifx\next\empty\relax
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else \if#3l%
+ \ifnum #6>0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else \if#3m%
+ \setbox0\hbox{$#9$}%
+ \ifdim \wd0=0pt
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else
+ \setbox\Label=\hbox{\kern .5pt $\labelstyle #9$\kern .5pt}%
+ \high=\ht\Label \advance\high by 2pt \ht\Label=\high%
+ \deep=\dp\Label \advance\deep by 2pt \dp\Label=\deep%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}|-{\box\Label} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi
+ \else \if#3r%
+ \ifnum #6<0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else \if#3a%
+ \ifnum #5>0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else \if#3b%
+ \ifnum #5<0%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \else%
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi%
+ \else
+ \POS(#1,#2)*+!!<0ex,.75ex>{#7}\ar@{#4} (\xend,\yend)*+!!<0ex,.75ex>{#8}%
+ \fi\fi\fi\fi\fi\fi\fi%
+\fi\ignorespaces}%
+
+\def\squarepppp(#1,#2)|#3|/#4`#5`#6`#7/<#8>[#9]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3##4|{%
+ \def\xa{##1}\def\xb{##2}\def\xc{##3}\def\xd{##4}\ignorespaces}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\ignorespaces}%
+\next[#9]%
+\morphism(\xpos,\ypos)|\xd|/{#7}/<\deltax,0>[\nodec`\noded;\labeld]%
+\advance \ypos by \deltay%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+ \advance \xpos by \deltax%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<0,-\deltay>[\nodeb`\noded;\labelc]%
+\ignorespaces}%
+
+\def\square{\ifnextchar({\squarep}{\squarep(0,0)}}%
+\def\squarep(#1){\ifnextchar|{\squarepp(#1)}{\squarepp(#1)|alrb|}}%
+\def\squarepp(#1)|#2|{\ifnextchar/{\squareppp(#1)|#2|}%
+ {\squareppp(#1)|#2|/>`>`>`>/}}%
+\def\squareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\squarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\squarepppp(#1)|#2|/#3`#4`#5`#6/<\default,\default>}}%
+
+\def\ptrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\ignorespaces}%
+
+\def\qtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<0,-\deltay>[\nodeb`\nodec;\labelc]%
+\ignorespaces}%
+
+\def\dtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\advance\ypos by \deltay\advance \xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+
+\def\btrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<0,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+
+\def\Atrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\multiply\deltax by 2%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\divide\deltax by 2
+\advance\ypos by \deltay\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+
+\def\Vtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\multiply\deltax by 2%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\advance\xpos by \deltax \divide \deltax by 2
+\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\ignorespaces}%
+
+\def\Ctrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance \ypos by \deltay%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\advance\ypos by \deltay \advance \xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\multiply\deltay by 2%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+
+\def\Dtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
+\xpos#1\ypos#2%
+\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
+\next|#3|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#7>%
+\def\next[##1`##2`##3;##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
+\next[#8]%
+\advance\xpos by \deltax \advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
+\advance\xpos by -\deltax \advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodeb;\labelb]%
+\multiply \deltay by 2%
+\morphism(\xpos,\ypos)|\xa|/{#4}/<0,-\deltay>[\nodea`\nodec;\labela]%
+\ignorespaces}%
+
+\def\ptriangle{\ifnextchar({\ptrianglep}{\ptrianglep(0,0)}}%
+\def\ptrianglep(#1){\ifnextchar|{\ptrianglepp(#1)}{\ptrianglepp(#1)|alr|}}%
+\def\ptrianglepp(#1)|#2|{\ifnextchar/{\ptriangleppp(#1)|#2|}%
+ {\ptriangleppp(#1)|#2|/>`>`>/}}%
+\def\ptriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\ptrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\ptrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+\def\qtriangle{\ifnextchar({\qtrianglep}{\qtrianglep(0,0)}}%
+\def\qtrianglep(#1){\ifnextchar|{\qtrianglepp(#1)}{\qtrianglepp(#1)|alr|}}%
+\def\qtrianglepp(#1)|#2|{\ifnextchar/{\qtriangleppp(#1)|#2|}%
+ {\qtriangleppp(#1)|#2|/>`>`>/}}%
+\def\qtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\qtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\qtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+\def\dtriangle{\ifnextchar({\dtrianglep}{\dtrianglep(0,0)}}%
+\def\dtrianglep(#1){\ifnextchar|{\dtrianglepp(#1)}{\dtrianglepp(#1)|lrb|}}%
+\def\dtrianglepp(#1)|#2|{\ifnextchar/{\dtriangleppp(#1)|#2|}%
+ {\dtriangleppp(#1)|#2|/>`>`>/}}%
+\def\dtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\dtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\dtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+\def\btriangle{\ifnextchar({\btrianglep}{\btrianglep(0,0)}}%
+\def\btrianglep(#1){\ifnextchar|{\btrianglepp(#1)}{\btrianglepp(#1)|lrb|}}%
+\def\btrianglepp(#1)|#2|{\ifnextchar/{\btriangleppp(#1)|#2|}%
+ {\btriangleppp(#1)|#2|/>`>`>/}}%
+\def\btriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\btrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\btrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+\def\Atriangle{\ifnextchar({\Atrianglep}{\Atrianglep(0,0)}}%
+\def\Atrianglep(#1){\ifnextchar|{\Atrianglepp(#1)}{\Atrianglepp(#1)|lrb|}}%
+\def\Atrianglepp(#1)|#2|{\ifnextchar/{\Atriangleppp(#1)|#2|}%
+ {\Atriangleppp(#1)|#2|/>`>`>/}}%
+\def\Atriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Atrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Atrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+\def\Vtriangle{\ifnextchar({\Vtrianglep}{\Vtrianglep(0,0)}}%
+\def\Vtrianglep(#1){\ifnextchar|{\Vtrianglepp(#1)}{\Vtrianglepp(#1)|alb|}}%
+\def\Vtrianglepp(#1)|#2|{\ifnextchar/{\Vtriangleppp(#1)|#2|}%
+ {\Vtriangleppp(#1)|#2|/>`>`>/}}%
+\def\Vtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Vtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Vtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+\def\Ctriangle{\ifnextchar({\Ctrianglep}{\Ctrianglep(0,0)}}%
+\def\Ctrianglep(#1){\ifnextchar|{\Ctrianglepp(#1)}{\Ctrianglepp(#1)|arb|}}%
+\def\Ctrianglepp(#1)|#2|{\ifnextchar/{\Ctriangleppp(#1)|#2|}%
+ {\Ctriangleppp(#1)|#2|/>`>`>/}}%
+\def\Ctriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Ctrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Ctrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+\def\Dtriangle{\ifnextchar({\Dtrianglep}{\Dtrianglep(0,0)}}%
+\def\Dtrianglep(#1){\ifnextchar|{\Dtrianglepp(#1)}{\Dtrianglepp(#1)|alb|}}%
+\def\Dtrianglepp(#1)|#2|{\ifnextchar/{\Dtriangleppp(#1)|#2|}%
+ {\Dtriangleppp(#1)|#2|/>`>`>/}}%
+\def\Dtriangleppp(#1)|#2|/#3`#4`#5/{%
+ \ifnextchar<{\Dtrianglepppp(#1)|#2|/#3`#4`#5/}%
+ {\Dtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%
+
+
+\def\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<\deltax,0>[\nodeb`\nodec;\labeld]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<\deltax,0>[\nodec`\noded;\labele]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,-\deltay>[\nodea`\noded;\labelc]%
+\ignorespaces}%
+
+\def\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<\deltax,0>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,-\deltay>[\nodea`\noded;\labelc]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<\deltax,0>[\nodeb`\nodec;\labelb]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<0,-\deltay>[\nodeb`\noded;\labeld]%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labele]%
+\ignorespaces}%
+
+\def\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<0,-\deltay>[\nodec`\noded;\labele]%
+\advance\xpos by -\deltax%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<\deltax,-\deltay>[\nodeb`\noded;\labeld]%
+\advance\ypos by \deltay%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<0,-\deltay>[\nodea`\nodec;\labelb]%
+\ignorespaces}%
+
+\def\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
+\def\next(##1,##2){\xpos##1\ypos##2}%
+\next(#1)%
+\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
+\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
+\next|#2|%
+\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
+\next<#8>%
+\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
+ \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
+\next[#9]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,0>[\nodeb`\nodec;\labelc]%
+\morphism(\xpos,\ypos)|\xd|/{#6}/<0,-\deltay>[\nodeb`\noded;\labeld]%
+\advance\ypos by \deltay%
+\morphism(\xpos,\ypos)|\xa|/{#3}/<0,-\deltay>[\nodea`\nodeb;\labela]%
+\morphism(\xpos,\ypos)|\xb|/{#4}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
+\advance\ypos by -\deltay%
+\advance\xpos by \deltax%
+\morphism(\xpos,\ypos)|\xe|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labele]%
+\ignorespaces}%
+
+\def\Atrianglepair{\ifnextchar({\Atrianglepairp}{\Atrianglepairp(0,0)}}%
+\def\Atrianglepairp(#1){\ifnextchar|{\Atrianglepairpp(#1)}%
+{\Atrianglepairpp(#1)|lmrbb|}}%
+\def\Atrianglepairpp(#1)|#2|{\ifnextchar/{\Atrianglepairppp(#1)|#2|}%
+ {\Atrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Atrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+
+\def\Vtrianglepair{\ifnextchar({\Vtrianglepairp}{\Vtrianglepairp(0,0)}}%
+\def\Vtrianglepairp(#1){\ifnextchar|{\Vtrianglepairpp(#1)}%
+{\Vtrianglepairpp(#1)|aalmr|}}%
+\def\Vtrianglepairpp(#1)|#2|{\ifnextchar/{\Vtrianglepairppp(#1)|#2|}%
+ {\Vtrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Vtrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+
+\def\Ctrianglepair{\ifnextchar({\Ctrianglepairp}{\Ctrianglepairp(0,0)}}%
+\def\Ctrianglepairp(#1){\ifnextchar|{\Ctrianglepairpp(#1)}%
+{\Ctrianglepairpp(#1)|lrmlr|}}%
+\def\Ctrianglepairpp(#1)|#2|{\ifnextchar/{\Ctrianglepairppp(#1)|#2|}%
+ {\Ctrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Ctrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+
+\def\Dtrianglepair{\ifnextchar({\Dtrianglepairp}{\Dtrianglepairp(0,0)}}%
+\def\Dtrianglepairp(#1){\ifnextchar|{\Dtrianglepairpp(#1)}%
+{\Dtrianglepairpp(#1)|lrmlr|}}%
+\def\Dtrianglepairpp(#1)|#2|{\ifnextchar/{\Dtrianglepairppp(#1)|#2|}%
+ {\Dtrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
+\def\Dtrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
+ \ifnextchar<{\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
+ {\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%
+
+\def\place(#1,#2)[#3]{\POS(#1,#2)*+!!<0ex,.75ex>{#3}\ignorespaces}%
+
+\def\pullback#1]#2]{\square#1]\trident#2]\ignorespaces}%
+
+\def\tridentppp|#1#2#3|/#4`#5`#6/<#7,#8>[#9]{%
+\def\next[##1;##2`##3`##4]{\def\nodee{##1}\def\labele{##2}%
+ \def\labelf{##3}\def\labelg{##4}}%
+\next[#9]%
+\advance \xpos by -\deltax%
+\advance \xpos by -#7\advance \ypos by #8%
+\advance\deltax by #7%
+\morphism(\xpos,\ypos)|#1|/{#4}/<\deltax,-#8>[\nodee`\nodeb;\labele]%
+\advance\deltax by -#7%
+\morphism(\xpos,\ypos)|#2|/{#5}/<#7,-#8>[\nodee`\nodea;\labelf]%
+\advance\deltay by #8%
+\morphism(\xpos,\ypos)|#3|/{#6}/<#7,-\deltay>[\nodee`\nodec;\labelg]%
+\ignorespaces}%
+
+\def\trident{\ifnextchar|{\tridentp}{\tridentp|amb|}}%
+\def\tridentp|#1|{\ifnextchar/{\tridentpp|#1|}{\tridentpp|#1|/{>}`{>}`{>}/}}%
+\def\tridentpp|#1|/#2/{\ifnextchar<{\tridentppp|#1|/#2/}%
+ {\tridentppp|#1|/#2/<500,500>}}%
+
+\def\setmorphismwidth#1#2#3#4{%
+ \setbox0=\hbox{$#1{\labelstyle#3#3}#2$}#4=\wd0%
+ \divide #4 by 2 \divide #4 by \ul%
+ \advance #4 by 350 \ratchet{#4}{500}}%
+
+\def\setSquarewidth[#1`#2`#3`#4;#5`#6`#7`#8]{%
+ \setmorphismwidth{#1}{#2}{#5}{\topw}%
+ \setmorphismwidth{#3}{#4}{#8}{\botw}%
+\ratchet{\topw}{\botw}}%
+
+\def\Squarepppp(#1)|#2|/#3/<#4>[#5]{%
+ \setSquarewidth[#5]%
+ \squarepppp(#1)|#2|/#3/<\topw,#4>[#5]%
+\ignorespaces}%
+
+\def\Square{\ifnextchar({\Squarep}{\Squarep(0,0)}}%
+\def\Squarep(#1){\ifnextchar|{\Squarepp(#1)}{\Squarepp(#1)|alrb|}}%
+\def\Squarepp(#1)|#2|{\ifnextchar/{\Squareppp(#1)|#2|}%
+ {\Squareppp(#1)|#2|/>`>`>`>/}}%
+\def\Squareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\Squarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\Squarepppp(#1)|#2|/#3`#4`#5`#6/<\default>}}%
+
+\def\hSquarespppp(#1,#2)|#3|/#4/<#5>[#6;#7]{%
+\Xpos=#1\Ypos=#2%
+\def\next|##1##2##3##4##5##6##7|{%
+ \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
+ \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
+\next|#3|%
+\deltaY=#5%
+\def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
+ \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
+\next[#6]%
+\def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
+ \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
+\next[#7]%
+\dohSquares/#4/}%
+
+\def\dohSquares/#1`#2`#3`#4`#5`#6`#7/{%
+\Squarepppp(\Xpos,\Ypos)|\Xa\Xc\Xd\Xf|/#1`#3`#4`#6/<\deltaY>%
+ [\Nodea`\Nodeb`\Noded`\Nodee;\Labela`\Labelc`\Labeld`\Labelf]%
+ \advance \Xpos by \topw
+\Squarepppp(\Xpos,\Ypos)|\Xb\Xd\Xe\Xg|/#2``#5`#7/<\deltaY>%
+[\Nodeb`\Nodec`\Nodee`\Nodef;\Labelb``\Labele`\Labelg]%
+\ignorespaces}%
+
+\def\hSquares{\ifnextchar({\hSquaresp}{\hSquaresp(0,0)}}%
+\def\hSquaresp(#1){\ifnextchar|{\hSquarespp(#1)}{\hSquarespp%
+(#1)|aalmrbb|}}%
+\def\hSquarespp(#1)|#2|{\ifnextchar/{\hSquaresppp(#1)|#2|}%
+ {\hSquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\hSquaresppp(#1)|#2|/#3/{%
+ \ifnextchar<{\hSquarespppp(#1)|#2|/#3/}%
+ {\hSquarespppp(#1)|#2|/#3/<\default>}}%
+
+\def\vSquarespppp(#1,#2)|#3|/#4/<#5,#6>[#7;#8]{%
+\Xpos=#1\Ypos=#2%
+\def\next|##1##2##3##4##5##6##7|{%
+ \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
+ \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
+\next|#3|%
+\deltaX=#5%
+\deltaY=#6%
+\def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
+ \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
+\next[#7]%
+\def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
+ \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
+\next[#8]%
+\dovSquares/#4/\ignorespaces}%
+
+\def\dovSquares/#1`#2`#3`#4`#5`#6`#7/{%
+\setmorphismwidth{\Nodea}{\Nodeb}{\Labela}{\topw}%
+\setmorphismwidth{\Nodec}{\Noded}{\Labeld}{\botw}%
+\ratchet{\topw}{\botw}%
+\setmorphismwidth{\Nodee}{\Nodef}{\Labelg}{\botw}%
+\ratchet{\topw}{\botw}%
+\square(\Xpos,\Ypos)|\Xd\Xe\Xf\Xg|/`#5`#6`#7/<\topw,\deltaX>%
+ [\Nodec`\Noded`\Nodee`\Nodef;`\Labele`\Labelf`\Labelg]%
+\advance \Ypos by \deltaX%
+\square(\Xpos,\Ypos)|\Xa\Xb\Xc\Xd|/#1`#2`#3`#4/<\topw,\deltaY>%
+ [\Nodea`\Nodeb`\Nodec`\Noded;\Labela`\Labelb`\Labelc`\Labeld]%
+}%
+
+\def\vSquares{\ifnextchar({\vSquaresp}{\vSquaresp(0,0)}}%
+\def\vSquaresp(#1){\ifnextchar|{\vSquarespp(#1)}{\vSquarespp%
+(#1)|alrmlrb|}}%
+\def\vSquarespp(#1)|#2|{\ifnextchar/{\vSquaresppp(#1)|#2|}%
+ {\vSquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\vSquaresppp(#1)|#2|/#3/{%
+ \ifnextchar<{\vSquarespppp(#1)|#2|/#3/}%
+ {\vSquarespppp(#1)|#2|/#3/<\default,\default>}}%
+
+\def\osquarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]{\squarepppp%
+ (#1)|#2|/#3`#4`#5`#6/<#7>[#8]%
+ \let\Nodea\nodea\let\Nodeb\nodeb%
+\let\Nodec\nodec\let\Noded\noded\Xpos=\xpos\Ypos=\ypos%
+\deltaX=\deltax \deltaY=\deltay \isquare}
+
+\def\cube{\ifnextchar({\osquarep}{\osquarep(0,0)}}%
+\def\osquarep(#1){\ifnextchar|{\osquarepp(#1)}{\osquarepp(#1)|alrb|}}%
+\def\osquarepp(#1)|#2|{\ifnextchar/{\osquareppp(#1)|#2|}%
+ {\osquareppp(#1)|#2|/>`>`>`>/}}%
+\def\osquareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\osquarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\osquarepppp(#1)|#2|/#3`#4`#5`#6/<1500,1500>}}%
+
+\def\isquarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]{%
+ \squarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]%
+\ifnextchar|{\cubep}{\cubep|mmmm|}}%
+\def\cubep|#1|{\ifnextchar/{\cubepp|#1|}{\cubepp|#1|/>`>`>`>/}}%
+
+\def\isquare{\ifnextchar({\isquarep}{\isquarep(\default,\default)}}%
+\def\isquarep(#1){\ifnextchar|{\isquarepp(#1)}{\isquarepp(#1)|alrb|}}
+\def\isquarepp(#1)|#2|{\ifnextchar/{\isquareppp(#1)|#2|}%
+ {\isquareppp(#1)|#2|/>`>`>`>/}}%
+\def\isquareppp(#1)|#2|/#3`#4`#5`#6/{%
+ \ifnextchar<{\isquarepppp(#1)|#2|/#3`#4`#5`#6/}%
+ {\isquarepppp(#1)|#2|/#3`#4`#5`#6/<500,500>}}%
+
+\def\cubepp|#1#2#3#4|/#5`#6`#7`#8/[#9]{%
+\def\next[##1`##2`##3`##4]{\gdef\Labela{##1}%
+\gdef\Labelb{##2}\gdef\Labelc{##3}\gdef\Labeld{##4}}\next[#9]%
+\xend\xpos \yend\ypos
+\Xend\xend\advance\Xend by -\Xpos
+\Yend\yend\advance\Yend by -\Ypos
+\domorphism(\Xpos,\Ypos)|#2|/#6/<\Xend,\Yend>[\Nodeb`\nodeb;\Labelb]%
+\advance\Xpos by-\deltaX
+\advance\xend by-\deltax
+\Xend\xend\advance\Xend by -\Xpos
+\domorphism(\Xpos,\Ypos)|#1|/#5/<\Xend,\Yend>[\Nodea`\nodea;\Labela]%
+\advance\Ypos by-\deltaY
+\advance\yend by-\deltay
+\Yend\yend\advance\Yend by -\Ypos
+\domorphism(\Xpos,\Ypos)|#3|/#7/<\Xend,\Yend>[\Nodec`\nodec;\Labelc]%
+\advance\Xpos by\deltaX
+\advance\xend by\deltax
+\Xend\xend\advance\Xend by -\Xpos
+\domorphism(\Xpos,\Ypos)|#4|/#8/<\Xend,\Yend>[\Noded`\noded;\Labeld]%
+\ignorespaces}
+
+\def\setwdth#1#2{\setbox0\hbox{$\labelstyle#1$}\wdth=\wd0
+\setbox0\hbox{$\labelstyle#2$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi}
+
+\def\topppp/#1/<#2>^#3_#4{\allowbreak\mathrel{%
+\ifnum#2=0
+ \setwdth{#3}{#4}\deltax=\wdth \divide \deltax by \ul
+ \advance \deltax by \defaultmargin \ratchet{\deltax}{200}%
+\else \deltax #2
+\fi
+\xy\ar@{#1}^{#3}_{#4}(\deltax,0) \endxy
+\ignorespaces}}
+
+\def\toppp/#1/<#2>^#3{\ifnextchar_{\topppp/#1/<#2>^{#3}}{\topppp/#1/<#2>^{#3}_{}}}
+\def\topp/#1/<#2>{\ifnextchar^{\toppp/#1/<#2>}{\toppp/#1/<#2>^{}}}
+\def\top/#1/{\ifnextchar<{\topp/#1/}{\topp/#1/<0>}}
+\def\to{\ifnextchar/{\top}{\top/>/}}
+
+\def\mon{\to/ >->/}
+\def\epi{\to/->>/}
+\def\toleft{\to/<-/}
+\def\monleft{\to/<-< /}
+\def\epileft{\to/<<-/}
+
+
+\def\twopppp/#1`#2/<#3>^#4_#5{\allowbreak\mathrel{%
+\ifnum0=#3
+ \setwdth{#4}{#5}\deltax=\wdth \divide \deltax by \ul \advance \deltax
+ by \defaultmargin \ratchet{\deltax}{200}%
+\else \deltax#3 \fi
+\xy\ar@{#1}@<2.5pt>^{#4}(\deltax,0)%
+\ar@{#2}@<-2.5pt>_{#5}(\deltax,0)\endxy\ignorespaces}}
+
+\def\twoppp/#1`#2/<#3>^#4{\ifnextchar_{\twopppp/#1`#2/<#3>^{#4}}%
+ {\twopppp/#1`#2/<#3>^{#4}_{}}}
+\def\twopp/#1`#2/<#3>{\ifnextchar^{\twoppp/#1`#2/<#3>}{\twoppp/#1`#2/<#3>^{}}}
+\def\twop/#1`#2/{\ifnextchar<{\twopp/#1`#2/}{\twopp/#1`#2/<0>}}
+\def\two{\ifnextchar/{\twop}{\twop/>`>/}}
+
+\def\twoleft{\two/<-`<-/}
+
+\def\threeppppp/#1`#2`#3/<#4>^#5|#6_#7{\allowbreak\mathrel{%
+\ifnum0=#4
+\setbox0\hbox{$\labelstyle#5$}\wdth=\wd0
+\setbox0\hbox{$\labelstyle#6$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi
+\setbox0\hbox{$\labelstyle#7$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi
+\deltax=\wdth \divide \deltax by \ul \advance \deltax by
+\defaultmargin \ratchet{\deltax}{300}%
+\else\deltax#4 \fi
+ \xy \ifnum\wd0=0 \ar@{#2}(\deltax,0)
+ \else \ar@{#2}|{#6}(\deltax,0)\fi
+\ar@{#1}@<4.5pt>^{#5}(\deltax,0)
+\ar@{#3}@<-4.5pt>_{#7}(\deltax,0)\endxy\ignorespaces}}
+
+\def\threepppp/#1`#2`#3/<#4>^#5|#6{\ifnextchar_{\threeppppp
+ /#1`#2`#3/<#4>^{#5}|{#6}}{\threeppppp/#1`#2`#3/<#4>^{#5}|{#6}_{}}}
+\def\threeppp/#1`#2`#3/<#4>^#5{\ifnextchar|{\threepppp
+ /#1`#2`#3/<#4>^{#5}}{\threepppp/#1`#2`#3/<#4>^{#5}|{}}}
+\def\threepp/#1`#2`#3/<#4>{\ifnextchar^{\threeppp/#1`#2`#3/<#4>}%
+ {\threeppp/#1`#2`#3/<#4>^{}}}
+\def\threep/#1`#2`#3/{\ifnextchar<{\threepp/#1`#2`#3/}%
+ {\threepp/#1`#2`#3/<0>}}
+\def\three{\ifnextchar/{\threep}{\threep/>`>`>/}}
+
+
+\def\twoar(#1,#2){{%
+ \scalefactor{0.1}
+ \deltax#1\deltay#2%
+ \deltaX=\ifnum\deltax<0-\fi\deltax
+ \deltaY=\ifnum\deltay<0-\fi\deltay
+ \Xend\deltax \multiply \Xend by \deltax
+ \Yend\deltay \multiply \Yend by \deltay
+ \advance\Xend by \Yend \multiply \Xend by 3
+ \ifnum \deltaX > \deltaY
+ \multiply \deltaX by 3 \advance \deltaX by \deltaY
+ \else
+ \multiply \deltaY by 3 \advance \deltaX by \deltaY
+ \fi
+ \multiply\deltax by 500
+ \multiply\deltay by 500
+ \xpos\deltax \multiply \xpos by 3 \divide\xpos by \deltaX
+ \Xpos\deltax \multiply \Xpos by \deltaX \divide \Xpos by \Xend
+ \advance \xpos by \Xpos
+ \ypos\deltay \multiply \ypos by 3 \divide\ypos by \deltaX
+ \Ypos\deltay \multiply \Ypos by \deltaX \divide \Ypos by \Xend
+ \advance \ypos by \Ypos
+ \xy \ar@{=>}(\xpos,\ypos) \endxy
+}\ignorespaces}
+
+\def\iiixiiipppppp(#1,#2)|#3|/#4/<#5>#6<#7>[#8;#9]{%
+ \xpos#1\ypos#2\relax
+ \def\next|##1##2##3##4##5##6##7|{\def\xa{##1}\def\xb{##2}%
+ \def\xc{##3}\def\xd{##4}\def\xe{##5}\def\xf{##6}\nextt|##7|}%
+ \def\nextt|##1##2##3##4##5##6|{\def\xg{##1}\def\xh{##2}%
+ \def\xi{##3}\def\xj{##4}\def\xk{##5}\def\xl{##6}}%
+ \next|#3|%
+ \def\next<##1,##2>{\deltax##1\deltay##2}%
+ \next<#5>%
+ \def\next<##1,##2>{\deltaX##1\deltaY##2}%
+ \next<#7>%
+ \def\next##1{\topw##1\relax
+ \ifodd\topw \def\zl{}\else\def\zl{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zk{}\else\def\zk{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zj{}\else\def\zj{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zi{}\else\def\zi{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zh{}\else\def\zh{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zg{}\else\def\zg{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zf{}\else\def\zf{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\ze{}\else\def\ze{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zd{}\else\def\zd{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zc{}\else\def\zc{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zb{}\else\def\zb{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\za{}\else\def\za{\relax}\fi}%
+ \next{#6}%
+ \def\next[##1`##2`##3`##4`##5`##6`##7`##8`##9]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\noded{##4}\def\nodee{##5}\def\nodef{##6}%
+ \def\nodeg{##7}\def\nodeh{##8}\def\nodei{##9}}%
+ \next[#8]%
+ \def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\labela{##1}\def\labelb{##2}\def\labelc{##3}%
+ \def\labeld{##4}\def\labele{##5}\def\labelf{##6}\nextt[##7]}%
+ \def\nextt[##1`##2`##3`##4`##5`##6]{%
+ \def\labelg{##1}\def\labelh{##2}\def\labeli{##3}%
+ \def\labelj{##4}\def\labelk{##5}\def\labell{##6}}%
+ \next[#9]%
+ \def\next/##1`##2`##3`##4`##5`##6`##7/{%
+\morphism(\xpos,\ypos)|\xe|/{##5}/<\deltax,0>[\nodeg`\nodeh;\labele]%
+ \ifx\zi\empty\relax \morphism(\xpos,\ypos)||/<-/<-\deltaX,0>[\nodeg`0;]\fi
+ \ifx\zd\empty\relax \morphism(\xpos,\ypos)||<0,-\deltaY>[\nodeg`0;]\fi
+ \advance\xpos by \deltax
+ \morphism(\xpos,\ypos)|\xf|/{##6}/<\deltax,0>[\nodeh`\nodei;\labelf]%
+ \ifx\ze\empty\relax \morphism(\xpos,\ypos)||<0,-\deltaY>[\nodeh`0;]\fi
+ \advance\xpos by \deltax
+ \ifx\zf\empty\relax \morphism(\xpos,\ypos)||<0,-\deltaY>[\nodei`0;]\fi
+ \ifx\zl\empty\relax \morphism(\xpos,\ypos)||<\deltaX,0>[\nodei`0;]\fi
+ \advance\ypos by \deltay
+ \ifx\zk\empty\relax \morphism(\xpos,\ypos)||<\deltaX,0>[\nodef`0;]\fi
+ \advance\xpos by -\deltax
+ \morphism(\xpos,\ypos)|\xd|/{##4}/<\deltax,0>[\nodee`\nodef;\labeld]%
+ \advance\xpos by -\deltax
+ \morphism(\xpos,\ypos)|\xc|/{##3}/<\deltax,0>[\noded`\nodee;\labelc]%
+ \ifx\zh\empty\relax \morphism(\xpos,\ypos)||/<-/<-\deltaX,0>[\noded`0;]\fi
+ \advance\ypos by \deltay
+ \morphism(\xpos,\ypos)|\xa|/{##1}/<\deltax,0>[\nodea`\nodeb;\labela]%
+ \ifx\zg\empty\relax \morphism(\xpos,\ypos)||/<-/<-\deltaX,0>[\nodea`0;]\fi
+ \ifx\za\empty\relax \morphism(\xpos,\ypos)||/<-/<0,\deltaY>[\nodea`0;]\fi
+ \advance\xpos by \deltax
+ \morphism(\xpos,\ypos)|\xb|/{##2}/<\deltax,0>[\nodeb`\nodec;\labelb]%
+ \ifx\zb\empty\relax \morphism(\xpos,\ypos)||/<-/<0,\deltaY>[\nodeb`0;]\fi
+ \advance\xpos by \deltax
+ \ifx\zc\empty\relax \morphism(\xpos,\ypos)||/<-/<0,\deltaY>[\nodec`0;]\fi
+ \ifx\zj\empty\relax \morphism(\xpos,\ypos)||<\deltaX,0>[\nodec`0;]\fi
+ \nextt/##7/}%
+ \def\nextt/##1`##2`##3`##4`##5`##6/{%
+ \morphism(\xpos,\ypos)|\xi|/{##3}/<0,-\deltay>[\nodec`\nodef;\labeli]%
+ \advance\xpos by -\deltax
+ \morphism(\xpos,\ypos)|\xh|/{##2}/<0,-\deltay>[\nodeb`\nodee;\labelh]%
+ \advance\xpos by -\deltax
+ \morphism(\xpos,\ypos)|\xg|/{##1}/<0,-\deltay>[\nodea`\noded;\labelg]%
+ \advance\ypos by -\deltay
+ \morphism(\xpos,\ypos)|\xj|/{##4}/<0,-\deltay>[\noded`\nodeg;\labelj]%
+ \advance\xpos by \deltax
+ \morphism(\xpos,\ypos)|\xk|/{##5}/<0,-\deltay>[\nodee`\nodeh;\labelk]%
+ \advance\xpos by \deltax
+ \morphism(\xpos,\ypos)|\xl|/{##6}/<0,-\deltay>[\nodef`\nodei;\labell]}%
+ \next/#4/\ignorespaces}
+
+\def\iiixiii{\ifnextchar({\iiixiiip}{\iiixiiip(0,0)}}%
+\def\iiixiiip(#1){\ifnextchar|{\iiixiiipp(#1)}%
+ {\iiixiiipp(#1)|aammbblmrlmr|}}%
+\def\iiixiiipp(#1)|#2|{\ifnextchar/{\iiixiiippp(#1)|#2|}%
+ {\iiixiiippp(#1)|#2|/>`>`>`>`>`>`>`>`>`>`>`>/}}%
+\def\iiixiiippp(#1)|#2|/#3/{%
+ \ifnextchar<{\iiixiiipppp(#1)|#2|/#3/}%
+ {\iiixiiipppp(#1)|#2|/#3/<\default,\default>}}%
+\def\iiixiiipppp(#1)|#2|/#3/<#4>{\ifnextchar[{\iiixiiippppp(#1)|#2|/#3/%
+ <#4>0<0,0>}{\iiixiiippppp(#1)|#2|/#3/<#4>}}%
+\def\iiixiiippppp(#1)|#2|/#3/<#4>#5{\ifnextchar<%
+ {\iiixiiipppppp(#1)|#2|/#3/<#4>{#5}}%
+ {\iiixiiipppppp(#1)|#2|/#3/<#4>{#5}<400,400>}}%
+
+\def\iiixiipppppp(#1,#2)|#3|/#4/<#5>#6<#7>[#8;#9]{%
+ \xpos#1\ypos#2\relax
+ \def\next|##1##2##3##4##5##6##7|{\def\xa{##1}\def\xb{##2}%
+ \def\xc{##3}\def\xd{##4}\def\xe{##5}\def\xf{##6}\def\xg{##7}}%
+ \next|#3|%
+ \def\next<##1,##2>{\deltax##1\deltay##2}%
+ \next<#5>%
+ \deltaX#7
+ \topw#6
+ \def\next{%
+ \ifodd\topw \def\zd{}\else\def\zd{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zc{}\else\def\zc{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\zb{}\else\def\zb{\relax}\fi \divide\topw by 2
+ \ifodd\topw \def\za{}\else\def\za{\relax}\fi}%
+ \next
+ \def\next[##1`##2`##3`##4`##5`##6]{%
+ \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
+ \def\noded{##4}\def\nodee{##5}\def\nodef{##6}}%
+ \next[#8]%
+ \def\next[##1`##2`##3`##4`##5`##6`##7]{%
+ \def\labela{##1}\def\labelb{##2}\def\labelc{##3}%
+ \def\labeld{##4}\def\labele{##5}\def\labelf{##6}\def\labelg{##7}}%
+ \next[#9]%
+ \def\next/##1`##2`##3`##4`##5`##6`##7/{%
+ \ifx\zc\empty\relax\morphism(\xpos,\ypos)<\deltaX,0>[0`\noded;]\fi
+ \advance\xpos by\deltaX
+ \morphism(\xpos,\ypos)|\xc|/##3/<\deltax,0>[\noded`\nodee;\labelc]%
+ \advance\xpos by \deltax
+ \morphism(\xpos,\ypos)|\xd|/##4/<\deltax,0>[\nodee`\nodef;\labeld]%
+ \advance\xpos by \deltax
+ \ifx\zd\empty\relax \morphism(\xpos,\ypos)<\deltaX,0>[\nodef`0;]\fi
+ \advance\xpos by -\deltaX \advance\xpos by -\deltax
+ \advance\xpos by -\deltax \advance\ypos by \deltay
+ \ifx\za\empty\relax\morphism(\xpos,\ypos)<\deltaX,0>[0`\nodea;]\fi
+ \advance\xpos by\deltaX
+ \morphism(\xpos,\ypos)|\xa|/##1/<\deltax,0>[\nodea`\nodeb;\labela]%
+ \morphism(\xpos,\ypos)|\xe|/##5/<0,-\deltay>[\nodea`\noded;\labele]%
+ \advance\xpos by \deltax
+ \morphism(\xpos,\ypos)|\xb|/##2/<\deltax,0>[\nodeb`\nodec;\labelb]%
+ \morphism(\xpos,\ypos)|\xf|/##6/<0,-\deltay>[\nodeb`\nodee;\labelf]%
+ \advance\xpos by \deltax
+ \morphism(\xpos,\ypos)|\xg|/##7/<0,-\deltay>[\nodec`\nodef;\labelg]%
+ \ifx\zb\empty\relax \morphism(\xpos,\ypos)<\deltaX,0>[\nodec`0;]\fi}%
+ \next/#4/\ignorespaces}
+
+
+\def\iiixii{\ifnextchar({\iiixiip}{\iiixiip(0,0)}}%
+\def\iiixiip(#1){\ifnextchar|{\iiixiipp(#1)}%
+ {\iiixiipp(#1)|aabblmr|}}%
+\def\iiixiipp(#1)|#2|{\ifnextchar/{\iiixiippp(#1)|#2|}%
+ {\iiixiippp(#1)|#2|/>`>`>`>`>`>`>/}}%
+\def\iiixiippp(#1)|#2|/#3/{%
+ \ifnextchar<{\iiixiipppp(#1)|#2|/#3/}%
+ {\iiixiipppp(#1)|#2|/#3/<\default,\default>}}%
+\def\iiixiipppp(#1)|#2|/#3/<#4>{\ifnextchar[{\iiixiippppp(#1)|#2|/#3/%
+ <#4>{0}<0>}{\iiixiippppp(#1)|#2|/#3/<#4>}}%
+\def\iiixiippppp(#1)|#2|/#3/<#4>#5{\ifnextchar<%
+ {\iiixiipppppp(#1)|#2|/#3/<#4>{#5}}%
+ {\iiixiipppppp(#1)|#2|/#3/<#4>{#5}<0>}}%
+
+\catcode`\@=\atcode%
+\endinput