15

Summary of answers

The question has been answered by TorbjørnT. with a comment. If using scope with xshift it is necessary to specify the unit as cm. This is also working if the entire picture is later scaled. Thanks! The included code is now working as it should. -

The solution provided by JLDiaz works just as well and does not requiere any units! Here to image is moved using shift={(x,z)} (make sure to get all the brackets).

A third possible solution has been proposed by Ignasi, again as a comment to the question. To me this approach using pic might be especially useful if elements need to be repeated a few times in the same image.

Thanks for all the good input!

The question

I am trying to make an illustration for a latex document and it is going quite good. I know the code could be a lot better but for now it is good enough for me. Well, mostly.

Because the code is kind of purely written (or so I think) moving a group of objects is not all that easy. The solution I found (here) for this is scope which does work. However I am a bit unhappy with how it works.

In the code below the object is rotated by 15 degree around the point (0,0) as expected. However, the xshift=2 does not shift the entire scope by 2 on the same scale shifting everything manually by 2 would have.

I know that the axis environment has it's own coordinate system that can be accessed via (axis cs:10,10). Is there anything similar for scope?

Might this be a solution that could be adapted (I could split the image - chair, table and computer - in separate parts I guess)?

\documentclass[tikz]{standalone}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}%[scale=0.750]
\tikzstyle{every node}=[font=\small]
    % Temp stuff for construction only
        \draw[step=.2, lightgray, very thin] (0,0) grid ++(15.0,8.0);
        \foreach \s in {0,1,...,15.0}{
            \draw [lightgray](\s,0) -- (\s,-.1) node[below, lightgray]{\s};
        }
        \foreach \s in {0,1,...,8.0}{
            \draw [lightgray](0,\s) -- (-.1,\s) node[left, lightgray]{\s};
        }
% The Inside of the house
    \begin{scope}[xshift=2cm, rotate=15] % unit was not in original code for question!
        % Table
        \draw (11.9,0) rectangle ++(0.1,1.); % leg 1
        \draw (12.8,0) rectangle ++(0.1,1.);    % leg 2
        \draw (11.8,1.) rectangle ++(1.2,0.05); % Surface plate
        % Computer (iMac) ;-)
        \fill (12.72,1.45) circle (0.03); % The nob in the back
        \draw (12.74,1.45) .. controls (12.8,1.25) and (12.8,1.22) .. (12.8,1.06) -- (12.55,1.06); % Stand
        \draw [fill=white, rotate around={-10:(12.6,1.15)}] (12.6,1.2) rectangle ++(0.07,0.6); % the iMac
        % Chair
        \draw (11.1,0) -- ++(0.2,0.2) -- ++ (0.2,-0.2); % leg part 1
        \draw (11.3,0.2) -- ++(0,0.45); % leg part 2
        \draw (11.05,0.65) rectangle ++(0.5,0.05); % seat
        \draw (11,0.75) rectangle ++(0.05,0.5); % back support
        \draw (11.15,0.65) .. controls (10.95,0.57) and (10.95,0.75) .. (11,0.95); % connection seat - back
    \end{scope}
\end{tikzpicture}
\end{document}

P.S.: Could anyone point me at a comprehensive guide to understand the different coordinate systems in tikz? I have not been able to find anything like that.


And this is the final image I meant to create. I know its not much and likely the code (the above is only part of it) could be written more efficiently but never the less I am very happy with the result.

The final image

5
  • 1
    Try xshift=2cm. May 26 '14 at 18:41
  • @TorbjørnT. Thanks! But why do I need to say cm with xshift when I don't need to do that for anything else (in my example)? Do you know of a source where I could find which unit is used where within tikz?
    – MatoBehr
    May 26 '14 at 18:46
  • I don't really know, but I guess that when you write normal coordinates numbers are scaled by the default unit vectors if you don't specify a unit, but that this does not apply for xshift, so you have to specify a unit. May 26 '14 at 18:50
  • 1
    Instead of scopes you could also consider using pics. Here you have some examples: tex.stackexchange.com/a/151772/1952, tex.stackexchange.com/a/170686/1952
    – Ignasi
    May 27 '14 at 6:45
  • @Ignasi Thanks for the input. It looks very promising to me. I will definitely look into it for my next project. From you first example it looks like it would be especially good if you need to reuse the same elements a couple of times in one picture.
    – MatoBehr
    May 27 '14 at 10:39
12

Interestingly, the option shift accepts as parameter a pair of coordinates, which do not require units (beware of the braces around the parenthesis):

\begin{tikzpicture}
\node[draw] {Foo};
\draw (1,1) circle (0.2);
\begin{scope}[shift={(1,1)}]
 \node[draw] {Bar};
\end{scope}
\end{tikzpicture}

Result

You can use scale, x, and/or y options in the tikzpicture, as usual.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.