Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I was wondering which is the correct way to scale a tikzpicture.

I tried with

\begin{tikzpicture}[scale=0.50]

but what I obtain is that distances between elements are scaled but not their sizes or text size too. It's like if the picture collapses on itself, without correctly scaling (as I would imagine, like having a zoom factor)

Am I missing something? Should I use a different command or what?

share|improve this question
add comment

3 Answers

up vote 59 down vote accepted

You could try using the command \resizebox. You enclose the tikzpicture environment in one of those and then in is scaled. Like this:

\resizebox{<horizontal size>}{<vertical size>}{%
    \begin{tikzpicture}

    \end{tikzpicture}
}

If you want the image to be scaled proportionally, you can give one of the sizes and put ! in the other. There is also a \scalebox{<factor>}{...} macro which allows scaling by a factor. This works well except when the tikzpicture has a matrix command, and the columns are separated by &, in that case, you can change the column separator using the option ampersand replacement in the matrix options as stated in the pgfmanual.

Alternatively use the adjustbox package which provides an adjustbox environment which also allows resizing and scaling while allowing for special content including catcode changes required for verbatim text and the aforementioned &.

share|improve this answer
    
This made the trick, I didn't have any matrix inside the tikz so no problem :) –  Jack Oct 20 '10 at 17:24
add comment

Pgf has two different types of transformations: coordinate transformations and canvas transformations. When using \begin{tikzpicture}[scale=0.50], you are applying coordinate transformation. All coordinates will be scaled, whereas individual objects (text, line thickness, rounding of corners etc) will not scale. Most of the time that is what you want, you do not want to scale carefully typeset pieces of text, you do not want to make lines ridiculously thick, or too thin to actually print.

If you want to scale everything, you have to use a canvas transformation. For that, pgf has a command \pgftransformscale{}. You can also use the pgflowlevelscope environment:

\begin{tikzpicture}
  \draw (0,0) rectangle (6,6); %create a bounding box to reserve space
  \begin{pgflowlevelscope}{\pgftransformscale{5}}
     \draw (0,0) -- (1,1) node[right]{$x$};
  \end{pgflowlevelscope}
\end{tikzpicture}

You can also use \pgflowlevelsynccm which synchronizes the canvas transformation matrix with the current coordinate transformation matrix, for example like this:

\begin{tikzpicture}[scale=5]
  \draw (0,0) rectangle (1.2,1.2); %create a bounding box to reserve space
  \pgflowlevelsynccm
  \draw (0,0) -- (1,1) node[right]{$x$};
\end{tikzpicture}

Note that because pgf does not (cannot) keep track of the canvas transformations (they are performed by the backend), you will have to make sure there is enough space in your picture for the scaled objects. In the examples above, I try to reserve space by drawing a bounding box first, before applying the canvas transformation. There are other problems with canvas transformations, and I do not recommend using them without carefully reading appropriate parts of the pgf manual.

I include this answer more as an explanation of what is going on, another, preferable answer using \resizebox has already appeared.

share|improve this answer
1  
+1 but maybe your first rectangle should be sized (6,6) to show that both examples lead to the same result –  Christian Oct 20 '10 at 17:59
add comment

You can use the option "transform shape" for the whole picture, a scope or a single node. Example:

\begin{tikzpicture}[scale=2, transform shape]
  \draw rectangle (1,1) node {foo};
\end{tikzpicture}

\begin{tikzpicture}[scale=2]
  \draw rectangle (1,1) node {bar};
\end{tikzpicture}

But be careful, this will not solve all your cases with scaling tikz pictures, e.g."rounded corners" will not scale. The tikz authors (general) advice is not to scale graphics.

share|improve this answer
2  
This is superb! –  FEQ Feb 14 '12 at 15:18
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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