diff options
Diffstat (limited to 'Master/texmf-dist/source/generic/xypic')
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} +\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: |