summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/generic/xypic
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/generic/xypic')
-rw-r--r--Master/texmf-dist/source/generic/xypic/CATALOG.doc54
-rw-r--r--Master/texmf-dist/source/generic/xypic/COPYING339
-rw-r--r--Master/texmf-dist/source/generic/xypic/ChangeLog788
-rw-r--r--Master/texmf-dist/source/generic/xypic/INSTALL417
-rw-r--r--Master/texmf-dist/source/generic/xypic/INSTALL.OzTeX600
-rw-r--r--Master/texmf-dist/source/generic/xypic/INSTALL.Textures393
-rw-r--r--Master/texmf-dist/source/generic/xypic/MAKE259
-rw-r--r--Master/texmf-dist/source/generic/xypic/MANIFEST111
-rw-r--r--Master/texmf-dist/source/generic/xypic/Makefile1528
-rw-r--r--Master/texmf-dist/source/generic/xypic/README106
-rw-r--r--Master/texmf-dist/source/generic/xypic/TRAILER91
-rw-r--r--Master/texmf-dist/source/generic/xypic/VERSIONS103
-rw-r--r--Master/texmf-dist/source/generic/xypic/doc2tex.com114
-rw-r--r--Master/texmf-dist/source/generic/xypic/dvitogif89a207
-rw-r--r--Master/texmf-dist/source/generic/xypic/import1.eps1550
-rw-r--r--Master/texmf-dist/source/generic/xypic/install-tds147
-rw-r--r--Master/texmf-dist/source/generic/xypic/kris.eps587
-rw-r--r--Master/texmf-dist/source/generic/xypic/latin1.sty242
-rw-r--r--Master/texmf-dist/source/generic/xypic/movie.cls325
-rw-r--r--Master/texmf-dist/source/generic/xypic/pnmrawtopcropwhite.c175
-rw-r--r--Master/texmf-dist/source/generic/xypic/ross.eps397
-rw-r--r--Master/texmf-dist/source/generic/xypic/xy.doc8324
-rw-r--r--Master/texmf-dist/source/generic/xypic/xy.sty103
-rw-r--r--Master/texmf-dist/source/generic/xypic/xy16textures.doc294
-rw-r--r--Master/texmf-dist/source/generic/xypic/xy17oztex.doc301
-rw-r--r--Master/texmf-dist/source/generic/xypic/xy2cell.doc1839
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyall.doc93
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyarc.doc1436
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyarrow.doc1881
-rw-r--r--Master/texmf-dist/source/generic/xypic/xycmactex.doc71
-rw-r--r--Master/texmf-dist/source/generic/xypic/xycmtip.doc93
-rw-r--r--Master/texmf-dist/source/generic/xypic/xycolor.doc349
-rw-r--r--Master/texmf-dist/source/generic/xypic/xycrayon.doc82
-rw-r--r--Master/texmf-dist/source/generic/xypic/xycurve.doc4920
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydoc.back1
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydoc.bib764
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydoc.sty1270
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydocps.doc34
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydummy.doc97
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydvidrv.doc98
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydvips.doc329
-rw-r--r--Master/texmf-dist/source/generic/xypic/xydvitops.doc346
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyemtex.doc243
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyframe.doc1213
-rw-r--r--Master/texmf-dist/source/generic/xypic/xygraph.doc710
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyguide.man2285
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyidioms.doc283
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyimport.doc245
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyknot.doc2014
-rw-r--r--Master/texmf-dist/source/generic/xypic/xylatex.ini77
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyline.doc664
-rw-r--r--Master/texmf-dist/source/generic/xypic/xymacpat.xyp61
-rw-r--r--Master/texmf-dist/source/generic/xypic/xymatrix.doc1345
-rw-r--r--Master/texmf-dist/source/generic/xypic/xymovie.doc161
-rw-r--r--Master/texmf-dist/source/generic/xypic/xynecula.doc594
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyoztex.doc316
-rw-r--r--Master/texmf-dist/source/generic/xypic/xypic.doc75
-rw-r--r--Master/texmf-dist/source/generic/xypic/xypic.map66
-rw-r--r--Master/texmf-dist/source/generic/xypic/xypic.sty29
-rw-r--r--Master/texmf-dist/source/generic/xypic/xypoly.doc1262
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-c.doc187
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-col.doc165
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-f.doc270
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-l.doc195
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-pro.doc253
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-ps.doc750
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-r.doc226
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-s.doc144
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps-t.doc168
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyps.doc1209
-rw-r--r--Master/texmf-dist/source/generic/xypic/xypsdict.doc375
-rw-r--r--Master/texmf-dist/source/generic/xypic/xypspatt.doc182
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyrecat.doc95
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyrefer.man509
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyrotate.doc538
-rw-r--r--Master/texmf-dist/source/generic/xypic/xysmart.doc569
-rw-r--r--Master/texmf-dist/source/generic/xypic/xytex.ini60
-rw-r--r--Master/texmf-dist/source/generic/xypic/xytextures.doc291
-rw-r--r--Master/texmf-dist/source/generic/xypic/xytile.doc472
-rw-r--r--Master/texmf-dist/source/generic/xypic/xytips.doc239
-rw-r--r--Master/texmf-dist/source/generic/xypic/xytp-f.doc306
-rw-r--r--Master/texmf-dist/source/generic/xypic/xytpic.doc472
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyv2.doc868
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyweb.doc326
-rw-r--r--Master/texmf-dist/source/generic/xypic/xyxdvi.doc335
85 files changed, 52105 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/generic/xypic/CATALOG.doc b/Master/texmf-dist/source/generic/xypic/CATALOG.doc
new file mode 100644
index 00000000000..53e9d44b89b
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/CATALOG.doc
@@ -0,0 +1,54 @@
+%% $Id: CATALOG.doc,v 3.6 1998/03/06 04:29:05 krisrose Exp $
+%%
+%% Xy-pic ``CTAN CATALOG description'' generation file.
+%% Copyright (c) 1994-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\documentstyle{article}
+\input{xy}
+\begin{document}
+
+\newwrite\Wout
+\def\W#1{\immediate\write\Wout{#1}}
+
+\immediate\openout\Wout=CATALOG.out
+\W{Name: xypic}
+\W{Version: \xyversion\space <\xydate>}
+\W{}
+\W{Description: Xy-pic is a package for typesetting graphs and diagrams.}
+\W{ It is structured as several modules, each defining a custom notation for}
+\W{ a particular kind of graphical object or structure. Example objects are}
+\W{ arrows, curves, frames, and colouring/rotation on drivers that support}
+\W{ it; these can be organised in matrix, directed graph, path, polygon, knot,}
+\W{ and 2-cell structure. Xy-pic works with most formats, including LaTeX,}
+\W{ AMS-LaTeX, AMS-TeX, and plain TeX, and has been used to typeset}
+\W{ complicated diagrams from many application areas including category}
+\W{ theory, automata theory, algebra, neural networks, and database theory.}
+\W{}
+\W{Keywords: diagram, picture, graph, arrow, curve, commutative diagram.}
+\W{}
+\W{Author: Kristoffer H. Rose}
+\W{Problems-To: Kristoffer.Rose@ens-lyon.fr}
+\W{Address: LIP/ENS-Lyon; 46, Allee d'Italie; 69364 Lyon 7; FRANCE}
+\W{}
+\W{<URL: http://www.ens-lyon.fr/\string~krisrose/>}
+\immediate\closeout\Wout
+
+\end{document}
diff --git a/Master/texmf-dist/source/generic/xypic/COPYING b/Master/texmf-dist/source/generic/xypic/COPYING
new file mode 100644
index 00000000000..a43ea2126fb
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Master/texmf-dist/source/generic/xypic/ChangeLog b/Master/texmf-dist/source/generic/xypic/ChangeLog
new file mode 100644
index 00000000000..9c017d33009
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/ChangeLog
@@ -0,0 +1,788 @@
+1998-10-05 Kristoffer Rose <Kristoffer.Rose@ens-lyon.fr>
+
+ * Address of FSF changed (*). MINOR.....??
+
+1998-10-03 Kristoffer Rose <Kristoffer.Rose@ens-lyon.fr>
+
+ * xyframe.doc (\useCurveFrames): Curve, not circle [fix by George
+ C. Necula]. MINOR.
+
+ * xycurves.doc (\crvs@): \crv@defaultshape fixed [fix by George
+ C. Necula]. MINOR.
+
+ * Makefile, xynecula.doc, xysmart.doc: New options, extracted from
+ mail [by George C. Necula], added. NEW.
+
+ * xy.doc (\OBJECT@shapei): Change to implement *stylechar
+ correctly. Originally, *stylechar was behaving like shape
+ [...]. Now *stylechar is expanded immediately and is not added to
+ tokens, while shape[...] does both [fix by George C. Necula].
+ MAJOR.
+
+ * xy.doc (\checkZeroEdge@): Avoid expanding \Edge@c [fix by George
+ C. Necula]. MINOR.
+
+1998-03-18 Kristoffer Rose <Kristoffer.Rose@ens-lyon.fr>
+
+ * Makefile: New creation of fixes... NEW.
+
+ * install-tds: local variables eliminated in functions. MINOR
+ [Pieter Donche].
+
+1998-03-06 Kristoffer Rose <Kristoffer.Rose@ens-lyon.fr>
+
+ * Revision 3.6 released.
+
+ * xyframe.doc: \dotcorner@ and \dashedcorner@ defined even when
+ curves not loaded. MINOR.
+
+Wed Oct 22 18:53:12 1997 Kristoffer Rose <krisrose@ens-lyon.fr>
+
+ * xygraph.doc: Only warn user about redefining graph escapes when
+ this is indeed the case. MINOR.
+
+Mon Oct 13 12:55:36 1997 Kristoffer Rose <krisrose@ens-lyon.fr>
+
+ * Makefile, xyps-ps.doc, xydocps.doc: Version of the dictionary is
+ now controlled by the Makefile. MINOR.
+
+ * xy.doc, xyguide.man, xyrefer.man: Changed Kristoffer's address
+ to ENS-Lyon. MINOR.
+
+ * xycurve.doc, xyline.doc: line thickness now works for curves
+ (from Ross). MINOR.
+
+Thu Oct 9 02:26:45 1997 Kristoffer Rose <krisrose@ens-lyon.fr>
+
+ * Makefile (macros): LATEXINPUTDIR eliminated; PSHEADERDIR changed
+ to conform to TDS. Release targets updated for author's new
+ location @ens-lyon.fr. MINOR.
+
+Wed May 28 00:49:07 1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ * Releasing version 3.5.
+
+Tue May 27 10:42:58 1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ * Makefile, INSTALL: Removed HTML which can't be generated
+ presently. MINOR.
+
+ * xy.doc: Fixed "missing rules bug" properly: avoid premature
+ expansion of \Clast@@. Wrong "missing rules" fix undone to fix
+ new "missing breaks" bug. MAJOR.
+
+Mon May 19 17:51:03 1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ * Released version 3.4.
+
+Sun May 18 03:49:01 1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ * xymovie.doc, movie.cls, xyrefer.man: New extension...added to
+ reference manual. MINOR.
+
+Wed May 14 11:29:57 1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ * xy.doc (\xy): zero \mathsurround. MINOR.
+
+Sun May 4 14:53:59 1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ * xy.doc (\preconnect): methods should not inherit temporary
+ invisibility (fixes missing rules problem). MINOR.
+
+Tue Mar 11 21:48:50 1997 Kristoffer H. Rose <krisrose@gorm.daimi.aau.dk>
+
+ * Makefile (GFTOPK): Updated to allow using texk-7.0. MINOR:
+ - Rename filenames such as `xyrefer.doc.dvi' to `xyrefer.dvi'.
+ - Don't use (now-redundant) -v option to gftopk
+
+Tue Feb 11 19:17:50 1997 Ross Moore <ross@brics.dk>
+
+ * xycurve.doc (*crvconn@): Centers \connect@ object. MINOR.
+
+Sun Feb 9 21:04:19 1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ * xyline.doc (?): BUG: should set default line width dynamically...
+
+Thu Jan 23 22:27:06 1997 Kristoffer H. Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xycurve.doc, xyps-pro.doc, xypsdict.doc, xyidioms.doc,
+ xyps-ps.doc, xypspatt.doc: Revert to Ross' naming of DVI-time
+ hooks. MINOR.
+
+Mon Jan 6 22:08:25 1997 Kristoffer H Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xy.doc (\txt): Don't attempt recognising vmode. MINOR [Liam Healy].
+
+ * Makefile (install): Don't make install.www. MINOR [Liam Healy].
+
+Thu Dec 19 05:39:27 1996 Kristoffer H. Rose <krisrose@gorm.daimi.aau.dk>
+
+ * Release 3.3.
+
+Thu Dec 12 17:18:57 1996 Kristoffer H Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xy.doc (\ellipseInner@, \ellipsecentredInner@): Edge-finding
+ typos fixed. MINOR.
+
+Mon Dec 2 11:07:20 1996 Kristoffer H Rose <krisrose@brics.dk.daimi.aau.dk>
+
+ * xygraph.doc (\newgraphescape): never use \renewcommand. MINOR.
+
+ * xy.doc (\straightC{break,last}@@): straight connection
+ subsegments connect properly to non-rectangle objects. MAJOR.
+ * NOTE: same bug needs to be fixed for curves!
+
+Thu Nov 28 18:45:00 1996 Kristoffer H Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xyv2.doc (\morphism): updated to use new style <path>s. MINOR.
+
+Wed Nov 27 22:36:51 1996 Kristoffer H Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xy.doc (\dir): redef'd dir3{<} naively to make center line
+ segment work. MINOR.
+
+Mon Nov 25 06:08:38 1996 Kristoffer H Rose <krisrose@brics.dk.daimi.aau.dk>
+
+ * xygraph.doc (\newgraphescape): Allow [n] for argument count. NEW!
+
+ * xy.doc (\cmerge@): keep edge with new breaking principle. MINOR.
+
+Wed Nov 20 06:01:40 1996 Kristoffer H Rose <krisrose@brics.dk>
+
+ * xymatrix.doc (\xymatrix@at): @E generalised to @M/@W/@H. MINOR.
+
+ * xy.doc (\line@): downward @3{>} rotates \line@ wrong. BUG!
+
+Mon Oct 21 16:49:59 1996 Kristoffer H Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xy.doc (shapes): [r] [l] / [u] [d] behave when entry very
+ tall / wide [Michel Goossens]. MINOR.
+
+Fri Oct 11 03:58:11 1996 Kristoffer H Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xyarrow.doc (\PATHlabelalias@): save breaks properly. MINOR.
+
+Wed Oct 9 18:37:06 1996 Ross Moore <ross@mpce.mq.edu.au>
+
+ * xy.doc (\solid@): fixed `missing rules' bug. MAJOR.
+
+Wed Oct 9 18:37:06 1996 Kristoffer Høgsbro Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xy.doc (\dottedSpread@): fixed `spurious dot' bug. MAJOR.
+
+Fri Sep 20 03:33:32 1996 Kristoffer Høgsbro Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xyguide.man: Several exercises added and some love poured in.
+
+Thu Sep 5 19:57:22 1996 Kristoffer Høgsbro Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xy.doc, xyarrow.doc, xymatrix.doc: All redefinitions of \oxy@
+ now via \change@oxy@ for safety reasons. MINOR.
+
+ * xy.doc (\solidhrule@, \solidvrule@, \straight@): added
+ \straighttypeset@@ hook for line typesetting primitive. MINOR.
+
+ * xymatrix.doc: Added @M and @L spacing adjustments. MINOR.
+
+Thu Aug 15 00:03:46 1996 Kristoffer H Rose <krisrose@brics.dk>
+
+ * xy.doc: dottedSpread bails out when no filling requested. HACK.
+
+ * xycurve.doc: Avoid redefinition warning. MINOR.
+
+ * xyguide.man: Worked through; documented that line intersection
+ of curves works. MINOR.
+
+Mon Aug 13 00:00:00 EST 1996 Ross Moore <ross@mpce.mq.edu.au>
+
+ * xycurve.doc, xyline.doc, ?: Thorough recoding to respect
+ styles. MAJOR.
+
+Thu Aug 15 00:03:46 1996 Kristoffer H Rose <krisrose@brics.dk>
+
+ * xy.doc: dottedSpread bails out when no filling requested. HACK.
+
+ * xycurve.doc: Avoid redefinition warning. MINOR.
+
+ * xyguide.man: Worked through; documented that line intersection
+ of curves works. MINOR.
+
+Mon Aug 13 00:00:00 EST 1996 Ross Moore <ross@mpce.mq.edu.au>
+
+ * xycurve.doc, xyline.doc, ?: Thorough recoding to respect
+ styles. MAJOR.
+
+Sun Jun 30 21:12:35 1996 Kristoffer H|gsbro Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xyarrow.doc: Hide tips. MINOR.
+
+Tue Jun 11 01:23:46 1996 Kristoffer H|gsbro Rose <krisrose@gorm.daimi.aau.dk>
+
+ * xyarrow.doc: use \PATHcontinue@@ correctly. MAJOR.
+
+ * xy.doc: \checkXyStyle@ was never defined, now prints `?'.
+
+Fri May 24 04:27:32 1996 Kristoffer H Rose <kris@laptop (Kristoffer H Rose)>
+
+ * xyarrow.doc (*): fixed use of new kernel connect methods! MAJOR.
+
+Thu May 23 20:30:53 1996 Kristoffer H Rose <kris@laptop (Kristoffer H Rose)>
+
+ * xy.doc: SUMMARY of (functionality) KERNEL CHANGES since v3.2:
+ - (PREAMBLE) \xy*@ definitions made global.
+ - (\zz@) new almost-zero test (uses dimension register).
+ - (\xyinputorelse@) split into conditional (not loading if
+ \*loaded already defined) and unconditional (with @@).
+ - (\xymath@) use fontdimen22 to vertically adjust.
+ - (\vfromabsolute@@, \AddOp@) add 1sp ??
+ - (\preconnect, ...) setup but don't do \connect.
+ - (\OBJECT@@, \Drop@@) default is to use \styledbox@.
+ - (\OBJECT@@, \object) define \pre/postXY@style@.
+ - (\checkZeroEdge@) uses \zz@-checker.
+ - (\OBJECT@shapei) fix expandafter trickery.
+ - (\styledbox@) new wrapper for \pre/post-styles.
+ - (\checkXyStyle@, \styleDrop@, \styleConnect@) removed.
+ - (\xynamestyle@) removed warning when not redefining.
+ - (\xycompileto@) attempt to recover when compiled file truncated.
+ - (\MakeOutlines) Allow compilation of outlines only.
+ - (\no@, \line@, \solid@, \tip@) don't reset i/h flags ??
+ - (\line@, \pointlike@, \squiggle@, \[Tt]ip@, \cir@*) use \styledbox@.
+ - (\solid[vh]rule@) respect i/h flags, setup break-methods.
+ - (\xyoption) truncate right.
+ - (\xydriversselected) default to empty!
+ - (CONNECTIONS) recoded (too many changes to summarise)!
+
+Tue Jan 2 14:18:04 1996 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\xyinputorelse@): Stop gobbling csnames like mad: use a
+ shaved version to input non-doc files. MINOR.
+
+ * xy.doc (\xydef@,...): made private definitions global. MINOR.
+
+ * xygraph.doc: do not save node ids with explicit ="...". NEW.
+
+Wed Dec 13 03:16:04 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (methods): Changed style principle such that the style is
+ always used, and such that it is reestablished. MAJOR.
+
+Mon Nov 20 23:06:26 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (shapes): Now [=...] is the same as [|=...]. MINOR.
+
+Thu Nov 16 03:12:01 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyarrow.doc (\ar): update variant more often but only when not
+ already set. MINOR.
+ From: Stefano Guerrini <guerrini@DI.Unipi.IT>
+
+Wed Nov 15 20:36:10 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\straight@): added Cbreak@@ and Clast@@ methods! NEW.
+
+Mon Nov 13 16:14:11 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xymatrix.doc (\xymatrix@fix): Fixed @! <setup> to make row and
+ column spacing the same; added @![RC]0 and @![RC]=<dimen> to set
+ override entry size for spacing computation. MINOR, NEW..
+
+Thu Oct 26 16:09:10 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\xycompile): add \OnlyOutlines and friends. NEW.
+
+Wed Oct 18 03:13:45 1995 Kristoffer H Rose <kris@rose.diku.dk>
+
+ * xyps-pro.doc (PS Prolog): eliminate obsolete \currentxydriver@
+ such that conditionals are right. MINOR.
+
+ * xyidioms.doc (\xysetup@@): avoid problems when Babel loaded with
+ plain TeX. MINOR.
+
+Tue Oct 17 21:38:03 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xymatrix.doc (\xymatrix@at): @1 <setup> adds math strut. NEW.
+
+ * xy.doc (\xymath@): Use axis_height (fontdimen22 of textfont2) to
+ adjust the reference point of in-math Xy-pictures. MAJOR.
+
+Mon Oct 16 20:04:25 EST 1995 Ross Moore <ross@mpce.mq.edu.au>
+
+ * xycurve.doc: improved the edge-finding capabilities. MINOR
+
+ * xyarrow.doc: removed \cmergethecz@ from path sub-segments. MINOR
+
+Wed Oct 11 08:16:27 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy*.doc: \xyinputorelse@ now skips files files that have set
+ \FILEloaded = \empty. MINOR.
+
+Tue Oct 10 20:30:16 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\xycompileto): attempt to recover from truncated
+ .xyc-file. MINOR.
+
+ * xyv2.doc (\diagramcompileto): avoid competing compilation. MINOR.
+ (\XXtoY@, \toXY@): avoid @-names in literate code. MINOR.
+ From: Joerg Eich <jeich@wmpi13.math.uni-wuppertal.de>
+
+Mon Oct 9 20:58:13 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xymatrix.doc (entry spacing): added <setup> forms @*[shape] and
+ @*<addop><size> to set defaults for **... equivalents; also made
+ these constructions cumulative (bug: still backwards). MINOR, NEW.
+
+Thu Oct 5 16:44:09 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xymatrix.doc: changed row/column names to the user-accessible
+ \Row and \Col. MINOR.
+
+Tue Oct 3 16:33:41 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xygraph.doc (\MOVE@place): Lookahead properly after <move> of
+ the form ...!<place>. MINOR.
+
+Mon Oct 2 16:40:29 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\vfromabsolute@@, \Addop@), xyframe.doc, xycurve.doc:
+ add new \zz@ almost-zero-test and add tiny amount to absolute
+ dimensions to make more robust and in particular circumvent bug in
+ some PostScript interpreters (!). MINOR; should also be fixed in
+ PS backends...
+
+Sat Sep 23 19:48:38 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyps-ps.doc, xyps.doc: fixed undefined \UnloadPS@@ MAJOR.
+ * xyframe.doc, xycurve.doc: problem with \L@ and \R@ MAJOR.
+ * documentation fixes; undefined references, etc. MINOR.
+
+ * altered example diagrams, due to bug in PS interpreters.
+ A better fix may be possible within xyps-ps.doc.
+
+ * Released version 3.2 on ftp.mpce.mq.edu.au
+ with above fixes and corrected manuals.
+
+Tue Sep 19 17:42:24 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * Release 3.2.
+
+ * xyframe.doc (Circles): several instances of \L@ and \R@ should
+ be \L@c and \R@c... MAJOR.
+ From: Clemens Beckstein <beckstei@mipool.uni-jena.de>
+
+Fri Sep 15 95 19:03:37 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyarrow.doc (\droplabel@): labels as objects now
+ flawless! MAJOR.
+
+Wed Sep 13 18:29:25 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyarc.doc, xytpic.doc: fixed version numbers. MINOR.
+
+ * xytile.doc: changed example code...to avoid weird Level 1
+ PostScript error. MINOR.
+
+ * xypspatt.doc: documentation now prints with GhostScript (added
+ hack to side-step bad Level 2 patterns). MAJOR.
+
+Wed Sep 13 01:54:55 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyarrow.doc: Fixed size and modifiers of labels on all
+ segments. MAJOR. From: Jürgen Koslowski <koslowj@iti.cs.tu-bs.de>
+
+Tue Sep 12 01:59:34 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyarrow.doc: added [shape]* prefix to <it>. NEW!
+
+Mon Sep 11 21:22:37 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xypspatt.doc, xypsdict.doc: fixed pattern frequencies and
+ angles. MINOR.
+
+ * xyps.doc, xyps-ps.doc, + <driver> files: isolated font/ps
+ interface. MAJOR.
+
+Fri Sep 8 18:15:33 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xycurve.doc: fixed \resetbreaks undefined w/o arrow. MINOR.
+ Fixed wrong circle-frames w/o PS. MAJOR.
+ From: Fred T. Krogh <fkrogh@math.jpl.nasa.gov>
+
+Wed Sep 6 20:48:01 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xydvidrv.doc: Changed wrong \withoption to \xywithoption. MAJOR.
+ From: Young U. Ryu <ryoung@utdallas.edu>
+
+Tue Sep 5 22:38:55 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * Release 3.1!
+
+ * xyframe.doc: added :<dimen> modifier to [F...] shapes. MINOR.
+ From: Marc Gemis <makke@pucky.uia.ac.be>
+
+ * xyarrow.doc: fixed *{x} labels to use default object
+ style. MINOR.
+
+Tue Sep 5 18:49:57 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyweb.doc, xyguide.man: fixed an example. MINOR.
+
+ * xy.doc: added method \circleProp@ for labels. MAJOR.
+
+ * xyemtex.doc, xydvidrv.doc, xydvips.doc:
+ Support for em-\TeX \special commands. NEW.
+
+Fri Sep 1 16:11:02 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyarrow.doc: added @? <form> to swap the meaning of ^ and _ for
+ an arrow. NEW!
+
+Fri Sep 1 18:46:39 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xy.doc, xyframe.doc, xyarrow.doc: frames around arrow-labels now
+ positioned better...MAJOR.
+
+Thu Aug 31 18:46:39 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xytp-f.doc: filled frames now all work. MAJOR.
+
+Tue Aug 29 15:34:25 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\OBJECT@change): - object modifier now works. MINOR.
+
+Tue Aug 29 20:21:59 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyframe.doc, xy.doc, xycurve.doc, xyps.doc, xytp-f.doc, xytpic.doc
+ implemented some curved and oval frames using splines and/or tpic.
+ fixed some bugs in frames. MAJOR.
+
+Thu Aug 24 21:59:53 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xycolor.doc, xyline.doc, xyrotate.doc, xytile.doc: removed need
+ for obsolete style option. MINOR.
+
+ * xy.doc (define <shape>): xystyle.doc annihilated and its
+ functionality inserted with the syntax [=...] in the
+ kernel. MINOR.
+
+ * xy.doc, xytile.doc, xyrotate.doc, xyline.doc, xycolor.doc,
+ xyps-t.doc, xyps-ps.doc, xyps-c.doc: Changed \*shape@<shape>@ to
+ merely \shape [<shape>] and \*shapechar@<char>@ to \shape
+ [<char>...]. MAJOR.
+
+ * xy.doc (\xyadddriversupport@): <driver> support control sequence
+ no longer cleared upon every addition to it. MAJOR.
+
+Wed Aug 23 22:42:24 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xytp-f.doc, xytpic.doc: implements frames for TPIC NEW!
+ * xytp-f.doc: (incomplete) rectangles, not circles/ellispes. MINOR.
+
+Wed Aug 23 11:32:25 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyframe.doc, xyps-f.doc, xyps-pro.doc: added \frm{**} for
+ stroked fills. NEW!
+
+ * xy.doc: shortened the loading of drivers and removed the initial
+ ``unload''. MINOR.
+
+ * xycurve.doc: lack of invisibility, fixed. MINOR.
+
+Tue Aug 22 20:24:03 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xytpic.doc: all bugs fixed (!). MAJOR.
+ * xytpic.doc: dotted/dashed lines now work. NEW!
+ * xytpic.doc: implements \xycircle and \qspline. NEW!
+ * xyxdvi.doc: new driver. NEW!
+ * xy<driver>.doc: edits to reflect the TPIC support. MINOR.
+ * xydoc.sty: macros for driver names. MINOR.
+
+Tue Aug 22 01:09:46 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyguide.man, man2html.gawk: Several changes to make the .html
+ version of the User's Guide prettier. MINOR.
+
+Mon Aug 21 20:24:03 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xycurve.doc: Quadratic splines added: \qspline NEW!
+ * xyps-?.doc: minor edits to documentation MINOR.
+ * xyrefer.doc: moved the xyps-?.doc to Part IV MINOR.
+ * xytpic.doc: removed tracing and fixed a bug. MINOR.
+
+Fri Aug 18 17:13:01 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyframe.doc: fixed several bugs: `missing' frames now are found;
+ zero-sized frames handled properly; default `blacked' frames
+ placed correctly; frame <object>-modifiers placed BEFORE object,
+ not AFTER. MAJOR.
+
+ * xyps-f.doc, xyps-c.doc, xyps-t.doc, xyps-r.doc, xyps-l.doc:
+ ability to turn PSframes, PScolor, ... on/off. MINOR.
+
+ * xyline.doc, xy<driver>.doc: renaming of cs's for consistency.
+ MINOR.
+
+ * xy.doc: fixed bug affecting ADDOP@minus. MAJOR.
+
+Tue Aug 15 16:38:22 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyidioms.doc, xy*.doc: xysetup@ is now xysetup@@ (in other files
+ also).
+
+ * xyps-pro.doc: fixed error in PostScript for oval frames.
+
+Mon Aug 14 15:19:56 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xy<driver>.doc: removed the \global s, which were unnecessary.
+ MINOR.
+
+ * xydvitops.doc: new driver --- untested. MINOR.
+
+ * xyrotate.doc, xyps-r.doc: rationalised control sequence names.
+ MINOR.
+
+Fri Aug 11 18:25:31 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xy updated the Macintosh driver files. MAJOR.
+
+ * xycmactex.doc, xyemtex.doc: dummy drivers that simply
+ \xyrequire{dvips} (should be independent). NEW!
+
+Thu Aug 10 19:36:49 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xy.doc, xydvips.doc, xytile.doc: attempted correct
+ driver-loading sequencing for non-delayed loading. MAJOR.
+
+ * xyps-ps.doc: forgot to let \xyUnloadPS@@=\xyUnloadPS@. MINOR.
+
+Wed Aug 9 19:50:11 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ xycmtip.doc: with PS-backend, now work again. MAJOR
+
+ * xyps-ps.doc, xyps.doc, xydvips.doc: reorganised the unloading of
+ PS to simplify code in the driver-files. MINOR.
+
+ * xy.doc: reinstated \xysetup@ for single drivers. (Simply delayed
+ the action: \xydef@\selectdriver@single#1{\xysetup@{...}}. Now
+ \xyReloadDrivers happens when it should --- everything loads at
+ once, without all those repetitions as new extensions are added.
+ The remaining problem (?) is that extra requests for a new (or the
+ same) driver seem to generate an increasing number of calls to
+ \xyReloadDrivers; e.g. 1 driver ==> 1 call , 2 drivers ==> 1+2=3
+ calls , 3 drivers ==> 1+2+3=6 calls , ....). MAJOR.
+
+Mon Aug 7 16:08:06 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xy.doc, xyrecat.doc: fixed catcode loading. MAJOR.
+
+ * xycmtip.doc: do not work in the reference manual, with PS. MAJOR
+ looking at the <driver>-table --- great hacking, Kris :-)
+ it seems that cmtips needs a <driver>. Why ?
+ Could this explain its failure to load ?
+ Or is it the \xysetup@ problem again ?
+ i.e. it needs a trigger for the activation.
+
+Fri Aug 4 13:11:12 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xydvips.doc, xytextures.doc: hooks now end in @@, for
+ consistency. MINOR.
+
+ * xyframe.doc: fixed up fills, allowing non-default
+ implementations. MAJOR.
+
+ * xydvips.doc xycolor.doc: fixed colours. Problem in the
+ redefinition of unloading, etc. Fix: make unloading a hook
+ also. Drivers may redefine the hook to unload. MAJOR.
+
+Wed Jul 26 15:24:17 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyidioms.doc, *.doc: Defined \xyclosedown@@ to make it easy to
+ add important warnings to the end of the run. Renamed \xysetup@
+ to \xysetup@ with global replace in all files. MINOR.
+
+Tue Jul 25 14:52:36 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyguide.man: Index entries inserted; still needs sexy examples
+ last. MINOR.
+
+ * xyrefer.man: Inserted Preface with overview and license. MINOR.
+
+ * xy.doc (\xyoption): Do not execute \xyoption{o} until *after* o
+ has been loaded (delay definition of \xy<option>loaded). MINOR.
+ (\newdriver): Use \xywithoption{<driver>}{...} to activate. MINOR.
+
+Mon Jul 24 01:12:48 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyguide.man (Sliding arrows sideways): use the now fixed @<1ex>
+ form for sliding. MINOR.
+
+ * xyarrow.doc (note slide arrow): @<dimen> fixed such that it
+ works. MAJOR.
+
+ * xy.doc (\endxy): explicit error for unmatched \endxy. MINOR.
+
+ * xymatrix.doc (New coordinate formats): <place> accepted after
+ <hop>+. NEW!
+
+ * xy16textures.doc (Unloading): add pseudo-extension to handle
+ special \shipout undefinition. MINOR.
+
+ * xydvips.doc, xytextures.doc, xy16textures.doc, xyoztex.doc,
+ xy17oztex.doc: use new <driver> principle. NEW!
+
+ * xydoc.sty: drivers treated like other options in the reference
+ manual. MINOR.
+
+ * xycolor.doc, xyframe.doc, xyline.doc, xyps.doc: Added `unload'
+ <driver> support; removed some status messages. NEW!
+
+ * xydocps.doc: use plain TeX. MINOR.
+
+Sun Jul 23 20:35:16 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\xyeveryrequest): execute code at every invocation of
+ an option. NEW!
+ (\xyeverywithoption): execute code at every inocation of
+ code created with \xywithoption. NEW!
+ (Driver options): completely rewrite of driver option support,
+ incorporating concepts of xydriver.doc. NEW!
+
+ * Makefile (KERNELSOURCES): xydriver.doc removed. MINOR.
+
+ * xyframe.doc: \frm{!} hack incorporated into plain frames when
+ line extension is loaded. MINOR.
+
+Sat Jul 22 14:45:44 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xy16textures.doc, xy17oztex.doc, xy2cell.doc, xyarc.doc,
+ xyarrow.doc, xycolor.doc, xydriver.doc, xyframe.doc, xyknot.doc,
+ xymatrix.doc, xyoztex.doc, xyps.doc, xytextures.doc, xyv2.doc,
+ xyweb.doc: many documentation fixes. MINOR.
+
+Fri Jul 21 18:43:14 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyidioms.doc (\xysetup@): Also delay preamble declarations for
+ the amsppt.sty style for AMS-TeX. MINOR.
+
+ * xydummy.doc: Counts its own usefulness :-). NEW!
+
+Fri Jul 21 22:23:07 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xy16textures.doc, xy17oztex.doc, xyoztex.doc, xytextures.doc:
+ removed redundant \xyuncatcodes. MINOR.
+
+Fri Jul 21 14:08:43 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.doc (\Xy-pic options): Search properly for options using all
+ possible file names. MINOR.
+
+Fri Jul 21 00:13:03 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyframe.doc: elliptical frames now work properly... MINOR
+ * xyps-f.doc: ...using PostScript.
+ still need to get them working using \xycircle, for non-PS.
+
+ * import1.eps: changed font name: MINOR
+ /courier changed to /Courier, else DPS may complain.
+
+ * xyimport.doc: made save-safe. MINOR
+ Modified to use xy@@s such that it is compile safe.
+
+Thu Jul 20 10:16:59 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * Makefile (DVIPS): Use 300 dpi and a4 paper as advertised. MINOR.
+
+ * xymatrix.doc (\xymatrix@pretypeset): Final matrix dimension set
+ after \halign.
+ Longest last row ignored. MAJOR.
+ From: Marc Gemis <makke@pucky.uia.ac.be>
+
+Wed Jul 19 17:43:25 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyframe.doc: reformulated note on using \frm{*} on
+ non-rectangular objects. MINOR
+
+Tue Jul 18 22:26:47 EST 1995 Ross R. Moore <ross@mpce.mq.edu.au>
+
+ * xyimport.doc: append .eps to example graphic's filename. MINOR
+ Added default sizes in case graphics box is empty, or has a zero
+ dimension, or coords are set at zero size.
+
+ * xyrefer.man: append .eps to graphics filenames. MINOR
+ Some implementations of LaTeX graphics may not need it, but others do.
+
+ * xydvips.doc: removed unnecessary catcode changes. MINOR
+ no longer necessary due to the fixes explained in the
+ following entry...
+
+ * xyps-l.doc, xyps-c.doc, xyps-f.doc, xyps-r.doc, xyps-t.doc,
+ xyps-t.doc, xycolor.doc, xycrayon.doc: inserted \xyuncatcodes
+ after installation --- loading options in different orders could
+ leave the catcodes set incorrectly (using plain TeX). MAJOR.
+ Lesson: \xyuncatcodes must follow any installation procedure
+ which either reads a file or creates new cs-names;
+ since it may be the last thing loaded.
+ From: Dierdrik Wiersma.
+
+ * xycurve.doc: documentation fixes: MINOR
+ Changed the `ToDo:' section for xycircle to DOCMODE2
+ Fixed bad presentation in the main display and elsewhere;
+ --- no more Underfull or Overfull boxes !!
+
+ * xyps-ps.doc: put \xyuncatcodes after dictionary loading. MINOR
+ Otherwise users can get the wrong catcodes if xypsdict.tex
+ is the last file to load.
+
+ * xyarc.doc: documentation fixes. MINOR
+ fixed the aberrant example; other cosmetic changes.
+
+Mon Jul 17 17:59:26 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * Makefile: Avoid retypesetting of manual? MINOR.
+
+ * xypic.map: Fixed PS font names (to upper-case). MINOR.
+ From: Michel Goossens <goossens@afsmail.cern.ch>
+
+Wed Jul 12 19:48:16 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xy.sty: Also apply @-active hack for `amsmath' package. MINOR.
+
+Tue Jul 11 12:25:54 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * xyframe.doc (Filled regions): Explained that non-rectangular
+ fills require backend support. MINOR.
+
+ * xy.sty: dvips document class option again loads dvips+ps. MINOR.
+
+ * xydoc.sty (\specialxyprovide): Use short \CompilePrefix{...}.
+ Bug: File names for .xyc-files of reference manual too long. MINOR.
+ From: Jörg Knappen <KNAPPEN@VKPMZD.kph.Uni-Mainz.DE>
+
+ * Makefile: use ...|while read f... instead of `...` to avoid
+ overlong lines during administrative makes. MINOR.
+
+Mon Jul 10 13:27:44 1995 Kristoffer H. Rose <kris@tyr.diku.dk>
+
+ * fix01 announced (to world since MAJOR bugs fixed).
+
+ * xyv2.doc (\framed, \Framed, ...): Removed erroneous brace level;
+ furthermore made it compile-safe.
+ Bug: Frames disappear in compatibility mode. MAJOR.
+ From: Clemens Beckstein <beckstei@mipool.uni-jena.de>
+ From: Michael J. Healy <mjhealy@espresso.rt.cs.boeing.com>
+
+ * xymatrix.doc: changed \row@/\col@ to \row@@/col@@.
+ Bug: conflict with AMS-LaTeX \row@ cs. MAJOR.
+ From: Enrico Gregorio <GREGORIO@dipmat.unict.it>
+
+ * xyarrow.doc (\PATHturn@i): Split turn code into several \xy@@s.
+ Bug: Too long lines in xyguide-30.xyc and xyguide-38.xyc. MINOR.
+ From: Jörg Knappen <KNAPPEN@VKPMZD.kph.Uni-Mainz.DE>
+
+ * xyguide.man: Set \CompilePrefix to 6-character string.
+ Bug: File names for .xyc-files of guide too long. MINOR.
+ From: Jörg Knappen <KNAPPEN@VKPMZD.kph.Uni-Mainz.DE>
+
+ * latin1.sty: Explicitly includes plain TeX's \def\copyright...
+ Bug: Can't typeset \copyright properly. MINOR.
+ From: Antonio Possolo <antonio@espresso.rt.cs.boeing.com>
+ From: Robert Kiessling <Robert.Kiessling@rrze.uni-erlangen.de>
diff --git a/Master/texmf-dist/source/generic/xypic/INSTALL b/Master/texmf-dist/source/generic/xypic/INSTALL
new file mode 100644
index 00000000000..f91c83dc335
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/INSTALL
@@ -0,0 +1,417 @@
+-*-text-*- $Id: INSTALL,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+
+
+ ================================================
+ INSTALLING THE Xy-pic DIAGRAM TYPESETTING MACROS
+ ================================================
+
+
+This file explains how you install the files in the `run' distribution of
+Xy-pic. See `README' for general information.
+
+Contents:
+
+-1- Copyleft
+-2- Overview of files and where they should be installed
+-3- Information for specific systems
+-4- Updating from version 2.6 (and earlier)
+-5- Bugs & comments
+
+
+---------------------------------------------------------------------------
+-1- COPYLEFT
+---------------------------------------------------------------------------
+
+
+Note that the entire Xy-pic package is distributed with copyleft:
+
+ Copyright (c) 1991-1998 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+ Copyright (c) 1994-1998 Ross Moore <ross@mpce.mq.edu.au>
+
+ The Xy-pic package is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Xy-pic package is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+What this means is that if you install Xy-pic then you should (1) make
+sure that the file `COPYING' is accessible to the users, and (2) be
+prepared to provide Xy-pic (including sources) to any of your users
+that request it (you may charge a fee for this if you are so
+inclined).
+
+Note: Some option files may be copyrighted by other people but the
+conditions remain the same for any file distributed as part of Xy-pic.
+
+
+---------------------------------------------------------------------------
+-2- OVERVIEW OF FILES AND WHERE THEY SHOULD BE INSTALLED
+---------------------------------------------------------------------------
+
+
+In this section we explain in 11 steps where the different groups of
+Xy-pic files in the `run' and `doc' distribution should be installed.
+For each file category we indicate the location recommended by TDS,
+the TeX Directory Standard (as formed by a TUG working group of that
+name).
+
+IMPORTANT
+---------
+If you have users currently using version 2.6 then make sure you read
+section 4! Please also check the next section for any system specific
+considerations.
+
+SPACE REQUIREMENTS
+------------------
+Installing the Xy-pic package requires almost 1MB with the macros
+macros taking up most of the space. Installing everything, including
+sources, documentation in both DVI, DVIPS, and PS, form, as well as
+bitmap fonts for several printers and in PostScript Type1 form,
+requires more than 12MB.
+
+
+Step 1. Eliminating Obsolete Files
+----------------------------------
+The new PostScript Type1 fonts contributed by Y&Y Inc. require that
+you REMOVE ALL COPIES of the following files BEFORE installing:
+
+Old font map files should be removed:
+
+ xy.map
+ xypic.map
+
+TDS directory: texmf/dvips/xypic
+
+Also be aware that some installations, for example the TeX Live 2
+CD-ROM, insert the contents of map files in `psfonts.map' (with TDS
+directory texmf/dvips/base); then you must EDIT it to remove all lines
+that start with `xy'.
+
+Remove old PostScript Type1 font files:
+
+ xyatip10.pfa
+ xybsql10.pfa
+ xybtip10.pfa
+ xycirc10.pfa
+ xycmat10.pfa
+ xycmbt10.pfa
+ xydash10.pfa
+ xyeuat10.pfa
+ xyeubt10.pfa
+
+ xyatip10.pfb
+ xybsql10.pfb
+ xybtip10.pfb
+ xycirc10.pfb
+ xycmat10.pfb
+ xycmbt10.pfb
+ xydash10.pfb
+ xyeuat10.pfb
+ xyeubt10.pfb
+
+TDS directory: texmf/fonts/type1/public/xypic
+
+Remove old `xy.sty' and `xypic.sty' files that you might have stored
+earlier in the TDS directory `texmf/tex/latex/misc'.
+
+
+[FILES IN xy*run.tar.gz:]
+
+
+Step 2. Availability & License
+------------------------------
+These eight files contain general information and should be installed
+in a publicly readable place:
+
+ README generic information on Xy-pic
+ CATALOG version information and summary
+ TRAILER announcement and availability
+ INSTALL how to install (this file)
+ MANIFEST list of all files
+ VERSIONS the RCS version ids of all source files
+ COPYING GNU General Public License
+
+TDS directory: texmf/doc/generic/xypic
+
+
+Step 3. Macros
+--------------
+Files `texinputs/*' are TeX and LaTeX macro files that must be
+installed in a place which TeX and LaTeX will search (e.g., with un*x
+TeX, a directory users include in the TEXINPUTS environment variable).
+
+The files `texinputs/*.ini'
+
+TDS directory: texmf/tex/generic/xypic
+
+
+Step 4. TeX Font Metric
+-----------------------
+Files `texfonts/*.tfm' should be installed in a directory that TeX
+will search for fonts (e.g., with un*x TeX, a directory users include
+in the TEXFONTS environment variable).
+
+TDS directory: texmf/fonts/tfm/public/xypic
+
+
+Step 5. METAFONT Sources
+------------------------
+Files `mfinputs/*.mf' should be installed in some directory where the
+METAFONT program will search for them (e.g., with un*x TeX, a
+directory included in the MFINPUTS environment variable).
+
+NOTE: The METAFONT source files are only useful on installations where
+the printer driver and previewer can utilise them to generate the
+required bitmap fonts `on-line'. If this is possible on your
+installation then please use it: it saves substantial amounts of space
+and means that you will automatically use fonts optimised for each
+printer (provided evrything is correctly set up, of course).
+
+TDS directory: texmf/fonts/source/public/xypic
+
+
+Step 6. Bitmap Fonts [Optional]
+-------------------------------
+Files matching the patterns `pkfonts/cx<N>/*.<N>pk' and
+`pkfonts/ljfour<N>/*.<N>pk', where <N> is some number, contain bitmap
+font files and should be installed where DVI previewers and printer
+drivers will find them (e.g., with un*x, the `xdvi' program should see
+them through the XDVIFONTS environment variable). (`cx' is a 300 dpi
+(dots per inch) mode and `ljfour' a 600 dpi mode.)
+
+NOTE: This step is optional because the bitmaps are only needed (and
+only recommended) for installations that can't use the METAFONT
+sources directly but do have a 300 or 600 dpi laserprinter driver that
+accepts PK bitmap font files.
+
+TDS directory: texmf/fonts/pk/cx/public/xypic/dpi<N>
+ and: texmf/fonts/pk/ljfour/public/xypic<N>
+
+
+Step 7. PostScript Type1 Fonts
+------------------------------
+Files `type1/*.pfb' contain versions of the Xy-pic fonts in special
+PostScript form that may be useful on some installations. They should
+be installed where the applications using them look for such fonts (if
+used with DVIPS then the `ps/xypic.map' file from the next group
+should also be installed).
+
+NOTE: Some installations, notably teTeX 0.4, will PREFER using these
+fonts over the METAFONT-generated equivalents (IMHO this is a bug in
+the MakeTeXPK script). On those systems we recommend that you ALSO
+install the PK fonts to circumvent the problem.
+
+IMPORTANT: Make sure that you do not have any old Xy-pic PostScript
+`xy*.pfa' fonts floating around in your system - search for and remove
+all files named `xy*.pfa' when you have installed the new fonts. One
+common way old (and wrong) fonts is manifest is when some arrowheads
+appear skewed or too thin.
+
+TDS directory: texmf/fonts/type1/public/xypic
+
+
+Step 8. Adobe Font Metric Files
+-------------------------------
+Files `afm/*.afm' are special files for the Adobe Type Manager and
+some other software. Install them if you need them.
+
+TDS directory (usually): texmf/fonts/afm/public/xypic
+
+
+Step 9. PostScript Font Metric Files
+------------------------------------
+Files `pfm/*.pfm' are special files for the Windows version of the
+Adobe Type Manager and some other software. Install them if you need
+them.
+
+TDS directory (usually): texmf/fonts/pfm/public/xypic
+
+
+Step 10. PostScript Header Files
+--------------------------------
+Files `ps/*' contain PostScript header files. If you plan to use the
+PostScript extension option then you should copy these files to a
+place where your PostScript DVI driver will find them.
+
+NOTE: For older versions of DVIPS (at least for 5.58f) you should
+replace the occurrences of `<<' with `<' in `xypic.map'.
+
+TDS directory (usually): texmf/dvips/xypic
+
+
+[FILES IN xy*doc.tar.gz:]
+
+
+Step 11. Manuals
+----------------
+The typeset User's Guide is distributed as a DVI file which you should
+be able to print (or preview) once you have installed the fonts (as
+source or bitmaps as applicable for your system):
+
+ doc/xyguide.dvi User's Guide, typeset using the kernel Xy-pic fonts
+ doc/xyguide.dvips --- using DVIPS specific `specials'
+ doc/xyguide.ps --- in PostScript (with 600dpi bitmap fonts)
+
+Similarly, the reference manual for the kernel and the distributed
+options is included in the same format:
+
+ doc/xyrefer.dvi Reference Manual, using Xy-pic fonts
+ doc/xyrefer.dvips --- using DVIPS specific `specials'
+ doc/xyrefer.ps --- in PostScript (with 600dpi bitmap fonts)
+
+Notice that only the .dvi documents are portable among all TeX
+installations.
+
+TDS directory: texmf/doc/generic/xypic
+
+
+That's all. If you want to install the Xy-pic sources (to experiment
+with development, for example), you need to get the separate
+distribution `xy*src.tar.gz'.
+
+
+---------------------------------------------------------------------------
+-3- INFORMATION FOR SPECIFIC SYSTEMS
+---------------------------------------------------------------------------
+
+
+UN*X
+----
+The above installation procedure (using the TDS recommended places) is
+encoded in the script `support/install-tds': the command
+
+ ./support/install-tds <texmf>
+
+where <texmf> is the full path name of the `texmf' directory (the root
+of the TDS tree), will install all the Xy-pic runtime files (or more
+precisely: it will perform steps 2-5 and 7-10 above).
+
+NOTE: You must MANUALLY remove obsolete files (do step 1 above)!
+
+If you get the source distribution as described in `TRAILER' and
+change the configuration section of the provided `src/Makefile' to
+reflect your local file system conventions as described in
+`src/MAKE', then the command
+
+ make TEXMF=<texmf> install
+
+will also do this (but with the generated files, of course).
+
+
+VMS
+---
+(Mon, 20 Mar 1995; thanks to Austin Benson <austin@shapel.ug.eds.com>
+and Ralf Gaertner <gaertner@cthulhu.rhein-main.de>):
+
+(1) VMS tfm and pk files are in a funny file format, which means they
+ EITHER should be generated from the mf source on a VMS machine, OR
+ be converted by a conversion program such as BILF (part of the
+ DECUS TeX distribution and the ZOO distribution although the
+ latter is reported to only work on VAXen).
+
+ FIX: Install .mf sources and pregenerate .tfm and .pk files
+ manually OR convert with BILF or a similar program.
+
+(2) At least some (OLD) versions of TeX for VMS had a `buglet' to do
+ with searching for input files: if you go \input <filename> on VMS
+ then TeX prepends the filename with a chained logical
+ "tex_inputs:" - equivalent to a Unix path. Unfortunately \openin
+ does _not_ do this - although on Unix systems \openin will search
+ the TEXINPUTS path just as \input does.
+
+ FIX: Change the following line in xy.tex
+
+\xydef@\xyinputorelse@@#1#2{\openin\xyread@=#1
+
+ TO
+
+\xydef@\xyinputorelse@@#1#2{\openin\xyread@=tex_inputs:#1
+
+
+PC WITH PCTEX
+-------------
+On PCTeX fonts should be stored in files `C:\PIXEL\DPI<dpi>\<font>.pk'
+where <dpi> and <font> are replaced by appropriate values, e.g., `600'
+and `xyatip' (thanks to Alain Amiouni <alain_amiouni@msn.com>).
+
+
+MAC WITH Textures or OzTeX
+--------------------------
+See the special files `INSTALL.Textures' and `INSTALL.OzTeX'.
+
+
+---------------------------------------------------------------------------
+-4- UPDATING FROM VERSION 2.6 (AND EARLIER)
+---------------------------------------------------------------------------
+
+
+IMPORTANT: If you have installed release 3.* or 2.7-2.12 then you can
+skip this section. If you have not, and use version 2.6, then READ IT!
+
+Xy-pic release 2.7 was almost a complete rewrite of Xy-pic; later
+releases are updates to this version. If you are using version 2.6 (or
+some earlier version) then note the following:
+
+* All the fonts have been redone AND renamed (except two that have not
+ changed). Thus installing version 3 will not break any DVI files
+ you already have that were typeset using the old fonts.
+
+ NOTE: In fact the distribution still contains the old fonts but only
+ as METAFONT sources, TFM font metrics, and PK bitmaps.
+
+* The distribution contains new versions of the files `xypic.tex' and
+ `xypic.sty' that load Xy-pic in a special compatibility mode. Thus
+ retypesetting your documents will create DVI files using the new
+ fonts. If you wish to keep the old `xypic.tex' and `xypic.sty' then
+ you should rename them before installation; we suggest naming them
+ `xypic-2.tex' and `xypic-2.sty' and REMEMBER to change the line
+ `\input xypic' in `xypic-2.sty' to `\input xypic-2' !
+
+* There are a few points where the backwards compatibility is not
+ perfect -- these are noted in the documentation.
+
+
+---------------------------------------------------------------------------
+-5- BUGS & COMMENTS
+---------------------------------------------------------------------------
+
+
+We will appreciate reports on any problems you may encounter and
+opinions you have on how the usefulness of Xy-pic can be improved.
+Please report using either
+
+ Electronic mail (Internet): krisrose@ens-lyon.fr [preferred]
+
+ Paper mail: Kristoffer H. Rose
+ Laboratoire de l'Informatique du Parallélisme
+ Ecole Normale Supérieure de Lyon
+ 46, Allée d'Italie
+ F-69364 Lyon cedex 07
+ FRANCE
+
+ Fax: +33 4 7272 8080
+
+ W3 <URL: http://www.ens-lyon.fr/~krisrose/Xy-pic.html>
+
+---------------------------------------------------------------------------
+
+This is the end of INSTALL. We hope you'll enjoy Xy-pic!
+
+ -- Ross Moore and Kristoffer Rose
+
+---------------------------------------------------------------------------
+
+Kristoffer Høgsbro Rose, Ph.D., prof.associé <Kristoffer.Rose@ENS-Lyon.FR>
+Laboratoire de l'Informatique du Parallélisme équipe PLUME, bureau LR5-026
+Ecole Normale Supérieure de Lyon; 46, Allée d'Italie; F-69364 Lyon 07 cedex
+phone: +33(0)4 7272 8642; fax:...8080 <http://www.ens-lyon.fr/~krisrose>
+
+---------------------------------------------------------------------------
diff --git a/Master/texmf-dist/source/generic/xypic/INSTALL.OzTeX b/Master/texmf-dist/source/generic/xypic/INSTALL.OzTeX
new file mode 100644
index 00000000000..23d838de562
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/INSTALL.OzTeX
@@ -0,0 +1,600 @@
+-*-text-*- $Id: INSTALL.OzTeX,v 3.4 1997/05/18 01:13:24 ross Exp $
+
+ ================================================
+ INSTALLING THE Xy-pic DIAGRAM TYPESETTING MACROS
+ ON OzTeX INSTALLATIONS
+ ================================================
+
+This file explains step by step how to install Xy-pic for use with
+OzTeX by Andrew Trevorrow. Please refer to the generic `INSTALL' file
+for details on the individual files.
+
+Contents:
+
+ -0- Comments regarding OzTeX versions
+ -1- Adding Xy-pic to the TeX search paths
+ -2- Memory requirements
+ -3- OzTeX and PostScript features
+ -4- Bugs & comments
+ -5- Config files
+
+----------------------------------------------------------------------
+ -0- COMMENTS REGARDING OzTeX VERSIONS
+----------------------------------------------------------------------
+
+Xy-pic works fine with versions of OzTeX, from 1.7 to 2.0 and later.
+With version 2.0+ of OzTeX, it is advisable to use the OzDVIPS driver.
+Similarly with versions 1.8 and 1.9, it is possible to use the DVIPS
+driver, implemented by Thomas Kiffe. These WILL handle all the effects
+such as colour, rotated text, scaled text, patterns, fills and others,
+however the OzTeX viewer cannot show these effects---you will need a
+PostScript printer or previewer such as GhostScript
+(e.g. `Mac GS Viewer', by Aladdin Enterprises).
+
+Thus to handle special effects with OzTeX 1.8+ your TeX source should
+specify \xyoption{dvips} and the `Use DVIPS' menu option should be
+selected for processing the dvi-file.
+
+The \xyoption{oztex} command should ONLY be used with OzTeX 1.8+ when
+you do not wish to use DVIPS or OzDVIPS but still want the improved
+performance of the PostScript backend (see note 3 below).
+Similarly \xyoption{17oztex} is provided for use with version 1.7.
+
+
+----------------------------------------------------------------------
+ -1- ADDING Xy-pic TO THE TeX SEARCH PATHS
+----------------------------------------------------------------------
+
+Follow these steps to make Xy-pic `visible' to OzTeX:
+
+INSTALLING MACROS:
+
+1. Create a subfolder `:TeX-inputs:Xy-pic:'.
+
+ This folder will contain the Xy-pic input files. It is NOT
+ sufficient to create an alias to an existing folder which already
+ contains these files.
+
+2. Append this directory name to the line
+
+ TeX input folder(s) = ....
+
+ in the `:Configs:Default' file.
+
+3. Within the folder `:Configs:'
+
+ EITHER create the files
+
+ :Configs:Default+Xypic
+ :Configs:Big TeX+Xypic
+ :Configs:Big Xy-TeX
+
+ which are included below (in section -5-).
+ These are modifications of Config files from OzTeX version 1.8.
+ Adaptations for version 2.0+ will be made sometime soon.
+ OR
+ read the memory requirement notes below (in section -2-)
+ and reconfigure your own config files accordingly.
+
+4. Within the folder `:TeX-inputs:Xy-pic:' place copies of all of
+ the files from `texinputs'.
+
+INSTALLING FONTS:
+
+5. Create a subfolder `:TeX-fonts:Xy-pic:'
+
+ This folder will contain the Xy-pic font metrics files. It is NOT
+ sufficient to create an alias to an existing folder which already
+ contains these files.
+
+6. Within the folder `:TeX-fonts:Xy-pic:' place copies of all of
+ the files from `texfonts'.
+
+7. For each of the subdirectories in `pkfonts': `cx300', `cx329', and
+ `cx360' copy all files to the corresponding folder
+
+ :PK-files:300:
+ :PK-files:329:
+ :PK-files:360:
+
+INSTALLING THE PostScript BACKEND:
+
+8. Within the folder `:PS-files:' place a copy of the file
+ `ps/xy34dict.pro'. This is placed here for safe-keeping only.
+
+If you DO NOT use DVIPS then ...
+
+8A. Within each directory in which you work, you will need a copy
+ of this file, renamed to be called `global.ps';
+
+ ...but if you DO use DVIPS then it is sufficient to...
+
+8B. Place a copy of `ps/xy34dict.pro' into the subfolder
+ `:Dvips:ps' where it can be found by DVIPS.
+
+ Read section -3- below, to understand what is required here.
+
+----------------------------------------------------------------------
+ -2- MEMORY REQUIREMENTS
+----------------------------------------------------------------------
+
+Xy-pic is a big package, requiring quite a lot of memory if a large
+number of diagrams, or a small number of large diagrams, are to be
+typeset.
+
+Using the `Default' configuration and `Plain' format, then Xy-pic will
+load, but expect trouble unless you need it only for small diagrams.
+With `LaTeX' then Xy-pic will NOT EVEN LOAD all of its standard
+options.
+
+Thus using `Big-TeX' should be regarded as ABSOLUTELY ESSENTIAL, to do
+any serious typesetting --- though read the rest of this section
+before doing this. Of course this will mean rebuilding the `Plain'
+and `LaTeX' formats using `INITEX' and increasing the Finder
+memory-partition from the OzTeX application's `Get Info' dialog box.
+
+Since `Big-TeX' inherits and overrides settings from `Default' it is
+not necessary to make any alterations for Xy-pic --- at least not for
+use with the `Plain' format.
+
+However even `Big-TeX' is too small, in some of its parameters, for
+`LaTeX' and Xy-pic to coexist peacefully. If you try this then the
+first type of memory to run out is the `pool size':
+
+ ! TeX capacity exceeded, sorry [pool_size=60000].
+
+To fix this requires increasing the "pool_size" parameter, to say
+160,000. Existing format files for Plain and LaTeX, compiled under
+Big-TeX with the smaller pool size WILL STILL WORK --- there is no
+need to recompile to accommodate this change.
+
+The config file `:Configs:Big TeX+Xypic' has these values.
+
+
+This should be sufficient unless the document contains large
+diagrams or diagrams such that many curves appear on the same or
+adjacent pages, and the Xy-pic PostScript back-end is NOT in use.
+Expect to encounter...
+
+ ! TeX capacity exceeded, sorry [mem_max=200000].
+
+In order to typeset such documents other memory parameters may have to
+be increased also, including "mem_top", "hash_size", "hash_prime" and
+"hyph_size". These latter changes mean that the format files have to
+be rebuilt.
+
+For example, in order to typeset the Xy-pic guide, reference manual,
+and technical documentation (700+ pages), using the Xy-pic fonts, an
+OzTeX with a finder memory partition of 8+ MBytes -- it has the
+parameter `mem_max=600000' -- was used.
+
+Please experiment with the memory parameters until you find settings
+comfortable for your requirements. The author would be happy to
+include, with future releases of Xy-pic, a listing of typical settings
+which users have found to meet their needs.
+
+----------------------------------------------------------------------
+ -3- IMPORTANT: OzTeX AND PostScript FEATURES
+----------------------------------------------------------------------
+
+Xy-pic provides improved graphics capabilities using PostScript code
+inserted into the .dvi-file using \special commands. Indeed if the
+PostScript ``backend'' is loaded, then almost all parts of diagrams
+constructed with Xy-pic can be rendered using PostScript. These extra
+features become available to Xy-pic, when `options' are requested,
+using e.g. \xyoption{ps} , \xyoption{color} , \xyoption{line} , ...
+see the User Guide and Reference manual for details.
+
+HOWEVER, one MUST also specify ONE of the following commands:
+
+ \xyoption{dvips} if ``Use DVIPS'' is checked
+ \xyoption{oztex} with versions 1.8+ of OzTeX
+ \xyoption{17oztex} with version 1.7 of OzTeX
+(these latter two are for when DVIPS will NOT process the .dvi file.)
+
+AND, if not using LaTeX, specify \XyReloadDrivers after all other
+Xy-pic options have been requested.
+
+
+
+IMPORTANT: (when OzDVIPS or DVIPS is NOT being used)
+If Xy-pic PostScript features are to be used with OzTeX,
+then two files are used frequently, namely `:PS-files:empty.ps' and
+`global.ps'. The latter must be resident in the current folder.
+
+Make sure that `empty.ps' indeed has empty contents, for the Xy-pic
+\specials depend upon this. Also, if global.ps has non-empty contents,
+then take a copy for safe-keeping, for Xy-pic will need to overwrite
+it at some point, as will now be explained.
+
+For the Xy-pic \specials to work correctly a dictionary of PostScript
+definitions must be included with every document before printing.
+These definitions are typically required on every page, so OzTeX's
+`global.ps' mechanism is used to achieve this.
+
+NOTE: It is NOT sufficient to input this dictionary as if it were
+a graphics file, residing in `:PS-files'. The `global.ps' mechanism
+is the ONLY way provided by OzTeX for this to work.
+
+Indeed Xy-pic checks that this file is available. If it does not find it,
+or finds that it is empty, then the required dictionary is written
+afresh and named `global.ps', so that OzTeX will recognize its purpose.
+
+You can force a fresh copy of the dictionary by placing the command
+ \dumpPSdict{global.ps} in the preamble section of any document.
+If your `global.ps' already has contents that you wish to continue to
+use, then copy it to somewhere safe and append its contents to the file
+created as above by Xy-pic.
+
+The dictionary is included in the package as `ps/xy34dict.pro'.
+
+LIMITATIONS: (when OzDVIPS or DVIPS is NOT being used)
+Not all of the PostScript effects that can be requested from the `line',
+`rotate' and `color' extension options are actually implementable by OzTeX.
+The limitation is due to the way in which OzTeX handles the \special
+commands, collecting them all at the beginning of the PostScript file that
+it creates, followed by the rules and characters from fonts.
+
+This means that the \special to initiate a special effect is followed
+soon after by the one necessary to revert to normal; this happens
+before any font characters are typeset. Correct sequencing is
+maintained so that diagrams constructed purely from Xy-pic objects
+such as lines, circles, curves and arrow-tips can have expanded widths
+and be coloured correctly. However rotations and scalings cannot work
+for other technical reasons. Any font characters in the diagram will
+not be expanded or coloured; this includes Xy-pic fonts.
+
+This situation is unfortunate, but nothing further can be done from
+within Xy-pic. To enjoy this aspect of working with Xy-pic, update
+to version 1.8 or later and use DVIPS or OzDVIPS.
+
+----------------------------------------------------------------------
+ -4- BUGS & COMMENTS
+----------------------------------------------------------------------
+
+Bugs and questions concerning the OzTeX implementation of Xy-pic
+should be directed to
+
+ Electronic mail (Internet): ross@mpce.mq.edu.au
+
+ Paper mail: Ross Moore
+ Mathematics Department
+ Macquarie University
+ North Ryde, Sydney
+ AUSTRALIA 2109
+
+ Fax: +61 2 9850 8114
+
+Generic bugs should be reported to Kristoffer Rose as described in the
+generic INSTALL file.
+
+----------------------------------------------------------------------
+
+This is the end of the `INSTALL.OzTeX' description; below is a section
+with the files discussed above. We hope you'll enjoy Xy-pic!
+
+----------------------------------------------------------------------
+ -5- Config FILES.
+----------------------------------------------------------------------
+
+Below is the contents of each of the files discussed in point 3 of
+section -1- above. Lines with only --s (dashes) are used to delimit
+the files.
+
+----------------------------------------------------------------------
+ :Configs:Default+Xypic
+----------------------------------------------------------------------
+% This is the default configuration file read by OzTeX 1.8.
+% Before making any changes, read the section on configuration files
+% in the OzTeX User Guide.
+%
+config files = "Big TeX" "Big TeX+Xypic" "Big Xy-TeX" |
+ -- StyleWriter ImageWriter Linotronic -- |
+ "A5 Portrait" "A4 Landscape" "US Letter" -- |
+ "View at 144 dpi" "View CM using PS" -- |
+ "Add CM/PS Fonts" "Add Lucida Fonts" "Add MathTime Fonts"
+format files = LaTeX Plain
+help files = "Questions and Answers" "Handy Hints" Problems "TeX Users Group" |
+ "Related Software" -- "Changes to OzTeX 1.42" "Changes to OzTeX 1.5" |
+ "Changes to OzTeX 1.6" "Changes to OzTeX 1.7" -- "Shareware Fee" Thanks
+printer res & mode = 300 laserwriter
+viewing res & mode = 300 laserwriter
+units = in (in/cm/mm/pc/pt/bp/px)
+paper width = 210mm (A4 width; use 8.5in for US Letter)
+paper height = 297mm (A4 height; use 11in for US Letter)
+horizontal offset = 0mm (shift pages right if +ve, left if -ve)
+vertical offset = 0mm (shift pages down if +ve, up if -ve)
+show statistics = false
+reverse page order = false (use true if pages are stacked face up)
+conserve VM = false (only for PostScript printing)
+manual feed = false (ditto)
+reserved = ignored
+%
+% Important folders and files:
+%
+Help folder = :Help-files:
+FMT folder = :TeX-formats:
+TeX input folder(s) = :TeX-inputs:*
+TFM folder(s) = :TeX-fonts:*
+PK folder(s) = :PK-files:
+PS folder(s) = :PS-files: :PS-files:Encodings:
+Text-to-PS prolog = :PS-files:TEXTtoPS.pro
+DVI-to-PS prolog = :PS-files:DVItoPS.pro
+VF folder(s) = :VF-files:
+global PS file = global.ps
+"Save OzTeX" output = Oz.text
+missing fonts file = :PK-files:missfont.log (for use by MakeTeXPK)
+pool file = :TeX-formats:TeX.pool (only used by INITEX)
+dummy TFM file = :TeX-fonts:CM:cmr10.tfm
+dummy screen font = Geneva
+%
+% Previewing colours (use "white" to make something invisible):
+%
+paper edges = blue
+\special markers = green
+missing fonts = red
+%
+% TeX parameters (the values in brackets show the possible ranges):
+%
+mem_max = 60000 (mem_top..100000000)
+font_max = 120 (1..256)
+font_mem_size = 30000 (8..100000000)
+max_strings = 5000 (1300..16382)
+string_vacancies = 20000 (0..pool_size-23500)
+pool_size = 60000 (string_vacancies+23500..100000000)
+buf_size = 1000 (120..32760)
+stack_size = 200 (1..1600)
+max_in_open = 6 (1..20)
+param_size = 60 (1..8190)
+nest_size = 40 (1..1000)
+save_size = 600 (1..4094)
+trie_size = 8000 (1..32760)
+trie_op_size = 500 (1..16382)
+%
+% If you change any of the next four parameters then you'll need
+% to run INITEX and rebuild all your format files.
+% Some people will probably want to increase the hash_size value,
+% so here are some suitable hash_prime values:
+% hash_size = 3000 4000 5000 6000 10000 20000 31000
+% hash_prime = 2551 3407 4253 5101 8501 16993 26347
+%
+mem_top = 60000 (mem_min+1100..mem_max)
+hash_size = 4000 (325..31000)
+hash_prime = 3407 (prime about 85% of hash_size)
+hyph_size = 307 (prime from 1..16382)
+%
+% Only change the next few parameters when carrying out TeX's TRIP test:
+%
+mem_min = 0 (0..mem_top-1100)
+error_line = 72 (45..32760)
+half_error_line = 42 (30..error_line-15)
+max_print_line = 79 (60..32760)
+%
+%
+% PostScript fonts (or more accurately, non-PK fonts):
+%
+== TFM Printer font Download Screen font Encoding Style
+%
+= ptmr0 Times-Roman Times Mac.enc
+= ptmri0 Times-Italic Times Mac.enc i
+= ptmb0 Times-Bold Times Mac.enc b
+= ptmbi0 Times-BoldItalic Times Mac.enc bi
+= ptmro0 Slanted-Times-Roman Times Mac.enc i
+= ptmbo0 Slanted-Times-Bold Times Mac.enc bi
+= pagk0 AvantGarde-Book "Avant Garde" Mac.enc
+= pagko0 AvantGarde-BookOblique "Avant Garde" Mac.enc i
+= pagd0 AvantGarde-Demi "Avant Garde" Mac.enc b
+= pagdo0 AvantGarde-DemiOblique "Avant Garde" Mac.enc bi
+= pbkl0 Bookman-Light Bookman Mac.enc
+= pbkli0 Bookman-LightItalic Bookman Mac.enc i
+= pbkd0 Bookman-Demi Bookman Mac.enc b
+= pbkdi0 Bookman-DemiItalic Bookman Mac.enc bi
+= pcrr0 Courier Courier Mac.enc
+= pcrro0 Courier-Oblique Courier Mac.enc i
+= pcrb0 Courier-Bold Courier Mac.enc b
+= pcrbo0 Courier-BoldOblique Courier Mac.enc bi
+= phvr0 Helvetica Helvetica Mac.enc
+= phvro0 Helvetica-Oblique Helvetica Mac.enc i
+= phvb0 Helvetica-Bold Helvetica Mac.enc b
+= phvbo0 Helvetica-BoldOblique Helvetica Mac.enc bi
+= pncr0 NewCenturySchlbk-Roman "New Century Schlbk" Mac.enc
+= pncri0 NewCenturySchlbk-Italic "New Century Schlbk" Mac.enc i
+= pncb0 NewCenturySchlbk-Bold "New Century Schlbk" Mac.enc b
+= pncbi0 NewCenturySchlbk-BoldItalic "New Century Schlbk" Mac.enc bi
+= pplr0 Palatino-Roman Palatino Mac.enc
+= pplri0 Palatino-Italic Palatino Mac.enc i
+= pplb0 Palatino-Bold Palatino Mac.enc b
+= pplbi0 Palatino-BoldItalic Palatino Mac.enc bi
+= pzcmi0 ZapfChancery-MediumItalic "Zapf Chancery" Mac.enc
+%
+% The next three TFMs do not require virtual fonts; note that their names
+% do not end with a zero:
+%
+= pzdr ZapfDingbats "Zapf Dingbats" nil
+= psyr Symbol Symbol nil
+= psyro Slanted-Symbol Symbol nil i
+%
+% The following lines use "<file" to download non-resident fonts:
+%
+= putr0 Utopia-Regular <putr.pfa Utopia Mac.enc
+= putri0 Utopia-Italic <putri.pfa Utopia Mac.enc i
+= putb0 Utopia-Bold <putb.pfa Utopia Mac.enc b
+= putbi0 Utopia-BoldItalic <putbi.pfa Utopia Mac.enc bi
+==
+
+OzTeX doesn't bother reading any stuff after the final "==", so you can
+put additional comments here without having to start each line with "%".
+
+----------------------------------------------------------------------
+ :Configs:Big TeX+Xypic
+----------------------------------------------------------------------
+% This config file sets most TeX parameters to very large values.
+% OzTeX's preferred memory size will need to be at least 3100K.
+% If you don't have enough memory then reduce the values of mem_max
+% and mem_top. Each unit reduction saves 8 bytes, so if mem_max and
+% mem_top are reduced by 100,000 then the required memory size drops
+% to about 2300K.
+%
+% If you decide to change other parameters then you'll need to adjust
+% OzTeX's memory size according to the total number of bytes saved or
+% added. To determine this number:
+% - Use "Get Info" in the Finder's File menu to see OzTeX's current
+% memory size (probably 1400K unless you changed it).
+% - Start OzTeX, run INITEX and hit Cmd-Dot when you get the "**" prompt.
+% OzTeX shows the amount of memory allocated, so note down the number.
+% - Quit OzTeX and use "Get Info" to set OzTeX's memory size as high as
+% you can.
+% - Start OzTeX again and select "Big TeX" (containing your changes)
+% from the Config menu.
+% - Run INITEX and hit Cmd-Dot. The amount of memory allocated
+% should have changed; the difference should be rounded up to the
+% nearest multiple of 10K or more (depending on how paranoid you are)
+% and used to adjust OzTeX's ORIGINAL memory size.
+%
+% You'll need to run INITEX and build the big formats listed below
+% before you can use TeX with this configuration file.
+% The OzTeX User Guide describes how to build such format files.
+% If you want to change the given list of format files, make sure
+% the new names do not contain any spaces.
+%
+config files = ignored
+format files = Big-LaTeX Big-Plain
+help files = ?
+printer resolution = ?
+viewing resolution = ?
+units = ?
+paper width = ?
+paper height = ?
+horizontal offset = ?
+vertical offset = ?
+show statistics = ?
+reverse page order = ?
+conserve VM = ?
+manual feed = ?
+reserved = ?
+Help folder = ?
+FMT folder = ?
+TeX input folder(s) = ?
+TFM folder(s) = ?
+PK folder(s) = ?
+PS folder(s) = ?
+Text-to-PS prologue = ?
+DVI-to-PS prologue = ?
+VF folder(s) = ?
+global PS file = ?
+Save OzTeX output = ?
+reserved = ?
+pool file = ?
+dummy TFM file = ?
+dummy screen font = ?
+paper edges = ?
+\special markers = ?
+missing fonts = ?
+%
+% TeX parameters:
+%
+mem_max = 200000 (mem_top..100000000)
+font_max = 256 (1..256)
+font_mem_size = 60000 (8..100000000)
+max_strings = 10000 (1300..16382)
+string_vacancies = 30000 (0..pool_size-23500)
+pool_size = 160000 (string_vacancies+23500..100000000)
+buf_size = 3000 (120..32760)
+stack_size = 600 (1..1600)
+max_in_open = 20 (1..20)
+param_size = 200 (1..8190)
+nest_size = 150 (1..1000)
+save_size = 2000 (1..4094)
+trie_size = 16000 (1..32760)
+trie_op_size = 1000 (1..16382)
+mem_top = 200000 (mem_min+1100..mem_max)
+hash_size = 10000 (325..31000)
+hash_prime = 8501 (prime about 85% of hash_size)
+hyph_size = 2551 (prime from 1..16382)
+mem_min = 0 (0..mem_top-1100)
+error_line = 72 (45..32760)
+half_error_line = 42 (30..error_line-15)
+max_print_line = 79 (60..32760)
+%
+% Keep the current set of PostScript fonts:
+%
+=!
+
+----------------------------------------------------------------------
+ :Configs:Big Xy-TeX
+----------------------------------------------------------------------
+% Sets most TeX parameters to very large values.
+% The OzTeX application memory size will need to be about 5500K.
+% (If you don't have enough memory then reduce the values of mem_max
+% and mem_top. Each unit reduction saves 8 bytes, so if mem_max and
+% mem_top are reduced by 100000 then the application memory required
+% drops to about 2300K.)
+%
+% You'll need to run INITEX and build the format files listed below
+% (with ".fmt" appended) before using TeX with this configuration file.
+% Note that format file names must not contain any spaces.
+%
+config files = ignored
+format files = Big-Xy-Plain Bigger-LaTeX Big-Xy-LaTeX
+help files = ?
+printer resolution = ?
+viewing resolution = ?
+units = ?
+paper width = ?
+paper height = ?
+horizontal offset = ?
+vertical offset = ?
+show statistics = ?
+reverse page order = ?
+conserve VM = ?
+manual feed = ?
+reserved = ?
+Help folder = ?
+FMT folder = ?
+TeX input folder(s) = ?
+TFM folder(s) = ?
+PK folder(s) = ?
+PS folder(s) = ?
+Text-to-PS prologue = ?
+DVI-to-PS prologue = ?
+VF folder(s) = ?
+global PS file = ?
+Save OzTeX output = ?
+reserved = ?
+pool file = ?
+dummy TFM file = ?
+dummy screen font = ?
+paper edges = ?
+\special markers = ?
+missing fonts = ?
+%
+% TeX parameters:
+%
+mem_max = 600000 (mem_top..100000000)
+font_max = 255 (1..255)
+font_mem_size = 60000 (8..100000000)
+max_strings = 10000 (1300..16382)
+string_vacancies = 30000 (0..pool_size-23500)
+pool_size = 160000 (string_vacancies+23500..100000000)
+buf_size = 3000 (120..32760)
+stack_size = 1600 (1..1600)
+max_in_open = 20 (1..20)
+param_size = 200 (1..8190)
+nest_size = 150 (1..1000)
+save_size = 2000 (1..4094)
+trie_size = 16000 (1..32760)
+trie_op_size = 1000 (1..16382)
+mem_top = 600000 (mem_min+1100..mem_max)
+hash_size = 10000 (325..31000)
+hash_prime = 8501 (prime about 85% of hash_size)
+hyph_size = 2551 (prime from 1..16382)
+mem_min = 0 (0..mem_top-1100)
+error_line = 72 (45..32760)
+half_error_line = 42 (30..error_line-15)
+max_print_line = 79 (60..32760)
+%
+% Keep current PostScript fonts:
+%
+=!
+
+----------------------------------------------------------------------
diff --git a/Master/texmf-dist/source/generic/xypic/INSTALL.Textures b/Master/texmf-dist/source/generic/xypic/INSTALL.Textures
new file mode 100644
index 00000000000..132fad86189
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/INSTALL.Textures
@@ -0,0 +1,393 @@
+-*-text-*- $Id: INSTALL.Textures,v 3.4 1997/05/18 01:13:24 ross Exp $
+
+ ===============================================================
+ INSTALLING THE Xy-pic DIAGRAM TYPESETTING MACROS ON A MACINTOSH
+ ===============================================================
+
+This file assumes that you have downloaded the `xy34mac.sea.hqx'
+file and have decoded this and have expanded and extracted all files
+and folders from the resulting compressed archive.
+
+It also assumes that you have the TeX application called Textures(tm),
+from Blue Sky Research, Portland, Oregon (version 1.6 or later).
+
+Finally it assumes that you have read the file INSTALL.
+
+
+The main difference between Textures(tm) and other TeX implementations
+is the way in which fonts are handled. Here we deal with Macintosh
+font suitcases containing bitmap versions of the special fonts that
+Xy-pic uses, as well as a suitcase containing the font metrics.
+
+For users of OzTeX a folder called `for OzTeX only' contains .pk fonts,
+.tfm files and some configuration files. The file `INSTALL.OzTeX'
+explains how to install these.
+
+For any other implementations of TeX on the Macintosh, there may be
+sufficient files here to install Xy-pic. If not then obtain the full
+Xy-pic distribution from one of the usual ftp sites:
+ ftp.mpce.mq.edu.au in the /pub/maths/TeX directory;
+ ftp.brics.dk in the /Staff/krisrose/TeX directory;
+ CTAN in the tex-archive/macros/generic/diagrams/xypic directory;
+ e.g. at ftp.shsu.edu, ftp.tex.ac.uk and ftp.dante.de.
+
+(If this is still insufficient, then the author would like to know
+what other resources are required and why.
+Contact him by email at the address given below.)
+
+
+From version 2.10, the source files are NOT included with the
+Macintosh Distribution, as doing this would add almost 1 MByte
+to its overall size. Obtain them from the sites listed above.
+
+
+I'll also assume that you use a 300 dots per inch laser printer
+(like the Apple laserwriter or HP laserjet).
+
+Contents:
+
+ -0- Simple Installation, for experienced users
+ -1- Copyleft
+ -2- Updating from version 2.6 (and earlier) or 2.7--2.12, 3.0--3.2
+ -3- Overview of files and where they should be installed
+ -4- Manuals and Sources
+ -5- Memory Requirements
+ -6- Bugs & comments
+
+----------------------------------------------------------------------
+ -0- SIMPLE INSTALLATION, for EXPERIENCED USERS
+----------------------------------------------------------------------
+
+If you have never used Xy-pic before and are experienced as a user
+of Textures(tm), then the following instructions should be sufficient
+to get Xy-pic installed.
+
+You should have extracted two folders called `for TeX inputs folder'
+and `for TeX fonts folder' from the Stuffit archive.
+
+Simply copy the contents of these folders to the places indicated by
+their names; namely the font suitcases go into the `TeX Fonts` folder,
+while the `xy*.tex` source code files go into the `TeX inputs` folder.
+
+
+If these instructions do not make sense to you, or you get any warning
+messages when you try to carry out these steps, then...
+
+ STOP immediately!
+
+... read the rest of this file, to learn more about Xy-pic, what all
+the files contain and how they should be installed on your Macintosh.
+
+If you had no trouble with this installation, then... enjoy Xy-pic!
+Please do us the courtesy of reading the rest of this file anyway.
+In particular please respect the following Copyright message, making
+sure that any copies that you may distribute are complete, so that
+others can equally enjoy Xy-pic (... and so that we do not get irate
+messages about missing features).
+
+----------------------------------------------------------------------
+ -1- COPYLEFT
+----------------------------------------------------------------------
+
+This distribution of the Xy-pic package is distributed with copyleft:
+
+ Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+ Copyright (c) 1994-1997 Ross Moore <ross@mpce.mq.edu.au>
+
+ The Xy-pic package is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Xy-pic package is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+What this means is that if you install Xy-pic then you should (1) make
+sure that the file COPYING is accessible to the users, and (2) be
+prepared to provide Xy-pic (including sources) to any of your users
+that request it (you may charge a fee for this if you are so inclined).
+
+----------------------------------------------------------------------
+ -2- UPDATING FROM VERSION 2.6 (AND EARLIER) OR 2.7--2.12, 3.0--3.2
+----------------------------------------------------------------------
+
+Xy-pic version 2.7 was almost a complete rewrite of Xy-pic. The update
+to version 2.8 fixed numerous small bugs and added PostScript \special
+commands that could be used instead of the Xy-pic fonts.
+In version 2.9 the PostScript functionality was extended to include
+effects such as rotation and scaling of diagrams and text, variable
+line thickness and colour support. There were also improvements in many
+other aspects of the way Xy-pic works.
+
+A Macintosh version of 2.9 was never released, as some of the claimed
+effects did not actually work. These bugs were fixed for version 2.10.
+
+Version 2.11 included the `Graph Combinator' feature which provides
+a simplified interface for many common classes of diagrams.
+Also some minor bugs were fixed, both in code and documentation.
+
+Version 2.12 is necessary to accommodate a change to AMS-LaTeX which
+otherwise seriously conflicts with internal structure of Xy-pic.
+A new `Polygon' feature has been added and many subtle bugs fixed.
+Also much of the `curve' code has been improved, especially for
+`curved arrows'.
+
+Also, versions 2.12+ provide for a new font for arrow-tips, in the style
+of those arrowheads that appear in the Computer Modern fonts.
+Fonts xycmat10 and xycmbt10 have always been included in the font
+suitcases (since version 2.6) but not used due to errors in the metrics.
+This has now been rectified --- this means that the font metric file
+`Xy-pic metrics' MUST BE REPLACED with the latest version --- having
+modification date: 20 August 1994 --- but the fonts are unchanged.
+
+Xy-pic version 3.0 was released in July 1995. New features included
+one for typesetting `crossing strings', in particular elegant
+representations of `knots', and one for `webs' or `lattices' of objects
+regularly spaced. There was no separate Macintosh distribution, but the
+macros would work with the earlier versions.
+With version 3.0 an improved option-loading mechanism was established
+for alternate dvi-drivers allowing extra effects using \special commands.
+
+To use such features place one of the following declarations in the
+document preamble:
+
+ \xyoption{textures} % with version 1.7 or later
+ \xyoption{16textures} % with version 1.6 of Textures
+
+If LaTeX is NOT being used then it is also necessary to specify
+
+ \xyReloadDrivers
+
+after all Xy-pic options have been specified.
+With LaTeX, this command occurs automatically at the \begin{document}.
+
+This version 3.4 contains just a few fixes found to necessary after
+the extensive changes of the 3.3 release. Some PostScript effects
+were broken, but now patterned tilings work again and frames are
+better than ever, even for non-PostScript effects. The old v2 macros
+which stopped working are now properly enabled.
+
+The version 3.3 was very stable for most purposes. A few bugs from
+previous versions were fixed and some new features were
+added. In particular `breaks' in connections, whether straight or
+curved, now work correctly. There is a greater variety of arrow-tips.
+Intersections between a curved connection and a straight one can
+now be located, or the point of closest approach can be located.
+
+The previous Version 3.2, followed closely after Version 3.1, fixing
+several bugs found there. Some diagrams in the documentation were
+found to not print correctly on some PostScript printers due to
+internal errors in the PostScript interpreter; these diagrams have
+been altered slightly to avoid that problem. (A future release of
+Xy-pic will attempt to sidestep such problems completely.)
+
+Indeed the Version 3.1 release fixes bugs in earlier releases,
+improves the range of available `frames' and offers a wider range
+of curved objects.
+The number of different dvi-drivers has been extended, though this
+has little bearing for Macintosh-users.
+
+
+
+If you already have version 2.7 (or later) installed then:
+
+* Copy the file: `Xy-pic metrics' , to be found in the folder called
+ `for TeX fonts folder', into your `TeX Fonts' folder.
+
++ The file `Xy-pic fonts' contains no new fonts, so need not be updated.
+
++ With version 7.1+ of the Macintosh operating system, you can place
+ font suitcases in the Fonts subfolder of the system folder.
+ However the `Xy-pic metrics' suitcase MUST be in the `TeX Fonts' folder.
+
++ Extra font sizes are available in a separate archive called `xymacxf.sit',
+ see below for more details. These can be installed locally, if desired.
+ Alternatively the extra sizes may be installed on a file-server;
+ then place an `alias' (requires system 7.0+) to them within the `TeX Fonts'
+ folder --- the server will mount when Textures is launched.
+
+
+* Copy the contents of the `for TeX inputs folder' into the
+ obvious place, i.e. the `TeX Inputs' folder, allowing these files to
+ replace the existing ones of the same name.
+
++ With the system-7 operating system, you can place the files/folders
+ elsewhere, and place aliases to them within the `TeX Inputs' folder.
+
+
+
+If you already have version 2.6 (or some earlier version) installed then
+note the following:
+
+* All the fonts have been redone AND renamed. Thus installing the new
+ version will not break any typeset files you already have that use
+ the old fonts. However if you intend to keep the old version on your
+ system then you should rename the font and metrics suitcases to
+ `Xy-pic fonts.old' and `Xy-pic metrics.old'.
+
+* The distribution contains new versions of the files `xypic.tex' and
+ `xypic.sty' that load Xy-pic 2.12 in a special compatibility mode.
+ Thus re-TeX'ing your source documents will create typeset versions
+ using the new fonts. If you wish to keep the old `xypic.tex' and
+ `xypic.sty' then you should rename them before installation.
+
+* There are a few points where the backwards compatibility is not
+ perfect -- these are noted in the documentation.
+
+
+----------------------------------------------------------------------
+ -3- OVERVIEW OF FILES AND WHERE THEY SHOULD BE INSTALLED
+----------------------------------------------------------------------
+
+The installation instructions of INSTALL apply except that
+
+MACRO FILES: are placed in the `for TeX inputs folder' and should
+normally be duplicated to the `TeX Inputs' folder (after having
+appropriately dealt with any previous version, as described above).
+
+PostScript HEADER FILES: It is not necessary to use this header file;
+furthermore the reference manual describes how it can be generated if
+needed from `xyps.tex'.
+
+Xy-pic FONTs and METRICs: the two font suitcase files, called `Xy-pic
+fonts' and `Xy-pic metrics', are found in the folder called `for TeX
+fonts folder'. Simply move these into the Textures(tm) `TeX Fonts'
+folder (after having appropriately dealt with any previous version, as
+described above).
+
+When you next launch the Textures(tm) application the following fonts will
+then be available for use in typesetting with the Xy-pic macros.
+
+ xydash10 straight line segments at 128 different angles
+ xyatip10 top half of an arrow head at 128 different angles
+ xybtip10 bottom half of arrow head at 128 different angles
+ xybsql10 small quarter turns, for hooks, turns and wavy lines
+ xycirc10 eighth-turns at 16 different radii, 8 per radius
+
+ xycmat10 Computer Modern Tips --- upper barbs
+ xycmbt10 Computer Modern Tips --- lower barbs
+ xyeuat10 Euler Tips --- upper barbs
+ xyeubt10 Euler Tips --- lower barbs
+
+These fonts are each provided in four screen sizes: 100% 120% 200% 240%
+and in one size for laser-printing at 300dpi: 417%.
+
+If more sizes are required then either:
+
+ a) get the file `xymacxf.sit.hqx' from ftp.mpce.mq.edu.au.
+ These expand to give suitcases containing the above sizes plus extra
+ laserwriter sizes, corresponding to magsteps 0.5, 1, 2, 3, 4, 5.
+ (The xycirc10 is separate since these fonts occupy more space than
+ any of the others --- 2.2 MByte!! )
+
+or...
+
+ b) generate extra sizes using Metafont.
+ The appropriate xy*.mf source files are included in the sub-directory
+ `mfinputs'. This can be obtained from the ftp sites listed above.
+
+ xydash10.mf kernel font sources
+ xyatip10.mf
+ xybsql10.mf
+ xybtip10.mf
+ xycirc10.mf
+
+With the xy*.tex and xy*.sty input files installed in the `TeX Inputs'
+folder, and the font suitcases installed in the `TeX Fonts' folder,
+you should be ready to use Xy-pic to typeset some diagrams.
+
+DOCUMENTATION: The dvi-files are provided primarily for non-Textures
+users. Using the `DVI-Tool' application, they can be converted into
+the usual form for documents typeset using Textures(tm). However this is
+not necessary as it has been done already: the `Xy-pic User's Guide'
+and `Xy-pic Reference Manual' described below.
+
+
+----------------------------------------------------------------------
+ -4- MANUALS and SOURCES
+----------------------------------------------------------------------
+
+The `Xy-pic User's Guide' and `Xy-pic Reference Manual' are provided
+with this distribution. They are in the form of pre-typeset Textures(tm)
+documents. These files are Finder-locked and should NOT be re-typeset.
+(Indeed it should not be possible to typeset this file without first
+removing the safe-guards which have been put in place.)
+
+It is a good idea to test your installation of Xy-pic by typesetting
+portions from the manuals. Of course you will first have to obtain
+these sources from one of the ftp sites listed above, or elsewhere.
+
+Alternatively you can try to typeset the complete manuals, using LaTeX,
+from the documents `xyguide.man' and `xyrefer.man' in the directory `src`
+where they are located along with all the input and non-standard style
+files that they need.
+You will need to obtain ALL the files in this directory.
+(There is a file named `xy*.doc' for each macro file `xy*.tex'
+placed in the `TeX Inputs' folder.)
+For this to be successful your Textures application will need a
+memory partition of at least 4.5 MBytes.
+
+The normal sequence should be followed: LaTeX, BibTeX, LaTeX, LaTeX
+to get all the references and the bibliography typesetting correctly.
+These manuals have been checked to work correctly with LaTeX 2.09 and
+LaTeX2e.
+
+An alternative way to get the manuals is to download the files called
+`xyguide.ps.Z' and `xyrefer.ps.Z' from one of the ftp-sites.
+These files were created using the `xyps' PostScript option, so should
+produce a higher quality printed output on a PostScript printer of
+resolution 300dpi (due to use of bitmapped Computer Modern fonts).
+
+
+----------------------------------------------------------------------
+ -5- MEMORY REQUIREMENTS
+----------------------------------------------------------------------
+
+Although many efforts have been made to make Xy-pic work quickly and
+efficiently, the nature of the diagrams for which it is designed are
+sometimes necessarily quite large and consume a significant amount of
+TeX's available memory. Do not be surprised if it takes a long time
+to typeset a diagram having several rows and columns of entries.
+
+Usually I work with a memory partition set at 4 MBytes, on a Mac IIci
+or Macintosh PowerBook. For instance, when typesetting the User's Guide,
+using LaTeX-2e and Xy-pic, nearly all of this 4 MBytes is required.
+The Reference Guide requires even more than this: allowing 8 MByte was
+a luxury that I could afford, but I suspect that 4.5 MByte would have
+been sufficient. Mind you, although shorter the Users' Guide actually
+takes significantly longer to typeset than does the Reference Manual.
+
+
+----------------------------------------------------------------------
+ -6- BUGS & COMMENTS
+----------------------------------------------------------------------
+
+Comments or reports related to the Macintosh distribution should be
+sent to Ross Moore at
+
+ Electronic mail (Internet): ross@mpce.mq.edu.au [preferred]
+
+ Paper mail: Ross Moore
+ Mathematics Department,
+ Macquarie University
+ North Ryde, NSW 2109
+ AUSTRALIA
+
+ Fax +61 2 9850 8114 attn: R.Moore
+
+----------------------------------------------------------------------
+
+This is the end of `INSTALL.Textures'. We hope you'll enjoy Xy-pic !
+
+--
+Ross MOORE Internet: ross@mpce.mq.edu.au
+Mathematics Dept, Macquarie University, Nth Ryde, NSW 2109, AUSTRALIA
+phone: +61 2 9850 8955 fax: +61 2 9850 8114
+WWW: http://www-math.mpce.mq.edu.au/~ross/
+--
diff --git a/Master/texmf-dist/source/generic/xypic/MAKE b/Master/texmf-dist/source/generic/xypic/MAKE
new file mode 100644
index 00000000000..6a2e960a936
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/MAKE
@@ -0,0 +1,259 @@
+-*-text-*- $Id: MAKE,v 3.5 1997/05/28 22:40:26 krisrose Exp $
+
+ ================================================
+ MAKE: Xy-pic diagram typesetting package SOURCES
+ ================================================
+
+Welcome to the source distribution of the Xy-pic macros for typesetting
+diagrams! Below you will find the following sections:
+
+ -1- License information
+ -2- Making the package and manual from sources
+ -3- Bugs & comments
+ -4- Distribution log
+
+Please see the file `README' for a summary of features `TRAILER' for how
+you can obtain the newest Xy-pic, and the various `INSTALL' files if you
+have already retrieved pregenerated macros and fonts.
+
+
+----------------------------------------------------------------------
+ -1- LICENSE INFORMATION
+----------------------------------------------------------------------
+
+The Xy-pic package is licensed under `GNU CopyLeft':
+
+ Xy-pic: Typesetting graphs and diagrams with TeX.
+ Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+
+ The Xy-pic macro package is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Xy-pic macro package is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+(Some options may be copyright by other people but the conditions remain
+the same).
+
+The full text of the GNU General Public License is supplied with Xy-pic
+in the file `COPYING'.
+
+
+----------------------------------------------------------------------
+ -2- MAKING THE PACKAGE AND MANUAL FROM SOURCES
+----------------------------------------------------------------------
+
+This section describes how to make the Xy-pic package from sources on
+a un*x system. Making Xy-pic requires use (and some knowledge) of
+several standard un*x utilities; furthermore the typesetting og the
+reference manual needs a **LARGE** TeX (see below), and full
+installation requires both the plain TeX and LaTeX2e formats as well
+as METAFONT (with the plain and cm bases.
+
+NOTE FOR VMS USERS: The procedure for making the package from sources
+described below does not work on VMS, of course. You can, however,
+run the enclosed `support/doc2tex.com' procedure file contributed by
+R.Gaertner to create the .tex files from the .doc files.
+
+NOTE FOR OTHER NON-UN*X USERS: If you do not have a un*x system then
+you are best adviced to get the `ready to run' package and install it
+as described in `INSTALL'.
+
+UN*X GENERATION AND INSTALLATION STEPS:
+
+1. First make sure that you have a separate directory `src' which
+ contains all the files of the distribution (including this file).
+
+ The file `MANIFEST' contains a list of the files.
+
+2. Next you should edit the `Configuration section' of `Makefile' to fit
+ the configuration of your system by following the directions given
+ there.
+
+ When you have configured everything then just do
+
+ make
+
+ which should generate all the files needed to use the package.
+
+3. You can test the newly generated system by typesetting the User's
+ Guide which you probably want for reference anyway: do
+
+ make guide
+
+ which should produce a file `xyguide.dvi' by running LaTeX several
+ times and BibTeX once.
+
+4. If possible it is a good idea to try to preview the User's Guide (in
+ whatever way you do on your system) at this point. This is slightly
+ difficult because it uses the Xy-pic fonts which you haven't
+ installed yet, so the previewer should be instructed to look in the
+ current directory before looking in the system font directories. The
+ following show how to do this for the most common previewer (on un*x
+ systems with X windows) and might work for you:
+
+ env XDVIFONTS=.: xdvi xyguide.dvi
+
+5. You can then install the package by ensuring that the install
+ directories in `Makefile' are setup correctly and do
+
+ make install
+
+ This will replace exisiting `xypic.tex' and `xypic.sty' files with
+ the new (compatibility mode) ones; the old ones will remain available
+ with an `.orig' suffix (if you want to keep the old version then read
+ section 2 of `INSTALL').
+
+6. You can typeset the entire manual with
+
+ make manual
+
+ to create both files `xyguide.dvi' and `xyrefer.dvi'; they can be
+ installed in the TEXDOC directory with the command
+
+ make install.manual
+
+ NOTE: this requires a LARGE TeX system: the last typesetting (running
+ LaTeX on `xyrefer.man' without any driver) uses more than 600000 TeX
+ words, as noted above. Using Karl Berry's Web2C 7.0 this is
+ achieved by including the lines
+
+extra_mem_top = 400000 % extra high memory for chars, tokens, etc.
+extra_mem_bot = 400000 % extra low memory for boxes, glue, breakpoints, etc.
+
+ in the texmf.cnf file.
+
+7. You can build format files by the commands
+
+ make xytex.fmt
+ make xylatex.fmt
+
+ (the latter requires the new standard LaTeX release aka LaTeX2e).
+ These assume that the files `plain.tex' and `latex.ltx' are available
+ in the TeX search path; also you have to install the format files in
+ the appropriate place yourself.
+
+That is all.
+
+
+----------------------------------------------------------------------
+ -3- BUGS & COMMENTS
+----------------------------------------------------------------------
+
+I will appreciate reports on any problems you may encounter and
+opinions you have on how the usefulness of Xy-pic can be improved.
+Please report using either
+
+ Electronic mail (Internet): krisrose@brics.dk [preferred]
+
+ Paper mail: Kristoffer H. Rose
+ BRICS/Computer Science
+ University of Aarhus
+ Ny Munkegade, building 540
+ DK-8000 Aarhus C
+ DENMARK
+
+ Fax: +45 89423255 att. K.Rose / Karen Møller
+
+You can always get the latest news of Xy-pic from computers connected
+to the Internet by opening the Xy-pic World Wide Web page:
+
+ W3 <URL: http://www.brics.dk/~krisrose/Xy-pic.html>
+
+
+----------------------------------------------------------------------
+ -4- DISTRIBUTION LOG
+----------------------------------------------------------------------
+
+The following versions have been distributed publicly:
+
+$Log: MAKE,v $
+Revision 3.5 1997/05/28 22:40:26 krisrose
+Fixed missing breaks bug.
+
+Revision 3.3 1996/12/19 03:31:56 krisrose
+Maintenance release
+
+Revision 3.1 1995/09/05 20:31:32 kris
+Releasing!
+
+Revision 3.0 1995/07/07 20:14:21 kris
+Major release w/new User's Guide!
+
+Renamed to MAKE for version 3 source description.
+
+Revision 2.12 1994/10/25 11:34:25 kris
+Interim release just before v3 [works with AMS-LaTeX 1.2]...
+
+Revision 2.11 1994/07/05 10:37:32 kris
+Third 3beta release [bug fixes].
+Experimental graph feature included (for ECCT-94 presentation).
+
+Revision 2.10 1994/06/15 12:59:44 kris
+Second 3beta release [bug fixes].
+
+Revision 2.8 1994/04/11 09:31:09 kris
+Second (bug fix) 3alpha release [corrected].
+
+Revision 2.7 1994/03/08 02:06:01 kris
+Release 3alpha.
+
+MAJOR REWRITE of distribution to prepare for Xy-pic 3 functionality.
+Curve extension code contributed by Ross Moore <ross@mpce.mq.edu.au>;
+support funding from MURG, ARC, and equipment from DEC.
+
+Revision 2.6 1992/06/24 01:23:34 kris
+Added `hook' tips using new font xyqc10.
+Added new POSitions: * and !.
+Added triple lines \Ssolid, \Ddashed, \Ddotted, and companion \Ttip.
+Reorganised manual.
+
+Revision 2.5 1992/02/24 03:30:54 kris
+Fixed bugs in \Direction calculation logic...
+Added (FACTOR) to \rotate to allow arbitrary rotation.
+` intermediate points now accept an optional /RADIUS argument.
+Added \Tip with wide tip.
+
+Revision 2.4 1992/01/22 02:15:10 kris
+Fixed bugs [with thanks]:
+\\ works with AMS-LaTeX: don't use \Let@ [Werner Struckmann/Darrel Hankerson]
+No spurious arrow heads with LaTeX: \pit now undefined [Werner Struckmann]
+\Solid works: sets \Density [Dave Bowen]
+Short diagonal lines work...major rewrite of \connectv@ [Eric Domenjoud]
+
+Revision 2.3 1992/01/10 21:38:27 kris
+Several bugs fixed [with thanks]:
+The \ddtoX and \uutoX arrows were interchanged [Nico Verwer].
+Some diagonal lines were wrong [Eric Domenjoud].
+AMS-LaTeX users had name clash problems [Werner Struckmann].
+The installation instructions in the Makefile were buggy [Leen Torenvliet].
+
+Revision 2.2 1992/01/09 04:05:40 kris
+Patched to fix problem with \text and support AMS-LaTeX.
+
+Revision 2.1 1992/01/02 14:54:07 kris
+Release version.
+
+Revision 1.40 1991/12/17 04:53:23 kris
+Version distributed as `final draft' on Usenet.
+
+----------------------------------------------------------------------
+
+This is the end of the source overview. I hope you will enjoy Xy-pic!
+
+----------------------------------------------------------------------
+
+Kristoffer Høgsbro ROSE <krisrose@brics.dk>
+BRICS <URL: http://www.brics.dk/~krisrose/>
+Department of Computer Science B3.26, +45 89423193 (fax +45 89423255)
+University of Aarhus, Ny Munkegade, build. 540, 8000 Århus C, DENMARK
+
+----------------------------------------------------------------------
diff --git a/Master/texmf-dist/source/generic/xypic/MANIFEST b/Master/texmf-dist/source/generic/xypic/MANIFEST
new file mode 100644
index 00000000000..626876c6c12
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/MANIFEST
@@ -0,0 +1,111 @@
+-r--r--r-- 1 krisrose krisrose 2326 Feb 25 15:13 CATALOG.doc
+-r--r--r-- 1 krisrose krisrose 17982 Feb 25 15:13 COPYING
+-r--r--r-- 1 krisrose krisrose 14686 Feb 25 15:13 INSTALL
+-r--r--r-- 1 krisrose krisrose 22529 Feb 25 15:13 INSTALL.OzTeX
+-r--r--r-- 1 krisrose krisrose 17562 Feb 25 15:13 INSTALL.Textures
+-r--r--r-- 1 krisrose krisrose 9402 Feb 25 15:13 MAKE
+-rw-r--r-- 1 krisrose krisrose 53387 Feb 25 15:08 Makefile
+-r--r--r-- 1 krisrose krisrose 4025 Feb 25 15:13 README
+-r--r--r-- 1 krisrose krisrose 4176 Feb 25 15:13 TRAILER
+-r--r--r-- 1 krisrose krisrose 169792 Feb 25 15:13 YandY_xy_fonts.zip
+-r--r--r-- 1 krisrose krisrose 2806 Feb 25 15:13 doc2tex.com
+-r-xr-xr-x 1 krisrose krisrose 5096 Feb 25 15:13 dvitogif89a
+-r--r--r-- 1 krisrose krisrose 14392 Feb 25 15:13 import1.eps
+-r-xr-xr-x 1 krisrose krisrose 4825 Feb 25 15:13 install-tds
+-r--r--r-- 1 krisrose krisrose 26875 Feb 25 15:13 kris.eps
+-r--r--r-- 1 krisrose krisrose 8893 Feb 25 15:13 latin1.sty
+-r--r--r-- 1 krisrose krisrose 10562 Feb 25 15:10 movie.cls
+-r--r--r-- 1 krisrose krisrose 4888 Feb 25 15:13 pnmrawtopcropwhite.c
+-r--r--r-- 1 krisrose krisrose 21322 Feb 25 15:13 ross.eps
+-r--r--r-- 1 krisrose krisrose 292869 Feb 25 15:09 xy.doc
+-r--r--r-- 1 krisrose krisrose 3709 Feb 25 15:10 xy.sty
+-r--r--r-- 1 krisrose krisrose 9574 Feb 25 15:10 xy16textures.doc
+-r--r--r-- 1 krisrose krisrose 10061 Feb 25 15:10 xy17oztex.doc
+-r--r--r-- 1 krisrose krisrose 62605 Feb 25 15:10 xy2cell.doc
+-r--r--r-- 1 krisrose krisrose 3008 Feb 25 15:09 xyall.doc
+-r--r--r-- 1 krisrose krisrose 56008 Feb 25 15:10 xyarc.doc
+-r--r--r-- 1 krisrose krisrose 58648 Feb 25 15:10 xyarrow.doc
+-r--r--r-- 1 krisrose krisrose 2434 Feb 25 15:10 xyatip.mf
+-r--r--r-- 1 krisrose krisrose 1801 Feb 25 15:10 xyatip10.mf
+-r--r--r-- 1 krisrose krisrose 2904 Feb 25 15:10 xybsql10.mf
+-r--r--r-- 1 krisrose krisrose 2435 Feb 25 15:10 xybtip.mf
+-r--r--r-- 1 krisrose krisrose 1793 Feb 25 15:10 xybtip10.mf
+-r--r--r-- 1 krisrose krisrose 5358 Feb 25 15:10 xycirc10.mf
+-r--r--r-- 1 krisrose krisrose 1682 Feb 25 15:10 xycm.mf
+-r--r--r-- 1 krisrose krisrose 2304 Feb 25 15:10 xycmactex.doc
+-r--r--r-- 1 krisrose krisrose 1850 Feb 25 15:10 xycmat10.mf
+-r--r--r-- 1 krisrose krisrose 1477 Feb 25 15:10 xycmat11.mf
+-r--r--r-- 1 krisrose krisrose 1477 Feb 25 15:10 xycmat12.mf
+-r--r--r-- 1 krisrose krisrose 1850 Feb 25 15:10 xycmbt10.mf
+-r--r--r-- 1 krisrose krisrose 1479 Feb 25 15:10 xycmbt11.mf
+-r--r--r-- 1 krisrose krisrose 1479 Feb 25 15:10 xycmbt12.mf
+-r--r--r-- 1 krisrose krisrose 2972 Feb 25 15:09 xycmtip.doc
+-r--r--r-- 1 krisrose krisrose 12778 Feb 25 15:09 xycolor.doc
+-r--r--r-- 1 krisrose krisrose 2836 Feb 25 15:09 xycrayon.doc
+-r--r--r-- 1 krisrose krisrose 178076 Feb 25 15:09 xycurve.doc
+-r--r--r-- 1 krisrose krisrose 2743 Feb 25 15:10 xyd.mf
+-r--r--r-- 1 krisrose krisrose 2740 Feb 25 15:10 xyd2.mf
+-r--r--r-- 1 krisrose krisrose 2768 Feb 25 15:10 xydash10.mf
+-rw-r--r-- 1 krisrose krisrose 0 Feb 25 15:09 xydoc.back
+-r--r--r-- 1 krisrose krisrose 21077 Feb 25 15:13 xydoc.bib
+-r--r--r-- 1 krisrose krisrose 43418 Feb 25 15:13 xydoc.sty
+-r--r--r-- 1 krisrose krisrose 1281 Feb 25 15:13 xydocps.doc
+-r--r--r-- 1 krisrose krisrose 3133 Feb 25 15:09 xydummy.doc
+-r--r--r-- 1 krisrose krisrose 3041 Feb 25 15:10 xydvidrv.doc
+-r--r--r-- 1 krisrose krisrose 10394 Feb 25 15:10 xydvips.doc
+-r--r--r-- 1 krisrose krisrose 11156 Feb 25 15:10 xydvitops.doc
+-r--r--r-- 1 krisrose krisrose 8253 Feb 25 15:10 xyemtex.doc
+-r--r--r-- 1 krisrose krisrose 1465 Feb 25 15:10 xyeuat10.mf
+-r--r--r-- 1 krisrose krisrose 1470 Feb 25 15:10 xyeuat11.mf
+-r--r--r-- 1 krisrose krisrose 1470 Feb 25 15:10 xyeuat12.mf
+-r--r--r-- 1 krisrose krisrose 1470 Feb 25 15:10 xyeubt10.mf
+-r--r--r-- 1 krisrose krisrose 1470 Feb 25 15:10 xyeubt11.mf
+-r--r--r-- 1 krisrose krisrose 1470 Feb 25 15:10 xyeubt12.mf
+-r--r--r-- 1 krisrose krisrose 1674 Feb 25 15:10 xyeuler.mf
+-r--r--r-- 1 krisrose krisrose 42901 Feb 25 15:09 xyframe.doc
+-r--r--r-- 1 krisrose krisrose 23221 Feb 25 15:10 xygraph.doc
+-r--r--r-- 1 krisrose krisrose 65306 Feb 25 15:13 xyguide.man
+-r--r--r-- 1 krisrose krisrose 9165 Feb 25 15:09 xyidioms.doc
+-r--r--r-- 1 krisrose krisrose 9502 Feb 25 15:09 xyimport.doc
+-r--r--r-- 1 krisrose krisrose 70065 Feb 25 15:10 xyknot.doc
+-r--r--r-- 1 krisrose krisrose 2452 Feb 25 15:10 xylatex.ini
+-r--r--r-- 1 krisrose krisrose 23785 Feb 25 15:09 xyline.doc
+-r--r--r-- 1 krisrose krisrose 3752 Feb 25 15:12 xyline10.mf
+-r--r--r-- 1 krisrose krisrose 3559 Feb 25 15:09 xymacpat.xyp
+-r--r--r-- 1 krisrose krisrose 44438 Feb 25 15:09 xymatrix.doc
+-r--r--r-- 1 krisrose krisrose 4622 Feb 25 15:12 xymisc10.mf
+-r--r--r-- 1 krisrose krisrose 5035 Feb 25 15:10 xymovie.doc
+-rw-r--r-- 1 krisrose krisrose 18839 Oct 12 17:38 xynecula.doc
+-r--r--r-- 1 krisrose krisrose 10495 Feb 25 15:10 xyoztex.doc
+-r--r--r-- 1 krisrose krisrose 2438 Feb 25 15:10 xypic.doc
+-rw-r--r-- 1 krisrose krisrose 2563 Feb 25 15:06 xypic.map
+-r--r--r-- 1 krisrose krisrose 857 Feb 25 15:10 xypic.sty
+-r--r--r-- 1 krisrose krisrose 47974 Feb 25 15:10 xypoly.doc
+-r--r--r-- 1 krisrose krisrose 6929 Feb 25 15:09 xyps-c.doc
+-r--r--r-- 1 krisrose krisrose 6703 Feb 25 15:09 xyps-col.doc
+-r--r--r-- 1 krisrose krisrose 8910 Feb 25 15:09 xyps-f.doc
+-r--r--r-- 1 krisrose krisrose 6742 Feb 25 15:09 xyps-l.doc
+-r--r--r-- 1 krisrose krisrose 9744 Feb 25 15:09 xyps-pro.doc
+-r--r--r-- 1 krisrose krisrose 26581 Feb 25 15:09 xyps-ps.doc
+-r--r--r-- 1 krisrose krisrose 7876 Feb 25 15:09 xyps-r.doc
+-r--r--r-- 1 krisrose krisrose 4732 Feb 25 15:09 xyps-s.doc
+-r--r--r-- 1 krisrose krisrose 6112 Feb 25 15:09 xyps-t.doc
+-r--r--r-- 1 krisrose krisrose 43988 Feb 25 15:09 xyps.doc
+-r--r--r-- 1 krisrose krisrose 13267 Feb 25 15:09 xypsdict.doc
+-r--r--r-- 1 krisrose krisrose 6312 Feb 25 15:09 xypspatt.doc
+-r--r--r-- 1 krisrose krisrose 2866 Feb 25 15:12 xyqc10.mf
+-r--r--r-- 1 krisrose krisrose 3046 Feb 25 15:09 xyrecat.doc
+-r--r--r-- 1 krisrose krisrose 15324 Feb 25 15:13 xyrefer.man
+-r--r--r-- 1 krisrose krisrose 19231 Feb 25 15:09 xyrotate.doc
+-rw-r--r-- 1 krisrose krisrose 20780 Oct 12 16:54 xysmart.doc
+-r--r--r-- 1 krisrose krisrose 1668 Feb 25 15:10 xytech.mf
+-r--r--r-- 1 krisrose krisrose 1220 Feb 25 15:10 xytest.mf
+-r--r--r-- 1 krisrose krisrose 1838 Feb 25 15:10 xytex.ini
+-r--r--r-- 1 krisrose krisrose 9614 Feb 25 15:10 xytextures.doc
+-r--r--r-- 1 krisrose krisrose 17252 Feb 25 15:09 xytile.doc
+-r--r--r-- 1 krisrose krisrose 7651 Feb 25 15:09 xytips.doc
+-r--r--r-- 1 krisrose krisrose 10614 Feb 25 15:09 xytp-f.doc
+-r--r--r-- 1 krisrose krisrose 17502 Feb 25 15:09 xytpic.doc
+-r--r--r-- 1 krisrose krisrose 28845 Feb 25 15:10 xyv2.doc
+-r--r--r-- 1 krisrose krisrose 11373 Feb 25 15:10 xyweb.doc
+-r--r--r-- 1 krisrose krisrose 10940 Feb 25 15:10 xyxdvi.doc
diff --git a/Master/texmf-dist/source/generic/xypic/Makefile b/Master/texmf-dist/source/generic/xypic/Makefile
new file mode 100644
index 00000000000..b68afabda99
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/Makefile
@@ -0,0 +1,1528 @@
+# $Id: Makefile,v 3.7 1999/02/16 15:12:50 krisrose Exp krisrose $
+#
+# Un*x Makefile for Xy-pic macros, fonts, documentation, and distribution.
+# Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+#
+# This file is part of the Xy-pic macro package.
+# Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+# See the README and INSTALL files for further information.
+#
+# The Xy-pic package is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The Xy-pic package is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this package; if not, write to the Free Software Foundation, Inc.,
+# 675 Mass Ave, Cambridge, MA 02139, USA.
+
+VERSION = 3.7
+SHORTVERSION = 37
+
+# CONTENTS:
+#
+# Configuration section:
+# Directories.
+# Fonts.
+# Programs.
+#
+# Generic targets.
+# Macros.
+# PostScript headers.
+# Fonts.
+# Formats.
+# Manual: User's guide and reference manual.
+# Reference manual.
+# TeXnical documentation.
+# Distribution tree.
+# Ftp'able distribution.
+# WWW publicity.
+# Announcements.
+# Tags.
+# RCS stuff.
+# Development targets.
+#
+# Log.
+
+
+#### CONFIGURATION SECTION ##################################################
+
+# Please configure as instructed below for each of the DIRECTORIES, FONTS,
+# and PROGRAMS parts by editing the definitions to fit your system.
+
+#### DIRECTORIES.
+#
+# The following variables define the directories where the various parts of
+# Xy-pic should be installed.
+#
+# You should *EITHER* set TDSROOT to the root of a TDS-compliant directory
+# tree, usually named .../texmf (if you have a TDS [TeX Directory Structure]
+# compliant system then that is in fact all you need to do):
+#
+USR = /usr/local
+TDSROOT = $(USR)/share/texmf
+#
+# *OR* you should set each of the following variables right for you system
+# (do this if your setup does not match TDS exactly):
+#
+TEXINPUTDIR = $(TDSROOT)/tex/generic/xypic
+TEXFONTDIR = $(TDSROOT)/fonts/tfm/public/xypic
+TEXDOCDIR = $(TDSROOT)/doc/generic/xypic
+MFINPUTDIR = $(TDSROOT)/fonts/source/public/xypic
+TYPE1DIR = $(TDSROOT)/fonts/type1/public/xypic
+PFMDIR = $(TDSROOT)/fonts/pfm/public/xypic
+AFMDIR = $(TDSROOT)/fonts/afm/public/xypic
+PDFDIR = $(TDSROOT)/pdftex/xypic
+PSHEADERDIR = $(TDSROOT)/dvips/xypic
+#
+# FONTDIR is the directory where bitmap fonts are stored and is special
+# (If you do not plan to install bitmap fonts because they are automatically
+# generated and remember to set the MAGS variable below to `.' then you may
+# ignore this step.)
+#
+# Since the location of individual fonts sometimes depend on properties of
+# the font, you can insert
+#
+# $${dpi} for the font resolution in `Dots Per Inch' (NOT the
+# device resolution---that should be inserted directly)
+#
+# $${mode} for the METAFONT `mode' used to generate the font
+#
+# ---what these get set to depends on the next section.
+#
+# For example, if you set FONTDIR=/usr/lib/tex/pk$${dpi} and decide in the
+# next section to generate PK fonts at 300 dpi using a generic mode
+# (localfont) then you get files named /usr/lib/tex/pk300/xy*.300pk.
+#
+# If your installation still uses the (inefficient) principle of having all
+# PK files in the same directory as the TFM files then you should just set
+# FONTDIR=$(TEXFONTDIR).
+#
+FONTDIR = $(TDSROOT)/fonts/pk/$${mode}/public/xypic/dpi$${dpi}
+
+#### FONTS.
+#
+# The METAFONT program needs to know the `mode' of your printer in order to
+# be able to generate correct fonts for it. On most installations the mode
+# `localfont' is made synonymous with the mode required for the default
+# printer; in that case you can just pick the `MODES = localfont' line. If
+# this is not the case -- or you need fonts for several output devices---then
+# you will have to consult the local METAFONT guide/guru to inquire what
+# modes are used at your site. A good place to look for the modes used is in
+# the MakeTeXPK script found on some sites.
+#
+# Set MODES to the list of printers you wish to use:
+#
+MODES = localfont
+#MODES = cx ljfour
+#
+# You should also decide which TeX \magsteps you wish the font to be
+# generated at.
+#
+# The default is . (dot) which prevents installation of any bitmaps because
+# most modern installations generate them automatically.
+#
+MAGS = .
+#MAGS = 0
+#MAGS = 0 0.5 1 2
+
+#### PROGRAMS.
+#
+# You don't have to edit the following lines unless you have a non-standard
+# un*x system or un*x TeX installation...
+#
+SHELL = /bin/sh
+#
+TEX = TEXFONTS=.:$(TEXFONTDIR):$$TEXFONTS tex
+LATEX = TEXFONTS=.:$(TEXFONTDIR):$$TEXFONTS latex
+PDFLATEX = TEXFONTS=.:$(TEXFONTDIR):$$TEXFONTS pdflatex
+BIBTEX = BIBINPUTS=. bibtex
+MAKEINDEX = makeindex
+INITEX = TEXFONTS=.:$(TEXFONTDIR):$$TEXFONTS initex
+#
+# Set MF to a command that will run plain METAFONT on your system.
+#
+MF = MFINPUTS=.:$(MFINPUTDIR):$$MFINPUTS mf
+#
+# Set GFTOPK to the command "false" and PK to "gf" if you use GF rather than PK
+# bitmap font files. There is no support for PXL-files [are they still used?].
+# (Note: the default setting of MAGS above doesn't use bitmaps at all.)
+#
+GFTOPK = gftopk
+PK=pk
+#
+#GFTOPK = false
+#PK=gf
+#
+RM = rm -fr
+CP = cp -f
+MV = mv -f
+#
+# Set the INSTALLs to cp -f if your system does not have the install command.
+#
+INSTALL = install -c -m 444
+INSTALLW = install -c -m 644
+INSTALLX = install -c -m 555
+#INSTALL = cp -f
+#INSTALLW = cp -f
+#INSTALLX = cp -f
+#
+# Set MKDIR to a mkdir command that creates intermediate directories.
+#
+MKDIR = mkdir -p -m 755
+#
+# DOC2TEX <file>: output efficient .tex file from inefficient .doc <file> with
+# inlined documentation [my favourite hack :-]. Removes all DOCMODE lines,
+# leaving only things before the first and in DOCMODE(...DOCMODE) brackets;
+# also removes all blank lines and comment lines.
+#
+# If it breaks your sed you can just set DOC2TEX to cat although that will
+# make the installed macro files three times larger and the reading of them
+# somewhat slower...so in that case you are probably better of getting the
+# `run' distribution where this has already been done for you!
+#
+DOC2TEX = sed \
+ -e '/^.DOCMODE(/b Yes' \
+ -e '/^.DOCMODE/b No' \
+ -e 'x' \
+ -e '/%%DONTCOPY%%/b Ignore' \
+ -e 'x' \
+ -e 's/[ ][ ]*/ /g' \
+ -e 's/{%.*$$/{%/' -e 's/}%.*$$/}%/' -e 's/ %.*$$//' \
+ -e '/^ *%$$/d' -e '/^ *$$/d' -e '/^ *%[^%]/d' \
+ -e 's/^%% \$$Id/%% $@ from $$Id/' \
+ -e 's/REPLACEWITHVERSION/$(VERSION)/' \
+ -e 's/REPLACEWITHSHORTVERSION/$(SHORTVERSION)/' \
+ -e 'b End' \
+ -e ': No' -e 's/.*/%%DONTCOPY%%/' -e 'x' -e 'd' \
+ -e ': Yes' -e 's/.*//' -e 'x' -e 'd' \
+ -e ': Ignore' -e 'x' -e 'd' \
+ -e ': End'
+#
+# MF2TFM script: make .tfm file and all requested bitmap files from .mf
+# file by executing METAFONT with $${mode} and $${dpi} as described above.
+#
+# NOTE: for use as implicit make rule; do not modify unless you are sure you
+# need to!
+#
+MF2TFM = set -x; for mode in $(MODES); do \
+ if [ "$(MAGS)" = "." ]; then \
+ $(MF) "\\mode=$$mode; input $<";\
+ $(RM) $*.*gf;\
+ else \
+ for mag in $(MAGS); do \
+ $(MF) "\\mode=$$mode; mag=magstep($$mag); input $<"; done;\
+ for f in $*.*gf; do if test -f "$$f"; then \
+ if $(GFTOPK) ./$$f; then $(RM) $$f; fi; else :; fi; done;\
+ fi; done
+
+#### END OF CONFIGURATION SECTION ###########################################
+
+
+# GENERIC TARGETS.
+#
+all: macros fonts obsoletefonts
+.PHONY: all install clean realclean sterile world
+#
+install: all install.macros install.trailer \
+ install.fonts install.obsoletefonts \
+ install.ps install.psfonts
+#
+clean:
+ $(RM) *.aux *.toc *.lof *.blg *.log *.idx *.ilg *.fmt \
+ *.ps *.ppm *.nops *.tmp *.ans *.xyc *.xyd \
+ ./#* *~ core *.BAK *JNL xytest.*gf out
+#
+realclean: clean
+ $(RM) MANIFEST VERSIONS CATALOG
+ $(RM) xydoc.back; touch xydoc.back
+ $(RM) *.bbl *.glo *.ind \
+ *.tfm *.*gf *.*pk *.tex *.dvips *.dvi *.pdf *.last *.pro \
+ *.gif *.epsf *.size *.pbm *.ppm \
+ *.afm *.pfm *.pfb *.asc
+ $(RM) xyguide-html index*
+ $(RM) pnmrawtopcropwhite
+#
+sterile: realclean rcsclean
+ $(RM) xydoc.back make.* TAGS
+ $(MAKE) Makefile xydoc.sty xydoc.bib
+#
+world: realclean rcsclean
+ time $(MAKE) all ftp ftpdoc www 2>&1 |tee make.world
+
+
+# MACROS.
+#
+TRAILERSOURCES = TRAILER COPYING CATALOG.doc \
+ MAKE README Makefile $(INSTALLSTAR)
+
+INSTALLSTAR = INSTALL INSTALL.OzTeX INSTALL.Textures
+
+KERNELSOURCES = xy.doc xyidioms.doc xyrecat.doc
+
+OPTIONSOURCES = \
+ xyframe.doc xycmtip.doc xytips.doc xycurve.doc \
+ xyline.doc xyrotate.doc xycolor.doc xycrayon.doc xytile.doc \
+ xyimport.doc xytpic.doc xytp-f.doc \
+ xyps.doc xyps-ps.doc xyps-pro.doc xyps-col.doc xyps-c.doc xyps-f.doc \
+ xyps-l.doc xyps-r.doc xyps-s.doc xyps-t.doc \
+ xypsdict.doc xypspatt.doc xydocps.doc \
+ xydummy.doc xyall.doc xymatrix.doc xyarrow.doc xygraph.doc \
+ xy2cell.doc xypoly.doc xyarc.doc xyknot.doc xyweb.doc \
+ xydvips.doc xytextures.doc xy16textures.doc xyoztex.doc xy17oztex.doc \
+ xycmactex.doc xydvitops.doc xyemtex.doc xydvidrv.doc xyxdvi.doc \
+ xymovie.doc xyv2.doc xypic.doc \
+ xynecula.doc xysmart.doc
+
+FORMATSOURCES = xytex.ini xylatex.ini
+
+LATEXSTYLES = xy.sty xypic.sty movie.cls
+OPTIONDATA = xymacpat.xyp
+
+MACROSOURCES = $(TRAILERSOURCES) $(KERNELSOURCES) $(LATEXSTYLES) \
+ $(OPTIONSOURCES) $(OPTIONDATA) $(FORMATSOURCES)
+
+TRAILERRUN = TRAILER COPYING CATALOG README \
+ $(INSTALLSTAR) VERSIONS
+
+KERNELRUN = xy.tex xyidioms.tex xyrecat.tex
+
+OPTIONRUN = \
+ xyframe.tex xycmtip.tex xytips.tex xycurve.tex \
+ xyline.tex xyrotate.tex xycolor.tex xycrayon.tex xytile.tex \
+ xyimport.tex xytpic.tex xytp-f.tex \
+ xyps.tex xyps-ps.tex xyps-pro.tex xyps-col.tex xyps-c.tex xyps-f.tex \
+ xyps-l.tex xyps-r.tex xyps-s.tex xyps-t.tex \
+ xypsdict.tex xypspatt.tex $(OPTIONDATA) \
+ xydummy.tex xyall.tex xymatrix.tex xyarrow.tex xygraph.tex \
+ xy2cell.tex xypoly.tex xyarc.tex xyknot.tex xyweb.tex \
+ xydvips.tex xytextures.tex xy16textures.tex xyoztex.tex xy17oztex.tex \
+ xycmactex.tex xydvitops.tex xyemtex.tex xydvidrv.tex xyxdvi.tex \
+ xymovie.tex xyv2.tex xypic.tex \
+ xynecula.tex xysmart.tex
+
+MACRORUN = $(KERNELRUN) $(OPTIONRUN) $(FORMATSOURCES) \
+ $(LATEXSTYLES)
+PSRUN = xy$(SHORTVERSION)dict.pro
+
+SUPPORT = install-tds doc2tex.com \
+ dvitogif89a pnmrawtopcropwhite.c
+
+# Macros have .tex suffix and are generated from the .doc files.
+#
+.SUFFIXES: .tex .doc
+.doc.tex:; $(DOC2TEX) $< > $@
+#
+.PHONY: macros install.macros
+#
+macros: $(MACRORUN)
+install.macros: $(MACRORUN)
+ -test -d $(TEXINPUTDIR) || $(MKDIR) $(TEXINPUTDIR)
+ for f in $(MACRORUN); do $(INSTALL) $$f $(TEXINPUTDIR)/$$f; done
+#
+# Kernel dependencies:
+#
+xy.tex: xy.doc
+xyidioms.tex: xyidioms.doc
+xyrecat.tex: xyrecat.doc
+#
+# Extension option dependencies:
+#
+xyframe.tex: xyframe.doc
+xytips.tex: xytips.doc
+xycmtip.tex: xycmtip.doc
+xycurve.tex: xycurve.doc
+xyline.tex: xyline.doc
+xyrotate.tex: xyrotate.doc
+xycolor.tex: xycolor.doc
+xycrayon.tex: xycrayon.doc
+xyimport.tex: xyimport.doc
+xytile.tex: xytile.doc
+#
+xytpic.tex: xytpic.doc
+xytp-f.tex: xytp-f.doc
+#
+xyemtex.tex: xyemtex.doc
+#
+xyps.tex: xyps.doc
+xyps-ps.tex: xyps-ps.doc
+xyps-pro.tex: xyps-pro.doc
+xyps-col.tex: xyps-col.doc
+xyps-c.tex: xyps-c.doc
+xyps-f.tex: xyps-f.doc
+xyps-l.tex: xyps-l.doc
+xyps-r.tex: xyps-r.doc
+xyps-s.tex: xyps-s.doc
+xyps-t.tex: xyps-t.doc
+xypsdict.tex: xypsdict.doc
+xypspatt.tex: xypspatt.doc
+#
+# Feature option dependencies:
+#
+xydummy.tex: xydummy.doc
+xyall.tex: xyall.doc
+#
+xymatrix.tex: xymatrix.doc
+xyarrow.tex: xyarrow.doc
+xygraph.tex: xygraph.doc
+xy2cell.tex: xy2cell.doc
+xypoly.tex: xypoly.doc
+xyarc.tex: xyarc.doc
+xyknot.tex: xyknot.doc
+xyweb.tex: xyweb.doc
+#
+# Driver option dependencies:
+#
+xycmactex.tex: xycmactex.doc
+xydvips.tex: xydvips.doc
+xydvitops.tex: xydvitops.doc
+xydvidrv.tex: xydvidrv.doc
+xydocps.tex: xydocps.doc
+xytextures.tex: xytextures.doc
+xy16textures.tex: xy16textures.doc
+xyoztex.tex: xyoztex.doc
+xymovie.tex: xymovie.doc
+xy17oztex.tex: xy17oztex.doc
+xyxdvi.tex: xyxdvi.doc
+#
+# Backwards compatibility dependencies:
+#
+xyv2.tex: xyv2.doc
+xypic.tex: xypic.doc
+#
+# Required documentation files
+#
+install.trailer: $(TRAILERRUN)
+ -test -d $(TEXDOCDIR) || $(MKDIR) $(TEXDOCDIR)
+ for f in $(TRAILERRUN); do $(INSTALL) $$f $(TEXDOCDIR)/$$f; done
+
+
+# PostScript HEADERS:
+#
+.PHONY: install.ps
+install.ps: $(PSRUN)
+ test -d $(PSHEADERDIR) || $(MKDIR) $(PSHEADERDIR)
+ for f in $(PSRUN); do $(INSTALL) $$f $(PSHEADERDIR)/$$f; done
+
+
+# FONTS.
+#
+.PHONY: mfinputs texfonts $(PK)fonts fonts install.fonts \
+ psfonts install.psfonts obsoletefonts install.obsoletefonts
+#
+METAFONTS = \
+ xydash10.mf xybsql10.mf xyd2.mf \
+ xyatip10.mf xybtip10.mf xytech.mf xyatip.mf xybtip.mf xyd.mf \
+ xycirc10.mf \
+ xycmat10.mf xycmbt10.mf xycmat11.mf xycmbt11.mf \
+ xycmat12.mf xycmbt12.mf xycm.mf \
+ xyeuat10.mf xyeubt10.mf xyeuat11.mf xyeubt11.mf \
+ xyeuat12.mf xyeubt12.mf xyeuler.mf
+#
+TEXFONTRUN = \
+ xydash10.tfm xybsql10.tfm xyatip10.tfm xybtip10.tfm xycirc10.tfm \
+ xycmat10.tfm xycmbt10.tfm xycmat11.tfm xycmbt11.tfm \
+ xycmat12.tfm xycmbt12.tfm \
+ xyeuat10.tfm xyeubt10.tfm xyeuat11.tfm xyeubt11.tfm \
+ xyeuat12.tfm xyeubt12.tfm
+#
+# Note: we only depend on the tfm-files, so you must remove them to
+# regenerate the fonts at all desired magnifications.
+#
+.SUFFIXES: .mf .tfm
+.mf.tfm:; $(MF2TFM)
+#
+mfinputs: $(METAFONTS)
+#
+texfonts $(PK)fonts fonts: $(METAFONTS) $(TEXFONTRUN)
+install.fonts: fonts
+ if test -n "$(MFINPUTDIR)"; then \
+ test -d $(MFINPUTDIR) || $(MKDIR) $(MFINPUTDIR); \
+ for f in $(METAFONTS);do $(INSTALL) $$f $(MFINPUTDIR)/$$f;done; fi
+ -test -d $(TEXFONTDIR) || $(MKDIR) $(TEXFONTDIR)
+ for f in $(TEXFONTRUN); do $(INSTALL) $$f $(TEXFONTDIR)/$$f; done
+ #
+ [ "$(MAGS)" = "." ] || \
+ for mode in $(MODES); do for mag in $(MAGS); do \
+ $(RM) xytest.*gf xytest.*tfm;\
+ $(MF) "\\mode=$$mode; mag=magstep($$mag); input xytest";\
+ dpi="`expr xytest.*gf : 'xytest\.\([0-9]*\)gf'`";\
+ for f in $(TEXFONTRUN); do \
+ f="`expr $$f : '\([a-z0-9]*\)\.tfm'`.$${dpi}$(PK)" ;\
+ if [ ! -f $$f ]; then echo "ERROR: FONT $$f NOT GENERATED";\
+ else test -d "$(FONTDIR)" || $(MKDIR) $(FONTDIR);\
+ $(INSTALL) $$f $(FONTDIR)/$$f; fi; done; done; done
+#
+xydash10.tfm: xydash10.mf xyd2.mf xytest.mf
+xybsql10.tfm: xybsql10.mf xyd.mf xytest.mf
+xycirc10.tfm: xycirc10.mf xytest.mf
+xyatip10.tfm: xyatip10.mf xytech.mf xyatip.mf xyd.mf xytest.mf
+xybtip10.tfm: xybtip10.mf xytech.mf xybtip.mf xyd.mf xytest.mf
+xycmat10.tfm: xycmat10.mf xyatip.mf xyd.mf xytest.mf
+xycmbt10.tfm: xycmbt10.mf xybtip.mf xyd.mf xytest.mf
+xyeuat10.tfm: xyeuat10.mf xyatip.mf xyd.mf xytest.mf
+xyeubt10.tfm: xyeubt10.mf xybtip.mf xyd.mf xytest.mf
+#
+# Obsolete fonts (from 2.6 and before).
+#
+OBSOLETEMETAFONTS = xyline10.mf xyqc10.mf xymisc10.mf
+OBSOLETETEXFONTRUN = xyline10.tfm xyqc10.tfm xymisc10.tfm
+#
+obsoletefonts: $(OBSOLETEMETAFONTS) $(OBSOLETETEXFONTRUN)
+#
+install.obsoletefonts: obsoletefonts
+ if test -n "$(MFINPUTDIR)"; then \
+ test -d $(MFINPUTDIR) || $(MKDIR) $(MFINPUTDIR); \
+ for f in $(OBSOLETEMETAFONTS);do $(INSTALL) $$f $(MFINPUTDIR)/$$f;done; fi
+ -test -d $(TEXFONTDIR) || $(MKDIR) $(TEXFONTDIR)
+ for f in $(OBSOLETETEXFONTRUN); do \
+ $(INSTALL) $$f $(TEXFONTDIR)/$$f; done
+ #
+ [ "$(MAGS)" = "." ] || \
+ for mode in $(MODES); do for mag in $(MAGS); do \
+ $(RM) xytest.*gf xytest.*tfm;\
+ $(MF) "\\mode=$$mode; mag=magstep($$mag); input xytest";\
+ dpi="`expr xytest.*gf : 'xytest\.\([0-9]*\)gf'`";\
+ for f in $(OBSOLETETEXFONTRUN); do \
+ f="`expr $$f : '\([a-z0-9]*\)\.tfm'`.$${dpi}$(PK)" ;\
+ if [ ! -f $$f ]; then echo "ERROR: FONT $$f NOT GENERATED";\
+ else test -d "$(FONTDIR)" || $(MKDIR) $(FONTDIR);\
+ $(INSTALL) $$f $(FONTDIR)/$$f; fi; done; done; done
+#
+xyline10.tfm: xyline10.mf xytest.mf
+xyqc10.tfm: xyqc10.mf xytest.mf
+xymisc10.tfm: xymisc10.mf xytest.mf
+
+# PostScript fonts w/support files...from Y&Y.
+#
+TYPE1FONTS = \
+ xyatip10.pfb xybsql10.pfb xybtip10.pfb xycirc10.pfb xydash10.pfb \
+ xycmat10.pfb xycmbt10.pfb xyeuat10.pfb xyeubt10.pfb
+#
+PFMFONTS = \
+ xyatip10.pfm xybsql10.pfm xybtip10.pfm xycirc10.pfm xydash10.pfm \
+ xycmat10.pfm xycmbt10.pfm xyeuat10.pfm xyeubt10.pfm
+#
+AFMFONTS = \
+ xyatip10.afm xybsql10.afm xybtip10.afm xycirc10.afm xydash10.afm \
+ xycmat10.afm xycmbt10.afm xyeuat10.afm xyeubt10.afm
+#
+YANDYFONTS = $(TYPE1FONTS) $(AFMFONTS) $(PFMFONTS)
+#
+psfonts: $(YANDYFONTS)
+#
+$(YANDYFONTS): YandY_xy_fonts.zip
+ unzip -aoL YandY_xy_fonts.zip
+ touch $(YANDYFONTS)
+#
+install.psfonts: psfonts xypic.map
+ test -d $(TYPE1DIR) || $(MKDIR) $(TYPE1DIR)
+ test -d $(PFMDIR) || $(MKDIR) $(PFMDIR)
+ test -d $(AFMDIR) || $(MKDIR) $(AFMDIR)
+ test -d $(PDFDIR) || $(MKDIR) $(PDFDIR)
+ for f in $(TYPE1FONTS); do $(INSTALL) $$f $(TYPE1DIR)/$$f; done
+ for f in $(PFMFONTS); do $(INSTALL) $$f $(PFMDIR)/$$f; done
+ for f in $(AFMFONTS); do $(INSTALL) $$f $(AFMDIR)/$$f; done
+ test -d $(PSHEADERDIR) || $(MKDIR) $(PSHEADERDIR)
+ $(INSTALL) xypic.map $(PSHEADERDIR)/xypic.map
+#
+# All together...
+#
+FONTSOURCES = $(METAFONTS) $(OBSOLETEMETAFONTS) xytest.mf \
+ YandY_xy_fonts.zip xypic.map
+
+# FORMATS:
+#
+# Build formats...
+#
+.SUFFIXES: .ini .fmt
+.ini.fmt:; $(INITEX) $<
+#
+xytex.fmt: xytex.ini macros
+xylatex.fmt: xylatex.ini macros
+#xyamslatex.fmt: xyamslatex.ini macros
+#xydoc.fmt: xydoc.ini macros
+
+
+# MANUAL: USER'S GUIDE AND REFERENCE MANUAL.
+#
+# Note: the first generations use the DVIPS backend to run faster.
+#
+.PHONY: guide manual install.manual manual.ps
+#
+MANUALDATA = ross.eps kris.eps import1.eps
+MANUALSOURCES = \
+ xyguide.man xydoc.sty latin1.sty xydoc.bib xydoc.back \
+ xyrefer.man $(KERNELSOURCES) $(LATEXSTYLES) $(OPTIONSOURCES) \
+ $(OPTIONDATA) $(MANUALDATA)
+#
+MANUALRUN = xyguide.dvi xyrefer.dvi
+#
+.SUFFIXES: .man .dvips .dvi .pdf
+.man.dvips:
+ $(MAKE) macros fonts
+ echo "\\xyoption{dvips}\xyoption{ps}" > xydoc.back
+ $(LATEX) $<
+ @-$(CP) $<.dvi $*.dvi ; $(CP) $<.aux $*.aux ; $(CP) $<.idx $*.idx
+ $(BIBTEX) $*
+ @-$(CP) $*.bbl $<.bbl
+ [ -f $*.idx ] && $(MAKEINDEX) $* || :
+ @-$(CP) $*.ind $<.ind
+ echo "\\xyoption{dvips}\xyoption{ps}" > xydoc.back
+ $(LATEX) $<
+ @-$(CP) $<.dvi $*.dvi ; $(CP) $<.aux $*.aux ; $(CP) $<.idx $*.idx
+ [ -f $*.idx ] && makeindex $* || :
+ @-$(CP) $*.ind $<.ind
+ echo "\\xyoption{dvips}\xyoption{ps}" > xydoc.back
+ $(LATEX) $<
+ @-$(CP) $<.dvi $*.dvi ; $(CP) $<.aux $*.aux ; $(CP) $<.idx $*.idx
+ mv $*.dvi $*.dvips
+ touch $*.dvips
+#
+.dvips.dvi:
+ echo '' > xydoc.back
+ $(LATEX) $*.man
+ @-$(CP) $*.man.dvi $*.dvi ; $(CP) $*.man.aux $*.aux ; $(CP) $*.man.idx $*.idx
+ touch $*.dvi
+#
+.dvips.pdf:
+ echo '' > xydoc.back
+ $(PDFLATEX) $*.man
+ @-$(CP) $*.man.pdf $*.pdf ; $(CP) $*.man.aux $*.aux ; $(CP) $*.man.idx $*.idx
+ touch $*.pdf
+#
+guide: xyguide.dvi
+#
+manual: $(MANUALRUN)
+install.manual: manual
+ -test -d $(TEXDOCDIR) || $(MKDIR) $(TEXDOCDIR)
+ for f in $(MANUALRUN); do $(INSTALL) $$f $(TEXDOCDIR)/$$f; done
+#
+xyguide.dvips: xyguide.man xydoc.sty latin1.sty xydoc.bib version.tex
+xyrefer.dvips: xyrefer.man xydoc.sty latin1.sty xydoc.bib version.tex \
+ $(KERNELSOURCES) $(OPTIONSOURCES) $(MANUALDATA)
+xytest.dvips: xytest.man xydoc.sty latin1.sty xydoc.bib version.tex \
+ $(KERNELSOURCES) $(OPTIONSOURCES) $(MANUALDATA)
+#
+xyguide.dvi: xyguide.dvips version.tex
+xyrefer.dvi: xyrefer.dvips version.tex
+xytest.dvi: xytest.dvips version.tex
+#
+xyguide.pdf: xyguide.dvips version.tex
+xyrefer.pdf: xyrefer.dvips version.tex
+xytest.pdf: xytest.dvips version.tex
+#
+version.tex: version.doc
+ $(LATEX) version.doc
+#
+.SUFFIXES: .pro
+xy$(SHORTVERSION)dict.pro: xydocps.tex xypsdict.tex xypspatt.tex xyps-pro.tex
+ -$(RM) xy$(SHORTVERSION)dict.pro
+ $(TEX) xydocps.tex
+#
+# PostScript targets:
+#
+# DVIPS should be Tom Rokicki's dvips PostScript DVI driver as a filter.
+DVIPS = dvips -D600 -f
+#
+.SUFFIXES: .ps
+.dvips.ps:; $(DVIPS) < $< > $@
+#
+xyguide.ps: xyguide.dvips $(PSRUN)
+xyrefer.ps: xyrefer.dvips $(PSRUN)
+#
+manual.ps: xyguide.ps xyrefer.ps
+
+
+# TeXNICAL DOCUMENTATION.
+#
+.PHONY: TeXnical
+TeXnical: xysource.ps xysource.dvi xysource.pdf
+#
+TeXNICALSOURCES = xysource.man COPYING.patch xydoc.back
+#
+TeXNICALAUX = \
+ TRAILER CATALOG README $(INSTALLSTAR) MAKE MANIFEST \
+ COPYING.tex
+#
+xysource.dvips: xysource.man macros.tmp \
+ macros fonts obsoletefonts $(ALLSOURCES) $(TeXNICALAUX)
+xysource.ps: xysource.dvips
+xysource.dvi: xysource.dvips
+xysource.pdf: xysource.dvips
+#
+xywork.dvips: xywork.man macros.tmp \
+ macros fonts obsoletefonts $(ALLSOURCES) $(TeXNICALAUX)
+xywork.ps: xywork.dvips
+xywork.dvi: xywork.dvips
+xywork.pdf: xywork.dvips
+#
+COPYING.tex: COPYING COPYING.patch
+ patch COPYING -o COPYING.tex < COPYING.patch
+#
+FONTCOPYING.tex: FONTCOPYING FONTCOPYING.patch
+ patch FONTCOPYING -o FONTCOPYING.tex < FONTCOPYING.patch
+#
+# Macro index...requires GNU AWK (gawk) or (in a pinch) NAWK.
+#
+GAWK = gawk
+#
+macros.tmp: $(KERNELSOURCES) $(LATEXSTYLES) $(OPTIONSOURCES) $(METAFONTS)
+ -$(RM) macros.tmp
+ for f in $(KERNELSOURCES) $(LATEXSTYLES) $(OPTIONSOURCES) $(METAFONTS);\
+ do $(GAWK) '\
+ func err(s) { printf("%s,%d: %s\n",FILENAME,FNR,s) >>"/dev/stderr"};\
+ func prt(s,i) { \
+ printf("\\filelinedef{%s}{%d}\\index def{%s}\n",FILENAME,FNR,s) };\
+ func prtdef(i) { t = substr($$0,i);\
+ if (match(t,/[\\|][a-zA-Z@]*|\\.|[^\\|]|{([^{}]|\\{|\\})*}/) != 1) \
+ err("Weird TeX token");\
+ else prt(substr($$0,i,RLENGTH),i) };\
+ func prtcsdef(i) { t = substr($$0,i);\
+ if (match(t,/{([^{}]|\\{|\\})*}|{([^{}]|\\{|\\})*{([^{}]|\\{|\\})*}([^{}]|\\{|\\})*}/) != 1) \
+ err("Weird TeX cs name token");\
+ else prt(substr($$0,i+1,RLENGTH-2),i) };\
+ /^\\let[^A-Za-z@]/ ||\
+ /^\\def[^A-Za-z@]/ { prtdef(5); next };\
+ /^\\gdef[^A-Za-z@]/ ||\
+ /^\\edef[^A-Za-z@]/ ||\
+ /^\\xdef[^A-Za-z@]/ { prtdef(6); next };\
+ /^\\newif[^A-Za-z@]/ { prtdef(7); next };\
+ /^\\xydef@[^A-Za-z@]/ ||\
+ /^\\xylet@[^A-Za-z@]/ { prtdef(8); next };\
+ /^\\xyfont@[^A-Za-z@]/ { prtdef(9); next };\
+ /^\\global\\let[^A-Za-z@]/ { prtdef(12); next };\
+ /^\\xywarnifdefined[^A-Za-z@]/ { prtdef(17); next };\
+ /^\\ifx\\undefined[^A-Za-z@]/ { prtdef(15); next };\
+ /^\\xynew@{[^{}]*}/ { prtdef(index($$0,"}")+1); next };\
+ /^\\xydefcsname@{/ { prtcsdef(14); next };\
+ /^\\xyletcsnamecsname@{/ { prtcsdef(20); next }' $$f;\
+ done | sed -e 's,\\{,\\\\otherebgroup,' -e 's,\\},\\\\otheregroup,' \
+ > macros.tmp
+
+###printf("\\macroentry{%s}{%s}{%d}\n",s,FILENAME,FNR) };\
+
+
+# Xy-pic the MOVIE :)
+#
+.SUFFIXES: .texmovie .gif
+#
+.texmovie.gif:
+ $(LATEX) '\documentclass[dvips]{movie}' \
+ '\usepackage[all]{xy}' \
+ '\begin{document}' \
+ '\input{$*.texmovie}' \
+ '\end{document}'
+ @-[ -f texput.dvi ] && $(MV) texput.dvi $*.dvi && $(MV) texput.size $*.size
+ @-[ -f movie.cls.dvi ] && $(MV) movie.cls.dvi $*.dvi && $(MV) movie.cls.size $*.size
+ @-[ -f movie.dvi ] && $(MV) movie.dvi $*.dvi && $(MV) movie.size $*.size
+ ./dvitogif89a $*.dvi
+#
+.texmovie.dvi:
+ $(LATEX) '\documentclass{article}' \
+ '\usepackage[movie,all]{xy}' \
+ '\begin{document}' \
+ '\title{Storyboard for ``$*.''}' \
+ '\maketitle' \
+ '\input{$*.texmovie}' \
+ '\end{document}'
+#
+dragon.gif: dragon.texmovie movie.cls dvitogif89a
+dragon.dvi: dragon.texmovie movie.cls
+#
+sesam.gif: sesam.texmovie movie.cls dvitogif89a
+sesam.dvi: sesam.texmovie movie.cls
+#
+gasket.dvi: gasket.texmovie movie.cls dvitogif89a
+gasket.gif: gasket.texmovie movie.cls
+
+
+# DISTRIBUTION TREE.
+#
+DISTDIR = $(FTPROOT)/xy-$(VERSION)
+DISTFONTDIR = $(DISTDIR)/$(PK)fonts/$${mode}$${dpi}
+#
+# Files:
+#
+SOURCES = $(MACROSOURCES) $(FONTSOURCES) $(MANUALSOURCES) $(SUPPORT)
+#
+# Commands:
+#
+# TAR <files> output tar archive with <files>
+# GZIP compression filter
+# GZ filename extension appropriate for compressed files
+#
+# TODO: change compression to proper GNU gzip once everyone supports it...
+#
+TAR = tar cvf -
+GZIP = gzip -v9
+GZ = .gz
+#
+# Targets:
+#
+.PHONY: dist dist-$(VERSION) distsrc distrun distdoc
+#
+dist dist-$(VERSION):
+ cd $(DISTDIR);\
+ find . -type f -print | sed 's,^./,,' | sort > MANIFEST
+ $(INSTALL) README $(DISTDIR)/README
+#
+distsrc: $(DISTDIR)/src
+#
+distrun: $(DISTDIR)/CATALOG \
+ $(DISTDIR)/TRAILER \
+ $(DISTDIR)/README \
+ $(DISTDIR)/INSTALL \
+ $(DISTDIR)/VERSIONS \
+ $(DISTDIR)/texinputs \
+ $(DISTDIR)/texfonts \
+ $(DISTDIR)/mfinputs \
+ $(DISTDIR)/$(PK)fonts \
+ $(DISTDIR)/doc/xyguide.dvi \
+ $(DISTDIR)/doc/xyrefer.dvi \
+ $(DISTDIR)/doc/xysource.dvi \
+ $(DISTDIR)/ps \
+ $(DISTDIR)/type1 \
+ $(DISTDIR)/pfm \
+ $(DISTDIR)/afm \
+ $(DISTDIR)/COPYING \
+ $(DISTDIR)/support
+#
+distdoc: $(DISTDIR)/doc/xyguide.dvips \
+ $(DISTDIR)/doc/xyguide.ps \
+ $(DISTDIR)/doc/xyguide.pdf \
+ $(DISTDIR)/doc/xyrefer.dvips \
+ $(DISTDIR)/doc/xyrefer.ps \
+ $(DISTDIR)/doc/xyrefer.pdf \
+ $(DISTDIR)/doc/xysource.dvips \
+ $(DISTDIR)/doc/xysource.ps
+#### CURRENTLY BROKEN:
+# $(DISTDIR)/doc/xyguide-html \
+#
+# Explanation targets:
+#
+# CATALOG is automatically generated:
+#
+$(DISTDIR)/CATALOG: CATALOG $(DISTDIR)
+ $(INSTALL) CATALOG $(DISTDIR)/CATALOG
+#
+CATALOG: CATALOG.doc
+ $(LATEX) CATALOG.doc
+ mv -f CATALOG.out CATALOG
+
+$(DISTDIR)/TRAILER: TRAILER $(DISTDIR)
+ $(INSTALL) TRAILER $(DISTDIR)/TRAILER
+
+$(DISTDIR)/README: README $(DISTDIR)
+ $(INSTALL) README $(DISTDIR)/README
+
+$(DISTDIR)/VERSIONS: VERSIONS $(DISTDIR)
+ $(INSTALL) VERSIONS $(DISTDIR)/VERSIONS
+
+$(DISTDIR)/INSTALL: $(INSTALLSTAR) $(DISTDIR)
+ for f in $(INSTALLSTAR); do if test -f "$$f"; then \
+ $(INSTALL) $$f $(DISTDIR)/$$f; else :; fi; done
+
+$(DISTDIR)/COPYING: COPYING $(DISTDIR)
+ $(INSTALL) COPYING $(DISTDIR)/COPYING
+
+$(DISTDIR)/FONTCOPYING: FONTCOPYING $(DISTDIR)
+ $(INSTALL) FONTCOPYING $(DISTDIR)/FONTCOPYING
+#
+# Directory targets:
+#
+$(DISTDIR):
+ -test -d $(DISTDIR) || $(MKDIR) $(DISTDIR)
+
+$(DISTDIR)/src: $(SOURCES) MANIFEST VERSIONS ChangeLog $(DISTDIR)
+ -test -d $(DISTDIR)/src || $(MKDIR) $(DISTDIR)/src
+ for f in $(SOURCES); do echo $$f; done | sort -fu |\
+ while read u; do $(INSTALL) $$u $(DISTDIR)/src/$$u; done
+ echo '' > xydoc.back
+ $(INSTALLW) xydoc.back $(DISTDIR)/src
+ $(INSTALLW) MANIFEST VERSIONS ChangeLog $(DISTDIR)/src
+
+xydoc.back:
+ echo '' > xydoc.back
+#
+# The MANIFEST in src is just a list of the distributed source files.
+#
+MANIFEST: $(SOURCES)
+ ls -alg `for f in $(SOURCES); do echo $$f; done | sort -fu` >MANIFEST
+#
+# The VERSIONS is just a list of the RCS versions.
+#
+VERSIONS: $(SOURCES)
+ sed -n 's/^.*\([$$]Id[:][^$$]*[$$]\).*$$/\1/p' \
+ `for f in $(SOURCES); do echo $$f; done | sort -u` >VERSIONS
+
+$(DISTDIR)/texinputs: macros $(DISTDIR)
+ -test -d $(DISTDIR)/texinputs \
+ || $(MKDIR) $(DISTDIR)/texinputs
+ for f in $(MACRORUN) $(LATEXSTYLES); \
+ do $(INSTALL) $$f $(DISTDIR)/texinputs/$$f; done
+
+$(DISTDIR)/texfonts: texfonts obsoletefonts $(DISTDIR)
+ -test -d $(DISTDIR)/texfonts \
+ || $(MKDIR) $(DISTDIR)/texfonts
+ for f in $(TEXFONTRUN) $(OBSOLETETEXFONTRUN); \
+ do $(INSTALL) $$f $(DISTDIR)/texfonts/$$f; done
+
+$(DISTDIR)/mfinputs: mfinputs $(OBSOLETEMETAFONTS) $(DISTDIR)
+ -test -d $(DISTDIR)/mfinputs || $(MKDIR) $(DISTDIR)/mfinputs
+ for f in $(METAFONTS) $(OBSOLETEMETAFONTS); \
+ do $(INSTALL) $$f $(DISTDIR)/mfinputs/$$f; done
+
+$(DISTDIR)/$(PK)fonts: $(PK)fonts $(DISTDIR)
+ -test -d $(DISTDIR)/$(PK)fonts || $(MKDIR) $(DISTDIR)/$(PK)fonts
+ :
+ for mode in $(MODES); do for mag in $(MAGS); do \
+ $(RM) xytest.*gf xytest.*tfm;\
+ $(MF) "\\mode=$$mode; mag=magstep($$mag); input xytest";\
+ dpi="`expr xytest.*gf : 'xytest\.\([0-9]*\)gf'`";\
+ for f in $(TEXFONTRUN); do \
+ f="`expr $$f : '\([a-z0-9]*\)\.tfm'`.$${dpi}$(PK)" ;\
+ if [ ! -f $$f ]; then echo "ERROR: FONT $$f NOT GENERATED";\
+ else test -d "$(DISTFONTDIR)" || $(MKDIR) $(DISTFONTDIR);\
+ $(INSTALL) $$f $(DISTFONTDIR)/$$f; fi; done; done; done
+
+$(DISTDIR)/ps: xy$(SHORTVERSION)dict.pro xypic.map $(DISTDIR)
+ -test -d $(DISTDIR)/ps || $(MKDIR) $(DISTDIR)/ps
+ $(INSTALL) xy$(SHORTVERSION)*dict.pro $(DISTDIR)/ps
+ $(INSTALL) xypic.map $(DISTDIR)/ps
+
+$(DISTDIR)/type1: $(TYPE1FONTS) $(DISTDIR)
+ -test -d $(DISTDIR)/type1 || $(MKDIR) $(DISTDIR)/type1
+ for f in $(TYPE1FONTS) ; \
+ do $(INSTALL) $$f $(DISTDIR)/type1/$$f; done
+
+$(DISTDIR)/pfm: $(PFMFONTS) $(DISTDIR)
+ -test -d $(DISTDIR)/pfm || $(MKDIR) $(DISTDIR)/pfm
+ for f in $(PFMFONTS) ; \
+ do $(INSTALL) $$f $(DISTDIR)/pfm/$$f; done
+
+$(DISTDIR)/afm: $(AFMFONTS) $(DISTDIR)
+ -test -d $(DISTDIR)/afm || $(MKDIR) $(DISTDIR)/afm
+ for f in $(AFMFONTS) ; \
+ do $(INSTALL) $$f $(DISTDIR)/afm/$$f; done
+
+$(DISTDIR)/pdftex: $(DISTDIR) xypic.map
+ -test -d $(DISTDIR)/pdftex || $(MKDIR) $(DISTDIR)/pdftex
+ $(INSTALL) xypic.map $(DISTDIR)/pdftex
+
+$(DISTDIR)/support: $(SUPPORT)
+ -test -d $(DISTDIR)/support || $(MKDIR) $(DISTDIR)/support
+ for f in $(SUPPORT) ; \
+ do $(INSTALLX) $$f $(DISTDIR)/support/$$f; done
+
+# Document targets:
+#
+$(DISTDIR)/doc/xyguide.dvi: xyguide.dvi $(DISTDIR)/doc
+ $(INSTALL) xyguide.dvi $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyguide.dvips: xyguide.dvips $(DISTDIR)/doc
+ $(INSTALL) xyguide.dvips $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyguide.pdf: xyguide.pdf $(DISTDIR)/doc
+ $(INSTALL) xyguide.pdf $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyguide.ps: xyguide.ps $(DISTDIR)/doc
+ $(INSTALL) xyguide.ps $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyguide-html: xyguide-html $(DISTDIR)/doc
+ tar cf - xyguide-html | (cd $(DISTDIR)/doc; tar xpvf -)
+
+$(DISTDIR)/doc/xyrefer.dvi: xyrefer.dvi $(DISTDIR)/doc
+ $(INSTALL) xyrefer.dvi $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyrefer.dvips: xyrefer.dvips ross.eps kris.eps import1.eps \
+ $(DISTDIR)/doc
+ $(INSTALL) xyrefer.dvips ross.eps kris.eps import1.eps $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyrefer.pdf: xyrefer.pdf ross.eps kris.eps import1.eps \
+ $(DISTDIR)/doc
+ $(INSTALL) xyrefer.pdf $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyrefer.ps: xyrefer.ps $(DISTDIR)/doc
+ $(INSTALL) xyrefer.ps $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xyrefer-html: xyrefer-html $(DISTDIR)/doc
+ $(INSTALL) xyrefer-html $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xysource.dvi: xysource.dvi $(DISTDIR)/doc
+ $(INSTALL) xysource.dvi $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xysource.dvips: xysource.dvips ross.eps kris.eps import1.eps \
+ $(DISTDIR)/doc
+ $(INSTALL) xysource.dvips ross.eps kris.eps import1.eps $(DISTDIR)/doc
+
+$(DISTDIR)/doc/xysource.ps: xysource.ps $(DISTDIR)/doc
+ $(INSTALL) xysource.ps $(DISTDIR)/doc
+
+$(DISTDIR)/doc:
+ -test -d $(DISTDIR)/doc || $(MKDIR) $(DISTDIR)/doc
+
+
+# FTP'ABLE DISTRIBUTION.
+#
+FTPROOT = $$HOME/public_ftp/TeX
+FTPDOCDIR = $(FTPROOT)/xy-$(VERSION)/doc
+#
+.PHONY: ftp ftp-$(VERSION) ftpsrc ftprun ftpdoc ftpunpacked
+#
+ftp ftp-$(VERSION): ftpsrc ftprun ftpdoc ftpunpacked
+ $(INSTALL) TRAILER $(FTPROOT)/xy$(SHORTVERSION).TRAILER
+#
+ftpsrc $(FTPROOT)/xy$(SHORTVERSION)src.tar$(GZ): distsrc
+ cd $(DISTDIR)/.. ;\
+ $(TAR) xy-$(VERSION)/src \
+ | $(GZIP) > $(FTPROOT)/xy$(SHORTVERSION)src.tar$(GZ)
+#
+ftpdoc $(FTPROOT)/xy$(SHORTVERSION)doc.tar$(GZ): distrun distdoc
+ cd $(DISTDIR)/.. ;\
+ $(TAR) xy-$(VERSION)/doc \
+ | $(GZIP) > $(FTPROOT)/xy$(SHORTVERSION)doc.tar$(GZ)
+ $(GZIP) < xyguide.dvi > $(FTPROOT)/xyguide.dvi$(GZ)
+ $(GZIP) < xyguide.dvips > $(FTPROOT)/xyguide.dvips$(GZ)
+ $(GZIP) < xyguide.ps > $(FTPROOT)/xyguide.ps$(GZ)
+ $(GZIP) < xyguide.pdf > $(FTPROOT)/xyguide.pdf$(GZ)
+ $(GZIP) < xyrefer.dvi > $(FTPROOT)/xyrefer.dvi$(GZ)
+ $(GZIP) < xyrefer.dvips > $(FTPROOT)/xyrefer.dvips$(GZ)
+ $(GZIP) < xyrefer.ps > $(FTPROOT)/xyrefer.ps$(GZ)
+ $(GZIP) < xyrefer.pdf > $(FTPROOT)/xyrefer.pdf$(GZ)
+ $(GZIP) < xysource.dvi > $(FTPROOT)/xysource.dvi$(GZ)
+ $(GZIP) < xysource.dvips > $(FTPROOT)/xysource.dvips$(GZ)
+ $(GZIP) < xysource.ps > $(FTPROOT)/xysource.ps$(GZ)
+# $(TAR) xyguide-html | $(GZIP) > $(FTPROOT)/xyguide-html.tar.gz
+#
+ftprun $(FTPROOT)/xy$(SHORTVERSION)run.tar$(GZ): distrun
+ cd $(DISTDIR)/.. ;\
+ $(TAR) \
+ `for f in $(TRAILERRUN); do echo xy-$(VERSION)/$$f; done` \
+ xy-$(VERSION)/texinputs xy-$(VERSION)/mfinputs \
+ xy-$(VERSION)/texfonts xy-$(VERSION)/$(PK)fonts \
+ xy-$(VERSION)/ps xy-$(VERSION)/type1 xy-$(VERSION)/pfm \
+ xy-$(VERSION)/afm \
+ xy-$(VERSION)/support \
+ | $(GZIP) > $(FTPROOT)/xy$(SHORTVERSION)run.tar$(GZ)
+#
+ftpunpacked: dist
+ test $(DISTDIR) = $(FTPROOT)/xy-$(VERSION) || \
+ (cd $(DISTDIR)/.. ; tar cf - xy-$(VERSION) |(cd $(FTPROOT); tar xvf -))
+ cd $(FTPROOT); rm -f xy; ln -fs xy-$(VERSION) xy
+
+
+# WWW/HTML DOCUMENTATION & HYPE.
+#
+WWWDIR = $$HOME/public_html
+#
+WWWSOURCES = Xy-pic.html Xy.doc Xy.xy \
+ man2html.gawk man2html-post.gawk .latex2html-init
+#
+.PHONY: guide.html www install.www
+#
+LATEX2HTML = latex2html
+#
+LATEX2HTMLICONDIR = $$HOME/src/latex2html-96.1/icons
+LATEX2HTMLICONDIR2 = $$HOME/CV
+#
+man2html = $(GAWK) -f man2html.gawk
+man2htmlpost = $(GAWK) -f ../man2html-post.gawk
+#
+guide.html: xyguide-html
+#
+xyguide-html.tex: xyguide.dvips xyguide.man $(WWWSOURCES)
+ $(man2html) <xyguide.aux >xyguide-html.aux
+ $(man2html) <xyguide.bbl >xyguide-html.bbl
+ @-$(CP) xyguide.man.ans xyguide.ans
+ @-$(CP) xyguide.man.idx xyguide.idx
+ @-$(CP) xyguide.man.ind xyguide.ind
+ $(man2html) <xyguide.ans >xyguide-html.ans
+ $(man2html) <xyguide.idx >xyguide-html.idx
+ $(man2html) <xyguide.ind | sed 's/"/|/g' >xyguide-html.ind
+ $(man2html) <xyguide.man >xyguide-html.tex
+#
+xyguide-html-act: xyguide-html.tex version.tex
+ echo "\\xyoption{dvips}\xyoption{ps}" > xydoc.back
+ $(LATEX2HTML) xyguide-html.tex
+#
+xyguide-html: xyguide-html.tex xyguide-html-act
+ (cd xyguide-html; \
+ for f in *.html; do mv $$f $$f~; \
+ $(man2htmlpost) <$$f~ \
+ | sed -e 's/``/"/g' -e "s/''/\"/g" -e 's/ [>] />/g' >$$f; done; \
+ (cd $$HOME/W3; tar cf - COPYING) | tar xpf - )
+ :
+ cp "$(LATEX2HTMLICONDIR2)/18pt.html" xyguide-html
+ cat xyguide-html/*.html \
+ | tr '"' "\n" \
+ | sed -n 's;[.][/]\([a-z_]*[.]gif\);\1;p' | sort -u \
+ | while read f ;\
+ do if [ -f "$(LATEX2HTMLICONDIR2)/$$f" ]; \
+ then echo "[$$f]"; cp $(LATEX2HTMLICONDIR2)/$$f xyguide-html ; \
+ elif [ -f "$(LATEX2HTMLICONDIR)/$$f" ]; \
+ then echo "[$$f]"; cp $(LATEX2HTMLICONDIR)/$$f xyguide-html ; \
+ fi ; done
+ :
+ (cd xyguide-html; \
+ $(RM) .I* .O* *.ppm *.xyc *.ans *.aux *.idx *.bbl *.log *.tex *~)
+#
+Xy.tex: Xy.doc
+Xy.dvi: Xy.tex Xy.xy macros; $(LATEX) Xy
+Xy.ps: Xy.dvi; $(DVIPS) Xy.dvi -oXy.ps
+#
+PNMCROP = ./pnmrawtopcropwhite | pnmcrop
+PGMTOGIF = pgmtoppm rgbi:1/1/1 | ppmtogif -interlace -transparent rgbi:1/1/1
+#
+Xy.gif: Xy.ps pnmrawtopcropwhite
+ echo '' | \
+ gs -sDEVICE=pbmraw -r300 \
+ -sOutputFile='|$(PNMCROP) >Xy.pbm' \
+ -q - Xy.ps
+ cat Xy.pbm | $(PGMTOGIF) >Xy.gif
+#
+pnmrawtopcropwhite: pnmrawtopcropwhite.c
+#
+www: Xy-pic.html Xy.gif
+####BROKEN##### guide.html
+#
+install.www: www
+ $(INSTALL) Xy-pic.html Xy.gif $(WWWDIR)
+# $(RM) $(WWWDIR)/xyguide-html
+# $(MKDIR) $(WWWDIR)/xyguide-html
+# tar -cf - xyguide-html | (cd $(WWWDIR); tar xvpf -)
+
+
+# ANNOUNCEMENTS.
+#
+MAILSOURCES = TRAILER Users mail.Users
+#
+.PHONY: announce
+announce: $(MAILSOURCES)
+ @./mail.Users
+
+
+# TAGS for Emacs.
+#
+TAGS: $(SOURCES)
+ -$(RM) TAGS
+ for f in `for ff in $(SOURCES); do echo $$ff; done |sort -u`;\
+ do\
+ $(GAWK) '\
+ func err(s) { printf("%s,%d: %s\n",FILENAME,FNR,s) >>"/dev/stderr"};\
+ func prt(s,n) { printf("%s\177%d,%d\n",s,FNR,c+n) };\
+ func prtdef(i) { t = substr($$0,i);\
+ if (match(t,/[\\|][a-zA-Z@]*|\\.|[^\\|]|{([^{}]|\\{|\\})*}/) != 1) \
+ err("Weird TeX token");\
+ else prt(substr($$0,1,i+RLENGTH),i) };\
+ func prtcsdef(i) { t = substr($$0,i);\
+ if (match(t,/{([^{}]|\\{|\\})*}|{([^{}]|\\{|\\})*{([^{}]|\\{|\\})*}([^{}]|\\{|\\})*}/) != 1) \
+ err("Weird TeX cs name token");\
+ else prt(substr($$0,1,i+RLENGTH),i) };\
+ func fin() { c += length($$0) + 1; next };\
+ BEGIN { c = 0 };\
+ /^\\let[^A-Za-z@]/ ||\
+ /^\\def[^A-Za-z@]/ { prtdef(5); fin() };\
+ /^\\gdef[^A-Za-z@]/ ||\
+ /^\\edef[^A-Za-z@]/ ||\
+ /^\\xdef[^A-Za-z@]/ { prtdef(6); fin() };\
+ /^\\newif[^A-Za-z@]/ { prtdef(7); fin() };\
+ /^\\xydef@[^A-Za-z@]/ ||\
+ /^\\xylet@[^A-Za-z@]/ { prtdef(8); fin() };\
+ /^\\xyfont@[^A-Za-z@]/ { prtdef(9); fin() };\
+ /^\\global\\let[^A-Za-z@]/ { prtdef(12); fin() };\
+ /^\\xywarnifdefined[^A-Za-z@]/ { prtdef(17); fin() };\
+ /^\\ifx\\undefined[^A-Za-z@]/ { prtdef(15); fin() };\
+ /^\\xynew@{[^{}]*}/ { prtdef(index($$0,"}")+1); fin() };\
+ /^\\xydefcsname@{/ { prtcsdef(14); fin() };\
+ /^\\xyletcsnamecsname@{/ { prtcsdef(20); fin() };\
+ /\?\?\=\[/ { s = $$0; i = 0;\
+ while (first = index(s, "\?\?=[")) {\
+ s = substr(s,first+4); i += first+4;\
+ if (j = index(s, "]")) prt(substr($$0,1,i+j-1),i);\
+ else printf("Unmatched []s") }; fin() };\
+ /^@[A-Za-z]*{/ { prt($$0,index($$0,"{")+1); fin() };\
+ { fin() }' $$f >TAGS.tmp ;\
+ wc -c TAGS.tmp|$(GAWK) '{printf "\f\n%s,%s\n","'"$$f"'",$$1}'>>TAGS;\
+ cat TAGS.tmp >>TAGS ;\
+ done
+ $(RM) TAGS.tmp
+
+
+# RCS STUFF:
+#
+.PHONY: ci ci-$(VERSION) cici rcscheck \
+ rcslist rcslockedlist rcsunlockedlist \
+ rcscleanlist rcsuncleanlist rcsclean rcsdep
+#
+ALLSOURCES = $(TRAILERSOURCES) $(SOURCES) $(MANUALSOURCES) $(TeXNICALSOURCES) \
+ $(WWWSOURCES) $(MAILSOURCES) $(OBSOLETEMETAFONTS) $(TYPE1FONTS) \
+ $(SUPPORT) xypic.map
+#
+ROSSSOURCES = INSTALL.OzTeX INSTALL.Textures import1.eps ross.eps \
+ xy16textures.doc xy17oztex.doc xy2cell.doc xyarc.doc \
+ xycolor.doc xycrayon.doc xycurve.doc \
+ xydvips.doc xyimport.doc xyknot.doc xyline.doc \
+ xymacpat.xyp xyoztex.doc xypoly.doc xyps-c.doc xyps-col.doc \
+ xyps-f.doc xyps-l.doc xyps-pro.doc xyps-ps.doc xyps-r.doc \
+ xyps-s.doc xyps-t.doc xyps.doc xypsdict.doc xypspatt.doc xyrotate.doc \
+ xytextures.doc xytile.doc xytpic.doc xyemtex.doc xyweb.doc \
+ xydvidrv.doc xyxdvi.doc xydvitops.doc xytp-f.doc xycmactex.doc
+#
+YANDYSOURCES = \
+ xyatip10.pfa xybsql10.pfa xybtip10.pfa xycirc10.pfa xycmat10.pfa \
+ xycmbt10.pfa xydash10.pfa xyeuat10.pfa xyeubt10.pfa \
+#
+ci ci-$(VERSION): $(ALLSOURCES) cici Makefile
+cici:
+ -rcs -l `for f in $(ALLSOURCES); do echo $$f; done | sort -u`
+ -ci -u$(VERSION) `$(MAKE) rcslockedlist`
+#
+rcscheck: $(ALLSOURCES)
+ @locked="`$(MAKE) rcslockedlist`"; \
+ unlocked="`$(MAKE) rcsunlockedlist`"; \
+ echo "Missing write permission on locked files:"; \
+ for f in $$locked; do [ -w "$$f" ] || echo ' '$$f; done; \
+ echo "Wrong write permission on unlocked files:"; \
+ for f in $$unlocked; do [ -w "$$f" ] && echo ' '$$f; done; \
+ echo "Wrong/missing locks on ross's files:"; \
+ for f in $(ROSSSOURCES); \
+ do lock=; \
+ for ff in $$locked; \
+ do if [ "$$f" = "$$ff" ]; then lock=' ross'; fi; done; \
+ fgrep -s " ross Exp$$lock "'$$' $$f \
+ ||(/bin/echo ' '$$f': \c' && grep 'Id[:].* Exp ' $$f || echo '?'); \
+ done; \
+ echo "Wrong/missing locks on krisrose's files:"; \
+ for f in `$(MAKE) rcslist`; \
+ do for ff in $(ROSSSOURCES); \
+ do if [ "$$f" = "$$ff" ]; then continue 2; fi; done; \
+ lock=; \
+ for ff in $$locked; \
+ do if [ "$$f" = "$$ff" ]; then lock=' krisrose'; fi; done; \
+ fgrep -s " krisrose Exp$$lock "'$$' $$f \
+ || (/bin/echo ' '$$f' \c' && grep 'Id[:].* Exp ' $$f || echo ''); \
+ done
+#
+rcslist:
+ -@rlog -R `for f in $(ALLSOURCES); do echo $$f; done | sort -u` \
+ 2>/dev/null | sed 's;RCS/\(.*\),v;\1;'
+#
+rcslockedlist:
+ -@rlog -R -L `for f in $(ALLSOURCES); do echo $$f; done | sort -u` \
+ 2>/dev/null | sed 's;RCS/\(.*\),v;\1;'
+#
+rcsunlockedlist:
+ -@locked="`$(MAKE) rcslockedlist`"; \
+ $(MAKE) rcslist | while read f; \
+ do echo=echo; for ff in $$locked; \
+ do if [ "$$f" = "$$ff" ]; then echo=:; fi; done; \
+ $$echo $$f; done
+#
+rcscleanlist:
+ -@$(MAKE) rcslist \
+ | while read f; do if test -w "$$f" -o "$$f" = Makefile; then :; \
+ else echo $$f; fi; done
+#
+rcsuncleanlist:
+ -@$(MAKE) rcslist \
+ | while read f; do if test -w "$$f" -o "$$f" = Makefile; \
+ then echo $$f; fi; done
+#
+rcsclean:
+ -@$(MAKE) rcscleanlist | while read f; do $(RM) $$f; done
+#
+# Dependencies...
+#
+rcsdep:
+ $(MAKE) rcslist | while read f; do \
+ echo "$$f: RCS/$$f,v; test -d RCS && co $$f || :"; done
+
+.late2html-init:; test -d RCS -a -f RCS/.late2html-init,v && co .late2html-init || :
+CATALOG.doc:; test -d RCS -a -f RCS/CATALOG.doc,v && co CATALOG.doc || :
+COPYING.patch:; test -d RCS -a -f RCS/COPYING.patch,v && co COPYING.patch || :
+COPYING:; test -d RCS -a -f RCS/COPYING,v && co COPYING || :
+FONTCOPYING.patch:; test -d RCS -a -f RCS/FONTCOPYING.patch,v && co FONTCOPYING.patch || :
+FONTCOPYING:; test -d RCS -a -f RCS/FONTCOPYING,v && co FONTCOPYING || :
+INSTALL.OzTeX:; test -d RCS -a -f RCS/INSTALL.OzTeX,v && co INSTALL.OzTeX || :
+INSTALL.Textures:; test -d RCS -a -f RCS/INSTALL.Textures,v && co INSTALL.Textures || :
+INSTALL:; test -d RCS -a -f RCS/INSTALL,v && co INSTALL || :
+MAKE:; test -d RCS -a -f RCS/MAKE,v && co MAKE || :
+Makefile:; test -d RCS -a -f RCS/Makefile,v && co Makefile || :
+README:; test -d RCS -a -f RCS/README,v && co README || :
+TRAILER:; test -d RCS -a -f RCS/TRAILER,v && co TRAILER || :
+Users:; test -d RCS -a -f RCS/Users,v && co Users || :
+Xy-pic.blurb:; test -d RCS -a -f RCS/Xy-pic.blurb,v && co Xy-pic.blurb || :
+Xy-pic.html:; test -d RCS -a -f RCS/Xy-pic.html,v && co Xy-pic.html || :
+Xy-pic.xbm:; test -d RCS -a -f RCS/Xy-pic.xbm,v && co Xy-pic.xbm || :
+Xy.doc:; test -d RCS -a -f RCS/Xy.doc,v && co Xy.doc || :
+Xy.xy:; test -d RCS -a -f RCS/Xy.xy,v && co Xy.xy || :
+YandY_xy_fonts.zip:; test -d RCS -a -f RCS/YandY_xy_fonts.zip,v && co YandY_xy_fonts.zip || :
+doc2tex.com:; test -d RCS -a -f RCS/doc2tex.com,v && co doc2tex.com || :
+dvitogif89a:; test -d RCS -a -f RCS/dvitogif89a,v && co dvitogif89a || :
+gasket.texmovie:; test -d RCS -a -f RCS/gasket.texmovie,v && co gasket.texmovie || :
+import1.eps:; test -d RCS -a -f RCS/import1.eps,v && co import1.eps || :
+install-tds:; test -d RCS -a -f RCS/install-tds,v && co install-tds || :
+kris.eps:; test -d RCS -a -f RCS/kris.eps,v && co kris.eps || :
+latin1.sty:; test -d RCS -a -f RCS/latin1.sty,v && co latin1.sty || :
+mail.Users:; test -d RCS -a -f RCS/mail.Users,v && co mail.Users || :
+man2html-post.gawk:; test -d RCS -a -f RCS/man2html-post.gawk,v && co man2html-post.gawk || :
+man2html.gawk:; test -d RCS -a -f RCS/man2html.gawk,v && co man2html.gawk || :
+movie.cls:; test -d RCS -a -f RCS/movie.cls,v && co movie.cls || :
+pnmrawtopcropwhite.c:; test -d RCS -a -f RCS/pnmrawtopcropwhite.c,v && co pnmrawtopcropwhite.c || :
+ross.eps:; test -d RCS -a -f RCS/ross.eps,v && co ross.eps || :
+version.doc:; test -d RCS -a -f RCS/version.doc,v && co version.doc || :
+xy.doc:; test -d RCS -a -f RCS/xy.doc,v && co xy.doc || :
+xy.sty:; test -d RCS -a -f RCS/xy.sty,v && co xy.sty || :
+xy16textures.doc:; test -d RCS -a -f RCS/xy16textures.doc,v && co xy16textures.doc || :
+xy17oztex.doc:; test -d RCS -a -f RCS/xy17oztex.doc,v && co xy17oztex.doc || :
+xy2cell.doc:; test -d RCS -a -f RCS/xy2cell.doc,v && co xy2cell.doc || :
+xyall.doc:; test -d RCS -a -f RCS/xyall.doc,v && co xyall.doc || :
+xyamslatex.ini:; test -d RCS -a -f RCS/xyamslatex.ini,v && co xyamslatex.ini || :
+xyarc.doc:; test -d RCS -a -f RCS/xyarc.doc,v && co xyarc.doc || :
+xyarrow.doc:; test -d RCS -a -f RCS/xyarrow.doc,v && co xyarrow.doc || :
+xyatip10.mf:; test -d RCS -a -f RCS/xyatip10.mf,v && co xyatip10.mf || :
+xybsql10.mf:; test -d RCS -a -f RCS/xybsql10.mf,v && co xybsql10.mf || :
+xybtip10.mf:; test -d RCS -a -f RCS/xybtip10.mf,v && co xybtip10.mf || :
+xycirc10.enc:; test -d RCS -a -f RCS/xycirc10.enc,v && co xycirc10.enc || :
+xycirc10.mf:; test -d RCS -a -f RCS/xycirc10.mf,v && co xycirc10.mf || :
+xycm.mf:; test -d RCS -a -f RCS/xycm.mf,v && co xycm.mf || :
+xycmactex.doc:; test -d RCS -a -f RCS/xycmactex.doc,v && co xycmactex.doc || :
+xycmat10.mf:; test -d RCS -a -f RCS/xycmat10.mf,v && co xycmat10.mf || :
+xycmat11.mf:; test -d RCS -a -f RCS/xycmat11.mf,v && co xycmat11.mf || :
+xycmat12.mf:; test -d RCS -a -f RCS/xycmat12.mf,v && co xycmat12.mf || :
+xycmbt10.mf:; test -d RCS -a -f RCS/xycmbt10.mf,v && co xycmbt10.mf || :
+xycmbt11.mf:; test -d RCS -a -f RCS/xycmbt11.mf,v && co xycmbt11.mf || :
+xycmbt12.mf:; test -d RCS -a -f RCS/xycmbt12.mf,v && co xycmbt12.mf || :
+xycmtip.doc:; test -d RCS -a -f RCS/xycmtip.doc,v && co xycmtip.doc || :
+xycolor.doc:; test -d RCS -a -f RCS/xycolor.doc,v && co xycolor.doc || :
+xycrayon.doc:; test -d RCS -a -f RCS/xycrayon.doc,v && co xycrayon.doc || :
+xycurve.doc:; test -d RCS -a -f RCS/xycurve.doc,v && co xycurve.doc || :
+xyd.enc:; test -d RCS -a -f RCS/xyd.enc,v && co xyd.enc || :
+xyd.mf:; test -d RCS -a -f RCS/xyd.mf,v && co xyd.mf || :
+xyd2.enc:; test -d RCS -a -f RCS/xyd2.enc,v && co xyd2.enc || :
+xyd2.mf:; test -d RCS -a -f RCS/xyd2.mf,v && co xyd2.mf || :
+xydash10.mf:; test -d RCS -a -f RCS/xydash10.mf,v && co xydash10.mf || :
+xydoc.bib:; test -d RCS -a -f RCS/xydoc.bib,v && co xydoc.bib || :
+xydoc.sty:; test -d RCS -a -f RCS/xydoc.sty,v && co xydoc.sty || :
+xydocps.doc:; test -d RCS -a -f RCS/xydocps.doc,v && co xydocps.doc || :
+xydriver.doc:; test -d RCS -a -f RCS/xydriver.doc,v && co xydriver.doc || :
+xydummy.doc:; test -d RCS -a -f RCS/xydummy.doc,v && co xydummy.doc || :
+xydvidrv.doc:; test -d RCS -a -f RCS/xydvidrv.doc,v && co xydvidrv.doc || :
+xydvips.doc:; test -d RCS -a -f RCS/xydvips.doc,v && co xydvips.doc || :
+xydvitops.doc:; test -d RCS -a -f RCS/xydvitops.doc,v && co xydvitops.doc || :
+xyemtex.doc:; test -d RCS -a -f RCS/xyemtex.doc,v && co xyemtex.doc || :
+xyeuat10.mf:; test -d RCS -a -f RCS/xyeuat10.mf,v && co xyeuat10.mf || :
+xyeuat11.mf:; test -d RCS -a -f RCS/xyeuat11.mf,v && co xyeuat11.mf || :
+xyeuat12.mf:; test -d RCS -a -f RCS/xyeuat12.mf,v && co xyeuat12.mf || :
+xyeubt10.mf:; test -d RCS -a -f RCS/xyeubt10.mf,v && co xyeubt10.mf || :
+xyeubt11.mf:; test -d RCS -a -f RCS/xyeubt11.mf,v && co xyeubt11.mf || :
+xyeubt12.mf:; test -d RCS -a -f RCS/xyeubt12.mf,v && co xyeubt12.mf || :
+xyeuler.doc:; test -d RCS -a -f RCS/xyeuler.doc,v && co xyeuler.doc || :
+xyframe.doc:; test -d RCS -a -f RCS/xyframe.doc,v && co xyframe.doc || :
+xygraph.doc:; test -d RCS -a -f RCS/xygraph.doc,v && co xygraph.doc || :
+xyguide.man:; test -d RCS -a -f RCS/xyguide.man,v && co xyguide.man || :
+xyidioms.doc:; test -d RCS -a -f RCS/xyidioms.doc,v && co xyidioms.doc || :
+xyimport.doc:; test -d RCS -a -f RCS/xyimport.doc,v && co xyimport.doc || :
+xyknot.doc:; test -d RCS -a -f RCS/xyknot.doc,v && co xyknot.doc || :
+xylatex.ini:; test -d RCS -a -f RCS/xylatex.ini,v && co xylatex.ini || :
+xyline.doc:; test -d RCS -a -f RCS/xyline.doc,v && co xyline.doc || :
+xyline10.mf:; test -d RCS -a -f RCS/xyline10.mf,v && co xyline10.mf || :
+xymacpat.xyp:; test -d RCS -a -f RCS/xymacpat.xyp,v && co xymacpat.xyp || :
+xymatrix.doc:; test -d RCS -a -f RCS/xymatrix.doc,v && co xymatrix.doc || :
+xymisc10.mf:; test -d RCS -a -f RCS/xymisc10.mf,v && co xymisc10.mf || :
+xymovie.doc:; test -d RCS -a -f RCS/xymovie.doc,v && co xymovie.doc || :
+xyoztex.doc:; test -d RCS -a -f RCS/xyoztex.doc,v && co xyoztex.doc || :
+xypic.doc:; test -d RCS -a -f RCS/xypic.doc,v && co xypic.doc || :
+xypic.map:; test -d RCS -a -f RCS/xypic.map,v && co xypic.map || :
+xypic.sty:; test -d RCS -a -f RCS/xypic.sty,v && co xypic.sty || :
+xypoly.doc:; test -d RCS -a -f RCS/xypoly.doc,v && co xypoly.doc || :
+xyps-c.doc:; test -d RCS -a -f RCS/xyps-c.doc,v && co xyps-c.doc || :
+xyps-col.doc:; test -d RCS -a -f RCS/xyps-col.doc,v && co xyps-col.doc || :
+xyps-dto.doc:; test -d RCS -a -f RCS/xyps-dto.doc,v && co xyps-dto.doc || :
+xyps-dvi.doc:; test -d RCS -a -f RCS/xyps-dvi.doc,v && co xyps-dvi.doc || :
+xyps-f.doc:; test -d RCS -a -f RCS/xyps-f.doc,v && co xyps-f.doc || :
+xyps-l.doc:; test -d RCS -a -f RCS/xyps-l.doc,v && co xyps-l.doc || :
+xyps-one.doc:; test -d RCS -a -f RCS/xyps-one.doc,v && co xyps-one.doc || :
+xyps-oz.doc:; test -d RCS -a -f RCS/xyps-oz.doc,v && co xyps-oz.doc || :
+xyps-pro.doc:; test -d RCS -a -f RCS/xyps-pro.doc,v && co xyps-pro.doc || :
+xyps-ps.doc:; test -d RCS -a -f RCS/xyps-ps.doc,v && co xyps-ps.doc || :
+xyps-pub.doc:; test -d RCS -a -f RCS/xyps-pub.doc,v && co xyps-pub.doc || :
+xyps-r.doc:; test -d RCS -a -f RCS/xyps-r.doc,v && co xyps-r.doc || :
+xyps-s.doc:; test -d RCS -a -f RCS/xyps-s.doc,v && co xyps-s.doc || :
+xyps-t.doc:; test -d RCS -a -f RCS/xyps-t.doc,v && co xyps-t.doc || :
+xyps-txo.doc:; test -d RCS -a -f RCS/xyps-txo.doc,v && co xyps-txo.doc || :
+xyps-txt.doc:; test -d RCS -a -f RCS/xyps-txt.doc,v && co xyps-txt.doc || :
+xyps-wdo.doc:; test -d RCS -a -f RCS/xyps-wdo.doc,v && co xyps-wdo.doc || :
+xyps.doc:; test -d RCS -a -f RCS/xyps.doc,v && co xyps.doc || :
+xypsdict.doc:; test -d RCS -a -f RCS/xypsdict.doc,v && co xypsdict.doc || :
+xypspatt.doc:; test -d RCS -a -f RCS/xypspatt.doc,v && co xypspatt.doc || :
+xyqc10.mf:; test -d RCS -a -f RCS/xyqc10.mf,v && co xyqc10.mf || :
+xyrecat.doc:; test -d RCS -a -f RCS/xyrecat.doc,v && co xyrecat.doc || :
+xyrefer.man:; test -d RCS -a -f RCS/xyrefer.man,v && co xyrefer.man || :
+xyrotate.doc:; test -d RCS -a -f RCS/xyrotate.doc,v && co xyrotate.doc || :
+xysmart.doc:; test -d RCS -a -f RCS/xysmart.doc,v && co xysmart.doc || :
+xysource.man:; test -d RCS -a -f RCS/xysource.man,v && co xysource.man || :
+xystyle.doc:; test -d RCS -a -f RCS/xystyle.doc,v && co xystyle.doc || :
+xytech.mf:; test -d RCS -a -f RCS/xytech.mf,v && co xytech.mf || :
+xytest.mf:; test -d RCS -a -f RCS/xytest.mf,v && co xytest.mf || :
+xytex.ini:; test -d RCS -a -f RCS/xytex.ini,v && co xytex.ini || :
+xytextures.doc:; test -d RCS -a -f RCS/xytextures.doc,v && co xytextures.doc || :
+xytile.doc:; test -d RCS -a -f RCS/xytile.doc,v && co xytile.doc || :
+xytips.doc:; test -d RCS -a -f RCS/xytips.doc,v && co xytips.doc || :
+xytp-f.doc:; test -d RCS -a -f RCS/xytp-f.doc,v && co xytp-f.doc || :
+xytpic.doc:; test -d RCS -a -f RCS/xytpic.doc,v && co xytpic.doc || :
+xyv2.doc:; test -d RCS -a -f RCS/xyv2.doc,v && co xyv2.doc || :
+xyweb.doc:; test -d RCS -a -f RCS/xyweb.doc,v && co xyweb.doc || :
+xyxdvi.doc:; test -d RCS -a -f RCS/xyxdvi.doc,v && co xyxdvi.doc || :
+
+
+# DEVELOPMENT TARGETS:
+#
+.PHONY: Install.macros Install Ftpsrc Ftpdoc Ftp World Minor
+
+Install.macros:
+ $(MAKE) USR=$$HOME/pub install.macros
+
+Install:
+ $(MAKE) USR=$$HOME/pub install
+
+Ftpsrc:
+ $(MAKE) MODES='ljfour cx' \
+ MAGS='0 0.5 1 2' \
+ FTPROOT=$$HOME/public_ftp/TeX ftpsrc
+
+Ftpdoc:
+ $(MAKE) MODES='ljfour cx' \
+ MAGS='0 0.5 1 2' \
+ FTPROOT=$$HOME/public_ftp/TeX ftpdoc
+
+Ftp:
+ $(MAKE) MODES='ljfour cx' \
+ MAGS='0 0.5 1 2' \
+ FTPROOT=$$HOME/public_ftp/TeX ftp
+
+Www:
+ $(MAKE) WWWROOT=$$HOME/public_html install.www
+
+World:
+ $(MAKE) LATEX='time latex' \
+ MODES='ljfour cx' \
+ MAGS='0 0.5 1 2' world
+ mv make.world make.World
+
+TMPFTPROOT = $$HOME/tmp/new-ftp-root
+
+Minor:
+ $(MKDIR) $(TMPFTPROOT)
+ $(MAKE) LATEX='time latex' \
+ MODES='ljfour cx' \
+ MAGS='0 0.5 1 2' \
+ FTPROOT=$(TMPFTPROOT) world
+ mv make.world make.Minor
+#
+ @echo "Making patch:";\
+ cd $(TMPFTPROOT); \
+ diff -urN $(FTPROOT)/xy-$(VERSION) xy-$(VERSION) > FIX; \
+ n=`cd $(FTPROOT);ls xy$(SHORTVERSION)fix* | wc -w 2>/dev/null`; \
+ n=`expr $$n + 1`; \
+ fix=$(FTPROOT)/xy$(SHORTVERSION)fix`printf '%.2d' $$n`; \
+ cp -vf FIX $$fix; gzip -v9 $$fix
+#
+ @echo "Updating real ftp archive $(FTPROOT):";\
+ cd $(TMPFTPROOT); \
+ find xy* -type f -print \
+ | while read f;\
+ do cmp -s $$f $(FTPROOT)/$$f\
+ || { echo $$f; $(MKDIR) `dirname $(FTPROOT)/$$f`;\
+ if [ -w $$f ]; then $(INSTALLW) $$f $(FTPROOT)/$$f;\
+ else $(INSTALL) $$f $(FTPROOT)/$$f;\
+ fi; };\
+ done
+ $(RM) $(TMPFTPROOT)
+
+
+# LOG
+#
+# $Log: Makefile,v $
+# Revision 3.7 1999/02/16 15:12:50 krisrose
+# Interim release (Y&Y fonts now free).
+#
+# Revision 3.6 1998/03/06 01:28:05 krisrose
+# Releasing (with Y&Y fonts).
+#
+# Revision 3.5 1997/05/28 13:05:01 krisrose
+# Fixed missing breaks bug.
+#
+# Revision 3.4 1997/05/18 03:04:44 krisrose
+# Essential bugfixes.
+# And movies now included!
+#
+# Revision 3.3 1996/12/19 17:05:13 krisrose
+# Maintenance release!
+#
+# Revision 3.2 1995/09/19 18:22:27 kris
+# Bug fix release.
+#
+# Revision 3.1 1995/09/05 20:31:32 kris
+# Releasing!
+#
+# Revision 3.0 1995/07/07 20:14:21 kris
+# Major release w/new User's Guide!
+#
+# Revision 2.14 1995/07/06 02:56:02 kris
+# Buglets...
+#
+# Revision 2.13 1995/07/04 15:10:01 kris
+# Ready to release v3?
+#
+# Revision 2.12 1994/10/25 11:46:25 kris
+# Interim release just before v3 [works with AMS-LaTeX 1.2]...
+#
+# Revision 2.11 1994/07/05 10:37:32 kris
+# Third 3beta release [bug fixes].
+# Experimental graph feature included (for ECCT-94 presentation).
+#
+# Revision 2.10 1994/06/15 13:35:19 kris
+# Second 3beta release [bug fixes].
+#
+# Revision 2.9 1994/06/09 14:53:07 kris
+# Release 3beta.
+#
+# Revision 2.8 1994/04/08 04:30:00 kris
+# Second (bug fix) 3alpha release.
+#
+# Revision 2.7 1994/03/08 02:06:01 kris
+# Release 3alpha.
+#
+# Revision 2.6.9.1 1994/03/07 04:22:46 kris
+# Last internal 3alpha and pre-2.7 release.
+#
+# MAJOR REORGANISATION for version 2.7...
+#
+# Revision 2.6 1992/06/24 01:23:34 kris
+# Ready to release v.2.6.
+#
+# Revision 2.5 1992/02/24 03:30:54 kris
+# Default magsteps now just 0, 0.5, 1, and 2.
+#
+# Revision 2.3 1992/01/13 02:12:28 kris
+# Fixed installation instructions and other details.
+#
+# Revision 2.1 1992/01/02 14:54:07 kris
+# Release version.
+#
+# Revision 1.6 1991/12/17 04:51:16 kris
+# Version distributed with `final draft' on Usenet.
+
+# Tell Emacs that this is a Makefile and how it is formatted:
+# Local Variables:
+# mode:fundamental
+# fill-prefix:"# "
+# fill-column:77
+# End:
diff --git a/Master/texmf-dist/source/generic/xypic/README b/Master/texmf-dist/source/generic/xypic/README
new file mode 100644
index 00000000000..9cb813a4cb6
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/README
@@ -0,0 +1,106 @@
+-*-text-*- $Id: README,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+
+ ======================================================
+ THE Xy-pic PACKAGE FOR TYPESETTING GRAPHS AND DIAGRAMS
+ ======================================================
+
+Xy-pic is a package for typesetting graphs and diagrams with TeX.
+
+It works with most formats, including LaTeX (both 2.09 and 2e),
+AMS-LaTeX, AMS-TeX, and plain TeX.
+
+It has been used to typeset complicated diagrams from many application
+areas including category theory, automata theory, algebra, neural
+networks, and database theory.
+
+ - o -
+
+See below in this file for an overview of the structure and features!
+See CATALOG for up to date version information!
+See TRAILER for author and accessibility information!
+See COPYING for the conditions for redistribution and modification!
+See MANIFEST for a complete file list!
+See VERSIONS for the exact list of the versions of all source files!
+See the various INSTALL files for how to install Xy-pic on your system!
+See the W3 <URL: http://www.ens-lyon.fr/~krisrose/Xy-pic.html> for news!
+
+ - o -
+
+Xy-pic is structured as a `kernel' and several orthogonal modules called
+`options', each defining a custom notation for a particular kind of
+graphical object or structure.
+
+These (combinable) structures are available:
+
+* A graph combinator mode where diagrams are specified the way they are
+ composed as graphs.
+
+* A matrix-like mode where the dimensions of the drawing are computed by
+ aligning diagram entries in rows and columns (this is the `diagram'
+ mode Xy-pic version 2 users are used to).
+
+* A polygon mode where diagrams shaped as regular polygons are entered
+ in a simple way.
+
+* A mode for typesetting beautiful knots and links.
+
+* A general object-oriented `turtle graphic' drawing language for
+ specifying graphs with objects and connections between them in a
+ manner independent of orientation.
+
+The following objects may be used:
+
++ Positions can be given in variety of formats (extendable) including
+ user defined coordinates (x,y) and relative to previous positions,
+ objects, object edges, and points on connections.
+
++ Objects may be circular, elliptic, or rectangular (more shapes can be
+ added) and adjusted in several ways.
+
++ Large library of objects with mnemonic names.
+
++ Objects that orient themself along a connection when placed relative
+ to it, e.g., `\dir{|-}' is like \vdash but thus oriented; new such
+ objects can be defined in a convenient way.
+
++ TeX `boxes', i.e., text and mathematical formulae.
+
++ Includes circle segments and optionally arbitrary elliptical,
+ quadratic, and cubic arcs.
+
++ Connections are aligned between the reference points of objects but
+ start and end on the edges.
+
++ Any object can be used to build a connection (using `diagonal
+ filling'); library objects provide common line types.
+
++ Flexible notation for drawing arrows and general paths with tail,
+ stem, and head built from any object(s). Special support for arrows
+ that cross each other, arrows that `go by' other entries, paired
+ arrows (including support for 2-cells), curved arrows, and arrows with
+ bends.
+
++ Library of frames and braces.
+
++ Special notation for rotation, scaling, colour, and line thickness.
+ The correct typesetting of these features requires a backend that
+ supports it (i.e., PostScript) but even when this is not available
+ Xy-pic tries to approximate what is requested such that at least the
+ picture size is stable (and thus page breaks).
+
++ Output can use PostScript for drawing (several \special formats are
+ supported: dvips, Textures, and OzTeX -- more are being added
+ continuously: contact Ross Moore <ross@mpce.mq.edu.au> for the current
+ list). Notation for inclusion of literal PostScript is available.
+
+* Other graphics can be imported and then `decorated' using Xy-pic.
+
+All object forms may be used with all structures.
+
+ - o -
+
+Finally, enjoy Xy-pic!
+
+Sincerely,
+ Kristoffer H. Rose <krisrose@ens-lyon.fr>
+ Ross Moore <ross@mpce.mq.edu.au>
diff --git a/Master/texmf-dist/source/generic/xypic/TRAILER b/Master/texmf-dist/source/generic/xypic/TRAILER
new file mode 100644
index 00000000000..0910c672a83
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/TRAILER
@@ -0,0 +1,91 @@
+-*-text-*- $Id: TRAILER,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+
+=======================================================================
+ ANNOUNCING the Xy-pic version 3.7 DIAGRAM TYPESETTING PACKAGE
+=======================================================================
+
+This is to announce a release of my diagram typesetting package Xy-pic.
+
+With version 3.7 we explicitly grant permission to use the unmodified
+Xy-pic fonts and specials in distributed documents.
+
+-----------------------------------------------------------------------
+ GENERAL
+-----------------------------------------------------------------------
+
+Xy-pic is a package for typesetting a variety of graphs and diagrams
+with TeX. Xy-pic works with most formats (including LaTeX, AMS-LaTeX,
+AMS-TeX, and plain TeX), in particular Xy-pic is provided as a LaTeX2e
+`supported package' (following the `CTAN LaTeX2e bundle' standard).
+
+Further specifics of the package are in the distribution README file.
+
+-----------------------------------------------------------------------
+ NEWS
+-----------------------------------------------------------------------
+
+The primary purpose of release 3.7 is the granting of special permission
+to copy the Xy-pic fonts and graphic specials inside documents, for
+example in DVI, PostScript, and PDF files. This has no practical
+significance except making current (reasonable) practice explicitly
+legal.
+
+Release 3.7 furthermore fixes a few bugs in release 3.6 and adds a few
+features: a "smart turning path" feature and an extension with macro
+expansion in kernel expressions and polygon shapes by George C. Necula,
+and the beginnings of an emulation of LaTeX picture mode proposed by
+Paul Burchard and Bill Richter.
+
+Special thanks to George Necula for the bug fixes and impressive
+extensions, to Bill Richter for extending Paul Burchard's pb-diagram to
+use Xy-pic as a backend and for contributing the `picture' feature, to
+Berthold Horn of Y&Y Inc. for releasing the copyright on their
+PostScript fonts, and to Pieter Donche and Marcelo Cunha dos Santos for
+the bug reports.
+
+-----------------------------------------------------------------------
+ AVAILABILITY
+-----------------------------------------------------------------------
+
+Xy-pic can be retrieved through the World Wide Web Xy-pic `home page':
+
+ URL: http://www.ens-lyon.fr/~krisrose/Xy-pic.html
+
+as well as by anonymous ftp from
+
+ CTAN: macros/generic/diagrams/xypic
+
+Check the README file in each location for specifics, in particular
+check that you have reached a version 3.7 copy (some archives take a
+while to mirror the latest files)!
+
+-----------------------------------------------------------------------
+ HISTORY & CREDITS
+-----------------------------------------------------------------------
+
+The first public release (version 1.40) of Xy-pic was created by
+Kristoffer H. Rose, DIKU, U of Copenhagen (now ENS-Lyon, France) and
+distributed via Usenet on December 19, 1991. This quickly became
+version 2 of which version 2.6 was the stable for sevarl years.
+
+The thorough rewrite that became version 3 is a continued
+collaboration with Ross Moore, Macquarie U, Sydney, initiated through
+a visit to Macquarie (Jan-May 1994 supported by the Australian
+Research Council, Macquarie University, and using donated DEC
+equipment). However, full backwards compatibility is maintained
+(except for the unavoidable but fully documented obscure cases).
+
+Xy-pic is Copyright (c) 1991-1998 by Kristoffer H. Rose and 1994-1998
+by Ross Moore under GNU COPYLEFT (GPL) which means that you can use
+the package for any purpose but if you provide the macros or any code
+derived from them to a third party then you are obliged to include the
+entire Xy-pic package (full details in the file COPYING). The
+PostScript fonts are additionally Copyright (c) 1997 Y&Y Inc. The
+FONTCOPYING file details the special permissions to distribute fonts
+without the full requirements of the GPL.
+
+-----------------------------------------------------------------------
+
+ This is the end of the announcement. Enjoy Xy-pic!
+
+-----------------------------------------------------------------------
diff --git a/Master/texmf-dist/source/generic/xypic/VERSIONS b/Master/texmf-dist/source/generic/xypic/VERSIONS
new file mode 100644
index 00000000000..8dd98c1cd2e
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/VERSIONS
@@ -0,0 +1,103 @@
+$Id: CATALOG.doc,v 3.6 1998/03/06 04:29:05 krisrose Exp $
+$Id: INSTALL,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+$Id: INSTALL.OzTeX,v 3.4 1997/05/18 01:13:24 ross Exp $
+$Id: INSTALL.Textures,v 3.4 1997/05/18 01:13:24 ross Exp $
+$Id: MAKE,v 3.5 1997/05/28 22:40:26 krisrose Exp $
+$Id: Makefile,v 3.7 1999/02/16 15:12:50 krisrose Exp krisrose $
+$Id: README,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+$Id: TRAILER,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: dvitogif89a,v 3.5 1997/05/28 13:05:01 krisrose Exp $
+$Id: install-tds,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: latin1.sty,v 3.4 1997/05/18 03:04:44 krisrose Exp $
+$Id: movie.cls,v 3.4 1997/05/18 01:14:25 krisrose Exp $
+$Id: pnmrawtopcropwhite.c,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: pnmrawtopcropwhite.c,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xy.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xy.sty,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xy16textures.doc,v 3.3 1996/12/18 14:21:23 ross Exp $
+$Id: xy17oztex.doc,v 3.3 1996/12/18 14:21:23 ross Exp $
+$Id: xy2cell.doc,v 3.3 1996/12/18 14:21:23 ross Exp $
+$Id: xyall.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xyarc.doc,v 3.4 1997/05/18 01:13:24 ross Exp $
+$Id: xyarrow.doc,v 3.5 1997/05/28 13:05:01 krisrose Exp $
+$Id: xyatip.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyatip10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xybsql10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xybtip.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xybtip10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycirc10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycm.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycmactex.doc,v 3.3 1996/12/18 08:54:25 ross Exp $
+$Id: xycmat10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycmat11.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycmat12.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycmbt10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycmbt11.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycmbt12.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xycmtip.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xycolor.doc,v 3.3 1996/12/19 03:50:08 ross Exp $
+$Id: xycrayon.doc,v 3.3 1996/12/18 08:58:16 ross Exp $
+$Id: xycurve.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyd.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyd2.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xydash10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xydoc.bib,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+$Id: xydoc.sty,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xydocps.doc,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+$Id: xydummy.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xydvidrv.doc,v 3.3 1996/12/18 09:12:40 ross Exp $
+$Id: xydvips.doc,v 3.3 1996/12/18 09:13:14 ross Exp $
+$Id: xydvitops.doc,v 3.3 1996/12/18 09:14:36 ross Exp $
+$Id: xyemtex.doc,v 3.3 1996/12/18 09:18:00 ross Exp $
+$Id: xyeuat10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyeuat11.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyeuat12.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyeubt10.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyeubt11.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyeubt12.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyeuler.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyframe.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xygraph.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyguide.man,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+$Id: xyidioms.doc,v 3.4 1997/05/18 01:14:25 krisrose Exp $
+$Id: xyimport.doc,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+$Id: xyknot.doc,v 3.4 1997/05/18 01:13:24 ross Exp $
+$Id: xylatex.ini,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xyline.doc,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+$Id: xyline10.mf,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xymacpat.xyp,v 3.3 1996/12/18 09:25:21 ross Exp $
+$Id: xymatrix.doc,v 3.4 1997/05/18 01:14:25 krisrose Exp $
+$Id: xymisc10.mf,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xymovie.doc,v 3.5 1997/05/28 13:05:01 krisrose Exp $
+$Id: xyoztex.doc,v 3.3 1996/12/18 09:26:26 ross Exp $
+$Id: xypic.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xypic.map,v 3.7 1999/02/16 15:12:50 krisrose Exp krisrose $
+$Id: xypic.sty,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xypoly.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-c.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-col.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-f.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-l.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-pro.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-ps.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-r.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-s.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps-t.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyps.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xypsdict.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xypspatt.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyqc10.mf,v 3.0 1995/07/07 20:14:21 kris Exp $
+$Id: xyrecat.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xyrefer.man,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xyrotate.doc,v 3.3 1996/12/18 09:40:16 ross Exp $
+$Id: xytech.mf,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+$Id: xytest.mf,v 3.3 1996/12/19 04:33:25 krisrose Exp $
+$Id: xytex.ini,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+$Id: xytextures.doc,v 3.3 1996/12/18 09:41:45 ross Exp $
+$Id: xytile.doc,v 3.4 1997/05/18 01:13:24 ross Exp $
+$Id: xytips.doc,v 3.3 1996/12/19 04:12:13 krisrose Exp $
+$Id: xytp-f.doc,v 3.3 1996/12/18 09:49:07 ross Exp $
+$Id: xytpic.doc,v 3.3 1996/12/18 09:50:38 ross Exp $
+$Id: xyv2.doc,v 3.4 1997/05/18 01:14:25 krisrose Exp $
+$Id: xyweb.doc,v 3.3 1996/12/18 09:52:11 ross Exp $
+$Id: xyxdvi.doc,v 3.3 1996/12/18 09:53:22 ross Exp $
diff --git a/Master/texmf-dist/source/generic/xypic/doc2tex.com b/Master/texmf-dist/source/generic/xypic/doc2tex.com
new file mode 100644
index 00000000000..c8d8f04f8be
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/doc2tex.com
@@ -0,0 +1,114 @@
+$!+++
+$!
+$! DOC2TEX.COM
+$!
+$! This procedure creates the *.TEX files from the *.DOC files of the XYpic
+$! package. It must be run from the XYpic source directory.
+$!
+$! R.Gaertner, based on personal communication with K.H.Rose
+$!
+$!---
+$ set noon
+$!
+$! loop over all files
+$!
+$file_loop:
+$ file = f$search("*.doc",1)
+$ if file .nes. ""
+$ then
+$ write sys$output "processing ''file' ..."
+$ !
+$ ! get the filename and open a temporary work file
+$ !
+$ name = f$parse(file,,,"NAME")
+$ open/write tmp 'name'.tmp
+$ open/read src 'file'
+$ !
+$ ! set control flags
+$ !
+$ hdr = "TRUE"
+$ skip = "FALSE"
+$ !
+$ ! loop through the source file
+$ !
+$ line = ""
+$loop:
+$ read/end=end_loop src line
+$ if hdr
+$ then ! copy the lines from start to the first "\DOCMODE" line
+$ if (f$length(line) .ge. 8) .and. (f$extract(0,8,line) .eqs. "\DOCMODE")
+$ then hdr = "FALSE"
+$ skip = "TRUE" ! stop copying
+$ goto loop
+$ endif
+$ ! the first \DOCMODE-line may also indicate the start of the body part
+$ if (f$length(line) .ge. 9) .and. (f$extract(0,9,line) .eqs. "\DOCMODE(")
+$ then skip = "FALSE" ! start copying
+$ goto loop
+$ endif
+$ else ! extract the lines between "\DOCMODE(" and "\DOCMODE)"
+$ if (f$length(line) .ge. 9) .and. (f$extract(0,9,line) .eqs. "\DOCMODE(")
+$ then skip = "FALSE" ! start copying
+$ goto loop
+$ endif
+$ if (f$length(line) .ge. 9) .and. (f$extract(0,9,line) .eqs. "\DOCMODE)")
+$ then skip = "TRUE" ! stop copying
+$ goto loop
+$ endif
+$ endif
+$ !
+$ ! skip empty lines
+$ !
+$ if f$edit(line,"COLLAPSE") .eqs. "" then goto loop
+$ !
+$ ! skip comment lines (starting with a single percent character)
+$ !
+$ if (line .eqs. "%") .or. -
+ ((f$length(line) .ge. 2) .and. -
+ (f$extract(0,1,line) .eqs. "%") .and. -
+ (f$extract(1,1,line) .nes. "%")) then goto loop
+$ !
+$ ! all preprocessing & checks done, copy the input line
+$ !
+$ if .not. skip then write tmp line
+$ goto loop
+$ !
+$ ! close source & work file
+$ !
+$end_loop:
+$ close tmp
+$ close src
+$ !
+$ ! convert the work file to standard text format and delete the work file
+$ !
+$ if f$search("text.fdl",2) .eqs. ""
+$ then create text.fdl
+SYSTEM
+ SOURCE OpenVMS
+
+FILE
+ ORGANIZATION sequential
+
+RECORD
+ BLOCK_SPAN yes
+ CARRIAGE_CONTROL carriage_return
+ FORMAT variable
+ SIZE 0
+
+$ endif
+$ convert/fdl=text.fdl 'name'.tmp 'name'.tex
+$ delete/nolog 'name'.tmp;*
+$ !
+$ ! process the next source
+$ !
+$ goto file_loop
+$ endif
+$ write sys$output "all done"
+$!
+$! clean up
+$!
+$ delete/nolog text.fdl;*
+$
+$ exit
+$!
+$! End of DOC2TEX.COM
diff --git a/Master/texmf-dist/source/generic/xypic/dvitogif89a b/Master/texmf-dist/source/generic/xypic/dvitogif89a
new file mode 100644
index 00000000000..f413b853fa9
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/dvitogif89a
@@ -0,0 +1,207 @@
+#!/bin/sh
+# $Id: dvitogif89a,v 3.5 1997/05/28 13:05:01 krisrose Exp $
+#
+# Pack consecutive pages of TeX DVI file as GIF89a animation.
+# Copyright (c) 1996-1997 Kristoffer H. Rose <krisrose@brics.dk>
+#
+# This file is part of the Xy-pic macro package.
+# Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+# See the README and INSTALL files for further information.
+#
+# The Xy-pic package is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The Xy-pic package is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this package; if not, write to the Free Software Foundation, Inc.,
+# 675 Mass Ave, Cambridge, MA 02139, USA.
+
+NAME=`basename $0`
+SYNOPSIS="Usage: $NAME file[.dvi]"
+DESCRIPTION="Pack consecutive pages of TeX DVI file as GIF89a animation."
+
+# Crop efficiently if possible.
+#
+if [ -n "`which pnmrawtopcropwhite`" ]
+then
+ cropwhite="pnmrawtopcropwhite |pnmcrop -white"
+elif [ -x ./pnmrawtopcropwhite ]
+then
+ cropwhite="./pnmrawtopcropwhite |pnmcrop -white"
+else
+ cropwhite="pnmcrop -white"
+fi
+
+# Check files.
+#
+ok=yes
+#
+if [ $# -ne 1 ]; then ok=no; fi
+#
+dvi="$1.dvi"
+if [ ! -f "$dvi" ]
+then
+ dvi="$1"
+ if [ ! -f "$dvi" ]; then ok=no; fi
+fi
+#
+base=`basename "$dvi" .dvi`
+size="$base.size"
+#
+if [ ! -f "$size" ]
+then
+ echo $NAME": could not find $size file!" >&2
+ ok=no
+else
+ eval `cat "$size"`
+ if [ -z "$dpi" -o -z "$delay" ]
+ then
+ echo $NAME": could not interpret $size file!" >&2
+ ok=no
+ fi
+fi
+#
+if [ $ok = no ]
+then
+ echo $SYNOPSIS >&2; exit 2
+fi
+
+# Initialise.
+#
+echo "${NAME}: Animating $base."
+rm -f $base.ps $base.[0-9][0-9][0-9].*
+#
+exec 2>"$base.log"
+set -x
+#
+date "+${NAME} Animating $dvi (log started %c)" >&2
+
+# Produce PostScript file!
+#
+echo -n "Producing PostScript..."
+echo "Producing PostScript:" >&2
+dvips -D $dpi "$base.dvi" -o "$base.ps"
+if [ $? -ne 0 ]; then echo "failed, aborting"; exit 1; else echo "done"; fi
+echo '' >&2
+
+# Produce PPM files!
+#
+echo -n "Producing PPMs"
+echo "Producing PPMs:" >&2
+echo '' \
+| gs -sOutputFile="|$cropwhite >$base.%03d.ppm" \
+ -sDEVICE=ppmraw -r$dpi - "$base.ps" 2>&1 \
+| while read ln; do
+ echo "$ln" >&2
+ case "$ln" in
+ *cols*off*the*left) echo -n . ;;
+ esac
+ done
+if [ $? -ne 0 ]; then echo "failed, aborting"; exit 1; else echo "done"; fi
+echo '' >&2
+
+# Measure first image and alert user.
+#
+top=0 bottom=0 left=0 right=0 height=0 width=0
+eval `pnmcrop -black "$base.001.ppm" |pnmfile |\
+ sed -n -e 's/.*[ \t]\([0-9]*\) by \([0-9]*\).*$/ width=\1 height=\2/p'`
+length=`echo $base.[0-9][0-9][0-9].ppm | wc -w | tr -d " \t"`
+#
+echo "Animation has $length frames of ${width}x${height}."
+echo "Length: $length" >&2
+echo "Image size: ${width}x${height}" >&2
+
+# Convert to incremental GIFs!
+#
+echo -n "Producing GIFs"
+lastppm=
+for ppm in $base.[0-9][0-9][0-9].ppm
+do
+
+ echo -n "."
+ echo -e "\nImage: $ppm" >&2
+
+ # filenames
+ gif="`basename $ppm .ppm`.gif"
+
+ # crop black border [sic]
+ mv $ppm $base.000.ppm
+ pnmcrop -black $base.000.ppm >$ppm
+
+ # produce smallest GIF image and add to gifpack command
+ if [ -z "$lastppm" ]
+ then
+
+ # first bitmap is used directly
+ ppmtogif $ppm > $gif
+ gifpack="gifpack -delay $delay $loop -output $base.gif $gif"
+
+ else
+
+ # measure unchanged border
+ top=0 bottom=0 left=0 right=0 height=0 width=0
+ measures="\
+ `( pnmarith -difference $lastppm $ppm | pnmcrop | pnmfile )2>&1 \
+ | sed -n \
+ -e 's/.*cropping \([0-9]*\) .* \([a-z]*\)$/\2=\1/p' \
+ -e 's/.* \([0-9]*\) by \([0-9]*\).*$/width=\1 height=\2/p'`"
+ eval "$measures"
+
+ # if no change just pass top left pixel
+ if [ $width -lt 1 -o $height -lt 1 ]
+ then
+ width=1; height=1; left=1; top=1
+ fi
+
+ # add GIF with changed rectangle to animation
+ pnmcut $left $top $width $height $ppm | ppmtogif >$gif
+ gifpack="$gifpack +$left,+$top $gif"
+
+ fi
+
+ # prepare next image
+ lastppm=$ppm
+
+done
+echo "done"
+echo '' >&2
+
+echo -n "Packing GIFs..."
+echo -e "\nPacking animation:" >&2
+eval $gifpack >&2
+if [ $? -ne 0 ]; then echo "failed, aborting"; exit 1; else echo "done"; fi
+echo '' >&2
+
+# Clean up.
+#
+rm -f $base.[0-9][0-9][0-9].*
+
+# Done.
+#
+echo Done. >&2
+exit
+
+# $Log: dvitogif89a,v $
+# Revision 3.5 1997/05/28 13:05:01 krisrose
+# Fixed missing breaks bug.
+#
+# Revision 3.4 1997/05/18 01:14:25 krisrose
+# Essential bugfixes.
+#
+# Revision 1.3 1997/05/01 21:32:32 krisrose
+# Changed to exploit pnmrawtopcropwhite hack if available...
+# Output cleaned up; uses log file for the rest.
+#
+# Revision 1.2 1997/05/01 19:23:16 krisrose
+# Doesn't quite work...
+#
+# Revision 1.1 1997/02/11 04:19:23 krisrose
+# Initial revision
+#
+# Based on MakeTeXmovie...
diff --git a/Master/texmf-dist/source/generic/xypic/import1.eps b/Master/texmf-dist/source/generic/xypic/import1.eps
new file mode 100644
index 00000000000..8f0b61238b3
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/import1.eps
@@ -0,0 +1,1550 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 0 0 261 261
+%%Creator: Macintosh Mathematica Notebook Front End Version 2.2
+%%Title: Clipboard
+%%CreationDate: Thursday, 29 June 1995 7:24:17 PM
+%%EndComments
+150 dict begin
+/Mfixwid true def
+/Mrot 0 def
+/Mpstart {
+ MathPictureStart
+} bind def
+/Mpend {
+ MathPictureEnd
+} bind def
+/Mscale {
+ 0 1 0 1
+ 5 -1 roll
+ MathScale
+} bind def
+/Plain /Courier findfont def
+/Bold /Courier-Bold findfont def
+/Italic /Courier-Oblique findfont def
+/MathPictureStart {
+ /Mimatrix
+ matrix currentmatrix
+ def
+ gsave
+ newpath
+ Mleft
+ Mbottom
+ translate
+ 1 -1 scale
+ /Mtmatrix
+ matrix currentmatrix
+ def
+ Plain
+ Mfontsize scalefont
+ setfont
+ 0 setgray
+ 0 setlinewidth
+} bind def
+/MathPictureEnd {
+ grestore
+} bind def
+/MathSubStart {
+ Momatrix
+ Mgmatrix Mtmatrix
+ Mleft Mbottom
+ Mwidth Mheight
+ 9 -2 roll
+ moveto
+ Mtmatrix setmatrix
+ currentpoint
+ Mgmatrix setmatrix
+ 11 -2 roll
+ moveto
+ Mtmatrix setmatrix
+ currentpoint
+ 2 copy translate
+ /Mtmatrix matrix currentmatrix def
+ /Mleft 0 def
+ /Mbottom 0 def
+ 3 -1 roll
+ exch sub
+ /Mheight exch def
+ sub
+ /Mwidth exch def
+} bind def
+/MathSubEnd {
+ /Mheight exch def
+ /Mwidth exch def
+ /Mbottom exch def
+ /Mleft exch def
+ /Mtmatrix exch def
+ dup setmatrix
+ /Mgmatrix exch def
+ /Momatrix exch def
+} bind def
+/Mdot {
+ moveto
+ 0 0 rlineto
+ stroke
+} bind def
+/Mtetra {
+ moveto
+ lineto
+ lineto
+ lineto
+ fill
+} bind def
+/Metetra {
+ moveto
+ lineto
+ lineto
+ lineto
+ closepath
+ gsave
+ fill
+ grestore
+ 0 setgray
+ stroke
+} bind def
+/Mistroke {
+ flattenpath
+ 0 0 0
+ {
+ 4 2 roll
+ pop pop
+ }
+ {
+ 4 -1 roll
+ 2 index
+ sub dup mul
+ 4 -1 roll
+ 2 index
+ sub dup mul
+ add sqrt
+ 4 -1 roll
+ add
+ 3 1 roll
+ }
+ {
+ stop
+ }
+ {
+ stop
+ }
+ pathforall
+ pop pop
+ currentpoint
+ stroke
+ moveto
+ currentdash
+ 3 -1 roll
+ add
+ setdash
+} bind def
+/Mfstroke {
+ stroke
+ currentdash
+ pop 0
+ setdash
+} bind def
+/Mrotsboxa {
+ gsave
+ dup
+ /Mrot
+ exch def
+ Mrotcheck
+ Mtmatrix
+ dup
+ setmatrix
+ 7 1 roll
+ 4 index
+ 4 index
+ translate
+ rotate
+ 3 index
+ -1 mul
+ 3 index
+ -1 mul
+ translate
+ /Mtmatrix
+ matrix
+ currentmatrix
+ def
+ grestore
+ Msboxa
+ 3 -1 roll
+ /Mtmatrix
+ exch def
+ /Mrot
+ 0 def
+} bind def
+/Msboxa {
+ newpath
+ 5 -1 roll
+ Mvboxa
+ pop
+ Mboxout
+ 6 -1 roll
+ 5 -1 roll
+ 4 -1 roll
+ Msboxa1
+ 5 -3 roll
+ Msboxa1
+ Mboxrot
+ [
+ 7 -2 roll
+ 2 copy
+ [
+ 3 1 roll
+ 10 -1 roll
+ 9 -1 roll
+ ]
+ 6 1 roll
+ 5 -2 roll
+ ]
+} bind def
+/Msboxa1 {
+ sub
+ 2 div
+ dup
+ 2 index
+ 1 add
+ mul
+ 3 -1 roll
+ -1 add
+ 3 -1 roll
+ mul
+} bind def
+/Mvboxa {
+ Mfixwid
+ {
+ Mvboxa1
+ }
+ {
+ dup
+ Mwidthcal
+ 0 exch
+ {
+ add
+ }
+ forall
+ exch
+ Mvboxa1
+ 4 index
+ 7 -1 roll
+ add
+ 4 -1 roll
+ pop
+ 3 1 roll
+ }
+ ifelse
+} bind def
+/Mvboxa1 {
+ gsave
+ newpath
+ [ true
+ 3 -1 roll
+ {
+ Mbbox
+ 5 -1 roll
+ {
+ 0
+ 5 1 roll
+ }
+ {
+ 7 -1 roll
+ exch sub
+ (m) stringwidth pop
+ .3 mul
+ sub
+ 7 1 roll
+ 6 -1 roll
+ 4 -1 roll
+ Mmin
+ 3 -1 roll
+ 5 index
+ add
+ 5 -1 roll
+ 4 -1 roll
+ Mmax
+ 4 -1 roll
+ }
+ ifelse
+ false
+ }
+ forall
+ { stop } if
+ counttomark
+ 1 add
+ 4 roll
+ ]
+ grestore
+} bind def
+/Mbbox {
+ 1 dict begin
+ 0 0 moveto % str
+ /temp (T) def
+ { gsave
+ currentpoint newpath moveto
+ temp 0 3 -1 roll put temp
+ false charpath flattenpath currentpoint
+ pathbbox
+ grestore moveto lineto moveto} forall
+ pathbbox
+ newpath
+ end
+} bind def
+/Mmin {
+ 2 copy
+ gt
+ { exch } if
+ pop
+} bind def
+/Mmax {
+ 2 copy
+ lt
+ { exch } if
+ pop
+} bind def
+/Mrotshowa {
+ dup
+ /Mrot
+ exch def
+ Mrotcheck
+ Mtmatrix
+ dup
+ setmatrix
+ 7 1 roll
+ 4 index
+ 4 index
+ translate
+ rotate
+ 3 index
+ -1 mul
+ 3 index
+ -1 mul
+ translate
+ /Mtmatrix
+ matrix
+ currentmatrix
+ def
+ Mgmatrix setmatrix
+ Mshowa
+ /Mtmatrix
+ exch def
+ /Mrot 0 def
+} bind def
+/Mshowa {
+ 4 -2 roll
+ moveto
+ 2 index
+ Mtmatrix setmatrix
+ Mvboxa
+ 7 1 roll
+ Mboxout
+ 6 -1 roll
+ 5 -1 roll
+ 4 -1 roll
+ Mshowa1
+ 4 1 roll
+ Mshowa1
+ rmoveto
+ currentpoint
+ Mfixwid
+ {
+ Mshowax
+ }
+ {
+ Mshoway
+ }
+ ifelse
+ pop pop pop pop
+ Mgmatrix setmatrix
+} bind def
+/Mshowax {
+ 0 1
+ 4 index length
+ -1 add
+ {
+ 2 index
+ 4 index
+ 2 index
+ get
+ 3 index
+ add
+ moveto
+ 4 index
+ exch get
+ show
+ } for
+} bind def
+/Mshoway {
+ 3 index
+ Mwidthcal
+ 5 1 roll
+ 0 1
+ 4 index length
+ -1 add
+ {
+ 2 index
+ 4 index
+ 2 index
+ get
+ 3 index
+ add
+ moveto
+ 4 index
+ exch get
+ [
+ 6 index
+ aload
+ length
+ 2 add
+ -1 roll
+ {
+ pop
+ Strform
+ stringwidth
+ pop
+ neg
+ exch
+ add
+ 0 rmoveto
+ }
+ exch
+ kshow
+ cleartomark
+ } for
+ pop
+} bind def
+/Mwidthcal {
+ [
+ exch
+ {
+ Mwidthcal1
+ }
+ forall
+ ]
+ [
+ exch
+ dup
+ Maxlen
+ -1 add
+ 0 1
+ 3 -1 roll
+ {
+ [
+ exch
+ 2 index
+ {
+ 1 index
+ Mget
+ exch
+ }
+ forall
+ pop
+ Maxget
+ exch
+ }
+ for
+ pop
+ ]
+ Mreva
+} bind def
+/Mreva {
+ [
+ exch
+ aload
+ length
+ -1 1
+ {1 roll}
+ for
+ ]
+} bind def
+/Mget {
+ 1 index
+ length
+ -1 add
+ 1 index
+ ge
+ {
+ get
+ }
+ {
+ pop pop
+ 0
+ }
+ ifelse
+} bind def
+/Maxlen {
+ [
+ exch
+ {
+ length
+ }
+ forall
+ Maxget
+} bind def
+/Maxget {
+ counttomark
+ -1 add
+ 1 1
+ 3 -1 roll
+ {
+ pop
+ Mmax
+ }
+ for
+ exch
+ pop
+} bind def
+/Mwidthcal1 {
+ [
+ exch
+ {
+ Strform
+ stringwidth
+ pop
+ }
+ forall
+ ]
+} bind def
+/Strform {
+ /tem (x) def
+ tem 0
+ 3 -1 roll
+ put
+ tem
+} bind def
+/Mshowa1 {
+ 2 copy
+ add
+ 4 1 roll
+ sub
+ mul
+ sub
+ -2 div
+} bind def
+/MathScale {
+ Mwidth
+ Mheight
+ Mlp
+ translate
+ scale
+ /yscale exch def
+ /ybias exch def
+ /xscale exch def
+ /xbias exch def
+ /Momatrix
+ xscale yscale matrix scale
+ xbias ybias matrix translate
+ matrix concatmatrix def
+ /Mgmatrix
+ matrix currentmatrix
+ def
+} bind def
+/Mlp {
+ 3 copy
+ Mlpfirst
+ {
+ Mnodistort
+ {
+ Mmin
+ dup
+ } if
+ 4 index
+ 2 index
+ 2 index
+ Mlprun
+ 11 index
+ 11 -1 roll
+ 10 -4 roll
+ Mlp1
+ 8 index
+ 9 -5 roll
+ Mlp1
+ 4 -1 roll
+ and
+ { exit } if
+ 3 -1 roll
+ pop pop
+ } loop
+ exch
+ 3 1 roll
+ 7 -3 roll
+ pop pop pop
+} bind def
+/Mlpfirst {
+ 3 -1 roll
+ dup length
+ 2 copy
+ -2 add
+ get
+ aload
+ pop pop pop
+ 4 -2 roll
+ -1 add
+ get
+ aload
+ pop pop pop
+ 6 -1 roll
+ 3 -1 roll
+ 5 -1 roll
+ sub
+ div
+ 4 1 roll
+ exch sub
+ div
+} bind def
+/Mlprun {
+ 2 copy
+ 4 index
+ 0 get
+ dup
+ 4 1 roll
+ Mlprun1
+ 3 copy
+ 8 -2 roll
+ 9 -1 roll
+ {
+ 3 copy
+ Mlprun1
+ 3 copy
+ 11 -3 roll
+ /gt Mlpminmax
+ 8 3 roll
+ 11 -3 roll
+ /lt Mlpminmax
+ 8 3 roll
+ } forall
+ pop pop pop pop
+ 3 1 roll
+ pop pop
+ aload pop
+ 5 -1 roll
+ aload pop
+ exch
+ 6 -1 roll
+ Mlprun2
+ 8 2 roll
+ 4 -1 roll
+ Mlprun2
+ 6 2 roll
+ 3 -1 roll
+ Mlprun2
+ 4 2 roll
+ exch
+ Mlprun2
+ 6 2 roll
+} bind def
+/Mlprun1 {
+ aload pop
+ exch
+ 6 -1 roll
+ 5 -1 roll
+ mul add
+ 4 -2 roll
+ mul
+ 3 -1 roll
+ add
+} bind def
+/Mlprun2 {
+ 2 copy
+ add 2 div
+ 3 1 roll
+ exch sub
+} bind def
+/Mlpminmax {
+ cvx
+ 2 index
+ 6 index
+ 2 index
+ exec
+ {
+ 7 -3 roll
+ 4 -1 roll
+ } if
+ 1 index
+ 5 index
+ 3 -1 roll
+ exec
+ {
+ 4 1 roll
+ pop
+ 5 -1 roll
+ aload
+ pop pop
+ 4 -1 roll
+ aload pop
+ [
+ 8 -2 roll
+ pop
+ 5 -2 roll
+ pop
+ 6 -2 roll
+ pop
+ 5 -1 roll
+ ]
+ 4 1 roll
+ pop
+ }
+ {
+ pop pop pop
+ } ifelse
+} bind def
+/Mlp1 {
+ 5 index
+ 3 index sub
+ 5 index
+ 2 index mul
+ 1 index
+ le
+ 1 index
+ 0 le
+ or
+ dup
+ not
+ {
+ 1 index
+ 3 index div
+ .99999 mul
+ 8 -1 roll
+ pop
+ 7 1 roll
+ }
+ if
+ 8 -1 roll
+ 2 div
+ 7 -2 roll
+ pop sub
+ 5 index
+ 6 -3 roll
+ pop pop
+ mul sub
+ exch
+} bind def
+/intop 0 def
+/inrht 0 def
+/inflag 0 def
+/outflag 0 def
+/xadrht 0 def
+/xadlft 0 def
+/yadtop 0 def
+/yadbot 0 def
+/Minner {
+ outflag
+ 1
+ eq
+ {
+ /outflag 0 def
+ /intop 0 def
+ /inrht 0 def
+ } if
+ 5 index
+ gsave
+ Mtmatrix setmatrix
+ Mvboxa pop
+ grestore
+ 3 -1 roll
+ pop
+ dup
+ intop
+ gt
+ {
+ /intop
+ exch def
+ }
+ { pop }
+ ifelse
+ dup
+ inrht
+ gt
+ {
+ /inrht
+ exch def
+ }
+ { pop }
+ ifelse
+ pop
+ /inflag
+ 1 def
+} bind def
+/Mouter {
+ /xadrht 0 def
+ /xadlft 0 def
+ /yadtop 0 def
+ /yadbot 0 def
+ inflag
+ 1 eq
+ {
+ dup
+ 0 lt
+ {
+ dup
+ intop
+ mul
+ neg
+ /yadtop
+ exch def
+ } if
+ dup
+ 0 gt
+ {
+ dup
+ intop
+ mul
+ /yadbot
+ exch def
+ }
+ if
+ pop
+ dup
+ 0 lt
+ {
+ dup
+ inrht
+ mul
+ neg
+ /xadrht
+ exch def
+ } if
+ dup
+ 0 gt
+ {
+ dup
+ inrht
+ mul
+ /xadlft
+ exch def
+ } if
+ pop
+ /outflag 1 def
+ }
+ { pop pop}
+ ifelse
+ /inflag 0 def
+ /inrht 0 def
+ /intop 0 def
+} bind def
+/Mboxout {
+ outflag
+ 1
+ eq
+ {
+ 4 -1
+ roll
+ xadlft
+ leadjust
+ add
+ sub
+ 4 1 roll
+ 3 -1
+ roll
+ yadbot
+ leadjust
+ add
+ sub
+ 3 1
+ roll
+ exch
+ xadrht
+ leadjust
+ add
+ add
+ exch
+ yadtop
+ leadjust
+ add
+ add
+ /outflag 0 def
+ /xadlft 0 def
+ /yadbot 0 def
+ /xadrht 0 def
+ /yadtop 0 def
+ } if
+} bind def
+/leadjust {
+ (m) stringwidth pop
+ .5 mul
+} bind def
+/Mrotcheck {
+ dup
+ 90
+ eq
+ {
+ yadbot
+ /yadbot
+ xadrht
+ def
+ /xadrht
+ yadtop
+ def
+ /yadtop
+ xadlft
+ def
+ /xadlft
+ exch
+ def
+ }
+ if
+ dup
+ cos
+ 1 index
+ sin
+ Checkaux
+ dup
+ cos
+ 1 index
+ sin neg
+ exch
+ Checkaux
+ 3 1 roll
+ pop pop
+} bind def
+/Checkaux {
+ 4 index
+ exch
+ 4 index
+ mul
+ 3 1 roll
+ mul add
+ 4 1 roll
+} bind def
+/Mboxrot {
+ Mrot
+ 90 eq
+ {
+ brotaux
+ 4 2
+ roll
+ }
+ if
+ Mrot
+ 180 eq
+ {
+ 4 2
+ roll
+ brotaux
+ 4 2
+ roll
+ brotaux
+ }
+ if
+ Mrot
+ 270 eq
+ {
+ 4 2
+ roll
+ brotaux
+ }
+ if
+} bind def
+/brotaux {
+ neg
+ exch
+ neg
+} bind def
+/Mabsproc {
+ 0
+ matrix defaultmatrix
+ dtransform idtransform
+ dup mul exch
+ dup mul
+ add sqrt
+} bind def
+/Mabswid {
+ Mabsproc
+ setlinewidth
+} bind def
+/Mabsdash {
+ exch
+ [
+ exch
+ {
+ Mabsproc
+ }
+ forall
+ ]
+ exch
+ setdash
+} bind def
+/MBeginOrig { Momatrix concat} bind def
+/MEndOrig { Mgmatrix setmatrix} bind def
+/sampledsound where
+{ pop}
+{ /sampledsound {
+exch
+pop
+exch
+5 1 roll
+mul
+4 idiv
+mul
+2 idiv
+exch pop
+exch
+/Mtempproc exch def
+{ Mtempproc pop }
+repeat
+} bind def
+} ifelse
+% Here are the short operators
+/g { setgray} bind def
+/k { setcmykcolor} bind def
+/m { moveto} bind def
+/p { gsave} bind def
+/r { setrgbcolor} bind def
+/w { setlinewidth} bind def
+/C { curveto} bind def
+/F { fill} bind def
+/L { lineto} bind def
+/P { grestore} bind def
+/s { stroke} bind def
+
+/MFill {
+ 0 0 moveto
+ Mwidth 0 lineto
+ Mwidth Mheight lineto
+ 0 Mheight lineto
+ fill
+} bind def
+
+/MPlotRegion {
+ 3 index
+ Mwidth mul
+ 2 index
+ Mheight mul
+ translate
+ exch sub
+ Mheight mul
+ /Mheight
+ exch def
+ exch sub
+ Mwidth mul
+ /Mwidth
+ exch def
+} bind def
+
+/Mcharproc
+{
+ currentfile
+ (x)
+ readhexstring
+ pop
+ 0 get
+ exch
+ div
+} bind def
+
+/Mshadeproc
+{
+ dup
+ 3 1
+ roll
+ {
+ dup
+ Mcharproc
+ 3 1
+ roll
+ } repeat
+ 1 eq
+ {
+ setgray
+ }
+ {
+ 3 eq
+ {
+ setrgbcolor
+ }
+ {
+ setcmykcolor
+ } ifelse
+ } ifelse
+} bind def
+
+/Mrectproc
+{
+ 3 index
+ 2 index
+ moveto
+ 2 index
+ 3 -1
+ roll
+ lineto
+ dup
+ 3 1
+ roll
+ lineto
+ lineto
+ fill
+} bind def
+
+/Mcolorimage
+{
+ 7 1
+ roll
+ pop
+ pop
+ matrix
+ invertmatrix
+ concat
+ 2 exch exp
+ 1 sub
+ 3 1 roll
+ 1 1
+ 2 index
+ {
+ 1 1
+ 4 index
+ {
+ dup
+ 1 sub
+ exch
+ 2 index
+ dup
+ 1 sub
+ exch
+ 7 index
+ 9 index
+ Mshadeproc
+ Mrectproc
+ } for
+ pop
+ } for
+ pop pop pop pop
+} bind def
+
+/Mimage
+{
+ pop
+ matrix
+ invertmatrix
+ concat
+ 2 exch exp
+ 1 sub
+ 3 1 roll
+ 1 1
+ 2 index
+ {
+ 1 1
+ 4 index
+ {
+ dup
+ 1 sub
+ exch
+ 2 index
+ dup
+ 1 sub
+ exch
+ 7 index
+ Mcharproc
+ setgray
+ Mrectproc
+ } for
+ pop
+ } for
+ pop pop pop
+} bind def
+
+/Mnodistort true def
+/colorimage {Mcolorimage} bind def
+/image {Mimage} bind def
+/Mleft 0.000000 def
+/Mbottom 261.000000 def
+/Mwidth 261.000000 def
+/Mheight 261.000000 def
+/Mfontsize 12 def
+/Plain /Courier findfont def
+0 Mbottom Mheight neg add 2 mul Mheight add translate
+1 -1 scale
+%!
+%%Creator: Mathematica
+%%AspectRatio: 1
+MathPictureStart
+%% Graphics
+/Courier findfont 10 scalefont setfont
+% Scaling calculations
+0.378378 0.27027 0.378378 0.27027 [
+[ -0.001 -0.001 0 0 ]
+[ 1.001 1.001 0 0 ]
+] MathScale
+% Start of Graphics
+1 setlinecap
+1 setlinejoin
+newpath
+[ ] 0 setdash
+0 g
+p
+p
+.002 w
+.10811 .37838 m
+.10811 .38463 L
+s
+P
+p
+.002 w
+.24324 .37838 m
+.24324 .38463 L
+s
+P
+p
+.002 w
+.51351 .37838 m
+.51351 .38463 L
+s
+P
+p
+.002 w
+.64865 .37838 m
+.64865 .38463 L
+s
+P
+p
+.002 w
+.78378 .37838 m
+.78378 .38463 L
+s
+P
+p
+.002 w
+.91892 .37838 m
+.91892 .38463 L
+s
+P
+p
+.002 w
+0 .37838 m
+1 .37838 L
+s
+P
+p
+.002 w
+.37838 .10811 m
+.38463 .10811 L
+s
+P
+p
+.002 w
+.37838 .24324 m
+.38463 .24324 L
+s
+P
+p
+.002 w
+.37838 .51351 m
+.38463 .51351 L
+s
+P
+p
+.002 w
+.37838 .64865 m
+.38463 .64865 L
+s
+P
+p
+.002 w
+.37838 .78378 m
+.38463 .78378 L
+s
+P
+p
+.002 w
+.37838 .91892 m
+.38463 .91892 L
+s
+P
+p
+.002 w
+.37838 0 m
+.37838 1 L
+s
+P
+P
+0 0 m
+1 0 L
+1 1 L
+0 1 L
+closepath
+clip
+newpath
+p
+p
+p
+p
+p
+.006 w
+s
+s
+s
+s
+s
+s
+s
+0 .95591 m
+.04471 .93809 L
+s
+.04471 .93809 m
+.10223 .92042 L
+.16426 .90735 L
+.22976 .89945 L
+.29759 .89604 L
+.36661 .89539 L
+.43563 .89515 L
+.50347 .89293 L
+.56897 .88661 L
+.631 .87445 L
+.68851 .85514 L
+.74051 .82769 L
+.78612 .79131 L
+.82454 .74525 L
+.85514 .68851 L
+.87737 .61911 L
+.89086 .53158 L
+.89539 .38059 L
+s
+P
+P
+p
+p
+.006 w
+.89539 .37617 m
+.89664 .27804 L
+.90039 .21894 L
+.90657 .16913 L
+.91507 .12436 L
+.92574 .08289 L
+.93841 .0438 L
+.95286 .00657 L
+s
+.9558 0 m
+.95286 .00657 L
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+P
+P
+P
+P
+p
+p
+p
+p
+p
+.002 w
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+.69595 1 m
+.77208 .69545 L
+s
+.77208 .69545 m
+.85135 .37838 L
+.92484 .08443 L
+s
+.94595 0 m
+.92484 .08443 L
+s
+s
+s
+s
+s
+s
+s
+s
+P
+P
+P
+p
+p
+p
+.002 w
+s
+s
+s
+s
+s
+s
+0 .93436 m
+.03574 .92926 L
+s
+.03574 .92926 m
+.10219 .91976 L
+.17568 .90927 L
+.25494 .89794 L
+.33864 .88599 L
+.42532 .8736 L
+.51351 .861 L
+.60171 .8484 L
+.68839 .83602 L
+.77208 .82407 L
+.85135 .81274 L
+.92484 .80224 L
+.99129 .79275 L
+s
+1 .79151 m
+.99129 .79275 L
+s
+s
+s
+s
+s
+s
+s
+P
+P
+P
+p
+p
+p
+.002 w
+s
+s
+s
+s
+s
+s
+.02703 1 m
+.03574 .99129 L
+s
+.03574 .99129 m
+.10219 .92484 L
+.17568 .85135 L
+.25494 .77208 L
+.33864 .68839 L
+.42532 .60171 L
+.51351 .51351 L
+.60171 .42532 L
+.68839 .33864 L
+.77208 .25494 L
+.85135 .17568 L
+.92484 .10219 L
+.99129 .03574 L
+s
+1 .02703 m
+.99129 .03574 L
+s
+s
+s
+s
+s
+s
+s
+P
+P
+P
+p
+p
+p
+.002 w
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+.56757 1 m
+.60171 .96586 L
+s
+.60171 .96586 m
+.68839 .87918 L
+.77208 .79548 L
+.85135 .71622 L
+.92484 .64273 L
+.99129 .57628 L
+s
+1 .56757 m
+.99129 .57628 L
+s
+s
+s
+s
+s
+s
+s
+P
+P
+P
+p
+p
+p
+.002 w
+s
+s
+s
+s
+s
+s
+s
+s
+.15505 1 m
+.17568 .97937 L
+s
+.17568 .97937 m
+.25494 .90011 L
+.33864 .81641 L
+.42532 .72973 L
+.51351 .64154 L
+.60171 .55334 L
+.68839 .46666 L
+.77208 .38297 L
+.85135 .3037 L
+.92484 .23021 L
+.99129 .16376 L
+s
+1 .15505 m
+.99129 .16376 L
+s
+s
+s
+s
+s
+s
+s
+P
+P
+P
+P
+P
+.02 w
+.10811 .91892 Mdot
+.91892 .10811 Mdot
+.73874 .82883 Mdot
+.82883 .73874 Mdot
+.25747 .89758 Mdot
+.89758 .25747 Mdot
+P
+% End of Graphics
+MathPictureEnd
+%%PSTrailer
+end
+
+%%EPS Trailer
diff --git a/Master/texmf-dist/source/generic/xypic/install-tds b/Master/texmf-dist/source/generic/xypic/install-tds
new file mode 100644
index 00000000000..da1dd268d46
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/install-tds
@@ -0,0 +1,147 @@
+#!/bin/sh
+# $Id: install-tds,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+#
+# sh(1) installation of Xy-pic into a TeX Directory Structure system.
+# Copyright (c) 1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+#
+# This file is part of the Xy-pic macro package.
+# Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+# See the README and INSTALL files for further information.
+#
+# The Xy-pic package is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The Xy-pic package is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this package; if not, write to the Free Software Foundation, Inc.,
+# 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# check that we are in the right place (and get version :)
+
+# greet
+echo ''
+echo ' Welcome to the Xy-pic TDS-compliant installation script!'
+echo ' Copyright (c) 1997-1998 by Kristoffer.Rose@ENS-Lyon.FR'
+echo ' Xy-pic is free software: see the User's Guide for details.'
+echo ''
+echo ' The author has seriously tried to ensure the portability of'
+echo ' this script among all un*x platforms, however, if you experience'
+echo ' problems then don't hesitate to contact me.'
+echo ''
+echo ' See the file INSTALL for details about what this script does.'
+
+# record the argument as TEXMF
+: ${TEXMF:=$1}
+
+# if no TEXMF specified try to figure it out
+: ${TEXMF:=`kpsewhich --expand-var='$TEXMFMAIN' 2>/dev/null`}
+: ${TEXMF:=`kpsexpand '$TEXMFMAIN' 2>/dev/null`}
+: ${TEXMF:=`kpsewhich --expand-var='$TEXMF' 2>/dev/null`}
+: ${TEXMF:=`kpsexpand '$TEXMF' 2>/dev/null`}
+
+if [ -d "$TEXMF" ]
+then
+ echo ''
+ echo "TEXMF directory $TEXMF found."
+else
+ echo ''
+ echo 'ERROR: I could not find the TEXMF directory (tried '"$TEXMF"')!' >&2
+ echo 'Usage: ./support/install-tds [TEXMF]' >&2
+ echo 'Xy-pic installation aborted.'
+ exit 2
+fi
+
+# get confirmation
+echo ''
+echo ' This script will install Xy-pic under the indicated TEXMF tree.'
+echo ' We assume that it is the root of a standard TeX Directory Structure.'
+echo ''
+echo ' Also we asume that the commands find, grep, mkdir, and cp, conform'
+echo ' to their POSIX specification and can be found in the standard path.'
+echo ''
+echo 'Type <enter> to continue (anything else to stop - this is your last chance):'
+read reply
+if [ -z "$reply" ];
+then
+ echo ''
+ echo 'Thanks: proceeding with the installation.'
+else
+ echo 'Xy-pic installation aborted.'
+ exit 1
+fi
+
+# warn user about obsolete files
+echo ''
+echo 'Checking for obsolete files.'
+if [ -d "$TEXMF/dvips/xypic" ]
+then
+
+ files=`find "$TEXMF/dvips" -name "xy*.map" -print 2>/dev/null`
+ if [ -n "$files" ]
+ then
+ echo 'WARNING: xy*.map files exist:'
+ echo $files
+ fi
+
+ files=`find "$TEXMF/dvips" -name psfonts.map -print 2>/dev/null`
+ files=`grep -svl '^xy' $files /dev/null`
+ if [ -n "$files" ]
+ then
+ echo 'WARNING: psfonts.map xy*-font mappings exist in:'
+ echo "$files"
+ fi
+
+ files=`find "$TEXMF/fonts/type1" -name "xy*.pf?" -print 2>/dev/null \
+ | grep -v "$TEXMF/fonts/type1/public/xypic/xy.*[.]pfb"`
+ if [ -n "$files" ]
+ then
+ echo 'WARNING: xy*.pfa or xy*.pfb files exist:'
+ echo "$files"
+ fi
+
+fi
+
+# function for installing simple files in a directory
+installd () {
+ text=$1; shift
+ dir=`eval 'echo ${'$#'}'` # extract last parameter
+ echo "Installing $text in $dir."
+ if mkdir -p "$dir"; then cp -f "$@"
+ else
+ echo ' WARNING: could not make directory - files not installed.'
+ fi
+}
+
+# do the actual installation
+echo ''
+echo 'Installing Xy-pic!'
+
+installd "administrivia" \
+ README CATALOG TRAILER INSTALL* MANIFEST VERSIONS COPYING \
+ "$TEXMF/doc/generic/xypic"
+
+installd "macros" texinputs/* "$TEXMF/tex/generic/xypic"
+installd "font metrics" texfonts/*.tfm "$TEXMF/fonts/tfm/public/xypic"
+installd "font sources" mfinputs/*.mf "$TEXMF/fonts/source/public/xypic"
+installd "ps type1 fonts" type1/*.pfb "$TEXMF/fonts/type1/public/xypic"
+installd "ps pfm fonts" pfm/*.pfm "$TEXMF/fonts/pfm/public/xypic"
+installd "ps afm metrics" afm/*.afm "$TEXMF/fonts/afm/public/xypic"
+installd "ps headers" ps/* "$TEXMF/dvips/xypic"
+
+[ -d doc ] && installd "manuals" doc/* "$TEXMF/doc/generic/xypic"
+
+# done
+echo "Xy-pic installation done."
+exit
+
+# $Log: install-tds,v $
+# Revision 3.7 1999/02/16 15:12:50 krisrose
+# Interim release (Y&Y fonts now free).
+#
+# New with release 3.5...changed significantly for 3.6.
diff --git a/Master/texmf-dist/source/generic/xypic/kris.eps b/Master/texmf-dist/source/generic/xypic/kris.eps
new file mode 100644
index 00000000000..173f4e20770
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/kris.eps
@@ -0,0 +1,587 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /net/tyr/home/tyr1/kris/Kris/pictures/kris-icon.ps
+%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley
+%%BoundingBox: 0 0 66 86
+%%Pages: 1
+%%DocumentFonts:
+%%EndComments
+%%BeginPreview: 92 119 1 119
+% 5490000000003fffffffffff
+% 5249000080123fffffffffff
+% a924000124085fffffffffff
+% 5210800041412fffffffffff
+% 55450005bebb5bffffffffff
+% a810802af7fed5ffffffffff
+% 52a20017ffff7affffffffff
+% 550840b5ffffedffffffffff
+% 905100afffff573fffffffff
+% 550485bffffffeefffffffff
+% a950417fffffff5fffffffff
+% 920217dffffffd7fffffffff
+% 54a88abfffffb2afffffffff
+% a90457fffffffc7fffffffff
+% 52522efffffffffaffffffff
+% 94809fffffffffffbff7524f
+% 29143ffffffffffffffc000f
+% a522d5fffffffffffffa800f
+% 284977fffffffffff4fe040f
+% a510adffffffffffdd3f010f
+% 2a4357fffffffffff36fa00f
+% 512a57ffffa75ffebcbf800f
+% 5484b6ffff54af53febf400f
+% 89156affff454dedd56fc00f
+% 522aedfffe9256b6ff9fe00f
+% 95456bfffd44894d766fe40f
+% 201b72fff5505202addfe00f
+% 048a7fdffa0204295b37708f
+% 0014eabfd550008255dbb22f
+% 000afd57a02008095137a88f
+% 005cbd3fe808000254afd00f
+% 005aa92a80020000a12ad00f
+% 003ab555e1002204a84fd00f
+% 005e2ea1000000414801a88f
+% 0078f50a480000045257500f
+% 00fb9ae000000002a002f80f
+% 00f6fc90000000080883524f
+% 00fff54000000012a029f5bf
+% 01fff948000001200003bfff
+% 03fef42000000000a909ffff
+% 03fff940000000804005efff
+% 07fd7a12000000000883ffff
+% 03fdfc40000000001003f7ff
+% 07fff11000000000452cffff
+% 07fffa40000000001242bfff
+% 07fff9900000000000a8dfff
+% 07fffb400000000008053fff
+% 07ffffa0000000000000afff
+% 03fd6ba00000000000023fff
+% 03dcffc20000000040005fff
+% 039836d0000000000080bfff
+% 03525f800000001000093fff
+% 03009f1a0000490000003fff
+% 0300bf06800914000002bfff
+% 03102c41d0402a4800007fff
+% 030055003401ff0200b73fff
+% 050001000c0755a0022d7fff
+% 020004200304022009ffffff
+% 05000100008bc89003efffff
+% 03000000006282004f80ffff
+% 05000100002280081650ffff
+% 03008400002022400d667fff
+% 050000400000080819ccf3ff
+% 01000004002000080886ffff
+% 004000000040000010097fff
+% 02800400000000080920ffff
+% 008001000020000000047fff
+% 00c0000000211012044107ff
+% 006000040020000010100fff
+% 00e000000000000001000fff
+% 007001000010008008020fff
+% 007808000008000000405fff
+% 047c0000000401200408bfff
+% 003e0000000294000402ffff
+% 007c8100000000000301ffff
+% 003c000000000000014bffff
+% 007c0800000000080010ffff
+% 003e0020000000000200ffff
+% 003c0200000000800444ffff
+% 001c0000000000010800ffff
+% 002c0000000000083401ffff
+% 00090000000000015013ffff
+% 00180200002000004505ffff
+% 00040000000800001043ffff
+% 00080800002080000007ffff
+% 001a0100000210045427ffff
+% 000c000000100121000fffff
+% 003c000000000004680fffff
+% 003d040000040011c00fffff
+% 003e010000008000201fffff
+% 002f000000000000809fffff
+% 002f000000022001403fffff
+% 003b80000000000a803fffff
+% 001fc10000000002417fffff
+% 000ca0400000012080ffffff
+% 000ce0000000000502ffffff
+% 000350000000000011ffffff
+% 0002a8000000002487ffffff
+% 0000d4100000000007ffffff
+% 0200aa00000000010fffffff
+% 00004504000000841fffffff
+% 00002a81000000201fffffff
+% 00001540000020013fffffff
+% 00000540400000043fffffff
+% 00000a50000000007fffffff
+% 000000a810000000ffffffff
+% 0000010200200004ffffffff
+% 0000008a02000000ffffffff
+% 0000001480080401ffffffff
+% 0000002540020007ffffffff
+% 0000000aa0800017fffffdff
+% 000000012001508ffffa00ff
+% 0000000290040b7fffd100ff
+% 000000002000eafffff400ff
+% 00000000200255ffffc840ff
+% 00000000500082fdfff512ff
+% 00000000200000fffffb55ff
+% 00000000000003ffefffffff
+% 000000000000077fffffffff
+%%EndPreview
+%%EndProlog
+
+%%Page: 1 1
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% define space for color conversions
+/grays 92 string def % space for gray scale line
+/npixls 0 def
+/rgbindx 0 def
+
+% lower left corner
+0 0 translate
+
+% size of image (on paper, in 1/72inch coords)
+66.24000 85.68000 scale
+
+% define the colormap
+/cmap 256 string def
+
+
+% load up the colormap
+currentfile cmap readhexstring
+00 01 02 03 04 05 06 07 08 09
+0a 0b 0c 0d 0e 0f 10 11 12 13
+14 15 16 17 18 19 1a 1b 1c 1d
+1e 1f 20 21 22 23 24 25 26 27
+28 29 2a 2b 2c 2d 2e 2f 30 31
+32 33 34 35 36 37 38 39 3a 3b
+3c 3d 3e 3f 40 41 42 43 44 45
+46 47 48 49 4a 4b 4c 4d 4e 4f
+50 51 52 53 54 55 56 57 58 59
+5a 5b 5c 5d 5e 5f 60 61 62 63
+64 65 66 67 68 69 6a 6b 6c 6d
+6e 6f 70 71 72 73 74 75 76 77
+78 79 7a 7b 7c 7d 7e 7f 80 81
+82 83 84 85 86 87 88 89 8a 8b
+8c 8d 8e 8f 90 91 92 93 94 95
+96 97 98 99 9a 9b 9c 9d 9e 9f
+a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
+aa ab ac ad ae af b0 b1 b2 b3
+b4 b5 b6 b7 b8 b9 ba bb bc bd
+be bf c0 c1 c2 c3 c4 c5 c6 c7
+c8 c9 ca cb cc cd ce cf d0 d1
+d2 d3 d4 d5 d6 d7 d8 d9 da db
+dc dd de df e0 e1 e2 e3 e4 e5
+e6 e7 e8 e9 ea eb ec ed ee ef
+f0 f1 f2 f3 f4 f5 f6 f7 f8 f9
+fa fb fc fd fe ff
+pop pop % lose return values from readhexstring
+
+
+% rlecmapimage expects to have 'w h bits matrix' on stack
+/rlecmapimage {
+ /buffer 1 string def
+ /rgbval 3 string def
+ /block 384 string def
+
+ % proc to read a block from file, and return RGB data
+ { currentfile buffer readhexstring pop
+ /bcount exch 0 get store
+ bcount 128 ge
+ { % it's a non-run block
+ 0 1 bcount 128 sub
+ { currentfile buffer readhexstring pop pop
+
+ % look up value in gray map
+ /rgbval cmap buffer 0 get 1 getinterval store
+
+ % and put it in position i in block
+ block exch rgbval putinterval
+ } for
+ block 0 bcount 127 sub getinterval
+ }
+
+ { % else it's a run block
+ currentfile buffer readhexstring pop pop
+
+ % look up value in graymap
+ /rgbval cmap buffer 0 get 1 getinterval store
+
+ 0 1 bcount { block exch rgbval putinterval } for
+
+ block 0 bcount 1 add getinterval
+ } ifelse
+ } % end of proc
+ image
+} bind def
+
+
+92 119 8 % dimensions of data
+[92 0 0 -119 0 119] % mapping matrix
+rlecmapimage
+
+887b857f84988b9c96988b989d999ab1bbbca8bde2efee01ee8ef4f2f1dfe1e0ddccb1ab
+aac7dbe0cb83cbcccdcc8dcca5bab0b5b7bf945b020403000283020001001f00
+8a768378809e99989c9ea29889989cafb6b7b1bfd8f0ee01ee8eeff1f0dfe1dad7c9b6a9
+bdc8cfd1cc8ecccdced0cca6b0adb6bbba8f6a080004008103001f00
+847f787283948a949993a7a69a9b9dabacad84adb9deefee01ee9eedefebe0dcdddacaa7
+969aadb9beaeb7c3c9cdc0a5acafb4b6bd91740a08008400030502002000
+9482897a8a96959996ab9aa39da5aeaaaba6bcd9f1ee01eea1f1e9e3e0ddd8c3b4928999
+a5b5cab4a8a0a9b7b6a3a2a9aaa6aea58a8169412d10002200
+01800177909899989da8a299a0aaacaaabaab6d1ebee96eeeff2d9e2cfb0b4a594757173
+5d7278616c6d6374696c8f6c88728d9c84776d6859563428320600010082020100830002
+01001600
+8e8e82817e96989a9eaca3a4aca8abaa01aaacb4cfeaf0eeeddcd3cfae9f968877725049
+2e4e58413b12275a182c5844564d656b776f73868e593225000b0e0001008102001900
+8f8081837f9a959a99a89f9ea4a5aaabaa9baab1cce8f0ece0dec0c59d7f6a65575c2317
+0914230b1306253f000d960d3b091c53516a4e606b807231432903060100010e09001800
+
+8f898a8d849d979c98a696abaaa3aaabaaa3aab0cae8ece2d7c3a97d6c75887354200403
+000100010400030100090004012345476a6682666b6685665d45310400870003010a0009
+16001600
+a086958b8c9a9c9a96aca9a7a9aaacabada9b3cdeadad5a9957173816e433b3300028102
+000b009a4b77736f576c53656e706252583a37223005150a0d0005040002001100
+8986818c83988e9597a5a901a995a8aaacb6ada9c8e0c9a79173706f5c4b3b1b06020900
+0b009b022c60413c4d502b535774716d585c3d300610323f4b00020a0204001100
+a184998d869a9c9e979b9fa6a9a4a9aeb7b0a8c1c9a496806d69424d571e0d030b040009
+0001020100824811008f00333f5b5567635a6b31170002001100010083081e0e001200
+81848783878b949998999caea9a5b0aaaba7abada9b4ab9a7e736e585566401929000d00
+81020083001f36048b0433536d68706255452e01008100010301840f2b260c0085000301
+000200030084030002010082000401
+908f8487898f9b9998a79fa9a59faab1b9ac01ac8b99806162427177591a0003000d0001
+019108103d4166767d9998747162560a130001000300870900051e180b06000800850102
+00010401
+8282838882888d9997999aaba0a499a3abadb2aca09b956f43415e6647090001000e0081
+02008700100d22466a8b9c849c756a545f895f4f463c281b030100048604000c18305e00
+82000200040081010001008102000000
+9c8e8287898f9b9896a4a6aaa0abadaaaeaa9c8e84493b495929160306000f0001028200
+04009c0003060d0b0a0604082f55686a675d36050401030008110c284f1f050481040302
+03870b1710191f2e2f36
+86898b8981909a999799a7a6a3a79eabafaca39587692c445e33110018003d17001b0089
+03072a38423e634a0f00900003000102123e565365697c898b90958f858f9294929ea5
+9b938f908993999a999fa9ac9da7aeb9b499836e4d353f4d25002a4e0282021a001b0001
+0294002a1a343a2b23162d190f000530366273799faab888b8bbb7bcc4c9c3cbc900c9
+8e999790889b97989aa9a8a999aaada98fa97d7155506c754a241130191e0007001b0081
+03000100921e31324443556f35310423000435608ba7bece01ce86cbcdcfcecfcdcf00cf
+
+9e89938c879398969aacad9b9a9faba89472635f586266333f0002052a00030081000181
+010004008c03060100010004000100010300830001050002009c09000110222741486460
+857832160007121f5395c4cbcecbcccbcac9cc01cc00ce
+a0898e838a9c9d9896a2aba6989aaa9d857f7b777977525f180600082604000102038103
+0005008603050d0002000301038105010101820003009e00080b040300023e514d466974
+948f987852300d3c3563c5cccbc7cccbcacc81cccb81cbcc
+988b8f878e9897969aada6aea3a9a3837c897e8482686b2f010081000383030002008100
+018101000100910500060b0416461700204124140302010002810200980006010e062f19
+4b3c4e426f797781808273624a352c3493cb82cbcecd01cd84d0cdcecfcb
+9e8c9c85899799979aabaea5a7978582a28b8d797b845b0c2c2d03002429040181010381
+03000200b5030a56697fa1683047748492696809061831394c4146524660535b5a442a62
+6b828d75654c4e4a1600426ea1d3d6d9dadbdad9dde2dd
+858880858689999a9996a4a89d9e8e8b8e9887826c628747467c21001758310c00010003
+00b61c002f768295a69563827c7b928184443f474b5963607081513a5369555335536070
+8589695150152510226087c8d0ded8dbd4dadfd4d7
+8a9794928d9c9a969eaca9a197a19e85977e7a6e2d8166688b961706034a180902000402
+008e00085035668e8fa7aca57b8c957b89a28986674b504642525e696a696e3631495149
+545169718f785d4f2e1924122d60b7d9d086d0e1dadcd7cadc
+9d9095948e8f9a989aa8aa9d9c84816c8b754f237f4f8596540c214a2101008200010002
+00b70b614e748192a5aaa4918d989188909967656f7e6765676067625b6d272b51453943
+5d70818872643d3505140324a9c6d9d0ddded7d0cbcf
+9d8a968a9190969b99afab9ba08c5c7c78634d387b7a9c5b462d00080006008100018201
+2100b8003c667f667d8398b4b99e9687a0a79e91888e84968c8a858a7879855d5f3a6758
+5b525a7170847163242146130a216fd3d5cddadde0d4cbd9
+b1989e9d9aa09ca0a7afa9ae9775848075844a425b8d88453c4d200c143b0d000218341d
+42556b9596938b97929da9b2b1aa9aa79aa891a698aeb3b4bca997958a887c785f617c4e
+546178678c64531d0a2e4f2e3d90cfd5d7e0d0dd81ddd0
+babcbebfc0bcbfc1beb2b1a59c6e82689b8852223773625475251e542c54000600114c53
+4f7a628b97b09cabb2a8aab9c0c8c1bdba9a989da9aabdbba0bb929798908788786c866e
+4c4d985e616c6f26031b7344267ecdcac8c5cad0cdc5
+96eeedf3f5e9eaebe8ddcdbc977072989d783e2e645b5468bf68676b615e4a0f00021a42
+655f9b9597a1a9a6999fc6cfd9dad3cdd3c3b0abadbeaebab7b0a9a1999d8a7c7f719188
+835475745d5663720a1167714467a8aaae84aeaca1a0a9
+dbeeedf3f6ebecede5dbcfc587727ca89a62223a414b5669819b8470575f150e083b646c
+939db5b8aeac9d999ccddddbdcdad2dcd0c1c4d1cac8bac1bba5aa9d94837e7b769a9b97
+7d78766c5f665b4b004b896f6aa5afb0b4b0b3b8bd
+afebecedecefeeebdab089975c648a9895545e662f49608f90999c6b4a434c5037456287
+9aafbdc4cec4bcc2c3bcc0d2dea5dedbd2d4c7c6dbdccfcdc7caa8aba5949285898f92af
+a7a07e877b66564b5339047e8a7ababb85bbc0bfbdbbc3
+02f09aefedeee9daaa807a4e6188809b787e6155698e94929f94746a686592655f3a889f
+b0cdc8cec9cfcdd2dacdbbb9c7db8bdbcccfd4c7d8ded9e0dfd1b198b1ac9e8d7a8d9c90
+b0c0b39e8f958c66564a57125a9f77bccd82cdcecd82cdcfd1
+aae4dae9f0edf1e8d9a88e6a376e687e8fa188566389878a838788718b91856973536ba7
+cdcad2ced3cbd6dbb0dbdfdcd1c4b7c3c2c8e0cbd5d8d6d9ded1bbaea9978487899b91ae
+bebaa9a1a297695d675c425a8674b6d0ded6cccacdde
+a6dabce8ebecedddd2b4926c353e5494a99b8267716a5e78828c8f97a2a398847a939d91
+adbecdcc82ccdedf82dfdbdd94dddbd9d1cad3dee1d9d1d2d8d3dbd9bcadaa9599898489
+9299b9bb94bbb8a9a7ac99776b4968588d7baed0cdd7cfd2cfd4
+acdab1e6edebecddd1a0643c184477a39a837d776a50736f7f95aaa5aaa9a3aca3afb9bc
+b8bcb7d0cadbdce2e0de02de9ad9dadfd9dbe1d6c8ced7e0dac0aea19a968b868da4bbc2
+c4b8b4aa90aa9d7f6e576b598370b2cacdcbcfcdcfcd
+a5e3d5edebedefdbc368241c2f6b7e6a65567865396a7d8b8f6a7093a3b3bccbd3c7d6d3
+dee1de81dee387e3dedce4dee8f0ec85ece5e4f2e6df93dfddd1cfc3b9a698979d8a8e9b
+9cb3bdb8c6bebb91bbbfb59d33597d51674aa3cbc8ccc7cdcccd
+9fe6dbecedf2efe6ba2a0e2d1f536e6a6c63573c445a67a3946c8592a4bac3cbd688d6e1
+dcdfdee8e9ecf19ef1e9e3edefebe1edecf0ebeeefe5e3ddd9bcc09baa9f9b9496a0acb4
+cac2bc93bcbdb7c9c1ab5a49796671468bbdb9bbb9bbb8b9
+84e6d8eaedf29cf2d88f000400063052483c472c2b3c5076ad858782a0b1becac9d4dedb
+81dbde01de87e8f0e9e5f1efeae7a2e7edeee7e8f1efeee4dccebcccb79ea8abb8a3adaa
+a8b8bdd0c3b4bfb8bfbcc38628528a526655747c726a686a6760
+a0e3d4e8edefdcc25f0c00070035131f184207182e4b92b78c848da9b1c5cfcbceda86da
+dbdee1e6eaeeb2eee4ecedf1f0eeedeeebdfdee0ded4c4c5bda79ba4b2c0d1aaaca7aebd
+cdc9bfb6bbb9bfb4aa90132841513f480d00010001000000
+88eedae9eee8bb6808000100960301032d660f1423027095a79d8b9a95b9bdcfcededadd
+83dde1e7ef88efeeeceeecedf1f0ee89eeeff0ecdcccbfb2acaa84aab7c1d3dc97dccdb2
+9da5a9becad3c1babcb7ab9c958a6b0b06425256058105000300
+87ebdee9f3dfaa28000200960100385966323c121171969ba69899a5b8c3d0cedadfdb86
+dbdae9e3ebedee06ee81edef9eefe8d6c7b7bec8cddcdbdddee0d8bf96a6a5bbc5cacbbb
+cccac8be9d9c330086003d554d0301000300
+a9f0e0e5f6cd823000150200012d49666a55493201648baeb0ac94a9adc1cdcad9dddcdf
+e1eeecf0eeedee05ee86edeeeae0d5ccd485d4dddbdddbdc85dcdedbcba79c889cb1b7ca
+d0c2c5cbc98ac9ae5e000d0325475a02000400
+89efe0e5eed4830900190001008e42566862534b3849558dadb6b79eaa8eaabdcdcedfdd
+dfdce3ede9edecf0ee06ee8bedece6e9efe5dedbdcdedfde92dedbddc6be9d98a2a8b9cf
+cacdcec5b78139188618070e556908000400
+86ece3e5e9c84e0002009b0108121f454845000a416eb0a1adbbabb2abc8ced5dbdfdee2
+f0f6ed82edeaee02ee86edeff0edefeeef85efedf2e5dedb82dbdcdd03dd93c0cfbbada8
+948d97becab4a089918f933b42004083400002000300
+88f0dfe4ebad4f0701008200030085000b231b19009500357db58483b2a5aaa9d0ddd9dc
+dedcedecedf2ebee09ee01ef87edeee2dcdfdedcdd01dd97dbdecccbc9baa9b49e8a8f99
+9899979ea79e5467425224018101000300
+88f3dde7efb94a1f01000100850a06110607008d00191370aa65679f8dacbbd7e3de8ade
+dddcf4e6dae4e5f0e2ee01ee8fefeeeceaedf0edf0eeefecede3dfdedd02dd81dacc01cc
+8db6acb8b5aa969d9a999497a597758375644a058105000400
+86f1dee2e8bf2e00820004008200120001009a010200140a4c974e278178a9b9ccdcdedd
+dedfe4ebece1e8eee9ee01ee88edefebe1ebf1ecf0ee86eeefeeeae1d9dd03dd81c5cd94
+cdcfbbbdb7b6bec7bec0a9a09c94868070650001000400
+8af1e1d8f3d4522d0e0006009300030007110c1f0f3c2c6750017778a5bbe2d7dd02dd83
+e3e8e3e48fe4f6e4e9f1f0ebeeefe3e8f1eeedefeca1eceef0eaddd8e1dbdfdebcd1cbcc
+d1d6cdbebbcdcacdc5ba9e979e8a7772090203000300
+9ef1eae0f1db7c2205010b381a00176e574359427a56594c044f6d96b7d2dfdd04dd89e6
+eadbe8e1dbe7e4f0ed85edecefeaefed81edff83fff6eeef82efe4dc9adcdeddd3caccca
+d8dcdececddbd9cdccc4afa5ac986855000201000300
+81efee85eeebe8a5340096005c7c1c1571b4d36e4538347156400f22749abad1d6dd02dd
+01e081dfde84dee5dcdbe682e6edef88efe0e9f0ecf0f8feff92ffefeeefdce0dbdfddd9
+cbd1cfd8dbdedad5dd85ddd2c9bfb1ab84ab97574300820003000300
+9eeef1f0eceabd240b2d8994324c94bfe186695903550065701475a0bbcfccdd03dd86e6
+ded9e0dde0dd8addedeeefeee2dee2efeced83edfaffef9eeff0dfdedcdddee0dddfe0de
+e0dbdecedde0dcd1bfafa8a789361d010001000300
+01eea5ecefecbb560269afae6f8eb9acbb9a927f3c2901002192a1acc5c6cad7dbe0e3df
+dee5dddedd84dde1e2eae08ae0d9d3dfdbd8e1dee1e8eb85ebecebdbdfdd06dd8fe1e0e1
+d4dbdadccec3b1a5aa936211000600
+01eebcecefe8ba6301b4cfcdbbbfb7a095acba8c660c0004599db6a862509bb9e1dfddde
+dbdfdee7deddded3d1d2c9cbcec2b9baa9bbb8babdcfdce9d9dadbdd06dd83dfdbcedd01
+dd83cbc7b0a984a98a7201000600
+01eeacecefe6ae5329c8d2cabddfddc99c8981603c2b43407bb2bdcebf8549477bcce3de
+dbdfdadeddd7d3c9c7c5c4bf8fbfb4a69b8c949eabbbc3c1bec6c5d9dd05dd01da8dd0ca
+d5d8e0ccbdaca9a2825c01000600
+89eceef2efe3a74a47dbdab7dac8dfdad9baad79655733578885b8c9cad1cac3a1653a8d
+b7d4e3e0d9dac8ccbdc3bdc7b7b8a9a37f8c868289a6bac7aab9c3cfd6dfe0de86dedfda
+e3d0cbcc01cc88c4b7ae9baca57e19000700
+acf9f5f0efe098595cdde0d7c9dcded5c7abb29697757e8c87b2c7d1d0d2dddbc5946b3f
+67c4bfd1cdc6d6dadbcf93cfbe7f34190c110b15326ab0b7bcbea8b6ccdedc81dcdb8fdb
+ddd1ccc0b8ae9c84987678919f7a000800
+a8f0ecf0efd7976f6cdcdfd4d5ece3e2d1bbc7c0bbac9daa9dc5cecbdadddedfded8c1ad
+714a60b2d3d9aad9e0e5d0824d5d86958980746f7561529fbfbbbcc3cee1dfdddfd8d7bf
+bba39f988a664b677a86957f04000700
+9fecfdf3f0cb988d8adedbd3e0f1e5d6ced2e3d0d6cbb3ac9dbec9cccedddfe0deaadee1
+e2dfcaa46463cadcdadf876493a7a4ada8a5b19c9ea3b28d5db8d4dddfdee5d9d4ccc6a8
+9973492d07890709023743524b0002000600
+8df1f2f1eebb8f7f70e5dbe0eee0dd03dd8adacfc9bb9d9ac2cecbd0dd04ddb2dadee5dd
+c9979fbce2d69e774d8e718fc4ada2aba1aab4b2988cdbdde2f3e6d4d0caae7b53270a27
+58755a3b330500150001000600
+98f7eff5efb88a774edfdee9e4d7e1dfe1dbded3c9cfbaa6a3c985c9d2d7dddedd03dd93
+e4dfdeddd08f6d77d5b19d5789739ddef4b2a9a89da8bebdc1a2d9deebe0ccc4b9ae8471
+10047794a1b5b9ada96e37040201000600
+88f6eef2eeac8b753fdb93dbe2d7e7eff0ded6ded4d6d8c9b9b8c7cadfdcde81dedd02dd
+81dbed9bedf2dddbcdc067a2c5b6896b7cb3f1e1cfaea5b7d0c4cab6acdddedc95dcc4b4
+7b9d47248d9f999da2afbbc0ae6200010001000500
+9bfdebeae8a08e7537d5dddeddeeedf2e8cdd4e7dad7c8b5bccccfdadd05dd97d9deebec
+efeae2cb6dc7dbdde0d6cac3b9c1b6bebcc9cecc9cccd198ccdce1ddd4bc95635a78857a
+4fa0af718a91b1770706014903000400
+95fff8ecd9a2958547ccdddadcedefeceed8e0eee0dcca02ca82d7dedd05ddafd7deeef2
+eae8dda885d1dfdddfe0cecac0b8b3b8bec9dddacec988cbdcdedddac36366b68b58335c
+aad3756587957a048504018d9b54000300
+9bf1e9eddbc1b6a96fc6dbdde6e4f2edefdde9f1e0dbc9cfcaccdbd6dd05dd8dd9e4f0ec
+e5eeeaa3acdedcdbd8cc88cccecabfb7bfccd8db98dbd2b286d3dddcdddec35b79aea49c
+768ebcc382685e977b038403005a44000400
+82f0eee996e9dac9c69aa5d6dce3dde4e1e5d9ecf0ded3d0c9cccfda81dadd05dd8adfea
+e9eeefeee3a2aae0dc01dca8d5cdcac4c8d0d9dfe1d6deddcc95c2dcdedddccb769fbdcb
+d2baa9afad9f978aa778040500040005000300
+01ee8beff0e1dcc8b37accdfd6ddec87ecddc7e6f0decacc8fcccad0d7dfded4ccdbe0dc
+dee0edeff08df0e8deaeabdcdad6cbcdd4dedcde95dedcddd6d4dddcc8a7cdd8dddcd6c8
+a5b4babeb8b9bc01bc8bb0aab6b9440e2300170004000300
+01ee01ef89e9dbd0c05e99d4dde4f091f0ebd3eeefe5cacccbcad0d2d9d6d0cdd9dc83dc
+dde0edb2edecf2e8e6b08fdee3dad3dadfdedfdadbdedacededddbb1c1cdcfd9ddd7cfa9
+b4babcbbb4bbb9b7adb0bcb8685a720f5b01000400
+02ee01ea89dbd3c35f50c0e0ecf0ed8cedd9ecede1cbcccbcdd0ddd9d588d5d3dddee9e8
+edf1f0b2f0eee7dcc976d2dddeddd0dcdad3ccdcdddbcedcded9a1c6d7d1d8e0ded1b2b0
+bbc8c2babbbab8c2bebcb6b0c4c683840002000300
+01ee96f0eaecdbd7ca81088bdaeeefecf2deecf1dfcbcccacbd881d8de86decad0dcdef0
+ef81efeb8aebeff1ddf0e26cc4ddd9de84dedfdad4e08ce0dbdfd8d9e4dda5c9dbe0dfdd
+83ddcfb8bc83bcc0cdbb02bb8acdcec9bdd6f9fbe04603000400
+02ee8aeff1eee1ce890927bce7ef97efeaefe1efdfcdc9c6cedddbdce0ccd8dce2dfe4e9
+e6e8ef87efece5d8a69edfde82dedbd085d0cbdfe0dbe1a0e1dcedcbd2dae0d8d1d8d3d1
+c6afc2c7beb6bec3c9cdc7bfc2f3fdffe84d0004000300
+05ee8bdecfa6010035d0e0dcdeebf08bf0e0c9cabccadfdce0dbcddda2dde5eee0dee8f0
+efeeedefe9daa4d8e0dbded5d4d7dfecf0f3dec5b0d5e1dbe1dedadc95dcd5c9afb7c9ce
+cac2c6bfc4c9b9c0fcebcfbd0003000400
+01ee88ecefe5e0d7ceab320092008dd2dfdeebecf1dfc9cecacdd4deddded8df92dfdeee
+def0f4e2eaedefedf6e8daa0d5dcdfda98dae0dde5e0dcbcb3cbcfd1cbd4dee0dedfdad8
+aeb9c8cbcacc8bccc9bcccc4b996a0ab4907000500
+01ee88eff2d2acd2cbb476028b021589c9deeee9f4d9dfd2cabccadadce2e0d9e2eadcdd
+e3e6f0dde8edf0edeceee9b896c9dfdbdcd6dfddd9a09dcecdc7cdcad7dbdedfdadcd7b5
+adcbcacbcecbcac0b9bca84f964e000700
+01fc89fdffdbbae0dabd8d0c008c00389accdce1dfddd3cdc6d1dd8fdddcdddbdfe1e4f0
+efeeede6ebeceeef81eff08ff0e7ba898cbccabdbc969bb9cccec9cd99cdd6dfdadcdfd8
+dcd8bd67bdc9ccc8cbcacbc0b89d79320004000600
+01fe01ff82e2bede8adec38e07040132b3bab8bb94bbc9cbcdcacbd4dedfdbdddcdee0ed
+eeecf1e7eeef02ef8eeee9e7dcd6c8bbbcc7ced8c1c6dddc85dcded0daddde95deede5dd
+d7cba3678dc6cecbcacbc1ac6a00060007000600
+01ff89feffebcde3dcbf8c0d008b003bb3cadde0dfcac9cdcacc84ccd8dcdedd9adddbe2
+f1edeff0ebedf0f1ecedeadde2dbcad0dfe6f2e0e4cacedf01df90dbdedde0dcdbf3eadd
+d5ccaeb07f8faab685b6a185505f0082000d000700
+03ff90e7cde1dac4810a070041a9cbdcddded2cd01cd8ccad9e0dddbdedde4ebedefeaef
+02ef8ce4dfdde2dfd2cad4daedebefdd87ddd9cbdbe0dbdcdd95dddee0e2efecd9ddc8ac
+b9ccaf968b7f8ba2aeaf03018101000700
+03ff90ebd6e6dfd09811010044adccdbdadedbcda8cdcac9dedcdddcdee2eaf0eeede4e6
+f1ebeee4eae9ddd9c9d1e0def1ecede2dce0d3c5ced8dbdadfdc82dce3ef8fefdde1c9a6
+b4cacfd5cdc8c9ceb8ab028102000800
+03ffc5ecd3e5dcc9b143000449b3c6dddcdddec7cec9cad9dcdddcdee0e6eff1f0e6dde1
+e0e4eee0dcd1c8d4d9dfdaecf0eadadedce0dbc6cfcec0cad2d9e0e2e3dcdbb999a6cacc
+ce88ced3ccc8b7ae0003000800
+01ff98f4f6ecdae2dbc7bf93320576acc8dddbe1dcc0c9cecbd9dddc91dce4e8f0f4ebef
+e3f6e7dddee0c9cad4dedd01dd8be4f6eee3dbebdee1dedcddd985d9bec4c0bed090d0cb
+b8738dbdcccacdcecccecab5a802000900
+90fefdf7fdecdbeaddcdc0a1810582b7c9dc90dce0dcc5cccfced7dcdedcdee6efedefec
+90ecf0ebdbe1cddad9dbdfdddbdfe0e4dfeb96ebeee5e4dbd9decdcfcdc2b4bdc5b49161
+92acc3ccc9cb87cbcdcbbcad5502000900
+01ff98fbffecdff3e5d8bab6883d92b6ccdadddfddc5cbcccfd6dbdf8fdfdde4efebede3
+e1e2eadfd9cde0dedc02dca3dedddee1f3efeeedefebd9e2d6cccdbeaaa5947e6885a9b7
+bdc7cbcccdc7bcb2a51501000900
+92fafffdffecdfeeeadad0bb886e98bbc6d8dedd83ddc3cacc8eccd8dcdde2e7e4eaf0ef
+eddfeeefdc84dcd5ced5dba0dbd9e2dadfe6e3ecf0efecf3eddcdedbceccc8d4c2aea3a6
+95afacb9c2cccbc2bb84bbae7a07000a00
+03ff8cede1f0eedfdac19d86afc4d1dc84dcdeddc0cb88cbcdd0dedcdeebe7ee02ee99f0
+ede8e1d9d3c0bcbbced6dbdadfd8dbdfe6e7edefedf0dedad981d9ce92ceccc1bab2a6a5
+aebabdc9bcbbb9b39f0f01000a00
+82fcfdff8effeddff0eee4deccae629dbccfdfdc8cdcdbbfc3cccbd4dedcdadcddee04ee
+8defe2dbdecec2a19db0b6b7c0c7cb86cbcedee0e3dfd983d9e4dfd692d6cbccc9b7b4ab
+afb9bcbac3bdbcc1bb7307000b00
+82fbfdff99ffeddef1edeae4cea23397bad0d8dddfdac9c4cfcbd2dae0dae381e3ee02ee
+a0f1efedf1e3dadeccb0afc2b3aeaab9b7bcc9cdcfd0cbd0cecadbd4d1c7ccc0b7ac84ac
+aebec4ca88cac4bfd1aa1b0003000a00
+03ff95edddf2ecede1d165238cbdcbdddbdedfd0c5cec7dade02de81e0ee02ee01ec01ee
+a7eadce8e7d4bce1d3dfd0cac0babecacecbcdc2bdbac0bdbbbcabac9b9d9aa6bfccd7c9
+cbd0cb9300820008000a00
+02ff84fde8dfeff089f0df9121236bb6d2d6de90deddd8c8cbcdd7dde0dddfebf0f1efed
+ee02ee92ecdbefeee9d4cbc3e7deddd5e4ead5dbd2bbc382c3b5a891a8aba69a8c88858f
+b7cdddd6cfc7d5bf1300820004000a00
+03ff83ecdfeff08ef0db54072327a8cacedcdfded8c8cb83cbd3dade87dedbe6e3f0efea
+ee01eeabefece0efedf0e4bdbbc8c9dbd7e3f1e3efeadef0e8d4b6bfb0a390685e8bbcdc
+dddee0c9cdbfb702050002000a00
+87fdfbfffeeddfeff091f0ba3550082b55b4cad8dcdfdccecccdd9df88dfdcdbdcdff0ee
+edee01ee01eb8ee5eaedeeecd0c2bbb6c9cae1efeeef90efecfffaeedfe9deb5c37b98ab
+c6dcdedc85dcc9c4be8800820002000b00
+82fefbff97ffe8dff7f5eb95409e322f359acfdeddf2dbd5c7cbd8ddde87dedddbe9eff1
+eaee01ee95ecf3ebedeff0ecd9cac4bcb9bccfdddeefeceefbfaed8aedf3dac8b9889eb6
+d0dedc01dc84c8b8aa39000e00
+81fbff01ff92f2e6fbf4f09c2f5c324c2651d5d0dbece2d9cc88ccd8dddedfdae3d7e882
+e8f0ee02ee85f0e9efeeefed98eddbcec4bac0cdcabfdbe1e8eceee8f0edc5988a8f97ba
+d7de86dedcd7c1b288000f00
+82fbfcff97fff6eaf1faf0b9552e2c54293c69d1d8dfead8d4cedadedd82dddbe584e5de
+f1ebee01ee84efedecefeea2eeefeeebe3dacac5cfd8cfc8cecfcdd2d3c7af988f988f9a
+c8dedddcdecdaaa90201000e00
+81f8ff93fffeeef2edfde1cba24a162e39315180d9deeedb8cdbd0dadedddbdedddbdee8
+f0ee01ee01ec83eeecf0ee98eeedf1ece0dbd5d0ddd9d4d3bbbec3c0c4b7aa9a8d8ea9cf
+dd88dde0d4b7a50f000a000e00
+82f8fcff95ffeeebf1efc9dfdd943d509ba0545b8becdfe8dacedb82dbe0dd01dd88e3e2
+ecefeee1eeefee82eef0ee01ee81f0ee8ceee8e4dddcddd8cdc9b8bab8b987b9acab9e90
+98b8ce87cedbd6b9a05505001000
+9bfcfffefff1eff2eed5e4e3d46863a999545260a6f0ede6e0d9dbdcdd01dd87ded9e6ed
+f0e1e5ef01ef81edee02ee9bedefeae1dedcdfdbdad2cacdcac2b4ada0908d9dc3cecfcd
+b7a19a00820003000f00
+81feff01ff96fbeaefdbedf0ebf1d682656d72637367d5e8efdfced8dd02dd8ad8dee2da
+dfebe3e8ecf0ee02ee81efec87eceaf0eadcdedfdd94dde1cccecbceb8b7adabb8bccacb
+c6ac980a0601001000
+81feffa2fffef9e9dacbe0dfdde6e7c3747f6c767b7d90bcfaf5dcdedddadddedfdedbde
+dfe0da81daef8eeff2eff0eedbeae6eeefedeadfdbde91dedccccbc9cec1bac2b6bfbdd4
+cba9a11b028102001100
+81fcff01ff88f2dbc2c6ede0c6d2f090f0b97769748779747bbcf8e4ddd3d7d8dd01dd01
+de8ce1e2dde1deefedeeeceee2eef081f0ee97eef0eddcdeddcccbc3cfcdc1bbb9b0bccc
+d1ce89150002001200
+a5f7fefffce9dcc7d8eddfdbeadcf3f4ad7277829a777b88c2feedd8d4dee0e2dddfdbdf
+e0dddc8bdce4eff1ecf2e3e4e7f1eeec87eceedcdedcd5cdcc8cccc9bebac0bfc2cbcac1
+3005001400
+89fcfdf5edddccd9c9dfd99ad9f3eef4feeb7f7d93ea977b8284dffff3e3cecdd6cedcde
+dcdddc8fdcdfdee7f0edf0dae0dce8edf0eceedd89dddbcecccacccabfbcba85bacbccc0
+9d00820001028102001100
+81f0eca2ecf2d9ddd6d1ead8e0f0f3edf1fef19a89907672778c87bbfffbf3d5cecad4e1
+dedcdd03dd01ef8dedeee4dfdcdfe4dddfdbdfd7c8ca8bcac4c7c8bfbbbcd1cca0100016
+00
+82efebeda1ede5ece2ddece0eeeadee8f1f9ffe999837b7a7d748e87bdfcf5f2d6cdcecc
+d9dfdd03dd84e1ecefdddb82dbdfdd85dddadfdcded981d9cb01cb88c5bcbeb8c3cebc68
+001700
+02ef9dfadbdcdde9f1e4f5e8e9e2ebf5f8f9f09c878c827e878398b0fffbffd8cb84cbd0
+dddcdd02dd8bdce0efdfdbe1dfdedddedfdd88dddcdfd1cfcccdbfae87aec8c7a8000801
+001500
+8eeff5fcfdf3e6dcdfe1d7f4f6e1dbf181f1ff01ff85ee8f9c88828785878a8dbff7ff86
+ffddd1ccd1dedd02dd8edadddff0e5f0e2dcdddedbdedddedb8ddbddd7d2c8bcb8bcba76
+0a0007001500
+04ff81f7ec8aecf0d3d4d8ecf0e1f0eefdaffdffefaa8f9087998b8c849bc2f7faf4dbc7
+d5dddfd9d2d9dedfdbdde7eae2e0e3e2e1dfdddadddedddaccc3babb81001900
+01fd02ff8cfce6ddf9d8f2ebe1e8f4f7f1ff01ff99fcf3b08d93e2de9b968c9ab8fafffa
+dacbcfd9d4dcd2c9d1dddc8adce7ebe9efede7dbdddcde84dedde0c9c183c1af50001900
+
+03ff87fefffadef0dcecfb87fbecedf8f2fffeff8dfffafeb194d5da98918d869ee3ff94
+fff6d0cbcecacfcbcfced7e1dcdeecefeef0e2dcdd83dddfdedd87ddd5c1b0be00080018
+00
+05ff8ffef9f7deefecfff9eff1eff5fffdfffd93fdfaaa9d9b9295848f8290d5fdffe9ce
+c8ccc6cd86cdcbc7d9dfdbdd91dddfdedadedde1dce0dbdfc4b89f5b0005000500010183
+02000200860001000100010001008302000600
+06ff8cfeffe1faffefeaf1edd5dae6ff81fffe88fefcfbe1a7958d868b818b8c838c9cde
+fc84fce2cccace86cec7babec6d0e082e0dee081e0da8adadddfd9ded2bb992407000c00
+820102008200030003008304000300
+08ff8ce8fae5e9e0f1ecd9e9e7e9feff02ff85fde8af93898585858c8586b0ff90fff8e3
+ccc9ceccbcbabdbfcccfcdd4d1cf8ccfd7d0ced3bea2320c04000a000100030181030001
+0084030408253d833d5d63718371650001810100
+07ff8dfdebf1edebdcf0ece2ebfdfffdff01ff8cfbfffefaa79c9686838d88a9ff01ff91
+f5ddd2c9cfbebbbaaeabb1b0babcc7ccbcbd84bdb1a321008400026b020001000301900b
+294c667d8699a0acbab8bfccc3b214000100
+08ff85fae0f7eeeaef84efe0e6fdff82fffaff04ff90e4b59189a5aa8b9afefffdffede3
+d4cfb9acb9b4afa19c968a868a87927c6367530a0100164a0402082a243e33273c6a7d95
+a4a9adb9bbc4cecdcfceca08000100
+09ff8aefdaf4f9eaf6e8e3ecefff05ffa3fcffeecc8febe6949ffffefffefffadecac2b8
+a69b867f778f86858a68405a27220003009a00030001000a280f0022435f7e96a0adb1c1
+c7c9cbccd0d2ca0001810100
+08ff81feff8bffdbebf4fef1f2f6f9ecf3ff03ff82fefdfe84fef39689868286f9ff01ff
+93fefcffe7c1bdb2a88b6e8988918786622c2605008a000d0900040001000911088c0823
+4874829aa3acb9c5c7c9cb81cbcd85cdae01000300
+0bff8bfdf0ecedeefbf5e5ebfffcff05ff86feffe08e7271ff04ff90fefad1b7c0ac99a7
+c8c2a89e8d793e0e0001008559a516000100050090244f668695a1a7b4bbbebdbbb9bea5
+08000100
+0cff8afdfffde7f0fcf2e6eceeff05ff81fdff85ffefa687fbff05ff8defe4bfc4abd1f1
+ece8dec1850300020087236e070100021b0003008a03051a5460686d7a82888985898281
+4103000100
+0cff8aefe2f4e3d3eefedce4f2ff05ff81fdff01ff82fbc0ff05ff8efcfaebe4bfc2e7f0
+efeecf862f04000100810600820002008300057b00040081030003008406050301038403
+060001000100
+0cff8afaebefe7ebeae5f6f3eeff06ff81feff83fffcfdff03ff99fefffedfeef4dfceff
+f3ed8335371d890602010201000a00010006008104008200010082000100820002000400
+810200
+
+%
+% Compression made this file 93.96% of the uncompressed size.
+%
+
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
diff --git a/Master/texmf-dist/source/generic/xypic/latin1.sty b/Master/texmf-dist/source/generic/xypic/latin1.sty
new file mode 100644
index 00000000000..c337fb139e9
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/latin1.sty
@@ -0,0 +1,242 @@
+%% $Id: latin1.sty,v 3.4 1997/05/18 03:04:44 krisrose Exp $
+%%
+%% TeX 3 support for ISO 8859-1 (Latin 1) characters.
+%% Copyright (c) 1990-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is not part of the Xy-pic package for graphs and diagrams in
+%% TeX but is distributed with it on the same conditions.
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+
+% NOTE: THIS FILE CONTAINS NON-ASCII 8BIT CHARACTERS!
+
+% USAGE: This should be input using the command
+%
+% \input latin1
+%
+% This will then make those ISO 8859-1 (Latin 1) characters that are present
+% in plain TeX available, and for AMS-TeX users, those available there as
+% well (these are marked %%AMS below).
+
+% First we pull the standard trick of dropping out if already loaded or if
+% this is not TeX 3...
+%
+\ifx\inputlineno\undefined
+ \errhelp{You may continue but some things will not typeset right.}%
+ \errmessage{latin1.sty requires TeX version 3---please update}%
+ \endinput\fi
+\expandafter\ifx\csname latin1.tex\endcsname\relax
+\else \message{[already loaded]}\endinput \fi
+\expandafter\edef\csname latin1.tex\endcsname{%
+ \catcode`\noexpand\@\the\catcode`\@\space
+ \expandafter\let\csname latin1.tex\endcsname=\noexpand\empty}
+\catcode`\@=11
+%
+% Next we define some shorthands that users might like as well.
+%
+\def\forcemathdef#1#2{\gdef#1{\relax\ifmmode#2\else{$#2$}\fi}}
+\def\forcemathchardef#1="#2#3#4#5{\forcemathdef#1{\mathchar"#2#3#4#5 }}
+%
+\def\mathtextdef#1#2#3{%
+ \gdef#1{\relax\ifmmode\def\next{#2}\else\def\next{#3}\fi\next}}
+%
+\def\missingchardef#1{\gdef#1{\space}}
+%
+% Code for slashed fractions [from TeXcercise 11.6]:
+%
+\def\slashedfrac#1#2{\hbox{\kern.1em %
+ \raise.5ex\hbox{\the\scriptfont0 #1}\kern-.11em %
+ /\kern-.15em\lower.25ex\hbox{\the\scriptfont0 #2}}}
+%
+% Assumes that columns 3-8 are already set up as ASCII.
+%
+% ISO 8859-1 column 10
+%
+\catcode`\ =\active \let =~
+\catcode`\¡=\active \chardef¡='074
+\catcode`\¢=\active
+ \forcemathdef¢{\mathord{\mathpalette\c@ncel{\fam=0\mkern2mu c}}}
+\catcode`\£=\active \forcemathchardef£="0424
+\catcode`\¤=\active \missingchardef¤ %%Missing: currency
+\catcode`\¥=\active \def¥{\yen} %%AMS (msam)
+\catcode`\¦=\active \missingchardef¦ %%Missing: brokenbar
+\catcode`\§=\active \def§{\S}
+\catcode`\¨=\active \mathtextdef¨\ddot\"
+\catcode`\©=\active \def©{\copyright}
+\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}}
+\catcode`\ª=\active \forcemathdefª{^{\textrm{\b a}}}
+\catcode`\«=\active \missingchardef« %%Missing: guillemotleft
+\catcode`\¬=\active \forcemathchardef¬="023A
+\catcode`\­=\active \missingchardef­
+\catcode`\®=\active \def®{\circledR} %%AMS (msam)
+\catcode`\¯=\active \mathtextdef¯\bar\B %%AMS
+%
+% ISO 8859-1 column 11
+%
+\catcode`\°=\active \forcemathdef°{^\circ}
+\catcode`\±=\active \forcemathchardef±="2206
+\catcode`\²=\active \forcemathdef²{^2}
+\catcode`\³=\active \forcemathdef³{^3}
+\catcode`\´=\active \let´=\'
+\catcode`\µ=\active \forcemathchardefµ="0116
+\catcode`\¶=\active \def¶{\P}
+\catcode`\·=\active \forcemathchardef·="2201
+\catcode`\¸=\active \let¸=\c
+\catcode`\¹=\active \forcemathdef¹{^1}
+\catcode`\º=\active \forcemathdefº{^{\textrm{\b o}}}
+\catcode`\»=\active \missingchardef» %%Missing: guillemotright
+\catcode`\¼=\active \def¼{\slashedfrac14}
+\catcode`\½=\active \def½{\slashedfrac12}
+\catcode`\¾=\active \def¾{\slashedfrac34}
+\catcode`\¿=\active \chardef¿='076
+%
+% ISO 8859-1 columns 12-15, by letter:
+%
+\catcode`\à=\active \defà{\`a}
+\catcode`\À=\active \defÀ{\`A}
+\ifx\inputlineno\undefined\else\uccode`\à=`\À \lccode`\À=`\à \fi
+\catcode`\á=\active \defá{\'a}
+\catcode`\Á=\active \defÁ{\'A}
+\ifx\inputlineno\undefined\else\uccode`\á=`\Á \lccode`\Á=`\á \fi
+\catcode`\â=\active \defâ{\^a}
+\catcode`\Â=\active \defÂ{\^A}
+\ifx\inputlineno\undefined\else\uccode`\â=`\Â \lccode`\Â=`\â \fi
+\catcode`\ã=\active \defã{\~a}
+\catcode`\Ã=\active \defÃ{\~A}
+\ifx\inputlineno\undefined\else\uccode`\ã=`\Ã \lccode`\Ã=`\ã \fi
+\catcode`\ä=\active \defä{\"a}
+\catcode`\Ä=\active \defÄ{\"A}
+\ifx\inputlineno\undefined\else\uccode`\ä=`\Ä \lccode`\Ä=`\ä \fi
+\catcode`\å=\active \letå=\aa
+\catcode`\Å=\active \letÅ=\AA
+\ifx\inputlineno\undefined\else\uccode`\å=`\Å \lccode`\Å=`\å \fi
+%
+\catcode`\æ=\active \chardefæ="1A
+\catcode`\Æ=\active \chardefÆ="1D
+\ifx\inputlineno\undefined\else\uccode`\æ=`\Æ \lccode`\Æ=`\æ \fi
+\uccode"1A="1D \lccode"1D="1A % Scandinavian...
+%
+\catcode`\ç=\active \defç{\c c}
+\catcode`\Ç=\active \defÇ{\c C}
+\ifx\inputlineno\undefined\else\uccode`\ç=`\Ç \lccode`\Ç=`\ç \fi
+%
+\catcode`\è=\active \defè{\`e}
+\catcode`\È=\active \defÈ{\`E}
+\ifx\inputlineno\undefined\else\uccode`\è=`\È \lccode`\È=`\è \fi
+\catcode`\é=\active \defé{\'e}
+\catcode`\É=\active \defÉ{\'E}
+\ifx\inputlineno\undefined\else\uccode`\é=`\É \lccode`\É=`\é \fi
+\catcode`\ê=\active \defê{\^e}
+\catcode`\Ê=\active \defÊ{\^E}
+\ifx\inputlineno\undefined\else\uccode`\ê=`\Ê \lccode`\Ê=`\ê \fi
+\catcode`\ë=\active \defë{\"e}
+\catcode`\Ë=\active \defË{\"E}
+\ifx\inputlineno\undefined\else\uccode`\ë=`\Ë \lccode`\Ë=`\ë \fi
+%
+\catcode`\ì=\active \defì{\`\i}
+\catcode`\Ì=\active \defÌ{\`I}
+\ifx\inputlineno\undefined\else\uccode`\ì=`\Ì \lccode`\Ì=`\ì \fi
+\catcode`\í=\active \defí{\'\i}
+\catcode`\Í=\active \defÍ{\'I}
+\ifx\inputlineno\undefined\else\uccode`\í=`\Í \lccode`\Í=`\í \fi
+\catcode`\î=\active \defî{\^\i}
+\catcode`\Î=\active \defÎ{\^I}
+\ifx\inputlineno\undefined\else\uccode`\î=`\Î \lccode`\Î=`\î \fi
+\catcode`\ï=\active \defï{\"\i}
+\catcode`\Ï=\active \defÏ{\"I}
+\ifx\inputlineno\undefined\else\uccode`\ï=`\Ï \lccode`\Ï=`\ï \fi
+%
+\catcode`\Ð=\active \missingchardefÐ %%Missing: Eth
+\catcode`\ð=\active \missingchardefð %%Missing: eth
+\ifx\inputlineno\undefined\else\uccode`\Ð=`\ð \lccode`\ð=`\Ð \fi
+%
+\catcode`\ñ=\active \defñ{\~n}
+\catcode`\Ñ=\active \defÑ{\~N}
+\ifx\inputlineno\undefined\else\uccode`\ñ=`\Ñ \lccode`\Ñ=`\ñ \fi
+%
+\catcode`\ò=\active \defò{\`o}
+\catcode`\Ò=\active \defÒ{\`O}
+\ifx\inputlineno\undefined\else\uccode`\ò=`\Ò \lccode`\Ò=`\ò \fi
+\catcode`\ó=\active \defó{\'o}
+\catcode`\Ó=\active \defÓ{\'O}
+\ifx\inputlineno\undefined\else\uccode`\ó=`\Ó \lccode`\Ó=`\ó \fi
+\catcode`\ô=\active \defô{\^o}
+\catcode`\Ô=\active \defÔ{\^O}
+\ifx\inputlineno\undefined\else\uccode`\ô=`\Ô \lccode`\Ô=`\ô \fi
+\catcode`\õ=\active \defõ{\^o}
+\catcode`\Õ=\active \defÕ{\^O}
+\ifx\inputlineno\undefined\else\uccode`\õ=`\Õ \lccode`\Õ=`\õ \fi
+\catcode`\ö=\active \defö{\"o}
+\catcode`\Ö=\active \defÖ{\"O}
+\ifx\inputlineno\undefined\else\uccode`\ö=`\Ö \lccode`\Ö=`\ö \fi
+\catcode`\ø=\active \chardefø="1C
+\catcode`\Ø=\active \chardefØ="1F
+\ifx\inputlineno\undefined\else\uccode`\ø=`\Ø \lccode`\Ø=`\ø \fi
+\uccode"1C="1F \lccode"1F="1C % I'm Danish!
+%
+\catcode`\ù=\active \defù{\`u}
+\catcode`\Ù=\active \defÙ{\`U}
+\ifx\inputlineno\undefined\else\uccode`\ù=`\Ù \lccode`\Ù=`\ù \fi
+\catcode`\ú=\active \defú{\'u}
+\catcode`\Ú=\active \defÚ{\'U}
+\ifx\inputlineno\undefined\else\uccode`\ú=`\Ú \lccode`\Ú=`\ú \fi
+\catcode`\û=\active \defû{\^u}
+\catcode`\Û=\active \defÛ{\^U}
+\ifx\inputlineno\undefined\else\uccode`\û=`\Û \lccode`\Û=`\û \fi
+\catcode`\ü=\active \defü{\"u}
+\catcode`\Ü=\active \defÜ{\"U}
+\ifx\inputlineno\undefined\else\uccode`\ü=`\Ü \lccode`\Ü=`\ü \fi
+%
+\catcode`\Ý=\active \defÝ{\'Y}
+\catcode`\ý=\active \defý{\'y}
+\ifx\inputlineno\undefined\else\uccode`\Ý=`\ý \lccode`\ý=`\Ý \fi
+\catcode`\ÿ=\active \defÿ{\"y}
+%
+\catcode`\Þ=\active \missingchardefÞ %%Missing: Thorn
+\catcode`\þ=\active \missingchardefþ %%Missing: thorn
+\ifx\inputlineno\undefined\else\uccode`\þ=`\Þ \lccode`\Þ=`\þ \fi
+%
+\catcode`\ß=\active \letß=\ss
+%
+% ISO 8859-1 columns 12-15, symbols:
+%
+\catcode`\×=\active \forcemathchardef×="2202
+\catcode`\÷=\active \forcemathchardef÷="2204
+%
+\csname latin1.tex\endcsname
+
+% $Log: latin1.sty,v $
+% Revision 3.4 1997/05/18 03:04:44 krisrose
+% Package, now...
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.8 1994/11/07 04:40:31 kris
+% Abandoned.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% New for Xy-pic 2.7 based on latin1.doc of the XPPT distribution.
diff --git a/Master/texmf-dist/source/generic/xypic/movie.cls b/Master/texmf-dist/source/generic/xypic/movie.cls
new file mode 100644
index 00000000000..7c3f29d73f6
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/movie.cls
@@ -0,0 +1,325 @@
+%% $Id: movie.cls,v 3.4 1997/05/18 01:14:25 krisrose Exp $ -*-latex-*-
+%%
+%% ``LaTeX Movie'' document class for DVI animations.
+%% Copyright (c) 1994-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\NeedsTeXFormat{LaTeX2e}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Version.
+
+\def\next$#1: #2 #3${#2}
+\edef\next{\noexpand\ProvidesClass{movie}%
+ [\next$Date: 1997/05/18 01:14:25 $
+ Movies in LaTeX v.\next$Revision: 3.4 $.]}\next
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Options.
+
+% nocaption (omit caption at lower left; default)
+% caption (include caption)
+\newif\ifm@caption
+\DeclareOption{nocaption}{\m@captionfalse}
+\DeclareOption{caption}{\m@captiontrue}
+
+% nocount (omit count at lower left; default)
+% count (include count)
+\newif\ifm@count
+\DeclareOption{nocount}{\m@countfalse}
+\DeclareOption{count}{\m@counttrue}
+
+% notime (omit elapsed time in "seconds"; default)
+% time (include elapsed time)
+\newif\ifm@time
+\DeclareOption{notime}{\m@timefalse}
+\DeclareOption{time}{\m@timetrue}
+
+% loop (make the animation loop; default)
+% once (don't loop)
+\def\loop@@{-ns2}
+\DeclareOption{loop}{\def\loop@@{-ns2}}
+\DeclareOption{once}{\def\loop@@{-once}}
+
+% Paper size (ignored since result is never printed).
+\DeclareOption{a4paper}{}
+\DeclareOption{a5paper}{}
+\DeclareOption{b5paper}{}
+\DeclareOption{letterpaper}{}
+\DeclareOption{legalpaper}{}
+\DeclareOption{executivepaper}{}
+\DeclareOption{landscape}{}
+
+%\vsize=9in \voffset=0in
+%\hsize=7in \hoffset=0in % safe? :)
+
+\newdimen\textheight \textheight=\vsize
+\newdimen\textwidth \textwidth=\hsize
+
+% Font size.
+\renewcommand\normalsize{\fontsize{10}{12}\selectfont}
+\DeclareOption{10pt}{\renewcommand\normalsize{\fontsize{10}{12}\selectfont}}
+\DeclareOption{11pt}{\renewcommand\normalsize{\fontsize{11}{13}\selectfont}}
+\DeclareOption{12pt}{\renewcommand\normalsize{\fontsize{12}{14}\selectfont}}
+
+% Driver (passed on to packages).
+\DeclareOption{cmactex}{\OptionNotUsed}
+\DeclareOption{dvips}{\OptionNotUsed}
+\DeclareOption{dvitops}{\OptionNotUsed}
+\DeclareOption{emtex}{\OptionNotUsed}
+\DeclareOption{ln}{\OptionNotUsed}
+\DeclareOption{oztex}{\OptionNotUsed}
+\DeclareOption{textures}{\OptionNotUsed}
+\DeclareOption{xdvi}{\OptionNotUsed}
+
+% ...remaining options are numeric assignments...
+\def\m@keys{}
+\def\add@m@keys#1{\expandafter\def\expandafter\m@keys\expandafter{\m@keys,#1}}
+\DeclareOption*{\expandafter\add@m@keys\expandafter{\CurrentOption}}
+
+\ProcessOptions*
+
+\LoadClass{article}
+\pagestyle{empty}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Dependencies.
+
+\RequirePackage{keyval} % key=value pair support
+\input xy % Xy-pic kernel (not package to prevent clash)
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Parameters (set via options or the setup).
+
+% pixel=<dimen> (makes \pixels{<number>} a valid <dimen>; default: 1in/300)
+% dpi=<number> (dots per inch ~ pixel=1in/number)
+\newdimen\m@pixel \m@pixel=0.0033333333in
+\define@key{movie}{pixel}{\m@pixel=#1\relax}
+\define@key{movie}{dpi}{\m@pixel=1in \divide \m@pixel by #1\relax}
+
+% height=<dimen>
+% width=<dimen>
+\newdimen\m@height \m@height=2in
+\newdimen\m@width \m@width=2in
+\define@key{movie}{height}{\m@height=#1\relax}
+\define@key{movie}{width}{\m@width=#1\relax}
+
+% tick=<fraction> (set the duration of each frame to <fraction> seconds)
+% fps=<number> (frames per second ~ tick=1/number)
+\newdimen\m@tick \m@tick=0.083333333pt
+\define@key{movie}{tick}{\m@tick=#1pt\relax}
+\define@key{movie}{fps}{\m@tick=1pt \divide \m@tick by #1\relax}
+
+\def\next#1{\setkeys{movie}{#1}}
+\expandafter\next\expandafter{\m@keys}
+\let\m@keys=\undefined
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Setting parameters explicitly...
+
+\def\MovieSetup#1{\setkeys{movie}{#1}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Internals.
+
+\def\m@caption{}
+
+\countdef\m@scene=1 % count1 = scene#
+\countdef\m@frame=2 % count2 = frame# (in scene)
+
+\font\fiverm=cmr5 % safe small font
+
+\newdimen\m@total \m@total=0pt % total elapsed time
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% User accessible progress macros:
+
+\def\theFrame{0}
+\def\theScene{0}
+
+\def\theF{0}
+\def\theFr{1}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% User command: \scene [<fraction>] {...}
+%
+% Produce scene of <fraction> seconds (default: 1.0) with each frame produced
+% by ... centered in vertical mode.
+
+\newif\iflastframe@
+\newdimen\m@length % duration of scene
+\newdimen\m@init % start of zoom
+
+\newcommand\scene{%
+ \@ifnextchar*{\lastframe@true \DN@*{\scene@i}\next@}%
+ {\lastframe@false \scene@i}}
+
+\newcommand\scene@i[1][1]{\scene@ii{#1}}
+
+\def\setm@caption#1{\xdef\m@caption{#1}}
+
+\long\def\scene@ii#1#2{{%
+ \let\caption=\setm@caption
+ \global\advance\m@scene\@ne \edef\theScene{\the\m@scene}%
+ \global\m@frame=\z@ \m@length=#1pt \m@init=\z@
+ \loop
+ \dimen@=\m@frame\m@tick
+ \ifdim\dimen@<\m@length
+ \scene@frame{#2}%
+ \repeat
+ \iflastframe@ \scene@frame{#2}\fi
+ \dimen@=#1pt \advance\dimen@ by -\m@frame\m@tick
+ \ifdim.1\m@tick<\ifdim\dimen@<\z@-\fi\dimen@
+ \dimen@=\m@frame\m@tick
+ \@warning{scene \the\m@scene\space rounded from #1 to
+ \expandafter\unPT@\the\dimen@\space seconds}%
+ \fi}\ignorespaces}
+
+\def\scene@frame#1{\frame@compute
+ \null
+ \vfill
+ \hrule width\m@width
+ \hbox to\m@width{\hss
+ \vbox to\m@height{\hsize=\m@width \null\vfil{#1}\vfil\null}%
+ \hss}%
+ \setbox0=\hbox{%
+ \setbox0=\hbox to\m@width{\hss\fiverm\strut
+ \ifm@caption \m@caption \fi
+ \ifm@time \quad \m@nicetotal s \fi
+ \ifm@count \quad \the\m@scene.%
+ \ifnum\m@frame<100 0\ifnum\m@frame<10 0\fi\fi\the\m@frame\fi}%
+ \dimen0=\dp0 \ht0=0pt \dp0=0pt \raise\dimen0\box0}%
+ \ht0=0pt \dp0=0pt \box0\relax
+ \hrule width\m@width
+ \global\advance\m@frame\@ne
+ \global\advance\m@total\m@tick
+ \eject}
+
+\def\frame@compute{%
+ \edef\theFrame{\the\m@frame}%
+ \dimen@=\m@frame\m@tick \advance\dimen@-\m@init
+ \ifdim\dimen@<\z@ \dimen@=\z@ \fi
+ \ifdim\dimen@>\m@length \dimen@=\m@length \fi
+ \quotient@\theF\dimen@\m@length
+ \dimen@=-\dimen@ \advance\dimen@\m@length
+ \quotient@\theFr\dimen@\m@length}
+
+\def\m@nicetotal{%
+ \edef\tmp{\expandafter\removePT@\the\m@total}%
+ \expandafter\twodecimals@\tmp 00@}
+\def\twodecimals@#1.#2#3#4@{#1.#2#3}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Triggers.
+%
+% Triggers are used to make the individual frames in a scene different! :)
+
+% \F{C} expands to C(F) where F = (#frames / frame#) ; 0.0 < F <= 1.0 .
+% \Fr{C} expands to C(Fr) where Fr = 1 - F .
+
+\def\F{\expandafter\F@\expandafter{\theF}}
+\def\Fr{\expandafter\F@\expandafter{\theFr}}
+
+\def\F@#1#2{#2(#1)}
+
+% \Zoom[A;B]{C} expands C zooming onto the interval [A;B], i.e., within C the
+% interval [0;1] really denotes the (current) interval [A;B] ...
+
+% Specifically: F F inside [A;B]
+% 0;A 0
+% A;B F-A / B-A
+% B;1 1
+
+\newcommand\Zoom[1][0;1]{\Zoom@#1;}
+\def\Zoom@#1;#2;#3{{%
+ \dimen@=#1\m@length \advance\dimen@\m@init
+ \m@length=#2\m@length \advance\m@length\m@init
+ \advance\m@length-\dimen@ \m@init=\dimen@
+ \frame@compute #3}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Preliminary FADING support...
+%
+% by Ross Moore; depends on Xy-pic `ps' backend...
+%
+% use as a <shape> modifier: \drop[<colour>][!\F\lighten]<object>
+% use as a <shape> modifier: \drop[<colour>][!\F\darken}]<object>
+%
+% \lighten(1) = white \lighten(0) = natural colour
+% \darken (1) = black \darken (0) = natural colour
+%
+\def\lighten@(#1){/@col #1 def{1 sub 1 @col sub mul 1 add}settransfer}
+\def\darken@(#1){/@col #1 def{1 @col sub mul}settransfer}
+
+\xywithoption{ps}{\let\lighten=\lighten@ \let\darken=\darken@}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Dump size file.
+%
+\AtEndDocument{\dumpsizefile}
+
+\newwrite\m@write
+
+{\catcode`p=12 \catcode`t=12 \gdef\unPT@#1pt{#1}}
+
+\def\dumpsizefile{\immediate\openout\m@write=\jobname.size
+%
+ \dimen@=1in \divide\dimen@\m@pixel
+ \immediate\write\m@write{dpi=\number\dimen@}%
+%
+ \dimen@=\m@tick \multiply\dimen@ by 1000\advance\dimen@.5\m@tick
+ \divide\dimen@\p@ \immediate\write\m@write{delay=\number\dimen@}%
+%
+ \immediate\write\m@write{loop=\loop@@}%
+%
+ \immediate\closeout\m@write}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Misc. class-provided commands...
+
+\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
+\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
+\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
+\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
+\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
+\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
+\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The End.
+
+\endinput
+
+% $Log: movie.cls,v $
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 1.5 1997/05/13 12:36:26 krisrose
+% Intermediate version; factors function nicely.
+%
+% Revision 1.4 1997/05/01 21:55:44 krisrose
+% Works again.
+%
+% Revision 1.3 1997/02/11 04:20:19 krisrose
+% Fits new dvitogif89a 1.1 :)
+%
+% Moved to Xy-pic hierarchy.
diff --git a/Master/texmf-dist/source/generic/xypic/pnmrawtopcropwhite.c b/Master/texmf-dist/source/generic/xypic/pnmrawtopcropwhite.c
new file mode 100644
index 00000000000..a575cfd2b80
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/pnmrawtopcropwhite.c
@@ -0,0 +1,175 @@
+/* $Id: pnmrawtopcropwhite.c,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+**
+** Crop off top white lines from raw PBM file (efficiently :)
+** Copyright (c) 1991-1998 Kristoffer H. Rose <krisrose@brics.dk>
+**
+** This file is part of the Xy-pic package for graphs and diagrams in TeX.
+** Copyright (c) 1991-1998 Kristoffer H. Rose <krisrose@brics.dk>
+**
+** The Xy-pic package is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+**
+** The Xy-pic package is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+** for more details.
+**
+** You should have received a copy of the GNU General Public License along
+** with this package; if not, write to the Free Software Foundation, Inc.,
+** 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+static const char Id[] =
+"@(#)$Id: pnmrawtopcropwhite.c,v 3.7 1999/02/16 15:12:50 krisrose Exp $\n";
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* Globals */
+
+#define PBMRAWMAGIC "P4" /* Portable BitMap magic cookie */
+#define PGMRAWMAGIC "P5" /* Portable GrayMap magic cookie */
+#define PPMRAWMAGIC "P6" /* Portable PixMap magic cookie */
+#define MAGICSIZE 2
+
+static char *me; /* program name */
+
+/* Subroutines */
+
+void oops(void) {
+ fprintf(stderr, "Usage: %s\n", me);
+ exit(1);
+}
+
+void panic(const char *mess) {
+ fprintf(stderr, "Error: %s\nUsage: %s\n", mess, me);
+ exit(2);
+}
+
+void skipcomment(void) {
+ int c;
+ while(1) {
+ switch (c = getchar()) {
+ case EOF: panic("premature EOF on input"); break;
+ case '\n': return;
+ default: break;
+ }
+ }
+}
+
+void skipwhite(void) {
+ int c;
+ while(1) {
+ switch (c = getc(stdin)) {
+ case EOF: panic("premature EOF on input"); break;
+ case ' ': case '\t': case '\r': case '\n': break;
+ case '#': skipcomment(); break;
+ default: ungetc(c, stdin); return;
+ }
+ }
+}
+
+int nextint(const char *what) {
+ int i;
+ skipwhite();
+ if (!scanf("%d", &i)) panic(what);
+ return i;
+}
+
+/* Program */
+
+int main (int argc, char *argv[]) {
+
+ char magic[MAGICSIZE];
+ enum { PBM, PGM, PPM } which;
+ int width, height, newheight, pixelmax;
+
+ int linelength;
+ char *line, *whiteline;
+
+ /* establish identity and proper usage */
+ me = argv[0];
+ if (argc != 1) oops();
+
+ /* magic */
+ if (!fread(magic, 1, MAGICSIZE, stdin))
+ panic("no magic (nothing on standard input)");
+
+ if (!memcmp(magic, PBMRAWMAGIC, MAGICSIZE))
+ which = PBM;
+ else if (!memcmp(magic, PGMRAWMAGIC, MAGICSIZE))
+ which = PGM;
+ else if (!memcmp(magic, PPMRAWMAGIC, MAGICSIZE))
+ which = PPM;
+ else
+ panic("bad magic (standard input not a raw anymap)");
+
+ /* width and height */
+ width = nextint("pixelwidth integer");
+ height = nextint("pixelheight integer");
+ switch (which) {
+ case PBM: pixelmax = 0; break; /* hack (used by memset below) */
+ case PGM: case PPM:
+ pixelmax = nextint("pixelmax integer");
+ if (pixelmax > 255) panic("pixelmax larger than 255");
+ }
+ if (getchar() != '\n')
+ panic("something not a simple newline after width height [pixelmax]");
+
+ /* allocate pixel line */
+ switch (which) {
+ case PBM: linelength = (width + 7) / 8; break;
+ case PGM: linelength = width; break;
+ case PPM: linelength = width * 3; break;
+ }
+ line = (char*)malloc(linelength);
+ if (!line) panic("could not allocate pixel line");
+ whiteline = (char*)malloc(linelength);
+ if (!whiteline) panic("could not allocate white pixel line");
+ memset(whiteline, pixelmax, linelength);
+
+ /* skip white pixel lines */
+ newheight = height;
+ while (fread(line, linelength, 1, stdin)
+ && !memcmp(line, whiteline, linelength)) {
+ newheight--;
+ if (newheight <= 0) panic("entire image blank");
+ }
+
+ /* output revised header */
+ if (newheight < height)
+ fprintf(stderr,"%s: cropping %d rows off the top\n", me, height-newheight);
+ printf("%.*s\n%d %d\n", MAGICSIZE, magic, width, newheight);
+ switch (which) {
+ case PBM: break;
+ case PGM: case PPM:
+ printf("%d\n", pixelmax); break;
+ }
+
+ /* output remainder of image */
+ do {
+ if (!fwrite(line, linelength, 1, stdout)) panic("could not write");
+ } while (fread(line, linelength, 1, stdin));
+ if (!feof(stdin)) panic("input not exhausted");
+
+ return(0);
+}
+
+
+/*
+** $Log: pnmrawtopcropwhite.c,v $
+** Revision 3.7 1999/02/16 15:12:50 krisrose
+** Interim release (Y&Y fonts now free).
+**
+** Revision 1.3 1997/05/01 20:59:51 krisrose
+** Works for all three raw formats now.
+**
+** Revision 1.2 1997/05/01 17:34:58 krisrose
+** Extended to raw PGM and PPM in addition to PBM.
+**
+** Revision 1.1 1997/04/30 21:30:31 krisrose
+** Initial revision
+*/
diff --git a/Master/texmf-dist/source/generic/xypic/ross.eps b/Master/texmf-dist/source/generic/xypic/ross.eps
new file mode 100644
index 00000000000..53b25317b8f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/ross.eps
@@ -0,0 +1,397 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /net/tyr/home/tyr1/kris/Kris/pictures/rmoore-icon.ps
+%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley
+%%BoundingBox: 0 0 62 84
+%%Pages: 1
+%%DocumentFonts:
+%%EndComments
+%%EndProlog
+
+%%Page: 1 1
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% define string to hold a scanline's worth of data
+/pix 86 string def
+
+% define space for color conversions
+/grays 86 string def % space for gray scale line
+/npixls 0 def
+/rgbindx 0 def
+
+% lower left corner
+0 0 translate
+
+% size of image (on paper, in 1/72inch coords)
+61.92000 84.24000 scale
+
+86 117 8 % dimensions of data
+[86 0 0 -117 0 117] % mapping matrix
+{currentfile pix readhexstring pop}
+image
+
+bac0d8d8c5c0c0c5988e7124241d4f63a87a637375c0dacac0c0987a638e9090baa8afaf
+9898c5da8eba8e9ab1bac5c5c5b92438716971a284137138c038385a383c5a381d383838
+3c3c47697e696969696969695a5a
+b9cfc5bac5c0c5b5b171713824244f4f71716f8c94d8d8cae1c0756d75988cc8bac8afb9
+af635a5a47987c9aa8a2c5a8a8cf5a2669386f908e3c6956718e1938383c4f5a5a233c3c
+3c4f5a565a696d5a695a5a695a69
+9abababababaa89a8e7c5a3838324f5375759aafb9e9d7e9b198637ca8e9caccbecfc8ba
+bc445a385a989a909abaa2baa8ba9c2638267e9ab198385a5a7e283838415a41325a383c
+5a4f5a5a697e71697e7e69715a5a
+afa0bac5a8a49aa873713cd8daeadac5ccf0f0ebf1d8f5f0f0f0f3f0d7f1d8d8ebd7ba4f
+38c5afba7c63a28a8ea8babaa2c5e95a3871246da8a226385a23a82438415a5a45453c3c
+413c4f4f5a637e7171697e715a6d
+a2cabcba9aa88e8e7c6369455a4f5a5a4f71b1cce9f0ebddeaeaf0f0ddf1ddddebebf04f
+4f5a6d6d69716d6f6f79b1b1b1babaa8328e245a8e982d135638562438385a5a6d71718e
+7169715a5a7171717e718471716d
+1d385a32382a3824241d243838384f4f383838384f325a5a909098b5cfd8ddeed8cd635a
+5a5a696d715a715a697e718e8e8ea2a87169418e84a869244f3c3838385a1d1d1d1d1d38
+23715a717aa8a29aa8a2bca498a2
+a2c5a2a2b5a8a86f5a38383832381d241d1d1d381d38381d1d2a251d1d2a38385a4f415a
+3838383c415a5a323c56699898a27a8e7e7e563c848e9098715a3c3869a8633838413853
+555a69715a71716f71716d8e6d90
+a8a8a8a8a29a8e8e5a3832381d32381d381d3838381d381d383838384141414f383c6956
+565a565a71717179845a413c38418e7e8e71715a8e8e8e71716d69697cbeafbaaf98af98
+a898afa8a8988ca89c8ea8a89aa8
+24242419242424381d1d38381d381d38382a3838383838383c3c4f4f4153565a413c2338
+38382d381d3841695a3c383c56716f6f8e8e71716956715a2425387cbebac5b998bab9c5
+baa2b998c5c5c0ccbabaa8985a5a
+2a412a283838262424261d1d3232381d381d3823383c32413c53413c535a414124192441
+3c69714f5a3c382a385571413838698e718e7e71714f5a5a3c382a69635a695a5a5a5a5a
+5a6d5a5a696d7e9090908e8e98a2
+382a38382a1d2426261d1a1d243824381d1d245a41414f4f41475a3c411d2a1d3c3c6969
+715a71715a715a69412a4171413c233c698e8e7169713c5a695a382a2426715a5a715a71
+5a715a6d6d7e71b1a890a88e8e98
+55987179719871415a5a32383c38383838381d383c4f3c38415a4138415a5a5a535a4f5a
+4f5a5a5a5a3c41695a69413838411d2a382d4f90b17e41715a5a3c383824906d9075908e
+7a8e907c8a7c908ea8a88e737175
+6971908e6d713c5a5a414f5a3238384f382424415a3c2d38413838415641414f41414f53
+5a4f5a3c3838383c3c41533c281d38382a38415a6da85a4f71565a413838a8ba9898b998
+a89c8a9aa8a0a0b7989498b9c8c8
+5a5a69695a5371716d711d5a5a5a5a5a381d413c41234141413c3c4f3c3c38413c413841
+5a3c414141411d1d3838254141411d4141382a3841415a8e324156715a475a7c907c9063
+636d6d634f7590a8a89890989875
+716971715a5a5a6d6d6d3c5a4f5a5a71383c3c383c3c41413c415a4f413c3c3c3c413c5a
+3c413c2d1d41381d38383c3c234141253c25383828383c697141415a5a5a475a6d6d7171
+7c71906d6d6d8ea8989c8a9aa8a8
+7169716971416d7e7e5a5a3c6d5a5a4f3c414138413c2a416956413841414f412d381d1d
+383841413c2a41381d413c3c3c3c3c3c3c413c2a41383c41697141554f41475a716d5a5a
+6963714f636f6d909aa89aa8a4c0
+988ea898986d38715a7e715a5a5a4f3c382a3841414f4f413c411d414138254125384141
+3c41413c41413c41414f695a715a71717171713c4141413c413c71382a3c415a3c413819
+24243826242a24415a4f41474169
+8e8e9890987e5a6338383c566d71473838412a41534f415a1d242a3c3c2541414141413c
+413c5641694f4f564f567171715e79799a5e79715656413c41383c413838413853234138
+1d242438242a38414147533c3c47
+719aa2908a8e5a4f6d715a4f32383838414138694f4f4141413c3c5a1d3856415a567171
+7171717e98798e8e7aa4a2a4baa4a4a4a2a4ba9a797e714f3c3c2d414141384141696938
+38382438242a243841533c534738
+6db1908e8e7e5a6d6d386d5a71381d38414f41413c5341413c4f4f38413c5a7171717179
+8aa2a4a2a2a2a4a2a4a2c0a8baa4c0bca4babaa4a27971714f3c41413c382538385a7156
+3838381d3824382a383c535a4147
+6da2908e987171696d5a4f5a32382a3c414f69533c5a2a414169413c415571988aa4a4a2
+a2a4c7a4c0a8bcc7c7c7c7c7c7c7c7bca4a6bcbca4a28e79714f4f413c3c4138383c695a
+3241383824242a38383c53413824
+9a98a898908e69717138693823383c3c4f41474f4153414169414f717e7e92c0c7baccc7
+cccce0d8d7d8d8d8c2c2e0c3c3d7c7c7c7c3d7bcbcbca49a987171415a41414141415a71
+5a41415324241d1d38414f53a4a8
+a8558e8e8e715a32714f5a383838413c5a3c416969415a69715a417ea492c0c7cccce2d8
+d7d8c2d5d8d7d8d8d7c2c2d7c2d7c3c3d7c3c7c7bcc7a4a4a27e8e5a4141414f56413869
+695a5332382424242a41415ae1b5
+8e717e8e717e3c4f4f5a5a38384141533c4169697156557156716592c0aac7c3d8c3d8d8
+d8d8d8d8d8c3d7d8d7d7d7c2c2d7d7c7ccb9c3a6bcc7bcc7a4a4a27171565a4f5a695a69
+71695a3c38191d38262a1d28c5b5
+8e71719071695a4f5a5a381d41413c3c4f716956717171717171a4c0a4c3c3ccd8e2d8d7
+d8edd8d8d8d8d8d8d8c2d8d7c2c2c3c3c3b9bcbca6d7c7a6c0a4b59a71845a5a5a7e6d5a
+5a69414f41795e7179865524d8c5
+8e90719098713c537e3838414141414171557171717171715ea2a4a8a8c2c2d5d8d8d7ed
+d7d8d7ebebd8d7c2d8d7e0c2d7d7e0c3e0c3b9c3bcc7d7a6a4baa4a28e71715a695a7169
+5a5a4f41535620414f715519ccd2
+908e718e715a5a4732382a3c413c416971697179717171717ea4c0c3c7c2e5d8d7d8d8e6
+d7e5d8d8d7ebd7d8d8c2d8d8c2d7c3c3c3c7c3d7aac7c7bcbaa4c0baa29871564f5a715a
+5a4f5a5a6971323c41887119d8b1
+8e986d8e847e714f5a2a41283c533c715671717198797171a2a4aac3c7d7d8d7e4ede4d7
+e4e4e6d7d7d8d8d8d8d8c2c2d8c2c3c3d7c3c3c7c3c3c3c7c7a4baa4b5a2717e5a4f695a
+5a5a4f697171414153ad7119d8c2
+98a88e8e8e987169412423414141417198717e7e7e84718ea4aac3d8c3d8d7d8e6e4dde6
+e4eae4ead7e6d7d8d7d8d7c2d7c2d8d7ccc2d7d7ccc3c3c3b9bca4c0c0a2717e695a5a69
+5a5a4f4f565a694153b17e24c5c0
+a298a8b5b1b1905a1d3841383c414169717e798a9898717ec7ccd8d8ccd8d7edede6ddd8
+e4e4eae4edeaddeaead8e6d8d7d8d8c2c2c2c2ccd7ccc3c3c7a6bca492a298565a556971
+5a69566969416955539c692acfb5
+c5bac0b5c0c0715a38383c41384169567ea4a2a2a48e71a2ccccc2d8c3d7d7d7d7eadde4
+eae4e9e9e4e4e4eae4ddd8ebd8d7d8d8d8d8d7c2c3d7d7c3c7bcbc92c0c098717e565a71
+5a5a7169715a696941d5692deac2
+a2bab598c5c05a38413c414123415a71a2a4a4a48e7a98a4ccc2d8d8d8d7e4d8d7eaede4
+eae9e9e9e9e9eae6e6d7e6d8d7ebd8d7d8d8c3d7c2d7c3c3aad7c7bca4a2a4717171717e
+715a69696971693c41e16938e9b5
+a8b1a271a8b53c383c3c3838383c5671a2a48ea4797179a4d8d8c2d8d8d7d7d8e4d8d8ea
+edeaeae0eae4e9eadde4d8d7edd8c2c2d5d8c2d8d8c3e0c3c7aacdbcc0a28e987e556956
+715a3c71715a5a5a7ed26953cfcc
+a8b5b169a89a38413c41381d253c71a4a4a4a4a4798e7acdc2d8d8d8c8d7ddd7eae0e0f5
+e0eae9e4e9e0eaeae4eae4e6d7d7d8d8d8c2d7d8ccd7c3d8e0c7c7c7c0a2799871716984
+7156695669696969a8d17741d8a2
+8e988e5a849a38385a383c2a233c7ea2c0a2a4a279797ec2d5c2d7edd8e4d8e4e4eae4eb
+e9e9e4e9e9e9e0e0e9eaead8edede6d8d8c2d8d8c3d7c2d7c3c7bccdbaa27e9871717190
+717155717171716398ad3838e1a2
+909879715ab538383c38381d385aa4a4a4a4a4c0797aa4d8d8d7d7d8d7eaead7e4e0eae9
+e9e9e0e9e9e9e0fde9e4e0eaedd7d8d7d7d7f3d8c2d8d7ccc2c7bca8c0a48e7171846971
+9c718469717e7e7198d2413cd8d8
+98909a8e6998382338233838417ea4a4a4a4c7a47e86d7d8d7d7edead7eaece0e0e0efef
+efefefefefefebefefe0f5e0e4e5d8d8d7d8d8d8d8d8d8c2c3c7aac0a4a47e8e71697171
+9c717171717171539cb5243cccb5
+b1a8b5a28471413c41382a2356a4a4a4a292d7c07ea4d8d7edd8e4d7ede9e9e9e9efefef
+efeff5efeff5efefefe9edededd8d7d7ebe6d7d8d7d8c2d8c3ccc7bca2a48e7169717184
+7198717e90987147b1d22441cfb1
+b1a8a2b58e69384138381d3871a4a4a4bcc7c2a479aae5d8e4ede4d8e4e0e0efe0e0efef
+eff5f5f5f5f5eff5fdebebe4e4d7d7edd7ebd7d8d8d8d8d8d7d7c7c7a4a271715a557156
+719898847198905addbc1d41e1b5
+a2b1b1c0a27e3c38381d3856a2a4c092c7c7d8a479ccd8d7d7edeaedede7e9e9e9efebef
+efefeff5f5fdefefefe9e0d8edd7d8d7edd7e5d8d8d7d7e2c3e0c7c7a4a28e7141696956
+5671988471717153c2d5383cd8b1
+a898b1a8a8711d411d382a7ea4c0cdc7a6c3cca47ed5d8d8d7edd7d8e0e9efefefebefe9
+efeff5eff5f5efefede0e4ede4d7e5d7d7e6d8d7ebd8d8e0ccc3c3c7bca4715a4f41695a
+697171986971698484d22469c0b5
+9a8ea898988e383c381d1da4a4a4a8c7c7ccc2a4bcd8e0d7edd8d8e6d8e0efe0efe9efeb
+e9efefefefe9ebebebede0e0e4d8edd7edd7d8d8d7d8e0d8e2c3c7c0bca271693c416941
+41416984695a5a5a88b51d47d890
+8e798e8e8ea85a23381d3ca4a4a4a8c7c7c2e0cda8d8d8d8d7e6d8d7e4e9f5e9e9efefef
+efe9efeffde7e0fde9e0edd7edd7ebd7e6d7ebd8d8d8d8d8d7ccd7c7baa48e563c41413c
+534f55564153564190a88e84b571
+5353415a5a2338411d3841a4a4babcc7c7c3ccc7c2d8d5d8e5d8d7e6eae0e0e0efebeffd
+efefebefe7e9e9e9e0e9e0e4d7edd7e6d8d8ddd8d8d8d7d8ccc3d7c0a4a4717141414138
+41415a556941564f90ccc0b5a898
+41383c413c53413c1d2371a4a4c0c7c7cce0e0e0ccd8d5d8d7d8edd7eaebece9eff5efef
+efe0efebeff5e9e9efe9edd8edd7d7d8edd8ebd8ddd8d8d5c2d7c7bcc0c0a28e693c4153
+3c5341416971717190b1b1908e8e
+3c4153473c3c473c38235aa2a4c0a8c7bac3c3ccc2d8c2d8d7d7d8ede0e0e9e9e0e9e9eb
+efe0e9efefe9e9e0e9e0e9d7d7ededd7d8d8d7d7e2d8d8d8c3d7c3c7c7a4a27969414141
+41694153717e5e717e192a3c4138
+414141473c474141413c69a2a4a4bca8c7c3c2e0c3bcd8e2d8d7d7d7edf5e9e0e9e9e9ef
+eff5efebefe0e9efeaedd8d7e6d8d8d7d8d7d8d7d8e5d8cce0c7ccbac0a4a29a694f3828
+3871557e7ea47e92a8c0b9c5baa8
+41533c5a41414f471d38567ea4a4bcc7c7aae0c3c2d8d8e5d7d7ddede4e9e0efefe0efef
+f5efe0efefefebe0f5ede0d7d8d7edd8ebd8d8e2d8d8d8d7c3c7bcbcc0a4a47e55414138
+41556971867e7ea8a8bac5bab5ba
+3838414147474f41382a5a79a2a4a4c7aac7c7cce0c2d8d8d7e6d8d7ede0e0efe0e9f5ef
+f5ebefefebefeff5e0e4e5e5edddd8d7d8d8d8e2d8c3c3d7c3c7c7c7c0a4a49a56535a41
+23696956a4a47992aac0cfc5b9ba
+413c533c3c47415a38383c7a86a2c0c7c7c7c7c3ccc2d8d8d7d7edd7eaebe9e9f5e0eae0
+e0ebe0e0eff5efeaf5d7eaebd8d8d7c3d7c7c7c2d8c2c3c3c7cccdc7a8a4a2a271693c25
+41416971c7a87aa8c2baa0c88a90
+4153414153413c6941384171a2a4bcbaa6c7aaaad7d8d5d8d8d7deded8ecebe9ebefeaed
+e0e9efe0ebebebedd8e5ebd8d8d5c7c7baa4a4c3c7c3b9c3bcc7c0c0c0c0a4a271564141
+3c3c698ea8a88ea8c2bedddaddf0
+715a717171717a5a4138387179a4a4a2a4cdcdc3cce0c3e2d7d8e0d8d7e0e9ebefebd7e0
+e0f5eceadee0ebded8cdcda2a4a4cda8b5c7c0a4a6c7a4a8a8bcc7c0c0a4b5b5797a4141
+415571a29aaa92bad7e4d8baa88e
+32383838325a3838843c38718e867979a4a4a4cdc7ccccd8d8d5d7d8d8e0e0e0ebe0d8ed
+f5e0e5e4e5e5d8cce0a4a48e987ebacdbaa4a4c0c0a8c792a4cdc0c0c0c0c0a2987a6941
+254fa4bac7c3a8c7c3b1ccd8ddeb
+38381d1d382a537171693871717e8e9879a2a2a4a4c3cce0d8ccd8d8e0d8f5e9e0e0e5e0
+e0e0d7d8e0d8a4a2a4985e715671c7a8bca4cda4a4c0cdc092c092a4c0c0a4b5a4718441
+416979c7aac3aaa8c37190717171
+24261326241d3841a2843c695671799898a28e8e8e8e989aa4c0c7c7d8d8d7e0e0e0d8ed
+d7e5d8d8c3cd7171563c414156418e71797998798e86a2a4a4c0c0bac092a4c0a271692a
+3856a4bac3bac2a4987198987169
+13262413262a5a717e5a3c416971798a7e7e79717171565a7e86a4bacdccc2d8eaead8e5
+edd8e2e0bac08e56565671715a56718e7171a4a4a4a486a4a492c0c0c0c0cda4a28e7138
+2556babac2c2c2a4798e98713c69
+988e247119388ea4a898713c5a56565e71717171715a4f413c3c5a71a2cdaad8d8e0edd7
+e0d8c2baa4a4bac092a4b5e9f5eb71716969697ea4a4a4a4a4bac7c7cdc7c7c0a2987141
+4155c2ded7cdd7a8719c98984171
+b5a2197e264190907c8e71415a414171987171717171717a71795e7171a4c0c3d7ead7d7
+e5d5e0a4a492c7a8a4a4cdffffffbcc25555717198a4cd92bac7cdccc3d7bcc7a4985e38
+3c56c0d7d7c2c8928ea2b1a25a71
+9ab1383226988e9ac5bab13c414f568e7171717aa47a9871a486a49a7e797ec7d7d8e0ed
+e0c2babaa4cd9292c0a4e2ffffffe5f85a71717e71a4c7bac7d8ccd7c3d7c7c0a4a27141
+3c71a4c3c2c2c2a479b1b1b15a90
+a484412a3841718471715632568e797971715e71e4e288718a4184a4a4a49a7ed8d8e0ea
+edd7c7a4cdbabaaabac2e5fdffff8888717aa4a4a292aac7ccc3e2d8e0c3c7bca27e7141
+388ebcc3bcc2c26571a4b1b17190
+b55a411d38698e8e908e9838568ea2988e563cd2e9d58855e94171b7a4cd7e86d7d7e0e0
+e4cca8a4baaac2a4cda6d1e5f5f5bca49cb7a28ea4c7ccc2c2d8d8d8c3d7bcc0b5a2843c
+38c0c792a8c3c27e8498b1a25ab1
+c05a552438567e8e79988e4169797ea4714171cdd7bc98713c4171d5cdbaa479d8d7e4ed
+dec3c7a4bac7cca8de8ea8aae0bacda4a4a492a4baccc3c2e2d8d8d7d8c3cda4a2a2713c
+41d1d1c7bababa7171a2b1a269a2
+c024711a5369718e718e7169418e8ea48e71718aa2baa288a4a4a4a49292a4a2c3c2d8d7
+d8c3bca8a4bac2d1aa9292a8baa4c0a4bababac7c2c2d8ccd8d8d7d7c2e0babaa298563c
+98cccdc2e2a4bc5a7198a2a269a2
+a82490266956718e8e8e8e715a71a4a47e7998a47e7ea4a2a4a4a4a4baa8a49aa8c2d7d7
+d8ccbabcbcc7d1bac7cdc7c3c3c2c2c2c2c3c3c3c3aad8d8d8d8d7f3d8e0c0a4a27a7155
+a2cdd1d7d8c792236990b1988498
+712d5a71718e8e8e8e98987e5a71a4a4a4a4a2a4a4a4aac0cda892a8baa47979c3bcd8d7
+c2aac2c7bca892cdc7cdaaaac3babaccc7d5ccd8d8d8d7d7edd7ebd8d8cca4b598988e98
+b7e0d8d8e2e0cd477198a29884a2
+413828384141414f697163905671a4a2a47ea4a4a4ba92bca892cda6c0a47979c3c2c8c8
+d8b9c3a6a8a6c7c7c7c3c7cdaae0d5e0d5d8ccd8d7d7d8d7d7ead8d8ccc3a4a479719898
+a4d1d8d8d8c2cd69908eb1b584a2
+412a242a2a382d2a2a2a38243869a4a4a2a2a2a492c092c0c792c792c079797ec2c2c2c8
+c2c3aac7bca6ccc2c3c2c2d5ccccd5d8ccd8d8d7d7d8eae4ebedead8d8e0c0a28e8e9898
+a4d5e2c2d7baa45a719ab1a271b1
+242a2a2a2a2d2a382a382a2a2a84a4cdcda4c0c0a4baa4a8c7a8c7bca48e8e7ec3c2d7c8
+d7c2a8c3a6c7c3c2d7d5d7d8d7d8d8d7d7d7c2d7d8d7edd8ead7edd8d8c7a49a798e7e8e
+a4d8e0d5c7a498848ea8a2b1a8b5
+192a3c2d2a2a2a2a2d2a2d3c245aa4a4babaa492c0a8a8bcc7a8a8a892797e86a6c2d8c8
+d7c2c3a8c3a8c2c2d8d8e0d7d8d8d7d7d8d7d7d7ead7d8ead8edd7d8d8c7a479798e8e7e
+cdc2c2c3a498a27e8ea890b18ea2
+19382841192a2a2a2d2a2a2a2471a492c7c7b9aac7aacda8aac7c2c7a6a47ea4a8c2e0d7
+c2c2c2c3c2aac2c2c2d7d7d7d8d8e0ede0e0e4ece0e5d7ead8e6d8d8d5d77e79988ea48a
+c0c2cd928e8e9871a8a89a98a298
+2a2a2a2a382a2a2d2a2a2a2a2a71a4c0bac7c3ccc3aac3c7ccaac2c3a479a47e92d8d8d8
+d7c3c2c2c3c3aac2c2d7d8d8edeae0d8e9e0eaede0ededd7d8edd8d8ccba9a717ea4a498
+92d1a47e90a2a88e9898a898a88e
+252d2a2a2a2a2a2a382a2a2a2498a492a8c3c7c3baccc3c2c3c3cca8a8a27ea2bcc2d8d7
+d7c3aac2c2c3c2c2c2d8d8edd7d7e4e0e0e0e9e0e0ecd7d7edd8d8cce0c77e717e989898
+a2868e8e8e90a271a8a298908e7a
+1d2a2a191d192a2a2a2a2a2a2498b1a4a4a6c7aac3c2c2c2c3c2c3c7bca2a48ea8c2d7d7
+d7c3aab9c3c2c2c8d8d7d7d7d8e0e0e9ede0e4e4ead7d7edd8d8d8e0d7c779719aa49898
+a271699890a8988a98a88e718e8e
+38192a2a24242424192a242a243f69a292c0aaccc2c2c2c2c3aac3c3c7a48e98a8c2d8d7
+c2ccc3a6c3c2c2d5c2d7d7e0e0d8e0e9e0e0ead8d7d7d8ddd8e2d7c7c7cd8e71a2989898
+a2798e988e8e988ea8a88e718e7e
+382a2a2a2a2a2a2a2a2a2a382a2a3856a4cda6c3c2c2ccccc2adc2c2c3a49aa4c2c2e4d7
+d8c2c3c3bac7c3aac7c2d7d8d7d7e0e4ece0d8d8d7d8d8d8d8c7c3cdc0ba988ea498a2a4
+ba9a988e8e9a9090a88ea8717990
+2a2a242d192a2d2a2a2a2d2a2a3c3841a492c7aabac2c2c2a8c2bac2c779a4a4c2d7d8d8
+d8c2c3c3c7c2c3c7a8aad7c2c2d8d7d7d8ece0d7d7d7d7d8c3e0aabcc0c098798ea498a4
+a4a2908ea8988e8e8ea88e719869
+2d2a2a2a2a2a2a242a24382a2a411938a2c0a8c7c3c2c2c2c2bac2c3a4a47e92c2c2d8e0
+d8d5d8babac2c2c3c7c7ccccc3c2d7d7e0d7ede6d8ebd8c2e0c7c7c792c0987a8ea2a4a4
+c0a28e8e8e8e8e79a88e8e698e8e
+2a2a3838192a25242a242a2a38532a3898a4a4a6c3c2ccc3aac7aaa4a4a2a4c3c2d8d7d8
+d8c2ccaaa8ccc2c2c7c2d8d7d8d8c2ccd7d8d8d8d8d8d8cccccdd7cda4a2989898a498a4
+a4a2a85e8e987190b1a89863908e
+382a2a2a2a2a2a2a2a38192a2a382a38797e92a8aac2babaaac7aaa4a2a492c7c2d8d7e5
+d7d8d8c3aac2c2aac7d5d7edd7d7d5c2d8d5d8d8d8d8cce0c7c0c7a4b5c0987e9898a2a2
+baa28e7198a88e8ea2988e69a86f
+242a192a2a192a2a1924242a24382a2a418ea4bac7bac7c2c7c2c3c0a47ea4c3d7d7deeb
+e0d8c2c2c3c2c3c792d7e5e0d8d8d8d8d8d8d8ccccc2e2cccdc0cdc0a4b598988ea2a2a4
+b5ba7e63988e9090a2a2907e908e
+1d242a2a382a2a2a242a2a2a242a2a2a3c717ea492c7c7c7ccc3aaa8a4a2a4c2c2d7ebef
+e0c2c2cdc3c2baa4bad8d5d8d8d8e0d8d5e2e0cce0d1d8e0c7c0cdc0a4b59898a4a2a4a2
+c0bca28469847e9890a8717e7190
+2a241924131919242a242a2a2a382a2a386979a2c092c7c7c3bac792a479a4aac8d7efef
+ded5c2baaababacdc2ccd5ccccc7cce0e0e0cce0cccdc3e0cdc0cdcdb7b57198a2a4b1a2
+a4a49a7a5353697e908e717e8e71
+3c38413c41233c413c2d413841382a3c383856a4a4a4a8c7cda4c0a4a4b7a4a4bac2cdcd
+bac0a4a2bababac7bae0baccc3c7e0ccc7d7d1ccc3c7e0c7c0a4cdc0a4b57198a2a4e0a4
+c0c0a4a441536369698e6d719071
+4141413c4138382a38414141413c413c413c41a2a4b5c0aac0c0a4a4a2a4a4a4babacccd
+c0a4cdbac7ccccbae0d1d5cccdbac2d1d1c2d1e0ccd7d5ccc0b5cdcda4b58e98a2b7cca2
+a4a4a2b57153696969845a90906d
+382a381938285341262424241d2a23382d415a79a4a4b5a4a4a2a2a4a4a4a4bca4cdbccd
+bad1cdcdd1c2d1cccccccccccdbaa8bac7cdbaccd8ccd5d7a4b5bac0b7a48ea4a4d1e0a2
+cda4baa48e695c535c843869715a
+191a2a98a4903c84714138382424241d242a2d71a2b5a4a4a4a4a286a4a4b7a4a4bcbac2
+d5bad1bad5d5c2e0d5d5c2c2aacda2a492bac7a8c2e0d8ccc0a4c0b7a2a498a4b5e0d1a2
+cca4a2c069696969698438262624
+b5d2bc71533f5c53719c693c41532a2624242469a2a4a2a2a2a2a4a286a492a4bcbcd5d5
+d8d5bacdd5d7d7cdd5c2cccdbaa479a4a492cdc3d8d8d5d7a4c0c0b5b1a48ab1c3d8cda2
+e0c0a4927e695c69846941381d24
+413c3c3c41413c413c41535369555371719c69697ea4a4b5a2a4a47e7e7ea492a8aaccd1
+cdcdcdc2aacda8a4b7bccda47e8abaccccd7c7c2e2e0d1baa4a4b7b5a2a4a2b1d5e0a2c7
+ccc0ba98715c715c845c695c2a19
+533c53413c3c3c3c413c413c41533c2d383c534169b5c0a4a2a4a4cda47e79988ea4a4ba
+92bacda49acdcde0e9d7e28e657ec2d8d5d1c2d5d8d8e0d1a4b5c0b5a48ea4a2d5c0a4c7
+c7cd7e715c715c5c5c5c69696941
+53413c3c3c3c413c2d3c5341413c41533c533c3c53a4a4a4c0b7a4bcba8a4171c0cdd1cd
+babc9acdece5e4f0f5a4928ea4bad5d7c2ccc7cce2d8bac0b5a2a4b7a27a98b5e0c07ec2
+bcc771695c5c69845c84535c7ec5
+41533c3c533c533c3c533c3c2a5569698e8e798ea290a4a4bacda4c0bc86796b6b71cdd1
+dee9cdbce9e5798e869292c7c3d5d7d5c2bad5cccccccda4a4a2a4b79879bce2cda29ccc
+c0c069555c5c695c5c695c698469
+53472d3c413c413c3c3f535341698ea4a28e989898698aa4cda4bca4a4a486656b658aa4
+a4c08671a48e798c92aabac2ccd8d8d5d8e0ccd1cce0cda4a4a4b5a27a98cdd5a4a4a4aa
+c0a45355695c69695c5c5c5c535c
+718441413c413c383c6990b5a2a8989a7e5a41262d418498b5a4a4a4a4a48686866b8c8c
+a692929292aac3aabac2ccc2c3d8e2d8c3bac3cdcdbac0a4a4a2bc987aa2e0e0a47ecccd
+cd7e5353695c6969695c7e4f5c7e
+b1a4a2a29890848e989aa29aa8a2a85a2a415a98b1c09879a4a4c0a4a4a4a4a47e8ca692
+adadc2adc2c2c2c2c2c2cdccccccd5c2ccc7ccc7cccdc0a498a4a49c98b7d1cca2a2cccd
+cd5569535c715c695369535c695c
+a2a2b1a8a2a29898b198a8b59aa22a3c98b1b5a2c5c5b590a4a4a4a4a4a4a2868e8c92aa
+adc2c2adc2c2c2c2c2c2aaaac2ccd5ccccccc7cdc7c0a4a29aa4a271a4cdd5c7a4c7d8bc
+cd53555c695c5c5c5c535c69635c
+a2a2a298a298b1a2a2cdc04169b5d8d8e9cfcc8456325a3c8e8aa4a4a4a4a48ea4a48c92
+9292aaaa92adbababababac3c2bac2ccccccc092c0c7a2a4b1a2a4a2e0e0cdc0c7d7e0cd
+a25c695c69695c5c697e695c695c
+416998a2b1989c90b5a869c2ead7e1e0474153694f383c3c717186a4a4baa27ea4a4a48c
+a49aa49aa4a4bababaaac7bac2c2c2c3cccdcdcdc0baa48e7a9898cdcdd5d1a4ccd8c3c0
+6969534f5c5c69696969695c6984
+7e7169695353533c69a2c0d7d7e02a38535c69716d5a695a719098a2a4a4a4a48ca49292
+c0c0babac2c2aaaaccaac3bac3c3c3ccc7bacdc0a4b57a8e9871b7d5e0c3c0c0d8d8d771
+696953555c535c5c5c5c695c845c
+d8cfc5716969697ec0e1d7d7e1b57198b5b5d2b5b59a906f7c8e718aa4b7a4a4a4a4c0ba
+a492babad1c2ccbac2cdbaaaccbac3bac7c7cdc0a4a2717198bccde0d5d1cdbae5d8d169
+5c556953555c5c695c5c695c695c
+d8d8bcc0d8c5a2d8e9d8ead7d8a2c5cdcfc0a28e715a7e715a71717ea4a4bca4a4a4baa4
+bababaaac2c2c2c3c2c2c2bac7c2e0aacdc092a4a4a471988acdbad1c2d7d1cce5d8c755
+69535c4f5c6953695c5c5c715c69
+d8c5c0bcd8d8d8d8c0d8e19090a2a8bad8cdd8383253694f98a8a28e7aa4a4a4a4a4c092
+cdbac7bac2c2c2cccdc7c2baccd1ccc7c7a4c0a47e7171a2ccc2d1d1d1cce0e2d8e08a55
+55555353695c555c5355535c6969
+c5c5c0d8c0c0d8d8d8d8cd90c0ccd7d8e1c0988ea2c0c56f1d5a4f717aa492b5a4a492c0
+a8aac2c2ccc2d8c2d5c2aac3c2c2bac7babca4a29871a4c0d1d1d1baccbac2edd7c07153
+53535c55534f5c5355535c555c53
+a8a2c5a2bab1c5a86f6990d8bcd8e9c09090b5c5c0c0bac03c412841718aa4a4a4a492a4
+baccc2d5c2d5ccd8c2c2d1c7aacdaac0c7b5a47a98a4babacce0bad1cdc2ecedd1693f53
+556953555c6953695c53555c5c69
+c0c2b5c2a8baa2cca2c5b5b5c5c0c5a89abac5c0d8c0c5b1413c3c3c418a86a2a4a4a4ba
+bac2c2d5d5ccc2e0c2d5c2ccd1c2c7c0baa47e7ea4cdc7ccccd1ccc2d7d5edf38a556953
+554f5c5c5353555353555c5c6953
+c0c5c5c5b5c5c0a2b1c5c0c5c0c5c5c0c0c5c5c5c5c0c541413c3c3c418e8aa2b7a4bc92
+bac2c2c2c2d1c2d1c2c2d5c2cdbaba92c08698a4bca8aacdcccccdccccd8ecd884535355
+535c5553555c535c5553535c5353
+c5d2c5c0c0c0c0ccd8c5c0c5ccc5c0d8c0ccc5c0c598414141414141413f5698a4a4bcbc
+baccc2c2ccd1ccccc2ccccbabac7a4b7a2a4b592c0bacdcdcccdccd5e5ebedd553535553
+554f5c555c53535c53555c5c5355
+5a4f6da8c0c0d8c0c0c0c0c0c0c5c0a2b1a89a8e9a5541283c2541254141417a86a4a4c0
+cdd1d1c2cdbabcbaccd1c2c7a4a4b7a48ea4bcc0cda492e0d1d1ccccd8edf3b555535355
+695553535c693f5353695c534153
+717171719071449a908e5a73b9afbaa2a2a88e557e3c3c3c3c2d533c3c41412a718a8aa4
+a4cdbaa4bcbcbac0baa8c0a48aa47ea4a4a4cdc0ba92baccd1d1c2d8d8e5cd415341535c
+5553555353555355555353533f3f
+5a5a6d8e8ea8e9d7dacfd7cdcccfb99869381d192441413c3c4128413c3c414155718a8a
+a4a4a4bca4b7a49ab7b7a498a498a4a4a4cd92cdcdcdcdc7cccccce5d8d88e53534f5553
+535c4f5c55535c5353555355533f
+26383871757cc5bac5cfcad7dad8d8da735a381d383c412841282d2841533c2d41537171
+79a49886a4a4a4a4a27a7e8a9ca4a4a4a4c0cda8cda8bacde0ccd8e2e5d8565353415353
+5c535c415c534f534f533f5c3c3f
+4141532d2a2a24383c5a8ea8bac5ba4f7a9a8e3c41233c25284141413c413c413c41413c
+3c4171a2a4a4a4a4a4a4a4a4a4a2a4a2a4a4a4a8cda8d1bad5d8e2d8f0d73f4f53415c55
+554f555c5c55534f41555c553c3c
+a2c2a88ea8988e71534141718e8e7c6f902d242a283c2a282828283c53412a3c3c3c533c
+3c536971a4a4a4b5b7a4a4a2a4a4a4b5bac0babac0c7baccd5e2d8e0d5cd53553f535553
+4f534f5c5553535369533c41282a
+ccb5c5b5c5c0b5c5c5c0b1b5a2b1909c715a532d3c3c3c3c282d413c41413c413c41413f
+3c414155987e8aa4a4a486a4a4a4b5b5a4a4cdbac7baccd5d8e2e2e2cd553f533f555553
+535c5553533c53553c3c3c383c41
+b5ccccc5c0b5c0ccb5b5b5b5b1b5b1a25a6d712a2d2828282828415328413c3c3c413f53
+3c41535671717988a48aa4a4a4a4a4c0a4cdbacdaae0e0d5e0d5e0e09c3c41535c53534f
+5c535c3f2a5355533c3c2a2a5553
+c0b5ccccc0c0b5c0ccc2a2b5b5b1b1907e7171284141253c4141253c413c4141413c3c3c
+282841555671987a86a4a4a4a4a2a4a4a492cdbacdd1e0d1e0e2d8cd7153533f53535555
+53553c2d555c53413f2a413f3f55
+8eb5bacde1cde1cfb5cca2b5b5b58e90636d7e1d2828282a3c2a284153412841413c3c28
+41254171717171987ea498a2a4a4b5a4c0c0c0cdaad7cce0e2e2e0563c4155535553535c
+55555371533c3f282a3f41414141
+714f3c4f5a6f98adbcc2a2c5ccc08e71717e713c3c3c3c3c3c2d414128413c413c3f4128
+284155847171717e88a47e86a4b7a4b7a4cdbac7bacccce0e0c3cd5341535553535c555c
+553f555c3c3f3c2a5c553f3f5641
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
diff --git a/Master/texmf-dist/source/generic/xypic/xy.doc b/Master/texmf-dist/source/generic/xypic/xy.doc
new file mode 100644
index 00000000000..54ac9fca7d0
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xy.doc
@@ -0,0 +1,8324 @@
+%% $Id: xy.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Basic Xy-pictures: Xy-pic bootstrap and kernel macros.
+%% Copyright (c) 1991-1999 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-1999 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined\else\message{not reloaded}\endinput\fi
+\let\xyloaded=\relax
+
+% NOTE: Apart from the actual macros (as also found in xy.tex), this file
+% contains both the Xy-pic kernel reference manual and TeXnical documentation.
+% See xyrefer.man and xysource.man for how to typeset this information.
+
+\message{Bootstrap\string'ing\string:}
+
+{\catcode96 12\catcode`\#6\catcode`\.12\catcode`\:12\catcode`\'12\catcode`\@11
+\ifx\xywarnifdefined\undefined\else \immediate\write16{}%
+ \immediate\write16{Xy-pic Warning: \string\xywarnifdefined\space redefined.}%
+ \immediate\write16{}\fi
+\gdef\xywarnifdefined#1{\ifx#1\undefined\else \immediate\write16{}%
+ \immediate\write16{Xy-pic Warning: `\string#1' redefined.}%
+ \immediate\write16{}\fi}
+\xywarnifdefined\xydef@ \gdef\xydef@#1{\xywarnifdefined#1\gdef#1}
+\xywarnifdefined\xylet@ \gdef\xylet@#1{\xywarnifdefined#1\global\let#1}
+\xywarnifdefined\xynew@
+ \gdef\xynew@#1#2{\xywarnifdefined#2\csname new#1\endcsname#2}}
+
+\message{catcodes\string,}
+
+\xywarnifdefined\xyuncatcodes
+\xywarnifdefined\xyreuncatcodes \def\xyreuncatcodes{\edef\xyuncatcodes{%
+ \catcode92 0 \catcode123 1 \catcode125 2 \catcode37 14
+ \catcode 9 \the\catcode 9 \catcode10 \the\catcode10 \catcode12 \the\catcode12
+ \catcode35 \the\catcode35 \catcode36 \the\catcode36 \catcode38 \the\catcode38
+ \catcode43 \the\catcode43 \catcode45 \the\catcode45 \catcode46 \the\catcode46
+ \catcode47 \the\catcode47
+ \catcode60 \the\catcode60 \catcode61 \the\catcode61 \catcode62 \the\catcode62
+ \catcode64 \the\catcode64 \catcode96 \the\catcode96
+ \newlinechar \the\newlinechar \endlinechar \the\endlinechar }}
+\xyreuncatcodes
+
+\xywarnifdefined\xycatcodes \def\xycatcodes{%
+ \catcode 9 10
+ \catcode 35 6 \catcode 36 3 \catcode 38 4
+ \catcode 43 12 \catcode 45 12 \catcode 46 12 \catcode 47 12
+ \catcode 60 12 \catcode 61 12 \catcode 62 12
+ \catcode 64 11 \catcode 96 12 }
+
+\xycatcodes
+
+\message{docmode,}
+
+{\catcode`\|0 \xywarnifdefined|DOCMODE
+\gdef|DOCMODE#1{\ifx(#1\relax \xycatcodes \expandafter\ignorespaces
+ \else \skipspecials@ \expandafter\docm@\fi}%
+
+\xywarnifdefined\skipspecials@
+\gdef\skipspecials@{%
+ \catcode`\\12 \catcode`\{12 \catcode`\}12 \catcode`\#12 \catcode`\%12
+ \catcode`\^^L12 \endlinechar`\^^J }%
+
+\catcode`\/=12 \lccode`\/`\\%
+\lccode`\D`\D \lccode`\O`\O \lccode`\C`\C \lccode`\M`\M \lccode`\E`\E
+\lowercase{%
+\xywarnifdefined\docm@ \gdef\docm@{\docm@i}%
+\xywarnifdefined\docm@i \gdef\docm@i#1^^J{\docm@ii#1/DOCMODE\docm@iii}%
+\xywarnifdefined\docm@ii
+ \gdef\docm@ii#1/DOCMODE{\def\next@{#1}\futurelet\next\docm@iii}%
+\xywarnifdefined\docm@iii \gdef\docm@iii#1\docm@iii{%
+ \ifx\next\docm@iii \let\next\next@ \docecho@ \let\next@\docm@
+ \else\ifx\next@\empty \let\next@\docfinish@
+ \else \edef\next@{\noexpand\docm@iv\next@/DOCMODE#1\noexpand\docm@iv}%
+ \fi\fi \next@}%
+\xywarnifdefined\docm@iv
+ \gdef\docm@iv#1/DOCMODE\docm@iv{\def\next{#1}\docecho@ \docm@}}%
+
+\xywarnifdefined\docecho@ \global\let\docecho@\relax
+\xywarnifdefined\docfinish@ \gdef\docfinish@{\xyuncatcodes|DOCMODE\next}}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ After giving an overview of the \Xy-pic environment in \S??[env],
+ this \FILE\ document the basic concepts of \Xy-picture construction
+ in \S??[basics], including the maintained `graphic state'. The
+ following sections give the precise syntax rules of the main \Xy-pic
+ constructions: the position language in~\S??[pos], the object
+ constructions in~\S??[object], and the picture `decorations'
+ in~\S??[decor]. \S??[objectlib] presents the kernel repertoire of
+ objects for use in pictures; \S??[option] documents the interface to
+ \Xy-pic options like the standard `feature' and `extension' options.
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Details of the implementation are not discussed here but in the
+ complete \TeX\-nical documentation~\cite{RM95:Xy-picCSTC}.
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Section \S??[algo] documents the more complicated algorithms used to
+ compute directions, edges, and connections.
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{The \Xy-pic implementation}
+??=[env]
+
+ This section briefly discusses the various aspects of the present
+ \Xy-pic kernel implementation of which the user should be aware.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Loading \Xy-pic}
+??=[env.loading]??w[loading]
+
+ \Xy-pic is careful to set up its own environment in order to function
+ with a large variety of formats. For most formats a single line with
+ the command
+$$
+ ??c![\input xy]
+$$
+ in the preamble of a document file should load the kernel (see
+ `integration with standard formats' below for variations possible
+ with certain formats, in particular \LaTeX~\cite{L94:LaTeX}).
+
+ The rest of this section describes things you must consider if you
+ need to use \Xy-pic together with other macro packages, style
+ options, or formats. The less your environment deviates from plain
+ \TeX\ the easier it should be.
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Consult the \TeX\-nical documentation~\cite{RM95:Xy-picCSTC} for the
+ exact requirements for other definitions to coexist with \Xy-pic.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{File header:}
+??w[file header]
+
+ Here is what actually happens in the header of |xy.doc|. It contains
+ the copyright message, protection against ??w![loading] the file more
+ than once, and then bootstrap code to handle category codes and the
+ ??c![DOCMODE] format---we explain each separately below:
+
+\DOCHEADER
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Privacy:}
+??w[privacy]
+
+ \Xy-pic will warn about control sequences it redefines---thus you can
+ be sure that there are no conflicts between \Xy-pic-defined control
+ sequences, those of your format, and other macros, provided you
+ load??w[loading] \Xy-pic last and get no ??w![warning
+ messages] like
+$$
+ |Xy-pic Warning: `|\dots|' redefined.|??w[redefined]
+$$
+ In general the \Xy-pic kernel will check all control sequences it
+ redefines "except" that (1)~generic temporaries like ??c![\next] are
+ not checked, (2)~predefined font identifiers (see~\S??[env.fonts])
+ are assumed intentionally preloaded, and (3)~some of the more exotic
+ control sequence names used internally (like |@{-}|) are only
+ checked to be different from ??c![\relax].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This is handled by ??c![\xywarnifdefined]---after we have ensured
+ that it is unique itself\footnote{This may seem paranoid but in fact
+ many inconvieniences in the \TeX\ world stem from the fact that
+ somebody copied somebody elses definition of, say,
+ {\tt\string\xywarnifdefined}, modified it, and then used it in
+ something that somehow got distributed! The `flat name space'
+ problem remains \TeX\ largest problem as a programming language in
+ this \TeX\ hackers opinion.}. ??c![\xydef@], ??c![\xylet@], and
+ |\xynew@{|<type>|}|??c[\xynew@] are abbreviations used to this end
+ throughout \Xy-pic instead of ??c![\let], ??c![\def], and the
+ |\new|<type> commands.
+
+ Next some auxilliaries: |\xydefcsname@| is similar to |\xydef@|
+ except that it builds the control sequence with ??c![\csname] \dots\
+ ??c![\endcsname] which means that it is |\relax| when undefined---there
+ is thus no way to prevent redefinition of control sequences bound to
+ ??c![\relax]~\frowny.
+
+\DOCMODE(
+\xydef@\xydefcsname@#1{\DN@{#1}\DNii@##1{%
+ \ifx ##1\relax\else \xywarning@{\string`\string##1\string' redefined}\fi
+ \def##1}%
+ \expandafter\nextii@\csname\codeof\next@\endcsname}
+\DOCMODE)
+
+ |\xyletcsnamecsname@| is to ??c![\let] one weird control sequence
+ be the same as another using several |\expandafter|s:
+
+\DOCMODE(
+\xydef@\xyletcsnamecsname@#1#2{\def\1{#1}\def\2{#2}\DN@##1##2{%
+ \ifx ##1\relax\else \xywarning@{`\string##1\string' redefined}\fi
+ \let##1=##2}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\csname\expandafter\codeof\expandafter\1\expandafter\endcsname
+ \csname\codeof\2\endcsname}
+\DOCMODE)
+
+ Finally ??c![\codeof]: a useful hack used to allow any characters in
+ control sequences: ??c![\codeof]<cs> expands to the characters of the
+ control sequence <cs> as a string of `other' characters, \ie, all of
+ category 12 and with a \verb*/ /$_{12}$ after every control sequence.
+ The <cs> must be a macro or it blows up.
+
+\DOCMODE(
+\xywarnifdefined\codeof
+\xywarnifdefined\codeof@
+{\catcode`\:=12 % to ensure that all of :-> and <-: are other :-)
+ \gdef\codeof#1{\expandafter\codeof@\meaning#1<-:}
+ \gdef\codeof@#1:->#2<-:{#2}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Category codes:\ }
+
+ The situation is complicated by the flexibility of
+ \TeX's input format. The culprit is the `??w![category code]'
+ concept of \TeX\ (\cf~\cite[p.37]{K84:TeXbook}): when loaded \Xy-pic
+ requires the characters {\tt\char32}|\{}%| (the first is a space) to
+ have their standard meaning and all other printable characters to
+ have the "same category as when \Xy-pic will be used"---in particular
+ this means that (1)~you should surround the ??w![loading] of \Xy-pic
+ with ??c![\makeatother] \dots\ ??c![\makeatletter] when loading it
+ from within a \LaTeX\ package, and that (2)~\Xy-pic should be loaded
+ after files that change category codes like the ??c![german.sty] that
+ makes |"| active??w[active characters]. Some styles require that you
+ reset the catcodes for every diagram, \eg, with ??c![french.sty] you
+ should use the command |\english| before every |\xymatrix|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ We define ??c![\xyuncatcodes] to restore the current catcodes, and
+ ??c![\xycatcodes] to install our own.
+
+ Here is an exact list of the category codes which \Xy-pic requires
+ (all standard in plain \TeX):
+$$
+\vcenter{\tabskip=.5em plus1fil \halign to\displaywidth{#\hfil&&\hfil#\hfil\cr
+ character(s) &|\| &|{| &|}| &CR &TAB SP&|A|--|Z| |a|--|z| &|0|--|9| &|%| \cr
+ category code & 0 & 1 & 2 & 5 & 10 & 11 & 12 & 14 \cr}
+}$$
+ Furthermore none of the remaining printable ASCII characters
+$$
+ |!"#$&'()*,/:;?@[]^_`||~|
+$$
+ may be of category 0, 1, 2, 9, 14, or 15, because all should be
+ tokens allowed in the replacement text of a |\def|---this also means
+ that they may not be active characters defined to be ``|\outer|''!
+
+ All other catcodes needed are established using ??c![\xycatcodes]
+ defined above---this is the reason the macros must be loaded at a
+ time where the category codes are stable (otherwise it will make them
+ stable!).
+
+ Internally \Xy-pic enforces the following category codes:
+$$
+\vcenter{\tabskip=.5em plus1fil \halign to\displaywidth{#\hfil&&\hfil#\hfil\cr
+ character &|#|&|$|&|&|&|'|&|+|&|-|&|.|&|<|&|=|&|>|&|@|&|`|\cr
+ ASCII code & 35& 36& 38& 39& 43& 45& 46& 60& 61& 62& 64& 96\cr
+ category code& 6 & 3 & 4 & 12& 12& 12& 12& 12& 12& 12& 11& 12\cr
+ abbreviation&|HASH|&|DOLL|&|AND|&|RQ|&|PLUS|&|DASH|&|DOT|
+ &|LT|&|EQ|&|GT|&|AT|&|LQ|\cr}
+}$$
+ with special control sequences named |\add|<abbreviation>|@| that
+ take an argument and expand to it followed by the original character
+ token, \ie, many tests throughout the program look like |\addDOT@|
+ |\ifx| |\next| \dots
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xywarnifdefined\addAT@
+\xywarnifdefined\addHASH@
+\xywarnifdefined\addDOLL@
+\xywarnifdefined\addAND@
+\xywarnifdefined\addRQ@
+\xywarnifdefined\addPLUS@
+\xywarnifdefined\addDASH@
+\xywarnifdefined\addDOT@
+\xywarnifdefined\addLT@
+\xywarnifdefined\addEQ@
+\xywarnifdefined\addGT@
+\xywarnifdefined\addLQ@
+
+\xydef@\xymakeADD@#1#2 #3 {\ifnum\catcode#3=6 \def#1##1{##1#2#2}%
+ \else \def#1##1{##1#2}\fi}
+
+\xydef@\xyrecat@{\xymakeADD@\addAT@}
+\xydef@\xyrecat{\xyrecat@}
+\xydef@\xyresetcatcodes{\def\xyrecat{\xyrecat@}\xyreuncatcodes
+ \input xyrecat \relax \xyuncatcodes}
+
+\xyuncatcodes \xyresetcatcodes \xycatcodes
+
+\xydef@\testAND@{{\aftergroup\ifx
+ \addAND@\ifx\next\addFalse@\else\addTrue@\fi}}
+\xydef@\addFalse@{\aftergroup\iffalse}
+\xydef@\addTrue@{\aftergroup\iftrue}
+\DOCMODE)
+
+\inputdoc!{xyrecat.doc}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The last block of the \Xy-pic header bootstraps the ``??c![DOCMODE]
+ format'' used in |.doc| variants of \Xy-pic macro files in order to
+ keep documentation and macros together in a literal programming style
+ (this is redundant in the |xy.tex| macro file where all instances of
+ |DOCMODE| have been eliminated (see chapter \S??g[:Makefile] for how
+ this is accomplished) but it is included anyway since users may load
+ options still in |DOCMODE| format). The details of |DOCMODE| are
+ described in |xydoc.sty|, a special \LaTeX\ package used to typeset
+ \Xy-pic documentation; please read it if you intend to write \Xy-pic
+ options.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Integration with standard formats}
+??w[formats]
+%
+ This is handled by the |xyidioms.tex| file and the integration as a
+ \LaTeX~\cite{L94:LaTeX} package by |xy.sty|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ We input |xyidioms.tex| from the kernel:
+
+\DOCMODE(
+\input xyidioms
+\DOCMODE)
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{xyidioms.tex:}
+??c[xyidioms.tex]%
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{xyidioms.doc:}
+??c[xyidioms.doc]%
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\inputdoc!{xyidioms.doc}
+
+\paragraph{xy.sty:}
+??c[xy.sty]%
+%%
+ If you use ??w![\LaTeX] then this file makes it possible to
+ load??w[loading] \Xy-pic as a `??w![package]' using the
+ ??w![\LaTeXe]~\cite{L94:LaTeX} ??c![\usepackage] command:
+%
+\begin{defs1}
+??c![\usepackage] |[|<option>|,|\dots|]| |{xy}|
+\end{defs1}
+\noindent\unskip
+%
+ where the <option>s will be interpreted as if passed to
+ ??c![\xyoption] (\cf~\S??[option]).
+
+ The only exceptions to this are the options having the same names as
+ those driver package options of \GROUP~??g[:drivers], which appear in
+ \cf~\cite[table 11.2, p.317]{GMS94:LaTeXC} or the \LaTeXe\ |graphics|
+ bundle. These will automatically invoke any backend extension
+ required to best emulate the \LaTeXe\ behaviour. (This means that,
+ \eg, ??C![dvips] and ??C![textures] can be used as options to the
+ ??c![\documentclass] command, with the normal effect.)
+
+ The file also works as a \LaTeX~2.09~\cite{L86:LaTeX} `??w![style
+ option]' although you will then have to load options with the
+ |\xyoption| mechanism described in \S??[option].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Here is the raw source of |xy.sty|.
+
+\inputdoc0{xy.sty}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Logo, version, and messages}
+??=[env.logo]
+
+ Loading \Xy-pic prints a ??w![banner] containing the version and
+ author of the kernel; small progress ??w![messages] are printed when
+ each major division of the kernel has been loaded. Any options
+ loaded will announce themself in a similar fashion.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Of these, ??c![\stripRCS] is a very useful hack for extracting the
+ first component of an RCS |$|\dots|$| keyword value.
+
+\DOCMODE(
+\xydef@\stripRCS$#1${\stripRCS@#1: @@ @@@}
+\xydef@\stripRCS@#1: #2@ #3@@@{%
+ \ifx @#2\string?\else\ifx :#2\else\stripRCS@@#2\fi\fi}
+\xydef@\stripRCS@@#1 #2: @{#1}
+
+\edef\next{\stripRCS$Revision: 3.7 $}
+\xylet@\xyversion=\next
+
+\edef\next{\stripRCS$Date: 1999/02/16 15:12:50 $}
+\xylet@\xydate=\next
+
+\xydef@\Xygreet@{%
+ \W@{}%
+ \W@{ Xy-pic version \xyversion\space<\xydate>}%
+ \W@{ Copyright (c) 1991-1998 by Kristoffer H. Rose <krisrose@ens-lyon.fr>}%
+ \W@{ Xy-pic is free software: see the User\string's Guide for details.}%
+ \W@{}}
+\Xygreet@
+\expandafter\everyjob\expandafter{\the\everyjob\Xygreet@}
+
+\message{Loading kernel:}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ If you refer to \Xy-pic in your written text (please do~\smiley~)
+ then you can use the command ??c![\Xy]|-pic| to typeset the
+ ``??w![\Xy-pic]'' ??w![logo]. The ??w![version] of the kernel is
+ typeset by ??c![\xyversion] and the release date by ??c![\xydate] (as
+ found in the banner). By the way, the \Xy-pic "name"\footnote{No
+ description of a \TeX\ program is complete without an explanation of
+ its name.} originates from the fact that the first version was
+ little more than support for $(x,y)$ coordinates in a configurable
+ coordinate system where the main idea was that "all" operations could
+ be specified in a manner independent of the orientation of the
+ coordinates. This property has been maintained except that now the
+ package allows explicit absolute orientation as well.
+
+\DOCMODE(
+\xydef@\Xy{\leavevmode
+ \hbox{\kern-.1em X\kern-.3em\lower.4ex\hbox{Y\kern-.15em}}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Messages that start with ``|Xy-pic| ??c![Warning]'' are indications
+ that something needs your attention; an ``|Xy-pic| ??c![Error]'' will
+ stop \TeX\ because \Xy-pic does not know how to proceed.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ We use the input line number if available and rudimentary help in the
+ form of a reference to the manual if no specific help string is
+ given. ??c![\newlinechar] is set locally to |^^J| while writing such
+ that messages of several lines can be written.
+
+\DOCMODE(
+\message{messages;}
+
+\xywarnifdefined\thelineno@
+\ifx\inputlineno\undefined \edef\thelineno@{\string?}
+\else \def\thelineno@{\the\inputlineno}\fi
+\xydef@\xytracelineno@{ \string[\jobname:\thelineno@\string]}
+
+\xydef@\xywarning@#1{{\newlinechar=10 %
+ \W@{}\W@{Xy-pic Warning: #1\xytracelineno@.}\W@{}}}
+
+\xydef@\xyerror@#1#2{\if\inxy@\xy@{ERROR #1}{}\fi
+ {\def\2{#2}\newlinechar=10 %
+ \ifx\2\empty \errhelp{See the Xy-pic manual for further information.}%
+ \else \errhelp{#2}\fi
+ \errmessage{Xy-pic error: #1}}}
+\DOCMODE)
+
+ Finally one that I hope will never get expanded~\frowny
+
+\DOCMODE(
+\xydef@\xybug@#1{{\newlinechar=10 %
+ \errhelp{This is a bug in Xy-pic and should not happen!^^J%
+If it did then please send a bug report with the offending Xy-pic code^^J%
+to the author of Xy-pic, krisrose@ens-lyon.fr.}%
+ \errmessage{Xy-pic BUG: #1 -- notify krisrose@ens-lyon.fr.}}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Fonts}
+??=[env.fonts]
+
+ The \Xy-pic kernel implementation makes its drawings using five
+ specially designed ??w![fonts]:%
+%
+??w[dashes]??w[tips]??w[circles]??w[hooks]??w[squiggles]
+$$
+\begin{array}{\otherbar c\otherbar c\otherbar l\otherbar}
+\hline
+ \hbox{Font} & \hbox{Characters} & \hbox{Default}\\
+\hline
+ ??c![\xydashfont]& \hbox{dashes} & ??c![xydash10]\\
+ ??c![\xyatipfont]& \hbox{arrow tips, upper half} & ??c![xyatip10]\\
+ ??c![\xybtipfont]& \hbox{arrow tips, lower half} & ??c![xybtip10]\\
+ ??c![\xybsqlfont]& \hbox{quarter circles for\qquad} & ??c![xybsql10]\\
+ & \hbox{\qquad hooks and squiggles} &\\
+ ??c![\xycircfont]& \hbox{$1/8$ circle segments} & ??c![xycirc10]\\
+\hline
+\end{array}
+$$
+ The first four contain variations of characters in a large number of
+ directions, the last contains 1/8 circle segments.
+
+\paragraph*{Note:}
+ The default fonts are not part of the \Xy-pic kernel "specification":
+ they just set a standard for what drawing capabilities should at
+ least be required by an \Xy-pic implementation. Implementations
+ exploiting capabilitites of particular output devices are in use.
+ Hence the fonts are only loaded by \Xy-pic if the control sequence
+ names are undefined---this is used to preload them at different sizes
+ or prevent them from being loaded at all.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ To be more precise, \Xy-pic requires ??c![\xydashfont] to be a
+ "??w![semidirectional]" font as \MF\ will generate with the driver
+ file ??c![xyd2.mf]---this is very important because the "??w![italic
+ corrections]" of the characters in this particular font are used to
+ approximate trigonometric computations, so if you replace
+ ??c![\xydashfont] be sure to replace it with another semidirectional
+ font! Similarly, the three fonts ??c![\xyatipfont],
+ ??c![\xybtipfont], and ??c![\xybsqlfont] should be
+ "??w![directional]" as \MF\ will generate with the driver file
+ ??c![xyd.mf].
+
+ Finally, ??c![\xycircfont] should contain $1/8$ circle segments of
+ various radii as described in |xycirc10.mf|.
+
+ The following code loads the fonts "unless it was already loaded" and
+ defines some associated dimensions for ??c![\xydashfont] and
+ ??c![\xybsqlfont]: for each of these $f$ we define $f_\ell$ as the
+ length of a unit in the current direction (used when juxtaposing for
+ connections), $f_h$ as the height of the unit (used for several
+ parallel connections), and $f_w$ as the `line width' of the unit (to
+ know how to interface to rules).
+
+\DOCMODE(
+\message{fonts;}
+
+\xydef@\xyfont@#1{\ifx#1\undefined \DN@{\global\font#1}\expandafter\next@
+ \else \xywarning@{Using previously loaded \string#1\space font}\fi}
+
+\xyfont@\xydashfont=xydash10
+\xydef@\xydashl@{\fontdimen6\xydashfont}
+\xydef@\xydashh@{\fontdimen5\xydashfont}
+\xydef@\xydashw@{\fontdimen8\xydashfont}
+
+\xyfont@\xyatipfont=xyatip10
+\xyfont@\xybtipfont=xybtip10
+
+\xyfont@\xybsqlfont=xybsql10
+\xydef@\xybsqll@{\fontdimen6\xybsqlfont}
+\xydef@\xybsqlh@{\fontdimen5\xybsqlfont}
+\xydef@\xybsqlw@{\fontdimen8\xybsqlfont}
+
+\xyfont@\xycircfont=xycirc10
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Allocations}
+??=[env.alloc]??w[allocation]
+
+ One final thing that you must be aware of is that \Xy-pic allocates a
+ significant number of dimension registers and some counters, token
+ registers, and box registers, in order to represent the state and do
+ computations. The current kernel allocates 4~counters,
+ 28~dimensions, 2~box registers,4~token registers, 1~read channel, and
+ 1~write channel (when running under \LaTeX; some other formats use
+ slightly more because standard generic temporaries are used).
+ Options may allocate further registers (currently loading
+ "everything" loads 6~dimen-, 3~toks-, 1~box-, and 9~count-registers
+ in addition to the kernel ones).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\message{allocations:}
+\DOCMODE)
+
+ See \S??[env.loading] for scratch register allocations.
+
+\paragraph*{Picture state:}
+
+ These realise the picture state as described in \S??[basics.state]:
+ $c$, $p$, the "base", and the picture size:
+
+\DOCMODE(
+\message{state,}
+
+\xynew@{dimen}\X@c
+\xynew@{dimen}\Y@c
+\xynew@{dimen}\U@c
+\xynew@{dimen}\D@c
+\xynew@{dimen}\L@c
+\xynew@{dimen}\R@c
+\xynew@{toks}\Edge@c
+
+\xynew@{dimen}\X@p
+\xynew@{dimen}\Y@p
+\xynew@{dimen}\U@p
+\xynew@{dimen}\D@p
+\xynew@{dimen}\L@p
+\xynew@{dimen}\R@p
+\xynew@{toks}\Edge@p
+
+\xynew@{dimen}\X@origin \X@origin=\z@
+\xynew@{dimen}\Y@origin \X@origin=\z@
+\xynew@{dimen}\X@xbase \X@xbase=1mm
+\xynew@{dimen}\Y@xbase \Y@xbase=\z@
+\xynew@{dimen}\X@ybase \X@ybase=\z@
+\xynew@{dimen}\Y@ybase \Y@ybase=1mm
+
+\xynew@{dimen}\X@min
+\xynew@{dimen}\Y@min
+\xynew@{dimen}\X@max
+\xynew@{dimen}\Y@max
+\DOCMODE)
+
+\paragraph*{Drop and connect:}
+
+ |\lastobjectbox@| stores the most recently dropped
+ object.??c[\lastobject]
+
+\DOCMODE(
+\xynew@{box}\lastobjectbox@
+\DOCMODE)
+
+ |\zerodotbox@|??c[\zerodot] is of zero size with a `dot' in the form
+ of a rule the width and height as the line width of the line font;
+ ??c![\zz@] is `almost-zero-check'.
+
+\DOCMODE(
+\xynew@{box}\zerodotbox@
+\setbox\zerodotbox@=\hbox{\dimen@=.5\xydashw@
+ \kern-\dimen@ \vrule width\xydashw@ height\dimen@ depth\dimen@}
+\wd\zerodotbox@=\z@ \ht\zerodotbox@=\z@ \dp\zerodotbox@=\z@
+
+\xynew@{dimen}\almostz@ \almostz@=50sp
+\xydef@\zz@#1{\ifdim#1<\z@-\fi#1<\almostz@\relax}
+
+\xynew@{if}\iftmp@
+\DOCMODE)
+
+\paragraph*{Direction state:}
+
+ The ??w![direction] state is rather complicated and described in
+ detail in~\S??[algo.direction].
+
+\DOCMODE(
+\message{direction,}
+
+\xynew@{dimen}\d@X
+\xynew@{dimen}\d@Y
+\xydef@\sd@X{}
+\xydef@\sd@Y{}
+
+\xynew@{count}\K@ \K@=1024
+\xynew@{count}\KK@ \KK@=32
+
+\xynew@{count}\Direction
+\xynew@{dimen}\K@dXdY
+\xynew@{dimen}\K@dYdX
+
+\xydef@\cosDirection{}
+\xydef@\sinDirection{}
+
+\xywarnifdefined\DirectionChar
+\xywarnifdefined\SemiDirectionChar
+\DOCMODE)
+
+\paragraph*{Miscellaneous:}
+
+ Finally some generic allocations used in the following:
+
+\DOCMODE(
+\xynew@{read}\xyread@ % for `safe input'
+\xynew@{write}\xywrite@ % for `saving' to .xyc file
+
+\xynew@{count}\csp@ % for `control stack pointer'
+\xynew@{dimen}\quotPTK@ % for `fractions'
+\DOCMODE)
+
+ The required temporaries are defined by |xyidioms.tex|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Utility macros}
+??=[env.util]
+
+ Finally we define some utility macros.
+
+\DOCMODE(
+\message{utility macros;}
+\DOCMODE)
+
+\paragraph*{Simple queue:}
+??w[queue]
+
+ Just appending to the ??c![\toks@] list.
+
+\DOCMODE(
+\xydef@\addtotoks@#1{\toks@=\expandafter{\the\toks@#1}}
+\DOCMODE)
+
+\paragraph*{Safe input:}
+
+ Check that file is available before input. Tries the alternate
+ extension |.doc| in case the |.tex| file is not there. The second is
+ the lowest level function used when the desired files cannot be
+ preloaded and do not exist in |.doc| form.
+
+\DOCMODE(
+\xydef@\xyinputorelse@#1#2{%
+ \expandafter\let\expandafter\next@\csname#1loaded\endcsname
+ \ifx\next@\empty \else
+ \DN@{\xyinputorelse@@{#1}{\xyinputorelse@@{#1.doc}{#2}}}%
+ \fi \next@}
+
+\xydef@\xyinputorelse@@#1#2{\openin\xyread@=#1 %
+ \ifeof\xyread@ \DN@{#2}\else \DN@{\closein\xyread@\input#1 }\fi \next@}
+\DOCMODE)
+
+\paragraph*{Continuation stack:}
+
+ This is used to `??w![enter]' a new ??w![context] and `??w![leave]'
+ to the previous context. It works as a stack defining a control
+ sequence for each level, thus using a counter as the stack pointer.
+ Defines the following
+%
+\begin{defs}
+ |\csp@| & `Continuation Stack Pointer' \cr
+ |\enter@{|<code>|}| & Enter new block with <code> expanded as continuation\cr
+ |\nter@{|<code>|}| & Enter new block with<code> as continuation\cr
+ |\dontleave@| & Execute continuation without leaving block\cr
+ |\unenter@| & Leave block without executing its continuation\cr
+ |\leave@| & Leave block (execute its continuation)\cr
+\end{defs}
+
+ So |\enter@{}\leave@| is a noop and |\leave@| is the same as
+ |\dontleave@\unenter@|.
+
+\DOCMODE(
+\global\csp@=\z@
+
+\xydef@\enter@#1{\global\advance\csp@\@ne
+ \expandafter\xdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
+
+\xydef@\nter@#1{\global\advance\csp@\@ne
+ \expandafter\gdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
+
+\xydef@\dontleave@{\csname cs@\number\csp@\endcsname}
+
+\xydef@\unenter@{\global\advance\csp@\m@ne}
+
+\xydef@\leave@{\expandafter\unenter@\csname cs@\number\csp@\endcsname}
+\DOCMODE)
+
+\paragraph*{Fractions:}
+??w[fraction computation]
+
+ Below we often use a factor on the form of a quotient $A/B$. Here is
+ a hack to get it; it is not very precise but suffices for our needs.
+%
+\begin{defs}
+ |\quotient@| <cs> |{|$A$|}| |{|$B$|}| &
+ Defines <cs> to expand (immediately) to the factor corresponding to
+ $A/B$; $A$, $B$ must be dimensions where $\abs{A}\lt|\maxdimen|/|KK|$
+ and $\abs{B}\gt|KK|$
+\cr
+ |\quotient@@| <cs> |{|$A$|}| |{|$B$|}| &
+ Same, but uses $8|KK|$ for |KK|.
+\cr
+\end{defs}
+%
+ "Notes": (1) If |\c| is a count register, then |{1\c}| is a legal
+ dimension. (2) Really computes
+$$
+ \left((A*\abs{|KK|}) / (B/\abs{|KK|})\right) * \left(|1pt|/\abs{|K|}\right)
+$$
+ and then defines <cs> to expand to the resulting |pt| value. This
+ means that results are only reasonable for
+ $\abs{A}\ll|\maxdimen|/|KK|$ and $\abs{B}\gg|KK|$.
+
+\DOCMODE(
+\quotPTK@=\p@ \divide\quotPTK@\K@
+\xylet@\quotsign@@=\empty
+\xywarnifdefined\removePT@
+{\catcode`p=12 \catcode`t=12 \gdef\removePT@#1pt{#1}}
+
+\xydef@\quotient@#1#2#3{\A@=#2\relax \B@=#3\relax
+ \ifdim\A@<\z@\def\quotsign@@{-}\else\def\quotsign@@{+}\fi
+ \ifdim\quotsign@@\A@<15pt \multiply\A@\K@
+ \else\ifdim\quotsign@@\A@<511pt \multiply\A@\KK@
+ \advance\B@\ifdim\B@<\z@-\fi 16sp \divide\B@\KK@
+ \else
+ \advance\B@\ifdim\B@<\z@-\fi 512sp \divide\B@\K@
+ \fi\fi
+ \ifdim\ifdim\B@<\z@-\fi\B@<\quotPTK@ \xywarning@{division overflow}%
+ \else \advance\A@.5\B@ \divide\A@\B@ \fi
+ \multiply\A@\quotPTK@ \edef#1{\expandafter\removePT@\the\A@}}
+
+\xydef@\quotient@@#1#2#3{\A@=#2\relax \B@=#3\relax \multiply\A@\KK@
+ \advance\B@\ifdim\B@<\z@-\fi 128sp \divide\B@\KK@ \divide\B@ 8 %
+ \ifdim\B@=\z@\else \advance\A@.5\B@ \divide\A@\B@ \fi
+ \B@=.125\quotPTK@ \multiply\A@\B@ \edef#1{\expandafter\removePT@\the\A@}}
+\DOCMODE)
+
+\paragraph*{Loops:}
+
+ \Xy-pic uses its own |\loop@| to avoid interference with plain
+ ??c![\loop].
+
+\DOCMODE(
+\xydef@\loop@#1\repeat@{\def\body@{#1}\iterate@}\xylet@\repeat@=\fi
+\xydef@\iterate@{\body@\expandafter\iterate@\else\fi}
+\DOCMODE)
+
+\paragraph*{Execution:}
+
+ All ??w![execution] of \Xy-commands should be `indirect', \ie,
+ execute
+$$
+ |\xy@{|<source>|}{|<internal commands>|}|
+$$
+ where the <internal commands> directly do the desired operation(s).
+ This is used for tracing and can be used to separate parsing and
+ execution by changing |\xy@|; |\oxy@| is kept stable such that
+ |\let\xy@=\oxy@| will reestablish a sane state; it should only be
+ changed with |\change@oxy@| to make this easy to verify.
+
+\DOCMODE(
+\xydef@\xyinitial@#1#2{\DN@{#1}%
+ \xyerror@{command used out of context: \codeof\next@}{}}
+
+\xylet@\xy@=\xyinitial@
+\xylet@\oxy@=\xy@
+
+\xydef@\change@oxy@#1{\let\oxy@=#1\relax
+% \W@{*OXY@:=\meaning\oxy@}%
+}
+\DOCMODE)
+
+ This is also used to check whether an \Xy-picture is already
+ active; use as |\if\inxy@|\dots|\else|\dots|\fi|:
+
+\DOCMODE(
+\xydef@\inxy@{T\ifx\xy@\xyinitial@ F\else T\fi}
+\DOCMODE)
+
+ The final execution command is a trick used to put bits of the user's
+ input inside the |\next@| scratch macro "with the user's catcodes
+ intact": |\xy@@ix@{|\dots|}| is the same as
+ |\xy@@{\global\toks9={|\dots|}}| except for the category codes used
+ for the \dots.
+
+\DOCMODE(
+\xydef@\xyxy@@ix@{\begingroup
+ \xyuncatcodes\afterassignment\endgroup\global\toks9=}
+\DOCMODE)
+
+ This to save some tokens -- maybe not worth it:
+
+\DOCMODE(
+\xydef@\xy@@{\xy@{}}
+\DOCMODE)
+
+ Finally this to establish a sane state -- only use within a group!
+
+\DOCMODE(
+\xydef@\plainxy@{\let\xy@=\xyxy@ \change@oxy@\xy@ \let\xy@@ix@=\xyxy@@ix@}
+\DOCMODE)
+
+ \TODO: Clean up all uses of these such that <source> is always that
+ and only that. Define a method for `inner' \aka\ `implied' <source>
+ that doesn't really count in that it is a consequence of some other
+ source\dots
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{Picture basics}
+??=[basics]
+
+ The basic concepts involved when constructing \Xy-pictures are
+ positions and objects, and how they combine to form the state used by
+ the graphic engine.
+
+ The general structure of an \Xy-picture is as follows:
+%
+\begin{defs1}
+%
+ ??c![\xy] <pos> <decor> ??c![\endxy] \cr
+%
+\end{defs1}
+\noindent\unskip
+%
+ builds a box with an \Xy-picture (\LaTeX\ users may substitute
+ |\begin{xy}| \dots\ |\end{xy}| if they prefer).
+
+ <pos> and <decor> are components of the special `graphic language'
+ which \Xy-pictures are specified in. We explain the language
+ components in general terms in this \S\ and in more depth in the
+ following \S\S.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The code for the |\xy|\dots|\endxy| command is presented last in this
+ section.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Positions}
+??=[basics.pos]
+
+ All "??w![positions]" may be written |<|$X$|,|$Y$|>| where ??w![$X$]
+ is the \TeX\ dimension distance "right" and ??w![$Y$] the distance
+ "up" from the "??w![zero position]" ??c![0] of the \Xy-picture (|0|
+ has coordinates |<0mm,0mm>|, of course). The zero position of the
+ \Xy-picture determines the box produced by the
+ ??c![\xy]\dots??c![\endxy] command together with the four parameters
+ ??w![$X_{\min}$], ??w![$X_{\max}$], ??w![$Y_{\min}$], and
+ ??w![$Y_{\max}$] set such that all the objects in the picture are
+ `contained' in the following rectangle:
+$$
+\xy.(-13,-12).(25,15)="b"*\frm{-}*@{o},
+ "b"+<2pc,-.8pc>*{|0|};"b"*{}**@{.},
+ "b"+L+<-2pc,-.8pc>*!UR\txt{\TeX\ reference point};"b"+L*@{*}**@{.},
+ "b"+0;
+ "b"+L **@{-} ?>*@{>} ?*++!U{X_{\min}},
+ "b"+R **@{-} ?>*@{>} ?(.7)*++!U{X_{\max}},
+ "b"+D **@{-} ?>*@{>} ?(.7)*++!L{Y_{\min}},
+ "b"+U **@{-} ?>*@{>} ?*++!L{Y_{\max}}
+\endxy
+$$
+ where the distances follow the ``up and right~$\gt0$'' principle,
+ \eg, the indicated \TeX\ reference point has coordinates
+ |<|$X_{\min}$|,0pt>| within the \Xy-picture. The zero position does
+ not have to be contained in the picture, but $X_{\min} \le X_{\max}
+ \land Y_{\min} \le Y_{\max}$ always holds. The possible positions
+ are described in detail in~\S??[pos].
+
+ When an \Xy-picture is entered in "??w![math mode]" then the
+ reference point becomes the ``vcenter'' instead, \ie, we use the
+ point |<|$X_{\min}$|,-\the\fontdimen22>| as reference point.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Objects}
+??=[basics.object]
+
+ The simplest form of putting things into the picture is to `drop' an
+ "??w![object]" at a position. An object is like a \TeX\ box except
+ that it has a general "??w![Edge]" around its reference point---in
+ particular this has the "??w![extents]" (\ie, it is always contained
+ within) the dimensions ??w![$L$], ??w![$R$], ??w![$U$], and ??w![$D$]
+ away from the reference point in each of the four directions left,
+ right, up, and down. Objects are encoded in \TeX\ boxes using the
+ convention that the ??w![\TeX\ reference point] of an object is at
+ its left edge, thus shifted |<|${-}L$|,0pt>| from the center---so a
+ \TeX\ box may be said to be a rectangular object with $L=|0pt|$.
+ Here is an example:
+$$
+ \let\objectstyle=\scriptstyle
+ \xy(0,0).(-10,-5).(15,8)*\frm{-}="box"*@{o}+0;
+ "box"+L*{}**@{.}?*{L},
+ "box"+R*{}**@{.}?*{R},
+ "box"+D*{}**@{.}?*{D},
+ "box"+U*{}**@{.}?*{U},
+ "box"+L+<-2pc,-.8pc>*!UR\hbox{\TeX\ reference point};
+ "box"+L*{\bullet}*{}**@{.},
+ \endxy
+$$
+ The object shown has a rectangle edge but others are available even
+ though the kernel only supports rectangle and circle edges. It is
+ also possible to use entire \Xy-pictures as objects with a rectangle
+ edge, |0| as the reference point, $L={-X_{\min}}$, $R={X_{\max}}$,
+ $D={-Y_{\min}}$, and $U={Y_{\max}}$. The commands for objects are
+ described in~\S??[object].
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Connections}
+??=[basics.connect]
+
+ Besides having the ability to be dropped at a position in a picture,
+ all objects may be used to "??w![connect]" the two current objects of
+ the state, \ie, $p$ and $c$. For most objects this is done by
+ `filling' the straight line between the centers with as many copies
+ as will fit between the objects:
+$$
+ \let\objectstyle=\scriptscriptstyle
+ \xy*=<12pt>[o]{p}="P"*\cir{} ; (60,15)*=<18pt,8pt>{c}="C"*\frm{-}**@{--}
+%
+ **\xybox{(0,0).(-3,-2).(2,3)*\frm{.}="box"*@{o}+0;
+ "box"+L**@{.}?*{L},
+ "box"+R**@{.}?*{R},
+ "box"+D**@{.}?*{D},
+ "box"+U**@{.}?*{U}},
+ \endxy
+$$
+ The ways the various objects connect are described along with the
+ objects.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Decorations}
+??=[basics.decor]
+
+ When the ??c![\xy] command reaches something that can not be
+ interpreted as a continuation of the position being read, then it is
+ expected to be a "??w![decoration]", \ie, in a restricted set of
+ \TeX\ commands which add to pictures. Most such commands are
+ provided by the various "user options" (\cf~\S??[option])---only a
+ few are provided within the kernel to facilitate programming of such
+ options (and user macros) as described in~\S??[decor].
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{The \Xy-pic state}
+??=[basics.state]
+
+ Finally we summarise the user-accessible parts of the
+ ??w![\Xy-picture state] of two positions together with the
+ last object associated with each: the "previous", ??w![$p$], is the
+ position |<|??w![$X_p$]|,| ??w![$Y_p$]|>| with the object
+ ??w![$L_p$], ??w![$R_p$], ??w![$D_p$], ??w![$U_p$], ??w!["Edge$_p$"],
+ and the "current", ??w![$c$], is the position |<|??w![$X_c$]|,|
+ ??w![$Y_c$]|>| with the object ??w![$L_c$], ??w![$R_c$], ??w![$D_c$],
+ ??w![$U_c$], ??w!["Edge$_c$"].
+
+ Furthermore, \Xy-pic has a configurable "??w![cartesian coordinate
+ system]" described by an "origin" position
+ |<|??w![$X_"origin"$]|,|??w![$Y_"origin"$]|>|
+ and two "base vectors" |<|??w![$X_"xbase"$]|,|??w![$Y_"xbase"$]|>|
+ and~|<|??w![$X_"ybase"$]|,|??w![$Y_"ybase"$]|>|
+ accessed by the usual notation using parentheses:
+$$
+\arraycolsep=.25em \begin{array}{rclll}
+ |(|x|,|y|)| & = & |<| & X_"origin" + x*X_"xbase" + y*X_"ybase" & |,| \\
+ & & & Y_"origin" + x*Y_"xbase" + y*Y_"ybase" & |>| \\
+\end{array}
+$$
+ This is explained in full when we show how to set the base in
+ note~??[base] of \S??[pos].
+
+ Finally typesetting a connection will setup a ``??w![placement
+ state]'' for referring to positions on the connection that is
+ accessed through a special |?| position construction; this is also
+ discussed in detail in \S??[pos].
+
+ The \Xy-pic "??w![state]" consists of all these parameters
+ together. They are initialised to zero except for
+ $X_"xbase"=Y_"ybase"=|1mm|$.
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ The edges are not directly available but points on the edges may be
+ found using the different <corner> forms described in \S??[pos].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ The edges are are available to the programmer as token lists; see
+ \S??[algo.edge] for details.
+
+\subparagraph*{Procedure:}
+
+ ??c![\xy]\ \dots\ ??c![\endxy] builds an object from an \Xy-pic <pos>
+ <decor> sequence as follows: (??_[xy1])~|\xy| starts the |\hbox| to
+ contain the \Xy-picture, (??_[xy2])~starts an inner box to be resized
+ appropriately later, sets |\xy@| to just execute immediately, and
+ makes a fresh scope for global internal names, and
+ (??_[xy3])~initialises the \Xy-pic state (setting the size to a
+ ridiculously large negative value), and finally passes control to
+ the <pos> parser.
+
+ Some care is taken to `lift' the diagram a bit to `vcenter' it when
+ in math mode, and ??c![\mathsurround] is set to zero to make changes
+ into math mode safe.
+
+\DOCMODE(
+\message{pictures: \string\xy,}
+
+\xydef@\xy{\ifmmode\expandafter\xymath@\else\expandafter\xynomath@\fi}
+\xydef@\xymath@{\hbox\bgroup \dimen@=\the\fontdimen22\textfont\tw@ \xyinside@}
+\xydef@\xynomath@{\hbox\bgroup \dimen@=\z@ \xyinside@}
+
+\xydef@\xyinside@{%
+ \saveXyStyle@ \aftergroup\xycheck@end %?*[xy1]
+ \setboxz@h\bgroup %?*[xy2]
+ \plainxy@
+ \X@c=\z@ \Y@c=\z@ \czeroEdge@ %?*[xy3]
+ \X@p=\z@ \Y@p=\z@ \U@p=\z@ \D@p=\z@ \L@p=\z@ \R@p=\z@ \Edge@p={\zeroEdge}%
+ \X@min=\hsize \X@max=-\hsize \Y@min=\hsize \Y@max=-\hsize
+ \mathsurround=\z@
+ \expandafter\POS\everyxy@@}
+
+\xydef@\czeroEdge@{\U@c=\z@ \D@c=\U@c \L@c=\U@c \R@c=\U@c \Edge@c={\zeroEdge}}
+
+\xydef@\xyxy@#1#2{#2}
+
+\xywarnifdefined\everyxy
+\expandafter\def\addEQ@\everyxy#1{\def\everyxy@@{#1}\ignorespaces}
+
+\xylet@\everyxy@@=\empty
+\DOCMODE)
+
+ When finished |\endxy| does a |\relax| to disable any parser still
+ active and (??_[endxy1])~resets the size of the generated box to zero
+ if no (unhidden) objects were inserted, and (??_[endxy2])~defines a
+ command to end both the temporary and the `proper' box and set its
+ size correctly---this uses ??c![\edef] to expand the required
+ dimensions used within the temporary box before leaving the two
+ groups (namely the temporary box and the `proper' box).
+
+\DOCMODE(
+\xydef@\endxy{\if\inxy@\else\xyerror@{Unexpected \string\endxy}{}\fi
+ \relax
+ \dimen@=\Y@max \advance\dimen@-\Y@min %?*[endxy1]
+ \ifdim\dimen@<\z@ \dimen@=\z@ \Y@min=\z@ \Y@max=\z@ \fi
+ \dimen@=\X@max \advance\dimen@-\X@min
+ \ifdim\dimen@<\z@ \dimen@=\z@ \X@min=\z@ \X@max=\z@ \fi
+ \edef\tmp@{\egroup %?*[endxy2]
+ \setboxz@h{\kern-\the\X@min\boxz@}%
+ \ht\z@=\the\Y@max \dp\z@=-\the\Y@min \wdz@=\the\dimen@
+ \noexpand\maybeunraise@ \raise\dimen@\boxz@
+ \noexpand\recoverXyStyle@ \egroup \noexpand\xy@end
+ \U@c=\the\Y@max \D@c=-\the\Y@min \L@c=-\the\X@min \R@c=\the\X@max}\tmp@}
+
+\xydef@\maybeunraise@{\if\inxy@\else \dimen@ii=\dp\z@
+ \ifdim\dimen@ii<\z@ \advance\dimen@\dimen@ii \fi\fi}
+\DOCMODE)
+
+ If an |\xy| is not properly closed by an |\endxy| then the error
+ message is produced. This happens if (a)~too many |\xy|s or (b)~too
+ many |\endxy|s or (c)~if there is the correct number of each but the
+ grouping becomes unbalanced due to a misplaced |}| or |\egroup|.
+
+\DOCMODE(
+\xydef@\xycheck@end{\xyFN@\xycheck@end@}
+\xydef@\xycheck@end@{\ifx\next\xy@end\DN@\xy@end{}\else\DN@{\xy@end}\fi\next@}
+\xydef@\xy@end{%
+ \xyerror@{An \string\xy\space environment is not closed correctly.}%
+ {I expected \string\endxy. You probably have an umatched {} grouping.}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ It is possible to insert an `initial' piece of <pos> <decor> at the
+ start of every \Xy-picture with the declaration
+%
+\begin{defs1}
+|\everyxy={| <text> |}|
+\end{defs1}
+\noindent\unskip
+%
+ This will act as if the <text> was typed literally right after each
+ ??c![\xy] command, parsing the actual contents as if it follows this
+ -- thus it is recommended that <text> has the form <pos>|,| such that
+ users can continue with <pos> <decor>.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{Positions}
+??=[pos]
+
+\DOCMODE(
+\message{positions,}
+\DOCMODE)
+
+ A <pos>ition is a way of specifying locations as well as dropping
+ objects at them and decorating them---in fact any aspect of the
+ \Xy-pic state can be changed by a <pos> but most will just change the
+ coordinates and/or shape of~$c$.
+
+\begin{figure*}[tp]\SQUEEZE
+\vss
+\begin{syntax}
+ ??w![<pos>]
+ &\iss & <coord>
+ & $c\from<coord>$
+\cr
+ &\orr & <pos> ??c![+] <coord>
+ & $c \from <pos> + <coord>$??^[arithmetic]
+\cr
+ &\orr & <pos> ??c![-] <coord>
+ & $c \from <pos> - <coord>$??^[arithmetic]
+\cr
+ &\orr & <pos> ??c![!] <coord>
+ & $c\from<pos>$ then ??!^[skew] $c$ by <coord>
+\cr
+ &\orr & <pos> ??c![.] <coord>
+ & $c\from<pos>$ but also ??!^[covering] $<coord>$
+\cr
+ &\orr & <pos> ??c![,] <coord>
+ & $c\from<pos>$ then $c\from<coord>$
+\cr
+ &\orr & <pos> ??c![;] <coord>
+ & $c\from<pos>$, swap $p$ and $c$, $c\from<coord>$
+\cr
+ &\orr & <pos> ??c![:] <coord>
+ & $c\from<pos>$, set ??!^[base], $c\from<coord>$
+\cr
+ &\orr & <pos> ??c![::] <coord>
+ & $c\from<pos>$, $"ybase"\from c-"origin"$, $c\from<coord>$
+\cr
+ &\orr & <pos> ??c![*] <object>
+ & $c\from<pos>$, ??!^[drop] <object>
+\cr
+ &\orr & <pos> ??c![**] <object>
+ & $c\from<pos>$, ??!^[connect] using <object>
+\cr
+ &\orr & <pos> ??c![?] <place>
+ & $c\from<pos>$, $c\from\hbox{??!^[<place>]}$
+\cr
+ &\orr & <pos> ??c![@] <stacking>
+ & $c\from<pos>$, do <stacking>??^[stack]
+\cr
+ &\orr & <pos> ??c![=] <saving>
+ & $c\from<pos>$, do <saving>??^[save]
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<coord>]
+ &\iss & <vector>
+ & <pos> is <vector> with zero size
+\cr
+ &\orr & <empty> \orr\ ??c![c]
+ & reuse last $c$ (do nothing)
+\cr
+ &\orr & ??c![p]
+ & $p$
+\cr
+ &\orr & ??c![x] \orr\ ??c![y]
+ & ??!^[axis intersection] with $\overline{pc}$
+\cr
+ &\orr & ??c![s]<digit> \orr\ |s{|<number>|}|
+ & ??!^[stack] position <digit> or <number> below the top
+\cr
+ &\orr & |"|<id>|"|
+ & restore what was ??!^[saved] as <id> earlier
+\cr
+ &\orr & |{| <pos> <decor> |}|
+ & the $c$ resulting from interpreting the ??!^[group]
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<vector>]
+ &\iss & ??c![0]
+ & zero
+\cr
+ &\orr & |<| <dimen> |,| <dimen> |>|
+ & absolute??c[<>]
+\cr
+ &\orr & |<| <dimen> |>|
+ & absolute with equal dimensions
+\cr
+ &\orr & |(| <factor> |,| <factor> |)|
+ & in current ??!^[base]??c[()]
+\cr
+ &\orr & ??c![a] |(| <number> |)|
+ & ??!^[angle in current base]
+\cr
+ &\orr & <corner>
+ & from reference point to <corner> of $c$
+\cr
+ &\orr & <corner> |(| <factor> |)|
+ & The <corner> multiplied with <factor>
+\cr
+ &\orr & |/| <direction> <dimen> |/|
+ & vector <dimen> ??!^[in <direction>]??c[//]
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<corner>]
+ &\iss & ??c![L]\orr??c![R]\orr??c![D]\orr??c![U]
+ & ??!^[offset] to left, right, down, up side
+\cr
+ &\orr & ??c![CL]\orr??c![CR]\orr??c![CD]\orr??c![CU]\orr??c![C]
+ & ??!^[offset] to center of side, true center
+\cr
+ &\orr & ??c![LD]\orr??c![RD]\orr??c![LU]\orr??c![RU]
+ & ??!^[offset] to actual left/down, \dots\ corner
+\cr
+ &\orr & ??c![E]\orr??c![P]
+ & ??!^[offset] to nearest/proportional edge point to $p$
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<place>]
+ &\iss & ??c![<] <place> \orr\ ??c![>] <place>
+ & ??!^[shave] ??c![(0)]/??c![(1)] to edge of $p$/$c$, $f \from |0|/|1|$
+\cr
+ &\orr & |(| <factor> |)| <place>
+ & $f \from <factor>$
+\cr
+ &\orr & <slide>
+ & ??!^[pick place] and apply <slide>
+\cr
+ &\orr & ??c![!] |{|<pos>|}| <slide>
+ & ??!^[intercept] with line setup by <pos> and apply <slide>
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<slide>]
+ &\iss & |/| <dimen> |/|
+ & ??!^[slide] <dimen> further along connection
+\cr
+ &\orr & <empty>
+ & no slide
+\cr
+\end{syntax}
+\unskip\vskip-1em
+\caption{\protect<pos>itions.}??=[f.pos]
+\vfill
+\end{figure*}
+
+ All possible positions are shown in figure~??[f.pos] with explanatory
+ notes below.
+
+\begin{exercise}
+ Which of the positions |0|, |<0pt,0pt>|, |<0pt>|, |(0,0)|, and
+ |/0pt/| is different from the others?
+\answertext{In the default setup they are all denote the reference point of
+ the \Xy-picture but the cartesian coordinate <pos> ??c![(0,0)]
+ denotes the point "origo" that may be changed to something else using
+ the |:| operator.}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Parsing:}
+
+ First the ??c![\POS] and ??c![\afterPOS] <decor>ations, and similar
+ ??c![\afterCOORD] and ??c![\afterVECTORorEMPTY] ones. They handle
+ parsing of <pos>, <coord>, and <vector>; parsing of <corner> and
+ <place> is presented along with note~??[corner] and~??[<place>]
+ explaining them.
+
+\DOCMODE(
+\xydef@\POS{\afterPOS{}}
+
+\xydef@\afterPOS#1{%
+ \DN@##1{\def\afterPOS@{\def\afterPOS@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterPOS@}%
+ \afterCOORD{\xyFN@\POS@}}
+
+\xylet@\afterPOS@=\empty
+
+\xydef@\afterCOORD#1{%
+ \DN@##1{\def\afterCOORD@{\def\afterCOORD@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterCOORD@}%
+ \afterVECTORorEMPTY{\xy@@\czeroEdge@ \afterCOORD@}{\xyFN@\COORD@}}
+
+\xylet@\afterCOORD@=\empty
+
+\xydef@\afterVECTORorEMPTY#1#2{%
+ \DN@##1{\def\afterVECTOR@{\def\afterVECTOR@{##1}%
+ \ifVECTORempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
+ \expandafter\next@\expandafter{\afterVECTOR@}%
+ \xyFN@\VECTOR@}
+
+\xynew@{if}\ifVECTORempty@
+\xylet@\afterVECTOR@=\empty
+\DOCMODE)
+
+ The ??c![\afterVECTORorEMPTY] command is special in that it takes two
+ arguments: the `continuation' if a <vector> was found and the
+ continuation if <empty> was found (this is not applicable to the
+ other two since <empty> is a legal <coord> and thus also a legal
+ <pos>).
+
+ Next we proceed with the actual parsing primitives: |\COORD@|,
+ |\POS@|, and |\VECTOR@|. These are bound to |\xyCOORD@|, |\xyPOS@|,
+ and |\xyVECTOR@| in order to be extendable, \eg, the |matrix| option
+ extends <coord> to support the |[|"row"|,| "column"|]| format by
+ redefining |\COORD@| to first test for this new format and then call
+ |\xyCOORD@|.
+
+ The parsing commands above are set up such that they all first call
+ the |\VECTOR@| command. <coord> and <pos> parsing then proceeds with
+ calling the |\COORD@| if there was no <vector>. <pos> parsing then
+ calls |\POS@| to continue the <pos> (in both cases).
+
+ First <vector>s:
+
+\DOCMODE(
+\xydef@\xyVECTOR@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\VECTOR@}%gobble spaces
+ \else \ifcat A\noexpand\next \let\next@=\VECTOR@letter
+ \else \let\next@=\VECTOR@other \fi\fi \next@}
+
+\xylet@\VECTOR@=\xyVECTOR@
+\DOCMODE)
+
+ All letters used for <vector>s are uppercase <corner>s except for |a|
+ used for angles (where the main code is in note~??[angle in current
+ base]); this is also where we introduce the auxiliary
+ |\notrelaxorelse@| that takes two control sequences and expands the
+ first unless it is relax in which case it expands the second:
+
+\DOCMODE(
+\def\notrelaxorelse@#1#2{\ifx#1\relax \expandafter#2\else\expandafter#1\fi}
+
+\xydef@\VECTOR@letter{%
+ \ifx a\next \expandafter\VECTOR@a \else \expandafter\CORNER@ \fi}
+
+\xydef@\VECTOR@a a(#1){\xy@{a(#1)}{\vfromcartesianangle@{#1}}%
+ \VECTORempty@false \afterVECTOR@}
+\DOCMODE)
+
+ The <corner> trick is to do nothing when there is nothing and
+ initialise both $X$ and $Y$ in all other cases.
+
+\DOCMODE(
+\xydef@\CORNER@{%
+ \xy@{}{\A@=-.5\L@c \advance\A@.5\R@c \B@=-.5\D@c \advance\B@.5\U@c
+ \let\nextii@=\zeroit@}%
+ \VECTORempty@true\CORNER@i}
+
+\xydef@\zeroit@#1{#1=\z@}
+
+\xydef@\CORNER@i{%
+ \ifx D\next \DN@ D{\xy@{D}{\Y@c=-\D@c \nextii@\X@c \B@=\Y@c}\CORNER@ii}%
+ \else\ifx U\next \DN@ U{\xy@{U}{\Y@c= \U@c \nextii@\X@c \B@=\Y@c}\CORNER@ii}%
+ \else\ifx L\next \DN@ L{\xy@{L}{\X@c=-\L@c \nextii@\Y@c \A@=\X@c}\CORNER@ii}%
+ \else\ifx R\next \DN@ R{\xy@{R}{\X@c= \R@c \nextii@\Y@c \A@=\X@c}\CORNER@ii}%
+ \else\ifx C\next \DN@ C{\xy@{C}{\X@c= \A@ \Y@c= \B@}\CORNER@ii}%
+ \else\ifx E\next \DN@ E{\xy@{E}{%
+ \A@=\X@c \B@=\Y@c \the\Edge@c\z@ \advance\X@c-\A@ \advance\Y@c-\B@}%
+ \CORNER@ii}%
+ \else\ifx P\next \DN@ P{\xy@{P}{%
+ \A@=\X@c \B@=\Y@c \the\Edge@c\thr@@ \advance\X@c-\A@ \advance\Y@c-\B@}%
+ \CORNER@ii}%
+ \else\ifx (\next %)
+ \DN@(##1){\xy@{(##1)}{\X@c=##1\X@c \Y@c=##1\Y@c}\afterVECTOR@}%
+ \else \let\next@=\afterVECTOR@
+ \fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\CORNER@ii{\xy@@{\let\nextii@=\eat@}%
+ \VECTORempty@false \xyFN@\CORNER@i}
+\DOCMODE)
+
+ |\CORNER@i| recognises the |(|<factor>|)| also; this does no harm as
+ it was never called if the first character was a |(|.
+
+ The remaining <vector> forms just set $X$ and $Y$.
+
+\DOCMODE(
+\xydef@\VECTOR@other{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@##1}{\xy@{<##1>}{\vfromabsolute@{##1}}%
+ \VECTORempty@false\afterVECTOR@}%
+ \else\ifx (\next %)
+ \DN@({\xyFN@\VECTOR@other@open}%)
+ \else\ifx /\next %/
+ \DN@/##1/{\xy@@ix@{{##1}}%
+ \xy@{/##1/}{\expandafter\vfromslide@\the\toks9 }%
+ \VECTORempty@false\afterVECTOR@}%
+ \else\ifx 0\next
+ \DN@ 0{\xy@{0}{\X@c=\z@ \Y@c=\z@}\VECTORempty@false\afterVECTOR@}%
+ \else
+ \DN@{\VECTORempty@true\afterVECTOR@}%
+ \fi\fi\fi\fi \next@}
+\DOCMODE)
+
+ \HACK: escape out in case of the special |(*| introducer\dots picked
+ up by the <coord> parser, then.
+
+\DOCMODE(
+\xydef@\VECTOR@other@open{%
+ \ifx *\next \DN@{\VECTORempty@true \xyFN@\afterVECTOR@(}%)
+ \else
+ \DN@##1){\xy@{(##1)}{\vfromcartesian@{##1}}\VECTORempty@false\afterVECTOR@}%
+ \fi \next@}
+\DOCMODE)
+
+ Next <coord>inates that are not <vector>s:
+
+\DOCMODE(
+\xydef@\xyCOORD@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\COORD@}%gobble spaces
+ \else \ifcat A\noexpand\next \let\next@=\xyCOORD@letter
+ \else \let\next@=\xyCOORD@other \fi\fi \next@}
+
+\xylet@\COORD@=\xyCOORD@
+
+\xydef@\xyCOORD@letter{%
+ \ifx c\next
+ \DN@ c{\xy@{c}{}\afterCOORD@}%
+ \else\ifx p\next
+ \DN@ p{\xy@{p}\cfromp@ \afterCOORD@}%
+ \else\ifx x\next
+ \DN@ x{\xy@{x}{\R@c=\X@xbase \U@c=\Y@xbase \intersect@}\afterCOORD@}%
+ \else\ifx y\next
+ \DN@ y{\xy@{y}{\R@c=\X@ybase \U@c=\Y@ybase \intersect@}\afterCOORD@}%
+ \else\ifx s\next
+ \DN@ s##1{\xy@{s{##1}}{\cfroms@{##1}}\afterCOORD@}%
+ \else \let\next@=\afterCOORD@ \fi\fi\fi\fi\fi \next@}
+
+\xydef@\xyCOORD@other{%
+ \ifx "\next %"
+ \DN@"##1"{\xy@{"##1"}{\cfromid@{##1}}\afterCOORD@}%
+ \else\ifx \bgroup\next
+ \DN@##1{\xy@{{##1}}{\enter@{\pfromthep@\basefromthebase@}}%
+ \silencexy@ \POS##1\relax \unsilencexy@ \xy@@\leave@ \afterCOORD@}%
+ \else\ifx (\next %)
+ \DN@({\xyFN@\xyCOORD@other@open}%)
+ \else \let\next@=\afterCOORD@ \fi\fi\fi \next@}
+
+\xynew@{if}\ifsilentxy@
+
+\xydef@\silencexy@{%
+ \ifsilentxy@ \nter@{}%
+ \else \nter@{\silentxy@false \let\xy@=\unsilent@@xy@}
+ \silentxy@true \let\unsilent@@xy@=\xy@ \def\xy@##1##2{\unsilent@@xy@{}{##2}}%
+ \fi}
+
+\xydef@\unsilencexy@{\leave@}
+
+\xydef@\xyCOORD@other@open{%
+ \ifx *\next
+ \DN@*##1*){\xy@{(*}{\enter@{\pfromthep@\basefromthebase@}}%
+ \POS##1\relax \xy@{*)}\leave@ \afterCOORD@}%
+ \else \DN@{\xyFN@\afterCOORD@(}%)
+ \fi \next@}
+\DOCMODE)
+
+ Finally <pos> parsing after <coord> (possibly <vector>) is
+ interpreted:
+
+\DOCMODE(
+\xydef@\xyPOS@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\POS@}%gobble spaces
+ \else\addPLUS@\ifx \next
+ \addPLUS@\DN@{\xy@+{\enter@\cplusthec@}%
+ \afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
+ \else\addDASH@\ifx \next
+ \addDASH@\DN@{\xy@-{\enter@\cplusthec@}%
+ \afterCOORD{\xy@@{\X@c=-\X@c \Y@c=-\Y@c\leave@}\xyFN@\POS@}}%
+ \else\ifx !\next
+ \DN@ !{\xy@!{\enter@\cskewthec@}\afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
+ \else\addDOT@\ifx \next
+ \addDOT@\DN@{\xy@.{\enter@\cmergethec@}%
+ \afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
+ \else\ifx ,\next
+ \DN@ ,{\xy@,{\comma@@}\afterCOORD{\xyFN@\POS@}}%
+ \else\ifx ;\next
+ \DN@ ;{\xy@;{\swap@}\afterCOORD{\xyFN@\POS@}}%
+ \else\ifx :\next
+ \DN@ :{\xyFN@\POS@colon}%
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@{\xyFN@\saveid@}%
+ \else\ifx *\next
+ \DN@ *{\xyFN@\POS@star}%
+ \else \ifx ?\next
+ \DN@?{\xy@?{}\afterPLACE{\xyFN@\POS@}}%
+ \else \addAT@\ifx \next
+ \addAT@\DN@{\xyFN@\STACK@}%
+ \else
+ \let\next@=\afterPOS@
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xylet@\comma@@=\relax
+
+\xylet@\POS@=\xyPOS@
+\DOCMODE)
+
+ |\comma@@| is a hook used to change the operation of |,|, \eg, when
+ reading a stack setup where it means `push'.
+
+ The final functions serve only to distinguish between the single
+ character |:|/|*| and dual character |::|/|**| operators:
+
+\DOCMODE(
+\xydef@\POS@colon{\DNii@{\afterCOORD{\xyFN@\POS@}}%
+ \ifx :\next \xy@{::}{\setbase@@\X@c\Y@c}\DN@:{\nextii@}%
+ \else \xy@:{\setbase@\X@p\Y@p\X@c\Y@c}\let\next@=\nextii@ \fi
+ \next@}
+
+\xydef@\POS@star{%
+ \ifx *\next
+ \DN@*##1##{\nextii@{##1}}%
+ \DNii@##1##2{\xy@@ix@{{##1}{##2}}%
+ \xy@{**##1{##2}}{\expandafter\connect@\the\toks9 }\xyFN@\POS@}%
+ \else
+ \DN@##1##{\nextii@{##1}}%
+ \DNii@##1##2{\xy@@ix@{{##1}{##2}}%
+ \xy@{*##1{##2}}{\expandafter\drop@\the\toks9 }\xyFN@\POS@}%
+ \fi
+ \next@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Simple actions:}
+
+ Next follow the simplest actions; the complicated ones are explained
+ along with their notes below.
+
+\DOCMODE(
+\xydef@\cfromp@{\X@c=\X@p \Y@c=\Y@p \U@c=\U@p \D@c=\D@p \L@c=\L@p \R@c=\R@p
+ \Edge@c=\expandafter{\the\Edge@p}}
+
+\xydef@\pfromc@{\X@p=\X@c \Y@p=\Y@c \U@p=\U@c \D@p=\D@c \L@p=\L@c \R@p=\R@c
+ \Edge@p=\expandafter{\the\Edge@c}}
+
+\xydef@\swapdimen@#1#2{\dimen@=#1\relax #1=#2\relax #2=\dimen@}
+
+\xynew@{toks}\swaptoks@@
+
+\xydef@\swap@{\swapdimen@\X@c\X@p \swapdimen@\Y@c\Y@p
+ \swapdimen@\U@c\U@p\swapdimen@\D@c\D@p \swapdimen@\L@c\L@p\swapdimen@\R@c\R@p
+ \swaptoks@@=\Edge@c \Edge@c=\Edge@p \Edge@p=\swaptoks@@}
+\DOCMODE)
+
+ Next the parsing of coordinate pairs in |<>|:
+
+\DOCMODE(
+\xydef@\vfromabsolute@#1{\vfromabsolute@@#1,@}
+
+\xydef@\vfromabsolute@@#1,#2@{\X@c=#1\relax
+ \DN@{#2}\ifx\next@\empty \Y@c=\X@c
+ \else \DN@##1,{\Y@c=##1}\next@#2\relax \fi
+% \advance\X@c 1sp \advance\Y@c 1sp %HACK
+}
+\DOCMODE)
+
+ The next group of commands are used to store on the control stack
+ with the |\enter@| command, so they "expand" to something useful:
+
+\DOCMODE(
+\xydef@\cfromthec@{\X@c=\the\X@c \Y@c=\the\Y@c
+ \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \Edge@c={\expandafter\noexpand\the\Edge@c}}
+
+\xydef@\cfromthep@{\X@c=\the\X@p \Y@c=\the\Y@p
+ \U@c=\the\U@p \D@c=\the\D@p \L@c=\the\L@p \R@c=\the\R@p
+ \Edge@c={\expandafter\noexpand\the\Edge@p}}
+
+\xydef@\pfromthep@{\X@p=\the\X@p \Y@p=\the\Y@p
+ \U@p=\the\U@p \D@p=\the\D@p \L@p=\the\L@p \R@p=\the\R@p
+ \Edge@p={\expandafter\noexpand\the\Edge@p}}
+
+\xydef@\pfromthec@{\X@p=\the\X@c \Y@p=\the\Y@c
+ \U@p=\the\U@c \D@p=\the\D@c \L@p=\the\L@c \R@p=\the\R@c
+ \Edge@p={\expandafter\noexpand\the\Edge@c}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+
+\note??=[arithmetic]
+%
+ When doing arithmetic with |+| and |-| then the resulting current
+ object inherits the size of the <coord>, \ie, the right
+ argument---this will be zero if the <coord> is a <vector>.
+
+\begin{exercise}
+ How do you set $c$ to an object the same size as the saved object
+ |"ob"| but moved |<|$X$|,|$Y$|>|?
+\answertext{Use the <pos>ition |<|$X$|,|$Y$|>+"ob"|.}
+\end{exercise}
+
+\DOCMODE(
+\xydef@\cplusthec@{\advance\X@c\the\X@c \advance\Y@c\the\Y@c}
+\DOCMODE)
+
+\note??=[skew]
+%
+ "Skewing" using |!| just means that the reference point of $c$ is
+ moved with as little change to the shape of the object as possible,
+ \ie, the edge of~$c$ will remain in the same location except that it
+ will grow larger to avoid moving the reference point outside~$c$.
+%
+\begin{exercise}
+ What does the <pos> \dots|!R-L| do?
+\answertext{It first sets $c$ according to ``\dots''. Then it changes $c$ to
+ the point right of $c$ at the same distance from the right edge of
+ $c$ as its width, $w$, \ie,
+$$
+\xy
+ *+\hbox{The \dots}="it" *\frm{_\}}!D-U*{w}
+ ,{"it"+RD}.{"it"+RU}.{"it"!R-L*{\times}+0}!C *\frm{_\}}!D-U*{w}
+\endxy
+$$}
+\end{exercise}
+%
+ \BUG: The result of |!| is always a rectangle currently.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Procedure:}
+
+ |!| moves the center of $c$ by a temporarily read $c'$ and then
+ readjusts the extents:
+$$
+\begin{array}{rclcl}
+ D_c &:=& Y'+Y_c - \min(Y'-D', Y'+Y_c) &=& \max(Y_c+D',0)\\
+ U_c &:=& \max(Y'+U', Y'+Y_c) - (Y'+Y_c) &=& \max(U'-Y_c,0)\\
+ Y_c &:=& Y'+Y_c\\
+ L_c &:=& X'+X_c - \min(X'-L', X'+X_c) &=& \max(X_c+L',0)\\
+ R_c &:=& \max(X'+R', X'+X_c) - (X'+X_c) &=& \max(R'-X_c,0)\\
+ X_c &:=& X'+X_c\\
+\end{array}
+$$
+
+\DOCMODE(
+\xydef@\cskewthec@{%
+ \noexpand\cskew@{\the\Y@c}{\the\X@c}{\the\D@c}{\the\U@c}{\the\L@c}{\the\R@c}}
+
+\xydef@\cskew@#1#2#3#4#5#6{%
+ \D@c=#3\advance\D@c \Y@c \ifdim\D@c<\z@ \D@c=\z@ \fi
+ \U@c=#4\advance\U@c-\Y@c \ifdim\U@c<\z@ \U@c=\z@ \fi
+ \advance\Y@c#1%
+ \L@c=#5\advance\L@c \X@c \ifdim\L@c<\z@ \L@c=\z@ \fi
+ \R@c=#6\advance\R@c-\X@c \ifdim\R@c<\z@ \R@c=\z@ \fi
+ \advance\X@c#2%
+ \Edge@c={\rectangleEdge}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[covering]
+%
+ A <pos> "covers" another if it is a rectangle with size sufficiently
+ large that the other is ``underneath''. The |.| operation
+ ``extends'' a <pos> to cover an additional one---the reference point
+ of $c$ is not moved but the shape is changed to a rectangle such that
+ the entire $p$ object is covered.
+
+ \BUG: non-rectangular objects are first ``translated'' into a
+ rectangle by using a diagonal through the object as the diagonal of
+ the rectangle.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Procedure:}
+
+ |.| takes a temporary object $c'$ and adjusts the extents of $c$ such
+ that it is covered.
+$$
+\begin{array}{rclcl}
+ L_c &:=& X' - \min(X'-L_c, X-L) &=& \max(L_c, A+L)\\
+ R_c &:=& \max(X'+R_c, X+R) - X' &=& \max(R_c, -A+R)\\
+ D_c &:=& Y' - \min(Y'-D_c, Y-D) &=& \max(D_c, B+D)\\
+ U_c &:=& \max(Y'+U_c, Y+U) - Y' &=& \max(U_c, -B+U)\\
+\end{array}
+$$
+ with $|<|A|,|B|>| = |<|X'-X|,|Y'-Y|>|$. First method~2 of the object
+ is used to convert it into a rectangle.
+
+\DOCMODE(
+\xydef@\cmergethec@{%
+ \noexpand\cmerge@{\the\Y@c}{\the\X@c}{\the\D@c}{\the\U@c}{\the\L@c}{\the\R@c}}
+
+\xydef@\cmerge@#1#2#3#4#5#6{\the\Edge@c4%
+ \A@=#2\advance\A@-\X@c \B@=#1\advance\B@-\Y@c
+ \dimen@=#5\advance\L@c \A@ \ifdim\L@c<\dimen@ \L@c=\dimen@ \fi
+ \dimen@=#6\advance\R@c-\A@ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \dimen@=#3\advance\D@c \B@ \ifdim\D@c<\dimen@ \D@c=\dimen@ \fi
+ \dimen@=#4\advance\U@c-\B@ \ifdim\U@c<\dimen@ \U@c=\dimen@ \fi
+ \advance\X@c\A@ \advance\Y@c\B@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[base]
+%
+ The operations |:| and |::| set the "base" used for <coord>inates
+ having the form $|(|x|,|y|)|$. The |:| operation will set
+ |<|$X_"origin"$|,| $Y_"origin"$|>| to~$p$, |<|$X_"xbase"$|,|
+ $Y_"xbase"$|>| to $c-"origin"$, and~|<|$X_"ybase"$|,| $Y_"ybase"$|>|
+ to |<|${-}Y_"xbase"$|,| $X_"xbase"$|>| (this ensures that it is a
+ usual square coordinate system). The |::| operation may then be used
+ afterwards to make nonsqare bases by just setting "ybase" to
+ $c-"origin"$. Here are two examples: firstly |0;<1cm,0cm>:| sets the
+ coordinate system
+$$
+\xy
+ <0cm,0cm>*@{o};<1cm,0cm>:
+ (0,0);{(1,0)**@{-}?>*@{>}},{(0,1)**@{-}?>*@{>}},
+ (0,0)*+!UR\hbox{\small"origin"},
+ (1,0)*+!LC\hbox{\small"xbase"},
+ (0,1)*!D\hbox{\small"ybase"},
+ (1,1)*{*}*++!CL{|(1,1)|}+0;(0,1)**@{.},(1,0)**@{.}
+\endxy
+$$
+ while~|<1cm,.5cm>;<2cm,1.5cm>:<1cm,1cm>::|\hfil defines
+$$
+\xy
+ <0cm,0cm>*@{o}, <1cm,.5cm>;<2cm,1.5cm>:
+%
+ (0,0);{(0,1)**@{--}?(1)*@{>}},
+ (0,1)*+!R\txt\small{"ybase"\\before\\{\tt::}},
+%
+ <1cm,1cm>::
+ (0,0);{(1,0)**@{-}?(1)*@{>}},{(0,1)**@{-}?(1)*@{>}},
+ (0,0)*+!LU\txt\small{"origin"},
+ (1,0)*+!LC\txt\small{"xbase"},
+ (0,1)*!D\txt\small{"ybase"},
+ (1,1)*{*}*++!CL{|(1,1)|}+0;(0,1)**@{.},(1,0)**@{.}
+\endxy
+$$
+ where in each case the $\circ$ is at |0|, the base vectors have been
+ drawn and the $\times$ is at |(1,1)|.
+
+ When working with cartesian coordinates these three special <factor>s
+ are particularly useful:
+%
+\begin{defs}
+ ??c![\halfroottwo] & $0.70710678\approx{1\over2}\sqrt2$ \cr
+ ??c![\partroottwo] & $0.29289322\approx 1-{1\over2}\sqrt2$ \cr
+ ??c![\halfrootthree] & $0.86602540\approx{1\over2}\sqrt3$ \cr
+\end{defs}
+\noindent\unskip
+%
+ More can be defined using |\def| (or |\newcommand| in \LaTeX).
+
+\DOCMODE(
+\xydef@\halfroottwo{.70710678}
+\xydef@\partroottwo{.29289322}
+\xydef@\halfrootthree{.8660254}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Procedure:}
+
+ The code chosen by the parsing is very simple; the only tricky bit is
+ to ensure that |\basefromthebase@| always expands to set the current
+ base.
+
+\DOCMODE(
+\xydef@\vfromcartesian@#1{\vfromcartesian@@#1@}
+
+\xydef@\vfromcartesian@@#1,#2@{%
+ \X@c=\X@origin \advance\X@c#1\X@xbase \advance\X@c#2\X@ybase
+ \Y@c=\Y@origin \advance\Y@c#1\Y@xbase \advance\Y@c#2\Y@ybase}
+
+\xydef@\setbase@#1#2#3#4{%
+ \X@origin=#1\relax \Y@origin=#2\relax
+ \X@xbase=#3\relax \advance\X@xbase-\X@origin
+ \Y@xbase=#4\relax \advance\Y@xbase-\Y@origin
+ \X@ybase=-\Y@xbase \Y@ybase=\X@xbase}
+
+\xydef@\setbase@@#1#2{%
+ \X@ybase=#1\relax \advance\X@ybase-\X@origin
+ \Y@ybase=#2\relax \advance\Y@ybase-\Y@origin}
+
+\xydef@\basefromthebase@{\X@origin=\the\X@origin \Y@origin=\the\Y@origin
+ \X@xbase=\the\X@xbase \Y@xbase=\the\Y@xbase
+ \X@ybase=\the\X@ybase \Y@ybase=\the\Y@ybase}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[angle in current base]
+%
+ An "angle" $\alpha$ in \Xy-pic is the same as the coordinate pair
+ $|(|\cos\alpha|,|\sin\alpha|)|$ where $\alpha$ must be an integer
+ interpreted as a number of degrees. Thus the <vector> |a(0)| is the
+ same as |(1,0)| and |a(90)| as |(0,1)|, etc.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The translation involves several steps: (??_[ang1])~Normalise the
+ argument to be within $[0^\circ:360^\circ[$. (??_[ang2])~Flip angle
+ around $x$-axis and then $y$-axis to ensure it is in the first
+ quadrant, \ie, within $[0^\circ:90^\circ[$. (??_[ang3])~Flip around
+ diagonal to ensure angle within $[0^\circ:45^\circ[$.
+ (??_[ang4])~Find values $\phi\le\alpha\lt\psi$ from the table in
+ figure~??[f.angles] (using recursive table lookup -- at most 3 tests
+ needed). (??_[ang5])~build vector $(x,y)$ interpolated between the
+ sin/cos values for $\phi$ and $\psi$ using the formula
+$$
+ \left(\cos\phi + k(\cos\psi-\cos\phi) ,
+ \sin\phi + k(\sin\psi-\sin\phi) \right) ~,
+ \quad\hbox{where}~k = \frac{\alpha-\phi}{\psi-\phi}
+$$
+ (??_[angx])~build the chosen vector.
+
+\begin{figure*}[tp]
+ \noindent Vectors for angles in $[0^\circ:45^\circ]$: contains all
+ angles required to typeset fractions up to $\frac{n}{12}\times2\pi$,
+ $\frac1{16}\times2\pi$, and $\frac1{24}\times2\pi$ exactly, and two
+ extra low ones to ensure that all gaps are less than $5^\circ$ and
+ the precision of all sine/cosines better than $\frac1{1000}$.
+ $$
+ \small
+ \def"{\vphantom{\frac()}\frac}
+ \begin{array}{\otherbar l\otherbar r@{~}l\otherbar c\otherbar c\otherbar}
+ \hline
+ ~\alpha & (\cos\alpha, & \sin\alpha) & \hbox{fractions of $2\pi$} &
+ \hbox{flipped fractions of $2\pi$} \\
+ \hline
+ ~0&(1,&0) & "0{n}
+ & "12,"14,"24,"28,"34,"36,"3{12},"48,"5{10},"68,"6{12},"9{12} \\
+ ~4.090909 & (.99677570, & .08023846) & - & - \\
+ ~6 & (.99452190, & .10452846) & - & - \\
+ ~8.181818 & (.98982144, & .14231484) & "3{11} & "8{11} \\
+ 10 & (.98480775, & .17364818) & "79 & "29 \\
+ 12.857143 & (.97492791, & .22252093) & "27 & "57 \\
+ 15 & (.96592583, & .25881905) & "1{24} & \\
+ 16.363636 & (.95949297, & .28173256) & "6{11} & "5{11} \\
+ 18 & (.95105652, & .30901699) & "3{10},"45,"8{10} & "15,"2{10},"7{10} \\
+ 20 & (.93969262, & .34202014) & "59 & "49 \\
+ 22.5 & (.92387953, & .38268343) & "1{16} & \\
+ 24.545455 & (.90963200, & .41541501) & "9{11} & "2{11} \\
+ 25.714286 & (.90096887, & .43388374) & "47 & "37 \\
+ 30 & (.86602540, & .5) & "13,"1{12},"26,"39,"4{12},"56,"7{12},"{10}{12}
+ & "16,"23,"2{12},"46,"5{12},"69,"8{12},"{11}{12} \\
+ 32.727273 & (.84125353, & .54064082) & "1{11} & "{10}{11} \\
+ 36 & (.80901699, & .58778525) & "1{10},"35,"6{10} & "25,"4{10},"9{10} \\
+ 38.571429 & (.78183148, & .62348980) & "67 & "17 \\
+ 40 & (.76604444, & .64278761) & "19 & "89 \\
+ 40.909091 & (.75574957, & .65486073) & "4{11} & "7{11} \\
+ 45 & (.70710678, & .70710678) & "18,"38,"58,"78 & - \\
+ \hline
+ \end{array}
+ $$
+ \caption{Computing angle vectors}
+ ??=[f.angles]
+\end{figure*}
+
+\DOCMODE(
+\xydef@\vfromcartesianangle@#1{\enter@\basefromthebase@ \R@=#1\p@
+ \B@=360\p@ %?*[ang1]
+ \loop@ \ifdim\R@<\z@ \advance\R@\B@ \repeat@
+ \loop@ \ifdim\R@>\B@ \advance\R@-\B@ \repeat@
+ \ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@ %?*[ang2]
+ \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi
+ \B@=180\p@
+ \ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@
+ \X@xbase=-\X@xbase \Y@xbase=-\Y@xbase \fi
+ \B@=90\p@ %?*[ang3]
+ \ifdim\R@<.5\B@ \let\nextiii@=\literal@
+ \else \R@=-\R@ \advance\R@\B@ \def\nextiii@##1,##2@{##2,##1@}\fi
+ \dimen@=\z@ \DN@{1,0@}% %?*[ang4]
+ \dimen@ii=45\p@ \DNii@{.70710678,.70710678@}%
+ \chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {4.090909}{.99677570,.08023846@}%
+ {}}%
+ {6}{.99452190,.10452846@}%
+ {\chooseangleinterval@
+ {}%
+ {8.181818}{.98982144,.14231484@}%
+ {}}}%
+ {10}{.98480775,.17364818@}%
+ {\chooseangleinterval@
+ {}%
+ {12.857143}{.97492791,.22252093@}%
+ {}}}%
+ {15}{.96592583,.25881905@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {16.363636}{.95949297,.28173256@}%
+ {}}%
+ {18}{.95105652,.30901699@}%
+ {\chooseangleinterval@
+ {}%
+ {20}{.93969262,.34202014@}%
+ {}}}}%
+ {22.5}{.92387953,.38268343@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {24.545455}{.90963200,.41541501@}%
+ {}}%
+ {25.714286}{.90096887,.43388374@}%
+ {}}%
+ {30}{.86602540,.5@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {32.727273}{.84125353,.54064082@}%
+ {}}%
+ {36}{.80901699,.58778525@}%
+ {\chooseangleinterval@
+ {\chooseangleinterval@
+ {}%
+ {38.571429}{.78183148,.62348980@}%
+ {}}%
+ {40.909091}{.75574957,.65486073@}%
+ {\chooseangleinterval@
+ {}%
+ {40}{.76604444,.64278761@}%
+ {}}}}}%
+ \A@=\R@ \advance\A@-\dimen@ %?*[ang5]
+ \ifdim\ifdim\A@<\z@-\fi\A@<.01\p@ \edef\next@{\expandafter\nextiii@\next@}%
+ \else \B@=\dimen@ii \advance\B@-\R@
+ \ifdim\A@<\B@ \dimen@=\toradians@\A@
+ \edef\next@{\next@ \expandafter\removePT@\the\dimen@ @}%
+ \else \dimen@=-\toradians@\B@
+ \edef\next@{\nextii@ \expandafter\removePT@\the\dimen@ @}%
+ \fi
+ \expandafter\interpolatepoint@\next@
+ \edef\next@{\expandafter\nextiii@\next@}%
+ \fi
+ \expandafter\vfromcartesian@@\next@ %?*[angx]
+ \leave@}
+
+\xydef@\chooseangleinterval@#1#2#3#4{%
+ \B@=#2\p@ \def\next{#3}%
+ \ifdim\R@<\B@ \dimen@ii=\B@ \let\nextii@=\next #1%
+ \else \dimen@=\B@ \let\next@=\next \ifdim\B@<\R@ #4\fi\fi}
+
+\xydef@\interpolateinterval@#1,#2@#3,#4@{%
+ \A@=#1\p@ \dimen@=#3\p@ \advance\dimen@-\A@ \advance\A@\next\dimen@
+ \B@=#2\p@ \dimen@=#4\p@ \advance\dimen@-\B@ \advance\B@\next\dimen@
+ \edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
+
+\xydef@\toradians@{0.01745329}
+
+\xydef@\interpolatepoint@#1,#2@#3@{%
+ \A@=#1\p@ \dimen@ii=#3\A@ \dimen@ii=-.5\dimen@ii \advance\A@#3\dimen@ii
+ \dimen@=-#2\p@ \advance\A@#3\dimen@
+ \B@=#2\p@ \dimen@ii=#3\B@ \dimen@ii=-.5\dimen@ii \advance\B@#3\dimen@ii
+ \dimen@=#1\p@ \advance\B@#3\dimen@
+ \edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
+\DOCMODE)
+
+ Figure~\ref{f.alldirections} shows all directions.
+
+\begin{figure}[ht]
+\begin{center}\leavevmode
+\def\a#1(#2){\save"o";a(#2)**@{-}*+__!P{\scriptscriptstyle#1#2}\restore}
+\def\ad(#1){\save"o",a(#1)*{\cdot}\restore}
+%
+\newcount\n \newcount\m
+\xy (50,0):0*{\kern.7pt\scriptstyle\ddot\smile}*[o]\cir<4pt>{}="o"\relax
+\n=0 %
+\loop
+ \expandafter\a\expandafter(\the\n)%
+ \advance\n1 \expandafter\ad\expandafter(\the\n)%
+ \advance\n1 \expandafter\ad\expandafter(\the\n)%
+ \advance\n1 \expandafter\ad\expandafter(\the\n)%
+ \advance\n1 \expandafter\ad\expandafter(\the\n)%
+ \advance\n1 \ifnum360>\n\relax \repeat
+\a~, (360)%
+\endxy
+\end{center}
+\caption{All directions.}\label{f.alldirections}
+\end{figure}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[drop]
+%
+ To "drop" an <object> at $c$ with |*| means to actually physically
+ typeset it in the picture with reference position at $c$---how this
+ is done depends on the <object> in question and is described in
+ detail in~\S??[object]. The intuition with a drop is that it
+ typesets something at $|<|X_c|,|Y_c|>|$ and sets the edge of $c$
+ accordingly.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subparagraph*{Procedure:}
+
+ (??_[drop1])~sets up the direction to allow for directionals and
+ builds the requested <object> in the (global) |\lastobjectbox@| box,
+ (??_[drop2])~adjust the picture size unless it is a hidden object,
+ setting $|\dimen@| = X_c-L_c$, and (??_[drop3])~drop the object in
+ the picture at the right point by setting |box0| and using the
+ |\Drop@@| method.
+
+\DOCMODE(
+\xydef@\drop@#1#2{%*[drop1]
+ \global\setbox\lastobjectbox@=\object#1{#2}%
+ \ifHidden@ \dimen@=\X@c \advance\dimen@-\L@c \else %?*[drop2]
+ \dimen@=\Y@c \advance\dimen@ \U@c \ifdim\Y@max<\dimen@ \Y@max=\dimen@ \fi
+ \dimen@=\Y@c \advance\dimen@-\D@c \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi
+ \dimen@=\X@c \advance\dimen@ \R@c \ifdim\X@max<\dimen@ \X@max=\dimen@ \fi
+ \dimen@=\X@c \advance\dimen@-\L@c \ifdim\dimen@<\X@min \X@min=\dimen@ \fi
+ \fi
+ \ifInvisible@\else %?*[drop3]
+ \setboxz@h{\kern\dimen@ \raise\Y@c\box\lastobjectbox@}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi}
+\DOCMODE)
+
+ \NOTE: All typesetting into a picture should use or emulate |\drop@|!
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[connect]
+%
+ The "connect" operation |**| will first compute a number of internal
+ parameters describing the direction from~$p$ to~$c$ and then typesets
+ a connection filled with copies of the <object> as illustrated
+ in~\S??[basics.connect]. The exact details of the connection depend
+ on the actual <object> and are described in general in~\S??[object].
+ The intuition with a connection is that it typesets something
+ connecting $p$ and $c$ and sets the |?| <pos> operator up accordingly.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subparagraph*{Procedure:}
+
+ Set up the direction to allow for directional objects, then save
+ $c$, build the <object> in |\lastobjectbox@|, restore $c$, and perform
+ the |\Connect@@| method to connect using |\lastobjectbox@|.
+
+\DOCMODE(
+\xydef@\connect@#1#2{\setupDirection@ \enter@{\cfromthec@}%
+ \global\setbox\lastobjectbox@=\object#1{#2}\leave@
+ \Connect@@}
+
+\xydef@\preconnect@#1#2{\setupDirection@ \enter@{\cfromthec@}%
+ \global\setbox\lastobjectbox@=\object#1{#2}\leave@ \connectStore@
+ \ifInvisible@ \Connect@@ \else \Invisible@true\Connect@@\Invisible@false \fi}
+\DOCMODE)
+
+ The |\preconnect| command is for internal use by arrow \dots\ it
+ makes use of the following:
+
+\DOCMODE(
+\xynew@{box}\connectobjectbox@@
+\xylet@\connectDrop@@=\empty
+\xylet@\connectpreXY@style@=\empty
+\xylet@\connectpostXY@style@=\empty
+
+\xylet@\connectRest@@=\empty
+
+\xydef@\connectStore@{%
+ \global\setbox\connectobjectbox@@=\copy\lastobjectbox@
+ \let\connectDrop@@=\Drop@@
+ \let\connectpreXY@style@ =\preXY@style@
+ \let\connectpostXY@style@=\postXY@style@
+ \xdef\connectRest@@{%
+ \def\noexpand\Upness@{\Upness@}%
+ \def\noexpand\Leftness@{\Leftness@}%
+ \ifInvisible@ \noexpand\Invisible@true \else \noexpand\Invisible@false \fi
+ \ifHidden@ \noexpand\Hidden@true \else \noexpand\Hidden@false \fi}}
+
+\xydef@\connectRestore@{%
+ \ifvbox\connectobjectbox@@
+ \setbox\lastobjectbox@=\copy\voidb@x
+ \else
+ \global\setbox\lastobjectbox@=\copy\connectobjectbox@@
+ \fi
+ \let\Drop@@=\connectDrop@@
+ \global\let\preXY@style@ =\connectpreXY@style@
+ \global\let\postXY@style@=\connectpostXY@style@
+ \connectRest@@}
+\DOCMODE)
+
+ See note `??w![define <shape>]' for the use of |\preXY@style@| and
+ |\postXY@style@| to apply special <style>s, specified via
+ <object-modifier>s; being saved here by |\connectStore@| as
+ |\connectpreXY@style@| and |\connectpostXY@style@| to be reset by
+ |\connectRestore@|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[shave]??=[pick place]??=[<place>]
+%
+ Using |?| will ``pick a place'' along the most recent connection
+ typeset with |**|. What exactly this means is determined by the
+ object that was used for the connection and by the modifiers
+ described in general terms here.
+
+ The ``shave'' modifiers in a <place>, |<| and |>|, change the default
+ <factor>, $f$, and how it is used, by `moving' the positions that
+ correspond to |(0)| and |(1)| (respectively): These are initially set
+ equal to~$p$ and~$c$, but shaving will move them to the point on the
+ edge of $p$ and $c$ where the connection ``leaves/enters'' them, and
+ change the default $f$ as indicated. When one end has already been
+ shaved thus then subsequent shaves will correspond to sliding the
+ appropriate position(s) a \TeX\ ??c![\jot] (usually equal to |3pt|)
+ further towards the other end of the connection (and past it).
+ Finally the "pick" action will pick the position located the fraction
+ $f$ of the way from |(0)| to |(1)| where $f=|0.5|$ if it was not set
+ (by |<|, |>|, or explicitly).
+
+ All this is probably best illustrated with some examples: each
+ $\otimes$ in figure~??[f.places] is typeset by a sequence of the form
+ $p$|;| $c$ |**@{.}| |?|<place> |*{\oplus}| where we indicate the
+ |?|<place> in each case. (We also give examples of <slide>s.)
+
+\begin{figure*}[tb]
+$$
+ \def\[#1]#2{\def\2{#2}%
+ \POS "p";"c"**{}
+ #2*+=[o]{\oplus}="x"*=<5em,3em>{}-#1*!#1\hbox{{\tt\codeof\2}};
+ "x"**@{-}?>*@{>}\ignorespaces}%
+ %
+\xy
+ <0pt,110pt>*[o]=<20pt>{}="p"*\frm{oo}+L*!RC\hbox{$p$ is circular:~},
+ <270pt,0pt>*=<4em>\txt<4em>{$c$ is a square text!}="c"*\frm{-,},
+ "p";"c"**@{--}\relax
+ %
+ \[UR]{?(0)}
+ \[UR]{?(1)}
+ \[UR]{?}
+ \[UR]{?(.7)}
+ %
+ \[D]{?<>(.5)}
+ \[DL]{?<>(.2)(.5)}
+ \[DL]{?<}
+ \[UR]{?<<<}
+ \[UR]{?<<</1cm/}
+ \[D]{?<(0)}
+ \[DL]{?>}
+ \[D]{?>>>>}
+ %
+ \[DL]{?<>(.7)}
+ \[D]{?>(.7)}
+\endxy
+$$
+\caption{Example \protect<place>s}??=[f.places]
+\end{figure*}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Procedure:}
+
+ The code for parsing <place> is the following. To get first |<>| to
+ move to edge and the remaining to move a ??c![\jot] we have both
+ initial and continuing versions for each, the idea being that the
+ second and following go to the edge of a small temporary object with
+ radius |\jot|.
+
+ \NOTE: This parser tests the "new parsing principle" that |\xy@|
+ should always be called as |\xy@{| "source" |}{| "target" |}|!
+
+% \HACK: `Helps' the `arrow' feature: in the procedure for path
+% sub-segments, it is necessary to know the value of |\PLACEf@| both at
+% the (possibly delayed) time when the sub-segments are being typeset
+% and also at the time when the subsegments are being processed (and
+% packaged to be delayed by the |\xy@@|). Thus it is necessary for any
+% changes to the value of |\PLACEf@| to be both immediate and
+% delayed. The reason is that |\bstartPLACE@| and |\bendPLACE@| read
+% values from |\PLACEf@| and are themselves delayed by calls to |\xy@@|
+% -- these delayed calls need to know what |\PLACEf@| will be when they
+% are used.
+
+\DOCMODE(
+\xydef@\afterPLACE#1{%
+ \DN@##1{\def\afterPLACE@{\xy@@\leave@ \def\afterPLACE@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterPLACE@}%
+ \def\PLACEf@{{.5}}%
+ \xy@@{\enter@{\pfromthep@}%
+ \Creset@@ \def\PLACEf@{{.5}}%
+ \let\PLACEedgep@@=\PLACEedgep@ \let\PLACEedgec@@=\PLACEedgec@}%
+ \xyFN@\PLACE@}
+
+\xydef@\PLACEf@{}
+
+\xydef@\PLACEedgep@@{}
+\xydef@\PLACEedgec@@{}
+
+\xydef@\PLACEedgep@{\Cshavep@@ \def\PLACEedgep@@{\Cslidep@@\jot}}
+\xydef@\PLACEedgec@{\Cshavec@@ \def\PLACEedgec@@{\Cslidec@@{-\jot}}}
+
+\xylet@\afterPLACE@=\empty
+
+\xydef@\PLACE@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@}%gobble spaces
+ \else\addLT@\ifx \next
+ \addLT@\DN@{\addLT@\xy@{\def\PLACEf@{{0}}\PLACEedgep@@}\xyFN@\PLACE@}%
+ \else\addGT@\ifx \next
+ \addGT@\DN@{\addGT@\xy@{\def\PLACEf@{{1}}\PLACEedgec@@}\xyFN@\PLACE@}%
+ \else\ifx (\next %)
+ \DN@(##1){\def\PLACEf@{{##1}}\xy@{(##1)}{\def\PLACEf@{{##1}}}\xyFN@\PLACE@}%
+ \else\ifx !\next
+ \DN@!{\xyFN@\PLACE@intercept}%
+ \else
+ \DN@{\xy@@{\expandafter\Calong@@\PLACEf@ \czeroEdge@}\PLACE@@}%
+ \fi\fi\fi\fi\fi \next@}
+
+\xydef@\PLACE@intercept{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@intercept}%gobble spaces
+ \else\ifx \bgroup\next
+ \DN@##1{\xy@{!{##1}}{}\PLACE@intercept@{##1}}%
+ \else\ifx (\next %)
+ \DN@(*##1*){\xy@{!(*##1*)}{}\PLACE@intercept@{##1}}%
+ \else \DN@{\xyerror@{{<pos>} expected after ! in <place>}{}}%
+ \fi\fi\fi \next@}
+
+\xydef@\PLACE@intercept@#1{%
+ \xy@@{\enter@{\pfromthep@\basefromthebase@}\begingroup}%
+ \xy@@ix@{#1}\xy@@{\plainxy@ \expandafter\POS\the\toks9\relax
+ \edef\next@{\endgroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \next@ \Cintercept@@ \leave@}%
+ \PLACE@@}
+
+\xydef@\PLACE@@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@@}%gobble spaces
+ \else\ifx /\next \DN@/##1/{\xy@{/##1/}{\Cslidec@@{##1}}\afterPLACE@}%
+ \else \let\next@=\afterPLACE@
+ \fi\fi \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[slide]
+%
+ A <slide> will move the position a dimension further along the
+ connection at the picked position. For straight connections (the
+ only ones kernel \Xy-pic provides) this is the same as adding a
+ vector in the tangent direction, \ie, $|?|\dots|/|A|/|$ is the same
+ as $|?|\dots|+/|A|/|$.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[intercept]
+%
+ This special <place> finds the point where the last connection
+ intercepts with the line from $p$ to $c$ as setup by the <pos>, thus
+ usually this will have the form |!{|<coord>|;|<coord>|}|\footnote{The
+ braces can be replaced by |(*|\dots|*)| "once", \ie, there can be no
+ other braces nested inside it.}, for example,
+ \BUG: Only works for straight arrows at present.
+%
+\begin{code}
+\xy <1cm,0cm>:
+ (0,0)*=0{+}="+" ;
+ (2,1)*=0{\times}="*" **@{.} ,
+ (1,0)*+{A} ; (2,2)*+{B} **@{-}
+ ?!{"+";"*"} *{\bullet}
+\endxy
+\end{code}
+\displaycode\noindent
+%
+ will typeset
+%
+$$\docode$$
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[axis intersection]
+%
+ The positions denoted by the "axis intersection"
+ <coord>inates~??c![x] and~??c![y] are the points where the line
+ through $p$ and $c$ intersects with each axis. The following figure
+ illustrates this:
+$$
+ \xy;<1cm,.5cm>:<-.5cm,.5cm>::
+ (0,0)*+!UR{"origin"};
+ (1,0)*+!DR{"xbase"}**@{-}?>*@{>},
+ (0,0);(0,1)*+!DR{"ybase"}**@{-}?>*@{>},
+ (0.5,-1)="p"*@{o}*!LU\hbox{~$p$};
+ p+<.25cm,.5cm>="c"*@{o}*!LU\hbox{~$c$}*{}?(1),
+ %
+ "p";"c",x*+!LD{|x|}*@{*}*{}**@{.};(1,0)**@{.},
+ "p";"c",y*!U{\strut|y|}*@{*}*{}**@{.};(0,0)**@{.},
+ \endxy
+$$
+
+\begin{exercise}
+%
+ Given predefined points $A$, $B$, $C$, and $D$ (stored as objects
+ |"A"|, |"B"|, |"C"|, and |"D"|), write a <coord> specification that
+ will return the point where the lines $\overline{AB}$ and
+ $\overline{CD}$ cross (the point marked with a large circle here):
+%
+\begin{code}
+\xy
+ %
+ % set up and mark A, B, C, and D:
+ (0,0)="A" *\cir<1pt>{}*+!DR{A},
+ (7,10)="B" *\cir<1pt>{}*+!DR{B},
+ (13,8)="C" *\cir<1pt>{}*+!DL{C},
+ (15,4)="D" *\cir<1pt>{}*+!DL{D},
+ %
+ % goto intersection and name+circle it:
+ {"A";"B":"C";"D",x} ="I" *\cir<3pt>{},
+ %
+ % make dotted lines:
+ "I";"A"**{} +/1pc/;-/1pc/ **@{..},
+ "I";"D"**{} +/1pc/;-/1pc/ **@{..}
+ %
+\endxy
+\end{code}
+$$\docode$$
+%
+\answertext{The <coord> ``|{"A";"B":| |"C";"D",| |x}|'' returns the cross
+ point. Here is how the author typeset the diagram in the exercise:}
+\answercode
+\answertext{\displaycode\noindent A |?!|\dots\ <place> could also have been
+ used.}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Procedure:}
+
+ We solve the following equation in $a,b$:
+$$
+ "origin" + a*|<|R_c|,|U_c|>| = c - b*(c-p)
+$$
+ and then set
+$$
+ |<|X_c|,|Y_c|>| := |<|X_c|,|Y_c|>| - b*(c-p)
+ \quad\textrm{with zero size}\quad
+ D_c,U_c,L_c,R_c := 0,0,0,0.
+$$
+ The code uses $c=(X_c,Y_c,D_c,U_c,L_c,R_c)$ and $A,B$ as temporaries
+ and computes:
+$$
+\begin{array}{rcl}
+ |<|dX|,|dY|>| &:=& |<|X_c|,|Y_c|>| - |<|X_p,Y_p|>| \\[1pt]
+ |<|A|,|B|>| &:=& |<|X_c|,|Y_c|>| - |<|X_"origin"|,|Y_"origin"|>| \\[1pt]
+ |<|D_c|,|L_c|>| &:=& |<| \Det{R& dX\\U&dY} |,|
+ \Det{R&A\\U&B} |>| \\[1pt]
+ |<|X_c|,|Y_c|>| &:=& |<|X_c|,|Y_c|>| - (L_c/D_c)*|<|dX|,|dY|>|
+\end{array}
+$$
+ where we really do $D := (R/|pt|)dY - (U/|pt|)dX$ and similarly for
+ $L$.
+
+\DOCMODE(
+\xydef@\intersect@{%?*[intersect@]
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \A@=\X@c \advance\A@-\X@origin \B@=\Y@c \advance\B@-\Y@origin
+ \edef\next@{\expandafter\removePT@\the\R@c}%
+ \edef\nextii@{\expandafter\removePT@\the\U@c}%
+ \D@c=\next@\d@Y \advance\D@c-\nextii@\d@X \divide\D@c\KK@
+ \L@c=\next@\B@ \advance\L@c-\nextii@\A@ \divide\L@c\KK@
+ \ifdim\D@c=\z@\zeroDivide@\else \quotient@\next@\L@c\D@c \fi
+ \advance\X@c-\next@\d@X \advance\Y@c-\next@\d@Y
+ \czeroEdge@}
+\DOCMODE)
+
+ When there is no intersection point a wrong answer is returned,
+ accompanied by a warning message. This behaviour can be altered by
+ assigning a different value to the hook: |\zeroDivide@|. This macro
+ must store a number in |\next@|.
+
+\DOCMODE(
+\xydef@\zeroDivide@@{\zeroDivide@message{\intersect@}{treated as 0}\DN@{0}}
+\xydef@\zeroDivide@message#1#2{\xywarning@{division by 0 in \string#1, #2}}
+\xylet@\zeroDivide@=\zeroDivide@@
+
+\xydef@\zeroDivideLimit@@{\ifdim\L@c=\z@ \DN@{0}%
+ \else\ifdim\L@c<\z@\DN@{-\zeroDivide@Limit}%
+ \else\DN@{\zeroDivide@Limit}\fi\fi
+ \zeroDivide@message{\intersect@}{replaced by \zeroDivide@Limit}}
+\xydef@\zeroDivideLimit@#1{\edef\zeroDivide@Limit{#1}%
+ \let\zeroDivide@=\zeroDivideLimit@@}
+\xylet@\zeroDivideLimit=\zeroDivideLimit@
+\DOCMODE)
+
+ By specifying |\zeroDivideLimit{|<num>|}| the user can locally
+ establish that ${x\over0} = \sgn(x)$<num>, whenever such a division
+ by zero would otherwise occur in an intersection calculation.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[group]
+%
+ A <pos> <decor> "grouped" in |{}|-braces\footnote{One can use
+ |(*|\dots|*)| instead also here.} is interpreted in a local scope in
+ the sense that any $p$ and "base" built within it are forgotten
+ afterwards, leaving only the $c$ as the result of the <coord>.
+ \NOTE: Only $p$ and "base" are restored -- it is not a \TeX\ group.
+
+\begin{exercise}
+ What effect is achieved by using the <coord>inate ``|{;}|''?
+\answertext{To copy the $p$ value to $c$, \ie, equivalent to ``|p|''.}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The code is inside |\POS@|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[in <direction>]
+%
+ The vector $|/|Z|/|$, where $Z$ is a <dimen>sion, is the same as the
+ vector $|<|Z\cos\alpha|,|Z\sin\alpha|>|$ where $\alpha$ is the angle
+ of the last direction set by a connection (\ie, with |**|) or
+ subsequent placement (|?|) position.
+
+\DOCMODE(
+\xydef@\vfromslide@#1{\enter@\DirectionfromtheDirection@ \begingroup
+ \plainxy@\afterDIRECTIONorEMPTY\vfromslide@i\vfromslide@i#1@}
+
+\xydef@\vfromslide@i#1@{\DN@{#1}%
+ \edef\next{\endgroup
+ \ifx\next@\empty \dimen@=.5pc \else \dimen@=#1\relax \fi
+ \X@c=\cosDirection\dimen@ \Y@c=\sinDirection\dimen@}\next
+ \leave@}
+\DOCMODE)
+
+ It is possible to give a <direction> as described in the next section
+ (figure~??[f.object], note~??[direction] in particular) that will
+ then be used to set the value of $\alpha$. It is also possible to
+ omit the <dimen> in which case it is set to a default value of
+ |.5pc|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[offset]??=[corner]
+%
+ A <corner> is an offset from the current $|<|X_c|,|Y_c|>|$ position
+ to a specific position on the edge of the $c$ object (the two-letter
+ ones may be given in any combination):
+$$
+\def\[#1]{\POS"box"+#1="x";"box"
+ **{} ?</-2em/*+\hbox{\tt#1};"x",**@{-}?>*@{>}}
+%
+\xy.(-5,-4).(15,9)*\frm{-}="box"*{c}="c";
+ "box"+L**@{.}, "box"+R**@{.}, "box"+D**@{.}, "box"+U**@{.}
+%
+ \[L] \[R] \[D] \[U]
+ \[LD]\[RD]\[LU]\[RU]
+ \[CL]\[CR]\[DC]\[UC] \[C] \[P]
+ \POS"box"+(-20,-8)*{p}="p";"c"**@{.},"box"**{}\[E]
+\endxy
+$$
+ The `edge point' |E| lies on the edge along the line from $p$ to the
+ centre of the object, in contrast to the `proportional' point |P|
+ which is also a point on the edge but computed in such a way that the
+ object looks as much `away from $p$' as possible.
+
+ Finally, a following $|(|f|)|$ suffix will multiply the offset vector
+ by the <factor> $f$.
+
+\begin{exercise}
+ What is the difference between the <pos>itions |c?<| and |c+E|?
+\answertext{When using the kernel connections that are all straight there is
+ no difference, \eg, |**{}?<| and |**{}+E| denote exactly the same
+ position. However, for other connections it is not necessarily the
+ case that the point where the connection enters the current object,
+ denoted by |?<|, and the point where the straight line from $p$
+ enters the object, denoted by |+E|, coincide.}
+\end{exercise}
+
+\begin{exercise}
+\begin{code}
+\xy *=<3cm,1cm>\txt{Box}*\frm{-}
+ !U!R(.5) *\frm{..}*{\bullet} \endxy
+\end{code}
+%
+ What does this typeset?
+%
+\displaycode
+\noindent
+ "Hint": ??c![\frm] is defined by the frame extension and just
+ typesets a frame of the kind indicated by the argument.
+%
+\answercode
+\answertext{The code typesets the picture $$\docode$$}
+\end{exercise}
+
+ \BUG: Currently only the single-letter corners (??c![L], ??c![R],
+ ??c![D], ??c![U], ??c![C], ??c![E], and ??c![P]) will work for any
+ shape---the others silently assume that the shape is rectangular.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[stack]??=[<stack op>eration]
+%
+ The "stack" is a special construction useful for storing a sequence
+ of <pos>itions that are accessible using the special
+ <coord>inates~|s|$n$, where $n$~is either a single digit or a
+ positive integer in |{}|s: |s0| is always the `top' element of the
+ stack and if the stack has depth $d$ then the `bottom' element of the
+ stack has number |s{|$d-1$|}|. The stack is said to be `empty' when
+ the depth is~$0$ and then it is an error to access any of the |s|$n$
+ or `pop' which means remove the top element, shifting what is in |s1|
+ to |s0|, |s2| to |s1|, etc. Similarly, `push~$c$' means to shift
+ |s0| to |s1|, etc., and then insert the $c$ as the new |s0|.
+
+ The stack is manipulated as follows:
+%
+\begin{defs}
+ |@|<stacking> & Action \cr
+\noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}%
+ ??c![@+]<coord> & push $<coord>$ \cr
+ ??c![@-]<coord> & $c\from<coord>$ then pop \cr
+ ??c![@=]<coord> & load stack with <coord> \cr
+ ??c![@@]<coord> & do $<coord>$ for $c\from$ stack \cr
+ ??c![@i] & initialise \cr
+ ??c![@(] & enter new frame \cr
+ ??c![@)] & leave current frame \cr
+\end{defs}
+\noindent\unskip
+%
+ To `load stack', means to load the entire stack with the positions
+ set by <coord> within which |,| means `push $c$'.
+
+ To `do <coord> for all stack elements' means to set $c$ to each
+ element of the stack in turn, from the bottom and up, and for each
+ interpret the <coord>. Thus the first interpretation has $c$ set to
+ the bottom element of the stack and the last has $c$ set to~|s0|. If
+ the stack is empty, the <coord> is not interpreted at all.
+
+ These two operations can be combined to repeat a particular <coord>
+ for several points, like this:
+%
+\begin{code}
+\xy
+ @={(0,-10),(10,3),(20,-5)} @@{*{P}}
+\endxy
+\end{code}
+\displaycode\noindent
+%
+ will typeset
+%
+$$\docode$$
+
+ Finally, the stack can be forcibly cleared using |@i|, however, this
+ is rarely needed because of |@(|, which saves the stack as it is, and
+ then clears it, such when it has been used (and is empty), and |@)|
+ is issued, then it is restored as it was at the time of the~|@(|.
+
+\begin{exercise}
+ How would you change the example above to connect the points as shown
+ below?
+%
+\begin{code}
+\xy
+ @={(0,-10),(10,3),(20,-5)},
+ s0="prev" @@{;"prev";**@{-}="prev"}
+\endxy
+\end{code}
+%
+$$\docode$$
+%
+\answercode
+\answertext{This does the job, saving each point to make the previous point
+ available for the next piece:\displaycode\noindent Notice how we
+ close the line by first saving |s0|, the last point visited, such
+ that the first point will be connected to it.}
+%
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ First the stack top and bottom, both initially~$-1$:
+
+\DOCMODE(
+\xydef@\s@bot{-1}
+\xydef@\s@top{-1}
+\DOCMODE)
+
+ Next the function to set $c\from|s|n$, \ie, test that $"bot"\lt
+ n+"bot"\lt "top"$ and then run the associated stack element.
+
+\DOCMODE(
+\xydef@\cfroms@#1{\tests@{#1}\runs@\outofranges@}
+
+\xydef@\tests@#1#2#3{\DN@{#3}%
+ \count@=\s@top \advance\count@-#1\relax
+ \ifnum\count@>\s@bot\relax \ifnum\count@>\s@top\else\DN@{#2}\fi\fi
+ \next@}
+
+\xydef@\runs@{\csname S@\the\count@\endcsname}
+
+\xydef@\outofranges@{\count@=\s@top \advance\count@-\s@bot
+ \xyerror@{stack index out of range (should be 0..\the\count@)}{}}
+\DOCMODE)
+
+ Finally the actual code to do the stack operations: it depends on the
+ `code' passed after |@|; spaces are not allowed:
+
+\DOCMODE(
+\xydef@\STACK@{%
+ \addPLUS@\ifx\next
+ \addPLUS@\DN@{\xy@{@+}{}\afterCOORD{\xy@@\spushc@ \xyFN@\POS@}}%
+ \else\addDASH@\ifx\next
+ \addDASH@\DN@{\xy@{@-}{}\afterCOORD{\xy@@\spop@ \xyFN@\POS@}}%
+ \else \ifx i\next \DN@ i{\xy@{@i}\sinit@ \xyFN@\POS@}%
+ \else \ifx (\next \DN@ ({\xy@{@(}\senter@ \xyFN@\POS@}%
+ \else \ifx )\next \DN@ ){\xy@{@)}\sleave@ \xyFN@\POS@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\STACK@load}%
+ \else\addAT@\ifx\next \addAT@\DN@{\xy@{@@}{}\smap@}%
+ \else \DN@##1{\xyerror@{illegal stack command ##1}{}\afterCOORD{\xyFN@\POS@}}%
+ \fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\STACK@load{\xy@{@=}{%
+ \if\sempty@\else \xywarning@{loading on top of non-empty stack}\sinit@ \fi
+ \let\comma@@=\spushc@}%
+ \afterCOORD{\xy@@{\spushc@ \let\comma@@=\relax}\xyFN@\POS@}}
+
+\xydef@\spushc@{%
+ \count@=\s@top \advance\count@\@ne \edef\s@top{\the\count@}%
+ \expandafter\edef\csname S@\s@top\endcsname{\cfromthec@}}
+
+\xydef@\spushid@#1{\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
+ \expandafter\let\expandafter\next@\csname Q@\nextii@\endcsname
+ \ifx\next@\relax \xyerror@{<pos> \string"\nextii@\string" not defined}{}%
+ \else
+ \count@=\s@top \advance\count@\@ne \edef\s@top{\the\count@}%
+ \DNii@##1{\expandafter\def\csname S@\s@top\endcsname{##1}}%
+ \expandafter\nextii@\expandafter{\next@}%
+ \fi}
+
+\xydef@\idfroms@#1#2{%
+ \tests@{#2}{\DN@{\idfromxy@{#1}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\csname S@\the\count@\endcsname}%
+ }\outofranges@}
+
+\xydef@\spop@{\count@=\s@top
+ \ifnum\count@>\s@bot \advance\count@\m@ne \edef\s@top{\the\count@}%
+ \else \xyerror@{nothing to pop from stack}{}\fi}
+
+\xydef@\sinit@{\edef\s@top{\s@bot}}
+
+\xydef@\senter@{%
+ \count@=\s@top \advance\count@\@ne
+ \expandafter\edef\csname S@\the\count@\endcsname{\s@bot}%
+ \edef\s@bot{\the\count@}\edef\s@top{\the\count@}}
+
+\xydef@\sleave@{%
+ \ifnum\s@bot=\s@top\else \xywarning@{leaving non-empty stack}\sinit@ \fi
+ \ifnum\s@bot>\m@ne \edef\s@bot{\csname S@\s@top\endcsname}%
+ \count@=\s@top \advance\count@\m@ne \edef\s@top{\the\count@}%
+ \edef\sbot{\the\count@}\fi}
+
+\xydef@\sempty@{\ifnum\s@top=\s@bot TT\else TF\fi}
+\DOCMODE)
+
+ |\smap@| maps a <coord> over a stack:
+
+\DOCMODE(
+\xydef@\xytotoks@#1#2{\addtotoks@{#2}}
+\xydef@\xytotoks@@toksix@#1{\addtotoks@{\toks9={#1}}}
+
+\xydef@\smap@{%
+ \begingroup \toks@={}\let\xy@=\xytotoks@ \change@oxy@\xy@
+ \let\xy@@ix@=\xytotoks@@toksix@
+ \afterCOORD{\expandafter\endgroup
+ \expandafter\smapxy@@\expandafter{\the\toks@}\xyFN@\POS@}}
+
+\xydef@\smapxy@@#1{\xy@@{\edef\smapp@@{\s@bot}\smapxy@i{#1}}}
+
+\xylet@\smapp@@=\empty
+
+\xydef@\smapxy@i#1{%
+ \ifnum\smapp@@<\s@top
+ \count@=\smapp@@ \advance\count@\@ne \edef\smapp@@{\the\count@}%
+ \DN@{\csname S@\smapp@@\endcsname #1\relax \smapxy@i{#1}}%
+ \else \let\next@=\relax
+ \fi \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[save]??=[saved]
+%
+ It is possible to define new <coord>inates on the form |"|<id>|"| by
+ "saving" the current $c$ using the \dots|="|<id>|"| <pos>ition form.
+ Subsequent uses of |"|<id>|"| will then reestablish the $c$ at the
+ time of the saving.
+
+ Using a |"|<id>|"| that was never defined is an error, however,
+ saving into a name that was previously defined just replaces the
+ definition without warning, \ie, |"|<id>|"| always refers to the last
+ thing saved with that <id>.
+
+ However, many other things can be `saved': in general |@|<saving> has
+ either of the forms
+%
+\begin{defs}
+ |@:"|<id>|"| & |"|<id>|"| restores current "base" \cr
+ |@|<coord>|"|<id>|"| & |"|<id>|"| reinterprets <coord> \cr
+ |@@"|<id>|"| & |@="|<id>|"| reloads this stack \cr
+\end{defs}
+\noindent\unskip
+%
+ The first form defines |"|<id>|"| to be a macro that restores the
+ current "base".
+
+ The second does not depend on the state at the time of definition at
+ all; it is a macro definition. You can pass parameters to such a
+ macro by letting it use coordinates named |"1"|, |"2"|, etc., and
+ then use |="1"|, |="2"|, etc., just before every use of it to set the
+ actual values of these. \NOTE: it is not possible to use a <coord>
+ of the form |"|<id>|"| directly: write it as |{"|<id>|"}|.
+%
+\begin{exercise}
+ Write a macro |"dbl"| to double the size of the current~$c$ object,
+ \eg, changing it from the dotted to the dashed outline in this
+ figure:
+%
+\begin{code}
+\xy ={.{+DL(2)}.{+UR(2)}}"dbl",
+ *+<3pc,2pc>{+}*\frm{.}, "dbl"*\frm{--}
+\endxy
+\end{code}
+$$
+\docode
+$$
+\answercode
+\answertext{The author used \displaycode\noindent to typeset the figure in
+ the exercise.}
+\end{exercise}
+
+ The final form defines a special kind of macro that should only be
+ used after the |@=| stack operation: the entire current stack is
+ saved such that the stack operation |@="|<id>|"| will reload it.
+
+ \NOTE: There is no distinction between the `name spaces' of <id>s
+ used for saved coordinates and other things.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This parser distinguishes between the cases:
+
+\DOCMODE(
+\xydef@\saveid@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\saveid@}%gobble spaces
+ \else \ifx "\next\DN@"##1"{\xy@{="##1"}{\idfromc@{##1}}\xyFN@\POS@}%
+ \else \ifx :\next\DN@:##1"##2"{\xy@{=:"##2"}{\idfrombase@{##2}}\xyFN@\POS@}%
+ \else\addAT@\ifx\next
+ \addAT@\DN@"##1"{\xy@{=@"##1"}{\idfromstack@{##1}}\xyFN@\POS@}%
+ \else \ifx s\next
+ \DN@ s##1"##2"{\xy@{=s##1"##2"}{\idfroms@{##2}{##1}}\xyFN@\POS@}%
+ \else\addEQ@\ifx\next \let\saveid@COORD@@=\saveid@COORDii
+ \addEQ@\DN@{\xyFN@\saveid@COORD}%
+ \else \let\saveid@COORD@@=\saveid@COORDi \let\next@=\saveid@COORD
+ \fi\fi\fi\fi\fi\fi \next@}
+
+\xylet@\saveid@COORD@@=\relax
+\DOCMODE)
+
+ Here is the code for saving/restoring a position and a base.
+
+\DOCMODE(
+\xydef@\idfromc@#1{\DN@{#1}%
+ \expandafter\edef\csname Q@\codeof\next@\endcsname{\cfromthec@}}
+
+\xydef@\idfrombase@#1{\DN@{#1}%
+ \expandafter\edef\csname Q@\codeof\next@\endcsname{\basefromthebase@}}
+
+\xydef@\idfromstack@#1{%
+ \toks@={\if\sempty@\else
+ \xywarning@{loading on top of non-empty stack}\sinit@ \fi}%
+ \count@=\s@bot \advance\count@\@ne
+ \ifnum\count@>\s@top\else
+ \loop@
+ \expandafter\let\expandafter\next@\csname S@\the\count@\endcsname
+ \expandafter\addtotoks@\expandafter{\next@}%
+ \ifnum\count@<\s@top \advance\count@\@ne \addtotoks@{\spushc@}\repeat@
+ \fi
+ \DN@{#1}\edef\next@##1{%
+ \def\expandafter\noexpand\csname Q@\codeof\next@\endcsname{##1}}%
+ \expandafter\next@\expandafter{\the\toks@}}
+
+\xydef@\saveid@COORD{%
+ \begingroup \toks@={}\let\xy@=\xytotoks@ \change@oxy@\xy@
+ \let\xy@@ix@=\xytotoks@@toksix@
+ \afterCOORD{\expandafter\saveid@COORDi\expandafter{\the\toks@}}}
+
+\xydef@\saveid@COORDi#1#2"#3"{\endgroup \xy@@{\idfromxy@{#3}{#1}}\xyFN@\POS@}
+\xydef@\saveid@COORDii#1#2"#3"{\endgroup \xy@@{\idfromcxy@{#3}{#1}}\xyFN@\POS@}
+
+\xydef@\idfromxy@#1#2{\DN@{#1}%
+ \expandafter\def\csname Q@\codeof\next@\endcsname{#2}}
+
+\xydef@\idfromcxy@#1#2{\DN@{#1}%
+ \expandafter\edef\csname Q@\codeof\next@\endcsname{\cfromthec@#2}}
+
+\xydef@\cfromid@#1{\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
+ \expandafter\let\expandafter\next@\csname Q@\nextii@\endcsname
+ \ifx\next@\relax \xyerror@{<pos> \string"\nextii@\string" not defined}{}%
+ \else \expandafter\next@\fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{Objects}
+??=[object]
+
+\DOCMODE(
+\message{objects,}
+\DOCMODE)
+
+ Objects are the entities that are manipulated with the |*| and |**|
+ <pos> operations above to actually get some output in \Xy-pictures.
+ As for <pos>itions the operations are interpreted strictly from left
+ to right, however, the actual object is built "before" all the
+ <modifier>s take effect. The syntax of objects is given in
+ figure~??[f.object] with references to the notes below. \REMARK: It
+ is "never" allowed to include braces |{}| inside <modifier>s! In
+ case you wish to do something that requires |{|\dots|}| then check in
+ this manual whether you can use |(*|\dots|*)| instead. If not then
+ you will have to use a different construction!
+
+\begin{figure*}[tp]
+\begin{syntax}
+%
+ ??w![<object>]
+ &\iss & <modifier> <object>
+ & apply <modifier> to <object>
+\cr
+ &\orr & <objectbox>
+ & build <objectbox> then apply its <modifier>s
+\cr
+\noalign{\smallbreak}
+%
+\cr
+ ??w![<objectbox>]
+ &\iss & |{| <text> |}|
+ & ??!^[build default] object
+\cr
+ &\orr & <library object> \orr\ |@|<dir>
+ & use <library object> or <dir>ectional (see~\S??[objectlib])
+\cr
+ &\orr & <\TeX\ box> |{| <text> |}|
+ & ??!^[build box] object with <text> using the given <\TeX\ box>
+ command, \eg, ??c![\hbox]
+\cr
+ &\orr & ??c![\object] <object>
+ & wrap up the <object> as a ??!^[finished object box]
+\cr
+ &\orr & ??c![\composite] |{| <composite> |}|
+ & build ??!^[composite object box]
+\cr
+ &\orr & ??c![\xybox] |{| <pos> <decor> |}|
+ & package ??!^[entire \Xy-picture as object]
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<modifier>]
+ &\iss & |!| <vector>
+ & <object> has its reference point ??!^[shifted] by <vector>
+\cr
+ &\orr & |!|
+ & <object> has the original reference point reinstated
+\cr
+ &\orr & <add op> <size>
+ & change ??!^[<object> size]
+\cr
+ &\orr & ??c![h] \orr\ ??c![i]
+ & <object> is ??!^[hidden], ??!^[invisible]
+\cr
+ &\orr & |[| <shape> |]|
+ & <object> is given the specified ??!^[<shape>]
+\cr
+ &\orr & ??c![[=] <shape> |]|
+ & ??!^[define <shape>] to reestablish ??w![current object style]
+\cr
+ &\orr & <direction>
+ & set current direction for this <object>
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<add op>]
+ &\iss & |+| \orr\ |-| \orr\ |=| \orr\ |+=| \orr\ |-=|
+ & grow, shrink, set, grow to, shrink to
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<size>]
+ &\iss & <empty>
+ & ??!^[default size]
+\cr
+ &\orr & <vector>
+ & size as sides of rectangle covering the <vector>
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<direction>]
+ &\iss & <diag>
+ & <diag>onal ??!^[direction]
+\cr
+ &\orr & ??c![v] <vector>
+ & ??!^[direction] of <vector>
+\cr
+ &\orr & ??c![q]|{| <pos> <decor> |}|
+ & ??!^[direction] from $p$ to $c$ after <pos> <decor>
+\cr
+ &\orr & <direction> ??c![:] <vector>
+ & vector relative ??!^[to <direction>]
+\cr
+ &\orr & <direction> |_| \orr\ <direction> |^|
+ & $90^\circ$ clockwise/anticlockwise ??!^[to <direction>]
+\cr
+%
+ ??w![<diag>]
+ &\iss & <empty>
+ & last used direction (not necessarily ??!^[diagonal])
+\cr
+ &\orr & |l|\orr|r|\orr|d|\orr|u|
+ & left, right, down, up ??!^[diagonal]
+\cr
+ &\orr & |ld|\orr|rd|\orr|lu|\orr|ru|
+ & left/down, \dots\ ??!^[diagonal]
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<composite>]
+ &\iss & <object>
+ & first object is required
+\cr
+ &\orr & <composite> |*| <object>
+ & add <object> to ??!^[composite object box]
+%
+\end{syntax}
+\caption{\protect<object>s.}
+??=[f.object]
+\end{figure*}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ We first discuss the parser and then summarise the required methods.
+ The entry point to use of objects is ??c![\object] described in note
+ ??[finished object box]. This should always be used because it
+ initialises the token list and redefines |\xy@| to be |\addtotoks@|
+ such that we can use <pos> parser routines within the <object>!
+
+\paragraph*{Parsing:}
+
+ The <object> parser |\OBJECT@| will first parse the <modifier>s,
+ storing the action of each in sequence on the |\toks@| token list.
+ When there are no more modifiers we insert ??c![\objectbox] if we have
+ reached the |{| otherwise we just assume that the rest of the
+ <object> is some kind of box construction.
+
+ "Note": The <modifier> actions doing shifts are implemented by having
+ an independent vector for the shift: $|<|R_p|,|U_p|>|$ always
+ contains the vector from the current to the original \TeX\ reference
+ point; furthermore the initial $L_c$ is saved as $L_p$ such that we
+ can retrieve the original (\Xy-pic) reference point again. Modifying
+ the $p$ values is safe because all actual changes are done in a local
+ scope after the entire <object> is parsed and we have built the
+ object box (in |\OBJECT@@|).
+
+ The <modifier>s changing the direction are executed while parsing to
+ make sure that the direction used when building the <object> is
+ right, and restored in the right sequence while evaluating the
+ <modifier>s afterwards.
+
+\DOCMODE(
+\xydef@\OBJECT@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\OBJECT@}%gobble spaces
+ \else\ifcat A\noexpand\next \let\next@=\OBJECT@letter
+ \else \let\next@=\OBJECT@other \fi\fi \next@}
+
+\xydef@\OBJECT@letter{%
+ \ifx i\next \DN@ i{\addtotoks@\Invisible@true \xyFN@\OBJECT@}%
+ \else\ifx h\next\DN@ h{\addtotoks@\Hidden@true \xyFN@\OBJECT@}%
+ \else\ifx o\next\DN@ o{\xywarning@{Obsolete o modifier used}\OBJECT@shape{o}}%
+ \else\ifx x\next\DN@ x{\xywarning@{Obsolete x modifier used}\OBJECT@shape{}}%
+ \else\ifx @\next\DN@ @##1##{%
+%
+\xywarning@{Impossible @ (letter) should not be here!!}
+%
+ \OBJECT@@{\dir##1}}%
+ \else \let\next@=\OBJECT@direction
+ \fi\fi\fi\fi\fi \next@}
+
+\xydef@\OBJECT@other{%
+ \ifx !\next \DN@!{\OBJECT@shift}%
+ \else\addPLUS@\ifx \next \DN@{\OBJECT@change}%
+ \else\addDASH@\ifx \next \DN@{\OBJECT@change}%
+ \else\addEQ@\ifx \next \DN@{\OBJECT@set}%
+ \else\ifx [\next %]
+ \DN@[##1]{\xy@{[##1]}{\OBJECT@shape{##1}}}%
+ \else\ifx ^\next \let\next@=\OBJECT@direction
+ \else\ifx _\next \let\next@=\OBJECT@direction
+ \else\ifx :\next \let\next@=\OBJECT@direction
+ \else\ifx ?\next
+ \DN@ ?{\xywarning@{\string? modifier used}\xyFN@\OBJECT@direction}%
+ \else\ifx (\next %)
+ \let\next@=\OBJECT@direction
+ \else\addAT@\ifx\next \addAT@\DN@##1##{\OBJECT@@{\dir##1}}%
+ \else \DN@##1##{\OBJECT@@{##1}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\DOCMODE)
+
+ |\OBJECT@@| is where we actually build the box by first
+ ??_[OBJ0]~saving the previous edge in case it is needed, then
+ ??_[OBJ1]~setting the defaults (including temporarily resetting
+ |\xy@| to execute in case any |\xy@|s are used internally),
+ ??_[OBJ2]~building the object box (which might change them) using
+ ??c![\objectbox] if no other command specified and setting the
+ $D,U,L,R$ dimensions ad required using the |\Leftness@| and
+ |\Upness@| methods, and finally ??_[OBJ3]~setting up the $R_p,U_p$
+ dimensions (as discussed above) and applying the <modifier>s stored
+ in |\toks@| and dumping the modified box.
+
+\DOCMODE(
+\xydef@\prevEdge@@{\zeroEdge}
+
+\xydef@\OBJECT@@#1#2{%
+ \expandafter\def\expandafter\prevEdge@@\expandafter{\the\Edge@c}%?*[OBJ0]
+ \expandafter\Edge@c\expandafter{\objectEdge}%?*[OBJ1]
+ \Invisible@false\Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \gdef\preXY@style@{}\gdef\postXY@style@{}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}%
+ \DN@{#1}\ifx\next@\empty \DNii@{#2}%?*[OBJ2]
+ \ifx\nextii@\empty \DN@{\hbox\bgroup\no@}\else \let\next@=\objectbox \fi\fi
+ \setbox\z@=\next@{#2}\L@c=\Leftness@\wdz@ \R@c=\wdz@ \advance\R@c-\L@c
+ \D@c=\dp\z@ \advance\D@c\ht\z@ \U@c=\Upness@\D@c \advance\D@c-\U@c
+ \R@p=\z@ \L@p=\L@c \U@p=\U@c \advance\U@p-\ht\z@ \D@p=-\U@p %?*[OBJ3]
+ \the\toks@\toks@={}\setboxz@h{\kern\R@p \raise\U@p\boxz@}%
+ \checkZeroEdge@
+ \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c \boxz@
+ \OBJECT@x}
+
+\xydef@\adjustLR@{%
+ \ifdim\zz@\wdz@ \L@c=\z@ \R@c=\z@ \dimen@=\Leftness@\p@
+ \ifdim\dimen@<\z@ \L@c=\dimen@ \R@c=-\L@c
+ \else\ifdim\dimen@>\p@ \L@c=\dimen@ \advance\L@c-\p@ \R@c=-\L@c \fi\fi
+ \else \L@c=\Leftness@\wdz@ \R@c=\wdz@ \advance\R@c-\L@c \fi}
+
+\xydef@\adjustUD@{\dimen@=\ht\z@ \advance\dimen@\dp\z@
+ \ifdim\zz@\dimen@ \U@c=\z@ \D@c=\z@ \dimen@=\Upness@\p@
+ \ifdim\dimen@<\z@ \U@c=\dimen@ \D@c=-\L@c
+ \else\ifdim\dimen@>\p@ \U@c=\dimen@ \advance\U@c-\p@ \D@c=-\L@c \fi\fi
+ \else \D@c=\dimen@ \U@c=\Upness@\dimen@ \advance\D@c-\U@c \fi}
+
+\def\checkZeroEdge@{%
+ \DN@{}%
+ \ifdim\zz@\L@c \ifdim\zz@\R@c \ifdim\zz@\U@c \ifdim\zz@\D@c
+ \DN@{\Edge@c={\zeroEdge}}\fi\fi\fi\fi
+ \next@}
+\DOCMODE)
+
+ As an optimisation |\OBJECT@@| sets the edge type of all zero-sized
+ objects to ??c![\zeroEdge].
+
+ |\OBJECT@x| cleans up the object by ensuring that it defines all the
+ required methods: Essentially it terminates the box with the sequence
+ ``|}| |\def\Drop@@{|\dots|}| |\def\Connect@@{|\dots|}| |\D@c=|\dots\
+ |\U@c=|\dots\ |\L@c=|\dots\ |\R@c=|\dots\ | \Invisible@|\dots
+ |\Hidden@|\dots\ |\def\Leftness@{|\dots|}| |\def\Upness@{|\dots|}|''
+ where each \dots\ is set to the method defined within the object
+ creation environment (started with |\hbox{| in |\OBJECT@@| or
+ possibly elsewhere). We use rather heavy expansion hacking with
+ |\toks@| to create the sequence so please look the other
+ way\dots\smiley
+
+\DOCMODE(
+\xydef@\OBJECT@x{\toks@={\egroup\def\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
+ \edef\tmp@{\D@c=\the\D@c \U@c=\the\U@c \L@c=\the\L@c \R@c=\the\R@c
+ \Edge@c={\expandafter\noexpand\the\Edge@c}%
+ \ifInvisible@\noexpand\Invisible@true\else\noexpand\Invisible@false\fi
+ \ifHidden@\noexpand\Hidden@true\else\noexpand\Hidden@false\fi
+ \def\noexpand\Leftness@{\Leftness@}\def\noexpand\Upness@{\Upness@}}%
+ \expandafter\addtotoks@\expandafter{\tmp@}\the\toks@}
+\DOCMODE)
+
+\paragraph*{Methods:}
+??w[object methods]
+
+ In addition to the ``current object properties'' for $c$
+ (\cf~??[basics.state]) the following methods are set up by all
+ objects:
+
+\begin{defs}
+ |\Invisible@true| or |\Invisible@false| & whether object is ??!^[invisible]\cr
+ |\Hidden@true| or |\Hidden@false| & whether object is ??!^[hidden]\cr
+ |\def\Leftness@{|<factor>|}| & the desired $L/(L+R)$\cr
+ |\def\Upness@{|<factor>|}| & the desired $U/(D+U)$\cr
+ |\def\Drop@@{|\dots|}| & code that outputs the object, assuming |\boxz@| is
+ of zero size and has the object displaced $|<|X|,|Y|>|$
+ inside---usually just |\def|'d to |\styledboxz@|\cr
+ |\def\Connect@@{|\dots|}| & code that builds a connection from $p$ to $c$,
+ assuming |\last|\-|object|\-|box@| contains the object\cr
+\end{defs}
+
+ It is important to |\def| and not |\let| the last four methods since
+ the \TeX\-nique used in |\OBJECT@x| (and elsewhere) of passing them
+ to surrounding scopes depends on it. The |\Connect@@| method should
+ in turn setup several submethods as described in detail in
+ ??[algo.connection].
+
+ Suitable defaults are set up by |\OBJECT@@| above which is why any
+ box generating command can be used to construct objects as explained
+ in note ??[build default] below.
+
+ Here are the declarations:
+
+\DOCMODE(
+\xynew@{if}\ifInvisible@
+\xynew@{if}\ifHidden@
+
+\xydef@\Leftness@{}
+\xydef@\Upness@{}
+
+\xydef@\Drop@@{\styledboxz@}
+\xydef@\Connect@@{}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+%
+\note??=[build default]
+%
+ An <object> is built using |\object|\-|box|??c[\objectbox]
+ |{|<text>|}|. |\object|\-|box| is initially defined as
+%
+\begin{code}
+\def\objectbox#1{%
+ \hbox{$\objectstyle{#1}$}}
+\let\objectstyle=\displaystyle
+\end{code}
+\displaycode
+%
+ but may be redefined by options or the user. The <text> should thus
+ be in the mode required by the ??c![\objectbox] command---with the
+ default |\objectbox| shown above it should be in math mode.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Actually it is
+
+\DOCMODE(
+\xydef@\objectbox#1{\hbox{$\m@th\objectstyle{#1}$}}
+
+\xylet@\objectstyle=\textstyle
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[build box]
+%
+ An <object> built from a \TeX\ box with dimensions $w*(h+d)$ will
+ have $L_c=R_c=w/2$, $U_c=D_c=(h+d)/2$, thus initially be equipped
+ with the adjustment |!C| (see note~??[shifted]). In particular: in
+ order to get the reference point on the (center of) the base line of
+ the original <\TeX~box> then you should use the <modifier> |!|; to
+ get the reference point identical to the \TeX\ reference point use
+ the modifier |!!L|.
+
+ \TeX\-nical remark: Any macro that expands to something that starts
+ with a <box> may be used as a <\TeX~box> here.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ This is done by the parsing above.
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[finished object box]
+%
+ Takes an object and constructs it, building a box; it is then
+ processed according to the preceeding modifiers. This form makes it
+ possible to use any <object> as a \TeX\ box (even outside of
+ \Xy-pictures) because a finished object is always also a box.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This macro is the main entry point to the <object> parser. It
+ furthermore initialises the modifier list and the previous object
+ edge.
+
+\DOCMODE(
+%\xydef@\object{\hbox\bgroup\object@}
+\xydef@\object{\hbox\bgroup\resetStyle@\object@}
+
+\xydef@\object@{%
+ \edef\next@{={\DirectionfromtheDirection@}}\expandafter\toks@\next@
+% \resetStyle@\plainxy@ \xyFN@\OBJECT@}
+ \plainxy@ \xyFN@\OBJECT@}
+\DOCMODE)
+
+ The initial value of |\toks@| <modifier> list is explained in
+ note~??[direction] below.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[composite object box]
+%
+ Several <object>s can be combined into a single object using the
+ special command ??c![\composite] with a list of the desired objects
+ separated with |*|s as the argument. The resulting box (and object)
+ is the least rectangle enclosing all the included objects.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ First we collect all the objects smash on top of each other in box0
+ while we maintain the maximal extents in $(DULR)_p$. Then we reset
+ box0 to contain the same but with the right spacing around.
+
+\DOCMODE(
+\xydef@\composite#1#{\hbox\bgroup\composite@{#1}}
+
+\xydef@\composite@#1#2{%
+ \DN@{#1}\ifx\next@\empty\else\xywarning@{no variants of
+ \string\composite\space allowed}\fi
+ \global\setbox9=\hbox\bgroup
+ \D@p=-\maxdimen \U@p=-\maxdimen \L@p=-\maxdimen \R@p=-\maxdimen
+ \xyFN@\composite@i#2@}
+
+\xydef@\composite@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@i}%gobble spaces
+ \else\ifx *\next \DN@ *{\xyFN@\composite@i}%
+ \else\ifx @\next \DN@ @{\composite@x}%
+ \xyerror@{<composite> object expected}{}\czeroEdge@
+ \else \DN@{\composite@ii}\fi\fi\fi \next@}
+
+\xydef@\composite@ii#1#{\composite@iii{#1}}
+
+\xydef@\composite@iii#1#2{%
+ \setbox\z@=\object#1{#2}%
+ \ifInvisible@ \setboxz@h{}\else
+ \setboxz@h{\kern-\L@c \boxz@}\ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi
+ \ifHidden@\else
+ \ifdim\U@p<\U@c \U@p=\U@c \fi \ifdim\D@p<\D@c \D@p=\D@c \fi
+ \ifdim\R@p<\R@c \R@p=\R@c \fi \ifdim\L@p<\L@c \L@p=\L@c \fi
+ \fi
+ \xyFN@\composite@iv}
+
+\xydef@\composite@iv{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@iv}%gobble spaces
+ \else \ifx @\next \DN@ @{\composite@x}%
+ \else \let\next@=\composite@i \fi\fi \next@}
+
+\xydef@\composite@x{%
+ \edef\tmp@{\egroup
+ \D@c=\the\D@p \U@c=\the\U@p \L@c=\the\L@p \R@c=\the\R@p}\tmp@
+ \setboxz@h{\kern\L@c\box9}\ht\z@=\U@c \dp\z@=\D@c
+ \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@
+ \Edge@c={\rectangleEdge}\computeLeftUpness@ \boxz@
+ \OBJECT@x}
+
+\xydef@\computeLeftUpness@{%
+ \dimen@=\L@c \advance\dimen@\R@c
+ \ifdim\zz@\dimen@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
+ \ifdim\zz@\L@c\else
+ \DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edge@c}%
+ \ifx\next@\nextii@\Edge@c={\rectangleEdge}\fi\fi
+ \else \quotient@\Leftness@\L@c\dimen@ \fi
+ \dimen@=\U@c \advance\dimen@\D@c
+ \ifdim\zz@\dimen@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
+ \ifdim\zz@\U@c\else
+ \DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edge@c}%
+ \ifx\next@\nextii@\Edge@c={\rectangleEdge}\fi\fi
+ \else \quotient@\Upness@\U@c\dimen@ \fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note ??=[entire \Xy-picture as object]
+%
+ Take an entire \Xy-picture and wrap it up as a box as described
+ in~\S??[basics.pos]. Makes nesting of \Xy-pictures possible: the
+ inner picture will have its own zero point which will be its
+ reference point "in" the outer picture when it is placed there.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This is simple exploiting the fact that |\endxy| actually sets up the
+ extents of the `object':
+
+\DOCMODE(
+\xydef@\xybox#1{\xy#1\endxy \Edge@c={\rectangleEdge}\computeLeftUpness@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[shifted]
+%
+ An object is "shifted" a <vector> by moving the point inside it which
+ will be used as the reference point. This effectively pushes the
+ object the same amount in the opposite direction.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Shifting uses the special value of $R_p$ and $U_p$ used while
+ evalutaing the <modifier>s. The fact that shifts like |!C| refer to
+ the initial object's size means that we should parse the <vector>
+ such that its actions happen at modification time\dots hence
+ |\xytotoks@| is used to delay execution.
+
+\DOCMODE(
+\xydef@\OBJECT@shift{%
+ \let\xy@=\xytotoks@ \afterVECTORorEMPTY
+ {\OBJECT@shift@}%
+ {\addtotoks@{\X@c=-\L@c \advance\X@c\R@p \advance\X@c\L@p \Y@c=\U@p}%
+ \OBJECT@shift@}}
+
+\xydef@\OBJECT@shift@{%
+ \addtotoks@{\advance\U@p-\Y@c
+ \advance\L@c\X@c \advance\R@c-\X@c \advance\D@c\Y@c \advance\U@c-\Y@c
+ \computeLeftUpness@}%
+ \let\xy@=\oxy@ \xyFN@\OBJECT@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{exercise}
+ What is the difference between the <pos>itions |0*{a}!DR| and
+ |0*!DR{a}|?
+\answertext{The first typesets ``$a$'' centered around |0| and then moves $c$
+ to the lower right corner, the second typesets ``$a$'' above the |0|
+ point and does not change $c$. With a ``$+$'' at |0| they look like
+ this: $\vcenter{\xy*{+}*{a}!DR\endxy}$ and
+ $\vcenter{\xy*{+}*!DR{a}\endxy}$.}%
+\end{exercise}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[<object> size]??=[change size]??=[<size>]??=[default size]
+%
+ A <size> is a pair $|<|W|,|H|>|$ of the width and height of a
+ rectangle. When given as a <vector> these are just the vector
+ coordinates, \ie, the <vector> starts in the lower left corner and
+ ends in the upper right corner. The possible <add op>erations that
+ can be performed are described in the following table.
+$$
+\begin{array}{\otherbar c\otherbar l\otherbar}
+\hline
+ \hbox{<add op>} & \hbox{description} \\
+\hline
+ |+| & \hbox{grow} \\
+ |-| & \hbox{shrink} \\
+ |=| & \hbox{set to} \\
+ |+=| & \hbox{grow to at least} \\
+ |-=| & \hbox{shrink to at most} \\
+\hline
+\end{array}
+$$
+ In each case the <vector> may be omitted which invokes the ``default
+ size'' for the particular <add op>:
+$$
+\begin{array}{\otherbar c\otherbar l\otherbar}
+\hline
+ \hbox{<add op>} & \hbox{default}\\
+\hline
+ |+| & |+<|2*"objectmargin"|>| \\
+ |-| & |-<|2*"objectmargin"|>| \\
+ |=| & |=<|"objectwidth"|,|"objectheight"|>| \\
+ |+=| & |+=<|\max(L_c+R_c,D_c+U_c)|>| \\
+ |-=| & |-=<|\min(L_c+R_c,D_c+U_c)|>| \\
+\hline
+\end{array}
+$$
+ The defaults for the first three are set with the commands
+%
+\begin{defs1}
+ ??c![\objectmargin] <add op> |{|<dimen>|}| \cr
+ ??c![\objectwidth] <add op> |{|<dimen>|}| \cr
+ ??c![\objectheight] <add op> |{|<dimen>|}| \cr
+\end{defs1}
+\noindent\unskip
+%
+ where <add op> is interpreted in the same way as above.
+
+\DOCMODE(
+\xylet@\objectmargin@=\jot
+\xylet@\objectwidth@=\z@
+\xylet@\objectheight@=\z@
+
+\xydef@\objectmargin{\afterADDOP{\Addop@@\objectmargin@}}
+\xydef@\objectwidth{\afterADDOP{\Addop@@\objectwidth@}}
+\xydef@\objectheight{\afterADDOP{\Addop@@\objectheight@}}
+\DOCMODE)
+
+ The defaults for |+=|/|-=| are such that the resulting object will be
+ the smallest containing/largest contained square.
+
+\begin{exercise}
+ How are the objects typeset by the <pos>itions ``|*+UR{\sum}|'' and
+ ``|*+DL{\sum}|'' enlarged?
+\answertext{They have the outlines
+ $$\xy*+UR{\sum}*\frm{-}*{+}\endxy
+ \quad\textrm{and}\quad
+ \xy*+DL{\sum}*\frm{-}*{+}\endxy$$
+ because the first is enlarged by the positive offset to the upper
+ right corner and the second by the negative offset to the lower left
+ corner.}
+\end{exercise}
+
+ \BUG: Currently changing the size of a circular object is buggy---it
+ is changed as if it is a rectangle and then the change to the $R$
+ parameter affects the circle. This should be fixed probably by a
+ generalisation of the |o| shape to be ovals or ellipses with
+ horizontal/vertical axes.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The three cases distinguished by the parsing above are handled
+ similarly: they insert the parsed/default vector into $X,Y$ in the
+ modifications and then perform the operation at that time using the
+ |\xytotoks@| trick described in note~??[shifted]:
+
+\DOCMODE(
+\xydef@\OBJECT@change{%
+ \afterADDOP{%
+ \addEQ@\ifx \next
+ \addtotoks@{\X@c=\D@c \advance\X@c\U@c \Y@c=\L@c \advance\Y@c\R@c}%
+ \else
+ \addtotoks@{\X@c=\objectmargin@ \advance\X@c\X@c \Y@c=\X@c}%
+ \fi
+ \let\xy@=\xytotoks@
+ \afterVECTORorEMPTY\OBJECT@change@\OBJECT@change@}}
+
+\xydef@\OBJECT@set{%
+ \afterADDOP{%
+ \let\xy@=\xytotoks@ \afterVECTORorEMPTY\OBJECT@change@
+ {\addtotoks@{\X@c=\objectwidth@ \Y@c=\objectheight@}\OBJECT@change@}}}
+\DOCMODE)
+
+ The real work is done by the following command: a hack using
+ expansion tricks to make use of the |\Addop@@| known now on the
+ values in $X,Y$ at modification time.
+
+\DOCMODE(
+\xydef@\OBJECT@change@{%
+ \addtotoks@{\advance\R@c\L@c \advance\R@p-\L@c \let\tmp@=\R@c}%
+ \expandafter\addtotoks@\expandafter{\Addop@@\tmp@\X@c\R@c=\tmp@
+ \L@c=\Leftness@\R@c \advance\R@p\L@c \advance\R@c-\L@c}%
+ \addtotoks@{\advance\D@c\U@c \let\tmp@=\D@c}%
+ \expandafter\addtotoks@\expandafter{\Addop@@\tmp@\Y@c\D@c=\tmp@
+ \U@c=\Upness@\D@c \advance\D@c-\U@c}%
+ \let\xy@=\oxy@ \xyFN@\OBJECT@}
+\DOCMODE)
+
+ It is clearly crucial that |\Addop@@| expands to its action
+ immediately! Also note that enlarging changes the initial box offset
+ in the horizontal direction only, \ie, $R_p$.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Finally the code to interpret an <add op> used above: This
+ simply parses it and creates a macro |\Addop@@| that takes a
+ control sequence and a parameter <dimen> as arguments, and
+ expands directly to commands that perform the <add op> of the
+ <dimen> on the control sequence:
+$$
+\begin{array}{\otherbar c\otherbar l\otherbar}
+\hline
+ \hbox{<add op>} & \hbox{effect of |\Addop@@| "cs" $D$} \\
+\hline
+ |+| & "cs" \from "cs"+D \\
+ |-| & "cs" \from "cs"-D \\
+ |=| & "cs" \from D \\
+ |+=| & "cs" \from \left\{
+ \begin{array}{cc} D & \hbox{if $D\le"cs"$} \\
+ "cs" & \hbox{if $D\gt"cs"$} \end{array}\right.
+ \\[1pt]
+ |-=| & "cs" \from \left\{
+ \begin{array}{cc} D & \hbox{if $D\ge"cs"$} \\
+ "cs" & \hbox{if $D\lt"cs"$} \end{array}\right.
+ \\[1pt]
+\hline
+\end{array}
+$$
+ Furthermore ??c![\afterADDOP] leaves the |\next| token set to |=| in
+ the last three cases only (this is used to determine the right
+ default value in the size changes above).
+
+ The ??c![\afterADDOP] macro is relatively simple because <add op>s
+ don't nest:
+
+\DOCMODE(
+\xydef@\afterADDOP#1{\def\afterADDOP@{#1}\xyFN@\ADDOP@}
+
+\xylet@\afterADDOP@=\empty
+
+\xydef@\ADDOP@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ADDOP@}%gobble spaces
+ \else\addPLUS@\ifx \next \addPLUS@\DN@{\xyFN@\ADDOP@plus}%
+ \else\addDASH@\ifx \next \addDASH@\DN@{\xyFN@\ADDOP@minus}%
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
+ \else
+ \DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
+ \fi\fi\fi\fi \next@}
+
+\xydef@\ADDOP@plus{%
+ \addEQ@\ifx \next
+ \addEQ@\DN@{\def\Addop@@{\Addop@0+<}\afterADDOP@}%
+ \else
+ \DN@{\def\Addop@@{\Addop@1+=}\afterADDOP@}%
+ \fi \next@}
+
+\xydef@\ADDOP@minus{%
+ \addEQ@\ifx \next
+ \addEQ@\DN@{\def\Addop@@{\Addop@0+>}\afterADDOP@}%
+ \else
+ \DN@{\def\Addop@@{\Addop@1-=}\afterADDOP@}%
+ \fi \next@}
+\DOCMODE)
+
+ The work is done by the general |\Addop@| |{|$f$|}| |{|$\pm$|}|
+ |{|$\bowtie$|}| |{|"cs"|}| $D$ that defines
+$$
+"cs" \equiv \left\{
+ \begin{array}{ll}
+ f*"cs"~{\pm}~D & \hbox{if $\lnot ((f*"cs"~{\pm}~D)~{\bowtie}~D)$} \\
+ "cs" & \hbox{otherwise} \end{array}\right.
+$$
+ and also leaves the dimension in |\dimen@|.
+
+\DOCMODE(
+\xydef@\Addop@#1#2#3#4#5{%
+ \dimen@=#4\relax \edef#4{\the\dimen@}%
+ \dimen@=#1\dimen@ \advance\dimen@#2#5\relax %\advance\dimen@ 1sp %HACK
+ \ifdim\dimen@#3#4\else \edef#4{\the\dimen@}\fi
+ \ifx\xy@\xyinitial@\else \DN@##1{\xy@@{\edef#4{##1}\checkZeroEdge@}}%
+ \expandafter\next@\expandafter{#4}\fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[hidden]
+%
+ A "hidden" object will be typeset but hidden from \Xy-pic in that it
+ won't affect the size of the entire picture as discussed
+ in~\S??[basics.pos].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ This is handled by the |\ifHidden@| conditional allocated with the
+ methods.
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[invisible]
+%
+ An "invisible" object will be treated completely normal except that
+ it won't be typeset, \ie, \Xy-pic will behave as if it was.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ This is handled by the |\ifInvisible@| conditional allocated with the
+ methods.
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[<shape>]
+%
+ Setting the "shape" of an object forces the shape of its edge to be
+ as indicated. The kernel provides three shapes that change the edge,
+ namely ??C![.], ??C![], and ??C![o], corresponding to the outlines
+$$
+\let\objectstyle=\scriptstyle
+\xy*{*}\endxy
+\quad
+\textrm{,}
+\quad
+\xy(0,0).(-10,-4).(15,7)*\frm{-}="box"*{*}+0;
+ "box"+L*{}**@{.}?*{L},
+ "box"+R*{}**@{.}?*{R},
+ "box"+D*{}**@{.}?*{D},
+ "box"+U*{}**@{.}?*{U}
+\endxy
+\quad
+\textrm{, and}
+\quad
+\xy*[o]=<40pt>{*}="box"*\cir{}+0;
+ "box"+L*{}**@{.}?*{L},
+ "box"+R*{}**@{.}?*{R},
+ "box"+D*{}**@{.}?*{D},
+ "box"+U*{}**@{.}?*{U}
+\endxy
+$$
+ where the $*$ denotes the point of the reference position in the
+ object (the first is a point). Extensions can provide more shapes,
+ however, all shapes set the extent dimensions $L$, $R$, $D$,
+ and $U$.
+
+ The default shape for objects is ??C![] and for plain coordinates it
+ is ??C![.].
+
+\DOCMODE(
+\xydef@\objectEdge{\rectangleEdge}
+\DOCMODE)
+
+ Furthermore the <shape>s ??C![r], ??C![l], ??C![u], and ??C![d], are
+ defined for convenience to adjust the object to the indicated side by
+ setting the reference point such that the reference point is the same
+ distance from the opposite of the indicated edge and the two
+ neighbour edges but never closer to the indicated side than the
+ opposite edge, \eg, the object |[r]\hbox{Wide text}| has reference
+ point at the $*$ in $\xy*[r]\hbox{Wide text}*\frm{-}*{*}\endxy$ but
+ the object |[d]\hbox{Wide text}| has reference
+ point at the $*$ in $\xy*[d]\hbox{Wide text}*\frm{-}*{*}\endxy$.
+ Finally, ??C![c] puts the reference point at the center.
+
+\DOCMODE(
+\xydefcsname@{shape [r]}{\advance\U@p\D@c \centerobject@
+ \ifdim\L@c>\D@c
+ \advance\R@c\L@c \L@c=.5\U@c \advance\L@c.5\D@c \advance\R@c-\L@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [l]}{\advance\U@p\D@c \centerobject@
+ \ifdim\L@c>\D@c
+ \advance\L@c\R@c \R@c=.5\U@c \advance\R@c.5\D@c \advance\L@c-\R@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [u]}{\advance\U@p\D@c \centerobject@
+ \ifdim\D@c>\L@c
+ \advance\U@c\D@c \D@c=.5\L@c \advance\D@c.5\R@c \advance\U@c-\D@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [d]}{\advance\U@p\D@c \centerobject@
+ \ifdim\D@c>\L@c
+ \advance\D@c\U@c \U@c=.5\L@c \advance\U@c.5\R@c \advance\D@c-\U@c \fi
+ \advance\U@p-\D@c}
+\xydefcsname@{shape [c]}{\advance\U@p\D@c \centerobject@ \advance\U@p-\D@c}
+
+\xydef@\centerobject@{%
+ \advance\D@c\U@c \D@c=.5\D@c \U@c=\D@c \advance\L@c\R@c \L@c=.5\L@c \R@c=\L@c}
+\DOCMODE)
+
+ \NOTE: Extensions can add new <shape> object <modifier>s which are
+ then called <style>s. These will always be either of the form
+ |[|<keyword>|]| or |[|<character> <argument>|]|. Some of these
+ <style>s do other things than set the edge of the object.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ A ``simple shape'' is just a control sequence |\shape [|<shape>|]|
+ setting the appropriate edge. When such a |[|<shape>|]| modifier is
+ encountered then we expand this control sequence onto the modifier
+ queue, unless a control sequence |\style [|<shape>|]| exists: then
+ that is expected to do it (and whatever else is required).
+
+\DOCMODE(
+\xydef@\OBJECT@shape#1{\DN@{shape [#1]}%
+ \expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
+ \ifx\nextii@\relax\DN@{style [#1]}%
+ \expandafter\let\expandafter\nextii@\csname\codeof\next@\endcsname
+ \ifx\nextii@\relax \DN@{\OBJECT@shapei[#1]}%
+ \else\DN@{\nextii@\xyFN@\OBJECT@}\fi
+ \else \expandafter\addtotoks@\expandafter{\nextii@}%
+ \DN@{\xyFN@\OBJECT@}%
+ \fi \next@}
+
+\xydefcsname@{shape []}{\the\Edge@c5\relax}%
+\xydefcsname@{shape [Outer]}{\the\Edge@c5\relax}%
+\xydefcsname@{shape [Inner]}{\the\Edge@c4\relax}%
+\xydefcsname@{shape [o]}{\Edge@c={\circleEdge}\the\Edge@c5\relax
+ \Edge@c={\circleEdge}\def\prevEdge@@{\circleEdge}}
+\xydefcsname@{shape [.]}{\czeroEdge@}
+\DOCMODE)
+
+ Add more simple shapes by defining more commands like these and
+ proceed with coding the |\|\dots|Edge| command as described
+ in~\S??[algo.edge].
+
+ Alternatively it is a ``complex shape'' of which none are defined in
+ the kernel but some options like more variation\dots It is
+ characterised by its first token and the rest of the contents of the
+ ??C![]s is the argument (remember: no |{}[]| characters!); it is
+ searched for as control sequence |\[|<shape>|...]| overridden
+ in the same way by |\*stylechar@|<shape>|@|.
+
+\DOCMODE(
+\def\OBJECT@shapei[#1#2]{\DN@{shape [#1...]}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax\DN@{*stylechar@#1@}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax\DNii@{shape [#1#2]}%
+ \xywarning@{illegal [<shape>] ignored: \codeof\nextii@\space not defined}%
+ \DN@{\xyFN@\OBJECT@}%
+ \else% Delete this: \expandafter\addtotoks@\expandafter{\next{#2}}%
+ \DN@{\next{#2}\xyFN@\OBJECT@}%
+ \fi
+ \else
+
+\expandafter\addtotoks@\expandafter{\next{#2}}\DN@{\next{#2}\xyFN@\OBJECT@}%
+ \fi \next@}
+\DOCMODE)
+
+ \BUG: The above is messy!
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[define <shape>]
+%
+ While typesetting an object, some of the properties are considered
+ part of the `??w![current object style]??w[style]'. Initially this
+ means nothing but some of the <style>s defined by extensions have
+ this status, \eg, colours |[red]|, |[blue]| say, using the |xycolor|
+ extension, or varying the width of lines using |xyline|. Such styles
+ are processed "left-to-right"; for example,
+$$
+|*[red][green][=NEW][blue]{A}|
+$$
+ will typeset a blue |A| and define |[NEW]| to set the colour to green
+ (all provided that |xycolor| has been loaded, of course).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The method of requesting a special effect is via the <shape>
+ modifiers. However the code required for implementation is quite
+ different. In particular it must allow for the different ways in
+ which the <driver> may implement the |\special|s required to
+ activate, and turn off, the effect. Another difficulty is that the
+ <style> applies also to nested sub-parts of any <object>. This means
+ that the code cannot be wholly delayed until after the <object> has
+ been constructed.
+
+ Usually some value has to be stored, so as to be accessible to
+ sub-parts, though the |\special| commands cannot be fully constructed
+ until the <object> is completely known and ready to be |\Drop@@| or
+ |\Connect@@|'ed.
+
+ Finally, the overhead in using |\special| commands can be quite high
+ with some |dvi|-drivers. Thus it is not best that every <style>
+ request generate a |\special| command; indeed {\it two} |\special|
+ commands, since each style-change also requires a command to revert
+ to the previous style, after the change is no longer applicable.
+
+ Thus, as with <shape>s, all the style-change requests are stored
+ until the <object> is ready to be |\Drop@@|'ed. This also helps with
+ getting the sequencing correct when later requests compound on, or
+ override, earlier requests.
+
+ When the <style> requests are processed, after the <object> has been
+ constructed, information of the form <control-word>|{|<data>|}| is
+ added to a global list called |\preXY@style@|. Similar information is
+ added to another global list |\postXY@style@|, for the purpose of
+ reverting the style parameters, within the <driver>-file, to their
+ previous values prior to the current <object>.
+
+ Both lists are initially <empty> at the start of an <object>. The
+ contents of these lists are processed when the macros
+ |\xypre@Style@@| and |\xypost@Style@@| are encountered in the
+ expansion of |\styledboxz@|.
+
+\DOCMODE(
+\xydef@\preXY@style@{}
+\xydef@\postXY@style@{}
+
+\xydef@\resetStyle@{\gdef\preXY@style@{}\gdef\postXY@style@{}}
+\DOCMODE)
+
+ The <data> contains the code needed to implement the requested
+ style-change, with the particular <driver> being used.
+
+ The <control-word> is a macro whose expansion could be fixed, or
+ could depend upon what other style-change requests are made for this
+ <object>. Its purpose is to decide whether or not the <data> is
+ actually required. If so, it is added to the token-list
+ |\styletoks@| for later use.
+
+ Whether the <control-word>|{|<data>|}| tokens are prepended or
+ appended to the global lists depends upon the nature of the
+ style-change requested. For example, with |*[red][green]|<object>
+ the information |\|<set-color>|{|<green>|}| could be appended to
+ |\preXY@style@|, with |\|<revert-to-color>|{|<red>|}| prepended to
+ |\postXY@style@|. Then the dvi-output would set the color to <red>
+ then <green> and restore it first to <red> then <black>.
+
+ \TODO: A more sophisticated implementation could instead prepend
+ |\|<set-color>|{|<green>|}| to |\preXY@style@| and append
+ |\|<revert-to-color>|{|<red>|}| to |\postXY@style@|. Now the first
+ |\|<set-color> encountered adds its <data> to |\styletoks@| then
+ rebinds |\|<set-color> to |\eat@|, to ignore subsequent occurrences.
+ Similarly |\|<revert-to-color> is rebound so that only the is
+ restoration to <black> is retained.
+
+ This latter strategy is preferred when the overhead for a |\special|
+ command is high, within the <driver>'s output. Indeed the \PS\
+ back-end is even more efficient. Since \PS\ is itself a programming
+ language, the <data> can be just the \PS\ code. A single |\special|
+ command is sufficient to accommodate {\it all\/} the style-changes
+ for an individual <object>. This is achieved by rebinding
+ |\xydoprestyles@@| and |\xydopoststyles@@| to include the <data>
+ within an appropriately prepared |\special| command.
+
+\DOCMODE(
+\xynew@{toks}{\styletoks@}
+\xydef@\addtostyletoks@#1{%
+ \expandafter\styletoks@\expandafter{\the\styletoks@#1}}
+\DOCMODE)
+
+ The <data> to be used is collected in the token-list |\styletoks@|.
+ If this is <empty> for an <object> then the style processing is
+ skipped completely. For safety, in case multiple occurences of
+ |\xypre@Style@| have somehow slipped into the token stream, these and
+ |\xypost@Style@@| are bound to |\relax| until the <object> is
+ finished. Indeed |\xypost@Style@@| is always bound to |\relax| unless
+ |\styletoks@| is non-empty.
+
+\DOCMODE(
+\xydef@\styledboxz@{%
+%
+%\W@{STYLED BOX:}%
+%\W@{: PRE={\meaning\xypre@Style@@}}%
+%
+ \xypre@Style@@
+%
+%{\expandafter\DN@\expandafter{\the\styletoks@}\W@{: STYLTOKS={\codeof\next@}}}%
+%
+ \boxz@
+%
+%\W@{: POST={\meaning\xypost@Style@@}}%
+%
+ \xypost@Style@@}
+
+\xydef@\xypre@Style@{\styletoks@={}\saveXyStyle@\preXY@style@
+ \expandafter\DN@\expandafter{\the\styletoks@}%
+ \ifx\next@\empty \DN@{\let\xypre@Style@@=\relax
+ \let\xypost@Style@@=\relax \xypre@skipStyle@}%
+ \else
+ \let\xypre@Style@@=\relax \let\xypost@Style@@=\xypost@Style@
+ \DN@{\expandafter\xydoprestyles@\expandafter{\the\styletoks@}}%
+ \fi \next@ }
+
+\xydef@\xypost@Style@{\styletoks@={}\postXY@style@
+ \expandafter\xydopoststyles@\expandafter{\the\styletoks@}%
+ \let\xypost@Style@@=\relax \let\xypre@Style@@=\xypre@Style@ }
+
+\xydef@\xypre@skipStyle@#1\xypost@Style@@{#1\relax
+ \let\xypre@Style@@=\xypre@Style@ }
+
+\xydef@\xydoprestyles@@{\literal@}
+\xydef@\xydopoststyles@@{\literal@}
+\xylet@\xydoprestyles@=\xydoprestyles@@
+\xylet@\xydopoststyles@=\xydopoststyles@@
+\DOCMODE)
+
+ Some extensions use the following macros to add style <data> to the
+ global macros. Here code is added sequentially to |\preXY@style@| so
+ that it is acted upon in the order of occurrence (FIFO) of the
+ <shape> modifiers. Code is added to |\postXY@style@| in reverse order
+ (LIFO), so that each addition to |\preXY@style@| can be closed off,
+ if necessary, in correctly nested sequence.
+
+\DOCMODE(
+\xydef@\modXYstyle@{%
+ \ifx\xy@style@\empty\resetStyle@\fi \checkXyStyle@
+ \expandafter\expandafter\expandafter\DN@
+ \expandafter\expandafter\expandafter{\preXYstyle@@}%
+ \ifx\next@\empty\else\DN@{\modXYstyle@@}\fi \next@ }
+
+\xydef@\modXYstyle@@{%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\preStyle@@}%
+ \DN@##1{\expandafter\gdef\expandafter\preXY@style@\expandafter{%
+ \preXY@style@ ##1}}\expandafter\next@\expandafter{\tmp@}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\postStyle@@}%
+ \DN@##1{\expandafter\gdef\expandafter\postXY@style@\expandafter{%
+ \tmp@ ##1}}\expandafter\next@\expandafter{\postXY@style@}}
+
+\xydef@\xy@style@{}
+\xydef@\checkXyStyle@{\ifx\xy@style@\empty\resetStyle@\fi
+ \let\xy@style@=\relax}
+\DOCMODE)
+
+ The |\preStyle@| and |\postStyle@| temporarily hold style <data>.
+ The macro |\preXYstyle@@| is used to check whether there is any
+ <data> to process. Normally this is just an alias for |\preStyle@@|,
+ but some back-ends may use the two control-names differently.
+
+\DOCMODE(
+\xydef@\preStyle@@{}
+\xydef@\postStyle@@{}
+\xydef@\preXYstyle@@{\relax}
+
+\xydef@\loadxystyle@{%
+ \let\xypre@Style@@=\xypre@Style@ \def\preXYstyle@@{\preStyle@@}}
+
+\loadxystyle@
+\DOCMODE)
+
+ Initially styles are activated but can be suppressed using
+ |\Unloadstyle@|.
+
+\DOCMODE(
+\xydef@\Unloadstyle@{%
+ \let\xypre@Style@@=\relax \let\xypost@Style@@=\relax
+ \def\preXYstyle@@{\relax}}
+\DOCMODE)
+
+ Global macros are used, so that the same styles can be reused by
+ successive objects without having to re-interpret <shape> modifiers,
+ as described next.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Saving styles:\ }
+
+ Once specified for an <object>, the collection of <style>s can be
+ assigned a name, using ??c![[=]<word>|]|. Then |[|<word>|]| becomes a
+ new <style>, suitable for use with the same or other <objects>s. Use
+ a single <word> built from ordinary letters. If |[|<word>|]| already
+ had meaning the new definition will still be imposed, but the
+ following type of warning will be issued:
+$$
+|Xy-pic Warning: Redefining style [|<word>|]|
+$$
+ The latter warning will appear if the definition occurs within an
+ ??c![\xymatrix]. This is perfectly normal, being a consequence of the
+ way that the matrix code is handled. Similarly the message may appear
+ several times if the style definition is made within an ??c![\ar].
+
+\begin{code}
+ \setbox0=\hbox{%
+ \xy\drop[OrangeRed][=A]{}\endxy}
+\end{code}
+
+\noindent
+ The following illustrates how to avoid these messages by defining the
+ style without typesetting anything.
+
+\displaycode
+
+ \NOTE{~1:} The current colour is regarded as part of the style for
+ this purpose.
+
+ \NOTE{~2:} Such namings are global in scope. They are intended to
+ allow a consistent style to be easily maintained between various
+ pictures and diagrams within the same document.
+
+\DOCMODE(
+\xydefcsname@{shape [=...]}#1{\checkXyStyle@ \addtotoks@{\xynamestyle@{#1}}}
+
+\xydef@\xynamestyle@#1{\checkXyStyle@
+ \expandafter\DNii@\expandafter{\csname shape [#1]\endcsname}%
+ \expandafter\ifx\nextii@\relax %%\xywarning@{Defining new style [#1]}%
+ \else\xywarning@{Redefining style [#1]}\fi
+ \expandafter\xynamestyle@@\csname shape [#1]\endcsname }
+
+\xydef@\xynamestyle@@#1{%
+ \expandafter\def\expandafter\tmp@\expandafter{\preXY@style@}%
+ \DN@##1{\def\tmp@{\checkXyStyle@\gdef\preXY@style@{##1}}}%
+ \expandafter\next@\expandafter{\preXY@style@}%
+ \DN@##1{\expandafter\gdef\expandafter#1\expandafter{\tmp@
+ \gdef\postXY@style@{##1}}}%
+ \expandafter\next@\expandafter{\postXY@style@}\DN@{}}
+\DOCMODE)
+
+ If the same <style> is intended for several <object>s occurring
+ in succession, the |[||*]| <modifier> can be used on the later
+ <object>s. This only works when |[||*]| precedes any other <style>
+ modifiers; it is local in scope, recovering the last <style>s used
+ at the same level of \TeX\ grouping.
+
+\DOCMODE(
+\xydef@\prevXypreStyle@@{}
+\xydef@\prevXypostStyle@@{}
+
+\xydef@\saveXyStyle@{\expandafter
+ \def\expandafter\prevXypreStyle@@\expandafter{\preXY@style@}%
+ \expandafter\def\expandafter\prevXypostStyle@@\expandafter{%
+ \postXY@style@}}
+
+\xydef@\recoverXyStyle@{\expandafter
+ \gdef\expandafter\preXY@style@\expandafter{\prevXypreStyle@@}%
+ \expandafter\gdef\expandafter\postXY@style@\expandafter{%
+ \prevXypostStyle@@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Defining new effects}
+
+ Allow new effects to be declared and a default action provided. The
+ name is constructed from |#1| and the action to be taken is passed as
+ |#2|. If |#3| is non-empty then overwrite any existing definition for
+ a control sequence of the same name.
+
+\DOCMODE(
+\xydef@\newxystyle#1#2#3{%
+ \DN@{#3}\ifx\next@\empty
+ \xydefcsname@{shape [#1]}{\csname xyshape@#1@\endcsname}%
+ \else \expandafter\def\csname shape [#1]\endcsname{%
+ \csname xyshape@#1@\endcsname}\fi
+ \DN@{#2}\ifx\next@\empty
+ \expandafter\def\csname xyshape@#1@\endcsname{%
+ \xyundefinedStyle@{#1}{}@@}%
+ \else \expandafter\def\csname xyshape@#1@\endcsname{#2}\fi}
+
+\xydef@\xyundefinedStyle@#1#2@@{%
+ \xywarning@{style #1 not defined, nothing to apply}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Support for a new <style> takes the following form, in which
+ |\thestyle@| expands to the current value of the <style> information
+ to be maintained. If this is kept in a <count> or <dimen> register,
+ named |\xystyle@| say, then replace |\thestyle@| by
+ |\the\style@|. (However due to the large number of <dimen>s already
+ allocated, it is preferable to keep a text form of the value in
+ |\thestyle@|.)
+
+\begin{code}
+\xyshape@stylechange@{\modifystyle@{<how>}}
+\xydef@\modifystyle@#1{\checkXyStyle@
+ \edef\prevstyle@{\thestyle@}\modifystyle@@{#1}%
+ \let\prestyle@=\prestyle@@ \let\poststyle@=\poststyle@@
+ \applystyle@\prestyle@{\thestyle@}\poststyle@{\prevstyle@}}
+\xydef@\resetstyle@@#1{\def\thestyle@{#1}\outputstyle@{#1}}
+\xydef@\outputstyle@#1{\transformstyle@{#1}%
+ \expandafter\stylespecial@\expandafter{\next@}}
+\xylet@\transformstyle@@=\DN@
+\xylet@\transformstyle@=\transformstyle@@
+\end{code}
+\displaycode
+
+ In the above the macros |\modifystyle@@| and |\stylespecial@| are
+ adapted to the particular <style> information, see below. Typically
+ <how> is actual \TeX\ code and |\modifystyle@@| is simply |\literal@|
+ to execute this code. Typesetting is done by |\stylespecial@#1|
+ which is typically of the form |\special{|<key> |#1}|.
+
+ The |\transformstyle@| is required in case a dvi-<driver> needs
+ information in a form that is different to how \Xy-pic maintains it
+ in |\thestyle@|. A <driver> file should define |\|<driver>|@style@@|
+ to perform the transformation and place its result in |\next@|.
+ Install this macro using |\let\transformstyle@=\|<driver>|@style@@|
+ within the <driver> installation macro.
+
+\medskip
+
+ Next we discuss |\applystyle@|; which uses |\prestyle@|,
+ |\prestyle@@|, |\poststyle@| and |\poststyle@@|. There are two
+ strategies here, affecting how much information is placed into the
+ dvi-file, indicated by the alternative expansions given above. The
+ appropriateness for a given style must be decided by the author of
+ the style-option.
+
+ Suppose several modifications are made to a particular style
+ parameter. We must build a list of commands |\prestyle@{|<value>|}|,
+ to be executed later, which will recover the required value. Also we
+ build a list of commands |\poststyle@{|<value>|}| to reset to the
+ previous value.
+
+ In most cases it is only the result of the modifications that need be
+ placed into the dvi-file. Since we do not know how many, if any, more
+ modifications follow we could store each new result {\em after} the
+ previous, so that its effect will override the previous value. This
+ is building a FIFO list for the |\prestyle@| commands, with a FILO
+ list for the |\poststyle@| commands:
+
+\DOCMODE(
+\xydef@\applyFIFOstyle@#1#2#3#4{\bgroup
+ \styletoks@={\egroup\gdef\preXY@style@}%
+ \expandafter\toks@\expandafter{\preXY@style@}%
+ \expandafter\addtotoks@\expandafter{\expandafter#1\expandafter{#2}}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}%
+ \gdef\postXY@style@}%
+ \expandafter\toks@\expandafter{\expandafter#3\expandafter{#4}}%
+ \expandafter\addtotoks@\expandafter{\postXY@style@}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}}%
+ \the\styletoks@ }
+\DOCMODE)
+%
+\noindent
+ Use this via:
+ |\applyLIFOstyle@\prestyle@{\thestyle@}\poststyle@{\prevstyle@}|.
+ \newline With this method each modification places two entries into
+ the dvi-file; there is no need for separate |\prestyle@| and
+ |\prestyle@@| macros.
+
+ Perhaps a more efficient strategy is to build a LIFO list for the
+ |\prestyle@| commands. This way the required value is encountered
+ first. This first instance should then cancel all subsequent
+ instances of |\prestyle@|. This is where the need comes for a
+ |\prestyle@@|. Accompanying this is a FIFO list for the
+ |\poststyle@| commands, with a corresponding |\poststyle@@| to kill
+ subsequent instances:
+
+\DOCMODE(
+\xydef@\applyLIFOstyle@#1#2#3#4{\bgroup
+ \styletoks@={\egroup\gdef\preXY@style@}%
+ \expandafter\toks@\expandafter{\expandafter#1\expandafter{#2}}%
+ \expandafter\addtotoks@\expandafter{\preXY@style@}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}%
+ \gdef\postXY@style@}%
+ \expandafter\toks@\expandafter{\postXY@style@}%
+ \expandafter\addtotoks@\expandafter{\expandafter#3\expandafter{#4}}%
+ \expandafter\addtostyletoks@\expandafter{\expandafter{\the\toks@}}%
+ \the\styletoks@ }
+\DOCMODE)
+
+\noindent
+ Use this via:
+ |\applyLIFOstyle@\prestyle@{\thestyle@}\poststyle@{\prevstyle@}|.
+ \newline The advantage here is that only two pieces of data need be
+ output to the dvi-file, no matter how many modifications are
+ requested.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[diagonal]??=[direction]??=[<direction>]
+%
+ Setting the current direction is simply pretending for the
+ typesetting of the object (and the following <modifier>s) that some
+ connection set it -- the <empty> case just inherits the previous
+ direction.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The code just calls the general <direction> parser below:
+
+\DOCMODE(
+\xydef@\OBJECT@direction{\afterDIRECTIONorEMPTY{%
+ \edef\next@{{\DirectionfromtheDirection@}}\expandafter\addtotoks@\next@
+ \xyFN@\OBJECT@}%
+ {\xyFN@\OBJECT@}}
+\DOCMODE)
+
+ Here is the <direction> parser: first the parts parsing the <diag>
+ part then the parts parsing the <trailer> part:
+
+\DOCMODE(
+\xydef@\afterDIRECTIONorEMPTY#1#2{%
+ \DN@##1{\def\afterDIRECTION@{\def\afterDIRECTION@{##1}%
+ \ifDIRECTIONempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
+ \expandafter\next@\expandafter{\afterDIRECTION@}%
+ \xyFN@\DIRECTION@}
+
+\xylet@\afterDIRECTION@=\empty
+\xynew@{if}\ifDIRECTIONempty@
+
+\xydef@\DIRECTION@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\DIRECTION@}%gobble spaces
+ \else\ifx v\next \DN@ v{\DIRECTION@v}%
+ \else\ifx \bgroup\next \let\next@=\DIRECTION@group
+ \else\ifx (\next \DN@({\xyFN@\DIRECTION@open}%))
+ \else
+ \DN@{\count@=8 %
+ \afterDIAG{\ifnum\count@=8 \DN@{\DIRECTIONempty@true \xyFN@\DIRECTION@i}%
+ \else \DN@{\xy@@{\dimen@=\xydashl@}\Directionfromdiag@}\fi \next@}}%
+ \fi\fi\fi\fi \next@}
+
+\xydef@\DIRECTION@open{%
+ \ifx *\next \DN@*##1*){\DIRECTION@group{##1}}%
+ \else \DN@{\xyerror@{(* <pos> *) expected}{} \xyFN@\DIRECTION@i}%
+ \fi \next@}
+\DOCMODE)
+
+\paragraph*{Diagonal directions.}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ It is particularly easy to set <diag>onal directions:
+$$
+\xy *[o]\cir<1pc>{}="c",
+ "c"; (-1,-1)**{},p+/4pc/ *+{|dl|=|ld|} **@{-}?>*@{>},
+ "c"; ( 0,-1)**{},p+/4pc/ *+{|d|} **@{-}?>*@{>},
+ "c"; ( 1,-1)**{},p+/4pc/ *+{|dr|=|rd|} **@{-}?>*@{>},
+ "c"; ( 1, 0)**{},p+/4pc/ *+{|r|} **@{-}?>*@{>},
+ "c"; ( 1, 1)**{},p+/4pc/ *+{|ur|=|ru|} **@{-}?>*@{>},
+ "c"; ( 0, 1)**{},p+/4pc/ *+{|u|} **@{-}?>*@{>},
+ "c"; (-1, 1)**{},p+/4pc/ *+{|ul|=|lu|} **@{-}?>*@{>},
+ "c"; (-1, 0)**{},p+/4pc/ *+{|l|} **@{-}?>*@{>},
+\endxy
+$$
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ More to the point, <diag>onals are stored internally as
+$$
+\xy *\cir<1pc>{}="c",
+ "c"; (-1,-1)**{},p+/3pc/ *+{|0|} **@{-}?>*@{>},
+ "c"; ( 0,-1)**{},p+/3pc/ *+{|1|} **@{-}?>*@{>},
+ "c"; ( 1,-1)**{},p+/3pc/ *+{|2|} **@{-}?>*@{>},
+ "c"; ( 1, 0)**{},p+/3pc/ *+{|3|} **@{-}?>*@{>},
+ "c"; ( 1, 1)**{},p+/3pc/ *+{|4|} **@{-}?>*@{>},
+ "c"; ( 0, 1)**{},p+/3pc/ *+{|5|} **@{-}?>*@{>},
+ "c"; (-1, 1)**{},p+/3pc/ *+{|6|} **@{-}?>*@{>},
+ "c"; (-1, 0)**{},p+/3pc/ *+{|7|} **@{-}?>*@{>},
+\endxy
+$$
+ Expanding |\afterDIAG{|<stuff>|}|<diag> will result in |\count@|
+ being set to the <diag> code (not changed in case the <diag> is
+ <empty>) before expanding <stuff>.
+
+\DOCMODE(
+\def\afterDIAG#1{\def\afterDIAG@{#1}\xyFN@\DIAG@}
+
+\xydef@\DIAG@{%
+ \ifx d\next \DN@ d{\count@=1 \xyFN@\DIAG@@}%
+ \else\ifx r\next \DN@ r{\count@=3 \xyFN@\DIAG@@}%
+ \else\ifx u\next \DN@ u{\count@=5 \xyFN@\DIAG@@}%
+ \else\ifx l\next \DN@ l{\count@=7 \xyFN@\DIAG@@}%
+ \else \let\next@=\afterDIAG@
+ \fi\fi\fi\fi \next@}
+
+\xydef@\DIAG@@{\ifcase\count@ \or
+%\count@=1 3 5 7
+ \DIAG@@@ l0r2\or\or \DIAG@@@ d2u4\or\or \DIAG@@@ r4l6\or\or \DIAG@@@ u6d0%
+ \else\xybug@{impossible <diag> number}\fi
+ \next@}
+
+\xydef@\DIAG@@@#1#2#3#4{%
+ \ifx #1\next \count@=#2\DN@#1{\afterDIAG@}%
+ \else \ifx #3\next \count@=#4\DN@#3{\afterDIAG@}%
+ \else \let\next@=\afterDIAG@ \fi\fi}
+\DOCMODE)
+
+ The action in case of a <diag> is simply to pick the right direction
+ setup routine according to the encoding, getting the <diag> from
+ |\count@| and the length of the $d$ vector from |\dimen@|:
+
+\DOCMODE(
+\xydef@\Directionfromdiag@{\ifcase\count@
+ \xy@@{\dlDirection@\dimen@}%
+ \or \xy@@{\dDirection@\dimen@}%
+ \or \xy@@{\drDirection@\dimen@}%
+ \or \xy@@{\rDirection@\dimen@}%
+ \or \xy@@{\urDirection@\dimen@}%
+ \or \xy@@{\uDirection@\dimen@}%
+ \or \xy@@{\ulDirection@\dimen@}%
+ \or \xy@@{\lDirection@\dimen@}%
+ \or % 8 is legal and means change nothing
+ \else\xybug@{impossible <diag>}\fi
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}
+\DOCMODE)
+
+\paragraph*{Vector directions.}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Alternatively |v|<vector> sets the direction as if the connection
+ from |0| to the <vector> had been typeset except that the "origin" is
+ assumed zero such that directions $|v(|x|,|y|)|$ mean the natural
+ thing, \ie, is the direction of the connection from |(0,0)| to
+ $|(|x|,|y|)|$.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The action for a |v| reads a <vector> and sets the direction
+ accordingly using some expansion hackery to propagate it out. The
+ "origin" is cleared locally to make |v(|$x$|,|$y$|)| behave as it
+ should.
+
+\DOCMODE(
+\xydef@\DIRECTION@v{%
+ \xy@{v}{\enter@{\cfromthec@ \X@origin=\the\X@origin \Y@origin=\the\Y@origin
+ \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \X@origin=\z@ \Y@origin=\z@}%
+ \afterVECTORorEMPTY
+ {\xy@@{\X@p=\z@ \Y@p=\z@ \setupDirection@ \leave@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ {\xy@@\leave@ \xyerror@{<vector> expected after v}{}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}}
+\DOCMODE)
+
+\paragraph*{Complex direction.}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ In case the direction is not as simple, you can construct
+ |{| <pos> <decor> |}| that sets up $p$ and $c$ such that
+ $\overline{pc}$ has the desired direction. \NOTE: that you must use
+ the |(*|\dots|*)| form if this is to appear in an object <modifier>!
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The code for this is rather like the one for <vector>s.
+
+\DOCMODE(
+\xydef@\DIRECTION@group#1{%
+ \xy@@{\begingroup}\xy@@ix@{#1}\xy@@{\plainxy@\expandafter\POS\the\toks9\relax
+ \setupDirection@\edef\next@{\endgroup \DirectionfromtheDirection@}\next@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{exercise}
+ What effect is achieved by using <modifier>s |v/1pc/| and |v/-1pc/|?
+\answertext{The first has no effect since the direction is set to be that of
+ a vector in the current direction, however, the second reverses the
+ current direction.}
+\end{exercise}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[to <direction>]
+%
+ Once the initial direction is established as either the last one or
+ an absolute one then the remainder of the <direction> is interpreted.
+
+ Adding a single |^| or |_| denotes the result of rotating the default
+ direction a right angle in the positive and negative direction, \ie,
+ anti-/clockwise, respectively. \NOTE: Do \emph{not} use |^|\relax|^|
+ but only |__| to reverse the direction!
+
+ A trailing |:|<vector> is like |v|<vector> but uses the
+ <direction> to set up a standard square base such that |:(0,1)| and
+ |:(0,-1)| mean the same as |:a(90)| and |:a(-90)| and as |^| and |_|,
+ respectively.
+
+\DOCMODE(
+\xydef@\DIRECTION@i{%
+ \ifx ^\next \DN@ ^{\xy@^{\aboveDirection@\xydashl@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ \else\ifx _\next \DN@ _{\xy@_{\belowDirection@\xydashl@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ \else\ifx :\next \DN@ :{%
+ \xy@{:}{\enter@{\cfromthec@ \basefromthebase@ \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \X@origin=\z@ \Y@origin=\z@
+ \X@xbase=\cosDirection\xydashl@ \Y@xbase=\sinDirection\xydashl@
+ \X@ybase=-\Y@xbase \Y@ybase=\X@xbase}%
+ \afterVECTORorEMPTY
+ {\xy@@{\X@p=\z@ \Y@p=\z@ \setupDirection@ \leave@}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
+ {\xy@@\leave@ \xyerror@{<vector> expected after :}{}%
+ \DIRECTIONempty@false \xyFN@\DIRECTION@i}}%
+ \else
+ \let\next@=\afterDIRECTION@
+ \fi\fi\fi \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{exercise}
+ What effect is achieved by using <modifier>s |v/1pc/:(1,0)| and
+ |v/-1pc/__|?
+\answertext{None in both cases.}
+\end{exercise}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{Decorations}
+??=[decor]
+
+\DOCMODE(
+\message{decorations;}
+\DOCMODE)
+
+ <Decor>ations are actual \TeX\ macros that decorate the current
+ picture in manners that depend on the state. They are allowed "after"
+ the <pos>ition either of the outer ??c![\xy]\dots??c![\endxy] or inside
+ |{|\dots|}|. The possibilities are given in figure~??[f.decor] with
+ notes below.
+
+\begin{figure*}[tp]
+\vss
+\begin{syntax}
+ ??w![<decor>]
+ &\iss & <command> <decor>
+ & either there is a command\dots
+\cr
+ &\orr & <empty>
+ & \dots or there isn't.
+\cr
+ ??w![<command>]
+ &\iss & ??c![\save] <pos>
+ & save ??!^[state], then do <pos>
+\cr
+ &\orr & ??c![\restore]
+ & restore ??!^[state] saved by matcing |\save|
+\cr
+ &\orr & ??c![\POS] <pos>
+ & interpret <pos>
+\cr
+ &\orr & ??c![\afterPOS] |{| <decor> |}| <pos>
+ & interpret <pos> and then perform <decor>
+\cr
+ &\orr & ??c![\drop] <object>
+ & drop <object> as the <pos> |*| operation
+\cr
+ &\orr & ??c![\connect] <object>
+ & connect with <object> as the <pos> |**| operation
+\cr
+ &\orr & ??c![\relax]
+ & do nothing
+\cr
+ &\orr & <\TeX\ commands>
+ & any ??!^[\TeX\ commands] and user-defined macros \hfil\break
+ that neither generates output (watch out for stray
+ \hfil\break spaces!), nor changes the grouping, may be used
+\cr
+ &\orr & ??c![\xyverbose]\orr??c![\xytracing]\orr??c![\xyquiet]\kern-1pc
+ &\kern1pc ??!^[tracing] commands
+\cr
+ &\orr & ??c![\xyignore] |{|<pos> <decor>|}|
+ & ??!^[ignore] \Xy-code
+\cr
+ &\orr & ??c![\xycompile] |{|<pos> <decor>|}|
+ & ??!^[compile] to file <prefix><no>|.xyc|
+\cr
+ &\orr & ??c![\xycompileto]|{|<name>|}{|<pos><decor>|}|\kern-1pc
+ &\kern1pc ??!^[compile] to file <name>|.xyc|
+\cr
+\end{syntax}
+\caption{\protect<decor>ations.}
+??=[f.decor]
+\vfill
+\end{figure*}
+
+ Most options add to the available <decor>, in particular the |v2|
+ option loads many more since \Xy-pic versions prior to 2.7 provided
+ most features as <decor>.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Simple decorations:}
+
+ ??c![\POS] and ??c![\afterPOS] have already been defined; the
+ following are just simple applications of previously defined
+ commands:
+
+\DOCMODE(
+\xydef@\drop#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
+ \xy@{\drop#1{##1}}{\expandafter\drop@\the\toks9 }\ignorespaces}\next@}
+
+\xydef@\connect#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
+ \xy@{\connect#1{##1}}{\expandafter\connect@\the\toks9 }\ignorespaces}\next@}
+
+\xydef@\preconnect#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
+ \xy@{\connect#1{##1}}{\expandafter\preconnect@\the\toks9 }\ignorespaces}\next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+%
+\note??=[state]
+%
+ Saving and restoring allows `excursions' where lots of things are
+ added to the picture without affecting the resulting \Xy-pic state,
+ \ie, $c$, $p$, and "base", and without requiring matching |{}|s. The
+ independence of |{}| is particularly useful in conjunction with the
+ ??c![\afterPOS] command, for example, the definition
+
+\begin{code}
+\def\ToPOS{\save\afterPOS{%
+ \POS**{}?>*@2{>}**@{-}\restore};p,}
+\end{code}
+\gdocode
+\displaycode
+
+ will cause the code |\ToPOS|<pos> to construct a double-shafted arrow
+ from the current object to the <pos> (computed relative to it) such
+ that
+%
+\begin{code}
+\xy *{A} \ToPOS +<10mm,2mm> \endxy
+\end{code}
+%
+ \thecode\ will typeset the picture \docode.
+
+\paragraph*{Note:}
+ Saving this way in fact uses the same state as the |{}| `grouping',
+ so the code $p_1$|,| |{|$p_2$|\save},| \dots\ |{\restore}| will have
+ $c=p_1$ both at the \dots\ and at the end!
+
+\DOCMODE(
+\xydef@\save{\relax\saveC}
+\xydef@\saveC{\xy@\save\save@ \POS}
+
+\xydef@\save@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}}
+
+\xydef@\restore{\xy@\restore\leave@ \ignorespaces}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[\TeX\ commands]
+%
+ One very tempting kind of \TeX\ commands to perform as <decor> is
+ arithmetic operations on the \Xy-pic state. This will work in simple
+ \Xy-pictures as described here but be warned: "it is not portable"
+ because all \Xy-pic execution is indirect, and this is used by
+ several options in nontrivial ways. Check the \TeX-nical
+ documentation~\cite{RM95:Xy-picCSTC} for details about this!
+
+ Macros that expand to <decor> will always do the same, though.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \TeX\ hackers like the author may enjoy changing the \Xy-pic state
+ directly using <decor> of the form |\xy@{|<id>|}{|<code>|}|\dots
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[tracing]
+%
+ ??c![\xyecho] will turn on echoing of all interpreted \Xy-pic <pos>
+ characters. \BUG: Not completely implemented yet. ??c![\xyverbose]
+ will switch on a tracing of all \Xy-pic commands executed, with line
+ numbers. ??c![\xytracing] traces even more: the entire \Xy-pic state
+ is printed after each modification. ??c![\xyquiet] restores default
+ quiet operation.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The trick is to replace the |\xy@| command such that it calls the
+ `normal' one between writing out a trace message and the state.
+
+\DOCMODE(
+\xydef@\xyecho{%
+ \xy@\xyecho{\let\xy@=\xyecho@ \message{\string\xyecho}}\POS}
+
+\xydef@\xyecho@#1#2{{\def\1{#1}\ifx\1\empty\else\message{\codeof\1}\fi}%
+ \oxy@{#1}{#2}}
+
+\xydef@\xyverbose{%
+ \xy@\xyverbose{\let\xy@=\xyverbose@
+ \W@{Xy: \string\xyverbose\xytracelineno@}}\POS}
+
+\xydef@\xyverbose@#1#2{%
+ {\def\1{#1}\ifx\1\empty\else\W@{Xy: \codeof\1\xytracelineno@}\fi}%
+ \oxy@{#1}{#2}}
+
+\xydef@\xytracing{%
+ \xy@\xytracing{\let\xy@=\xytracing@
+ \W@{Xy TRACE: \string\xytracing\xytracelineno@}\xystatus@:}\POS}
+
+\xydef@\xytracing@#1#2{{\def\1{#1}\def\2{#2}%
+ \W@{Xy TRACE: \codeof\1 {\codeof\2}\xytracelineno@}}\oxy@{#1}{#2}\xystatus@:}
+
+\xydef@\xystatus@#1{\xystatus@cp{#1}%
+ \W@{#1 d=<\the\d@X,\the\d@Y>
+ Direction=\the\Direction=\string(\cosDirection,\sinDirection\string)}%
+ \W@{#1 base=<\the\X@origin,\the\Y@origin>+%
+ <\the\X@xbase,\the\Y@xbase>x+<\the\X@ybase,\the\Y@ybase>y}%
+ \W@{#1 min/max=<\the\X@min,\the\Y@min>/<\the\X@max,\the\Y@max>
+ S=\the\csp@}}
+
+\xydef@\xystatus@cp#1{%
+ \W@{#1 c=<\the\X@c,\the\Y@c> \expandafter\string\the\Edge@c
+ \string[\the\L@c+\the\R@c,\the\D@c+\the\U@c\string]
+ \ifInvisible@ I\fi\ifHidden@ H\fi}%
+ \W@{#1 p=<\the\X@p,\the\Y@p> \expandafter\string\the\Edge@p
+ \string[\the\L@p+\the\R@p,\the\D@p+\the\U@p\string]}}
+
+\xydef@\xystatus@c#1{%
+ \W@{#1<\the\X@c,\the\Y@c> \expandafter\string\the\Edge@c
+ \string[\the\L@c+\the\R@c,\the\D@c+\the\U@c\string]}}
+
+\xydef@\xyquiet{\xy@\xyquiet{\let\xy@=\oxy@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[ignore]
+%
+ Ignoring means that the <pos> <decor> is still parsed the usual way
+ but nothing is typeset and the \Xy-pic state is not changed.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ We ignore in a group to ensure that nothing done inside `leaks' to
+ the outside.
+
+\DOCMODE(
+\xydef@\xyignore#1{\xy@\xyignore{\xyignore@{#1}}\ignorespaces}
+
+\xydef@\xyignore@#1{{\let\xy@=\xyeat@ \change@oxy@\xy@ \POS#1\relax}}
+
+\xydef@\xyeat@#1#2{}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[compile]
+%
+ It is possible to save an intermediate form of commands that generate
+ parts of an \Xy-picture to a file such that subsequent typesetting of
+ those parts is significantly faster: this is called
+ "??w![compiling]". The produced file contains code to check that the
+ compiled code still corresponds to the same <pos><decor> as well as
+ efficient \Xy-code to redo it; if the <pos><decor> has changed then
+ the compilation is redone.
+
+ There are two ways to use this. The direct is to invent a <name> for
+ each diagram and then embrace it in
+ |\xycompileto{|<name>|}||{|\dots|}| -- this dumps the compiled code
+ into the file <name>|.xyc|.
+
+ When many diagrams are compiled then it is easier to add
+ ??c![\xycompile]|{|\dots|}| around the <pos><decor> to be compiled.
+ This will assign file names numbered consecutively with a <prefix>
+ which is initially the expansion of |\jobname-| but may be set with
+%
+\begin{defs1}
+??c![\CompilePrefix]|{|<prefix>|}|
+\end{defs1}
+\noindent\unskip
+%
+ This has the disadvantage, however, that if additional compiled
+ \Xy-pictures are inserted then all subsequent pictures will have to
+ be recompiled. One particular situation is provided, though: when
+ used within constructions that typeset their contents more than once
+ (such as most ??w![\AMS-\LaTeX] equation constructs) then the
+ declaration
+%
+\begin{defs1}
+??c![\CompileFixPoint]|{|<id>|}|
+\end{defs1}
+\noindent\unskip
+%
+ can be used inside the environment to fix the counter to have the
+ same value at every passage.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ It is done by just writing all |\xy@|-commands to the file. The file
+ establishes the correct input mode through use of the appropriate
+ commands itself.
+
+\DOCMODE(
+\xydef@\xycompile@@{\jobname-}
+\xydef@\xycompileno@@{0}
+
+\xydef@\CompilePrefix#1{%
+ \def\xycompile@@{#1}\xdef\xycompile@@{\codeof\xycompile@@}%
+ \xdef\xycompileno@@{0}}
+
+\xydef@\xycompile{%
+ \count@=\xycompileno@@ \advance\count@\@ne
+ \xdef\xycompileno@@{\ifnum10>\count@ 0\fi \the\count@}%
+ \edef\next{\noexpand\xycompileto{\xycompile@@\xycompileno@@}}\next}
+
+\xylet@\compilename@@=\empty
+\xylet@\xyrecompile@@=\relax
+
+\xydef@\xycompileto#1#2{%
+ \if\inxy@ \DN@{\xy@@{\nter@{}}}%
+ \else \DN@{\xy \xy@@{\nter@{\endxy}}}\fi \next@
+ \ifxysaving@ \xyerror@{Compilations can not be nested}{}\fi
+ \DN@{#1}\edef\compilename@@{\codeof\next@}\DNii@{#2}%
+ \def\xyrecompile@@{recompiling TRUNCATED}%
+ \expandafter\xyinputorelse@@\expandafter{\compilename@@.xyc}%
+ {\def\xyrecompile@@{compiling to}}%
+ \ifx\xyrecompile@@\relax \else \expandafter\xyrecompile@ \fi
+ \xy@@\leave@ \ignorespaces}
+\DOCMODE)
+
+ Recompilation is done by just writing all |\xy@|-commands to the
+ file. The file establishes the correct input mode and terminates
+ itself; after it has been finished it is simply reread to actually
+ get the drawing done in the document.
+
+\DOCMODE(
+\xydef@\xyrecompile@{%
+ \message{(\xyrecompile@@\space\string`\compilename@@.xyc\string'}%
+ \DN@{\immediate\openout\xywrite@=}\expandafter\next@\compilename@@.xyc
+ \immediate\write\xywrite@{%
+ \string\xycompiled{\compilename@@}%
+ {\the\year/\the\month/\the\day\string:\the\time\xytracelineno@}%
+ {Xy-pic \xyversion}\xycomment@}%
+ \immediate\write\xywrite@{{\codeof\nextii@}\relax}%
+ {\xysaving@ \expandafter\POS\nextii@ \relax}%
+ \immediate\write\xywrite@{\string\xyendcompiled}%
+ \immediate\closeout\xywrite@ \message{done)}%
+ \expandafter\input\compilename@@.xyc
+ \outlines@@\writeoutline@\writeoutline@}
+
+\xydef@\xysaving@{\let\xy@=\xysave@ \change@oxy@\xy@
+ \let\xy@@ix@=\xysave@@toksix@ \xysaving@true}
+
+\xynew@{if}\ifxysaving@ \xysaving@false
+
+\xydef@\xysave@#1#2{{\DN@{{#1}{#2}}%
+ \immediate\write\xywrite@{\string\xy@\codeof\next@\xycomment@}}}
+
+\xydef@\xysave@@toksix@#1{{\DN@{{#1}}%
+ \immediate\write\xywrite@{\string\xy@@ix@\codeof\next@\relax}}}
+
+\xywarnifdefined\xycomment@
+{\catcode`\%=12 \catcode`\(=1 \catcode`\)=2 \gdef\xycomment@(%)}
+\DOCMODE)
+
+ \HACK{1:} The |\ifxysaving@| can never be locally switched off!
+ Anyway it is used to allow a gross hack avoiding building a queue in
+ the matrix option that will generate too long lines!!
+
+ \HACK{2:} |\xysave@@toksix@| is not doing the catcode jive because it
+ can never be invoked while loading a file (knock, knock~\smiley~).
+
+ The initial command in all |.xyc| files check that this is the right
+ file and that neither the version of \Xy-pic nor the user's code has
+ changed:
+
+\DOCMODE(
+\xydef@\xycompiled#1#2#3#4{\DN@{#1}\edef\next@{\codeof\next@}%
+ \ifx\next@\compilename@@\else
+ \xywarning@{This file does not contain the result of
+ \string\xycompileto{\compilename@@}{...}^^J%
+ but of \string\xycompileto{\next@}}\fi
+ \edef\next{Xy-pic \xyversion}\DN@{#3}\ifx\next\next@
+ \DN@{#4}\ifx\next@\nextii@ \xycatcodes \outlines@@\relax\readoutline@
+ \else \def\xyrecompile@@{recompiling to}\endinput \fi
+ \else \def\xyrecompile@@{Xy-pic version change - recompiling}\endinput \fi}
+
+\xydef@\xyendcompiled{\let\xyrecompile@@=\relax \xyuncatcodes\endinput}
+\DOCMODE)
+
+ Finally the fix-point thing.
+
+\DOCMODE(
+\xydef@\CompileFixPoint#1{%
+ \expandafter\ifx\csname#1FIX@@\endcsname\relax
+ \expandafter\xdef\csname#1FIX@@\endcsname{\xycompileno@@}%
+ \else
+ \xdef\xycompileno@@{\csname#1FIX@@\endcsname}\fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Finally, when many `administrative typesetting runs' are needed, \eg,
+ readjusting \LaTeX\ cross references and such, then it may be an
+ advantage to not typeset any \Xy-pictures at all during the
+ intermediate runs. This is supported by the following declarations
+ which for each compilation creates a special file with the extension
+ ??c![.xyd] containing just the size of the picture:
+%
+\begin{defs1}
+??c![\MakeOutlines]\cr
+??c![\OnlyOutlines]\cr
+??c![\ShowOutlines]\cr
+??c![\NoOutlines]\cr
+\end{defs1}
+\noindent\unskip
+%
+ The first does no more. The second uses the file to typesets a
+ dotted frame of the appropriate size instead of the picture (unless
+ the picture has changed and is recompiled, then it is typeset as
+ always and the |.xyd| file is recreated for subsequent runs). The
+ third shows the outlines as dotted rectangles. The last switches
+ outline processing completely off.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The implementation is all handled by |\outlines@@| which is called at
+ strategic places in the compilation macros above. It just expands to
+ nothing when the state is `No', the first argument when it is `Make',
+ and the second when it is `Only'.
+
+\DOCMODE(
+
+\xydef@\outlines@no#1#2{}
+\xydef@\outlines@make#1#2{#1}
+\xydef@\outlines@only#1#2{#2}
+
+\xylet@\outlines@@=\outlines@no
+\xylet@\writeoutline@@=\relax
+\xylet@\readoutline@@=\relax
+
+\xydef@\MakeOutlines{\let\outlines@@=\outlines@make}
+
+\xydef@\OnlyOutlines{\xywarning@{Compiled pictures only shown as outlines}%
+ \let\outlines@@=\outlines@only}
+
+\xydef@\ShowOutlines{\let\readoutline@@=\typesetoutline@}
+
+\xydef@\NoOutlines{\let\outlines@@=\outlines@no}
+
+\xydef@\writeoutline@{%
+ \DN@{\immediate\openout\xywrite@=}\expandafter\next@\compilename@@.xyd
+ \immediate\write\xywrite@{\xycomment@\space\compilename@@.xyd}
+ \immediate\write\xywrite@{%
+ \string\X@min=\the\X@min \string\X@max=\the\X@max
+ \string\Y@min=\the\Y@min \string\Y@max=\the\Y@max \string\relax}%
+ \writeoutline@@
+ \immediate\closeout\xywrite@}
+
+\xynew@{if}\ifoutlineread@
+
+\xydef@\readoutline@{\outlineread@true
+ \expandafter\xyinputorelse@@\expandafter{\compilename@@.xyd}%
+ {\def\xyrecompile@@{outline missing - recompiling to}\outlineread@false}%
+ \ifoutlineread@ \readoutline@@
+ \writeoutline@\expandafter\xyendcompiled\fi}
+
+\xydef@\typesetoutline@{%
+ \xy@@{\czeroEdge@ \U@p=\z@ \D@p=\z@ \L@p=\z@ \R@p=\z@ \Edge@p={\zeroEdge}%
+ \X@p=\X@min \Y@p=\Y@min \X@c=\X@min \Y@c=\Y@max \connect@\dir{.}%
+ \X@p=\X@c \Y@p=\Y@c \X@c=\X@max \Y@c=\Y@max \connect@\dir{.}%
+ \X@p=\X@c \Y@p=\Y@c \X@c=\X@max \Y@c=\Y@min \connect@\dir{.}%
+ \X@p=\X@c \Y@p=\Y@c \X@c=\X@min \Y@c=\Y@min \connect@\dir{.}}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{Kernel object library}
+??=[objectlib]
+
+\DOCMODE(
+\message{kernel objects:}
+\DOCMODE)
+
+ In this section we present the "library objects" provided with the
+ kernel language---several options add more library objects. They fall
+ into three types: Most of the kernel objects (including all those
+ usually used with |**| to build connections) are "directionals",
+ described in \S??[objectlib.directionals]. The remaining kernel
+ library objects are "circles" of \S??[objectlib.circles] and "text"
+ of \S??[objectlib.text].
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Directionals}
+??=[objectlib.directionals]
+
+\DOCMODE(
+\message{directionals,}
+\DOCMODE)
+
+ The kernel provides a selection of "directionals": objects that
+ depend on the current direction. They all take the form
+%
+\begin{defs1}
+%
+ ??c![\dir]<dir> \cr
+%
+\end{defs1}
+\noindent\unskip
+%
+ to typeset a particular <dir>ectional object. All have the structure
+%
+\begin{defs1}
+%
+ <dir> \iss\ <variant>|{|<main>|}| \cr
+%
+\end{defs1}
+\noindent\unskip
+%
+ with <variant> being <empty> or one of the characters |^_23| and
+ <main> some mnemonic code.
+
+ We will classify the directionals primarily intended for building
+ connections as "connectors" and those primarily intended for
+ placement at connection ends or as markers as "tips".
+
+\begin{figure*}[tp]
+ %
+ \def\Dx#1#2{\hbox{\def\1{#1{#2}}\enspace\tt\string\dir\codeof\1}}
+ %
+ \def\DC#1#{\DCx{#1}}
+ \def\DCx#1#2{ \Dx{#1}{#2} & \vcenter{\xy
+ 0*\cir<5pt>{} ; (16,5)*=<10.1pt>{}*\frm{-} **\dir#1{.} **h\dir#1{#2}
+ \endxy}}
+ %
+ \def\DT#1#{\DTx{#1}}
+ \def\DTx#1#2{\Dx{#1}{#2} & \vcenter{\xy
+ -(4,2.5)*{} ; (4,0)*{} **{} ?>*\dir#1{#2} **\dir#1{.}
+ \endxy}}
+ %
+ \def\Darray#1#2{{\let\\=\cr \tabskip=0pt plus 1fil %
+ \halign to\hsize{&\hfil$##$&$##$\hfil\\
+ \noalign{\hbox to\hsize{\hss#1\hss}\smallskip}#2\crcr}\bigskip}}
+%
+\Darray{??!^[Dummy]}{\hbox{\tt\string\dir\string{\string}}}
+%
+\Darray{??!^[Plain connectors]}{%
+ \DC{-} &\DC2{-} &\DC3{-} \\
+ \DC{.} &\DC2{.} &\DC3{.} \\
+ \DC{~} &\DC2{~} &\DC3{~} \\
+ \DC{--} &\DC2{--} &\DC3{--} \\
+ \DC{~~} &\DC2{~~} &\DC3{~~} \\
+}
+\bigskip
+\Darray{??!^[Plain tips]}{%
+ \DT{>} &\DT^{>} &\DT_{>} &\DT2{>} &\DT3{>} \\
+ \DT{<} &\DT^{<} &\DT_{<} &\DT2{<} &\DT3{<} \\
+ \DT{|} &\DT^{|} &\DT_{|} &\DT2{|} &\DT3{|} \\
+ \DT{(} &\DT^{(} &\DT_{(} \\
+ \DT{)} &\DT^{)} &\DT_{)} \\
+ & &\DT^{`} &\DT_{`} \\
+ & &\DT^{'} &\DT_{'}
+}
+\bigskip
+\Darray{??!^[Constructed tips]}{%
+ \DT{>>} &\DT^{>>} &\DT_{>>} &\DT2{>>} &\DT3{>>} \\
+ \DT{<<} &\DT^{<<} &\DT_{<<} &\DT2{<<} &\DT3{<<} \\
+ \DT{||} &\DT^{||} &\DT_{||} &\DT2{||} &\DT3{||} \\
+ \DT{|-} &\DT^{|-} &\DT_{|-} &\DT2{|-} &\DT3{|-} \\
+ \DT{>|} &\DT{>>|} &\DT{|<} &\DT{|<<} &\DT{*} \\
+ \DT{+} &\DT{x} &\DT{/} &\DT{//} &\DT{o}
+}
+\caption{Kernel library \protect<dir>ectionals}??=[f.dir]
+\end{figure*}
+
+ Figure~??[f.dir] shows all the <dir>ectionals defined by the kernel
+ with notes below; each <main> type has a line showing the available
+ <variant>s. Notice that only some variants exist for each
+ <dir>---when a nonexisting variant of a <dir> is requested then the
+ <empty> variant is used silently. Each is shown in either of the two
+ forms available in each direction as applicable: connecting a
+ $\bigcirc$ to a $\Box$ (typeset by |**\dir|<dir>) and as a tip at the
+ end of a dotted connection of the same variant (\ie, typeset by the
+ <pos> |**\dir|<variant>|{.}| |?>| |*\dir|<dir>).
+
+ As a special case an entire <object> is allowed as a <dir> by
+ starting it with a |*|: |\dir*| is equivalent to ??c![\object].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Setup:}
+
+ ??c![\dir] starts an <object> and passes control to a `finisher' named
+ |\dir|<variant>|{|<main>|}| otherwise to the one corresponding to an
+ <empty> <variant>. The kernel ones described here have in common
+ that they make use of the generic |\straight@| defined
+ in~\S??[algo.connection].
+
+\DOCMODE(
+\xydef@\dir{\hbox\bgroup\xyFN@\dir@i}
+
+\xydef@\dir@i{\ifx *\next \DN@*{\resetStyle@\object@}%
+ \else \let\next@=\dir@ii \fi \next@}
+
+\xydef@\dir@ii#1#{\dir@{#1}}
+
+\xydef@\dir@#1#2{\DN@{dir#1{#2}}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax \DN@{dir{#2}}%
+ \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
+ \ifx\next\relax \DN@{\dir#1{#2}}%
+ \xyerror@{illegal <dir>: \codeof\next@\space not defined}{}%
+ \let\next=\no@ \fi\fi \next}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+
+\note??=[Dummy]
+
+ You may use |\dir{}| for a ``dummy'' directional object (in fact this
+ is used automatically by |**{}|). This is useful for a uniform
+ treatment of connections, \eg, making the |?| <pos> able to find a
+ point on the straight line from $p$ to $c$ without actually
+ typesetting anything.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Uses an empty droppping, the |\no@@| connection. All the variants
+ are defined for optimisation reasons and it is also named |\dir{ }|
+ to allow spurious spaces:
+
+\DOCMODE(
+\xydefcsname@{dir{}}{\no@}
+
+\xyletcsnamecsname@{dir0{}}{dir{}}
+\xyletcsnamecsname@{dir1{}}{dir{}}
+\xyletcsnamecsname@{dir^{}}{dir{}}
+\xyletcsnamecsname@{dir_{}}{dir{}}
+\xyletcsnamecsname@{dir2{}}{dir{}}
+\xyletcsnamecsname@{dir3{}}{dir{}}
+
+\xyletcsnamecsname@{dir{ }}{dir{}}
+
+\xydef@\no@{\egroup \czeroEdge@ %\Invisible@false \Hidden@false %%%%HACK?
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\setbox\z@=\copy\voidb@x}\def\Connect@@{\no@@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[Plain connectors]
+
+ The "plain connectors" group contains basic directionals that lend
+ themself to simple connections.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The bulk of the code is in fact in the description of these. First
+ each of the three types---lines, dots, and squiggles---then the code
+ for doubling and tripling.
+
+\paragraph*{Lines:}
+
+ A single |\dir{-}| object is a dash in the current direction: build
+ box with character $C$ of the semidirectional ??c![\xydashfont]; use
+ the characters natural width $w$ and construct a height/depth from $d
+ = \abs{\sin(|\Direction|)}|em|$ (where |1em| is the dash length,
+ \cf~|xydash10.mf|) as follows:
+$$
+\begin{array}{cccccc}
+ C & L & R & D & U & "flip if" \\
+ 0\ldots30 & 0 & w & 0 & d & dY \lt 0 \\
+ 31\ldots63 & 0 & w & d & 0 & dY \gt 0 \\
+ 64\ldots95 & 0 & w & d & 0 & dX \lt 0 \\
+ 96\ldots127 & 0 & w & 0 & d & dX \lt 0 \\
+\end{array}
+$$
+ where "flip" means shift the box opposite vertically and
+ horizontally, \ie, $(L,R,D,U) := (R,L,U,D)$, and then lower the box
+ $D-U$.
+
+ "Procedure": (??_[line1])~Compute $d$, (??_[line2])~set $D,U$, and
+ flip condition, (??_[line3])~build box to get $w,L,R$,
+ (??_[line4])~dump box that is flipped if condition holds, and
+ (??_[line5])~finally setup the required parameters properly.
+
+\DOCMODE(
+\xydefcsname@{dir1{-}}{\line@}
+\xydefcsname@{dir2{-}}{\line@ \double@\xydashh@}
+\xydefcsname@{dir3{-}}{\line@ \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{-}}{dir{}}
+\xyletcsnamecsname@{dir{-}}{dir1{-}}
+\xyletcsnamecsname@{dir{=}}{dir2{-}}
+
+\xydef@\line@{\dimen@=\sd@Y\sinDirection\xydashl@ %?*[line1]
+ \ifnum\SemiDirectionChar<31 \D@c=\z@ \U@c=\dimen@ \DN@{\d@Y<\z@}% %?*[line2]
+ \else\ifnum\SemiDirectionChar<64 \D@c=\dimen@ \U@c=\z@ \DN@{\z@<\d@Y}%
+ \else\ifnum\SemiDirectionChar<96 \D@c=\dimen@ \U@c=\z@ \DN@{\d@X<\z@}%
+ \else \D@c=\z@ \U@c=\dimen@ \DN@{\d@X<\z@}\fi\fi\fi
+ \setboxz@h{\line@@}\ht\z@=\U@c \dp\z@=\D@c %?*[line3]
+ \L@c=\z@ \R@c=\wdz@
+ \ifdim\next@ \dimen@=\R@c \R@c=\L@c \L@c=\dimen@ %?*[line4]
+ \dimen@=\U@c \U@c=\D@c \D@c=\dimen@ \advance\dimen@-\U@c
+ \lower\dimen@\boxz@
+ \else \boxz@ \fi
+%
+%\ifnum\SemiDirectionChar=31\relax
+% \W@{LINE@(\the\SemiDirectionChar): WH=<\the\L@c+\the\R@c,\the\D@c+\the\U@c>;
+% d=<\the\d@X,\the\d@Y>}\fi
+%
+ \edef\tmp@{\egroup \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c}% %?*[line5]
+ \tmp@
+ \Edge@c={\rectangleEdge}%%%%%\Invisible@false\Hidden@false
+ \ifdim\z@<\U@c \def\Upness@{1}\else \def\Upness@{0}\fi
+ \ifdim\z@<\L@c \def\Leftness@{1}\else \def\Leftness@{0}\fi
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\solid@}}
+
+\xydef@\line@@{{\xydashfont\SemiDirectionChar\/}}
+\DOCMODE)
+
+ \BUG: |\line@| should allow the size of the object to be changed
+ after typesetting---this should make |\Connect@@| do dashing. Hm.
+
+ As mentioned above a dash will `Connect' to make lines by using rules
+ when strictly horizontal or vertical. This is controlled by enabling
+ or disabling the test |\ifjusthvtest@| discussed below.
+
+\DOCMODE(
+\xydef@\solid@{%
+%
+%\W@{SOLID}\xystatus@:%
+%
+ \checkXy@rules@\solidhrule@\solidvrule@{\straight@\solidSpread@}}
+
+\xydef@\checkXy@rules@#1#2#3{%
+ \dimen@=\Y@c \advance\dimen@-\Y@p
+ \ifjusthvtest@.05pt>\ifdim\dimen@<\z@-\fi\dimen@ \DN@{#1}%
+ \else \dimen@=\X@c \advance\dimen@-\X@p
+ \ifjusthvtest@.05pt>\ifdim\dimen@<\z@-\fi\dimen@ \DN@{#2}%
+ \else \DN@{#3}\fi\fi \next@}
+\DOCMODE)
+
+ Finally, we give the algorithm for `spreading' the dashes along a
+ solid line: just add an extra dash so they always overlap
+ (see~\S??[algo.connection] for a proper defintion of the requirements
+ to spreading).
+
+\DOCMODE(
+\xydef@\solidSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ By default \Xy-pic will typeset horizontal and vertical |\dir{-}|
+ connections using \TeX\ rules. Unfortunately rules is the feature of
+ the DVI format most commonly handled wrong by DVI drivers. Therefore
+ \Xy-pic provides the <decor>ations
+%
+\begin{defs1}
+%
+ ??c![\NoRules] \cr
+ ??c![\UseRules] \cr
+%
+\end{defs1}
+\noindent\unskip
+%
+ that will switch the use of such off and on.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ They simply redefine the conditional used to select typesetting
+ with rules in |\solid@| above:
+
+\DOCMODE(
+\xylet@\ifjusthvtest@=\ifdim
+
+\xydef@\NoRules{\let\ifjusthvtest@=\iffalse}
+\xydef@\UseRules{\let\ifjusthvtest@=\ifdim}
+\DOCMODE)
+
+ The actual typesetting essentially means calling |\drop@| to box with
+ a rule of the appropriate length and with line width set to that of
+ ??c![\xydashfont] (as stored in |\xydashw@|).
+
+\DOCMODE(
+\xydef@\solidvrule@{\no@@ \solidvrule@typeset \ifHidden@\else\noinsert@\fi
+ \solidvrule@pre}
+
+\xydef@\solidvrule@pre{%
+%
+%\W@{VRULE SETUP}%
+%
+ \def\Cbreak@@{%
+%
+%\W@{VRULE Cbreak}%
+%
+ \connectRestore@ \swap@\lastbreak@@\swap@
+ \solidvrule@typeset \edef\lastbreak@@{\cfromthec@}\Creset@@}%
+ \def\Clast@@{%
+%
+%\W@{VRULE Clast}%
+%\let\Clast@@=\undefined
+%
+ \connectRestore@ \Creset@@\swap@\lastbreak@@\swap@
+ \solidvrule@typeset \Creset@@ \edef\lastbreak@@{\cfromthep@}}%
+}
+
+\xydef@\solidvrule@typeset{%
+%
+%\W@{VRULE TYPESET}\xystatus@cp:%
+%
+ \ifInvisible@ \let\next@=\relax \else \let\next@=\solidvrule@typeset@ \fi
+ \checkoverlap@@ \next@}
+
+\xydef@\solidvrule@typeset@{{%
+%
+ \advance\X@c\X@p \X@c=.5\X@c \X@p=\X@c
+ \advance\X@c-.5\xydashw@ \advance\X@p.5\xydashw@
+%
+ \ifdim\Y@c<\Y@p \advance\Y@c\U@c \advance\Y@p-\D@p
+ \else \swapdimen@\Y@c\Y@p \advance\Y@c\U@p \advance\Y@p-\D@c \fi
+%
+ \Droprule@}}
+
+\xydef@\solidhrule@{\no@@ \solidhrule@typeset \ifHidden@\else\noinsert@\fi
+ \solidhrule@pre}
+
+\xydef@\solidhrule@pre{%
+%
+%\W@{HRULE SETUP}%
+%
+ \def\Cbreak@@{%
+%
+%\W@{HRULE Cbreak}%
+%
+ \connectRestore@ \swap@\lastbreak@@\swap@
+ \solidhrule@typeset \edef\lastbreak@@{\cfromthec@}\Creset@@}%
+ \def\Clast@@{%
+%
+%\W@{HRULE Clast}%
+%\let\Clast@@=\undefined
+%
+ \connectRestore@ \Creset@@\swap@\lastbreak@@\swap@
+ \solidhrule@typeset \Creset@@ \edef\lastbreak@@{\cfromthep@}}%
+}
+
+\xydef@\solidhrule@typeset{%
+%
+%\W@{HRULE TYPESET}\xystatus@cp:%
+%
+ \ifInvisible@ \let\next@=\relax \else \let\next@=\solidhrule@typeset@ \fi
+ \checkoverlap@@ \next@}
+
+\xydef@\solidhrule@typeset@{{%
+ \ifdim\X@c<\X@p \advance\X@c\R@c \advance\X@p-\L@p
+ \else \swapdimen@\X@c\X@p \advance\X@c\R@p \advance\X@p-\L@c \fi
+ \advance\Y@c\Y@p \Y@c=.5\Y@c \Y@p=\Y@c
+ \advance\Y@c-.5\xydashw@ \advance\Y@p.5\xydashw@
+ \Droprule@}}
+\DOCMODE)
+
+ |\Droprule@| puts the actual ink on the page: with lower left corner
+ at $c$ and upper right corner at~$p$.
+
+\DOCMODE(
+\xydef@\Droprule@{\advance\X@p-\X@c
+%
+%\W@{: kern\the\X@c\space width\the\X@p\space depth-\the\Y@c\space
+% height\the\Y@p}%
+%
+ \setboxz@h{\kern\X@c \vrule width\X@p depth-\Y@c height\Y@p}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ \Drop@@}
+\DOCMODE)
+
+\paragraph*{Dots:}
+
+ |\dir{.}| creates a very boring dot when used as an <object>, but
+ interesting dotted lines when used to connect. ??c![\zerodot] should
+ expand to a zero-sized box with a dot (initialised to use
+ |\zero|\-|dotbox@|); the <object> is built using |\pointlike@| <text>
+ <spread-dimen> that we will use again later.
+
+\DOCMODE(
+\xydef@\zerodot{\copy\zerodotbox@}
+
+\xydefcsname@{dir1{.}}{\point@}
+\xydefcsname@{dir2{.}}{\point@ \double@\xydashh@}
+\xydefcsname@{dir3{.}}{\point@ \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{.}}{dir{}}
+\xyletcsnamecsname@{dir{.}}{dir1{.}}
+\xyletcsnamecsname@{dir{:}}{dir2{.}}
+
+\xydef@\point@{\pointlike@\zerodot\p@}
+
+\xydef@\pointlike@#1#2{%
+ \setboxz@h{#1}\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@\egroup
+% \Invisible@false \Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}\ctipEdge@
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@{#2}}}}
+\DOCMODE)
+
+ This is reflected by the rather complicated spreading routine:
+ `Dotting' is the art of putting zero-sized objects together with
+ equal distance independent of the chosen direction. So we must
+ recompute the number of segments $N$ (likely to be very big or
+ ${-}1$) with trigonometry; using "radius" for the individual dots
+ this becomes
+$$
+\begin{array}{lc}
+ ??_[dottedspread]
+ & A := \abs{\cos{|\Direction|}}*"radius"\\
+ & B := \abs{\sin{|\Direction|}}*"radius"\\
+ ??_[dottedspread1]
+ & "if"~A+B \gt \abs{|\d@X|}+\abs{|\d@Y|}~"then"~N=0~"and exit" \\
+ ??_[dottedspread2]
+ & |<|A|,|B|>| := 2*|<|A|,|B|>|\\
+ & "Filler" := <box with the original filler centered...>\\
+ ??_[dottedspread3]
+ & |<\d@X,\d@Y>| := |<\d@X,\d@Y>| + |<\sd@X|*A|,\sd@Y|*B|>|\\
+ & |<|X|,|Y|>| := |<|X|,|Y|>| + |<\sd@X|*A/2|,\sd@Y|*B/2|>|\\
+ ??_[dottedspread4]
+ & N := \floor{"if"~\abs{|\d@X|}\gt\abs{|\d@Y|}
+ ~"then" \abs{|\d@X|}/A else \abs{|\d@Y|}/B} + 1
+\end{array}
+$$
+ as realised below:
+
+\DOCMODE(
+\xydef@\dottedSpread@#1{%\setupDirection@ %?*[dottedspread]
+ \dimen@=#1\relax \DN@{\A@=2\A@ \B@=2\B@ \dottedSpread@i}%
+ \A@=\sd@X\cosDirection\dimen@ \B@=\sd@Y\sinDirection\dimen@
+ \dimen@=\A@ \advance\dimen@\B@ %?*[dottedspread1]
+ \dimen@ii=\sd@X\d@X \advance\dimen@ii\sd@Y\d@Y
+ \ifdim\dimen@>\dimen@ii \DN@{\count@@=\z@}\fi
+ \next@}
+
+\xydef@\dottedSpread@i{%\setupDirection@ %?*[dottedspread2]
+ \global\setbox8=\hbox to\A@{\hss
+ \kern.5\A@\box\lastobjectbox@\kern.5\A@\hss}\dp8=.5\B@ \ht8=.5\B@
+ \advance\d@X\sd@X\A@ \advance\d@Y\sd@Y\B@ %?*[dottedspread3]
+ \advance\X@c\sd@X.5\A@ \advance\Y@c\sd@Y.5\B@
+ \ifdim\sd@Y\d@Y<\sd@X\d@X \dimen@=\sd@X\d@X %?*[dottedspread4]
+ \ifdim\zz@\A@\else \divide\dimen@\A@ \fi \count@@=\dimen@
+ \else \dimen@=\sd@Y\d@Y
+ \ifdim\zz@\B@\else \divide\dimen@\B@ \fi \count@@=\dimen@
+ \fi \advance\count@@\@ne}
+\DOCMODE)
+%
+\noindent
+ A particular aspect of this is that we have to enlarge and recenter
+ the actual box used for the typesetting (|\lastobjectbox@|).
+
+\paragraph*{Squiggles:}
+
+ These are just a lot of box maneuvering using the directional
+ characters of ??c![\xybsqlfont] (see~|xybsql10.mf| for details):
+
+\DOCMODE(
+\xydefcsname@{dir1{~}}{\squiggle@}
+\xydefcsname@{dir2{~}}{\squiggle@ \double@\xybsqlh@}
+\xydefcsname@{dir3{~}}{\squiggle@ \triple@\xybsqlh@}
+\xyletcsnamecsname@{dir0{~}}{dir{}}
+\xyletcsnamecsname@{dir{~}}{dir1{~}}
+
+\xydef@\squiggle@{\xybsqlfont
+ \dimen@=\sd@X\cosDirection\xybsqll@ \advance\dimen@.1\p@
+ \dimen@ii=\sd@Y\sinDirection\xybsqll@
+ \kern\dimen@\squiggle@@
+ \edef\tmp@{\egroup \U@c=\the\dimen@ii \L@c=\the\dimen@}\tmp@
+ \wdz@=2\L@c \R@c=\L@c \ht\z@=\U@c \D@c=\U@c \dp\z@=\U@c
+ \Edge@c={\rectangleEdge}%
+% \Invisible@false \Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\squiggledSpread@}}
+
+\xydef@\squiggle@@{\DirectionChar \count@=\DirectionChar
+ \advance\count@-64 \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}
+\DOCMODE)
+
+ The interesting bit is that they spread by not spreading, \ie, by
+ centering between the endpoints---this means
+$$
+\begin{array}{ll}
+ X := X - d/2, dX := dX - d
+ &\hbox{where}~ d = |\sd@X|(\abs{dX} - N*A + |.1pt|)\\
+ Y := Y - d/2, dY := dY - d
+ &\hbox{where}~ d = |\sd@Y|(\abs{dY} - N*B + |.1pt|)\\
+\end{array}
+$$
+
+\DOCMODE(
+\xydef@\squiggledSpread@{%
+ \dimen@=\d@X \advance\dimen@-\sd@X\count@@\A@ \advance\dimen@\sd@X.3\p@
+ \advance\X@c-.5\dimen@ \advance\d@X-\dimen@
+ \dimen@=\d@Y \advance\dimen@-\sd@Y\count@@\B@ \advance\dimen@\sd@Y.3\p@
+ \advance\Y@c-.5\dimen@ \advance\d@Y-\dimen@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Double and triple directionals:}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ As can be seen by the last two columns, these (and most of the other
+ connectors) also exist in double and triple versions with a |2| or a
+ |3| prepended to the name. For convenience |\dir{=}| and |\dir{:}|
+ are synonyms for |\dir2{-}| and |\dir2{.}|, respectively; similarly
+ |\dir{==}| is a synonym for |\dir2{--}|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This is very simple, really: |\double@| and |\triple@| do the work by
+ redefining the |\Drop@@| method to do its job twice and thrice.
+ \TODO: should probably extend any already defined |\Drop@@| method?
+
+\DOCMODE(
+%\xydef@\double@#1{\edef\Drop@@{\dimen@=#1\relax
+% \dimen@=.5\dimen@ \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
+% \setbox2=\hbox{\kern\A@\raise\B@\copy\z@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 %
+% \setbox2=\hbox{\kern-\A@\raise-\B@\boxz@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 }}
+
+%\xydef@\triple@#1{\edef\Drop@@{\dimen@=#1\relax
+% \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
+% \setbox2=\hbox{\kern\A@\raise\B@\copy\z@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 %
+% \setbox2=\hbox{\kern-\A@\raise-\B@\copy\z@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
+% \dp\z@=\z@ \ht\z@=\z@ \wdz@=\z@ \boxz@}}
+
+\xydef@\double@#1{\edef\Drop@@{\dimen@=#1\relax
+ \dimen@=.5\dimen@ \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
+ \setboxz@h{\setbox2=\hbox{\kern\A@\raise\B@\copy\z@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 %
+ \setbox2=\hbox{\kern-\A@\raise-\B@ \noexpand\boxz@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 }%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \noexpand\styledboxz@}}
+
+\xydef@\triple@#1{\edef\Drop@@{\dimen@=#1\relax
+ \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
+ \setboxz@h{\setbox2=\hbox{\kern\A@\raise\B@\copy\z@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 %
+ \setbox2=\hbox{\kern-\A@\raise-\B@\copy\z@}%
+ \dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 %
+ \dp\z@=\z@ \ht\z@=\z@ \wdz@=\z@ \noexpand\boxz@}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \noexpand\styledboxz@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Dashing directionals:}
+
+ First traditional dashing:
+
+\DOCMODE(
+\xydefcsname@{dir1{--}}{\dash@}
+\xydefcsname@{dir2{--}}{\dash@ \double@\xydashh@}
+\xydefcsname@{dir3{--}}{\dash@ \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{--}}{dir{}}
+\xyletcsnamecsname@{dir{--}}{dir1{--}}
+\xyletcsnamecsname@{dir{==}}{dir2{--}}
+
+\xydef@\dash@{\line@ \wdz@=2\wdz@ \ht\z@=2\ht\z@ \dp\z@=2\dp\z@
+ \multiply\D@c\tw@ \multiply\U@c\tw@ \multiply\L@c\tw@ \multiply\R@c\tw@
+ \def\Connect@@{\straight@\dashedSpread@}}
+\DOCMODE)
+
+ Since the dashes should reach the endpoints we do this:
+$$
+\begin{array}{l}
+ "if"~ N\gt 0 ~"then"~ N := N+1\\
+ dX := dX + d/2 ~"where"~ d = |\sd@X|A\\
+ dY := dY + d/2 ~"where"~ d = |\sd@Y|B\\
+ "if"~ dX\gt 0 ~"then"~ X := X + A/2\\
+ Y := Y + |\sd@Y|A/2\\
+\end{array}
+$$
+\DOCMODE(
+\xydef@\dashedSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
+ \advance\d@X\sd@X.5\A@ \advance\d@Y\sd@Y.5\B@
+ \ifdim\z@<\d@X \advance\X@c.5\A@ \fi \advance\Y@c\sd@Y.5\B@}
+\DOCMODE)
+
+ Dashed dashing of squiggled lines are simpler since squiggles are
+ symmetric:
+
+\DOCMODE(
+\xydefcsname@{dir1{~~}}{\dashsquiggle@}
+\xydefcsname@{dir2{~~}}{\dashsquiggle@ \double@\xybsqlh@}
+\xydefcsname@{dir3{~~}}{\dashsquiggle@ \triple@\xybsqlh@}
+\xyletcsnamecsname@{dir0{~~}}{dir{}}
+\xyletcsnamecsname@{dir{~~}}{dir1{~~}}
+
+\xydef@\dashsquiggle@{\squiggle@
+ \multiply\D@c\tw@ \multiply\U@c\tw@ \multiply\L@c\tw@ \multiply\R@c\tw@
+ \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c
+ \def\Connect@@{\straight@\dashsquiggledSpread@}}
+\DOCMODE)
+
+ The spreading of squiggles is similarly simpler: we just shave $1/4$
+ squiggle size of each end of the conection in order to eliminate the
+ blank space at both ends:
+
+\DOCMODE(
+\xydef@\dashsquiggledSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
+ \advance\X@c.5\A@ \advance\d@X.5\A@ \advance\Y@c.25\B@ \advance\d@Y.5\B@}
+\DOCMODE)
+
+ Finally ``dashed dotting'' synonyms:
+
+\DOCMODE(
+\xyletcsnamecsname@{dir1{..}}{dir{.}}
+\xyletcsnamecsname@{dir2{..}}{dir2{.}}
+\xyletcsnamecsname@{dir3{..}}{dir3{.}}
+\xyletcsnamecsname@{dir{..}}{dir1{.}}
+\xyletcsnamecsname@{dir{::}}{dir2{.}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[Plain tips]
+
+ The group of "plain tips" contains basic objects that are useful as
+ markers and arrowheads making connections, so each is shown at the
+ end of a dotted connection of the appropriate kind.
+
+ They may also be used as connectors and will build dotted
+ connections. \eg, |**@{>}| typesets
+$$
+ \xy 0*++{}; (10,3)*++{} **@{>} \endxy
+$$
+
+\begin{exercise}
+ Typeset the following two $+$s and a tilted square:
+\begin{code}
+$$\xy
+ *{+}; p+(6,3)*{+} **{} ?(1)
+ *@{-} *!/-5pt/^\dir{-}
+ *^\dir{-} *!/^-5pt/\dir{-}
+\endxy$$
+\end{code}
+\docode
+%
+ "Hint": the dash created by |\dir{-}| has the length |5pt| (here).
+%
+\answercode
+\answertext{One way is}
+\answertext\displaycode
+\answertext{Thus we first create the two $+$s as $p$ and $c$ and connect them
+ with the dummy connection |**{}| to setup the direction parameters.
+ Then we move `on top of $c$' with |?(1)| and position the four sides
+ of the square using |^| and |_| for local direction changes and
+ |/|<dimen>|/| for skewing the resulting object by moving its
+ reference point in the opposite direction.}%
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xylet@\ctipEdge@=\czeroEdge@
+\DOCMODE)
+
+ \TODO: Change tips to have a tiny size of 2sp which may be taken as
+ an indication that it is a tip (this can be used by some features,
+ \eg, `arrow').
+
+\paragraph*{Arrow heads:}
+
+ The ones intended for single connections are just characters from
+ ??c![\xyatipfont] and ??c![\xybtipfont].
+
+\DOCMODE(
+\xydefcsname@{dir1{>}}{\tip@}
+\xydefcsname@{dir^{>}}{\atip@}
+\xydefcsname@{dir_{>}}{\btip@}
+\xyletcsnamecsname@{dir0{>}}{dir{}}
+\xyletcsnamecsname@{dir{>}}{dir1{>}}
+
+\xydefcsname@{dir1{<}}{\reverseDirection@\tip@}
+\xydefcsname@{dir^{<}}{\reverseDirection@\btip@}
+\xydefcsname@{dir_{<}}{\reverseDirection@\atip@}
+\xyletcsnamecsname@{dir0{<}}{dir{}}
+\xyletcsnamecsname@{dir{<}}{dir1{<}}
+
+\xydef@\tip@{\tip@x\tip@@}
+\xydef@\atip@{\tip@x\atip@@}
+\xydef@\btip@{\tip@x\btip@@}
+
+\xydef@\tip@x#1{#1\egroup
+ \ctipEdge@ %\Invisible@false \Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+
+\xydef@\tip@@{\atip@@\btip@@}
+\xydef@\atip@@{\xyatipfont\DirectionChar}
+\xydef@\btip@@{\xybtipfont\DirectionChar}
+\DOCMODE)
+
+ Double and triple tips are realised by taking the two halfs and
+ `wringing them apart'; as the naming indicates they are meant to be
+ put at the end of |2|- and |3|-connections. This is currently done
+ the slightly hacky (but efficient) way of adding directly to
+ ??c![\DirectionChar]; maybe this should be using |\vDirection@|?
+
+\DOCMODE(
+\xydefcsname@{dir2{>}}{\Tip@}
+\xydefcsname@{dir2{<}}{\reverseDirection@\Tip@}
+
+\xydef@\Tip@{\kern2.5pt \vrule height2.5pt depth2.5pt width\z@
+ \Tip@@ \kern2.5pt \egroup
+ \U@c=2.5pt \D@c=2.5pt \L@c=2.5pt \R@c=2.5pt \Edge@c={\circleEdge}%
+% \Invisible@false \Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+
+\xydef@\Tip@@{\count@=\DirectionChar
+ \advance\count@-4 \ifnum\count@<\z@ \advance\count@128 \fi
+ \xyatipfont\char\count@
+ \advance\count@ 8 \ifnum127<\count@ \advance\count@-128 \fi
+ \xybtipfont\char\count@}
+
+\xydefcsname@{dir3{>}}{\Ttip@}
+\xydefcsname@{dir3{<}}{\composite@{}{:(-1,0)\dir3{>}}}
+
+\xydef@\Ttip@{\kern3.2pt \vrule height3.2pt depth3.2pt width\z@
+ \Ttip@@ \kern3.2pt \egroup
+ \U@c=3.2pt \D@c=3.2pt \L@c=3.2pt \R@c=3.2pt \Edge@c={\circleEdge}%
+% \Invisible@false \Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+
+\xydef@\Ttip@@{%
+ \setboxz@h\bgroup\reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c
+ {\vDirection@(1,-.31)\xydashl@ \xyatipfont\char\DirectionChar}%
+ {\vDirection@(1,+.31)\xydashl@ \xybtipfont\char\DirectionChar}}
+\DOCMODE)
+
+\paragraph*{Stopper:}
+
+ |\dir{||}| makes a `stopper' using just the appropriate
+ ??c![\xydashfont] character rotated $90^\circ$ and centered; the |^|
+ and |_| variants are just shifted appropriately and two are used to
+ make the |2| and |3| variants longer.
+
+\DOCMODE(
+\xydefcsname@{dir1{|}}{\stopper@}
+\xydefcsname@{dir^{|}}{\aboveDirection@\xydashl@
+ \shiftdir@\line@\z@ \pointlike@{}\xydashh@}
+\xydefcsname@{dir_{|}}{\belowDirection@\xydashl@
+ \shiftdir@\line@\z@ \pointlike@{}\xydashh@}
+\xydefcsname@{dir2{|}}{\stopper@ \double@\xydashh@}
+\xydefcsname@{dir3{|}}{\stopper@ \double@{2\xydashh@}}
+
+\xyletcsnamecsname@{dir0{|}}{dir{}}
+\xyletcsnamecsname@{dir{|}}{dir1{|}}
+
+\xydef@\stopper@{\tip@x\stopper@@}
+
+\xydef@\stopper@@{\setboxz@h{\count@=\SemiDirectionChar \advance\count@64 %
+ \ifnum127<\count@ \advance\count@-128 \fi \xydashfont\char\count@\/}%
+ \setboxz@h{\kern-.5\wdz@ \dimen@=\sd@Y\cosDirection\xydashl@
+ \ifnum\SemiDirectionChar=95 \dimen@=\sd@X\sd@Y\dimen@ \fi
+ \raise.5\dimen@\boxz@}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\DOCMODE)
+
+\paragraph*{Hooks:}
+
+ These are halfcircles opening towards or opposite ??c![\Direction] and
+ fastened by their center or either endpoint. Build by lots of box
+ manipulation with the ??c![\xybsqlfont] quarter circles\dots\smiley
+
+\DOCMODE(
+\xydefcsname@{dir1{(}}{\hook@}
+\xydefcsname@{dir^{(}}{\ahook@}
+\xydefcsname@{dir_{(}}{\bhook@}
+\xyletcsnamecsname@{dir0{(}}{dir{}}
+\xyletcsnamecsname@{dir{(}}{dir1{(}}
+
+\xydefcsname@{dir1{)}}{\reverseDirection@\hook@}
+\xydefcsname@{dir^{)}}{\reverseDirection@\bhook@}
+\xydefcsname@{dir_{)}}{\reverseDirection@\ahook@}
+\xyletcsnamecsname@{dir0{)}}{dir{}}
+\xyletcsnamecsname@{dir{)}}{dir1{)}}
+
+\xydef@\hook@{\tip@x\hook@@}
+\xydef@\hook@@{\setboxz@h{\xybsqlfont
+ \vDirection@(1,-1){.707107\xybsqll@}%
+ \hbox{\DirectionChar
+ \kern-\d@Y\raise\d@X\hbox{\count@=\DirectionChar \advance\count@-32 %
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+
+\xydef@\ahook@{\tip@x\ahook@@}
+\xydef@\ahook@@{\setboxz@h{\xybsqlfont
+ \vDirection@(1,-1){.707107\xybsqll@}\kern-\d@X
+ \lower\d@Y\hbox{\DirectionChar
+ \kern-\d@Y\raise\d@X\hbox{\count@=\DirectionChar \advance\count@-32 %
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+
+\xydef@\bhook@{\tip@x\bhook@@}
+\xydef@\bhook@@{\setboxz@h{\xybsqlfont
+ \vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar
+ \kern\d@X\raise\d@Y\hbox{\count@=\DirectionChar \advance\count@-96 %
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\DOCMODE)
+
+\paragraph*{Quarter turns:}
+
+ These are quarter circles fastened by their start or end point in
+ ??c![\Direction]. Build by box manipulation of the ??c![\xybsqlfont]
+ quarter circles. The intention is that the |`'| directionals are
+ half the corresponding |()| directional.
+
+\DOCMODE(
+\xydefcsname@{dir^{'}}{\reverseDirection@\bturn@}
+\xydefcsname@{dir_{'}}{\reverseDirection@\aturn@}
+
+\xydefcsname@{dir^{`}}{\aturn@}
+\xydefcsname@{dir_{`}}{\bturn@}
+
+\xydef@\aturn@{\tip@x\aturn@@}
+\xydef@\aturn@@{\setboxz@h{\xybsqlfont
+ \vDirection@(1,-1){.707107\xybsqll@}\kern-\d@X
+ \lower\d@Y\hbox{\DirectionChar}}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+
+\xydef@\bturn@{\tip@x\bturn@@}
+\xydef@\bturn@@{\setboxz@h{\xybsqlfont
+ \vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[Constructed tips]
+
+ These tips are combinations of the plain tips provided for
+ convenience (and optimised for efficiency). New ones can be
+ constructed using ??c![\composite] and by declarations of the form
+%
+\begin{defs1}
+%
+ ??c![\newdir] <dir> |{|<composite>|}|\cr
+%
+\end{defs1}
+\noindent\unskip
+%
+ which defines ??c![\dir]<dir> as the <composite> (see note~??[composite
+ object box] for the details).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ ??c![\newdir] is simple:
+
+\DOCMODE(
+\xydef@\newdir#1#{\newdir@{#1}}
+
+\xydef@\newdir@#1#2#3{\xydefcsname@{dir#1{#2}}{\composite@{}{#3}}}
+\DOCMODE)
+
+ Then the somewhat more efficient |\shiftdir@| used internally for
+ moving a tip in the current direction---it does so by making a local
+ hbox within which the argument tip is constructed and subsequently
+ shifted and made of zero size. Use as
+$$
+ |\shiftdir@|<tip@><dimen><tip@>
+$$
+ where <tip@> means a tip command without the leading |\hbox{|.
+
+\DOCMODE(
+\xydef@\shiftdir@#1#2{%
+ \setbox\z@=\hbox\bgroup#1\relax
+ \setboxz@h{\dimen@ii=#2\relax
+ \dimen@=-\cosDirection\dimen@ii \advance\dimen@-\L@c
+ \kern\dimen@ \lower\sinDirection\dimen@ii\boxz@}%
+ \wdz@\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+\DOCMODE)
+
+ Then the tips, with the |\tipjot@| hook allowing changing the spacing
+ of tips used for single lines.
+
+\DOCMODE(
+\xylet@\tipjot@=\jot
+
+\xydefcsname@{dir1{>>}}{\shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir^{>>}}{\shiftdir@\atip@\tipjot@ \atip@}
+\xydefcsname@{dir_{>>}}{\shiftdir@\btip@\tipjot@ \btip@}
+\xydefcsname@{dir2{>>}}{\composite@{}{h!/\tipjot@/\dir2{>}*\dir2{>}}}
+\xydefcsname@{dir3{>>}}{\composite@{}{h!/\tipjot@/\dir3{>}*\dir3{>}}}
+\xyletcsnamecsname@{dir0{>>}}{dir{}}
+\xyletcsnamecsname@{dir{>>}}{dir1{>>}}
+
+\xydefcsname@{dir1{<<}}{\reverseDirection@ \shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir^{<<}}{\reverseDirection@ \shiftdir@\btip@\tipjot@ \btip@}
+\xydefcsname@{dir_{<<}}{\reverseDirection@ \shiftdir@\atip@\tipjot@ \atip@}
+\xydefcsname@{dir2{<<}}{\composite@{}{h!/-\tipjot@/\dir2{<}*\dir2{<}}}
+\xydefcsname@{dir3{<<}}{\composite@{}{h!/-\tipjot@/\dir3{<}*\dir3{<}}}
+\xyletcsnamecsname@{dir0{<<}}{dir{}}
+\xyletcsnamecsname@{dir{<<}}{dir1{<<}}
+
+\xydefcsname@{dir1{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
+ \pointlike@{}\jot}
+\xydefcsname@{dir^{||}}{\shiftdir@{\aboveDirection@\xydashl@\line@}\xydashh@
+ \shiftdir@{\aboveDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
+\xydefcsname@{dir_{||}}{\shiftdir@{\belowDirection@\xydashl@\line@}\xydashh@
+ \shiftdir@{\belowDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
+\xydefcsname@{dir2{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
+ \pointlike@{}\jot \double@\xydashh@}
+\xydefcsname@{dir3{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
+ \pointlike@{}\jot \double@{2\xydashh@}}
+\xyletcsnamecsname@{dir0{||}}{dir{}}
+\xyletcsnamecsname@{dir{||}}{dir1{||}}
+
+\xydefcsname@{dir1{>|}}{\shiftdir@\stopper@\z@ \tip@}
+\xydefcsname@{dir2{>|}}{\composite@{}{\dir2{>}*\dir2{|}}}
+\xydefcsname@{dir3{>|}}{\composite@{}{\dir3{>}*\dir3{|}}}
+\xyletcsnamecsname@{dir0{>|}}{dir{}}
+\xyletcsnamecsname@{dir{>|}}{dir1{>|}}
+
+\xydefcsname@{dir1{>>|}}{\shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir2{>>|}}{\composite@{}{h!/\tipjot@/\dir2{>}*\dir2{>}*\dir2{|}}}
+\xydefcsname@{dir3{>>|}}{\composite@{}{h!/\tipjot@/\dir3{>}*\dir3{>}*\dir3{|}}}
+\xyletcsnamecsname@{dir0{>>|}}{dir{}}
+\xyletcsnamecsname@{dir{>>|}}{dir1{>>|}}
+
+\xydefcsname@{dir1{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \tip@}
+\xydefcsname@{dir2{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \Tip@}
+\xydefcsname@{dir3{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \Ttip@}
+\xyletcsnamecsname@{dir0{|<}}{dir{}}
+\xyletcsnamecsname@{dir{|<}}{dir1{|<}}
+
+\xydefcsname@{dir1{|<<}}{\reverseDirection@
+ \shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
+\xydefcsname@{dir2{|<<}}{%
+ \composite@{}{h!/-\tipjot@/\dir2{<}*\dir2{<}*\dir2{|}}}
+\xydefcsname@{dir3{|<<}}{%
+ \composite@{}{h!/-\tipjot@/\dir3{<}*\dir3{<}*\dir3{|}}}
+\xyletcsnamecsname@{dir0{|<<}}{dir{}}
+\xyletcsnamecsname@{dir{|<<}}{dir1{|<<}}
+
+\xydefcsname@{dir1{|-}}{\shiftdir@\stopper@\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot}
+\xydefcsname@{dir^{|-}}{\shiftdir@{\aboveDirection@\xydashl@ \line@}\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot}
+\xydefcsname@{dir_{|-}}{\shiftdir@{\belowDirection@\xydashl@ \line@}\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot}
+\xydefcsname@{dir2{|-}}{\shiftdir@\stopper@\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot \double@\xydashh@}
+\xydefcsname@{dir3{|-}}{\shiftdir@\stopper@\z@
+ \shiftdir@\line@\z@ \pointlike@{}\jot \triple@\xydashh@}
+\xyletcsnamecsname@{dir0{|-}}{dir{}}
+\xyletcsnamecsname@{dir{|-}}{dir1{|-}}
+\xyletcsnamecsname@{dir{|=}}{dir2{|-}}
+
+\xydefcsname@{dir{+}}{%
+ \DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
+\xyletcsnamecsname@{dir0{+}}{dir{}}
+
+\xydefcsname@{dir{x}}{\vDirection@(1,1)\jot
+ \DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
+\xyletcsnamecsname@{dir0{x}}{dir{}}
+
+\xydefcsname@{dir{/}}{\vDirection@(1,-.3)\jot \stopper@}
+\xyletcsnamecsname@{dir0{/}}{dir{}}
+
+\xydefcsname@{dir{//}}{\vDirection@(1,-.3)\jot
+ \shiftdir@\stopper@\xydashh@ \stopper@}
+\xyletcsnamecsname@{dir0{//}}{dir{}}
+
+\xydefcsname@{dir{*}}{\solidpoint@}
+\xydef@\solidpoint@{%
+ \pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\bullet$}}\jot}
+\xyletcsnamecsname@{dir0{*}}{dir{}}
+
+\xydefcsname@{dir{o}}{\hollowpoint@}
+\xydef@\hollowpoint@{%
+ \pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\circ$}}\jot}
+\xyletcsnamecsname@{dir0{o}}{dir{}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{figure*}[ht]
+\vss
+\begin{syntax}
+%
+ \multispan3|\cir| <radius> |{| <cir> |}|\hfil
+ & <cir>cle segment with <radius>
+\cr
+\noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+%
+ ??w![<radius>]
+ &\iss & <empty>
+ & use $R_c$ as the radius
+\cr
+ &\orr & <vector>
+ & use $X$ of the <vector> as radius
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<cir>]
+ &\iss & <empty>
+ & full circle of <radius>
+\cr
+ &\orr & <diag> <orient> <diag>
+ & partial circle from first <diag>onal through to the
+ second <diag>onal in the <orient>ation
+\cr
+\noalign{\smallbreak}
+%
+ ??w![<orient>]
+ &\iss & |^|
+ & anticlockwise
+\cr
+ &\orr & |_|
+ & clockwise
+\cr
+\end{syntax}
+\caption{\protect<cir>cles.}
+??=[f.cir]
+\vfill
+\end{figure*}
+
+
+\subsection{Circle segments}
+??=[objectlib.circles]
+
+\DOCMODE(
+\message{circles,}
+\DOCMODE)
+
+ Circle <object>s are round and typeset a segment of the circle
+ centered at the reference point. The syntax of circles is described
+ in figure~??[f.cir] with explanations below.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The |\cir| command is the hub: it parses the optional <radius> (to
+ |\R@|, default from $R_c$) and |{|<cir>|}|, bailing out with a
+ |\zerodot| if the radius is to small:
+
+\DOCMODE(
+\xydef@\cir#1#{\hbox\bgroup
+ \afterVECTORorEMPTY{\xy@@{\R@=\X@c}\cir@}{\xy@@{\R@=\R@c}\cir@}#1@}
+
+\xydef@\cir@#1@#2{%
+ \DN@{#1}\ifx\next@\empty\else \xyerror@{illegal circle <radius>: must be
+ <vector> or <empty>}{}\fi
+ \afterCIRorDIAG{\xyFN@\cir@cir}{\xyFN@\cir@diag}#2@}
+\DOCMODE)
+
+ The code to actually typeset the <cir> just parsed starts by checking
+ that the <cir> was immediately followed by the |@| we put there in
+ |\cir|:
+
+\DOCMODE(
+\xydef@\cir@cir{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\cir@cir}%gobble spaces
+ \else \ifx @\next \DN@ @{\cir@i}%
+ \else \xyerror@{illegal <cir>: must have form <diag><orient><diag> or
+ <empty>}{}%
+ \fi\fi \next@}
+\DOCMODE)
+
+ Similarly when an <empty> one was given---the parser will recognise
+ this as a <diag> but we hack that here:
+
+\DOCMODE(
+\xydef@\cir@diag{%
+ \DN@{\xyerror@{illegal <cir>: must have form <diag><orient><diag> or
+ <empty>}{}}%
+ \ifx @\next \ifnum\count@=8 %
+ \DN@ @{\def\CIRin@@{0}\def\CIRorient@@{\CIRfull@}\def\CIRout@@{7}\cir@i}%
+ \fi\fi \next@}
+\DOCMODE)
+
+ \dots and then use the constructed methods to build it:
+
+\DOCMODE(
+\xydef@\cir@i{%
+ \ifnum\CIRin@@=8 \xyerror@{incomplete <cir> specification}{%
+The <cir> you specified as <diag><orient><diag> is not sufficiently specific.}%
+ \def\CIRin@@{0}\fi
+ \ifdim\R@<.5\p@ \R@=\z@ \zerodot
+ \else \CIRorient@@ \cirbuild@ \fi
+ \L@c=\R@ \R@c=\R@ \D@c=\R@ \U@c=\R@ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}%
+ \Edge@c={\circleEdge}\OBJECT@x}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Parsing:}
+
+ The |\afterCIRorDIAG| parser handles the parsing: it either
+%
+\begin{itemize}
+
+\item
+ parses the <cir> and sets "in", "orient", and "out", and passes
+ control to the first argument continuation, or
+
+\item
+ parses the single <diag> specified, store it in |\count@| (as |8| if
+ an <empty> one given), and pass control to the second continuation
+ argument,
+
+\end{itemize}
+%
+ where the <diag> internal representation number of note~??[diagonal]
+ of is used. An <empty> circle is treated as an <empty> diagonal;
+ specifying an <empty> first <diag> of a <cir> is equivalent to using
+ the value of the "in" method at call time.
+
+ The parser is very simple, setting methods stored in the usual
+ |@@|-terminated control sequences (\TODO: Rename all non-method
+ control sequences that end in |@@|\dots to use |@|<romannumeral>
+ suffixes\dots):
+
+\DOCMODE(
+\xydef@\CIRin@@{3}
+\xydef@\CIRout@@{3}
+\xylet@\CIRorient@@=\empty
+
+\xydef@\afterCIRorDIAG#1#2{\def\afterCIR@{#1}\def\afterCIRDIAG@{#2}\xyFN@\CIR@}
+
+\xylet@\afterCIR@=\empty
+\xylet@\afterCIRDIAG@=\empty
+
+\xydef@\CIR@{\count@=8 \afterDIAG{\edef\CIRin@@{\the\count@}\xyFN@\CIR@@}}
+
+\xydef@\CIR@@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\CIR@@}%gobble spaces
+ \else\ifx ^\next
+ \DN@ ^{\def\CIRorient@@{\CIRacw@}%
+ \afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
+ \else\ifx _\next
+ \DN@_{\def\CIRorient@@{\CIRcw@}%
+ \afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
+ \else
+ \DN@{\def\CIRorient@@{\relax}\afterCIRDIAG@}%
+ \fi\fi\fi \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The default is to generate a "full circle" with the specified radius,
+ \eg,
+$$
+\def\quotesmash#1{\setbox0=\hbox{``$\vcenter{#1}$''}\ht0=8pt \dp0=3pt \box0}
+\begin{array}{ccc}
+ |\xy*\cir<4pt>{}\endxy|
+ &\hbox{typesets}& \quotesmash{\xy*\cir<4pt>{}\endxy}
+\cr
+ |\xy*{M}*\cir{}\endxy|
+ &\hbox{---}& \quotesmash{\xy*{M}*\cir{}\endxy}
+\end{array}
+$$
+ All the other circle segments are subsets of this and have the shape
+ that the full circle outlines.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Finally we present the "orient" methods. They use these `internal
+ methods' to actually draw the circles
+
+\DOCMODE(
+\xylet@\CIRtest@@=\relax
+\xydef@\CIRlo@@{0}
+\xydef@\CIRhi@@{0}
+\DOCMODE)
+
+ Below we call them "lo", "hi", and "test"; the first two are coded as
+ described in note ??[diagonal] and the last takes two arguments: a
+ dimension and something to do if the test succeeds. |\count@@| and
+ |\count@| should be set to "in" and "out" internally as well in case
+ |\cirbuild@| and friends below should be used.
+
+ The dummy "orient" used for simple circles is the simplest:
+
+\DOCMODE(
+\xydef@\CIRfull@{\def\CIRtest@@##1##2{##2}}
+\DOCMODE)
+
+ The kernel |\cirbuild@| builds the actual <object> using characters
+ from the ??c![\xycircfont] assumed coded like |xycirc10.mf|:
+ |\cirrestrict@@| choses a group and adjusts the radius |\R@| to fit it
+ exactly. The group is multiplied by 8 to get the group character
+ offset [|\count@|].
+
+\DOCMODE(
+\xydef@\cirbuild@{\cirrestrict@@ \multiply\count@8 %
+ \circhar@0\circhar@7\kern\dimen@
+ \circhar@1\circhar@6\kern\dimen@
+ \circhar@2\circhar@5\kern\dimen@
+ \circhar@3\circhar@4\kern\dimen@}
+
+\xydef@\circhar@#1{%
+ \setboxz@h{\circhar@@{#1}}\dimen@=\wdz@ \wdz@=\z@ \ht\z@=\R@ \dp\z@=\R@
+ \CIRtest@@#1{\styledboxz@}\setbox\z@=\copy\voidb@x}
+
+\xydef@\circhar@@#1{{\xycircfont \advance\count@#1\relax \char\count@}}
+\DOCMODE)
+
+ |\cirrestrict@@| computes the group $g$ [|\count@|] of circle segments
+ to use from the radius $r$ [|\R@|] using the formula (the reverse of
+ the one in |xycirc10.mf|)
+$$
+\def\arraystretch{1}
+g = \left\{ \begin{array}{ll}
+ \floor{r\over1|pt|}-1 &\textrm{if}~ 1|pt|\le r\lt 8|pt|\\
+ \floor{r\over2|pt|}+3 &\textrm{if}~ 8|pt|\le r\lt 16|pt|\\
+ \floor{r\over4|pt|}+7 &\textrm{if}~16|pt|\le r\lt 32|pt|\\
+ 15 &\textrm{if}~32|pt|\le r \end{array}
+\right.
+$$
+ (where we know from |\cir@i| that $r\ge\frac12|pt|$), and then
+ adjusts the radius to be exactly the one chosen through the use of
+ group $g$ using the formula in |xycirc10.mf|\dots this is necessary
+ because of the restriction on |tfm| files that they can only have 15
+ different nonzero heights and depths. Subsequent calls to
+ |\cirrestrict@@| should compute the same values.
+
+\DOCMODE(
+\xydef@\cirrestrict@@{\begingroup \dimen@=\R@
+ \setboxz@h{\xycircfont\char\z@\char\@ne}\A@=\wdz@
+ \ifdim\R@<8\A@ \count@=\dimen@ \divide\count@\A@ \advance\count@\m@ne
+ \else\ifdim\R@<16\A@ \count@=\dimen@
+ \dimen@=2\A@ \divide\count@\dimen@ \advance\count@3 %
+ \else\ifdim\R@<32\A@ \count@=\dimen@
+ \dimen@=4\A@ \divide\count@\dimen@ \advance\count@7 %
+ \else \count@=15 \fi\fi\fi
+ \R@=\A@
+ \ifnum\count@<8 \multiply\R@\count@ \advance\R@\A@
+ \else\ifnum\count@<12 \multiply\R@\count@ \multiply\R@\tw@ \advance\R@-6\A@
+ \else\ifnum\count@<16 \multiply\R@\count@ \multiply\R@ 4 \advance\R@-28\A@
+ \else \multiply\R@ 32 \fi\fi\fi
+ \edef\@tmp{\endgroup \R@=\the\R@ \count@=\the\count@}\@tmp}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ "Partial circle segments" with <orient>ation are the part of the full
+ circle that starts with a tangent vector in the direction of the
+ first <diag>onal (see note~??[diagonal]) and ends with a tangent
+ vector in the direction of the other <diag>onal after a clockwise
+ (for |_|) or anticlockwise (for |^|) turn, \eg,
+$$
+\def\quotesmash#1{\setbox0=\hbox{``$\vcenter{#1}$''}\ht0=8pt \dp0=3pt \box0}
+\begin{array}{ccc}
+ |\xy*\cir<4pt>{l^r}\endxy|
+ &\hbox{typesets}& \quotesmash{\xy*\cir<4pt>{l^r}\endxy}
+\\
+ |\xy*\cir<4pt>{l_r}\endxy|
+ &\hbox{---}& \quotesmash{\xy*\cir<4pt>{l_r}\endxy}
+\\
+ |\xy*\cir<4pt>{dl^u}\endxy|
+ &\hbox{---}& \quotesmash{\xy*\cir<4pt>{dl^u}\endxy}
+\\
+ |\xy*\cir<4pt>{dl_u}\endxy|
+ &\hbox{---}& \quotesmash{\xy*\cir<4pt>{dl_u}\endxy}
+\\
+ |\xy*+{M}*\cir{dr_ur}\endxy|
+ &\hbox{---}& \quotesmash{\xy*+{M}*\cir{dr_ur}\endxy}
+\end{array}
+$$
+ If the same <diag> is given twice then nothing is typeset, \eg,
+$$
+\def\quotesmash#1{\setbox0=\hbox{``$\vcenter{#1}$''}\ht0=8pt \dp0=3pt \box0}
+\begin{array}{ccc}
+ |\xy*\cir<4pt>{u^u}\endxy|
+ &\hbox{typesets}& \quotesmash{\xy*\cir<4pt>{u^u}\endxy}
+\end{array}
+$$
+ Special care is taken to setup the <diag>onal defaults:
+%
+\begin{itemize}
+
+\item
+ After |^| the default is the diagonal $90^\circ$ anticlockwise from
+ the one before the |^|.
+
+\item
+ After |_| the default is the diagonal $90^\circ$ clockwise from the
+ one before the |_|.
+
+\end{itemize}
+%
+ The <diag> before |^| or |_| is required for ??c![\cir] <objects>.
+
+\begin{exercise}
+ Typeset the following shaded circle with radius |5pt|:
+%
+\begin{code}
+$$\xy
+ *\cir<5pt>{}
+ *!<-.2pt,.2pt>\cir<5pt>{dr^ul}
+ *!<-.4pt,.4pt>\cir<5pt>{dr^ul}
+ *!<-.6pt,.6pt>\cir<5pt>{dr^ul}
+\endxy$$
+\end{code}
+\docode
+%
+\answertext{One way is to add extra half circles skewed such that they create
+ the illusion of a shade:}
+\answercode
+\answertext\displaycode
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ These two macros implement the defaults and setup of "lo" and "hi"
+ for anticlockwise and clockwise segments. Here is what they set:
+$$
+\begin{array}{\otherbar c\otherbar cc\otherbar l\otherbar}
+\hline
+ ??w![<cir>] & "lo" & "hi" & "test"(s) \\
+\hline
+ d_1|^|d_2, d_1\le d_2 & d_1 -_8 1 & d_2 -_8 1 & {"lo"\le s}\wedge{s\lt "hi"}\\
+ d_1|^|d_2, d_1\gt d_2 & d_2 -_8 1 & d_1 -_8 1 & {s \lt"lo"} \vee {"hi"\le s}\\
+ d_1|_|d_2, d_1\lt d_2 & d_1 +_8 3 & d_2 +_8 3 & {s \lt"lo"} \vee {"hi"\le s}\\
+ d_1|_|d_2, d_1\ge d_2 & d_2 +_8 3 & d_1 +_8 3 & {"lo"\le s}\wedge{s\lt "hi"}\\
+\hline
+\end{array}
+$$
+ where $+_8$ and $-_8$ are $+$ and $-$ modulo 8; $d_1$ and $d_2$ are
+ in |\count@@| and |\count@|, respectively.
+
+\DOCMODE(
+\xydef@\CIRacw@{\count@@=\CIRin@@ \count@=\CIRout@@
+ \ifnum\count@=8 \count@=\count@@
+ \ifnum\count@<6 \advance\count@\tw@ \else \advance\count@-6 \fi \fi
+ \ifnum\count@@<\@ne \advance\count@@7 \else \advance\count@@\m@ne \fi
+ \ifnum\count@<\@ne \advance\count@7 \else \advance\count@\m@ne \fi
+ \ifnum\count@@>\count@ \let\CIRtest@@=\CIRtest@outside
+ \edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
+ \else \let\CIRtest@@=\CIRtest@inside
+ \edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
+ \fi}
+
+\xydef@\CIRcw@{\count@@=\CIRin@@ \count@=\CIRout@@
+ \ifnum\count@=8 \count@=\count@@
+ \ifnum\count@>\@ne \advance\count@-\tw@ \else \advance\count@6 \fi \fi
+ \ifnum\count@@<5 \advance\count@@\thr@@ \else \advance\count@@-5 \fi
+ \ifnum\count@<5 \advance\count@\thr@@ \else \advance\count@-5 \fi
+ \ifnum\count@@<\count@ \let\CIRtest@@=\CIRtest@outside
+ \edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
+ \else \let\CIRtest@@=\CIRtest@inside
+ \edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
+ \fi}
+
+\xydef@\CIRtest@inside#1#2{\let\next@=\relax
+ \ifnum\CIRlo@@>#1\else \ifnum#1<\CIRhi@@\DN@{#2}\fi\fi \next@}
+
+\xydef@\CIRtest@outside#1#2{\let\next@=\relax
+ \ifnum\CIRlo@@>#1\DN@{#2}\else \ifnum#1<\CIRhi@@\else\DN@{#2}\fi\fi \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Text}
+??=[objectlib.text]
+
+\DOCMODE(
+\message{text;}
+\DOCMODE)
+
+ Text in pictures is supported through the <object> construction
+%
+\begin{defs1}
+??c![\txt] <width> <style> |{|<text>|}|\cr
+\end{defs1}
+\noindent\unskip
+%
+ that builds an object containing <text> typeset to <width> using
+ <style>; in <text> |\\| can be used as an explicit line break; all
+ lines will be centered. <style> should either be a font command or
+ some other stuff to do for each line of the <text> and <width> should
+ be either |<|<dimen>|>| or <empty>.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The code just parses the <width> defaulting it to |<\maxdimen>| which
+ is recognised as `free form'.
+
+\DOCMODE(
+\xydef@\txt{\hbox\bgroup \xyFN@\txt@}
+
+\xydef@\txt@{%
+ \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\A@=##1\txt@i}%
+ \else \DN@{\A@=\maxdimen \txt@i}\fi \next@}
+
+\xydef@\txt@i#1#{%
+ \setboxz@h{#1\mathstrut}\dimen@=\ht\z@ \advance\dimen@\dp\z@
+ \baselineskip=1.1\dimen@ \lineskip=.2\dimen@ \lineskiplimit=\lineskip
+ \def\txtline@@##1{\txtline@{#1}{##1}}\object@\txt@ii}
+
+\xylet@\txtline@@=\eat@
+\xydef@\txtline@#1#2{\relax\setboxz@h{#1{\ignorespaces #2\unskip}}%
+ \ifdim\A@<\wdz@ \setboxz@h{\hsize=\A@
+ \leftskip=0pt plus4em \rightskip=\leftskip
+ \parfillskip=0pt \parindent=0pt %
+ \spaceskip=.3333em \xspaceskip=.5em %
+ \pretolerance=9999 \tolerance=9999 %
+ \hyphenpenalty=9999 \exhyphenpenalty=9999 %
+ \vbox{#1\noindent\ignorespaces #2\unskip}}%
+ \else\ifdim\A@<\maxdimen\setboxz@h to\A@{\hfil\boxz@\hfil}\fi\fi
+ \boxz@}
+
+\xydef@\txt@ii#1{\vbox{%
+ \let\\=\cr
+ \tabskip=\z@skip \halign{\relax\hfil\txtline@@{##}\hfil\cr\leavevmode#1\crcr}}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{\Xy-pic options}
+??=[option]
+%
+ \NOTE: \LaTeXe\ users should also consult the paragraph on ``xy.sty''
+ in~\S??[env.loading].
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Loading}
+??=[option.loading]
+%
+ \Xy-pic is provided with a growing number of options supporting
+ specialised drawing tasks as well as exotic output devices with
+ special graphic features. These should all be loaded using this
+ uniform interface in order to ensure that the \Xy-pic environment is
+ properly set up while reading the option.
+%
+\begin{defs1}
+%
+ ??c![\xyoption] |{| <option> |}| \cr
+ ??c![\xyrequire] |{| <option> |}|
+%
+\end{defs1}
+\noindent\unskip
+%
+ ??c![\xyoption] will cause the loading of an \Xy-pic option file
+ which can have one of several names. These are tried in sequence:
+ |xy|<option>|.tex|, |xy|<option>|.doc|, |xy|<short>|.tex|, and
+ |xy|<short>|.doc|, where <short> is <option> truncated to 6 (six)
+ characters to conform with the TWG-TDS~\cite{TWG-TDS}.
+
+ ??c![\xyrequire] is the same except it is ignored if an option with
+ the same name is already present (thus does not check the version
+ etc.).
+
+\DOCMODE(
+\message{options;}
+
+\xylet@\xyoption@@=\relax
+
+\xydef@\xyoption#1{\DN@{#1}\edef\next@{\codeof\next@}%
+ \csname xyeveryrequest@\next@ @\endcsname
+ \xyinputorelse@{xy#1}{\xyoption@truncated#1@@@@@@@@@,#1@}%
+ \def\xyoption@@{#1}\edef\xyoption@@{\codeof\xyoption@@}
+ \expandafter\let\expandafter\next@\csname xy\xyoption@@ version\endcsname
+ \expandafter\let\csname xy\xyoption@@ loaded\endcsname=\next@
+ \runxywith@ \ignorespaces}
+
+\xydef@\xyoption@truncated#1#2#3#4#5#6#7@#8,#9@{%
+ \DN@{#7}\ifx\next@\empty \DN@##1##2{##2}\else\let\next@=\xyinputorelse@ \fi
+ \next@{xy#1#2#3#4#5#6}%
+ {\DN@{#1#2#3#4#5#6}\edef\next@{\codeof\next@}%
+ \xyerror@{No `\next@' option}{%
+Your \xyoption{#9} request could not be granted: the required^^J%
+file `xy#9.tex' could not be located. Please make sure that it is^^J%
+properly installed before continuing.}}}
+
+\xydef@\xyrequire#1{\DN@{#1}\edef\next@{\codeof\next@}%
+ \csname xyeveryrequest@\next@ @\endcsname
+ \expandafter\let\expandafter\next@\csname xy\codeof\next@ loaded\endcsname
+ \ifx \next@\relax \DN@{\xyoption{#1}}\else \DN@{\ignorespaces}\fi \next@}
+\DOCMODE)
+
+ Sometimes some declarations of an option or header file or whatever
+ only makes sense after some particular other option is loaded. In
+ that case the code should be wrapped in the special command
+%
+\begin{defs1}
+ ??c![\xywithoption] |{| <option> |}| |{| <code> |}| \cr
+\end{defs1}
+\noindent\unskip
+%
+ which indicates that if the <option> is already loaded then <code>
+ should be executed now, otherwise it should be saved and if <option>
+ ever gets loaded then <code> should be executed afterwards. \NOTE:
+ The <code> should allow more than one execution; it is saved with the
+ catcodes at the time of the ??c![\xywithoption] command.
+
+\DOCMODE(
+\xylet@\xywith@@=\empty
+
+\xydef@\runxywith@{\let\xywithdo@@=\xywithtest@ \xywith@@}
+
+\xydef@\xywithoption#1#2{\DN@{#1}\edef\next@{\codeof\next@}%
+ \expandafter\let\expandafter\nextii@\csname xy\next@ loaded\endcsname
+ \ifx \nextii@\relax
+ \expandafter\def\expandafter\xywith@@\expandafter{\xywith@@
+ \xywithdo@@{#1}{#2}}%
+ \else \expandafter\xywithrun@\expandafter{\next@}{#2}\fi}
+
+\xydef@\xywithtest@#1#2{\DN@{#1}\edef\next@{\codeof\next@}%
+ \ifx\next@\xyoption@@ \expandafter\xywithrun@\expandafter{\next@}{#2}\fi}
+
+\xydef@\xywithrun@#1#2{\csname xyeverywithoption@#1@\endcsname #2}
+\DOCMODE)
+
+ Finally, it is possible to declare <code> as some commands to be
+ executed before every actual execution of
+ ??c![\xywithoption]\-|{|<option>|}|\-|{|\dots|}|, and similarly
+ <code> to be executed before every |\xyoption{|<option>|}| and
+ |\xyrequire{|<option>|}| (collectively called `requests')::
+%
+\begin{defs1}
+ ??c![\xyeverywithoption] |{| <option> |}| |{| <code> |}| \cr
+ ??c![\xyeveryrequest] |{| <option> |}| |{| <code> |}| \cr
+\end{defs1}
+\noindent\unskip
+%
+ This is most often used by an option to activate some hook every time
+ it is requested itself.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ These last two use the usual expansion trickery to define or append
+ to the control sequences named |\xyevery|\-|request@|\-<option>|@|
+ and |\xyevery|\-|withoption@|\-<option>|@| used in the definitions
+ above.
+
+\DOCMODE(
+\xydef@\xyevery@#1#2#3{\DN@{#2}\edef\next@{\codeof\next@}%
+ \expandafter\ifx\csname xyevery#1@\next@ @\endcsname\relax
+ \expandafter\let\csname xyevery#1@\next@ @\endcsname=\empty \fi
+ \DNii@##1{\expandafter\def\expandafter##1\expandafter{##1#3}}%
+ \expandafter\nextii@\csname xyevery#1@\next@ @\endcsname}
+
+\xydef@\xyeveryrequest{\xyevery@{request}}
+\xydef@\xyeverywithoption{\xyevery@{withoption}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Option file format}
+??=[option.fileformat]
+%
+ Option files must have the following structure:
+
+\begin{quote}
+ |%%| <identification> \\
+ |%%| <copyright, \etc>
+
+ |\ifx\xyloaded\undefined \input xy \fi|
+
+ |\xyprovide{|<option>|}{|<name>|}{|<version>|}%| \\
+ \null\qquad\qquad |{|<author>|}{|<email>|}{|<address>|}|
+
+ ??w![<body of the option>]
+
+ ??c![\xyendinput]
+\end{quote}
+%
+ The 6 arguments to ??c![\xyprovide] should contain the following:
+%
+\begin{description}
+
+\item[<option>]
+ Option load name as used in the ??c![\xyoption] command. This should
+ be safe and distinguishable for any operating system and is thus
+ limited to characters chosen among the lowercase letters (|a|--|z|),
+ digits (|0|--|9|), and dash (|-|), and all options should be uniquely
+ identifiable by the first 6 (six) characters only.
+
+\item[<name>]
+ Descriptive name for the option.
+
+\item[<version>]
+ Identification of the version of the option.
+
+\item[<author>]
+ The name(s) of the author(s).
+
+\item[<email>]
+ The electronic mail address(es) of the author(s) "or" the affiliation
+ if no email is available.
+
+\item[<address>]
+ The postal address(es) of the author(s).
+
+\end{description}
+%
+ This information is used not only to print a nice banner but also to
+ (1)~silently skip loading if the same version was preloaded and
+ (2)~print an error message if a different version was preloaded.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The ??c![\xyprovide] command checks that the option is not already
+ loaded and that the loaded version is the same as the preloaded one
+ by checking the existence and contents of the macro
+ |\xy|<option>|loaded|. Finally it calls ??c![\xycatcodes] such that
+ the option internals are loaded in `\TeX\ programming mode'.
+ ??c![\xyendinput] undoes this.
+
+\DOCMODE(
+\xydef@\xyprovide#1#2#3#4#5#6{%
+ \def\xyoption@@{#1}\edef\xyoption@@{\codeof\xyoption@@}\edef\next@{#3}%
+ \message{ Xy-pic option: #2 v.\next@}%
+ \expandafter\let\expandafter\nextii@\csname xy\xyoption@@ loaded\endcsname
+ \ifx \next@\nextii@ \message{not reloaded}\endinput
+ \else
+ \ifx \nextii@\relax\else \xyerror@{Option `\xyoption@@' version mismatch}{%
+You previously loaded, or the format has preloaded, a different version^^J%
+of this option. Just continue to try to load this version instead (and^^J%
+be prepared for a lot of warnings about redefinitions).}%
+ \fi
+ \expandafter\let\csname xy\xyoption@@ version\endcsname=\next@
+ \expandafter\let\expandafter\xyenddocmode@\csname DOCMODE\endcsname
+ \expandafter\let\csname DOCMODE\endcsname\xyprovidedocmode@
+ \xycatcodes
+ \fi \ignorespaces}
+
+\xydef@\xyendinput{\expandafter\let\csname DOCMODE\endcsname=\xyenddocmode@
+ \message{loaded}\xyuncatcodes\endinput}
+\DOCMODE)
+
+ The above is futher complicated because an option may loaded in its
+ |DOCMODE| form (ending in |.doc|). So we make sure that the mode
+ that skips documentation, defined in the |xy.tex| file header, is
+ active now.
+
+\DOCMODE(
+\expandafter\xylet@\expandafter\xyprovidedocmode@\csname DOCMODE\endcsname
+\xylet@\xyenddocmode@=\relax
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The `dummy' option described in~\S??g[:dummy] is a minimal option
+ using the above features. It uses the special |DOCMODE| format to
+ include its own documentation for this document (like all official
+ \Xy-pic options) but this is not a requirement.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Driver options}
+??=[option.drivers]
+%
+ The ??w![<driver>] options described in \GROUP~??g[:drivers] require
+ special attention because each driver can support several
+ ??w![extension] options, and it is sometimes desirable to change
+ <driver> or even mix the support provided by several.\footnote{The
+ kernel support described here is based on the (now defunct)
+ |xydriver| include file by Ross Moore.}
+
+ A <driver> option is loaded as other options with
+ |\xyoption{|<driver>|}| (or through \LaTeXe\ class or package options
+ as described in~\S??[env.loading]). The special thing about a
+ <driver> is that loading it simply declares the name of it,
+ establishes what extensions it will support, and selects it
+ temporarily. Thus the special capabilities of the driver will only
+ be exploited in the produced DVI file if some of these extensions are
+ also loaded and if the driver is still selected when output is
+ produced. Generally, the order in which the options are loaded is
+ immaterial. (Known exceptions affect only internal processing and
+ are not visible to the user in terms of language and expected output.)
+ In particular one driver can be preloaded in a format and a different
+ one used for a particular document.
+
+ The following declarations control this:
+%
+\begin{defs}
+??c![\UseSingleDriver] & forces one driver only \cr
+??c![\MultipleDrivers] & allows multiple drivers \cr
+??c![\xyReloadDrivers] & resets driver information \cr
+\end{defs}
+\noindent\unskip
+%
+ The first command restores the default behaviour: that ony one
+ <driver> is allowed, \ie, each loading of a <driver> option cancels
+ the previous. The second allows consecutive loading of drivers such
+ that when loading a <driver> only the extensions actually supported
+ are selected, leaving other extensions supported by previously
+ selected drivers untouched. Beware that this can be used to create
+ DVI files that cannot be processed by any actual DVI driver program!
+
+ The last command is sometimes required to reset the \Xy-pic <driver>
+ information to a sane state, for example, after having applied one of
+ the other two in the middle of a document, or when using simple
+ formats like plain \TeX\ that do not have a clearly distinguished
+ preamble.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Driver database.}
+
+ The main structure, the list of `loaded' and `selected' <driver>s
+ (ordered by age), is implemented as traditional \TeX\ `|\do|-lists'
+ (applications of |\do{|<driver>|}| to each element).
+
+\DOCMODE(
+\xydef@\xydriversloaded@@{\do{unload}}
+\xylet@\xydriversselected@@=\empty
+\DOCMODE)
+%
+ This is used to provide entry points into a secondary structure that
+ lists for each <driver> the extensions supported by that driver. As
+ should be apparent from the above, only the |unload| <driver> is
+ present initially: it represents the implementation technique used
+ for the extension when no <driver> is selected. Every extension must
+ add an entry which reestablishes the default implementation of the
+ extension:
+
+\DOCMODE(
+\xylet@\xydriver@unload@support@@=\empty
+\DOCMODE)
+%
+ All <driver>s will have a similar structure named
+ |\xydriver@|\-<driver>\-|@support@@| which contains the extensions
+ supported by that particular <driver>: the `signature' of each driver
+ as |\doii|-list with two arguments (hence the |ii|~\smiley~): the
+ extension and the command to install the <driver>-extension
+ combination.
+
+ The two selection principles differ significantly. When only a
+ single <driver> is selectable then all extensions need to be unloaded
+ "before" the selection. When multiple <driver>s are allowed then
+ only the added support needs to be executed.
+
+\DOCMODE(
+\xydef@\selectdriver@#1{\DN@{#1}\edef\next@{\codeof\next@}%
+ \expandafter\selectdriver@@\expandafter{\next@}}
+
+\xydef@\selectdriver@single#1{\xysetup@@{\def\xydriversselected@@{\do{#1}}%
+ \xyLoadDrivers@}\let\selectdriver@@=\changedriver@single}
+
+\xydef@\changedriver@single#1{\xysetup@@{\def\xydriversselected@@{\do{#1}}%
+ \xyReloadDrivers@}}
+
+\xydef@\selectdriver@multiple#1{\expandafter\xysetup@@\expandafter{%
+ \expandafter\def\expandafter\xydriversselected@@\expandafter{%
+ \xydriversselected@@ \do{#1}}%
+ \let\do=\activatedriver@ \xydriversselected@@}}
+
+\xydef@\UseSingleDriver{\let\selectdriver@@=\selectdriver@single}
+\xydef@\MultipleDrivers{\let\selectdriver@@=\selectdriver@multiple}
+
+\xydef@\xyLoadDrivers@{\let\do=\activatedriver@ \xydriversselected@@}
+\xydef@\xyReloadDrivers@{\activatedriver@{unload}\xyLoadDrivers@}
+\xylet@\xyReloadDrivers=\xyReloadDrivers@
+
+\xydef@\activatedriver@#1{%
+ \let\doii=\activatedriversupport@ \csname xydriver@#1@support@@\endcsname}
+
+\xydef@\activatedriversupport@#1#2{%
+ \expandafter\ifx\csname xy#1loaded\endcsname\relax\DN@{}%
+ \else\DN@{#2}\fi \next@}
+
+\UseSingleDriver
+\DOCMODE)
+
+ Finally we define the following to get complete independence of load
+ sequence: at every loading of an extension option known to be
+ supported, we run through the list of presently selected drivers to
+ activate any support for it, using the following:
+
+\DOCMODE(
+\xydef@\xyselectoptionsupport@{\let\do=\activatedriver@ \xydriversselected@@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ As the above suggests it sometimes makes sense to load <driver>s in
+ the actual textual part of a document, however, it is recommended
+ that only drivers "also" loaded in the preamble are reloaded later,
+ and that ??c![\xyReloadDrivers] is used when there is doubt about the
+ state of affairs. In case of confusion the special command
+ ??c![\xyShowDrivers] will list all the presently supported and
+ selected driver-extension pairs to the \TeX\ log.
+
+\DOCMODE(
+\xydef@\xyShowDrivers{{\W@{Loaded:}\let\do=\doShow \xydriversloaded@@
+ \let\next@=\empty
+ \def\do##1{\ifx\next@\empty \DN@{##1}%
+ \else \expandafter\DN@\expandafter{\next@, ##1}\fi}%
+ \xydriversselected@@\W@{Selected: \next@.}}}
+
+\def\doShow#1{\let\next@=\empty
+ \def\doii##1##2{\ifx\next@\empty \DN@{##1}%
+ \else \expandafter\DN@\expandafter{\next@, ##1}\fi}%
+ \csname xydriver@#1@support@@\endcsname
+ \W@{ <driver> #1 supports \next@.}}
+\DOCMODE)
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ It is not difficult to add support for additional <driver>s; how is
+ described in the \TeX\-nical documentation.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Driver internals.}
+
+ A <driver> option files must have the following structure:
+
+\begin{quote}
+ |%%| <identification> \\
+ |%%| <copyright, \etc>
+
+ |\ifx\xyloaded\undefined \input xy \fi|
+
+ |\xyprovide{|<option>|}{|<name>|}{|<version>|}%| \\
+ \null\qquad\qquad |{|<author>|}{|<email>|}{|<address>|}|
+
+ |\newdriver{%|\\
+ |\xyaddsupport{|<extension>|}|<cs>\\
+ \vdots\\
+ |}|
+
+ <body of the {<driver>} option>
+
+ ??c![\xyendinput]
+\end{quote}
+%
+ There should be an ??c![\xyaddsupport] command for each supported
+ <extension> which specicifies the <cs> (control sequence) with which
+ the indicated support is "activated".
+
+ The ??c![\newdriver] command first establishes the `support' list for
+ the <driver> (running the argument), then adds the <driver> to the
+ `loaded' list, and finally selects it now and for every subsequent
+ request of this <driver> option.
+
+ It is important that the <cs> that "activates" each driver/extension
+ combination only does "rebinding of hooks". In order to see what
+ hooks are available for an extension, look for declarations of the
+ form
+%
+\begin{defs1}
+ ??c![\xyaddunsupport] |{|<extension>|}| <cs>
+\end{defs1}
+\noindent\unskip
+%
+ and see what rebindings that <cs> does: those are the
+ hokks. "because" they are the ones that will be safely reestablished!
+ This should be adherede to because both activation and deactivation
+ <cs>s may be executed many times.
+
+ The procedure is as follows: (??_[newdr1])~add the driver and clear
+ its support control sequence unless it is already defined,
+ (??_[newdr2])~execute the support commands, and (??_[newdr3])~setup
+ to select it after loading.
+
+\DOCMODE(
+\xydef@\newdriver#1{%
+ \def\nextiii@##1{%?*[newdr1]
+ \expandafter\def\expandafter\xydriversloaded@@
+ \expandafter{\xydriversloaded@@\do{##1}}%
+ \expandafter\let\csname xydriver@\xyoption@@ @support@@\endcsname=\empty}%
+ \def\do##1{\DNii@{##1}\ifx\xyoption@@\nextii@ \let\nextiii@=\eat@ \fi}%
+ \xydriversloaded@@ \expandafter\nextiii@\expandafter{\xyoption@@}%
+ #1\relax %?*[newdr2]
+ \DN@##1{\xywithoption{##1}{%?*[newdr3]
+ \selectdriver@{##1}\xyeveryrequest{##1}{\selectdriver@{##1}}}}%
+ \expandafter\next@\expandafter{\xyoption@@}\ignorespaces}
+\DOCMODE)
+
+ The support commands merely add to the support |\do|-lists which in
+ turn (??_[adddr1])~adds |\doii{|<extension>|}{|\dots|}| to the
+ |\xydriver@|<driver>|@support@@| control sequence and adds a check
+ for when to apply it every time that <extension> is requested!
+
+
+\DOCMODE(
+\xydef@\xyaddsupport{\expandafter\xyadddriversupport@\expandafter{\xyoption@@}}
+\xydef@\xyaddunsupport{\xyadddriversupport@{unload}}
+
+\xydef@\xyadddriversupport@#1#2#3{%
+ \DNii@{#1}\edef\nextii@{\codeof\nextii@}%
+ \def\nextiii@{#2}\edef\nextiii@{\codeof\nextiii@}%
+%
+% CHECK that the <driver> is loaded!
+\def\next{\xybug@{<driver> \nextii@\space not loaded}}%
+\def\do##1{\DN@{##1}\edef\next@{\codeof\next@}%
+ \ifx\next@\nextii@ \let\next=\relax \fi}\xydriversloaded@@ \next
+%
+% CHECK that the specified <extension> is not already supported!
+\def\next{\xybug@{<driver> \nextii@\space already supports \nextiii@}}%
+\def\doii##1##2{\DN@{##1}\edef\next@{\codeof\next@}%
+ \ifx\next@\nextiii@ \let\next=\relax \fi}\xydriversloaded@@ \next
+%
+ \DN@##1##2{\ifx##1\relax \let##1=\empty \fi %?*[adddr1]
+ \expandafter\def\expandafter##1\expandafter{##1\doii{##2}{#3}}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\csname xydriver@\nextii@ @support@@\endcsname
+ \expandafter{\nextiii@}%
+ \DN@##1{\expandafter\xyeverywithoption\expandafter{\nextiii@}{%
+ \xytestforsupport@{##1}}}%
+ \expandafter\next@\expandafter{\nextii@}\xydriversloaded@@
+ \ignorespaces}
+
+\xydef@\xytestforsupport@#1{\def\do##1{\DN@{##1}\DNii@{#1}%
+ \ifx\next@\nextii@ \expandafter\xyselectoptionsupport@ \fi}}
+\DOCMODE)
+
+\paragraph*{Driver related messages.}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Most extensions will print a warning when a capability is used which
+ is not supported by the presently loaded <driver>. Such messages are
+ only printed once, however, (for some formats they are repeated at
+ the end). Similarly, when the support of an extension that exploits
+ a particular <driver> is used a warning message will be issued that
+ the DVI file is not portable.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This is implemented by defining a control sequence for each such
+ warning and repeat it at the end. Warnings should be issued using
+ one of
+%
+\begin{defs1}
+|\xyununsupportwarning@| |{|<extension>|}| |{|<message>|}|\cr
+|\xyunsupportwarning@| |{|<driver>|}| |{|<extension>|}| \cr
+\end{defs1}
+
+\DOCMODE(
+\xynew@{if}\ifunsupportwarnings@
+
+\xydef@\xyunsupportwarning@#1#2{{%
+ \DN@{#1}\edef\next@{\codeof\next@}
+ \expandafter\ifx\csname xywarn@unload@\next@ @\endcsname\relax
+ \expandafter\gdef\csname xywarn@unload@\next@ @\endcsname{}%
+ \ifunsupportwarnings@ \xyclosedown@@\xyunsupportwarnings@@ \fi
+ \global\unsupportwarnings@true
+ \expandafter\gdef\expandafter\xyunsupportwarnings@@\expandafter{%
+ \xyunsupportwarnings@@ \W@{ #2.}}%
+ \W@{}%
+ \W@{Xy-pic Warning: `\next@' reproduction is NOT EXACT\xytracelineno@:}%
+ \W@{ #2.}%
+ \W@{}%
+ \fi}}
+
+\xydef@\xyunsupportwarnings@@{\W@{}%
+ \W@{Xy-pic Warning: The produced DVI file is NOT EXACT:}}
+
+\xynew@{if}\ifsupportwarnings@
+
+\xydef@\xysupportwarning@#1#2{{%
+ \DN@{#1}\edef\next@{\codeof\next@}\DNii@{#2}\edef\nextii@{\codeof\nextii@}%
+ \expandafter\ifx\csname xywarn@\next@ @\nextii@ @\endcsname\relax
+ \expandafter\gdef\csname xywarn@\next@ @\nextii@ @\endcsname{}%
+ \ifsupportwarnings@ \xyclosedown@@\xysupportwarnings@@ \fi
+ \global\supportwarnings@true
+ \expandafter\gdef\expandafter\xysupportwarnings@@\expandafter{%
+ \xysupportwarnings@@ \driverextensioncomplain@{#1}{#2}}%
+ \W@{}%
+ \W@{Xy-pic Warning: The produced DVI file is NOT PORTABLE\xytracelineno@:}%
+ \driverextensioncomplain@{#1}{#2}%
+ \W@{}%
+ \fi}}
+
+\xydef@\xysupportwarnings@@{%
+ \W@{Xy-pic Warning: The produced DVI file is NOT PORTABLE:}}
+
+\xydef@\driverextensioncomplain@#1#2{%
+ \DN@{#1}\edef\next@{\codeof\next@}\DNii@{#2}\edef\nextii@{\codeof\nextii@}%
+ \W@{ It contains <driver> `\next@' \string\special s for the `\nextii@'
+ extension.}}
+\DOCMODE)
+
+ Backwards compatibility\dots
+
+\DOCMODE(
+\xydef@\dvimessage@#1#2{\xysupportwarning@{#1}{#2}}
+
+\xynew@{if}\ifxydrivernoloads@
+\xydef@\xydrivernoload@#1{\xyerror@{Could not load xy#1.tex}{}%
+ \xydrivernoloads@true}
+
+\xydef@\xydriverfail@#1{\xyerror@{Sorry, #1 not supported.}{}}
+
+\xydef@\xyunload@#1{\xywarning@{Unloading #1.}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section{Algorithms}
+??=[algo]
+
+ This section presents the more complicated algorithms used in
+ \Xy-pic.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Directions}
+??=[algo.direction]
+
+\DOCMODE(
+\message{algorithms: directions,}
+\DOCMODE)
+
+ The "direction state" is described by the following parameters:
+%
+\begin{defs}
+"Direction" & `angle' of the direction on $]-4K\dots4K]$ unit square \cr
+"dX","dY" & the vector $c-p$ \cr
+"sdX","sdY" & sign of "dX" and "dY" \cr
+|\K@dXdY|,|\K@dYdX| & quotients $K\frac{"dX"}{"dY"}$ and
+ $K\frac{"dY"}{"dX"}$ (as dimensions in sp) \cr
+"DirectionChar","SemiDirectionChar" & |\chardefs| for directional
+ and semidirectional fonts \cr
+"cosDirection","sinDirection" & factors in the range $]-1\dots1]$
+ corresponding to cos and sin of Direction \cr
+\end{defs}
+%
+ where the ``$]-4K\dots4K]$ unit square'' has the following angles:
+$$
+\xy *[]=<3pc>{}="c"*\frm{-},
+ "c"; (-1,-1)**{},p+/4pc/ *+{0} **@{-}?>*@{>},
+ "c"; ( 0,-1)**{},p+/4pc/ *+{K} **@{-}?>*@{>},
+ "c"; ( 1,-1)**{},p+/4pc/ *+{2K} **@{-}?>*@{>},
+ "c"; ( 1, 0)**{},p+/4pc/ *+{3K} **@{-}?>*@{>},
+ "c"; ( 1, 1)**{},p+/4pc/ *+{4K} **@{-}?>*@{>},
+ "c"; ( 0, 1)**{},p+/4pc/ *+{{-}3K} **@{-}?>*@{>},
+ "c"; (-1, 1)**{},p+/4pc/ *+{{-}2K} **@{-}?>*@{>},
+ "c"; (-1, 0)**{},p+/4pc/ *+{{-}K} **@{-}?>*@{>},
+\endxy
+$$
+ where the intermediate $K$ angle in each interval correspond to
+ equidistant points on the unit square. Thus only for
+ $n\in\{-3,2,1,0,1,2,3,4\}$ the angle of direction $n*K$ is exactly
+ $n*45^\circ - 135^\circ$ ($0^\circ$ being the direction straight
+ right).
+
+ As usual |\DirectionfromtheDirection@| expands to code setting the
+ current direction.
+
+\DOCMODE(
+\xydef@\DirectionfromtheDirection@{\noexpand\Direction=\the\Direction
+ \noexpand\d@X=\the\d@X \noexpand\d@Y=\the\d@Y
+ \def\noexpand\sd@X{\sd@X}\def\noexpand\sd@Y{\sd@Y}%
+ \noexpand\K@dXdY=\the\K@dXdY \noexpand\K@dYdX=\the\K@dYdX
+ \chardef\noexpand\DirectionChar=\the\DirectionChar
+ \chardef\noexpand\SemiDirectionChar=\the\SemiDirectionChar
+ \def\noexpand\cosDirection{\cosDirection}%
+ \def\noexpand\sinDirection{\sinDirection}%
+ \noexpand\resetupDirection@}
+\DOCMODE)
+
+ The actual direction computation is done using
+ |\setupDirection@|.
+
+\paragraph*{Procedure:}
+%
+ Is really not so complicated. [??_[Dir1]]~"dX" and "dY" are computed
+ from $c-p$ and we skip if the current setting is based on these (this
+ is stored in the internal |\Directiontest@@| method);
+ [??_[Diri1]]~if the direction is one of the principal ones then
+ proceed with an optimised special case for those; otherwise proceed
+ with the generic code.
+
+\DOCMODE(
+\xydef@\Directiontest@@#1#2{#2}
+
+\xydef@\setupDirection@{%
+ \d@X=\X@c\advance\d@X-\X@p \d@Y=\Y@c\advance\d@Y-\Y@p %?*[Dir1]
+ \Directiontest@@\relax\setupDirection@i}
+
+\xydef@\setupDirection@i{\DN@{\setupDirection@ii}%?*[Diri1]
+ \ifdim\d@X=\d@Y
+ \ifdim\zz@\d@Y \DN@{}%
+ \else\ifdim\d@X<\z@ \DN@{\dlDirection@{-1.4142\d@X}}%
+ \else \DN@{\urDirection@{1.4142\d@X}}\fi\fi
+ \else\ifdim\d@X<\d@Y
+ \ifdim\zz@\d@X \DN@{\uDirection@\d@Y}%
+ \else\ifdim\zz@\d@Y \DN@{\lDirection@{-\d@X}}%
+ \else\ifdim-\d@X=\d@Y \DN@{\ulDirection@{-1.4142\d@X}}\fi\fi\fi
+ \else
+ \ifdim\zz@\d@X \DN@{\dDirection@{-\d@Y}}%
+ \else\ifdim\zz@\d@Y \DN@{\rDirection@\d@X}%
+ \else\ifdim\d@X=-\d@Y \DN@{\drDirection@{1.4142\d@X}}\fi\fi\fi
+ \fi\fi \next@}
+\DOCMODE)
+
+ The procedures for the special <diag>onal cases are summarised in
+ this table:
+$$
+\let\|=\otherbar
+\begin{array}{\|c\|r\|rl\|c\|rl\|}
+\hline
+\mbox{<diag>onal} & "Direction" & \cos("Direction"),& \sin("Direction")
+ & "sign"("dX","dY") & "Char" & "Semi" \\
+\hline
+ |dl| & 0 & {-\sqrt{\frac12}},& {-\sqrt{\frac12}} & -,- & 127 & 127 \\
+ |d| & K & 0,& -1 & +,- & 15 & 31 \\
+ |dr| & 2K & {\sqrt{\frac12}},& {-\sqrt{\frac12}} & +,- & 31 & 63 \\
+ |r| & 3K & 1,& 0 & +,+ & 47 & 95 \\
+ |ur| & 4K & {\sqrt{\frac12}},& {\sqrt{\frac12}} & +,+ & 63 & 127 \\
+ |u| &-3K & 0,& 1 & +,+ & 79 & 31 \\
+ |ul| &-2K & {-\sqrt{\frac12}},& {\sqrt{\frac12}} & -,+ & 95 & 63 \\
+ |l| & -K & -1,& 0 & -,+ & 111 & 95 \\
+\hline
+\end{array}
+$$
+ In each case the argument is used as the unit circle, \ie, non-zero
+ of "dX" and "dY", and $|<|K\frac{"dX"}{"dY"}|,|K\frac{"dY"}{"dX"}|>|
+ := "KK"*|<|"dX"|,|"dY"|>|$\dots
+
+\DOCMODE(
+\xydef@\dlDirection@{\Direction=\z@
+ \def\cosDirection{-.7071}\def\sinDirection{-.7071}\def\sd@X{-}\def\sd@Y{-}%
+ \chardef\DirectionChar=127\relax\chardef\SemiDirectionChar=127\relax
+ \K@dXdY=1\K@ \K@dYdX=1\K@ \fixedDirection@}
+
+\xydef@\dDirection@{\Direction=\K@
+ \def\cosDirection{0}\def\sinDirection{-1}\def\sd@Y{-}%\def\sd@X{+}
+ \edef\sd@X{\ifdim\X@c<\X@p-\else+\fi}%
+ \chardef\DirectionChar=15\relax\chardef\SemiDirectionChar=31\relax
+ \K@dXdY=\z@ \K@dYdX=\KK@\K@ \fixedDirection@}
+
+\xydef@\drDirection@{\dimen@ii=2\K@ \Direction=\dimen@ii
+ \def\cosDirection{+.7071}\def\sinDirection{-.7071}\def\sd@X{+}\def\sd@Y{-}%
+ \chardef\DirectionChar=31\relax\chardef\SemiDirectionChar=63\relax
+ \K@dXdY=-1\K@ \K@dYdX=-1\K@ \fixedDirection@}
+
+\xydef@\rDirection@{\dimen@ii=3\K@ \Direction=\dimen@ii
+ \def\cosDirection{+1}\def\sinDirection{0}\def\sd@X{+}%\def\sd@Y{+}%
+ \edef\sd@Y{\ifdim\Y@c<\Y@p-\else+\fi}%
+ \chardef\DirectionChar=47\relax\chardef\SemiDirectionChar=95\relax
+ \K@dXdY=\KK@\K@ \K@dYdX=\z@ \fixedDirection@}
+
+\xydef@\urDirection@{\dimen@ii=4\K@ \Direction=\dimen@ii
+ \def\cosDirection{+.7071}\def\sinDirection{+.7071}\def\sd@X{+}\def\sd@Y{+}%
+ \chardef\DirectionChar=63\relax\chardef\SemiDirectionChar=127\relax
+ \K@dXdY=1\K@ \K@dYdX=1\K@ \fixedDirection@}
+
+\xydef@\uDirection@{\dimen@ii=-3\K@ \Direction=\dimen@ii
+ \def\cosDirection{0}\def\sinDirection{+1}\def\sd@Y{+}%\def\sd@X{+}
+ \edef\sd@X{\ifdim\X@c<\X@p-\else+\fi}%
+ \chardef\DirectionChar=79\relax\chardef\SemiDirectionChar=31\relax
+ \K@dXdY=\z@ \K@dYdX=\KK@\K@ \fixedDirection@}
+
+\xydef@\ulDirection@{\dimen@ii=-2\K@ \Direction=\dimen@ii
+ \def\cosDirection{-.7071}\def\sinDirection{+.7071}\def\sd@X{-}\def\sd@Y{+}%
+ \chardef\DirectionChar=95\relax\chardef\SemiDirectionChar=63\relax
+ \K@dXdY=-1\K@ \K@dYdX=-1\K@ \fixedDirection@}
+
+\xydef@\lDirection@{\Direction=-\K@
+ \def\cosDirection{-1}\def\sinDirection{0}\def\sd@X{-}%\def\sd@Y{+}%
+ \edef\sd@Y{\ifdim\Y@c<\Y@p-\else+\fi}%
+ \chardef\DirectionChar=111\relax\chardef\SemiDirectionChar=95\relax
+ \K@dXdY=\KK@\K@ \K@dYdX=\z@ \fixedDirection@}
+
+\xydef@\fixedDirection@#1{\dimen@ii=#1\relax
+ \d@X=\cosDirection\dimen@ii \d@Y=\sinDirection\dimen@ii
+ \resetupDirection@}
+\DOCMODE)
+
+ Here is the procedure for the generic code.
+%
+\begin{itemize}
+
+\item[{??_[Dirii1]}]
+ Make sign variables and slopes: $"sdX" := "sign"("dX")$, $"sdY" :=
+ "sign"("dY")$, $K\frac{"dX"}{"dY"} :=
+ "sdX"*"sdY"*\floor{\abs{"KK"*"dX"} / \abs{"dY"/"KK"}}$, and
+ $K\frac{"dY"}{"dX"} := "sdX"*"sdY"*\floor{\abs{"KK"*"dY"} /
+ \abs{"dX"/"KK"}}$, where the somewhat exotic computation method is
+ used to ensure that the `native' floor function provided by \TeX\
+ |\divide| can be used (it only acts predictably for positive
+ numbers), that overflow is avoided even for large $"dX","dY"$, and
+ that it is reasonable to use the convention of |\quotient@| that
+ division by zero is like multiplying with one\dots Also takes care
+ not to multiply too big dimensions with each other.
+
+\item[{??_[Dirii2]}]
+ If ${-K} \le K\frac{"dX"}{"dY"} \le K$ then the direction is mostly
+ up or down: if $"dY"\lt0$ [down, ??_[Dirii2a]]: $"Direction" := -
+ K\frac{"dX"}{"dY"} + 1K$; else [up, ??_[Dirii2b]]: $"Direction" := -
+ K\frac{"dX"}{"dY"} - 3K$.
+
+\item[{??_[Dirii3]}]
+ If ${-K} \lt K\frac{"dY"}{"dX"} \lt K$ then direction is mostly left
+ or right: if $"dX"\lt0$ [left, ??_[Dirii3a]]: $"Direction" :=
+ K\frac{"dY"}{"dX"} - K$; else [right, ??_[Dirii3b]]: $"Direction" :=
+ K\frac{"dY"}{"dX"} + 3K$.
+
+\item[{??_[Dirii4]}]
+ Compute character codes for direction and semidirection fonts.
+ [??_[Dirii4a]]: $"DirectionChar" := (8K+"Direction"+K/32)
+ \hbox{~div~} (K/16) - 1$; while $"DirectionChar" \gt 127:
+ "DirectionChar" -:= 128$. [??_[Dirii4b]]: $"SemiDirectionChar" :=
+ (8K+"Direction"+K/64) \hbox{~div~} (K/32) - 1$; while
+ $"SemiDirectionChar" \gt 127: "SemiDirectionChar" -:= 128$. In both
+ cases the $8K$ are added to ensure that \TeX\ will round down.
+ \HACK: The |16|, |\KK@|, and |64| in these lines are really $K/64$,
+ $K/32$, and $K/16$\dots
+
+\item[{??_[Dirii5]}]
+ Build "cosDirection" and "sinDirection" from appropriate characters
+ in the |\xydashfont|. [??_[Dirii5]]: $"cosDirection" :=
+ "wd"(|\xydashfont| "SemiDirectionChar")$. [??_[Dirii5b]] $C :=
+ "SemiDirectionChar"-64$, if $C\lt0$: $C := C+128$, $"sinDirection" :=
+ "wd"(|\xydashfont| C)$.
+
+\item[{??_[Dirii6]}]
+ Register this "dX","dY" for next time.
+
+\end{itemize}
+
+\DOCMODE(
+\xydef@\setupDirection@ii{%
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi %?*[Dirii1]
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \K@dXdY=\sd@X\d@X \ifdim\K@dXdY<500pt \multiply\K@dXdY\KK@ \fi
+ \dimen@=\sd@Y\d@Y
+% \advance\dimen@.5\KK@ \divide\dimen@\KK@
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\KK@ \divide\dimen@\KK@
+ \ifdim\dimen@=\z@\else %\count@=\dimen@ \divide\count@\tw@
+ \advance\K@dXdY by.5\dimen@\relax \divide\K@dXdY\dimen@
+ \fi \K@dXdY=\sd@X\sd@Y\K@dXdY
+ \K@dYdX=\sd@Y\d@Y \ifdim\K@dYdX<500pt \multiply\K@dYdX\KK@ \fi
+ \dimen@=\sd@X\d@X
+% \advance\dimen@.5\KK@ \divide\dimen@\KK@
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\KK@ \divide\dimen@\KK@
+ \ifdim\dimen@=\z@\else %\count@=\dimen@ \divide\count@\tw@
+ \advance\K@dYdX by.5\dimen@\relax \divide\K@dYdX\dimen@
+ \fi \K@dYdX=\sd@X\sd@Y\K@dYdX
+ \Direction=\maxdimen
+ \ifnum\K@dXdY<-\K@ \else \ifnum\K@<\K@dXdY \else %?*[Dirii2]
+ \ifdim \d@Y<\z@ %?*[Dirii2a]
+ \Direction=\K@ \advance\Direction-\K@dXdY
+ \else %?*[Dirii2b]
+ \Direction=\K@ \multiply\Direction-\thr@@ \advance\Direction-\K@dXdY
+ \fi\fi\fi
+ \ifnum-\K@<\K@dYdX \ifnum\K@dYdX<\K@ %?*[Dirii3]
+ \ifdim \d@X<\z@ %?*[Dirii3a]
+ \Direction=-\K@ \advance\Direction\K@dYdX
+ \else %?*[Dirii3b]
+ \Direction=\K@ \multiply\Direction\thr@@ \advance\Direction\K@dYdX
+ \fi\fi\fi
+ \ifnum\Direction=\maxdimen
+ \Direction=\K@dYdX \advance\Direction-\K@dXdY
+ \advance\Direction\ifnum\Direction<\z@-\fi\@ne \divide\Direction\tw@
+ \ifnum\K@dXdY<\z@ \advance\Direction\K@ \advance\Direction\K@
+ \else \advance\Direction-\K@ \advance\Direction-\K@ \fi
+ \fi
+ \imposeDirection@i
+ \resetupDirection@ %?*[Dirii6]
+ }
+
+\xydef@\imposeDirection@{\count@@=\Direction
+ \loop@\ifnum\count@@>4096 \advance\count@@-8192 \repeat@
+ \loop@\ifnum\count@@<-4096 \advance\count@@8192 \repeat@
+ \def\sd@X{+}\ifnum\count@@<\K@ \relax
+ \ifnum\count@@>-3072 \def\sd@X{-}\fi\fi
+ \def\sd@Y{+}\ifnum\count@@<3072 \relax
+ \ifnum\count@@>-\K@ \relax\def\sd@Y{-}\fi\fi
+ \imposeDirection@i
+ \d@X=\cosDirection\xydashl@ \d@Y=\sinDirection\xydashl@
+ \resetupDirection@}
+
+\xydef@\imposeDirection@i{%
+ \count@@=\K@ \multiply\count@@ by8 \advance\count@@\Direction %?*[Dirii4]
+ \count@=\count@@ \advance\count@\KK@ \divide\count@64 \advance\count@\m@ne %?*[Dirii4a]
+ \loop@\ifnum127<\count@ \advance\count@-128 \repeat@
+ \chardef\DirectionChar\count@
+ \advance\count@@16 \divide\count@@\KK@ \advance\count@@\m@ne %?*[Dirii4b]
+ \loop@\ifnum127<\count@@ \advance\count@@-128 \repeat@
+ \chardef\SemiDirectionChar\count@@
+ \setbox8=\hbox{\xydashfont\SemiDirectionChar\/}% %?*[Dirii5]
+ \quotient@@\cosDirection{\sd@X\wd8}\xydashl@
+ \setbox8=\hbox{\xydashfont\count@=\SemiDirectionChar\advance\count@-64 %?*[Dirii5b]
+ \ifnum\count@<\z@ \advance\count@128 \fi \char\count@\/}%
+ \quotient@@\sinDirection{\sd@Y\wd8}\xydashl@}
+
+\xydef@\getxyDirection@#1{\xy@@\bgroup\xy@@ix@{#1}%
+ \xy@@{\expandafter\POS\the\toks9\relax\setupDirection@
+ \edef\next@{\egroup \Direction=\the\Direction}\next@ \imposeDirection@ }}
+\DOCMODE)
+
+ Finally some special cases used by the <direction>s and directional
+ library objects. All manipulate the Direction dependent parameters
+ and then call |\resetupDirection@|: |\reverseDirection| reverses it;
+ |\above|- and |\belowDirection@| are for |^| and |_|, and
+ $|\vDirection@(|x|,|y|){|L|}|$ is for $|:(|x|,|y|)|$, \ie, computes
+ a new direction as the vector
+$$
+ |<| X - x*\cos\alpha*L - y*({-}\sin\alpha)*L |,|
+ Y - x*\sin\alpha*L - y*\cos\alpha*L |>|
+$$
+ where $\alpha$ is the previous direction angle.
+
+\DOCMODE(
+\xydef@\reverseDirection@{%
+ \d@X=-\d@X \d@Y=-\d@Y
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \dimen@=4\K@ \ifnum\Direction<\z@ \advance\Direction\dimen@
+ \else \advance\Direction-\dimen@ \fi
+ \count@=\DirectionChar \ifnum\count@<64 \advance\count@64 %
+ \else \advance\count@-64 \fi \chardef\DirectionChar=\count@
+ \edef\cosDirection{\if-\cosDirection\else-\cosDirection\fi}%
+ \edef\sinDirection{\if-\sinDirection\else-\sinDirection\fi}%
+ \resetupDirection@}
+
+\xydef@\aboveDirection@#1{%
+ \dimen@=\d@X \d@X=-\d@Y \d@Y=\dimen@
+ \dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \dimen@=2\K@ \ifdim 1\Direction<\dimen@\else \dimen@=-6\K@ \fi
+ \advance\Direction\dimen@
+ \count@=\DirectionChar \ifnum\count@<96 \advance\count@32 %
+ \else \advance\count@-96 \fi \chardef\DirectionChar=\count@
+ \count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64 %
+ \else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
+ \let\tmp@=\cosDirection
+ \edef\cosDirection{\if-\sinDirection\else-\sinDirection\fi}%
+ \let\sinDirection=\tmp@
+ \dimen@=#1\relax \d@X=\cosDirection\dimen@ \d@Y=\sinDirection\dimen@
+ \resetupDirection@}
+
+\xydef@\belowDirection@#1{%
+ \dimen@=\d@X \d@X=\d@Y \d@Y=-\dimen@
+ \dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
+ \ifdim\d@X<\z@ \def\sd@X{-}\else \def\sd@X{+}\fi
+ \ifdim\d@Y<\z@ \def\sd@Y{-}\else \def\sd@Y{+}\fi
+ \dimen@=-2\K@\ifdim 1\Direction<\dimen@\dimen@=6\K@\fi
+ \advance\Direction\dimen@
+ \count@=\DirectionChar \ifnum\count@<32 \advance\count@96 %
+ \else \advance\count@-32 \fi \chardef\DirectionChar=\count@
+ \count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64 %
+ \else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
+ \let\tmp@=\sinDirection
+ \edef\sinDirection{\if-\cosDirection\else-\cosDirection\fi}%
+ \let\cosDirection=\tmp@
+ \dimen@=#1\relax \d@X=\cosDirection\dimen@ \d@Y=\sinDirection\dimen@
+ \resetupDirection@}
+
+\xydef@\vDirection@(#1,#2)#3{\dimen@ii=#3\relax
+ \dimen@=#1\dimen@ii \dimen@ii=#2\dimen@ii
+ \d@X=\cosDirection\dimen@ \advance\d@X-\sinDirection\dimen@ii
+ \d@Y=\sinDirection\dimen@ \advance\d@Y \cosDirection\dimen@ii
+ \X@p=\X@c \advance\X@p-\d@X \Y@p=\Y@c \advance\Y@p-\d@Y
+ \setupDirection@\ignorespaces}
+\DOCMODE)
+
+ The above all make use of the following; use them also when the
+ direction state is known to be correct: |\resetDirection@| should be
+ called when $p$ and/or $c$ are moved along the line $\vec{pc}$,
+ |\resetupDirerection| when the entire direction state is changed in a
+ consistent manner.
+
+\DOCMODE(
+\xydef@\resetDirection@{%
+ \d@X=\X@c\advance\d@X-\X@p \d@Y=\Y@c\advance\d@Y-\Y@p
+ \let\next@=\resetupDirection@
+ \ifdim\sd@X\d@X<\z@ \let\next@=\setupDirection@i \fi
+ \ifdim\sd@Y\d@Y<\z@ \let\next@=\setupDirection@i \fi
+ \next@}
+
+\xydef@\resetupDirection@{%
+ \edef\Directiontest@@##1##2{\noexpand\DN@{##2}%
+ \noexpand\ifdim\noexpand\d@X=\the\d@X\relax
+ \noexpand\ifdim\noexpand\d@Y=\the\d@Y\relax \noexpand\DN@{##1}%
+ \noexpand\fi\noexpand\fi \noexpand\next@}}
+
+\xydef@\unsetupDirection@{\def\Directiontest@@##1##2{##2}}
+\DOCMODE)
+
+ Finally the initial direction: up!
+
+\DOCMODE(
+\uDirection@\xydashl@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Edges}
+??=[algo.edge]
+
+ An "Edge" is a token list describing the edge of an object. It must
+ have the form |{|<expandable token> <unexpandable tokens>|}|.
+ To find the edge of an object then first make it the current object
+ and then do
+$$
+ |\the\Edge@c|<code>
+$$
+ where <code> determines what should be done:
+%
+\begin{itemize}
+
+\item[0]
+ $c$ is changed to be equal to the point on the edge intersecting with
+ the line segment from $p$ (for ??c![E] <corner>, also this was the
+ v2.6 behaviour).
+
+ \NOTE: This should not change any of $A$, $B$, or any component of
+ the state except $X_c$ and $Y_c$!
+
+\item[1]
+ Test whether the center of $p$, \ie, $|<|X_p|,|Y_p|>|$, is `inside'
+ the $c$ object (or on the edge). Sets the test |\ifInside@|
+ accordingly.
+
+\item[2]
+ Set |\dimen@| to the distance from the center to the edge towards~$p$
+ (as set with code~0).
+
+ \NOTE: This is only positive in the direction towards $p$
+ (thus negative-sized circles and rectangles make it negative).
+
+\item[3]
+ $c$ is changed to be equal to the point on the edge furthest in the
+ direction towards $p$ (for ??c![P] <corner>).
+
+ \NOTE: This should not change any of $A$, $B$, or any component of
+ the state except $X_c$ and $Y_c$!
+
+\item[4]
+ Replace $c$ with rectangle with corners where the line from $p$
+ intersects with the edge of $c$ (thus this is the inner rectangle
+ with corners as the current direction dictates).
+
+\item[5]
+ Replace $c$ with smallest rectangle that encloses the current object
+ completely.
+
+\end{itemize}
+%
+ (if this reminds the reader of a `dictionary' as used by
+ object-oriented programming languages then they probably share this
+ author's regret that \TeX\ is not object-oriented :-)
+
+\DOCMODE(
+\message{edges,}
+
+\xynew@{if}\ifInside@
+\DOCMODE)
+
+\paragraph*{Points:}
+
+ The simplest shape is none at all -- a point.
+
+\DOCMODE(
+\xydef@\zeroEdge#1{%
+ \ifcase#1\relax \or \Inside@false \or \dimen@=\z@
+ \or \else \Edge@c={\rectangleEdge}\fi}
+\DOCMODE)
+
+\paragraph*{Circles and Ellipses:}
+
+ Next we define round things, with several special cases for the
+ individual variants described below: centered circular, centered
+ elliptical, and general elliptical. The only `intelligent' choice
+ is for the `Under' method where the object is forced to be a centered
+ variant before applying either the circular or elliptical version.
+
+\DOCMODE(
+\xydef@\circleEdge#1{\ifcase#1\expandafter\circleEdge@
+ \or \expandafter\circleUnder@ \or \dimen@=\R@c
+ \or \expandafter\circleProp@ \or \expandafter\circleInner@
+ \else \expandafter\circleOuter@ \fi}
+
+\xydef@\circleEdge@{\DN@{\ellipseEdge@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\circlecentredEdge@}%
+ \else\DN@{\ellipsecentredEdge@}\fi
+ \fi\fi \next@}
+
+\xydef@\circleProp@{\DN@{\reverseDirection@\ellipseEdge@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\reverseDirection@\circlecentredEdge@}%
+ \else\DN@{\reverseDirection@\ellipsecentredEdge@}\fi
+ \fi\fi \next@}
+
+\xydef@\circleUnder@{\Inside@false
+ \ifdim\X@p=\X@c \relax \ifdim\Y@p=\Y@c \Inside@true \fi \fi
+ \ifInside@ \else \expandafter \circleCentre@ \fi}
+
+\xydef@\circleCentre@{{%
+ \ifdim\L@c=\R@c \relax\else
+ \dimen@=\R@c\advance\dimen@-\L@c \divide\dimen@\tw@
+ \advance\X@c\dimen@ \advance\R@c-\dimen@ \fi
+ \d@X=\X@c \advance\d@X-\X@p \d@X=\ifdim\d@X<\z@-\fi\d@X
+ \ifdim\U@c=\D@c\relax \else
+ \dimen@=\U@c\advance\dimen@-\D@c \divide\dimen@\tw@
+ \advance\Y@c\dimen@ \advance\U@c-\dimen@ \fi
+ \d@Y=\Y@c \advance\d@Y-\Y@p \d@Y=\ifdim\d@Y<\z@-\fi\d@Y
+ \DN@{}\ifdim\d@X>\R@c \relax \else \ifdim\d@Y>\U@c \relax
+ \else \ifdim\U@c=\R@c \DN@{\circlecentredUnder@}%
+ \else \DN@{\ellipsecentredUnder@}\fi
+ \fi\fi \next@}}
+
+\xydef@\circleInner@{\DN@{\ellipseInner@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\circlecentredInner@}%
+ \else\DN@{\ellipsecentredInner@}\fi
+ \fi\fi \next@}
+
+\xydef@\circleOuter@{\DN@{\ellipseOuter@}%
+ \ifdim\R@c=\L@c\relax \ifdim\U@c=\D@c\relax
+ \ifdim\R@c=\U@c\DN@{\circlecentredOuter@}%
+ \else\DN@{\ellipsecentredOuter@}\fi
+ \fi\fi \next@}
+\DOCMODE)
+
+\subparagraph*{True circles, centered:} Code~0 moves $|<|X_c|,|Y_c|>|$ to the
+ point $|<|X_c - R_c*\cos\alpha|,| Y_c - R_c*\sin\alpha|>|$ where
+ $\alpha$ is the current direction angle, code~1 tests whether the
+ $p$ center is located between those two points., code~2 just returns
+ the radius, code~3 is as code~0 and code~4 is the only nontrivial
+ one, replacing with the inner symmetric rectangle with corner at the
+ point of code~0.
+
+\DOCMODE(
+\xydef@\circlecentredEdge@{%
+ \dimen@=-\cosDirection\R@c \advance\X@c\dimen@
+ \dimen@=-\sinDirection\R@c \advance\Y@c\dimen@}
+
+\xydef@\circlecentredUnder@{%
+ \loop\ifdim\R@c>100\p@ \circlescale@ \repeat
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\R@c
+ \edef\tmp@{\expandafter\removePT@\the\d@X}\advance\dimen@-\tmp@\d@X
+ \edef\tmp@{\expandafter\removePT@\the\d@Y}\advance\dimen@-\tmp@\d@Y
+ \ifdim\dimen@>\z@ \aftergroup\Inside@true \fi}
+
+%%\xydef@\circlescale@{\divide\R@c\KK@ \divide\d@X\KK@ \divide\d@Y\KK@ }
+\xydef@\circlescale@{\divide\R@c\KK@ \divide\d@X\KK@ \divide\d@Y\KK@ }
+
+\xydef@\circlecentredInner@{%
+ \L@c=\sd@X\cosDirection\R@c \D@c=\sd@Y\sinDirection\R@c
+ \R@c=\L@c \U@c=\D@c \Edge@c={\rectangleEdge}}
+
+\xydef@\circlecentredOuter@{%
+ \L@c=\R@c \D@c=\R@c \U@c=\D@c \Edge@c={\rectangleEdge}}
+\DOCMODE)
+
+\subparagraph*{Ellipsis, centered:} When $c$ is at the centre of an
+ elliptical object, first rescale the axes to make the object
+ circular. Rescale $dX$ and $dY$ appropriately, reset the direction
+ and move to the edge as previously. Then scale back to
+ the original shape, adjusting $X_c$ and $Y_c$ appropriately.
+
+\DOCMODE(
+\xydef@\ellipsecentredEdge@{\bgroup \X@p=\X@c \Y@p=\Y@c
+ \ifdim\U@c>\R@c
+ \X@c=\cosDirection\U@c \Y@c=\sinDirection\U@c
+ \quotient@\tmp@\U@c\R@c \X@c=\tmp@\X@c \R@c=\U@c
+ \else
+ \X@c=\cosDirection\R@c \Y@c=\sinDirection\R@c
+ \quotient@\tmp@\R@c\U@c \Y@c=\tmp@\Y@c
+ \fi
+ \advance\X@c\X@p \advance\Y@c\Y@p
+ \setupDirection@ \X@c=\X@p \Y@c=\Y@p \circlecentredEdge@
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \ifdim\U@c>\L@c \quotient@\tmp@\L@c\U@c \d@X=\tmp@\d@X
+ \else \quotient@\tmp@\U@c\R@c \d@Y =\tmp@\d@Y \fi
+ \X@c=\X@p \advance\X@c\d@X \Y@c=\Y@p \advance\Y@c\d@Y
+ \edef\next@{\egroup \X@c=\the\X@c \Y@c=\the\Y@c}\next@ }%
+
+\xydef@\ellipsecentredUnder@{%
+ \ifdim\R@c>64\p@ \circlescale@ \divide\U@c\KK@
+ \else \ifdim\U@c>64\p@ \circlescale@ \divide\U@c\KK@ \fi\fi
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\d@Y=\tmp@\d@Y
+ \edef\tmp@{\expandafter\removePT@\the\U@c}\d@X=\tmp@\d@X
+ \R@c=\tmp@\R@c \circlecentredUnder@ }
+\DOCMODE)
+
+ For elliptical objects the Outer-rectangle retains all the
+ extents, so just change the edge-type.
+
+\DOCMODE(
+\xydef@\ellipsecentredOuter@{\Edge@c={\rectangleEdge}}
+\DOCMODE)
+
+ For elliptical objects the Inner-rectangle needs to
+ be calculated for each direction. This is done by
+ first finding the edge, using |\ellipseEdge@| or
+ |\ellipsecentredEdge@| when appropriate.
+
+\DOCMODE(
+\xydef@\ellipsecentredInner@{%
+ \bgroup \X@p=\X@c \Y@p=\Y@c \ellipsecentredEdge@
+% \advance\X@c-\X@p \L@c=\ifdim\X@c<\z@-\fi\L@c
+ \advance\X@c-\X@p \L@c=\ifdim\X@c<\z@-\fi\X@c
+% \advance\Y@c-\Y@p \D@c=\ifdim\Y@c<\z@-\fi\D@c
+ \advance\Y@c-\Y@p \D@c=\ifdim\Y@c<\z@-\fi\Y@c
+ \edef\next@{\egroup \L@c=\the\L@c \D@c=\the\D@c}\next@
+ \R@c=\L@c \U@c=\D@c \Edge@c={\rectangleEdge}}
+\DOCMODE)
+
+\subparagraph*{Non-centered variants:} The code for the more general
+ |\ellipseEdge@| uses a Newton iteration to solve a quadratic
+ equation.
+
+ First locate the actual centre of the ellipse and
+ the lengths of the major axis $a$ and minor axis $b$.
+ Let $(x,y)$ denote the displacement of the required
+ edge point from the centre of the ellipse,
+ so that ${x^2\over a^2}+{y^2\over b^2}=1$.
+ Now let $(dx,dy)$ be the displacement from the centre
+ to the reference point; then $x=dx+s \cos\theta$ and
+ $y=dy+s\sin\theta$ where $s$ is the distance to $(x,y)$
+ in the required direction $\theta$.
+ We must find the value of $s$, presumed to satisfy $s\ge0$.
+
+ If $a\lt b$ we search for a root of
+\begin{eqnarray*}
+f\left({s\over a}\right) &= \;\;
+\left(\tilde{dx}+{s\over a}\cos\theta\right)^2
++\left(\tilde{dy}+{s\over a}{a\over b}\sin\theta\right)^2 & \cr
+f'\left({s\over a}\right) &= \;\;
+2\left(\tilde{dx}+{s\over a}\cos\theta\right)\cos\theta
++ 2\left(\tilde{dy}+{s\over a}{a\over b}\sin\theta\right)
+{a\over b}\sin\theta
+\end{eqnarray*}
+ where $\tilde{dx} = dx/a$ and $\tilde{dy} = dy/b$.
+ By choosing a starting value $s_0=2a+2b$ the Newton-iteration
+ converges rapidly to the correct root, provided $b\gt0$.
+\smallskip
+\noindent
+ If $a\gt b$ then we solve a similar quadratic in ${s\over b}$.
+
+ \TODO:
+ The case of $a=0$ or $b=0$, so that the ellipse degenerates
+ to a line segment, should be trapped earlier.
+ Such an object would be more easily handled as a degenerate
+ case of a rectangle.
+
+ \TODO:
+ In the case when the reference point lies outside the ellipse
+ the Newton iteration is not guaranteed to converge.
+ A simple test --- $s$ growing rather than decreasing in size ---
+ detects possible converge problems and exits the iteration.
+ The following message is issued \dots
+ $$|Xy-pic warning: poor convergence.|$$
+ Often, particularly when the reference point is on or near
+ the edge of the ellipse,
+ an acceptable approximation to the edge has been found anyway.
+
+\DOCMODE(
+\xydef@\ellipseEdge@{\bgroup
+ \A@=\R@c \B@=\U@c
+ \ifdim\R@c=\L@c \d@X=\z@
+ \else \d@X=.5\R@c \advance\d@X-.5\L@c
+ \advance\A@\L@c \divide\A@\tw@ \fi
+ \ifdim\U@c=\D@c \d@Y=\z@
+ \else \d@Y=.5\U@c \advance\d@Y-.5\D@c
+ \advance\B@\D@c \divide\B@\tw@ \fi
+ \bgroup
+ \L@c=\A@ \U@c=\B@
+ \R@p=\U@c \advance\R@p\L@c \multiply\R@p\tw@
+ \ifdim\B@<\A@ \quotient@\tmp@\U@c\L@c \R@c=\tmp@\p@ \D@c=\p@
+ \quotient@\tmp@\R@p\L@c \R@p=\tmp@\p@
+ \else
+ \ifdim\A@<\B@ \quotient@\tmp@\L@c\U@c \D@c=\tmp@\p@ \R@c=\p@
+ \quotient@\tmp@\R@p\U@c \R@p=\tmp@\p@
+ \else
+ \R@c=\p@ \D@c=\p@ \quotient@\tmp@\R@p\U@c \R@p=\tmp@\p@
+ \fi\fi
+ \quotient@\sd@X\d@X\L@c \d@X=\sd@X\p@
+ \quotient@\sd@Y\d@Y\U@c \d@Y=\sd@Y\p@
+ \loop
+ \bgroup \U@p=-\p@ \D@p=\z@
+ \ifdim\R@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\R@p
+ \advance\d@X\cosDirection\dimen@
+ \else \advance\d@X\cosDirection\R@p \fi
+ \edef\sd@X{\expandafter\removePT@\the\d@X}%
+ \advance\U@p\sd@X\d@X
+ \ifdim\R@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\dimen@=\tmp@\d@X
+ \advance\D@p\cosDirection\dimen@
+ \else \advance\D@p\cosDirection\d@X \fi
+%
+ \ifdim\D@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\D@c}\dimen@=\tmp@\R@p
+ \advance\d@Y\sinDirection\dimen@
+ \else \advance\d@Y\sinDirection\R@p \fi
+ \edef\sd@Y{\expandafter\removePT@\the\d@Y}%
+ \advance\U@p\sd@Y\d@Y
+ \ifdim\D@c<\p@
+ \edef\tmp@{\expandafter\removePT@\the\D@c}\dimen@=\tmp@\d@Y
+ \advance\D@p\sinDirection\dimen@
+ \else \advance\D@p\sinDirection\d@Y \fi
+ \multiply\D@p\tw@
+ \dimen@=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\dimen@<.01\p@ \U@p=\z@
+ \else
+ \quotient@\tmp@\U@p\D@p \U@p=\tmp@\p@
+ \ifdim\U@p<\z@\xywarning@{poor convergence}\U@p=\z@
+ \else \advance\R@p-\U@p \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \fi \fi
+ \edef\next@{\egroup \R@p=\the\R@p \U@p=\the\U@p \D@p=\the\D@p}\next@
+ \ifdim\U@p>\z@ \repeat
+ \edef\next@{\egroup \dimen@=\the\R@p}\next@
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \ifdim\B@<\A@ \dimen@=\tmp@\B@ \else \dimen@=\tmp@\A@ \fi
+ \dimen@=-\dimen@
+ \advance\X@c\cosDirection\dimen@
+ \advance\Y@c\sinDirection\dimen@
+ \edef\next@{\egroup \X@c=\the\X@c \Y@c=\the\Y@c}\next@ }%
+\DOCMODE)
+
+ The `Under' procedure is identical to the centered version.
+
+\DOCMODE(
+\xydef@\ellipseOuter@{\Edge@c={\rectangleEdge}}
+
+\xydef@\ellipseInner@{%
+ \bgroup \X@p=\X@c \Y@p=\Y@c \ellipseEdge@
+ \d@X=\X@c\advance\d@X-\X@p
+ \ifdim\d@X>\z@ \R@p=\d@X \L@p=\R@p
+ \ifdim\L@c=\R@c\else\advance\L@p\L@c \advance\L@p-\R@c \fi
+ \else \L@p=-\d@X \R@p=\L@p
+ \ifdim\L@c=\R@c \else\advance\R@p\R@c \advance\R@p-\L@c \fi
+ \fi
+ \d@Y=\Y@c\advance\d@Y-\Y@p
+ \ifdim\d@Y>\z@ \U@p=\d@Y \D@p=\U@p
+ \ifdim\D@c=\U@c\else\advance\D@p\D@c \advance\D@p-\U@c \fi
+%\else \D@p=-\d@X \R@p=\D@p
+ \else \D@p=-\d@Y \U@p=\D@p % <<<<<<========
+ \ifdim\D@c=\U@c\else\advance\U@p\U@c \advance\U@p-\D@c \fi
+ \fi
+ \edef\next@{\egroup
+ \L@c=\the\L@p \D@c=\the\D@p \R@c=\the\R@p \U@c=\the\U@p}%
+ \next@ \Edge@c={\rectangleEdge}}
+\DOCMODE)
+
+\paragraph*{Rectangles:}\leavevmode
+
+ Rectangles intersection is slightly more complicated and handled
+ separately for the horizontal and vertical case.
+
+\DOCMODE(
+\xydef@\rectangleEdge#1{\ifcase#1\expandafter\rectangleEdge@
+ \or \expandafter\rectangleUnder@ \or \expandafter\rectangleDist@
+ \or \expandafter\rectangleProp@ %%%\or \expandafter\rectangleInner@ BUG!
+ \else \relax \fi}
+\DOCMODE)
+
+ \BUG: no `Inner' for rectangles!
+
+\DOCMODE(
+% \rectangleEdge@
+% Sets <X,Y> to the intersection of a line from <X-dX,Y-dY> to <X,Y>
+% and the rectangle from <X-L,Y-D> to <X+R,Y+U>:
+%
+% %1a dY<0, dX<0: X := X + min{R, U*|dX/dY|},
+% Y := Y + min{U, R*|dY/dX|};
+% b dY<0, dX=0: Y := Y + U;
+% c dY<0, dX>0: X := X - min{L, U*|dX/dY|},
+% Y := Y + min{U, L*|dY/dX|};
+%
+% %2a dY=0, dX<0: X := X + R;
+% b dY=0, dX=0: ;
+% c dY=0, dX>0: X := X - L;
+%
+% %3a dY>0, dX<0: X := X + min{R, D*|dX/dY|},
+% Y := Y - min{D, R*|dY/dX|};
+% b dY>0, dX=0: Y := Y - D;
+% c dY>0, dX>0: X := X - min{L, D*|dX/dY|},
+% Y := Y - min{D, L*|dY/dX|};
+%
+% %4 \resetupDirection@ to register that even though dX,dY changed all
+% Direction parameters are is still valid!
+%
+% NOTE: d=0 really means |d| < .05pt.
+%
+\xydef@\rectangleEdge@{%
+ \ifdim\d@Y<-.05\p@ \rectangleEdge@i %1
+ \else\ifdim\d@Y<.05\p@ \rectangleEdge@ii %2
+ \else \rectangleEdge@iii\fi\fi
+ \resetupDirection@}
+
+\xydef@\rectangleEdge@i{%
+ \ifdim\d@X<-.05\p@
+ \settomin@\X@c+\R@c\U@c\d@X\d@Y \settomin@\Y@c+\U@c\R@c\d@Y\d@X%1a
+ \else\ifdim\d@X<.05\p@ \advance\Y@c\U@c %1b
+ \else \settomin@\X@c-\L@c\U@c\d@X\d@Y \settomin@\Y@c+\U@c\L@c\d@Y\d@X %1c
+ \fi\fi}
+
+\xydef@\rectangleEdge@ii{%
+ \ifdim\d@X<-.05\p@ \advance\X@c\R@c %2a
+ \else\ifdim\d@X<.05\p@ %2b
+ \else \advance\X@c-\L@c %2c
+ \fi\fi}
+
+\xydef@\rectangleEdge@iii{%
+ \ifdim\d@X<-.05\p@
+ \settomin@\X@c+\R@c\D@c\d@X\d@Y \settomin@\Y@c-\D@c\R@c\d@Y\d@X%3a
+ \else\ifdim\d@X<.05\p@ \advance\Y@c-\D@c %3b
+ \else \settomin@\X@c-\L@c\D@c\d@X\d@Y \settomin@\Y@c-\D@c\L@c\d@Y\d@X %3c
+ \fi\fi}
+
+\xydef@\settomin@#1#2#3#4#5#6{%
+ % Perform d := #2 min{#3, #4*|#5/#6|}; #1 := #1+d ...
+ \edef\nextii@{\A@=\the\A@ \B@=\the\B@}\quotient@\next@{#5}{#6}\nextii@
+ \dimen@=\sd@X\sd@Y\next@#4\relax
+ \ifdim#3<\dimen@ \dimen@=#3\fi \advance#1#2\dimen@}
+\DOCMODE)
+
+ Checking that $p$ is under is simpler: Normally it is not but
+ if $c=p$ or ($-L_c \lt X_p-X_c \lt R_c$ and $-D_c \lt Y_p-Y_c \lt
+ U_c$) then it is.
+
+\DOCMODE(
+\xydef@\rectangleUnder@{\Inside@false
+ \ifdim\X@p=\X@c \ifdim\Y@p=\Y@c \Inside@true \fi\fi
+ \ifInside@ \else
+ \dimen@=\X@p \advance\dimen@-\X@c
+ \ifdim \dimen@>-\L@c \relax \ifdim\dimen@<\R@c
+ \dimen@=\Y@p \advance\dimen@-\Y@c
+ \ifdim \dimen@>-\D@c \relax \ifdim\dimen@<\U@c
+ \Inside@true
+ \fi\fi\fi\fi\fi }
+\DOCMODE)
+
+ Calculating the width is like computing the edge point, just simpler:
+ (??_[rDist])~Set $A$ to the horizontal and $B$ to the vertical
+ distance applicable; if either is zero (or close) use the other
+ unmodified . (??_[rDisti])~If both nonzero use
+ $\min(A/\cos\alpha,B/\sin\alpha)$ where $\alpha$ is the current angle.
+
+\DOCMODE(
+\xydef@\rectangleDist@{\let\next@=\rectangleDist@i %?*[rDist]
+ \ifdim\d@X<-.05\p@ \dimen@=\R@c
+ \else\ifdim\d@X<.05\p@ \dimen@=\z@ \DN@{\dimen@=\dimen@ii}%
+ \else \dimen@=\L@c \fi\fi
+ \ifdim\d@Y<-.05\p@ \dimen@ii=\U@c
+ \else\ifdim\d@Y<.05\p@ \DN@{}%
+ \else \dimen@ii=\D@c \fi\fi
+ \next@}
+
+\xydef@\rectangleDist@i{%?*[rDisti]
+ \begingroup \quotient@\next\p@{\sd@X\cosDirection\p@}%
+ \edef\next{\endgroup \dimen@=\next\dimen@}\next
+ \begingroup \quotient@\next\p@{\sd@Y\sinDirection\p@}%
+ \edef\next{\endgroup \dimen@ii=\the\dimen@ii}\next
+ \ifdim\dimen@ii<\dimen@ \dimen@=\dimen@ii \fi}
+\DOCMODE)
+
+ Setting $c$ to the `proportional edge point' is straight out of
+ v2.6's |\setlabel@@| macro\dots
+
+\DOCMODE(
+% First rotate to opposite direction.
+
+% Then compute Leftf,Upf [\next@,\nextii@]:
+% 0,(D-2K)/2K for 2K < D <= 4K [right]
+% (2K-D)/2K,0 for 0 < D <= 2K [down]
+% 1,-D/2K for -2K < D <= 0 [left]
+% (D+4K)/2K,1 for -4K < D <= -2K [up]
+
+% Finally set <X,Y> to
+% < X - L + Leftf*(R+L) , Y + U - Upf*(D+U) >
+
+\xydef@\rectangleProp@{%
+ \enter@{\A@=\the\A@ \B@=\the\B@ \DirectionfromtheDirection@}%
+ \reverseDirection@
+ \dimen@=1\Direction \count@=\K@ \multiply\count@\tw@
+ \ifnum \Direction>\count@
+ \DN@{0}%
+ \advance\dimen@-2\K@ \quotient@\nextii@{\dimen@}{2\K@}%
+ \else\ifnum \Direction>\z@
+ \dimen@=-\dimen@ \advance\dimen@2\K@ \quotient@\next@{\dimen@}{2\K@}%
+ \DNii@{0}%
+ \else\ifnum \Direction>-\count@
+ \DN@{1}%
+ \quotient@\nextii@{-\dimen@}{2\K@}%
+ \else
+ \advance\dimen@4\K@ \quotient@\next@{\dimen@}{2\K@}%
+ \DNii@{1}%
+ \fi\fi\fi
+ \advance\X@c-\L@c \dimen@=\L@c \advance\dimen@\R@c
+ \ifdim\dimen@=\z@ \advance\X@c 2\L@c \else \advance\X@c\next@\dimen@ \fi
+ \advance\Y@c+\U@c \dimen@=\D@c \advance\dimen@\U@c
+ \ifdim\dimen@=\z@ \advance\Y@c-2\U@c \advance\Y@c\Upness@\U@c
+ \else \advance\Y@c-\nextii@\dimen@ \fi
+ \leave@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Connections}
+??=[algo.connection]
+
+\DOCMODE(
+\message{connections;}
+\DOCMODE)
+
+ Connections describe how a particular <object> may be used to connect
+ $p$ to $c$. The following parameters and methods are defined by any
+ connection; they should be used in the indicated
+ sequence:??w[connection methods]
+%
+\begin{description}
+
+\item[|\Invisible@@|, |\Hidden@@|, and |\Drop@@|:] as for <object>.
+
+\item[|\Creset@@|:]
+ (Re)set the connection parameters to allow use of the following to
+ move to a point on the connection (this is what the interpretation of
+ <pos> |?| does first). All effects obtained by the following methods
+ are undone: |\Creset@@| reestablishes the state to what it was just
+ after the |\Connect@@| every time.
+
+\item[|\Cshavep@@| or |\Cshavec@@|:]
+ Change $p$ or $c$ to a zero-sized object at the start or finish of
+ the connection (the first |<| and |>| <place> components).
+
+\item[|\Calong@@{|<factor>|}|:]
+ Move $c$ to point the <factor> along the connection and set the
+ direction parameters as a tangent to it in this point (the
+ |(|<factor>|)| <place> component).
+
+\item[|\Cslidep@@{|<dimen>|}| or |\Cslidec@@{|<dimen>|}|:]
+ Move $p$ or $c$ the <dimen>sion further in the current direction.
+ Can be used both before and after the |\Calong@@| method (these
+ handle subsequent |<| and |>| as well as the |/|<slide>|/| <place>
+ component).
+
+\item[|\Cintercept@@|:]
+ Set $c$ to a zerosized object at the point where the connection
+ crosses the straight line from $p$ to $c$ (the |!{|\dots|}| <place>
+ component).
+
+\item[|\Cbreak@@| and |\Clast@@|:]
+ These support typesetting of the connection in several `subsegments'
+ as used by the arrow option. The idea is the following, using the
+ internal "lastbreak" and "nextbreak" positions:
+\begin{enumerate}
+
+\item |\Connect@@| sets $"lastbreak":=p$ and $"nextbreak":=c$
+
+\item The commands |\Cslidec@@|, |\Cslidep@@|, and |\Cintercept@@|, set
+ "nextbreak" logically to the position that is obtained by the
+ manipulation.
+
+\item |\Cbreak@@| retypesets the connection except only the piece
+ from "lastbreak" to the current $c$ object, which "must" be at on top
+ of "nextbreak", is typeset. Afterwords it sets
+ $"lastbreak":="nextbreak"$ and $"nextbreak":=c$ (where $c$ is the
+ original $c$ of the connection).
+
+\item The command |\Clast@@| typesets from "lastbreak" and the remainder of
+ the connection, and resets $"lastbreak":=p$ and $"nextbreak":=c$.
+
+\end{enumerate}
+\end{description}
+%
+ Notice that it is not necessary for "nextbreak" to actually exist, in
+ fact in the kernel it is just an alias for $c$ at the time
+ |\Cbreak@@| is called.
+
+ These are the defaults for basic \Xy-pictures that only has straight
+ connections hence the macros all starting with |\no|\dots are rather
+ simple -- in particular they just merge with zerosized objects at the
+ locations cutoff locations (this was inherited from the broken
+ |arrow| code~\smiley~).
+
+\DOCMODE(
+\xydef@\Creset@@{}
+\xydef@\Cshavep@@{\noCshavep@@}
+\xydef@\Cshavec@@{\noCshavec@@}
+\xydef@\Cslidep@@{\noCslidep@@}
+\xydef@\Cslidec@@{\noCslidec@@}
+\xydef@\Calong@@{\noCalong@@}
+\xydef@\Cintercept@@{\noCintercept@@}
+\xydef@\Cbreak@@{\noCbreak@@}
+\xydef@\Clast@@{\noClast@@}
+
+\xylet@\lastbreak@@=\empty
+
+\xydef@\noCshavep@@{\setupDirection@
+ \enter@{\cfromthec@ \DirectionfromtheDirection@}%
+ \reverseDirection@ \cfromp@ \the\Edge@c\z@
+ \pfromc@ \leave@ \resetDirection@}
+
+\xydef@\noCshavec@@{\setupDirection@ \the\Edge@c\z@ \resetDirection@}
+
+\xydef@\noCslidep@@#1{\dimen@=#1\relax
+ \advance\X@p\cosDirection\dimen@ \advance\Y@p\sinDirection\dimen@
+ \resetDirection@}
+
+\xydef@\noCslidec@@#1{\dimen@=#1\relax
+ \advance\X@c\cosDirection\dimen@ \advance\Y@c\sinDirection\dimen@
+ \resetDirection@}
+
+\xydef@\noCalong@@#1{%
+ \d@X=#1\d@X \d@Y=#1\d@Y \X@c=\X@p \Y@c=\Y@p \advance\X@c\d@X \advance\Y@c\d@Y
+ \resetupDirection@}
+\DOCMODE)
+
+ Next the intercept method that just uses |\intersect@|.
+
+\DOCMODE(
+\xydef@\noCintercept@@{\enter@{\pfromthep@}%
+ \begingroup\Creset@@ \edef\tmp@{\endgroup
+ \X@origin=\the\X@p \Y@origin=\the\Y@p \R@c=\the\d@X \U@c=\the\d@Y}\tmp@
+ \loop@\dimen@=\ifdim\R@c<\z@-\fi\R@c \advance\dimen@\ifdim\U@c<\z@-\fi\U@c
+ \ifdim\dimen@>10\p@ \advance\R@c \ifdim\R@c<\z@-\fi 16sp \divide\R@c\KK@
+ \advance\U@c \ifdim\U@c<\z@-\fi 16sp \divide\U@c\KK@ \repeat@
+ \intersect@ \leave@}
+\DOCMODE)
+
+ And finally the dummy `break' method which of course does nothing
+ except the required shifting.
+
+\DOCMODE(
+\xydef@\noCbreak@@{\edef\lastbreak@@{\cfromthec@}}
+\xydef@\noClast@@{\Creset@@ \edef\lastbreak@@{\cfromthep@}}
+\DOCMODE)
+
+ The kernel only defines one kind of connection which is used by
+ default: `filling' many copies of the connect object on the straight
+ line from $p$ to $c$.
+
+ First the `dummy' connection type |no| used for <object>s where it
+ doesn't really make sense to `connect', and used to provide defaults
+ for easy operations:
+
+\DOCMODE(
+\xydef@\no@@{\setupDirection@ \edef\lastbreak@@{\cfromthep@}%
+ \enter@{\cfromthec@\pfromthep@\DirectionfromtheDirection@}%
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \edef\next@{{\sd@X}{\sd@Y}}\expandafter\straightcheckoverlap@\next@
+ \setupDirection@ \the\Edge@c\z@
+ \swap@\reverseDirection@\the\Edge@c\z@\swap@\reverseDirection@
+ \resetDirection@
+ \edef\Cshavep@@{\DirectionfromtheDirection@
+ \pfromthep@\noexpand\resetDirection@}%
+ \edef\Cshavec@@{\DirectionfromtheDirection@
+ \cfromthec@\noexpand\resetDirection@}%
+ \leave@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\def\Cintercept@@{\noCintercept@@}%
+ \def\Cbreak@@{\noCbreak@@}\def\Clast@@{\noClast@@}\noinsert@}
+
+\xydef@\noinsert@{\ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi
+ \fi}
+\DOCMODE)
+
+ Next `straight' connections that use the following special parameters
+ to customises how to repeat a `filler' object as many times as needed
+ to draw the connection:
+%
+\begin{description}
+
+\item[|\lastobjectbox@|:] box to fill with; assumed to be `trimmed' to have
+ only the size needed for the filler; size is $w*(h+d)$).
+
+\end{description}
+%
+ The method is called as |\straight@{|<spread>|}| where <spread> is a
+ macro to expand "after" the number of fillers $N$ (in |\count@@|) is
+ known and with $A=w$ and $B=d+h$ but "before" any filling is done.
+ May change $N$ as well as $"dX","dY",X,Y,w,d,h$ in order to affect
+ the filling.
+
+\subparagraph*{Procedure:}
+%
+ [??_[Strgt1]] setup direction parameters, clear the break state, and
+ define the |\Creset@@| macro to reestablish this initial state;
+ [??_[Strgt2]] build macro to discover if the edges of the objects
+ overlap (it edges were removed); [??_[Strgt3]] move both $p,c$ to the
+ edges of the objects\dots and define the |\Cshave*@@| macros
+ accordingly; [??_[Strgt4]] choose either to ignore the connection if
+ requested or there is overlap between the objects of choose either
+ vbox or hbox version (see below)\dots; and [??_[Strgt5]] build
+ |\Calong@@|, |\Cbreak@@|, and |\Clast@@| macros, and reset $pc$.
+
+ \NOTE: Assumes that the direction is not tampered with between Creset
+ is defined and used\dots
+
+\DOCMODE(
+\xydef@\Spread@@{}
+\xydef@\checkoverlap@@{}
+
+\xydef@\straight@#1{\setupDirection@ \def\Spread@@{#1}% %?*[Strgt1]
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \edef\lastbreak@@{\cfromthep@}%
+ \edef\next@{{\sd@X}{\sd@Y}}\expandafter\straightcheckoverlap@\next@ %?*[Strgt2]
+ \setupDirection@ \the\Edge@c\z@
+ \swap@\reverseDirection@\the\Edge@c\z@\swap@\reverseDirection@
+ \resetDirection@
+ \edef\Cshavep@@{\DirectionfromtheDirection@
+ \pfromthep@\noexpand\resetDirection@}%
+ \edef\Cshavec@@{\DirectionfromtheDirection@
+ \cfromthec@\noexpand\resetDirection@}%
+ \noinsert@ %?*[Strgt3b]
+ \straight@typeset %?*[Strgt4]
+ \def\Cbreak@@{\straightCbreak@}\def\Clast@@{\straightClast@}%
+% \DN@{\solidSpread@}\ifx\next@\Spread@@
+% \checkXy@rules@\solidhrule@pre\solidvrule@pre\relax
+% \fi
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%?*[Strgt5]
+ \def\Calong@@{\noCalong@@}\def\Cintercept@@{\noCintercept@@}%
+ \Creset@@}
+
+\xydef@\straightcheckoverlap@#1#2{\def\checkoverlap@@{%
+ \ifdim#1\X@p>#1\X@c \let\next@=\relax \fi
+ \ifdim#2\Y@p>#2\Y@c \let\next@=\relax \fi}}
+
+\xydef@\straight@typeset{%
+ \ifInvisible@ \let\next@=\relax
+ \else\ifdim 1\Direction<-2\K@ \DN@{\straightv@}%
+ \else\ifdim 1\Direction<\z@ \DN@{\straighth@}%
+ \else\ifdim 1\Direction<2\K@ \DN@{\straightv@}%
+ \else \DN@{\straighth@}%
+ \fi\fi\fi\fi \checkoverlap@@ \next@}
+\DOCMODE)
+
+ The methods |\straightCbreak@| and |\straightClast@| implement the
+ break method parametrised on the `typeset' primitive which is usually
+ |\straight@typeset| which is a simplified version of |\straight@|
+ that does not initialise. This relies on the connection being
+ straight: the |Cbreak@@| method executes $p,c :=
+ p|.|"lastbreak",c|.|"nextbreak"$ and |Clast@@| executes $p,c :=
+ p|.|"lastbreak",c$, where in both cases the |[Inner]| modifier is
+ applied just before the merging to make sure the edge is respected by
+ the merged object.
+
+\DOCMODE(
+\xylet@\nextbreak@@=\empty
+
+\xydef@\straightCbreak@{\connectRestore@
+ \edef\nextbreak@@{\cfromthec@}%
+ \Creset@@ \swap@ \the\Edge@c4\enter@{\cmergethec@}\lastbreak@@ \leave@
+ \swap@ \the\Edge@c4\enter@{\cmergethec@}\nextbreak@@ \leave@
+ \setupDirection@
+ \the\Edge@c\z@
+ \swap@ \reverseDirection@ \the\Edge@c\z@ \swap@ \reverseDirection@
+ \resetDirection@ \noinsert@ \straight@typeset
+ \Creset@@ \let\lastbreak@@=\nextbreak@@}
+
+\xydef@\straightClast@{\connectRestore@
+ \Creset@@ \swap@ \the\Edge@c4\enter@{\cmergethec@}\lastbreak@@ \leave@
+ \swap@
+ \setupDirection@
+ \the\Edge@c\z@
+ \swap@\reverseDirection@ \the\Edge@c\z@ \swap@\reverseDirection@
+ \resetDirection@ \noinsert@ \straight@typeset
+ \Creset@@ \edef\lastbreak@@{\cfromthep@}}
+\DOCMODE)
+
+ Now for the typesetting -- to summarise: these are parametrised on
+ direction parameters and use $X,Y$: endpoint of connection
+ (`Direction end'). $"dX","dY"$: connection distance (`Direction
+ vector'). |\Leftness@| of <object>. |\lastobjectbox@| to fill with;
+ assumed to be `trimmed'. |\Spread@@| to expand to modify the default
+ spreading used. |\Drop@@| to expand to actually typeset the finished
+ connection when it is in box0! \NOTE: Must make box0 void to avoid
+ `box leaks'.
+
+ Two variants exist: one for mostly horisontal and one for mostly
+ vertical filling. We detail the `mostly horisontal' one:
+
+ [??_[StrH0]] start box;
+%
+ [??_[StrH1]] compute initial adjustment ($X$ right and $Y$ up) and
+ $A := w$, $B := h+d$, $N = \floor(\abs{"dX"} / A)$,
+ and run user supplied Spread;
+%
+ [??_[StrH2]] adjust first filler position horizontally:
+ if $dX\gt0$ then $X := X-w$;
+%
+ [??_[StrH4]] adjust first filler vertically: $Y := Y -
+ "sdX"*L*("dY"/"dX")*w$ where $L = \textup{if} dX>0 \textup{then}
+ (1-Leftness) \textup{else} Leftness$;
+%
+ [??_[StrH3]] recompute the move dimensions ($A$ right and $B$ up):
+ $A := -"sdX"(\abs{dX} - w) / (N-1)$,
+ $B := "sdY"\abs{"sdX"(w)*"dY"/"dX" - dY} / (N-1)$,
+ and set the filler box to have $w := A$;
+%
+ [??_[StrH5]] output first filler adjusted $X,Y$ and the following $N-1$
+ each $A$ further right and raised $B$ more than the previous;
+%
+ and finally end object with usual bravour!
+
+\DOCMODE(
+\xydef@\straighth@{\setbox\z@=\hbox{%
+ \setbox8=\copy\lastobjectbox@
+ \A@=\wd8\relax \B@=\dp8\relax \advance\B@\ht8\relax %?*[StrH1]
+ \ifdim \A@=\z@ \count@@=\m@ne
+ \else \dimen@=\sd@X\d@X \divide\dimen@\A@ \count@@=\dimen@ \fi
+ \Spread@@
+ \ifdim\d@X>\z@ \advance\X@c-\wd8\relax\fi %?*[StrH2]
+ \dimen@=-\sd@X\wd8\relax %?*[StrH4]
+ \multiply\dimen@\K@dYdX \divide\dimen@\K@
+ \ifdim\d@X>\z@ \advance\Y@c\dimen@ \advance\Y@c-\Leftness@\dimen@
+ \else \advance\Y@c\Leftness@\dimen@ \fi
+ \dimen@=\wd8\relax \A@=\sd@X\d@X \advance\A@-\dimen@ %?*[StrH3]
+ \B@=\sd@X\dimen@ \multiply\B@\K@dYdX \divide\B@\K@
+ \advance\B@-\d@Y \B@=\sd@Y\B@
+ \count@=\count@@ \advance\count@\m@ne
+ \ifnum\z@<\count@ \divide\A@\count@ \divide\B@\count@ \fi
+ \A@=-\sd@X\A@ \B@=\sd@Y\B@ \wd8=\A@
+ \kern\X@c \count@=\z@ %?*[StrH5]
+ \loop@\ifnum\count@<\count@@ \advance\count@\@ne
+ \raise\Y@c\copy8\relax \advance\Y@c\B@ \repeat@}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
+\DOCMODE)
+
+ The mosly vertical is analogous. \BUG: |\dimen@| holds the unadjusted
+ $h+d$ throughout -- somehow it works anyway!
+
+\DOCMODE(
+\xydef@\straightv@{\setbox\z@=\vtop{%
+ \setbox8=\copy\lastobjectbox@
+ \A@=\wd8\relax \B@=\dp8\relax \advance\B@\ht8\relax
+ \ifdim \B@=\z@ \count@@=\m@ne
+ \else \dimen@=\sd@Y\d@Y \divide\dimen@\B@ \count@@=\dimen@ \fi
+ \Spread@@
+ \dimen@=\dp8\relax \advance\dimen@\ht8\relax
+ \B@=\sd@Y\d@Y \advance\B@-\dimen@
+ \A@=\sd@Y\dimen@ \multiply\A@\K@dXdY \divide\A@\K@ \advance\A@-\d@X
+ \A@=\sd@X\A@ \count@=\count@@ \advance\count@\m@ne
+ \ifnum\z@<\count@ \divide\B@\count@ \divide\A@\count@ \fi
+ \B@=\sd@Y\B@ \A@=\sd@X\A@ \ht8=\B@ \dp8=\z@
+ \ifdim\d@Y<\z@
+ \advance\Y@c\dimen@ \advance\Y@c\Upness@\B@
+ \else
+ \advance\dimen@\Upness@\B@ \advance\Y@c-\dimen@ \advance\Y@c\B@
+ \fi
+ \advance\Y@c\B@
+ \ifdim\d@X<\z@ \else \advance\X@c-\wd8\relax \fi
+ \null \kern-\Y@c \count@=\z@
+ \loop@\ifnum\count@<\count@@ \advance\count@\@ne
+ \nointerlineskip \moveright\X@c\copy8\relax \advance\X@c\A@
+ \repeat@}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\section*{End \& log}
+
+ \Xy-pic ends with a message saying so.
+
+\DOCMODE(
+\message{ Xy-pic loaded}\xyuncatcodes \endinput
+\DOCMODE)
+
+ \Xy-pic is maintained using the RCS ``Revision Control System'' by
+ Walther F.~Tichy. The following is the revision history since the
+ first release to Usenet.
+
+\DOCMODE(
+% $Log: xy.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.5 1997/05/28 13:05:01 krisrose
+% Fixed missing breaks bug.
+%
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/05 22:20:09 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:55:12 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/11 09:31:09 kris
+% Second (bug fix) 3alpha release [corrected].
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% MAJOR REWRITE and REORGANISATION:
+% File xypic.doc split into separate files: xy.doc for `kernel' and other
+% files with the `extensions' and `features'.
+% Documented in special DOCMODE LaTeX-based format supported by xydoc.sty.
+%
+% Revision 2.6.1.1 1992/07/01 07:08:24 kris
+% Send to EuroTeX '92...
+%
+% Revision 2.6 1992/06/24 01:23:34 kris
+% Added hooks using font xyqc10.
+% Added new POSitions: * and !.
+% Added triple lines \Ssolid and \Ddashed.
+%
+% Revision 2.5 1992/02/24 03:30:54 kris
+% Fixed bugs in \Direction calculation logic...
+% Added (FACTOR) to \rotate to allow arbitrary rotation.
+% ` intermediate points now accept an optional /RADIUS argument.
+% Added \Tip with wide tip.
+% [See ChangeLog for further details].
+%
+% Revision 2.4 1992/01/22 02:15:10 kris
+% Fixed bugs [with thanks]:
+% No spurious arrow heads with LaTeX: \pit now undefined [Werner Struckmann]
+% \Solid works: sets \Density [Dave Bowen]
+% Short diagonal lines work...major rewrite of \connectv@ [Eric Domenjoud]
+%
+% Revision 2.3 1992/01/13 23:28:12 kris
+% Swapped definitions of \ddtoX and \uutoX [found by Nico Verwer].
+% Diagonal lines were wrong [Eric Domenjoud].
+%
+% Revision 2.2 1992/01/09 04:05:40 kris
+% Still problems with rules in frames and horizontal/vertical \solids. Grrr.
+%
+% Revision 2.1 1992/01/02 14:54:07 kris
+% Release version.
+%
+% Revision 1.40 1991/12/17 04:53:23 kris
+% Version distributed as `final draft' on Usenet.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% TeX-parse-self:nil
+% LaTeX-indent-level:1
+% TeX-brace-indent-level:1
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xy.sty b/Master/texmf-dist/source/generic/xypic/xy.sty
new file mode 100644
index 00000000000..32867e52f57
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xy.sty
@@ -0,0 +1,103 @@
+%% $Id: xy.sty,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+%%
+%% ``Xy-pic as LaTeX 2.09 style option and LaTeX 2e package''.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+
+% Load Xy-pic with catcode of @ set as it will be in user text:
+\count255=\the\catcode`\@ {\catcode`\@=11 \xdef\xystycatcode{\the\count255}}
+\makeatletter
+
+% REPAIR bug of the 2e version of AMS-LaTeX where \makeatother is broken...
+\ifx\@ifpackageloaded\undefined \makeatother
+\else \@ifpackageloaded{amstex}{\catcode`\@=\active}{\makeatother}\fi
+
+\input xy
+
+% That is all unless this is called as a LaTeX2e `native mode' package. Is
+% there an official way to check this? Anyway, this seems to work:
+\makeatletter
+\ifx\if@compatibility\undefined \catcode`\@=\xystycatcode \endinput \fi
+
+% Ensure that we are *really* running LaTeX2e...!
+\NeedsTeXFormat{LaTeX2e}
+
+% This file provides the current version of Xy-pic!
+\edef\next{%
+ \noexpand\ProvidesPackage{xy}[\xydate\space Xy-pic version \xyversion]}\next
+
+% Recognise some standard LaTeX2e class options (cf. `LaTeX Companion' p.317):
+\DeclareOption{cmactex}{\xyoption{cmactex}}
+\DeclareOption{dvips}{\xyoption{dvips}\xyoption{ps}}
+\DeclareOption{dvitops}{\xyoption{dvitops}\xyoption{ps}}
+\DeclareOption{emtex}{\xyoption{emtex}}
+\DeclareOption{ln}{\xywarning@{`ln' DVI driver not yet fully supported}}
+\DeclareOption{oztex}{\xyoption{oztex}}
+\DeclareOption{textures}{\xyoption{textures}}
+\DeclareOption{xdvi}{\xyoption{xdvi}}
+
+% This is special:
+\DeclareOption{colour}{\xyoption{color}} % :-)
+
+% This (obsolete) cmtip style option should be activated after loading:
+\DeclareOption{cmtip}{\xyoption{cmtip}\UseComputerModernTips}
+
+% Pass the desired tip size if defined
+\DeclareOption{10pt}{\xywithoption{tips}{\def\tipsize@@{10}}}
+\DeclareOption{11pt}{\xywithoption{tips}{\def\tipsize@@{11}}}
+\DeclareOption{12pt}{\xywithoption{tips}{\def\tipsize@@{12}}}
+
+% Other options are just loaded.
+\DeclareOption*{\edef\next{\noexpand\xyoption{\CurrentOption}}\next}
+
+% Reinstall catcode of @...
+\catcode`\@=\xystycatcode
+
+% ... process the options, and that is all.
+\ProcessOptions
+
+\endinput
+
+% $Log: xy.sty,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% New for version 2.7.
diff --git a/Master/texmf-dist/source/generic/xypic/xy16textures.doc b/Master/texmf-dist/source/generic/xypic/xy16textures.doc
new file mode 100644
index 00000000000..c4a7545746f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xy16textures.doc
@@ -0,0 +1,294 @@
+%% $Id: xy16textures.doc,v 3.3 1996/12/18 14:21:23 ross Exp $
+%%
+%% Xy-pic ``Textures v1.6'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{16textures}{Textures v1.6 driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This driver provides support for versions 1.5b and 1.6 of Blue Sky Research's
+\Textures\ application for Macintosh\footnote{Macintosh is a trademark of
+Apple Computer Inc.}. It incorporates support for \PS\ colour and the
+\Xy-ps \PS\ back-end. This will {\em not} work with versions 1.7 and later;
+these require the <driver> option |\xyoption{textures}|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE(
+\xydef@\oldTextures@@#1{\dvimessage@{Textures v1.6}{#1}}
+
+\newdriver{%
+ \xyaddsupport{color}\oldtexturesColor@@
+ \xyaddsupport{crayon}\oldtexturesCrayon@@
+ \xyaddsupport{ps}\oldtexturesPS@@
+ \xyaddsupport{rotate}\oldtexturesRotate@@
+ \xyaddsupport{line}\oldtexturesLine@@
+ \xyaddsupport{frame}\oldtexturesFrames@@
+ \xyaddsupport{tile}\oldtexturesTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item colour, using \PS\
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Textures v1.6 cannot manage colours, except within imported graphics.
+It can put colours into the \PS\ output.
+
+\DOCMODE(
+\xydef@\oldTexturesColours@{\oldtexturesPStypes@
+ \let\xylocalColor@=\xyNoColor@@ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\oldtexturesCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@ \fi \next@
+ \let\xycolorwarning@=\relax
+ \let\oldtexturesColor@@=\relax
+ \let\UnloadColor@@=\NooldTexturesColor@
+ }
+
+\xydef@\oldtexturesColor@@{\oldTexturesColours@}
+
+\xydef@\NooldTexturesColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\oldtexturesColor@@=\oldTexturesColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item crayon colours.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The 68 colours are those that |dvips| recognizes by name,
+thanks to Tomas Rokicki.
+
+\DOCMODE(
+\xydef@\oldtexturesCrayon@@{\oldtexturesColor@@\oldtexturesCrayon@}
+\xydef@\oldtexturesCrayon@{\installCrayolaColors@}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \PS\ back-end.
+\DOCMODE(
+\xydef@\oldtexturesPS@@{\oldtexturesPS@}
+
+\xydef@\oldtexturesPSunload@{\UnloadPS@
+ \ifx\xyrealshipout@\undefined\else
+ \ifx\shipout\xyrealshipout@
+ \else \let\shipout=\xyrealshipout@\fi\fi
+ \let\installxyps@@=\relax
+ \let\UnloadPS@@=\UnloadPS@
+ \let\oldtexturesPS@@=\oldtexturesPS@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+We must return the binding of |\shipout| to its initial value.
+
+\medskip
+
+Early versions (1.5--1.6) of \Textures\ have two kinds of |\special|,
+for inserting \PS\ code into the dvi-file and two more for reading
+such code from a file:
+%
+\begin{itemize}
+\item |\special{rawpostscript #1}| puts code directly into the \PS\ file.
+\item |\special{postscript #1}| wraps the code within |sps|...|eps|,
+which involves graphics state changes within a |gsave/grestore| pair.
+\end{itemize}
+Each of these has a corresponding version for reading the \PS\ commands
+from a file.
+
+\DOCMODE(
+\xydef@\oldTexturesSpecial@#1{\firstPS@@\special{postscript #1}}
+\xydef@\oldTexturesMacro@#1{\special{postscript {#1}xy}}
+\xydef@\oldTexturesInclude@#1{\firstPS@@\special{rawpostscriptfile #1}}
+\xydef@\oldTexturesRaw@#1{\firstPS@@\special{rawpostscript #1}}
+
+\xydef@\oldtexturesPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\oldTexturesSpecial@\else
+ \let\PSspecial@@=\oldTexturesSpecial@
+ \let\PSmacro@@=\oldTexturesMacro@
+ \let\PSdict@@=\oldTexturesRaw@
+ \let\PSraw@@=\oldTexturesRaw@
+ \let\PSinclude@@=\oldTexturesInclude@
+ \let\PSspecialdict@@=\oldTexturesRaw@
+ \let\xyPSobeylines@@=\obeyoldTextureslines@
+ \oldTextures@@{PostScript}%
+ \fi
+% \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \oldtexturesCurrpt@ \@PSshipout }
+
+{\catcode`\^^M=\active %
+ \gdef\next{\catcode`\^^M=\active \let^^M=\par \obeyspaces}}
+\xylet@\obeyoldTextureslines@=\next
+\DOCMODE)
+
+The |currentpoint| is defined for the ``raw'' specials.
+For Textures this is the same as |\xyPScurrpt@@@|, in |xyps-ps.doc|.
+
+\DOCMODE(
+\xydef@\oldtexturesCurrpt@{\let\xyPScurrpt@@=\oldtexturesCurrpt@@}%
+\xydef@\oldtexturesCurrpt@@{\PSspecial@@{xyi}\PSraw@@{userdict begin xyx end}}
+\DOCMODE)
+
+The \PS\ operator called |xyx| is defined in |xyps-ps| for storing the
+location placed on the stack by |xyi|.
+
+\medskip
+
+\Textures~v1.6 requires the \PS\ dictionary to be shipped-out with
+every page. To achieve this efficiently we rebind |\shipout|,
+as described in |xyps-ps.doc|. Next set the flag |\UsePSdict@@true|
+after having rebound |\includePSmessage@| to gobble the attempt to load
+the dictionary directly into the dvi-file.
+
+This installs the \PS\ backend.
+
+\DOCMODE(
+\xydef@\oldtexturesPS@{\oldtexturesPStypes@
+ \let\oldtexturesPS@@=\relax
+ \let\UnloadPS@@=\oldtexturesPSunload@
+ \let\installxyps@@=\@PSshipout \installxyps@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item rotated/scaled diagrams and text, using \PS.
+
+\DOCMODE(
+\xydef@\oldtexturesRotate@@{\oldtexturesRotate@}
+
+\xydef@\oldtexturesRotate@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xyRotScale@@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths and poly-lines, using \PS.
+\DOCMODE(
+\xydef@\oldtexturesLine@@{\oldtexturesLine@}
+
+\xydef@\oldtexturesLine@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}%
+ \installPSline@ }%
+ \else\DN@{\xydriverfail@{line-styles are}\UnloadLine@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item extra frames and fills, using \PS.
+\DOCMODE(
+\xydef@\oldtexturesFrames@@{\oldtexturesFrames@}
+
+\xydef@\oldtexturesFrames@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}%
+ \installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item patterns and tiles, using \PS.
+\DOCMODE(
+\xydef@\oldtexturesTiles@@{\oldtexturesTiles@}
+
+\xydef@\oldtexturesTiles@{\oldtexturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}%
+ \installPSpatterns@ \xystandardpatterns@}%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xy16textures.doc,v $
+% Revision 3.3 1996/12/18 14:21:23 ross
+% Ross's version
+%
+% Revision 3.3.1.1 1996/12/18 08:45:28 ross
+% *** empty log message ***
+%
+% Revision 3.2 1995/09/19 18:20:20 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\endinput
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xy17oztex.doc b/Master/texmf-dist/source/generic/xypic/xy17oztex.doc
new file mode 100644
index 00000000000..41f1f80a9c3
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xy17oztex.doc
@@ -0,0 +1,301 @@
+%% $Id: xy17oztex.doc,v 3.3 1996/12/18 14:21:23 ross Exp $
+%%
+%% Xy-pic ``OzTeX v1.7'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{17oztex}{OzTeX v1.7 driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This option provides the necessary interface to support the \PS\ back-end and
+other \PS\ effects when using the DVI driver of version 1.7 of \OzTeX\ by
+Andrew Trevorrow,\footnote{\OzTeX\ is a shareware implementation of \TeX\ for
+Macintosh available from many bulletin boards and ftp sites; v1.5 and earlier
+versions were freeware. Email contact: <akt@kagi.com>.} "Later versions
+of \OzTeX\ should instead use the driver option |\xyoption{oztex}|."
+Upgrading to version 1.9+ of\OzTeX\ is recommended.
+
+Does not support rotations, scaling and coloured text within diagrams and the
+\PS\ dictionary must be available in a file called |global.ps|.
+
+\NOTE: To use \Xy-pic effectively with \OzTeX\ requires changing several
+memory parameters. In particular a `Big-\TeX' is needed, along with an
+increase in the |pool_size| parameter. Explicit instructions are contained in
+the file |INSTALL.|\-|OzTeX| of the \Xy-pic distribution.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE(
+\xydef@\OzTeX@@#1{\dvimessage@{OzTeX v1.7}{#1}}
+
+\newdriver{%
+ \xyaddsupport{color}\oldoztexColor@@
+ \xyaddsupport{crayon}\oldoztexCrayon@@
+ \xyaddsupport{ps}\oldoztexPS@@
+ \xyaddsupport{rotate}\oldoztexRotate@@
+ \xyaddsupport{line}\oldoztexLine@@
+ \xyaddsupport{frame}\oldoztexFrames@@
+ \xyaddsupport{tile}\oldoztexTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item colour, using \PS, but not of font-characters.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\oldoztexColor@@{\oldOzTeXColours@}
+
+\xydef@\oldOzTeXColours@{\oldOzTeXPStypes@
+ \let\xylocalColor@=\xyNoColor@@ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%\XYpredict@
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\oldOzTeXCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@\fi \next@
+ \let\xycolorwarning@=\relax
+ \let\oldoztexColor@@=\relax
+ \let\UnloadColor@@=\NooldOzTeXColor@
+ }
+
+\xydef@\NooldOzTeXColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\oldoztexColor@@=\oldOzTeXColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item crayon colours, similarly restricted.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The 68 colours are those that |dvips| recognizes by name,
+thanks to Tomas Rokicki.
+
+\DOCMODE(
+\xydef@\oldOzTeXCrayon@@{\installCrayolaColors@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \PS\ back-end.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\oldoztexPS@@{\oldoztexPS@}
+
+\xydef@\oldoztexPSunload@{\UnloadPS@
+ \def\xyPSdictname{}\UsePSdict@@false
+ \let\installxyps@@=\relax
+ \let\UnloadPS@@=\UnloadPS@
+ \xyPSshapes@true
+ \let\oldoztexPS@@=\oldoztexPS@ }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\oldOzTeXSpecial@#1{\special{empty.ps {#1}xy}}
+\xydef@\oldOzTeXMacro@#1{\special{empty.ps {#1}xy}}
+\xydef@\oldOzTeXDict@#1{\special{empty.ps @obxy{#1}stopped pop @eoxy}}
+\xydef@\oldOzTeXinclude@#1{\special{#1}}
+\xydef@\oldOzTeXraw@#1{\special{empty.ps @boxy #1 @eoxy}}%
+
+\xydef@\oldOzTeXPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\oldOzTeXSpecial@\else
+ \let\PSspecial@@=\oldOzTeXSpecial@
+ \let\PSmacro@@=\oldOzTeXMacro@
+ \let\PSdict@@=\oldOzTeXDict@
+ \let\PSraw@@=\oldOzTeXraw@
+ \let\PSinclude@@=\oldOzTeXinclude@
+ \let\xyPSobeylines@@=\obeyoldOzTeXlines@
+ \let\PSspecialdict@@=\oldOzTeXDict@
+ \oldOzTeX@@{PostScript}%
+ \fi
+% \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \oldOzTeXCurrpt@ }
+
+{\catcode`\^^M=\active %
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space \obeyspaces}}
+\xylet@\obeyoldOzTeXlines@=\next
+\DOCMODE)
+
+The \PS\ operators |@boxy| and |@eoxy| are defined in |xyps-ps| for bypassing
+the mechanism used in \OzTeX\ to isolate code passed in |\special| commands.
+Although it is possible (albeit difficult) to devise \PS\ to deduce the
+current location for use with the ``raw'' specials, this information cannot
+be used to do rotations and scaling as with other <driver>s.
+Hence the value of |\xyPScurrpt@@| is taken to be empty.
+
+\DOCMODE(
+\xydef@\oldOzTeXCurrpt@{\let\xyPScurrpt@@=\OzTeXCurrpt@@}%
+\xydef@\oldOzTeXCurrpt@@{}
+\DOCMODE)
+
+\medskip
+
+This avoids dumping the dictionary into the dvi-file, making sure
+that instead it goes into a file, specified by |\xyPSdictname|,
+which defaults to |global.ps|.
+
+\DOCMODE(
+\xydef@\oldoztexPS@@{\oldOzTeXPStypes@
+ \let\installxyps@@=\old@OzTeX@PS@
+ \installxyps@ }
+
+% The parameter |#1| in this next macro is to gobble the |\dumpPSdict@|
+% which would otherwise dump the dictionary into the dvi-file. However
+% if |\xyPSdictname| is defined then this dump must occur into a file.
+%
+%\xydef@\old@OzTeX@PS@#1{%
+% \let\includePSmessage@=\xyoldOzTeXheader
+% \ifx\undefined\xyPSdictname\DN@{}%
+% \else\DN@{#1}\fi\next@ \UsePSdict@@true}
+
+\xydef@\old@OzTeX@PS@{\UsePSdict@@true
+ \let\includePSmessage@=\xyoldOzTeXheader
+ \ifx\undefined\xyPSdictname\def\xyPSdictname{global.ps}\fi}
+
+\xydef@\xyoldOzTeXheader#1#2#3{\UsePSdict@@true}
+\DOCMODE)
+
+The parameters |#1#2#3| of |\xyOzTeXheader| gobble tokens
+that are unnecessary with \OzTeX.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths and poly-lines, using \PS.
+\DOCMODE(
+\xydef@\oldoztexLine@@{\oldoztexLine@}
+
+\xydef@\oldoztexLine@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-styles are}\UnloadLine@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item extra frames and fills, using \PS.
+\DOCMODE(
+\xydef@\oldoztexFrames@@{\oldOzTeXFrames@}
+
+\xydef@\oldOzTeXFrames@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item patterns and tiles, using \PS.
+\DOCMODE(
+\xydef@\oldoztexTiles@@{\oldOzTeXTiles@}
+
+\xydef@\oldOzTeXTiles@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@
+ \xystandardpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item rotated/scaled diagrams and text, recognised but not supported.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+In fact \OzTeX\ cannot support rotations and scaling.
+Instead we go through all the motions of providing \PS\ support,
+then set a flag that causes a limited number of warning messages to be
+generated as requests are made for these effects.
+
+\DOCMODE(
+\xydef@\oldoztexRotate@@{\oldOzTeXRotate@}
+
+\xydef@\oldOzTeXRotate@{\oldOzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%\XYpredict@
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xyRotScale@@ \installPSrotscale@ \xyPSshapes@false }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xy17oztex.doc,v $
+% Revision 3.3 1996/12/18 14:21:23 ross
+% Ross's version
+%
+% Revision 3.3.1.1 1996/12/18 08:47:45 ross
+% *** empty log message ***
+%
+% Revision 3.2 1995/09/19 18:20:20 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xy2cell.doc b/Master/texmf-dist/source/generic/xypic/xy2cell.doc
new file mode 100644
index 00000000000..18bab67ac1f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xy2cell.doc
@@ -0,0 +1,1839 @@
+%% $Id: xy2cell.doc,v 3.3 1996/12/18 14:21:23 ross Exp $
+%%
+%% Xy-pic ``2-cell'' feature.
+%% Copyright (c) 1993-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this macro package; if not, write to the Free Software Foundation,
+%% Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{2cell}{Two-cell feature}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+ This feature is designed to facilitate the typesetting of curved arrows,
+ either singly or in pairs, together with labels on each part and between.
+ The intended mathematical usage is for typesetting categorical ``2-cell''
+ morphisms and ``pasting diagrams'', for which special features are provided.
+ These features also allow attractive non-mathematical effects.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The 2-cell feature makes use of facilities from the `curve' extension
+ which is therefore automatically loaded.
+
+\DOCMODE(
+\xyrequire{curve}\xycatcodes
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Typesetting 2-cells in Diagrams}
+
+\noindent
+Categorical
+``2-cell'' morphisms are used in the study of tensor categories and elsewhere.
+The morphisms are displayed as a pair of curved arrows, symmetrically
+placed, together with an orientation indicated by a short broad arrow,
+or {\it Arrow}. Labels may be placed on all three components.
+
+\DOCMODE(
+\message{two-cells,}
+\DOCMODE)
+
+\UseAllTwocells
+
+\BUG: This document still uses version~2-style commmands, as described in
+appendix~??g[:v2].
+
+\xyrequire{v2}\xycatcodes
+
+\xymatrixcolsep{5pc}%
+\xymatrixrowsep{2pc}%
+
+\begin{code}
+\diagram
+A\rtwocell^f_g &B\\
+\enddiagram
+\end{code}
+$$ \docode $$
+\displaycode
+
+\begin{code}
+\diagram
+A\ruppertwocell^f{\alpha}
+ \rlowertwocell_h{\beta}
+ \rto_(.35)g & B\\
+\enddiagram
+\end{code}
+$$ \docode $$
+\displaycode
+
+These categorical diagrams frequently
+have a matrix-like layout, as with commutative diagrams.
+To facilitate this there are control sequences of the form:
+|\rtwocell| , |\ultwocell| , |\xtwocell| , \dots\
+analogous to the names defined in |xyv2| for use
+in diagrams produced using |xymatrix|.
+As this involves the definition of 21 new control sequences, many of which
+may never be used, these are not defined immediately upon loading |xy2cell|.
+Instead the user must first specify |\UseTwocells|.
+
+As in the second example above, just the upper or lower curved
+arrow may be set using control sequences of the form
+|\..uppertwocell| and |\..lowertwocell|.
+These together with the |\..compositemap| family, in which
+two abutting arrows are set with an empty object at the join,
+allow for the construction of complicated ``pasting diagrams''
+(see figure ??[f.pasting] for an example).
+
+The following initialise the families of control sequences
+for use in matrix diagrams.
+
+\begin{defs}
+ |\UseTwocells| &\quad two curves \cr
+ |\UseHalfTwocells| &\quad one curve \cr
+ |\UseCompositeMaps| &\quad 2 arrows, end-to-end \cr
+ |\UseAllTwocells| &\quad (all the above) \cr
+\end{defs}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\UseTwocells{\definesupermorphism{twocell}{%
+ \xy@{start of 2-cell}{\begingroup}%
+ \twocell@}}
+
+\xydef@\UseHalfTwocells{%
+ \definesupermorphism{uppertwocell}{%
+ \xy@{start of 2-cell}{\begingroup}%
+ \uppertwocell@}%
+ \definesupermorphism{lowertwocell}{%
+ \xy@{start of 2-cell}{\begingroup}%
+ \lowertwocell@}}
+
+\xydef@\UseCompositeMaps{\definesupermorphism{compositemap}{%
+ \xy@{start composite-map}{\begingroup}%
+ \compositemap@}}
+
+\xydef@\UseAllTwocells{%
+ \UseTwocells \UseHalfTwocells \UseCompositeMaps }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The families of connections are defined using the utility macro\dots
+%
+ |\definesupermorphism|
+%
+ which defines control sequences for morphisms between
+ neighbouring cells, and next-to-neighbouring cells.
+
+ More distant cells use |\xtwocell|, |\xcompositemap|, etc.
+ with <hop>s e.g.
+ |\xtwocell[1,3]| and |\xtwocell[llddd]|.
+
+\DOCMODE(
+\xydef@\supermorphism#1[#2]#3{\def\afterMORPHISM{[#2]#3}#1}
+\xydef@\afterMORPHISM{}
+
+\xydef@\definesupermorphism#1#2{%
+ \expandafter\def\csname x#1\endcsname{\supermorphism{#2}}%
+ \expandafter\def\csname u#1\endcsname{\supermorphism{#2}[-1,0]{}}%
+ \expandafter\def\csname d#1\endcsname{\supermorphism{#2}[1,0]{}}%
+ \expandafter\def\csname l#1\endcsname{\supermorphism{#2}[0,-1]{}}%
+ \expandafter\def\csname r#1\endcsname{\supermorphism{#2}[0,1]{}}%
+ \expandafter\def\csname uu#1\endcsname{\supermorphism{#2}[-2,0]{}}%
+ \expandafter\def\csname dd#1\endcsname{\supermorphism{#2}[2,0]{}}%
+ \expandafter\def\csname ll#1\endcsname{\supermorphism{#2}[0,-2]{}}%
+ \expandafter\def\csname rr#1\endcsname{\supermorphism{#2}[0,2]{}}%
+ \expandafter\def\csname ur#1\endcsname{\supermorphism{#2}[-1,1]{}}%
+ \expandafter\def\csname ul#1\endcsname{\supermorphism{#2}[-1,-1]{}}%
+ \expandafter\def\csname dr#1\endcsname{\supermorphism{#2}[1,1]{}}%
+ \expandafter\def\csname dl#1\endcsname{\supermorphism{#2}[1,-1]{}}%
+ \expandafter\def\csname uul#1\endcsname{\supermorphism{#2}[-2,-1]{}}%
+ \expandafter\def\csname uur#1\endcsname{\supermorphism{#2}[-2,1]{}}%
+ \expandafter\def\csname ull#1\endcsname{\supermorphism{#2}[-1,-2]{}}%
+ \expandafter\def\csname urr#1\endcsname{\supermorphism{#2}[-1,2]{}}%
+ \expandafter\def\csname ddl#1\endcsname{\supermorphism{#2}[2,-1]{}}%
+ \expandafter\def\csname ddr#1\endcsname{\supermorphism{#2}[2,1]{}}%
+ \expandafter\def\csname dll#1\endcsname{\supermorphism{#2}[1,-2]{}}%
+ \expandafter\def\csname drr#1\endcsname{\supermorphism{#2}[1,2]{}}%
+ \expandafter\def\csname uull#1\endcsname{\supermorphism{#2}[-2,-2]{}}%
+ \expandafter\def\csname uurr#1\endcsname{\supermorphism{#2}[-2,2]{}}%
+ \expandafter\def\csname ddll#1\endcsname{\supermorphism{#2}[2,-2]{}}%
+ \expandafter\def\csname ddrr#1\endcsname{\supermorphism{#2}[2,2]{}}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\bigskip
+
+Alternatively 2-cells can be set directly in \Xy-pictures without using the
+matrix feature. In this case the above commands are not needed. This is
+described in~\S??[standard].
+
+Furthermore a new directional |\dir{=>}| can be used to
+place an ``Arrow'' anywhere in a picture,
+after the direction has been established appropriately.
+It is used with all of the 2-cell types.
+
+\DOCMODE(
+\newdir{=>}{!/5pt/\dir{=}!/2.5pt/\dir{=}*!/-5pt/\dir2{>}}
+
+\xydef@\arrowobject#1{\def\Arrowobject@{#1}}
+\xydef@\Arrowobject@{\dir{=>}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%{\obeylines\long\outer\gdef\Pastingexample{%
+\begin{code}
+\xymatrixrowsep{1.5pc}
+\xymatrixcolsep{3pc}
+\diagram
+ & & \relax\rtwocell<0>^{f_3^{}\;\;}{\omit} & \relax\ddtwocell<0>{\omit}
+ \drtwocell<0>^{\;\;f_4^{}}{<3>}
+ \ddrrtwocell<\omit>{<8>}\\
+ & & & &\relax\drtwocell<0>^{\;\;f_5^{}}{\omit}\\
+A \uurrcompositemap<2>_{f_1^{}}^{f_2^{}}{<.5>}
+ \uurrlowertwocell<-6>{\omit}\relax
+ \drtwocell<0>_{g_1^{}\;}{\omit}
+ & & & \relax\urtwocell<0>{\omit}
+ & &\relax\rtwocell<0>^{f_6^{}\;}{\omit}
+ & \relax\rlowertwocell<-3>_{g_4^{}}{<-1>}
+ \rcompositemap<6>_{f_7^{}}^{f_8^{}}{\omit} & B \\
+ & \relax\urrtwocell<0>{\omit}
+ \xcompositemap[-1,4]{}<-4.5>_{g_2^{}}^{g_3^{}}{\omit}\\
+\enddiagram
+\end{code}
+
+\begin{figure*}[bt]
+$$ \docode $$
+\caption{Pasting diagram.}
+??=[f.pasting]
+\end{figure*}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Default positions:}
+
+ These set up default values for the parameters which
+ specify the position of each component
+ as well as the flags to indicate what type
+ of 2-cell is to be typeset.
+
+\begin{defs1}
+\begin{tabular}{c l}
+ |\toks6| &position of control point,
+ normal to line $\overline{pc}$ at midpoint\\
+ |\toks5| &position of central Arrow\\
+ |\toks7| &position of |^| label\\
+ |\toks8| &position of |_| label\\
+ |\toks3| &flag for number of pieces... \\
+ \quad |f| & \underline{f}ull: i.e. both curved arrows\\
+ \quad |o| & \underline{o}ne: |\uppertwocell| or |\lowertwocell|\\
+ \quad |t| & \underline{t}wo maps: |\compositemaps|\\
+\end{tabular}
+\end{defs1}
+
+\noindent
+|@| means to calculate from the value in |\toks6|, see |\tw@cell@@@|.
+
+\DOCMODE(
+\xydef@\twocell@{\toks6={3.5}\toks5={@}\toks7={@}\toks8={@}\toks3={f}%
+ \tw@cell@ }
+\xydef@\uppertwocell@{\toks6={7}\toks5={@}\toks7={@}\toks8={@}\toks3={o}%
+ \tw@cell@ }
+\xydef@\lowertwocell@{\toks6={-7}\toks5={@}\toks7={@}\toks8={@}\toks3={o}%
+ \tw@cell@ }
+\xydef@\compositemap@{\toks6={3.5}\toks5={@}\toks7={@}\toks8={@}\toks3={t}%
+ \tw@cell@ }
+\DOCMODE)
+
+ This collects together all the relevant data, and resolves the
+ default positions.
+
+\DOCMODE(
+\xydef@\tw@cell@@@{%
+ \expandafter\ifx\the\toks6\omit\relax\toks6={}\else
+%
+% default position of label on upper arrow,
+% relative to where it meets the perpendicular bisector
+%
+ \expandafter\ifx\expandafter @\the\toks7\relax\expandafter\dimen@\the\toks6\p@
+ \expandafter\if\the\toks3t\relax\dimen@=\p@
+ \else\expandafter\if\the\toks3o\divide\dimen@\tw@
+ \ifdim\dimen@<\z@ \dimen@ii-\p@ \advance\dimen@ii\dimen@
+ \dimen@=\dimen@ii \else \dimen@\p@ \fi
+ \else\dimen@\p@
+ \fi\fi
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\toks\expandafter7\expandafter{\tmp@}\fi
+%
+% default position of label on lower arrow,
+% relative to where it meets the perpendicular bisector
+%
+ \expandafter\ifx\expandafter @\the\toks8\relax
+ \expandafter\dimen@\the\toks6\p@
+ \expandafter\if\the\toks3t\relax\dimen@\p@
+ \else\expandafter\if\the\toks3o\divide\dimen@\tw@
+ \ifdim\dimen@<\z@ \dimen@ii-\p@ \advance\dimen@ii\dimen@
+ \dimen@=\dimen@ii \else \dimen@\p@ \fi
+ \else\dimen@\p@
+ \fi\fi
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\toks\expandafter8\expandafter{\tmp@}\fi
+%
+% default position of the Arrow, relative to midpoint
+%
+ \expandafter\ifx\expandafter @\the\toks5\relax
+ \expandafter\dimen@\the\toks6\p@
+ \expandafter\if\the\toks3o\divide\dimen@ by-4\relax
+ \else\dimen@\z@\fi
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\toks\expandafter5\expandafter{\tmp@}\fi
+ \fi
+%
+% possible modifications for module maps
+%
+ \twocellmod@
+%
+% pass all the parameters to |\twocell@@@@|
+%
+ \expandafter\if\the\toks3t\relax
+%
+% composed maps: ^ : first map _ : second map
+%
+ \edef\tmp@{.[\noexpand\twocell@@@@{\the\toks6}{\the\toks5}%
+ {\the\toks7}{\the\toks8}{\the\toks3}%
+ {\the\toks2}{\the\toks1}{\the\toks@}{\the\toks4}!!!].\afterMORPHISM}%
+ \else
+%
+% curved arrow(s)
+%
+ \edef\tmp@{.[\noexpand\twocell@@@@{\the\toks6}{\the\toks5}%
+ {\the\toks7}{\the\toks8}{\the\toks3}%
+ {\the\toks1}{\the\toks2}{\the\toks@}{\the\toks4}!!!].\afterMORPHISM}%
+ \fi
+ \toks@={\endgroup}%
+ \expandafter\def\expandafter\next@\expandafter{%
+ \expandafter\def\expandafter\twocellhead@\expandafter{\twocellhead@}}%
+ \expandafter\addtotoks@\expandafter{\next@}%
+ \expandafter\def\expandafter\next@\expandafter{%
+ \expandafter\def\expandafter\twocelltail@\expandafter{\twocelltail@}}%
+ \expandafter\addtotoks@\expandafter{\next@}%
+ \expandafter\addtotoks@\expandafter{\expandafter\twocellPATH\tmp@}%
+ \the\toks@ }%
+\DOCMODE)
+
+ See below for the possible forms of |\twocellPATH|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Labels are placed labels on the upper and lower arrows,
+more correctly `anti-clockwise' and `clockwise', using |^| and |_|.
+These are entirely optional with the following token, or grouping, giving
+the contents of the label. When used with
+|\..compositemap| the |^| and |_| specify
+labels for the first and second arrows, respectively.
+
+\DOCMODE(
+\xydef@\twocellstyle{\scriptstyle}
+
+\xydef@\droptwocelllabel@#1{\xyFN@\droptwocelllabel@@#1@!}
+\xydef@\droptwocelllabel@@{%
+ \ifx*\next\DN@*{\droptwocelldrop@}%
+ \else\DN@##1@!{\droptwocelltext@{##1}}%
+ \fi \next@ }
+
+{\xyuncatcodes \gdef\next#1{\drop+!C{\twocellstyle #1}}}
+\xylet@\droptwocelltext@=\next
+
+\xydef@\droptwocelldrop@#1@!{\bgroup \let\xy@=\oxy@
+ \let\objectstyle=\twocellstyle \drop#1{}%
+ \edef\tmp@{\egroup \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max}\tmp@ }
+\DOCMODE)
+
+Normally the label is balanced text, set
+in \TeX's math mode, with |\twocellstyle| setting the style.
+The default definition is given by \dots
+
+|\def\twocellstyle{\scriptstyle}|
+
+\noindent
+This can be altered using |\def| in versions of \TeX\
+or |\redefine| in \LaTeX.
+However labels are not restricted to being simply text boxes.
+Any effect obtainable using the \Xy-pic kernel language can be set
+within an |\xybox| and used as a label. Alternatively if the first
+character in the label is |*| then the label is set as an
+\Xy-pic <object>, as if with |\drop<object>| or |*<object>| in
+the kernel language. The current direction is tangential to
+the curved arrows. Extra braces are needed to get a |*| as the label,
+as in |^{{{*}}}| or |_{{}*}|.
+
+The position of a label normal to the tangential direction
+can also be altered by {\em nudging} (see below).
+Although it is possible to specify multiple labels,
+only the last usage of each of |^| and |_| is actually set,
+previous specifications being ignored.
+
+Similarly a label for the central Arrow must be given,
+after the other labels, by enclosing it within braces |{...}|.
+An empty group |{}| gives an empty label; this is necessary
+to avoid misinterpretation of subsequent tokens. As above if the
+first character is |*| then the label is set as an \XY-pic <object>,
+the current direction being along the Arrow.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Parsing:}
+
+ Open a new group so the following registers can be used locally...
+ |\toks@=\toks0|, |\toks1|, ..., |\toks8|
+ the final parameter set is stored briefly in |\tmp@| before being used.
+
+ OPTIONS:
+\begin{defs1}
+\begin{tabular}{c c l}
+ && spaces are ignored \\
+ |<| & |<num>| &determines position of curves control point\\
+ & |<0>| &uses a single solid line,\\
+ & |<\omit>| &causes only the central Arrow (with label) to be set\\
+\noalign{\smallskip}
+ |\omit| &&omits the curved arrows, but allows their labels\\
+ |^| &&place ``above'' label (more correctly ``anti-clockwise'')\\
+ |_| &&place ``below'' label (more correctly ``clockwise'')\\
+ |~'| &&change the arrowhead \\
+ |~`| &&place/change the arrowtail\\
+\end{tabular}
+\end{defs1}
+
+ Label data e.g. |^{#1}| |_{#1}|
+ is stored temporarily in |\toks@| then passed via |\tw@@cell@@|
+ to |\tw@cell@@| for further parsing, as: |\the\toks@ @|
+
+ |~'| and |~`| change the values of |\twocellhead@| and |\twocelltail@|
+ Normally |\twocelltail@| is |{}|, so |~`| also changes a flag to
+ indicate that |\twocelltail@| is indeed required.
+
+ When the next token is a grouping |{...}|
+ then it gives the label for the central Arrow.
+ No other label specifications may follow.
+
+
+ Default head and tail ornaments...
+
+\DOCMODE(
+\xydef@\twocellhead#1{\def\twocellhead@{#1}}
+\xydef@\twocelltail#1{\def\twocelltail@{#1}}
+\xydef@\twocellhead@{\dir{>}}
+\xydef@\twocelltail@{}
+\DOCMODE)
+
+ clear |\toks..| registers for the new connection labels.
+
+\DOCMODE(
+\xywarnifdefined\twocellmod@
+\xydef@\tw@cell@{\begingroup
+ \toks@={{}}\toks1={{}}\toks2={{}}\toks4={{}}%
+ \def\twocellmod@{}\xyFN@\tw@@cell@}%
+
+\xydef@\tw@@cell@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\tw@@cell@}%
+ \else\ifx\bgroup\next \let\next@=\toks@\afterassignment\tw@@cell@@
+ \else\ifx ^\next \DN@^##1{\toks@={##1}\nudgepos@71\tw@@cell@}%
+ \else\ifx _\next \DN@_##1{\toks@={##1}\nudgepos@82\tw@@cell@}%
+ \else\addLT@\ifx \next \addGT@{\addLT@\DN@##1}{%
+ \toks6={##1}\ifx\omit##1\relax\toks3={t}\toks5={0}\fi\xyFN@\tw@@cell@}%
+ \else\ifx\omit\next \DN@\omit{\omitarrows@\xyFN@\tw@@cell@}%
+ \else\ifx~\next \DN@~{\xyFN@\whichCurveObject@}%
+ \else \DN@{\xyFN@\tw@cell@@\empty @}%
+ \fi\fi\fi\fi\fi\fi\fi%
+ \next@ }
+
+\xydef@\whichCurveObject@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\whichCurveObject@}%
+ \else\ifx\next^\DN@^##1{\xy@{~^{##1}}{\uppercurveobject{##1}}\xyFN@\tw@@cell@}%
+ \else\ifx\next_\DN@_##1{\xy@{~_{##1}}{\lowercurveobject{##1}}\xyFN@\tw@@cell@}%
+ \else\addRQ@\ifx\next \addRQ@\DN@##1{%
+ \xy@{~'{##1}}{\def\twocellhead@{##1}}\xyFN@\tw@@cell@}%
+ \else\addLQ@\ifx\next \addLQ@\DN@##1{%
+ \xy@{~`{##1}}{\def\twocelltail@{##1}}\xyFN@\tw@@cell@}%
+ \else\ifx!\next \DN@!{\xyFN@\checkmodmap@}%
+ \else\ifx\next\bgroup\DN@##1{\xy@{~{##1}}{\curveobject{##1}}\xyFN@\tw@@cell@}%
+ \else\DN@##1{\xy@{~##1}{\curveobject{##1}}\xyFN@\tw@@cell@}%
+ \fi\fi\fi\fi \fi\fi\fi
+ \next@ }
+
+\xydef@\checkmodmap@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\checkmodmap@}%
+ \else \def\twocellmod@{\modmap@}%
+ \ifx\next!\DN@!##1{%
+ \xy@{~!!{##1}}{\def\modmapobject@{##1}}\xyFN@\tw@@cell@}%
+ \else \DN@{\xyFN@\tw@@cell@}\fi
+ \fi \next@ }
+\DOCMODE)
+
+ With no arrows, still allow labels:
+ default positions are at $0$, $+X$, $-X$, with $X=${\em default value}.
+ These values are altered by ``nudging''.
+
+\DOCMODE(
+\xydef@\omitarrows@{\toks5={0}\toks6={}\toks7={0}\toks8={0}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{figure*}[tp]
+\begin{syntax}
+%
+<twocell>
+ &\iss & <2-cell><switches><Arrow>
+ & typeset <2-cell> with the <switches> and <Arrow>
+\cr
+\noalign{\smallskip}
+%
+<2-cell> &\iss & |\..twocell|
+ & typeset two curved arrows
+\cr
+ &\orr & |\..uppertwocell|
+ & typeset upper curved arrow only
+\cr
+ &\orr & |\..lowertwocell|
+ & typeset lower curved arrow only
+\cr
+ &\orr & |\..compositemap|
+ & use consecutive straight arrows
+\cr
+\noalign{\smallskip}
+%
+<Arrow> &\iss & |{|<tok><text>|}|
+ & specifies orientation and label
+\cr
+ &\orr & |{|<nudge><text>|}|
+ & adjust position, use default orientation
+\cr
+ &\orr & |{|<text>|}|
+ & use default position and orientation
+\cr
+ &\orr & |{|<tok>*<object>|}|
+ & use <object> as the label
+\cr
+ &\orr & |{|<nudge>*<object>|}| \orr |{|*<object>|}|
+\cr
+\noalign{\smallskip}
+%
+<tok> &\iss & |^| \orr |_| \orr |=|
+ & oriented anti-/clockwise/equality
+\cr
+ &\orr & |\omit|
+ & no Arrow, default is clockwise
+\cr
+ &\orr & |`| \orr |'| \orr |"| \orr |!|
+ & no Arrow; tips on two curved arrows as:\\
+ anti-/clockwise/double-headed/none
+\cr
+\noalign{\smallskip}
+%
+<switches> &\iss & <switch><switches>
+ & list of optional modifications
+\cr
+\noalign{\smallskip}
+%
+<switch> &\iss & <empty>
+ & use defaults
+\cr
+%
+ &\orr & |^| <label>
+ & place <label> on the upper arrow
+\cr
+ &\orr & |_| <label>
+ & place <label> on the lower arrow
+\cr
+ &\orr & <nudge>
+ & set the curvature, based on <nudge> value
+\cr
+ &\orr & |\omit|
+ & do not set the curved arrows
+\cr
+ &\orr & \ |!|
+ & place |\modmapobject| midway along arrows
+\cr
+ &\orr & |~| <what> |{| <object> |}|
+ & use <object> in place specified by <what>
+\cr
+\noalign{\smallskip}
+%
+<what> &\iss & <empty>
+ & set curves using the specified <object>
+\cr
+ &\orr & |^| \orr |_|
+ & use <object> with upper/lower curve
+\cr
+ &\orr & |`| \orr |'|
+ & use <object> for arrow head/tail
+\cr
+%
+\noalign{\medskip}
+%
+<label> &\iss & <text>\ \orr\ <nudge> <text>
+ & set <text>, displaced by <nudge>
+\cr
+ &\orr & *<object>\ \orr\ <nudge>*<object>
+ & set <object>, displaced by <nudge>
+\cr
+\noalign{\smallskip}
+%
+<nudge> &\iss & |<|<number>|>| & use <number> in an appropriate way,
+ \eg, to position object or label along a fixed axis
+\cr
+ &\orr & |<\omit>| & do not typeset the object/label
+\cr
+%
+\end{syntax}
+\caption{\protect<twocell\protect>s}
+??=[f.twocell]
+\end{figure*}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Standard Options}??=[Arrow]
+The orientation of the central Arrow may be reversed,
+turned into an equality, or omitted altogether.
+In each case a label may still be specified, so in effect the
+Arrow may be replaced by anything at all.
+
+These effects are specified by the first token in the central label,
+which thus has the form: |{|<tok><label>|}|
+where <tok> may be one of \dots
+
+\begin{defs1}
+\begin{tabular}{ c l }
+ |_| & Arrow points clockwise \cr
+ |^| & Arrow points anti-clockwise \cr
+ |=| & no tip, denotes equality \cr
+|\omit|& no Arrow at all. \cr
+\end{tabular}
+\end{defs1}
+
+\noindent
+When none of these occurs then the default of |_| is assumed.
+If the label itself starts with one of these characters then
+specify |_| explicitly, or enclose the label within a group |{...}|.
+See {\em Extra Options~1}, for more values of <tok>.
+Also note that |*| has a special role when used as the first character;
+however it is considered to be part of the <label>, see above.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ OPTIONS for the central Arrow:
+
+\begin{defs}{c l}
+ & ignore spaces\cr
+ |^| & points anti-clockwise\cr
+ |_| & points clockwise (default)\cr
+ |=| & no |\Tip|, equality\cr
+ |\omit|& no Arrow at all, just squine(s) or composed arrows\cr
+ |'| & no Arrow, opposite squine reversed\cr
+ |`| & no Arrow, forward squine reversed\cr
+ |"| & no Arrow, tips on both ends\cr
+ |!| & no Arrow, no tips on squines\cr
+\end{defs}
+
+ the position of the Arrow is determined by ``nudging'' (see below)
+ e.g.
+ |{^<num>label}|, where the actual dimen is |<num>\xydashl@|
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{code}
+\xymatrixcolsep{4pc}
+\xymatrixrowsep{1pc}
+\diagram
+A \rtwocell{_\alpha} & B \rtwocell{^\beta} &
+C \rtwocell{=\gamma} & D \rtwocell{\omit\Psi} & E \\
+\enddiagram
+\end{code}
+$$ \docode $$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph{Parsing of the Arrow's label}
+
+\DOCMODE(
+\xydef@\tw@@cell@@{\expandafter\xyFN@\expandafter\tw@cell@@\the\toks@ @}
+
+\xydef@\tw@cell@@{\ifx \space@\next\expandafter\DN@\space{\xyFN@\tw@cell@@}%
+ \else\ifx ^\next
+ \DN@^##1@{\toks@={##1}\toks4={^}\nudgepos@50\tw@cell@@@}%
+ \else\addEQ@\ifx\next
+ \addEQ@\DN@##1@{\toks@={##1}\toks4={=}\nudgepos@50\tw@cell@@@}%
+ \else\ifx _\next
+ \DN@_##1@{\toks@={##1}\toks4={_}\nudgepos@50\tw@cell@@@}%
+ \else\addLT@\ifx \next
+ \DN@##1@{\toks@={##1}\toks4={_}\nudgepos@50\tw@cell@@@}%
+ \else\ifx\omit\next \DN@\omit##1@{\toks4={@}\toks@={##1}\tw@cell@@@}%
+ \else\addRQ@\ifx\next \addRQ@\DN@##1@{\toks4={@}\toks3={/}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\addLQ@\ifx\next \addLQ@\DN@##1@{\toks4={@}\toks3={b}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\ifx"\next \DN@"##1@{\toks4={@}\toks3={B}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\ifx!\next \DN@!##1@{\toks4={@}\toks3={@}\toks@={##1}%
+ \nudgepos@50\tw@cell@@@}%
+ \else\ifx\next\empty\DN@##1@{\toks@={{}}\toks4={_}\tw@cell@@@}%
+ \else\DN@##1@{\toks@={##1}\toks4={_}\tw@cell@@@}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Nudging}
+Positions of all labels may be adjusted,
+as can the amount of curvature for the curved arrows.
+The way this is done is by specifying a ``nudge'' factor <num>
+at the beginning of the label.
+Here <num> is a number which specifies the actual position of the label
+in units of |\xydashl@| (the length of a single dash, normally 5pt)
+except with |\..compositemap|, see below.
+Movement is constrained to the perpendicular bisector
+of the line $\overline{cp}$.
+When nudging the label for the central Arrow
+it is the whole Arrow which is moved, along with its label.
+
+Curvature of the arrows themselves is altered by
+a nudge of the form |\..twocell|<num>....
+The separation of the arrows, along the bisector,
+is set to be <num>|\xydashl@|.
+When <num> is zero, that is |\..twocell<0>...|,
+the result is a single straight arrow,
+its mid-point being the origin for nudging labels.
+A negative value for <num> is also acceptable;
+but check the orientation on the Arrow
+and which of |^| and |_| correspond to which component.
+
+The origin for nudging labels is where the arrow
+crosses the bisector. Positive nudges move
+the label outwards while negative nudges move towards $\overline{pc}$
+and possibly beyond.
+The default position of a label is on the outside, with edge at the origin.
+
+The origin for nudging the Arrow is at the midpoint of $\overline{pc}$.
+A positive nudge moves in the clockwise direction.
+This will be the direction of the arrowhead,
+unless it has been reversed using |^|.
+
+\smallskip
+
+Labels on a |\..compositemap| are placed relative to the midpoint
+of the component arrows. Nudges are in units of 1pt.
+Movement is in the usual \Xy-pic {\em above} and {\em below} directions,
+such that a positive nudge is always outside the triangle formed
+by the arrows and line $\overline{pc}$.
+
+\medskip
+
+The special nudge value |<\omit>| typesets just the Arrow,
+omitting the curved arrows entirely.
+When used with labels, the nudge value |<\omit>| causes the following label
+to be ignored.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{exercise}
+Give code to typeset figure ??[f.pasting].
+
+\noindent
+Such code is relatively straight-forward, using ``nudging''
+and |\omit| to help position the arrows, curves and Arrows.
+It also uses an {\em excursion},
+as described below in the subsection {\em Extra Options~3}.
+
+% code from the earlier ``Pasting diagram'' example.
+%\Pastingexample\gdef\Pastingexample{}%
+%
+\begin{code}
+\xymatrixrowsep{1.5pc}
+\xymatrixcolsep{3pc}
+\diagram
+ &&\relax\rtwocell<0>^{f_3^{}\;\;}{\omit}
+ &\relax\ddtwocell<0>{\omit}
+ \drtwocell<0>^{\;\;f_4^{}}{<3>}
+ \ddrrtwocell<\omit>{<8>}\\
+&&&&\relax\drtwocell<0>^{\;\;f_5^{}}{\omit}\\
+A \uurrlowertwocell<-6>{\omit}\relax
+\uurrcompositemap<2>_{f_1^{}}^{f_2^{}}{<.5>}
+ \drtwocell<0>_{g_1^{}\;}{\omit}
+ &&&\relax\urtwocell<0>{\omit}
+ &&\relax\rtwocell<0>^{f_6^{}\;}{\omit}
+ &\relax\rlowertwocell<-3>_{g_4^{}}{<-1>}
+ \rcompositemap<6>_{f_7^{}}^{f_8^{}}{\omit}
+ & B \\
+ &\relax\urrtwocell<0>{\omit}
+ \xcompositemap[-1,4]{}%
+ <-4.5>_{g_2^{}}^{g_3^{}}{\omit}\\
+\enddiagram
+\end{code}
+
+\answertext{Here is the code used to typeset the {\em pasting diagram} in
+figure~??g[xy2cell.doc:f.pasting].}
+\answercode
+\answertext\displaycode
+
+\answertext{\smallskip\noindent
+For the straight arrows, it would have been simpler to use |\..to|
+provided |xyarrow| has been loaded. Instead |\..twocell<0>...{\omit}|
+was used to illustrate the versatility of nudging and |\omit|;
+thus |xy2cell| can completely handle a wide range of diagrams,
+without requiring |xyarrow|. Note also the use of |\relax| at the start
+of each new cell, to avoid premature expansion of a complicated macro,
+which can upset the compiling mechanism.}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph{NUDGE } position of labels
+
+\DOCMODE(
+\xywarnifdefined\whichnudge
+\xywarnifdefined\whichinfo
+\xywarnifdefined\afternudge
+\xydef@\nudgepos@#1#2#3{\def\whichnudge{\toks#1}\def\whichinfo{\toks#2}%
+ \def\afternudge{#3}\expandafter\xyFN@\expandafter\nudgepos@@\the\toks@ @}
+\DOCMODE)
+
+\begin{defs1}
+\begin{tabular}{c l}
+ |#1| & which token register to store nudge amount\cr
+ |#2| & which token register to store label\cr
+ |#3| & what to do next, after parsing \cr
+\end{tabular}
+\end{defs1}
+
+\paragraph{Parsing: }
+%
+ <num><label>|@|, <num> = nudge amount, as multiple of |\xydashl@|.
+
+\DOCMODE(
+\xydef@\nudgepos@@{\ifx \space@\next\expandafter\DN@\space{\xyFN@\nudgepos@}%
+ \else\addLT@\ifx \next
+ \addGT@{\addLT@\DN@##1}##2@{%
+ \ifx\omit##1\relax\whichnudge={0}\whichinfo={}%
+ \else\whichnudge={##1}\whichinfo={##2}\fi\xyFN@\afternudge}%
+ \else \DN@##1@{\whichinfo={##1}\xyFN@\afternudge}%
+ \fi\fi \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Extra Options}
+The following features are useful in non-mathematical applications.
+
+\subsubsection*{1. no Arrow}
+This is determined by special values for <tok> as the
+first (or only) character in the central label, as in the above
+description of the standard switches.
+
+\begin{defs1}
+\begin{tabular}{c l}
+ |'| & arrowheads pointing clockwise;\cr
+ |`| & arrowheads pointing anti-clockwise;\cr
+ |"| & arrow tips on both ends;\cr
+ |!| & no tips at all.\cr
+\end{tabular}
+\end{defs1}
+
+\noindent
+The central Arrow is omitted, leaving symmetrically placed
+curved connections with arrowheads at the specified ends.
+A label can be placed where the Arrow would have been.
+
+If a special arrowhead is specified using |~'{..}|
+(see Extra Options~2, below)
+then this will be used instead of the standard |\dir{>}|.
+
+\ifx\undefined\mathbf\def\mathbf{\boldmath}\fi
+\begin{code}
+\xymatrixcolsep{5pc}
+\diagram
+ \relax\txt{Clouds }\rtwocell<10>
+ _{\hbox{\tiny evaporation }}
+ ^{\hbox{\tiny precipitation }}
+{'{\mathbf{H_2 O}}}
+&\relax\txt{Oceans}\\
+\enddiagram
+\end{code}
+$$ \docode $$
+\displaycode
+
+\begin{code}
+\xymatrixcolsep{5pc}
+\diagram
+\relax\txt{\llap{Math}ematics }\rtwocell
+_{\hbox{\tiny experiment }}
+^{\hbox{\tiny theory }}{"}
+& \relax\txt{Physics} \\
+\enddiagram
+\end{code}
+$$ \docode $$
+\displaycode
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{2. Changing Tips and Module Maps }
+The following commands are provided for specifying the <object>
+to be used when typesetting various parts of the twocells.
+
+\medskip
+\noindent
+\begin{tabular}{l c}
+\noalign{\hrule}
+\noalign{\smallskip}
+{\em command} \hfill & {\em default} \cr
+\noalign{\smallskip}
+\noalign{\hrule}
+\noalign{\smallskip}
+ |\modmapobject{|<object>|}| & |\dir{|$\vert$|}| \cr
+ |\twocellhead{|<object>|}| & |\dir{>}| \cr
+ |\twocelltail{|<object>|}| & |\dir{}| \cr
+ |\arrowobject{|<object>|}| & |\dir{=>}| \cr
+\noalign{\smallskip}
+ |\curveobject{|<object>|}| & \cr
+ |\uppercurveobject{|<object>|}| & |{}| \cr
+ |\lowercurveobject{|<object>|}| & |{}| \cr
+\noalign{\smallskip}
+\noalign{\hrule}
+\end{tabular}
+\medskip
+
+
+These commands set the object to be used for all subsequent
+2-cells at the same level of \TeX\ grouping.
+|\curveobject| specifies both of the upper- and lower-curve objects.
+For some of these there is also a way to change the object for the
+current 2-cell only.
+This requires a |~|-<switch> which is described below,
+except for the |\..curveobject| types, which are discussed in
+{\em Extra Options~4}.
+
+\medskip
+
+These effects are specified by placing switches
+after the |\..twocell| control sequence,
+\eg\ |\rtwocell| {\em switches\/} {\em labels\/}\dots~.
+Each switch is either a single token <tok>, or a
+|~|<tok> with a single argument: |~|<tok>|{|{\em arg\/}|}|.
+Possibilities are listed in the following table,
+in which |{..}| denotes the need for an argument.
+
+\begin{defs1}
+\begin{tabular}{c l}
+ |\omit| & no arrows, Arrow and label only;\cr
+ |!| & place module-map indicator;\cr
+|~'{..}| & change arrow-head to |{..}|;\cr
+|~`{..}| & place/change tail on arrow(s);\cr
+|~{..}| & change object used to set curves;\cr
+|~^{..}| & use object |{..}| to set upper curve;\cr
+|~_{..}| & use object |{..}| to set lower curve;\cr
+\end{tabular}
+\end{defs1}
+
+\noindent
+Here we discuss the use of |!|, |~'|, |~`| and |\omit|.
+The description of |~^|, |~_| and |~{..}| is given in {\em Extra Options~4}.
+
+\medskip
+The default module map indicator places a single
+dash crossing the arrow at right-angles,
+located roughly midway along the actual printed portion of the arrow,
+whether curved or straight.
+This takes into account the sizes of the objects being connected,
+thereby giving an aesthetic result when these sizes differ markedly.
+This also works with |\..compositemap| where an indicator is placed
+on each arrow. The actual object can be changed using |\modmapobject|.
+
+\medskip
+Any of the standard \Xy-pic tips may be used for arrow-heads.
+This is done using |~'{..}|,
+for example |~'{\dir{>>}}| gives double-headed arrows.
+Similarly |~`{..}| can be used to place an arrow-tail.
+Normally the arrow-tail is {}, so is not placed;
+but if a non-empty tail has been specified then it will
+be placed, using |\drop|.
+No guarantee is offered for the desired result being obtained
+when an arrow-tail is mixed with the features of {\em Extra Options~1}.
+
+\begin{code}
+\modmapobject{\objectbox{\otimes}}
+\xymatrixcolsep{5pc}
+\diagram
+P\rtwocell~!~'{\dir{>>}}~`{\dir{|}}
+ ^{<1.5>M}_{<1.5>M'}{=f} & S \\
+\enddiagram
+\end{code}
+$$ \docode $$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ switch for module maps...
+ ...places decoration called |\modmapobject| half way along arrows
+
+\DOCMODE(
+\xydef@\modmap@{%
+ \expandafter\ifx\the\toks4@\toks4={!}%
+ \else\expandafter\ifx\the\toks4=\toks4={H}%
+ \else\expandafter\ifx\the\toks4^\toks4={A}%
+ \else\expandafter\ifx\the\toks4_\toks4={V}\fi\fi\fi\fi
+ \expandafter\DN@\expandafter{\the\toks6}%
+ \ifx\next@\empty\relax\else\expandafter\moddefs@\fi}
+\DOCMODE)
+
+ also adjust curvature and label positions
+
+\DOCMODE(
+\xydef@\moddefs@{%
+ \expandafter\dimen@\the\toks6\p@
+ \ifdim\dimen@=\z@\relax
+ \expandafter\dimen@\the\toks7\p@
+ \ifdim\dimen@<\z@\advance\dimen@.5\p@\else\advance\dimen@-.5\p@\fi
+ \edef\tmp@{\noexpand\toks7={\expandafter\removePT@\the\dimen@}}\tmp@
+ \expandafter\dimen@\the\toks8\p@
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \expandafter\ifx\the\toks3t\advance\dimen@-1\p@\fi
+ \edef\tmp@{\noexpand\toks8={\expandafter\removePT@\the\dimen@}}\tmp@
+ \else
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \edef\tmp@{\noexpand\toks6={\expandafter\removePT@\the\dimen@}}\tmp@
+% \expandafter\dimen@\the\toks5\p@
+% \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+% \edef\tmp@{\noexpand\toks5={\expandafter\removePT@\the\dimen@}}\tmp@
+ \expandafter\dimen@\the\toks7\p@
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \expandafter\ifx\the\toks3t\advance\dimen@-2\p@\fi
+ \edef\tmp@{\noexpand\toks7={\expandafter\removePT@\the\dimen@}}\tmp@
+ \expandafter\dimen@\the\toks8\p@
+ \ifdim\dimen@<\z@\advance\dimen@-.5\p@\else\advance\dimen@.5\p@\fi
+ \expandafter\ifx\the\toks3t\advance\dimen@-2\p@\fi
+ \edef\tmp@{\noexpand\toks8={\expandafter\removePT@\the\dimen@}}\tmp@
+ \fi }%
+
+%\def\moddefs@{}
+\DOCMODE)
+
+ default object is |\stop|, user can change this with |\modmapobject#1|
+
+\DOCMODE(
+\xydef@\modmapobject#1{\def\modmapobject@{#1}}
+\xydef@\modmapobject@{\dir{|}}
+\xydef@\@modmapobject@{{\if\@mod@\relax\expandafter\empty
+ \else\expandafter\modmapobject@\fi}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{3. Excursions}
+Syntax for |\xcompositemap| and |\x..twocell| types
+is a little different to
+what might be expected from that for |\xto|, |\xline|, etc.
+For example,
+%
+\begin{defs1}
+|\xtwocell[|<hop>|]{|<displace>|}...|
+\end{defs1}
+%
+\noindent
+connects to the <pos> displaced by <displace> from
+the relative cell location specified by <hop>.
+The displacement can be any string of valid \Xy-pic commands,
+but they must be enclosed within a group |{...}|.
+When the cell location is the target,
+a~null grouping |{}| {\em must} be given.
+
+When used with the |<\omit>| nudge, such excursions allow a labelled Arrow
+to be placed anywhere within an \Xy-pic diagram;
+furthermore the Arrow can be oriented to point in any direction.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\curveobject#1{\def\ucurveObject@{~*#1}\def\dcurveObject@{~*#1}}
+\xydef@\uppercurveobject#1{\def\ucurveObject@{~*#1}}
+\xydef@\lowercurveobject#1{\def\dcurveObject@{~*#1}}
+\xydef@\ucurveObject@{}
+\xydef@\dcurveObject@{}
+\DOCMODE)
+
+The empty object gives the default of closely spaced tiny dots,
+resulting in a ``smooth'' curve.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The following macro is used in conjunction with compiling diagrams,
+to include the global parameters in the compiled file.
+
+\DOCMODE(
+\xydef@\savetwocellobjects{%
+ \xy@{twocell objects}{%
+ \expandafter\uppercurveobject\expandafter{\ucurveObject@}%
+ \expandafter\lowercurveobject\expandafter{\dcurveObject@}%
+ \expandafter\modmapobject\expandafter{\modmapobject@}%
+ \expandafter\twocellhead\expandafter{\twocellhead@}%
+ \expandafter\twocelltail\expandafter{\twocelltail@}%
+ \expandafter\arrowobject\expandafter{Arrowobject@}%
+ }}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{4. Fancy curves}
+By specifying |\curveobject| an arbitrary object may be used to
+construct the curved arrows. Indeed with a
+|\..twocell| different objects can be used with
+the upper and lower curves by specifying
+|\uppercurveobject| and |\lowercurveobject|.
+
+These specifications apply to all 2-cells subsequently constructed at
+the same level of \TeX\ grouping.
+Alternatively using a |~|-switch, as in {\em Extra Options~2},
+allows such a specification for a single 2-cell or curved part.
+
+Objects used to construct curves can be of two types.
+Either a single <object> is set once, with copies placed along the curve.
+Alternatively a directional object can be aligned with
+the tangent along the curve. In this case use a specification takes the
+form:
+
+|\curveobject{|<spacer>|~**|<object>|}|.
+
+\noindent
+Here <spacer> may be any <object> of non-zero size.
+Typically it is empty space, \eg\ |+|<dimen>|{}|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{exercise}
+Give code to typeset the following diagrams.
+
+\begin{code}
+{\uppercurveobject{{?}}
+ \lowercurveobject{{\circ}}
+\xymatrixcolsep{5pc}
+\xymatrixrowsep{2pc}
+\diagram
+ \relax\txt{ FUn }\rtwocell<8>{!\&}
+ & \relax\txt{ gaMES }
+ \enddiagram}
+\end{code}
+$$\docode$$
+
+\answertext{Here is the code
+used by the author to set the first diagram.}
+\answercode
+\answertext\displaycode
+
+\begin{code}
+\xymatrixcolsep{2.5pc}
+\xymatrixrowsep{4pc}
+\diagram
+ \relax\txt<1.5cm>{\bf Ground State}
+ \rrtwocell<12>~^{+{}~**!/-2.5pt/\dir{>}}
+ ~_{++{}~**!/5pt/\dir{<<}}
+ ^{<1.5>\txt{\small continuous power}}
+ _{<1.5>\txt{\small pulsed emission}}{!}
+& \relax\;\; N\!i\,C\!d\;\; \Circled
+& \relax\txt<1.50cm>{\bf Excited State}
+\enddiagram
+\end{code}
+$$\docode$$
+
+\answertext{Here is the code
+used for the second diagram.}
+\answercode
+\answertext\displaycode
+
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{After Parsing...}
+
+ Values for |\twocellPATH|, depends on the mode of picture/diagram
+ as to whether the |@c| and |@p| are known yet, or still have
+ to be read.
+
+\DOCMODE(
+\xydef@\twocell@path.[#1].{%
+ \expandafter\ifx\csname Q@@c\endcsname\relax
+ \DN@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}%
+ \xy@{}{\expandafter\edef\csname Q@@\endcsname{\cfromthec@}}%
+ \afterPOS{\xy@{}%
+ {\expandafter\edef\csname Q@@c\endcsname{\cfromthec@}}%
+ \xy@{}%
+ {\cfromid@{@}\expandafter\edef\csname Q@@p\endcsname{\cfromthec@}}%
+ \xy@{twocell #1}{#1}\leave@\aftertwoCELL};p,}%
+ \else
+ \DN@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}%
+ \xy@{twocell #1}{#1}\leave@\aftertwoCELL}%
+ \fi \next@ }
+
+\xydef@\twocellpath.[#1].{%
+ \expandafter\edef\csname Q@@p\endcsname{\cfromthec@}%
+ \xy@{}{\enter@{\pfromthep@}}%
+ \xy@{}{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}%
+ \enter@{\pfromthec@}}%
+ \afterPOS{\xy@{}{\leave@\setupDirection@}#1\restore\restore
+ \xy@{end of 2-cell}\xysaveMinMax@ }}%
+
+\xydef@\xysaveMinMax@{\edef\tmp@{\endgroup
+ \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi
+ \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi
+ }\tmp@ }
+\DOCMODE)
+
+\DOCMODE(
+\xylet@\twocellPATH=\twocellpath
+\xydef@\aftertwo@CELL{\let\twocellPATH=\twocellpath \def\aftertwoCELL{}}
+\xydef@\aftertwoCELL{}
+\DOCMODE)
+
+ It remains to collect everything together and place it on the queue.
+
+\DOCMODE(
+\xydef@\twocell@@@@#1!!!{\xy@{twocell #1}{\twocell@@#1!!!}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{2-cells in general \Xy-pictures}
+??=[standard]
+Two-cells can also be set directly within any \Xy-picture, without the
+matrix feature, using either |\drop| or |\connect|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\let\xystatus=\xystatus@
+\xydef@\twocell{\hbox\bgroup\@twocell}
+\xydef@\uppertwocell{\hbox\bgroup\@uppertwocell}
+\xydef@\lowertwocell{\hbox\bgroup\@lowertwocell}
+\xydef@\compositemap{\hbox\bgroup\@compositemap}
+
+\xydef@\twocelll#1#{\hbox\bgroup\xy@\save\save@\@twocelll{#1}}
+\xydef@\@twocelll#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\twocell@#1{#2}}}
+
+\xydef@\uppertwocelll#1#{\hbox\bgroup\xy@\save\save@\@uppertwocelll{#1}}
+\xydef@\@uppertwocelll#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\uppertwocell@#1{#2}}}
+
+\xydef@\lowertwocelll#1#{\hbox\bgroup\xy@\save\save@\@lowertwocelll{#1}}
+\xydef@\@lowertwocelll#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\lowertwocell@#1{#2}}}
+
+\xydef@\compositemapp#1#{\hbox\bgroup\xy@\save\save@\@compositemapp{#1}}
+\xydef@\@compositemapp#1#2{%
+ \afterPOS{\@twocelll@\xyFN@\compositemap@#1{#2}}}
+%
+\xydef@\@twocelll@{%
+% \idfromc@{@c}\swap@\idfromc@{@p}\swap@
+ \expandafter\edef\csname Q@@c\endcsname{\cfromthec@}\swap@
+ \expandafter\edef\csname Q@@p\endcsname{\cfromthec@}\swap@
+ \let\twocellPATH=\twocell@path
+% \def\aftertwoCELL{\twocell@DONE}}
+ \def\aftertwoCELL{\twocell@DONE \xy@\restore \leave@
+% \cfromid@{@c}\no@@ \xystatus@{end: }
+ }}
+
+\xydef@\@twocell#1{\DN@{\@twocell@\twocell@}\xyFN@\next@[#1]}
+\xydef@\@uppertwocell#1{\DN@{\@twocell@\uppertwocell@}\xyFN@\next@[#1]}
+\xydef@\@lowertwocell#1{\DN@{\@twocell@\lowertwocell@}\xyFN@\next@[#1]}
+\xydef@\@compositemap#1{\DN@{\@twocell@\compositemap@}\xyFN@\next@[#1]}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{code}
+\def\myPOS#1{\POS}\def\goVia#1{%
+ \afterPOS{\connect#1\myPOS}}
+\xy
+ *+{A}="A",+<1cm,1.5cm>*+{B}="B",
+ +<2.0cm,0pt>*+{C}="C",
+ +<1cm,-1.5cm>*+{D}="D",
+"A";\goVia{\uppertwocell^\alpha{}}"B"{}
+;\goVia{\twocell^\zeta_\xi{\gamma}}"C"{}
+;\goVia{\compositemap{}}"D"{},
+"A";\goVia{\lowertwocell{}}"D"{}
+\endxy
+\end{code}
+
+\displaycode
+%\begin{figure}[hbt]
+$$\docode$$
+%??=[f.xypic]
+%\caption{2-cells in \protect\Xy-pictures}
+%\end{figure}
+
+\begin{code}
+\xy *+{A}="A",+<1cm,1.5cm>*+{B}="B",
+ +<2cm,0pt>*+{C}="C",
+ +<1cm,-1.5cm>*+{D}="D",
+"A";"B",{\uppertwocell^\alpha{}},
+"B";"C",{\twocell^\zeta_\xi{\gamma}},
+"C"; \afterPOS{\drop\compositemap{}}"D"
+\POS "A";
+ \afterPOS{\drop\lowertwocell{}}"D"
+\endxy
+\end{code}
+
+The code shown is a compact way to place a chain
+of 2-cells within a picture.
+It illustrates a standard technique for using
+|\afterPOS| to find a <pos> to be used for part of
+a picture, then subsequently reuse it.
+Also it is possible to use |\drop| or <decor>s
+to specify the 2-cells, giving the same picture.
+
+\displaycode
+
+The |\connect| variant is usually preferable
+as this maintains the size of the object at $c$,
+while the |\drop| variant leaves
+a rectangular object having $p$ and $c$ on opposite sides.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This is used outside of diagrams.
+
+\DOCMODE(
+\xydef@\@twocell@#1{\ifx\next[\DN@[{\toks@={#1}\xyFN@\@@twocell@}%
+ \else\DN@{#1{}}\fi
+%%
+% \idfromc@{@c}\swap@\idfromc@{@p}\swap@
+ \expandafter\edef\csname Q@@c\endcsname{\cfromthec@}\swap@
+ \expandafter\edef\csname Q@@p\endcsname{\cfromthec@}\swap@
+ \let\twocellPATH=\twocell@path
+ \def\aftertwoCELL{\twocell@DONE}\next@}
+\DOCMODE)
+
+This hack is necessary, since |\DN@[##1]{#1##1}| will strip braces.
+
+\DOCMODE(
+\xydef@\@@twocell@{\ifx\next\bgroup\DN@##1]{\the\toks@{##1}}%
+ \else\DN@##1]{\the\toks@##1}\fi\next@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\TODO:
+ These are supposed to allow |\dir\...twocell{...}| to work.
+ At present it seems to be impossible to do this.
+
+\DOCMODE(
+% \expandafter\xydefcsname@\expandafter{\codeof\twocell}{\@twocell}
+% \expandafter\xydefcsname@\expandafter{\codeof\uppertwocell}{\@uppertwocell}
+% \expandafter\xydefcsname@\expandafter{\codeof\lowertwocell}{\@lowertwocell}
+% \expandafter\xydefcsname@\expandafter{\codeof\compositemap}{\@compositemap}
+%% \DN@{\twocell}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@twocell}
+%% \DN@{\uppertwocell}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@uppertwocell}
+%% \DN@{\lowertwocell}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@lowertwocell}
+%% \DN@{\compositemap}%
+%% \expandafter\def\csname*dir@@\codeof\next@ @\endcsname{\@compositemap}
+\DOCMODE)
+
+...since the contents of |{..}| is variable.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Finish off the box, set up the object size,
+ establish the |\Drop@@| and |\Connect@@| methods.
+
+\DOCMODE(
+\xydef@\twocell@DONE{%
+ \edef\tmp@{\egroup \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max}\tmp@
+ \L@c=\X@c \advance\L@c-\X@min \R@c=\X@max \advance\R@c-\X@c
+ \D@c=\Y@c \advance\D@c-\Y@min \U@c=\Y@max \advance\U@c-\Y@c
+ \ht\z@=\U@c \dp\z@=\D@c \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@
+ \computeLeftUpness@
+%
+\setboxz@h{\kern-\X@p \raise-\Y@c\boxz@ }%
+\dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c
+%
+ \Edge@c={\rectangleEdge}\Invisible@false \Hidden@false
+ \edef\Drop@@{\noexpand\drop@Twocell
+ \noexpand\def\noexpand\Leftness@{\Leftness@}%
+ \noexpand\def\noexpand\Upness@{\Upness@}}%
+ \edef\Connect@@{\noexpand\connect@Twocell
+ \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi
+ \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi }}%
+\DOCMODE)
+
+ modified |\Drop@@| and |\Connect@@|
+
+\DOCMODE(
+\xydef@\drop@Twocell{\boxz@ }
+
+\xydef@\connect@Twocell{%
+ \setboxz@h{\kern\X@p \raise\Y@c\box\lastobjectbox@ }%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \Drop@@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+|\twocell@@| is the main switching engine, taking 9 parameters determining
+ which pieces to set and where to position them. This includes
+ curvature of the squines, whether to draw two squines
+ or only one, or to use straight lines,
+ whether to have a central Arrow and its orientation,
+ contants of labels and their positions.
+
+ The current p and c are the extents of the connection
+ these are stored as |"@p"| and |"@c"| for repeated use;
+
+\begin{defs1}
+\begin{tabular}{c l}
+ |#1| & determines location of control point |"@m"|\cr
+ |#2| & location of |=>|, as multiple of |\xydashl@| from |"@m"|\cr
+ |#3| & location of |_| label (source arrow)\cr
+ |#4| & location of |^| label (target arrow)\cr
+ |#5| & flag for how many squines to draw \& which tips\cr
+ |#6| & label for source arrow\cr
+ |#7| & label for target arrow\cr
+ |#8| & label for |=>| (2-cell morphism)\cr
+ |#9| & determines orientation of 2-cell \cr
+\end{tabular}
+\end{defs1}
+
+The following tokens may appear as parameters in |#9|:
+|!|, |^|, |_|, |=|, |A|, |V|, |H|
+
+\DOCMODE(
+\xywarnifdefined\@mod@
+\xywarnifdefined\Arrowtok@
+
+\xydef@\twocell@@#1#2#3#4#5#6#7#8#9!!!{%
+ \def\@mod@{@}\DN@{#9}%
+ \ifx #9!\def\Arrowtok@{@}\else\ifx #9A\def\Arrowtok@{^}%
+ \else\ifx #9V\def\Arrowtok@{_}\else\ifx #9H\def\Arrowtok@{=}%
+ \else\def\@mod@{\relax}%
+ \ifx #5/\def\Arrowtok@{@}\else\ifx #5b\def\Arrowtok@{@}%
+ \else\ifx #5B\def\Arrowtok@{@}\else\ifx #5@\def\Arrowtok@{@}%
+ \else\def\Arrowtok@{#9}%
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \addEQ@\ifx #9\def\Arrowtok@{=}\fi
+ \DN@{\omit}\ifx\next@\Arrowtok@\def\Arrowtok@{}\else
+ \edef\Arrowtok@{\codeof\Arrowtok@}\fi
+ \save@ \idfromc@{@c}\swap@\idfromc@{@p}\swap@
+ \cfromid@{@c}\no@@
+%
+ \ifdim \X@c<\X@p \X@min=\X@c \X@max=\X@p \else \X@min=\X@p \X@max=\X@c \fi
+ \ifdim \Y@c<\Y@p \Y@min=\Y@c \Y@max=\Y@p \else \Y@min=\Y@p \Y@max=\Y@c \fi
+%
+ \Calong@@{.5}\idfromc@{@m}\idfromc@{@m1}\idfromc@{@m2}%
+%
+ \ifx #5t\relax
+ \enter@{\cplusthec@\pfromthep@}%
+ \enter@\DirectionfromtheDirection@ \begingroup\aboveDirection@ \xydashl@
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@=\z@ \DN@{\vfromslide@i{\xydashl@}@}\relax
+ \else\DN@{\vfromslide@i{#1\xydashl@}@}\fi \next@
+ \czeroEdge@ \leave@ \no@@ \drop@{+}{}\idfromc@{@m1}%
+ \DN@{#1}\ifx\next@\empty\DN@{\no@@}\else\DN@{\connect@{\dir}{-}}\fi
+ \else
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@=\z@ \enter@{\cplusthec@\pfromthep@}%
+ \enter@\DirectionfromtheDirection@ \begingroup\aboveDirection@\xydashl@
+ \vfromslide@i{\xydashl@}@\czeroEdge@ \leave@ \idfromc@{@m1}%
+ \cfromid@{@p}\swap@\cfromid@{@c}%
+ \DN@{#1}\ifx\next@\empty\DN@{\no@@}\else\DN@{\connect@{\dir}{-}}\fi
+ \else \DN@{\enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup\aboveDirection@ \xydashl@
+ \vfromslide@i{#1\xydashl@}@\czeroEdge@ \leave@
+ \idfromc@{@m1}\cfromid@{@p}\swap@\cfromid@{@c}%
+ \edef\next@{\codeof\ucurveObject@}%
+ \ifx\next@\empty\DN@{\connect@\crv{"@m1"}}%
+ \else
+ \DNii@####1{\connect@\crv{####1}}\expandafter\DN@\expandafter{%
+ \expandafter\nextii@\expandafter{\ucurveObject@"@m1"}}%
+ \fi \next@ }%
+%% \ifx\next@\empty\def\ucurveObject@{.}\fi
+%% \enter@\cfromthec@\sinit@\cfromid@{@m1}\senter@\leave@
+%% \expandafter\connect@\expandafter\crvs\expandafter{\ucurveObject@}%
+%% \sinit@\sleave@ }%
+ \fi
+ \fi \next@
+%
+ \DN@{#1}\ifx\next@\empty\relax\else
+ \if\@mod@ @\relax
+ \enter@\pfromthep@ \Creset@@
+ \ifx #5t\relax
+ \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}%
+ \else \def\next@{\crvreset@}%
+ \ifx\next@\Creset@@
+ \gettwocelledges@ \edef\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \else \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}\fi
+ \fi
+ \expandafter\Calong@@\PLACEf@ \czeroEdge@ \leave@
+ \edef\tmp@{\codeof\modmapobject@}%
+ \ifx\tmp@\empty \DN@{\drop@{\dir}{|}}%
+ \else \DNii@##1##{\drop@{##1}}%
+ \DN@{\expandafter\nextii@\modmapobject@{}}%
+ \fi \next@
+ \fi\fi
+%
+ \DN@{#6}\ifx\next@\empty\DN@{\relax}\else
+ \DNii@{{}}\ifx\next@\nextii@\DN@{\relax}\else
+ \ifx @#3\relax\DN@{\relax}\else
+ \DN@{\enter@\pfromthep@ \Creset@@
+ \Calong@@{.5}\czeroEdge@ \leave@
+ \enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@\begingroup
+ \DN@{#1}\ifx\next@\empty\dimen@\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@<\z@ \belowDirection@ \xydashl@
+ \else \aboveDirection@ \xydashl@ \fi
+% \vfromslide@i{#3\xydashl@}@\czeroEdge@ \leave@
+% \droptwocelllabel@{#6}}%
+ \dimen@=#3\p@ \if\@mod@ @\relax
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\p@\fi
+ \edef\next@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\vfromslide@i\expandafter{\next@\xydashl@}@\leave@
+ \droptwocelllabel@{#6}}%
+ \fi\fi\fi \next@
+%
+%
+ \DN@{#1}\ifx\next@\empty\relax\else
+ \ifx #5b\relax % tip at start only
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@ \DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi
+ \else\ifx #5@\relax % no tips at all
+ \else % tip at end...
+ \enter@\pfromthep@ \Creset@@ \PLACEedgec@
+ \Calong@@{1}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocellhead@}%
+ \ifx\next@\empty\drop@{\dir}{>}%
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocellhead@{}%
+ \fi
+ \ifx #5B\relax % ... and also at start.
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@\DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\drop\twocelltail@{}%
+ \fi
+ \else\ifx #5/\relax
+ \else \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty\relax\else
+ \enter@\pfromthep@ \Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi\fi\fi
+ \fi\fi\fi
+%
+ \cfromid@{@p}\swap@\cfromid@{@c}\no@@ \cfromid@{@m}%
+ \ifx #5t\relax
+ \idfromc@{@m2}\cfromid@{@m1}\swap@ \cfromid@{@c}\no@@
+ \DN@{#1}\ifx\next@\empty\DN@{\no@@}\else\DN@{\connect@{\dir}{-}}\fi
+ \else\ifx #5o\relax
+ \idfromc@{@m2}\DN@{}%
+ \else % second curved arrow
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@=\z@
+ \enter@{\cplusthec@\pfromthep@}%
+ \enter@\DirectionfromtheDirection@ \begingroup \belowDirection@\xydashl@
+ \vfromslide@i{\xydashl@}@\czeroEdge@ \leave@ \idfromc@{@m2}%
+ \DN@{\cfromid@{@p}\swap@\cfromid@{@c}\no@@}%
+ \else \DN@{\enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup \belowDirection@ \xydashl@
+ \vfromslide@i{#1\xydashl@}@\czeroEdge@ \leave@
+ \idfromc@{@m2}\cfromid@{@p}\swap@\cfromid@{@c}%
+ \edef\next@{\codeof\dcurveObject@}%
+ \ifx\next@\empty\DN@{\connect@\crv{"@m2"}}%
+ \else
+ \DNii@####1{\connect@\crv{####1}}\expandafter\DN@\expandafter{%
+ \expandafter\nextii@\expandafter{\dcurveObject@"@m2"}}%
+ \fi \next@ }\fi
+%% \enter@\cfromthec@\sinit@\cfromid@{@m2}\senter@\leave@
+%% \expandafter\connect@\expandafter\crvs\expandafter{\dcurveObject@}%
+%% \sinit@\sleave@
+%% }\fi
+ \fi\fi \next@
+%
+ \DN@{#1}\ifx\next@\empty\relax\else \ifx #5o\relax\else
+ \if\@mod@ @\DN@{\enter@\pfromthep@ \Creset@@
+ \ifx #5t\relax
+ \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}%
+ \else \def\next@{\crvreset@}%
+ \ifx\next@\Creset@@
+ \gettwocelledges@ \edef\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \else \PLACEedgec@ \PLACEedgep@ \def\PLACEf@{{.5}}\fi
+ \fi
+ \expandafter\Calong@@\PLACEf@ \czeroEdge@ \leave@
+ \edef\tmp@{\codeof\modmapobject@}\ifx\tmp@\empty\DN@{\drop@{\dir}{|}}%
+ \else \DNii@####1####{\drop@{####1}}%
+ \DN@{\expandafter\nextii@\modmapobject@{}}\fi
+ \next@ }\else\DN@{\relax}\fi
+ \next@ \fi\fi
+%
+ \DN@{#7}\ifx\next@\empty\DN@{\relax}\else
+ \DNii@{{}}\ifx\next@\nextii@\DN@{\relax}\else
+ \ifx @#4\relax\DN@{\relax}\else
+ \DN@{\enter@\pfromthep@ \Creset@@
+ \Calong@@{.5}\czeroEdge@ \leave@
+ \enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \DN@{#1}\ifx\next@\empty\dimen@\z@ \else\dimen@=#1\p@\fi
+ \ifx #5t\relax \ifdim\dimen@<\z@ \belowDirection@ \xydashl@
+ \else \aboveDirection@ \xydashl@ \fi
+ \else \ifdim\dimen@<\z@ \aboveDirection@ \xydashl@
+ \else \belowDirection@ \xydashl@ \fi
+ \fi \dimen@=#4\p@ \if\@mod@ @\relax
+ \advance\dimen@\ifdim\dimen@<\z@-\fi.5\p@\fi
+ \edef\next@{\expandafter\removePT@\the\dimen@}%
+ \expandafter\vfromslide@i\expandafter{\next@\xydashl@}@\leave@
+ \droptwocelllabel@{#7}}%
+ \fi\fi\fi \next@
+%
+ \DN@{#1}\ifx\next@\empty\relax\else
+ \ifx #5o\relax
+ \else\ifx #5b\relax % tip at start only
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgec@
+ \Calong@@{1}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{>}%
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocellhead@{}%
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\drop\twocelltail@{}%
+ \fi
+ \else\ifx #5/\relax
+ \enter@{\pfromthep@}\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty \DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@\DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi
+ \else\ifx #5@\relax % no tips at all
+ \else % tip at end...
+ \enter@\pfromthep@ \Creset@@ \PLACEedgec@
+ \Calong@@{1}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocellhead@}%
+ \ifx\next@\empty\drop@{\dir}{>}%
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocellhead@{}%
+ \fi
+ \ifx #5B\relax % ... and also at start.
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty\DN@{\dir{>}}%
+ \ifx\next@\twocellhead@\drop@{\dir}{<}%
+ \else
+ \reverseDirection@\DNii@##1##{\drop@{##1}}%
+ \expandafter\nextii@\twocellhead@{}\reverseDirection@
+ \fi
+ \else
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi
+ \else
+ \edef\next@{\codeof\twocelltail@}%
+ \ifx\next@\empty\relax\else
+ \enter@ {\pfromthep@ }\Creset@@ \PLACEedgep@
+ \Calong@@{0}\czeroEdge@ \leave@
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\twocelltail@{}%
+ \fi\fi
+ \fi\fi\fi
+ \fi\fi
+%
+% the Arrow
+%
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\fi
+ \ifdim\dimen@<\z@ \cfromid@{@m2}\swap@\cfromid@{@m1}%
+ \else \cfromid@{@m1}\swap@\cfromid@{@m2}%
+ \fi \no@@ \cfromid@{@m}%
+%
+ \ifx\Arrowtok@\empty
+%
+ \else\DN@{_}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \enter@{\pfromthep@ \cplusthec@}\dimen@=#2\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m}%
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\Arrowobject@{}%
+% \drop@{\dir}{=>}%
+%
+ \else\DN@{^}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \DN@{_}\edef\Arrowtok@{\codeof\next@}%
+ \enter@{\pfromthep@ \cplusthec@}\dimen@=#2\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m}\reverseDirection@
+ \DNii@##1##{\drop@{##1}}\expandafter\nextii@\Arrowobject@{}%
+% \drop@{\dir}{=>}%
+%
+ \else \DN@{=}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \enter@{\pfromthep@ \cplusthec@}%
+ \dimen@=#2\xydashl@ \advance\dimen@\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m2}%
+ \cfromid@{@m}%
+ \enter@{\pfromthep@ \cplusthec@}%
+ \dimen@=#2\xydashl@ \advance\dimen@-\xydashl@
+ \enter@\DirectionfromtheDirection@ \begingroup
+ \expandafter\vfromslide@i\expandafter{\the\dimen@}@\czeroEdge@
+ \leave@ \idfromc@{@m1}%
+ \cfromid@{@m2}\swap@\cfromid@{@m1}\connect@{\dir 2}{-}%
+ \fi\fi\fi\fi
+%
+% label on the Arrow
+%
+ \DN@{#8}\ifx\next@\empty\DN@{}\else\DN@{%
+ \ifx\Arrowtok@\empty
+ \Calong@@{.5}%
+ \else\DN@{=}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \Calong@@{.5}%
+ \else\DN@{_}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \cfromid@{@m}%
+ \fi\fi\fi
+ \enter@\cplusthec@
+ \enter@\DirectionfromtheDirection@ \begingroup \aboveDirection@\xydashl@
+ \ifx\Arrowtok@\empty
+ \def\tmp@{0pt}%
+ \else\DN@{=}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \def\tmp@{\xydashl@}%
+ \else\DN@{_}\edef\next@{\codeof\next@}\ifx\next@\Arrowtok@
+ \def\tmp@{1.2\xydashl@}%
+ \else\def\tmp@{0pt}%
+ \fi\fi\fi
+ \expandafter\vfromslide@i\expandafter{\tmp@}@\czeroEdge@ \leave@
+ \droptwocelllabel@{#8}%
+ }\fi \next@
+ \leave@ }%
+\DOCMODE)
+
+These are used to establish the location for
+the module-map indicator, giving best aesthetic appeal.
+It finds the location whose parameter value is
+the average of half-way along the complete curve and
+the average of parameter values at the the edges.
+
+\DOCMODE(
+\xydef@\gettwocelledges@{%
+ \bgroup \the\crvpts@
+ \edef\next@{\edges@}%
+ \expandafter\gettwocelledges@@\next@ }
+
+\xydef@\gettwocelledges@@#1;#2,#3;#4,{%
+ \dimen@=#2\advance\dimen@-#4\relax
+ \advance\dimen@ 2\p@ \divide\dimen@ by4 \relax
+ \edef\next@{\egroup\dimen@=\the\dimen@ }\next@}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xy2cell.doc,v $
+% Revision 3.3 1996/12/18 14:21:23 ross
+% Ross's version
+%
+% Revision 3.3.1.1 1996/12/18 08:49:34 ross
+% *** empty log message ***
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/05 22:11:25 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.12 1994/10/25 03:01:14 ross
+% Final 3beta release [bug fixes & AMS-LaTeX fitting].
+%
+% Revision 2.10 1994/07/01 01:19:46 ross
+% removed undefined references
+%
+% Revision 2.9 1994/06/09 12:51:27 ross
+% Release 3beta.
+%
+% NEW for version 2.9 based on unreleased code for version 2.6+.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyall.doc b/Master/texmf-dist/source/generic/xypic/xyall.doc
new file mode 100644
index 00000000000..d1a376d5dbc
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyall.doc
@@ -0,0 +1,93 @@
+%% $Id: xyall.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+%%
+%% Xy-pic ``All features'' option.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{all}{All features}{\stripRCS$Revision: 3.3 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+As a special convenience, this feature loads a subset of
+\Xy-pic,\footnote{The name `all' hints at the fact that these were all the
+ available options at the time `all' was added.} namely the extensions:
+|curve| (\cf~\S??g[:curve]), |frame| (\S??g[:frame]), |cmtip| (\S??g[:tips]),
+|line| (\S??g[:line]), |rotate| (\S??g[:rotate]), |color| (\S??g[:color]),
+and the following features: |matrix| (\S??g[:matrix]), |arrow|
+(\S??g[:arrow]), and |graph| (\S??g[:graph]).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\DOCHEADER
+
+Here we go:
+
+\DOCMODE(
+\xyrequire{curve}
+\xyrequire{frame}
+\xyrequire{cmtip}
+\xyrequire{line}
+\xyrequire{rotate}
+\xyrequire{color}
+
+\xyrequire{matrix}
+\xyrequire{arrow}
+\xyrequire{graph}
+\DOCMODE)
+
+That is all.
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyall.doc,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% NEW file to go in version 2.9!
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyarc.doc b/Master/texmf-dist/source/generic/xypic/xyarc.doc
new file mode 100644
index 00000000000..5c392285b70
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyarc.doc
@@ -0,0 +1,1436 @@
+%% $Id: xyarc.doc,v 3.4 1997/05/18 01:13:24 ross Exp $
+%%
+%% Xy-pic ``Circles, Ellipses and Arcs'' feature.
+%% Copyright (c) 1995-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The XY-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The XY-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{arc}{Circle, Ellipse, Arc feature}{\stripRCS$Revision: 3.4 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+This feature provides a means to a specify circles of arbitrary radius,
+drawn with a variety of line styles. Similarly ellipses may be specified,
+having arbitrary major/minor axes aligned in any direction.
+A circular arc joining two points can be constructed with specified
+tangent direction at one end.
+
+All the curves described here---circles, ellipses and sectors of
+these---are constructed using the curves from the |xycurve| extension.
+As such any comments given there concerning memory requirements are
+equally valid here, perhaps even more so. Use of the |xyps| \PS\
+back-end is highly recommended.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+The arcs are not truly circular or elliptical, but are approximations
+given by cubic B\'ezier segments. Hence the |xycurve| feature must be loaded.
+
+\DOCMODE(
+\xyrequire{curve}
+\xycatcodes
+\DOCMODE)
+
+The basic <object> defined here is |\arc|.
+So far it is only implemented as a <decor>ation,
+called |\ellipse|.
+
+\DOCMODE(
+\xydef@\ellipse#1#{\xy@{ELLIPSE}{\hbox\bgroup\save@}%
+ \let\endarc@=\endellipse@@ \xyFN@\preARC@ #1@}
+
+\xydef@\endellipse@@{\xy@{endELLIPSE}{\leave@\origDirection@
+ \edef\next@{\egroup \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max }\next@}\let\bstartPLACE@=\relax}
+
+\xydef@\preARC@{%
+ \ifx\next\space@ \expandafter\DN@\space{\xyFN@\preARC@}%
+ \else\ifx\next @\DN@{\xy@{ellipseARC}\ellipticARC@ \arc@}%
+ \else\ifx\next ~\DN@~##1{\tildeARC@{##1}}%
+ \else\DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}%
+ \fi\fi\fi \next@ }
+
+%\xydef@\arc#1#{\xy@{ARC}{\hbox\bgroup\save@}%
+% \let\endarc@=\endarc@@\arc@{#1}}
+%\xydef@\endarc@@{\xy@{endARC}{\leave@\origDirection@
+\DOCMODE)
+
+
+We start by recording the curve <style> and initialising
+some methods and <pos> names, to be able to easily access
+important <pos> and <direction> information.
+
+When the |...| in |\arc...{|<style>|}| is particularly simple,
+e.g. <empty> or |^| or |_|, then we can branch immediately
+to |\fullCircle@|. Otherwise more parsing is required.
+
+\DOCMODE(
+\xydef@\arc@#1@#2{\DN@{#2}%
+ \ifx\next@\empty \xy@{arcSTYLE}{\def\arcSTYLE{-}}%
+ \else \xy@{arcSTYLE}{\def\arcSTYLE{#2}}\fi \arc@i
+ \DNii@{#1}%
+ \ifx\nextii@\empty \DN@{\fullCircle@}%
+ \else \DN@{_}%
+ \ifx\next@\nextii@ \xy@{_}{\def\arcOrient@@{_}}%
+ \let\arcOrient@@=\next@ \DN@{\fullCircle@}%
+ \else \DN@{^}%
+ \ifx\next@\nextii@ \xy@{^}{\def\arcOrient@@{^}}%
+ \let\arcOrient@@=\next@ \DN@{\fullCircle@}%
+ \else \DN@{\def\afterARCextents@@{%
+ \xy@{aftARCext}{\let\doCircleArc@=\doCircleArc@@}%
+ \ellipseArc@ \xy@{doCircARCs}{\doCircleArcs@}\endarc@ }%
+% \xy@{doCircARCs}{\leave@ \doCircleArcs@}\endarc@ }%
+ \xyFN@\getarcparams@#1@}\fi\fi\fi
+ \next@ }
+\DOCMODE)
+
+When further parsing is required, using |\getarcparams@|, then
+an |@| token is used to mark the end of the relevant tokens.
+
+Before any parsing at all the current $p$ and $c$ are recorded as named
+<pos>itions "0@p" and "0@c", as well as a point "0@m" along the line in the
+current direction from $p$. A method |\origDirection@| is defined to
+artificially re-impose this direction independent of the $p$ and $c$
+that may be current at the time. |\startDirection@| is initialised to
+this method, though parsing may change its value.
+Other methods are initialised, in particular the default orientation;
+their values can be expected to change with subsequent parsing.
+
+\DOCMODE(
+\xydef@\arc@i{\xy@{ARCi}{%
+ \save@\idfromc@{0@c}\cfromp@\idfromc@{0@p}%
+ \enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i{}@\czeroEdge@
+ \leave@\idfromc@{0@m}\leave@ \zeroDivideLimit@{50}%
+ \edef\origDirection@{\Direction=\the\Direction
+ \relax\noexpand\imposeDirection@}%
+ \let\startDirection@=\origDirection@ \def\startDirection@@{}%
+ \def\endDirection@{}\def\endDirection@@{}\def\arcOrient@@{^}}%
+ \def\arcOrient@@{^}\let\processDirections@=\checkstartDirection@
+ \def\arcRadius@{}\def\ellipseRatio@{}\def\arcScale@{\arcScale@@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\message{circles,}
+\DOCMODE)
+
+\subsection{Full Circles}
+
+The |xyarc| feature allows a much wider range of possibilities
+for typesetting circles than is available with |\cir|.
+Firstly the radius is no longer restricted to a finite collection of sizes.
+Secondly fancy line (curve) styles are available, as with curved arrows.
+Finally there are a variety of ways of specifying the desired radius,
+relative to other parts of the picture being built, as in the following
+example.
+
+\begin{code}
+\xy 0;/r5pc/:*\dir{*}="p",*+!DR{p};
+p+(.5,-.5)*\dir{*}="c",*+++!L{c}**\dir{-}
+,{\ellipse<>{:}},{\ellipse(.5){}}
+,0;(.5,.5)::,"p";"c",{\ellipse(.5){.}}
+,{\ellipse<5pt>{=}}\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+The following give circles centred at $c$.
+\begin{defs}
+|\ellipse<>{|<style>|}| & radius $ = \mathop{\hbox{dist}}(p,c)$ \cr
+|\ellipse<|<dimen>|>{..}| & radius is the <dimen> \cr
+|\ellipse(|<num>|){|<style>|}| & unit circle scaled <num>,\hfill\break
+in the current basis. \cr
+\end{defs}%
+%
+\noindent
+Note that if the current basis is not square then the latter variant,
+namely |\ellipse(|<num>|)|, will typeset an ellipse rather than a circle.
+On the other hand the first two variants always specify true circles.
+In the 2nd case, i.e. when <dimen> is <empty>, the size of the object
+at $p$ is taken into account when drawing the circle; if this is not
+desired then kill the size using a null object, e.g. |;*{};|.
+
+Currently the |\ellipse| macro works only as a <decor>. In future versions
+there will be an <object> called |\arc| having elliptical shape,
+via |\circleEdge| with possibly unequal extents. Also it will be possible
+to |\connect\arc|, which will set the current connection so that any place
+on the full ellipse, not just the visible sector, will be accessible using
+an extension to the usual <place> mechanism.
+
+\TODO: make this be!!
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The simplest cases of full circles go straight to |\circleArc@|.
+
+\DOCMODE(
+\xydef@\fullCircle@{\xy@{fullCIRC}{\let\endDirection@=\relax
+ \let\doCircleArc@=\doMergeEndArc@@}\circleArc@ }%
+\DOCMODE)
+
+If the first non-space token following |\arc| is |<| then the current
+$c$ is taken to be the centre of the circle or ellipse, or sector thereof.
+The first parsing is done to interpret information concerning the radius,
+(or axes of an ellipse) along with an orientation. This can be specified
+either as absolute dimensions, enclosed in |<|\dots|>|,
+or relative to the current basis by |(|\dots|)|, or based on the line
+$\overline{pc}$ using |<>| or |<,|<dimen>|>| or |(,|<num>|)|.
+
+\DOCMODE(
+\xydef@\getarcparams@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\getarcparams@}%gobble spaces
+ \else\addLT@\ifx \next \xy@{<}{}%
+ \addGT@{\addLT@\DN@##1}{\splitRadius@dim##1,,@}%
+% \else\ifx \next (\xy@{(}{}\DN@(##1){\splitRadius@##1,,@}%
+ \else\ifx\next (\DN@({\xyFN@\checkRadOpen@}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}%
+ \else \addLQ@\ifx \next \addLQ@\DN@{\xy@`{}\ARCturn@}%
+ \else \DN@{\getarcExtents@}%
+ \fi\fi\fi\fi\fi \next@ }
+
+\xydef@\checkRadOpen@{%
+ \ifx\next *\DN@{\xyFN@\getarcExtents@ (}%
+ \else \xy@{(}{}\DN@##1){\splitRadius@##1,,@}%
+ \fi \next@ }
+\DOCMODE)
+
+The centre is now stored as |"0@0"|, since the value of |"0@c"|
+will be changed to agree with |"0@p"|. This is so that start/finish
+directions will agree, ensuring all four quadrants be drawn.
+The following method is actually executed after all the radius/axes
+information has been parsed.
+
+\DOCMODE(
+\xydef@\fixedRadiusArc@{%
+ \xy@{fixRadArc}{\save@ \idfromc@{0@0}\cfromp@\idfromc@{0@c}\leave@}%
+ \xyFN@\fixedRadiusArc@i }
+
+\xydef@\fixedRadiusArc@i{%
+ \ifx\next\space@ \expandafter\DN@\space{\xyFN@\fixedRadiusArc@i}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}%
+ \else\DN@{\let\processDirections@=\processArcDirections@
+ \def\afterARCextents@@{\xy@{aftARCext}{\let\doCircleArc@=\doCircleArc@@
+ \ellipseSector@}}\xyFN@\getarcExtents@}%
+ \fi\fi \next@ }
+\DOCMODE)
+
+When a full circle or ellipse is required then there are three methods
+which must be invoked when establishing the local basis change.
+
+\begin{itemize}
+\item[|\arcScale@|]
+Initially this has value |\arcScale@@| which is based on $\overline{pc}$.
+It is changed only by |(|<num>|)| and |(|<num>|,|<num>|)|;
+see the code for |\splitRadius@| below. When executed,
+this method will establish the required basis, at least partially.
+
+\DOCMODE(
+\xydef@\arcScale@@{\xy@{arcSCALE@@}{\save@
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setbase@\X@p\Y@p\X@c\Y@c}}
+\DOCMODE)
+
+\item[|\arcRadius@|]
+Initially <empty>, this changes with |<|<dimen>|,|<dimen>|>| and
+|<|<dimen>|>| to |\arcScale@dim| which gets the radius by a <slide>
+of given <dimen> along the line $\overline{pc}$.
+
+\DOCMODE(
+\xydef@\arcScale@dim#1{\xy@{arcSCALEdim}{\save@
+ \cfromid@{0@0}\pfromc@ \cfromid@{0@p}\setupDirection@\cfromp@
+ \enter@\cplusthec@ \begingroup\vfromslide@i#1@%
+ \setbase@\X@p\Y@p\X@c\Y@c \idfromc@{0@p}}}
+\DOCMODE)
+
+
+\item[|\ellipseRatio@|]
+Initially <empty>, this changes with |<|<dimen>|,|<dimen>|>| to
+|\ellipseScale@dim| which establishs the $(|\X@basey|,|\Y@basey|)$
+by a <slide> perpendicular to the line $\overline{pc}$,
+or to |\ellipseScale@| with |(,|<num>|)| to simply set the
+perpendicular basis direction using <num> as a coordinate.
+
+\DOCMODE(
+\xydef@\ellipseScale@dim#1{\xy@{ellSCALEdim}{\setupDirection@\cfromp@
+ \enter@\cplusthec@ \aboveDirection@\xydashl@ \vfromslide@{#1}\leave@
+ \setbase@@\X@c\Y@c}}
+
+\xydef@\ellipseScale@#1{\xy@{ellSCALE@}%
+ {\vfromcartesian@@0,#1@\setbase@@\X@c\Y@c}}
+\DOCMODE)
+
+\end{itemize}
+
+The methods |\splitRadius@dim| and |\splitRadius@| complete the
+interpretation of the radius/axes specification. They must determine
+whether one or two pieces of information have been explicitly provided,
+and act accordingly.
+
+\DOCMODE(
+\xydef@\splitRadius@dim#1,#2,#3@{%
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\relax%\splinetracing
+ \expandafter\def\expandafter\arcRadius@
+ \expandafter{\arcScale@dim{#1}}\fi
+ \DN@{#2}\ifx\next@\empty\dimen@ii=\z@\def\ellipseRatio@{}%
+ \else\dimen@ii=#2\relax \expandafter
+ \def\expandafter\ellipseRatio@\expandafter{\ellipseScale@dim{#2}}%
+ \fi \fixedRadiusArc@ }
+
+\xydef@\splitRadius@#1,#2,#3@{%
+ \DN@{#1}\ifx\next@\empty\dimen@=\z@\else\dimen@=#1\p@\relax\fi
+ \DN@{#2}\ifx\next@\empty\dimen@ii=\z@\else\dimen@ii=#2\p@\relax\fi
+ \ifdim\dimen@=\z@ \ifdim\dimen@ii=\z@\else \expandafter
+ \def\expandafter\ellipseRatio@\expandafter{\ellipseScale@{#2}}\fi
+ \else
+ \ifdim\dimen@ii=\z@
+ \def\arcScale@{\xy@{arcSCALE@}{\save@\cfromid@{0@0}%
+ \X@origin=\X@c \Y@origin=\Y@c
+ \X@xbase=#1\X@xbase \Y@xbase=#1\Y@xbase
+ \X@ybase=#1\X@ybase \Y@ybase=#1\Y@ybase
+ \advance\X@c\X@xbase \advance\Y@c\Y@xbase \czeroEdge@
+ \idfromc@{0@p}\idfromc@{0@c}}}%
+ \else
+ \def\arcScale@{\xy@{arcSCALE@}{\save@\cfromid@{0@0}%
+ \X@origin=\X@c \Y@origin=\Y@c
+ \X@xbase=#1\X@xbase \Y@xbase=#1\Y@xbase
+ \X@ybase=#2\X@ybase \Y@ybase=#2\Y@ybase
+ \advance\X@c\X@xbase \advance\Y@c\Y@xbase \czeroEdge@
+ \idfromc@{0@p}\idfromc@{0@c}}}%
+ \fi
+ \fi \fixedRadiusArc@ }
+
+\xydef@\baseOrient@{\DN@{_}\ifx\next@\arcOrient@@
+ \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi }
+\DOCMODE)
+
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\message{ellipses,}
+\DOCMODE)
+
+\subsection{Ellipses}
+
+There are several ways to specify an ellipse, apart from the method
+illustrated above in which the basis must be changed from square.
+Basically we must specify the lengths of the major and minor axes.
+Also it is necessary to specify an alignment for one axis.
+
+\medskip
+In the following, the ellipse is centred on $c$ and one axis is aligned
+along the line $\overline{pc}$, except with the final variant where
+it aligns with the current basis. When used <num> is treated
+as a scale factor, multiplying an appropriate length.
+%
+\begin{defs}
+|\ellipse<|<dimen>|,|<dimen>|>{|..|}| & given axes lengths \cr
+|\ellipse<,|<dimen>|>{|<style>|}| & one axis is $\overline{pc}$ \cr
+|\ellipse(,|<num>|){|<style>|}| & ...perp. axis scaled \cr
+|\ellipse(|<num>|,|<num>|){|..|}| & scaled axes aligned\hfill\break
+with basis. \cr
+\end{defs}
+
+In the latter variant, if the second <num> is <empty> then
+this is equivalent to both <num>s having the same value,
+which is in turn equivalent to the final variant for circles.
+
+\begin{code}
+\xy 0;/r5pc/:*\dir{*},*++!DR(.5){p}
+*\frm{-};p+(.5,-.5)*\dir{*}="c",
+**\dir{-},*+!UL{c},"c",
+,{\ellipse(1,.4){:}},{\ellipse(,.75){}}
+,{\ellipse<15pt,10pt>{=}}
+;*{};{\ellipse<,10pt>{.}}\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+As with full circles, full ellipses require little preparation.
+
+\DOCMODE(
+\xydef@\fullEllipse@{\xy@{fullELLIPSE}%
+ {\def\startDirection@{}\let\doCircleArc@=\doMergeEndArc@@}%
+ \ellipseArc@
+ \xy@{doCIRCarcs}{\leave@ \doCircleArcs@}\endarc@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Drawing arcs}
+
+This method is common to full circles, ellipses and circular arcs.
+It first executes the methods |\arcScale@|, |\arcRadius@|, |\ellipseRatio@|
+where necessary, then examines |\arcOrient@@| to decide if the arc is to be
+typeset clockwise or counter-clockwise.
+
+\DOCMODE(
+\xydef@\ellipseArc@{%
+ \arcScale@ \arcRadius@ \ellipseRatio@
+ \xy@{arcCONTROLS}{\baseOrient@ \arcControls@ \let\bstartPLACE@=\relax }}
+\DOCMODE)
+
+Here is where the ``control points'' are defined, for each of the
+four B\'ezier cubic segments, using coordinates in the constructed
+basis. The endpoints of the segments---though, not necessarily
+of the arc---are stored as "0p", "1c", "2c", "3c" and the tangential
+control points are stored as "1m", "2m", \dots, "8m".
+
+\DOCMODE(
+\xydef@\cubicARCcontrols@@{\czeroEdge@
+ \vfromcartesian@@0,1@\idfromc@{1@c}%
+ \vfromcartesian@@-1,0@\idfromc@{2@c}%
+ \vfromcartesian@@0,-1@\idfromc@{3@c}%
+ \vfromcartesian@@1,\arcparam@ @\idfromc@{1@m}%
+ \vfromcartesian@@\arcparam@,1@\idfromc@{2@m}%
+ \vfromcartesian@@-\arcparam@,1@\idfromc@{3@m}%
+ \vfromcartesian@@-1,\arcparam@ @\idfromc@{4@m}%
+ \vfromcartesian@@-1,-\arcparam@ @\idfromc@{5@m}%
+ \vfromcartesian@@-\arcparam@,-1@\idfromc@{6@m}%
+ \vfromcartesian@@\arcparam@,-1@\idfromc@{7@m}%
+ \vfromcartesian@@1,-\arcparam@ @\idfromc@{8@m}%
+ }
+\DOCMODE)
+
+Drawing the circle/ellipse/arc means tracing along the requisite cubic
+segments. The method |\doCircleArc@@| is used for full circles/ellipses
+when complete segments are to be typeset.
+The methods |\doMergeStartArc@|, |\doMergeEndArc@@| and |\doMergeBothArc@|
+are used when a segment is not complete. The work by ``merging'' the
+initial/final point of the curved segment with the appropriate point
+required to be at the extremity of the arc. Typesetting of the curve
+should not take place within the region covered by this merged object.
+
+To overcome the difficulty of the curve leaving then re-entering this
+region, a second merge is performed to extend it suitably. This is
+the purpose of |\cfromcontrols@|. Due to the ``convex-hull property''
+of the B\'ezier cubic segment, a point can be constructed from
+the end-points and control points which can be used to extend
+the rectangle to cover a suitable portion of the curve.
+
+\DOCMODE(
+\xydef@\doCircleArc@@#1#2{\save@ \ifcase#2\relax
+ \doCircleArc@@@{0@p}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleArc@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleArc@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleArc@@@{3@c}{7@m}{8@m}{0@p}{#1}\or
+ \doCircleArc@@@{0@p}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleArc@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleArc@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleArc@@@{3@c}{7@m}{8@m}{0@p}{#1}\fi \leave@ }
+
+\xydef@\doCircleArc@@@#1#2#3#4#5{%
+ \cfromid@{#1}\pfromc@\senter@
+ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \connect@\crvs{#5}\relax\sinit@\sleave@}
+
+\xydef@\doMergeEndArc@@#1#2{\save@\ifcase#2\relax
+ \doMergeEnd@@@{0@p}{1@m}{2@m}{1@c}{#1}\relax\or
+ \doMergeEnd@@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or
+ \doMergeEnd@@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or
+ \doMergeEnd@@@{3@c}{7@m}{8@m}{0@p}{#1}@\fi \leave@ }
+
+\xydef@\doMergeEnd@@@#1#2#3#4#5#6{%
+ \cfromid@{#1}\pfromc@\senter@
+ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \ifx#6\relax
+ \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi
+ \enter@\cmergethec@\cfromid@{0@c}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#1}{#2}{#3}{#4}\leave@
+ \connect@\crvs{#5}\relax
+ \sinit@\sleave@}
+
+\xydef@\doMergeStartArc@#1#2{\save@\ifcase#2\relax
+ \doMergeStart@@{0@p}{1@m}{2@m}{1@c}{#1}@\or
+ \doMergeStart@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or
+ \doMergeStart@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or
+ \doMergeStart@@{3@c}{7@m}{8@m}{0@p}{#1}\relax\fi \leave@ }
+
+\xydef@\doMergeStart@@#1#2#3#4#5#6{%
+ \cfromid@{#1}\ifx#6\relax
+ \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi
+ \enter@\cmergethec@\cfromid@{0@x}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#4}{#3}{#2}{#1}\leave@
+ \pfromc@
+ \senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \connect@\crvs{#5}\relax\sinit@\sleave@}
+
+\xydef@\doMergeBothArc@#1#2{\save@\ifcase#2\relax
+ \doMergeBoth@@{0@p}{1@m}{2@m}{1@c}{#1}@\or
+ \doMergeBoth@@{1@c}{3@m}{4@m}{2@c}{#1}\relax\or
+ \doMergeBoth@@{2@c}{5@m}{6@m}{3@c}{#1}\relax\or
+ \doMergeBoth@@{3@c}{7@m}{8@m}{0@p}{#1}\relax\fi \leave@ }
+
+\xydef@\doMergeBoth@@#1#2#3#4#5#6{%
+ \cfromid@{#1}\ifx#6\relax
+ \L@c=.1\p@ \R@c=\L@c \U@c=\L@c \D@c=\L@c \Edge@c={\rectangleEdge}\fi
+ \enter@\cmergethec@\cfromid@{0@x}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#4}{#3}{#2}{#1}\leave@
+ \pfromc@
+ \senter@ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \enter@\cmergethec@\cfromid@{0@c}\leave@
+ \enter@\cmergethec@\cfromcontrols@{#1}{#2}{#3}{#4}\leave@
+ \connect@\crvs{#5}\relax\sinit@\sleave@}
+
+\xydef@\doMergeEndArc@#1#2{\count@@=#2\relax
+ \ifnum\count@@>\thr@@ \advance\count@@-4\fi\relax
+ \doMergeEndArc@@{#1}\count@@ }
+
+\xydef@\doStraightArc@@#1{\xy@{STRAITarc}{\save@
+ \cfromid@{0@p}\pfromc@\cfromid@{0@c}%
+ \senter@\connect@\crvs{#1}\sinit@\sleave@\leave@}}
+
+\xydef@\cfromcontrols@#1#2#3#4{\bgroup
+ \cfromid@{#1}\L@p=\X@c \U@p=\Y@c
+ \cfromid@{#4}\R@p=\X@c \D@p=\Y@c
+ \cfromid@{#3}\A@=\X@c \B@=\Y@c \cfromid@{#2}%
+ \ifdim\R@p>\L@p \ifdim\A@>\R@p \R@p=\A@
+ \ifdim\X@c>\R@p \R@p=\X@c\fi\fi
+ \else \ifdim\A@<\R@p \R@p=\A@
+ \ifdim\X@c<\R@p \R@p=\X@c\fi\fi
+ \fi
+ \ifdim\D@p>\U@p \ifdim\B@>\D@p \D@p=\B@
+ \ifdim\Y@p>\D@p \D@p=\Y@p\fi\fi
+ \else \ifdim\B@<\D@p \D@p=\B@
+ \ifdim\Y@p<\D@p \D@p=\Y@p\fi\fi
+ \fi
+ \edef\next@{\egroup \X@c=\the\R@p \Y@c=\the\D@p}\next@ }
+\DOCMODE)
+
+The next method controls which segments are typeset.
+It is rather primitive and could well be improved; e.g. to be more like
+|\doEllipseSectors@| with |\forwardSectors@| and |\backwardSectors@|.
+
+First it calculates the |\startDirection@@| as a number, using the current
+base. Next it calculates |\quadDirection@| which records the angle of
+the $y$-axis in the current base.
+Depending on the required orientation, read from |\arcOrient@@|, this
+latter number is adjusted to be minimal greater than |\startDirection@@|
+for a counter-clockwise arc, or maximal less than it for a clockwise one.
+Similarly the value of |\endDirection@@| is made larger or smaller
+than |\startDirection@@|, according to orientation, by adding $\pm8192$
+if necessary.
+
+Each required segment is typeset using |\doCircleArc@@| except that the
+final segment uses the value of |\doCircleArc@|. When the end-point is
+the original $c$ then this value is |\doMergeEndArc@@|, so that the arc will
+stop at the edge of this <pos>, otherwise |\doCircleArc@@| is used.
+
+(The following macro can be shortened by making use of the methods
+|\forwardSectors@| and |\backwardSectors@|, as in |\doEllipseSectors@|.
+
+\DOCMODE(
+\xydef@\doCircleArcs@{\save@
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@
+ \startDirection@ \edef\startDirection@@{\the\Direction}%
+ \cfromid@{1@c}\setupDirection@ \edef\quadDirection@{\the\Direction}\relax
+ \count@=\quadDirection@ \relax\def\nextii@{^}%
+ \let\preDirection@@=\startDirection@@
+ \ifx\nextii@\arcOrient@@
+ \ifnum\quadDirection@>\startDirection@@ \relax
+ \else \advance\count@ by8192 \relax\edef\quadDirection@{\the\count@}\fi
+ \ifx\endDirection@@\empty
+ \ifx\endDirection@\relax
+ \bgroup\cfromid@{0@c}\setupDirection@
+ \edef\next@{\egroup \count@@=\the\Direction}\next@ \relax
+ \ifnum\count@@<\startDirection@@ \advance\count@@ 8192 \fi
+ \edef\endDirection@@{\the\count@@}%
+ \else
+ \count@@=\startDirection@@
+ \advance\count@@ by8192 \edef\endDirection@@{\the\count@@}%
+ \fi
+ \else
+ \count@@=\endDirection@@ \relax\ifnum\count@@<\startDirection@@ \relax
+ \advance\count@@ by8192 \edef\endDirection@@{\the\count@@}\fi
+ \fi % \forwardSectors@
+ \ifnum\endDirection@@>\quadDirection@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{0}}%
+ \else
+ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{0}}%
+ \fi
+%
+ \else % \arcOrient@@ = _
+%
+ \ifnum\count@<\startDirection@@\relax\else\advance\count@ by-8192 \relax
+ \edef\quadDirection@{\the\count@}\fi
+ \ifx\endDirection@@\empty
+ \ifx\endDirection@\relax
+ \bgroup\cfromid@{0@c}\setupDirection@
+ \edef\next@{\egroup \count@@=\the\Direction}\next@ \relax
+ \ifnum\count@@>\startDirection@@ \advance\count@@-8192 \fi
+ \edef\endDirection@@{\the\count@@}%
+ \else
+ \count@@=\startDirection@@
+ \advance\count@@ by-8192 \edef\endDirection@@{\the\count@@}%
+ \fi
+ \else
+ \count@@=\endDirection@@ \relax \ifnum\count@@>\startDirection@@
+ \advance\count@@ by-8192 \edef\endDirection@@{\the\count@@}\fi
+ \fi %\backwardSectors@
+ \ifnum\endDirection@@<\quadDirection@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{0}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{0}}\fi
+ \fi
+ \next@ \relax
+%
+ \count@=\quadDirection@ \relax\def\nextii@{^}\DN@{}%
+ \ifx\nextii@\arcOrient@@
+ \count@@=\startDirection@@ \advance\count@@ by4096 \relax
+ \ifnum \count@<\endDirection@@ \relax
+ \ifnum\endDirection@@>\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{1}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{1}}\fi
+ \fi
+ \else
+ \count@@=\startDirection@@ \advance\count@@ by-4096 \relax
+ \ifnum \count@>\endDirection@@ \relax
+ \ifnum\endDirection@@<\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{1}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{1}}\fi
+ \fi\fi
+ \next@ \relax
+%
+ \ifx\next@\empty \else \relax
+ \count@=\startDirection@@ \relax\def\nextii@{^}\DN@{}%
+ \ifx\nextii@\arcOrient@@ \advance\count@ by4096 \relax
+ \count@@=\quadDirection@ \advance\count@@ by4096 \relax
+ \ifnum \count@<\endDirection@@
+ \ifnum\endDirection@@>\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{2}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{2}}\fi
+ \fi
+ \else \advance\count@ by-4096 \relax
+ \count@@=\quadDirection@ \advance\count@@ by-4096 \relax
+ \ifnum \count@>\endDirection@@ \relax
+ \ifnum\endDirection@@<\count@@
+ \DN@{\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{2}}%
+ \else \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{2}}\fi
+ \fi\fi
+ \next@ \relax
+ \fi
+%
+ \ifx\next@\empty \else \relax
+ \count@=\quadDirection@ \def\nextii@{^}\DN@{}%
+ \ifx\nextii@\arcOrient@@ \advance\count@ by4096 \relax
+ \ifnum \count@<\endDirection@@
+ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{3}}\fi
+ \else \advance\count@ by-4096 \relax
+ \ifnum \count@>\endDirection@@
+ \DN@{\expandafter\doCircleArc@\expandafter{\arcSTYLE}{3}}\fi
+ \fi \next@ \relax
+ \fi
+%
+ \leave@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\message{elliptical arcs,}
+\DOCMODE)
+
+\subsection{Circular and Elliptical Arcs}
+
+The |xyarc| feature handles arcs to be specified in two essentially
+different ways, according to what information is provided by the user.
+We call these the ``radius-unknown/end-points known'' and the
+``radius-known/end-points unknown'' cases.
+
+\subsubsection*{radius unknown, end-points known}
+The simplest case, though not necessarily the most common, is that of
+a circular arc from $p$ to $c$, with radius and centre unspecified.
+To uniquely specify the arc, the tangent direction at $p$ is taken
+to be along the current direction, given by |\Direction|, as set by the
+latest <connect>ion. If no connection has been used, then the default
+<direction> is ``up''.
+%
+\begin{defs}
+|\ellipse_{|<style>|}| & clockwise arc from $p$ to $c$ \cr
+|\ellipse^{|<style>|}| & counter-clockwise arc \cr
+|\ellipse{|<style>|}| & also counter-clockwise \cr
+\end{defs}
+%
+With this information only, a unique circle can be found
+whose radius and centre need not be specified in advance.
+For a unique arc it is sufficient to specify the orientation
+around the circle.
+
+The exception is when the current direction is from $p$ to $c$,
+in which case no circle exists. Instead a straight line is typeset
+accompanied by the following message:
+$$
+|Xy-pic Warning: straight arc encountered |
+$$
+
+The following example shows how, given three points $o$, $p$ and $c$,
+to continue the line $\overline{op}$ by a circular arc to $c$ joining
+smoothly at $p$.
+
+\begin{code}
+\xy 0;/r5pc/:*=+\dir{*}*+!UR{p};
+p+(.5,-.5)*\dir{*}="o",*+!UL{o}
+,+(0,.81)*=<6.1pt>\dir{*}*\frm{-}="c"
+,*+!DL{c},"o",**\dir{-},
+"c",{\ellipse_{}},{\ellipse^{.}}
+%
+,"o"+(1.5,.2)*\dir{*}="a"*+!UL{a}
+,"o";p+/_1pc/,**{},"a",{\ellipse_{}}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+%
+\noindent
+Note how the remainder of the circle can be specified separately.
+The example also shows how to specify an arc which leaves a particular
+point perpendicular to a specific direction.
+
+\medskip
+Slightly more complicated is when the tangent direction at $p$ is specified,
+but different from the current direction; a unique circular arc can still
+be defined. More complicated is when a specific tangent direction is
+required also at $c$. In this case the arc produced is a segment
+of an ellipse. (If the required tangent at $p$ points to $c$ then a straight
+segment is drawn, as in the circular case described above.)
+%
+\begin{defs}
+|\ellipse|<dir>$_p$|,|<orient>|{..}| & circular \cr
+|\ellipse|<dir>$_p$|,|<orient>|,|<dir>$_c$|{..}| & elliptical \cr
+|\ellipse|<dir>$_p$|,|<orient><dir>$_c$|{..}| & elliptical\cr
+|\ellipse|<dir>$_p$|,|<orient>,=<dir>$_c$|{..}| & elliptical\cr
+|\ellipse`|<coord><orient>|{..}| & elliptical\cr
+\end{defs}
+%
+In these cases <dir>$_p$ and <dir>$_c$ are <direction> specifications,
+as in figure~??g[xy.doc:f.object] and note~??g[xy.doc:<direction>],
+and <orient> must be either |^| or |_|
+for anti-/clockwise respectively, defaulting to |^| if <empty>.
+Beware that the |(*|<pos><decor>|*)| form {\em must\/} be used for this
+<direction> variant, as if an object modifier.
+
+The second and third cases in the above table generally
+give identical results. The second `|,|' is thus optional, except
+in two specific situations:
+\begin{itemize}
+\item[1.] <orient> is empty and <dir>$_c$ has |^| or |_| as
+the first token;
+\item[2.] <orient> is |^| and <dir>$_c$ has |^| as first token.
+Without the |,| then |^|{}|^| would be interpreted by \TeX\ as part of
+a special ligature for a hexadecimal character code.
+\end{itemize}
+If both <orient> and <dir>$_c$ are <empty> then even the first `|,|'
+can be omitted.
+%
+\begin{code}
+\xy 0;/r5pc/:*=<8.1pt>\dir{*}="p",*\frm{-}
+,*++!U{p},"p";p+(.5,-.5)*+\dir{*}="o"
+,*+!UL{o},+(0,.81)*=<8.1pt>\dir{*}="c"
+,*\frm{-},*++!L{c},"o"**\dir{-},"c"
+,{\ellipse :a(50),_:0{:}}
+,{\ellipse :a(30),_:a(-45){}}
+,{\ellipse :a(40),_{.}},
+;*{};{\ellipse :a(20),^=_{=}}\endxy
+\end{code}
+$$\docode$$
+\displaycode
+%
+Note that only the slope of <dir>$_p$ and <dir>$_c$ is significant;
+rotations by 180$^\circ$ being immaterial.
+
+\begin{code}
+\xy 0;/r5pc/:*\dir{*}="p",*+!UR{p}
+;p+(.5,-.5)*\dir{*}="o",*++!L{o}**\dir{-}
+,p+(.5,.5)*\dir{*}="c",*++!D{c},"c"
+;p+(1,.1)*\dir{*}="q",*++!L{q}**\dir{-}
+,"o";"p",**{};"c"
+,{\ellipse![["o";"p"]],_![["q";"c"]]{}}
+,{\ellipse![["o";"p"]],![["c";"q"]]{.}}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+%
+The |=| variant establishes the <direction> parsing to begin with
+the direction resulting from <dir>$_p$ instead of the original direction.
+If <dir>$_c$ is required to be the original direction then use |:0|.
+It cannot be <empty> since this is interpreted as requiring
+a circular arc with unspecified tangent at $c$; see the example above.
+However when <dir>$_p$ and <dir>$_c$ are parallel there is a
+whole family\footnote{Indeed this is always so. The algorithm used for
+the general case tends toward parallel lines---clearly unsuitable.}
+of possible ellipses with the specified tangents.
+
+With no further hint available, a choice is made based on the distance
+between $p$ and $c$. If the required direction is perpendicular to
+$\overline{pc}$ this choice results in a circular arc.
+The optional factor in |=(|<num>|)| is used to alter this choice;
+the default |(1)| is assumed when nothing follows the |=|.
+This factor is used to ``stretch'' the ellipse along the specified direction.
+For a negative <num> the orientation reverses.
+%
+\begin{code}
+\xy ;/r5pc/:*+=<10.1pt>\dir{*}="p";p*\frm{-}
+,*++!UR{p},p+(.5,-.5)*\dir{*}="o",**\dir{-}
+,*+!UL{o},+(0,.81)*=<8.1pt>\dir{*}="c"
+,*\frm{-},*++!DL{c},"c"
+,{\ellipse r,={}},{\ellipse r,=(2){.}}
+,{\ellipse r,^=(3){.}},{\ellipse r,=(-2){}}
+,{\ellipse r,=(-1){.}}\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+The final variant uses the directions from $p$ and $c$ to the
+given <coord>. If <orient> is <empty> then the orientation is
+determined to give the shortest path along the ellipse. Specifying
+an <orient> of |^| or |_| will force the orientation, even if this
+means travelling `the long way' around the ellipse.
+For example, see next figure.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph{Alternative curves}
+In some cases the circular or elliptic curve can be replaced by a curve with
+different shape, having the same tangent directions at the end-points.
+When a full circle/ellipse is specified then one gets instead a closed
+curve constructed from 4 spline segments. Other variants use a single
+segment, 2 or 3 segments, or some portion of all 4 segments.
+Possibilities are given in the following table.
+%
+\begin{defs}
+|\ellipse~e ...{|<..>|}| & elliptical, as above \cr
+|\ellipse~q ...{|<..>|}| & parabolic segments \cr
+|\ellipse~c ...{|<..>|}| & cubic segments \cr
+|\ellipse~i ...{|<..>|}| & interpolating cubic \cr
+|\ellipse~p ...{|<..>|}| & cuspidal cubic \cr
+|\ellipse~c(|<num>|)...{|<..>|}|\kern-20pt &\kern20pt cubic segments,
+ \hfil\break with ``looseness''\cr
+\end{defs}%
+%
+In the latter case the <num>, typically between 0 and 1, controls
+how soon the curve begins to bend away from the tangent direction.
+Smaller values give tighter curves --- 0 for straight lines ---
+with |~c| being the same as |~c(1)| and |~q| is |~c(.66667)|,
+that is <num>$={2\over3}$.
+
+The curve produced by the ``interpolating'' variant |~i| actually
+passes through the control point |"x"|, with slope parallel
+to the line $\overline{pc}$. Since the tangents at $p$ and $c$
+point toward |"x"| the curvature is quite gentle until near |"x"|
+where the curve bends rapidly, yet smoothly. This is obtained also
+by using |~c(1.33333)|, that is <num>$={4\over3}$. Since $|<num>|>1$
+the ``convex hull property'' does not hold; indeed the curve is entirely
+outside the convex hull of $p$, $c$ and |"x"|, apart from those points
+themselves.
+
+The `cuspidal' variant |~p| is equivalent to |~c(2)|. It exhibits a cusp.
+For $|<num>|>2$ the curve is so ``loose'' that it exhibits loops.
+(The author offers no guarantees on the usefulness of such curves
+for any particular purpose; however they do look nice.~\smiley)
+
+\begin{code}
+\xy 0;/r6pc/:*+\dir{*}="p",*+!UR{p},"p";
+p+(.5,-.5)*+\dir{*}="c",*+!UL{c}
+,"p"+(.825,-.25)="x"*\dir{+},"c"
+,{\xycompile{\ellipse`"x"{-}}}
+,{\xycompile{\ellipse~q`"x"^{.}}}
+,{\xycompile{\ellipse~c`"x"{.}}}
+,{\xycompile{\ellipse~c(.3)`"x"^{:}}}
+,{\xycompile{\ellipse~c(2.3)`"x"{-}}}
+,{\xycompile{\ellipse~i`"x"^{.}}}
+,{\xycompile{\ellipse~p`"x"^{-}}}
+\endxy
+\end{code}
+$$\hss\docode\hss$$
+\displaycode
+
+{\bf Hint: }
+When exploring to find the best location for the ``control-point''
+(e.g. the |"x"| in the above example), then use |\xycompile| as
+shown, changing the location outside of the compilation. This speeds up
+the reprocessing with the changed value.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Furthermore, the ellipses are not true ellipses, but are constructed from
+four B\'ezier cubic curves, one for each quadrant of the circle or ellipse.
+To do this it is sufficient to establish
+the control points for each cubic segment. This is straightforward, using
+the following ``magic number'', given a square basis such that the desired
+circle is the unit circle, or rectangular basis for which the ``unit circle''
+is the desired ellipse. Thus |~e| is equivalent to |~c(.5517847)|.
+
+\DOCMODE(
+\xydef@\arcmagic@@{0.5517847}
+\xylet@\arcmagic=\arcmagic@@
+\DOCMODE)
+
+This is the magic number, exactly given by
+${1\over12}\bigl(\sqrt{385}-13\bigr)$,
+that helps construct the B\'ezier cubic curve
+that best approximates a quarter-turn arc of a circle.
+It does so with remarkable accuracy,
+differing by at most .5\% of the radius at any angle;
+the average deviation along the whole quadrant being less than .13\%.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\tildeARC@#1{%
+ \if q#1\DN@{\xy@{quadARC}\quadARC@ \arc@}%
+ \else\if c#1\DN@{\xyFN@\cubicARC@i}%
+ \else\if e#1\DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}%
+ \else\if i#1\DN@{\xy@{interpARC}\interpARC@ \arc@}%
+ \else\if p#1\DN@{\xy@{cuspidalARC}\cuspidalARC@ \arc@}%
+ \else\xywarning@{unknown arc type: #1 }%
+ \DN@{\xy@{ellipticARC}\ellipticARC@ \arc@}%
+ \fi\fi\fi\fi\fi \next@ }
+
+\xydef@\cubicARC@i{%
+ \ifx\next\space@ \expandafter\DN@\space{\xyFN@\cubicARC@i}%
+ \else\ifx\next (\DN@(##1){\xy@{cubicARC(##1)}{\cubicARC@{##1}}\arc@}%
+ \else \DN@{\xy@{cubicARC(1)}{\cubicARC@{1}}\arc@}%
+ \fi\fi \next@ }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\ellipticARC@{\let\arcControls@=\cubicARCcontrols@@
+ \edef\arcparam@{\arcmagic@@}}
+
+\xydef@\cubicARC@#1{\let\arcControls@=\cubicARCcontrols@@
+ \dimen@=#1\p@ \edef\arcparam@{\expandafter\removePT@\the\dimen@}}
+
+\xydef@\quadARC@{\let\arcControls@=\cubicARCcontrols@@
+ \def\arcparam@{.66667}}
+
+\xydef@\cuspidalARC@{\let\arcControls@=\cubicARCcontrols@@
+ \def\arcparam@{2}}
+
+\xydef@\interpARC@{\let\arcControls@=\cubicARCcontrols@@
+ \def\arcparam@{1.33333}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph{Avoiding overflows}
+If <dir>$_p$ and <dir>$_c$ are intended to be equal then the method of
+the previous paragraph should be used. However it may happen that
+``nearly parallel'' directions may be specified, perhaps by accident.
+There is then the possibility of ``numerical overflow'' or a ``division by
+zero'' error. The latter may be accompanied by a warning message:
+\begin{eqnarray*}
+&|Xy-pic Warning: division by 0 in |\\
+&\qquad |\intersect@, replaced by 50|
+\end{eqnarray*}
+This indicates that the number 50 has been used as the result of a
+division by zero. In many contexts this will produce an acceptable result.
+However it may lead to an ``overflow'' in other situations, or to drawing
+beyond the normal page boundary. This can be controlled using a <decor>
+of type |,{\zeroDivideLimit{|<num>|}},| prior to specifying the |\ellipse|.
+The value 50 will be replaced by <num> whenever a ``division by zero''
+would otherwise be encountered in an intersection calculation.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\ARCturn@{\xy@@\bgroup\afterCOORD{%
+ \xy@@{\edef\next@{\egroup \A@=\the\X@c \B@=\the\Y@c}\next@}\ARCturn@@}}
+
+\xydef@\ARCturn@@#1@{\DN@{#1}\DNii@{^}%
+ \ifx\next@\nextii@ \xy@{^}{\def\arcOrient@@{^}}%
+ \else\DNii@{_}\ifx\next@\nextii@ \xy@{_}{\def\arcOrient@@{_}}%
+ \else\xy@{}{\def\arcOrient@@{}}\fi\fi
+ \xy@@\ARCturn@@@ \processDirections@@ }
+
+\xydef@\ARCturn@@@{%
+ \bgroup\cfromid@{0@p}\X@p=\X@c \Y@p=\Y@c \X@c=\A@ \Y@c=\B@
+ \setupDirection@ \edef\next@{\egroup\count@=\the\Direction}\next@\relax
+ \edef\startDirection@@{\the\count@ }%
+ \bgroup\cfromid@{0@c}\X@p=\A@ \Y@p=\B@
+ \setupDirection@ \edef\next@{\egroup\count@=\the\Direction}\next@\relax
+ \edef\endDirection@@{\the\count@}%
+ \ifx\arcOrient@@\empty
+ \bgroup\cfromid@{0@p}\X@p=\X@c \Y@p=\Y@c \cfromid@{0@c}%
+ \setupDirection@ \edef\next@{\egroup\count@@=\the\Direction}\next@\relax
+ \count@=-\count@@ \advance\count@\startDirection@@ \relax \count@=-\count@
+ \ifnum\count@>4096 \def\arcOrient@@{_}%
+ \else\ifnum\count@<-4096 \def\arcOrient@@{^}%
+ \else\ifnum\count@>\z@ \def\arcOrient@@{^}%
+ \else\def\arcOrient@@{_}\fi\fi\fi
+ \fi }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\circleArc@{%
+ \xy@{circARC@}{\cfromid@{0@p}\pfromc@\cfromp@\startDirection@
+ \arcCenter@\idfromc@{0@0}%
+ \def\startDirection@{\bgroup
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@
+ \edef\next@{\egroup \Direction=\the\Direction}\next@
+ \relax\imposeDirection@}}%
+ \ifx\endDirection@@\empty
+ \ifx\arcRadius@\empty \ifx\ellipseRatio@\empty\else
+ \DN@{\arcScale@@}\ifx\arcScale@\next@\else
+ \xy@@{\bgroup\cfromid@{0@0}\pfromc@\cfromid@{0@c}\setupDirection@
+ \edef\next@{\egroup \Direction=\the\Direction}\next@
+ \edef\endDirection@@{\the\Direction}}\fi\fi\fi\fi
+ \ellipseArc@ \xy@@{\leave@ \doCircleArcs@}\endarc@ }
+% \ellipseArc@ \xy@@{\doCircleArcs@}\endarc@ }
+\DOCMODE)
+
+The following methods calculate the centre of a circle using the
+perpendicular to the required angle at $p$ and the perpendicular bisector
+of the line $\overline{pc}$.
+
+\DOCMODE(
+\xydef@\arcbisector{%
+ \cfromid@{0@p}\pfromc@\cfromid@{0@c}\setupDirection@
+ \advance\X@c\X@p\divide\X@c\tw@
+ \advance\Y@c\Y@p\divide\Y@c\tw@ \czeroEdge@ \pfromc@
+ \enter@\cplusthec@ \enter@\relax\begingroup
+ \aboveDirection@\xydashl@ \vfromslide@i{}@\leave@ }
+
+\xydef@\arcCenter@{%
+ \cfromid@{0@p}\pfromc@\cfromid@{0@m}\setupDirection@
+ \cfromp@\enter@\cplusthec@ \enter@\relax\begingroup
+ \aboveDirection@\xydashl@ \vfromslide@i{}@\leave@\no@@
+ \arcCenter@i }
+
+\xydef@\arcCenter@i{%
+ \enter@{\pfromthep@}\setupDirection@ \Creset@@
+ \let\PLACEedgep@@=\PLACEedgep@ \let\PLACEedgec@@=\PLACEedgec@
+ \enter@{\pfromthep@\basefromthebase@}\bgroup
+ \arcbisector \edef\next@{\egroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p }%
+ \next@ \Cintercept@@ \leave@\leave@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{radius known, end-points unknown}
+The language for these is a combination of most of that used above,
+but the interpretation of the <direction>s is different...
+%
+\begin{defs1}
+|\ellipse<|<radius>|>|<dir>$_1$|,|<orient>|,|<dir>$_2$|{..}|\cr
+|\ellipse<|<radius>|>|<dir>$_1$|,|<orient>|,=|<dir>$_2$|{..}|\cr
+\end{defs1}
+%
+where <radius> is one of the forms used above to describe a circle
+or ellipse. Not all of the ellipse will be typeset---only that arc
+starting with <dir>$_1$ as tangent vector, tracing via <orient>
+until the tangent points in direction <dir>$_2$.
+This effectively extends the notation used with |\cir|
+in ??g[xy.doc:objectlib.circles].
+Note that rotating a given <dir>$_i$ by 180$^\circ$ specifies
+a different arc on the same ellipse/circle.
+Reversing the <orient> no longer gives the complementary arc,
+but this complement rotated 180$^\circ$.
+%
+\begin{code}
+\xy 0;/r5pc/:*\dir{*}="p",*+!DR{p};
+p+(.5,-.5)*\dir{*}="c",*+!UL{c}**\dir{-}
+,"c",{\ellipse<15pt>_,=:a(45){=}}
+ ,{\ellipse<>__,=:a(30){-}}
+,{\ellipse(1,.4){.}}
+ ,{\ellipse(1,.4)_,=:a(120){-}}
+,{\ellipse(,.75){.}}
+ ,{\ellipse(,.75)_,^,^{-}}\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph{parsing of directions}
+
+\DOCMODE(
+\xydef@\getarcExtents@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcExtents@}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{\fullEllipse@}%
+ \else\DN@{\xy@{arcEXTENTs}{\save@
+ \def\startDirection@{\Direction=\startDirection@@ \imposeDirection@}}%
+ \xyFN@\getarcExtents@ii}\fi\fi \next@ }
+
+\xydef@\getarcExtents@ii{%
+ \ifx\next!\xy@{![[}{}\DN@![[##1]]{\getxyDirection@{##1}\getarcExtents@iv}%
+ \else\DN@{\getarcExtents@iv}\fi \next@ }
+
+\xydef@\getarcExtents@iv{\afterDIRECTIONorEMPTY
+ {\xy@{startDIR}{\edef\startDirection@@{\the\Direction}\leave@}%
+ \xyFN@\getarcOrientation@}%
+ {\xy@{startDIR}{\edef\startDirection@@{\the\Direction}\leave@}%
+ \xyFN@\getarcOrientation@}}
+
+\xydef@\getarcOrientation@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcOrientation@}%
+ \else\ifx\next @\xy@{@}{}\DN@{\getEndDirection@x}%
+ \else\ifx\next,\xy@{,}{}\DN@,{\xyFN@\getarcOrientation@i}%
+ \else\DN@{\getarcOrientation@i}\fi\fi\fi \next@ }%
+
+\xydef@\getarcOrientation@i{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getarcOrientation@i}%
+ \else\ifx\next @\xy@{@}{}\DN@{\getEndDirection@x}%
+ \else\ifx\next^{}\DN@##1{\xy@{^}{\def\arcOrient@@{^}}%
+ \def\arcOrient@@{^}\xyFN@\getEndDirection@}%
+ \else\ifx\next_\DN@##1{\xy@{_}{\def\arcOrient@@{_}}%
+ \def\arcOrient@@{_}\xyFN@\getEndDirection@}%
+ \else\DN@{\xyFN@\getEndDirection@}%
+ \fi\fi\fi\fi \next@ }
+
+\xydef@\getEndDirection@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getEndDirection@}%
+ \else\ifx\next,\DN@,{\xy@{,}{}\xyFN@\getEndDirection@}%
+ \else\addEQ@\ifx\next\addEQ@\DN@{\xy@{=}{\save@\startDirection@}%
+ \xyFN@\getEqDirection@}%
+ \else \ifx\next!\DN@![[##1]]{\xy@{![[}{\save@}\getxyDirection@{##1}%
+ \xy@{endDIR}{\edef\endDirection@@{\the\Direction}}%
+ \xyFN@\getEndDirection@i}%
+ \else \DN@{\xy@{origDIR}{\save@\origDirection@}\getEndDirection@i}%
+ \fi\fi\fi\fi \next@ }
+
+\xydef@\getEqDirection@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\getEqDirection@}%
+ \else\ifx\next @\xy@{@}{}\DN@ @{%
+ \xy@{sameDIR}{\edef\endDirection@@{\startDirection@@}\leave@}%
+ \parEllipse@{1}{}}%
+% \else\ifx\next (\DN@(##1)##2@{\xy@{()}{\leave@}\parEllipse@{##1}{##2}}%
+ \else\ifx\next (\DN@({\xyFN@\checkEqOpen@}%
+ \else \DN@{\getEndDirection@i}\fi\fi\fi \next@ }
+
+\xydef@\checkEqOpen@{%
+ \ifx\next *\DN@{\getEndDirection@i (}%
+ \else \DN@##1)##2@{\xy@{()}\leave@ \parEllipse@{##1}{##2}}%
+ \fi \next@ }
+
+\xydef@\getEndDirection@i{\afterDIRECTIONorEMPTY
+ {\xy@{endDIR}{\edef\endDirection@@{\the\Direction}\leave@}%
+ \getEndDirection@x }%
+ {\xy@{endDIR}\leave@ \getEndDirection@x }}
+
+\xydef@\getEndDirection@x#1@{%
+ \DN@{#1}\ifx\next@\empty\relax \else\xywarning@{\omittingTokens@}\fi
+ \processDirections@ }
+
+\xydef@\omittingTokens@{omitting unused tokens: \codeof\next@ }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\processDirections@@{%
+ \ifx\endDirection@@\empty \skewCircle@
+ \else \skewEllipse@ \expandafter \afterARCextents@@ \fi }
+
+\xydef@\processArcDirections@{%
+ \xy@{ARCdirs}{\ifx\endDirection@@\empty
+ \origDirection@ \edef\endDirection@@{\the\Direction}\fi}%
+ \ellipseArc@
+ \xy@{procARCdirs}\processArcDirections@@
+ \let\arcScale@\ellsave@ \let\arcRadius@\ellsave@ \def\ellipseRatio@{}%
+ \xy@{circSECTORS}{\doCircleSectors@}\endarc@ }
+
+\xydef@\ellsave@{\xy@@{\save@}}
+
+\xydef@\processArcDirections@@{\save@
+ \bgroup \cfromid@{0@0}\pfromc@ \Direction=\startDirection@@
+ \DN@{_}\ifx\next@\arcOrient@@
+ \advance\Direction \ifnum\Direction<\z@-\fi 4096 \relax\fi
+ \imposeDirection@
+ \d@X=\cosDirection\Y@ybase \advance\d@X-\sinDirection\X@ybase
+ \d@Y=-\cosDirection\Y@xbase \advance\d@Y\sinDirection\X@xbase
+ \setupDirection@i
+ \d@X=-\cosDirection\X@ybase \advance\d@X\sinDirection\X@xbase
+ \d@Y=-\cosDirection\Y@ybase \advance\d@Y\sinDirection\Y@xbase
+ \enter@\cplusthec@\X@c=\d@X \Y@c=\d@Y \leave@ \czeroEdge@
+ \setupDirection@i
+ \czeroEdge@
+ \edef\next@{\egroup \cfromthec@ \count@=\the\Direction}\next@
+ \edef\startDirection@@{\the\count@}\idfromc@{0@x}%
+%
+ \bgroup \cfromid@{0@0}\pfromc@ \Direction=\endDirection@@
+ \DN@{_}\ifx\next@\arcOrient@@
+ \advance\Direction \ifnum\Direction<\z@-\fi 4096 \relax\fi
+ \imposeDirection@
+ \d@X=\cosDirection\Y@ybase \advance\d@X-\sinDirection\X@ybase
+ \d@Y=-\cosDirection\Y@xbase \advance\d@Y\sinDirection\X@xbase
+ \setupDirection@i
+ \d@X=-\cosDirection\X@ybase \advance\d@X\sinDirection\X@xbase
+ \d@Y=-\cosDirection\Y@ybase \advance\d@Y\sinDirection\Y@xbase
+ \enter@\cplusthec@\X@c=\d@X \Y@c=\d@Y \leave@
+ \czeroEdge@
+ \setupDirection@i
+ \edef\next@{\egroup \cfromthec@ \count@=\the\Direction}\next@
+ \edef\endDirection@@{\the\count@}\idfromc@{0@c}%
+%
+ \count@=\startDirection@@ \relax \count@@=\endDirection@@ \relax
+ \DN@{^}\ifx\arcOrient@@\next@
+ \ifnum\count@@>\count@ \else\advance\count@@ 8192 \relax\fi
+ \else
+ \ifnum\count@@<\count@ \else\advance\count@@-8192 \relax\fi\fi
+ \edef\startDirection@@{\the\count@}%
+ \edef\endDirection@@{\the\count@@}}%
+
+\xydef@\doCircleSectors@{%
+ \let\doCircleArc@=\doMergeEndArc@@ \leave@ \leave@
+ \cfromid@{0@0}\pfromc@\cfromid@{0@p}\setupDirection@
+ \count@=\Direction \DN@{^}\ifx\arcOrient@@\next@
+ \ifnum\count@>\startDirection@@ \advance\count@-8192 \fi\relax
+ \count@@=\count@ \advance\count@@ 8192 \relax
+ \ifnum\count@@<\endDirection@@ \advance\count@@ 8192 \fi\relax
+ \else
+ \ifnum\count@<\startDirection@@ \advance\count@ 8192 \fi\relax
+ \count@@=\count@ \advance\count@@-8192 \relax
+ \ifnum\count@@>\endDirection@@ \advance\count@@-8192 \fi\relax
+ \fi \relax
+ \edef\preDirection@@{\the\count@}\edef\postDirection@@{\the\count@@}%
+ \cfromid@{1@c}\setupDirection@ \count@=\Direction
+ \def\nextii@{^}\ifx\nextii@\arcOrient@@
+ \DN@{\forwardSectors@\doEllipseSectors@}%
+ \ifnum\count@<\preDirection@@ \advance\count@ 8192 \relax
+ \else \count@@=\count@\advance\count@-8192 \relax
+ \ifnum\count@@<\preDirection@@ \else\count@=\count@@ \fi\fi
+ \else
+ \DN@{\backwardSectors@\doEllipseSectors@}%
+ \ifnum\count@>\preDirection@@ \advance\count@-8192 \relax
+ \else \count@@=\count@\advance\count@ 8192 \relax
+ \ifnum\count@@>\preDirection@@ \else\count@=\count@@ \fi\fi
+ \fi \edef\quadDirection@{\the\count@}%
+ \next@ }
+
+\xydef@\forwardSectors@{%
+ \ifnum \startDirection@@<\quadDirection@ \def\startSector@@{0}%
+ \else\count@=\preDirection@@ \advance\count@ 4096 \relax
+ \ifnum \startDirection@@<\count@ \def\startSector@@{1}%
+ \else\count@=\quadDirection@ \advance\count@ 4096 \relax
+ \ifnum\startDirection@@<\count@ \def\startSector@@{2}%
+ \else \def\startSector@@{3}\fi\fi\fi
+%
+ \ifnum\quadDirection@ <\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@ 4096 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@ 4096 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@ 8192 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@ 8192 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@ 12288 \relax
+ \ifnum\count@<\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@ 12288 \relax
+ \ifnum\count@<\endDirection@@ \def\endSector@@{7}%
+ \else \def\endSector@@{6}\fi
+ \else \def\endSector@@{5}\fi
+ \else \def\endSector@@{4}\fi
+ \else \def\endSector@@{3}\fi
+ \else \def\endSector@@{2}\fi
+ \else \def\endSector@@{1}\fi
+ \else \def\endSector@@{0}\fi }
+
+\xydef@\backwardSectors@{%
+ \ifnum \startDirection@@>\quadDirection@ \def\startSector@@{0}%
+ \else\count@=\preDirection@@ \advance\count@-4096 \relax
+ \ifnum \startDirection@@>\count@ \def\startSector@@{1}%
+ \else\count@=\quadDirection@ \advance\count@-4096 \relax
+ \ifnum\startDirection@@>\count@ \def\startSector@@{2}%
+ \else \def\startSector@@{3}\fi\fi\fi
+%
+ \ifnum\quadDirection@>\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@-4096 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@-4096 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@-8192 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@-8192 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\preDirection@@ \advance\count@-12288 \relax
+ \ifnum\count@>\endDirection@@ \relax
+ \count@=\quadDirection@ \advance\count@-12288 \relax
+ \ifnum\count@>\endDirection@@ \def\endSector@@{7}%
+ \else \def\endSector@@{6}\fi
+ \else \def\endSector@@{5}\fi
+ \else \def\endSector@@{4}\fi
+ \else \def\endSector@@{3}\fi
+ \else \def\endSector@@{2}\fi
+ \else \def\endSector@@{1}\fi
+ \else \def\endSector@@{0}\fi }
+
+\xydef@\doEllipseSectors@{%
+ \ifx\startSector@@\endSector@@
+ \DN@{\expandafter\doMergeBothArc@\expandafter{\arcSTYLE}{\endSector@@}}%
+ \else
+ \expandafter\doMergeStartArc@\expandafter{\arcSTYLE}{\startSector@@}%
+ \edef\countArcs@@{\startSector@@}%
+ \loop@ \count@=\countArcs@@ \relax \advance\count@\@ne
+ \ifnum \count@ < \endSector@@ \edef\countArcs@@{\the\count@}%
+ \bgroup\expandafter\doCircleArc@@\expandafter{\arcSTYLE}{\countArcs@@}%
+ \egroup
+ \repeat@
+ \DN@{\expandafter\doMergeEndArc@\expandafter{\arcSTYLE}{\endSector@@}}%
+ \fi \next@ }
+\DOCMODE)
+
+When the starting direction is along the line $\overline{pc}$ then a
+straight segment is typeset, ignoring any requested ending direction.
+
+\DOCMODE(
+\xydef@\checkstartDirection@{%
+ \bgroup\no@@ \edef\next@{\egroup\count@@=\the\Direction}\next@\relax
+ \ifnum\count@@=\startDirection@@ \relax \DN@{\straightArc@}%
+ \else \advance\count@@-\startDirection@@ \relax
+ \ifnum\count@@=\ifnum\count@@<\z@-\fi 4096 \relax \DN@{\straightArc@}%
+ \else \DN@{\processDirections@@}\fi\fi \next@ }
+
+\xydef@\straightArc@{\xywarning@{straight arc encountered}%
+ \xy@@{\let\bstartPLACE@=\relax
+ \expandafter\doStraightArc@@\expandafter{\arcSTYLE}}\endarc@ }%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\skewEllipse@{\xy@@{\doskewEllipse@}%
+ \def\afterARCextents@@{\xy@{aftARCext}{\let\doCircleArc@=\doMergeEndArc@@}%
+ \ellipseArc@ \xy@{doCircARCs}{\doCircleArcs@}\endarc@ }%
+ \let\arcScale@=\relax \def\arcRadius@{}\def\ellipseRatio@{}}
+
+\xydef@\skewCircle@{\xy@@{\setupDirection@}%
+ \ifnum\Direction=\startDirection@@\relax\DN@{\halfEllipse@{1}}%
+ \else
+ \xy@@{\def\startDirection@{\Direction=\startDirection@@\imposeDirection@}%
+ \cfromid@{0@p}\enter@\cplusthec@ \startDirection@
+ \enter@\relax\begingroup\vfromslide@i{}@\czeroEdge@\leave@\idfromc@{0@m}%
+ \let\endDirection@=\relax \let\doCircleArc@=\doMergeEndArc@@}%
+ \DN@{\circleArc@}%
+ \fi \next@ }
+
+\xydef@\doskewEllipse@{%
+ \def\startDirection@{\Direction=\startDirection@@ \relax
+ \imposeDirection@}\startDirection@ \cfromid@{0@p}%
+ \enter@\cplusthec@ \enter@\relax\begingroup\vfromslide@i{}@\leave@
+ \idfromc@{0@x}%
+ \ifx\endDirection@@\empty \parallelDirection@
+ \else
+ \def\endDirection@{\Direction=\endDirection@@ \relax
+ \imposeDirection@ }\endDirection@ \skewEllB@
+ \bgroup\setupDirection@\edef\next@{\egroup\count@@=\the\Direction}\next@
+ \edef\endDirection@@{\the\count@@}%
+ \fi
+ \cfromid@{0@p}\bgroup \setupDirection@
+ \edef\next@{\egroup \count@@=\the\Direction}\next@
+ \edef\startDirection@@{\the\count@@}}
+
+\xydef@\halfEllipse@#1{\xy@@{%
+ \cfromid@{0@p}\pfromc@\cfromid@{0@c}\no@@
+ \edef\endDirection@@{\the\Direction}%
+ \advance\X@c\X@p \divide\X@c\tw@ \advance\Y@c\Y@p \divide\Y@c\tw@
+ \idfromc@{0@0}\pfromc@ \cfromid@{0@p}\setbase@\X@p\Y@p\X@c\Y@c
+ \dimen@=\X@origin \advance\dimen@-\X@c \dimen@ii=\cosDirection\dimen@
+ \dimen@=\Y@origin \advance\dimen@-\Y@c \advance\dimen@ii \sinDirection\dimen@
+ \X@c=\X@origin \Y@c=\Y@origin \enter@\cplusthec@
+ \dimen@=#1\p@ \ifdim\dimen@<\z@ \DN@{^}\dimen@ii=-#1\dimen@ii
+ \ifx\next@\arcOrient@@\def\arcOrient@@{_}\else\def\arcOrient@@{^}\fi
+ \else \dimen@ii=#1\dimen@ii\fi
+ \startDirection@ \enter@\relax\begingroup\expandafter
+ \vfromslide@i\expandafter{\the\dimen@ii}@\leave@
+ \idfromc@{1@c}\setbase@@ \X@c \Y@c \adjustBaseOrient@
+ \count@@=\endDirection@@ \relax
+ \DN@{^}\advance\count@@\ifx\arcOrient@@\next@\else-\fi 4096 \relax
+ \edef\startDirection@@{\the\count@@}%
+ \def\startDirection@{\Direction=\startDirection@@ \imposeDirection@ }%
+ \let\doCircleArc@=\doMergeEndArc@@ }%
+ \let\arcScale@=\relax \ellipseArc@
+% \xy@@{\leave@ \doCircleArcs@}\endarc@ }
+ \xy@@{\doCircleArcs@}\endarc@ }
+
+\xydef@\parallelDirection@{\show\parallelDirection@}%
+
+\xydef@\parEllipse@#1#2{\DN@{#2}\ifx\next@\empty
+ \else\xywarning@{\omittingTokens@ }\fi \halfEllipse@{#1}}
+
+\xydef@\skewEllB@{\cfromid@{0@c}\pfromc@\enter@\cplusthec@
+ \enter@\relax\begingroup\vfromslide@i{}@\leave@
+ \enter@{\pfromthep@\basefromthebase@}\no@@
+ \bgroup \cfromid@{0@p}\pfromc@\cfromid@{0@x}\edef\next@{\egroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p }\next@
+ \Cintercept@@\leave@ \idfromc@{0@x}\cfromid@{0@p}\enter@\cplusthec@
+ \cfromid@{0@c}\leave@ \enter@\cplusthec@ \cfromid@{0@x}%
+ \X@c=-\X@c \Y@c=-\Y@c \leave@ \idfromc@{0@0}\pfromc@\cfromid@{0@p}%
+ \setbase@\X@p\Y@p\X@c\Y@c \cfromid@{0@c}\setbase@@\X@c\Y@c
+ \adjustBaseOrient@ }
+
+\xydef@\adjustBaseOrient@{%
+ \edef\tmp@{\expandafter\removePT@\the\X@xbase}\dimen@=\Y@ybase
+ \divide\dimen@ 64 \relax \dimen@ii=\tmp@\dimen@
+ \edef\tmp@{\expandafter\removePT@\the\X@ybase}\dimen@=\Y@xbase
+ \divide\dimen@ 64 \relax \dimen@=\tmp@\dimen@
+ \ifdim\dimen@>\dimen@ii \X@ybase=-\X@ybase \Y@ybase=-\Y@ybase \fi }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%\begin{code}
+%\end{code}
+%$$\docode$$
+
+%\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyarc.doc,v $
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 14:21:23 ross
+% Ross's version
+%
+% Revision 3.3.1.1 1996/12/18 08:50:58 ross
+% *** empty log message ***
+%
+% Revision 3.2 1995/09/19 18:20:20 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/Master/texmf-dist/source/generic/xypic/xyarrow.doc b/Master/texmf-dist/source/generic/xypic/xyarrow.doc
new file mode 100644
index 00000000000..203c877c451
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyarrow.doc
@@ -0,0 +1,1881 @@
+%% $Id: xyarrow.doc,v 3.5 1997/05/28 13:05:01 krisrose Exp $
+%%
+%% Xy-pic ``Arrows and Paths'' feature.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{arrow}{Arrow and Path feature}{\stripRCS$Revision: 3.5 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This feature provides \Xy-pic with the arrow paradigm presented
+ in~\cite{R92:HowTPDAT}.
+
+ \NOTE: |\PATH| command incompatibly changed for version 3.3 (the
+ |\ar| command is unaffected).
+
+ The basic concept introduced is the "path": a connection that
+ "starts" from $c$ (the current object), "ends" at a specified object,
+ and may be split into several "segments" between intermediate
+ specified objects that can be individually labelled, change style,
+ have breaks, etc.
+
+ \S??[path] is about the |\PATH| primitive, including the syntax of
+ paths, and \S??[arrow] is about the |\ar| customisation of paths to
+ draw arrows using \Xy-pic directional objects.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Paths}
+??=[path]
+
+\DOCMODE(
+\message{path,}
+\DOCMODE)
+
+ The fundamental commands of this feature are ??c![\PATH] and
+ ??c![\afterPATH] that will parse the <path> according to the grammar
+ in figure~??[f.path] with notes below.
+
+\begin{figure*}[tb]
+\begin{syntax}
+%
+ \multispan{3}{{\tt\string\PATH} <path>\hfil}
+ & interpret <path>
+\cr
+%
+ \multispan{3}{{\tt\string\afterPATH\string{<decor>\string}} <path>\hfil}
+ & interpret <path> and then run <decor>
+\cr
+\noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+%
+ <path>
+ &\iss & ??c![~] <action> |{| <stuff> |}| <path>
+ & set ??!^[<action>] to <stuff>
+\cr
+ &\orr & ??c![~] <which> |{| <labels> |}| <path>
+ & add ??!^[<labels> prefix for some segments]
+\cr
+ &\orr & ??c![~] |{| <stuff> |}| <path>
+ & set ??!^[failure continuation] to <stuff>
+\cr
+ &\orr & ??c!['] <segment> <path>
+ & make ??!^[straight segment]
+\cr
+ &\orr & ??c![`] <turn> <segment> <path>
+ & make ??!^[turning segment]
+\cr
+ &\orr & <segment>
+ & make ??!^[last segment]
+\cr
+\noalign{\smallskip}
+%
+ <turn>
+ &\iss & <diag> <turnradius>
+ & ??!^[1/4 turn] starting in <diag>
+\cr
+ &\orr & <cir> <turnradius>
+ & ??!^[explicit turn]
+\cr
+%
+ <turnradius>
+ &\iss & <empty>
+ & use default turn radius
+\cr
+ &\orr & ??c![/] <dimen>
+ & set "turnradius" to <dimen>
+\cr
+\noalign{\smallskip}
+%
+ <segment>
+ &\iss & <path-pos> <slide> <labels>
+ & ??!^[segment] with <slide> and <labels>
+\cr
+\noalign{\smallskip}
+%
+ <slide>
+ &\iss & <empty> \orr\ ??c![<] <dimen> ??c![>]
+ & optional ??!^[slide]: <dimen> in the ``above'' direction
+\cr
+\noalign{\smallskip}
+%
+ <labels>
+ &\iss & ??c![^] <anchor> <it> <alias> <labels>
+ & ??!^[label with <it>] "above" <anchor>
+\cr
+ &\orr & ??c![_] <anchor> <it> <alias> <labels>
+ & ??!^[label with <it>] "below" <anchor>
+\cr
+ &\orr & ??c![|] <anchor> <it> <alias> <labels>
+ & ??!^[break with <it>] at <anchor>
+\cr
+ &\orr & <empty>
+ & no more labels
+\cr
+\noalign{\smallskip}
+%
+ <anchor>
+ &\iss & ??c![-] <anchor> \orr\ <place>
+ & label/break placed relative to the <place> where ??c![-] is a synonym
+ for ??c![<>(.5)]
+\cr
+\noalign{\smallskip}
+%
+ <it>
+ &\iss & <digit>\orr<letter>\orr|{|<text>|}|\orr<cs>
+ & <it> is a ??!^[default label]
+\cr
+ &\orr & ??c![*] <object>
+ & <it> is an <object>
+\cr
+ &\orr & ??c![@] <dir>
+ & <it> is a <dir>ectional
+\cr
+ &\orr & |[| <shape> |]| <it>
+ & use |[|<shape>|]| for <it>
+\cr
+\noalign{\smallskip}
+%
+ <alias>
+ &\iss & <empty> \orr\ ??c![=]|"|<id>|"|
+ & optional ??!^[name for label object]
+\cr
+\end{syntax}
+\caption{\protect<path>s}
+??=[f.path]
+\end{figure*}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Parsing:}
+
+ |\afterPATH| sets up |\afterPATH@| and initialise all the actions
+ (see note~??[<action>] below) before invoking the actual <path>
+ parser. |\PATH| is just a dummy interface.
+
+\DOCMODE(
+\xydef@\PATH{\afterPATH{}}
+
+\xylet@\afterPATH@=\empty
+
+\xydef@\afterPATH#1{\save
+ \DN@##1{\def\afterPATH@{\restore \def\afterPATH@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterPATH@}%
+ \let\PATHfail@@=\empty
+ \let\PATHbefore@@=\empty
+ \let\PATHafter@@=\empty
+ \let\PATHlabelsevery@@=\empty
+ \let\PATHlabelsnext@@=\empty
+ \let\PATHlabelslast@@=\empty
+ \xy@{\afterPATH{#1}}{\def\PATHslide@@{\z@}}%
+ \def\PATHcontinue@@{\xyFN@\PATH@}%
+ \xyFN@\PATH@}
+\DOCMODE)
+
+ |\PATH@| is the parser for <path>: it eats the <path> until it fails
+ and then calls the `failure continuation' which will eventually
+ become |\empty| which ends the parsing. \HACK: The
+ `|\ifPATHsingle@|' switch switches the <segment> parsing "off"; this
+ is used by the graph feature to parse stand-alone <slide> <labels>
+ sequences.
+
+\DOCMODE(
+\xynew@{if}\ifPATHsingle@
+
+\xydef@\PATH@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATH@}%
+ \else\ifPATHsingle@ \let\next@=\PATH@single
+ \else \let\next@=\PATH@normal \fi\fi \next@}
+
+\xydef@\PATH@normal{%
+ \ifx ~\next \DN@ ~{\xyFN@\PATHsetting@}%
+ \else \addRQ@\ifx \next \addRQ@\DN@{\xy@'{}\xyFN@\PATHstraight@}%
+ \else \addLQ@\ifx \next \addLQ@\DN@{\xy@`{}\xyFN@\PATHturn@}%
+ \else\ifx \PATHfail@@\PATH@x \DN@{\xyFN@\PATHfinal@}%
+ \else
+ \DNii@{\let\PATHfail@@=\PATH@x \xyFN@\PATH@}%
+ \DN@{\expandafter\nextii@\PATHfail@@}%
+ \fi\fi\fi\fi \next@}
+\DOCMODE)
+
+ |\PATHsetting@| just reads an <action> or <which> determining which
+ action stuff to set and then does it---we treat the failure
+ continuation as an action here even though it is not, strictly
+ speaking. The four actions are explained in the appropriate notes
+ below.
+
+\DOCMODE(
+\xylet@\PATHfail@@=\empty
+
+\xylet@\PATHbefore@@=\empty
+\xylet@\PATHafter@@=\empty
+
+\xylet@\PATHlabelsevery@@=\empty
+\xylet@\PATHlabelsnext@@=\empty
+\xylet@\PATHlabelslast@@=\empty
+
+\xydef@\PATHsetting@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHsetting@}%
+ \else\ifx \bgroup\next
+ \DN@##1{\xy@{~{##1}}{}\def\PATHfail@@{##1}\xyFN@\PATH@}%
+ \else \addEQ@\ifx \next
+ \addEQ@\DN@##1{\xy@{~={##1}}{}\def\PATHbefore@@{##1}\xyFN@\PATH@}%
+ \else \addLT@\ifx \next
+ \addLT@\DN@##1{\xy@{~<{##1}}{}\def\PATHlabelsnext@@{##1}\xyFN@\PATH@}%
+ \else \addGT@\ifx \next
+ \addGT@\DN@##1{\xy@{~>{##1}}{}\def\PATHlabelslast@@{##1}\xyFN@\PATH@}%
+ \else \addPLUS@\ifx \next
+ \addPLUS@\DN@##1{\xy@{~+{##1}}{}\def\PATHlabelsevery@@{##1}\xyFN@\PATH@}%
+ \else \ifx /\next
+ \DN@/##1{\xy@{~/{##1}}{}\def\PATHafter@@{##1}\xyFN@\PATH@}%
+ \else \addDASH@\ifx \next
+ \xywarning@{Obsolete `-' PATH <action> translated to `='.}%
+ \addDASH@\DN@##1{\xy@{~-{##1}}{}\def\PATHbefore@@{##1}\xyFN@\PATH@}%
+ \else
+ \xyerror@{Unknown \string~ setting: \meaning\next}%
+ {See the Xy-pic arrow feature documentation for help.}%
+ \fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\DOCMODE)
+
+ Next the setup for straight segments including the last: they set
+ |\PATHinit@@| to initialise, \ie, slide, |\PATHextra@@| to do what is
+ needed after the ??c![=] action, and finally |\PATHpost@@| is set to
+ any operations to be done after the entire segment is typeset but
+ before the next is read. |\PATHcontinue@@| is used internally to
+ distinguish the ordinary segments from the last.
+
+\DOCMODE(
+\xylet@\PATHinit@@=\empty
+
+\xylet@\PATHextra@@=\empty
+\xylet@\PATHpost@@=\empty
+\xylet@\PATHcontinue@@=\empty
+
+\xydef@\PATHstraight@{%
+ \def\PATHinit@@{\PATHinitstraight@}%
+ \let\PATHextra@@=\empty
+ \let\PATHpost@@=\empty
+ \let\PATHlabelsextra@@=\relax
+ \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}
+
+\xydef@\PATHfinal@{%
+ \def\PATHinit@@{\PATHinitstraight@}%
+ \def\PATHextra@@{\let\PATHcontinue@@=\afterPATH@}%
+ \let\PATHpost@@=\empty
+ \let\PATHlabelsextra@@=\PATHlabelsextralast@
+ \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}
+
+\xydef@\PATHlabelsextralast@{\let\PATHlabelsextra@@=\relax
+ \expandafter\xyFN@\expandafter\PATHlabels@\PATHlabelslast@@}
+
+\xydef@\PATHinitstraight@{\xy@@{\setupDirection@ \dimen@=\PATHslide@@
+ \dimen@ii=-\sinDirection\dimen@
+ \ifPATHomitslide@@\else\advance\X@p\dimen@ii\fi \advance\X@c\dimen@ii
+ \dimen@ii= \cosDirection\dimen@
+ \ifPATHomitslide@@\else\advance\Y@p\dimen@ii\fi \advance\Y@c\dimen@ii
+ \PATHomitslide@@false \resetupDirection@}}
+\DOCMODE)
+
+ Setup for turning segments is in note~??[turning segment].
+
+ A <segment> is interpreted as follows after $p$ has been set to the
+ previous end object, $c$ to the <pos> given at the start of the
+ segment, and |\PATHslide@@| to the slide:
+
+\DOCMODE(
+\xydef@\PATHslide@@{\z@}
+\xynew@{if}\ifPATHomitslide@@
+
+\xydef@\PATHsegment@{%
+ \addLT@\ifx\next
+ \addGT@{\addLT@\DN@##1}{%
+ \xy@{<##1>}{\dimen@=##1\relax \edef\PATHslide@@{\the\dimen@}}%
+ \xyFN@\PATHsegment@@}%
+ \else \let\next@=\PATHsegment@@
+ \fi \next@}
+\DOCMODE)
+
+\begin{enumerate}
+\item
+ Expand |\PATHinit@@| (for straight segments this just sets up the
+ direction and applies the <slide>).
+\item
+ Expand |\PATHaction={|<stuff>|}| as set using |~={|<stuff>|}|.
+\item
+ Sets |\PATHcontinue@@| to any continuation set with |~{|<stuff>|}|).
+\item
+ Construct list of <labels> specified by the user through |~|<which>
+ setup. Those applicable to the present segment are inserted before
+ the user's <labels> in the sequence |<>=|.
+\item
+ Store $p,c$ as "start","end" of segment.
+\item
+ Interpret <labels> (see below), including the ones added by the
+ |~|<when>\dots\ <setup>.
+\end{enumerate}
+%
+ |\PATHsegment@@| performs this except the last two points:
+
+\DOCMODE(
+\xydef@\PATHsegment@@{\PATHinit@@ \addEQ@\PATHaction@\PATHbefore@@ \PATHextra@@
+ \expandafter\toks@\expandafter{\PATHlabelsnext@@}\let\PATHlabelsnext@@=\empty
+ \expandafter\addtotoks@\expandafter{\PATHlabelsevery@@}%
+ \expandafter\def\expandafter\PATHlabels@@\expandafter{\the\toks@}%
+ \toks@={}\expandafter\xyFN@\expandafter\PATHlabels@\PATHlabels@@}
+\DOCMODE)
+
+ |\PATHlabels@| parses all <labels> of a <segment>. This sets
+ |\PATHlabelit@@| to the operation building the label in question.
+ Then some parsing stores the tokens ??c![<>(.5)] for each ??c![-] in
+ the <anchor> and finally passes control to the kernel <place> parser
+ with these tokens as the head. This then in turn calls |\PATHit@|
+ that parses <it> and applies the chosen operation. After the last we
+ continue with the accumulated subsegment actions.
+
+\DOCMODE(
+\xylet@\PATHlabelit@@=\empty
+
+\xydef@\PATHlabels@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHlabels@}%
+ \else \ifx ^\next
+ \DN@##1{\xy@^{}\let\PATHlabelit@@=\PATHlabelabove@@
+ \DNii@{}\xyFN@\PATHanchor@}%
+ \else \ifx _\next
+ \DN@##1{\xy@_{}\let\PATHlabelit@@=\PATHlabelbelow@@
+ \DNii@{}\xyFN@\PATHanchor@}%
+ \else \ifx |\next
+ \DN@##1{\xy@|{}\let\PATHlabelit@@=\PATHlabelbreak@
+ \DNii@{}\xyFN@\PATHanchor@}%
+ \else \let\next@=\PATHfinishsegments@ \fi\fi\fi\fi \next@}
+
+\xydef@\PATHanchor@{\begingroup \toks@={}\PATHanchor@i}
+
+\xydef@\PATHanchor@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHanchor@i}%
+ \else\addDASH@\ifx \next
+ \addDASH@\DN@{\expandafter\addtotoks@\expandafter{\PATHanchor@toks}%
+ \xyFN@\PATHanchor@i}%
+ \else
+ \DNii@##1{\endgroup\afterPLACE{\xyFN@\PATHit@}##1}%
+ \DN@{\expandafter\nextii@\expandafter{\the\toks@}}%
+ \fi\fi \next@}
+
+{\xyuncatcodes \gdef\next{<>(.5)}}
+\xylet@\PATHanchor@toks=\next
+
+\xylet@\PATHitshapes@@=\empty
+
+\xydef@\PATHit@{\let\PATHitshape@@=\empty \xyFN@\PATHit@i}
+
+\xydef@\PATHit@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHit@i}%
+ \else \ifx *\next \DN@*##1##{\PATHlabelit@@{!C##1}}%
+ \else \addAT@\ifx\next \addAT@\DN@##1##{\PATHlabelit@@{\dir##1}}%
+ \else \ifx [\next \DN@[##1]{%
+ \expandafter\def\expandafter\PATHitshape@@\expandafter{\PATHitshape@@[##1]}%
+ \xyFN@\PATHit@i}%
+ \else \DN@{\PATHlabelit@@{}}%
+ \fi\fi\fi\fi \next@}
+\DOCMODE)
+
+ The individual operations bound to |\PATHlabelit@@| are discussed as
+ appropriate in the notes.
+
+ After the last break and label we typeset the last piece of the
+ connection.
+
+\DOCMODE(
+\xydef@\PATHfinishsegments@{%
+ \ifx\PATHlabelsextra@@\relax \expandafter\PATHfinishsegments@i
+ \else
+ \expandafter\PATHlabelsextra@@ \fi}
+
+\xydef@\PATHfinishsegments@i{%
+ \xy@@{\Clast@@}\the\toks@ \toks@={}%
+ \xy@@\setupDirection@
+ \PATHpost@@ \PATHaction@/\PATHafter@@
+ \PATHcontinue@@}
+\DOCMODE)
+
+ \BUG: The order of the breaks determines the order of the
+ subsegments. This is maybe a feature.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+
+\note??=[<action>]
+%
+ An <action> can be either of the characters |=/|. The associated
+ <stuff> is saved and used to call
+$$
+ ??c![\PATHaction]<action>|{|<stuff>|}|
+$$
+ "before" and "after" each segment (including all <labels>) for
+ ??c![=] and ??c![/], respectively.
+
+ The default ??c![\PATHaction] macro just expands to ``??c![\POS]
+ <stuff> |\relax|'' thus <stuff> should be of the form <pos> <decor>.
+ The user can redefine this---in fact the ??c![\ar] command described
+ in \S??[arrow] below is little more than a special ??c![\PATHaction]
+ command and a clever defaulting mechanism.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Here is the default ??c![\PATHaction]:
+
+\DOCMODE(
+\xydef@\PATHaction@default#1#2{\xy@{PATHaction#1{#2}}{}\POS#2\relax}
+\xylet@\PATHaction=\PATHaction@default
+\DOCMODE)
+
+ It is called using |\PATHaction@| to expand the action control
+ sequences back to their <stuff> first:
+
+\DOCMODE(
+\xydef@\PATHaction@#1#2{\expandafter\PATHaction\expandafter#1\expandafter{#2}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[<labels> prefix for some segments]
+%
+ It is possible to include a number of default <labels> "before" the
+ <labels> of the actual <segment> are interpreted, using
+ |~|<which>|{|<labels>|}|. The specified <which> determines for which
+ segments the indicated <labels> should be prefixed as follows:
+$$
+\begin{tabular}{\otherbar c\otherbar l\otherbar}
+\hline
+ <which> & applied to\dots \\
+\hline
+ ??c![<] & next segment only \\
+ ??c![>] & last segment only \\
+ ??c![=] & every segment \\
+\hline
+\end{tabular}
+$$
+ (when several apply to the same segment they are inserted in the
+ sequence |<>+|).
+
+ This is useful to draw connections with a `center marker' in
+ particular with arrows, \eg, the `mapsto' example explained below can
+ be changed into a `breakto' example: typing
+%
+\begin{code}
+\xy*+{0}\PATH
+ ~={**\dir{-}}
+ ~>{|>*\dir{>}}
+ ~+{|*\dir{/}}
+ '(10,1)*+{1} '(20,-2)*+{2} (30,0)*+{3}
+\endxy
+\end{code}
+\displaycode
+\noindent\unskip
+%
+ will typeset
+$$
+ \docode
+$$
+ Note, however, that what goes into |~+{|\dots|}| is <labels> and thus
+ not a <pos> -- it is not an action in the sense explained above.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[failure continuation]
+%
+ Specifying |~{|<stuff>|}| will set the ``failure continuation'' to
+ <stuff>. This will be inserted when the last <segment> is
+ expected---it can even replace it or add more <segment>s, \ie,
+%
+\begin{code}
+\xy *+{0} \PATH ~={**\dir{-}}
+ ~{'(20,-2)*+{2} (30,0)*+{3}} '(10,1)*+{1}
+\endxy
+\end{code}
+\displaycode
+%
+ is equivalent to
+%
+\begin{code}
+\xy *+{0} \PATH ~={**\dir{-}}
+ '(10,1)*+{1} '(20,-2)*+{2} (30,0)*+{3}
+\endxy
+\end{code}
+\displaycode
+%
+ typesetting
+$$
+ \docode
+$$
+ because when |\endxy| is seen then the parser knows that the next
+ symbol is neither of the characters |~'`| and hence that the last
+ <segment> is to be expected. Instead, however, the failure
+ continuation is inserted and parsed, and the <path> is finished by
+ the inserted material.
+
+ Failure continuations can be nested:
+%
+\begin{code}
+\xy *+{0} \PATH ~={**\dir{-}}
+ ~{~{(30,0)*+{3}}
+ '(20,-2)*+{2}} '(10,1)*+{1}
+\endxy
+\end{code}
+\displaycode
+%
+ will also typeset the connected digits.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[straight segment]
+%
+ A ``straight segment'' is interpreted as follows:
+%
+\begin{enumerate}
+\item
+ First $p$ is set to the end object of the previous segment (for the
+ first segment this is $c$ just before the path command) and $c$ is
+ set to the <pos> starting the <segment>, and the current <slide> is
+ applied.
+\item
+ Then the |=| and |<| "segment actions" are expanded (in that
+ sequence) and the |<| action is cleared. The resulting $p$ and $c$
+ become the "start" and "end" object of the segment.
+\item
+ Then all <labels> (starting with the ones defined as described in
+ note~??[<labels> prefix for some segments] below).
+\end{enumerate}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ The code expanding the actions is part of the parsing above.
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[segment]
+%
+ A "segment" is a part of a <path> between a previous and a new
+ "target" given as a <path-pos>: normally this is just a <pos> as
+ described in~\S??g[xy.doc:pos] but it can be changed to something
+ else by changing the control sequence ??c![\PATHafterPOS] to be
+ something other than ??c![\afterPOS].
+
+\DOCMODE(
+\xylet@\PATHafterPOS@default=\afterPOS
+\xylet@\PATHafterPOS=\PATHafterPOS@default
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[turning segment]??=[1/4 turn]??=[explicit turn]
+%
+ A "turning" segment is one that does not go all the way to the given
+ <pos> but only as far as required to make a turn towards it. The $c$
+ is set to the actual turn object after a turning segment such that
+ subsequent turning or other segments will start from there, in
+ particular the last segment (which is always straight) can be used to
+ finish a winding line.
+
+ What the turn looks like is determined by the <turn> form:
+%
+\begin{description}
+
+\item[<empty>]
+ Nothing between the ??c![`] and the <pos> is interpreted the same as
+ giving just the <diag> last used "out" of a turn.
+
+\item[<diag>]
+ Specifying a single <diag> $d$ is the same as specifying either of
+ the <cir>cles $d$??c![^] or $d$??c![_], depending on whether the specified
+ <pos> has its center `above' or `below' the line from $p$ in the
+ <diag>onal direction.
+
+\item[<cir>]
+ When a full explicit <cir>cle is available then the corresponding
+ <cir>cle object is placed such that its ingoing direction is a
+ continuation of a straight connection from $p$ and the outgoing
+ direction points such that a following straight (or last) segment
+ will connect it to $c$ (with the same slide).
+
+\end{description}
+%
+ Here is an example using all forms of <turn>s:
+%
+\begin{code}
+\xy <4pc,0pc>:(0,0)
+ *+\txt{base}="base"
+ \PATH ~={**\dir{-}?>*\dir{>}}
+ `l (-1,-1)*{A} ^a
+ ` (1,-1)*{B} ^b
+ `_ul (1, 0)*{C} ^c
+ `ul^l "base" ^d
+ "base" ^e
+\endxy
+\end{code}
+$$
+\docode
+$$
+ was typeset by
+%
+\displaycode
+
+ \BUG: Turns are only really resonable for paths that use straight
+ lines like the one above.
+
+ \NOTE: Always write a valid <pos> after a <turn>, otherwise any
+ following ??c![^] or ??c![_] labels can confuse the parser. So if
+ you intend the |^r| in |`^r| to be a label then write |`,^r|, using a
+ dummy ??c![,] <pos>ition.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ We need to keep track of the current "in" and "out" <diag>
+ directions as well as the current radius.
+
+\DOCMODE(
+\xydef@\PATHlastout@@{3}
+\DOCMODE)
+
+ The startup routine is just a selection of the two kinds of <turn>:
+
+\DOCMODE(
+\xydef@\PATHturn@{\afterCIRorDIAG\PATHturn@cir\PATHturn@diag}
+\DOCMODE)
+
+ In both cases the trick is to set up a |\PATHinit@@| method that
+ typesets the right circle segment at the right location. The
+ simplest one is when there is a full <cir> available because that
+ should just be used directly. The only complication is that we
+ forbid $180^\circ$ turns:
+
+\DOCMODE(
+\xydef@\PATHturn@cir{\toks@={\xy@@{%
+ \count@=\CIRin@@ \ifnum\count@<4\else\advance\count@-4\fi
+ \count@@=\CIRout@@ \ifnum\count@@<4\else\advance\count@@-4\fi
+ \ifnum\count@=\count@@ \xyerror@{<turn> cannot be half or full}{%
+You asked for a <turn>ed segment with parallel in- and out-direction.^^J%
+This is not allowed because it is not possible to position it uniquely.}\fi}}%
+ \edef\next@{{\CIRin@@}{\expandafter\noexpand\CIRorient@@}{\CIRout@@}}%
+ \expandafter\PATHturn@i\next@}
+\DOCMODE)
+
+ "Procedure for <diag> turns": Builds initial part of |\PATHinit@@|
+ that computes the missing "orient" and "out" from "in" and the $c$
+ passed through the segment. This initial segment should set
+ "orient" as follows:
+$$
+ \xy <9mm,0mm>: <0mm,4mm>::
+ ,(1,1) *+\dir{*}!D *!LU{p}
+ ,(0,0);(4,4)**\dir{-}
+ ?< *!/+\jot/\composite{{.}*!/+\jot/{.}*!/+2\jot/{.}}
+ ?> *!/-\jot/\composite{{.}*!/-\jot/{.}*!/-2\jot/{.}}
+ ?(.6)*!/1ex/\dir{>} *^!/-1ex/{|^|} *_!/-1ex/{|_|}
+ \endxy
+$$
+ \ie, as the sign of the inner product $\vec{pc} \cdot \hat{"in"}$,
+ and set "out" as for the <cir>cle "in" "orient".
+
+\DOCMODE(
+\xydef@\PATHturn@diag{\toks@={\xy@@{%
+ \setupDirection@ \count@=\CIRin@@ \dimen@=\xydashl@ \ABfromdiag@
+ \ifdim \sinDirection\A@>\cosDirection\B@ \def\CIRorient@@{\CIRacw@}%
+ \advance\count@\ifnum\count@<6 \tw@ \else -6\fi
+ \else \def\CIRorient@@{\CIRcw@}%
+ \advance\count@\ifnum\count@>\@ne -\tw@ \else 6\fi
+ \fi
+ \edef\CIRout@@{\the\count@}}}%
+ \edef\next@{{\CIRin@@}{}{}}%
+ \expandafter\PATHturn@i\next@}
+\DOCMODE)
+
+ |\PATHturn@i| is where |\PATHinit@@| is defined to do the following:
+%
+\begin{itemize}
+
+\item[{??_[turni1]}]
+ Setup the default "in", "orient", and "out" as defined by the call
+ from the above macros. Set "radius" parameter to the current
+ "turnradius" value. The commands in |\toks@| are run to do any
+ last-minute fixing of the defaults.
+
+\item[{??_[turni2]}]
+ The segment will leave $p$ in direction "in" and pretend to be
+ meeting $c$ in direction "out". Thus the center of the <cir>cle
+ object to be used for the actual <turn> object is located at the
+ intersection of the line through $p+"radius"\hat{v}_"in"$ in
+ direction $\vec{v}_"in"$ and the line through
+ $c+"radius"\hat{v}_"out"$ in direction $\vec{v}_"out"$. Here we
+ compute $p+R\hat{v}_"in"$ using $R="radius"$ if this is the initial
+ turn and $R="radius"\pm"slide"$ if it is a continuation turn.
+
+\item[{??_[turni2b]}]
+ Save $p$ and "base" for later.
+
+\item[{??_[turni3]}]
+ Compute $c+"radius"\hat{v}_"out"$ and use the kernel |\intersect@|
+ primitive to compute the turn circle segment center.
+
+\item[{??_[turni3b]}]
+ However, if the intersection point lies on the `wrong side' of $p$,
+ \ie, if $\vec{pc} \cdot "in"$ is negative, then we should not use the
+ intersection point but the point as close to $p$ as possible because
+ the connection from $p$ to the turn should at least have zero
+ length---in fact we set it to have 8sp length to make sure that a
+ sugsegment is typeset!
+
+\item[{??_[turni4]}]
+ Modify "radius" to use for the actual circle segment by the "slide":
+ either positively (for "orient" ??c![_]) or negatively (for "orient"
+ ??c![^]), and drop the circle segment (bypassing |\cir| to use the
+ internal settings from above).
+
+\item[{??_[turni5]}]
+ Store in |\PATHpostpos@@| the true end of the circle segment and code
+ to prevent the application of the "slide" for the start of the next
+ <segment>.
+
+\item[{??_[turni6]}]
+ Move $c$ to true beginning of the circle segment.
+
+\item[{??_[turni7]}]
+ Restore saved $p$ and "base", and slide $p$ finally.
+
+\end{itemize}
+
+\DOCMODE(
+\xylet@\PATHpostpos@@=\empty
+
+\xydef@\PATHturn@i#1#2#3{%
+ \DN@##1{\def\PATHinit@@{\xy@@{%
+ \def\CIRin@@{#1}\def\CIRorient@@{#2}\def\CIRout@@{#3}%?*[turni1]
+ \ifnum\CIRin@@=8 \let\CIRin@@=\PATHlastout@@ \fi
+ \R@=\turnradius@
+ ##1\relax}%
+ \xy@@{\count@=\CIRin@@ %?*[turni2]
+ \ifPATHomitslide@@ \dimen@=-\PATHslide@@
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@ \fi
+ \enter@{\pfromthep@ \basefromthebase@}}%?*[turni2b]
+ \xy@@{\dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@
+ \X@origin=\X@p \Y@origin=\Y@p}%?*[turni3]
+ \xy@@{\dimen@=\xydashl@ \ABfromdiag@ \R@c=\A@ \U@c=\B@
+ \count@=\CIRout@@
+ \dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@
+ \ABfromdiag@ \advance\X@c-\B@ \advance\Y@c\A@
+ \dimen@=\xydashl@ \X@p=\X@c \Y@p=\Y@c
+ \ABfromdiag@ \advance\X@p-\A@ \advance\Y@p-\B@
+ \intersect@
+ \count@=\CIRin@@ \dimen@=\p@ \ABfromdiag@}%?*[turni3b]
+ \xy@@{\edef\next@{\expandafter\removePT@\the\A@}%
+ \edef\nextii@{\expandafter\removePT@\the\B@}%
+ \A@=\X@c \advance\A@-\X@origin \B@=\Y@c \advance\B@-\Y@origin
+ \ifdim \next@\A@<-\nextii@\B@
+ \dontleave@ \cfromp@
+ \count@=\CIRin@@ \advance\count@\ifnum\count@<4 +4\else -4\fi
+ \dimen@=\xydashl@ \Directionfromdiag@
+ \the\Edge@c\z@
+ \count@=\CIRin@@ \dimen@=\expandafter\ifx\CIRorient@@\CIRcw@-\fi\R@
+ \ABfromdiag@ \advance\X@c-\B@ \advance\Y@c\A@
+ \dimen@=5sp \ABfromdiag@ \advance\X@c\A@ \advance\Y@c\B@
+ \fi
+ \dimen@ii=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\PATHslide@@ %?*[turni4]
+ \advance\R@\dimen@ii
+ \drop@\literal@{\hbox\bgroup\cir@i}}%
+ \xy@@{\X@p=\X@c \Y@p=\Y@c %?*[turni5]
+ \count@=\CIRout@@
+ \dimen@=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\R@c
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@
+ \edef\PATHpostpos@@{\X@c=\the\X@p \Y@c=\the\Y@p \noexpand\czeroEdge@
+ \noexpand\PATHomitslide@@true}}%
+ \xy@@{\count@=\CIRin@@ %?*[turni6]
+ \dimen@=\expandafter\ifx\CIRorient@@\CIRacw@-\fi\R@c
+ \ABfromdiag@ \advance\X@c-\B@ \advance\Y@c\A@ \czeroEdge@}%
+ \xy@@{\leave@ %?*[turni7]
+ \count@=\CIRin@@ \dimen@=\PATHslide@@
+ \ABfromdiag@ \advance\X@p-\B@ \advance\Y@p\A@
+ \edef\PATHlastout@@{\CIRout@@}%
+ \count@=\CIRout@@ \dimen@=\xydashl@ \Directionfromdiag@}}}%
+ \expandafter\next@\expandafter{\the\toks@}\toks@={}%
+ \let\PATHextra@@=\empty
+ \def\PATHpost@@{\xy@@\PATHpostpos@@}%
+ \let\PATHlabelsextra@@=\relax
+ \xyFN@\PATHturn@ii}
+\DOCMODE)
+
+ The final macro takes care of the v2.6 format for changing
+ "turnradius": using ??c![/]<dimen> right after the <turn>.
+
+\DOCMODE(
+\xydef@\PATHturn@ii{%
+ \ifx /\next
+ \DN@ /{\afterassignment\nextii@\dimen@=}%
+ \DNii@{%
+ \edef\next@{\noexpand\xy@@{\edef\noexpand\turnradius@{\the\dimen@}}}\next@
+ \xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}%
+ \else \DN@{\xy@@\pfromc@ \PATHafterPOS{\xyFN@\PATHsegment@}}\fi
+ \next@}
+\DOCMODE)
+
+ This just stores a <diag> vector of the specified lenght in
+ $|<|A|,|B|>|$ thus acting as an optimised version of
+ |\Directionfromdiag@|:
+
+\DOCMODE(
+\xydef@\ABfromdiag@{\ifcase\count@\relax
+ \A@=-.7071\dimen@ \B@=-.7071\dimen@ \or \A@=\z@ \B@=-\dimen@
+ \or \A@=+.7071\dimen@ \B@=-.7071\dimen@ \or \A@=\dimen@ \B@=\z@
+ \or \A@=+.7071\dimen@ \B@=+.7071\dimen@ \or \A@=\z@ \B@=+\dimen@
+ \or \A@=-.7071\dimen@ \B@=+.7071\dimen@ \or \A@=-\dimen@ \B@=\z@
+ \else\xybug@{impossible <diag>?}\fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The default used for "turnradius" can be set by the operation
+%
+\begin{defs1}
+ ??c![\turnradius] <add op> |{|<dimen>|}|\cr
+\end{defs1}
+\noindent\unskip
+%
+ that works like the kernel ??c![\objectmargin] etc. commands; it defaults
+ to 10pt.
+
+\DOCMODE(
+\xydef@\turnradius@{10pt}
+
+\xydef@\turnradius{\afterADDOP{\Addop@@\turnradius@}}
+\DOCMODE)
+
+\begin{exercise}
+ Typeset
+\begin{code}
+\xy *+{A}*\cir<10pt>{}="me"
+ \PATH `ul^ur,"me" "me" |>*:(1,-.25)\dir{>}
+\endxy
+\end{code}
+$$\docode$$
+%
+ using <turn>s.
+%
+\answertext{Here is what the author did:??c[\cir]}
+\answercode
+\answertext\displaycode
+\answertext{The trick is getting the arrow head right: the |:| modifier to
+ the explicit {\tt\string\dir} <object> does that.}
+\end{exercise}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[last segment]
+%
+ The last segment is exactly as a straight one except that the ??c![>]
+ action (if any) is executed (and cleared) just after the ??c![<]
+ action.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ (The code implementing this is merged with the parsing.)
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[slide]
+%
+ ``Sliding'' a segment means moving each of the $p,c$ objects in the
+ direction perpendicular to the current direction at each.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ (The code implementing this is merged with the parsing, using the
+ |\PATHslide@@| control sequence to hold the current slide.)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[label with <it>]
+%
+ Labelling means that <it> is dropped relative to the current segment
+ using a ??c![?] <pos>ition. This thus depends on the user setting up
+ a connection with a ??c![**] <pos> as one of the actions---typically
+ the~??c![=] action is used for this (see note~??[straight segment]
+ for the details). The only difference between ??c![^] and ??c![_] is
+ that they shift the label in the ??c![^] respectively ??c![_]
+ direction; for straight segments it is placed in the ``superscript''
+ or ``subscript'' position.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The operations used by |\PATHlabels@| to put labels above and below
+ (with ??c![^] and ??c![_]) are trivial, taking two arguments and
+ placing the label immediately; for convenience the |\drop| head are
+ named separately such that they may be redefined:
+
+\DOCMODE(
+\xydef@\PATHlabelabove@#1#2{\droplabel@\belowDirection@{#1}{#2}%
+ \let\afteraliases@@=\empty \xyFN@\PATHlabelalias@}
+
+\xydef@\PATHlabelbelow@#1#2{\droplabel@\aboveDirection@{#1}{#2}%
+ \let\afteraliases@@=\empty \xyFN@\PATHlabelalias@}
+
+\xylet@\PATHlabelabove@@=\PATHlabelabove@
+\xylet@\PATHlabelbelow@@=\PATHlabelbelow@
+
+\xydef@\droplabel@#1#2#3{\xy@@{\enter@\DirectionfromtheDirection@}%
+ \DN@{#2}\ifx\next@\empty
+ \expandafter\xy@@ix@\expandafter{\PATHitshape@@\labelbox{#3}}%
+ \else \expandafter\xy@@ix@\expandafter{\PATHitshape@@#2{#3}}\fi
+ \xy@@{\setbox\z@=\expandafter\object\the\toks9 %
+ \advance\L@c\labelmargin@ \advance\R@c\labelmargin@
+ \advance\D@c\labelmargin@ \advance\U@c\labelmargin@
+ \setboxz@h{\kern\labelmargin@\boxz@\kern\labelmargin@}%
+ \A@=\X@c \B@=\Y@c #1\xydashl@ \the\Edge@c\thr@@
+ \advance\A@-\X@c \advance\B@-\Y@c \advance\X@c 2\A@ \advance\Y@c 2\B@
+ \ht\z@=\U@c \dp\z@=\D@c \dimen@=\L@c \advance\dimen@\R@c \wd\z@=\dimen@
+ \setbox\lastobjectbox@=\hbox{\X@c=\L@c \Y@c=\z@ \Drop@@}%
+ \drop@{\box\lastobjectbox@}{}%
+ \leave@}}
+
+\xydef@\PATHlabelbreak@#1#2{%
+ \DN@{#1}\ifx\next@\empty \drop\labelbox{#2}\else \drop#1{#2}\fi
+ \def\afteraliases@@{\xy@@\Cbreak@@}\xyFN@\PATHlabelalias@}
+\DOCMODE)
+
+ These emulate the effect of the <modifier>s |!C|
+ |+<|2"labelmargin"|>| <perp> |!P| <unperp> where <perp>,<unperp> are
+ |^|,|_| for |^|-labels and |_|,|^| for |_|-labels. The last hack
+ using |\lastobjectbox@| aims at both setting that right and setting
+ the label as an object (such that modifiers take effect) even though
+ its placement is peculiar.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Labels will be separated from the connection by the "label"\-"margin"
+ that you can set with the operation
+%
+\begin{defs1}
+ ??c![\labelmargin] <add op> |{|<dimen>|}|
+\end{defs1}
+\noindent\unskip
+%
+ that works like the kernel ??c![\objectmargin] command; in fact
+ "labelmargin" defaults to use "objectmargin" if not set.
+
+\DOCMODE(
+\xylet@\labelmargin@=\objectmargin@
+
+\xydef@\labelmargin{\afterADDOP{\Addop@@\labelmargin@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[break with <it>]??=[piece]
+%
+ Breaking means to ``slice a hole'' in the connection and insert <it>
+ there. This is realized by typesetting the connection in question in
+ "subsegments", one leading to the break and one continuing after the
+ break as described in notes~??[<action>] and~??[straight segment].
+
+ The special control sequence ??c![\hole] is provided to make it easy to
+ make an empty break.
+
+\DOCMODE(
+\xydef@\hole{\hbox{\dimen@=\objectmargin@ \kern2\dimen@
+ \vrule height\dimen@ depth\dimen@ width\z@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Subsegments are typeset using the `|\Cbreak@@|' method.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[default label]
+%
+ Unless <it> is a full-fledged <object> (by using the ??c![*] form),
+ it is typeset using a ??c![\labelbox] object (initially similar to
+ ??c![\objectbox] of basic \Xy-pic but using ??c![\labelstyle] for the
+ style).
+
+ \REMARK: You can only omit the |{}|s around single letters, digits,
+ and control sequences.
+
+\DOCMODE(
+\xylet@\labelstyle=\scriptstyle
+\xydef@\labelbox#1{\hbox{$\m@th\labelstyle{#1}$}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[name for label object]
+%
+ A label is an object like any other in the \Xy-picture. Inserting an
+ <alias> ??c![=]|"|<id>|"| saves the label object as |"|<id>|"| for
+ later reference.
+
+\begin{exercise}
+ Typeset
+%
+\begin{code}
+\xy(0,0)
+ \ar @{-->} (30,7) ^A="a"
+ \POS(10,12)*+\txt{label} \ar "a"
+\endxy
+\end{code}
+$$\docode$$
+%
+\answercode
+\answertext{The author did \displaycode}
+\end{exercise}
+
+\DOCMODE(
+\xydef@\PATHlabelalias@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHlabelalias@}%
+ \else \addEQ@\ifx \next
+ \addEQ@\DN@"##1"{\savealias@{##1}\xyFN@\PATHlabelalias@}%
+ \else \DN@{\afteraliases@@\PATHlabels@}\fi\fi \next@}
+
+\xylet@\afteraliases@@=\empty
+
+%{\xyuncatcodes \gdef\next#1{\POS!C="#1"\relax}}
+\xydef@\savealias@#1{\xy@@{\enter@\cfromthec@
+ \advance\X@c-\L@c \advance\L@c\R@c \L@c=.5\L@c \R@c=\L@c \advance\X@c\L@c
+ \advance\Y@c-\D@c \advance\D@c\U@c \D@c=.5\D@c \U@c=\D@c \advance\Y@c\D@c
+ \idfromc@{#1}\leave@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Arrows}
+??=[arrow]
+
+\begin{figure*}[tb]
+\vfil
+\begin{syntax}
+%
+ \multispan{3}{{\tt\string\ar} <arrow> <path>\hfil}
+ & make <arrow> along <path>
+\cr
+\noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+%
+ <arrow>
+ &\iss & <form>\star
+ & <arrow> has the <form>s
+\cr
+\noalign{\smallskip}
+%
+ <form>
+ &\iss & ??c![@] <variant>
+ & use <variant> of arrow
+\cr
+ &\orr & ??c![@] <variant> |{| <tip> |}|
+ & ??!^[build arrow] using <variant> of a standard stem and <tip> for
+ the head
+\cr
+ &\orr & ??c![@] <variant> |{| <tip> <conn> <tip> |}|
+ & ??!^[build arrow] using <variant> of <tip>, <conn>, <tip>
+ as arrow tail, stem, and head (in that order)
+\cr
+ &\orr & ??c![@] <connchar>
+ & change stem to the indicated <connchar>
+\cr
+ &\orr & ??c![@!]
+ & dash the arrow stem by doubling it
+\cr
+ &\orr & ??c![@/] <direction> <dist> |/|
+ & ??!^[curve] arrow the <dist>ance towards <direction>
+\cr
+ &\orr & ??c![@(] <direction> |,| <direction> |)|
+ & curve to fit with ??!^[in-out directions]
+\cr
+ &\orr & ??c![@`] |{| <control point list> |}|
+ & ??!^[curve setup] with explicit control points
+\cr
+ &\orr & |@[| <shape> |]|
+ & add |[|<shape>|]| to ??!^[object <modifier>s] for all objects
+\cr
+ &\orr & ??c![@*] |{| <modifier>\star\ |}|
+ & add ??!^[object <modifier>s] for all objects
+\cr
+ &\orr & ??c![@<] <dimen> |>|
+ & ??!^[slide arrow] the <dimen>
+\cr
+ &\orr & ??c![|] <anchor> <it>
+ & break each segment at <anchor> with <it>
+\cr
+ &\orr & ??c![^] <anchor> <it> \orr\ ??c![_] <anchor> <it>
+ & label each segment at <anchor> with <it>
+\cr
+ &\orr & ??c![@?]
+ & ??!^[reverse meaning of above and below]
+\cr
+\noalign{\smallskip}
+%
+ <variant>
+ &\iss & <empty> \orr\ ??c![^] \orr\ ??c![_] & \cr
+ & & \orr\ ??c![0] \orr\ ??c![1] \orr\ ??c![2] \orr\ ??c![3]
+ & <variant>: plain, above, below, double, or triple
+\cr
+\noalign{\smallskip}
+%
+ <tip>
+ &\iss & <tipchar>\star
+ & directional named as the sequence of <tipchar>s
+\cr
+ &\orr & <dir>
+ & ??!^[any <dir>ectional]
+\cr
+\noalign{\smallskip}
+%
+ <tipchar>
+ &\iss & |<|\orr|>|\orr|(|\orr|)|\orr||||\orr|'|\orr|`|\orr|+|\orr|/|
+ & recognised tip characters
+\cr
+ &\orr & <letter> \orr\ <space>
+ & more tip characters
+\cr
+\noalign{\smallskip}
+%
+ <conn>
+ &\iss & <connchar>\star
+ & directional named as the sequence of <connchar>s
+\cr
+ &\orr & <dir>
+ & ??!^[any <dir>ectional]
+\cr
+\noalign{\smallskip}
+%
+ <connchar>
+ &\iss & |-|\orr|.|\orr|~|\orr|=|\orr|:|
+ & recognised connector characters
+\cr
+\end{syntax}
+\caption{\protect<arrow>s.}??=[f.arrow]
+\vfil
+\end{figure*}
+
+\DOCMODE(
+\message{\string\ar,}
+\DOCMODE)
+
+ Arrows are paths with a particularly easy syntax for setting up
+ arrows with "tail", "stem", and "head" in the style
+ of~\cite{R92:HowTPDAT}. This is provided by a single <decor>ation
+ the syntax of which is described in figure~??[f.arrow] (with the
+ added convention that a raised `\star' means 0 or more repetitions of
+ the preceeding nonterminal).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Parsing:}
+
+ The ??c![\ar] command effectively translates the <arrow> into a
+ ??c![\PATH] command that initialises the tail, stem, and head of it as
+ required to get the desired <arrow>.
+
+ The translation of the <arrow> is saved in the following variables:
+
+\DOCMODE(
+\xylet@\arvariant@@=\empty
+\xylet@\arstemprefix@@=\empty
+\xylet@\artail@@=\empty
+\xylet@\arstem@@=\empty
+\xylet@\arhead@@=\empty
+\xylet@\armodifiers@@=\empty
+\xylet@\arlabels@@=\empty
+\xylet@\arafterPOS@@=\empty
+\xylet@\arinit@@=\empty
+\xylet@\arexit@@=\empty
+
+\xylet@\arcomponent@@=\relax
+\xylet@\arcomponenttype@@=\relax
+
+\xylet@\afterar@@=\relax
+\DOCMODE)
+
+ ??c![\ar] stores the defaults; it loads an intermediate command to
+ avoid problems when used as first command in compiled matrix
+ entry\dots
+
+\DOCMODE(
+\xydef@\ar{\relax\arSAFE}
+
+\xydef@\arSAFE{%
+ \let\arvariant@@=\empty
+ \def\arstemprefix@@{\dir}%
+ \edef\artail@@{\arvariant@@{}}%
+ \edef\arstem@@{\arvariant@@{-}}%
+ \edef\arhead@@{\arvariant@@{>}}%
+ \def\armodifiers@@{}%
+ \def\arafterPOS@@{}%
+ \def\arlabels@@{}%
+ \def\arinit@@{}%
+ \def\arexit@@{}%
+ \let\PATHlabelabove@@=\PATHlabelabove@
+ \let\PATHlabelbelow@@=\PATHlabelbelow@
+ \xyFN@\ar@}
+\DOCMODE)
+
+ |\ar@| is where we parse the sequence of <form>s and continue with
+ typesetting the arrow afterwards.
+
+\DOCMODE(
+\xydef@\ar@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ar@}%
+ \else \addAT@\ifx\next \addAT@\DN@{\xyFN@\ar@form}%
+ \else\ifx |\next
+ \DN@ |{\ar@anchor|}%
+ \else\ifx ^\next
+ \DN@ ^{\ar@anchor^}%
+ \else\ifx _\next
+ \DN@ _{\ar@anchor_}%
+ \else \let\next@=\ar@x \fi\fi\fi\fi\fi \next@}
+\DOCMODE)
+
+ \NOTE: Makes use of the "new compilation principle" to parse a
+ <place> vacuously\dots
+
+\DOCMODE(
+\xydef@\addtoarinit@#1{%
+ \expandafter\def\expandafter\arinit@@\expandafter{\arinit@@ #1}}
+
+\xydef@\addtoarlabels@#1{%
+ \expandafter\def\expandafter\arlabels@@\expandafter{\arlabels@@ #1}}
+
+\xydef@\ar@anchor#1{\begingroup
+ \def\PATHlabelit@@##1##2{%
+ \DN@{##1}\ifx\next@\empty
+ \DN@####1{\expandafter\endgroup\expandafter\addtoarlabels@
+ \expandafter{\the\toks@####1{##2}}\xyFN@\ar@}%
+ \else
+ \DN@####1{\expandafter\endgroup\expandafter\addtoarlabels@
+ \expandafter{\the\toks@*!C####1##1{##2}}\xyFN@\ar@}\fi
+ \expandafter\next@\expandafter{\PATHitshape@@}}%
+ \toks@={#1}%
+ \def\xy@##1##2{\addtotoks@{##1}}\change@oxy@\xy@ \let\xy@@ix@=\eat@
+ \DNii@{}\xyFN@\PATHanchor@}
+\DOCMODE)
+
+ |\ar@form| handles one <form>:
+
+\DOCMODE(
+\xydef@\ar@form{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ar@form}%
+ \else\ifx ^\next \DN@ ^{\xyFN@\ar@style}\edef\arvariant@@{\string^}%
+ \else\ifx _\next \DN@ _{\xyFN@\ar@style}\edef\arvariant@@{\string_}%
+ \else\ifx 0\next \DN@ 0{\xyFN@\ar@style}\def\arvariant@@{0}%
+ \else\ifx 1\next \DN@ 1{\xyFN@\ar@style}\def\arvariant@@{1}%
+ \else\ifx 2\next \DN@ 2{\xyFN@\ar@style}\def\arvariant@@{2}%
+ \else\ifx 3\next \DN@ 3{\xyFN@\ar@style}\def\arvariant@@{3}%
+ \else\ifx \bgroup\next \let\next@=\ar@style
+ \else\ifx [\next \DN@[##1]{\ar@modifiers{[##1]}}%]
+ \else\ifx *\next \DN@ *{\ar@modifiers}%
+ \else\addLT@\ifx\next \let\next@=\ar@slide
+ \else\ifx /\next \let\next@=\ar@curveslash
+ \else\ifx (\next \let\next@=\ar@curveinout %)
+ \else\addRQ@\ifx\next \addRQ@\DN@{\ar@curve@}%
+ \else\addLQ@\ifx\next \addLQ@\DN@{\xyFN@\ar@curve}%
+ \else\addDASH@\ifx\next \addDASH@\DN@{\defarstem@-\xyFN@\ar@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\def\arvariant@@{2}\defarstem@-\xyFN@\ar@}%
+ \else\addDOT@\ifx\next \addDOT@\DN@{\defarstem@.\xyFN@\ar@}%
+ \else\ifx :\next \DN@:{\def\arvariant@@{2}\defarstem@.\xyFN@\ar@}%
+ \else\ifx ~\next \DN@~{\defarstem@~\xyFN@\ar@}%
+ \else\ifx !\next \DN@!{\dasharstem@\xyFN@\ar@}%
+ \else\ifx ?\next \DN@?{\ar@upsidedown\xyFN@\ar@}%
+ \else \let\next@=\ar@error
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\defarstem@#1{\edef\arstem@@{\arvariant@@{\string#1}}%
+ \DNii@##1##{\next@}%
+ \edef\next@##1{\def\noexpand\artail@@{\arvariant@@{##1}}}%
+ \expandafter\nextii@\artail@@
+ \edef\next@##1{\def\noexpand\arhead@@{\arvariant@@{##1}}}%
+ \expandafter\nextii@\arhead@@}
+
+\xydef@\dasharstem@{%
+ \DN@##1##{\nextii@{##1}}\DNii@##1##2{\def\arstem@@{##1{##2##2}}}%
+ \expandafter\next@\arstem@@}
+
+\xydef@\ar@error#1{\xyerror@{Illegal <form>ation (\meaning\next)}{}%
+ \xyFN@\ar@}
+\DOCMODE)
+
+ |\ar@i| sets the remaining defaults and then allows |\ar@ii|-|iv| to
+ pick up any tail, stem, and head using a {|$|} as terminator.%$
+
+\DOCMODE(
+\xydef@\ar@style{%
+ \ifx \bgroup\next \def\artail@@{{}}%
+ \edef\arstem@@{\arvariant@@{-}}\edef\arhead@@{\arvariant@@{>}}%
+ \expandafter\ar@i
+ \else \resetvariant@\artail@@ \resetvariant@\arstem@@ \resetvariant@\arhead@@
+ \expandafter\xyFN@\expandafter\ar@ \fi}
+
+\xydef@\resetvariant@#1{%
+ \DN@##1##{\DN@{##1}\ifx\next@\empty
+ \DN@{\expandafter\nextii@\expandafter{\arvariant@@}}%
+ \else \DN@{\nextii@{##1}}\fi \next@}%
+ \DNii@##1##2{\def#1{##1{##2}}}%
+ \expandafter\next@#1}
+
+\xydef@\ar@i#1{\DN@{#1}%
+ \ifx\next@\empty \edef\arstem@@{\arvariant@@{}}\edef\arhead@@{\arvariant@@{}}%
+ \DN@{\xyFN@\ar@}%
+ \else
+ \let\arcomponent@@=\ar@ii \let\arcomponenttype@@=\artip@
+ \DN@{\xyFN@\arcomponent@#1$}%
+ \fi \next@}
+
+\xydef@\ar@ii{\ifx $\next \let\next@=\ar@iv
+ \else \expandafter\def\expandafter\artail@@\expandafter{\the\toks@}%
+ \let\arcomponent@@=\ar@iii \let\arcomponenttype@@=\arconn@
+ \DN@{\xyFN@\arcomponent@}\fi \next@}
+
+\xydef@\ar@iii{%
+ \expandafter\def\expandafter\arstem@@\expandafter{\the\toks@}%
+ \resetvariant@\artail@@
+ \let\arcomponent@@=\ar@iv \let\arcomponenttype@@=\artip@
+ \xyFN@\arcomponent@}
+
+\xydef@\ar@iv{%
+ \expandafter\def\expandafter\arhead@@\expandafter{\the\toks@}%
+ \ifx $\next \DN@ ${\xyFN@\ar@}%
+ \else \xyerror@{illegal <arrow>: \meaning\next\space not valid}{}\fi \next@}
+\DOCMODE)
+
+ |\ar@x| is the final macro that passes control to the <path>
+ interpreter. It is a bit clumsy because we must pass the right
+ character tokens; it could definitely be more efficient by calling
+ <path> internals directly\dots
+
+\DOCMODE(
+\xydef@\ar@x{%
+ \let\arsavedPATHafterPOS@@=\PATHafterPOS \let\PATHafterPOS=\arafterPOS@
+ \toks@={\ar@PATH}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\artail@@}}%#1
+ \expandafter\addtotoks@\expandafter{\expandafter{\arstem@@}}%#2
+ \expandafter\addtotoks@\expandafter{\expandafter{\arstemprefix@@}}%#3
+ \expandafter\addtotoks@\expandafter{\expandafter{\arhead@@}}%#4
+ \expandafter\addtotoks@\expandafter{\expandafter{\armodifiers@@}}%#5
+ \expandafter\addtotoks@\expandafter{\expandafter{\arinit@@}}%#6
+ \expandafter\addtotoks@\expandafter{\expandafter{\arexit@@}}%#7
+ \expandafter\addtotoks@\expandafter{\expandafter{\arlabels@@}}%#8
+ \addtotoks@{\afterar@@}%#9
+ \expandafter\DNii@\expandafter{\the\toks@}\toks@={}%
+%
+%{\let\x=\expandafter \x\x\x\DNii@\x\x\x{\nextii@}\W@{RUN: \codeof\nextii@}}%
+%
+ \nextii@}
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{%
+ \def\next{%
+ \afterPATH{#9}%
+ ~={#6\preconnect#5#3#2}%
+ ~/{#7}%
+ ~<{|<*h#5\dir#1}%
+ ~>{|>*h#5\dir#4}%
+ ~+{#8}%
+ }%
+ \next}}
+
+\xylet@\ar@PATH=\next
+
+\xydef@\arafterPOS@#1{%
+ \arsavedPATHafterPOS@@{\let\PATHafterPOS=\arsavedPATHafterPOS@@
+ \DN@{#1}\expandafter\next@\arafterPOS@@}}%
+
+\xylet@\arsavedPATHafterPOS@@=\relax
+\DOCMODE)
+
+ <tip>s and <conn>ectors are interpreted by these that leave any
+ <variant> in |\toks@ii| and the sequence of <tipchar>s or <connchar>s
+ characters in |\toks@|:
+
+ The work is really done in |\arcomponent@| that builds |\toks@|
+ with something conforming to the |\arcomponenttype@@| and then
+ passes control to |\arcomponent@@|:
+
+\DOCMODE(
+\xydef@\arcomponent@{%
+ \ifx ^\next \toks@ii={^}\DN@ ^{\xyFN@\arcomponent@i}%
+ \else\ifx _\next \toks@ii={_}\DN@ _{\xyFN@\arcomponent@i}%
+ \else\ifx 1\next \toks@ii={1}\DN@ 1{\xyFN@\arcomponent@i}%
+ \else\ifx 2\next \toks@ii={2}\DN@ 2{\xyFN@\arcomponent@i}%
+ \else\ifx 3\next \toks@ii={3}\DN@ 3{\xyFN@\arcomponent@i}%
+ \else\ifx \bgroup\next \expandafter\toks@ii\expandafter{\arvariant@@}%
+ \let\next@=\arcomponent@i
+ \else\ifx *\next \DN@*##1##{\arcomponent@ii{##1}}%
+ \else \expandafter\toks@ii\expandafter{\arvariant@@}\toks@={}%
+ \let\next@=\arcomponenttype@@
+ \fi\fi\fi\fi\fi\fi\fi
+ \next@}
+
+\xydef@\arcomponent@i#1{\toks@={#1}\arcomponent@x}
+
+\xydef@\arcomponent@ii#1#2{\toks@={*#1{#2}}\xyFN@\arcomponent@@}
+
+\xydef@\artip@{%
+ \addGT@\ifx\next \addGT@\addtotoks@ \addGT@\DN@{\xyFN@\artip@}%
+ \else\addLT@\ifx\next \addLT@\addtotoks@ \addLT@\DN@{\xyFN@\artip@}%
+ \else\ifx (\next \addtotoks@(\DN@({\xyFN@\artip@}%
+ \else\ifx )\next \addtotoks@)\DN@){\xyFN@\artip@}%
+ \else\ifx |\next \addtotoks@|\DN@|{\xyFN@\artip@}%
+ \else\addLQ@\ifx\next \addLQ@\addtotoks@ \addLQ@\DN@{\xyFN@\artip@}%
+ \else\addRQ@\ifx\next \addRQ@\addtotoks@ \addRQ@\DN@{\xyFN@\artip@}%
+ \else\addPLUS@\ifx \next \addPLUS@\addtotoks@ \addPLUS@\DN@{\xyFN@\artip@}%
+ \else\ifx /\next \addtotoks@/\DN@/{\xyFN@\artip@}%
+ \else\ifcat A\noexpand\next \DN@##1{\addtotoks@{##1}\xyFN@\artip@}%
+ \else\ifx\space@\next \addtotoks@{ }\expandafter\DN@\space{\xyFN@\artip@}%
+ \else \let\next@=\arcomponent@x
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\arconn@{%
+ \addDASH@\ifx\next \addDASH@\addtotoks@ \addDASH@\DN@{\xyFN@\arconn@}%
+ \else\addEQ@\ifx\next \addEQ@\addtotoks@ \addEQ@\DN@{\xyFN@\arconn@}%
+ \ifx\arvariant@@\empty \def\arvariant@@{2}\fi
+ \else\addDOT@\ifx\next \addDOT@\addtotoks@ \addDOT@\DN@{\xyFN@\arconn@}%
+ \else\ifx :\next \addtotoks@:\DN@:{\xyFN@\arconn@}%
+ \ifx\arvariant@@\empty \def\arvariant@@{2}\fi
+ \else\ifx ~\next \addtotoks@~\DN@~{\xyFN@\arconn@}%
+ \else \let\next@=\arcomponent@x
+ \fi\fi\fi\fi\fi \next@}
+
+\xydef@\arcomponent@x{%
+ \DN@##1{\toks@=\expandafter{\the\toks@ii{##1}}}%
+ \expandafter\next@\expandafter{\the\toks@}%
+ \xyFN@\arcomponent@@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notescontd}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[build arrow]
+
+ Building an <arrow> is simply using the specified directionals (using
+ ??c![\dir] of~\S??g[xy.doc:objectlib.directionals]) to build a path:
+ the first <tip> becomes the "??w![arrow tail]" of the arrow, the
+ <conn>ection in the middle becomes the "??w![arrow stem]", and the
+ second <tip> becomes the "??w![arrow head]". If a <variant> is given
+ before the |{| then that variant ??c![\dir] is used for all three.
+ For example,
+%
+\begin{code}
+\xy\ar @^{(->} (20,7)\endxy
+\end{code}
+\displaycode
+%
+ typesets
+%
+$$\docode$$
+
+\begin{exercise}
+ Typeset these arrows:
+%
+\begin{code}
+\xy ;<1pc,0pc>:
+ \POS(0,0)*+{A}
+ \ar +(-2,3)*+{A'}*\cir{}
+ \ar @2 +( 0,3)*+{A''}*\cir{}
+ \ar @3 +( 2,3)*+{A'''}*\cir{}
+ \POS(6,0)*+{B}
+ \ar @1{||.>>} +(-2,3)*+{B'}*\cir{}
+ \ar @2{||.>>} +( 0,3)*+{B''}*\cir{}
+ \ar @3{||.>>} +( 2,3)*+{B'''}*\cir{}
+\endxy
+\end{code}
+$$\docode$$
+%
+\answertext{Here is the entire \Xy-picture of the exercise:}
+\answercode
+\answertext\displaycode
+\answertext{The first batch use the default |{->}| specification.}
+\end{exercise}
+
+ The above is a flexible scheme when used in conjunction with the
+ kernel ??c![\newdir] to define all sorts of arrowheads and -tails. For
+ example,
+%
+\begin{code}
+\newdir{|>}{!/4.5pt/\dir{|}
+ *:(1,-.2)\dir^{>}
+ *:(1,+.2)\dir_{>}}
+\end{code}
+\displaycode
+\gdocode
+%
+ defines a new arrow tip that makes
+%
+\begin{code}
+\xy (0,0)*+{A}
+ \ar @{=|>} (20,3)*+{B}
+\endxy
+\end{code}
+\displaycode
+%
+ typeset
+%
+$$\docode$$
+%
+ Notice that the fact that the directional uses only <tipchar>
+ characters means that it blends naturally with the existing tips.
+
+\begin{exercise}
+ Often tips used as `tails' have their ink on the wrong side of the
+ point where they are placed. Fortunately space is also a <tipchar>
+ so we can define |\dir{ >}| to generate a `tail' arrow. Do this such
+ that
+%
+\begin{code}
+\xy (0,0)*+{A}="a", (20,3)*+{B}="b"
+ \ar @{>->} "a";"b" < 2pt>
+ \ar @{ >->} "a";"b" <-2pt>
+\endxy
+\end{code}
+\displaycode
+%
+ typesets
+%
+$$
+ \newdir{ >}{{}*!/-5pt/\dir{>}}
+ \docode
+$$
+%
+\begin{code}
+\newdir{ >}{{}*!/-5pt/\dir{>}}
+\end{code}
+\answercode
+\answertext{The author used \displaycode}
+\end{exercise}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[any <dir>ectional]
+
+ Specifying a <dir> as a <tip> or <conn> means that ??c![\dir]<dir> is
+ used for that <tip> or <conn>. For example,
+%
+\begin{code}
+\xy\ar @{<^{|}>} (20,7)\endxy
+\end{code}
+\displaycode
+%
+ typesets
+%
+$$\docode$$
+%
+ When using this you must specify a |{}| dummy <dir>ectional in order
+ to ignore one of the tail, stem, or tip components, \eg,
+%
+\begin{code}
+\xy\ar @{{}{+}>} (20,7)\endxy
+\end{code}
+\displaycode
+%
+ typesets
+%
+$$\docode$$
+%
+ In particular ??c![*]<object> is a <dir> so any <object> can be used
+ for either of the tail, stem, or head component:
+%
+\begin{code}
+\xy\ar @{*{x}*{y}*{z}} (20,7)\endxy
+\end{code}
+\displaycode
+%
+ typesets
+%
+$$\docode$$
+%
+ \NOTE: A |*| introduces an <object> whereas the directional
+ `$\xy*+!<0pt,-\jot>\dir{*}\endxy$' is typeset by the <dir> |{*}|.
+
+\begin{exercise}
+ Typeset
+\begin{code}
+\xy
+ \ar @{>>*\composite{\dir{x}*\dir{+}}<<}
+ (20,7)
+\endxy
+\end{code}
+$$\docode$$
+ using only one |\ar| command.
+%
+\answertext{The author used}
+\answercode
+\answertext\displaycode
+\end{exercise}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[curve]
+%
+ "Curving" the arrow using $??c![/]d\ell|/|$, where $d$ is a
+ <direction> and $\ell$ a <dimen>sion, makes the stem a curve which is
+ similar to a straight line but has had it's center point `dragged'
+ the distance~$\ell$ in~$d$:
+%
+\begin{code}
+\xy
+ \POS (0,10) *\cir<2pt>{} ="a"
+ , (20,-10)*\cir<2pt>{} ="b"
+ \POS"a" \ar @/^1ex/ "b"|\uparrow
+ \POS"a" \ar @/_1ex/ "b"|\downarrow
+%
+ \POS (20,10) *\cir<2pt>{} ="a"
+ , (40,-10)*\cir<2pt>{} ="b"
+ \POS"a" \ar @/u1ex/ "b"|u
+ \POS"a" \ar @/d1ex/ "b"|d
+\endxy
+\end{code}
+$$\docode$$
+%
+ was typeset by
+%
+\displaycode
+%
+ $\ell$ defaults to |.5pc| if omitted.
+
+ This is really just a shorthand for curving using the more general
+ form described next: $??c![@/]d\ell|/|$ is the same as |@`{{**{}
+ ?+/|$d~2\ell~$|/}}| which makes the (quadratic) curve pass through
+ the point defined by the <pos> |**{} ?+/|$d\ell$|/|.
+
+\DOCMODE(
+\xydef@\ar@curveslash/#1/{\expandafter\ar@curve@\ar@slashing{#1}}
+
+\xydef@\ar@slashing#1{{\xy@{**{} ?+/#1/+/#1/ @+c}{\setupDirection@
+ \vfromslide@{#1}%
+ \X@c=2\X@c \advance\X@c\X@p \advance\X@c.5\d@X
+ \Y@c=2\Y@c \advance\Y@c\Y@p \advance\Y@c.5\d@Y
+ \czeroEdge@
+ \spushc@}}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[in-out directions]
+%
+ Using ??c![@(]$d_2$|,|$d_2$|)| where $d_1,d_2$ are simple
+ <direction>s (as described in note~??g[xy.doc:<direction>] except it
+ is not possible to use |()|s) will typeset the arrow curved such that
+ it leaves the source in direction $d_1$ and enters the target from
+ direction~$d_2$.
+
+\begin{exercise}
+ Typeset
+%
+\begin{code}
+\xy *{\circ}="b" \ar@(ur,ul) c
+ \ar@{.>}@(dr,ul) (20,0)*{\bullet}
+\endxy
+\end{code}
+$$\docode$$
+\answercode
+\answertext{The author used \displaycode\noindent Note that it is essential
+ that the curving specification comes after the arrow style.}
+\end{exercise}
+
+\DOCMODE(
+{\xyuncatcodes \catcode`\#=6 %
+ \gdef\next(#1,#2){{+/#1 3pc/,p+/#2 3pc/}}}
+\xylet@\ar@curveinout@=\next
+
+\xydef@\ar@curveinout{\expandafter\ar@curve@load\ar@curveinout@}
+\DOCMODE)
+
+ \TODO: implement this efficiently and properly get rid of the no-|()|
+ restriction!
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[curve setup]
+%
+ The final curve form is the most general one: |@`{|<control point
+ lists>|}| sets the control points explicitly to the ones in the
+ <control point lists> (where they should be separated by~|,|). See
+ the curve extension described in~\S??g[:curve] for the way the
+ control points are used; when the control points list is parsed $p$
+ is the source and $c$ the target of the arrow.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Curving simply uses ??c![\crvi] instead of ??c![\dir]. The
+ only tricky bit is to put the control points on the stack
+ right.
+
+\DOCMODE(
+\xydef@\ar@curve{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\ar@curve}%gobble spaces
+ \else\ifx \bgroup\next \let\next@=\ar@curve@load
+ \else\ifx "\next \DN@"##1"{\ar@curve@{"##1"}}%
+ \else \xyerror@{@= <form> must be followed by \string"<id>\string" or
+ {<control point list>}}{}%
+ \fi\fi\fi \next@}
+
+{\xyuncatcodes \gdef\next#1#2{\def#1##1{#2{;@={##1}}}}}
+\next\ar@curve@load\ar@curve@
+
+\xydef@\ar@curve@#1{\curve@check
+ \setcurvearinit@{#1}\setcurvearexit@\arexit@@
+ \def\arstemprefix@@{\crvi}\xyFN@\ar@}
+
+{\xyuncatcodes \gdef\next#1{\save @(,#1\restore}}
+\xylet@\setcurvearinit@i=\next
+\xydef@\setcurvearinit@#1{%
+ \expandafter\addtoarinit@\expandafter{\setcurvearinit@i{#1}}}
+
+{\xyuncatcodes \gdef\next#1{\def#1{\POS @i @) }}}
+\xylet@\setcurvearexit@=\next
+
+\xydef@\curve@check{%
+ \xyerror@{Forms @/.../, @(...), and @`{...}, only available when curve
+ extension loaded}{}}
+\xywithoption{curve}{\let\curve@check=\relax}
+\DOCMODE)
+
+ \TODO: The parsing is trivial and should be extended to include more
+ exotic control point forms.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[object <modifier>s]
+%
+ |@[|\dots|]| and |@*{|\dots|}| formations define what object
+ <modifier>s should be used when building objects that are part of the
+ arrow. This is mostly useful in conjunction with extensions that
+ define additional |[|<shape>|]| modifiers, \eg, if a |[red]|
+ <modifier> changes the colour of an object to red then |@[red]|
+ will make the entire arrow red; similarly if it is desired to make
+ and entire arrow invisible then |@*{i}| can be used.
+
+\DOCMODE(
+\xydef@\ar@modifiers#1{%
+ \expandafter\def\expandafter\armodifiers@@\expandafter{\armodifiers@@#1}%
+ \xyFN@\ar@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[slide arrow]
+%
+ ??c![@<]$D$|>| will slide (each segment of) the arrow the dimension $D$
+ as explained in note~??[slide].
+
+\DOCMODE(
+{\xyuncatcodes \catcode`\#=6 \catcode`\@=11 %
+ \gdef\next<#1>{\def\arafterPOS@@{<#1>}\xyFN@\ar@}}
+\xylet@\ar@slide=\next
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[reverse meaning of above and below]
+%
+ ??c![@?] reverse the meaning of `above' and `below' for this particular
+ arrow.
+
+\DOCMODE(
+\xydef@\ar@upsidedown{\let\next=\PATHlabelabove@@
+ \let\PATHlabelabove@@=\PATHlabelbelow@@ \let\PATHlabelbelow@@=\next}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notescontd}
+
+ All the features of <path>s described above are available for arrows.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection*{End \& log}
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyarrow.doc,v $
+% Revision 3.5 1997/05/28 13:05:01 krisrose
+% Fixed missing breaks bug.
+%
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 10:25:18 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% NEW for version 2.7 based of path and arrow code in xypic.doc 2.6.1.1.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs how we are formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xycmactex.doc b/Master/texmf-dist/source/generic/xypic/xycmactex.doc
new file mode 100644
index 00000000000..5e156789e39
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xycmactex.doc
@@ -0,0 +1,71 @@
+%% $Id: xycmactex.doc,v 3.3 1996/12/18 08:54:25 ross Exp $
+%%
+%% Xy-pic ``CMacTeX'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{cmactex}{CMacTeX driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Thomas Kiffe's {CMac\TeX} application uses \dvips\ as its dvi-driver.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE(
+\xyrequire{dvips}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xycmactex.doc,v $
+% Revision 3.3 1996/12/18 08:54:25 ross
+% no changes
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xycmtip.doc b/Master/texmf-dist/source/generic/xypic/xycmtip.doc
new file mode 100644
index 00000000000..5f337fb6c15
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xycmtip.doc
@@ -0,0 +1,93 @@
+%% $Id: xycmtip.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+%%
+%% Xy-pic ``Computer Modern tips'' extension.
+%% Copyright (c) 1992-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{cmtip}{Computer Modern tip extension}{\stripRCS$Revision: 3.3 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This extension is a dummy that merely loads the `tips' extension and
+ defines the obsolete ??c![\UseComputerModernTips] and
+ ??c![\NoComputerModernTips] selection commands.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\subsection{Fonts}
+
+ Load `tips'; the default is |cm| at |10| point so all is well.
+
+\DOCMODE(
+\xyrequire{tips}\xycatcodes
+\DOCMODE)
+
+ Define the obsolete selection commands.
+
+\DOCMODE(
+\xydef@\UseComputerModernTips{\SelectTips{cm}{10}\UseTips}
+\xydef@\NoComputerModernTips{\NoTips}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{End \& log}
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xycmtip.doc,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.6 1993/10/21 20:36:09 kris
+% NEW file to go in version 2.7!
+%
+% Extracted from xypic.doc 2.6.1.1.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs how we are formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xycolor.doc b/Master/texmf-dist/source/generic/xypic/xycolor.doc
new file mode 100644
index 00000000000..dfbb4d05b4f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xycolor.doc
@@ -0,0 +1,349 @@
+%% $Id: xycolor.doc,v 3.3 1996/12/19 03:50:08 ross Exp $
+%%
+%% Xy-pic ``Colour extension'' option.
+%% Copyright (c) 1993-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{color}{Colour extension}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This extension provides the ability to request that any object be displayed
+in a particular colour.
+
+It requires a suitable `driver' option to provide the necessary |\special|
+commands to implement the effects. Thus
+$$
+\xy
+ *+\txt<.8\hsize>{Using this extension will have no effect on the output
+ unless used with a dvi-driver that explicitly supports it.}
+ *\frm{-}
+\endxy
+$$
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+All effects defined in the |color| extension can be implemented using most
+\PS\ <driver>s, and some non-\PS\ ones, loaded using |\xyoption{xyps}|.
+This file provides `generic' code which is known to work correctly with
+most drivers. For driver-specific variations, consult the appropriate
+<driver> file.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%\paragraph*{Colour}
+Colours are specified as a <shape> modifier which gives the name of the
+colour requested. It is applied to the whole of the current <object>
+whether this be text, an \Xy-pic line, curve or arrow-tip, or a composite
+object such as a matrix or the complete picture. However some DVI drivers
+may not be able to support the colour in all of these cases.
+%
+\begin{defs}
+|[|<colour name>|]| & use named colour\cr
+\noalign{\smallskip}
+??c![\newxycolor]|{|<name>|}{|<code>|}|\kern-20pt &\kern25pt
+ define colour \cr
+??c![\UseCrayolaColors] & load colour names \cr
+\end{defs}
+%
+If the DVI-driver cannot support colour then a request for colour
+only produces a warning message in the log file. After two such
+messages subsequent requests are ignored completely.
+
+\DOCMODE(
+\xydef@\xycolorwarning@@{\xycolormessage@
+ \gdef\xycolorwarning@{\xycolormessage@
+ \xywarning@{...no further colour warnings will be given.}%
+ \global\let\xycolorwarning@=\relax }}
+\xylet@\xycolorwarning@=\xycolorwarning@@
+
+\xydef@\xycolormessage@{%
+ \xywarning@{Current driver does not support colour.}}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+There are two methods, perhaps used simultaneously, for handling requests
+for colour. The |\xylocalColor@| is the normal method, colouring whatever
+objects \TeX\ typesets from fonts. The more specialized |\xycolor@| is used
+with the \PS\ back-end. This is necessary since some <driver>s assume that
+the current colour should be `black' when the contents of a |\special| is
+interpreted, e.g. within \PS.
+
+Thus a <driver> which supports both colour and \PS\ must define a method
+to handle |\xylocalColor@| but should leave alone |\xycolor@|. The latter
+method will be adjusted appropriately when a \PS\ <driver> is installed.
+
+\DOCMODE(
+\xydef@\xyNoColor@#1{}
+\xylet@\xycolor@@=\xyNoColor@
+\xydef@\xyNoColor@@#1#2{\xycolorwarning@}
+
+\xydef@\xycolor@{\xycolor@@}
+\xylet@\xylocalColor@=\xyNoColor@@
+
+\xydef@\UnloadColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+% \let\xycolor@=\xyNoColor@
+ \let\xycolor@@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@ }
+\xylet@\UnloadColor@@=\UnloadColor@
+
+\xyaddunsupport{color}{\UnloadColor@@\relax}
+\DOCMODE)
+
+This next macro is to inherit a default colour from the surrounding
+document, perhaps using one already defined by \LaTeXe
+
+\DOCMODE(
+\ifx\current@color\undefined \xydef@\xybasecolor@{}%
+\else \def\xybasecolor@{\current@color}\fi
+
+%\xydef@\xycmath@{\hbox\bgroup\dimen@=.55ex \checkxycolor@ \xyinside@}
+%\xydef@\xycnomath@{\hbox\bgroup\dimen@=\z@ \checkxycolor@ \xyinside@}
+
+%\xydef@\checkxycolor@{\ifx\xybasecolor@\empty\else
+% \expandafter\imposexycolor@\fi}
+%\xydef@\imposexycolor@{\xylocalColor@}
+\DOCMODE)
+
+A commonly used method is to maintain a colour-stack.
+The following commands are for use with such a setup, however they should
+only be called from code installed from a <driver>-file. Different drivers
+may do things differently; e.g. |dvips| uses a single |\special| via:
+|\def\xycolor@push@@#1{\special{color push #1}}|, but Textures uses two:
+|\xydef@\xycolor@push#1{\special{color push}\special{color #1}}|.
+Since the colour-stack idea was proposed by Tomas Rokicki,the |dvips| method
+is the default behaviour.
+
+\DOCMODE(
+\xydef@\xystackcolor@{\bgroup \DN@##1##2{\egroup}%
+ \ifInvisible@\else\ifHidden@\else\DNii@{\no@@}\ifx\nextii@\Connect@@
+ \else\DN@{\xystackcolor@i}\fi\fi\fi \next@ }
+
+\xydef@\xystackcolor@i#1#2{\checkXyStyle@
+ \DN@{#2}\ifx\next@\empty
+ \def\tmp@##1{\DN@{\xycolor@push{#1}##1\xycolor@pop}}%
+ \else\def\tmp@##1{\DN@{\xycolor@push{#2 #1}##1\xycolor@pop}}\fi
+ \toks@={\egroup \let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\tmp@\expandafter{\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}\def\Connect@@}%
+ \expandafter\tmp@\expandafter{\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}}%
+ \the\toks@ }%
+
+\xydef@\xycolor@push@@#1{\special{color push #1}}
+\xydef@\xycolor@pop{\special{color pop}}
+\xylet@\xycolor@push=\xycolor@push@@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Named colours and colour models}
+
+New colour names are created with |\newxycolor|, taking two arguments.
+Firstly a name for the colour is given, followed by the code which will
+ultimately be passed to the output device in order to specify the colour.
+If the current driver cannot support colour, or grayscale shading, then
+the new name will be recognised, but ignored during typesetting.
+
+\DOCMODE(
+\xydef@\newxycolor#1#2{\newxyColor{#1}{}{}{#2}{}}
+\xydef@\newxyColor#1#2#3#4{\newxycolor@{#1}{#2}{#3}{#4}{}}
+\DOCMODE)
+
+For \PS\ devices, the \Xy-ps \PS\ dictionary defines operators |rgb|,
+|cmyk| and |gray| corresponding to the standard RGB and CMYK colour models
+and grayscale shadings.
+Colours and shades are described as:
+$r\;g\;b$ |rgb| or $c\;m\;y\;k$ |cmyk| or $s$ |gray|, where the parameters
+are numbers in the range $0\le r,g,b,c,m,y,k,s\le 1$.
+The operators link to the built-in colour models
+ or, in the case of |cmyk| for earlier versions of \PS, give a simple
+emulation in terms of the RGB model.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Existing color names can be overridden using |\newxycolor@#1#2\relax|.
+
+\DOCMODE(
+\xydef@\newxycolor@#1#2#3#4#5{%
+ \expandafter\let\expandafter\next@\csname shape [#1]\endcsname
+ \ifx\next@\relax
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{}{#3}\xycolor@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#2 #3}}}%
+ \fi
+ \else\DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{#4}{}\xycolor@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#4}}}%
+ \fi \fi
+ \else \def\tmp@{\relax}\DNii@{#5}%
+ \ifx\nextii@\tmp@
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{}{#3}\xycolor@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#2 #3}}}%
+ \fi
+ \else
+ \DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalColor@{#4}{}\xycolor@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalColor@{#2}{#3}\xycolor@{#4}}}%
+ \fi \fi
+ \else\DN@{}\fi\fi \next@\relax}
+\DOCMODE)
+
+Standard colour names which are defined automatically correspond
+to the three primaries |red|, |green|, |blue| and their complements
+|cyan|, |magenta|, |yellow| as well as three extreme grayscale shades
+|black|, |white|, |gray|.
+
+\DOCMODE(
+\xydef@\xystandardcolors@{%
+% \newxycolor@{black}{1.}{gray}{}\relax % Textures reverses gray-scales
+% \newxycolor@{white}{0.}{gray}{}\relax %
+% \newxycolor@{black}{0.}{gray}{}\relax % This is normal for PostScript
+% \newxycolor@{white}{1.}{gray}{}\relax %
+ \newxycolor@{black}{0. 0. 0.}{rgb}{}\relax % avoid the hassles.
+ \newxycolor@{white}{1. 1. 1.}{rgb}{}\relax %
+ \newxycolor@{gray}{.5}{gray}{}\relax
+ \newxycolor@{grey}{.5}{gray}{}\relax
+ \newxycolor@{red}{1. 0. 0.}{rgb}{}\relax
+ \newxycolor@{green}{0. 1. 0.}{rgb}{}\relax
+ \newxycolor@{blue}{0. 0. 1.}{rgb}{}\relax
+ \newxycolor@{cyan}{0. 1. 1.}{rgb}{}\relax
+ \newxycolor@{magenta}{1. 0. 1.}{rgb}{}\relax
+ \newxycolor@{yellow}{1. 1. 0.}{rgb}{}\relax
+ \xyuncatcodes }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\NOTE: The driver file must call |\xystandardcolors@| before these colours
+become accessible. This is to allow any <driver>-specific definitions
+to be active when these colours are defined.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Saving colour and styles}
+%
+When styles are saved using |[=|<word>|]|, see~??c[[=],
+then the current colour setting (if any) is saved also.
+Subsequent use of |[|<word>|]| recovers the colour and accompanying
+line-style settings.
+
+Further colour names are defined by the command |\UseCrayolaColours| that
+loads the |crayon| option, in which more colours are defined. Consult the
+file |xyps-col.doc| for the colours and their specifications in the RGB
+or CMYK models.
+
+\DOCMODE(
+\xydef@\UseCrayolaColors{\xyrequire{crayon}\xyuncatcodes}%
+% \xyinputorelse@{xyps-col}{\xyerror@{Could not load xyps-col}{}}}
+\DOCMODE)
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\subparagraph*{xyps-col.tex:}
+\subparagraph*{xycrayon.tex:}
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\subsubsection{{\tt xyps-col.doc}:}
+\subsubsection{{\tt xycrayon.doc}:}
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\inputdoc!{xyps-col.doc}
+\inputdoc!{xycrayon.doc}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{\PS\ colour}
+%
+When \PS\ driver support is available, the method for handling colour
+within diagrams may be different. The reason for this is that some
+dvi-drivers reset the colour to black before placing the contents of the
+|\special|. To counter this, the \PS\ code maintains its own colour-stack.
+Support is established within a separate file |xyps-c.tex|, loaded from
+the appropriate <driver>-files.
+
+\DOCMODE(
+\xydef@\xyBEcolorcheck@{\ifx\xycolor@@\xyNoColor@\else
+ \xywarning@{PostScript colour support should be OK.}\fi }%
+
+\xywithoption{ps}{%
+ \xyinputorelse@{xyps-c}{\xyerror@{Could not load xyps-c}{}}}%
+ \xycatcodes
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xycolor.doc,v $
+% Revision 3.3 1996/12/19 03:50:08 ross
+% Maintenance release.
+%
+% Revision 3.3 1996/12/18 08:56:49 ross
+% minor updates
+%
+% Revision 3.2 1995/09/19 18:20:20 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/06 02:56:02 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.10 1994/06/15 12:46:03 ross
+% Second release 3beta.
+% Colour and line style saving works; label colouring bug fixed.
+%
+% Revision 2.9 1994/06/09 14:39:49 ross
+% Release 3beta.
+%
+% NEW for version 2.9 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xycrayon.doc b/Master/texmf-dist/source/generic/xypic/xycrayon.doc
new file mode 100644
index 00000000000..4be9d637d29
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xycrayon.doc
@@ -0,0 +1,82 @@
+%% $Id: xycrayon.doc,v 3.3 1996/12/18 08:58:16 ross Exp $
+%%
+%% Xy-pic ``Crayola colours'' PostScript backend support.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{crayon}{Crayola Colours}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This option provides the command to install definitions for the 68 colours
+recognised by name by Tomas Rokicki's |dvips| driver~\cite{dvips}.
+This command must be called from a <driver>-file which can actually
+support the colours.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\DOCHEADER
+
+The colour definitions themselves are in the file |xyps-col.tex|.
+They are not loaded directly here since it is not known which <driver> is
+to be used. Different <driver>s may redefine the |\xynewcolor@| macro
+to set the colour by name or colour-model.
+
+\DOCMODE(
+\xydef@\installCrayolaColors@{%
+ \xyinputorelse@{xyps-col}{\xyerror@{Could not load Crayola colours}{}}%
+ \let\installCrayolaColors@=\relax
+ \xyuncatcodes }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xycrayon.doc,v $
+% Revision 3.3 1996/12/18 08:58:16 ross
+% cosmetic updates
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/05 07:58:43 ross
+% Ready for v3 release?
+%
+#
+% NEW for version 3.1 by Ross Moore 1995/03/18.
+%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xycurve.doc b/Master/texmf-dist/source/generic/xypic/xycurve.doc
new file mode 100644
index 00000000000..0c14745e7c0
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xycurve.doc
@@ -0,0 +1,4920 @@
+%% $Id: xycurve.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Curves and Splines'' extension.
+%% Copyright (c) 1993-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{curve}{Curve and Spline extension}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This option provides \Xy-pic with the ability to typeset spline curves
+by constructing curved connections using arbitrary directional objects
+and by encircling objects similarly. "Warning": Using curves can be
+quite a strain on \TeX's memory; you should therefore limit the length
+and number of curves used on a single page. Memory use is less when
+combined with a backend capable of producing its own curves; \eg, the
+\PS\ backend).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Curved connections}
+??=[curved connections]
+
+\DOCMODE(
+\message{curve,}
+\DOCMODE)
+
+ Simple ways to specify curves in \Xy-pic are as follows:
+ \begin{defs}
+|**\crv{|<poslist>|}| & curved connection \cr
+|**\crvs{|<dir>|}| & get <poslist> from the stack \cr
+|\curve{|<poslist>|}| & as a <decor>ation \cr
+ \end{defs}
+\noindent\unskip
+ in which <poslist> is a list of valid <pos>itions.
+ The decoration form |\curve| is just an abbreviation for |\connect\crv|.
+ As usual, the current $p$ and $c$
+ are used as the start and finish of the connection, respectively.
+ Within <poslist> the <pos>itions are separated by |&|.
+A full description of the syntax for |\crv| is given in figure~??[f.curve].
+
+\begin{code}
+\xy (0,20)*[o]+{A};(60,0)*[o]+{B}="B"
+**\crv{}\POS?(.4)*_+!UR{0},"B"
+**\crv{(30,30)}\POS?*^+!D{1},"B"
+**\crv{(20,40)&(40,40)} \POS?*^+!D{2},"B"
+**\crv{(10,20)&(30,20)&(50,-20)&(60,-10)}
+\POS?*+^!UR{4} \endxy
+\end{code}
+$$\docode$$\goodbreak\goodbreak
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+We need a counter to track the number of control points, (i.e. the number of
+<pos>s in <poslist>) and provide a macro to read it.
+Also a token list which will store the vital information for
+later use, to allow curved connections to work properly.
+
+\DOCMODE(
+\xynew@{count}\crv@cnt@
+\xydef@\xynumctrlpts@{\the\crv@cnt@}
+\xynew@{toks}\crvpts@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+If <poslist> is empty a straight connection is computed.
+When the length of <poslist> is one or two then the curve is uniquely
+determined as a single-segment B\'ezier quadratic or cubic spline.
+The tangents at $p$ and $c$ are along the lines connecting
+with the adjacent control point.
+With three or more <pos>itions a cubic B-spline construction is used.
+B\'ezier cubic segments are calculated from the given control points.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\setcurve@{%
+ \edef\xysplineparams@{%
+ \expandafter\noexpand\csname params@\endcsname}%
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \edef\xycrvcnt@{%
+ \expandafter\noexpand\csname crvcnt@\endcsname}%
+ \expandafter\edef\xycrvcnt@{\number\crv@cnt@}%
+ \ifcase\crv@cnt@
+ \expandafter\xycvxhull@\or
+ \expandafter\xyquadbezier@\or
+ \expandafter\xycubicbezier@\or
+ \expandafter\xybspline@iii\or
+ \expandafter\xybspline@iv\else
+ \expandafter\xybspline@
+ \fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The previous picture was typeset using:
+\begin{code}
+\xy (0,20)*+{A};(60,0)*+{B}
+**\crv{}
+**\crv{(30,30)}
+**\crv{(20,40)&(40,40)}
+**\crv{(10,20)&(30,20)&(50,-20)&(60,-10)}
+\endxy
+\end{code}
+\displaycode
+\noindent except for the labels, which denote the number of entries in the
+<poslist>. (Extending this code to include the labels is set below as
+an exercise).
+
+\begin{code}
+\xy (0,20)*[o]+{A};(60,0)*[o]+{B}="B"
+**\crv{} \POS?(.4)*_+!UR{0},"B"
+**\crv{(30,30)} \POS?*^+!D{1},"B"
+**\crv{(20,40)&(40,40)} \POS?*^+!D{2},"B"
+**\crv{(10,20)&(30,20)&(50,-20)&(60,-10)}
+\POS?*+^!UR{4} \endxy
+\end{code}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The |?|-operator of \S??g[xy.doc:pos] (note~??g[xy.doc:<place>])
+ is used to find arbitrary <place>s along a curve in the usual way.
+
+\begin{exercise}
+Extend the code given for the curves in the previous picture
+so as to add the labels giving the number of control points.
+\answertext{This is the code that was actually used:}
+\answercode
+\answertext\displaycode
+\end{exercise}
+
+ Using |?| will set the current direction to be tangential at that
+ <place>, and one can <slide> specified distances
+ along the curve from a found <place> using the |?|\dots|/|<dimen>|/|
+ notation:
+
+\begin{code}
+\xy (0,20)*+{A};(60,0)*+{B}
+**\crv{(10,20)&(30,20)&(50,-20)&(60,-10)}
+ ?<*\dir{<} ?>*\dir{>}
+ ?(.65)*{\oplus} *!LD!/^-5pt/{x}
+ ?(.65)/12pt/*{\oplus} *!LD!/^-5pt/{x'}
+ ?(.28)*=0{\otimes}-/40pt/*+{Q}="q"
+ +/100pt/*+{P};"q" **\dir{-}
+\endxy
+\end{code}
+
+$$\docode$$
+
+\begin{exercise}
+Suggest code to produce something like the above picture;
+the spline curve is the same as in the previous picture.
+"Hints": The line is 140pt long and touches $0.28$ of the way from
+$A$ to $B$ and the $x$ is 0.65 of the way from $A$ to $B$.
+\answertext{This is the code that was used to typeset the picture:}
+\answercode
+\answertext\displaycode
+\end{exercise}
+
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The positions in <poslist> specify
+{\em control points\/} which determine the initial and final directions
+of the curve---leaving $p$ and arriving at $c$---and how the curve
+behaves in between, using standard spline constructions.
+In general, control points need not lie upon the actual curve.
+
+A natural spline parameter varies in the interval $[0,1]$ monotonically
+along the curve from $p$ to $c$. This is used to specify <place>s along
+the curve, however there is no easy relation to arc-length.
+Generally the parameter varies more rapidly where the curvature is
+greatest. The following diagram illustrates this effect for a cubic
+spline of two segments (3 control points).
+
+\begin{code}
+\def\ssz#1{\hbox{$_{^{#1}}$}}
+\xy (0,0)*+{A};(30,-10)*+{B}="B",**\dir{-},
+"B"**\crv{(5,20)&(20,25)&(35,20)}
+ ?<(0)*\dir{<}="a" ?>(1)*\dir{>}="h"
+ ?(.1)*\dir{<}="b" ?(.9)*\dir{>}="i"
+ ?(.2)*\dir{<}="c" ?(.8)*\dir{>}="j"
+ ?(.3)*\dir{<}="d" ?(.7)*\dir{>}="k"
+ ?(.4)*\dir{<}="e" ?(.6)*\dir{>}="l"
+ ?(.5)*\dir{|}="f",
+ "a"*!RC\txt{\ssz{(\lt)}};
+ "h"*!LC\txt{\ssz{\;(\gt)}},**\dir{.},
+ "b"*!RD{\ssz{.1}};
+ "i"*!L{\ssz{\;.9}},**\dir{-},
+ "c"*!RD{\ssz{.2}};
+ "j"*!L{\ssz{\;.8}},**\dir{-},
+ "d"*!RD{\ssz{.3}};
+ "k"*!L{\ssz{\;.7}},**\dir{-},
+ "e"*!RD{\ssz{.4}};
+ "l"*!LD{\ssz{.6}},**\dir{-},
+ "f"*!D!/^-3pt/{\ssz{.5}}
+\endxy
+\end{code}
+$$\docode$$
+
+\begin{exercise}
+Write code to produce a picture such as the one above.
+("Hint": Save the locations of places along the curve for later
+use with straight connections.)
+\answertext{Here is the code that was used to typeset the picture:}
+\answercode
+\answertext\displaycode
+\end{exercise}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+To have the same <pos> occuring as a multiple control point simply use
+a delimiter, which leaves the <pos> unchanged. Thus
+|\curve{|<pos>|&}| uses a cubic spline, whereas |\curve{|<pos>|}| is
+quadratic.
+
+Repeating the same control point three times in succession results in
+straight segments to that control point. Using the default styles this
+is an expensive way to get straight lines, but it allows for extra
+effects with other styles.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Curve Objects:}
+
+At present the syntax is supported for using a |\curve| object only
+as a decoration, constructed from a |\crv| object used as a connection.
+
+\DOCMODE(
+\xydef@\curve{\connect\crv}
+\DOCMODE)
+
+The more general |\crv| object currently works as a connection.
+In future this object-type will be extended to allow closed curves as
+the boundaries of objects.
+
+\DOCMODE(
+\xydef@\crv#1#{\hbox \bgroup \crvresetbreaks@ \initshape@
+ \def\pure@crv{\crv@saveStyles@}\crv@{#1}}
+
+\xydef@\crv@#1#2{%
+ \DN@{#1}\ifx\empty\next@
+ \DN@{\def\afterCURVEaction@{}\parsecurve@\xycurve@@}%
+ \else\DN@{\parseCURVE@#1\parsecurve@\curveSTYLE@}\fi
+ \next@ #2\@endcurve\endcrv@ }
+
+\xydef@\curveSTYLE@{\xycurve@@}% default style
+\xydef@\afterCURVEaction@{}% default after-curve action
+\xydef@\@endcurve{}%
+\xydef@\endcrv@@{\endcrv@\POS}%
+\xydef@\pure@crv{\relax}
+\DOCMODE)
+
+ The |\@endcurve| inserted here ensures that subsequent parsing
+ with |\checkendcurve@| (see below) will terminate cleanly.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The |\crvs| object has restricted functionality with choice of styles and
+is always used for curves only.
+It has a single braced argument which can be used to set curve styles.
+Its main use is for re-typesetting different portions of the same curve,
+for example the subsegments of a curved arrow/path segment.
+
+This is done by first examinining |\bstartPLACE@|.
+If |\relax| or undefined, then the curve is set using |\@crv@| to
+decide the style. If |\bstartPLACE@| is |\empty| then the curve is fully
+processed as a connection but nothing is actually typeset; this is used
+by curved arrows where the curve is first set as ``invisible'' before
+breaks and labels are processed.
+When |\bstartPLACE@| contains a number, normally within the range 0 to 1,
+this is interpreted as a <place> along a curved connection that has already
+been established. No typesetting may occur before this <place>.
+
+In this case the control point information is discarded since the curve
+can be recovered using |\splinereset@|. The current $p$ and $c$ are no
+longer the endpoints of the curve but are <pos>itions along the curve
+between which the typesetting should occur.
+The value of |\bstartPLACE@| is typically a <place> along the curve
+which is within the <pos> at $p$. It is used to help locate the edge of
+this <pos> where typesetting should commence.
+Similarly |\bendPLACE@| is typically a <place> along the curve
+which is within the <pos> at $c$.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xywarnifdefined\crv@normaltemplate
+\xywarnifdefined\crv@othertemplate
+\xywarnifdefined\crv@specialtemplate@@
+{\xyuncatcodes \catcode`\@=11 \catcode`\#=6
+ \gdef\crv@normaltemplate#1{{}{~**#1\xy@@crvaddstack@}}
+ \gdef\crv@othertemplate#1{{}{~*=<2\jot>{}~**#1\xy@@crvaddstack@}}
+ \gdef\crv@specialtemplate@@#1{{}{~**\dir{#1}\xy@@crvaddstack@}}
+}
+
+\xydef@\crvs#1#{\hbox \bgroup \def\pure@crv{\relax}\crvs@{#1}}%
+\xydef@\crvi#1#{\hbox \bgroup \def\pure@crv{\relax}\invisbreaks@ \crvs@{#1}}%
+
+\xydef@\crvs@#1{\DN@{\initshape@ \@crv@{#1}}%
+ \def\crv@defaultshape{-}%
+ \ifx\bstartPLACE@\relax \else
+ \ifx\bstartPLACE@\empty \Invisible@true \else
+\splinetrace@{bstartPLACE@=\bstartPLACE@, bendPLACE@=\bendPLACE@}%
+ \DN@{\let\xy@@crvaddstack@=\xy@@samecurve@
+ \let\saveshape@=\savesame@
+ \let\savectrlptsnum@=\relax
+ \let\startxycurve@=\recovercurve@
+ \crv@cnt@=\xycrvptsnum@\relax \@crv@{#1}}%
+ \fi \fi \next@ }
+
+
+
+\xydef@\xy@@samecurve@{\xyFN@\checkendcurve@}
+\xydef@\savesame@{\egroup }
+\xydef@\recovercurve@{%
+ \crv@cnt@=\xycrvptsnum@ \splinereset@ \recovercv@end
+ \ifx\bendPLACE@\relax \def\bendPLACE@{1}\fi
+ \ifdim\zz@\R@c \ifdim\zz@\L@c \ifdim\zz@\D@c \ifdim\zz@\U@c
+ \Edge@c={\zeroEdge}\fi\fi\fi\fi
+ \edef\cv@end{\cfromthec@}\edef\cv@start{\cfromthep@}}
+
+\xydef@\recovercv@end{\count@=\ptsnum@\relax\advance\count@\@ne
+ \edef\tmp@{\the\count@}\csname cv@\tmp@\endcsname}%
+
+\xydef@\crvSTYLE@@{}
+\expandafter\xydef@\expandafter\crv@defaultshape\expandafter{\addDASH@{}}
+\xydef@\crv@noobject{\Invisible@true}
+
+\xydef@\@crv@#1#2{\DN@{#1#2}%
+ \ifx\next@\empty \edef\next@{\crv@defaultshape}%
+ \ifx\bstartPLACE@\empty \xdef\crvSTYLE@@{{\crv@defaultshape}}\fi
+ \else
+ \ifx\bstartPLACE@\empty \gdef\crvSTYLE@@{#1{#2}}\fi
+ \fi
+ \ifx\next@\empty \crv@noobject \DN@{\crv@{}{\xy@@crvaddstack@}}%
+ \else\def\tmp@{-}\ifx\next@\tmp@ \DN@{\crv@{}{\xy@@crvaddstack@}}%
+ \else\def\tmp@{=}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{=}}}%
+ \else\def\tmp@{2-}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{2.}}}%
+ \else\def\tmp@{3-}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{3.}}}%
+ \else\def\tmp@{--}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@specialtemplate@{--}}%
+ \else\def\tmp@{==}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir2{--}}}%
+ \else\def\tmp@{2--}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir2{--}}}%
+ \else\def\tmp@{3--}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir3{--}}}%
+ \else\def\tmp@{.}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@specialtemplate@{.}}%
+ \else\def\tmp@{:}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{:}}}%
+ \else\def\tmp@{2.}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@normaltemplate{\dir{:}}}%
+ \else\def\tmp@{..}\ifx\next@\tmp@
+ \DN@{\expandafter\crv@\crv@specialtemplate@{.}}%
+ \else
+ \DN@{\expandafter\crv@\crv@othertemplate{\dir#1{#2}}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xylet@\crv@specialtemplate@=\crv@specialtemplate@@
+\xydef@\crv@special#1{}
+\DOCMODE)
+
+\BUG: this should use a |\Step@@| method to get the spacing for dotting; this
+will eliminate the need for templates\dots
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{figure*}[tp]
+\begin{syntax}
+%
+ \multispan{3}{{\tt\string\curve}<modifier>|{|<curve-object><poslist>|}|\hfil}
+ & construct curved connection
+\cr
+%
+\noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+%
+ <modifier>
+ &\iss & <empty>
+ & zero or more modifiers possible; default is |~C|
+\cr
+ &\orr & |~|<curve-option> <modifier>
+ & set <curve-option>
+\cr
+%
+\noalign{\smallskip}
+%
+ <curve-option>
+ &\iss & |p|\orr|P|\orr|l|\orr|L|\orr|c|\orr|C|
+ & ??!^[show only] control points (|p|=points),
+ joined by lines (|l|=lines), or curve only (|c|=curve)
+\cr
+%
+ &\orr & |pc|\orr|pC|\orr|Pc|\orr|PC|
+ & show ??!^[control points] ??!^[and curve]
+\cr
+%
+ &\orr & |lc|\orr|lC|\orr|Lc|\orr|LC|
+ & show ??!^[lines joining] control points ??!^[and curve]
+\cr
+%
+ &\orr & |cC|
+ & plot curve twice, with and without specified formatting
+\cr
+%
+\noalign{\smallskip}
+%
+ <curve-object>
+ &\iss & <empty>
+ & use the appropriate default style
+\cr
+%
+ & \orr & |~*|<object> <curve-object>
+ & specify the ??!^[``drop'' object] and ??!^[maybe more]
+\cr
+%
+ & \orr & |~**|<object> <curve-object>
+ & specify ??!^[``connect'' object] and ??!^[maybe more]
+\cr
+%
+\noalign{\smallskip}
+%
+ <poslist>
+ &\iss & <empty> \orr\ <pos> <delim> <poslist>\kern-15pt
+ & \kern20pt list of positions for control points
+\cr
+%
+ &\orr & |~@| \orr\ |~@| <delim> <poslist>
+ & add the current ??!^[stack] to the control points
+\cr
+%
+\noalign{\smallskip}
+%
+ <delim>
+ & \iss & {\tt\&}
+ & allowable delimiter
+\cr
+%
+\end{syntax}
+\caption{Syntax for curves.}
+??=[f.curve]
+\vfil
+\end{figure*}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Parsing:}
+
+Two separate parsers are required: one for |\curve...|, the other for the
+contents of |{...}|.
+
+Set |\curveSTYLE@| to be the default of |\xycurve@@| then examine
+the following tokens to see if this must be changed.
+
+ Set |\curveSTYLE@| to be the default of |\xycurve@@| then examine
+ the following tokens to see if this must be changed.
+
+"Procedure": If the first token of |#1| (from |\crv@|) is |~| then
+ a letter should follow, determining how to set the style.
+ If instead it is an active control sequence then issue
+ a warning message, but let it do its thing anyway.
+ However |\parsecurve@| is a normal thing to encounter,
+ so no warning is required.
+ Currently a single letter without the |~| will be recognised,
+ but two-letter combinations definitely need the |~|.
+
+\DOCMODE(
+\xydef@\parseCURVE@{\def\curveSTYLE@{\xycurve@@}\def\afterCURVEaction@{}%
+ \xyFN@\parseCURVE@@}
+\xydef@\parseCURVE@@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\parseCURVE@@}% gobble spaces
+ \else\ifx ~\next \DN@ ~{\xy@~{}\xyFN@\setcurveSTYLE@@}%
+ \else\ifx\parsecurve@\next\DN@{}%
+ \else\ifcat\active\noexpand\next\DN@{\xyactive@Warning}%
+ \else\ifcat a\noexpand\next\DN@##1{\xytilde@Warning\setcurveSTYLE@{##1}%
+ \xyFN@\parseCURVE@@}%
+ \else\DN@{}\fi\fi\fi\fi\fi \next@ }%
+\DOCMODE)
+
+ Options are normally specified using |~|.
+ Sometimes this can be safely omitted; if such a case is
+ encountered then a warning message is issued advising to use |~|.
+ This nicety may be removed in future versions.
+
+\DOCMODE(
+\xydef@\xyactive@Warning{\xywarning@{expandable control sequences should
+ not be here, results are unpredictable in diagrams.}}% (2)
+\xydef@\xytilde@Warning{Please use ~ to set curve style.}% (3a)
+\DOCMODE)
+
+ Examine the next token to see if it determines a curve style.
+ Currently only |p|, |l| and |c| are recognised, along with
+ the uppercase variants |P|, |L| and |C|.
+ When one of these letters is encountered, set |\curveSTYLE@|
+ and keep examining tokens with |\setafterCURVEaction@|.
+
+\DOCMODE(
+\xydef@\setcurveSTYLE@#1{\xyFN@\setcurveSTYLE@@#1}
+\xydef@\setcurveSTYLE@@{%
+ \ifx\next p\def\curveSTYLE@{\xyc@trlpts@@}%
+ \DN@ p{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next P\def\curveSTYLE@{\xyc@trlpts@}%
+ \DN@ P{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next l\def\curveSTYLE@{\xyc@vxhull@@}%
+ \DN@ l{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next L\def\curveSTYLE@{\xyc@vxhull@}%
+ \DN@ L{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next c\def\curveSTYLE@{\xycurve@@}%
+ \DN@ c{\xyFN@\setafterCURVEaction@}%
+ \else\ifx\next C\def\curveSTYLE@{\xycurve@@}%
+ \DN@ C{\xyFN@\setafterCURVEaction@}%
+ \else \DN@##1{\xywarning@{unknown curve style ##1}\xyFN@\parseCURVE@@}%
+ \fi\fi\fi\fi\fi\fi \next@ }
+\DOCMODE)
+
+ |\setafterCURVEaction@| examines tokens to see if a 2-letter
+ combination is being specified; e.g. |pc|, |lC|, etc.
+ Alternatively another |~| can set a new specification.
+
+\DOCMODE(
+\xydef@\setafterCURVEaction@{%
+ \ifx\next~\DN@~{\xyFN@\setcurveSTYLE@@}%
+ \else\ifcat a\noexpand\next\DN@{\setafterCURVEaction@@}%
+ \else\DN@{\xyFN@\parseCURVE@@}%
+ \fi\fi \next@}
+\DOCMODE)
+
+ Currently the only 2-letter specifications have either
+ |c| or |C| as the 2nd letter.
+
+\DOCMODE(
+\xydef@\setafterCURVEaction@@{%
+ \ifx\next c\DN@ c{%
+ \def\afterCURVEaction@{\noexpand\endcurve\noexpand\xy@curve@}%
+ \xyFN@\parseCURVE@@ }%
+ \else\ifx\next C\DN@ C{%
+ \def\afterCURVEaction@{\noexpand\endcurve\noexpand\xy@curve@@}%
+ \xyFN@\parseCURVE@@ }%
+ \else \DN@##1{\xywarning@{unknown after-curve action ##1}%
+ \xyFN@\parseCURVE@@ }%
+ \fi\fi \next@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ When |\parsecurve@| is encountered, this signifies the end
+ of this part of the parsing. The only active control
+ sequence that should be encountered legitimately here is
+ |\@endcurve|, which signifies that the <poslist> is
+ empty and default styles are required. Otherwise assume we
+ the subsequent tokens are from |#2| of |\crv@|. Control
+ passes to |\xycurve@@| to prepare for reading the <crv-object>s
+ and <poslist>.
+
+\DOCMODE(
+\xydef@\parsecurve@{\xyFN@\parsecurve@@}
+\xydef@\parsecurve@@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\parsecurve@@}%
+ \else\ifx\next\@endcurve\DN@\@endcurve{\checkafterCURVE@}%
+ \else\ifcat\active\noexpand\next\DN@{\relax}%
+ \else\DN@{\xycurve@@}\fi\fi\fi\next@}%
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xycurve@{\begingroup\afterCURVE{\setcurve@\endgroup}\crvobjects@
+ \startxycurve@\xycrvmods@}
+\xydef@\xycurve@@{\afterCURVE{\setcurve@}\crvobjects@\startxycurve@
+ \xycrvmods@}
+\xydef@\xy@curve@{\xy@curve@@@{\splinedefaulttol@\crvobjects@}}
+\xydef@\xy@curve@@{\xy@curve@@@{\resetcrvobjects@}}
+\xydef@\xy@curve@@@#1{\ifx\cv@start\relax
+ \DN@{\xywarning@{There is no curve to plot}}.
+ \else\DN@{\begingroup\afterCURVE{\setcurve@\endgroup}#1\cv@end}%
+ \fi \next@ }
+\xydef@\crvobjects@{\def\xycrvdrop@{}\def\xycrvconn@{}}
+\xydef@\resetcrvobjects@{\crvobjects@}
+\DOCMODE)
+
+ These were originally provided for sophisticated-user access.
+ They are otherwise undocumented and may be removed.
+
+\DOCMODE(
+\xylet@\savecurve=\xycurve@@
+\xylet@\samecurve=\xy@curve@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ |\xy@crvmods@| handles reading the <curve-object>s,
+ \ie\ the ``drop'' object and the ``connect'' object.
+
+\medskip
+"Procedure":??_[crvob1]~Get next token.??_[crvob2]~Is it a |~|?
+ ??_[crvob4]~If not, exit.
+??_[crvob2a]~If so, is it followed by a |*|?
+??_[crvob2b]~If not, issue a message and go back to ??_[crvob1].
+ Otherwise, ??_[crvob3]~is there a second |*|?
+??_[crvob3a]~If not then read and store the ``drop'' object,
+??_[crvob3b]~else, read and store the ``connect'' object.
+When finished, in either case, ??_[crvob5]~look for further specifications.
+??_[crvob3c]~An empty ``drop'' object is not allowed, so this actually
+gives the default of |\zerodot|.
+
+\DOCMODE(
+\xydef@\xycrvmods@{\xyFN@\xy@crvmods@}%?*[crvob1]
+
+\xydef@\xy@crvmods@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\xy@crvmods@}%gobble spaces
+ \else\ifx\next ~\DN@ ~{\xyFN@\xy@crvmods@@}%?*[crvob2]
+ \else\DN@{\xy@crvmods@@@@}\fi\fi \next@}%?*[crvob4]
+\xydef@\xy@crvmods@@@@{\xyFN@\checkendcurve@}%
+
+\xydef@\xy@crvmods@@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\xy@crvmods@@}%gobble spaces
+ \else\ifx\next *\DN@ *{\xyFN@\xy@@crvmods@}%?*[crvob2a]
+ \else\addAT@\ifx\next\addAT@\DN@{\xyFN@\xy@@crvaddstack}%
+ \else\DN@{\xywarning@{badly-formed curve option}\xyFN@\xy@crvmods@}%?*[crvob2b]
+ \fi\fi\fi \next@}%
+
+\xydef@\xy@@crvmods@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\xy@@crvmods@}%gobble spaces
+ \else\ifx\next *\DN@ *{\xyFN@\xy@@crvmods@@}%?*[crvob3]
+ \else\DN@{\xy@crv@mods@@}\fi\fi \next@}%?*[crvob3a]
+
+\xydef@\xy@crv@mods@@#1#{\DN@##1{\xy@crvmods@@@{#1}{##1}}\next@}%
+\xydef@\xy@crvmods@@@#1#2{%
+ \DN@{#1#2}\ifx\next@\empty \def\xycrvdrop@{ #1{\zerodot}}%?*[crvob3c]
+ \else \def\xycrvdrop@{ #1{#2}}\fi
+ \xyFN@\xy@crvmods@ }%?*[crvob5]
+
+\xydef@\xy@@crvmods@@#1#{\DN@##1{\xy@@crvmods@@@{#1}{##1}}\next@}%?*[crvob3b]
+\xydef@\xy@@crvmods@@@#1#2{\def\xycrvconn@{ #1{#2}}\xyFN@\xy@crvmods@ }%
+\DOCMODE)
+%
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Parsing of the <poslist> is quite simple, recognising few special tokens:
+
+\begin{itemize}
+\item
+ |\endcurve| and |\endxy| terminate reading of control points.
+\item
+ |&|, |\\| and |\relax| delimit $<pos>$itions
+\item
+ anything else is treated as a $<pos>$, being handled by the |\POS@|
+ parser.
+\end{itemize}
+
+\DOCMODE(
+\xydef@\checkendcurve@{%
+ \ifx\space@\next\expandafter\DN@\space{\xyFN@\checkendcurve@}%gobble spaces
+ \else\ifx\next\endcurve\DN@\endcurve{\clearsearchflag@\endxycurve@}%
+ \else\ifx\next\@endcurve\DN@\@endcurve{\checkafterCURVE@}%
+ \else\ifx\next\xy@@crvaddstack@\DN@{}%
+ \else\ifx\next\endxy\DN@{\clearsearchflag@\sloppyendcrv@}%
+% \else\addAND@\ifx\next\addAND@\DN@{\clearsearchflag@\searchnextpt@}%
+ \else\testAND@\iffalse \DN@##1{\clearsearchflag@\searchnextpt@}%
+ \else\ifx ~\next\DN@ ~{\xyFN@\checkcrvtilde@}%
+ \else\ifx\next\relax\DN@\relax{\clearsearchflag@\searchnextpt@}%
+ \else\ifx\next\\\DN@\\{\clearsearchflag@\searchnextpt@}%
+ \else\ifx\searchflag@\relax
+ \DN@{\setsearchflag@\searchnextpt@}%
+ \else\DN@##1{\flagwarn@{##1}}\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi \next@ }
+\xydef@\searchnextpt@{\afterPOS{\xy@@\addtocrv@ \xyFN@\checkendcurve@}}
+\DOCMODE)
+
+There could be a problem in that an invalid token would cause
+an infinite loop, passing back and forth between |\checkendcurve@|
+and |\POS@|. This is avoided by setting a flag |\setsearchflag@|
+when the |\POS@| parser is called, not following a valid delimiter.
+Encountering a valid delimiter clears the flag. If |\checkendcurve@|
+is called with the flag set, a warning message is issued
+and the token is skipped; the flag remains set.
+Processing continues, but it is possible that the wrong number of
+positions will be read; presumably there is some kind of error that
+needs to be fixed anyway.
+
+\DOCMODE(
+\xydef@\checkafterCURVE@{%
+ \edef\tmp@{\noexpand\xyFN@\noexpand\checkendcurve@ %
+ \afterCURVEaction@\noexpand\endcurve}\tmp@ }
+
+\xylet@\searchflag@=\relax
+\xydef@\setsearchflag@{\let\searchflag@=@}
+\xydef@\clearsearchflag@{\let\searchflag@=\relax}
+\xydef@\flagwarn@#1{%
+ \ifx\next\@endcurve\DN@{\xyFN@\checkendcurve@\endcurve}%
+ \else\setsearchflag@\DN@{\xyFN@\checkendcurve@}%
+ \xywarning@{skipping invalid token \string#1\space in curve}%
+ \fi \next@ }
+\DOCMODE)
+
+It is possible for the final |\endcurve| to be omitted, but only when the
+next token is |\endxy|. A warning message is written to the log file,
+protesting against this sloppy \TeX-ing.\smiley
+
+\DOCMODE(
+\xydef@\sloppyendcrv@{%
+\xywarning@{Please use \string\endcurve\space to end the curve.}\endxycurve@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Creation of the |\crv| is completed when |\endcrv@| is encountered.
+ At this point the usual methods |\Drop@@| and |\Connect@@| are
+ defined. Extra information is retained, using |\saveshape@| and
+ |\savecrvparams@| for the benefit of methods which treat the curve
+ as a connection.
+
+\DOCMODE(
+\xydef@\endcrv@{\saveshape@ %\def\Upness@{0}%
+ \Edge@c={\splineEdge}\Invisible@false\Hidden@false
+ \edef\Drop@@{\noexpand\ifInvisible@ \setbox\z@=\copy\voidb@x
+ \noexpand\else
+ \noexpand\wdz@=\z@
+ \noexpand\ht\z@=\z@ \noexpand\dp\z@=\z@
+ \noexpand\splineDrop@
+ \noexpand\fi }%
+%
+ \edef\Connect@@{%
+ \noexpand\setbox\z@=\noexpand\box\lastobjectbox@
+ \noexpand\wdz@=\z@
+ \noexpand\ht\z@=\z@ \noexpand\dp\z@=\z@
+ \expandafter\noexpand\pure@crv
+ \noexpand\ifInvisible@ \noexpand\crv@saveStyles@ \noexpand\else
+ \noexpand\crv@getStyles@\noexpand\styledboxz@ \noexpand\fi
+%
+ \noexpand\ifHidden@\noexpand\else
+ \noexpand\ifx\noexpand\COORD@\noexpand\xymatrixCOORD@ \noexpand\else
+ \noexpand\X@min=\the\X@min \noexpand\X@max=\the\X@max
+ \noexpand\Y@min=\the\Y@min \noexpand\Y@max=\the\Y@max
+ \noexpand\fi \noexpand\fi
+ \savecrvparams@ \noexpand\crvconnect@ %\noexpand\initbreaks@
+ }%
+ \wdz@=\z@
+ \ht\z@=\z@ \dp\z@=\z@ }
+\DOCMODE)
+
+The control names |\crvXY@pre@| and |\crvXY@post@| are used to
+transfer style information passed with |\preconnect@| to subsegments.
+
+\DOCMODE(
+\xydef@\crvXY@pre@{}
+\xydef@\crvXY@post@{}
+
+\xydef@\crv@saveStyles@{\def\xy@style@{}%
+ \expandafter\def\expandafter\crvXY@pre@\expandafter{\preXY@style@}%
+ \expandafter\def\expandafter\crvXY@post@\expandafter{\postXY@style@}}
+
+\xydef@\crv@getStyles@{\def\xy@style@{}%
+ \gdef\preXY@style@{\crvXY@pre@}\gdef\postXY@style@{\crvXY@post@}}
+\DOCMODE)
+
+ The values of |\X@min|, |\X@max|, \etc\ are used to compute the extents
+ |\L@c|, |\R@c|, \etc\ of the object. This information must be maintained
+ after the group is closed, unless the ``hidden'' attribute is required
+ or we are inside a matrix construction.
+
+ In calculating the size of the box containing the curve |\X@min|,
+ |\X@max|, \etc\ are initialised to describe the minimum rectangle
+ enclosing $p$ and $c$. At the same time we save the current scope.
+
+\DOCMODE(
+\xydef@\initshape@{\savescope@
+ \ifdim\X@c>\X@p \X@min=\X@p \X@max=\X@c \else \X@max=\X@p \X@min=\X@c \fi
+ \ifdim\Y@c>\Y@p \Y@min=\Y@p \Y@max=\Y@c \else \Y@max=\Y@p \Y@min=\Y@c \fi }
+\DOCMODE)
+
+ |\saveshape| is used to pass necessary information up one level of
+ grouping.
+
+\DOCMODE(
+\xydef@\saveshape@{\savectrlptsnum@
+ \R@c=\X@max \advance\R@c-\X@c \L@c=\X@c \advance\L@c-\X@min
+ \U@c=\Y@max \advance\U@c-\Y@c \D@c=\Y@c \advance\D@c-\Y@min
+ \edef\tmp@{\egroup \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \noexpand\ifdim\noexpand\X@min>\the\X@min\noexpand\X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\noexpand\Y@min>\the\Y@min\noexpand\Y@min=\the\Y@min\noexpand\fi
+ \noexpand\ifdim\noexpand\X@max<\the\X@max\noexpand\X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\noexpand\Y@max<\the\Y@max\noexpand\Y@max=\the\Y@max\noexpand\fi
+ \savecrvparams@ \def\noexpand\pure@crv{\expandafter\noexpand\pure@crv}}%
+ \tmp@ }
+
+\xydef@\savecrvparams@{\crvpts@={\the\crvpts@}%
+ \noexpand\def\noexpand\crvconnect@{\expandafter\noexpand\crvconnect@}}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\splineEdge{\rectangleEdge}
+\DOCMODE)
+
+\TODO:
+This can be improved. For example, trace along the spline until an
+appropriate point is found. There may be more than one such point,
+so extra criteria may be required.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[``drop'' object]
+The ``drop'' object is set once, then ``dropped'' many times at appropriately
+spaced places along the curve. If directional, the direction from $p$ to $c$
+is used.
+Default behaviour is to have tiny dots spaced sufficiently closely as to
+give the appearance of a smooth curve.
+Specifying a larger size for the ``drop'' object is a way of getting
+a dotted curve (see the example in the next note).
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[``connect'' object]
+The ``connect'' object is also dropped at each place along the curve.
+However, if non-empty, this object uses the tangent direction at each
+place. This allows a directional object to be specified, whose
+orientation will always match the tangent. To adjust the spacing of
+such objects, use an empty ``drop'' object of non-zero size as shown here:
+%
+\begin{code}
+\xy (0,0)*+{A}; (50,-10)*+{B}
+**\crv{~*=<4pt>{.} (10,10)&(20,0)&(40,15)}
+**\crv{~*=<8pt>{}~**!/-5pt/\dir{>}(10,-20)
+ &(40,-15)} \endxy
+\end{code}
+$$\docode$$
+\displaycode
+%
+\noindent
+When there is no ``connect'' object then the tangent calculations
+are not carried out, resulting in a saving of time and memory;
+this is the default behaviour.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[maybe more]
+The ``drop'' and ``connect'' objects can be specified as many times
+as desired. Only the last specification of each type will actually have
+any effect. (This makes it easy to experiment with different styles.)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[show only]
+Complicated diagrams having several spline curves can take quite a long time
+to process and may use a lot of \TeX's memory. A convenient device,
+especially while developing a picture, is to show only the location of the
+control points or to join the control points with lines, as a stylized
+approximation to the spline curve. The <curve-option>s |~p| and |~l| are
+provided for this purpose. Uppercase versions |~P| and |~L| do the same
+thing but use any <curve-object>s that may be specified, whereas the
+lowercase versions use plain defaults: small cross for |~p|, straight
+line for |~l|.
+Similarly |~C| and |~c| set the spline curve using any
+specified <curve-option>s or as a (default) plain curve.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[and curve]
+Use of |~p|, |~l|, etc. is extended to enable both the curve
+and the control points to be easily shown in the same picture.
+Mixing upper- and lower-case specifies whether the <curve-option>s are
+to be applied to the spline curve or the (lines joining) control points.
+See the examples accompanying the next two notes.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[control points]
+By default the control points are marked with a small cross,
+specified by |*\dir{x}|. The ``connect'' object is ignored completely.
+
+\begin{code}
+\xy (0,0)*+{A};(50,-10)*+{B}
+**\crv~pC{~*=<\jot>{.}(10,-10)&(20,15)
+ &(40,15)} \endxy
+\end{code}
+$$\docode$$
+was typeset by \dots
+\displaycode
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[lines joining]
+With lines connecting control points the default ``drop'' object is empty,
+while the ``connect'' object is |\dir{-}| for simple straight lines.
+If non-empty, the ``drop'' object is placed at each control point.
+The ``connect'' object may be used to specify a fancy line style.
+
+\begin{code}
+\xy (0,0)*+{A};(50,-10)*+{B}
+**\crv~Lc{~**\dir{--}~*{\oplus}
+ (20,20)&(35,15)} \endxy
+\end{code}
+$$\docode$$
+was typeset by \dots
+\displaycode
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[stack]
+When a stack of <pos>itions has been established using the |@i| and |@+|
+commands, these positions can be used and are appended to the <poslist>.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xy@@crvaddstack{%
+ \ifx\next ~\xywarning@{there should be a poslist here, \string~@ ignored}%
+ \DN@{\xy@crvmods@}%
+ \else\DN@{\xy@@crvaddstack@}\fi \next@}
+
+\xydef@\xy@@crvaddstack@{\smapxy@@\addtocrv@ \xyFN@\checkendcurve@}
+
+\xydef@\checkcrvtilde@{%
+ \addAT@\ifx\next\addAT@\DN@{\xy@@crvaddstack@}%
+ \else\xywarning@{invalid token after ~, ignored}%
+ \DN@##1{\xyFN@\checkendcurve@}%
+ \fi \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Spline Methods}
+
+Each |\curve| has to set the sliding abilities.
+This is done by a call to |\crvconnect@@| which gives values to
+the methods |\Creset@@|, |\Cshavep@|, etc.
+These values depend on the style of the curve itself.
+
+\DOCMODE(
+\xydef@\crvconnect@@{%
+ \def\Creset@@{\crvreset@}%
+ \def\Cshavep@@{\crvshavep@}%
+ \def\Cshavec@@{\crvshavec@}%
+ \def\Cslidep@@{\crvslidep@}%
+ \def\Cslidec@@{\crvslidec@}%
+ \def\Calong@@{\crvalong@}%
+ \def\Cintercept@@{\crvintercept@}%
+ \def\Cbreak@@{\crvbreak@}%
+ \def\Clast@@{\crvlast@}%
+}
+\DOCMODE)
+
+When straight lines are required \dots
+
+\DOCMODE(
+\xydef@\straitconnect@{\crvconnect@@
+ \let\crvreset@=\straitreset@
+ \let\crvshavep@=\straitshavep@
+ \let\crvshavec@=\straitshavec@
+ \let\crvslidep@=\straitslidep@
+ \let\crvslidec@=\straitslidec@
+ \let\crvalong@=\straitalong@
+ \let\crvintercept@=\straitintercept@
+ \let\crvbreak@=\straitbreak@
+ \let\crvlast@=\straitlast@
+}
+\DOCMODE)
+
+These are the actual methods used for a sequence of straight segments.
+
+\DOCMODE(
+\xydef@\straitreset@{\the\crvpts@
+ \edef\xycrvptsnum@{\csname ptsnum@\endcsname}%
+ \def\segmentnum@{0}}
+\xydef@\straitslidep@{\setupDirection@ii \noCslidep@@ }
+\xydef@\straitslidec@{\setupDirection@ii \noCslidec@@ }
+
+\xydef@\straitshavep@{%
+ \expandafter\ifnum\xycrvptsnum@>\z@
+ \def\segmentnum@{0}%
+ \csname cv@1\endcsname
+ \resetDirection@ \setupDirection@ii
+ \fi \noCshavep@@ }
+
+\xydef@\straitshavec@{%
+ \expandafter\ifnum\xycrvptsnum@>\z@
+ \expandafter\count@@\xycrvptsnum@\relax
+ \bgroup \csname cv@\number\count@@\endcsname
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \edef\segmentnum@{\xycrvptsnum@}%
+ \resetDirection@ \setupDirection@ii
+ \fi \noCshavec@@ }
+
+\xydef@\straitalong@#1{%
+ \ifdim#1\p@<\z@
+ \xywarning@{parameter value #1 is negative, using 0}%
+ \cfromp@ \def\PLACEf@{{0}}%
+ \else
+ \dimen@=#1\p@ \count@=\dimen@ \divide\count@\p@
+ \expandafter\count@@\xycrvptsnum@\relax \advance\count@@\@ne
+ \advance\dimen@\segmentnum@\p@
+ \advance\count@\segmentnum@\relax
+ \def\segmentnum@{0}%
+ \ifnum\count@@<\count@
+ \xywarning@{parameter value #1 too large, using \the\count@@}%
+ \count@=\count@@ \advance\count@\m@ne \edef\PLACEf@{{1}}%
+ \else
+ \advance\dimen@-\count@\p@
+ \ifdim\zz@\dimen@\ifnum\count@>\z@
+ \advance\count@\m@ne \advance\dimen@\p@ \fi\fi
+ \edef\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \fi
+ \ifnum\count@=\z@\else \bgroup
+ \csname cv@\number\count@\endcsname
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \fi
+ \advance\count@\@ne
+ \ifnum\count@<\count@@
+\splinetrace@{find place \the\dimen@\space along straight segment
+ \the\count@}%
+ \csname cv@\number\count@\endcsname
+ \fi
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi \expandafter\noCalong@@\PLACEf@ \czeroEdge@ }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\straitintercept@{\noCintercept@@}
+\xydef@\straitbreak@{\straightCbreak@@}
+\xydef@\straitlast@{\straightClast@@}
+\DOCMODE)
+
+When curved segments are required \dots
+
+\DOCMODE(
+\xydef@\splineconnect@{%
+ \let\crvreset@=\splinereset@
+ \let\crvshavep@=\splineshavep@
+ \let\crvshavec@=\splineshavec@
+ \let\crvslidep@=\splineslidep@
+ \let\crvslidec@=\splineslidec@
+ \let\crvalong@=\splinealong@
+ \let\crvintercept@=\splineintercept@
+ \let\crvbreak@=\splinebreak@
+ \let\crvlast@=\splinelast@
+}
+\DOCMODE)
+
+These are the actual methods.
+
+{\em Reset} the spline parameters:
+\begin{description}
+\item[|\xycrvptsnum@|:] expands to a control sequence, whose name
+incorporates the correct scoping level, giving the number of control points.
+
+\item[|\the\crvpts@|:]
+reads the control point locations and other information from a token list.
+
+\item[|\xysplineparams@|:]
+set to a control sequence name, incorporating the correct scoping level,
+which will allow access to the Be\'zier control points for each
+spline segment, when required.
+
+\item[|\xysplineedges@|:]
+set to a control sequence name, incorporating the correct scoping level,
+which gives the spline parameters of the edges of objects at $p$ and $c$;
+
+\item[|\segmentnum@|:] reset to $0$.
+
+\item[|\splinecorrect@p| and |\splinecorrect@c|:] reset to $0$
+until changed by a |\Cshavep@| or |\Cshavec@|.
+
+\item[|\splinelength@|:] reset to $0$ until changed by a |\Cshavep@|,
+|\Cshavec@| or |\Calong@|; this is needed by |\Cshavep@| and |\Cshavec@|
+to quickly locate where to slide from, especially when it is necessary
+to slide across more than a single spline segment.
+
+\item[|\splineplace@|:] reset to $.5$.
+\end{description}
+
+\DOCMODE(
+\xydef@\splinereset@{\the\crvpts@
+ \edef\xycrvptsnum@{\csname ptsnum@\endcsname}%
+ \edef\xysplineparams@{%
+ \expandafter\noexpand\csname params@\endcsname}%
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \def\segmentnum@{1}\def\splinecorrect@p{0}\def\splinecorrect@c{0}%
+ \splinelength@=\z@ \def\splineplace@f{.5}%
+}
+\DOCMODE)
+
+{\em Shaving} to the appropriate edge.
+This is simply a matter of reading the stored edge information
+and storing the appropriate value in |\splinecorrect@p|
+or |\splinecorrect@c|. The difficult part is to construct the
+correct control sequence name and then to extract the correct
+part of the text in its expansion.
+
+\DOCMODE(
+\xydef@\splineshavep@{\begingroup
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \expandafter\expandafter\expandafter\getsplineedges@safe\xysplineedges@ @@%
+ \edef\tmp@{\noexpand\removePT@\the\dimen5}%
+ \edef\tmp@{\endgroup
+ \noexpand\def\noexpand\splinecorrect@p{\tmp@}}\tmp@
+ \setupDirection@ii }
+
+\xydef@\splineshavec@{\begingroup
+ \edef\xysplineedges@{%
+ \expandafter\noexpand\csname edges@\endcsname}%
+ \expandafter\expandafter\expandafter\getsplineedges@safe\xysplineedges@ @@%
+ \dimen@=-\dimen7\relax \advance\dimen@\p@
+%% \getcrvsegsnum@ \advance\dimen@\count@\p@
+ \edef\tmp@{\noexpand\removePT@\the\dimen@}%\W@{**shave**<\tmp@>***}%
+ \edef\tmp@{\endgroup
+ \noexpand\def\noexpand\splinecorrect@c{\tmp@}}\tmp@
+ \setupDirection@ii }
+
+\xydef@\splineslidep@#1{\enter@{\pfromthep@}%
+ \begingroup \splinealong@@{0}{#1}+\splineslidep@@@
+ \setupDirection@ii \leave@ }%
+
+\xydef@\splineslidep@@@{%
+ \d@X=\dimen5 \d@Y=\dimen7 \edef\tmp@{\postfind@}\tmp@ \dimen@=\splineval@
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@>\tw@ \advance\count@\m@ne
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \fi
+ \edef\tmp@{\endgroup \endgroup
+ \noexpand\def\noexpand\xysplineval@{\the\splineval@}%
+ \noexpand\def\noexpand\splinecorrect@p{\expandafter\removePT@\the\dimen@}%
+\splinetrace@{slide = \the\splinelength@}%
+ \X@c=\dimen@i \Y@c=\dimen3 % something may be wrong here!!
+ \d@X=\the\d@X \d@Y=\the\d@Y %
+ \noexpand\def\noexpand\segmentnum@{\segmentnum@}}\tmp@ }
+
+\xydef@\splineslidec@#1{\enter@{\pfromthep@}%
+ \begingroup
+ \expandafter\splinealong@@\PLACEf@{#1}+\splineslidec@@@
+ \setupDirection@ii \leave@ }
+
+\xydef@\splineslidec@@@{%
+ \d@X=\dimen5 \d@Y=\dimen7 \edef\tmp@{\postfind@}\tmp@ \dimen@=\splineval@
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@>\tw@ \advance\count@\m@ne
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \dimen@=-\dimen@ \advance\dimen@\count@\p@
+ \else \dimen@=-\dimen@ \advance\dimen@\p@ \fi %\W@{**slide**<\the\dimen@>***}%
+%% splinecorrect@c is probably wrong here!!
+ \edef\tmp@{\endgroup \endgroup
+ \noexpand\def\noexpand\xysplineval@{\the\splineval@}%
+ \noexpand\def\noexpand\splinecorrect@c{\expandafter\removePT@\the\dimen@}%
+\splinetrace@{slide = \the\splinelength@; correct@c=\noexpand\splinecorrect@c}%
+ \X@c=\dimen@i \Y@c=\dimen3 %
+ \d@X=\the\d@X \d@Y=\the\d@Y %
+ \noexpand\def\noexpand\segmentnum@{\segmentnum@}}\tmp@ }
+
+\xydef@\checkslidemore@#1{%
+ \dimen@ii=-#1\relax\ifdim\dimen@ii<\z@\multiply\dimen@ii\m@ne\fi
+ \dimen@=-\splinelength@ \advance\dimen@\dimen@ii\relax
+ \ifdim\dimen@<\z@\dimen@ii=-\dimen@\else\dimen@ii=\dimen@\fi
+ \ifdim\dimen@ii<.2\p@\DN@{\splineslidec@@ \leave@}%%%% ?
+ \else \splinetrace@{not found yet, \the\dimen@ii\space still to go}%
+ \dimen@ii=#1\relax\ifdim\dimen@ii<\z@\multiply\dimen@\m@ne\fi
+ \DN@{\expandafter\splineslidemore@\expandafter{\the\dimen@}}\fi
+ \next@}%
+
+\xydef@\splineslidemore@#1{%
+ \expandafter\count@\segmentnum@\relax
+ \ifdim#1<\z@\advance\count@\m@ne\dimen@=\p@
+ \else\advance\count@\@ne\dimen@=\z@\fi
+ \ifnum\count@<\@ne
+ \expandafter\splinesegment@\expandafter{\segmentnum@}%
+ \DN@{\xywarning@{cannot slide beyond start of curve}%
+ \spline@find{\z@}{\z@}{}\splineslidec@@ \leave@ }%%%% ?
+ \else \expandafter\count@@\xycrvptsnum@\relax\advance\count@@\m@ne
+ \expandafter\ifnum\count@@<\count@\relax
+ \expandafter\splinesegment@\expandafter{\segmentnum@}%
+ \DN@{\xywarning@{cannot slide beyond end of curve}%
+ \spline@find{\p@}{\z@}{}\splineslidec@@ \leave@ }%%%%% ?
+ \else
+ \edef\segmentnum@{\the\count@}%
+ \expandafter\splinesegment@\expandafter{\segmentnum@}%
+\splinetrace@{sliding onto segment \segmentnum@}%
+ \expandafter\spline@find\expandafter{\the\dimen@}{#1}{}%
+ \DN@{\checkslidemore@{#1}}%
+ \fi\fi \next@ }
+
+\xydef@\splineslidec@@{%
+ \dimen@=\splineval@ \advance\dimen@\segmentnum@\p@\advance\dimen@-\p@
+ \edef\tmp@{\endgroup
+ \noexpand\def\noexpand\xysplineval@{\the\dimen@}%
+\splinetrace@{slide = \the\splinelength@}%
+ \X@c=\the\dimen@i \Y@c=\the\dimen3 \d@X=\the\dimen5 \d@Y=\the\dimen7 \postfind@
+ \noexpand\def\noexpand\segmentnum@{\segmentnum@}}\tmp@
+ \setupDirection@ii}
+\DOCMODE)
+
+The method |\splinealong@#1| finds places along the curve, when |#1| is
+given as a factor, normally between 0 and 1. The location of the edges
+of the objects at $p$ and $c$ are stored in |\splinecorrect@p| and
+|\splinecorrect@c|.
+These are the places found if the factor is either 0 or 1.
+If an edge is non-zero then it is actually possible to move to points inside
+that edge by specifying a factor less than 0 or greater than 1.
+
+\DOCMODE(
+\xydef@\splinealong@#1{\def\postfind@{}\splinealong@@{#1}\z@+%
+ \splineslidec@@
+ \dimen@=\xysplineval@\relax
+ \count@=\xycrvptsnum@\relax \ifnum\count@>\@ne \advance\count@\m@ne\fi
+ \ifnum\count@>\@ne \dimen@nth\count@\dimen@
+ \fi \edef\bthisPLACE@{\expandafter\removePT@\the\dimen@}%
+\splinetrace@{bthisPLACE@=\bthisPLACE@}}%
+\DOCMODE)
+
+The parameter |#2| in |\splinealong@@#1#2#3| allows for a subsequent slide
+through a given <dimen> along the curve, from the place specifed by the
+factor in |#1|.
+
+The information supplied in |#1| must be converted to the segment number and
+parameter value of the specified point. These will be calculated and stored
+temporarily in |\count@| and |dimen@| before the values are passed respectively
+to |\splinesegment@| which chooses the segment, and |\spline@find| to locate
+the point on this segment.
+
+To do the calculation, first we correct for the parameter values of the edges
+ of the objects at the end-points, which are stored in |\splinecorrect@p| and
+|\splinecorrect@c|. If the resulting number $x$ is not an integer then
+|\count@| is set to $1+\floor{x}$ while |\dimen@| becomes $(x-\floor{x})|\p@|$.
+If $x$ is an integer: $x=0$ gives |\count@=1| and |\dimen@=\z@|,
+otherwise $|\count@|=x$ and |\dimen@=\p@|.
+
+\DOCMODE(
+\xydef@\splinealong@@#1#2#3{%
+ \edef\tmp@{#1}\relax \dimen@ii\tmp@\p@
+%% \getcrvsegsnum@
+%% \dimen@=-\count@\p@
+ \dimen@=-\p@
+ \expandafter\advance\expandafter\dimen@\splinecorrect@p\p@
+ \expandafter\advance\expandafter\dimen@\splinecorrect@c\p@
+ \edef\tmp@{#1}\relax \dimen@=-\tmp@\dimen@ \relax
+ \expandafter\advance\expandafter\dimen@\splinecorrect@p\p@
+ \getcrvsegsnum@ \multiply \dimen@ by\count@\relax
+\splinetrace@{actual:\the\dimen@; f:\the\dimen@ii; p:\splinecorrect@p, c:\splinecorrect@c}%
+ \count@=\dimen@ \divide\count@\p@ \DN@{\relax}%
+ \def\tmp@{\relax}\ifx\next@\tmp@
+ \expandafter\ifnum\xycrvptsnum@<\count@
+ \xywarning@{parameter value #1 too large}%
+ \DNii@{\relax}\DN@{\begingroup}%
+ \else
+ \edef\xysplineval@{\the\dimen@}%
+ \advance\dimen@-\count@\p@
+ \ifdim\dimen@=\z@
+\splinetrace@{find knot point \the\count@}%
+ \ifnum\count@=\z@ \count@=\@ne \else \dimen@=\p@ \fi
+ \else \advance\count@\@ne
+\splinetrace@{find point \the\dimen@\space on spline segment \the\count@}%
+ \fi
+ \edef\segmentnum@{\the\count@}%
+ \edef\next@{\begingroup\noexpand\splinesegment@{\the\count@}}%
+ \edef\nextii@{%
+ \noexpand\spline@find{\the\dimen@}{#2}{}\noexpand\checksplinefind@{#2}}%
+ \ifx>#3\relax
+ \edef\nextii@{%
+ \noexpand\spline@find{\the\dimen@}{#2}#3\noexpand\checksplinefind@{#2}}%
+ \else\ifx-#3\relax \ifdim\dimen@>\z@\relax \ifdim\dimen@<\p@
+ \dimen@=-\dimen@ \advance\dimen@\p@
+ \edef\nextii@{\noexpand\splinereverse@
+ \noexpand\spline@find{\the\dimen@}{#2}{}\noexpand\checksplinefind@{#2}}%
+ \fi\fi
+ \else\ifx<#3\relax \ifdim\dimen@>\z@\relax \ifdim\dimen@<\p@
+ \dimen@=-\dimen@ \advance\dimen@\p@
+ \edef\nextii@{\noexpand\splinereverse@
+ \noexpand\spline@find{\the\dimen@}{#2}#3\noexpand\checksplinefind@{#2}}%
+ \fi\fi
+ \fi\fi\fi
+ \fi\fi \expandafter\next@\nextii@ }
+\DOCMODE)
+
+ This macro checks whether the required sliding has been carried out,
+or whether it is necessary to continue sliding along the next segment.
+
+\DOCMODE(
+\xydef@\checksplinefind@#1{%
+ \dimen@ii=#1\relax \dimen@=\splinelength@
+ \ifdim\dimen@ii=\z@\DN@{}%
+ \else
+ \ifdim\dimen@ii<\z@\advance\dimen@\dimen@ii
+ \else\advance\dimen@-\dimen@ii\fi
+ \ifdim\dimen@<\z@\multiply\dimen@\m@ne\fi
+ \ifdim\dimen@<.2\p@\DN@{}%
+ \else
+ \count@=\segmentnum@\relax
+ \ifdim\dimen@ii<\z@\advance\dimen@ii\splinelength@
+ \ifnum\count@>\@ne\advance\count@\m@ne
+ \edef\next@{\noexpand\splinesegment@{\the\count@}%
+ \noexpand\spline@find\p@{\the\dimen@ii}{}%
+ \noexpand\checksplinefind@{\the\dimen@ii}}%
+ \else
+ \xywarning@{cannot slide \the\dimen@ii\space before start}%
+ \DN@{\splinesegment@\@ne \spline@find\z@\z@{}}\fi
+ \else\advance\dimen@ii-\splinelength@
+ \count@@=\numcontrolpts
+ \ifnum\count@<\count@@ \advance\count@\@ne
+ \edef\next@{\noexpand\splinesegment@{\the\count@}%
+ \noexpand\spline@find\z@{\the\dimen@ii}{}%
+ \noexpand\checksplinefind@{\the\dimen@ii}}%
+ \else
+ \xywarning@{cannot slide \the\dimen@ii\space beyond end}%
+ \DN@{\splinesegment@{\the\count@@}\spline@find\p@\z@{}}\fi
+ \fi
+ \fi\fi \next@ }
+\DOCMODE)
+
+
+\paragraph*{Breaks}
+%
+Typesetting breaks in curves is quite involved.
+The |\bstartPLACE@| and |\bendPLACE@| are used to hold parameter
+values for the positions of the beginning and end of a segment,
+respectively, when known. The default values of |\relax| indicate
+that these values need to be found, usually from the start- and
+end-edges of the curve. The value of |\empty| for |\bstartPLACE@|
+is used initially with a new curved connection, to set up all its
+parameters --- no typesetting takes place. This is used by curved
+arrows to set up the connection before places can
+be found for any breaks.
+
+\DOCMODE(
+\xydef@\resetbreaks@{%
+ \let\bstartPLACE@=\relax \let\bthisPLACE@=\empty
+ \let\bendPLACE@=\relax \let\bprevPLACE@=\relax}
+
+\xydef@\invisbreaks@{\resetbreaks@ \let\bstartPLACE@=\empty}
+\xydef@\crvresetbreaks@{\resetbreaks@ \let\bstartPLACE@=\relax }
+
+\xydef@\initbreaks@{\xy@@{\ifx\bstartPLACE@\relax
+ \def\bstartPLACE@{0}\def\bendPLACE@{1}\else
+ \ifx\bstartPLACE@\empty\def\bstartPLACE@{0}\def\bendPLACE@{1}%
+ \fi\fi}}
+
+\xydef@\lastbreaks@{\ifx\bprevPLACE@\relax \def\bstartPLACE@{0}%
+ \else \expandafter \bprevPLACE@ \fi
+ \let\bprevPLACE@\relax \let\bendPLACE@\relax}
+
+\xylet@\bstartPLACE@\relax
+\xylet@\bendPLACE@\relax
+\xylet@\bprevPLACE@\relax
+\xydef@\bthisPLACE@{1}
+\DOCMODE)
+
+These are called in the actual setting of curved sub-segments.
+
+\DOCMODE(
+\xydef@\splinebreak@{%
+\splinetrace@{***new break*** this:\bthisPLACE@ }%
+ \ifx\bthisPLACE@\empty\def\bendPLACE@{1}%
+ \else\edef\bendPLACE@{\bthisPLACE@}\let\bthisPLACE@\empty\fi
+%\xystatus@{BR1}%
+ \ifx\bprevPLACE@\relax\def\bstartPLACE@{0}\else\expandafter\bprevPLACE@\fi
+ \edef\bprevPLACE@{\def\noexpand\bstartPLACE@{\bendPLACE@}\pfromthec@}%
+\splinetrace@{splineBREAK: \bstartPLACE@ <> \bendPLACE@}%
+%\xystatus@{BR}%
+ \edef\cv@brend{\cfromthec@}%
+ \edef\cv@brstart{\cfromthep@}%
+ \expandafter\connect\expandafter\crvs\crvSTYLE@@{}% ? optimise
+ \let\cv@brend=\relax
+ \let\cv@brstart=\relax
+\splinetrace@{**break done**}%
+}
+
+\xydef@\splinelast@{\splinereset@ \lastbreaks@ %\splinetracing
+\splinetrace@{splineLAST}%
+%\xystatus@{LA}%
+ \edef\cv@brend{\cfromthec@}%
+ \edef\cv@brstart{\cfromthep@}%
+ \expandafter\connect\expandafter\crvs\crvSTYLE@@{}% ? optimise
+ \let\cv@brend=\relax
+ \let\cv@brstart=\relax
+\splinetrace@{**last done**}%
+ \resetbreaks@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Intersection with a curved connection}
+Just as the intersection of two lines (??g[xy.doc:intercept]) can be found,
+so can the intersection of a straight line with a curved connection,
+or the intersection of a curve with a straight connection.
+
+\begin{code}
+\xy*+{A}="A";p+/r5pc/+(0,15)*+{B}="B"
+ ,p+<1pc,3pc>*+{C}="C"
+ ,"A"+<4pc,-1pc>*+{D}="D",{\ar@/_/"C"}
+ ,?!{"A";"B"**@{-}}*++{\oplus}
+\endxy \quad \xy
+ *+{A}="A";p+/r5pc/+(0,15)*+{B}="B",
+ ,p+<1pc,3pc>*+{C}="C"
+ ,"A"+<4pc,-1pc>*+{D}="D","A";"B"**@{-}
+ ,?!{"D",{\ar@/_/"C"}}*++{\oplus}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+When the line separates the end-points of a curve an intersection can always
+be found. If there is more than one then that occurring earliest along the
+curve is the one found.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Presume the end-points of the spline segment are at $(X_p,Y_p)$ and
+$(X_c,Y_c)$ with $(L_p,U_p)$ and $(R_p,D_p)$ as two points on the line.
+Then the macro |\xysidesofinterval@| returns 3 pieces of information.
+\begin{itemize}
+\item |\next| expands to 2 characters, each from $\{+,-,0\}$
+ indicating which side of, or on, the line lies either end-point;
+\item |\this@| expands to either $+$ or $-$ indicating which
+ end is closer to the line, returning $+$ if equi-distant;
+\item |\howclose@| contains a non-negative <num> indicating the distance
+ to the nearest end-point.
+\end{itemize}
+
+\DOCMODE(
+\xydef@\splineNointercept@{\enter@{\pfromthep@}%
+ \begingroup \splinereset@ \csname cv@0\endcsname \swap@
+ \count@=\ptsnum@ \advance\count@\@ne \csname cv@\the\count@\endcsname
+ \edef\tmp@{\endgroup \X@origin=\the\X@p \Y@origin=\the\Y@p
+ \R@c=\the\d@X \U@c=\the\d@Y}\tmp@
+ \loop@
+ \dimen@=\ifdim\R@c<\z@-\fi\R@c
+ \advance\dimen@ \ifdim\U@c<\z@-\fi\U@c
+ \ifdim\dimen@>10\p@
+ \advance\R@c \ifdim\R@c<\z@-\fi 16sp \divide\R@c\KK@
+ \advance\U@c \ifdim\U@c<\z@-\fi 16sp \divide\U@c\KK@
+ \repeat@
+ \intersect@ \leave@}
+
+\xydef@\splineintercept@{\Hidden@true\Invisible@true\splineintercept@i}
+
+\xydef@\splineintercept@i{\enter@{\pfromthep@}\begingroup
+ \R@p=\X@c \L@p=\X@p \d@X=\R@p \advance\d@X-\L@p
+ \D@p=\Y@c \U@p=\Y@p \d@Y=\D@p \advance\d@Y-\U@p
+ \dimen@nth\KK@\d@X \edef\sd@X{\expandafter\removePT@\the\d@X}%
+ \dimen@nth\KK@\d@Y \edef\sd@Y{\expandafter\removePT@\the\d@Y}%
+ \dimen@=\sd@Y\L@p \advance\dimen@-\sd@X\U@p
+ \edef\sideOffset@{\the\dimen@}\def\closestseg@{1}%
+ \let\crvconnect@@=\relax \crvconnect@
+ \let\spline@end=\splinef@end
+ \def\spline@start{\bgroup \def\prevnext@{+-}%
+ \def\splinerec@{\let\splinerec@=\splineIrec@ \splineinterceptTest@}%
+ \def\splinedecast@{\let\splinedecast@=\splinedecast@@
+ \def\splineadvance@{\splineIadvance@@}\splinedecast@@}%
+ \def\splineadvance@{\intercepthull@}%
+% \def\splinepoint@{\splineIpt@@}%
+ \global\let\splinepoint=\splineIpt@@
+ \global\let\splinegoal@=\splinef@pt
+ \global\let\splinefinish@=\splinefinish@@}%
+ \begingroup \splineIsegment@
+ \splinesetparams@ \splined@@ \def\postfind@{}\splineIplace@
+ \setupDirection@ii \leave@ }
+
+
+\xydef@\splineIplace@{%
+ \d@X=\dimen5 \d@Y=\dimen7 \dimen@=\splineval@
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@>\tw@ \advance\count@\m@ne %\advance\count@\m@ne
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \dimen@nth\count@\dimen@ % \divide\dimen@\count@
+ \fi \edef\tmp@{\endgroup \endgroup
+ \def\noexpand\PLACEf@{{\expandafter\removePT@\the\dimen@}}%
+ \X@c=\dimen@i \Y@c=\dimen3 %
+ \d@X=\the\d@X \d@Y=\the\d@Y }\tmp@
+\splinetrace@{PLACE = \PLACEf@:(\the\X@c, \the\Y@c)}%
+ \expandafter\edef\expandafter\bthisPLACE@\PLACEf@
+ }
+
+\xydef@\splineIrec@{\splineinterceptTest@ }
+
+\xydef@\squineIpt@{\edef\tmp@{\endgroup
+ \def\noexpand\prevnext@{\next}\begingroup}\tmp@ }
+\xydef@\squineIadvance@{\edef\tmp@{\endgroup
+ \def\noexpand\prevnext@{\next}\def\noexpand\howclose@{\howclose@}}%
+ \tmp@ \splineadvance@@\begingroup}
+
+\xydef@\cubicIpt@{\edef\tmp@{\endgroup
+ \def\noexpand\prevnext@{\next}\begingroup}\tmp@ }
+\xydef@\cubicIadvance@{\edef\tmp@{\egroup
+ \def\noexpand\prevnext@{\next}\def\noexpand\howclose@{\howclose@}}%
+ \tmp@ \splineadvance@@\bgroup}
+
+\xydef@\splineIsegment@{\DN@{\splinesegment@\@ne}%
+ \ifx\splinesegment@\squinesegment@\else
+ \ifx\splinesegment@\cubicsegment@\else\DN@{\findIsegment@}%
+ \fi\fi\next@}
+
+\xydef@\findIsegment@{\expandafter\count@\xycrvptsnum@ \count@@\z@
+ \loop@ \advance\count@@\@ne \bgroup
+ \expandafter\splinesegment@\expandafter{\the\count@@}%
+ \xysidesofinterval@
+ \findIsegment@i \repeat@
+ \expandafter\dimen@\prevhowclose@ \relax
+ \ifdim\dimen@=\z@ \edef\closestseg@{\the\count@@}\fi
+ \expandafter\splinesegment@\expandafter{\closestseg@}}
+
+\xydef@\findIsegment@i{%
+ \expandafter\ifx\next \expandafter\findIsegment@ii
+ \else\expandafter\findIsegment@x\fi \next@ }
+
+\xydef@\findIsegment@ii{\expandafter\count@\xycrvptsnum@ \relax
+ \advance\count@\m@ne \ifnum\count@>\segmentnum@\relax
+ \expandafter\findIsegment@y\else\expandafter\findIsegment@x\fi}
+
+\xydef@\findIsegment@x{%
+ \edef\next@{\egroup\def\noexpand\next{\next}%
+ \def\noexpand\prevhowclose@{\prevhowclose@}%
+ \def\noexpand\closestseg@{\closestseg@}\noexpand\iffalse}}
+
+\xydef@\findIsegment@y{%
+ \edef\next@{\egroup\def\noexpand\next{\next}%
+ \def\noexpand\prevhowclose@{\prevhowclose@}%
+ \def\noexpand\closestseg@{\closestseg@}\noexpand\iftrue}}
+
+\xydef@\xysidesofinterval@{\bgroup
+ \L@p=\sd@X\Y@p \advance\L@p-\sd@Y\X@p \advance\L@p\sideOffset@
+ \U@p=\sd@X\Y@c \advance\U@p-\sd@Y\X@c \advance\U@p\sideOffset@
+ \def\this@{}\ifdim\L@p>\almostz@ \ifdim\U@p>\almostz@ \def\next{++}\else
+ \ifdim\U@p<-\almostz@ \def\next{+-}\else\def\next{+0}\def\this@{-}\fi\fi
+ \else\ifdim\L@p<-\almostz@ \ifdim\U@p>\almostz@ \def\next{-+}\else
+ \ifdim\U@p<-\almostz@ \def\next{--}\else\def\next{-0}\def\this@{+}\fi\fi
+ \else \ifdim\U@p>\almostz@ \def\next{0+}\else
+ \ifdim\U@p<-\almostz@ \def\next{0-}\else\def\next{00}\def\this@{+}\fi\fi
+ \fi\fi
+ \ifx\this@\empty
+ \L@p=\ifdim\L@p<\z@-\fi\L@p \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\L@p<\U@p \edef\howclose@{\the\L@p}\def\this@{-}%
+ \else \edef\howclose@{\the\U@p}\def\this@{+}\fi
+ \else\def\howclose@{0.0pt}\fi
+\splinetrace@{\next:\this@:\howclose@;\the\splineval@:%
+ (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c)}%
+ \ifdim\howclose@<\prevhowclose@\relax
+ \edef\tmp@{\egroup\def\noexpand\this@{\this@}\def\noexpand\next{\next}%
+ \def\noexpand\howclose@{\howclose@}\def\noexpand\prevhowclose@{\howclose@}%
+ \def\noexpand\closestseg@{\segmentnum@}}%
+\splinetrace@{closest yet: \howclose@, in segment \segmentnum@}%
+ \else
+ \edef\tmp@{\egroup\def\noexpand\this@{\this@}\def\noexpand\next{\next}%
+ \def\noexpand\howclose@{\howclose@}}%
+ \fi \tmp@ }
+
+\xydef@\splineinterceptTest@{%
+ \xysidesofinterval@ \DN@{\splineadvance@}%
+ \DNii@{0.0pt}\ifx\howclose@\nextii@ \DN@{\splineclosest@}%
+ \else\expandafter\ifx\next \expandafter\ifx\prevnext@
+ \ifx\next\prevnext@\else\DN@{\X@c=\X@p \Y@c=\Y@p
+ \splinefinishf@}\fi\fi
+ \else \DN@{\splinedecast@}\fi\fi
+ {\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\next@
+ \else\aftergroup\splineclosest@
+\splinetrace@{too close: (\the\X@p,\the\Y@p)::(\the\X@c,\the\Y@c)}%
+ \fi}}
+
+\xydef@\splineclosest@{%\global\advance\splineval@-.5\splinedepth@
+ \expandafter\ifx\this@-\relax
+ \X@c=\X@p \Y@c=\Y@p \global\advance\splineval@-\splinedepth@
+ \fi \splinefinishf@ }%
+\DOCMODE)
+
+When the line misses the convex hull of the curve's control points
+it is still possible to get the point of closest approach.
+
+\DOCMODE(
+\xydef@\squinetestcvxhull@{\begingroup
+\splinetrace@{hull: closest in segment \closestseg@}%
+ \expandafter\splinesegment@\ifx\undefined\closestseg@\@ne\else\closestseg@\fi
+ \X@c=\L@c \Y@c=\U@c \xysidesofinterval@
+ \expandafter\ifx\next \expandafter\splineoutsidehull@@
+ \else \expandafter\splineinsidehull@\fi}
+
+\xydef@\cubictestcvxhull@{\begingroup
+ \expandafter\splinesegment@\ifx\undefined\closestseg@\@ne\else\closestseg@\fi
+ \X@c=\L@c \Y@c=\U@c \xysidesofinterval@
+ \expandafter\ifx\next \expandafter\cubictestcvxhull@i
+ \else \expandafter\splineinsidehull@\fi}
+
+\xydef@\cubictestcvxhull@i{%\begingroup
+ \X@c=\R@c \Y@c=\D@c \xysidesofinterval@
+ \expandafter\ifx\next \expandafter\splineoutsidehull@@
+ \else \expandafter\splineinsidehull@\fi}
+
+
+\xydef@\xysidesofhull@{\bgroup
+ \L@p=\sd@X\Y@p \advance\L@p-\sd@Y\X@p \advance\L@p\sideOffset@
+ \U@p=\sd@X\Y@c \advance\U@p-\sd@Y\X@c \advance\U@p\sideOffset@
+ \L@p=\ifdim\L@p<\z@-\fi\L@p \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\L@p<\U@p \edef\howclose@{\the\L@p}\def\this@{-}%
+ \else \edef\howclose@{\the\U@p}\def\this@{+}\fi
+ \ifx\splinedecast@\squinedecast@ \D@c=\U@c \R@c=\L@c \fi
+ \L@p=\sd@X\U@c \advance\L@p-\sd@Y\L@c \advance\L@p\sideOffset@
+ \L@p=\ifdim\L@p<\z@-\fi\L@p
+ \expandafter\if\this@-%
+ \ifdim\L@p<\prevhowclose@ \def\next{-+}\else \def\next{--}\fi
+ \else
+ \ifdim\L@p<\howclose@ \def\next{-+}\else
+ \U@p=\sd@X\D@c \advance\U@p-\sd@Y\R@c \advance\U@p\sideOffset@
+ \U@p=\ifdim\U@p<\z@-\fi\U@p
+ \ifdim\U@p<\howclose@ \def\next{+-}\else \def\next{++}\fi
+ \fi\fi
+ \edef\tmp@{\egroup\def\noexpand\this@{\this@}\def\noexpand\next{\next}%
+ \def\noexpand\howclose@{\howclose@}}\tmp@ }
+\DOCMODE)
+
+This is for straight connections intercepting with a curve.
+It requires a redefinition of |\PLACE@intercept@| to recognise
+that the intercept is with a curved connection.
+
+\DOCMODE(
+\def\PLACE@intercept@#1{%
+ \xy@@{\enter@{\pfromthep@\basefromthebase@}\begingroup}%
+ \xy@@ix@{#1}\xy@@{\plainxy@ \def\Creset@@{}%
+ \expandafter\POS\the\toks9\relax
+ \DNii@{\crvreset@}\ifx\nextii@\Creset@@ \edef\next@{\endgroup
+ \def\noexpand\xyinterceptpts@{\the\crvpts@}%
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p
+ \noexpand\CCintercept@@ }%
+ \else \edef\next@{\endgroup
+ \X@c =\the\X@c \Y@c=\the\Y@c \X@p=\the\X@p \Y@p=\the\Y@p
+ \noexpand\Cintercept@@ }%
+ \fi \next@ \leave@}%
+ \PLACE@@}
+
+\xydef@\CCintercept@@{\splineSintercept@}
+\xydef@\splineSintercept@{\enter@{\pfromthep@}\begingroup
+ \Creset@@ \edef\connect@pts{\cfromthec@ \pfromthep@}%
+ \xyinterceptpts@ \splinereset@ \connect@pts \splineintercept@
+ \edef\next@{\endgroup \cfromthec@ \DirectionfromtheDirection@ }%
+ \next@ \let\xyinterceptpts@=\empty \leave@}
+\DOCMODE)
+
+\TODO:
+If both connections are curves, only the line joining the end-points
+of the first connection is used. Find a way to do better than this.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+If the line does not separate the end-points then there may be no
+intersection with the curve. If there is one then either the line is
+tangential or necessarily there will also be at least one other intersection.
+A message $$|perhaps no curve intersection, or many.|$$
+is written to the log-file, but a search for an intersection will still be
+performed and a ``sensible'' place found on the curve.
+In the usual case of a single quadratic or cubic segment, the place nearest
+the line is found and the tangent direction is established.
+
+The following examples show this, and show how to get the place on the line
+nearest to the curve.
+
+\begin{code}
+\xy *+{A}="A";p+/r5pc/+(0,15)*+{B}="B",
+ ,p-<.5pc,2pc>*+{C}="C","A"+<6pc,-.5pc>
+ ,*+{D}="D","A",{\ar@/_25pt/"B"}
+ ,?!{"C";"D"**@{-}}*\dir{x}="E"
+ ,+/_2pc/="F";"E"**@{-},?!{"C";"D"}
+ ,*{\otimes}\endxy\qquad\xy
+ *+{A}="A";p+/r5pc/+(0,15)*+{B}="B",
+ ,p-<.5pc,2pc>*+{C}="C"
+ ,"A"+<7pc,.5pc>*+{D}="D","A"
+ ,{\ar@/_40pt/"B"},?!{"C";"D"**@{-}}
+ ,*{\otimes}\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The warning message, that no intersection may exist, always occurs inside
+a grouping so it can safely switch itself off for deeper levels.
+
+\DOCMODE(
+\xydef@\nointerceptwarning@{\let\nointerceptwarning@=\relax
+ \xywarning@{perhaps no curve intersection, or many. }}
+
+\xydef@\intercepthull@{\nointerceptwarning@
+ \expandafter\def\expandafter\prevnext@\expandafter{\next}%
+ \splinetestcvxhull@}
+\DOCMODE)
+
+When the line meets the convex hull of the current control points,
+then a closer point exists inside the current portion of the curve.
+We must ``decast'' to find it, after storing the closest value known
+so far, within |\prevhowclose@|.
+
+\DOCMODE(
+\xydef@\splinetestcvxhull@{\begingroup
+ \X@c=\L@c \Y@c=\U@c \splinetrace@{hull:}\xysidesofinterval@
+ \expandafter\ifx\next \expandafter\splineoutsidehull@@
+ \else \expandafter\splineinsidehull@\fi}
+
+\xydef@\splineinsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}%
+ \noexpand\interceptinsidehull@}\tmp@ }
+
+\xydef@\interceptinsidehull@{\edef\prevhowclose@{\howclose@}%
+ \splinedecast@@ }
+\DOCMODE)
+
+If the line does not cross into the convex hull, then we use
+the distance from the control points to determine whether or not
+there can be a closer point. The value of |\prevhowclose@|
+indicates the best so far, while |\howcvxclose@| temporarily
+holds the distance to the closest control point. When this is
+nearer then there will be a closer point on the curve.
+
+\DOCMODE(
+{\xdef\next{\the\maxdimen}}
+\xylet@\prevhowclose@=\next
+
+\xydef@\splineoutsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}%
+ \noexpand\interceptoutsidehull@}\tmp@}
+\xylet@\splineoutsidehull@@=\splineoutsidehull@
+
+%\xydef@\interceptoutsidehull@{\dimen@=\howcvxclose@ \relax
+% \ifdim\dimen@<\howclose@ \relax
+% \ifdim\howclose@<\prevhowclose@\relax \edef\prevhowclose@{\howclose@}\fi
+% \DN@{\begingroup\splinedecast@@ \endgroup}%
+% \else\ifdim\howclose@>\prevhowclose@ \relax \DN@{\splineHadvance@}%
+% \else \DN@{\splineHadvance@ }\fi\fi \next@ }
+\xydef@\interceptoutsidehull@{\dimen@=\howcvxclose@ \relax
+% \global\splineval@=\z@
+\splinetrace@{OUTSIDE HULL: \the\dimen@ : (\howclose@)(\prevhowclose@)}%
+ \let\splinedecast@=\splinedecast@@
+ \let\splinerec@\splineHnear@test
+ \let\splineadvance@\splineIadvance@@
+ \splinedecast@@ }
+
+\xydef@\splineHnear@test{%
+ \xysidesofhull@ \DN@{\splinedecast@}%
+ \ifdim\howclose@<\prevhowclose@\edef\howclose@{\prevhowclose@}\fi
+ \expandafter\if\this@-%
+ \expandafter\ifx\next\DN@{\splineclosest@}\fi
+ \else
+ \expandafter\ifx\next\DN@{\splineadvance@}\fi
+ \fi
+ {\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\next@
+ \else\aftergroup\splineclosest@
+\splinetrace@{too close: (\the\X@p,\the\Y@p)::(\the\X@c,\the\Y@c)}%
+ \fi}}
+\DOCMODE)
+
+For cubic segments it is necessary to look at both control-points
+off the curve and compare their distances; hence the use of
+|\prevhowcvxclose@|, initially set to |\maxdimen|.
+
+\DOCMODE(
+\xydef@\cubicoutsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}}\tmp@
+ \edef\prevhowcvxclose@{\howcvxclose@}\begingroup
+ \X@p=\R@c \Y@p=\D@c \splinetrace@{hullii:}\xysidesofinterval@
+ \expandafter\ifx\next \expandafter\cubicoutsidehull@i
+ \else \expandafter\cubicinsidehull@\fi}
+
+\xydef@\cubicinsidehull@{\edef\tmp@{\endgroup
+ \def\noexpand\howclose@{\howclose@}}\tmp@
+ \cubicoutsidehull@ii }
+
+\xydef@\cubicoutsidehull@i{\edef\tmp@{\endgroup
+ \def\noexpand\howcvxclose@{\howclose@}}\tmp@
+ \dimen@=\prevhowcvxclose@\relax
+ \ifdim\dimen@<\howcvxclose@ \relax
+ \edef\howcvxclose@{\the\dimen@}\expandafter\interceptoutsidehull@
+ \else \expandafter\cubicoutsidehull@ii\fi }
+
+\xydef@\cubicoutsidehull@ii{%
+ \def\splineadvance@{\splineadvance@@}%
+ \def\splinepoint\endgroup{\endgroup
+% \global\let\splinepoint=\splinepoint@
+ \global\let\splinepoint=\relax
+ \def\splineadvance@{\intercepthull@}}%
+ \splinedecast@@ }%
+\DOCMODE)
+
+This macro |\splineHadvance@| is used at the end of a |\splinedecast@|
+in order to pass information from out of a subsegment, to help decide
+whether there is any point in further searching.
+
+\DOCMODE(
+\xydef@\splineHadvance@{\futurelet\next@\splineHadvance@i}
+\xydef@\splineHadvance@i{\ifx\next@\endgroup
+ \expandafter\splineHadvance@x\else\expandafter\splineclosest@\fi}
+
+\xydef@\splineHadvance@x{\edef\tmp@{\endgroup
+ \def\noexpand\prevhowclose@{\prevhowclose@}%
+ \def\noexpand\prevnext@{\next}\def\noexpand\howcvxclose@{\howclose@}}%
+ \tmp@ \dimen@=\prevhowclose@ \relax
+ \ifdim\dimen@<\howclose@ \relax \DN@{\splineclosest@\begingroup}%
+ \else\ifdim\howcvxclose@=\dimen@\DN@{\splineclosest@\begingroup}%
+ \else\DN@{\splineadvance@@\begingroup}\fi\fi \next@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Miscellaneous features}
+%
+The command |\clearcurve| was originally provided to discard the curve
+information, and return to the graphics state before the curve was read,
+if this is ever found to be necessary. This will probably be removed.
+
+\DOCMODE(
+\xydef@\xyclearcrv@{\cv@end\cv@restore\loop@
+ \expandafter\let\csname cv@\number\crv@cnt@\endcsname\relax
+ \ifnum\crv@cnt@>0\advance\crv@cnt@\m@ne\repeat@
+ \let\cv@start=\relax \let\cv@end=\relax \let\cv@restore=\relax \POS}
+\xylet@\clearcurve=\xyclearcrv@
+\DOCMODE)
+
+\TODO:
+Define an |\extendcurve| as a <postcurve> which allows the curve
+to be continued smoothly past the endpoint $c$.
+
+A macro can be used within the modifier, to provide different labels
+at each control point. For example\dots
+
+\begin{code}
+\newcount\cptlabel\global\cptlabel=0
+\def\nextcptlabel{\global\advance\cptlabel 1 %
+ \number\cptlabel}
+\xy (0,0)*+{A}; (50,-10)*+{B}
+**\crv~Pc{~*{\nextcptlabel}(10,-10)
+ &(20,15)&(30,-15)&(40,15)} \endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Two control sequences are provided to access the control points.
+Firstly |\numcontrolpts| returns the number of them,
+while |\xycontrolpt|<num> sets $c$ to be the particular control point.
+Here <num> must be a single digit, grouped integer \eg\ |{-15}|
+or count register containing a numerical value.
+If larger than |\numcontrolpts| then $c$ becomes the end-point of the curve,
+while if zero it becomes the starting point.
+A negative value sets both $p$ and $c$ to be the starting point,
+whereas other values leave $p$ unchanged.
+
+\DOCMODE(
+\xylet@\numcontrolpts=\xynumctrlpts@
+
+\xydef@\xycontrolpt@#1{{%
+ \ifnum#1<\z@\aftergroup\cv@restore\aftergroup\cv@start
+ \else
+ \expandafter\count@\xycrvptsnum@\relax \advance\count@\@ne
+ \ifnum#1>\count@ \ifx\cv@end\relax
+ \expandafter\aftergroup\csname cv@\number#1\endcsname
+ \else\aftergroup\cv@end\fi
+ \else
+ \expandafter\ifx\csname cv@\number#1\endcsname\relax
+ \ifnum#1=\z@\aftergroup\cv@start\else\aftergroup\cv@end\fi
+ \else\expandafter\aftergroup\csname cv@\number#1\endcsname
+ \fi\fi\fi}}%
+\xylet@\xycontrolpt=\xycontrolpt@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Storing control point locations:}
+
+Upon starting to read the control points for a curve,
+first set the counter |\crv@cnt@| to be zero.
+Store the position of $p$ and $c$ and the current base in control sequences
+|\cv@start|, |\cv@end| and |\cv@restore| for later retrieval and to
+reinstate the current graphics state. |\cv@start| is a little more
+complicated in order to retain the existing value of $p$.
+
+\DOCMODE(
+\xydef@\startxycurve@@{\crv@cnt@=\z@
+ \edef\cv@start{\cfromthep@}%
+ \ifdim\zz@\R@c \ifdim\zz@\L@c \ifdim\zz@\D@c \ifdim\zz@\U@c
+ \Edge@c={\zeroEdge}\fi\fi\fi\fi
+ \edef\cv@end{\cfromthec@}%
+ \edef\cv@restore{\pfromthep@\basefromthebase@}}
+\xylet@\startxycurve@=\startxycurve@@
+
+\xylet@\cv@start=\relax
+\xylet@\cv@end=\relax
+\xylet@\cv@restore=\relax
+\xydef@\readxycurve@{\startxycurve@\xycrvmods@}
+\xylet@\readxycurve=\readxycurve@
+\DOCMODE)
+
+
+The position of each control point is stored as the expansion
+of a control sequence whose name encodes its place within the $<poslist>$.
+Expanding this control sequence sets $c$ to be the appropriate position.
+
+\DOCMODE(
+\xydef@\addtocrv@{\advance\crv@cnt@\@ne
+ \edef\tmp@{%
+ \expandafter\noexpand\csname cv@\number\crv@cnt@\endcsname}%
+ \expandafter\edef\tmp@{\cfromthec@}%
+ \edef\tmp@{\noexpand\addtocrvpts@{\noexpand\def
+ \expandafter\noexpand\tmp@{\X@c=\the\X@c \Y@c=\the\Y@c }}}\tmp@
+ \edef\xycrvptsnum@{\the\crv@cnt@}%
+}
+\DOCMODE)
+% use of |\xycrvptsnum@| here is not desirable, but it works.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Alternate curve styles:}
+
+\DOCMODE(
+\xydef@\xycrvdrop@{ {\zerodot}}
+\xydef@\xycrvconn@{}
+
+\xydef@\xyc@trlpts@{\def\xycrvdrop@{ \dir{x}}\def\xycrvconn@{}%
+ \afterCURVE{\savecrvobjects@\xyctrlpts@}\readxycurve@}
+\xydef@\xyc@trlpts@@{%
+ \afterCURVE{\savecrvobjects@\def\xycrvdrop@{ \dir{x}}%
+ \def\xycrvconn@{}\xyctrlpts@}\readxycurve@}
+\xydef@\xyc@vxhull@{\def\xycrvdrop@{ {}}%
+ \edef\xycrvconn@{ \noexpand\dir{\addDASH@{}}}%
+ \afterCURVE{\savecrvobjects@\xycvxhull@}\readxycurve@}
+\xydef@\xyc@vxhull@@{%
+ \afterCURVE{\savecrvobjects@\def\xycrvdrop@{ {}}%
+ \edef\xycrvconn@{ \noexpand\dir{\addDASH@{}}}\xycvxhull@}\readxycurve@}
+\xylet@\controlpts=\xyc@trlpts@
+\xylet@\convexhull=\xyc@vxhull@
+\xydef@\savecrvobjects@{\bgroup
+ \expandafter\toks@\expandafter{\xycrvdrop@}%
+ \expandafter\toks@ii\expandafter{\xycrvconn@}%
+ \edef\tmp@{\egroup\noexpand\def\noexpand\resetcrvobjects@{%
+ \noexpand\def\noexpand\xycrvdrop@{\the\toks@}%
+ \noexpand\def\noexpand\xycrvconn@{\the\toks@ii}%
+ }}\tmp@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+There is the potential to do many other things here, by using |\afterCURVE|,
+once the list of control points has been read.
+
+\DOCMODE(
+\xydef@\afterCURVE#1{\def\afterCURVE@{#1}}
+\xydef@\endxycurve@{\cv@end\savectrlptsnum@
+ \expandafter\def\csname params@\endcsname{\the\crvpts@}%
+ \cv@restore\afterCURVE@\POS}
+\xylet@\endcurve=\endxycurve@
+\DOCMODE)
+
+In fact this is essentially how |\controlpts| and |\convexhull|
+were interfaced before extensions were added to change styles.
+
+\begin{code}
+\def\controlpts{\afterCURVE{\xyctrlpts}%
+ \readxycurve}
+\def\convexhull{\afterCURVE{\xycvxhull}%
+ \readxycurve}
+\end{code}
+\displaycode
+
+\noindent
+The real work is done by |\xyctrlpts| and |\xycvxhull|.
+At the point when these macros are expanded the graphics state has the
+restored $p$ and $c$ to their original values,
+\ie\ the end-points of the curve.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{|\controlpts|:}
+
+This macro visits in order each of the control points dropping the requisite
+object. The connection style is not used and the direction does not change.
+For a loop-counter we use |\count@@@|.
+
+\DOCMODE(
+\xydef@\xyctrlpts@{\cv@end \cv@restore
+ \def\crvconnect@{\straitconnect@}%
+ \ifnum\crv@cnt@>\z@
+ \count@@@=\@ne \DN@{\loop@\xycontrolpt@{\count@@@}\relax
+ \expandafter\xycvxhulldrop@\xycrvdrop@
+ \ifnum\crv@cnt@>\count@@@\advance\count@@@\@ne\repeat@
+ \cv@end \cv@restore }%
+ \else\DN@{\relax}\fi \next@ }
+\xylet@\xyctrlpts=\xyctrlpts@
+\DOCMODE)
+
+The token list |\crvpts@| stores the following information:
+current scope ||, location of $p$ and $c$,
+number of control points |\crv@cnt@| and their locations.
+It does this by storing |\def|s for control sequence names,
+depending on the scope, which expand to this information.
+Thus by executing |\the\crvpts@| at the right level,
+the information is conveniently recovered via control sequences which
+do not conflict with anything else, and whose names can be reconstructed.
+
+\DOCMODE(
+\xydef@\addtocrvpts@#1{\crvpts@=\expandafter{\the\crvpts@#1}}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\savescope@{\crvpts@={}%
+ \edef\tmp@{\expandafter\noexpand\csname cv@0\endcsname}%
+ \edef\tmp@{\noexpand\addtocrvpts@{\noexpand\def
+ \expandafter\noexpand\tmp@{\X@c=\the\X@p \Y@c=\the\Y@p}}}%
+ \tmp@ }
+
+\xydef@\savectrlptsnum@{%
+ \advance\crv@cnt@\@ne \edef\tmp@{%
+ \expandafter\noexpand\csname cv@\number\crv@cnt@\endcsname}%
+ \edef\tmp@{\noexpand\addtocrvpts@{\noexpand\def
+ \expandafter\noexpand\tmp@{\X@c=\the\X@c \Y@c=\the\Y@c}}}\tmp@
+ \advance\crv@cnt@\m@ne
+ \edef\tmp@{\expandafter\noexpand\csname ptsnum@\endcsname}%
+ \edef\tmp@{\noexpand\addtocrvpts@{%
+ \noexpand\def\expandafter\noexpand\tmp@{\number\crv@cnt@}}}%
+ \tmp@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Convex Hull:}
+
+This macro visits in order each of the control points dropping the requisite
+object. With the previous as $p$ and the current one as $c$, a connection
+is set in the requisite style. For a loop-counter we use |\count@@@|.
+
+Use a group |{\expandafter\POS\xycrvconn@}| else the |\loop@| gets upset.
+This does not affect the size of the \Xy-picture, since the dropped objects
+are not similarly shrouded.
+
+Also used for the trivial case where there are no control points, hence
+a straight line between $p$ and $c$ is what is requested.
+
+\DOCMODE(
+\xydef@\xycvxhull@{\cv@end \cv@restore
+ \addtocrvpts@{\def\crvconnect@{\straitconnect@}}%
+ \def\crvconnect@{\straitconnect@}%
+ \ifnum\crv@cnt@>\z@
+ \count@@@=\@ne\relax \DN@{\loop@\xycontrolpt@{\count@@@}\relax
+ \expandafter\xycvxhulldrop@\xycrvdrop@
+ {\expandafter\connect\xycrvconn@{}}\pfromc@
+ \ifnum\crv@cnt@>\count@@@\relax \advance\count@@@\@ne\repeat@
+ \cv@end }%
+ \else
+ \ifx\empty\xycrvconn@
+ \edef\xycrvconn@{\noexpand!C\noexpand\dir{\addDASH@{}}}\fi
+ \DN@{\relax}\fi \next@
+ {{\expandafter\connect\xycrvconn@{}}}%
+ \cv@end \cv@restore }
+\xylet@\xycvxhull=\xycvxhull@
+
+\xydef@\xycvxhulldrop@#1#{\drop@{#1}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Spline constructions}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The control sequence |\xysplineparams@| provides a way to access a control
+sequence name that is unique to the current \Xy-pic scope.
+This control sequence will be used to store the parameters which determine
+the spline curve. Similarly |\xysplineedges@| will be used to store the
+parameter values and lengths (along the squine) to the locations where
+the spline crosses the edge of the objects at the ends $p$ and $c$.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\savespline@{%
+\splinetrace@{savespline@:}%
+% \edef\endspline@{\endgroup
+ \edef\endspline@{\endgroup
+ \savesplineparams@ \savesplinerefs@
+ \X@min=\the\X@min\relax \X@max=\the\X@max\relax
+ \Y@min=\the\Y@min\relax \Y@max=\the\Y@max\relax
+ \ifInvisible@\noexpand\Invisible@true
+ \else\noexpand\Invisible@false\fi
+ }\endspline@
+ \edef\tmp@{\noexpand\addtocrvpts@{\savesplineparams@}}\tmp@
+ \xycontrolpt@\z@ \cv@end }
+
+\xydef@\savesplineparams@{%
+ \noexpand\def\expandafter\noexpand\xysplineedges@{\xysplineedges@}}
+
+\xydef@\savesplinerefs@{%
+ \noexpand\def\noexpand\xysplineparams@{%
+ \expandafter\noexpand\xysplineparams@}%
+ \noexpand\def\noexpand\xysplineedges@{%
+ \expandafter\noexpand\xysplineedges@}%
+}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+One new box register is required, for the object used to actually
+set the curve, \dots
+
+\DOCMODE(
+\xynew@{box}\splinebox@
+\DOCMODE)
+
+\dots\ and 4 dimen registers ...
+
+\DOCMODE(
+\xynew@{dimen}\splineval@
+\DOCMODE)
+\dots\ which is for tracking the natural spline parametrization;
+
+\DOCMODE(
+\xynew@{dimen}\splinedepth@
+\DOCMODE)
+\dots\ which is for tracking he depth of the recursive algorithms;
+
+\DOCMODE(
+\xynew@{dimen}\splinetol@
+\DOCMODE)
+\dots\ which contains the tolerance for the spline,
+(this can probably be shifted to an ordinary macro);
+
+\DOCMODE(
+\xynew@{dimen}\splinelength@
+\DOCMODE)
+\dots\ which accumulates a measure of the length along a spline curve.
+(Currently this is not being used, as most things can be done
+satisfactorily using the spline parametrization only.)
+
+
+Some new conditionals are also required. These are for testing whether
+successive places on the squine are sufficiently close together,
+and whether the objects should be placed or not.
+
+\DOCMODE(
+\xynew@{if}\ifsplinefar@
+\xynew@{if}\ifsplineplot@ % to plot points or not
+\DOCMODE)
+
+Provide some tracing ability, for debugging.
+
+\DOCMODE(
+\xydef@\splinetracing{\let\splinetrace@=\W@}
+\xydef@\splineignore@#1{}
+\xylet@\splinetrace@=\splineignore@
+\DOCMODE)
+
+\medskip
+
+The parameters for the current section of the spline are stored indirectly
+in |\xysplineparams@|, while information concerning the places where the
+spline crosses the edges of objects at $p$ and $c$ is stored indirectly in
+|\xysplineedges|.
+A control sequence |\readsplineparams@| is used to extract this information.
+Each spline type must provide a |\getsplineparams@| which
+puts the information into easily usable form.
+
+\DOCMODE(
+\xydef@\readsplineparams@{%
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+ \expandafter\expandafter\expandafter\getsplineedges@safe\xysplineedges@ @@}
+
+\xydef@\getsplineedges@safe#1@@{\DN@{#1}%
+ \ifx\next@\empty \DN@{\getsplineedges@.0pt;0.0pt,0.0pt;0.0pt,}%
+ \else \DN@{\getsplineedges@safe@#1@@}\fi \next@}
+
+\xydef@\getsplineedges@safe@#1;#2,#3@@{\DN@{#3}%
+\splinetrace@{getsplineedges@safe}%
+ \ifx\next@\empty \DN@{\getsplineedges@#1;#2,0.0pt;0.0pt,}%
+ \else \DN@{\getsplineedges@#1;#2,#3}\fi \next@}
+\DOCMODE)
+
+The edge locations are stored as $x.y$
+where $x+1$ = spline-segment number and
+$y$ or $1-y$ = parameter value of the start, resp. finish,
+in the segment $x+1$.
+
+\DOCMODE(
+\xydef@\getsplineedges@#1;#2,#3;#4,{%
+ \global\dimen@i=#1\global\dimen5=#2\relax
+ \dimen@=#3\multiply\dimen@\m@ne \advance\dimen@\splinelength@
+ \global\dimen3=\dimen@
+ \dimen@=#4\relax
+ \ifdim\dimen@>\p@ \xywarning@{edge out-of-range: \the\dimen@}%
+ \count@=\dimen@ \divide\count@\p@
+ \advance\dimen@-\count@\p@ \multiply\dimen@\m@ne
+ \advance\dimen@ \count@\p@ \advance\dimen@\p@
+\splinetrace@{\the\dimen@}%
+ \else
+ \multiply\dimen@\m@ne \advance\dimen@\p@
+ \fi
+ \global\dimen7=\dimen@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent Sometimes \TeX\ will run short of memory when many curves are
+used without a backend with special support for curves. In that case
+the following commands, that obey normal \TeX\ groupings, may be
+helpful:
+%
+\begin{defs1}
+|\SloppyCurves| \cr
+|\splinetolerance{|<dimen>|}| \cr
+\end{defs1}
+\noindent\unskip
+%
+allow adjustment of the tolerance used to typeset curves. The first sets
+tolerance to .8pt, after which |\splinetolerance{0pt}| resets to
+the original default of fine curves.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Some useful methods for accurate division by integers.
+
+\DOCMODE(
+\xydef@\dimen@half{%
+ \advance\dimen@ \ifdim\dimen@<\z@-\fi 1sp \divide\dimen@\tw@}
+
+\xydef@\halve@dimen#1{\dimen@=#1\relax \dimen@half #1=\dimen@}
+
+\xydef@\dimen@nth#1#2{\dimen@=#2\relax \dimen@ii=#1sp %
+ \advance\dimen@ \ifdim\dimen@<\z@-\fi.5\dimen@ii
+ \divide\dimen@ by#1\relax #2=\dimen@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Before constructing the curve we first examine the ``drop'' object,
+setting it in an |\xybox|. The size of this object determines the
+spacing of objects placed along the curve, via the {\em tolerance\/}
+of the spline. This determines the maximum separation of places at
+which objects will be dropped; \ie\ when two adjacent places would
+be separated by more than this amount, the spline algorithm
+constructs another place on the curve intermediate between these two.
+
+\noindent{\bf Note: } Alter the spline tolerance by adjusting the size
+of the ``drop'' object. In particular, a dotted line can be achieved by
+setting an empty object with non-zero size. If the size is zero then the
+default tolerance is used. Initially this is .4pt; it may be altered
+using |\splinetolerance|<dimen>, where <dimen> must be greater than
+zero, else the initial tolerance is reset.
+
+\DOCMODE(
+\xydef@\splinetolerance@#1{\dimen@=#1\relax
+ \ifdim\dimen@>\z@ \splinetol@=\dimen@
+ \else\splinetol@=.4\p@\fi}
+
+\xylet@\splinedefaulttol@=\relax
+
+\xydef@\splinetolerance#1{\splinetolerance@{#1}%
+ \edef\splinedefaulttol@{\splinetol@=\the\splinetol@}}
+
+\splinetolerance\z@
+
+\xydef@\SloppyCurves{\splinetolerance{.8\p@}}
+
+\xydef@\xylowtolerance@{\splinedefaulttol@
+ \ifdim\splinetol@<\p@ \divide\splinetol@\tw@ \fi}
+\DOCMODE)
+
+Similarly examine the ``connect'' object. If none has been specified
+then there is no need to calculate the tangent direction at each
+place along the curve. This saves on both time and memory requirement.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+"Procedure":
+(1)~If |\xycrvdrop@| is empty, define |\splinedrop@| to expand
+to |\copy\zerodotbox@|, thus creating a curve constructed from small dots.
+Otherwise (2a)~set the |\splinebox@| with the specified object and
+(2b)~use |\copy\splinebox@| as the expansion of |\splinedrop@|.
+(3)~Set |\splinetol@| to be $\sqrt2\times$ maximum of width and
+height+depth of the box.
+
+If |\xycrvconn@| is empty~(4)~then |\splineconn@| is set to |\relax|.
+(5)~Otherwise it is necessary to reset the direction at each
+place along the curve before dropping the object specified
+by |\xycrvconn@|.
+
+\DOCMODE(
+\xywarnifdefined\splinedrop@
+\xydef@\setstdsplinedrop@{%
+ \setbox\splinebox@=\hbox\bgroup
+ \setboxz@h{\expandafter\object\xycrvdrop@{}}%
+ \splinedefaulttol@ \dimen@=\wd\z@ \dimen@ii=\ht\z@ \advance\dimen@ii\dp\z@
+ \ifdim\dimen@ii>\dimen@ \dimen@=\dimen@ii \fi \dimen@=1.4142\dimen@
+ \ifdim\dimen@>\splinetol@ \splinetol@=\dimen@\else\dimen@=\splinetol@\fi
+ \dimen@=.5\wd\z@
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \kern-\dimen@ \Drop@@ \kern\dimen@
+ \edef\tmp@{\egroup \splinetol@=\the\splinetol@
+ \ifInvisible@\noexpand\Invisible@true
+ \else\noexpand\Invisible@false\fi}\tmp@
+ \edef\splinedefaulttol@{\splinetol@=\the\splinetol@}%
+ \def\splinedrop@{\copy\splinebox@\splineextra@@}}
+
+\xywarnifdefined\splineconn@
+\xydef@\stdsplineconn@{{\setsplinedir@ % %(5)
+ \setboxz@h\bgroup\expandafter\object\xycrvconn@{}%
+ \edef\tmp@{\egroup\L@c=\the\L@c \R@c=\the\R@c \D@c=\the\D@c \U@c=\the\U@c
+ \noexpand\def\noexpand\Drop@@}\expandafter\tmp@\expandafter{\Drop@@}%
+ \setboxz@h{\kern-\L@c \boxz@}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \Drop@@}}
+
+\xydef@\setcrvobjects@{\setstdsplinedrop@ \def\splineconn@{\stdsplineconn@}}
+\xylet@\splineextra@@=\relax
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\splinenear@#1#2#3#4{{\d@X=#1\advance\d@X-#2%
+ \ifdim\d@X<\z@ \d@X=-\d@X\fi
+ \ifdim\splinetol@<\d@X \aftergroup\splinefar@true
+ \else \d@Y=#3\advance\d@Y-#4\ifdim\d@Y<\z@ \d@Y=-\d@Y\fi
+ \ifdim\splinetol@<\d@Y\aftergroup\splinefar@true
+ \else \xydist@\d@X\d@Y
+ \ifdim\splinetol@<\dimen@ \aftergroup\splinefar@true
+ \else
+ \ifdim\dimen@<.1\splinetol@\aftergroup\splinetooclose@\fi
+ \fi\fi\fi}}
+
+\xydef@\splineadvance@@{\global\advance\splineval@\splinedepth@}
+\DOCMODE)
+
+This stops objects being placed too close together along the spline.
+It is necessary at the beginning of a segment with a non-zero edge.
+Otherwise, with a large |\splinetolerance@|, the accuracy of the
+place-finding mechanism results in being so deep in the tree that
+objects placed at every level on the way up would be much too close.
+
+\DOCMODE(
+\xydef@\splinetooclose@{\aftergroup\aftergroup\aftergroup\splinetooclose@@}
+\xydef@\splinetooclose@@{\def\splineplotpt@{\relax}}
+\DOCMODE)
+
+Each place along the curve is tested according to a |\splinetest@|.
+Normally this is for visibility according to the extent of the objects
+at the end-points of the curve.
+When an edge is crossed then the |\splinecontinue| routine is called
+to decide how the behaviour may change e.g. whether the recursion
+should continue or exit to the top of the existing tree.
+
+\DOCMODE(
+\xydef@\splinepoint@@{%
+\splinetrace@{P@:(\the\X@c,\the\Y@c)::\the\splineval@;\the\splinedepth@}%
+ {\splinetest@\ifsplineplot@\relax\else\aftergroup\splinecontinue\fi}}
+
+\xydef@\splinepoint@{%
+ {\splinetest@\ifsplineplot@\aftergroup\splinecontinue\fi}}
+\xylet@\splinepoint=\splinepoint@
+
+\xydef@\splinecontinue@{%
+ \global\let\splinepoint=\splinepoint@@
+ \global\let\splinecontinue=\splinecontinue@@}
+\xydef@\splinecontinue@@{%
+ \global\let\splinepoint=\splinepoint@
+ \global\let\splinecontinue=\relax}
+\xylet@\splinecontinue=\splinecontinue@
+
+\DOCMODE)
+
+Points where segments join lie at the top of the recursive tree.
+They are tested directly against the objects at the endpoints,
+in order to decide whether or not they are visible.
+
+\DOCMODE(
+\xydef@\splineknotpoint@{{\X@p=\X@c \Y@p=\Y@c \cv@start
+ \the\Edge@c\@ne \ifInside@\else\aftergroup\splineknotpoint@@\fi}}%
+\xydef@\splineknotpoint@@{{\X@p=\X@c \Y@p=\Y@c \cv@end
+ \the\Edge@c\@ne \ifInside@\else \aftergroup\splinepoint\fi}}%
+
+\xylet@\firstsplinepoint@=\splineknotpoint@
+\xylet@\lastsplinepoint@= \splineknotpoint@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This routine is used to find where the spline crosses
+the edges of the objects at $p$ and $c$.
+First (1)~ we set up the tests which will determine when
+the edge has been crossed. Then commence the scan.~(2)
+
+\DOCMODE(
+\xydef@\splined@@@{%
+\splinetrace@{finding end types}%
+\splinetrace@{bstartPLACE@:\bstartPLACE@; bendPLACE@:\bendPLACE@}%
+ \DN@{\splinescan@}\ifx\bstartPLACE@\empty
+ \ifx\bendPLACE@\relax\def\bendPLACE@{1}\fi
+ \else\ifx\bstartPLACE@\relax
+ \else\ifx\bstartPLACE@\undefined
+ \else
+ \DN@{\splinescanbreak@}\ifx\bendPLACE@\relax\def\bendPLACE@{1}\fi
+ \DNii@{0}\ifx\bstartPLACE@\nextii@
+ \DNii@{1}\ifx\bendPLACE@\nextii@\DN@{}%
+% \else\DNii@{0.0}\ifx\bendPLACE@\nextii@\DN@{}\fi
+ \fi\fi % use the saved values
+ \fi\fi\fi \next@ }% %(2)
+
+\xydef@\splineStarttest@{{\X@p=\X@c \Y@p=\Y@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineEndtest@{{\X@p=\X@c \Y@p=\Y@c \cv@end \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+
+\xydef@\splineBreakStarttest@{{\X@p=\X@c \Y@p=\Y@c \cv@brstart \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+
+\xydef@\splineBreakEndtest@{{\X@p=\X@c \Y@p=\Y@c \cv@brend \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}%
+% \ifInside@\aftergroup\splineplot@true\else\aftergroup\splineplot@false\fi}}%
+
+\xylet@\splineStarttest=\splineStarttest@
+\xylet@\splineEndtest=\splineEndtest@
+
+\xydef@\splineSlowStarttest{{\X@p=\X@c \Y@p=\Y@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@maybe@@\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineSlowEndtest{{\X@p=\X@c \Y@p=\Y@c \cv@end \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@maybe@@\else\aftergroup\splineplot@true\fi}}%
+\xydef@\splineplot@maybe{\splineplot@false}%
+\xylet@\splineplot@maybe@@=\splineplot@maybe
+\DOCMODE)
+
+(3)~Start a new group and bind some macros appropriate
+to finding the starting edge.
+(4)~start the spline algorithm, using a small tolerance.
+(5)~Close the group, thus removing the bindings of~(3).
+(6)~Record the information, which has been stored globally.
+(7)~Do the same for the ending edge.
+(8)~Clear the global information.
+After this, set the curve as usual.~(9)
+
+\DOCMODE(
+\xydef@\splinescan@{\bgroup%
+ \expandafter\def\xysplineedges@{\z@;\z@,\z@;\z@,}%
+ \bgroup \cv@start
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \gdef\splineedges@{\z@;\z@,}%
+ \else\aftergroup\splinestartScan@\fi
+ \egroup \relax
+ \bgroup \cv@end
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@
+ \getcrvsegsnum@ \edef\segmentnum@{\the\count@}%
+ \splineval@=\z@ \splineRecordEndValue@
+ \else\aftergroup\splineendScan@\fi
+ \egroup \egroup
+ \expandafter\testsplineedges@\splineedges@;,@@%
+ \expandafter\edef\xysplineedges@{\splineedges@}% %(6)
+ \global\let\splineedges@=\relax % %(8)
+\splinetrace@{edge params: \xysplineedges@}}%
+
+\xydef@\testsplineedges@#1;#2,#3;#4,#5@@{%
+ \DN@{#5}\ifx\next@\empty
+ \DNii@{#4}\ifx\nextii@\empty
+ \xynoedgespline@{end}\def\splineedges@{#1;#2,\z@;\z@,}\fi
+ \DNii@{#2}\ifx\nextii@\empty
+ \xynoedgespline@{start}\def\splineedges@{\z@;\z@,\z@;\z@,}\fi
+ \fi }
+\xydef@\xynoedgespline@#1{\xywarning@{#1 edge of spline not found}}%
+
+\xydef@\splinestartScan@{\bgroup % %(3)
+\splinetrace@{scan for start}%
+ \global\let\splineadvance@=\splineadvance@@ %(3)
+ \let\spline@start=\splinefindStart@ %(3)
+ \let\spline@end=\spline@end@@ %(3)
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\splinelength@=\z@
+% \let\splinerec@=\splineSrec@
+ \def\splinerec@{\let\splinerec@=\splineSrec@ \splinedecast@@}%
+ \edef\splineedges@{}%
+ \expandafter\let\xysplineedges@\relax
+% \bgroup
+ \xylowtolerance@ \splined@@
+ \ifx\splineedges@\empty\expandafter\splineslowScan@\fi
+ \ifx\splineedges@\relax\expandafter\splinenostart@\fi
+ \egroup }% %(4)
+
+\xydef@\splineslowScan@{%
+ \let\splineStarttest=\splineSlowStarttest
+ \let\splinescanStarttest=\relax
+ \def\splinerec@{\let\splinerec@=\splineSrec@ \splinedecast@@}%
+ \splined@@ }
+
+\xydef@\splineslowEnd@{%
+ \global\let\splineEndtest=\splineSlowEndtest
+ \let\splinescanEndtest=\relax
+ \def\splinerec@{\let\splinerec@=\splineErec@ \splinedecast@@}%
+ \splined@@ }
+
+\xydef@\splinenostart@{%
+ \def\segmentnum@{1}\splinelength@=\z@ \splineval@=\z@
+ \xynoedgespline@{start}\splineRecordValue@ }
+
+\xydef@\splineendScan@{\bgroup % %(3)<-----------
+ \bgroup % %(7)
+\splinetrace@{scan for end}%
+ \global\let\splineadvance@=\splineadvance@@
+ \let\spline@start=\splinefindEnd@
+ \let\spline@end=\spline@end@@
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\splinelength@=\z@
+% \let\splinerec@=\splineErec@
+ \global\let\splineEndtest=\splineEndtest@
+ \def\splinerec@{\let\splinerec@=\splineErec@ \splinedecast@@}%
+ \expandafter\def\expandafter\prevedges@\expandafter{\splineedges@}%
+ \xylowtolerance@ \splined@@
+ \ifx\splineedges@\prevedges@\expandafter\splineslowScan@\fi
+ \egroup \egroup}
+
+\xydef@\splinescanbreak@{%
+\splinetrace@{SCANBREAK}%
+ \gdef\breakedges@{}%
+ \DN@{0}\ifx\next@\bstartPLACE@
+ \DN@{\bgroup \def\tmp@####1;####2,####3;####4,{%
+ \global\splineval@=####2\relax}%
+ \expandafter\expandafter\expandafter\tmp@\xysplineedges@
+ \def\segmentnum@{1}\splineRecordBreakValue@ \egroup}%
+ \else
+ \bgroup \cv@start
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \aftergroup\splinezerostart
+ \else\aftergroup\splinewidestart\fi
+ \egroup
+ \fi \next@
+ \DN@{1}\ifx\next@\bendPLACE@
+ \DN@{\bgroup \def\tmp@####1;####2,####3;####4,{%
+ \global\splineval@=####4\relax}%
+ \expandafter\expandafter\expandafter\tmp@\xysplineedges@
+%% \multiply\splineval@\m@ne \advance\splineval@\p@
+%% \def\segmentnum@{1}
+ \getcrvsegsnum@ \edef\segmentnum@{\the\count@}%
+ \global\multiply\splineval@\count@
+ \splineRecordEndBreakValue@ \egroup}%
+ \else
+ \bgroup \cv@end
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \aftergroup\splinezeroend
+ \else\aftergroup\splinewideend\fi
+ \egroup
+ \fi \next@
+ \expandafter\def\expandafter
+ \xybreakedges@\expandafter{\breakedges@}% %(6)
+ \global\let\breakedges@=\relax % %(8)
+\splinetrace@{break params: \xybreakedges@::\bstartPLACE@--\bendPLACE@}%
+ \expandafter\let\xysplineedges@\xybreakedges@ }
+
+\xydef@\getcrvsegsnum@{% sets \count@
+ \count@=\ptsnum@\relax \ifnum\count@>\@ne\advance\count@\m@ne\fi}
+
+\xydef@\splinezerostart{\DN@{\bgroup
+\splinetrace@{splinezerostart:}%
+ \dimen@=\bstartPLACE@\p@
+ \global\splineval@=\dimen@
+ \splineRecordBreakValue@ \egroup }}
+
+\xydef@\splinezeroend{\DN@{\bgroup
+\splinetrace@{splinezeroend:}%
+ \dimen@=\bendPLACE@\p@
+ \multiply\dimen@\m@ne \advance\dimen@\p@
+ \def\segmentnum@{0}\global\splineval@=\dimen@
+ \splineRecordEndBreakValue@ \egroup }}
+
+\xydef@\splinewidestart{\DN@{\bgroup
+ \splinetrace@{scan for start}%
+ \let\splinefbcontinue@=\breakstartcontinue@
+ \let\splinef@pt=\splinef@breakpt
+ \let\splinef@end=\break@start
+ \edef\tmp@{{\bstartPLACE@}}%
+ \expandafter\splinealong@@\tmp@\z@>\endgroup\egroup }}
+
+\xydef@\splinewideend{\DN@{\bgroup
+ \splinetrace@{scan for wide end}%
+ \let\splinefbcontinue@=\breakendcontinue@
+ \let\splinef@pt=\splinef@breakpt
+ \let\splinef@end=\break@end
+ \edef\tmp@{{\bendPLACE@}}%
+ \expandafter\splinealong@@\tmp@\z@<\endgroup\egroup }}
+
+
+\xydef@\splineSrec@{{%
+\splinetrace@{v=\the\splineval@ + d=\the\splinedepth@ :
+ (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c):Srec }%
+ \splineStarttest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \global\advance\splineval@ .5\splinedepth@
+ \else\aftergroup\splinedecast@@ \fi
+ \else \aftergroup\splineadvance@ \fi}}
+
+\xydef@\splinefindStart@@{\bgroup \bgroup
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinepoint=\relax
+ \let\splinegoal@=\splineRecordValue@ \global\dimen5=\z@
+ {\X@c=\X@p \Y@c=\Y@p \splinescanStarttest }%% first test initial point.
+}
+
+\xydef@\splinefindStart@{%
+ \expandafter\crv@cnt@\xycrvptsnum@\relax
+ \ifnum\crv@cnt@>\tw@
+ \crv@cnt@=\@ne \splineplot@false \splinesegment@{\crv@cnt@}%
+ {\splineStarttest %% test end of segment.
+ \ifsplineplot@\aftergroup\splineplot@true\fi}%
+ \ifsplineplot@ \else \searchforStartsegment@ \fi
+ \splinesegment@{\crv@cnt@}%
+\splinetrace@{start is in segment \segmentnum@}%
+ \else \splinesegment@\@ne \fi
+ \splineplot@false \splinefindStart@@
+}
+\DOCMODE)
+
+This finds the first spline segment whose endpoint is beyond the edge of
+the object.
+
+\DOCMODE(
+\xydef@\searchforStartsegment@{\splineplot@true\loop@
+ \advance\crv@cnt@\@ne
+ \expandafter\count@\xycrvptsnum@\relax
+ \ifnum\count@=\crv@cnt@\expandafter\splineplot@false
+ \else
+ \splinesegment@{\crv@cnt@}{\splineStarttest
+ \ifsplineplot@\aftergroup\splineplot@false
+ \else\aftergroup\splineplot@true\fi }%
+ \fi \ifsplineplot@\repeat@
+}
+\DOCMODE)
+
+Finding the end is similar, but the spline is searched in reverse order.
+
+\DOCMODE(
+\xydef@\splinefindEnd@@{\bgroup \bgroup
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+\splinetrace@{params:\xysplineparams@}%
+ \splinereverse@@
+\splinetrace@{params:\xysplineparams@}%
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinepoint=\splinescanEndtest
+ \let\splinegoal@=\splineRecordEndValue@ \global\dimen5=\z@
+ {\X@c=\X@p \Y@c=\Y@p \splinescanEndtest }%% first test initial point.
+}
+
+\xydef@\splinereverse@@{\splinereverse@@@}
+\xydef@\splinereverse@@@{%
+ \def\postspline@{\d@X=-\d@X \d@Y=-\d@Y}%
+ \dimen@ii=\X@c \X@c=\X@p \X@p=\dimen@ii
+ \dimen@ii=\Y@c \Y@c=\Y@p \Y@p=\dimen@ii
+ \global\dimen5=-\dimen5\relax
+ \global\advance\dimen5\splinelength@ }
+\xydef@\postspline@{}
+
+\xydef@\splineErec@{{%
+ \dimen@=\splineval@ \advance\dimen@\splinedepth@ %
+\splinetrace@{ER (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+\the\dimen@,\the\splinedepth@}%
+ \splineEndtest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+% \global\advance\splineval@ .5\splinedepth@
+ \else\aftergroup\splinedecast@@ \fi
+ \else \aftergroup\splineadvance@ \fi}}
+
+\xydef@\splinefindEnd@{%
+ \expandafter\crv@cnt@\xycrvptsnum@\relax
+ \ifnum\crv@cnt@>\tw@
+ \advance\crv@cnt@\m@ne
+ \splineplot@false \splinesegment@{\crv@cnt@}%
+ {\X@c=\X@p \Y@c=\Y@p \splineEndtest %% test end of segment.
+ \ifsplineplot@\aftergroup\splineplot@true\fi }%
+ \ifsplineplot@
+ \else \searchforEndsegment@ \fi
+ \splinesegment@{\crv@cnt@}%
+\splinetrace@{end is in segment: \segmentnum@ }%
+ \else \splinesegment@\@ne \fi
+ \splineplot@false\splinefindEnd@@
+}
+\xydef@\searchforEndsegment@{\splineplot@true\loop@
+ \advance\crv@cnt@\m@ne
+ \ifnum\crv@cnt@=\z@\expandafter\splineplot@false
+ \else
+ \splinesegment@{\crv@cnt@}{\X@c=\X@p \Y@c=\Y@p \splineEndtest
+ \ifsplineplot@\aftergroup\splineplot@false
+ \else\aftergroup\splineplot@true\fi}%
+ \fi \ifsplineplot@\repeat@
+}
+\DOCMODE)
+
+These are the tests, to determine when the edge-point has been found.
+
+\DOCMODE(
+\xydef@\splinescanStarttest{%
+\splinetrace@{SST (\the\X@c,\the\Y@c); \the\splinelength@, \the\splineval@}%
+ {\splineplot@false\splineStarttest
+ \ifsplineplot@\expandafter\splinefinish@\fi}}
+
+\xydef@\splinescanEndtest{%
+\splinetrace@{SET (\the\X@c,\the\Y@c); \the\splinelength@, \the\splineval@}%
+ {\splineplot@false\splineEndtest
+ \ifsplineplot@\expandafter\splinefinish@\fi}}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\splineBrec@{{%
+ \dimen@=\splineval@ \advance\dimen@\splinedepth@ %
+\splinetrace@{BR (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+\the\dimen@,\the\splinedepth@}%
+ \splineEndtest
+ \ifsplineplot@ \aftergroup\splineadvance@ \else
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+% \global\advance\splineval@ .5\splinedepth@
+ \else\aftergroup\splinedecast@@ \fi \fi}}
+
+\xydef@\splineBSrec@{{%
+\splinetrace@{SR (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+\the\dimen@,\the\splinedepth@:SR}%
+ \splineStarttest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \global\advance\splineval@ .5\splinedepth@
+ \else \advance\splineval@\splinedepth@
+ \splinetest@ \advance\splineval@-\splinedepth@
+ \ifsplineplot@\aftergroup\splineadvance@
+ \else\aftergroup\splinedecast@@\fi
+ \fi
+ \else
+ \global\advance\splineval@\splinedepth@
+ \aftergroup\splinefinish@ \fi }}
+
+\xydef@\splineBErec@{{%
+ \dimen@=\splineval@ \advance\dimen@\splinedepth@ %
+\splinetrace@{BE (\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;;
+ \the\dimen@,\the\splinedepth@}%
+ \splineEndtest
+ \ifsplineplot@
+ \ifdim\splinedepth@<.0001\p@ \aftergroup\splinefinish@
+ \global\advance\splineval@ .5\splinedepth@
+ \else \advance\splineval@\splinedepth@
+ \splinetest@ \advance\splineval@-\splinedepth@
+ \ifsplineplot@\aftergroup\splineadvance@
+ \else\aftergroup\splinedecast@@\fi
+ \fi
+ \else
+ \ifdim\splinedepth@<\p@ \global\advance\splineval@\splinedepth@ \fi
+ \aftergroup\splinefinish@ \fi }}
+
+\xydef@\splinef@breakpt#1{% gobbles |\splinecancel|
+ \ifdim\splineval@>\z@
+\splinetrace@{found: val=\the\splineval@;(\the\X@c,\the\Y@c)}%
+ \else
+\splinetrace@{found: val=\the\splineval@;(\the\X@p,\the\Y@p)}%
+ \fi \splinefbcontinue@ }
+
+\xydef@\splinef@pt@@{%
+ \ifdim\splineval@>\z@
+\splinetrace@{found: val=\the\splineval@;c:(\the\X@c,\the\Y@c)}%
+ \global\dimen@i=\X@c \global\dimen3=\Y@c
+ \else
+\splinetrace@{found: val=\the\splineval@;p:(\the\X@p,\the\Y@p)}%
+ \fi
+ \setsplinedir@ \global\dimen5=\d@X \global\dimen7=\d@Y
+ \global\splineval@=\splineval@
+ \aftergroup\splinefocus@ }
+
+\xydef@\findbreakwarning@#1{%
+ \xywarning@{#1 of break not found: bSTART=\bstartPLACE@, bEND=\bendPLACE@}%
+ \DN@{#1}\def\DNii@{start}\ifx\next@\nextii@\splineRecordBreakValue@
+ \else\splineRecordEndBreakValue@\fi\egroup}%
+
+\xydef@\breakstartcontinue@{\bgroup \cv@start
+%\xystatus@{SS}%
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+ \ifx\next@\nextii@ \aftergroup\breakstartfound@
+ \else \aftergroup\breakstartcontinue@i\fi \egroup }%
+
+\xydef@\breakstartcontinue@i{%
+\splinetrace@{move to start edge, from (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+% \global\let\splinetest@=\splineStarttest
+ \global\let\splineEndtest=\splineBreakStarttest@
+ \global\let\splinetest@=\splineBreakStarttest@
+% \global\let\splinerec@=\splineSrec@
+ \gdef\splinerec@{\global\let\splinerec@=\splineSrec@ \splinedecast@@}%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\checkfoundSbreak@
+% \global\let\splinegoal@=\splineRecordBreakValue@
+ \global\let\splinegoal@=\splineRecordSBreakValue@
+ \global\let\splinefinish@=\splinefinish@@ }
+
+\xydef@\breakstartfound@{%
+\splinetrace@{found start edge, at (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splinetest@=\splineStarttest
+ \gdef\splinerec@{\splinegoal@ \global\let\splinerec@=\splinefinish@ }%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\relax %\checkfoundSbreak@
+ \global\let\splinegoal@=\splineRecordBreakValue@
+ \global\let\splinefinish@=\splinefinish@@
+ }
+
+\xydef@\checkfoundSbreak@{%
+ \ifnum\xycrvptsnum@<\thr@@\DN@{\findbreakwarning@{start}}%
+ \else\DN@{\searchBreakSsegment@}\fi \next@ }%
+
+\xydef@\searchBreakSsegment@{%
+ \crv@cnt@=\segmentnum@ \DN@{}\count@=\crv@cnt@
+ \DNii@{}\ifnum\splineval@=\z@ \ifnum\crv@cnt@=\@ne
+ \ifnum\xycrvptsnum@=\@ne\count@=\z@\DNii@{\egroup}\fi
+ \else \DN@{\egroup}\fi
+ \else \ifnum\splineval@=\m@ne
+ \else \advance\crv@cnt@\@ne \fi \fi
+ \ifnum\crv@cnt@=\xycrvptsnum@\relax
+ \ifnum\xycrvptsnum@>\tw@ \DNii@{\egroup}\fi
+ \DN@{\expandafter\splineRecordBreakValue@\nextii@}%
+ \else
+ \DN@{\splinesegment@{\crv@cnt@}\splinesetparams@
+ \splined@@ \egroup}%
+ \fi \next@ }
+
+\xydef@\checkfoundEbreak@{%
+ \ifnum\xycrvptsnum@<\thr@@\DN@{\findbreakwarning@{end}}%
+ \else\DN@{\searchBreakEsegment@}\fi \next@ }%
+
+\xydef@\searchBreakEsegment@{%
+ \crv@cnt@=\segmentnum@ \DN@{}\count@=\crv@cnt@
+ \DNii@{}\ifnum\splineval@=\z@ \ifnum\crv@cnt@=\@ne
+ \ifnum\xycrvptsnum@=\@ne\count@=\z@\DNii@{\egroup}\fi
+ \else\DN@{\egroup}\fi
+ \else \advance\crv@cnt@\m@ne \fi
+ \ifnum\count@=\z@
+% \ifnum\crv@cnt@=\z@
+ \ifnum\xycrvptsnum@>\tw@ \splineval@=\m@ne\p@
+ \DNii@{\egroup}\fi
+ \DN@{\expandafter\splineRecordEndBreakValue@\nextii@}\else
+ \DN@{\splinesegment@{\crv@cnt@}\splinereverse@
+ \readsplineparams@ \splined@@ \egroup}%
+ \fi \next@ }
+
+\xydef@\break@start{\egroup \egroup
+\splinetrace@{scan for start}%
+ \global\let\splineadvance@=\splineadvance@@ %(3)
+ \let\spline@start=\splinefindBStart@ %(3)
+ \let\spline@end=\egroup
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinepoint=\relax
+ \let\splinegoal@=\splineRecordBreakValue@
+ \global\dimen5=\z@ \global\splinelength@=\z@
+ \let\splinerec@=\splineSrec@
+ \def\breakedges@{}%
+ \bgroup \bgroup \splined@@ }
+
+\xydef@\splinefindBStart@{\bgroup
+% \global\splineval@=\z@ \global\splinedepth@=.5\p@}
+ \global\splineval@=\z@ \splinedepth@=.5\p@}
+
+\xydef@\breakendcontinue@{\bgroup
+ \edef\tmp@{\X@p = \the\X@c \Y@p=\the\Y@c}\cv@end\tmp@ % <--- irrelevant ?
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\zeroEdge}%
+%\xystatus@{EE}%
+ \ifx\next@\nextii@ \aftergroup\breakendfound@
+ \else\aftergroup\breakendcontinue@i\fi \egroup }%
+
+\xydef@\breakendcontinue@i{%
+\splinetrace@{move to end edge, from (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+% \global\let\splinetest@=\splineEndtest
+ \global\let\splineEndtest=\splineBreakEndtest@
+ \global\let\splinetest@=\splineBreakEndtest@
+ \gdef\splinerec@{\global\let\splinerec@=\splineErec@\splinedecast@@}%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\checkfoundEbreak@
+% \global\let\splinegoal@=\splineRecordEndBreakValue@
+ \global\let\splinegoal@=\splineRecordEBreakValue@
+ \global\let\splinefinish@=\splinefinish@@
+ \splinerec@ }
+
+\xydef@\splineRecordEBreakValue@{%\getcrvsegsnum@
+\splinetrace@{\the\count@\space segments, \the\splineval@}%
+% \ifnum\segmentnum@>\z@ \dimen@=\segmentnum@\p@ \else \dimen@=\p@\fi
+% \advance\dimen@-\splineval@\relax
+% \ifnum\count@>\@ne \divide\dimen@\count@\fi
+% \global\splineval@=\dimen@
+ \splineRecordEndBreakValue@ }
+
+\xydef@\splineRecordSBreakValue@{\getcrvsegsnum@
+ \dimen@=\splineval@
+ \advance\dimen@\segmentnum@\p@ \advance\dimen@-\p@
+ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@ \def\segmentnum@{1}%
+ \splineRecordBreakValue@ }
+
+\xydef@\breakendfound@{%
+\splinetrace@{found end edge, at (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splinetest@=\splineEndtest
+ \gdef\splinerec@{\splinegoal@ \global\let\splinerec@=\splinefinish@}%
+ \global\let\splinepoint=\relax
+ \global\let\spline@end=\relax %\checkfoundEbreak@
+ \global\let\splinegoal@=\splineRecordEndBreakValue@
+ \global\let\splinefinish@=\splinefinish@@ }
+
+
+\xydef@\break@end{\egroup \egroup
+ \global\let\splineadvance@=\splineadvance@@
+ \let\spline@start=\splinefindBEnd@
+ \let\spline@end=\egroup
+ \let\splinefinish@=\splinefinish@@
+ \let\splinewhich=\relax
+ \global\let\splineadvance@=\splineadvance@@
+ \global\let\splinegoal@=\splineRecordEndBreakValue@
+ \global\splinelength@=\z@
+ \let\splinerec@=\splineErec@
+ \global\let\splineEndtest=\splineEndtest@
+ \bgroup \splined@@ }
+
+\xydef@\splinefindBEnd@{\bgroup\bgroup
+ \splinereverse@ \readsplineparams@
+ \global\splineval@=\z@ }
+\DOCMODE)
+
+This appends the new information to that currently stored in the control
+sequence referenced by |\xysplineparams@|. It is temporarily stored
+globally in |\splineparams@|, to be later transferred to
+(the c.s. referenced by) |\xysplineparams@| when at the appropriate
+level of groupingl.
+
+\DOCMODE(
+\xydef@\splineRecordValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else
+ \getcrvsegsnum@
+ \dimen@=\splineval@ \advance\dimen@ \segmentnum@\p@
+ \advance\dimen@-\p@ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@
+ \fi
+ \xdef\splineedges@{\splineedges@\the\splinelength@;\the\splineval@,}%
+\splinetrace@{found edge: \splineedges@}}
+
+\xydef@\splineRecordEndValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else
+ \getcrvsegsnum@
+ \dimen@=\splineval@ \advance\dimen@ \count@\p@
+ \advance\dimen@-\segmentnum@\p@ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@
+ \fi
+ \xdef\splineedges@{\splineedges@\the\splinelength@;\the\splineval@,}%
+\splinetrace@{found edge: \splineedges@}}
+
+\xydef@\splineRecordBreakValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else\expandafter\advance\expandafter\splineval@\segmentnum@\p@
+ \count@=\segmentnum@\relax
+ \ifnum\count@>0 \advance\splineval@-\p@ \fi\fi
+% \ifx\breakedges@\relax\relax\else\ifx\breakedges@\empty\else
+% \ifdim\splineval@<\p@\ifdim\splineval@>\z@
+% \expandafter\testbreakedges@\breakedges@ @%
+% \fi\fi\fi\fi
+ \xdef\breakedges@{\breakedges@\the\splinelength@;\the\splineval@,}%
+ \global\let\spline@end=\egroup
+\splinetrace@{found break edge: \breakedges@}}
+
+\xydef@\splineRecordEndBreakValue@{%
+ \ifx\unknown\segmentnum@\relax
+ \else\count@=\segmentnum@\relax \ifnum\count@=\z@
+ \else \getcrvsegsnum@
+ \count@@=\count@ \advance\count@@-\segmentnum@\relax
+ \dimen@=\splineval@ \advance\dimen@ \count@@\p@
+ \dimen@nth\count@\dimen@
+ \global\splineval@=\dimen@
+ \fi\fi
+% \multiply\splineval@\m@ne \advance\splineval@\p@ % <---------- !!!
+ \ifdim\splineval@<\z@ \relax\splineval@=\z@ \fi
+ \ifx\breakedges@\relax\relax\else\ifx\breakedges@\empty\else
+ \ifdim\splineval@<\p@\relax \ifdim\splineval@>\z@
+ \expandafter\testbreakedges@\breakedges@ @%
+ \fi\fi\fi\fi
+ \xdef\breakedges@{\breakedges@\the\splinelength@;\the\splineval@,}%
+ \global\let\spline@end=\egroup
+\splinetrace@{found break edge: \breakedges@}}
+
+\xydef@\testbreakedges@#1;#2,#3@{\bgroup \dimen@=#2\relax
+ \advance\dimen@\splineval@ \advance\dimen@-\p@
+\splinetrace@{testbreak: #1;#2,#3@ \the\splineval@::\the\dimen@}%
+ \DN@{\egroup}\ifdim\dimen@>\z@
+ \edef\next@{\egroup\def\noexpand\breakedges@{#1;1pt,#3}}%
+ \else\ifdim\zz@\dimen@
+ \edef\next@{\egroup\def\noexpand\breakedges@{#1;1pt,#3}}%
+ \fi \fi \next@ }
+
+\xydef@\splineRecordBreakEValue{%
+ \ifdim\splineval@>\z@
+ \splineval@=-\splineval@ \advance\splineval@\p@ \fi
+ \splineRecordBreakValue@ }%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Use the following distance approximation:
+
+$$
+dist = \cases{
+dX + .5 dY/dX dY & if $dY/dX dY \lt (\sqrt2-1)\times dX $\cr
+{3\sqrt2\over4} dX + {\sqrt2\over4} dY/dX dY
+& if $(\sqrt2-1)\times dX \lt dY/dX dY \lt dX $\cr
+}$$
+and similarly, interchanging $dY$ and $dX$ when $dY \gt dX$.
+
+$\sqrt2 \approx 1.41422$,\
+$(\sqrt2)/2 \approx 0.70711$,\
+$(\sqrt2)/4 \approx 0.353555$,\
+$3(\sqrt2)/4 \approx 1.060665$
+
+\DOCMODE(
+\xydef@\xydist@#1#2{\ifdim#1>#2\relax
+ \quotient@@\tmp@#2#1\expandafter\dimen@ii\tmp@#2\relax
+ \ifdim\dimen@ii>.41422#1\relax
+ \dimen@=1.060665#1\advance\dimen@ .353555\dimen@ii\relax
+ \else \dimen@=#1\advance\dimen@.5\dimen@ii\fi
+ \else
+ \quotient@@\tmp@#1#2\expandafter\dimen@ii\tmp@#1\relax
+ \ifdim\dimen@ii>.41422#2\relax
+ \dimen@=1.060665#2\advance\dimen@ .353555\dimen@ii\relax
+ \else \dimen@=#2\advance\dimen@.5\dimen@ii\fi
+ \fi}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\splineDadvance@{\splineadvance@@
+ \expandafter\splineDadvance@@\splineDadvance@@@}
+\xydef@\splineDadvance@@#1#2#3#4{%
+ {\d@X=#1\advance\d@X-#2\ifdim\d@X<\z@ \d@X=-\d@X\fi
+ \d@Y=#3\advance\d@Y-#4\ifdim\d@Y<\z@ \d@Y=-\d@Y\fi
+ \xydist@\d@X\d@Y
+ \global\advance\splinelength@\dimen@
+\splinetrace@{d=(\the\d@X,\the\d@Y): v=\the\splineval@: l=\the\splinelength@}%
+}}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\spline@end@{\lastsplinepoint@ \egroup \egroup
+ \ht\z@=\z@ \dp\z@=\z@ \wdz@=\z@ \boxz@}%
+\gdef\splinetest@{\splineplot@true}
+\xydef@\spline@end@@{\egroup \egroup}
+\DOCMODE)
+
+
+ ...value for |\splinerec@| for the fast find...
+
+\DOCMODE(
+\xydef@\splinefrec@{{%
+ \advance\splineval@\splinedepth@
+\splinetrace@{F:(\the\X@p,\the\Y@p);(\the\X@c,\the\Y@c);;
+\the\splineval@;\the\splinedepth@}%
+ \ifdim\dimen5=\splineval@ \aftergroup\splinefinishf@
+ \else \dimen@=\dimen5\advance\dimen@-\splineval@
+ \ifdim\dimen@<\z@ \dimen@=-\dimen@ \fi
+ \ifdim\dimen@<.0001\p@ \aftergroup\splinefinishf@
+ \else
+ \ifdim\dimen5<\splineval@\aftergroup\splinedecast@@
+ \else \aftergroup\splineadvance@
+ \fi\fi\fi}}
+
+\xydef@\splinefinishf@{\global\advance\splineval@\splinedepth@
+ \splinefinish@}%
+\DOCMODE)
+
+The macro |\spline@find#1#2| attempts to finds a specific point on a single
+spline segment.
+ |#1| is the parameter value, in the range [0,1] on that segment;
+ |#2| is a <dimen> denoting how much further to slide along the segment.
+It really only checks whether |#2| has a negative value before passing the
+information to |\spline@@find#1#2|, which does the actual search.
+
+If |#2| is negative then the spline segment is searched in the reverse direction,
+starting at its endpoint.
+This is done by reversing the order of the control points, hence the parameter
+value found as $x$ implies that we really want $1-x$ on the un-reversed segment.
+Similarly the resulting vaules for |\d@X| and |\d@Y| must be negated.
+The instructions to do this are loaded into a macro |\postfind@| which is expanded
+once the search has been completed.
+For an unreversed segment |\postfind@| expands to |{}|.
+
+\DOCMODE(
+\xydef@\spline@find#1#2#3{%
+\splinetrace@{spline@find #1 #2 #3}%
+ \readsplineparams@
+ \global\let\splinefinish@=\splinefinish@@
+ \global\let\splinegoal@=\splinef@pt
+ \global\let\splinepoint=\relax
+ \dimen@=#1\relax\dimen@ii=#2\relax
+ \ifdim\dimen@ii=\z@ \def\postfind@{}%
+ \else\def\postfind@{}%
+ \ifdim\dimen@ii<\z@ \splinereverse@
+ \readsplineparams@
+\splinetrace@{reverse orientation: (\the\X@p,\the\Y@p),(\the\X@c,\the\Y@c)}%
+ \dimen@=#1\relax\dimen@ii=#2\relax
+ \multiply\dimen@\m@ne \advance\dimen@\p@ \multiply\dimen@ii\m@ne
+ \def\postfind@{\d@X=-\the\d@X \d@Y=-\the\d@Y \noexpand\reversesplineval@}%
+ \fi\fi
+ \expandafter\splinetrace@\expandafter{\xysplineparams@}%
+ \edef\next@{\noexpand\spline@@find{\the\dimen@}{\the\dimen@ii}{#3}}%
+ \next@ }
+
+\xydef@\reversesplineval@{\splineval@=-\splineval@ \advance\splineval@\p@ }
+\DOCMODE)
+
+
+
+\DOCMODE(
+\xydef@\spline@@find#1#2#3{%
+\splinetrace@{spline@@find #1 #2 #3}%
+ \let\splinerec@=\splinefrec@
+ \global\let\splineadvance@=\splineadvance@@
+ \dimen5=#1\relax
+ \ifdim #2=\z@\relax
+ \ifdim #1=\z@\relax \bgroup
+ \let\splined@@=\spline@@knot
+ \global\splineval@=\m@ne\p@
+ \else\ifdim #1=\p@\relax \bgroup
+ \let\splined@@=\spline@@knot
+ \global\splineval@=\z@
+ \else
+ \global\splineval@=\z@
+ \global\let\splineadvance@=\splineadvance@@
+ \DN@{#3}\ifx\next@\empty \setsplinetest@\splineval@>{#1}{}%
+ {{\ifdim\splineval@=\dimen5\aftergroup\splineplot@false\fi}}%
+ \else\DNii@{>}\ifx\next@\nextii@
+ \setsplineundertest@\splineval@>{#1}{}{}%
+ \let\splinerec@=\splineBSrec@
+ \else\DNii@{<}\ifx\next@\nextii@
+ \setsplineundertest@\splineval@>{#1}{}{}%
+ \let\splinerec@=\splineBErec@
+ \else\xywarning@{unknown find-mode: #3}\fi\fi\fi
+ \fi\fi
+ \else
+ \global\splineval@=\z@
+ \def\splineslidetest@@{%
+ \setsplinetest@\splinelength@<{#2}{}{}}%
+ \let\splinefinish@=\splinefcontinue@
+ \fi
+ \let\spline@end=\splinef@end
+ \let\splinepoint@=\relax
+ \splinelength@=\z@
+ \def\spline@start{\bgroup\xylowtolerance@}%
+ \splined@@ }
+
+\xydef@\spline@@knot{%
+ \let\setsplinedir@=\setsplineknotdir@
+ \splinesetparams@\spline@start
+% \global\splinedepth@=\p@
+ \splinedepth@=\p@
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \splinefinishf@ \spline@end \egroup }
+
+\xydef@\splinefcontinue@{%
+\splinetrace@{sliding... from (\the\X@c,\the\Y@c): val=\the\splineval@ }%
+ \global\let\splinerec@=\splinerec@@
+ \global\splinelength@=\z@
+ \global\splineval@=\splineval@
+ \global\let\splinepoint=\splinefindtest@
+ \global\let\splinegoal@=\splinef@pt
+ \global\let\splineadvance@=\splineDadvance@
+ \global\let\splinefinish@=\splinefinish@@
+ \splineslidetest@@
+ }
+
+\xydef@\splinefindtest@{%
+\splinetrace@{SFT (\the\X@c,\the\Y@c); \the\splinelength@, \the\splineval@}%
+ {\splineplot@false\splinetest@
+ \ifsplineplot@\expandafter\splinefinishf@\fi}}
+
+\def\setsplineundertest@#1#2#3#4#5{%
+\splinetrace@{setsplineundertest@: #1,#2,#3,#4,#5,}%
+ \DNii@{\gdef\splinetest@}%
+ \DN@##1\next{\def\tmp@{{\splineplot@false
+ \ifdim#1#2##1\relax #4\else\splineplot@true#5\fi }}}%
+ \next@#3\relax\next
+ \expandafter\nextii@\tmp@ }
+
+\xydef@\splinef@end{\edef\tmp@{\egroup\splinelength@=\the\splinelength@}\tmp@}
+\xydef@\splinef@pt{%
+ \ifdim\splineval@>\z@
+\splinetrace@{found: val=\the\splineval@;c:(\the\X@c,\the\Y@c)}%
+ \global\dimen@i=\X@c \global\dimen3=\Y@c
+ \else
+\splinetrace@{found: val=\the\splineval@;p:(\the\X@p,\the\Y@p)}%
+ \fi
+ \setsplinedir@ \global\dimen5=\d@X \global\dimen7=\d@Y
+ \global\splineval@=\splineval@
+ \aftergroup\splinefocus@ }
+\DOCMODE)
+
+\DOCMODE(
+\def\setsplinetest@#1#2#3#4#5{%
+ \DNii@{\gdef\splinetest@}%
+ \DN@##1\next{\def\tmp@{{\splineplot@false \ifdim#1#2##1\relax
+ #4\else\splineplot@true#5\fi}}}%
+ \next@#3\relax\next
+ \expandafter\nextii@\tmp@ }%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\splinefocus@{%
+ \d@X=\dimen5\relax \d@Y=\dimen7\relax \setsplinedir@ }
+
+\xydef@\splinesegment@#1{}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+There are some extra hooks.
+
+\DOCMODE(
+\xydef@\xyprecurve@{}
+\xydef@\xypostcurve@{}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\splineset@{%
+\splinetrace@{splineset@:}%
+ \ifx\bstartPLACE@\empty %\splinetrace@{invisible curve}%
+ \DN@{\xyprecurve@
+ \edef\tmp@{\egroup \X@max=\the\X@max \X@min=\the\X@min
+ \Y@max=\the\Y@max \Y@min=\the\Y@min}\tmp@ \xypostcurve@ }%
+ \else
+ \DN@{\xyprecurve@ \xysplinespecialcases@
+ \edef\tmp@{\egroup \X@max=\the\X@max \X@min=\the\X@min
+ \Y@max=\the\Y@max \Y@min=\the\Y@min}\tmp@ \xypostcurve@ }%
+ \fi
+ \next@ }
+\DOCMODE)
+
+For the actual setting, provide hooks which will allow
+alternative back-ends to be used in the special cases.
+
+\DOCMODE(
+\xydef@\xysplinespecialcases@{%
+ \ifx\empty\xycrvdrop@
+ \ifx\empty\xycrvconn@ \DN@{\splinesolid@}%
+ \else \DN@{ \dir{-}}\ifx\next@\xycrvconn@ \DN@{\splinesolid@}%
+ \else \DN@{ \dir 2{-}}\ifx\next@\xycrvconn@ \DN@{\splinedoubled@}%
+ \else \DN@{ \dir{=}}\ifx\next@\xycrvconn@ \DN@{\splineribboned@}%
+ \else \DN@{ \dir {2.}}\ifx\next@\xycrvconn@ \DN@{\splinedoubled@}%
+ \else \DN@{ \dir 3{-}}\ifx\next@\xycrvconn@ \DN@{\splinetrebled@}%
+ \else \DN@{ \dir {3.}}\ifx\next@\xycrvconn@ \DN@{\splinetrebled@}%
+ \else \DN@{ \dir{--}}\ifx\next@\xycrvconn@ \DN@{\splinedashed@}%
+ \else \DN@{ \dir{.}}\ifx\next@\xycrvconn@ \DN@{\splinedotted@}%
+ \else \DN@{ \dir{:}}\ifx\next@\xycrvconn@ \DN@{\splinedbldotted@}%
+ \else \ifdim\splinetol@>\z@ \else \splinedefaulttol@ \fi
+ \DN@{\splineset@@}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \else
+ \DN@{\splineset@@}%
+ \fi \ifInvisible@\DN@{}\fi \next@ }
+\DOCMODE)
+
+The special cases are handled just like the normal case except
+However the control sequence names provide a place for
+rebinding to accomodate alternative back-ends.
+
+\DOCMODE(
+\xydef@\splinesolid@{\setbox\splinebox@=\zerodot \def\xycrvdrop@{ }%
+ \def\xycrvconn@{}\splineset@@}
+
+\xydef@\splinedoubled@{\splinedefaulttol@\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \def\xycrvconn@{!C\dir2{.}}\splineset@@}
+
+\xydef@\splineribboned@{\splinedefaulttol@\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \def\xycrvconn@{!C\dir{:}}\splineset@@}
+
+\xydef@\splinetrebled@{\splinedefaulttol@\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \def\xycrvconn@{!C\dir3{.}}\splineset@@}
+
+\xydef@\splinedashed@{\splinetol@=1.5pc \def\xycrvdrop@{ }%+=<10pt>[o]{}}%
+ \def\splinedrop@{}\edef\xycrvconn@{\noexpand!C\noexpand\dir{\addDASH@{}}}%
+ \splineset@@}
+
+\xydef@\splinedotted@{\setbox\splinebox@=\zerodot \def\xycrvdrop@{ }%
+ \splinetol@=1.5\jot \def\xycrvconn@{}\splineset@@}
+
+\xydef@\splinedbldotted@{\def\xycrvdrop@{ }\def\splinedrop@{}%
+ \splinetol@=1.5\jot \def\xycrvconn@{!C\dir{:}}\splineset@@}
+
+\DOCMODE)
+
+This establishes the test appropriate to actually setting
+the spline curve. Global definitions are used.
+This may not always be necessary!!
+
+\BUG: the |7.5pt| below should be the |\Step@@| method to be included.
+
+\DOCMODE(
+\xydef@\splineset@@{%
+ \readsplineparams@
+ \ifx\xycrvdrop@\empty \splinetol@=7.5\p@
+ \def\splinedefaulttol@{\splinetol@=7.5\p@}\def\splinedrop@{}%
+ \else\edef\splinedefaulttol@{\splinetol@=\the\splinetol@}\fi
+ \ifx\xycrvconn@\empty \def\splineconn@{}\fi
+\splinetrace@{set the curve: >\the\dimen5, <\the\dimen7}%
+ \global\let\splineadvance@=\splineadvance@@
+ \let\splinerec@=\splineTrec@
+ \def\splineStarttest{\splinetest@}%
+ \global\let\splinepoint=\relax %6
+ \let\spline@start=\spline@start@
+ \let\spline@end=\spline@end@ %5
+ \ifdim\dimen7=\p@
+ \gdef\splinecontinue{\splinesetting@
+ \global\let\splinetest@=\splineplot@true}%
+ \else
+ \ifdim\dimen7=\tw@\p@
+%% \ifdim\bendPLACE@\p@=\z@ \emptyspline@ \else
+ \ifdim\bendPLACE@\p@=\p@ %\emptyspline@
+ \fi %%\fi
+ \else
+ \xdef\splinecontinue{\noexpand\setsplinetest@
+ \splineval@>{\the\dimen7}{\noexpand\splinebreakcancel@}{}%
+ \noexpand\splinesetting@ }%
+ \fi\fi
+ \ifdim\dimen7>\z@ \DN@{\splinesetting@\splinecontinue}%
+ \ifdim\zz@{\dimen5}%
+ \else
+ \edef\next@{\noexpand\setsplinetest@
+ \splineval@<{\the\dimen5}{}%
+ {\noexpand\expandafter\noexpand\splinecontinue}%
+ \noexpand\splinesetting@ }%
+ \fi
+ \else\DN@{\dimen5=\p@}\fi % ifdim\dimen7=\z@
+ \next@
+%
+ \ifdim\dimen5=\p@\DN@{}\else\DN@{\splined@@}\fi \next@
+ }
+
+\xydef@\emptyspline@{\xywarning@{empty curve subsegment}%
+\splinetrace@{bstartPLACE@=\bstartPLACE@, bendPLACE@=\bendPLACE@,
+ empty segment}%
+ \gdef\splinecontinue{\splinesetting@
+ \global\let\splinetest@=\splineplot@false
+ \global\dimen5=\z@ }}
+\DOCMODE)
+
+|\splineTrec@| is the initial value for |\splinerec@| when a spline
+is being set. It descends the tree of places on the spline (1) until the
+required parameter value is found (2a) or is sufficiently close (2b).
+At this point call |\splinesetting@| and |\splinecontinue| to
+setup, and proceed with, the actual type-setting.
+
+\DOCMODE(
+\xydef@\splineTrec@{{%
+ \advance\splineval@\splinedepth@ % (1)
+ \ifdim\dimen5=\splineval@ % (2a)
+ \aftergroup\splinecontinue % (3)
+ \else \dimen@=\dimen5\advance\dimen@-\splineval@
+ \ifdim\dimen@<\z@ \dimen@=-\dimen@ \fi
+ \ifdim\dimen@<.001\p@ % possibly too high ? % (2b)
+ \aftergroup\splinecontinue % (3)
+ \else
+ \ifdim\dimen5<\splineval@\aftergroup\splinedecast@@ % (1)
+ \else \aftergroup\splineadvance@ % (1)
+ \fi\fi\fi}}
+\DOCMODE)
+
+Setting the curve uses the current |\splinerec@@| and
+sets |\splinepoint| to |\splineplotpt@| to cause objects to be typeset.
+This must be done via a |\gdef| rather than a |\global\let|
+since it is sometimes necessary to omit the object when it would
+be too close, see |\splinetooclose@|.
+
+\DOCMODE(
+%\xydef@\splinesetting@{\xyFN@\splinesetting@@}
+\xydef@\splinesetting@{\splinesetting@@}
+
+\xydef@\splinesetting@@{%
+\splinetrace@{splinesetting@@:}%
+ \ifdim\splinedepth@=\z@ \splinedepth@=\p@ \fi
+ \ifdim\splinedepth@=\p@
+ \def\splinerec@{\global\let\splinerec@=\splinerec@@\splinedecast@@}%
+ \else \global\let\splinerec@=\splinerec@@ \fi
+ \gdef\splinepoint{\splineplotpt@}}
+\DOCMODE)
+
+This handles, for each point of the curve,
+whether to place an <object> or horizontal glue.
+
+\DOCMODE(
+\xydef@\splineplotpt@{{\global\advance\dimen@i-\X@c
+ \splinetest@ \DN@{\splineglue@}\ifsplineplot@
+% \splineStarttest@ \ifsplineplot@
+% \splineEndtest@ \ifsplineplot@
+ \DN@{\dosplineplotpt@}%
+% \fi\fi
+ \fi \next@ \global\dimen@i=\X@c \global\dimen3=\Y@c }}
+
+\xydef@\splineglue@{\hglue-\dimen@i
+\splinetrace@{N:(\the\X@c,\the\Y@c);;\the\dimen@i;\the\dimen3%
+ ,\the\splinelength@,\the\splineval@,\the\splinedepth@}}
+
+\xydef@\dosplineplotpt@{\ifdim\dimen@i<\z@
+ \raise\Y@c\hbox to-\dimen@i{\hfill\splinedrop@}%
+ \else \kern-\dimen@i\raise\Y@c\hbox{\splinedrop@}\fi
+ \ifx\splineconn@\relax\else\raise\Y@c\hbox{%
+ \setboxz@h{\splineconn@}\Drop@@}\fi
+\splinetrace@{P:(\the\X@c,\the\Y@c);;\the\dimen@i;\the\dimen3
+ ,\the\splinelength@,\the\splineval@,\the\splinedepth@}}
+\DOCMODE)
+
+These handle the ``cleaning up'' after a point on the curve has been located.
+
+\DOCMODE(
+\xydef@\splinefinish@@{\postspline@ \splinegoal@ \splinecancel@ }
+
+\xydef@\splinecancel@{%
+ \global\let\splinerec@=\relax
+ \global\let\splinepoint=\relax
+ \global\let\splinecontinue=\relax
+% \global\let\splinedecast@@=\relax
+ \global\let\splinedecast@=\relax
+ }
+
+\xydef@\splinebreakcancel@{\bsplinecancel@ \splinecancel@}
+\xydef@\bsplinecancel@{\gdef\lastbspline@{\leave@\leave@}%
+ \global\let\middlebspline@=\lastbspline@ }
+
+\xydef@\splinegoal@{\ifdim\splineval@>\z@
+ \global\dimen@i=\X@c \global\dimen3=\Y@c \fi
+ \global\splineval@=\splineval@ \global\splinelength@=\splinelength@
+% \setsplineTangent@ }
+ \splinesetdir@ }
+
+\xylet@\splinefinish@\splinefinish@@
+\xylet@\splinewhich\splineDwhich@
+
+\xydef@\squinewhich@{%
+ \ifdim\dimen5>\squinelength % \X@c=\L@c \Y@c=\D@c
+ \d@X=\X@c \d@Y=\Y@c \advance\d@X-\L@c \advance\d@Y-\U@c
+ \advance\squineval-\squinedepth
+ \else \X@c=\X@p \Y@c=\Y@p \advance\squineval-\squinedepth
+ \d@X=\L@c \d@Y=\U@c \advance\d@X-\X@p \advance\d@Y-\Y@p \fi
+ \d@X=-\d@X \d@Y=-\d@Y %%% hack which works.
+ \squinefinish}
+\xydef@\squineDwhich@{%
+ \ifdim\dimen5>\squinelength % \X@c=\L@c \Y@c=\D@c
+ \d@X=\X@c \d@Y=\Y@c \advance\d@X-\L@c \advance\d@Y-\U@c
+ \else \X@c=\X@p \Y@c=\Y@p \advance\squineval-\squinedepth
+ \d@X=\L@c \d@Y=\U@c \advance\d@X-\X@p \advance\d@Y-\Y@p \fi
+ \d@X=-\d@X \d@Y=-\d@Y %%% hack which works.
+ \squinefinish}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection{B\'ezier quadratic splines --- squines}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xyquadbezier@{%
+ \global\let\splinerec@=\relax
+ \addtocrvpts@{\def\crvconnect@{\squineconnect@}}%
+ \xyquadmethods@ \let\splinesegment@=\squinesegment@
+ \begingroup\setcrvobjects@ \xysplineparams@ \splined@@@
+ \bgroup \setupsquine@ \squined@ \splineset@ \savespline@ }
+
+\xydef@\xyquadmethods@{%
+ \def\crvconnect@{\squineconnect@}%
+ \def\splinereverse@@{\splinereverse@@@}%
+ \let\getsplineparams@=\getsquineparams@
+ \let\spline@start@=\squine@start@
+ \let\splinedecast@@=\squinedecast@
+ \let\splinerec@@=\squinerec@
+ \let\splined@@=\squined@@
+ \let\splineIpt@@=\squineIpt@
+ \let\splineIadvance@@=\squineIadvance@
+ \let\splineinfo@=\squineinfo@
+ \let\setsplinedir@=\setsquinedir@
+ \let\splinetestcvxhull@=\squinetestcvxhull@
+ \let\setsplineknotdir@=\setsquineknotdir@
+ \let\splinereverse@=\squinereverse@
+ \let\splineDadvance@@@=\squineDadvance@@@
+ \let\splinesetparams@=\squinesetparams@
+ \let\splineplot@maybe@@=\squineplot@maybe
+}
+
+\xydef@\squineconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\squinesegment@ }%
+
+\xydef@\squinesegment@#1{\xyquadmethods@ \def\segmentnum@{1}%
+ \setupsquine@ \squined@ }
+
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Use the registers |\A@| and |\B@| to store the coordinates of the
+single control point. The whole curve lies within the convex
+polygon with vertices at $p$, $(p+a)/2$, $(c+a)/2$ and $c$
+where $a$ denotes the control point. Set |\X@max|, |\X@min|, |\Y@max|
+and |\Y@min| to be the extremes of the coordinates of these 4 points.
+There may not actually be any point on the curve achieving these
+extremes, but certainly we get pretty close.
+
+\DOCMODE(
+\xydef@\setupsquine@{%
+ \xycontrolpt@\z@ \X@p=\X@c \Y@p=\Y@c
+ \xycontrolpt@\@ne \A@=\X@c \B@=\Y@c
+ \xycontrolpt@\tw@
+ \ifdim \A@>\X@max
+ \dimen@=\X@p\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@>\X@max \X@max=\dimen@ \fi
+ \dimen@=\X@c\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@>\X@max \X@max=\dimen@ \fi
+ \else \ifdim \A@<\X@min
+ \dimen@=\X@p\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@<\X@min \X@min=\dimen@ \fi
+ \dimen@=\X@c\advance\dimen@\A@ \dimen@half
+ \ifdim \dimen@>\X@min \X@min=\dimen@ \fi
+ \fi\fi
+ \ifdim \B@>\Y@max
+ \dimen@=\Y@p\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@>\Y@max \Y@max=\dimen@ \fi
+ \dimen@=\Y@c\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@>\Y@max \Y@max=\dimen@ \fi
+ \else \ifdim \B@<\Y@min
+ \dimen@=\Y@p\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@<\Y@min \Y@min=\dimen@ \fi
+ \dimen@=\Y@c\advance\dimen@\B@ \dimen@half
+ \ifdim \dimen@>\Y@min \Y@min=\dimen@ \fi
+ \fi\fi }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The algorithm used for computing coordinates of points on quadratic
+B\'ezier splines is essentially that used by D. E. Knuth in
+|picmac.tex|\cite{picmac} (aka |gpxmac.tex|).
+It is a recursive de Casteljau algorithm of the ``divide and conquer'' type.
+(In Knuth's macros these types of curves were
+given the name ``squines''. This explains some of the control
+sequence names used here.)
+
+The differences from Knuth's algorithm are simply to allow
+more of the available information to be used at points along the spline.
+In particular the tangent direction can be calculated and tests can be
+performed to decide when to break out of the algorithm, rather than
+letting it run its full course.
+
+\DOCMODE(
+\xydef@\squinedecast@{\halve@dimen\splinedepth@ %\divide\splinedepth@\tw@
+ \R@c=\L@c \advance\L@c\X@p \halve@dimen\L@c %\divide\L@c\tw@
+ \advance\R@c\X@c \halve@dimen\R@c %\divide\R@c\tw@
+ \A@=\L@c \advance\A@\R@c \halve@dimen\A@ %\divide\A@\tw@
+ \D@c=\U@c \advance\U@c\Y@p \halve@dimen\U@c %\divide\U@c\tw@
+ \advance\D@c\Y@c \halve@dimen\D@c %\divide\D@c\tw@
+ \B@=\U@c \advance\B@\D@c \halve@dimen\B@ %\divide\B@\tw@
+ \begingroup \X@c=\A@ \Y@c=\B@ \splinerec@ \endgroup
+ \begingroup \X@c=\A@ \Y@c=\B@ \splinepoint \endgroup
+ \X@p=\A@ \L@c=\R@c \Y@p=\B@ \U@c=\D@c \splinerec@}
+
+\xydef@\squinerec@{{\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\squinedecast@
+ \else \aftergroup\splineadvance@ \fi}}
+
+\xydef@\squineDadvance@@@{\X@p\L@c\Y@p\D@c}
+
+\xydef@\squineplot@maybe{{\X@p=\L@c \Y@p=\U@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The tangent direction is computed from the displacement to the ``recursive''
+control point.
+
+\DOCMODE(
+\xydef@\setsquinedir@{%
+ \d@X=\X@c \advance\d@X-\L@c \d@Y=\Y@c \advance\d@Y-\U@c
+ \dimen@=\ifdim\d@X<\z@-\fi\d@X \ifdim\dimen@<.02\p@
+ \dimen@=\ifdim\d@Y<\z@-\fi\d@Y \ifdim\dimen@<.02\p@
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p \fi\fi
+ \ifdim\X@c=\X@p \ifdim\Y@c=\Y@p
+ \d@X=\L@c \advance\d@X-\X@p \d@Y=\U@c \advance\d@Y-\Y@p \fi\fi
+ \setupDirection@ii }
+
+\xydef@\setsquineknotdir@{%
+ \ifdim\zz@\splineval@ \expandafter \setsquinezerodir@
+ \else\expandafter \setsquinedir@ \fi }
+
+\xydef@\setsquinezerodir@{%
+ \d@X=\L@c \advance\d@X-\X@p \d@Y=\U@c \advance\d@Y-\Y@p
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi\fi \setupDirection@ii }
+\DOCMODE)
+
+We need a way to access the information in |\splineparams|.
+
+\DOCMODE(
+\xydef@\getsquineparams@#1,#2,#3,#4,#5,#6,#7,{%
+ \splinelength@=#1\relax\X@p=#2\relax\Y@p=#3\relax
+ \A@=#4\relax\B@=#5\relax\X@c=#6\relax\Y@c=#7\relax
+}
+\xydef@\squineinfo@{%
+\expandafter\removePT@\the\X@c\space
+\expandafter\removePT@\the\Y@c\space
+\expandafter\removePT@\the\A@\space
+\expandafter\removePT@\the\B@\space
+\expandafter\removePT@\the\X@p\space
+\expandafter\removePT@\the\Y@p\space
+\expandafter\removePT@\the\dimen5\space\space
+\expandafter\removePT@\the\dimen7\space
+ }%
+\xydef@\squinereverse@{\readsplineparams@
+ \expandafter\edef\xysplineparams@{\the\splinelength@,%
+ \the\X@c,\the\Y@c,\the\A@,\the\B@,\the\X@p,\the\Y@p,}}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Start the picture by (1)~setting a box, as usual.
+(2)~Initialize global variables; these must be global since they are
+used to store information which must be preserved outside the grouping
+which is vital to the recursive nature of the algorithm.
+(3)~Move horizontally to the starting point at $p$.
+(4)~Begin by handling the starting point; \ie\ decide whether it is to be
+plotted or not.
+
+\DOCMODE(
+\xydef@\squine@start@{\setboxz@h\bgroup % %(1)
+ \global\splinelength@=\z@ \global\dimen@i=\z@ \global\dimen3=\z@ % %(2)
+ \kern\X@p % %(3)
+ {\squinesetparams@ \X@c=\X@p \Y@c=\Y@p \firstsplinepoint@ % %(4)
+ }\bgroup }
+
+\xydef@\squinesetparams@{%
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \L@c=\A@ \U@c=\B@ \R@c=\L@c \D@c=\U@c }%
+
+\xydef@\squined@{%
+ \expandafter\edef\xysplineparams@{%
+ \the\z@,\the\X@p,\the\Y@p,\the\A@,\the\B@,\the\X@c,\the\Y@c,}}
+
+\xydef@\squined@@{%
+% \global\splinedepth@=\p@
+ \splinedepth@=\p@
+ \global\splineval@=\z@
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \spline@start
+ \ifx\splinerec@\relax \let\splinerec@=\squinerec@\fi
+ \L@c=\A@ \U@c=\B@ \R@c=\L@c \D@c=\U@c
+ \splinerec@ \spline@end }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection{B\'ezier cubic splines}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xycubicbezier@{%
+ \addtocrvpts@{\def\crvconnect@{\cubicconnect@}}%
+ \xycubicmethods@ \let\splinesegment@=\cubicsegment@
+ \begingroup \setcrvobjects@ \xysplineparams@ \splined@@@
+ \bgroup \setupcubic@ \cubiced@ \splineset@ \savespline@ }
+
+\xydef@\xycubicmethods@{%
+ \def\crvconnect@{\cubicconnect@}%
+ \def\splinereverse@@{\cubicreverse@@}%
+ \let\getsplineparams@=\getcubicparams@
+ \let\spline@start@=\cubic@start@
+ \let\splinedecast@@=\cubicdecast@
+ \let\splinerec@@=\cubicrec@
+ \let\splined@@=\cubiced@@
+ \let\splineIpt@@=\cubicIpt@
+ \let\splineIadvance@@=\cubicIadvance@
+ \let\splineoutsidehull@@=\cubicoutsidehull@
+ \let\splinetestcvxhull@=\cubictestcvxhull@
+ \let\splineinfo@=\cubicinfo@
+ \let\setsplinedir@=\setcubicdir@
+ \let\setsplineknotdir@=\setcubicknotdir@
+ \let\splinereverse@=\cubicreverse@
+ \let\splineDadvance@@@=\cubicDadvance@@@
+ \let\splinesetparams@=\cubicsetparams@
+ \let\splineplot@maybe@@=\cubicplot@maybe
+ }
+
+\xydef@\cubicconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\cubicsegment@ }%
+
+\xydef@\cubicsegment@#1{\xycubicmethods@ \def\segmentnum@{1}%
+ \setupcubic@ \cubiced@ }
+
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Use the registers |\A@|, |\B@|, |\dimen3| and |\dimen5| to store coordinates
+of the two control points, denoted $l$ and $r$ say. The whole curve lies
+within the convex polygon $p$, $(p+l)/2$, $(c+r)/2$ and $c$ where the vertices are
+not necessarily in this order. Set |\X@max|, |\X@min|, |\Y@max|
+and |\Y@min| to be the extremes of the coordinates of these 4 points.
+There may not actually be any point on the curve achieving these
+extremes, but certainly we get pretty close.
+
+\DOCMODE(
+\xydef@\setupcubic@{%
+ \xycontrolpt@\z@ \X@p=\X@c \Y@p=\Y@c
+ \xycontrolpt@\@ne \A@=\X@c \B@=\Y@c
+ \xycontrolpt@\tw@ \global\dimen3=\X@c \global\dimen5=\Y@c
+ \xycontrolpt@\thr@@
+ \adjustmaxmin@ }
+
+\xydef@\adjustmaxmin@{%
+ \ifdim \A@>\X@max \dimen@=\A@ \advance\dimen@\X@p \dimen@half
+ \ifdim\dimen@>\X@max \X@max=\dimen@ \fi \else
+ \ifdim \A@<\X@min \dimen@=\A@ \advance\dimen@\X@p \dimen@half
+ \ifdim\dimen@<\X@min \X@min=\dimen@ \fi \fi\fi
+ \ifdim \B@>\Y@max \dimen@=\B@ \advance\dimen@\Y@p \dimen@half
+ \ifdim\dimen@>\Y@max \Y@max=\dimen@ \fi \else
+ \ifdim \B@<\Y@min \dimen@=\B@ \advance\dimen@\Y@p \dimen@half
+ \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi \fi\fi
+%
+ \ifdim \dimen3>\X@max \dimen@=\dimen3\advance\dimen@\X@c \dimen@half
+ \ifdim\dimen@>\X@max \X@max=\dimen@ \fi \else
+ \ifdim \dimen3<\X@min \dimen@=\dimen3\advance\dimen@\X@c \dimen@half
+ \ifdim\dimen@<\X@min \X@min=\dimen@ \fi \fi\fi
+ \ifdim \dimen5>\Y@max \dimen@=\dimen5\advance\dimen@\Y@c \dimen@half
+ \ifdim\dimen@>\Y@max \Y@max=\dimen@ \fi \else
+ \ifdim \dimen5<\Y@min \dimen@=\dimen5\advance\dimen@\Y@c \dimen@half
+ \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi \fi\fi
+%
+ \dimen@=\A@ \advance\dimen@\dimen3 \dimen@half
+ \ifdim\dimen@>\X@max \X@max=\dimen@
+ \else \ifdim\dimen@<\X@min \X@min=\dimen@ \fi\fi
+ \dimen@=\B@ \advance\dimen@\dimen5 \dimen@half
+ \ifdim\dimen@>\Y@max \Y@max=\dimen@
+ \else \ifdim\dimen@<\Y@min \Y@min=\dimen@ \fi\fi
+}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The recursive algorithm for cubic B\'ezier splines is similar to the
+quadratic one. Now there are two ``recursive'' control points to be
+calculated upon each subdivision.
+
+On the $p$-side:
+\begin{eqnarray*}
+p_p &=& p \\
+l_p &=& (p+l)/2 \\
+r_p &=& (p+2l+r)/4 \\
+c_p &=& (p+3l+3r+c)/8 \\
+\end{eqnarray*}
+while on the $c$-side
+\begin{eqnarray*}
+p_c &=& (p+3l+3r+c)/8 \\
+l_c &=& (l+2r+c)/4 \\
+r_c &=& (r+c)/2 \\
+c_c &=& c \\
+\end{eqnarray*}
+Notice that $c_p=p_c$ and that the tangents match there.
+
+\DOCMODE(
+\xydef@\cubicdecast@{\halve@dimen\splinedepth@ %\divide\splinedepth@\tw@
+ \A@=\L@c \advance\A@\R@c \halve@dimen\A@ %\divide\A@\tw@
+ \advance\R@c\X@c \halve@dimen\R@c %\divide\R@c\tw@
+ \B@=\U@c \advance\B@\D@c \halve@dimen\B@ %\divide\B@\tw@
+ \advance\D@c\Y@c \halve@dimen\D@c %\divide\D@c\tw@
+ \advance\L@c\X@p \halve@dimen\L@c %\divide\L@c\tw@
+ \advance\U@c\Y@p \halve@dimen\U@c %\divide\U@c\tw@
+ \begingroup
+ \X@c=\R@c \advance\X@c\L@c \halve@dimen\X@c %\divide\X@c\tw@
+ \advance\X@c\A@ \halve@dimen\X@c %\divide\X@c\tw@
+ \Y@c=\D@c \advance\Y@c\U@c \halve@dimen\Y@c %\divide\Y@c\tw@
+ \advance\Y@c\B@ \halve@dimen\Y@c %\divide\Y@c\tw@
+ \R@c=\L@c \advance\R@c\A@ \halve@dimen\R@c %\divide\R@c\tw@
+ \D@c=\U@c \advance\D@c\B@ \halve@dimen\D@c %\divide\D@c\tw@
+ \bgroup \splinerec@
+ \egroup \splinepoint \endgroup
+ \X@p=\L@c \advance\X@p\R@c \halve@dimen\X@p %\divide\X@p\tw@
+ \advance\X@p\A@ \halve@dimen\X@p %\divide\X@p\tw@
+ \L@c=\R@c \advance\L@c\A@ \halve@dimen\L@c %\divide\L@c\tw@
+ \Y@p=\U@c \advance\Y@p\D@c \halve@dimen\Y@p %\divide\Y@p\tw@
+ \advance\Y@p\B@ \halve@dimen\Y@p %\divide\Y@p\tw@
+ \U@c=\D@c \advance\U@c\B@ \halve@dimen\U@c %\divide\U@c\tw@
+ \splinerec@ }
+
+\xydef@\cubicrec@{{\splinefar@false \splinenear@\X@p\X@c\Y@p\Y@c
+ \ifsplinefar@ \aftergroup\cubicdecast@
+ \else \aftergroup\splineadvance@ \fi}}
+
+\xydef@\cubicDadvance@@@{\X@p\X@c\Y@p\Y@c}
+
+\xydef@\cubicplot@maybe{{\X@p=\L@c \Y@p=\U@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\cubicplot@maybeii\else\aftergroup\splineplot@true\fi}}
+\xydef@\cubicplot@maybeii{{\X@p=\R@c \Y@p=\D@c \cv@start \the\Edge@c\@ne
+ \ifInside@\aftergroup\splineplot@false\else\aftergroup\splineplot@true\fi}}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\cubiced@@{%
+% \global\splinedepth@=\p@
+ \splinedepth@=\p@
+ \global\splineval@=\z@
+ \spline@start
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \splinerec@ \spline@end }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The tangent direction is computed from the displacement to the ``recursive''
+control point.
+
+\DOCMODE(
+\xydef@\setcubicdir@{%
+ \ifdim\splinedepth@<.001\p@\DN@{\cubiccoarsedir@}%
+ \else\DN@{\cubicfinedir@}\fi \next@ }
+
+\xydef@\cubicfinedir@{%
+ \d@X=\X@c \advance\d@X-\R@c \d@Y=\Y@c \advance\d@Y-\D@c
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\L@c \d@Y=\Y@c \advance\d@Y-\U@c
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi\fi \fi\fi
+% \ifdim\X@c=\X@p \ifdim\Y@c=\Y@p
+% \d@X=\L@c \d@Y=\U@c \advance\d@X-\X@p \advance\d@Y-\Y@p
+% \ifdim\d@X=\z@ \ifdim\d@Y=\z@
+% \d@X=\R@c \d@Y=\D@c \advance\d@X-\X@p \advance\d@Y-\Y@p
+% \fi\fi
+% \fi\fi
+ \setupDirection@ii
+\splinetrace@{dir:(\the\d@X,\the\d@Y),\the\Direction; depth:\the\splinedepth@}%
+}
+
+\xydef@\cubiccoarsedir@{%
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p \setupDirection@ii
+ \global\dimen5=\d@X \global\dimen7=\d@Y
+\splinetrace@{dir:(\the\d@X,\the\d@Y),\the\Direction; depth:\the\splinedepth@}%
+}
+
+\xydef@\setcubicknotdir@{%
+ \ifdim\zz@\splineval@ \DN@{\setcubiczerodir@}%
+ \else \DN@{\cubicfinedir@}\fi \next@ }
+
+\xydef@\setcubiczerodir@{%
+ \d@X=\L@c \advance\d@X-\X@p \d@Y=\U@c \advance\d@Y-\Y@p
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\R@c \advance\d@X-\X@p \d@Y=\D@c \advance\d@Y-\Y@p
+ \ifdim\zz@\d@X \ifdim\zz@\d@Y
+ \d@X=\X@c \advance\d@X-\X@p \d@Y=\Y@c \advance\d@Y-\Y@p
+ \fi\fi \fi\fi \setupDirection@ii }
+\DOCMODE)
+
+We need a way to access the information in |\splineparams|.
+
+\DOCMODE(
+\xydef@\getcubicparams@#1,#2,#3,#4,#5,#6,#7,#8,#9,{%
+ \splinelength@=#1\relax\X@p=#2\relax\Y@p=#3\relax\L@c=#4\relax
+ \U@c=#5\relax\R@c=#6\relax\D@c=#7\relax\X@c=#8\relax\Y@c=#9\relax
+}%
+\xydef@\cubicinfo@{%
+\expandafter\removePT@\the\X@p\space
+\expandafter\removePT@\the\Y@p\space
+\expandafter\removePT@\the\L@c\space
+\expandafter\removePT@\the\U@c\space
+\expandafter\removePT@\the\R@c\space
+\expandafter\removePT@\the\D@c\space
+\expandafter\removePT@\the\X@c\space
+\expandafter\removePT@\the\Y@c\space
+\expandafter\removePT@\the\dimen5\space\space
+\expandafter\removePT@\the\dimen7\space
+ }%
+\xydef@\cubicreverse@{\readsplineparams@
+ \expandafter\edef\xysplineparams@{\the\splinelength@,%
+ \the\X@c,\the\Y@c,\the\R@c,\the\D@c,\the\L@c,\the\U@c,\the\X@p,\the\Y@p,}}%
+\xydef@\cubicreverse@@{%
+ \splinereverse@@@
+ \dimen@ii=\L@c \L@c=\R@c \R@c=\dimen@ii
+ \dimen@ii=\U@c \U@c=\D@c \D@c=\dimen@ii }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Start the picture by (1)~setting a box, as usual.
+(2)~Initialize global variables; these must be global since they are
+used to store information which must be preserved outside the grouping
+which is vital to the recursive nature of the algorithm.
+(3)~Move horizontally to the starting point at $p$.
+(4)~Begin by handling the starting point; \ie\ decide whether it is to be
+plotted or not.
+
+\DOCMODE(
+\xydef@\cubic@start@{\setboxz@h\bgroup % %(1)
+ \global\splinelength@=\z@ \global\dimen@i=\z@ \global\dimen3=\z@ % %(2)
+ \kern\X@p % %(3)
+ {\cubicsetparams@ \X@c=\X@p \Y@c=\Y@p \R@c=\X@c \D@c=\Y@c
+ \firstsplinepoint@ }\bgroup
+} % %(4)
+
+\xydef@\cubicsetparams@{%
+ \expandafter\expandafter\expandafter\getsplineparams@\xysplineparams@
+ \global\dimen@i=\X@p \global\dimen3=\Y@p }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\cubiced@{%
+ \expandafter\edef\xysplineparams@{\the\z@,\the\X@p,\the\Y@p
+ ,\the\A@,\the\B@,\the\dimen3,\the\dimen5,\the\X@c,\the\Y@c,}%
+ }%
+\DOCMODE)
+
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection{B-splines}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The cases of 3 and 4 control points have some special simplifying features.
+
+\DOCMODE(
+\xydef@\xybspline@iii{%
+ \addtocrvpts@{\def\crvconnect@{\bsplineiiiconnect@}}%
+ \def\crvconnect@{\bsplineiiiconnect@}\xybsplinemethods@
+ \let\splinesegment@=\bsplinesegment@iii
+ \begingroup\setcrvobjects@ \dobspline@ \savespline@ }
+\xydef@\bsplineiiiconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\bsplinesegment@iii }%
+
+\xydef@\xybspline@iv{%
+ \addtocrvpts@{\def\crvconnect@{\bsplineivconnect@}}%
+ \def\crvconnect@{\bsplineivconnect@}\xybsplinemethods@
+ \let\splinesegment@=\bsplinesegment@iv
+ \begingroup\setcrvobjects@ \dobspline@ \savespline@ }
+\xydef@\bsplineivconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\bsplinesegment@iv }%
+\DOCMODE)
+
+Now for the general case of $\ge5$ control points.
+
+\DOCMODE(
+\xydef@\xybspline@{%
+\splinetrace@{B-spline with \numcontrolpts\space control points.}%
+ \addtocrvpts@{\def\crvconnect@{\bsplineconnect@}}%
+ \def\crvconnect@{\bsplineconnect@}\xybsplinemethods@
+ \let\splinesegment@=\bsplinesegment@
+ \begingroup\setcrvobjects@
+ \dobspline@ \savespline@ }
+
+\xydef@\xybsplinemethods@{%
+ \def\splinereverse@@{\cubicreverse@@}%
+ \let\getsplineparams@=\getbsplineparams@
+ \let\spline@start@=\cubic@start@
+ \let\splinedecast@@=\cubicdecast@
+ \let\splinerec@@=\cubicrec@
+% \let\splined@@=\cubiced@@
+ \let\splineIpt@@=\cubicIpt@
+ \let\splineIadvance@@=\cubicIadvance@
+ \let\splined@@=\bsplined@@
+ \let\splineinfo@=\cubicinfo@
+ \let\setsplinedir@=\setcubicdir@
+ \let\setsplineknotdir@=\setcubicknotdir@
+ \let\splinereverse@=\cubicreverse@
+ \let\splineDadvance@@@=\cubicDadvance@@@
+ \let\splinesetparams@=\cubicsetparams@
+ \global\let\lastbspline@=\lastbspline@@
+ \global\let\middlebspline@=\middlebspline@@
+}
+\xydef@\bsplined@@{%
+% \global\splinedepth@=\p@
+ \splinedepth@=\p@
+ \global\splineval@=\z@
+ \spline@start
+ \global\dimen@i=\X@p \global\dimen3=\Y@p
+ \splinerec@ \spline@end }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\bsplineconnect@{\splineconnect@ \crvconnect@@
+ \let\splinesegment@=\bsplinesegment@ }%
+
+\xydef@\getbsplineparams@{\getcubicparams@}
+
+\xydef@\dobspline@{\xysplineparams@ \scanbspline@ \firstbspline@ }%
+\DOCMODE)
+
+ Registers |\dimen3| and |\dimen5| are used globally, since the
+ standard local registers are already used.
+
+\DOCMODE(
+\xydef@\firstbspline@{%
+ \enter@{\pfromthep@ \cfromthec@}\enter@{\cfromthec@}\bgroup
+ \def\segmentnum@{1}\xycontrolpt@\z@ \X@p=\X@c \Y@p=\Y@c
+\splinetrace@{0: \the\X@p, \the\Y@p}%
+ \xycontrolpt@\@ne \A@=\X@c \B@=\Y@c
+\splinetrace@{1: \the\X@c, \the\Y@c}%
+ \xycontrolpt@\tw@
+\splinetrace@{2: \the\X@c, \the\Y@c}%
+ \dimen@=\X@c \advance\dimen@\A@ \dimen@half
+ \global\dimen3=\dimen@
+ \dimen@=\Y@c \advance\dimen@\B@ \dimen@half
+ \global\dimen5=\dimen@
+ \xycontrolpt@{3}%
+\splinetrace@{3: \the\X@c, \the\Y@c}%
+ \expandafter\count@\xycrvcnt@\relax %%% very important to |\relax|
+ \ifnum\count@=3\relax
+ \advance\X@c-\A@ \dimen@nth4\X@c % \divide\X@c by4
+ \advance\X@c\dimen3\relax
+ \advance\Y@c-\B@ \dimen@nth4\Y@c % \divide\Y@c by4
+ \advance\Y@c\dimen5\relax
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \crv@cnt@=\@ne\relax
+ \noexpand\lastbspline@ }%
+ \else
+ \advance\X@c 7\dimen3 \advance\X@c-2\A@
+ \dimen@nth6\X@c % \divide\X@c by6\relax
+ \advance\Y@c 7\dimen5 \advance\Y@c-2\B@
+ \dimen@nth6\Y@c % \divide\Y@c by6\relax
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \crv@cnt@=\@ne\relax
+ \noexpand\middlebspline@ }%
+ \fi \adjustmaxmin@ \czeroEdge@
+ \bsplined@ \splineset@ \leave@ }
+
+\xydef@\lastbspline@@{\bgroup
+ \advance\crv@cnt@\@ne \edef\segmentnum@{\the\crv@cnt@}%
+\splinetrace@{<: \the\X@p, \the\Y@p}%
+ \advance\crv@cnt@\@ne \xycontrolpt@{\crv@cnt@}%
+ \global\dimen3=\X@c \global\dimen5=\Y@c
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \advance\crv@cnt@\m@ne \xycontrolpt@{\crv@cnt@}%
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \A@=\X@c \advance\A@\dimen3 \halve@dimen\A@ % \divide\A@\tw@
+ \B@=\Y@c \advance\B@\dimen5 \halve@dimen\B@ % \divide\B@\tw@
+ \adjustmaxmin@ \leave@ \relax \cv@end % <---------------
+\splinetrace@{>: \the\X@c, \the\Y@c}%
+ \bsplined@ \splineset@ \leave@ }%
+\xylet@\lastbspline@=\lastbspline@@
+
+\xydef@\middlebspline@@{%
+ \advance\crv@cnt@\@ne \edef\segmentnum@{\the\crv@cnt@}%
+\splinetrace@{<: \the\X@p, \the\Y@p}%
+ \bgroup
+ \xycontrolpt@{\crv@cnt@}\A@=2\X@c \B@=2\Y@c
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \advance\crv@cnt@\@ne \xycontrolpt@{\crv@cnt@}%
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \advance\A@\X@c \dimen@nth3\A@ % \divide\A@ by3
+ \advance\B@\Y@c \dimen@nth3\B@ % \divide\B@ by3\relax
+ \advance\X@c\A@ \halve@dimen\X@c % \divide\X@c\tw@
+ \advance\Y@c\B@ \halve@dimen\Y@c % \divide\Y@c\tw@
+ \global\dimen3=\X@c \global\dimen5=\Y@c
+ \advance\crv@cnt@\@ne \xycontrolpt@{\crv@cnt@}%
+\splinetrace@{\the\crv@cnt@: \the\X@c, \the\Y@c}%
+ \expandafter\count@\xycrvcnt@\relax
+ \ifnum\crv@cnt@<\count@\relax
+ \advance\X@c 7\dimen3\advance\X@c-2\A@
+ \dimen@nth6\X@c % \divide\X@c by6\relax
+ \advance\Y@c 7\dimen5\advance\Y@c-2\B@
+ \dimen@nth6\Y@c % \divide\Y@c by6\relax
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \crv@cnt@=\segmentnum@\relax
+ \noexpand\middlebspline@}%
+ \else
+ \advance\X@c-\A@ \dimen@nth4\X@c % \divide\X@c by4
+ \advance\X@c \dimen3\relax
+ \advance\Y@c-\B@ \dimen@nth4\Y@c % \divide\Y@c by4
+ \advance\Y@c \dimen5\relax
+ \enter@{\X@p=\the\X@c \Y@p=\the\Y@c \noexpand\lastbspline@}%
+ \fi \adjustmaxmin@
+ \bsplined@ \splineset@ \leave@ }
+\xylet@\middlebspline@=\middlebspline@@
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\scanbspline@{\splined@@@}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\bsplined@{\cubiced@
+ \expandafter\ifx\xysplineedges@\relax\relax\DN@{}%
+ \else\DN@{\adjustbsplineedges@}\fi \next@ }
+
+\xydef@\adjust@forsegments@{\getcrvsegsnum@
+ \ifnum\count@>\@ne
+\splinetrace@{adjust for \the\count@\space segments:
+ \the\dimen5, \the\dimen7}%
+ \multiply\dimen5 by \count@\relax \dimen@=\segmentnum@\p@
+ \ifnum\dimen5>\dimen@ \relax\dimen5=\p@
+ \else \advance\dimen5-\segmentnum@\p@ \advance\dimen5 by\p@ \fi
+ \ifnum\dimen5<\z@ \relax\dimen5=\z@\relax\fi
+ \multiply\dimen7 by \count@\relax
+ \dimen@=\segmentnum@\p@ %\advance\dimen@-\segmentnum@\p@
+ \ifnum\dimen7<\dimen@ \advance\dimen@-\p@
+ \ifnum\dimen7>\dimen@ \advance\dimen7-\dimen@
+ \else \dimen7=\z@ \fi
+ \else \dimen7=\p@ \fi
+\splinetrace@{adjusted for \the\count@\space segments:
+ \the\dimen5, \the\dimen7}%
+ \fi}
+
+\xydef@\adjustbsplineedges@{\bgroup % dimen5 and dimen7 are NOT global here
+\splinetrace@{** adjusting edges **}%
+ \readsplineparams@ \adjust@forsegments@
+% \count@@=\dimen7\divide\count@@\p@
+% \advance\dimen7-\count@@\p@ \advance\count@@\@ne
+% \count@=\dimen5\divide\count@\p@
+% \advance\dimen5-\count@\p@ \advance\count@\@ne
+\splinetrace@{params:\xysplineparams@}%
+\splinetrace@{segment \segmentnum@:<\the\dimen5,\the\dimen7>:\xysplineedges@}%
+% \expandafter\ifnum\segmentnum@=\count@
+% \else
+% \expandafter\ifnum\segmentnum@<\count@\dimen5=\p@
+% \else\dimen5=\z@ \fi\fi
+% \expandafter\ifnum\segmentnum@=\count@@
+ \multiply\dimen7by\m@ne \advance\dimen7by\p@
+% \else
+% \expandafter\ifnum\segmentnum@>\count@@\dimen5=\p@\dimen7=\p@
+% \else\dimen7=\z@ \fi\fi
+ \expandafter\edef\xysplineedges@{%
+ \noexpand\z@;\the\dimen5,\noexpand\z@;\the\dimen7,}%
+ \edef\tmp@{\egroup
+ \noexpand\def\expandafter\noexpand\xysplineedges@{\xysplineedges@}}%
+ \tmp@ }
+\DOCMODE)
+
+These macros select the correct B\'ezier control points for each
+segment of the spline. This is needed for finding places on the
+constructed curves.
+
+In general there are 5 types of segment: first, second, middle,
+penultimate, final. The conversion from B-spline to B\'ezier is
+slightly different for each type.
+For middle segments the B\'ezier control points are determined
+in the following way:
+\begin{eqnarray*}
+X_{B_i}^{(1)} &=& {1\over3}\left( 2X^{(i)} + X^{(i+1)}\right)\\
+X_{B_i}^{(2)} &=& {1\over3}\left( X^{(i)} + 2X^{(i+1)}\right)\\
+X_{B_i}^{(0)} &=&
+{1\over6}\left( X^{(i-1)} + 4X^{(i)} + X^{(i+1)}\right)\\
+&=& {1\over6}\left( X^{(i-1)} + 7X_{B_i}^{(1)} - 2X_{B_i}^{(2)}\right)\\
+X_{B_i}^{(3)} &=&
+{1\over6}\left( X^{(i)} + 4X^{(i+1)} + X^{(i+2)}\right)\\
+&=& {1\over6}\left( X^{(i+2)} + 7X_{B_i}^{(2)} - 2X_{B_i}^{(1)}\right)\\
+\end{eqnarray*}
+
+\DOCMODE(
+\xydef@\bsegment@@ii@iii{%
+ \xycontrolpt@{\count@@}\global\dimen3=\X@c \global\dimen5=\Y@c
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\count@@\@ne \xycontrolpt@{\count@@}\A@=\X@c \B@=\Y@c
+ \advance\A@ by2\dimen3 \dimen@nth3\A@ % \divide\A@ by3\relax
+ \advance\B@ by2\dimen5 \dimen@nth3\B@ % \divide\B@ by3\relax
+ \dimen@=\dimen3 \advance\dimen@ by2\X@c
+ \dimen@nth3\dimen@ % \divide\dimen@\thr@@
+ \global\dimen3=\dimen@
+ \dimen@=\dimen5 \advance\dimen@ by2\Y@c
+ \dimen@nth3\dimen@ % \divide\dimen@\thr@@
+ \global\dimen5=\dimen@
+\splinetrace@{<: \the\dimen3, \the\dimen5}%
+\splinetrace@{>: \the\A@, \the\B@}%
+ \advance\count@@\m@ne }
+
+\xydef@\bsegment@@i{\bgroup
+ \advance\count@@\m@ne \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \advance\X@p-2\dimen3\advance\X@p by7\A@
+ \dimen@nth6\X@p % \divide\X@p by6\relax
+ \advance\Y@p-2\dimen5\advance\Y@p by7\B@
+ \dimen@nth6\Y@p % \divide\Y@p by6\relax
+}
+
+\xydef@\bsegment@@iv{%
+ \advance\count@@\tw@ \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\X@c by7\dimen3\advance\X@c-2\A@
+ \dimen@nth6\X@c % \divide\X@c by6\relax
+ \advance\Y@c by7\dimen5\advance\Y@c-2\B@
+ \dimen@nth6\Y@c % \divide\Y@c by6\relax
+\splinetrace@{>>: \the\X@c, \the\Y@c }%
+}
+\DOCMODE)
+
+For the second segment the expression for $X_{B_2}^{(0)}$ is different.
+Similarly the expression for $X_{B_{n-1}}^{(3)}$ is altered for the
+penultimate segment.
+
+\begin{eqnarray*}
+X_{B_2}^{(0)} &=&
+{1\over4}\left( X^{(1)} + 4X_{B_2}^{(1)} - X_{B_2}^{(2)}\right)\\
+X_{B_{n-1}}^{(3)} &=&
+{1\over4}\left( X^{(3)} + 4X_{B_{n-1}}^{(2)} - X_{B_{n-1}}^{(1)}\right)\\
+\end{eqnarray*}
+
+\DOCMODE(
+\xydef@\bsegment@@ii@i{\bgroup
+ \advance\count@@\m@ne \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \advance\X@p-\dimen3\advance\X@p by4\A@
+ \dimen@nth4\X@p % \divide\X@p by4\relax
+ \advance\Y@p-\dimen5\advance\Y@p by4\B@
+ \dimen@nth4\Y@p % \divide\Y@p by4\relax
+\splinetrace@{<<: \the\X@p, \the\Y@p}%
+}
+\xydef@\bsegment@@y@iv{%
+ \advance\count@@\tw@ \xycontrolpt@{\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\X@c by4\dimen3\advance\X@c-\A@
+ \dimen@nth4\X@c % \divide\X@c by4\relax
+ \advance\Y@c by4\dimen5\advance\Y@c-\B@
+ \dimen@nth4\Y@c % \divide\Y@c by4\relax
+}
+\DOCMODE)
+
+For the first segment the first three B\'ezier control points are always
+determined in the same way:
+\begin{eqnarray*}
+X_{B_1}^{(0)} = X^{(0)} & X_{B_1}^{(1)} = X^{(1)}
+ & X_{B_1}^{(2)} = {1\over2}(X_{B_1}^{(1)}+X^{(2)})\\
+\hbox{3+~segments}&
+ & X_{B_1}^{(3)} = {1\over6}(7X_{B_1}^{(2)} - 2X_{B_1}^{(1)} + X^{(3)})\\
+\hbox{~2~segments}&
+ & X_{B_1}^{(3)} = {1\over4}(4X_{B_1}^{(2)} - X_{B_1}^{(1)} + X^{(3)})\\
+\end{eqnarray*}
+
+
+\DOCMODE(
+\xydef@\bsegment@i{%
+ \xycontrolpt@\z@ \X@p=\the\X@c \Y@p=\the\Y@c
+% \ifx\cv@start\relax
+% \bgroup\csname cv@0\endcsname
+% \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+% \else\xycontrolpt@\z@ \X@p=\the\X@c \Y@p=\the\Y@c\fi
+\splinetrace@{0: \the\X@p \the\Y@p}%
+ \xycontrolpt@\@ne
+\splinetrace@{1: \the\X@c, \the\Y@c}\A@=\X@c \B@=\Y@c
+ \xycontrolpt@\tw@
+ \dimen@=\X@c \advance\dimen@\A@ \dimen@half
+ \global\dimen3=\dimen@
+\splinetrace@{2: \the\X@c, \the\Y@c}%
+ \dimen@=\Y@c \advance\dimen@\B@ \dimen@half
+ \global\dimen5=\dimen@ }
+
+\xydef@\bsegment@i@iv{%
+ \xycontrolpt@{3}%
+\splinetrace@{3: \the\X@c, \the\Y@c}%
+ \advance\X@c by7\dimen3\advance\X@c-2\A@
+ \dimen@nth6\X@c % \divide\X@c by6\relax
+ \advance\Y@c by7\dimen5\advance\Y@c-2\B@
+ \dimen@nth6\Y@c % \divide\Y@c by6\relax
+ }
+\DOCMODE)
+
+The last segment is determined symmetrically from the final four
+control points:
+\begin{eqnarray*}
+X_{B_n}^{(3)} = X^{(n+2)} & X_{B_n}^{(2)} = X^{(n+1)}
+ & X_{B_n}^{(1)} = {1\over2}(X_{B_n}^{(2)}+X^{(n)})\\
+\hbox{3+~segments}&
+ & X_{B_n}^{(0)} = {1\over6}(X^{(n-1)}-2X_{B_n}^{(2)}+7X_{B_n}^{(1)})\\
+\hbox{~2~segments}&
+ & X_{B_n}^{(0)} = {1\over4}(X^{(1)}-X_{B_n}^{(2)}+4X_{B_n}^{(1)})\\
+\end{eqnarray*}
+
+\DOCMODE(
+\xydef@\bsegment@z{%
+ \expandafter\count@@\xycrvptsnum@ \advance\count@@\@ne
+ \xycontrolpt@{\the\count@@}\relax
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\count@@\m@ne
+ \bgroup
+ \xycontrolpt@{\the\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \global\dimen3=\X@c \global\dimen5=\Y@c
+ \advance\count@@\m@ne \xycontrolpt@{\the\count@@}%
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \A@=\X@c \advance\A@\dimen3 \halve@dimen\A@ % \divide\A@\tw@
+ \B@=\Y@c \advance\B@\dimen5 \halve@dimen\B@ % \divide\B@\tw@
+ \edef\tmp@{\egroup \A@=\the\A@ \B@=\the\B@ \count@@=\the\count@@}%
+ \tmp@ }
+
+\xydef@\bsegment@z@i{%
+ \expandafter\count@@\xycrvptsnum@\relax\advance\count@@-\tw@
+ \bgroup
+ \xycontrolpt@{\count@@}\X@p=\the\X@c \Y@p=\the\Y@c
+\splinetrace@{\the\count@@: \the\X@c, \the\Y@c}%
+ \advance\X@p by7\A@ \advance\X@p-2\dimen3 \dimen@nth6\X@p
+ \advance\Y@p by7\B@ \advance\Y@p-2\dimen5 \dimen@nth6\Y@p
+ \edef\tmp@{\egroup \X@p=\the\X@p \Y@p=\the\Y@p}%
+ \tmp@ }
+\DOCMODE)
+
+This is the switching-yard.
+
+\DOCMODE(
+\xydef@\bsplinesegment@#1{\xybsplinemethods@
+ \count@@=#1\relax
+ \ifnum\count@@=\@ne % first segment
+ \bsegment@i \bsegment@i@iv
+ \else\ifnum\count@@=\tw@ % second segment
+ \bsegment@@ii@iii \bsegment@@ii@i \bsegment@@iv
+% \else\expandafter\count@\xycrvcnt@\advance\count@\m@ne
+ \else\expandafter\count@\xycrvptsnum@\advance\count@\m@ne
+ \ifnum\count@@=\count@ % last segment
+ \bsegment@z \bsegment@z@i
+ \else\advance\count@\m@ne
+ \ifnum\count@@=\count@ % penult. segment
+ \bsegment@@ii@iii \bsegment@@i \bsegment@@y@iv
+ \else % middle segments
+ \bsegment@@ii@iii \bsegment@@i \bsegment@@iv
+ \fi\fi\fi\fi
+ \expandafter\def\expandafter\segmentnum@\expandafter{\number#1}%
+ \bsplined@ }
+\DOCMODE)
+
+Here are the differences for 3 control points.
+
+\DOCMODE(
+\xydef@\bsplinesegment@iii#1{\xybsplinemethods@
+\splinetrace@{2 segments; \number#1}%
+ \count@@=#1\relax
+ \ifnum\count@@=\@ne \bsegment@i
+ \xycontrolpt@{3}%
+\splinetrace@{3: \the\X@c, \the\Y@c}%
+ \advance\X@c 4\dimen3\advance\X@c-\A@
+ \dimen@nth4\X@c % \divide\X@c by4\relax
+ \advance\Y@c 4\dimen5\advance\Y@c-\B@
+ \dimen@nth4\Y@c % \divide\Y@c by4\relax
+ \else\ifnum\count@@=\tw@ \bsegment@z
+ \bgroup\xycontrolpt@{\@ne}%
+\splinetrace@{1: \the\X@c, \the\Y@c}%
+ \edef\tmp@{\egroup \X@p=\the\X@c \Y@p=\the\Y@c}\tmp@
+ \advance\X@p 4\A@ \advance\X@p-\dimen3 %
+ \dimen@nth4\X@p % \divide\X@p by4\relax
+ \advance\Y@p 4\B@ \advance\Y@p-\dimen5 %
+ \dimen@nth4\Y@p % \divide\Y@p by4\relax
+ \fi\fi
+ \expandafter\def\expandafter\segmentnum@\expandafter{\number#1}%
+ \bsplined@ }
+\DOCMODE)
+
+Here are the differences for 4 control points.
+
+\DOCMODE(
+\xydef@\bsplinesegment@iv#1{\xybsplinemethods@
+\splinetrace@{3 segments; \number#1}%
+ \count@@=#1\relax
+ \ifnum\count@@=\@ne \bsegment@i \bsegment@i@iv
+ \else\ifnum\count@@=\tw@
+ \bsegment@@ii@iii \bsegment@@ii@i \bsegment@@y@iv
+ \else\ifnum\count@@=3\relax
+ \bsegment@z \bsegment@z@i %\xycontrolpt@{5}%
+ \fi\fi\fi
+ \expandafter\def\expandafter\segmentnum@\expandafter{\number#1}%
+ \bsplined@ }
+\DOCMODE)
+
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Circles and Ellipses}
+??=[circles+ellipses]
+
+\noindent Here we describe the means to a specify circles of arbitrary
+radius, drawn with arbitrary line styles. When large-sized objects are
+used they are regularly spaced around the circle. Similarly ellipses
+may be specified, but only those having major/minor axes aligned in
+the standard directions; spacing of objects is no longer regular, but
+is bunched toward the narrower ends.
+
+Such a circle or ellipse is specified using\dots
+\begin{defs1}
+|\xycircle|<vector>|{|<style>|}|
+\end{defs1}
+\noindent
+where the components of the <vector> determine the lengths of the axis
+for the ellipse; thus giving a circle when equal.
+The <style> can be any <conn>, as in ??g[xyarrow.doc:f.arrow] that works
+with curved arrows---many do. Alternatively <style> can be any <object>,
+which will be placed equally-spaced about the circle at a separation
+to snugly fit the <object>s.
+If <empty> then a solid circle or ellipse is drawn.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\TODO: Recognize special <style>s; e.g. |.| for dotted with |\zerodot|,
+|=| for a doubled circle --- alter the radius, draw two circles;
+|:| for double dotted (perhaps use |\doubled@|, |\tripled@|);
+|>| and |<| for chevrons;
+any others?
+
+To use any of these special symbols as the <object> for <style> then
+enclose it within extra braces, \eg~|\xycircle<20pt>{{>}}|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The curves are not truly circular or elliptical, but are approximations
+given by cubic B\'ezier segments. Hence the |xycurve| feature must be loaded.
+
+\DOCMODE(
+\message{circles,}
+\DOCMODE)
+
+The circles are constructed from four B\'ezier cubic curves, one for each
+quadrant of the circle or circle. To do this it is sufficient to establish
+the control points for each cubic segment. This is straightforward, using
+the following ``magic number'', given a square basis such that the desired
+circle is the unit circle, or rectangular basis for which the ``unit circle''
+is the desired circle.
+
+\DOCMODE(
+\xydef@\Circmagic@@{0.5517847}
+\xylet@\Circmagic=\Circmagic@@
+\xydef@\twoPi@{6.2831852}
+\xydef@\fullPi@{3.1415926}
+\xydef@\halfPi@{1.5707963}
+\DOCMODE)
+
+This is the magic number, exactly given by
+${1\over12}\bigl(\sqrt{385}-13\bigr)$,
+that helps construct the B\'ezier cubic curve
+that best approximates a quadrant of a circle.
+It does so with remarkable accuracy,
+differing by at most .5\% of the radius at any angle;
+the average deviation along the whole quadrant being less than .13\%.
+The basic <object> defined here is |\circle|.
+
+\DOCMODE(
+\xynew@{dimen}\L@
+
+\xydef@\xycircle#1#{\hbox\bgroup\afterVECTORorEMPTY{%
+ \xy@@{\R@=\X@c \L@=\Y@c}\xycircle@}{\xy@@{\R@=\R@c \L@=\L@c}\xycircle@}#1@}
+
+\xydef@\xycircle@#1@#2{%
+ \DN@{#1}\ifx\next@\empty\def\onlyQuad@{}\else \count@=#1\relax
+ \ifnum\count@<5 \advance\count@-3\relax
+ \ifnum\count@<\z@ \advance\count@ 4\relax\fi \edef\onlyQuad@{\the\count@}%
+ \else\xyerror@{illegal circle <radius>: must be <vector> or <empty>}{}\fi
+ \fi \xy@@{\def\circleSTYLE@{#2}}\def\circleSTYLE@{#2}\xycircle@i}
+
+\xydef@\xycircle@i{\hbox{\vbox{\vskip\L@
+ \hbox to2\R@{\hfill \buildcircle@ \hfill}\vskip\L@ }}%
+ \L@c=\R@ \R@c=\R@ \D@c=\L@ \U@c=\L@ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\relax}\Edge@c={\circleEdge}%
+ \OBJECT@x}
+
+\xydef@\adjustMinMaxcirc@#1#2{%
+ \dimen@=\X@c \advance\dimen@#1\relax\ifdim\dimen@>\X@max \X@max=\dimen@\fi
+ \dimen@=\X@c \advance\dimen@-#1\relax\ifdim\dimen@<\X@min \X@min=\dimen@\fi
+ \dimen@=\Y@c \advance\dimen@#2\relax\ifdim\dimen@>\Y@max \Y@max=\dimen@\fi
+ \dimen@=\Y@c \advance\dimen@-#2\relax\ifdim\dimen@<\Y@min \Y@min=\dimen@\fi
+}
+
+%\xydef@\buildcircle@{\save@
+%% \cubicCircleControls@@
+% \ifx\circleSTYLE@\empty\DN@{\solidcircle@{}}%
+% \else \expandafter\DN@\expandafter{\addDASH@{}}\relax
+% \ifx\next@\circleSTYLE@ \DN@{%
+% \expandafter\addDASH@\expandafter{\expandafter{\addDASH@{}}}}%
+% \else\DN@{\circledobjects@}\fi\fi\next@ \leave@}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\cubicCircleControls@@{\X@origin=\z@ \Y@origin=\z@
+ \X@xbase=\R@ \Y@xbase=\z@ \X@ybase=\z@ \Y@ybase=\L@
+ \vfromcartesian@@1,0@\czeroEdge@\idfromc@{0@c}%
+ \vfromcartesian@@0,1@\czeroEdge@\idfromc@{1@c}%
+ \vfromcartesian@@-1,0@\czeroEdge@\idfromc@{2@c}%
+ \vfromcartesian@@0,-1@\czeroEdge@\idfromc@{3@c}%
+ \vfromcartesian@@1,\Circmagic@@ @\czeroEdge@\idfromc@{1@m}%
+ \vfromcartesian@@\Circmagic@@,1@\czeroEdge@\idfromc@{2@m}%
+ \vfromcartesian@@-\Circmagic@@,1@\czeroEdge@\idfromc@{3@m}%
+ \vfromcartesian@@-1,\Circmagic@@ @\czeroEdge@\idfromc@{4@m}%
+ \vfromcartesian@@-1,-\Circmagic@@ @\czeroEdge@\idfromc@{5@m}%
+ \vfromcartesian@@-\Circmagic@@,-1@\czeroEdge@\idfromc@{6@m}%
+ \vfromcartesian@@\Circmagic@@,-1@\czeroEdge@\idfromc@{7@m}%
+ \vfromcartesian@@1,-\Circmagic@@ @\czeroEdge@\idfromc@{8@m}%
+ }
+
+\xydef@\doCircleQuadrant@@#1#2{\save@ \ifcase#2\relax
+ \doCircleQuadrant@@@{0@c}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleQuadrant@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleQuadrant@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleQuadrant@@@{3@c}{7@m}{8@m}{0@c}{#1}\or
+ \doCircleQuadrant@@@{0@c}{1@m}{2@m}{1@c}{#1}\or
+ \doCircleQuadrant@@@{1@c}{3@m}{4@m}{2@c}{#1}\or
+ \doCircleQuadrant@@@{2@c}{5@m}{6@m}{3@c}{#1}\or
+ \doCircleQuadrant@@@{3@c}{7@m}{8@m}{0@c}{#1}\fi \leave@ }
+
+\xydef@\doCircleQuadrant@@@#1#2#3#4#5{%
+ \cfromid@{#1}\pfromc@\senter@
+ \cfromid@{#2}\spushc@\cfromid@{#3}\spushc@\cfromid@{#4}%
+ \let\bstartPLACE@=\empty \connect@\crvs{#5}\relax\sinit@\sleave@
+ \resetbreaks@}
+\DOCMODE)
+
+The hook |\dosolidcircle@@| is provided so that back-ends may
+provide an alternative method to draw the circles/ellipses.
+Note that the token following |\solidcircle@| will be a group
+representing the <style> to be used.
+
+\DOCMODE(
+\xydef@\dosolidcircle@#1{%
+ \cubicCircleControls@@
+ \doCircleQuadrant@@{#1}1 \relax\Clast@@
+ \doCircleQuadrant@@{#1}2 \relax\Clast@@
+ \doCircleQuadrant@@{#1}3 \relax\Clast@@
+ \doCircleQuadrant@@{#1}4 \relax\Clast@@}%
+
+\xydef@\solidcircle@{\dosolidcircle@@}
+\xylet@\dosolidcircle@@=\dosolidcircle@
+\DOCMODE)
+
+This places objects equally spaced around a circle,
+according to angular position.
+
+\BUG: objects are not equally spaced around ellipses constructed this way.
+To get regular spacing around ellipses, in terms or arc-length say,
+is much more difficult, both theoretically and practically.
+
+\TODO: the size of the resulting <object> does not take into account
+the size of the <object> dropped around the circle.
+
+\DOCMODE(
+\xydef@\circledobjects@{\cubicCircleControls@@
+ \setboxz@h{\expandafter\object\circleSTYLE@{}}%
+ \ifdim\L@>\R@ \dimen@ii=\ht\z@ \advance\dimen@ii \dp\z@
+ \ifdim\zz@\dimen@ii \dimen@ii=\wdz@\fi
+ \else \dimen@ii=\wdz@
+ \ifdim\zz@\dimen@ii \dimen@ii=\ht\z@ \advance\dimen@ii \dp\z@\fi
+ \fi \ifdim\zz@\dimen@ii \dimen@ii=2\jot\fi
+ \expandafter\dimen@\ifdim\L@>\R@ \twoPi@\L@\else \twoPi@\R@\fi
+ \advance\dimen@.5\dimen@ii
+ \count@@=\dimen@ \count@=\dimen@ii \divide\count@@\count@
+ \edef\numobjects{\the\count@@}\dimen@=4\p@
+ \dimen@nth\numobjects\dimen@ % \divide\dimen@\numobjects\relax
+ \edef\circleseparation@{\expandafter\removePT@\the\dimen@}%
+ \edef\circleplace@{-\circleseparation@}\placeQuadrants@}%
+
+\xydef@\placeQuadrants@{\DN@{\placeAllQuadrants@}%
+ \ifx\onlyQuad@\undefined\else\ifx\onlyQuad@\empty\else
+ \DN@{\expandafter\placeCircQuadrant@\expandafter{\onlyQuad@}}%
+ \fi\fi \next@ }%
+%\def\placeQuadrants@{\placeAllQuadrants@}
+
+\xydef@\placeAllQuadrants@{%
+ \placeCircQuadrant@{1}%
+ \advance\dimen@-\p@\advance\dimen@-\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \placeCircQuadrant@{2}%
+ \advance\dimen@-\p@\advance\dimen@-\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \placeCircQuadrant@{3}%
+ \advance\dimen@-\p@\advance\dimen@-\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \placeCircQuadrant@{4}}
+
+\xydef@\placeCircQuadrant@#1{%
+ \let\bstartPLACE@=\relax \doCircleQuadrant@@{}#1%
+ \loop@
+ \expandafter\dimen@\circleplace@\p@
+ \advance\dimen@\circleseparation@\p@
+ \edef\circleplace@{\expandafter\removePT@\the\dimen@}%
+ \ifdim\dimen@<\p@ \placeCircObject@
+ \repeat@ }
+
+\xydef@\placeCircObject@{\begingroup
+ \crvconnect@@ \Creset@@ \Invisible@false
+ \expandafter\splinealong@\expandafter{\circleplace@}%
+ \expandafter\drop\circleSTYLE@{}\endgroup }
+
+\xydef@\buildcircle@{\save@
+% \cubicCircleControls@@
+ \DNii@{\circledobjects@}%
+ \ifx\circleSTYLE@\empty\DNii@{\solidcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDASH@{}}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\solidcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addEQ@{}}%
+ \ifx\next@\circleSTYLE@
+ \expandafter\circletemplate@\expandafter{\addEQ@{}}{}%
+ \else \expandafter\DN@\expandafter{\addDASH@ 2}%
+ \ifx\next@\circleSTYLE@ \DNii@{\doublecircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDASH@ 3}%
+ \ifx\next@\circleSTYLE@ \DNii@{\triplecircle@{}}%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addDASH@\addDASH@{}}%
+ \ifx\next@\circleSTYLE@ \DNii@{\dashedcircle@{}}%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addEQ@\addEQ@{}}%
+ \ifx\next@\circleSTYLE@ \expandafter\expandafter\expandafter
+ \circletemplate@\expandafter\expandafter\expandafter{%
+ \expandafter\addEQ@\addEQ@{}}2%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addEQ@\addEQ@2}%
+ \ifx\next@\circleSTYLE@ \expandafter\expandafter\expandafter
+ \circletemplate@\expandafter\expandafter\expandafter{%
+ \expandafter\addEQ@\addEQ@{}}2%
+ \else \expandafter\expandafter\expandafter\DN@\expandafter\expandafter
+ \expandafter{\expandafter\addEQ@\addEQ@3}%
+ \ifx\next@\circleSTYLE@ \expandafter\expandafter\expandafter
+ \circletemplate@\expandafter\expandafter\expandafter{%
+ \expandafter\addEQ@\addEQ@{}}3%
+ \else \expandafter\DN@\expandafter{\addDOT@{}}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\dottedcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDOT@2}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\dbldottedcircle@{}}%
+ \else \expandafter\DN@\expandafter{\addDOT@3}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\trpldottedcircle@{}}%
+ \else \DN@{:}\relax
+ \ifx\next@\circleSTYLE@ \DNii@{\dbldottedcircle@{}}%
+% \else\DN@{\circledobjects@}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \nextii@ \leave@}
+
+\xydef@\circletemplate@#1#2{\def\circleSTYLE@{\dir#2{#1}}}
+\xydef@\doublecircle@#1{%
+ \advance\R@-\p@ \advance\L@-\p@ \solidcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \solidcircle@{}}
+\xydef@\triplecircle@#1{%
+ \advance\R@-2\p@ \advance\L@-2\p@ \solidcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \solidcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \solidcircle@{}}
+
+%\xydef@\dashedcircle@#1{\expandafter\expandafter\expandafter
+% \circletemplate@\expandafter\expandafter\expandafter{%
+% \expandafter\addDASH@\addDASH@{}}{}\circledobjects@ }%
+
+\xydef@\dottedcircle@#1{%
+ \expandafter\def\expandafter\circleSTYLE@\expandafter{%
+% \expandafter{\addDOT@{}}}%
+ \zerodot@i}%
+ \circledobjects@}
+
+\xydef@\dashedcircle@#1{%
+ \expandafter\def\expandafter\circleSTYLE@\expandafter{\zerodash@i}%
+ \circledobjects@}
+
+\xydef@\dbldottedcircle@#1{%
+ \advance\R@-\p@ \advance\L@-\p@ \dottedcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \dottedcircle@{}}
+\xydef@\trpldottedcircle@{%
+ \advance\R@-2\p@ \advance\L@-2\p@ \dottedcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \dottedcircle@{}%
+ \advance\R@ 2\p@ \advance\L@ 2\p@ \dottedcircle@{}}
+
+{\xyuncatcodes \gdef\next{=<.75\jot>{\zerodot}}}
+\xylet@\zerodot@i=\next
+
+{\dimen0=2\xydashl@ \xyuncatcodes
+\expandafter\gdef\expandafter\next\expandafter{\expandafter
+ =\expandafter<\the\dimen0 >_\dir{|}}}
+\xylet@\zerodash@i=\next
+
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{code}
+\xy 0;/r5pc/:*\dir{*}
+ ;p+(.5,-.5)*\dir{*}="c"
+,**\dir{-},*+!UL{c},"c"
+,*\xycircle(1,.4){++\dir{<}}
+,*\xycircle(1,1){++\dir{>}}
+,*\xycircle<15pt,10pt>{}
+;*\xycircle<10pt>{{.}}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+{\xyuncatcodes\gdef\next{--}}
+\xylet@\dashcorntemp@@=\next
+{\xyuncatcodes\gdef\next{.}}
+\xylet@\dotcorntemp@@=\next
+
+\xydef@\dotcorner@#1{%
+ \expandafter\circleCorner@\expandafter{\dotcorntemp@@}{#1}}%
+\xydef@\dashcorner@#1{%
+ \expandafter\circleCorner@\expandafter{\dashcorntemp@@}{#1}}
+
+\xydef@\circleCorner@#1#2{\setboxz@h\bgroup
+ \edef\next{#2\relax\R@=\the\R@\relax\L@=\R@ }%
+ \expandafter\xycircle@\next @{#1}%
+ \ifcase#2\or \setboxz@h{\lower\R@\boxz@\kern\X@c}%
+ \or \setboxz@h{\kern-\R@\lower\R@\boxz@\kern\R@\kern\X@c}%
+ \or \setboxz@h{\kern-\R@\lower\R@\boxz@\kern\R@\kern\X@c}%
+ \or \setboxz@h{\lower\R@\boxz@\kern\X@c}\fi
+ \wdz@=\R@ \ht\z@=\R@ \dp\z@=\R@ \boxz@
+ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Quadratic Splines}
+??=[quadsplines]
+
+Quadratic B\'ezier splines, as distinct from cubic B\'ezier splines,
+are constructed from parabolic arcs, using `control points' to determine
+the tangents where successive arcs are joined.
+
+Various implementations of such curves exist.
+The one adopted here is consistent with the |xfig| drawing utility and
+\TPIC\ implementations. These have the property of beginning and ending
+with straight segments, half the length to the corresponding adjacent
+control-point. Furthermore the midpoint between successive control-points
+lies on the spline, with the line joining the control-points being tangent
+there.
+
+Such curves are specified, either as a <decor> or as an <object>,
+using\dots
+\begin{defs1}
+|\qspline{|<style>|}|
+\end{defs1}
+\noindent
+where the start and end of the curve are at $p$ and $c$ respectively.
+The control-points are taken from the current stack, see~??g[xy.doc:stack].
+If this stack is empty then a straight line is constructed.
+
+The following example compares the quadratic spline with the gentler
+curving B-spline having the same control points, using |\crvs|.
+%
+\begin{code}
+\xy /r1.5pc/:,+<5pc,3pc>*+{P};p
+@(,+(2,2)*{+}@+, +(2,-2)*{+}@+
+,+(2,2)*{+}@+, +(2,0)*+{C}="C"
+,*\qspline{},"C",**\crvs{.}
+,@i @)\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+If the current stack is empty, simply pass everything to |\crvs@|, as if
+the request originated from a |\crvs| or |\ar|. Otherwise we must build up
+the segments of the spline.
+
+\DOCMODE(
+\xydef@\qspline{\hbox\bgroup\crvresetbreaks@ \xy@spline@}
+
+\xydef@\xy@spline@#1#{\if\sempty@ \DN@{\crvs@{}\resetbreaks@}%
+ \else\DN@{\xy@spline@i{#1}}\fi \next@ }%
+\DOCMODE)
+
+The |#1| parameter to |\xy@spline@i| is to allow
+alternative implementations; currently it is ignored.
+When |#1| is indeed empty,
+
+\DOCMODE(
+\xydef@\xy@spline@i#1#2{\def\splineSTYLE@{#2}%
+ \DN@{\xy@spline@ii}\DNii@{#1}%
+ \ifx\nextii@\empty\DN@{\xy@spline@ii@@}\fi \next@ }
+
+\xydef@\xy@spline@ii{\save@ \cfromp@\idfromc@{@p}%
+ \enter@\cplusthec@ \count@@=\s@top\advance\count@@\m@ne
+ \cfroms@{\count@@}\leave@
+ \halve@dimen\X@c % \divide\X@c\tw@
+ \halve@dimen\Y@c % \divide\Y@c\tw@
+ \czeroEdge@ \idfromc@{@c}%
+ \expandafter\doSplineStraight@\expandafter{\splineSTYLE@}%
+ \count@=\@ne \edef\next@{\the\count@}%
+ \ifx\next@\s@top\DN@{\xy@spline@iv}\else\DN@{\xy@spline@iii}\fi
+ \next@ }
+\xylet@\xy@spline@ii@@=\xy@spline@ii
+
+\xydef@\xy@spline@iii{\crv@cnt@=\s@top
+ \loop \advance\crv@cnt@\m@ne \xy@spline@g \ifnum\crv@cnt@>\@ne\repeat
+ \xy@spline@iv}
+
+\xydef@\xy@spline@g{\cfromid@{@c}\idfromc@{@p}%
+ \count@@=\crv@cnt@\cfroms@{\count@@}\idfromc@{@m}%
+ \enter@\cplusthec@ \count@@=\crv@cnt@ \advance\count@@\m@ne
+ \cfroms@{\count@@}\leave@
+ \halve@dimen\X@c % \divide\X@c\tw@
+ \halve@dimen\Y@c % \divide\Y@c\tw@
+ \czeroEdge@\idfromc@{@c}%
+ \expandafter\doSplineSegment@\expandafter{\splineSTYLE@}}
+
+\xydef@\xy@spline@iv{\cfromid@{@c}\idfromc@{@p}%
+ \cfroms@{\z@}\idfromc@{@m}\leave@ \save@
+ \enter@\cplusthec@ \cfromid@{@m}\leave@
+ \halve@dimen\X@c % \divide\X@c\tw@
+ \halve@dimen\Y@c % \divide\Y@c\tw@
+ \czeroEdge@\idfromc@{@c}%
+ \expandafter\doSplineSegment@\expandafter{\splineSTYLE@}%
+ \xy@spline@v }
+
+\xydef@\xy@spline@v{\cfromid@{@c}\idfromc@{@p}%
+ \leave@ \save@ \idfromc@{@c}%
+ \expandafter\doSplineStraight@\expandafter{\splineSTYLE@}%
+ \xy@spline@x }
+
+\xydef@\xy@spline@x{\leave@
+ \def\Drop@@{\splineDrop@ \resetbreaks@}%
+ \def\Connect@@{\straight@\relax\splineConnect@ \resetbreaks@}%
+ \OBJECT@x}
+
+\xydef@\splineDrop@{\ifInvisible@\setboxz@h{}%
+ \else\setboxz@h{\kern-\the\X@c\raise-\the\Y@c\hbox{\styledboxz@}}\fi
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@ }
+
+\xydef@\splineConnect@{%
+ \ifInvisible@\else\box\lastobjectbox@\fi }%
+\DOCMODE)
+
+The initial and final points in a segment are stored as |@p| and |@c|
+respectively. Where needed, the control is in |@m|.
+
+\DOCMODE(
+\xydef@\doSplineStraight@#1{\begingroup \sinit@
+ \cfromid@{@p}\pfromc@\cfromid@{@c}%
+ \connect@\crvs{#1}\relax\sleave@\endgroup }
+
+\xydef@\doSplineSegment@#1{\begingroup \sinit@
+ \cfromid@{@p}\pfromc@\senter@\cfromid@{@m}\spushc@\cfromid@{@c}%
+ \connect@\crvs{#1}\relax\sinit@\sleave@\endgroup }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xycurve.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 09:01:45 ross
+% major revisions for the new BREAK methods
+% spline edge-finding is more robust
+% spline-breaks fully implemented
+% intersections of curve with straight connections implemented
+% improved tracings
+% adjusted methods for styles
+%
+% Revision 3.2 1995/09/19 18:20:20 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/05 07:58:43 ross
+% Ready for v3 release?
+%
+% Revision 2.12 1994/10/25 03:01:14 ross
+% Final 3beta release [bug fixes & AMS-LaTeX fitting].
+%
+% Revision 2.12 1994/09/05 08:22:11 ross
+% incorporates some speed-ups, extra documentation
+%
+% Revision 2.11 1994/07/05 09:27:52 ross
+% Minor fixes; use 2.11 kernel stack code.
+%
+% Revision 2.9 1994/06/09 14:50:54 ross
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 10:36:40 ross
+% Second 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 ross
+% Last internal 3alpha and pre-2.7 release.
+%
+% NEW for version 2.7 inspired by Knuth's picmac.tex.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xydoc.back b/Master/texmf-dist/source/generic/xypic/xydoc.back
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydoc.back
@@ -0,0 +1 @@
+
diff --git a/Master/texmf-dist/source/generic/xypic/xydoc.bib b/Master/texmf-dist/source/generic/xypic/xydoc.bib
new file mode 100644
index 00000000000..ca8bbaac87b
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydoc.bib
@@ -0,0 +1,764 @@
+% $Id: xydoc.bib,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+%
+% BibTeX References for the Xy-pic documentation.
+%
+% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+% See the companion README and INSTALL files for further information.
+% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose at ens-lyon.fr>
+%
+% The Xy-pic package is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.
+%
+% The Xy-pic package is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License along
+% with this package; if not, write to the Free Software Foundation, Inc.,
+% 675 Mass Ave, Cambridge, MA 02139, USA.
+%
+% CONTENTS:
+% Journals, publishers, and institutions.
+% Special TeX definitions.
+% My TeX production.
+% Other TeX related references, sorted by author.
+% Other references, sorted by author.
+% Log.
+%
+% NOTE: uses the abbreviations \TeX, \MF, \LaTeX, \AMS, \PiCTeX, and \Xy.
+
+@Preamble{"\label{BIBLIOGRAPHY}"}
+
+%
+% JOURNALS, PUBLISHERS, AND INSTITUTIONS.
+
+% Journals given in BibTeX standard styles:
+@string{cacm = "Communications of the ACM"}
+@string{sicomp = "SIAM Journal on Computing"}
+@string{tcs = "Theoretical Computer Science"}
+
+@string{jfp = "Journal of Functional Programming"}
+@string{lasc = "{LISP} and Symbolic Computation"}
+@string{spe = "Software Practice and Experience"}
+
+% Publishers...
+@string{A-W = "Addison-Wesley"}
+@string{N-H = "North-Holland"}
+@string{P-H = "Prentice-Hall"}
+@string{S-V = "Springer-Verlag"}
+@string{LNCS = "{LNCS}"}
+
+% Organizations...
+@string{ACM = "Association for Computing Machinery"}
+@string{AMS = "American Mathematical Society"}
+@string{DIKU = "{DIKU}, University of Copenhagen"}
+
+%
+% Xy-pic (most recent first).
+
+% Start of v3 as `published' from DIKU on the form required for
+% registration with PUF and ANL...
+
+% Kit.
+@Misc{RM95:Xy-pic,
+ author = "Kristoffer H. Rose and Ross R. Moore",
+ title = "{\Xy}-pic, version 3",
+ month = jun,
+ year = 1995,
+ howpublished = "computer software kit",
+ note = "includes
+ User's Guide~\cite{R95:Xy-picUG}, and
+ Reference Manual~\cite{RM95:Xy-picRM}"
+}
+
+% 1.
+@Manual{R95:Xy-picUG,
+ author = {Kristoffer H. Rose},
+ YEAR = {1995},
+ TITLE = {{\Xy}-pic User's Guide},
+ organization = {{DIKU}, University of Copenhagen},
+ address = {Universitetsparken 1, DK--2100 K{\o}benhavn {\O}},
+ month = jun,
+ edition = {3.0},
+ keywords = {diagram, picture, graph, arrow, curve, commutative diagram},
+ summary = {{\Xy}-pic is a package for typesetting graphs and
+ diagrams using Knuth's \TeX\ typesetting system.
+ \Xy-pic works with most of the many formats
+ available, \eg, plain \TeX, \LaTeX, \AMS-\LaTeX, and
+ \AMS-\TeX. Several styles of input for various
+ diagram types are supported; they all share a
+ mnemonic notation based on the logical composition
+ of visual components used},
+ supersedes = {D-200},
+ SEMNO = {D-237},
+ PUF = {---},
+ ID = {Man}
+}
+
+% 2.
+@Manual{RM95:Xy-picRM,
+ author = {Kristoffer H. Rose and Ross R. Moore},
+ YEAR = {1995},
+ TITLE = {{\Xy}-pic Reference Manual},
+ organization = {{DIKU}, University of Copenhagen},
+ address = {Universitetsparken 1, DK--2100 K{\o}benhavn {\O}},
+ month = jun,
+ edition = {3.0},
+ keywords = {diagram, picture, graph, arrow, curve, commutative diagram},
+ summary = {{\Xy}-pic is a package for typesetting graphs and
+ diagrams. It is structured as several modules, each
+ defining a custom notation for a particular kind of
+ graphical object or structure. Example objects are
+ arrows, curves, frames, and colouring/rotation on
+ drivers that support it; these can be organised in
+ matrix, directed graph, path, polygon, knot, and
+ 2-cell structure. Xy-pic works with most formats,
+ including LaTeX, AMS-LaTeX, AMS-TeX, and plain TeX,
+ and has been used to typeset complicated diagrams
+ from many application areas including category
+ theory, automata theory, algebra, neural networks,
+ and database theory},
+ supersedes = {D-201},
+ SEMNO = {D-238},
+ PUF = {---},
+ ID = {Man}
+}
+
+% 3.
+@Misc{RM95:Xy-picCSTC,
+ author = "Kristoffer H. Rose and Ross R. Moore",
+ title = "{\Xy}-pic Complete Sources with {\TeX}\-nical Commentary",
+ month = jun,
+ year = 1995,
+ howpublished = "not yet available"
+}
+
+% 4.
+@Misc{R95:Xy-picUnix,
+ author = "Kristoffer H. Rose",
+ title = "{\Xy}-pic Unix Distribution",
+ month = jun,
+ year = 1995,
+ howpublished = "computer software"
+}
+
+% 5.
+@Misc{M95:Xy-picMac,
+ author = "Ross R. Moore",
+ title = "{\Xy}-pic Macintosh Distribution",
+ month = jun,
+ year = 1995,
+ howpublished = "computer software"
+}
+
+% 6.
+@Misc{M95:Xy-picMacFonts,
+ author = "Ross R. Moore",
+ title = "{\Xy}-pic fonts, for Macintosh",
+ month = jun,
+ year = 1995,
+ howpublished = "computer software"
+}
+
+% 7.
+@Misc{M95:Xy-macXFonts,
+ author = "Ross R. Moore",
+ title = "{\Xy}-pic extra font sizes, for Macintosh",
+ month = jun,
+ year = 1995,
+ howpublished = "computer software"
+}
+
+% End of v3.
+
+
+@Misc{Xy-picHP,
+ author = "Kristoffer H. Rose",
+ title = "The {\Xy}-pic Home Page",
+ howpublished = "\url{http://www.ens-lyon.fr/\~{}krisrose/Xy-pic.html}"
+}
+
+
+% Start of v2.12 as registered with Australian National Library:
+
+% Kit.
+@Misc{RM94:Xy-pic,
+ author = "Kristoffer H. Rose and Ross R. Moore",
+ title = "{\Xy}-pic, version 2.12",
+ month = oct,
+ year = 1994,
+ howpublished = "computer software kit: ISBN 1 86408 117 1",
+ note = "includes software, User's Guide and Reference
+ Manual"
+}
+
+% 1.
+@TechReport{R94:Xy-picUGII,
+ author = "Kristoffer H. Rose and Ross R. Moore",
+ title = "{\Xy}-pic User's Guide and Installation Instructions",
+ institution = "MPCE, Macquarie University",
+ year = 1994,
+ month = oct,
+ type = "Mathematics Report",
+ number = "94--148 (revised), ISBN 1 86408 125 2",
+ address = "NSW 2109, Australia"
+}
+
+% 2.
+@TechReport{RM94:Xy-picRM,
+ title = "{\Xy}-pic Reference Manual",
+ author = "Kristoffer H. Rose and Ross R. Moore",
+ institution = "MPCE, Macquarie University",
+ year = 1994,
+ month = oct,
+ type = "Mathematics Report",
+ number = "94--155, ISBN 1 86408 133 3",
+ address = "NSW 2109, Australia",
+ note = "Available with URL {ftp:/\kern-1pt/ftp.brics.dk\slash
+ Staff\slash krisrose\slash TeX\slash xyrefer.ps}"
+}
+
+% 3.
+@Misc{RM94:Xy-picCSTC,
+ author = "Kristoffer H. Rose and Ross R. Moore",
+ title = "{\Xy}-pic Complete Sources with {\TeX}\-nical Commentary",
+ year = 1994,
+ month = oct,
+ howpublished = "ISBN 1 86408 141 4"
+}
+
+% 4.
+@Misc{R94:Xy-picUnix,
+ author = "Kristoffer H. Rose",
+ title = "{\Xy}-pic Unix Distribution",
+ year = 1994,
+ month = oct,
+ howpublished = "computer software: ISBN 1 86408 149 X",
+ note = "Available with URL {ftp:/\kern-1pt/ftp.diku.dk\slash diku\slash
+ users\slash kris\slash TeX\slash xy212run.tar.gz}"
+}
+
+% 5.
+@Misc{M94:Xy-picMac,
+ author = "Ross R. Moore",
+ title = "{\Xy}-pic Macintosh Distribution",
+ year = 1994,
+ month = oct,
+ howpublished = "computer software: ISBN 1 86408 157 0",
+ note = "Available with URL {ftp:/\kern-1pt/ftp.diku.dk\slash
+ diku\slash users\slash kris\slash TeX\slash
+ xy212mac.sit.hqx}"
+}
+
+% 6.
+@Misc{M94:Xy-picMacFonts,
+ author = "Ross R. Moore",
+ title = "{\Xy}-pic fonts, for Macintosh",
+ year = 1994,
+ month = oct,
+ howpublished = "computer software: ISBN 1 86408 165 1",
+ note = "Available with URL {ftp:/\kern-1pt/ftp.diku.dk\slash
+ diku\slash users\slash kris\slash TeX\slash
+ xy212mac.sit.hqx}"
+}
+
+% 7.
+@Misc{M94:Xy-macXFonts,
+ author = "Ross R. Moore",
+ title = "{\Xy}-pic extra font sizes, for Macintosh",
+ year = 1994,
+ month = oct,
+ howpublished = "computer software: ISBN 1 86408 173 2",
+ note = "Available with URL {ftp:/\kern-1pt/ftp.diku.dk\slash
+ diku\slash users\slash kris\slash TeX\slash
+ xymacxf.sit.hqx}"
+}
+
+% End of v2.12 as registered with Australian National Library...
+
+@TechReport{R94:Xy-picUG,
+ author = "Kristoffer H. Rose",
+ title = "{\Xy}-pic User's Guide",
+ institution = "MPCE, Macquarie University",
+ year = 1994,
+ type = "Mathematics Report",
+ number = "94--148",
+ address = "NSW 2109, Australia",
+ month = jun,
+ note = "For version 2.10+. Latest version available with
+ URL {\tt ftp:/\kern-1pt/ftp.diku.dk\slash diku\slash
+ users\slash kris\slash TeX\slash xy\slash xyguide.ps}"
+}
+
+@TechReport{RM94:Xy-picRM-old,
+ title = "{\Xy}-pic Reference Manual",
+ author = "Kristoffer H. Rose and Ross R. Moore",
+ institution = "MPCE, Macquarie University",
+ year = 1994,
+ month = jun,
+ type = "Mathematics Report",
+ number = "94--155",
+ address = "NSW 2109, Australia",
+ note = "For version 2.10+. Latest version available with
+ URL {ftp:/\kern-1pt/ftp.diku.dk\slash diku\slash
+ users\slash kris\slash TeX\slash xyrefer.ps}"
+}
+
+@Manual{M94:TypesettingNNX,
+ title = "Typesetting Neural Nets using {\Xy}-pic",
+ author = "Ross R. Moore",
+ year = 1994,
+ note = "Available through~\cite{Xy-picHP}"
+}
+
+@Misc{R94:Xy-picNCD,
+ author = "Kristoffer H. Rose",
+ title = "{\Xy}-pic and Notation for Categorical Diagrams",
+ howpublished = "Invited talk at ECCT-94",
+ year = 1994,
+ month = jul,
+ note = "Available through~\cite{Xy-picHP}"
+}
+
+@InProceedings{R92:HowTPDAT,
+ author = "Kristoffer H. Rose",
+ title = "How to Typeset Pretty Diagram Arrows with
+ {\TeX}---Design Decisions used in {\Xy}-pic",
+ pages = "183-190",
+ booktitle = "{Euro\TeX~'92}---Proceedings of the 7th European
+ {\TeX} Conference",
+ year = 1992,
+ editor = "Ji{\v{r}}{\'\i} Zlatu{\v{s}}ka",
+ organization = "Czechoslovak {\TeX} Users Group",
+ address = "Prague, Czechoslovakia",
+ month = sep
+}
+
+% Kit.
+@Misc{R92:Xy-pic,
+ author = "Kristoffer H. Rose",
+ title = "{\Xy}-pic, version 2.6",
+ year = 1992,
+ howpublished = "computer software kit",
+ note = "includes User's Manual~\cite{R92:TypesettingDXUM}"
+}
+
+@InProceedings{R92:TypesettingDXUM,
+ author = "Kristoffer H. Rose",
+ title = "Typesetting Diagrams with {\Xy}-pic: User's Manual",
+ pages = "273-292",
+ booktitle = "{Euro\TeX~'92}---Proceedings of the 7th European
+ {\TeX} Conference",
+ year = 1992,
+ editor = "Ji{\v{r}}{\'\i} Zlatu{\v{s}}ka",
+ organization = "Czechoslovak {\TeX} Users Group",
+ address = "Prague, Czechoslovakia",
+ month = sep
+}
+
+@Misc{R92:ExercisesX,
+ author = "Kristoffer H. Rose",
+ title = "Exercises in {\Xy}-pic",
+ howpublished = "Handout at tutorial given at {Euro\TeX~'92}",
+ year = 1992,
+ month = sep,
+ note = "Available by anonymous ftp in {\tt ftp.diku.dk:
+ /diku\slash users\slash kris\slash TeX\slash
+ Obsolete\slash xypicex.ps.Z}"
+}
+
+@Misc{R92:xypic.doc,
+ author = "Kristoffer H. Rose",
+ title = "{\Xy}-pic Macros: Technical Documentation",
+ howpublished = "{\tt xypic.doc} of the {\Xy}-pic version 2.6 release",
+ year = 1992,
+ month = oct
+}
+
+@TechReport{H91:Xy-picTGDT,
+ author = "Kristoffer H. Holm",
+ title = "{\Xy}-pic: Typesetting Graphs and Diagrams with {\TeX}",
+ institution = DIKU,
+ year = 1991,
+ type = "Student report",
+ number = "91--7--10",
+ address = "Universitets\-parken 1, {DK}-2100 K\o{}ben\-havn \O",
+ month = jul,
+ note = "Obsolete"
+}
+
+@Misc{R91:xy.doc,
+ author = "Kristoffer H. Rose",
+ title = "{\Xy}-pic Macros: Technical Documentation",
+ howpublished = "{\tt xy.doc} of the $\beta$-release of the
+ {\Xy}-pic package",
+ year = 1991,
+ month = nov,
+ note = "Obsolete"
+}
+
+@Unpublished{HD90:DrawingGD,
+ author = "Kristoffer H. Holm and Hans Dybkj\ae{}r",
+ title = "Drawing Graphs and Diagrams",
+ note = "Documents the obsolete {\tt graphs} macros",
+ year = 1990,
+ month = sep
+}
+
+%
+% TeX RELATED REFERENCES, SORTED BY AUTHOR.
+
+@Manual{AMS95:AMS-LaTeX,
+ title = "{\AMS}-{\LaTeX} Version 1.2 User's Guide",
+ organization = "American Mathematical Society",
+ edition = "1.2b",
+ year = 1995,
+ month = jan
+}
+
+@Manual{AMS94:AMS-LaTeX,
+ title = "{\AMS}-{\LaTeX} Version 1.2 User's Guide",
+ organization = "American Mathematical Society",
+ edition = "1.2",
+ year = 1994,
+ month = oct
+}
+
+@Manual{AMS91:AMS-LaTeX,
+ title = "{\AMS}-{\LaTeX} Version 1.1 User's Guide",
+ organization = "American Mathematical Society",
+ edition = "1.1",
+ year = 1991
+}
+
+@Manual{B:DiagramM,
+ title = "The Diagram Macros",
+ author = "Michael Barr",
+ note = "Available by anonymous ftp from {\tt
+ triples.math.mcgill.ca:\-/pub/texmacros/diagdoc.tex}"
+}
+
+@Manual{B:UsersGD3,
+ title = "User's Guide for Diagram 3",
+ author = "Francis Borceux",
+ address = "{L}ouvain-la-{N}euve",
+ note = "Available from the author, borceux@agel.ucl.ac.be"
+}
+
+@Manual{B94:ExpandedPT,
+ title = "Expanded plain {\TeX}",
+ author = "Karl Berry",
+ edition = "version 2.6",
+ year = 1994,
+ month = may,
+ note = "Available for anonymous ftp from CTAN in {\tt
+ macros\slash eplain\slash doc}."
+}
+
+@Book{GMS94:LaTeXC,
+ author = "Michel Goossens and Frank Mittelbach and Alexander Samarin",
+ title = "The {\LaTeX} Companion",
+ publisher = A-W,
+ year = 1994
+}
+
+@article{HO87:TypesettingCSFTFT,
+ author = "Roswitha T. Haas and Kevin C. O'Kane",
+ title = "Typesetting Chemical Structure Formulas with the Text
+ Formatter \TeX/\LaTeX",
+journal = "Computers \& Chemistry",
+ year = 1987,
+ volume = 11,
+ number = 4,
+ pages = "251-271"
+}
+
+@Article{K82:PIC-LTG,
+ author = "Brian W. Kernighan",
+ title = "{PIC}---A Language for Typesetting Graphics",
+ journal = spe,
+ year = 1982,
+ volume = 12,
+ number = 1,
+ pages = "1-21"
+}
+
+@Manual{KC:eqn,
+ title = "Typesetting Mathematics -- User's Guide",
+ author = "B. W. Kernighan and L. L. Cherry",
+ organization = "Bell labs"
+}
+
+@TechReport{K91:PIC-GLT,
+ author = "Brian W. Kernighan",
+ title = "{PIC}---A Graphics Language for Typesetting",
+ institution = "{AT\&T} Bell Laboratories",
+ year = 1991,
+ type = "Computing Science Technical Report",
+ number = 116,
+ address = "Murray Hill, New Jersey 07974",
+ month = may
+}
+
+@Book{K84:TeXbook,
+ author = "Donald E. Knuth",
+ title = "The {\TeX}book",
+ publisher = A-W,
+ year = 1984
+}
+
+@Book{K86:ComputerMT,
+ author = "Donald E. Knuth",
+ title = "Computer Modern Typefaces",
+ publisher = A-W,
+ year = 1986,
+ volume = "A",
+ series = "Computers \& Typesetting"
+}
+
+@Book{K86:MFbook,
+ author = "Donald E. Knuth",
+ title = "The {\MF}book",
+ publisher = A-W,
+ year = 1986
+}
+
+@Manual{K88:EEPIC,
+ title = "{EEPIC} -- Extensions to epic and {\LaTeX} Picture
+ Environment 1.1",
+ author = "Conrad Kwok",
+ organization = "Dept. of Electrical Engineering and Computer
+ Science, University of California, Davis",
+ year = 1988,
+ month = feb
+}
+
+@Book{L86:LaTeX,
+ author = "Leslie Lamport",
+ title = "{\LaTeX}---A Document Preparation System",
+ publisher = A-W,
+ year = 1986
+}
+
+@Book{L94:LaTeX,
+ author = "Leslie Lamport",
+ title = "{\LaTeX}---A Document Preparation System",
+ publisher = A-W,
+ year = 1994,
+ edition = "2nd"
+}
+
+@Misc{L88:latex.tex,
+ author = "Leslie Lamport",
+ title = "{\LaTeX} Version 2.09",
+ howpublished = "{\tt latex.tex} of {\LaTeX} distribution",
+ year = 1988,
+ month = aug
+}
+
+@Manual{L88:FeynmanLRGFD,
+ title = "A {\LaTeX} Routine for Generating feynman Diagrams",
+ author = "Michael Levine",
+ edition = "1.0",
+ year = 1988,
+ month = oct,
+ OPTnote = "{CTAN} {\tt macros/\-latex/\-contrib\slash \-feynman}"
+}
+
+@Article{N60:ReportALA60,
+ author = "P. Naur and others",
+ title = "Report on the Algorithmic Language {ALGOL} 60",
+ journal = cacm,
+ year = 1960,
+ volume = 3,
+ pages = "299-314"
+}
+
+@Manual{O79:NROFF/TROFFUM,
+ title = "{NROFF/TROFF} User's Manual",
+ author = "J. F. Osanna",
+ organization = "Bell Laboratories",
+ address = "Murray Hill, N.J.",
+ year = 1979
+}
+
+@TechReport{P86:EnhancementsPEL,
+ author = "Sunil Podar",
+ title = "Enhancements to the Picture Environment of {\LaTeX}",
+ institution = "Dept. of Computer Science, S.U.N.Y. at Stony Brook",
+ year = 1986,
+ number = "86-17",
+ month = jul
+}
+
+@Manual{ps,
+ title = "PostScript Language Reference Manual",
+ organization = "Adobe Systems Incorporated",
+ edition = "second",
+ year = 1990
+}
+
+@Manual{R87:UsersMDM,
+ title = "User's Manual for Diagram Macros",
+ author = "John Reynolds",
+ year = 1987,
+ month = dec,
+ note = "Available by anonymous ftp from {\tt e.ergo.cs.cmu.edu}"
+}
+
+@Manual{dvips,
+ title = "{DVIPS}: A {\TeX} Driver",
+ author = "Tomas Rokicki",
+ note = "Distributed with the dvips program found on CTAN archives"
+}
+
+@Manual{textures,
+ title = "Textures User's Guide",
+ organization = "Blue Sky Research",
+ address = "Portland, Oregon",
+ year = 1988,
+ month = dec
+}
+
+@Book{S82:JoyT,
+ author = "Michael D. Spivak",
+ title = "The Joy of {\TeX}---A Gourmet Guide to Typesetting
+ with the {\AMS-\TeX} Macro Package",
+ publisher = A-W,
+ year = 1982
+}
+
+@Book{S90:JoyT,
+ author = "Michael D. Spivak",
+ title = "The Joy of {\TeX}---A Gourmet Guide to Typesetting
+ with the {\AMS-\TeX} Macro Package",
+ edition = "second",
+ publisher = AMS,
+ year = 1990
+}
+
+@Misc{TWG-TDS,
+ key = "TWG-TDS-0.98",
+ author = "TUG Working Group TWG-TDS",
+ title = "A Directory Structure for {\TeX} Files version 0.98",
+ howpublished = "URL",
+ year = 1995,
+ month = may,
+ note = "Available with URL {ftp:/\kern-1pt\slash
+ jasper.ora.com\slash pub\slash twg-tds/}"
+}
+
+@Manual{T93:OzTeXUG,
+ title = "{\OzTeX} User's Guide",
+ author = "Andrew Trevorrow",
+ address = "19 Abbot Lane, North Adelaide 5006, Australia",
+ edition = "1.6",
+ year = 1993,
+ month = jul
+}
+
+@Manual{T90:CommutativeDT,
+ title = "Commutative Diagrams in {\TeX}",
+ author = "Paul Taylor",
+ organization = "Department of Computing, Imperial College",
+ address = "180 Queens Gate, London SW7 2BZ",
+ year = 1990,
+ month = jul
+}
+
+@Manual{T93:CommutativeDTV4,
+ title = "Commutative Diagrams in {\TeX} (version 4)",
+ author = "Paul Taylor",
+ organization = "Department of Computing, Imperial College",
+ address = "180 Queens Gate, London SW7 2BZ",
+ year = 1993,
+ month = jan
+}
+
+@Manual{W86:PiCTeXM,
+ title = "The {\PiCTeX} Manual",
+ author = "Michael J. Wichura",
+ organization = "University of Washington",
+ year = 1987
+}
+
+@Misc{W87:pictex.tex,
+ author = "Michael J. Wichura",
+ title = "{\PiCTeX}, Version 1.1",
+ howpublished = "{\tt pictex.tex} of {\PiCTeX} distribution",
+ year = 1987,
+ month = sep
+}
+
+% $Log: xydoc.bib,v $
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.4 1997/05/28 13:02:24 krisrose
+% Fixed missing breaks bug.
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/06 02:56:02 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% Name changed from xypicman.bib to xydoc.bib.
+%
+% Revision 2.6.1.1 1992/07/01 07:08:24 kris
+% Send to EuroTeX '92...
+%
+% Revision 2.6 1992/06/24 01:23:34 kris
+% Unchanged from xy.bib v.2.5.
+%
+% Revision 2.1 1992/01/02 14:54:07 kris
+% Release version.
+%
+% Revision 1.4 1991/11/27 06:44:34 kris
+% Fits \beta-test on DIKU.
+%
+% Revision 1.3 1991/08/23 01:05:45 kris
+% Tidied up; fits report.tex[1.28].
+%
+% Revision 1.2 1991/08/05 04:02:12 kris
+% As used in student report 91-7-10.
+%
+% Revision 1.1 91/07/23 14:49:06 kris
+% Fits report.tex[1.5].
diff --git a/Master/texmf-dist/source/generic/xypic/xydoc.sty b/Master/texmf-dist/source/generic/xypic/xydoc.sty
new file mode 100644
index 00000000000..0d5bb0c7a69
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydoc.sty
@@ -0,0 +1,1270 @@
+%% $Id: xydoc.sty,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Style for Xy-pic documentation under LaTeX.
+%% Copyright (c) 1993-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Since the documentation files may have Danish ISO Characters...
+
+\input{latin1.sty}
+
+% We use two and three columns (see with \INDEX command)...
+
+\RequirePackage{multicol}
+
+% ACTIVE CHARACTERS: "<|? are active (set before loading Xy-pic to make the
+% parsing work)...and redefine LaTeX \dospecials at the same time but do NOT
+% tell it to redefine ? because we want to use that in code!
+
+\catcode`\"=\active
+\let"=\relax
+\catcode`\<=\active
+\let<=\relax
+\catcode`\|=\active
+\let|=\relax
+\catcode`\?=\active
+\let?=\relax
+
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&\do\#\do\^\do\_\do\%\do\~\do\"\do\<\do\|}
+
+%\catcode9=10
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% LOAD Xy-pic...
+
+\makeatother
+
+\input xy
+\xyoption{all}
+\xyoption{knot}
+\xyoption{2cell}
+\xyoption{poly}
+\xyoption{web}
+\xyoption{arc}
+\input xydoc.back
+\CompileMatrices
+\UseCrayolaColors
+
+\xycatcodes \catcode`\"=12 \catcode`\<=12 \catcode`\|=12 \catcode`\?=12
+\def\next{\RequirePackage[draft,dvips]{graphics}} % hack :-)
+
+\ifx\xydvipsloaded\undefined
+ \ifx\xytexturesloaded\undefined
+ \else\def\next{\RequirePackage[textures]{graphics}}\fi
+\else\def\next{\RequirePackage[dvips]{graphics}}\fi
+\next
+
+\xycatcodes \catcode`\"=\active \catcode`\<=\active \catcode`\|=\active
+ \catcode`\?=\active
+\xyuncatcodes\makeatletter % be paranoid
+
+\def\PStest#1#2{\ifx\empty\whichPSspecials@#1\else#2\fi}
+\def\PStype{\dvitype@\unskip}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% TIME OF DAY
+
+\count@=\time \divide\count@ by 60\relax
+\count@@=\count@ \multiply\count@@ by -60 \advance\count@@ by \time
+\edef\now{\number\count@:\ifnum 10>\count@@ 0\fi \number\count@@}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% LOGOS: METAFONT logo uses the logo10 font; AMS logo uses the math
+% italic font; and others just use the default fonts.
+
+\font\logofont=logo10
+\def\MF{{\logofont META}\-{\logofont FONT}}
+\def\AMS{{\the\textfont2 A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
+\def\PiCTeX{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC\kern-.11em\TeX}
+\def\LaTeXe{{\LaTeX\kern.15em$2_{\textstyle\varepsilon}$}}
+\def\OzTeX{{O\kern-.03em z\kern-.15em\TeX}}
+\def\Textures{{\sc Textures}}
+\def\dvips{{\sc dvips}}
+\def\TPIC{{\sc tpic}}
+\def\xdvi{{\sc xdvi}}
+\def\dvitops{{\sc dvitops}}
+
+%...and PS, unix, and BNF with footnote inserted at the first use...
+
+\newif\ifPSuntold \PSuntoldtrue
+\def\PS{\protect\PS@}
+\def\PS@{{\sc Post\-Script}\xyFN@\PS@i}
+\def\PS@i{\let\next@=\PS@ii
+ \ifx.\next \else\ifx,\next \else\ifx:\next \else\ifx;\next \else\ifx!\next
+ \else\ifx?\next \else \let\next@=\PS@iii \fi\fi\fi\fi\fi\fi \next@}
+\def\PS@ii#1{#1\PS@iii}
+\def\PS@iii{%
+ \ifPSuntold \global\PSuntoldfalse
+ \footnote{{\sc Post\-Script} is a registered Trademark of Adobe,
+ Inc.~\cite{ps}.}%
+ \fi}
+
+\newif\ifunixuntold \unixuntoldtrue
+\def\unix{\protect\unix@}
+\def\unix@{{\sc unix}\xyFN@\unix@i}
+\def\unix@i{\let\next@=\unix@ii
+ \ifx.\next \else\ifx,\next \else\ifx:\next \else\ifx;\next \else\ifx!\next
+ \else\ifx?\next \else \let\next@=\unix@iii \fi\fi\fi\fi\fi\fi \next@}
+\def\unix@ii#1{#1\unix@iii}
+\def\unix@iii{%
+ \ifunixuntold \global\unixuntoldfalse
+ \footnote{{\sc Unix} is a trademark of Bell Labs.}%
+ \fi}
+
+\newif\ifBNFuntold \BNFuntoldtrue
+\def\BNF{{\footnotesize BNF}%
+ \ifBNFuntold \global\BNFuntoldfalse
+ \footnote{{\footnotesize BNF} is the notation for ``meta-linguistic
+ formulae'' first used by \cite{N60:ReportALA60} to describe the
+ syntax of the Algol programming language. We use it with the
+ conventions of the \TeX\-book~\cite{K84:TeXbook}: `\iss' is read ``is
+ defined to be'', `\orr' is read ``or'', and `<empty>' denotes
+ ``nothing''; furthermore, `<id>' denotes anything that expands into a
+ sequence of \TeX\ character tokens, `<dimen>' and `<factor>' denote
+ decimal numbers with, respective without, a dimension unit (like {\tt
+ pt} and {\tt mm}), <number> denotes possibly signed integers, and
+ <text> denotes \TeX\ text to be typeset in the
+ appropriate mode. We have chosen to annotate the syntax with brief
+ explanations of the `action' associated with each rule; here
+ `$\from$' should be read `is copied from'.}%
+ \fi}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% `OTHER' CHARACTERS: miscellaneous characters of category `other' ... it is
+% essential that space is done last!
+
+\begingroup
+ \catcode`\"=12 \gdef\dq{"}
+ \catcode`\<=12 \gdef\otherless{<}
+ \catcode`\>=12 \gdef\othergreater{>}
+ \catcode`\|=12 \gdef\otherbar{|}
+ \catcode`\@=12 \gdef\otherat{@}
+ \catcode`\|=0 \catcode`\<=1 \catcode`\>=2
+ |catcode`|\=12 |gdef|otherescape<\>
+ |catcode`|{=12 |gdef|otherbgroup<{>
+ |catcode`|}=12 |gdef|otheregroup<}>
+ |catcode`|$=12 |gdef|othermath<$>
+ |catcode`|&=12 |gdef|otherand<&>
+ |catcode`|#=12 |gdef|otherparameter<#>
+ |catcode`|^=12 |gdef|othersuper<^>
+ |catcode`|_=12 |gdef|othersub<_>
+ |catcode`|%=12 |gdef|othercomment<%>
+ |catcode`| =12|gdef|otherspace< >|endgroup
+
+\def\ordinarybars{\catcode`\|=12}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% ABBREVIATIONS:
+
+\def\ie{{\it i}.{\it e}.} \def\Eg{{\it E}.{\it g}.}
+\def\eg{{\it e}.{\it g}.} \def\Ie{{\it I}.{\it e}.}
+\def\cf{{\it cf}.} \def\Cf{{\it Cf}.}
+\def\aka{{\it aka\/}}
+\def\etc{{\it etc}.}
+
+% LOCAL DEFINITIONS...
+%
+% \RSN, \TODO, and \DRAFT used wherever something is NOT FINISHED.
+%
+\def\RSN{Real Soon Now}
+\def\TODO#1{{\bf To Do#1}}
+\def\BUG#1{{\bf Bug#1}}
+\def\NOTE#1{{\bf Note#1}}
+\def\HACK#1{{\bf Hack#1}}
+\def\REMARK#1{{\bf Remark#1}}
+\def\DRAFT#1{\framebox{\it Draft #1}\vrule width0pt height 2em depth 1em\relax}
+
+\def\smiley{\hbox{\rlap{$\bigcirc$}\kern1.3\p@$\scriptstyle\ddot\smile$}}
+\def\frowny{\hbox{\rlap{$\bigcirc$}\kern1.3\p@$\scriptstyle\ddot\frown$}}
+\def\half{{\slashedfrac12}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% HTML generation stuff.
+
+\RequirePackage{html}
+
+\let\DEF=\def
+\let\IMG=\relax
+\newenvironment{IMAGE}{}{}
+\newenvironment{CENTER}{}{\noindent\unskip\ignorespaces}
+
+%% Pretty hyperlinks :-)
+
+{\makeatletter
+ \catcode`\~=\active \catcode`\/=\active \catcode`\_=\active
+ \gdef\setupurl@{%
+ \catcode`\~=\active \def~{\ensuremath{\sim}}%
+ \catcode`\&=12 %
+ \catcode`\_=\active \def_{\ensuremath{\sb-}}%
+ \catcode`\/=\active \def/{\futurelet\next\urlslash@}}
+ \gdef\url{\begingroup $\langle$\nobreak\textsc{url}:
+ \setupurl@\futurelet\next\url@}
+ \gdef\url@#1{\emph{#1}\nobreak$\rangle$\endgroup}
+ \gdef\urlslash@{\ifx /\next \def\next@/{\string/\kern-.2em\string/}%
+ \else \def\next@{\slash}\fi \next@}
+ \gdef\newurl#1#{\begingroup\setupurl@\newurl@{#1}}
+ \gdef\newurl@#1#2{\gdef#1{\url{#2}}\endgroup}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% EMPHASISING:
+
+\def"#1"{{\relax \ifmmode \mathchoice
+ {\hbox{\normalsize\it\relax#1\/}}%
+ {\hbox{\normalsize\it\relax#1\/}}%
+ {\hbox{\scriptsize\it\relax#1\/}}%
+ {\hbox{\scriptsize\it\relax#1\/}}%
+ \else\it#1\/\fi}}
+
+% Special `Notes' enumeration.
+
+\newcounter{note}
+\def\thenote{\thesection\alph{note}}
+\newif\ifnotes@
+
+\def\notescontd{\ifnotes@ \@toodeep \fi \notes@true
+ \subsubsection*{Notes}\nobreak\list{\thenote.}%
+ {\leftmargin=1.5pc \labelwidth=1pc \labelsep=.5pc
+ \usecounter{note}%
+ \def\makelabel##1{\thenote.\hss}}%
+ \expandafter\c@note\notescount@@}
+\def\endnotescontd{\xdef\notescount@@{\the\c@note}\endlist}
+
+\def\notes{\xdef\notescount@@{0}\notescontd}
+\let\note=\item
+\let\endnotes=\endnotescontd
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% DOCUMENT CLASSIFICATION...
+
+% Some options may prefer a ``\BIBLIOGRAPHY'' different from xydoc.bib in
+% plain style!
+
+\def\BIBLIOGRAPHY{%
+ \bibliographystyle{plain}
+ \bibliography{xydoc}
+ \addtocontents{toc}{%
+ \protect\contentsline{section}{References}{\protect\pageref{BIBLIOGRAPHY}}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% GENERIC MATH:
+
+\mathchardef\lt=\dq 313C
+\mathchardef\gt=\dq 313E
+\mathchardef\from=\dq 3220
+\mathcode`\*=\dq 2202
+\def\abs#1{\left\vert#1\right\vert}
+\def\sgn{\hbox{sgn}}
+\def\floor#1{\left\lfloor#1\right\rfloor}
+\def\ceil#1{\left\lceil#1\right\rceil}
+\def\Det#1{\left\otherbar
+ {\arraycolsep=.2em \begin{array}{cc}#1\end{array}}\right\otherbar}
+
+% Some LaTeXs don't have this:
+\newbox\Boxbox@
+\setbox\Boxbox@=\hbox{\vrule height 5pt depth 0pt width .4pt %
+ \rlap{\vrule height 5pt depth -4.6pt width 4.2pt}%
+ \vrule height .4pt depth 0pt width 4.2pt %
+ \vrule height 5pt depth 0pt width .4pt}
+\def\Box{\relax\ifmmode\expandafter\vcenter\fi{\copy\Boxbox@}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% BNF:
+
+{\setboxz@h{$^{\hbox{\small0}}$}%
+ \xdef\histrut{\hbox{\vrule height\the\ht0 depth\the\dp0 width\z@}}}
+
+\def<#1>{\relax\ifmmode\histrut\expandafter\textrm\fi
+ {\rm$\langle${\ignorespaces#1}$\rangle$}}
+\def\iss{\relax
+ \ifmmode\histrut\expandafter\mathrel\fi{\hbox{$\longrightarrow$}}}
+\def\orr{\relax\ifmmode\histrut\expandafter\mathrel\fi{\hbox{$~\vert~$}}}
+
+\def\star{\hbox{*}}
+\def\plus{\ensuremath{^+}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% SHOULD USE \parbox...
+
+\leftmargin=0pt % LaTeX hack...
+
+\newenvironment{syntax}%
+{$$\tabskip=.5em plus1fil \dimen@=\hsize \advance\dimen@-\leftmargin
+ \halign to\dimen@\bgroup
+ \strut##\unskip\hfil&\hfil##\hfil
+ &##\hfil&\hsize=.5\hsize\vtop{\noindent##}\hfil\cr
+ \noalign{\nobreak\hrule\nobreak\smallskip}%
+ \multispan{3}Syntax\hfil &Action \cr
+ \noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}}%
+{\crcr\noalign{\nobreak\smallskip\nobreak\hrule\nobreak}\egroup$$%
+ \ignorespaces}
+
+\def\topofdefs{\hrule\nobreak\smallskip}
+\def\bottomofdefs{\nobreak\smallskip\nobreak\hrule\nobreak}
+
+\newenvironment{defs}%
+{$$\tabskip=.5em plus1fil \dimen@=\hsize \advance\dimen@-\leftmargin
+ \halign to\dimen@\bgroup \strut##\unskip\hfil
+ \tabskip=.5em&\hsize=.5\hsize\vtop{\noindent##}\hfil
+ \tabskip=.5em plus1fil\cr
+ \noalign{\topofdefs}}%
+{\crcr\noalign{\bottomofdefs}\egroup$$\ignorespaces}
+
+\newenvironment{defs1}%
+{$$\tabskip=.5em plus1fil \dimen@=\hsize \advance\dimen@-\leftmargin
+ \halign to\dimen@\bgroup \strut##\unskip\hfil\cr
+ \noalign{\topofdefs}}%
+{\crcr\noalign{\bottomofdefs}\egroup$$\ignorespaces}
+
+\newenvironment{unformatteddefs}%
+{\vspace{\bigskipamount}\topofdefs}%
+{\bottomofdefs\vspace{\bigskipamount}\ignorespaces}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% INLINE VERBATIM: use |...| with || in ... for a single |. Almost not
+% ``fragile'' in the LaTeX sense: the ... must be a balanced token list when
+% ``moving'' and control sequences get an extra space except at the end...
+
+\newcount\barnest@
+
+\def|{\leavevmode\hbox\bgroup \global\barnest@=\z@
+ \tt \let\do\@makeother\dospecials \frenchspacing
+ \xyFN@\bar@}
+
+\def\cs#1{\texttt{\otherescape#1}}
+
+% Hack: we need to cater for both ordinary spaces (\space@) and space `other'
+% tokens (\otherspace)...all become simple spaces.
+
+\def\bar@{\ifx |\next \let\next@=\bar@x
+ \else\expandafter\ifx\otherbar\next \let\next@=\bar@x
+ \else\ifx \space@\next \expandafter\DN@\space{\space@\xyFN@\bar@}%
+ \else\expandafter\ifx \otherspace\next
+ \expandafter\DN@\otherspace{\space@\xyFN@\bar@}%
+ \else
+ \ifx \bgroup\next \global\advance\barnest@\@ne \fi
+ \ifx \egroup\next \global\advance\barnest@\m@ne \fi
+ \DN@{\expandafter\bar@@\string}%
+ \fi\fi\fi\fi \next@}
+\def\bar@@#1{#1\xyFN@\bar@}
+
+\def\bar@x#1{\egroup
+ \ifnum\z@=\barnest@\else \W@{Warning: Unbalanced \string|TEXT\string| where
+ \string{\string}-count is \the\barnest@}\fi
+ \xyFN@\rebar@}
+
+\def\rebar@{\ifx |\next \hbox{\tt\char124}\fi}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% INLINE AND DISPLAYED TeX CODE:
+
+\newwrite\thecode@
+
+% Making the chunk is the most work...it goes into a temporary file that
+% lives while the chunk lives.
+
+\newenvironment{code}{%
+ \begingroup \aftergroup\endcode@
+ \immediate\openout\thecode@=\jobname.tmp %
+ \let\do\@makeother\dospecials \endlinechar=10 \futurelet\next\code@}{}
+\def\endcode@{\immediate\closeout\thecode@}
+
+% \code@* is the where the dirty work is done: it is called for each line in
+% the code chunk under construction and will finish it if that line contains
+% *exactly* "\end{code}".
+
+{\lccode`\0=`\\\lccode`\[=`\{\lccode`\]=`\}\lowercase{%
+ \expandafter\gdef\expandafter\code@\space{\code@i}
+ \gdef\code@i#1^^J{\code@ii#10end[code]\code@@}
+ \gdef\code@ii#10end[code]#2\code@@{\def\1{#1}\def\2{#2}%
+ \ifx\2\empty \immediate\write\thecode@{\codeof\1}\let\next@=\code@i
+ \else \def\next@{\oldcodes@\endgroup\end{code}}%
+ \fi \next@}}}
+
+\def\oldcodes@{\catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\#=6 %
+ \catcode`\%=14\relax}
+
+% Setting the code is just reading it...
+
+\def\gdocode{\expandafter\@@input\jobname.tmp \ifhmode\unskip\fi}
+
+\newcount\frozeninputlineno % hack to keep right file/lineno...
+
+\ifx\inputlineno\undefined
+ \def\docode{\unskip{\gdocode}}
+\else
+\def\docode{\unskip{\frozeninputlineno=\inputlineno
+ \let\@@inputlineno=\inputlineno
+ \def\inputlineno{\frozeninputlineno:\the\@@inputlineno}%
+ \gdocode}}
+\fi
+
+% Showing the code is just putting TeX in verbatim mode before reading.
+
+\def\thecode{{\catcode``=13 \@noligs \let\do\@makeother \dospecials
+ \catcode`\ =10 \let\par\space\obeylines \frenchspacing \tt
+ \input\jobname.tmp \unskip}}
+
+\def\displaycode{{\inputdoc.{\jobname.tmp}}%
+ \ignorespaces}
+
+% Writing the code to a(nother) file is a simple combination of \code and
+% \showcode.
+
+\def\writecode#1{{\let\do\@makeother\dospecials \endlinechar=10 %
+ \def\next@{\immediate\write#1}\expandafter\writecode@\@@input\jobname.tmp }}
+
+\def\writecode@{\futurelet\next\writecode@i}
+\def\writecode@i{\ifx\next\egroup\else \expandafter\writecode@ii \fi}
+\def\writecode@ii#1^^J{\def\1{#1}\next@{\codeof\1}\futurelet\next\writecode@}
+
+\def\writecodecode#1{%
+ \immediate\write#1{\string\begin\string{code\string}}%
+ \writecode#1%
+ \immediate\write#1{\string\end\string{code\string}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% EXERCISES & ANSWERS: accumulated as subsubsections on .ans file...
+
+\newif\ifExercises \Exercisesfalse
+\newwrite\answ@
+
+\AtBeginDocument{%
+ \immediate\openout\answ@=\jobname.ans
+ \immediate\write\answ@{\othercomment\space\jobname.ans: \today, \now.}
+}
+
+\def\exerciseprefix{}
+\newcount\exercisenumber \exercisenumber=0
+\def\restartexercises#1{\edef\exerciseprefix{#1}\exercisenumber=0 }
+
+\newenvironment{exercise}{\global\Exercisestrue
+ \global\advance\exercisenumber by 1 %
+ \edef\@currentlabel{\the\exercisenumber}%
+ \edef\next@{\noexpand\label{Exercise-\exerciseprefix\the\exercisenumber}}%
+ \next@
+ \paragraph*{Exercise~\exerciseprefix\the\exercisenumber:}\begingroup
+ \def\IW@##1{\immediate\write\answ@{##1}}\IW@{}%
+ \IW@{\otherescape xyuncatcodes}%
+ \IW@{\otherescape paragraph*{Answer to exercise
+ \exerciseprefix\the\exercisenumber\space
+ (p.\string\pageref{Exercise-\exerciseprefix\the\exercisenumber}):}%
+ \string\label{Answer-\exerciseprefix\the\exercisenumber}}%
+ \IW@{\othercomment}}%
+ {\IW@{}\endgroup}
+
+\def\answertext#1{{\DN@{#1}\DNii@##1:->##2<-:{{\IW@{##2}}}%
+ \expandafter\nextii@\meaning\next@<-:}}
+
+\def\answercode{\writecodecode\answ@}
+\def\answerdisplaycode{\answertext\displaycode}
+
+\def\Answers{\ifExercises \Exercisesfalse \global\count1=\z@
+ \def\next{\immediate\closeout\answ@ \input\jobname.ans}%
+ \expandafter\next\fi}
+
+\def\ANSWERS{\ifExercises
+ \section{Answers to all exercises}
+ \Answers
+ \immediate\openout\answ@=\jobname.ans
+ \immediate\write\answ@{\othercomment\space\jobname.ans: \today, \now.}
+\fi}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% PRINTING MACRO FILES AS DOCUMENTATION
+
+% \inputdoc <type> {<file>} will read <file>.doc, extracting either
+
+% * a verbatim input file with line numbers if <type> is 0 (ignoring \DOCMODE
+% commands in the file),
+% * the reference manual body if <type> is the character 1, or
+% * the TeXnical documentation body if <type> is the character 2.
+
+% For the second and third types to work, <file>.doc must have the structure
+
+% <header>
+% \DOCMODE<mode>
+% <stuff>
+% \DOCMODE<mode>
+% <stuff>
+% :
+% :
+% \DOCMODE3
+% <stuff>
+
+% where each <mode> can be either of the characters
+
+% 0 to designate that the following <stuff> should be ignored,
+
+% 1 to designate that the following <stuff> is TeX source material to
+% be included only in the reference manual,
+
+% 2 to designate that the following <stuff> is TeX source material to
+% be included only in the TeXnical documentation,
+
+% 3 to designate that the following <stuff> is TeX source material to
+% be included in the reference manual and the TeXnical document,
+
+% . for unnumbered program file listing
+% : for numbered program file listing
+
+% ! for stuff in the same mode as the context
+
+% ( to designate that the following <stuff> is code that is included in
+% <file>.tex that should also be typeset verbatim in the TeXnical document,
+% or
+
+% ) to designate that the following <stuff> is of the same kind as the
+% <stuff> preceeding the most recent \DOCMODE).
+
+% Furthermore, the command \DOCHEADER is available after the first \DOCMODE2
+% command to insert the <header> verbatim. The last command must be
+% \DOCMODE3 in order to ensure that the end of the file is seen by both
+% document types!
+
+% Finally the reference PREFIX is set to the file name so that `global'
+% references across files are possible...
+
+% The <file>.tex to be distributed should include the <header> and all
+% <stuff> between \DOCMODE( and \DOCMODE).
+
+\let\thedocmode@=0
+
+% Default is for reference documentation...
+
+\let\originalxyprovide=\xyprovide
+\let\originalcurrentxydriver=\currentxydriver
+
+\def\specialxyprovide#1#2#3#4#5#6{%
+ \let\xyprovide=\originalxyprovide
+ \edef\OPROPER{#2}\edef\OVERSION{#3}%
+ \def\OAUTHOR{#4}\def\OAUTHOREMAIL{#5}\def\OAUTHORADDRESS{#6}%
+ \def\next{#1}\edef\xyoption@@{\codeof\next}%
+ \expandafter\section\expandafter{\OPREFIX\OPROPER}??g=[#1]%
+ \subsubsection*{\noindent\rlap{\small\bf
+ Vers. \OVERSION\ by~\OAUTHOR\ <\OAUTHOREMAIL>}\LOADAS{#1}}%
+ \DN@##1##2##3##4##5##6##7.{\CompilePrefix{xy##1##2##3##4##5##6}}%
+ \next@#1-000.%
+ \xyprovide{#1}{#2}{#3}{#4}{#5}{#6}}
+
+\def\specialxysubprovide#1#2#3#4#5#6{%
+ \let\xyprovide=\originalxyprovide
+ \edef\OPROPER{#2}\edef\OVERSION{#3}%
+ \def\OAUTHOR{#4}\def\OAUTHOREMAIL{#5}\def\OAUTHORADDRESS{#6}%
+ \def\next{#1}\edef\xyoption@@{\codeof\next}%
+ \expandafter\subsection\expandafter{\OPREFIX\OPROPER}??g=[#1]%
+ \subsubsection*{\noindent\rlap{\small\bf
+ Vers. \OVERSION\ by~\OAUTHOR\ <\OAUTHOREMAIL>}\LOADAS{#1}}%
+ \DN@##1##2##3##4##5##6##7.{\CompilePrefix{xy##1##2##3##4##5##6}}%
+ \next@#1-000.%
+ \xyprovide{#1}{#2}{#3}{#4}{#5}{#6}}
+
+\def\OSECTION#1{\let\xyprovide=\specialxyprovide
+ \def\OPREFIX{}%
+ \def\LOADAS##1{\\*Load as: {\tt\string\xyoption\string{##1\string}}}%
+ \input{#1}\runxywith@ \inputdoc!{#1}}
+
+\def\DSECTION#1{\let\xyprovide=\specialxysubprovide
+ \def\OPREFIX{}%
+ \def\LOADAS##1{\\*Load as: {\tt\string\xyoption\string{##1\string}}}%
+ \let\orignewdriver=\newdriver \let\origxyaddsupport=\xyaddsupport
+ \def\newdriver##1{\orignewdriver{##1}\xyendinput}%
+ \def\xyaddsupport##1##2{\expandafter\xyadddriversupport@\expandafter{%
+ \xyoption@@}{##1}{\ignorespaces}}%
+ \input{#1}%
+ \let\newdriver=\orignewdriver \let\xyaddsupport=\origxyaddsupport
+ \inputdoc!{#1}}
+
+\def\SQUEEZE{}
+
+\def\defaultdocmode@{\docmode@}
+
+% \inputdoc MODE {FILE} loads FILE in docmode MODE. ! means `current'.
+
+\gdef\inputdoc#1#2{%
+ \mayshrinktt@true
+ \if#1!\relax \let\DocMode@=\defaultdocmode@
+ \else\if#10\relax \numbercode@true \let\DocMode@=\docmode@@@
+ \else\if#11\relax \let\DocMode@=\docmode@
+ \else\if#12\relax \let\DocMode@=\docmode@@
+ \else\if#1:\relax \mayshrinktt@false\numbercode@true \let\DocMode@=\docmode@@@
+ \else\if#1.\relax \mayshrinktt@false\numbercode@false\let\DocMode@=\docmode@@@
+ \else\xyerror@{panic...unknown DOCMODE \string?!\string?}{}%
+ \fi\fi\fi\fi\fi\fi
+ {\questprefix{#2}\expandafter\let\csname DOCMODE\endcsname=\DocMode@
+ \endlinechar=`\^^J%
+ \def\next@{\csname DOCMODE\endcsname @}\expandafter\next@\@@input#2 }%
+ \ifmayshrinktt@\medbreak\fi}
+
+\let\^^J=\ % such that `\ ' works at end of line!
+
+% First variant is for the reference manual: ignore everything except lines
+% with MODE 1 or 3.
+
+\let\lastdocmode@=0
+
+\def\docmode@#1{%
+ \ifx#11\let\next@=\relax \let\lastdocmode@=1\relax
+ \else\ifx#12\let\next@=\docs@ \let\lastdocmode@=2\relax
+ \else\ifx#13\let\next@=\relax \let\lastdocmode@=3\relax
+ \else\ifx#1@\let\next@=\docs@
+ \else\ifx#1(\let\next@=\docs@
+ \else\ifx#1)\DN@{\docmode@\lastdocmode@}%
+ \else\let\next@=\docs@ \let\lastdocmode@=0\relax
+ \fi\fi\fi\fi\fi\fi \next@}
+
+% Second variant is for the technical docs: typeset everything normally
+% except areas with MODE ( that are typeset verbatim, areas with MODE 0,
+% and 1 which are ignored, and areas with MODE @ which are stuffed into a
+% file (used for the \DOCHEADER feature):
+
+\def\docmode@@#1{%
+ \ifx#11\let\next@=\docs@ \let\lastdocmode@=1\relax
+ \else\ifx#12\let\next@=\relax \let\lastdocmode@=2\relax
+ \else\ifx#13\let\next@=\relax \let\lastdocmode@=3\relax
+ \else\ifx#1@\let\next@=\docc@
+ \else\ifx#1(\let\next@=\docv@
+ \else\ifx#1)\DN@{\docmode@@\lastdocmode@}%
+ \else\let\next@=\docs@ \let\lastdocmode@=0\relax
+ \fi\fi\fi\fi\fi\fi \next@}
+
+% Third is for verbatim...
+
+\def\docmode@@@#1{\docv@}
+
+% Here are the three interpretation macros: first one that skips...
+
+\def\docs@{%
+ \begingroup\skipspecials@ \let\docm@=\docm@i \let\docecho@=\relax
+ \def\docfinish@{\global\let\thedocmode@=\next
+ \endgroup \xyuncatcodes \csname DOCMODE\endcsname\thedocmode@}%
+ \docm@}
+
+% ..then the one that typesets verbatim: it needs a special hack to be able
+% to recognize the end of files when using \inputdoc0...
+
+\newif\ifnumbercode@ % number lines!
+\def\lineno@{\ifx\inputlineno\undefined\else\the\inputlineno\fi}
+
+\def\docv@{%
+ \par\vspace{1ex}\begingroup \skipspecials@
+ \def\docm@{\xyFN@\docvm@}%
+ \def\docvm@{\ifx\next\egroup \DN@{\endgroup\par\vspace{1ex}}%
+ \else \let\next@\docm@i \fi \next@}%
+ \parfillskip\@flushglue \parskip\z@ \def\par{}\obeylines\tt
+ \catcode``=13 \@noligs \let\do\@makeother\dospecials
+%
+ \catcode`\%=13 %make % act as ?...
+%
+ \frenchspacing\@vobeyspaces \activateTABandFF@
+ \def\docecho@{\ifx\next\empty\vspace{1ex}\else
+ \hbox{%
+ \ifnumbercode@\hbox to 1.5pc{\tinyrm\lineno@\hss}%
+ \else\hbox to\leftmargin{\hss}\fi
+ \setbox0=\hbox\bgroup\next\egroup\box0}\fi}%
+ \def\docfinish@{\global\let\thedocmode@=\next \endgroup
+ \xyuncatcodes \par\vspace{1ex}\csname DOCMODE\endcsname\thedocmode@}%
+ \docm@}
+
+\def\tinyrm{\tiny\rm}
+
+% ...with some trickery to get TABs interpreted right:
+
+\newdimen\tabw@
+
+\def\activeTAB@{\egroup \dimen@=\wdz@
+ \divide\dimen@\tabw@ \multiply\dimen@\tabw@ \advance\dimen@\tabw@
+ \wdz@=\dimen@ \boxz@ \setboxz@h\bgroup}%
+
+\def\activeFF@{\egroup
+ \dimen@=\hsize \advance\dimen@-\wdz@ \advance\dimen@-2pc %
+ \boxz@ \raise.7ex\hbox to\dimen@{\hrulefill}\setboxz@h\bgroup}
+
+% They are activated by \activateTABandFF@ that also picks a \tt font size
+% that will allow 77 characters = 9.7 tabstops per line propvided the
+% conditional mayshrinktt@ is true...
+
+\newif\ifmayshrinktt@
+
+{\catcode`\^^I=\active \catcode`\^^L=\active \let^^L=\par
+ \gdef\activateTABandFF@{\setboxz@h{00000000}\tabw@=\wdz@ \dimen@=\hsize
+ \ifnumbercode@ \advance\dimen@-1.5pc \fi
+ \ifmayshrinktt@
+ \ifdim 9.7\tabw@>\dimen@\small\tt\setboxz@h{00000000}\tabw@=\wdz@\fi
+ \ifdim 9.7\tabw@>\dimen@\footnotesize\tt\setboxz@h{00000000}\tabw@=\wdz@\fi
+ \fi
+ \catcode`\^^I=\active \let^^I=\activeTAB@
+ \catcode`\^^L=\active \let^^L=\activeFF@ }}
+
+% ...and finally one that makes code out of the block:
+
+\def\docc@{%
+ \par\begingroup \skipspecials@ \let\docm@=\docm@i
+ \def\par{}\obeylines \catcode``=13 \@noligs \let\do\@makeother \dospecials
+ \@vobeyspaces \immediate\openout\thecode@=\jobname.tmp %
+ \def\docecho@{{\immediate\write\thecode@{\codeof\next}}}%
+ \def\docfinish@{\immediate\closeout\thecode@ \global\let\thedocmode@=\next
+ \endgroup\xyuncatcodes \csname DOCMODE\endcsname\thedocmode@}%
+ \docm@}
+
+\def\DOCHEADER{%
+ \numbercode@true \inputdoc0{\jobname.tmp}}
+
+% Sic.
+
+\let\W=\W@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% CROSS REFERENCES AND INDEXING AND SUCH
+
+% Use ?? as a cross reference code -- even in verbatim (because ? is excluded
+% from \dospecials in the header):
+
+% ?? <codes> [ <id> ]
+
+% will create a reference and/or label and/or index entry and possibly even
+% typeset <id>---what is done depends on <codes> that should be a sequence of
+% characters selected from the following:
+
+% ! typeset <id>
+% - do nothing*
+
+% : set PREFIX to <id> and do \mylabel{PREFIX:}*
+% = as \mylabel{PREFIX:<id>}*
+
+% ? as \myref{PREFIX:<id>}*
+% ^ \myref{PREFIX:<id>} lifted as superscript*
+% _ \myref{PREFIX:<id>} in \tinyrm font*
+% g global: set PREFIX to null temporarily
+
+% p as \mypageref{PREFIX:<id>}*
+
+% w as \index{<id>} for words
+% c as \index{\string<id>} for control sequences
+% C as \index{[\string<id>]} for modifiers etc
+
+% * as \mylinelabel{<id>}
+
+% If none of the <codes> letters was a *ed one then a \myref{PREFIX:<id>} is
+% added automatically (so ??[<id>] gives a simple reference).
+
+% NOTE: Use VERY PRIVATE names for *everything* because ??s may occur
+% *everywhere* !! Also before loading \Xy-pic because we need to bind ?.
+
+\def?{\relax\let\questchar@=\otherquest@ \futurelet\questnext@\quest@}
+\newif\ifquestdone@
+
+{\catcode`\%=\active
+ \gdef%{\let\questchar@=\otherpercent@ \futurelet\questnext@\quest@}}
+
+{\catcode`\?=12 \catcode`\%=12 \gdef\otherquest@{?}\gdef\otherpercent@{%}}
+
+\def\quest@{\ifx ?\questnext@ \def\questnext@?{\quest@@}%
+ \else \let\questnext@=\questchar@ \fi \questnext@}
+
+\def\quest@@#1[#2]{\relax\questdone@false
+ \let\questref@=\myref \let\questpageref@=\mypageref
+ \let\questecho@@=\relax \def\doquest@##1{{##1{#2}}}\quest@@@#1@}
+
+\def\quest@@@#1{\relax
+ \ifx @#1\def\questnext@{\ifquestdone@\else \doquest@\questref@ \fi}%
+ \else\ifx !#1\def\questnext@{\doquest@\questecho@@ \quest@@@}%
+ \else\ifx -#1\def\questnext@{\questdone@true \quest@@@}%
+ \else\ifx :#1\def\questnext@{\doquest@\questprefix \questdone@true \quest@@@}%
+ \else\ifx =#1\def\questnext@{\doquest@\mylabel \questdone@true \quest@@@}%
+ \else\ifx ?#1\def\questnext@{\doquest@\questref@ \questdone@true \quest@@@}%
+ \else\ifx g#1\def\questnext@{%
+ \let\questref@=\globalref \let\questpageref@=\globalpageref \quest@@@}%
+ \else\ifx ^#1\def\questnext@{\doquest@\liftedref@ \questdone@true \quest@@@}%
+ \else\ifx _#1\def\questnext@{\doquest@\mylineref \questdone@true \quest@@@}%
+ \else\ifx p#1\def\questnext@{\doquest@\questpageref@ \questdone@true
+ \quest@@@}%
+ \else\ifx w#1\def\questnext@{\doquest@\index \questdone@true \quest@@@}%
+ \else\ifx c#1\def\questnext@{\doquest@{\index code}\questdone@true
+ \let\questecho@@=\codeecho@ \quest@@@}%
+ \else\ifx C#1\def\questnext@{\doquest@{\index Code}\questdone@true
+ \let\questecho@@=\Codeecho@ \quest@@@}%
+ \else\ifx *#1\def\questnext@{\doquest@\mylinelabel \questdone@true \quest@@@}%
+ \else \def\questnext@##1{\xyerror@{\string?\string?\string##1 undefined}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \questnext@}
+
+\def\liftedref@#1{$^{\hbox{\small\questref@{#1}}}$}
+
+\def\questprefix#1{\def\questprefix@@{#1}}
+\def\questprefix@@{}
+
+\def\codeecho@#1{\relax
+ \ifmmode\expandafter\hbox\fi{\DN@{#1}\tt\codeof\next@\unskip}}
+
+\def\Codeecho@#1{\relax
+ \ifmmode\expandafter\hbox\fi{\DN@{#1}\tt[\codeof\next@\unskip]}}
+
+% REPLACEMENT for LaTeX cross reference macros...using \codeof...
+
+\def\mylabel#1{\@bsphack \if@filesw {%
+ \expandafter\DN@\expandafter{\questprefix@@:#1}\let\thepage\relax
+ \def\protect{\noexpand\noexpand\noexpand}%
+\xdef\@gtempa{\write\@auxout{\string
+ \newlabel{\codeof\next@}{{\@currentlabel}{\thepage}}}}}\@gtempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+
+\def\mylinelabel#1{\@bsphack \if@filesw {%
+ \expandafter\DN@\expandafter{\questprefix@@:#1}\let\thepage\relax
+ \def\protect{\noexpand\noexpand\noexpand}%
+\xdef\@gtempa{\write\@auxout{\string
+ \newlabel{\codeof\next@}{{l.\thelineno@}{\thepage}}}}}\@gtempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+
+%Was:
+%\def\label#1{\@bsphack\if@filesw {\let\thepage\relax
+% \def\protect{\noexpand\noexpand\noexpand}%
+%\xdef\@gtempa{\write\@auxout{\string
+% \newlabel{#1}{{\@currentlabel}{\thepage}}}}}\@gtempa
+% \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+
+\def\myref#1{\expandafter\globalref\expandafter{\questprefix@@:#1}}
+
+\def\mylineref#1{\hbox{\tinyrm\questref@{#1}}}
+
+\def\globalref#1{\DN@{#1}%
+ \edef\next@{\codeof\next@}%
+ \@ifundefined{r@\next@}{{\bf \string?\string?}%
+ \@warning{Reference `\next@' on page \thepage\space undefined}}%
+ {\edef\@tempa{\@nameuse{r@\next@}}\expandafter
+ \@car\@tempa \@nil\null}}
+
+%Was:
+%\def\ref#1{\@ifundefined{r@#1}{{\bf ??}\@warning
+% {Reference `#1' on page \thepage \space
+% undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter
+% \@car\@tempa \@nil\null}}
+
+\def\mypageref#1{\expandafter\globalpageref\expandafter{\questprefix@@:#1}}
+
+\def\globalpageref#1{\DN@{#1}%
+ \edef\next@{\codeof\next@}%
+ \@ifundefined{r@\next@}{{\bf \string?\string?}%
+ \@warning{Reference `\next@' on page \thepage\space undefined}}%
+ {\edef\@tempa{\@nameuse{r@\next@}}\expandafter
+ \@cdr\@tempa \@nil\null}}
+
+%Was:
+%\def\pageref#1{\@ifundefined{r@#1}{{\bf ??}\@warning
+% {Reference `#1' on page \thepage \space
+% undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter
+% \@cdr\@tempa\@nil\null}}
+
+% \newlabel *is* redefined because LaTeX plays tricks with it at
+% \end{document}.
+
+\def\newlabel#1#2{\DN@{#1}\edef\next@{\codeof\next@}%
+% \@ifundefined{r@\next@}{}{\@warning{Label `#1' multiply defined}}%
+ \global\@namedef{r@\next@}{#2}}
+
+% Was:
+%\def\newlabel#1#2{\@ifundefined{r@#1}{}{\@warning{Label `#1' multiply
+% defined}}\global\@namedef{r@#1}{#2}}
+
+\def\@testdef #1#2#3{\DN@{#2}\edef\next@{\codeof\next@}%
+ \def\@tempa{#3}\expandafter \ifx \csname #1@\next@\endcsname
+ \@tempa \else \@tempswatrue \fi}
+
+% Was:
+%\def\@testdef #1#2#3{\def\@tempa{#3}\expandafter \ifx \csname #1@#2\endcsname
+% \@tempa \else \@tempswatrue \fi}
+
+% Here is our variant \index command: It is a hack...
+
+%Dummy eats pre-{} argument
+\def\index#1#{\@bsphack\begingroup \@sanitize\@index}
+
+%Real stuff uses pre-{} argument
+\def\@wrindex#1#{\csname @wrindex@#1\endcsname}
+
+\def\@wrindex@#1{\let\thepage\relax
+ \DNii@{#1}\edef\nextii@{\codeof\nextii@}\DN@{}%
+ \expandafter\futurelet\expandafter\next\expandafter\quoteidxentry@\nextii@ @%
+ \expandafter\futurelet\expandafter\next\expandafter\@wrindex@beautify\next@\@wrindex@beautify
+ \edef\next@{\codeof\next@}%
+ \edef\@tempa{\write\@indexfile{%
+% \string\indexentry{\expandafter\shavebackslash@\next@
+% \string @\next@}{\thepage}}}%
+ \string\indexentry{\expandafter\shavebackslash@\next@}{\thepage}}}%
+ \expandafter\endgroup\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi \@esphack}
+
+\def\@wrindex@code#1{\let\thepage\relax
+ \DNii@{#1}\edef\nextii@{\codeof\nextii@}\DN@{}%
+ \expandafter\futurelet\expandafter\next\expandafter\quoteidxentry@\nextii@ @%
+ \edef\@tempa{\write\@indexfile{%
+ \string\indexentry{\expandafter\shavebackslash@\next@
+ \string @\string{\string}\string\verb\string"\string"\next@\string"\string"}{\thepage}}}%
+ \expandafter\endgroup\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi \@esphack}
+
+\def\@wrindex@Code#1{\let\thepage\relax
+ \DNii@{[#1]}\edef\nextii@{\codeof\nextii@}\DN@{}%
+ \expandafter\futurelet\expandafter\next\expandafter\quoteidxentry@\nextii@ @%
+ \edef\@tempa{\write\@indexfile{%
+ \string\indexentry{\expandafter\shavebackslash@\next@
+ \string @\string{\string}\string\verb\string"\string"\next@\string"\string"}{\thepage}}}%
+ \expandafter\endgroup\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi \@esphack}
+
+\def\filelinedef#1#2{\def\theindexfile{#1}\def\theindexline{#2}}
+
+\def\@wrindex@def#1{%
+ \DNii@{#1}\edef\nextii@{\codeof\nextii@}\DN@{}%
+ \expandafter\futurelet\expandafter\next\expandafter\quoteidxentry@\nextii@ @%
+ \edef\@tempa{\write\@indexfile{%
+ \string\indexentry{\expandafter\shavebackslash@\next@
+ \string @\string{\string}\string\verb\string"\string"\next@\string"\string"%
+ \string |seexyfile{\codeof\theindexfile}{\codeof\theindexline}}{\thepage}}}%
+ \expandafter\endgroup\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\@esphack}
+
+\expandafter\let\csname @wrindex@ def\endcsname=\@wrindex@def
+
+\def\shavebackslash@#1{\expandafter\ifx\otherescape#1\else#1\fi}
+
+\def\quoteidxentry@#1{\DNii@{\futurelet\next\quoteidxentry@}%
+ \ifx !#1\edef\next@{\next@\dq#1}%
+ \else\expandafter\ifx\otherat#1\edef\next@{\next@\dq#1}%
+ \else\expandafter\ifx\dq#1\edef\next@{\next@\dq#1}%
+ \else\expandafter\ifx\otherbar#1\edef\next@{\next@\dq#1}%
+ \else\expandafter\ifx\otherescape#1\edef\next@{\next@#1}%
+ \DNii@{\futurelet\next\quoteidxentry@escape}%
+ \else\ifx\space@\next\edef\next@{\next@\space}%
+ \DNii@{\futurelet\next\quoteidxentry@#1}%
+ \else\ifx#1@\let\nextii@=\relax
+ \else \edef\next@{\next@#1}\fi\fi\fi\fi\fi\fi\fi \nextii@}
+
+\def\quoteidxentry@escape#1{\DNii@{\futurelet\next\quoteidxentry@}%
+ \expandafter\ifx\otherbgroup#1\edef\next@{\next@\otherbgroup}%
+ \else\expandafter\ifx\otheregroup#1\edef\next@{\next@\otheregroup}%
+ \else\ifx\space@\next\edef\next@{\next@\space}%
+ \DNii@{\futurelet\next\quoteidxentry@#1}%
+ \else \DNii@{\quoteidxentry@#1}\fi\fi\fi \nextii@}
+
+{\catcode`\$=12 \catcode`\<=12 \catcode`\"=12
+ \gdef\@wrindex@beautify{%
+ \ifx $\next \let\next\@wrindex@extractdollar %$
+ \else\ifx <\next \let\next\@wrindex@extractsyntax
+ \else\ifx "\next \let\next\@wrindex@extractemph
+ \else \let\next\@wrindex@literal \fi\fi\fi \next}
+
+ \gdef\@wrindex@extractdollar$#1$#2\@wrindex@beautify{%
+ \def\next{#2}\ifx\next\empty \DN@{#1@$#1$}\fi}
+
+ \gdef\@wrindex@extractsyntax<#1>#2\@wrindex@beautify{%
+ \def\next{#2}\ifx\next\empty \DN@{#1@<#1>}\fi}
+
+ \gdef\@wrindex@extractemph""#1""#2\@wrindex@beautify{%
+ \def\next{#2}\ifx\next\empty \DN@{#1@\emph{#1}}\fi}}
+
+\def\@wrindex@literal#1\@wrindex@beautify{\DN@{#1@#1}}
+
+% Document format is two columns...
+
+\let\SAVEDmaketitle=\maketitle
+\def\maketitle{\begin{multicols}{2}[\SAVEDmaketitle]%
+ \renewenvironment{quotation}{\endgraf\noindent\ignorespaces}{\endgraf}%
+ \renewenvironment{figure}[1][]{\center\leavevmode}{\endcenter}%
+}
+
+% ...until the index where it changes to three columns!
+
+\def\INDEX{%
+ \end{multicols}
+ \let\PREINDEXtheindex=\theindex \let\PREINDEXendtheindex=\endtheindex
+ \renewenvironment{theindex}%
+ {\let\twocolumn=\beginmulticolsindex \let\onecolumn=\relax
+ \PREINDEXtheindex \addcontentsline{toc}{section}{Index}}%
+ {\PREINDEXendtheindex}
+ \xyinputorelse@@{\jobname.ind}{(no index yet)}%
+ \let\theindex=\PREINDEXtheindex \let\endtheindex=\PREINDEXendtheindex}
+
+\def\beginmulticolsindex[#1]{%
+ \global\let\PRETWOtheindex=\theindex
+ \global\let\PRETWOendtheindex=\endtheindex
+ \renewenvironment{theindex}{}{\aftergroup\finishmulticols}%
+ \begin{multicols}{3}[#1]\begin{theindex}}%
+
+\def\finishmulticols{\end{multicols}%
+ \global\let\theindex=\PRETWOtheindex
+ \global\let\endtheindex=\PRETWOendtheindex
+ \end{theindex}}
+
+\def\indexspace{\vspace{1ex}}
+\def\seexyfile#1#2#3{{\tt#1}:{\tinyrm#2}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Set page size to A4...with sligthly wider text when two columns
+
+\setlength{\oddsidemargin}{-1cm}
+\setlength{\evensidemargin}{-1cm}
+\setlength{\textwidth}{17cm}
+
+\setlength{\columnsep}{2pc}
+
+\setlength{\topmargin}{-1.4cm}
+\setlength{\headheight}{0.7cm}
+\setlength{\headsep}{0.7cm}
+\setlength{\textheight}{23.7cm}
+%\setlength{\footheight}{0.7cm}
+\setlength{\footskip}{1.1cm}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tracing auxiliary
+
+\def\notracingall{\tracingonline\z@\tracingcommands\z@\tracingstats\z@
+ \tracingpages\z@\tracingoutput\z@\tracinglostchars\z@
+ \tracingmacros\z@\tracingparagraphs\z@\tracingrestores\z@
+ \showboxbreadth5 \showboxdepth5}
+
+% Show bad boxes as plain TeX!
+
+\hbadness=1000
+
+% Show memory use!
+
+\tracingstats=1
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% RCS date...
+
+\def\printdate#1{\edef\next@{#1}\expandafter\printdate@\next@ @}
+\def\printdate@#1/#2/#3@{%
+ \ifcase#2\or January\or February\or March\or April\or
+ May\or June\or July\or August\or September\or October\or November\or
+ December\fi\space
+ \eatzero@#3, \ifnum100>#1\relax19\fi#1}
+\def\eatzero@#1{\ifx0#1\else#1\fi}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Font tables...from the standard testfont.tex:
+
+\newcount\m
+\newcount\n
+\newcount\p
+\newdimen\dim@
+\newif\ifskipping
+
+{\xycatcodes
+
+\gdef\fontfigure#1{%
+ \begin{figure}[tp]
+ {\font\testfont=#1 \testfont \fonttable}
+ \caption{Font table for \protect\texttt{#1}.}
+ \label{f.#1}
+ \end{figure}}
+
+\global\chardef\other=12
+\catcode`\"=\other
+
+\global\font\eighttt = cmtt8
+
+\gdef\twodigits#1{\ifnum #1<10 0\fi \number#1}
+
+\gdef\setbaselineskip{\setbox0=\hbox{\n=0
+\loop\char\n \ifnum \n<255 \advance\n 1 \repeat}
+\baselineskip=6pt \advance\baselineskip\ht0 \advance\baselineskip\dp0 }
+
+\gdef\setchar#1{{\escapechar-1\message{\string#1 character = }%
+ \def\do##1{\catcode`##1=\other}\dospecials
+ \read-1 to\next
+ \expandafter\finsetchar\next\next#1}}
+\gdef\finsetchar#1#2\next#3{\global\chardef#3=`#1
+ \ifnum #3=`\# \global\chardef#3=#2 \fi}
+\gdef\promptthree{\setchar\background
+ \setchar\starting \setchar\ending}
+
+\gdef\oct#1{\hbox{\rm\'{}\kern-.2em\it#1\/\kern.05em}} % octal constant
+\gdef\hex#1{\hbox{\rm\H{}\tt#1}} % hexadecimal constant
+\gdef\setdigs#1"#2{\gdef\h{#2}% \h=hex prefix; \0\1=corresponding octal
+ \m=\n \divide\m by 64 \xdef\0{\the\m}%
+ \multiply\m by-64 \advance\m by\n \divide\m by 8 \xdef\1{\the\m}}
+\gdef\testrow{\setbox0=\hbox{\penalty 1\def\\{\char"\h}%
+ \\0\\1\\2\\3\\4\\5\\6\\7\\8\\9\\A\\B\\C\\D\\E\\F%
+ \global\p=\lastpenalty}} % \p=1 if none of the characters exist
+\gdef\oddline{\cr
+ \noalign{\nointerlineskip}
+ \multispan{19}\hrulefill&
+ \setbox0=\hbox{\lower 2.3pt\hbox{\hex{\h x}}}\smash{\box0}\cr
+ \noalign{\nointerlineskip}}
+\gdef\evenline{\loop\skippingfalse
+ \ifnum\n<256 \m=\n \divide\m 16 \chardef\next=\m
+ \expandafter\setdigs\meaning\next \testrow
+ \ifnum\p=1 \skippingtrue \fi\fi
+ \ifskipping \global\advance\n 16 \repeat
+ \ifnum\n=256 \let\next=\endchart\else\let\next=\morechart\fi
+ \next}
+\gdef\morechart{\cr\noalign{\hrule\penalty5000}
+ \chartline \oddline \m=\1 \advance\m 1 \xdef\1{\the\m}
+ \chartline \evenline}
+\gdef\chartline{&\oct{\0\1x}&&\Ch@&&\Ch@&&\Ch@&&\Ch@&&\Ch@&&\Ch@&&\Ch@&&\Ch@&&}
+\gdef\chartstrut{\lower4.5pt\vbox to14pt{}}
+\gdef\fonttable{$$\global\n=0
+ \halign to\hsize\bgroup
+ \chartstrut##\tabskip0pt plus10pt&
+ &\hfil##\hfil&\vrule##\cr
+ \lower6.5pt\null
+ &&&\oct0&&\oct1&&\oct2&&\oct3&&\oct4&&\oct5&&\oct6&&\oct7&\evenline}
+\gdef\endchart{\cr\noalign{\hrule}
+ \raise11.5pt\null&&&\hex 8&&\hex 9&&\hex A&&\hex B&
+ &\hex C&&\hex D&&\hex E&&\hex F&\cr\egroup$$\par}
+\gdef\Ch@{\setbox0=\hbox{\char\n}%
+ \ifdim\ht0>7.5pt\reposition
+ \else\ifdim\dp0>2.5pt\reposition\fi\fi
+ \box0\global\advance\n 1 }
+\gdef\reposition{\setbox0=\vbox{\kern2pt\box0}\dim@=\dp0
+ \advance\dim@ 2pt \dp0=\dim@}
+\gdef\centerlargechars{
+ \def\reposition{\setbox0=\hbox{$\vcenter{\kern2pt\box0\kern2pt}$}}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% END OF DEFINITIONS
+
+\endinput
+
+$Log: xydoc.sty,v $
+Revision 3.7 1999/02/16 15:12:50 krisrose
+Interim release (Y&Y fonts now free).
+
+Revision 3.6 1998/03/06 01:28:05 krisrose
+Releasing (with Y&Y fonts).
+
+Revision 3.5 1997/05/29 22:46:43 krisrose
+Fixed "missing breaks" and tidied up documentation!
+
+Revision 3.4 1997/05/18 01:14:25 krisrose
+Essential bugfixes.
+
+Revision 3.3 1996/12/19 03:31:56 krisrose
+Maintenance release
+
+Revision 3.2 1995/09/19 18:22:27 kris
+Bug fix release.
+
+Revision 3.1 1995/09/05 20:31:32 kris
+Releasing!
+
+Revision 3.0 1995/07/07 20:14:21 kris
+Major release w/new User's Guide!
+
+Revision 2.14 1995/07/06 02:56:02 kris
+Buglets...
+
+Revision 2.13 1995/07/04 15:11:17 kris
+Ready to release v3?
+
+Revision 2.12 1994/10/25 11:34:25 kris
+Interim release just before v3 [works with AMS-LaTeX 1.2]...
+
+Revision 2.11 1994/07/05 10:37:32 kris
+Third 3beta release [bug fixes].
+Experimental graph feature included (for ECCT-94 presentation).
+
+Revision 2.10 1994/06/15 12:55:07 kris
+Second 3beta release: bug fixes.
+
+Revision 2.9 1994/06/09 14:59:19 kris
+Release 3beta.
+
+Revision 2.8.3.8 1994/05/05 06:13:13 kris
+Compilation works and is documented.
+Matrix object outline bug fixed.
+
+Revision 2.8.3.7 1994/05/04 08:16:25 kris
+Also has option depedency list now.
+
+Revision 2.8.3.6 1994/05/04 07:14:13 kris
+Compiling matrices work :-) :-) !!
+
+Revision 2.8.3.5 1994/05/04 03:51:05 kris
+Efficient queueing *and* compilation of matrices *almost* there :-) !!
+
+Revision 2.8.3.4 1994/05/03 12:42:52 kris
+Compiling of matrices soon to follow :-) ...
+
+Revision 2.8.3.3 1994/05/03 11:01:35 kris
+Compiling to file finished in kernel...
+
+Revision 2.8.3.2 1994/05/03 07:37:06 kris
+Fiddling for 2.9...
+
+Revision 2.8.3.1 1994/04/19 08:15:02 kris
+Going on holiday...
+
+Revision 2.8.1.2 1994/04/13 11:44:13 kris
+PostScript update patch and various fixes...
+
+Revision 2.8 1994/04/08 04:30:00 kris
+Second (bug fix) 3alpha release.
+
+Revision 2.7.2.4 1994/03/28 10:58:05 kris
+Curve bugs fixed [Ross].
+Edge logic overhauled...still shaky?
+PostScript added and maybe working!
+
+Revision 2.7.2.3 1994/03/28 04:07:38 kris
+Holiday is over :-)
+
+Revision 2.7.2.2 1994/03/13 07:54:52 kris
+Bug fixes and @@ `map over stack'.
+
+Revision 2.7.2.1 1994/03/11 11:47:11 kris
+Documentation prettyfied.
+Stacks added.
+
+Revision 2.7.1.1 1994/03/10 05:26:53 kris
+Date format fixed.
+
+Revision 2.7 1994/03/08 02:06:01 kris
+Release 3alpha.
+
+Revision 2.6.9.1 1994/03/07 04:22:46 kris
+Last internal 3alpha and pre-2.7 release.
+
+NEW for Xy-pic version 2.7.
diff --git a/Master/texmf-dist/source/generic/xypic/xydocps.doc b/Master/texmf-dist/source/generic/xypic/xydocps.doc
new file mode 100644
index 00000000000..10d8ef21835
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydocps.doc
@@ -0,0 +1,34 @@
+%% $Id: xydocps.doc,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+%%
+%% Xy-pic ``PostScript Dictionary creation'' template file.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+
+\input xy
+\xyoption{ps}
+\xyoption{dvips}
+\xyoption{color}
+\xyoption{line}
+\xyoption{rotate}
+
+\xyReloadDrivers
+\dumpPSdict{xyREPLACEWITHSHORTVERSIONdict.pro}
+
+\bye
diff --git a/Master/texmf-dist/source/generic/xypic/xydummy.doc b/Master/texmf-dist/source/generic/xypic/xydummy.doc
new file mode 100644
index 00000000000..d6f644f8d87
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydummy.doc
@@ -0,0 +1,97 @@
+%% $Id: xydummy.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+%%
+%% Xy-pic ``Dummy'' option.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{dummy}{Dummy option}{\stripRCS$Revision: 3.3 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This option is provided as a template for new options, it provides
+ neither features nor extensions but it does count how many times it
+ is requested.
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Even though the option does nothing it still has a standard \Xy-pic
+ header:
+
+\DOCHEADER
+
+ Next follows two declarations that are used to count the number of
+ invocations:
+
+\DOCMODE(
+\xynew@{count}\xydummyrequires@@
+\DOCMODE)
+
+ This is used by the option to output a message every time it is
+ loaded with |\xyoption| or |\xyrequire|:
+
+\DOCMODE(
+\xyeveryrequest{dummy}{\global\advance\xydummyrequires@@\@ne
+ \W@{The `dummy' option was used \the\xydummyrequires@@\space times!}}
+\DOCMODE)
+
+ (|\W@| is an \Xy-pic primitive that outputs its argument.)
+
+ Then the option ends:
+
+\DOCMODE(
+\xyendinput
+\DOCMODE)
+
+ Finally |xydummy.doc| is maintained using RCS and thus contains the
+ following revision log:
+
+\DOCMODE(
+% $Log: xydummy.doc,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% NEW file to go in version 2.7!
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xydvidrv.doc b/Master/texmf-dist/source/generic/xypic/xydvidrv.doc
new file mode 100644
index 00000000000..de533801865
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydvidrv.doc
@@ -0,0 +1,98 @@
+%% $Id: xydvidrv.doc,v 3.3 1996/12/18 09:12:40 ross Exp $
+%%
+%% Xy-pic ``dvidrv-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{dvidrv}{dvidrv driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This driver provides support for the ``emtex'' |\special| commands, when
+using one of the standard dvi-drivers: |dvidot|, |dvihplj|, |dvimsp|,
+|dviscr| or |dvivik|, that come with Eberhard Mattes' em-\TeX\ distribution.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\paragraph*{Driver installation}
+\DOCMODE(
+\xydef@\dvidrv@@#1{\dvimessage@{dvidrv}{#1}}
+
+\newdriver{%
+ \xyaddsupport{emtex}\dvidrvEmTeX@@
+ \xyaddsupport{line}\dvidrvLine@@
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item em-\TeX\ line-drawing |\special|s.
+\DOCMODE(
+\xydef@\dvidrvEmTeX@@{\dvidrvEmTeX@}%
+\xydef@\dvidrvEmTeX@{\setupxyEMTeX@}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths % and poly-lines.
+\DOCMODE(
+\xydef@\dvidrvLine@@{\dvidrvLine@}%
+\xydef@\dvidrvLine@{\xywithoption{emtex}{\installEMline@}}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xydvidrv.doc,v $
+% Revision 3.3 1996/12/18 09:12:40 ross
+% no changes
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+%
+% NEW for version 3.1
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xydvips.doc b/Master/texmf-dist/source/generic/xypic/xydvips.doc
new file mode 100644
index 00000000000..fa08fa7b7f2
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydvips.doc
@@ -0,0 +1,329 @@
+%% $Id: xydvips.doc,v 3.3 1996/12/18 09:13:14 ross Exp $
+%%
+%% Xy-pic ``dvips-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{dvips}{DVIPS driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This driver provides support for "all extensions" when using the \dvips\
+driver by Tomas Rokicki~\cite{dvips}. It has been tested with dvips
+version~5.55a and dvipsk version~5.58f.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\paragraph*{Driver installation}
+\DOCMODE(
+\xydef@\dvips@@#1{\dvimessage@{dvips}{#1}}
+
+\newdriver{%
+ \xyaddsupport{color}\dvipsColor@@
+ \xyaddsupport{crayon}\dvipsCrayola@@
+ \xyaddsupport{ps}\dvipsPS@@
+ \xyaddsupport{rotate}\dvipsRotate@@
+ \xyaddsupport{line}\dvipsLine@@
+ \xyaddsupport{frame}\dvipsFrames@@
+ \xyaddsupport{tile}\dvipsTiles@@
+ \xyaddsupport{tpic}\dvipsTPIC@
+ \xyaddsupport{emtex}\dvipsEM@
+ \xyaddsupport{cmtip}\relax
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item colour, using direct color specials and \PS.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+DVIPS uses the colour-stack method, due to Tomas Rokicki.
+
+\DOCMODE(
+\xydef@\dvips@Color@{\dvipsPStypes@
+ \let\xylocalColor@=\xystackcolor@
+ \let\xycolor@push\xycolor@push@@
+ \def\xycolor@{\xycolor@@}\let\xycolorwarning@=\relax
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}\installPScolor@ }%
+ \else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\dvipsCrayola@{}}%
+ \else \DN@{\xystandardcolors@}\fi \next@
+ \let\dvipsColor@@=\relax
+ \let\UnloadColor@@=\NoDVIPScolor@
+ }%
+
+\xydef@\dvipsColor@@{\dvips@Color@}
+
+\xydef@\NoDVIPScolor@{%
+ \def\xycolor@{\xycolor@@}%
+ \let\xycolor@@=\xyNoColor@
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\dvipsColor@@=\dvips@Color@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\DOCMODE)
+
+If neither support file |colordvi.tex| nor |colordvi.sty| can be found,
+then the normal colour support will not be available. However the colour
+support for the \PS\ back-end can still be used.
+
+\DOCMODE(
+\xydef@\NoDVIPScolordvi@{\xywarning@{%
+ Neither colordvi.tex nor colordvi.sty could be found.}%
+ \xyBEcolorcheck@}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item crayon colours.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The 68 colours that |dvips| recognizes by name are not loaded unless the
+|crayon| option has been requested.
+
+\DOCMODE(
+\xydef@\dvipsCrayola@@{\dvipsColor@@\dvipsCrayola@}
+
+\xydef@\dvipsCrayola@{%
+ \let\prevxycolor@=\newxycolor@
+ \def\newxyDVIPScolor@##1##2##3{\prevxycolor@{##1}{}{##1}}%
+ \let\newxycolor@=\newxyDVIPScolor@ \dvipsInclude@{color.pro}%
+% \xyinputorelse@{colordvi.tex}%
+% {\NoDVIPScolordvi@\let\newxycolor@=\prevxycolor@}%
+ \installCrayolaColors@
+ \let\newxycolor@=\prevxycolor@ }%
+\DOCMODE)
+
+Although any order of loading options: |ps|, |dvips|, |color| and |crayon|
+produces the desired result visually, the \PS\ code can be different
+with different loading order. The most easily readable is obtained when
+|crayon| is requested last.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \PS\ back-end.
+\DOCMODE(
+\xydef@\dvipsPS@@{\dvipsPS@}
+
+\xydef@\dvipsPS@unload{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\dvipsPS@@=\dvipsPS@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+|dvips| has three kinds of \PS\ |\special| which can be used.
+These may be used with various features other than just the \PS\ backend.
+
+\DOCMODE(
+\xydef@\dvipsPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\dvipsSpecial@\else
+ \let\PSspecial@@=\dvipsSpecial@
+ \let\PSmacro@@=\dvipsMacro@
+ \let\PSdict@@=\dvipsDict@
+ \let\PSspecialdict@@=\dvipsDict@
+ \let\PSraw@@=\dvipsRaw@
+ \let\PSinclude@@=\dvipsInclude@
+ \let\xyPSobeylines@@=\obeyDVIPSlines@
+ \let\xyPScurrpt@@=\dvipsCurrpt@@
+ \dvips@@{PostScript}%
+ \fi
+% \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \XYpredict@ }
+
+\xywarnifdefined\dvipsSpecial@
+\xywarnifdefined\dvipsMacro@
+\xywarnifdefined\dvipsDict@
+\xywarnifdefined\dvipsInclude@
+\xywarnifdefined\dvipsRaw@
+{\catcode`\"=11 \catcode`\!=11 \catcode`\:=11
+ \gdef\dvipsSpecial@#1{\special{ps:: SDict begin #1 end}}
+ \gdef\dvipsMacro@#1{\firstPS@@\special{" {#1}xy}}
+% \gdef\dvipsDict@#1{\special{! mark{#1}stopped cleartomark}}
+ \gdef\dvipsDict@#1{\special{! #1}}
+ \gdef\dvipsInclude@#1{\special{header=#1}}
+ \gdef\dvipsRaw@#1{\special{ps: SDict begin #1 end}}
+
+\catcode`\^^M=\active %
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space }}%
+\xylet@\obeyDVIPSlines@=\next
+\DOCMODE)
+
+All the \PS\ definitions passed to |dvips| by reading the
+dictionary file are stored in a \PS\ dictionary which it defines,
+called |SDict|. This must be the current dictionary whenever an \Xy-ps
+command is to be executed.
+This will be the case whenever the |\special{" |{\it commands}|}| or
+|\special{! |{\it commands}|}| forms are used, but not when the
+|\special{ps:: |{\it commands}|}| form is used.
+Thus the |\dvipsSpecial@| macro includes code to open |SDict| and
+close it when finished; so also does the |\dvipsRaw@| type, since this
+is used with \Xy-pic\ \PS\ operators whose definitions have been placed
+within |SDict|.
+
+The |currentpoint| is defined for the ``raw'' specials.
+
+\DOCMODE(
+\xydef@\dvipsCurrpt@{\let\xyPScurrpt@@=\dvipsCurrpt@@}%
+\xydef@\dvipsCurrpt@@{\PSraw@@{xyp}}
+\DOCMODE)
+
+The \PS\ operator called |xyp| is defined in |xyps-ps| for storing the
+location read from |currentpoint|.
+
+\medskip
+
+This installs the \PS\ backend.
+
+\DOCMODE(
+\xydef@\dvipsPS@{\dvipsPStypes@
+ \let\dvipsPS@@=\PSspecials@true
+ \let\UnloadPS@@=\dvipsPS@unload
+ \let\installxyps@@=\relax \installxyps@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item rotated/scaled diagrams and text, using \PS.
+\DOCMODE(
+\xydef@\dvipsRotate@@{\dvipsRotate@}
+
+\xydef@\dvipsRotate@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \dvipsCurrpt@ \dvipsRotScale@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}UnloadRotate@\relax}\fi
+ \next@ }
+
+\xydef@\dvipsRotScale@{%
+ \def\xyrot@start(##1){{xyct ##1\space xyrs }}%
+ \def\xyrot@end{}%
+ \def\xyscale@start(##1,##2){{xyct ##1\space##2\space xyss }}%
+ \def\xyscale@end{}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths and poly-lines, using \PS.
+\DOCMODE(
+\xydef@\dvipsLine@@{\dvipsLine@}
+
+\xydef@\dvipsLine@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item extra frames and fills, using \PS.
+\DOCMODE(
+\xydef@\dvipsFrames@@{\dvipsFrames@}
+
+\xydef@\dvipsFrames@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadFrames@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item patterns and tiles, using \PS.
+\DOCMODE(
+\xydef@\dvipsTiles@@{\dvipsTiles@}
+
+\xydef@\dvipsTiles@{\dvipsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \TPIC\ drawing commands.
+\DOCMODE(
+\xydef@\dvipsTPIC@@{\dvipsTPIC@}
+\xydef@\dvipsTPIC@{\setupxyTPIC@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item em-\TeX\ drawing commands.
+\DOCMODE(
+\xydef@\dvipsEM@@{\dvipsEM@}
+\xydef@\dvipsEM@{\setupxyEMTeX@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xydvips.doc,v $
+% Revision 3.3 1996/12/18 09:13:14 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.2 1995/09/19 18:20:20 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xydvitops.doc b/Master/texmf-dist/source/generic/xypic/xydvitops.doc
new file mode 100644
index 00000000000..c6e0c0a6423
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xydvitops.doc
@@ -0,0 +1,346 @@
+%% $Id: xydvitops.doc,v 3.3 1996/12/18 09:14:36 ross Exp $
+%%
+%% Xy-pic ``DVITOPS-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{dvitops}{DVITOPS driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\DVITOPS{{\sc dvitops}}
+This file provides support for the \DVITOPS\ driver by James
+Clark. As of September 1995, it has not been fully tested.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE(
+\xydef@\dvitops@@#1{\dvimessage@{DVITOPS}{#1}}
+
+\newdriver{%
+ \xyaddsupport{color}\dvitopsColor@@
+ \xyaddsupport{crayon}\dvitopsCrayon@@
+ \xyaddsupport{ps}\dvitopsPS@@
+ \xyaddsupport{rotate}\dvitopsRotate@@
+ \xyaddsupport{line}\dvitopsLine@@
+ \xyaddsupport{frame}\dvitopsFrames@@
+ \xyaddsupport{tile}\dvitopsTiles@@
+% \xyaddsupport{tpic}\dvitopsTPIC@@
+ \xyaddsupport{cmtip}\relax
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item colour, using direct color specials for |gray|, |rgb| and |hsb| colour
+ models; and \PS\ colour within diagrams;
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DVITOPS\ has a method for using colours locally, however it only colours
+``regions'', which cannot be nested. To use this within \Xy-pic\
+diagrams would be just asking for trouble.
+
+\DOCMODE(
+\xydef@\dvitopsColor@@{\dvitops@Color@}
+
+\xydef@\dvitops@Color@{\dvitopsPStypes@
+ \let\xylocalColor@=\xyDVITOPScolor@
+ \let\xycolor@push\xycolor@push@@
+ \def\xycolor@{\xycolor@@}\let\xycolorwarning@=\relax
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}\xycatcodes
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\dvitopsCrayon@{}}%
+ \else\let\next@=\xystandardcolors@
+ \fi \next@
+ \let\dvitops@Color@@=\relax
+ \let\UnloadColor@@=\NoDVITOPScolor@
+ }%
+
+\xydef@\NoDVITOPScolor@{%
+ \def\xycolor@{\xycolor@@}%
+ \let\xycolor@@=\xyNoColor@
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\dvitops@Color@@=\dvitops@Color@
+ }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xyDVITOPScolor@{\bgroup \DN@##1##2{\egroup}%
+ \ifInvisible@\else\ifHidden@\else\DNii@{\no@@}\ifx\nextii@\Connect@@
+ \else\DN@{\xyDVITOPScolor@i}\fi\fi\fi \next@ }
+
+\xydef@\xyDVITOPScolor@i#1#2{\checkXyStyle@
+ \DN@{#2}\ifx\next@\empty
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{#1}}}%
+ \else\DNii@{gray}\ifx\next@\nextii@
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{gray}{#1}}}%
+ \else\DNii@{rgb}\ifx\next@\nextii@
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{rgbcolor}{#1}}}%
+ \else\DNii@{hsb}\ifx\next@\nextii@
+ \def\tmp@##1{\DN@{\xycolor@begin##1\xycolor@end{hsbcolor}{#1}}}%
+ \else \DN@{\xywarning@{DVITOPS cannot support color: #2 #1}}%
+ \fi\fi\fi\fi
+ \toks@={\egroup \let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\tmp@\expandafter{\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}\def\Connect@@}%
+ \expandafter\tmp@\expandafter{\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}}%
+ \the\toks@ }%
+
+\xydef@\xycolor@begin{\dvitopsBegin@{color}}
+\xydef@\xycolor@end{\dvitopsEnd@{color}\dvitopsColor@x}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item crayon colours.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The 68 colours are those that |dvips| recognizes by name,
+thanks to Tomas Rokicki.
+
+\DOCMODE(
+\xydef@\dvitopsCrayon@@{\dvitopsColor@@\dvitopsCrayon@}
+\xydef@\dvitopsCrayon@{\installCrayolaColors@}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \PS\ back-end.
+\DOCMODE(
+\xydef@\dvitopsPS@@{\dvipsPS@}
+
+\xydef@\dvitopsPS@unload{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\dvitopsPS@@=\dvitopsPS@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DVITOPS\ has two kinds of |\special| which can be used; `inline' and
+`prolog' for including header files. Also there are the `begin' and `end'
+types for defining regions.
+
+\DOCMODE(
+\xydef@\dvitopsPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\dvitopsSpecial@\else
+ \let\PSspecial@@=\dvitopsSpecial@
+ \let\PSmacro@@=\dvitopsMacro@
+ \let\PSdict@@=\dvitopsDict@
+ \let\PSspecialdict@@=\dvitopsDict@
+ \let\PSraw@@=\dvitopsRaw@
+ \let\PSinclude@@=\dvitopsInclude@
+ \let\xyPSobeylines@@=\obeyDVIPSlines@
+ \let\xyPScurrpt@@=\dvitopsCurrpt@@
+ \dvitops@@{PostScript}%
+ \fi
+% \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \XYpredict@ }
+
+\xywarnifdefined\dvitopsSpecial@
+\xywarnifdefined\dvitopsMacro@
+\xywarnifdefined\dvitopsDict@
+\xywarnifdefined\dvitopsInclude@
+\xywarnifdefined\dvitopsRaw@
+\xywarnifdefined\dvitopsOrigin@
+\xywarnifdefined\dvitopsBegin@
+\xywarnifdefined\dvitopsEnd@
+\xywarnifdefined\dvitopsRotate@x
+\xywarnifdefined\dvitopsTransform@x
+\xywarnifdefined\dvitopsColor@x
+{\catcode`\:=11
+ \gdef\dvitopsSpecial@#1{\special{dvitops: inline #1}}
+ \gdef\dvitopsMacro@#1{\special{dvitops: inline {#1}xy}}
+ \gdef\dvitopsDict@#1{\special{dvitops: inline #1}}
+ \gdef\dvitopsInclude@#1{\special{dvitops: prolog #1}}
+ \gdef\dvitopsRaw@#1{\special{dvitops: inline #1}}
+%
+ \gdef\dvitopsOrigin@#1{\special{dvitops: origin #1}}
+ \gdef\dvitopsBegin@#1{\special{dvitops: begin #1}}
+ \gdef\dvitopsEnd@#1{\special{dvitops: end #1}}
+ \gdef\dvitopsRotate@x#1{\special{dvitops: rotate #1}}
+ \gdef\dvitopsTransform@x#1{\special{dvitops: transform #1}}
+ \gdef\dvitopsColor@x#1#2{\special{dvitops: #1 color #2}}
+}
+
+\catcode`\^^M=\active %
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space }}%
+\xylet@\obeyDVIPSlines@=\next
+\DOCMODE)
+
+Rotations and transformations use a different mechanism, so |\xyPScurrpt@@|
+can be set to |\relax|.
+
+\DOCMODE(
+\xydef@\dvitopsCurrpt@{\global\let\xyPScurrpt@@=\relax}%
+\DOCMODE)
+
+\medskip
+
+This installs the \PS\ backend.
+
+\DOCMODE(
+\xydef@\dvitopsPS@{\dvitopsPStypes@
+ \let\installxyps@@=\relax \installxyps@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item rotated/scaled diagrams and text, using \DVITOPS\ specials;
+ however these may not be nested.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\dvitopsRotate@@{\dvitopsRotate@}
+
+\xydef@\dvitopsRotate@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty
+ \DN@{\xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \installDVITOPSrotate@ }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+
+\xydef@\dvitopsRotScale@{%
+ \def\xyrot@start{\dvitopsBegin@{rot}\dvitopsOrigin@{rot}}%
+ \def\xyrot@end(##1){\dvitopsEnd@{rot}\dvitopsRotate@x{##1}}%
+ \def\xyscale@start{\dvitopsBegin@{scal}\dvitopsOrigin@{scal}}%
+ \def\xyscale@end(##1,##2){%
+ \dvitopsEnd@{scal}\dvitopsTransform@x{##1 0 ##2 0}}%
+ }
+
+\xydef@\installDVITOPSrotate@{\installPSstyle@
+ \let\xyRotate@@=\dvitopsRotate@
+ \let\doSpecialRotate@@=\dvitopsSpecialRotate@
+ \let\xyscale@@=\dvitopsScale@
+ \dvitopsCurrpt@
+ \dvitopsRotScale@ \xyPSshapes@true }
+
+\xydef@\UnloadDVITOPSrotate@{\UnloadRotate@\relax}
+\DOCMODE)
+
+\DOCMODE(
+ \xydef@\dvitopsRotate@#1{\xyPSsplitPS@
+ {\dvitopsBegin@{rot}\dvitopsOrigin@{rot}}%
+ {\dvitopsEnd@{rot}\dvitopsRotate@x{#1}}}%
+
+ \xydef@\dvitopsScale@#1#2{\xyPSsplitPS@
+ {\dvitopsBegin@{scal}\dvitopsOrigin@{scal}}%
+ {\dvitopsEnd@{scal}\dvitopsTransform@x{#1 0 #2 0}}}
+
+ \xydef@\dvitopsSpecialRotate@#1@@{\dvitopsRotate@{#1}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths and poly-lines, using \PS.
+\DOCMODE(
+\xydef@\dvitopsLine@@{\dvitopsLine@}
+
+\xydef@\dvitopsLine@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item extra frames and fills, using \PS.
+\DOCMODE(
+\xydef@\dvitopsFrames@@{\dvitopsFrames@}
+
+\xydef@\dvitopsFrames@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadFrames@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item patterns and tiles, using \PS\
+\DOCMODE(
+\xydef@\dvitopsTiles@{\dvitopsPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \TPIC\ drawing commands.
+\DOCMODE(
+\xydef@\dvitopsTPIC@@{\dvitopsTPIC@}
+
+\xydef@\dvitopsTPIC@{\setupxyTPIC@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xydvitops.doc,v $
+% Revision 3.3 1996/12/18 09:14:36 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyemtex.doc b/Master/texmf-dist/source/generic/xypic/xyemtex.doc
new file mode 100644
index 00000000000..ce17198297f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyemtex.doc
@@ -0,0 +1,243 @@
+%% $Id: xyemtex.doc,v 3.3 1996/12/18 09:18:00 ross Exp $
+%%
+%% Xy-pic ``em-TeX'' back-end extension.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{emtex}{em-TeX backend}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Eberhard Matte's {em-\TeX} implementation provides a suite of |\special|
+commands to facilitate the drawing of lines, both on-screen and with various
+printing devices. This `back-end' extension allows the lines in \Xy-pic
+diagrams to be drawn using these methods.
+
+Note that this extension does not have to be used with {em-\TeX}. Better
+results may be obtained using the \PS\ back-end and \dvips\ <driver>, since
+a version of \dvips\ is available for em-\TeX. However, in particular for
+screen previewing purposes, it may be convenient to use this back-end.
+Furthermore note that \dvips\ is capable of supporting em-\TeX |\special|s.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+Once loaded using |\xyoption{emtex}|, with an appropriate <driver> also
+specified either already or subsequently, the following commands are
+available to turn the em-\TeX\ backend off/on.
+%
+\begin{defs}
+|\NoEMspecials| & turns off em-\TeX\ specials.\kern-50pt\cr
+|\UseEMspecials| & reinstates em-\TeX\ specials.\kern-30pt
+\end{defs}
+
+\DOCMODE(
+\xynew@{if}\ifEMspecials@
+\xydef@\UseEMspecials{\EMspecials@true}
+\xydef@\NoEMspecials{\EMspecials@false}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The |\special|s}
+
+\DOCMODE(
+\xydef@\xyemtex@lineto{\xyEM@special{lineto}}
+\xydef@\xyemtex@moveto{\xyEM@special{moveto}}
+\xydef@\xyemtex@line#1{\xyEM@special{line #1}}
+\xydef@\xyemtex@point#1{\xyEM@special{point #1}}
+\xydef@\xyemtex@pen#1{\addtostyletoks@{\xyEM@special{linewidth #1}}}
+\DOCMODE)
+
+These place the actual |\special|s and allow tracing:
+
+\DOCMODE(
+{\catcode`:=12 \gdef\next#1{\special{em:#1}}}
+\xylet@\xyEM@special=\next
+
+{\catcode`:=12 \gdef\next#1{%
+ \W@{EM:#1 (\the\X@p,\the\Y@p),(\the\X@c,\the\Y@c)}\special{em:#1}}}
+\xylet@\xyEM@noisy=\next
+
+\xydef@\NoisyEMTeX{\let\xyEM@special=\xyEM@noisy}
+\DOCMODE)
+
+Currently these are not used by \Xy-pic.
+
+\DOCMODE(
+%\xydef@\xyemtex@message#1{\xyEM@special{message #1}}
+%\xydef@\xyemtex@graph#1{\xyEM@special{graph #1}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{re-bindings}
+
+This is similar to the mechanism used by the \PS\ back-end to rebind
+``hooks'' to incorporate a switch according to the current value of
+|\ifEMspecials@|.
+
+\DOCMODE(
+\xydef@\EMalternative@#1#2{%
+\expandafter\global\expandafter\let\csname origxy#2@\endcsname=#1%
+ \xdef#1{\noexpand\ifEMspecials@
+ \noexpand\expandafter\expandafter\noexpand\csname xyemtex@#2@\endcsname
+ \noexpand\else
+ \noexpand\expandafter\expandafter\noexpand\csname origxy#2@\endcsname
+ \noexpand\fi}}%
+\DOCMODE)
+
+Allow only one instance of |\setupxyEM@|; thereafter simply do
+|\reloadxyEM@| to turn on anything that has been turned off.
+
+\DOCMODE(
+\xydef@\setupxyEMTeX@{\xywarning@{using em-TeX specials}%
+ \EMalternative@{\solid@}{solid}%
+% \EMalternative@{\point@}{point}%
+ \EMalternative@{\splinesolid@}{splinesolid}%
+ \let\setupxyEM@=\reloadxyEM@
+ \activateEM@ }
+
+\xydef@\xyunloadEM@{\xywarning@{EM specials turned off}%
+% \xywithoption{curve}{\xysetup@@\uninstallEMcurves@ }%
+ \xywithoption{line}{\xysetup@@\uninstallEMline@ }%
+% \xywithoption{frame}{\xysetup@@\uninstallEMframes@ }%
+ \EMspecials@false
+ \let\setupxyEM@=\reloadxyEM@ }
+
+\xydef@\activateEM@{%
+ \xywithoption{line}{\xysetup@@\installEMline@}%
+% \xywithoption{curve}{\xysetup@@\installEMcurves@}%
+% \xywithoption{frame}{\xysetup@@\installEMframes@}%
+ \EMspecials@true }
+
+\xydef@\reloadxyEM@{\xywarning@{EM specials back on}\activateEM@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{straight lines}
+
+\DOCMODE(
+\xydef@\xyemtex@solid@{%
+ \ifInvisible@ \let\next@=\no@@
+ \else \DN@{\xyEMstraight@}\fi
+ \next@ }
+
+\xydef@\xyEMstraight@{\setupDirection@
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \DN@##1##2{\def\checkoverlap@@{%
+ \ifdim##1\X@p>##1\X@c \let\next@=\relax \fi
+ \ifdim##2\Y@p>##2\Y@c \let\next@=\relax \fi}}%
+ \edef\nextii@{{\sd@X}{\sd@Y}}\expandafter\next@\nextii@
+ \noCshavep@@ \edef\Cshavep@@{\pfromthep@ \noexpand\resetDirection@}%
+ \noCshavec@@ \edef\Cshavec@@{\cfromthec@ \noexpand\resetDirection@}%
+ \ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi \fi
+ \ifInvisible@\let\next@=\relax \else
+ \DN@{%
+ \setboxz@h{\kern\X@p \raise\Y@p\hbox{\xyemtex@moveto}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ %
+ \setboxz@h{\boxz@ \kern\X@c \raise\Y@c\hbox{\xyemtex@lineto}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}%
+ \fi
+ \checkoverlap@@
+ \ifdim\d@X=\z@ \ifdim\d@Y=\z@ \DN@{\relax}\fi\fi \next@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\Creset@@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{spline curves}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+Of the curves defined in the |xycurve| extension, only solid spline curves
+are supported. This is done by treating the spline as a polygon (poly-line)
+with many segments.
+
+\DOCMODE(
+\xydef@\xyemtex@splinesolid@{\setbox\splinebox@=\copy\voidb@x
+ \multiply\splinetol@\thr@@
+ \gdef\splineextra@@{\xyemtex@moveto\gdef\splineextra@@{\xyemtex@lineto}}%
+ \def\xycrvdrop@{ }\def\xycrvconn@{}\splineset@@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{line width}
+
+\DOCMODE(
+\xydef@\xyEMlinewidth@#1{\dimen@=#1\relax\edef\next@{\the\dimen@}}
+
+\xydef@\installEMline@{%
+ \let\xylinewidth@@=\xylinewidth@
+ \let\xylineSpecial@@=\xyemtex@pen
+ \let\transxyline@@=\xyEMlinewidth@ }
+
+\xydef@\uninstallEMline@{\UnloadLine@\relax}%
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\UseEMlinewidth{\installEMline@}%
+\xydef@\NoEMlinewidth{\uninstallEMline@}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyemtex.doc,v $
+% Revision 3.3 1996/12/18 09:18:00 ross
+% fixed bug affecting line-widths
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyframe.doc b/Master/texmf-dist/source/generic/xypic/xyframe.doc
new file mode 100644
index 00000000000..7387f91163f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyframe.doc
@@ -0,0 +1,1213 @@
+%% $Id: xyframe.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Frames and Brackets'' extension.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{frame}{Frame and Bracket extension}{\stripRCS$Revision: 3.7 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The |frame| extension provides a variety of ways to puts frames in
+ \Xy-pictures.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The frames are \Xy-pic <object>s on the form
+%
+\begin{defs1}
+ ??c![\frm]|{| <frame> |}| \cr
+\end{defs1}
+\noindent\unskip
+%
+ to be used in <pos>itions: Dropping a frame with
+ |*|\dots|\frm{|<frame>|}| will frame the~$c$ object; connecting with
+ |**|\dots |\frm{|\dots<frame>|}| will frame the result of $c|.|p$.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{\Xy-pic interface}
+
+ The frames are integrated in \Xy-pic as <object>s as follows. They
+ generate a dummy object, then define the |\Drop@@| action to place
+ the requested frame. The |\Connect@@| operation is defined to place
+ the requested frame around the current "and" the previous object
+ (using the |\cmerge@| command of the kernel).
+
+\DOCMODE(
+\xydef@\frm{\hbox{}\dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@
+ \ht\z@=\U@c \dp\z@=\D@c \dimen@=\U@c \advance\dimen@\D@c
+% \ifdim\wdz@=\z@ \def\Leftness@{0}\else \quotient@\Leftness@\L@c\wdz@ \fi
+% \ifdim\dimen@=\z@ \def\Upness@{0}\else \quotient@\Upness@\U@c\dimen@ \fi
+ \ifdim\wdz@=\z@ \def\Leftness@{.5}\else \quotient@\Leftness@\L@c\wdz@ \fi
+ \ifdim\dimen@=\z@ \def\Upness@{.5}\else \quotient@\Upness@\U@c\dimen@ \fi
+ \expandafter\Edge@c\expandafter{\prevEdge@@}\let\frmradius@@=\z@
+ \def\Drop@@{}%
+ \def\Connect@@{\xy@@{\save@\cmerge@\Y@p\X@p\D@p\U@p\L@p\R@p\Drop@@}\restore}%
+ \xyFN@\frm@i}
+
+\xylet@\frmradius@@=\z@
+
+\xydef@\frm@i{%
+ \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\def\frmradius@@{##1}\xyFN@\frm@i}%
+ \else \DN@##1##{\frm@{##1}}\fi \next@}
+\DOCMODE)
+
+ The main command is |\frm@| which looks up if a custom control
+ sequence is available for the requested frame or whether the generic
+ `curve along the edge' code should be invoked.
+
+\DOCMODE(
+\xydef@\frm@#1#2{\DNii@{frm#1{#2}}%
+ \expandafter\let\expandafter\next@\csname\codeof\nextii@\endcsname
+ \ifx\next@\relax \DNii@{frm{#2}}%
+ \expandafter\let\expandafter\next@\csname\codeof\nextii@\endcsname
+ \ifx\next@\relax \let\next@=\frm@generic \fi\fi \next@}
+
+\xydef@\frm@generic{\xyerror@{No generic frames yet!}{}}
+\DOCMODE)
+
+ This extra command is used to define |\Drop@@| for each frame such
+ that |\frmradius@@| is available.
+
+\DOCMODE(
+\xydef@\frmDrop@#1{%
+ \ifx\frmradius@@\z@ \addtoDrop@@{\let\frmradius@@=\z@ #1}%
+ \else \expandafter\addtoDrop@@\expandafter{%
+ \expandafter\def\expandafter\frmradius@@\expandafter{\frmradius@@}#1}\fi}
+
+\xydef@\EdgefromtheEdge@{%
+ \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \Edge@c={\expandafter\noexpand\the\Edge@c}}
+\xydef@\prevEdgefromtheEdge@{%
+ \U@c=\the\U@c \D@c=\the\D@c \L@c=\the\L@c \R@c=\the\R@c
+ \noexpand\def\noexpand\prevEdge@@{\expandafter\noexpand\the\Edge@c}}
+
+\xydef@\addtoDrop@@#1{%
+ \expandafter\def\expandafter\Drop@@\expandafter{\Drop@@#1}}
+\xydef@\addbeforeDrop@@#1{\DNii@{#1}%
+ \expandafter\DN@\expandafter{\expandafter\nextii@\Drop@@}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\Drop@@
+ \expandafter\expandafter\expandafter{\next@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Below we distinguish between `ordinary' frames, `brackets' and
+ `fills'; last we present how some frames can be added to other
+ objects using object modifier <shape>s.
+
+\begin{figure*}[p]
+\vfill
+$$
+%
+ \newcount\R \newcount\C
+ \def\n{\advance\R1 \C0 \POS(\R,\C)}
+ \def\F#1#2#3{\advance\C1 \def\1{#1}\def\3{#3}%
+ \POS(\R,\C)*+\txt{Framed with\\\tt\string\frm\codeof\1\\frame%
+ \ifx\3\empty\else ??^[#3]\relax\fi}*\frm#1*\frm{#2}}
+%
+\R0 \C0 \xy
+ %
+ \POS 0;<0cm,-1.7cm>:<3.2cm,0cm>:: \relax
+ \F{{}}{}{dummy} \F{{.}}{}{rect} \F{<44pt>{.}}{}{rect}
+ %
+ \n\F{{-}}.{rect}="top"\F{<8pt>{-}}.{rect} \F{<44pt>{-}}.{rect}
+ \n\F{{=}}.{rect} \F{<8pt>{=}}.{rect} \F{<44pt>{=}}.{rect}
+ \n\F{{--}}.{rect} \F{{o-}}.{rect} \F{<44pt>{--}}.{rect}
+ \n\F{{,}}.{shade} \F{<5pt>{,}}.{shade} \F{{-,}}.{shade}
+ \n\F{{o}}.{circ} \F{<8pt>{o}}.{circ} \F{{.o}}.{circ}
+ \n\F{{oo}}.{circ} \F{<8pt>{oo}}.{circ} \F{{-o}}.{circ}
+ \n\F{{e}}.{ellip} \F{<20pt,8pt>{e}}.{ellip} \F{{.e}}.{ellip}
+ \n\F{{ee}}.{ellip} \F{<20pt,8pt>{ee}}.{ellip} \F{{-e}}.{ellip}="bot"
+ %
+% \n\POS+(0,1)*=<20pt,10pt>{}="5,0"*\frm{*}!CR!<\jot,0pt>
+% *!L{\leftarrow\txt{Framed with {\tt\string\frm\string{*\string}}
+% frame \dots\ should only be used\\for relatively small (and probably
+% empty) objects}}
+ %
+ \POS"top"."bot"!CL!<-2\jot,0pt>*\frm{\{}
+ *++!R\txt<2cm>{These are over\-layed with the
+ {\tt\string\frm\string{.\string}} frame
+ above to show the way they are centered
+ on the object}
+\endxy
+$$
+\caption{Plain \protect<frame>s.}
+??=[f.frm]
+%\vspace{3ex}
+\vfill
+$$
+%
+ \newcount\R \newcount\C
+ \def\n{\advance\R1 \C0 \POS(\R,\C)}
+ \def\F#1#2#3{\advance\C1 \def\1{#1}\def\3{#3}%
+ \POS(\R,\C)*+\txt{Framed with\\\tt\string\frm\codeof\1\\frame%
+ \ifx\3\empty\else ??^[#3]\relax\fi}*\frm#1*\frm{#2}}
+%
+\R0 \C0 \xy
+ %
+ \POS 0;<0cm,-1.7cm>:<3.2cm,0cm>:: \relax
+ \n\F{{_\}}}.{braces} \F{{^\}}}.{braces} \F{{\{}}.{braces} \F{{\}}}.{braces}
+ \n\F{{_)}}.{paren} \F{{^)}}.{paren} \F{{(}}.{paren} \F{{)}}.{paren}
+ %
+\endxy
+$$
+\caption{Bracket \protect<frame>s.}
+??=[f.bfrm]
+\vfill
+\end{figure*}
+
+
+\subsection{Frames}
+??=[frames]
+
+ Figure~??[f.frm] shows the possible frames and the applicable
+ <modifier>s with reference to the notes below.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[dummy]
+
+ The |\frm{}| frame is a dummy useful for not putting a frame on
+ something, \eg, in macros that take a <frame> argument.
+
+\DOCMODE(
+\xydefcsname@{frm{}}{}
+\xyletcsnamecsname@{frm[]{}}{frm{}}
+\xyletcsnamecsname@{frm[o]{}}{frm{}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[rect]
+
+ "Rectangular" frames include |\frm{.}|, |\frm{-}|, |\frm{=}|,
+ |\frm{--}|, |\frm{==}|, and |\frm{o-}|. They all make rectangular
+ frames that essentially trace the border of a rectangle-shaped
+ object.
+
+ The <frame>s |\frm{-}| and |\frm{=}| allow an optional "corner
+ radius" that rounds the corners of the frame with quarter circles of
+ the specified radius. This is not allowed for the other frames---the
+ |\frm{o-}| frame always gives rounded corners of the same size as the
+ used dashes (when |\xydashfont| is the default one then these are
+ |5pt| in radius).
+
+\begin{exercise}
+%
+ How do you think the author typeset the following?
+%
+\begin{code}
+\xy
+ (0,0) *++={A} *\frm{o} ;
+ (10,7) *++={B} *\frm{o} **\frm{.}
+\endxy
+\end{code}
+$$\docode$$
+%
+\answertext{Here is how:}
+\answercode
+\answertext\displaycode
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The commands still hack away with rules and stuff\dots
+
+ |\frm{.}| just fills the edges of the object rectangle border with
+ dots using dots as in dotted connections in the kernel.
+
+\DOCMODE(
+\xydefcsname@{frm{.}}{\frmDrop@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@doth@@ \let\framevfill=\frm@dotv@@
+ \framed@@{\frmradius@@}}}
+
+\xyletcsnamecsname@{frm[]{.}}{frm{.}}
+
+\xydef@\frm@doth@@{\setboxz@h{\kern5\B@\framezerodot@@\kern5\B@}\ht\z@=\B@
+ \dp\z@=\B@\kern5\B@\xleaders\boxz@\hss\kern5\B@}
+\xydef@\frm@dotv@@{\setboxz@h to2\B@{\hss\framezerodot@@\hss}\ht\z@=5\B@
+ \dp\z@=5\B@\kern5\B@\xleaders\boxz@\vss\kern5\B@}
+
+\xyletcsnamecsname@{frm{..}}{frm{.}}
+
+\xylet@\framezerodot@@=\zerodot
+\DOCMODE)
+
+ The |\frm|<variant>|{-}| and |\frm|<variant>|{=}| set a single/double
+ frame that just surrounds the current object; if a <radius> is given
+ then it should be a |<|<dimen>|>| where the <dimen> will be used for
+ the corner radius.
+
+ The commands for |\frm{-}| and |\frm{=}| are quite similar in that
+ they just call |\framed@| one or two times, respectively, with the
+ corner radius and $L,R,D,U$ extents reflecting the size of the frame.
+ |\framed@| then sets the horizontal and vertical fill commands to
+ generate rules of the right length, then calls |\framed@@| where the
+ real work is done.
+
+\DOCMODE(
+\xydefcsname@{frm{-}}{\frmDrop@{\framed@\frmradius@@}}
+\xyletcsnamecsname@{frm[]{-}}{frm{-}}
+
+\xydef@\framed@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@ \framed@@}
+
+\xylet@\framesetthick@=\relax
+
+\xydef@\frm@solidh@@{\framesetthick@\leaders\hrule height\B@ depth\B@\hfill}
+\xydef@\frm@solidv@@{\framesetthick@\leaders\vrule width2\B@\vfill}
+
+\xydefcsname@{frm{=}}{\frmDrop@{\framed@\frmradius@@
+ {\advance\L@c-2\p@ \advance\R@c-2\p@ \advance\U@c-2\p@ \advance\D@c-2\p@
+ \dimen@=\frmradius@@
+ \ifdim\dimen@>2\p@ \advance\dimen@-2\p@ \else \dimen@=\z@\fi
+ \framed@\dimen@}}}
+
+\xyletcsnamecsname@{frm[]{=}}{frm{=}}
+\DOCMODE)
+
+ When the line extension is also loaded then we use the line thickness
+ for frames:
+
+\DOCMODE(
+\xydef@\framesetthick@line{\B@=.5\xylinethick@}
+
+\xydef@\frm@thickc@@{\hbox{\framesetthick@line
+ \vrule height.5\B@ depth.5\B@ width\B@}}
+
+\xywithoption{line}{%
+ \let\framezerodot@@\frm@thickc@@ \let\framesetthick@=\framesetthick@line}
+\DOCMODE)
+
+ |\framed@@| is where we build a box with the sides of the frame
+ displaced appropriately. \TODO{Generalise this to handle any
+ directional!}
+
+\DOCMODE(
+% Procedure:
+% %0 setup hrulefill and vrulefill as apropriate...
+% %1 Lower R to be less than half of both (U+D) and (L+R).
+% %2 Start vbox at (X-L,Y-D) except center overshoot.
+% %3 Generate corner CO4 at R; w[\A@] := -1/2 width(corner);
+% r[\B@] := 1/2 rulewidth; h[\dimen@ii] := U+D+2w;
+% %4 Row 1: hbox to W{kern w CO4 hrulefill CO3 kern w}.
+% %5 Row 2: hbox to W{kern-r vbox to h{vrulefill}
+% hfill vbox to h{vrulefill} kern-r}.
+% %6 Row 3: hbox to W{kern w CO1 hrulefill CO2 kern w}.
+
+\xydef@\framed@@#1{\setboxz@h{\R@=#1\relax
+ \dimen@=\L@c \advance\dimen@\R@c \dimen@ii=\U@c \advance\dimen@ii\D@c %1
+ \ifdim.5\dimen@<\R@ \R@=.5\dimen@ \fi
+ \ifdim.5\dimen@ii<\R@ \R@=.5\dimen@ii \fi
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c %2
+ \ifdim\R@<\p@\else \cirrestrict@@ \fi
+ \dimen@=2\R@ \advance\dimen@-\L@c \advance\dimen@-\R@c
+ \ifdim\dimen@>\z@ \advance\A@-.5\dimen@ \fi
+ \dimen@=2\R@ \advance\dimen@-\U@c \advance\dimen@-\D@c
+ \ifdim\dimen@>\z@ \advance\B@-.5\dimen@ \fi
+ \kern\A@ \raise\B@\vbox to \dimen@ii{\framed@body@@}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+
+\xydef@\framed@body@{%
+ \advance\dimen@ii.22\p@ \advance\dimen@-.2\p@
+ \setboxz@h{\corn@@4\R@}\A@=-.5\wdz@ \B@=.5\xydashw@ %3
+ \dimen@=\L@c \advance\dimen@\R@c \advance\dimen@-.2\p@
+ \setboxz@h to\dimen@{\kern\A@ \boxz@ \framehfill\corn@@3\R@\kern\A@}%4
+ \advance\dimen@ii-\dp\z@ \kern-\ht\z@ \nointerlineskip\boxz@
+ \dimen@=\L@c \advance\dimen@\R@c \advance\dimen@-.2\p@
+ \setboxz@h to\dimen@{\kern\A@\corn@@1\R@\framehfill\corn@@2\R@\kern\A@}%6
+ \advance\dimen@ii-\ht\z@
+ \dimen@=\L@c \advance\dimen@\R@c \advance\dimen@.2\p@
+ \nointerlineskip\hbox to\dimen@{% %5
+ \setbox\z@=\vbox to\dimen@ii{\framevfill}\kern-.5\wdz@\copy\z@
+ \hss \copy\z@\kern-.5\wdz@ }%
+ \nointerlineskip\boxz@ \vss \kern\z@}
+
+\xylet@\framed@body@@=\framed@body@
+
+\xylet@\zerocorner=\framezerodot@@
+
+\xydef@\solidcorner@#1#2{\hbox\bgroup \R@=#2\relax
+ \ifdim\R@<\p@ \zerocorner
+ \else \cirrestrict@@ \multiply\count@8 %
+ \setboxz@h{\corn@x@@{#1}}\dimen@=\wdz@
+ \ifcase#1\or \ht\z@=\z@ \kern\dimen@ \raise\dimen@\boxz@
+ \or \ht\z@=\z@ \raise\dimen@\boxz@ \kern\dimen@
+ \or \dp\z@=\z@ \lower\dimen@\boxz@ \kern\dimen@
+ \or \dp\z@=\z@ \kern\dimen@ \lower\dimen@\boxz@ \fi
+ \vrule height\dimen@ depth\dimen@ width\z@\fi
+ \edef\tmp@{\egroup \U@c=\the\dimen@}\tmp@ \D@c=\U@c \L@c=\U@c \R@c=\U@c
+ \Edge@c={\circleEdge}\ignorespaces}
+
+\xydef@\corn@x@#1{\ifcase#1\or
+ \circhar@@\z@ \circhar@@\@ne\or\circhar@@\tw@ \circhar@@3\or
+ \circhar@@5\circhar@@4\or\circhar@@7\circhar@@6\fi}
+
+\xylet@\corn@x@@=\corn@x@
+
+\xydef@\corn@@{\DN@{\solidcorner@}%
+ \ifx\framehfill\frm@doth@@ \DN@{\let\cirrestrict@@=\relax
+ \let\corn@x@@=\dotcorner@@ \let\zerodot=\framezerodot@@
+ \solidcorner@ }%
+ \else\ifx\framehfill\frm@dashh@@ \DN@{\let\cirrestrict@@=\relax
+ \let\corn@x@@=\dashcorner@@ \let\zerodot=\framezerodot@@
+ \solidcorner@ }%
+ \fi\fi \next@}
+
+\xydef@\dotcorner@@#1{\zerocorner}
+\xydef@\dashcorner@@#1{\zerocorner}
+
+\xywithoption{curve}{%
+ \let\dotcorner@@=\dotcorner@ \let\dashcorner@@=\dashcorner@}
+\DOCMODE)
+
+ The dashed frames `dash' with the dash used for dashed lines.
+
+\DOCMODE(
+\xydefcsname@{frm{--}}{%
+ \frmDrop@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@dashh@@ \let\framevfill=\frm@dashv@@
+ \framed@@\frmradius@@}}
+
+\xyletcsnamecsname@{frm[]{--}}{frm{--}}
+
+\xydef@\frm@dashh@@{\setboxz@h{\dashhfillchar}%
+ \ht\z@=\B@ \dp\z@=\B@ \wdz@=2\xydashl@
+ \copy\z@ \xleaders\copy\z@\hss \boxz@\kern-\xydashl@}
+\xydef@\frm@dashv@@{\setboxz@h to2\B@{\hss\dashvfillchar\hss}\ht\z@=\z@
+ \dp\z@=2\xydashl@ \nointerlineskip\copy\z@ \xleaders\copy\z@\vss
+ \nointerlineskip\boxz@\kern-\xydashl@}%
+
+\xydef@\dashhfillchar{{\rDirection@\xydashl@ \line@@}}
+\xydef@\dashvfillchar{{\dDirection@\xydashl@ \line@@}}
+\DOCMODE)
+
+\BUG: Setting the corner-radius to less than 10pt has no effect when
+ using |\frm{o-}|; instead a default size of |.8\xydashl@| is used.
+
+\DOCMODE(
+\xydefcsname@{frm{o-}}{%
+ \ifdim\frmradius@@<2\xydashl@\relax \dimen@=.8\xydashl@
+ \expandafter\def\expandafter\frmradius@@\expandafter{\the\dimen@}\fi
+ \frmDrop@{\let\zerocorner=\framezerodot@@
+ \let\framehfill=\frm@rddashh@@ \let\framevfill=\frm@rddashv@@
+ \framed@@\frmradius@@}}%
+
+\xydef@\frm@rddashh@@{\setboxz@h{\kern\xydashl@\dashhfillchar}%
+ \ht\z@=\B@ \dp\z@=\B@ \copy\z@ \xleaders\copy\z@\hss \boxz@ \kern\xydashl@}
+\xydef@\frm@rddashv@@{\ifdim\dimen@ii<2\xydashl@\else
+ \setbox\z@=\vbox to2\xydashl@{\hbox to2\B@{\hss\dashvfillchar\hss}\vss}%
+ \kern\xydashl@ \copy\z@ \xleaders\copy\z@\vss
+ {\ifdim\dimen@ii<2\xydashl@\else\aftergroup\boxz@\fi}\fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[shade]
+
+ The frame |\frm{,}| puts a shade, built from rules, into the picture
+ beneath the (assumed rectangular) object, thereby giving the illusion
+ of `lifting' it; |\frm<|<dimen>|>{,}| makes this shade <dimen> deep.
+
+ |\frm{-,}| combines a |\frm{-}| with a |\frm{,}|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ A black rule is just that, a shade is two rules placed under and left
+ of the rectangular object outline.
+
+\DOCMODE(
+\xydefcsname@{frm{,}}{%
+ \ifx\frmradius@@\z@ \shaded@{1.2\p@}\else \shaded@\frmradius@@ \fi}
+
+\xydef@\shaded@#1{\frmDrop@{\R@=#1\relax
+ {\advance\X@c\R@ \advance\Y@c-\D@c \U@c=\z@ \D@c=\R@ \blacked@}%
+ {\advance\X@c\R@c \advance\Y@c-\R@ \L@c=\z@ \R@c=\R@ \blacked@}}}
+
+\xydefcsname@{frm{-,}}{\addtoDrop@@{\drop\frm{-}\drop\frm{,}}}
+
+\xydef@\blacked@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \dimen@=\L@c \advance\dimen@\R@c
+ \B@=\Y@c \advance\B@-\D@c \dimen@ii=\Y@c \advance\dimen@ii\U@c
+ \advance\A@-.5\xydashw@
+ % \advance\B@-\xydashw@ \advance\dimen@ii-.5\xydashw@
+ \kern\A@ \blacked@@ }%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+
+\xydef@\bblacked@{\setboxz@h{%
+ \dimen@=\L@c \advance\dimen@\R@c \B@=-\D@c \dimen@ii=\U@c
+ \kern-\L@c \blacked@@ \kern-\dimen@ \kern\L@c}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+
+\xydef@\blacked@@{\vrule width\dimen@ depth-\B@ height\dimen@ii}
+\DOCMODE)
+
+The |\blacked| option is subsumed within a more general |\filled|; see below.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[circ]
+
+ Circles done with |\frm{o}| have radius as $(R+L)/2$ and with
+ |\frm<|<dimen>|>{o}| have radius as the <dimen>; |\frm{oo}| makes a
+ double circle with the outermost circle being the same as that of
+ |\frm{o}|.
+
+\begin{exercise}
+ What is the difference between |*\cir{}| and |*\frm{o}|?
+\answertext{The |*\cir{}| operation changes $c$ to be round whereas
+ |*\frm{o}| does not change $c$ at all.}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydefcsname@{frm{o}}{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@
+ \circled@\dimen@}%
+ \else
+ \frmDrop@{\let\framehfill=\frm@solidh@@
+ \let\framevfill=\frm@solidv@@ \circled@\frmradius@@}%
+ \fi}
+
+\xydefcsname@{frm{oo}}{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@
+ {\circled@\dimen@}\advance\dimen@-2.1\p@ \circled@\dimen@}%
+ \else
+ \frmDrop@{\dimen@=\frmradius@@
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@
+ {\circled@\dimen@}\advance\dimen@-2.1\p@ \circled@\dimen@}%
+ \fi}
+
+\xydef@\circled@#1{\setboxz@h\bgroup \R@=#1\relax
+ \setboxz@h{\vbox{\circled@x@@}}%
+ \A@=\X@c \advance\A@-.5\wd\z@
+ \B@=\Y@c \advance\B@-.5\ht\z@ \advance\B@.5\dp\z@ \advance\B@.2\p@
+ \edef\tmp@{\egroup\dimen@=\the\wdz@}%
+ \kern\A@ \raise\B@\boxz@
+ \tmp@ \divide\dimen@4 \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+
+\xydef@\circled@x@{\hbox{\corn@@4\R@ \corn@@3\R@}%
+ \nointerlineskip\hbox{\corn@@1\R@ \corn@@2\R@}}
+\xylet@\circled@x@@=\circled@x@
+\DOCMODE)
+
+The code here is repetitive and could be improved.
+The only purpose of |\let\framehfill=\frm@dashh@@| etc. is to serve
+as a marker for the required style: solid/dashed/dotted.
+
+\DOCMODE(
+\xydefcsname@{frm{.o}}{%
+ \ifx\frmradius@@\z@ \frmDrop@{\let\framehfill=\frm@doth@@
+ \dimen@=.5\L@c \advance\dimen@.5\R@c \circled@\dimen@}%
+ \else
+ \frmDrop@{\let\framehfill=\frm@doth@@ \circled@\frmradius@@}%
+ \fi}
+
+\xydefcsname@{frm{-o}}{%
+ \ifx\frmradius@@\z@ \frmDrop@{\let\framehfill=\frm@dashh@@
+ \dimen@=.5\L@c \advance\dimen@.5\R@c \circled@\dimen@}%
+ \else
+ \frmDrop@{\let\framehfill=\frm@dashh@@ \circled@\frmradius@@}%
+ \fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[ellip]
+
+ Ellipses specified using |\frm{e}| have axis lengths $(R+L)/2$ and
+ $(U+D)/2$, while those with |\frm<|<dimen,dimen>|>{e}| use the given
+ lengths for the axes. |\frm{ee}| makes a double ellipse with outermost
+ ellipse being the same as that of |\frm{e}|.
+
+ Without special support to render the ellipses, either via a <driver>
+ or using the |arc| feature, the ellipse will be drawn as a circle of
+ radius approximately the average of the major and minor axes.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydefcsname@{frm{e}}{\ellipse@whichfrm@\ellipsesolidframed@}%
+\xydefcsname@{frm{.e}}{\ellipse@whichfrm@\ellipsedotframed@}%
+\xydefcsname@{frm{-e}}{\ellipse@whichfrm@\ellipsedashframed@}%
+
+\xydefcsname@{frm{ee}}{\ellipse@whichdblfrm@\ellipsesolidframed@}%
+\xydefcsname@{frm2{.e}}{\ellipse@whichdblfrm@\ellipsedotframed@}%
+\xydefcsname@{frm2{-e}}{\ellipse@whichdblfrm@\ellipsedashframed@}%
+
+\xyletcsnamecsname@{frm[o]{-}}{frm{e}}
+\xyletcsnamecsname@{frm[o]{=}}{frm{ee}}
+\xyletcsnamecsname@{frm[o]{.}}{frm{.e}}
+\xyletcsnamecsname@{frm[o]{--}}{frm{-e}}
+
+\xydef@\ellipse@whichfrm@#1{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{#1\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}\next@ }%
+ \else
+ \frmDrop@{#1\expandafter\ellipsed@i@\frmradius@@,,@@}%
+ \fi}
+
+\xydef@\ellipse@whichdblfrm@#1{%
+ \ifx\frmradius@@\z@
+ \frmDrop@{#1\dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}\next@ }%
+ \else
+ \frmDrop@{#1\expandafter\ellipsed@ei@\frmradius@@,,@@}%
+ \fi}
+
+\xydef@\ellipsed@i@#1,#2,#3@@{\DNii@{,}\DN@{#3}%
+ \ifx\next@\nextii@
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \else \ifx\next@\empty \DN@{#2}%
+ \ifx\next@\empty \DN@{#1}%
+ \dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \else \dimen@=#1\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \fi
+ \else\xywarning@{ignoring extra tokens in elliptical frame: #3 }%
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}%
+ \fi\fi \next@ }
+
+\xydef@\ellipsed@ei@#1,#2,#3@@{\DNii@{,}\DN@{#3}%
+ \ifx\next@\nextii@
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}%
+ \else \ifx\next@\empty \DN@{#2}%
+ \ifx\next@\empty \DN@{#1}%
+ \dimen@=.5\L@c \advance\dimen@.5\R@c
+ \dimen@ii=.5\U@c \advance\dimen@ii.5\D@c
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}%
+ \else
+ \dimen@=#1\relax
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@}}%
+ \fi
+ \else\xywarning@{ignoring extra tokens in elliptical frame: #3 }%
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@e@{\the\dimen@}{\the\dimen@ii}}%
+ \fi\fi \next@ }
+
+\xydef@\ellipsed@e@#1#2{%
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}\next@
+ \dimen@=#1\relax \dimen@ii=#2\relax
+ \ifdim\dimen@>2\p@ \advance\dimen@-2\p@ \else \dimen@=\z@\fi
+ \ifdim\dimen@ii>2\p@ \advance\dimen@ii-2\p@ \else \dimen@ii=\z@\fi
+ \edef\next@{\noexpand\ellipsed@{\the\dimen@}{\the\dimen@ii}}\next@ }%
+
+\xydef@\ellipsed@#1#2{\setboxz@h\bgroup \relax
+ \setboxz@h{\vbox{\ellipsed@x@@{#1}{#2}}}%
+ \A@=\X@c \advance\A@-.5\wd\z@
+ \B@=\Y@c \advance\B@-.5\ht\z@ \advance\B@.5\dp\z@ \advance\B@.2\p@
+ \edef\tmp@{\egroup\dimen@=\the\wdz@}%
+ \kern\A@ \raise\B@\boxz@
+ \tmp@ \divide\dimen@4 \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+
+\xydef@\ellipsed@i#1#2{{\R@c=#1\relax\L@c=\R@c
+ \U@c=#2\relax\D@c=\U@c \ellipsed@{#1}{#2}}}
+
+\xydef@\ellipsed@x@#1#2{\R@=#1\relax\advance\R@#2\relax
+ \divide\R@\tw@ \circled@x@@ }
+\xylet@\ellipsed@x@@=\ellipsed@x@
+
+\xydef@\ellipsesolidframed@{%
+ \let\framehfill=\frm@solidh@@ \let\framevfill=\frm@solidv@@}
+\xydef@\ellipsedotframed@{%
+ \let\framehfill=\frm@doth@@ \let\framevfill=\frm@dotv@@}
+\xydef@\ellipsedashframed@{%
+ \let\framehfill=\frm@dashh@@ \let\framevfill=\frm@dashv@@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+ \TODO: Allow <frame variant>s like those used for directionals, \ie,
+ |\frm2{-}| should be the same as |\frm{=}|. Add |\frm{o,}| and more
+ brackets.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Brackets}
+??=[brackets]
+
+ The possible brackets are shown in figure~??[f.bfrm] with notes
+ below.
+
+\begin{notescontd}
+
+\note??=[braces]
+
+ "Braces" are just the standard plain \TeX\ large braces inserted
+ correctly in \Xy-pic pictures with the `nib' aligned with the
+ reference point of the object they brace.
+
+\begin{exercise}
+%
+ How do you think the author typeset the following?
+%
+\begin{code}
+\xy
+ (0,0) *+++{A} ;
+ (10,7) *+++{B} **\frm{.}
+ **\frm{^\}} ; **\frm{_\}}
+\endxy
+\end{code}
+$$\docode$$
+%
+\answertext{Here is how:}
+\answercode
+\answertext\displaycode
+\answertext{The trick in the last line is to ensure that the reference point
+ of the merged object to be braced is the right one in each case.}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ They just use the pieces of plain \TeX\ brace delimiters at |\Bigg|
+ size and those of |\overbrace| and |\underbrace|.
+
+\DOCMODE(
+\xydefcsname@{frm{\{}}{\addtoDrop@@{\lbraced}}
+\xydefcsname@{frm{\}}}{\addtoDrop@@{\rbraced}}
+
+\xydefcsname@{frm{^\}}}{\addtoDrop@@{\ubraced}}
+\xydefcsname@{frm{_\}}}{\addtoDrop@@{\dbraced}}
+\DOCMODE)
+
+ The horizontal ones mimick the plain \TeX\ ones quite closely:
+
+\DOCMODE(
+\xydef@\dbraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@ \advance\B@-.5\ht\z@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \advance\A@-.25pt %
+ \kern\A@\raise\B@\hbox{%
+ \hbox to\L@c{$\m@th\bracelu\leaders\vrule\hfil\bracerd$}%
+ \kern.5pt %
+ \hbox to\R@c{$\m@th\braceld\leaders\vrule\hfil\braceru$}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+
+\xydef@\ubraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@\U@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \advance\A@-.25pt %
+ \kern\A@\raise\B@\hbox{%
+ \hbox to\L@c{$\m@th\braceld\leaders\vrule\hfil\braceru$}%
+ \kern.5pt %
+ \hbox to\R@c{$\m@th\bracelu\leaders\vrule\hfil\bracerd$}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\DOCMODE)
+
+ The inserted extra |.5pt| at |(1)| is the authours
+ responsibility\dots
+
+ The vertical ones repeat the above for the vertical brace extension
+ characters:
+
+\DOCMODE(
+{\catcode`\"=12 %
+ \global\mathchardef\braceur="338 %
+ \global\mathchardef\braceul="339 %
+ \global\mathchardef\bracedr="33A %
+ \global\mathchardef\bracedl="33B %
+ \global\mathchardef\bracecl="33C %
+ \global\mathchardef\bracecr="33D %
+ \global\mathchardef\bracec="33E }
+
+\xydef@\lbraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecl$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \kern\A@\raise\B@\vbox{\vbox to\U@c{%
+ \nointerlineskip\hbox{$\m@th\braceur$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.4\dimen@
+ \nointerlineskip\hbox{$\m@th\bracecl$}\kern-.5\dimen@ii}%
+ \nointerlineskip\vbox to\D@c{\kern.5\dimen@ii
+ \kern-.4\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedr$}\kern\z@}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+
+\xydef@\rbraced{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@\R@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecr$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \kern\A@\raise\B@\vbox{\vbox to\U@c{%
+ \nointerlineskip\hbox{$\m@th\braceul$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.4\dimen@
+ \nointerlineskip\hbox{$\m@th\bracecr$}\kern-.5\dimen@ii}%
+ \nointerlineskip\vbox to\D@c{\kern.5\dimen@ii
+ \kern-.4\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedl$}\kern\z@}}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\DOCMODE)
+
+ An \emph{ad hoc} correction to compensate for the `undershoot' of
+ top/bottom segments is added at |(1)|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[paren]
+
+ "Parenthesis" are like braces except they have no nib and thus do not
+ depend on where the reference point of $c$ is.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydefcsname@{frm{(}}{\addtoDrop@@{\lparenthesized}}
+\xydefcsname@{frm{)}}{\addtoDrop@@{\rparenthesized}}
+
+\xydefcsname@{frm{^)}}{\addtoDrop@@{\uparenthesized}}
+\xydefcsname@{frm{_)}}{\addtoDrop@@{\dparenthesized}}
+\DOCMODE)
+
+ The horizontal ones repeat the braces only without a nib:
+
+\DOCMODE(
+\xydef@\dparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@ \advance\B@-.5\ht\z@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \dimen@=\L@c \advance\dimen@\R@c
+ \kern\A@\raise\B@\hbox to\dimen@{%
+ $\m@th\bracelu\leaders\vrule\hfil\braceru$}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+
+\xydef@\uparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@\U@c
+ \setboxz@h{$\m@th\bracelu$}\dimen@=2\wdz@
+ \ifdim\R@c<\dimen@ \R@c=\dimen@ \fi
+ \ifdim\L@c<\dimen@ \advance\A@-\dimen@ \advance\A@\L@c \L@c=\dimen@ \fi
+ \dimen@=\L@c \advance\dimen@\R@c
+ \kern\A@\raise\B@\hbox to\dimen@{%
+ $\m@th\braceld\leaders\vrule\hfil\bracerd$}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\DOCMODE)
+
+ The vertical ones are very like braces including the ad hoc
+ correction.
+
+\DOCMODE(
+\xydef@\lparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@-\L@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecr$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \dimen@ii\U@c \advance\dimen@ii\D@c
+ \kern\A@\raise\B@\vbox to \dimen@ii{%
+ \nointerlineskip\hbox{$\m@th\braceur$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedr$}\kern\z@}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+
+\xydef@\rparenthesized{\xy@@{\setboxz@h{%
+ \A@=\X@c \advance\A@\R@c \B@=\Y@c \advance\B@-\D@c
+ \setboxz@h{$\m@th\bracecr$}\dimen@ii=\dp\z@ \advance\A@-.5\wdz@
+ \setboxz@h{$\m@th\bracec$}\dimen@=\dp\z@
+ \ifdim\U@c<.5\dimen@ \U@c=.5\dimen@ \fi
+ \ifdim\D@c<.5\dimen@ \advance\B@-.5\dimen@ \advance\B@\D@c \D@c=.5\dimen@ \fi
+ \advance\U@c.6\p@ \advance\D@c.6\p@ \advance\B@-.6\p@
+ \dimen@ii\U@c \advance\dimen@ii\D@c
+ \kern\A@\raise\B@\vbox to \dimen@ii{%
+ \nointerlineskip\hbox{$\m@th\braceul$}%
+ \kern-.61\dimen@ \cleaders\copy\z@\vfil \kern-.61\dimen@
+ \nointerlineskip\hbox{$\m@th\bracedl$}\kern\z@}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notescontd}
+
+ \BUG: The brackets above require that the computer modern |cmex| font
+ is loaded in \TeX\ font position~3.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Filled regions}
+
+ In addition to the above there is a special frame that ``fills'' the
+ inside of the current object with ink: ??c![\frm{*}] and
+ ??c![\frm{**}]; the latter is intended for \emph{emphasizing\/} and
+ thus ``strokes'' the outline, using the thinnest black line available
+ on the printer or output device; furthermore it moits the actual
+ filling in case this would obscure further text typeset on top.
+ Some alteration to the shape is possible, using |*\frm<dimen>{*}|.
+ Hence rectangular, oval, circular and elliptical shapes can be
+ specified for filling.
+ The following examples illustrate this in each case:
+%
+\begin{center}
+\def\X[#1]#2{\relax\xy*=<2em>{}*=<3em,1.4em>[#1][F.]{}#2\endxy}%
+\begin{tabular}{cccc}
+\hline
+ \strut<object> & |\frm{*}| & |\frm{**}| & |\frm<6pt>{*}| \\
+\hline
+ \X[]{} & \X[]{*\frm{*}} & \X[]{*\frm{**}} & \X[]{*\frm<6pt>{*}} \\
+ \X[o]{} & \X[o]{*\frm{*}} & \X[o]{*\frm{**}} & \X[o]{*\frm<6pt>{*}} \\
+\hline
+\end{tabular}
+\end{center}
+%
+ However, filling non-rectangular shapes will result in a rectangle
+ unless a driver is used that supports arbitrary filling. With some
+ drivers the above fills will thus all be identical, as rectangular.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+When the previous <object> has |\rectangleEdge| then the shape is either
+oval or rectangular, depending on whether a <dimen> has been specified,
+using the <dimen> as radius for the corners, but not exceeding half the
+shorter side-length.
+
+When the current <object> has |\circleEdge| then the region is elliptical,
+using the extents |R+L| and |U+D| as the major/minor axes, or circular
+if a <dimen> is specified. The <dimen> will become the radius after reducing
+to a maximum of half the longest side of the enclosing rectangle.
+With |\zeroEdge| presume rectangular, or circular if a <dimen> is supplied.
+
+The default for |\frm{**}| is to just make a plain frame.
+
+\DOCMODE(
+\xydefcsname@{frm{*}}{%
+ \expandafter\frmDrop@\expandafter{%
+ \expandafter\def\expandafter\prevEdge@@\expandafter{\prevEdge@@}%
+ \frame@fill@@\frmradius@@}}
+
+\xydefcsname@{frm{**}}{%
+ \expandafter\frmDrop@\expandafter{%
+ \expandafter\def\expandafter\prevEdge@@\expandafter{\prevEdge@@}%
+ \frame@emph@@\frmradius@@}}
+
+\xydef@\frame@fill@#1{\filled@{#1}\empty}
+\xydef@\frame@emph@#1{\framed@\frmradius@@}
+
+\xylet@\frame@fill@@=\frame@fill@
+\xylet@\frame@emph@@=\frame@emph@
+
+\xydef@\filled@#1{\R@=#1\relax
+ \expandafter\DNii@\expandafter{\prevEdge@@}%
+ \DN@{\rectangleEdge}\ifx\next@\prevEdge@@
+ \ifdim\R@=\z@ \DN@{\filled@Rectangle@}%
+ \else \DN@{\filled@Oval@}\fi
+ \else \DN@{\circleEdge}\ifx\next@\prevEdge@@
+ \ifdim\R@=\z@ \DN@{\filled@Ellipse@}%
+ \else \DN@{\restR@max\filled@Circle@}\fi
+ \else
+ \ifdim\R@=\z@ \DN@{\filled@Rectangle@}%
+ \else \DN@{\filled@Circle@}\fi
+ \fi\fi \next@}
+
+\xydef@\restR@max{%
+ \dimen@=\L@c\advance\dimen@\R@c
+ \dimen@ii=\U@c \advance\dimen@ii\D@c
+ \ifdim\dimen@ii>\dimen@ \dimen@=\dimen@ii\fi
+ \ifdim\dimen@>\z@ \divide\dimen@\tw@
+ \ifdim\R@>\dimen@\R@=\dimen@\fi\fi }
+\DOCMODE)
+
+The default implementation uses only |\bblacked@|, in all cases.
+The distinction between |\frm{*}| and |\frm{**}| can be ignored.
+
+\DOCMODE(
+\xylet@\filledRectangle@@=\bblacked@
+\xylet@\filledCircle@@=\bblacked@
+\xylet@\filledEllipse@@=\bblacked@
+\xylet@\filledOval@@=\bblacked@
+\DOCMODE)
+
+Alternative implementations may use these, in which the parameter |#1|
+is the contents of a |\vbox| filling to the height, depth and width
+of the region to be filled.
+
+\DOCMODE(
+\xydef@\filled@Region@#1#2{\setboxz@h\bgroup
+ \setboxz@h{\vbox{#1#2\empty}}%
+ \A@=\X@c \advance\A@-.5\wd\z@
+ \B@=\Y@c \advance\B@-.5\ht\z@ \advance\B@.5\dp\z@
+ \edef\tmp@{\egroup\dimen@=\the\wdz@}%
+ \kern\A@ \raise\B@\boxz@ \kern-\A@
+ \tmp@ \divide\dimen@\tw@ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \styledboxz@}
+
+\xydef@\filled@Rectangle@{\filled@Region@\filledRectangle@@}
+\xydef@\filled@Oval@{\filled@Region@\filledOval@@}
+\xydef@\filled@Circle@{\filled@Region@\filledCircle@@}
+\xydef@\filled@Ellipse@{\filled@Region@\filledEllipse@@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Framing as object modifier}
+??=[modifier]
+%
+ In addition, frames may be accessed using the special |[F|<frame>|]|
+ object modifier <shape>s that will add the desired <frame> to the
+ current object. The frame appropriate to the edge of the object
+ will be chosen (presently either rectangular or elliptical).
+
+ If shape modifiers need to be applied to the <frame> alone then they
+ can be included using |:| as separator. Thus |[F-:red]| will make a
+ red frame (provided the color extension is active, of course).
+ Additionally the variant of frames using |<|<dimen>|>| can be
+ accessed by specifying |[|\dots|:<|<dimen>|>]|.
+
+\DOCMODE(
+\xydefcsname@{shape [F...]}#1{\xyFN@\Fshape@#1:@}
+
+\xylet@\whichframe@@=\empty
+\xylet@\whichoptions@@=\empty
+
+\xydef@\Fshape@#1:{\def\whichframe@@{{#1}}%
+ \DN@{{}}\ifx\whichframe@@\next@ \def\whichframe@@{{-}}\fi
+ \expandafter\DN@\expandafter{\the\Edge@c}\DNii@{\circleEdge}\ifx\next@\nextii@
+ \DN@##1{\def\whichframe@@{[o]##1}}%
+ \expandafter\next@\expandafter{\whichframe@@}\fi
+ \let\whichoptions@@=\empty \xyFN@\Fshape@i}
+
+\xydef@\Fshape@i{%
+ \ifx @\next \let\next@=\Fshape@x
+ \else\addLT@\ifx\next \let\next@=\Fshape@iii
+ \else \let\next@=\Fshape@ii \fi\fi \next@}
+
+\xydef@\Fshape@ii#1:{%
+ \expandafter\def\expandafter\whichoptions@@\expandafter{\whichoptions@@[#1]}%
+ \xyFN@\Fshape@i}
+
+\xydef@\Fshape@iii#1:{\DN@##1{\def\whichframe@@{#1##1}}%
+ \expandafter\next@\expandafter{\whichframe@@}\xyFN@\Fshape@i}
+
+\xydef@\Fshape@x @{%
+ \edef\next@##1{\noexpand\addbeforeDrop@@{{\EdgefromtheEdge@##1}}}%
+ \DNii@##1##2{\next@{\saveframestyles@{\setbox\z@=\object##2\frm##1%
+ \xypre@Style@@\Drop@@\xypost@Style@@\restoreframestyles@}}}%
+ \expandafter\expandafter\expandafter\nextii@
+ \expandafter\expandafter\expandafter{%
+ \expandafter\whichframe@@\expandafter}\expandafter{\whichoptions@@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The following are used to ensure that the current styles, after
+ typesetting, are those of the <object>, rather than the <frame>.
+
+\DOCMODE(
+\xydef@\saveframestyles@{%
+ \edef\afterframe@preStyle@{\preXY@style@}%
+ \edef\afterframe@postStyle@{\postXY@style@}}
+
+\xydef@\restoreframestyles@{%
+ \xdef\preXY@style@{\afterframe@preStyle@}\def\afterframe@preStyle@{}%
+ \xdef\postXY@style@{\afterframe@postStyle@}\def\afterframe@postStyle@{}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Here are some simple examples using this feature.
+%
+\begin{code}
+\xy *+<1.5pt>[F**:white]++[F**:red]
+\txt{text with background}
+,+!D+/d1pc/,*++[F**:black][white]
+\txt\bf{bold white on black}\endxy
+\end{code}
+$$\docode$$
+\displaycode
+Notice that when multiple frame-modifiers are used, the frames
+are actually placed in reverse order, so that earlier ones
+are printed on top of later ones.
+
+ \TODO: The frame option is not quite complete yet: some new frames
+ and several new brackets should be added.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Using curves for frames}
+??=[curved frames]
+%
+ If the curve option is loaded, then circular and elliptical frames of
+ arbitrary radius can be constructed, by specifying |\UseCurvedFrames|.
+ This can be negated by |\UseFontFrames|. Both of these commands obey
+ normal \TeX\ grouping. Furthermore, dotted and dashed frames now have
+ a regular spacing of their constituent objects. The usual warnings
+ about memory requirements for large numbers of curves apply here also.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Use the |\xycircle| setup in |xycurve.doc| to implement circular
+and elliptical frames.
+
+\DOCMODE(
+\xydef@\xycircleframe@x@{\L@=\R@ \xycircleframe@x@i}%
+\xydef@\xyellipseframe@x@#1#2{\R@=#1\relax \L@=#2\relax \xycircleframe@x@i}
+
+\xydef@\xycircleframe@x@i{%
+ \ifx\framehfill\frm@solidh@@\def\circleSTYLE@{}%
+ \else\ifx\framehfill\frm@doth@@
+ \expandafter\def\expandafter\circleSTYLE@\expandafter{\addDOT@{}}%
+ \else\ifx\framehfill\frm@dashh@@
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter
+ \expandafter\circleSTYLE@\expandafter\expandafter\expandafter
+ {\expandafter\addDASH@\addDASH@{}}%
+ \fi\fi\fi \xycircleframe@x@x }
+
+\xydef@\xycircleframe@x@x{\hbox{\vbox{\vskip\L@
+ \hbox to2\R@{\hfill \buildcircle@ \hfill}\vskip\L@ }}}
+
+\xydef@\UseCurveFrames@{%
+ \let\circled@x@@=\xycircleframe@x@
+ \let\ellipsed@x@@=\xyellipseframe@x@ }
+\def\UseCurveFrames{\xywithoption{curve}{\UseCurveframes@}}%
+
+\xydef@\UseFontFrames@{%
+ \let\circled@x@@=\circled@x@
+ \let\ellipsed@x@@=\ellipsed@x@ }
+\xylet@\UseFontFrames=\UseFontFrames@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Finally, the frame extension is added to the <driver> system:
+
+\DOCMODE(
+\xydef@\UnloadFrames@{%
+ \let\framed@body@@=\framed@body@
+ \let\circled@x@@=\circled@x@
+ \let\ellipsed@x@@=\ellipsed@x@
+ \let\frame@fill@@=\frame@fill@
+ \let\frame@emph@@=\frame@emph@
+ \let\filledRectangle@@=\bblacked@
+ \let\filledCircle@@=\bblacked@
+ \let\filledEllipse@@=\bblacked@
+ \let\filledOval@@=\bblacked@
+}
+
+\xyaddunsupport{frame}\UnloadFrames@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{End \& log}
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyframe.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/05 22:11:03 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% NEW for version 2.7 based on frame code in xypic.doc 2.6.1.1.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs how we are formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% TeX-parse-self:nil
+% LaTeX-indent-level:1
+% TeX-brace-indent-level:1
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xygraph.doc b/Master/texmf-dist/source/generic/xypic/xygraph.doc
new file mode 100644
index 00000000000..718d12a2182
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xygraph.doc
@@ -0,0 +1,710 @@
+%% $Id: xygraph.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Graph Combinator feature'' option.
+%% Copyright (c) 1994-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{graph}{Graph feature}{\stripRCS$Revision: 3.7 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This option implements `\Xy-graph', a special "combinatoric drawing
+ language" suitable for diagrams like flow charts, directed graphs,
+ and various forms of trees. The base of the language is reminiscent
+ of the PIC~\cite{K82:PIC-LTG} language because it uses a notion of
+ the `current location' and is based on `moves'. But the central
+ construction is a `map' combinator that is borrowed from functional
+ programming.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \Xy-graph makes use of facilities of the `arrow' feature option of
+ \S??g[:arrow], which is therefore required.
+
+\DOCMODE(
+\xyrequire{arrow}\xycatcodes
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Figure~??[f.graph] summarises the syntax of a <graph> with notes
+ below. A <graph> can appear either in an \Xy-picture (as <decor>) or
+ ``stand-alone''.\footnote{In fact \LaTeX\ users can use a |graph|
+ environment.} \NOTE: If you use ??c![\xygraph]|{|\dots|}| inside
+ constructions where |&| is significant (like plain \TeX's
+ ??c![\halign] or \LaTeX's ??c![array] environment) then make sure to
+ add an extra level of braces around it.
+
+\begin{figure*}[tb]
+\begin{syntax}
+%
+ \multispan{3}{{\tt\string\xygraph\string{<graph>\string}}\hfil}
+ & typeset <graph>
+\cr
+\noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+%
+ ??w![<graph>]
+ &\iss & <step>\star
+ & interpret <step>s in sequence
+\cr
+\noalign{\smallskip}
+ ??w![<step>]
+ &\iss & <node>
+ & ??!^[move] to the <node>
+\cr
+ &\orr & |-|<arrow> <node> <labels>
+ & ??!^[draw] line to <node>, with <labels>
+\cr
+ &\orr & |:|<arrow> <node> <labels>
+ & ??!^[draw] <arrow> to <node>, with <labels>
+\cr
+ &\orr & |(| <list> |)|
+ & ??!^[map] current node over <list>
+\cr
+\noalign{\smallskip}
+%
+ ??w![<node>]
+ &\iss & |[| <move> |]|
+ & new node <move>d relative to current
+\cr
+ &\orr & |&| \orr\ |\\|
+ & new node in ??!^[next column/row]
+\cr
+ &\orr & |"|<id>|"|
+ & previously ??!^[saved] node
+\cr
+ &\orr & |?|
+ & currently ??!^[mapped] node
+\cr
+ &\orr & <node> <it>
+ & <node> with <it> ??!^[typeset and saved] there
+\cr
+ &\orr & <node> |=| |"|<id>|"|
+ & <node> ??!^[saved] as |"|<id>|"|
+\cr
+ &\orr & <node> |!| <escape>
+ & augment node with material in another mode
+\cr
+\noalign{\smallskip}
+%
+ ??w![<move>]
+ &\iss & <hop>\star\
+ & ??!^[<hop>s] (|dulr|) from current node
+\cr
+ &\orr & <hop>\star\ <place> <move>
+ & do ??!^[<hop>s] but use its <place> and <move> again
+\cr
+\noalign{\smallskip}
+%
+ ??w![<list>]
+ &\iss & <graph> |,| <list> \orr\ <graph>
+ & ??!^[list of subgraphs]
+\cr
+\noalign{\smallskip}
+%
+ ??w![<escape>]
+ &\iss & |{| <pos> <decor> |}|
+ & ??!^[perform <pos> <decor>]
+\cr
+ &\orr & |M| <matrix>
+ & ??!^[insert <matrix>]
+\cr
+ &\orr & |P| <polygon>
+ & ??!^[insert <polygon>]
+\cr
+ &\orr & |E| <ellipse>
+ & ??!^[insert <ellipse>]
+\cr
+ &\orr & |~| <setup>
+ & ??!^[setup parameters]
+\cr
+\end{syntax}
+\caption{\protect<graph>s}??=[f.graph]
+\end{figure*}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Parsing:}
+
+ The parser does almost everything that this feature does because it
+ is all implemented directly on top of other constructions, notably
+ the kernel stack and the <arrow> construction.
+
+ The graph state always has the current value of |?| both as the
+ stacktop and in the special <id> |"?NODE"|.
+
+\DOCMODE(
+\xydef@\xygraph#1{\relax\graph#1\endgraph}
+
+\xydef@\graph{\if\inxy@ \DN@{\xy@@{\nter@{}}}%
+ \else \DN@{\xy \xy@\xy{\nter@\endxy}}\fi \next@
+ \xy@\xygraph{\senter@ \idfromc@{?NODE}\spushc@
+ \expandafter\let\expandafter\next@\csname Q@graphbase\endcsname
+ \ifx\next@\relax \setbase@\z@\z@{3pc}\z@
+ \else \expandafter\next@ \fi}%
+ \GRAPH[]}
+
+\xydef@\endgraph{\ignorespaces}
+
+\xydef@\GRAPH{\xyFN@\GRAPH@}
+
+\xydef@\GRAPH@{%
+%
+%\W@{GRAPH: next=\meaning\next}%
+%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\GRAPH@}%
+ \else\ifx :\next \DN@:{\xy@:{}\expandafter\GRAPHar@\GRAPHeveryarrow@@}%
+ \else\addDASH@\ifx\next
+ \addDASH@\DN@{\xy@-{}\expandafter\GRAPHar@\GRAPHeveryline@@}%
+ \else\ifx (\next
+ \DN@({\xy@({\spushid@{?NODE}\idfromc@{?NODE}}\xyFN@\GRAPH@}%
+ \else\ifx ,\next
+ \DN@,{\xy@,{\cfromid@{?NODE}}\xyFN@\GRAPH@}%
+ \else\ifx )\next
+ \DN@){\xy@){\cfromid@{?NODE}%
+ \tests@\z@{\idfroms@{?NODE}\z@ \spop@}{\xyerror@{) without (}{}}}%
+ \xyFN@\GRAPH@}%
+ % HACK: ONLY POP WHEN NONEMPTY...WHY EVER NONEMPTY?
+ \else\ifx \endgraph\next \DN@{\xy@@{\tests@\z@\spop@\sleave@\leave@}}%
+ \else\ifx \end\next \DN@{\xy@@{\tests@\z@\spop@\sleave@\leave@}}%
+ \else\ifx ~\next
+ \DN@~{\xy@@{\enter@\cfromthec@}\afterNODE{\leave@ \xyFN@\GRAPH@}!}%
+ \else \DN@{\afterNODE{\xyFN@\GRAPH@}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xylet@\GRAPHsaved@PATHafterPOS=\PATHafterPOS
+\xylet@\GRAPHsaved@afterar@@=\afterar@@
+
+\xydef@\GRAPHar@{%
+ \let\PATHafterPOS=\afterNODE \let\afterar@@=\GRAPHafterar@ \ar}
+
+\xydef@\GRAPHafterar@{%
+ \let\PATHafterPOS=\GRAPHsaved@PATHafterPOS
+ \let\afterar@@=\GRAPHsaved@afterar@@
+ \xy@@{\cfromid@{}}\xyFN@\GRAPH@}
+
+\xylet@\afterNODE@@=\empty
+
+\xydef@\afterNODE#1{\xy@@{\enter@\pfromthep@}%
+ \DN@##1{\def\afterNODE@@{\xy@@\leave@ \def\afterNODE@@{##1}#1}}%
+ \expandafter\next@\expandafter{\afterNODE@@}%
+ \xyFN@\NODE@}
+
+\xylet@\theMOVE@@=\relax
+
+\xydef@\NODE@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@}%
+ \else\ifx [\next \DN@[##1]{\xy@{[##1]}{}%
+ \def\theMOVE@@{[##1]}\xyFN@\MOVE@##1]}%
+ \else\ifx "\next \DN@ "##1"{%
+ \xy@{"##1"}{\cfromid@{##1}}\def\theMOVE@@{"##1"}\xyFN@\NODE@i}%
+ \else\ifx ?\next \DN@ ?{%
+ \xy@?{\cfromid@{?NODE}}\def\theMOVE@@{?}\xyFN@\NODE@i}%
+ \else\ifx !\next \def\theMOVE@@{[]}\let\next@=\NODE@i
+ \else \testAND@\iffalse
+ \DN@##1{\xy@{}{\pfromc@ \advance\X@c\X@xbase \advance\Y@c\Y@xbase
+ \czeroEdge@}\jumpMOVE@ \xyFN@\NODE@i}%
+ \else\ifx \\\next
+ \DN@\\{\xy@\\{\pfromc@ \advance\X@c\X@xbase \advance\Y@c\Y@xbase
+ \R@c=\X@ybase \U@c=\Y@ybase \intersect@
+ \advance\X@c-\X@ybase \advance\Y@c-\Y@ybase
+ \czeroEdge@}\def\theMOVE@@{\\}\xyFN@\NODE@i}%
+ \else \xyerror@{Illegal <node>: \string`\meaning\next\string' unexpected}{}%
+ \fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\jumpMOVE@@{&}
+\xydef@\jumpMOVE@{\let\theMOVE@@=\jumpMOVE@@}
+
+\xydef@\MOVE@{\xy@@{\count@=\z@ \count@@=\z@}%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\MOVE@}%
+ \else\ifcat A\noexpand\next \let\next@=\MOVE@letter
+ \else \let\next@=\MOVE@x \fi\fi \next@}
+
+\xydef@\MOVE@letter{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\MOVE@letter}%
+ \else\ifx u\next \DN@ u{\xy@@{\advance\count@\@ne}\xyFN@\MOVE@letter}%
+ \else\ifx d\next \DN@ d{\xy@@{\advance\count@\m@ne}\xyFN@\MOVE@letter}%
+ \else\ifx l\next \DN@ l{\xy@@{\advance\count@@\m@ne}\xyFN@\MOVE@letter}%
+ \else\ifx r\next \DN@ r{\xy@@{\advance\count@@\@ne}\xyFN@\MOVE@letter}%
+ \else \let\next@=\MOVE@x \fi\fi\fi\fi\fi \next@}
+
+\xydef@\MOVE@x{%[[
+ \ifx ]\next \DN@ ]{\MOVE@hop \xyFN@\NODE@i}%
+ \else\ifx (\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%)
+ \else\ifx !\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\ifx /\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\addLT@\ifx\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\addGT@\ifx\next \DN@{\MOVE@hop \xyFN@\MOVE@place}%
+ \else\addDASH@\ifx\next \addDASH@\DN@{\xyerror@{- not implemented yet}{}}%
+ \else \xyerror@{illegal <move>: \codeof\theMOVE@@}{}\let\next@=\NODE@i
+ \fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\MOVE@hop{\xy@@{\pfromc@ \czeroEdge@
+ \edef\next@{\the\count@@,\the\count@ @}\expandafter\vfromcartesian@@\next@
+ \advance\X@c-\X@origin \advance\Y@c-\Y@origin
+ \advance\X@c\X@p \advance\Y@c\Y@p}}
+
+\xydef@\MOVE@place{\xy@@\no@@ \afterPLACE{\xyFN@\MOVE@}}
+
+\xydef@\NODE@i{\let\next@=\NODE@x
+%
+%\W@{NODE@i: next=\meaning\next}%
+%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@i}%
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@"##1"{\xy@{="##1"}{\idfromc@{##1}}\xyFN@\NODE@i}%
+ \else\ifx !\next \DN@!{\xyFN@\NODE@escape}%
+ \else\ifx :\next
+ \else\addDASH@\ifx\next
+ \else\ifx (\next
+ \else\ifx ,\next
+ \else\ifx )\next
+ \else\ifx ~\next
+ \else\ifx [\next
+ \else\ifx "\next
+ \else\ifx ?\next
+%
+ \else\ifx ^\next
+ \else\ifx _\next
+ \else\ifx |\next
+ \else\addLQ@\ifx\next
+ \else\addRQ@\ifx\next
+%
+ \else \testAND@ \iffalse
+ \else\ifx \\\next
+%
+ \else\ifx \endgraph\next
+ \else\ifx \end\next
+%
+ \else \let\next@=\NODE@it
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\NODE@x{\xy@@{\idfromc@{}}\afterNODE@@}
+
+\xydef@\NODE@it{\let\PATHlabelit@@=\NODEit@ \PATHit@}
+
+{\xyuncatcodes \gdef\next{+}}
+\xylet@\GRAPHnodemodifiers@@=\next
+
+\xydef@\NODEit@#1{%
+ \DN@{#1}\ifx\next@\empty
+ \DN@{\expandafter\NODEit@i\expandafter{\GRAPHnodemodifiers@@}}%
+ \else \DN@{\NODEit@i{#1}}\fi \next@}
+
+\def\NODEit@i#1#2{\xy@{*#1{#2}}{\drop@{#1}{#2}}%
+ \DN@{\addEQ@\ifx\next\else \xy@@{\idfromc@{#2}}\fi \NODE@i}%
+ \xyFN@\next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{notes}
+%
+\note??=[move]
+%
+ A "move" is to establish a new "current node".
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[draw]
+%
+ To "draw" something is simply to draw a line or the specified <arrow>
+ from the current node to the specified target node. The target then
+ becomes the current node. All the features of arrows as described
+ in~\S??g[:arrow] can be used, in particular arrows can be labelled and
+ segmented, but with the change that <path-pos> means <node> as
+ explained in note~\S??g[xyarrow.doc:segment].
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[map]??=[mapped]??=[list of subgraphs]
+%
+ To "map over a list" is simply to save the current node and then
+ interpret the <list> with the following convention:
+%
+\begin{itemize}
+\item Start each element of the list with the current node as saved and $p$
+ as the previous list element, and
+\item let the |?| <node> refer to the saved current node explicitly.
+\end{itemize}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[next column/row]
+%
+ The |&| and |\\| special moves are included to make it simple to enter
+ `matrix-like' things as graphs -- note that they will not be
+ automatically aligned, however, for that you should use the |!M|
+ escape.
+
+ |&| is the same as |[r]| and |\\| is the same as
+ |[r]!{y+(0,-1)-(0,0)}| which uses a kernel escape to moves to the
+ first column in the next row (where the first column is on the
+ $y$-axis of the current coordinate system).
+
+ \NOTE: If you use the form |*{|\dots|}| for nodes then you don't
+ have to change them if you decide to use an \Xy-matrix.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[typeset and saved]??=[saved]
+%
+ Typeset <it> and make it the current node. Also saves <it> for later
+ reference using |"|<id>|"|: if <it> is a simple letter, or digit,
+ then just as |"|<it>|"|; if <it> is of the form
+ |{|"text"|}| or |*|\dots|{|"text"|}| then as |"|"text"|"|.
+
+ With the |=| addition it is possible to save explicitly in case
+ several nodes have the same text or a node has a text that it is
+ impractical to use for reference. In fact using the form
+ <it>|="|<id>|"| will "only" save the node as |"|<id>|"| and "not" as
+ |"|<it>|"|! As a special convenience |""| (thus the empty <id>)
+ always refers to the last completed node, so adding |=""| after a
+ node merely means it should "not" be saved under its proper name.
+
+\begin{exercise}
+ How did the author typeset this?
+%
+\begin{code}
+\xygraph{
+ []A="A1" :@/^/ [r]A
+ :@/^/ [r]A
+ :@/^/ "A1" }
+\end{code}
+$$\docode$$
+%
+\answercode
+\answertext{The first $A$ was named to allow reference from the last:
+ \displaycode}
+\end{exercise}
+
+\note??=[<hop>s]
+%
+ Moving by a series of "hops" is simply moving in a grid as the
+ sequence of |dulr| (for down/up/left/right) indicates. The grid is a
+ standard cartesian coordinate system with 3pc unit unless the current
+ base is redefined using |[]!{|\dots|}| with an appropriate <pos>ition
+ containing |:| and |::| as described in note~??g[xy.doc:base].
+
+ \TODO: Describe the use of <move>s with <place>s in detail \dots\ in
+ particular (1)~`until perpendicular to \dots' and (2)~`until
+ intercepts with \dots' can be coded\dots
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[perform <pos> <decor>]
+%
+ This `escapes' into the \Xy-pic kernel language and interprets the
+ <pos> <decor>. The current node is then set to the resulting $c$
+ object and the grid from the resulting "base".
+
+ The effect of the <pos> <decor> can be completely hidden from
+ \Xy-graph by entering it as |{\save| <pos> <decor> |\restore}|.
+
+\DOCMODE(
+\xydef@\NODE@escape{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\NODE@escape}%
+ \else\ifcat A\noexpand\next \DN@##1{\rungraphescape@{##1}}%
+ \else\ifcat !\noexpand\next \DN@##1{\rungraphescape@{##1}}%
+ \else\ifx \bgroup\next \DN@##1{\xy@{!{##1}}{}\POS##1\relax \xyFN@\NODE@i}%
+ \else\ifx ~\next \let\next@=\graphsetup@
+ \else \DN@{\xyerror@{Unknown graph <escape>}{}\xyFN@\NODE@i}%
+ \fi\fi\fi\fi\fi \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[insert <matrix>]
+%
+ It is possible to insert a <matrix> in a graph provided the `matrix'
+ option described in~\S??g[:matrix] has been loaded: it overwrites the
+ node with the result of |\xymatrix|<matrix>. Afterwards the graph
+ grid is set as the top left `square' of the matrix, \ie, with |[d]|
+ and |[r]| adjusted as they work in the top left entry.
+
+ \BUG: |[dr]| immediately after the matrix will work as expected, \eg,
+ make the center of |"2,2"| the current node, but others might not, \eg,
+ |[rr]| will not necessarily place the current node on top of |"1,3"|.
+
+\DOCMODE(
+\xydefcsname@{graph !M}#1#{\NODE@matrix{#1}}
+
+\xydef@\NODE@matrix#1#2{\xyerror@{matrix feature not loaded}{}\xyFN@\GRAPH@}
+
+\xydef@\NODE@matrix@#1#2{\xy@{!M#1{#2}}{}%
+ \def\everyentry@{\GRAPHeveryentry}%
+ \xymatrix#1{#2}%
+ \let\everyentry@=\empty \insertmatrixingraph@ \xyFN@\NODE@i}
+
+\xydef@\GRAPHeveryentry{\def\:{\ar}\def\="##1"{\xy@@{\idfromc@{##1}}}}
+
+\xywithoption{matrix}{\let\NODE@matrix=\NODE@matrix@}
+
+\xydef@\insertmatrixingraph@{%
+ \xy@@{\enter@{\cfromthec@ \pfromthep@}%
+ \expandafter\let\expandafter\next@\csname Q@1,1\endcsname
+ \ifx\next@\relax\else
+ \next@ \swap@
+ \expandafter\let\expandafter\next@\csname Q@1,2\endcsname
+ \ifx\next@\relax\else \next@ \setbase@\X@p\Y@p\X@c\Y@c
+ \expandafter\let\expandafter\next@\csname Q@2,1\endcsname
+ \ifx\next@\relax\else
+ \next@ \setbase@@{-\X@c}{-\Y@c}\fi\fi\fi
+ \leave@}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[insert <polygon>]??=[insert <ellipse>]
+%
+ It is possible to insert a <polygon> or an <ellipse> in a graph
+ provided the |poly| option described in~\S??g[:poly] or the |arc|
+ option described in~\S??g[:arc] has been loaded, respectively:
+ it will have $c$ as the current node, $p$ as the previous one, and
+ the the current base has the <hop>s |[r]| and |[u]| as base vectors.
+
+ \NOTE: lattices, knots, \etc, can also be used but no special syntax
+ is useful since the |!{|\dots|}| syntax is adequate.
+
+\DOCMODE(
+\xydefcsname@{graph !P}#1#{\NODE@poly{#1}}
+\xydef@\NODE@poly#1#2{\xyerror@{poly(gon) feature not loaded}{}\xyFN@\GRAPH@}
+\xydef@\NODE@poly@#1#2{\xy@{!P#1{#2}}{}\xypoly@#1{#2}\xyFN@\NODE@i}
+\xywithoption{poly}{\let\NODE@poly=\NODE@poly@}
+
+\xydefcsname@{graph !E}#1#{\NODE@arc{#1}!}
+\xydef@\NODE@arc#1#2{\xyerror@{(ellipse+)arc feature not loaded}{}%
+ \xyFN@\GRAPH@}
+\xydef@\NODE@arc@#1#2{\xy@{!E#1{#2}}{}\ellipse#1{#2}\xyFN@\NODE@i}
+\xywithoption{arc}{\let\NODE@arc=\NODE@arc@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[setup parameters]
+%
+ This allows setting of some parameters of the graph: |!~|<setup>
+ should be one of the following:
+%
+\begin{defs}
+%
+ |!~:{| <arrow> |}| & include with every |:| arrow \cr
+ |!~-{| <arrow> |}| & include with every |-| line \cr
+ |!~*{| <modifiers> |}| & include with every non-|*| node \cr
+ |!~|<letter>|{| <graph> |}| & define new graph escape |!|<letter>
+%
+\end{defs}
+\noindent\unskip
+%
+ These are destructive: the previous value is lost; the default is
+ established by the sequence |!~:{}| |!~-{@{-}}| |!~*{+}| making |:|
+ create simple arrows, |-| plain lines, and formatting default nodes
+ in math mode with the default objectmargin.
+
+\DOCMODE(
+\xylet@\GRAPHeveryarrow@@=\empty
+
+{\xyuncatcodes \gdef\next{@{-}}}
+\xylet@\GRAPHeveryline@@=\next
+
+\xydef@\graphsetup@~{\xyFN@\graphsetup@i}
+
+\xydef@\graphsetup@i{%
+ \ifx :\next \DN@:##1{\def\GRAPHeveryarrow@@{##1}\xyFN@\NODE@i}%
+ \else\addDASH@\ifx\next
+ \addDASH@\DN@##1{\def\GRAPHeveryline@@{##1}\xyFN@\NODE@i}%
+ \else\ifx *\next \DN@*##1{\def\GRAPHnodemodifiers@@{##1}\xyFN@\NODE@i}%
+ \else\ifcat A\next \DN@##1##2{\newgraphescape{##1}{##2}\xyFN@\NODE@i}%
+ \else \DN@{\xyerror@{illegal graph setup \codeof\next@}{}\xyFN@\NODE@i}%
+ \fi\fi\fi\fi \next@}
+\DOCMODE)
+
+ The last possibility is also available as a command
+%
+\begin{defs1}
+%
+ ??c![\newgraphescape]|{|<letter>|}{|<graph>|}| \cr
+%
+\end{defs1}
+\noindent\unskip
+%
+ that makes the specified escape generate the <graph> as a macro; with
+ it it is possible to pass arguments to the <graph> using the standard
+ \TeX\ |\def| method: The declaration code
+%
+\begin{code}
+\newgraphescape{i}#1#2{
+ []!{+0="o#2"*=<10pt>{};p!#1**{},"o#2"
+ -/4pt/*!E\cir<2pt>{}
+ +0;p-/:a(-30)24pt/**\dir{-}="X2"
+ ;p-/:a(-60)24pt/="X1"**\dir{-}
+ ;?(.5),="i#2",
+ p-/:a(-60)24pt/**\dir{-},
+ "o#2"."i#2"."X1"."X2"}}
+\end{code}
+{\gdocode}%
+\displaycode\noindent
+%
+ is (rather complicated kernel code) that makes the node escape
+ |!i|$dn$ typeset an `inverter' oriented with the $d$ corner as the
+ output with input named |"i|$n$|"| and output named |"o|$n$|"| such
+ that the graph
+%
+\begin{code}
+\xygraph{ []!iR1 ("i1"[l]x - "i1") - [r]z }
+\end{code}
+\displaycode\noindent
+%
+ will typeset
+$$
+\docode
+$$
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The ??c![\newgraphescape]<letter> declaration defines a macro with
+ name |\graph !|<letter>. It is slightly complicated by the fact that
+ we accept \LaTeX-style |[n]| arguments (when using \LaTeX, that
+ is~\smiley). Thus an internal macro named |\G!|<letter> is defined
+ using the appropriate command definition primitve; this is in turn
+ invoked by |\graph !|<letter> after activating the <graph> parser.
+
+\DOCMODE(
+\xydef@\newgraphescape#1{%
+ \expandafter\let\expandafter\next\csname graph !#1\endcsname
+ \ifx\next\relax\else \expandafter\let\csname G!#1\endcsname=\undefined
+ \xywarning@{Redefining graph <escape> !#1}\fi
+ \expandafter\gdef\csname graph !#1\endcsname{%
+ \expandafter\let\expandafter\next\csname G!#1\endcsname
+ \expandafter\xyFN@\expandafter\NODE@\next}%
+ \DN@{\newgraphescape@{#1}}\xyFN@\next@}
+
+\xydef@\newgraphescape@#1{%
+ \ifx [\next %]
+ \ifx\newcommand\undefined \xyerror@{[n] only with LaTeX}%
+ \else
+ \def\nextiv@{\expandafter\newcommand\expandafter{\csname G!#1\endcsname}}\fi
+ \else \def\nextiv@{\expandafter\gdef\csname G!#1\endcsname}\fi \nextiv@}
+
+\xydef@\rungraphescape@#1{%
+ \expandafter\let\expandafter\next\csname graph !#1\endcsname
+ \ifx\next\relax \xyerror@{Undefined graph <escape> !#1}\fi \next}
+\DOCMODE)
+
+%\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%\note??=[use <prefix>]
+%%
+% This will setup a <prefix> such that all the entries of the graph
+% will get that prefix.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The final exercise illustrates much of the above.
+
+\begin{exercise}
+%
+ Typeset
+%
+\begin{displaymath}
+\begin{code}
+\SelectTips{cm}{}
+\objectmargin={1pt}
+\xygraph{ !{0;(.77,-.77):0}
+ !~:{@{-}|@{>}}
+ w (:[r(.6)]{x_1}
+ ,:[d]z:[r]y:[u(.6)]{x_2}:"x_1":"z"
+ :@( {"w";"z"}, {"y";"z"})"z":"x_2") }
+\end{code}
+\docode
+\end{displaymath}
+%
+\answercode
+\answertext{The author did\displaycode It also shows that one \emph{can} use
+ |{}|s inside delimited arguments \emph{provided} one adds a space to
+ avoid the |{}|s being shaved off!}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{End \& log}
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xygraph.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% New for v3...
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs how we are formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% LaTeX-indent-level:1
+% TeX-brace-indent-level:1
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyguide.man b/Master/texmf-dist/source/generic/xypic/xyguide.man
new file mode 100644
index 00000000000..fa96c7b5c6c
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyguide.man
@@ -0,0 +1,2285 @@
+%% $Id: xyguide.man,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+%%
+%% ``Xy-pic User's Guide''.
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+
+\documentclass{article}
+%begin{latexonly}
+\usepackage{xydoc}
+%end{latexonly}
+\begin{htmlonly}
+\usepackage{xyhtmldoc}
+\end{htmlonly}
+\input{version}
+\CompilePrefix{xygui-}
+\makeindex
+\begin{document}
+
+\title{ \Xy-pic User's Guide }
+\author{ Kristoffer H. Rose\quad<krisrose@ens-lyon.fr>\thanks{%
+ Laboratoire de l'Informatique du Parall\'elisme,
+ Ecole Normale Sup\'erieure de Lyon;
+ 46, All\'ee d'Italie; F--69364 Lyon 7, France.}}
+\date{Version \xyversion, \printdate{\xydate}}
+\maketitle
+
+\begin{abstract}
+%
+ \Xy-pic is a package for typesetting graphs and diagrams using
+ Knuth's \TeX\ typesetting system. \Xy-pic works with most of the
+ many formats available; \eg, plain \TeX, \LaTeX, and \AMS-\TeX.
+ Several styles of input for various diagram types are supported; they
+ all share a mnemonic notation based on the \emph{logical composition
+ of visual components}. This guide concentrates on how to typeset
+ ``matrix-like'' diagrams, such as ??w![commutative diagrams], in the
+ following style:
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix{
+ U \ar@/_/[ddr]_y \ar@/^/[drr]^x
+ \ar@{.>}[dr]|-{(x,y)} \\
+ & X \times_Z Y \ar[d]^q \ar[r]_p
+ & X \ar[d]_f \\
+ & Y \ar[r]^g & Z }
+\end{code}
+%
+\docode
+\end{displaymath}
+%
+was typeset by the \Xy-pic input lines
+%
+\displaycode\noindent
+%
+Such diagrams have the following characteristics:
+%
+\begin{itemize}
+
+\item
+ Specified as a matrix of entries that are automatically aligned in rows and
+ columns.
+
+\item
+ Any entry may be connected to any other entry using a variety of
+ arrow styles all rotated and stretched as required.
+
+\item
+ Arrows may be decorated with labels that are tied to a specified
+ point along the arrow and extend in a particular direction; and
+ arrows may be paired, cross, and visit/bend around other entries ``on
+ the way.''
+
+\end{itemize}
+%
+ Several other styles of input are supported; a short survey of the
+ possibilities is included last at the end along with information on
+ how \Xy-pic can be obtained.
+%
+\end{abstract}
+
+\tableofcontents
+
+
+
+\section*{Preface}\noindent
+\addcontentsline{toc}{section}{Preface}%
+%
+ This guide explains some features of \Xy-pic that are relevant to
+ typesetting of ``matrix-like diagrams'' as used in, for example,
+ category theory; please refer to the reference
+ manual~\cite{RM95:Xy-picRM} for complete information on the described
+ constructions. The guide assumes that you have some experience in
+ using \TeX\ for typesetting mathematics, \eg, have
+ studied~\cite[ch.~16--19]{K84:TeXbook}, \cite[sec.~3.3]{L94:LaTeX},
+ or~\cite{S90:JoyT}, and that \Xy-pic is installed on your \TeX\
+ system as described in the |INSTALL| file accompanying the
+ distribution.
+
+ The first section describes what you need to get started, in
+ particular all that is needed to typeset the diagram in the abstract.
+ Section~??[arrows] and~??[entries] explain advanced use of arrows and
+ entries, respectively. Finally, section~??[avail] explains where and
+ under what conditions \Xy-pic is available, gives the relation of
+ version \xyversion\ to previous versions, and lists further sources
+ of information.
+
+ Throughout we give exercises that you should be able to solve as you
+ go along; all exercises are answered at the end just prior to the
+ references and index.
+
+
+
+\section{Basics}
+??=[basics]
+%
+ This section explains the \Xy-diagram construction concepts needed to
+ get started with typesetting matrix-like diagrams.
+
+
+\subsection{Loading}
+??=[basics.loading]
+%
+ The \Xy-pic setup used in this guide is loaded??w[loading] by
+ inserting the lines
+%
+\begin{defs1}
+ \cs{input} |xy| \cr
+ ??c![\xyoption]|{all}|
+\end{defs1}
+\noindent\unskip
+%
+ in the definitions part of your
+ document.\footnote{??w![\LaTeXe]~\cite{L94:LaTeX} users can use
+ ??c![\usepackage]|[all]{xy}|.} If you wish to load only the
+ features you use, or you wish to use non-standard facilities like the
+ |v2| backwards compatibility mode\footnote{If you use the version~2
+ loading command \cs{input} |xypic| (or the |xypic| document style
+ option) then the ??c![v2] option described in section ??[compat] will
+ be loaded automatically.} or the ??c![ps] \PS\ backend then this is
+ also possible as described in the reference
+ manual~\cite{RM95:Xy-picRM}.
+
+
+\subsection{Entries}
+??=[basics.entries]
+%
+ A diagram is created by the command
+%
+\begin{defs1}
+ ??c![\xymatrix]|{|~\dots~|}|
+\end{defs1}
+\noindent\unskip
+%
+ where the ``\dots'' should be replaced by \emph{entries}??w[entry] to
+ be aligned in \emph{??w![rows]} and \emph{??w![columns]} where
+%
+\begin{itemize}
+
+\item
+ entries in a row are separated by ??c![&],\footnote{Thus when using
+ \protect\Xy-constructions involving |&| inside other tabular
+ constructions then enclose the \protect\Xy-pic construction in an
+ extra pair of braces!} and
+
+\item
+ entire rows are separated by ??c![\\].
+
+\end{itemize}
+%
+ For example,
+\begin{displaymath}
+\begin{code}
+\xymatrix{
+ A &*+[F]{\sum_{i=n}^m {i^2}} \\
+ & {\bullet} & D \ar[ul] }
+\end{code}
+\docode
+\end{displaymath}
+%
+ was typeset by
+%
+\displaycode\noindent
+%
+ Notice the following:
+%
+\begin{itemize}
+
+\item
+ entries are typeset as mathematics (using ``??w![text style]'');
+ entries should not start with a macro (as illustrated by the use of
+ |{}| around |\bullet|\,.
+
+\item
+ all entries are centered and the separation between rows and columns
+ is usually quite large in a diagram,
+
+\item
+ empty entries at the end of rows may be omitted,
+
+\item
+ ``\Xy-decorations'' (here |\ar[ul]|) in entries allow drawing of
+ arrows and such relative to the entries without changing the overall
+ layout, and
+
+\item
+ ``\Xy-modifiers'' (here |*+[F]|) first in entries allow changing the
+ format and shape in many ways.
+
+\end{itemize}
+
+
+
+\subsection{Arrows}
+??=[basics.arrows]
+%
+ An ``??w![arrow]'' in an \Xy-pic diagram is a generic term for the
+ drawn decorations between the entries of the basic matrix structure.
+ In \Xy-pic all arrows must be specified along with the entry in which
+ they start; this is called their \emph{??w![base entry]}. Each
+ particular arrow command then refers explicitly to its
+ \emph{??w![target entry]}. This is obtained using the ??c![\ar]
+ command which accepts many options of which we will describe a few
+ here and some more in section~??[arrows]. In its simplest form an
+ arrow is entered as |\ar[|\emph{hop}|]| where \emph{??w![hop]} is
+ a sequence of single letters: ??c![u] for up, ??c![d] for down,
+ ??c![l] for left, and ??c![r] for right, \eg, the arrow |\ar[ur]|
+ reads ``typeset an arrow from the current entry to that one up and one
+ right.''
+
+\begin{exercise}
+ Which entry does ??C![] refer to?
+\answertext{The target |[]| is the current entry itself.}
+\end{exercise}
+
+\vspace{\medskipamount}\noindent
+%
+ The relative ??w![coordinates] specified in this way are purely
+ logical, \eg, if the diagram contains very wide entries then
+ ``diagonal'' arrows will be nearly horizontal. The constructed arrows
+ are aligned along the line between the centers of the base and target
+ entries; they will not automatically disappear under entries that
+ they cross (we discuss how this is achieved in
+ section~??[arrows.pass]).
+
+ The ??w![arrow style] kan be changed by writing the command as
+ |\ar@|\emph{style}|[|\emph{hop}|]|. This will be described in
+ more detail in section~??[arrows.styles]; here we just list the most
+ common ??c![@]\emph{style}s (obvious variations also work):
+%
+\begin{displaymath}
+\begin{code}
+ \DEF\st#1{\hbox{\lower1ex\rlap{\kern1pc %
+ \xy*{}+/r2pt/\ar@{#1},<1pc,-1.8pc>*{}\endxy}|@{#1}|}}
+ \st{=>}\quad\st{.>}\quad\st{:>}\quad\st{~>}\quad\st{-->}\quad\st{-}\quad\st{}
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+
+\begin{exercise}
+%
+ Typeset
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix{
+ {\bullet} \ar@{--}[d]\ar@{=}[dr]\ar@{-}[r]
+ & {\bullet} \ar@{.}[d] \\
+ {\bullet} & {\bullet} \ar[l] }
+\end{code}
+\docode
+\end{displaymath}
+%
+\answercode
+\answertext{The author did }
+\answerdisplaycode
+\answertext{\noindent Notice how
+ $\bullet$ has been enclosed in |{}| since it is an ``expandable''
+ entity, \ie, a defined macro: this is recommended.}
+\end{exercise}
+
+
+\subsection{Labels}
+??=[basics.labels]
+ You can put ??w![label]s on arrows. Labels are conceptualized as
+ sub- and superscripts on arrows such that they are placed in the
+ usual positions (as ``limits''), \ie, ??c![^] reads ``above'' and
+ ??c![_] ``below'' on an arrow pointing right. Notice that the
+ positions depend \emph{only} on the direction of the arrow, the
+ absolute notions of ``up,'' ``down,'' etc. are not important. For
+ example,
+%
+\begin{code}
+$\xymatrix@1{
+ X\ar[r]^a_b & Y & Z\ar[l]^A_B }$
+\end{code}
+\displaycode\noindent
+%
+ will set \begin{IMAGE}\docode\end{IMAGE} (the ??c![@1] is a
+ special code that can be
+ used for ``one-line'' diagrams to improve the placement on the line;
+ more such spacing codes are described in section~??[entries.resizing]).
+
+ It is possible to use labels that are not single letters, digits, or
+ control sequences: if a simple math formula in the default style
+ (script style) is desired then simply enclose in |{|\dots|}|. In
+ practice anything can be used as a label as described in
+ section~??[arrows.objects].
+
+ Each label is placed perpendicular to the arrow at the point halfway
+ between the centers of the base and target objects. This is usually
+ the most æsthethic, however, in diagrams where the sizes of the
+ entries vary much it is sometimes nicer to place the label at the
+ center of the actual arrow??w[label centered on arrow]. This
+ behaviour is requested by inserting a ??c![-] (minus) right after the
+ |^| or~|_|:
+%
+\begin{code}
+$\xymatrix@1{
+ A\times B\times C\times D \ar[r]^-{+} &B
+}$
+\end{code}
+%
+\begin{IMAGE}
+\docode
+\end{IMAGE} was typeset by
+%
+\displaycode\noindent
+%
+ (it becomes
+%
+\begin{code}
+$\xymatrix@1{
+ A\times B\times C\times D \ar[r]^{+} &B
+}$
+\end{code}
+%
+\begin{IMAGE}
+\docode
+\end{IMAGE}without the~|-|). In fact |-| is in just one of the may
+ possible placings of labels described in section~??[arrows.places].
+
+\begin{exercise}
+%
+ Typeset the second axiom of category theory as
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix{
+ A \ar[r]^f \ar[dr]_{f;g}
+ & B \ar[d]^g \ar[dr]^{g;h} \\
+ & C \ar[r]_h & D }
+\end{code}
+\docode
+\end{displaymath}
+%
+\answercode
+\answertext{The author used }
+\answerdisplaycode
+\end{exercise}
+
+
+\subsection{Breaks}
+??=[basics.breaks]
+ It is also possible to ``??w![break]'' an arrow with a label using the
+ ??c![|] character:
+%
+\begin{code}
+$\xymatrix@1{A\ar[r]|f&B}$
+\end{code}
+%
+ \thecode\ will set
+\begin{IMAGE}
+\docode
+\end{IMAGE}.
+
+ If you just want an empty break you should use the special
+ ??c![\hole] break:
+%
+\begin{code}
+$\xymatrix@1{ A\ar[r]|\hole & B }$
+\end{code}
+%
+ the arrow \begin{IMAGE}\docode\end{IMAGE} was typeset by
+ including \thecode\ in the text.
+
+ A different use of breaks is to place a label somewhere in a diagram
+ outside the normal matrix mesh??w[entry outside matrix]: this is
+ accomplished by ``breaking'' an ??w![invisible arrow] obtained using
+ the ??c![@{}] ??w![arrow style]: the square
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix{\ar @{} [dr] |{=}
+ A \ar[d] \ar[r] & B \ar[d] \\
+ B \ar[r] & C }
+\end{code}
+\docode
+\end{displaymath}
+%
+ was typeset by
+%
+\displaycode\noindent
+%
+ There is more on breaks in section~??[arrows.pass].
+
+\begin{exercise}
+%
+ Typeset the first axiom of category theory as the display
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix{
+ A \ar[d]_f \ar[r]^f
+ & B \ar[dl]|{i_B} \ar[d]^g \\
+ B \ar[r]_g & C }
+\end{code}
+\docode
+\end{displaymath}
+%
+\answercode
+\answertext{The author entered }
+\answerdisplaycode
+\end{exercise}
+
+
+\subsection{Curving}
+??=[basics.bends]
+%
+ Arrows can be made to ??w![curve], for example to avoid going through
+ another entry, using the special style |@/|\emph{curving}|/|. The
+ simplest styles of \emph{curving} are the following, shown applied
+ to an arrow from $A$ to $B$:
+%
+\begin{displaymath}
+\begin{code}
+\DEF\a#1{*\hbox{\DEF\1{#1}\enspace\tt\codeof\1}& A \ar#1[r] & B}
+\xymatrix @R-1.4pc{
+ \a{@/^/} \\
+ \a{@/_/} \\
+ \a{@/_1pc/} }
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}??c[@/^/]??c[@/_/]
+\end{displaymath}
+%
+ As the last example shows a dimension can be inserted just after |^|
+ or |_| if more or less curving is desired.
+
+ In case it is easier to specify the in- and out-going directions of
+ the curving then that is also possible: use
+%
+\begin{defs1}
+ ??c![@(]\emph{in}|,|\emph{out}|)|
+\end{defs1}
+\noindent\unskip
+%
+ where \emph{in} and \emph{out} are one of the following
+ \emph{??w![direction]s}:
+%
+\begin{displaymath}
+\begin{code}
+\xy *=<2pc>[o][F]{}="c",
+ "c"; (-1,-1)**{},p+/3pc/ *+{|dl|} **@{-}?>*@{>},
+ "c"; ( 0,-1)**{},p+/3pc/ *+{|d|} **@{-}?>*@{>},
+ "c"; ( 1,-1)**{},p+/3pc/ *+{|dr|} **@{-}?>*@{>},
+ "c"; ( 1, 0)**{},p+/3pc/ *+{|r|} **@{-}?>*@{>},
+ "c"; ( 1, 1)**{},p+/3pc/ *+{|ur|} **@{-}?>*@{>},
+ "c"; ( 0, 1)**{},p+/3pc/ *+{|u|} **@{-}?>*@{>},
+ "c"; (-1, 1)**{},p+/3pc/ *+{|ul|} **@{-}?>*@{>},
+ "c"; (-1, 0)**{},p+/3pc/ *+{|l|} **@{-}?>*@{>}
+\endxy
+\end{code}
+\docode
+\end{displaymath}
+\noindent\unskip
+%
+ In this case the curving is computed such that the curve begins at the
+ base entry in the \emph{in} direction and ends at the target entry
+ from the \emph{out} direction (this means that $|@(|d_1|,|d_2|)|$
+ and $|@(|d_2|,|d_1|)|$ are mirror images. See
+ section~??[arrows.changing] for more directions).
+
+\begin{exercise}
+%
+ Typeset
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix{
+ x \ar@(ul,dl)[]|{id} \ar@/^/[rr]|f
+ && f(x) \ar@/^/[ll]|{f^{-1}} }
+\end{code}
+\docode
+\end{displaymath}
+%
+\answercode
+\answertext{The author did }
+\answerdisplaycode
+\answertext{\noindent Note that both arrows are
+ curved ``above'' relative to their direction.}
+\end{exercise}
+
+
+\subsection{Speeding up typesetting}
+??=[basics.speeding]
+%
+ One thing that you will notice is that \Xy-pic is sometimes slow in
+ typesetting diagrams (this is to be expected considering the number
+ of drawing operations performed as reflected by the number last in
+ each |xymatrix| message). If you follow the rule of starting all
+ entries with a (nonexpandable) character or |{| then you can insert
+ the declaration
+%
+\begin{defs1}
+ ??c![\CompileMatrices]
+\end{defs1}
+\noindent\unskip
+%
+ in the preamble of your document: this will create temporary
+ files\footnote{The temporary files are named the same as your
+ document but |.tex| is replaced by |-|$n$|.xyc| where $n$ is a
+ sequence number.} containing \emph{compiled} versions of each
+ matrix that can be loaded very quickly; they are automatically
+ recreated when a matrix is changed.
+
+ If this causes some diagrams to not work, then such compilation can be
+ explicitly switched off by using ??c![\xymatrixnocompile] in place of
+ |\xymatrix|. Compilation can be switched off completely with
+ ??c![\NoCompileMatrices] (which respects \TeX\ grouping as does
+ ??c![\CompileMatrices], by the way).
+
+ And if you are still not satisfied with the speed then you can add
+ the following:
+%
+\begin{defs1}
+ ??c![\OnlyOutlines]
+\end{defs1}
+\noindent\unskip
+%
+ which will omit all compiled pictures; the additional command
+ ??c![\ShowOutlines] will add a dotted rectangle outlining the size of
+ the picture.
+
+
+
+\section{More Arrows and Labels}
+??=[arrows]
+%
+ In this section we explain a number of variations of the
+ ??w![arrow]??c[\ar] commands that are useful in ??w![commutative
+ diagrams].
+
+
+\subsection{Explicit label positioning}
+??=[arrows.places]
+%
+ The ??w![label]??w[explicit positioning] commands explained in
+ section~??[basics.labels] place the label text near the point along
+ the arrow halfway between the centers of the base and target entries.
+ This, however, may be changed by inserting a \emph{place} between
+ the ??c![^], ??c![_], or ??c![|], and the actual label (in fact |-|
+ is a \emph{place}). In general you may insert the following:
+%
+\begin{itemize}
+
+\item
+ ??c![<] will place the label at the point where the actual arrow
+ begins, \ie, ``appears from under'' the base, so
+%
+\begin{code}
+$\xymatrix@1{A\ar[r]^<{+}&B}$
+\end{code}
+%
+ \thecode\ will typeset \begin{IMAGE}\docode\end{IMAGE}.
+
+\item
+ Similarly, ??c![>] will place the label at the point where the actual
+ arrow ends, \ie, ``disappears below'' the target, so
+%
+\begin{code}
+$\xymatrix@1{A\ar[r]^>{+}&B}$
+\end{code}
+%
+ \thecode\ will typeset \begin{IMAGE}\docode\end{IMAGE}.
+
+\item
+ ??c![<<] and ??c![>>] will place the following label at a point just
+ a bit\footnote{``A bit'' is in fact a \TeX\ ??c![\jot] which is usually
+ 3pt.}\ further from the beginning and end of the arrow, so
+%
+\begin{code}
+$\xymatrix@1{A\ar[r]^>>{+}&B}$
+\end{code}
+%
+ \thecode\ will typeset \begin{IMAGE}\docode\end{IMAGE}.
+ Using more |<|s or |>|s will move the label further in.
+
+\item
+ A factor in ??c![()]s: $|(|a|)|$ indicates that the label should be
+ ``tied'' to the point $a$ of the way from the center of the base entry
+ (called ??c![(0)]) to the center of the target (called ??c![(1)])
+ instead of in the middle, so
+%
+\begin{code}
+$\xymatrix@1{A\ar[r]^(.3){+}&B}$
+\end{code}
+%
+ \thecode\ will typeset \begin{IMAGE}\docode\end{IMAGE}.
+
+\item
+ A factor can be given \emph{after} some |<| or |>|s, in which case
+ the place is computed as if the base was specified by the
+ |<|s and target specified by the |>|s. Hence
+%
+\begin{code}
+$\xymatrix@1{A\ar[r]^<(0){+}&B}$
+\end{code}
+%
+ \thecode\ will typeset \begin{IMAGE}\docode\end{IMAGE}.
+
+\item
+ Finally, there is a simple way to denote the place on an arrow where
+ it ??w![intersects]??w[crossing arrows] with a straight line between
+ two points: the place |!{|$t_1$|;|$t_2$|}|??c[!{;}] places the label
+ relative to the point on the arrow where the line from the target
+ $t_1$ to the target $t_2$ crosses it. \BUG: Only works for straight
+ arrows at present.
+
+\end{itemize}
+%
+ As usual more possibilities can be found in the reference
+ manual~\cite[fig. 2]{RM95:Xy-picRM}.
+
+\begin{exercise}??=[x.intercept]
+%
+ Typeset
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix{
+ 1 \ar[rr] ^-{1000000x}
+ \ar[dr] _(.2){2000x} |!{[d];[rr]}\hole
+ && 1000000 \\
+ 1000 \ar[r] _{2x}
+ \ar[urr] _>>>>{x^2}
+ & 2000 }
+\end{code}
+\docode
+\end{displaymath}
+%
+\answercode
+\answertext{The author used the display }
+\answerdisplaycode
+\answertext{\noindent In particular
+ notice how the break was specified to happen exactly where the two
+ arrows cross. For an easier but not so general method see
+ exercise~??[x.cube] last in section~??[arrows.pass].}
+\end{exercise}
+
+
+\subsection{Labeling with any object}
+??=[arrows.objects]
+%
+ \Xy-pic supports a general format for entering any \TeX\
+ ??w![text]??w[text label] as labels (as well as entries to be
+ explained later). The character |*| is reserved for this: in its
+ simplest form |*{|\emph{math}|}| will typeset the \emph{math}
+ material as an object. This is like |{|\emph{math}|}| except that
+ the default style is ignored and there is no added blank margin.
+
+ However, in general??w[label with any object] the following form of
+ ??c![*]\emph{object}??w[object] is available:
+%
+\begin{defs1}
+|*|\emph{modifiers}|{|\emph{text}|}|
+\end{defs1}
+\noindent\unskip
+%
+ where \emph{modifiers}??w[object modifier] can be used to change
+ the ??w![shape] and ??w![size] of the constructed object. The
+ following are the most common, the full list of possibilities can be
+ found in the reference manual~\cite[fig. 3]{RM95:Xy-picRM}:
+%
+\begin{defs}
+ ??c![+] & ??w![grow] \cr
+ |+<|\emph{dimen}|>| & grow by \emph{dimen} \cr
+ ??c![+=] & grow to enclosing ??w![square] \cr
+ ??c![-] & ??w![shrink] \cr
+ |-<|\emph{dimen}|>| & shrink by \emph{dimen} \cr
+ ??c![-=] & shrink to contained square \cr
+ ??c![!] & do not center \cr
+ ??C![o] & round??w[round shape] \cr
+ ??C![l] ??C![r] ??C![u] ??C![d] & adjust left, right,\dots??w[adjust] \cr
+ ??C![F] ??C![F=] &
+\begin{IMAGE}
+\xy*[F-]\hbox{\strut~frame~}\endxy
+\end{IMAGE}??w[frame]
+%
+\begin{IMAGE}
+\xy*[F=]\hbox{\strut~double~}\endxy
+\end{IMAGE}??w[double frame]\cr
+ ??C![F.] ??C![F--]
+ &
+\begin{IMAGE}
+\xy*[F.]\hbox{\strut~dotted~}\endxy
+\end{IMAGE}??w[dotted frame]
+%
+\begin{IMAGE}
+\xy*[F--]\hbox{\strut~dashed~}\endxy
+\end{IMAGE}??w[dashed frame]\cr
+ ??C![F-,] ??C![F-:<3pt>]
+ &
+\begin{IMAGE}
+\xy*[F-,]\hbox{\strut~shaded~}\endxy
+\end{IMAGE}??w[shaded frame]
+\begin{IMAGE}
+\xy*[F-:<3pt>]\hbox{\strut~rounded~}\endxy
+\end{IMAGE}??w[rounded frame]
+\end{defs}
+\noindent\unskip
+%
+ Since objects specified this way start with no margin, a single |+|
+ is usually included to get the ??w![default spacing].
+
+\begin{exercise}
+%
+\begin{code}
+\xymatrix@1{ A \ar[r]^*+[o][F-]{x} & B }
+\end{code}
+%
+ Typeset $\smash{\docode}$~.
+%
+\answercode
+\answertext{The author typed }
+\answerdisplaycode
+\end{exercise}
+\vspace{3ex}
+
+ There can only be one \emph{boxing}. This can be any box
+ generation command. The following are the most useful
+ \emph{boxing}|{|\emph{text}|}| combinations:
+%
+%\filbreak
+\begin{defs}
+ ??c![@]\emph{variant}|{|\emph{tip}|}| & ??w![tip] (or ??w![shaft]) object \cr
+ ??c![\txt]|{|\dots|}| & ordinary \emph{??w![text]} \cr
+ ??c![\composite]|{|\dots??c![*]\dots|}| & ??w![combined objects] \cr
+ ??c![\frm]|{}| & ??w![repeat last object]
+\end{defs}
+\noindent\unskip
+%
+ (the possibilities for \emph{variant} and \emph{tip} are given in the
+ following section). Finally, ??c![\hbox]|{|\dots|}|\footnote{The
+ plain \TeX\ command |\hbox| corresponds to |\mbox| in \LaTeX\
+ and |\text| in the \AMS\ variants.} is a quick way to ensure
+ text-mode interpretation of a single object. However, ??c![\txt]
+ allows the use of ??c![\\] in \emph{text} to create a ??w![line
+ break], and the special form |\txt<6pc>{|\dots|}| will constrain the
+ text to a ??w![centered] 6pc wide column. By the way, |\txt| can be
+ used outside of \Xy-pic constructions.
+
+ Finally, several objects can be combined using the last form; the
+ |*|s serve to separate the composed object.
+
+\begin{exercise}
+%
+\begin{code}
+\xymatrix@1{
+ A \ar @{/*\composite{{+}*{\times}}/} [rr]
+ ^*+\txt{High\\label}
+ && B}
+\end{code}
+%
+ Typeset $\docode$~.
+%
+\answercode
+\answertext{The author did }
+\answerdisplaycode
+\end{exercise}
+
+\vskip-\baselineskip
+\subsection{More arrow styles}
+??=[arrows.styles]
+%
+ The ??w![arrow style]s described in section~??[basics.arrows] are all
+ examples of the general \emph{??w![arrow style]} constructions
+%
+\begin{defs1}
+??c![@]\emph{??w![variant]}|{|\emph{??w![tail]} \emph{??w![shaft]}
+ \emph{??w![head]}|}|\cr
+??c![@]\emph{variant}|{|\emph{head}|}|
+\end{defs1}
+\noindent\unskip
+%
+ that in describes arrows with the indicated \emph{tail},
+ \emph{shaft}, and \emph{head} (on the first form the tail and
+ head can be omitted; the second style defaults to having no tail and
+ a standard shaft).??w[arrow head]??w[arrow shaft]??w[arrow tail]
+
+ The following possibilities exist for \emph{head} and \emph{tail}
+ which we will denote \emph{tips} (here shown as heads):
+%
+\begin{unformatteddefs}
+\begin{code}
+{\DEF\DT#1#{\DTx{#1}}
+ \DEF\DTx#1#2{\Dx{#1}{#2}&\xy-(4,0)*{};(4,2)*+{}**{}?>*@#1{#2} **@#1{.}\endxy}
+ \DEF\Dx#1#2{\hbox{\DEF\1{#2}\enspace{\tt\codeof\1}\index code{#2}}}
+ \DEF\Darray#1{{\let\\=\cr \tabskip=2em plus 1fil minus.8em %
+ \halign to\hsize{&\hfil$##$\tabskip=1em&$##$\hfil\tabskip=2em plus 1fil \cr
+ #1\crcr}}}
+ %
+ \Darray{%
+ \DT{<} &\DT{>} &\DT{x} \\
+ \DT{<<} &\DT{>>} &\DT{+} \\
+ \DT{|<} &\DT{>|} &\DT{|} \\
+ \DT{|<<} &\DT{>>|} &\DT{||} \\
+ \DT{(} &\DT{)} &\DT{o} \\
+ \DT{/} &\DT{//}}}
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{unformatteddefs}
+%
+ and the \emph{shaft} should be one of the following:??w[dotted
+ arrow]??w[dashed arrow]??w[squiggly arrow]
+%
+\begin{unformatteddefs}
+\begin{code}
+{\DEF\DC#1#{\DCx{#1}}
+ \DEF\DCx#1#2{ \Dx{#1}{#2} & \xy *+{} ; (12,4)*+{} **@#1{#2}\endxy}
+ \DEF\Dx#1#2{\hbox{\DEF\1{#2}\enspace\tt\codeof\1\index code{#2}}}
+ \DEF\Darray#1{{\let\\=\cr \tabskip=2em plus 1fil %
+ \halign to\hsize{&\hfil$##$\tabskip=1em&$##$\hfil\tabskip=2em plus 1fil \\
+ #1\crcr}}}
+ \Darray{%
+ \DC{-} &\DC{--} \\
+ \DC{~} &\DC{~~} \\
+ \DC{.} }}%
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{unformatteddefs}
+\goodbreak
+%
+ The \emph{variant} should be empty or one of the following:
+%
+\begin{defs}
+??c![^] & ``above'' variant??w[half arrow] \cr
+??c![_] & ``below'' variant \cr
+|2| & ``double'' variant??w[double arrow] \cr
+|3| & ``triple'' variant??w[triple arrow]
+\end{defs}
+\noindent\unskip
+%
+ Here are some standard arrows in this notation, all from $A$ to $B$
+ as usual:
+%
+\begin{displaymath}
+\begin{code}
+\DEF\a#1{*\hbox{\DEF\next{#1}\tt\codeof\next}& A \ar#1[rr] && B}
+\xymatrix @R-1.8pc @C-1pc {
+ \a{@{<->}} \\
+ \a{@^{<->}} \\
+ \a{@_{<->}} \\
+ \a{@2{<->}} \\
+ \a{@3{<->}} }
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+%
+ As a special convenience |=| and |:| are provided as abbreviations
+ for |-| and |.| with variant forced to~|2|.
+
+ As it can be seen, the variant will affect the \emph{entire} arrow.
+ Sometimes this is not what is wanted. In that case a \emph{local
+ variant} can be used by entering any of the \emph{tail},
+ \emph{shaft}, and \emph{head}, on the following form:
+%
+\begin{defs1}
+\emph{variant}|{|\emph{tip}|}|\cr
+\emph{variant}|{|\emph{shaft}|}|
+\end{defs1}
+\noindent\unskip
+%
+ Here are some arrows where this is required:
+%
+\begin{displaymath}
+\begin{code}
+\DEF\a#1{*\hbox{\DEF\next{#1}\tt\codeof\next}& A \ar#1[r] & B}
+\xymatrix @R-1.8pc{
+\a{@{^{(}->}} \\
+\a{@{|-_{>}}} }
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+%
+ Notice that there is no distinction between shafts and tips using
+ this form, thus it is necessary to include all three of
+ \emph{tail}, \emph{shaft}, and \emph{head}, when using it. The
+ advantage is that it is possible then to ``fill with a tip.''??w[tip in
+ shaft]??w[shaft as tip] Furthermore, the following additional
+ possibilities are available when using this notation:
+%
+\begin{unformatteddefs}
+\begin{code}
+{\DEF\DT#1#{\DTx{#1}}
+ \DEF\DTx#1#2{\Dx{#1}{#2}&\xy-(4,0)*{};(4,2)*+{}**{}?>*@#1{#2} **@#1{.}\endxy}
+ \DEF\Dx#1#2{\hbox{\DEF\1{#1{#2}}\enspace{\tt\codeof\1}\index code{#1{#2}}}}
+ \DEF\Darray#1{{\let\\=\cr \tabskip=0pt plus 1fil %
+ \halign to\hsize{&\hfil$##$\tabskip=1em&$##$\hfil\tabskip=1em plus 1fil \cr
+ #1\crcr}\bigskip}}
+ \Darray{%
+ \DT{|-} &\DT^{|-} &\DT_{|-} \\
+ &&\DT {|=} &\DT3{|-} \\
+ \DT{*} &\DT^{`} &\DT_{`} \\
+ &&\DT^{'} &\DT_{'} }}%
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{unformatteddefs}
+\noindent\unskip
+%
+ The even more general form |*|\emph{object} can be used, where
+ \emph{object} refers to any of the constructions described in
+ section~??[arrows.objects].
+
+\begin{exercise}
+%
+\begin{code}
+\xymatrix{
+ A \ar @/^/ @{^{<}-_{>}} [r]
+ \ar @/_/ @{{*}{x}{*}} [r] & B }
+\end{code}
+%
+ Typeset $\docode$~.
+%
+\answercode
+\answertext{The author entered }
+\answerdisplaycode
+\end{exercise}
+
+
+\subsection{Sliding arrows sideways}
+??=[arrows.sliding]
+%
+ It is often desirable to have several ??w![parallel] arrows between
+ two objects. This can be done by ??w![sliding] either or both arrows
+ ??w![sideways] a distance given as a \TeX\ dimension enclosed in
+ ??c![@<>]s: it specifies how far ``sideways'' the arrow should be
+ moved, \eg,
+%
+\begin{code}
+\xymatrix{
+ A \ar@<1ex>[dr]^a_{.} \\
+ & B \ar@<1ex>[ul]^b \ar@<1ex>[r]^c
+ & C \ar@<1ex>[l]^d_{.} }
+\end{code}
+\displaycode
+%
+\noindent will typeset
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+ A positive distance will slide the arrow in the ``|^|-direction,'' \eg,
+ the two arrows above are slid in the direction of the labels~$a$,
+ $b$, $c$, and $d$, respectively; a negative distance in the
+ ``|_|-direction.'' The distance |<@1ex>| is often appropriate since it
+ corresponds roughly to the height of letters like ``x,'' in the type size
+ being used.
+
+\begin{exercise}
+%
+\begin{code}
+\xymatrix@1{
+ A \ar@/^/[r] \ar@/^/@<-1ex>[r] & B }
+\end{code}
+%
+ Typeset $\docode$~.
+%
+\answercode
+\answertext{The author typed }
+\answerdisplaycode
+\end{exercise}
+
+
+\subsection{More targets}
+??=[arrows.targets]
+%
+ The ??w![target] address can be given in a large number of formats
+ called \emph{??w![position]s}. The full range of possibilities is
+ described in the reference manual~\cite[fig. 1]{RM95:Xy-picRM}; here
+ is a number of useful ones in addition to the \emph{hop} format
+ described in section~??[basics.arrows]:
+%
+\begin{itemize}
+
+\item
+ $|[|r|,|c|]|$??C[], where $r,c$ are integers, denotes the
+ \emph{??w![relative entry]} found $r$~??w![rows] below and
+ $c$~??w![columns] to the right of the current entry (the ??w![current
+ entry] itself is thus |[0,0]|). This always corresponds to a
+ |[|\emph{??w![hop]}|]|, \eg, |[1,2]| is the same as |[drr]| and
+ |[-2,0]| is the same as |[uu]|.
+
+\item
+ $|"|r|,|c|"|$, where $r,c$ are positive integers, denotes the
+ \emph{??w![absolute entry]} found in the $r$th row and $c$th column
+ of the diagram. The top left entry is |"1,1"|.
+
+\item
+ $t'??c![;]t$~, where $t'$ is any target, changes the ??w![base entry]
+ of the present arrow to $t'$ and then sets the target to $t$ relative
+ to the original base entry. For example,
+%
+\begin{code}
+\xymatrix{ A \\
+ B & C \ar@<1ex>[ul]
+ \ar@<1ex>[ul];[] }
+\end{code}
+\displaycode
+%
+\noindent\unskip typesets
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+ \ie, the second |\ar[ul]| arrow starts at the |[ul]| entry and ends
+ in the current entry.
+
+\end{itemize}
+%
+ See section~??[entries.naming] for how to use a label as a target.
+
+
+\subsection{Changing the target}
+??=[arrows.changing]
+%
+ It is possible to ??w![overwrite] a ??w![target] with another by
+ appending something of the form ??c![*]\emph{object} to it. This
+ has the effect of typesetting the \emph{object} at the current
+ position, thus effectively on top of the target, and then use what
+ was typeset as the target.
+
+ A target may also have its ??w![position] changed??w[changing
+ position]??w[adjusting position]??w[moving target] by one of the
+ following constructions:
+%
+\begin{itemize}
+
+\item
+ ??c![+]\emph{vector} or ??c![-]\emph{vector} which changes the
+ target to be a zero-sized one at the position obtained by adding or
+ subtracting the \emph{vector} to its center, or
+
+\item
+ ??c![!]\emph{vector} which moves the center of the target by the
+ \emph{vector};
+
+\end{itemize}
+%
+ where a \emph{??w![vector]} should have the form
+%
+\begin{itemize}
+
+\item
+ $|<|D_x|,|D_y|>|$ , where $D_x,D_y$ are \TeX\ dimensions, is the
+ vector with those coordinates??w[vector coordinates],
+
+
+\item
+ the following ``corner offsets'' of a target are vectors as shown:
+%
+\begin{displaymath}
+\begin{code}
+\DEF\corner#1{\POS"box"+0;"box"+#1 **@{-} ?>*@{>} +/1pc/ *\hbox{\tt#1}}
+%
+\xy 0.(-11,-6).(11,6)!C="box"*\frm{.},"box";
+ "box"+L**@{.}, "box"+R**@{.}, "box"+D**@{.}, "box"+U**@{.}
+%
+ \corner{L} \corner{R} \corner{D} \corner{U}
+ \corner{DL}\corner{DR}\corner{UL}\corner{UR}
+\endxy
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+%
+ (they must be specified in upper case)??w[vector to corner], and
+
+\item
+ ??c![/]$d$ \emph{dimen}|/| is the \emph{vector} going
+ \emph{dimen} in the particular ??w![direction]??w[vector in
+ direction] $d$ which can be either the eight simple ones in
+ section~??[basics.bends], empty to denote that the
+ \emph{??w![current direction]} (the last direction of an arrow)
+ should be used, or one of the following:
+%
+\begin{defs}
+ |va(|$\alpha$|)|??c[va()] & ??w![absolute angle] \cr
+ $d$|:a(|$\alpha$|)|??c[:a()] & ??w![relative angle] in ??w![degrees] \cr
+ $d$|:(|$x$,$y$|)|??c[:()] & ??w![relative vector] \cr
+ $d$??c![^] / $d$??c![_] & short for |:a(90)| / |:a(-90)|
+\end{defs}
+\noindent\unskip
+%
+ where the $d$ in the last four may be empty to denote the ``current
+ direction.''
+
+\item
+ ??c![0] is the zero vector.
+
+\end{itemize}
+%
+ Many, many more possibilities are described in the reference
+ manual~\cite{RM95:Xy-picRM}.
+
+\begin{exercise}
+ What is the difference between a target $t$ and the target $t$|+0|?
+\answertext{The size: $t$|+0| always has zero size.}
+\end{exercise}
+
+
+\subsection{Arrows passing under}
+??=[arrows.pass]
+%
+ Arrows can pass under??w[arrow passing under] (or via) any other
+ entry: Just insert ??c![']$t$, \ie, a quote (apostrophe) character
+ followed by a target, for each entry that should be visited except
+ the last, ``ordinary \& final'' entry:
+%
+\begin{code}
+\xymatrix{
+ {\circ}
+ \ar@{|-->} '[dr] ^a
+ '[rr]+D*{\bullet} ^b
+ [drrr] ^c
+ & {\circ} & {\circ} & {\circ} \\
+ {\circ} & {\circ} & {\circ} & {\circ} }
+\end{code}
+\displaycode
+\noindent
+ typesets
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+ As you see, labels are set separately on each ??w![segment].
+
+\begin{exercise}??=[x.cube]
+%
+ Typeset the ``lambda ??w![cube]''??w[crossing arrows]
+%
+\begin{displaymath}
+\begin{code}
+\xymatrix@!0{
+ & \lambda\omega \ar@{-}[rr]\ar@{-}'[d][dd]
+ & & \lambda C \ar@{-}[dd]
+\\
+ \lambda2 \ar@{-}[ur]\ar@{-}[rr]\ar@{-}[dd]
+ & & \lambda P2 \ar@{-}[ur]\ar@{-}[dd]
+\\
+ & \lambda\underline\omega \ar@{-}'[r][rr]
+ & & \lambda P\underline\omega
+\\
+ \lambda{\to} \ar@{-}[rr]\ar@{-}[ur]
+ & & \lambda P \ar@{-}[ur]
+}
+\end{code}
+\docode
+\end{displaymath}
+%
+\noindent\unskip
+%
+ \emph{Hint}: ``going under'' an empty entry leaves a small gap at
+ that location.??w[crossing arrows] The compactness is achieved using
+ a trick described in section~??[entries.resizing].
+%
+\answercode
+\answertext{The author constructed }
+\answerdisplaycode
+\answertext{A special thing is added: |@!| forces rows and columns to be
+ equally spaced as discussed in section~??[entries.resizing]; |@!0|
+ furthermore makes the spacing ignore the entry sizes, giving a
+ completely fixed grid. The gaps could also be made with the
+ |!|\dots\ crossing notation of exercise~??[x.intercept] last in
+ section~??[arrows.places] but the above is shorter.}
+\end{exercise}
+
+
+\subsection{More bending arrows}
+??=[arrows.bend]
+%
+ Finally, arrows can ??w![bend] around entries: just insert
+ ??c![`]$d\,t$, \ie, a backquote and a ??w![direction] $d$ followed by
+ a target $t$, for each ``??w![turn]'' that starts out in the
+ $d$-direction and ends in a ??w![quarter turn] towards the
+ target~$t$. This is different from the curving??w[curve] described
+ earlier in that all turns consist of a straight part ending in a turn
+ which is a multiple of \slashedfrac18 ??w![circle segments], and each
+ segment allows separate ??w![label]s.
+
+ The possible directions are those of section~??[basics.bends] and
+ ??[arrows.changing], and the possible targets include all those
+ discussed above. Actually the direction is only required for the
+ first in a series of turns since the final direction of one turn is
+ the obvious choice for the following turn. Furthermore, turns can be
+ changed from the default by adding either ??c![^]$d$ for
+ anticlockwise turn to $d$ or ??c![_]$d$ for clockwise turn to $d$,
+ where $d$ is the ``exit direction'' of the turn.
+
+ Finally, the turns will have ??w![radius] 10pt by default, but this
+ can be changed to any dimension $R$ from a particular turn and
+ onwards by inserting ??c![/]$R$ immediately after the |``| of the
+ turn??w[changing turn radius]. Here is an example involving all of
+ these features:
+%
+\begin{code}
+\xymatrix{
+ {\circ} \ar `r[d] ^a
+ `[rr] ^b
+ `/4pt[rr] ^c
+ `[rrr] ^d
+ `_dl[drrr]^e
+ [drrr]^f
+ & {\circ} & {\circ} & {\circ} \\
+ {\circ} & {\circ} & {\circ} & {\circ} }
+\end{code}
+\displaycode
+\noindent
+%
+ typesets
+%
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+ The example illustrates the following points:
+%
+\begin{itemize}
+
+\item
+ If the segment can not be made as short as required then it will
+ point ``past'' the target. This is useful for ``??w![going around]''
+ entries.
+
+\item
+ There is \emph{one |`| per turn} thus each target appears as many
+ times as there are turns towards it, except the last target that
+ appears one more time namely both with |`| for each turn towards it
+ \emph{and} once as an ``ordinary'' target to set the final stretch.
+
+\item
+ The sizes of the intermediate targets are ignored.
+
+\end{itemize}
+
+\begin{exercise}
+%
+ Typeset
+\begin{IMAGE}$%
+%
+\begin{code}
+\xymatrix@1{
+ A \ar@<-2pt> `d[r] `[r] [r]
+ \ar@<+2pt> `d[r] `[r] [r] & B }
+\end{code}
+%
+ \docode$
+\end{IMAGE}~.
+%
+\answercode
+\answertext{The author typed }
+\answerdisplaycode
+\end{exercise}
+
+
+\subsection{Defining new arrow types}
+??=[arrows.defining]
+%
+ Last in this treatment of arrows we will explain how ??w![new arrows]
+ can be defined??w[defining arrows]. The crucial fact is that the
+ characters used for \emph{??w![tip]s} and \emph{??w![shaft]s} are
+ restricted to the following:
+%
+\begin{defs}
+ |><||ox+/()[]|\verb*+ + &\quad \emph{tip} characters??w[tip characters]\cr
+ |-.~:=| &\quad \emph{shaft} characters??w[shaft characters]
+\end{defs}
+\noindent\unskip
+%
+ When an arrow is interpreted by \Xy-pic it is first split into the
+ three components and then each component is looked up in a library of
+ so-called ``??w![directionals].'' It is possible to add new such
+ directionals using the command
+%
+\begin{defs1}
+ ??c![\newdir]|{| \emph{directional} |}{| \emph{composite} |}|
+\end{defs1}
+\noindent\unskip
+%
+ where \emph{directional} should be a sequence either of tip
+ characters or of shaft characters, and \emph{composite} should be a
+ list of objects??w[combined objects] separated with ??c![*] just like
+ the argument to ??c![\composite] described in
+ section~??[arrows.objects]. If arrows of a particular
+ \emph{??w![variant]} (always one of the letters |^_23|) needs an
+ alternate definition then another declaration can be given with the
+ variant inserted between |\newdir| and the first |{|.
+
+ There is one ??w![object modifier] which is very useful in this
+ context, in addition to those of section~??[arrows.objects]:
+%
+\begin{defs}
+ ??c![!]\emph{vector} &\quad shift object \emph{vector}
+\end{defs}
+\noindent\unskip
+%
+ (where the possibilities for \emph{vector} are described in
+ section~??[arrows.changing]). Combined with the direction code this
+ is very powerful, for example,
+%
+\begin{code}
+\newdir{|>}{%
+ !/4.5pt/@{|}*:(1,-.2)@^{>}*:(1,+.2)@_{>}}
+\end{code}
+\displaycode
+\noindent\unskip
+%
+ defines a new tip that makes
+%
+\begin{code}
+\xymatrix{ A \ar @{=|>} [r] & B }
+\end{code}
+\displaycode
+\noindent\unskip
+%
+ typeset
+%
+\begin{code}
+\newdir{|>}{!/4.5pt/@{|}*:(1,-.2)@^{>}*:(1,+.2)@_{>}}
+\xymatrix{ A \ar @{=|>} [r] & B }
+\end{code}
+%
+ $\docode$~. Notice how the ``relative direction'' is used here to
+ rotate??w[rotation] some of the composed components.
+
+\begin{exercise}??=[arrows.def.ex]
+ Often tips used as ``tails'' have their ink on the wrong side of the
+ point where they are placed. Fortunately space (\verb*+ +) is also a
+ tip character so we can define the directional \verb*+ >+ to generate
+ a ``tail-spaced'' arrow. Do this such that
+%
+\begin{code}
+\xymatrix{ A \ar @{>->} @< 2pt> [r]
+ \ar @{ >->} @<-2pt> [r] & B }
+\end{code}
+\displaycode
+\noindent
+%
+ typesets
+%
+\begin{displaymath}
+\begin{code}
+\newdir{ >}{{}*!/-5pt/@{>}}
+\xymatrix{ A \ar @{>->} @< 2pt> [r]
+ \ar @{ >->} @<-2pt> [r] & B }
+\end{code}
+\docode
+\begin{code}
+\newdir{ >}{{}*!/-5pt/@{>}}
+\end{code}
+\end{displaymath}
+%
+\answercode
+\answertext{The author used }
+\answerdisplaycode
+\end{exercise}
+
+ Finally, when \Xy-pic diagrams are used in conjunction with Knuth's
+ \emph{??w![computer modern fonts]} then the declaration
+%
+\begin{defs1}
+ ??c![\SelectTips{cm}{}]
+\end{defs1}
+\noindent\unskip
+%
+ will change the tips to some that look similar, \eg,
+%
+\begin{code}
+$\SelectTips{cm}{}
+ \xymatrix@1{A\ar@{->>|}[r]&B}$
+\end{code}
+\displaycode\noindent
+%
+ typesets
+\begin{IMAGE}
+\docode
+\end{IMAGE}. The second argument (here |{}|) can be used
+ to specify a point size |{10}|, |{11}|, or |{12}|, if desired (the
+ default is |{10}|\footnote{Except when \Xy-pic is loaded as a
+ \LaTeXe\ package where the default size is used.}); |{cm}| can be
+ replaced by |{eu}| and |{xy}| to get tips in ``Euler'' and the
+ default technical style, respectively. The declaration respects
+ \TeX\ grouping.
+
+\begin{exercise}
+\begin{code}
+\xymatrix@1{
+ A \ar[r] |-{\SelectTips{cm}{}\object@{>>}}
+ |>{\SelectTips{eu}{}\object@{>}}
+ & B }
+\end{code}
+%
+ Typeset $\docode$~. \emph{Hint}: With the construction
+ ??c![\object]\emph{object} one can typeset an \Xy-pic \emph{object}
+ (anything that could follow a |*| in section~??[arrows.objects]) in
+ any context.
+%
+\answercode
+\answertext{The author typed }
+\answerdisplaycode
+\end{exercise}
+
+
+
+\section{More Entries}
+??=[entries]
+%
+ This section explains what can go in an entry and how the general
+ form of the entries??w[entry] is changed.
+
+
+\subsection{Manual entry formatting}
+??=[entries.manual]
+%
+ All the entries we have seen thus far have been simple math objects.
+ However, it is possible to change the ??w![format] of an individual
+ ??w![entry]??w[entry format] by using the form:
+%
+\begin{defs1}
+ ??c![*]\emph{object} \emph{arrows}
+\end{defs1}
+\noindent\unskip
+%
+ This allows complete control over what object is placed in the entry,
+ overriding any spacing and other conventions for the entry. This was
+ how the frame was obtained in the figure in
+ section~??[basics.entries].
+
+ A simple use of this is to insert ??w![text in entries]??w[entries
+ with text]??w[labels with text] using ??c![\txt] objects just like
+ labels as described above in section~??[arrows.objects]:
+%
+\begin{code}
+\xymatrix{
+ *\txt{A very long and stupid\\program}
+ \ar[rr]^-{\txt{weird\\arrow}}
+ &&*\txt<2pc>{Com\-pli\-cated\\Code}}
+\end{code}
+\displaycode
+%
+\noindent will typeset
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+
+\begin{exercise}
+%
+\begin{code}
+\xymatrix{
+ *=0{\bullet}
+ \ar@/^/[dr]!U|1
+ \ar@/^/[drr]!U|2
+ \ar@/^/[drrr]!U|3
+\\
+ &*+[F]\txt{x}
+ &*+[F]\txt{x\\x}
+ &*+[F]\txt{x\\x\\x}
+}
+\end{code}
+%
+ Typeset
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+\answercode
+\answertext{The author typed}
+\answerdisplaycode
+\end{exercise}
+
+
+\subsection{Extra entries outside the matrix}
+??=[entries.extra]
+%
+ It is possible to put ??w![extra entries]??w[entries outside matrix]
+ in your diagrams that are not part of any ``entry'' of the matrix
+ created by |&| and |\\|. This is done with the
+ \emph{??w![excursion]} command
+%
+\begin{defs1}
+ |\save|~$t$~|\restore|
+\end{defs1}
+\noindent\unskip
+%
+ where $t$ should be a target in one of the formats described in
+ sections~??[arrows.targets]-??[arrows.changing]. $t$ can do
+ any kind of typesetting desired, for example,
+%
+\begin{code}
+\xymatrix{
+ A \ar@{-}[dr]
+ &{}\save[]+<3cm,0cm>*\txt<8pc>{%
+ This is a very big commentary
+ but it does not otherwise affect
+ the diagram.}
+ \ar[l] \ar[d] \restore \\
+ & B \ar@{-}[r] & C \ar@{-}[r] & D
+}
+\end{code}
+\displaycode
+%
+\noindent will typeset
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+ It illustrates how a ``down'' arrow does not necessarily have to point
+ particularly straight down -- in this case because it is based in the
+ displaced pseudo entry.
+
+
+\subsection{Spacing and rotation}
+??=[entries.resizing]
+%
+ The |*|\emph{object} form described above can be used to space
+ individual objects differently, however, it is also possible to
+ change the overall ??w![spacing] of a matrix by inserting the
+ following codes \emph{between} |\xymatrix| and the following |{|:
+%
+\begin{defs}
+ ??c![@=]\emph{dimen} & set spacing \cr
+ ??c![@R=]\emph{dimen} & set row spacing \cr
+ ??c![@C=]\emph{dimen} & set column spacing \cr
+ ??c![@M=]\emph{dimen} & set entry default margin \cr
+ ??c![@W=]\emph{dimen} & set entry default width \cr
+ ??c![@H=]\emph{dimen} & set entry default height \cr
+ ??c![@L=]\emph{dimen} & set label margin
+\end{defs}
+\noindent\unskip
+%
+ ??c![=] can be replaced by any of ??c![+], ??c![+=], ??c![-],
+ and ??c![-=] of section~??[arrows.objects] with the same meaning,
+ \ie, replace ``set'' with ``increase,'' ``increase to at most,''
+ ``decrease,'' and ``decrease to at least,'' respectively. For example,
+%
+\begin{code}
+$\xymatrix@1@=0pt@M=0pt{A&B\\C&D}$
+\end{code}
+%
+ \thecode\ in the text typesets \begin{IMAGE}\docode\end{IMAGE}.
+
+ In case \emph{??w![uniform spacing]} is desired, several alternative
+ forms exist.
+%
+\begin{defs}
+ ??c![@!] & force all spaces equal \cr
+ |@!0| & --- and ignore entry sizes \cr
+ |@!R| & force equal row spacing \cr
+ |@!C| & force equal column spacing
+\end{defs}
+\noindent\unskip
+%
+ Finally a special notation allows \emph{??w![rotation]} of an
+ entire matrix:
+%
+\begin{defs}
+ ??c![@]\,$d$ & rotate towards $d$
+\end{defs}
+\noindent\unskip
+%
+ Only the matrix grid will rotate, however, not the actual contents.
+
+\begin{exercise}
+\begin{code}
+\xymatrix@dr@C=1pc{
+ a \ar[r]\ar@{->>}[d] & a' \ar@{.>>}[d] \\
+ b \ar@{.>>}[r] & b' }
+\end{code}
+%
+ Typeset the ``strip lemma'' $$\docode$$
+%
+\answercode
+\answertext{The author entered the display}
+\answerdisplaycode
+\end{exercise}
+
+
+\subsection{Entry style}
+??=[entries.style]
+%
+ As mentioned above, the entries of a diagram are set in math mode in
+ text style. You may change this by redefinining the macro
+ ??c![\objectstyle]??w[entry style], and the label style by redefining
+ ??c![\labelstyle]??w[label style]. We can combine this with the
+ above to get ``small diagrams,'' \eg, typing
+%
+\begin{code}
+$\left(
+ \def\objectstyle{\scriptstyle}
+ \def\labelstyle{\scriptstyle}
+ \vcenter{\xymatrix @-1.2pc @ur {
+ A \ar[r]^{a} & B \ar[d]^{b} \\
+ A'\ar[u]^{a'} & B'\ar[l]^{b'} }}
+\right)$
+\end{code}
+\displaycode
+%
+\begin{code}
+$\left(
+ \DEF\objectstyle{\scriptstyle}
+ \DEF\labelstyle{\scriptstyle}
+ \vcenter{\xymatrix @-1.2pc @ur {
+ A \ar[r]^{a} & B \ar[d]^{b} \\
+ A'\ar[u]^{a'} & B'\ar[l]^{b'} }}
+\right)$
+\end{code}
+\noindent in a paragraph will typeset ``\begin{IMAGE}\docode\end{IMAGE}.''
+
+ You can even abandon the use of math mode entirely: the command
+ |\def| |\objectstyle| |{\hbox}|\ will change the format of entries to
+ plain text.??w[plain text entries]
+
+ Similarly, all entries are rectangular by default, but it is possible
+ to change this to \emph{??w![round]??w[elliptical]??w[circular]} by
+ declaring the default \emph{modifiers}??w[object
+ modifier]??w[default modifier] to be applied to all entries that do
+ not override them (\cf\ section~??[arrows.objects]):
+%
+\begin{code}
+\entrymodifiers={++[o][F-]}
+\SelectTips{cm}{}
+\xymatrix @-1pc {
+ *\txt{start} \ar[r]
+ & 0 \ar@(r,u)[]^b \ar[r]_a
+ & 1 \ar[r]^b \ar@(r,d)[]_a
+ & 2 \ar[r]^b
+ \ar `dr_l[l] `_ur[l] _a [l]
+ &*++[o][F=]{3}
+ \ar `ur^l[lll]`^dr[lll]^b [lll]
+ \ar `dr_l[ll] `_ur[ll] [ll] }
+\end{code}
+\displaycode
+%
+\noindent will typeset
+%
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+ Notice how we obtain the double ring using the |*|\emph{object}
+ form which then has to include all the desired modifiers (and how the
+ use of computer modern tips is nice for diagrams as these).
+
+
+\subsection{Naming for later use as targets}
+??=[entries.naming]
+%
+ If you build an entry with a long and complicated excursion then you
+ might wish to be able to refer to it later. \Xy-pic provides a
+ mechanism for this: there is a special ??w![target] form which we
+ haven't discussed yet:
+%
+\begin{defs1}
+ $t$ ??c![=]|"|\emph{name}|"|
+\end{defs1}
+\noindent\unskip
+%
+ This will introduce the new target |"|\emph{name}|"| which will
+ refer to the target just before the |=|. This is particularly useful
+ inside excursions, of course, and can also be used after
+ labels??w[labels as targets].
+
+\begin{exercise}
+%
+\begin{code}
+\xymatrix{
+ A \ar[r] ^a="a" & B \ar[r] ^b="b" & C
+ \ar @/^/ "a";"b" }
+\end{code}
+%
+ Typeset $\docode$.
+%
+\answercode
+\answertext{The author typed }
+\answerdisplaycode
+\answertext{\noindent Notice the use
+ of both explicit base and target in the arrow between the labels.}
+\end{exercise}
+
+
+\subsection{Grouping objects}
+??=[entries.grouping]
+%
+ Sometimes you wish to frame or otherwise treat a rectangle of objects
+ as a single object??w[grouping]. This is possible with the last two
+ target position forms that we will mention:
+%
+\begin{defs}
+ $t$|.|$s$ & merge $t$ with simple $s$ \cr
+ |{|$t$|}| & make $t$ simple
+\end{defs}
+\noindent\unskip
+%
+ The first will enlarge $t$ to also ``??w![cover]'' the ``simple'' $s$
+ (simple means that it cannot have changes etc.\ attached unless
+ encapsulated in |{}|s). Here is an example where we ??w![merge] and
+ frame:
+%
+\begin{code}
+\xymatrix @R=1pc {
+ 1,1 & 1,2 & 1,3 & 1,4 & 1,5 \\
+ 2,1 & 2,2 & 2,3 & 2,4 & 2,5
+ \save "1,2"."2,4"*[F.]\frm{}
+ \ar"1,1" \ar"2,1" \ar"1,5" \ar"2,5"
+ \restore }
+\end{code}
+\displaycode
+\noindent will typeset
+\begin{displaymath}
+\docode
+\end{displaymath}
+%
+ As you can see, the center of the merged object is the same as the
+ one of the target \emph{before} the ``|.|.''
+
+ Finally a more advanced example where we create two merged objects
+ with center in their ``real'' center, ??w![name] them and then connect
+ to them. It also shows how macros can be used inside diagrams: they
+ should always expand to ``commands'' like |\ar|\dots, etc.:
+%
+\begin{displaymath}
+\begin{code}
+\def\g#1{\save
+ [].[dr]!C="g#1"*[F]\frm{}\restore}%
+\xymatrix{
+ \g1 A\ar[r]&B\ar[d]&\g2 A'\ar[r]&B'\ar[d]\\
+ C\ar[u]&D\ar[l]& C'\ar[u]&D'\ar[l]
+ \ar @{.>} "g1" ;"1,4"
+ \ar @{-->} "2,1";"g2" }
+\end{code}
+\docode
+\end{displaymath}
+%
+ can be typeset by
+%
+\displaycode\noindent
+%
+ Then we can make arrows from/to the two frames by using the two new
+ targets |"g1"| and |"g2"| as shown.
+
+\begin{exercise}
+%
+ Change the lambda cube of exercise~??[x.cube] such it is enclosed in
+ a transparent (\ie, dotted) cube.
+%
+\answertext{The author added the \Xy-code}
+\begin{code}
+\save [].[dd].[ddrr].[rr]*[F.]\frm{}="back"
+ \restore
+\end{code}
+\answercode
+\answerdisplaycode
+\answertext{in the entry with $\lambda\omega$, and}
+\begin{code}
+ \save [].[dd].[ddrr].[rr]*[F.]\frm{}
+ \ar@{.} +UL;"back"+UL \ar@{.} +UR;"back"+UR
+ \ar@{.} +DL;"back"+DL \ar@{.} +DR;"back"+DR
+ \restore
+\end{code}
+\answercode
+\answerdisplaycode
+\answertext{in the entry with $\lambda2$ to produce}
+\begin{code}
+\xymatrix @!0 {
+ & \lambda\omega \ar@{-}[rr]\ar@{-}'[d][dd]
+ \save [].[dd].[ddrr].[rr]*[F.]\frm{}="back"\restore
+ & & \lambda C \ar@{-}[dd]
+\\
+ \lambda2 \ar@{-}[ur]\ar@{-}[rr]\ar@{-}[dd]
+ \save [].[ddrr]*[F.]\frm{}
+ \ar@{.} +UL;"back"+UL \ar@{.} +UR;"back"+UR
+ \ar@{.} +DL;"back"+DL \ar@{.} +DR;"back"+DR \restore
+ & & \lambda P2 \ar@{-}[ur]\ar@{-}[dd]
+\\
+ & \lambda\underline\omega \ar@{-}'[r][rr]
+ & & \lambda P\underline\omega
+\\
+ \lambda{\to} \ar@{-}[rr]\ar@{-}[ur]
+ & & \lambda P \ar@{-}[ur] }
+\end{code}
+\answercode
+\answertext{$$\begin{IMAGE}\docode\end{IMAGE}$$}
+\end{exercise}
+
+
+
+\section{Availability and Further Information}
+??=[avail]
+%
+ Below we describe how to and the conditions for obtaining \Xy-pic
+ version~\xyversion, the compatibility with previous versions, and we
+ conclude with a few appetisers to lure the reader into reading more
+ about \Xy-pic.
+
+
+\subsection{Getting \Xy-pic}
+??=[avail.ftp]
+%
+ The easiest way to retrieve??w[retrieving {\Xy}-pic] the latest version
+ of \Xy-pic is through the \Xy-pic home page~\cite{Xy-picHP} on the
+ ??w![World Wide Web]; it is also available by Internet ??w![ftp] from
+ \url{ftp://ftp.diku.dk/diku/users/kris/TeX/} as well as
+ \url{ftp://ftp.mpce.mq.edu.au/pub/maths/TeX/} in files starting with
+ |xy|. Finally, \Xy-pic has been contributed to the CTAN archives
+ where it is located in the directory \texttt{macros\slash generic\slash
+ diagrams\slash xypic}.
+
+\paragraph*{License:}
+%
+ \Xy-pic is free software in the sense that it is available under the
+ following ??w![license]??w[copyright] conditions:
+%
+\begin{center}\ordinarybars
+\begin{tabular}{|l|}
+ \hline
+ ~\Xy-pic: Graphs and Diagrams with \TeX~\\
+ \quad\copyright~1991--1997\quad Kristoffer H. Rose\\
+ \quad\copyright~1994--1997\quad Ross Moore\\
+ \hline
+\end{tabular}
+\end{center}
+%
+\begin{quotation}
+%
+ The \Xy-pic package is ??w![free software]; you can redistribute it
+ and/or modify it under the terms of the ??w![GNU General Public
+ License] as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+
+ The \Xy-pic package is distributed in the hope that it will be
+ useful, but \emph{without any ??w![warranty]}; without even the
+ implied warranty of \emph{merchantability} or \emph{fitness for a
+ particular purpose}. See the GNU General Public License for more
+ details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%
+\end{quotation}
+%
+ In practice this means that you are free to use \Xy-pic for your
+ documents but if you distribute any part of \Xy-pic (including
+ modified versions) to someone then you are obliged to ensure that the
+ full source text of \Xy-pic is available to them (the full text of
+ the license in the file ??c![COPYING] explains this in somewhat more
+ detail~\smiley~).
+
+
+\subsection{Backwards compatibility}
+??=[compat]
+%
+ The first widely distributed version of \Xy-pic was ??w![version 2]
+ (from release 1.40 to release 2.6). A special
+ \emph{??w![compatibility]} mode is used automatically if the
+ ??w![old style of loading] is used (using files named ??c![xypic.tex]
+ and ??c![xypic.sty]). You can also mix old and new diagrams in a
+ document if you load as described in section~??[basics.loading] and
+ add the declaration ??c![\xyoption]|{v2}|. This provides almost full
+ backwards compatibility: the following are the only known exceptions:
+%
+\begin{itemize}
+
+\item
+ Automatic ``shortening'' of arrow tails by ??c![|<<] break was a bug
+ and has been ``fixed'' so it does not work any more. \emph{Fix}: Put a
+ |||<\hole| break before it as described in section~??[arrows.styles].
+
+\item
+ The release~2.6 ??c![*] position operator is not available.
+ \emph{Fix}: Use the |:| and |::| operators (described in detail in
+ the reference manual~\cite{RM95:Xy-picRM}).
+
+\item
+ Using $t_1|;|t_2|:(|x|,|y|)|$ as the target of an arrow command does
+ not work. \emph{Fix}: Enclose it in braces, \ie, write
+ $|{|t_1|;|t_2|:(|x|,|y|)}|$.
+
+\item
+ The old ??c![\pit], ??c![\apit], and ??c![\bpit] commands are not
+ defined. \emph{Fix}: Use |*@{>}| (or |\tip|) with variants and
+ rotation.
+
+\item
+ The even older notation where an argument in braces to |\rto| and the
+ others was automatically taken to be a ``tail'' is not supported.
+ \emph{Fix}: Use the supported |||<|\dots\ notation.
+
+\end{itemize}
+%
+ Finally note that sometimes the spacing with version~\xyversion\ is
+ ``improved'' relative to earlier versions~\smiley~. Please report all
+ other things that do not work the same in version~2.6 and~\xyversion\
+ to the author.
+
+
+\subsection{Further reading}
+??=[avail.further]
+%
+ The reference manual~\cite{RM95:Xy-picRM} describes several more
+ input modes that are useful when the diagram is not organised as a
+ matrix. We'll give some examples of such diagrams but refer to the
+ reference manual for the details.
+%
+\begin{itemize}
+
+\item The ``??w![graph]'' feature allows input of data structured as
+ \emph{??w![directed graphs]} to make it easy to produce such
+ pictures as
+%
+\begin{displaymath}
+%
+% From xygraph.doc.
+%
+\begin{code}
+\SelectTips{cm}{}
+\objectmargin={1pt}
+\xygraph{ !{0;(.77,-.77):0}
+ !~:{@{-}|@{>}}
+ w (:[r(.6)]{x_1}
+ ,:[d]z:[r]y:[u(.6)]{x_2}:@/_/"x_1" (:@/_/"x_2") :"z"
+ :@( {"w";"z"}, {"y";"z"})"z" :"x_2" ) }
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+
+\item The ``??w![knot]'' feature allows drawing of mathematical \emph{knots
+ and ??w![links]} like
+%
+% From xyknot.doc:
+%
+\begin{displaymath}
+%
+\UseComputerModernTips
+\vtop{\vbox{\xygraph{!{0;/r1.5pc/:} !{\vover}[u]
+ !{\hcap[-2]<<} [d] !{\vover-} [ruu] !{\hcap[2]><}}\smallskip}
+\hbox{\qquad\ \small simple link}}\hfil
+%
+% Figure-eight
+%
+\vtop{\vbox{\xygraph{!{0;/r1.5pc/:}
+ [u] !{\vloop<(-.005)\khole||\vcrossneg \vunder- }
+ [] !{\ar @{-}@'{p-(1,0)@+}+(-1,1)}
+ [ul] !{\vcap[3]>\khole}
+ [rrr] !{\ar @{-}@'{p-(0,1)@+}-(1,1)}
+}\smallskip}\hbox{\small figure-8 knot}}\hfil\quad
+%
+% cinque-foil
+%
+\vtop{\vbox{\xygraph{!{0;/r1.25pc/:}
+ !P5"a"{~>{}} !P10"b"{~:{(1.7487,0):}~>{}}
+ !P20"c"{~={-9}~:{(2.2,0):}~>{}}
+ !{\xunderv~{"b3"}{"b2"}{"a2"}{"a1"}}
+ !{\xunderv~{"b5"}{"b4"}{"a3"}{"a2"}}
+ !{\xunderv~{"b7"}{"b6"}{"a4"}{"a3"}}
+ !{\xunderv~{"b9"}{"b8"}{"a5"}{"a4"}}
+ !{\xunderv~{"b1"}{"b10"}{"a1"}{"a5"}}
+ !{\vloop~{"c3"}{"c2"}{"b2"}{"b1"}<<}
+ !{\vloop~{"c7"}{"c6"}{"b4"}{"b3"}<<}
+ !{\vloop~{"c11"}{"c10"}{"b6"}{"b5"}<<}
+ !{\vloop~{"c15"}{"c14"}{"b8"}{"b7"}<<}
+ !{\vloop~{"c19"}{"c18"}{"b10"}{"b9"}<<}
+}\smallskip}\hbox{\quad\ \small cinquefoil}}
+%
+\vbox{\hbox to 2em{\hss}}
+\end{displaymath}
+
+\item The ``??w![2cell]'' feature provides special support for
+ \emph{categorical ??w![twocells]} like
+%
+\begin{displaymath}
+%
+% From xy2cell.doc.
+%
+\begin{code}
+\begin{xy}
+ *+{A}="A",+<1cm,1.5cm>*+{B}="B",
+ +<2cm,0pt>*+{C}="C",
+ +<1cm,-1.5cm>*+{D}="D",
+"A";"B",{\uppertwocell^\alpha{}},
+"B";"C",{\twocell^\zeta_\xi{\gamma}},
+"C"; \afterPOS{\drop\compositemap{}}"D"
+\POS "A";
+ \afterPOS{\drop\lowertwocell{}}"D"
+\end{xy}
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+
+\item The ``??w![poly]'' feature allows \emph{??w![polygon-like]}
+ structures:
+%
+\begin{displaymath}
+%
+% From xypoly.doc:
+%
+\begin{code}
+\begin{xy}
+/r2pc/: ="A", +(.2,1.5)="B","A",
+{\xypolygon6{~:{(1,-.1):(0,.33)::}
+ ~<>{;"B"**@{-}}}}\endxy
+\qquad \xy /r2pc/:
+{\xypolygon4"A"{~:{(0,.7)::}}},+(.7,1.1),
+{\xypolygon4"B"{~:{(.8,0):(0,.75)::}}},
+"A1";"B1"**@{.},"A2";"B2"**@{.},
+"A3";"B3"**@{.},"A4";"B4"**@{.}
+\endxy\qquad \xy /r2pc/:
+{\xypolygon3"A"{~:{(0,.7)::}}},+(.7,1.1),
+{\xypolygon3"B"{~:{(-.85,0):(-.15,.8)::}}}
+,"A1"\PATH~={**@{.}}'"B2"'"A3"'"B1"
+'"A2"'"B3"'"A1"
+\end{xy}
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+
+\item The ``??w![web]'' feature allows composition in lattices such as
+%
+\begin{displaymath}
+%
+% From xyweb.doc:
+%
+\begin{code}
+\def\latticebody{\dimen0=\latticeX pt
+ \ifdim\dimen0>0pt \divide\dimen0 by 64
+ \dimen0=\latticeY\dimen0 \relax
+ \ifdim 0pt>\dimen0 \dimen0=-\dimen0 \fi
+ \ifdim 2.5pt>\dimen0 \drop{\bullet}%
+ \else\drop{.}\fi \else\drop{.}\fi}
+\begin{xy}
+*\xybox{0;<1.5pc,1.28mm>:<.41pc,1.12pc>::
+,0,{\croplattice{-3}5{-5}5
+ {-1.3}{4.5}{-3.4}{4.4}}}="L"
+,{"L"+L \ar "L"+!R*+!L{\sigma^{(1)}}}
+,{"L"+D \ar "L"+!U*+!D{\sigma^{(2)}}}
+\end{xy}
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+
+\item The ``??w![arc]'' feature is suitable for effects like
+%
+\begin{displaymath}
+%
+% From xyarc.doc:
+%
+\begin{code}
+\begin{xy}
+0;/r5pc/:*@{*}="p",*+!DR{p};
+p+(.5,-.5)*@{*}="c",*+!UL{c}**@{-}
+,"c",{\ellipse<15pt>_,=:a(45){=}}
+ ,{\ellipse<>__,=:a(30){-}}
+,{\ellipse(1,.4){.}}
+ ,{\ellipse(1,.4)_,=:a(120){--}}
+,{\ellipse(,.75){.}}
+ ,{\ellipse(,.75)_,^,^{-}}
+\end{xy}
+\end{code}
+\begin{IMAGE}
+\docode
+\end{IMAGE}
+\end{displaymath}
+
+\end{itemize}
+%
+ In each case the figure is produced with relatively few lines using
+ techniques documented in the respective sections of the reference
+ manual together with the details of the \Xy-pic kernel and
+ extensions, ``arrow,'' and ``matrix'' features as used in this guide;
+ further extensions provide support for use of colour, \PS\ effects,
+ and much more.
+
+ Finally, the following documents might prove useful: \emph{How to
+ Typeset Pretty Diagram Arrows with {\TeX}}~\cite{R92:HowTPDAT}
+ presents some of the design decisions behind \Xy-pic,
+ \emph{{\Xy}-pic and Notation for Categorical
+ Diagrams}~\cite{R94:Xy-picNCD} explains how the modularity of \Xy-pic
+ can be used to obtain complex effects with commutative diagrams, and
+ \emph{Typesetting Neural Nets using
+ {\Xy}-pic}~\cite{M94:TypesettingNNX} explains how \emph{neural
+ networks} can be typeset using the package. Finally, a collection of
+ complex examples is maintained on the \Xy-pic home page and the ftp
+ servers discussed above.
+
+
+\subsection{Credits}
+??=[avail.credits]
+%
+ \Xy-pic version 2 was a small package created by the author. The
+ present version \xyversion\ is the result of more than three years of
+ continued collaboration with Ross Moore,\footnote{Mathematics
+ Department, Macquarie University, Sydney, Australia 2109;
+ e-mail: ross@mpce.mq.edu.au.} and would never have been developed
+ without his support and \TeX-nical expertise.\footnote{Partial
+ funding for this collaboration has been provided by a Macquarie
+ University Research Grant (MURG), by the Australian Research Council
+ (ARC), and through a research agreement with the Digital Equipment
+ Corporation (DEC).} This includes many of the modes mentioned above
+ which were created for use within specialised branches of
+ mathematics, however, the notations are designed to fit quite
+ naturally within the framework of \Xy-pic and are useful more
+ generally. Finally, we are grateful to Y\&Y Inc.\ for making very
+ nicely done \PS\ versions of the \Xy-pic fonts available.
+
+
+\appendix\section{Answers to all exercises}
+\Answers
+
+\BIBLIOGRAPHY
+\INDEX
+
+\end{document}
+
+
+% $Log: xyguide.man,v $
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.5 1997/05/29 21:02:36 krisrose
+% Fixed "missing breaks"...and tidied up documentation!
+%
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 13:17:15 krisrose
+% Maintenance release.
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% Reformatted for LaTeX with companion xydoc.sty.
+% Renamed from xypicman.doc to xyguide.man.
+%
+% Revision 2.6.1.1 1992/07/01 07:08:24 kris
+% Send to EuroTeX '92...
+%
+% Revision 2.6 1992/06/24 01:23:34 kris
+% Reorganised...
+% Documented new features: hooks, triple lines, positions, and LaTeXdiagrams.
+%
+% Revision 2.5 1992/02/24 03:30:54 kris
+% Documented changes in xypic.doc[2.5].
+%
+% Revision 2.4 1992/01/22 02:15:10 kris
+% Cosmetic changes; removed \pit and introduced \rotate.
+%
+% Revision 2.3 1992/01/13 01:51:02 kris
+% Changed to use `pure' XPPT [1.20].
+% Several cosmetic changes, e.g., corrected definition of \ddtor in footnote.
+%
+% Revision 2.2 1992/01/09 04:05:40 kris
+% Patched to fix problem with \text and support AMS-LaTeX.
+%
+% Revision 2.1 1992/01/02 14:54:07 kris
+% Release version.
+%
+% Revision 1.7 1991/12/17 04:53:23 kris
+% Version distributed as `final draft' on Usenet.
+% Added bent arrows properly; support for double tips; proper \Text;
+% fixed name clashes...
+% This version is for bug fixes only!!
+%
+% Revision 1.6 1991/12/06 08:53:06 kris
+% Draft ready for wider distribution...
+% Fits xypic.doc[1.39]; still needs better examples.
+%
+% Revision 1.5 1991/12/03 07:53:28 kris
+% Extended with the xypic.doc[1.37] possibility for exotic arrow
+% tips; also added description of \merge.
+%
+% Revision 1.4 1991/12/02 06:08:42 kris
+% Fixed various things; fits xypic.doc[1.36].
+%
+% Revision 1.3 1991/12/01 07:40:07 kris
+% Corresponds to xypic.doc[1.35].
+%
+% Revision 1.2 1991/11/28 04:42:49 kris
+% Corresponds to xypic.doc[1.34].
+% Cleaned up a lot; now only bending arrows are missing...and good examples.
+%
+% Revision 1.1 1991/11/27 06:48:17 kris
+% Initial: \beta-test on DIKU.
+%
+% Based on version in DIKU student report 91-7-10.
+
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyidioms.doc b/Master/texmf-dist/source/generic/xypic/xyidioms.doc
new file mode 100644
index 00000000000..6fe56625ac5
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyidioms.doc
@@ -0,0 +1,283 @@
+%% $Id: xyidioms.doc,v 3.4 1997/05/18 01:14:25 krisrose Exp $
+%%
+%% Format-dependent idioms for Xy-pic.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyidiomsloaded\empty \message{not reloaded}\endinput \fi
+\let\xyidiomsloaded=\empty
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This included file provides some common ??w![idioms] whose definition
+ depends on the used format such that \Xy-pic can use predefined
+ ??w![dimension registers] etc.\ and yet still be independent of the
+ format under which it is used. The current ??w![version]
+ (\stripRCS$Revision: 3.4 $) handles ??w![plain \TeX] (version 2
+ and 3~\cite{K84:TeXbook}), ??w![\AMS-\TeX] (version 2.0 and
+ 2.1~\cite{S90:JoyT}), ??w![\LaTeX] (version 2.09~\cite{L86:LaTeX}
+ and~$2\varepsilon$~\cite{L94:LaTeX}), ??w![\AMS-\LaTeX] (version 1.0,
+ 1.1~\cite{AMS91:AMS-LaTeX}, and~1.2), and eplain (version
+ 2.6~\cite{B94:ExpandedPT})\footnote{The `v2' feature introduces some
+ name conflicts, in order to maintain compatibility with earlier
+ versions of \Xy-pic.\hfill}.
+ ??w[system dependencies]??w[format dependencies]
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}
+\DOCHEADER
+\noindent
+ This is a separate file so that we can abort the definitions easily
+ using |\endinput|.
+
+\paragraph*{Scratch registers:}
+%
+ All the formats currently treated allow the use of the following
+ plain \TeX\ ??w![scratch register conventions]
+ (\cf~\cite[p.346]{K84:TeXbook})
+%
+\begin{itemize}
+\item
+ |\count@| is available as a local scratch counter register.
+\item
+ |\dimen@|, |\dimen@i|, |\dimen@ii|, |\dimen3| to |\dimen9|, and
+ |\dimen255| are available as scratch dimension registers.
+\item
+ |\skip@|, |\skip1| to |\skip9|, and |\skip255| are available as
+ scratch skip registers.
+\item
+ |\toks@| and |\toks1| to |\toks9| are available as scratch token
+ lists.
+\item
+ |\boxz@| and |\box1| to |\box9| are available as scratch box
+ registers.
+\end{itemize}
+%
+ with the constraint that ??c![\global] should never (always)
+ be used when assigning to number 0, 2, 4, 6, 8, and 255 (1, 3, 5, 7,
+ and 9).
+
+\paragraph*{\Xy-specific scratch registers:}
+%
+ We first give new names to dimension registers 4, 6, and 8, since
+ none of the formats do that: |\A@|, |\B@|, and |\R@| are specific to
+ \Xy-pic and will be referred to as ??w![$A$], ??w![$B$], and
+ ??w![$R$] in comments.
+
+\DOCMODE(
+\xywarnifdefined\A@ \dimendef\A@=4
+\xywarnifdefined\B@ \dimendef\B@=6
+\xywarnifdefined\R@ \dimendef\R@=8
+\DOCMODE)
+
+ Some shared scratch registers are defined last.
+
+\paragraph*{Idioms:}
+%
+ First check that |\undefined| is indeed undefined\dots or rather: the
+ same as an extremely unlikely control sequence that we are making up:
+
+\DOCMODE(
+\ifx\undefined\AveryUNLIKELYc@ntr@lSEQUENCE@@\else
+\errmessage{Xy-pic Error: \string\undefined\space defined.}\fi
+\DOCMODE)
+
+ These idioms are so common they are just conditionally defined:
+
+\DOCMODE(
+\ifx\undefined\literal@ \def\literal@#1{#1}\fi
+\ifx\undefined\eat@ \def\eat@#1{}\fi
+
+\xydef@\xyFN@{\futurelet\next} % Now private because of AMS-LaTeX change.
+\ifx\undefined\DN@ \def\DN@{\def\next@}\fi
+\ifx\undefined\DNii@ \def\DNii@{\def\nextii@}\fi
+
+\ifx\undefined\setboxz@h\def\setboxz@h{\setbox\z@\hbox}\fi
+\ifx\undefined\wdz@ \def\wdz@{\wd\z@}\fi
+\ifx\undefined\boxz@ \def\boxz@{\box\z@}\fi
+
+\ifx\undefined\W@ \def\W@{\immediate\write16 }\fi
+
+\ifx\undefined\space@ \def\space@.{\futurelet\space@\relax}\space@. \fi
+
+\ifx\undefined\notempty \def\notempty#1{T\if @#1@F\else T\fi}\fi
+\DOCMODE)
+
+\paragraph*{Delayed setup:}
+%
+ This is used when it is advantageous to delay loading of something
+ until after the preamble, \ie, after all options, \etc, have been
+ loaded. This is particularly true for nested ??c![\xywithoption]
+ uses that will otherwise be executed repeatedly. Currently properly
+ supported with \LaTeXe\ and the |amsppt| style of \AMS-\TeX.
+
+\DOCMODE(
+\xydef@\xysetup@dummy#1{\xyuncatcodes#1}
+\xywarnifdefined\xysetup@@
+
+\ifx\AtEndDocument\undefined
+ \expandafter\ifx\csname amsppt.sty\endcsname\relax
+ \let\xysetup@@=\xysetup@dummy
+ \else
+ \def\xysetup@@#1{%
+ \expandafter\def\expandafter\topmatter\expandafter{\topmatter
+ #1\xyuncatcodes}}\fi
+\else
+ \def\xysetup@@#1{\AtBeginDocument{#1\xyuncatcodes}}
+\fi
+
+\ifx\xysetup@@\xysetup@dummy\else
+ \xysetup@@{\let\xysetup@@=\xysetup@dummy \xyuncatcodes}\fi
+\DOCMODE)
+
+ Similarly, the following provides a place to insert `trailing
+ messages' if the format supports it; otherwise it just throws away
+ the argument (useful for repeating the most important warnings).
+
+\DOCMODE(
+\xywarnifdefined\xyclosedown@@
+
+\ifx\AtEndDocument\undefined \let\xyclosedown@@=\eat@
+\else \def\xyclosedown@@#1{\AtEndDocument{#1}}\fi
+\DOCMODE)
+
+ This may be useful to hook into specialised mechanisms for including
+ |\special| material on the page.
+
+\DOCMODE(
+\xylet@\xy@begindvi=\literal@
+\DOCMODE)
+
+ For example, \LaTeXe\ (post Dec~'94) defines an |\AtBeginDvi| macro
+ to allow zero-sized material to be placed at the beginning of each
+ shipped-out page. Among other uses, this allows such material not to
+ be discarded, when on a page containing only floats. This is used by
+ \Xy-pic in connection with the \PS\ header dictionary |xyps-ps.doc|.
+
+\DOCMODE(
+\ifx\undefined\AtBeginDvi\else
+ \AtBeginDocument{\let\xy@begindvi=\AtBeginDvi}
+ \AtBeginDvi{\global\let\xy@begindvi=\literal@}\fi
+\DOCMODE)
+
+\paragraph*{Shared scratch registers:}
+%
+ Everything else in this file is also done by \AMS-\TeX\ so we exit
+ here when using that format after renaming their |\toks@@| to
+ |\toks@ii|\dots
+
+\DOCMODE(
+\ifx\amstexloaded@\relax
+\xylet@\toks@ii=\toks@@ \endinput \fi
+\DOCMODE)
+
+ Thus the job of allocating scratch registers is simple except for
+ counters where we only have one so we use \LaTeX\ scratch counters
+ when available and otherwise allocate two new ones:
+
+\DOCMODE(
+\ifx\@tempcnta\undefined
+\xynew@{count}\count@@
+\xynew@{count}\count@@@
+\else
+\xylet@\count@@=\@tempcnta
+\xylet@\count@@@=\@tempcntb
+\fi
+\DOCMODE)
+
+ Finally the second scratch token register not available with \LaTeX.
+
+\DOCMODE(
+\ifx\undefined\toks@ii \toksdef\toks@ii=2 \fi
+\DOCMODE)
+
+\paragraph*{End \& log:}
+%
+ That's all.
+
+\DOCMODE(
+\endinput
+
+% $Log: xyidioms.doc,v $
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.9 1994/06/09 15:02:49 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% Now contains scratch register allocations.
+% Cleaned of AMS-TeX special macros.
+% Renamed from xyamstex.doc to xyidioms.doc for version 2.7.
+%
+% Revision 2.4 1992/01/22 02:15:10 kris
+% \\ works with AMS-LaTeX: don't use \Let@ [Werner Struckmann/Darrel Hankerson]
+% Made redefinition of \text conditional.
+%
+% Revision 2.3 1992/01/10 21:43:09 kris
+% Fixed AMS-LaTeX name clash problems.
+%
+% Revision 2.2 1992/01/09 04:05:40 kris
+% Patched to fix problem with \text and support AMS-LaTeX.
+%
+% Revision 2.1 1992/01/02 14:55:27 kris
+% Release version.
+%
+% Revision 1.3 1991/12/17 04:51:16 kris
+% Version distributed with `final draft' on Usenet.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyimport.doc b/Master/texmf-dist/source/generic/xypic/xyimport.doc
new file mode 100644
index 00000000000..a2cff8f9642
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyimport.doc
@@ -0,0 +1,245 @@
+%% $Id: xyimport.doc,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+%%
+%% Xy-pic ``Import feature'' option.
+%% Copyright (c) 1993-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{import}{Import graphics extension}{\stripRCS$Revision: 3.6 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This feature provides the ability to easy add labels and annotations to
+graphics prepared outside \TeX\ or \LaTeX. An \Xy-pic graphics environment
+is established whose coordinates match that within the contents of the
+imported graphic, making it easy to specify exactly where a label should be
+placed, or arrow drawn to highlight a particular feature.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+A command |\xyimport| is defined which is used, in conjunction with
+imported graphics, to establish a coordinate system appropriate to the
+particular graphics. This enables <pos>itions within the graphic to be easily
+located, either for labelling or adding extra embellishing features.
+It is used in either of the follow ways:
+%
+\begin{defs1}
+|\xyimport(|{\em width}|,|{\em height}|){|<graphic>|}| \cr
+|\xyimport(|{\em width}|,|{\em height}|)(|%
+ {\em$x$-off}|,|{$y$-off}|){|<graphic>|}|
+\end{defs1}
+
+\begin{code}
+\def\ellipA{\resizebox{6cm}{!}{%
+ \includegraphics{import1.eps}}}
+\xy
+\xyimport(3.7,3.7)(1.4,1.4){\ellipA}*\frm{-}
+,!D+<2pc,-1pc>*+!U\txt{%
+ framed contents of graphics file}\endxy
+\qquad\qquad
+\xy\xyimport(3.7,3.7)(1.4,1.4){\ellipA}
+,!D+<2pc,-1pc>*+!U\txt{Rational points
+ on the elliptic curve: $x^3+y^3=7$}
+,(1,0)*+!U{1},(-1,0)*+!U{-1}
+,(0,1)*+!R{1},(0,-1)*+!R{-1}
+,(2,-1)*+!RU{P},(-1,2)*+!RU{-P}
+,(1.3333,1.6667)*+!UR{-2P}
+,(1.6667,1.3333)*!DL{\;2P}
+,(-.5,1.9)*++!DL{3P},(1.9,-.5)*!DL{\;-3P}
+,(-1,2.3)*+++!D{\infty}*=0{},{\ar+(-.2,.2)}
+,(.5,2.3)*+++!D{\infty}*=0{},{\ar+(-.2,.2)}
+,(2.3,-1)*+++!L{\infty}*=0{},{\ar+(.2,-.2)}
+\endxy
+\end{code}
+
+\begin{figure*}[t]
+%
+% example appears early so it will not float too far away.
+%
+% Special care needed in case there is no graphics available...
+\ifx\includegraphics\undefined \def\resizebox#1#2#3{%
+ \vbox to6cm{\vss\hbox to6cm{\hss(Picture import1.eps omitted)\hss}\vss}}\fi
+$$\docode$$
+\caption{importing a graphic for labelling}??=[importing]
+\end{figure*}
+
+\noindent
+Normally the <graphics> will be a box containing a graphic imported
+using the commands from packages such as |graphics|, |epsf| or
+|epsfig|, or using other commands provided by the local \TeX\
+implementation. However the <graphic> could be {\em any} balanced
+\TeX\ material whatsoever; provided it occupies non-zero size, both
+vertically and horizontally.
+
+The {\em width} and {\em height} are <number>s given in the coordinate
+system for the {\em contents of the <graphics>}. These are not dimensions,
+but coordinate-lengths, using the units appropriate to the picture displayed
+by <graphic>.
+
+When provided, |(|{\em$x$-off}|,|{$y$-off}|)| give the distance in
+coordinate units from bottom-left corner to where the origin of coordinates
+should be located, usually within area covered by the <graphic>.
+Usually the negatives of these numbers will give the coordinate location
+of the bottom-left corner of the <graphic>. If no offsets are supplied
+then the origin is presumed to lie at the bottom-left corner.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xyimport#1#{\xyimport@{#1}}
+\xydef@\xyimport@#1#2{\xydelayimport@{#1}{#2}}
+\xydef@\xydelayimport@#1#2{\xy@@ix@{#1{#2}}%
+ \xy@@{\expandafter\xyextern@\the\toks9}}
+
+\xydef@\xyextern@(#1,#2){\hbox\bgroup\R@c=#1\p@ \U@c=#2\p@\xyextern@i}
+
+\xydef@\xyextern@i#1#{\DN@{#1}%
+ \ifx\next@\empty \L@c=\z@ \D@c=\z@ \DN@{\xyextern@x}%
+ \else \DN@{\xyextern@ii#1}\fi \next@ }
+
+\xydef@\xyextern@ii(#1,#2){\L@c=#1\p@ \D@c=#2\p@
+ \advance\R@c-\L@c \advance\U@c-\D@c \xyextern@x}
+
+\xydef@\xyimportdefault@{3}
+\xydef@\xyexportwarning@#1#2#3{\xywarning@{%
+ #1 for import has zero #2; using \xyimportdefault@#3 default}}
+
+\xydef@\xyextern@x#1{\toks@={\egroup\L@c=}\setboxz@h{#1}%
+ \dimen@ii=\L@c \advance\dimen@ii\R@c \dimen@=\wdz@
+ \ifdim\dimen@=\z@ \xyexportwarning@{graphic}{width}{cm}%
+ \dimen@=\xyimportdefault@ cm\fi
+ \ifdim\dimen@ii=\z@ \xyexportwarning@{coords}{width}{unit}%
+ \dimen@ii=\xyimportdefault@\p@\fi
+ \quotient@\next@\dimen@\dimen@ii \dimen@=\next@\p@
+ \edef\tmp@{\expandafter\removePT@\the\L@c}\L@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\L@c\relax\R@c=}%
+ \edef\tmp@{\expandafter\removePT@\the\R@c}\R@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\R@c\relax\setbase@\z@\z@}%
+%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\dimen@}\z@\D@c=}%
+ \dimen@ii=\U@c \advance\dimen@ii\D@c \dimen@=\ht\z@\advance\dimen@\dp\z@
+ \ifdim\dimen@=\z@ \xyexportwarning@{graphic}{height}{cm}%
+ \dimen@=\xyimportdefault@ cm\fi
+ \ifdim\dimen@ii=\z@ \xyexportwarning@{coords}{height}{unit}%
+ \dimen@ii=\xyimportdefault@\p@\fi
+ \quotient@\next@\dimen@\dimen@ii \dimen@=\next@\p@
+ \edef\tmp@{\expandafter\removePT@\the\D@c}\D@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\D@c\relax\U@c=}%
+ \edef\tmp@{\expandafter\removePT@\the\U@c}\U@c=\tmp@\dimen@
+ \expandafter\addtotoks@\expandafter{\the\U@c\relax\setbase@@\z@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\dimen@}}%
+%
+ \setboxz@h{\kern-\L@c\lower\D@c\boxz@\kern\L@c}%
+ \wd\z@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@ \the\toks@ \X@c=\z@ \Y@c=\z@
+ \ifdim\X@min>-\L@c \X@min=-\L@c \fi \ifdim\X@max<\R@c \X@max=\R@c \fi
+ \ifdim\Y@min>-\D@c \Y@min=-\D@c \fi \ifdim\Y@max<\U@c \Y@max=\U@c \fi
+ \idfromc@{import}\POS }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Normally the |\xyimport| command is used at the beginning of an |\xy..\endxy|
+environment. It is not necessary to give any basis setup, for this is
+deduced by measuring the dimensions of the <graphic> and using the supplied
+{\em width}, {\em height} and offsets.
+The <graphic> itself defines named <pos> called |"import"|, located at the
+origin and having appropriate extents to describe the area covered by
+the <graphic>. This makes it particularly easy to surround the <graphic>
+with a frame, as on the left side of figure~??[importing],
+or to draw axes passing through the origin.
+
+% Special care needed in case there is no graphics available...
+\ifx\includegraphics\undefined \def\resizebox#1#2#3{%
+ \vbox to6cm{\vss\hbox to6cm{\hss(Picture import1.eps omitted)\hss}\vss}}\fi
+
+Here is the code used to apply the labelling in figure~??[importing]:
+\displaycode
+
+This example uses the \LaTeXe\ standard |graphics| package to import
+the graphics file |import1.eps|; other packages could have been used
+instead. e.g. |epsfig|, |epsf|, or the \expandafter|\string\picture|
+or \expandafter|\string\illustration| commands in \Textures\ on the
+Macintosh.
+
+The only possible problems that can occur are when the graphics package is
+loaded after \Xy-pic has been loaded. Generally it is advisable to have
+\Xy-pic loading {\em after} all other macro packages.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyimport.doc,v $
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 09:19:22 ross
+% no changes
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/05 22:10:51 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% NEW for version 3.0 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\endinput
+$$
+\xy\xyimport(37,37)(18,18){\ellB}
+,!D+<1pc,-1pc>*+!U\txt{Rational points
+on the elliptic curve: $x^3+y^3=1729$}
+,(10,0)*+!U{10},(-10,0)*+!U{-10}
+,(0,10)*+!R{10},(0,-10)*+!R{-10}
+,(1,12)*+!DL{P_1}
+,(12,1)*+!DL{-P_1=(12\,,1)}
+,(10,9)*!LD{\;\;\;P_2=(10\,,9)}
+,(9,10)*++!D{\;\;-P_2}
+,(-15.5,17.5)*+!DL{-P_1-P_2}
+,(17.5,-15.5)*+!DL{P_1+P_2}
+,(13,-7)*+!UR{-2P_1-P_2\;\;}
+,(18,-3)*+++!L{\infty}*=0{},{\ar+(2,-2)}
+,(3,18)*+++!D{\infty}*=0{},{\ar+(-2,2)}
+\endxy
+$$
+
+\end{document}
diff --git a/Master/texmf-dist/source/generic/xypic/xyknot.doc b/Master/texmf-dist/source/generic/xypic/xyknot.doc
new file mode 100644
index 00000000000..e3c3f132b92
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyknot.doc
@@ -0,0 +1,2014 @@
+%% $Id: xyknot.doc,v 3.4 1997/05/18 01:13:24 ross Exp $
+%%
+%% Xy-pic ``Knots and Links'' feature.
+%% Copyright (c) 1994-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this macro package; if not, write to the Free Software Foundation,
+%% Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{knot}{Knots and Links feature}{\stripRCS$Revision: 3.4 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+ This feature provides a language for specifying knots, links and
+ general arrangements of crossing strings.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\TODO: Document this feature!
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\DOCMODE(
+\message{knots and links,}
+\DOCMODE)
+
+This |knot| feature is really a `construction kit', providing pieces which
+may be placed appropriately to form knots and links.
+The types of pieces provided are of two kinds: the ``crossings'',
+representing one string crossing over or under another;
+and ``joins'' which are used to connect what would otherwise be loose ends.
+Several types of each are provided, along with a simple way of specifying
+where to place arrowheads and labels.
+
+\begin{figure*}[tb]
+\begin{syntax}
+%
+ <knot-piece>
+ &\iss & <piece><scale><knot-labels>
+ & interpret knot-piece
+\cr
+\noalign{\smallskip}
+%
+ <piece>
+ &\iss & <crossing>\orr<join>
+ & piece is a ??!^[crossing] or a ??!^[join]
+\cr
+\noalign{\smallskip}
+%
+ <scale>
+ &\iss & <empty>\orr~|-|~\orr |[|<num>|]|
+ & invert or ??!^[scale the knot piece]; \cr
+& & \orr |~|<pos><pos><pos><pos>
+ & ??!^[alter size and shape] using the <pos>s
+\cr
+%
+\noalign{\smallskip}
+<knot-labels>
+ &\iss & <empty>\orr <knot-tips><knot-labels>
+ & arrowtips at ends, aligned with orientation
+\cr
+%
+\noalign{\smallskip}
+ & & \orr <where><what><knot-labels>
+ & list??^[knot-labels] of ??!^[arrowtips, breaks and labels]
+\cr
+%
+\noalign{\smallskip}
+ & & \orr |@|<adjust><knot-labels>
+ & ??!^[adjust hole] position for a <crossing>;
+ \newline adjust other parameter??^[join control] for a <join>.
+\cr
+%
+\noalign{\smallskip}
+ <knot-tips>
+ & \iss &~~~|==|\orr|=!| & ??!^[arrowtips] at both/neither end
+ \cr
+ & & \orr|=<|\orr|=>| & ??!^[arrowtips] also at start/finish
+\cr
+\noalign{\smallskip}
+%
+ <where>
+ & \iss &~~~||||\orr||||<adjust> & `over' string on a <crossing>;%
+ ??^[which string]
+ \newline middle??^[join places] place on a <join>.
+\cr
+ & & \orr|<|\orr|<|<adjust> & initial portion of `under' string
+ on a <crossing>;??^[which string]
+ \newline earlier??^[join places] place on a <join>.
+\cr
+ & & \orr|>|\orr|>|<adjust> & final portion of `under' string
+ on a <crossing>;??^[which string]
+ \newline later??^[join places] place on a <join>.
+\cr
+%
+\noalign{\smallskip}
+ <adjust>
+ & \iss &~~~|(+|<num>|)|\orr|(-|<num>|)|
+ & ??!^[adjustment] from current value of parameter
+\cr
+ & & \orr|(=|<num>|)|\orr|(|<num>|)| & set parameter value??^[adjustment]
+\cr
+\noalign{\smallskip}
+%
+ <what>
+ &\iss & ~~~|>|\orr|<| & arrowhead aligned with/against ??!^[orientation]
+\cr
+ & & \orr|\knothole|\orr|\khole| & leave ??!^[hole in the string]
+\cr
+ & & \orr|{|<text>|}| & set??^[simple label] <text> as label,
+ using |\labelstyle|
+\cr
+ & & \orr|{*|<object>|}| & drop <object>??^[knot object]
+\cr
+ & & \orr|{|<anchor><it>|}| & <break> or label??^[knot object]
+ as on an <arrow>
+\cr
+ & & \orr|||| & ??!^[null-break]
+\cr
+%
+\end{syntax}
+\caption{\protect<knot-piece> construction set}
+??=[f.path]
+\end{figure*}
+
+
+All the pieces ultimately use curves from the |curve| extension, usually
+indirectly via the |arrow| feature.
+As such, processing can be memory-intensive and may seem rather slow.
+All the warnings and advice given elsewhere on techniques to handle pages
+and individual diagrams with many curves are especially applicable when
+using this feature.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Most constructions use |\ar| so make sure this feature is loaded.
+
+\DOCMODE(
+\xyrequire{arrow}\xycatcodes
+\DOCMODE)
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\centerline{
+%
+\UseComputerModernTips
+\vtop{\vbox{\xygraph{!{0;/r1.5pc/:} !{\vover}[u]
+ !{\hcap[-2]<<} [d] !{\vover-} [ruu] !{\hcap[2]><}}\smallskip}
+\hbox{\qquad\ \small simple link}}\hfil
+%
+% Figure-eight
+%
+\vtop{\vbox{\xygraph{!{0;/r1.5pc/:}
+ [u] !{\vloop<(-.005)\khole||\vcrossneg \vunder- }
+ [] !{\ar @{-}@'{p-(1,0)@+}+(-1,1)}
+ [ul] !{\vcap[3]>\khole}
+ [rrr] !{\ar @{-}@'{p-(0,1)@+}-(1,1)}
+}\smallskip}\hbox{\small figure-8 knot}}\hfil\quad
+%
+% cinque-foil
+%
+\vtop{\vbox{\xygraph{!{0;/r1.25pc/:}
+ !P5"a"{~>{}} !P10"b"{~:{(1.7487,0):}~>{}}
+ !P20"c"{~={-9}~:{(2.2,0):}~>{}}
+ !{\xunderv~{"b3"}{"b2"}{"a2"}{"a1"}}
+ !{\xunderv~{"b5"}{"b4"}{"a3"}{"a2"}}
+ !{\xunderv~{"b7"}{"b6"}{"a4"}{"a3"}}
+ !{\xunderv~{"b9"}{"b8"}{"a5"}{"a4"}}
+ !{\xunderv~{"b1"}{"b10"}{"a1"}{"a5"}}
+ !{\vloop~{"c3"}{"c2"}{"b2"}{"b1"}<<}
+ !{\vloop~{"c7"}{"c6"}{"b4"}{"b3"}<<}
+ !{\vloop~{"c11"}{"c10"}{"b6"}{"b5"}<<}
+ !{\vloop~{"c15"}{"c14"}{"b8"}{"b7"}<<}
+ !{\vloop~{"c19"}{"c18"}{"b10"}{"b9"}<<}
+}\smallskip}\hbox{\quad\ \small cinquefoil}}
+}%
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{Crossings}
+
+A ``crossing'' is intended to represent two strings passing close by,
+but not meeting. The macros provided specify typesetting within a square
+cell of coordinate values; using a non-square basis alters this shape,
+but see also note~??[alter size and shape] below, for the technique
+that was used in the ``cinquefoil'' example above.
+
+\begin{notes}
+\note??=[crossing]
+Several families of crossing are provided. Those having names as |\v...|
+and |\h...| are designed to stack respectively vertically and
+horizontally. More precisely the current <pos> starts at the top-left
+corner and finishes at either the bottom-left or top-right.
+Say that a crossing is either a `vertical crossing' or `horizontal
+crossing' respectively.
+
+This certainly applies to the |\..cross..| and |\..twist..| families,
+see figure~??[f.crossings] in which the strings enter and leave the
+square all with vertical tangents or all with horizontal tangents.
+Indeed {\em all} crossings are either vertical or horizontal, with
+the final letter indicating which for the |\xover..| families.
+
+Furthermore there is a natural {\em orientation\/} for each crossing,
+as well as along each strand. This corresponds to the order in which ink
+is applied to the printed page, following the natural parametrization of
+each strand as a curved connection or arrow.
+This orientation determines whether a crossing is `over' (mathematically,
+positive or right-handed) or `under' (mathematically, negative or
+left-handed). It is used in determining the location of labels and the
+direction of arrowheads placed along the strings.
+Note that |\..cross..| and |\..twist..| crossings may set the same
+curves, but with different orientation and label-positioning.
+
+\begin{figure*}[ht]
+$$
+\knotholesize{5pt}\UseComputerModernTips
+ \xygraph{!{0;/r2pc/:}="O"
+ [] !{\vcross<>|>>><{x}|{y}>{z}}
+ [rur]!{\vcrossneg<>|>>><{x}|{y}>{z}}
+ [rur]!{\vuncross<>|>>><{x}|{y}>{z}}
+ [urrr]!{\hcross<>|>>><{x}|{y}>{z}}
+ [r]!{\hcrossneg<>|>>><{x}|{y}>{z}}
+ [r]!{\huncross<>|>>><{x}|{y}>{z}}
+ "O" !{+(.5,-1.5)}
+ [] !{*\txt\small\tt{\string\vcross}}
+ [rr]!{*\txt\small\tt{\string\vcrossneg}}
+ [rr]!{*\txt\small\tt{\string\vuncross}}
+ [rrr]!{*\txt\small\tt{\string\hcross}}
+ [rr]!{*\txt\small\tt{\string\hcrossneg}}
+ [rr]!{*\txt\small\tt{\string\huncross}}
+ "O" !{+(0,-3)}
+ [] !{\vtwist<>|>>><{x}|{y}>{z}}
+ [rur]!{\vtwistneg<>|>>><{x}|{y}>{z}}
+ [rur]!{\vuntwist<>|>>><{x}|{y}>{z}}
+ [urrr]!{\htwist<>|>>><{x}|{y}>{z}}
+ [r]!{\htwistneg<>|>>><{x}|{y}>{z}}
+ [r]!{\huntwist<>|>>><{x}|{y}>{z}}
+ "O" !{+(.5,-4.5)}
+ !{*\txt\small\tt{\string\vtwist}}
+ [rr]!{*\txt\small\tt{\string\vtwistneg}}
+ [rr]!{*\txt\small\tt{\string\vuntwist}}
+ [rrr]!{*\txt\small\tt{\string\htwist}}
+ [rr]!{*\txt\small\tt{\string\htwistneg}}
+ [rr]!{*\txt\small\tt{\string\huntwist}}
+ "O" !{+(0,-6)}
+ []!{\xoverv<>|>>><{x}|{y}>{z}}
+ [urr]!{\xunderv<>|>>><{x}|{y}>{z}}
+ [urr]!{\xunoverv<>|>>><{x}|{y}>{z}}
+ [urrr]!{\xoverh<>|>>><{x}|{y}>{z}}
+ [r]!{\xunderh<>|>>><{x}|{y}>{z}}
+ [r]!{\xunoverh<>|>>><{x}|{y}>{z}}
+ "O" !{+(.5,-7.5)}
+ !{*\txt\small\tt{\string\xoverv}}
+ [rr]!{*\txt\small\tt{\string\xunderv}}
+ [rr]!{*\txt\small\tt{\string\xunoverv}}
+ [rrr]!{*\txt\small\tt{\string\xoverh}}
+ [rr]!{*\txt\small\tt{\string\xunderh}}
+ [rr]!{*\txt\small\tt{\string\xunoverh}}
+ "O" !{+(0,-9)}
+ !{\vover<>|>>><{x}|{y}>{z}}
+ [rur]!{\vunder<>|>>><{x}|{y}>{z}}
+ [rur]!{\vunover<>|>>><{x}|{y}>{z}}
+ [urrr]!{\hover<>|>>><{x}|{y}>{z}}
+ [r]!{\hunder<>|>>><{x}|{y}>{z}}
+ [r]!{\hunover<>|>>><{x}|{y}>{z}}
+ "O" !{+(.5,-10.5)}
+ !{*\txt\small\tt{\string\vover}}
+ [rr]!{*\txt\small\tt{\string\vunder}}
+ [rr]!{*\txt\small\tt{\string\vunover}}
+ [rrr]!{*\txt\small\tt{\string\hover}}
+ [rr]!{*\txt\small\tt{\string\hunder}}
+ [rr]!{*\txt\small\tt{\string\hunover}}
+}$$
+\caption{knot crossings with orientations and label positions}%
+??=[f.crossings]
+\end{figure*}
+
+\noindent
+Figure~??[f.crossings] displays the orientation on all the crossings,
+grouping them into subfamilies consisting of right-handed, left-handed
+and non-crossings. Also indicated are the default positions for labels
+and arrow-tips; each piece uses the same code for tips and labels,
+e.g. |\vover<>||>>><{x}||{y}>{z}|.
+
+The |\x...| crossings do not stack easily since their tangents are at
+$45^\circ$ to the coordinate axes. It is the last letter in the name
+which denotes whether the particular crossing is vertical or horizontal.
+On the other hand |\vover|\,, |\vunder| etc. stack vertically on top of
+a |\vcross|\,, |\vtwist| etc.; similarly |\hover| stacks at the left
+of |\hcross|\,, |\htwist| etc.
+
+\begin{code}
+$$\xy 0;/r1pc/:
+ ,{\vunder\vtwist\vtwist\vunder-}\endxy
+\qquad\qquad\qquad \xy 0;/r1pc/:+(0,-1.5)
+ ,{\hover\hcross\hcross\hover-}\endxy$$
+\end{code}
+\docode
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Parsing}
+
+\DOCMODE(
+\xydef@\xykparsecross@{%
+ \def\xykSCALE@@{}\edef\xyknotPLACE{\xykmidPLACE@}%
+ \let\xykparser@=\xykparsecross@@
+ \def\xykdefaultbreak@{\let\xykbreak@=\xykforetemp@
+ \def\xyknotPLACE{(.5)}\appendtoholder@}%
+ \xyFN@\xykparsescale@ }
+
+{\xyuncatcodes \catcode`@=11
+\gdef\next{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsecross@@}%
+ \else\addLT@\ifx\next \addLT@\DN@{\xyprecross@}%
+ \else\addGT@\ifx\next \addGT@\DN@{\xypostcross@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\xyFN@\xykparsetips@@}%
+ \else\ifx|\next\DN@|{\xymidcross@}%
+ \else\addAT@\ifx\next \addAT@\DN@(##1){%
+ \xyadjustBREAK@i##1@@\xyFN@\xykparsecross@@}%
+ \else\DN@{\afterknot@}%
+ \fi\fi\fi\fi\fi\fi \next@ }}
+\xylet@\xykparsecross@@=\next
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xyprecross@{%
+ \def\xykholder@{\xykprebreak@@}%
+ \edef\xyknotPLACE{\xykprePLACE@}%
+ \xyFN@\xykparsebreak@}
+
+\xydef@\xypostcross@{%
+ \def\xykholder@{\xykpostbreak@@}%
+ \edef\xyknotPLACE{\xykpostPLACE@}%
+ \xyFN@\xykparsebreak@}
+
+\xydef@\xymidcross@{%
+ \def\xykholder@{\xykmidbreak@@}%
+ \edef\xyknotPLACE{\xykmidPLACE@}%
+ \xyFN@\xykparsebreak@}
+\DOCMODE)
+
+These macros are common to most crossings.
+
+\DOCMODE(
+\xydef@\xykcross@#1{\xykcheckTIPS@
+ \expandafter\toks@\expandafter{\expandafter#1\knotSTYLE}}
+
+\xydef@\xykoverstring@{\addtotoks@{{}}\xykmidbreak@ \xyknottips@}
+\xydef@\xykunderstring@{\xykprebreak@ \xykpostbreak@ \xyknottips@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{``cross'' crossings:}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The initialisation\dots
+
+\DOCMODE(
+\xydef@\vcross{\begingroup\def\afterknot@{\xyvcross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\hcross{\begingroup\def\afterknot@{\xyhcross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vcrossneg{\begingroup\def\afterknot@{\xyvcrossneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\hcrossneg{\begingroup\def\afterknot@{\xyhcrossneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vuncross{\begingroup\def\afterknot@{\xyvuncross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\huncross{\begingroup\def\afterknot@{\xyhuncross}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\DOCMODE)
+
+The interface\dots
+
+\DOCMODE(
+\xydef@\xyvcross{\xykcross@\xykcrossv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyhcross{\xykcross@\xykcrossh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyvcrossneg{\xykcross@\xykcrossv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyhcrossneg{\xykcross@\xykcrossh
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyvuncross{\xykcross@\xykuncrossv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyhuncross{\xykcross@\xykuncrossh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+\DOCMODE)
+
+The drawing code\dots
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz_\ar #1@'{"_<"**{}?(.25)@+,?+(.375,0)@+,
+ "_>";"^>"**{}?-(.375,0)@+,?(.25)@+}"_>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?+(.375,0)@+,
+ "^>";"_>"**{}?-(.375,0)@+,?(.25)@+}"^>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykcrossv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz_\ar #1@'{"_>"**{}?(.25)@+,?+(0,.375)@+,
+ "^>";"^<"**{}?-(0,.375)@+,?(.25)@+}"^>"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?+(0,.375)@+,
+ "^<";"^>"**{}?-(0,.375)@+,?(.25)@+}"^<"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykcrossh=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"_<"**{}?(.25)@+,?(.375)+(.375,0)@+,
+ "^>";"_>"**{}?(.375)-(.375,0)@+,?(.25)@+}"^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?(.375)+(.375,0)@+,
+ "_>";"^>"**{}?(.375)-(.375,0)@+,?(.25)@+}"_>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykuncrossv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz^\ar #1@'{"_>"**{}?(.25)@+,?(.375)+(0,.375)@+,
+ "^<";"^>"**{}?(.375)-(0,.375)@+,?(.25)@+}"^<"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?(.375)+(0,.375)@+,
+ "^>";"^<"**{}?(.375)-(0,.375)@+,?(.25)@+}"^>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykuncrossh=\next
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{``over'' crossings:}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The initialisation\dots
+
+\DOCMODE(
+\xydef@\vover{\begingroup\def\afterknot@{\xyvover}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{|(.725)\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\hover{\begingroup\def\afterknot@{\xyhover}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{|(.725)\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\vunder{\begingroup\def\afterknot@{\xyvunder}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.2)}\def\xykpostbreak@@{|(.275)\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\hunder{\begingroup\def\afterknot@{\xyhunder}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.2)}\def\xykpostbreak@@{|(.275)\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\vunover{\begingroup\def\afterknot@{\xyvunover}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\hunover{\begingroup\def\afterknot@{\xyhunover}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+
+
+\xydef@\xoverv{\begingroup\def\afterknot@{\xyxoverv}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\xunderv{\begingroup\def\afterknot@{\xyxunderv}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\xoverh{\begingroup\def\afterknot@{\xyxoverh}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\xunderh{\begingroup\def\afterknot@{\xyxunderh}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.85)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\xunover{\begingroup\def\afterknot@{\xyxunover}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.15)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\xunoverv{\begingroup\def\afterknot@{\xyxunoverv}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.2)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+
+\xydef@\xunoverh{\begingroup\def\afterknot@{\xyxunoverh}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.8)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\DOCMODE)
+
+The interface\dots
+
+\DOCMODE(
+\xydef@\xyvover{\xykcross@\xykoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyhover{\xykcross@\xykoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyvunder{\xykcross@\xykoverv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyhunder{\xykcross@\xykoverh
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyvunover{\xykcross@\xykunoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyhunover{\xykcross@\xykunoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+
+\xydef@\xyxoverv{\xykcross@\xykxoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyxunderv{\xykcross@\xykxoverv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyxoverh{\xykcross@\xykxoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyxunderh{\xykcross@\xykxoverh
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyxunover{\xykcross@\xykxoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyxunoverv{\xykcross@\xykxunoverv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyxunoverh{\xykcross@\xykxunoverh
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+\DOCMODE)
+
+The drawing code\dots
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"^>"**{}?(.25)@+,?(.625)+(0,-.125)@+,
+ "_>";"^>"**{}?(.625)-(.125,0)@+,?(.25)@+}"_>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?(.625)+(.125,0)@+,
+ "^>";"^<"**{}?(.625)-(0,.125)@+,?(.25)@+}"^>"#6#7#8},\restore\POS#9}}
+\xylet@\xykoverv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz^\ar #1@'{"^<"**{}?(.25)@+,?(.625)+(.125,0)@+,
+ "^>";"^<"**{}?(.625)-(0,.125)@+,?(.25)@+}"^>"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?(.625)+(0,.125)@+,
+ "^<";"_<"**{}?(.625)+(.125,0)@+,?(.25)@+}"^<"#6#7#8},\restore\POS#9}}
+\xylet@\xykoverh=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"^>"**{}?(.25)@+,?-(0,.175)@+,?(.75)@+}
+ "^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^<"**{}?(.25)@+,?+(.125,0)@+,
+ "_>"**{}?+(0,.7)@+,"_>";"^>"**{}?-(.125,0)@+,?(.25)@+}
+ "_>"#6#7#8},\restore\POS#9}}
+\xylet@\xykunoverv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "_<",{\xykz^\ar #1@'{"^<"**{}?(.25)@+,?+(.175,0)@+,?(.75)@+}
+ "^<"#3#4#5},
+ "_>",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?+(0,.125)@+,
+ "^>"**{}?-(.7,0)@+,"^>";"^<"**{}?-(0,.125)@+,?(.25)@+}
+ "^>"#6#7#8},\restore\POS#9}}
+\xylet@\xykunoverh=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"^>"**{}?="^_","_<";"_>"**{}?;"^_",**{}?="^_",
+ "^>",{\xykz^\ar #1@'{"^_"@+}"_<"#3#4#5},
+ "^<",{\xykz_\ar #2@'{"^_"@+}"_>"#6#7#8},\restore\POS#9}}
+\xylet@\xykxoverv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"_<"**{}?="^_","^>";"_>"**{}?;"^_",**{}?="^_",
+ "^<",{\xykz_\ar #1@'{"^_"@+}"_>"#3#4#5},
+ "_<",{\xykz_\ar #2@'{"^_"@+}"^>"#6#7#8},\restore\POS#9}}
+\xylet@\xykxoverh=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"^>"**{}?="^_","_<";"_>"**{}?;"^_",**{}?="^_",
+ "^>",{\xykz^\ar #1@'{"^_"@+}"_>"#3#4#5},
+ "^<",{\xykz^\ar #2@'{"^_"@+}"_<"#6#7#8},\restore\POS#9}}
+\xylet@\xykxunoverv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<";"_<"**{}?="^_","^>";"_>"**{}?;"^_",**{}?="^_",
+ "^<",{\xykz^\ar #1@'{"^_"@+}"^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"^_"@+}"_>"#6#7#8},
+ \restore\POS#9}}
+\xylet@\xykxunoverh=\next
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{``twist'' crossings:}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The initialisation\dots
+
+\DOCMODE(
+\xydef@\vtwist{\begingroup\def\afterknot@{\xyvtwist}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\htwist{\begingroup\def\afterknot@{\xyhtwist}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vtwistneg{\begingroup\def\afterknot@{\xyvtwistneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\htwistneg{\begingroup\def\afterknot@{\xyhtwistneg}%
+ \def\xykprePLACE@{(.1)}\def\xykpostPLACE@{(.9)}%
+ \def\xykmidPLACE@{(.9)}\def\xykpostbreak@@{|\knothole}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\vuntwist{\begingroup\def\afterknot@{\xyvuntwist}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.85)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\xydef@\huntwist{\begingroup\def\afterknot@{\xyhuntwist}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.85)}%
+ \def\xykmidPLACE@{(.85)}\def\xykpostbreak@@{}%
+ \xyFN@\xykparsecross@ }%
+\DOCMODE)
+
+The interface\dots
+
+\DOCMODE(
+\xydef@\xyvtwist{\xykcross@\xyktwistv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyvtwistneg{\xykcross@\xyktwistv
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyvuntwist{\xykcross@\xykuntwistv
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(0,-1)}}
+
+\xydef@\xyhtwist{\xykcross@\xyktwisth
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyhuntwist{\xykcross@\xykuntwisth
+ \xykoverstring@ \xykunderstring@ \xykhvobject@{+(1,0)}}
+
+\xydef@\xyhtwistneg{\xykcross@\xyktwisth
+ \xykunderstring@ \xykoverstring@ \xykhvobject@{+(1,0)}}
+\DOCMODE)
+
+The drawing code\dots
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^>",{\xykz_\ar #1@'{"_>"**{}?(.25)@+,?-(.375,0)@+,
+ "_<";"^<"**{}?+(.375,0)@+,?(.25)@+}"_<"#3#4#5},
+ "^<",{\xykz^\ar #2@'{"_<"**{}?(.25)@+,?+(.375,0)@+,
+ "_>";"^>"**{}?+(-.375,0)@+,?(.25)@+}"_>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xyktwistv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^>",{\xykz^\ar #1@'{"_>"**{}?(.125)@+,?(.375)-(.25,0)@+,
+ ?(.625)-(.25,0)@+,?(.875)@+}"_>"#3#4#5},
+ "^<",{\xykz^\ar #2@'{"_<"**{}?(.125)@+,?(.375)+(.25,0)@+,
+ ?(.625)+(.25,0)@+,?(.875)@+}"_<"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xykuntwistv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz_\ar #1@'{"^>"**{}?(.25)@+,?+(0,-.375)@+,
+ "_>";"_<"**{}?+(0,.375)@+,?(.25)@+}"_>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"_>"**{}?(.25)@+,?+(0,.375)@+,
+ "^>";"^<"**{}?-(0,.375)@+,?(.25)@+}"^>"#6#7#8}
+ \restore\POS #9}}
+\xylet@\xyktwisth=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\save,
+ "^<",{\xykz^\ar #1@'{"^>",**{}?(.125)@+,?(.375)+(0,-.25)@+,
+ ?(.625)+(0,-.25)@+,?(.875)@+}"^>"#3#4#5},
+ "_<",{\xykz^\ar #2@'{"_>",**{}?(.125)@+,?(.375)+(0,.25)@+,
+ ?(.625)+(0,.25)@+,?(.875)@+}"_>"#6#7#8},\restore\POS #9}}
+\xylet@\xykuntwisth=\next
+
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[scale the knot piece]
+The above examples also show how to use |-| to get the mirror-image of a
+particular crossing. Any numerical scale factor can be used by enclosing
+it within |[..]| e.g. |[2.3]| scaling a single piece without affecting
+the rest of the picture. The scale-factor {\em must\/} occur before any
+label or arrow-tip specifiers, see below). Vertical crossings remain
+vertical under scalings; the current <pos> still moves by 1 coordinate
+unit in the `down' direction. Similarly horizontal crossings remain
+horizontal. The single character |-| is a shorthand version for |[-1]|,
+effectively giving a half-turn rotation in a rectangular basis.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xykparsescale@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsescale@}%
+ \else\addDASH@\ifx\next \addDASH@\DN@{\def\xykSCALE@@{-1}%
+ \xyFN@\xykparser@}%
+ \else\ifx[\next \DN@[##1]{\dimen@=##1\p@
+ \ifdim\dimen@=\z@\xywarning@{\xykscaleerror@}%
+ \else\edef\xykSCALE@@{\expandafter\removePT@\the\dimen@}\fi
+ \xyFN@\xykparser@}%
+ \else\ifx~\next \DN@~##1##2##3##4{%
+ \def\xykSCALE@@{@{##1}{##2}{##3}{##4}}\xyFN@\xykparser@}%
+ \else\DN@{\xyFN@\xykparser@}%
+ \fi\fi\fi\fi \next@}
+
+\xydef@\xykscaleerror@{Ignoring zero scale factor}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[alter size and shape]
+A knot-piece need not be rectangular. By specifying
+|~|<pos>$_1$<pos$_2$><pos$_3$><pos$_4$> the four corners |UL|, |UR|,
+|DL|, |DR| are set to the given <pos>s respectively.
+The local basis is established so that
+\begin{eqnarray*}
+r\hbox{--hop}&\!\!\leftrightarrow\!\!&
+{\textstyle{1\over2}}\bigl(\hbox{<pos$_2$>}-\hbox{<pos$_1$>}
++\hbox{<pos$_4$>} -\hbox{<pos$_3$>}\bigr) \\
+u\hbox{--hop}&\!\!\leftrightarrow\!\!&
+{\textstyle{1\over2}}\bigl(\hbox{<pos$_1$>}-\hbox{<pos$_3$>}
++\hbox{<pos$_2$>} -\hbox{<pos$_1$>}\bigr)\;.
+\end{eqnarray*}
+
+\note??=[adjust hole]
+With a non-rectangularly shaped piece it will usually be necessary to
+adjust the place where the `hole' occurs in the `under' string. This is
+done by specifying |@(|<num>|)|, with $0\le <num>\le1$ being the parameter
+value of the new location for the hole.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+%\xydef@\xykobject@{%
+% \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+% \else \DN@{\xyksavescale@{}}%
+% \fi \next@ }
+
+\xydef@\xykhobject@{\aftergroup\xykhadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+
+\xydef@\xykvobject@{\aftergroup\xykvadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+
+\xydef@\xykhvobject@{\aftergroup\xykhvadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+
+\xydef@\xykhuobject@{\aftergroup\xykhuadjust@
+ \ifx\xykSCALE@@\empty\DN@{\xykkeepscale@}%
+ \else \DN@{\xyksavescale@{}}%
+ \fi \next@ }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xyksavescale@#1#2{%
+ \expandafter\ifx\the\Edge@c\zeroEdge\relax \def\xyksaveEdgec{}%
+ \else
+ \edef\xyksaveEdgec{\noexpand\Edge@c={\expandafter\noexpand\the\Edge@c}%
+ \L@c=\the\L@c \R@c=\the\R@c \D@c=\the\D@c \U@c=\the\U@c}%
+ \fi
+%
+ \edef\next@##1##2{\endgroup
+ \def\noexpand\xyksaveEdgec{}%
+ \def\noexpand\xykSCALE@@\noexpand{##1}%
+ \def\noexpand\xykjoincontrol\noexpand{\xykjoincontrol}%
+ \noexpand\toks@\noexpand{##2}%
+ \noexpand\xy@@{\def\noexpand\xyksaveEdgec{}%
+ \def\noexpand\xykSCALE@@{##1}%
+ \def\noexpand\xykjoincontrol{\xykjoincontrol}}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\xykSCALE@@\expandafter}%
+ \expandafter{\the\toks@}%
+%
+ \xykrescale@ #1\the\toks@\restore\POS#2}
+
+\xydef@\xykkeepscale@{%
+ \edef\next@##1{\endgroup \noexpand\toks@={##1}%
+ \def\noexpand\xykjoincontrol{\xykjoincontrol}}%
+ \expandafter\next@\expandafter{\the\toks@}%
+ \def\xykSCALE@@{}\def\xyksaveEdgec{}%
+ \xy@@{\def\xykSCALE@@{}\def\xyksaveEdgec{}}%
+ \edef\next@{\def\noexpand\xykjoincontrol{\xykjoincontrol}}%
+ \expandafter\xy@@\expandafter{\next@}%
+ \xyknoflexscale@ \the\toks@}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xykrescale@{\expandafter\xykcheckscale@\xykSCALE@@ !}%
+
+\xydef@\xykcheckscale@#1#2!{%
+ \expandafter\DN@\expandafter{\codeof{#1}}%
+ \expandafter\DNii@\expandafter{\codeof{@}}%
+ \ifx\next@\nextii@\relax\DN@{\xykflexiscale@#2%
+ \xy@@{\divide\X@xbase2\divide\X@ybase2\divide\Y@xbase2\divide\Y@ybase2%
+ \def\xykSCALE@@{}}\def\xykSCALE@@{}%
+ \expandafter\toks@\expandafter{\afterFLEX@}}%
+ \else\DN@{\save \xykrescale@@}\fi \next@ }
+
+\xydef@\xykflexiscale@{%
+ \expandafter\def\expandafter\afterFLEX@\expandafter{\the\toks@}%
+ \xykflexiscale@@ }
+
+\xydef@\xykrescale@@{%
+ \edef\next@{\X@xbase=\xykSCALE@@\X@xbase \X@ybase=\xykSCALE@@\X@ybase
+ \Y@xbase=\xykSCALE@@\Y@xbase \Y@ybase=\xykSCALE@@\Y@ybase}%
+ \expandafter\xy@@\expandafter{\next@}%
+ \ifdim\xykSCALE@@\p@<\z@\relax \DN@{\xyknegflexscale@}%
+ \else\DN@{\xyknoflexscale@}\fi \next@ }
+\DOCMODE)
+
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4{\save="@",
+ #1,="^<",\POS"@",#2,="^>",\POS"@",#3,="_<",\POS"@",#4,="_>",
+ (0,0);"^>"-"^<"+"_>"-"_<":"^<"-"_<"+"^>"-"_>"::}}
+\xylet@\xykflexiscale@@=\next
+
+{\xyuncatcodes \gdef\next{\save ="^<",
+ +(1,0)="^>",-(1,1)="_<",+(1,0)="_>"\restore }}
+\xylet@\xyknoflexscale@@=\next
+\xylet@\xyknoflexscale@=\next
+
+{\xyuncatcodes \gdef\next{\save ="_>",
+ +(-1,1)="^<",+(1,0)="^>",-(1,1)="_<"\restore }}
+\xylet@\xyknegflexscale@@=\next
+\xylet@\xyknegflexscale@=\next
+
+{\xyuncatcodes \gdef\next{\save ="_<",
+ +(1,0)="_>",+(-1,1)="^<",+(1,0)="^>"\restore }}
+\xylet@\xykhscale@@=\next
+
+{\xyuncatcodes \gdef\next{\save ="^>",
+ -(1,0)="^<",+(1,-1)="_>",-(1,0)="_<"\restore }}
+\xylet@\xykvscale@@=\next
+\DOCMODE)
+
+
+\DOCMODE(
+\xydef@\xykhadjust@{%
+ \let\xyknoflexscale@=\xykhscale@@
+ \let\xyknegflexscale@=\xyknegflexscale@@ }
+
+\xydef@\xykvadjust@{%
+ \let\xyknoflexscale@=\xyknoflexscale@@
+ \let\xyknegflexscale@=\xykhscale@@ }
+
+\xydef@\xykhvadjust@{%
+ \let\xyknoflexscale@=\xyknoflexscale@@
+ \let\xyknegflexscale@=\xyknegflexscale@@ }
+
+\xydef@\xykhuadjust@{%
+ \let\xyknoflexscale@=\xykhscale@@
+ \let\xyknegflexscale@=\xykvscale@@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[arrowtips, breaks and labels]
+The |knot| feature allows for the easy placement of the following objects
+along the strings of a crossing:\par
+\begin{itemize}
+\item labels on the strings;
+\item arrowheads for direction or orientation;
+\item holes in strings, allowing another string to be drawn passing over.
+\end{itemize}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note ??=[which string]
+The characters |<|, |>| and |||| are used to indicate to which string
+portion the object is associated; with |||| denoting the string which
+crosses the other, while |<| and |>| denote the initial and final
+portions of the `crossed' string.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xykprebreak@{%
+ \ifx\xykprebreak@@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xykprebreak@@}}\fi}
+
+\xydef@\xykpostbreak@{%
+ \ifx\xykpostbreak@@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xykpostbreak@@}}\fi}
+
+\xydef@\xykmidbreak@{%
+ \ifx\xykmidbreak@@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xykmidbreak@@}}\fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note ??=[simple label]
+A simple label enclosed in braces, for example |\vcross>{x}|, is set in
+math-mode using the |\labelstyle|, at a pre-determined place on the string
+portion, shifted in either the `above' or `below' direction from the curve
+at this point. (For each crossing depicted in figure~??[f.crossings] only
+default values are used for the place and shift-direction.)
+
+\note ??=[knot object]
+If the first character within the braces |{..}| is |*| e.g.
+|\htwist>{*|<object>|}|, then a general <object> may be placed as a label.
+Furthermore if the first character is |^| or |_| or ||||, then
+the interpretation is, e.g. |\vtwist<{^|<anchor><it>|}|,
+as in ??g[xyarrow.doc:f.arrow]
+to place <it> as a label along an |\ar| of the |arrow| feature.
+
+\note ??=[orientation]
+A second character |<| or |>| specifies that an arrowhead should appear
+at the pre-determined place on the chosen string.
+Here |>| denotes an arrowhead pointing with the natural orientation,
+while |<| points against. Due to the curvature of the strings, it is
+usually best to |\UseComputerModernTips| rather than normal arrow-tips.
+
+\note ??=[hole in the string]
+To generate a `hole' use |\knothole|, or simply |\khole|, as following
+token. This generates a `break', in the sense of
+??g[xyarrow.doc:break with <it>].
+Indeed such a `hole' is used to separate the two portions of the `crossed'
+string. Default size for the hole is 5pt, which is alterable via
+|\knotholesize{|<dimen>|}|; normally used to set the size for {\em all}\/
+holes in a diagram.
+
+\note ??=[null-break]
+If the resulting |\khole| is either too large or perhaps non-existent,
+this could be due to a technicality in the way breaks in curves are
+handled. This problem should not occur with the standard crossings, using
+a rectangular basis, but it may occur with non-rectangular bases.
+An easy `fix' is to include an extra {\em null-break}\ on the string,
+using |<|||, |>||| or ||||||, which should place the zero-sized break at
+parameter value .5 on the curve. The specification should precede a
+|\khole| at a higher parameter value, or come after one at a lower value.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The aim of the above `fix' is to position the null-break as close as
+possible to where the curve is farthest from the line joining its
+end-points, which is usually at parameter value |(.5)|.
+
+\DOCMODE(
+\xydef@\xykparsebreak@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsebreak@}%
+ \else \addLT@\ifx\next
+ \expandafter\appendtoholder@\xykbacktemp@\next@
+ \addLT@\DN@{\xyFN@\xykparser@}%
+ \else \addGT@\ifx\next
+ \expandafter\appendtoholder@\xykforetemp@\next@
+ \addGT@\DN@{\xyFN@\xykparser@}%
+ \else \ifx|\next
+ \expandafter\appendtoholer@\xyknulltemp@\next@
+ \DN@|{\xyFN@\xykparser@}%
+ \else \ifx\next \bgroup\DN@##1{\checkgroupbreak@##1@}%
+ \else \ifx (\next\DN@(##1){\xyadjustknotPLACE@i##1@@%
+ \xyFN@\xykparsebreak@}%
+ \else \ifx\next \knothole@\DN@##1{\expandafter\appendtoholder@@
+ \expandafter{\expandafter|\xyknotPLACE\knothole}\next@
+ \xyFN@\xykparser@}%
+ \else
+ \expandafter\xykdefaultbreak@\xykbreak@\next@
+ \DN@{\xyFN@\xykparser@}%
+ \fi\fi\fi\fi\fi\fi\fi \next@ }
+\DOCMODE)
+
+Templates for arrowheads.
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next{^>*\dir{>}}}
+\xylet@\xykforetips@=\next
+
+{\xyuncatcodes \gdef\next{^<*\dir{<}}}
+\xylet@\xykbacktips@=\next
+
+{\xyuncatcodes \gdef\next{*!/-1pt/=0\dir{>}}}
+\xylet@\xykforetemp@=\next
+
+{\xyuncatcodes \gdef\next{*!/1pt/=0\dir{<}}}
+\xylet@\xykbacktemp@=\next
+
+{\xyuncatcodes \gdef\next{*=<\xykholesize>[o]{}}}
+\xylet@\xykholetemp@=\next
+\xydef@\knothole@{\hbox to\xykholesize{%
+ \dimen@=\xykholesize \divide\dimen@\tw@
+ \hfill \vrule height\dimen@ depth\dimen@ width\z@ }}
+\xylet@\knothole=\knothole@
+\xylet@\khole=\knothole@
+
+{\xyuncatcodes \gdef\next{*=<0pt>{}}}
+\xylet@\xyknulltemp@=\next
+\xylet@\xykbreak@=\xyknulltemp@
+\DOCMODE)
+
+When the next token is a begin-group character |{| then look at the first
+token inside the group. If it is |^|,|_| or |||| then the group contents
+will be an <anchor> for user-chosen places along the string.
+Otherwise the place is taken to be the already specified |\xyknotPLACE|
+and the group contains a label, to be set in the usual way for labels,
+using |_| due to the orientation of the curve.
+However if the first token is |*| then the user is assumed to be
+dropping his own label, possibly with <object> modifiers.
+
+\DOCMODE(
+\xydef@\checkgroupbreak@#1#2@{%
+ \ifx|#1\DN@{\appendtoholder@@#1#2\next@ \xyFN@\xykparser@}%
+ \else \ifx_#1\DN@{\appendtoholder@@_#2\next@ \xyFN@\xykparser@}%
+ \else \ifx^#1\DN@{\appendtoholder@@^#2\next@ \xyFN@\xykparser@}%
+ \else
+ \def\next##1\next{\expandafter\DNii@\expandafter{\xyk@@##1}}%
+ \expandafter\next\xyknotPLACE\next
+ \ifx*#1%
+ \expandafter\DN@\expandafter{%
+ \expandafter\appendtoholder@@\nextii@#1#2\next@ \xyFN@\xykparser@}%
+ \else %\expandafter\DNii@\expandafter{\expandafter\xyk@@\xyknotPLACE}%
+ \expandafter\DN@\expandafter{%
+ \expandafter\appendtoholder@@\nextii@{#1#2}\next@ \xyFN@\xykparser@}%
+ \fi\fi\fi\fi \next@ }
+\DOCMODE)
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next{%
+ \expandafter{\expandafter^\xyknotPLACE##1}}}%
+ \DN@{\xydef@\xykholder@@##1}\DNii@{\expandafter\toks@}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\nextii@\next}
+
+\xydef@\appendtoholder@#1\next@{\xykholder@@{#1}%
+ \DN@##1{\expandafter\DN@\expandafter{\xykholder@##1}}%
+ \expandafter\next@\expandafter{\the\toks@}\appendtoholder@@@ }
+
+\xydef@\appendtoholder@@#1\next@{%
+ \DN@##1\next@{\expandafter\DN@\expandafter{\xykholder@##1}}%
+ \next@#1\next@ \appendtoholder@@@}%
+
+\xydef@\appendtoholder@@@{%
+ \expandafter\expandafter\expandafter\DN@
+ \expandafter\expandafter\expandafter{\next@}%
+ \DNii@{\expandafter\def\xykholder@}%
+ \expandafter\nextii@\expandafter{\next@}}
+\DOCMODE)
+
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next{%
+ \expandafter{\expandafter|\xyknotPLACE##1}}}%
+\DN@{\xydef@\xykholer@@##1}\DNii@{\expandafter\toks@}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\nextii@\next}
+
+\xydef@\appendtoholer@#1\next@{\xykholer@@{#1}%
+ \DN@##1{\expandafter\DN@\expandafter{\xykholder@##1}}%
+ \expandafter\next@\expandafter{\the\toks@}\appendtoholder@@@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+??=[knot-labels]
+Multiple breaks, arrow-heads and labels may be specified along the
+two strings of a crossing; simply place their specifications one after
+another; e.g. |<>||>>><{x}||{y}>{z}| was used in figure~??[f.crossings].
+
+The only proviso is that all `breaks' along a single strand must occur
+with increasing order of parameter position. On the `crossed' string
+this includes the automatic `hole' to create space for the other string.
+Hence it is advisable to use just the |(+..)| and |(-..)| variants for
+small adjustments, and to keep these correctly ordered.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xykz#1{\let\xyk@@=#1\xy@@{\let\xyk@@=#1}}
+{\xyuncatcodes \global\let\next=_}
+\xylet@\xyk@@=\next
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+??=[adjustment]
+Adjustment of position along the strings can be achieved using a <factor>,
+as in |\vover||(+.1)>|. Allowed syntax is |(|<sign><num>|)| where <sign>
+is |+| or |-| to increment or decrement from the pre-defined value.
+Also allowable are |=| or <empty> to set the parameter position to <num>,
+which must lie between 0 and 1 to have any meaning.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This parses adjustments of the |\xyknotPLACE|.
+
+\DOCMODE(
+\xydef@\xyadjustknotPLACE@i{%
+ \ifx\xyknotPLACE\empty\DN@{\dimen@=.5\p@}%
+ \else\DN@{\expandafter\xygetknotPLACE@@\xyknotPLACE}%
+ \fi \next@ \relax \let\xywhichknotPLACE@@=\xysetknotPLACE@@
+ \xyFN@\xyadjustknotPLACE@}
+
+\xydef@\xyadjustknotPLACE@{\expandafter\ifx\space@\next
+ \expandafter\DN@\space{\xyFN@\xyadjustknotPLACE@}%
+ \else\addDASH@\ifx\next\DN@{\xyadjustknotPLACE@@}%
+ \else\addPLUS@\ifx\next\DN@{\xyadjustknotPLACE@@}%
+ \else\addEQ@\ifx\next\addEQ@\DN@{\dimen@=\z@ \xyadjustknotPLACE@@}%
+ \else \DN@{\dimen@=\z@ \xyadjustknotPLACE@@}%
+ \fi\fi\fi\fi \next@}
+
+\xydef@\xyadjustknotPLACE@@#1@@{\advance\dimen@#1\p@
+ \expandafter\xysetknotPLACE@\expandafter{\the\dimen@}}
+
+\xydef@\xysetknotPLACE@#1{%
+ \expandafter\xywhichknotPLACE@@\expandafter{\removePT@#1}}
+
+{\xyuncatcodes\gdef\next#1{\def\xyknotPLACE{(#1)}}}%
+\xylet@\xysetknotPLACE@@=\next
+
+{\xyuncatcodes \catcode`@=11
+ \gdef\next(#1){\DN@\next@{#1}\ifx\next@\empty
+ \dimen@=\z@\else\dimen@=#1\p@ \fi}}%
+\xylet@\xygetknotPLACE@@=\next
+\DOCMODE)
+
+These use the same mechanism to adjust parameters stored in
+|\xykpostbreak@@| and |\xykjoincontrol@@|.
+
+\DOCMODE(
+%\xydef@\xyadjustJOIN@i#1@@{\xykjoincontrol@i{#1}}%
+\xydef@\xyadjustJOIN@i{%
+ \ifx\xykjoincontrol\empty\DN@{\dimen@=.75\p@}%
+ \else\DN@{\expandafter\xygetknotPLACE@@\expandafter(\xykjoincontrol)}%
+ \fi \next@ \relax \let\xywhichknotPLACE@@=\xysetjoincontrol@
+ \xyFN@\xyadjustknotPLACE@}
+
+%\xydef@\xyadjustBREAK@i#1@@{\def\xykpostbreak@@{|(##1)\knothole}}%
+\xydef@\xyadjustBREAK@i{%
+ \ifx\xykpostbreak@@\empty\DN@{\dimen@=.5\p@}%
+ \else\DN@{\expandafter\xygetpostBREAK@\xykpostbreak@@}%
+ \fi \next@ \relax \let\xywhichknotPLACE@@=\xysetpostbreak@
+ \xyFN@\xyadjustknotPLACE@}
+
+\xydef@\xygetpostBREAK@|#1\knothole{\DN@{#1}%
+ \ifx\next@\empty\dimen@=.5\p@\else \xygetknotPLACE@@#1\fi}
+
+\xydef@\xysetpostbreak@#1{\def\xykpostbreak@@{|(#1)\knothole}}
+\xydef@\xysetjoincontrol@#1{\edef\xykjoincontrol{#1}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+??=[arrowtips]
+Arrowheads can also be placed at either, or both, ends of of the strings
+forming a crossing. This is governed by a pair of booleans,
+initially |{FF}|.
+It is changed for {\em all}\/ subsequent strings in a diagram by
+|\knottips{..}| where the recognised values are |{FF}|, |{FT}|, |{TF}|
+and |{TT}|, denoting tips (|T|) or not (|F|) at the start and end of each
+string. To add arrowtips at the start of strings in a particular crossing,
+append the 2-character combination |=<|\,; similarly |=>| adds tips at the
+ends, if not already requested. The combinations |==| and |=!| specify
+both (|{TT}|) and none (|{FF}|) respectively.
+These 2-character pairs can be mixed in with any specifications for labels
+and breaks, etc. Multiple pairs compound their effect; in particular
+|=<=>| gives the same result as |==|, while |=!=<| is needed to change
+|{FT}| into |{TF}|.
+
+These are best used with single pieces, as in the following equation.
+%
+\begin{code}
+\UseComputerModernTips \knottips{FT}
+\def\Conway#1{\mathord{\nabla\Bigl[\,
+ \raise5pt\xybox{0;/r1pc/:#1}\,\Bigr]}}
+$$
+\Conway\htwist - \Conway\htwistneg
+ \;=\; -z\,\Conway\huntwist $$
+\end{code}
+\docode
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xykparsetips@{%
+ \def\xyknotTIPS@@{}\def\xyknotPLACE{}%
+ \let\xykparser@=\xykparsetips@@
+ \xyFN@\xykparser@ }
+
+\xydef@\xykparsetips@@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsetips@@}%
+ \else\addLT@\ifx\next
+ \ifx\xyknotTIPS@@\empty \def\xyknotTIPS@@{TF}%
+ \else\DN@{FF}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{TF}%
+ \else\DN@{FT}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{TT}%
+ \fi\fi\fi
+ \addLT@\DN@{\xyFN@\xykparser@}%
+ \else\addGT@\ifx\next
+ \ifx\xyknotTIPS@@\empty \def\xyknotTIPS@@{FT}%
+ \else\DN@{FF}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{FT}%
+ \else\DN@{TF}\ifx\next@\xyknotTIPS@@ \def\xyknotTIPS@@{TT}%
+ \fi\fi\fi
+ \addGT@\DN@{\xyFN@\xykparser@}%
+ \else\addEQ@\ifx\next \def\xyknotTIPS@@{TT}%
+ \addEQ@\DN@{\xyFN@\xykparser@}%
+ \else \ifx!\next \def\xyknotTIPS@@{FF}\DN@!{\xyFN@\xykparser@}%
+ \else\DN@{\xyFN@\xykparser@}%
+ \fi\fi\fi\fi\fi \next@ }
+\DOCMODE)
+
+This reads the setting for tips on string ends.
+
+\DOCMODE(
+\xydef@\xykcheckTIPS@{%
+ \ifx\xyknotTIPS@@\empty \edef\xyknotTIPS@@{\xyknotTIPS@}\fi
+ \DN@{FF}\ifx\next@\xyknotTIPS@@\def\tmp@{}%
+ \else\DN@{FT}\ifx\next@\xyknotTIPS@@
+ \expandafter\def\expandafter\tmp@\expandafter{\xykforetips@}%
+ \else\DN@{TF}\ifx\next@\xyknotTIPS@@
+ \expandafter\def\expandafter\tmp@\expandafter{\xykbacktips@}%
+ \else
+ \DN@##1\next@{\DN@{\xykforetips@##1}}%
+ \expandafter\next@\xykbacktips@\next@
+ \DNii@{\expandafter\def\expandafter\tmp@\expandafter}%
+ \expandafter\nextii@\expandafter{\next@}%
+ \fi\fi\fi \def\xyknotTIPS@@{}}
+
+\xydef@\xyknottips@{%
+ \ifx\tmp@\empty\addtotoks@{{}}\else
+ \expandafter\addtotoks@\expandafter{\expandafter{\tmp@}}\fi}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\end{notes}
+
+\subsection*{Joins}
+\note??=[join]
+The ``joins'' are used to connect the loose ends of crossing strings.
+In particular ``loops'' and ``caps'' are for placing on ends of
+horizontal or vertical `twist' and `cross' crossings, leaving the
+current <pos> fixed. The ``bends'' join non-adjacent crossings of
+the same type, either horizontal or vertical.
+
+The |\xcap..| pieces are designed to join adjacent |\xover..| pieces;
+they move $c$ either vertically or horizontally,
+as appropriate. Finally the |\xbend..| pieces allow for smooth joins
+of $45^\circ$ slopes to horizontal or vertical slopes. For these the
+actual positioning of the piece, see figure~??[f.knotjoins],
+is not entirely obvious.
+
+\begin{figure*}[ht]
+$$
+\knotholesize{5pt}\UseComputerModernTips
+\xygraph{!{0;/r2pc/:}="O" %[]!{\NoPSspecials}
+ [ll] !{*=0\dir{o},{\vloop<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ [rr]!{*=0\dir{o},{\vcap<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ [urr]!{*=0\dir{o},{\vcap-<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ [u(.5)rr]!{*=0\dir{o},{\vloop-<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ [d(.5)rr]!{*=0\dir{o},{\hloop<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ [rr]!{*=0\dir{o},{\hcap<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ [rrr]!{*=0\dir{o},{\hcap-<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ [rr]!{*=0\dir{o},{\hloop-<>|>>><{x}|{y}>{z}},*=0\dir{x}}
+ "O"!{+(.5,-.5)}
+ [ll]!{*\txt\small\tt{\string\vloop}} [rr]!{*\txt\small\tt{\string\vcap}}
+ [rr]!{*\txt\small\tt{\string\vcap-}}[rr]!{*\txt\small\tt{\string\vloop-}}
+ [rr]!{*\txt\small\tt{\string\hloop}}[rr]!{*\txt\small\tt{\string\hcap}}
+ [rr]!{*\txt\small\tt{\string\hcap-}}[rr]!{*\txt\small\tt{\string\hloop-}}
+ "O"!{-(1,3)} %[]!{\NoPSspecials}
+ [ur]!{*=0\dir{o},{\xcapv<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [urr]!{*=0\dir{o},{\sbendv<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [r] !{*=0\dir{o},{\zbendv<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [dr] !{*=0\dir{o},{\sbendh<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [r] !{*=0\dir{o},{\zbendh<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [r] !{*=0\dir{o},{\xcaph<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ "O"!{-(1.5,3.5)}
+ [rr]!{*\txt\small\tt{\string\xcapv}}
+ [rr]!{*\txt\small\tt{\string\sbendv}}
+ [rr]!{*\txt\small\tt{\string\zbendv}}
+ [rr]!{*\txt\small\tt{\string\sbendh}}
+ [rr]!{*\txt\small\tt{\string\zbendh}}
+ [rr]!{*\txt\small\tt{\string\xcaph}}
+"O"!{+(0,-5)} %[]!{\NoPSspecials}
+ [ll] !{*=0\dir{o},{\xbendr<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [ur] !{*=0\dir{o},{\xbendl<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [urr]!{*=0\dir{o},{\xbendu<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [r] !{*=0\dir{o},{\xbendd<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ "O"!{-(3.5,6.5)}
+ [rr]!{*\txt\small\tt{\string\xbendr}}
+ [rr]!{*\txt\small\tt{\string\xbendl}}
+ [rr]!{*\txt\small\tt{\string\xbendu}}
+ [rr]!{*\txt\small\tt{\string\xbendd}}
+ "O"!{+(2,-5)} %[]!{\NoPSspecials}
+ [r(4)] !{*=0\dir{o},{\xbendd-<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [ur] !{*=0\dir{o},{\xbendu-<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [r] !{*=0\dir{o},{\xbendl-<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ [urr] !{*=0\dir{o},{\xbendr-<>|>>><{x}|{y}>{z}},*=0\dir{+}}
+ "O"!{+(4.5,-6.5)}
+ [rr]!{*\txt\small\tt{\string\xbendd-}}
+ [rr]!{*\txt\small\tt{\string\xbendu-}}
+ [rr]!{*\txt\small\tt{\string\xbendl-}}
+ [rr]!{*\txt\small\tt{\string\xbendr-}}
+}$$
+\caption{knot joins, with orientations, labels and shifts}%
+ ??=[f.knotjoins]
+\end{figure*}
+
+\noindent
+Figure~??[f.knotjoins] displays the orientation on the joins.
+Also indicated are default positions for labels and arrow-tips;
+each piece uses the same code,
+e.g. |\vloop|\ |<>||>>><{x}||{y}>{z}|. Furthermore the current <pos>
+before the piece is drawn is marked using $\;^{_{\xybox{*\dir{o}}}}\;$;
+that afterwards is indicated by
+$\;^{_{\xybox{*\dir{x}}}}\;$ or $\;^{_{\xybox{*\dir{+}}}}\;$.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The ability to scale in size and place arrow-tips, breaks, labels etc.
+apply also to <join> pieces. The only difference is\dots
+
+\note??=[join places]
+The three places referred to by |<|\,,||||\,,|>| are all on a single
+string. In particular |||| is always at the middle of the <join>,
+whereas |<| and |>| are at {\em earlier} and {\em later} parameter
+values respectively. Any adjustments??^[adjustment] involving breaks
+should occur in increasing parameter order.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Parsing}
+
+\DOCMODE(
+\xydef@\xykparsejoin@{%
+ \def\xykSCALE@@{}%
+ \edef\xyknotPLACE{\xykmidPLACE@}%
+ \let\xykparser@=\xykparsejoin@@
+ \def\xykdefaultbreak@{\let\xykbreak@=\xykforetemp@
+ \def\xyknotPLACE{(.5)}\appendtoholder@}%
+% \edef\xyknotPLACE{\xykmidPLACE@}\appendtoholder@}%
+ \xyFN@\xykparsescale@ }
+\DOCMODE)
+
+\DOCMODE(
+{\xyuncatcodes \catcode`@=11
+\gdef\next{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xykparsejoin@@}%
+ \else\addLT@\ifx\next \let\xykbreak@=\xykbacktemp@
+ \def\xykdefaultbreak@{\def\xyknotPLACE{(.5)}%
+% \def\xykdefaultbreak@{\edef\xyknotPLACE{\xykmidPLACE@}%
+ \appendtoholder@}\addLT@\DN@{\xyprecross@}%
+ \else\addGT@\ifx\next \let\xykbreak@=\xykforetemp@
+ \def\xykdefaultbreak@{\def\xyknotPLACE{(.5)}%
+% \def\xykdefaultbreak@{\edef\xyknotPLACE{\xykmidPLACE@}%
+ \appendtoholder@}\addGT@\DN@{\xypostcross@}%
+ \else\ifx|\next \let\xykbreak@=\xyknulltemp@
+% \else\ifx|\next \let\xykbreak@=\xykholetemp@
+ \def\xykdefaultbreak@{\def\xyknotPLACE{(.5)}%
+% \def\xykdefaultbreak@{\edef\xyknotPLACE{\xykmidPLACE@}%
+ \appendtoholer@}\DN@|{\xymidcross@}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\xyFN@\xykparsetips@@}%
+% \else\addAT@\ifx\next \addAT@\DN@{\xykjoincontrol@}%
+ \else\addAT@\ifx\next \addAT@\DN@(##1){%
+ \xyadjustJOIN@i##1@@\xyFN@\xykparsejoin@@}%
+ \else\DN@{\afterknot@}%
+ \fi\fi\fi\fi\fi\fi \next@ }}
+\xylet@\xykparsejoin@@=\next
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\note??=[join control]
+A parameter can be altered, using |@|<adjust>, to effect subtle
+adjustments to the shape of any join. Within a rectangular basis the
+horizontal or vertical tangents are preserved and overall reflection
+or rotation symmetry is preserved. Thus this parameter affects the
+`flatness' of a cap or loop, or the amount of curvature is s-bends and
+z-bends. For |\xcap..|s and |\xbend..|s the $45^\circ$ angle is altered;
+this is especially useful to match the tangents when a knot-piece
+has been specified using the technique of note~??[alter size and shape].
+
+The normal range for these parameters is between 0 and 1. Other values
+can be used with interesting results---the parameter determines the
+location of control points for a B\'ezier cubic curve.
+
+\begin{tabular}{ccl}
+piece & value & effect on\dots \\
+\noalign{\hrule}
+|\..cap| & .25 & flatness of cap;\\
+|\..loop| & .75 & flatness of loop;\\
+|\sbend..| & .75 & curvature in the `s';\\
+|\zbend..| & .75 & curvature in the `z';\\
+|\xcap..| & .5 & height of cap, slope at base;\\
+|\xbend..| & .5 & curvature, slope at base.\\
+\noalign{\hrule}
+\end{tabular}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{notes}
+
+The following example gives three ways of specifying a `trefoil' knot,
+using the |poly| feature to establish the location of the vertices for
+knot-pieces. In each the <crossing>s are calculated to fit together
+smoothly; a different way of creating <join>s is used in each.
+Also the third displays subtle changes of the ??^![join control].
+
+\begin{code}
+\def\TrefoilA{\xygraph{!{0;/r.75pc/:}
+ !P3"a"{~>{}}!P9"b"{~:{(1.3288,0):}~>{}}
+ !P3"c"{~:{(2.5,0):}~>{}}
+ !{\vover~{"b2"}{"b1"}{"a1"}{"a3"}}
+ !{"b4";"b2"**\crv{"c1"}}
+ !{\vover~{"b5"}{"b4"}{"a2"}{"a1"}}
+ !{"b7";"b5"**\crv{"c2"}}
+ !{\vover~{"b8"}{"b7"}{"a3"}{"a2"}}
+ !{"b1";"b8"**\crv{"c3"}}}}
+%
+\def\TrefoilB{\xygraph{!{0;/r.75pc/:}
+ !P3"a"{~>{}}!P9"b"{~:{(1.3288,0):}~>{}}
+ !P3"c"{~:{(2.5,0):}~>{}}
+ !{\vover~{"b2"}{"b1"}{"a1"}{"a3"}}
+ !{\vcap~{"c1"}{"c1"}{"b4"}{"b2"}@(+.1)}
+ !{\vover~{"b5"}{"b4"}{"a2"}{"a1"}}
+ !{\vcap~{"c2"}{"c2"}{"b7"}{"b5"}@(+.2)}
+ !{\vover~{"b8"}{"b7"}{"a3"}{"a2"}}
+ !{\vcap~{"c3"}{"c3"}{"b1"}{"b8"}}}}
+%
+\def\TrefoilC{\xygraph{!{0;/r.75pc/:}
+ !P3"a"{~>{}}
+ !P12"b"{~:{(1.414,0):}~>{}}
+ !{\vover~{"b2"}{"b1"}{"a1"}{"a3"}}
+ !{\save 0;"b2"-"b5":"b5",
+ \xcaph @(+.1)\restore}
+ !{\vover~{"b6"}{"b5"}{"a2"}{"a1"}}
+ !{\save 0;"b6"-"b9":"b9",
+ \xcaph @(+.2)\restore}
+ !{\vover~{"b10"}{"b9"}{"a3"}{"a2"}}
+ !{\save 0;"b10"-"b1":"b1",
+ \xcaph @(+.3)\restore} }}
+$$\TrefoilA\quad\TrefoilB
+ \quad\TrefoilC$$
+\end{code}
+\docode
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xykjoincontrol@@{.75}%
+\xydef@\xyk@joincontrol@#1{\DN@{#1}%
+ \ifx\next@\empty\edef\xykjoincontrol@@{.75}%
+ \else\dimen@=#1\p@
+ \edef\xykjoincontrol@@{\expandafter\removePT@\the\dimen@}\fi}
+\xylet@\xykjoincontrol\empty %\xyk@joincontrol@
+
+\xydef@\xykjoincontrol@(#1){\DN@{#1}%
+ \ifx\next@\empty\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \else\dimen@=#1\p@
+ \edef\xykjoincontrol{\expandafter\removePT@\the\dimen@}%
+ \fi \xyFN@\xykparsejoin@@ }
+
+\xydef@\xykjoincontrol@i#1{\DN@{#1}%
+ \ifx\next@\empty\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \else\dimen@=#1\p@
+ \edef\xykjoincontrol{\expandafter\removePT@\the\dimen@}\fi}
+\DOCMODE)
+
+These macros are common to most joins.
+
+\DOCMODE(
+\xydef@\xykjoin@#1{%
+ \expandafter\toks@\expandafter{\expandafter#1\knotSTYLE}}
+
+\xydef@\xyksetjoin@{\xykcheckTIPS@
+ \xykprebreak@ \xykmidbreak@ \xykpostbreak@ \xyknottips@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{``cap'' joins:}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The initialisation\dots
+
+\DOCMODE(
+\xydef@\hcap{\begingroup\def\afterknot@{\xyhcap}%
+ \def\xykprePLACE@{(.385)}\def\xykpostPLACE@{(.615)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.25}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\vcap{\begingroup\def\afterknot@{\xyvcap}%
+ \def\xykprePLACE@{(.385)}\def\xykpostPLACE@{(.615)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.25}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xcapv{\begingroup\def\afterknot@{\xyxcapv}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xcaph{\begingroup\def\afterknot@{\xyxcaph}%
+ \def\xykprePLACE@{(.2)}\def\xykpostPLACE@{(.8)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\DOCMODE)
+
+The interface\dots
+
+\DOCMODE(
+\xydef@\xyvcap{\xykjoin@\xykcapv \xyksetjoin@ \xykhobject@{}}
+\xydef@\xyhcap{\xykjoin@\xykcaph \xyksetjoin@ \xykvobject@{}}
+\xydef@\xyxcapv{\xykjoin@\xykxcapv \xyksetjoin@ \xykvobject@{+(0,-1)}}
+\xydef@\xyxcaph{\xykjoin@\xykxcaph \xyksetjoin@ \xykhobject@{+(1,0)}}
+\DOCMODE)
+
+The drawing code\dots
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_>",{\xyksaveEdgec},{\xykz_\ar #1@'{"^>"**{}?(\xykjoincontrol)@+
+ ,?-(.25,0)@+,"_<";"^<"**{}?+(.25,0)@+,?(\xykjoincontrol)@+}
+ "_<"#3#4#5#6},\restore \POS#7}}
+\xylet@\xykcapv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xyksaveEdgec},{\xykz_\ar #1@'{"_>"**{}?(\xykjoincontrol)@+,
+ ?+(0,.25)@+,"^<";"^>"**{}?-(0,.25)@+,?(\xykjoincontrol)@+}
+ "^<"#3#4#5#6}
+ \restore \POS#7}}
+\xylet@\xykcaph=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^>";"_>"**{}?="^_","^<";"_<"**{}?;"^_",**{}?(\xykjoincontrol)="^_",
+ "_<",{\xyksaveEdgec},{\xykz_\ar #1@'{"^_"@+}
+ "^<"#3#4#5#6},\restore \POS#7}}
+\xylet@\xykxcapv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<";"^>"**{}?="^_","_<";"_>"**{}?;"^_",**{}?(\xykjoincontrol)="^_",
+ "_>",{\xyksaveEdgec},{\xykz_\ar #1@'{"^_"@+}
+ "_<"#3#4#5#6},\restore \POS#7}}
+\xylet@\xykxcaph=\next
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{``loop'' joins:}
+
+The initialisation and interface\dots
+
+\DOCMODE(
+\xydef@\hloop{\begingroup\def\afterknot@{\xyhloop}%
+ \def\xykprePLACE@{(.07)}\def\xykpostPLACE@{(.93)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.75}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\vloop{\begingroup\def\afterknot@{\xyvloop}%
+ \def\xykprePLACE@{(.07)}\def\xykpostPLACE@{(.93)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.75}%
+ \xyFN@\xykparsejoin@ }%
+
+\xydef@\xyvloop{\xykjoin@\xykloopv \xyksetjoin@ \xykhobject@{}}
+\xydef@\xyhloop{\xykjoin@\xyklooph \xyksetjoin@ \xykvobject@{}}
+\DOCMODE)
+
+The drawing code\dots
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_>",{\xykz_\ar #1@'{"^>"**{}?(\xykjoincontrol)@+,?(1.25)-(.25,0)@+,
+ "_<";"^<"**{}?(1.25)+(.25,0)@+,?(\xykjoincontrol)@+}"_<"#3#4#5#6}
+ \restore \POS#7}}
+\xylet@\xykloopv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xykz_\ar #1@'{"_>"**{}?(\xykjoincontrol)@+,?(1.25)+(0,.25)@+,
+ "^<";"^>"**{}?(1.25)+(0,-.25)@+,?(\xykjoincontrol)@+}"^<"#3#4#5#6}
+ \restore \POS#7}}
+\xylet@\xyklooph=\next
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{``bend'' joins:}
+
+The initialisation\dots
+
+\DOCMODE(
+\xydef@\zbendh{\begingroup\def\afterknot@{\xyzbendh}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\sbendv{\begingroup\def\afterknot@{\xysbendv}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\sbendh{\begingroup\def\afterknot@{\xysbendh}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\zbendv{\begingroup\def\afterknot@{\xyzbendv}%
+ \def\xykprePLACE@{(.25)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{\xykjoincontrol@@}%
+ \xyFN@\xykparsejoin@ }%
+
+
+\xydef@\xbendr{\begingroup\def\afterknot@{\xyxbendr}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xbendl{\begingroup\def\afterknot@{\xyxbendl}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xbendu{\begingroup\def\afterknot@{\xyxbendu}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\xydef@\xbendd{\begingroup\def\afterknot@{\xyxbendd}%
+ \def\xykprePLACE@{(.15)}\def\xykpostPLACE@{(.75)}%
+ \def\xykmidPLACE@{(.5)}\edef\xykjoincontrol{.5}%
+ \xyFN@\xykparsejoin@ }%
+\DOCMODE)
+
+
+The interface\dots
+
+\DOCMODE(
+\xydef@\xyzbendh{\xykjoin@\xykzbendh \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+\xydef@\xysbendv{\xykjoin@\xyksbendv \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+\xydef@\xysbendh{\xykjoin@\xyksbendh \xyksetjoin@ \xykhuobject@{+(1,1)}}
+\xydef@\xyzbendv{\xykjoin@\xykzbendv \xyksetjoin@ \xykhuobject@{+(1,1)}}
+
+\xydef@\xyxbendr{\xykjoin@\xykxbendr \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+\xydef@\xyxbendl{\xykjoin@\xykxbendl \xyksetjoin@ \xykhvobject@{+(0,-1)}}
+\xydef@\xyxbendu{\xykjoin@\xykxbendu \xyksetjoin@ \xykhvobject@{+(1,0)}}
+\xydef@\xyxbendd{\xykjoin@\xykxbendd \xyksetjoin@ \xykhvobject@{+(1,-1)}}
+\DOCMODE)
+
+
+The implementation\dots
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<",{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"^>"**{}?(\xykjoincontrol)@+,
+ "_>";"_<"**{}?(\xykjoincontrol)@+}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykzbendh=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<",{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_<"**{}?(\xykjoincontrol)@+,
+ "_>";"^>"**{}?(\xykjoincontrol)@+}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xyksbendv=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_>"**{}?(\xykjoincontrol)@+,
+ "^>";"^<"**{}?(\xykjoincontrol)@+}"^>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xyksbendh=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<",{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"^<"**{}?(\xykjoincontrol)@+,
+ "^>";"_>"**{}?(\xykjoincontrol)@+}"^>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykzbendv=\next
+
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<"-(0,.5),{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_<";"_>"**{}?(\xykjoincontrol)@+,}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendr=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^>"-(0,.5),{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"_>";"_<"**{}?(\xykjoincontrol)@+,}"_<"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendl=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "_<"+(.5,0),{\xyksaveEdgec},
+ {\xykz_\ar #1@'{"_>";"^>"**{}?(\xykjoincontrol)@+,}"^>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendu=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\save,
+ "^<"+(.5,0),{\xyksaveEdgec},
+ {\xykz^\ar #1@'{"^>";"_>"**{}?(\xykjoincontrol)@+,}"_>"#3#4#5#6}%
+ \restore \POS#7}}
+\xylet@\xykxbendd=\next
+
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Changing the string-style}
+%
+It is not necessary to use solid curves; any style available to curves
+and arrows can be chosen using\dots
+%
+\begin{defs}
+|\knotstyle{|<char>|}| & use |\dir{|<char>|}| \cr
+|\knotstyles{|<char>|}{|<char>|}| & two styles \cr
+|\knotSTYLE{|<code>|}| & use <code> \cr
+\end{defs}
+%
+In each case the new style applies to {\em all} subsequent knot pieces,
+except that the two styles apply only to crossings.
+The latter case allows use of object <modifier>s. The <code> consists of
+two groups |{..}{..}|\,, each containing <arrow> forms, as in
+??g[xyarrow.doc:f.arrow] and notes~??g[xyarrow.doc:build arrow],
+??g[xyarrow.doc:object <modifier>s].
+Only the first <arrow> form is used with <join>s whereas the two forms
+are used respectively with the two strings of a <crossing> in the order
+that they are drawn.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next{{@{-}}{@{-}}}}
+\xylet@\knotSTYLE=\next
+
+{\xyuncatcodes \gdef\next#1{\def\knotSTYLE{{@{#1}}{@{#1}}}}}
+\xylet@\knotstyle=\next
+
+{\xyuncatcodes \gdef\next#1#2{\def\knotSTYLE{{@{#1}}{@{#2}}}}}
+\xylet@\knotstyles=\next
+
+{\xyuncatcodes \gdef\next#1{\def\knotSTYLE{#1}}}
+\xylet@\KNOTstyle=\next
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Initialisation:}\ default values for the methods.
+
+\DOCMODE(
+\xydef@\knotholesize@#1{\def\xykholesize{#1}}
+\xydef@\xykholesize{5pt}
+\xylet@\knotholesize=\knotholesize@
+\xylet@\holesize=\knotholesize@
+
+\xydef@\knottips#1{\def\xyknotTIPS@{#1}}
+\xydef@\xyknotTIPS@{FF}
+\xydef@\xyknotTIPS@@{}
+
+\xydef@\xykSCALE@@{}
+
+%\xydef@\xyknotbreak@@{}%
+\xydef@\xykprebreak@@{}%
+\xydef@\xykpostbreak@@{}%
+\xydef@\xykmidbreak@@{}%
+
+\xydef@\xykprePLACE@{(.25)}%
+\xydef@\xykpostPLACE@{(.75)}%
+\xydef@\xykmidPLACE@{}%
+\xylet@\xykPLACE@=\xykmidPLACE@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%\subsection*{Flexible crossings}
+
+%Xtwist
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+{\gdef\next#1#2#3#4{%\message{#1:#2:#3:#4}%
+ \save(0,0);"#2"-"#1"+"#4"-"#3":(.5,0):
+ "#3"-"#1"+"#4"-"#2"::(0,.5)::}}
+\xylet@\xykflexbase@=\next
+\xylet@\xykflexbase=\xykflexbase@
+\DOCMODE)
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8{\xykflexbase{#1}{#2}{#3}{#4}%
+% \save(0,0);"#2"-"#1"+"#4"-"#3":(.5,0):
+% "#3"-"#1"+"#4"-"#2"::(0,.5)::
+ "#1",{\ar @{#5}@'{"#1"+(0,.125)@++(.1875,.125)@+,
+ "#4"-(.1875,.25)@++(.1875,.125)@+}"#4" #6},
+ "#2",{\ar @{#5}@'{"#2"+(0,.125)@++(-.1875,.125)@+,
+ "#3"+(.1875,-.25)@++(-.1875,.125)@+}"#3" #7}%
+\restore \POS#8}}
+\xylet@\Xtwist=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8{\xykflexbase{#1}{#2}{#3}{#4}%
+% \save(0,0);"#2"-"#1"+"#4"-"#3":(.5,0):
+% "#3"-"#1"+"#4"-"#2"::(0,.5)::
+ "#1",{\ar @{#5}@'{"#1"+(0,.0625)@++(.1875,.0625)@+,
+ "#3"+(.1875,-.125)@++(-.1875,.0625)@+}"#3" #6},
+ "#2",{\ar @{#5}@'{"#2"+(0,.0625)@++(-.1875,.0625)@+,
+ "#4"-(.1875,.125)@++(.1875,.0625)@+}"#4" #7}%
+\restore \POS#8}}
+\xylet@\Xuntwist=\next
+\DOCMODE)
+
+
+%Xover
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\xykflexbase{#1}{#2}{#3}{#4}%
+% \save(0,0);"#2"-"#1"+"#4"-"#3":(.5,0):
+% "#3"-"#1"+"#4"-"#2"::(0,.5)::
+ "#1",{\ar @{#5}@'{"#1"+(.1875,.0625)@++(.1875,.1875)@+,
+ "#4"+(-#9,-.125)@+}"#4" #6},
+ "#2",{\ar @{#5}@'{"#2"+(-.1875,.0625)@++(-.1875,.1875)@+,
+ "#3"+(#9,-.125)@+}"#3" #7}%
+\restore \POS#8}}
+\xylet@\Xover=\next
+
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7#8#9{\xykflexbase{#1}{#2}{#3}{#4}%
+% \save(0,0);"#2"-"#1"+"#4"-"#3":(.5,0):
+% "#3"-"#1"+"#4"-"#2"::(0,.5)::
+ "#1",{\ar @{#5}@'{"#1"+(.1875,.0625)@++(.1875,.1875)@+,
+ "#2"+(-.1875,.0625)@+}"#2" #6},
+% "#3"+(#9,-.125)@+}"#3" #6},
+ "#3",{\ar @{#5}@'{"#3"+(#9,-.125)@+,"#3"+(.25,-.25)@+,
+% "#2",{\ar @{#5}@'{"#2"+(-.1875,.0625)@++(-.1875,.1875)@+,
+ "#4"+(-#9,-.125)@+}"#4" #7}%
+\restore \POS#8}}
+\xylet@\Xunover=\next
+\DOCMODE)
+
+
+%Xcap
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next#1#2#3#4#5#6#7{\xykflexbase{#1}{#2}{#3}{#4}%
+% \save(0,0);"#2"-"#1"+"#3"-"#4":(.5,0):
+% "#4"-"#1"+"#3"-"#2"::(0,.5)::
+ "#1",{\ar @{#5}@'{"#1"+(0,.125)@++(.125,.25)@+,
+ "#4"+(-.125,.375)@++(.125,-.25)@+}"#4" #6},
+\restore \POS#7}}
+\xylet@\Xcap=\next
+\DOCMODE)
+
+
+%XXover
+
+\DOCMODE(
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4#5#6#7#8#9{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\Xunover{#2}{#3}{#4}{#5}{#8}{#6}{#7}{"#5"}}%
+ \else\ifdim\dimen@>\z@
+ \DNii@{#6}\ifx\nextii@\empty
+ \DN@{\Xover{#2}{#3}{#4}{#5}{#8}{|(.45)\knothole}{#7}{"#5"}}%
+ \else \DN@{\Xover{#2}{#3}{#4}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \else
+ \DNii@{#7}\ifx\nextii@\empty
+ \DN@{\Xover{#2}{#3}{#4}{#5}{#8}{#6}{|(.45)\knothole}{"#5"}}%
+ \else\DN@{\Xover{#2}{#3}{#4}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \fi\fi
+ \def\tmp@{{#9}}\ifx\tmp@\empty\def\tmp@{{0}}\else\dimen@=#9\p@\fi
+ \expandafter\next@\tmp@ }}
+\xylet@\XXover=\next
+
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4#5#6#7#8{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\Xuntwist{#2}{#4}{#3}{#5}{#8}{#6}{#7}{"#5"}}%
+ \else\ifdim\dimen@>\z@
+ \DNii@{#6}\ifx\nextii@\empty
+ \DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{|(.45)\knothole}{#7}{"#5"}}%
+ \else \DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \else
+ \DNii@{#7}\ifx\nextii@\empty
+ \DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{#6}{|(.45)\knothole}{"#5"}}%
+ \else\DN@{\Xtwist{#2}{#4}{#3}{#5}{#8}{#6}{#7}{"#5"}}\fi
+ \fi\fi \next@ }}
+\xylet@\XXtwist=\next
+
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ simplified switch-like interface
+
+
+\DOCMODE(
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\xykuncrossv{#4}{#2}{#3}{+(0,-1)}}%
+ \else\ifdim\dimen@>\z@
+ \DNii@{#2}\ifx\nextii@\empty
+ \DN@{\xyktwistv{#4}{|\knothole}{#3}{+(1,0)}}%
+ \else \DN@{\xyktwistv{#4}{#2}{#3}{+(1,0)}}\fi
+ \else
+ \DNii@{#3}\ifx\nextii@\empty
+ \DN@{\xyktwistv{#4}{#2}{|\knothole}{+(0,-1)}}%
+ \else\DN@{\xyktwistv{#4}{#2}{#3}{+(0,-1)}}\fi
+ \fi\fi \next@ }}
+\xylet@\Vcross=\next
+
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3#4{\dimen@=#1\p@
+ \ifdim\dimen@=\z@ \DN@{\xykuncrossh{#4}{#2}{#3}{+(0,-1)}}%
+ \else\ifdim\dimen@<\z@
+ \DNii@{#2}\ifx\nextii@\empty
+ \DN@{\xyktwisth{#4}{|\knothole}{#3}{+(1,0)}}%
+ \else \DN@{\xyktwisth{#4}{#2}{#3}{+(1,0)}}\fi
+ \else
+ \DNii@{#3}\ifx\nextii@\empty
+ \DN@{\xyktwisth{#4}{}{|\knothole}{+(1,0)}}%
+ \else\DN@{\xyktwisth{#4}{#2}{#3}{+(1,0)}}\fi
+ \fi\fi \next@ }}
+\xylet@\Hcross=\next
+
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3{\dimen@=#1\p@ \save
+ \ifdim\dimen@<\z@
+ \DN@{\POS="@",p="@@",(0,0);(-1,0):(0,-1)::"@@";"@",}%
+ \else\DN@{}\fi
+ \next@ \xykcaph{#3}{#2}\restore }}
+\xylet@\Hcap=\next
+
+{\xyuncatcodes \catcode`@=11
+ \gdef\next#1#2#3{\dimen@=#1\p@ \save
+ \ifdim\dimen@<\z@
+ \DN@{\POS="@",p="@@",(0,0);(0,-1)::"@@";"@",}%
+ \else\DN@{}\fi
+ \next@ \xykcapv{#3}{#2}\restore }}
+\xylet@\Vcap=\next
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyknot.doc,v $
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 09:20:49 ross
+% no changes
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Created by Ross Moore, September 1994.
+\DOCMODE)
diff --git a/Master/texmf-dist/source/generic/xypic/xylatex.ini b/Master/texmf-dist/source/generic/xypic/xylatex.ini
new file mode 100644
index 00000000000..3ba119f8437
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xylatex.ini
@@ -0,0 +1,77 @@
+%% $Id: xylatex.ini,v 3.3 1996/12/19 03:31:56 krisrose Exp $ -*-latex-*-
+%%
+%% Generate LaTeX + Xy-pic format file.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+
+% Load LaTeX (2e) but don't dump yet.
+% (This ca
+
+\let\xypicsaveddump=\dump
+\let\dump=\endinput
+\input latex.ltx
+
+% KERNEL:
+%
+\input xy
+
+% Extensions and features: You can replace this line with selective loading
+% of particular options if you like.
+%
+\xyoption{all}
+
+% BACKEND: Default is NOT to load any backend but by uncommenting the
+% following line you can include the PostScript backend by default.
+%
+%\xyoption{ps}
+
+% DRIVERS: Default is NOT to load any driver but by uncommenting the
+% following line you can include the DVIPS driver (or any other one you
+% choose) by default (this will not select it, only make it available).
+%
+%\xyoption{dvips}
+
+% Finally dump the format file (using the hack above):
+%
+\xypicsaveddump
+
+% $Log: xylatex.ini,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/06 02:56:02 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% NEW file to go in version 2.10!
diff --git a/Master/texmf-dist/source/generic/xypic/xyline.doc b/Master/texmf-dist/source/generic/xypic/xyline.doc
new file mode 100644
index 00000000000..40fa19abedb
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyline.doc
@@ -0,0 +1,664 @@
+%% $Id: xyline.doc,v 3.6 1998/03/06 01:28:05 krisrose Exp $
+%%
+%% Xy-pic ``Line Width'' extension.
+%% Copyright (c) 1993-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{line}{Line styles extension}{\stripRCS$Revision: 3.6 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This extension provides the ability to request various effects related
+ to the appearance of straight lines; \eg. thickness, non-standard dashing,
+ and colour.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+These are effects which are not normally available within \TeX.
+Instead they require a suitable `back-end' option to provide the necessary
+|\special| commands, or extra fonts, together with appropriate
+commands to implement the effects. Thus
+$$
+\xy
+ *+\txt<.8\hsize>{Using this extension will have no effect on the output
+ unless used with a backend that explicitly supports it.}
+ *\frm{-}
+\endxy
+$$
+
+The extension provides special effects that can be used with any \Xy-pic
+<object>, by defining |[|<shape>|]| modifiers.
+The modification is local to the <object> currently being built,
+so will have no effect if this object is never actually used.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Adjusting line thickness}
+
+
+The following table lists the modifiers primarily to alter the thickness
+of lines used by \Xy-pic. They come in two types --- either a single keyword,
+or using the key-character |||| with the following text parsed.
+%
+\begin{defs}%
+ |[thicker]| & double line thickness \cr
+ |[thinner]| & halve line thickness \cr
+ |[||(|<num>|)]| & multiple of usual thickness\cr
+ |[||<|<dimen>|>]| & set thickness to <dimen>\cr
+ |[|||<dimen>|]| & also sets to <dimen>\cr
+ |[||=|<word>|]| & make |[|<word>|]| set current style settings\cr
+ |[||*]| & reuse previous style\cr
+ |[butt]| & butt cap at ends\cr
+ |[roundcap]| & round cap at ends\cr
+ |[projcap]| & projecting square cap.\cr
+\end{defs}
+%
+\noindent
+Later settings of the linewidth override earlier settings;
+multiple calls to |[thicker]| and |[thinner]| compound,
+but the other variants set an absolute thickness.
+The line-thickness specification affects arrow-tips as well as the
+thickness of straight lines and curves.
+Three kinds of line-caps are available; they are discussed below
+in the section on `poly-lines'.
+%
+\begin{code}
+\xy/r8pc/:*++\txt\huge{C}="c"
+,0*++\txt\huge{P}="p",
+,"p",{\ar@*{[|(1)]}"p";"c"<20pt>}
+,"p",{\ar@*{[|(4)]}"p";"c"<14pt>}
+,"p",{\ar@*{[|(10)]}"p";"c"<4pt>}
+,"p",{\ar@*{[|(20)]}"p";"c"<-16pt>}
+\endxy
+\end{code}
+$$\docode$$
+\medskip
+\displaycode
+%
+Using the \PS\ back-end, the size of the arrow-head grows
+aesthetically with the thickness of the line used to draw it.
+This growth varies as the square-root of the thickness;
+thus for very thick lines (20+ times normal) the arrowhead
+begins to merge with the stem.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Load the |style| extension to establish the necessary infra-structure.
+
+\DOCMODE(
+%\xydefcsname@{shape [|...]}#1{\xyFN@\xywidthchar@#1@@}%
+\xydefcsname@{*stylechar@|@}#1{\xyFN@\xywidthchar@#1@@}%
+
+%\xydefcsname@{shape [thinner]}{\xyshape@thinner@}
+%\xydefcsname@{shape [thicker]}{\xyshape@thicker@}
+\xydefcsname@{style [thinner]}{\xyshape@thinner@}
+\xydefcsname@{style [thicker]}{\xyshape@thicker@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Implementation}
+
+Record the line thickness locally in a dimen register.
+The initial value is read from the |xydash10| font.
+Each time |\xylinethick@| is changed, its previous value is stored
+as the expansion of |\xyprevwidth@@|, in case this is needed by
+a specific back-end.
+
+\DOCMODE(
+\xynew@{dimen}\xylinethick@ \xylinethick@=\xydashw@
+
+\xydef@\xyshape@thicker@{\xylinewidth@i{\multiply\xylinethick@\tw@}}
+\xydef@\xyshape@thinner@{\xylinewidth@i{\divide\xylinethick@\tw@}}
+
+\xydef@\xylinewidth@i#1{\edef\xyprevwidth@@{\the\xylinethick@}%
+ #1\edef\next@{\xylinethick@=\the\xylinethick@}%
+ \edef\next@ii{\noexpand\addtotoks@{%
+ \noexpand\xylinewidth@@{\next@}{\xyprevwidth@@}}}%
+ \next@ii }
+
+
+\xydef@\xywidthchar@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xywidthchar@}%gobble spaces
+% \else\ifx @\next \DN@ @@{\addtotoks@{\checkXyStyle@}}%
+ \else\ifx @\next \DN@ @@{\checkXyStyle@}%
+ \else\ifx (\next \DN@ (##1)##2@@{%
+ \xylinewidth@i{\xylinethick@=##1\xydashw@}}%
+ \else\addLT@\ifx \next \addGT@{\addLT@\DN@ ##1}##2@@{%
+ \xylinewidth@i{\xylinethick@=##1\relax}}%
+% \else\ifx *\next \DN@ *@@{\addtotoks@{\checkXyStyle@}}%
+% \else\ifx *\next \DN@ *@@{\checkXyStyle@}%
+ \else\ifx *\next \DN@ *@@{\recoverXyStyle@}%
+% \else\addEQ@\ifx \next \addEQ@\DN@##1@@{%
+% \addtotoks@{\checkXyStyle@\xynamestyle@{##1}}}%
+ \else\addEQ@\ifx \next \addEQ@\DN@##1@@{\checkXyStyle@
+ \addtotoks@{\xynamestyle@{##1}}}%
+ \else\ifx C\next \DN@ C##1@@{\xysetlinecap@{##1}@}%
+ \else\ifx J\next \DN@ J##1@@{\xysetlinejoin@{##1}@}%
+ \else\ifx M\next \DN@ M(##1)@@{\xymiterlimit@{##1}@}%
+ \else \DN@##1@@{\xylinewidth@i{\xylinethick@=##1\relax}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The diagram in figure~??g[xyrotate.doc:rotate and flips],
+page~??gp[xyrotate.doc:rotate and flips], uses different line-thicknesses
+and colours.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Poly-lines}
+
+By a `poly-line' we mean a path built from straight line segments having no
+gaps where each segment abuts the next. The poly-line could be the edges of
+a polygon, either closed or open if the end-points are different.
+
+The reason for considering a poly-line as a separate <object>, rather than
+simply as a <path> built from straight lines, becomes apparent only when
+the lines have appreciable thickness. Then there are several standard ways
+to fashion the `joins' (where segments meet). Also the shape of the `caps'
+at either end of the poly-line can be altered.
+
+The following modifiers are used to determine the shapes of the line `caps'
+and `joins':
+%
+\begin{defs}%
+ |[||J|<val>|]| & join style, <val> = 0, 1 or 2\cr
+ |[mitre]| & mitre-join, same as |[||J0]|\cr
+ |[roundjoin]| & round join, same as |[||J1]|\cr
+ |[bevel]| & bevel-join, same as |[||J2]|\cr
+ |[||C|<val>|]| & end-cap, <val> = 0, 1 or 2\cr
+ |[butt]| & ``butt'' cap, same as |[||C0]|\cr
+ |[roundcap]| & round cap, same as |[||C1]|\cr
+ |[projcap]| & ``projecting square'' cap,\hfil\break same as |[||C2]|\cr
+ |[||M(|<num>|)]| & set mitrelimit to <num>$\ge1$\cr
+\end{defs}
+%
+\noindent
+These effects are currently implemented only with the \PS\ back-end
+or when using |\xypolyline| (described below) with a \PS\ <driver>.
+In this case the `cap' setting can be applied to any segment, straight
+or curved, whether part of a poly-line or not; however the `join' setting
+applies only to poly-lines. Arrow-tips are not affected.
+The defaults are to use round joins and round-cap ends.
+
+Adjusting the miter-limit affects how far miters are allowed to protrude
+when two wide lines meet at small angles. The <num> is in units of the
+line-thickness. Higher values mean using bevels only at smaller angles,
+while the value of 1 is equivalent to using bevels at all angles.
+The default miter-limit is 10.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Current values are stored in case these are needed within nested portions
+of diagrams.
+
+\DOCMODE(
+\xydef@\xylinecap@{2}
+\xydef@\xylinejoin@{2}
+\xydef@\xylinemiter@{10}
+\DOCMODE)
+
+%These are simple methods that alter the stored values.
+%
+%\DOCMODE(
+%\xydef@\xysetlinecap@@#1{\xylinestyle@{C}{#1}{\def\xylinecap@{#1}}}
+%\xydef@\xysetlinejoin@@#1{\xylinestyle@{J}{#1}{\def\xylinejoin@{#1}}}
+%\xydef@\xysetmiterlimit@@#1{\xylinestyle@{M}{#1}{\def\xylinemiter@{#1}}}
+%\DOCMODE)
+%
+%Finally we need the interface to pass the new values to a <driver>.
+%
+%\DOCMODE(
+%\xydef@\xynolinestyle@@#1#2#3{\let\next=#1\relax #3%
+% \ifx\next C\DN@{\xyundefinedLine@{linecap}{#2}@@}%
+% \else\ifx\next J\DN@{\xyundefinedLine@{linejoin}{#2}@@}%
+% \else\ifx\next M\DN@{\xyundefinedLine@{miterlimit}{#2}@@}%
+% \fi\fi\fi \next@ }
+%
+%\xylet@\xylinestyle@\xynolinestyle@@
+%\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Recognise keywords for `line-caps' and `line-joins':
+
+\DOCMODE(
+\xydefcsname@{style [bevel]}{\xyshape@bevel@}
+\xydefcsname@{style [roundjoin]}{\xyshape@rdjoin@}
+\xydefcsname@{style [miter]}{\xyshape@miter@}
+%
+\xydefcsname@{style [butt]}{\xyshape@butt@}
+\xydefcsname@{style [roundcap]}{\xyshape@rdcap@}
+\xydefcsname@{style [projcap]}{\xyshape@projcap@}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xyshape@butt@{\xysetlinecap@@0}
+\xydef@\xyshape@rdcap@{\xysetlinecap@@1}
+\xydef@\xyshape@projcap@{\xysetlinecap@@2}
+
+\xydef@\xyshape@miter@{\xysetlinejoin@@0}
+\xydef@\xyshape@rdjoin@{\xysetlinejoin@@1}
+\xydef@\xyshape@bevel@{\xysetlinejoin@@2}
+
+\xydef@\xysetlinecap@#1@{\DN@ii{#1}\count@=#1\relax
+ \expandafter\DN@\expandafter{\the\count@}%
+ \ifx\next@\next@ii\else
+ \xywarning@{ignoring extra tokens in line-cap: \next@}\fi
+ \expandafter\xysetlinecap@@\expandafter{\next@}}
+
+\xydef@\xysetlinejoin@#1@{\DN@ii{#1}\count@=#1\relax
+ \expandafter\DN@\expandafter{\the\count@}%
+ \ifx\next@\next@ii\else
+ \xywarning@{ignoring extra tokens in line-join: \next@}\fi
+ \expandafter\xysetlinejoin@@\expandafter{\next@}}
+
+\xydef@\xysetmiterlimit@#1@{\DN@ii{#1}\dimen@=#1\p@\relax
+ \edef\next@{\expandafter\removePT@\the\dimen@}%
+ \ifx\next@\next@ii\else
+ \xywarning@{ignoring extra tokens in miter-limit: \next@}\fi
+ \expandafter\xysetmiterlimit@@\expandafter{\next@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+These use the more sophisticated approach that is easier to adjust for
+different <driver>s.
+
+\DOCMODE(
+\xydef@\xysetlinecap@@#1{\xy@linecap@i{\def\xylinecap@{#1}}}
+\xydef@\xysetlinejoin@@#1{\xy@linejoin@i{\def\xylinejoin@{#1}}}
+\xydef@\xysetmiterlimit@@#1{%
+ \xy@linemiter@i{\def\xylinemiter@{#1}}}
+
+\xydef@\xy@linecap@i#1{#1\addtotoks@{\xy@linecap@@{#1}}}
+\xydef@\xy@linejoin@i#1{#1\addtotoks@{\xy@linejoin@{#1}}}
+\xydef@\xy@linemiter@i#1{#1\addtotoks@{\xy@linemiter@{#1}}}
+\DOCMODE)
+
+Implementation of line-caps:
+
+\DOCMODE(
+\xydef@\xy@linecap@#1{\checkXyStyle@ \edef\xyprevcap@@{\xylinecap@}%
+ #1\let\prexylinecap@=\prexylinecap@@ \let\postxylinecap@=\postxylinecap@@
+ \applyLIFOstyle@\prexylinecap@{\xylinecap@}%
+ \postxylinecap@{\xyprevcap@@}}
+
+\xydef@\prexylinecap@@{\let\prexylinecap@=\eat@
+ \let\postxylinecap@=\postxylinecap@@ \outputxylinecap@ }
+\xydef@\postxylinecap@@{\let\postxylinecap@=\eat@
+ \let\prexylinecap@=\prexylinecap@@ \resetxylinecap@@ }
+\xylet@\prexylinecap@=\prexylinecap@@
+\xylet@\postxylinecap@=\postxylinecap@@
+
+\xydef@\outputxylinecap@#1{\xycapSpecial@@{#1}}
+\xydef@\resetxylinecap@#1{\resetxylinecap@i{#1}\outputxylinecap@{#1}}
+\xydef@\resetxylinecap@i#1{\def\xylinecap@{#1}}
+\xylet@\resetxylinecap@@=\resetxylinecap@
+
+\xylet@\xycapSpecial@@=\eat@
+\DOCMODE)
+
+Implementation of line-joins:
+
+\DOCMODE(
+\xydef@\xy@linejoin@#1{\checkXyStyle@
+ \edef\xyprevjoin@@{\xylinejoin@}#1%
+ \let\prexylinejoin@=\prexylinejoin@@
+ \let\postxylinejoin@=\postxylinejoin@@
+ \applyLIFOstyle@\prexylinejoin@{\xylinejoin@}%
+ \postxylinecap@{\xyprevjoin@@}}
+
+\xydef@\prexylinejoin@@{\let\prexylinejoin@=\eat@
+ \let\postxylinejoin@=\postxylinejoin@@ \outputxylinejoin@ }
+\xydef@\postxylinejoin@@{\let\postxylinejoin@=\eat@
+ \let\prexylinejoin@=\prexylinejoin@@ \resetxylinejoin@@ }
+\xylet@\prexylinejoin@=\prexylinejoin@@
+\xylet@\postxylinejoin@=\postxylinejoin@@
+
+\xydef@\outputxylinejoin@#1{\xyjoinSpecial@@{#1}}
+\xydef@\resetxylinejoin@#1{\resetxylinejoin@i{#1}\outputxylinejoin@{#1}}
+\xydef@\resetxylinejoin@i#1{\def\xylinejoin@{#1}}
+\xylet@\resetxylinejoin@@=\resetxylinejoin@
+
+\xylet@\xyjoinSpecial@@=\eat@
+\DOCMODE)
+
+Implementation of miter-limit:
+
+\DOCMODE(
+\xydef@\xy@linemiter@#1{\checkXyStyle@
+ \edef\xyprevmiter@@{\xylinemiter@}#1%
+ \let\prexylinemiter@=\prexylinemiter@@
+ \let\postxylinemiter@=\postxylinemiter@@
+ \applyLIFOstyle@\prexylinemiter@{\xylinemiter@}%
+ \postxylinecap@{\xyprevmiter@@}}
+
+\xydef@\prexylinemiter@@{\let\prexylinemiter@=\eat@
+ \let\postxylinemiter@=\postxylinemiter@@ \outputxylinemiter@ }
+\xydef@\postxylinemiter@@{\let\postxylinemiter@=\eat@
+ \let\prexylinemiter@=\prexylinemiter@@ \resetxylinemiter@@ }
+\xylet@\prexylinemiter@=\prexylinemiter@@
+\xylet@\postxylinemiter@=\postxylinemiter@@
+
+\xydef@\outputxylinemiter@#1{\xymiterSpecial@@{#1}}
+\xydef@\resetxylinemiter@#1{\resetxylinemiter@i{#1}\outputxylinemiter@{#1}}
+\xydef@\resetxylinemiter@i#1{\def\xylinemiter@{#1}}
+\xylet@\resetxylinemiter@@=\resetxylinemiter@
+
+\xylet@\xymiterSpecial@@=\eat@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The path taken by the `poly-line' this is read as the list of <pos>itions
+in the current `stack', ignoring size extents.
+The macro |\xypolyline| is used as a <decor>; it reads the <pos>itions from
+the stack, but leaves the stack intact for later use.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Implementation of `poly-lines'.
+
+\DOCMODE(
+\xydef@\xypolyline#1{\xypolyline@{#1}}
+
+\xydef@\xypolyline@#1{\hbox\bgroup
+ \enter@{\pfromthep@ \basefromthebase@ \cfromthec@}%
+ \def\xyps@list{}\edef\smapp@@{\s@bot}%
+ \smapxy@i{\enter@{\pfromthep@ \basefromthebase@ }%
+ \edef\xyps@list{\expandafter\removePT@\the\X@c\space
+ \expandafter\removePT@\the\Y@c\space \xyps@list}\leave@}%
+ \leave@ \xy@polystyle@@{#1}\xydopoly@style\egroup
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\styledboxz@}}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The following diagram illustrates the use of line-thickness, line-joins
+and line-caps with poly-lines. It contains an example of each of the styles.
+
+\begin{code}
+\xycompileto{poly}%
+{/r4pc/:,*[|<5pt>][thicker]\xybox{%
+ *+(3,2){}="X"
+;@={p+CU,p+LU,p+LD,p+RD,p+RU,p+CU}
+ ,{0*[miter]\xypolyline{}}
+ ,{\xypolyline{*}},@i@)
+,"X",*+(2.5,1.5){}="X"
+,@={!CU,!LU,!LD,!RD,!RU,!CU}
+ ,{0*[gray][roundjoin]\xypolyline{}}
+ ,{0*[gray]\xypolyline{*}},@i@)
+,"X",*+(2,1){}="X"
+,@={!CU,!LU,!LD,!RD,!RU,!CU}
+ ,{0*[white]\xypolyline{*}}
+ ,{0*[bevel]\xypolyline{}},@i@)
+,"X"-(.7,0)*++\txt\LARGE{A}="a"
+,"X"+(.7,0)*++\txt\LARGE{B}="b"
+,{\ar@{-}@*{[butt][thinner]}"a";"b"<1pc>}
+,{\ar@{-}@*{[roundcap][thinner]}"a";"b"}
+,{\ar@{-}@*{[projcap][thinner]}"a";"b"<-1pc>}
+}}
+\end{code}
+$$\docode$$
+\displaycode
+\noindent
+Note the use of |{0*[...]\xypolyline{..}}| to apply style-modifiers
+to a polyline. The |@={!..}| method for loading the stack gives
+equivalent results to using |;@={p+..}|, since |\xypolyline|
+ignores the edge extents of each <pos> in the stack.
+
+Note also that the argument |#1| to |\xypolyline| affects what
+is typeset. Allowable arguments are:
+%
+\begin{defs}
+|\xypolyline{}| & solid line\cr
+|\xypolyline{.}| & dotted line\cr
+|\xypolyline{-}| & dashed line\cr
+|\xypolyline{*}| & fill enclosed polygon\cr
+|\xypolyline{?}| & fill enclosed polygon using even-odd rule\cr
+|\xypolyline{{*}}| & use |\dir{*}| for lines\cr
+|\xypolyline{<toks>}|\kern-20pt & \kern20pt using |\dir{<toks>}| \cr
+\end{defs}
+\noindent
+The latter cases one has |**\dir{...}| being used to connect the vertices
+of the polyline, with |{{*}}| being needed to get |**\dir{*}|.
+Similarly |**\dir| is used when a <driver> is not available to specifically
+support polylines; in particular the two `fill' options |*| and |?| will
+result in a dotted polygon outline the region intended to be filled.
+
+In all cases it is up to the user to load the stack before calling
+|\xypolyline{|\dots|}|. A particularly common case is the outline of
+an existing \Xy-pic <object>, as in the example above. Future extensions
+to |\frm| will provide a simplified mechanism whereby the user need not
+call |\xypolyline| explicitly for such effects.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xylet@\xypolyline@Special=\eat@
+\xylet@\xypolyfill@Special=\eat@
+\xylet@\xypolyeofill@Special=\eat@
+\xylet@\xypolydot@Special=\eat@
+\xylet@\xypolydash@Special=\eat@
+
+\xydef@\UnloadpolySpecials@{%
+ \let\xypolyline@Special=\eat@
+ \let\xypolyfill@Special=\eat@
+ \let\xypolyeofill@Special=\eat@
+ \let\xypolydot@Special=\eat@
+ \let\xypolydash@Special=\eat@
+}
+
+\xydef@\xy@polystyle@#1{%
+ \let\poly@style@@=\xypolyline@Special
+ \DNii@{#1}\ifx\nextii@\empty
+ \else\DN@{*}\ifx\next@\nextii@ \let\poly@style@@=\xypolyfill@Special
+ \else\DN@{?}\ifx\next@\nextii@ \let\poly@style@@=\xypolyeofill@Special
+ \else\expandafter\DN@\expandafter{\addDOT@{}}\ifx\next@\nextii@
+ \let\poly@style@@=\xypolydot@Special
+ \else\expandafter\DN@\expandafter{\addDASH@{}}\ifx\next@\nextii@
+ \let\poly@style@@=\xypolydash@Special
+ \else\DN@{{*}}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{*}}%
+ \else \def\poly@style@@{\xypolystraight@{#1}}%
+ \fi\fi\fi\fi\fi\fi }
+
+\xydef@\xydopoly@style{\expandafter\poly@style@@\expandafter{\xyps@list}}
+\xydef@\xynopolystyle@#1#2{\xyundefinedLine@{polyline}{{#1}}@@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+When there is no special support this handles the various cases using
+ordinary thin line types.
+
+\DOCMODE(
+\xydef@\xypolynospec@#1{\DNii@{#1}%
+ \ifx\nextii@\empty\def\poly@style@@{\xypolystraight@{-}}%
+ \else\DN@{.}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{.}}%
+ \else\DN@{-}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{--}}%
+ \else\DN@{*}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{.}}%
+ \else\DN@{?}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{.}}%
+ \else\DN@{{*}}\ifx\next@\nextii@ \def\poly@style@@{\xypolystraight@{*}}%
+ \else \def\poly@style@@{\xypolystraight@{#1}}%
+ \fi\fi\fi\fi\fi\fi }
+\DOCMODE)
+
+Gobble the collected positions in |{\xyps@list}|; recover the vertices
+from the stack, then set straight lines in the appropriate style.
+
+\DOCMODE(
+\xydef@\xypolystraight@#1#2{%
+ \enter@{\pfromthep@ \basefromthebase@ \cfromthec@}%
+ \edef\smapp@@{\s@bot}\csname S@0\endcsname\czeroEdge@\pfromc@\def\smapp@@{0}%
+ \smapxy@i{\czeroEdge@\enter@{\pfromthec@}{\connect@\dir{#1}}\leave@}\leave@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Initially poly-lines are uninstalled, until loaded by a <driver>.
+
+\DOCMODE(
+\xylet@\xy@polystyle@@=\xypolynospec@
+
+\xydef@\UninstallPolylines@{%
+ \UnloadpolySpecials@
+ \let\xy@polystyle@@=\xypolynospec@ }
+\UninstallPolylines@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Installation}
+
+Initially there is no support for the actual effects.
+
+\DOCMODE(
+\xydef@\xyundefinedLine@#1#2@@{%
+ \xywarning@{The #1 #2 effect is not implemented with the current driver.}}%
+
+\xydef@\xynolinewidth@#1#2{%
+ \xyundefinedLine@{linewidth}{\the\xylinethick@}@@}%
+\xydef@\xynolinecap@#1{\xyundefinedLine@{linecap}{\xylinecap@}@@}%
+\xydef@\xynolinejoin@#1{\xyundefinedLine@{linejoin}{\xylinejoin@}@@}%
+\xydef@\xynolinemiter@#1{\xyundefinedLine@{miterlimit}{\xylinemiter@}@@}%
+\DOCMODE)
+
+Nothing further can be done unless allowed by a specific <driver>, which
+must establish an alternative expansions to be bound to |\xylinewidth@@|
+and the other hooks.
+
+\DOCMODE(
+\xylet@\xylinewidth@@=\xynolinewidth@
+\xylet@\xy@linecap@@=\xynolinecap@
+\xylet@\xy@linejoin@@=\xynolinejoin@
+\xylet@\xy@linemiter@@=\xynolinemiter@
+
+\xydef@\UnloadLine@#1{%
+ \ifx#1\relax\else\xyunload@{line width extension}\fi
+ \let\resetxyline@@=\resetxyline@
+ \let\resetxylinecap@@=\resetxylinecap@
+ \let\resetxylinejoin@@=\resetxylinejoin@
+ \let\resetxylinemiter@@=\resetxylinemiter@
+ \let\transxyline@@=\DN@
+ \let\xylineSpecial@@=\eat@
+ \let\xycapSpecial@@=\eat@
+ \let\xyjoinSpecial@@=\eat@
+ \let\xymiterSpecial@@=\eat@
+ \let\xylinewidth@@=\xynolinewidth@
+ \let\xy@linecap@@=\xynolinecap@
+ \let\xy@linejoin@@=\xynolinejoin@
+ \let\xy@linemiter@@=\xynolinemiter@
+ \UninstallPolylines@ }
+
+\xyaddunsupport{line}{\UnloadLine@\relax}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This is a possible alternative for |\xylinewidth@@|. Indeed it is used
+with the \PS\ support, which then redefines just |\xylineSpecial@@|.
+
+\DOCMODE(
+\xydef@\xylinewidth@#1#2{\checkXyStyle@
+ #1\let\prexyline@=\prexyline@@ \let\postxyline@=\postxyline@@
+ \applyLIFOstyle@\prexyline@{\the\xylinethick@}\postxyline@{#2}}
+\xydef@\prexyline@@{\let\prexyline@=\eat@
+ \let\postxyline@=\postxyline@@ \outputxyline@ }
+\xydef@\postxyline@@{\let\postxyline@=\eat@
+ \let\prexyline@=\prexyline@@ \resetxyline@@ }
+\xylet@\prexyline@=\prexyline@@
+\xylet@\postxyline@=\postxyline@@
+
+\xydef@\resetxyline@#1{\resetxyline@i{#1}\outputxyline@{#1}}
+\xydef@\resetxyline@i#1{\xylinethick@=#1\relax}
+\xydef@\outputxyline@#1{\transxyline@@{#1}%
+ \expandafter\xylineSpecial@@\expandafter{\next@}}
+\xylet@\resetxyline@@=\resetxyline@
+\DOCMODE)
+
+These need to be rebound by a back-end which supports variation in the
+line-thickness.
+
+\DOCMODE(
+\xydef@\transxyline@#1{\edef\next@{\removePT@#1}}
+
+\xylet@\transxyline@@=\DN@
+\xylet@\xylineSpecial@@=\eat@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyline.doc,v $
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.3 1996/12/18 09:22:29 ross
+% adjustments for styles now within the kernel code
+% fixed problem with line-widths
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.12 1994/10/25 03:01:14 ross
+% Final 3beta release [bug fixes & AMS-LaTeX fitting].
+%
+% Revision 2.11 1994/07/05 09:27:49 ross
+% fixed documentation bug
+%
+% Revision 2.10 1994/06/15 12:46:03 ross
+% Second release 3beta.
+% Colour and line style saving works; label colouring bug fixed.
+%
+% Revision 2.9 1994/06/09 14:39:49 ross
+% Release 3beta.
+%
+% NEW for version 2.9 by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xymacpat.xyp b/Master/texmf-dist/source/generic/xypic/xymacpat.xyp
new file mode 100644
index 00000000000..2987acd7bbe
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xymacpat.xyp
@@ -0,0 +1,61 @@
+% $Id: xymacpat.xyp,v 3.3 1996/12/18 09:25:21 ross Exp $
+%
+% Patterns for Xy-pic tile extension.
+% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%
+% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+% See the companion README and INSTALL files for further information.
+% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%
+% The Xy-pic package is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.
+%
+% The Xy-pic package is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License along
+% with this package; if not, write to the Free Software Foundation, Inc.,
+% 675 Mass Ave, Cambridge, MA 02139, USA.
+%
+mac01 00 <FFFFFFFFFFFFFFFF>
+mac02 08 <DDFF77FFDDFF77FF>
+mac03 16 <DD77DD77DD77DD77>
+mac04 32 <AA55AA55AA55AA55>
+mac05 16 <55FF55FF55FF55FF>
+mac06 32 <AAAAAAAAAAAAAAAA> <AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>
+mac07 16 <EEDDBB77EEDDBB77> <EEEEEEDDDDDDBBBBBB777777EEEEEEDDDDDDBBBBBB777777>
+mac08 48 <8888888888888888> <888888888888888888888888888888888888888888888888>
+mac09 40 <B130031BD8C00C8D> <B1B1B13030300303031B1B1BD8D8D8C0C0C00C0C0C8D8D8D>
+mac10 56 <8010022001084004> <808080101010020202202020010101080808404040040404>
+mac11 36 <FF888888FF888888> <FFFFFF888888888888888888FFFFFF888888888888888888>
+mac12 42 <FF808080FF080808> <FFFFFF808080808080808080FFFFFF080808080808080808>
+mac13 63 <8000000000000000> <808080000000000000000000000000000000000000000000>
+mac14 58 <8040200002040800> <808080404040202020000000020202040404080808000000>
+mac15 49 <8244394482010101> <828282444444393939444444828282010101010101010101>
+mac16 34 <F87422478F172271> <F8F8F87474742222224747478F8F8F171717222222717171>
+mac17 48 <55A04040550A0404> <555555A0A0A04040404040405555550A0A0A040404040404>
+mac18 50 <2050888888880502> <202020505050888888888888888888888888050505020202>
+mac19 31 <BF00BFBFB0B0B0B0> <BFBFBF000000BFBFBFBFBFBFB0B0B0B0B0B0B0B0B0B0B0B0>
+mac20 64 <0000000000000000>
+mac21 60 <8000080080000800>
+mac22 56 <8800220088002200>
+mac23 48 <8822882288228822>
+mac24 48 <AA00AA00AA00AA00>
+mac25 32 <FF00FF00FF00FF00> <FFFFFF000000FFFFFF000000FFFFFF000000FFFFFF000000>
+mac26 48 <1122448811224488> <111111222222444444888888111111222222444444888888>
+mac27 48 <FF000000FF000000> <FFFFFF000000000000000000FFFFFF000000000000000000>
+mac28 56 <0102040810204080> <010101020202040404080808101010202020404040808080>
+mac29 56 <AA00800088008000> <AAAAAA000000808080000000888888000000808080000000>
+mac30 49 <FF80808080808080> <FFFFFF808080808080808080808080808080808080808080>
+mac31 51 <081C22C180010204> <0808081C1C1C222222C1C1C1808080010101020202040404>
+mac32 50 <881422418800AA00> <888888141414222222414141888888000000AAAAAA000000>
+mac33 58 <40A00000040A0000> <404040A0A0A00000000000000404040A0A0A000000000000>
+mac34 51 <038448300C020101> <0303038484844848483030300C0C0C020202010101010101>
+mac35 46 <8080413E080814E3> <8080808080804141413E3E3E080808080808141414E3E3E3>
+mac36 44 <102054AAFF020408> <101010202020545454AAAAAAFFFFFF020202040404080808>
+mac37 26 <77898F8F7798F8F8> <7777778989898F8F8F8F8F8F777777989898F8F8F8F8F8F8>
+mac38 48 <0008142A552A1408> <0000000808081414142A2A2A5555552A2A2A141414080808>
diff --git a/Master/texmf-dist/source/generic/xypic/xymatrix.doc b/Master/texmf-dist/source/generic/xypic/xymatrix.doc
new file mode 100644
index 00000000000..4c269ad502a
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xymatrix.doc
@@ -0,0 +1,1345 @@
+%% $Id: xymatrix.doc,v 3.4 1997/05/18 01:14:25 krisrose Exp $
+%%
+%% Xy-pic ``Matrix'' feature.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{matrix}{Matrix feature}{\stripRCS$Revision: 3.4 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This option implements ``\Xy-matrices'', \ie, matrices where it is
+ possible to refer to the entry objects by their row/column address.
+ We first describe the general form of \Xy-matrices in~\S??[matrix],
+ then in~\S??[coord] we summarise the new <coord>inate forms used to
+ refer to entries. In~\S??[spacing] we explain what parameters can be
+ set to change the spacing and orientation of the matrix, and
+ in~\S??[entries] we explain how the appearance of the entries can be
+ changed.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{\Xy-matrices}
+??=[matrix]
+%
+ The fundamental command of this feature is
+%
+\begin{defs1}
+ ??c![\xymatrix] <setup> |{|<rows>|}|
+\end{defs1}
+\noindent\unskip
+%
+ that reads a ??w![matrix] of entries in the generic \TeX\ row\&column
+ format, \ie, where rows are separated with ??c![\\] and contain
+ columns separated with ??c![&] (we discuss in the following sections
+ what <setup> can be). Thus a matrix with "maxrow" rows and "maxcol"
+ columns where each entry contains "row"|,|"col" is entered as
+$$
+\begin{array}{llll}
+|\xymatrix{|\\
+~{|1,1 &|} &{|1,2 &|}\quad\cdots &{|1,|"maxcol"| \\|} \\
+~{|2,1 &|} &{|2,2 &|} &{|2,|"maxcol"| \\|} \\
+~~\vdots &\qquad\ddots \\
+~{"maxrow"|,1 &|}&{"maxrow"|,2 &|} &{"maxrow"|,|"maxcol"| }|}
+\end{array}
+$$
+ (\TeX\-nically the |&| character represents any `alignment tab', \ie,
+ character with category code~4).
+
+ A ??w![<matrix>] can appear either in an \Xy-picture (as <decor>) or
+ ``stand-alone''.
+
+ The aspects in which |\xymatrix| differs from ordinary matrix
+ constructions, such as Plain \TeX's |\matrix{|\dots|}| and \LaTeX's
+ |array| environment, are
+%
+\begin{itemize}
+
+\item
+ arbitrary \Xy-pic <decor>ations may be specified in each entry and
+ will be interpreted in a state where $c$ is the current entry,
+
+\item
+ the entire matrix is an object itself with reference point as the top
+ left entry, and
+
+\item
+ a progress message ``|<xymatrix| "rows"|x|"cols" "size"|>|'' is
+ printed for each matrix with $"rows"\times"cols"$ entries and \Xy-pic
+ complexity "size" (the number of primitive operations performed),
+ unless the declaration ??c![\SilentMatrices] is issued.
+
+\item
+ Entries starting with a ??c![*] are special (described
+ in~\S??[entries])\footnote{In general it is recommended that entries
+ start with a non-expanding token, \ie, an ordinary (non-active)
+ character, {\tt\otherbgroup}, or |\relax|, for compilation to work.},
+ so use |{*}| to get a $\star$.
+
+\end{itemize}
+%
+ For example,
+%
+\begin{code}
+\xy
+ \xymatrix{A&B\\C&D}
+ \drop\frm{-}
+ \drop\cir<8pt>{}
+\endxy
+\end{code}
+\displaycode
+%
+\noindent
+ will typeset
+%
+$$\docode$$
+%
+ \BUG: Matrix nesting is not safe.
+
+ Matrices are often quite slow to typeset so as a convenience all
+ matrices can be set to compile (and not) automatically with the
+ declarations
+%
+\begin{defs1}
+|\CompileMatrices| \cr
+|\NoCompileMatrices| \cr
+\end{defs1}
+\noindent\unskip
+%
+ Matrices can be compiled or not individually, by using the explicit
+ commands ??c![\xymatrixcompile] and ??c![\xymatrixnocompile] as
+ well as by encapsulating in the usual
+ |\xycompileto{|"name"|}{|\dots|}| (see note~??g[xy.doc:compile]).
+
+ \NOTE: Matrices will only compile correctly if all entries start with
+ a nonexpandable token, \ie, |{| or |\relax| or some non-active
+ character.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{On the following code:}
+
+ The complexity of this option stems from the fact that we cannot
+ build the actual \Xy-picture until after the matrix has been typeset
+ so that we know the sizes and places of all the entries. The
+ handling described here is thus separated into several subprocedures.
+
+\paragraph*{Setup:}
+
+ Not much---only to keep track of the rows and columns. These are not
+ accesible to the user---should they?
+
+\DOCMODE(
+\xynew@{count}\Row
+\xynew@{count}\Col
+
+\xydef@\maxrow@{0} % highest row number used
+\xydef@\maxcol@{0} % highest column number used
+\xydef@\maxcolrow@{0} % a row with maximal number of columns
+\DOCMODE)
+
+ There are some user-defined parameters summarised later.
+
+ The following is an experimental set of `optimal' queueing macros
+ using two queues and two counters to keep track of the progress.
+
+\DOCMODE(
+\xynew@{toks}\queue@
+\xynew@{toks}\queue@@
+
+\xynew@{count}\qcount@
+\xynew@{count}\qcount@@
+
+\xydef@\clearq@{%
+ \global\queue@={}\global\qcount@=\@ne
+ \global\queue@@={}\global\qcount@@=\z@}
+
+\xydef@\addq@#1{\global\advance\matrixsize@\@ne
+ \ifnum\qcount@@<\qcount@ \let\addq@@=\addq@i
+ \else \let\addq@@=\addq@ii \fi
+ \expandafter\addq@@\the\queue@@\addq@@{#1}}
+
+\xylet@\addq@@=\relax
+
+\xydef@\addq@i#1\addq@@#2{%
+ \global\advance\qcount@@\@ne \global\queue@@={#1#2}}
+
+\xydef@\addq@ii#1\addq@@#2{%
+ \global\advance\qcount@\@ne \global\qcount@@=\z@
+ \global\queue@=\expandafter{\the\queue@#1#2}\global\queue@@={}}
+
+\xydef@\finishq@{\expandafter\addq@ii\the\queue@@\addq@@{}}
+\DOCMODE)
+
+ \HACK: intended to make the addition of tokens to the token list
+ faster: we first add to the `small' |\queue@@| as many times as we
+ have added to the `big' |\queue@| before that. So we know we should
+ always expand |\queue@@|: this is done first (last in the macro
+ text). Then we call |\addq@@| that will either add to the small one
+ or add the small one to the big one and then clear the small one!
+
+ "Usage": Call |\clearq@| first. Then use |\addq@| as many times as
+ desired. To get the queue in |\queue@| call |\finishq@| and use it.
+ Finally clear |\queue@| (globally) or continue.
+
+\paragraph*{Main procedure:}
+
+ Here is the main code which is concerned with initialisations and
+ output of messages explaining how far the matrix construction has
+ progressed.
+
+\DOCMODE(
+\xynew@{count}\matrixsize@
+\xynew@{if}\ifnoisymatrices@ \noisymatrices@true
+
+\xydef@\SilentMatrices{\noisymatrices@false}
+\xydef@\NoisyMatrices{\noisymatrices@true}
+
+\xydef@\xymatrixnocompile{\global\matrixsize@=\z@
+ \ifnoisymatrices@\message{<xymatrix}\fi
+ \if\inxy@
+ \DN@{\nter@{}\xy@\xymatrix{\enter@{%
+ \def\noexpand\xy@minX@@{\xy@minX@@}\def\noexpand\xy@maxX@@{\xy@maxX@@}%
+ \def\noexpand\xy@minY@@{\xy@minY@@}\def\noexpand\xy@maxY@@{\xy@maxY@@}%
+ \edef\noexpand\xymatrixprefix@@{\codeof\xymatrixprefix@@}}}}%
+ \else \DN@{\xy \nter@\endxy \xy@\xymatrix{\nter@{}}}\fi \next@
+ \xy@@{\save@ \edef\matrixorigin@{\X@c=\the\X@c \Y@c=\the\Y@c}%
+ \edef\xy@minX@@{\the\X@c}\edef\xy@maxX@@{\the\X@c}%
+ \edef\xy@minY@@{\the\Y@c}\edef\xy@maxY@@{\the\Y@c}}%
+ \xdef\maxrow@{0}\xdef\maxcol@{0}\xdef\maxcolrow@{0}%
+ \mkHWdefaults@ \xymatrix@prefix""}
+
+\xylet@\xymatrix=\xymatrixnocompile
+
+\xydef@\xymatrixprefix@@{}
+
+\xydef@\xymatrix@prefix"#1"{\DN@{#1}\edef\xymatrixprefix@@{\codeof\next@}%
+ \DNii@##1{\xy@{"#1"}{\edef\xymatrixprefix@@{##1}}}%
+ \expandafter\nextii@\expandafter{\xymatrixprefix@@}%
+ \xyFN@\xymatrix@setup}
+
+\xydef@\xymatrix@setup{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@setup}%gobble spaces
+ \else\ifx \bgroup\next \let\next@=\xymatrix@ii
+ \else\addAT@\ifx\next \addAT@\DN@{\xy@{@}{}\xyFN@\xymatrix@at}%
+ \else\ifx "\next \let\next@=\xymatrix@prefix
+ \else \DN@{\xyerror@{\string\xymatrix<setup>{<rows>} expected}{}}%
+ \fi\fi\fi\fi \next@}
+
+\xydef@\xymatrix@ii#1{%
+%
+%\W@{ H@max=\meaning\H@max}%
+%\W@{ W@max=\meaning\W@max}%
+%\W@{ HW@max=\meaning\HW@max}%
+%\W@{ mkHrow@={\meaning\mkHrow@}}%
+%\W@{ mkWcol@={\meaning\mkWcol@}}%
+%\W@{ mkHmax@={\meaning\mkHmax@}}%
+%\W@{ mkWmax@={\meaning\mkWmax@}}%
+%\W@{ mkHWmax@={\meaning\mkHWmax@}}%
+%
+ \xymatrix@pretypeset{#1}%
+% \ifnum\maxcol@=\z@ \mkWcol@ \mkWmax@ %\mkHrow@ \mkHmax@
+ \ifnum\maxcol@=\z@ \mkWcol@ \mkWmax@ \mkHrow@ \mkHmax@
+ \xdef\maxcol@{\the\Col}\xdef\maxcolrow@{\the\Row}\fi
+ \ifnoisymatrices@\message{\maxcol@ x\maxrow@}\fi
+ \xymatrix@measureit@@ \the\queue@ \global\queue@={}%
+ \xymatrix@typeset{#1}\restore\xymatrix@insert
+ \xy@@\leave@ \leave@
+ \ifnoisymatrices@\message{\the\matrixsize@>}\fi \ignorespaces}
+\DOCMODE)
+
+ Here is where compilation of matrices is turned on/off.
+
+\DOCMODE(
+\xydef@\xymatrixcompile#1#{\xymatrixcompile@{#1}}
+\xydef@\xymatrixcompile@#1#2{\xycompile{\xymatrixnocompile#1{#2}}}
+
+\xydef@\CompileMatrices{\let\xymatrix=\xymatrixcompile}
+\xydef@\NoCompileMatrices{\let\xymatrix=\xymatrixnocompile}
+\DOCMODE)
+
+ \TODO: Proper nesting that ensures that the matrix state is
+ reestablished after the current one has been typeset.
+
+ Each subprocedure is explained below.
+
+\paragraph*{Set row-rotation:}
+
+ This sets the general direction of the rows as the current direction
+ indicates. This direction is not known until \Xy-time so it gets put
+ into the row/column definitions.
+
+\DOCMODE(
+\xydef@\xy@cossign@@{+}
+\xydef@\xy@sinsign@@{+}
+\xydef@\xy@cosabs@@{1}
+\xydef@\xy@sinabs@@{0}
+\xydef@\xy@tanabs@@{0}
+\xydef@\xy@cotabs@@{100}
+
+\xydef@\xymatrix@rotation{%?*[rotation]
+ \xy@@{%
+ \edef\xy@cossign@@{\ifdim\cosDirection\p@<\z@-\else+\fi}%
+ \edef\xy@sinsign@@{\ifdim\sinDirection\p@<\z@-\else+\fi}%
+ \edef\xy@cosabs@@{%
+ \if\xy@cossign@@\cosDirection\else\xy@cossign@@\cosDirection\fi}%
+ \edef\xy@sinabs@@{%
+ \if\xy@sinsign@@\sinDirection\else\xy@sinsign@@\sinDirection\fi}%
+ \dimen@=\xy@cosabs@@\p@ \dimen@ii=\xy@sinabs@@\p@
+ \ifdim\dimen@ii<.01\p@ \def\xy@cotabs@@{100}%
+ \else \quotient@\xy@cotabs@@\dimen@\dimen@ii \fi
+ \dimen@=\xy@cosabs@@\p@ \dimen@ii=\xy@sinabs@@\p@
+ \ifdim\dimen@<.01\p@ \def\xy@tanabs@@{100}%
+ \else \quotient@\xy@tanabs@@\dimen@ii\dimen@ \fi}}
+\DOCMODE)
+
+\paragraph*{Pretypeset:}
+
+ The purpose of this is to
+%
+\begin{itemize}
+\item
+ set box8 to an halign with all the entries properly typeset to be
+ measured in the next step, and
+\item
+ store in a queue the operations that will define each entry as an
+ object once the measurement is done and the distances between rows
+ and columns is known.
+\end{itemize}
+%
+ This is achieved as follows: Row/column counters, maxima, and queues
+ are reset. The tab- and interlineskip is removed to make taking the
+ constructed box apart easier. And the halign template is used to
+ apply an appropriate action for each entry that updates the counters
+ and queue.
+
+ The special |\xymatrixsavedCOORD@| is used to store the original
+ |\COORD@| except when diagrams are nested.
+
+\DOCMODE(
+\xylet@\xymatrixsavedCOORD@=\relax
+
+\xydef@\xymatrix@pretypeset#1{%
+ \global\Row=\z@ \xdef\maxcol@{0}\clearq@
+ \setbox8=\vtop{%
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@
+ \everycr{}\let\\=\cr \tabskip=\z@ \offinterlineskip
+ \halign{\prentry@ ##!@&&\xyFN@\prentry@@##!@\cr#1\crcr}%
+ \prentry@@@}%
+ \xdef\maxrow@{\the\Row}%
+ \finishq@}
+\DOCMODE)
+
+ The first entry in each row is special; in particular it moves the
+ entries from the columns of the previous row (if any) into the
+ second-level queue:
+
+\DOCMODE(
+\xydef@\prentry@{\relax
+ \ifnum\Row>\z@
+ \ifnum\maxcol@<\Col\xdef\maxcol@{\the\Col}\xdef\maxcolrow@{\the\Row}\fi
+ \expandafter\xdef\csname maxcol@\the\Row\endcsname{\the\Col}\fi
+ \global\advance\Row\@ne \global\Col=\z@ \xyFN@\prentry@@}
+\DOCMODE)
+
+ The common part should first typeset the object. Then the resulting
+ <setup> commands should be emitted as described below.
+
+ While typesetting the entry, \Xy-commands are "disabled" by
+ redefining |\xy@| to just `eat' its arguments, so they don't
+ interfere\dots
+
+\DOCMODE(
+\xylet@\lastprentry@@=\relax
+
+\xydef@\xyeatall@{\let\xy@=\xyeat@ \change@oxy@\xyeat@ \let\xy@@ix@=\eat@}
+
+\xydef@\prentry@@{\global\advance\Col\@ne
+ \let\next@=\prentry@@norm
+ \ifoldxymatrix@\else \ifx *\next \DN@*{\xyFN@\prentry@@star}\fi \fi
+ \next@}
+
+\xydef@\prentry@@star{\ifx *\next \DN@*{\xyFN@\prentry@@star@ii}%
+ \else \DN@##1##{\prentry@@star@i{##1}}\fi \next@}
+
+\xydef@\prentry@@star@i#1#2#3!@{\gdef\lastprentry@@{*#1{#2}#3}%
+ \setbox\lastobjectbox@=\object#1{#2}%
+ \prentry@@x}
+
+\xydef@\prentry@@star@ii{%
+ \ifx [\next
+ \DN@[##1]{\DN@####1{\def\entrymodifiers@{[##1]####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\prentry@@norm}%]
+ \else
+ \DN@##1{\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\prentry@@norm}%
+ \fi \next@}
+
+\xydef@\prentry@@norm#1!@{\gdef\lastprentry@@{#1}%
+ \DN@{\setbox\lastobjectbox@=\object}%
+ \expandafter\next@\entrymodifiers@{\xyeatall@ \everyentry@ #1}%
+ \prentry@@x}
+
+\xydef@\prentry@@x{%
+ \edef\next@{{\noexpand\pre@emit{\the\Row}{\Upness@}{\the\Col}{\Leftness@}%
+ {\the\L@c}{\the\R@c}{\the\D@c}{\the\U@c}{\expandafter\noexpand\the\Edge@c}}}%
+ \expandafter\addq@\next@ \box\lastobjectbox@}
+\DOCMODE)
+
+ Finally the following ensures that the last row in the diagram is
+ treated correctly: if the last entry was an empty row then we ignore
+ the row entirely if the |\ifoldxymatrix@| switch is set just as we
+ ignore |*|-entries above.
+
+\DOCMODE(
+\xynew@{if}\ifoldxymatrix@ \oldxymatrix@false
+
+\xydef@\prentry@@@{\relax \let\next@=\prentry@@@i
+ \ifoldxymatrix@ \ifnum\Col=\@ne \ifx\lastprentry@@\empty
+ \global\advance\Row\m@ne \let\next@=\relax \fi\fi\fi
+ \global\let\lastprentry@@=\relax \next@}
+
+\xydef@\prentry@@@i{%
+ \ifnum\maxcol@<\Col \xdef\maxcol@{\the\Col}\xdef\maxcolrow@{\the\Row}\fi
+ \expandafter\xdef\csname maxcol@\the\Row\endcsname{\the\Col}}
+\DOCMODE)
+
+ Furthermore the code (??_[edge])~sets the edge and extents of the
+ object and (??_[extents])~adds the object to the size of the matrix.
+ \BUG: Currently ignores upness and leftness parameters.
+
+\DOCMODE(
+\xydef@\xy@minX@@{\z@}
+\xydef@\xy@maxX@@{\z@}
+\xydef@\xy@minY@@{\z@}
+\xydef@\xy@maxY@@{\z@}
+
+\xydef@\pre@emit#1#2#3#4#5#6#7#8#9{%
+ % #1=R,#2=Upn,#3=C,#4=Leftn,#5=L,#6=R,#7=D,#8=U,#9=Edge.
+ \global\Row=#1\global\Col=#3\relax
+ \ifnum#3=\@ne
+ \ifnum#1=\@ne \xy@@{\matrixorigin@}%?*[1,1]
+ \else \count@@=#1\advance\count@@\m@ne %?*[r,1]
+ \edef\next@{\noexpand\xy@@{\noexpand\cfromid@
+ {\xymatrixprefix@@\the\count@@,1}}}\next@
+ \pre@emit@ \W@maxout\Hrow@c@@\W@maxin\Hrow@in\xy@tanabs@@
+ \X@c\xy@sinsign@@\xy@sinabs@@\xymatrixrowsep@
+ \pre@emit@ \Hrow@c@@\W@maxout\Hrow@in\W@maxin\xy@cotabs@@
+ \Y@c{-\xy@cossign@@}\xy@cosabs@@\xymatrixrowsep@
+ \fi
+ \else \count@@=#3\advance\count@@\m@ne %?*[r,c]
+ \pre@emit@ \Wcol@c@@\H@maxout\Wcol@in\H@maxin\xy@cotabs@@
+ \X@c\xy@cossign@@\xy@cosabs@@\xymatrixcolsep@
+ \pre@emit@ \H@maxout\Wcol@c@@\H@maxin\Wcol@in\xy@tanabs@@
+ \Y@c\xy@sinsign@@\xy@sinabs@@\xymatrixcolsep@
+ \fi
+ \DN@##1{\xy@@{\L@c=#5\R@c=#6\D@c=#7\U@c=#8\Edge@c={#9}\idfromc@{##1#1,#3}}}%
+ \expandafter\next@\expandafter{\xymatrixprefix@@}%?*[edge]
+ \xy@@{%?*[extents]
+ \dimen@=\X@c \advance\dimen@-\L@c
+ \ifdim\dimen@<\xy@minX@@ \edef\xy@minX@@{\the\dimen@}\fi
+ \dimen@=\X@c \advance\dimen@+\R@c
+ \ifdim\dimen@>\xy@maxX@@ \edef\xy@maxX@@{\the\dimen@}\fi
+ \dimen@=\Y@c \advance\dimen@-\D@c
+ \ifdim\dimen@<\xy@minY@@ \edef\xy@minY@@{\the\dimen@}\fi
+ \dimen@=\Y@c \advance\dimen@+\U@c
+ \ifdim\dimen@>\xy@maxY@@ \edef\xy@maxY@@{\the\dimen@}\fi}}
+\DOCMODE)
+
+ The following procedure represents the similarity of the four lines
+ for the coordinates in the computation above\dots \TODO: describe
+ this properly\dots
+
+\DOCMODE(
+\xydef@\pre@emit@#1#2#3#4{#1\A@ #2\B@ #3\R@ #4\dimen@
+ \edef\next@{{\the\A@}{\the\B@}{\the\R@}{\the\dimen@}}%
+ \expandafter\pre@emit@i\next@}
+
+\xydef@\pre@emit@i#1#2#3#4#5{\xy@@{%
+ % Emit R := min(#1,#5#2) + min(#3,#5#4)
+ \dimen@=#2\R@=#5\dimen@ \dimen@=#1\relax \ifdim\R@>\dimen@ \R@=\dimen@ \fi
+ \dimen@=#4\B@=#5\dimen@ \dimen@=#3\relax \ifdim\B@>\dimen@ \B@=\dimen@ \fi
+ \advance\R@\B@}%
+ \pre@emit@ii}
+
+\xydef@\pre@emit@ii#1#2#3#4{\xy@@{%
+ % Emit #1 := #1 + #2*[ R + #3#4 ]
+ \dimen@=#4\dimen@=#3\dimen@ \advance\R@\dimen@ \advance#1#2\R@}}
+
+\xydef@\Wcol@in#1{#1=\csname Wcol@\the\Col\endcsname #1=.5#1}
+\xydef@\Wcol@out#1{#1=\csname Wcol@\the\Col\endcsname #1=.5#1}
+\xydef@\Wcol@c@@#1{#1=\csname Wcol@\the\count@@\endcsname #1=.5#1}
+\xydef@\W@maxin#1{#1=\W@max #1=.5#1}
+\xydef@\W@maxout#1{#1=\W@max #1=.5#1}
+
+\xydef@\Hrow@in#1{#1=\csname Hrow@\the\Row\endcsname #1=.5#1}
+\xydef@\Hrow@out#1{#1=\csname Hrow@\the\Row\endcsname #1=.5#1}
+\xydef@\Hrow@c@@#1{#1=\csname Hrow@\the\count@@\endcsname #1=.5#1}
+\xydef@\H@maxin#1{#1=\H@max #1=.5#1}
+\xydef@\H@maxout#1{#1=\H@max #1=.5#1}
+\DOCMODE)
+
+ \BUG: It should be possible to change te adjustment more profoundly
+ for individual entries, rows, and columns.
+
+\paragraph*{Measure:}
+
+ Take the created box8 apart to define the macros |\Wcol@|"col" and
+ |\Hrow@|"row" containing the width and height of the bounding box of
+ the entries in the row/column. Finally the commands collected in the
+ queue are executed (hopefully they'll invoke |\pre@emit| a number of
+ times). This is a hook because some special cases won't need it\dots
+
+\DOCMODE(
+\xydef@\H@max{\z@}
+\xydef@\W@max{\z@}
+\xydef@\HW@max{\z@}
+
+\xydef@\mkHrow@{}
+\xydef@\mkWcol@{}
+\xydef@\mkHmax@{}
+\xydef@\mkWmax@{}
+\xydef@\mkHWmax@{}
+
+\xydef@\mkHWdefaults@{\let\xymatrix@measureit@@=\xymatrix@measureit
+ \let\mkHrow@=\Hrow@R \let\mkWcol@=\Wcol@C
+ \def\mkHmax@{\ifdim\dimen@>\H@max\relax \xdef\H@max{\the\dimen@}\fi}%
+ \def\mkWmax@{\ifdim\dimen@>\W@max\relax \xdef\W@max{\the\dimen@}\fi}%
+ \let\mkHWmax@=\HWmax@max}
+
+\xydef@\Hrow@R{\expandafter\xdef\csname Hrow@\the\Row\endcsname{\the\dimen@}}
+\xydef@\Wcol@C{\expandafter\xdef\csname Wcol@\the\Col\endcsname{\the\dimen@}}
+
+\xydef@\Hrow@max{\expandafter\gdef\csname Hrow@\the\Row\endcsname{\H@max}}
+\xydef@\Wcol@max{\expandafter\gdef\csname Wcol@\the\Col\endcsname{\W@max}}
+
+\xydef@\Hrow@HWmax{\expandafter\gdef\csname Hrow@\the\Row\endcsname{\HW@max}}
+\xydef@\Wcol@HWmax{\expandafter\gdef\csname Wcol@\the\Col\endcsname{\HW@max}}
+
+\xydef@\HWmax@max{%
+ \ifdim\H@max>\W@max\global\let\HW@max=\H@max\else\global\let\HW@max=\W@max\fi}
+
+\xydef@\HWmax@set#1{\gdef\HW@max{#1}%
+ \global\let\H@max=\HW@max \global\let\W@max=\HW@max}
+
+\xydef@\xymatrix@measureit{%
+ \xdef\H@max{\z@}\xdef\W@max{\z@}%
+ \setbox6=\vbox{\unvbox8 \global\Row=\maxrow@
+ \loop@ \dimen@ii=\lastskip\unskip \ifnum\z@<\Row
+ \setbox4=\lastbox \dimen@=\dp4 \advance\dimen@\ht4 \mkHrow@ \mkHmax@
+ \ifnum\Row=\maxcolrow@
+ \setbox2=\hbox{\unhbox4 %
+ \global\Col=\maxcol@
+ \loop@ \dimen@ii=\lastskip\unskip \ifnum\z@<\Col
+ \setbox\z@=\lastbox \dimen@=\wdz@ \mkWcol@ \mkWmax@
+ \global\advance\Col\m@ne
+ \repeat@}\fi
+ \global\advance\Row\m@ne
+ \repeat@}%
+ \mkHWmax@}
+
+\xylet@\xymatrix@measureit@@=\relax
+\DOCMODE)
+
+ \TODO: Allow non-default spacing between particular rows/columns as
+ well as different justification of the entire matrix\dots
+
+\paragraph*{Typeset:}
+
+ Retypeset the entire diagram using a hacked halign: its template
+ typesets each entry as
+$$
+ |\POS|\,|"|"row"|,|"col"|"|\,|*|\,"object"\,|\relax|\,"\Xy-commands"|\relax|
+$$
+ where "object" is the contents of the entry translated into \Xy-pic
+ <object> form and "\Xy-commands" entails the commands used in this
+ particular entry.
+
+\DOCMODE(
+\xydef@\xymatrix@typeset#1{%
+ \clearq@
+ \hbox{\vtop{\xyqall@
+ \xy@@{\ifx\xymatrixsavedCOORD@\relax
+ \enter@{\noexpand\let\noexpand\COORD@\noexpand\xymatrixsavedCOORD@}%
+ \let\xymatrixsavedCOORD@=\COORD@ \let\COORD@=\xymatrixCOORD@
+ \else \enter@{}\fi}%
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@
+ \kern\z@ \global\Row=\z@
+ \everycr{}\let\\=\cr \tabskip=\z@ \offinterlineskip
+ \halign{\entry@##!@&&\entry@@##!@\cr#1\crcr}%
+ \xy@@{\leave@}}}%
+ \finishq@ \expandafter\xy@@\expandafter{\the\queue@}\global\queue@={}}
+\DOCMODE)
+
+ Here are the template execution macros: We reset the |\queue@| for
+ each entry, |\drop| it the usual way except first all \Xy-commands
+ are `redirected' to the queue, and then typeset them.
+
+\DOCMODE(
+\xydef@\entry@{\relax \global\advance\Row\@ne \global\Col=\z@ \entry@@}
+\DOCMODE)
+
+ Again some parsing determines whether this is a |*|-object or a
+ normal object:
+
+\DOCMODE(
+\xydef@\entry@@{\global\advance\Col\@ne
+ \DN@##1,##2,##3@{\xy@{ENTRY "##3##1,##2"}{\Row=##1 \Col=##2\relax
+ \cfromid@{##3##1,##2}\pfromc@}}%
+ \edef\nextii@{\the\Row,\the\Col,\xymatrixprefix@@ @}%
+ \expandafter\next@\nextii@
+ \xyFN@\entry@@i}
+
+\xydef@\entry@@i{\let\next@=\entry@@norm
+ \ifoldxymatrix@\else \ifx *\next \DN@*{\xyFN@\entry@@star}\fi \fi
+ \next@}
+
+\xydef@\entry@@star{\ifx *\next \DN@*{\xyFN@\entry@@star@ii}%
+ \else \DN@##1##{\entry@@star@i{##1}}\fi \next@}
+
+\xydef@\entry@@star@i#1#2#3!@{%
+ \xy@@ix@{{#1}{#2}}\xy@@{\expandafter\dropentry@\the\toks9}%
+ \setboxz@h{\xyqall@
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@ \everyentry@ #3}%
+ \setbox\z@=\copy\voidb@x}
+
+\xydef@\entry@@star@ii{%
+ \ifx [\next
+ \DN@[##1]{\DN@####1{\def\entrymodifiers@{[##1]####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\entry@@norm}%]
+ \else
+ \DN@##1{\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\entry@@norm}%
+ \fi \next@}
+
+\xydef@\entry@@norm#1!@{%
+ \DN@##1{\expandafter\xy@@ix@
+ \expandafter{\expandafter{\entrymodifiers@}{##1}}}%
+ \expandafter\next@\expandafter{\everyentry@#1}%
+ \xy@@{\expandafter\dropentry@\the\toks9}%
+ \setbox\z@=\expandafter\object\entrymodifiers@{\xyqall@
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@ \everyentry@ #1}%
+ \setbox\z@=\copy\voidb@x}
+\DOCMODE)
+
+ Dropping the entry is just retypesetting it at the right location
+ again ignoring the \Xy-stuff:
+
+\DOCMODE(
+\xydef@\dropentry@#1#2{\drop@{#1}{\xyeatall@
+ \ifx\xymatrixsavedCOORD@\relax \let\xymatrixsavedCOORD@=\COORD@ \fi
+ \let\COORD@=\xymatrixCOORD@ #2}}
+\DOCMODE)
+
+ The macros used for queuing are these; only the toks9 replacement is
+ tricky; furthermore queueing is "not" done if we are saving because
+ the effect will give the same result without risk of extremely long
+ lines in the compiled file!
+
+\DOCMODE(
+\xydef@\xyqall@{%
+ \ifxysaving@ \let\xy@=\xyqs@ \let\xy@@ix@=\xysave@@toksix@
+ \else \let\xy@=\xyq@ \let\xy@@ix@=\xyq@@toksix@ \fi
+ \change@oxy@\xy@}
+
+\xydef@\xyq@#1#2{\addq@{#2}}
+
+\xydef@\xyq@@toksix@{\begingroup
+ \xyuncatcodes \afterassignment\xyq@@toksix@i \global\toks9=}
+
+\xydef@\xyq@@toksix@i{%
+ \DN@##1{\endgroup \xy@@{\global\toks9={##1}}}%
+ \expandafter\next@\expandafter{\the\toks9}}
+
+\xydef@\xyqs@{\global\advance\matrixsize@\@ne \xysave@}
+\DOCMODE)
+
+\paragraph*{Insert:}
+
+ Finally we insert the matrix in the \Xy-picture logically by ensuring
+ that it has the right size
+
+\DOCMODE(
+\xydef@\xymatrix@insert{%
+ \xy@@{\edef\nextii@{{\xy@minX@@}{\xy@maxX@@}{\xy@minY@@}{\xy@maxY@@}}%
+ \expandafter\xymatrix@insert@\nextii@}}
+
+\xydef@\xymatrix@insert@#1#2#3#4{\matrixorigin@
+ \L@c=+\X@c \advance\L@c-#1\relax
+ \R@c=-\X@c \advance\R@c+#2\relax
+ \D@c=+\Y@c \advance\D@c-#3\relax
+ \U@c=-\Y@c \advance\U@c+#4\relax
+ \Edge@c={\rectangleEdge}}
+\DOCMODE)
+
+ \TODO: Should handle other forms than reference point at center
+ of~|"1,1"| as hardcoded here. In particular reference point at
+ baseline of |"1,1"| would be useful\dots
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{New coordinate formats}
+??=[coord]
+%
+ It is possible within entries to refer to all the entries of the
+ \Xy-matrix using the following special <coord>inate forms:
+%
+\begin{defs}
+%
+ {}\kern-10pt|"|$r$|,|$c$|"|\kern5pt
+ & Position and extents of entry in row $r$, column $c$ (top left is
+ |"1,1"|)
+\cr
+ {}\kern-15pt|[|$\Delta r$|,|$\Delta c$|]|\kern10pt
+ & $\Delta r$ rows below, $\Delta c$ columns right of current entry
+\cr
+ {}\kern-15pt|[| <hop>\star\ |]|\kern10pt
+ & entry reached by <hop>s; each <hop> is one of |dulr| describing
+ one `move' to a neighbor entry
+\cr
+ {}\kern-15pt|[| <hop>\plus\ <place>\ |]|
+ & <place> on straight line to "non-empty" |[|<hop>\star|]|
+\cr
+\end{defs}
+\noindent\unskip
+%
+ So the current entry has the synonyms |[0,0]|, |[]|, |[rl]|, |[ud]|,
+ |[dudu]|, etc., as well as its `absolute' name |"|$r$|,|$c$|"|.
+
+ These forms are useful for defining diagrams where the entries are
+ related, \eg,
+%
+\begin{code}
+$$\xy
+\xymatrix{
+ A \POS[];[d]**\dir{~},
+ [];[dr]**\dir{-} \\
+ B & C \POS[];[l]**\dir{.} }
+\endxy$$
+\end{code}
+\docode
+%
+ was typeset by
+%
+\displaycode
+%
+ If an entry outside the \Xy-matrix is referenced then an error is
+ reported.
+
+ In case several matrices are used in the same diagram, and they refer
+ to each other, then it is useful to give the matrices different
+ |"|<prefix>|"| <setup> such that they can refer to each other using
+ the following special coordinate forms that all have the same meaning
+ except the target entry is picked from a particular matrix:
+%
+\begin{defs1}
+ |"|<prefix>$r$|,|$c$|"| \cr
+ |["|<prefix>|"|$\Delta r$|,|$\Delta c$|]| \cr
+ |["|<prefix>|"| <hop>\star\ |]| \cr
+ |["|<prefix>|"| <hop>\plus\ <place>\ |]| \cr
+\end{defs1}
+\noindent\unskip
+%
+ In fact absolute references "must" always be given using
+ |"|<prefix><row>|,|<col>|"|, "even inside the matrix itself".
+
+ Here is an example using this:
+%
+\begin{code}
+\xy
+ \xymatrix"*"{%
+ A & B \\
+ C & D }%
+ \POS*\frm{--}
+ \POS-(10,3)
+ \xymatrix{%
+ A' \ar@{.}["*"] & B' \ar@{.}["*"] \\
+ C' \ar@{.}["*"] & D' \ar@{.}["*"] }%
+ \POS*\frm{--}
+\endxy
+\end{code}
+$$\docode$$
+%
+ was typeset (using the `frame' extension and `arrow' feature) by
+%
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ These handle the parsing and interpretation of bracketed
+ <coord>inates; the number is computed already at parse time:
+
+\DOCMODE(
+\xylet@\thematrixCOORD@@=\relax
+\xylet@\thematrixprefix@@=\relax
+
+\xydef@\xymatrixCOORD@{%
+ \ifx [\next %]
+ \DN@[##1]{\xy@{[##1]}{\def\thematrixCOORD@@{[##1]}}%
+ \xyFN@\xymatrixCOORD@i##1]}%
+ \else \let\next@=\xymatrixsavedCOORD@ \fi \next@}
+
+\xydef@\xymatrixCOORD@i{\count@=\Row \count@@=\Col
+ \let\thematrixprefix@@=\xymatrixprefix@@
+ \ifcat A\noexpand\next
+ \DN@##1{\expandafter\notrelaxorelse@\csname xymatrixCOORD@i@##1\endcsname
+ \xymatrixCOORD@other}%[[
+ \else\ifx ]\next \DN@]{\xymatrixCOORD@x}%
+ \else\ifx "\next \DN@"##1"{\DN@{##1}\edef\thematrixprefix@@{\codeof\next@}%
+ \xyFN@\xymatrixCOORD@ii}%
+ \else \let\next@=\xymatrixCOORD@other \fi\fi\fi \next@}
+
+\xydef@\xymatrixCOORD@i@u{\advance\count@ \m@ne\xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@i@d{\advance\count@ \@ne \xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@i@l{\advance\count@@\m@ne\xyFN@\xymatrixCOORD@ii}
+\xydef@\xymatrixCOORD@i@r{\advance\count@@\@ne \xyFN@\xymatrixCOORD@ii}
+
+\xydef@\xymatrixCOORD@ii{%
+ \ifcat A\noexpand\next
+ \DN@##1{\expandafter\notrelaxorelse@\csname xymatrixCOORD@i@##1\endcsname
+ \xymatrixCOORD@error}%
+ \else\ifx ]\next \DN@]{\xymatrixCOORD@x}%
+ \else \let\next@=\xymatrixCOORD@xx \fi\fi \next@}
+
+\xydef@\xymatrixCOORD@error#1{\DN@{#1}%
+ \xyerror@{illegal <coord> (\codeof\next@): illegal [...] target form}{}%
+ \xyFN@\xymatrixCOORD@ii}
+
+\xydef@\xymatrixCOORD@other#1,#2]{%
+ \advance\count@#1\advance\count@@#2\xymatrixCOORD@x}
+\DOCMODE)
+
+ The next does the actual lookup at \Xy-time where we can still print
+ an error message using the saved original form.
+
+\DOCMODE(
+\xydef@\xymatrixCOORD@x{%
+ \DN@##1{\xy@@{%
+ \expandafter\let\expandafter\next@\csname Q@##1\endcsname
+ \ifx\next@\relax \xyerror@RC{##1}\else \next@ \fi}%
+ \afterCOORD@}%
+ \edef\nextii@{{\thematrixprefix@@\the\count@,\the\count@@}}%
+ \expandafter\next@\nextii@}
+
+\xydef@\xymatrixCOORD@xx{%
+ \DN@##1{\xy@@{%
+ \expandafter\let\expandafter\next@\csname Q@##1\endcsname
+ \ifx\next@\relax \xyerror@RC{##1}\else \next@\no@@ \fi}%
+ \afterPLACE\xymatrixCOORD@after}%
+ \edef\nextii@{{\thematrixprefix@@\the\count@,\the\count@@}}%
+ \expandafter\next@\nextii@}
+
+\xydef@\xymatrixCOORD@after{%
+ \ifx ]\next \DN@]{\afterCOORD@}%
+ \else \let\next@=\xymatrixCOORD@error \fi \next@}
+
+\xydef@\xyerror@RC#1{\xyerror@{in entry \string"\the\Row,\the\Col\string":
+ No \codeof\thematrixCOORD@@\space(is \string"#1\string") from here}{}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Spacing and rotation}
+??=[spacing]
+%
+ Any matrix can have its ??w![spacing]??w[matrix spacing] and
+ ??w![orientation]??w[matrix orientation] changed by adding <setup>
+ `switches' between |\xymatrix| and the opening |{|.
+
+ The default spacing between entries of matrix is changed with the
+ switches
+%
+\begin{defs1}
+ ??c![@R]<add~op> <dimen> \cr
+ ??c![@C]<add~op> <dimen> \cr
+ ??c![@] <add~op> <dimen> \cr
+\end{defs1}
+\noindent\unskip
+%
+ that change ??w![row spacing], ??w![column spacing], and both,
+ respectively, as indicated by the <add~op> and <dimen>, where the
+ <dimen> may be omitted and can be given as one of |R| and |C| to
+ indicate the current value of the parameter in question. \NOTE: there
+ is "no default".
+
+ In addition, \Xy-pic can be instructed to use a `??w![fixed grid]'
+ for the matrix with the switches
+%
+\begin{defs1}
+ ??c![@!R] \cr
+ ??c![@!C] \cr
+ ??c![@!]
+\end{defs1}
+\noindent\unskip
+%
+ that ensure that the row spacing, column spacing, and both,
+ respectively, pretending that "all" entries have the size of the
+ largest entry (without modifying the real size of the entries, of
+ course, only the spacing -- to get the entries to "really" have the
+ same size use a |@*|\dots\ <setup> described in \S??[entries]
+ below). The special variants
+%
+\begin{defs1}
+ ??c![@!0] \cr
+ ??c![@!=]<dimen>
+\end{defs1}
+\noindent\unskip
+%
+ pretend that entries have zero or <dimen> height and width for
+ computing row and column spacing; as above inserting |R| or |C| just
+ after the |!| makes this affect only the row "or" column spacing,
+ \eg, |@!R0| means that the row spacing only is between the centers of
+ the rows.
+
+ Finally, the spacing of things that are typeset can be adjusted
+ separately:
+%
+\begin{defs1}
+ ??c![@M]<add~op> <dimen> \cr
+ ??c![@W]<add~op> <dimen> \cr
+ ??c![@H]<add~op> <dimen> \cr
+ ??c![@L]<add~op> <dimen>
+\end{defs1}
+\noindent\unskip
+%
+ will adjust the ??w![entry margin], ??w![entry width], ??w![entry
+ height], and ??w![label separation] used (the latter is actually
+ passed to the arrow feature).
+
+\DOCMODE(
+\xylet@\xymatrix@addop@@=\relax
+
+\xydef@\xymatrix@at{\def\xymatrix@addop@@{\xymatrix@R\xymatrix@C}%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@at}%gobble spaces
+ \else\ifx !\next \DN@!{\xyFN@\xymatrix@fix}%
+ \else\addPLUS@\ifx \next \let\next@=\xymatrix@addop
+ \else\addDASH@\ifx \next \let\next@=\xymatrix@addop
+ \else\addEQ@\ifx \next \let\next@=\xymatrix@addop
+ \else\ifx 1\next \DN@1{\def\everyentry@{\vphantom(}%)
+ \let\objectmargin@=\p@ \xyFN@\xymatrix@setup}%
+ \else\ifx R\next \def\xymatrix@addop@@{\xymatrix@R}\DN@ R{\xymatrix@addop}%
+ \else\ifx C\next \def\xymatrix@addop@@{\xymatrix@C}\DN@ C{\xymatrix@addop}%
+ \else\ifx M\next \def\xymatrix@addop@@{\xymatrix@M}\DN@ M{\xymatrix@addop}%
+ \else\ifx L\next \def\xymatrix@addop@@{\xymatrix@L}\DN@ L{\xymatrix@addop}%
+ \else\ifx H\next \def\xymatrix@addop@@{\xymatrix@H}\DN@ H{\xymatrix@addop}%
+ \else\ifx W\next \def\xymatrix@addop@@{\xymatrix@W}\DN@ W{\xymatrix@addop}%
+ \else\ifx *\next \DN@*{\xyFN@\xymatrix@mods}%
+ \else \DN@{\afterDIRECTIONorEMPTY
+ {\xymatrix@rotation \xyFN@\xymatrix@setup}{%
+ \xyerror@{<addop> or <direction> or one of RCMLHW*! expected}{}%
+ \xyFN@\xymatrix@setup}}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\xymatrix@fix{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@fix}%gobble spaces
+ \else\ifx R\next \let\mkHrow@=\Hrow@max \DN@ R{\xyFN@\xymatrix@fix@}%
+ \else\ifx C\next \let\mkWcol@=\Wcol@max \DN@ C{\xyFN@\xymatrix@fix@}%
+ \else \let\mkHrow@=\Hrow@HWmax \let\mkWcol@=\Wcol@HWmax
+ \let\next@=\xymatrix@fix@
+ \fi\fi\fi \next@}
+
+\xydef@\xymatrix@fix@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@fix@}%gobble spaces
+ \else\ifx 0\next \def\mkHWmax@{\HWmax@set\z@}\DN@ 0{\xyFN@\xymatrix@setup}%
+ \else\addEQ@\ifx\next \addEQ@\DN@{\afterassignment\xymatrix@fix@x\dimen@ii=}%
+ \else \let\mkHWmax@=\HWmax@max \let\next@=\xymatrix@setup \fi\fi\fi \next@}
+
+\xydef@\xymatrix@fix@x{%
+ \edef\mkHWmax@{\noexpand\HWmax@set{\the\dimen@ii}}\xyFN@\xymatrix@setup}
+
+\xydef@\xymatrix@addop{\afterADDOP{\xyFN@\xymatrix@addop@}}
+\xydef@\xymatrix@addop@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@addop@}%gobble spaces
+ \else\ifx R\next \DN@ R{\xy@{R}{}\dimen@ii=\xymatrixrowsep@\xymatrix@addop@x}%
+ \else\ifx C\next \DN@ C{\xy@{C}{}\dimen@ii=\xymatrixcolsep@\xymatrix@addop@x}%
+ \else \DN@{\afterassignment\xymatrix@addop@x\dimen@ii=}\fi\fi\fi \next@}
+
+\xydef@\xymatrix@addop@x{\expandafter\xy@\expandafter{\the\dimen@ii}{}%
+ \xymatrix@addop@@ \xyFN@\xymatrix@setup}
+
+\xydef@\xymatrix@R{\Addop@@\xymatrixrowsep@\dimen@ii}
+\xydef@\xymatrix@C{\Addop@@\xymatrixcolsep@\dimen@ii}
+
+\xydef@\xymatrix@M{\Addop@@\objectmargin@\dimen@ii}
+\xydef@\xymatrix@L{\Addop@@\labelmargin@\dimen@ii}
+
+\xydef@\xymatrix@H{\Addop@@\objectheight@\dimen@ii}
+\xydef@\xymatrix@W{\Addop@@\objectwidth@\dimen@ii}
+\DOCMODE)
+
+ The spacing can also be changed for en entire \TeX\ group by the
+ declarations
+%
+\begin{defs1}
+ |\xymatrixrowsep| <add~op> |{|<dimen>|}| \cr
+ |\xymatrixcolsep| <add~op> |{|<dimen>|}| \cr
+\end{defs1}
+\noindent\unskip
+%
+ The default spacing for both is |2pc|.
+
+\DOCMODE(
+\xydef@\xymatrixrowsep@{2pc}
+\xydef@\xymatrixcolsep@{2pc}
+
+\xydef@\xymatrixrowsep{\afterADDOP{\Addop@@\xymatrixrowsep@}}
+\xydef@\xymatrixcolsep{\afterADDOP{\Addop@@\xymatrixcolsep@}}
+\DOCMODE)
+%
+ \TODO: optimize processing of matrices with constant grid.
+
+ An entire matrix can be rotated by adding a rotation <setup> of the
+ form
+%
+\begin{defs1}
+ |@|<direction> \cr
+\end{defs1}
+\noindent\unskip
+%
+ This will set the orientation of the rows to <direction> (the default
+ corresponds to |r|, \ie, rows are oriented left to right).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The code is the first procedure of the main matrix code above
+ (??_[rotation]); factors are used by |\pre@emit|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Entries}
+??=[entries]
+%
+ The appearance of a single entry can be modified by entering it as
+%
+\begin{defs1}
+??c![*] <object> <pos> <decor>
+\end{defs1}
+\noindent\unskip
+%
+ This makes the particular entry ignore the entry modifiers and
+ typeset as a kernel object with the same reference point as the
+ (center of) the default object would have had.
+
+ Additional object <modifier>s may be added to an otherwise ordinary
+ entry by using the forms
+%
+\begin{defs1}
+??c![**]|[|<shape>|]| <entry> \cr
+%|**| <add~op> <size> \cr
+|**{|<modifier>*|}| <entry> \cr
+\end{defs1}
+\noindent\unskip
+%
+ The first sets the default <shape> for objects
+ (\cf~note~??g[xy.doc:<shape>]), the second a default size (change,
+ \cf~note~??g[xy.doc:<object> size]), and the last makes it possible
+ to add any <object> modifier of~\S??g[xy.doc:object], \eg, for
+ recentering entries after the ??w![default entry] form which is
+ equivalent to `|!C| |+<|$2\times"object"\-"margin"$|>|' (with the
+ effect of centering the object and add the "object"\-"margin") to all
+ sides.
+
+\begin{exercise}
+ Typeset the following diagram:
+%
+\begin{code}
+\xymatrix @!=1pc {
+ **[l] A\times B
+ \ar[r]^{/A} \ar[d]_{/B}
+ & B \ar[d]^{\times A}
+\\
+ A \ar[r]_{B\times}
+ & **[r] B\times A
+}
+\end{code}
+$$\docode$$
+%
+\answercode
+\answertext{The author did \displaycode}
+\end{exercise}
+
+ It is also possible to use these |@|<setup>s (as usual between
+ |\xymatrix| and the leading |{|):
+%
+\begin{defs1}
+??c![@*]|[|<shape>|]| \cr
+|@*| <add~op> <size> \cr
+\end{defs1}
+\noindent\unskip
+%
+ which are equivalent to changing all entries to behave as if they had
+ started with the similar |**|-form. \TODO: Allow |**|<add~op><size>
+ <entry> for entries.
+
+ If the default set of entry modifiers should be changed then the
+ following declaration must be issued before the |\xymatrix| command;
+ this is the only way to actually switch the initial default centering
+ and spacing off:
+%
+\begin{defs1}
+??c![\entrymodifiers]|={| <modifier>\star\ |}|
+\end{defs1}
+
+\begin{exercise}
+ How did the author typeset the following matrix?
+%
+\begin{code}
+\entrymodifiers={=<1pc>[o][F-]}
+\xymatrix @ur {
+ A \save[];[r] **\dir{-},
+ [];[dr]**\dir{-},
+ [];[d] **\dir{-}\restore
+ & B \\
+ C & D }
+\end{code}
+$$\docode$$
+%
+\answercode
+\answertext{Modifiers are used to make all entries round with a frame -- the
+ general form is used to ensure that the sequence is well-defined.
+ Finally the matrix is rotated to make it possible to enter it as a
+ simple square: \displaycode}
+\end{exercise}
+
+ \BUG: The four constructions |@*[|\dots|]|, |**[|\dots|]|, |@*|
+ <add~op> <size>, and, |**{|\dots|}|, "accumulate in reverse order".
+ Only entries starting with a single |*| completely override the
+ modifiers <setup> with a |@*|-construction.
+
+\DOCMODE(
+\xydef@\xymatrix@mods{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xymatrix@mods}%gobble spaces
+ \else\ifx [\next
+ \DN@ [##1]{\xy@{[##1]}{}\DN@####1{\def\entrymodifiers@{[##1]####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\xyFN@\xymatrix@setup}%]
+ \else\addPLUS@\ifx \next \DN@##1{\DNii@{##1}\xyFN@\xymatrix@change}%
+ \else\addDASH@\ifx \next \DN@##1{\DNii@{##1}\xyFN@\xymatrix@change}%
+ \else\addEQ@\ifx \next \DN@##1{\DNii@{##1}\xymatrix@set}%
+ \else \let\next@=\xymatrix@mods@error \fi\fi\fi\fi\fi \next@}
+
+\xydef@\xymatrix@set{%
+ \begingroup \plainxy@
+ \afterVECTORorEMPTY\xymatrix@mods@x\xymatrix@mods@error}
+
+\xydef@\xymatrix@change{%
+ \addEQ@\ifx\next \DN@##1{\expandafter\DNii@\expandafter{\nextii@##1}%
+ \expandafter\xy@\expandafter{\nextii@}{}\begingroup \plainxy@
+ \afterVECTORorEMPTY\xymatrix@mods@x\xymatrix@mods@xx}%
+ \else \DN@{\expandafter\xy@\expandafter{\nextii@}{}\begingroup \plainxy@
+ \afterVECTORorEMPTY\xymatrix@mods@x\xymatrix@mods@xx}\fi
+ \next@}
+
+\xydef@\xymatrix@mods@x{\expandafter\xy@\expandafter{\nextii@}{}%
+ \def\next@##1##2##3{\def\nextii@####1{##1##2####1##3}}%
+ \addGT@{\addLT@{\expandafter\next@\expandafter{\nextii@}}}%
+ \DN@##1{\gdef\tmp@@@{{##1}}}%
+ \edef\nextiii@{{\the\X@c,\the\Y@c}}%
+ \expandafter\expandafter\expandafter\next@
+ \expandafter\expandafter\expandafter{\expandafter\nextii@\nextiii@}%
+ \endgroup
+ \DN@##1{\xy@{##1}{}\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\xyFN@\xymatrix@setup}%
+ \expandafter\next@\tmp@@@}
+
+\xydef@\xymatrix@mods@xx{\expandafter\xy@\expandafter{\nextii@}{}%
+ \expandafter\gdef\expandafter\tmp@@@\expandafter{\expandafter{\nextii@}}%
+ \endgroup
+ \DN@##1{\xy@{##1}{}\DN@####1{\def\entrymodifiers@{##1####1}}%
+ \expandafter\next@\expandafter{\entrymodifiers@}\xyFN@\xymatrix@setup}%
+ \expandafter\next@\tmp@@@}
+
+\xydef@\xymatrix@mods@error{\endgroup
+ \xyerror@{Impossible @*<addop><size> <setup>.}{}\xyFN@\xymatrix@setup}
+
+\xywarnifdefined\entrymodifiers
+\expandafter\def\addEQ@\entrymodifiers#1{\def\entrymodifiers@{#1}\ignorespaces}
+
+\xydef@\entrymodifiers@{\entrybox}
+
+\xydef@\entrybox#1{\hbox{\setbox\z@=\objectbox{#1}%
+ \L@p=\wdz@ \D@p=\ht\z@ \advance\D@p\dp\z@
+ \dimen@=\objectwidth@ \advance\dimen@-\L@p
+ \ifdim\dimen@>\z@ \advance\L@p\dimen@ \R@p=.5\dimen@ \else \R@p=\z@ \fi
+ \dimen@=\objectheight@ \advance\dimen@-\D@p
+ \ifdim\dimen@>\z@ \advance\D@p\dimen@ \fi
+ \dimen@=\objectmargin@ \advance\L@p2\dimen@ \advance\D@p2\dimen@
+ \U@p=-.5\ht\z@ \advance\U@p.5\dp\z@ \advance\R@p\objectmargin@
+ \setboxz@h{\kern\R@p \raise\U@p\boxz@}%
+ \wdz@=\L@p \ht\z@=.5\D@p \dp\z@=.5\D@p \boxz@}}
+\DOCMODE)
+
+ Finally, the following is specially suited for `one-line' matrices
+ included in text:
+%
+\begin{defs1}
+??c![@1] \cr
+\end{defs1}
+\noindent\unskip
+%
+ will insert a `math strut' (|\vphantom(|) into each entry to make its
+ centering appropriate for text.
+
+ This is just an abbreviation using the following declaration which
+ will setup <decor> that should be inserted before everything else in
+ each entry. Initially it is empty but
+%
+\begin{defs1}
+??c![\everyentry]|={| <decor> |}|
+\end{defs1}
+\noindent\unskip
+%
+ will insert <decor> first in each entry; inside the counter registers
+ ??c![\Row] and ??c![\Col] are set to the current entry's row and
+ column, respectively. For example,
+%
+\begin{code}
+\everyentry={{\the\Row,\the\Col}}
+\xymatrix @*[F]@*[o] {
+ {} \POS[];[r]**\dir{..} & \\
+ {} \POS[];[ur]**\dir{--}
+}
+\end{code}
+\displaycode
+\noindent\unskip
+%
+ will typeset
+%
+$$\docode$$
+
+\DOCMODE(
+\xywarnifdefined\everyentry
+\expandafter\def\addEQ@\everyentry#1{\def\everyentry@{#1}\ignorespaces}
+
+\xylet@\everyentry@=\empty
+\DOCMODE)
+
+ \noindent\NOTE: When using compilation, changes to |\everyentry| and
+ |\entrymodifiers| will "not" result in recompilation even when the
+ constructed matrix changes -- you may have to remove the |.xyc| file
+ manually.
+
+\begin{exercise}
+ How did the author typeset the following diagram?
+%
+\begin{code}
+\xymatrix @W=3pc @H=1pc @R=0pc @*[F-] {%
+ : \save+<-4pc,1pc>*\hbox{\it root}
+ \ar[]
+ \restore
+\\
+ {\bullet}
+ \save*{}
+ \ar`r[dd]+/r4pc/`[dd][dd]
+ \restore
+\\
+ {\bullet}
+ \save*{}
+ \ar`r[d]+/r3pc/`[d]+/d2pc/
+ `[uu]+/l3pc/`[uu][uu]
+ \restore
+\\
+ 1 }
+\end{code}
+$$\docode$$
+%
+ "Hints": The arrow feature was used to make the bending arrows and
+ the frame extension for the frames around each cell.
+%
+\answercode
+\answertext{Here is how: \displaycode}
+\end{exercise}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection*{End \& log}
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xymatrix.doc,v $
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/06 02:56:02 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.9 1994/06/09 15:02:49 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% NEW for version 2.7 extracted from diagram code in xypic.doc 2.6.1.1.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs how we are formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% LaTeX-indent-level:1
+% TeX-brace-indent-level:1
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xymovie.doc b/Master/texmf-dist/source/generic/xypic/xymovie.doc
new file mode 100644
index 00000000000..a2b891243d4
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xymovie.doc
@@ -0,0 +1,161 @@
+%% $Id: xymovie.doc,v 3.5 1997/05/28 13:05:01 krisrose Exp $
+%%
+%% Xy-pic ``Movie Storyboard extension'' option.
+%% Copyright (c) 1996-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{movie}{Movie Storyboard extension}{\stripRCS$Revision: 3.5 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This extension interprets the ??c![\scene] primitive of the
+ ??c![movie] class, setting the progress indicators to dummy values.
+ The following assumes that your are familiar with the |movie| class.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The size of the frame is determined by the command
+%
+\begin{defs1}
+??c![\MovieSetup]|{width=|"width"|,height=|"height"|,|\dots|}|
+\end{defs1}
+\noindent\unskip
+%
+ (the \dots\ indicate the other arguments required by the |movie|
+ class but silently ignored by the \Xy-pic |movie| extension).
+
+ \NOTE: This extension still experimental and subject to change. The
+ only documentation is in the |movie.cls| source file.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The implementation mimics the aspects of the |keyval| package needed
+ here, namely reading the ??c![height] and ??c![width] parameters.
+
+\DOCMODE(
+\xynew@{dimen}\m@height
+\xynew@{dimen}\m@width
+
+\xydef@\extractparameterm@#1#2#3{%
+ \DN@##1,#1=##2,##3@{\csname m@#1\endcsname=##2\relax}%
+ \next@,#2,#3,@}
+
+\xydef@\MovieSetup#1{%
+ \extractparameterm@{height}{#1}{height=2in}%
+ \extractparameterm@{width}{#1}{width=2in}%
+}
+\DOCMODE)
+
+ The progress macros all default to
+
+\DOCMODE(
+\xydef@\theScene{0}
+\xydef@\theF{0}
+\xydef@\theFr{1}
+\xydef@\F#1{#1(0)}
+\xydef@\Fr#1{#1(1)}
+\DOCMODE)
+
+ We need to interpret and ignore the arguments to |\scene| except the
+ |*| which is used on the last scene since this means that we should
+ output the scene with progress values corresponding to ``The End''.
+
+\DOCMODE(
+\xynew@{if}\iflastframe@
+\xynew@{count}\m@scene
+
+\xydef@\scene{\advance\m@scene\@ne
+ \DN@{\ifx*\next \lastframe@true \DN@*{\xyFN@\scene@}%
+ \else \let\next@=\scene@ \fi \next@}%
+ \xyFN@\next@}
+
+\xydef@\scene@{%
+ \ifx[\next \DN@[##1]{\scene@i}\else \let\next@=\scene@i \fi \next@}
+
+\long\def\scene@i#1{{%
+%
+ \def\caption##1{\gdef\m@caption{Scene \the\m@scene. ##1}}%
+ \edef\theScene{\the\m@scene}%
+ \def\theF{0}\def\theFr{1}%
+ \def\F##1{##1(0)}\def\Fr##1{##1(1)}%
+ \scene@frame{#1}%
+%
+ \iflastframe@
+ \def\caption##1{}%
+ \gdef\m@caption{The End.}%
+ \def\theF{1}\def\theFr{0}%
+ \def\F##1{##1(1)}\def\Fr##1{##1(0)}%
+ \scene@frame{#1}%
+ \fi
+ }\ignorespaces}
+
+\def\scene@frame#1{\vbox{\null
+ \dimen@=\m@width \advance\dimen@2\xydashw@
+ \hrule width\dimen@
+ \hbox to\dimen@{\vrule width\xydashw@ \hss
+ \vbox to\m@height{\hsize=\m@width \null\vfil{#1}\vfil\null}%
+ \hss \vrule width\xydashw@}%
+ \hrule width\dimen@
+ \setbox0=\hbox{%
+ \setbox0=\hbox to\m@width{\hss\strut \m@caption\hss}%
+ \dimen0=\dp0 \ht0=0pt \dp0=0pt \raise\dimen0\box0}%
+ \ht0=0pt \dp0=0pt \box0\relax
+ \null}}
+\DOCMODE)
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xymovie.doc,v $
+% Revision 3.5 1997/05/28 13:05:01 krisrose
+% Fixed missing breaks bug.
+%
+% Revision 3.4 1997/05/18 02:37:17 krisrose
+% Fits movie.cls 3.4...still experimental.
+%
+% Revision 1.1 1997/05/18 01:22:10 krisrose
+% Initial revision
+%
+% NEW for version 3.4.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs how we are formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% TeX-parse-self:nil
+% LaTeX-indent-level:1
+% TeX-brace-indent-level:1
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xynecula.doc b/Master/texmf-dist/source/generic/xypic/xynecula.doc
new file mode 100644
index 00000000000..2185441aa29
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xynecula.doc
@@ -0,0 +1,594 @@
+%% $Id$
+%%
+%% Xy-pic ``Necula extensions'' option.
+%% Copyright (c) 1998 George C. Necula <necula@cs.cmu.edu>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1998 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{necula}{Necula's extensions}{\stripRCS$Revision: 0.0 $}%
+ {George C. Necula}{necula@cs.cmu.edu}%
+ {School of Computer Science,
+ Carnegie Mellon University,
+ 5000 Forbes Avenue,
+ Pittsburgh, PA 15213-3891, USA}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This option contains two extensions of the \Xy-pic kernel: A way to
+ expand \TeX\ macros in object <modifier>s, and a way to specify
+ arbitrary polygons as the <shape> of an object.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Expansion}
+
+ The special syntax ??c![e|]<macros>|||| is introduced in
+ an object ??w![<modifier>]s and ??w![<coord>]inates. It
+ expands the given \TeX\ <macros> (with |\edef|) before
+ reinterpretation as a <modifier> of <coord>, respectively.
+
+\DOCMODE(
+\def\expandbeforenext@#1{%
+ \DN@ e|##1|{\edef\tmp@{##1}\expandafter\xyFN@\expandafter#1\tmp@}%
+}
+
+\xylet@\xy@oldOBJECT@=\OBJECT@
+\xydef@\xy@newOBJECT@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xy@newOBJECT@}%gobble spaces
+ \else\ifx e\next
+ \expandbeforenext@\OBJECT@
+ \else
+ \DN@{\xy@oldOBJECT@}\fi\fi
+ \next@}%
+\let\OBJECT@=\xy@newOBJECT@
+
+\xylet@\xy@oldCOORD@=\COORD@
+\xydef@\xy@newCOORD@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xy@newCOORD@}%gobble spaces
+ \else\ifx e\next
+ \expandbeforenext@\COORD@
+ \else
+ \DN@{\xy@oldCOORD@}\fi\fi
+ \next@}%
+\let\COORD@=\xy@newCOORD@
+\DOCMODE)
+
+ This code may become part of the \Xy-pic kernel at a certain point.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Polygon shapes}
+
+ A polygon <shape> is specified as
+%
+\begin{defs1}
+%
+ ??c![[P:]<pos>|,|\dots|,|<pos>|]|
+%
+\end{defs1}
+\noindent\unskip
+%
+ where |[P:|$p_1$|,|\dots|,|$p_n$|]| denotes the shape obtained by
+ tracking the edge with each $p_i$ a position relative to the object
+ reference point. <vector>s and <corner>s can be used
+ directly; otherwise use |-p| to get the relative position.
+
+ \NOTE: Do not use |{}| or |[]| in the <pos>itions.
+
+ \BUG: The algorithm assumes that the reference point is always inside
+ the polygon.
+
+ It is possible to frame polygons is also possible.
+
+\DOCMODE(
+% Define the polygon as a stylechar so that it is deferred
+\xydefcsname@{*stylechar@P@}#1{\Pshape@#1@}
+\xynew@{count}\c@poly@count \c@poly@count=\z@ % Polygon identifiers
+
+\xydef@\Pshape@:#1@{% Strip the mandatory :
+ \addtotoks@{%
+% \xy@showthe c{Before parse}\xy@showthe p{Before parse}%
+% \xy@showdim{Before parse}%
+ \def\poly@list{@}%
+ \poly@parse #1,\relax,%Sets the poly@list
+ \def\poly@cache{}%
+ \edef\poly@id{\the\c@poly@count}%
+ \global\advance\c@poly@count\@ne
+ \poly@setEdge
+ % Save the old values of Lc for shifting
+ \edef\poly@saveLcshape{\the\L@c}%
+ \polygonEdge@Outer% Set U,R,D,L
+ \poly@setEdge
+ % Now shift the object to keep it centered
+ \dimen@=\poly@saveLcshape\advance\dimen@-\L@c
+ \advance\R@p -\dimen@
+% \xy@showthe c{After parse}%
+}}
+
+% Set the edge
+% A polygonal edge is represented as \polygonEdge x1,y1;x2,y2;...;xn,yn@id@
+% where xi,yi define the vertices of the polygonal edge as displacement from
+% the object reference point (xn=x1,yn=y1), and id is a numerical id used for
+% caching the result of the last intersection operation. The cached values for
+% polygon id are stored in the global macro poly@cache<id>.
+\xydef@\poly@setEdge{\expandafter\poly@setEdge@\poly@list\poly@id}
+\xydef@\poly@setEdge@#1@#2{\Edge@c={\polygonEdge#1@#2@}%
+ \expandafter\xdef\csname poly@cache#2%
+ \endcsname{\poly@cache}}
+
+% Define the polygon framing operations
+\xydefcsname@{frm[P]{-}}{\expandafter\draw@polyframe\the\Edge@c{-}}
+\xydefcsname@{frm[P]{.}}{\expandafter\draw@polyframe\the\Edge@c{.}}
+\xydefcsname@{frm[P]{=}}{\expandafter\draw@polyframe\the\Edge@c{=}}
+
+
+\xydef@\draw@polyframe\polygonEdge#1@#2@#3{%
+ \def\poly@dir{#3}%
+ \def\poly@list{#1@}%
+ \def\poly@id{#2}%
+ \edef\poly@cache{\csname poly@cache\poly@id\endcsname}%
+ \draw@polygon}
+
+% A polygon is maintained as a list of relative positions, as follows:
+% poly@list = Xdimen_0,Ydimen_0;...;Xdimen_n,Ydimen_n @
+% The list is closed, i.e., the first and last element coincide
+% Each polygon has an id storred in \poly@id
+% Each polygon caches the result of the last intersection operation
+% as d@x,d@y,x1,y1,x2,y2 where the first two values define the slope
+% and the two sets of points are the two intersection points
+% These values are storred in \poly@cache<id>.
+%
+%
+% Helper function for dealing with polygon lists
+
+% Map over a polygon list. Make sure you define
+% \let\poly@map@next=\poly@map before. Then, you can define
+% \let\poly@map@next=\poly@map@stop if you want to stop the traversal
+
+\xydef@\poly@empty{}
+\xydef@\poly@map#1#2,#3;#4@{%
+ #1{#2}{#3}%
+ \def\tmp@{#4}%
+ \ifx \poly@empty\tmp@ \else
+ \poly@map@next#1#4@%
+ \fi
+}
+
+\xydef@\poly@map@stop#1@{}
+
+\xydef@\poly@mapExpand#1#2{%
+ \edef\tmp@{\noexpand\poly@map\noexpand #1#2}%
+ \tmp@}
+
+% Parse a polygon definition
+
+\xydef@\poly@parse #1,{%
+ \ifx #1\relax %Done. Copy the head of the list at its end
+ \poly@close
+ \let\next@=\relax
+ \else
+ % Save everything
+ \save@
+ % Process the position using POS
+ \POS #1%
+ % Now add the new c to the list
+ \edef\tmp@{{\the\X@c}{\the\Y@c}}%
+ \expandafter\poly@append\tmp@
+ \restore
+ \let\next@=\poly@parse % continue parsing
+ \fi
+ \next@
+}
+ % Append to the list of polygon points
+\xydef@\poly@append#1#2{\expandafter\poly@append@\poly@list{#1,#2;}}
+\xydef@\poly@append@#1@#2{\global\def\poly@list{#1#2@}}
+
+ % Close the polygon
+\xydef@\poly@close{\expandafter\poly@close@\poly@list}
+\xydef@\poly@close@#1,#2;#3@{\poly@append{#1}{#2}}
+
+% Draw a polygon at the current location
+
+\xydef@\draw@polygon{% First separate the head
+% \W@{Drawing polygon \poly@list}\xy@showthe c{ Centered at}%
+ \save@
+ % Set the origin to point at the reference point
+ \X@origin=\X@c \Y@origin=\Y@c
+ \poly@setp % Set p at the beginning of the polygon and set poly@rest
+ % Zero the edges
+ \U@c=\z@\R@c=\z@\D@c=\z@\L@c=\z@\U@p=\z@\R@p=\z@\D@p=\z@\L@p=\z@
+ \Edge@c={\zeroEdge}\Edge@p={\zeroEdge}%
+ \let\poly@map@next=\poly@map
+ \poly@mapExpand\poly@drawseg\poly@rest
+ \restore
+}
+
+ % Set p to the first element. Requires the origin to be
+ % at the reference point
+\xydef@\poly@setp{\expandafter\poly@setp@\poly@list}
+\xydef@\poly@setp@#1,#2;#3@{%
+ \X@p=#1\advance\X@p\X@origin \Y@p=#2\advance\Y@p\Y@origin%
+ \global\def\poly@rest{#3@}}
+
+\xydef@\poly@drawseg#1#2{%
+ \dimen@=#1\X@c=\the\dimen@\advance\X@c \X@origin
+ \dimen@=#2\Y@c=\the\dimen@\advance\Y@c \Y@origin
+% \W@{Next segment is at offset #1,#2 and absolute \the\X@c,\the\Y@c}%
+ \expandafter\connect@\expandafter\dir\poly@dir%
+ \X@p=\X@c\Y@p=\Y@c}
+
+% Polygonal edge
+% Requires c to be the reference point
+\xydef@\polygonEdge#1@#2@#3{%
+ \def\poly@list{#1@}%
+ \def\poly@id{#2}%
+ \edef\poly@cache{\csname poly@cache\poly@id\endcsname}%
+ \ifcase#3\relax
+ \DN@{\polygonEdge@Inters
+% \ifpoly@badinters
+% \xyerror@{Could not find intersection for polygon}\fi
+ }%0
+ \or \DN@{\polygonEdge@Under}%1
+ \or \DN@{\polygonEdge@Dist}%2
+ \or \DN@{\rectangleProp@}%3 I do not understand Prop!
+ \or \DN@{\polygonEdge@Inner}%4
+ \or \DN@{\polygonEdge@Outer}%5
+ \else \DN@{}\fi
+ \next@}
+
+
+\newif\ifpoly@badinters
+
+\xydef@\polygonEdge@Inters{%
+% \W@{Edge intersection with (\the\X@c, \the\Y@c) -> (\the\X@p,\the\Y@p)}%
+% \W@{ for polygon: \poly@id}%
+% \W@{ with list: \poly@list}%
+% \W@{ with cache: \poly@cache}%
+ % Check the cache first
+ \ifx\poly@cache\poly@empty
+ \poly@intersdoit
+ \else
+ \expandafter\poly@intersprobecache\poly@cache @%
+ \fi
+% \xy@showthe c{Inters res}%
+}
+
+%
+% Redefine poly@cachehit to poly@cachehitdisable to diable polygon caching
+\xydef@\poly@cachehit#1#2{%
+% \W@{ intersection point found in cache}%
+ \X@c=#1\Y@c=#2}
+
+\xydef@\poly@cachehitdisable#1#2{\poly@intersdoit}
+%\let\poly@cachehit=\poly@cachehitdiasable% Uncomment this line to disable $
+
+
+% Probes the cache
+%
+\xydef@\poly@intersprobecache#1,#2,#3,#4,#5@{%
+ \dimen@=#1\advance\dimen@-\d@X
+ \ifdim\zz@\dimen@
+ \dimen@=#2\advance\dimen@-\d@Y
+ \ifdim\zz@\dimen@
+ \poly@cachehit{#3}{#4}
+ \else
+ \poly@intersdoit
+ \fi
+ \else
+ \poly@intersdoit
+ \fi
+}
+
+
+% Computes the intersection between the line cp and the edge.
+% Both intersection points are stored in the cache, the one in the
+% direction towards p first.
+\xydef@\poly@intersdoit{%
+% \W@{ intersection not in cache. Computing it}%
+ % Save A@ and B@ because we cannot change them
+ \edef\polyoldA@{\the\A@}\edef\polyoldB@{\the\B@}%
+ % Initialize the intersection points
+ \def\poly@intersneg{}\def\poly@interspos{}%
+ \save@
+ \poly@setorigin % Set origin at the beginning of the polygon and
+ % set poly@rest
+ \def\zeroDivide@{\poly@badinterstrue}% Handle the division by zero except.
+ \let\poly@map@next=\poly@map
+ \poly@mapExpand\poly@interseg\poly@rest
+ \ifx\poly@intersneg\poly@empty
+ \poly@badinterstrue
+ \else
+ \ifx\poly@interspos\poly@empty
+ \poly@badinterstrue
+ \else
+ \poly@badintersfalse
+ \fi
+ \fi
+ \restore
+ \A@=\polyoldA@\B@=\polyoldB@ % Restore A@ and B@
+ \ifpoly@badinters \else
+ \edef\tmp@{\poly@interspos,\poly@intersneg @}%
+ \expandafter\poly@intersfinish\tmp@
+ \fi
+}
+
+\xydef@\poly@intersfinish#1,#2,#3@{%
+ \X@c=#1\Y@c=#2\relax
+ \xdef\poly@cache{\the\d@X,\the\d@Y,#1,#2,#3}%
+ \poly@setEdge
+}
+
+
+ % Set origin to the first point. Define poly@rest
+ % Requires c to be set to the reference point
+\xydef@\poly@setorigin{\expandafter\poly@setorigin@\poly@list}
+\xydef@\poly@setorigin@#1,#2;#3@{%
+ \X@origin=#1\advance\X@origin\X@c \Y@origin=#2\advance\Y@origin\Y@c%
+ \global\def\poly@rest{#3@}}
+
+
+
+
+%
+% Compute one intersection with a given edge
+% c is set to the reference point, p is set to the end of the ray
+% origin is set to the start of the segment
+\xydef@\poly@interseg#1#2{%
+ % Default is no intersection
+% \W@{ Intersection with edge (\the\X@origin,\the\Y@origin) -> (#1,#2)}%
+ % Compute the absolute values
+ \dimen@=#1\advance\dimen@\X@c \edef\poly@saveXcinters{\the\dimen@}%
+ \dimen@=#2\advance\dimen@\Y@c \edef\poly@saveYcinters{\the\dimen@}%
+ \save@
+ \poly@badintersfalse
+ % Set R@c and U@c to the distance to end of segment
+ \R@c=\poly@saveXcinters \advance\R@c -\X@origin
+ \U@c=\poly@saveYcinters \advance\U@c -\Y@origin
+ % Now call intersect to set X@c and Y@c to the intersection point
+ \intersect@
+ \A@=\X@c \B@=\Y@c % Save result
+ \restore
+ \ifpoly@badinters
+% \W@{ \space failed after intersect}%
+ \else
+% \W@{ \space after intersect@ (\the\A@,\the\B@)}%
+ % Verify that it is on the segment from origin to (#1, #2)
+
+\poly@isonseg\X@origin\Y@origin\A@\B@\poly@saveXcinters\poly@saveYcinters
+ \ifpoly@badinters
+% \W@{ \space failed after seg check}%
+ \else
+ % Verify that (A,B) is on the ray from c to p
+ \poly@isonray\X@c\Y@c\A@\B@\X@p\Y@p
+ \ifpoly@badinters
+ % It is on the negative ray
+% \W@{ \space a negative intersection}%
+ \edef\poly@intersneg{\the\A@,\the\B@}%
+ \else
+% \W@{ \space a positive intersection}%
+ \edef\poly@interspos{\the\A@,\the\B@}%
+ \fi
+ \fi
+ \fi
+ % Set the origin to the start of the next segment
+ \X@origin=\poly@saveXcinters\Y@origin=\poly@saveYcinters
+}
+
+
+%
+% Computes the distance from reference point to the intersection
+%
+\xydef@\polygonEdge@Dist{\xyerror@{Dist is not yet implemented for polygons}}
+
+%
+% Checks that #1 <= #2 <= #3 or that #3 <= #2 <= #1
+% Sets ifpoly@badinters otherwise
+% ifpoly@closedrange decides whether the second inequality is also checked
+% All checks are done with a precision of 100*almostz@ =~ 5000sp = 0.08pt
+\newif\ifpoly@closedrange
+\xydef@\poly@isinrange#1#2#3{%
+ \ifpoly@badinters \else
+ \dimen@=#1\dimen@i=#2\dimen@ii=#3\relax
+% \W@{check if in \ifpoly@closedrange closed\else open\fi\space
+% range 1=\the\dimen@,2=\the\dimen@i,3=\the\dimen@ii}%
+ \advance\dimen@ii -\dimen@ \advance\dimen@i -\dimen@
+ \ifdim\dimen@ii<0pt\relax
+ \ifdim\dimen@i>100\almostz@
+ \poly@badinterstrue
+ \fi
+ \dimen@i=-\dimen@i \dimen@ii=-\dimen@ii
+ \else
+ \ifdim\dimen@i<-100\almostz@\relax
+ \poly@badinterstrue
+ \fi
+ \fi
+ \ifpoly@closedrange
+ \advance\dimen@ii 100\almostz@
+ \ifdim\dimen@i>\dimen@ii
+ \poly@badinterstrue
+ \fi
+ \fi
+% \ifpoly@badinters \W@{ failed}\else\W@{ succeeded}\fi
+ \fi}
+
+%
+% Checks that (#3,#4) is on a segment defined by (#1,#2)->(#5,#6)
+\xydef@\poly@isonseg#1#2#3#4#5#6{%
+ % Check X first
+ \poly@closedrangetrue
+ \poly@isinrange{#1}{#3}{#5}%
+ \poly@isinrange{#2}{#4}{#6}%
+
+}
+
+%
+% Checks that (#3,#4) is on a ray defined by (#1,#2)->(#5,#6)
+\xydef@\poly@isonray#1#2#3#4#5#6{%
+ % Check X first
+ \poly@closedrangefalse
+ \poly@isinrange{#1}{#3}{#5}%
+ \poly@isinrange{#2}{#4}{#6}%
+
+}
+%
+% Test whether (Xp,Yp) is inside the polygon (or on the edge)
+% Sets \ifInside@ accordingly
+\xydef@\polygonEdge@Under{%
+% \W@{}\W@{Edge Under with c=(\the\X@c,\the\Y@c) and p=(\the\X@p,\the\Y@p)}%
+% \W@{ for polygon: \poly@list}%
+ % Save A@ and B@
+ \edef\polysaveA@under{\the\A@}\edef\polysaveB@under{\the\B@}%
+ % Save X@c and Y@c
+ \edef\poly@saveXcUnder{\the\X@c}\edef\poly@saveYcUnder{\the\Y@c}%
+ % Compute the intersection
+ \polygonEdge@Inters
+ \ifpoly@badinters% p is very close to c
+ \Inside@true
+ \else
+ \A@=\X@c\B@=\Y@c
+ % Restore c
+ \X@c=\poly@saveXcUnder\Y@c=\poly@saveYcUnder
+ % Now verify that the intersection point is on the ray c->p
+ \poly@isonseg\X@c\Y@c\X@p\Y@p\A@\B@
+ \ifpoly@badinters \Inside@false \else \Inside@true\fi
+ \A@=\polysaveA@under\B@=\poly@saveB@under
+ \fi
+% \ifInside@\W@{->inside}\else\W@{->outside}\fi
+}
+
+%
+% Compute the inner rectangle
+%
+\xydef@\polygonEdge@Inner{%
+% \W@{}\W@{Edge Inner with (\the\X@c, \the\Y@c) -> (\the\X@p,\the\Y@p)}%
+% \W@{ for polygon: \poly@list}%
+% \W@{ with cache: \poly@cache}%
+ % Save everything except c
+ \enter@{\basefromthebase@ \pfromthep@ \DirectionfromtheDirection@}%
+ % Save c in Lc,Dc
+ \L@c=\X@c \D@c=\Y@c
+ % Compute the two intersection points
+ \polygonEdge@Inters
+ \ifpoly@badinters
+ \czeroEdge@
+ \else
+ % Save the result in Rc,Uc and in X@c,Y@c
+ \expandafter\poly@getinterspoints\poly@cache @%
+ % Now compute the inner rectangle centered
+ \ifdim\X@c>\R@c
+ \L@c=\R@c \R@c=\X@c
+ \else
+ \L@c=\X@c
+ \fi
+ \X@c=0.5\L@c \advance\X@c 0.5\R@c \advance\R@c -\X@c \L@c=\R@c
+ \ifdim\Y@c>\U@c
+ \D@c=\U@c \U@c=\Y@c
+ \else
+ \D@c=\Y@c
+ \fi
+ \Y@c=0.5\D@c \advance\Y@c 0.5\U@c \advance\U@c -\Y@c \D@c=\U@c
+ \Edge@c={\rectangleEdge}%
+ \fi
+ \leave@
+% \xy@showthe c{After inner}%
+}
+
+\xydef@\poly@getinterspoints#1,#2,#3,#4,#5,#6@{%
+ \R@c=#3\U@c=#4\X@c=#5\Y@c=#6}
+
+%
+% Compute the outer rectangle (set Uc,Dc,Lc,Rc and Edgec).
+% Does not change Xc,YC
+%
+\xydef@\polygonEdge@Outer{%
+% \W@{Computing outer for \poly@list}\xy@showthe c{Before outer}%
+ % Save everything except c
+ \enter@{\basefromthebase@ \pfromthep@ \DirectionfromtheDirection@}%
+ \czeroEdge@ % Zero out c
+ \let\poly@map@next=\poly@map
+ \poly@mapExpand\poly@findextent\poly@list
+ \Edge@c={\rectangleEdge}%
+ \leave@
+% \xy@showthe c{After outer}
+}
+
+\xydef@\poly@findextent#1#2{%
+% \xy@showthe c{Before find extent}%
+% \W@{ extx=#1, exty=#2}%
+ \dimen@=#1\dimen@=\the\dimen@% it fails if I remove the second assign
+ \ifdim\dimen@>\R@c \R@c=\dimen@ \fi
+ \ifdim -\dimen@>\L@c \L@c=-\dimen@ \fi
+ \dimen@=#2\dimen@=\the\dimen@% it fails if I remove the second assign
+ \ifdim\dimen@>\U@c \U@c=\dimen@ \fi
+ \ifdim -\dimen@>\D@c \D@c=-\dimen@ \fi
+% \xy@showthe c{ After extent}%
+}
+
+% Change to account for polynomial shapes, in addition to circular ones
+%
+\xydef@\Fshape@#1:{\def\whichframe@@{{#1}}\let\whichoptions@@=\empty
+ \DN@{{}}\ifx\whichframe@@\next@ \def\whichframe@@{{-}}\fi
+ \expandafter\xyFN@\expandafter\Fshape@whichframe\the\Edge@c}
+
+\xydef@\Fshape@whichframe{%
+ \ifx\next\circleEdge
+ \edef\whichframe@@{[o]\whichframe@@}%
+ \DN@##1{\xyFN@\Fshape@i}%
+ \else
+ \ifx\next\polygonEdge
+ \edef\whichframe@@{[P]\whichframe@@}%
+ \DN@\polygonEdge##1@##2@{\xyFN@\Fshape@i}%
+ \else
+ \DN@##1{\xyFN@\Fshape@i}%
+ \fi\fi
+ \next@
+}
+
+\xyendinput
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \BUG: This code should be merged with the `frame' and `poly'
+ options.
+
+ The example at the end of \S??g[:smart] illustrates the extensions.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+% $Log$
+% Received from George.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyoztex.doc b/Master/texmf-dist/source/generic/xypic/xyoztex.doc
new file mode 100644
index 00000000000..4a5e34df9be
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyoztex.doc
@@ -0,0 +1,316 @@
+%% $Id: xyoztex.doc,v 3.3 1996/12/18 09:26:26 ross Exp $
+%%
+%% Xy-pic ``OzTeX'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{oztex}{OzTeX driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This driver provides the necessary interface to support the \PS\ back-end and
+other \PS\ effects when using the DVI driver of versions 1.8+ of \OzTeX\ by
+Andrew Trevorrow,\footnote{\OzTeX\ is a shareware implementation of \TeX\ for
+Macintosh available from many bulletin boards and ftp sites; v1.5 and earlier
+versions were freeware. Email contact: <akt@kagi.com>.} "Earlier versions
+of \OzTeX\ should instead use the driver option |\xyoption{17oztex}|."
+
+Effects such as colour, line-thickness and rotated or scaled diagrams are
+only partially supported in that the effects cannot be applied to any text or
+symbols placed using fonts. This is due to the nature of \OzTeX\ <driver>,
+whose optimization of the placement of font-characters precludes the
+applicability of such effects. Furthermore the \PS\ dictionary must be
+available in a file called |global.ps| or appended to the
+|OzTeXdict.pro|. However with version 1.8 and later of \OzTeX, there is the
+alternative of using the |dvips| <driver>, which does support all the \PS\
+effects available in \Xy-pic.
+
+\NOTE: To use \Xy-pic effectively with \OzTeX\ requires changing several
+memory parameters. In particular a `Big-\TeX' is needed, along with an
+increase in the |pool_size| parameter. Explicit instructions are contained
+in the file |INSTALL.|\-|OzTeX| of the \Xy-pic distribution.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE(
+\xydef@\OzTeX@@#1{\dvimessage@{OzTeX}{#1}}
+
+\newdriver{%
+ \xyaddsupport{color}\oztexColor@@
+ \xyaddsupport{crayon}\oztexCrayon@@
+ \xyaddsupport{ps}\oztexPS@@
+ \xyaddsupport{rotate}\oztexRotate@@
+ \xyaddsupport{line}\oztexLine@@
+ \xyaddsupport{frame}\oztexFrames@@
+ \xyaddsupport{tile}\oztexTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item colour, using \PS, but not of font-characters.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\DOCMODE(
+\xydef@\oztexColor@@{\OzTeXColours@}
+
+\xydef@\OzTeXColours@{\OzTeXPStypes@
+ \let\xylocalColor@=\xyNoColor@@ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%\XYpredict@
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\OzTeXCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@\fi \next@
+ \let\xycolorwarning@=\relax
+ \let\oztexColor@@=\relax
+ \let\UnloadColor@@=\NoOzTeXColor@
+}
+
+\xydef@\NoOzTeXColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\oztexColor@@=\OzTeXColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item crayon colours, similarly restricted.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The 68 colours are those that |dvips| recognizes by name,
+thanks to Tomas Rokicki.
+
+\DOCMODE(
+\xydef@\OzTeXCrayon@@{\installCrayolaColors@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \PS\ back-end.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\oztexPS@@{\oztexPS@}
+
+\xydef@\oztexPSunload@{\UnloadPS@
+ \def\xyPSdictname{}\UsePSdict@@false
+ \let\installxyps@@=\relax
+ \let\UnloadPS@@=\UnloadPS@
+ \xyPSshapes@true
+ \let\oztexPS@@=\oztexPS@ }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\OzTeXSpecial@#1{\special{empty.ps {#1}xy}}
+\xydef@\OzTeXMacro@#1{\special{empty.ps {#1}xy}}
+\xydef@\OzTeXDict@#1{\special{empty.ps @bxy{#1}stopped pop @exy}}
+\xydef@\OzTeXinclude@#1{\special{#1}}
+\xydef@\OzTeXraw@#1{\special{empty.ps @bxy #1 @exy}}%
+
+\xydef@\OzTeXPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\OzTeXSpecial@\else
+ \let\PSspecial@@=\OzTeXSpecial@
+ \let\PSmacro@@=\OzTeXMacro@
+ \let\PSdict@@=\OzTeXDict@
+ \let\PSraw@@=\OzTeXraw@
+ \let\PSinclude@@=\OzTeXinclude@
+ \let\xyPSobeylines@@=\obeyOzTeXlines@
+ \let\PSspecialdict@@=\OzTeXDict@
+ \OzTeX@@{PostScript}%
+ \fi
+% \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \OzTeXCurrpt@ }
+
+{\catcode`\^^M=\active %
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space \obeyspaces}}
+\xylet@\obeyOzTeXlines@=\next
+\DOCMODE)
+
+The \PS\ operators |@bxy| and |@exy| are defined in |xyps-ps| for bypassing
+the mechanism used in \OzTeX\ to isolate code passed in |\special| commands.
+Although it is possible (albeit difficult) to devise \PS\ to deduce the
+current location for use with the ``raw'' specials, this information cannot
+be used to do rotations and scaling as with other <driver>s.
+Hence the value of |\xyPScurrpt@@| is taken to be empty.
+
+\DOCMODE(
+\xydef@\OzTeXCurrpt@{\let\xyPScurrpt@@=\OzTeXCurrpt@@}%
+\xydef@\OzTeXCurrpt@@{\PSraw@@{xyp}}
+\DOCMODE)
+
+\medskip
+
+This avoids dumping the dictionary into the dvi-file, making sure
+that instead it goes into a file, specified by |\xyPSdictname|,
+which defaults to |global.ps|.
+
+\DOCMODE(
+\xydef@\oztexPS@{\OzTeXPStypes@
+ \let\oztexPS@@=\relax
+ \let\UnloadPS@@=\oztexPSunload@
+ \let\installxyps@@=\@OzTeX@PS@
+ \installxyps@ }
+
+\xydef@\@OzTeX@PS@{\UsePSdict@@true
+ \let\includePSmessage@=\xyOzTeXheader
+ \ifx\undefined\xyPSdictname\def\xyPSdictname{global.ps}\fi}
+
+\xydef@\xyOzTeXheader#1#2#3{\UsePSdict@@true}
+\DOCMODE)
+
+The parameters |#1#2#3| of |\xyOzTeXheader| gobble tokens
+that are unnecessary with \OzTeX.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths and poly-lines, using \PS.
+\DOCMODE(
+\xydef@\oztexLine@@{\oztexLine@}
+
+\xydef@\oztexLine@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%\XYpredict@
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-styles are}\UnloadLine@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item extra frames and fills, using \PS.
+\DOCMODE(
+\xydef@\oztexFrames@@{\OzTeXFrames@}
+
+\xydef@\OzTeXFrames@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item patterns and tiles, using \PS.
+\DOCMODE(
+\xydef@\oztexTiles@@{\OzTeXTiles@}
+
+\xydef@\OzTeXTiles@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@
+ \xystandardpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item rotated/scaled diagrams and text, recognised but not supported.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+In fact \OzTeX\ cannot support rotations and scaling.
+Instead we go through all the motions of providing \PS\ support,
+then set a flag that causes a limited number of warning messages to be
+generated as requests are made for these effects.
+
+\DOCMODE(
+\xydef@\oztexRotate@@{\OzTeXRotate@}
+
+\xydef@\OzTeXRotate@{\OzTeXPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \OzTeXRotScale@ \installPSrotscale@ \xyPSshapes@false }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+This never worked properly. It requires too much hacking at Trevorrow's
+code for little gain, since text-rotation can never work anyway.
+Use the \dvips\ option instead!
+
+\DOCMODE(
+\xydef@\OzTeXRotScale@{%
+ \def\xyrot@start(##1){%
+ {xyp xyt ##1\space xyr}{OzXy begin gsave}}%
+ \def\xyscale@start(##1,##2){%
+ {xyp xyt ##1\space##2\space xys}{OzXy begin gsave}}%
+ \def\xyrot@end{grestore end}\def\xyscale@end{grestore end}}
+\DOCMODE)
+
+The default code will just do nothing as far as the output is concerned...
+
+\DOCMODE(
+\let\OzTeXRotScale@=\xyRotScale@@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyoztex.doc,v $
+% Revision 3.3 1996/12/18 09:26:26 ross
+% improvements to file-loading commands
+% fixed missing @ bug
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xypic.doc b/Master/texmf-dist/source/generic/xypic/xypic.doc
new file mode 100644
index 00000000000..631e0e10b1a
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xypic.doc
@@ -0,0 +1,75 @@
+%% $Id: xypic.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+%%
+%% Xy-pic v2 compatibility loading.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This file (version \stripRCS$Revision: 3.3 $) just loads the |v2|
+ feature.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\DOCHEADER
+
+ Here it is\dots
+
+\DOCMODE(
+\input xyv2
+\endinput
+\DOCMODE)
+
+ The log reveals that this was originally the main file.
+
+\DOCMODE(
+% $Log: xypic.doc,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% This file NEW for version 2.7 for backwards compatibility.
+% Original xypic.doc renamed to xy.doc.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xypic.map b/Master/texmf-dist/source/generic/xypic/xypic.map
new file mode 100644
index 00000000000..9fd5279567e
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xypic.map
@@ -0,0 +1,66 @@
+%% $Id: xypic.map,v 3.7 1999/02/16 15:12:50 krisrose Exp krisrose $
+%%
+%% Xy-pic PostScript type 1 font map for DVIPS.
+%% Copyright (c) 1995-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+
+% USAGE:
+% Put this line in your DVIPS (and/or other PS driver) header
+% file directory (uncommented, starting in column 1):
+%
+% p+ xypic.map
+%
+% THANKS to Y&Y Inc. for making the much improved PFB fonts available to
+% TeX community.
+
+
+xydash10 XYDASH10 <xydash10.pfb
+xyatip10 XYATIP10 <xyatip10.pfb
+xyatip11 XYATIP10 "1.1 ExtendFont" <xyatip10.pfb
+xyatip12 XYATIP10 "1.2 ExtendFont" <xyatip10.pfb
+xybtip10 XYBTIP10 <xybtip10.pfb
+xybtip11 XYBTIP10 "1.1 ExtendFont" <xybtip10.pfb
+xybtip12 XYBTIP10 "1.2 ExtendFont" <xybtip10.pfb
+
+xybsql10 XYBSQL10 <xybsql10.pfb
+xycirc10 XYCIRC10 <xycirc10.pfb
+
+xycmat10 XYCMAT10 <xycmat10.pfb
+xycmat11 XYCMAT10 "1.1 ExtendFont" <xycmat10.pfb
+xycmat12 XYCMAT10 "1.2 ExtendFont" <xycmat10.pfb
+xycmbt10 XYCMBT10 <xycmbt10.pfb
+xycmbt11 XYCMBT10 "1.1 ExtendFont" <xycmbt10.pfb
+xycmbt12 XYCMBT10 "1.2 ExtendFont" <xycmbt10.pfb
+
+xyeuat10 XYEUAT10 <xyeuat10.pfb
+xyeuat11 XYEUAT10 "1.1 ExtendFont" <xyeuat10.pfb
+xyeuat12 XYEUAT10 "1.2 ExtendFont" <xyeuat10.pfb
+xyeubt10 XYEUBT10 <xyeubt10.pfb
+xyeubt11 XYEUBT10 "1.1 ExtendFont" <xyeubt10.pfb
+xyeubt12 XYEUBT10 "1.2 ExtendFont" <xyeubt10.pfb
+
+% Obsolete fonts not included by default (and not available for PDF).
+%xyline10 XYLINE10 <xyline10.pfa
+%xyqc10 XYQC10 <xyqc10.pfa
+%xymisc10 XYMISC10 <xymisc10.pfa
diff --git a/Master/texmf-dist/source/generic/xypic/xypic.sty b/Master/texmf-dist/source/generic/xypic/xypic.sty
new file mode 100644
index 00000000000..1a493530c68
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xypic.sty
@@ -0,0 +1,29 @@
+%% $Id: xypic.sty,v 3.3 1996/12/19 03:31:56 krisrose Exp $ -*-tex-*-
+%%
+%% LaTeX style option to load Xy-pic in version 2 compatibility mode.
+%% by Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is in the public domain. It is distributed in the hope that it
+%% will be useful, but WITHOUT ANY WARRANTY; without even the implied
+%% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+%%
+\input{xy.sty}
+\xyoption{v2}
+\catcode`\@=\xystycatcode
+\endinput
+
+% $Log: xypic.sty,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
diff --git a/Master/texmf-dist/source/generic/xypic/xypoly.doc b/Master/texmf-dist/source/generic/xypic/xypoly.doc
new file mode 100644
index 00000000000..5c4dac00198
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xypoly.doc
@@ -0,0 +1,1262 @@
+%% $Id: xypoly.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Polygon'' feature.
+%% Copyright (c) 1994-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this macro package; if not, write to the Free Software Foundation,
+%% Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{poly}{Polygon feature}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+ This feature provides a means for specifying the locations of
+ vertices for regular polygons, with any number ($\ge 3$) of sides.
+ Polygons can be easily drawn and/or the vertex positions used to constuct
+ complex graphics within an \Xy-picture. Many non-regular polygons can
+ be specified by setting a non-square basis.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+Some of the effects use |\ar| so make sure the `arrow' feature is loaded.
+\DOCMODE(
+\xyrequire{arrow}\xycatcodes
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\message{polygons,}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\medskip
+
+A polygon is most easily specified using \dots
+\begin{defs}
+ |\xypolygon|<number>|{}| & \quad with <number> sides;\cr
+ |\xypolygon|<number>|{|<tok>|}|\kern-30pt &\quad\quad <tok> at vertices;\cr
+ |\xypolygon|<number>|{|<object>|}|\kern-60pt &\cr
+ \multispan2 \quad\quad with a general <object> at each vertex;\hfill\cr
+%% \multispan2 |!P| \quad alias for |\xypolygon| within |\xygraph| \cr
+\end{defs}
+\unskip\noindent
+%
+Here <number> is a sequence of digits, giving the number of sides.
+If used within an |\xy|\dots|\endxy| environment then the polygon
+will be centred on $c$, the current <pos>. However an |\xypolygon|
+can be used outside such an environment, as ``stand-alone'' polygon;
+the whole picture must be specified within the |\xypolygon| command.
+
+In either case the shape is obtained by spacing vertices equally
+around the ``unit circle'' with respect to the current basis.
+If this basis is non-square then the vertices will lie on an ellipse.
+Normally the polygon, with at most 12 vertices, is oriented so as to
+have a flat base when specified using a standard square basis.
+With more than 12~vertices the orientation is such that the line
+from the centre to the first vertex is horizontal, pointing to the right.
+Any other desired orientation can be obtained, with any number of vertices,
+by using the |~={|\dots|}| as described below.
+
+\medskip
+The general form for |\xypolygon| is \dots
+\begin{defs1}
+ |\xypolygon|<number>|"|<prefix>|"{|<switches>\dots|}|
+\end{defs1}\unskip\noindent
+%
+where the |"|<prefix>|"| and <switches> are optional.
+Their uses will be described shortly.
+
+\medskip
+
+A |\xypolygon| establishes positions for the vertices of a polygon.
+At the same time various things may be typeset,
+according to the specified <switches>.
+An <object> may be dropped at each vertex, ``spokes'' drawn to the
+centre and successive vertices may be connected as the polygon's ``sides''.
+Labels and breaks can be specified along the spokes and sides.
+
+Each vertex is automatically named:
+|"1"|, |"2"|, \ldots, |"|<number>|"| with |"0"| as centre.
+When a <prefix> has been given,
+names |"|<prefix>|0"|, \dots, |"|<prefix><number>|"| are used instead.
+While the polygon is being constructed the macro |\xypolynum| expands to
+the number of sides, while |\xypolynode| expands to the number
+of each vertex, spoke and side at the time it is processed.
+This occurs in the following order:
+{\it vertex}$\,1$, {\it spoke}$\,1$, {\it vertex}$\,2$,
+{\it spoke}$\,2$, {\it side}$\,1$, {\it vertex}$\,3$,
+{\it spoke}$\,3$, {\it side}$\,2$, \dots , {\it vertex}$\;n$,
+{\it spoke}$\;n$, {\it side}$\;n-1$, {\it side}$\;n$
+where the final side joins the last vertex to the first.
+
+The macro |\xypolyname| holds the name of the polygon,
+which is <prefix> if supplied. In this case the value of
+|\xypolynum| is also stored as |\|<prefix>|NUMSIDES|,
+accessible outside the polygon.
+
+As stated above, a polygon with up to 12 vertices is oriented
+so as to have a flat base, when drawn using a standard square basis.
+Its vertices are numbered in anti-clockwise order, commencing with the one
+at horizontal-right of centre, or the smallest angle above this
+(see example below).
+With more than 12 vertices then vertex |"1"| is located on the horizontal,
+extending to the right from centre (assuming a standard square basis).
+By providing a switch of the form |~={|<angle>|}| then the vertex |"1"|
+will be located on the unit circle at <angle>$^\circ$ anti-clockwise
+from ``horizontal'' --- more correctly, from the $X$-direction in the
+basis to be used when setting the polygon, which may be established
+using a |~:{|\dots|}| switch.
+
+\begin{code}
+\def\objectstyle{\scriptscriptstyle}
+\xy \xygraph{!{/r2pc/:}
+[] !P3"A"{\bullet}
+"A1"!{+U*++!D{1}} "A2"!{+LD*+!RU{2}}
+"A3"!{+RD*+!LU{3}} "A0"
+[rrr]*{0}*\cir<5pt>{}
+!P6"B"{~<-\cir<5pt>{}}
+"B1"1 "B2"2 "B3"3 "B4"4 "B5"5 "B6"6 "B0"
+[rrr]0 !P9"C"{~*{\xypolynode}}}\endxy
+\end{code}
+$$\docode$$\nobreak
+\begin{exercise}
+Give code to typeset these.
+\answertext{Here is the code actually used to typeset the |\xypolygon|s,
+within an |\xygraph|. It illustrates three different ways to place
+the numbers. Other ways are also possible.}
+\answercode
+\answertext\displaycode
+\end{exercise}
+\goodbreak\goodbreak
+
+One important use of <prefix> is to allow the vertices of more than one
+polygon to be accessed subsequently within the same picture.
+Here are some examples of this,
+incorporating the |~:{|\dots|}| switch to perform simple rescalings.
+Firstly the edges of a dodecahedron as a planar graph:
+
+\begin{code}
+\xy /l1.5pc/:,{\xypolygon5"A"{}},
+{\xypolygon5"B"{~:{(1.875,0):}~>{}}},
+{\xypolygon5"C"{~:{(-2.95,0):}~>{}}},
+{\xypolygon5"D"{~:{(-3.75,0):}}},
+{"A1"\PATH~={**@{-}}'"B1"'"C4"'"B2"},
+{"A2"\PATH~={**@{-}}'"B2"'"C5"'"B3"},
+{"A3"\PATH~={**@{-}}'"B3"'"C1"'"B4"},
+{"A4"\PATH~={**@{-}}'"B4"'"C2"'"B5"},
+{"A5"\PATH~={**@{-}}'"B5"'"C3"'"B1"},
+"C1";"D1"**@{-},"C2";"D2"**@{-},
+"C3";"D3"**@{-},"C4";"D4"**@{-},
+"C5";"D5"**@{-} \endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\noindent
+Next a hexagonal pyramid, a rectangular box
+and an octahedral crystal specified as a triangular anti-prism.
+Notice how the |~:{|\dots|}| switch is used to create non-square bases,
+allowing the illusion of 3D-perspective in the resulting diagrams:
+
+\begin{code}
+\xy/r2pc/: ="A", +(.2,1.5)="B","A",
+{\xypolygon6{~:{(1,-.1):(0,.33)::}
+ ~<>{;"B"**@{-}}}}\endxy
+\quad \xy /r2pc/:
+{\xypolygon4"A"{~:{(0,.7)::}}},+(.7,1.1),
+{\xypolygon4"B"{~:{(.8,0):(0,.75)::}}},
+"A1";"B1"**@{.},"A2";"B2"**@{.},
+"A3";"B3"**@{.},"A4";"B4"**@{.}
+\endxy\quad \xy /r2pc/:
+{\xypolygon3"A"{~:{(0,.7)::}}},+(.7,1.1),
+{\xypolygon3"B"{~:{(-.85,0):(-.15,.8)::}}}
+,"A1"\PATH~={**@{.}}'"B2"'"A3"'"B1"
+'"A2"'"B3"'"A1" \endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+|\xypolynode| simply reads the value of a counter called |\xypolynode@|.
+It is set initially at -1, to indicate no polygon yet. This is used to
+establish the default naming in case polygons are nested.
+
+\DOCMODE(
+\xynew@{count}\xypolynode@\xypolynode@=\m@ne
+\xydef@\xypolynode{\the\xypolynode@}
+
+\xydef@\xypolyNUMSIDES@{}
+\xydef@\xypolynum{\xypolyNUMSIDES@}
+\DOCMODE)
+
+To allow recursion the values of |\xypolyNUMSIDES@| and |\xypolynode@| are saved
+upon entering an |\xypolygon|, to be restored at the end.
+
+\DOCMODE(
+\xydef@\xypolygon{\xypoly@}%
+
+\xydef@\xypoly@{%
+ \if\inxy@
+ \if\inxypoly@
+ \edef\next@{\noexpand\xy@@{\noexpand\nter@{\xypolynode@=\the\xypolynode@
+ \noexpand\def\noexpand\xypolyNUMSIDES@{\xypolyNUMSIDES@}}}}%
+ \else
+ \DN@{\xy@@{\def\inxypoly@{TT}%
+ \nter@{\def\inxypoly@{TF}\xypolynode@=\m@ne}}}%
+ \fi
+ \else
+ \if\inxypoly@
+ \edef\next@{\noexpand\xy
+ \noexpand\xy@@{\noexpand\nter@{\xypolyside=\the\xypolyside
+ \noexpand\def\noexpand\xypolyNUMSIDES@{\xypolyNUMSIDES@}\endxy}}}%
+ \else
+ \DN@{\xy \xy@@{\def\inxypoly@{TT}%
+ \nter@{\def\inxypoly@{TF}\xypolynode@=\m@ne \endxy}}}%
+ \fi
+ \fi
+ \next@ \count@=\z@ \xyFN@\xypoly@n}
+
+\xydef@\inxypoly@{TF}%
+\xydef@\xypoly@x{\xy@@{\leave@\leave@}}
+\DOCMODE)
+
+Read the number of vertices by parsing digits.
+
+\DOCMODE(
+\xydef@\xypoly@n{%
+ \DN@##1{\multiply\count@10\relax \advance\count@##1\relax \xyFN@\xypoly@n}%
+ \ifx \space@\next
+ \ifnum\count@>\z@ \expandafter\DN@\space@{\xyFN@\xypoly@i}%
+ \else \expandafter\DN@\space@{\xyFN@\xypoly@n}\fi
+ \else\ifx 0\next \else\ifx 1\next \else\ifx 2\next \else\ifx 3\next
+ \else\ifx 4\next \else\ifx 5\next \else\ifx 6\next \else\ifx 7\next
+ \else\ifx 8\next \else\ifx 9\next
+ \else \let\next@=\xypoly@i \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
+
+\xydef@\xypoly@i{\edef\xypolyNUMSIDES@{\the\count@}\xyFN@\xygetpolyprefix@}
+\DOCMODE)
+
+Next we check whether a prefix has been supplied for creating the vertex
+names. If so it is stored as |\xypolyPREFIX@|, which otherwise expands to
+empty. The number of sides is also stored using the prefix.
+
+\DOCMODE(
+\xydef@\xypolyPREFIX@{}%
+\xydef@\xypolyPREFIX@@{}%
+\xydef@\xypolyname{\xypolyPREFIX@}%
+
+\xydef@\xygetpolyprefix@{%
+ \ifx\next"\DN@"##1"{\def\xypolyPREFIX@@{##1}\expandafter
+ \edef\csname\xypolyPREFIX@@ NUMSIDES\endcsname{\xypolyNUMSIDES@}%
+ \xypolyprefix@@ }%
+ \else
+ \ifnum\xypolynode@<\z@\def\xypolyPREFIX@@{}%
+ \else
+ \edef\xypolyPREFIX@@{\xypolyPREFIX@\the\xypolynode@,}%
+ \fi \DN@{\xypolyprefix@@}%
+ \fi \next@ }
+
+\xydef@\xypolyprefix@@{%
+ \expandafter\toks@\expandafter{\addEQ@\POS"}%
+ \expandafter\addtotoks@\expandafter{\xypolyPREFIX@@0"\relax}%
+ \the\toks@
+ \ifnum\xypolynode@<\z@
+ \expandafter\def\expandafter\xypolyPREFIX@\expandafter{\xypolyPREFIX@@}%
+ \xy@@{\enter@{\xypolynode@=\the\xypolynode@
+ \noexpand\def\noexpand\xypolyPREFIX@{\xypolyPREFIX@}}\xypolynode@=\z@ }%
+ \else
+ \xy@@{\enter@{\xypolynode@=\the\xypolynode@
+ \noexpand\def\noexpand\xypolyPREFIX@{\xypolyPREFIX@}}\xypolynode@=\z@ }%
+ \expandafter\def\expandafter\xypolyPREFIX@\expandafter{\xypolyPREFIX@@}%
+ \fi
+ \xypoly@@i }
+\DOCMODE)
+
+Currently any tokens remaining before the opening brace are
+discarded, with an accompanying message.
+
+\DOCMODE(
+\xydef@\xypoly@@i#1#{\begingroup
+ \DN@{#1}\ifx\next@\empty\else
+ \xywarning@{discarding unused tokens: #1}\fi \xypoly@@ }
+\DOCMODE)
+
+Next it is time to analyse the braced information,
+e.g. to set switches and/or adjust the scale.
+If this information is empty |{}| then the default
+values are used.
+
+\DOCMODE(
+\xydef@\xypoly@@#1{\xypolydefaults@
+ \DN@{#1}\ifx\next@\empty\DN@{\xypoly@@@}%
+ \else \DN@{\xyFN@\xypolyparams@#1~!}\fi \next@}
+
+\xydef@\xypolydefaults@{\def\xypolySCALE@{}%
+ \def\xypolySPOKES@{{}}\def\xypostSPOKES@{}\let\xypreSPOKES@\relax
+ \def\xypolySIDES@{{-}}\def\xypostSIDES@{}\let\xypreSIDES@\relax
+ \def\xypolyVERTEX@{}\def\xypolyALIGN@{}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Vertex object:}
+
+Unless the first character is |~|, signifying a ``switch'', then the whole
+of the braced material is taken as specifying the <object> for each vertex.
+It will be typeset with a circular edge using |\drop[o]...|,
+except when there is just a single token <tok>.
+In this case it is dropped as |\drop=0{|<tok>|}|, having zero size.
+An object can also be dropped at each vertex using the switch |~*{|\dots|}|,
+in which case it will be circular, with the current {\it objectmargin\/}
+applied.
+
+The next example illustrates three different ways of specifying a |\circ|
+at the vertices.
+
+\begin{code}
+\xy/r2pc/: {\xypolygon12{\circ}},
++/r5pc/,{\xypolygon10{~<{-}~>{}{\circ}}},
++/r5pc/,{\xypolygon8{~*{\circ}~<=}}\endxy
+\end{code}
+$$\docode$$
+
+\displaycode
+
+\DOCMODE(
+{\xyuncatcodes \gdef\next{*=0}}
+\xylet@\xypolynullvertex@=\next
+
+{\xyuncatcodes \gdef\next{*[o]}}
+\xylet@\xypolyvertex@=\next
+
+{\xyuncatcodes \gdef\next{*+[o]}}
+\xylet@\xypolywidevertex@=\next
+
+\xydef@\xypolyparams@{%
+ \ifx\space@\next \expandafter\DN@\space{\xyFN@\xypolyparams@}%
+ \else\ifx\next~\DN@~{\xyFN@\xypolywhich@}%
+ \else\ifx\next\bgroup\DN@##1~!{%
+% \ifx\empty\xypolyVERTEX@\def\xypolyVERTEX@{*[o]{##1}}%
+ \ifx\empty\xypolyVERTEX@\expandafter
+ \def\expandafter\xypolyVERTEX@\expandafter{\xypolyvertex@{##1}}%
+ \else\xypolyVERTEXerror@{##1}\fi \xypoly@@@}%
+ \else\DN@##1~!{\DN@{##1}\ifx\next@\empty\else
+ \ifx\empty\xypolyVERTEX@\def\xypolyVERTEX@{*##1}%
+% \checkpolytok@\xypolyVERTEX@{*=0}##1@@!\relax
+ \expandafter\checkpolytok@\expandafter\xypolyVERTEX@
+ \expandafter{\xypolynullvertex@}##1@@!\relax
+ \else\xypolyVERTEXerror@{##1}\fi\fi \xypoly@@@}%
+ \fi\fi\fi \next@ }
+
+\xydef@\xypolyVERTEXerror@#1{\xywarning@{%
+ vertex already specified, discarding unused tokens:#1}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Switches}{}\hfill
+\par{}
+
+\noindent
+The allowable switches are given in the following table:
+%
+\begin{defs}
+|~:{|\ldots|}| & useful for rescaling.\cr
+|~*{|<object>|}| & <object> at each vertex.\cr
+|~={|<angle>|}| & align first vertex.\cr
+|~<{|\ldots|}| & directional for ``spokes'';\cr
+|~<<{|<arrow>|}| & use <arrow> for spokes;\cr
+|~<>{|\ldots|}| & labels \& breaks on spokes.\cr
+|~>{|\ldots|}| & directional for ``sides'';\cr
+|~><{|<arrow>|}| & use <arrow> for sides;\cr
+|~>>{|\ldots|}| & labels \& breaks on sides.\cr
+\end{defs}
+%
+\noindent
+Using |~<<{|<arrow>|}| or |~><{|<arrow>|}| is most appropriate
+when arrowheads are required on the sides or spokes, or when
+labels/breaks are required. Here <arrow> is as in
+figure~??g[xyarrow.doc:f.arrow],
+so it can be used simply to specify the style of directional to be used.
+Thus |~<<{}| sets each spoke as a default arrow,
+pointing outwards from the centre; |~<<{@{-}}| suppresses the arrowhead,
+while |~><{@{}}| uses an empty arrow along the sides.
+Labels and breaks are specified with |~<>{|\ldots|}| and |~>>{|\ldots|}|,
+where the |{|\ldots|}| use the notation for a <label>,
+as in figure~??g[xyarrow.doc:f.path].
+
+When no tips or breaks are required then the switches |~<{|\ldots|}|
+and |~>{|\ldots|}| are somewhat faster, since less processing is needed.
+Labels can still be specified with |~<>{|\ldots|}| and |~>>{|\ldots|}|,
+but now using the kernel's <place> notation of figure~??g[xy.doc:f.pos].
+In fact any kernel code can be included using these switches.
+With |~<>| the current $p$ and $c$ are the centre and vertex respectively,
+while for |~>>| they are the current vertex and the previous vertex.
+(The connection from vertex |"|<number>|"| to vertex |"1"| is done last.)
+The pyramid above is an example of how this can be used.
+Both |~<{|\ldots|}| and |~<<{|<arrow>|}| can be
+specified together, but only the last will actually be used;
+similarly for |~>{|\ldots|}| and |~><{|<arrow>|}|.
+
+\begin{code}
+\def\alphanum{\ifcase\xypolynode\or A
+\or B\or C\or D\or E\or F\or G\or H\fi}
+\xy/r3pc/: {\xypolygon3{~={40}}},
+{\xypolygon4{~={40}~>{{--}}}},
+{\xypolygon5{~={40}}},
+{\xypolygon6{~={40}~>{{--}}}},
+{\xypolygon11{~={40}}},
+{\xypolygon50{~={40}~>.}}, +/r8pc/,
+{\xypolygon7{~<<{@{-}}~><{}
+ ~<>{|*@{x}}~*{\alphanum}
+ ~>>{_{\alpha_\xypolynode^{}}}}}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+
+Use of the |~={|\ldots|}| switch was described earlier.
+When using the |~:{|\ldots|}| more can be done than just setting the base.
+In fact any kernel code can be supplied here.
+It is processed prior to any other part of the polygon.
+The graphics state has $c$ at the centre of the polygon,
+$p$ at the origin of coordinates within the picture and
+has basis unchanged from what has previously been established.
+The current point $c$ will be reset to the centre following any code
+interpreted using this switch.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Note that |~!| was appended by |\xypoly@@|, in order to indicate the end
+of the braced tokens. The macro |\xypolywhich@| is the main parser,
+with |\xypoly@SPOKES@| and |\xypoly@SIDES@| handling the subcases
+for |~<| and |~>|.
+
+\DOCMODE(
+\xydef@\xypolywhich@{%
+ \ifx\next!\DN@!{\xypoly@@@}%
+ \else \addLT@\ifx\next \addLT@\DN@{\xyFN@\xypoly@SPOKES@}%
+ \else \addGT@\ifx\next \addGT@\DN@{\xyFN@\xypoly@SIDES@}%
+ \else \addEQ@\ifx\next \addEQ@\DN@##1{%
+ \def\xypolyALIGN@{##1}\xyFN@\xypolyparams@ }%
+ \else \ifx :\next \DN@:##1{%
+ \def\xypolySCALE@{##1}\xyFN@\xypolyparams@ }%
+% \else\ifx\next*\DN@*##1{\def\xypolyVERTEX@{*+[o]{##1}}\xyFN@\xypolyparams@}%
+ \else\ifx\next*\DN@*##1{\expandafter
+ \def\expandafter\xypolyVERTEX@\expandafter{\xypolywidevertex@{##1}}%
+ \xyFN@\xypolyparams@}%
+ \fi\fi\fi\fi\fi\fi \next@ }
+
+\xydef@\xypoly@SPOKES@{%
+ \addLT@\ifx\next \addLT@\DN@##1{%
+ \def\xypreSPOKES@{##1}\def\xypolySPOKES@{}\xyFN@\xypolyparams@ }%
+ \else \addGT@\ifx\next \addGT@\DN@##1{%
+ \def\xypostSPOKES@{##1}\xyFN@\xypolyparams@ }%
+ \else \ifx\next\bgroup \DN@##1{%
+ \def\xypolySPOKES@{##1}\let\xypreSPOKES@\relax
+ \checkpolytok@\xypolySPOKES@{}##1@@!{\xyFN@\xypolyparams@}}%
+ \else \DN@##1{%
+ \let\xypreSPOKES@\relax \def\xypolySPOKES@{{##1}}\xyFN@\xypolyparams@}%
+ \fi\fi\fi \next@ }
+
+\xydef@\xypoly@SIDES@{%
+ \addLT@\ifx\next \addLT@\DN@##1{%
+ \def\xypreSIDES@{##1}\def\xypolySIDES@{}\xyFN@\xypolyparams@ }%
+ \else \addGT@\ifx\next \addGT@\DN@ ##1{%
+ \def\xypostSIDES@{##1}\xyFN@\xypolyparams@ }%
+ \else \ifx\next\bgroup \DN@##1{%
+ \def\xypolySIDES@{##1}\let\xypreSIDES@\relax
+ \checkpolytok@\xypolySIDES@{}##1@@!{\xyFN@\xypolyparams@}}%
+ \else \DN@##1{%
+ \let\xypreSIDES@\relax \def\xypolySIDES@{{##1}}\xyFN@\xypolyparams@}%
+ \fi\fi\fi \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+A further simplification exists for sides and spokes without <arrow>s.
+If <tok> is a single character then |~>|<tok>, |~>{|<tok>|}|, |~>{{|<tok>|}}|
+all specify the directional |\dir{|<tok>|}|; similarly with the |~<| switch.
+On the other hand, compound directionals require all the braces,
+e.g. |~>{{--}}| and |~>{2{.}}|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This is achieved with the macro
+|\checkpolytok@#1#2#3#4@!#5| which handles the bare <tok> case
+by adding braces around <tok> which has been passed as |#3|, preceeding
+it with |#2|. This is then |\def|'d to the control-sequence name
+passed as |#1|. Finally continue with the command passed as |#5|.
+
+\DOCMODE(
+\xydef@\checkpolytok@#1#2#3#4@!#5{\DNii@{#1}\DN@{#4}%
+ \ifx\next@\empty\expandafter\def\nextii@{{}}%
+ \else\ifx#4@\expandafter\def\nextii@{#2{#3}}\fi\fi #5}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\medskip
+
+After all switches have been processed, remaining tokens
+are used to specify the <object> for each vertex.
+Such tokens will be used directly after a |\drop|,
+so can include object <modifier>s as in figure~??g[xy.doc:f.object].
+If an <object> has already been specified, using the |~*| switch,
+then the following message will be written to the \TeX\ log:
+
+\begin{center}
+\noindent{\tt Xy-pic Warning: vertex already specified,
+discarding unused tokens:}
+\end{center}
+%
+with tokens at the end indicating what remains unprocessed.
+Similarly extra tokens before the |{|\dots|}| generate a message:
+
+\begin{center}
+\noindent|Xy-pic Warning: discarding unused tokens: |
+\end{center}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Nested Polygons}{}\hfill
+\par{}
+
+\noindent
+When |\xypolygon| is specified within either a |~<>{|\dots|}|
+or |~>>{|\dots|}| switch for another polygon,
+then the inner polygon inherits a name which incorporates also the number
+of the part on which it occurs, as given by |\xypolynode|.
+This name is accessed using |\xypolyname|.
+In the following example the inner polygon is
+placed using |~<>| in order to easily adjust its orientation
+to the outward direction of the spokes.
+
+\begin{code}
+\xypolygon4{~:{/r5pc/:}
+ ~<>{*\frm<8pt>{o}\xypolygon4{~:{/-2pc/:}
+ ~*{\xypolyname\xypolynode}}}
+ [o]=<5pc>{\xypolynode}}
+\end{code}
+$$\docode$$
+\displaycode
+
+Notice how nested polygons inherit names |"1,1"|, |"1,2"|, \dots,
+|"4,1"|, \dots, |"4,4"| for their vertices. If a <prefix> is supplied
+at the outermost level then the names become: |"|<prefix>$i,j$|"|.
+Specifying a <prefix> for the inner polygon overrides this naming scheme.
+The same names may then be repeated for each of the inner polygons,
+allowing access afterwards only to the last---possibly useful as a
+memory saving feature when the vertices are not required subsequently.
+
+Four levels of nesting gives a quite acceptable ``Sierpinski gasket''.
+The innermost triangle is provided by |\blacktriangle|
+from the \AMS\ symbol font |msam5|, at 5-point size.
+Further levels can be achieved using the \PS\ backend,
+otherwise line segments become too small to be rendered using \Xy-fonts.
+
+\begin{code}
+\font\msamv=msam5 at 5pt
+\def\blacktriangle{{\msamv\char'116}}
+\def\objectstyle{\scriptscriptstyle}
+\xypolygon3{~:{/r5.2pc/:}
+ ~>{}~<>{?\xypolygon3"a"{~:{(.5,0):}
+ ~>{}~<>{?\xypolygon3"b"{~:{(.5,0):}
+ ~>{}~<>{?\xypolygon3"c"{~:{(.5,0):}
+ ~>{}~<>{?\xypolygon3"d"{~:{(.5,0):}
+~<>{?*!/d.5pt/=0\hbox{\blacktriangle}}
+}} }} }} }} }
+\end{code}
+$$\docode$$\goodbreak
+\displaycode
+
+\noindent
+Note the use of naming in this example; when processing this manual
+it saves 13,000+ words of main memory and 10,000+ string characters
+as well as 122 strings and 319 multi-letter control sequences.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{figure*}[ht]
+{\footnotesize \def"#1"{\edef\qq{#1}\expandafter\futurelet\expandafter\next\expandafter\q\qq}%
+\def\q{\ifx-\next \def\next-{~\llap{$-$}}\else \def\next{~}\fi \next}%
+\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}cllllllllll}
+$n$ & $\sin{\pi\over n}$ & $\cos{\pi\over n}$
+ & $\sin{2\pi\over n}$ & $\cos{2\pi\over n}$
+ & $\sin{3\pi\over n}$ & $\cos{3\pi\over n}$
+ & $\sin{4\pi\over n}$ & $\cos{4\pi\over n}$
+ & $\sin{5\pi\over n}$ & $\cos{5\pi\over n}$\cr
+ 0 & "\sinPIon0" & "\cosPIon0" & "\sinTwoPIon0" & "\cosTwoPIon0"
+ & "\sinThreePIon0" & "\cosThreePIon0" & "\sinFourPIon0" & "\cosFourPIon0"
+ & "\sinFivePIon0" & "\cosFivePIon0"\cr
+ 1 & "\sinPIon1" & "\cosPIon1" & "\sinTwoPIon1" & "\cosTwoPIon1"
+ & "\sinThreePIon1" & "\cosThreePIon1" & "\sinFourPIon1" & "\cosFourPIon1"
+ & "\sinFivePIon1" & "\cosFivePIon1"\cr
+ 2 & "\sinPIon2" & "\cosPIon2" & "\sinTwoPIon2" & "\cosTwoPIon2"
+ & "\sinThreePIon2" & "\cosThreePIon2" & "\sinFourPIon2" & "\cosFourPIon2"
+ & "\sinFivePIon2" & "\cosFivePIon2"\cr
+ 3 & "\sinPIon3" & "\cosPIon3" & "\sinTwoPIon3" & "\cosTwoPIon3"
+ & "\sinThreePIon3" & "\cosThreePIon3" & "\sinFourPIon3" & "\cosFourPIon3"
+ & "\sinFivePIon3" & "\cosFivePIon3"\cr
+ 4 & "\sinPIon4" & "\cosPIon4" & "\sinTwoPIon4" & "\cosTwoPIon4"
+ & "\sinThreePIon4" & "\cosThreePIon4" & "\sinFourPIon4" & "\cosFourPIon4"
+ & "\sinFivePIon4" & "\cosFivePIon4"\cr
+ 5 & "\sinPIon5" & "\cosPIon5" & "\sinTwoPIon5" & "\cosTwoPIon5"
+ & "\sinThreePIon5" & "\cosThreePIon5" & "\sinFourPIon5" & "\cosFourPIon5"
+ & "\sinFivePIon5" & "\cosFivePIon5"\cr
+ 6 & "\sinPIon6" & "\cosPIon6" & "\sinTwoPIon6" & "\cosTwoPIon6"
+ & "\sinThreePIon6" & "\cosThreePIon6" & "\sinFourPIon6" & "\cosFourPIon6"
+ & "\sinFivePIon6" & "\cosFivePIon6"\cr
+ 7 & "\sinPIon7" & "\cosPIon7" & "\sinTwoPIon7" & "\cosTwoPIon7"
+ & "\sinThreePIon7" & "\cosThreePIon7" & "\sinFourPIon7" & "\cosFourPIon7"
+ & "\sinFivePIon7" & "\cosFivePIon7"\cr
+ 8 & "\sinPIon8" & "\cosPIon8" & "\sinTwoPIon8" & "\cosTwoPIon8"
+ & "\sinThreePIon8" & "\cosThreePIon8" & "\sinFourPIon8" & "\cosFourPIon8"
+ & "\sinFivePIon8" & "\cosFivePIon8"\cr
+ 9 & "\sinPIon9" & "\cosPIon9" & "\sinTwoPIon9" & "\cosTwoPIon9"
+ & "\sinThreePIon9" & "\cosThreePIon9" & "\sinFourPIon9" & "\cosFourPIon9"
+ & "\sinFivePIon9" & "\cosFivePIon9"\cr
+10 & "\sinPIon{10}" & "\cosPIon{10}"& "\sinTwoPIon{10}"& "\cosTwoPIon{10}"
+ &"\sinThreePIon{10}"&"\cosThreePIon{10}"&"\sinFourPIon{10}"&"\cosFourPIon{10}"
+ & "\sinFivePIon{10}" & "\cosFivePIon{10}"\cr
+11 & "\sinPIon{11}" & "\cosPIon{11}"& "\sinTwoPIon{11}"& "\cosTwoPIon{11}"
+ &"\sinThreePIon{11}"&"\cosThreePIon{11}"&"\sinFourPIon{11}"&"\cosFourPIon{11}"
+ & "\sinFivePIon{11}" & "\cosFivePIon{11}"\cr
+12 & "\sinPIon{12}" & "\cosPIon{12}"& "\sinTwoPIon{12}"& "\cosTwoPIon{12}"
+ &"\sinThreePIon{12}"&"\cosThreePIon{12}"&"\sinFourPIon{12}"&"\cosFourPIon{12}"
+ & "\sinFivePIon{12}" & "\cosFivePIon{12}"\cr
+\end{tabular*}}
+\caption{Trigonometry tables for Polygon vertices.}
+??=[f.trigonometry]
+\end{figure*}
+
+\DOCMODE(
+\xydef@\xytrigerror@#1#2{\string#1 only works from 0 to 12}
+
+\xydef@\cosPIon#1{\ifcase#1 1\or-1\or0\or.5\or\halfroottwo\or
+ .809017\or\halfrootthree\or.900969\or.92388\or.939693\or.951057\or
+ .959493\or.965926\else1\xytrigerror@\cosPIon{#1}\fi}
+\xydef@\sinPIon#1{\ifcase#1 0\or0\or1\or\halfrootthree\or\halfroottwo\or
+ .587785\or.5\or.433884\or.382683\or.34202\or.309017\or
+ .281733\or.258819\else0\xytrigerror@\sinPIon{#1}\fi}
+
+\xydef@\cosTwoPIon#1{\ifcase#1 1\or1\or-1\or-\cosPIon3\or\cosPIon2\or
+ \sinPIon{10}\or\cosPIon3\or.62349\or\cosPIon4\or
+ .766044\or\cosPIon5\or.841254\or\cosPIon6%
+ \else1\xytrigerror@\cosTwoPIon{#1}\fi}
+\xydef@\sinTwoPIon#1{\ifcase#1 0\or0\or0\or-\sinPIon3\or\sinPIon2\or
+ \cosPIon{10}\or\sinPIon3\or.781831\or\sinPIon4\or
+ .642788\or\sinPIon5\or.540641\or\sinPIon6%
+ \else0\xytrigerror@\sinTwoPIon{#1}\fi}
+
+\xydef@\cosThreePIon#1{\ifcase#1 1\or-1\or0\or-1\or-\cosPIon4\or
+ -\cosPIon5\or\cosPIon2\or.222521\or\sinPIon8\or\cosPIon3\or
+ \sinTwoPIon5\or.654861\or\cosPIon4%
+ \else1\xytrigerror@\cosThreePIon{#1}\fi}
+\xydef@\sinThreePIon#1{\ifcase#1 0\or0\or1\or0\or\sinPIon4\or
+ \sinTwoPIon5\or\sinPIon2\or.974928\or\cosPIon8\or\sinPIon3\or
+ \cosTwoPIon5\or.75575\or\sinPIon4%
+ \else0\xytrigerror@\sinThreePIon{#1}\fi}
+
+\xydef@\cosFourPIon#1{\ifcase#1 1\or1\or1\or-\cosPIon3\or-1\or-\cosPIon5\or
+ \cosTwoPIon3\or-\cosThreePIon7\or0\or.173648\or\cosTwoPIon5\or
+ .415415\or\cosPIon3%
+ \else1\xytrigerror@\cosFourPIon{#1}\fi}
+\xydef@\sinFourPIon#1{\ifcase#1 0\or0\or0\or-\sinPIon3\or0\or\sinPIon5\or
+ \sinTwoPIon3\or\sinThreePIon7\or1\or.984808\or\sinTwoPIon5\or
+ .909632\or\sinPIon3%
+ \else0\xytrigerror@\sinFourPIon{#1}\fi}
+
+\xydef@\cosFivePIon#1{\ifcase#1 1\or-1\or0\or\cosPIon3\or-\cosPIon4\or
+ -1\or-\cosPIon6\or-\cosTwoPIon7\or-\cosThreePIon8\or-\cosFourPIon9\or
+ 0\or.142315\or\sinPIon{12}%
+ \else1\xytrigerror@\cosFivePIon{#1}\fi}
+\xydef@\sinFivePIon#1{\ifcase#1 0\or0\or1\or-\sinPIon3\or-\sinPIon4\or
+ 0\or\sinPIon6\or\sinTwoPIon7\or\sinThreePIon8\or\sinFourPIon9\or1\or
+ .989821\or\cosPIon{12}%
+ \else0\xytrigerror@\sinFivePIon{#1}\fi}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Coordinates for the vertices are read from trigonometry tables using control
+sequences
+%
+\begin{defs}
+ |\cosPIon|$n$ & |\sinPIon|$n$ \cr
+ |\cosTwoPIon|$n$ & |\sinTwoPIon|$n$ \cr
+ |\cosThreePIon|$n$ & |\sinThreePIon|$n$ \cr
+ |\cosFourPIon|$n$ & |\sinFourPIon|$n$ \cr
+ |\cosFivePIon|$n$ & |\sinFivePIon|$n$ \cr
+\end{defs}\unskip\noindent
+%
+which expand to the values of $\cos{\pi\over n}$, $\sin{\pi\over n}$,
+$\cos{2\pi\over n}$, \dots, $\sin{5\pi\over n}$ and are also available for
+other uses. The parameter~$n$ must be a non-negative integer up to~12.
+The complete table is in figure~??[f.trigonometry].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Specific Polygons:}
+
+All the information from the switches is passed as 8 separate
+parameters to a macro appropriate to the number of sides.
+The parameters have the following uses, and are set as shown:
+
+\begin{defs}
+|#1| & pre-arrow: set by |~<<{...}| else |;|\cr
+|#2| & vertex <object>, set by |~*{...}| \cr
+|#3| & prefix for naming \cr
+|#4| & post-vertex: empty with |\ars| else |**@{...}| \cr
+ & ~~where |{...}| is set by |~<{...}| \cr
+|#5| & post-arrow/vertex: set by |~<>{...}| \cr
+|#6| & pre-edge/arrow, set by |~><{...}| \cr
+|#7| & post-edge: empty with |\ars| else |**@{...}| \cr
+ & ~~where |{...}| is set by |~>{...}| \cr
+|#8| & post-arrow/edge, set by |~>>{...}| \cr
+\end{defs}
+
+The organisation of this information is done by |\xyPolygon@@@#1|
+which takes as a single parameter a macro appropriate to the
+number of sides, supplied by |\xypoly@@@|.
+
+\DOCMODE(
+\xydef@\xypoly@@@{\count@=\xypolyNUMSIDES@\relax
+ \ifx\xypolyALIGN@\empty
+ \ifnum\count@<\thr@@\relax\DN@{\xypolytoosmall@{\the\count@}}%
+ \else \advance\count@-\thr@@
+ \ifcase\count@ \DN@{\xyPolygon@@@\xytriangle@@}%
+ \or \DN@{\xyPolygon@@@\xysquare@@}%
+ \or \DN@{\xyPolygon@@@\xypentagon@@}%
+ \or \DN@{\xyPolygon@@@\xyhexagon@@}%
+ \or \DN@{\xyPolygon@@@\xyheptagon@@}%
+ \or \DN@{\xyPolygon@@@\xyoctagon@@}%
+ \or \DN@{\xyPolygon@@@\xynonagon@@}%
+ \or \DN@{\xyPolygon@@@\xydecagon@@}%
+ \or \DN@{\xyPolygon@@@\xyundecagon@@}%
+ \or \DN@{\xyPolygon@@@\xydodecagon@@}%
+ \else \DN@{\xylargePolygon@{0}{\xypolyNUMSIDES@}}%
+ \fi\fi
+ \else
+ \DN@{\xylargePolygon@{\xypolyALIGN@}{\xypolyNUMSIDES@}}%
+ \fi \next@ \xypoly@@@x}
+
+\xydef@\xypoly@@@x{\restore\xypoly@x}
+
+\xydef@\xypolytoosmall@#1{\xyerror@{#1 sides is too few for a polygon}}
+\DOCMODE)
+
+Here is |\xyPolygon@@@|. It constructs a list of tokens to be
+interpreted, after having closed the grouping that was current
+while parsing.
+It starts by setting the value of |\xypolyNUMSIDES@|,
+then a |\save| before adjusting the scale according to the value
+of |\xypolySCALE@|.
+
+\DOCMODE(
+\xydef@\xyPolygon@@@#1{%
+ \toks@={\def\xypolyNUMSIDES@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyNUMSIDES@}\save}%
+%
+ \ifx\empty\xypolySCALE@ \addtotoks@{\POS"}%
+ \else \addtotoks@{\POS;0;}%
+ \expandafter\addtotoks@\expandafter{\xypolySCALE@\relax\POS"}%
+ \fi
+ \expandafter\addtotoks@\expandafter{\xypolyPREFIX@0"\relax}%
+%
+ \ifx\xypreSPOKES@\relax
+ \addtotoks@{#1{;}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyVERTEX@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyPREFIX@}}%
+ \DN@##1\next@{\def\tmp@{**\dir##1}}%
+ \expandafter\next@\expandafter{\xypolySPOKES@}\next@
+ \expandafter\addtotoks@\expandafter{\expandafter{\tmp@}}%
+ \else
+ \expandafter\DN@\expandafter{\expandafter\ar\xypreSPOKES@}%
+ \addtotoks@{#1}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyVERTEX@}}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyPREFIX@}{}}%
+ \fi
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypostSPOKES@}}%
+%
+ \ifx\xypreSIDES@\relax
+ \addtotoks@{{;}}%
+ \DN@##1\next@{\def\tmp@{**\dir##1}}%
+ \expandafter\next@\expandafter{\xypolySIDES@}\next@
+ \expandafter\addtotoks@\expandafter{\expandafter{\tmp@}}%
+ \else
+ \expandafter\DN@\expandafter{\expandafter\ar\xypreSIDES@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\next@}{}}%
+ \fi
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypostSIDES@}}%
+ \ifx\xypolyALIGN@\empty
+ \ifnum\xypolyNUMSIDES@>12\addtotoks@{{0}}\fi
+ \else
+ \expandafter\addtotoks@\expandafter{\expandafter{\xypolyALIGN@}}%
+ \fi
+ \expandafter\DN@\expandafter{\expandafter\endgroup\the\toks@ }%
+ \next@}
+\DOCMODE)
+
+Note how |\endgroup| closes the grouping.
+All the information for the layout of the polygon is contained in
+|\xypolyNUMSIDES@| and the specific polygon macro
+contained in the final |\next@|.
+
+\medskip
+
+Here is where the polygons are defined, individually.
+
+\DOCMODE(
+\xydef@\xytriangle@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(0,1)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(-\cosPIon6, -.5)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon6,-.5)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#33"#6"#31"#7#8\relax }
+
+\xydef@\xysquare@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\halfroottwo,\halfroottwo)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(-\halfroottwo,\halfroottwo)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\halfroottwo,\halfroottwo)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(-\halfroottwo,\halfroottwo)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#34"#6"#31"#7#8\relax }
+
+\xydef@\xypentagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\cosPIon{10},\sinPIon{10})#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(0,1)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\cosPIon{10},\sinPIon{10})#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon5,\cosPIon5)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon5,-\cosPIon5)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#35"#6"#31"#7#8\relax }
+
+\xydef@\xyhexagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(1,0)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(.5,\halfrootthree)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-.5,\halfrootthree)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(1,0)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(.5,\halfrootthree)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(-.5,\halfrootthree)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#36"#6"#31"#7#8\relax }
+
+\xydef@\xyheptagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\sinTwoPIon7,\cosTwoPIon7)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(0,1)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinTwoPIon7,\cosTwoPIon7)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinThreePIon7,\cosThreePIon7)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon7,\cosPIon7)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon7,-\cosPIon7)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinThreePIon7,-\cosThreePIon7)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#37"#6"#31"#7#8\relax }
+
+\xydef@\xyoctagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\cosPIon8,\sinPIon8)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\sinPIon8,\cosPIon8)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon8,-\cosPIon8)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon8,-\sinPIon8)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon8,\sinPIon8)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon8,\cosPIon8)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon8,-\cosPIon8)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon8,-\sinPIon8)#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#38"#6"#31"#7#8\relax }
+
+\xydef@\xynonagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\sinFourPIon9,\cosFourPIon9)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\sinTwoPIon9,\cosTwoPIon9)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(0,1)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinTwoPIon9,\cosTwoPIon9)#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinFourPIon9,\cosFourPIon9)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon6,\sinPIon6)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon9,\cosPIon9)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon9,-\cosPIon9)#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon6,-\sinPIon6)#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#39"#6"#31"#7#8\relax }
+
+\xydef@\xydecagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(1,0)#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\cosPIon5,\sinPIon5)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{10},\cosPIon{10})#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{10},-\cosPIon{10})#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon5,-\sinPIon5)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(1,0)#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon5,\sinPIon5)#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{10},\cosPIon{10})#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{10},-\cosPIon{10})#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon5,-\sinPIon5)#2="#310"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#39"#6"#310"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#310"#6"#31"#7#8\relax }
+
+\xydef@\xyundecagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\sinFourPIon{11},\cosFourPIon{11})#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\sinTwoPIon{11},\cosTwoPIon{11})#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(0,1)#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinTwoPIon{11},\cosTwoPIon{11})#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(-\sinFourPIon{11},\cosFourPIon{11})#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinFivePIon{11},\cosFivePIon{11})#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinThreePIon{11},\cosThreePIon{11})#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{11},\cosPIon{11})#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{11},-\cosPIon{11})#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinThreePIon{11},-\cosThreePIon{11})#2="#310"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#39"#6"#310"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinFivePIon{11},-\cosFivePIon{11})#2="#311"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#310"#6"#311"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#311"#6"#31"#7#8\relax }
+
+\xydef@\xydodecagon@@#1#2#3#4#5#6#7#8{%
+ \xy@@{\xypolynode@=\@ne}%
+ \POS#1"#30"+(\cosPIon{12},\sinPIon{12})#2="#31"#4#5\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#30"#1"#30"+(\halfroottwo,\halfroottwo)#2="#32"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#31"#6"#32"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{12},\cosPIon{12})#2="#33"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#32"#6"#33"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{12},-\cosPIon{12})#2="#34"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#33"#6"#34"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\halfroottwo,-\halfroottwo)#2="#35"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#34"#6"#35"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon{12},-\sinPIon{12})#2="#36"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#35"#6"#36"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\cosPIon{12},\sinPIon{12})#2="#37"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#36"#6"#37"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\halfroottwo,\halfroottwo)#2="#38"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#37"#6"#38"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"-(\sinPIon{12},\cosPIon{12})#2="#39"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#38"#6"#39"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\sinPIon{12},-\cosPIon{12})#2="#310"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#39"#6"#310"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\halfroottwo,-\halfroottwo)#2="#311"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#310"#6"#311"#7#8\relax
+ \xy@@{\advance\xypolynode@\tw@}%
+ \POS"#30"#1"#30"+(\cosPIon{12},-\sinPIon{12})#2="#312"#4#5\relax
+ \xy@@{\advance\xypolynode@\m@ne}%
+ \POS"#311"#6"#312"#7#8\relax
+ \xy@@{\advance\xypolynode@\@ne}%
+ \POS"#312"#6"#31"#7#8\relax }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xylargePolygon@#1#2{%
+ \dimen@=#1\p@
+ \xyPolygon@@@\xypolygon@@}
+% \xyerror@{Sorry, polygons with #2 sides are not implemented; maximum 12.}{}}
+\DOCMODE)
+
+We need a looping construction that will not interfere with others used
+at a high level.
+
+\DOCMODE(
+\xydef@\xypolyrepeat@{\fi}
+\xydef@\xypolybody@{}
+\xydef@\xypolyiterate@{\xypolybody@\expandafter\xypolyiterate@\else\fi}
+\xydef@\xypolyloop@#1\xypolyrepeat@{\def\xypolybody@{#1}\xypolyiterate@}
+\DOCMODE)
+
+The counter |\xypolynode@| keeps track of the current vertex, spoke and side.
+Since the user may choose to place another |\xypolygon| along any such
+piece, it is necessary to calculate the angle for each vertex afresh,
+using only information passed via the parameters |#1|,\dots,|#9|.
+
+\DOCMODE(
+\xydef@\xypolygon@@#1#2#3#4#5#6#7#8#9{\save
+ \vfromcartesianangle@{#9}\edef\next@{\the\X@c,\the\Y@c\addGT@\empty}%
+ \xy@@{\xypolynode@=\@ne}%
+ \toks@={\POS#1"#30"+}%
+ \expandafter\expandafter\expandafter\addtotoks@\expandafter
+ \expandafter\expandafter{\addLT@\empty}%
+ \expandafter\addtotoks@\expandafter{\next@#2="#31"#4#5\relax}%
+ \xy@@\dontleave@ \the\toks@
+%
+ \xypolyloop@
+ \dimen@=360\p@ \count@@=\xypolyNUMSIDES@\relax \advance\dimen@ .5\count@@
+ \divide\dimen@ \xypolyNUMSIDES@ \relax
+ \multiply\dimen@\xypolynode@ \relax \advance\dimen@ #9\p@
+ \edef\tmp@{%
+ \noexpand\vfromcartesianangle@{\expandafter\removePT@\the\dimen@}}%
+ \tmp@ \edef\next@{\the\X@c,\the\Y@c\addGT@\empty}%
+ \xy@@{\advance\xypolynode@\@ne}\count@=\xypolynode@
+ \toks@={\POS"#30"#1"#30"+}\edef\nextii@{\the\count@}%
+ \expandafter\expandafter\expandafter\addtotoks@\expandafter
+ \expandafter\expandafter{\addLT@\space}%
+ \expandafter\addtotoks@\expandafter{\next@#2="#3}%
+ \expandafter\addtotoks@\expandafter{\nextii@"#4#5\relax}%
+ \the\toks@
+%
+ \count@=\xypolynode@ \xy@@{\advance\xypolynode@\m@ne}%
+ \toks@={\POS"#3}\expandafter\addtotoks@\expandafter{\the\xypolynode@"#6"#3}%
+ \expandafter\addtotoks@\expandafter{\the\count@"#7#8\relax}%
+ \the\toks@
+ \xy@@{\advance\xypolynode@\@ne}\count@=\xypolyNUMSIDES@ \relax
+ \ifnum\xypolynode@<\count@ \relax \xypolyrepeat@
+%
+ \toks@={\POS"#3}%
+ \expandafter\addtotoks@\expandafter{\xypolyNUMSIDES@"#6"#31"#7#8\relax}%
+ \the\toks@ \restore }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+
+\xyendinput
+
+% $Log: xypoly.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 09:28:35 ross
+% cosmetic changes in documentation
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.12 1994/10/25 03:01:14 ross
+% Final 3beta release [bug fixes & AMS-LaTeX fitting].
+%
+% Created by Ross Moore, September 1994.
+
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-c.doc b/Master/texmf-dist/source/generic/xypic/xyps-c.doc
new file mode 100644
index 00000000000..4c3857ceb0c
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-c.doc
@@ -0,0 +1,187 @@
+%% $Id: xyps-c.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Colour extension'' PostScript backend support.
+%% Copyright (c) 1993-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-cloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-cloaded\endcsname=\empty \xycatcodes
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Colour}
+
+The included file |xyps-c.tex| (version \stripRCS$Revision: 3.7 $) provides
+\PS\ support for the effects defined in the |color| extension
+in~\S??g[:color].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The \PS\ style methods are required, so ensure that they are loaded.
+
+\DOCMODE(
+\expandafter\ifx \csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This file is loaded and its effects are activated automatically whenever
+|\xyoption{color}| is requested and the current <driver> supports
+colours using \PS. Should there be any need to turn off this support,
+the following commands are available; they obey usual \TeX\ groupings.
+%
+\begin{defs}
+|\NoPScolor| & remove \PS\ support\kern-50pt\cr
+|\UsePScolor| & reinstate \PS.
+\end{defs}
+%
+Without \PS\ support some drivers may still be able to provide some
+support for colours. These commands are not guaranteed to work adequately
+with all drivers. They are provided primarily for testing and
+trouble-shooting; \eg~with <driver> configurations untested by the
+authors of \Xy-pic, who should be notified of any difficulties.
+
+\DOCMODE(
+\xydef@\UsePScolor{\installPScolor@}
+\xydef@\NoPScolor{\UnloadColor@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+Installation consists of rebinding the macros |\xycolor@| and |\newxycolor@|
+and of reloading the standard colours to include a description for \PS.
+This installation should be delayed till after |color| and |ps| themselves
+have been installed.
+
+\DOCMODE(
+\xydef@\installPScolor@{\installPSstyle@
+ \let\xymath@=\xyPSmath@ \let\xynomath@=\xyPSnomath@
+ \let\checkxyPScolor@=\checkxyPScolor@@
+ \let\xycolor@@=\xyPScolor@@
+ \xystandardcolors@
+ \xyuncatcodes }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+All effects defined in the |color| extension can
+be implemented using the \PS\ dictionary, loaded by |xyps-ps|.
+This file provides ``generic'' \PS\ code which is known to work
+correctly with most drivers. No attempt is made to provide special
+code for particular drivers; for driver-specific variations, consult
+the appropriate |xy|<driver>|.doc| file.
+
+\DOCMODE(
+\xydef@\xyPSmath@{\hbox\bgroup\dimen@=.55ex \checkxyPScolor@ \xyinside@}
+\xydef@\xyPSnomath@{\hbox\bgroup\dimen@=\z@ \checkxyPScolor@ \xyinside@}
+
+\xydef@\checkxyPScolor@@{\xycolor@raw@@{}\let\checkxyPScolor@=\relax}
+\xylet@\checkxyPScolor@=\relax
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xyPSnewcolor@#1#2#3#4#5{%
+ \expandafter\DN@\expandafter{\csname shape [#1]\endcsname}%
+ \DNii@{\relax}\ifx\next@\nextii@\newxycolor{#1}{}\relax\fi
+ \DNii@{#4}\ifx\nextii@\empty
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPScolor@{#2 #3}}\else
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPScolor@{#4}}\fi
+ \ifx\nextii@\empty\expandafter\def\next@{\xyPSnotimplemented@@`#1'@@}%
+ \else
+ \edef\tmp@{\noexpand\let\expandafter\noexpand\next@
+ \expandafter\noexpand\nextii@}\expandafter\tmp@\fi }
+
+\xydef@\xyPScolor@{\ifPSspecials@\expandafter\xyPScolor@@
+ \else\expandafter\eat@\fi}
+\xydef@\xyPScolor@@#1{\bgroup \checkXyStyle@
+ \def\preStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpre@}}%
+ \def\postStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpost@}}%
+ \let\modPSboxz@=\modXYstyle@ \xyPS@color@@{#1}%
+ \toks@={\egroup\let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
+ \the\toks@ }
+
+%\xydef@\xyPS@color@@#1{#1 /xycolor{#1}def }
+\xydef@\xyPS@color@@#1{\xyPSsplitPS@{{#1}cc}{}}
+\xydef@\xycolor@raw@@#1{\PSraw@@{xyc}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-c.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.3 1996/12/18 10:05:50 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% NEW for version 2.9 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-col.doc b/Master/texmf-dist/source/generic/xypic/xyps-col.doc
new file mode 100644
index 00000000000..886c891edf5
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-col.doc
@@ -0,0 +1,165 @@
+%% $Id: xyps-col.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Crayola colour names'' PostScript colour support.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+%\xyprovide{ps-col}{Crayola Colours}{\stripRCS$Revision: 3.7 $}%
+% {Ross Moore}{ross@mpce.mq.edu.au}%
+% {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This option provides definitions for the 68 colours recognised by name by
+Tomas Rokicki's |dvips| driver~\cite{dvips}. These colours become available
+for use in \Xy-pic pictures and diagrams, as |[|<shape>|]| modifiers.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+Only makes sense to load this after |color| and with a <driver> that
+supports it. Indeed this file should only be called from a <driver>-file.
+
+\DOCMODE(
+\xyrequire{color}\xycatcodes
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The information has been copied from Rokicki's |color.pro| \PS\ prolog file:
+``There are 68 predefined colours, with names taken primarily from the
+Crayola crayon box of 64 colours''~\cite[\S16.1]{dvips}.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Different <driver>s may redefine the |\xynewcolor@| macro to set the colour
+by name or by the cmyk-values.
+
+\DOCMODE(
+\newxycolor@{GreenYellow}{0.15 0 0.69 0}{cmyk}{}{}%
+\newxycolor@{Yellow}{0 0 1. 0}{cmyk}{}{}%
+\newxycolor@{Goldenrod}{0 0.10 0.84 0}{cmyk}{}{}%
+\newxycolor@{Dandelion}{0 0.29 0.84 0}{cmyk}{}{}%
+\newxycolor@{Apricot}{0 0.32 0.52 0}{cmyk}{}{}%
+\newxycolor@{Peach}{0 0.50 0.70 0}{cmyk}{}{}%
+\newxycolor@{Melon}{0 0.46 0.50 0}{cmyk}{}{}%
+\newxycolor@{YellowOrange}{0 0.42 1. 0}{cmyk}{}{}%
+\newxycolor@{Orange}{0 0.61. 0.87 0}{cmyk}{}{}%
+\newxycolor@{BurntOrange}{0 0.51 1. 0}{cmyk}{}{}%
+\newxycolor@{Bittersweet}{0 0.75 1. 0.24}{cmyk}{}{}%
+\newxycolor@{RedOrange}{0 0.77 0.87 0}{cmyk}{}{}%
+\newxycolor@{Mahogany}{0 0.85 0.87 0.35}{cmyk}{}{}%
+\newxycolor@{Maroon}{0 0.87 0.68 0.32}{cmyk}{}{}%
+\newxycolor@{BrickRed}{0 0.89 0.94 0.28}{cmyk}{}{}%
+\newxycolor@{Red}{0 1. 1. 0}{cmyk}{}{}%
+\newxycolor@{OrangeRed}{0 1. 0.50 0}{cmyk}{}{}%
+\newxycolor@{RubineRed}{0 1. 0.13 0}{cmyk}{}{}%
+\newxycolor@{WildStrawberry}{0 0.96 0.39 0}{cmyk}{}{}%
+\newxycolor@{Salmon}{0 0.53 0.38 0}{cmyk}{}{}%
+\newxycolor@{CarnationPink}{0 0.63 0 0}{cmyk}{}{}%
+\newxycolor@{Magenta}{0 1. 0 0}{cmyk}{}{}%
+\newxycolor@{VioletRed}{0 0.81 0 0}{cmyk}{}{}%
+\newxycolor@{Rhodamine}{0 0.82 0 0}{cmyk}{}{}%
+\newxycolor@{Mulberry}{0.34 0.90 0 0.02}{cmyk}{}{}%
+\newxycolor@{RedViolet}{0.07 0.90 0 0.34}{cmyk}{}{}%
+\newxycolor@{Fuchsia}{0.47 0.91 0 0.08}{cmyk}{}{}%
+\newxycolor@{Lavender}{0 0.48 0 0}{cmyk}{}{}%
+\newxycolor@{Thistle}{0.12 0.59 0 0}{cmyk}{}{}%
+\newxycolor@{Orchid}{0.32 0.64 0 0}{cmyk}{}{}%
+\newxycolor@{DarkOrchid}{0.40 0.80 0.20 0}{cmyk}{}{}%
+\newxycolor@{Purple}{0.45 0.86 0 0}{cmyk}{}{}%
+\newxycolor@{Plum}{0.50 1. 0 0}{cmyk}{}{}%
+\newxycolor@{Violet}{0.79 0.88 0 0}{cmyk}{}{}%
+\newxycolor@{RoyalPurple}{0.75 0.90 0 0}{cmyk}{}{}%
+\newxycolor@{BlueViolet}{0.86 0.91 0 0.04}{cmyk}{}{}%
+\newxycolor@{Periwinkle}{0.57 0.55 0 0}{cmyk}{}{}%
+\newxycolor@{CadetBlue}{0.62 0.57 0.23 0}{cmyk}{}{}%
+\newxycolor@{CornflowerBlue}{0.65 0.13 0 0}{cmyk}{}{}%
+\newxycolor@{MidnightBlue}{0.98 0.13 0 0.43}{cmyk}{}{}%
+\newxycolor@{NavyBlue}{0.94 0.54 0 0}{cmyk}{}{}%
+\newxycolor@{RoyalBlue}{1. 0.50 0 0}{cmyk}{}{}%
+\newxycolor@{Blue}{1. 1. 0 0}{cmyk}{}{}%
+\newxycolor@{Cerulean}{0.94 0.11 0 0}{cmyk}{}{}%
+\newxycolor@{Cyan}{1. 0 0 0}{cmyk}{}{}%
+\newxycolor@{ProcessBlue}{0.96 0 0 0}{cmyk}{}{}%
+\newxycolor@{SkyBlue}{0.62 0 0.12 0}{cmyk}{}{}%
+\newxycolor@{Turquoise}{0.85 0 0.20 0}{cmyk}{}{}%
+\newxycolor@{TealBlue}{0.86 0 0.34 0.02}{cmyk}{}{}%
+\newxycolor@{Aquamarine}{0.82 0 0.30 0}{cmyk}{}{}%
+\newxycolor@{BlueGreen}{0.85 0 0.33 0}{cmyk}{}{}%
+\newxycolor@{Emerald}{1. 0 0.50 0}{cmyk}{}{}%
+\newxycolor@{JungleGreen}{0.99 0 0.52 0}{cmyk}{}{}%
+\newxycolor@{SeaGreen}{0.69 0 0.50 0}{cmyk}{}{}%
+\newxycolor@{Green}{1. 0 1. 0}{cmyk}{}{}%
+\newxycolor@{ForestGreen}{0.91 0 0.88 0.12}{cmyk}{}{}%
+\newxycolor@{PineGreen}{0.92 0 0.59 0.25}{cmyk}{}{}%
+\newxycolor@{LimeGreen}{0.50 0 1. 0}{cmyk}{}{}%
+\newxycolor@{YellowGreen}{0.44 0 0.74 0}{cmyk}{}{}%
+\newxycolor@{SpringGreen}{0.26 0 0.76 0}{cmyk}{}{}%
+\newxycolor@{OliveGreen}{0.64 0 0.95 0.40}{cmyk}{}{}%
+\newxycolor@{RawSienna}{0 0.72 1. 0.45}{cmyk}{}{}%
+\newxycolor@{Sepia}{0 0.83 1. 0.70}{cmyk}{}{}%
+\newxycolor@{Brown}{0 0.81 1. 0.60}{cmyk}{}{}%
+\newxycolor@{Tan}{0.14 0.42 0.56 0}{cmyk}{}{}%
+\newxycolor@{Gray}{0 0 0 0.50}{cmyk}{}{}%
+\newxycolor@{Black}{0 0 0 1.}{cmyk}{}{}%
+\newxycolor@{White}{0 0 0 0}{cmyk}{}{}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-col.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.3 1996/12/18 10:02:23 ross
+% no changes
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.12 1995/04/03 05:42:16 ross
+%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-f.doc b/Master/texmf-dist/source/generic/xypic/xyps-f.doc
new file mode 100644
index 00000000000..fc3794d5815
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-f.doc
@@ -0,0 +1,270 @@
+%% $Id: xyps-f.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Frame extension'' PostScript backend support.
+%% Copyright (c) 1995-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-floaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-floaded\endcsname=\empty \xycatcodes
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Frames}
+
+The included file |xyps-f.tex| (version \stripRCS$Revision: 3.7 $) provides
+\PS\ support for the effects defined in the |frame| extension described
+in~\S??g[:frame]. It implements some effects otherwise unattainable.
+
+This file is loaded and its effects are activated automatically whenever
+|\xyoption{frame}| is requested and the current <driver> supports \PS\
+effects for frames. Should there be any need to turn off this support, the
+following commands are available; they obey usual \TeX\ groupings.
+%
+\begin{defs}
+|\NoPSframes| & remove \PS\ support\kern-50pt \cr
+|\UsePSframes| & reinstate \PS.
+\end{defs}
+%
+Without \PS\ support ellipses may be shown as circles and all filled
+regions may be represented as black rectangles.
+These commands are provided primarily for testing and trouble-shooting;
+\eg~with <driver> configurations untested by the authors of \Xy-pic,
+who should be notified of any difficulties.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+The <driver>-file must call the following macro to rebind control sequences
+defined in |xyframe|, thereby allowing the \PS\ methods to be used.
+
+\DOCMODE(
+\xydef@\installPSframes@{%
+ \let\framed@body@@=\xyPSframed@body@
+ \let\circled@x@@=\xyPScircled@x@
+ \let\ellipsed@x@@=\xyPSellipsed@x@
+ \installPSfills@
+ \xyuncatcodes}
+
+\xydef@\UsePSframes{\installPSframes@}
+\xydef@\NoPSframes{\UnloadFrames@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Frames: solid, dotted and dashed}
+
+For solid frames use \PS\ ovals, otherwise adjust the spacing between dashes
+or dots according to the lengths, both vertical and horizontal.
+
+\DOCMODE(
+\xydef@\xyPSframed@body@{\DN@{\framed@body@}%
+ \ifx\framehfill\frm@solidh@@
+ \DN@{\xyPSframed@oval@\xyPSoval@Special}%
+% \else\ifdim\frmradius@@=\z@\else
+ \else\ifdim\R@=\z@\else
+ \ifx\framehfill\frm@dashh@@
+ \DN@{\xyPSframed@oval@\xyPSdashoval@Special}%
+ \else\ifx\framehfill\frm@doth@@
+ \DN@{\xyPSframed@oval@\xyPSdotoval@Special}%
+ \fi\fi
+ \fi\fi \next@ }
+
+\xydef@\xyPSframed@oval@#1{\vglue\U@c
+ \hbox{\hglue\L@c\xypsoval@#1\hglue\R@c}\vglue\D@c}
+
+
+\xydef@\xyPScircled@x@{\DN@{\xyPScircled@x@@\xyPScirc@Special}%
+ \ifx\framehfill\frm@doth@@
+ \DN@{\xyPScircled@x@@\xyPSdotcirc@Special}%
+ \else\ifx\framehfill\frm@dashh@@
+ \DN@{\xyPScircled@x@@\xyPSdashcirc@Special}%
+ \fi\fi \next@ }
+
+\xydef@\xyPScircled@x@@#1{\vglue2\R@
+ \hbox{\hglue2\R@\xypscircle@#1\hglue2\R@}%
+ \vglue2\R@}
+\DOCMODE)
+
+In practice the parameters |#1| and |#2| will hold <dimen>s.
+
+\DOCMODE(
+\xydef@\xyPSellipsed@x@#1#2{%
+ \DN@{\xyPSellipsed@x@@\xyPScirc@Special}%
+ \ifx\framehfill\frm@doth@@
+ \DN@{\xyPSellipsed@x@@\xyPSdotcirc@Special}%
+ \else\ifx\framehfill\frm@dashh@@
+ \DN@{\xyPSellipsed@x@@\xyPSdashcirc@Special}%
+ \fi\fi \next@{#1}{#2}}
+
+\xydef@\xyPSellipsed@x@@#1#2#3{\vglue #3\vglue #3\relax
+ \hbox{\L@c = #2\relax \R@c=\L@c \D@c = #3\relax \U@c=\D@c
+ \hglue#2\hglue#2\relax\xypsellipse@#1\hglue#2\hglue#2\relax}%
+ \vglue #3\vglue #3\relax}
+\DOCMODE)
+
+
+These may be used for dashed frames.
+
+\DOCMODE(
+\xydef@\xyPSdashhfill@{{\SemiDirectionChar=95 \Direction=3072 \xyPSdash@}}
+\xydef@\xyPSdashvfill@{{\SemiDirection=31 \Direction=1023 \xyPSdash@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{ovals and circles}
+
+The width, height, corner-radius are available as |\dimen@i|, |\dimen@ii|
+and |\R@| respectively; we only need |\R@| here,
+since the extents hold the real information that we need.
+
+\DOCMODE(
+\xydef@\xypsoval@#1{%
+ \dimen@=\L@c \advance\dimen@\R@c
+ \dimen@ii=\U@c \advance\dimen@ii\D@c
+ \ifdim\dimen@ii<\dimen@ \relax \dimen@=\dimen@ii\fi \divide\dimen@\tw@
+% \R@=\frmradius@@
+ \ifdim\R@>\dimen@ \relax \R@=\dimen@ \fi
+ \D@c=-\D@c \L@c=-\L@c
+ \edef\tmp@{\expandafter\removePT@\the\R@
+ \space\expandafter\removePT@\the\R@c
+ \space\expandafter\removePT@\the\D@c
+ \space\expandafter\removePT@\the\L@c
+ \space\expandafter\removePT@\the\U@c }%
+ \expandafter#1\expandafter{\tmp@}}
+
+\xydef@\xypscircle@#1{\dimen@=\R@
+ \edef\tmp@{\expandafter\removePT@\the\dimen@}%
+ \expandafter#1\expandafter{\tmp@}}
+
+\xydef@\xypsellipse@#1{\edef\tmp@{%
+ \expandafter\removePT@\the\U@c \space
+ \expandafter\removePT@\the\D@c \space
+ \expandafter\removePT@\the\L@c \space
+ \expandafter\removePT@\the\R@c }%
+ \expandafter#1\expandafter{\tmp@}}
+
+\xydef@\xyPSoval@Special#1{\PSmacro@{#1 ov}}
+\xydef@\xyPScirc@Special#1{\PSmacro@{#1 ox}}
+\xydef@\xyPSdotcirc@Special#1{\PSmacro@{#1 ot}}
+\xydef@\xyPSdashcirc@Special#1{\PSmacro@{#1 od}}
+\xydef@\xyPSdotoval@Special#1{\PSmacro@{#1 vt}}
+\xydef@\xyPSdashoval@Special#1{\PSmacro@{#1 vd}}
+\DOCMODE)
+
+The \PS\ operators |ov|, |ox| etc. are defined within |xyps-pro|,
+having scope limited to |XYdict| and sub-dictionaries.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Filled regions}
+
+\DOCMODE(
+\xydef@\xyPSfilledRegion#1#2{\setboxz@h{\lower\D@c\vbox{%
+ \vglue\U@c\hbox{#1#2\empty\hglue\L@c\hglue\R@c}\vglue\D@c}}%
+ \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}
+
+\xydef@\filledRectangle@PS{%
+ \xyPSfilledRegion{\xypsoval@\xyPSfilloval@Special}}
+\xydef@\filledCircle@PS#1{{\R@c=\R@ \L@c=\R@ \U@c=\R@ \D@c=\R@
+ \xyPSfilledRegion{\xypscircle@\xyPSfillcirc@Special}#1}}
+\xydef@\filledEllipse@PS{%
+ \xyPSfilledRegion{\xypsellipse@\xyPSfillellipse@Special}}
+\xydef@\filledOval@PS{%
+ \xyPSfilledRegion{\xypsoval@\xyPSfilloval@Special}}
+
+\xydef@\frame@emph@PS#1{\filled@{#1}\relax}
+
+\xydef@\installPSfills@{%
+ \let\frame@emph@@=\frame@emph@PS
+ \let\filledRectangle@@=\filledRectangle@PS
+ \let\filledOval@@=\filledOval@PS
+ \let\filledCircle@@=\filledCircle@PS
+ \let\filledEllipse@@=\filledEllipse@PS
+}
+\DOCMODE)
+
+Rectangles are treated as a special case of ovals.
+The |#2| parameter signifies whether the outline of the object
+should also be stroked (|#2|=|\relax|) after being filled.
+Such a stroke is always in black.
+
+\DOCMODE(
+%\xydef@\xyPSfillrect@Special#1#2{%
+% \ifx#2\relax\PSmacro@{#1 sfr}%
+% \else\PSmacro@{#1 fr}\fi}
+\xydef@\xyPSfilloval@Special#1#2{%
+ \ifx#2\relax\PSmacro@{#1 sfo}%
+ \else\PSmacro@{#1 fo}\fi}
+\xydef@\xyPSfillcirc@Special#1#2{%
+ \ifx#2\relax\PSmacro@{#1 sfc}%
+ \else\PSmacro@{#1 fc}\fi}
+\xydef@\xyPSfillellipse@Special#1#2{%
+ \ifx#2\relax\PSmacro@{#1 sfe}%
+ \else\PSmacro@{#1 fe}\fi}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-f.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 10:07:22 ross
+% cosmetic changes to macro-names
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% NEW for version 3.0 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-l.doc b/Master/texmf-dist/source/generic/xypic/xyps-l.doc
new file mode 100644
index 00000000000..8dc1d1a1ae4
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-l.doc
@@ -0,0 +1,195 @@
+%% $Id: xyps-l.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Line extension'' PostScript backend support.
+%% Copyright (c) 1993-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-lloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-lloaded\endcsname=\empty \xycatcodes
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Line-styles}
+
+The included file |xyps-l.tex| (version \stripRCS$Revision: 3.7 $) provides
+\PS\ support for the effects defined in the |line| extension described
+in~\S??g[:line].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The \PS\ style methods are required, so ensure that they are loaded.
+
+\DOCMODE(
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This file is loaded and its effects are activated automatically whenever
+|\xyoption{line}| is requested and the current <driver> supports
+\PS\ line styles. Should there be any need to turn off this support,
+the following commands are available; they obey usual \TeX\ groupings.
+%
+\begin{defs}
+|\NoPSlines| & remove \PS\ support\kern-50pt\cr
+|\UsePSlines| & reinstate \PS.
+\end{defs}
+%
+Without \PS\ support lines can be expected to be displayed in the default
+style, having thickness of $.4$pt.
+These commands are provided primarily for testing and trouble-shooting;
+\eg~with <driver> configurations untested by the authors of \Xy-pic,
+who should be notified of any difficulties.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+The <driver>-file must call the following macro to rebind a control sequence
+defined in |xyline|, thereby allowing the \PS\ method to be used.
+The purpose of the |\xyPSlinew@| hook is to allow the \PS\ style sequencing
+method to be used with other back-ends, changing just the contents of the
+|\special|s actually placed.
+
+\DOCMODE(
+\xydef@\installPSline@{\installPSstyle@
+ \installPSlinestyles@ \installPSpolylines@ }
+
+\xydef@\UsePSlines{\installPSline@}
+\xydef@\NoPSlines{\UnloadLine@\relax}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{widths, joins and caps}
+
+This, and the rebindings below, is all that is needed for the cleaner,
+more sophisticated way.
+
+\DOCMODE(
+\xydef@\xyPSlineSpecial@#1{\addtostyletoks@{ #1 lw}}
+\xydef@\xyPScapSpecial@#1{\addtostyletoks@{ #1 lc}}
+\xydef@\xyPSjoinSpecial@#1{\addtostyletoks@{ #1 lj}}
+\xydef@\xyPSmiterSpecial@#1{\addtostyletoks@{ #1 ml}}
+
+\xydef@\installPSlinestyles@{%
+ \let\xylinewidth@@=\xylinewidth@
+ \let\transxyline@@=\transxyline@
+ \let\xylineSpecial@@=\xyPSlineSpecial@
+ \let\resetxyline@@=\resetxyline@i
+%
+ \let\xy@linecap@@=\xy@linecap@
+ \let\xycapSpecial@@=\xyPScapSpecial@
+ \let\resetxylinecap@@=\resetxylinecap@i
+%
+ \let\xy@linejoin@@=\xy@linejoin@
+ \let\xyjoinSpecial@@=\xyPSjoinSpecial@
+ \let\resetxylinejoin@@=\resetxylinejoin@i
+%
+ \let\xy@linemiter@@=\xy@linemiter@
+ \let\xymiterSpecial@@=\xyPSmiterSpecial@
+ \let\resetxylinemiter@@=\resetxylinemiter@i
+}
+\DOCMODE)
+
+The \PS\ operators |lw|, |lc|, |lj|, |ml| are defined in |xyps-ps| to set the
+|linewidth|, |linecap|, |linejoin|, |miterlimit| graphics-state parameters,
+respectively.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Poly-lines}
+
+\DOCMODE(
+\xydef@\xypolylinePS@Special#1{\PSmacro@{#1 pl}}
+\xydef@\xypolydotPS@Special#1{\PSmacro@{#1 pt}}
+\xydef@\xypolydashPS@Special#1{\PSmacro@{#1 pd}}
+\xydef@\xypolyfillPS@Special#1{\PSmacro@{#1 pf}}
+\xydef@\xypolyeofillPS@Special#1{\PSmacro@{#1 pe}}
+
+\xydef@\installPSpolylines@{%
+ \let\xypolyline@Special=\xypolylinePS@Special
+ \let\xypolydot@Special=\xypolydotPS@Special
+ \let\xypolydash@Special=\xypolydashPS@Special
+ \let\xypolyfill@Special=\xypolyfillPS@Special
+ \let\xypolyeofill@Special=\xypolyeofillPS@Special
+ \let\xy@polystyle@@=\xy@polystyle@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-l.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 10:05:50 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% NEW for version 2.9 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-pro.doc b/Master/texmf-dist/source/generic/xypic/xyps-pro.doc
new file mode 100644
index 00000000000..165e601261f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-pro.doc
@@ -0,0 +1,253 @@
+%% $Id: xyps-pro.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``PostScript Prolog'' for PostScript support.
+%% Copyright (c) 1993-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+
+%\expandafter\let\csname xyps-proloaded\endcsname=\empty %
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This included file (version \stripRCS$Revision: 3.7 $) provides the \PS\ prolog
+file. This contains the definitions of the main \PS\ programming structures
+required to support the \PS\ effects available in \Xy-pic. A separate file
+|xypsdict.doc| describes the extra \PS\ needed to support the \PS\ back-end.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\paragraph*{\PS\ Prolog}
+
+This creates the \PS\ dictionary called |XYdict| within the usual |userdict|
+or any other dictionary supplied by the specific driver.
+Commands loaded here are ones which may by used by extensions other than the
+\PS\ back-end, which loads many more commands into this dictionary using
+the code to be found in |xypsdict.tex|.
+
+\DOCMODE(
+\begingroup \xycatcodes%
+ \count@=\xydashl@\relax \count@@=\xydashw@\relax%
+ \let\firstPS@@=\relax%
+ \xyPSobeylines@@%
+%
+\PSspecialdict@@{%
+/XYdict where not{250 dict /XYdict exch def
+ /xy{mark exch XYdict begin countdictstack /xylevel exch def
+ xyopen xycolor mark xypatt xypattern stopped xyclose end
+ cleartomark}def /xyg{gsave xy}def
+ /xyf{currentfont exch xy grestore setfont}def
+ /xycc{{xychgcol}xy}def /xyc{XYdict begin xycolstore end}def
+ /xyx{/xyYpos exch def /xyXpos exch def}def
+ /xyp{currentpoint xyx}def %/xycp{currentpoint xyx}def
+ /xyd{setupDirection XYdirection 2 mul}def
+ /xyct{currentpoint xyt 2 copy 6 2 roll}def
+ /xyt{xyXpos xyYpos 2 copy translate}def /xyr{neg rotate xynt}def
+ /xyrs{neg rotate 3 -1 roll sub neg 3 1 roll sub exch moveto xynt}def
+ /xynt{neg exch neg exch translate}def /xys{scale xynt}def
+ /xyss{scale 3 -1 roll sub neg 3 1 roll sub exch moveto xynt}def
+ /xyi{0 0 transform grestore gsave itransform}def
+ }if}%
+%
+\tmp@false\def\do#1{\DN@{#1}\ifx\next@\nextii@\tmp@true\fi}%
+\DNii@{17oztex}\xydriversselected@@\iftmp@\PSspecialdict@@{%
+ /@boxy{prespecialVM restore grestore}def
+ /@eoxy{gsave /prespecialVM save def}def
+ }%
+\else \DNii@{oztex}\xydriversselected@@\iftmp@\PSspecialdict@@{%
+ /@oxy{prespecialVM restore grestore}def
+ /@oxy{gsave /prespecialVM save def}def
+ }\fi\fi%
+%
+\PSdict@@{/XYdict where pop begin XYdict begin}%
+%
+%\PSspecialdict@@{%
+\PSdict@@{%
+ /xyopen{currentdict /XYddict known{XYddict null eq{}
+ {XYddict begin xyopen}ifelse}if}def
+ /xyclose{countdictstack -1 xylevel 1 add{pop end}for}def
+ /xychgcol{/xycolor exch def}def /xysetcol{xypush xychgcol}def
+}%
+\PSdict@@{%
+ /xypush{16 dict /XYddict exch def XYddict begin}def
+ /undef where
+ {pop /xypop{countdictstack xylevel eq{}{end}ifelse
+ currentdict /XYddict undef}def}
+ {/xypop{countdictstack xylevel eq{}{end}ifelse
+ /XYddict null def}def}ifelse
+ /pu /xypush load def /pp /xypop load def}%
+%
+\PSdict@@{%
+ /xypspt{72 72.27 div dup scale}bind def /pscorrect{.85 mul}bind def
+ /gstartxy{gsave xypspt xywidth xycap xyjoin xymiter newpath 0 0 moveto}def
+% /grulexy{gsave xyrulth newpath 0 0 moveto}def
+ /xypath{gstartxy rmoveto counttomark 2 idiv -1 1{pop lineto}for}def
+ /xystroke{stroke grestore}bind def
+ /xyfill{closepath fill grestore}bind def
+ /xystfil{closepath gsave fill grestore 0 setgray
+ 0 setlinewidth xystroke}bind def
+ /xyeofill{closepath eofill grestore}bind def
+% /xyclip{closepath fill grestore}bind def
+% /xyeoclip{closepath eofill grestore}bind def
+}%
+\PSdict@@{%
+ /xypolyline{xypath xystroke}def /xypolyfill{xypath xyfill}def
+ /xydotsep{/@ currentlinewidth 2 mul def}def
+ /xypolydot{xypath xydotsep [xydt @] 0 setdash xystroke}def
+ /xypolydash{xypath xydotsep [@ @] 0 setdash xystroke}def
+ /xypolyeofill{xypath xyeofill}def /pe /xypolyeofill load def
+ /pl /xypolyline load def /pf /xypolyfill load def
+ /pt /xypolydot load def /pd /xypolydash load def }%
+%
+\PSdict@@{%
+ /arc4pop{arcto 4{pop}repeat}bind def
+ /xyoval{gstartxy oval closepath xystroke}def
+% /xycircle{gstartxy dup dup neg dup dup neg oval xystroke}def
+ /xycircle{gstartxy circle xystroke}def
+ /circle{dup 0 moveto 0 0 3 -1 roll 0 360 arc}def
+ /oval{newpath 2 copy exch 5 index add 2 div exch 3 copy 10 3 roll
+ moveto 1 index dup 5 1 roll 3 index 7 index arc4pop
+ dup dup 4 1 roll 4 index exch 6 index arc4pop
+ 1 index dup 8 1 roll 4 index 4 index arc4pop
+ arc4pop closepath}def
+ /xyellipse{gstartxy counttomark 1 gt{squarify pop pop 1}if
+ circle xystroke}def
+ /ov /xyoval load def /ox /xyellipse load def }%
+%
+\PSdict@@{%
+ /dotit{dup currentlinewidth 6 mul div round div
+ /@ exch def [xydt @] 0 setdash}def
+ /elldash{dup 4 -1 roll 10 exch div dashit}def
+ /ovdash{dup 10 dashit}def
+ /dashit{div round 2 mul div /@ exch def [@ @] 0 setdash}def
+ /dotcirc{gstartxy cirlen dotit circle xystroke}def
+ /dashcirc{gstartxy cirlen dashit circle xystroke}def
+ /dotoval{gstartxy 5 copy ovlen dotit oval xystroke}def
+ /dashoval{gstartxy 5 copy ovlen ovdash oval xystroke}def
+ /cirlen{dup 6.283185 mul}bind def
+ /ovlen{3 -1 roll sub 3 1 roll sub add exch 1.716815 mul sub}def
+ /dotellipse{gstartxy counttomark 1 gt{squarify pop pop 1}if
+ cirlen dotit circle closepath xystroke}def
+ /dashellipse{gstartxy counttomark 1 gt{squarify add 2 div 1}
+ {1 exch 1 exch}ifelse cirlen elldash circle xystroke}def
+ /ot /dotellipse load def /od /dashellipse load def
+ /vt /dotoval load def /vd /dashoval load def }%
+%
+\PSdict@@{%
+ /filloval{gstartxy oval xyfill}def
+ /stfiloval{gstartxy oval xystfil}def
+ /fillcircle{gstartxy circle xyfill}def
+ /stfilcircle{gstartxy circle xystfil}def
+ /fillellipse{gstartxy squarify pop pop 1 circle xyfill}def
+ /stfilellipse{gstartxy squarify pop pop 1 circle xystfil}def
+ /squarify{4 copy sub 2 div 3 1 roll sub 2 div translate
+ add 2 div 3 1 roll add 2 div 2 copy scale
+ 2 copy add 2 div currentlinewidth exch div setlinewidth
+ newpath}def
+ /fe /fillellipse load def /sfe /stfilellipse load def
+ /fo /filloval load def /sfo /stfiloval load def
+ /fc /fillcircle load def /sfc /stfilcircle load def }%
+%
+\PSdict@@{%
+ /xywidth{.4 pscorrect setlinewidth}bind def
+ /xydash{[] 0 setdash}bind def /xycap{1 setlinecap}bind def
+ /xyjoin{1 setlinejoin}bind def /xymiter{10 setmiterlimit}bind def
+}%
+\PSdict@@{%
+ /cc{dup exec xychgcol}def
+ /lw{dup setlinewidth /@l exch def
+ /xywidth{@l setlinewidth}bind def}def
+ /lc{dup setlinecap /@c exch def
+ /xycap{@c setlinecap}bind def}def
+ /lj{dup setlinejoin /@j exch def
+ /xyjoin{@j setlinejoin}bind def}def
+ /ml{dup setmitrelimit /@m exch def
+ /xymiter{@m setmitrelimit}bind def}def
+}%
+\PSdict@@{%
+ /setupDirection{dup -2048 lt{3072 add neg 1024 exch}
+ {dup 0 lt{1024 add neg -1024}{dup 2048 lt{1024 sub -1024 exch}
+ {3072 sub 1024}ifelse}ifelse}ifelse atan
+ dup 180 gt{360 sub}if dup /XYdirection exch def rotate}def
+ }%
+\PSdict@@{%
+ userdict begin
+ /gray{setgray}bind def /gray@{setgray}bind def
+ /rgb{setrgbcolor}bind def /rgb@{setrgbcolor}bind def
+ /hsb{sethsbcolor}bind def /hsb@{sethsbcolor}bind def
+ /setcmykcolor where{pop}{/setcmykcolor{dup 3 1 roll dup 5 1 roll
+ exch sub 1 add 5 1 roll exch sub 1 add 4 1 roll
+ exch sub 1 add 3 1 roll setrgbcolor}bind def}ifelse
+ /cmyk{setcmykcolor}bind def /cmyk@{setcmykcolor}bind def
+ /sethalftone where{/sethalftone load /tone exch def}if
+ /xycolarray 3 array def /xycolstore{currentrgbcolor 2 -1 0
+ {exch xycolarray 3 1 roll put}for}def xycolstore
+ /xycolor{0 1 2{xycolarray exch get}for setrgbcolor}def
+ /xypatt{}def /xypattern{cleartomark}bind def
+ end}%
+%
+\PSdict@@{end end}%
+%
+\endgroup%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-pro.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.3 1996/12/18 10:00:34 ross
+% requires larger PostScript dictionary
+% uses \xydriversselected@@ for optional loading with OzTeX
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% NEW for version 3.1 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-ps.doc b/Master/texmf-dist/source/generic/xypic/xyps-ps.doc
new file mode 100644
index 00000000000..c4c4bb4d35c
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-ps.doc
@@ -0,0 +1,750 @@
+%% $Id: xyps-ps.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``PS-PS'' PostScript support.
+%% Copyright (c) 1993-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-psloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-psloaded\endcsname=\empty \xycatcodes
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The included file |xyps-ps.tex| (version\stripRCS$Revision: 3.7 $)
+provides support for \PS\ |\special| commands used by the |ps| backend
+extension as well as \PS-based options, to produce special effects
+not available directly with \TeX.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\paragraph*{\PS\ {\tt\string\special} commands}
+
+The \PS\ |\special|s which are used by \Xy-ps fall into four broad
+classes:
+%
+\begin{enumerate}
+\item execute a piece of code, e.g. to draw some graphic object;
+\item add a new \PS\ definition to the existing dictionary of commands;
+\item change the value of some parameters, storing them for later use; and
+\item read \PS\ commands from a pre-existing file.
+\end{enumerate}
+
+Since different drivers may provide different syntax for these classes
+of command, \Xy-ps has different macros to optimize to interface to the
+different drivers. Initially these control-sequence names are bound to
+macros that do nothing. Upon specifying a driver, they will be bound
+to a macro appropriate for that driver.
+
+\DOCMODE(
+\xylet@\PSmacro@@=\eat@
+\xylet@\PSdict@@=\eat@
+\xylet@\PSspecial@@=\eat@
+\xylet@\PSread@@=\eat@
+\xylet@\PSinclude@@=\eat@
+\xylet@\PSraw@@=\eat@
+\xylet@\xyPSobeylines@@=\relax
+\xylet@\PSspecialdict@@=\eat@
+
+\xydef@\UnloadPSps@{%
+ \let\PSmacro@@=\eat@
+ \let\PSdict@@=\eat@
+ \let\PSspecial@@=\eat@
+ \let\PSread@@=\eat@
+ \let\PSinclude@@=\eat@
+ \let\PSraw@@=\eat@
+ \let\xyPSobeylines@@=\relax
+ \let\PSspecialdict@@=\eat@
+}
+\DOCMODE)
+
+Unloading \PS\ requires also turning off the \PS-backend,
+if it has been loaded.
+
+\DOCMODE(
+\xydef@\UnloadPS@{\UnloadPSps@
+ \expandafter\ifx\csname xypsloaded\endcsname\unknown\PSspecials@false
+ \else\expandafter\NoPSspecials\fi}
+\xylet@\UnloadPS@@=\UnloadPS@
+
+%\xyaddunsupport{ps}\UnloadPS@@
+\DOCMODE)
+
+\DOCMODE(
+\ifx\undefined\dvitype@\xydef@\dvitype@{null}\fi
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Some drivers, in particular versions of \Textures\ earlier than 1.7, require
+the \PS\ dictionary to be included with every page shipped out.
+We do this by providing a routine which rebinds the |\shipout| primitive to
+a macro |\xyPSshipout@| which prepends the \Xy-ps \PS\ dictionary to the box
+being shipped-out. This routine |\@PSshipout| is called, if necessary, when
+the driver has been specified.
+
+\DOCMODE(
+\xylet@\xyrealshipout@=\shipout
+\xydef@\xyPSshipout@{\setbox9=\copy\voidb@x
+ \afterassignment\xyPSshipout@i\setbox9=}
+\xydef@\xyPSshipout@i{\ifvoid9 \expandafter\aftergroup\fi\xyPSshipout@ii}
+\xydef@\xyPSshipout@ii{\xyrealshipout@\vbox{\XYpredict@@\box9}}
+
+\xydef@\@PSshipout{\global\let\shipout=\xyPSshipout@ }
+\DOCMODE)
+
+The box register |\box9| is assumed to be a scratch register, used globally
+according to \TeX\ conventions.
+
+When the \PS\ backend is loaded then we need to rebind |\shipout| to include
+the full dictionary.
+
+\DOCMODE(
+\xydef@\xyPSshipout@PSii{%
+ \ifUsePSdict@@\let\XYshipdict@=\includeXYPSdict@@
+ \else\def\XYshipdict@{\XYpredict@@\XYdict@@}\fi
+ \xyrealshipout@\vbox{\XYshipdict@\box9}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+These two control sequences are used in the DVI-driver files
+to control when the \PS\ <driver> can be altered.
+
+\DOCMODE(
+\xydef@\firstPS@{%\fixedxydriver@
+ \global\let\firstPS@@=\relax \global\let\firstPS@=\relax}
+\xylet@\firstPS@@=\firstPS@
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\subsection{Installation}
+%
+To install use of \PS\ requires loading the \PS\ dictionary.
+However this can only be done when a <driver> is known to be able to
+support it. Hence the |\installxyps@| command should be called only from
+within a <driver>-file.
+
+Furthermore, the <driver>-file should define a value for |\installxyps@@|
+to including anything specific to that <driver>; even if only
+|\let\installxyps@@=\relax|. If |\dumpPSdict| has been specified,
+then the dictionary must be written first, so it can be used with the
+subsequent processing (see the subsection below).
+
+\DOCMODE(
+\ifx\undefined\dumpPSdict@@ \xylet@\dumpPSdict@@=\relax \fi
+
+\xydef@\installxyps@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}\xycatcodes
+ \installxyps@@ \installxyps@x }
+
+\xylet@\installxyps@@=\relax
+\xylet@\setupxyPS@@=\relax
+\xywithoption{ps}{\let\setupxyPS@@=\setupxyPS@}
+
+\xydef@\installxyps@x{\dumpPSdict@@
+ \ifx\xyrealshipout@\undefined \let\xyrealshipout@=\shipout\fi
+ \ifx \shipout \xyrealshipout@
+ \ifUsePSdict@@ \DN@{\includePSmessage@\includeXYPSdict@\message{>}}%
+ \else \DN@{\XYdict@\endXYdict@}\fi
+ \else \DN@{\let\xyPSshipout@ii=\xyPSshipout@PSii \@PSshipout}\fi
+ \let\firstPS@=\relax \next@
+ \let\XYpredict@=\relax
+ \setupxyPS@@ }
+
+\let\realinstallxyps@x=\installxyps@x
+\ifx\undefined\AfterBeginDocument
+ \def\installxyps@x{\xysetup@@{\realinstallxyps@x}}%
+\else
+ \def\installxyps@x{\AfterBeginDocument{\realinstallxyps@x}}%
+\fi
+\DOCMODE)
+
+In case no <driver> was known when a call to the |\installxyps@| method
+was queued, e.g. by |\dumpPSdict{}| before any |\xyoption{|<driver>|}|,
+then a check is made to see there is now a known <driver> which
+supports \PS. If so then this installation is cancelled since another
+should follow, otherwise the default <driver> of |dvips| is assumed.
+The command |\xyPSdriver#1| is provided to allow users to change this
+default <driver>. This may be necessary when multiple <driver>s are
+required and the final one specified does not support \PS.
+
+\DOCMODE(
+\xydef@\xydefaultdriver@{dvips}
+\xydef@\xyPSdriver#1{\def\xydefaultdriver@{#1}}
+
+\xydef@\installxyps@orig{\DN@{}%
+ \ifx\xydriversselected@@\empty
+ \DN@{\expandafter\defaultinstallps@\expandafter{\xydefaultdriver@}}%
+ \else \def\do##1{%
+ \expandafter\ifx\csname##1@xy@ps\endcsname\relax
+ \DN@{\defaultinstallps@{##1}}}%
+ \xydriversselected@@
+ \else \DN@##1{}\fi\fi \next@ }
+
+%\xylet@\installxyps@@=\installxyps@orig
+
+\xydef@\defaultinstallps@#1#2{%
+ \xywarning@{no driver specified, using #1 }%
+ \xyrequire{#1}\csname #1@xy@ps\endcsname{}}
+
+\xydef@\null@xy@ps{\installxyps@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{\PS\ escape}
+??=[postscript escape]
+
+An extra <shape> modifier key allows arbitrary \PS\ code
+to be applied to the current <object>.
+%
+\begin{defs}
+ |[!|<postscript code>|]| & for special effects\cr
+ |[psxy]| & stores current location.\cr
+\end{defs}
+
+\DOCMODE(
+\xydefcsname@{shape [!...]}#1{%\tracingall%
+ \expandafter\ifx\csname xyps-sloaded\endcsname\empty \DN@{\xyPSescapestyle@{#1}@@}%
+ \else\ifxyPSshapes@\DN@{\xyPSshapechar@{#1}@@}%
+ \else \DN@{\xyPScharwarning@}\fi\fi \next@ }
+\xydefcsname@{shape [psxy]}{\ifxyPSshapes@\DN@{\xyPSpsxy@}%
+ \else \DN@{\xyPScharwarning@}\fi \next@ }
+\DOCMODE)
+%
+\noindent
+Normally the <postscript code> will be a simple command to alter the
+\PS\ graphics state:
+e.g. |[!1 0 0 setrgbcolor]| changes the colour used to render parts of
+the <object>.
+Any number of such <shape> modifiers is allowable,
+however it is more efficient
+to combine them into a single modifier, whenever possible.
+
+It is very important that braces |{| and |}| do not
+appear explicitly in any <postscript code>, as this may upset the
+\Xy-pic <object> parsing. However it is acceptable to have a
+control sequence name here, expanding into more
+intricate \PS\ code. This will not be expanded until
+a later (safe) time.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+Due to differences within the DVI-drivers, such simple \PS\
+commands need not affect every part of an <object>.
+In particular the lines, curves and arrowheads generated
+by \Xy-pic use a different mechanism,
+which should give the same result with all drivers.
+This involves redefining some \PS\ procedures
+which are always read prior to rendering one of these objects.
+One simple way to specify a red line is as follows;
+the |xycolor| extension provides more sophisticated support for colour.
+The <shape> modifiers described in the previous section also use
+this mechanism, so should work correctly with all drivers.
+
+\begin{code}
+\def\colorxy(#1){%
+ /xycolor{#1 setrgbcolor}def}
+...
+\connect[!\colorxy(1 0 0)]\dir{-}
+...
+\end{code}
+\displaycode
+
+\noindent
+Note how the braces are inserted within the expansion of the
+control sequence |\colorxy|,
+which happens after parsing of the <connection>.
+The following table shows which graphics parameters are
+treated in this way, their default settings, and the type of
+\PS\ code needed to change them.
+%
+\begin{defs}
+colour &|/xycolor{0 setgray}def| \cr
+line-width&|/xywidth{.4 setlinewidth}def|\kern-7pt \cr
+dashing &|/xydash{[] 0 setdash}def| \cr
+line-cap &|/xycap{1 setlinecap}def| \cr
+line-join &|/xyjoin{1 setlinejoin}def|\kern-7pt \cr
+\end{defs}
+%
+\noindent
+This feature is meant primarily for modifying the rendering
+of objects specified in \TeX\ and \Xy-pic, not for drawing new objects
+within \PS. No guarantee can be given of the current location,
+or scale, which may be different with different drivers.
+However a good \PS\ programmer will be able to overcome
+such difficulties and do much more. To aid in this the special
+modifier |[psxy]| is provided to record the location where the
+reference point of the current <object> will be placed.
+Its coordinates are stored with keys |xyXpos| and |xyYpos|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+When the |\special| is placed the following registers contain important
+values:
+|\L@p| = horizontal displacement of \Xy-pic reference point from
+the \TeX\ reference point (i.e. left-hand end of the box)
+ of the initial object;
+|\D@p| = vertical displacement of \Xy-pic reference point from
+ the \TeX\ reference point (i.e. the baseline) of the initial object;
+|\R@p| = horizontal offset, resulting from <shape> modifiers;
+|\U@p| = vertical offset, initially |-\D@p| but alterable
+ by <shape> modifiers.
+
+\DOCMODE(
+\xydef@\xyPSpsxy@{%
+ \setboxz@h{\dimen@=\L@p \advance\dimen@-\R@p
+ \dimen@ii=-\U@p \raise\dimen@ii\hbox to\z@{%
+ \kern\dimen@\xyPScurrpt@\kern-\dimen@}\boxz@}}%
+
+\xydef@\xyPScurrpt@{\ifxyPSshapes@\expandafter\xyPScurrpt@@\fi}
+\DOCMODE)
+
+It is necessary to know the current \PS\ location.
+Unfortunately the |currentpoint| operator frequently has no value.
+The following code overcomes this difficulty.
+
+Some drivers may need to define this differently...
+
+\DOCMODE(
+\xydef@\xyPScurrpt@@@{\PSspecial@@{xyi}\PSraw@@{userdict begin xyx end}}
+\ifx\undefined\xyPScurrpt@@ \xylet@\xyPScurrpt@@=\xyPScurrpt@@@ \fi
+
+%\xydef@\xyPScurrpt@@@{\PSspecial@@{userdict begin
+% 0 0 transform grestore gsave itransform
+% /xyYpos exch def /xyXpos exch def end}}
+
+%\xydef@\xyPScurrpt@@@{%
+% \PSspecial@@{0 0 transform grestore gsave itransform }%
+% \PSraw@@{userdict begin /xyYpos exch def /xyXpos exch def end}}
+\DOCMODE)
+
+The \PS\ operator called |xyx| is defined below, for storing the
+location placed on the stack by |xyi|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection{Technical Note}:
+The scoping is achieved by using two |\specials| so that the
+resulting \PS\ file should ultimately look like:
+\begin{defs1}
+|... {| special code before|}| <object> |{|special code after|} ...|
+\end{defs1}
+The ``code after'' is to cancel the effect, returning the graphics
+state to what it was prior to the ``code before''.
+Not all DVI-drivers can achieve this sequencing. In particular \OzTeX\
+collects all |\specials| in the DVI-file and places their contents
+at the beginning of the \PS\ file: any effect would be cancelled
+immediately after it has been established.
+
+The user can add code to both parts by expressing the <shape> modifier
+as follows:
+%
+\begin{defs1}
+ ??c![*]\dots|!|<code before>|<>|<code after>|]|\dots\ .\cr
+\end{defs1}
+%
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Further Technical Note}:
+The ``code before'' does two things in addition to that code given
+explicitly by the user. Firstly it issues a |gsave| then it opens
+a new dictionary on the dictionary stack. The ``code after''
+contains the matching |grestore| after closing the new dictionary.
+
+Since objects can be built as |\composite|s and diagrams can be nested,
+there is the possibility of generating long chains of nested
+\PS\ dictionaries. For this reason the dictionary is kept
+small, allowing only 8 key-value pairs to be |def|ined within it.
+If more are required, the user should define a private
+dictionary to hold the extra key-value pairs, making sure that it is
+open when its entries need to be accessed.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xywarnifdefined\xyPSshapechar@
+\xywarnifdefined\xyPSsplitshape@
+
+{\xyuncatcodes \catcode`@=11
+ \gdef\xyPSshapechar@#1@@{\xyPSsplitshape@#1<><>@@}%
+ \gdef\xyPSsplitshape@#1<>#2<>#3@@{\xyPSsplitPS@{#1}{#2}}}
+
+%\xydef@\xyPSsplitPS@#1#2{%\aftergroup\show\aftergroup\relax
+% \def\xyPSpre@{#1}\def\xyPSpost@{#2}\modPSboxz@ }
+
+\xydef@\xyPSrawA@#1{\expandafter\xyPSrawAA@ #1{}}%
+\xydef@\xyPSrawAA@#1#2{\PSraw@@{{pu #1}xyg #2}%
+ \PSmessage{{pu #1}xyg #2}}%
+\xydef@\xyPSrawZ@#1{\PSraw@@{{#1 pp}xyf}\PSmessage{{#1 pp}xyf}}%
+\DOCMODE)
+
+The \PS\ operators |pu|, |pp|, |xyg| and |xyf| are defined below,
+for push/pop of the |XYddict| stack, preceded/followed by a
+|gsave|/|grestore| of the \PS\ graphics state.
+
+\DOCMODE(
+\xydef@\modPSboxz@{%
+ \expandafter\DN@\expandafter{\xyPSpre@{}}\ifx\next@\empty\else
+ \setboxz@h{\expandafter\xyPSrawA@\expandafter{\xyPSpre@{}}\boxz@
+ \expandafter\xyPSrawZ@\expandafter{\xyPSpost@}}\DN@{}\fi}%
+
+\xydef@\modPSdrop@{%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawA@\expandafter{\xyPSpre@{}}}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{\nextii@ ##1}}%
+ \expandafter\next@\expandafter{\Drop@@}%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawZ@\expandafter{\xyPSpost@}}%
+ \DN@##1{\expandafter\def\expandafter\Drop@@\expandafter{\tmp@ ##1}}%
+ \expandafter\next@\expandafter{\nextii@}}%
+
+\xydef@\modPSconnect@{%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawA@\expandafter{\xyPSpre@{}}}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{\nextii@ ##1}}%
+ \expandafter\next@\expandafter{\Connect@@}%
+ \expandafter\DNii@\expandafter{%
+ \expandafter\xyPSrawZ@\expandafter{\xyPSpost@}}%
+ \DN@##1{\expandafter\def\expandafter\Connect@@\expandafter{\tmp@ ##1}}%
+ \expandafter\next@\expandafter{\nextii@}}%
+
+\xydef@\xyPSpre@{{}{}}
+\xydef@\xyPSpost@{}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Some utility macros for controlling writing to the log-file.
+
+\DOCMODE(
+\xydef@\PSmessage@#1{\W@{PS: #1, direction=\the\Direction}}
+\xydef@\PSignore@#1{}%
+\xydef@\showPSmessages{\let\PSmessage=\PSmessage@}
+\xydef@\hidePSmessages{\let\PSmessage=\PSignore@}
+\xylet@\PStracing=\showPSmessages
+\hidePSmessages
+
+\xydef@\PSmacro@#1{\PSmacro@@{#1}\PSmessage{#1}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{\PS\ Header file}
+
+This creates a flag to indicate whether the user wishes to get the \PS\
+dictionary from an external header file.
+
+\DOCMODE(
+\xydef@\includeXYPSdict@@{%
+ \expandafter\PSinclude@@\expandafter{\xyPSdictname}}
+\xydef@\includeXYPSdict@r{\message{PS: includeXYPSdict}\includeXYPSdict@@
+ \let\includeXYPSdict@=\relax}
+\xylet@\includeXYPSdict@\includeXYPSdict@r
+
+\xydef@\endXYdict@{}
+
+\xydef@\includePSmessage@@{\message{<xyps: including \xyPSdictname}}
+\xylet@\includePSmessage@=\includePSmessage@@
+
+\xydef@\xyPSdictknown@{%
+% \immediate\closein\xyPSdictread@
+ \immediate\closein\xyread@
+ \xywarning@{File \xyPSdictname\space already exists}
+ \message{ Do you wish to overwrite it \string? y/n }%
+ \read16 to \next
+ \DNii@{\xywarning@{You did not type Y or N -- try again please}%
+ \xyPSdictknown@}%
+ \DN@{Y }\ifx\next@\next \DNii@{\writePSdict@@}%
+ \else\DN@{y }\ifx\next@\next \DNii@{\writePSdict@@}%
+ \else\DN@{n }\ifx\next@\next \DNii@{\cancelPSdict@}%
+ \else\DN@{N }\ifx\next@\next \DNii@{\cancelPSdict@}%
+ \fi\fi\fi\fi \nextii@ }
+
+\xydef@\cancelPSdict@{%
+ \xywarning@{cancelling dump of PostScript dictionary}}
+
+\xydef@\noDictmessage@{%
+ \xywarning@{\dvitype@\space does not support the use of a header file}}
+\DOCMODE)
+
+These macros are also defined in |xyps.doc|. To avoid warning messages
+about redefinitions, that mechanism has been disabled.
+
+\DOCMODE(
+\DN@{\csname newif\endcsname\ifUsePSdict@@\DN@{}}
+ \ifx\undefined\UsePSdict@@true\else\DN@{}\fi \next@
+
+\ifx\undefined\xyPSdefaultdict
+ \xydef@\xyPSdefaultdict{%
+ \DN@##1.##2.##3@{\gdef\xyPSdictname{xy##1##2dict.pro}}%
+ \expandafter\next@\xyversion.@}%
+\fi
+
+\ifx\undefined\UsePSheader@
+ \xydef@\UsePSheader@#1{%
+ \DN@{#1}\ifx\next@\empty
+% \ifx\xyPSdictname\undefined\xyPSdefaultdict\fi
+ \else \gdef\xyPSdictname{#1}\fi
+ \ifx\xyPSdictname\undefined\xyPSdefaultdict\fi
+ \gdef\xyHeaderMessage@{%
+ It includes a reference to the PostScript file \xyPSdictname.^^J}%
+ \UsePSdict@@true}%
+ \let\UsePSheader=\UsePSheader@
+\fi
+\DOCMODE)
+
+This is used to write the dictionary to a file, suitable for inclusion
+as a resource within any \PS\ document. It is fully conforming to
+Adobe's document structuring guidelines.
+
+\DOCMODE(
+\xywarnifdefined\xyPS@@
+\xywarnifdefined\xyPS@@@
+{\catcode`|=14 \catcode`\%=12 \catcode`\<=1 \catcode`\>=2 |
+ \gdef\xyPS@@<%%>\gdef\xyPS@@@<%!>}
+
+%\xydef@\writePSdict@@{\writePSdict@ \let\writePSdict@@=\relax}
+\xydef@\writePSdict@@{\message{PS: writePSdict@@}\writePSdict@
+ \def\writePSdict@@{\message{write PS relaxed}}}
+{\catcode`|=14 \catcode`\%=12
+ \gdef\writePSdict@{{\begingroup|
+ \immediate\openout\xywrite@=\xyPSdictname \relax
+ \message{<xyps: dumping \xyPSdictname}|
+ \def\PSdict@@@##1{\immediate\write\xywrite@{##1}}|
+ \let\xyPSobeylines@@=\obeyoutlines@
+ \let\firstPS@@=\relax
+ \let\endXYdict@=\relax
+ \PSdict@@@{\xyPS@@@ PS-Adobe-3.0 Resource-procset}|
+ \PSdict@@@{\xyPS@@ Title: \xyPSdictname}|
+ \PSdict@@@{\xyPS@@ Version: REPLACEWITHVERSION}|
+ \PSdict@@@{\xyPS@@ Creator: Xy-ps backend to Xy-pic}|
+ \PSdict@@@{\xyPS@@ DocumentSuppliedProcSets: XYdict}|
+ \ifx\dvitype@\undefined
+ \PSdict@@@{\xyPS@@ For: use with Xy-pic}\else
+ \PSdict@@@{\xyPS@@ For: \dvitype@ use of Xy-pic}\fi
+ \PSdict@@@{\xyPS@@ BeginResource: procset XYdict}|
+ \def\PSspecialdict@@##1{\PSdict@@@{##1^^J}}|
+ \let\PSdict@@=\PSdict@@@ \let\xy@begindvi=\literal@|
+ \UsePSdict@@false\XYpredict@@|
+ \XYdict@@|
+ \PSdict@@@{\xyPS@@ EndResource}|
+ \immediate\closeout\xywrite@
+ \message{>}|
+ \endgroup}}}
+\DOCMODE)
+
+Within the expansion of |\XYdict@| the end-of-line tokens are still active.
+The following expansion seems to work on all systems so far tested.
+
+\DOCMODE(
+\xywarnifdefined\obeyoutlines@
+{\catcode`\^^M=\active%
+ \gdef\obeyoutlines@{\catcode`\^^M=\active \def^^M{^^J}%
+ \newlinechar=`\^^J\obeyspaces}}
+\DOCMODE)
+
+The dictionary of \PS\ commands is split into two pieces according to whether
+they are relevent to general \PS\ effects or only to the \PS\ backend.
+These pieces are generated from code within the files |xyps-pro.tex| and
+|xypsdict.tex|.
+These files have corresponding |.doc| versions for documentation.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The following commands cause the parts of the \PS\ dictionary to be read
+from the appropriate files. If |\ifUsePSdict@@| gives |\iftrue| then there
+may be no need to do anything, since the definitions will be subsequently
+loaded from the header file. Normally it is only necessary to read these
+files once, using |\XYpredict@|. However some <driver>s may need it more
+frequently, so instead call |\XYpredict@@| directly.
+
+\DOCMODE(
+\xydef@\XYpredict@@{\ifUsePSdict@@\DN@{}\else
+ \DN@{\xy@begindvi{\xyinputorelse@{xyps-pro}%
+ {\xyerror@{Could not load xyps-pro}{}}\xyuncatcodes}}%
+ \next@
+ \DN@{\xy@begindvi{\xyinputorelse@{xypspatt}%
+ {\xyerror@{Could not load xypspatt}{}}\xyuncatcodes}}\fi
+ \next@ }
+
+\xydef@\XYpredict@r{\XYpredict@@ \let\XYpredict@=\relax \installxyps@}
+\xylet@\XYpredict@\XYpredict@r
+
+\xydef@\XYdict@{\XYdict@@\def\XYdict@{\message{PS relaxed}}}%
+\xydef@\XYdict@@{\DN@{\xyinputorelse@{xypsdict}%
+ {\xyerror@{Could not load xypsdict}{}}\xyuncatcodes}%
+ \expandafter\xy@begindvi\expandafter{\next@}}
+
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This command is for use in macro-packages, providing an easy way to force
+the dictionary to load, when it has not done so using the usual mechanisms.
+
+\DOCMODE(
+
+\xydef@\forceload@XYdict{%
+ \let\includeXYPSdict@=\includeXYPSdict@r
+ \let\XYpredict@=\XYpredict@r
+ \let\XYdict@=\XYdict@@ \expandafter\installxyps@ }
+
+\DOCMODE)
+
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Extensions}
+
+Several included files handle standard \PS\ implementations of
+\Xy-pic extensions.
+
+A conditional |\ifxyPSshapes@| is used to indicate whether the special shape
+effects implemented in |xyps-r.tex| can actually be fully supported by the
+current driver. When not available, then an attempt to use these effects
+simply results in a warning message.
+After two attempts the warning message ``turns itself off'';
+subsequent attempts are simply ignored cleanly.
+
+\DOCMODE(
+\xynew@{if}\ifxyPSshapes@ \xyPSshapes@true
+
+\xydef@\xyPScharwarning@@{\xyPScharmessage@
+ \gdef\xyPScharwarning@@{\xyPScharmessage@
+ \xywarning@{...no further PostScript warnings will be given}%
+ \global\let\xyPScharwarning@@=\relax }}
+
+\xydef@\xyPScharmessage@{\xywarning@{%
+ the current <driver> does not fully support PostScript effects}}%
+\DOCMODE)
+
+\paragraph*{Allow new \PS\ effects to be defined.}
+%
+This section describes how |\newxyPSshape| is used to define a new effect
+which is available only in \PS; \ie\ having no analogue elsewhere within
+\Xy-pic.
+
+The new effect will be called via |[|<name>|]|, which gets interpreted as
+referring to |\csname xyshape@|<name>|@\endcsname|.
+Hence a control sequence of this form must first be created,
+if it does not already exist.
+Its initial expansion is simply |\xyundefinedEffect@{|<name>|}{}@@|
+which produces a warning message.
+
+\DOCMODE(
+\xydef@\newxyshape#1#2#3{%
+ \DN@{#3}\ifx\next@\empty
+ \xydefcsname@{shape [#1]}{\csname xyshape@#1@\endcsname}%
+ \else \expandafter\def\csname shape [#1]\endcsname{%
+ \csname xyshape@#1@\endcsname}\fi
+ \DN@{#2}\ifx\next@\empty
+ \expandafter\def\csname xyshape@#1@\endcsname{%
+ \xyundefinedEffect@{#1}{}@@}%
+ \else \expandafter\def\csname xyshape@#1@\endcsname{#2}\fi }
+
+\xydef@\xyundefinedEffect@#1#2@@{%
+ \xywarning@{The #1 #2 effect is not implemented with the current driver}}%
+\DOCMODE)
+
+When an implementation of the effect is available then
+|\csname xyshape@|<name>|@\endcsname| is rebound
+to |\csname xyPSshape@|<name>|@\endcsname|,
+which expands to the contents of |#2| in |\newxyPSshape#1#2|.
+If |#2| is empty then the expansion is the |\xyPSnotimplemented@@`|<name>|'@@|
+warning message, which is especially useful during development.
+
+\DOCMODE(
+\xydef@\newxyPSshape#1#2{%
+ \expandafter\DN@\expandafter{\csname shape [#1]\endcsname}%
+ \DNii@{\relax}\ifx\next@\nextii@ \newxyshape{#1}{}\relax\fi
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{#2}%
+ \ifx\nextii@\empty\expandafter\def\next@{\xyPSnotimplemented@@`#1'@@}%
+ \else
+ \edef\tmp@{\noexpand\let\expandafter\noexpand\next@
+ \expandafter\noexpand\nextii@}%
+ \expandafter\tmp@\fi }
+
+\xydef@\xyPSnotimplemented@@#1@@{%
+ \xywarning@{This PostScript effect is not implemented yet}}%
+
+\xydef@\xyPSnotfinished@@{%
+ \xywarning@{This effect is not reliable yet; box sizes may be wrong}}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-ps.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:50:08 ross
+% Maintenance release.
+%
+% Revision 3.3 1996/12/18 09:55:56 ross
+% improvements to the file-loading commands
+% more robust installation procedures
+% shorter tracing messages
+% dictionary no longer loads multiply
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% NEW for version 3.1 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-r.doc b/Master/texmf-dist/source/generic/xypic/xyps-r.doc
new file mode 100644
index 00000000000..a329cce379a
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-r.doc
@@ -0,0 +1,226 @@
+%% $Id: xyps-r.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``PostScript Rotations and Scaling''.
+%% Copyright (c) 1993-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-rloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-rloaded\endcsname=\empty \xycatcodes
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Rotations and scaling}
+
+The included file |xyps-r.tex| (version \stripRCS$Revision: 3.7 $) provides
+\PS\ support for the effects defined in the |rotate| extension described
+in~\S??g[:rotate].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The \PS\ style methods are required, so ensure that they are loaded.
+
+\DOCMODE(
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This file is loaded and its effects are activated automatically whenever
+|\xyoption{rotate}| is requested and the current <driver> supports
+\PS\ rotations. Should there be any need to turn off this support,
+the following commands are available; they obey usual \TeX\ groupings.
+%
+\begin{defs}
+|\NoPSrotate| & remove \PS\ support\kern-50pt\cr
+|\UsePSrotate| & reinstate \PS.
+\end{defs}
+%
+Without \PS\ support diagrams can be expected to be displayed unrotated
+and unscaled.
+These commands are provided primarily for testing and trouble-shooting;
+\eg~with <driver> configurations untested by the authors of \Xy-pic,
+who should be notified of persistent difficulties.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+Call the following macro to allow the \PS\ mechanisms to be used.
+
+\DOCMODE(
+\xydef@\installPSrotscale@{\installPSstyle@
+ \let\xyRotate@@=\xyPSrotate@@
+% \let\xySpecialRotate@@=\xyPSspecialRotate@
+ \let\doSpecialRotate@@=\doPSspecialRotate@@
+% \let\xyRotnamed@=\xyPSpsxy@
+% \let\xyRot@named@=\xyPSrot@named@@
+ \let\xyscale@@=\xyPSscale@@
+ \xyPSshapes@true
+ \xyuncatcodes }
+
+\xydef@\UsePSrotate{\installPSrotscale@}
+\xydef@\NoPSrotate{\UnloadRotate@\relax}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+All effects defined in the |rotate| extension can be implemented using a \PS\
+<driver>. However different <driver>s need not handle things in the same way;
+different \PS\ code may be required to match the specific environment used
+by the <driver>.
+
+This file provides generic \PS\ code which is known to work correctly with
+most drivers. It is written so as to indicate where modifications may be
+made to accomodate specific <driver>s. For such driver-specific variations,
+consult the appropriate <driver>-file, called |xy|<driver>|.doc|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Transform lists}
+
+\DOCMODE(
+\xydef@\xyPSpretransform@{\xyPSrawA@{\preXYtransform@@}}
+\xydef@\xyPSposttransform@{\xyPSrawZ@{\postXYtransform@@}}
+
+\let\preXYtransform@=\xyPSpretransform@
+\let\postXYtransform@=\xyPSposttransform@
+
+\xydef@\xyPSrotSplit@{%
+ \expandafter\def\expandafter\preShape@@\expandafter{\xyPSpre@}%
+ \expandafter\def\expandafter\postShape@@\expandafter{\xyPSpost@}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Rescaling}
+
+\DOCMODE(
+\xydef@\xyPSscale@@#1#2{%
+ \xyPSsplitPS@{\xyscale@start(#1,#2)}{\xyscale@end}%
+ \xyPSrotSplit@\xyPSpsxy@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Rotations}
+
+\DOCMODE(
+\xydef@\xyPSrotate@@#1{%
+ \xyPSsplitPS@{\xyrot@start(#1 xyd)}{\xyrot@end}%
+ \xyPSrotSplit@\xyPSpsxy@ }
+
+\xydef@\xyPSspecialRotate@#1{%
+ \xyPSsplitPS@{\xyrot@start(#1)}{\xyrot@end}\xyPSrotSplit@\xyPSpsxy@ }
+
+\xydef@\doPSspecialRotate@@#1@@{\xyPSspecialRotate@{#1}}
+\DOCMODE)
+
+The \PS\ operator |xyr| is defined in |xyps-ps.doc|, to store the given
+parameter as a rotation angle.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Shearing}
+
+This feature is not implemented yet.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{PostScript commands}
+
+The \PS\ codes to start the rotation or scaling are given as functions,
+|xyrot@start| and |xyscale@start| with arguments to include a specification
+of the rotation-angle or scaling factors.
+
+\DOCMODE(
+\xydef@\xyRotScale@@{%
+ \def\xyrot@start(##1){{xyt ##1\space xyr}}%
+ \def\xyscale@start(##1,##2){{xyt ##1\space##2\space xys}}%
+ \def\xyrot@end{}\def\xyscale@end{}}
+\DOCMODE)
+
+These strings are placed using |\xyPSsplitPS@| so as to correctly
+occur before and after the code for the actual <object> being typeset.
+This is always followed by |\xyPSpsxy@|, which results in \PS\ code
+to identify the current position, storing it with keys |xyXpos| and |xyYpos|
+so as to be accessible to the code for the rotation or scaling.
+
+A specific <driver> must either call |\xyRotScale@@| to use this default
+mechanism, or define its own macro to be called at installation time,
+which sets alternative expansions to |\xyrot@start(#1)|,
+|\xyscale@start(#1,#2)|, |\xyrot@end| and |\xyscale@end|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-r.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.3 1996/12/18 10:05:50 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% NEW for version 2.9 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-s.doc b/Master/texmf-dist/source/generic/xypic/xyps-s.doc
new file mode 100644
index 00000000000..990f03d6253
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-s.doc
@@ -0,0 +1,144 @@
+%% $Id: xyps-s.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Style extension'' PostScript support.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-sloaded\endcsname=\empty \xycatcodes
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This included file (version \stripRCS$Revision: 3.7 $) provides a \PS\
+interface for the effects defined in the |style| extension.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\paragraph*{\PS\ Style lists}
+
+Note: The contents of the style lists |\preXY@style@| and |\postXY@style@|
+should be `raw' \PS\ code.
+
+This prevents |\special|s from being inserted twice, once by |\Connect@@|
+and once by |\Drop@@|, with straight lines using |\xyPSstraight@|.
+
+\DOCMODE(
+\xydef@\xykillstyles@@{\Unloadstyle@}%
+%\xydef@\xykillstyles@@{%
+% \let\xypre@Style@@=\relax \let\xypost@Style@@=\relax}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{\PS\ Escape Style}
+
+\DOCMODE(
+\xywarnifdefined\xyPSescapestyle@
+\xywarnifdefined\xyPSsplitescape@
+
+{\xyuncatcodes \catcode`@=11
+ \gdef\xyPSescapestyle@#1@@{\xyPSsplitescape@#1<><>@@}%
+ \gdef\xyPSsplitescape@#1<>#2<>#3@@{\xyescape@@{#1}{#2}}}
+
+\xydef@\xyPSsplitPS@#1#2{%
+ \def\xyPSpre@{#1}\def\xyPSpost@{#2}\modPSboxz@ }
+
+\xydef@\xyescape@@#1#2{\checkXyStyle@
+ \applyFIFOstyle@\prexyescape@{#1}\postxyescape@{#2}}
+
+\xydef@\prexyescape@{\xyescapeSpecial@}
+\xydef@\postxyescape@{\xyescapeSpecial@}
+
+\xylet@\xyescapeSpecial@=\eat@
+\let\xyescapeSpecial@=\addtostyletoks@
+\DOCMODE)
+
+
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+The <driver>-file must call the following macro to rebind a control sequence
+defined in |xystyle|, thereby allowing the \PS\ mechanisms to be used.
+
+\DOCMODE(
+\xydef@\installPSstyle@{%
+% \let\preXYstyle@=\xyPSprestyle@@
+% \let\postXYstyle@=\xyPSpoststyle@@
+ \def\preXYstyle@@{\xyPSpre@}%
+ \let\xydoprestyles@=\xyPSrawstyleA@
+ \let\xydopoststyles@=\xyPSrawZ@
+ \let\xykillstyles@=\xykillstyles@@
+ }
+\xydef@\xyPSrawstyleA@#1{\xyPSrawA@{{#1}{}}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-s.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.3 1996/12/18 10:07:44 ross
+% style-handling code moved to xyps-ps
+% minor improvements to file-loading commands
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% Revision 2.9 1994/06/09 14:38:56 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% NEW for version 2.9 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps-t.doc b/Master/texmf-dist/source/generic/xypic/xyps-t.doc
new file mode 100644
index 00000000000..2140cd7e002
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps-t.doc
@@ -0,0 +1,168 @@
+%% $Id: xyps-t.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``Pattern and Tile extension'' PostScript support.
+%% Copyright (c) 1993-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\expandafter\ifx\csname xyps-tloaded\endcsname\empty
+ \message{not reloaded}\endinput \fi
+\expandafter\let\csname xyps-tloaded\endcsname=\empty \xycatcodes
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Patterns and tiles}
+
+The included file |xyps-t.tex| (version \stripRCS$Revision: 3.7 $) provides
+\PS\ support for the effects defined in the |tile| extension described
+in~\S??g[:tile].
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The \PS\ style methods are required, so ensure that they are loaded.
+
+\DOCMODE(
+\expandafter\ifx\csname xyps-sloaded\endcsname\empty\else
+ \xyinputorelse@{xyps-s}{\xyerror@{Could not load xyps-s}{}}%
+ \xycatcodes\fi
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This file is loaded and its effects are activated automatically whenever
+|\xyoption{tile}| is requested and the current <driver> supports
+\PS\ patterns. Should there be any need to turn off this support,
+the following commands are available; they obey usual \TeX\ groupings.
+%
+\begin{defs}
+|\NoPStiles| & remove \PS\ support\kern-50pt\cr
+|\UsePStiles| & reinstate \PS.
+\end{defs}
+%
+Without \PS\ support tile patterns can be expected to be displayed as
+solid black.
+These commands are provided primarily for testing and trouble-shooting;
+\eg~with <driver> configurations untested by the authors of \Xy-pic,
+who should be notified of any difficulties.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+Installation consists of rebinding the macros |\xypattern@| and
+|\newxypattern@| and of reloading the standard patterns to include a
+description for \PS. This installation should be delayed till after
+|pattern| and the \PS\ <driver> have been installed.
+
+\DOCMODE(
+\xydef@\installPSpatterns@{\installPSstyle@
+ \let\xypattern@=\xyPSpattern@@
+ \let\xypatternwarning@=\relax
+ \xystandardpatterns@
+ \xyuncatcodes }
+
+\xylet@\UnloadPSpatterns@=\Unloadpattern@
+
+\xydef@\UsePStiles{\installPSpatterns@}
+\xydef@\NoPStiles{\UnloadPSpatterns@\relax}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+All effects defined in the |tile| extension can be implemented using
+the \PS\ dictionary, loaded by |xyps-ps|.
+This file provides ``generic'' \PS\ code which is known to work
+correctly with most drivers. No attempt is made to provide special
+code for particular drivers; for driver-specific variations, consult
+the appropriate |xy|<driver>|.doc| file.
+
+\DOCMODE(
+\xydef@\xyPSnewpattern@#1#2#3#4#5{%
+ \expandafter\DN@\expandafter{\csname shape [#1]\endcsname}%
+ \DNii@{\relax}\ifx\next@\nextii@\newxypattern{#1}{}\relax\fi
+ \DNii@{#4}\ifx\nextii@\empty
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPSpattern@{#2 #3}}\else
+ \expandafter\DNii@\expandafter{\csname xyPSshape@#1@\endcsname}%
+ \expandafter\def\nextii@{\xyPSpattern@{#4}}\fi
+ \ifx\nextii@\empty\expandafter\def\next@{\xyPSnotimplemented@@`#1'@@}%
+ \else
+ \edef\tmp@{\noexpand\let\expandafter\noexpand\next@
+ \expandafter\noexpand\nextii@}\expandafter\tmp@\fi }
+
+\xydef@\xyPSpattern@{\ifPSspecials@\expandafter\xyPSpattern@@
+ \else\expandafter\eat@\fi}%\xyPSpattern@@}
+
+\xydef@\xyPSpattern@@#1{\bgroup \checkXyStyle@
+ \def\preStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpre@}}%
+ \def\postStyle@@{\expandafter\addtostyletoks@\expandafter{\xyPSpost@}}%
+ \let\modPSboxz@=\modXYstyle@ \xyPS@pattern@@{#1}%
+ \toks@={\egroup\let\xy@style@=\relax \def\Drop@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
+ \the\toks@ }
+
+\xydef@\xyPS@pattern@@#1{\xyPSsplitPS@{{#1}sp}{}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xyps-t.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 10:05:50 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.0 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyps.doc b/Master/texmf-dist/source/generic/xypic/xyps.doc
new file mode 100644
index 00000000000..b083c7250ce
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyps.doc
@@ -0,0 +1,1209 @@
+%% $Id: xyps.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``PostScript backend''.
+%% Copyright (c) 1993-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{ps}{PostScript backend}{\stripRCS$Revision: 3.7 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\Xy-ps is a `back-end' which provides \Xy-pic with the ability to produce DVI
+files that use \PS\ |\specials| for drawing rather than the \Xy-pic fonts.
+
+In particular this makes it possible to print \Xy-pic DVI files on
+systems which do not have the ability to load the special fonts. The
+penalty is that the generated DVI files will only function with one
+particular DVI driver program. Hence whenever \Xy-ps is activated it
+will warn the user:
+$$
+\xy
+ *+\txt<.8\hsize>{\Xy-pic Warning: The produced DVI file is "not
+ portable": It contains \PS\ {\tt\string\special}s for <one
+ particular> driver}
+ *\frm{-}
+\endxy
+$$
+A more complete discussion of the pros and cons of using this backend
+is included below.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+%\paragraph*{Declarations.}
+%
+%\DOCMODE(
+%\xyinputorelse@{xyps-ps}{\xydrivernoload@{xyps-ps}}
+%\DOCMODE)
+%
+%\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\paragraph*{xyps-ps.tex:}
+%??c[xyps-ps.tex]
+%\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\paragraph*{xyps-ps.doc:}
+%??c[xyps-ps.doc]
+%\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\inputdoc!{xyps-ps.doc}
+%
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Choosing the DVI-driver}
+??=[choosing DVI-driver]
+
+Including |\xyoption{ps}| within the document preamble, tells \Xy-pic that
+the \PS\ alternative to the fonts should be used, provided the means to do
+this is also specified. This is done by also specifying a dvi-driver which
+is capable of recognising and interpreting |\special| commands. Although
+the file |xyps.tex| is read when the option request is encountered, the
+macros contained therein will have no effect until an appropriate driver
+has also been loaded.
+
+With \LaTeXe\ both the backend and driver may be specified, along with other
+options, via a single |\usepackage| command,
+see~\cite[page~317]{GMS94:LaTeXC}; e.g.
+%
+\begin{defs1}
+|\usepackage[ps,textures,color,arrow]{xy}|
+\end{defs1}
+\noindent\unskip
+%
+The rebindings necessary to support \PS\ are not effected until the
+|\begin{document}| command is encountered. This means that an alternative
+driver may be selected, by another |\xyoption{|<driver>|}|, at any time
+until the |\begin{document}|. Only the macros relevant to last named
+<driver> will actually be installed.
+
+
+The following table describes available support for \PS\ drivers.
+Please consult the individual driver sections in part~??g[:drivers] for the
+exact current list.
+For each <driver> there is a corresponding file named |xy|<driver>|.tex|
+which defines the necessary macros, as well as a documentation file named
+|xy|<driver>|.doc|. The spelling is all lower-case, designed to be both
+descriptive and unique for the 1st 8 characters of the file names.
+
+\vspace{.5pc}\noindent
+\begin{tabular}{@{\hspace{1pt}}ll@{\hspace{0pt}}}
+\hline
+<driver> & \hfil Description\hfil \\
+\hline
+\tt dvips & Tomas Rokicki's \dvips \\
+\tt dvips & Karl Berry's |dvipsk| \\
+\tt dvips & Thomas Kiffe's \dvips\ for Macintosh\\
+\tt textures & Blue Sky Research's \Textures\ v1.7+ \\
+\tt 16textures & Blue Sky Research's \Textures\ v1.6 \\
+\tt oztex & Andrew Trevorrow's \OzTeX\ v1.8+ \\
+\tt 17oztex & Andrew Trevorrow's \OzTeX\ v1.7 \\
+%\tt ln & Digital Corp. printers & $-$ \\
+%\tt dvitops &James Clark's dvitops & $?$ \\
+%\tt emtex & Eberhard Matte's em-\TeX & $-$ \\
+\hline
+\end{tabular}
+\vspace{.5pc}
+%$*$ denotes full support, for all the features the driver can handle;
+%$?$ denotes that some features have not been tested, but may still work;
+%$-$ denotes no support as yet.
+
+Other DVI-drivers may also work using one of these files, if they use
+conventions similar to |dvips|, \OzTeX\ or \Textures. Alternatively
+it should not be too difficult to write the files required, using these
+as a basis indicating the type of information needed to support the
+specific |\special| commands. Anyone attempting to do this should inform
+the author and convey a successful implementation to him for inclusion
+within the \Xy-pic distribution.
+
+\NOTE: In some previous versions of \Xy-pic the \PS\ backend and driver
+were loaded simultaneously by a command of the form
+|\UsePSspecials{|<driver>|}|. For backward-compatibility these commands
+should still work, but now loading the latest version of the given
+<driver>. However their future use is discouraged in
+favour of the option-loading mechanism, via |\xyoption{|<driver>|}|.
+This latter mechanism is more flexible, both in handling upgrades of the
+actual driver support and in being extensible to support more general
+forms of |\special| commands.
+
+\medskip
+
+Once activated the \PS\ backend can be turned off and on again at will,
+using the user following commands:
+%
+\begin{defs}
+ ??c![\NoPSspecials] & cancels \PS \cr
+ ??c![\UsePSspecials{}] & restores \PS
+\end{defs}
+\noindent\unskip
+%
+These obey normal \TeX\ scoping rules for environments; hence it is
+sufficient to specify |\NoPSspecials| within an environment or grouping.
+Use of \PS\ will be restored upon exiting from the environment.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The default level of \PS\ is [4], see below.
+
+\DOCMODE(
+\xydef@\UsePSspecials{\DNii@{{[4]}}\xyFN@\UsePSspecials@i}
+\xydef@\UsePSspecials@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\UsePSspecials@i}%
+ \else\ifx [\next \DN@[##1]{\DNii@{{[##1]}}\xyFN@\UsePSspecials@i}%
+ \else\ifcat 5\noexpand\next \DN@##1{\DNii@{{[##1]}}\xyFN@\UsePSspecials@i}%
+ \else\ifx\bgroup\next \DN@{\expandafter\UsePS@specials\nextii@}%
+ \else \DN@{\UsePS@specials{[4]}}%
+ \fi\fi\fi\fi \next@ }
+\DOCMODE)
+
+\TODO: There is redundancy between here and |\UsePSspecials@|.
+The value of |\setupxyPS@| \PS\ level could be set here rather than later
+in |\PSspecials@|.
+
+\DOCMODE(
+\xydef@\UsePS@specials#1#2{%
+ \ifx\empty\whichPSspecials@
+ \DN@{#2}\ifx\next@\empty
+ \else
+ \expandafter\let\expandafter\next\csname#2@\endcsname
+% \ifx\next\relax \DN@{\xyerror@{PostScript specials for `#2' not supported}{}}%
+ \ifx\next\relax \DN@{\UsePSspecials@{#2}{}}%
+% \else \DN@{\expandafter\UsePSspecials@\csname#2@\endcsname#1}\fi
+ \else \DN@{\UsePSspecials@{#2}{#1}}\fi
+ \fi
+ \else
+ \DN@{#2}\ifx\next@\empty \DN@{\PSspecials@true}%
+ \else
+% \edef\next@{\expandafter\string\csname#2@\endcsname}%
+ \DN@{#2}%
+ \edef\nextii@{\expandafter\string\whichPSspecials@}%
+ \ifx\next@\nextii@\DN@{\PSspecials@true}%
+ \else
+ \ifx\firstPS@@\relax
+ \DN@{\xyerror@{Only one PS <driver> allowed: \dvitype@ already loaded}{}}%
+ \else
+ \expandafter\let\expandafter\next\csname#2@\endcsname
+ \ifx\next\relax
+ \DN@{\xyerror@{PostScript specials for `#2' not supported}{}}%
+ \else
+ \xywarning@{Changing PS <driver> to #2 }%
+% \DN@{\expandafter\UsePSspecials@\csname#2@\endcsname#1}%
+ \DN@{\UsePSspecials@{#2}{#1}}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi \next@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The following control sequences will also load the corresponding driver.
+They are retained for backwards compatibility only;
+they may be phased out of future releases:
+%
+\begin{defs}
+ |\UseDVIPSspecials| & |dvips| \cr
+ |\UsePostScriptSpecials| & |dvips|\cr
+ |\UseTexturesPSspecials| & |Textures| \cr
+ |\UseTexturesSpecials| & |Textures|
+\end{defs}
+%
+\DOCMODE(
+\xydef@\UseDVIPSspecials{\UsePSspecials@\dvips@}
+\xydef@\UseTexturesPSspecials{\UsePSspecials@\Textures@}
+\xydef@\UseTexturesSpecials{\UsePSspecials@\Textures@}
+\xydef@\UsePostScriptSpecials{\UsePSspecials@\dvips@}
+\xydef@\UseOzTeXspecials{\UsePSspecials@\OzTeX@}
+\xydef@\UseDVITOPSspecials{\UsePSspecials@\dvitops@}
+%\xylet@\UseDVIPSSpecials=\UseDVIPSspecials
+%\xylet@\UsePSspecials=\UsePostScriptSpecials
+%\xylet@\UseTeXturesPSspecials=\UseTexturesPSspecials
+%\xylet@\UseTexturesSpecials=\UseTexturesPSspecials
+%\xylet@\UseTeXturesSpecials=\UseTexturesSpecials
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\message{drivers,}
+\DOCMODE)
+
+First the driver is specified by |\UsePSspecials{|<driver>|}|.
+This causes a special driver file to be read.
+Use of fonts is restored at any point by calling |\NoPSspecials|,
+after which use of \PS\ is re-instated by simply |\UsePSspecials|,
+without need of an argument.
+The commands described above for specific drivers are simply aliases
+for |\UsePSspecials@{|<driver>|}|.
+
+Once the new bindings have been setup, then the use of |\special|s is
+governed by the value of the conditional |\ifPSspecials@|.
+
+\DOCMODE(
+\xydef@\loadPSdriver@#1#2{\xyinputorelse@{xy#1}%
+ {\xyrequire{#2}\expandafter\ifx\csname xy#2loaded\else %
+ {\xyerror@{Unable to load xy#1.tex for #2 driver}{}}\fi}}
+
+\xydef@\dvips@{\loadPSdriver@{ps-dvi}{dvips}}
+\xydef@\Textures@{\loadPSdriver@{ps-txt}{Textures}}
+\xydef@\OzTeX@{\loadPSdriver@{ps-oz}{OzTeX}}
+\xydef@\dvitops@{\loadPSdriver@{ps-dto}{dvitops}}
+\xydef@\dvipsone@{\loadPSdriver@{ps-one}{dvipsone}}
+%\xydef@\dviwindo@{\loadPSdriver@{ps-wdo}{dviwindo}}
+%\xydef@\dviwin@{\loadPSdriver@{ps-win}{dviwin}}
+%\xydef@\pubps@{\loadPSdriver@{ps-pub}{pubps}}
+\DOCMODE)
+
+The driver file contains definitions which are specific
+to the particular driver.
+Note that some drivers may not be able to support all of the \PS\
+effects that can be requested from within \Xy-pic. When an unsupported effect
+is encountered, it is simply ignored; a warning message will be produced
+unless too many such messages have already been issued.
+
+\DOCMODE(
+\global\newif\ifPSspecials@
+%\xydef@\UsePSspecials@#1{\gdef\whichPSspecials@{#1}\xyFN@\PSspecials@}
+\xydef@\UsePSspecials@#1{\def\whichPSspecials@{#1}%
+ \DN@{\Textures@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{textures}%
+ \def\whichPSspecials@{textures}\xyps@options}%
+ \else\DN@{\dvips@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{dvips}%
+ \def\whichPSspecials@{dvips}\xyps@options}%
+ \else\DN@{\OzTeX@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{oztex}%
+ \def\whichPSspecials@{oztex}\xyps@options}%
+ \else\DN@{\dvitops@}\ifx\next@\whichPSspecials@
+ \DN@##1{\xyrequire{dvitops}%
+ \def\whichPSspecials@{dvitops}\xyps@options}%
+ \else
+ \DN@##1{\xyrequire{ps}\xyrequire{#1}\xyps@options}%
+ \fi\fi\fi\fi \next@ }
+
+\xydef@\xyps@options{%
+ \xyrequire{ps}\xyrequire{line}\xyrequire{color}\xyrequire{crayon}%
+ \xyrequire{rotate}\xyrequire{tile}\xyrequire{frame}\xyuncatcodes }
+\xydef@\whichPSspecials@{}
+
+\xydef@\NoPSspecials{\xyPSwarning@{off}%
+ \PSspecials@false\aftergroup\resetPS@}
+\xydef@\resetPS@{\ifPSspecials@\xyPSwarning@{back on}\fi}
+\xydef@\UsePSspecials@x{\PSspecials@true\resetPS@}
+
+\xydef@\xyPSwarning@#1{\xywarning@{PostScript switched #1}}
+%
+%\xydef@\xyPSraw@{%
+% \ifPSspecials@\expandafter\PSraw@@\else\expandafter\eat@\fi }
+\DOCMODE)
+
+% To install the back-end requires loading the \PS\ dictionary.
+% However this can only be done when a <driver> is known to be able to
+% support it. Hence the following command should be called only from
+% within a <driver>-file.
+%
+% \DOCMODE(
+% \DN@{\csname newif\endcsname\ifUsePSdict@@\DN@{}}
+% \ifx\undefined\UsePSdict@@true\else\DN@{}\fi \next@
+% \DOCMODE)
+%
+% Furthermore, the <driver>-file should define a value for |\installxyps@@|
+% to including anything specific to that <driver>; even if only
+% |\let\installxyps@@=\relax|. If |\dumpPSdict| has been specified,
+% then the dictionary must be written first, so it can be used with the
+% subsequent processing.
+%
+% \DOCMODE(
+% \xylet@\dumpPSdict@@=\relax
+%
+% \xydef@\installxyps@{%
+% \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}\xycatcodes
+% \installxyps@@ \installxyps@x
+% \global\let\UsePSspecials=\UsePSspecials@x
+% % \let\installxyps@@=\eat@
+% \PSspecials@true }
+%
+% \xylet@\installxyps@@=\relax
+%
+% \xydef@\installxyps@x{\dumpPSdict@@
+% \ifx\xyrealshipout@\undefined \let\xyrealshipout@=\shipout\fi
+% \ifx \shipout \xyrealshipout@
+% \ifUsePSdict@@ \DN@{\includePSmessage@\includeXYPSdict@\message{>}}%
+% \else \DN@{\XYdict@\endXYdict@}\fi
+% \else \DN@{\let\xyPSshipout@ii=\xyPSshipout@PSii \@PSshipout}\fi
+% \let\firstPS@=\relax \next@
+% \let\XYpredict@=\relax \setupxyPS@ }
+% \DOCMODE)
+%
+% In case no <driver> was known when a call to the |\installxyps@| method
+% was queued, e.g. by |\dumpPSdict{}| before any |\xyoption{|<driver>|}|,
+% then a check is made to see there is now a known <driver> which
+% supports \PS. If so then this installation is cancelled since another
+% should follow, otherwise the default <driver> of |dvips| is assumed.
+% The command |\xyPSdriver#1| is provided to allow users to change this
+% default <driver>. This may be necessary when multiple <driver>s are
+% required and the final one specified does not support \PS.
+%
+% \DOCMODE(
+% \xydef@\xydefaultdriver@{dvips}
+% \xydef@\xyPSdriver#1{\def\xydefaultdriver@{#1}}
+%
+% \xydef@\installxyps@orig{%
+% \DN@{null}\ifx\next@\currentxydriver@\DN@{%
+% \expandafter\defaultinstallps@\expandafter{\xydefaultdriver@}}%
+% \else \DN@{}%
+% \expandafter\expandafter\expandafter\ifx
+% \expandafter\csname\currentxydriver@ @xy@ps\endcsname\relax
+% \DN@{\expandafter\defaultinstallps@\expandafter{\xydefaultdriver@}}%
+% \else \DN@##1{}\fi
+%\xywarning@{will install \currentxydriver@\space shortly}%}%
+% \fi \next@ }
+%
+% %\xylet@\installxyps@@=\installxyps@orig
+%
+% \xydef@\defaultinstallps@#1#2{%
+% \xywarning@{no driver specified, using #1 }%
+% \xyoption{#1}\csname #1@xy@ps\endcsname{}}
+%
+% \xydef@\null@xy@ps{\installxyps@}
+% \DOCMODE)
+
+Unloading the \PS-backend is handled by the |unload| <driver>.
+
+\DOCMODE(
+\xyaddunsupport{ps}{\csname UnloadPS@@\endcsname}
+\DOCMODE)
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{adding new drivers}
+??=[new drivers]
+
+Other drivers can be added by including an appropriate control-sequence name
+for the driver at this point. The purpose of an expansion such as
+|\xydef@\OzTeX@{\noexpand\OzTeX@}| is so that this name always refers to
+a unique token. The macro |\PSspecials@@| defined below, detects this token
+and then calls up the appropriate macro to make the necessary bindings.
+
+Thus adding a new driver involves 5 steps:
+\begin{itemize}
+\item 1
+Define a new control sequence, as just explained.
+\item 2
+Define appropriately named macros to generate the desired |\special|s.
+(See the existing ones for examples of what is needed here.)
+\item 3
+Define a macro that will perform the appropriate bindings of the
+different classes of |\special|. (See the existing ones for examples of
+what is needed here.)
+\item 4
+Determine how frequently the \Xy-ps dictionary must be included within
+the PostScript file. Once (at the beginning) is the ideal, however it
+may be necessary to include it with every page---this is the case with
+\Textures. Also if the dictionary can be loaded as a header or prolog,
+determine whether this can be done only once or must be for each page.
+Also check whether a specific name is required, as with \OzTeX.
+\item 5
+Check to see whether the |\dumpPSdict| macro correctly writes the dictionary
+to a file. The |\endlinechar| can be important here.
+\end{itemize}
+
+\Xy-ps works by rebinding existing control sequence names, in the \Xy-pic
+kernel and extensions, to have new expansions. These new expansions may
+eventually typeset nothing, or at most an empty box; instead they use a
+|\special| command to place \PS\ code directly into the |.dvi| file
+(or |DVI2| resources in the case of \Textures on the Macintosh).
+The new expansions alter the \TeX\ processing, often simplifying it
+considerably hence leading to savings in both time and memory requirement.
+
+It should not be possible to mix |\specials| intended for different drivers.
+Thus the first use of |\PSspecials@| will establish which driver is required
+then rebinds |\UsePSspecials@| so that no other driver can be used;
+subsequent attempts to use |\UsePSspecials@| simply result in the same
+driver being reinstated.
+
+\DOCMODE(
+\xydef@\PSspecials@{%
+ \ifx\next[\DN@[##1]{\setxyPSlevel@{##1}\xyFN@\PSspecials@}%
+ \else\DN@{\whichPSspecials@\PSspecials@@}%
+ \fi \next@ }%
+
+\xydef@\PSspecials@@{%
+ \ifx\und@fined\PSmessage\hidePSmessages\fi \setupxyPS@}
+\DOCMODE)
+
+An optional argument to the |\UsePSspecials| command
+allows for some control over precisely when \PS\
+|\specials| will be used.
+Similarly |\UseDVIPSspecials| and |\UseTexturesSpecials|, etc. can take an
+optional argument.
+
+For example, |\UsePSspecials[1]| replaces only font characters
+with a \PS\ drawing of the same character.
+Both the \PS\ and the bitmapped fonts should produce (virtually)
+identical printed images. This is primarily a test mode.
+
+|\UsePSspecials[2]| also only replaces font characters but such
+that the number of possible directions is 8192, so that arrowheads
+turns and hooks fit better.
+
+|\UsePSspecials[3]| draws straight and dotted lines from a
+single |\special| command, and similarly for circle segments.
+The printed output should be identical to that obtained with
+|\UsePostScriptSpecials[2]|, but the size of the |.ps| file should
+be smaller.
+
+|\UsePSspecials[4]| is the default level;
+all PostScript is turned on. Dotted curves use equally spaced dots,
+dashed curves have curved dashes; even dashed lines are better.
+
+|\UsePSspecials[0]| does no rebinding of fonts at all.
+It allows the special effects, such as rotation, scaling, colour, etc
+defined in extensions, to be implemented while using the Xy-pic fonts.
+
+\DOCMODE(
+\xydef@\setupxyPSlevelO@{\relax}
+
+\xydef@\setxyPSlevel@#1{\ifcase#1%
+ \gdef\setupxyPS@{\setupxyPSlevelO@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelA@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelB@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelC@}%
+ \or\gdef\setupxyPS@{\setupxyPSlevelD@}%
+ \else\gdef\setupxyPS@{\setupxyPSlevelD@}\fi }
+
+\xywarnifdefined\setupxyPS@
+ \gdef\setupxyPS@{\setupxyPSlevelD@ \gdef\setupxyPS@{\PSspecials@true}}
+
+\xydef@\PSincrease@#1{%
+ \xywarning@{The PS level may only increase: #1 is already active}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Why use \PS}
+??=[why PostScript]
+
+At some sites users have difficulty installing the extra fonts used by
+\Xy-pic. The |.tfm| files can always be installed locally but it may
+be necessary for the |.pk| bitmap fonts (or the |.mf| \MF\ fonts) to
+be installed globally, by the system administrator, for printing to
+work correctly. If \PS\ is available then \Xy-ps allows this
+latter step to be bypassed.
+
+\NOTE: with \Xy-ps it is still necessary to have the |.tfm| font
+metric files correctly installed, as these contain information vital
+for correct typesetting.
+
+\medskip\noindent
+Other advantages obtained from using \Xy-ps are the following:
+\begin{itemize}
+\item[$\bullet$]
+Circles and circle segments can be set for arbitrary radii.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item[$\bullet$]
+solid lines are straighter and cleaner.
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+They are no longer typeset as a
+collection of fixed-sized segments (drawn from the |xydash10| font).
+Previously special placement algorithms were required, to construct lines of
+arbitrary length in up to 8192 distinct directions, from the 128 characters
+in the font. These algorithms are no longer required, giving improved
+\TeX\ processing, as well as having smooth lines of arbitrary length and
+direction limited only by the resolution of the \PS\ device.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item[$\bullet$]
+The range of possible angles of directionals is greatly increased.
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+For arrow tips, hooks, and turns, there are now 8192 possible orientations
+rather than just the 128 contained in the |xyatip10|, |xybtip10|, and
+|xybsql10| fonts.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item[$\bullet$]
+Spline curves are smoother. True dotted and dashed versions are now
+possible, using equally spaced segments which are themselves curved.
+
+\item[$\bullet$]
+The \PS\ file produced by a driver from an \Xy-ps DVI file is in
+general significantly smaller than one produced by processing an
+`ordinary' DVI file using the same driver. One reason for this is
+that no font information for the \Xy-pic fonts is required in the
+\PS\ file; this furthermore means that the use of \Xy-pic does
+not in itself limit the \PS\ file to a particular
+resolution.\footnote{Most \TeX\ \PS\ drivers store the images of
+characters used in the text as bitmaps at a particular resolution.
+This means that the \PS\ file can only be printed without loss
+of quality (due to bitmap scaling) at exactly this resolution.}
+
+\item[$\bullet$]
+The latest version of \Xy-pic now enables special effects such as
+variable line thickness, gray-level and colour. Also, rotation of text
+and (portions of) diagrams is now supported with some drivers.
+Similarly whole diagrams can be scaled up or down to fit a given area on the
+printed page. Future versions will allow the use of regions
+filled with colour and/or patterns, as well as other attractive effects.
+
+\end{itemize}
+
+Some of the above advantages are significant, but they come at a price.
+Known disadvantages of using \Xy-ps include the following:
+
+\begin{itemize}
+
+\item[$\bullet$]
+A DVI file with specials for a particular \PS\ driver can only
+be previewed if a previewer is available that supports exactly the
+same |\special| format.
+A separate \PS\ previewer will usually be required.\par
+\smallskip
+However recent versions of |xdvi| support viewing of \PS\
+using either the GhostScript program or via ``Display PostScript''.
+The \PS\ produced by \Xy-ps can be viewed this way
+
+\item[$\bullet$]
+DVI files created using \Xy-ps in fact lose their ``device-independence''.
+So please do not distribute DVI files with \PS\ specials---send either
+the \TeX\ source code, expecting the recipient to have \Xy-pic~\smiley,
+or send a (compressed) \PS\ file.
+\end{itemize}
+
+\noindent
+The latter comment applies to files in which any special `back-end' support
+is required, not just to \PS. Of course it can be ignored when you know
+the configuration available to the intended recipient.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{\PS\ header file:}
+
+With some DVI-drivers it is more efficient to have the \PS\ commands
+that \Xy-ps needs loaded initially from a separate ``header'' file.
+To use this facility the following commands are available\dots
+\begin{defs1}
+ ??c![\UsePSheader{}] \cr
+ ??c![\UsePSheader{<filename>}] \cr
+ ??c![\dumpPSdict{<filename>}] \cr
+ ??c![\xyPSdefaultdict]
+\end{defs1}
+\xyPSdefaultdict
+Normally it is sufficient to invoke |\UsePSheader{}|, which invokes the
+default name of {\tt\xyPSdictname}, referring to the current
+version of \Xy-pic.
+The optional <filename> allows a different file to be used.
+Placing |\dumpPSdict{..}| within the document preamble causes the dictionary
+to be written to the supplied <filename>.
+
+\DOCMODE(
+\DN@{\csname newif\endcsname\ifUsePSdict@@\DN@{}}
+ \ifx\undefined\UsePSdict@@true\else\DN@{}\fi \next@
+
+\ifx\undefined\xyPSdefaultdict
+ \xydef@\xyPSdefaultdict{%
+ \DN@##1.##2.##3@{\gdef\xyPSdictname{xy##1##2dict.pro}}%
+ \expandafter\next@\xyversion.@}%
+\fi
+
+\ifx\undefined\UsePSheader@
+ \xydef@\UsePSheader@#1{%
+ \DN@{#1}\ifx\next@\empty
+% \ifx\xyPSdictname\undefined\xyPSdefaultdict\fi
+ \else \gdef\xyPSdictname{#1}\fi
+ \ifx\xyPSdictname\undefined\xyPSdefaultdict\fi
+ \gdef\xyHeaderMessage@{%
+ It includes a reference to the PostScript file \xyPSdictname.^^J}%
+ \UsePSdict@@true}%
+ \let\UsePSheader=\UsePSheader@
+\fi
+\DOCMODE)
+
+See the documentation for the specific driver to establish where the
+dictionary file should be located on any particular \TeX\ system.
+Usually it is sufficient to have a copy in the current working directory.
+Invoking the command |\dumpPSdict{}| will place a copy of the requisite
+file, having the default name, in the current directory.
+This file will be used as
+the dictionary for the current processing, provided it is on the
+correct directory path, so that the driver can locate it when needed.
+Consult your local system administrator if you experience difficulties.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The `dump' cannot be performed until a driver has been installed.
+This ensures that the correct `end-of-line' character is used.
+
+\DOCMODE(
+\xydef@\dumpPSdict#1{\DN@{#1}\ifx\next@\empty
+ \ifx\undefined\xyPSdictname\xyPSdefaultdict\fi
+ \else\gdef\xyPSdictname{#1}\fi
+ \def\dumpPSdict@@{\writePSdict@@}%
+ \ifx\xydriversselected@@\empty\DN@{\xysetup@@\null@xy@ps}%
+ \else \DN@{\installxyps@x}\fi \next@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Multiple instances of |\UsePSheader| and |\dumpPSdict| are possible, only
+the last will determine which file is used for the current document.
+The command |\xyPSdefaultdict| reverts to the default name.
+
+Allowing an arbitrary <filename> with |\UsePSheader| is for flexibility,
+to accommodate systems that may impose special requirements
+on the filenames of files to be used as \PS\ header files.
+\OzTeX\ is one such. It also caters for advanced users of \Xy-pic
+who may wish to experiment with customised \PS\ to obtain new effects.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Hooking into \Xy-pic}
+??=[hooks]
+
+\DOCMODE(
+\message{hooks,}
+\DOCMODE)
+
+This next macro streamlines the rebinding process.
+
+\DOCMODE(
+\gdef\xyPSalternative@#1#2{%
+\expandafter\global\expandafter\let\csname origxy#2@\endcsname=#1%
+ \xdef#1{\noexpand\ifPSspecials@
+ \noexpand\expandafter\expandafter\noexpand\csname xyPS#2@\endcsname
+ \noexpand\else
+ \noexpand\expandafter\expandafter\noexpand\csname origxy#2@\endcsname
+ \noexpand\fi}}%
+\DOCMODE)
+
+The commands |\setupxyPSlevelA@|, |\setupxyPSlevelB@|, |\setupxyPSlevelC@|
+and |\setupxyPSlevelD@| actually perform the rebindings.
+Each may be called precisely once, and each requires all lower levels are
+also set.
+
+\DOCMODE(
+\xydef@\setupxyPSlevelA@{\xyPStips@%
+ \xyPSalternative@{\Tip@@}{Tip}%
+ \xyPSalternative@{\Ttip@@}{Ttip}%
+ \xyPSalternative@{\Tip@@eu}{Tip@eu}%
+ \xyPSalternative@{\Ttip@@eu}{Ttip@eu}%
+ \xyPSalternative@{\hook@@}{hook}%
+ \xyPSalternative@{\ahook@@}{ahook}%
+ \xyPSalternative@{\bhook@@}{bhook}%
+ \xyPSalternative@{\aturn@@}{aturn}%
+ \xyPSalternative@{\bturn@@}{bturn}%
+ \xyPSalternative@{\squiggle@@}{squiggle}%
+ \xyPSalternative@{\stopper@@}{stopper}%
+ \xyPSalternative@{\line@@}{dash}%
+ \xyPSalternative@{\circhar@@}{circhar@}%
+% \xywithoption{cmtip}{\xyPScmtips@}%
+ \gdef\setupxyPSlevelA@{\PSincrease@{1}}%
+ \global\let\UsePSspecials=\UsePSspecials@x \PSspecials@true}
+%
+\xydef@\setupxyPSlevelB@{%
+ \let\xyPSfont@=\empty \let\xyPSsemifont@=\empty
+ \xyPSalternative@{\cirrestrict@@}{cirrest}%
+ \gdef\setupxyPSlevelB@{\PSincrease@{2}}%
+ \setupxyPSlevelA@ }
+%
+\xydef@\setupxyPSlevelC@{%
+ \xyPSalternative@{\cirbuild@}{cirbuild}%
+ \xyPSalternative@{\CIRfull@}{CIRfull}%
+ \xyPSalternative@{\solid@}{solid}%
+ \xyPSalternative@{\point@}{point}%
+ \xywithoption{curve}{%
+ \xyPSalternative@{\splinesolid@}{splinesolid}}%
+ \gdef\setupxyPSlevelC@{\PSincrease@{3}}%
+ \setupxyPSlevelB@ }%
+%
+\xydef@\setupxyPSlevelD@{%
+ \xyPSalternative@{\dash@}{dashed}%
+% \xyPSalternative@{\squiggle@}{squiggled}%
+ \xywithoption{curve}{%
+ \xyPSalternative@{\splinedashed@}{splinedashed}%
+ \xyPSalternative@{\splinedotted@}{splinedotted}}%
+ \gdef\setupxyPSlevelD@{}%\PSincrease@{4}}%
+ \setupxyPSlevelC@ }
+\DOCMODE)
+
+The bindings are not performed until |\setupxyPS@| is called.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Kernel improvements}
+??=[kernel]
+
+\subsubsection*{Directionals:}
+
+These macros standardise the way a character is described in \PS.
+First give the |\Direction| code then the operator name,
+which is just a simple character string.
+The modifiers |\xyPSfont@| and |\xyPSsemifont@| are empty in all
+but the most primitive level of \PS\ usage. When non-empty
+they restrict to using only angles corresponding to actual font
+characters.
+
+\DOCMODE(
+\xydef@\xyPSchar@#1{%
+ \PSmacro@{\the\Direction\space \xyPSfont@ #1}}
+
+\xydef@\xyPSsemichar@#1{%
+ \PSmacro@{\the\Direction\space \xyPSsemifont@ #1}}
+\DOCMODE)
+
+These macros provide \PS\ code to round a |\Direction| code to that
+corresponding to the nearest font character code, for Directional and
+semi-Directional fonts respectively.
+
+\DOCMODE(
+\xydef@\xyPSfont@{f }%{xyfont }
+\xydef@\xyPSsemifont@{fs }%{xysdfont }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Before any binding we save the original expansions of control-sequences
+whose names will be subject to rebinding. We give these first for each font.
+
+\paragraph*{tips}
+Arrow heads in |\xyatipfont| and |\xybtipfont|
+
+The tips are all set as zero-sized characters\dots
+
+\DOCMODE(
+\xydef@\xyPStip@{\xyPSchar@{t}}%{\xyPSchar@{tip}}
+%\xydef@\xyPSatip@{\xyPSchar@{a}}%{\xyPSchar@{atip}}
+%\xydef@\xyPSbtip@{\xyPSchar@{b}}%{\xyPSchar@{btip}}
+\xydef@\xyPSTip@{\xyPSchar@{/XT tt}}%{\xyPSchar@{Tip}}
+\xydef@\xyPSTtip@{\setboxz@h\bgroup
+ \reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c \xyPSchar@{/Xt tT}}%{\xyPSchar@{Ttip}}
+\xydef@\xyPSTip@eu@{\xyPSchar@{/ET tt}}%{\xyPSchar@{Tip}}
+\xydef@\xyPSTtip@eu@{\setboxz@h\bgroup
+ \reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c \xyPSchar@{/ET tT}}%{\xyPSchar@{Ttip}}
+\DOCMODE)
+
+The mechanism to handle Computer Modern tips is a little different.
+Here we must rebind |\xycm@| to avoid any calls to font names.
+When |\PSspecialstrue| then we expand a macro which will
+look at the following token to decide which type of tip
+is required after |\tip@x|.
+
+\DOCMODE(
+%\xydef@\xyPScmtips@{\xyPSalternative@{\xycm@}{cm}}%
+\xydef@\xyPScm@\tip@x{\xyFN@\xyPScm@@}%
+\xydef@\xyPScm@@{%
+ \ifx\next\tip@@ \DN@\tip@@{\tip@x\xyPScmtip@}%
+ \else\ifx\next\atip@@ \DN@\atip@@{\tip@x\xyPScmatip@}%
+ \else\ifx\next\btip@@ \DN@\btip@@{\tip@x\xyPScmbtip@}%
+ \else\DN@{}%
+ \fi\fi\fi \next@}%
+%
+\xydef@\xyPScmtip@{\xyPSchar@{ct}}%{\xyPSchar@{cmtip}}
+\xydef@\xyPScmatip@{\xyPSchar@{ca}}%{\xyPSchar@{cmatip}}
+\xydef@\xyPScmbtip@{\xyPSchar@{cb}}%{\xyPSchar@{cmbtip}}
+\DOCMODE)
+
+From version 3.3 the font coding has changed, for greater flexibility
+and consistency. In particular |\xycm@| is no longer defined.
+
+\DOCMODE(
+\xydef@\xyPStips@{%
+ \xyPSalternative@{\atip@@}{atip}%
+ \xyPSalternative@{\btip@@}{btip}%
+ \xyPSalternative@{\tip@@}{abtip}%
+}%
+
+\xydef@\xyPSatip@{\xyPSwhichatip@
+ \expandafter\xyPSchar@\expandafter{\xyPSfont@@}}%
+\xydef@\xyPSbtip@{\xyPSwhichbtip@
+ \expandafter\xyPSchar@\expandafter{\xyPSfont@@}}%
+\xydef@\xyPSabtip@{\xyPSwhichabtip@
+ \expandafter\xyPSchar@\expandafter{\xyPSfont@@}}%
+
+\xydef@\xyPSwhichatip@{\ifx\xyatipfont\xy@@atfont
+ \expandafter\xyPSatip@i \else\def\xyPSfont@@{10 /xy A}\fi }%
+\xydef@\xyPSwhichbtip@{\ifx\xybtipfont\xy@@btfont
+ \expandafter\xyPSbtip@i \else\def\xyPSfont@@{10 /xy B}\fi }%
+\xydef@\xyPSwhichabtip@{\ifx\xyatipfont\xy@@atfont
+ \expandafter\xyPSabtip@i \else\def\xyPSfont@@{10 /xy AB}\fi }%
+\xydef@\xyPSatip@i{%
+ \edef\xyPSfont@@{\tipsize@@\space/\tipfamily@@\space A}}
+\xydef@\xyPSbtip@i{%
+ \edef\xyPSfont@@{\tipsize@@\space/\tipfamily@@\space B}}
+\xydef@\xyPSabtip@i{%
+ \edef\xyPSfont@@{\tipsize@@\space/\tipfamily@@\space AB}}
+
+\xydef@\xyPSTtips@{%
+ \let\Ttip@xy=\Ttip@
+ \let\Ttip@cm=\Ttip@
+ \let\Ttip@eu=\Ttip@ }
+\DOCMODE)
+
+\paragraph*{hooks, turns and squiggles:}
+squiggles from: |\xybsqlfont|
+
+The hooks are zero-sized characters\dots
+
+\DOCMODE(
+\xydef@\xyPShook@{\xyPSchar@{h}}%{\xyPSchar@{hook}}
+\xydef@\xyPSahook@{\xyPSchar@{ha}}%{\xyPSchar@{ahook}}
+\xydef@\xyPSbhook@{\xyPSchar@{hb}}%{\xyPSchar@{bhook}}
+\DOCMODE)
+
+\dots so are the turns\dots
+
+\DOCMODE(
+\xydef@\xyPSaturn@{\xyPSchar@{ta}}%{\xyPSchar@{aturn}}
+\xydef@\xyPSbturn@{\xyPSchar@{tb}}%{\xyPSchar@{bturn}}
+\DOCMODE)
+
+This handles squiggles as individual characters.
+Squiggled connections should be handled separately, e.g. by
+ having |\xyPSsquiggle@| set the connection by something like
+ |\edef\Connect@@{\noexpand\xyPSsquiggled@ {\the\Direction}}|.
+
+\DOCMODE(
+\xydef@\xyPSsquiggle@{\xyPSchar@{g}}%{\xyPSchar@{squigl}}
+\DOCMODE)
+
+\TODO:
+define composite |\xyPSsquiggled@|
+
+\TODO:
+define composite |\xyPSdashsquiggled@|
+
+\paragraph*{dashes and stoppers:}
+using characters from: |xydashfont|
+
+A stopper contributes zero size.
+However a dash gets its size from the italic correction in the
+|xydashfont|, accessed here using |\origxyline@@|.
+
+\DOCMODE(
+\xydef@\xyPSstopper@{\xyPSchar@{st}}%{\xyPSchar@{stopper}}
+
+%\xydef@\xyPSfliptrue@{\DN@{\xyPSsemichar@{true dash}}}
+\xydef@\xyPSfliptrue@{\DN@{\xyPSsemichar@{T d}}}
+
+\xydef@\xyPSdash@{%
+% \DN@{\xyPSsemichar@{false dash}}%
+ \DN@{\xyPSsemichar@{F d}}%
+ \ifnum\SemiDirectionChar=31
+ \ifdim\d@Y<\z@
+ \ifdim\d@X<\z@ \ifx\xyPSsemifont@\empty\xyPSfliptrue@\fi\fi
+ \else
+ \ifdim\z@>\d@X
+ \ifx\xyPSsemifont@\empty\else\xyPSfliptrue@\fi
+ \else\xyPSfliptrue@\fi
+ \fi\fi
+ \next@ \setboxz@h{\origxydash@}\kern\wdz@
+ \setbox\z@=\box\voidb@x }
+\DOCMODE)
+
+\subsubsection*{Circles}
+
+full circles and circle segments: |\xycircfont|
+
+This handles the cases where a font character is called using |\circhar#1|.
+
+\DOCMODE(
+\xydef@\xyPScirchar@#1{\count@=#1\edef\tmp@{\the\count@}%
+ \ifcase#1%
+ \xyPScirchar@@@{-180}{-135}{\tmp@}\dimen@=\partroottwo\R@
+ \or\xyPScirchar@@@{-135}{-90}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{-90}{-45}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{-45}0{\tmp@}\dimen@=\partroottwo\R@
+ \or\xyPScirchar@@@0{45}{\tmp@}\dimen@=\partroottwo\R@
+ \or\xyPScirchar@@@{45}{90}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{90}{135}{\tmp@}\dimen@=\halfroottwo\R@
+ \or\xyPScirchar@@@{135}{180}{\tmp@}\dimen@=\partroottwo\R@
+ \fi}
+
+\xydef@\xyPScirrest@{\relax}%
+\DOCMODE)
+
+This replaces just the font character, called using |\circhar@@#1|.
+
+\DOCMODE(
+\xydef@\xyPScirchar@@#1{\relax\count@=#1\edef\tmp@{\the\count@}%
+ \expandafter\xyPScirchar@@@\ifcase#1%
+ {-180}{-135}{\tmp@}\kern\partroottwo\R@
+ \or{-135}{-90}{\tmp@}\kern\halfroottwo\R@
+ \or{-90}{-45}{\tmp@}\kern\halfroottwo\R@
+ \or{-45}0{\tmp@}\kern\partroottwo\R@
+ \or 0{45}{\tmp@}\kern\partroottwo\R@
+ \or{45}{90}{\tmp@}\kern\halfroottwo\R@
+ \or{90}{135}{\tmp@}\kern\halfroottwo\R@
+ \or{135}{180}{\tmp@}\kern\partroottwo\R@
+ \fi}
+
+\xydef@\xyPScirchar@@@#1#2#3{\edef\tmp@{#1\space#2\space
+ \expandafter\removePT@\the\R@\space #3\space c}%
+ \PSmacro@{\tmp@}}
+\DOCMODE)
+
+This next macro will allow for more general circle segments to be
+done in \PS. The two parameters are the starting angle
+and finishing angle respectively, measured anti-clockwise.
+
+\DOCMODE(
+\xydef@\xyPScirc@#1#2{\edef\tmp@{\expandafter\removePT@\the\R@}%
+% \PSmessage{\tmp@\space #1 #2 circ}\PSmacro@{\tmp@\space #1 #2 circ}}
+ \PSmacro@{\tmp@\space #1 #2 o}}
+\DOCMODE)
+
+These gives full circles and circle segments built from quarter turns.
+
+\DOCMODE(
+\xydef@\xyPSCIRfull@{\setboxz@h{\kern\R@\xyPScirc@0{360}\kern\R@}%
+ \wd\z@=\z@ \ht\z@=\R@ \dp\z@=\R@ \boxz@}%
+
+\xydef@\xyPScirbuild@{{%
+ \count@=\CIRlo@@ \count@@=\CIRhi@@
+ \multiply\count@ by45 \advance\count@-180 \relax
+ \multiply\count@@ by45 \advance\count@@-180 \relax
+ \def\tmp@{}%
+ \ifx\CIRtest@@\CIRtest@inside
+ \ifnum\count@@>\count@
+ \edef\tmp@{\noexpand\xyPScirc@{\the\count@}{\the\count@@}}\fi
+ \else\ifx\CIRtest@@\CIRtest@outside
+ \ifnum\count@>-180 \advance\count@ by360 \relax
+ \edef\tmp@{\noexpand\xyPScirc@{\the\count@@}{\the\count@}}%
+ \else
+ \ifnum\count@@<180 \relax
+ \edef\tmp@{\noexpand\xyPScirc@{\the\count@@}{180}}%
+ \fi\fi
+ \fi\fi
+ \kern\R@\tmp@\kern\R@}}
+\DOCMODE)
+
+\subsubsection*{Lines}
+solid, dashed and dotted; without using segments.
+
+This is based on |\straight@|. It is used by all three types of line,
+taking an appropriate macro as the parameter |#1|.
+
+\DOCMODE(
+\xydef@\xyPSstraight@#1{\setupDirection@
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \DN@##1##2{\def\checkoverlap@@{%
+ \ifdim##1\X@p>##1\X@c \let\next@=\relax \fi
+ \ifdim##2\Y@p>##2\Y@c \let\next@=\relax \fi}}%
+ \edef\nextii@{{\sd@X}{\sd@Y}}\expandafter\next@\nextii@
+ \noCshavep@@
+ \edef\Cshavep@@{\pfromthep@ \noexpand\resetDirection@}%
+ \noCshavec@@
+ \edef\Cshavec@@{\cfromthec@ \noexpand\resetDirection@}%
+ \ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi \fi
+ \ifInvisible@\let\next@=\relax \else
+ \DN@{\setboxz@h{\kern\X@c \raise\Y@c\hbox{#1}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\xykillstyles@\Drop@@}}%
+ \fi
+ \checkoverlap@@
+ \ifdim\d@X=\z@ \ifdim\d@Y=\z@ \DN@{\relax}\fi\fi \next@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\Creset@@ }
+\DOCMODE)
+
+This is not needed unless styles are used, hence |xyps-s| is loaded.
+
+\DOCMODE(
+\xylet@\xykillstyles@=\relax
+\DOCMODE)
+
+Here is how solid lines are done.
+
+\DOCMODE(
+%\xydef@\xyPSsolid@{\ifInvisible@ \let\next@=\no@@
+% \else \DN@{\xyPSstraight@\xyPSsolid@@@}\fi \next@ }
+
+\xydef@\xyPSsolid@{\straight@\xyPSsolidSpread@}%
+\xydef@\xyPSsolidSpread@{\xyPSspread@{solid}{l}@@}%
+
+\xydef@\xyPSdottedSpread@{\xyPSspread@{dotted}{dt}@@}%
+
+\xydef@\xyPSdashed@{\line@ \def\Connect@@{\straight@\xyPSdashedSpread@}}
+\xydef@\xyPSdashedSpread@{\xyPSspread@{dashed}{dd}@@}%
+
+
+\xydef@\xyPSspread@#1#2@@#3\repeat@{\edef\tmp@{%
+ \expandafter\removePT@\the\d@X\space\expandafter\removePT@\the\d@Y}%
+ \setboxz@h{\kern\X@c \raise\Y@c\hbox{%
+ \PSmessage{#1 line:}\PSmacro@{\tmp@\space #2}}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ \boxz@}
+\DOCMODE)
+
+
+This replaces the \Xy-pic |\dash@| to give dashed lines:
+
+\DOCMODE(
+%\xydef@\xyPSdashed@{\line@ \def\Connect@@{\xyPSstraight@\xyPSdashed@@}}
+%\xydef@\xyPSdashed@@{\edef\tmp@{%
+% \expandafter\removePT@\the\d@X\space\expandafter\removePT@\the\d@Y }%
+% \PSmessage{dashed line: \tmp@}\PSmacro@{\tmp@\space dd}}
+\DOCMODE)
+
+This replaces the \Xy-pic |\point@| to give dotted lines.
+\Xy-pic defines |\zerodot| to be a small centred square
+with side length |\xydashw@|. The \PS\ substitute is
+a round dot of this radius.
+
+\DOCMODE(
+\xydef@\xyPSpoint@{\xyPSzerodot@\egroup
+ \Invisible@false \Hidden@false \def\Leftness@{.5}\def\U@pness@{.5}\ctipEdge@
+% \def\Drop@@{\styledboxz@}\def\Connect@@{\xyPSstraight@\xyPSdotted@}}
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@\xyPSdottedSpread@}}
+
+%\xydef@\xyPSdotted@{\edef\tmp@{%
+% \expandafter\removePT@\the\d@X\space\expandafter\removePT@\the\d@Y }%
+% \PSmessage{dotted line: \tmp@}\PSmacro@{\tmp@\space dt}}
+\xydef@\xyPSzerodot@{\PSmessage{dot:}\PSmacro@{p}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Frames}\leavevmode
+
+These are used for dashed frames.
+
+%\DOCMODE(
+%\xydef@\xyPSdashhfill@{{\SemiDirectionChar=95 \Direction=3072 \xyPSdash@}}
+%\xydef@\xyPSdashvfill@{{\SemiDirection=31 \Direction=1023 \xyPSdash@}}
+%\DOCMODE)
+
+This may do circular frames.
+
+%\DOCMODE(
+%\xydef@\xyPScircled@#1{{\R@=#1\relax
+% \setboxz@h{\dimen@=\X@c\advance\dimen@-\R@c\kern\dimen@
+% \raise\Y@c\hbox{\xyPSCIRfull@}}%
+% \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ \boxz@}}
+%\DOCMODE)
+
+\paragraph*{Curves}\leavevmode
+
+\DOCMODE(
+\xydef@\xyPScubic@#1{\readsplineparams@
+ \PSmessage{CUBIC:}%
+ \DN@{#1}\ifx\next@\empty\PSmacro@{mark \cubicinfo@\space bz}%
+ \else\PSmacro@{mark \cubicinfo@\space b#1}\fi}
+
+\xydef@\xyPSsquine@#1{\readsplineparams@
+ \PSmessage{SQUINE:}%
+ \DN@{#1}\ifx\next@\empty\PSmacro@{mark \squineinfo@\space q#1}%
+ \else\PSmacro@{mark \squineinfo@\space q#1}\fi}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\xyPSsplinesolid@{\ifx\splineinfo@\squineinfo@
+ \expandafter\xyPSsquine@\else\expandafter\xyPScubic@\fi{}}
+
+\xydef@\xyPSsplinedashed@{\ifx\splineinfo@\squineinfo@
+ \expandafter\xyPSsquine@\else\expandafter\xyPScubic@\fi{d}}
+
+\xydef@\xyPSsplinedotted@{\ifx\splineinfo@\squineinfo@
+ \expandafter\xyPSsquine@\else\expandafter\xyPScubic@\fi{t}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyps.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:50:08 ross
+% Maintenance release.
+%
+% Revision 3.3 1996/12/18 09:31:46 ross
+% revised interface to straight connections
+% revised interface for tips, handles arbitrary scaling
+% driver/option-loading now uses \xyrequire
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/05 22:10:30 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.12 1994/10/25 03:01:14 ross
+% Final 3beta release [bug fixes & AMS-LaTeX fitting].
+%
+% Revision 2.11 1994/07/05 06:34:32 ross
+% fixed bug with quadratic curves
+% fixed minor documentation bugs
+%
+% Revision 2.10 1994/06/15 12:46:03 ross
+% Second release 3beta.
+% Colour and line style saving works; label colouring bug fixed.
+%
+% Revision 2.9 1994/06/09 14:50:54 ross
+% Release 3beta.
+% Includes support for special effects: Rotations, Scaling, Line-width, Colour.
+% Back-ends are separated into separate files.
+% More back-ends are supported, experimentally --- needs testing.
+%
+% Revision 2.8 1994/04/08 10:36:40 ross
+% Second 3alpha release.
+%
+% Revision 2.7 1994/03/28 10:57:02 ross
+% First version.
+%
+% Initial version by Ross Moore based on XYps 2.6.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xypsdict.doc b/Master/texmf-dist/source/generic/xypic/xypsdict.doc
new file mode 100644
index 00000000000..34a63c0c4c5
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xypsdict.doc
@@ -0,0 +1,375 @@
+%% $Id: xypsdict.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``PostScript backend prolog''.
+%% Copyright (c) 1995-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+
+%\let\xypsdictloaded=\empty %
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This file contains the addendum to the dictionary of \PS\ commands which
+need to be available to the \PS\ driver when the \PS\ back-end has been
+requested.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{\PS\ backend Dictionary}
+
+Open a group and set some constants.
+Make sure the preliminary part is also loaded, in case |\XYpredict@|
+has not been set to |\relax|.
+Then make line-ends active.
+
+\DOCMODE(
+\begingroup \xycatcodes%
+ \count@=\xydashl@\relax \count@@=\xydashw@\relax%
+ \XYpredict@\relax \xycatcodes \xyPSobeylines@@%
+%
+\PSdict@@{/XYdict where pop begin XYdict begin}%
+%
+\PSdict@@{%
+ /xysize 10 def /T true def /F false def
+% /xypspt{72 72.27 div dup scale}bind def
+ /dimendiv{65536 div}bind def
+ /xysegl \number\count@\space dimendiv def
+ /xyopp{1 -1 scale}bind def
+ /xynormwidth{\number\count@@\space dimendiv pscorrect}bind def
+ /xywidth{xynormwidth setlinewidth}bind def
+}%
+%\PSdict@@{%
+% /xy{mark exch countdictstack /xylevel exch def xyopen xycolor stopped
+% xyclose cleartomark}def
+%}%
+\PSdict@@{%
+ /xyfont{4096 add 64 div round 64 mul 4096 sub}def /xydt 0.01 def
+ /xysdfont{4096 add 32 div round 32 mul 4096 sub}def
+ /xydots{xywidth 1 setlinecap [xydt 2] 0 setdash}bind def
+ /f /xyfont load def /fs /xysdfont load def}%
+%
+\PSdict@@{%
+ /xyCheckDir{dup 8 div 3 mul 3 -1 roll sub neg exch div 360 mul
+ dup dup XYdirection sub 180 div round 180 mul XYdirection add
+ dup 3 -1 roll sub abs 10 gt not{exch}if pop}def
+}%
+\ifdim\xydashw@=0pt\xydashw@=.4pt\fi\count@@=\xydashw@\relax%
+\PSdict@@{%
+ /xyrulth{\number\count@@\space dimendiv pscorrect setlinewidth
+ 0 setlinecap}bind def
+}%
+\PSdict@@{%
+ /gsavexy{gsave xypspt XYdirection rotate xywidth newpath 0 0 moveto}def
+ /gchksavexy{gsave xypspt setupDirection xywidth newpath 0 0 moveto}def
+}%
+%
+\PSdict@@{%
+ /xyswap{XYdirection 180 add /XYdirection exch def}def
+ /xyline{gstartxy setupDirection rlineto xystroke}def
+}%
+\PSdict@@{%
+ /dash{exch gchksavexy xysegl XYdirection dup
+ -90 lt{pop neg}{90 gt{neg}if}ifelse exch{neg}if
+ 0 rlineto xystroke}def
+ /stopper{gstartxy setupDirection 0 xysegl 2 div rmoveto
+ 0 xysegl neg rlineto xystroke }def
+ /d /dash load def /st /stopper load def}%
+%
+\PSdict@@{%
+ /solid{gstartxy xydash neg exch neg exch rlineto xystroke}def
+ /dashed{gstartxy 2 copy dup mul exch dup mul add sqrt dup
+ xysegl add xysegl 2 mul div round 2 mul 1 sub div [ exch dup ] 0 setdash
+ neg exch neg exch rlineto xystroke}def
+ /l /solid load def /dd /dashed load def}%
+%
+\PSdict@@{%
+ /dot{gstartxy 2 setlinecap [xydt 2] 0 setdash
+ 1 0 rlineto xystroke}def
+ /dotted{gstartxy 2 copy dup mul exch dup mul add sqrt dup
+ 2 div round 1 add div 2 setlinecap [xydt 3 -1 roll] 0 setdash
+ neg exch neg exch rlineto 0 0 rlineto xystroke}def
+ /p /dot load def /dt /dotted load def}%
+%
+\PSdict@@{%
+ /cubic{gstartxy docubic} def
+ /docubic{chkvalid
+ {chkcubedge 8 -2 roll moveto curveto xystroke pop}
+ {cleartomark grestore}ifelse}def
+ /chkcubedge{2 copy 1.0 eq{0.0 eq{pop pop}{cubicedge}ifelse}
+ {pop cubicedge}ifelse}def
+ /bz /cubic load def}%
+%
+\PSdict@@{%
+ /dotcubic{gstartxy 1 setlinecap [xydt 2] 0 setdash docubic}def
+ /dashcubic{gstartxy [5 5] 0 setdash docubic}def
+ /bt /dotcubic load def /bd /dashcubic load def}%
+%
+\PSdict@@{%
+ /squine{gstartxy dosquine}def
+ /dosquine{chkvalid
+ {chksquedge 2 copy moveto xysq2cub curveto xystroke pop}
+ {cleartomark grestore}ifelse}def
+ /q /squine load def}%
+%
+\PSdict@@{%
+ /chkvalid{2 copy lt{dup 1 gt{false}{true}ifelse}{false}ifelse}def
+}%
+\PSdict@@{%
+ /chksquedge{2 copy 1.0 eq{0.0 eq{pop pop}{squineedge}ifelse}
+ {pop squineedge}ifelse}def
+ /xysq2cub{xysq2cubit 6 1 roll xysq2cubit 6 1 roll 3 index 3 index
+ xysq2cubit 6 1 roll xysq2cubit 6 1 roll pop pop}def
+ /xysq2cubit{2 index 2 mul add 3 div}def
+}%
+\PSdict@@{%
+ /dotsquine{gstartxy 1 setlinecap [xydt 2] 0 setdash dosquine}def
+ /dashsquine{gstartxy [5 5] 0 setdash dosquine}def
+ /qt /dotsquine load def /qd /dashsquine load def}%
+%
+\PSdict@@{%
+/xy4mul{8 copy
+ 5 -1 roll mul 5 1 roll 6 -1 roll mul 6 1 roll
+ 3 -1 roll mul exch 4 -1 roll mul 3 1 roll
+ add 3 1 roll add exch 10 2 roll
+ 7 -1 roll mul 7 1 roll 4 -1 roll mul 5 1 roll
+ 4 -1 roll mul 4 1 roll mul add 3 1 roll add
+ exch 3 -1 roll }def
+}%
+\PSdict@@{%
+ /xy44mul{4 copy 16 4 roll exch 3 1 roll 4 copy 12 4 roll
+ xy4mul 12 4 roll xy4mul 12 -4 roll 4 copy 16 4 roll
+ 8 4 roll xy4mul 12 4 roll xy4mul}def
+}%
+\PSdict@@{%
+ /cubicedge{10 2 roll exch 8 1 roll 3 -1 roll dup dup 9 2 roll
+ 5 -1 roll dup dup 9 1 roll 8 3 roll
+ 4 1 roll dup dup 5 3 roll dup dup 5 1 roll 3 -1 roll
+ 18 -2 roll 2 copy 1 sub neg 4 1 roll 1 sub neg exch 4 1 roll
+ xy444mul
+ pop pop pop 13 1 roll pop pop pop 9 1 roll 10 1 roll
+ pop 8 1 roll 7 1 roll 8 1 roll pop 5 1 roll 3 1 roll}def
+}%
+\PSdict@@{%
+ /xy444mul{4 copy 24 4 roll 12 -4 roll 16 4 roll 4 copy 16 4 roll
+ xy44mul 20 8 roll xy44mul
+ 12 -4 roll 4 -1 roll 7 1 roll exch 4 1 roll exch 6 -1 roll exch
+ 4 2 roll 16 8 roll 8 4 roll
+ 4 -1 roll 7 1 roll exch 4 1 roll exch 6 -1 roll exch 4 2 roll
+ 8 4 roll 16 4 roll 8 4 roll 20 -4 roll exch 3 1 roll
+ 4 copy 20 4 roll 4 copy 16 4 roll 4 copy 12 4 roll
+ xy4mul 28 4 roll xy4mul 20 4 roll xy4mul 12 4 roll xy4mul}def
+}%
+\PSdict@@{%
+ /squineedge{8 2 roll
+ exch 5 1 roll 3 -1 roll dup 6 2 roll 1 index exch
+ 10 -2 roll 2 copy 1 sub neg 4 1 roll 1 sub neg exch 4 1 roll
+ xy44mul 4 1 roll pop 5 1 roll 6 1 roll 3 -1 roll pop}def
+}%
+\PSdict@@{%
+ /xyshort{2 copy abs exch abs add xysegl .5 mul lt
+ {pop pop grestore}{rlineto xystroke}ifelse}def
+}%
+\PSdict@@{%
+ /tipwidth{xywidth xynormwidth dup currentlinewidth exch div
+ sqrt dup dup scale mul setlinewidth 1 setlinecap}def
+}%
+\PSdict@@{%
+ /halftip{tipwidth xysize 10 div 0 0 moveto
+ -.25 0 3 -1 roll -2.5 mul 0 xysize 2 div neg
+ dup .62 mul 2 div neg curveto}bind def
+}%
+%
+\PSdict@@{/atip{gchksavexy halftip xystroke}def
+ /btip{gchksavexy xyopp halftip xystroke}def
+ /tip{gchksavexy gsave halftip stroke grestore
+ xyopp halftip xystroke}def
+ /t /tip load def /a /atip load def /b /btip load def}%
+%
+\PSdict@@{/cmatip{gchksavexy halfcmtip xystroke}def
+ /cmbtip{gchksavexy xyopp halfcmtip xystroke}def
+ /cmtip{gchksavexy gsave halfcmtip stroke grestore
+ xyopp halfcmtip xystroke}def
+ /halfcmtip{tipwidth 0 0 moveto
+ -.1333 0 .25 neg dup .125 3 -1 roll .25 curveto}bind def
+% /cma{exch gchksavexy xyfscale cm halfxytip xystroke}def
+% /cmb{exch gchksavexy xyfscale xyopp cm halfxytip xystroke}def
+% /cmab{exch gchksavexy xyfscale gsave cm halfxytip stroke
+% grestore xyopp cm halfxytip xystroke}def
+ /ct /cmtip load def /ca /cmatip load def /cb /cmbtip load def}%
+%
+\PSdict@@{%
+% /halfxytip{xyfsize mul 2 div exch xyfsize mul neg tipwidth 0 0 moveto
+% dup dup 5 -2 roll dup dup 4 2 roll mul 5 1 roll 3 1 roll curveto}bind def
+% /eu{2 3 div 1 8 div 7 16 div}def
+% /cm{1 3 div 1 5 div 1 2 div}def
+% /XY{1 3 div 1 2 div .31}def
+% /eua{exch gchksavexy xyfscale eu halfxytip xystroke}def
+% /eub{exch gchksavexy xyfscale xyopp eu halfxytip xystroke}def
+% /euab{exch gchksavexy xyfscale gsave eu halfxytip stroke
+% grestore xyopp eu halfxytip xystroke}def
+% /xya{exch gchksavexy xyfscale XY halfxytip xystroke}def
+% /xyb{exch gchksavexy xyfscale xyopp XY halfxytip xystroke}def
+% /xyab{exch gchksavexy xyfscale gsave XY halfxytip stroke
+% grestore xyopp XY halfxytip xystroke}def
+%
+ /xyfscale{/xyfsize exch def}def /xyfsize{10}def
+ /eu{-0.0551 0.0643 -0.0976 0.1386 -0.125 0.2188}def
+ /cm{-0.105 0.0437 -0.1804 0.1380 -0.2 0.25}def
+ /XY{-0.1753 0.0181 -0.3452 0.0708 -0.5 0.155}def
+ /tipstart{3 -1 roll gchksavexy exch xyfscale tipwidth dup XYdict exch
+ known{dup /xy eq{pop /XY}if}{pop /XY}ifelse XYdict exch get}def
+ /tipend{halfxytip xystroke}def
+ /halfxytip{1 1 6{pop xyfsize mul 6 1 roll}for 0 0 moveto curveto}def
+ /A{tipstart D}def /B{tipstart C}def /C{xyopp D}def /D{exec tipend}def
+ /AB{tipstart dup gsave exec halfxytip stroke grestore C}def
+}%
+%\PSdict@@{/aTip{gchksavexy halfTip xystroke}def
+% /bTip{gchksavexy xyopp halfTip xystroke}def }
+%
+\PSdict@@{%/halfTip{360 32 div neg rotate halftip}bind def
+% /halfTtip{.31 mul 1 atan rotate halftip}bind def
+% /Tip{gchksavexy gsave halfTip stroke grestore
+% xyopp halfTip xystroke}def
+% /Ttip{gchksavexy xysegl neg 0 rlineto 0 0 moveto
+% gsave -1 halfTtip stroke grestore xyopp -1 halfTtip xystroke}def
+%
+ /Tip{exch gchksavexy /xyfsize{10}def tipwidth gsave
+ dup XYdict exch known{dup /xy eq{pop /XT}if}{pop /XT}ifelse
+ XYdict exch get dup
+ halfTip stroke grestore xyopp halfTip xystroke}def
+ /XT{360 32 div neg}def /Xt{-1 .31 mul 1 atan}def
+ /ET{360 64 div 5 mul neg}def /Et{-1 .31 mul 1 atan}def
+ /halfTip{exec rotate XY halfxytip}def /halfTtip{halfTip}def
+ /Ttip{exch gchksavexy /xyfsize{10}def tipwidth gsave
+ dup XYdict exch known{dup /xy eq{pop /Xt}if}{pop /Xt}ifelse
+ XYdict exch get dup
+ halfTtip stroke grestore xyopp halfTtip xystroke}def
+ /tt /Tip load def /tT /Ttip load def}%
+%
+\PSdict@@{/halfturn{xysegl 2 div dup dup neg exch rmoveto
+ 0 exch dup exch -180 -90 arc}bind def
+ /aturn{gchksavexy halfturn xystroke}def
+ /bturn{gchksavexy xyopp halfturn xystroke}def
+ /ta /aturn load def /tb /bturn load def}%
+%
+\dimen@=\xybsqll@\relax\count@=\dimen@%
+%
+\PSdict@@{%
+ /xysqll \the\count@\space dimendiv def
+ /squigl{gchksavexy xysqll dup neg 0 rmoveto
+ 2 div dup dup neg dup 3 -1 roll
+ 2 sqrt mul dup 5 1 roll
+ 135 45 arcn dup 3 -1 roll -135 -45 arc
+ xystroke}def
+ /g /squigl load def}%
+%
+\PSdict@@{/fullhook{0 xysegl 2 div dup -90 90 arcn}bind def
+ /halfhook{xysegl 2 div dup 0 exch 180 90 arcn}bind def
+}%
+\PSdict@@{/ahook{gchksavexy fullhook xystroke}def
+ /bhook{gchksavexy xyopp fullhook xystroke}def
+ /hook{gchksavexy gsave halfhook stroke grestore
+ xyopp halfhook xystroke}def
+ /h /hook load def /ha /ahook load def /hb /bhook load def}%
+%
+%\PSdict@@{/halfstop{90 rotate xysegl 1.4 mul 0 rlineto}bind def}
+%\PSdict@@{/astop{gsavexy halfstop xystroke}def}
+%\PSdict@@{/bstop{gsavexy xyopp halfstop xystroke}def}
+%\PSdict@@{/abstop{gsavexy 90 rotate xysegl 1.4 mul
+% dup 2 div 0 rmoveto neg 0 rlineto xystroke}def}
+%
+\PSdict@@{%
+ /xyqcirc{dup dup neg exch translate newpath
+ dup neg 0 exch moveto 0 0 3 -1 roll -90 0 arc}bind def
+}%
+%
+\PSdict@@{%
+ /circ{gstartxy
+ 3 copy pop 2 copy cos mul 3 1 roll sin mul
+ rmoveto 0 0 5 2 roll arc xystroke}bind def
+ /o /circ load def}%
+%
+\PSdict@@{%
+ /circhar{gsave dup 3 gt{7 sub neg}if dup
+ 3 eq{pop dup 2 sqrt -2 div mul}{dup 1 eq{pop dup 2 sqrt 2 div mul}
+ {0 eq{dup}{0}ifelse}ifelse}ifelse
+ 0 translate 3 1 roll circ grestore}bind def
+ /c /circhar load def}%
+%
+\PSdict@@{end end}%
+%
+\endgroup%
+\DOCMODE)
+
+Close the group and clean-up.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xypsdict.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.6 1998/03/06 01:28:05 krisrose
+% Releasing (with Y&Y fonts).
+%
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 03:50:08 ross
+% Maintenance release.
+%
+% Revision 3.3 1996/12/18 09:36:42 ross
+% PostScript support for scaling arrow-tips: CM and Euler
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% new for version 3.1.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xypspatt.doc b/Master/texmf-dist/source/generic/xypic/xypspatt.doc
new file mode 100644
index 00000000000..e26fce5181a
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xypspatt.doc
@@ -0,0 +1,182 @@
+%% $Id: xypspatt.doc,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Xy-pic ``PostScript pattern prolog''.
+%% Copyright (c) 1995-1998 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1998 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% As a special exception, you may use this file and all files derived
+%% from it without restrictions. This special exception was added with
+%% version 3.7 of Xy-pic.
+%%
+%\let\xypspattloaded=\empty %
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This file contains the addendum to the dictionary of \PS\ commands which
+need to be available to the \PS\ driver when patterns have been requested.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{\PS\ pattern support}
+
+Open a group, set the catcodes to normal and make line-ends active.
+
+\DOCMODE(
+\begingroup \xycatcodes \xyPSobeylines@@%
+%
+\PSdict@@{/XYdict where pop begin XYdict begin}%
+%
+%
+% use as: /name <data> :t to create a pattern object in XYdict
+%
+% eg <data>: /bk[1 1 1]def /fg[0 0 0]def
+% <B1B1B13030300303031B1B1BD8D8D8C0C0C00C0C0C8D8D8D> fg bk
+%
+% (be careful with setmatrix , for consistency across <driver>s
+%
+\PSdict@@{/:patt
+{XYddict begin
+14 dict begin
+/BGnd exch def % null OR color spec in rgb, as an array
+/FGnd exch def % color spec in rgb, as an array
+/PaintData exch def % pattern spec as a Hex string, 16 x 3-component
+/PatternType 1 def
+/PaintType 1 def
+/BBox[0 0 1 1]def
+/TilingType 1 def
+/XStep 1 def
+/YStep 1 def
+/PatternMtx[24 0 0 24 0 0]def
+/PaintProc BGnd null ne % defined according to BGnd and FGnd colours
+ {{begin BGnd aload pop setrgbcolor 0 0 1 1 rF
+ FGnd aload pop setrgbcolor
+ 24 24 true PatternMtx PaintData imagemask end}}
+ {{begin FGnd aload pop setrgbcolor
+ 24 24 true PatternMtx PaintData imagemask end}}
+ ifelse def
+ currentdict PatternMtx end
+ gsave patangle xyland{180 add}if % xyport not{180 add}if
+ rotate macfreq patfreq div dup neg exch scale matrix currentmatrix
+ grestore gsave setmatrix /DeviceRGB setcolorspace makepattern grestore
+ end}def}%
+%
+\PSdict@@{%
+/rF{gsave % stack: x y dx dy rF
+ newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ fill grestore}bind def }%
+%
+\PSdict@@{%
+ /setpatscreen{/pattstring exch store patfreq
+ patangle xyport not{90 add}if
+ {1 add 4 mul cvi pattstring exch get exch 1 add 4 mul cvi 7 sub
+ bitshift 1 and}setscreen}bind def
+ /setcolpattern{setpatscreen 64 div 1 exch sub currentrgbcolor
+ 1 1 3{pop 1 exch sub 3 index mul 1 exch sub 3 1 roll}for
+ setrgbcolor pop}def
+ /setgraypattern{setpatscreen 64 div setgray}def
+ /macfreq 9.375 def /patangle 0 def /patfreq 12.5 def}%
+%
+\PSdict@@{/checkland{%
+ /normland where{pop normland not}{false}ifelse
+ /xyland exch def
+ /por where{pop por}{/isls where{pop isls not /xyland true def}
+ {/land where{pop land not}{true}
+ ifelse}ifelse}ifelse /xyport exch def}def }%
+%
+\PSdict@@{%
+ /setpatfreq{/patfreq exch def}def
+ /setpatangle{/patangle exch def}def
+ /setbackcolor{/backcolor exch def}def
+ /setforecolor{/forecolor exch def}def
+ [1 1 1] setbackcolor xycolarray setforecolor
+ /bg /setbackcolor load def /fg /setforecolor load def
+ /pa /setpatangle load def /pq /setpatfreq load def }%
+%
+\PSdict@@{%
+ /xypattern{checkland counttomark dup 0 eq{pop}
+ {dup 1 eq{pop setpatscreen}
+ {dup 2 eq{pop setcolpattern}
+ {dup 3 eq{pop
+ /setcolorspace where { %
+ /.setcolorspace where{pop pop pop setcolpattern} %hack for Ghostscript
+ {/.buildpattern where {pop % hack for older Ghostscript
+ forecolor backcolor :patt setpattern % hack for older Ghostscript
+ }{pop pop setcolpattern}ifelse}ifelse} % hack for Ghostscript
+% pop forecolor backcolor :patt setpattern} % hack for Ghostscript
+ {pop setcolpattern}ifelse}
+ {5 eq{/setcolorspace where{ %
+ /.setcolorspace where{pop pop pop pop pop setcolpattern} % Ghostscript
+ {/.buildpattern where {pop % hack for older Ghostscript
+ :patt setpattern % hack for older Ghostscript
+ }{pop pop pop pop setcolpattern}ifelse}ifelse} %hack for Ghostscript
+% pop :patt setpattern} % hack for Ghostscript
+ {pop pop pop setcolpattern}ifelse
+ }{}ifelse}ifelse}ifelse}ifelse}ifelse cleartomark }def
+ /xysetpattern{/xypatt exch def}def
+ /sp /xysetpattern load def }%
+%
+\PSdict@@{end end}%
+%
+\endgroup%
+\DOCMODE)
+
+Close the group and clean-up.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xypspatt.doc,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.3 1996/12/18 09:38:37 ross
+% minor change to prevent multiple loading
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% new for version 3.1.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyrecat.doc b/Master/texmf-dist/source/generic/xypic/xyrecat.doc
new file mode 100644
index 00000000000..89b3c828f84
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyrecat.doc
@@ -0,0 +1,95 @@
+%% $Id: xyrecat.doc,v 3.3 1996/12/19 03:31:56 krisrose Exp $
+%%
+%% Xy-pic ``Reset Category Codes'' utility.
+%% Copyright (c) 1994-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+ However, it is possible to `repair' the problem in case any of the
+ characters |#$&'+-.<=>`| change category code:
+%
+\begin{defs1}
+|\xyresetcatcodes|
+\end{defs1}
+\noindent\unskip
+%
+ will load the file ??c![xyrecat.tex] (version
+ \stripRCS$Revision: 3.3 $) to do it.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}
+\DOCHEADER
+\noindent
+ The command is defined in |xy.doc|: the purpose of this file is to be
+ reloadable such that the characters can be reread by \TeX\ with fresh
+ catcodes.
+
+ The code redefines the special |\add|\dots|@| control sequences used
+ for parsing of just those characters, assuming |\next| is defined
+ correctly before loading it:
+
+\DOCMODE(
+%\xyreuncatcodes
+\xyuncatcodes
+
+\xyrecat @ 64 \catcode 64 11
+
+\xymakeADD@\addHASH@ # 35
+\xymakeADD@\addDOLL@ $ 36
+\xymakeADD@\addAND@ & 38
+\xymakeADD@\addRQ@ ' 39
+\xymakeADD@\addPLUS@ + 43
+\xymakeADD@\addDASH@ - 45
+\xymakeADD@\addDOT@ . 46
+\xymakeADD@\addLT@ < 60
+\xymakeADD@\addEQ@ = 61
+\xymakeADD@\addGT@ > 62
+\xymakeADD@\addLQ@ ` 96
+
+\endinput
+
+% $Log: xyrecat.doc,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% NEW file to go in version 3!
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyrefer.man b/Master/texmf-dist/source/generic/xypic/xyrefer.man
new file mode 100644
index 00000000000..6322060fd17
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyrefer.man
@@ -0,0 +1,509 @@
+%% $Id: xyrefer.man,v 3.7 1999/02/16 15:12:50 krisrose Exp $
+%%
+%% Wrapper to print ``Xy-pic Reference Manual''.
+%% Copyright (c) 1994-1998 Kristoffer H. Rose <krisrose@brics.dk>.
+%% All rights reserved.
+
+\documentclass{article}
+\usepackage{xydoc}
+\xyoption{knot}
+\xyoption{crayon}
+\xyoption{tile}
+\makeindex
+\begin{document}
+
+\title{ \Xy-pic Reference Manual }
+
+\author{
+ Kristoffer H. Rose\\<krisrose@brics.dk>\thanks{%
+ BRICS, Computer Science, Aarhus University (bld. 540),
+ Ny Munkegade, DK--8000~Aarhus C, Denmark.}
+ \and
+ Ross Moore\\<ross@mpce.mq.edu.au>\thanks{%
+ MPCE (Mathematics dept.), Macquarie University,
+ North Ryde, Sydney, Australia NSW~2109.}
+}
+\date{Version \xyversion\quad<\xydate>}
+\maketitle
+
+\begin{abstract}
+ This document summarises the capabilities of the \Xy-pic package for
+ typesetting graphs and diagrams in \TeX. For a general introduction
+ as well as availability information and conditions refer to the
+ User's Guide~\cite{R95:Xy-picUG}.
+
+ A characteristic of \Xy-pic is that it is built around a "kernel
+ drawing language" which is a concise notation for general graphics,
+ \eg,
+%
+\begin{code}
+\xy (3,0)*{A} ; (20,6)*+{B}*\cir{} **\dir{-}
+ ? *_!/3pt/\dir{)} *_!/7pt/\dir{:}
+ ?>* \dir{>} \endxy
+\end{code}
+%
+$$\docode$$
+%
+ was drawn by the \Xy-pic kernel code
+%
+\displaycode\noindent
+%
+ It is an object-oriented graphic language in the most literal sense:
+ `objects' in the picture have `methods' describing how they typeset,
+ stretch, etc. However, the syntax is rather terse.
+
+ Particular applications make use of "extensions" that enhance the
+ graphic capabilities of the kernel to handle such diagrams as
+%
+\begin{code}
+\xy *[o]=<40pt>\hbox{Round}="o"*\frm{oo},
+ +<5em,-5em>@+,
+ (46,11)*+\hbox{Square}="s" *\frm{-,},
+ -<5em,-5em>@+,
+ "o";"s" **{} ?*+\hbox{Bend}="b"*\frm{.},
+ "o";"s"."b" **\crvs{-},
+ "o"."b";"s" **\crvs{-} ?>*\dir{>}
+\endxy
+\end{code}
+\vspace{-2pc}
+$$\docode$$
+%
+ which was typeset by
+%
+\displaycode
+\noindent
+%
+ using the `curve' and `frame' extensions.
+
+ All this is made accessible through the use of "features" that provide
+ convenient notation such that users can enter special classes of
+ diagrams in an intuitive form, \eg, the diagram
+%
+\begin{code}
+\xymatrix{
+ U \ar@/_/[ddr]_y \ar[dr] \ar@/^/[drr]^x \\
+ & X \times_Z Y \ar[d]^q \ar[r]_p
+ & X \ar[d]_f \\
+ & Y \ar[r]^g & Z }
+\end{code}
+$$\docode$$
+%
+ was typeset using the `matrix' features by the \Xy-pic input lines
+%
+\displaycode
+
+ Features exist for many kinds of input; here is a knot typeset using
+ the `knots and links' feature:
+%
+\begin{code}
+\xygraph{!{0;/r1pc/:/u.7pc/::}="A"
+ "A" [u(2.5)r]!{\xcapv[-1.5]}
+ [u]!{\xcaph\xcapv[1.5]|(-.15)\khole}
+ "A" [u]!{\xcapv[-3]}
+ [u]!{\xcaph[3]>(-.035)\khole}[rr]!{\xcapv[3]}
+ "A" [ur] !{\xunderh}
+ "A" [r] !{\xcapv-} [ur] !{\xcapv}
+ "A" [dr] !{\xunderh}
+ "A" [dd] !{\xoverh} [r]!{\xoverh}
+ "A" [rddd] !{\xunderh} [r] !{\xcapv}
+ "A" [ddd] !{\xcapv-\xcaph-} [r] !{\xcaph-}}
+\end{code}
+$$\docode$$
+%
+ The current implementation is programmed entirely within
+ ``standard \TeX\ and \MF'', \ie, using \TeX\ macros (no |\special|s)
+ and with fonts designed using \MF. Optionally special `drivers' make
+ it possible to produce DVI files with `specials' for extra graphics
+ capabilities, \eg, using \PS.
+\end{abstract}
+
+\pagebreak
+\tableofcontents
+\listoffigures
+
+\begin{figure}[b]
+\hbox to\hsize{%
+ \includegraphics{kris.eps}
+ \raise2em\hbox{Kristoffer Rose}\hss
+ Ross Moore
+ \includegraphics{ross.eps}}
+\end{figure}
+
+
+\section*{Preface}
+
+ This reference manual gives concise descriptions of the modules of
+ \Xy-pic, written by the individual authors. Please direct any
+ \TeX\-nical question or suggestion for improvement directly to the
+ author of the component in question, preferably by electronic mail
+ using the indicated address. Complete documents and printed
+ technical documentation or software is most useful.
+
+ The first part documents the \Xy-pic kernel which is always loaded.
+ The remaining parts describe the three kinds of options: "extensions"
+ in part~??g[:extensions] extend the kernel graphic capabilities,
+ "features" in part~??g[:features] provide special input syntax for
+ particular diagram types, and "drivers" in part~??g[:drivers] make it
+ possible to exploit the printing capabilities supported by DVI driver
+ programs. For each option it is indicated how it should be loaded.
+ The appendices contain answers to all the exercises, a summary of the
+ compatibility with version~2, and list some reasons why \Xy-pic might
+ sometimes halt with a cryptic \TeX\ error.
+
+\paragraph*{License.}
+%
+ \Xy-pic is free software in the sense that it is available under the
+ following ??w![license]??w[copyright] conditions:
+$$
+\xy*+[F-]\txt{\Xy-pic: Graphs and Diagrams with \TeX\\
+ \copyright~1991--1998\quad Kristoffer H. Rose\\
+ \copyright~1994--1998\quad Ross Moore\hglue2.75em\hglue1bp}\endxy
+$$
+\begin{quotation}
+%
+ The \Xy-pic package is ??w![free software]; you can redistribute it
+ and/or modify it under the terms of the ??w![GNU General Public
+ License] as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+
+ The \Xy-pic package is distributed in the hope that it will be
+ useful, but "without any ??w![warranty]"; without even the implied
+ warranty of "merchantability" or "fitness for a particular purpose".
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%
+\end{quotation}
+%
+ In practice this means that you are free to use \Xy-pic for your
+ documents but if you distribute any part of \Xy-pic (including
+ modified versions) to someone then you are obliged to ensure that the
+ full source text of \Xy-pic is available to them (the full text of
+ the license in the file ??c![COPYING] explains this in somewhat more
+ detail~\smiley~).
+
+\paragraph*{Notational conventions.}
+%
+ We give descriptions of the "syntax" of pictures as \BNF??w[BNF]
+ rules; in explanations we will use upper case letters like $X$ and
+ $Y$ for <dimen>sions and lower case like $x$ and $y$ for <factor>s.
+
+
+
+\part{The Kernel}
+??g=[kernel]
+\subsubsection*{\noindent\rlap{\small\bf
+ Vers. \xyversion\ by Kristoffer H. Rose <krisrose@brics.dk>}}
+\def\GROUP{part}\def\FILE{part}
+\CompilePrefix{xy.doc-}
+\inputdoc!{xy.doc}
+
+
+
+\part{Extensions}
+??g=[extensions]
+\def\GROUP{part}\def\FILE{section}%
+
+ This part documents the graphic capabilities added by each standard
+ extension option. For each is indicated the described version
+ number, the author, and how it is loaded.
+
+ Many of these are only fully supported when a suitable "driver"
+ option (described in part~??g[:drivers]) is also loaded, however, all
+ added constructions are always "accepted" even when not supported.
+
+\OSECTION{xycurve.doc}
+\OSECTION{xyframe.doc}
+\OSECTION{xytips.doc}
+\OSECTION{xyline.doc}
+\OSECTION{xyrotate.doc}
+\OSECTION{xycolor.doc}
+\OSECTION{xytile.doc}
+\OSECTION{xyimport.doc}
+\OSECTION{xymovie.doc}
+\OSECTION{xyps.doc}
+\OSECTION{xytpic.doc}
+\OSECTION{xyemtex.doc}
+\OSECTION{xynecula.doc}
+
+
+
+
+\part{Features}
+??g=[features]
+\def\GROUP{part}\def\FILE{section}%
+
+ This part documents the notation added by each standard feature
+ option. For each is indicated the described version number, the
+ author, and how it is loaded.
+
+ The first two, `all' and `dummy', described in~\S\S??g[:all]
+ and~??g[:dummy], are trivial features that nevertheless prove useful
+ sometimes. The next two, `arrow' and `2cell', described
+ in~\S??g[:arrow] and~??g[:2cell], provide special commands for
+ objects that `point'. The following, `matrix' in~\S??g[:matrix],
+ `graph' in~\S??g[:graph], `poly' in~\S??g[:poly], and `knot'
+ in~\S??g[:knot], are "input modes" that support different overall
+ structuring of (parts of) \Xy-pictures.
+
+\OSECTION{xyall.doc}
+\OSECTION{xydummy.doc}
+\OSECTION{xyarrow.doc}
+\OSECTION{xy2cell.doc}
+\OSECTION{xymatrix.doc}
+\OSECTION{xygraph.doc}
+\OSECTION{xypoly.doc}
+\OSECTION{xyweb.doc}
+\OSECTION{xyarc.doc}
+\OSECTION{xyknot.doc}
+\OSECTION{xysmart.doc}
+
+
+
+\part{Drivers}
+??g=[drivers]
+\def\GROUP{part}\def\FILE{sub-section}%
+
+ This part describes `drivers' that customise the parts of the DVI
+ file generated from \Xy-pictures to exploit special capabilities of
+ particular DVI driver programs through \TeX\'s |\special| command.
+ This makes the DVI files non-portable but is needed for full support
+ of some of the \Xy-pic extensions (described in
+ part~??g[:extensions]).
+
+ Figure~??g[:f-drivers] at the end of this part summarises the
+ extensions supported by all drivers.
+
+%Alphabetically...
+\makeatletter
+\def\@listD{\leftmargin1em
+ \parsep 4\p@ \@plus2\p@ \@minus\p@
+ \topsep 4\p@ \@plus2\p@ \@minus4\p@
+ \itemsep\z@ \@plus\p@ }
+\let\@listi\@listD
+\let\PS@orig=\PS
+\def\PS{{\small\PS@orig}}
+\makeatother
+
+\section{Support for Specific Drivers}
+
+\DSECTION{xydvidrv.doc}
+\DSECTION{xydvips.doc}
+\DSECTION{xydvitops.doc}
+\DSECTION{xyoztex.doc}
+\DSECTION{xy17oztex.doc}
+\DSECTION{xytextures.doc}
+\DSECTION{xy16textures.doc}
+\DSECTION{xyxdvi.doc}
+
+\begin{figure*}[bt]
+\begin{center}
+%
+{\makeatletter \global\let\DoXXX=\xydriver@unload@support@@}
+%
+\def\beginXXX{\def\next{\otherbar c\otherbar}%
+ \def\doii##1##2{%
+ \expandafter\def\expandafter\next\expandafter{\next c\otherbar}}%
+ \DoXXX\relax
+ \def\1##1{\begin{tabular}{##1}}\expandafter\1\expandafter{\next}}
+%
+\def\ClearXXX{%
+ \def\doii##1##2{\expandafter\gdef\csname##1XXX\endcsname{-}}%
+ \DoXXX}
+%
+\def\SetXXX#1{%
+ \def\doii##1##2{\expandafter\gdef\csname##1XXX\endcsname{+}}%
+ \csname xydriver@#1@support@@\endcsname}
+%
+\def\XXXentry#1#2{#1&#2}
+\def\XXXlastentry#1#2{#1\\\hline}
+%
+\def\EchoXXX{\gdef\doii##1##2##3{%
+ \ifx##3\relax \expandafter\XXXlastentry \else \expandafter\XXXentry\fi
+ {\tt##1}{##3}}}
+%
+\def\PrintXXX{\gdef\doii##1##2##3{%
+ \ifx##3\relax \expandafter\XXXlastentry \else \expandafter\XXXentry\fi
+ {\csname##1XXX\endcsname}{##3}}}
+%
+\def\Head{\hline \EchoXXX \DRIVERvsEXTENSION &\DoXXX\relax}
+\def\do#1{\expandafter\ifx\csname xydriver@#1@support@@\endcsname\DoXXX
+ \expandafter\dontdoRow\else\expandafter\doRow\fi{#1}}
+\def\doRow#1{{\tt#1}\ClearXXX\SetXXX{#1}\PrintXXX&\DoXXX\relax}
+\def\dontdoRow#1{}
+\def\Rows{\csname xydriversloaded@@\endcsname}
+%
+\def\DRIVERvsEXTENSION{\hbox{\kern.1em %
+ \lower.25ex\hbox{\tiny<driver>}%
+ \kern-.15em$\bigm\backslash$\kern-.11em %
+ \raise.5ex\hbox{\tiny<extension>}}}
+%
+\beginXXX
+ \Head\relax\Rows
+\end{tabular}
+\end{center}
+\caption{Extension implementation replaced by use of \protect<driver\protect>
+ specials.}??g=[f-drivers]
+\end{figure*}
+
+\makeatletter
+\let\do=\eat@ \def\doii#1#2{}
+\let\xyrequire=\eat@
+\makeatother
+
+\medskip\noindent
+The following \TeX\ implementation is also supported,
+but currently uses the \dvips\ driver.
+
+\DSECTION{xycmactex.doc}
+%\DSECTION{xydvipub.doc}
+%\DSECTION{xydviwindo.doc}
+
+Other implementations not specifically mentioned here
+may well work with one of the named <driver>s, though
+perhaps not all features will actually be supported.
+
+\makeatletter
+\let\@listi\@listI
+\let\PS=\PS@orig
+\makeatother
+
+\section{Extra features using \PS\ drivers}
+
+ This section acknowledges the support for extra features available
+ when using a <driver> that supports use of |\special| commands with
+ native \PS. Extra macros are required to take advantage of this;
+ these are loaded automatically in conjunction with extensions
+ specified using the |\xyoption| command, provided a <driver> which
+ supports the extension, as indicated in ??g[:f-drivers], has also been
+ specified.
+
+ Commands are also provided to turn off/on use of these features.
+ Such switches are particularly useful when developing complicated
+ diagrams, or when the intended output device does not support \PS;
+ e.g. for on-screen display. Alternatively, when attempting to use
+ drivers for which no explicit support has been provided, some
+ features may work others may not. Please inform the authors of
+ \Xy-pic of any successes or failures of such attempts.
+
+\inputdoc!{xyps-ps.doc}
+\inputdoc!{xyps-c.doc}
+\inputdoc!{xyps-f.doc}
+\inputdoc!{xyps-l.doc}
+\inputdoc!{xyps-r.doc}
+\inputdoc!{xyps-t.doc}
+
+\section{Extra features using \TPIC\ drivers}
+
+ Similarly a few extensions are supported better when |\special|
+ commands in the \TPIC\ format are supported.
+
+\inputdoc!{xytp-f.doc}
+
+
+
+\part*{Appendices}\label{Appendices}
+\addtocontents{toc}{\protect\contentsline
+ {part}{Appendices}{\protect\pageref{Appendices}}}%
+
+\appendix
+\def\GROUP{appendices}\def\FILE{appendix}%
+
+\ANSWERS
+
+\OSECTION{xyv2.doc}
+
+\section{Common Errors}
+
+ In this appendix we describe some common cases where small mistakes
+ in \Xy-pictures result in \TeX\ error messages that may seem cryptic.
+
+\paragraph*{! Box expected.\\*%
+ ! A <box> was supposed to be here.}
+
+ This message is common when an \Xy-pic <object> is mistyped such that
+ \Xy-pic expects but does not find a \TeX\ <box> construction.
+
+\paragraph*{! LaTeX Error: Bad math environment delimiter.\\*%
+ ! File ended while scanning use of \texttt{\string\xycompiled}.\\*
+ ! Argument of \texttt{\string\codeof@} has an extra \}.}
+
+ These errors can happen while reading an incomplete compiled picture
+ (such a beast is created when \Xy-pic crashes during compilation due
+ to a syntax error or other such problem).
+
+\paragraph*{! Missing \} inserted.}
+
+ This happens when |\endxy| was left out.
+
+
+\bigskip\TODO: Also include the more obscure ones\dots
+
+
+
+\ANSWERS
+\BIBLIOGRAPHY
+\INDEX
+
+\end{document}
+
+% $Log: xyrefer.man,v $
+% Revision 3.7 1999/02/16 15:12:50 krisrose
+% Interim release (Y&Y fonts now free).
+%
+% Revision 3.5 1997/05/29 21:02:36 krisrose
+% Fixed "missing breaks"...and tidied up documentation!
+%
+% Revision 3.4 1997/05/18 04:59:43 krisrose
+% Essential bugfixes.
+% Also includes preliminary movie extension...
+%
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/05 22:21:32 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:11:01 kris
+% Release 3alpha.
+%
+% NEW for version 2.7.
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyrotate.doc b/Master/texmf-dist/source/generic/xypic/xyrotate.doc
new file mode 100644
index 00000000000..0500208b343
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyrotate.doc
@@ -0,0 +1,538 @@
+%% $Id: xyrotate.doc,v 3.3 1996/12/18 09:40:16 ross Exp $
+%%
+%% Xy-pic ``Rotate and Scale extension'' option.
+%% Copyright (c) 1993-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{rotate}{Rotate and Scale extension}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This extension provides the ability to request that any object be displayed
+rotated at any angle as well as scaled in various ways.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+These are effects which are not normally available within \TeX.
+Instead they require a suitable `back-end' option to provide the necessary
+|\special| commands, or extra fonts, together with appropriate
+commands to implement the effects. Thus
+$$
+\xy
+ *+\txt<.8\hsize>{Using this extension will have no effect on the output
+ unless used with a backend that explicitly supports it.}
+ *\frm{-}
+\endxy
+$$
+
+\DOCMODE(
+\xydef@\xyundefinedRotate@#1#2@@{%\egroup %
+ \xywarning@{The #1 #2 effect is not implemented with the current driver.}}%
+\DOCMODE)
+
+The extension provides special effects that can be used with any \Xy-pic
+<object> by defining |[|<shape>|]| modifiers.
+The modification is local to the <object> currently being built,
+so will have no effect if this object is never actually used.
+
+The following table lists the modifiers that have so far been
+defined. They come in two types -- either
+a single keyword, or a key-character with the following text treated
+as a single argument.
+%
+\begin{defs}
+ |[@]| & align with current direction\cr
+ |[@|<direction>|]| & align to <direction>\cr
+ |[@!|<number>|]| & rotate <number> degrees\cr
+% |[@=|<word>|]| & make |[|<word>|]| repeat the current transformations\cr
+% |[@*]| & use previous transformations \cr
+\noalign{\smallskip}
+ |[*|<number>|]| & scale by <number> \cr
+ |[*|<num>$_x$,<num>$_y$|]| & scale $x$ and $y$ separately \cr
+%\noalign{\smallskip}
+% |[<|<direction>|]| & shear y-axis to <direction> \cr
+\noalign{\smallskip}
+ |[left]| & rotate anticlockwise by 90$^\circ$ \cr
+ |[right]| & rotate (clockwise) by 90$^\circ$ \cr
+ |[flip]| & rotate by 180$^\circ$; same as |[*-1,-1]| \cr
+ |[dblsize]| & scale to double size \cr
+ |[halfsize]| & scale to half size \cr
+\end{defs}
+%
+These |[|<shape>|]| modifiers specify transformations of the <object>
+currently being built. If the object has a rectangle edge then the size of
+the rectangle is transformed to enclose the transformed object; with
+a circle edge the radius is altered appropriately.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\TODO:
+There should be an
+ |[@*]| form which repeats the set of transformations applied to the last
+object which has been transformed, possibly in an earlier diagram.
+Also an |[@=|<word>|]| form allowing a set of transformations to be saved
+and used later, simply by specifying |[|<word>|]|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\medskip
+
+Each successive transformation acts upon the result of all previous. One
+consequence of this is that the order of the shape modifiers can make a
+significant difference in appearance---in general, transformations do not
+commute. Even successive rotations can give different sized rectangles if
+taken in the reverse order.
+
+Sometimes this change of size is not desirable. The following commands are
+provided to modify this behaviour.
+%
+\begin{defs}
+ |\NoResizing| & prevents size adjustment \cr
+ |\UseResizing| & restores size adjustments \cr
+\end{defs}
+%
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\NoResizing{\xyNoResizing@}
+\xydef@\UseResizing{\xyUseResizing@}
+
+\xydef@\xyNoResizing@{%
+ \global\let\origxyrescale@=\xyrescale@
+ \global\let\origxyrotSizeMod@=\xyrotateSizeMod@
+ \global\let\xyNoResizing@=\xyNoResizing@@
+ \global\let\xyUseResizing@=\xyUseResizing@@
+ \xyNoResizing@@ }
+
+\xydef@\xyNoResizing@@{%
+ \global\let\xyrescale@=\xyignorescale@
+ \global\let\xyrotateSizeMod@=\xyignoreSizeMod@
+ }
+
+\xylet@\xyUseResizing@=\relax
+\xydef@\xyUseResizing@@{%
+ \global\let\xyrescale@=\origxyrescale@
+ \global\let\xyrotateSizeMod@=\origxyrotSizeMod@
+ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+The |\NoResizing| command is also useful to have at the beginning of a
+document being typeset using a driver that cannot support scaling effects,
+in particular when applied to whole diagrams. In any case an unscaled
+version will result, but now the spacing and positioning will be appropriate
+to the unscaled rather than the scaled size.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Interface}
+
+Recognize the <shape> characters and keywords.
+
+\DOCMODE(
+\xydefcsname@{shape [@...]}#1{\xyrotatechar@#1@@}%
+\xydefcsname@{shape [<...]}#1{\xyshearchar@{#1}@@}%
+\xydefcsname@{shape [*...]}#1{\xyscalechar@{#1}@@}%
+
+\xydefcsname@{shape [left]}{\xyshape@left@}
+\xydefcsname@{shape [right]}{\xyshape@right@}
+\xydefcsname@{shape [flip]}{\xyshape@flip@}
+\xydefcsname@{shape [halfsize]}{\xyshape@halfsize@}
+\xydefcsname@{shape [dblsize]}{\xyshape@dblsize@}
+\xydefcsname@{shape [vflip]}{\xyshape@vflip@}
+\xydefcsname@{shape [hflip]}{\xyshape@hflip@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Each style modifier adds code to one, or both, of two global lists.
+These contents of these lists, called |\preXYtransform@@|
+and |\postXYtransform@@|.
+An implementation must define macros which are to be bound
+to the control sequence names |\preXYtransform@| and |\postXYtransform@|,
+which are prepended and appended to the |\Drop@@| and |Connect@@| methods
+for the current <object>.
+
+Also |\Drop@@| and |\Connect@@| must be modified, if this has not already
+been done as indicated by |\xy@transform@| having expansion |\relax|.
+
+\DOCMODE(
+\xydef@\preXYtransform@{}
+\xydef@\postXYtransform@{}
+
+\xywarnifdefined\preXYtransform@@
+\xywarnifdefined\postXYtransform@@
+ \gdef\preXYtransform@@{}
+ \gdef\postXYtransform@@{}
+\xydef@\xy@transform@{}
+\xydef@\preShape@@{}
+\xydef@\postShape@@{}
+\DOCMODE)
+
+The transformations must be implemented by emulating the adjoint coordinate
+transformations. This requires that code be added to |preXYtransform@@|
+in reverse order to the order of occurrence of the <shape> modifiers.
+The code is added to |\postXYtransform@@| in natural order, so that each
+addition to |\preXYtransform@@| can be closed off, if necessary,
+in a correctly nested sequence.
+
+\DOCMODE(
+\xydef@\modXYtransform@{%
+ \ifx\xy@transform@\empty
+ \transformDrop@\transformConnect@\resetTransform@\fi
+%\show\preShape@@
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\preShape@@}%
+ \DN@##1{\expandafter\gdef\expandafter\preXYtransform@@\expandafter{%
+ \tmp@ ##1}}\expandafter\next@\expandafter{\preXYtransform@@}%
+ \DN@##1{\expandafter\def\expandafter\tmp@\expandafter{##1}}%
+ \expandafter\next@\expandafter{\postShape@@}%
+ \DN@##1{\expandafter\gdef\expandafter\postXYtransform@@\expandafter{%
+ \postXYtransform@@ ##1}}\expandafter\next@\expandafter{\tmp@}}%
+
+\xydef@\transformDrop@{\let\xy@transform@=\relax
+ \expandafter\def\expandafter\Drop@@\expandafter{%
+ \expandafter\preXYtransform@\Drop@@\postXYtransform@}}
+
+\xydef@\transformConnect@{\let\xy@transform@=\relax
+ \expandafter\def\expandafter\Connect@@\expandafter{%
+ \expandafter\preXYtransform@\Connect@@\postXYtransform@}}
+
+\xydef@\resetTransform@{\gdef\preXYtransform@@{}\gdef\postXYtransform@@{}}
+\DOCMODE)
+
+\BUG: The reference point does not move correctly in \PS\ when a shift
+modifier has been applied before a rotation. The object prints outside
+of its bounding |\rectangleEdge|. Fix this!!
+
+Global macros are used, so that the same styles can be reused by
+successive objects without having to re-interpret <shape> modifiers,
+as described next.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Saving transformations}
+
+Once specified for an <object>, the collection of transformations can be
+assigned a name, via |[>|<name>|]|.
+The <name> here is any collection of letters
+or other characters up to the closing |]|.
+Subsequent use of |[>|<name>|]|, with the same or other <objects>s,
+will re-establish the saved transformations, acting on the new <object>
+with initial reference point appropriate to this <object>.
+
+\NOTE: Such namings are global and permanent.
+They are intended to allow a particular set of transformations to be
+easily repeated for different objects inside various pictures and diagrams
+within the same document.
+
+\DOCMODE(
+\xydef@\xynametransform@#1{%
+ \DN@{\expandafter\gdef\expandafter#1\expandafter{\the\toks@}}\next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Scaling and Scaled Text}
+
+The <shape> modifier can contain either a single scale factor, or a pair
+indicating different factors in the $x$- and $y$-directions.
+Negative values are allowed, to obtain reflections in the
+coordinate axes, but not zero.
+
+\DOCMODE(
+\xydef@\xyscalechar@#1@@{\xyscalechars@#1,#1,@@}
+
+\xydef@\xyscalechars@#1,#2,#3@@{%
+ \DN@{\xyrescale@(#1,#2)}%
+ \dimen@=#1\p@
+ \ifdim\dimen@>\z@ \else \ifdim\dimen@<\z@ \else
+ \DN@{\xywarning@{invalid scaling factors #1, #2}}%
+ \fi\fi \dimen@=#2\p@
+ \ifdim\dimen@>\z@ \else \ifdim\dimen@<\z@ \else
+ \DN@{\xywarning@{invalid scaling factors #1, #2 }}%
+ \fi\fi \next@ }
+
+\xydef@\xyrescale@(#1,#2){%
+ \setboxz@h{\xyscale@@{#1}{#2}%
+ \dimen@=\ifx-#1\R@c\advance\dimen@-\R@c \dimen@=-\dimen@
+ \else#1\L@c \advance\dimen@-\L@c\fi
+ \kern\dimen@\boxz@\kern-\dimen@}%
+ \R@c=\if-#1\L@c\else#1\R@c\fi
+ \L@c=\if-#1\R@c\else#1\L@c\fi
+ \U@c=\if-#2\D@c\else#2\U@c\fi
+ \D@c=\if-#2\U@c\else#2\D@c\fi }
+
+\xydef@\xyignorescale@(#1,#2){\xywarning@{Ignoring rescale: #1,#2}%
+ \setboxz@h{\xyscale@@{#1}{#2}\boxz@}}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Some particular scalings.
+
+\DOCMODE(
+\xydef@\xyshape@halfsize@{\xyrescale@(.5,.5)}
+\xydef@\xyshape@dblsize@{\xyrescale@(2,2)}
+\xydef@\xyshape@flip@{\xyrescale@(-1,-1)}
+\xydef@\xyshape@vflip@{\xyrescale@(1,-1)}
+\xydef@\xyshape@hflip@{\xyrescale@(-1,1)}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Rotation and Rotated Text}
+
+Within |[@...]| the |...| are parsed as a <direction> locally, based on the
+current direction. The value of count register |\Direction| contains the
+information to determine the requested direction.
+When no <direction> is parsed then |[@]| requests a rotation to align with
+the current direction.
+
+The special sequence |[@!...]| is provided to pass an angle directly to
+the back-end. The \Xy-pic size and shape of the <object> with |\rectangleEdge|
+is unchanged, even though the printed form may appear rotated.
+This is a feature that must be implemented specially by the back-end.
+For example, using the \PS\ back-end, |[@!45]| will show the object rotated
+by 45$^\circ$ inside a box of the size of the unrotated object.
+
+\DOCMODE(
+\xydef@\xyrotatechar@{\bgroup
+ \afterDIRECTIONorEMPTY{\xyrotateSizeMod@}{\xyFN@\xySpecialRotate@i}}
+
+\xydef@\xySpecialRotate@i{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\xySpecialRotate@i}%
+ \else\ifx @\next \let\next@=\xyrotateSizeMod@
+ \else\addEQ@\ifx \next
+ \addEQ@\DN@##1@@{%\transformDrop@
+ \expandafter\xynametransform@\csname shape [##1]\endcsname\egroup}%
+ \else\ifx !\next \DN@!{\egroup\getSpecialRotate@}%
+ \else\ifx *\next \DN@*@@{\egroup\transformDrop@}%
+ \else \DN@{\xySpecialRotate@@}%
+ \fi\fi\fi\fi\fi \next@ }
+
+\xydef@\getSpecialRotate@{\doSpecialRotate@@}
+\DOCMODE)
+
+\TODO: Provide example of repeated, named transformation.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+Initially there is no support for the actual effects.
+They will be processed according to size/shape requirements,
+but the actual rotation or re-sizing is ommitted.
+A <driver> file is required to implement the effects.
+It need to define alternative expansions to which
+|\xyRotate@@#1|, |\xySpecialRotate@@#1@@|, |\doSpecialRotate@@#1@@|
+and |\xyscale@@#1#2| can be bound.
+
+\DOCMODE(
+\xydef@\xyRotate@#1{\xyundefinedRotate@{rotate}{#1}@@}
+\xydef@\xySpecialRotate@#1@@{\xyundefinedRotate@{rotate}{#1}@@\egroup}
+\xydef@\doSpecialRotate@#1@@{\xyundefinedRotate@{special rotate}{#1}@@}
+\xydef@\xyscale@#1#2{\xyundefinedRotate@{scale}{#1,#2}@@}
+
+\xydef@\UnloadRotate@#1{%
+ \ifx#1\relax\else\xyunload@{rotation extension}\fi
+ \let\xyRotate@@=\xyRotate@
+ \let\xySpecialRotate@@=\xySpecialRotate@
+ \let\doSpecialRotate@@=\doSpecialRotate@
+ \let\xyscale@@=\xyscale@ }
+
+\UnloadRotate@\relax
+
+\xyaddunsupport{rotate}{\UnloadRotate@\relax}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This adjusts the sizes of |\L@c|, |\R@c|, |\U@c| and |\D@c| appropriately.
+
+\DOCMODE(
+\xydef@\xyrotateSizeMod@ @@{%
+ \L@p=\L@c \R@p=\R@c \U@p=\U@c \D@p=\D@c
+ \ifdim\cosDirection\p@>\z@
+ \R@c=\cosDirection\R@p \L@c=\cosDirection\L@p
+ \U@c=\cosDirection\U@p \D@c=\cosDirection\D@p
+ \else
+ \R@c=\cosDirection\L@p \L@c=\cosDirection\R@p
+ \U@c=\cosDirection\D@p \D@c=\cosDirection\U@p
+ \fi
+ \advance\L@c \if-\sinDirection\D@p\else\sinDirection\U@p\fi
+ \advance\R@c \if-\sinDirection\U@p\else\sinDirection\D@p\fi
+ \advance\U@c \if-\sinDirection\L@p\else\sinDirection\R@p\fi
+ \advance\D@c \if-\sinDirection\R@p\else\sinDirection\L@p\fi
+ \dimen@ii=\L@c \advance\dimen@ii-\L@p
+ \edef\tmp@{\egroup \L@c=\the\L@c \R@c=\the\R@c \U@c=\the\U@c \D@c=\the\D@c
+ \dimen@ii=\the\dimen@ii \noexpand\setboxz@h\bgroup
+ \noexpand\xyRotate@@{\the\Direction}}\tmp@
+ \xydropRotated@ }
+
+\xydef@\xydropRotated@@{%
+ \kern\dimen@ii \boxz@ \kern-\dimen@ii \modXYtransform@ \egroup }
+\xylet@\xydropRotated@=\xydropRotated@@
+
+\xydef@\xyignoreSizeMod@ @@{\xywarning@{Ignoring rotation}}
+\DOCMODE)
+
+Some particular rotations.
+
+\DOCMODE(
+\xydef@\xyshape@left@{\xyrotatechar@ v(0,1)@@}
+\xydef@\xyshape@right@{\xyrotatechar@ v(0,-1)@@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Reflections}
+
+Reflections can be specified by a combination of rotation and a flip ---
+either |[hflip]| or |[vflip]|.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Shear transformations}
+
+\DOCMODE(
+\xydef@\xyshearchar@{\xyundefinedRotate@{shearing}}
+\DOCMODE)
+
+\TODO: Provide the structure to support these; then implement it in \PS.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+The following diagram requires various options to be loaded and installed.
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\xyrequire{rotate}\xyrequire{color}\xyrequire{crayon}\xyrequire{line}%
+\xyuncatcodes
+
+\paragraph*{Example}
+
+The diagram in figure~??[rotate and flips] illustrates many of the effects
+described above as well as some additional ones defined by the |color| and
+|rotate| extensions.
+
+\begin{figure*}[t]
+\begin{code}
+\UseCrayolaColors
+\xy\drop[*1.25]\xybox{\POS
+(0,0)*{A};(100,40)*{B}**{}
+ ?<<*[@_][red][o]=<5pt>{\heartsuit};
+ ?>>>*[@_][Plum][o]=<3pt>{\clubsuit}
+ **[|*][|.5pt][thicker]\dir{-},
+?(.1)*[left]!RD\txt{label 1}*[red]\frm{.}
+?(.2)*[!gsave newpath
+ xyXpos xyYpos moveto 50 dup rlineto
+ 20 setlinewidth 0 0 1 setrgbcolor stroke
+ grestore][psxy]{.},
+?(.2)*[@]\txt{label 2}*[red]\frm{.},
+?(.2)*[BurntOrange]{*},
+?(.3)*[halfsize]\txt{label 3}*[red]\frm{.}
+?(.375)*[flip]\txt{label 4}*[red]\frm{.}
+?(.5)*[dblsize]\txt{label 5}*[red]\frm{.}
+?(.5)*[WildStrawberry]{*},
+?(.7)*[hflip]\txt{label 6}*[red]\frm{.}
+?(.8)*[vflip]\txt{label 7}*[red]\frm{.}
+?(.9)*[right]!LD\txt{label 8}*[red]\frm{.}
+?(.5)*[@][*.66667]!/^30pt/
+ \txt{special effect: aligned text}
+ *[red]\frm{.}
+}\endxy
+\end{code}
+$$\docode$$
+\caption{Rotations, scalings and flips}
+??=[rotate and flips]
+\end{figure*}
+
+\begin{exercise}
+Suggest the code used by the author to typeset ??[rotate and flips].
+\answercode
+\answertext{This is how the author specified the diagram:}
+\answertext\displaycode
+\end{exercise}
+
+The actual code is given in the solution to the exercise.
+Use it as a test of the capabilities of your DVI-driver.
+The labels should fit snugly inside the accompanying rectangles,
+rotated and flipped appropriately.
+
+\BUG: This figure also uses colours, alters line-thickness and includes
+some \PS\ drawing.
+The colours may print as shades of gray,
+with the line from $A$ to $B$ being thicker than normal.
+The wider band sloping downwards may have different width and length
+according to the DVI-driver used; this depends on the coordinate system
+used by the driver, when `raw' \PS\ code is included.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyrotate.doc,v $
+% Revision 3.3 1996/12/18 09:40:16 ross
+% no changes
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% Revision 2.12 1994/10/25 03:01:14 ross
+% Final 3beta release [bug fixes & AMS-LaTeX fitting].
+%
+% Revision 2.11 1994/07/05 06:38:37 ross
+% some documentation was left out previously
+%
+% Revision 2.10 1994/06/15 12:46:03 ross
+% Second release 3beta.
+% Colour and line style saving works; label colouring bug fixed.
+%
+% Revision 2.9 1994/06/09 14:39:49 ross
+% Release 3beta.
+%
+% NEW file to go in version 2.9 by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xysmart.doc b/Master/texmf-dist/source/generic/xypic/xysmart.doc
new file mode 100644
index 00000000000..2c1cfb82077
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xysmart.doc
@@ -0,0 +1,569 @@
+%% $Id$
+%%
+%% Xy-pic ``Smart Path feature'' option.
+%% Copyright (c) 1998 George C. Necula <necula@cs.cmu.edu>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1998 Kristoffer H. Rose <krisrose@ens-lyon.fr>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{smartpath}{Smart Path option}{\stripRCS$Revision: 0.0 $}%
+ {George C. Necula}{necula@cs.cmu.edu}%
+ {School of Computer Science,
+ Carnegie Mellon University,
+ 5000 Forbes Avenue,
+ Pittsburgh, PA 15213-3891, USA}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This extends the `arrow' feature, which is therefore required, with a
+ ``smart'' <path> between two <pos>itions.
+
+\DOCMODE(
+\xyrequire{arrow}\xycatcodes
+\DOCMODE)
+
+ The <turn> syntax is extended with the construction
+%
+\begin{defs1}
+%
+ ??w![<turn>] \iss ??c![`s] <diag> |_| <diag> <turnradius>
+%
+\end{defs1}
+\noindent\unskip
+%
+ ??c![\ar]"in"|_|"out"|/5pt| which draws a connector leaving $p$ in the
+ "in" <diag>onal direction and arrives at $c$ in the "out" <diag>onal
+ direction, using |5pt| turns. The connector contains only horizontal
+ or vertical lines and $\frac18$ sectors of circles of the given
+ (optional) <turnradius>.
+
+ \BUG: Any labels are placed at the end of the connection.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+% The smart connection algorithm is as follows:
+%
+% A smart connector consists only of horizontal and vertical straight
+% segments connected with 1/4 circles. 1/8 circles might be use at the start
+% and end of the connector to reach a horizontal or a vertical.
+%
+% All possible connectors can be reduced to a series of equivalence classes,
+% where two connectors are considered equivalent if they are identical after
+% removing from each of them all the horizontal and vertical straight
+% segments. Such a connector is called a representative.
+%
+% The algorithm first computes 10 representatives that start and end in the
+% given directions and have at most one point where the orientation is
+% changed. 5 of the representatives start counter-clockwise and the other
+% 5 start clockwise. Among the counter-clockwise representatives, 1 does not
+% have any change in orientation (one arc of circle starting and ending in the
+% given directions). The other 4 are obtained by changing the orientation in
+% the four points where the circle is tangent to a horizontal or a vertical.
+%
+% For each representative the algorithm determines if it can be extended with
+% horizontal and vertical segments to reach the destination point when
+% starting in the source point (the directions are already right by
+% construction). For example, horizontal straight lines could be inserted
+% in all the points where the representative is tangent to a horizontal line.
+% In each such point a straight line segment can be inserted to extend the
+% connector horizontally but only in the same direction of the connector at
+% that point (the direction of the connetor in a point is towards the
+% destination). For example, if the horizontal distance between the source and
+% destination points is Dx and the horizontal distance between the start and
+% the end of the representative connector is dx then the distance ``Dx - dx''
+% must be covered using horizontal straight lines. This distance is
+% distributed equally among all the horizontal extension points of the right
+% direction. If no such points exist, then the representative is discarded.
+% The cost of a connector is the length of the representative plus the total
+% length of straight extension segments, i.e., |Dx-dx| + |Dy-dy|.
+%
+% The algorithm selects among all the representatives that are not discarded,
+% the one leading to the shortest connection.
+
+
+% Change the PATHturn@ to recognize `s as a smart PATH.
+\let\origPATHturn@=\PATHturn@
+\def\PATHturn@{%
+ \ifx \space@\next \expandafter\DN@\space{\xyFN@\PATHturn@}%gobble spaces
+ \else\ifx s\next
+ \let\origPATHturn@i=\PATHturn@i\let\PATHturn@i=\PATHsmartturn@i
+ \let\origPATHturn@cir=\PATHturn@cir\let\PATHturn@cir=\PATHsmartturn@cir
+ \DN@ s{\xyFN@\origPATHturn@}% Let the original routines do the parsing
+ \else
+ \DN@{\origPATHturn@}%
+ \fi\fi
+ \next@}
+
+
+% Changed PATHturn@cir to allow half or full turns
+\xydef@\PATHsmartturn@cir{%
+ \edef\next@{{\CIRin@@}{\expandafter\noexpand\CIRorient@@}{\CIRout@@}}%
+ \expandafter\PATHturn@i\next@}
+
+
+% This is the changed function for placing the turn
+\xydef@\PATHsmartturn@i#1#2#3{%
+ \DN@##1{%
+ \def\PATHinit@@{%
+ \xy@@{%
+ \def\sm@CIRin{#1}\def\sm@CIRout{#3}% The IN and OUT directions. Ignore
+ % the orientation
+ \ifx\sm@CIRout\empty %Only on direction is given. Use it as OUT and
+ %use the previous direction as IN
+ \let\sm@CIRout=\sm@CIRin
+ \let\sm@CIRin=\PATHlastout@@
+ \fi
+ ##1\relax}%
+ \xy@@{\enter@{\basefromthebase@}}%
+ \xy@@{\sm@conn}% Draw the connection
+ \xy@@{\X@p=\X@c \Y@p=\Y@c \czeroEdge@% Save the start of the segment
+ \count@=\sm@CIRout\count@=\the\count@% Move forward a dash to
+ % touch the edge
+ \dimen@=\xydashl@ \ABfromdiag@ \advance\X@c\A@ \advance\Y@c\B@
+ \edef\PATHpostpos@@{\X@c=\the\X@c \Y@c=\the\Y@c \noexpand\czeroEdge@
+ \noexpand\PATHomitslide@@true}}%
+ \xy@@{\leave@ %
+ \edef\PATHlastout@@{\sm@CIRout}% Store the last direction
+ \count@=\sm@CIRout \dimen@=\xydashl@ \Directionfromdiag@}}}%
+ \expandafter\next@\expandafter{\the\toks@}\toks@={}%
+ \let\PATHextra@@=\empty
+ \def\PATHpost@@{\xy@@\PATHpostpos@@}%
+ \let\PATHlabelsextra@@=\relax
+ \let\PATHturn@i=\origPATHturn@i
+ \let\PATHturn@cir=\origPATHturn@cir
+ \xyFN@\PATHturn@ii}
+
+
+\xydef@\sm@nil{}
+\xydef@\sm@nnil{\sm@nil}
+\xydef@\sm@maxcost{1000mm}% A very long connector
+
+% This computes and draws the connection
+\xydef@\sm@conn{
+% \xy@showthe p{Source}\xy@showthe c{Dest}%
+% \W@{Computing connector from p in \sm@CIRin\space to c in \sm@CIRout
+% .Radius is \turnradius@}%
+ %Adjust the end points to the edge of the objects in the given directions
+ \enter@{\cfromthec@ \DirectionfromtheDirection@}\cfromp@% Adjust p
+ \count@=\sm@CIRin\count@=\the\count@
+ \dimen@=\xydashl@ \ABfromdiag@ \advance\X@p\A@\advance\Y@p\B@
+ \setupDirection@ \the\Edge@c\z@ \czeroEdge@
+ \pfromc@
+ \reverseDirection@
+ % Now leave room for one dash to start with (for placing arrow tails)
+ \count@=\sm@CIRin\count@=\the\count@
+ \dimen@=\xydashl@ \ABfromdiag@
+ % Drop the arrow tail in the right place
+ \edef\tmp@{\noexpand\dir\artail@@}\expandafter\sm@drop@\tmp@
+ \X@c=\X@p\advance\X@c\A@ \Y@c=\Y@p\advance\Y@c\B@ \czeroEdge@
+ % Draw a straight connection from p to c
+ \sm@stri
+ % Set p to the end of the connection
+ \X@p=\X@c \Y@p=\Y@c
+ \leave@
+% \xy@showthe p{After adjust}%
+ \enter@{\pfromthep@ \DirectionfromtheDirection@}\pfromc@% Adjust c
+ \count@=\sm@CIRout\count@=\the\count@
+ \dimen@=\xydashl@ \ABfromdiag@ \advance\X@p-\A@\advance\Y@p-\B@
+ \setupDirection@ \the\Edge@c\z@
+ \advance\X@c-\A@\advance\Y@c-\B@% Leave room for a dash to terminate the seg
+ \czeroEdge@ % The final segment will be drawn by PATH@segment
+ % Clear the tail setting for the last segment
+ \def\PATHlabelsnext@@{}%
+ \leave@
+% \xy@showthe c{After adjust}%
+ % Set the turn radius
+ \R@=\turnradius@
+ \cirrestrict@@%Adjust the radius to fit the circles
+ % Initialize variables
+ \let\sm@circles=\sm@nil
+ \edef\sm@bestcost{\sm@maxcost}% Best so far is very bad
+ \sm@trycircles 1%Try counter clockwise first
+ \sm@trycircles{-1}%Try clockwise after
+%
+% Now check the best
+%
+ \ifdim\sm@bestcost<\sm@maxcost
+% \W@{}\W@{Best: \meaning\sm@bestconn}%
+ \cfromp@
+% \xy@showthe p{Source}%
+ \expandafter\sm@conndraw\sm@bestconn
+ \else
+ \xyerror@{Cannot draw the smart connector}{}%
+ \fi
+}
+
+% Compute and examine 5 representatives, for the orientation given
+% as #1 (1 for counter-clockwise and -1 for clockwise).
+\xydef@\sm@trycircles#1{%
+ \ifnum #1>0% Compute the opposite orientation
+ \def\sm@CIRorienti{-1}%
+ \else
+ \def\sm@CIRorienti{1}%
+ \fi
+ % Generate lists of triples (IN,ORIENT,OUT) so that OUT_1=IN_2 and
+ % IN=IN_1 and OUT=OUT_2, and such that ORIENT_1=#1m ORIENT_2=-ORIENT_1
+ % Then try each list in turn.
+ %Try one circle first (a singleton list)
+ \edef\tmp@{{{\sm@CIRin}{#1}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+ %Now try lists of two circles.
+ %Advance "in" so that it is a multiple of 90 degrees (that is, odd)
+ \count@@=\sm@CIRin\count@@=\the\count@@\count@=\count@@
+ \sm@roundcount@{#1}%
+ \edef\sm@savecount@{\the\count@}%
+ % See if we need to add a 1/8 starting circle
+ \ifnum\the\count@=\the\count@@ \else
+%
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+ \fi
+%
+ \count@=\sm@savecount@\count@=\the\count@
+ \sm@advancecount@ 2{#1}\edef\sm@savecount@{\the\count@}% Advance 90 deg.
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+%
+ \count@=\sm@savecount@\count@=\the\count@
+ \sm@advancecount@ 2{#1}\edef\sm@savecount@{\the\count@}% Advance 90 deg.
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+%
+ \count@=\sm@savecount@\count@=\the\count@
+ \sm@advancecount@ 2{#1}\edef\sm@savecount@{\the\count@}% Advance 90 deg.
+ \edef\tmp@{{{\sm@CIRin}{#1}{\the\count@}}%
+ {{\the\count@}{\sm@CIRorienti}{\sm@CIRout}}}%
+ \expandafter\sm@trycirclelist\expandafter{\tmp@\sm@nil}%
+}
+
+% Advance the direction in \count@ by #1 (each unit is 45deg) in the
+% dirction #2, taking care of wrap-around
+\xydef@\sm@advancecount@#1#2{%
+% \W@{Advancing count from \the\count@\space by #1\space
+% in \xy@showorient #2}%
+ \ifnum #2>0
+ \edef\tmp@{#1}%
+ \else
+ \edef\tmp@{-#1}%
+ \fi
+ \advance\count@\tmp@\count@=\the\count@
+ \ifnum\the\count@<0 \advance\count@ 8\fi
+ \ifnum\the\count@>7 \advance\count@ -8\fi
+ \count@=\the\count@
+% \W@{ Resulting count@=\the\count@}%
+}
+
+% Round counter to the next odd element (multiple of 90deg)
+% in the given direction
+\xydef@\sm@roundcount@#1{%
+ \ifcase\the\count@
+ \advance\count@ #1\or
+ \or \advance\count@ #1\or
+ \or \advance\count@ #1\or
+ \or \advance\count@ #1\fi
+ \count@=\the\count@
+ \ifnum\the\count@<0 \advance\count@ 8\fi
+ \ifnum\the\count@>7 \advance\count@ -7\fi
+ \count@=\the\count@
+}
+
+\newif\ifsm@firstseg
+\newif\ifsm@acceptable
+
+% Given a representative described as a list of triplets ending with sm@nil,
+% verify if is can be extended to the right destination
+\xydef@\sm@trycirclelist#1{%
+ \R@p=\z@\U@p=\R@p% Clear the deltas
+ \def\sm@exthp{0}\def\sm@exthm{0}%
+ \def\sm@extvp{0}\def\sm@extvm{0}% Clear the extension points
+ \def\sm@dxp{0pt}\def\sm@dxm{0pt}%
+ \def\sm@dyp{0pt}\def\sm@dym{0pt}% Reset the extensions
+ \def\sm@segs{}% % Clear the segment list
+ \sm@firstsegtrue % Mark the first segment
+ \def\sm@connlen{0pt}% % Initialize the connector length
+ \let\sm@tryclcont=\sm@trycirclelist@i
+ \sm@trycirclelist@i #1%Strip {} to expose the list elements
+%
+% The connector was processed
+%
+% Add an extra segment at then end, if ending in a multiple of 90 deg
+ \count@@=\sm@CIRout\count@@=\the\count@\count@=\the\count@
+ \sm@roundcount@{1}% Direction does not matter
+ \ifnum\count@=\count@@
+ \edef\sm@segs{\sm@segs{{\the\count@}{1}{\the\count@}}}%Accum segment
+ \fi
+% \W@{After trying CL deltax=\the\R@p, deltay=\the\U@p}%
+% \sm@showext{\space}%
+% \W@{ \space Segs: \meaning\sm@segs}%
+ %Now see if the connector can be extended enough
+ \A@=\X@p\advance\A@\R@p\advance\A@ -\X@c\A@=-\A@ % A=Dx
+ \B@=\Y@p\advance\B@\U@p\advance\B@ -\Y@c\B@=-\B@ % B=Dy
+ \sm@acceptabletrue
+% \W@{ \space Dx=\the\A@, Dy=\the\B@}%
+ \ifdim\A@>0pt
+ \ifnum\sm@exthp>0 \dimen@=\A@ \divide\dimen@\sm@exthp
+ \edef\sm@dxp{\the\dimen@}%
+ \else \sm@acceptablefalse\fi\fi
+ \ifdim\A@<0pt
+ \ifnum\sm@exthm>0 \dimen@=\A@ \divide\dimen@\sm@exthm
+ \edef\sm@dxm{\the\dimen@}%
+ \else \sm@acceptablefalse\fi
+ \A@=-\A@%Make it positive
+ \fi
+ \ifdim\B@>0pt
+ \ifnum\sm@extvp>0 \dimen@=\B@ \divide\dimen@\sm@extvp
+ \edef\sm@dyp{\the\dimen@}%
+ \else \sm@acceptablefalse\fi\fi
+ \ifdim\B@<0pt
+ \ifnum\sm@extvm>0 \dimen@=\B@ \divide\dimen@\sm@extvm
+ \edef\sm@dym{\the\dimen@}%
+ \else \sm@acceptablefalse\fi
+ \B@=-\B@
+ \fi
+ \ifsm@acceptable
+ %Compute the cost of the connector
+ \dimen@=\sm@connlen\advance\dimen@\A@\advance\dimen@\B@
+% \W@{ \space Cost is \the\dimen@}%
+ %See if it is best so far
+ \ifdim\dimen@<\sm@bestcost
+ \edef\sm@bestcost{\the\dimen@}%
+ \edef\sm@bestconn{{\sm@dxp}{\sm@dxm}{\sm@dyp}{\sm@dym}{\sm@segs}}%
+ \fi
+ \fi
+}
+
+\xydef@\sm@showext#1{%
+ \W@{#1\space hp=\sm@exthp,hm=\sm@exthm,vp=\sm@extvp
+ ,vm=\sm@extvm,len=\sm@connlen}}
+
+% Process the next element in the list that describes the representative
+%
+\xydef@\sm@trycirclelist@i#1{%
+ \def\@tmp{#1}%
+ \ifx \@tmp\sm@nnil \let\sm@tryclcont=\relax\else
+ \expandafter\sm@tryclcar\@tmp \fi
+ \sm@tryclcont}
+
+\xydef@\sm@tryclcar#1#2#3{%
+% \W@{Trying one turn in #1\space orient #2\space out #3}%
+ %Compute deltax in R@p and deltay in U@p. Move them to center first.
+ \dimen@=\ifnum #2<0 -\fi\R@
+ \count@=#1\count@=\the\count@ \ABfromdiag@
+ \advance\R@p -\B@ \advance\U@p \A@
+% \xy@showdim{ After center}%
+ % Move them to exit
+ \count@=#3\count@=\the\count@ \ABfromdiag@
+ \advance\R@p \B@ \advance\U@p -\A@
+% \xy@showdim{ After turn}%
+% \xy@showthe p{ }%
+ % Now update the extension points
+ \sm@computeext{#1}{#2}{#3}%
+}
+
+%
+% Compute the extensions
+%
+\xydef@\sm@computeext#1#2#3{%
+% \W@{Computing extents for turn in #1\space orient #2\space out #3}%
+ \ifsm@firstseg
+ \sm@accumext#1%
+ \sm@firstsegfalse
+ \fi
+ \count@@=#1\count@@=\the\count@@\count@=\count@@
+ \dimen@=\sm@connlen
+% \W@{Before rounding count@=\the\count@, count@@=\the\count@@}%
+ \sm@roundcount@{#2}%
+% \W@{After rounding count@=\the\count@, count@@=\the\count@@}%
+ \ifnum \count@=\count@@
+ \sm@advancecount@ 1{#2}% Advance by 90 degrees if odd. By 45 first
+ \advance\dimen@ 0.7854\R@% It was incremented with 1/8 circle
+ \ifnum \count@=#3% Check if done
+ \else
+ \sm@advancecount@ 1{#2}% Another 45
+ \advance\dimen@ 0.7854\R@% It was incremented with 1/8 circle
+ \fi
+ \else
+ \advance\dimen@ 0.7854\R@% It was incremented with 1/8 circle
+ \fi
+ \edef\sm@connlen{\the\dimen@}% Save the connector length
+ \sm@accumext{\the\count@}%
+ \edef\sm@segs{\sm@segs{{#1}{#2}{\the\count@}}}%Accum segment
+ \ifnum\the\count@=#3 \else
+ \edef\tmp@{{\the\count@}{#2}{#3}}%Recursive call
+ \expandafter\sm@computeext\tmp@
+ \fi
+}
+
+%
+% Accumulate the extensions
+%
+\xydef@\sm@accumext#1{%
+% \W@{Accumulating extent for #1}%
+% \sm@showext{Before accum:}%
+ \ifcase #1%
+ \or \count@@=\sm@extvm\advance\count@@ by1%
+ \edef\sm@extvm{\the\count@@}% 1 is V-
+ \or\or \count@@=\sm@exthp\advance\count@@ by1%
+ \edef\sm@exthp{\the\count@@}% 3 is H+
+ \or\or \count@@=\sm@extvp\advance\count@@ by1%
+ \edef\sm@extvp{\the\count@@}% 5 is V+
+ \or\or \count@@=\sm@exthm\advance\count@@ by1%
+ \edef\sm@exthm{\the\count@@}% 7 in H-
+ \fi
+% \sm@showext{After accum:}%
+}
+
+
+% Draw a computed connector.
+% 1,2,3,4 - dx+, dx-, dv+, dv- (lengths of straight connectors in each
+% direction)
+% 5 - a list of segments, each enclosed in a pair of braces.
+\xydef@\sm@conndraw#1#2#3#4#5{%
+ \def\sm@contlist{\sm@drawseglist}%
+ \edef\sm@dxp{#1}%
+ \edef\sm@dxm{#2}%
+ \edef\sm@dyp{#3}%
+ \edef\sm@dym{#4}%Save deltas
+ \sm@drawseglist #5\sm@nil}
+\xydef@\sm@drawseglist#1{% Get the first segment
+ \ifx #1\sm@nil \def\sm@contlist{}\else
+ \sm@drawseg #1\fi
+ \sm@contlist}
+
+%
+% Draw a segment
+%
+\xydef@\sm@drawseg#1#2#3{% A segment is CIRin+CIRorient+CIRout
+% \W@{Drawing segment in=#1\space out=\space #3}\xy@showthe c{Seg start}%
+ \def\CIRin@@{#1}\def\CIRout@@{#3}%
+ \sm@straight%See if a straight line is needed here. Insert it and
+ %reset c if needed
+ \ifnum\CIRin@@=\CIRout@@ \else
+ % Compute the center of the circle
+ \count@=\CIRin@@
+ \dimen@=\ifnum #2<0 -\fi\R@
+ \ABfromdiag@
+ \advance\X@c -\B@ \advance\Y@c \A@
+% \xy@showthe c{Center of circle}%
+% \xy@showdim{Before center}%
+ \ifnum #2>0 \def\CIRorient@@{\CIRacw@}%
+ \else \def\CIRorient@@{\CIRcw@}\fi
+ \drop@\literal@{\hbox\bgroup\cir@i}% Place the circle
+ % Now move the the end of the arc
+ \dimen@=\ifnum #2<0 -\fi\R@
+ \count@=\CIRout@@\count@=\count@%Wierd. If I remove this last assignm
+% %\count@ is not set
+ \ABfromdiag@
+% \xy@showthe c{Before advance}%
+% \xy@showdim{Before advance}%
+ \advance\X@c\B@ \advance\Y@c-\A@
+% \xy@showthe c{After circle}%
+% \xy@showdim{After circle}%
+ \fi
+}
+
+\xydef@\sm@straight{%
+ \U@c=\z@\D@c=\U@c\L@c=\U@c\R@c=\U@c
+ \pfromc@ %Set p at the beginning of the segment
+ \ifcase \CIRin@@ \or% 1 is V-
+ \A@=\sm@dym\advance \Y@c\A@ %Wierd. I have to use the temporary A@!!
+ \or\or % 3 is H+
+ \A@=\sm@dxp\advance \X@c\A@
+ \or\or % 5 is V+
+ \A@=\sm@dyp\advance \Y@c\A@
+ \or\or % 7 is H-
+ \A@=\sm@dxm\advance \X@c\A@ \fi
+ \ifdim\X@c=\X@p\ifdim\Y@c=\Y@p\else \sm@stri \fi\else \sm@stri \fi
+}
+
+\xydef@\sm@stri{%
+% \W@{Drawing straight connection}\xy@showthe p{StrSrc}\xy@showthec{StrDst}%
+ \edef\tmp@{\expandafter\noexpand\arstemprefix@@\arstem@@}%
+ \expandafter\sm@connect@\tmp@}
+\xydef@\sm@connect@#1#{%
+ \DN@##1{\connect@{#1}{##1}}\next@}
+
+\xydef@\sm@drop@#1#{%
+ \DN@##1{\drop@{#1}{##1}}\next@}
+
+% Compute and draw a connector. External interface
+% 1 - in (for p)
+% 2 - out (for c)
+% 3 - suggested radius
+\xydef@\smconn#1#2#3{%
+ \edef\sm@CIRin{#1}\edef\sm@CIRout{#2}%Memorize the directions
+ \R@=#3\R@=\the\R@
+ \sm@conn}
+
+\xyendinput
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Here is an example illustrating a smart <path> (as well as the
+% extensions of the `necula' extension of \S??[:necula]).
+%%
+%\xyuncatcodes\xyrequire{necula}\xycatcodes
+%\begin{code}
+%\def\triangle{[P:DL+/d1pc/,RC+/r1pc/,UL+/u1pc/]}%
+%\def\diamond{[P:DL,DR,RC+/r1pc/,UR,UL,LC+/l1pc/]}
+%\xy
+%\xytracing\POS
+% 0 *+<5mm>e|\triangle|[F-]\txt{Test}="one" ,
+% <2cm,1cm> *+<5mm>e|\diamond|[F.]\txt{Test}="two"
+% \ar @{>->} `sdr_d/30pt "one"
+%\endxy
+%\end{code}
+%\displaycode\noindent
+%%
+% will typeset
+%%
+%$$\docode$$
+
+ \BUG: This code should probably be merged with the `arrow' feature.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Finally the log.
+
+\DOCMODE(
+% $Log$
+% Received from George.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xytex.ini b/Master/texmf-dist/source/generic/xypic/xytex.ini
new file mode 100644
index 00000000000..48e45e20d2f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xytex.ini
@@ -0,0 +1,60 @@
+%% $Id: xytex.ini,v 3.3 1996/12/19 03:31:56 krisrose Exp $ -*-latex-*-
+%%
+%% Generate plain + Xy-pic format file.
+%% Copyright (c) 1993-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+
+% Load plain.tex
+%
+\input plain.tex
+
+% (Any other format parts should be loaded here before Xy-pic).
+
+% Load Xy-pic kernel:
+%
+\input xy
+
+% Extensions and features: You can replace this line with selective loading
+% of particular options if you like.
+%
+\xyoption{all}
+
+% Now dump the format file.
+%
+\dump
+\endinput
+
+% $Log: xytex.ini,v $
+% Revision 3.3 1996/12/19 03:31:56 krisrose
+% Maintenance release
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/06 02:56:02 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% NEW file to go in version 2.10!
diff --git a/Master/texmf-dist/source/generic/xypic/xytextures.doc b/Master/texmf-dist/source/generic/xypic/xytextures.doc
new file mode 100644
index 00000000000..3b6be2c6b40
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xytextures.doc
@@ -0,0 +1,291 @@
+%% $Id: xytextures.doc,v 3.3 1996/12/18 09:41:45 ross Exp $
+%%
+%% Xy-pic ``Textures'' driver interface option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{textures}{Textures driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This driver provides support for version 1.7+ of Blue Sky Research's
+\Textures\ application for Macintosh\footnote{Macintosh is a trademark of
+Apple Computer Inc.}. It incorporates support for colour and all of
+\Xy-pic's \PS\ effects. Earlier versions of \Textures\ should instead use
+the driver option |\xyoption{16textures}|.
+
+Notice that version 1.7 suffers from a printing bug which may cause a \PS\
+error. A fix is kludged by making sure the first page has been shown in the
+viewer before any pages with diagrams are sent to the printer.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\DOCMODE(
+\xydef@\Textures@@#1{\dvimessage@{Textures}{#1}}
+
+\newdriver{%
+ \xyaddsupport{color}\texturesColor@@
+ \xyaddsupport{crayon}\texturesCrayon@@
+ \xyaddsupport{ps}\texturesPS@@
+ \xyaddsupport{rotate}\texturesRotate@@
+ \xyaddsupport{line}\texturesLine@@
+ \xyaddsupport{frame}\texturesFrames@@
+ \xyaddsupport{tile}\texturesTiles@@
+ \xyaddsupport{cmtip}\relax
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item colour, both on-screen and with \PS\
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Textures uses the colour-stack method, but it requires a separate
+|\special| to set the new colour after having pushed the previous colour
+onto the stack.
+
+\DOCMODE(
+\xydef@\TexturesColor@push#1{\special{color push}\special{color #1}}
+
+\xydef@\TexturesColours@{\texturesPStypes@
+ \let\xylocalColor@=\xystackcolor@
+ \let\xycolor@push=\TexturesColor@push
+ \def\xycolor@{\xycolor@@}%
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}%
+ \installPScolor@ }\else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\texturesCrayon@@{}}%
+ \else\let\next@=\xystandardcolors@ \fi \next@
+ \let\xycolorwarning@=\relax \Textures@@{color}%
+ \let\texturesColor@@=\relax
+ \let\UnloadColor@@=\NoTexturesColor@
+ }
+
+\xydef@\texturesColor@@{\TexturesColours@}
+
+\xydef@\NoTexturesColor@{%
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolor@=\xyNoColor@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\texturesColor@@=\TexturesColours@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item crayon colours.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The 68 colours are those that |dvips| recognizes by name,
+thanks to Tomas Rokicki.
+
+\DOCMODE(
+\xydef@\texturesCrayon@@{\texturesColor@@\texturesCrayon@}
+\xydef@\texturesCrayon@{\installCrayolaColors@}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \PS\ back-end.
+
+\DOCMODE(
+\xydef@\texturesPS@@{\texturesPS@}
+\xydef@\texturesPSunload@{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\texturesPS@@=\texturesPS@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Versions 1.7 and later of \Textures\ have the following kinds of |\special|,
+the first two executing in the environment defined by the dictionary
+|userdict|. In particular these versions of \Textures\ now allow the
+\PS\ dictionary to be loaded into the main working dictionary.
+
+\begin{itemize}
+\item |\special{rawpostscript #1}| puts code directly into the \PS\ file.
+\item |\special{postscript #1}| wraps the code within |sps|...|eps|,
+which involves a basis change within a |save/restore| pair.
+\item |\special{prePostScript #1}| places the \PS\ code within the header
+dictionary, called |TeXdict|.
+\end{itemize}
+Each of these has a corresponding version for reading the \PS\ commands
+from a file.
+
+\DOCMODE(
+\xydef@\texturesPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\TexturesSpecial@\else
+ \let\PSspecial@@=\TexturesSpecial@
+ \let\PSmacro@@=\TexturesMacro@
+ \let\PSdict@@=\TexturesDict@
+ \let\PSraw@@=\TexturesRaw@
+ \let\PSinclude@@=\TexturesInclude@
+ \let\PSspecialdict@@=\TexturesSpecialDict@
+ \let\xyPSobeylines@@=\obeyTextureslines@
+ \Textures@@{PostScript}%
+ \fi \texturesCurrpt@ \XYpredict@ }
+
+\xydef@\TexturesSpecial@#1{\firstPS@@\special{postscript #1}}
+\xydef@\TexturesMacro@#1{\special{postscript {#1}xy}}
+\xydef@\TexturesDict@#1{\special{prePostScript #1}}
+\xydef@\TexturesSpecialDict@#1{\special{prePostScript #1}}
+\xydef@\TexturesInclude@#1{\firstPS@@\special{prePostScriptfile #1}}
+\xydef@\TexturesRaw@#1{\firstPS@@\special{rawpostscript #1}}%
+
+{\catcode`\^^M=\active%
+ \gdef\next{\catcode`\^^M=\active \let^^M=\par%
+ \let\PSspecial@@=\TexturesDict@ \obeyspaces}}
+\xylet@\obeyTextureslines@=\next
+\DOCMODE)
+
+The |currentpoint| is defined for the ``raw'' specials.
+For Textures this is the same as |\xyPScurrpt@@@|, in |xyps-ps.doc|.
+
+\DOCMODE(
+\xydef@\texturesCurrpt@{\let\xyPScurrpt@@=\texturesCurrpt@@}%
+\xydef@\texturesCurrpt@@{\PSspecial@@{xyi}\PSraw@@{userdict begin xyx end}}
+
+%\xydef@\texturesCurrpt@@{\PSspecial@@{%
+% 0 0 transform grestore gsave itransform }%
+% \PSraw@@{userdict begin /xyYpos exch def /xyXpos exch def end}}
+\DOCMODE)
+
+The \PS\ operator called |xyx| is defined in |xyps-ps| for storing the
+location placed on the stack by |xyi|.
+
+\medskip
+
+This installs the \PS\ backend.
+
+\DOCMODE(
+\xydef@\texturesPS@{\texturesPStypes@
+ \let\texturesPS@@=\relax
+ \let\UnloadPS@@=\texturesPSunload@
+ \let\installxyps@@=\relax \installxyps@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item rotated/scaled diagrams and text, using \PS.
+\DOCMODE(
+\xydef@\texturesRotate@@{\texturesRotate@}
+
+\xydef@\texturesRotate@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xyRotScale@@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}\UnloadRotate@\relax}\fi
+ \next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths and poly-lines, using \PS.
+\DOCMODE(
+\xydef@\texturesLine@@{\texturesLine@}
+
+\xydef@\texturesLine@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}%
+ \installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item extra frames and fills, using \PS.
+\DOCMODE(
+\xydef@\texturesFrames@@{\texturesFrames@}
+
+\xydef@\texturesFrames@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}%
+ \installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadPSFrames@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item patterns and tiles, using \PS.
+\DOCMODE(
+\xydef@\texturesTiles@@{\texturesTiles@}
+
+\xydef@\texturesTiles@{\texturesPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}%
+ \installPSpatterns@ \xystandardpatterns@}%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xytextures.doc,v $
+% Revision 3.3 1996/12/18 09:41:45 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xytile.doc b/Master/texmf-dist/source/generic/xypic/xytile.doc
new file mode 100644
index 00000000000..c1509987bbb
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xytile.doc
@@ -0,0 +1,472 @@
+%% $Id: xytile.doc,v 3.4 1997/05/18 01:13:24 ross Exp $
+%%
+%% Xy-pic ``Pattern and Tile extension'' option.
+%% Copyright (c) 1993-1997 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1997 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{tile}{Pattern and Tile extension}{\stripRCS$Revision: 3.4 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This extension provides the ability to request that a filled region be
+tiled using a particular pattern.
+
+This is an effect not normally available within \TeX.
+Instead it requires a suitable <driver> option to provide the necessary
+|\special| commands, together with any extra commands needed to implement
+the effects. Thus
+$$
+\xy
+ *+\txt<.8\hsize>{Using this extension will have no effect on the output
+ unless used with a dvi-driver that explicitly supports it.}
+ *\frm{-}
+\endxy
+$$
+All effects defined in the |tile| extension can be implemented using most
+\PS\ <driver>s, loaded as |\xyoption{|<driver>|}|.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+Like using color, tiling with patterns is an instance of a special style,
+since use of a pattern has no effect on the size or shape of the <object>
+being typeset. It only affects how the <object> will appear on the printed
+page or on-screen.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\LoadAllPatterns{xymacpat}
+\def\MacPatterns{\begin{figure*}[ht]
+$$
+%
+ \newcount\R \newcount\C
+ \def\n{\advance\R1 \C0 \POS(\R,\C)}
+ \def\F##1{\advance\C1 %
+ \POS(\R,\C)*+\txt\small{\phantom{filled}\\{\phantom{pattern}}}*[thicker]\frm{-},*[##1]\frm{**},
+ +D*+!U\txt\small{##1}}
+%
+\R-1 \C0 \xy
+ 0;<0cm,-1.5cm>:<1.5cm,0cm>:: \relax
+% \n,{\C1\POS(\R,\C)}
+ \n\F{mac01}\F{mac02}\F{mac03}\F{mac04}\F{mac05}\F{mac06}\F{mac07}\F{mac08}
+ \n\F{mac09}\F{mac10}\F{mac11}\F{mac12}\F{mac13}\F{mac14}\F{mac15}\F{mac16}
+ \n\F{mac17}\F{mac18}\F{mac19}\F{mac20}\F{mac21}\F{mac22}\F{mac23}\F{mac24}
+ \n\F{mac25}\F{mac26}\F{mac27}\F{mac28}\F{mac29}\F{mac30}\F{mac31}\F{mac32}
+ \n\F{mac33}\F{mac34}\F{mac35}\F{mac36}\F{mac37}\F{mac38}
+%
+\endxy
+$$
+\caption{The 38 standard Macintosh patterns.}
+??=[f.macpats]
+\end{figure*}\let\MacPatterns=\relax}
+\MacPatterns
+
+\paragraph*{Patterns}
+Patterns are specified as a <shape> modifier, similar to the way colours
+are specified by name.
+The pattern is applied to the whole of the current <object> whether this be
+text, an \Xy-pic line, curve or arrow-tip, or a composite object such as
+a matrix or the complete picture. However some DVI-drivers may not support
+use of patterns in all cases.
+
+If the current DVI-driver cannot support patterns then a request for one
+simply produces a warning message in the log file. After two such
+messages subsequent requests are ignored completely.
+%
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xypatternwarning@@{\xypatternmessage@
+ \gdef\xypatternwarning@{\xypatternmessage@
+ \xywarning@{...no further pattern warnings will be given.}%
+ \global\let\xypatternwarning@=\relax }}
+\xylet@\xypatternwarning@=\xypatternwarning@@
+
+\xydef@\xypatternmessage@{%
+ \xywarning@{Current driver does not support patterns.}}%
+\DOCMODE)
+
+This allows new patterns to be specified from raw data.
+Make sure the usual catcodes are in place before the data is tokenised.
+
+\DOCMODE(
+\xydef@\newxypattern{\begingroup\xycatcodes\newxypattern@i}
+\xydef@\newxypattern@i#1#2{\edef\next@{\endgroup
+ \noexpand\newxyPattern{#1}{}{#2}{}}\next@}
+\xydef@\newxyPattern#1#2#3#4{\newxypattern@{#1}{#2}{#3}{#4}{}}
+\DOCMODE)
+
+Existing pattern names can be overridden using |\newxypattern@#1#2\relax|.
+
+\DOCMODE(
+\xydef@\newxypattern@#1#2#3#4#5{%
+ \expandafter\let\expandafter\next@\csname shape [#1]\endcsname
+ \ifx\next@\relax
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{}{#3}\xypattern@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#2 #3}}}%
+ \fi
+ \else\DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#4}{}\xypattern@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#4}}}%
+ \fi\fi
+ \else \def\tmp@{\relax}\DNii@{#5}%
+ \ifx\nextii@\tmp@
+ \DN@{#4}\ifx\next@\empty
+ \DN@{#2}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{}{#3}\xypattern@{#3}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#2 #3}}}%
+ \fi
+ \else
+ \DN@{#2#3}\ifx\next@\empty
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#4}{}\xypattern@{#4}}}%
+ \else
+ \DN@{\newxystyle{#1}{\xylocalpattern@{#2}{#3}\xypattern@{#4}}}%
+ \fi\fi
+ \else\DN@{}\fi\fi \next@\relax }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\begin{defs}
+|[|<name>|]| & use named pattern \hfill \cr
+\noalign{\smallskip}
+\multispan2{??c![\newxypattern]|{|<name>|}{|<data>|}|}\cr
+&\omit specify new pattern using <data>\hfil\cr
+\noalign{\smallskip}
+\multispan2{|\UsePatternFile{|<file>|}|}\cr
+&\omit sets default file for patterns\hfil \cr
+\noalign{\smallskip}
+\multispan2{|\LoadAllPatterns{|<file>|}|}\cr
+&\omit load all patterns in <file>\hfil \cr
+\noalign{\smallskip}
+\multispan2{|\LoadPattern{|<name>|}{|<file>|}|}\cr
+&\omit load named pattern from <file> \hfil\cr
+\noalign{\smallskip}
+\multispan2{|\AliasPattern{|<alias>|}{|<name>|}{|<file>|}|}\cr
+&\omit let <alias> denote pattern from <file>.\hfil
+\end{defs}
+%
+Although pattern data may be specified directly using |\newxypattern|, it is
+more usual to load it from a <file> in which many patterns are defined by
+name, each on a separate line. By convention such files always end in |.xyp|
+(\Xy-pattern) so no extension should be specified. The pattern is then
+requested using either the name supplied in the file or by an alias. Once
+|\UsePatternFile| has been used, then a null <file> argument to the other
+commands will still find patterns in the default file. The default remains in
+effect for the current level of \TeX\ grouping.
+
+For example, the following picture
+\begin{code}
+\AliasPattern{bricks}{mac12}{xymacpat}
+\AliasPattern{bars}{mac08}{xymacpat}
+\xy *+<5pc,3.1pc>{},{*[bricks]\frm{**}}
+ ,*+<2.5pc>[o]{},*[bars]\frm{**}
+\endxy
+\end{code}
+$$\docode$$
+uses `filled' frames from the |frame| feature:
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+There are two methods, perhaps used simultaneously, for handling requests
+for a pattern. The |\xylocalpattern@| is the normal method, patterning
+whatever objects \TeX\ typesets from fonts or rules.
+The more specialized |\xypattern@| is used with a \PS\ <driver>.
+
+Thus a <driver> which supports both pattern and \PS\ must define a method to
+handle |\xylocalpattern@| but should leave alone |\xypattern@|. The latter
+method will be adjusted appropriately when a \PS\ <driver> is installed.
+
+\DOCMODE(
+\xydef@\xyNopattern@#1{}
+\xylet@\xypattern@@=\xyNopattern@
+\xydef@\xyNopattern@@#1#2{\xypatternwarning@}
+
+\xylet@\xypattern@=\xypattern@@
+\xylet@\xylocalpattern@=\xyNopattern@@
+\DOCMODE)
+
+This is to facilitate unloading patterns when the <driver> is changed
+to one that does not support this feature. This is the default state,
+until an appropriate <driver> is loaded.
+
+\DOCMODE(
+\xydef@\Unloadpattern@{%
+ \let\xylocalpattern@=\xyNopattern@@
+ \let\xypattern@=\xyNopattern@
+ \let\xypatternwarning@=\xypatternwarning@@ }
+
+\Unloadpattern@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Pattern data}
+A region is tiled using copies of a single `cell' regularly placed so as to
+seamlessly tile the entire region. The <data> appearing as an argument to
+|\newxypattern| is ultimately passed to the dvi-driver.
+
+The simplest form of pattern data is: <num> <Hex-data>, where the data
+is a 16-character string of Hexadecimal digits; i.e. 0--9, $A$--$F$.
+Each Hex-digit equates to 4 binary bits, so this data contains 64 bits
+representing pixels in an $8\times8$ array.
+The <num> is an integer counting the number of `0's among the 64 bits.
+Taken as a fraction of 64, this number or its complement, represents the
+average density of `on' pixels within a single cell of the pattern.
+Drivers unable to provide the fine detail of a pattern may simply use this
+number, or its complement, as a gray-level or part of a colour specification
+for the whole region to be tiled.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+A desirable set of standard patterns could be specified to be always loaded.
+If such a set emerges indeed as being frequently desirable then it will be
+included here.
+
+\DOCMODE(
+\xydef@\xystandardpatterns@{}%
+\DOCMODE)
+
+\NOTE: The driver file must call |\xystandardpatterns@| before these
+patterns become accessible. This is to allow any <driver>-specific
+definitions to be active when these patterns are defined.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xynew@{read}{\xypatread@}
+\xydef@\defaultpattfile@{}
+
+\xydef@\xygetfilepatterns@#1{\DN@{#1}%
+ \ifx\next@\empty
+ \ifx\defaultpattfile@\empty \xywarning@{No pattern file specified.}%
+ \else \DN@{\expandafter\openpattfile@\expandafter{\defaultpattfile@}}\fi
+ \else \DN@{\openpattfile@{#1}}\fi \next@ }
+
+\xydef@\openpattfile@#1{\openin\xypatread@=#1.xyp %
+ \ifeof\xypatread@\xywarning@{No patterns in file: #1.xyp}%
+ \closein\xypatread@
+ \else \expandafter \xyreadpatfile@ \fi }%
+
+\xydef@\UsePatternFile#1{\def\defaultpattfile@{#1}}
+
+\xydef@\LoadAllPatterns{\let\parsepattern@=\parsepattern@@
+ \xygetfilepatterns@ }
+
+\xydef@\LoadPattern#1{\let\parsepattern@=\filepattern@@
+ \def\pattname@{#1}\xygetfilepatterns@}
+
+\xydef@\AliasPattern#1#2{\let\parsepattern@=\aliaspattern@@
+ \def\aliasname@{#1}\def\pattname@{#2}\xygetfilepatterns@}
+\DOCMODE)
+
+The character |!| is used to delimit comments within pattern-data
+files.
+
+\DOCMODE(
+\xydef@\xyreadpatfile@{%
+ \loop@ \bgroup\xycatcodes
+ \global\read\xypatread@ to\xypatline@
+ \ifeof\xypatread@ \aftergroup\endpatread@
+ \else\aftergroup\morepatread@\fi \edef\next@{%
+ \egroup\noexpand\getxypattern@{\xypatline@!!!}\relax}\next@
+ \repeat@ }
+\xydef@\endpatread@{\closein\xypatread@\iffalse}
+\xydef@\morepatread@{\iftrue}
+
+%\xydef@\getxypattern@{\futurelet\next\getxypattern@@}
+\xydef@\getxypattern@#1{\def\next{#1}\getxypattern@@}
+\xydef@\getxypattern@@{\DN@{!!!}\ifx\next\next@\DN@{}%
+ \else\DN@{\expandafter\parsepattern@\next}\fi \next@ }
+
+\xydef@\parsepattern@@#1 #2!#3\relax{\newxypattern{#1}{#2}}
+\xydef@\filepattern@@#1 #2!#3\relax{\DN@{#1}%
+ \ifx\next@\pattname@
+ \DN@{\expandafter\foundpattern@\expandafter{\pattname@}{#2}}%
+ \else\DN@{}\fi \next@ }
+\xydef@\foundpattern@#1#2{\newxypattern{#1}{#2}\endpatread@\fi
+ \expandafter\eat@}
+\xydef@\aliaspattern@@#1 #2!#3\relax{\DN@{#1}%
+ \ifx\next@\pattname@
+ \DN@{\expandafter\foundpattern@\expandafter{\aliasname@}{#2}}%
+ \else\DN@{}\fi \next@ }
+
+%\xydef@\parsepattern@#1 #2!#3\relax{\message{#1:#2}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\medskip
+\noindent
+The file |xymacpat.xyp| contains defining data for the 38 standard
+patterns available with the Macintosh Operating system.
+Figure~??[f.macpats] displays all these patterns.
+
+% Comment this line an uncomment one below, to move the patterns to a
+% later page.
+
+%\MacPatterns
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\clearpage
+\paragraph*{Rotating and Resizing Patterns}
+%
+Some implementations of patterns are sufficiently versatile to allow extra
+parameters to affect the way the pattern data is interpreted. \PS\ is one
+such implementation in which it is possible to rotate the whole pattern and
+even to expand or contract the sizes of the basic cell.
+
+Due to the raster nature of output devices, not all such requests can be
+guaranteed to produce aesthetic results on all devices. In practice only
+rotations through specific angles (e.g 30$^\circ$, 45$^\circ$, 60$^\circ$)
+and particular scaling ratios can be reliably used.
+Thus there is no sophisticated interface provided by \Xy-pic to access these
+features. However the `\PS\ escape' mechanism does allow a form of access,
+when a \PS\ <driver> is handling pattern requests.
+
+Special \PS\ operators |pa| and |pf| set the pattern angle (normally 0)
+and `frequency' measured in {\em cells per inch}. Hence, when used as an
+<object>-modifier, |[! 30 pa 18.75 pq]| rotates the pattern by 30$^\circ$
+clockwise and uses a smaller pattern cell (larger frequency).
+The default frequency of $12.5=300/(8\times3)$ means that
+each pixel in a pattern cell corresponds, on a device of resolution
+300{\small dpi}, to a $3\times3$ square of device pixels;
+on such a device $18.75$ uses $2\times2$ squares.
+
+At 300{\small dpi} a frequency of $9.375=300/(8\times4)$ uses $4\times4$
+squares. These match the natural size for pixels on a 75{\small dpi} screen
+and are pretty close for 72{\small dpi} screens.
+Though appropriate for screen displays, these are `too chunky' for high
+quality printed work. Doubling the frequency is too fine for some patterns,
+hence the intermediate choice of $12.5$ as default.
+In order for printed output to match the screen view, a \PS\ operator |macfreq|
+has been defined to facilitate requests for $9.375$, via |[!macfreq]|.
+
+The next diagram displays changes to the frequency.
+%
+$$
+ \newcount\R \newcount\C
+ \def\n{\advance\R1 \C0 \POS(\R,\C)}
+ \def\F#1#2{\advance\C1 %
+ \POS(\R,\C)*+\txt\small{filled\\pattern}*[thicker]\frm{-}
+ ,*[! #2 pq][#1]\frm{**},
+ +D*+!U\txt\small{#2}}
+%
+\R-1 \C0 \xy
+ 0;<0cm,-1.5cm>:<2.0cm,0cm>:: \relax
+% \n,{\C1\POS(\R,\C)}
+ \n\F{mac38}{9.375}\F{mac38}{12.5}\F{mac38}{18.75}\F{mac38}{37.5}
+ \n\F{mac16}{9.375}\F{mac16}{12.5}\F{mac16}{18.75}\F{mac16}{37.5}
+%
+\endxy
+$$
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\paragraph*{Saving patterns: \ }
+%
+When styles are saved using ??c[[=]<word>|]|, see note~??g[xy.doc:define
+<shape>] of \S??g[xy.doc:object], then the current pattern (if any) is also
+saved. Subsequent use of |[|<word>|]| recovers the pattern as well as colour
+and line-style settings. This includes any explicit variations applied using
+the ``Style Escape'' mechanism.
+
+Here is a variation of an earlier example, with extra effects.
+\begin{code}
+\UsePatternFile{xymacpat}
+\AliasPattern{bricks}{mac12}{}
+\LoadPattern{mac28}{}\LoadPattern{mac05}{}
+\xy *=0[! macfreq -45 pa][mac28][|=Bars]{}
+,*+<12pc,4pc>{}*[bricks]\frm{**}
+,-<3.5pc,0pt>,*+<2.65pc>[o]{},*[Bars]\frm{**}
+,*[thicker]\frm{o},+<6pc,0pt>
+,*+<5pc, 2.7pc>{},*[mac05]\frm{**},*\frm{-,}
+,*[white]\txt\Large\bf\sf{Kilroy\\was here}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Add this extension to the driver-tables as ``unload'',
+unless an already-loaded driver can support it:
+
+\DOCMODE(
+\DN@{\xyaddunsupport{tile}\Unloadpattern@}%
+\ifx\xyeverywithoption@tile@\undefined
+\else\ifx\xyeverywithoption@tile@\empty
+\else
+ \DN@{\xysetup@@{\xywithoption{tile}{\xyeverywithoption@tile@\xydriversloaded@@}}}%
+\fi\fi \next@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Uncomment this to move the patterns to a later page.
+
+%\MacPatterns
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xytile.doc,v $
+% Revision 3.4 1997/05/18 01:13:24 ross
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/18 09:43:06 ross
+% documentation change
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% NEW for version 3.0 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xytips.doc b/Master/texmf-dist/source/generic/xypic/xytips.doc
new file mode 100644
index 00000000000..93136a7e92f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xytips.doc
@@ -0,0 +1,239 @@
+%% $Id: xytips.doc,v 3.3 1996/12/19 04:12:13 krisrose Exp $
+%%
+%% Xy-pic ``More Tips'' extension.
+%% Copyright (c) 1992-1996 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{tips}{More Tips extension}{\stripRCS$Revision: 3.3 $}%
+ {Kristoffer H.~Rose}{kris@diku.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This extension provides several additional styles of `tips' for use
+ (primarily) as arrow heads, and makes it possible to define
+ customised tips. This is used to support tips that mimic the style
+ of the Computer Modern fonts\footnote{This function was earlier
+ supported by the |cmtip| extension which is still included in the
+ distribution but is now obsolete.} by Knuth~(see
+ \cite{K86:ComputerMT} and \cite[appendix~F]{K84:TeXbook}) and of the
+ Euler math fonts distributed by the \AMS.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+ First save the \Xy-commands that may need restoring.
+
+\DOCMODE(
+\xylet@\tip@xy=\tip@
+\xylet@\atip@xy=\atip@
+\xylet@\btip@xy=\btip@
+
+\xylet@\Tip@xy=\Tip@
+\xylet@\Ttip@xy=\Ttip@
+
+\xylet@\tipjot@xy=\tipjot@
+\DOCMODE)
+
+ Next declare the fonts (initially the original |cm| style).
+
+\DOCMODE(
+\xyfont@\xy@@atfont=xycmat10
+\xyfont@\xy@@btfont=xycmbt10
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Font selection is done with the command
+%
+\begin{defs1}
+??c![\SelectTips] |{|<family>|}| |{|<size>|}|
+\end{defs1}
+%
+\DOCMODE(
+\xydef@\tipfamily@@{cm}
+\xydef@\tipsize@@{10}
+
+\xydef@\SelectTips#1#2{%
+ \DN@{#1}\ifx\next@\empty\else \def\tipfamily@@{#1}\fi
+ \DN@{#2}\ifx\next@\empty\else \def\tipsize@@{#2}\fi
+ \csname tipfamily \tipfamily@@\endcsname \ignorespaces}
+\DOCMODE)
+\noindent\unskip
+%
+ where the <family> and <size> should be selected from the following
+ table.
+%
+\begin{center}
+\def\TIPS#1#2{\hbox{\SelectTips{#1}{#2}\UseTips
+ $\xy;/r1pc/**{}?>*@{>}**{-}\endxy~
+ \xy;/r1pc/**{}?>*@2{>}**@2{-}\endxy~
+ \xy;/r1pc/**{}?>*@3{>}**@3{-}\endxy$}}%
+\leavevmode
+\begin{tabular}{\otherbar c\otherbar c\otherbar c\otherbar c\otherbar}
+\hline
+ Family & ??c![10] & ??c![11] & ??c![12] \\
+\hline
+ {}??c![xy] &{}\TIPS{xy}{10} &{}\TIPS{xy}{11} &{}\TIPS{xy}{12} \\
+ {}??c![cm] &{}\TIPS{cm}{10} &{}\TIPS{cm}{11} &{}\TIPS{cm}{12} \\
+ {}??c![eu] &{}\TIPS{eu}{10} &{}\TIPS{eu}{11} &{}\TIPS{eu}{12} \\
+\hline
+\end{tabular}
+\end{center}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The table is really encoded in control sequences
+ |\tipfamily|~<family> that look very much alike since all the
+ currently existing combinations are merely alternative fonts. This
+ is likely to change, however, \dots\smiley
+
+ First |cm|, \ie, computer modern: these are simplified by the fact
+ that we can use the normal double arrows.
+
+\DOCMODE(
+\xydefcsname@{tipfamily cm}{\loadtipfonts@
+ \let\tip@=\tip@cm \let\atip@=\atip@cm \let\btip@=\btip@cm
+ \let\Tip@=\Tip@xy \let\Ttip@=\Ttip@xy \def\tipjot@{.2em}}
+
+\xydef@\loadtipfonts@{\edef\next##1##2{##1=xy\tipfamily@@##2\tipsize@@}%
+ \next{\font\xy@@atfont}{at}
+ \next{\font\xy@@btfont}{bt}
+}
+
+\xydef@\tip@cm{\activatetips@ \tip@x\tip@@}
+\xydef@\atip@cm{\activatetips@ \tip@x\atip@@}
+\xydef@\btip@cm{\activatetips@ \tip@x\btip@@}
+
+\xydef@\activatetips@{\let\xyatipfont=\xy@@atfont \let\xybtipfont=\xy@@btfont}
+\DOCMODE)
+
+ Next Euler tips: the single tips merely reuse the |cm| code except
+ for the sligtly smaller distance between double tips; the double
+ arrows have to be recoded to mimic the steeper Euler appearance.
+
+\DOCMODE(
+\xydefcsname@{tipfamily eu}{\loadtipfonts@
+ \let\tip@=\tip@cm \let\atip@=\atip@cm \let\btip@=\btip@cm
+ \let\Tip@=\Tip@eu \let\Ttip@=\Ttip@eu \def\tipjot@{.15em}}
+
+\xydef@\Tip@eu{\kern1.5pt \vrule height1.5pt depth1.5pt width\z@
+ \Tip@@eu \kern1.5pt \egroup
+ \U@c=1.5pt \D@c=1.5pt \L@c=1.5pt \R@c=1.5pt \Edge@c={\circleEdge}%
+ \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+
+\xydef@\Tip@@eu{\count@=\DirectionChar
+ \advance\count@-10 \ifnum\count@<\z@ \advance\count@128 \fi
+ \xyatipfont\char\count@
+ \advance\count@ 20 \ifnum127<\count@ \advance\count@-128 \fi
+ \xybtipfont\char\count@}
+
+\xydef@\Ttip@eu{\kern2.4pt \vrule height2.4pt depth2.4pt width\z@
+ \Ttip@@eu \kern2.4pt \egroup
+ \U@c=2.4pt \D@c=2.4pt \L@c=2.4pt \R@c=2.4pt \Edge@c={\circleEdge}%
+ \Invisible@false \Hidden@false
+ \def\Leftness@{.5}\def\Upness@{.5}%
+ \def\Drop@@{\styledboxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
+
+\xydef@\Ttip@@eu{%
+ \setboxz@h\bgroup\reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
+ \kern-\L@c \boxz@ \kern\L@c \Tip@@eu}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Once a selection is made, the following commands are available:
+%
+\begin{defs}
+??c![\UseTips] & activate selected tips\cr
+??c![\NoTips] & deactivate\cr
+\end{defs}
+%
+\DOCMODE(
+\xydef@\UseTips{\csname tipfamily \tipfamily@@\endcsname}
+
+\xydef@\NoTips{\let\tip@=\tip@xy \let\atip@=\atip@xy \let\btip@=\btip@xy
+ \let\Tip@=\Tip@xy \let\Ttip@=\Ttip@xy \let\tipjot@=\tipjot@xy}
+\DOCMODE)
+\noindent\unskip
+%
+ They are local and thus can be switched on and/or off for individual
+ pictures using the \TeX\ grouping mechanism, \eg,
+%
+\begin{code}
+\SelectTips{cm}{10}
+\xy*{} \ar
+ @{*{\UseTips\dir_{<<}}-*{\NoTips\dir{>}}}
+ (20,5)*{} \endxy
+\end{code}
+\displaycode
+\noindent
+%
+ will typeset
+$$
+\docode
+$$
+ regardless of which tips are used otherwise in the document.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{End \& log}
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xytips.doc,v $
+% Revision 3.3 1996/12/19 04:12:13 krisrose
+% New for this maintenance release.
+%
+% Generalisation of xycmtip.doc,v 3.1 1995/09/05 20:31:32 kris Exp krisrose
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.6 1993/10/21 20:36:09 kris
+% NEW file to go in version 2.7!
+%
+% Extracted from xypic.doc 2.6.1.1.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs how we are formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xytp-f.doc b/Master/texmf-dist/source/generic/xypic/xytp-f.doc
new file mode 100644
index 00000000000..ed15b6fff6b
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xytp-f.doc
@@ -0,0 +1,306 @@
+%% $Id: xytp-f.doc,v 3.3 1996/12/18 09:49:07 ross Exp $
+%%
+%% Xy-pic ``Frame extension'' TPIC backend support.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xytpfloaded\empty \message{not reloaded}\endinput \fi
+\let\xytpfloaded=\empty \xycatcodes
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{frames.}
+
+The included file |xytp-f.tex|
+(version \stripRCS$Revision: 3.3 $) provides \TPIC\ support
+for some of the effects defined in the |frame| extension.
+This file is loaded and its effects are activated automatically whenever
+|\xyoption{frame}| is requested and the current <driver> supports both
+\TPIC\ and frames. Should there be any need to turn off this support,
+the following commands are available; they obey usual \TeX\ groupings.
+%
+\begin{defs}
+|\NoTPICframes| & remove \TPIC\ support\kern-50pt \cr
+|\UseTPICframes| & reinstate \TPIC.
+\end{defs}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Installation}
+
+The <driver>-file must call the following macro to rebind control sequences
+defined in |xyframe|, thereby allowing the \TPIC\ methods to be used.
+
+\DOCMODE(
+\xydef@\installTPICframes@{%
+ \let\framed@body@@=\xyTPICframed@body@
+ \let\circled@x@@=\xyTPICcircled@x@
+ \let\ellipsed@x@@=\xyTPICellipsed@x@
+ \installTPICfills@
+ \xyuncatcodes}
+
+\xydef@\UseTPICframes{\installTPICframes@}
+\xydef@\NoTPICframes{\UnloadFrames@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Frames: solid, dotted and dashed}
+
+\DOCMODE(
+\xydef@\xyTPICframed@body@{\DN@{\framed@body@}%
+ \ifdim\R@=\z@
+ \ifx\framehfill\frm@solidh@@
+ \DN@{\xyTPICframed@rect@i\xytpic@solid@@}%
+ \else\ifx\framehfill\frm@dashh@@
+ \DN@{\xyTPICframed@rect@i\xytpic@dashed@@}%
+ \else\ifx\framehfill\frm@doth@@
+ \DN@{\xyTPICframed@rect@i\xytpic@dotted@@}%
+ \fi\fi\fi\fi \next@ }
+
+\xydef@\xyTPICframed@rect@i#1{\vglue\U@c
+ \hbox{\hglue\L@c\xyTPICrect@{#1}\hglue\R@c}\vglue\D@c}
+
+%\xydef@\xyTPICframed@oval@#1{\vglue\U@c
+% \hbox{\hglue\L@c\xyTPICoval@{}\hglue\R@c}\vglue\D@c}
+\DOCMODE)
+
+Dotted and dashed circles have no particular support, whereas
+solid circles and ellipses can use |\xyTPICfullcircle@|.
+
+\DOCMODE(
+\xydef@\xyTPICcircled@x@{\DN@{\xyTPICcircled@xx{}}%
+ \ifx\framehfill\frm@doth@@ \DN@{\xyTPICdotcirc@}%
+ \else\ifx\framehfill\frm@dashh@@\DN@{\xyTPICdashcirc@}%
+ \fi\fi \next@ }
+
+\xydef@\xyTPICcircled@xx#1{\vglue2\R@
+ \hbox{\hglue2\R@\xyTPICfullcircle@#1\hglue2\R@}\vglue2\R@}
+
+\xydef@\xyTPICdotcirc@{\let\zerodot=\framezerodot@@
+ \L@=\R@ \circled@x@@ }
+\xydef@\xyTPICdashcirc@{\L@=\R@ \circled@x@@ }
+
+\xydef@\xyTPICdotellip@{\ellipsed@x@@ }
+\xydef@\xyTPICdashellip@{\ellipsed@x@@ }
+\DOCMODE)
+
+In practice the parameters |#1| and |#2| will hold <dimen>s.
+
+\DOCMODE(
+\xydef@\xyTPICellipsed@x@#1#2{\DN@{\xyTPICellipsed@xx{}}%
+ \ifx\framehfill\frm@doth@@\DN@{\xyTPICdotellip@}%
+ \else\ifx\framehfill\frm@dashh@@\DN@{\xyTPICdashellip@}%
+ \fi\fi \next@{#1}{#2}}
+
+\xydef@\xyTPICellipsed@xx#1#2#3{\vglue #3\vglue #3\relax
+ \hbox{\L@c = #2\relax \R@c=\L@c \D@c = #3\relax \U@c=\D@c
+ \hglue#2\hglue#2\relax \R@=#2\relax \L@=#3\relax
+ \xyTPICfullcircle@#1\hglue#2\hglue#2\relax}%
+ \vglue #3\vglue #3\relax}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xyTPICrect@#1{\DNii@{\relax}\DN@{#1}\toks@={}%
+ \ifx\next@\nextii@ \xytpic@pn0\relax\xytpic@bk
+ \def\xytpic@style@@{\xytpic@fp}%
+ \else\DNii@{\empty}%
+ \ifx\next@\nextii@\def\xytpic@style@@{\xytpic@ip}\xytpic@bk
+ \else\ifx\next@\empty\def\xytpic@style@@{\xytpic@ip}\xytpic@bk
+ \else#1\fi\fi\fi
+ \xytpic@pt\R@c
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt\D@c
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt{\L@c}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt{\U@c}%
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \expandafter\xyTPICrect@x\the\toks@
+ \DNii@{\relax}\DN@{#1}\ifx\next@\nextii@
+ \def\xytpic@style@@{\xytpic@fp}\expandafter\xyTPICrect@x\the\toks@\fi }
+
+\xydef@\xyTPICrect@x#1#2#3#4{\xyTPIC@special{pa -#3 -#4}%
+ \xyTPIC@special{pa -#3 #2}\xyTPIC@special{pa #1 #2}%
+ \xyTPIC@special{pa #1 -#4}\xyTPIC@special{pa -#3 -#4}%
+ \xytpic@style@@ }
+
+\xydef@\xyTPICoval@#1{\DN@{#1}\DNii@{\relax}%
+ \ifx\next@\nextii@ \DN@{\xyTPICfilledoval@\relax}%
+ \else\DNii@{\empty}\ifx\next@\nextii@ \DN@{\xyTPICfilledoval@\empty}%
+ \else\DN@{\xyTPICoval@i{#1}}\fi\fi \next@ }
+
+%\xydef@\xyTPICoval@i#1{\bgroup
+% \let\framehfill=\frm@solidh@@
+% \let\framevfill=\frm@solidv@@
+% \let\framed@body@@=\framed@body@
+% \edef\tmp@{{\R@}}\expandafter\framed@@\tmp@
+% \egroup }
+\xylet@\xyTPICoval@i=\eat@
+
+\xydef@\xyTPICfilledoval@#1{%
+ {\advance\L@c-\R@ \advance\R@c-\R@ \xyTPICrect@{\empty}}%
+ {\advance\U@c-\R@ \advance\D@c-\R@ \xyTPICrect@{\empty}}%
+ \L@=\R@ \bgroup
+ \dimen@=-\U@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=-\L@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \bgroup
+ \dimen@=-\U@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=\R@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \bgroup
+ \dimen@=\D@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=-\L@c \advance\dimen@\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \bgroup
+ \dimen@=\D@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\the\count@}%
+ \dimen@=\R@c \advance\dimen@-\R@ \xytpic@pt\dimen@
+ \edef\tmp@{\noexpand\toks@={{\the\count@}{\tmp@}}}%
+ \setTPICcircstyle@ \xyTPICcircle@{\tmp@}\egroup
+ \DN@{#1}\DNii@{\relax}\ifx\next@\nextii@
+ \def\tmp@{{\xytpic@pn0\def\xytpic@style@@{\xytpic@fp}}}%
+ \DN@{\expandafter\xyTPICoval@i\tmp@}%
+ \else\DN@{}\fi \next@ }
+
+%\xylet@\xyTPICoval@=\xyTPICrect@
+
+\xydef@\setTPICcircstyle@{%
+ \def\xytpic@circstyle@@{\xytpic@ia}\xytpic@bk}
+
+\xydef@\xyTPICcircle@#1{\DNii@{\relax}%
+ \DN@{#1}\toks@={00}\ifx\next@\nextii@
+ \xytpic@pn0\relax\xytpic@bk \def\xytpic@circstyle@@{\xytpic@ar}%
+ \else\DNii@{\empty}%
+ \ifx\next@\nextii@ \setTPICcircstyle@
+ \else\ifx\next@\empty \setTPICcircstyle@
+ \else#1\fi\fi\fi
+%
+ \xytpic@pt\R@
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \xytpic@pt\L@
+ \expandafter\addtotoks@\expandafter{\expandafter{\the\count@}}%
+ \expandafter\xytpic@circstyle@@\the\toks@ 0\twoPi@}
+
+\xydef@\xyTPICellipse@{%
+ \X@p=\R@c \advance\X@p-\L@c \divide\X@p\tw@ \R@=\R@c \advance\R@-\X@p
+ \Y@p=\D@c \advance\Y@p-\U@c \divide\Y@p\tw@ \L@=\D@c \advance\L@-\Y@p
+ \xyTPICcircle@}
+
+\xydef@\xyTPICrect@Special#1#2#3#4{\TPICmacro@@{#1 fp}}
+\xydef@\xyTPICdotrect@Special#1{\TPICmacro@@{#1 fp}}
+\xydef@\xyTPICdashrect@Special#1{\TPICmacro@@{#1 fp}}
+\xydef@\xyTPICcirc@Special#1{\TPICmacro@@{#1 ar}}
+\xydef@\xyTPICdotcirc@Special#1{\TPICmacro@@{#1 ar}}
+\xydef@\xyTPICdashcirc@Special#1{\TPICmacro@@{#1 ar}}
+%\xydef@\xyTPICoval@Special#1{\TPICmacro@@{#1 fp}}
+%\xydef@\xyTPICdotoval@Special#1{\TPICmacro@@{#1 fp}}
+%\xydef@\xyTPICdashoval@Special#1{\TPICmacro@@{#1 fp}}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{Filled regions}
+
+\DOCMODE(
+\xydef@\xyTPICfilledRegion#1#2{\vglue\U@c
+ \hbox{\hglue\L@c#1#2\empty\hglue\R@c}\vglue\D@c}
+
+\xydef@\filledRectangle@TPIC@@{%\W@{tp:\the\R@}%
+ \ifdim\R@=\z@ \DN@{\xyTPICfilledRegion\xyTPICrect@}%
+ \else \DN@{\xyTPICfilledRegion\xyTPICoval@}%
+ \fi \next@ }
+\xydef@\filledCircle@TPIC@@#1{{\R@c=\R@ \L@c=\R@ \U@c=\R@ \D@c=\R@
+ \xyTPICfilledRegion\xyTPICcircle@#1{}}}
+\xydef@\filledEllipse@TPIC@@{\xyTPICfilledRegion\xyTPICellipse@}
+\xydef@\filledOval@TPIC@@{\xyTPICfilledRegion\xyTPICoval@}
+
+\xydef@\installTPICfills@{%
+ \let\filledRectangle@@=\filledRectangle@TPIC@@
+ \let\filledOval@@=\filledOval@TPIC@@
+ \let\filledCircle@@=\filledCircle@TPIC@@
+ \let\filledEllipse@@=\filledEllipse@TPIC@@
+}
+\DOCMODE)
+
+Rectangles are treated as a special case of ovals.
+The |#2| parameter signifies whether the outline of the object
+should also be stroked (|#2|=|\relax|) after being filled.
+Such a stroke is always in black.
+
+\DOCMODE(
+\xydef@\xyTPICfillrect@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 fp}%
+ \else\TPICmacro@@{#1 ip}\fi}
+\xydef@\xyTPICfilloval@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 fp}%
+ \else\TPICmacro@@{#1 ip}\fi}
+\xydef@\xyTPICfillcirc@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 ar}%
+ \else\TPICmacro@@{#1 ai}\fi}
+\xydef@\xyTPICfillellipse@Special#1#2{%
+ \ifx#2\relax\TPICmacro@@{#1 ar}%
+ \else\TPICmacro@@{#1 ai}\fi}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\endinput
+
+% $Log: xytp-f.doc,v $
+% Revision 3.3 1996/12/18 09:49:07 ross
+% cosmetic changes to macro names
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+%
+% NEW for version 3.0 by by Ross Moore.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xytpic.doc b/Master/texmf-dist/source/generic/xypic/xytpic.doc
new file mode 100644
index 00000000000..02cddcb977f
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xytpic.doc
@@ -0,0 +1,472 @@
+%% $Id: xytpic.doc,v 3.3 1996/12/18 09:50:38 ross Exp $
+%%
+%% Xy-pic ``tpic'' TPIC backend, for lines, curves and fills.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{tpic}{TPIC backend}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ifx\undefined\TPIC \def\TPIC{{\smc tpic}}\fi
+This option allows the \Xy-pic fonts to be replaced by \TPIC\ |\special|s,
+when used with a dvi-driver capable of supporting them. Extra capabilities
+include smoother lines, evenly spaced dotted/dashed curves, variable
+line-widths, gray-scale fills of circles, ellipses and polygonal regions.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Use of \TPIC\ |\special|s offers an alternative to the \Xy-pic fonts. However
+they require a dvi-driver that is capable of recognizing and interpreting
+them. One such viewer is |xdvik|, Karl Berry's modification to the |xdvi|
+viewer on \unix\ systems running X-windows or a derivative. |dvipsk|, Karl
+Berry's modification to |dvips| also handles \TPIC\ |\special|s, so
+|xdvik|/|dvipsk| is an good combination for quality screen-display and
+\PS\ printing.
+
+Once loaded using |\xyoption{tpic}|, with an appropriate <driver> also
+specified either already or subsequently, the following commands are
+available to turn the \TPIC\ backend off/on.
+%
+\begin{defs}
+|\NoTPICspecials| & turns off \TPIC\ specials.\kern-50pt\cr
+|\UseTPICspecials| & reinstates \TPIC\ specials.\kern-30pt
+\end{defs}
+
+\DOCMODE(
+\xynew@{if}\ifTPICspecials@
+\xydef@\UseTPICspecials{\TPICspecials@true}
+\xydef@\NoTPICspecials{\TPICspecials@false}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+There is a limit to the number of points allowable in a path. For paths
+constructed by \Xy-pic, which includes spline curves, when the limit
+is reached the path is automatically flushed and a new path commenced.
+The following command can be used to customise this limit---initially
+set at $300$ for use with \xdvi---to suit alternative <driver>s.
+%
+\begin{defs}
+|\maxTPICpoints{|<num>|}| & set maximum for paths
+\end{defs}
+
+\DOCMODE(
+\xynew@{count}\xytpic@cnt
+\xydef@\xytpic@max{300}
+\xydef@\maxTPICpoints#1{\count@=#1 \relax
+ \ifnum\count@>\tw@ \edef\xytpic@max{\the\count@}%
+ \else\expandafter\xyTPICmaxwarning@\expandafter{\the\count@}\fi}
+\xydef@\xyTPICmaxwarning@#1{max points must be at least 2, #1 invalid}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Each object involving \TPIC\ |\special|s must set the style, using
+|\xytpic@set@| to store a macro as the expansion of |\xytpic@style@@|.
+Currently this is global, since a \TPIC\ object must be completed once
+it has been started --- perhaps this is not necessary.
+
+Note that |\xytpic@set@| uses |\xdef|, but has a |\noexpand| in its
+expansion; this forces expansion of the argument, when there is one,
+to the control sequence passed as the first token following |\xytpic@set@|.
+
+\DOCMODE(
+\xydef@\xytpic@style@@{\xytpic@fp}
+\xydef@\xytpic@reset@{\gdef\xytpic@style@@{\xytpic@fp}%
+ \global\xytpic@cnt=\z@ }
+\xydef@\xytpic@set@#1{\xdef\xytpic@style@@{\noexpand#1}}
+\DOCMODE)
+
+Here are the actual |\specials| that get placed in the dvi-file.
+
+\DOCMODE(
+\xydef@\xytpic@pn#1{\xyTPIC@special{pn #1}}
+\xydef@\xytpic@pa#1#2{\global\advance\xytpic@cnt\@ne\relax
+ \ifnum\xytpic@cnt=\xytpic@max\relax \xyTPIC@special{pa #1 #2}%
+ \kern-\X@c\raise-\Y@c\hbox{\xytpic@style@@}\kern\X@c
+% \xytpic@ip
+ \global\xytpic@cnt=\@ne \relax\fi \xyTPIC@special{pa #1 #2}}
+\xydef@\xytpic@fp{\xyTPIC@special{fp}}
+\xydef@\xytpic@ip{\xyTPIC@special{ip}}
+\xydef@\xytpic@da#1{\xyTPIC@special{da #1}}
+\xydef@\xytpic@dt#1{\xyTPIC@special{dt #1}}
+\xydef@\xytpic@sp#1{\xyTPIC@special{sp #1}}
+\xydef@\xytpic@ar#1#2#3#4#5#6{\xyTPIC@special{ar #1 #2 #3 #4 #5 #6}}
+\xydef@\xytpic@ia#1#2#3#4#5#6{\xyTPIC@special{ia #1 #2 #3 #4 #5 #6}}
+\xydef@\xytpic@sh#1{\xyTPIC@special{sh #1}}
+%\xydef@\xytpic@psb#1{\xyTPIC@special{:[begin] #1}}
+%\xydef@\xytpic@pse#1{\xyTPIC@special{:[end]}}
+%
+\xydef@\xytpic@wh{\xyTPIC@special{sh 0}} % obsolete
+\xydef@\xytpic@bk{\xyTPIC@special{sh 1}} % obsolete
+
+\xydef@\xyTPIC@special#1{\special{#1}}
+\xydef@\xyTPIC@noisy#1{\W@{TPIC: #1}\special{#1}}
+\xydef@\NoisyTPIC{\let\xyTPIC@special=\xyTPIC@noisy}
+\DOCMODE)
+
+Some effects may require a \TPIC\ |\special| to be placed both
+before and after the <object>.
+
+\DOCMODE(
+\xydef@\xyTPICsplit@#1#2{\setboxz@h{#1\boxz@#2}}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\TPIC\ uses units of `milli-inches' for coordinates,
+but inches for dot-separations and dash-length.
+
+\DOCMODE(
+\xydef@\xytpic@pt#1{\dimen@=#1\divide\dimen@ by72 %
+ \multiply\dimen@ by 1000 \advance\dimen@.5\p@
+ \count@=\dimen@ \divide\count@\p@ }
+\xydef@\xytpic@in#1{\dimen@=#1\divide\dimen@ by72 %
+ \edef\next@{\expandafter\removePT@\the\dimen@}}%
+\DOCMODE)
+
+The \TPIC\ location is calculated relative to the current \TeX\ reference
+point. Hence most \TPIC\ objects start at the $(0,0)$ location.
+
+\DOCMODE(
+\xydef@\xytpic@dot@@{\xytpic@pa00}
+\xydef@\xytpic@width@{\xytpic@pt{\xylinethick@}%
+ \expandafter\xytpic@pn\expandafter{\the\count@}}
+%\xylet@\xytpic@width@=\relax
+
+\xydef@\xytpic@line{%
+ \xytpic@dot@@ \xytpic@pt{-\d@X}\count@@=\count@
+ \xytpic@pt\d@Y \edef\next@{{\the\count@@}{\the\count@}}%
+ \expandafter\xytpic@pa\next@ \xytpic@style@@ \xytpic@reset@ }
+
+\xydef@\xytpic@solid@@{\xytpic@set@\xytpic@fp}
+\xydef@\xytpic@dashed@@{\xytpic@in\xydashl@ \xytpic@dad}
+\xydef@\xytpic@dotted@@{\dimen@=.5\xydashl@ \xytpic@in\dimen@ \xytpic@dtd}
+\xydef@\xytpic@dad{\expandafter\xytpic@set@\expandafter{%
+ \expandafter\xytpic@da\expandafter{\next@}}}
+\xydef@\xytpic@dtd{\expandafter\xytpic@set@\expandafter{%
+ \expandafter\xytpic@dt\expandafter{\next@}}}
+
+\xydef@\xytpic@polysolid@{\xytpic@set@\xytpic@fp}
+\xydef@\xytpic@polydashed@#1{\count@=#1 \xytpic@dad}
+\xydef@\xytpic@polydotted@#1{\count@=#1 \xytpic@dtd}
+\xydef@\xytpic@postpoly@{\xytpic@style@@ \xytpic@reset@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{re-bindings}
+
+This is similar to the mechanism used by the \PS\ back-end to rebind
+``hooks'' to incorporate a switch according to the current value of
+|\ifTPICspecials@|.
+
+\DOCMODE(
+\xydef@\TPICalternative@#1#2{%
+\expandafter\global\expandafter\let\csname origxy#2@\endcsname=#1%
+ \xdef#1{\noexpand\ifTPICspecials@
+ \noexpand\expandafter\expandafter\noexpand\csname xytpic@#2@\endcsname
+ \noexpand\else
+ \noexpand\expandafter\expandafter\noexpand\csname origxy#2@\endcsname
+ \noexpand\fi}}%
+\DOCMODE)
+
+Allow only one instance of |\setupxyTPIC@|; thereafter simply do
+|\reloadxyTPIC@| to turn on anything that has been turned off.
+
+\DOCMODE(
+\xydef@\setupxyTPIC@{\xywarning@{using TPIC specials}%
+ \TPICalternative@{\solid@}{solid}%
+ \TPICalternative@{\dash@}{dashed}%
+ \TPICalternative@{\point@}{point}%
+ \TPICalternative@{\circhar@@}{circhar}%
+ \TPICalternative@{\splinesolid@}{splinesolid}%
+% \TPICalternative@{\splinedashed@}{splinedashed}%
+% \TPICalternative@{\splinedotted@}{splinedotted}%
+ \xywithoption{frame}{\xyinputorelse@{xytp-f}{}\xyuncatcodes}%
+ \let\setupxyTPIC@=\reloadxyTPIC@
+ \activateTPIC@ }
+
+\xydef@\xyunloadTPIC@{\xywarning@{TPIC specials turned off}%
+ \xywithoption{curve}{\xysetup@@\uninstallTPICcurves@ }%
+ \xywithoption{line}{\xysetup@@\uninstallTPICline@ }%
+ \xywithoption{frame}{\xysetup@@\uninstallTPICframes@ }%
+ \TPICspecials@false
+ \let\setupxyTPIC@=\reloadxyTPIC@ }
+
+\xydef@\activateTPIC@{%
+ \xywithoption{line}{\xysetup@@\installTPICline@}%
+ \xywithoption{curve}{\xysetup@@\installTPICcurves@}%
+ \xywithoption{frame}{\xysetup@@\installTPICframes@}%
+ \TPICspecials@true }
+
+\xydef@\reloadxyTPIC@{\xywarning@{TPIC specials back on}\activateTPIC@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{straight lines}
+
+\DOCMODE(
+\xydef@\xytpic@solid@{%
+ \ifInvisible@ \let\next@=\no@@
+ \else \DN@{\xyTPICstraight@{\xytpic@solid@@ \xytpic@line}}\fi
+ \next@ }
+
+\xydef@\xytpic@dashed@{\line@
+ \def\Connect@@{\xyTPICstraight@{\xytpic@dashed@@ \xytpic@line}}}
+
+\xydef@\xytpic@point@{\xytpic@dot@@\xytpic@fp\egroup
+ \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}\ctipEdge@
+ \def\Drop@@{\styledboxz@}%
+ \def\Connect@@{\xyTPICstraight@{\xytpic@dotted@@ \xytpic@line}}}
+
+\xydef@\xyTPICstraight@#1{\setupDirection@
+ \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
+ \DN@##1##2{\def\checkoverlap@@{%
+ \ifdim##1\X@p>##1\X@c \let\next@=\relax \fi
+ \ifdim##2\Y@p>##2\Y@c \let\next@=\relax \fi}}%
+ \edef\nextii@{{\sd@X}{\sd@Y}}\expandafter\next@\nextii@
+ \noCshavep@@ \edef\Cshavep@@{\pfromthep@ \noexpand\resetDirection@}%
+ \noCshavec@@ \edef\Cshavec@@{\cfromthec@ \noexpand\resetDirection@}%
+ \ifHidden@\else
+ \ifdim\Y@c>\Y@max \Y@max=\Y@c \fi \ifdim\Y@p>\Y@max \Y@max=\Y@p \fi
+ \ifdim\Y@c<\Y@min \Y@min=\Y@c \fi \ifdim\Y@p<\Y@min \Y@min=\Y@p \fi
+ \ifdim\X@c>\X@max \X@max=\X@c \fi \ifdim\X@p>\X@max \X@max=\X@p \fi
+ \ifdim\X@c<\X@min \X@min=\X@c \fi \ifdim\X@p<\X@min \X@min=\X@p \fi \fi
+ \ifInvisible@\let\next@=\relax \else
+ \DN@{\setboxz@h{\kern\X@c \raise\Y@c\hbox{#1}}%
+ \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}%
+ \fi
+ \checkoverlap@@
+ \ifdim\d@X=\z@ \ifdim\d@Y=\z@ \DN@{\relax}\fi\fi \next@
+ \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
+ \def\Calong@@{\noCalong@@}\Creset@@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{spline curves}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+Of the curves defined in the |xycurve| extension, only solid spline curves
+are supported. This is done by treating the spline as a polygon (poly-line)
+with many segments. The dotted or dashed variants do not work correctly.
+
+Implementations of \TPIC\ draw dashed polygons such that the start and
+finish of each segment is solid. Since these segments can be very short,
+the effect is simply to create a solid line. Similarly the shortness of the
+segments tends to give nothing at all for large portions of a dotted curve.
+What is needed is an implementation whereby the on/off nature of a dashed
+or dotted polygon is determined by the accumulated length, not the length
+along just the current segment.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xydef@\xytpic@splinesolid@{\xyTPICspline@\xytpic@fp }
+\xydef@\xytpic@splinedashed@{\xytpic@in\xydashl@\expandafter\xyTPICspline@
+ \expandafter{\expandafter\xytpic@da\expandafter{\next@}}}
+\xydef@\xytpic@splinedotted@{\xytpic@in{.5\xydashl@}\expandafter\xyTPICspline@
+ \expandafter{\expandafter\xytpic@dt\expandafter{\next@}}}
+
+\xydef@\xyTPICspline@#1{\setbox\splinebox@=\copy\voidb@x %\zerodot
+ \SloppyCurves %\splinetol@=\xydashl@ % \xytpic@ip
+ \global\xytpic@cnt=\@ne \xytpic@set@{#1}%
+ \def\splineextra@@{\xyTPICspline@dot}%
+ \def\xycrvdrop@{ }\def\xycrvconn@{}\splineset@@ \xytpic@style@@}
+
+\xydef@\xyTPICspline@dot{\xytpic@pt{\X@c}\count@@=\count@
+ \xytpic@pt{-\Y@c}\edef\next@{{\the\count@@}{\the\count@}}%
+ \expandafter\xytpic@pa\next@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{line width}
+
+\DOCMODE(
+\xydef@\xyTPIClinewidth@#1{\xytpic@pt{#1}\edef\next@{\the\count@}}
+
+\xydef@\installTPICline@{%
+ \let\xylinewidth@@=\xylinewidth@
+ \let\xylineSpecial@@=\xytpic@pn
+ \let\transxyline@@=\xyTPIClinewidth@ }
+
+\xydef@\uninstallTPICline@{\UnloadLine@}%
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{circles and ellipses}
+
+Here we catch circles and ellipses specified using the |\xycircle| command
+from the |xycurve| extension. Since TPIC supports only solid circles,
+we catch it only when the <style> is either |{}| or |{-}|.
+
+\DOCMODE(
+\xydef@\xydoTPICcircle@#1{\DN@{#1}%
+ \ifx\next@\empty\DN@{\xyTPICfullcircle@}%
+ \else\expandafter\DNii@\expandafter{\addDASH@{}}%
+ \ifx\next@\nextii@\DN@{\L@=\R@ \xyTPICfullcircle@}%
+ \else\DN@{\dosolidcircle@{#1}}\fi\fi \next@ }
+
+\xydef@\xyTPICfullcircle@{\xyTPICpartcircle@{00}0\twoPi@}%
+
+\xydef@\xyTPICpartcircle@#1#2#3{%
+ \xytpic@pt{\R@}\expandafter\DNii@\expandafter{\the\count@}%
+ \xytpic@pt{\L@}\edef\next@{#1{\nextii@}{\the\count@}{#2}{#3}}%
+ \expandafter\xytpic@ar\next@ }
+
+\xydef@\qartPi@{0.7853981}
+\xydef@\tartPi@{2.3561944}
+\DOCMODE)
+
+This replaces just the font character, called using |\circhar@@#1|.
+
+\DOCMODE(
+\xydef@\xytpic@circhar@#1{\xytpic@width@\ifcase#1%
+ \xytpic@pt{\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{\tartPi@}{\fullPi@}\kern\partroottwo\R@
+ \or
+ \xytpic@pt{\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{\halfPi@}{\tartPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{\z@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{\qartPi@}{\halfPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{-\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@0{\qartPi@}\kern\partroottwo\R@
+ \or
+ \xytpic@pt{-\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\qartPi@}0\kern\partroottwo\R@
+ \or
+ \xytpic@pt{\z@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\halfPi@}{-\qartPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{\halfroottwo\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\tartPi@}{-\halfPi@}\kern\halfroottwo\R@
+ \or
+ \xytpic@pt{\R@}\edef\next@{{{\the\count@}0}}%
+ \expandafter\xyTPICcirchar@i\next@{-\fullPi@}{-\tartPi@}\kern\partroottwo\R@
+ \fi}
+
+\xydef@\xyTPICcirchar@i#1#2#3{\L@=\R@ \xyTPICpartcircle@{#1}{#2}{#3}}
+\DOCMODE)
+
+\paragraph*{quadratic splines}
+
+\DOCMODE(
+\xydef@\xyTPIC@spline@ii@{\DN@{\xy@spline@ii}%
+ \ifx\splineSTYLE@\empty\DN@{\xyTPICqspline@{0}}%
+ \else\expandafter\DNii@\expandafter{\addDASH@{}}%
+ \ifx\splineSTYLE@\nextii@\DN@{\xyTPICqspline@{0}}%
+ \else\expandafter\DNii@\expandafter{\addDOT@{}}%
+ \ifx\splineSTYLE@\nextii@\DN@{\xyTPICqspline@{-.5}}%
+ \else\expandafter\expandafter\expandafter\DNii@\expandafter\expandafter
+ \expandafter{\expandafter\addDASH@\addDASH@{}}%
+ \ifx\splineSTYLE@\nextii@\DN@{\xyTPICqspline@{}}%
+ \fi\fi\fi\fi
+ \next@ }%
+
+\xydef@\xyTPIC@accumulate{\xytpic@pt\X@c \count@@=\count@
+ \xytpic@pt{-\Y@c}\edef\next@{{\the\count@@}{\the\count@}}%
+ \expandafter\xytpic@pa\next@ }
+
+\xydef@\xyTPICqspline@#1{\xytpic@width@
+ \xytpic@in{#1\xydashl@}\expandafter\gdef\expandafter\xytpic@style@@
+ \expandafter{\expandafter\xytpic@sp\expandafter{\next@}}%
+ \save@ \cfromp@ \xyTPIC@accumulate
+ \edef\smapp@@{\s@bot}\smapxy@i{\xyTPIC@accumulate}%
+ \leave@ \xyTPIC@accumulate \xytpic@style@@ \xytpic@reset@
+ \enter@{}\xy@spline@x }
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\installTPICcurves@{%
+ \let\dosolidcircle@@=\xydoTPICcircle@
+ \let\xy@spline@ii@@=\xyTPIC@spline@ii@
+ }
+\xydef@\uninstallTPICcurves@{%
+ \let\dosolidcircle@@=\dosolidcircle@
+ \let\xy@spline@ii@@=\xy@spline@ii }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{frames}
+\DOCMODE(
+ \xywithoption{frame}{\xyinputorelse@{xytp-f}{}}
+\DOCMODE)
+
+Implement color fills by reading from a |\TPICfillcolor|.
+Implement pattern fills by reading from a |\TPICfillpatt|.
+Read these whenever a fill is requested.
+
+
+\DOCMODE(
+\xydef@\uninstallTPICframes@{\UnloadFrames@}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xytpic.doc,v $
+% Revision 3.3 1996/12/18 09:50:38 ross
+% adjusted Drop@@ for styles
+% minor improvements to file-loading commands
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.1 by Ross Moore 1995/03/18.
+% replaces xyps-col.doc
+%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% fill-prefix:""
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyv2.doc b/Master/texmf-dist/source/generic/xypic/xyv2.doc
new file mode 100644
index 00000000000..aa237e4c2e5
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyv2.doc
@@ -0,0 +1,868 @@
+%% $Id: xyv2.doc,v 3.4 1997/05/18 01:14:25 krisrose Exp $
+%%
+%% Xy-pic ``Version 2 compatibility'' feature.
+%% Copyright (c) 1993-1995 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1995 Kristoffer H. Rose <kris@diku.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{v2}{Version 2 Compatibility}{\stripRCS$Revision: 3.4 $}%
+ {Kristoffer H.~Rose}{krisrose@brics.dk}%
+ {BRICS/Computer Science, University of Aarhus, Ny Munkegade, building 540,
+ DK--8000 Aarhus~C}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ This \FILE\ describes the special backwards compatibility with
+ \Xy-pic version~2: diagrams written according to the ``Typesetting
+ diagrams with \Xy-pic: User's Manual''~\cite{R92:TypesettingDXUM}
+ should typeset correctly with this loaded. The compatibility is
+ available either as an \Xy-option or through the special files
+ |xypic.sty| and |xypic.tex| described below.
+
+ There are a few exceptions to the compatibility: the features described
+ in~\S??[unsupported] below are not provided because they are not as
+ useful as the author originally thought and thus virtually never
+ used. And one extra command is provided to speed up typesetting of
+ documents with \Xy-pic version~2 diagrams by allowing the new
+ compilation functionality with old diagrams.
+
+ The remaining sections list all the obsolete commands and suggest
+ ways to achieve the same things using \Xy-pic \xyversion, \ie,
+ without the use of this option. They are grouped as to what part of
+ \Xy-pic replaces them; the compilation command is described last.
+
+ \NOTE: ``version 2'' is meant to cover all public releases of \Xy-pic
+ in 1991 and 1992, \ie, version 1.40 and versions~2.1 through~2.6.
+ The published manual cited above (for version 2.6) is the reference
+ in case of variations between these versions, and only things
+ documented in that manual will be supported by this
+ option!\footnote{In addition a few of the experimental facilities
+ supported in v2.7--2.12 are also supported.}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+ Before we start, the old name macro.
+
+\DOCMODE(
+\xylet@\XY=\Xy
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Unsupported incompatibilities}
+??=[unsupported]
+
+ Here is a list of known incompatibilities with version 2 even when
+ the |v2| option is loaded.
+%
+\begin{itemize}
+\item
+ Automatic `shortening' of arrow tails using ??c![|<<] breaks was a
+ bug and has been `fixed' so it does not work any more.
+ Put a |||<\hole| break before it.
+\item
+ The version~2.6 ??c![*] position operator is not available. The
+ version 2.6 construction $t_0|;|t_1|*(|x|,|y|)|$ should be replaced by
+ the rather long but equivalent construction
+$$
+\begin{array}{r@{}l}
+ |{|\,t_0\,|;p+/r/:|\,t_1\,|=|&|"1";p+/u/,x;(0,0);:|\\
+ &|"1";p+/r/,y;(0,0);::|\,|(|x|,|y|)}|
+\end{array}
+$$
+ In most cases $t_0|;|t_1|**{}?(|x|)|$,
+ possibly with a trailing $|+/^|\dots|/|$, suffices instead.
+\item
+ Using $t_0|;|t_1|:(|x|,|y|)|$ as the target of an arrow command does
+ not work. Enclose it in braces, \ie, write
+$$
+ |{|\,t_0\,|;|\,t_1\,|:(|x|,|y|)}|
+$$
+\item
+ The older ??c![\pit], ??c![\apit], and ??c![\bpit] commands are not
+ defined. Use |\dir{>}| (or |\tip|) with variants and rotation.
+\item
+ The even older notation where an argument in braces to |\rto| and the
+ others was automatically taken to be a `tail' is not supported. Use
+ the supported |||<|\dots\ notation.
+\end{itemize}
+%
+ If you do not use these features then your version~2 (and earlier)
+ diagrams should typeset the same with this option loaded except that
+ sometimes the spacing with version~3 is slightly different from that
+ of version~2.6 which had some spacing bugs.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Obsolete kernel features}
+??=[kernel]
+
+ The following things are added to the kernel by this option and
+ described here: idioms, obsolete positions, obsolete connections, and
+ obsolete objects. For each we show the suggested way of doing the
+ same thing without this option:
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Removed \protect\AMS-\TeX\ idioms}
+
+ Some idioms from \AMS-\TeX\ are no longer used by \Xy-pic: the
+ definition commands ??c![\define] and ??c![\redefine], and the size
+ commands ??c![\dsize], ??c![\tsize], ??c![\ssize], and ??c![\sssize].
+ Please use the commands recommended for your format---for plain \TeX\
+ these are |\def| for the first two and |\displaystyle|, |\textstyle|,
+ |\scriptstyle|, and |\scriptscriptstyle| for the rest. The |v2|
+ option ensures that they are available anyway.
+
+\DOCMODE(
+\ifx\redefine\undefined \let\redefine=\def \fi
+\ifx\define\undefined \let\define=\xydef@ \fi
+
+\ifx\dsize\undefined \let\dsize=\displaystyle \fi
+\ifx\tsize\undefined \let\dsize=\textstyle \fi
+\ifx\ssize\undefined \let\ssize=\scriptstyle \fi
+\ifx\sssize\undefined \let\sssize=\scriptscriptstyle \fi
+\DOCMODE)
+
+ Version also 2 used the \AMS-\TeX\ ??c![\text] and a (non-object) box
+ construction ??c![\Text] which are emulated---|\text| is only defined
+ if not already defined, however, using the native one (of \AMS-\TeX\
+ or \AMS-\LaTeX\ or whatever) if possible. Please use the |\txt|
+ object construction described in~\S??g[xy.doc:objectlib.text]
+ directly since it is more general and much more efficient!
+
+\DOCMODE(
+\ifx\text\undefined
+ \def\text{\relax\textC}%
+ \xydef@\textC#1{\relax
+ \ifmmode\mathchoice
+ {\hbox{\the\textfont0\relax#1}}%
+ {\hbox{\the\textfont0\relax#1}}%
+ {\hbox{\the\scriptfont0\relax#1}}%
+ {\hbox{\the\scriptscriptfont0\relax#1}}%
+ \else{\relax#1}\fi}
+\fi
+
+\xydef@\Text{\relax\xyFN@\Text@}
+
+\xydef@\TextC{\relax\textC}%
+
+\xydef@\Text@{%
+ \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\A@=##1\Text@i}%
+ \else \DN@{\A@=\maxdimen \Text@i}\fi \next@}
+
+\xydef@\Text@i#1{%
+ \ifmmode \mathchoice
+ {\expandafter\Text@ii\the\textfont0{#1}}%
+ {\expandafter\Text@ii\the\textfont0{#1}}%
+ {\expandafter\Text@ii\the\scriptfont0{#1}}%
+ {\expandafter\Text@ii\the\scriptscriptfont0{#1}}%
+ \else
+ \leavevmode \expandafter\Text@ii\the\textfont0{#1}%
+ \fi\ignorespaces}
+
+\xydef@\Text@ii{\hbox\bgroup \txt@i}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Obsolete state}
+
+ Upto version 2.6 users could access the state variables ??c![\cL],
+ ??c![\cR], ??c![\cH], and ??c![\cD], which are defined.
+
+\DOCMODE(
+\xylet@\cL=\L@c
+\xylet@\cR=\R@c
+\xylet@\cD=\D@c
+\xylet@\cH=\U@c
+\DOCMODE)
+
+ From v2.7 to 2.12 users could use the names of the state |\dimen|
+ registers ??c![\Xmin], ??c![\Xmax], ??c![\Ymin], and ??c![\Ymax];
+ ??c![\Xp], ??c![\Yp] ??c![\Dp], ??c![\Up], ??c![\Lp], and ??c![\Rp];
+ ??c![\Xc], ??c![\Yc] ??c![\Dc], ??c![\Uc], ??c![\Lc], and ??c![\Rc];
+ ??c![\Xorigin], ??c![\Yorigin], ??c![\Xxbase], ??c![\Yxbase],
+ ??c![\Xybase], and ??c![\Yybase]. Now the same effect can be
+ achieved using <corner>s but |v2| defines the aliases.
+
+\DOCMODE(
+\xylet@\Xc=\X@c
+\xylet@\Yc=\Y@c
+\xylet@\Uc=\U@c
+\xylet@\Dc=\D@c
+\xylet@\Lc=\L@c
+\xylet@\Rc=\R@c
+
+\xylet@\Xp=\X@p
+\xylet@\Yp=\Y@p
+\xylet@\Up=\U@p
+\xylet@\Dp=\D@p
+\xylet@\Lp=\L@p
+\xylet@\Rp=\R@p
+
+\xylet@\dX=\d@X
+\xylet@\dY=\d@Y
+
+\xylet@\Xorigin=\X@origin
+\xylet@\Yorigin=\Y@origin
+\xylet@\Xxbase =\X@xbase
+\xylet@\Yxbase =\Y@xbase
+\xylet@\Xybase =\X@ybase
+\xylet@\Yybase =\Y@ybase
+
+\xylet@\Xmin=\X@min
+\xylet@\Ymin=\Y@min
+\xylet@\Xmax=\X@max
+\xylet@\Ymax=\Y@max
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Obsolete position manipulation}
+
+ In version~2 many things were done using individual <decor> control
+ sequences that are now done using <pos> operators.
+%
+\begin{defs}
+ Version 2 positioning\hfil & Replacement \cr
+ \noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+ ??c![\go]<pos> & |\POS;p,|<pos> \cr
+ ??c![\aftergo]|{|<decor>|}|<pos> \kern-2pc \cr
+ &\kern-3pc|\afterPOS{|<decor>|};p,|<pos> \cr
+ ??c![\merge] & |\POS.p\relax| \cr
+ ??c![\swap] & |\POS;\relax| \cr
+ ??c![\Drop]|{|<text>|}| & |\drop+{|<text>|}| \cr
+\end{defs}
+%
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ The code is basically that of |xy.doc| 2.6\dots
+
+\DOCMODE(
+\xydef@\go{\aftergo{}}
+\xydef@\aftergo#1{\xy@\aftergo{\enter@\pfromthec@}\afterPOS{\xy@@\leave@#1}}
+
+\xydef@\merge{\POS.p\relax}
+
+\xydef@\swap{\xy@\swap\swap@}
+
+\xydef@\Drop{\expandafter\drop\entrymodifiers@}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Obsolete connections}
+
+ These connections are now implemented using directionals.
+%
+\begin{defs}
+ Version 2 connection\hfil & Replacement \cr
+ \noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+ ??c![\none] & |\connect h\dir{}| \cr
+ ??c![\solid] & |\connect h\dir{-}| \cr
+ ??c![\Solid] & |\connect h\dir2{-}| \cr
+ ??c![\Ssolid] & |\connect h\dir3{-}| \cr
+ ??c![\dashed] & |\connect h\dir{--}| \cr
+ ??c![\Dashed] & |\connect h\dir2{--}| \cr
+ ??c![\Ddashed] & |\connect h\dir3{--}| \cr
+ ??c![\dotted] & |\connect h\dir{.}| \cr
+ ??c![\Dotted] & |\connect h\dir2{.}| \cr
+ ??c![\Ddotted] & |\connect h\dir3{.}| \cr
+ ??c![\dottedwith]|{|<text>|}|& |\connect h{|<text>|}| \cr
+\end{defs}
+%
+ Note how the `hidden' specifier |h| should be used because version~2
+ connections did not affect the size of diagrams.
+
+\DOCMODE(
+\xydef@\none{\xy@\none{}\ignorespaces}
+
+\xydef@\solid{\connect h\dir{-}}
+\xydef@\Solid{\connect h\dir2{-}}
+\xydef@\Ssolid{\connect h\dir3{-}}
+
+\xydef@\dashed{\connect h\dir{--}}
+\xydef@\Dashed{\connect h\dir2{--}}
+\xydef@\Ddashed{\connect h\dir3{--}}
+
+\xydef@\dotted{\connect h\dir{.}}
+\xydef@\Dotted{\connect h\dir2{.}}
+\xydef@\Ddotted{\connect h\dir3{.}}
+
+\xydef@\dottedwith#1{\connect h{#1}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Obsolete tips}
+
+ These objects all have |\dir|-names now:
+%
+\begin{defs}
+ Version 2 tip\hfil & Replacement \cr
+ \noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+ ??c![\notip] & |\dir{}| \cr
+ ??c![\stop] & |\dir{||}| \cr
+ ??c![\astop] & |\dir^{||}| \cr
+ ??c![\bstop] & |\dir_{||}| \cr
+ ??c![\tip] & |\dir{>}| \cr
+ ??c![\atip] & |\dir^{>}| \cr
+ ??c![\btip] & |\dir_{>}| \cr
+ ??c![\Tip] & |\dir2{>}| \cr
+ ??c![\aTip]
+ & \kern-2pc|\object=<5pt>:(32,-1)\dir^{>}|\kern-1pc \cr
+ ??c![\bTip]
+ & \kern-2pc|\object=<5pt>:(32,+1)\dir_{>}|\kern-1pc \cr
+ ??c![\Ttip] & |\dir3{>}| \cr
+ ??c![\ahook] & |\dir^{(}| \cr
+ ??c![\bhook] & |\dir_{(}| \cr
+ ??c![\aturn] & |\dir^{'}| \cr
+ ??c![\bturn] & |\dir_{'}| \cr
+\end{defs}
+%
+\DOCMODE(
+\xydef@\notip{\dir{}}
+
+\xydef@\stop{\dir{|}}
+\xydef@\astop{\dir^{|}}
+\xydef@\bstop{\dir_{|}}
+
+\xydef@\tip{\dir{>}}
+\xydef@\atip{\dir^{>}}
+\xydef@\btip{\dir_{>}}
+
+\xydef@\Tip{\dir2{>}}
+
+\xywarnifdefined\aTip
+\xywarnifdefined\bTip
+{\xyuncatcodes
+ \gdef\aTip{\object=<5pt>:(32,-1)\dir^{>}}
+ \gdef\bTip{\object=<5pt>:(32,+1)\dir_{>}}}
+
+\xydef@\Ttip{\dir3{>}}
+
+\xydef@\ahook{\dir^{(}}
+\xydef@\bhook{\dir_{(}}
+
+\xydef@\aturn{\dir^{'}}
+\xydef@\bturn{\dir_{'}}
+\DOCMODE)
+
+ The older commands |\pit|, |\apit|, and |\bpit|, are not provided.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Obsolete object constructions}
+
+ The following object construction macros are made obsolete by the
+ enriched <object> format:
+%
+\begin{defs}
+ Version 2 object\hfil & Replacement \cr
+ \noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+ ??c![\rotate]|(|<factor>|)|<tip> \kern-4pc \cr
+ &\kern-3pc |\object:(|<factor>|,|<factor>|){|<tip>|}| \cr
+ ??c![\hole] & |\object+{}| \cr
+ ??c![\squash]<tip> & |\object=0{|<tip>|}| \cr
+ ??c![\grow]<tip> & |\object+{|<tip>|}| \cr
+ |\grow<|<dimen>|>|<tip> & |\object+<|<dimen>|>{|<tip>|}| \cr
+ ??c![\squarify]|{|<text>|}| & |\object+={|<text>|}| \cr
+ |\squarify<|<dimen>|>{|<text>|}| \kern-4pc \cr
+ &\kern-3pc |\object+=<|<dimen>|>{|<text>|}| \cr
+\end{defs}
+\noindent\unskip
+%
+ where rotation is done in a slightly different manner in
+ version~\xyversion\ (it was never accurate in version~2).
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ These are mostly just the unmodified version 2.6 code:
+
+\DOCMODE(
+\xydef@\rotate{\hbox\bgroup
+ \DN@{\ifx (\next %)
+ \DN@(####1){\rotate@ii{####1}}%
+ \else \DN@{\rotate@i}\fi\next@}\xyFN@\next@}
+
+\xydef@\rotate@i#1{\reverseDirection@ #1\OBJECT@x}
+
+\xydef@\rotate@ii#1#2{\dimen@=#1\p@
+ \ifdim \dimen@=-\p@ \aboveDirection@\xydashl@
+ \else\ifdim\dimen@= \p@ \belowDirection@\xydashl@
+ \else\ifdim\dimen@<-1.5\p@ \advance\dimen@-2\p@
+ \edef\next@{\expandafter\removePT@\the\dimen@}\vDirection@(-1,\next@){1pc}%
+ \else\ifdim\dimen@<-.5\p@ \vDirection@(#1,-1){1pc}%
+ \else\ifdim\dimen@< .5\p@ \vDirection@( 1,#1){1pc}%
+ \else\ifdim\dimen@<1.5\p@ \vDirection@(#1, 1){1pc}%
+ \else \dimen@=-\dimen@ \advance\dimen@2\p@
+ \edef\next@{\expandafter\removePT@\the\dimen@}\vDirection@(-1,\next@){1pc}%
+ \fi\fi\fi\fi\fi\fi
+ #2\OBJECT@x}
+
+\xydef@\squash#1{%
+ \ifmmode\setboxz@h{\m@th${\mathstrut}#1{\mathstrut}$}\else\setboxz@h{#1}\fi
+ \setboxz@h{\kern-.5\wdz@ \dimen@=.5\ht\z@ \advance\dimen@-.5\dp\z@
+ \lower\dimen@\boxz@}%
+ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
+
+\xydef@\grow{%
+ \DN@{\ifx <\next \DN@<####1>{\dimen@=####1\grow@\empty}%
+ \else \DN@{\dimen@=2\p@ \grow@\empty}\fi\next@}\xyFN@\next@}
+
+\xydef@\grow@#1#{\grow@@{#1}}
+\xydef@\grow@@#1#2{\relax
+ \ifmmode \setboxz@h{\kern\dimen@ \m@th$#2$\kern\dimen@}%
+ \else \setboxz@h{\kern\dimen@ {#2}\kern\dimen@}\fi
+ \dimen@ii=\ht\z@ \advance\dimen@ii\dimen@ \ht\z@=\dimen@ii
+ \dimen@ii=\dp\z@ \advance\dimen@ii\dimen@ \dp\z@=\dimen@ii \boxz@}
+
+\xydef@\squarify{\addEQ@{\addPLUS@\object}}
+\DOCMODE)
+
+ We also reimplement the version~2 undocumented ??c![\qc] quarter
+ circle which is now called |\corn@@| of the frame extension.
+
+\DOCMODE(
+\xydef@\qc{\corn@@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Obsolete extensions \& features}
+??=[extensions]??=[features]
+
+ Version~2 had commutative diagram functionality corresponding to the
+ |frames| extension and parts of the |matrix| and |arrow| features.
+ These are therefore loaded and some extra definitions added to
+ emulate commands that have disappeared.
+
+\subsubsection*{Frames}
+
+ The version 2 frame commands are emulated using the frame extension
+ (as well as the |\dotframed|, |\dashframed|, |\rounddashframed|
+ commands comm\-unicated to some users by electronic mail):
+%
+\begin{defs}
+ Version 2 object\hfil & Replacement \cr
+ \noalign{\nobreak\smallskip\nobreak\hrule\nobreak\smallskip\nobreak}
+ ??c![\framed] & |\drop\frm{-}| \cr
+ |\framed<|<dimen>|>| & |\drop\frm<|<dimen>|>{-}| \cr
+ ??c![\Framed] & |\drop\frm{=}| \cr
+ |\Framed<|<dimen>|>| & |\drop\frm<|<dimen>|>{=}| \cr
+ ??c![\dotframed] & |\drop\frm{.}| \cr
+ ??c![\dashframed] & |\drop\frm{--}| \cr
+ ??c![\rounddashframed] & |\drop\frm{o-}| \cr
+ ??c![\circled] & |\drop\frm{o}| \cr
+ ??c![\Circled] & |\drop\frm{oo}| \cr
+\end{defs}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ For each of the above commands (and a few hidden ones) we parse the
+ above and convert to the proper format.
+
+\DOCMODE(
+\xyrequire{frame}\xycatcodes
+
+\xydef@\framed{\relax\convertframed{-}}
+\xydef@\Framed{\relax\convertframed{=}}
+
+\xydef@\circled{\relax\convertframed{o}}
+\xydef@\Circled{\relax\convertframed{oo}}
+
+\xydef@\convertframed#1{\DNii@##1@{\drop\frm##1{#1}}\xyFN@\convertframed@i}
+
+\xydef@\convertframed@i{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@##1}{\addGT@{\addLT@{\nextii@}##1}@}%
+ \else \DN@{\nextii@ @}\fi \next@}
+
+\xydef@\dotframed{\relax\drop\frm{.}}
+\xydef@\dashframed{\relax\drop\frm{--}}
+\xydef@\rounddashframed{\relax\drop\frm{o-}}
+
+\xydef@\filled{\DN@{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@####1}{\xy@@{\frame@fill@@{####1}}}%
+ \else \DN@{\xy@@{\frame@fill@@\z@}}%
+ \fi\next@}\xyFN@\next@}
+
+\xydef@\Filled{\DN@{%
+ \addLT@\ifx \next
+ \addGT@{\addLT@\DN@####1}{\xy@@{\frame@emph@@{####1}}}%
+ \else \DN@{\xy@@{\frame@emph@@\z@}}%
+ \fi\next@}\xyFN@\next@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Matrices}
+
+ The ??c![\diagram] <rows> ??c![\enddiagram] command is provided as an
+ alias for |\xymatrix{| <rows> |}| centered in math mode and
+ ??c![\LaTeXdiagrams] changes it to use |\begin| \dots\ |\end| syntax.
+ |v2| sets a special internal `old matrix' flag such that
+ trailing~|\\| are ignored and entries starting with~|*| are safe.
+
+\DOCMODE(
+\xyrequire{matrix}\xycatcodes
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\diagram#1\enddiagram{\relax\diagram@\diagram@@{#1}}
+
+\xydef@\diagram@{\relax
+ \ifmmode \DN@##1##2{\vcenter{\oldxymatrix@true \xy##1{\xymatrix{##2}}\endxy}}%
+ \else\DN@##1##2{{\oldxymatrix@true \xy/u.8ex/##1{\xymatrix{##2}}\endxy}}%
+ \fi \next@}
+
+\xydef@\LaTeXdiagrams{\def\diagram{\ltxdiagram@\diagram@@}%
+ \def\diagramnocompile{\ltxdiagram@\literal@}% Declared in Compiling
+ \def\diagramcompileto##1{\ltxdiagram@{\NoCompileMatrices\xycompileto{##1}}}}
+
+\xydef@\ltxdiagram@#1#2\end#3{\relax
+ \DN@{#3}\DNii@{diagram}\ifx\next@\nextii@\diagram@{#1}{#2}\end{diagram}%
+ \else\xyerr@{Put \string{\string} around \string\begin...\string\end\space
+ within diagrams}\fi}
+
+\xylet@\diagram@@=\literal@
+
+\xydef@\NoisyDiagrams{}
+\DOCMODE)
+
+ ??c![\NoisyDiagrams] is ignored because the matrix feature always
+ outputs progress messages.
+
+ Finally the version 2 ??c![\spreaddiagramrows],
+ |\spread|\-|diagramcolumns|??c[\spreaddiagramcolumns] spacing
+ commands are emulated using |\xymatrixrowsep| and |\xymatrixcolsep|:
+
+\DOCMODE(
+\xydef@\spreaddiagramrows#1{\addPLUS@\xymatrixrowsep{#1}}
+\xydef@\spreaddiagramcolumns#1{\addPLUS@\xymatrixcolsep{#1}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection*{Arrows}
+
+ The main arrow commands of version 2 were the ??c![\morphism] and
+ ??c![\definemorphism] commands which now have been replaced by the
+ |\ar| command.
+
+ |v2| provides them as well as uses them to define the version~2
+ commands ??c![\xto], ??c![\xline], ??c![\xdashed], ??c![\xdotted],
+ ??c![\xdouble], and all the derived commands |\dto|, |\urto|, \dots;
+ the |\arrow| commands of the $\beta$-releases of v3 is also provided.
+
+ Instead of commands like |\rrto| and |\uldouble| you should use the
+ arrow feature replacements |\ar[rr]| and |\ar@{=}[ul]|.
+
+ The predefined turning solid arrows |\lltou|, \dots, |\tord| are
+ defined as well; these are now easy to do with <turn>s.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% translating `old' arrows into `new' ones:
+% \\\([durl][durl]*\)to \\ar[\1]
+% \\\([durl][durl]*\)line \\ar@{-}[\1]
+% \\\([durl][durl]*\)dashed \\ar@{--}[\1]
+% \\\([durl][durl]*\)dotted \\ar@{.}[\1]
+% \\\([durl][durl]*\)double \\ar@{=}[\1]
+
+\DOCMODE(
+\xyrequire{arrow}\xycatcodes
+\xylet@\arrow=\ar
+\DOCMODE)
+
+ |\morphism| is a reduced version of the |\ar| command.
+
+\DOCMODE(
+%\xyuncatcodes \catcode35=6
+% \def\next#1#2#3{\relax \PATH ~={#1} ~>{\POS?>*{#2}\relax} ~<{\POS;?<*{#3};\relax}}
+%\xycatcodes
+%\xylet@\morphism=\next
+
+{\xyuncatcodes
+ \gdef\morPHISM#1#2#3{\PATH~={\oldconnect{#1}}~<{|<*{#3}}~>{|>*{#2}}}}
+
+\xydef@\morphism{\relax\morPHISM}
+
+\xylet@\connect@iii=\connect
+\xydef@\oldconnect#1{%
+ \let\PATHlabelabove@@=\PATHlabelabove@ %KLUDGE!
+ \let\PATHlabelbelow@@=\PATHlabelbelow@
+ \let\connect=\preconnect#1\let\connect=\connect@iii}
+\DOCMODE)
+
+ \TODO: Unpack this to what |\PATH| does\dots
+
+ |\definemorphism| is essentially unchanged except we now use the
+ privacy checking commands.
+
+\DOCMODE(
+\xydef@\definemorphism#1#2#3#4{%
+ \xydefcsname@{x#1}{\morphism{#2}{#3}{#4}}%
+ \xydefcsname@{u#1}{\morphism{#2}{#3}{#4}[u]}%
+ \xydefcsname@{d#1}{\morphism{#2}{#3}{#4}[d]}%
+ \xydefcsname@{l#1}{\morphism{#2}{#3}{#4}[l]}%
+ \xydefcsname@{r#1}{\morphism{#2}{#3}{#4}[r]}%
+ \xydefcsname@{uu#1}{\morphism{#2}{#3}{#4}[uu]}%
+ \xydefcsname@{dd#1}{\morphism{#2}{#3}{#4}[dd]}%
+ \xydefcsname@{ll#1}{\morphism{#2}{#3}{#4}[ll]}%
+ \xydefcsname@{rr#1}{\morphism{#2}{#3}{#4}[rr]}%
+ \xydefcsname@{ur#1}{\morphism{#2}{#3}{#4}[ur]}%
+ \xydefcsname@{ul#1}{\morphism{#2}{#3}{#4}[ul]}%
+ \xydefcsname@{dr#1}{\morphism{#2}{#3}{#4}[dr]}%
+ \xydefcsname@{dl#1}{\morphism{#2}{#3}{#4}[dl]}%
+ \xydefcsname@{uul#1}{\morphism{#2}{#3}{#4}[uul]}%
+ \xydefcsname@{uur#1}{\morphism{#2}{#3}{#4}[uur]}%
+ \xydefcsname@{ull#1}{\morphism{#2}{#3}{#4}[ull]}%
+ \xydefcsname@{urr#1}{\morphism{#2}{#3}{#4}[urr]}%
+ \xydefcsname@{ddl#1}{\morphism{#2}{#3}{#4}[ddl]}%
+ \xydefcsname@{ddr#1}{\morphism{#2}{#3}{#4}[ddr]}%
+ \xydefcsname@{dll#1}{\morphism{#2}{#3}{#4}[dll]}%
+ \xydefcsname@{drr#1}{\morphism{#2}{#3}{#4}[drr]}%
+ \xydefcsname@{uull#1}{\morphism{#2}{#3}{#4}[uull]}%
+ \xydefcsname@{uurr#1}{\morphism{#2}{#3}{#4}[uurr]}%
+ \xydefcsname@{ddll#1}{\morphism{#2}{#3}{#4}[ddll]}%
+ \xydefcsname@{ddrr#1}{\morphism{#2}{#3}{#4}[ddrr]}}
+
+\definemorphism{to}\solid\tip\notip
+\definemorphism{line}\solid\notip\notip
+\definemorphism{dashed}\dashed\notip\notip
+\definemorphism{dotted}\dotted\notip\notip
+\definemorphism{double}\Solid\notip\notip
+\DOCMODE)
+
+ \TODO: These could be "hugely" optimised by using the |arrow| feature
+ directly\dots
+
+ Next the predefined bent morphisms of version 2. These required some
+ hacking to work; I hope this doesn't mean that the <path> semantics
+ has changed to much\dots\frowny
+
+\DOCMODE(
+\xywarnifdefined\xyviitoi
+\xywarnifdefined\xyviitoii
+
+\xydef@\XXtoY@#1#2#3#4#5{\save;[#3]\relax
+ \xy@@{%
+ \dimen@=\turnradius@ \ifdim#1<#2\relax \dimen@ii=#2\else\dimen@ii=#1\fi
+ \advance\dimen@\ifdim\dimen@>\dimen@ii +\dimen@\else +\dimen@ii\fi
+ \edef\xyviitoi{\the\dimen@}\leave@}%
+ \xto ~{[#3]} `#4[#3]#5/#4\xyviitoi/ `[#3]}
+
+\xydef@\toXY@#1#2#3#4#5{\xy@@{\idfromc@{@}%
+ \dimen@=\turnradius@ \dimen@ii=#1\relax
+ \advance\dimen@\ifdim\dimen@>\dimen@ii +\dimen@\else +\dimen@ii\fi
+ \edef\xyviitoi{\the\dimen@}%
+ \dimen@=\turnradius@ \dimen@ii=#2\relax
+ \advance\dimen@\ifdim\dimen@>\dimen@ii +\dimen@\else +\dimen@ii\fi
+ \edef\xyviitoii{\the\dimen@}}%
+ \morphism\solid{\object #4:(-1,0)\dir{>}}\notip
+ ~{`"@" "@"} `#3"@"#5/#3\xyviitoi/#5/#4\p@/ `"@"#5/#4\xyviitoii/}
+
+\xyuncatcodes \catcode64=11 %
+
+\xydef@\lltod{\XXtoY@\D@c\D@p{ll}{d}+}
+\xydef@\lltou{\XXtoY@\U@c\U@p{ll}{u}+}
+\xydef@\rrtod{\XXtoY@\D@c\D@p{rr}{d}+}
+\xydef@\rrtou{\XXtoY@\U@c\U@p{rr}{u}+}
+\xydef@\ddtol{\XXtoY@\L@c\L@p{dd}{l}+}
+\xydef@\ddtor{\XXtoY@\R@c\R@p{dd}{r}+}
+\xydef@\uutol{\XXtoY@\L@c\L@p{uu}{l}+}
+\xydef@\uutor{\XXtoY@\R@c\R@p{uu}{r}+}
+
+\xydef@\told{\toXY@\L@c\D@c{l}{d}+}
+\xydef@\tolu{\toXY@\L@c\U@c{l}{u}+}
+\xydef@\tord{\toXY@\R@c\D@c{r}{d}+}
+\xydef@\toru{\toXY@\R@c\U@c{r}{u}+}
+\xydef@\todl{\toXY@\D@c\L@c{d}{l}+}
+\xydef@\todr{\toXY@\D@c\R@c{d}{r}+}
+\xydef@\toul{\toXY@\U@c\L@c{u}{l}+}
+\xydef@\tour{\toXY@\U@c\R@c{u}{r}+}
+
+\xycatcodes
+\DOCMODE)
+
+ Finally the version 2 arrow radius default command that actually
+ never worked but some people might have hoped\dots
+
+\DOCMODE(
+\xydef@\TurnRadius{\addEQ@\turnradius}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Obsolete loading}
+??=[loading]
+
+ The v2 User's Manual says that you can load \Xy-pic with the command
+ ??c![\input xypic] and as a \LaTeX~2.09 `style option' |[xypic]|.
+ This is made synonymous with loading this option by the files
+ ??c![xypic.tex] and ??c![xypic.sty] distributed with the |v2| option.
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{description}
+
+\item[|xypic.tex|:]
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsubsection*{xypic.doc}
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\inputdoc!{xypic.doc}
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\item[|xypic.sty|:]
+ Loads |xy.sty| and the |v2| feature.
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsubsection*{xypic.sty}
+\inputdoc0{xypic.sty}
+
+\DOCMODE1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\end{description}
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\subsection{Compiling v2-diagrams}
+??=[compiling]
+
+ In order to make it possible to use the new compilation features even
+ on documents written with \Xy-pic v2, the following command was
+ added in v2.12:
+%
+\begin{defs1}
+|\diagramcompileto{| <name> |}| \dots\ |\enddiagram| \cr
+\end{defs1}
+\noindent\unskip
+%
+ which is like the ordinary diagram command except the result is
+ compiled (see note~??g[xy.doc:compile]). Note that compilation is
+ not quite safe in all cases!
+
+\DOCMODE(
+\xydef@\diagramcompileto#1#2\enddiagram{\relax
+ \diagram@{\NoCompileMatrices\xycompileto{#1}}{#2}}
+\DOCMODE)
+
+ There is also the following command that switches on "automatic
+ compilation" of all diagrams created with the v2 |\diagram| \dots\
+ |\enddiagram| command:
+%
+\begin{defs1}
+|\CompileAllDiagrams| |{| <prefix> |}| \cr
+|\NoCompileAllDiagrams| \cr
+|\ReCompileAllDiagrams| \cr
+\end{defs1}
+\noindent\unskip
+%
+ will apply |\xycompileto{|<prefix>$n$|}{|\dots|}| to each diagram
+ with~$n$ a sequence number starting from~1. Use |\CompileMatrices|
+ and |\CompilePrefix| instead!
+
+ If for some reason a diagram does not work when compiled then replace
+ the |\diagram| command with |\diagramnocompile| (or in case you are
+ using the \LaTeX\ form, |\begin{diagramnocompile}|).
+
+\DOCMODE(
+\xydef@\diagramnocompile#1\enddiagram{\relax\diagram@\literal@{#1}}
+\DOCMODE)
+
+\DOCMODE(
+\xydef@\CompileAllDiagrams#1{\CompilePrefix{#1}\CompileMatrices}
+\xydef@\NoCompileAllDiagrams{\NoCompileMatrices}
+\xydef@\ReCompileAllDiagrams{\CompileMatrices}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection*{End \& log}
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyv2.doc,v $
+% Revision 3.4 1997/05/18 01:14:25 krisrose
+% Essential bugfixes.
+%
+% Revision 3.3 1996/12/19 14:43:55 krisrose
+% Maintenance release.
+%
+% Revision 3.2 1995/09/19 18:22:27 kris
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:31:32 kris
+% Releasing!
+%
+% Revision 3.0 1995/07/07 20:14:21 kris
+% Major release w/new User's Guide!
+%
+% Revision 2.14 1995/07/05 22:10:12 kris
+% Buglets...
+%
+% Revision 2.13 1995/07/04 15:11:17 kris
+% Ready to release v3?
+%
+% Revision 2.12 1994/10/25 11:34:25 kris
+% Interim release just before v3 [works with AMS-LaTeX 1.2]...
+%
+% Revision 2.11 1994/07/05 10:37:32 kris
+% Third 3beta release [bug fixes].
+% Experimental graph feature included (for ECCT-94 presentation).
+%
+% Revision 2.10 1994/06/15 12:55:07 kris
+% Second 3beta release: bug fixes.
+%
+% Revision 2.9 1994/06/09 14:59:19 kris
+% Release 3beta.
+%
+% Revision 2.8 1994/04/08 04:30:00 kris
+% Second (bug fix) 3alpha release.
+%
+% Revision 2.7 1994/03/08 02:06:01 kris
+% Release 3alpha.
+%
+% Revision 2.6.9.1 1994/03/07 04:22:46 kris
+% Last internal 3alpha and pre-2.7 release.
+%
+% NEW file to go in version 2.7 (extracted from xy.doc 2.6.1.1).
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-prefix:"\t"
+% fill-column:77
+% paragraph-separate:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% paragraph-start:"^[ \t\f]*$\\|^[^\t]\\|\\\\\\\\\\|\\$\\$\\|[^\n\\\\][%&]"
+% TeX-parse-self:nil
+% LaTeX-indent-level:1
+% TeX-brace-indent-level:1
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyweb.doc b/Master/texmf-dist/source/generic/xypic/xyweb.doc
new file mode 100644
index 00000000000..06b77d7e310
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyweb.doc
@@ -0,0 +1,326 @@
+%% $Id: xyweb.doc,v 3.3 1996/12/18 09:52:11 ross Exp $
+%%
+%% Xy-pic ``Lattice and web'' feature.
+%% Copyright (c) 1994-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{web}{Lattice and web feature}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent
+ This feature provides macros to facilitate typesetting of arrangements
+ of points within a 2-dimensional lattice or ``web-like'' structure.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\message{lattices,}
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+We need two counters and macros to access their values.
+
+\DOCMODE(
+\xynew@{count}\lattice@A
+\xynew@{count}\lattice@B
+\xydef@\latticeA{\lattice@A}
+\xydef@\latticeB{\lattice@B}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%\subsection{Lattices}
+%\noindent
+Currently the only routines implemented with this feature are some ``quick
+and dirty'' macros for dropping objects at the points of an integer lattice.
+\TODO: More sophisticated routines will be developed for later versions of
+\Xy-pic, as the need arises.
+
+Mathematically speaking, let $\vec u$ and $\vec v$ be vectors pointing in
+independent directions within the plane. Then the lattice spanned by
+$\vec u$ and $\vec v$ is the infinite set of points $L$ given by:
+$$
+L\;=\; \bigl\{ a\,\vec u + b\,\vec v\;;\;
+\mbox{ for $a$, $b$ integers} \bigr\}\,.
+$$
+Within \Xy-pic the vectors $\vec u$ and $\vec v$ can be established
+as the current coordinate basis vectors.
+The following macros typeset a finite subset of an abstract lattice.
+%
+\begin{defs}
+|\xylattice#1#2#3#4| & points in lattice\cr
+|\croplattice#1#2#3#4#5#6#7#8|\kern-44pt&\cr
+ &\dots in specific rectangle.\cr
+\end{defs}
+%
+\noindent
+The parameters |#1| \dots |#4| are to be integers
+$a_{\min}$, $a_{\max}$, $b_{\min}$ and $b_{\max}$,
+so that the portion of the lattice to be typeset
+is that collection of vectors in $L$ for which
+$a_{\min} \le a \le a_{\max}$ and $b_{\min} \le b \le b_{\max}$.
+%
+\begin{code}
+\def\latticebody{%
+\ifnum\latticeA=1 \ifnum\latticeB=-1 %
+\else\drop{\circ}\fi\else\drop{\circ}\fi}
+\xy *\xybox{0;<1.5pc,1mm>:<1mm,1.5pc>::
+,0,{\xylattice{-4}4{-3}3}
+ ,(1,-1)="a"*{\bullet}*+<2pt>!UL{a}
+ ,(-1,1)."a"*\frm{.}}="L"
+,{"L"+L \ar "L"+R*+!L{s^{(1)}}}
+,{"L"+D \ar "L"+U*+!D{s^{(2)}}}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+In the above code, notice how the basis is first established then the
+|\xylattice| typeset. Doing this within an |\xybox| allows axes
+to be sized and placed appropriately.
+Since lattice points are determined by their (integer) coordinate
+displacements, they can be revisited to add extra <object>s into
+the overall picture. More generally, the origin for lattice-coordinates
+is the current <pos> $c$, when the |\xylattice| command is encountered.
+Easy accessibility is maintained, as seen in the next example.
+
+\medskip
+
+When the basis vectors $\vec u$ and $\vec v$ are not perpendicular
+the collection of points with $a,b$ in these ranges will fill out
+a skew parallelogram. Generally it is useful to plot only those points
+lying within a fixed rectangle.
+This is the purpose of |\croplattice|, with its extra parameters
+|#5| \dots |#8| determining the `cropping' rectangle within which
+lattice points will be typeset. Other points will not be typeset
+even when $a$ and $b$ are within the specified ranges.
+Explicitly the horizontal range of the cropping rectangle is $X_{\min}$
+to $X_{\max}$, with $X_{\min}$ being the $X$-coordinate of the vector
+$|#5|\times\vec u$, where |#5| is a <number> (not necessarily an integer).
+Similarly $X_{\max}$ is the $X$-coordinate of $|#6|\times\vec u$.
+The vertical extents are $Y_{\min}$ and $Y_{\max}$, given by the
+$Y$-coordinates of $|#7|\times\vec v$ and $|#8|\times\vec v$ respectively.
+%
+\begin{code}
+\def\latticebody{%
+\ifnum\latticeA=1 \ifnum\latticeB=-1 %
+\else \drop{\circ}\fi\else
+\ifnum\latticeA=0 \ifnum\latticeB=1\else
+\drop{\circ}\fi\else\drop{\circ}\fi\fi}
+\xy +(2,2)="o",0*\xybox{%
+ 0;<3pc,1.5mm>:<0.72pc,1.65pc>::,{"o"
+ \croplattice{-4}4{-4}4{-2.6}{2.6}{-3}3}
+ ,"o"+(0,1)="a"*{\bullet}*+!D{\alpha}
+ ,"o"+(1,-1)="b"*{\bullet}*+!L{\beta}
+ ,"o"+(0,-1)="c","o"+(-1,1)="d"
+ ,"a"."c"="e",!DR*{};"a"**\dir{.}
+ ,"e",!UL*{};"c"**\dir{.}
+ ,"b"."d"="f",!DL*{};"b"**\dir{.}
+ ,"f",!UR*{};"d"**\dir{.}
+ ,"e"."f"*\frm{.}}="L","o"."L"="L"
+ ,{"L"+L \ar "L"+R*+!L{s^{(1)}}}
+ ,{"L"+D \ar "L"+U*+!D{s^{(2)}}}
+\endxy
+\end{code}
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The routines |\xylattice| and |\croplattice| simply cycle through the
+allowable range of values for |\lattice@A| and |\lattice@B|,
+with |\lattice@B| varying within the inner loop.
+
+\DOCMODE(
+\xydef@\xylattice#1#2#3#4{\xy@{LATTICE}{\xylattice@{#1}{#2}{#3}{#4}}}%
+
+\xydef@\xylattice@#1#2#3#4{%
+ \lattice@A=#1\relax
+ \loop \bgroup\lattice@B=#3\relax
+ \innerlatticeloop@{#4}%
+ \edef\tmp@{\egroup
+ \X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max
+ }\tmp@ \ifnum\lattice@A<#2\relax \advance\lattice@A\@ne
+ \repeat }
+
+\xydef@\innerlatticeloop@#1{%
+ \loop \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ \the\lattice@A,\the\lattice@B @%
+ \edef\latticeX{\expandafter\removePT@\the\X@c}%
+ \edef\latticeY{\expandafter\removePT@\the\Y@c}%
+ \leave@ \latticebody \leave@
+ \ifnum\lattice@B<#1\relax \advance\lattice@B\@ne
+ \repeat }
+\DOCMODE)
+
+With |\xylattice| getting the picture size correct is simply
+a matter of passing |\X@min|, |X@max|, etc. outside of the inner group.
+However with |\croplattice| these are first set to correspond to the
+`cropping rectangle' then subsequently merged with their original
+values.
+
+\DOCMODE(
+\xydef@\croplattice#1#2#3#4#5#6#7#8{\xy@{LATTICE}%
+ {\xycroplattice@{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}%
+
+\xydef@\xycroplattice@#1#2#3#4#5#6#7#8{%
+ \enter@{\X@min=\the\X@min \X@max=\the\X@max
+ \Y@min=\the\Y@min \Y@max=\the\Y@max}%
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ #5,0 @\leave@ \X@min=\X@c \leave@
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ #6,0 @\leave@ \X@max=\X@c \leave@
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ 0,#7 @\leave@ \Y@min=\Y@c \leave@
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ 0,#8 @\leave@ \Y@max=\Y@c \leave@
+ \lattice@A=#1\relax
+ \loop
+ \bgroup\lattice@B=#3\relax
+ \enter@{\cfromthec@}\innercroplatticeloop@{#4}\leave@
+ \egroup
+ \ifnum\lattice@A<#2\relax \advance\lattice@A\@ne
+ \repeat \mergecropextents@ }
+
+\xydef@\innercroplatticeloop@#1{%
+ \loop
+ \enter@{\cfromthec@}\enter@{\cplusthec@}%
+ \vfromcartesian@@ \the\lattice@A,\the\lattice@B @%
+ \edef\latticeX{\expandafter\removePT@\the\X@c}%
+ \edef\latticeY{\expandafter\removePT@\the\Y@c}%
+ \leave@ \DN@{\latticebody}%
+ \ifdim\X@c<\X@min\DN@{}%
+ \else\ifdim\X@c>\X@max\DN@{}%
+ \else\ifdim\Y@c<\Y@min\DN@{}%
+ \else\ifdim\Y@c>\Y@max\DN@{}%
+ \fi\fi\fi\fi \next@ \leave@
+ \ifnum\lattice@B<#1\relax \advance\lattice@B\@ne
+ \repeat }
+
+\xydef@\mergecropextents@{%
+ \edef\tmp@{%
+ \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi
+ \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi
+ \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi
+ \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi}%
+ \leave@ \tmp@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The |\latticebody| macro.}
+At each lattice point within the specified range for $a,b$ (and within
+the cropping rectangle when |\croplattice| is used), a macro called
+|\latticebody| is expanded. This is meant to be user-definable,
+so as to be able to adapt to any specific requirement.
+It has a default expansion given by \dots
+$$
+|\def\latticebody{\drop{\bullet}}|\,.
+$$
+The following macros may be useful when specifying what to do at each
+point of the lattice.
+%
+\begin{defs}
+|\latticebody| & expanded at lattice points \cr
+|\defaultlatticebody|\kern-20pt & \kern20pt resets to default \cr
+|\latticeA| & $a$-value of lattice point\cr
+|\latticeB| & $b$-value of lattice point\cr
+|\latticeX| & $X$-coord, offset in |pt|s\dots\cr
+|\latticeY| & $Y$-coord, \dots from lattice origin.\cr
+\end{defs}
+As in the examples presented above, the object dropped at the lattice
+point can be varied according to its location, or omitted altogether.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The default |\latticebody| macro \dots
+
+\DOCMODE(
+\xydef@\deflatticebody@{\def\latticebody{\drop{\bullet}}}
+\xydef@\defaultlatticebody{\deflatticebody@}
+\deflatticebody@
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+In the final example the |\latticebody| macro
+performs a calculation to decide which lattice points
+should be emphasised:
+%
+\begin{code}
+\def\latticebody{\dimen0=\latticeX pt
+ \ifdim\dimen0>0pt \divide\dimen0 by 64
+ \dimen0=\latticeY\dimen0 \relax
+ \ifdim 0pt>\dimen0 \dimen0=-\dimen0 \fi
+ \ifdim 10pt>\dimen0 \drop{\bullet}%
+ \else\drop{.}\fi \else\drop{.}\fi}
+\xy*\xybox{0;<3pc,2.57mm>:<.83pc,2.25pc>::
+,0,{\croplattice{-3}5{-5}5
+ {-1.3}{4.5}{-3.4}{4.4}}}="L"
+,{"L"+L \ar "L"+!R*+!L{\sigma^{(1)}}}
+,{"L"+D \ar "L"+!U*+!D{\sigma^{(2)}}}
+\endxy
+\end{code}
+%\displaycode
+$$\docode$$
+\displaycode
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyweb.doc,v $
+% Revision 3.3 1996/12/18 09:52:11 ross
+% no changes
+%
+% Revision 3.1 1995/09/05 20:36:33 ross
+% Release!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/05 10:36:22 ross
+% Ready for v3 release?
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End:
diff --git a/Master/texmf-dist/source/generic/xypic/xyxdvi.doc b/Master/texmf-dist/source/generic/xypic/xyxdvi.doc
new file mode 100644
index 00000000000..0a33c52cf24
--- /dev/null
+++ b/Master/texmf-dist/source/generic/xypic/xyxdvi.doc
@@ -0,0 +1,335 @@
+%% $Id: xyxdvi.doc,v 3.3 1996/12/18 09:53:22 ross Exp $
+%%
+%% Xy-pic ``xdvi-driver'' option.
+%% Copyright (c) 1995-1996 Ross Moore <ross@mpce.mq.edu.au>
+%%
+%% This file is part of the Xy-pic package for graphs and diagrams in TeX.
+%% See the companion README and INSTALL files for further information.
+%% Copyright (c) 1991-1996 Kristoffer H. Rose <krisrose@brics.dk>
+%%
+%% The Xy-pic package is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The Xy-pic package is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+%% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License along
+%% with this package; if not, write to the Free Software Foundation, Inc.,
+%% 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+\ifx\xyloaded\undefined \input xy \fi
+
+\xyprovide{xdvi}{XDVI driver}{\stripRCS$Revision: 3.3 $}%
+ {Ross Moore}{ross@mpce.mq.edu.au}%
+ {Mathematics Department, Macquarie University, NSW~2109, Australia}
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This driver provides support for extensions when using variants of the
+|xdvi| driver, by Eric Cooper, Bob Scheifler, Mark Eichin and others.
+It has been used successfully with |xdvi| patchlevel 20, by Paul Vojta,
+and |xdvik| version~18f, by Karl Berry.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Some of the supported features assume that the implementation of |xdvi| is
+linked to a \PS\ renderer; e.g. {\it Ghostscript} or {\sc Display \PS}.
+If such support is not available, then invoking |xdvi| using the command
+|xdvi -hushspecials| will suppress warning messages that might otherwise
+be produced.
+One drawback of such a setup is that much of the \PS\ is not
+rendered until after all of the font characters, etc. have been placed on
+the page. Thus text that was meant to be placed on top of a filled or
+patterned region may appear to be obscured by it. However when printed,
+using a \PS\ printer, the correct placement is obtained.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph*{Header:}\leavevmode
+\DOCHEADER
+
+\paragraph*{Driver installation}
+\DOCMODE(
+\xydef@\xdvi@@#1{\dvimessage@{xdvi}{#1}}
+
+\newdriver{%
+ \xyaddsupport{color}\xdviColor@@
+ \xyaddsupport{crayon}\xdviCrayola@@
+ \xyaddsupport{ps}\xdviPS@@
+ \xyaddsupport{rotate}\xdviRotate@@
+ \xyaddsupport{line}\xdviLine@@
+ \xyaddsupport{frame}\xdviFrames@@
+ \xyaddsupport{tile}\xdviTiles@@
+ \xyaddsupport{tpic}\xdviTPIC@
+}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Supported |\special| effects are...
+%
+\begin{itemize}
+
+\item colour, using \PS.
+
+Not all versions of |xdvi| support color |\special|s, so there is no direct
+support for colour. However parts of pictures rendered using \PS\ may
+appear coloured, due to interpretation of colour commands within the \PS.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Disable the |\xylocalColor@| but enable the |\xycolor@| for use by \PS.
+
+\DOCMODE(
+\xydef@\xdvi@Color@{\xdviPStypes@
+ \let\xylocalColor@=\xyNoColor@@
+% \let\xylocalColor@=\xystackcolor@
+% \let\xycolor@push\xycolor@push@@
+ \def\xycolor@{\xycolor@@}\let\xycolorwarning@=\relax
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-c}{\xydrivernoload@{ps-c}}\installPScolor@ }%
+ \else\DN@{}\fi \next@
+ \ifx\xycolor@@\xyNoColor@ \let\xycolor@@=\xycolor@raw@@\fi
+ \ifx\xycrayolaloaded\empty \DN@{\xystandardcolors@\xdviCrayola@{}}%
+ \else \DN@{\xystandardcolors@}\fi \next@
+ \let\xdviColor@@=\relax
+ \let\UnloadColor@@=\NoXDVIcolor@
+ }%
+
+\xydef@\xdviColor@@{\xdvi@Color@}
+
+\xydef@\NoXDVIcolor@{%
+ \def\xycolor@{\xycolor@@}%
+ \let\xycolor@@=\xyNoColor@
+ \let\xylocalColor@=\xyNoColor@@
+ \let\xycolorwarning@=\xycolorwarning@@
+ \let\xdviColor@@=\xdvi@Color@
+ \let\UnloadColor@@=\UnloadColor@
+ }
+\DOCMODE)
+
+If neither support file |colordvi.tex| nor |colordvi.sty| can be found,
+then the normal colour support will not be available. However the colour
+support for the \PS\ back-end can still be used.
+
+\DOCMODE(
+\xydef@\NoXDVIcolordvi@{\xywarning@{%
+ Neither colordvi.tex nor colordvi.sty could be found.}%
+ \xyBEcolorcheck@}%
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item crayon colours.
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The 68 colours that |xdvi| recognizes by name are not loaded unless the
+|crayon| option has been requested.
+
+\DOCMODE(
+\xydef@\xdviCrayola@@{\xdviColor@@\xdviCrayola@}
+
+\xydef@\xdviCrayola@{%
+ \let\prevxycolor@=\newxycolor@
+ \def\newxyXDVIcolor@##1##2##3{\prevxycolor@{##1}{}{##1}}%
+ \let\newxycolor@=\newxyXDVIcolor@
+ \installCrayolaColors@
+ \let\newxycolor@=\prevxycolor@ }%
+\DOCMODE)
+
+Although any order of loading options: |ps|, |xdvi|, |color| and |crayon|
+produces the desired result visually, the \PS\ code can be different
+with different loading order. The most easily readable is obtained when
+|crayon| is requested last.
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \PS\ back-end.
+\DOCMODE(
+\xydef@\xdviPS@@{\xdviPS@}
+
+\xydef@\xdviPS@unload{\UnloadPS@
+ \let\UnloadPS@@=\UnloadPS@
+ \let\xdviPS@@=\xdviPS@ }
+\DOCMODE)
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The latest versions of |xdvi| recognise most forms of |\special| command
+that are recognised by |dvips|; these are used to support \PS\ effects.
+
+\DOCMODE(
+\xydef@\xdviPStypes@{%
+ \xyinputorelse@{xyps-ps}{\xydrivernoload@{ps-ps}}%
+ \ifx\PSspecial@@\xdviSpecial@\else
+ \let\PSspecial@@=\xdviSpecial@
+ \let\PSmacro@@=\xdviMacro@
+ \let\PSdict@@=\xdviDict@
+ \let\PSspecialdict@@=\xdviDict@
+ \let\PSraw@@=\xdviRaw@
+ \let\PSinclude@@=\xdviInclude@
+ \let\xyPSobeylines@@=\obeyXDVIlines@
+ \let\xyPScurrpt@@=\xdviCurrpt@@
+ \xdvi@@{PostScript}%
+ \fi \XYpredict@ }
+
+\xywarnifdefined\xdviSpecial@
+\xywarnifdefined\xdviMacro@
+\xywarnifdefined\xdviDict@
+\xywarnifdefined\xdviInclude@
+\xywarnifdefined\xdviRaw@
+{\catcode`\"=11 \catcode`\!=11 \catcode`\:=11
+ \gdef\xdviSpecial@#1{\special{ps:: SDict begin #1 end}}
+ \gdef\xdviMacro@#1{\firstPS@@\special{" {#1}xy}}
+% \gdef\xdviDict@#1{\special{! mark{#1}stopped cleartomark}}
+ \gdef\xdviDict@#1{\special{! #1}}
+ \gdef\xdviInclude@#1{\special{header=#1}}
+ \gdef\xdviRaw@#1{\special{ps: SDict begin #1 end}}
+
+\catcode`\^^M=\active %
+ \gdef\next{\catcode`\^^M=\active \let^^M=\space }}%
+\xylet@\obeyXDVIlines@=\next
+\DOCMODE)
+
+All the \PS\ definitions passed to |xdvi| by reading the
+dictionary file are stored in a \PS\ dictionary which it defines,
+called |SDict|. This must be the current dictionary whenever an \Xy-ps
+command is to be executed.
+This will be the case whenever the |\special{" |{\it commands}|}| or
+|\special{! |{\it commands}|}| forms are used, but not when the
+|\special{ps:: |{\it commands}|}| form is used.
+Thus the |\xdviSpecial@| macro includes code to open |SDict| and
+close it when finished; so also does the |\xdviRaw@| type, since this
+is used with \Xy-pic\ \PS\ operators whose definitions have been placed
+within |SDict|.
+
+The |currentpoint| is defined for the ``raw'' specials.
+
+\DOCMODE(
+\xydef@\xdviCurrpt@{\let\xyPScurrpt@@=\xdviCurrpt@@}%
+\xydef@\xdviCurrpt@@{\PSraw@@{xyp}}
+\DOCMODE)
+
+The \PS\ operator called |xyp| is defined in |xyps-ps| for storing the
+location read from |currentpoint|.
+
+\medskip
+
+This installs the \PS\ backend.
+
+\DOCMODE(
+\xydef@\xdviPS@{\xdviPStypes@
+ \let\xdviPS@@=\PSspecials@true
+ \let\UnloadPS@@=\xdviPS@unload
+ \let\installxyps@@=\relax \installxyps@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item rotated/scaled diagrams and text, using \PS.
+\DOCMODE(
+\xydef@\xdviRotate@@{\xdviRotate@}
+
+\xydef@\xdviRotate@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-r}{\xydrivernoload@{ps-r}}%
+ \xdviCurrpt@ \xdviRotScale@ \installPSrotscale@ }%
+ \else\DN@{\xydriverfail@{rotations are}UnloadRotate@\relax}\fi
+ \next@ }
+
+\xydef@\xdviRotScale@{%
+ \def\xyrot@start(##1){{xyct ##1\space xyrs }}%
+ \def\xyrot@end{}%
+ \def\xyscale@start(##1,##2){{xyct ##1\space##2\space xyss }}%
+ \def\xyscale@end{}}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item variable line-widths and poly-lines, using \PS.
+\DOCMODE(
+\xydef@\xdviLine@@{\xdviLine@}
+
+\xydef@\xdviLine@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-l}{\xydrivernoload@{ps-l}}\installPSline@ }%
+ \else\DN@{\xydriverfail@{line-widths are}\UnloadLine@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item extra frames and fills, using \PS.
+\DOCMODE(
+\xydef@\xdviFrames@@{\xdviFrames@}
+
+\xydef@\xdviFrames@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-f}{\xydrivernoload@{ps-f}}\installPSframes@ }%
+ \else\DN@{\xydriverfail@{frames are}\UnloadFrames@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item patterns and tiles, using \PS.
+\DOCMODE(
+\xydef@\xdviTiles@@{\xdviTiles@}
+
+\xydef@\xdviTiles@{\xdviPStypes@
+ \expandafter\ifx\csname xyps-psloaded\endcsname\empty\DN@{%
+ \xyinputorelse@{xyps-t}{\xydrivernoload@{ps-t}}\installPSpatterns@ }%
+ \else\DN@{\xydriverfail@{Patterns are}\UnloadPSpatterns@\relax}\fi
+ \next@ }
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\item \TPIC\ drawing commands.
+\DOCMODE(
+\xydef@\xdviTPIC@@{\xdviTPIC@}
+
+\xydef@\xdviTPIC@{\setupxyTPIC@}
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\end{itemize}
+
+\DOCMODE2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\paragraph*{The end \& Log}\leavevmode
+
+\DOCMODE(
+\xyendinput
+
+% $Log: xyxdvi.doc,v $
+% Revision 3.3 1996/12/18 09:53:22 ross
+% minor improvements to file-loading commands
+%
+% Revision 3.2 1995/09/19 18:21:41 ross
+% Bug fix release.
+%
+% Revision 3.1 1995/09/05 20:28:57 ross
+% Releasing version 3.1!
+%
+% Revision 3.0 1995/07/07 20:13:19 ross
+% Major release w/new User's Guide!
+%
+% Revision 2.13 1995/07/04 15:04:51 ross
+% Ready for release of v3.
+%
+% NEW for version 3.
+\DOCMODE)
+
+\DOCMODE3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tell Emacs that this is a LaTeX document and how it is formatted:
+% Local Variables:
+% mode:latex
+% fill-column:77
+% End: