diff options
Diffstat (limited to 'Master/texmf-dist/source/generic/xypic/xymatrix.doc')
-rw-r--r-- | Master/texmf-dist/source/generic/xypic/xymatrix.doc | 1345 |
1 files changed, 0 insertions, 1345 deletions
diff --git a/Master/texmf-dist/source/generic/xypic/xymatrix.doc b/Master/texmf-dist/source/generic/xypic/xymatrix.doc deleted file mode 100644 index 4c269ad502a..00000000000 --- a/Master/texmf-dist/source/generic/xypic/xymatrix.doc +++ /dev/null @@ -1,1345 +0,0 @@ -%% $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: |