[Xy-pic] Problem with skewing(?)

Richard Lewis xypic at rtf.org.uk
Thu Apr 8 01:32:43 CEST 2004


Ross Moore <ross at ics.mq.edu.au> writes:

> Hello Richard,
>
> On 24/03/2004, at 9:58 PM, Richard Lewis wrote:
>
>> Hi everyone,
>>
>> I am trying to define a command \SliceObj (that will take three
>> arguments: top, label and bottom) to typeset a vertical arrow,
>> framed  with parentheses (...),
>> whose reference point should be the middle of the label.
>>
>> Something like
>>
>>    /       \
>>   |  {#1}   |
>>   |   |     |
>>   |   |{#2} |
>>   |   |     |
>>   |   V     |
>>   |  {#3}   |
>>    \       /
>>
>> with the reference in the middle of {#2}
>>

> Provided that I understand correctly what you are trying to do,
> I find 3 "errors" in your coding...
>
>> \newcommand{\SliceObj}[3]{%
>>   %%% vertical arrow: #1=source, #2=target, #3=LABEL
>>   %% 1. c is where we start.  We draw an arrow starting 0.6cm above
>> c,  and
>>   %%    ending 0.6cm under c.
>>   \POS+<0cm,0.6cm>*+{#1}="TOP"+<0cm,-1.2cm>*+{#3}="BASE"
>>   \POS\ar"TOP";"BASE"^-{#2}="LABEL"
>>   %% 2. join all 3 bits together, reference is at "LABEL"
>>   \POS"LABEL"."TOP"."BASE"
>>   %% 3. add brackets `(' and `)' around the joined thing
>>   *\frm{(}*\frm{)}="joined-thing",
>>   %% 4. Add margin, using !C to ensure we get equal space all around
>> the
>>   %%    joined-thing
>>   %%    [I am using *+\frm{.} so we can see where the object at
>>   %%    "SOBJ-with-margin" extends to---when i get \SliceObj to work i
>>   %%    will want to use *+\frm{}, to get a margin (but no frame)]
>>   "joined-thing"!C*+\frm{.}="SOBJ-with-margin",
>>   %% 5. now set the reference point
>>   "SOBJ-with-margin"*{\circ},        %we are here before skew
>>   "joined-thing"*{\oplus},           %want reference to be here
>>   %% try and skew reference of SOBJ-with-margin to joined-thing
>>   "SOBJ-with-margin"!"joined-thing"="here"*{\otimes},
>       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------- see below
>>   "here"                             %here is where our reference ended
>> }
>
>
> Firstly:
>
>    %% try and skew reference of SOBJ-with-margin to joined-thing
>     "joined-thing"."SOBJ-with-margin"="here"*{\otimes},
>      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Doesn't this do what you want ?

aha! that does indeed get the \otimes into the place i wanted it,
thanks very much.


Ah...in the refernece manual, it says (table on page 8) that you can do

<POS>!<COORD>

and <COORD> can be "<ID>", according to the table on page 8.  Should
it say

<POS>!<VECTOR> 

instead?

[When i try
\begin{xy}
  0;<2cm,0pc>:<0pc,2cm>::0,
  0*{0},
  (1,1)*+{\oplus}="ref",
  (0,2)*+{\Omega}="omega",
  "omega"!"ref"*{Z}
\end{xy}

It puts the Z at (1,3), which is "omega" shifted by the vector (1,1),
rather than at (1,1) which the manual seems to suggest


>
> The reference point of a merged object is at the coords
> of the reference-point of the 1st <POS> in the merge.
>
> The skew (!) operator is not the appropriate thing for
> merging different <POS>s. It is for shifting the base-point
> within a given <POS>.
>
>
> Now the \otimes and \oplus should coincide for each of
> your SOBJs.  --- call these the  (x+)-points.

yes indeed, thanks very much

>
>>
>> %\sobj gives a `stand alone' \SliceObj
>> \newcommand{\sobj}[3]{\xygraph{[]!{\SliceObj{#1}{#2}{#3}}}}
>>
>
> Secondly:
>
> While this \SliceObj is a valid command for adding to
> an Xy-pic diagram, it does not create just a single <object>.
>
> To make a single <object>, with your current approach,
> you need a slight modification, using \xybox :
>
> \newcommand{\SliceObj}[3]{\drop\xybox{%
>    ....
>    ....
>     }%  end of \xybox
> }%  end of \SliceObj
>

AHA! (this one i can't blame on the manual!)


>
>> \section{More complicated Diagrams}
>> More complicated diagram: We \emph{should} get a `corner' and then $x$
>> and $y$ on top of each other in the bottom-left position\ldots
>
> This doesn't happen because the <POS> before your [d] hop
> is further to the right than you want it to be, since
> \SliceObj  has placed several <object>s, at different places.
>
> Using \xybox, so that there is just one compound <object>
> placed, you now get the 'x' and 'y' coinciding.

yep

>
>
> However, the place where they coincide may not be where
> you want them to be...
>
> ... that is, the arrows between your SOBJs do not
> emanate from the (x+)-points, and the 'xy' does
> not align with the  (x-)-points.
>
>
> Thirdly:
>
>    the \xybox  does not allow control over *where*,
> inside the <object> that it builds,
> the reference point is to be located.
>
> Accordingly, I've just devised a variant that builds
> the same kind of compound <object>, but also sets
> its reference-point to be at the <coord> of the
> last <POS> within the box; i.e., the <coord> for
> the <object> that has been built is at the current
> <POS> when the Xy-pic parsing has been completed.
> The LRUD extents are the size of the complete box;
> i.e., *not* the extents of the final <POS>.
>
> Here is coding that should go in your document's
> preamble -- eventually it should be added to  xy.tex
>

<snip definition of \xyobjbox>

Thanks very much, i have been experimenting with \xyobjbox  and it is
very useful for several things

> Now, if your definition starts:
>
>    \newcommand{\SliceObj}[3]{\drop\xyobjbox{%
>                              ^^^^^^^^^^^^^^
>
> then you should get the correct (?) alignments.
>

yep, thanks very much




More information about the xy-pic mailing list