summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/eplain/base/arrow.texi
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/eplain/base/arrow.texi')
-rw-r--r--Master/texmf-dist/doc/eplain/base/arrow.texi781
1 files changed, 781 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/eplain/base/arrow.texi b/Master/texmf-dist/doc/eplain/base/arrow.texi
new file mode 100644
index 00000000000..c5d4786cef3
--- /dev/null
+++ b/Master/texmf-dist/doc/eplain/base/arrow.texi
@@ -0,0 +1,781 @@
+@c arrow.texi - documentation for Eplain's commutative diagrams.
+@c Copyright (C) 1991, 1992 Steven Smith.
+@c This is part of the Eplain manual.
+@c
+@c This file is free software; you can redistribute it and/or modify
+@c it under the terms of the GNU General Public License as published by
+@c the Free Software Foundation; either version 2, or (at your option)
+@c any later version.
+@c
+@c This file is distributed in the hope that it will be useful,
+@c but WITHOUT ANY WARRANTY; without even the implied warranty of
+@c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+@c GNU General Public License for more details.
+@c
+@c You should have received a copy of the GNU General Public License
+@c along with this file; if not, write to the Free Software
+@c Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+@c 02110-1301, USA.
+
+@comment \input texinfo
+@comment setfilename arrow.info
+@comment settitle Arrow Theoretic Diagrams
+
+@c Input arrow macros without altering texinfo's \catcodes.
+@c Use the arrow macros in an `@iftex @tex ... @end iftex' environment.
+
+@iftex
+@catcode`@$=3 @catcode`@%=14 @catcode`@&=4 @catcode`@#=6
+@catcode`@^=7 @catcode`@_=8
+@catcode`@"=@other @catcode`@<=@other @catcode`@>=@other
+@catcode`@\=0
+\catcode`\@=\other
+\input arrow
+\catcode`\@=0
+@catcode`@\=@active
+@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
+@catcode`@^=@active @catcode`@_=@active
+@catcode`@"=@active @catcode`@<=@active @catcode`@>=@active
+@end iftex
+
+
+@node Arrow theoretic diagrams
+@chapter Arrow theoretic diagrams
+
+This chapter describes definitions for producing commutative diagrams.
+
+Steven Smith wrote this documentation (and the macros).
+
+@menu
+* Slanted lines and vectors::
+* Commutative diagrams::
+@end menu
+
+@node Slanted lines and vectors
+@section Slanted lines and vectors
+
+The macros @code{\drawline}
+@findex drawline
+and @code{\drawvector}
+@findex drawvector
+provide the capability found in @LaTeX{}'s
+@cindex @LaTeX{}
+@cindex picture mode
+picture mode to draw slanted lines and vectors of certain directions.
+Both of these macros take three arguments: two integer arguments to
+specify the direction of the line or vector, and one argument to specify
+its length. For example, @samp{\drawvector(-4,1)@{60pt@}} produces the
+vector
+@iftex
+@tex
+$$\vbox{\hbox{\drawvector(-4,1){60pt}}\smallskip
+ \hbox{$\mathop{\hbox to60pt{\leftarrowfill\hskip-5pt\rightarrowfill}}
+ \limits_{{\fam0 60\,pt}}$}}$$
+@end tex
+@end iftex
+@ifinfo
+
+@center (A vector in the 2d quadrant of length 60 pt appears here.)
+
+@end ifinfo
+@cindex lines
+@cindex vectors
+which lies in the 2d quadrant, has a slope of minus 1/4, and a width of
+60 pt.
+
+Note that if an @code{\hbox} is placed around @code{\drawline} or
+@code{\drawvector}, then the width of the @code{\hbox} will be the
+positive dimension specified in the third argument, except when a
+vertical line or vector is specified, e.g.,
+@code{\drawline(0,1)@{1in@}}, which has zero width. If the specified
+direction lies in the 1st or 2d quadrant (e.g., @code{(1,1)} or
+@code{(-2,3)}), then the @code{\hbox} will have positive height and zero
+depth. Conversely, if the specified direction lies in the 3d or 4th
+quadrant (e.g., @code{(-1,-1)} or @code{(2,-3)}), then the @code{\hbox}
+will have positive depth and zero height.
+
+There are a finite number of directions that can be specified. For
+@code{\drawline}, the absolute value of each integer defining the
+direction must be less than or equal to six, i.e., @code{(7,-1)} is
+incorrect, but @code{(6,-1)} is acceptable. For @code{\drawvector}, the
+absolute value of each integer must be less than or equal to four.
+Furthermore, the two integers cannot have common divisors; therefore, if
+a line with slope 2 is desired, say @code{(2,1)} instead of
+@code{(4,2)}. Also, specify @code{(1,0)} instead of, say, @code{(3,0)}
+for horizontal lines and likewise for vertical lines.
+
+Finally, these macros depend upon the @LaTeX{} font @code{line10}. If
+your site doesn't have this font, ask your system administrator to get
+it. Future enhancements will include macros to draw dotted lines and
+dotted vectors of various directions.
+
+
+@node Commutative diagrams
+@section Commutative diagrams
+
+@cindex commutative diagrams
+
+The primitive commands @code{\drawline} and @code{\drawvector} can be
+used to typeset arrow theoretic diagrams. This section describes (1)
+macros to facilitate typesetting arrows and morphisms, and (2) macros to
+facilitate the construction of commutative diagrams. All macros
+described in this section must be used in math mode.
+
+@menu
+* Arrows and morphisms::
+* Construction of commutative diagrams::
+* Commutative diagram parameters::
+@end menu
+
+@node Arrows and morphisms
+@subsection Arrows and morphisms
+@cindex arrows
+@cindex morphisms
+
+The macros @code{\mapright} and @code{\mapleft} produce right and left
+@findex mapright
+@findex mapleft
+pointing arrows, respectively. Use superscript (@code{^}) to place a
+morphism above the arrow, e.g., @samp{\mapright^\alpha}; use subscript
+(@code{_}) to place a morphism below the arrow, e.g.,
+@samp{\mapright_@{\tilde l@}}. Superscripts and subscripts may be used
+simulataneously, e.g., @samp{\mapright^\pi_@{\rm epimor.@}}.
+
+Similarly, the macros @code{\mapup} and @code{\mapdown} produce up and
+@findex mapup
+@findex mapdown
+down pointing arrows, respectively. Use @code{\rt}
+@findex rt
+to place a morphism to the right of the arrow, e.g., @samp{\mapup\rt@{\rm
+id@}}; use @code{\lft}
+@findex lft
+to place a morphism to the left of the arrow, e.g., @samp{\mapup\lft\omega}.
+@code{\lft} and @code{\rt} may be used simultaneously, e.g.,
+@samp{\mapdown\lft\pi\rt@{\rm monomor.@}}.
+
+Slanted arrows are produced by the macro @code{\arrow}, which takes
+@findex arrow
+a direction argument (e.g., @samp{\arrow(3,-4)}). Use @code{\rt} and
+@code{\lft} to place morphisms to the right and left, respectively, of
+the arrow. A slanted line (no arrowhead) is produced with the macro
+@code{\sline},
+@findex sline
+whose syntax is identical to that of @code{\arrow}.
+
+The length of these macros is predefined by the default @TeX{}
+dimensions @code{\harrowlength},
+@findex harrowlength
+for horizontal arrows (or lines),
+@code{\varrowlength},
+@findex varrowlength
+for vertical arrows (or lines), and
+@code{\sarrowlength},
+@findex sarrowlength
+for slanted arrows (or lines). To change any of these dimensions, say,
+e.g., @samp{\harrowlength=40pt}. As with all other @TeX{} dimensions,
+the change may be as global or as local as you like. Furthermore, the
+placement of morphisms on the arrows is controlled by the dimensions
+@code{\hmorphposn},
+@findex hmorphposn
+@code{\vmorphposn},
+@findex vmorphposn
+and @code{\morphdist}.
+@findex morphdist
+The first two dimensions control the horizontal and vertical position of
+the morphism from its default position; the latter dimension controls
+the distance of the morphism from the arrow. If you have more than one
+morphism per arrow (i.e., a @code{^}/@code{_} or @code{\lft}/@code{\rt}
+construction), use the parameters
+@code{\hmorphposnup},
+@findex hmorphposnup
+@code{\hmorphposndn},
+@findex hmorphposndn
+@code{\vmorphposnup},
+@findex vmorphposnup
+@code{\vmorphposndn},
+@findex vmorphposndn
+@code{\hmorphposnrt},
+@findex hmorphposnrt
+@code{\hmorphposnlft},
+@findex hmorphposnlft
+@code{\vmorphposnrt},
+@findex vmorphposnrt
+and @code{\vmorphposnlft}.
+@findex vmorphposnlft
+The default values of all these dimensions are provided in the section
+on parameters that follows below.
+
+There is a family of macros to produce horizontal lines, arrows, and
+adjoint arrows. The following macros produce horizontal maps and have
+the same syntax as @code{\mapright}:
+
+@table @code
+
+@item \mapright
+@findex mapright
+@code{$X\mapright Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\mapright Y$.
+@end tex
+@end iftex
+@ifinfo
+= (a right arrow).
+@end ifinfo
+
+@item \mapleft
+@findex mapleft
+@code{$X\mapleft Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\mapleft Y$.
+@end tex
+@end iftex
+@ifinfo
+= (a left arrow).
+@end ifinfo
+
+@item \hline
+@findex hline
+@code{$X\hline Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\hline Y$.
+@end tex
+@end iftex
+@ifinfo
+= (horizontal line)
+@end ifinfo
+
+@ignore
+@item \dothline
+@findex dothline
+(dotted horizontal line) {@bf Unimplemented.}
+@end ignore
+
+@item \bimapright
+@findex bimapright
+@code{$X\bimapright Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\bimapright Y$.
+@end tex
+@end iftex
+@ifinfo
+= (two right arrows).
+@end ifinfo
+
+@item \bimapleft
+@findex bimapleft
+@code{$X\bimapleft Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\bimapleft Y$.
+@end tex
+@end iftex
+@ifinfo
+= (two left arrows)
+@end ifinfo
+
+@item \adjmapright
+@findex adjmapright
+@code{$X\adjmapright Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\adjmapright Y$.
+@end tex
+@end iftex
+@ifinfo
+= (two adjoint arrows; left over right)
+@end ifinfo
+
+@item \adjmapleft
+@findex adjmapleft
+@code{$X\adjmapleft Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\adjmapleft Y$.
+@end tex
+@end iftex
+@ifinfo
+= (two adjoint arrows; right over left)
+@end ifinfo
+
+@item \bihline
+@findex bihline
+@code{$X\bihline Y$}
+@iftex
+@tex
+$\equiv$ $\harrowlength=20ptX\bihline Y$.
+@end tex
+@end iftex
+@ifinfo
+= (two horizontal lines)
+@end ifinfo
+@end table
+
+There is also a family of macros to produce vertical lines, arrows, and
+adjoint arrows. The following macros produce vertical maps and have
+the same syntax as @code{\mapdown}:
+
+@table @code
+
+@item \mapdown
+@findex mapdown
+(a down arrow)
+
+@item \mapup
+@findex mapup
+(an up arrow)
+
+@item \vline
+@findex vline
+(vertical line)
+
+@ignore
+@item \dotvline
+@findex dotvline
+(dotted vertical line) {@bf Unimplemented.}
+@end ignore
+
+@item \bimapdown
+@findex bimapdown
+(two down arrows)
+
+@item \bimapup
+@findex bimapup
+(two up arrows)
+
+@item \adjmapdown
+@findex adjmapdown
+(two adjoint arrows; down then up)
+
+@item \adjmapup
+@findex adjmapup
+(two adjoint arrows; up then down)
+
+@item \bivline
+@findex bivline
+(two vertical lines)
+@end table
+
+Finally, there is a family of macros to produce slanted lines, arrows,
+and adjoint arrows. The following macros produce slanted maps and have
+the same syntax as @code{\arrow}:
+
+@table @code
+
+@item \arrow
+@findex arrow
+(a slanted arrow)
+
+@item \sline
+@findex sline
+(a slanted line)
+
+@item \biarrow
+@findex biarrow
+(two straight arrows)
+
+@item \adjarrow
+@findex adjarrow
+(two adjoint arrows)
+
+@item \bisline
+@findex bisline
+(two straight lines)
+
+@end table
+
+The width between double arrows is controlled by the parameter
+@code{\channelwidth}.
+@findex channelwidth
+The parameters @code{\hchannel} and @code{\vchannel}, if nonzero,
+override @code{\channelwidth} by controlling the horizontal and vertical
+shifting from the first arrow to the second.
+
+There are no adornments on these arrows to distinguish inclusions from
+epimorphisms from monomorphisms. Many texts, such as Lang's book
+@cite{Algebra}, use as a tasteful alternative the symbol `inc' (in roman) next
+to an arrow to denote inclusion.
+@cindex Lang, Serge
+
+Future enhancements will include a mechanism to draw curved arrows
+found in, e.g., the Snake Lemma, by employing a version of the
+@code{\path} macros of Appendix D of @cite{The @TeX{}book}.
+@cindex Snake Lemma
+
+
+@node Construction of commutative diagrams
+@subsection Construction of commutative diagrams
+
+There are two approaches to the construction of commutative diagrams
+described here. The first approach, and the simplest, treats
+commutative diagrams like fancy matrices, as Knuth does in Exercise
+18.46 of @cite{The @TeX{}book}. This case is covered by the macro
+@code{\commdiag},
+@findex commdiag
+which is an altered version of the Plain @TeX{} macro @code{\matrix}.
+@findex matrix
+An example suffices to demonstrate this macro. The following
+commutative diagram (illustrating the covering homotopy property; Bott
+and Tu, @cite{Differential Forms in Algebraic Topology})
+@cindex Bott, Raoul
+@cindex Tu, Loring W.
+@cindex covering homotopy property
+@iftex
+@tex
+$$\commdiag{Y&\mapright^f&E\cr \mapdown&\arrow(3,2)\lft{f_t}&\mapdown\cr
+Y\times I&\mapright^{\bar f_t}&X}$$
+@end tex
+@end iftex
+@ifinfo
+
+@center (A commutative diagram appears here in the printed output.)
+
+@end ifinfo
+is produced with the code
+
+@example
+$$\commdiag@{Y&\mapright^f&E\cr \mapdown&\arrow(3,2)\lft@{f_t@}&\mapdown\cr
+Y\times I&\mapright^@{\bar f_t@}&X@}$$
+@end example
+
+Of course, the parameters may be changed to produce a different effect.
+The following commutative diagram (illustrating the universal mapping
+property; Warner, @cite{Foundations of Differentiable Manifolds and Lie
+Groups})
+@cindex Warner, Frank W.
+@cindex universal mapping property
+@iftex
+@tex
+$$\varrowlength=20pt
+\commdiag{V\otimes W\cr \mapup\lft\phi&\arrow(3,-1)\rt{\tilde l}\cr
+V\times W&\mapright^l&U\cr}$$
+@end tex
+@end iftex
+@ifinfo
+
+@center (A commutative diagram appears here in the printed output.)
+
+@end ifinfo
+is produced with the code
+
+@example
+$$\varrowlength=20pt
+\commdiag@{V\otimes W\cr \mapup\lft\phi&\arrow(3,-1)\rt@{\tilde l@}\cr
+V\times W&\mapright^l&U\cr@}$$
+@end example
+
+A diagram containing isosceles triangles is achieved by placing the apex
+of the triangle in the center column, as shown in the example
+(illustrating all constant minimal realizations of a linear system;
+Brockett, @cite{Finite Dimensional Linear Systems})
+@cindex Brockett, Roger W.
+@cindex minimal realizations
+@cindex linear systems theory
+@iftex
+@tex
+$$\sarrowlength=.42\harrowlength
+\commdiag{&R^m\cr &\arrow(-1,-1)\lft{\fam6 B}\quad \arrow(1,-1)\rt{\fam6 G}\cr
+R^n&\mapright^{\fam6 P}&R^n\cr
+\mapdown\lft{e^{{\fam6 A}t}}&&\mapdown\rt{e^{{\fam6 F}t}}\cr
+R^n&\mapright^{\fam6 P}&R^n\cr
+&\arrow(1,-1)\lft{\fam6 C}\quad \arrow(-1,-1)\rt{\fam6 H}\cr
+&R^q\cr}$$
+@end tex
+@end iftex
+@ifinfo
+
+@center (A commutative diagram appears here in the printed output.)
+
+@end ifinfo
+which is produced with the code
+
+@example
+$$\sarrowlength=.42\harrowlength
+\commdiag@{&R^m\cr &\arrow(-1,-1)\lft@{\bf B@}\quad \arrow(1,-1)\rt@{\bf G@}\cr
+R^n&\mapright^@{\bf P@}&R^n\cr
+\mapdown\lft@{e^@{@{\bf A@}t@}@}&&\mapdown\rt@{e^@{@{\bf F@}t@}@}\cr
+R^n&\mapright^@{\bf P@}&R^n\cr
+&\arrow(1,-1)\lft@{\bf C@}\quad \arrow(-1,-1)\rt@{\bf H@}\cr
+&R^q\cr@}$$
+@end example
+
+Other commutative diagram examples appear in the file
+@code{commdiags.tex}, which is distributed with this package.
+
+In these examples the arrow lengths and line slopes were carefully
+chosen to blend with each other. In the first example, the default
+settings for the arrow lengths are used, but a direction for the arrow
+must be chosen. The ratio of the default horizontal and vertical arrow
+lengths is approximately the golden mean
+@cindex golden mean
+@iftex
+@tex
+$\gamma=1.618\ldots$;
+@end tex
+@end iftex
+@ifinfo
+gamma=1.618...;
+@end ifinfo
+@cindex golden mean
+the arrow direction closest to this mean is @code{(3,2)}. In the second
+example, a slope of
+@iftex
+@tex
+$-1/3$
+@end tex
+@end iftex
+@ifinfo
+-1/3
+@end ifinfo
+is desired and the default horizontal arrow length is 60 pt; therefore,
+choose a vertical arrow length of 20 pt. You may affect the interline
+glue settings of @code{\commdiag} by redefining the macro
+@code{\commdiagbaselines}.
+@findex commdiagbaselines
+(cf@. Exercise 18.46 of @cite{The @TeX{}book} and the section on
+parameters below.)
+
+The width, height, and depth of all morphisms are hidden so that the
+morphisms' size do not affect arrow positions. This can cause a large
+morphism at the top or bottom of a diagram to impinge upon the text
+surrounding the diagram. To overcome this problem, use @TeX{}'s
+@code{\noalign} primitive to insert a @code{\vskip} immediately above or
+below the offending line, e.g.,
+@samp{$$\commdiag@{\noalign@{\vskip6pt@}X&\mapright^\int&Y\cr ...@}}.
+
+The macro @code{\commdiag} is too simple to be used for more complicated
+diagrams, which may have intersecting or overlapping arrows. A second
+approach, borrowed from Francis Borceux's @cite{Diagram} macros for
+@LaTeX{}, treats the commutative diagram like a grid of identically
+shaped boxes. To compose the commutative diagram, first draw an equally
+spaced grid, e.g.,
+@cindex grid
+@cindex Borceux, Francis
+@cindex Diagram, macros for LaTeX
+@iftex
+@tex
+$$\def\grid{\cdot&\cdot&\cdot&\cdot&\cdot&\cdot\cr}
+\matrix{\grid\grid\grid\grid}$$
+@end tex
+@end iftex
+@ifinfo
+
+@center . . . . . .
+@center . . . . . .
+@center . . . . . .
+@center . . . . . .
+
+@end ifinfo
+on a piece of scratch paper. Then draw each element (vertices and
+arrows) of the commutative diagram on this grid, centered at each
+grid point. Finally, use the macro @code{\gridcommdiag}
+@findex gridcommdiag
+to implement your design as a @TeX{} alignment. For example, the cubic
+diagram
+@cindex cube
+@iftex
+@tex
+$$\harrowlength=48pt \varrowlength=48pt \sarrowlength=20pt
+\def\cross#1#2{\setbox0=\hbox{$#1$}%
+ \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+\gridcommdiag{&&B&&\mapright^b&&D\cr
+&\arrow(1,1)\lft a&&&&\arrow(1,1)\lft d\cr
+A&&\cross{\hmorphposn=12pt\mapright^c}{\vmorphposn=-12pt\mapdown\lft f}
+&&C&&\mapdown\rt h\cr\cr
+\mapdown\lft e&&F&&\cross{\hmorphposn=-12pt\mapright_j}
+{\vmorphposn=12pt\mapdown\rt g}&&H\cr
+&\arrow(1,1)\lft i&&&&\arrow(1,1)\rt l\cr
+E&&\mapright_k&&G\cr}$$
+@end tex
+@end iftex
+@ifinfo
+
+@center (A commutative diagram appears here.)
+
+@end ifinfo
+that appears in Francis Borceux's documentation can be implemented on
+a 7 by 7 grid, and is achieved with the code
+
+@example
+$$\harrowlength=48pt \varrowlength=48pt \sarrowlength=20pt
+\def\cross#1#2@{\setbox0=\hbox@{$#1$@}%
+ \hbox to\wd0@{\hss\hbox@{$#2$@}\hss@}\llap@{\unhbox0@}@}
+\gridcommdiag@{&&B&&\mapright^b&&D\cr
+&\arrow(1,1)\lft a&&&&\arrow(1,1)\lft d\cr
+A&&\cross@{\hmorphposn=12pt\mapright^c@}@{\vmorphposn=-12pt\mapdown\lft f@}
+&&C&&\mapdown\rt h\cr\cr
+\mapdown\lft e&&F&&\cross@{\hmorphposn=-12pt\mapright_j@}
+@{\vmorphposn=12pt\mapdown\rt g@}&&H\cr
+&\arrow(1,1)\lft i&&&&\arrow(1,1)\rt l\cr
+E&&\mapright_k&&G\cr@}$$
+@end example
+
+The dimensions @code{\hgrid} and @code{\vgrid}
+@findex hgrid
+@findex vgrid
+control the horizontal and vertical spacing of the grid used by
+@code{\gridcommdiag}. The default setting for both of these dimensions
+is 15 pt. Note that in the example of the cube the arrow lengths must
+be adjusted so that the arrows overlap into neighboring boxes by the
+desired amount. Hence, the @code{\gridcommdiag} method, albeit more
+powerful, is less automatic than the simpler @code{\commdiag} method.
+Furthermore, the ad hoc macro @code{\cross} is introduced to allow the
+effect of overlapping arrows. Finally, note that the positions of four
+of the morphisms are adjusted by setting @code{\hmorphposn} and
+@code{\vmorphposn}.
+
+One is not restricted to a square grid. For example, the proof of
+Zassenhaus's Butterfly Lemma can be illustrated by the diagram (appearing
+in Lang's book @cite{Algebra})
+@cindex Zassenhaus, Hans
+@cindex Lang, Serge
+@cindex Butterfly Lemma
+@iftex
+@tex
+$$\hgrid=16pt \vgrid=8pt \sarrowlength=32pt
+\def\cross#1#2{\setbox0=\hbox{$#1$}%
+ \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+\def\l#1{\llap{$#1$\hskip.5em}}
+\def\r#1{\rlap{\hskip.5em$#1$}}
+\gridcommdiag{&&U&&&&V\cr &&\bullet&&&&\bullet\cr
+&&\sarrowlength=16pt\sline(0,1)&&&&\sarrowlength=16pt\sline(0,1)\cr
+&&\l{u(U\cap V)}\bullet&&&&\bullet\r{(U\cap V)v}\cr
+&&&\sline(2,-1)&&\sline(2,1)\cr
+&&\cross{=}{\sline(0,1)}&&\bullet&&\cross{=}{\sline(0,1)}\cr\cr
+&&\l{^{\textstyle u(U\cap v)}}\bullet&&\cross{=}{\sline(0,1)}&&
+ \bullet\r{^{\textstyle(u\cap V)v}}\cr
+&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)\cr
+\l{u}\bullet&&&&\bullet&&&&\bullet\r{v}\cr
+&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)\cr
+&&\bullet&&&&\bullet\cr &&u\cap V&&&&U\cap v\cr}$$
+@end tex
+@end iftex
+@ifinfo
+
+@center (A commutative diagram appears here.)
+
+@end ifinfo
+This diagram may be implemented on a 9 by 12 grid with an aspect ratio
+of 1/2, and is set with the code
+
+@example
+$$\hgrid=16pt \vgrid=8pt \sarrowlength=32pt
+\def\cross#1#2@{\setbox0=\hbox@{$#1$@}%
+ \hbox to\wd0@{\hss\hbox@{$#2$@}\hss@}\llap@{\unhbox0@}@}
+\def\l#1@{\llap@{$#1$\hskip.5em@}@}
+\def\r#1@{\rlap@{\hskip.5em$#1$@}@}
+\gridcommdiag@{&&U&&&&V\cr &&\bullet&&&&\bullet\cr
+&&\sarrowlength=16pt\sline(0,1)&&&&\sarrowlength=16pt\sline(0,1)\cr
+&&\l@{u(U\cap V)@}\bullet&&&&\bullet\r@{(U\cap V)v@}\cr
+&&&\sline(2,-1)&&\sline(2,1)\cr
+&&\cross@{=@}@{\sline(0,1)@}&&\bullet&&\cross@{=@}@{\sline(0,1)@}\cr\cr
+&&\l@{^@{\textstyle u(U\cap v)@}@}\bullet&&\cross@{=@}@{\sline(0,1)@}&&
+ \bullet\r@{^@{\textstyle(u\cap V)v@}@}\cr
+&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)\cr
+\l@{u@}\bullet&&&&\bullet&&&&\bullet\r@{v@}\cr
+&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)\cr
+&&\bullet&&&&\bullet\cr &&u\cap V&&&&U\cap v\cr@}$$
+@end example
+
+Again, the construction of this diagram requires careful choices for the
+arrow lengths and is facilitated by the introduction of the ad hoc
+macros @code{\cross}, @code{\r}, and @code{\l}. Note also that
+superscripts were used to adjust the position of the vertices
+@iftex
+@tex
+$u(U\cap v)$ and $(u\cap V)v$.
+@end tex
+@end iftex
+@ifinfo
+u(U intersection v) and (u intersection V)v.
+@end ifinfo
+Many diagrams may be typeset with the predefined macros that appear
+here; however, ingenuity is often required to handle special cases.
+
+@node Commutative diagram parameters
+@subsection Commutative diagram parameters
+
+The following is a list describing the parameters used in the
+commutative diagram macros. These dimensions may be changed globally or
+locally.
+
+@table @code
+@item \harrowlength
+@findex harrowlength
+(Default: 60 pt) The length of right or left arrows.
+
+@item \varrowlength
+@findex varrowlength
+(Default: 0.618@code{\harrowlength}) The length of up or down
+arrows.
+
+@item \sarrowlength
+@findex sarrowlength
+(Default: 60 pt) The horizontal length of slanted arrows.
+
+@item \hmorphposn
+@findex hmorphposn
+(Default: 0 pt) The horizontal position of the morphism with
+respect to its default position. There are also the dimensions
+@code{\hmorphposnup},
+@findex hmorphposnup
+@code{\hmorphposndn},
+@findex hmorphposndn
+@code{\hmorphposnrt},
+@findex hmorphposnrt
+and @code{\hmorphposnlft}
+@findex hmorphposnlft
+for @code{^}/@code{_} or @code{\lft}/@code{\rt} constructions.
+
+@item \vmorphposn
+@findex vmorphposn
+(Default: 0 pt) The vertical position of the morphism with
+respect to its default position. There are also the dimensions
+@code{\vmorphposnup},
+@findex vmorphposnup
+@code{\vmorphposndn},
+@findex vmorphposndn
+@code{\vmorphposnrt},
+@findex vmorphposnrt
+and @code{\vmorphposnlft}
+@findex vmorphposnlft
+for @code{^}/@code{_} or @code{\lft}/@code{\rt} constructions.
+
+@item \morphdist
+@findex morphdist
+(Default: 4 pt) The distance of morphisms from slanted lines
+or arrows.
+
+@item \channelwidth
+@findex channelwidth
+(Default: 3 pt) The distance between double lines or arrows.
+
+@item \hchannel, \vchannel
+@findex hchannel
+@findex vchannel
+(Defaults: 0 pt) Overrides @code{\channelwidth}. The
+horizontal and vertical shifts between double lines or arrows.
+
+@item \commdiagbaselines
+@findex commdiagbaselines
+(Default: @code{\baselineskip=15pt
+\lineskip=3pt
+\lineskiplimit=3pt })
+The parameters used by @code{\commdiag} for setting interline glue.
+
+@item \hgrid
+@findex hgrid
+(Default: 15 pt) The horizontal spacing of the grid used by
+@code{\gridcommdiag}.
+
+@item \vgrid
+@findex vgrid
+(Default: 15 pt) The vertical spacing of the grid used by
+@code{\gridcommdiag}.
+
+@end table
+
+@comment bye